From 71403dd5e730c6966b2754f94b8a2df50729bfd3 Mon Sep 17 00:00:00 2001
From: wanshenmean <cathay_xy@163.com>
Date: 星期五, 27 三月 2026 14:10:04 +0800
Subject: [PATCH] fix(RouterService): AddRouters 缓存更新用 try-catch 保护

---
 Code/WMS/WIDESEA_WMSServer/WIDESEA_StockService/StockSerivce.cs |  374 ++++++++++++++++++++++++++++++----------------------
 1 files changed, 214 insertions(+), 160 deletions(-)

diff --git a/Code/WMS/WIDESEA_WMSServer/WIDESEA_StockService/StockSerivce.cs b/Code/WMS/WIDESEA_WMSServer/WIDESEA_StockService/StockSerivce.cs
index 638f58c..1bf9205 100644
--- a/Code/WMS/WIDESEA_WMSServer/WIDESEA_StockService/StockSerivce.cs
+++ b/Code/WMS/WIDESEA_WMSServer/WIDESEA_StockService/StockSerivce.cs
@@ -1,4 +1,6 @@
-锘縰sing WIDESEA_Common.StockEnum;
+锘縰sing SqlSugar;
+using WIDESEA_Common.StockEnum;
+using WIDESEA_Core;
 using WIDESEA_DTO.Stock;
 using WIDESEA_IStockService;
 using WIDESEA_Model.Models;
