From 9ae2a50827dadfde5c90eb304390987160c2f8d1 Mon Sep 17 00:00:00 2001
From: 647556386 <647556386@qq.com>
Date: 星期三, 17 十二月 2025 17:17:41 +0800
Subject: [PATCH] 条码打印优化

---
 项目代码/WMS无仓储版/WIDESEA_WMSServer/WIDESEA_OutboundService/OutboundService.cs |  137 +++++++++++++++++++++++++++++++++++++++------
 1 files changed, 118 insertions(+), 19 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_OutboundService/OutboundService.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_OutboundService/OutboundService.cs"
index 5f48f16..6c5a0ce 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_OutboundService/OutboundService.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_OutboundService/OutboundService.cs"
@@ -1,4 +1,5 @@
-锘縰sing Newtonsoft.Json;
+锘縰sing AutoMapper;
+using Newtonsoft.Json;
 using Newtonsoft.Json.Serialization;
 using SqlSugar;
 using WIDESEA_Common.LocationEnum;
@@ -21,7 +22,7 @@
 {
     public partial class OutboundService : IOutboundService
     {
-
+        private readonly IMapper _mapper;
         public IUnitOfWorkManage _unitOfWorkManage { get; }
 
         public IOutboundOrderDetailService OutboundOrderDetailService { get; }
@@ -42,9 +43,12 @@
         private readonly IRepository<Dt_LocationInfo> _locationInfoRepository;
         private readonly IRepository<Dt_StockQuantityChangeRecord> _stockChangeRepository;
         private readonly IRepository<Dt_StockInfoDetail_Hty> _stockDetailHistoryRepository;
+        private readonly IFeedbackMesService _feedbackMesService;
+        private readonly IRepository<Dt_Task> _taskRepository;
 
-        public OutboundService(IUnitOfWorkManage unitOfWorkManage, IRepository<Dt_OutboundOrderDetail> detailRepository, IRepository<Dt_OutboundOrder> outboundRepository, IRepository<Dt_OutStockLockInfo> outboundLockInfoRepository, IRepository<Dt_StockInfo> stockInfoRepository, IRepository<Dt_StockInfoDetail> stockDetailRepository, IRepository<Dt_StockQuantityChangeRecord> stockChangeRepository, IRepository<Dt_StockInfoDetail_Hty> stockDetailHistoryRepository, IBasicService basicService, IOutboundOrderDetailService outboundOrderDetailService, IOutboundOrderService outboundOrderService, IOutStockLockInfoService outboundStockLockInfoService)
+        public OutboundService(IMapper mapper, IUnitOfWorkManage unitOfWorkManage, IRepository<Dt_OutboundOrderDetail> detailRepository, IRepository<Dt_OutboundOrder> outboundRepository, IRepository<Dt_OutStockLockInfo> outboundLockInfoRepository, IRepository<Dt_StockInfo> stockInfoRepository, IRepository<Dt_StockInfoDetail> stockDetailRepository, IRepository<Dt_StockQuantityChangeRecord> stockChangeRepository, IRepository<Dt_StockInfoDetail_Hty> stockDetailHistoryRepository, IBasicService basicService, IOutboundOrderDetailService outboundOrderDetailService, IOutboundOrderService outboundOrderService, IOutStockLockInfoService outboundStockLockInfoService, IFeedbackMesService feedbackMesService, IRepository<Dt_Task> taskRepository)
         {
+            _mapper = mapper;
             _unitOfWorkManage = unitOfWorkManage;
             Db = _unitOfWorkManage.GetDbClient();
             OutboundOrderDetailService = outboundOrderDetailService;
@@ -59,8 +63,11 @@
             _stockChangeRepository = stockChangeRepository;
             _stockDetailHistoryRepository = stockDetailHistoryRepository;
             _basicService = basicService;
+            _feedbackMesService = feedbackMesService;
+            _taskRepository = taskRepository;
         }
 
+        #region 鍑哄簱鍒嗛厤
         /// <summary>
         /// 鍒嗘嫞鍑哄簱鎿嶄綔
         /// </summary>
@@ -133,14 +140,18 @@
 
                     pickedDetails.AddRange(materielPickedDetails.PickedDetails);
 
+                    decimal allallocatedQuantity = materielCalc.UnallocatedQuantity;
                     // 鏇存柊鍑哄簱鍗曟槑缁嗭紙澧炲姞閿佸畾鏁伴噺锛屼笉澧炲姞宸插嚭鏁伴噺锛�
                     foreach (var detail in materielCalc.Details)
                     {
+                        if (allallocatedQuantity <= 0) break;
+
                         decimal lockQuantity = (detail.OrderQuantity - detail.OverOutQuantity);
                         if (lockQuantity < materielCalc.UnallocatedQuantity)
                         {
                             detail.LockQuantity += lockQuantity; // 澧炲姞閿佸畾鏁伴噺 涓嶆洿鏂� OverOutQuantity 鍜� OrderDetailStatus锛屽洜涓鸿繕娌℃湁瀹為檯鍑哄簱
                             outboundOrderDetails.Add(detail);
+                            materielCalc.UnallocatedQuantity -= lockQuantity;
                         }
                         else
                         {
@@ -165,6 +176,9 @@
 
                 // 7. 鏇存柊搴撳瓨璇︽儏
                 UpdateOutStockLockInfo(outStockLockInfos);
+
+                // 8. 娣诲姞浠诲姟鏁版嵁
+                _taskRepository.AddData(tasks);
 
                 _unitOfWorkManage.CommitTran();
 
@@ -262,6 +276,18 @@
                         return result;
                     }
 
+                    decimal inputQuantity = request.OutboundQuantity.Value;
+                    List<Dt_OutboundOrderDetail> outboundOrderDetails = new List<Dt_OutboundOrderDetail>();
+                    foreach (var item in selectedDetails)
+                    {
+                        inputQuantity -= (item.OrderQuantity - item.MoveQty - item.LockQuantity);
+                        outboundOrderDetails.Add(item);
+                        if (inputQuantity <= 0)
+                        {
+                            break;
+                        }
+                    }
+
                     result.MaterielCalculations = new List<MaterielOutboundCalculationDTO>()
                     {
                         new MaterielOutboundCalculationDTO
@@ -276,9 +302,11 @@
                             AssignedQuantity = lockQuantity,
                             UnallocatedQuantity = request.OutboundQuantity.Value,
                             MovedQuantity = moveQuantity,
-                            Details = selectedDetails
+                            Details = outboundOrderDetails
                         }
                     };
+
+                    outboundOrder.Details = outboundOrderDetails;
                 }
 
                 result.CanOutbound = true;
@@ -783,8 +811,9 @@
                 return false;
             }
         }
