From 266e4bf654c55ce2f7e9271048e4625f1b8b49f6 Mon Sep 17 00:00:00 2001
From: heshaofeng <heshaofeng@hnkhzn.com>
Date: 星期一, 29 十二月 2025 14:36:08 +0800
Subject: [PATCH] Merge branch 'htq20251215' of http://115.159.85.185:8098/r/ZhongRui/ALDbanyunxiangmu into htq20251215

---
 项目代码/WMS无仓储版/WIDESEA_WMSServer/WIDESEA_BasicService/MESOperation/FeedbackMesService.cs |  380 ++++++++++++++++++++++++++++++++++++++++++++++++++---
 1 files changed, 355 insertions(+), 25 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/MESOperation/FeedbackMesService.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/MESOperation/FeedbackMesService.cs"
index c084617..bc18e9c 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/MESOperation/FeedbackMesService.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/MESOperation/FeedbackMesService.cs"
@@ -1,19 +1,24 @@
-锘縰sing System;
+锘縰sing Newtonsoft.Json;
+using Newtonsoft.Json.Serialization;
+using Org.BouncyCastle.Asn1.Ocsp;
+using SqlSugar;
+using System;
 using System.Collections.Generic;
 using System.Linq;
 using System.Text;
 using System.Threading.Tasks;
-using Newtonsoft.Json;
 using WIDESEA_Core;
 using WIDESEA_Core.BaseRepository;
 using WIDESEA_Core.BaseServices;
 using WIDESEA_Core.Helper;
 using WIDESEA_Core.HttpContextUser;
+using WIDESEA_Core.LogHelper;
 using WIDESEA_Core.Util;
 using WIDESEA_DTO.Base;
 using WIDESEA_DTO.ReturnMES;
 using WIDESEA_IBasicService;
 using WIDESEA_Model.Models;
