杨前锦
2025-06-11 e0d89637030791ce1e7dd46ca5fdec9979977960
HH.WCS.Mobox3/HH.WCS.Mobox3.YNJT_BZP/core/WCSCore.cs
@@ -17,6 +17,7 @@
using static HH.WCS.Mobox3.YNJT_BZP.api.AgvController;
using static HH.WCS.Mobox3.YNJT_BZP.api.ApiModel;
using static HH.WCS.Mobox3.YNJT_BZP.dispatch.GtDispatch;
using static HH.WCS.Mobox3.YNJT_BZP.util.Settings;
namespace HH.WCS.Mobox3.YNJT_BZP.core {
    internal class WCSCore {
@@ -36,7 +37,6 @@
                        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)
                            {
                                //有任务号请求
@@ -123,17 +123,23 @@
                                var waitLoc = Settings.getAgvWaitLoc(TN_Task.S_END_LOC);
                                if (waitLoc != null)
                                {
                                    var endLoc = AGVApplyEndLoc(model.No);
                                    LogHelper.Info($"任务号:{TN_Task.S_CODE},AGV小车变更终点:{endLoc.S_CODE}", "AGV");
                                    // 通知AGV更改终点
                                    ChangeParamModel paramModel = new ChangeParamModel()
                                    if (TN_Task.S_TYPE.Contains("入库"))
                                    {
                                        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);*/
                                        var endLoc = AGVApplyEndLoc(model.No);
                                        if (endLoc != null)
                                        {
                                            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)
@@ -142,10 +148,10 @@
                                // 卸货后等待
                                // 查询终点货位是否是入库接驳位
                                var agvJBLoc = Settings.getAgvJBLoc(TN_Task.S_END_LOC);
                                if (agvJBLoc != null && agvJBLoc.type == 1 && agvJBLoc.action == 1)
                                if (agvJBLoc != null && agvJBLoc.action == 1)
                                {
                                    //是则查询WCS的任务执行情况
                                    var wcsTask = WCSHelper.GetTaskBySrcNoAndScheduleType(TN_Task.S_OP_CODE, "WCS");
                                    var wcsTask = WCSHelper.GetTaskBySrcNoAndScheduleType(TN_Task.S_OP_CODE, "WCS" , wmsTask.S_TYPE);
                                    if (wcsTask != null)
                                    {
                                        bool existAction = WCSHelper.CheckActionRecordExist(wcsTask.S_CODE, 7);
@@ -161,7 +167,7 @@
                                                mst.S_END_LOC = endLoc.S_CODE;
                                                mst.S_END_AREA = endLoc.S_AREA_CODE;
                                                var newWcsTask = 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)
                                                {
@@ -207,6 +213,8 @@
                                //安全请求等
                                TaskProcess.OperateReq(model.No, model.State, model.ForkliftNo, model.ExtData);
                            }
                            WCSHelper.AddActionRecord(model.No, model.State, model.ForkliftNo, model.ExtData);
                        }
                    }
                }
@@ -315,7 +323,7 @@
            }
        }
        private static readonly object emptyTrayInLock = new object(); // 静态锁对象
        /// <summary>
        /// agv申请终点
