From e31ca4e3e1774b7ddb832e8ec498b5ada24b2608 Mon Sep 17 00:00:00 2001
From: pan <antony1029@163.com>
Date: 星期日, 16 十一月 2025 19:13:58 +0800
Subject: [PATCH] 提交

---
 项目代码/WMS无仓储版/WIDESEA_WMSServer/WIDESEA_OutboundService/OutboundPickingService.cs |  201 ++++++++++++++++++++++++++++++++++----------------
 1 files changed, 136 insertions(+), 65 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/OutboundPickingService.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/OutboundPickingService.cs"
index fafc2a8..cf875b6 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/OutboundPickingService.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/OutboundPickingService.cs"
@@ -1,4 +1,6 @@
-锘縰sing Microsoft.AspNetCore.Http;
+锘縰sing Dm.filter;
+using MailKit.Search;
+using Microsoft.AspNetCore.Http;
 using SqlSugar;
 using System;
 using System.Collections.Generic;
@@ -36,9 +38,10 @@
         private readonly IOutboundOrderDetailService _outboundOrderDetailService;
         private readonly IOutboundOrderService _outboundOrderService;
         private readonly ISplitPackageService _splitPackageService;
+        private readonly IRepository<Dt_Task> _taskRepository;
 
 
-        public OutboundPickingService(IRepository<Dt_PickingRecord> BaseDal, IUnitOfWorkManage unitOfWorkManage, IStockInfoService stockInfoService, IStockService stockService, IOutStockLockInfoService outStockLockInfoService, IStockInfoDetailService stockInfoDetailService, ILocationInfoService locationInfoService, IOutboundOrderDetailService outboundOrderDetailService, ISplitPackageService splitPackageService, IOutboundOrderService outboundOrderService) : base(BaseDal)
+        public OutboundPickingService(IRepository<Dt_PickingRecord> BaseDal, IUnitOfWorkManage unitOfWorkManage, IStockInfoService stockInfoService, IStockService stockService, IOutStockLockInfoService outStockLockInfoService, IStockInfoDetailService stockInfoDetailService, ILocationInfoService locationInfoService, IOutboundOrderDetailService outboundOrderDetailService, ISplitPackageService splitPackageService, IOutboundOrderService outboundOrderService, IRepository<Dt_Task> taskRepository) : base(BaseDal)
         {
             _unitOfWorkManage = unitOfWorkManage;
             _stockInfoService = stockInfoService;
@@ -49,6 +52,7 @@
             _outboundOrderDetailService = outboundOrderDetailService;
             _splitPackageService = splitPackageService;
             _outboundOrderService = outboundOrderService;
+            _taskRepository = taskRepository;
         }
 
 
@@ -114,8 +118,7 @@
         }
 
         /// <summary>
-        /// 鎵爜鎷i�夌‘璁� - 绠�鍖栫増鏈�
-        /// 鍙鐞嗗疄闄呮嫞閫夌殑搴撳瓨鎵e噺
+        /// 鎵爜鎷i�夌‘璁� 
         /// </summary>
         public async Task<WebResponseContent> ConfirmPicking(PickingConfirmRequest request)
         {
@@ -221,19 +224,20 @@
                 if (stockDetail == null)
                     return WebResponseContent.Instance.Error("鏃犳晥鐨勬潯鐮佹垨鐗╂枡缂栫爜");
 
-                // 2. 妫�鏌ュ簱瀛樺彲鐢ㄦ暟閲�
-                var availableQty = stockDetail.StockQuantity - stockDetail.OutboundQuantity;
-                if (availableQty <= 0)
-                    return WebResponseContent.Instance.Error("搴撳瓨鏁伴噺涓嶈冻");
+                //// 2. 妫�鏌ュ簱瀛樺彲鐢ㄦ暟閲�
+                //var availableQty = stockDetail.StockQuantity - stockDetail.OutboundQuantity;
+                //if (availableQty <= 0)
+                //    return WebResponseContent.Instance.Error("搴撳瓨鏁伴噺涓嶈冻");
 
                 // 3. 鏌ユ壘鐩稿叧鐨勫嚭搴撹鎯呬俊鎭�
                 var outStockInfo = await _outStockLockInfoService.Db.Queryable<Dt_OutStockLockInfo>()
                     .Where(x => x.OrderNo == orderNo &&
                                x.PalletCode == palletCode &&
                                x.CurrentBarcode == barcode &&
-                               x.Status == 0 &&
-                               x.RemainQuantity > 0)
+                               x.Status == (int)OutLockStockStatusEnum.鍑哄簱涓� &&
+                               x.AssignQuantity - x.PickedQty > 0)
                     .FirstAsync();
