#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.Threading.Tasks; 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.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 ILocationStatusChangeRecordService _locationStatusChangeRecordService; private readonly IESSApiService _eSSApiService; 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) : base(BaseDal) { _mapper = mapper; _unitOfWorkManage = unitOfWorkManage; _stockRepository = stockRepository; _locationInfoService = locationInfoService; _inboundOrderService = inboundOrderService; _locationStatusChangeRecordService = locationStatusChangeRecordService; _eSSApiService = eSSApiService; _logger = logger; } public async Task RequestInboundTask(string palletCode, string stationCode) { try { Dt_Task dbtask = Repository.QueryFirst(x => x.PalletCode == palletCode); if (dbtask != null) { return WebResponseContent.Instance.Error($"该托盘已生成任务"); } Dt_StockInfo stockInfo = _stockRepository.Db.Queryable().Where(x => x.PalletCode == palletCode).Includes(x => x.Details).First(); if (stockInfo == null) { return WebResponseContent.Instance.Error($"未找到组盘信息"); } if (stockInfo.StockStatus != StockStatusEmun.组盘暂存.ObjToInt() && stockInfo.StockStatus != StockStatusEmun.手动组盘暂存.ObjToInt() && stockInfo.StockStatus != StockStatusEmun.拣选完成.ObjToInt()) { return WebResponseContent.Instance.Error($"该托盘状态不正确,不可申请入库"); } if (!string.IsNullOrEmpty(stockInfo.LocationCode)) { return WebResponseContent.Instance.Error($"该托盘已绑定货位"); } Dt_LocationInfo? locationInfo = _locationInfoService.AssignLocation(); if (locationInfo == null) { return WebResponseContent.Instance.Error($"货位分配失败,未找到可分配货位"); } var newTask = new Dt_Task() { CurrentAddress = stationCode, Grade = 0, NextAddress = stations.GetValueOrDefault(stationCode) ?? "", PalletCode = palletCode, Roadway = locationInfo.RoadwayNo, SourceAddress = stationCode, TargetAddress = locationInfo.LocationCode, TaskType = TaskTypeEnum.Inbound.ObjToInt(), TaskStatus = TaskStatusEnum.New.ObjToInt(), WarehouseId = stockInfo.WarehouseId, PalletType = stockInfo.PalletType, }; if (stockInfo.PalletType == PalletTypeEnum.Empty.ObjToInt()) { _unitOfWorkManage.BeginTran(); int taskId = BaseDal.AddData(newTask); newTask.TaskId = taskId; locationInfo.LocationStatus = LocationStatusEnum.Lock.ObjToInt(); _locationInfoService.UpdateData(locationInfo); stockInfo.StockStatus = StockStatusEmun.入库确认.ObjToInt(); _stockRepository.UpdateData(stockInfo); _unitOfWorkManage.CommitTran(); } else { //获取是否存在入库单 Dt_InboundOrder? inboundOrder = null; if (stockInfo != null && stockInfo.Details.Count > 0) { string? orderNo = stockInfo.Details.FirstOrDefault()?.OrderNo ?? ""; inboundOrder = _inboundOrderService.Repository.QueryFirst(x => x.InboundOrderNo == orderNo && x.OrderStatus < InOrderStatusEnum.入库完成.ObjToInt()); } if (inboundOrder != null) { if (inboundOrder.OrderType == InOrderTypeEnum.Allocat.ObjToInt()) { newTask.TaskType = TaskTypeEnum.InAllocate.ObjToInt(); } else if (inboundOrder.OrderType == InOrderTypeEnum.Return.ObjToInt()) { newTask.TaskType = TaskTypeEnum.ProductionReturn.ObjToInt(); } } if (stockInfo.StockStatus == StockStatusEmun.手动组盘暂存.ObjToInt()) { stockInfo.StockStatus = StockStatusEmun.手动组盘入库确认.ObjToInt(); } else if (stockInfo.StockStatus == StockStatusEmun.MES退库.ObjToInt()) { newTask.TaskType = TaskTypeEnum.MesMatReturn.ObjToInt(); } else if (stockInfo.StockStatus == StockStatusEmun.拣选完成.ObjToInt()) { stockInfo.StockStatus = StockStatusEmun.入库确认.ObjToInt(); newTask.TaskType = TaskTypeEnum.InPick.ObjToInt(); } else if (stockInfo.StockStatus == StockStatusEmun.送检库存完成.ObjToInt()) { stockInfo.StockStatus = StockStatusEmun.手动组盘入库确认.ObjToInt(); newTask.TaskType = TaskTypeEnum.InQuality.ObjToInt(); } else if (stockInfo.StockStatus == StockStatusEmun.盘点库存完成.ObjToInt()) { stockInfo.StockStatus = StockStatusEmun.手动组盘入库确认.ObjToInt(); newTask.TaskType = TaskTypeEnum.InInventory.ObjToInt(); } else { stockInfo.StockStatus = StockStatusEmun.入库确认.ObjToInt(); } LocationStatusEnum lastStatus = (LocationStatusEnum)locationInfo.LocationStatus; _unitOfWorkManage.BeginTran(); int taskId = BaseDal.AddData(newTask); newTask.TaskId = taskId; _locationStatusChangeRecordService.AddLocationStatusChangeRecord(locationInfo, locationInfo.LocationStatus, StockChangeType.Inbound.ObjToInt(), inboundOrder.InboundOrderNo, newTask.TaskNum); locationInfo.LocationStatus = LocationStatusEnum.Lock.ObjToInt(); _locationInfoService.UpdateData(locationInfo); _stockRepository.UpdateData(stockInfo); _unitOfWorkManage.CommitTran(); } TaskModel esstask = new TaskModel() { taskType = "putaway", taskGroupCode = "", groupPriority = 0, tasks = new List { new() { taskCode=newTask.TaskNum.ToString(), taskPriority=0, taskDescribe=new TaskDescribeType{ containerCode=palletCode, containerType= "CT_KUBOT_STANDARD", fromLocationCode=stations.GetValueOrDefault(stationCode)??"", toStationCode="", toLocationCode=locationInfo.LocationCode, deadline=0,storageTag="" } } } }; _logger.LogInformation("创建任务Request: " + JsonConvert.SerializeObject(esstask)); var result = await _eSSApiService.CreateTaskAsync(esstask); _logger.LogInformation("创建任务返回: " + result); if (result) { return WebResponseContent.Instance.OK(); } else { return WebResponseContent.Instance.Error("下发机器人任务失败!"); } } catch (Exception ex) { return WebResponseContent.Instance.Error(ex.Message); } } /// /// 入空箱 /// /// /// /// /// public WebResponseContent InEmpty(string palletCode, string address, int WarehouseId) { try { Dt_Task dbtask = Repository.QueryFirst(x => x.PalletCode == palletCode); if (dbtask != null) { return WebResponseContent.Instance.Error($"该托盘已生成任务"); } Dt_StockInfo stockInfo = _stockRepository.Db.Queryable().Where(x => x.PalletCode == palletCode).First(); if (stockInfo == null) { return WebResponseContent.Instance.Error($"未找到组盘信息"); } if (stockInfo.StockStatus != StockStatusEmun.组盘暂存.ObjToInt() && stockInfo.StockStatus != StockStatusEmun.手动组盘暂存.ObjToInt() && stockInfo.StockStatus != StockStatusEmun.拣选完成.ObjToInt()) { return WebResponseContent.Instance.Error($"该托盘状态不正确,不可申请入库"); } if (!string.IsNullOrEmpty(stockInfo.LocationCode)) { return WebResponseContent.Instance.Error($"该托盘已绑定货位"); } //stockInfo = new Dt_StockInfo() //{ // PalletCode = barcode, // StockStatus = StockStatusEmun.入库确认.ObjToInt(), // WarehouseId = WarehouseId, // PalletType = PalletTypeEnum.Empty.ObjToInt(), // Details = new List() //}; var locationInfo = _locationInfoService.AssignLocation(); if (locationInfo == null) { return WebResponseContent.Instance.Error($"货位分配失败,未找到可分配货位"); } Dt_Task newTask = new Dt_Task() { CurrentAddress = address, Grade = 0, NextAddress = locationInfo.LocationCode, PalletCode = palletCode, Roadway = locationInfo.RoadwayNo, SourceAddress = address, TargetAddress = locationInfo.LocationCode, TaskType = TaskTypeEnum.InEmpty.ObjToInt(), TaskStatus = TaskStatusEnum.New.ObjToInt(), WarehouseId = stockInfo.WarehouseId, PalletType = stockInfo.PalletType }; locationInfo.LocationStatus = LocationStatusEnum.Lock.ObjToInt(); _unitOfWorkManage.BeginTran(); int taskId = BaseDal.AddData(newTask); newTask.TaskId = taskId; _locationInfoService.UpdateData(locationInfo); stockInfo.StockStatus = StockStatusEmun.入库确认.ObjToInt(); _stockRepository.AddData(stockInfo); _unitOfWorkManage.CommitTran(); return WebResponseContent.Instance.OK(); } catch (Exception ex) { _unitOfWorkManage.RollbackTran(); return WebResponseContent.Instance.Error(ex.Message); } } /// /// /// /// /// public async Task TaskCompleted(int taskNum) { WebResponseContent content = new WebResponseContent(); try { Dt_Task task = await Repository.QueryFirstAsync(x => x.TaskNum == taskNum); if (task == null) { return await Task.FromResult(WebResponseContent.Instance.Error($"未找到任务信息")); } 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).Includes(x => x.Details).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($"货位状态不正确"); } LocationStatusEnum lastStatus = (LocationStatusEnum)locationInfo.LocationStatus; locationInfo.LocationStatus = LocationStatusEnum.InStock.ObjToInt(); stockInfo.LocationCode = locationInfo.LocationCode; Dt_InboundOrder? inboundOrder = _inboundOrderService.Repository.Db.Queryable().Where(x => x.InboundOrderNo == stockInfo.Details.FirstOrDefault().OrderNo).Includes(x => x.Details).First(); Dt_InboundOrderDetail? inboundOrderDetail = null; return content; } catch (Exception ex) { return await Task.FromResult(WebResponseContent.Instance.Error(ex.Message)); } } } }