From 09d10666671871d20f651f308dff77612236acba Mon Sep 17 00:00:00 2001
From: 647556386 <647556386@qq.com>
Date: 星期三, 03 十二月 2025 15:26:46 +0800
Subject: [PATCH] Merge branch 'master' of http://115.159.85.185:8098/r/ZhongRui/ALDbanyunxiangmu
---
项目代码/WMS无仓储版/WIDESEA_WMSServer/WIDESEA_BasicService/InvokeMESService.cs | 255 +++++++++++++++++++++++++++++++-------------------
1 files changed, 156 insertions(+), 99 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 37d7b72..3848d23 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"
@@ -1,4 +1,5 @@
锘縰sing Dm.filter;
+using MailKit.Search;
using Microsoft.Extensions.Logging;
using Newtonsoft.Json;
using Org.BouncyCastle.Asn1.Ocsp;
@@ -8,6 +9,7 @@
using System.Linq;
using System.Net;
using System.Net.Http;
+using System.Reflection.Metadata;
using System.Security.Policy;
using System.Text;
using System.Threading.Tasks;
@@ -25,7 +27,7 @@
using WIDESEA_Model.Models;
namespace WIDESEA_BasicService
-{
+{
public class InvokeMESService : IInvokeMESService
{
private readonly IHttpClientFactory _httpClientFactory;
@@ -37,11 +39,12 @@
private readonly IRepository<Dt_StockInfoDetail> _stockInfoDetailRepository;
private readonly IRepository<Dt_StockInfo> _stockInfoRepository;
private readonly IRepository<Dt_InboundOrder> _inboundOrderRepository;
+ private readonly IRepository<Dt_PickingRecord> _pickingRecoreRepository;
private readonly IMaterialUnitService _materialUnitService;
private readonly IOutboundOrderService _outboundOrderService;
private readonly IOutboundOrderDetailService _outboundOrderDetailService;
private readonly IOutStockLockInfoService _outStockLockInfoService;
- public InvokeMESService(IHttpClientFactory httpClientFactory, ILogger<InvokeMESService> logger, IRepository<Dt_FeedbackToMes> feedbacktomesRepository, IRepository<Dt_StockInfoDetail> stockInfoDetailRepository, IRepository<Dt_StockInfo> stockInfoRepository, IRepository<Dt_InboundOrder> inboundOrderRepository, IOutboundOrderService outboundOrderService, IOutboundOrderDetailService outboundOrderDetailService, IOutStockLockInfoService outStockLockInfoService, IMaterialUnitService materialUnitService)
+ public InvokeMESService(IHttpClientFactory httpClientFactory, ILogger<InvokeMESService> logger, IRepository<Dt_FeedbackToMes> feedbacktomesRepository, IRepository<Dt_StockInfoDetail> stockInfoDetailRepository, IRepository<Dt_StockInfo> stockInfoRepository, IRepository<Dt_InboundOrder> inboundOrderRepository, IOutboundOrderService outboundOrderService, IOutboundOrderDetailService outboundOrderDetailService, IOutStockLockInfoService outStockLockInfoService, IMaterialUnitService materialUnitService, IRepository<Dt_PickingRecord> pickingRecoreRepository)
{
_httpClientFactory = httpClientFactory;
_logger = logger;
@@ -53,6 +56,7 @@
_outboundOrderDetailService = outboundOrderDetailService;
_outStockLockInfoService = outStockLockInfoService;
_materialUnitService = materialUnitService;
+ _pickingRecoreRepository = pickingRecoreRepository;
}
/// <summary>
@@ -101,7 +105,7 @@
_client.DefaultRequestHeaders.Clear();
_client.DefaultRequestHeaders.Add("Accept", "application/json");
- _logger.LogInformation("InvokeMESService FeedbackOutbound : " + json);
+ _logger.LogInformation("InvokeMESService FeedbackOutbound : "+ model.orderNo +" , " + json);
var response = await _client.PostAsync("AldMaterialOutbound/MaterialOutbound", content);
string body = await response.Content.ReadAsStringAsync();
@@ -111,7 +115,7 @@
throw new HttpRequestException(body);
}
-
+ _logger.LogInformation("InvokeMESService FeedbackOutbound body: " + body);
return JsonConvert.DeserializeObject<ResponseModel>(body);
}
@@ -220,6 +224,7 @@
}
}
+
/// <summary>
///
/// </summary>
@@ -275,7 +280,7 @@
MaterialCode = group.Key.MaterielCode,
LineNo = group.Key.InboundOrderRowNo,
WarehouseCode = group.Key.WarehouseCode,
- Qty = group.Sum(x => x.BarcodeQty),
+ Qty = group.Sum(x => x.BarcodeQty),
Unit = group.Key.BarcodeUnit,
Barcodes = group.Select(row => new BarcodeInfo
{
@@ -283,7 +288,7 @@
Qty = row.BarcodeQty,
BatchNo = row.BatchNo,
SupplyCode = row.SupplyCode,
- Unit = row.Unit
+ Unit = row.BarcodeUnit
}).ToList()
}).ToList();
allocatefeedmodel.Details = groupedData;
@@ -366,11 +371,12 @@
}
return WebResponseContent.Instance.OK();
}
+
private async Task<WebResponseContent> HandleOutboundOrderBatchToMESCompletion(Dt_OutboundOrder outboundOrder, string orderNo)
{
// 瀹氫箟榛樿杩斿洖锛堟垚鍔熸�侊級
WebResponseContent response = WebResponseContent.Instance.OK("鍥炰紶MES澶勭悊瀹屾垚");
-
+ //0 = 鏈洖浼狅紝1 = 宸插洖浼犳垚鍔燂紝2 = 鍥炰紶澶辫触
try
{
// 鏍¢獙锛氬凡鍥炰紶鐩存帴杩斿洖閿欒
@@ -391,19 +397,111 @@
return WebResponseContent.Instance.Error("鏆傛棤闇�瑕佸鐞嗙殑璁㈠崟鏄庣粏");
}
- // 绛涢�夊凡瀹屾垚鍑哄簱鐨勬槑缁咺D
+
+ var pickingRecords = await _pickingRecoreRepository.Db.Queryable<Dt_PickingRecord>().Where(x => x.OrderNo == orderNo && x.ReturnToMESStatus != 1 && !x.IsCancelled).ToListAsync();
+
+ if (!pickingRecords.Any())
+ return WebResponseContent.Instance.Error("娌℃湁闇�瑕佸洖浼犵殑鍒嗘嫞璁板綍");
+
+
+ var documentNo = UniqueValueGenerator.Generate();
+
+
+ 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)
- {
- detailIds.Add(detail.Id);
- }
- else
+ if (detail.OverOutQuantity < detail.NeedOutQuantity)
{
allCompleted = false;
}
@@ -419,7 +517,7 @@
int newStatus = allCompleted ? (int)OutOrderStatusEnum.鍑哄簱瀹屾垚 : (int)OutOrderStatusEnum.鍑哄簱涓�;
if (outboundOrder.OrderStatus != newStatus)
{
- // 淇鍘熸湁璇硶閿欒锛歋etColumns 鏄祴鍊硷紙=锛夎�岄潪鍒ゆ柇锛�==锛�
+
int updateCount = await _outboundOrderService.Db.Updateable<Dt_OutboundOrder>()
.SetColumns(x => x.OrderStatus == newStatus)
.Where(x => x.OrderNo == orderNo)
@@ -428,82 +526,16 @@
if (updateCount <= 0)
{
_logger.LogWarning($"鏇存柊鍑哄簱鍗曠姸鎬佸け璐� - OrderNo: {orderNo}, 鐩爣鐘舵��: {newStatus}");
- // 鐘舵�佹洿鏂板け璐ヤ笉涓柇娴佺▼锛屼絾璁板綍璀﹀憡
+
}
}
- // 鏋勫缓鍥炰紶MES鐨勬ā鍨�
- var documentNo = UniqueValueGenerator.Generate();
- 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,
- orderNo = outboundOrder.UpperOrderNo,
- documentsNO = documentNo,
- status = outboundOrder.OrderStatus,
- details = new List<FeedbackOutboundDetailsModel>()
- };
-
- // 濉厖鏄庣粏鍜屾潯鐮佷俊鎭�
- foreach (var detail in orderDetails.Where(x => detailIds.Contains(x.Id)).ToList())
- {
- // 鏌ヨ璇ユ槑缁嗗搴旂殑閿佸畾鏉$爜璁板綍
- var detailLocks = await _outStockLockInfoService.Db.Queryable<Dt_OutStockLockInfo>()
- .Where(x => x.OrderNo == orderNo
- && detail.Id == x.OrderDetailId
- && (x.Status == (int)OutLockStockStatusEnum.鎷i�夊畬鎴�
- || x.Status == (int)OutLockStockStatusEnum.宸插洖搴�))
- .ToListAsync();
-
- var detailModel = new FeedbackOutboundDetailsModel
- {
- materialCode = detail.MaterielCode,
- lineNo = detail.lineNo,
- warehouseCode = detail.WarehouseCode,
- qty = detail.BarcodeQty,
- currentDeliveryQty = detail.BarcodeQty,
- unit = detail.BarcodeUnit,
- barcodes = new List<WIDESEA_DTO.Outbound.BarcodesModel>()
- };
-
- // 濉厖鏉$爜淇℃伅锛堝惈鍗曚綅杞崲锛�
- foreach (var item in detailLocks)
- {
- var barModel = new WIDESEA_DTO.Outbound.BarcodesModel
- {
- barcode = item.CurrentBarcode,
- supplyCode = item.SupplyCode,
- batchNo = item.BatchNo,
- unit = item.BarcodeUnit,
- qty = item.BarcodeQty
- };
-
- // 鍗曚綅涓嶄竴鑷存椂杞崲
- if (item.BarcodeUnit != item.Unit)
- {
- var convertResult = await _materialUnitService.ConvertAsync(
- item.MaterielCode, item.BarcodeQty, item.Unit, item.BarcodeUnit);
- barModel.unit = convertResult.Unit;
- barModel.qty = convertResult.Quantity;
- }
-
- detailModel.qty += barModel.qty;
- detailModel.currentDeliveryQty += barModel.qty;
- detailModel.barcodes.Add(barModel);
- }
-
- feedModel.details.Add(detailModel);
- }
// 璋冪敤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
@@ -516,17 +548,28 @@
return WebResponseContent.Instance.Error($"鍥炰紶MES澶辫触");
}
-
- //MES鍥炰紶鎴愬姛锛氭洿鏂版槑缁嗕负鍥炰紶鎴愬姛鐘舵��
- await _outboundOrderDetailService.Db.Updateable<Dt_OutboundOrderDetail>()
- .SetColumns(it => new Dt_OutboundOrderDetail
- {
- ReturnToMESStatus = 1,
- documentsNO = documentNo,
- })
- .Where(x => detailIds.Contains(x.Id))
- .ExecuteCommandAsync();
-
+ 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.鍑哄簱瀹屾垚)
{
@@ -674,8 +717,8 @@
materialCode = group.Key.MaterielCode,
lineNo = group.Key.lineNo,
warehouseCode = group.Key.WarehouseCode,
- qty = group.Sum(x => x.BarcodeQty),
- currentDeliveryQty = group.Sum(x => x.BarcodeQty),
+ qty = group.Sum(x => x.PickedQty),
+ currentDeliveryQty = group.Sum(x => x.PickedQty),
unit = group.Key.BarcodeUnit,
barcodes = group.Select(lockInfo => new WIDESEA_DTO.Outbound.BarcodesModel
{
@@ -683,7 +726,7 @@
supplyCode = lockInfo.SupplyCode,
batchNo = lockInfo.BatchNo,
unit = lockInfo.BarcodeUnit,
- qty = lockInfo.BarcodeQty
+ qty = lockInfo.PickedQty
}).ToList()
}).ToList();
@@ -710,6 +753,11 @@
.Where(x => x.OrderNo == orderNo)
.ExecuteCommandAsync();
+ await _pickingRecoreRepository.Db.Updateable<Dt_PickingRecord>()
+ .SetColumns(x => x.ReturnToMESStatus == 1)
+ .Where(x => x.OrderNo == orderNo)
+ .ExecuteCommandAsync();
+
return WebResponseContent.Instance.OK("鍥炰紶MES鎴愬姛");
}
else
@@ -729,7 +777,7 @@
return WebResponseContent.Instance.Error("澶勭悊鍥炰紶MES鏃跺彂鐢熷紓甯革紝璇疯仈绯荤鐞嗗憳");
}
}
- }
+ }
public static class UniqueValueGenerator
{
@@ -743,14 +791,23 @@
public static string Generate()
{
var now = DateTime.Now;
- string datePart = now.ToString("yyyyMMdd");
+ string datePart = now.ToString("MMdd");
long ticksPart = now.Ticks;
+ // 鎷兼帴锛氳鏁板櫒琛�0涓�3浣嶏紙閬垮厤浣嶆暟涓嶄竴鑷达級
+ return $"{datePart}{ticksPart}";
+ }
+
+ public static string GenerateCount()
+ {
+ var now = DateTime.Now;
+ string datePart = now.ToString("yyyyMMddHHmmss");
+
// 鍘熷瓙閫掑璁℃暟鍣紙鍙栨ā1000锛岀‘淇濊鏁板櫒浠�3浣嶏紝鎺у埗闀垮害锛�
long counterPart = Interlocked.Increment(ref _counter) % 1000;
// 鎷兼帴锛氳鏁板櫒琛�0涓�3浣嶏紙閬垮厤浣嶆暟涓嶄竴鑷达級
- return $"{datePart}{ticksPart}{counterPart:D3}";
+ return $"{datePart}{counterPart:D3}";
}
}
}
--
Gitblit v1.9.3