| | |
| | | #endregion << 版 本 注 释 >> |
| | | |
| | | using MapsterMapper; |
| | | using Microsoft.Extensions.Configuration; |
| | | using Microsoft.IdentityModel.Tokens; |
| | | using Newtonsoft.Json; |
| | | using OfficeOpenXml.FormulaParsing.Excel.Functions.Text; |
| | | using SqlSugar; |
| | | using System.Diagnostics.CodeAnalysis; |
| | | using WIDESEA_Core; |
| | | using WIDESEAWCS_Common.HttpEnum; |
| | | using WIDESEAWCS_Common.TaskEnum; |
| | | using WIDESEAWCS_Core; |
| | | using WIDESEAWCS_Core.BaseServices; |
| | |
| | | private readonly ITaskExecuteDetailService _taskExecuteDetailService; |
| | | private readonly ITaskExecuteDetailRepository _taskExecuteDetailRepository; |
| | | private readonly IMapper _mapper; |
| | | private readonly HttpClientHelper _httpClientHelper; |
| | | private readonly IRobotTaskService _robotTaskService; |
| | | private readonly IOutboundTaskFlowService _outboundTaskFlowService; |
| | | private readonly IInboundTaskFlowService _inboundTaskFlowService; |
| | | private readonly IRelocationTaskFlowService _relocationTaskFlowService; |
| | | private readonly IRobotTaskFlowService _robotTaskFlowService; |
| | | |
| | | private Dictionary<string, OrderByType> _taskOrderBy = new() |
| | | { |
| | |
| | | |
| | | public List<int> TaskRobotTypes => typeof(TaskOtherTypeEnum).GetEnumIndexList(); |
| | | |
| | | public TaskService(ITaskRepository BaseDal, IRouterService routerService, ITaskExecuteDetailService taskExecuteDetailService, ITaskExecuteDetailRepository taskExecuteDetailRepository, IMapper mapper, HttpClientHelper httpClientHelper, IRobotTaskService robotTaskService) : base(BaseDal) |
| | | public TaskService( |
| | | ITaskRepository BaseDal, |
| | | IRouterService routerService, |
| | | ITaskExecuteDetailService taskExecuteDetailService, |
| | | ITaskExecuteDetailRepository taskExecuteDetailRepository, |
| | | IMapper mapper, |
| | | IOutboundTaskFlowService outboundTaskFlowService, |
| | | IInboundTaskFlowService inboundTaskFlowService, |
| | | IRelocationTaskFlowService relocationTaskFlowService, |
| | | IRobotTaskFlowService robotTaskFlowService) : base(BaseDal) |
| | | { |
| | | _routerService = routerService; |
| | | _taskExecuteDetailService = taskExecuteDetailService; |
| | | _taskExecuteDetailRepository = taskExecuteDetailRepository; |
| | | _mapper = mapper; |
| | | _httpClientHelper = httpClientHelper; |
| | | _robotTaskService = robotTaskService; |
| | | _outboundTaskFlowService = outboundTaskFlowService; |
| | | _inboundTaskFlowService = inboundTaskFlowService; |
| | | _relocationTaskFlowService = relocationTaskFlowService; |
| | | _robotTaskFlowService = robotTaskFlowService; |
| | | } |
| | | |
| | | /// <summary> |
| | |
| | | try |
| | | { |
| | | List<Dt_Task> tasks = new List<Dt_Task>(); |
| | | List<Dt_Task> duplicates = new List<Dt_Task>(); |
| | | foreach (var item in taskDTOs) |
| | | { |
| | | if (BaseDal.QueryFirst(x => x.TaskNum == item.TaskNum || x.PalletCode == item.PalletCode) != null) |
| | | Dt_Task existingTask = BaseDal.QueryFirst(x => x.TaskNum == item.TaskNum || x.PalletCode == item.PalletCode); |
| | | if (existingTask != null) |
| | | { |
| | | duplicates.Add(existingTask); |
| | | continue; |
| | | } |
| | | Dt_Task task = _mapper.Map<Dt_Task>(item); |
| | | task.Creater = "WMS"; |
| | | if (task.TaskType.GetTaskTypeGroup() == TaskTypeGroup.OutbondGroup) |
| | | { |
| | | int taskType = 0; |
| | | if (task.TaskType == (int)TaskOutboundTypeEnum.OutEmpty) |
| | | { |
| | | taskType = 100; |
| | | } |
| | | else |
| | | taskType = task.TaskType; |
| | | Dt_Router router = _routerService.QueryNextRoute(item.Roadway, item.TargetAddress, taskType); |
| | | //暂不考虑多路径 |
| | | if (router != null) |
| | | { |
| | | task.TaskStatus = (int)TaskOutStatusEnum.OutNew; |
| | | task.CurrentAddress = item.SourceAddress; |
| | | task.NextAddress = router.ChildPosi; |
| | | } |
| | | } |
| | | else if (task.TaskType.GetTaskTypeGroup() == TaskTypeGroup.InboundGroup) |
| | | { |
| | | Dt_Router routers = _routerService.QueryNextRoute(item.SourceAddress); |
| | | //暂不考虑多路径 |
| | | if (!routers.IsNullOrEmpty()) |
| | | { |
| | | task.TaskStatus = (int)TaskInStatusEnum.InNew; |
| | | task.CurrentAddress = item.SourceAddress; |
| | | task.NextAddress = routers.ChildPosi; |
| | | } |
| | | } |
| | | InitializeTaskOnReceive(task, item); |
| | | tasks.Add(task); |
| | | } |
| | | // TOOD: 这里注意添加错误要返回错误 |
| | | BaseDal.AddData(tasks); |
| | | |
| | | _taskExecuteDetailService.AddTaskExecuteDetail(tasks.Select(x => x.TaskNum).ToList(), "接收WMS任务"); |
| | | |
| | | content = WebResponseContent.Instance.OK("成功", tasks); |
| | | // 将重复任务信息也一并返回 |
| | | tasks.AddRange(duplicates); |
| | | var result = tasks; |
| | | content = WebResponseContent.Instance.OK("成功", result); |
| | | } |
| | | catch (Exception ex) |
| | | { |
| | |
| | | Roadway = "SC01", |
| | | SourceAddress = sourceAddress, |
| | | TargetAddress = "SC01", |
| | | TaskState = (int)TaskInStatusEnum.InNew, |
| | | TaskStatus = (int)TaskInStatusEnum.InNew, |
| | | Id = 0, |
| | | TaskType = (int)TaskInboundTypeEnum.Inbound |
| | | }; |
| | |
| | | content = WebResponseContent.Instance.Error(ex.Message); |
| | | } |
| | | return content; |
| | | } |
| | | |
| | | /// <summary> |
| | | /// 按任务分组初始化任务接收信息。 |
| | | /// </summary> |
| | | /// <param name="task">任务实体。</param> |
| | | /// <param name="source">WMS原始任务对象。</param> |
| | | private void InitializeTaskOnReceive(Dt_Task task, WMSTaskDTO source) |
| | | { |
| | | switch (task.TaskType.GetTaskTypeGroup()) |
| | | { |
| | | case TaskTypeGroup.OutbondGroup: |
| | | _outboundTaskFlowService.InitializeOnReceive(task, source); |
| | | break; |
| | | case TaskTypeGroup.InboundGroup: |
| | | _inboundTaskFlowService.InitializeOnReceive(task, source); |
| | | break; |
| | | case TaskTypeGroup.RelocationGroup: |
| | | _relocationTaskFlowService.InitializeOnReceive(task, source); |
| | | break; |
| | | case TaskTypeGroup.OtherGroup: |
| | | _robotTaskFlowService.InitializeOnReceive(task, source); |
| | | break; |
| | | default: |
| | | break; |
| | | } |
| | | } |
| | | |
| | | /// <summary> |
| | |
| | | |
| | | var result = task.TaskType.GetTaskTypeGroup() switch |
| | | { |
| | | TaskTypeGroup.OutbondGroup => ProcessOutboundTaskStatus(task), |
| | | TaskTypeGroup.InboundGroup => ProcessInboundTaskStatus(task), |
| | | TaskTypeGroup.RelocationGroup => ProcessRelocationTaskStatus(task), |
| | | TaskTypeGroup.OtherGroup => ProcessRobotTaskStatus(task), |
| | | TaskTypeGroup.OutbondGroup => _outboundTaskFlowService.MoveToNextStatus(task), |
| | | TaskTypeGroup.InboundGroup => _inboundTaskFlowService.MoveToNextStatus(task), |
| | | TaskTypeGroup.RelocationGroup => _relocationTaskFlowService.MoveToNextStatus(task), |
| | | TaskTypeGroup.OtherGroup => _robotTaskFlowService.MoveToNextStatus(task), |
| | | _ => WebResponseContent.Instance.Error($"任务类型错误,未找到该任务类型,任务号:【{task.TaskNum}】,任务类型:【{task.TaskType}】") |
| | | }; |
| | | |
| | | if (!result.Status) |
| | | return result; |
| | | |
| | | // 出库完成线体节点时,可能需要接收入库新任务。 |
| | | if (task.TaskType.GetTaskTypeGroup() == TaskTypeGroup.OutbondGroup |
| | | && result.Data is List<WMSTaskDTO> wmsTasks |
| | | && wmsTasks.Count > 0) |
| | | { |
| | | return ReceiveWMSTask(wmsTasks); |
| | | } |
| | | |
| | | // 更新任务数据 |
| | | task.ModifyDate = DateTime.Now; |
| | | task.Modifier = "System"; |
| | | if (task.TaskStatus == (int)TaskOutStatusEnum.Line_OutFinish) |
| | | { |
| | | BaseDal.DeleteAndMoveIntoHty(task, OperateTypeEnum.自动删除); |
| | | BaseDal.DeleteAndMoveIntoHty(task, OperateTypeEnum.自动完成); |
| | | } |
| | | else |
| | | { |
| | |
| | | ? $"人工手动将任务状态从【{oldState}】跳转到【{task.TaskStatus}】" |
| | | : $"系统自动流程,任务状态从【{oldState}】转到【{task.TaskStatus}】"; |
| | | _taskExecuteDetailService.AddTaskExecuteDetail(task.TaskId, logMessage); |
| | | |
| | | return WebResponseContent.Instance.OK(); |
| | | } |
| | | |
| | | /// <summary> |
| | | /// 处理出库任务状态转换 |
| | | /// </summary> |
| | | private WebResponseContent ProcessOutboundTaskStatus(Dt_Task task) |
| | | { |
| | | if (task.TaskStatus >= (int)TaskOutStatusEnum.OutFinish) |
| | | return WebResponseContent.Instance.Error($"该任务状态不可跳转到下一步,任务号:【{task.TaskNum}】,任务状态:【{task.TaskStatus}】"); |
| | | |
| | | task.TaskStatus = task.TaskStatus.GetNextNotCompletedStatus<TaskOutStatusEnum>(); |
| | | |
| | | if (task.TaskStatus <= 0) |
| | | return WebResponseContent.Instance.Error($"该任务状态不可跳转到下一步,任务号:【{task.TaskNum}】,任务状态:【{task.TaskStatus}】"); |
| | | |
| | | // 根据状态调用不同的WMS接口 |
| | | if (task.TaskStatus == (int)TaskOutStatusEnum.Line_OutFinish && task.TaskType == (int)TaskOutboundTypeEnum.Outbound) |
| | | { |
| | | return GetWMSOutboundTrayTask(task); |
| | | } |
| | | else if (task.TaskStatus == (int)TaskOutStatusEnum.Line_OutFinish && task.TaskType == (int)TaskOutboundTypeEnum.OutEmpty) |
| | | { |
| | | return _robotTaskService.GetWMSRobotTask(task); |
| | | } |
| | | else |
| | | { |
| | | if (task.TaskStatus == (int)TaskOutStatusEnum.Line_OutExecuting) |
| | | return WebResponseContent.Instance.OK(); |
| | | else |
| | | return UpdateWMSTaskStatus(task); |
| | | } |
| | | } |
| | | |
| | | /// <summary> |
| | | /// 处理入库任务状态转换 |
| | | /// </summary> |
| | | private WebResponseContent ProcessInboundTaskStatus(Dt_Task task) |
| | | { |
| | | if (task.TaskStatus >= (int)TaskInStatusEnum.InFinish) |
| | | return WebResponseContent.Instance.Error($"该任务状态不可跳转到下一步,任务号:【{task.TaskNum}】,任务状态:【{task.TaskStatus}】"); |
| | | |
| | | task.TaskStatus = task.TaskStatus.GetNextNotCompletedStatus<TaskInStatusEnum>(); |
| | | |
| | | if (task.TaskStatus <= 0) |
| | | return WebResponseContent.Instance.Error($"该任务状态不可跳转到下一步,任务号:【{task.TaskNum}】,任务状态:【{task.TaskStatus}】"); |
| | | |
| | | // 根据状态调用不同的WMS接口 |
| | | if (task.TaskStatus == (int)TaskInStatusEnum.Line_InFinish) |
| | | { |
| | | return GetWMSInboundLocation(task); |
| | | } |
| | | else |
| | | { |
| | | return UpdateWMSTaskStatus(task); |
| | | } |
| | | } |
| | | |
| | | /// <summary> |
| | | /// 处理机械手任务状态转换 |
| | | /// </summary> |
| | | private WebResponseContent ProcessRobotTaskStatus(Dt_Task task) |
| | | { |
| | | if (task.TaskStatus >= (int)TaskRobotStatusEnum.RobotFinish) |
| | | return WebResponseContent.Instance.Error($"该任务状态不可跳转到下一步,任务号:【{task.TaskNum}】,任务状态:【{task.TaskStatus}】"); |
| | | |
| | | task.TaskStatus = task.TaskStatus.GetNextNotCompletedStatus<TaskRobotStatusEnum>(); |
| | | |
| | | if (task.TaskStatus <= 0) |
| | | return WebResponseContent.Instance.Error($"该任务状态不可跳转到下一步,任务号:【{task.TaskNum}】,任务状态:【{task.TaskStatus}】"); |
| | | |
| | | return WebResponseContent.Instance.OK(); |
| | | } |
| | | |
| | | /// <summary> |
| | | /// 处理移库任务状态转换 |
| | | /// </summary> |
| | | private WebResponseContent ProcessRelocationTaskStatus(Dt_Task task) |
| | | { |
| | | if (task.TaskStatus >= (int)TaskRelocationStatusEnum.RelocationFinish) |
| | | return WebResponseContent.Instance.Error($"该任务状态不可跳转到下一步,任务号:【{task.TaskNum}】,任务状态:【{task.TaskStatus}】"); |
| | | |
| | | task.TaskStatus = task.TaskStatus.GetNextNotCompletedStatus<TaskRelocationStatusEnum>(); |
| | | |
| | | if (task.TaskStatus <= 0) |
| | | return WebResponseContent.Instance.Error($"该任务状态不可跳转到下一步,任务号:【{task.TaskNum}】,任务状态:【{task.TaskStatus}】"); |
| | | |
| | | // 移库任务开始时,同步WMS任务状态 |
| | | if (task.TaskStatus == (int)TaskRelocationStatusEnum.SC_RelocationExecuting) |
| | | { |
| | | return UpdateWMSTaskStatus(task); |
| | | } |
| | | |
| | | // 移库任务完成时,调用WMS移库完成接口 |
| | | if (task.TaskStatus == (int)TaskRelocationStatusEnum.RelocationFinish) |
| | | { |
| | | return NotifyWMSRelocationFinish(task); |
| | | } |
| | | |
| | | return WebResponseContent.Instance.OK(); |
| | | } |
| | | |
| | | /// <summary> |
| | | /// 通知WMS系统出库完成 |
| | | /// </summary> |
| | | private WebResponseContent NotifyWMSOutboundFinish(Dt_Task task) |
| | | { |
| | | var result = _httpClientHelper.Post<WebResponseContent>( |
| | | nameof(ConfigKey.OutboundFinishTaskAsync), |
| | | new StockInfoDTO { PalletCode = task.PalletCode, TaskNum = task.TaskNum }.ToJson()); |
| | | |
| | | if (!result.IsSuccess || !result.Data.Status) |
| | | return WebResponseContent.Instance.Error($"通知WMS系统堆垛机出库完成失败,任务号:【{task.TaskNum}】,托盘号:【{task.PalletCode}】,错误信息:【{result.Data?.Message}】"); |
| | | |
| | | return WebResponseContent.Instance.OK(); |
| | | } |
| | | |
| | | /// <summary> |
| | | /// 获取空托出库任务 |
| | | /// </summary> |
| | | private WebResponseContent GetWMSOutboundTrayTask(Dt_Task task) |
| | | { |
| | | var targetAddress = task.TargetAddress; |
| | | var warehouseId = _robotTaskService.MapWarehouseIdConfigKey(task.TargetAddress); |
| | | string sourceLineNo = _robotTaskService.ResolveRobotRuleValue(targetAddress, "AddressSourceLineNoMap", task.TargetAddress); |
| | | |
| | | var result = _httpClientHelper.Post<WebResponseContent>( |
| | | nameof(ConfigKey.GetOutBoundTrayTaskAsync), |
| | | new CreateTaskDto { WarehouseId = warehouseId, TargetAddress = sourceLineNo }.ToJson()); |
| | | |
| | | if (!result.IsSuccess || !result.Data.Status) |
| | | return WebResponseContent.Instance.Error($"获取WMS系统空托盘出库任务失败,任务号:【{task.TaskNum}】,托盘号:【{task.PalletCode}】,错误信息:【{result.Data?.Message}】"); |
| | | |
| | | var wMSTask = JsonConvert.DeserializeObject<WMSTaskDTO>(result.Data.Data?.ToString() ?? string.Empty); |
| | | |
| | | var tasks = new List<WMSTaskDTO> |
| | | { |
| | | wMSTask |
| | | }; |
| | | |
| | | return ReceiveWMSTask(tasks); |
| | | } |
| | | |
| | | |
| | | |
| | | /// <summary> |
| | | /// 从WMS系统获取入库目标地址 |
| | | /// </summary> |
| | | private WebResponseContent GetWMSInboundLocation(Dt_Task task) |
| | | { |
| | | var result = _httpClientHelper.Post<WebResponseContent>( |
| | | nameof(ConfigKey.GetTasksLocation), |
| | | new CreateTaskDto { PalletCode = task.PalletCode }.ToJson()); |
| | | |
| | | if (!result.IsSuccess || !result.Data.Status) |
| | | return WebResponseContent.Instance.Error($"调用WMS接口获取任务目标地址失败,任务号:【{task.TaskNum}】,错误信息:【{result.Data?.Message}】"); |
| | | |
| | | var nextAddress = result.Data.Data?.ToString(); |
| | | if (string.IsNullOrEmpty(nextAddress)) |
| | | return WebResponseContent.Instance.Error($"调用WMS接口获取任务目标地址失败,任务号:【{task.TaskNum}】,错误信息:【未获取到有效的目标地址】"); |
| | | |
| | | task.CurrentAddress = task.NextAddress; |
| | | |
| | | task.NextAddress = nextAddress; |
| | | task.TargetAddress = nextAddress; |
| | | |
| | | return WebResponseContent.Instance.OK(); |
| | | } |
| | | |
| | | /// <summary> |
| | | /// 更新WMS系统任务状态 |
| | | /// </summary> |
| | | private WebResponseContent UpdateWMSTaskStatus(Dt_Task task) |
| | | { |
| | | var result = _httpClientHelper.Post<WebResponseContent>( |
| | | nameof(ConfigKey.UpdateTaskByStatus), |
| | | new UpdateTaskDto { Id = task.TaskNum, NewStatus = task.TaskStatus }.ToJson()); |
| | | |
| | | if (!result.IsSuccess || !result.Data.Status) |
| | | return WebResponseContent.Instance.Error($"调用WMS接口更新任务状态失败,任务号:【{task.TaskNum}】,错误信息:【{result.Data?.Message}】"); |
| | | |
| | | return WebResponseContent.Instance.OK(); |
| | | } |
| | | |
| | | /// <summary> |
| | | /// 通知WMS系统移库任务完成 |
| | | /// </summary> |
| | | private WebResponseContent NotifyWMSRelocationFinish(Dt_Task task) |
| | | { |
| | | var result = _httpClientHelper.Post<WebResponseContent>( |
| | | nameof(ConfigKey.RelocationFinishTask), |
| | | new CreateTaskDto |
| | | { |
| | | PalletCode = task.PalletCode, |
| | | SourceAddress = task.CurrentAddress, |
| | | TargetAddress = task.TargetAddress, |
| | | Roadway = task.Roadway, |
| | | TaskType = task.TaskType |
| | | }.ToJson()); |
| | | |
| | | if (!result.IsSuccess || !result.Data.Status) |
| | | return WebResponseContent.Instance.Error($"通知WMS系统移库完成失败,任务号:【{task.TaskNum}】,托盘号:【{task.PalletCode}】,错误信息:【{result.Data?.Message}】"); |
| | | |
| | | return WebResponseContent.Instance.OK(); |
| | | } |
| | |
| | | { |
| | | Dt_Task task = BaseDal.QueryFirst(x => x.TaskNum == taskNum); |
| | | if (task == null) return WebResponseContent.Instance.Error($"未找到该任务信息,任务号:【{taskNum}】"); |
| | | |
| | | if (task.TaskType.GetTaskTypeGroup() == TaskTypeGroup.OutbondGroup && task.TaskStatus == (int)TaskOutStatusEnum.SC_OutExecuting) |
| | | TaskTypeGroup taskTypeGroup = task.TaskType.GetTaskTypeGroup(); |
| | | content = taskTypeGroup switch |
| | | { |
| | | int taskType = 0; |
| | | if (task.TaskType == (int)TaskOutboundTypeEnum.OutEmpty) |
| | | { |
| | | taskType = 100; |
| | | } |
| | | else |
| | | taskType = task.TaskType; |
| | | Dt_Router router = _routerService.QueryNextRoute(task.NextAddress, task.TargetAddress, taskType); |
| | | if (router == null) return WebResponseContent.Instance.Error($"未找到设备路由信息"); |
| | | |
| | | int nextStatus = task.TaskStatus.GetNextNotCompletedStatus<TaskOutStatusEnum>(); |
| | | task.TaskStatus = nextStatus; |
| | | task.CurrentAddress = task.NextAddress; |
| | | task.NextAddress = router.ChildPosi; |
| | | task.ModifyDate = DateTime.Now; |
| | | task.Modifier = "System"; |
| | | |
| | | content = NotifyWMSOutboundFinish(task); |
| | | if (content.Status) |
| | | { |
| | | BaseDal.UpdateData(task); |
| | | |
| | | _taskExecuteDetailService.AddTaskExecuteDetail(task.TaskId, $"堆垛机出库完成"); |
| | | return content.Error($"通知WMS系统堆垛机出库完成成功,任务号:【{task.TaskNum}】,托盘号:【{task.PalletCode}】"); |
| | | } |
| | | |
| | | //var result = _httpClientHelper.Post<WebResponseContent>(nameof(ConfigKey.OutboundFinishTaskAsync), (new StockInfoDTO() { PalletCode = task.PalletCode, TaskNum = task.TaskNum }).ToJson()); |
| | | //if (result.IsSuccess && result.Data.Status) |
| | | //{ |
| | | // BaseDal.UpdateData(task); |
| | | |
| | | // _taskExecuteDetailService.AddTaskExecuteDetail(task.TaskId, $"堆垛机出库完成"); |
| | | // return content.Error($"通知WMS系统堆垛机出库完成成功,任务号:【{task.TaskNum}】,托盘号:【{task.PalletCode}】"); |
| | | |
| | | //} |
| | | //else |
| | | //{ |
| | | // return content.Error($"通知WMS系统堆垛机出库完成失败,任务号:【{task.TaskNum}】,托盘号:【{task.PalletCode}】,错误信息:【{result.Data.Message}】"); |
| | | //} |
| | | } |
| | | else if (task.TaskType.GetTaskTypeGroup() == TaskTypeGroup.InboundGroup && task.TaskStatus == (int)TaskInStatusEnum.SC_InExecuting) |
| | | TaskTypeGroup.OutbondGroup => _outboundTaskFlowService.CompleteStackerTask(task), |
| | | TaskTypeGroup.InboundGroup => _inboundTaskFlowService.CompleteStackerTask(task), |
| | | TaskTypeGroup.RelocationGroup => _relocationTaskFlowService.CompleteStackerTask(task), |
| | | TaskTypeGroup.OtherGroup => _robotTaskFlowService.CompleteStackerTask(task), |
| | | _ => throw new Exception($"任务类型错误,未找到该任务类型,任务号:【{taskNum}】,任务类型:【{task.TaskType}】") |
| | | }; |
| | | if (!content.Status) |
| | | { |
| | | int nextStatus = task.TaskStatus.GetNextNotCompletedStatus<TaskInStatusEnum>(); |
| | | task.TaskStatus = nextStatus; |
| | | task.ModifyDate = DateTime.Now; |
| | | task.Modifier = "System"; |
| | | return content; |
| | | } |
| | | |
| | | var result = _httpClientHelper.Post<WebResponseContent>(nameof(ConfigKey.InboundFinishTaskAsync), (new CreateTaskDto() |
| | | { |
| | | PalletCode = task.PalletCode, |
| | | }).ToJson()); |
| | | if (taskTypeGroup == TaskTypeGroup.OutbondGroup && task.TaskStatus == (int)TaskOutStatusEnum.SC_OutFinish) |
| | | { |
| | | BaseDal.UpdateData(task); |
| | | _taskExecuteDetailService.AddTaskExecuteDetail(task.TaskId, "堆垛机出库完成"); |
| | | return content; |
| | | } |
| | | |
| | | if (result.IsSuccess && result.Data.Status) |
| | | { |
| | | BaseDal.DeleteAndMoveIntoHty(task, OperateTypeEnum.自动完成); |
| | | _taskExecuteDetailService.AddTaskExecuteDetail(task.TaskId, $"堆垛机入库完成"); |
| | | return content.Error($"通知WMS系统堆垛机入库完成成功,任务号:【{task.TaskNum}】,托盘号:【{task.PalletCode}】"); |
| | | } |
| | | else |
| | | { |
| | | return content.Error($"通知WMS系统堆垛机入库完成失败,任务号:【{task.TaskNum}】,托盘号:【{task.PalletCode}】,错误信息:【{result.Data.Message}】"); |
| | | } |
| | | } |
| | | else if (task.TaskType.GetTaskTypeGroup() == TaskTypeGroup.RelocationGroup) |
| | | if (taskTypeGroup == TaskTypeGroup.InboundGroup && task.TaskStatus == (int)TaskInStatusEnum.SC_InFinish) |
| | | { |
| | | if (task.TaskStatus == (int)TaskRelocationStatusEnum.SC_RelocationExecuting) |
| | | { |
| | | int nextStatus = task.TaskStatus.GetNextNotCompletedStatus<TaskRelocationStatusEnum>(); |
| | | task.TaskStatus = nextStatus; |
| | | task.ModifyDate = DateTime.Now; |
| | | task.Modifier = "System"; |
| | | BaseDal.DeleteAndMoveIntoHty(task, OperateTypeEnum.自动完成); |
| | | _taskExecuteDetailService.AddTaskExecuteDetail(task.TaskId, "堆垛机入库完成"); |
| | | return content; |
| | | } |
| | | |
| | | WebResponseContent result = NotifyWMSRelocationFinish(task); |
| | | if (result.Status) |
| | | { |
| | | BaseDal.DeleteAndMoveIntoHty(task, OperateTypeEnum.自动完成); |
| | | _taskExecuteDetailService.AddTaskExecuteDetail(task.TaskId, $"堆垛机移库完成"); |
| | | return content.Error($"通知WMS系统堆垛机移库完成成功,任务号:【{task.TaskNum}】,托盘号:【{task.PalletCode}】"); |
| | | } |
| | | else |
| | | { |
| | | return content.Error($"通知WMS系统堆垛机移库完成失败,任务号:【{task.TaskNum}】,托盘号:【{task.PalletCode}】,错误信息:【{result.Message}】"); |
| | | } |
| | | } |
| | | } |
| | | else if (task.TaskType.GetTaskTypeGroup() == TaskTypeGroup.OtherGroup) |
| | | if (taskTypeGroup == TaskTypeGroup.RelocationGroup && task.TaskStatus == (int)TaskRelocationStatusEnum.RelocationFinish) |
| | | { |
| | | BaseDal.DeleteAndMoveIntoHty(task, OperateTypeEnum.自动完成); |
| | | _taskExecuteDetailService.AddTaskExecuteDetail(task.TaskId, "堆垛机移库完成"); |
| | | return content; |
| | | } |
| | | else |
| | | { |
| | | throw new Exception($"任务类型错误,未找到该任务类型,任务号:【{taskNum}】,任务类型:【{task.TaskType}】"); |
| | | } |
| | | |
| | | content = WebResponseContent.Instance.OK(); |
| | | } |
| | | catch (Exception ex) |
| | |
| | | { |
| | | return BaseDal.QueryFirst(x => x.TaskNum == taskNum); |
| | | } |
| | | |
| | | /// <summary> |
| | | /// 接收WMS手动创建的任务,创建WCS任务 |
| | | /// </summary> |
| | | /// <param name="taskDTOs">WMS任务对象集合</param> |
| | | /// <returns>返回处理结果</returns> |
| | | public WebResponseContent ReceiveManualTask([NotNull] List<WMSTaskDTO> taskDTOs) |
| | | { |
| | | WebResponseContent content = new WebResponseContent(); |
| | | try |
| | | { |
| | | // 收集重复任务的信息 |
| | | var duplicateTasks = new List<DuplicateTaskDto>(); |
| | | // 倒序遍历,安全删除并收集被移除的项 |
| | | for (int i = taskDTOs.Count - 1; i >= 0; i--) |
| | | { |
| | | var item = taskDTOs[i]; |
| | | var exists = BaseDal.QueryFirst(x => x.TaskNum == item.TaskNum || x.PalletCode == item.PalletCode); |
| | | if (exists != null) |
| | | { |
| | | duplicateTasks.Add(new DuplicateTaskDto |
| | | { |
| | | TaskNum = exists.TaskNum, |
| | | PalletCode = exists.PalletCode, |
| | | TaskType = exists.TaskType, |
| | | TaskStatus = exists.TaskStatus |
| | | }); |
| | | taskDTOs.RemoveAt(i); |
| | | } |
| | | } |
| | | |
| | | // 调用 ReceiveWMSTask 创建 WCS 任务 |
| | | content = ReceiveWMSTask(taskDTOs); |
| | | |
| | | // 如果有重复任务,修改返回结果 |
| | | if (duplicateTasks.Count > 0 && content.Status) |
| | | { |
| | | var result = new ReceiveTaskResultDto |
| | | { |
| | | Success = true, |
| | | Message = content.Message + $",其中{duplicateTasks.Count}个任务在WCS中已存在", |
| | | CreatedCount = taskDTOs.Count, |
| | | DuplicateTasks = duplicateTasks |
| | | }; |
| | | content.Data = result; |
| | | } |
| | | |
| | | return content; |
| | | } |
| | | catch (Exception ex) |
| | | { |
| | | content = WebResponseContent.Instance.Error($"手动任务接收错误,错误信息:{ex.Message}"); |
| | | return content; |
| | | } |
| | | } |
| | | |
| | | /// <summary> |
| | | /// 查询指定起点地址的新建手动入库任务 |
| | | /// </summary> |
| | | /// <param name="sourceAddress">起点地址</param> |
| | | /// <returns>任务实体</returns> |
| | | public Dt_Task QueryManualInboundTask(string sourceAddress) |
| | | { |
| | | return BaseDal.QueryFirst(x => |
| | | x.TaskType == (int)TaskInboundTypeEnum.Inbound && |
| | | x.TaskStatus == (int)TaskInStatusEnum.InNew && |
| | | x.SourceAddress == sourceAddress); |
| | | } |
| | | } |
| | | |
| | | public enum ConveyorLineDBNameNew |
| | |
| | | [DataLength(22)] |
| | | public string Barcode { get; set; } |
| | | } |
| | | } |
| | | } |