#region << 版 本 注 释 >> /*---------------------------------------------------------------- * 命名空间:WIDESEA_TaskInfoService * 创建者:胡童庆 * 创建时间:2024/8/2 16:13:36 * 版本:V1.0.0 * 描述: * * ---------------------------------------------------------------- * 修改人: * 修改时间: * 版本:V1.0.1 * 修改说明: * *----------------------------------------------------------------*/ #endregion << 版 本 注 释 >> using AutoMapper; using MailKit.Search; using Microsoft.Extensions.Logging; using Newtonsoft.Json; using Org.BouncyCastle.Asn1.Ocsp; using SqlSugar; using System.Reflection; using System.Reflection.Emit; using System.Threading.Tasks; using System.Xml.Linq; using WIDESEA_Common.CommonEnum; using WIDESEA_Common.LocationEnum; using WIDESEA_Common.OrderEnum; using WIDESEA_Common.StockEnum; using WIDESEA_Common.TaskEnum; using WIDESEA_Common.WareHouseEnum; using WIDESEA_Core; using WIDESEA_Core.BaseRepository; using WIDESEA_Core.BaseServices; using WIDESEA_Core.Enums; using WIDESEA_Core.Helper; using WIDESEA_DTO.Basic; using WIDESEA_DTO.Task; using WIDESEA_IBasicService; using WIDESEA_IInboundService; using WIDESEA_IOutboundService; using WIDESEA_IRecordService; using WIDESEA_IStockService; using WIDESEA_ITaskInfoService; using WIDESEA_Model.Models; namespace WIDESEA_TaskInfoService { public partial class TaskService : ServiceBase>, ITaskService { private readonly ILogger _logger; private readonly IMapper _mapper; private readonly IUnitOfWorkManage _unitOfWorkManage; private readonly IRepository _stockRepository; private readonly ILocationInfoService _locationInfoService; private readonly IInboundOrderService _inboundOrderService; private readonly IInboundOrderDetailService _inboundOrderDetailService; private readonly ILocationStatusChangeRecordService _locationStatusChangeRecordService; private readonly IESSApiService _eSSApiService; private readonly IStockService _stockService; private readonly IRecordService _recordService; public IRepository Repository => BaseDal; private Dictionary _taskOrderBy = new() { {nameof(Dt_Task.Grade),SqlSugar.OrderByType.Desc }, {nameof(Dt_Task.CreateDate),SqlSugar.OrderByType.Asc}, }; private Dictionary stations = new Dictionary { {"3-5","3-9" }, {"2-5","2-9" }, {"1-11","1-1" }, }; public List TaskTypes => typeof(TaskTypeEnum).GetEnumIndexList(); public List TaskOutboundTypes => typeof(TaskTypeEnum).GetEnumIndexList(); public TaskService(IRepository BaseDal, IMapper mapper, IUnitOfWorkManage unitOfWorkManage, IRepository stockRepository, ILocationInfoService locationInfoService, IInboundOrderService inboundOrderService, ILocationStatusChangeRecordService locationStatusChangeRecordService, IESSApiService eSSApiService, ILogger logger, IStockService stockService, IRecordService recordService, IInboundOrderDetailService inboundOrderDetailService) : base(BaseDal) { _mapper = mapper; _unitOfWorkManage = unitOfWorkManage; _stockRepository = stockRepository; _locationInfoService = locationInfoService; _inboundOrderService = inboundOrderService; _locationStatusChangeRecordService = locationStatusChangeRecordService; _eSSApiService = eSSApiService; _logger = logger; _stockService = stockService; _recordService = recordService; _inboundOrderDetailService = inboundOrderDetailService; } /// /// /// /// /// public async Task TaskCompleted(string taskNum) { try { Dt_Task task; if (int.TryParse(taskNum, out var newTaskNum)) { task = BaseDal.QueryFirst(x => x.TaskNum == newTaskNum); if (task == null) { return WebResponseContent.Instance.Error("未找到任务信息"); } } else { return WebResponseContent.Instance.Error("未找到任务信息"); } MethodInfo? methodInfo = GetType().GetMethod(((TaskTypeEnum)task.TaskType) + "TaskCompleted"); if (methodInfo != null) { WebResponseContent? responseContent = (WebResponseContent?)methodInfo.Invoke(this, new object[] { task }); if (responseContent != null) { return responseContent; } } return WebResponseContent.Instance.Error("未找到任务类型对应业务处理逻辑"); } catch (Exception ex) { return WebResponseContent.Instance.Error(ex.Message); } } /// /// 入库完成 /// /// /// public WebResponseContent InboundTaskCompleted(Dt_Task task) { decimal beforeQuantity = 0; //查库存 Dt_StockInfo stockInfo = _stockRepository.Db.Queryable().Where(x => x.PalletCode == task.PalletCode && x.WarehouseId == task.WarehouseId).First(); if (stockInfo == null) { return WebResponseContent.Instance.Error($"未找到托盘对应的组盘信息"); } if (stockInfo.Details.Count == 0 && stockInfo.PalletType != PalletTypeEnum.Empty.ObjToInt()) { return WebResponseContent.Instance.Error($"未找到该托盘库存明细信息"); } //查货位 Dt_LocationInfo locationInfo = _locationInfoService.Repository.QueryFirst(x => x.LocationCode == task.TargetAddress); if (locationInfo == null) { return WebResponseContent.Instance.Error($"未找到对应的终点货位信息"); } var ordernos = stockInfo.Details.GroupBy(x => x.OrderNo).Select(o => o.Key).ToList(); var inboundOrders = _inboundOrderService.Repository.Db.Queryable().Where(x => ordernos.Contains(x.InboundOrderNo)).Includes(x => x.Details).ToList(); Dt_InboundOrderDetail? inboundOrderDetail = null; foreach (var inboundOrder in inboundOrders) { //标准入库流程查找入库单据 if (inboundOrder != null && stockInfo.StockStatus == StockStatusEmun.入库确认.ObjToInt()) { foreach (var item in stockInfo.Details.Where(x => x.OrderNo == inboundOrder.InboundOrderNo).ToList()) { var inbounddetail = inboundOrder.Details.Where(x => x.lineNo == item.InboundOrderRowNo && x.Barcode == item.Barcode).FirstOrDefault(); if (inbounddetail != null) { inbounddetail.OverInQuantity += item.StockQuantity; if (inbounddetail.OverInQuantity == inbounddetail.OrderQuantity) { inbounddetail.OrderDetailStatus = OrderDetailStatusEnum.Over.ObjToInt(); } else if (inbounddetail.OrderDetailStatus == OrderDetailStatusEnum.New.ObjToInt()) { inbounddetail.OrderDetailStatus = OrderDetailStatusEnum.Inbounding.ObjToInt(); } _inboundOrderDetailService.UpdateData(inbounddetail); } } if (inboundOrder.Details.Count == inboundOrder.Details.Where(x => x.OrderQuantity == x.OverInQuantity).Count()) { inboundOrder.OrderStatus = InOrderStatusEnum.入库完成.ObjToInt(); } else if (inboundOrder.OrderStatus == InOrderStatusEnum.未开始.ObjToInt()) { inboundOrder.OrderStatus = InOrderStatusEnum.入库中.ObjToInt(); } _inboundOrderService.UpdateData(inboundOrder); } } stockInfo.LocationCode = task.TargetAddress; stockInfo.StockStatus = StockStatusEmun.入库完成.ObjToInt(); stockInfo.Details.ForEach(x => { x.Status = StockStatusEmun.入库完成.ObjToInt(); }); _stockService.StockInfoService.Repository.UpdateData(stockInfo); _stockService.StockInfoDetailService.Repository.UpdateData(stockInfo.Details); beforeQuantity = stockInfo.Details.Where(x => x.Id != 0).Sum(x => x.StockQuantity); int beforeStatus = locationInfo.LocationStatus; if (stockInfo.PalletType == PalletTypeEnum.Empty.ObjToInt()) { locationInfo.LocationStatus = LocationStatusEnum.Pallet.ObjToInt(); } else { locationInfo.LocationStatus = LocationStatusEnum.InStock.ObjToInt(); } _locationInfoService.Repository.UpdateData(locationInfo); 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); return WebResponseContent.Instance.OK(); } public async Task InEmptyTaskCompleted(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().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($"货位状态不正确"); } var beforelocationStatus = locationInfo.LocationStatus; locationInfo.LocationStatus = LocationStatusEnum.Pallet.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(); BaseDal.DeleteAndMoveIntoHty(task, App.User.UserId == 0 ? WIDESEA_Core.Enums.OperateTypeEnum.自动完成 : OperateTypeEnum.人工完成); _locationStatusChangeRecordService.AddLocationStatusChangeRecord(locationInfo, beforelocationStatus, StockChangeType.Inbound.ObjToInt(), "", task.TaskNum); return content; } catch (Exception ex) { return await Task.FromResult(WebResponseContent.Instance.Error(ex.Message)); } } public async Task OutEmptyTaskCompleted(Dt_Task task) { WebResponseContent content = new WebResponseContent(); try { Dt_StockInfo stockInfo = _stockRepository.Db.Queryable().Where(x => x.PalletCode == task.PalletCode && x.WarehouseId == task.WarehouseId).First(); if (stockInfo == null) { return WebResponseContent.Instance.Error($"未找到托盘对应的库存信息"); } Dt_LocationInfo locationInfo = _locationInfoService.Repository.QueryFirst(x => x.LocationCode == task.SourceAddress); if (locationInfo == null) { return content.Error($"未找到对应的终点货位信息"); } _stockRepository.Db.Deleteable(stockInfo); int beforeStatus = locationInfo.LocationStatus; locationInfo.LocationStatus = LocationStatusEnum.Free.ObjToInt(); _locationInfoService.Repository.UpdateData(locationInfo); 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.人工完成); _locationStatusChangeRecordService.AddLocationStatusChangeRecord(locationInfo, beforeStatus, StockChangeType.Outbound.ObjToInt(), stockInfo.Details.FirstOrDefault()?.OrderNo ?? "", task.TaskNum); return WebResponseContent.Instance.OK(); } catch (Exception ex) { return await Task.FromResult(WebResponseContent.Instance.Error(ex.Message)); } } } }