杨前锦
2025-07-01 a93b0e99036c24b9bd58c79bf5e7364b1ba28bae
HH.WCS.Mobox3/HH.WCS.Mobox3.FJJT/api/ApiHelper.cs
@@ -980,7 +980,7 @@
        /// <summary>
        /// AGV申请终点
        /// 顺序 RFID验证 -> RFID与任务号验证 -> 物料合格状态验证 -> 虚拟终点
        /// 申请类型: 1.虚拟终点 2.RFID与任务不匹配 3.物料状态不合格
        /// 申请类型: 1.正常 2.异常
        /// 入库策略:先计算库区的容积率,再计算库区对应的入库站台的任务数,都取最小的
        /// 
        /// 1.确定任务是否在执行中
@@ -1036,7 +1036,8 @@
            {
                WMSHelper.addAlarmRecord("系统错误","高", $"AGV申请终点,WMS内部错误,错误原因:{ex.Message}", "AGV");
            }
            return null;
            LogHelper.Info($"变更AGV终点:{applyDest}", "AGV");
            return applyDest;
        }
        /// <summary>
@@ -1050,9 +1051,7 @@
        /// <returns></returns>
        public static string applyAgvDestXC(string applyType, WMSTask mst, WCSTask cst)
        {
            string destLoc = null;
            Location agvEndLoc = null;
            Location wmsEndLoc = null;
            Location endLoc = null;
            if (applyType == "1")
            {
                if (mst.S_TYPE == "余料/空工装入库")
@@ -1069,8 +1068,7 @@
                                // 取消任务
                                ApiHelper.cancelTask(awaitTask.S_CODE);
                                // 修改终点
                                agvEndLoc = LocationHelper.GetLoc(awaitTask.S_END_LOC);
                                wmsEndLoc = agvEndLoc;
                                endLoc = LocationHelper.GetLoc(awaitTask.S_END_LOC);
                                mst.S_TYPE = "叫料出库任务";
                            }
                        }
@@ -1078,36 +1076,33 @@
                }
            }
            if (agvEndLoc == null)
            if (endLoc == null)
            {
                string msg = "";
                if (applyType == "2" || applyType == "3" || applyType == "4")
                if (applyType == "2")
                {
                    cst.S_TYPE = cst.S_TYPE + "【异常】";
                    msg = "工装异常";
                }
                // TODO 反馈斜裁立库异常,请求斜裁入库终点
                agvEndLoc = null;
                string locCode = "XCCRKZTKQ-1-1";
                endLoc = LocationHelper.GetLoc(locCode);
            }
            if (agvEndLoc != null)
            if (endLoc != null)
            {
                destLoc = agvEndLoc.S_CODE;
                cst.S_END_LOC = agvEndLoc.S_CODE;
                cst.S_END_AREA = agvEndLoc.S_AREA_CODE;
                cst.S_END_LOC = endLoc.S_CODE;
                cst.S_END_AREA = endLoc.S_AREA_CODE;
                WCSHelper.UpdateEndLoc(cst);
            }
            if (wmsEndLoc != null)
            {
                mst.S_END_LOC = wmsEndLoc.S_CODE;
                mst.S_END_AREA = wmsEndLoc.S_AREA_CODE;
                mst.S_END_LOC = endLoc.S_CODE;
                mst.S_END_AREA = endLoc.S_AREA_CODE;
                WMSHelper.UpdateTaskEnd(mst);
                return endLoc.S_CODE;
            }
            return destLoc;
            return null;
        }
        /// <summary>
