From e25dc0d8fad5a2362bf75cf5ca9f26a0fe6c674c Mon Sep 17 00:00:00 2001
From: wanshenmean <cathay_xy@163.com>
Date: 星期四, 26 三月 2026 11:28:15 +0800
Subject: [PATCH] feat(WMS): 增强日志配置与添加事务处理支持

---
 Code/WMS/WIDESEA_WMSServer/WIDESEA_StockService/StockSerivce.cs |  195 +++++++++++++++++++++++++++++++-----------------
 1 files changed, 125 insertions(+), 70 deletions(-)

diff --git a/Code/WMS/WIDESEA_WMSServer/WIDESEA_StockService/StockSerivce.cs b/Code/WMS/WIDESEA_WMSServer/WIDESEA_StockService/StockSerivce.cs
index 1271ec3..5a531aa 100644
--- a/Code/WMS/WIDESEA_WMSServer/WIDESEA_StockService/StockSerivce.cs
+++ b/Code/WMS/WIDESEA_WMSServer/WIDESEA_StockService/StockSerivce.cs
@@ -1,4 +1,5 @@
-锘縰sing WIDESEA_Common.StockEnum;
+锘縰sing SqlSugar;
+using WIDESEA_Common.StockEnum;
 using WIDESEA_Core;
 using WIDESEA_DTO.Stock;
 using WIDESEA_IStockService;
@@ -51,6 +52,51 @@
         }
 
         /// <summary>
+        /// 鍦ㄤ簨鍔′腑鎵ц鎿嶄綔
+        /// </summary>
+        private async Task<WebResponseContent> ExecuteWithinTransactionAsync(Func<Task<WebResponseContent>> operation)
+        {
+            var db = StockInfoService.Repository.Db as SqlSugarClient;
+            if (db == null)
+            {
+                return WebResponseContent.Instance.Error("Database context does not support transactions");
+            }
+
+            var ownsTransaction = db.Ado.Transaction == null;
+            try
+            {
+                if (ownsTransaction)
+                {
+                    db.BeginTran();
+                }
+
+                var result = await operation();
+                if (result?.Status == true)
+                {
+                    if (ownsTransaction)
+                    {
+                        db.CommitTran();
+                    }
+                    return result;
+                }
+
+                if (ownsTransaction)
+                {
+                    db.RollbackTran();
+                }
+                return result ?? WebResponseContent.Instance.Error("Transaction failed");
+            }
+            catch
+            {
+                if (ownsTransaction)
+                {
+                    db.RollbackTran();
+                }
+                throw;
+            }
+        }
+
+        /// <summary>
         /// 缁勭洏
         /// </summary>
         public async Task<WebResponseContent> GroupPalletAsync(StockDTO stock)
@@ -72,28 +118,29 @@
                 Status = StockStatusEmun.缁勭洏鏆傚瓨.GetHashCode(),
             }).ToList();
 
-            var existingStock = StockInfoService.Repository.QueryFirst(s => s.PalletCode == stock.TargetPalletNo);
-            var result = false;
-            if (existingStock != null)
+            return await ExecuteWithinTransactionAsync(async () =>
             {
-                details.ForEach(d => d.StockId = existingStock.Id);
-                result = await StockInfoDetailService.Repository.AddDataAsync(details) > 0;
-                if (result) return content.OK("缁勭洏鎴愬姛");
-                return content.Error("缁勭洏澶辫触");
-            }
+                var existingStock = StockInfoService.Repository.QueryFirst(s => s.PalletCode == stock.TargetPalletNo);
+                var result = false;
+                if (existingStock != null)
+                {
+                    details.ForEach(d => d.StockId = existingStock.Id);
+                    result = await StockInfoDetailService.Repository.AddDataAsync(details) > 0;
+                    return result ? content.OK("缁勭洏鎴愬姛") : content.Error("缁勭洏澶辫触");
+                }
 
-            var entity = new Dt_StockInfo
-            {
-                PalletCode = stock.TargetPalletNo,
-                WarehouseId = 1,
-                StockStatus = 1,
-                Creater = "system",
-                Details = details
-            };
+                var entity = new Dt_StockInfo
+                {
+                    PalletCode = stock.TargetPalletNo,
+                    WarehouseId = 1,
+                    StockStatus = 1,
+                    Creater = "system",
+                    Details = details
+                };
 
-            result = StockInfoService.Repository.AddData(entity, x => x.Details);
-            if (result) return content.OK("缁勭洏鎴愬姛");
-            return content.Error("缁勭洏澶辫触");
+                result = StockInfoService.Repository.AddData(entity, x => x.Details);
+                return result ? content.OK("缁勭洏鎴愬姛") : content.Error("缁勭洏澶辫触");
+            });
         }
 
         /// <summary>