+        #endregion
 
-
+        #region 鎷i��
         /// <summary>
         /// 鍑哄簱瀹屾垚澶勭悊锛堟壂鎻忔潯鐮佹墸鍑忓簱瀛橈級
         /// </summary>
@@ -879,16 +908,16 @@
                     return WebResponseContent.Instance.Error($"鏃犳硶鍑哄簱锛屾潯鐮侊細{request.Barcode}锛屽簱瀛橈細{stockDetail.StockQuantity}锛屽凡鍑哄簱锛歿totalAllocatedQuantity}锛屽垎閰嶉噺锛歿lockInfo.AssignQuantity}锛屾槑缁嗗墿浣欙細{detailRemainingQuantity}");
                 }
 
-                if (actualOutboundQuantity + lockInfo.SortedQuantity > lockInfo.AssignQuantity)
-                {
-                    response.Success = false;
-                    response.Message = $"鏃犳硶鍑哄簱锛屾潯鐮侊細{request.Barcode}锛屽簱瀛橈細{stockDetail.StockQuantity}锛屽嚭搴撻噺{actualOutboundQuantity + lockInfo.SortedQuantity}澶т簬鍒嗛厤閲弡lockInfo.AssignQuantity}";
-                    return WebResponseContent.Instance.Error($"鏃犳硶鍑哄簱锛屾潯鐮侊細{request.Barcode}锛屽簱瀛橈細{stockDetail.StockQuantity}锛屽嚭搴撻噺{actualOutboundQuantity + lockInfo.SortedQuantity}澶т簬鍒嗛厤閲弡lockInfo.AssignQuantity}");
-                }
+                //if (actualOutboundQuantity + lockInfo.SortedQuantity > lockInfo.AssignQuantity)
+                //{
+                //    response.Success = false;
+                //    response.Message = $"鏃犳硶鍑哄簱锛屾潯鐮侊細{request.Barcode}锛屽簱瀛橈細{stockDetail.StockQuantity}锛屽嚭搴撻噺{actualOutboundQuantity + lockInfo.SortedQuantity}澶т簬鍒嗛厤閲弡lockInfo.AssignQuantity}";
+                //    return WebResponseContent.Instance.Error($"鏃犳硶鍑哄簱锛屾潯鐮侊細{request.Barcode}锛屽簱瀛橈細{stockDetail.StockQuantity}锛屽嚭搴撻噺{actualOutboundQuantity + lockInfo.SortedQuantity}澶т簬鍒嗛厤閲弡lockInfo.AssignQuantity}");
+                //}
 
                 // 8. 鍒ゆ柇鏄惁闇�瑕佹媶鍖咃紙褰撳嚭搴撴暟閲忓皬浜庡簱瀛樻暟閲忔椂闇�瑕佹媶鍖咃級
                 bool isUnpacked = actualOutboundQuantity < stockDetail.StockQuantity;
