using HH.WCS.QingXigongchang.device;
using HH.WCS.QingXigongchang.dispatch;
using HH.WCS.QingXigongchang.util;
using HH.WCS.QingXigongchang.wms;
using Newtonsoft.Json;
using SqlSugar;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading;
using static HH.WCS.QingXigongchang.api.ApiModel;
using Monitor = HH.WCS.QingXigongchang.core.Monitor;
namespace HH.WCS.QingXigongchang.process
{
internal class TaskProcess
{
private static HttpHelper apiHelper = new HttpHelper();
public const bool UPFule = false;
#region 任务相关
//--------------------------------------------------任务相关--------------------------------------------------
///
/// 取货卸货完成,缓存位状态更新
///
///
///
internal static void CacheBitUpdate(WMSTask mst, bool load, string desc = "")
{
var trayCarryCount = mst.N_CNTR_COUNT > 0 ? mst.N_CNTR_COUNT : 1;
if (load)
{
Console.WriteLine($"任务{mst.S_TASK_NO} 货位{mst.S_START_LOC}取货完成,起点解绑容器{mst.S_CNTRS}");
LogHelper.Info($"任务{mst.S_TASK_NO} 货位{mst.S_START_LOC}取货完成,起点解绑容器{mst.S_CNTRS}");
LocationHelper.UnBindingLoc(mst.S_START_LOC, mst.S_CNTRS.Split(',').ToList());
}
else
{
Console.WriteLine($"任务{mst.S_TASK_NO} 货位{mst.S_END_LOC}卸货完成,终点绑定容器{mst.S_CNTRS}");
LogHelper.Info($"任务{mst.S_TASK_NO} 货位{mst.S_END_LOC}卸货完成,终点绑定容器{mst.S_CNTRS}-{desc}");
LocationHelper.BindingLoc(mst.S_END_LOC, mst.S_CNTRS.Split(',').ToList(), desc);
}
}
///
/// 任务取消,缓存位状态更新
///
///
internal static void CacheBitCancelUpdate(WMSTask mst, out ReturnResult r, bool BeenOver = false)
{
r = new ReturnResult();
//任务取消,取货完成前的,起点的loadingCount和终点unLoadingCount都清除,取货完成的只处理终点
bool bbbbbbb = TaskHelper.CheckActionRecordExist(mst.S_TASK_NO, "4"); //取货完成后 取消/ 强制完成信号。 强制完成必须取货后
if (BeenOver)
{
if (!bbbbbbb)
{
if (TaskHelper.CheckActionRecordExist(mst.S_TASK_NO, "6"))
{
r = new ReturnResult()
{
ResultCode = -1,
ResultMsg = "任务已经卸货,不能强制完成。"
};
return;
}
r = new ReturnResult()
{
ResultCode = -1,
ResultMsg = "任务还没有取货,不能强制完成。"
};
return;
}
}
if (bbbbbbb)
{
bbbbbbb = false;
//UpdateElevatorTask(mst);
//todo: 如果是电梯卸货任务电梯任务中间表状态,如
bbbbbbb = TaskHelper.CheckActionRecordExist(mst.S_TASK_NO, "5");
if (BeenOver || (mst.S_TYPE.Contains("成品满框") && bbbbbbb))
{
//if (mst.S_TYPE.Trim().Contains("翻斗机叫满"))
//{
// LocationHelper.UnLockLoc(mst.S_END_LOC);
//}
//else
OperateStatus(mst, 6);
#region oooooo
////终点绑定
//CacheBitUpdate(mst, false);
//if (mst.S_TYPE.Trim() == "满瓶坯-入库")
//{
// //LocationHelper.UnLockLoc(mst.S_START_LOC.Trim());
// //LocationHelper.UnLockLoc(mst.S_END_LOC.Trim());
// //if (BeenOver)
// //{
// LocationHelper.lOCReSetValue(x => x.S_LOC_CODE == mst.S_END_LOC.Trim(), x =>
// {
// x.N_CURRENT_NUM = 1;
// });
// //取货后完成的 - 直接完成。 这里要按照卸货处理 - 生成搬运空托到任务起点。
// LocationHelper.TakeEmptyToBottleBoyd(mst.S_START_LOC.Trim());
// //}
//}
//else if (mst.S_TYPE.Trim() == "空瓶坯-出库")
//{
// //LocationHelper.UnLockLoc(mst.S_END_LOC.Trim());
// //if (BeenOver)
// //{
// LocationHelper.lOCReSetValue(x => x.S_LOC_CODE == mst.S_START_LOC.Trim(), x =>
// {
// x.N_CURRENT_NUM = 1;
// x.T_FULL_TIME = DateTime.Now;
// });
// //}
//}
#endregion
}
else
{
LocationHelper.UnLockLoc(mst.S_END_LOC);
}
}
else
{
//电梯卸货任务表直接删除
//DeleteElevatorTask(mst);
//起点终点解锁
if (mst.S_TYPE.Trim() == "满瓶坯-入库" || mst.S_TYPE.Contains("空瓶坯-出库"))//|| mst.S_TYPE.Trim().Contains("瓶盖-满下线"))
{
//LocationHelper.SetT_FULL_TIME(mst.S_START_LOC.Trim(), null);
//LocationHelper.lOCReSetValue(x => x.S_LOC_CODE == mst.S_START_LOC.Trim(), x =>
//{
// x.N_CURRENT_NUM = 0;
// x.T_FULL_TIME = null;
//});
//var _r = LocationHelper.DoAction(db =>
// {
// return db.Deleteable().Where(x => x.S_LOC_CODE == mst.S_START_LOC.Trim()).ExecuteCommand() > 0;
// });
var loc = mst.S_TYPE.Trim() == "满瓶坯-入库" ? mst.S_START_LOC.Trim() : mst.S_END_LOC.Trim();
var plc = Settings.GetDeviceInfoList().Where(a => a.location.Contains(loc) && a.enable == 1).FirstOrDefault();
if (plc != null)
{
if (plc.deviceType == 8)
for (var i = 0; i < plc.location.Length; i++)
{
if (loc == plc.location[i])
{
LogHelper.Info($"重置信号位置。 " + loc);
PlcHelper.SendHex(plc.address, "3F00" + (i + 1) + "0" + "0d0a");
break;
}
}
}
//ApiHelper.unOutgo3("------", mst.S_START_LOC);
}
else if (mst.S_TYPE.Trim() == "瓶盖非即产线边" || mst.S_TYPE.Contains("瓶盖即产转翻斗机线边") || mst.S_TYPE.Contains("注塑即产空筐上线") || mst.S_TYPE.Contains("注塑库存空筐上线"))//|| mst.S_TYPE.Trim().Contains("瓶盖-满下线"))
{
//LocationHelper.SetT_FULL_TIME(mst.S_START_LOC.Trim(), null);
//LocationHelper.lOCReSetValue(x => x.S_LOC_CODE == mst.S_START_LOC.Trim(), x =>
//{
// x.N_CURRENT_NUM = 0;
// x.T_FULL_TIME = null;
//});
//var _r = LocationHelper.DoAction(db =>
// {
// return db.Deleteable().Where(x => x.S_LOC_CODE == mst.S_START_LOC.Trim()).ExecuteCommand() > 0;
// });
var loc = (mst.S_TYPE.Trim() == "瓶盖非即产线边" || mst.S_TYPE.Contains("瓶盖即产转翻斗机线边")) ? mst.S_START_LOC.Trim() : mst.S_END_LOC.Trim();
var plc = Settings.GetDeviceInfoList().Where(a => a.location.Contains(loc) && a.enable == 1).FirstOrDefault();
if (plc != null)
{
if (plc.deviceType == 2 || plc.deviceType == 3)
for (var i = 0; i < plc.location.Length; i++)
{
if (loc == plc.location[i])
{
LogHelper.Info($"重置信号位置。 " + loc);
PlcHelper.SendHex(plc.address, "3F00" + (i + 1) + "0" + "0d0a");
break;
}
}
}
//ApiHelper.unOutgo3("------", mst.S_START_LOC);
}
else if (mst.S_TYPE.Contains("库存盖坯出库"))
CancelckLingItem(mst);
#region 注释行
//if (mst.S_TYPE.Trim().Contains("瓶盖-满下线"))
//{
// //LocationHelper.SetT_FULL_TIME(mst.S_START_LOC.Trim(), null);
// LocationHelper.lOCReSetValue(x => x.S_LOC_CODE == mst.S_START_LOC.Trim(), x =>
// {
// x.N_CURRENT_NUM = 0;
// x.T_FULL_TIME = null;
// });
// var _r = LocationHelper.DoAction(db =>
// {
// return db.Deleteable().Where(x => x.S_LOC_CODE == mst.S_START_LOC.Trim()).ExecuteCommand() > 0;
// });
// LogHelper.Info($"重置起点位置。 {_r}");
// //ApiHelper.unOutgo3("------", mst.S_START_LOC);
//}
#endregion
LocationHelper.UnLockLoc(mst.S_START_LOC);
LocationHelper.UnLockLoc(mst.S_END_LOC);
//todo: 如果是电梯卸货任务取消删除,如果是电梯取货任务取消修改任务状态
//var cntrs = mst.S_CNTRS.Split(',').ToList();
//没有取货完成的任务,如果是清洁位补空类型任务,需要将托盘状态还原成已清洁
//if (Settings.GetInStockCacheList().Count(a => (a.locationType == 1 || a.locationType == 3 || a.locationType == 4) && a.location == mst.S_START_LOC) > 0)
//{
// ContainerHelper.UpdateCntr(cntrs, "", "", "已清洁");
//}
////临时库-翻斗机线边取消,还原托盘信息
//if (mst.S_TYPE.Trim() == "临时库-线边")
//{
// var startInfo = Settings.GetTipperCacheList().Where(a => a.location.Contains(mst.S_START_LOC)).FirstOrDefault();
// if (startInfo != null)
// {
// ContainerHelper.UpdateCntr(cntrs, startInfo.deviceName, "");
// }
//}
////瓶盖库-临时库
//if (mst.S_TYPE.Trim() == "瓶盖库-临时库")
//{
// ContainerHelper.UpdateCntr(cntrs, "", "");
//}
}
}
static void CancelckLingItem(WMSTask mst)
{
if (!TaskProcess.UPFule) return;
if (string.IsNullOrEmpty(mst.S_SRC_NO)) return;
LingItemOrder od = null;
var wod = WCSHelper.GetWorkOrder(mst.S_SRC_NO);
var plc = Settings.GetDeviceInfoList().Find(x => x.deviceName == wod?.SQL_PLineNo);
if (plc != null)
LocationHelper.DoAction(db =>
{
od = db.Queryable().Where(it => plc.FuLeLineNo.Contains(it.DeviceNo) && it.State == "执行").First();
return true;
});
if (od != null)
{
int current = 0;
foreach (var item in mst.S_CNTRS.Split(','))
{
var cntrs = ContainerHelper.GetCntrItemRel(item)?.FirstOrDefault();
current += cntrs.qty;
}
od.AllocQTY -= current; //取消扣除分配量。。 强制完成会走信号6 这里不需要
LocationHelper.DoAction(db =>
{
db.Updateable(od).UpdateColumns(it => new { it.AllocQTY }).ExecuteCommand();
return true;
});
}
}
///
/// 安全请求
///
///
///
///
///
internal static void OperateReq(string no, int state, string forkliftNo, string extData)
{
}
///
/// 任务拦截
///
///
///
internal static bool Intercept(WMSTask mst)
{
var result = false;
//翻斗机叠空框
//电梯任务不推送,单独处理
if (mst.S_TYPE.Contains("-电梯"))
{
result = true;
}
if (mst.S_TYPE.Trim() == "翻斗机叠空框" && mst.N_PRIORITY == 90)
{
//判断相同终点的叠托任务是否存在,是否取货完成
var list = TaskHelper.GetTaskByEnd(mst.S_END_LOC);
var otherTask = list.Where(a => a.N_PRIORITY == 99).FirstOrDefault();
if (otherTask != null && !TaskHelper.CheckActionRecordExist(otherTask.S_TASK_NO, "4"))
{
TaskHelper.UpdateStatus(mst, "未执行");
result = true;
}
}
return result;
}
///
/// 任务状态更新处理
///
///
///
internal static ReturnResult OperateStatus(WMSTask mst, int state)
{
ReturnResult r = new ReturnResult();
if (state == 4)
{
if (!mst.S_TYPE.Trim().Contains("自由点对点"))
CacheBitUpdate(mst, load: true);
if (mst.S_TYPE.Trim().Contains("满瓶坯-入库") || mst.S_TYPE.Trim().Contains("空瓶坯-出库") || mst.S_TYPE.Trim().Contains("瓶盖-满下线"))
{
LocationHelper.lOCReSetValue((Location x) => x.S_LOC_CODE == mst.S_START_LOC.Trim(), delegate (Location x)
{
if (x.N_CURRENT_NUM > 0)
x.N_CURRENT_NUM--;
else x.N_CURRENT_NUM = 0;
});
}
else if (mst.S_TYPE.Trim().Contains("上线满出库") || mst.S_TYPE.Trim().Contains("仓空转下空"))
{
LocationHelper.lOCReSetValue((Location x) => x.S_LOC_CODE == mst.S_START_LOC.Trim(), delegate (Location x)
{
if (x.N_CURRENT_NUM == 0)
x.S_NOTE = "";
});
}
if (mst.S_TYPE.Contains("Fu成品满框-入库"))
{
var plc = Settings.GetDeviceInfoList().Where(a => a.location.Contains(mst.S_START_LOC.Trim()) && a.enable == 1).FirstOrDefault();
if (plc != null)
{
if (plc.deviceType == 9)
{
PlcHelper.SendHex(plc.address, "3F00" + "10" + "0d0a");
}
}
LocationHelper.DoAction(db =>
{
var fulectlist = LocationHelper.GetFuLeTrayCodeList(f => mst.S_CNTRS.Contains(f.trayCode.Trim()));
LogHelper.Info("Fu成品取货" + mst.S_CNTRS + "--<>--" + JsonConvert.SerializeObject(fulectlist));
if (fulectlist.Any())
db.Updateable(fulectlist).ReSetValue(it => { it.SQL_State = "完成"; }).ExecuteCommand();
return true;
});
}
if (mst.S_TYPE.Contains("翻斗机即产满筐上线(瓶盖)") || mst.S_TYPE.Contains("翻斗机库存满筐上线(瓶盖)") || mst.S_TYPE.Contains("翻斗机叫满") || mst.S_TYPE.Contains("中转去"))
{
//写入 入库排锁 - 记录 在入库。 如果排满了,就歇菜。 清除 放在 线程里。
var loc = LocationHelper.GetLoc(mst.S_START_LOC);
var db = new SqlHelper