111
lss
6 天以前 79db8fda0f71b65dfe1e1c72f307b29efc565126
HH.WCS.Mobox3/HH.WCS.Mobox3.JiaTong/process/TaskProcess.cs
@@ -15,6 +15,7 @@
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;
@@ -47,7 +48,7 @@
                else
                {
                    LogHelper.Info($"任务{mst.S_CODE} 托盘为空 ,只解锁货位");
                    LocationHelper.UnlockLoc(mst.S_START_LOC);
                    LocationHelper.UnlockLocDeleteCntrs(mst.S_START_LOC);
                }
            }
            else
@@ -79,18 +80,26 @@
            {
                //根据客户现场要求,如果取货完成任务失败人工拉到终点,我们就当卸货完成处理;如果是人工拉走到其它区域,我们就解锁终点,删除托盘。
                //终点绑定
                //物料到位通知
                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>
@@ -99,7 +108,7 @@
        /// <param name="model">请求参数</param>
        /// <param name="url">地址</param>
        /// <param name="TN_Task">任务</param>
        internal static void OperateReq(AgvTaskState model, string url, WCSTask TN_Task)
        internal static void OperateReq(AgvTaskState model, string url, WCSTask TN_Task, string name)
        {
            try
            {
@@ -159,6 +168,7 @@
                            //井松叠盘机安全交互
                            if (TN_Task.S_NOTE == "空托回库")
                            {
                                LogHelper.Info($"-------叠盘机安全请求------");
                                var Device = Settings.deviceInfos.Where(a => a.TN_Location == TN_Task.S_START_LOC).FirstOrDefault();
                                if (Device != null)
                                {
@@ -187,7 +197,7 @@
                            }
                            else
                            {
                                if (OperateReqByPost(url, TN_Task.S_EQ_NO, TN_Task.S_CODE, loc, type, model.state))
                                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");
@@ -211,9 +221,20 @@
                        }
                        if (TN_Task.S_NOTE == "空托回库")
                        {
                            LogHelper.Info($"-------叠盘机安全请求------");
                            var Device = Settings.deviceInfos.Where(a => a.TN_Location == TN_Task.S_START_LOC).FirstOrDefault();
                            if (Device != null)
                            {
                                if (!S7Helper.WriteDpj(Device.address, 1002, 0))
                                {
                                    Task.Run(() =>
                                    {
                                        while (!S7Helper.WriteDpj(Device.address, 1002, 0))
                                        {
                                            Thread.Sleep(1000);
                                        }
                                    });
                                }
                                //写入失败重新写入
                                if (!S7Helper.WriteDpj(Device.address, 1001, 1))
                                {
@@ -225,16 +246,7 @@
                                        }
                                    });
                                }
                                if (!S7Helper.WriteDpj(Device.address, 1002, 0))
                                {
                                    Task.Run(() =>
                                    {
                                        while (!S7Helper.WriteDpj(Device.address, 1002, 0))
                                        {
                                            Thread.Sleep(1000);
                                        }
                                    });
                                }
                            }
                            else
                            {
@@ -290,7 +302,7 @@
                        }
                        else
                        {
                            if (OperateReqByPost(url, TN_Task.S_EQ_NO, TN_Task.S_CODE, loc, type, model.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");
                            }
@@ -344,7 +356,6 @@
            }
            catch (Exception ex)
            {
                LogHelper.Info($"OperateReq Error ==》{ex.ToString()}");
            }
@@ -361,7 +372,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
@@ -386,6 +397,7 @@
                    LogHelper.Info($"安全请求失败=>msg:{result.msg}");
                    ApiHelper.AddErrorInfo("安全交互失败", result.msg, "", tasknum);
                }
                ApiHelper.AddInfo(name, "安全请求", date, JsonConvert.SerializeObject(result), "Post", url);
                return permit;
            }
            catch (Exception)
@@ -436,6 +448,7 @@
                    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)
@@ -461,7 +474,18 @@
            if (taskLimit != null)
            {
                Console.WriteLine($"任务:{mst.S_CODE},起点仓库:{mst.S_START_WH}已经禁用推送");
                return result;
                return false;
            }
            var sendTask = db.Queryable<SendTask>().Where(a => a.AREA_CODE == mst.S_END_AREA && a.able == "1").First();
            if (sendTask != null)
            {
                int taskNumber = WCSHelper.GetTaskByEndArea(sendTask.AREA_CODE, sendTask.loctioncode);
                LogHelper.Info($"任务:{mst.S_CODE},终点仓库:{sendTask.AREA_CODE},货位类型:{sendTask.loctioncode},存在任务数量:{taskNumber},限制任务数量:{sendTask.max}");
                if (taskNumber >= sendTask.max)
                {
                    Console.WriteLine($"任务:{mst.S_CODE},以达到限制推送数量,已经禁用推送");
                    return false;
                }
            }
            var mstbyEqno = db.Queryable<WCSTask>().Where(a => a.S_EQ_NO == mst.S_EQ_NO).ToList();
