From 696edbff3c8812e4b820f624d66a02ae6ddb1a06 Mon Sep 17 00:00:00 2001
From: 647556386 <647556386@qq.com>
Date: 星期四, 16 四月 2026 13:40:18 +0800
Subject: [PATCH] Merge branch 'htq20251215' of http://115.159.85.185:8098/r/ZhongRui/ALDbanyunxiangmu into htq20251215
---
项目代码/WMS无仓储版/WIDESEA_WMSServer/WIDESEA_TaskInfoService/TaskService.cs | 2315 +++++++++++++++++++++++++++++++++++++++++++++++++++++-----
1 files changed, 2,083 insertions(+), 232 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 12d77ec..ed624ac 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"
@@ -18,15 +18,20 @@
using AutoMapper;
using Dm.filter;
using MailKit.Search;
+using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Logging;
using Newtonsoft.Json;
+using Newtonsoft.Json.Serialization;
using Org.BouncyCastle.Asn1.Ocsp;
using Org.BouncyCastle.Asn1.Pkcs;
using SqlSugar;
using System.Reflection;
using System.Reflection.Emit;
+using System.Text;
using System.Threading.Tasks;
using System.Xml.Linq;
+using WIDESEA_BasicService;
+using WIDESEA_Common.AllocateEnum;
using WIDESEA_Common.CommonEnum;
using WIDESEA_Common.LocationEnum;
using WIDESEA_Common.OrderEnum;
@@ -38,10 +43,13 @@
using WIDESEA_Core.BaseServices;
using WIDESEA_Core.Enums;
using WIDESEA_Core.Helper;
+using WIDESEA_Core.Util;
using WIDESEA_DTO.Allocate;
+using WIDESEA_DTO.Base;
using WIDESEA_DTO.Basic;
using WIDESEA_DTO.Inbound;
using WIDESEA_DTO.Outbound;
+using WIDESEA_DTO.ReturnMES;
using WIDESEA_DTO.Task;
using WIDESEA_IAllocateService;
using WIDESEA_IBasicService;
@@ -51,7 +59,10 @@
using WIDESEA_IStockService;
using WIDESEA_ITaskInfoService;
using WIDESEA_Model.Models;
+using WIDESEA_Model.Models.Basic;
+using WIDESEA_Model.Models.Check;
using WIDESEA_Model.Models.Outbound;
+using static HslCommunication.Profinet.Knx.KnxCode;
namespace WIDESEA_TaskInfoService
{
@@ -66,16 +77,29 @@
private readonly IInboundOrderService _inboundOrderService;
private readonly IInboundOrderDetailService _inboundOrderDetailService;
+ private readonly IRepository<Dt_AllocateOrderDetail> _allocateOrderDetailRepository;
+ private readonly IRepository<Dt_AllocateOrder> _allocateOrderRepository;
+ private readonly IRepository<Dt_ReCheckOrder> _reCheckOrderRepository;
private readonly IRepository<Dt_OutboundBatch> _OutboundBatchRepository;
private readonly IOutboundOrderService _outboundOrderService;
private readonly IOutboundOrderDetailService _outboundOrderDetailService;
private readonly IOutStockLockInfoService _outStockLockInfoService;
private readonly ILocationStatusChangeRecordService _locationStatusChangeRecordService;
+ private readonly IMaterialUnitService _materialUnitService;
private readonly IESSApiService _eSSApiService;
private readonly IStockService _stockService;
private readonly IRecordService _recordService;
private readonly IAllocateService _allocateService;
private readonly IInvokeMESService _invokeMESService;
+ private readonly ITask_HtyService _task_HtyService;
+ private readonly IRepository<Dt_AllocateMaterialInfo> _allocateMaterialInfo;
+ private readonly IRepository<Dt_AllocateMaterialInfo_Hty> _allocateMaterialInfo_Hty;
+ private readonly HttpClientHelper _httpClientHelper;
+ private readonly IBasicService _basicService;
+ 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()
@@ -95,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) : 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;
@@ -114,8 +138,34 @@
_outStockLockInfoService = outStockLockInfoService;
_allocateService = allocateService;
_OutboundBatchRepository = outboundBatchRepository;
+ _reCheckOrderRepository = reCheckOrderRepository;
+ _allocateOrderDetailRepository = allocateOrderDetailRepository;
+ _allocateOrderRepository = allocateOrderRepository;
+ _materialUnitService = materialUnitService;
+ _task_HtyService = task_HtyService;
+ _allocateMaterialInfo = allocateMaterialInfo;
+ _allocateMaterialInfo_Hty = allocateMaterialInfo_Hty;
+ _httpClientHelper = httpClientHelper;
+ _basicService = basicService;
+ _takeStockOrder = takeStockOrder;
+ _locationTypeRepository = locationTypeRepository;
+ _warehouseAreaRepository = warehouseAreaRepository;
+ _outboundLockInfoRepository = outboundLockInfoRepository;
}
+ public async Task TaskStatusChange(string taskNum, TaskStatusEnum taskStatusEnum)
+ {
+ if (int.TryParse(taskNum, out var newTaskNum))
+ {
+ await Db.Updateable<Dt_Task>().SetColumns(it => new Dt_Task
+ {
+ TaskStatus = taskStatusEnum.ObjToInt()
+ })
+ .Where(it => it.TaskNum == newTaskNum)
+ .ExecuteCommandAsync();
+ }
+
+ }
/// <summary>
///
@@ -240,11 +290,28 @@
_inboundOrderService.UpdateData(inboundOrder);
}
}
+ Dt_OutboundOrder outboundOrder = _outboundOrderService.Db.Queryable<Dt_OutboundOrder>().Where(x => x.OrderNo == stockInfo.Details.FirstOrDefault().OrderNo).Includes(x => x.Details).First();
+
+ if (outboundOrder != null)
+ {
+ foreach (var item in stockInfo.Details.Where(x => x.OrderNo == outboundOrder.OrderNo).ToList())
+ {
+ var inbounddetail = _allocateMaterialInfo.QueryFirst(x => x.OrderNo == item.OrderNo && x.Barcode == item.Barcode);
+ if (inbounddetail != null)
+ {
+ var alldelete = _allocateMaterialInfo.DeleteAndMoveIntoHty(inbounddetail, OperateTypeEnum.鑷姩鍒犻櫎);
+ if (!alldelete)
+ {
+ await Db.Deleteable(task).ExecuteCommandAsync();
+ }
+ }
+ }
+ }
stockInfo.LocationCode = task.TargetAddress;
stockInfo.StockStatus = StockStatusEmun.鍏ュ簱瀹屾垚.ObjToInt();
stockInfo.Details.ForEach(x =>
{
- x.Status = StockStatusEmun.鍏ュ簱瀹屾垚.ObjToInt();
+ x.Status = inboundOrders.FirstOrDefault().CreateType == (int)OrderCreateTypeEnum.CreateInSystem ? StockStatusEmun.鍏ュ簱瀹屾垚.ObjToInt():StockStatusEmun.鍏ュ簱纭.ObjToInt();
});
_stockService.StockInfoService.Repository.UpdateData(stockInfo);
_stockService.StockInfoDetailService.Repository.UpdateData(stockInfo.Details);
@@ -264,11 +331,20 @@
task.TaskStatus = TaskStatusEnum.Finish.ObjToInt();
- BaseDal.DeleteAndMoveIntoHty(task, App.User.UserId == 0 ? OperateTypeEnum.鑷姩瀹屾垚 : OperateTypeEnum.浜哄伐瀹屾垚);
-
- _locationStatusChangeRecordService.AddLocationStatusChangeRecord(locationInfo, beforeStatus, StockChangeType.Inbound.ObjToInt(), "", task.TaskNum);
-
- _recordService.StockQuantityChangeRecordService.AddStockChangeRecord(stockInfo, stockInfo.Details, beforeQuantity, stockInfo.Details.Sum(x => x.StockQuantity) + beforeQuantity, WIDESEA_Common.StockEnum.StockChangeType.MaterielGroup);
+ // BaseDal.DeleteAndMoveIntoHty(task, App.User.UserId == 0 ? OperateTypeEnum.鑷姩瀹屾垚 : OperateTypeEnum.浜哄伐瀹屾垚);
+ var result = _task_HtyService.DeleteAndMoveIntoHty(task, OperateTypeEnum.鑷姩瀹屾垚);
+ if (!result)
+ {
+ await Db.Deleteable(task).ExecuteCommandAsync();
+ }
+ try
+ {
+ _locationStatusChangeRecordService.AddLocationStatusChangeRecord(locationInfo, beforeStatus, StockChangeType.Inbound.ObjToInt(), "", task.TaskNum);
+ }
+ catch (Exception ex)
+ {
+ _logger.LogInformation($"InboundTaskCompleted AddLocationStatusChangeRecord : {ex.Message} ");
+ }
try
{
foreach (var inboundOrder in inboundOrders)
@@ -282,7 +358,7 @@
{
ReqCode = Guid.NewGuid().ToString(),
ReqTime = DateTime.Now.ToString(),
- BusinessType = "2",
+ BusinessType = BusinessTypeEnum.澶栭儴浠撳簱璋冩櫤浠�.ObjToInt().ToString(),
FactoryArea = inboundOrder.FactoryArea,
OperationType = 1,
Operator = inboundOrder.Operator,
@@ -292,8 +368,9 @@
Details = new List<AllocateDtoDetail>()
};
-
- var groupedData = inboundOrder.Details.GroupBy(item => new { item.MaterielCode, item.SupplyCode, item.BatchNo, item.lineNo, item.BarcodeUnit, item.WarehouseCode })
+ var query = inboundOrder.Details.AsQueryable();
+ query = query.Where(item => item.ReturnToMESStatus == 0);
+ var groupedData = query.GroupBy(item => new { item.MaterielCode, item.lineNo, item.BarcodeUnit, item.WarehouseCode })
.Select(group => new AllocateDtoDetail
{
MaterialCode = group.Key.MaterielCode,
@@ -308,32 +385,78 @@
Qty = row.BarcodeQty,
BatchNo = row.BatchNo,
SupplyCode = row.SupplyCode,
- Unit = row.Unit
+ Unit = row.BarcodeUnit
}).ToList()
}).ToList();
allocatefeedmodel.Details = groupedData;
- var result = await _invokeMESService.FeedbackAllocate(allocatefeedmodel);
- if (result != null && result.code == 200)
+ var response = responseModel(inboundOrder, 3, null, allocatefeedmodel);
+ 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
+ {
+ Status = StockStatusEmun.鍏ュ簱瀹屾垚.ObjToInt()
+ }).Where(it => it.OrderNo == inboundOrder.InboundOrderNo).ExecuteCommand();
+ }
+ else
+ {
+ 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();
+ }
+ 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();
+ }
}
}
}
else if (inboundOrder.OrderType == InOrderTypeEnum.ReCheck.ObjToInt()) //閲嶆鍏ュ簱
{
-
- }
- else if (inboundOrder.OrderType == InOrderTypeEnum.InternalAllocat.ObjToInt()) //鏅轰粨璋冩櫤浠�
- {
- _logger.LogInformation($"InboundTaskCompleted 鍥炲啓MES : {inboundOrder.InboundOrderNo } ,ordertype: {InOrderTypeEnum.InternalAllocat.ObjToInt()} " );
+ //涓嶉渶瑕佸洖浼犮�傚崰涓�涓綅缃��
}
else
{
- if (inboundOrder != null && inboundOrder.OrderStatus == InOrderStatusEnum.鍏ュ簱瀹屾垚.ObjToInt())
+ if (inboundOrder != null && inboundOrder.OrderStatus == InOrderStatusEnum.鍏ュ簱瀹屾垚.ObjToInt() && inboundOrder.CreateType == (int)OrderCreateTypeEnum.UpperSystemPush)
{
var feedmodel = new FeedbackInboundRequestModel
{
@@ -348,8 +471,9 @@
details = new List<FeedbackInboundDetailsModel>()
};
-
- var groupedData = inboundOrder.Details.GroupBy(item => new { item.MaterielCode, item.SupplyCode, item.BatchNo, item.lineNo, item.BarcodeUnit, item.WarehouseCode })
+ var query = inboundOrder.Details.AsQueryable();
+ query = query.Where(item => item.ReturnToMESStatus == 0);
+ var groupedData = query.GroupBy(item => new { item.MaterielCode, item.SupplyCode, item.BatchNo, item.lineNo, item.BarcodeUnit, item.WarehouseCode })
.Select(group => new FeedbackInboundDetailsModel
{
materialCode = group.Key.MaterielCode,
@@ -368,13 +492,67 @@
}).ToList();
feedmodel.details = groupedData;
- var result = await _invokeMESService.FeedbackInbound(feedmodel);
- if (result != null && result.code == 200)
+ //var feedbackresult = await _invokeMESService.FeedbackInbound(feedmodel);
+
+ var response= responseModel(inboundOrder,2, feedmodel);
+
+ 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
+ {
+ Status = StockStatusEmun.鍏ュ簱瀹屾垚.ObjToInt()
+ }).Where(it => it.OrderNo == inboundOrder.InboundOrderNo).ExecuteCommand();
+ }
+ else
+ {
+ 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();
+ }
+ 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();
+ }
}
}
}
@@ -389,12 +567,360 @@
return WebResponseContent.Instance.OK();
}
+ public async Task<WebResponseContent> RelocationTaskCompleted(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 = LocationStatusEnum.InStock.ObjToInt();
+ _locationInfoService.Repository.UpdateData(targetLocationInfo);
+
+ // 5.2 閲婃斁鍘熻揣浣�
+ int beforeOldLocationStatus = 0;
+ if (oldLocationInfo != null)
+ {
+ beforeOldLocationStatus = oldLocationInfo.LocationStatus;
+ // 鍘熻揣浣嶆仮澶嶄负绌洪棽
+ oldLocationInfo.LocationStatus = stockInfo.PalletType == PalletTypeEnum.Empty.ObjToInt()
+ ? LocationStatusEnum.Pallet.ObjToInt()
+ : LocationStatusEnum.Free.ObjToInt();
+ _locationInfoService.Repository.UpdateData(oldLocationInfo);
+ }
+ var stockLockInfo = _outStockLockInfoService.Db.Queryable<Dt_OutboundLockInfo_Hty>().Where(x => x.PalletCode == stockInfo.PalletCode && x.TaskNum == task.TaskNum).First();
+ var allocateOrderToWarehouse = _allocateOrderRepository.Db.Queryable<Dt_AllocateOrder>().Where(x => x.OrderNo == stockLockInfo.OrderNo).First();
+ // 5.3 鏇存柊搴撳瓨鏄庣粏鐘舵�侊紙绉诲簱瀹屾垚锛�
+ stockInfo.Details.ForEach(x =>
+ {
+ x.Status = StockStatusEmun.鍏ュ簱瀹屾垚.ObjToInt();
+ x.WarehouseCode = allocateOrderToWarehouse.ToWarehouse;
+ });
+ _stockService.StockInfoDetailService.Repository.UpdateData(stockInfo.Details);
+
+ // 5.4 鏇存柊搴撳瓨涓讳俊鎭紙缁戝畾鏂拌揣浣嶏級
+ string oldLocationCode = stockInfo.LocationCode; // 璁板綍鍘熻揣浣�
+ stockInfo.LocationCode = targetLocationInfo.LocationCode; // 缁戝畾鐩爣璐т綅
+ stockInfo.PalletCode = task.PalletCode;
+ stockInfo.StockStatus = StockStatusEmun.鍏ュ簱瀹屾垚.ObjToInt();
+
+ var name =_warehouseAreaRepository.Db.Queryable<Dt_WarehouseArea>().Where(x => x.Code == allocateOrderToWarehouse.ToWarehouse).First();
+ var locationType =_locationTypeRepository.QueryFirst(x => x.LocationTypeDesc.Equals(name.Name));
+ if(locationType != null)
+ {
+ stockInfo.LocationType = locationType.LocationType;
+ }
+ _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();
+ }
+
+ // 6. 澶勭悊鍑哄簱鍗�+璋冩嫧鐗╂枡淇℃伅
+ Dt_OutboundOrder outboundOrder = null;
+ //var firstDetail = stockInfo.Details.FirstOrDefault();
+ if (stockLockInfo != null && !string.IsNullOrEmpty(stockLockInfo.OrderNo))
+ {
+ outboundOrder = _outboundOrderService.Db.Queryable<Dt_OutboundOrder>()
+ .Where(x => x.OrderNo == stockLockInfo.OrderNo)
+ .Includes(x => x.Details)
+ .First();
+ string Operator = outboundOrder.Modifier;
+ if (outboundOrder != null)
+ {
+ var allocatInfo =_allocateMaterialInfo.Db.Queryable<Dt_AllocateMaterialInfo>().Where(x => x.OrderNo == outboundOrder.OrderNo).ToList();
+ // 鍒犻櫎璋冩嫧鐗╂枡淇℃伅
+ foreach (var item in allocatInfo)
+ {
+ var inbounddetail = _allocateMaterialInfo.QueryFirst(x => x.OrderNo == item.OrderNo && x.Barcode == item.Barcode);
+ if (inbounddetail != null)
+ {
+ var alldelete = _allocateMaterialInfo.DeleteAndMoveIntoHty(inbounddetail, OperateTypeEnum.鑷姩鍒犻櫎);
+ if (!alldelete)
+ {
+ await Db.Deleteable(task).ExecuteCommandAsync();
+ }
+ }
+ }
+
+ if (outboundOrder.Details.All(x => x.OrderDetailStatus == (int)OrderDetailStatusEnum.Over) && !allocatInfo.Any())
+ {
+ outboundOrder.OrderStatus = (int)InOrderStatusEnum.鍏ュ簱瀹屾垚;
+ _outboundOrderService.UpdateData(outboundOrder);
+ }
+
+ // 7. 鍥炶皟MES
+
+ HttpResponseResult<MesResponseDTO> httpResponseResult = new HttpResponseResult<MesResponseDTO>();
+ string reqCode = Guid.NewGuid().ToString();
+ string reqTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
+ string requestData = string.Empty;
+ List<string> lineNos = new List<string>();
+
+ Dt_AllocateMaterialInfo allocateMaterialInfo = _allocateMaterialInfo.QueryFirst(x => x.OrderNo == outboundOrder.OrderNo);
+ // 绉诲簱鍦烘櫙锛氬嚭搴撳畬鎴愪笖鏈洖浼燤ES銆佹棤璋冩嫧鐗╂枡淇℃伅鏃跺洖璋�
+ if (outboundOrder.OrderStatus == OutOrderStatusEnum.鍑哄簱瀹屾垚.ObjToInt() && outboundOrder.ReturnToMESStatus == 0 && allocateMaterialInfo == null)
+ {
+ Dt_AllocateOrder allocateOrder = _allocateOrderRepository.QueryFirst(x => x.OrderNo == outboundOrder.OrderNo);
+ if (allocateOrder == null)
+ {
+ return WebResponseContent.Instance.Error($"鏈壘鍒板搴旂殑璋冩嫧鍗昜{outboundOrder.OrderNo}]");
+ }
+
+ // 鏋勫缓绉诲簱鍥炶皟鏁版嵁
+ AllocationReturnDTO? returnDTO = BuildAllocationFeedbackData(
+ outboundOrder,
+ allocateOrder.FromWarehouse,
+ allocateOrder.ToWarehouse,
+ Operator);
+
+ if (returnDTO == null)
+ {
+ return WebResponseContent.Instance.Error($"鏋勫缓绉诲簱鍥炶皟瀵硅薄澶辫触");
+ }
+
+ string apiUrl = AppSettings.GetValue("AllocationFeedbackUrl");
+ returnDTO.ReqCode = reqCode;
+ returnDTO.ReqTime = reqTime;
+ JsonSerializerSettings settings = new JsonSerializerSettings
+ {
+ ContractResolver = new CamelCasePropertyNamesContractResolver()
+ };
+ requestData = JsonConvert.SerializeObject(returnDTO, settings);
+ lineNos = returnDTO.Details.Select(x => x.LineNo).ToList();
+ httpResponseResult = _httpClientHelper.Post<MesResponseDTO>(apiUrl, requestData);
+ httpResponseResult.ApiUrl = apiUrl;
+ }
+
+ // 8. 澶勭悊MES鍥炶皟缁撴灉
+ bool isSuccess = httpResponseResult.IsSuccess && httpResponseResult.Data?.Code == "200";
+ string message = "鎴愬姛";
+ if (!isSuccess)
+ {
+ if (!httpResponseResult.IsSuccess)
+ {
+ message = $"MES鎺ュ彛杩斿洖閿欒锛孒TTP浠g爜锛歿httpResponseResult.StatusCode}锛屼俊鎭細{httpResponseResult.ErrorMessage}";
+ }
+ else if (httpResponseResult?.Data?.Code != "200")
+ {
+ message = $"璋冪敤MES鎺ュ彛澶辫触锛屼唬鐮侊細{httpResponseResult?.Data?.Code}锛屼俊鎭細{httpResponseResult?.Data?.Message}";
+ }
+ }
+
+ // 9. 璁板綍MES鍥炰紶璁板綍
+ Dt_MesReturnRecord mesReturnRecord = new Dt_MesReturnRecord()
+ {
+ ApiUrl = httpResponseResult.ApiUrl,
+ InterfaceType = outboundOrder.OrderType == 0 ? 1 : 3, // 绉诲簱鎺ュ彛绫诲瀷锛氬鐢ㄨ皟鎷ㄧ被鍨�3
+ OrderId = outboundOrder.Id,
+ OrderNo = outboundOrder.OrderNo,
+ RequestCode = reqCode,
+ RequestData = requestData,
+ FailureReason = message,
+ LastReturnTime = DateTime.Now,
+ HttpStatusCode = httpResponseResult.StatusCode.ObjToInt(),
+ ResponseData = httpResponseResult.Content,
+ ReturnType = 0,
+ ReturnCount = 1,
+ ReturnStatus = isSuccess ? 1 : 2,
+ SuccessTime = isSuccess ? DateTime.Now : null
+ };
+
+ // 寮�鍚簨鍔′繚瀛楳ES璁板綍+鏇存柊鍑哄簱鍗曠姸鎬�
+ _unitOfWorkManage.BeginTran();
+ _unitOfWorkManage.Db.Insertable(mesReturnRecord).ExecuteCommand();
+
+ List<Dt_OutboundOrderDetail> outboundOrderDetails = outboundOrder.Details.Where(x => lineNos.Contains(x.lineNo)).ToList();
+ outboundOrderDetails.ForEach(x =>
+ {
+ if (x.OverOutQuantity == x.OrderQuantity - x.MoveQty)
+ {
+ x.ReturnToMESStatus = isSuccess ? 1 : 2;
+ }
+ else
+ {
+ x.ReturnToMESStatus = isSuccess ? 3 : 4;
+ }
+ x.CurrentDeliveryQty = 0;
+ x.ReturnJsonData = "";
+ });
+
+ mesReturnRecord.ReturnType = outboundOrder.Details.Count == outboundOrderDetails.Count ? 1 : 2;
+
+ if (outboundOrder.Details.Count == outboundOrderDetails.Count && outboundOrderDetails.All(x => x.ReturnToMESStatus == 1 || x.ReturnToMESStatus == 2))
+ {
+ outboundOrder.ReturnToMESStatus = isSuccess ? 1 : 2;
+ }
+ else
+ {
+ outboundOrder.ReturnToMESStatus = isSuccess ? 3 : 4;
+ }
+
+ _outboundOrderService.Db.Updateable(outboundOrderDetails).ExecuteCommand();
+ _outboundOrderService.UpdateData(outboundOrder);
+
+ _unitOfWorkManage.CommitTran();
+ }
+ }
+
+ // 10. 璁板綍璐т綅鐘舵�佸彉鏇达紙鐩爣璐т綅+鍘熻揣浣嶏級
+ 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;
+ }
+ catch (Exception ex)
+ {
+ // 浜嬪姟鍥炴粴
+ _unitOfWorkManage.RollbackTran();
+ _logger.LogError($"RelocationTaskCompleted 澶勭悊澶辫触锛歿ex.Message}", ex);
+ return await Task.FromResult(WebResponseContent.Instance.Error($"绉诲簱浠诲姟澶勭悊澶辫触锛歿ex.Message}"));
+ }
+ }
+
+ public HttpResponseResult<MesResponseDTO> responseModel(Dt_InboundOrder order, int InterfaceType, FeedbackInboundRequestModel model = null, AllocateDto allocateDto = null)
+ {
+ HttpResponseResult<MesResponseDTO> httpResponseResult = new HttpResponseResult<MesResponseDTO>();
+ string reqCode = Guid.NewGuid().ToString();
+ string reqTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
+ string requestData = string.Empty;
+ string apiUrl = string.Empty;
+ if (model != null)
+ {
+ apiUrl = AppSettings.GetValue("AldMaterialWarehousing");
+ httpResponseResult = _httpClientHelper.Post<MesResponseDTO>(apiUrl, model.Serialize());
+ requestData = model.Serialize();
+ }
+ else
+ {
+ apiUrl = AppSettings.GetValue("AldAllocationOperation");
+ httpResponseResult = _httpClientHelper.Post<MesResponseDTO>(apiUrl, allocateDto.Serialize());
+ requestData = allocateDto.Serialize();
+ }
+ httpResponseResult.ApiUrl = apiUrl;
+ bool isSuccess = httpResponseResult.IsSuccess && httpResponseResult.Data.Code == "200";
+ string message = "鎴愬姛";
+ if (!isSuccess)
+ {
+ if (!httpResponseResult.IsSuccess)
+ {
+ message = $"MES鎺ュ彛杩斿洖閿欒锛孒TTP浠g爜锛歿httpResponseResult.StatusCode}锛屼俊鎭細{httpResponseResult.ErrorMessage}";
+ }
+ else if (httpResponseResult?.Data?.Code != "200")
+ {
+ message = $"璋冪敤MES鎺ュ彛澶辫触锛屼唬鐮侊細{httpResponseResult?.Data?.Code}锛屼俊鎭細{httpResponseResult?.Data?.Message}";
+ }
+ }
+ Dt_MesReturnRecord mesReturnRecord = new Dt_MesReturnRecord()
+ {
+ ApiUrl = httpResponseResult.ApiUrl,
+ InterfaceType = InterfaceType,
+ OrderId = order.Id,
+ OrderNo = order.InboundOrderNo,
+ RequestCode = reqCode,
+ RequestData = requestData,
+ FailureReason = message,
+ LastReturnTime = DateTime.Now,
+ HttpStatusCode = httpResponseResult.StatusCode.ObjToInt(),
+ ResponseData = httpResponseResult.Content,
+ ReturnType = 0,
+ ReturnCount = 1,
+ ReturnStatus = isSuccess ? 1 : 2,
+ SuccessTime = httpResponseResult.IsSuccess ? DateTime.Now : null
+ };
+ _unitOfWorkManage.Db.Insertable(mesReturnRecord).ExecuteCommand();
+
+ return httpResponseResult;
+ }
+
public async Task<WebResponseContent> OutAllocateTaskCompleted(Dt_Task task)
{
_logger.LogInformation($"TaskService OutAllocateTaskCompleted: {task.TaskNum}");
- return await OutboundTaskCompleted(task);
+ return await OutboundTaskCompleted(task);
}
public async Task<WebResponseContent> OutboundTaskCompleted(Dt_Task task)
{
@@ -408,27 +934,32 @@
locationInfo.LocationStatus = LocationStatusEnum.Free.ObjToInt();
_locationInfoService.Repository.UpdateData(locationInfo);
- var outloks = await _outStockLockInfoService.Db.Queryable<Dt_OutStockLockInfo>().Where(x => x.TaskNum == task.TaskNum).ToListAsync();
-
- var stockids = outloks.Select(x => x.StockId).ToList();
-
- _stockService.StockInfoService.Db.Updateable<Dt_StockInfo>()
- .SetColumns(it => new Dt_StockInfo
- {
- StockStatus = StockStatusEmun.鍑哄簱閿佸畾.ObjToInt()
- })
- .Where(it => stockids.Contains(it.Id))
- .ExecuteCommand();
-
- _stockService.StockInfoDetailService.Db.Updateable<Dt_StockInfoDetail>()
- .SetColumns(it => new Dt_StockInfoDetail
- {
- Status = StockStatusEmun.鍑哄簱閿佸畾.ObjToInt()
- })
- .Where(it => stockids.Contains(it.StockId))
- .ExecuteCommand();
+ var stock = _stockService.StockInfoService.Db.Queryable<Dt_StockInfo>()
+ .Includes(x => x.Details)
+ .Where(x => x.PalletCode == task.PalletCode)
+ .First();
+ stock.StockStatus = StockStatusEmun.鍑哄簱瀹屾垚.ObjToInt();
+ stock.LocationCode = "";
+
+ stock.Details.ForEach(x =>
+ {
+ if (x.Status != StockStatusEmun.鎵嬪姩鍐荤粨.ObjToInt())
+ {
+ x.Status = StockStatusEmun.鍑哄簱瀹屾垚.ObjToInt();
+ }
+
+ });
+
+ _stockService.StockInfoService.Db.UpdateNav(stock).IncludesAllFirstLayer().ExecuteCommand();
+
+ task.TaskStatus = (int)TaskStatusEnum.Finish;
+ var result = _task_HtyService.DeleteAndMoveIntoHty(task, OperateTypeEnum.鑷姩瀹屾垚);
+ if (!result)
+ {
+ await Db.Deleteable(task).ExecuteCommandAsync();
+ }
return WebResponseContent.Instance.OK();
@@ -472,22 +1003,31 @@
stockInfo.StockStatus = StockStatusEmun.鍏ュ簱瀹屾垚.ObjToInt();
_stockRepository.UpdateData(stockInfo);
- var outboundOrder = _outboundOrderService.Db.Queryable<Dt_OutboundOrder>().First(x => x.OrderNo == task.OrderNo);
+ //var outboundOrder = _outboundOrderService.Db.Queryable<Dt_OutboundOrder>().First(x => x.OrderNo == task.OrderNo);
task.TaskStatus = TaskStatusEnum.Finish.ObjToInt();
- BaseDal.DeleteAndMoveIntoHty(task, App.User.UserId == 0 ? WIDESEA_Core.Enums.OperateTypeEnum.鑷姩瀹屾垚 : OperateTypeEnum.浜哄伐瀹屾垚);
-
- _locationStatusChangeRecordService.AddLocationStatusChangeRecord(locationInfo, beforelocationStatus, StockChangeType.Inbound.ObjToInt(), "", task.TaskNum);
-
-
- if (outboundOrder != null)
+ var result = _task_HtyService.DeleteAndMoveIntoHty(task, OperateTypeEnum.浜哄伐鍒犻櫎);
+ if (!result)
{
- await HandleOutboundOrderToMESCompletion(outboundOrder, outboundOrder.OrderNo);
+ await Db.Deleteable(task).ExecuteCommandAsync();
}
- else
+ try
{
- _logger.LogInformation($"TaskService InEmptyTaskCompleted: {task.TaskNum} ,鏈壘鍒板嚭搴撳崟銆� ");
+ _locationStatusChangeRecordService.AddLocationStatusChangeRecord(locationInfo, beforelocationStatus, StockChangeType.Inbound.ObjToInt(), "", task.TaskNum);
}
+ catch (Exception ex)
+ {
+ _logger.LogInformation($"InEmptyTaskCompleted AddLocationStatusChangeRecord : {ex.Message} ");
+ }
+
+ //if (outboundOrder != null)
+ //{
+ // await HandleOutboundOrderToMESCompletion(outboundOrder, outboundOrder.OrderNo);
+ //}
+ //else
+ //{
+ // _logger.LogInformation($"TaskService InEmptyTaskCompleted: {task.TaskNum} ,鏈壘鍒板嚭搴撳崟銆� ");
+ //}
return content;
}
@@ -496,61 +1036,339 @@
return await Task.FromResult(WebResponseContent.Instance.Error(ex.Message));
}
}
-
- public async Task<WebResponseContent> InPickTaskCompleted(Dt_Task task)
+ /// <summary>
+ /// 鏅轰粨璋冨叆鏅轰粨瀹屾垚
+ /// </summary>
+ /// <param name="task"></param>
+ /// <returns></returns>
+ public async Task<WebResponseContent> AllocateInWarehouseTaskCompleted(Dt_Task task)
{
- _logger.LogInformation($"TaskService InPickTaskCompleted: {task.TaskNum}");
+
+ WebResponseContent content = new WebResponseContent();
try
{
- //鏌ュ簱瀛�
- Dt_StockInfo stockInfo = await _stockRepository.Db.Queryable<Dt_StockInfo>().Includes(x => x.Details).Where(x => x.PalletCode == task.PalletCode).FirstAsync();
+
+ Dt_StockInfo stockInfo = await _stockRepository.Db.Queryable<Dt_StockInfo>()
+ .Includes(x => x.Details)
+ .Where(x => x.PalletCode == task.PalletCode)
+ .FirstAsync();
+
if (stockInfo == null)
{
- _logger.LogInformation($"TaskService InPickTaskCompleted: 鏈壘鍒版墭鐩樺搴旂殑缁勭洏淇℃伅.{task.TaskNum}");
return WebResponseContent.Instance.Error($"鏈壘鍒版墭鐩樺搴旂殑缁勭洏淇℃伅");
}
+
if (stockInfo.Details.Count == 0 && stockInfo.PalletType != PalletTypeEnum.Empty.ObjToInt())
{
- _logger.LogInformation($"TaskService InPickTaskCompleted: 鏈壘鍒拌鎵樼洏搴撳瓨鏄庣粏淇℃伅.{task.TaskNum}");
+ _logger.LogInformation($"TaskService InPickTaskCompleted: 鏈壘鍒拌鎵樼洏搴撳瓨鏄庣粏淇℃伅.{task.TaskNum}");
return WebResponseContent.Instance.Error($"鏈壘鍒拌鎵樼洏搴撳瓨鏄庣粏淇℃伅");
}
- //鏌ヨ揣浣�
Dt_LocationInfo locationInfo = _locationInfoService.Repository.QueryFirst(x => x.LocationCode == task.TargetAddress);
if (locationInfo == null)
{
- _logger.LogInformation($"TaskService InPickTaskCompleted: 鏈壘鍒板搴旂殑缁堢偣璐т綅淇℃伅 {task.TaskNum}.");
+ return content.Error($"鏈壘鍒板搴旂殑缁堢偣璐т綅淇℃伅");
+ }
+
+ if (!string.IsNullOrEmpty(stockInfo.LocationCode))
+ {
+ return WebResponseContent.Instance.Error($"璇ユ墭鐩樺凡缁戝畾璐т綅");
+ }
+ if (locationInfo.LocationStatus == LocationStatusEnum.InStock.ObjToInt())
+ {
+ return WebResponseContent.Instance.Error($"璐т綅鐘舵�佷笉姝g‘");
+ }
+
+ _unitOfWorkManage.BeginTran();
+
+ var beforelocationStatus = locationInfo.LocationStatus;
+ locationInfo.LocationStatus = LocationStatusEnum.InStock.ObjToInt();
+ _locationInfoService.Repository.UpdateData(locationInfo);
+ stockInfo.Details.ForEach(x =>
+ {
+ x.Status = StockStatusEmun.鍏ュ簱瀹屾垚.ObjToInt();
+ });
+ _stockService.StockInfoDetailService.Repository.UpdateData(stockInfo.Details);
+ stockInfo.LocationCode = locationInfo.LocationCode;
+ stockInfo.PalletCode = task.PalletCode;
+ stockInfo.LocationCode = task.TargetAddress;
+ stockInfo.Remark ="";
+ stockInfo.StockStatus = StockStatusEmun.鍏ュ簱瀹屾垚.ObjToInt();
+ _stockRepository.UpdateData(stockInfo);
+
+ task.TaskStatus = TaskStatusEnum.Finish.ObjToInt();
+ var result = _task_HtyService.DeleteAndMoveIntoHty(task, OperateTypeEnum.鑷姩瀹屾垚);
+ _unitOfWorkManage.CommitTran();
+ if (!result)
+ {
+ await Db.Deleteable(task).ExecuteCommandAsync();
+ }
+ Dt_OutboundOrder outboundOrder = _outboundOrderService.Db.Queryable<Dt_OutboundOrder>().Where(x => x.OrderNo == stockInfo.Details.FirstOrDefault().OrderNo).Includes(x=>x.Details).First();
+
+ string Operator = outboundOrder.Modifier;
+ if (outboundOrder != null)
+ {
+ foreach (var item in stockInfo.Details.Where(x => x.OrderNo == outboundOrder.OrderNo).ToList())
+ {
+ var inbounddetail = _allocateMaterialInfo.QueryFirst(x => x.OrderNo == item.OrderNo && x.Barcode == item.Barcode);
+ if (inbounddetail != null)
+ {
+ var alldelete = _allocateMaterialInfo.DeleteAndMoveIntoHty(inbounddetail, OperateTypeEnum.鑷姩鍒犻櫎);
+ if (!alldelete)
+ {
+ await Db.Deleteable(task).ExecuteCommandAsync();
+ }
+ }
+ }
+ var allocateMaterialInfos = _allocateMaterialInfo.QueryData(x => x.OrderNo == outboundOrder.OrderNo);
+ if (outboundOrder.Details.All(x => x.OrderDetailStatus == (int)OrderDetailStatusEnum.Over) && !allocateMaterialInfos.Any())
+ {
+ outboundOrder.OrderStatus = (int)InOrderStatusEnum.鍏ュ簱瀹屾垚;
+ _outboundOrderService.UpdateData(outboundOrder);
+ }
+ }
+
+ ///鍥炶皟MES
+ HttpResponseResult<MesResponseDTO> httpResponseResult = new HttpResponseResult<MesResponseDTO>();
+ string reqCode = Guid.NewGuid().ToString();
+ string reqTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
+ string requestData = string.Empty;
+ List<string> lineNos = new List<string>();
+ Dt_AllocateMaterialInfo allocateMaterialInfo = _allocateMaterialInfo.QueryFirst(x => x.OrderNo == outboundOrder.OrderNo);
+ if (outboundOrder.OrderStatus == OutOrderStatusEnum.鍑哄簱瀹屾垚.ObjToInt() && outboundOrder.ReturnToMESStatus == 0 && allocateMaterialInfo == null)
+ {
+ Dt_AllocateOrder allocateOrder = _allocateOrderRepository.QueryFirst(x => x.OrderNo == outboundOrder.OrderNo);
+ if (allocateOrder == null)
+ {
+ return WebResponseContent.Instance.Error($"鏈壘鍒板搴旂殑璋冩嫧鍗�");
+ }
+ AllocationReturnDTO? returnDTO = BuildAllocationFeedbackData(outboundOrder, allocateOrder.FromWarehouse, allocateOrder.ToWarehouse, Operator);
+ if (returnDTO == null)
+ {
+ return WebResponseContent.Instance.Error($"鏋勫缓鍥炶皟瀵硅薄澶辫触");
+ }
+ string apiUrl = AppSettings.GetValue("AllocationFeedbackUrl");
+ returnDTO.ReqCode = reqCode;
+ returnDTO.ReqTime = reqTime;
+ JsonSerializerSettings settings = new JsonSerializerSettings
+ {
+ ContractResolver = new CamelCasePropertyNamesContractResolver()
+ };
+ requestData = JsonConvert.SerializeObject(returnDTO, settings);
+ lineNos = returnDTO.Details.Select(x => x.LineNo).ToList();
+ httpResponseResult = _httpClientHelper.Post<MesResponseDTO>(apiUrl, requestData);
+ httpResponseResult.ApiUrl = apiUrl;
+ }
+ bool isSuccess = httpResponseResult.IsSuccess && httpResponseResult.Data.Code == "200";
+ string message = "鎴愬姛";
+ if (!isSuccess)
+ {
+ if (!httpResponseResult.IsSuccess)
+ {
+ message = $"MES鎺ュ彛杩斿洖閿欒锛孒TTP浠g爜锛歿httpResponseResult.StatusCode}锛屼俊鎭細{httpResponseResult.ErrorMessage}";
+ }
+ else if (httpResponseResult?.Data?.Code != "200")
+ {
+ message = $"璋冪敤MES鎺ュ彛澶辫触锛屼唬鐮侊細{httpResponseResult?.Data?.Code}锛屼俊鎭細{httpResponseResult?.Data?.Message}";
+ }
+ }
+
+ Dt_MesReturnRecord mesReturnRecord = new Dt_MesReturnRecord()
+ {
+ ApiUrl = httpResponseResult.ApiUrl,
+ InterfaceType = outboundOrder.OrderType == 0 ? 1 : 3,
+ OrderId = outboundOrder.Id,
+ OrderNo = outboundOrder.OrderNo,
+ RequestCode = reqCode,
+ RequestData = requestData,
+ FailureReason = message,
+ LastReturnTime = DateTime.Now,
+ HttpStatusCode = httpResponseResult.StatusCode.ObjToInt(),
+ ResponseData = httpResponseResult.Content,
+ ReturnType = 0,
+ ReturnCount = 1,
+ ReturnStatus = isSuccess ? 1 : 2,
+ SuccessTime = isSuccess ? DateTime.Now : null
+ };
+
+ _unitOfWorkManage.BeginTran();
+ _unitOfWorkManage.Db.Insertable(mesReturnRecord).ExecuteCommand();
+
+ List<Dt_OutboundOrderDetail> outboundOrderDetails = outboundOrder.Details.Where(x => lineNos.Contains(x.lineNo)).ToList();
+ outboundOrderDetails.ForEach(x =>
+ {
+ if (x.OverOutQuantity == x.OrderQuantity - x.MoveQty)
+ {
+ x.ReturnToMESStatus = isSuccess ? 1 : 2;
+ }
+ else
+ {
+ x.ReturnToMESStatus = isSuccess ? 3 : 4;
+ }
+ x.CurrentDeliveryQty = 0;
+ x.ReturnJsonData = "";
+ });
+
+ mesReturnRecord.ReturnType = outboundOrder.Details.Count == outboundOrderDetails.Count ? 1 : 2;
+
+ if (outboundOrder.Details.Count == outboundOrderDetails.Count && outboundOrderDetails.All(x => x.ReturnToMESStatus == 1 || x.ReturnToMESStatus == 2))
+ {
+ outboundOrder.ReturnToMESStatus = isSuccess ? 1 : 2;
+ }
+ else
+ {
+ outboundOrder.ReturnToMESStatus = isSuccess ? 3 : 4;
+ }
+
+ _outboundOrderService.Db.Updateable(outboundOrderDetails).ExecuteCommand();
+ _outboundOrderService.UpdateData(outboundOrder);
+
+ _unitOfWorkManage.CommitTran();
+
+ try
+ {
+ _locationStatusChangeRecordService.AddLocationStatusChangeRecord(locationInfo, beforelocationStatus, StockChangeType.Inbound.ObjToInt(), "", task.TaskNum);
+ }
+ catch (Exception ex)
+ {
+ _logger.LogInformation($"InEmptyTaskCompleted AddLocationStatusChangeRecord : {ex.Message} ");
+ }
+ return content;
+ }
+ catch (Exception ex)
+ {
+ _unitOfWorkManage.RollbackTran();
+ return await Task.FromResult(WebResponseContent.Instance.Error(ex.Message));
+ }
+ }
+
+ public AllocationReturnDTO? BuildAllocationFeedbackData(Dt_OutboundOrder outboundOrder, string fromWarehouse, string toWarehouse,string Operator)
+ {
+ try
+ {
+ List<Dt_OutboundOrderDetail> details = outboundOrder.Details;
+
+ List<AllocationDetail> returnDetails = new List<AllocationDetail>();
+
+ foreach (var detail in details)
+ {
+ List<Barcodes>? barcodes = JsonConvert.DeserializeObject<List<Barcodes>>(detail.ReturnJsonData);
+ if (barcodes != null && barcodes.Any())
+ {
+ UnitConvertResultDTO currentResult = _basicService.UnitQuantityConvert(detail.MaterielCode, detail.Unit, detail.BarcodeUnit, detail.CurrentDeliveryQty);
+ UnitConvertResultDTO totalResult = _basicService.UnitQuantityConvert(detail.MaterielCode, detail.Unit, detail.BarcodeUnit, detail.OrderQuantity);
+
+ returnDetails.Add(new AllocationDetail
+ {
+ Barcodes = barcodes,
+ BatchNo = detail.BatchNo,
+ LineNo = detail.lineNo,
+ MaterialCode = detail.MaterielCode,
+ Qty = totalResult.ToQuantity,
+ WarehouseCode = detail.WarehouseCode,
+ Unit = detail.BarcodeUnit
+ });
+ }
+ }
+
+ AllocationReturnDTO outboundReturnDTO = new AllocationReturnDTO()
+ {
+ Business_type = outboundOrder.BusinessType,
+ Details = returnDetails,
+ FactoryArea = outboundOrder.FactoryArea,
+ OperationType = 1,
+ OrderNo = outboundOrder.UpperOrderNo,
+ FromWarehouse = fromWarehouse,
+ ToWarehouse = toWarehouse,
+ Operator = Operator
+ };
+
+ return outboundReturnDTO;
+
+ }
+ catch (Exception ex)
+ {
+ return null;
+ }
+ }
+
+
+ public async Task<WebResponseContent> InPickTaskCompleted(Dt_Task task)
+ {
+ _logger.LogInformation($"TaskService InPickTaskCompleted: {task.TaskNum}");
+
+ try
+ {
+ // 鏌ュ簱瀛�
+ Dt_StockInfo stockInfo = await _stockRepository.Db.Queryable<Dt_StockInfo>()
+ .Includes(x => x.Details)
+ .Where(x => x.PalletCode == task.PalletCode)
+ .FirstAsync();
+
+ if (stockInfo == null)
+ {
+ _logger.LogInformation($"TaskService InPickTaskCompleted: 鏈壘鍒版墭鐩樺搴旂殑缁勭洏淇℃伅.{task.TaskNum}");
+ return WebResponseContent.Instance.Error($"鏈壘鍒版墭鐩樺搴旂殑缁勭洏淇℃伅");
+ }
+
+ if (stockInfo.Details.Count == 0 && stockInfo.PalletType != PalletTypeEnum.Empty.ObjToInt())
+ {
+ _logger.LogInformation($"TaskService InPickTaskCompleted: 鏈壘鍒拌鎵樼洏搴撳瓨鏄庣粏淇℃伅.{task.TaskNum}");
+ return WebResponseContent.Instance.Error($"鏈壘鍒拌鎵樼洏搴撳瓨鏄庣粏淇℃伅");
+ }
+ // 鏌ヨ揣浣�
+ Dt_LocationInfo locationInfo = _locationInfoService.Repository.QueryFirst(x => x.LocationCode == task.TargetAddress);
+ if (locationInfo == null)
+ {
+ _logger.LogInformation($"TaskService InPickTaskCompleted: 鏈壘鍒板搴旂殑缁堢偣璐т綅淇℃伅 {task.TaskNum}.");
return WebResponseContent.Instance.Error($"鏈壘鍒板搴旂殑缁堢偣璐т綅淇℃伅");
}
var beforelocationStatus = locationInfo.LocationStatus;
- // 鑾峰彇鎵�鏈夊洖搴撲腑鐨勫嚭搴撻攣瀹氳褰�
- var returnLocks = await _outStockLockInfoService.Db.Queryable<Dt_OutStockLockInfo>()
- .Where(it => it.OrderNo == task.OrderNo && it.PalletCode == task.PalletCode && it.Status == (int)OutLockStockStatusEnum.鍥炲簱涓�)
- .ToListAsync();
- // 鏇存柊鍑哄簱閿佸畾璁板綍鐘舵�佷负鍥炲簱瀹屾垚
- foreach (var lockInfo in returnLocks)
- {
- lockInfo.Status = (int)OutLockStockStatusEnum.宸插洖搴�;
- }
- _outStockLockInfoService.Db.Updateable(returnLocks).ExecuteCommand();
+ // 鑾峰彇鎵�鏈夊洖搴撲腑鐨勫嚭搴撻攣瀹氳褰�
+ //var returnLocks = await _outStockLockInfoService.Db.Queryable<Dt_OutStockLockInfo>()
+ // .Where(it => it.OrderNo == task.OrderNo &&
+ // it.PalletCode == task.PalletCode &&
+ // it.Status == (int)OutLockStockStatusEnum.鍥炲簱涓�)
+ // .ToListAsync();
+
+ // 鏇存柊鍑哄簱閿佸畾璁板綍鐘舵�佷负鍥炲簱瀹屾垚
+ //foreach (var lockInfo in returnLocks)
+ //{
+ // lockInfo.Status = (int)OutLockStockStatusEnum.宸插洖搴�;
+ //}
+
+ //if (returnLocks.Any())
+ //{
+ // await _outStockLockInfoService.Db.Updateable(returnLocks).ExecuteCommandAsync();
+ // _logger.LogInformation($"鏇存柊{returnLocks.Count}鏉¢攣瀹氳褰曚负宸插洖搴撶姸鎬�");
+ //}
+
+ // 鏇存柊搴撳瓨淇℃伅
stockInfo.LocationCode = task.TargetAddress;
stockInfo.StockStatus = StockStatusEmun.鍏ュ簱瀹屾垚.ObjToInt();
+ stockInfo.Remark = "";
+
+ // 鏇存柊搴撳瓨鏄庣粏鐘舵��
if (stockInfo.Details != null && stockInfo.Details.Any())
{
- stockInfo.Details.ForEach(x =>
+ foreach (var detail in stockInfo.Details)
{
- x.Status = StockStatusEmun.鍏ュ簱瀹屾垚.ObjToInt();
- });
+ if(detail.Status != StockStatusEmun.鎵嬪姩鍐荤粨.ObjToInt()&& detail.Status != StockStatusEmun.閲嶆涓�.ObjToInt())
+ {
+ detail.Status = StockStatusEmun.鍏ュ簱瀹屾垚.ObjToInt();
+ }
+ detail.OutboundQuantity = 0;
+ }
_stockService.StockInfoDetailService.Repository.UpdateData(stockInfo.Details);
}
_stockService.StockInfoService.Repository.UpdateData(stockInfo);
-
- await ProcessStockDetailsForReturn(task, stockInfo.Id);
-
+ // 鍒犻櫎闆跺簱瀛樻暟鎹�
await DeleteZeroQuantityStockDetails(stockInfo.Id);
+ //await UpdateAffectedOrderDetails(task.OrderNo, returnLocks);
+ // 鏇存柊璐т綅鐘舵��
if (stockInfo.PalletType == PalletTypeEnum.Empty.ObjToInt())
{
locationInfo.LocationStatus = LocationStatusEnum.Pallet.ObjToInt();
@@ -559,30 +1377,356 @@
{
locationInfo.LocationStatus = LocationStatusEnum.InStock.ObjToInt();
}
+
_locationInfoService.Repository.UpdateData(locationInfo);
- var outboundOrder = _outboundOrderService.Db.Queryable<Dt_OutboundOrder>().First(x => x.OrderNo == task.OrderNo);
+
task.TaskStatus = TaskStatusEnum.Finish.ObjToInt();
- BaseDal.DeleteAndMoveIntoHty(task, App.User.UserId == 0 ? OperateTypeEnum.鑷姩瀹屾垚 : OperateTypeEnum.浜哄伐瀹屾垚);
- BaseDal.DeleteData(task);
- _locationStatusChangeRecordService.AddLocationStatusChangeRecord(locationInfo, beforelocationStatus, StockChangeType.Inbound.ObjToInt(), "", task.TaskNum);
-
- if (outboundOrder != null)
+ // 鍒犻櫎浠诲姟璁板綍
+ //BaseDal.DeleteAndMoveIntoHty(task, App.User.UserId == 0 ? OperateTypeEnum.鑷姩瀹屾垚 : OperateTypeEnum.浜哄伐瀹屾垚);
+ //BaseDal.DeleteData(task);
+ var result = _task_HtyService.DeleteAndMoveIntoHty(task, OperateTypeEnum.浜哄伐鍒犻櫎);
+ if (!result)
{
- await HandleOutboundOrderToMESCompletion(outboundOrder, outboundOrder.OrderNo);
+ await Db.Deleteable(task).ExecuteCommandAsync();
}
+
+ //await RecalculateOrderStatus(task.OrderNo);
+ try
+ {
+ // 璁板綍璐т綅鐘舵�佸彉鏇�
+ _locationStatusChangeRecordService.AddLocationStatusChangeRecord(
+ locationInfo,
+ beforelocationStatus,
+ StockChangeType.Inbound.ObjToInt(),
+ "",
+ task.TaskNum
+ );
+ }
+ catch (Exception ex)
+ {
+ _logger.LogInformation($"InPickTaskCompleted AddLocationStatusChangeRecord : {ex.Message} ");
+ }
+
+ //_logger.LogInformation($"鎵樼洏鍥炲簱瀹屾垚澶勭悊鎴愬姛 - 浠诲姟鍙�: {task.TaskNum}, 鎵樼洏: {task.PalletCode}, 璁㈠崟: {task.OrderNo} 璐т綅鐘舵�侊細{locationInfo.LocationStatus}");
+ //_ = Task.Run(async () =>
+ //{
+ // try
+ // {
+ // var outboundOrder = await _outboundOrderService.Db.Queryable<Dt_OutboundOrder>()
+ // .FirstAsync(x => x.OrderNo == task.OrderNo);
+
+ // if (outboundOrder != null)
+ // {
+ // // 妫�鏌ヨ鍗曟槸鍚﹀凡瀹屾垚锛屽彧鏈夊畬鎴愭椂鎵嶅悜MES鍙嶉
+ // if (outboundOrder.OrderStatus == (int)OutOrderStatusEnum.鍑哄簱瀹屾垚)
+ // {
+ // await HandleOutboundOrderToMESCompletion(outboundOrder, outboundOrder.OrderNo);
+ // }
+ // else
+ // {
+ // _logger.LogInformation($"璁㈠崟{task.OrderNo}鐘舵�佷负{outboundOrder.OrderStatus}锛屾殏涓嶅悜MES鍙嶉");
+ // }
+ // }
+ // }
+ // catch (Exception ex)
+ // {
+ // _logger.LogError($"寮傛MES鍙嶉澶勭悊澶辫触 - OrderNo: {task.OrderNo}, Error: {ex.Message}");
+ // }
+ //});
+ }
+ catch (Exception ex)
+ {
+ _unitOfWorkManage.RollbackTran(); // 鍥炴粴浜嬪姟
+ _logger.LogError($"TaskService InPickTaskCompleted澶辫触 - TaskNum: {task.TaskNum}, Error: {ex.Message}");
+ return WebResponseContent.Instance.Error($"鍥炲簱浠诲姟瀹屾垚澶勭悊澶辫触: {ex.Message}");
+ }
+
+ return WebResponseContent.Instance.OK();
+ }
+ // <summary>
+ /// 鏇存柊鍙楀奖鍝嶇殑璁㈠崟鏄庣粏閿佸畾鏁伴噺
+ /// </summary>
+ private async Task UpdateAffectedOrderDetails(string orderNo, List<Dt_OutStockLockInfo> returnLocks)
+ {
+ try
+ {
+
+
+ // 鑾峰彇鍙楀奖鍝嶇殑璁㈠崟鏄庣粏ID锛堝幓閲嶏級
+ //var affectedDetailIds = returnLocks
+ // .Select(x => x.OrderDetailId)
+ // .Distinct()
+ // .ToList();
+
+ //if (!affectedDetailIds.Any())
+ //{
+ // _logger.LogInformation($"娌℃湁鍙楀奖鍝嶇殑璁㈠崟鏄庣粏 - OrderNo: {orderNo}");
+ // return;
+ //}
+
+ //_logger.LogInformation($"鏇存柊{affectedDetailIds.Count}涓彈褰卞搷鐨勮鍗曟槑缁� - OrderNo: {orderNo}");
+
+ //foreach (var detailId in affectedDetailIds)
+ //{
+ // // 閲嶆柊璁$畻璇ヨ鍗曟槑缁嗙殑閿佸畾鏁伴噺
+ // decimal currentLockQty = await CalculateOrderDetailLockQuantity(detailId);
+
+ // // 妫�鏌ユ暟鎹竴鑷存��
+ // if (currentLockQty < 0)
+ // {
+ // _logger.LogWarning($"閿佸畾鏁伴噺璁$畻涓鸿礋鍊� - OrderDetailId: {detailId}, 褰撳墠鍊�: {currentLockQty}锛岄噸缃负0");
+ // currentLockQty = 0;
+ // }
+
+ // // 鑾峰彇璁㈠崟鏄庣粏
+ // var orderDetail = await _outboundOrderDetailService.Db.Queryable<Dt_OutboundOrderDetail>()
+ // .FirstAsync(x => x.Id == detailId);
+
+ // if (orderDetail == null)
+ // {
+ // _logger.LogWarning($"鏈壘鍒拌鍗曟槑缁� - OrderDetailId: {detailId}");
+ // continue;
+ // }
+
+ // // 鏇存柊閿佸畾鏁伴噺
+ // if (orderDetail.LockQuantity != currentLockQty)
+ // {
+ // await _outboundOrderDetailService.Db.Updateable<Dt_OutboundOrderDetail>()
+ // .SetColumns(it => new Dt_OutboundOrderDetail
+ // {
+ // LockQuantity = currentLockQty,
+ // })
+ // .Where(it => it.Id == detailId)
+ // .ExecuteCommandAsync();
+
+ // _logger.LogInformation($"鏇存柊璁㈠崟鏄庣粏閿佸畾鏁伴噺 - OrderDetailId: {detailId}, " +
+ // $"鏃у��: {orderDetail.LockQuantity}, 鏂板��: {currentLockQty}");
+ // }
+
+ // // 鏇存柊璁㈠崟鏄庣粏鐘舵��
+ // await UpdateOrderDetailStatus(orderDetail);
+ //}
+ }
+ catch (Exception ex)
+ {
+ _logger.LogError($"UpdateAffectedOrderDetails澶辫触 - OrderNo: {orderNo}, Error: {ex.Message}");
+ throw;
+ }
+ }
+
+ /// <summary>
+ /// 閲嶆柊璁$畻璁㈠崟鏄庣粏閿佸畾鏁伴噺
+ /// </summary>
+ private async Task<decimal> CalculateOrderDetailLockQuantity(int orderDetailId)
+ {
+ try
+ {
+ // 鏌ユ壘璇ヨ鍗曟槑缁嗕笅鎵�鏈夌姸鎬佷负"鍑哄簱涓�"鐨勯攣瀹氳褰�
+ var activeLocks = await _outStockLockInfoService.Db.Queryable<Dt_OutStockLockInfo>()
+ .Where(x => x.OrderDetailId == orderDetailId &&
+ x.Status == (int)OutLockStockStatusEnum.鍑哄簱涓�)
+ .ToListAsync();
+
+ // 杩囨护鎷嗗寘璁板綍
+ var filteredLocks = new List<Dt_OutStockLockInfo>();
+
+ foreach (var lockInfo in activeLocks)
+ {
+ // 濡傛灉鏄媶鍖呰褰曪紝闇�瑕佺壒娈婂鐞�
+ if (lockInfo.IsSplitted == 1 && lockInfo.ParentLockId.HasValue)
+ {
+ // 鏌ユ壘鐖堕攣瀹氳褰�
+ var parentLock = await _outStockLockInfoService.Db.Queryable<Dt_OutStockLockInfo>()
+ .Where(x => x.Id == lockInfo.ParentLockId.Value)
+ .FirstAsync();
+
+ // 濡傛灉鐖惰褰曞瓨鍦ㄤ笖鐘舵�佷篃鏄嚭搴撲腑锛屽垯鍙绠楃埗璁板綍
+ if (parentLock != null && parentLock.Status == (int)OutLockStockStatusEnum.鍑哄簱涓�)
+ {
+ // 鐖惰褰曞凡缁忓湪鍒楄〃涓紝璺宠繃褰撳墠鎷嗗寘璁板綍
+ continue;
+ }
+ }
+
+ filteredLocks.Add(lockInfo);
+ }
+
+ decimal totalLockQty = filteredLocks.Sum(x => x.AssignQuantity - x.PickedQty);
+
+ _logger.LogDebug($"璁$畻閿佸畾鏁伴噺 - OrderDetailId: {orderDetailId}, " +
+ $"鎵惧埌{filteredLocks.Count}涓湁鏁堥攣瀹氳褰�, " +
+ $"鎬婚攣瀹氭暟閲�: {totalLockQty}");
+
+ return totalLockQty;
+ }
+ catch (Exception ex)
+ {
+ _logger.LogError($"CalculateOrderDetailLockQuantity澶辫触 - OrderDetailId: {orderDetailId}, Error: {ex.Message}");
+ return 0;
+ }
+ }
+
+ /// <summary>
+ /// 鏇存柊璁㈠崟鏄庣粏鐘舵��
+ /// </summary>
+ private async Task UpdateOrderDetailStatus(Dt_OutboundOrderDetail orderDetail)
+ {
+ try
+ {
+ int newStatus = orderDetail.OrderDetailStatus;
+
+ // 鏍规嵁瀹為檯鏋氫妇鍊艰皟鏁�
+ // 妫�鏌ユ槸鍚﹀凡瀹屾垚锛堝凡鍑哄簱鏁伴噺 >= 闇�姹傛暟閲忥級
+ if (orderDetail.OverOutQuantity >= orderDetail.NeedOutQuantity)
+ {
+ newStatus = (int)OrderDetailStatusEnum.Over; // 宸插畬鎴�
+ }
+ // 妫�鏌ユ槸鍚︽湁閮ㄥ垎鍑哄簱鎴栨湁閿佸畾鏁伴噺
+ else if (orderDetail.OverOutQuantity > 0 || orderDetail.LockQuantity > 0)
+ {
+ newStatus = (int)OrderDetailStatusEnum.Outbound; // 閮ㄥ垎瀹屾垚/杩涜涓�
+ }
+ // 鍚﹀垯涓烘柊璁㈠崟
else
{
- _logger.LogInformation($"TaskService InPickTaskCompleted: {task.TaskNum} ,鏈壘鍒板嚭搴撳崟銆� ");
+ newStatus = (int)OrderDetailStatusEnum.New; // 鏂板缓
+ }
+
+ // 鍙湁鐘舵�佸彉鍖栨椂鎵嶆洿鏂�
+ if (orderDetail.OrderDetailStatus != newStatus)
+ {
+ await _outboundOrderDetailService.Db.Updateable<Dt_OutboundOrderDetail>()
+ .SetColumns(it => new Dt_OutboundOrderDetail
+ {
+ OrderDetailStatus = newStatus,
+ })
+ .Where(it => it.Id == orderDetail.Id)
+ .ExecuteCommandAsync();
+
+ _logger.LogInformation($"鏇存柊璁㈠崟鏄庣粏鐘舵�� - OrderDetailId: {orderDetail.Id}, " +
+ $"鏃х姸鎬�: {orderDetail.OrderDetailStatus}, 鏂扮姸鎬�: {newStatus}, " +
+ $"宸插嚭搴�: {orderDetail.OverOutQuantity}/{orderDetail.NeedOutQuantity}, " +
+ $"閿佸畾鏁伴噺: {orderDetail.LockQuantity}");
}
}
catch (Exception ex)
{
- _logger.LogInformation($"TaskService InPickTaskCompleted: {task.TaskNum} , {ex.Message}");
+ _logger.LogError($"UpdateOrderDetailStatus澶辫触 - OrderDetailId: {orderDetail.Id}, Error: {ex.Message}");
+ throw;
}
- return await Task.FromResult(WebResponseContent.Instance.OK());
}
+ /// <summary>
+ /// 閲嶆柊璁$畻骞舵洿鏂拌鍗曠姸鎬�
+ /// </summary>
+ private async Task RecalculateOrderStatus(string orderNo)
+ {
+ try
+ {
+ // 鑾峰彇璁㈠崟鐨勬墍鏈夋槑缁�
+ var orderDetails = await _outboundOrderDetailService.Db.Queryable<Dt_OutboundOrderDetail>()
+ .LeftJoin<Dt_OutboundOrder>((o, item) => o.OrderId == item.Id)
+ .Where((o, item) => item.OrderNo == orderNo)
+ .Select((o, item) => o)
+ .ToListAsync();
+
+ if (!orderDetails.Any())
+ {
+ _logger.LogWarning($"鏈壘鍒拌鍗曟槑缁� - OrderNo: {orderNo}");
+ return;
+ }
+
+ // 妫�鏌ョ姸鎬�
+ bool allCompleted = true;
+ bool hasInProgress = false;
+
+ foreach (var detail in orderDetails)
+ {
+ // 妫�鏌ユ槸鍚﹀畬鎴�
+ if (detail.OverOutQuantity < detail.NeedOutQuantity)
+ {
+ allCompleted = false;
+ }
+
+ // 妫�鏌ユ槸鍚︽湁杩涜涓殑浠诲姟锛堥攣瀹氭垨閮ㄥ垎鎷i�夛級
+ if (detail.LockQuantity > 0 ||
+ detail.OrderDetailStatus == (int)OrderDetailStatusEnum.Outbound)
+ {
+ hasInProgress = true;
+ }
+ await UpdateOrderDetailStatus(detail);
+ }
+
+ var outboundOrder = await _outboundOrderService.Db.Queryable<Dt_OutboundOrder>()
+ .FirstAsync(x => x.OrderNo == orderNo);
+
+ if (outboundOrder == null)
+ {
+ _logger.LogWarning($"鏈壘鍒板嚭搴撹鍗� - OrderNo: {orderNo}");
+ return;
+ }
+
+ int newStatus;
+ if (allCompleted)
+ {
+ newStatus = (int)OutOrderStatusEnum.鍑哄簱瀹屾垚;
+ }
+ else if (hasInProgress)
+ {
+ newStatus = (int)OutOrderStatusEnum.鍑哄簱涓�;
+ }
+ else
+ {
+ newStatus = (int)OutOrderStatusEnum.鏈紑濮�;
+ }
+
+ if (outboundOrder.OrderStatus != newStatus)
+ {
+ await _outboundOrderService.Db.Updateable<Dt_OutboundOrder>()
+ .SetColumns(x => new Dt_OutboundOrder
+ {
+ OrderStatus = newStatus,
+ })
+ .Where(x => x.OrderNo == orderNo)
+ .ExecuteCommandAsync();
+
+ _logger.LogInformation($"鏇存柊璁㈠崟鐘舵�� - OrderNo: {orderNo}, 鏃х姸鎬�: {outboundOrder.OrderStatus}, 鏂扮姸鎬�: {newStatus}");
+ }
+
+ }
+ catch (Exception ex)
+ {
+ _logger.LogError($"RecalculateOrderStatus澶辫触 - OrderNo: {orderNo}, Error: {ex.Message}");
+ throw;
+ }
+ }
+
+
+ /// <summary>
+ /// 鍒犻櫎闆跺簱瀛樻暟鎹紙澧炲己鐗堬級
+ /// </summary>
+ private async Task DeleteZeroQuantityStockDetails(int stockId)
+ {
+ try
+ {
+ // 鏌ユ壘搴撳瓨鏁伴噺涓�0鐨勮褰�
+ var zeroStockDetails = await _stockService.StockInfoDetailService.Db.Queryable<Dt_StockInfoDetail>()
+ .Where(x => x.StockId == stockId && x.StockQuantity <= 0)
+ .ToListAsync();
+
+ if (zeroStockDetails.Any())
+ {
+ await _stockService.StockInfoDetailService.Db.Deleteable(zeroStockDetails).ExecuteCommandAsync();
+ _logger.LogInformation($"鍒犻櫎{zeroStockDetails.Count}鏉¢浂搴撳瓨璁板綍 - StockId: {stockId}");
+ }
+ }
+ catch (Exception ex)
+ {
+ _logger.LogError($"DeleteZeroQuantityStockDetails澶辫触 - StockId: {stockId}, Error: {ex.Message}");
+ throw;
+ }
+ }
private async Task HandleOutboundOrderToMESCompletion(Dt_OutboundOrder outboundOrder, string orderNo)
{
@@ -619,14 +1763,14 @@
if (allCompleted && newStatus == (int)OutOrderStatusEnum.鍑哄簱瀹屾垚)
{
- if (outboundOrder.OrderType == OutOrderTypeEnum.Allocate.ObjToInt())
+ if (outboundOrder.OrderType == OutOrderTypeEnum.Allocate.ObjToInt() || outboundOrder.OrderType == OutOrderTypeEnum.InternalAllocat.ObjToInt())
{
var allocate = _allocateService.Repository.QueryData(x => x.UpperOrderNo == outboundOrder.UpperOrderNo).First();
var allocatefeedmodel = new AllocateDto
{
ReqCode = Guid.NewGuid().ToString(),
ReqTime = DateTime.Now.ToString(),
- BusinessType = "3",
+ BusinessType = "2",
FactoryArea = outboundOrder.FactoryArea,
OperationType = 1,
Operator = outboundOrder.Operator,
@@ -644,107 +1788,234 @@
var detailLocks = await _outStockLockInfoService.Db.Queryable<Dt_OutStockLockInfo>()
.Where(x => x.OrderNo == orderNo &&
x.OrderDetailId == detail.Id &&
- x.Status == (int)OutLockStockStatusEnum.鎷i�夊畬鎴�)
+ (x.Status == (int)OutLockStockStatusEnum.鎷i�夊畬鎴� || x.Status == (int)OutLockStockStatusEnum.宸插洖搴�))
.ToListAsync();
var detailModel = new AllocateDtoDetail
{
MaterialCode = detail.MaterielCode,
- LineNo = detail.lineNo, // 娉ㄦ剰锛氳繖閲屽彲鑳介渶瑕佽皟鏁村瓧娈靛悕
+ LineNo = detail.lineNo,
WarehouseCode = detail.WarehouseCode,
- Qty = detail.OverOutQuantity, // 浣跨敤璁㈠崟鏄庣粏鐨勫凡鍑哄簱鏁伴噺
- //currentDeliveryQty = detail.OverOutQuantity,
- Unit = detail.Unit,
- Barcodes = detailLocks.Select(lockInfo => new BarcodeInfo
- {
- Barcode = lockInfo.CurrentBarcode,
- SupplyCode = lockInfo.SupplyCode,
- BatchNo = lockInfo.BatchNo,
- Unit = lockInfo.Unit,
- Qty = lockInfo.PickedQty // 鏉$爜绾у埆鐨勬暟閲忎粛鐢ㄩ攣瀹氳褰�
- }).ToList()
+ Qty = 0,
+ Unit = detail.BarcodeUnit,
+ Barcodes = new List<BarcodeInfo>()
};
+ foreach (var item in detailLocks)
+ {
+ if (item.PickedQty > 0)
+ {
+ var barModel = new BarcodeInfo
+ {
+ Barcode = item.CurrentBarcode,
+ SupplyCode = item.SupplyCode,
+ BatchNo = item.BatchNo,
+ Unit = detail.BarcodeUnit,
+ Qty = 0
+ };
+ // 鍗曚綅涓嶄竴鑷存椂杞崲
+ if (detail.BarcodeUnit != detail.Unit)
+ {
+ var convertResult = await _materialUnitService.ConvertAsync(item.MaterielCode, item.PickedQty, detail.Unit, detail.BarcodeUnit);
+ barModel.Unit = convertResult.Unit;
+ barModel.Qty = convertResult.Quantity;
+ }
+ else
+ {
+ barModel.Qty = item.PickedQty;
+ }
+ detailModel.Qty += barModel.Qty;
+ detailModel.Barcodes.Add(barModel);
+ }
- allocatefeedmodel.Details.Add(detailModel);
- }
- var result = await _invokeMESService.FeedbackAllocate(allocatefeedmodel);
- if (result != null && result.code == 200)
- {
- await _outboundOrderDetailService.Db.Updateable<Dt_OutboundOrderDetail>()
- .SetColumns(x => x.ReturnToMESStatus == 1)
- .Where(x => x.OrderId == outboundOrder.Id).ExecuteCommandAsync();
- await _outboundOrderService.Db.Updateable<Dt_OutboundOrder>()
- .SetColumns(x => new Dt_OutboundOrder
- {
- ReturnToMESStatus = 1,
- Operator = App.User.UserName,
- }).Where(x => x.OrderNo == orderNo).ExecuteCommandAsync();
+ allocatefeedmodel.Details.Add(detailModel);
+ }
+ var groupedResult = allocatefeedmodel.Details
+ .GroupBy(item => new { item.WarehouseCode, item.MaterialCode, item.Unit, item.LineNo })
+ .Select(group =>
+ {
+
+ var deduplicatedBarcodes = group.SelectMany(x => x.Barcodes)
+ .GroupBy(b => b.Barcode)
+ .Select(b => new BarcodeInfo
+ {
+ Barcode = b.Key,
+ BatchNo = b.First().BatchNo,
+ SupplyCode = b.First().SupplyCode,
+ Qty = b.Max(x => x.Qty),
+ Unit = b.First().Unit
+ }).ToList();
+ return new AllocateDtoDetail
+ {
+ WarehouseCode = group.Key.WarehouseCode,
+ MaterialCode = group.Key.MaterialCode,
+ LineNo = group.Key.LineNo,
+ Qty = deduplicatedBarcodes.Sum(b => b.Qty),
+ Unit = group.Key.Unit,
+ Barcodes = deduplicatedBarcodes
+ };
+ }).ToList();
+
+ allocatefeedmodel.Details = groupedResult;
+
+
+ var result = await _invokeMESService.FeedbackAllocate(allocatefeedmodel);
+ if (result != null && result.code == 200)
+ {
+ await _outboundOrderDetailService.Db.Updateable<Dt_OutboundOrderDetail>()
+ .SetColumns(x => x.ReturnToMESStatus == 1)
+ .Where(x => x.OrderId == outboundOrder.Id).ExecuteCommandAsync();
+
+ await _outboundOrderService.Db.Updateable<Dt_OutboundOrder>()
+ .SetColumns(x => new Dt_OutboundOrder
+ {
+ ReturnToMESStatus = 1,
+ }).Where(x => x.OrderNo == orderNo).ExecuteCommandAsync();
+ }
+ else
+ {
+ await _outboundOrderDetailService.Db.Updateable<Dt_OutboundOrderDetail>()
+ .SetColumns(x => x.ReturnToMESStatus == 2)
+ .Where(x => x.OrderId == outboundOrder.Id)
+ .ExecuteCommandAsync();
+
+ await _outboundOrderService.Db.Updateable<Dt_OutboundOrder>()
+ .SetColumns(it => new Dt_OutboundOrder { ReturnToMESStatus = 2, Remark = result.message })
+ .Where(x => x.OrderNo == orderNo)
+ .ExecuteCommandAsync();
+ }
+
}
}
else if (outboundOrder.OrderType == OutOrderTypeEnum.ReCheck.ObjToInt())
{
-
+ //涓嶇敤鍥炰紶
}
else
{
- var feedmodel = new FeedbackOutboundRequestModel
+ if (outboundOrder != null && outboundOrder.IsBatch == 0)
{
- reqCode = Guid.NewGuid().ToString(),
- reqTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"),
- business_type = outboundOrder.BusinessType,
- factoryArea = outboundOrder.FactoryArea,
- operationType = 1,
- Operator = outboundOrder.Operator,
- orderNo = outboundOrder.UpperOrderNo,
- documentsNO = outboundOrder.OrderNo,
- status = outboundOrder.OrderStatus,
- details = new List<FeedbackOutboundDetailsModel>()
- };
-
-
- foreach (var detail in orderDetails)
- {
- // 鑾峰彇璇ユ槑缁嗗搴旂殑鏉$爜淇℃伅锛堜粠閿佸畾璁板綍锛�
- var detailLocks = await _outStockLockInfoService.Db.Queryable<Dt_OutStockLockInfo>()
- .Where(x => x.OrderNo == orderNo &&
- x.OrderDetailId == detail.Id &&
- x.Status == (int)OutLockStockStatusEnum.鎷i�夊畬鎴�)
- .ToListAsync();
-
- var detailModel = new FeedbackOutboundDetailsModel
+ var feedmodel = new FeedbackOutboundRequestModel
{
- materialCode = detail.MaterielCode,
- lineNo = detail.lineNo, // 娉ㄦ剰锛氳繖閲屽彲鑳介渶瑕佽皟鏁村瓧娈靛悕
- warehouseCode = detail.WarehouseCode,
- qty = detail.OverOutQuantity, // 浣跨敤璁㈠崟鏄庣粏鐨勫凡鍑哄簱鏁伴噺
- currentDeliveryQty = detail.OverOutQuantity,
- unit = detail.Unit,
- barcodes = detailLocks.Select(lockInfo => new WIDESEA_DTO.Outbound.BarcodesModel
- {
- barcode = lockInfo.CurrentBarcode,
- supplyCode = lockInfo.SupplyCode,
- batchNo = lockInfo.BatchNo,
- unit = lockInfo.Unit,
- qty = lockInfo.PickedQty // 鏉$爜绾у埆鐨勬暟閲忎粛鐢ㄩ攣瀹氳褰�
- }).ToList()
+ reqCode = Guid.NewGuid().ToString(),
+ reqTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"),
+ business_type = outboundOrder.BusinessType,
+ factoryArea = outboundOrder.FactoryArea,
+ operationType = 1,
+ Operator = outboundOrder.Operator,
+ orderNo = outboundOrder.UpperOrderNo,
+ documentsNO = outboundOrder.OrderNo,
+ status = outboundOrder.OrderStatus,
+ details = new List<FeedbackOutboundDetailsModel>()
};
+ foreach (var detail in orderDetails)
+ {
+ // 鑾峰彇璇ユ槑缁嗗搴旂殑鏉$爜淇℃伅锛堜粠閿佸畾璁板綍锛�
+ var detailLocks = await _outStockLockInfoService.Db.Queryable<Dt_OutStockLockInfo>()
+ .Where(x => x.OrderNo == orderNo &&
+ x.OrderDetailId == detail.Id &&
+ (x.Status == (int)OutLockStockStatusEnum.鎷i�夊畬鎴� || x.Status == (int)OutLockStockStatusEnum.宸插洖搴�))
+ .ToListAsync();
- feedmodel.details.Add(detailModel);
+ var detailModel = new FeedbackOutboundDetailsModel
+ {
+ materialCode = detail.MaterielCode,
+ lineNo = detail.lineNo, // 娉ㄦ剰锛氳繖閲屽彲鑳介渶瑕佽皟鏁村瓧娈靛悕
+ warehouseCode = detail.WarehouseCode,
+ qty = 0,
+ currentDeliveryQty = 0,
+ unit = detail.Unit,
+ barcodes = new List<WIDESEA_DTO.Outbound.BarcodesModel>()
+ };
+ foreach (var item in detailLocks)
+ {
+ if (item.PickedQty > 0)
+ {
+ var barModel = new WIDESEA_DTO.Outbound.BarcodesModel
+ {
+ barcode = item.CurrentBarcode,
+ supplyCode = item.SupplyCode,
+ batchNo = item.BatchNo,
+ unit = item.BarcodeUnit,
+ qty = item.PickedQty
+ };
+ // 鍗曚綅涓嶄竴鑷存椂杞崲
+ if (detail.BarcodeUnit != detail.Unit)
+ {
+ var convertResult = await _materialUnitService.ConvertAsync(item.MaterielCode, item.PickedQty, detail.Unit, detail.BarcodeUnit);
+ barModel.unit = convertResult.Unit;
+ barModel.qty = convertResult.Quantity;
+ }
+ else
+ {
+ barModel.qty = item.PickedQty;
+ }
+ detailModel.qty += barModel.qty;
+ detailModel.currentDeliveryQty += barModel.qty;
+ detailModel.barcodes.Add(barModel);
+ }
+ }
+ feedmodel.details.Add(detailModel);
+ }
+
+ var groupedResult = feedmodel.details
+ .GroupBy(item => new { item.warehouseCode, item.materialCode, item.unit, item.lineNo })
+ .Select(group =>
+ {
+ var deduplicatedBarcodes = group.SelectMany(x => x.barcodes)
+ .GroupBy(b => b.barcode)
+ .Select(b => new WIDESEA_DTO.Outbound.BarcodesModel
+ {
+ barcode = b.Key,
+ batchNo = b.First().batchNo,
+ supplyCode = b.First().supplyCode,
+ qty = b.Max(x => x.qty),
+ unit = b.First().unit
+ }).ToList();
+ return new FeedbackOutboundDetailsModel
+ {
+ warehouseCode = group.Key.warehouseCode,
+ materialCode = group.Key.materialCode,
+ lineNo = group.Key.lineNo,
+ qty = deduplicatedBarcodes.Sum(b => b.qty),
+ unit = group.Key.unit,
+ barcodes = deduplicatedBarcodes
+ };
+ }).ToList();
+
+ feedmodel.details = groupedResult;
+
+ var result = await _invokeMESService.FeedbackOutbound(feedmodel);
+ if (result != null && result.code == 200)
+ {
+ await _outboundOrderDetailService.Db.Updateable<Dt_OutboundOrderDetail>()
+ .SetColumns(x => x.ReturnToMESStatus == 1)
+ .Where(x => x.OrderId == outboundOrder.Id)
+ .ExecuteCommandAsync();
+
+ await _outboundOrderService.Db.Updateable<Dt_OutboundOrder>()
+ .SetColumns(it => new Dt_OutboundOrder { ReturnToMESStatus = 2, Remark = "" })
+ .Where(x => x.OrderNo == orderNo)
+ .ExecuteCommandAsync();
+ }
+ else
+ {
+ await _outboundOrderDetailService.Db.Updateable<Dt_OutboundOrderDetail>()
+ .SetColumns(x => x.ReturnToMESStatus == 2)
+ .Where(x => x.OrderId == outboundOrder.Id)
+ .ExecuteCommandAsync();
+
+ await _outboundOrderService.Db.Updateable<Dt_OutboundOrder>()
+ .SetColumns(it => new Dt_OutboundOrder { ReturnToMESStatus = 2, Remark = result.message })
+ .Where(x => x.OrderNo == orderNo)
+ .ExecuteCommandAsync();
+ }
}
- var result = await _invokeMESService.FeedbackOutbound(feedmodel);
- if (result != null && result.code == 200)
+ else if (outboundOrder != null && outboundOrder.IsBatch == 1)
{
- await _outboundOrderDetailService.Db.Updateable<Dt_OutboundOrderDetail>()
- .SetColumns(x => x.ReturnToMESStatus == 1)
- .Where(x => x.OrderId == outboundOrder.Id)
- .ExecuteCommandAsync();
-
- await _outboundOrderService.Db.Updateable<Dt_OutboundOrder>()
- .SetColumns(x => x.ReturnToMESStatus == 1)
- .Where(x => x.OrderNo == orderNo)
- .ExecuteCommandAsync();
+ await _invokeMESService.BatchOrderFeedbackToMes(new List<string>() { outboundOrder.OrderNo }, 2);
}
+
}
}
}
@@ -755,60 +2026,7 @@
}
- /// <summary>
- /// 鍒犻櫎搴撳瓨鏁颁负0鐨勫簱瀛樻槑缁嗚褰�
- /// </summary>
- private async Task DeleteZeroQuantityStockDetails(int stockId)
- {
- try
- {
- // 鍒犻櫎搴撳瓨鏁伴噺涓�0鐨勮褰�
- var deleteCount = await _stockService.StockInfoDetailService.Db.Deleteable<Dt_StockInfoDetail>()
- .Where(x => x.StockId == stockId &&
- x.StockQuantity == 0 &&
- (x.Status == StockStatusEmun.鍑哄簱瀹屾垚.ObjToInt() || x.Status ==
- StockStatusEmun.鍏ュ簱瀹屾垚.ObjToInt())) // 鍙垹闄ゅ凡瀹屾垚鐘舵�佺殑闆跺簱瀛�
- .ExecuteCommandAsync();
- if (deleteCount > 0)
- {
- _logger.LogInformation($"鍒犻櫎{deleteCount}鏉¢浂搴撳瓨鏄庣粏璁板綍 - StockId: {stockId}");
- }
- }
- catch (Exception ex)
- {
- _logger.LogWarning($"鍒犻櫎闆跺簱瀛樿褰曞け璐� - StockId: {stockId}, Error: {ex.Message}");
- // 娉ㄦ剰锛氬垹闄ゅけ璐ヤ笉搴旇褰卞搷涓绘祦绋嬶紝璁板綍鏃ュ織鍚庣户缁�
- }
- }
- /// <summary>
- /// 澶勭悊鍥炲簱鐩稿叧鐨勬墍鏈夊簱瀛樻槑缁嗙姸鎬佸彉鏇�
- /// </summary>
- private async Task ProcessStockDetailsForReturn(Dt_Task returnTask, int stockId)
- {
- // 鑾峰彇璇ユ墭鐩樹笅鎵�鏈夐渶瑕佸洖搴撶殑搴撳瓨鏄庣粏
- var stockDetails = await _stockService.StockInfoDetailService.Db.Queryable<Dt_StockInfoDetail>()
- .Where(x => x.StockId == stockId &&
- x.StockQuantity > 0 &&
- (x.Status == StockStatusEmun.鍑哄簱閿佸畾.ObjToInt() || x.Status ==
- StockStatusEmun.鍏ュ簱纭.ObjToInt())) // 鍖呮嫭鍑哄簱閿佸畾鍜屽叆搴撶‘璁ょ殑
- .ToListAsync();
-
- foreach (var detail in stockDetails)
- {
-
- detail.Status = StockStatusEmun.鍏ュ簱瀹屾垚.ObjToInt();
- detail.OutboundQuantity = 0; // 娓呯┖鍑哄簱鏁伴噺
-
- _logger.LogInformation($"鏇存柊搴撳瓨鏄庣粏鐘舵�� - 鏉$爜: {detail.Barcode}, 鏁伴噺: {detail.StockQuantity}");
- }
-
- if (stockDetails.Any())
- {
- await _stockService.StockInfoDetailService.Db.Updateable(stockDetails).ExecuteCommandAsync();
- _logger.LogInformation($"鍏辨洿鏂皗stockDetails.Count}涓簱瀛樻槑缁嗙姸鎬佷负鍏ュ簱瀹屾垚");
- }
- }
public async Task<WebResponseContent> OutEmptyTaskCompleted(Dt_Task task)
{
WebResponseContent content = new WebResponseContent();
@@ -835,12 +2053,27 @@
task.TaskStatus = TaskStatusEnum.Finish.ObjToInt();
- BaseDal.DeleteAndMoveIntoHty(task, App.User.UserId == 0 ? OperateTypeEnum.鑷姩瀹屾垚 : OperateTypeEnum.浜哄伐瀹屾垚);
- _stockService.StockInfoService.Repository.DeleteAndMoveIntoHty(stockInfo, App.User.UserId == 0 ? OperateTypeEnum.鑷姩瀹屾垚 : OperateTypeEnum.浜哄伐瀹屾垚);
- //_stockRepository.Db.Deleteable(stockInfo).ExecuteCommand();
- _stockService.StockInfoService.DeleteData(stockInfo);
- _locationStatusChangeRecordService.AddLocationStatusChangeRecord(locationInfo, beforeStatus, StockChangeType.Outbound.ObjToInt(), stockInfo.Details.FirstOrDefault()?.OrderNo ?? "", task.TaskNum);
+ // BaseDal.DeleteAndMoveIntoHty(task, App.User.UserId == 0 ? OperateTypeEnum.鑷姩瀹屾垚 : OperateTypeEnum.浜哄伐瀹屾垚);
+ var result = _task_HtyService.DeleteAndMoveIntoHty(task, OperateTypeEnum.浜哄伐鍒犻櫎);
+ if (!result)
+ {
+ await Db.Deleteable(task).ExecuteCommandAsync();
+ }
+ var stockresult = _stockService.StockInfoService.Repository.DeleteAndMoveIntoHty(stockInfo, App.User.UserId == 0 ? OperateTypeEnum.鑷姩瀹屾垚 : OperateTypeEnum.浜哄伐瀹屾垚);
+ if (!stockresult)
+ {
+ _stockRepository.Db.Deleteable(stockInfo).ExecuteCommand();
+ }
+ _stockService.StockInfoService.DeleteData(stockInfo);
+ try
+ {
+ _locationStatusChangeRecordService.AddLocationStatusChangeRecord(locationInfo, beforeStatus, StockChangeType.Outbound.ObjToInt(), stockInfo?.Details.FirstOrDefault()?.OrderNo ?? "", task.TaskNum);
+ }
+ catch (Exception ex)
+ {
+ _logger.LogError($"TaskService OutEmptyTaskCompleted AddLocationStatusChangeRecord: {ex.Message} ");
+ }
return await Task.FromResult(WebResponseContent.Instance.OK());
}
@@ -995,5 +2228,623 @@
}
}
+ public Task<WebResponseContent> HandCompleteTask(string TaskNum)
+ {
+ return TaskCompleted(TaskNum);
+ }
+
+ /// <summary>
+ /// 鐩樼偣鍑哄簱瀹屾垚
+ /// </summary>
+ public async Task<WebResponseContent> OutInventoryTaskCompleted(Dt_Task task)
+ {
+ WebResponseContent content = new WebResponseContent();
+ try
+ {
+ task = BaseDal.QueryFirst(x => x.TaskNum == task.TaskNum);
+ if (task == null)
+ {
+ return WebResponseContent.Instance.Error("鏈壘鍒颁换鍔′俊鎭�");
+ }
+ var SourceAddress = task.SourceAddress;
+ Dt_StockInfo stockInfo = _stockService.StockInfoService.Repository.QueryFirst(x=>x.PalletCode == task.PalletCode);
+ Dt_LocationInfo locationInfo = _basicService.LocationInfoService.Repository.QueryFirst(x => x.LocationCode == SourceAddress);
+ if (stockInfo == null) return WebResponseContent.Instance.Error("鏈壘鍒板簱瀛樹俊鎭�");
+ if (locationInfo == null) return WebResponseContent.Instance.Error("鏈壘鍒拌揣浣嶄俊鎭�");
+ //鑾峰彇瀵瑰簲鐩樼偣鍗�
+ Dt_TakeStockOrder takeStockOrder = _takeStockOrder.Db.Queryable<Dt_TakeStockOrder>().Where(x => x.OrderNo == task.OrderNo).Includes(x => x.Details).First();
+ if (takeStockOrder == null)
+ {
+ return content.Error($"鐩樼偣鍗晎task.OrderNo}涓嶅瓨鍦�");
+ }
+ if (takeStockOrder.TakeStockStatus != TakeStockStatusEnum.鐩樼偣涓�.ObjToInt())
+ {
+ return content.Error($"鐩樼偣鍗晎task.OrderNo}鐩樼偣宸插畬鎴愭垨鏈紑濮�");
+ }
+ if (stockInfo.StockStatus != StockStatusEmun.鐩樼偣鍑哄簱閿佸畾.ObjToInt())
+ {
+ return content.Error($"{stockInfo.PalletCode}搴撳瓨鐘舵�佷笉姝g‘");
+ }
+ if (locationInfo.LocationStatus != LocationStatusEnum.Lock.ObjToInt())
+ {
+ return content.Error($"{locationInfo.LocationCode}璐т綅鐘舵�佷笉姝g‘");
+ }
+
+ stockInfo.StockStatus = StockStatusEmun.鐩樼偣鍑哄簱瀹屾垚.ObjToInt();
+ stockInfo.LocationCode = "";
+ task.TaskStatus = TaskStatusEnum.Finish.ObjToInt();
+ int beforeStatus = locationInfo.LocationStatus;
+ locationInfo.LocationStatus = LocationStatusEnum.Free.ObjToInt();
+ _unitOfWorkManage.BeginTran();
+ //璐т綅鍙樺姩璁板綍
+ _basicService.LocationInfoService.UpdateData(locationInfo);
+ _recordService.LocationStatusChangeRecordSetvice.AddLocationStatusChangeRecord(locationInfo, beforeStatus, LocationStatusEnum.Free.ObjToInt(), takeStockOrder?.OrderNo ?? "", task.TaskNum);
+ _stockRepository.UpdateData(stockInfo);
+ BaseDal.DeleteAndMoveIntoHty(task, App.User.UserId == 0 ? OperateTypeEnum.鑷姩瀹屾垚 : OperateTypeEnum.浜哄伐瀹屾垚);
+ _unitOfWorkManage.CommitTran();
+ content.OK();
+ }
+ catch (Exception ex)
+ {
+ _unitOfWorkManage.RollbackTran();
+ return await Task.FromResult(WebResponseContent.Instance.Error(ex.Message));
+ }
+ return content;
+ }
+
+ /// <summary>
+ /// 鐩樼偣鍏ュ簱瀹屾垚
+ /// </summary>
+ /// <param name="task"></param>
+ /// <returns></returns>
+ public async Task<WebResponseContent> InInventoryTaskCompleted(Dt_Task task)
+ {
+
+ WebResponseContent content = new WebResponseContent();
+ try
+ {
+
+ Dt_LocationInfo locationInfo = _locationInfoService.Repository.QueryFirst(x => x.LocationCode == task.TargetAddress);
+ if (locationInfo == null)
+ {
+ return content.Error($"鏈壘鍒板搴旂殑缁堢偣璐т綅淇℃伅");
+ }
+ Dt_StockInfo stockInfo = _stockRepository.Db.Queryable<Dt_StockInfo>().Where(x => x.PalletCode == task.PalletCode && x.WarehouseId == task.WarehouseId).First();
+ if (stockInfo == null)
+ {
+ return WebResponseContent.Instance.Error($"鏈壘鍒版墭鐩樺搴旂殑缁勭洏淇℃伅");
+ }
+
+ if (!string.IsNullOrEmpty(stockInfo.LocationCode))
+ {
+ return WebResponseContent.Instance.Error($"璇ユ墭鐩樺凡缁戝畾璐т綅");
+ }
+ if (locationInfo.LocationStatus == LocationStatusEnum.InStock.ObjToInt())
+ {
+ return WebResponseContent.Instance.Error($"璐т綅鐘舵�佷笉姝g‘");
+ }
+
+
+ var beforelocationStatus = locationInfo.LocationStatus;
+ locationInfo.LocationStatus = LocationStatusEnum.InStock.ObjToInt();
+
+
+ stockInfo.LocationCode = locationInfo.LocationCode;
+ stockInfo.PalletCode = task.PalletCode;
+ stockInfo.LocationCode = task.TargetAddress;
+ stockInfo.StockStatus = StockStatusEmun.鍏ュ簱瀹屾垚.ObjToInt();
+ task.TaskStatus = TaskStatusEnum.Finish.ObjToInt();
+
+ _unitOfWorkManage.BeginTran();
+ _locationInfoService.Repository.UpdateData(locationInfo);
+ _stockRepository.UpdateData(stockInfo);
+ var result = _task_HtyService.DeleteAndMoveIntoHty(task, OperateTypeEnum.浜哄伐鍒犻櫎);
+ _unitOfWorkManage.CommitTran();
+
+ if (!result)
+ {
+ await Db.Deleteable(task).ExecuteCommandAsync();
+ }
+ try
+ {
+ _locationStatusChangeRecordService.AddLocationStatusChangeRecord(locationInfo, beforelocationStatus, StockChangeType.Inbound.ObjToInt(), "", task.TaskNum);
+ }
+ catch (Exception ex)
+ {
+ _logger.LogInformation($"InEmptyTaskCompleted AddLocationStatusChangeRecord : {ex.Message} ");
+ }
+ return content.OK();
+ }
+ catch (Exception ex)
+ {
+ _unitOfWorkManage.RollbackTran();
+ return await Task.FromResult(WebResponseContent.Instance.Error(ex.Message));
+ }
+ }
+
+ /// <summary>
+ /// 閲嶆鍏ュ簱瀹屾垚
+ /// </summary>
+ /// <param name="task"></param>
+ /// <returns></returns>
+ public async Task<WebResponseContent> InQualityTaskCompleted(Dt_Task task)
+ {
+
+ WebResponseContent content = new WebResponseContent();
+ try
+ {
+
+ 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($"鏈壘鍒版墭鐩樺搴旂殑缁勭洏淇℃伅");
+ }
+
+ if (stockInfo.Details.Count == 0 && stockInfo.PalletType != PalletTypeEnum.Empty.ObjToInt())
+ {
+ _logger.LogInformation($"TaskService InPickTaskCompleted: 鏈壘鍒拌鎵樼洏搴撳瓨鏄庣粏淇℃伅.{task.TaskNum}");
+ return WebResponseContent.Instance.Error($"鏈壘鍒拌鎵樼洏搴撳瓨鏄庣粏淇℃伅");
+ }
+ Dt_LocationInfo locationInfo = _locationInfoService.Repository.QueryFirst(x => x.LocationCode == task.TargetAddress);
+ if (locationInfo == null)
+ {
+ return content.Error($"鏈壘鍒板搴旂殑缁堢偣璐т綅淇℃伅");
+ }
+
+ if (!string.IsNullOrEmpty(stockInfo.LocationCode))
+ {
+ return WebResponseContent.Instance.Error($"璇ユ墭鐩樺凡缁戝畾璐т綅");
+ }
+ if (locationInfo.LocationStatus == LocationStatusEnum.InStock.ObjToInt())
+ {
+ return WebResponseContent.Instance.Error($"璐т綅鐘舵�佷笉姝g‘");
+ }
+
+ _unitOfWorkManage.BeginTran();
+
+ var beforelocationStatus = locationInfo.LocationStatus;
+ locationInfo.LocationStatus = LocationStatusEnum.InStock.ObjToInt();
+ _locationInfoService.Repository.UpdateData(locationInfo);
+
+ stockInfo.LocationCode = locationInfo.LocationCode;
+ stockInfo.PalletCode = task.PalletCode;
+ stockInfo.LocationCode = task.TargetAddress;
+ stockInfo.StockStatus = StockStatusEmun.鍏ュ簱瀹屾垚.ObjToInt();
+ _stockRepository.UpdateData(stockInfo);
+
+ task.TaskStatus = TaskStatusEnum.Finish.ObjToInt();
+ var result = _task_HtyService.DeleteAndMoveIntoHty(task, OperateTypeEnum.鑷姩瀹屾垚);
+ _unitOfWorkManage.CommitTran();
+ if (!result)
+ {
+ await Db.Deleteable(task).ExecuteCommandAsync();
+ }
+ Dt_OutboundOrder outboundOrder = _outboundOrderService.Db.Queryable<Dt_OutboundOrder>().Where(x => x.OrderNo == stockInfo.Details.FirstOrDefault().OrderNo).Includes(x => x.Details).First();
+
+ if (outboundOrder != null)
+ {
+ foreach (var item in stockInfo.Details.Where(x => x.OrderNo == outboundOrder.OrderNo).ToList())
+ {
+ var inbounddetail = _allocateMaterialInfo.QueryFirst(x => x.OrderNo == item.OrderNo && x.Barcode == item.Barcode);
+ if (inbounddetail != null)
+ {
+ var alldelete = _allocateMaterialInfo.DeleteAndMoveIntoHty(inbounddetail, OperateTypeEnum.鑷姩鍒犻櫎);
+ if (!alldelete)
+ {
+ await Db.Deleteable(task).ExecuteCommandAsync();
+ }
+ }
+ }
+ }
+ try
+ {
+ _locationStatusChangeRecordService.AddLocationStatusChangeRecord(locationInfo, beforelocationStatus, StockChangeType.Inbound.ObjToInt(), "", task.TaskNum);
+ }
+ catch (Exception ex)
+ {
+ _logger.LogInformation($"InEmptyTaskCompleted AddLocationStatusChangeRecord : {ex.Message} ");
+ }
+ return content;
+ }
+ catch (Exception ex)
+ {
+ _unitOfWorkManage.RollbackTran();
+ 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}"));
+ }
+ }
+
+
+ /// <summary>
+ /// 璺ㄥ尯鍩熺Щ搴撲换鍔″畬鎴�
+ /// </summary>
+ /// <param name="task"></param>
+ /// <returns></returns>
+ public async Task<WebResponseContent> CrossAreaRelocationTaskCompleted(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($"CrossAreaRelocationTaskCompleted: 鏈壘鍒拌鎵樼洏搴撳瓨鏄庣粏淇℃伅.{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.3 鏇存柊搴撳瓨锛氱粦瀹氭柊璐т綅 + 鎭㈠姝e父鐘舵��
+ string oldLocationCode = stockInfo.LocationCode;
+ stockInfo.LocationCode = targetLocationInfo.LocationCode;
+ stockInfo.StockStatus = StockStatusEmun.鍏ュ簱瀹屾垚.ObjToInt();
+ stockInfo.LocationType = targetLocationInfo.LocationType;
+ _stockRepository.UpdateData(stockInfo);
+
+ // 5.4 浠诲姟鏍囪涓哄畬鎴�
+ 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($"CrossAreaRelocationTaskCompleted 璁板綍鏃ュ織寮傚父锛歿ex.Message}");
+ }
+
+ return content.OK("璺ㄥ尯鍩熺Щ搴撲换鍔″畬鎴�");
+ }
+ catch (Exception ex)
+ {
+ _unitOfWorkManage.RollbackTran();
+ _logger.LogError($"CrossAreaRelocationTaskCompleted 澶勭悊澶辫触锛歿ex.Message}", ex);
+ return await Task.FromResult(WebResponseContent.Instance.Error($"璺ㄥ尯鍩熺Щ搴撲换鍔″鐞嗗け璐ワ細{ex.Message}"));
+ }
+ }
}
}
+
--
Gitblit v1.9.3