+using static HslCommunication.Profinet.Knx.KnxCode;
 
 namespace WIDESEA_BasicService.MESOperation
 {
@@ -23,27 +28,262 @@
         private readonly HttpClientHelper _httpClientHelper;
         private readonly IRepository<Dt_OutboundOrder> _outboundOrderRepository;
         private readonly IBasicService _basicService;
+        private readonly IRepository<Dt_AllocateOrder> _allocateRepository;
+        private readonly IRepository<Dt_MaterialCodeInfo> _materialCodeInfoRepository;
 
-        public FeedbackMesService(IRepository<Dt_MesReturnRecord> BaseDal, IUnitOfWorkManage unitOfWorkManage, HttpClientHelper httpClientHelper, IRepository<Dt_OutboundOrder> outboundOrderRepository, IBasicService basicService) : base(BaseDal)
+        public FeedbackMesService(IRepository<Dt_MesReturnRecord> BaseDal, IUnitOfWorkManage unitOfWorkManage, HttpClientHelper httpClientHelper, IRepository<Dt_OutboundOrder> outboundOrderRepository, IBasicService basicService, IRepository<Dt_AllocateOrder> allocateRepository, IRepository<Dt_MaterialCodeInfo> materialCodeInfoRepository) : base(BaseDal)
         {
             _unitOfWorkManage = unitOfWorkManage;
             _httpClientHelper = httpClientHelper;
             _outboundOrderRepository = outboundOrderRepository;
             _basicService = basicService;
+            _allocateRepository = allocateRepository;
+            _materialCodeInfoRepository = materialCodeInfoRepository;
         }
 
-        public void MaterialOutboundFeedback(string orderNo)
+        public WebResponseContent OutboundFeedback(string orderNo)
         {
+            WebResponseContent webResponse = new WebResponseContent();
             try
             {
                 Dt_OutboundOrder outboundOrder = _outboundOrderRepository.Db.Queryable<Dt_OutboundOrder>().Where(x => x.OrderNo == orderNo).Includes(x => x.Details).First();
                 if (outboundOrder == null)
                 {
-                    // todo 璁板綍鏃ュ織锛氭湭鎵惧埌瀵瑰簲鐨勫嚭搴撳崟
-
-                    return;
+                    return webResponse = WebResponseContent.Instance.Error($"鏈壘鍒板搴旂殑鍑哄簱鍗曚俊鎭�");
                 }
 
+                List<Dt_MesReturnRecord> returnRecords = BaseDal.QueryData(x => x.OrderNo == orderNo && x.OrderId == outboundOrder.Id && x.ReturnStatus == 2);
+
+                foreach (var item in returnRecords)
+                {
+                    HttpResponseResult<MesResponseDTO> httpResponse = _httpClientHelper.Post<MesResponseDTO>(item.ApiUrl, item.RequestData);
+
+                    string rMsg = "鎴愬姛";
+                    bool success = httpResponse.IsSuccess && httpResponse.Data.Code == "200";
+                    if (!success)
+                    {
+                        if (!httpResponse.IsSuccess)
+                        {
+                            rMsg = $"MES鎺ュ彛杩斿洖閿欒锛孒TTP浠g爜锛歿httpResponse.StatusCode}锛屼俊鎭細{httpResponse.ErrorMessage}";
+                        }
+                        else if (httpResponse?.Data?.Code != "200")
+                        {
+                            rMsg = $"璋冪敤MES鎺ュ彛澶辫触锛屼唬鐮侊細{httpResponse?.Data?.Code}锛屼俊鎭細{httpResponse?.Data?.Message}";
+                        }
+                    }
+
+                    item.ReturnCount += 1;
+
+                    item.ReturnStatus = success ? 1 : 2;
+                    item.HttpStatusCode = httpResponse.StatusCode.ObjToInt();
+                    item.LastReturnTime = DateTime.Now;
+                    item.ResponseData = httpResponse.Content;
+                    item.SuccessTime = success ? DateTime.Now : null;
+                }
+
+                BaseDal.UpdateData(returnRecords);
+
+                HttpResponseResult<MesResponseDTO> httpResponseResult = new HttpResponseResult<MesResponseDTO>();
+                string reqCode = Guid.NewGuid().ToString();
+                string reqTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
+                string requestData = string.Empty;
+                List<string> lineNos = new List<string>();
+                if (outboundOrder.OrderType == 0)
+                {
+                    MaterialOutboundReturnDTO? returnDTO = BuildOutboundFeedbackData(outboundOrder);
+                    if (returnDTO == null)
+                    {
+                        return webResponse = WebResponseContent.Instance.Error($"鏋勫缓鍥炶皟瀵硅薄澶辫触");
+                    }
+
+                    if (returnDTO.Details.Count <= 0)
+                    {
+                        return webResponse = WebResponseContent.Instance.Error($"璇ュ崟鎹棤鏄庣粏鍙洖浼�");
+                    }
+
+                    string apiUrl = AppSettings.GetValue("MaterialOutboundFeedbackUrl");
+                    returnDTO.ReqCode = reqCode;
+                    returnDTO.ReqTime = reqTime;
+                    JsonSerializerSettings settings = new JsonSerializerSettings
+                    {
+                        ContractResolver = new CamelCasePropertyNamesContractResolver()
+                    };
+                    requestData = JsonConvert.SerializeObject(returnDTO, settings);
+                    lineNos = returnDTO.Details.Select(x => x.LineNo).ToList();
+                    httpResponseResult = _httpClientHelper.Post<MesResponseDTO>(apiUrl, requestData);
+                    httpResponseResult.ApiUrl = apiUrl;
+                }
+                else
+                {
+                    Dt_AllocateOrder allocateOrder = _allocateRepository.QueryFirst(x => x.OrderNo == outboundOrder.OrderNo);
+                    if (allocateOrder == null)
+                    {
+                        return webResponse = WebResponseContent.Instance.Error($"鏈壘鍒板搴旂殑璋冩嫧鍗�");
+                    }
+
+                    AllocationReturnDTO? returnDTO = BuildAllocationFeedbackData(outboundOrder, allocateOrder.FromWarehouse, allocateOrder.ToWarehouse);
+                    if (returnDTO == null)
+                    {
+                        return webResponse = WebResponseContent.Instance.Error($"鏋勫缓鍥炶皟瀵硅薄澶辫触");
+                    }
+
+                    if (returnDTO.Details.Count <= 0)
+                    {
+                        return webResponse = WebResponseContent.Instance.Error($"璇ュ崟鎹棤鏄庣粏鍙洖浼�");
+                    }
+
+                    string apiUrl = AppSettings.GetValue("AllocationFeedbackUrl"); ;
+                    returnDTO.ReqCode = reqCode;
+                    returnDTO.ReqTime = reqTime;
+                    JsonSerializerSettings settings = new JsonSerializerSettings
+                    {
+                        ContractResolver = new CamelCasePropertyNamesContractResolver()
+                    };
+                    requestData = JsonConvert.SerializeObject(returnDTO, settings);
+                    lineNos = returnDTO.Details.Select(x => x.LineNo).ToList();
+                    httpResponseResult = _httpClientHelper.Post<MesResponseDTO>(apiUrl, requestData);
+                    httpResponseResult.ApiUrl = apiUrl;
+
+                    Logger.Add(requestData, httpResponseResult.Serialize());
+                }
+
+                bool isSuccess = httpResponseResult.IsSuccess && httpResponseResult.Data.Code == "200";
+                string message = "鎴愬姛";
+                if (!isSuccess)
+                {
+                    if (!httpResponseResult.IsSuccess)
+                    {
+                        message = $"MES鎺ュ彛杩斿洖閿欒锛孒TTP浠g爜锛歿httpResponseResult.StatusCode}锛屼俊鎭細{httpResponseResult.ErrorMessage}";
+                    }
+                    else if (httpResponseResult?.Data?.Code != "200")
+                    {
+                        message = $"璋冪敤MES鎺ュ彛澶辫触锛屼唬鐮侊細{httpResponseResult?.Data?.Code}锛屼俊鎭細{httpResponseResult?.Data?.Message}";
+                    }
+                }
+
+                Dt_MesReturnRecord mesReturnRecord = new Dt_MesReturnRecord()
+                {
+                    ApiUrl = httpResponseResult.ApiUrl,
+                    InterfaceType = outboundOrder.OrderType == 0 ? 1 : 3,
+                    OrderId = outboundOrder.Id,
+                    OrderNo = outboundOrder.OrderNo,
+                    RequestCode = reqCode,
+                    RequestData = requestData,
+                    FailureReason = message,
+                    LastReturnTime = DateTime.Now,
+                    HttpStatusCode = httpResponseResult.StatusCode.ObjToInt(),
+                    ResponseData = httpResponseResult.Content,
+                    ReturnType = 0,
+                    ReturnCount = 1,
+                    ReturnStatus = isSuccess ? 1 : 2,
+                    SuccessTime = isSuccess ? DateTime.Now : null
+                };
+
+                _unitOfWorkManage.BeginTran();
+                _unitOfWorkManage.Db.Insertable(mesReturnRecord).ExecuteCommand();
+
+                List<Dt_OutboundOrderDetail> outboundOrderDetails = outboundOrder.Details.Where(x => lineNos.Contains(x.lineNo)).ToList();
+                outboundOrderDetails.ForEach(x =>
+                {
+                    if (x.OverOutQuantity == x.OrderQuantity - x.MoveQty)
+                    {
+                        x.ReturnToMESStatus = isSuccess ? 1 : 2;
+                    }
+                    else
+                    {
+                        x.ReturnToMESStatus = isSuccess ? 3 : 4;
+                    }
+                    x.CurrentDeliveryQty = 0;
+                    x.ReturnJsonData = "";
+                });
+
+                mesReturnRecord.ReturnType = outboundOrder.Details.Count == outboundOrderDetails.Count ? 1 : 2;
+
+                if (outboundOrder.Details.Count == outboundOrderDetails.Count && outboundOrderDetails.All(x => x.ReturnToMESStatus == 1 || x.ReturnToMESStatus == 2))
+                {
+                    outboundOrder.ReturnToMESStatus = isSuccess ? 1 : 2;
+                }
+                else
+                {
+                    outboundOrder.ReturnToMESStatus = isSuccess ? 3 : 4;
+                }
+
+                _outboundOrderRepository.Db.Updateable(outboundOrderDetails).ExecuteCommand();
+                _outboundOrderRepository.UpdateData(outboundOrder);
+
+                _unitOfWorkManage.CommitTran();
+                int successCount = returnRecords.Where(x => x.ReturnStatus == 1).Count() + (isSuccess ? 1 : 0);
+                int failCount = returnRecords.Where(x => x.ReturnStatus == 2).Count() + (isSuccess ? 1 : 0);
+
+                webResponse.Status = true;
+                webResponse.Message = $"鍥炶皟鎴愬姛鏉℃暟锛歿successCount}锛屽洖璋冨け璐ユ潯鏁帮細{failCount}";
+
+                return webResponse;
+            }
+            catch (Exception ex)
+            {
+                return webResponse = WebResponseContent.Instance.Error(ex.Message);
+            }
+            finally
+            {
+                Logger.Add(orderNo, webResponse.Serialize());
+            }
+        }
+
+        public AllocationReturnDTO? BuildAllocationFeedbackData(Dt_OutboundOrder outboundOrder, string fromWarehouse, string toWarehouse)
+        {
+            try
+            {
+                List<Dt_OutboundOrderDetail> details = outboundOrder.Details;
+
+                List<AllocationDetail> returnDetails = new List<AllocationDetail>();
+
+                foreach (var detail in details)
+                {
+                    List<Barcodes>? barcodes = JsonConvert.DeserializeObject<List<Barcodes>>(detail.ReturnJsonData);
+                    if (barcodes != null && barcodes.Any())
+                    {
+                        UnitConvertResultDTO currentResult = _basicService.UnitQuantityConvert(detail.MaterielCode, detail.Unit, detail.BarcodeUnit, detail.CurrentDeliveryQty);
+                        UnitConvertResultDTO totalResult = _basicService.UnitQuantityConvert(detail.MaterielCode, detail.Unit, detail.BarcodeUnit, detail.OrderQuantity);
+
+                        returnDetails.Add(new AllocationDetail
+                        {
+                            Barcodes = barcodes,
+                            BatchNo = detail.BatchNo,
+                            LineNo = detail.lineNo,
+                            MaterialCode = detail.MaterielCode,
+                            Qty = totalResult.ToQuantity,
+                            WarehouseCode = detail.WarehouseCode,
+                            Unit = detail.BarcodeUnit
+                        });
+                    }
+                }
+
+                AllocationReturnDTO outboundReturnDTO = new AllocationReturnDTO()
+                {
+                    Business_type = outboundOrder.BusinessType,
+                    Details = returnDetails,
+                    FactoryArea = outboundOrder.FactoryArea,
+                    OperationType = 1,
+                    OrderNo = outboundOrder.UpperOrderNo,
+                    FromWarehouse = fromWarehouse,
+                    ToWarehouse = toWarehouse,
+                    Operator = App.User.UserName
+                };
+
+                return outboundReturnDTO;
+
+            }
+            catch (Exception ex)
+            {
+                return null;
+            }
+        }
+
+        public void MaterialOutboundFeedback(Dt_OutboundOrder outboundOrder)
+        {
+            try
+            {
                 MaterialOutboundReturnDTO? returnDTO = BuildOutboundFeedbackData(outboundOrder);
                 if (returnDTO != null)
                 {
@@ -71,7 +311,6 @@
                         InterfaceType = 1,
                         OrderId = outboundOrder.Id,
                         OrderNo = outboundOrder.OrderNo,
-                        OrderType = outboundOrder.OrderType,
                         RequestCode = returnDTO.ReqCode,
                         RequestData = returnDTO.Serialize(),
                         FailureReason = message,
@@ -112,7 +351,6 @@
             {
                 throw new Exception(ex.Message);
             }
-
         }
 
         public MaterialOutboundReturnDTO? BuildOutboundFeedbackData(Dt_OutboundOrder outboundOrder)
@@ -125,22 +363,25 @@
 
                 foreach (var detail in details)
                 {
-                    List<Barcodes>? barcodes = JsonConvert.DeserializeObject<List<Barcodes>>(detail.ReturnJsonData);
-                    if (barcodes != null && barcodes.Any())
+                    if (!string.IsNullOrWhiteSpace(detail.ReturnJsonData))
                     {
-                        UnitConvertResultDTO currentResult = _basicService.UnitQuantityConvert(detail.MaterielCode, detail.Unit, detail.BarcodeUnit, detail.CurrentDeliveryQty);
-                        UnitConvertResultDTO totalResult = _basicService.UnitQuantityConvert(detail.MaterielCode, detail.Unit, detail.BarcodeUnit, detail.OrderQuantity);
-
-                        returnDetails.Add(new MaterialOutboundDetail
+                        List<Barcodes>? barcodes = JsonConvert.DeserializeObject<List<Barcodes>>(detail.ReturnJsonData);
+                        if (barcodes != null && barcodes.Any())
                         {
-                            Barcodes = barcodes,
-                            CurrentDeliveryQty = currentResult.ToQuantity,
-                            LineNo = detail.lineNo,
-                            MaterialCode = detail.MaterielCode,
-                            Qty = totalResult.ToQuantity,
-                            WarehouseCode = detail.WarehouseCode,
-                            Unit = detail.BarcodeUnit
-                        });
+                            UnitConvertResultDTO currentResult = _basicService.UnitQuantityConvert(detail.MaterielCode, detail.Unit, detail.BarcodeUnit, detail.CurrentDeliveryQty);
+                            UnitConvertResultDTO totalResult = _basicService.UnitQuantityConvert(detail.MaterielCode, detail.Unit, detail.BarcodeUnit, detail.OrderQuantity);
+
+                            returnDetails.Add(new MaterialOutboundDetail
+                            {
+                                Barcodes = barcodes,
+                                CurrentDeliveryQty = currentResult.ToQuantity,
+                                LineNo = detail.lineNo,
+                                MaterialCode = detail.MaterielCode,
+                                Qty = totalResult.ToQuantity,
+                                WarehouseCode = detail.WarehouseCode,
+                                Unit = detail.BarcodeUnit
+                            });
+                        }
                     }
                 }
 
@@ -148,11 +389,11 @@
                 {
                     Business_type = outboundOrder.BusinessType,
                     Details = returnDetails,
-                    DocumentsNO = "",
+                    DocumentsNO = _basicService.CreateCodeByRule("OutboundOrderRule"),
                     FactoryArea = outboundOrder.FactoryArea,
                     OperationType = 1,
                     Operator = App.User.UserName,
-                    OrderNo = outboundOrder.OrderNo,
+                    OrderNo = outboundOrder.UpperOrderNo,
                     Status = 1
                 };
 
@@ -164,5 +405,94 @@
                 return null;
             }
         }
