杨前锦
2025-05-30 e4b92180e4336d777ac323c0395a043bde1285d3
印尼佳通-胚胎到硫化的出入库功能开发
8个文件已修改
235 ■■■■ 已修改文件
HH.WCS.Mobox3/HH.WCS.Mobox3.YNJT_BZP/Program.cs 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HH.WCS.Mobox3/HH.WCS.Mobox3.YNJT_BZP/api/ApiHelper.cs 34 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HH.WCS.Mobox3/HH.WCS.Mobox3.YNJT_BZP/api/DebugController.cs 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HH.WCS.Mobox3/HH.WCS.Mobox3.YNJT_BZP/api/WmsController.cs 33 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HH.WCS.Mobox3/HH.WCS.Mobox3.YNJT_BZP/core/WCSCore.cs 108 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HH.WCS.Mobox3/HH.WCS.Mobox3.YNJT_BZP/models/TaskAction.cs 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
HH.WCS.Mobox3/HH.WCS.Mobox3.YNJT_BZP/process/TaskProcess.cs 47 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HH.WCS.Mobox3/HH.WCS.Mobox3.YNJT_BZP/wms/WCSHelper.cs 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
HH.WCS.Mobox3/HH.WCS.Mobox3.YNJT_BZP/Program.cs
@@ -23,6 +23,7 @@
    {
        static void Main(string[] args) {
            Settings.Init();
            // 设置控制台编码为 UTF-8
            Console.OutputEncoding = Encoding.UTF8;
HH.WCS.Mobox3/HH.WCS.Mobox3.YNJT_BZP/api/ApiHelper.cs
@@ -992,10 +992,9 @@
                                TaskProcess.OperateStatus(cst, 6);
                                break;
                            case 7:
                                WCSHelper.UpdateStatus(cst, "异常取消");
                                WCSHelper.Cancel(cst);
                                WCSHelper.UpdateStatus(cst, "取消");
                                TaskProcess.OperateStatus(cst, 7);
                                mst.N_B_STATE = 3;
                                WMSHelper.UpdateTaskState(mst);
                                break;
                            case 8:
                                WCSHelper.UpdateStatus(cst, "强制完成");
@@ -1026,6 +1025,35 @@
        }
        /// <summary>
        /// 货位状态反馈
        /// </summary>
        /// <param name="model"></param>
        /// <returns></returns>
        public static bool locStateFeedBack(LocStateFeedBackModel model)
        {
            bool result = false;
            var task = WCSHelper.GetTask(model.req_no);
            if (task != null)
            {
                TaskAction taskAction = null;
                if (model.type == "1")
                {
                    taskAction = WCSHelper.getActionRecord(task.S_CODE, 1101);
                }
                if (model.type == "2")
                {
                    taskAction = WCSHelper.getActionRecord(task.S_CODE, 1103);
                }
                if (taskAction != null)
                {
                    taskAction.N_S_STATUS = 1;
                    result = WCSHelper.updateActionRecord(taskAction);
                }
            }
            return result;
        }
        /// <summary>
        /// 读码反馈
        /// </summary>
        /// <param name="model"></param>
HH.WCS.Mobox3/HH.WCS.Mobox3.YNJT_BZP/api/DebugController.cs
@@ -41,5 +41,7 @@
            return new SimpleResult();
        }
    }
}
HH.WCS.Mobox3/HH.WCS.Mobox3.YNJT_BZP/api/WmsController.cs
@@ -145,20 +145,49 @@
            return result;
        }
        /// <summary>
        /*/// <summary>
        /// 8.WCS入库读码反馈
        /// 业务场景:WCS在执行任务时,回报任务状态
        /// </summary>
        /// <param name="model"></param>
        /// <returns></returns>
        [HttpPost]
        /*[Route("notifyTaskStatus")]*/
        *//*[Route("notifyTaskStatus")]*//*
        public ReturnResult readCodeFeedback(ReadCodeFeedbackModel model)
        {
            LogHelper.Info("【8.WCS入库读码反馈】Request:" + JsonConvert.SerializeObject(model), "WMS");
            var result = ApiHelper.readCodeFeedback(model);
            LogHelper.Info("【8.WCS入库读码反馈】response:" + JsonConvert.SerializeObject(result), "WMS");
            return result;
        }*/
        /// <summary>
        /// 8.WCS反馈货位状态
        /// </summary>
        /// <param name="model"></param>
        /// <returns></returns>
        [HttpPost]
        /* [Route("notifyAlarm")]*/
        public ReturnResult locStateFeedBack(LocStateFeedBackModel model)
        {
            LogHelper.Info("locStateFeedBack 入参:" + JsonConvert.SerializeObject(model), "WMS");
            ReturnResult result = new ReturnResult();
            bool bo = ApiHelper.locStateFeedBack(model);
            if (!bo)
            {
                result.ResultCode = 1;
            }
            LogHelper.Info("locStateFeedBack 出参:" + JsonConvert.SerializeObject(result), "WMS");
            return result;
        }
        public class LocStateFeedBackModel
        {
            public string reqId { get; set; }
            public string reqTime { get; set; }
            public string loc_code { get; set; } // 站台编码
            public string type { get; set; } // 请求类型 1 允许取货 2 允许放货
            public string req_no { get; set; } // 任务号
        }
        // ----------------------------------- GT --------------------------------------------------------------
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,6 +60,17 @@
                                    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:
@@ -67,6 +79,7 @@
                                        var cntrItemRels = ContainerHelper.GetCntrItemRel(TN_Task.S_CNTR_CODE);
                                        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")
@@ -92,6 +105,7 @@
                                        }
                                        break;
                                    case 7:
                                        LogHelper.Info($"任务号:{TN_Task.S_CODE},AGV任务取消", "AGV");
                                        //判断是否收到过强制取消,有就不做任何处理
                                        if (!WCSHelper.CheckActionRecordExist(TN_Task.S_CODE, 17))
                                        {
@@ -101,18 +115,32 @@
                                        break;
                                }
                            }
                            else if (model.State == 1002)
                            else if (model.State == 1003)
                            {
                                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) 
                                {
@@ -123,6 +151,7 @@
                                        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) 
                                        {
                                            //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,9 +224,12 @@
        /// <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");
            LogHelper.Info($"作业号:{mst.S_CODE},创建下一段任务", "WMS");
            var existTask = WCSHelper.GetTaskByStart(startLocCode);
            if (existTask == null)
            {
            var startLoc = LocationHelper.GetLoc(startLocCode);
            if (startLoc != null) 
            {
@@ -199,6 +254,15 @@
                    cntrCode = mst.S_CNTR_CODE;
                    scheduleType = "AGV";
                }
                    string type = "";
                    if (typeName == null)
                    {
                        type = mst.S_TYPE + "-2";
                    }
                    else
                    {
                        type = typeName;
                    }
                // 创建一段入库任务
                WCSTask wcsTask = new WCSTask()
@@ -207,7 +271,7 @@
                    S_OP_CODE = mst.S_CODE,
                    S_CODE = WCSHelper.GenerateTaskNo(),
                    S_CNTR_CODE = cntrCode,
                    S_TYPE = mst.S_TYPE + "-2",
                        S_TYPE = type,
                    S_START_LOC = startLoc.S_CODE,
                    S_START_AREA = startLoc.S_AREA_CODE,
                    S_END_LOC = mst.S_END_LOC,
@@ -224,10 +288,11 @@
                    LocationHelper.LockLoc(wcsTask.S_END_LOC, 1);
                    WMSHelper.UpdateTaskEnd(mst);
                    return true;
                        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;
                                    }
                                }
HH.WCS.Mobox3/HH.WCS.Mobox3.YNJT_BZP/models/TaskAction.cs
@@ -17,7 +17,7 @@
        public string S_VALUE { get; set; }
        public string S_STATE_PRE { get; set; }
        public int N_REVIEW_RESULT { get; set; }
        public int N_S_STATUS { get; set; } = 0;
        public int N_S_STATUS { get; set; } = 0;   // 安全交互状态 0.默认 1.允许(取货/卸货)
        public int N_ACTION_CODE { get; set; }
    }
}
HH.WCS.Mobox3/HH.WCS.Mobox3.YNJT_BZP/process/TaskProcess.cs
@@ -42,7 +42,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);
@@ -53,9 +52,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 });
            }
        }