@@ -6,25 +8,42 @@
 namespace WIDESEA_StockService
 {
     /// <summary>
-    /// 搴撳瓨鏈嶅姟
+    /// 搴撳瓨鏈嶅姟鑱氬悎瀹炵幇绫�
     /// </summary>
-    public class StockSerivce : IStockService
+    public class StockService : IStockService
     {
+        /// <summary>
+        /// 搴撳瓨鏄庣粏鏈嶅姟
+        /// </summary>
         public IStockInfoDetailService StockInfoDetailService { get; }
 
+        /// <summary>
+        /// 搴撳瓨淇℃伅鏈嶅姟
+        /// </summary>
         public IStockInfoService StockInfoService { get; }
+
+        /// <summary>
+        /// 搴撳瓨鏄庣粏鍘嗗彶鏈嶅姟
+        /// </summary>
         public IStockInfoDetail_HtyService StockInfoDetail_HtyService { get; }
 
+        /// <summary>
+        /// 搴撳瓨鍘嗗彶鏈嶅姟
+        /// </summary>
         public IStockInfo_HtyService StockInfo_HtyService { get; }
 
         /// <summary>
         /// 鏋勯�犲嚱鏁�
         /// </summary>
         /// <param name="stockInfoDetailService">搴撳瓨鏄庣粏鏈嶅姟</param>
-        /// <param name="stockInfoService">搴撳瓨鏈嶅姟</param>
+        /// <param name="stockInfoService">搴撳瓨淇℃伅鏈嶅姟</param>
         /// <param name="stockInfoDetail_HtyService">搴撳瓨鏄庣粏鍘嗗彶鏈嶅姟</param>
         /// <param name="stockInfo_HtyService">搴撳瓨鍘嗗彶鏈嶅姟</param>
-        public StockSerivce(IStockInfoDetailService stockInfoDetailService, IStockInfoService stockInfoService, IStockInfoDetail_HtyService stockInfoDetail_HtyService, IStockInfo_HtyService stockInfo_HtyService)
+        public StockService(
+            IStockInfoDetailService stockInfoDetailService,
+            IStockInfoService stockInfoService,
+            IStockInfoDetail_HtyService stockInfoDetail_HtyService,
+            IStockInfo_HtyService stockInfo_HtyService)
         {
             StockInfoDetailService = stockInfoDetailService;
             StockInfoService = stockInfoService;
@@ -33,17 +52,61 @@
         }
 
         /// <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>
-        /// <param name="stock">缁勭洏鏁版嵁</param>
-        /// <returns>鏄惁鎴愬姛</returns>
-        public async Task<bool> GroupPallet(StockDTO stock)
+        public async Task<WebResponseContent> GroupPalletAsync(StockDTO stock)
         {
-            // 缁勮鏄庣粏鏁版嵁
+            WebResponseContent content = new WebResponseContent();
             var now = DateTime.Now;
-            var details = stock.Details.Select(item => new Dt_StockInfoDetail()
+            var details = stock.Details.Select(item => new Dt_StockInfoDetail
             {
                 MaterielCode = "鐢佃姱",
+                MaterielName = "鐢佃姱",
                 StockQuantity = item.Quantity,
                 Unit = "PCS",
                 Creater = "system",
@@ -52,210 +115,201 @@
                 EffectiveDate = now.AddYears(1).ToString(),
                 SerialNumber = item.CellBarcode,
                 InboundOrderRowNo = item.Channel,
-                MaterielName = "鐢佃姱",
                 Status = StockStatusEmun.缁勭洏鏆傚瓨.GetHashCode(),
             }).ToList();
 
-            // 濡傛灉鎵樼洏宸插瓨鍦紝鐩存帴鏂板鏄庣粏
-            var existingStock = StockInfoService.Repository.QueryFirst(s => s.PalletCode == stock.TargetPalletNo);
-            if (existingStock != null)
+            return await ExecuteWithinTransactionAsync(async () =>
             {
-                details.ForEach(detail => detail.StockId = existingStock.Id);
-                return await StockInfoDetailService.Repository.AddDataAsync(details) > 0;
-            }
+                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 = stock.WarehouseId > 0 ? stock.WarehouseId : 1,
+                    WarehouseId = 1,
+                    StockStatus = StockStatusEmun.缁勭洏鏆傚瓨.GetHashCode(),
+                    Creater = "system",
+                    Details = details
+                };
 
-            return StockInfoService.Repository.AddData(entity, x => x.Details);
+                result = StockInfoService.Repository.AddData(entity, x => x.Details);
+                return result ? content.OK("缁勭洏鎴愬姛") : content.Error("缁勭洏澶辫触");
+            });
         }
 
         /// <summary>
         /// 鎹㈢洏
         /// </summary>
-        /// <param name="stock">闇�瑕佹崲鐩樼殑鏄庣粏鏁版嵁</param>
-        /// <returns>鏄惁鎴愬姛</returns>
-        public async Task<bool> ChangePallet(StockDTO stock)
+        public async Task<WebResponseContent> ChangePalletAsync(StockDTO stock)
         {
-            // 鍙傛暟鏍¢獙
-            if (stock == null || string.IsNullOrWhiteSpace(stock.TargetPalletNo) || string.IsNullOrWhiteSpace(stock.SourcePalletNo))
+            WebResponseContent content = new WebResponseContent();
+            if (stock == null ||
+                string.IsNullOrWhiteSpace(stock.TargetPalletNo) ||
+                string.IsNullOrWhiteSpace(stock.SourcePalletNo) ||
+                string.Equals(stock.SourcePalletNo, stock.TargetPalletNo, StringComparison.OrdinalIgnoreCase))
             {
-                return false;
+                return content.Error("婧愭墭鐩樺彿涓庣洰鏍囨墭鐩樺彿鐩稿悓");
             }
 
-            // 鏂版棫鎵樼洏涓�鑷翠笉澶勭悊
-            if (string.Equals(stock.SourcePalletNo, stock.TargetPalletNo, StringComparison.OrdinalIgnoreCase))
+            return await ExecuteWithinTransactionAsync(async () =>
             {
-                return false;
-            }
+                var sourceStock = await StockInfoService.Repository.QueryDataNavFirstAsync(s => s.PalletCode == stock.SourcePalletNo);
+                if (sourceStock == null) return content.Error("婧愭墭鐩樹笉瀛樺湪");
 
-            // 鏌ヨ婧愭墭鐩�
-            var sourceStock = StockInfoService.Repository.QueryFirst(s => s.PalletCode == stock.SourcePalletNo);
-            if (sourceStock == null)
-            {
-                return false;
-            }
-
-            // 鏌ヨ鎴栧垱寤虹洰鏍囨墭鐩�
-            var targetStock = StockInfoService.Repository.QueryFirst(s => s.PalletCode == stock.TargetPalletNo);
-            if (targetStock == null)
-            {
-                var newStock = new Dt_StockInfo()
+                var targetStock = StockInfoService.Repository.QueryFirst(s => s.PalletCode == stock.TargetPalletNo);
+                if (targetStock == null)
                 {
-                    PalletCode = stock.TargetPalletNo,
-                    WarehouseId = sourceStock.WarehouseId,
-                    StockStatus = sourceStock.StockStatus,
-                    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 false;
+                    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.Channel).Distinct().ToList();
+                if (!serialNumbers.Any()) return content.Error("鏈壘鍒版湁鏁堢殑搴忓垪鍙�");
 
-            // 鑾峰彇闇�瑕佽浆绉荤殑鏉$爜
-            var serialNumbers = stock.Details.Select(d => d.CellBarcode).Distinct().ToList();
-            if (!serialNumbers.Any())
-            {
-                return false;
-            }
+                var detailEntities = StockInfoDetailService.Repository.QueryData(
+                    d => d.StockId == sourceStock.Id && serialNumbers.Contains(d.InboundOrderRowNo));
+                if (!detailEntities.Any()) return content.Error("鏈壘鍒版湁鏁堢殑搴撳瓨鏄庣粏");
 
-            // 鏌ヨ婧愭墭鐩樺搴旂殑鏄庣粏
-            var detailEntities = StockInfoDetailService.Repository.QueryData(d => d.StockId == sourceStock.Id && serialNumbers.Contains(d.SerialNumber));
+                if (await StockInfoDetail_HtyService.Repository.AddDataAsync(CreateDetailHistory(detailEntities, "鎹㈢洏")) <= 0)
+                    return content.Error("鎹㈢洏鍘嗗彶璁板綍淇濆瓨澶辫触");
 
-            if (!detailEntities.Any())
-            {
-                return false;
-            }
+                if (await StockInfo_HtyService.Repository.AddDataAsync(CreateStockHistory(new[] { sourceStock, targetStock }, "鎹㈢洏")) <= 0)
+                    return content.Error("鎹㈢洏鍘嗗彶璁板綍淇濆瓨澶辫触");
 
-            // 鍐欏叆鍘嗗彶璁板綍
-            var detailHistory = CreateDetailHistory(detailEntities, "鎹㈢洏");
-            if (await StockInfoDetail_HtyService.Repository.AddDataAsync(detailHistory) <= 0)
-            {
-                return false;
-            }
-
-            var stockHistory = CreateStockHistory(new List<Dt_StockInfo> { sourceStock, targetStock }, "鎹㈢洏");
-            if (await StockInfo_HtyService.Repository.AddDataAsync(stockHistory) <= 0)
-            {
-                return false;
-            }
-
-            // 鏇存柊鏄庣粏鐨勬墭鐩樹富閿�
-            detailEntities.ForEach(detail => detail.StockId = targetStock.Id);
-            return await StockInfoDetailService.Repository.UpdateDataAsync(detailEntities);
+                detailEntities.ForEach(d => d.StockId = targetStock.Id);
+                var result = await StockInfoDetailService.Repository.UpdateDataAsync(detailEntities);
+                if (!result) return content.Error("鎹㈢洏澶辫触");
+                return content.OK("鎹㈢洏鎴愬姛");
+            });
         }
 
         /// <summary>
         /// 鎷嗙洏
         /// </summary>
-        /// <param name="stock">闇�瑕佹媶鐩樼殑鏄庣粏鏁版嵁</param>
-        /// <returns>鏄惁鎴愬姛</returns>
-        public async Task<bool> SplitPallet(StockDTO stock)
+        public async Task<WebResponseContent> SplitPalletAsync(StockDTO stock)
         {
-            // 鍙傛暟鏍¢獙
+            WebResponseContent content = new WebResponseContent();
             if (stock == null || string.IsNullOrWhiteSpace(stock.SourcePalletNo))
-            {
-                return false;
-            }
+                return content.Error("婧愭墭鐩樺彿涓嶈兘涓虹┖");
 
-            // 鏌ヨ婧愭墭鐩�
-            var sourceStock = StockInfoService.Repository.QueryFirst(s => s.PalletCode == stock.SourcePalletNo);
-            if (sourceStock == null)
+            return await ExecuteWithinTransactionAsync(async () =>
             {
-                return false;
-            }
+                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 false;
-            }
+                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();
+                }
 
-            // 鏌ヨ婧愭墭鐩樺搴旂殑鏄庣粏
-            var detailEntities = StockInfoDetailService.Repository.QueryData(d => d.StockId == sourceStock.Id && serialNumbers.Contains(d.SerialNumber));
-            if (!detailEntities.Any())
-            {
-                return false;
-            }
+                var detailEntities = StockInfoDetailService.Repository.QueryData(
+                    d => d.StockId == sourceStock.Id && serialNumbers.Contains(d.SerialNumber));
+                if (!detailEntities.Any()) return content.Error("鏈壘鍒版湁鏁堢殑搴撳瓨鏄庣粏");
 
-            // 鍐欏叆鍘嗗彶璁板綍
-            var detailHistory = CreateDetailHistory(detailEntities, "鎷嗙洏");
-            if (await StockInfoDetail_HtyService.Repository.AddDataAsync(detailHistory) <= 0)
-            {
-                return false;
-            }
+                if (await StockInfoDetail_HtyService.Repository.AddDataAsync(CreateDetailHistory(detailEntities, "鎷嗙洏")) <= 0)
+                    return content.Error("鎷嗙洏鍘嗗彶璁板綍淇濆瓨澶辫触");
 
-            var stockHistory = CreateStockHistory(new List<Dt_StockInfo> { sourceStock }, "鎷嗙洏");
-            if (await StockInfo_HtyService.Repository.AddDataAsync(stockHistory) <= 0)
-            {
-                return false;
-            }
+                if (await StockInfo_HtyService.Repository.AddDataAsync(CreateStockHistory(new[] { sourceStock }, "鎷嗙洏")) <= 0)
+                    return content.Error("鎷嗙洏鍘嗗彶璁板綍淇濆瓨澶辫触");
 
-            // 鍒犻櫎鏄庣粏
-            return await StockInfoDetailService.Repository.DeleteDataAsync(detailEntities);
+                var result = await StockInfoDetailService.Repository.DeleteDataAsync(detailEntities);
+                if (!result) return content.Error("鎷嗙洏澶辫触");
+                return content.OK("鎷嗙洏鎴愬姛");
+            });
         }
 
