From f692f869d5fe2e2aee9d3487dbba83e1821b7f6c Mon Sep 17 00:00:00 2001
From: pan <antony1029@163.com>
Date: 星期四, 04 十二月 2025 18:02:19 +0800
Subject: [PATCH] 提交
---
项目代码/WMS无仓储版/WIDESEA_WMSServer/WIDESEA_BasicService/InvokeMESService.cs | 448 ++++++++++++++++++++++++++++++-------------------------
1 files changed, 244 insertions(+), 204 deletions(-)
diff --git "a/\351\241\271\347\233\256\344\273\243\347\240\201/WMS\346\227\240\344\273\223\345\202\250\347\211\210/WIDESEA_WMSServer/WIDESEA_BasicService/InvokeMESService.cs" "b/\351\241\271\347\233\256\344\273\243\347\240\201/WMS\346\227\240\344\273\223\345\202\250\347\211\210/WIDESEA_WMSServer/WIDESEA_BasicService/InvokeMESService.cs"
index 15db4f7..7d8276f 100644
--- "a/\351\241\271\347\233\256\344\273\243\347\240\201/WMS\346\227\240\344\273\223\345\202\250\347\211\210/WIDESEA_WMSServer/WIDESEA_BasicService/InvokeMESService.cs"
+++ "b/\351\241\271\347\233\256\344\273\243\347\240\201/WMS\346\227\240\344\273\223\345\202\250\347\211\210/WIDESEA_WMSServer/WIDESEA_BasicService/InvokeMESService.cs"
@@ -430,218 +430,46 @@
return WebResponseContent.Instance.Error("娌℃湁闇�瑕佸洖浼犵殑鍒嗘嫞璁板綍");
- var documentNo = UniqueValueGenerator.Generate();
-
-
- var feedModel = new FeedbackOutboundRequestModel
+ var groups = pickingRecords.GroupBy(x => x.FeedBackMesDocumentNo).ToList();
+ foreach (var group in groups)
{
- reqCode = Guid.NewGuid().ToString(),
- reqTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"),
- business_type = outboundOrder.BusinessType,
- factoryArea = outboundOrder.FactoryArea,
- operationType = 1,
- Operator = outboundOrder.Operator != "" ? outboundOrder.Operator : App.User.UserName,
- orderNo = outboundOrder.UpperOrderNo,
- documentsNO = documentNo,
- status = outboundOrder.OrderStatus,
- details = new List<FeedbackOutboundDetailsModel>()
- };
- var detailIds = new List<int>();
- // 濉厖鏄庣粏鍜屾潯鐮佷俊鎭�
- foreach (var detail in orderDetails)
- {
- // 鏌ヨ璇ユ槑缁嗗搴旂殑閿佸畾鏉$爜璁板綍
- var detailPicks = pickingRecords.Where(x => x.OrderNo == orderNo
- && detail.Id == x.OrderDetailId).ToList();
- if (!detailPicks.Any())
+
+ List<Dt_PickingRecord> records = group.ToList(); // 璇ュ垎缁勪笅鐨勬墍鏈夎褰�
+ if (string.IsNullOrEmpty(group.Key))
{
- continue;
- }
- var detailModel = new FeedbackOutboundDetailsModel
- {
- materialCode = detail.MaterielCode,
- lineNo = detail.lineNo,
- warehouseCode = detail.WarehouseCode,
- qty = detail.BarcodeQty,
- currentDeliveryQty = 0,
- unit = detail.BarcodeUnit,
- barcodes = new List<WIDESEA_DTO.Outbound.BarcodesModel>()
- };
-
- // 濉厖鏉$爜淇℃伅锛堝惈鍗曚綅杞崲锛�
- foreach (var item in detailPicks)
- {
- if (item.PickQuantity <= 0)
+ var emptydocumentNo = UniqueValueGenerator.Generate();
+ records.ForEach(x => { x.FeedBackMesDocumentNo = emptydocumentNo; });
+ var result= await _pickingRecoreRepository.Db.Insertable(records).ExecuteCommandAsync();
+ if (result > 0)
{
- continue;
- }
- var barModel = new WIDESEA_DTO.Outbound.BarcodesModel
- {
- barcode = item.Barcode,
- supplyCode = item.SupplyCode,
- batchNo = item.BatchNo,
- unit = item.BarcodeUnit,
- qty = item.PickQuantity
- };
-
- // 鍗曚綅涓嶄竴鑷存椂杞崲
- if (detail.BarcodeUnit != detail.Unit)
- {
- var convertResult = await _materialUnitService.ConvertAsync(
- item.MaterielCode, item.PickQuantity, detail.Unit, detail.BarcodeUnit);
- barModel.unit = convertResult.Unit;
- barModel.qty = convertResult.Quantity;
- }
- else
- {
- barModel.qty = item.PickQuantity;
- }
- detailModel.currentDeliveryQty += barModel.qty;
- detailModel.barcodes.Add(barModel);
- }
- detailIds.Add(detail.Id);
- feedModel.details.Add(detailModel);
- }
-
- feedModel.details = feedModel.details.GroupBy(item => new { item.materialCode, item.lineNo, item.warehouseCode, item.unit, item.qty }).Select(group => new FeedbackOutboundDetailsModel
- {
- materialCode = group.Key.materialCode,
- lineNo = group.Key.lineNo,
- warehouseCode = group.Key.warehouseCode,
- qty = group.Key.qty,
- currentDeliveryQty = group.Sum(x => x.currentDeliveryQty),
- unit = group.Key.unit,
- barcodes = group.SelectMany(x => x.barcodes.GroupBy(o => new { o.barcode, o.supplyCode, o.batchNo, o.unit }).Select(row => new WIDESEA_DTO.Outbound.BarcodesModel
- {
- barcode = row.Key.barcode,
- supplyCode = row.Key.supplyCode,
- batchNo = row.Key.batchNo,
- unit = row.Key.unit,
- qty = row.Sum(y => y.qty)
- })).ToList()
- }).ToList();
-
- var allCompleted = true;
-
- // 绛涢�夊緟鍥炰紶鐨勬槑缁嗭紙ReturnToMESStatus=0锛�
- var pendingDetails = orderDetails.Where(x => x.ReturnToMESStatus == 0).ToList();
- foreach (var detail in pendingDetails)
- {
- if (detail.OverOutQuantity < detail.NeedOutQuantity)
- {
- allCompleted = false;
- }
- }
-
- // 瀛樺湪鍥炰紶澶辫触鐨勬槑缁嗭紙ReturnToMESStatus=2锛夛紝鏍囪鏈畬鎴�
- if (orderDetails.Any(x => x.ReturnToMESStatus == 2))
- {
- allCompleted = false;
- }
-
- // 鏇存柊璁㈠崟鐘舵��
- int newStatus = allCompleted ? (int)OutOrderStatusEnum.鍑哄簱瀹屾垚 : (int)OutOrderStatusEnum.鍑哄簱涓�;
- if (outboundOrder.OrderStatus != newStatus)
- {
-
- int updateCount = await _outboundOrderService.Db.Updateable<Dt_OutboundOrder>()
- .SetColumns(x => x.OrderStatus == newStatus)
- .Where(x => x.OrderNo == orderNo)
- .ExecuteCommandAsync();
-
- if (updateCount <= 0)
- {
- _logger.LogWarning($"鏇存柊鍑哄簱鍗曠姸鎬佸け璐� - OrderNo: {orderNo}, 鐩爣鐘舵��: {newStatus}");
-
- }
- }
-
-
- // 璋冪敤MES鍥炰紶鎺ュ彛
- var mesResult = await FeedbackOutbound(feedModel);
- if (mesResult == null || mesResult.code != 200)
- {
-
- // 鏇存柊鏄庣粏涓哄洖浼犲け璐ワ紙ReturnToMESStatus=2锛�
- await _outboundOrderDetailService.Db.Updateable<Dt_OutboundOrderDetail>()
- .SetColumns(it => new Dt_OutboundOrderDetail
- {
- ReturnToMESStatus = 2,
- documentsNO = documentNo,
- })
- .Where(x => detailIds.Contains(x.Id))
- .ExecuteCommandAsync();
-
- return WebResponseContent.Instance.Error($"鍥炰紶MES澶辫触");
- }
- foreach (var record in pickingRecords.Where(x => detailIds.Contains(x.OrderDetailId)).ToList())
- {
- record.ReturnToMESStatus = 1;
- }
- var updates = pickingRecords.Where(x => detailIds.Contains(x.OrderDetailId)).ToList();
- updates.ForEach(x =>
- {
- x.ReturnToMESStatus = 1;
- });
- await _pickingRecoreRepository.Db.Updateable(updates).ExecuteCommandAsync();
- if (allCompleted)
- {
- //MES鍥炰紶鎴愬姛锛氭洿鏂版槑缁嗕负鍥炰紶鎴愬姛鐘舵��
- await _outboundOrderDetailService.Db.Updateable<Dt_OutboundOrderDetail>()
- .SetColumns(it => new Dt_OutboundOrderDetail
- {
- ReturnToMESStatus = 1,
- documentsNO = documentNo,
- })
- .Where(x => detailIds.Contains(x.Id))
- .ExecuteCommandAsync();
- }
- // 鏍¢獙鏄惁鎵�鏈夋槑缁嗛兘瀹屾垚锛屾洿鏂拌鍗曟渶缁堢姸鎬�
- if (allCompleted && newStatus == (int)OutOrderStatusEnum.鍑哄簱瀹屾垚)
- {
- await _outboundOrderService.Db.Updateable<Dt_OutboundOrder>()
- .SetColumns(x => new Dt_OutboundOrder
- {
- ReturnToMESStatus = 1,
- OrderStatus = newStatus
- })
- .Where(x => x.OrderNo == orderNo)
- .ExecuteCommandAsync();
- }
- else
- {
- // 浜屾鏍¢獙鏄惁鎵�鏈夋湭鍥炰紶鏄庣粏閮藉凡瀹屾垚
- var dbOrderDetails = await _outboundOrderDetailService.Db.Queryable<Dt_OutboundOrderDetail>()
- .LeftJoin<Dt_OutboundOrder>((o, item) => o.OrderId == item.Id)
- .Where((o, item) => item.OrderNo == orderNo && item.ReturnToMESStatus != 1)
- .Select((o, item) => o)
- .ToListAsync();
-
- var secAllCompleted = true;
- foreach (var detail in dbOrderDetails.Where(x => x.ReturnToMESStatus == 0).ToList())
- {
- if (detail.OverOutQuantity < detail.NeedOutQuantity)
- {
- secAllCompleted = false;
- break;
- }
- }
-
- if (secAllCompleted)
- {
- await _outboundOrderService.Db.Updateable<Dt_OutboundOrder>()
- .SetColumns(it => new Dt_OutboundOrder
+ (bool _flowControl, WebResponseContent _value) = await FeedBackBatchToMes(outboundOrder, orderNo, orderDetails, pickingRecords, emptydocumentNo);
+ if (!_flowControl)
{
- ReturnToMESStatus = 1,
- OrderStatus = OutOrderStatusEnum.鍑哄簱瀹屾垚.ObjToInt(),
- })
- .Where(x => x.OrderNo == orderNo)
- .ExecuteCommandAsync();
+ return _value;
+ }
+ }
+ }
+ else
+ {
+ (bool _flowControl, WebResponseContent _value) = await FeedBackBatchToMes(outboundOrder, orderNo, orderDetails, pickingRecords, group.Key);
+ if (!_flowControl)
+ {
+ return _value;
+ }
}
}
+
+
+ //var documentNo = UniqueValueGenerator.Generate();
+
+ //(bool flowControl, WebResponseContent value) = await FeedBackBatchToMes(outboundOrder, orderNo, orderDetails, pickingRecords, documentNo);
+ //if (!flowControl)
+ //{
+ // return value;
+ //}
// 鍥炰紶鎴愬姛鐨勬渶缁堣繑鍥�
- response = WebResponseContent.Instance.OK($"鍥炰紶MES鎴愬姛锛屽崟鎹彿锛歿documentNo}");
+ response = WebResponseContent.Instance.OK($"鍥炰紶MES鎴愬姛锛屽崟鎹彿锛歿orderNo}");
}
catch (Exception ex)
{
@@ -656,6 +484,218 @@
return response;
}
+ private async Task<(bool flowControl, WebResponseContent value)> FeedBackBatchToMes(Dt_OutboundOrder outboundOrder, string orderNo, List<Dt_OutboundOrderDetail> orderDetails, List<Dt_PickingRecord> pickingRecords, string documentNo)
+ {
+ var feedModel = new FeedbackOutboundRequestModel
+ {
+ reqCode = Guid.NewGuid().ToString(),
+ reqTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"),
+ business_type = outboundOrder.BusinessType,
+ factoryArea = outboundOrder.FactoryArea,
+ operationType = 1,
+ Operator = outboundOrder.Operator != "" ? outboundOrder.Operator : App.User.UserName,
+ orderNo = outboundOrder.UpperOrderNo,
+ documentsNO = documentNo,
+ status = outboundOrder.OrderStatus,
+ details = new List<FeedbackOutboundDetailsModel>()
+ };
+ var detailIds = new List<int>();
+ // 濉厖鏄庣粏鍜屾潯鐮佷俊鎭�
+ foreach (var detail in orderDetails)
+ {
+ // 鏌ヨ璇ユ槑缁嗗搴旂殑閿佸畾鏉$爜璁板綍
+ var detailPicks = pickingRecords.Where(x => x.OrderNo == orderNo
+ && detail.Id == x.OrderDetailId).ToList();
+ if (!detailPicks.Any())
+ {
+ continue;
+ }
+ var detailModel = new FeedbackOutboundDetailsModel
+ {
+ materialCode = detail.MaterielCode,
+ lineNo = detail.lineNo,
+ warehouseCode = detail.WarehouseCode,
+ qty = detail.BarcodeQty,
+ currentDeliveryQty = 0,
+ unit = detail.BarcodeUnit,
+ barcodes = new List<WIDESEA_DTO.Outbound.BarcodesModel>()
+ };
+
+ // 濉厖鏉$爜淇℃伅锛堝惈鍗曚綅杞崲锛�
+ foreach (var item in detailPicks)
+ {
+ if (item.PickQuantity <= 0)
+ {
+ continue;
+ }
+ var barModel = new WIDESEA_DTO.Outbound.BarcodesModel
+ {
+ barcode = item.Barcode,
+ supplyCode = item.SupplyCode,
+ batchNo = item.BatchNo,
+ unit = item.BarcodeUnit,
+ qty = item.PickQuantity
+ };
+
+ // 鍗曚綅涓嶄竴鑷存椂杞崲
+ if (detail.BarcodeUnit != detail.Unit)
+ {
+ var convertResult = await _materialUnitService.ConvertAsync(
+ item.MaterielCode, item.PickQuantity, detail.Unit, detail.BarcodeUnit);
+ barModel.unit = convertResult.Unit;
+ barModel.qty = convertResult.Quantity;
+ }
+ else
+ {
+ barModel.qty = item.PickQuantity;
+ }
+ detailModel.currentDeliveryQty += barModel.qty;
+ detailModel.barcodes.Add(barModel);
+ }
+ detailIds.Add(detail.Id);
+ feedModel.details.Add(detailModel);
+ }
+
+ feedModel.details = feedModel.details.GroupBy(item => new { item.materialCode, item.lineNo, item.warehouseCode, item.unit, item.qty }).Select(group => new FeedbackOutboundDetailsModel
+ {
+ materialCode = group.Key.materialCode,
+ lineNo = group.Key.lineNo,
+ warehouseCode = group.Key.warehouseCode,
+ qty = group.Key.qty,
+ currentDeliveryQty = group.Sum(x => x.currentDeliveryQty),
+ unit = group.Key.unit,
+ barcodes = group.SelectMany(x => x.barcodes.GroupBy(o => new { o.barcode, o.supplyCode, o.batchNo, o.unit }).Select(row => new WIDESEA_DTO.Outbound.BarcodesModel
+ {
+ barcode = row.Key.barcode,
+ supplyCode = row.Key.supplyCode,
+ batchNo = row.Key.batchNo,
+ unit = row.Key.unit,
+ qty = row.Sum(y => y.qty)
+ })).ToList()
+ }).ToList();
+
+ var allCompleted = true;
+
+ // 绛涢�夊緟鍥炰紶鐨勬槑缁嗭紙ReturnToMESStatus=0锛�
+ var pendingDetails = orderDetails.Where(x => x.ReturnToMESStatus == 0).ToList();
+ foreach (var detail in pendingDetails)
+ {
+ if (detail.OverOutQuantity < detail.NeedOutQuantity)
+ {
+ allCompleted = false;
+ }
+ }
+
+ // 瀛樺湪鍥炰紶澶辫触鐨勬槑缁嗭紙ReturnToMESStatus=2锛夛紝鏍囪鏈畬鎴�
+ if (orderDetails.Any(x => x.ReturnToMESStatus == 2))
+ {
+ allCompleted = false;
+ }
+
+ // 鏇存柊璁㈠崟鐘舵��
+ int newStatus = allCompleted ? (int)OutOrderStatusEnum.鍑哄簱瀹屾垚 : (int)OutOrderStatusEnum.鍑哄簱涓�;
+ if (outboundOrder.OrderStatus != newStatus)
+ {
+
+ int updateCount = await _outboundOrderService.Db.Updateable<Dt_OutboundOrder>()
+ .SetColumns(x => x.OrderStatus == newStatus)
+ .Where(x => x.OrderNo == orderNo)
+ .ExecuteCommandAsync();
+
+ if (updateCount <= 0)
+ {
+ _logger.LogWarning($"鏇存柊鍑哄簱鍗曠姸鎬佸け璐� - OrderNo: {orderNo}, 鐩爣鐘舵��: {newStatus}");
+
+ }
+ }
+
+
+ // 璋冪敤MES鍥炰紶鎺ュ彛
+ var mesResult = await FeedbackOutbound(feedModel);
+ if (mesResult == null || mesResult.code != 200)
+ {
+
+ // 鏇存柊鏄庣粏涓哄洖浼犲け璐ワ紙ReturnToMESStatus=2锛�
+ await _outboundOrderDetailService.Db.Updateable<Dt_OutboundOrderDetail>()
+ .SetColumns(it => new Dt_OutboundOrderDetail
+ {
+ ReturnToMESStatus = 2,
+ documentsNO = documentNo,
+ })
+ .Where(x => detailIds.Contains(x.Id))
+ .ExecuteCommandAsync();
+
+ return (flowControl: false, value: WebResponseContent.Instance.Error($"鍥炰紶MES澶辫触"));
+ }
+ foreach (var record in pickingRecords.Where(x => detailIds.Contains(x.OrderDetailId)).ToList())
+ {
+ record.ReturnToMESStatus = 1;
+ }
+ var updates = pickingRecords.Where(x => detailIds.Contains(x.OrderDetailId)).ToList();
+ updates.ForEach(x =>
+ {
+ x.ReturnToMESStatus = 1;
+ });
+ await _pickingRecoreRepository.Db.Updateable(updates).ExecuteCommandAsync();
+ if (allCompleted)
+ {
+ //MES鍥炰紶鎴愬姛锛氭洿鏂版槑缁嗕负鍥炰紶鎴愬姛鐘舵��
+ await _outboundOrderDetailService.Db.Updateable<Dt_OutboundOrderDetail>()
+ .SetColumns(it => new Dt_OutboundOrderDetail
+ {
+ ReturnToMESStatus = 1,
+ documentsNO = documentNo,
+ })
+ .Where(x => detailIds.Contains(x.Id))
+ .ExecuteCommandAsync();
+ }
+ // 鏍¢獙鏄惁鎵�鏈夋槑缁嗛兘瀹屾垚锛屾洿鏂拌鍗曟渶缁堢姸鎬�
+ if (allCompleted && newStatus == (int)OutOrderStatusEnum.鍑哄簱瀹屾垚)
+ {
+ await _outboundOrderService.Db.Updateable<Dt_OutboundOrder>()
+ .SetColumns(x => new Dt_OutboundOrder
+ {
+ ReturnToMESStatus = 1,
+ OrderStatus = newStatus
+ })
+ .Where(x => x.OrderNo == orderNo)
+ .ExecuteCommandAsync();
+ }
+ else
+ {
+ // 浜屾鏍¢獙鏄惁鎵�鏈夋湭鍥炰紶鏄庣粏閮藉凡瀹屾垚
+ var dbOrderDetails = await _outboundOrderDetailService.Db.Queryable<Dt_OutboundOrderDetail>()
+ .LeftJoin<Dt_OutboundOrder>((o, item) => o.OrderId == item.Id)
+ .Where((o, item) => item.OrderNo == orderNo && item.ReturnToMESStatus != 1)
+ .Select((o, item) => o)
+ .ToListAsync();
+
+ var secAllCompleted = true;
+ foreach (var detail in dbOrderDetails.Where(x => x.ReturnToMESStatus == 0).ToList())
+ {
+ if (detail.OverOutQuantity < detail.NeedOutQuantity)
+ {
+ secAllCompleted = false;
+ break;
+ }
+ }
+
+ if (secAllCompleted)
+ {
+ await _outboundOrderService.Db.Updateable<Dt_OutboundOrder>()
+ .SetColumns(it => new Dt_OutboundOrder
+ {
+ ReturnToMESStatus = 1,
+ OrderStatus = OutOrderStatusEnum.鍑哄簱瀹屾垚.ObjToInt(),
+ })
+ .Where(x => x.OrderNo == orderNo)
+ .ExecuteCommandAsync();
+ }
+ }
+
+ return (flowControl: true, value: null);
+ }
+
private async Task<WebResponseContent> HandleOutboundOrderToMESCompletion(Dt_OutboundOrder outboundOrder, string orderNo)
{
// 鍓嶇疆鍙傛暟鏍¢獙锛氱┖鍊肩洿鎺ヨ繑鍥為敊璇�
--
Gitblit v1.9.3