111
lss
2 天以前 9ddec4808631025d36d3c5a816d55ef77a29d4c7
HH.WCS.Mobox3/HH.WCS.Mobox3.JiaTong/process/TaskProcess.cs
@@ -1,17 +1,25 @@
using HH.WCS.JiaTong.api;
using HH.WCS.JiaTong.core;
using HH.WCS.JiaTong.device;
using HH.WCS.JiaTong.dispatch;
using HH.WCS.JiaTong.LISTA.models;
using HH.WCS.JiaTong.LISTA.process;
using HH.WCS.JiaTong.util;
using HH.WCS.JiaTong.wms;
using Microsoft.Owin.BuilderProperties;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using SqlSugar;
using System;
using System.Collections.Generic;
using System.Diagnostics.Eventing.Reader;
using System.IdentityModel.Protocols.WSTrust;
using System.Linq;
using System.Net.NetworkInformation;
using System.Security.Cryptography;
using System.Threading;
using System.Threading.Tasks;
using static HH.WCS.JiaTong.api.ApiModel;
using static HH.WCS.JiaTong.LISTA.process.HttpModel;
namespace HH.WCS.JiaTong.process
@@ -30,15 +38,33 @@
            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());
                //Console.WriteLine($"任务{mst.S_CODE} 货位{mst.S_START_LOC}取货完成,起点解绑容器{mst.S_CNTR_CODE}");
                if (!string.IsNullOrEmpty(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());
                }
                else
                {
                    LogHelper.Info($"任务{mst.S_CODE} 托盘为空 ,只解锁货位");
                    LocationHelper.UnlockLocDeleteCntrs(mst.S_START_LOC);
                }
            }
            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());
                // Console.WriteLine($"任务{mst.S_CODE} 货位{mst.S_END_LOC}卸货完成,终点绑定容器{mst.S_CNTR_CODE}");
                if (!string.IsNullOrEmpty(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());
                }
                else
                {
                    LogHelper.Info($"任务{mst.S_CODE} 托盘为空 ,只解锁货位");
                    LocationHelper.UnlockLoc(mst.S_END_LOC);
                }
            }
        }
