huangxiaoqiang
2025-11-28 dfb67ae65d678da26d0fa880efa185591d6ff970
ÏîÄ¿´úÂë/WMS/WIDESEA_WMSServer/WIDESEA_StorageTaskServices/Task/Dt_TaskService.cs
@@ -105,6 +105,13 @@
        WebResponseContent content = new WebResponseContent();
        try
        {
            if (task.TaskState.GetTaskStateGroup() == TaskStateGroup.CarryGroup)
            {
                var result1 = UpdateLocationStatus(task.SourceAddress, LocationEnum.Free, task.TaskNum.Value, StatusChangeTypeEnum.AutomaticOutbound);
                await _locationStatusChangeRecordRepository.AddDataAsync(result1.Item1);
                await _locationRepository.UpdateDataAsync(result1.Item2);
            }
            task.TaskState = (int)TaskOutStatusEnum.OutFinish;
            var taskHty = task.Adapt<Dt_Task_Hty>();
            taskHty.FinishTime = DateTime.Now;
@@ -113,14 +120,15 @@
            stock.ModifyDate = DateTime.Now;
            stock.LocationCode = task.TargetAddress;
            var result2 = UpdateLocationStatus(task.TargetAddress, LocationEnum.InStock, task.TaskNum.Value, StatusChangeTypeEnum.AutomaticOutbound);
            DtStockInfo_Hty stockInfo_Hty = stock.Adapt<DtStockInfo_Hty>();
            var orderDetails = _orderOutDetailsRepository.QueryData(x => x.PalletCode == task.PalletCode);
            List<Dt_OrderOutDetails_Hty> orderdetailshtys = new List<Dt_OrderOutDetails_Hty>();
            orderDetails.ForEach(item =>
            {
                orderdetailshtys.Add(item.Adapt<Dt_OrderOutDetails_Hty>());
            });
        {
            orderdetailshtys.Add(item.Adapt<Dt_OrderOutDetails_Hty>());
        });
            await ERPAllocateOut(stock);