+
 
                 if (outStockInfo == null)
                     return WebResponseContent.Instance.Error("鏈壘鍒板搴旂殑鎷i�変俊鎭垨宸叉嫞閫夊畬鎴�");
@@ -244,36 +248,45 @@
 
                 // 5. 鏇存柊鍑哄簱璇︽儏鐨勫凡鎷i�夋暟閲�
                 outStockInfo.PickedQty = outStockInfo.AssignQuantity;
-                outStockInfo.Status = 1;
+                outStockInfo.Status = (int)OutLockStockStatusEnum.宸叉嫞閫�;
                 await _outStockLockInfoService.Db.Updateable(outStockInfo).ExecuteCommandAsync();
 
-                // 6. 鏇存柊搴撳瓨鍑哄簱鏁伴噺
-                await _stockInfoDetailService.Db.Updateable<Dt_StockInfoDetail>()
-                    .SetColumns(x => x.OutboundQuantity == x.OutboundQuantity + outStockInfo.AssignQuantity)
-                    .Where(x => x.Id == stockDetail.Id)
-                    .ExecuteCommandAsync();
+                //// 6. 鏇存柊搴撳瓨鍑哄簱鏁伴噺
+                //await _stockInfoDetailService.Db.Updateable<Dt_StockInfoDetail>()
+                //    .SetColumns(x => x.OutboundQuantity == x.OutboundQuantity + outStockInfo.AssignQuantity)
+                //    .Where(x => x.Id == stockDetail.Id)
+                //    .ExecuteCommandAsync();
 
                 // 7. 鏇存柊鍑哄簱鍗曟槑缁�
                 var orderDetail = await _outboundOrderDetailService.Db.Queryable<Dt_OutboundOrderDetail>()
                     .Where(x => x.Id == outStockInfo.OrderDetailId)
                     .FirstAsync();
-
-                orderDetail.OverOutQuantity += outStockInfo.AssignQuantity;
-                await _outboundOrderDetailService.Db.Updateable(orderDetail).ExecuteCommandAsync();
-
+                if (orderDetail != null)
+                {
+                    orderDetail.OverOutQuantity += outStockInfo.AssignQuantity;
+                    orderDetail.LockQuantity -= outStockInfo.AssignQuantity;
+                    await _outboundOrderDetailService.Db.Updateable(orderDetail).ExecuteCommandAsync();
+                }
                 // 8. 妫�鏌ユ槸鍚﹀畬鎴愬嚭搴�
                 await CheckAndUpdateOrderStatus(orderNo);
 
+                //鏌ヨ浠诲姟琛� 
+                var task = _taskRepository.QueryData(x => x.OrderNo == orderNo && x.PalletCode == palletCode).FirstOrDefault();
                 // 9. 璁板綍鎷i�夊巻鍙�
                 var pickingHistory = new Dt_PickingRecord
                 {
-
+                    FactoryArea = outStockInfo.FactoryArea,
+                    TaskNo = task?.TaskNum ?? 0,
+                    LocationCode = task?.SourceAddress ?? "",
+                    StockId = stockDetail.Id,
                     OrderNo = orderNo,
+                    OrderDetailId = orderDetail?.Id ?? 0,
                     PalletCode = palletCode,
                     Barcode = barcode,
                     MaterielCode = outStockInfo.MaterielCode,
                     PickQuantity = outStockInfo.AssignQuantity,
                     PickTime = DateTime.Now,
+                    Operator = App.User.UserName,
                     OutStockLockId = outStockInfo.Id
                 };
                 await Db.Insertable(pickingHistory).ExecuteCommandAsync();