@@ -1288,25 +1283,9 @@
                        return null;
                    }
                }
            }
            if (agvEndLoc != null && wmsEndLoc != null)
            {
                destLoc = agvEndLoc.S_CODE;
                cst.S_END_LOC = agvEndLoc.S_CODE;
                cst.S_END_AREA = agvEndLoc.S_AREA_CODE;
                WCSHelper.UpdateEndLoc(cst);
                mst.S_END_LOC = wmsEndLoc.S_CODE;
                mst.S_END_AREA = wmsEndLoc.S_AREA_CODE;
                WMSHelper.UpdateTaskEnd(mst);
            }
            // 重新发起新任务
            if (applyType != "1")
            {
                var mesTask = WMSHelper.GetLjMesTaskByAgvorderId(mst.S_CODE);
                if (mesTask != null)
                if (mesTask != null)
                {
                    if (mst.S_TYPE.Contains("叫料出库任务"))
                    {
@@ -1321,7 +1300,7 @@
                        var logicConfig = WMSHelper.getLogicConfigByJtCode(mesTask.EQP);
                        if (logicConfig != null)
                        {
                            triggerItemOffLineFlow4(mesTask.POSITION_ID, mst.S_CNTR_CODE, logicConfig ,mesTask);
                            triggerItemOffLineFlow4(mesTask.POSITION_ID, mst.S_CNTR_CODE, logicConfig, mesTask);
                        }
                        else
                        {
@@ -1329,6 +1308,18 @@
                        }
                    }
                }
            }
            if (agvEndLoc != null && wmsEndLoc != null)
            {
                destLoc = agvEndLoc.S_CODE;
                cst.S_END_LOC = agvEndLoc.S_CODE;
                cst.S_END_AREA = agvEndLoc.S_AREA_CODE;
                WCSHelper.UpdateEndLoc(cst);
                mst.S_END_LOC = wmsEndLoc.S_CODE;
                mst.S_END_AREA = wmsEndLoc.S_AREA_CODE;
                WMSHelper.UpdateTaskEnd(mst);
            }
            return destLoc;
        }
