杨前锦
2025-05-26 d0a265713fd18162f3a82bdcd22e267df7298c7b
HH.WCS.Mobox3/HH.WCS.Mobox3.YNJT_BZP/core/WCSCore.cs
@@ -21,6 +21,7 @@
namespace HH.WCS.Mobox3.YNJT_BZP.core {
    internal class WCSCore {
        public static void OperateAgvTaskStatus(AgvTaskState model) {
            LogHelper.Info($"AGV任务状态反馈,入参:{JsonConvert.SerializeObject(model)}", "AGV");
            try
            {
                if (string.IsNullOrEmpty(model.No))
@@ -100,10 +101,54 @@
                                        break;
                                }
                            }
                            else if (model.State == 2001)
                            else if (model.State == 1002)
                            {
                                //申请新终点
                                string endLoc = AGVApplyEndLoc(model.No);
                                //查询当前终点是等待区,则查询入库agv接驳位
                                var waitLoc = Settings.getAgvWaitLoc(TN_Task.S_END_LOC);
                                if (waitLoc != null)
                                {
                                    string endLoc = AGVApplyEndLoc(model.No);
                                }
                                //如果不是等待区货位,则查询终点货位是否是入库接驳位
                                var agvJBLoc = Settings.getAgvJBLoc(TN_Task.S_END_LOC);
                                if (agvJBLoc != null && agvJBLoc.type == 1 && agvJBLoc.action == 1)
                                {
                                    //是则查询WCS的任务执行情况
                                    var wcsTask = WCSHelper.GetTaskBySrcNoAndScheduleType(TN_Task.S_OP_CODE ,"WCS");
                                    if (wcsTask != null)
                                    {
                                        bool existAction = WCSHelper.CheckActionRecordExist(wcsTask.S_CODE, 7);
                                        if (existAction)
                                        {
                                            //如果WCS反馈7取消任务,则rfid校验失败,生成新任务到异常区,并变更agv任务号、起点、终点
                                            var mst = WMSHelper.GetWmsTask(TN_Task.S_OP_CODE);
                                            var endLoc = WMSHelper.getErrorBufferAreaLoc();
                                            if (endLoc != null)
                                            {
                                                LocationHelper.UnLockLoc(mst.S_END_LOC);
                                                mst.S_END_LOC = endLoc.S_CODE;
                                                mst.S_END_AREA = endLoc.S_AREA_CODE;
                                                WMSHelper.UpdateTaskEnd(mst);
                                                WCSCore.createLastTask(TN_Task.S_END_LOC, mst, 2);
                                            }
                                            else
                                            {
                                                LogHelper.Info("", "AGV");
                                            }
                                        }
                                        existAction = WCSHelper.CheckActionRecordExist(wcsTask.S_CODE, 3);
                                        if (existAction)
                                        {
                                            //WCS反馈3已取货,则agv任务正常结束
                                        }
                                    }
                                }
                            }
                            else
                            {
@@ -213,100 +258,69 @@
        /// <param name="taskNo"></param>
        public static string AGVApplyEndLoc(string taskNo) 
        {
            LogHelper.Info("【agv申请终点】", "AGV");
            string endLocCode = null;
            LogHelper.Info($"任务号:{taskNo},AGV等待区申请终点", "AGV");
            var cst = WCSHelper.GetTask(taskNo);
            if (cst != null && cst.N_B_STATE < 3)
            if (cst != null && cst.N_B_STATE < 3)
            {
                var mst = WMSHelper.GetWmsTask(cst.S_OP_CODE);
                if (mst != null && mst.N_B_STATE < 2 && mst.S_END_LOC == "虚拟货位")
                if (mst != null && mst.N_B_STATE < 2 && mst.S_END_LOC == "虚拟货位")
                {
                    var container = ContainerHelper.GetCntr(cst.S_CNTR_CODE);
                    if (container != null)
                    if (container != null)
                    {
                        var endLoc = WMSHelper.GetInstockEndLoc(container.N_TYPE);
                        if (endLoc != null)
                        {
                            Location agvLoc = null;
                            var locCodes = Settings.getAgvJBLocList(1, endLoc.N_ROADWAY, 1);
                            if (locCodes.Count > 0)
                            if (locCodes.Count > 0)
                            {
                                agvLoc = LocationHelper.GetLoc(locCodes[0]);
                            }
                            if (agvLoc != null && agvLoc.C_ENABLE == "Y")
                            {
                                var wcsTask = WCSHelper.GetTaskByStartAndEnd(agvLoc.S_CODE);
                                if (wcsTask == null && agvLoc.N_LOCK_STATE == 0)
                                foreach (var locCode in locCodes)
                                {
                                    // 胎圈入库,下发母拖出库任务 \ 帘布、内衬入库,下发托盘回库任务
                                    if (mst.S_TYPE.Contains("入库"))
                                    agvLoc = LocationHelper.GetLoc(locCode);
                                    if (agvLoc != null && agvLoc.C_ENABLE == "Y")
                                    {
                                        if (agvLoc.N_CURRENT_NUM == 1)
                                        {
                                            var locCntrRels = LocationHelper.GetLocCntr(agvLoc.S_CODE);
                                            if (locCntrRels.Count > 0)
                                            {
                                                var container1 = ContainerHelper.GetCntr(locCntrRels[0].S_CNTR_CODE);
                                                if (container1.N_TYPE == 0)
                                                {
                                                    if (container.N_TYPE == 4 || container.N_TYPE == 5)
                                                    {
                                                        ApiHelper.baseTrayInStockAgv(agvLoc.S_CODE, mst.S_CODE);
                                                    }
                                                }
                                                else
                                                {
                                                    LogHelper.Info($"接驳位:{agvLoc.S_CODE},存在非母拖容器", "AGV");
                                                }
                                            }
                                            else
                                            {
                                                LogHelper.Info($"接驳位:{agvLoc.S_CODE}的当前数量与容器数量不匹配", "AGV");
                                            }
                                        }
                                        else if (agvLoc.N_CURRENT_NUM == 0)
                                        {
                                            if (container.N_TYPE == 6)
                                            {
                                                ApiHelper.baseTrayOutStockAgv(agvLoc.S_CODE, mst.S_CODE);
                                            }
                                        }
                                        else
                                        {
                                            return endLocCode;
                                        }
                                        cst.S_END_LOC = agvLoc.S_CODE;
                                        cst.S_END_AREA = agvLoc.S_AREA_CODE;
                                        WCSHelper.UpdateTaskEnd(cst);
                                        mst.S_END_LOC = endLoc.S_CODE;
                                        mst.S_END_AREA = endLoc.S_AREA_CODE;
                                        WMSHelper.UpdateTaskEnd(mst);
                                        LocationHelper.LockLoc(endLoc.S_CODE, 1);
                                        LogHelper.Info($"任务号:{taskNo},AGV申请的终点:{agvLoc.S_CODE}", "AGV");
                                        return agvLoc.S_CODE;
                                    }
                                    cst.S_END_LOC = agvLoc.S_CODE;
                                    cst.S_END_AREA = agvLoc.S_AREA_CODE;
                                    WCSHelper.UpdateTaskEnd(cst);
                                    mst.S_END_LOC = endLoc.S_CODE;
                                    mst.S_END_AREA = endLoc.S_AREA_CODE;
                                    WMSHelper.UpdateTaskEnd(mst);
                                    LocationHelper.LockLoc(agvLoc.S_CODE, 1);
                                    LocationHelper.LockLoc(endLoc.S_CODE, 1);
                                    endLocCode = agvLoc.S_CODE;
                                }
                                else
                                {
                                    LogHelper.Info("接驳位当前有任务未完成,请稍等", "AGV");
                                }
                                LogHelper.Info($"任务号:{taskNo},入库接驳位货位都已禁用", "AGV");
                            }
                            else
                            else
                            {
                                LogHelper.Info("没有可用的入库接驳位", "AGV");
                                LogHelper.Info($"任务号:{taskNo},没有配置立库接驳位", "AGV");
                            }
                        }
                        else
                        else
                        {
                            LogHelper.Info("没有空余的货位", "AGV");
                            LogHelper.Info($"任务号:{taskNo},立库没有满足条件的空货位", "AGV");
                        }
                    }
                    else
                    {
                        LogHelper.Info($"任务号:{taskNo},AGV任务的容器:{cst.S_CNTR_CODE}不存在", "AGV");
                    }
                }
                else
                {
                    LogHelper.Info($"任务号:{taskNo},AGV任务已申请终点,请勿重复申请", "AGV");
                }
            }
            return endLocCode;
            else
            {
                LogHelper.Info($"任务号:{taskNo},AGV任务已完成或取消", "AGV");
            }
            return null;
        }
    }