-        private List<Dt_StockInfoDetail_Hty> CreateDetailHistory(IEnumerable<Dt_StockInfoDetail> details, string operateType)
+        /// <summary>
+        /// 鍫嗗灈鏈烘崲鐩樺悗鏇存柊搴撳瓨淇℃伅锛堟竻绌哄簱浣嶄俊鎭級
+        /// </summary>
+        /// <param name="stock"></param>
+        /// <returns></returns>
+        public async Task<WebResponseContent> UpdateStockInfoAsync(StockInfoDTO stock)
+        {
+            WebResponseContent content = new WebResponseContent();
+            if (string.IsNullOrWhiteSpace(stock.PalletCode)) return content.Error("鎵樼洏鍙蜂笉鑳戒负绌�");
+
+            var existingStock = StockInfoService.Repository.QueryFirst(s => s.PalletCode == stock.PalletCode);
+            if (existingStock == null) return content.Error("鎵樼洏淇℃伅涓嶅瓨鍦�");
+
+            existingStock.LocationCode = "";
+            existingStock.LocationId = 0;
+
+            var result = await StockInfoService.Repository.UpdateDataAsync(existingStock);
+            if (!result) return content.Error("鏇存柊搴撳瓨淇℃伅澶辫触");
+            return content.OK("鏇存柊搴撳瓨淇℃伅鎴愬姛");
+        }
+
+        private static List<Dt_StockInfoDetail_Hty> CreateDetailHistory(IEnumerable<Dt_StockInfoDetail> details, string operateType)
         {
             var now = DateTime.Now;
-            return details.Select(detail => new Dt_StockInfoDetail_Hty
+            return details.Select(d => new Dt_StockInfoDetail_Hty
             {
-                SourceId = detail.Id,
+                SourceId = d.Id,
                 OperateType = operateType,
                 InsertTime = now,
-                StockId = detail.StockId,
-                MaterielCode = detail.MaterielCode,
-                MaterielName = detail.MaterielName,
-                OrderNo = detail.OrderNo,
-                BatchNo = detail.BatchNo,
-                ProductionDate = detail.ProductionDate,
-                EffectiveDate = detail.EffectiveDate,
-                SerialNumber = detail.SerialNumber,
-                StockQuantity = detail.StockQuantity,
-                OutboundQuantity = detail.OutboundQuantity,
-                Status = detail.Status,
-                Unit = detail.Unit,
-                InboundOrderRowNo = detail.InboundOrderRowNo,
-                Remark = detail.Remark,
-                Creater = detail.Creater,
-                CreateDate = detail.CreateDate,
-                Modifier = detail.Modifier,
-                ModifyDate = detail.ModifyDate
+                StockId = d.StockId,
+                MaterielCode = d.MaterielCode,
+                MaterielName = d.MaterielName,
+                OrderNo = d.OrderNo,
+                BatchNo = d.BatchNo,
+                ProductionDate = d.ProductionDate,
+                EffectiveDate = d.EffectiveDate,
+                SerialNumber = d.SerialNumber,
+                StockQuantity = d.StockQuantity,
+                OutboundQuantity = d.OutboundQuantity,
+                Status = d.Status,
+                Unit = d.Unit,
+                InboundOrderRowNo = d.InboundOrderRowNo,
+                Remark = d.Remark,
+                Creater = d.Creater,
+                CreateDate = d.CreateDate,
+                Modifier = d.Modifier,
+                ModifyDate = d.ModifyDate
             }).ToList();
         }
 
-        private List<Dt_StockInfo_Hty> CreateStockHistory(IEnumerable<Dt_StockInfo> stocks, string operateType)
+        private static List<Dt_StockInfo_Hty> CreateStockHistory(IEnumerable<Dt_StockInfo> stocks, string operateType)
         {
             var now = DateTime.Now;
-            return stocks.Select(stock => new Dt_StockInfo_Hty
+            return stocks.Select(s => new Dt_StockInfo_Hty
             {
-                SourceId = stock.Id,
+                SourceId = s.Id,
                 OperateType = operateType,
                 InsertTime = now,
-                PalletCode = stock.PalletCode,
-                PalletType = stock.PalletType,
-                LocationCode = stock.LocationCode,
-                WarehouseId = stock.WarehouseId,
-                StockStatus = stock.StockStatus,
-                Remark = stock.Remark,
-                Creater = stock.Creater,
-                CreateDate = stock.CreateDate,
-                Modifier = stock.Modifier,
-                ModifyDate = stock.ModifyDate
+                PalletCode = s.PalletCode,
+                PalletType = s.PalletType,
+                LocationCode = s.LocationCode,
+                WarehouseId = s.WarehouseId,
+                StockStatus = s.StockStatus,
+                Remark = s.Remark,
+                Creater = s.Creater,
+                CreateDate = s.CreateDate,
+                Modifier = s.Modifier,
+                ModifyDate = s.ModifyDate,
+                LocationId = s.LocationId,
+                OutboundDate = s.OutboundDate
             }).ToList();
         }
     }

--
Gitblit v1.9.3