@@ -325,7 +338,7 @@
                         .Where(x => x.OrderNo == orderNo &&
                                    x.PalletCode == palletCode &&
                                    x.CurrentBarcode == barcode &&
-                                   x.Status == 1)
+                                   x.Status == 2)
                         .FirstAsync();
 
                 if (outStockInfo == null)
@@ -333,14 +346,14 @@
 
                 // 杩樺師鍑哄簱璇︽儏鐘舵��
                 outStockInfo.PickedQty = 0;
-                outStockInfo.Status = 0;
+                outStockInfo.Status = 1;
                 await _outStockLockInfoService.Db.Updateable(outStockInfo).ExecuteCommandAsync();
 
-                // 杩樺師搴撳瓨鍑哄簱鏁伴噺
-                await _stockInfoDetailService.Db.Updateable<Dt_StockInfoDetail>()
-                        .SetColumns(x => x.OutboundQuantity == x.OutboundQuantity - outStockInfo.AssignQuantity)
-                        .Where(x => x.Barcode == barcode)
-                        .ExecuteCommandAsync();
+                //// 杩樺師搴撳瓨鍑哄簱鏁伴噺
+                //await _stockInfoDetailService.Db.Updateable<Dt_StockInfoDetail>()
+                //        .SetColumns(x => x.OutboundQuantity == x.OutboundQuantity - outStockInfo.AssignQuantity)
+                //        .Where(x => x.Barcode == barcode)
+                //        .ExecuteCommandAsync();
 
                 // 杩樺師鍑哄簱鍗曟槑缁�
                 var orderDetail = await _outboundOrderDetailService.Db.Queryable<Dt_OutboundOrderDetail>()
@@ -384,10 +397,9 @@
             var list = await _outStockLockInfoService.Db.Queryable<Dt_OutStockLockInfo>()
                 .Where(x => x.OrderNo == orderNo &&
                            x.PalletCode == palletCode &&
-                           x.Status == 0 &&
-                       x.RemainQuantity > 0)
+                           x.Status == 1)
                 .ToListAsync();
-            return list;
+            return list.Where(x => x.RemainQuantity > 0).ToList();
         }
 
         // 鑾峰彇宸叉嫞閫夊垪琛�
@@ -396,26 +408,68 @@
             var list = await _outStockLockInfoService.Db.Queryable<Dt_OutStockLockInfo>()
                 .Where(x => x.OrderNo == orderNo &&
                            x.PalletCode == palletCode &&
-                           x.Status == 1)
+                           x.Status == 2)
                 .ToListAsync();
             return list;
         }