@@ -333,23 +341,63 @@
                    var container = ContainerHelper.GetCntr(cst.S_CNTR_CODE);
                    if (container != null)
                    {
                        var endLoc = WMSHelper.GetInstockEndLoc(container.N_TYPE);
                        if (endLoc != null)
                        string itemCode = null;
                        var cntrItemRels = ContainerHelper.GetCntrItemRel(cst.S_CNTR_CODE);
                        if (cntrItemRels.Count > 0)
                        {
                            Location agvLoc = null;
                            var locCodes = Settings.getAgvJBLocList(1, endLoc.N_ROADWAY, 1);
                            if (locCodes.Count > 0)
                            // 满料托盘入库
                            itemCode = cntrItemRels[0].S_ITEM_CODE;
                            var endLoc = WMSHelper.GetInstockEndLoc(container.N_TYPE, null, 1, itemCode);
                            if (endLoc != null)
                            {
                                foreach (var locCode in locCodes)
                                Location agvLoc = null;
                                var locCodes = Settings.getAgvJBLocList( endLoc.N_ROADWAY, 1);
                                if (locCodes.Count > 0)
                                {
                                    agvLoc = LocationHelper.GetLoc(locCode);
                                    if (agvLoc != null && agvLoc.C_ENABLE == "Y")
                                    foreach (var locCode in locCodes)
                                    {
                                        LogHelper.Info($"检测AGV接驳位:{locCode}设备是否可用", "AGV");
                                        agvLoc = LocationHelper.GetLoc(locCode);
                                        if (agvLoc != null && agvLoc.C_ENABLE == "Y")
                                        {
                                            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);
                                        cst.S_END_LOC = agvLoc.S_CODE;
                                        cst.S_END_AREA = agvLoc.S_AREA_CODE;
                                            LogHelper.Info($"任务号:{taskNo},AGV申请的终点:{agvLoc.S_CODE}", "AGV");
                                            return agvLoc;
                                        }
                                    }
                                    LogHelper.Info($"任务号:{taskNo},入库接驳位货位都已禁用", "AGV");
                                }
                                else
                                {
                                    LogHelper.Info($"任务号:{taskNo},没有配置立库接驳位", "AGV");
                                }
                            }
                            else
                            {
                                LogHelper.Info($"任务号:{taskNo},立库没有满足条件的空货位", "AGV");
                            }
                        }
                        else
                        {
                            // 空托盘回库
                            lock (emptyTrayInLock)
                            {
                                var emptyTrayBuffers = WMSHelper.getEmptyTrayBufferList();
                                if (emptyTrayBuffers.Count > 0)
                                {
                                    var emptyTray = emptyTrayBuffers.Where(a => a.TRAY_TYPE == container.N_TYPE).OrderBy(a => a.T_CREATE).FirstOrDefault();
                                    if (emptyTray != null)
                                    {
                                        var endLoc = LocationHelper.GetLoc(emptyTray.END_LOC);
                                        cst.S_END_LOC = endLoc.S_CODE;
                                        cst.S_END_AREA = endLoc.S_AREA_CODE;
                                        WCSHelper.UpdateTaskEnd(cst);
                                        mst.S_END_LOC = endLoc.S_CODE;
@@ -357,21 +405,51 @@
                                        WMSHelper.UpdateTaskEnd(mst);
                                        LocationHelper.LockLoc(endLoc.S_CODE, 1);
                                        LogHelper.Info($"任务号:{taskNo},AGV申请的终点:{agvLoc.S_CODE}", "AGV");
                                        return agvLoc;
                                        emptyTray.IS_CREATED = "Y";
                                        WMSHelper.updateEmptyTrayBuffer(emptyTray);
                                    }
                                }
                                else
                                {
                                    var endLoc = WMSHelper.GetInstockEndLoc(container.N_TYPE, null, 1);
                                    if (endLoc != null)
                                    {
                                        Location agvLoc = null;
                                        var locCodes = Settings.getAgvJBLocList(endLoc.N_ROADWAY, 1);
                                        if (locCodes.Count > 0)
                                        {
                                            foreach (var locCode in locCodes)
                                            {
                                                agvLoc = LocationHelper.GetLoc(locCode);
                                                if (agvLoc != null && agvLoc.C_ENABLE == "Y")
                                                {
                                                    cst.S_END_LOC = agvLoc.S_CODE;
                                                    cst.S_END_AREA = agvLoc.S_AREA_CODE;
                                                    WCSHelper.UpdateTaskEnd(cst);
                                LogHelper.Info($"任务号:{taskNo},入库接驳位货位都已禁用", "AGV");
                                                    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;
                                                }
                                            }
                                            LogHelper.Info($"任务号:{taskNo},入库接驳位货位都已禁用", "AGV");
                                        }
                                        else
                                        {
                                            LogHelper.Info($"任务号:{taskNo},没有配置立库接驳位", "AGV");
                                        }
                                    }
                                    else
                                    {
                                        LogHelper.Info($"任务号:{taskNo},立库没有满足条件的空货位", "AGV");
                                    }
                                }
                            }
                            else
                            {
                                LogHelper.Info($"任务号:{taskNo},没有配置立库接驳位", "AGV");
                            }
                        }
                        else
                        {
                            LogHelper.Info($"任务号:{taskNo},立库没有满足条件的空货位", "AGV");
                        }
                    }
                    else