@@ -490,7 +514,7 @@
                {
                    var mst2 = mstbyEqno.Where(a => a.S_TYPE == "电梯1").First();
                    if (mst2 == null)
                    {
                    {
                        return result;
                    }
                    else
@@ -561,14 +585,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)
@@ -666,7 +698,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>
@@ -674,7 +721,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
@@ -704,6 +751,7 @@
                {
                    LogHelper.Info($"任务回报失败=>msg:{result.msg}");
                }
                ApiHelper.AddInfo(ly, "任务状态回报", date, JsonConvert.SerializeObject(result), "Post", url);
            }
            catch (Exception ex)
            {
@@ -757,6 +805,7 @@
                {
                    LogHelper.Info($"任务回报失败=");
                }
                ApiHelper.AddInfo("Wms", "任务状态回报", date, JsonConvert.SerializeObject(result), "Post", url);
            }
            catch (Exception ex)
            {
@@ -802,6 +851,7 @@
                {
                    LogHelper.Info($"任务回报失败=>msg:{result.err_msg}");
                }
                ApiHelper.AddInfo("YCL", "任务状态回报", date, JsonConvert.SerializeObject(result), "Post", url);
            }
            catch (Exception ex)
            {
@@ -826,21 +876,52 @@
                //获取时间戳
                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 = null;
                if (status == 7) { message = "agv任务已取消"; }
                int flag = 0;
                if (mst.S_NOTE == "粉料")
                {
                    flag = 1;
                }
                string number = mst.S_EQ_NO;
                if (!string.IsNullOrEmpty(mst.S_MES_NO))
                {
                    number = mst.S_MES_NO;
                }
                //List<StatusArrive> statusArrives = new List<StatusArrive>();
                StatusArrive statusArrive = new StatusArrive();
                statusarrive.UseToken = "iFQ5fExGrLYLXliHYWzs";
                statusArrive.TaskNumber = mst.S_EQ_NO;
                statusArrive.LocationNum = mst.S_END_LOC;
                statusArrive.TaskNumber = number;
                if (status == 1 || status == 3 || status == 4)
                {
                    statusArrive.LocationNum = mst.S_START_LOC;
                }
                else
                {
                    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;
@@ -861,6 +942,7 @@
                {
                    LogHelper.Info($"任务回报失败=>msg:{result.imsg}");
                }
                ApiHelper.AddInfo("Mes", "任务状态回报", date, JsonConvert.SerializeObject(result), "Post", url);
            }
            catch (Exception ex)
            {
@@ -892,6 +974,7 @@
                //粉料回库不需要回报
                if (cntritem != null && mst.S_TYPE == "余料返回" && cntritem.S_ITEM_CODE.StartsWith("4X"))
                {
                    LogHelper.Info("粉料回库不需要到位发送物料到位");
                    return;
                }
                //获取时间戳
@@ -899,7 +982,7 @@
                //物料到位接口和状态反馈同时调IIOT,为了区分id,物料到位长度加一区分
                request.RequestId = "杭叉AGV" + time + "1";
                request.UseToken = "iFQ5fExGrLYLXliHYWzs";
                MesItemBackModel mesItemBackModel = new MesItemBackModel();
                mesItemBackModel.TaskNumber = MesNo;
@@ -908,11 +991,27 @@
                mesItemBackModel.LocationNum = mst.S_END_LOC;
                mesItemBackModel.Result = "1";
                mesItemBackModel.ArricalTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff");
                if (cntritem != null)
                {
                    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,
@@ -923,7 +1022,10 @@
                        Rfid = cntritem.S_CNTR_CODE,
                        Qty = cntritem.F_WEIGHT,
                        PartLevel = cntritem.LEV,
                        WmsLot = cntritem.WmsLot
                        WmsLot = cntritem.WmsLot,
                        WeightBag = initBagNum,
                        CurBagNum = curBagNum,
                        InitBagNum = weightBag
                    });
@@ -949,6 +1051,7 @@
                {
                    LogHelper.Info($"物料到位回报失败=>msg:{result.imsg}");
                }
                ApiHelper.AddInfo("Mes", "物料到位回报", date, JsonConvert.SerializeObject(result), "Post", url);
            }
            catch (Exception ex)
            {