@@ -172,8 +180,9 @@
                boxingInfo.BoxingInfoDetails = mergedDetails;
            }
            await _unitOfWorkManage.UseTranAsync(async () =>
            {
            //await _unitOfWorkManage.UseTranAsync(async () =>
            //{
            _unitOfWorkManage.BeginTran();
                await DeleteStockInfoAsync(stock.Id);
                _boxingInfoRepository.UpdateDataNav(boxingInfo);
                await DeleteStockInfoDetailsAsync(stock.StockInfoDetails);
@@ -185,12 +194,14 @@
                await DeleteTaskAsync(task.TaskId);
                await AddTaskHtyAsync(taskHty);
            });
            _unitOfWorkManage.CommitTran();
            //});
            content.OK("出库完成");
        }
        catch (Exception ex)
        {
            _unitOfWorkManage.RollbackTran();
            task.ErrorMessage = ex.Message;
            await BaseDal.UpdateDataAsync(task);
            return content.Error(ex.Message);
@@ -268,7 +279,15 @@
            {
                return content.Error("未找到组盘数据");
            }
            await ERPAllocate(boxinfo);
            if (task.TaskState.GetTaskStateGroup() == TaskStateGroup.CarryGroup)
            {
                var result1 = UpdateLocationStatus(task.SourceAddress, LocationEnum.Free, task.TaskNum.Value, StatusChangeTypeEnum.AutomaticInbound);
                await _locationStatusChangeRecordRepository.AddDataAsync(result1.Item1);
                await _locationRepository.UpdateDataAsync(result1.Item2);
            }
            var stock = CreateStock(boxinfo, task);
@@ -280,18 +299,22 @@
            var result2 = UpdateLocationStatus(task.TargetAddress, LocationEnum.InStock, task.TaskNum.Value, StatusChangeTypeEnum.AutomaticInbound);
            await _unitOfWorkManage.UseTranAsync(async () =>
            {
                await _stockInfoRepository.AddDataNavAsync(stock);
            //await _unitOfWorkManage.UseTranAsync(async () =>
            //{
            _unitOfWorkManage.BeginTran();
            await _stockInfoRepository.AddDataNavAsync(stock);
                await DeleteTaskAsync(task.TaskId);
                await AddTaskHtyAsync(taskHty);
                await _locationStatusChangeRecordRepository.AddDataAsync(result2.Item1);
                await _locationRepository.UpdateDataAsync(result2.Item2);
            });
            _unitOfWorkManage.CommitTran();
            //});
            await ERPAllocate(boxinfo);
            content.OK("入库完成");
        }
        catch (Exception ex)
        {
            _unitOfWorkManage.RollbackTran();
            task.ErrorMessage = ex.Message;
            await BaseDal.UpdateDataAsync(task);
            return content.Error(ex.Message);
@@ -501,7 +524,7 @@
            foreach (var item in boxingInfo.BoxingInfoDetails)
            {
                var ERPStock = SqlSugarHelper.DBERPtext.Queryable<用友即时库存_ST>().Where(x => x.存储地点名称 == item.Warehouse && x.料号 == item.MaterielCode && x.品名 == item.MaterielName && x.库存数量 >= item.Quantity).ToList().FirstOrDefault();
                var ERPStock = SqlSugarHelper.DBERP.Queryable<用友即时库存_ST>().Where(x => x.存储地点名称 == item.Warehouse && x.料号 == item.MaterielCode && x.品名 == item.MaterielName && x.库存数量 >= item.Quantity).ToList().FirstOrDefault();
                if (ERPStock == null)
                {
                    return content.Error($"组盘数据未在ERP库存数据中,请人工确认数据是否正确");
@@ -964,6 +987,74 @@
    }
    #endregion è¯·æ±‚出库(实盘&空盘)
    #region è¯·æ±‚移库任务
    public async Task<WebResponseContent> RequestRelocationTaskAsync(string SourceAddress,string TargetAddress)
    {
        WebResponseContent content = new WebResponseContent();
        try
        {
            var startLocation = await _locationRepository.QueryFirstAsync(x => x.LocationCode == SourceAddress);
            var endLocation = await _locationRepository.QueryFirstAsync(x => x.LocationCode == TargetAddress);
            if (!startLocation.IsNotEmptyOrNull() || !endLocation.IsNotEmptyOrNull())
            {
                return content.Error("库位信息不存在");
            }
            if (endLocation.LocationStatus != (int)LocationEnum.Free)
            {
                return content.Error($"终点库位{endLocation.LocationCode}未处于空闲状态,请人工确认库位状态");
            }
            if ((startLocation.AreaId == 1 || endLocation.AreaId == 1) && startLocation.AreaId != endLocation.AreaId)
            {
                return content.Error("移库起点库位与终点库位不在同一区域");
            }
            if (startLocation.Floor != endLocation.Floor)
            {
                return content.Error("移库起点库位与终点库位不在同一楼层");
            }
            var stock = await _stockInfoRepository.QueryFirstAsync(x => x.LocationCode == startLocation.LocationCode);
            var taskNew = new Dt_Task
            {
                Grade = startLocation.Floor == "1F" ? 10 : 1,
                Roadway = endLocation.RoadwayNo,
                TargetAddress = endLocation.LocationCode,
                Dispatchertime = DateTime.Now,
                MaterialNo = "",
                NextAddress = endLocation.LocationCode,
                OrderNo = null,
                PalletCode = stock == null ? "M" + DateTime.Now.ToString("MMddHHmmss") + "-" + new Random().Next(100, 1000) : stock.PalletCode,
                SourceAddress = startLocation.LocationCode,
                CurrentAddress = startLocation.LocationCode,
                TaskState = startLocation.AreaId == 1 ? (int)TaskRelocationStatusEnum.RelocationNew : (int)TaskRelocationStatusEnum.RelocationNewAGV,
                TaskType = (int)TaskRelocationTypeEnum.Relocation,
                TaskNum = BaseDal.GetTaskNo().Result,
                CreateDate = DateTime.Now,
                TaskId = 0,
                AGVTaskNum = GenerateUniqueId(),
                Floor = startLocation.Floor,
            };
            var result = AddTaskAsync(new List<Dt_Task>() { taskNew });
            await _unitOfWorkManage.UseTranAsync(async () =>
            {
                await _locationStatusChangeRecordRepository.AddDataAsync(result.Item2);
                await _locationRepository.UpdateDataAsync(result.Item1);
                await BaseDal.AddDataAsync(taskNew);
            });
            await SendWCSTask(CreateListTaskDTO(taskNew));
            return content.OK("成功");
        }
        catch (Exception ex)
        {
            return content.Error(ex.Message);
        }
    }
    #endregion
    #region è¯·æ±‚跨楼层2任务
    /// <summary>
    /// è¯·æ±‚跨楼层2任务
@@ -1258,7 +1349,7 @@
                            PalletCode = stock == null ? "M" + DateTime.Now.ToString("MMddHHmmss") + "-" + new Random().Next(100, 1000) : stock.PalletCode,
                            SourceAddress = item.LocationCode,
                            CurrentAddress = item.LocationCode,
                            TaskState = (int)TaskAGVCarryStatusEnum.CarryNew,
                            TaskState = (int)TaskRelocationStatusEnum.RelocationNewAGV,
                            TaskType = (int)TaskRelocationTypeEnum.Relocation,
                            TaskNum = BaseDal.GetTaskNo().Result,
                            CreateDate = DateTime.Now,
@@ -1404,37 +1495,6 @@
        }
        return content;
    }
    #endregion
    #region èŽ·å–ä»»åŠ¡æ•°æ®
    public async Task<WebResponseContent> GetTaskData()
    {
        WebResponseContent content = new WebResponseContent();
        try
        {
            var task = await BaseDal.QueryDataAsync(x => true);
            var taskData = new List<TaskData>
            {
                new TaskData { Status = "已取消", Count = task.Count+50 },
                new TaskData { Status = "已完成", Count = 735 }
            };
            // æž„建符合要求的格式
            var result = taskData.Select(item => new
            {
                value = item.Count,
                name = item.Status,
                itemStyle = new { color = item.Status == "已取消" ? "#FF0000" : "#00FF00" }
            }).ToList();
            return content.OK(data: result);
        }
        catch (Exception ex)
        {
            return content.Error(ex.Message);
        }
    }
    #endregion
    #endregion å¤–部接口方法