@@ -110,44 +157,47 @@
                 return content.Error("婧愭墭鐩樺彿涓庣洰鏍囨墭鐩樺彿鐩稿悓");
             }
 
-            var sourceStock = StockInfoService.Repository.QueryFirst(s => s.PalletCode == stock.SourcePalletNo);
-            if (sourceStock == null) return content.Error("婧愭墭鐩樹笉瀛樺湪");
-
-            var targetStock = StockInfoService.Repository.QueryFirst(s => s.PalletCode == stock.TargetPalletNo);
-            if (targetStock == null)
+            return await ExecuteWithinTransactionAsync(async () =>
             {
-                var newStock = new Dt_StockInfo
+                var sourceStock = await StockInfoService.Repository.QueryDataNavFirstAsync(s => s.PalletCode == stock.SourcePalletNo);
+                if (sourceStock == null) return content.Error("婧愭墭鐩樹笉瀛樺湪");
+
+                var targetStock = StockInfoService.Repository.QueryFirst(s => s.PalletCode == stock.TargetPalletNo);
+                if (targetStock == null)
                 {
-                    PalletCode = stock.TargetPalletNo,
-                    WarehouseId = sourceStock.WarehouseId,
-                    StockStatus = StockStatusEmun.缁勭洏鏆傚瓨.GetHashCode(),
-                    Creater = "system",
-                };
+                    var newStock = new Dt_StockInfo
+                    {
+                        PalletCode = stock.TargetPalletNo,
+                        WarehouseId = sourceStock.WarehouseId,
+                        StockStatus = StockStatusEmun.缁勭洏鏆傚瓨.GetHashCode(),
+                        Creater = "system",
+                    };
 
-                var newId = StockInfoService.Repository.AddData(newStock);
-                if (newId <= 0) return content.Error("鎹㈢洏澶辫触");
+                    var newId = StockInfoService.Repository.AddData(newStock);
+                    if (newId <= 0) return content.Error("鎹㈢洏澶辫触");
 
-                targetStock = newStock;
-                targetStock.Id = newId;
-            }
+                    targetStock = newStock;
+                    targetStock.Id = newId;
+                }
 
-            var serialNumbers = stock.Details.Select(d => d.CellBarcode).Distinct().ToList();
-            if (!serialNumbers.Any()) return content.Error("鏈壘鍒版湁鏁堢殑搴忓垪鍙�");
+                var serialNumbers = stock.Details.Select(d => d.Channel).Distinct().ToList();
+                if (!serialNumbers.Any()) return content.Error("鏈壘鍒版湁鏁堢殑搴忓垪鍙�");
 
-            var detailEntities = StockInfoDetailService.Repository.QueryData(
-                d => d.StockId == sourceStock.Id && serialNumbers.Contains(d.SerialNumber));
-            if (!detailEntities.Any()) return content.Error("鏈壘鍒版湁鏁堢殑搴撳瓨鏄庣粏");
+                var detailEntities = StockInfoDetailService.Repository.QueryData(
+                    d => d.StockId == sourceStock.Id && serialNumbers.Contains(d.InboundOrderRowNo));
+                if (!detailEntities.Any()) return content.Error("鏈壘鍒版湁鏁堢殑搴撳瓨鏄庣粏");
 
-            if (await StockInfoDetail_HtyService.Repository.AddDataAsync(CreateDetailHistory(detailEntities, "鎹㈢洏")) <= 0)
-                return content.Error("鎹㈢洏鍘嗗彶璁板綍淇濆瓨澶辫触");
+                if (await StockInfoDetail_HtyService.Repository.AddDataAsync(CreateDetailHistory(detailEntities, "鎹㈢洏")) <= 0)
+                    return content.Error("鎹㈢洏鍘嗗彶璁板綍淇濆瓨澶辫触");
 
-            if (await StockInfo_HtyService.Repository.AddDataAsync(CreateStockHistory(new[] { sourceStock, targetStock }, "鎹㈢洏")) <= 0)
-                return content.Error("鎹㈢洏鍘嗗彶璁板綍淇濆瓨澶辫触");
+                if (await StockInfo_HtyService.Repository.AddDataAsync(CreateStockHistory(new[] { sourceStock, targetStock }, "鎹㈢洏")) <= 0)
+                    return content.Error("鎹㈢洏鍘嗗彶璁板綍淇濆瓨澶辫触");
 
