杨前锦
2025-06-19 d42ad8b01195def2a9309930e14f90ff13ad47b1
HH.WCS.Mobox3/HH.WCS.Mobox3.YNJT_BZP/process/TaskProcess.cs
@@ -11,6 +11,8 @@
using System.Linq;
using System.Reflection;
using System.Security.Cryptography;
using static HH.WCS.Mobox3.YNJT_BZP.util.Settings;
using static HH.WCS.Mobox3.YNJT_BZP.dispatch.WCSDispatch;
namespace HH.WCS.Mobox3.YNJT_BZP.process {
    internal class TaskProcess {
@@ -41,7 +43,6 @@
        internal static void CacheBitCancelUpdate(WCSTask mst) {
            //任务取消,取货完成前的,起点的loadingCount和终点unLoadingCount都清除,取货完成的只处理终点
            if (WCSHelper.CheckActionRecordExist(mst.S_CODE, 4) ) {
                //根据客户现场要求,如果取货完成任务失败人工拉到终点,我们就当卸货完成处理;如果是人工拉走到其它区域,我们就解锁终点,删除托盘。
                //终点绑定
                if (!WCSHelper.CheckActionRecordExist(mst.S_CODE, 5)) {
                    CacheBitUpdate(mst, false);
@@ -52,9 +53,6 @@
                //起点终点解锁
                LocationHelper.UnLockLoc(mst.S_START_LOC);
                LocationHelper.UnLockLoc(mst.S_END_LOC);
                //货位容器解绑
                LocationHelper.UnBindingLoc(mst.S_START_LOC, new List<string> { mst.S_CNTR_CODE });
            }
        }
@@ -67,88 +65,116 @@
        /// <param name="forkliftNo"></param>
        /// <param name="extData"></param>
        internal static void OperateReq(string no, int state, string forkliftNo, string extData) {
            LogHelper.Info($"开始安全请求,任务号:{no},请求码:{state},小车号:{forkliftNo}", "AGV");
            var cst = WCSHelper.GetTask(no);
            var mst = WMSHelper.GetWmsTask(cst.S_OP_CODE);
            var endLoc = LocationHelper.GetLoc(cst.S_END_LOC);
            if (state == 1101) {
                //请求取货,
            }
            if (state == 1102) {
                //请求卸货,
                bool isCan = false;
                if (endLoc != null)
            var taskAction = WCSHelper.getActionRecord(no, state);
            if (taskAction != null)
            {
                LogHelper.Info($"再次安全请求,查询设备是否反馈", "AGV");
                if (taskAction.N_S_STATUS == 1)
                {
                    // 1.查看终点货位放货条件是否满足
                    var waitLoc = Settings.getAgvWaitLoc(endLoc.S_CODE);
                    if (waitLoc != null)
                    LogHelper.Info($"再次安全请求,设备已反馈", "AGV");
                   /* NDCApi.ChangeOrderParam(no, 6, "1");*/
                }
            }
            else
            {
                LogHelper.Info($"首次进行安全请求,任务号:{no},请求码:{state},小车号:{forkliftNo}", "AGV");
                bool result = false;
                if (state == 1101)
                {
                    LogHelper.Info("向WCS发送取货申请信号", "AGV");
                    /*result = WCSDispatch.safetyInteraction(cst.S_CODE, cst.S_START_LOC, "1");  //取货申请,*/
                    result = true;
                }
                if (state == 1102)
                {
                    LogHelper.Info("向WCS发送取货完成安全退出信号", "AGV");
                    var locCntrRels = LocationHelper.GetLocCntr(cst.S_START_LOC);
                    if (locCntrRels.Count == 1)
                    {
                        //根据终点判断,是cb02的入口,判断内存中状态(要状态时间),允许卸货,通知agv改参数
                        var dic = new Dictionary<string, string>();
                        //< Req >< Order No = 'TN2302020002' ParamNo = '18' Param1 = '12' /></ Req >
                        dic.Add("No", no);
                        dic.Add("ParamNo", "8");
                        dic.Add("Param1", "1");
                        NDC.ChangeOrder(dic);
                    }
                    else
                    {
                        var container = ContainerHelper.GetCntr(cst.S_CNTR_CODE);
                        if (container != null && container.N_TYPE == 6)
                        var container = ContainerHelper.GetCntr(locCntrRels[0].S_CNTR_CODE);
                        if (container != null && container.N_TYPE == 0)
                        {
                            isCan = false;
                            var locCntrs = LocationHelper.GetLocCntr(endLoc.S_CODE);
                            if (endLoc.N_CURRENT_NUM == 1 && locCntrs.Count > 0)
                            LogHelper.Info("取货完成后,起点货位存在母拖,下发母拖入库任务", "AGV");
                            ApiHelper.baseTrayInStock(cst.S_START_LOC, mst.S_CODE);
                        }
                    }
                    /*result = WCSDispatch.safetyInteraction(cst.S_CODE, cst.S_START_LOC, "2");  //取货完成安全退出*/
                    result = true;
                }
                if (state == 1103)   //卸货申请,
                {
                    var container = ContainerHelper.GetCntr(cst.S_CNTR_CODE);
                    // 胎圈入库,下发母拖出库任务 \ 帘布、内衬入库,下发托盘回库任务
                    if (cst.S_TYPE.Contains("入库") && endLoc.N_LOCK_STATE == 0)
                    {
                        if (container.N_TYPE != 6 )
                        {
                            if (endLoc.N_CURRENT_NUM == 1)
                            {
                                var container1 = ContainerHelper.GetCntr(locCntrs[0].S_CNTR_CODE);
                                if (container1.N_TYPE == 0)
                                var locCntrRels = LocationHelper.GetLocCntr(endLoc.S_CODE);
                                if (locCntrRels != null && locCntrRels.Count > 0)
                                {
                                    isCan = true;
                                    var container1 = ContainerHelper.GetCntr(locCntrRels[0].S_CNTR_CODE);
                                    if (container1.N_TYPE == 0)
                                    {
                                        LogHelper.Info("非胎圈入库,接驳位存在母拖,下发母拖入库任务", "AGV");
                                        ApiHelper.autoBaseTrayInStock(endLoc.S_CODE, mst.S_CODE);
                                    }
                                }
                            }
                            if (!isCan)
                            else
                            {
                                LogHelper.Info("胎圈请求放货失败,母拖没有到位", "AGV");
                                result = true;
                            }
                        }
                        else
                        {
                            // 胎圈入库
                            if (endLoc.N_CURRENT_NUM == 0)
                            {
                                LogHelper.Info("胎圈入库,接驳位缺少母拖,下发母拖出库任务", "AGV");
                                ApiHelper.autoBaseTrayOutStock(endLoc.S_CODE, mst.S_CODE);
                            }
                            else if (endLoc.N_CURRENT_NUM == 1)
                            {
                                var locCntrRels = LocationHelper.GetLocCntr(endLoc.S_CODE);
                                if (locCntrRels != null && locCntrRels.Count > 0)
                                {
                                    var container1 = ContainerHelper.GetCntr(locCntrRels[0].S_CNTR_CODE);
                                    if (container1.N_TYPE == 0)
                                    {
                                        result = true;
                                    }
                                }
                            }
                        }
                    }
                    // 2.查询输送线 是否允许放货
                }
                if (isCan)
                {
                    //根据终点判断,是cb02的入口,判断内存中状态(要状态时间),允许卸货,通知agv改参数
                    var dic = new Dictionary<string, string>();
                    //< Req >< Order No = 'TN2302020002' ParamNo = '18' Param1 = '12' /></ Req >
                    dic.Add("No", no);
                    dic.Add("ParamNo", "8");
                    dic.Add("Param1", "1");
                    NDC.ChangeOrder(dic);
                    //改完参数车子就会自己卸货
                }
            }
            if (state == 1103)
            {
                // 取货完成请求离开
                // 安全退出
                // 胎圈出库,下发母拖回库任务
                var locCntrRels = LocationHelper.GetLocCntrRel(cst.S_START_LOC);
                if (locCntrRels.Count > 0)
                {
                    var container = ContainerHelper.GetCntr(locCntrRels[0].S_CNTR_CODE);
                    if (container != null && container.N_TYPE == 0)
                    // 请求WCS是否允许放货
                    if (result)
                    {
                        ApiHelper.baseTrayInStockAgv(cst.S_START_LOC, cst.S_OP_CODE);
                        LogHelper.Info("向WCS发送请求放货信号", "AGV");
                        /*result = WCSDispatch.safetyInteraction(cst.S_CODE, cst.S_START_LOC, "3"); // 请求放货*/
                        result = true;
                    }
                }
            }
            if (state == 1104)
            {
                // 放货完成请求离开
                if (state == 1104)
                {
                    LogHelper.Info("向WCS发送卸货完成安全退出信号", "AGV");
                    /*result = WCSDispatch.safetyInteraction(cst.S_CODE, cst.S_START_LOC, "4");  //卸货完成安全退出*/
                    result = true;
                }
                // 安全请求发送成功,添加任务动作记录
                if (result)
                {
                    LogHelper.Info($"首次进行安全请求成功", "AGV");
                }
            }
        }
@@ -197,7 +223,6 @@
            if (mst.N_B_STATE == 0) {
                var startLoc = LocationHelper.GetLocation(mst.S_START_LOC);
                var endLoc = LocationHelper.GetLocation(mst.S_END_LOC);
                if (mst.S_SCHEDULE_TYPE == "AGV") 
                {
                    AddOrderNewModel model = new AddOrderNewModel() 
@@ -208,9 +233,19 @@
                    };
                    List<Param> paramList = new List<Param>();
                    var dic = new Dictionary<string, string>();
                    dic.Add("IKey", mst.S_CODE);
                    dic.Add("From", startLoc.S_CODE);
                    dic.Add("To", endLoc.S_CODE);
                    dic.Add("FUNC", "0");
                    if (mst.S_TYPE.Contains("入库"))
                    {
                        dic.Add("DATA", "300");
                    }
                    else
                    {
                        dic.Add("DATA", "0");
                    }
                    dic.Add("Ctype", "0");
                    foreach (var item in dic)
                    {
                        Param param = new Param
@@ -220,7 +255,8 @@
                        };
                        paramList.Add(param);
                    }
                    model.paramList = paramList;
                    model.param = paramList;
                    LogHelper.Info($"向AGV下发任务,任务参数:{model}", "WMS");
                    var res = NDCApi.AddOrderNew(model);
                    if (res != null && res.err_code == 0 || true)
                    {
@@ -232,8 +268,17 @@
                }
                else if (mst.S_SCHEDULE_TYPE == "WCS") 
                {
                    if (true)
                    SendTaskModel sendTask = new SendTaskModel()
                    {
                        taskNo = mst.S_CODE,
                        taskType = mst.S_TYPE.Contains("入库") ? "1" : "2",
                        from = mst.S_START_LOC,
                        to = mst.S_END_LOC,
                        cntrNo = mst.S_CNTR_CODE,
                    };
                    LogHelper.Info($"向WCS下发任务,任务参数:{sendTask}", "WMS");
                    var bo = WCSDispatch.sendTask(sendTask);
                    if (true || bo)
                    {
                        //推送成功,修改任务优先级
                        mst.N_B_STATE = 1;