+
+        public WebResponseContent BarcodeFeedback(string newBarcode)
+        {
+            try
+            {
+                Dt_MaterialCodeInfo materialCodeInfo = _materialCodeInfoRepository.QueryFirst(x => x.NewBarcode == newBarcode, new Dictionary<string, OrderByType> { { nameof(Dt_MaterialCodeInfo.Id), OrderByType.Desc } });
+                if (materialCodeInfo == null)
+                {
+                    return WebResponseContent.Instance.Error($"鏈壘鍒扮墿鏂欐潯鐮佷俊鎭瘂newBarcode}");
+                }
+
+                string apiUrl = AppSettings.GetValue("BarcodeFeedbackUrl");
+
+                BarcodeReturnDTO returnDTO = new BarcodeReturnDTO()
+                {
+                    BatchNo = materialCodeInfo.BatchNo,
+                    FactoryArea = materialCodeInfo.FactoryArea,
+                    OperationType = 1,
+                    MaterialCode = materialCodeInfo.MaterialCode,
+                    NewmaterialCode = materialCodeInfo.NewBarcode,
+                    OldmaterialCode = materialCodeInfo.OldBarcode,
+                    Operator = materialCodeInfo.Creater,
+                    Qty = materialCodeInfo.AfterQuantity,
+                    SupplyCode = materialCodeInfo.SuplierCode,
+                    Unit = materialCodeInfo.Unit,
+                    WarehouseCode = materialCodeInfo.WarehouseCode,
+                    OldQty = materialCodeInfo.OriginalQuantity
+                };
+
+                string reqCode = Guid.NewGuid().ToString();
+                string reqTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
+                JsonSerializerSettings settings = new JsonSerializerSettings
+                {
+                    ContractResolver = new CamelCasePropertyNamesContractResolver()
+                };
+
+                string requestData = JsonConvert.SerializeObject(returnDTO, settings);
+                HttpResponseResult<MesResponseDTO> httpResponseResult = _httpClientHelper.Post<MesResponseDTO>(apiUrl, requestData);
+                httpResponseResult.ApiUrl = apiUrl;
+
+                bool isSuccess = httpResponseResult.IsSuccess && httpResponseResult.Data.Code == "200";
+                string message = "鎴愬姛";
+                if (!isSuccess)
+                {
+                    if (!httpResponseResult.IsSuccess)
+                    {
+                        message = $"MES鎺ュ彛杩斿洖閿欒锛孒TTP浠g爜锛歿httpResponseResult.StatusCode}锛屼俊鎭細{httpResponseResult.ErrorMessage}";
+                    }
+                    else if (httpResponseResult.Data.Code != "200")
+                    {
+                        message = $"璋冪敤MES鎺ュ彛澶辫触锛屼唬鐮侊細{httpResponseResult.Data.Code}锛屼俊鎭細{httpResponseResult.Data.Message}";
+                    }
+                }
+
+                Dt_MesReturnRecord mesReturnRecord = new Dt_MesReturnRecord()
+                {
+                    ApiUrl = httpResponseResult.ApiUrl,
+                    InterfaceType = 1,
+                    OrderId = materialCodeInfo.OrderId ?? 0,
+                    OrderNo = materialCodeInfo.OrderNo ?? "",
+                    RequestCode = reqCode,
+                    RequestData = requestData,
+                    FailureReason = message,
+                    LastReturnTime = DateTime.Now,
+                    HttpStatusCode = httpResponseResult.StatusCode.ObjToInt(),
+                    ResponseData = httpResponseResult.Content,
+                    ReturnType = 0,
+                    ReturnCount = 1,
+                    ReturnStatus = httpResponseResult.IsSuccess ? 1 : 2,
+                    SuccessTime = httpResponseResult.IsSuccess ? DateTime.Now : null
+                };
+
+                _unitOfWorkManage.BeginTran();
+                _unitOfWorkManage.Db.Insertable(mesReturnRecord).ExecuteCommand();
+                materialCodeInfo.ReturnStatus = httpResponseResult.IsSuccess ? 1 : 2;
+                _materialCodeInfoRepository.UpdateData(materialCodeInfo);
+
+                _unitOfWorkManage.CommitTran();
+
+                WebResponseContent responseContent = new WebResponseContent();
+                responseContent.Status = isSuccess;
+                responseContent.Message = message;
+                return responseContent;
+            }
+            catch (Exception ex)
+            {
+                return WebResponseContent.Instance.Error(ex.Message);
+            }
+        }
     }
 }

--
Gitblit v1.9.3