-            detailEntities.ForEach(d => d.StockId = targetStock.Id);
-            var result = await StockInfoDetailService.Repository.UpdateDataAsync(detailEntities);
-            if (!result) return content.Error("鎹㈢洏澶辫触");
-            return content.OK("鎹㈢洏鎴愬姛");
+                detailEntities.ForEach(d => d.StockId = targetStock.Id);
+                var result = await StockInfoDetailService.Repository.UpdateDataAsync(detailEntities);
+                if (!result) return content.Error("鎹㈢洏澶辫触");
+                return content.OK("鎹㈢洏鎴愬姛");
+            });
         }
 
         /// <summary>
@@ -159,31 +209,34 @@
             if (stock == null || string.IsNullOrWhiteSpace(stock.SourcePalletNo))
                 return content.Error("婧愭墭鐩樺彿涓嶈兘涓虹┖");
 
-            var sourceStock = StockInfoService.Repository.QueryFirst(s => s.PalletCode == stock.SourcePalletNo);
-            if (sourceStock == null) return content.Error("婧愭墭鐩樹笉瀛樺湪");
-
-            var serialNumbers = stock.Details.Select(d => d.CellBarcode).Distinct().ToList();
-            if (!serialNumbers.Any())
+            return await ExecuteWithinTransactionAsync(async () =>
             {
-                serialNumbers = sourceStock.Details
-                                            .Where(x => stock.Details.Any(d => d.Channel == x.InboundOrderRowNo))
-                                            .Select(x => x.SerialNumber)
-                                            .ToList();
-            }
+                var sourceStock = StockInfoService.Repository.QueryFirst(s => s.PalletCode == stock.SourcePalletNo);
+                if (sourceStock == null) return content.Error("婧愭墭鐩樹笉瀛樺湪");
 
-            var detailEntities = StockInfoDetailService.Repository.QueryData(
-                d => d.StockId == sourceStock.Id && serialNumbers.Contains(d.SerialNumber));
-            if (!detailEntities.Any()) return content.Error("鏈壘鍒版湁鏁堢殑搴撳瓨鏄庣粏");
+                var serialNumbers = stock.Details.Select(d => d.CellBarcode).Distinct().ToList();
+                if (!serialNumbers.Any())
+                {
+                    serialNumbers = sourceStock.Details
+                                                .Where(x => stock.Details.Any(d => d.Channel == x.InboundOrderRowNo))
+                                                .Select(x => x.SerialNumber)
+                                                .ToList();
+                }
 
-            if (await StockInfoDetail_HtyService.Repository.AddDataAsync(CreateDetailHistory(detailEntities, "鎷嗙洏")) <= 0)
-                return content.Error("鎷嗙洏鍘嗗彶璁板綍淇濆瓨澶辫触");
+                var detailEntities = StockInfoDetailService.Repository.QueryData(
+                    d => d.StockId == sourceStock.Id && serialNumbers.Contains(d.SerialNumber));
+                if (!detailEntities.Any()) return content.Error("鏈壘鍒版湁鏁堢殑搴撳瓨鏄庣粏");
 
-            if (await StockInfo_HtyService.Repository.AddDataAsync(CreateStockHistory(new[] { sourceStock }, "鎷嗙洏")) <= 0)
-                return content.Error("鎷嗙洏鍘嗗彶璁板綍淇濆瓨澶辫触");
+                if (await StockInfoDetail_HtyService.Repository.AddDataAsync(CreateDetailHistory(detailEntities, "鎷嗙洏")) <= 0)
+                    return content.Error("鎷嗙洏鍘嗗彶璁板綍淇濆瓨澶辫触");
 
-            var result = await StockInfoDetailService.Repository.DeleteDataAsync(detailEntities);
-            if (!result) return content.Error("鎷嗙洏澶辫触");
-            return content.OK("鎷嗙洏鎴愬姛");
+                if (await StockInfo_HtyService.Repository.AddDataAsync(CreateStockHistory(new[] { sourceStock }, "鎷嗙洏")) <= 0)
+                    return content.Error("鎷嗙洏鍘嗗彶璁板綍淇濆瓨澶辫触");
+
+                var result = await StockInfoDetailService.Repository.DeleteDataAsync(detailEntities);
+                if (!result) return content.Error("鎷嗙洏澶辫触");
+                return content.OK("鎷嗙洏鎴愬姛");
+            });
         }
 
         /// <summary>
@@ -253,7 +306,9 @@
                 Creater = s.Creater,
                 CreateDate = s.CreateDate,
                 Modifier = s.Modifier,
-                ModifyDate = s.ModifyDate
+                ModifyDate = s.ModifyDate,
+                LocationId = s.LocationId,
+                OutboundDate = s.OutboundDate
             }).ToList();
         }
     }

--
Gitblit v1.9.3