-        // 鑾峰彇鎷i�夋眹鎬�
-        public async Task<object> GetPickingSummary(string orderNo)
+
+        public async Task<object> GetPickingSummary(string orderNo, string palletCode)
         {
             var summary = await _outStockLockInfoService.Db.Queryable<Dt_OutStockLockInfo>()
-                .Where(x => x.OrderNo == orderNo && x.Status == 0)
+                .Where(x => x.OrderNo == orderNo &&
+                           x.PalletCode == palletCode && x.Status == 1)
                 .GroupBy(x => new { x.PalletCode, x.MaterielCode })
                 .Select(x => new
                 {
                     PalletCode = x.PalletCode,
                     MaterielCode = x.MaterielCode,
                     UnpickedCount = SqlFunc.AggregateCount(x.Id),
-                    UnpickedQuantity = SqlFunc.AggregateSum(x.RemainQuantity)
+                    UnpickedQuantity = SqlFunc.AggregateSum(x.AssignQuantity) - SqlFunc.AggregateSum(x.PickedQty)
                 })
-                .ToListAsync();
+                .FirstAsync();
 
-            return  summary;
+            return summary;
+        }
+
+        // 鑾峰彇鎷i�夋眹鎬�
+        public async Task<object> GetPickingSummary(ConfirmPickingDto dto)
+        {
+            var picked = await _outStockLockInfoService.Db.Queryable<Dt_OutStockLockInfo>()
+             .WhereIF(!string.IsNullOrEmpty(dto.OrderNo), x => x.OrderNo == dto.OrderNo)
+             .WhereIF(!string.IsNullOrEmpty(dto.PalletCode), x => x.PalletCode == dto.PalletCode)
+             .Where(x => x.Status == 2)
+             .GroupBy(x => new { x.PalletCode, x.MaterielCode })
+             .Select(x => new SummaryPickingDto
+             {
+                 PalletCode = x.PalletCode,
+                 MaterielCode = x.MaterielCode,
+                 pickedCount = SqlFunc.AggregateCount(x.Id)
+             }).FirstAsync();
+            if (picked == null)
+            {
+                picked = new SummaryPickingDto { pickedCount = 0 };
+            }
+
+            var summary = await _outStockLockInfoService.Db.Queryable<Dt_OutStockLockInfo>()
+                .WhereIF(!string.IsNullOrEmpty(dto.OrderNo), x => x.OrderNo == dto.OrderNo)
+                .WhereIF(!string.IsNullOrEmpty(dto.PalletCode), x => x.PalletCode == dto.PalletCode)
+                .Where(x => x.Status == 1)
+                .GroupBy(x => new { x.PalletCode, x.MaterielCode })
+                .Select(x => new SummaryPickingDto
+                {
+                    PalletCode = x.PalletCode,
+                    MaterielCode = x.MaterielCode,
+                    UnpickedCount = SqlFunc.AggregateCount(x.Id),
+                    UnpickedQuantity = SqlFunc.AggregateSum(x.AssignQuantity) - SqlFunc.AggregateSum(x.PickedQty),
+
+                }).FirstAsync();
+            if (summary == null)
+            {
+                summary = new SummaryPickingDto { pickedCount = 0 };
+            }
+            summary.pickedCount = picked.pickedCount;
+
+            return summary;
         }
         /// <summary>
         /// 鑾峰彇鎷i�夊巻鍙�
