using HH.WCS.Mobox3.NFLZ.core;
using HH.WCS.Mobox3.NFLZ.device;
using HH.WCS.Mobox3.NFLZ.dispatch;
using HH.WCS.Mobox3.NFLZ.models;
using HH.WCS.Mobox3.NFLZ.util;
using HH.WCS.Mobox3.NFLZ.wms;
using Newtonsoft.Json;
using SqlSugar;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Security.Cryptography;
using static HH.WCS.Mobox3.NFLZ.api.OtherModel;
using static HH.WCS.Mobox3.NFLZ.dispatch.NDC;
using static HH.WCS.Mobox3.NFLZ.wms.WMSHelper.AddChangeModel;
namespace HH.WCS.Mobox3.NFLZ.process
{
internal class TaskProcess
{
private static HttpHelper httpHelper = new HttpHelper();
#region 任务相关
//--------------------------------------------------任务相关--------------------------------------------------
///
/// 取货卸货完成,缓存位状态更新
///
///
///
internal static void CacheBitUpdate(WCSTask mst, bool load)
{
var trayCarryCount = mst.N_CNTR_COUNT > 0 ? mst.N_CNTR_COUNT : 1;
if (load)
{
Console.WriteLine($"任务{mst.S_CODE} 货位{mst.S_START_LOC}取货完成,起点解绑容器{mst.S_CNTR_CODE}");
LogHelper.Info($"任务{mst.S_CODE} 货位{mst.S_START_LOC}取货完成,起点解绑容器{mst.S_CNTR_CODE}");
LocationHelper.UnBindingLoc(mst.S_START_LOC, mst.S_CNTR_CODE.Split(',').ToList(),mst.S_TYPE);
}
else
{
Console.WriteLine($"任务{mst.S_CODE} 货位{mst.S_END_LOC}卸货完成,终点绑定容器{mst.S_CNTR_CODE}");
LogHelper.Info($"任务{mst.S_CODE} 货位{mst.S_END_LOC}卸货完成,终点绑定容器{mst.S_CNTR_CODE}");
LocationHelper.BindingLoc(mst.S_END_LOC, mst.S_CNTR_CODE.Split(',').ToList(),mst.S_TYPE);
}
}
///
/// 任务取消,缓存位状态更新
///
///
internal static void CacheBitCancelUpdate(WCSTask mst)
{
//任务取消,取货完成前的,起点的loadingCount和终点unLoadingCount都清除,取货完成的只处理终点
if (WCSHelper.CheckActionRecordExist(mst.S_CODE, 4))
{
//根据客户现场要求,如果取货完成任务失败人工拉到终点,我们就当卸货完成处理;如果是人工拉走到其它区域,我们就解锁终点,删除托盘。
//终点绑定
CacheBitUpdate(mst, false);
LocationHelper.UnLockLoc(mst.S_END_LOC);
}
else
{
//起点终点解锁
LocationHelper.UnLockLoc(mst.S_START_LOC);
LocationHelper.UnLockLoc(mst.S_END_LOC);
}
}
///
/// 安全请求
///
///
///
///
///
internal static void OperateReq(string no, int state, string forkliftNo, string extData)
{
LogHelper.Info($"收到安全请求信号:{state},任务号:{no}");
var mst = WCSHelper.GetTask(no);
if (mst != null)
{
if (state == 1101)
{
//取货请求,允许进入取货,修改参数18为1101
DeviceProcess.quliao(mst);
}
if (state == 1103)
{
DeviceProcess.Xieliao(mst);
}
if (state == 1102 || state == 1104)
{
sendSing(mst, state);
}
}
}
internal static void sendSing(WCSTask wmsTask, int state = 0)
{
LogHelper.Info($"收到任务{wmsTask.S_CODE}信号{state},类型{wmsTask.S_TYPE}");
if(wmsTask.S_TYPE == "成品下线" || wmsTask.S_TYPE == "栈板上线")
{
int devType = wmsTask.S_TYPE == "成品下线" ? 1 : 2;
var plc = Settings.deviceInfos.Where(a => a.deviceType == devType).FirstOrDefault();
if (plc != null)
{
if (wmsTask.S_TYPE == "成品下线")
{
if (state == 1101)
{
PlcHelper.SendHex(plc.address, "3F00110D0A");
}
if (state == 1102)
{
PlcHelper.SendHex(plc.address, "3F00100d0a");
}
}
if (wmsTask.S_TYPE == "栈板上线")
{
if (state == 1103)
{
PlcHelper.SendHex(plc.address, "3F00210d0a");
}
if (state == 1104 || state == -1)
{
PlcHelper.SendHex(plc.address, "3F00200d0a");
}
}
}
else LogHelper.Info("农夫林芝-L6输送线 未配置");
}
else
{
LogHelper.Info($"{wmsTask.S_TYPE}写入复位信号");
writeSignal(wmsTask, state);
}
}
public static void writeSignal(WCSTask mst, int state = 0)
{
if (mst.S_TYPE.Contains("空托上线"))
{
LogHelper.Info($"{mst.S_TYPE}卸货完成,写入信号");
//根据起点判断是A口还是B口
var locCode = mst.S_END_LOC;
var devInfo = Settings.deviceInfos.Where(a => a.TN_Location.Contains(locCode)).FirstOrDefault();
if (devInfo != null)
{
var signal = devInfo.TN_Location[0] == mst.S_END_LOC ? "3F 00 10 0D 0A" : "3F 00 20 0D 0A";
if (PlcHelper.SendHex(devInfo.address, signal)) LogHelper.Info($"{mst.S_TYPE}任务卸货完成,写入信号:{signal},ip:{devInfo.address}");
}
else LogHelper.Info($"设备未找到,货位号:{mst.S_END_LOC}");
}
if (mst.S_TYPE.Contains("满托上线"))
{
LogHelper.Info($"{mst.S_TYPE}卸货完成,写入信号");
var locCode = mst.S_END_LOC;
var devInfo = Settings.deviceInfos.Where(a => a.TN_Location.Contains(locCode)).FirstOrDefault();
if (devInfo != null)
{
var signal = "3F 00 12 21 0D 0A";
if (state == 1104) signal = "3F 00 10 20 0D 0A";
if (PlcHelper.SendHex(devInfo.address, signal)) LogHelper.Info($"{mst.S_TYPE}任务卸货完成,写入信号:{signal},ip:{devInfo.address}");
}
else LogHelper.Info($"设备未找到,货位号:{mst.S_END_LOC}");
}
if (mst.S_TYPE.Contains("空托下线"))
{
LogHelper.Info($"{mst.S_TYPE}取货完成,写入信号");
var locCode = mst.S_START_LOC;
var devInfo = Settings.deviceInfos.Where(a => a.TN_Location.Contains(locCode)).FirstOrDefault();
if (devInfo != null)
{
var signal = "3F 00 12 22 00 0D 0A";
if (state == 1102) signal = "3F 00 10 20 0D 0A";
if (PlcHelper.SendHex(devInfo.address, signal)) LogHelper.Info($"{mst.S_TYPE}任务取货完成,写入信号:{signal},ip:{devInfo.address}");
}
else LogHelper.Info($"设备未找到,货位号:{mst.S_END_LOC}");
}
if (mst.S_TYPE.Contains("满托下线"))
{
LogHelper.Info($"{mst.S_TYPE}取货完成,写入信号");
//根据起点判断是A口还是B口
var locCode = mst.S_START_LOC;
var devInfo = Settings.deviceInfos.Where(a => a.TN_Location.Contains(locCode)).FirstOrDefault();
if (devInfo != null)
{
var signal = devInfo.TN_Location[0] == mst.S_START_LOC ? "3F 00 10 0D 0A" : "3F 00 20 0D 0A";
if (PlcHelper.SendHex(devInfo.address, signal)) LogHelper.Info($"{mst.S_TYPE}任务取货完成,写入信号:{signal},ip:{devInfo.address}");
}
else LogHelper.Info($"设备未找到,货位号:{mst.S_START_LOC}");
}
}
internal static void UpdateAgvNo(WCSTask mst, string forkliftNo)
{
var db = new SqlHelper