wangxinhui
2025-12-29 d0cc37c3c11859cc55f30624692dca55be2b8a32
ÏîÄ¿´úÂë/WMS/WMSServices/WIDESEA_TaskInfoService/TaskService_Outbound.cs
@@ -299,7 +299,59 @@
            return tasks;
        }
        /// <summary>
        /// åº“存数据转出库任务(MES工单)
        /// åº“存数据转出库任务(MES工单成品)
        /// </summary>
        /// <param name="stockInfos"></param>
        /// <returns></returns>
        public List<Dt_Task> GetTasks(List<Dt_ProStockInfo> stockInfos, List<Dt_OutStockLockInfo> outStockLockInfos, TaskTypeEnum taskType = new TaskTypeEnum())
        {
            List<Dt_Task> tasks = new List<Dt_Task>();
            for (int i = 0; i < stockInfos.Count; i++)
            {
                Dt_ProStockInfo stockInfo = stockInfos[i];
                if (stockInfo != null)
                {
                    Dt_LocationInfo locationInfo = _basicService.LocationInfoService.Repository.QueryFirst(x => x.LocationCode == stockInfo.LocationCode);
                    if (!tasks.Exists(x => x.PalletCode == stockInfo.PalletCode))
                    {
                        Dt_OutStockLockInfo outStockLockInfo = outStockLockInfos.FirstOrDefault(x => x.PalletCode == stockInfo.PalletCode);
                        taskType = outStockLockInfo.MachineName.ObjToInt() switch
                        {
                            (int)StationAreaEnum.二楼纸袋 or
                            (int)StationAreaEnum.二楼无纺布袋 or
                            (int)StationAreaEnum.二楼纸杯 => TaskTypeEnum.OutCarton,
                            (int)StationAreaEnum.一楼无纺织布 => TaskTypeEnum.OutWFB,
                            _ => throw new Exception($"未找到加工中心任务类型分配")
                        };
                        Dt_Task task = new()
                        {
                            CurrentAddress = stockInfo.LocationCode,
                            Grade = 0,
                            PalletCode = stockInfo.PalletCode,
                            NextAddress = "",
                            Roadway = locationInfo.RoadwayNo,
                            SourceAddress = stockInfo.LocationCode,
                            TargetAddress = "",
                            TaskStatus = TaskStatusEnum.CallPending.ObjToInt(),
                            TaskType = taskType.ObjToInt(),
                            TaskNum = BaseDal.GetTaskNum(nameof(SequenceEnum.SeqTaskNum)),
                            PalletType = stockInfo.PalletType,
                            WarehouseId = stockInfo.WarehouseId,
                            MaterielCode = stockInfo.proStockInfoDetails?.FirstOrDefault().ProductCode ??"",
                            Quantity = stockInfo.proStockInfoDetails?.Sum(x=>x.StockQty) ?? 0,
                            OrderNo = outStockLockInfo.OrderNo,
                            DispatchPlanId = outStockLockInfo.OrderDetailId,
                            WorkCentreCode = outStockLockInfo.MakeCode
                        };
                        tasks.Add(task);
                    }
                }
            }
            return tasks;
        }
        /// <summary>
        /// åº“存数据转出库任务(MES工单原料)
        /// </summary>
        /// <param name="stockInfos"></param>
        /// <returns></returns>
@@ -320,6 +372,7 @@
                        {
                            (int)StationAreaEnum.二楼纸袋 => TaskTypeEnum.PaperYLOutZDGL,
                            (int)StationAreaEnum.一楼印刷 => TaskTypeEnum.PrintYLOutbound,
                            (int)StationAreaEnum.一楼分切 => TaskTypeEnum.OutFenQie,
                            _ => throw new Exception($"未找到加工中心任务类型分配")
                        };
                        Dt_Task task = new()
@@ -383,7 +436,7 @@
                            PalletType = stockInfo.PalletType,
                            WarehouseId = stockInfo.WarehouseId,
                            MaterielCode= stockInfo.proStockInfoDetails?.FirstOrDefault().ProductCode ?? "" ,
                            Quantity = 0,
                            Quantity = stockInfo.proStockInfoDetails?.Sum(x=>x.StockQty) ?? 0,
                        };
                        tasks.Add(task);
                    }
@@ -455,6 +508,7 @@
                    nameof(StationAreaEnum.一楼分切) => TaskTypeEnum.OutFenQie,
                    nameof(StationAreaEnum.一楼模切) => TaskTypeEnum.OutMoQie,
                    nameof(StationAreaEnum.一楼冲切) => TaskTypeEnum.OutChongQie,
                    nameof(StationAreaEnum.一楼成品) => TaskTypeEnum.OutProduct,
                    nameof(StationAreaEnum.二楼纸袋) or 
                    nameof(StationAreaEnum.二楼无纺布袋) or 
                    nameof(StationAreaEnum.二楼纸杯) => TaskTypeEnum.OutCarton,