@@ -587,50 +641,59 @@
             {
                 _unitOfWorkManage.BeginTran();
 
-                // 1. 鑾峰彇鎵樼洏搴撳瓨淇℃伅
                 var stockInfo = await _stockInfoService.Db.Queryable<Dt_StockInfo>()
                     .Includes(x => x.Details)
-                    .Where(x => x.PalletCode == request.PalletCode)
-                    .FirstAsync();
+                    .Where(x => x.PalletCode == request.PalletCode).FirstAsync();
 
                 if (stockInfo == null)
                     return WebResponseContent.Instance.Error("鏈壘鍒版墭鐩樺簱瀛樹俊鎭�");
 
-                // 2. 鑾峰彇鐩稿叧鐨勫嚭搴撻攣瀹氫俊鎭�
+
                 var lockInfos = await _outStockLockInfoService.Db.Queryable<Dt_OutStockLockInfo>()
-                    .Where(x => x.PalletCode == request.PalletCode &&
-                               x.Status == (int)OutLockStockStatusEnum.鍑哄簱涓�)
+                    .Where(x => x.OrderNo == request.OrderNo && x.PalletCode == request.PalletCode)
                     .ToListAsync();
 
-                // 3. 鏁翠釜鎵樼洏鍑哄簱 - 璁剧疆鍑哄簱鏁伴噺绛変簬搴撳瓨鏁伴噺
-                foreach (var detail in stockInfo.Details)
-                {
-                    decimal outboundQuantity = detail.StockQuantity - detail.OutboundQuantity;
-                    detail.OutboundQuantity = detail.StockQuantity; // 鍏ㄩ儴鍑哄簱
-                    await _stockInfoDetailService.Db.Updateable(detail).ExecuteCommandAsync();
-                }
 
-                // 4. 鏇存柊鍑哄簱閿佸畾淇℃伅
                 foreach (var lockInfo in lockInfos)
                 {
-                    decimal unpicked = lockInfo.AssignQuantity - lockInfo.PickedQty;
-                    lockInfo.PickedQty += unpicked; // 鏍囪涓哄叏閮ㄦ嫞閫�
+                    if (lockInfo.Status == (int)OutLockStockStatusEnum.鍑哄簱涓�)
+                    {
+                        lockInfo.PickedQty = lockInfo.AssignQuantity;
+                    }
                     lockInfo.Status = (int)OutLockStockStatusEnum.宸插嚭搴�;
                     await _outStockLockInfoService.Db.Updateable(lockInfo).ExecuteCommandAsync();
 
-                    // 鏇存柊鍑哄簱鍗曟槑缁�
                     var orderDetail = await _outboundOrderDetailService.Db.Queryable<Dt_OutboundOrderDetail>()
-                        .Where(x => x.Id == lockInfo.OrderDetailId)
-                        .FirstAsync();
-                    orderDetail.OverOutQuantity += unpicked;
-                    orderDetail.LockQuantity -= unpicked;
-                    orderDetail.OrderDetailStatus = (int)OrderDetailStatusEnum.Over;
-                    orderDetail.LockQuantity = 0;
-
-                    await _outboundOrderDetailService.Db.Updateable(orderDetail).ExecuteCommandAsync();
+                    .Where(x => x.Id == lockInfo.OrderDetailId)
+                    .FirstAsync();
+                    if (orderDetail != null)
+                    {
+                        orderDetail.OverOutQuantity += lockInfo.PickedQty;
+                        orderDetail.LockQuantity -= lockInfo.PickedQty;
+                        orderDetail.OrderDetailStatus = (int)OrderDetailStatusEnum.Over;
+                        orderDetail.LockQuantity = 0;
+                        await _outboundOrderDetailService.Db.Updateable(orderDetail).ExecuteCommandAsync();
+                    }
+                }
+                var groupDetails = lockInfos.GroupBy(x => x.OrderDetailId).Select(x => new
+                {
+                    OrderDetailId = x.Key,
+                    TotalQuantity = x.Sum(o => o.PickedQty)
+                }).ToList();
+                foreach (var item in groupDetails)
+                {
+                    var orderDetail = await _outboundOrderDetailService.Db.Queryable<Dt_OutboundOrderDetail>().Where(x => x.Id == item.OrderDetailId).FirstAsync();
+                    if (orderDetail != null)
+                    {
+                        orderDetail.OverOutQuantity = item.TotalQuantity;
+                        orderDetail.LockQuantity = 0;
+                        orderDetail.OrderDetailStatus = (int)OrderDetailStatusEnum.Over;                      
+                        await _outboundOrderDetailService.Db.Updateable(orderDetail).ExecuteCommandAsync();
+                    }
                 }
 
-                // 5. 鏇存柊鎷嗗寘璁板綍鐘舵��
+                await CheckAndUpdateOrderStatus(request.OrderNo);
+
                 var lockInfoIds = lockInfos.Select(x => x.Id).ToList();
                 var splitRecords = await _splitPackageService.Db.Queryable<Dt_SplitPackageRecord>()
                     .Where(x => lockInfoIds.Contains(x.OutStockLockInfoId) &&
@@ -643,7 +706,7 @@
                     await _splitPackageService.Db.Updateable(record).ExecuteCommandAsync();
                 }
 
-                // 6. 娓呯┖璐т綅
+
                 var location = await _locationInfoService.Db.Queryable<Dt_LocationInfo>()
                     .Where(x => x.LocationCode == stockInfo.LocationCode)
                     .FirstAsync();
@@ -653,6 +716,14 @@
                     await _locationInfoService.Db.Updateable(location).ExecuteCommandAsync();
                 }
 
+                foreach (var detail in stockInfo.Details)
+                {
+                    await _stockInfoDetailService.Db.Deleteable(detail).ExecuteCommandAsync();
+                }
+                await _stockInfoService.Db.Deleteable(stockInfo).ExecuteCommandAsync();
+
+
+
                 _unitOfWorkManage.CommitTran();
                 return WebResponseContent.Instance.OK("鐩存帴鍑哄簱鎴愬姛");
             }

--
Gitblit v1.9.3