From 7e4e747ae508578c15fc93a40a9cb0de289706bd Mon Sep 17 00:00:00 2001
From: pan <antony1029@163.com>
Date: 星期三, 26 十一月 2025 00:45:07 +0800
Subject: [PATCH] 提交
---
项目代码/WMS无仓储版/WIDESEA_WMSServer/WIDESEA_BasicService/InvokeMESService.cs | 229 +++++++++++++++++++++++++++++++++++++++++++++++++++++---
1 files changed, 215 insertions(+), 14 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 d010d39..b17ee97 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"
@@ -10,12 +10,16 @@
using System.Security.Policy;
using System.Text;
using System.Threading.Tasks;
+using WIDESEA_Common.OrderEnum;
+using WIDESEA_Common.StockEnum;
using WIDESEA_Core;
using WIDESEA_Core.BaseRepository;
+using WIDESEA_DTO.Allocate;
using WIDESEA_DTO.Basic;
using WIDESEA_DTO.Inbound;
using WIDESEA_DTO.Outbound;
using WIDESEA_IBasicService;
+using WIDESEA_IOutboundService;
using WIDESEA_Model.Models;
namespace WIDESEA_BasicService
@@ -31,7 +35,11 @@
private readonly IRepository<Dt_StockInfoDetail> _stockInfoDetailRepository;
private readonly IRepository<Dt_StockInfo> _stockInfoRepository;
private readonly IRepository<Dt_InboundOrder> _inboundOrderRepository;
- public InvokeMESService(IHttpClientFactory httpClientFactory, ILogger<InvokeMESService> logger, IRepository<Dt_FeedbackToMes> feedbacktomesRepository, IRepository<Dt_StockInfoDetail> stockInfoDetailRepository, IRepository<Dt_StockInfo> stockInfoRepository, IRepository<Dt_InboundOrder> inboundOrderRepository)
+
+ 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)
{
_httpClientFactory = httpClientFactory;
_logger = logger;
@@ -39,12 +47,21 @@
_stockInfoDetailRepository = stockInfoDetailRepository;
_stockInfoRepository = stockInfoRepository;
_inboundOrderRepository = inboundOrderRepository;
+ _outboundOrderService = outboundOrderService;
+ _outboundOrderDetailService = outboundOrderDetailService;
+ _outStockLockInfoService = outStockLockInfoService;
}
+ /// <summary>
+ /// 鍏ュ簱鍙嶉
+ /// </summary>
+ /// <param name="model"></param>
+ /// <returns></returns>
+ /// <exception cref="HttpRequestException"></exception>
public async Task<ResponseModel> FeedbackInbound(FeedbackInboundRequestModel model)
{
- string json =JsonConvert.SerializeObject(model, new JsonSerializerSettings
- {
+ string json = JsonConvert.SerializeObject(model, new JsonSerializerSettings
+ {
ContractResolver = new Newtonsoft.Json.Serialization.CamelCasePropertyNamesContractResolver()
});
var content = new StringContent(json, Encoding.UTF8, "application/json");
@@ -64,7 +81,13 @@
return JsonConvert.DeserializeObject<ResponseModel>(body);
}
- public async Task FeedbackOutbound(FeedbackOutboundRequestModel model)
+ /// <summary>
+ /// 鍑哄簱鍙嶉
+ /// </summary>
+ /// <param name="model"></param>
+ /// <returns></returns>
+ /// <exception cref="HttpRequestException"></exception>
+ public async Task<ResponseModel> FeedbackOutbound(FeedbackOutboundRequestModel model)
{
string json = JsonConvert.SerializeObject(model, new JsonSerializerSettings
{
@@ -75,6 +98,8 @@
_client.DefaultRequestHeaders.Clear();
_client.DefaultRequestHeaders.Add("Accept", "application/json");
+ _logger.LogInformation("InvokeMESService FeedbackOutbound : " + json);
+
var response = await _client.PostAsync("AldMaterialOutbound/MaterialOutbound", content);
string body = await response.Content.ReadAsStringAsync();
@@ -84,7 +109,31 @@
throw new HttpRequestException(body);
}
- // JsonConvert.DeserializeObject<ResponseModel>(body);
+
+ return JsonConvert.DeserializeObject<ResponseModel>(body);
+ }
+
+ public async Task<ResponseModel> FeedbackAllocate(AllocateDto model)
+ {
+ string json = JsonConvert.SerializeObject(model, new JsonSerializerSettings
+ {
+ ContractResolver = new Newtonsoft.Json.Serialization.CamelCasePropertyNamesContractResolver()
+ });
+ var content = new StringContent(json, Encoding.UTF8, "application/json");
+ var _client = _httpClientFactory.CreateClient("MESUrl");
+ _client.DefaultRequestHeaders.Clear();
+ _client.DefaultRequestHeaders.Add("Accept", "application/json");
+ _logger.LogInformation("InvokeMESService FeedbackAllocate : " + json);
+ var response = await _client.PostAsync("AldAllocationOperation/AllocationOperation", content);
+ string body = await response.Content.ReadAsStringAsync();
+ _logger.LogInformation("InvokeMESService FeedbackAllocate body: " + body);
+ if (!response.IsSuccessStatusCode)
+ {
+
+ throw new HttpRequestException(body);
+ }
+
+ return JsonConvert.DeserializeObject<ResponseModel>(body);
}
public async Task<ResponseModel> NewMaterielToMes(MaterielToMesDTO model)
@@ -113,8 +162,11 @@
var content = new StringContent(json, Encoding.UTF8, "application/json");
- using var response = await client.PostAsync("", content);
+ _logger.LogInformation("InvokeMESService NewMaterielToMes : " + json);
+
+ using var response = await client.PostAsync("AldBarcodeInformation/BarcodeInformation", content);
var responseText = await response.Content.ReadAsStringAsync();
+ _logger.LogInformation("InvokeMESService NewMaterielToMes body: " + responseText);
if (!response.IsSuccessStatusCode)
{
throw new HttpRequestException(responseText);
@@ -182,7 +234,8 @@
.ToList();
var feeds = _feedbacktomesRepository.Db.Queryable<Dt_FeedbackToMes>().Where(x => x.OrderNo == orderNo && x.ReportStatus == 1).Select(o => o.PalletCode).ToList();
var unreports = stockinfos.Where(x => !feeds.Contains(x.PalletCode)).ToList();
- if (unreports!=null && !unreports.Any()) {
+ if (unreports != null && !unreports.Any())
+ {
return WebResponseContent.Instance.Error("娌℃湁闇�瑕佸洖浼犵殑鏁版嵁");
}
foreach (var item in unreports)
@@ -199,28 +252,29 @@
reqTime = DateTime.Now.ToString(),
business_type = inboundOrder.BusinessType,
factoryArea = inboundOrder.FactoryArea,
- operationType=1,
- Operator= stockinfos?.OrderByDescending(x=>x.CreateDate).FirstOrDefault()?.Creater??"",
+ operationType = 1,
+ Operator = inboundOrder.Operator,
orderNo = inboundOrder.UpperOrderNo,
status = inboundOrder.OrderStatus,
details = new List<FeedbackInboundDetailsModel>()
};
-
- var groupedData = lists.GroupBy(item => new { item.MaterielCode, item.SupplyCode, item.BatchNo, item.InboundOrderRowNo, item.Unit, item.WarehouseCode })
+
+ var groupedData = lists.GroupBy(item => new { item.MaterielCode, item.SupplyCode, item.BatchNo, item.InboundOrderRowNo, item.BarcodeUnit, item.WarehouseCode })
.Select(group => new FeedbackInboundDetailsModel
{
materialCode = group.Key.MaterielCode,
supplyCode = group.Key.SupplyCode,
batchNo = group.Key.BatchNo,
lineNo = group.Key.InboundOrderRowNo,
+ qty = group.Sum(x => x.BarcodeQty),
// warehouseCode = group.Key.WarehouseCode=="0"?"1072": group.Key.WarehouseCode,
- warehouseCode = "1072",
- unit = group.Key.Unit,
+ warehouseCode = group.Key.WarehouseCode,
+ unit = group.Key.BarcodeUnit,
barcodes = group.Select(row => new FeedbackBarcodesModel
{
barcode = row.Barcode,
- qty = row.StockQuantity
+ qty = row.BarcodeQty
}).ToList()
}).ToList();
feedmodel.details = groupedData;
@@ -241,7 +295,154 @@
}
}
+ else if (inout == 2)
+ {
+ foreach (var orderNo in orderNos)
+ {
+ var outboundOrder = await _outboundOrderService.Db.Queryable<Dt_OutboundOrder>().FirstAsync(x => x.OrderNo == orderNo);
+ if (outboundOrder != null && outboundOrder.IsBatch == 0)
+ {
+ await HandleOutboundOrderToMESCompletion(outboundOrder, orderNo);
+ }
+ else if (outboundOrder != null && outboundOrder.IsBatch ==1)
+ {
+
+ }
+
+
+ }
+
+ }
return WebResponseContent.Instance.OK();
}
+
+ private async Task HandleOutboundOrderToMESCompletion(Dt_OutboundOrder outboundOrder, string orderNo)
+ {
+
+ try
+ {
+ if (outboundOrder.ReturnToMESStatus == 1 || outboundOrder.IsBatch == 1)
+ {
+ return;
+ }
+ var orderDetails = await _outboundOrderDetailService.Db.Queryable<Dt_OutboundOrderDetail>()
+ .LeftJoin<Dt_OutboundOrder>((o, item) => o.OrderId == item.Id)
+ .Where((o, item) => item.OrderNo == orderNo)
+ .Select((o, item) => o)
+ .ToListAsync();
+
+ bool allCompleted = true;
+ foreach (var detail in orderDetails)
+ {
+ if (detail.OverOutQuantity < detail.NeedOutQuantity)
+ {
+ allCompleted = false;
+ break;
+ }
+ }
+
+ int newStatus = allCompleted ? (int)OutOrderStatusEnum.鍑哄簱瀹屾垚 : (int)OutOrderStatusEnum.鍑哄簱涓�;
+
+ if (outboundOrder.OrderStatus != newStatus)
+ {
+ await _outboundOrderService.Db.Updateable<Dt_OutboundOrder>()
+ .SetColumns(x => x.OrderStatus == newStatus)
+ .Where(x => x.OrderNo == orderNo)
+ .ExecuteCommandAsync();
+
+ }
+ //鍙湁姝e父鍒嗘嫞瀹屾垚鏃舵墠鍚慚ES鍙嶉
+ if (allCompleted && newStatus == (int)OutOrderStatusEnum.鍑哄簱瀹屾垚)
+ {
+ 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 = outboundOrder.OrderNo,
+ status = outboundOrder.OrderStatus,
+ details = new List<FeedbackOutboundDetailsModel>()
+ };
+
+
+ foreach (var detail in orderDetails)
+ {
+ // 鑾峰彇璇ユ槑缁嗗搴旂殑鏉$爜淇℃伅锛堜粠閿佸畾璁板綍锛�
+ var detailLocks = await _outStockLockInfoService.Db.Queryable<Dt_OutStockLockInfo>()
+ .Where(x => x.OrderNo == orderNo &&
+ x.OrderDetailId == detail.Id &&
+ x.Status == (int)OutLockStockStatusEnum.鎷i�夊畬鎴�)
+ .ToListAsync();
+
+ var detailModel = new FeedbackOutboundDetailsModel
+ {
+ materialCode = detail.MaterielCode,
+ lineNo = detail.lineNo, // 娉ㄦ剰锛氳繖閲屽彲鑳介渶瑕佽皟鏁村瓧娈靛悕
+ warehouseCode = detail.WarehouseCode,
+ qty = detail.OverOutQuantity, // 浣跨敤璁㈠崟鏄庣粏鐨勫凡鍑哄簱鏁伴噺
+ currentDeliveryQty = detail.OverOutQuantity,
+ unit = detail.Unit,
+ barcodes = detailLocks.Select(lockInfo => new WIDESEA_DTO.Outbound.BarcodesModel
+ {
+ barcode = lockInfo.CurrentBarcode,
+ supplyCode = lockInfo.SupplyCode,
+ batchNo = lockInfo.BatchNo,
+ unit = lockInfo.Unit,
+ qty = lockInfo.PickedQty // 鏉$爜绾у埆鐨勬暟閲忎粛鐢ㄩ攣瀹氳褰�
+ }).ToList()
+ };
+
+ feedmodel.details.Add(detailModel);
+ }
+
+ var result = await FeedbackOutbound(feedmodel);
+ if (result != null && result.code == 200)
+ {
+ await _outboundOrderDetailService.Db.Updateable<Dt_OutboundOrderDetail>()
+ .SetColumns(x => x.ReturnToMESStatus == 1)
+ .Where(x => x.OrderId == outboundOrder.Id)
+ .ExecuteCommandAsync();
+
+ await _outboundOrderService.Db.Updateable<Dt_OutboundOrder>()
+ .SetColumns(x => x.ReturnToMESStatus == 1)
+ .Where(x => x.OrderNo == orderNo)
+ .ExecuteCommandAsync();
+ }
+ }
+ }
+ catch (Exception ex)
+ {
+ _logger.LogError($"CheckAndUpdateOrderStatus澶辫触 - OrderNo: {orderNo}, Error: {ex.Message}");
+ }
+
+ }
+
+ }
+
+ public static class UniqueValueGenerator
+ {
+ // 鍘熷瓙璁℃暟鍣紙绾跨▼瀹夊叏锛屾瘡娆¢�掑1锛岄伩鍏嶅悓涓�Ticks閲嶅锛�
+ private static long _counter = 0;
+
+ /// <summary>
+ /// 鐢熸垚鍞竴鍊硷紙鏀寔楂樺苟鍙戯級
+ /// </summary>
+ /// <returns>鏍煎紡锛歽yyyMMdd + Ticks + 3浣嶈鏁板櫒锛堝2025112563867890123001锛�</returns>
+ public static string Generate()
+ {
+ var now = DateTime.Now;
+ string datePart = now.ToString("yyyyMMdd");
+ long ticksPart = now.Ticks;
+
+ // 鍘熷瓙閫掑璁℃暟鍣紙鍙栨ā1000锛岀‘淇濊鏁板櫒浠�3浣嶏紝鎺у埗闀垮害锛�
+ long counterPart = Interlocked.Increment(ref _counter) % 1000;
+
+ // 鎷兼帴锛氳鏁板櫒琛�0涓�3浣嶏紙閬垮厤浣嶆暟涓嶄竴鑷达級
+ return $"{datePart}{ticksPart}{counterPart:D3}";
+ }
}
}
--
Gitblit v1.9.3