From 3460ffdc967b65ea67c959212c2505a19008401e Mon Sep 17 00:00:00 2001
From: 647556386 <647556386@qq.com>
Date: 星期四, 16 四月 2026 13:39:56 +0800
Subject: [PATCH] 盘点优化,智仓调智仓防呆
---
项目代码/WMS无仓储版/WIDESEA_WMSServer/WIDESEA_TaskInfoService/TaskService_Outbound.cs | 456 ++++++++++++++++++++++++++++++++++++++------------------
1 files changed, 307 insertions(+), 149 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_TaskInfoService/TaskService_Outbound.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_TaskInfoService/TaskService_Outbound.cs"
index e5090c9..936efde 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_TaskInfoService/TaskService_Outbound.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_TaskInfoService/TaskService_Outbound.cs"
@@ -4,11 +4,13 @@
using OfficeOpenXml.FormulaParsing.Excel.Functions.RefAndLookup;
using SqlSugar;
using System;
+using System.Collections;
using System.Collections.Concurrent;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
+using System.Transactions;
using WIDESEA_BasicService;
using WIDESEA_Common.CommonEnum;
using WIDESEA_Common.LocationEnum;
@@ -43,12 +45,47 @@
WebResponseContent content = new WebResponseContent();
try
{
- var stockInfos = _stockRepository.Db.Queryable<Dt_StockInfo>().Where(x => x.PalletType == PalletTypeEnum.Empty.ObjToInt() && x.StockStatus == StockStatusEmun.鍏ュ簱瀹屾垚.ObjToInt()).WhereIF(locationType != 0, x => x.LocationType == locationType).Take(num).ToList();
+ Dictionary<string, SqlSugar.OrderByType> orderByDict = new Dictionary<string, SqlSugar.OrderByType>()
+ {
+ { nameof(Dt_LocationInfo.Layer), SqlSugar.OrderByType.Asc },
+ { nameof(Dt_LocationInfo.Row), SqlSugar.OrderByType.Asc },
+ { nameof(Dt_LocationInfo.Column), SqlSugar.OrderByType.Asc },
+ { nameof(Dt_LocationInfo.Depth), SqlSugar.OrderByType.Desc },
+ };
- if (stockInfos.Count() == 0)
+ var query = _stockRepository.Db.Queryable<Dt_StockInfo>()
+ .Where(x => x.PalletType == PalletTypeEnum.Empty.ObjToInt()
+ && x.StockStatus == StockStatusEmun.鍏ュ簱瀹屾垚.ObjToInt())
+ .WhereIF(locationType != 0, x => x.LocationType == locationType)
+ .LeftJoin<Dt_LocationInfo>((s, l) => s.LocationCode == l.LocationCode);
+
+ if (query.Count() == 0)
{
return WebResponseContent.Instance.Error("鏈壘鍒扮┖鎵樼洏搴撳瓨");
}
+
+ bool isFirstOrder = true;
+ foreach (var item in orderByDict)
+ {
+ string fieldName = item.Key.Equals("Column", StringComparison.OrdinalIgnoreCase)
+ ? $"l.[{item.Key}]"
+ : $"l.{item.Key}";
+
+ string sortSql = $"{fieldName} {(item.Value == SqlSugar.OrderByType.Asc ? "ASC" : "DESC")}";
+
+ if (isFirstOrder)
+ {
+ query = query.OrderBy(sortSql);
+ isFirstOrder = false;
+ }
+ else
+ {
+ query = query.OrderBy(sortSql);
+ }
+ }
+
+ var stockInfos = await query.Take(num).ToListAsync();
+
foreach (var stockInfo in stockInfos)
{
Dt_LocationInfo locationInfo = _locationInfoService.Repository.QueryFirst(x => x.LocationCode == stockInfo.LocationCode);
@@ -88,31 +125,6 @@
_unitOfWorkManage.CommitTran();
- TaskModel esstask = new TaskModel()
- {
- taskType = "carry",
- taskGroupCode = "",
- groupPriority = 0,
- tasks = new List<TasksType>
- {
- new()
- {
- taskCode=task.TaskNum.ToString(),
- taskPriority=0,
- taskDescribe=new TaskDescribeType{
- containerCode=stockInfo.PalletCode,
- containerType= "CT_KUBOT_STANDARD",
- fromLocationCode=stockInfo.LocationCode??"",
- toStationCode="",
- toLocationCode="1-2",
- deadline=0,storageTag=""
- }
- }
- }
- };
- var result = await _eSSApiService.CreateTaskAsync(esstask);
-
- _logger.LogInformation("鍒涘缓浠诲姟PalletOutboundTask 杩斿洖: " + result);
}
return content.OK("绌烘墭鍑哄簱鎴愬姛!");
}
@@ -121,6 +133,8 @@
return WebResponseContent.Instance.Error(ex.Message);
}
}
+
+
/// <summary>
@@ -314,45 +328,46 @@
_outboundOrderDetailService.Repository.UpdateData(outboundOrderDetails);
}
_unitOfWorkManage.CommitTran();
- TaskModel esstask = new TaskModel()
- {
- taskType = "carry",
- taskGroupCode = "",
- groupPriority = 0,
- tasks = new List<TasksType>()
- };
+ return WebResponseContent.Instance.OK();
+ //TaskModel esstask = new TaskModel()
+ //{
+ // taskType = "carry",
+ // taskGroupCode = "",
+ // groupPriority = 0,
+ // tasks = new List<TasksType>()
+ //};
- foreach (var task in tasks)
- {
- esstask.
- tasks.Add(new TasksType
- {
- taskCode = task.TaskNum.ToString(),
- taskPriority = 0,
- taskDescribe = new TaskDescribeType
- {
- containerCode = task.PalletCode,
- containerType = "CT_KUBOT_STANDARD",
- fromLocationCode = task.SourceAddress ?? "",
- toStationCode = "",
- toLocationCode = task.TargetAddress,
- deadline = 0,
- storageTag = ""
- }
- }
- );
- }
- var result = await _eSSApiService.CreateTaskAsync(esstask);
+ //foreach (var task in tasks)
+ //{
+ // esstask.
+ // tasks.Add(new TasksType
+ // {
+ // taskCode = task.TaskNum.ToString(),
+ // taskPriority = 0,
+ // taskDescribe = new TaskDescribeType
+ // {
+ // containerCode = task.PalletCode,
+ // containerType = "CT_KUBOT_STANDARD",
+ // fromLocationCode = task.SourceAddress ?? "",
+ // toStationCode = "",
+ // toLocationCode = task.TargetAddress,
+ // deadline = 0,
+ // storageTag = ""
+ // }
+ // }
+ // );
+ //}
+ //var result = await _eSSApiService.CreateTaskAsync(esstask);
- _logger.LogInformation("鍒涘缓浠诲姟PalletOutboundTask 杩斿洖: " + result);
- if (result)
- {
- return WebResponseContent.Instance.OK();
- }
- else
- {
- return WebResponseContent.Instance.Error("涓嬪彂鏈哄櫒浜轰换鍔″け璐ワ紒");
- }
+ //_logger.LogInformation("鍒涘缓浠诲姟PalletOutboundTask 杩斿洖: " + result);
+ //if (result)
+ //{
+ // return WebResponseContent.Instance.OK();
+ //}
+ //else
+ //{
+ // return WebResponseContent.Instance.Error("涓嬪彂鏈哄櫒浜轰换鍔″け璐ワ紒");
+ //}
}
catch (Exception ex)
{
@@ -390,7 +405,7 @@
TargetAddress = outStation,
TaskStatus = TaskStatusEnum.New.ObjToInt(),
TaskType = taskType.ObjToInt(),
- // TaskNum = BaseDal.GetTaskNum(nameof(SequenceEnum.SeqTaskNum)),
+ //TaskNum = BaseDal.GetTaskNum(nameof(SequenceEnum.SeqTaskNum)),
PalletType = stockInfo.PalletType,
WarehouseId = stockInfo.WarehouseId,
};
@@ -776,46 +791,47 @@
_outboundOrderDetailService.Repository.UpdateData(outboundOrderDetails);
}
_unitOfWorkManage.CommitTran();
+ return WebResponseContent.Instance.OK();
//PushTasksToWCS(tasks);
- TaskModel esstask = new TaskModel()
- {
- taskType = "carry",
- taskGroupCode = "",
- groupPriority = 0,
- tasks = new List<TasksType>()
- };
+ //TaskModel esstask = new TaskModel()
+ //{
+ // taskType = "carry",
+ // taskGroupCode = "",
+ // groupPriority = 0,
+ // tasks = new List<TasksType>()
+ //};
- foreach (var task in tasks)
- {
- esstask.
- tasks.Add(new TasksType
- {
- taskCode = task.TaskNum.ToString(),
- taskPriority = 0,
- taskDescribe = new TaskDescribeType
- {
- containerCode = task.PalletCode,
- containerType = "CT_KUBOT_STANDARD",
- fromLocationCode = task.SourceAddress ?? "",
- toStationCode = "",
- toLocationCode = task.TargetAddress,
- deadline = 0,
- storageTag = ""
- }
- }
- );
- }
- var result = await _eSSApiService.CreateTaskAsync(esstask);
+ //foreach (var task in tasks)
+ //{
+ // esstask.
+ // tasks.Add(new TasksType
+ // {
+ // taskCode = task.TaskNum.ToString(),
+ // taskPriority = 0,
+ // taskDescribe = new TaskDescribeType
+ // {
+ // containerCode = task.PalletCode,
+ // containerType = "CT_KUBOT_STANDARD",
+ // fromLocationCode = task.SourceAddress ?? "",
+ // toStationCode = "",
+ // toLocationCode = task.TargetAddress,
+ // deadline = 0,
+ // storageTag = ""
+ // }
+ // }
+ // );
+ //}
+ //var result = await _eSSApiService.CreateTaskAsync(esstask);
- _logger.LogInformation("鍒涘缓浠诲姟PalletOutboundTask 杩斿洖: " + result);
- if (result)
- {
- return WebResponseContent.Instance.OK();
- }
- else
- {
- return WebResponseContent.Instance.Error("涓嬪彂鏈哄櫒浜轰换鍔″け璐ワ紒");
- }
+ //_logger.LogInformation("鍒涘缓浠诲姟PalletOutboundTask 杩斿洖: " + result);
+ //if (result)
+ //{
+ // return WebResponseContent.Instance.OK();
+ //}
+ //else
+ //{
+ // return WebResponseContent.Instance.Error("涓嬪彂鏈哄櫒浜轰换鍔″け璐ワ紒");
+ //}
}
catch (Exception ex)
@@ -826,7 +842,7 @@
}
-
+
#region 鍒嗘壒鍒嗛厤搴撳瓨
#region 鍐呭瓨閿佺鐞嗗櫒
private static readonly ConcurrentDictionary<string, SemaphoreSlim> _materialLocks =
@@ -1113,6 +1129,14 @@
WebResponseContent content = new WebResponseContent();
try
{
+ var allFactoryAreas = stockViews.SelectMany(sv => sv.Details)
+ .Select(x => x.FactoryArea)
+ .GroupBy(x => x)
+ .ToList();
+ if (allFactoryAreas.Count >= 2)
+ {
+ return content.Error($"璇烽�夋嫨鍚屼竴鍘傚尯鍖哄煙鐨勫簱瀛樿繘琛岀洏鐐癸紝褰撳墠娑夊強{allFactoryAreas.Count}涓笉鍚岀殑鍘傚尯");
+ }
List<int> ids = stockViews.Select(x => x.StockId).ToList();
//鑾峰彇搴撳瓨
List<Dt_StockInfo> stockInfos = _stockRepository.Db.Queryable<Dt_StockInfo>().Where(x => ids.Contains(x.Id)).Includes(x => x.Details).ToList();
@@ -1123,7 +1147,7 @@
}
//鑾峰彇璐т綅
List<string> locStrs = stockInfos.Select(x => x.LocationCode).ToList();
- List<Dt_LocationInfo> locationInfos = (List<Dt_LocationInfo>)_locationInfoService.Db.Queryable<Dt_LocationInfo>().Where(x => locStrs.Contains(x.LocationCode));
+ List<Dt_LocationInfo> locationInfos =_locationInfoService.Db.Queryable<Dt_LocationInfo>().Where(x => locStrs.Contains(x.LocationCode)).ToList();
if (stockInfos.Count != locationInfos.Count)
{
string? locStr = locStrs.FirstOrDefault(x => !locationInfos.Select(x => x.LocationCode).ToList().Contains(x));
@@ -1134,7 +1158,9 @@
WarehouseId = stockInfos.FirstOrDefault().WarehouseId,
TakeStockStatus = TakeStockStatusEnum.鐩樼偣涓�.ObjToInt(),
OrderNo = CreateCodeByRule(nameof(RuleCodeEnum.PDCodeRule)),
- Details = new List<Dt_TakeStockOrderDetail>()
+ AllPalletCode = string.Join(",", stockInfos.Select(item => item.PalletCode).Where(palletCode => !string.IsNullOrEmpty(palletCode))),
+ Remark = outStation
+
};
foreach (var item in stockInfos)
{
@@ -1143,9 +1169,9 @@
return content.Error($"鏈壘鍒皗item.PalletCode}搴撳瓨鏄庣粏鏁版嵁");
}
Dt_LocationInfo? locationInfo = locationInfos.FirstOrDefault(x => x.LocationCode == item.LocationCode);
- if (locationInfo == null && (locationInfo.EnableStatus == EnableStatusEnum.Disable.ObjToInt() || locationInfo.EnableStatus != EnableStatusEnum.Normal.ObjToInt()) && locationInfo.LocationStatus != LocationStatusEnum.InStock.ObjToInt() && item.StockStatus != StockStatusEmun.鍏ュ簱瀹屾垚.ObjToInt())
+ if (locationInfo == null || (locationInfo.EnableStatus == EnableStatusEnum.Disable.ObjToInt() || locationInfo.EnableStatus != EnableStatusEnum.Normal.ObjToInt()) || locationInfo.LocationStatus != LocationStatusEnum.InStock.ObjToInt() || item.StockStatus != StockStatusEmun.鍏ュ簱瀹屾垚.ObjToInt())
{
- content.Error($"{item.PalletCode}璐т綅鎴栧簱瀛樼姸鎬佷笉婊¤冻鍑哄簱鏉′欢");
+ return content.Error($"{item.PalletCode}璐т綅鎴栧簱瀛樼姸鎬佷笉婊¤冻鍑哄簱鏉′欢");
}
}
List<Dt_Task> tasks = GetTasks(stockInfos, TaskTypeEnum.OutInventory,outStation);
@@ -1155,7 +1181,7 @@
}
stockInfos.ForEach(x =>
{
- x.StockStatus = StockStatusEmun.鍑哄簱閿佸畾.ObjToInt();
+ x.StockStatus = StockStatusEmun.鐩樼偣鍑哄簱閿佸畾.ObjToInt();
});
tasks.ForEach(x =>
{
@@ -1168,56 +1194,57 @@
_unitOfWorkManage.BeginTran();
//鏇存柊搴撳瓨鐘舵��
_stockRepository.UpdateData(stockInfos);
- BaseDal.Db.InsertNav(takeStockOrder);
+ _takeStockOrder.AddData(takeStockOrder);
//鏂板缓浠诲姟
BaseDal.AddData(tasks);
_locationInfoService.UpdateData(locationInfos);
_unitOfWorkManage.CommitTran();
- TaskModel esstask = new TaskModel()
- {
- taskType = "carry",
- taskGroupCode = "",
- groupPriority = 0,
- tasks = new List<TasksType>()
- };
-
- foreach (var task in tasks)
- {
- esstask.
- tasks.Add(new TasksType
- {
- taskCode = task.TaskNum.ToString(),
- taskPriority = 0,
- taskDescribe = new TaskDescribeType
- {
- containerCode = task.PalletCode,
- containerType = "CT_KUBOT_STANDARD",
- fromLocationCode = task.SourceAddress ?? "",
- toStationCode = "",
- toLocationCode = task.TargetAddress,
- deadline = 0,
- storageTag = ""
- }
- }
- );
- }
- var result = await _eSSApiService.CreateTaskAsync(esstask);
-
- _logger.LogInformation("鍒涘缓浠诲姟PalletOutboundTask 杩斿洖: " + result);
- if (result)
- {
- return WebResponseContent.Instance.OK();
- }
- else
- {
- return WebResponseContent.Instance.Error("涓嬪彂鏈哄櫒浜轰换鍔″け璐ワ紒");
- }
content.OK();
+ //TaskModel esstask = new TaskModel()
+ //{
+ // taskType = "carry",
+ // taskGroupCode = "",
+ // groupPriority = 0,
+ // tasks = new List<TasksType>()
+ //};
+
+ //foreach (var task in tasks)
+ //{
+ // esstask.
+ // tasks.Add(new TasksType
+ // {
+ // taskCode = task.TaskNum.ToString(),
+ // taskPriority = 0,
+ // taskDescribe = new TaskDescribeType
+ // {
+ // containerCode = task.PalletCode,
+ // containerType = "CT_KUBOT_STANDARD",
+ // fromLocationCode = task.SourceAddress ?? "",
+ // toStationCode = "",
+ // toLocationCode = task.TargetAddress,
+ // deadline = 0,
+ // storageTag = ""
+ // }
+ // }
+ // );
+ //}
+ //var result = await _eSSApiService.CreateTaskAsync(esstask);
+
+ //_logger.LogInformation("鍒涘缓浠诲姟PalletOutboundTask 杩斿洖: " + result);
+ //if (result)
+ //{
+ // return WebResponseContent.Instance.OK();
+ //}
+ //else
+ //{
+ // return WebResponseContent.Instance.Error("涓嬪彂鏈哄櫒浜轰换鍔″け璐ワ紒");
+ //}
+ //content.OK();
}
catch (Exception ex)
{
_unitOfWorkManage.RollbackTran();
- content.Error(ex.Message);
+ return await Task.FromResult(WebResponseContent.Instance.Error(ex.Message));
}
return content;
}
@@ -1283,6 +1310,137 @@
return code;
}
}
+
+ /// <summary>
+ /// 閫夊畾搴撳瓨鍚屽尯鍩熺Щ搴�
+ /// </summary>
+ /// <param name="id"></param>
+ /// <returns></returns>
+ public async Task<WebResponseContent> AreaOutbound(List<StockViewDTO> stockViews)
+ {
+ WebResponseContent content = new WebResponseContent();
+ try
+ {
+ List<int> ids = stockViews.Select(x => x.StockId).ToList();
+ //鑾峰彇搴撳瓨
+ List<Dt_StockInfo> stockInfos = _stockRepository.Db.Queryable<Dt_StockInfo>().Where(x => ids.Contains(x.Id)).Includes(x => x.Details).ToList();
+ if (stockInfos.Count != stockViews.Count)
+ {
+ StockViewDTO? stockViewDTO = stockViews.FirstOrDefault(x => !stockInfos.Select(x => x.PalletCode).ToList().Contains(x.PalletCode));
+ return content.Error($"鏈壘鍒皗stockViewDTO?.PalletCode}搴撳瓨");
+ }
+ //鑾峰彇璐т綅
+ List<string> locStrs = stockInfos.Select(x => x.LocationCode).ToList();
+ List<Dt_LocationInfo> locationInfos = _locationInfoService.Db.Queryable<Dt_LocationInfo>().Where(x => locStrs.Contains(x.LocationCode)).ToList();
+ if (stockInfos.Count != locationInfos.Count)
+ {
+ string? locStr = locStrs.FirstOrDefault(x => !locationInfos.Select(x => x.LocationCode).ToList().Contains(x));
+ return content.Error($"鏈壘鍒皗locStr}璐т綅鏁版嵁");
+ }
+
+ foreach (var item in stockInfos)
+ {
+ Dt_LocationInfo? locationInfo = locationInfos.FirstOrDefault(x => x.LocationCode == item.LocationCode);
+ if (locationInfo == null || (locationInfo.EnableStatus == EnableStatusEnum.Disable.ObjToInt() || locationInfo.EnableStatus != EnableStatusEnum.Normal.ObjToInt()) || item.StockStatus != StockStatusEmun.鍏ュ簱瀹屾垚.ObjToInt())
+ {
+ return content.Error($"{item.PalletCode}璐т綅鎴栧簱瀛樼姸鎬佷笉婊¤冻鍑哄簱鏉′欢");
+ }
+ }
+ List<Dt_Task> tasks = AreaGetTasks(stockInfos, TaskTypeEnum.AreaRelocation);
+ if (tasks == null || tasks.Count <= 0)
+ {
+ return content.Error($"鐢熸垚浠诲姟澶辫触");
+ }
+ stockInfos.ForEach(x =>
+ {
+ x.StockStatus = StockStatusEmun.鍑哄簱閿佸畾.ObjToInt();
+ });
+ tasks.ForEach(x =>
+ {
+ x.OrderNo = "鏃犲崟鎹Щ搴�";
+ });
+ locationInfos.ForEach(x =>
+ {
+ x.LocationStatus = LocationStatusEnum.Lock.ObjToInt();
+ });
+ _unitOfWorkManage.BeginTran();
+ //鏇存柊搴撳瓨鐘舵��
+ _stockRepository.UpdateData(stockInfos);
+ //鏂板缓浠诲姟
+ BaseDal.AddData(tasks);
+ _locationInfoService.UpdateData(locationInfos);
+ _unitOfWorkManage.CommitTran();
+ content.OK();
+ }
+ catch (Exception ex)
+ {
+ _unitOfWorkManage.RollbackTran();
+ return await Task.FromResult(WebResponseContent.Instance.Error(ex.Message));
+ }
+ return content;
+ }
+
+ public List<Dt_Task> AreaGetTasks(List<Dt_StockInfo> stockInfos, TaskTypeEnum taskType)
+ {
+ // 浣跨敤 TransactionScope 鍖呰9鏁翠釜鎿嶄綔锛岀‘淇濇墍鏈夋暟鎹簱鎿嶄綔鍦ㄥ悓涓�浜嬪姟涓�
+ using (var scope = new TransactionScope(TransactionScopeOption.Required,
+ new TransactionOptions { IsolationLevel = IsolationLevel.ReadCommitted }))
+ {
+ try
+ {
+ List<Dt_Task> tasks = new List<Dt_Task>();
+ List<Dt_LocationInfo> locationInfos = _locationInfoService.Repository.QueryData(
+ x => stockInfos.Select(x => x.LocationCode).Contains(x.LocationCode));
+
+ for (int i = 0; i < stockInfos.Count; i++)
+ {
+ Dt_StockInfo stockInfo = stockInfos[i];
+
+ if (stockInfo != null)
+ {
+ Dt_LocationInfo? locationInfo = locationInfos.FirstOrDefault(x => x.LocationCode == stockInfo.LocationCode);
+ var newLocation = _locationInfoService.AssignLocation(stockInfo.LocationType);
+
+ if (newLocation == null)
+ {
+ throw new Exception($"鍦▄stockInfo.PalletCode}鏃舵病鏈夌┖闂插簱浣嶅彲杩涜鍚屽尯鍩熺Щ搴擄紝璇锋鏌ユ垨鍑忓皯绉诲簱鏂欑");
+ }
+
+ if (!tasks.Exists(x => x.PalletCode == stockInfo.PalletCode))
+ {
+ Dt_Task task = new()
+ {
+ CurrentAddress = stockInfo.LocationCode,
+ Grade = 0,
+ PalletCode = stockInfo.PalletCode,
+ NextAddress = "",
+ Roadway = locationInfo.RoadwayNo,
+ SourceAddress = stockInfo.LocationCode,
+ TargetAddress = newLocation.LocationCode,
+ TaskStatus = TaskStatusEnum.New.ObjToInt(),
+ TaskType = taskType.ObjToInt(),
+ PalletType = stockInfo.PalletType,
+ WarehouseId = stockInfo.WarehouseId,
+ };
+ tasks.Add(task);
+ }
+
+ newLocation.LocationStatus = LocationStatusEnum.Lock.ObjToInt();
+ _locationInfoService.UpdateData(newLocation);
+ }
+ }
+
+ // 鎻愪氦浜嬪姟
+ scope.Complete();
+ return tasks;
+ }
+ catch (Exception ex)
+ {
+ // TransactionScope 浼氳嚜鍔ㄥ洖婊氫簨鍔★紝鏃犻渶鎵嬪姩 Rollback
+ throw new Exception(ex.Message);
+ }
+ }
+ }
}
}
--
Gitblit v1.9.3