lss
2025-07-03 7afc439ba32e234ebc455c98fa084ae6eef8a621
HH.WCS.Mobox3/HH.WCS.Mobox3.JiaTong/process/TaskProcess.cs
@@ -2,10 +2,13 @@
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;
@@ -14,6 +17,7 @@
using System.Linq;
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;
@@ -43,7 +47,7 @@
                else
                {
                    LogHelper.Info($"任务{mst.S_CODE} 托盘为空 ,只解锁货位");
                    LocationHelper.UnlockLoc(mst.S_START_LOC);
                    LocationHelper.UnlockLocDeleteCntrs(mst.S_START_LOC);
                }
            }
            else
@@ -52,7 +56,7 @@
                if (!string.IsNullOrEmpty(mst.S_CNTR_CODE))
                {
                    LogHelper.Info($"任务{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());
                }
                else
@@ -80,13 +84,10 @@
            }
            else
            {
                //起点终点解锁
                LocationHelper.UnLockLoc(mst.S_START_LOC);
                LocationHelper.UnLockLoc(mst.S_END_LOC);
            }
        }
        /// <summary>
@@ -111,7 +112,38 @@
                        //请求取货,
                        type = 1;
                        loc = TN_Task.S_START_LOC;
                        if (TN_Task.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))
                            {
@@ -180,13 +212,25 @@
                            if (Device != null)
                            {
                                //写入失败重新写入
                                while (!S7Helper.WriteDpj(Device.address, 1001, 1))
                                if (!S7Helper.WriteDpj(Device.address, 1001, 1))
                                {
                                    Thread.Sleep(1000);
                                    Task.Run(() =>
                                    {
                                        while (!S7Helper.WriteDpj(Device.address, 1001, 1))
                                        {
                                            Thread.Sleep(1000);
                                        }
                                    });
                                }
                                while (!S7Helper.WriteDpj(Device.address, 1002, 0))
                                if (!S7Helper.WriteDpj(Device.address, 1002, 0))
                                {
                                    Thread.Sleep(1000);
                                    Task.Run(() =>
                                    {
                                        while (!S7Helper.WriteDpj(Device.address, 1002, 0))
                                        {
                                            Thread.Sleep(1000);
                                        }
                                    });
                                }
                            }
                            else
@@ -200,9 +244,41 @@
                        //请求卸货
                        type = 2;
                        loc = TN_Task.S_END_LOC;
                        if (TN_Task.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);
@@ -220,7 +296,38 @@
                    if (model.state == 1104)
                    {
                        type = 4;
                        if (TN_Task.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))
@@ -346,6 +453,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)
            {
@@ -371,12 +486,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;
                    }
                }
@@ -431,145 +550,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>
@@ -577,14 +558,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)
@@ -624,6 +613,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
                {
@@ -820,7 +831,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";
@@ -828,6 +861,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;
                //开始回报
@@ -875,6 +913,11 @@
                {
                    MesNo = mst.S_MES_NO;
                }
                //粉料回库不需要回报
                if (cntritem != null && mst.S_TYPE == "余料返回" && cntritem.S_ITEM_CODE.StartsWith("4X"))
                {
                    return;
                }
                //获取时间戳
                var time = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds();
                //物料到位接口和状态反馈同时调IIOT,为了区分id,物料到位长度加一区分
@@ -888,11 +931,23 @@
                mesItemBackModel.Rfid = mst.S_CNTR_CODE;
                mesItemBackModel.LocationNum = mst.S_END_LOC;
                mesItemBackModel.Result = "1";
                mesItemBackModel.ArricalTime = DateTime.Now.ToString("yyyy-MM-dd");
                mesItemBackModel.ArricalTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff");
                if (cntritem != null)
                {
                    string curBagNum = null;
                    string weightBag = null;
                    if (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;
                    }
                    list.Add(new MesItemBackInfoModel()
                    {
                        LotNumber = cntritem.S_BATCH_NO,
                        PartNumber = cntritem.S_ITEM_CODE,
                        Subpool = cntritem.Subpool,
@@ -903,11 +958,15 @@
                        Rfid = cntritem.S_CNTR_CODE,
                        Qty = cntritem.F_WEIGHT,
                        PartLevel = cntritem.LEV,
                        WmsLot = cntritem.WmsLot
                        WmsLot = cntritem.WmsLot,
                        WeightBag = weightBag,
                        CurBagNum = curBagNum,
                        InitBagNum = cntritem.F_QTY1
                    });
                }
                mesItemBackModel.List = list;
                request.data = mesItemBackModel;