| | |
| | | { |
| | | return WebResponseContent.Instance.Error("æªæ¾å°æ»¡è¶³åºåºæ¡ä»¶çåºåºå"); |
| | | } |
| | | if(outboundOrder.IsBatch == 0) |
| | | { |
| | | return WebResponseContent.Instance.Error("è¯¥åæ®ä¸å±äºåæ¹åä¼ åæ®ï¼ä¸å
许èæåºå
¥åº"); |
| | | } |
| | | //å
æ¸
ç©ºåæ®èæåºå
¥åºæ°éè¿è¡è®¡ç® |
| | | foreach (var item in outboundOrder.Details) |
| | | { |
| | |
| | | return WebResponseContent.Instance.OK("æå"); |
| | | |
| | | } |
| | | public WebResponseContent BarcodeValidate(NoStockOutModel noStockOut) |
| | | |
| | | public WebResponseContent BarcodeValidate(NoStockOutModel noStockOut) |
| | | { |
| | | try |
| | | { |
| | | try |
| | | Dt_InboundOrder inboundOrder = Db.Queryable<Dt_InboundOrder>() |
| | | .Where(x => x.UpperOrderNo == noStockOut.inOder && x.OrderStatus != InOrderStatusEnum.å
¥åºå®æ.ObjToInt()) |
| | | .Includes(x => x.Details) |
| | | .First(); |
| | | if (inboundOrder == null) |
| | | { |
| | | Dt_InboundOrder inboundOrder = Db.Queryable<Dt_InboundOrder>().Where(x => x.UpperOrderNo == noStockOut.inOder && x.OrderStatus != InOrderStatusEnum.å
¥åºå®æ.ObjToInt()).Includes(x => x.Details).First(); |
| | | if (inboundOrder == null) |
| | | { |
| | | return WebResponseContent.Instance.Error($"æªæ¾å°éè´åï¼{noStockOut.inOder}"); |
| | | } |
| | | Dt_OutboundOrder outboundOrder = Db.Queryable<Dt_OutboundOrder>().Where(x => x.UpperOrderNo == noStockOut.outOder && x.OrderStatus != OutOrderStatusEnum.åºåºå®æ.ObjToInt()).Includes(x => x.Details).First(); |
| | | if (outboundOrder == null) |
| | | { |
| | | return WebResponseContent.Instance.Error($"æªæ¾å°åºåºåï¼{noStockOut.inOder}"); |
| | | } |
| | | return WebResponseContent.Instance.Error($"æªæ¾å°éè´åï¼{noStockOut.inOder}"); |
| | | } |
| | | |
| | | //åå¨å
¥åºåæ®æç»ä¿¡æ¯ |
| | | var detailLists = new List<Dt_InboundOrderDetail>(); |
| | | Dt_OutboundOrder outboundOrder = Db.Queryable<Dt_OutboundOrder>() |
| | | .Where(x => x.UpperOrderNo == noStockOut.outOder && x.OrderStatus != OutOrderStatusEnum.åºåºå®æ.ObjToInt()) |
| | | .Includes(x => x.Details) |
| | | .First(); |
| | | if (outboundOrder == null) |
| | | { |
| | | return WebResponseContent.Instance.Error($"æªæ¾å°åºåºåï¼{noStockOut.outOder}"); |
| | | } |
| | | |
| | | var matchedDetail = inboundOrder.Details.FirstOrDefault(detail => |
| | | detail.Barcode == noStockOut.barCode && |
| | | detail.OrderDetailStatus != OrderDetailStatusEnum.Over.ObjToInt()); |
| | | var detailLists = new List<Dt_InboundOrderDetail>(); |
| | | var matchedDetail = inboundOrder.Details.FirstOrDefault(detail => |
| | | detail.Barcode == noStockOut.barCode && |
| | | detail.OrderDetailStatus != OrderDetailStatusEnum.Over.ObjToInt()&& detail.ReceiptQuantity == 0); |
| | | |
| | | if (matchedDetail == null) |
| | | { |
| | | matchedDetail = inboundOrder.Details.FirstOrDefault(detail => |
| | | detail.OutBoxbarcodes == noStockOut.barCode && |
| | | detail.OrderDetailStatus != OrderDetailStatusEnum.Over.ObjToInt() && detail.ReceiptQuantity == 0); |
| | | |
| | | if (matchedDetail == null) |
| | | { |
| | | matchedDetail = inboundOrder.Details.FirstOrDefault(detail => |
| | | detail.OutBoxbarcodes == noStockOut.barCode && |
| | | detail.OrderDetailStatus != OrderDetailStatusEnum.Over.ObjToInt()); |
| | | |
| | | if (matchedDetail == null) |
| | | { |
| | | return WebResponseContent.Instance.Error($"å¨éè´å {noStockOut.inOder} 䏿ªæ¾å°æ¡ç 为 {noStockOut.barCode} çæç»ã"); |
| | | } |
| | | else |
| | | { |
| | | |
| | | // æ·»å ææéå®æç¶æçæç»æ¡ç |
| | | foreach (var detail in inboundOrder.Details) |
| | | { |
| | | if (detail.OrderDetailStatus != OrderDetailStatusEnum.Over.ObjToInt() && |
| | | !string.IsNullOrEmpty(detail.Barcode)&& detail.OutBoxbarcodes == noStockOut.barCode) |
| | | { |
| | | detailLists.Add(detail); |
| | | } |
| | | } |
| | | } |
| | | return WebResponseContent.Instance.Error($"å¨éè´å {noStockOut.inOder} 䏿ªæ¾å°æ¡ç 为 {noStockOut.barCode} çå¯åºåºæç»ã"); |
| | | } |
| | | else |
| | | { |
| | | if (!string.IsNullOrEmpty(noStockOut.barCode)) |
| | | // æ·»å ææå¹é
å¤ç®±ç ä¸éå®æç¶æçæç» |
| | | foreach (var detail in inboundOrder.Details) |
| | | { |
| | | detailLists.Add(matchedDetail); |
| | | if (detail.OrderDetailStatus != OrderDetailStatusEnum.Over.ObjToInt() && |
| | | !string.IsNullOrEmpty(detail.Barcode) && |
| | | detail.OutBoxbarcodes == noStockOut.barCode && detail.OrderQuantity > detail.NoStockOutQty) |
| | | { |
| | | detailLists.Add(detail); |
| | | } |
| | | } |
| | | } |
| | | |
| | | } |
| | | else |
| | | { |
| | | if (!string.IsNullOrEmpty(noStockOut.barCode)) |
| | | { |
| | | detailLists.Add(matchedDetail); |
| | | } |
| | | } |
| | | if (!detailLists.Any()) |
| | | { |
| | | return WebResponseContent.Instance.Error("该æ¡ç å·²ç»æ²¡æå¯åºåºæ°é"); |
| | | } |
| | | var outDetails = new List<Dt_OutboundOrderDetail>(); |
| | | |
| | | // éåæ¯ä¸ªå
¥åºæç» |
| | | foreach (var item in detailLists) |
| | | { |
| | | // éç½®å½åå
¥åºæç»çæ åºååºåºæ°é |
| | | item.NoStockOutQty = 0; |
| | | |
| | | var matchedCode = outboundOrder.Details.FirstOrDefault(detail => detail.MaterielCode == item.MaterielCode && detail.OrderDetailStatus != OrderDetailStatusEnum.Over.ObjToInt()&& detail.OrderQuantity - detail.LockQuantity - detail.MoveQty - detail.NoStockOutQty > 0); |
| | | // å½åæ¡ç éè¦åºåºçæ»æ°éï¼å
¥åºåå©ä½å¯åºæ°éï¼ |
| | | decimal remainingBarcodeQty = item.OrderQuantity - item.ReceiptQuantity; |
| | | if (remainingBarcodeQty <= 0) |
| | | { |
| | | return WebResponseContent.Instance.Error($"该éè´åä¸çæ¡ç {item.Barcode}对åºçå¯åºæ°é为0"); |
| | | } |
| | | |
| | | if (matchedCode != null) |
| | | // çéåºåºåä¸ç¬¦åæ¡ä»¶çæç»ï¼åç©æãé宿ãæå©ä½å¯åºæ°éï¼ |
| | | var eligibleOutDetails = outboundOrder.Details.Where(detail => |
| | | detail.MaterielCode == item.MaterielCode && |
| | | detail.OrderDetailStatus != OrderDetailStatusEnum.Over.ObjToInt() && |
| | | (detail.OrderQuantity - detail.LockQuantity - detail.MoveQty - detail.NoStockOutQty) > 0).ToList(); |
| | | |
| | | if (!eligibleOutDetails.Any()) |
| | | { |
| | | if(matchedCode.OrderQuantity - matchedCode.LockQuantity - matchedCode.MoveQty - matchedCode.NoStockOutQty < 0) |
| | | { |
| | | return WebResponseContent.Instance.Error($"ç©æ{item.MaterielCode}å¯åºæ°é溢åº{(matchedCode.LockQuantity + matchedCode.MoveQty + matchedCode.NoStockOutQty) - matchedCode.OrderQuantity}"); |
| | | } |
| | | return WebResponseContent.Instance.Error($"å¨åºåºå䏿ªæ¾å°ç©æ{item.MaterielCode}çå¯åºåºæç»"); |
| | | } |
| | | else |
| | | |
| | | // éåç¬¦åæ¡ä»¶çåºåºæç»ï¼éè¡åé
æ°é |
| | | foreach (var outDetail in eligibleOutDetails) |
| | | { |
| | | return WebResponseContent.Instance.Error($"å¨åºåºåçç©æç¼ç 䏿ªæ¾å°ä¸éè´åä¸ç{item.MaterielCode} 对åºçç©æ"); |
| | | } |
| | | if (!matchedCode.BatchNo.IsNullOrEmpty() && matchedCode.BatchNo != "") |
| | | { |
| | | var matcheBatch = outboundOrder.Details.FirstOrDefault(detail => detail.BatchNo == item.BatchNo); |
| | | if (matcheBatch == null) |
| | | // 计ç®å½ååºåºè¡çå©ä½å¯åºæ°é |
| | | decimal rowRemainingQty = outDetail.OrderQuantity - outDetail.LockQuantity - outDetail.MoveQty - outDetail.NoStockOutQty; |
| | | if (rowRemainingQty <= 0) continue; |
| | | |
| | | if (!outDetail.BatchNo.IsNullOrEmpty()) |
| | | { |
| | | return WebResponseContent.Instance.Error($"å¨åºåºåçç©æç¼ç 䏿ªæ¾å°ä¸éè´åæ¹æ¬¡ä¸ç{item.BatchNo} 对åºçç©æã"); |
| | | } |
| | | } |
| | | if (!matchedCode.SupplyCode.IsNullOrEmpty() && matchedCode.SupplyCode != "") |
| | | { |
| | | var matcheBatch = outboundOrder.Details.FirstOrDefault(detail => detail.SupplyCode == item.SupplyCode); |
| | | if (matcheBatch == null) |
| | | { |
| | | return WebResponseContent.Instance.Error($"å¨åºåºåçç©æç¼ç 䏿ªæ¾å°ä¸éè´åä¾åºåä¸ç{item.SupplyCode} 对åºçç©æã"); |
| | | } |
| | | } |
| | | if (!outboundOrder.FactoryArea.IsNullOrEmpty() && outboundOrder.FactoryArea != "" && !inboundOrder.FactoryArea.IsNullOrEmpty() && inboundOrder.FactoryArea != "") |
| | | { |
| | | if (inboundOrder.FactoryArea != outboundOrder.FactoryArea) |
| | | { |
| | | return WebResponseContent.Instance.Error($"该æ¡ç {item.Barcode}对åºçåæ®ååºä¸åºåºåæ®ä¸ä¸è´ï¼ä¸å
许åºåºã"); |
| | | } |
| | | } |
| | | if(inboundOrder.BusinessType != "11") |
| | | { |
| | | if (!matchedCode.WarehouseCode.IsNullOrEmpty() && matchedCode.WarehouseCode != "") |
| | | { |
| | | var matcheBatch = outboundOrder.Details.FirstOrDefault(detail => detail.WarehouseCode == item.WarehouseCode); |
| | | if (matcheBatch == null) |
| | | if (outDetail.BatchNo != item.BatchNo) |
| | | { |
| | | return WebResponseContent.Instance.Error($"ä»åºä¸ä¸è´ï¼å¨åºåºåçç©æç¼ç 䏿ªæ¾å°ä¸éè´åä»åºä¸ç{item.WarehouseCode} 对åºçç©æã"); |
| | | return WebResponseContent.Instance.Error($"åºåºåè¡æ¹æ¬¡{outDetail.BatchNo}ä¸éè´åæ¹æ¬¡{item.BatchNo}ä¸å¹é
"); |
| | | } |
| | | } |
| | | } |
| | | else |
| | | { |
| | | item.WarehouseCode = matchedCode.WarehouseCode; |
| | | if (!outDetail.SupplyCode.IsNullOrEmpty()) |
| | | { |
| | | if (outDetail.SupplyCode != item.SupplyCode) |
| | | { |
| | | return WebResponseContent.Instance.Error($"åºåºåè¡ä¾åºå{outDetail.SupplyCode}ä¸éè´åä¾åºå{item.SupplyCode}ä¸å¹é
"); |
| | | } |
| | | } |
| | | if (!string.IsNullOrEmpty(outboundOrder.FactoryArea) && !string.IsNullOrEmpty(inboundOrder.FactoryArea)) |
| | | { |
| | | if (inboundOrder.FactoryArea != outboundOrder.FactoryArea) |
| | | { |
| | | return WebResponseContent.Instance.Error($"该æ¡ç {item.Barcode}对åºçåæ®ååºä¸åºåºåæ®ä¸ä¸è´ï¼ä¸å
许åºåºã"); |
| | | } |
| | | } |
| | | if (inboundOrder.BusinessType != "11" && !outDetail.WarehouseCode.IsNullOrEmpty()) |
| | | { |
| | | if (outDetail.WarehouseCode != item.WarehouseCode) |
| | | { |
| | | return WebResponseContent.Instance.Error($"ä»åºä¸ä¸è´ï¼åºåºåè¡ä»åº{outDetail.WarehouseCode}ä¸éè´åä»åº{item.WarehouseCode}ä¸å¹é
"); |
| | | } |
| | | } |
| | | else |
| | | { |
| | | item.WarehouseCode = outDetail.WarehouseCode; |
| | | } |
| | | |
| | | // è®¡ç®æ¬æ¬¡åé
çæ°éï¼åå©ä½æ¡ç æ°éåå½åè¡å©ä½æ°éçè¾å°å¼ï¼ |
| | | decimal assignQty = Math.Min(remainingBarcodeQty, rowRemainingQty); |
| | | |
| | | // æ´æ°å
¥åºæç»ååºåºæç»çæ åºååºåºæ°é |
| | | item.NoStockOutQty += assignQty; |
| | | outDetail.NoStockOutQty += assignQty; |
| | | |
| | | // æ´æ°å©ä½éè¦åé
çæ¡ç æ°é |
| | | remainingBarcodeQty -= assignQty; |
| | | |
| | | // è®°å½å·²æ´æ°çåºåºæç»ï¼å»éï¼ |
| | | if (!outDetails.Contains(outDetail)) |
| | | { |
| | | outDetails.Add(outDetail); |
| | | } |
| | | |
| | | // éªè¯å½åè¡æ¯å¦æº¢åº |
| | | if ((outDetail.LockQuantity + outDetail.NoStockOutQty + outDetail.MoveQty) > outDetail.OrderQuantity) |
| | | { |
| | | return WebResponseContent.Instance.Error($"åºåºåæç»{outDetail.Id}æ°é溢åºï¼è¶
åºæ°éï¼{(outDetail.LockQuantity + outDetail.NoStockOutQty + outDetail.MoveQty) - outDetail.OrderQuantity}"); |
| | | } |
| | | |
| | | // å¤çMESåæ°åä¼ ï¼è®°å½å½åæ¡ç åé
å°è¯¥è¡çå®é
æ°é |
| | | List<Barcodes> barcodesList = new List<Barcodes>(); |
| | | Barcodes barcodes = new Barcodes |
| | | { |
| | | Barcode = item.Barcode, |
| | | Qty = assignQty, |
| | | SupplyCode = item?.SupplyCode ?? "", |
| | | BatchNo = item?.BatchNo ?? "", |
| | | Unit = item?.Unit ?? "" |
| | | }; |
| | | // ååºåå该è¡å·²æçæ¡ç è®°å½ |
| | | if (!string.IsNullOrEmpty(outDetail.documentsNO)) |
| | | { |
| | | try |
| | | { |
| | | barcodesList = JsonConvert.DeserializeObject<List<Barcodes>>(outDetail.documentsNO) ?? new List<Barcodes>(); |
| | | } |
| | | catch (JsonException ex) |
| | | { |
| | | return WebResponseContent.Instance.Error($"åºåºåæç»{outDetail.Id}çdocumentsNOåæ®µæ ¼å¼é误ï¼{ex.Message}"); |
| | | } |
| | | } |
| | | // æ·»å æ¬æ¬¡åé
çè®°å½ |
| | | barcodesList.Add(barcodes); |
| | | // åºåååå |
| | | JsonSerializerSettings settings = new JsonSerializerSettings |
| | | { |
| | | ContractResolver = new CamelCasePropertyNamesContractResolver() |
| | | }; |
| | | outDetail.documentsNO = JsonConvert.SerializeObject(barcodesList, settings); |
| | | |
| | | // æ¡ç æ°éåé
宿¯ï¼éåºå½åè¡å¾ªç¯ |
| | | if (remainingBarcodeQty <= 0) |
| | | { |
| | | break; |
| | | } |
| | | } |
| | | |
| | | //å©ä½å
¥åºæ°éå³èæåºå
¥åºå©ä½å¯åºæ°é |
| | | decimal outQuantity = item.OrderQuantity - item.ReceiptQuantity; |
| | | if (outQuantity == 0) |
| | | // ææç¬¦åæ¡ä»¶çåºåºè¡éåå®åï¼æ¡ç æ°é仿å©ä½ |
| | | if (remainingBarcodeQty > 0) |
| | | { |
| | | return WebResponseContent.Instance.Error($"该éè´åä¸çæ¡ç 对åºçå¯åºæ°é为0"); |
| | | return WebResponseContent.Instance.Error($"æ¡ç {item.Barcode}éåºåºæ°é{item.OrderQuantity - item.ReceiptQuantity}ï¼ä½åºåºåä¸ç©æ{item.MaterielCode}å©ä½å¯åºæ»éä¸è¶³ï¼ä»å©ä½{remainingBarcodeQty}æ°éæªåé
"); |
| | | } |
| | | if (matchedCode.OrderQuantity - matchedCode.LockQuantity - matchedCode.MoveQty - matchedCode.NoStockOutQty < outQuantity) |
| | | { |
| | | return WebResponseContent.Instance.Error($"该éè´åä¸çæ¡ç 对åºçå¯åºæ°éè¶
åºåºåºååºåºæ°é{item.OrderQuantity - (matchedCode.OrderQuantity - matchedCode.LockQuantity - matchedCode.MoveQty)},䏿»¡è¶³æ´å
åºåº"); |
| | | } |
| | | //åæ®åºåºé宿°é |
| | | item.NoStockOutQty += outQuantity; |
| | | matchedCode.NoStockOutQty += outQuantity; |
| | | |
| | | //åä¼ MESåæ° |
| | | List<Barcodes> barcodesList = new List<Barcodes>(); |
| | | Barcodes barcodes = new Barcodes |
| | | { |
| | | Barcode = item.Barcode, |
| | | Qty = item.OrderQuantity, |
| | | SupplyCode = item?.SupplyCode ?? "", |
| | | BatchNo = item?.BatchNo ?? "", |
| | | Unit = item?.Unit ?? "" |
| | | }; |
| | | if (!string.IsNullOrEmpty(matchedCode.documentsNO)) |
| | | { |
| | | barcodesList = JsonConvert.DeserializeObject<List<Barcodes>>(matchedCode.documentsNO) ?? new List<Barcodes>(); |
| | | } |
| | | barcodesList.Add(barcodes); |
| | | JsonSerializerSettings settings = new JsonSerializerSettings |
| | | { |
| | | ContractResolver = new CamelCasePropertyNamesContractResolver() |
| | | }; |
| | | matchedCode.documentsNO = JsonConvert.SerializeObject(barcodesList, settings); |
| | | |
| | | |
| | | if ((matchedCode.LockQuantity + matchedCode.NoStockOutQty+matchedCode.MoveQty) > matchedCode.OrderQuantity) |
| | | { |
| | | return WebResponseContent.Instance.Error($"åºåºåæç»æ°é溢åº{matchedCode.OrderQuantity - matchedCode.LockQuantity-matchedCode.NoStockOutQty-matchedCode.MoveQty}"); |
| | | } |
| | | |
| | | outDetails.Add(matchedCode); |
| | | } |
| | | |
| | | _unitOfWorkManage.BeginTran(); |
| | | _inboundOrderDetailService.UpdateData(detailLists); |
| | | _outboundOrderDetailService.UpdateData(outDetails); |
| | | _unitOfWorkManage.CommitTran(); |
| | | return WebResponseContent.Instance.OK("æå",data:detailLists); |
| | | } |
| | | catch (Exception ex) |
| | | { |
| | | _unitOfWorkManage.RollbackTran(); |
| | | return WebResponseContent.Instance.Error(ex.Message); |
| | | } |
| | | _inboundOrderDetailService.UpdateData(detailLists); |
| | | _outboundOrderDetailService.UpdateData(outDetails); |
| | | _unitOfWorkManage.CommitTran(); |
| | | |
| | | return WebResponseContent.Instance.OK("æå", data: detailLists); |
| | | } |
| | | |
| | | |
| | | public WebResponseContent DeleteBarcode(NoStockOutModel noStockOut) |
| | | catch (Exception ex) |
| | | { |
| | | try |
| | | _unitOfWorkManage.RollbackTran(); |
| | | return WebResponseContent.Instance.Error(ex.Message); |
| | | } |
| | | } |
| | | |
| | | |
| | | public WebResponseContent DeleteBarcode(NoStockOutModel noStockOut) |
| | | { |
| | | try |
| | | { |
| | | Dt_InboundOrder inboundOrder = Db.Queryable<Dt_InboundOrder>() |
| | | .Where(x => x.UpperOrderNo == noStockOut.inOder && x.OrderStatus != InOrderStatusEnum.å
¥åºå®æ.ObjToInt()) |
| | | .Includes(x => x.Details) |
| | | .First(); |
| | | if (inboundOrder == null) |
| | | { |
| | | Dt_InboundOrder inboundOrder = Db.Queryable<Dt_InboundOrder>().Where(x => x.UpperOrderNo == noStockOut.inOder && x.OrderStatus != InOrderStatusEnum.å
¥åºå®æ.ObjToInt()).Includes(x => x.Details).First(); |
| | | if (inboundOrder == null) |
| | | { |
| | | return WebResponseContent.Instance.Error($"æªæ¾å°éè´åï¼{noStockOut.inOder}"); |
| | | } |
| | | var matchedDetail = inboundOrder.Details.FirstOrDefault(detail => detail.Barcode == noStockOut.barCode && detail.OrderDetailStatus != OrderDetailStatusEnum.Over.ObjToInt()); |
| | | return WebResponseContent.Instance.Error($"æªæ¾å°éè´åï¼{noStockOut.inOder}"); |
| | | } |
| | | |
| | | if (matchedDetail == null) |
| | | { |
| | | return WebResponseContent.Instance.Error($"å¨éè´å {noStockOut.inOder} 䏿ªæ¾å°æ¡ç 为 {noStockOut.barCode} çæç»ã"); |
| | | } |
| | | matchedDetail.NoStockOutQty = 0; |
| | | var matchedDetail = inboundOrder.Details.FirstOrDefault(detail => |
| | | detail.Barcode == noStockOut.barCode && |
| | | detail.OrderDetailStatus != OrderDetailStatusEnum.Over.ObjToInt()); |
| | | |
| | | if (matchedDetail.ReceiptQuantity == 0 && matchedDetail.OverInQuantity == 0) |
| | | { |
| | | matchedDetail.OrderDetailStatus = OrderDetailStatusEnum.New.ObjToInt(); |
| | | } |
| | | if (matchedDetail == null) |
| | | { |
| | | return WebResponseContent.Instance.Error($"å¨éè´å {noStockOut.inOder} 䏿ªæ¾å°æ¡ç 为 {noStockOut.barCode} çæç»ã"); |
| | | } |
| | | |
| | | Dt_OutboundOrder outboundOrder = Db.Queryable<Dt_OutboundOrder>().Where(x => x.UpperOrderNo == noStockOut.outOder && x.OrderStatus != OutOrderStatusEnum.åºåºå®æ.ObjToInt()).Includes(x => x.Details).First(); |
| | | if (outboundOrder == null) |
| | | { |
| | | return WebResponseContent.Instance.Error($"æªæ¾å°åºåºåï¼{noStockOut.inOder}"); |
| | | } |
| | | // éç½®å
¥åºæç»çæ åºååºåºæ°é |
| | | decimal revokedTotalQty = matchedDetail.NoStockOutQty; // è®°å½éè¦æ¤éçæ»æ°éï¼å
¥åºåä¸å·²åé
çæ°éï¼ |
| | | matchedDetail.NoStockOutQty = 0; |
| | | if(inboundOrder.BusinessType == "11") |
| | | { |
| | | matchedDetail.WarehouseCode =""; |
| | | } |
| | | |
| | | // æ¤éåä¼ MESåæ° |
| | | // éç½®å
¥åºæç»ç¶æ |
| | | if (matchedDetail.ReceiptQuantity == 0 && matchedDetail.OverInQuantity == 0) |
| | | { |
| | | matchedDetail.OrderDetailStatus = OrderDetailStatusEnum.New.ObjToInt(); |
| | | } |
| | | |
| | | Dt_OutboundOrder outboundOrder = Db.Queryable<Dt_OutboundOrder>() |
| | | .Where(x => x.UpperOrderNo == noStockOut.outOder && x.OrderStatus != OutOrderStatusEnum.åºåºå®æ.ObjToInt()) |
| | | .Includes(x => x.Details) |
| | | .First(); |
| | | if (outboundOrder == null) |
| | | { |
| | | return WebResponseContent.Instance.Error($"æªæ¾å°åºåºåï¼{noStockOut.outOder}"); |
| | | } |
| | | |
| | | // æ¾å°ææå
³è该æ¡ç çåºåºæç»è¡ |
| | | // åç©æãéå®æç¶æãdocumentsNOå
å«è¯¥æ¡ç |
| | | var matchedCodeList = outboundOrder.Details.Where(detail => |
| | | detail.MaterielCode == matchedDetail.MaterielCode && // ç¡®ä¿ç©æå¹é
|
| | | detail.OrderDetailStatus != OrderDetailStatusEnum.Over.ObjToInt() && |
| | | !string.IsNullOrEmpty(detail.documentsNO) && |
| | | detail.documentsNO.Contains(noStockOut.barCode) // å
å«å½åæ¡ç |
| | | ).ToList(); |
| | | |
| | | if (!matchedCodeList.Any()) |
| | | { |
| | | return WebResponseContent.Instance.Error($"å¨åºåºå䏿ªæ¾å°å
³èæ¡ç {noStockOut.barCode}çç©æ{matchedDetail.MaterielCode}æç»ã"); |
| | | } |
| | | |
| | | //éè¡å¤çåºåºæç»çæ¤éé»è¾ |
| | | decimal remainingRevokeQty = revokedTotalQty; // å©ä½éè¦æ¤éçæ°é |
| | | foreach (var matchedCode in matchedCodeList) |
| | | { |
| | | if (remainingRevokeQty <= 0) break; // æææ°éå·²æ¤éï¼éåºå¾ªç¯ |
| | | |
| | | // å¤çMESåæ°æ¤é |
| | | List<Barcodes> barcodesList = new List<Barcodes>(); |
| | | Barcodes barcodes = new Barcodes |
| | | { |
| | | Barcode = matchedDetail.Barcode, |
| | | Qty = matchedDetail.OrderQuantity, |
| | | SupplyCode = matchedDetail?.SupplyCode ?? "", |
| | | BatchNo = matchedDetail?.BatchNo ?? "", |
| | | Unit = matchedDetail?.Unit ?? "" |
| | | }; |
| | | var matchedCode = outboundOrder.Details.FirstOrDefault(detail => |
| | | detail.documentsNO.Contains(barcodes.Barcode) && |
| | | detail.OrderDetailStatus != OrderDetailStatusEnum.Over.ObjToInt() |
| | | ); |
| | | |
| | | if (matchedCode == null) |
| | | { |
| | | return WebResponseContent.Instance.Error($"å¨åºåºåçç©æç¼ç 䏿ªæ¾å°ä¸éè´åä¸ç{matchedDetail.MaterielCode} 对åºçç©æã"); |
| | | } |
| | | |
| | | if (!string.IsNullOrEmpty(matchedCode.documentsNO)) |
| | | { |
| | | barcodesList = JsonConvert.DeserializeObject<List<Barcodes>>(matchedCode.documentsNO) ?? new List<Barcodes>(); |
| | | try |
| | | { |
| | | barcodesList = JsonConvert.DeserializeObject<List<Barcodes>>(matchedCode.documentsNO) ?? new List<Barcodes>(); |
| | | } |
| | | catch (JsonException ex) |
| | | { |
| | | return WebResponseContent.Instance.Error($"åºåºåæç»{matchedCode.Id}çdocumentsNOåæ®µæ ¼å¼é误ï¼{ex.Message}"); |
| | | } |
| | | } |
| | | barcodesList.RemoveAll(b => |
| | | string.Equals(b.Barcode, barcodes.Barcode, StringComparison.OrdinalIgnoreCase) |
| | | ); |
| | | |
| | | // çéåºå½åæ¡ç çææè®°å½ |
| | | var barcodeRecords = barcodesList.Where(b => |
| | | string.Equals(b.Barcode, noStockOut.barCode, StringComparison.OrdinalIgnoreCase)).ToList(); |
| | | if (!barcodeRecords.Any()) continue; |
| | | |
| | | // 计ç®è¯¥è¡éè¦æ¤éçæ°éï¼ç´¯å 该æ¡ç å¨è¯¥è¡çææåé
æ°éï¼ |
| | | decimal rowRevokeQty = barcodeRecords.Sum(b => b.Qty); |
| | | // å®é
æ¤éæ°éï¼å该è¡å¯æ¤éæ°éåå©ä½éè¦æ¤éæ°éçè¾å°å¼ |
| | | decimal actualRevokeQty = Math.Min(rowRevokeQty, remainingRevokeQty); |
| | | |
| | | // ç§»é¤è¯¥è¡ä¸è¯¥æ¡ç çè®°å½ï¼æé¨åè®°å½ï¼è¥å©ä½æ¤éæ°éä¸è¶³ï¼ |
| | | if (actualRevokeQty < rowRevokeQty) |
| | | { |
| | | // å©ä½æ¤éæ°éä¸è¶³ï¼åªç§»é¤é¨åè®°å½ï¼ææ°éæ£åï¼ |
| | | decimal tempQty = actualRevokeQty; |
| | | var removeList = new List<Barcodes>(); |
| | | foreach (var record in barcodeRecords) |
| | | { |
| | | if (tempQty <= 0) break; |
| | | if (record.Qty <= tempQty) |
| | | { |
| | | removeList.Add(record); |
| | | tempQty -= record.Qty; |
| | | } |
| | | else |
| | | { |
| | | // è®°å½æ°éæåï¼æ£åé¨åæ°é |
| | | record.Qty -= tempQty; |
| | | tempQty = 0; |
| | | } |
| | | } |
| | | barcodesList.RemoveAll(b => removeList.Contains(b)); |
| | | } |
| | | else |
| | | { |
| | | // ç§»é¤è¯¥è¡ä¸è¯¥æ¡ç çææè®°å½ |
| | | barcodesList.RemoveAll(b => |
| | | string.Equals(b.Barcode, noStockOut.barCode, StringComparison.OrdinalIgnoreCase)); |
| | | } |
| | | |
| | | //éæ°åºååMESåæ° |
| | | JsonSerializerSettings settings = new JsonSerializerSettings |
| | | { |
| | | ContractResolver = new CamelCasePropertyNamesContractResolver() |
| | | }; |
| | | matchedCode.documentsNO = JsonConvert.SerializeObject(barcodesList, settings); |
| | | |
| | | matchedCode.NoStockOutQty -= matchedDetail.OrderQuantity; |
| | | //æ£ååºåºæç»çæ åºååºåºæ°é |
| | | matchedCode.NoStockOutQty = Math.Max(0, matchedCode.NoStockOutQty - actualRevokeQty); |
| | | remainingRevokeQty -= actualRevokeQty; |
| | | |
| | | //éç½®åºåºæç»ç¶æ |
| | | if (matchedCode.LockQuantity == 0 && matchedCode.OverOutQuantity == 0) |
| | | { |
| | | matchedCode.OrderDetailStatus = OrderDetailStatusEnum.New.ObjToInt(); |
| | | } |
| | | _unitOfWorkManage.BeginTran(); |
| | | _inboundOrderDetailService.UpdateData(matchedDetail); |
| | | _outboundOrderDetailService.UpdateData(matchedCode); |
| | | _unitOfWorkManage.CommitTran(); |
| | | return WebResponseContent.Instance.OK(); |
| | | |
| | | } |
| | | catch (Exception ex) |
| | | |
| | | //è¥ä»ææªæ¤éçæ°éï¼è¯´ææ°æ®ä¸ä¸è´ |
| | | if (remainingRevokeQty > 0) |
| | | { |
| | | _unitOfWorkManage.RollbackTran(); |
| | | return WebResponseContent.Instance.Error(ex.Message); |
| | | return WebResponseContent.Instance.Error($"æ¤éæ¡ç {noStockOut.barCode}æ¶ï¼åºåºåä¸å¯æ¤éæ°éä¸è¶³ï¼ä»æ{remainingRevokeQty}æ°éæªæ¤é"); |
| | | } |
| | | } |
| | | |
| | | public async Task<WebResponseContent> NoStockOutSubmit(NoStockOutSubmit noStockOutSubmit) |
| | | _unitOfWorkManage.BeginTran(); |
| | | _inboundOrderDetailService.UpdateData(matchedDetail); |
| | | _outboundOrderDetailService.UpdateData(matchedCodeList); |
| | | _unitOfWorkManage.CommitTran(); |
| | | |
| | | return WebResponseContent.Instance.OK("æ¡ç æ¤éæå", data: new { RevokedQty = revokedTotalQty }); |
| | | } |
| | | catch (Exception ex) |
| | | { |
| | | _unitOfWorkManage.RollbackTran(); |
| | | return WebResponseContent.Instance.Error(ex.Message); |
| | | } |
| | | } |
| | | |
| | | public async Task<WebResponseContent> NoStockOutSubmit(NoStockOutSubmit noStockOutSubmit) |
| | | { |
| | | try |
| | | { |
| | |
| | | { |
| | | item.LockQuantity += item.NoStockOutQty; |
| | | item.OverOutQuantity += item.NoStockOutQty; |
| | | item.CurrentDeliveryQty = item.NoStockOutQty; |
| | | item.CurrentDeliveryQty += item.NoStockOutQty; |
| | | //æ·»å åä¼ MESåæ° |
| | | List<Barcodes> barcodesList = new List<Barcodes>(); |
| | | List<Barcodes> documentsNOList = new List<Barcodes>(); |
| | | if (!string.IsNullOrEmpty(item.ReturnJsonData)) |
| | | { |
| | | barcodesList = JsonConvert.DeserializeObject<List<Barcodes>>(item.documentsNO) ?? new List<Barcodes>(); |
| | | barcodesList = JsonConvert.DeserializeObject<List<Barcodes>>(item.ReturnJsonData) ?? new List<Barcodes>(); |
| | | } |
| | | if (!string.IsNullOrEmpty(item.documentsNO) && item.documentsNO!="") |
| | | { |
| | |
| | | if (CheckOutboundOrderCompleted(outboundOrder.OrderNo)) |
| | | { |
| | | outboundOrder.OrderStatus = OutOrderStatusEnum.åºåºå®æ.ObjToInt(); |
| | | _outboundOrderService.UpdateData(outboundOrder); |
| | | |
| | | } |
| | | else |
| | | { |
| | | outboundOrder.OrderStatus = OutOrderStatusEnum.åºåºä¸.ObjToInt(); |
| | | } |
| | | _outboundOrderService.UpdateData(outboundOrder); |
| | | _unitOfWorkManage.CommitTran(); |
| | | //åºåºåä¼ MES |
| | | _feedbackMesService.OutboundFeedback(outboundOrder.OrderNo); |