@@ -1357,7 +1348,7 @@
                        if (locCntrRels.Count > 0)
                        {
                            cntrCode = locCntrRels[0].S_CNTR_CODE;
                            middleLoc = WMSHelper.GetTransfeRelevanceLoc(startLoc.S_AREA_CODE, 1, 2);
                            middleLoc = WMSHelper.GetTransfeRelevanceLoc(startLoc.S_AREA_CODE, 2, 2);
                            if (middleLoc != null)
                            {
                                // 1.创建成新机叫料作业
@@ -1456,136 +1447,164 @@
        /// <param name="mesTaskId"></param>
        public static void callMaterialXC(string materialCode, string endLocCode, int mesTaskId)
        {
            // 1.查询环带库物料库存
            DateTime inStockTimeXc = DateTime.MinValue;
            List<CntrItemRel> cntrItemRelsXc = new List<CntrItemRel>();
            if (cntrItemRelsXc.Count > 0)
            {
                inStockTimeXc = cntrItemRelsXc[0].T_INBOUND_TIME;
            }
            // 2.查询中转库库存
            DateTime inStockTime = DateTime.MinValue;
            var cntrItemRels = WMSHelper.getZZKInventoryInfo(materialCode);
            if (cntrItemRels.Count > 0)
            {
                inStockTime = cntrItemRels[0].T_INBOUND_TIME;
            }
            // 3.根据先进先出计算出库的物料是环带库 还是中转库
            var mesTask = WMSHelper.GetLjMesTaskById(mesTaskId);
            if (inStockTime >= inStockTimeXc)
            if (mesTask != null)
            {
                //斜裁物料出库
                if (cntrItemRelsXc.Count > 0)
                // 1.查询环带库物料库存最早入库时间
                DateTime inStockTimeXc = DateTime.MinValue;
                // 2.查询中转库库存
                DateTime inStockTime = WMSHelper.getZZKInventoryInfo(materialCode);
                // 3.根据先进先出计算出库的物料是环带库 还是中转库
                if (inStockTime >= inStockTimeXc)
                {
                    // 4.将MES任务写入环带库任务中间表
                    WMSHelper.addLjXcTask(mesTask);
                }
            }
            else
            {
                //中转库物料出库
                if (cntrItemRels.Count > 0)
                {
                    var cntrItemRel = cntrItemRels[0];
                    var locCntrRel = LocationHelper.GetLocCntrByCntr(cntrItemRel.S_CNTR_CODE);
                    if (locCntrRel != null)
                    Location endLoc = WMSHelper.getCallMaterialLocCode(mesTask.EQP);
                    if (endLoc != null)
                    {
                      var endLoc = LocationHelper.GetLoc(locCntrRel.S_LOC_CODE);
                        if (endLoc != null)
                        // 4.创建斜裁-成新机叫料作业
                        var wmsTask = new WMSTask()
                        {
                            S_CODE = WMSHelper.GenerateTaskNo(),
                            S_CNTR_CODE = "",
                            S_START_LOC = "虚拟起点",
                            S_START_AREA = "虚拟库区",
                            S_END_LOC = endLoc.S_CODE,
                            S_END_AREA = endLoc.S_AREA_CODE,
                            S_TYPE = "叫料出库任务",
                            S_OP_DEF_CODE = mesTask.ID.ToString(),
                            S_OP_DEF_NAME = "成型机叫料出库任务(斜裁)",
                            T_START_TIME = DateTime.Now,
                            N_B_STATE = 0
                        };
                        if (WMSHelper.CreateWmsTask(wmsTask))
                        {
                            WCSTask wcsTask = new WCSTask()
                            {
                                S_OP_NAME = wmsTask.S_OP_DEF_NAME,
                                S_OP_CODE = wmsTask.S_CODE,
                                S_CODE = WCSHelper.GenerateTaskNo(),
                                S_CNTR_CODE = wmsTask.S_CNTR_CODE,
                                S_TYPE = wmsTask.S_TYPE,
                                S_START_LOC = wmsTask.S_START_LOC,
                                S_START_AREA = wmsTask.S_START_AREA,
                                S_END_LOC = endLoc.S_CODE,
                                S_END_AREA = endLoc.S_AREA_CODE,
                                S_SCHEDULE_TYPE = "AGV",
                                N_PRIORITY = 10,
                                T_START_TIME = DateTime.Now,
                                N_B_STATE = -1,
                                S_B_STATE = "预创建",
                            };
                            if (WCSHelper.CreateTask(wcsTask))
                            {
                                // 起点、终点加锁
                                LocationHelper.LockLoc(wcsTask.S_START_LOC, 2);
                                LocationHelper.LockLoc(wcsTask.S_END_LOC, 1);
                                // 5.将MES任务写入斜裁任务中间表
                                mesTask.AGVORDER_ID = wcsTask.S_CODE;
                                WMSHelper.addLjXcTask(mesTask);
                            }
                        }
                    }
                }
                else
                {
                    //中转库物料出库
                    Location startLoc = WMSHelper.getOutStockStartLoc(null, materialCode);
                    if (startLoc != null)
                    {
                        var locCntrRels = LocationHelper.GetLocCntr(startLoc.S_CODE);
                        if (locCntrRels != null && locCntrRels.Count > 0)
                        {
                            Location middleLoc = null;
                            Location startLoc = WMSHelper.getOutStockStartLoc(null, materialCode);
                            if (startLoc != null)
                            Location endLoc = WMSHelper.getCallMaterialLocCode(mesTask.EQP);
                            if (endLoc != null)
                            {
                                var locCntrRels = LocationHelper.GetLocCntr(startLoc.S_CODE);
                                if (locCntrRels.Count > 0)
                                middleLoc = WMSHelper.GetTransfeRelevanceLoc(startLoc.S_AREA_CODE, 2, 2);
                                if (middleLoc != null)
                                {
                                    var cntrCode = cntrItemRel.S_CNTR_CODE;
                                    middleLoc = WMSHelper.GetTransfeRelevanceLoc(startLoc.S_AREA_CODE, 1, 2);
                                    if (middleLoc != null)
                                    // 1.创建成新机叫料作业
                                    var wmsTask = new WMSTask()
                                    {
                                        // 1.创建成新机叫料作业
                                        var wmsTask = new WMSTask()
                                        S_CNTR_CODE = locCntrRels[0].S_CNTR_CODE,
                                        S_CODE = WMSHelper.GenerateTaskNo(),
                                        S_START_LOC = startLoc.S_CODE,
                                        S_START_AREA = startLoc.S_AREA_CODE,
                                        S_END_LOC = endLoc.S_CODE,
                                        S_END_AREA = endLoc.S_AREA_CODE,
                                        S_TYPE = "叫料出库任务",
                                        S_OP_DEF_CODE = mesTaskId.ToString(),
                                        S_OP_DEF_NAME = "成型机叫料出库任务",
                                        T_START_TIME = DateTime.Now,
                                    };
                                    if (WMSHelper.CreateWmsTask(wmsTask))
                                    {
                                        WCSTask wcsTask = new WCSTask()
                                        {
                                            S_CNTR_CODE = cntrCode,
                                            S_CODE = WMSHelper.GenerateTaskNo(),
                                            S_OP_NAME = wmsTask.S_OP_DEF_NAME,
                                            S_OP_CODE = wmsTask.S_CODE,
                                            S_CODE = WCSHelper.GenerateTaskNo(),
                                            S_CNTR_CODE = wmsTask.S_CNTR_CODE,
                                            S_TYPE = wmsTask.S_TYPE,
                                            S_START_LOC = startLoc.S_CODE,
                                            S_START_AREA = startLoc.S_AREA_CODE,
                                            S_END_LOC = endLoc.S_CODE,
                                            S_END_AREA = endLoc.S_AREA_CODE,
                                            S_TYPE = "叫料出库任务",
                                            S_OP_DEF_CODE = mesTaskId.ToString(),
                                            S_OP_DEF_NAME = "成型机叫料出库任务",
                                            S_END_LOC = middleLoc.S_CODE,
                                            S_END_AREA = middleLoc.S_AREA_CODE,
                                            S_SCHEDULE_TYPE = "WCS",
                                            N_PRIORITY = 10,
                                            T_START_TIME = DateTime.Now,
                                        };
                                        if (WMSHelper.CreateWmsTask(wmsTask))
                                        if (WCSHelper.CreateTask(wcsTask))
                                        {
                                            WCSTask wcsTask = new WCSTask()
                                            {
                                                S_OP_NAME = wmsTask.S_OP_DEF_NAME,
                                                S_OP_CODE = wmsTask.S_CODE,
                                                S_CODE = WCSHelper.GenerateTaskNo(),
                                                S_CNTR_CODE = wmsTask.S_CNTR_CODE,
                                                S_TYPE = wmsTask.S_TYPE,
                                                S_START_LOC = startLoc.S_CODE,
                                                S_START_AREA = startLoc.S_AREA_CODE,
                                                S_END_LOC = middleLoc.S_CODE,
                                                S_END_AREA = middleLoc.S_AREA_CODE,
                                                S_SCHEDULE_TYPE = "WCS",
                                                N_PRIORITY = 10,
                                                T_START_TIME = DateTime.Now,
                                            };
                                            // 起点、终点加锁
                                            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);
                                                // 更新作业任务状态
                                                wmsTask.N_B_STATE = 1;
                                                WMSHelper.UpdateTaskState(wmsTask);
                                            }
                                            // 预创建二段任务
                                            WCSTask twoWcsTask = new WCSTask()
                                            {
                                                S_OP_NAME = wmsTask.S_OP_DEF_NAME,
                                                S_OP_CODE = wmsTask.S_CODE,
                                                S_CODE = WCSHelper.GenerateTaskNo(),
                                                S_CNTR_CODE = wmsTask.S_CNTR_CODE,
                                                S_TYPE = wmsTask.S_TYPE,
                                                S_START_LOC = middleLoc.S_CODE,
                                                S_START_AREA = middleLoc.S_AREA_CODE,
                                                S_END_LOC = endLoc.S_CODE,
                                                S_END_AREA = endLoc.S_AREA_CODE,
                                                S_SCHEDULE_TYPE = "AGV",
                                                N_PRIORITY = 10,
                                                T_START_TIME = DateTime.Now,
                                                N_B_STATE = -1
                                            };
                                            WCSHelper.CreateTask(twoWcsTask);
                                            WMSHelper.readLjMesCallItemTask(wmsTask.S_CODE, mesTaskId);
                                            // 更新作业任务状态
                                            wmsTask.N_B_STATE = 1;
                                            WMSHelper.UpdateTaskState(wmsTask);
                                        }
                                    }
                                    else
                                    {
                                        WMSHelper.addAlarmRecord("流程异常", "高", $"成型机叫料失败,库区{startLoc.S_AREA_CODE}未查询到可用的接驳位");
                                        // 预创建二段任务
                                        WCSTask twoWcsTask = new WCSTask()
                                        {
                                            S_OP_NAME = wmsTask.S_OP_DEF_NAME,
                                            S_OP_CODE = wmsTask.S_CODE,
                                            S_CODE = WCSHelper.GenerateTaskNo(),
                                            S_CNTR_CODE = wmsTask.S_CNTR_CODE,
                                            S_TYPE = wmsTask.S_TYPE,
                                            S_START_LOC = middleLoc.S_CODE,
                                            S_START_AREA = middleLoc.S_AREA_CODE,
                                            S_END_LOC = endLoc.S_CODE,
                                            S_END_AREA = endLoc.S_AREA_CODE,
                                            S_SCHEDULE_TYPE = "AGV",
                                            N_PRIORITY = 10,
                                            T_START_TIME = DateTime.Now,
                                            N_B_STATE = -1
                                        };
                                        WCSHelper.CreateTask(twoWcsTask);
                                        WMSHelper.readLjMesCallItemTask(wmsTask.S_CODE, mesTaskId);
                                    }
                                }
                                else
                                {
                                    WMSHelper.addAlarmRecord("流程异常", "高", $"成型机叫料失败,开始货位:{startLoc.S_CODE}异常,缺少容器信息");
                                    WMSHelper.addAlarmRecord("流程异常", "高", $"成型机叫料失败,库区{startLoc.S_AREA_CODE}未查询到可用的接驳位");
                                }
                            }
                            else
                            {
                                mesTask.AWAIT_MSG = "库存不足";
                                WMSHelper.updateLjMesTask(mesTask);
                                WMSHelper.addAlarmRecord("流程异常", "高", $"成型机叫料失败,物料:{materialCode}库存不足");
                                WMSHelper.addAlarmRecord("流程异常", "高", $"成型机叫料失败,开始货位:{startLoc.S_CODE}异常,缺少容器信息");
                            }
                        }
                        else
                        {
                            mesTask.AWAIT_MSG = "库存不足";
                            WMSHelper.updateLjMesTask(mesTask);
                            WMSHelper.addAlarmRecord("流程异常", "高", $"成型机叫料失败,物料:{materialCode}库存不足");
                        }
                    }
                }
@@ -1635,7 +1654,7 @@
                S_START_AREA = startLoc.S_AREA_CODE,
                S_END_LOC = endLoc.S_CODE,
                S_END_AREA = endLoc.S_AREA_CODE,
                S_TYPE = "余料/空工装入库任务" + suffix,
                S_TYPE = "余料/空工装入库任务",
                S_OP_DEF_CODE = mesTask.ID.ToString(),
                S_OP_DEF_NAME = "余料/空工装入库" + suffix,
                T_START_TIME = DateTime.Now
@@ -1704,7 +1723,7 @@
                        S_OP_CODE = mst.S_CODE,
                        S_CODE = WCSHelper.GenerateTaskNo(),
                        S_CNTR_CODE = cst.S_CNTR_CODE,
                        S_TYPE = "不合格品回库",
                        S_TYPE = "不合格品入库任务",
                        S_START_LOC = startLoc.S_CODE,
                        S_START_AREA = startLoc.S_AREA_CODE,
                        S_END_LOC = agvEndLoc.S_CODE,
@@ -1738,7 +1757,7 @@
                            S_OP_CODE = mst.S_CODE,
                            S_CODE = WCSHelper.GenerateTaskNo(),
                            S_CNTR_CODE = cst.S_CNTR_CODE,
                            S_TYPE = "不合格品回库",
                            S_TYPE = "不合格品入库任务",
                            S_START_LOC = startLoc.S_CODE,
                            S_START_AREA = startLoc.S_AREA_CODE,
                            S_END_LOC = agvEndLoc.S_CODE,
@@ -1762,7 +1781,7 @@
                            S_OP_CODE = mst.S_CODE,
                            S_CODE = WCSHelper.GenerateTaskNo(),
                            S_CNTR_CODE = cst.S_CNTR_CODE,
                            S_TYPE = "不合格品回库",
                            S_TYPE = "不合格品入库任务",
                            S_START_LOC = agvEndLoc.S_CODE,
                            S_START_AREA = agvEndLoc.S_AREA_CODE,
                            S_END_LOC = wmsEndLoc.S_CODE,
@@ -2134,6 +2153,83 @@
            return result;
        }
        /// <summary>
        /// 斜裁物料出库任务
        /// </summary>
        /// <param name="model"></param>
        /// <returns></returns>
        public static ResponseResult createXcItemOutStockTask(XcItemOutStockModel model)
        {
            ResponseResult responseResult = new ResponseResult();
            Location startLoc = LocationHelper.GetLoc(model.startLoc);
            if (startLoc == null)
            {
                WMSHelper.addAlarmRecord("流程异常", "高", $"成型机叫料出库(斜裁),起点:{model.startLoc}在WMS系统中不存在");
                responseResult.code = 201;
                responseResult.msg = $"起点:{model.startLoc}在WMS系统中不存在";
                return responseResult;
            }
            Location endLoc = WMSHelper.getCallMaterialLocCode(model.eqNo);
            if (endLoc != null)
            {
                var wmsTask = WMSHelper.GetWmsTaskByCntr(model.palletId);
                if (wmsTask == null)
                {
                    ContainerHelper.AddCntr(model.palletId);
                    // 1.创建斜裁-成新机叫料作业
                    wmsTask = new WMSTask()
                    {
                        S_CNTR_CODE = model.palletId,
                        S_CODE = WMSHelper.GenerateTaskNo(),
                        S_START_LOC = startLoc.S_CODE,
                        S_START_AREA = startLoc.S_AREA_CODE,
                        S_END_LOC = endLoc.S_CODE,
                        S_END_AREA = endLoc.S_AREA_CODE,
                        S_TYPE = "叫料出库任务",
                        S_OP_DEF_CODE = model.reqId,
                        S_OP_DEF_NAME = "成型机叫料出库任务(斜裁)",
                        T_START_TIME = DateTime.Now,
                    };
                    if (WMSHelper.CreateWmsTask(wmsTask))
                    {
                        WCSTask wcsTask = new WCSTask()
                        {
                            S_OP_NAME = wmsTask.S_OP_DEF_NAME,
                            S_OP_CODE = wmsTask.S_CODE,
                            S_CODE = WCSHelper.GenerateTaskNo(),
                            S_CNTR_CODE = wmsTask.S_CNTR_CODE,
                            S_TYPE = wmsTask.S_TYPE,
                            S_START_LOC = startLoc.S_CODE,
                            S_START_AREA = startLoc.S_AREA_CODE,
                            S_END_LOC = endLoc.S_CODE,
                            S_END_AREA = endLoc.S_AREA_CODE,
                            S_SCHEDULE_TYPE = "AGV",
                            N_PRIORITY = 10,
                            T_START_TIME = DateTime.Now,
                        };
                        if (WCSHelper.CreateTask(wcsTask))
                        {
                            // 起点、终点加锁
                            LocationHelper.LockLoc(wcsTask.S_START_LOC, 2);
                            LocationHelper.LockLoc(wcsTask.S_END_LOC, 1);
                            // 更新作业任务状态
                            wmsTask.N_B_STATE = 1;
                            WMSHelper.UpdateTaskState(wmsTask);
                        }
                    }
                }
            }
            else
            {
                responseResult.code = 201;
                responseResult.msg = $"成型机机台:{model.eqNo}没有空余的叫料货位";
            }
            return responseResult;
        }
        //----------------------------------------------------------------------------------------------------------------------------
        public class LocModel
        {