@@ -54,44 +80,82 @@
            {
                //根据客户现场要求,如果取货完成任务失败人工拉到终点,我们就当卸货完成处理;如果是人工拉走到其它区域,我们就解锁终点,删除托盘。
                //终点绑定
                //物料到位通知
                if (mst.S_TYPE == "出平库" || mst.S_TYPE == "余料返回")
                {
                    string urlitem = Settings.tableUrls.Find(a => a.id == 5).url;
                    TaskProcess.MESIteminfoback(mst, urlitem);
                }
                if ((mst.S_NOTE == "出库" || mst.S_NOTE == "异常库区入库") && !string.IsNullOrEmpty(mst.S_MES_NO))
                {
                    string urlitem = Settings.tableUrls.Find(a => a.id == 5).url;
                    TaskProcess.MESIteminfoback(mst, urlitem);
                }
                CacheBitUpdate(mst, false);
                LocationHelper.UnLockLoc(mst.S_END_LOC);
            }
            else
            {
                //起点终点解锁
                LocationHelper.UnLockLoc(mst.S_START_LOC);
                LocationHelper.UnLockLoc(mst.S_END_LOC);
            }
        }
        /// <summary>
        /// 安全请求
        /// </summary>
        /// <param name="no"></param>
        /// <param name="state"></param>
        /// <param name="forkliftNo"></param>
        /// <param name="extData"></param>
        internal static void OperateReq(string no, int state, string url, string forkliftNo, string extData, int Z_type)
        /// <param name="model">请求参数</param>
        /// <param name="url">地址</param>
        /// <param name="TN_Task">任务</param>
        internal static void OperateReq(AgvTaskState model, string url, WCSTask TN_Task, string name)
        {
            try
            {
                LogHelper.Info($"-------开始安全请求------");
                var TN_Task = WCSHelper.GetTask(no);
                if (TN_Task != null)
                {
                    int type = 0;
                    string loc = "";
                    if (state == 1101)
                    if (model.state == 1101)
                    {
                        //请求取货,
                        type = 1;
                        loc = TN_Task.S_START_LOC;
                        if (Z_type == 4)
                        if (TN_Task.S_TYPE.Contains("电梯2"))
                        {
                            var device = Settings.deviceInfos.Where(a => a.TN_Location == TN_Task.S_START_LOC).FirstOrDefault();
                            var EndLoc = LocationHelper.GetLocByLoc(TN_Task.S_END_LOC);
                            if (device == null)
                            {
                                LogHelper.Info($"根据任务起点:{TN_Task.S_START_LOC},未找到对应电梯配置文件");
                            }
                            if (EndLoc == null)
                            {
                                LogHelper.Info($"根据任务终点:{TN_Task.S_END_LOC},未找到对应货位");
                            }
                            var value = ModbusHelper.ReadHoldingRegisters(40005, 1, device.address, 1024);
                            var value2 = ModbusHelper.ReadHoldingRegisters(40101, 1, device.address, 1024);
                            if (value[0] == EndLoc.N_LAYER && value2[0] == 2)
                            {
                                NDCApi.ChangeOrderParam(TN_Task.S_CODE.Trim(), 6, "1");
                            }
                            else
                            {
                                int layerValue = 0;
                                if (EndLoc.N_LAYER == 1) layerValue = 1;
                                else if (EndLoc.N_LAYER == 2) layerValue = 3;
                                else if (EndLoc.N_LAYER == 3) layerValue = 5;
                                ModbusHelper.WriteSingleRegister(40089, layerValue, device.address, 1024);
                                ModbusHelper.WriteSingleRegister(40101, 2, device.address, 1024);
                                ModbusHelper.WriteSingleRegister(40003, 2, device.address, 1024);
                                ModbusHelper.WriteSingleRegister(40102, 1, device.address, 1024);
                            }
                        }
                        else if (TN_Task.Z_TYPE == 4)//原材料库国自安全交互
                        {
                            if (GZOperateReqByPost(url, TN_Task.S_EQ_NO, loc, type))
                            {
@@ -101,19 +165,52 @@
                        }
                        else
                        {
                            if (OperateReqByPost(url, TN_Task.S_EQ_NO, TN_Task.S_CODE, loc, type, state))
                            //井松叠盘机安全交互
                            if (TN_Task.S_NOTE == "空托回库")
                            {
                                // NDCHelper.ChangeParam(TN_Task.S_CODE.Trim(), 1101, 18);
                                NDCApi.ChangeOrderParam(TN_Task.S_CODE.Trim(), 6, "1");
                                var Device = Settings.deviceInfos.Where(a => a.TN_Location == TN_Task.S_START_LOC).FirstOrDefault();
                                if (Device != null)
                                {
                                    if (S7Helper.WriteDpj(Device.address, 1002, 1))
                                    {
                                        int value = S7Helper.ReadDpj(Device.address, 2004, S7.Net.VarType.Byte);
                                        if (value == 1)
                                        {
                                            NDCApi.ChangeOrderParam(TN_Task.S_CODE.Trim(), 6, "1");
                                        }
                                        else
                                        {
                                            LogHelper.Info("叠盘机安全交互失败,读取VB2004的值为{2004}");
                                        }
                                    }
                                    else
                                    {
                                        LogHelper.Info("叠盘机安全交互失败,写入VB1002值1失败");
                                    }
                                }
                                else
                                {
                                    LogHelper.Info($"叠盘机安全交互失败,根据任务起点{TN_Task.S_START_LOC},未找到叠盘机配置文件");
                                }
                            }
                            else
                            {
                                if (OperateReqByPost(url, TN_Task.S_EQ_NO, TN_Task.S_CODE, loc, type, model.state, name))
                                {
                                    // NDCHelper.ChangeParam(TN_Task.S_CODE.Trim(), 1101, 18);
                                    NDCApi.ChangeOrderParam(TN_Task.S_CODE.Trim(), 6, "1");
                                }
                            }
                        }
                    }
                    if (state == 1102)
                    if (model.state == 1102)
                    {
                        type = 3;
                        if (Z_type == 4)
                        if (TN_Task.Z_TYPE == 4)//原材料库国自安全交互
                        {
                            loc = TN_Task.S_START_LOC;
                            if (GZOperateReqByPost(url, TN_Task.S_EQ_NO, loc, type))
@@ -121,15 +218,79 @@
                                //NDCHelper.ChangeParam(TN_Task.S_CODE.Trim(), 1101, 18);
                            }
                        }
                        if (TN_Task.S_NOTE == "空托回库")
                        {
                            var Device = Settings.deviceInfos.Where(a => a.TN_Location == TN_Task.S_START_LOC).FirstOrDefault();
                            if (Device != null)
                            {
                                //写入失败重新写入
                                if (!S7Helper.WriteDpj(Device.address, 1001, 1))
                                {
                                    Task.Run(() =>
                                    {
                                        while (!S7Helper.WriteDpj(Device.address, 1001, 1))
                                        {
                                            Thread.Sleep(1000);
                                        }
                                    });
                                }
                                if (!S7Helper.WriteDpj(Device.address, 1002, 0))
                                {
                                    Task.Run(() =>
                                    {
                                        while (!S7Helper.WriteDpj(Device.address, 1002, 0))
                                        {
                                            Thread.Sleep(1000);
                                        }
                                    });
                                }
                            }
                            else
                            {
                                LogHelper.Info($"叠盘机安全交互失败,根据任务起点{TN_Task.S_START_LOC},未找到叠盘机配置文件");
                            }
                        }
                    }
                    if (state == 1103)
                    if (model.state == 1103)
                    {
                        //请求卸货
                        type = 2;
                        loc = TN_Task.S_END_LOC;
                        if (Z_type == 4)
                        if (TN_Task.S_TYPE.Contains("电梯1"))
                        {
                            loc = TN_Task.S_END_LOC;
                            var device = Settings.deviceInfos.Where(a => a.TN_Location == TN_Task.S_END_LOC).FirstOrDefault();
                            var startloc = LocationHelper.GetLocByLoc(TN_Task.S_START_LOC);
                            if (device == null)
                            {
                                LogHelper.Info($"根据任务终点:{TN_Task.S_END_LOC},未找到对应电梯配置文件");
                            }
                            if (startloc == null)
                            {
                                LogHelper.Info($"根据任务起点:{TN_Task.S_START_LOC},未找到对应货位");
                            }
                            var value = ModbusHelper.ReadHoldingRegisters(40005, 1, device.address, 1024);
                            var value2 = ModbusHelper.ReadHoldingRegisters(40101, 1, device.address, 1024);
                            if (value[0] == startloc.N_LAYER && value2[0] == 2)
                            {
                                NDCApi.ChangeOrderParam(TN_Task.S_CODE.Trim(), 6, "1");
                            }
                            else
                            {
                                int layerValue = 0;
                                if (startloc.N_LAYER == 1) layerValue = 1;
                                else if (startloc.N_LAYER == 2) layerValue = 3;
                                else if (startloc.N_LAYER == 3) layerValue = 5;
                                ModbusHelper.WriteSingleRegister(40101, 2, device.address, 1024);
                                ModbusHelper.WriteSingleRegister(40003, 2, device.address, 1024);
                                ModbusHelper.WriteSingleRegister(40089, layerValue, device.address, 1024);
                                ModbusHelper.WriteSingleRegister(40102, 1, device.address, 1024);
                            }
                        }
                        else if (TN_Task.Z_TYPE == 4)//原材料库国自安全交互
                        {
                            // loc = TN_Task.S_END_LOC;
                            if (GZOperateReqByPost(url, TN_Task.S_EQ_NO, loc, type))
                            {
                                // NDCHelper.ChangeParam(TN_Task.S_CODE.Trim(), 1103, 18);
@@ -138,18 +299,47 @@
                        }
                        else
                        {
                            if (OperateReqByPost(url, TN_Task.S_EQ_NO, TN_Task.S_CODE, loc, type, state))
                            if (OperateReqByPost(url, TN_Task.S_EQ_NO, TN_Task.S_CODE, loc, type, model.state, name))
                            {
                                NDCApi.ChangeOrderParam(TN_Task.S_CODE.Trim(), 6, "1");
                            }
                        }
                    }
                    if (state == 1104)
                    if (model.state == 1104)
                    {
                        type = 4;
                        if (Z_type == 4)
                        if (TN_Task.S_TYPE.Contains("电梯1"))
                        {
                            var db = new SqlHelper<object>().GetInstance();
                            var device = Settings.deviceInfos.Where(a => a.TN_Location == TN_Task.S_END_LOC).FirstOrDefault();
                            var mstbyEqno = db.Queryable<WCSTask>().Where(a => a.S_EQ_NO == TN_Task.S_EQ_NO && a.S_TYPE.Contains("电梯2")).First();
                            if (mstbyEqno != null)
                            {
                                var Endloc = LocationHelper.GetLocByLoc(mstbyEqno.S_END_LOC);
                                // var startloc = LocationHelper.GetLocByLoc(TN_Task.S_START_LOC);
                                if (device == null)
                                {
                                    LogHelper.Info($"根据任务终点:{TN_Task.S_END_LOC},未找到对应电梯配置文件");
                                }
                                if (Endloc == null)
                                {
                                    LogHelper.Info($"根据任务终点:{mstbyEqno.S_END_LOC},未找到对应货位");
                                }
                                int value = 0;
                                if (Endloc.N_LAYER == 1) value = 1;
                                else if (Endloc.N_LAYER == 2) value = 3;
                                else if (Endloc.N_LAYER == 3) value = 5;
                                ModbusHelper.WriteSingleRegister(40089, value, device.address, 1024);
                                ModbusHelper.WriteSingleRegister(40102, 1, device.address, 1024);
                            }
                            else
                            {
                                LogHelper.Info($"根据任务来源:{TN_Task.S_EQ_NO},未找到电梯2任务");
                            }
                        }
                        else if (TN_Task.Z_TYPE == 4)//原材料库国自安全交互
                        {
                            loc = TN_Task.S_END_LOC;
                            if (GZOperateReqByPost(url, TN_Task.S_EQ_NO, loc, type))
@@ -159,14 +349,10 @@
                        }
                    }
                }
                else
                {
                    LogHelper.Info($"安全请求==》根据任务号{no}未找到对应任务");
                }
            }
            catch (Exception ex)
            {
                LogHelper.Info($"OperateReq Error ==》{ex.ToString()}");
            }
@@ -183,7 +369,7 @@
        /// <param name="type"></param>
        /// <param name="taskStatus"></param>
        /// <returns></returns>
        internal static bool OperateReqByPost(string url, string tasknum, string ordernum, string station, int type, int taskStatus)
        internal static bool OperateReqByPost(string url, string tasknum, string ordernum, string station, int type, int taskStatus, string name)
        {
            bool permit = false;
            try
@@ -206,7 +392,9 @@
                else
                {
                    LogHelper.Info($"安全请求失败=>msg:{result.msg}");
                    ApiHelper.AddErrorInfo("安全交互失败", result.msg, "", tasknum);
                }
                ApiHelper.AddInfo(name, "安全请求", date, JsonConvert.SerializeObject(result), "Post", url);
                return permit;
            }
            catch (Exception)
@@ -255,7 +443,9 @@
                else
                {
                    LogHelper.Info($"安全请求失败=>msg:{result.err_msg}");
                    ApiHelper.AddErrorInfo("安全交互失败", result.err_msg, "", no);
                }
                ApiHelper.AddInfo("YCL", "安全请求", date, JsonConvert.SerializeObject(result), "Post", url);
                return permit;
            }
            catch (Exception)
@@ -276,6 +466,14 @@
        {
            var result = true;
            var db = new SqlHelper<object>().GetInstance();
            //根据起点仓库编码判断是否可以推送
            var taskLimit = db.Queryable<TASK_LIMIT>().Where(a => a.S_WH_CODE == mst.S_START_WH && a.OPEN == "1").First();
            if (taskLimit != null)
            {
                Console.WriteLine($"任务:{mst.S_CODE},起点仓库:{mst.S_START_WH}已经禁用推送");
                return false;
            }
            var mstbyEqno = db.Queryable<WCSTask>().Where(a => a.S_EQ_NO == mst.S_EQ_NO).ToList();
            if (mstbyEqno.Count() == 1)
            {
@@ -301,12 +499,16 @@
                else if (mst.S_TYPE == "电梯2")
                {
                    var mst2 = mstbyEqno.Where(a => a.S_TYPE == "电梯1").First();
                    if (mst2.S_B_STATE == "卸货完成" || mst2.S_B_STATE == "完成")
                    if (mst2 == null)
                    {
                        return result;
                    }
                    else
                    {
                        if (mst2.S_B_STATE == "卸货完成" || mst2.S_B_STATE == "完成")
                        {
                            return result;
                        }
                        result = false;
                    }
                }
@@ -361,145 +563,7 @@
        }
        private static object locLocker = new object();
        /// <summary>
        /// 堆叠库区出入库任务申请
        /// </summary>
        /// <param name="ls"></param>
        /// <param name="cntrs"></param>
        /// <param name="area"></param>
        /// <param name="itemCode"></param>
        /// <param name="itemBatch"></param>
        /// <param name="taskType"></param>
        /// <param name="insStock"></param>
        /// <returns></returns>
        internal static bool ApplyTN_Task(Location ls, ref List<string> cntrs, string area, string itemCode, string itemBatch, string taskType, bool insStock = true)
        {
            var result = false;
            lock (locLocker)
            {
                try
                {
                    if (insStock)
                    {
                        Console.WriteLine($"MoboxHelperCreateTask: {area}-{itemCode}-{itemBatch}-{taskType}");
                        var endTN_Location = GetLocation4In(area, itemCode, itemBatch, 3);
                        if (endTN_Location != null)
                        {
                            var endLayer = endTN_Location.N_CURRENT_NUM == 0 ? 1 : 2;
                            var taskNo = DateTime.Now.Ticks.ToString();
                            result = TaskProcess.CreateTransport(ls.S_CODE, endTN_Location.S_CODE, taskType, cntrs, 1, endLayer, 3, 70);
                        }
                        else
                        {
                            Console.WriteLine($"MoboxHelperCreateTask: 未找到终点货位");
                        }
                    }
                    else
                    {
                        var startTN_Location = GetLocation4Out(area, itemCode, itemBatch, 3);
                        if (startTN_Location != null)
                        {
                            var startLayer = startTN_Location.N_CURRENT_NUM <= 3 ? 1 : 2;
                            var taskNo = DateTime.Now.Ticks.ToString();
                            var carryCount = startTN_Location.N_CURRENT_NUM > 3 ? startTN_Location.N_CURRENT_NUM - 3 : startTN_Location.N_CURRENT_NUM;
                            //出库要从起点获取托盘
                            var cntrList = LocationHelper.GetLocCntr(startTN_Location.S_CODE);
                            if (cntrList.Count == startTN_Location.N_CURRENT_NUM)
                            {
                                cntrs = cntrList.OrderByDescending(a => a.T_CREATE).Take(carryCount).Select(a => a.S_CNTR_CODE.Trim()).ToList();
                                result = TaskProcess.CreateTransport(startTN_Location.S_CODE, ls.S_CODE, taskType, cntrs, startLayer, 1, carryCount, 65);
                            }
                            else
                            {
                                Console.WriteLine($"起点托盘数量和货位容器表不符合,请检查【货位表】和【货位容器表】");
                            }
                        }
                    }
                }
                catch (Exception ex)
                {
                    Console.WriteLine("MoboxHelperCreateTask:" + ex.Message);
                    LogHelper.Error("MoboxHelperCreateTask:" + ex.Message, ex);
                }
            }
            return result;
        }
        private static Location GetLocation4Out(string area, string itemCode, string itemBatch, int v)
        {
            throw new NotImplementedException();
        }
        private static Location GetLocation4In(string area, string itemCode, string itemBatch, int v)
        {
            throw new NotImplementedException();
        }
        /// <summary>
        /// 普通货架区的出入库申请
        /// </summary>
        /// <param name="ls"></param>
        /// <param name="cntrs"></param>
        /// <param name="area"></param>
        /// <param name="taskType"></param>
        /// <param name="itemCode"></param>
        /// <param name="insStock"></param>
        /// <returns></returns>
        internal static bool ApplyNormalTN_Task(Location ls, ref List<string> cntrs, string area, string taskType, string itemCode, bool insStock = true)
        {
            var result = false;
            lock (locLocker)
            {
                try
                {
                    if (insStock)
                    {
                        Console.WriteLine($"MoboxHelperCreateTask: {area}-{taskType}");
                        var endTN_Location = new Location();
                        if (endTN_Location != null)
                        {
                            var taskNo = DateTime.Now.Ticks.ToString();
                            result = TaskProcess.CreateTransport(ls.S_CODE, endTN_Location.S_CODE, taskType, cntrs, 70);
                        }
                        else
                        {
                            Console.WriteLine($"MoboxHelperCreateTask: 未找到终点货位");
                        }
                    }
                    else
                    {
                        var startTN_Location = new Location();
                        if (startTN_Location != null)
                        {
                            //出库要从起点获取托盘
                            var cntrList = LocationHelper.GetLocCntr(startTN_Location.S_CODE);
                            if (cntrList.Count == startTN_Location.N_CURRENT_NUM)
                            {
                                result = TaskProcess.CreateTransport(startTN_Location.S_CODE, ls.S_CODE, taskType, new List<string> { cntrList[0].S_CNTR_CODE }, 65);
                            }
                            else
                            {
                                Console.WriteLine($"起点托盘数量和货位容器表不符合,请检查【货位表】和【货位容器表】");
                            }
                        }
                    }
                }
                catch (Exception ex)
                {
                    Console.WriteLine("MoboxHelperCreateTask:" + ex.Message);
                    LogHelper.Error("MoboxHelperCreateTask:" + ex.Message, ex);
                }
            }
            return result;
        }
        /// <summary>
        /// 推送任务
        /// </summary>
@@ -507,14 +571,22 @@
        internal static bool SendTask(WCSTask mst)
        {
            var db = new SqlHelper<object>().GetInstance();
            var result = false;
            var start = "0"; var end = "0";
            var taskType = mst.S_TYPE.Trim();
            var list = db.Queryable<Location>().ToList().Count;
            // if (mst.N_B_STATE == 0) {
            if (mst.N_SCHEDULE_TYPE == 1)
            {
                LogHelper.Info($"任务推送数据:{JsonConvert.SerializeObject(mst)}");
                if (string.IsNullOrEmpty(mst.S_START_LOC) || string.IsNullOrEmpty(mst.S_END_LOC))
                {
                    LogHelper.Info($"任务{mst.S_CODE},起点终点有空参数,不推送任务");
                }
                start = LocationHelper.GetAgvSite(mst.S_START_LOC);
                end = LocationHelper.GetAgvSite(mst.S_END_LOC);
                //if (mst.N_START_LAYER > 1)
@@ -554,6 +626,28 @@
                    WCSHelper.UpdateStatus(mst);//更新任务状态
                    result = true;
                    LogHelper.Info($"NDC推送任务成功 {mst.S_CODE}start= {mst.S_START_LOC} + end = {mst.S_END_LOC}");
                    if (mst.S_TYPE.Contains("电梯1"))
                    {
                        var device = Settings.deviceInfos.Where(a => a.TN_Location == mst.S_END_LOC).FirstOrDefault();
                        var loc = LocationHelper.GetLocByLoc(mst.S_START_LOC);
                        if (device == null)
                        {
                            LogHelper.Info($"根据任务终点:{mst.S_END_LOC},未找到对应电梯配置文件");
                        }
                        if (loc == null)
                        {
                            LogHelper.Info($"根据任务起点:{mst.S_START_LOC},未找到对应货位");
                        }
                        int value = 0;
                        if (loc.N_LAYER == 1) value = 1;
                        else if (loc.N_LAYER == 2) value = 3;
                        else if (loc.N_LAYER == 3) value = 5;
                        ModbusHelper.WriteSingleRegister(40089, value, device.address, 1024);
                        ModbusHelper.WriteSingleRegister(40102, 1, device.address, 1024);
                    }
                }
                else
                {
@@ -590,7 +684,22 @@
            //  }
            return result;
        }
        /// <summary>
        /// 空托等待任务 超时5分组直接推送
        /// </summary>
        /// <param name="mst"></param>
        /// <returns></returns>
        internal static void WaitSend(WCSTask mst)
        {
            // 计算与当前时间的差值
            TimeSpan timeDifference = DateTime.Now - mst.T_CREATE;
            if (timeDifference.TotalMinutes > 5)
            {
                var db = new SqlHelper<WCSTask>().GetInstance();
                mst.S_B_STATE = "等待";
                db.Updateable(mst).UpdateColumns(it => new { it.S_B_STATE }).ExecuteCommand();
            }
        }
        /// <summary>
        /// 任务状态回报
        /// </summary>
@@ -598,7 +707,7 @@
        /// <param name="orderNum">单号</param>
        /// <param name="taskStatus">任务状态</param>
        /// <param name="url">上报接口</param>
        public static void Reportback(string taskNum, string orderNum, int taskStatus, string url)
        public static void Reportback(string taskNum, string orderNum, int taskStatus, string url, string ly)
        {
            LogHelper.Info($"------------开始任务回报-----------");
            try
@@ -628,6 +737,7 @@
                {
                    LogHelper.Info($"任务回报失败=>msg:{result.msg}");
                }
                ApiHelper.AddInfo(ly, "任务状态回报", date, JsonConvert.SerializeObject(result), "Post", url);
            }
            catch (Exception ex)
            {
@@ -681,6 +791,7 @@
                {
                    LogHelper.Info($"任务回报失败=");
                }
                ApiHelper.AddInfo("Wms", "任务状态回报", date, JsonConvert.SerializeObject(result), "Post", url);
            }
            catch (Exception ex)
            {
@@ -726,6 +837,7 @@
                {
                    LogHelper.Info($"任务回报失败=>msg:{result.err_msg}");
                }
                ApiHelper.AddInfo("YCL", "任务状态回报", date, JsonConvert.SerializeObject(result), "Post", url);
            }
            catch (Exception ex)
            {
@@ -750,7 +862,29 @@
                //获取时间戳
                var time = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds();
                statusarrive.RequestId = "杭叉AGV" + time;
                string info = "";
                switch (status)
                {
                    case 1:
                        info = "agv已接受原料库下发的任务";
                        break;
                    case 4:
                        info = "agv已取货完成";
                        break;
                    case 6:
                        info = "agv已卸货到指定位置";
                        break;
                    case 2:
                        info = "agv已完成送料任务";
                        break;
                }
                string message = "1";
                if (status == 7) { message = "agv任务已取消"; }
                int flag = 0;
                if (mst.S_NOTE == "粉料")
                {
                    flag = 1;
                }
                //List<StatusArrive> statusArrives = new List<StatusArrive>();
                StatusArrive statusArrive = new StatusArrive();
                statusarrive.UseToken = "iFQ5fExGrLYLXliHYWzs";
@@ -758,6 +892,11 @@
                statusArrive.LocationNum = mst.S_END_LOC;
                statusArrive.Time = DateTime.Now.ToString();
                statusArrive.Status = status.ToString();
                statusArrive.Rfid = mst.S_CNTR_CODE;
                statusArrive.Flag = flag;
                statusArrive.Info = info;
                statusArrive.Message = message;
                //statusArrives.Add(statusArrive);
                statusarrive.data = statusArrive;
                //开始回报
@@ -777,6 +916,7 @@
                {
                    LogHelper.Info($"任务回报失败=>msg:{result.imsg}");
                }
                ApiHelper.AddInfo("Mes", "任务状态回报", date, JsonConvert.SerializeObject(result), "Post", url);
            }
            catch (Exception ex)
            {
@@ -789,9 +929,8 @@
        /// <summary>
        /// mes物料到位同步
        /// </summary>
        /// <param name="taskNum"></param>
        /// <param name="orderNum"></param>
        /// <param name="taskStatus"></param>
        /// <param name="mst">任务</param>
        /// <param name="url">地址</param>
        public static void MESIteminfoback(WCSTask mst, string url)
        {
            LogHelper.Info($"------------开始物料信息回报-----------");
@@ -799,37 +938,80 @@
            {
                var cntritem = ContainerHelper.GetCntrItemRel(mst.S_CNTR_CODE).FirstOrDefault();
                //回报数据
                Request<iteminfoArrive> statusarrive = new Request<iteminfoArrive>();
                List<LotListh> lotLists = new List<LotListh>();
                string TaskNumber = mst.S_EQ_NO;
                if (!string.IsNullOrEmpty(mst.S_WMS_NO))
                Request<MesItemBackModel> request = new Request<MesItemBackModel>();
                List<MesItemBackInfoModel> list = new List<MesItemBackInfoModel>();
                string MesNo = mst.S_EQ_NO;
                if (!string.IsNullOrEmpty(mst.S_MES_NO))
                {
                    TaskNumber = mst.S_WMS_NO;
                    MesNo = mst.S_MES_NO;
                }
                //粉料回库不需要回报
                if (cntritem != null && mst.S_TYPE == "余料返回" && cntritem.S_ITEM_CODE.StartsWith("4X"))
                {
                    LogHelper.Info("粉料回库不需要到位发送物料到位");
                    return;
                }
                //获取时间戳
                var time = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds();
                //物料到位接口和状态反馈同时调IIOT,为了区分id,物料到位长度加一区分
                statusarrive.RequestId = "杭叉AGV" + time + "1";
                statusarrive.UseToken = "iFQ5fExGrLYLXliHYWzs";
                request.RequestId = "杭叉AGV" + time + "1";
                request.UseToken = "iFQ5fExGrLYLXliHYWzs";
                iteminfoArrive iteminfoArrive = new iteminfoArrive();
                iteminfoArrive.TaskNumber = TaskNumber;
                iteminfoArrive.LocationNum = mst.S_END_LOC;
                iteminfoArrive.Rfid = mst.S_CNTR_CODE;
                iteminfoArrive.ArricalTime = DateTime.Now.ToString("yyyy-MM-dd");
                MesItemBackModel mesItemBackModel = new MesItemBackModel();
                mesItemBackModel.TaskNumber = MesNo;
                mesItemBackModel.WmsTaskNumber = mst.S_WMS_NO;
                mesItemBackModel.Rfid = mst.S_CNTR_CODE;
                mesItemBackModel.LocationNum = mst.S_END_LOC;
                mesItemBackModel.Result = "1";
                mesItemBackModel.ArricalTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff");
                if (cntritem != null)
                {
                    lotLists.Add(new LotListh() { LotNumber = cntritem.S_BATCH_NO, Weight = double.Parse(cntritem.F_WEIGHT) });
                    iteminfoArrive.PartDesc = cntritem.S_ITEM_NAME;
                    iteminfoArrive.PartNumber = cntritem.S_ITEM_CODE;
                    string curBagNum = null;
                    string weightBag = null;
                    string initBagNum = null;
                    if ((int)cntritem.F_QTY > 0)
                    {
                        curBagNum = cntritem.F_QTY.ToString();
                    }
                    if (!string.IsNullOrEmpty(cntritem.F_WEIGHT1) && int.Parse(cntritem.F_WEIGHT1) > 0)
                    {
                        weightBag = cntritem.F_WEIGHT1;
                    }
                    if (!string.IsNullOrEmpty(cntritem.F_QTY1) && int.Parse(cntritem.F_QTY1) > 0)
                    {
                        initBagNum = cntritem.F_QTY1;
                    }
                    list.Add(new MesItemBackInfoModel()
                    {
                        LotNumber = cntritem.S_BATCH_NO,
                        PartNumber = cntritem.S_ITEM_CODE,
                        Subpool = cntritem.Subpool,
                        ReceiveLot = cntritem.ReceiveLot,
                        Supplier = cntritem.S_SUPPLIER_NO,
                        TyreType = cntritem.TyreType,
                        ProduceTime = cntritem.D_PRD_DATE,
                        Rfid = cntritem.S_CNTR_CODE,
                        Qty = cntritem.F_WEIGHT,
                        PartLevel = cntritem.LEV,
                        WmsLot = cntritem.WmsLot,
                        WeightBag = weightBag,
                        CurBagNum = curBagNum,
                        InitBagNum = initBagNum
                    });
                }
                iteminfoArrive.LotList = lotLists;
                statusarrive.data = iteminfoArrive;
                mesItemBackModel.List = list;
                request.data = mesItemBackModel;
                //任务上报
                HttpHelper httpHelper = new HttpHelper();
                MesResult result = new MesResult();
                string date = JsonConvert.SerializeObject(statusarrive);
                string date = JsonConvert.SerializeObject(request);
                LogHelper.Info($"物料到位回报:地址:{url},内容:{date}");
                var r = httpHelper.MesWebPost(url, date);
@@ -843,6 +1025,7 @@
                {
                    LogHelper.Info($"物料到位回报失败=>msg:{result.imsg}");
                }
                ApiHelper.AddInfo("Mes", "物料到位回报", date, JsonConvert.SerializeObject(result), "Post", url);
            }
            catch (Exception ex)
            {
@@ -851,6 +1034,8 @@
            }
        }
        /// <summary>
        /// 创建搬运任务
        /// </summary>
@@ -902,8 +1087,5 @@
            return result;
        }
        #endregion
    }
}