#region << 版 本 注 释 >> /*---------------------------------------------------------------- * 命名空间:WIDESEA_TaskInfoService * 创建者:胡童庆 * 创建时间:2024/8/2 16:13:36 * 版本:V1.0.0 * 描述: * * ---------------------------------------------------------------- * 修改人: * 修改时间: * 版本:V1.0.1 * 修改说明: * *----------------------------------------------------------------*/ #endregion << 版 本 注 释 >> using AutoMapper; using MailKit.Search; using Newtonsoft.Json; using OfficeOpenXml.FormulaParsing.Excel.Functions.Text; using Org.BouncyCastle.Asn1.Tsp; using SqlSugar; using System; using System.Collections.Generic; using System.ComponentModel; using System.Diagnostics.CodeAnalysis; using System.Linq; using System.Reflection; using System.Reflection.Metadata; using System.Text; using System.Threading.Tasks; using WIDESEA_Core; using WIDESEA_Core.BaseRepository; using WIDESEA_Core.BaseServices; using WIDESEA_Core.Enums; using WIDESEA_Core.Helper; using WIDESEA_DTO.Inbound; using WIDESEA_DTO.Stock; using WIDESEA_IBasicRepository; using WIDESEA_IBasicService; using WIDESEA_IInboundService; using WIDESEA_IOutboundRepository; using WIDESEA_IOutboundService; using WIDESEA_IRecordService; using WIDESEA_IStockRepository; using WIDESEA_IStockService; using WIDESEA_ITaskInfoRepository; using WIDESEA_ITaskInfoService; using WIDESEA_Model.Models; using WIDESEA_TaskInfoRepository; namespace WIDESEA_TaskInfoService { public partial class TaskService : ServiceBase, ITaskService { private readonly IMapper _mapper; private readonly IUnitOfWorkManage _unitOfWorkManage; private readonly IBasicService _basicService; private readonly IOutboundService _outboundService; private readonly IInboundService _inboundService; private readonly IRecordService _recordService; private readonly IStockService _stockService; private readonly ITask_HtyService _taskHtyService; private readonly ILocationInfoService _locationInfoService; public ITaskRepository Repository => BaseDal; public TaskService(ITaskRepository BaseDal, IMapper mapper, IUnitOfWorkManage unitOfWorkManage, IBasicService basicService, IOutboundService outboundService, IInboundService inboundService, IRecordService recordService, IStockService stockService, ITask_HtyService taskHtyService, ILocationInfoService locationInfoService) : base(BaseDal) { _mapper = mapper; _unitOfWorkManage = unitOfWorkManage; _basicService = basicService; _outboundService = outboundService; _inboundService = inboundService; _recordService = recordService; _stockService = stockService; _taskHtyService = taskHtyService; _locationInfoService = locationInfoService; } /// /// 任务完成 /// /// 任务号 /// 返回处理结果 public WebResponseContent TaskCompleted(int taskNum) { try { Dt_Task task = BaseDal.QueryFirst(x => x.TaskNum == taskNum); if (task == null) { 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 = _stockService.StockInfoService.Repository.GetStockInfo(task.PalletCode); Dt_LocationInfo locationInfo = _basicService.LocationInfoService.Repository.QueryFirst(x => x.LocationCode == task.TargetAddress); CheckCompleted(stockInfo, locationInfo); stockInfo.LocationCode = locationInfo.LocationCode; stockInfo.StockStatus = StockStatusEmun.已入库.ObjToInt(); _stockService.StockInfoService.Repository.UpdateData(stockInfo); beforeQuantity = stockInfo.Details.Where(x => x.Id != 0).Sum(x => x.StockQuantity); int beforeStatus = locationInfo.LocationStatus; locationInfo.LocationStatus = LocationStatusEnum.InStock.ObjToInt(); _basicService.LocationInfoService.UpdateLocationFree(locationInfo, task.TaskNum, StockChangeType.Inbound.ObjToInt(),false); _basicService.LocationInfoService.Repository.UpdateData(locationInfo); task.TaskStatus = InTaskStatusEnum.InFinish.ObjToInt(); BaseDal.DeleteAndMoveIntoHty(task, App.User.UserId == 0 ? OperateType.自动完成 : OperateType.人工完成); _recordService.LocationStatusChangeRecordSetvice.AddLocationStatusChangeRecord(locationInfo, beforeStatus, StockChangeType.Inbound.ObjToInt(), stockInfo.Details.FirstOrDefault()?.OrderNo ?? "", task.TaskNum); _recordService.StockQuantityChangeRecordService.AddStockChangeRecord(stockInfo, stockInfo.Details, beforeQuantity, stockInfo.Details.Sum(x => x.StockQuantity) + beforeQuantity, StockChangeType.Inbound); return WebResponseContent.Instance.OK(); } /// /// 空托盘入库完成处理 /// /// 任务实体对象 /// 返回处理结果 public WebResponseContent PalletInboundTaskCompleted(Dt_Task task) { Dt_StockInfo stockInfo = new Dt_StockInfo() { PalletCode = task.PalletCode, LocationCode = task.TargetAddress, StockStatus = StockStatusEmun.已入库.ObjToInt() }; Dt_LocationInfo locationInfo = _basicService.LocationInfoService.Repository.QueryFirst(x => x.LocationCode == task.TargetAddress); CheckCompleted(stockInfo, locationInfo); _stockService.StockInfoService.Repository.AddData(stockInfo); int beforeStatus = locationInfo.LocationStatus; locationInfo.LocationStatus = LocationStatusEnum.Pallet.ObjToInt(); _basicService.LocationInfoService.UpdateLocationFree(locationInfo, task.TaskNum, StockChangeType.Inbound.ObjToInt(), false); _basicService.LocationInfoService.Repository.UpdateData(locationInfo); task.TaskStatus = InTaskStatusEnum.InFinish.ObjToInt(); BaseDal.DeleteAndMoveIntoHty(task, App.User.UserId == 0 ? OperateType.自动完成 : OperateType.人工完成); _recordService.LocationStatusChangeRecordSetvice.AddLocationStatusChangeRecord(locationInfo, beforeStatus, StockChangeType.Inbound.ObjToInt(), "", task.TaskNum); return WebResponseContent.Instance.OK(); } /// /// 验证数据 /// /// /// /// private (bool, string) CheckCompleted(Dt_StockInfo stockInfo, Dt_LocationInfo locationInfo, bool isCheckStockDetail = true) { if (stockInfo == null) { return (false, "未找到组盘信息"); } if (locationInfo == null) { return (false, "未找到货位信息"); } if (isCheckStockDetail && (stockInfo.Details == null || stockInfo.Details.Count == 0)) { return (false, "未找到组盘明细信息"); } return (true, "成功"); } public WebResponseContent OutboundTaskCompleted(Dt_Task task) { decimal beforeQuantity = 0; Dt_StockInfo stockInfo = _stockService.StockInfoService.Repository.GetStockInfo(task.PalletCode); Dt_LocationInfo locationInfo = _basicService.LocationInfoService.Repository.QueryFirst(x => x.LocationCode == task.SourceAddress); CheckCompleted(stockInfo, locationInfo); stockInfo.LocationCode = locationInfo.LocationCode; stockInfo.StockStatus = StockStatusEmun.出库完成.ObjToInt(); _stockService.StockInfoService.Repository.UpdateData(stockInfo); int beforeStatus = locationInfo.LocationStatus; if (task.Depth == 1) { if (DepthTask(task)) { } else { locationInfo.LocationStatus = LocationStatusEnum.Free.ObjToInt(); _basicService.LocationInfoService.UpdateLocationFree(locationInfo, task.TaskNum, StockChangeType.Outbound.ObjToInt(), false); _basicService.LocationInfoService.Repository.UpdateData(locationInfo); } } else { locationInfo.LocationStatus = LocationStatusEnum.Free.ObjToInt(); _basicService.LocationInfoService.UpdateLocationFree(locationInfo, task.TaskNum, StockChangeType.Outbound.ObjToInt(), false); _basicService.LocationInfoService.Repository.UpdateData(locationInfo); } task.TaskStatus = OutTaskStatusEnum.OutFinish.ObjToInt(); BaseDal.DeleteAndMoveIntoHty(task, App.User.UserId == 0 ? OperateType.自动完成 : OperateType.人工完成); _stockService.StockInfoService.Repository.DeleteAndMoveIntoHty(stockInfo, App.User.UserId == 0 ? OperateType.自动完成 : OperateType.人工完成); _stockService.StockInfoDetailService.Repository.DeleteAndMoveIntoHty(stockInfo.Details, App.User.UserId == 0 ? OperateType.自动完成 : OperateType.人工完成); beforeQuantity = stockInfo.Details.Where(x => x.Id != 0).Sum(x => x.StockQuantity); _recordService.LocationStatusChangeRecordSetvice.AddLocationStatusChangeRecord(locationInfo, beforeStatus, StockChangeType.Outbound.ObjToInt(), stockInfo.Details.FirstOrDefault()?.OrderNo ?? "", task.TaskNum); _recordService.StockQuantityChangeRecordService.AddStockChangeRecord(stockInfo, stockInfo.Details, beforeQuantity, stockInfo.Details.Sum(x => x.StockQuantity) - beforeQuantity, StockChangeType.Outbound); return OnOutboundTaskCompleted?.Invoke(task) ?? WebResponseContent.Instance.OK(); } public WebResponseContent PalletOutboundTaskCompleted(Dt_Task task) { Dt_StockInfo stockInfo = _stockService.StockInfoService.Repository.GetStockInfo(task.PalletCode); Dt_LocationInfo locationInfo = _basicService.LocationInfoService.Repository.QueryFirst(x => x.LocationCode == task.SourceAddress); CheckCompleted(stockInfo, locationInfo); _stockService.StockInfoService.Repository.DeleteData(stockInfo); int beforeStatus = locationInfo.LocationStatus; locationInfo.LocationStatus = LocationStatusEnum.Free.ObjToInt(); _basicService.LocationInfoService.UpdateLocationFree(locationInfo, task.TaskNum, StockChangeType.Outbound.ObjToInt(), false); _basicService.LocationInfoService.Repository.UpdateData(locationInfo); task.TaskStatus = OutTaskStatusEnum.OutFinish.ObjToInt(); BaseDal.DeleteAndMoveIntoHty(task, App.User.UserId == 0 ? OperateType.自动完成 : OperateType.人工完成); _stockService.StockInfoService.Repository.DeleteAndMoveIntoHty(stockInfo, App.User.UserId == 0 ? OperateType.自动完成 : OperateType.人工完成); _recordService.LocationStatusChangeRecordSetvice.AddLocationStatusChangeRecord(locationInfo, beforeStatus, StockChangeType.Outbound.ObjToInt(), stockInfo.Details.FirstOrDefault()?.OrderNo ?? "", task.TaskNum); return WebResponseContent.Instance.OK(); } public WebResponseContent RelocationTaskCompleted(Dt_Task task) { Dt_StockInfo stockInfo = _stockService.StockInfoService.Repository.GetStockInfo(task.PalletCode); Dt_LocationInfo locationEnd = _basicService.LocationInfoService.Repository.QueryFirst(x => x.LocationCode == task.TargetAddress); CheckCompleted(stockInfo, locationEnd); stockInfo.LocationCode = locationEnd.LocationCode; stockInfo.StockStatus = StockStatusEmun.已入库.ObjToInt(); _stockService.StockInfoService.Repository.UpdateData(stockInfo); _basicService.LocationInfoService.RelocationFree(locationEnd, task.TaskNum); task.TaskStatus = InTaskStatusEnum.RelocationFinish.ObjToInt(); BaseDal.DeleteAndMoveIntoHty(task, App.User.UserId == 0 ? OperateType.自动完成 : OperateType.人工完成); return WebResponseContent.Instance.OK(); } public bool DepthTask(Dt_Task task) { Dt_LocationInfo location=_locationInfoService.Repository.QueryFirst(x=>x.LocationCode == task.SourceAddress); if(location != null) { if(location.Row%2==0) { Dt_LocationInfo locations = _locationInfoService.Repository.QueryFirst(x => x.Row == location.Row + 1 && x.Layer == location.Layer && x.Column == location.Column && x.RoadwayNo == location.RoadwayNo); Dt_Task tasks=BaseDal.QueryFirst(x=>x.SourceAddress == locations.LocationCode); return tasks != null ? true : false; } else { Dt_LocationInfo locations = _locationInfoService.Repository.QueryFirst(x => x.Row == location.Row - 1 && x.Layer == location.Layer && x.Column == location.Column && x.RoadwayNo == location.RoadwayNo); Dt_Task tasks = BaseDal.QueryFirst(x => x.SourceAddress == locations.LocationCode); return tasks != null ? true : false; } } return false; } /// /// 创建任务 /// /// /// public Dt_Task CreateTask(Dt_Task tasks) { try { if (tasks.TaskType == (int)TaskTypeEnum.Inbound) { Dt_Task task = new Dt_Task() { TaskType = (int)TaskTypeEnum.Outbound, //任务类型 CreateDate = DateTime.Now, ModifyDate = DateTime.Now, Grade = 1, Creater = "创智WMS",// 创建人 }; return task; } else { return null; } } catch (Exception ex) { //WriteLog.GetLog("创建任务").Write($"{JsonConvert.SerializeObject(ex.Message)}{Environment.NewLine}", "创建任务"); throw; } } } }