-                string newBarcode = string.Empty;
+                List<MaterialCodeReturnDTO> returnDTOs = new List<MaterialCodeReturnDTO>();
 
                 // 9. 寮�鍚簨鍔�
                 _unitOfWorkManage.BeginTran();
@@ -899,7 +928,7 @@
                     // 鏍规嵁鏄惁鎷嗗寘鎵ц涓嶅悓鐨勬搷浣�
                     if (isUnpacked)
                     {
-                        newBarcode = PerformUnpackOperation(stockDetail, stockInfo, actualOutboundQuantity, request, beforeQuantity, lockInfo.TaskNum.GetValueOrDefault());
+                        returnDTOs = PerformUnpackOperation(stockDetail, stockInfo, actualOutboundQuantity, request, beforeQuantity, lockInfo.TaskNum.GetValueOrDefault());
                     }
                     else
                     {
@@ -924,6 +953,8 @@
                         //    item.OverOutQuantity = item.OrderQuantity - item.MoveQty;
                         //}
 
+                        decimal barcodeQuantity = allocatedQuantity;
+
                         if (item.LockQuantity - item.OverOutQuantity >= allocatedQuantity)
                         {
                             item.OverOutQuantity += allocatedQuantity;
@@ -932,6 +963,7 @@
                         }
                         else
                         {
+                            barcodeQuantity = item.LockQuantity - item.OverOutQuantity;
                             allocatedQuantity -= (item.LockQuantity - item.OverOutQuantity);
                             item.OverOutQuantity = item.LockQuantity;
                             item.CurrentDeliveryQty = item.LockQuantity;
@@ -943,7 +975,7 @@
                         Barcodes barcodes = new Barcodes
                         {
                             Barcode = request.Barcode,
-                            Qty = actualOutboundQuantity,
+                            Qty = barcodeQuantity,
                             SupplyCode = stockDetail?.SupplyCode ?? "",
                             BatchNo = stockDetail?.BatchNo ?? "",
                             Unit = stockDetail?.Unit ?? ""
@@ -993,19 +1025,20 @@
                         BeforeQuantity = beforeQuantity,
                         AfterQuantity = isUnpacked ? actualOutboundQuantity : 0,
                         ChangeQuantity = -actualOutboundQuantity,
-                        IsUnpacked = isUnpacked
+                        IsUnpacked = isUnpacked,
+                        MaterialCodes = returnDTOs
                     };
 
                     response.Success = true;
-                    response.Message = isUnpacked ? $"鎷嗗寘鍑哄簱瀹屾垚锛屽凡鐢熸垚鏂版潯鐮侊細{newBarcode}" : "鍑哄簱瀹屾垚";
+                    response.Message = "鍑哄簱瀹屾垚";
                     response.ScannedDetail = scannedDetail;
                     response.UpdatedDetails = updateDetails;
-                    response.NewBarcode = newBarcode;
 
                     // 妫�鏌ュ嚭搴撳崟鏄惁瀹屾垚
                     if (CheckOutboundOrderCompleted(request.OrderNo))
                     {
                         UpdateOutboundOrderStatus(request.OrderNo, OutOrderStatusEnum.鍑哄簱瀹屾垚.ObjToInt());
+
 
                         //todo: 鍥炰紶MES
                     }
@@ -1074,10 +1107,16 @@
         /// <param name="beforeQuantity"></param>
         /// <param name="taskNum"></param>
         /// <returns></returns>
-        private string PerformUnpackOperation(Dt_StockInfoDetail stockDetail, Dt_StockInfo stockInfo,
+        private List<MaterialCodeReturnDTO> PerformUnpackOperation(Dt_StockInfoDetail stockDetail, Dt_StockInfo stockInfo,
             decimal actualOutboundQuantity, OutboundCompleteRequestDTO request, decimal beforeQuantity, int taskNum)
         {
             string newBarcode = GenerateNewBarcode();
+
+            string remark = $"鎷嗗寘璁板綍锛屽師鏉$爜锛歿request.Barcode}锛屽師鏁伴噺锛歿stockDetail.StockQuantity}锛屽嚭搴撴潯鐮侊細{newBarcode}锛� 鍑哄簱鏁伴噺锛歿actualOutboundQuantity}锛屽洖搴撴潯鐮侊細{request.Barcode}锛屽洖搴撴暟閲忥細{stockDetail.StockQuantity - actualOutboundQuantity},鎿嶄綔鑰咃細{request.Operator}";
+
+            List<Dt_MaterialCodeInfo> materialCodeInfos = CreateMaterialCodeInfos(stockDetail, newBarcode, actualOutboundQuantity, remark);
+
+            List<MaterialCodeReturnDTO> returnDTOs = _mapper.Map<List<MaterialCodeReturnDTO>>(materialCodeInfos);
 
             // 淇濆瓨鍘熷搴撳瓨鏄庣粏鍒板巻鍙茶褰�
             Dt_StockInfoDetail_Hty originalHistoryRecord = new Dt_StockInfoDetail_Hty
@@ -1138,7 +1177,7 @@
             };
             _stockChangeRepository.AddData(unpackChangeRecord);
 
-            return newBarcode;
+            return returnDTOs;
         }
 
         /// <summary>
@@ -1214,6 +1253,64 @@
         }
 
         /// <summary>
+        /// 
+        /// </summary>
+        /// <param name="stockDetail"></param>
+        /// <param name="newBarcode"></param>
+        /// <param name="splitQuantity"></param>
+        /// <param name="afterQuantity"></param>
+        /// <param name="remark"></param>
+        /// <returns></returns>
+        private List<Dt_MaterialCodeInfo> CreateMaterialCodeInfos(Dt_StockInfoDetail stockDetail, string newBarcode, decimal splitQuantity, string remark)
+        {
+            List<Dt_MaterialCodeInfo> materialCodeInfos = new List<Dt_MaterialCodeInfo>();
+
+            Dt_MaterielInfo? materielInfo = _basicService.MaterielInfoService.Repository.QueryFirst(x => x.MaterielCode == stockDetail.MaterielCode);
+
+            Dt_MaterialCodeInfo outMaterialCodeInfo = new Dt_MaterialCodeInfo()
+            {
+                AfterQuantity = splitQuantity,
+                BatchNo = stockDetail.BatchNo,
+                FactoryArea = stockDetail.FactoryArea,
+                MaterialName = materielInfo?.MaterielName ?? stockDetail.MaterielName,
+                MaterialSpec = materielInfo?.MaterielSpec ?? "",
+                MaterialCode = stockDetail.MaterielCode,
+                NewBarcode = newBarcode,
+                OldBarcode = stockDetail.Barcode,
+                OriginalQuantity = stockDetail.StockQuantity,
+                PruchaseOrderNo = stockDetail.OrderNo,
+                SuplierCode = stockDetail.SupplyCode,
+                Unit = stockDetail.Unit,
+                Date = DateTime.Now.ToString("yyyy-MM-dd"),
+                Remark = remark
+            };
+            materialCodeInfos.Add(outMaterialCodeInfo);
+
+            Dt_MaterialCodeInfo returnMaterialCodeInfo = new Dt_MaterialCodeInfo()
+            {
+                AfterQuantity = stockDetail.StockQuantity - splitQuantity,
+                BatchNo = stockDetail.BatchNo,
+                FactoryArea = stockDetail.FactoryArea,
+                MaterialName = materielInfo?.MaterielName ?? stockDetail.MaterielName,
+                MaterialSpec = materielInfo?.MaterielSpec ?? "",
+                MaterialCode = stockDetail.MaterielCode,
+                NewBarcode = stockDetail.Barcode,
+                OldBarcode = stockDetail.Barcode,
+                OriginalQuantity = stockDetail.StockQuantity,
+                PruchaseOrderNo = stockDetail.OrderNo,
+                SuplierCode = stockDetail.SupplyCode,
+                Unit = stockDetail.Unit,
+                Date = DateTime.Now.ToString("yyyy-MM-dd"),
+                Remark = remark
+            };
+
+            materialCodeInfos.Add(returnMaterialCodeInfo);
+
+            _basicService.MaterielCodeInfoService.Repository.AddData(materialCodeInfos);
+            return materialCodeInfos;
+        }
+
+        /// <summary>
         /// 鏇存柊璇ユ墭鐩樿鐗╂枡鐨勬墍鏈夐攣瀹氳褰曠殑绱宸插嚭搴撴暟閲�
         /// </summary>
         /// <param name="stockId">搴撳瓨ID</param>
@@ -1255,5 +1352,7 @@
             // 妫�鏌ユ墍鏈夋槑缁嗙殑宸插嚭鏁伴噺鏄惁閮界瓑浜庡崟鎹暟閲�
             return details.All(x => x.OverOutQuantity >= x.OrderQuantity - x.MoveQty);
         }
+
+        #endregion
     }
 }

--
Gitblit v1.9.3