| | |
| | | using WIDESEA_BasicService.MESOperation; |
| | | using WIDESEA_Core.Util; |
| | | using WIDESEA_DTO.Allocate; |
| | | using OfficeOpenXml.FormulaParsing.Excel.Functions.DateTime; |
| | | using WIDESEA_IRecordService; |
| | | |
| | | namespace WIDESEA_OutboundService |
| | | { |
| | |
| | | private readonly IFeedbackMesService _feedbackMesService; |
| | | private readonly HttpClientHelper _httpClientHelper; |
| | | private readonly IRepository<Dt_MesReturnRecord> _mesReturnRecord; |
| | | private readonly IStockQuantityChangeRecordService _stockQuantityChangeRecordService; |
| | | private readonly IInboundOrderService _inboundOrderService; |
| | | |
| | | private Dictionary<string, string> stations = new Dictionary<string, string> |
| | | { |
| | |
| | | public OutboundPickingService(IRepository<Dt_PickingRecord> BaseDal, IUnitOfWorkManage unitOfWorkManage, IStockInfoService stockInfoService, IStockService stockService, |
| | | IOutStockLockInfoService outStockLockInfoService, IStockInfoDetailService stockInfoDetailService, ILocationInfoService locationInfoService, |
| | | IOutboundOrderDetailService outboundOrderDetailService, ISplitPackageService splitPackageService, IOutboundOrderService outboundOrderService, |
| | | IRepository<Dt_Task> taskRepository, IESSApiService eSSApiService, ILogger<OutboundPickingService> logger, IInvokeMESService invokeMESService, IDailySequenceService dailySequenceService, IAllocateService allocateService, IRepository<Dt_InboundOrder> inboundOrderRepository, IInboundOrderDetailService inboundOrderDetailService, IRepository<Dt_WarehouseArea> warehouseAreaRepository, IReCheckOrderService reCheckOrderService, ITask_HtyService task_HtyService, IRepository<Dt_InterfaceLog> interfaceLog, IInboundService inboundService, IFeedbackMesService feedbackMesService, HttpClientHelper httpClientHelper, IRepository<Dt_MesReturnRecord> mesReturnRecord) : base(BaseDal) |
| | | IRepository<Dt_Task> taskRepository, IESSApiService eSSApiService, ILogger<OutboundPickingService> logger, IInvokeMESService invokeMESService, IDailySequenceService dailySequenceService, IAllocateService allocateService, IRepository<Dt_InboundOrder> inboundOrderRepository, IInboundOrderDetailService inboundOrderDetailService, IRepository<Dt_WarehouseArea> warehouseAreaRepository, IReCheckOrderService reCheckOrderService, ITask_HtyService task_HtyService, IRepository<Dt_InterfaceLog> interfaceLog, IInboundService inboundService, IFeedbackMesService feedbackMesService, HttpClientHelper httpClientHelper, IRepository<Dt_MesReturnRecord> mesReturnRecord,IStockQuantityChangeRecordService stockQuantityChangeRecordService,IInboundOrderService inboundOrderService) : base(BaseDal) |
| | | { |
| | | _unitOfWorkManage = unitOfWorkManage; |
| | | _stockInfoService = stockInfoService; |
| | |
| | | _feedbackMesService = feedbackMesService; |
| | | _httpClientHelper = httpClientHelper; |
| | | _mesReturnRecord = mesReturnRecord; |
| | | _stockQuantityChangeRecordService = stockQuantityChangeRecordService; |
| | | _inboundOrderService = inboundOrderService; |
| | | |
| | | } |
| | | |
| | |
| | | |
| | | Dictionary<int, Dt_InboundOrder> updateInboundOrders = new Dictionary<int, Dt_InboundOrder>(); |
| | | |
| | | List<Dt_StockQuantityChangeRecord> changeRecords = new List<Dt_StockQuantityChangeRecord>(); |
| | | _unitOfWorkManage.BeginTran(); |
| | | |
| | | List<Dt_InboundOrderDetail> allInboundDetails = _inboundOrderDetailService.Db |
| | | .Queryable<Dt_InboundOrderDetail>() |
| | | .Where(detail => noStockOutSubmit.BarCodeSubmit.Contains(detail.Barcode) |
| | | && detail.OrderDetailStatus != OrderDetailStatusEnum.Over.ObjToInt()) |
| | | .ToList(); |
| | | .Queryable<Dt_InboundOrderDetail>() |
| | | .Where(detail => noStockOutSubmit.BarCodeSubmit.Contains(detail.Barcode) |
| | | && detail.OrderDetailStatus != OrderDetailStatusEnum.Over.ObjToInt()) |
| | | .ToList(); |
| | | |
| | | var detailGroupByOrderId = allInboundDetails.GroupBy(d => d.OrderId).ToList(); |
| | | foreach (var group in detailGroupByOrderId) |
| | |
| | | List<Dt_InboundOrderDetail> groupDetails = group.ToList(); |
| | | List<string> groupBarCodes = groupDetails.Select(d => d.Barcode).ToList(); |
| | | |
| | | |
| | | orderIdBarCodeDict[orderId] = groupBarCodes; |
| | | |
| | | Dt_InboundOrder currentInboundOrder = null; |
| | | if (!updateInboundOrders.TryGetValue(orderId, out currentInboundOrder)) |
| | | { |
| | | currentInboundOrder = _inboundOrderRepository.Db |
| | | .Queryable<Dt_InboundOrder>() |
| | | .Where(x => x.Id == orderId) |
| | | .Includes(x => x.Details) |
| | | .First(); |
| | | |
| | | if (currentInboundOrder == null) |
| | | { |
| | | _unitOfWorkManage.RollbackTran(); |
| | | return WebResponseContent.Instance.Error($"æªæ¾å°å
¥åºåID为 {orderId} çåæ®"); |
| | | } |
| | | updateInboundOrders[orderId] = currentInboundOrder; |
| | | } |
| | | |
| | | foreach (var detail in groupDetails) |
| | | { |
| | |
| | | detail.OrderDetailStatus = OrderDetailStatusEnum.Over.ObjToInt(); |
| | | } |
| | | updateInboundDetails.Add(detail); |
| | | } |
| | | |
| | | if (!updateInboundOrders.ContainsKey(orderId)) |
| | | { |
| | | Dt_InboundOrder inboundOrder = _inboundOrderRepository.Db |
| | | .Queryable<Dt_InboundOrder>() |
| | | .Where(x => x.Id == orderId) |
| | | .Includes(x => x.Details) |
| | | .First(); |
| | | |
| | | if (inboundOrder == null) |
| | | //æ·»å åºååå¨è®°å½ |
| | | Dt_StockQuantityChangeRecord changeRecord = new Dt_StockQuantityChangeRecord |
| | | { |
| | | _unitOfWorkManage.RollbackTran(); |
| | | return WebResponseContent.Instance.Error($"æªæ¾å°å
¥åºåID为 {orderId} çåæ®"); |
| | | } |
| | | |
| | | // 夿æ´åæ¯å¦å
¨é¨å®æ |
| | | int totalDetailCount = inboundOrder.Details.Count(); |
| | | int beforeDetailCount = inboundOrder.Details.Where(x => x.OrderId == orderId && x.OrderDetailStatus == OrderDetailStatusEnum.Over.ObjToInt()) |
| | | .Count(); |
| | | int finishedDetailCount = updateInboundDetails |
| | | .Where(x => x.OrderId == orderId && x.OrderDetailStatus == OrderDetailStatusEnum.Over.ObjToInt()) |
| | | .Count(); |
| | | |
| | | inboundOrder.OrderStatus = totalDetailCount == finishedDetailCount+beforeDetailCount |
| | | ? InOrderStatusEnum.å
¥åºå®æ.ObjToInt() |
| | | : InOrderStatusEnum.å
¥åºä¸.ObjToInt(); |
| | | |
| | | updateInboundOrders[orderId] = inboundOrder; |
| | | StockDetailId = detail.Id, |
| | | PalleCode = DateTime.Now.ToString(), |
| | | MaterielCode = detail.MaterielCode, |
| | | MaterielName = detail.MaterielName ?? "", |
| | | BatchNo = detail.BatchNo ?? "", |
| | | OriginalSerilNumber = detail.Barcode, |
| | | NewSerilNumber = "", |
| | | OrderNo = currentInboundOrder.InboundOrderNo, |
| | | TaskNum = 0, |
| | | ChangeType = (int)StockChangeTypeEnum.Inbound, |
| | | ChangeQuantity = detail.NoStockOutQty, |
| | | BeforeQuantity = detail.OverInQuantity - detail.NoStockOutQty, |
| | | AfterQuantity = detail.OverInQuantity, |
| | | SupplyCode = detail.SupplyCode ?? "", |
| | | WarehouseCode = detail.WarehouseCode ?? "", |
| | | Remark = $"èæå
¥åº" |
| | | }; |
| | | changeRecords.Add(changeRecord); |
| | | } |
| | | |
| | | var inboundOrder = updateInboundOrders[orderId]; |
| | | int totalDetailCount = inboundOrder.Details.Count; |
| | | |
| | | int finishedDetailCount = inboundOrder.Details.Count(x => x.OrderDetailStatus == OrderDetailStatusEnum.Over.ObjToInt()) |
| | | + groupDetails.Count(x => x.OrderDetailStatus == OrderDetailStatusEnum.Over.ObjToInt()); |
| | | |
| | | inboundOrder.OrderStatus = totalDetailCount == finishedDetailCount |
| | | ? InOrderStatusEnum.å
¥åºå®æ.ObjToInt() |
| | | : InOrderStatusEnum.å
¥åºä¸.ObjToInt(); |
| | | } |
| | | |
| | | // 6. æ¹éæ´æ°æç»å主åï¼æ¹éæä½æåæ§è½ï¼ |
| | | if (updateInboundDetails.Any()) |
| | | { |
| | | foreach (var detail in updateInboundDetails) |
| | | { |
| | | _inboundOrderDetailService.UpdateData(detail); |
| | | } |
| | | |
| | | _inboundOrderDetailService.Db.Updateable(updateInboundDetails).ExecuteCommand(); |
| | | } |
| | | if (updateInboundOrders.Any()) |
| | | { |
| | | foreach (var order in updateInboundOrders.Values) |
| | | { |
| | | _inboundOrderRepository.UpdateData(order); |
| | | } |
| | | // æ¹éæ´æ°å
¥åºä¸»å |
| | | _inboundOrderService.Db.Updateable(updateInboundOrders.Values.ToList()).ExecuteCommand(); |
| | | } |
| | | |
| | | // 7. 循ç¯åç»ç»æï¼è°ç¨MESåä¼ æ¹æ³ï¼æå
¥åºååç»åä¼ ï¼ |
| | |
| | | List<string> barCodeList = kvp.Value; |
| | | //å
¥åºåä¼ MES |
| | | NoStockOutBatchInOrderFeedbackToMes(orderId, barCodeList); |
| | | |
| | | } |
| | | |
| | | |
| | | //åªå¯¹åºåºæ¡ç çåºåºåæç»è¿è¡è®¡ç®åä¼ |
| | | List<Dt_OutboundOrderDetail> outboundOrderDetail = outboundOrder.Details |
| | | .Where(x => !string.IsNullOrWhiteSpace(x.documentsNO) |
| | | && noStockOutSubmit.BarCodeSubmit.Any(barcode => |
| | | x.documentsNO.IndexOf(barcode, StringComparison.OrdinalIgnoreCase) >= 0)) |
| | | .ToList(); |
| | | .Where(x => !string.IsNullOrWhiteSpace(x.documentsNO) |
| | | && noStockOutSubmit.BarCodeSubmit.Any(barcode => |
| | | x.documentsNO.IndexOf(barcode, StringComparison.OrdinalIgnoreCase) >= 0)) |
| | | .ToList(); |
| | | |
| | | foreach (var item in outboundOrderDetail) |
| | | { |
| | |
| | | ContractResolver = new CamelCasePropertyNamesContractResolver() |
| | | }; |
| | | item.ReturnJsonData = JsonConvert.SerializeObject(barcodesList, settings); |
| | | |
| | | //æ·»å åºååå¨è®°å½ |
| | | Dt_StockQuantityChangeRecord changeRecord = new Dt_StockQuantityChangeRecord |
| | | { |
| | | StockDetailId = item.Id, |
| | | PalleCode = DateTime.Now.ToString(), |
| | | MaterielCode = item.MaterielCode, |
| | | MaterielName = item.MaterielName ?? "", |
| | | BatchNo = item.BatchNo ?? "", |
| | | OriginalSerilNumber = item.ReturnJsonData, |
| | | NewSerilNumber = "", |
| | | OrderNo = outboundOrder.OrderNo, |
| | | TaskNum = 0, |
| | | ChangeType = (int)StockChangeTypeEnum.Inbound, |
| | | ChangeQuantity = -item.NoStockOutQty, |
| | | BeforeQuantity = item.OrderQuantity - item.OverOutQuantity-item.MoveQty, |
| | | AfterQuantity = item.OrderQuantity - item.OverOutQuantity - item.MoveQty - item.NoStockOutQty, |
| | | SupplyCode = item.SupplyCode ?? "", |
| | | WarehouseCode = item.WarehouseCode ?? "", |
| | | Remark = $"èæåºåº" |
| | | }; |
| | | changeRecords.Add(changeRecord); |
| | | outboundOrderDetails.Add(item); |
| | | } |
| | | |
| | | _outboundOrderDetailService.UpdateData(outboundOrderDetails); |
| | | |
| | | //æ¹éæ·»å åºååå¨è®°å½ |
| | | if (changeRecords.Any()) |
| | | { |
| | | _stockQuantityChangeRecordService.Db.Insertable(changeRecords).ExecuteCommand(); |
| | | } |
| | | // æ£æ¥åºåºåæ¯å¦å®æ |
| | | if (CheckOutboundOrderCompleted(outboundOrder.OrderNo)) |
| | | { |