@@ -897,54 +951,98 @@
                //操作数据,并分配需求库存
                _outboundRepository.OutMESOrderRepository.AddData(AddoutMESOrders);
                List<Dt_OutMESOrder> mESOrders = _outboundRepository.OutMESOrderRepository.QueryData(x => AddoutMESOrders.Select(x => x.OutDetailId).Contains(x.OutDetailId));
                List<Dt_Task> tasks = new List<Dt_Task>();
                List<Dt_StockInfo>? stockInfos = null;
                List<Dt_OutMESOrder>? Orders = null;
                List<Dt_OutStockLockInfo>? outStockLockInfos = null;
                List<Dt_LocationInfo>? locationInfos = null;
                {
                    //分配库存
                    (List<Dt_StockInfo>, List<Dt_OutMESOrder>, List<Dt_OutStockLockInfo>, List<Dt_LocationInfo>) result = _outboundService.OutMESOrderService.AssignStockOutbound(mESOrders);
                    if (result.Item1 != null && result.Item1.Count > 0)
                    List<Dt_Task> tasks = new List<Dt_Task>();
                    List<Dt_ProStockInfo>? stockInfos = null;
                    List<Dt_OutMESOrder>? Orders = null;
                    List<Dt_OutStockLockInfo>? outStockLockInfos = null;
                    List<Dt_LocationInfo>? locationInfos = null;
                    {
                        //创建任务
                        tasks = GetTasks(result.Item1, result.Item3);
                        result.Item2.ForEach(x =>
                        if (mESOrders.Where(x => x.WarehouseId == WarehouseEnum.LLDFL.ObjToInt()).ToList().Count>0)
                        {
                            OutOrderStatusEnum.出库中.ObjToInt();
                        });
                        result.Item3.ForEach(x =>
                        {
                            x.Status = OutLockStockStatusEnum.出库中.ObjToInt();
                        });
                            //分配库存
                            (List<Dt_ProStockInfo>, List<Dt_OutMESOrder>, List<Dt_OutStockLockInfo>, List<Dt_LocationInfo>) result = _outboundService.OutMESOrderService.AssignProStockOutbound(mESOrders.Where(x => x.WarehouseId == WarehouseEnum.LLDFL.ObjToInt()).ToList());
                            if (result.Item1 != null && result.Item1.Count > 0)
                            {
                                //创建任务
                                tasks = GetTasks(result.Item1, result.Item3);
                                result.Item2.ForEach(x =>
                                {
                                    OutOrderStatusEnum.出库中.ObjToInt();
                                });
                                result.Item3.ForEach(x =>
                                {
                                    x.Status = OutLockStockStatusEnum.出库中.ObjToInt();
                                });
                        stockInfos = result.Item1;
                        Orders = result.Item2;
                        outStockLockInfos = result.Item3;
                        locationInfos = result.Item4;
                                stockInfos = result.Item1;
                                Orders = result.Item2;
                                outStockLockInfos = result.Item3;
                                locationInfos = result.Item4;
                            }
                        }
                    }
                    else
                    if (stockInfos != null && stockInfos.Count > 0 && outStockLockInfos != null && outStockLockInfos.Count > 0 && locationInfos != null && locationInfos.Count > 0 && tasks.Count>0)
                    {
                        throw new Exception("无库存");
                        BaseDal.AddData(tasks);
                        stockInfos.ForEach(x =>
                        {
                            x.StockStatus = StockStatusEmun.出库锁定.ObjToInt();
                        });
                        WebResponseContent contentResponse = _outboundService.OutMESOrderService.LockOutboundStockDataUpdate(stockInfos, Orders, outStockLockInfos, locationInfos, tasks: tasks);
                        if (!contentResponse.Status)
                        {
                            _unitOfWorkManage.RollbackTran();
                            return content.Error(contentResponse.Message);
                        }
                    }
                }
                int id = BaseDal.AddData(tasks);
                if (stockInfos != null && stockInfos.Count > 0 && outStockLockInfos != null && outStockLockInfos.Count > 0 && locationInfos != null && locationInfos.Count > 0)
                {
                    stockInfos.ForEach(x =>
                    List<Dt_Task> tasks = new List<Dt_Task>();
                    List<Dt_StockInfo>? stockInfos = null;
                    List<Dt_OutMESOrder>? Orders = null;
                    List<Dt_OutStockLockInfo>? outStockLockInfos = null;
                    List<Dt_LocationInfo>? locationInfos = null;
                    {
                        x.StockStatus=StockStatusEmun.出库锁定.ObjToInt();
                    });
                    WebResponseContent contentResponse = _outboundService.OutMESOrderService.LockOutboundStockDataUpdate(stockInfos, Orders, outStockLockInfos, locationInfos, tasks: tasks);
                    if (!contentResponse.Status)
                        if (mESOrders.Where(x => x.WarehouseId == WarehouseEnum.LLDYL.ObjToInt()).ToList().Count > 0)
                        {
                            //分配库存
                            (List<Dt_StockInfo>, List<Dt_OutMESOrder>, List<Dt_OutStockLockInfo>, List<Dt_LocationInfo>) result = _outboundService.OutMESOrderService.AssignStockOutbound(mESOrders.Where(x => x.WarehouseId == WarehouseEnum.LLDYL.ObjToInt()).ToList());
                            if (result.Item1 != null && result.Item1.Count > 0)
                            {
                                //创建任务
                                tasks = GetTasks(result.Item1, result.Item3);
                                result.Item2.ForEach(x =>
                                {
                                    OutOrderStatusEnum.出库中.ObjToInt();
                                });
                                result.Item3.ForEach(x =>
                                {
                                    x.Status = OutLockStockStatusEnum.出库中.ObjToInt();
                                });
                                stockInfos = result.Item1;
                                Orders = result.Item2;
                                outStockLockInfos = result.Item3;
                                locationInfos = result.Item4;
                            }
                        }
                    }
                    if (stockInfos != null && stockInfos.Count > 0 && outStockLockInfos != null && outStockLockInfos.Count > 0 && locationInfos != null && locationInfos.Count > 0 && tasks.Count>0)
                    {
                        _unitOfWorkManage.RollbackTran();
                        return content.Error(contentResponse.Message);
                        BaseDal.AddData(tasks);
                        stockInfos.ForEach(x =>
                        {
                            x.StockStatus = StockStatusEmun.出库锁定.ObjToInt();
                        });
                        WebResponseContent contentResponse = _outboundService.OutMESOrderService.LockOutboundStockDataUpdate(stockInfos, Orders, outStockLockInfos, locationInfos, tasks: tasks);
                        if (!contentResponse.Status)
                        {
                            _unitOfWorkManage.RollbackTran();
                            return content.Error(contentResponse.Message);
                        }
                    }
                }
                _unitOfWorkManage.CommitTran();
                
                return content.OK("接收成功");
