helongyang
5 天以前 63d187526792e6e29bfec07d0e3f0dce07df31b3
´úÂë¹ÜÀí/WMS/WIDESEA_WMSServer/WIDESEA_TaskInfoService/TaskService.cs
@@ -41,6 +41,7 @@
using WIDESEA_External.Model;
using WIDESEA_IBasicRepository;
using WIDESEA_IBasicService;
using WIDESEA_ICheckRepository;
using WIDESEA_IInboundRepository;
using WIDESEA_IInboundService;
using WIDESEA_IOutboundRepository;
@@ -75,6 +76,7 @@
        private readonly IOutboundRepository _outboundRepository;
        private readonly IProInStatisticsRepository _proInStatisticsRepository;
        private readonly IProInStatisticsService _proInStatisticsService;
        private readonly ICheckOrderRepository _checkOrderRepository;
        public ITaskRepository Repository => BaseDal;
        private Dictionary<string, OrderByType> _taskOrderBy = new()
@@ -87,7 +89,7 @@
        public List<int> TaskOutboundTypes => typeof(TaskTypeEnum).GetEnumIndexList();
        public TaskService(ITaskRepository BaseDal, IMapper mapper, IUnitOfWorkManage unitOfWorkManage, IStockRepository stockRepository, IBasicService basicService, IRecordService recordService, IOutboundService outboundService, IStockService stockService, IBasicRepository basicRepository, IApiInfoRepository apiInfoRepository, IInvokeERPService invokeERPService, IInboundRepository inboundRepository, IInboundOrderService inboundOrderService, IPalletTypeInfoRepository palletTypeInfoRepository, IOutProStockInfoRepository outProStockInfoRepository, IOutboundRepository outboundRepository, IProInStatisticsRepository proInStatisticsRepository, IProInStatisticsService proInStatisticsService) : base(BaseDal)
        public TaskService(ITaskRepository BaseDal, IMapper mapper, IUnitOfWorkManage unitOfWorkManage, IStockRepository stockRepository, IBasicService basicService, IRecordService recordService, IOutboundService outboundService, IStockService stockService, IBasicRepository basicRepository, IApiInfoRepository apiInfoRepository, IInvokeERPService invokeERPService, IInboundRepository inboundRepository, IInboundOrderService inboundOrderService, IPalletTypeInfoRepository palletTypeInfoRepository, IOutProStockInfoRepository outProStockInfoRepository, IOutboundRepository outboundRepository, IProInStatisticsRepository proInStatisticsRepository, IProInStatisticsService proInStatisticsService, ICheckOrderRepository checkOrderRepository) : base(BaseDal)
        {
            _mapper = mapper;
            _unitOfWorkManage = unitOfWorkManage;
@@ -106,13 +108,14 @@
            _outboundRepository = outboundRepository;
            _proInStatisticsRepository = proInStatisticsRepository;
            _proInStatisticsService = proInStatisticsService;
            _checkOrderRepository = checkOrderRepository;
        }
        /// <summary>
        /// ä»»åŠ¡ä¿¡æ¯æŽ¨é€è‡³WCS
        /// </summary>
        /// <returns></returns>
        public WebResponseContent PushTasksToWCS(List<Dt_Task> tasks, string agvDescription = "")
        public WebResponseContent PushTasksToWCS(List<Dt_Task> tasks, string agvDescription = "",string agvtaskNum="")
        {
            try
            {
@@ -120,6 +123,7 @@
                taskDTOs.ForEach(x =>
                {
                    x.AGVArea = agvDescription;
                    x.AGVTaskNum = agvtaskNum;
                });
                string url = AppSettings.Get("WCS");
                if (string.IsNullOrEmpty(url))
@@ -510,6 +514,15 @@
                {
                    x.ProOutDetailStatus = StockStatusEmun.入库完成.ObjToInt();
                });
                #region todo:临时更新所有研发转成品
                if (proStockInfo.ProStockAttribute == ProStockAttributeEnum.研发.ObjToInt())
                {
                    proStockInfo.ProStockAttribute = ProStockAttributeEnum.成品.ObjToInt();
                    proStockInfo.WarehouseId = locationInfo.WarehouseId;
                }
                #endregion
                //更新入库状态
                task.TaskStatus = TaskStatusEnum.Finish.ObjToInt();
                _unitOfWorkManage.BeginTran();
@@ -618,11 +631,17 @@
                {
                    return WebResponseContent.Instance.Error($"未找到货位信息");
                }
                if ((task.TaskType == TaskTypeEnum.OutInventory.ObjToInt()))
                {
                    return OutInventoryCompleted(task,stockInfo, locationInfo);
                }
                List<Dt_OutStockLockInfo> outStockLockInfos = _outboundService.OutboundStockLockInfoService.Repository.QueryData(x => x.TaskNum == taskNum);
                List<Dt_OutboundOrderDetail> outboundOrderDetails = new List<Dt_OutboundOrderDetail>();
                List<Dt_MesOutboundOrder> mesOutboundOrders = new List<Dt_MesOutboundOrder>();
                List<Dt_MesPPOutboundOrder> mesPPOutboundOrders = new List<Dt_MesPPOutboundOrder>();
                if ((outStockLockInfos == null || outStockLockInfos.Count == 0) && warehouse.WarehouseCode != WarehouseEnum.HA64.ToString() && (task.TaskType != TaskTypeEnum.OutEmpty.ObjToInt()))
                Dt_CheckOrder? checkOrder = null;
                Dt_OutboundOrder? outboundOrder = null;
                if ((outStockLockInfos == null || outStockLockInfos.Count == 0) && warehouse.WarehouseCode != WarehouseEnum.HA64.ToString() && warehouse.WarehouseCode != WarehouseEnum.HA154.ToString() && (task.TaskType != TaskTypeEnum.OutEmpty.ObjToInt()))
                {
                    return WebResponseContent.Instance.Error($"未找到出库详情信息");
                }
@@ -635,7 +654,7 @@
                            Dt_MesOutboundOrder mesOutboundOrder = _outboundService.MesOutboundOrderService.Repository.QueryFirst(x => x.TaskNo == item.OrderNo);
                            if (mesOutboundOrder != null)
                            {
                                mesOutboundOrder.OverOutQuantity = item.AssignQuantity;
                                mesOutboundOrder.OverOutQuantity += item.AssignQuantity;
                                if (mesOutboundOrder.OverOutQuantity == mesOutboundOrder.OrderQuantity)
                                {
                                    mesOutboundOrder.OrderStatus = OrderDetailStatusEnum.Over.ObjToInt();
@@ -659,6 +678,7 @@
                        }
                        else
                        {
                            //获取出库单明细
                            Dt_OutboundOrderDetail outboundOrderDetail = _outboundService.OutboundOrderDetailService.Repository.QueryFirst(x => x.Id == item.OrderDetailId);
                            if (outboundOrderDetail != null)
                            {
@@ -668,7 +688,33 @@
                                    outboundOrderDetail.OrderDetailStatus = OrderDetailStatusEnum.Over.ObjToInt();
                                }
                                outboundOrderDetails.Add(outboundOrderDetail);
                                //获取出库单
                                outboundOrder = _outboundRepository.OutboundOrderRepository.Db.Queryable<Dt_OutboundOrder>().Where(x => x.Id == outboundOrderDetail.OrderId).Includes(x => x.Details).First() ?? throw new Exception("未找到出库单");
                                if (task.TaskType == TaskTypeEnum.OutQuality.ObjToInt())
                                {
                                    Dt_MaterielInfo materielInfo = _basicRepository.MaterielInfoRepository.QueryFirst(x=>x.MaterielCode== outboundOrderDetail.MaterielCode);
                                    checkOrder = new Dt_CheckOrder
                                    {
                                        ReceivedQuantity = item.OriginalQuantity,
                                        OrderType = CheckTypeEnum.InspectCheck.ObjToInt(),
                                        ReceiveOrderNo = outboundOrder.OrderNo,
                                        OrderPalletCode= item.PalletCode,
                                        LotNo = item.BatchNo,
                                        Result = CheckAcceptEnum.NotCheckAccept.ToString(),
                                        QualifiedQuantity = 0,
                                        ReceiveDetailRowNo = item.Id,
                                        WarehouseId = outboundOrder.WarehouseId,
                                        ScrappedQuantity = 0,
                                        MaterielCode=materielInfo.MaterielCode,
                                        MaterielSpec = materielInfo.MaterielSpec,
                                        Unit = materielInfo.MaterielUnit,
                                        ReturnQuantity = 0,
                                        DefectedQuantity = 0
                                    };
                                }
                            }
                        }
                        item.Status = OutLockStockStatusEnum.出库完成.ObjToInt();
                    }
