杨前锦
2025-05-30 e4b92180e4336d777ac323c0395a043bde1285d3
HH.WCS.Mobox3/HH.WCS.Mobox3.YNJT_BZP/core/WCSCore.cs
@@ -33,8 +33,8 @@
                    var TN_Task = WCSHelper.GetTask(model.No);
                    if (TN_Task != null)
                    {
                        bool isExist = WCSHelper.CheckActionRecordExist(TN_Task.S_CODE, model.State);
                        if (!isExist)
                        var wmsTask = WMSHelper.GetWmsTask(TN_Task.S_OP_CODE);
                        if (wmsTask != null && wmsTask.N_B_STATE < 2)
                        {
                            WCSHelper.AddActionRecord(model.No, model.State, model.ForkliftNo, model.ExtData);
                            if (model.State <= 7)
@@ -43,6 +43,7 @@
                                switch (model.State)
                                {
                                    case 1:
                                        TN_Task.S_EQ_NO = model.ForkliftNo;
                                        WCSHelper.Begin(TN_Task);
                                        break;
                                    #region MyRegion
@@ -59,21 +60,33 @@
                                    case 6:
                                        TaskProcess.OperateStatus(TN_Task, 6);
                                        WCSHelper.UpdateStatus(TN_Task, "卸货完成");
                                        // AGV卸货输送线,触发入库任务
                                        if (TN_Task.S_END_LOC != wmsTask.S_END_LOC)
                                        {
                                            LogHelper.Info($"任务号:{TN_Task.S_CODE},AGV卸货输送线,触发WCS入库任务", "AGV");
                                            Container container = ContainerHelper.GetCntr(TN_Task.S_CNTR_CODE);
                                            if (container != null)
                                            {
                                                WCSCore.createLastTask(TN_Task.S_END_LOC, wmsTask, 1);
                                            }
                                        }
                                        break;
                                    #endregion
                                    case 2:
                                        WCSHelper.End(TN_Task);
                                        var cntrItemRels = ContainerHelper.GetCntrItemRel(TN_Task.S_CNTR_CODE);
                                        if (cntrItemRels.Count > 0)
                                        if (cntrItemRels.Count > 0)
                                        {
                                            LogHelper.Info($"任务号:{TN_Task.S_CODE},AGV任务完成,任务信息回报GT", "AGV");
                                            string shift = ApiHelper.getShift(DateTime.Now.TimeOfDay);
                                            string ydate_shiftName = "";
                                            if (shift == "III")
                                            {
                                                ydate_shiftName = DateTime.Now.AddDays(-1).ToString("yy/MM/dd") + "-" + shift;
                                            }
                                            else
                                            else
                                            {
                                                ydate_shiftName = DateTime.Now.ToString("yy/MM/dd") + "-" + shift;
                                            }
@@ -92,6 +105,7 @@
                                        }
                                        break;
                                    case 7:
                                        LogHelper.Info($"任务号:{TN_Task.S_CODE},AGV任务取消", "AGV");
                                        //判断是否收到过强制取消,有就不做任何处理
                                        if (!WCSHelper.CheckActionRecordExist(TN_Task.S_CODE, 17))
                                        {
@@ -101,28 +115,43 @@
                                        break;
                                }
                            }
                            else if (model.State == 1002)
                            else if (model.State == 1003)
                            {
                                //查询当前终点是等待区,则查询入库agv接驳位
                                LogHelper.Info($"任务号:{TN_Task.S_CODE},AGV小车进入等待位:{TN_Task.S_END_LOC}", "AGV");
                                // 卸货前等待
                                // 查询当前终点是等待区,则查询入库agv接驳位
                                var waitLoc = Settings.getAgvWaitLoc(TN_Task.S_END_LOC);
                                if (waitLoc != null)
                                {
                                    string endLoc = AGVApplyEndLoc(model.No);
                                    var endLoc = AGVApplyEndLoc(model.No);
                                    LogHelper.Info($"任务号:{TN_Task.S_CODE},AGV小车变更终点:{endLoc.S_CODE}", "AGV");
                                    // 通知AGV更改终点
                                    ChangeParamModel paramModel = new ChangeParamModel()
                                    {
                                        task_no = model.No,
                                        param_no = 0,
                                        param = $"{model.No};{TN_Task.S_START_LOC};{TN_Task.S_END_LOC};0;400;0;2"
                                    };
                                    LogHelper.Info($"通知AGV更改终点,参数:{paramModel}", "AGV");
                                    /* NDCApi.ChangeOrderParam(paramModel);*/
                                }
                                //如果不是等待区货位,则查询终点货位是否是入库接驳位
                            }
                            else if (model.State == 1004)
                            {
                                LogHelper.Info($"任务号:{TN_Task.S_CODE},AGV小车卸货后在接驳位:{TN_Task.S_END_LOC}等待", "AGV");
                                // 卸货后等待
                                // 查询终点货位是否是入库接驳位
                                var agvJBLoc = Settings.getAgvJBLoc(TN_Task.S_END_LOC);
                                if (agvJBLoc != null && agvJBLoc.type == 1 && agvJBLoc.action == 1)
                                if (agvJBLoc != null && agvJBLoc.type == 1 && agvJBLoc.action == 1)
                                {
                                    //是则查询WCS的任务执行情况
                                    var wcsTask = WCSHelper.GetTaskBySrcNoAndScheduleType(TN_Task.S_OP_CODE ,"WCS");
                                    if (wcsTask != null)
                                    var wcsTask = WCSHelper.GetTaskBySrcNoAndScheduleType(TN_Task.S_OP_CODE, "WCS");
                                    if (wcsTask != null)
                                    {
                                        bool existAction = WCSHelper.CheckActionRecordExist(wcsTask.S_CODE, 7);
                                        if (existAction)
                                        {
                                            LogHelper.Info($"下游任务:{wcsTask.S_CODE}取消入库,rfid校验失败,生成新任务到异常区", "AGV");
                                            //如果WCS反馈7取消任务,则rfid校验失败,生成新任务到异常区,并变更agv任务号、起点、终点
                                            var mst = WMSHelper.GetWmsTask(TN_Task.S_OP_CODE);
                                            var endLoc = WMSHelper.getErrorBufferAreaLoc();
@@ -132,20 +161,43 @@
                                                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);
                                                var newWcsTask = WCSCore.createLastTask(TN_Task.S_END_LOC, mst, 2, "入库异常区任务");
                                                LogHelper.Info($"任务号:{TN_Task.S_CODE},AGV小车改道终点:{newWcsTask.S_END_LOC}", "AGV");
                                                if (newWcsTask != null)
                                                {
                                                    WCSHelper.End(TN_Task);
                                                    // 通知AGV更改终点
                                                    ChangeParamModel paramModel = new ChangeParamModel()
                                                    {
                                                        task_no = model.No,
                                                        param_no = 0,
                                                        param = $"{model.No};{newWcsTask.S_START_LOC};{newWcsTask.S_END_LOC};0;0;0;1"
                                                    };
                                                    LogHelper.Info($"通知AGV更改终点,参数:{paramModel}", "AGV");
                                                    /*NDCApi.ChangeOrderParam(paramModel);*/
                                                }
                                                return;
                                            }
                                            else
                                            {
                                                LogHelper.Info("", "AGV");
                                                LogHelper.Info("异常区没有空货位,无法入库异常区", "AGV");
                                            }
                                        }
                                        existAction = WCSHelper.CheckActionRecordExist(wcsTask.S_CODE, 3);
                                        if (existAction)
                                        if (existAction)
                                        {
                                            //WCS反馈3已取货,则agv任务正常结束
                                            LogHelper.Info($"任务号:{TN_Task.S_CODE},RFID检测通过,AGV任务正常完成", "AGV");
                                            //WCS反馈3已取货,则agv任务正常结束 ,通知AGV完成任务
                                            ChangeParamModel paramModel = new ChangeParamModel()
                                            {
                                                task_no = model.No,
                                                param_no = 0,
                                                param = $"{model.No};{TN_Task.S_START_LOC};{TN_Task.S_END_LOC};0;0;0;1"
                                            };
                                            LogHelper.Info($"通知AGV完成任务,参数:{paramModel}", "AGV");
                                            /*NDCApi.ChangeOrderParam(paramModel);*/
                                        }
                                    }
                                }
@@ -172,62 +224,75 @@
        /// <param name="mst"></param>
        /// <param name="actType">1.入库 2.出库</param>
        /// <returns></returns>
        public static bool createLastTask(string startLocCode , WMSTask mst ,int actType)
        public static WCSTask createLastTask(string startLocCode , WMSTask mst ,int actType ,string typeName = null)
        {
            LogHelper.Info("创建下一段任务", "WMS");
            var startLoc = LocationHelper.GetLoc(startLocCode);
            if (startLoc != null)
            LogHelper.Info($"作业号:{mst.S_CODE},创建下一段任务", "WMS");
            var existTask = WCSHelper.GetTaskByStart(startLocCode);
            if (existTask == null)
            {
                string cntrCode = "";
                string scheduleType = "";
                if (actType == 1)
                var startLoc = LocationHelper.GetLoc(startLocCode);
                if (startLoc != null)
                {
                    var locCntrRels = LocationHelper.GetLocCntr(startLocCode);
                    if (locCntrRels.Count > 0)
                    string cntrCode = "";
                    string scheduleType = "";
                    if (actType == 1)
                    {
                        foreach (var cntr in locCntrRels)
                        var locCntrRels = LocationHelper.GetLocCntr(startLocCode);
                        if (locCntrRels.Count > 0)
                        {
                            cntrCode = cntrCode + ","+ cntr.S_CNTR_CODE;
                            foreach (var cntr in locCntrRels)
                            {
                                cntrCode = cntrCode + "," + cntr.S_CNTR_CODE;
                            }
                            cntrCode = cntrCode.Substring(1, cntrCode.Length - 1);
                        }
                        cntrCode = cntrCode.Substring(1, cntrCode.Length-1);
                        scheduleType = "WCS";
                    }
                    scheduleType = "WCS";
                }
                if (actType == 2)
                {
                    cntrCode = mst.S_CNTR_CODE;
                    scheduleType = "AGV";
                }
                    if (actType == 2)
                    {
                        cntrCode = mst.S_CNTR_CODE;
                        scheduleType = "AGV";
                    }
                    string type = "";
                    if (typeName == null)
                    {
                        type = mst.S_TYPE + "-2";
                    }
                    else
                    {
                        type = typeName;
                    }
                // 创建一段入库任务
                WCSTask wcsTask = new WCSTask()
                {
                    S_OP_NAME = mst.S_OP_DEF_NAME,
                    S_OP_CODE = mst.S_CODE,
                    S_CODE = WCSHelper.GenerateTaskNo(),
                    S_CNTR_CODE = cntrCode,
                    S_TYPE = mst.S_TYPE + "-2",
                    S_START_LOC = startLoc.S_CODE,
                    S_START_AREA = startLoc.S_AREA_CODE,
                    S_END_LOC = mst.S_END_LOC,
                    S_END_AREA = mst.S_END_AREA,
                    S_SCHEDULE_TYPE = scheduleType,
                    N_PRIORITY = mst.N_PRIORITY,
                    T_START_TIME = DateTime.Now,
                };
                    // 创建一段入库任务
                    WCSTask wcsTask = new WCSTask()
                    {
                        S_OP_NAME = mst.S_OP_DEF_NAME,
                        S_OP_CODE = mst.S_CODE,
                        S_CODE = WCSHelper.GenerateTaskNo(),
                        S_CNTR_CODE = cntrCode,
                        S_TYPE = type,
                        S_START_LOC = startLoc.S_CODE,
                        S_START_AREA = startLoc.S_AREA_CODE,
                        S_END_LOC = mst.S_END_LOC,
                        S_END_AREA = mst.S_END_AREA,
                        S_SCHEDULE_TYPE = scheduleType,
                        N_PRIORITY = mst.N_PRIORITY,
                        T_START_TIME = DateTime.Now,
                    };
                if (WCSHelper.CreateTask(wcsTask))
                {
                    // 起点、接驳点、终点加锁
                    LocationHelper.LockLoc(wcsTask.S_START_LOC, 2);
                    LocationHelper.LockLoc(wcsTask.S_END_LOC, 1);
                    if (WCSHelper.CreateTask(wcsTask))
                    {
                        // 起点、接驳点、终点加锁
                        LocationHelper.LockLoc(wcsTask.S_START_LOC, 2);
                        LocationHelper.LockLoc(wcsTask.S_END_LOC, 1);
                    WMSHelper.UpdateTaskEnd(mst);
                    return true;
                        WMSHelper.UpdateTaskEnd(mst);
                        return wcsTask;
                    }
                }
            }
            return false;
            return null;
        }
        /// <summary>
@@ -256,7 +321,7 @@
        /// agv申请终点
        /// </summary>
        /// <param name="taskNo"></param>
        public static string AGVApplyEndLoc(string taskNo)
        public static Location AGVApplyEndLoc(string taskNo)
        {
            LogHelper.Info($"任务号:{taskNo},AGV等待区申请终点", "AGV");
            var cst = WCSHelper.GetTask(taskNo);
@@ -280,6 +345,9 @@
                                    agvLoc = LocationHelper.GetLoc(locCode);
                                    if (agvLoc != null && agvLoc.C_ENABLE == "Y")
                                    {
                                        LogHelper.Info($"检测AGV接驳位:{locCode}设备是否可用", "AGV");
                                        cst.S_END_LOC = agvLoc.S_CODE;
                                        cst.S_END_AREA = agvLoc.S_AREA_CODE;
                                        WCSHelper.UpdateTaskEnd(cst);
@@ -290,7 +358,7 @@
                                        LocationHelper.LockLoc(endLoc.S_CODE, 1);
                                        LogHelper.Info($"任务号:{taskNo},AGV申请的终点:{agvLoc.S_CODE}", "AGV");
                                        return agvLoc.S_CODE;
                                        return agvLoc;
                                    }
                                }