using System.Diagnostics.CodeAnalysis;
using WIDESEAWCS_Common.TaskEnum;
using WIDESEAWCS_Core;
using WIDESEAWCS_Core.Enums;
using WIDESEAWCS_DTO;
using WIDESEAWCS_DTO.TaskInfo;
using WIDESEAWCS_Model.Models;
using WIDESEAWCS_QuartzJob;
using WIDESEAWCS_QuartzJob.Models;
using WIDESEAWCS_QuartzJob.Service;
using WIDESEAWCS_Core;
using WIDESEAWCS_Core.Enums;
using WIDESEAWCS_Model.Models;
using WIDESEAWCS_QuartzJob;
using WIDESEAWCS_QuartzJob.Models;
using WIDESEAWCS_QuartzJob.Service;
namespace WIDESEAWCS_TaskInfoService;
///
/// TaskService 任务状态更新相关方法
///
public partial class TaskService
{
///
/// 更新任务异常信息显示
///
/// 任务号
/// 异常信息
public WebResponseContent UpdateTaskExceptionMessage(int taskNum, string message)
{
WebResponseContent content = new WebResponseContent();
try
{
if (string.IsNullOrEmpty(message))
throw new ArgumentNullException(nameof(message), "异常信息不能为空");
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.OutPending;
}
else if (task.TaskType.GetTaskTypeGroup() == TaskTypeGroup.InboundGroup)
{
task.TaskStatus = (int)TaskInStatusEnum.InPending;
}
task.ExceptionMessage = message;
task.ModifyDate = DateTime.Now;
BaseDal.UpdateData(task);
_taskExecuteDetailService.AddTaskExecuteDetail(task.TaskId, task.ExceptionMessage);
content = WebResponseContent.Instance.OK();
}
catch (Exception ex)
{
content = WebResponseContent.Instance.Error(ex.Message);
}
return content;
}
///
/// 更新任务状态信息,并同步至WMS
///
/// 任务号
/// 任务状态
public void UpdateTaskStatus(int taskNum, int status)
{
Dt_Task task = BaseDal.QueryFirst(x => x.TaskNum == taskNum);
if (task == null) return;
task.TaskStatus = status;
task.ModifyDate = DateTime.Now;
BaseDal.UpdateData(task);
}
///
/// 将任务状态修改为下一个状态
///
/// 任务号
public WebResponseContent UpdateTaskStatusToNext(int taskNum)
{
WebResponseContent content = new WebResponseContent();
try
{
Dt_Task task = BaseDal.QueryFirst(x => x.TaskNum == taskNum);
if (task == null) return WebResponseContent.Instance.Error($"未找到该任务信息,任务号:【{taskNum}】");
return UpdateTaskStatusToNext(task);
}
catch (Exception ex)
{
content = WebResponseContent.Instance.Error(ex.Message);
}
return content;
}
///
/// 将任务状态修改为下一个状态
///
/// 任务实体对象
///
public WebResponseContent UpdateTaskStatusToNext([NotNull] Dt_Task task)
{
int oldState = task.TaskStatus;
var result = task.TaskType.GetTaskTypeGroup() switch
{
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 wmsTasks
&& wmsTasks.Count > 0)
{
WebResponseContent content = ReceiveWMSTask(wmsTasks);
if (!content.Status)
return content;
}
// 更新任务数据
task.ModifyDate = DateTime.Now;
task.Modifier = "System";
if (task.TaskStatus == (int)TaskOutStatusEnum.Line_OutFinish)
{
BaseDal.DeleteAndMoveIntoHty(task, OperateTypeEnum.自动完成);
}
else
{
BaseDal.UpdateData(task);
}
// 记录任务执行详情
string logMessage = App.User.UserId > 0
? $"人工手动将任务状态从【{oldState}】跳转到【{task.TaskStatus}】"
: $"系统自动流程,任务状态从【{oldState}】转到【{task.TaskStatus}】";
_taskExecuteDetailService.AddTaskExecuteDetail(task.TaskId, logMessage);
return WebResponseContent.Instance.OK();
}
///
/// 根据任务号、当前地址更新任务位置信息
///
/// 任务号
/// 当前地址
///
public Dt_Task? UpdatePosition(int taskNum, string currentAddress)
{
try
{
if (string.IsNullOrEmpty(currentAddress))
throw new ArgumentNullException(nameof(currentAddress), "当前地址不能为空");
Dt_Task task = BaseDal.QueryFirst(x => x.TaskNum == taskNum && x.CurrentAddress == currentAddress);
if (task == null) throw new Exception($"未找到该任务信息,任务号:【{taskNum}】");
string oldCurrentPos = task.CurrentAddress;
string oldNextPos = task.NextAddress;
Dt_Router routers = _routerService.QueryNextRoute(oldNextPos, task.TargetAddress);
if (routers == null) throw new Exception($"未找到设备路由信息");
task.CurrentAddress = task.NextAddress;
task.NextAddress = routers.ChildPosi;
task.ModifyDate = DateTime.Now;
task.Modifier = "System";
BaseDal.UpdateData(task);
_taskExecuteDetailService.AddTaskExecuteDetail(task.TaskId, $"系统自动流程,更新当前位置【{oldCurrentPos} ----> {task.CurrentAddress}】和下一位置【{oldNextPos} ----> {task.NextAddress}】");
return task;
}
catch (Exception ex)
{
Console.WriteLine($"UpdatePosition 更新任务位置失败,任务号:【{taskNum}】,错误信息:【{ex.Message}】");
}
return null;
}
}