@@ -678,12 +724,22 @@
                FeedBackWCSTaskCompleted(taskNum);
                _unitOfWorkManage.BeginTran();
                if (task.TaskType == TaskTypeEnum.Outbound.ObjToInt() || task.TaskType == TaskTypeEnum.OutAllocate.ObjToInt() || task.TaskType == TaskTypeEnum.MesHandPickOutbound.ObjToInt() || task.TaskType == TaskTypeEnum.MesHandOutbound.ObjToInt())
                if (task.TaskType == TaskTypeEnum.Outbound.ObjToInt() || task.TaskType == TaskTypeEnum.OutQuality.ObjToInt() || task.TaskType == TaskTypeEnum.OutAllocate.ObjToInt() || task.TaskType == TaskTypeEnum.MesHandPickOutbound.ObjToInt() || task.TaskType == TaskTypeEnum.MesHandOutbound.ObjToInt())
                {
                    //处理出库详情
                    //处理出库详情以及库存状态
                    if (outboundOrderDetails.Count > 0)
                    {
                        _outboundService.OutboundOrderDetailService.Repository.UpdateData(outboundOrderDetails);
                        //更新出库单状态
                        if (task.TaskType == TaskTypeEnum.OutQuality.ObjToInt() || task.TaskType == TaskTypeEnum.OutAllocate.ObjToInt())
                        {
                            int detailCount = outboundOrderDetails.Where(x => x.OrderDetailStatus == OrderDetailStatusEnum.Over.ObjToInt()).ToList().Count;
                            if ((outboundOrder.Details.Where(x => x.OrderDetailStatus == OrderDetailStatusEnum.Over.ObjToInt()).ToList().Count + detailCount) == outboundOrder.Details.Count)
                            {
                                outboundOrder.OrderStatus = OutOrderStatusEnum.出库完成.ObjToInt();
                                _outboundRepository.OutboundOrderRepository.UpdateData(outboundOrder);
                            }
                        }
                    }
                    stockInfo.LocationCode = "";
                    stockInfo.StockStatus = StockStatusEmun.出库完成.ObjToInt();
@@ -691,17 +747,35 @@
                    {
                        x.Status = StockStatusEmun.出库完成.ObjToInt();
                    });
                    if (stockInfo.StockLength>0)
                    {
                        stockInfo.StockLength = 0;
                    }
                    if (checkOrder!=null)
                    {
                        stockInfo.StockStatus = StockStatusEmun.送检完成.ObjToInt();
                        stockInfo.Details.ForEach(x =>
                        {
                            x.Status = StockStatusEmun.送检完成.ObjToInt();
                        });
                        _checkOrderRepository.AddData(checkOrder);
                    }
                    _stockRepository.StockInfoRepository.UpdateData(stockInfo);
                    _stockRepository.StockInfoDetailRepository.UpdateData(stockInfo.Details);
                }
                else if (task.TaskType == TaskTypeEnum.OutEmpty.ObjToInt())
                else if (task.TaskType == TaskTypeEnum.OutEmpty.ObjToInt())//辅料空箱出库完成
                {
                    _basicService.LocationInfoService.UpdateLocationStatus(locationInfo, stockInfo.PalletType, LocationStatusEnum.Free, stockInfo.WarehouseId);
                    _stockService.StockInfoService.Repository.DeleteAndMoveIntoHty(stockInfo, App.User.UserId == 0 ? OperateTypeEnum.自动完成 : OperateTypeEnum.人工完成);
                }
                else if (task.TaskType == TaskTypeEnum.MesOutbound.ObjToInt())
                else if (task.TaskType == TaskTypeEnum.MesOutbound.ObjToInt())//板料Mes出库完成逻辑
                {
                    _outboundService.MesOutboundOrderService.Repository.UpdateData(mesOutboundOrders);
                    _stockService.StockInfoService.Repository.DeleteAndMoveIntoHty(stockInfo, App.User.UserId == 0 ? OperateTypeEnum.自动完成 : OperateTypeEnum.人工完成);
                    _stockService.StockInfoDetailService.Repository.DeleteAndMoveIntoHty(stockInfo.Details, App.User.UserId == 0 ? OperateTypeEnum.自动完成 : OperateTypeEnum.人工完成);
                }
                else if (warehouse.WarehouseCode == WarehouseEnum.HA154.ToString())
                {
                    _stockService.StockInfoService.Repository.DeleteAndMoveIntoHty(stockInfo, App.User.UserId == 0 ? OperateTypeEnum.自动完成 : OperateTypeEnum.人工完成);
                    _stockService.StockInfoDetailService.Repository.DeleteAndMoveIntoHty(stockInfo.Details, App.User.UserId == 0 ? OperateTypeEnum.自动完成 : OperateTypeEnum.人工完成);
                }
