using Hanhe.iWCS.Business;
using Hanhe.iWCS.Common;
using Hanhe.iWCS.Interface;
using Hanhe.iWCS.MData;
using Hanhe.iWCS.Model;
using Hanhe.iWCS.Model.AMS;
using Microsoft.Owin.Hosting;
using MongoDB.Driver;
using MongoDB.Driver.Builders;
using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using static Hanhe.iWCS.JingmenGEMTwoProtocol.EnentListen;
using static Hanhe.iWCS.JingmenGEMTwoProtocol.MESHelper;
using static Hanhe.iWCS.JingmenGEMTwoProtocol.ProcessHelper;
using static Hanhe.iWCS.JingmenGEMTwoProtocol.PLCControl;
using MongoDB.Bson;
using static Hanhe.iWCS.JingmenGEMTwoProtocol.ERPService;
using static Hanhe.iWCS.JingmenGEMTwoProtocol.ApiHelper;
using System.Security.Policy;
using Hanhe.iWCS.DeviceDriver;
using System.Web.UI.WebControls;
namespace Hanhe.iWCS.JingmenGEMTwoProtocol
{
///
/// 设备协议解析类
///
public class ProtocolAnalysis : IProtocolAnalysis
{
private EquipmentCommandEQBLL CommandEQBLL = new EquipmentCommandEQBLL();
public ICallTaskProcessing iCallTask = new ICallTaskProcessing();
HardwareAccessObject hao = HardwareAccessHelper.Instance.GetEquipmentsHAO(Constants.WMS_DEVICE_TYPE_WMS);
private Logger AMSLoggerAPI = new Logger();
public void StringRequestInfo(string protocolMsg, string address, int port) {
}
public void StringRequestInfo(string protocolMsg, string address, int port, string sessionID) {
//16进制接收
protocolMsg = protocolMsg.Trim();//3f 00 11 20 30 40 50 60 70 80 90 A0 24 24
if (protocolMsg != "") {
}
#region 握手反馈指令
//UpdateHandshakeFeedbackCode(protocolMsg);
PLCControl.Analysis(protocolMsg);
#endregion
}
public void UpdateHandshakeFeedbackCode(string commandText) {
var query = Query.And(Query.EQ("CommandText", commandText + "$$"), Query.EQ("Status", Constants.COMMANDEQ_STATUS_SENDED));
EquipmentCommandEQ eq = MongoDBSingleton.Instance.FindOne(query, typeof(EquipmentCommandEQ).Name);
if (eq != null) {
UpdateBuilder updateBuider = Update.Set("isHandshake", 1).Set("FeedbackCode", commandText);
MongoDBSingleton.Instance.Update(query, updateBuider, UpdateFlags.None);
}
}
private static bool api = false;
public ProtocolAnalysis() {
if (!api) {
Startup();
api = true;
}
}
public static void Startup() {
//Console.WriteLine("Startup ApiController");
Task.Run(() => {
var url = "http://+:8801";
using (WebApp.Start(url)) {
//Console.WriteLine("Running on {0}", url);
Console.ReadLine();
}
});
}
public int workflowToDeviceDriver(TN_I_TASK_DTL_ACTION action) {
int iResult = 0;
CMMLog.Info($"任务处理:Action Code:{action.CN_N_ACTION_CODE},TaskNo:{action.CN_S_TASK_NO}");
switch (action.CN_N_ACTION_CODE)
{
case 1012: AMSHelper.TaskTrackLogMessage(action.CN_S_TASK_NO, action.CN_N_ORDER.ToString(), action.CN_N_ACTION_CODE.ToString(), "起点申请进入"); break;
case 1312: AMSHelper.TaskTrackLogMessage(action.CN_S_TASK_NO, action.CN_N_ORDER.ToString(), action.CN_N_ACTION_CODE.ToString(), "电梯安全对接"); break;
case 1112: AMSHelper.TaskTrackLogMessage(action.CN_S_TASK_NO, action.CN_N_ORDER.ToString(), action.CN_N_ACTION_CODE.ToString(), "滚筒车起点到位"); break;
case 1212: AMSHelper.TaskTrackLogMessage(action.CN_S_TASK_NO, action.CN_N_ORDER.ToString(), action.CN_N_ACTION_CODE.ToString(), "滚筒车取货完成通知PLC"); break;
case 1013: AMSHelper.TaskTrackLogMessage(action.CN_S_TASK_NO, action.CN_N_ORDER.ToString(), action.CN_N_ACTION_CODE.ToString(), "终点申请进入"); break;
case 1113: AMSHelper.TaskTrackLogMessage(action.CN_S_TASK_NO, action.CN_N_ORDER.ToString(), action.CN_N_ACTION_CODE.ToString(), "滚筒车终点到位"); break;
case 1213: AMSHelper.TaskTrackLogMessage(action.CN_S_TASK_NO, action.CN_N_ORDER.ToString(), action.CN_N_ACTION_CODE.ToString(), "滚筒车卸货完成通知PLC"); break;
case 1313: AMSHelper.TaskTrackLogMessage(action.CN_S_TASK_NO, action.CN_N_ORDER.ToString(), action.CN_N_ACTION_CODE.ToString(), "拍照扫码"); break;
}
if (action.CN_N_ACTION_CODE == 1027) {
var mst = iCallTask.FindTask(action.CN_S_TASK_NO);
if (mst != null ) {
if (ProcessHelper.Intercept(mst))
{
iResult = 1027;//拦截更改 WCS 任务类型(将 WMS 任务类型更改为 WCS 任务类型,因为 WCS 需要根据任务类型进行对应任务流程处理)
iCallTask.UpdateTask(mst.CN_S_TASK_NO, "未执行");
}
else
{
CMMLog.Info($"推送任务:任务号{mst.CN_S_TASK_NO},任务类型:{mst.CN_S_BUSS_TYPE}");
iCallTask.UpdateTask(mst.CN_S_TASK_NO, "已推送");
ProcessHelper.SendTask(mst);
}
}
iResult = 1027;
}
#region 取消
if (action.CN_N_ACTION_CODE == 7) {
TN_I_TASK_MST mst = iCallTask.FindTask(action.CN_S_TASK_NO);
string agvNo = action.CN_S_DEVICE_CODE;
if (mst != null) {
if (!WorkFlowAction.ExistsTrackLogs(mst.CN_S_TASK_NO, 1, 4))
{
CMMLog.Info("action.CN_N_ORDER:" + action.CN_N_ORDER);
//请求前
if (action.CN_N_ORDER == 0)
WorkFlowAction.TrackLog(action.CN_S_TASK_NO, 0, 7, "收到ams取消请求");
if (action.CN_N_ORDER == 1 || action.CN_N_ORDER == 0)
{
ProcessHelper.TaskCancel(mst);
iCallTask.CancelTask(mst.CN_S_TASK_NO, "1");
AMSHelper.SetStatus(action.CN_S_TASK_NO, 1, "7", "0", true);
if (mst.CN_S_BUSS_TYPE != "电梯取货" && mst.CN_S_BUSS_TYPE != "电梯卸货" && mst.CN_S_BUSS_TYPE != "3楼包装取料")
WMSHelper.ExecuteState(mst.CN_S_SOURCE_NO, action.CN_N_ACTION_CODE);
iCallTask.DeleteTask(mst.CN_S_TASK_NO);
}
if (mst.CN_S_BUSS_TYPE == "电梯取货" || mst.CN_S_BUSS_TYPE == "电梯卸货" || mst.CN_S_BUSS_TYPE == "满托入库" || mst.CN_S_BUSS_TYPE == "空托出库")
{
ProcessHelper.ForceCancel(mst, action);
MongoDBSingleton.Instance.Remove(Query.EQ("timeStamp", mst.CN_S_BATCH_NO), RemoveFlags.None);
}
//if (mst.CN_S_BUSS_TYPE == "包装线补空") PLCControl.PickUpBlankComplete(mst.CN_S_END_BIT);
if (ERPService.SendERPTaskType.Contains(mst.CN_S_BUSS_TYPE) && ERPService.ERPSwitch01 == "1") ERPService.SendERPTaskInfoTwo(mst);
}
else
{
CMMLog.Info("该任务以取货完成,无法取消,如果需要停止此任务,请强制完成");
}
}
}
#endregion
#region 强制完成
if (action.CN_N_ACTION_CODE == 1022) {
TN_I_TASK_MST mst = iCallTask.FindTask(action.CN_S_TASK_NO);
if (mst != null) {
if(WorkFlowAction.ExistsTrackLogs(mst.CN_S_TASK_NO, 1, 4))
{
ProcessHelper.ForceComplete(mst, action);
if (mst.CN_S_BUSS_TYPE == "3楼缓存架入叠托")
{
var plc = Settings.GetPlcInfo().Where(a => a.deviceType == "3").FirstOrDefault();
if (plc != null)
{
var machine = MongoDBSingleton.Instance.FindOne(Query.EQ("trayCode", mst.CN_S_BATCH_NO), "WMSInfo");
if (machine != null)
{
#region 写多个MODBUS数据
int[] num = DiePan(machine);
CMMLog.Info($"send num:" + JsonConvert.SerializeObject(num));
var wirteall01 = OITcpHelper.RegisterWriteOutPutMulti(new OITcpHelper.RegisterWriteOutPutModelMulti
{
addr = plc.writeAddr + 10,
host = plc.ip,
port = plc.port,
data = num
});
#endregion
MongoDBSingleton.Instance.Remove(Query.EQ("trayCode", mst.CN_S_BATCH_NO), "WMSInfo", RemoveFlags.Single);
}
}
}
MongoDBSingleton.Instance.Remove(Query.EQ("TaskNo", mst.CN_S_TASK_NO), RemoveFlags.Single);
WorkFlowAction.TrackLog(mst.CN_S_TASK_NO, 1, 1022, "收到ams强制完成请求");
AMSHelper.SetStatus(action.CN_S_TASK_NO, 1, "1022", "0", true);
iCallTask.CancelTask(mst.CN_S_TASK_NO, "1");
if (mst.CN_S_BUSS_TYPE != "电梯取货" && mst.CN_S_BUSS_TYPE != "电梯卸货" && mst.CN_S_BUSS_TYPE != "3楼包装取料")
WMSHelper.ExecuteState(mst.CN_S_SOURCE_NO, action.CN_N_ACTION_CODE);
if (mst.CN_S_BUSS_TYPE == "电梯取货" && mst.CN_S_BUSS_TYPE == "电梯卸货")
MongoDBSingleton.Instance.ReomveAll();
if (mst.CN_S_BUSS_TYPE == "包装线补空") PLCControl.PickUpBlankComplete(mst.CN_S_END_BIT);
if (mst.CN_S_BUSS_TYPE == "3楼复称入缓存架" || mst.CN_S_BUSS_TYPE == "3楼复称入缓存架NG")
{
var plc = Settings.GetPlcInfo().Where(a => a.location == mst.CN_S_START_BIT && a.enable == 1).FirstOrDefault();
if (plc != null)
{
PLCControl.SecondWeightInCache4(plc.ip, mst.CN_S_TASK_NO);
}
}
if (ERPService.SendERPTaskType.Contains(mst.CN_S_BUSS_TYPE) && ERPService.ERPSwitch01 == "1") ERPService.SendERPTaskInfo(mst);
}
else
{
CMMLog.Info("该任务未取货完成,取消此任务");
iCallTask.CancelTask(mst.CN_S_TASK_NO, "1");
}
iCallTask.DeleteTask(mst.CN_S_TASK_NO);
}
}
#endregion
if (action.CN_N_ACTION_CODE == 13) {
var task = iCallTask.FindTask(action.CN_S_TASK_NO);
AMSHelper.TaskTrackLogMessage(action.CN_S_TASK_NO, action.CN_N_ORDER.ToString(), "", "AGV调整任务优先级成功" + action.Ext1);
}
#region 任务状态委托(1-开始;3-开始取货;4-取货完成;5-开始卸货;6-卸货完成;2-完成)
if (action.CN_N_ACTION_CODE == 1 || action.CN_N_ACTION_CODE == 2 || action.CN_N_ACTION_CODE == 4 || action.CN_N_ACTION_CODE == 6)
{
WorkFlowAction.TrackLog(action.CN_S_TASK_NO, 1, action.CN_N_ACTION_CODE, "");
TN_I_TASK_MST mst = iCallTask.FindTask(action.CN_S_TASK_NO);
if (mst != null)
{
if (string.IsNullOrEmpty(mst.CN_S_ForkliftNo) && !string.IsNullOrEmpty(action.CN_S_DEVICE_CODE))
{
MongoDBSingleton.Instance.Update(Query.EQ("_id", mst._id), Update.Set("CN_S_ForkliftNo", action.CN_S_DEVICE_CODE), UpdateFlags.None);
}
#region 写入小车状态
writeAGVState(action);
#endregion
var url = hao.WebUrl + "GlmTrayItemSet";
if (action.CN_N_ACTION_CODE == 1)
{
AMSHelper.SetStatus(action.CN_S_TASK_NO, 1, "1", action.CN_S_DEVICE_CODE, true);
WMSHelper.ExecuteState(mst.CN_S_SOURCE_NO, action.CN_N_ACTION_CODE);
if (mst.CN_S_BUSS_TYPE.Contains("缓存架入立库"))
{
if (mst.CN_S_BUSS_TYPE.Contains("电钴"))
{
//将任务号插入到中间表
var erpInfo = MongoDBSingleton.Instance.FindOne(Query.And(Query.EQ("Bit", mst.CN_S_START_BIT), Query.EQ("taskNo", "")), "SendErpTaskInfoTableDG");
if (erpInfo != null)
{
MongoDBSingleton.Instance.Update(Query.And(Query.EQ("Bit", mst.CN_S_START_BIT), Query.EQ("taskNo", "")), Update.Set("taskNo", mst.CN_S_SOURCE_NO), UpdateFlags.None);
}
}
else
{
//将任务号插入到中间表
var erpInfo = MongoDBSingleton.Instance.FindOne(Query.And(Query.EQ("Bit", mst.CN_S_START_BIT), Query.EQ("taskNo", "")), "SendErpTaskInfoTable");
if (erpInfo != null)
{
MongoDBSingleton.Instance.Update(Query.And(Query.EQ("Bit", mst.CN_S_START_BIT), Query.EQ("taskNo", "")), Update.Set("taskNo", mst.CN_S_SOURCE_NO), UpdateFlags.None);
}
}
}
if (mst.CN_S_BUSS_TYPE == "老物料缓存架入立库")
{
MongoDBSingleton.Instance.Insert(new SendErpTaskInfoTable
{
taskNo = mst.CN_S_SOURCE_NO,
Bit = mst.CN_S_START_BIT,
//materiCode = time.materialCode,
//lotCode = time.batchNumber,
totalWeight = 1000,
productTime = mst.CN_T_CREATE,
invalidationTime = mst.CN_T_CREATE.AddDays(365),
dateTime = DateTime.Now.AddHours(8)
}, "ERPItemTable");
}
if (mst.CN_S_BUSS_TYPE == "3楼成品出库")
{
string day = DateTime.Now.ToString("yyyyMMdd");
//根据托盘号获取入库物料信息
CJWareNum model = new CJWareNum
{
TrayCode = mst.CN_S_BATCH_NO
};
string msgData = JsonConvert.SerializeObject(model);
var feedback = helper.WebPost(url, msgData).Replace(@"\", "").Trim();
CMMLog.Info($"writeCJQtt:【调用wms获取物料信息】:接收数据:" + feedback);
if (!string.IsNullOrEmpty(feedback))
{
var wmsResponse = JsonConvert.DeserializeObject(feedback);
if (wmsResponse.Success == true)
{
string itemCode = wmsResponse.Data.CN_S_LOT_NO.Contains("-") ? wmsResponse.Data.CN_S_LOT_NO.Substring(0, wmsResponse.Data.CN_S_LOT_NO.LastIndexOf('-')) : wmsResponse.Data.CN_S_LOT_NO;
var itemInfo = MongoDBSingleton.Instance.FindOne(Query.And(Query.EQ("Type", "出库"), Query.EQ("Day", day), Query.EQ("itemBatch", itemCode)), "InAndOutQuantity");
if (itemInfo != null)
{
itemInfo.Quntity = itemInfo.Quntity + 1;
MongoDBSingleton.Instance.Update(Query.And(Query.EQ("Type", "出库"), Query.EQ("Day", day), Query.EQ("itemBatch", itemCode)), Update.Set("Quntity", itemInfo.Quntity), UpdateFlags.None);
}
else
{
itemInfo = new InAndOutitem
{
Type = "出库",
itemBatch = itemCode,
Day = day,
Quntity = 1,
};
MongoDBSingleton.Instance.Insert(itemInfo);
}
}
}
}
if (mst.CN_S_BUSS_TYPE == "3楼打包下线")
{
var connInfo = MongoDBSingleton.Instance.FindOne(Query.EQ("Bit", mst.CN_S_END_BIT), "ConnectingBits");
if (connInfo != null)
{
CMMLog.Info($"connInfo:{connInfo.timeCuo}");
var time = MongoDBSingleton.Instance.FindOne(Query.EQ("timeStamp", int.Parse(connInfo.timeCuo)), "TimeCuoInfoCom");
//var db = new SqlHelper