#region << 版 本 注 释 >>
|
/*----------------------------------------------------------------
|
* 命名空间:WIDESEAWCS_Tasks.ConveyorLineJob
|
* 创建者:胡童庆
|
* 创建时间:2024/8/2 16:13:36
|
* 版本:V1.0.0
|
* 描述:
|
*
|
* ----------------------------------------------------------------
|
* 修改人:
|
* 修改时间:
|
* 版本:V1.0.1
|
* 修改说明:
|
*
|
*----------------------------------------------------------------*/
|
#endregion << 版 本 注 释 >>
|
|
using AutoMapper;
|
using HslCommunication;
|
using Quartz;
|
using System;
|
using System.Linq;
|
using System.Text;
|
using System.Text.RegularExpressions;
|
using System.Threading.Tasks;
|
using WIDESEA_Common.Log;
|
using WIDESEAWCS_BasicInfoService;
|
using WIDESEAWCS_Common;
|
using WIDESEAWCS_Core.Helper;
|
using WIDESEAWCS_DTO.BasicInfo;
|
using WIDESEAWCS_IBasicInfoRepository;
|
using WIDESEAWCS_IBasicInfoService;
|
using WIDESEAWCS_ITaskInfoRepository;
|
using WIDESEAWCS_ITaskInfoService;
|
using WIDESEAWCS_Model.Models;
|
using WIDESEAWCS_Model.Models.System;
|
using WIDESEAWCS_QuartzJob;
|
using WIDESEAWCS_QuartzJob.DTO;
|
using WIDESEAWCS_QuartzJob.Service;
|
using WIDESEAWCS_Tasks.ConveyorLineJob;
|
|
namespace WIDESEAWCS_Tasks
|
{
|
/// <summary>
|
/// 输送线出料作业类,负责处理输送线出料站的PLC请求和WCS响应逻辑
|
/// </summary>
|
/// <remarks>
|
/// 1. 通过扫描条码获取订单信息 <br/>
|
/// 2. 根据订单尺寸判断是否在允许范围内 <br/>
|
/// 3. 生成任务并设置PLC站点的目标位置和任务编号 <br/>
|
/// 4. 处理异常情况并记录错误日志 <br/>
|
/// 5. 使用[DisallowConcurrentExecution]特性确保作业不会并发执行
|
/// </remarks>
|
[DisallowConcurrentExecution]
|
public class CommonConveyorLineOutJob : JobBase, IJob
|
{
|
private readonly ITaskService _taskService;
|
private readonly IMapper _mapper;
|
|
private readonly IOrderDetailsService _orderDetailsService;
|
private readonly ITaskRepository _taskRepository;
|
private readonly IContainerRepository _containerRepository;
|
|
private static Dt_Container DischargeContainer;
|
|
private static int dischargeStation = 8;
|
|
public CommonConveyorLineOutJob(ITaskService taskService, IMapper mapper, IOrderDetailsService orderDetailsService, ITaskRepository taskRepository, IContainerRepository containerRepository)
|
{
|
_taskService = taskService;
|
_mapper = mapper;
|
_orderDetailsService = orderDetailsService;
|
_taskRepository = taskRepository;
|
_containerRepository = containerRepository;
|
}
|
|
public Task Execute(IJobExecutionContext context)
|
{
|
if (DischargeContainer == null)
|
{
|
DischargeContainer = _containerRepository.QueryFirst(x => x.ContainerEnable && x.ContainerType == ContainerTypeEnum.DischargeContainer.ObjToInt());
|
if (DischargeContainer != null)
|
{
|
dischargeStation = DischargeContainer.ContainerNo;
|
}
|
}
|
|
bool flag = context.JobDetail.JobDataMap.TryGetValue("JobParams", out object? value);
|
if (flag && value != null && value is OtherDevice otherDevice)
|
{
|
try
|
{
|
bool request = otherDevice.GetValue<ConveyorLineStationDBName, bool>(ConveyorLineStationDBName.PLCStationRequest); //申请
|
bool response = otherDevice.GetValue<ConveyorLineStationDBName, bool>(ConveyorLineStationDBName.PLCStationResponse); //应答
|
|
bool wcsResponse = otherDevice.GetValue<ConveyorLineStationDBName, bool>(ConveyorLineStationDBName.WCSStationResponse); //应答
|
|
if (request && !response && !wcsResponse)
|
{
|
DeviceProDTO? devicePro = otherDevice.DeviceProDTOs.FirstOrDefault(x => x.DeviceProParamName == ConveyorLineStationDBName.PLCStationBarcode.ToString());
|
if (devicePro != null)
|
{
|
string barcode = otherDevice.GetValue<ConveyorLineStationDBName, string>(ConveyorLineStationDBName.PLCStationBarcode);
|
|
if (!string.IsNullOrEmpty(barcode))
|
{
|
OrderInfo orderInfo = _orderDetailsService.GetOrderInfoByBarcode(barcode);
|
|
Task.Run(() =>
|
{
|
_orderDetailsService.ToMes(barcode, 3);
|
});
|
|
if (orderInfo.Width >= AppSettings.Get("MinWidth").ObjToInt() && orderInfo.Width <= AppSettings.Get("MaxWidth").ObjToInt() && orderInfo.Length >= AppSettings.Get("MinLength").ObjToInt() && orderInfo.Length <= AppSettings.Get("MaxLength").ObjToInt() || orderInfo.Length >= AppSettings.Get("MinWidth").ObjToInt() && orderInfo.Length <= AppSettings.Get("MaxWidth").ObjToInt() && orderInfo.Width >= AppSettings.Get("MinLength").ObjToInt() && orderInfo.Width <= AppSettings.Get("MaxLength").ObjToInt())
|
{
|
Dt_Task task = _taskRepository.QueryFirst(x => x.PalletCode == barcode);
|
if (task == null)
|
{
|
try
|
{
|
var (taskFlag, gTask, message) = _taskService.GenerateTask(orderInfo);
|
if (taskFlag && gTask != null)
|
{
|
task = gTask;
|
if (!string.IsNullOrEmpty(task.ItemInfo))
|
{
|
string[] itemInfos = task.ItemInfo.Split("*");
|
if (itemInfos.Length == 3)
|
{
|
otherDevice.SetValue(ConveyorLineStationDBName.WCSStationTarget, Convert.ToInt32(itemInfos[0]));
|
otherDevice.SetValue(ConveyorLineStationDBName.WCSStationTarget, Convert.ToInt32(itemInfos[1]));
|
otherDevice.SetValue(ConveyorLineStationDBName.WCSStationTarget, Convert.ToInt32(itemInfos[2]));
|
}
|
}
|
|
otherDevice.SetValue(ConveyorLineStationDBName.WCSStationTarget, Convert.ToInt32(task.TargetAddress));
|
otherDevice.SetValue(ConveyorLineStationDBName.WCSStationTaskNum, task.TaskNum);
|
otherDevice.SetValue(ConveyorLineStationDBName.WCSStationResponse, true);
|
}
|
else
|
{
|
otherDevice.SetValue(ConveyorLineStationDBName.WCSStationTarget, Convert.ToInt32(orderInfo.Length));
|
otherDevice.SetValue(ConveyorLineStationDBName.WCSStationTarget, Convert.ToInt32(orderInfo.Width));
|
otherDevice.SetValue(ConveyorLineStationDBName.WCSStationTarget, Convert.ToInt32(orderInfo.Thickness));
|
otherDevice.SetValue(ConveyorLineStationDBName.WCSStationTarget, dischargeStation);
|
otherDevice.SetValue(ConveyorLineStationDBName.WCSStationTaskNum, 998);
|
otherDevice.SetValue(ConveyorLineStationDBName.WCSStationResponse, true);
|
|
WriteError(nameof(CommonConveyorLineOutJob), message);
|
|
WriteError("板子排出错误原因记录日志", message);
|
}
|
}
|
catch (Exception ex)
|
{
|
otherDevice.SetValue(ConveyorLineStationDBName.WCSStationTarget, Convert.ToInt32(orderInfo.Length));
|
otherDevice.SetValue(ConveyorLineStationDBName.WCSStationTarget, Convert.ToInt32(orderInfo.Width));
|
otherDevice.SetValue(ConveyorLineStationDBName.WCSStationTarget, Convert.ToInt32(orderInfo.Thickness));
|
otherDevice.SetValue(ConveyorLineStationDBName.WCSStationTarget, dischargeStation);
|
otherDevice.SetValue(ConveyorLineStationDBName.WCSStationTaskNum, 999);
|
otherDevice.SetValue(ConveyorLineStationDBName.WCSStationResponse, true);
|
WriteError("放板逻辑运算错误记录日志", ex.Message, ex);
|
}
|
}
|
else
|
{
|
if (!string.IsNullOrEmpty(task.ItemInfo))
|
{
|
string[] itemInfos = task.ItemInfo.Split("*");
|
if (itemInfos.Length == 3)
|
{
|
otherDevice.SetValue(ConveyorLineStationDBName.WCSStationTarget, Convert.ToInt32(itemInfos[0]));
|
otherDevice.SetValue(ConveyorLineStationDBName.WCSStationTarget, Convert.ToInt32(itemInfos[1]));
|
otherDevice.SetValue(ConveyorLineStationDBName.WCSStationTarget, Convert.ToInt32(itemInfos[2]));
|
}
|
}
|
|
otherDevice.SetValue(ConveyorLineStationDBName.WCSStationTarget, Convert.ToInt32(task.TargetAddress));
|
otherDevice.SetValue(ConveyorLineStationDBName.WCSStationTaskNum, task.TaskNum);
|
otherDevice.SetValue(ConveyorLineStationDBName.WCSStationResponse, true);
|
}
|
}
|
else
|
{
|
//todo 超宽处理
|
otherDevice.SetValue(ConveyorLineStationDBName.WCSStationTarget, Convert.ToInt32(orderInfo.Length));
|
otherDevice.SetValue(ConveyorLineStationDBName.WCSStationTarget, Convert.ToInt32(orderInfo.Width));
|
otherDevice.SetValue(ConveyorLineStationDBName.WCSStationTarget, Convert.ToInt32(orderInfo.Thickness));
|
otherDevice.SetValue(ConveyorLineStationDBName.WCSStationTarget, dischargeStation);
|
otherDevice.SetValue(ConveyorLineStationDBName.WCSStationTaskNum, 999);
|
otherDevice.SetValue(ConveyorLineStationDBName.WCSStationResponse, true);
|
}
|
}
|
else
|
{
|
otherDevice.SetValue(ConveyorLineStationDBName.WCSStationTarget, dischargeStation);
|
otherDevice.SetValue(ConveyorLineStationDBName.WCSStationTaskNum, 997);
|
otherDevice.SetValue(ConveyorLineStationDBName.WCSStationResponse, true);
|
}
|
}
|
|
}
|
else
|
{
|
if (wcsResponse && !request)
|
otherDevice.SetValue(ConveyorLineStationDBName.WCSStationResponse, false); //清除响应
|
}
|
|
}
|
catch (Exception ex)
|
{
|
otherDevice.SetValue(ConveyorLineStationDBName.WCSStationTarget, dischargeStation);
|
otherDevice.SetValue(ConveyorLineStationDBName.WCSStationTaskNum, 996);
|
otherDevice.SetValue(ConveyorLineStationDBName.WCSStationResponse, true);
|
|
WriteError($"{otherDevice.DeviceCode}-{otherDevice.DeviceName}", ex.Message, ex);
|
}
|
}
|
else
|
{
|
WriteError(nameof(CommonConveyorLineOutJob), "参数错误,未传递设备参数或设备类型错误");
|
}
|
return Task.CompletedTask;
|
}
|
}
|
}
|