@@ -754,6 +828,9 @@
                        break;
                    case (int)TaskTypeEnum.OutMesRworkProduct:
                        content = OutMesRworkCompleted(task);
                        break;
                    case (int)TaskTypeEnum.OutProScrap:
                        content = OutProScrapCompleted(task);
                        break;
                    default:
                        content.Error("未知任务类型");
@@ -858,7 +935,9 @@
                BaseDal.DeleteAndMoveIntoHty(task, App.User.UserId == 0 ? OperateTypeEnum.自动完成 : OperateTypeEnum.人工完成);
                _unitOfWorkManage.CommitTran();
                //MES成品出库同步
                ShipmentOrderSync(MesOutSync(outProStockInfo, proOutOrderDetail, proStockInfoDetails));
                MesShipmentOrderSync shipmentOrderSync = MesOutSync(outProStockInfo, proOutOrderDetail, proStockInfoDetails);
                ShipmentOrderSync(shipmentOrderSync);
                ShipmentOrderMESSync(shipmentOrderSync);
                content.OK();
            }
            catch (Exception ex)
@@ -947,5 +1026,152 @@
            }
            return content;
        }
        public WebResponseContent OutProScrapCompleted(Dt_Task task)
        {
            WebResponseContent content = new WebResponseContent();
            try
            {
                //获取货位
                Dt_LocationInfo locationInfo = _basicRepository.LocationInfoRepository.QueryFirst(x => x.LocationCode == task.SourceAddress);
                if (locationInfo == null)
                {
                    return content.Error("未找到货位信息");
                }
                //根据任务获取成品出库详情任务及物料信息
                Dt_OutProStockInfo outProStockInfo = _outProStockInfoRepository.QueryFirst(x => x.TaskNum == task.TaskNum);
                if (outProStockInfo == null)
                {
                    return content.Error("未找到成品出库详情");
                }
                //获取成品报废单
                Dt_ErpProScrapSheet erpProScrapSheet = _outboundRepository.ErpProScrapSheetRepository.Db.Queryable<Dt_ErpProScrapSheet>().Where(x => x.ProScrapSheetOrderNo == outProStockInfo.OrderNo).Includes(x=>x.Details).First();
                if (erpProScrapSheet == null)
                {
                    return content.Error("未找到成品报废单");
                }
                Dt_ErpProScrapSheetDetail erpProScrapSheetDetail = erpProScrapSheet.Details.FirstOrDefault(x => x.Id == outProStockInfo.OrderDetailId);
                if (erpProScrapSheetDetail == null)
                {
                    return content.Error("未找到成品报废单明细");
                }
                if (erpProScrapSheetDetail.ScrapProDetailStatus == OutOrderStatusEnum.出库完成.ObjToInt())
                {
                    return content.Error($"成品报废单明细行{erpProScrapSheetDetail.Id}已完成");
                }
                erpProScrapSheetDetail.ScrapProDetailStatus = OutOrderStatusEnum.出库完成.ObjToInt();
                //获取当前库存
                Dt_ProStockInfo proStockInfo = _stockRepository.ProStockInfoRepository.Db.Queryable<Dt_ProStockInfo>().Where(x => x.PalletCode == task.PalletCode).Includes(x => x.proStockInfoDetails).First();
                if (proStockInfo == null)
                {
                    return content.Error($"未找到{task.PalletCode}库存信息");
                }
                List<Dt_ProStockInfoDetail> proStockInfoDetails = proStockInfo.proStockInfoDetails;
                if (proStockInfoDetails.Count <= 0)
                {
                    return content.Error("成品库存明细为空");
                }
                proStockInfoDetails.ForEach(x =>
                {
                    x.ProOutDetailStatus = StockStatusEmun.出库完成.ObjToInt();
                });
                proStockInfo.StockStatus = StockStatusEmun.出库完成.ObjToInt();
                //获取成品平库
                Dt_Warehouse warehouse = _basicRepository.WarehouseRepository.QueryFirst(x => x.WarehouseCode == WarehouseEnum.HA101.ToString());
                proStockInfo.WarehouseId = warehouse.WarehouseId;
                proStockInfo.LocationCode = "成品包装拣货区";
                task.TaskStatus = TaskStatusEnum.Finish.ObjToInt();
                outProStockInfo.Status = OutLockStockStatusEnum.出库完成.ObjToInt();
                _unitOfWorkManage.BeginTran();
                //货位变动记录
                int beforeStatus = locationInfo.LocationStatus;
                locationInfo.LocationStatus = LocationStatusEnum.Free.ObjToInt();
                _outboundRepository.ErpProScrapDetailRepository.UpdateData(erpProScrapSheetDetail);
                _basicService.LocationInfoService.UpdateLocationStatus(locationInfo, proStockInfo.PalletType, LocationStatusEnum.Free, locationInfo.WarehouseId);
                _recordService.LocationStatusChangeRecordSetvice.AddLocationStatusChangeRecord(locationInfo, (LocationStatusEnum)beforeStatus, LocationStatusEnum.Free, LocationChangeType.OutboundCompleted, erpProScrapSheet?.ProScrapSheetOrderNo ?? "", task.TaskNum);
                _stockRepository.ProStockInfoRepository.UpdateData(proStockInfo);
                _stockRepository.ProStockInfoDetailRepository.UpdateData(proStockInfoDetails);
                _outProStockInfoRepository.UpdateData(outProStockInfo);
                BaseDal.DeleteAndMoveIntoHty(task, App.User.UserId == 0 ? OperateTypeEnum.自动完成 : OperateTypeEnum.人工完成);
                //MES成品库存板出库同步
                //WebResponseContent responseContent = ProductOutBoundSync(MesProOutBound(mesRworkOutboundOrder, proStockInfoDetails));
                //if (!responseContent.Status)
                //{
                //    throw new Exception("同步MES库存板出库失败,错误:"+ responseContent.Message);
                //}
                _unitOfWorkManage.CommitTran();
                content.OK();
            }
            catch (Exception ex)
            {
                _unitOfWorkManage.RollbackTran();
                content.Error(ex.Message);
            }
            return content;
        }
        /// <summary>
        /// ç›˜ç‚¹å‡ºåº“完成
        /// </summary>
        public WebResponseContent OutInventoryCompleted(Dt_Task task,Dt_StockInfo stockInfo,Dt_LocationInfo locationInfo)
        {
            WebResponseContent content = new WebResponseContent();
            try
            {
                //获取对应盘点单
                Dt_TakeStockOrder takeStockOrder = _inboundRepository.TakeStockOrderRepository.Db.Queryable<Dt_TakeStockOrder>().Where(x=>x.OrderNo==task.OrderNo).Includes(x=>x.Details).First();
                if (takeStockOrder==null)
                {
                    return content.Error($"盘点单{task.OrderNo}不存在");
                }
                if (takeStockOrder.TakeStockStatus!=TakeStockStatusEnum.盘点中.ObjToInt())
                {
                    return content.Error($"盘点单{task.OrderNo}盘点已完成或未开始");
                }
                if (stockInfo.StockStatus!=StockStatusEmun.出库锁定.ObjToInt())
                {
                    return content.Error($"{stockInfo.PalletCode}库存状态不正确");
                }
                if (locationInfo.LocationStatus != LocationStatusEnum.Lock.ObjToInt())
                {
                    return content.Error($"{locationInfo.LocationCode}货位状态不正确");
                }
                //根据任务托盘查盘点明细
                Dt_TakeStockOrderDetail? takeStockOrderDetail = takeStockOrder.Details.FirstOrDefault(x=>x.TakePalletCode==stockInfo.PalletCode);
                if (takeStockOrderDetail==null)
                {
                    return content.Error($"{stockInfo.PalletCode}未找到对应盘点明细");
                }
                if (takeStockOrderDetail.TakeDetalStatus!=TakeStockDetailStatusEnum.盘点出库中.ObjToInt())
                {
                    return content.Error($"{stockInfo.PalletCode}盘点明细状态不正确");
                }
                takeStockOrderDetail.TakeDetalStatus = TakeStockDetailStatusEnum.盘点出库完成.ObjToInt();
                stockInfo.StockStatus = StockStatusEmun.盘点出库完成.ObjToInt();
                stockInfo.Details.ForEach(x =>
                {
                    x.Status = StockStatusEmun.盘点出库完成.ObjToInt();
                });
                stockInfo.LocationCode = "";
                task.TaskStatus = TaskStatusEnum.Finish.ObjToInt();
                int beforeStatus = locationInfo.LocationStatus;
                locationInfo.LocationStatus = LocationStatusEnum.Free.ObjToInt();
                _unitOfWorkManage.BeginTran();
                //货位变动记录
                _basicService.LocationInfoService.UpdateLocationStatus(locationInfo, stockInfo.PalletType, LocationStatusEnum.Free, locationInfo.WarehouseId);
                _recordService.LocationStatusChangeRecordSetvice.AddLocationStatusChangeRecord(locationInfo, (LocationStatusEnum)beforeStatus, LocationStatusEnum.Free, LocationChangeType.OutboundCompleted, takeStockOrder?.OrderNo ?? "", task.TaskNum);
                _inboundRepository.TakeStockOrderDetailRepository.UpdateData(takeStockOrderDetail);
                _stockRepository.StockInfoRepository.UpdateData(stockInfo);
                _stockRepository.StockInfoDetailRepository.UpdateData(stockInfo.Details);
                BaseDal.DeleteAndMoveIntoHty(task, App.User.UserId == 0 ? OperateTypeEnum.自动完成 : OperateTypeEnum.人工完成);
                _unitOfWorkManage.CommitTran();
                content.OK();
            }
            catch (Exception ex)
            {
                _unitOfWorkManage.RollbackTran();
                content.Error(ex.Message);
            }
            return content;
        }
    }
}