@@ -79,7 +75,7 @@
                if (taskAction.N_S_STATUS == 1)
                {
                    LogHelper.Info($"再次安全请求,设备已反馈", "AGV");
                    NDCApi.ChangeOrderParam(no, 8, "1");
                   /* NDCApi.ChangeOrderParam(no, 6, "1");*/
                }
            }
            else
@@ -88,11 +84,18 @@
                bool result = false;
                if (state == 1101)
                {
                    result = WCSDispatch.safetyInteraction(cst.S_CODE, cst.S_START_LOC, "1");  //请求取货,
                    LogHelper.Info("向WCS发送取货申请信号", "AGV");
                    /*result = WCSDispatch.safetyInteraction(cst.S_CODE, cst.S_START_LOC, "1");  //取货申请,*/
                    result = true;
                }
                if (state == 1102)
                {
                    //请求卸货,
                    LogHelper.Info("向WCS发送取货完成安全退出信号", "AGV");
                    /*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)
@@ -117,10 +120,9 @@
                                result = true;
                            }
                        }
                        // 胎圈入库
                        if (container.N_TYPE == 6 )
                        else
                        {
                            // 胎圈入库
                            if (endLoc.N_CURRENT_NUM == 0) 
                            {
                                LogHelper.Info("胎圈入库,接驳位缺少母拖,下发母拖出库任务", "AGV");
@@ -144,28 +146,17 @@
                    // 请求WCS是否允许放货
                    if (result) 
                    {
                        result = WCSDispatch.safetyInteraction(cst.S_CODE, cst.S_START_LOC, "2"); // 请求放货
                        LogHelper.Info("向WCS发送请求放货信号", "AGV");
                        /*result = WCSDispatch.safetyInteraction(cst.S_CODE, cst.S_START_LOC, "3"); // 请求放货*/
                        result = true;
                    }
                    }
                    if (result)
                    {
                        //根据终点判断,是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)
                {
                    result = WCSDispatch.safetyInteraction(cst.S_CODE, cst.S_START_LOC, "3");  //取货完成允许离开
                }
                if (state == 1104)
                {
                    result = WCSDispatch.safetyInteraction(cst.S_CODE, cst.S_START_LOC, "4");  //放货完成允许离开
                    LogHelper.Info("向WCS发送卸货完成安全退出信号", "AGV");
                    /*result = WCSDispatch.safetyInteraction(cst.S_CODE, cst.S_START_LOC, "4");  //卸货完成安全退出*/
                    result = true;
                }
                // 安全请求发送成功,添加任务动作记录
HH.WCS.Mobox3/HH.WCS.Mobox3.YNJT_BZP/wms/WCSHelper.cs
@@ -61,7 +61,7 @@
        internal static WCSTask GetTaskBySrcNoAndScheduleType(string no ,string scheduleType)
        {
            var db = new SqlHelper<WCSTask>().GetInstance();
            var task = db.Queryable<WCSTask>().Where(a => a.S_OP_CODE == no && a.S_SCHEDULE_TYPE == scheduleType && a.N_B_STATE < 3).First();
            var task = db.Queryable<WCSTask>().Where(a => a.S_OP_CODE == no && a.S_SCHEDULE_TYPE == scheduleType).First();
            return task;
        }
        internal static List<WCSTask> GetTaskListBySrcNo(string no)
@@ -165,6 +165,12 @@
            return db.Queryable<TaskAction>().Where(a => a.S_TASK_CODE == no.Trim() && a.N_ACTION_CODE == code).First();
        }
        internal static bool updateActionRecord(TaskAction taskAction)
        {
            var db = new SqlHelper<TaskAction>().GetInstance();
            return db.Updateable(taskAction).ExecuteCommand() > 0;
        }
        internal static void Begin(WCSTask task) {
            var db = new SqlHelper<WCSTask>().GetInstance();
            if (task != null) {