lss
2025-05-29 cb58fdbdc4391136e7176210e3f1969606f11903
HH.WCS.Mobox3/HH.WCS.Mobox3.JiaTong/process/TaskProcess.cs
@@ -1,5 +1,6 @@
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.process;
using HH.WCS.JiaTong.util;
@@ -12,6 +13,8 @@
using System.IdentityModel.Protocols.WSTrust;
using System.Linq;
using System.Security.Cryptography;
using System.Threading;
using static HH.WCS.JiaTong.api.ApiModel;
using static HH.WCS.JiaTong.LISTA.process.HttpModel;
namespace HH.WCS.JiaTong.process
@@ -30,15 +33,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.UnlockLoc(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);
                }
            }
        }
@@ -71,27 +92,26 @@
        /// <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)
        {
            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.Z_TYPE == 4)//原材料库国自安全交互
                        {
                            if (GZOperateReqByPost(url, TN_Task.S_EQ_NO, loc, type))
                            {
@@ -101,19 +121,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))
                                {
                                    // 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,13 +174,33 @@
                                //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)
                            {
                                //写入失败重新写入
                                while (!S7Helper.WriteDpj(Device.address, 1001, 1))
                                {
                                    Thread.Sleep(1000);
                                }
                                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.Z_TYPE == 4)//原材料库国自安全交互
                        {
                            loc = TN_Task.S_END_LOC;
                            if (GZOperateReqByPost(url, TN_Task.S_EQ_NO, loc, type))
@@ -138,18 +211,16 @@
                        }
                        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))
                            {
                                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.Z_TYPE == 4)//原材料库国自安全交互
                        {
                            loc = TN_Task.S_END_LOC;
                            if (GZOperateReqByPost(url, TN_Task.S_EQ_NO, loc, type))
@@ -159,10 +230,7 @@
                        }
                    }
                }
                else
                {
                    LogHelper.Info($"安全请求==》根据任务号{no}未找到对应任务");
                }
            }
            catch (Exception ex)
            {
@@ -206,6 +274,7 @@
                else
                {
                    LogHelper.Info($"安全请求失败=>msg:{result.msg}");
                    ApiHelper.AddErrorInfo("安全交互失败", result.msg, "", tasknum);
                }
                return permit;
            }
@@ -255,6 +324,7 @@
                else
                {
                    LogHelper.Info($"安全请求失败=>msg:{result.err_msg}");
                    ApiHelper.AddErrorInfo("安全交互失败", result.err_msg, "", no);
                }
                return permit;
            }
@@ -789,9 +859,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 +868,59 @@
            {
                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"))
                {
                    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");
                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;
                    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
                    });
                }
                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);
@@ -851,6 +942,8 @@
            }
        }
        /// <summary>
        /// 创建搬运任务
        /// </summary>
@@ -902,8 +995,5 @@
            return result;
        }
        #endregion
    }
}