@@ -955,5 +1053,56 @@
            }
            return content;
        }
        /// <summary>
        /// ç©ºæ‰˜å ç›˜å‡ºåº“
        /// </summary>
        /// <returns></returns>
        public WebResponseContent PlateOutbound(string stationCode)
        {
            WebResponseContent content = new WebResponseContent();
            try
            {
                //获取所有月台出库任务
                Dt_Task TasksOut = BaseDal.QueryFirst(x => x.TaskType == TaskTypeEnum.OutEmptyPlate.ObjToInt());
                if (TasksOut != null)
                    throw new Exception($"任务已存在");
                //获取货位
                List<Dt_LocationInfo> locationInfos = _basicRepository.LocationInfoRepository.QueryData(x => x.WarehouseId == WarehouseEnum.LLDCP.ObjToInt() && x.EnableStatus == EnableStatusEnum.Normal.ObjToInt() && x.LocationStatus == LocationStatusEnum.InStock.ObjToInt());
                Dt_ProStockInfo? stockInfo = BaseDal.Db.Queryable<Dt_ProStockInfo>().Where(x => locationInfos.Select(x => x.LocationCode).Contains(x.LocationCode) && x.StockStatus == StockStatusEmun.入库完成.ObjToInt() && x.ProStockAttribute == ProStockAttributeEnum.空托.ObjToInt()).OrderBy(x => x.CreateDate).ToList().FirstOrDefault() ?? throw new Exception($"库存空托数量不足");
                Dt_LocationInfo locationInfo = locationInfos.FirstOrDefault(x => x.LocationCode == stockInfo.LocationCode);
                stockInfo.StockStatus = StockStatusEmun.出库锁定.ObjToInt();
                TaskTypeEnum typeEnum = TaskTypeEnum.OutEmptyPlate;
                List<Dt_Task> tasks = GetTasks(new List<Dt_ProStockInfo>() { stockInfo }, typeEnum, new List<Dt_LocationInfo>() { locationInfo });
                if (tasks == null || tasks.Count <= 0)
                {
                    return content.Error($"生成任务失败");
                }
                tasks.ForEach(x =>
                {
                    x.TargetAddress = stationCode;
                });
                //判断是否有出库单信息
                _unitOfWorkManage.BeginTran();
                //更新库存状态
                _stockRepository.ProStockInfoRepository.UpdateData(stockInfo);
                //更新货位状态
                _basicRepository.LocationInfoRepository.UpdateLocationStatus(new List<Dt_LocationInfo>() { locationInfo }, LocationStatusEnum.Lock);
                //加入货位变动记录
                _recordService.LocationStatusChangeRecordSetvice.AddLocationStatusChangeRecord(new List<Dt_LocationInfo>() { locationInfo }, LocationStatusEnum.Lock, LocationChangeType.OutboundAssignLocation, taskNums: tasks.Select(x => x.TaskNum).ToList());
                //新建任务
                BaseDal.AddData(tasks);
                _unitOfWorkManage.CommitTran();
                PushTasksToWCS(tasks);
                content.OK();
            }
            catch (Exception ex)
            {
                content.Error(ex.Message);
            }
            return content;
        }
    }
}