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.cs | 379 +++++++++++++++++++++++++++++++++++++++++++++++++++--
1 files changed, 359 insertions(+), 20 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.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.cs"
index 71e24f6..c49e8af 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.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.cs"
@@ -27,6 +27,7 @@
using SqlSugar;
using System.Reflection;
using System.Reflection.Emit;
+using System.Text;
using System.Threading.Tasks;
using System.Xml.Linq;
using WIDESEA_BasicService;
@@ -98,6 +99,7 @@
private readonly IRepository<Dt_TakeStockOrder> _takeStockOrder;
public readonly IRepository<Dt_LocationType> _locationTypeRepository;
public readonly IRepository<Dt_WarehouseArea> _warehouseAreaRepository;
+ private readonly IRepository<Dt_OutStockLockInfo> _outboundLockInfoRepository;
public IRepository<Dt_Task> Repository => BaseDal;
private Dictionary<string, SqlSugar.OrderByType> _taskOrderBy = new()
@@ -117,7 +119,7 @@
public List<int> TaskOutboundTypes => typeof(TaskTypeEnum).GetEnumIndexList();
- public TaskService(IRepository<Dt_Task> BaseDal, IMapper mapper, IUnitOfWorkManage unitOfWorkManage, IRepository<Dt_StockInfo> stockRepository, ILocationInfoService locationInfoService, IInboundOrderService inboundOrderService, ILocationStatusChangeRecordService locationStatusChangeRecordService, IESSApiService eSSApiService, ILogger<TaskService> logger, IStockService stockService, IRecordService recordService, IInboundOrderDetailService inboundOrderDetailService, IOutboundOrderService outboundOrderService, IOutboundOrderDetailService outboundOrderDetailService, IInvokeMESService invokeMESService, IOutStockLockInfoService outStockLockInfoService, IAllocateService allocateService, IRepository<Dt_OutboundBatch> outboundBatchRepository, IRepository<Dt_ReCheckOrder> reCheckOrderRepository, IRepository<Dt_AllocateOrderDetail> allocateOrderDetailRepository, IRepository<Dt_AllocateOrder> allocateOrderRepository, IMaterialUnitService materialUnitService, ITask_HtyService task_HtyService, IRepository<Dt_AllocateMaterialInfo> allocateMaterialInfo, IRepository<Dt_AllocateMaterialInfo_Hty> allocateMaterialInfo_Hty, HttpClientHelper httpClientHelper, IBasicService basicService,IRepository<Dt_TakeStockOrder> takeStockOrder, IRepository<Dt_LocationType> locationTypeRepository, IRepository<Dt_WarehouseArea> warehouseAreaRepository) : base(BaseDal)
+ public TaskService(IRepository<Dt_Task> BaseDal, IMapper mapper, IUnitOfWorkManage unitOfWorkManage, IRepository<Dt_StockInfo> stockRepository, ILocationInfoService locationInfoService, IInboundOrderService inboundOrderService, ILocationStatusChangeRecordService locationStatusChangeRecordService, IESSApiService eSSApiService, ILogger<TaskService> logger, IStockService stockService, IRecordService recordService, IInboundOrderDetailService inboundOrderDetailService, IOutboundOrderService outboundOrderService, IOutboundOrderDetailService outboundOrderDetailService, IInvokeMESService invokeMESService, IOutStockLockInfoService outStockLockInfoService, IAllocateService allocateService, IRepository<Dt_OutboundBatch> outboundBatchRepository, IRepository<Dt_ReCheckOrder> reCheckOrderRepository, IRepository<Dt_AllocateOrderDetail> allocateOrderDetailRepository, IRepository<Dt_AllocateOrder> allocateOrderRepository, IMaterialUnitService materialUnitService, ITask_HtyService task_HtyService, IRepository<Dt_AllocateMaterialInfo> allocateMaterialInfo, IRepository<Dt_AllocateMaterialInfo_Hty> allocateMaterialInfo_Hty, HttpClientHelper httpClientHelper, IBasicService basicService,IRepository<Dt_TakeStockOrder> takeStockOrder, IRepository<Dt_LocationType> locationTypeRepository, IRepository<Dt_WarehouseArea> warehouseAreaRepository, IRepository<Dt_OutStockLockInfo> outboundLockInfoRepository) : base(BaseDal)
{
_mapper = mapper;
_unitOfWorkManage = unitOfWorkManage;
@@ -148,6 +150,7 @@
_takeStockOrder = takeStockOrder;
_locationTypeRepository = locationTypeRepository;
_warehouseAreaRepository = warehouseAreaRepository;
+ _outboundLockInfoRepository = outboundLockInfoRepository;
}
public async Task TaskStatusChange(string taskNum, TaskStatusEnum taskStatusEnum)
@@ -388,12 +391,31 @@
allocatefeedmodel.Details = groupedData;
var response = responseModel(inboundOrder, 3, null, allocatefeedmodel);
- if (response != null && response.IsSuccess)
+ if (response != null && response.IsSuccess && response.Data.Code =="200")
{
- _inboundOrderService.Db.Updateable<Dt_InboundOrder>().SetColumns(it => new Dt_InboundOrder { ReturnToMESStatus = 1 })
+ var detailStatusList = _inboundOrderDetailService.Db.Queryable<Dt_InboundOrderDetail>()
+ .Where(it => it.OrderId == inboundOrder.Id)
+ .Select(it => it.OrderDetailStatus)
+ .ToList();
+
+ bool isAll = detailStatusList.Any()
+ ? detailStatusList.All(x => x == OrderDetailStatusEnum.Over.ObjToInt())
+ : false;
+
+ if (isAll)
+ {
+ _inboundOrderService.Db.Updateable<Dt_InboundOrder>().SetColumns(it => new Dt_InboundOrder { ReturnToMESStatus = 1, Remark = "" })
.Where(it => it.Id == inboundOrder.Id).ExecuteCommand();
- _inboundOrderDetailService.Db.Updateable<Dt_InboundOrderDetail>().SetColumns(it => new Dt_InboundOrderDetail { ReturnToMESStatus = 1 })
- .Where(it => it.OrderId == inboundOrder.Id).ExecuteCommand();
+ _inboundOrderDetailService.Db.Updateable<Dt_InboundOrderDetail>().SetColumns(it => new Dt_InboundOrderDetail { ReturnToMESStatus = 1 })
+ .Where(it => it.OrderId == inboundOrder.Id).ExecuteCommand();
+ }
+ else
+ {
+ _inboundOrderService.Db.Updateable<Dt_InboundOrder>().SetColumns(it => new Dt_InboundOrder { ReturnToMESStatus = 3, Remark = "" })
+ .Where(it => it.Id == inboundOrder.Id).ExecuteCommand();
+ _inboundOrderDetailService.Db.Updateable<Dt_InboundOrderDetail>().SetColumns(it => new Dt_InboundOrderDetail { ReturnToMESStatus = 3 })
+ .Where(it => it.OrderId == inboundOrder.Id).ExecuteCommand();
+ }
//鍥炰紶鎴愬姛搴撳瓨鎵嶅彲鐢�
_stockRepository.Db.Updateable<Dt_StockInfoDetail>().SetColumns(it => new Dt_StockInfoDetail
{
@@ -402,10 +424,29 @@
}
else
{
- _inboundOrderService.Db.Updateable<Dt_InboundOrder>().SetColumns(it => new Dt_InboundOrder { ReturnToMESStatus = 2, Remark = response.ErrorMessage })
+ var detailStatusList = _inboundOrderDetailService.Db.Queryable<Dt_InboundOrderDetail>()
+ .Where(it => it.OrderId == inboundOrder.Id)
+ .Select(it => it.OrderDetailStatus)
+ .ToList();
+
+ bool isAll = detailStatusList.Any()
+ ? detailStatusList.All(x => x == OrderDetailStatusEnum.Over.ObjToInt())
+ : false;
+
+ if (isAll)
+ {
+ _inboundOrderService.Db.Updateable<Dt_InboundOrder>().SetColumns(it => new Dt_InboundOrder { ReturnToMESStatus = 2, Remark = "" })
.Where(it => it.Id == inboundOrder.Id).ExecuteCommand();
- _inboundOrderDetailService.Db.Updateable<Dt_InboundOrderDetail>().SetColumns(it => new Dt_InboundOrderDetail { ReturnToMESStatus = 2 })
- .Where(it => it.OrderId == inboundOrder.Id).ExecuteCommand();
+ _inboundOrderDetailService.Db.Updateable<Dt_InboundOrderDetail>().SetColumns(it => new Dt_InboundOrderDetail { ReturnToMESStatus = 2 })
+ .Where(it => it.OrderId == inboundOrder.Id).ExecuteCommand();
+ }
+ else
+ {
+ _inboundOrderService.Db.Updateable<Dt_InboundOrder>().SetColumns(it => new Dt_InboundOrder { ReturnToMESStatus = 4, Remark = "" })
+ .Where(it => it.Id == inboundOrder.Id).ExecuteCommand();
+ _inboundOrderDetailService.Db.Updateable<Dt_InboundOrderDetail>().SetColumns(it => new Dt_InboundOrderDetail { ReturnToMESStatus = 4 })
+ .Where(it => it.OrderId == inboundOrder.Id).ExecuteCommand();
+ }
}
}
}
@@ -415,7 +456,7 @@
}
else
{
- if (inboundOrder != null && inboundOrder.OrderStatus == InOrderStatusEnum.鍏ュ簱瀹屾垚.ObjToInt())
+ if (inboundOrder != null && inboundOrder.OrderStatus == InOrderStatusEnum.鍏ュ簱瀹屾垚.ObjToInt() && inboundOrder.CreateType == (int)OrderCreateTypeEnum.UpperSystemPush)
{
var feedmodel = new FeedbackInboundRequestModel
{
@@ -455,12 +496,32 @@
var response= responseModel(inboundOrder,2, feedmodel);
- if (response != null && response.IsSuccess)
+ if (response != null && response.IsSuccess && response.Data.Code == "200")
{
- _inboundOrderService.Db.Updateable<Dt_InboundOrder>().SetColumns(it => new Dt_InboundOrder { ReturnToMESStatus = 1, Remark = "" })
+ var detailStatusList = _inboundOrderDetailService.Db.Queryable<Dt_InboundOrderDetail>()
+ .Where(it => it.OrderId == inboundOrder.Id)
+ .Select(it => it.OrderDetailStatus)
+ .ToList();
+
+ bool isAll = detailStatusList.Any()
+ ? detailStatusList.All(x => x == OrderDetailStatusEnum.Over.ObjToInt())
+ : false;
+
+ if (isAll)
+ {
+ _inboundOrderService.Db.Updateable<Dt_InboundOrder>().SetColumns(it => new Dt_InboundOrder { ReturnToMESStatus = 1, Remark = "" })
.Where(it => it.Id == inboundOrder.Id).ExecuteCommand();
- _inboundOrderDetailService.Db.Updateable<Dt_InboundOrderDetail>().SetColumns(it => new Dt_InboundOrderDetail { ReturnToMESStatus = 1 })
- .Where(it => it.OrderId == inboundOrder.Id).ExecuteCommand();
+ _inboundOrderDetailService.Db.Updateable<Dt_InboundOrderDetail>().SetColumns(it => new Dt_InboundOrderDetail { ReturnToMESStatus = 1 })
+ .Where(it => it.OrderId == inboundOrder.Id).ExecuteCommand();
+ }
+ else
+ {
+ _inboundOrderService.Db.Updateable<Dt_InboundOrder>().SetColumns(it => new Dt_InboundOrder { ReturnToMESStatus = 3, Remark = "" })
+ .Where(it => it.Id == inboundOrder.Id).ExecuteCommand();
+ _inboundOrderDetailService.Db.Updateable<Dt_InboundOrderDetail>().SetColumns(it => new Dt_InboundOrderDetail { ReturnToMESStatus = 3 })
+ .Where(it => it.OrderId == inboundOrder.Id).ExecuteCommand();
+ }
+
//鍥炰紶鎴愬姛搴撳瓨鎵嶅彲鐢�
_stockRepository.Db.Updateable<Dt_StockInfoDetail>().SetColumns(it => new Dt_StockInfoDetail
{
@@ -469,10 +530,29 @@
}
else
{
- _inboundOrderService.Db.Updateable<Dt_InboundOrder>().SetColumns(it => new Dt_InboundOrder { ReturnToMESStatus = 2, Remark = response.ErrorMessage })
+ var detailStatusList = _inboundOrderDetailService.Db.Queryable<Dt_InboundOrderDetail>()
+ .Where(it => it.OrderId == inboundOrder.Id)
+ .Select(it => it.OrderDetailStatus)
+ .ToList();
+
+ bool isAll = detailStatusList.Any()
+ ? detailStatusList.All(x => x == OrderDetailStatusEnum.Over.ObjToInt())
+ : false;
+
+ if (isAll)
+ {
+ _inboundOrderService.Db.Updateable<Dt_InboundOrder>().SetColumns(it => new Dt_InboundOrder { ReturnToMESStatus = 2, Remark = "" })
.Where(it => it.Id == inboundOrder.Id).ExecuteCommand();
- _inboundOrderDetailService.Db.Updateable<Dt_InboundOrderDetail>().SetColumns(it => new Dt_InboundOrderDetail { ReturnToMESStatus = 2 })
- .Where(it => it.OrderId == inboundOrder.Id).ExecuteCommand();
+ _inboundOrderDetailService.Db.Updateable<Dt_InboundOrderDetail>().SetColumns(it => new Dt_InboundOrderDetail { ReturnToMESStatus = 2 })
+ .Where(it => it.OrderId == inboundOrder.Id).ExecuteCommand();
+ }
+ else
+ {
+ _inboundOrderService.Db.Updateable<Dt_InboundOrder>().SetColumns(it => new Dt_InboundOrder { ReturnToMESStatus = 4, Remark = "" })
+ .Where(it => it.Id == inboundOrder.Id).ExecuteCommand();
+ _inboundOrderDetailService.Db.Updateable<Dt_InboundOrderDetail>().SetColumns(it => new Dt_InboundOrderDetail { ReturnToMESStatus = 4 })
+ .Where(it => it.OrderId == inboundOrder.Id).ExecuteCommand();
+ }
}
}
}
@@ -1011,6 +1091,7 @@
stockInfo.LocationCode = locationInfo.LocationCode;
stockInfo.PalletCode = task.PalletCode;
stockInfo.LocationCode = task.TargetAddress;
+ stockInfo.Remark ="";
stockInfo.StockStatus = StockStatusEmun.鍏ュ簱瀹屾垚.ObjToInt();
_stockRepository.UpdateData(stockInfo);
@@ -1266,6 +1347,7 @@
// 鏇存柊搴撳瓨淇℃伅
stockInfo.LocationCode = task.TargetAddress;
stockInfo.StockStatus = StockStatusEmun.鍏ュ簱瀹屾垚.ObjToInt();
+ stockInfo.Remark = "";
// 鏇存柊搴撳瓨鏄庣粏鐘舵��
if (stockInfo.Details != null && stockInfo.Details.Any())
@@ -2154,7 +2236,7 @@
/// <summary>
/// 鐩樼偣鍑哄簱瀹屾垚
/// </summary>
- public WebResponseContent OutInventoryTaskCompleted(Dt_Task task)
+ public async Task<WebResponseContent> OutInventoryTaskCompleted(Dt_Task task)
{
WebResponseContent content = new WebResponseContent();
try
@@ -2179,7 +2261,7 @@
{
return content.Error($"鐩樼偣鍗晎task.OrderNo}鐩樼偣宸插畬鎴愭垨鏈紑濮�");
}
- if (stockInfo.StockStatus != StockStatusEmun.鍑哄簱閿佸畾.ObjToInt())
+ if (stockInfo.StockStatus != StockStatusEmun.鐩樼偣鍑哄簱閿佸畾.ObjToInt())
{
return content.Error($"{stockInfo.PalletCode}搴撳瓨鐘舵�佷笉姝g‘");
}
@@ -2205,7 +2287,7 @@
catch (Exception ex)
{
_unitOfWorkManage.RollbackTran();
- content.Error(ex.Message);
+ return await Task.FromResult(WebResponseContent.Instance.Error(ex.Message));
}
return content;
}
@@ -2271,7 +2353,7 @@
{
_logger.LogInformation($"InEmptyTaskCompleted AddLocationStatusChangeRecord : {ex.Message} ");
}
- return content;
+ return content.OK();
}
catch (Exception ex)
{
@@ -2374,6 +2456,263 @@
return await Task.FromResult(WebResponseContent.Instance.Error(ex.Message));
}
}
+
+ /// <summary>
+ /// 浠诲姟鍙栨秷
+ /// </summary>
+ /// <param name="taskCodes"></param>
+ /// <returns></returns>
+ /// <summary>
+ public async Task<WebResponseContent> TaskCancel(List<int> taskCodes)
+ {
+ try
+ {
+ if (taskCodes == null || !taskCodes.Any())
+ {
+ return WebResponseContent.Instance.Error("鍙栨秷鐨勪换鍔″彿涓嶈兘涓虹┖");
+ }
+
+ //var taskCancelUrl = AppSettings.GetValue("TaskCancelUrl");
+ //TaskCancelRequest taskc = new TaskCancelRequest();
+ //taskc.TaskCodes = taskCodes.Select(x => x.ToString()).ToList();
+
+ //string json = JsonConvert.SerializeObject(taskc);
+
+ //using var clientHttp = new HttpClient();
+ //var content = new StringContent(json, Encoding.UTF8, "application/json");
+
+ //HttpResponseMessage response = await clientHttp.PostAsync(taskCancelUrl,content);
+
+ //string responseJson = await response.Content.ReadAsStringAsync();
+ //TaskCancelApiResponse apiResponse = JsonConvert.DeserializeObject<TaskCancelApiResponse>(responseJson);
+
+ //if (apiResponse.Code != 0)
+ //{
+ // return WebResponseContent.Instance.Error($"璇锋眰澶辫触锛歿apiResponse.Msg}");
+ //}
+ _unitOfWorkManage.BeginTran();
+
+ var tasks = await Db.Queryable<Dt_Task>()
+ .Where(x => taskCodes.Contains(x.TaskNum))
+ .ToListAsync();
+
+ if (!tasks.Any())
+ {
+ _unitOfWorkManage.RollbackTran();
+ return WebResponseContent.Instance.Error("鏈壘鍒板搴旂殑浠诲姟淇℃伅");
+ }
+
+ int inPickType = TaskTypeEnum.InPick.ObjToInt();
+ var inboundTypes = new List<int>
+ {
+ TaskTypeEnum.InAllocate.ObjToInt(),
+ TaskTypeEnum.InEmpty.ObjToInt(),
+ TaskTypeEnum.Inbound.ObjToInt(),
+ TaskTypeEnum.InInventory.ObjToInt(),
+ TaskTypeEnum.InQuality.ObjToInt()
+ };
+ var outboundTypes = new List<int>
+ {
+ TaskTypeEnum.Outbound.ObjToInt(),
+ TaskTypeEnum.OutAllocate.ObjToInt()
+ };
+
+ foreach (var task in tasks)
+ {
+ if (task.TaskStatus == TaskStatusEnum.Cancel.ObjToInt())
+ continue;
+
+ var stock = await _stockRepository.QueryFirstAsync(x => x.PalletCode == task.PalletCode);
+ if (stock == null)
+ throw new Exception($"鎵樼洏 {task.PalletCode} 鏈壘鍒板簱瀛樹俊鎭�");
+
+ if (task.TaskType == inPickType)
+ {
+ stock.StockStatus = StockStatusEmun.鍑哄簱瀹屾垚.ObjToInt();
+ }
+ else if (inboundTypes.Contains(task.TaskType))
+ {
+ stock.StockStatus = StockStatusEmun.缁勭洏鏆傚瓨.ObjToInt();
+ }
+ else if (outboundTypes.Contains(task.TaskType))
+ {
+ stock.StockStatus = StockStatusEmun.鍏ュ簱瀹屾垚.ObjToInt();
+
+ var outStockLock = await _outStockLockInfoService.Db
+ .Queryable<Dt_OutStockLockInfo>()
+ .Where(x => x.PalletCode == task.PalletCode)
+ .FirstAsync();
+
+ if (outStockLock == null)
+ throw new Exception($"鎵樼洏 {task.PalletCode} 鏈壘鍒板嚭搴撻攣瀹氫俊鎭�");
+
+ int detailId = outStockLock.OrderDetailIds.ObjToInt();
+ var outboundDetail = await _outboundOrderDetailService.Db
+ .Queryable<Dt_OutboundOrderDetail>()
+ .Where(x => x.Id == detailId)
+ .FirstAsync();
+
+ if (outboundDetail == null)
+ throw new Exception($"鍑哄簱鏄庣粏ID {detailId} 涓嶅瓨鍦�");
+
+ if (outboundDetail.LockQuantity < outStockLock.AssignQuantity)
+ throw new Exception($"鍑哄簱鏄庣粏 {detailId} 閿佸畾鏁伴噺涓嶈冻");
+
+ outboundDetail.LockQuantity -= outStockLock.AssignQuantity;
+ _outboundOrderDetailService.UpdateData(outboundDetail);
+
+ _outboundLockInfoRepository.DeleteAndMoveIntoHty(outStockLock, OperateTypeEnum.浜哄伐鍒犻櫎);
+ }
+
+ await _stockRepository.UpdateDataAsync(stock);
+
+ task.TaskStatus = TaskStatusEnum.Cancel.ObjToInt();
+ bool archiveSuccess = _task_HtyService.DeleteAndMoveIntoHty(task, OperateTypeEnum.浜哄伐鍒犻櫎);
+
+ if (!archiveSuccess)
+ {
+ await Db.Deleteable(task).ExecuteCommandAsync();
+ }
+ }
+
+ _unitOfWorkManage.CommitTran();
+ return WebResponseContent.Instance.OK("浠诲姟鍙栨秷鎴愬姛");
+ }
+ catch (Exception ex)
+ {
+ _unitOfWorkManage.RollbackTran();
+ _logger.LogError(ex, "浠诲姟鍙栨秷寮傚父");
+ return WebResponseContent.Instance.Error($"浠诲姟鍙栨秷澶辫触锛歿ex.Message}");
+ }
+ }
+
+ public async Task<WebResponseContent> AreaRelocationTaskCompleted(Dt_Task task)
+ {
+ WebResponseContent content = new WebResponseContent();
+ try
+ {
+ if (task == null || string.IsNullOrEmpty(task.PalletCode) || string.IsNullOrEmpty(task.TargetAddress))
+ {
+ return WebResponseContent.Instance.Error("绉诲簱浠诲姟淇℃伅涓嶅畬鏁达紙鎵樼洏鍙�/鐩爣璐т綅涓虹┖锛�");
+ }
+
+ // 2. 鏌ヨ鎵樼洏搴撳瓨淇℃伅
+ Dt_StockInfo stockInfo = await _stockRepository.Db.Queryable<Dt_StockInfo>()
+ .Includes(x => x.Details)
+ .Where(x => x.PalletCode == task.PalletCode)
+ .FirstAsync();
+
+ if (stockInfo == null)
+ {
+ return WebResponseContent.Instance.Error($"鏈壘鍒版墭鐩榌{task.PalletCode}]瀵瑰簲鐨勭粍鐩樹俊鎭�");
+ }
+
+ // 闈炵┖鎵樼洏蹇呴』鏈夋槑缁�
+ if (stockInfo.Details.Count == 0 && stockInfo.PalletType != PalletTypeEnum.Empty.ObjToInt())
+ {
+ _logger.LogInformation($"TaskService RelocationTaskCompleted: 鏈壘鍒拌鎵樼洏搴撳瓨鏄庣粏淇℃伅.{task.TaskNum}");
+ return WebResponseContent.Instance.Error($"鏈壘鍒拌鎵樼洏[{task.PalletCode}]搴撳瓨鏄庣粏淇℃伅");
+ }
+
+ // 3. 鏌ヨ鐩爣璐т綅+鍘熻揣浣嶄俊鎭�
+ Dt_LocationInfo targetLocationInfo = _locationInfoService.Repository.QueryFirst(x => x.LocationCode == task.TargetAddress);
+ if (targetLocationInfo == null)
+ {
+ return content.Error($"鏈壘鍒板搴旂殑缁堢偣璐т綅[{task.TargetAddress}]淇℃伅");
+ }
+
+ // 鍘熻揣浣嶄俊鎭�
+ Dt_LocationInfo oldLocationInfo = null;
+ if (!string.IsNullOrEmpty(stockInfo.LocationCode))
+ {
+ oldLocationInfo = _locationInfoService.Repository.QueryFirst(x => x.LocationCode == stockInfo.LocationCode);
+ if (oldLocationInfo == null)
+ {
+ return content.Error($"鏈壘鍒板師璐т綅[{stockInfo.LocationCode}]淇℃伅");
+ }
+ }
+
+ // 4. 璐т綅鐘舵�佹牎楠�
+ if (targetLocationInfo.LocationStatus == LocationStatusEnum.InStock.ObjToInt())
+ {
+ return WebResponseContent.Instance.Error($"鐩爣璐т綅[{task.TargetAddress}]鐘舵�佷笉姝g‘锛堝綋鍓嶄负宸插崰鐢級");
+ }
+
+ // 5. 寮�鍚簨鍔″鐞嗘牳蹇冮�昏緫
+ _unitOfWorkManage.BeginTran();
+
+ // 5.1 璁板綍鐩爣璐т綅鍘熺姸鎬侊紝鏇存柊涓哄崰鐢�
+ var beforeTargetLocationStatus = targetLocationInfo.LocationStatus;
+ targetLocationInfo.LocationStatus = stockInfo.PalletType == PalletTypeEnum.Empty.ObjToInt()
+ ? LocationStatusEnum.Pallet.ObjToInt()
+ : LocationStatusEnum.InStock.ObjToInt();
+ _locationInfoService.Repository.UpdateData(targetLocationInfo);
+
+ // 5.2 閲婃斁鍘熻揣浣�
+ int beforeOldLocationStatus = 0;
+ if (oldLocationInfo != null)
+ {
+ beforeOldLocationStatus = oldLocationInfo.LocationStatus;
+ // 鍘熻揣浣嶆仮澶嶄负绌洪棽
+ oldLocationInfo.LocationStatus = LocationStatusEnum.Free.ObjToInt();
+ _locationInfoService.Repository.UpdateData(oldLocationInfo);
+ }
+ // 5.4 鏇存柊搴撳瓨涓讳俊鎭紙缁戝畾鏂拌揣浣嶏級
+ string oldLocationCode = stockInfo.LocationCode; // 璁板綍鍘熻揣浣�
+ stockInfo.LocationCode = targetLocationInfo.LocationCode; // 缁戝畾鐩爣璐т綅
+ stockInfo.PalletCode = task.PalletCode;
+ stockInfo.StockStatus = StockStatusEmun.鍏ュ簱瀹屾垚.ObjToInt();
+
+ _stockRepository.UpdateData(stockInfo);
+
+ // 5.5 鏇存柊浠诲姟鐘舵�佷负瀹屾垚
+ task.TaskStatus = TaskStatusEnum.Finish.ObjToInt();
+ var result = _task_HtyService.DeleteAndMoveIntoHty(task, OperateTypeEnum.鑷姩瀹屾垚);
+
+ // 鎻愪氦浜嬪姟
+ _unitOfWorkManage.CommitTran();
+
+ // 浠诲姟褰掓。澶辫触鍒欑洿鎺ュ垹闄�
+ if (!result)
+ {
+ await Db.Deleteable(task).ExecuteCommandAsync();
+ }
+ try
+ {
+ // 璁板綍鐩爣璐т綅鐘舵�佸彉鏇�
+ _locationStatusChangeRecordService.AddLocationStatusChangeRecord(
+ targetLocationInfo,
+ beforeTargetLocationStatus,
+ StockChangeType.Inbound.ObjToInt(),
+ $"绉诲簱鍏ュ簱锛堝師璐т綅锛歿oldLocationCode}锛�",
+ task.TaskNum);
+
+ // 璁板綍鍘熻揣浣嶇姸鎬佸彉鏇达紙鑻ユ湁锛�
+ if (oldLocationInfo != null)
+ {
+ _locationStatusChangeRecordService.AddLocationStatusChangeRecord(
+ oldLocationInfo,
+ beforeOldLocationStatus,
+ StockChangeType.Outbound.ObjToInt(),
+ $"绉诲簱鍑哄簱锛堢洰鏍囪揣浣嶏細{targetLocationInfo.LocationCode}锛�",
+ task.TaskNum);
+ }
+ }
+ catch (Exception ex)
+ {
+ _logger.LogInformation($"RelocationTaskCompleted AddLocationStatusChangeRecord : {ex.Message} ");
+ }
+
+ return content.OK();
+ }
+ catch (Exception ex)
+ {
+ // 浜嬪姟鍥炴粴
+ _unitOfWorkManage.RollbackTran();
+ _logger.LogError($"RelocationTaskCompleted 澶勭悊澶辫触锛歿ex.Message}", ex);
+ return await Task.FromResult(WebResponseContent.Instance.Error($"绉诲簱浠诲姟澶勭悊澶辫触锛歿ex.Message}"));
+ }
+ }
}
}
--
Gitblit v1.9.3