杨前锦
2025-06-05 01cc5773457f68274ef1b2d9d9daca8983761828
HH.WCS.Mobox3/HH.WCS.Mobox3.YNJT_BZP/api/ApiHelper.cs
@@ -49,6 +49,17 @@
                    {
                        foreach (var item in itemInfos)
                        {
                            // 将MES的物料状态转化成WMS可识别的物料状态
                            if (item.jdge == "" || item.jdge == null)
                            {
                                item.jdge = "OK";
                            }
                            else if(item.jdge != "OK")
                            {
                                item.jdge = "HOLD";
                            }
                            // 计算生效时间、失效时间
                            var overage = WMSHelper.getOverage(item.bc_entried);
                            if (overage != null)
                            {
@@ -120,6 +131,7 @@
                        S_END_AREA = endLoc.S_AREA_CODE,
                        S_TYPE = model.taskType,
                        S_OP_DEF_CODE = model.taskNo,
                        S_OP_DEF_NAME = "半制品/余料/空托下发入库任务",
                        N_PRIORITY = model.priority,
                        T_START_TIME = DateTime.Now,
                    };
@@ -182,95 +194,14 @@
            ReturnResult result = new ReturnResult();
            try
            {
                Location startLoc = WMSHelper.GetEmptyTrayStartLoc(model.trayType);
                Location middleLoc = null;
                string cntrCode = "";
                string descCntrCode = "";
                if (startLoc != null)
                EmptyTrayBuffer buffer = new EmptyTrayBuffer()
                {
                    // 查询货位容器编码 、目标容器编码
                    var locCntrRels = LocationHelper.GetLocCntrRel(startLoc.S_CODE);
                    if (locCntrRels.Count > 0)
                    {
                        foreach (var item in locCntrRels)
                        {
                            var container = ContainerHelper.GetCntr(item.S_CNTR_CODE);
                            if (model.trayType == container.N_TYPE)
                            {
                                descCntrCode = item.S_CNTR_CODE;
                            }
                            cntrCode = cntrCode + "," + item.S_CNTR_CODE;
                        }
                        cntrCode = cntrCode.Substring(1, cntrCode.Length - 1);
                    }
                    var locCodes = Settings.getAgvJBLocList(1, startLoc.N_ROADWAY, 2);
                    if (locCodes.Count > 0)
                    {
                        middleLoc = LocationHelper.GetLoc(locCodes[0]);
                    }
                }
                Location endLoc = LocationHelper.GetLoc(model.endLoc);
                if (endLoc == null)
                {
                    result.ResultCode = 1;
                    result.ResultMsg = "WMS系统没有该货位,请检查终点货位编码是否正确";
                    return result;
                }
                if (startLoc != null)
                {
                    var wmsTask = new WMSTask()
                    {
                        S_CNTR_CODE = descCntrCode,
                        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.taskNo,
                        N_PRIORITY = model.priority,
                        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 = cntrCode,
                            S_TYPE = wmsTask.S_TYPE + "-1",
                            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 = 1,
                            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
                {
                    result.ResultCode = 1;
                    result.ResultMsg = "库内没有查到空托盘";
                }
                    TASK_NO = model.taskNo,
                    TRAY_TYPE = model.trayType,
                    END_LOC = model.endLoc,
                    PRIORITY = model.priority,
                };
                WMSHelper.addEmptyTrayBuffer(buffer);
            }
            catch (Exception ex)
            {
@@ -291,89 +222,109 @@
            ReturnResult result = new ReturnResult();
            try
            {
                Location startLoc = WMSHelper.GetoutStockStartLoc(model.itemCode);
                Location middleLoc = null;
                string descCntrCode = "";
                string cntrCode = "";
                if (startLoc != null)
                Location endLoc = LocationHelper.GetLoc(model.endLoc);
                if (endLoc.N_CURRENT_NUM == 0)
                {
                    // 查询接驳位
                    var locCodes = Settings.getAgvJBLocList(1, startLoc.N_ROADWAY, 2);
                    if (locCodes.Count > 0)
                    int taskNum = 0;
                    for (int i = 0; i < endLoc.N_CAPACITY; i++)
                    {
                        middleLoc = LocationHelper.GetLoc(locCodes[0]);
                        Location startLoc = WMSHelper.GetoutStockStartLoc(model.itemCode);
                        Location middleLoc = null;
                        string descCntrCode = "";
                        string cntrCode = "";
                        if (startLoc != null)
                        {
                            // 查询接驳位
                            var locCodes = Settings.getAgvJBLocList(startLoc.N_ROADWAY, 2);
                            if (locCodes.Count > 0)
                            {
                                middleLoc = LocationHelper.GetLoc(locCodes[0]);
                            }
                            // 查询货位容器编码 、目标容器编码
                            var locCntrRels = LocationHelper.GetLocCntrRel(startLoc.S_CODE);
                            if (locCntrRels.Count > 0)
                            {
                                foreach (var item in locCntrRels)
                                {
                                    var cntrItemRels = ContainerHelper.GetCntrItemRel(item.S_CNTR_CODE);
                                    if (cntrItemRels.Count > 0)
                                    {
                                        descCntrCode = cntrItemRels[0].S_CNTR_CODE;
                                    }
                                    cntrCode = cntrCode + "," + item.S_CNTR_CODE;
                                }
                                cntrCode = cntrCode.Substring(1, cntrCode.Length - 1);
                            }
                        }
                        else
                        {
                            LogHelper.Info($"库内没有物料:{model.itemCode}", "WMS");
                            break;
                        }
                        if (endLoc != null)
                        {
                            var wmsTask = new WMSTask()
                            {
                                S_CNTR_CODE = descCntrCode,
                                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.taskNo,
                                S_OP_DEF_NAME = "成型机叫料出库任务",
                                N_PRIORITY = model.priority,
                                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 = cntrCode,
                                    S_TYPE = wmsTask.S_TYPE + "-1",
                                    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 = 1,
                                    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);
                                    taskNum++;
                                }
                            }
                        }
                    }
                    // 查询货位容器编码 、目标容器编码
                    var locCntrRels = LocationHelper.GetLocCntrRel(startLoc.S_CODE);
                    if (locCntrRels.Count > 0)
                    if (taskNum < endLoc.N_CAPACITY)
                    {
                        foreach (var item in locCntrRels)
                        {
                            var cntrItemRels = ContainerHelper.GetCntrItemRel(item.S_CNTR_CODE);
                            if (cntrItemRels.Count > 0)
                            {
                                descCntrCode = cntrItemRels[0].S_CNTR_CODE;
                            }
                            cntrCode = cntrCode + "," + item.S_CNTR_CODE;
                        }
                        cntrCode = cntrCode.Substring(1, cntrCode.Length - 1);
                        result.ResultCode = 1;
                        result.ResultMsg = $"库内物料不足,已生成出库任务数:{taskNum}";
                    }
                }
                else 
                {
                    result.ResultCode = 1;
                    result.ResultMsg = "库内没有查到此物料";
                    return result;
                }
                Location endLoc = LocationHelper.GetLoc(model.endLoc);
                if (endLoc != null)
                {
                    var wmsTask = new WMSTask()
                    {
                        S_CNTR_CODE = descCntrCode,
                        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.taskNo,
                        N_PRIORITY = model.priority,
                        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 = cntrCode,
                            S_TYPE = wmsTask.S_TYPE + "-1",
                            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 = 1,
                            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);
                        }
                    }
                    result.ResultMsg = "终点货位当前容量不为0,无法叫料";
                }
            }
            catch (Exception ex)
@@ -399,8 +350,18 @@
                {
                    foreach (var item in model.itemInfo)
                    {
                        // 将MES的物料状态转化成WMS可识别的物料状态
                        if (item.jdge == "" || item.jdge == null)
                        {
                            item.jdge = "OK";
                        }
                        else if (item.jdge != "OK")
                        {
                            item.jdge = "HOLD";
                        }
                        var overage = WMSHelper.getOverage(item.bc_entried);
                        if (overage != null)
                        if (overage != null && overage.OVERAGE != 0)
                        {
                            DateTime txndate = DateTime.Parse(item.txndate);
                            DateTime minTime = txndate.AddHours(overage.MINHOUR);
@@ -442,6 +403,7 @@
                            S_END_AREA = endLoc.S_AREA_CODE,
                            S_TYPE = "人工入库任务",
                            S_OP_DEF_CODE = model.taskNo,
                            S_OP_DEF_NAME = "人工入库任务",
                            N_PRIORITY = model.priority,
                            T_START_TIME = DateTime.Now,
                        };
@@ -506,7 +468,7 @@
            ReturnResult result = new ReturnResult();
            try
            {
                Location startLoc = WMSHelper.GetoutStockStartLoc(model.itemCode , model.endLoc);
                Location startLoc = WMSHelper.GetoutStockStartLoc(model.itemCode,model.trayCode , model.endLoc);
                Location endLoc = LocationHelper.GetLoc(model.endLoc);
                if (startLoc != null)
@@ -538,6 +500,7 @@
                        S_END_AREA = endLoc.S_AREA_CODE,
                        S_TYPE = "人工出库任务",
                        S_OP_DEF_CODE = model.taskNo,
                        S_OP_DEF_NAME = "人工出库任务",
                        N_PRIORITY = model.priority,
                        T_START_TIME = DateTime.Now,
                    };
@@ -576,7 +539,7 @@
                else
                {
                    result.ResultCode = 1;
                    result.ResultMsg = "库内没有此物料";
                    result.ResultMsg = "库内没有满足条件的物料";
                }
            }
            catch (Exception ex)
@@ -633,6 +596,7 @@
                            S_END_AREA = endLoc.S_AREA_CODE,
                            S_TYPE = "母拖入库任务",
                            S_OP_DEF_CODE = taskNo,
                            S_OP_DEF_NAME = "母拖入库任务",
                            N_PRIORITY = 1,
                            T_START_TIME = DateTime.Now,
                        };
@@ -689,20 +653,25 @@
        /// <param name="loc"></param>
        /// <param name="wmsTaskNo"></param>
        /// <returns></returns>
        public static ReturnResult baseTrayInStockAgv(string loc, string wmsTaskNo)
        public static ReturnResult autoBaseTrayInStock(string loc, string wmsTaskNo)
        {
            ReturnResult result = new ReturnResult();
            try
            {
                var mst = WMSHelper.GetWmsTask(wmsTaskNo);
                if (mst != null && mst.N_B_STATE < 2)
                var cst = WCSHelper.GetTaskByStart(loc);
                if (cst == null)
                {
                    Location startLoc = LocationHelper.GetLoc(loc);
                    Location endLoc = LocationHelper.GetLoc(Settings.baseTrayInBufferLoc);
                    if (!(endLoc != null && endLoc.N_CURRENT_NUM == 0))
                    Location endLoc = null;
                    var baseTrayBufferLoc = Settings.baseTrayBufferLocList.Where(a => a.bufferOutLoc == loc).FirstOrDefault();
                    if (baseTrayBufferLoc != null)
                    {
                        endLoc = LocationHelper.GetLoc(baseTrayBufferLoc.bufferInLoc);
                    }
                    if (endLoc == null || endLoc.N_CURRENT_NUM > 0)
                    {
                        endLoc = WMSHelper.GetInstockEndLoc(0, loc, 2);
                    }
                    }
                    if (endLoc != null && startLoc != null)
                    {
@@ -727,8 +696,7 @@
                            // 创建一段入库任务
                            WCSTask wcsTask = new WCSTask()
                            {
                                S_OP_NAME = mst.S_OP_DEF_NAME,
                                S_OP_CODE = mst.S_CODE,
                                S_OP_CODE = wmsTaskNo,
                                S_CODE = WCSHelper.GenerateTaskNo(),
                                S_CNTR_CODE = trayCode,
                                S_TYPE = "母拖入库任务",
@@ -771,33 +739,15 @@
        /// <param name="loc"></param>
        /// <param name="taskNo"></param>
        /// <returns></returns>
        public static ReturnResult baseTrayOutStock(string loc ,string taskNo)
        public static ReturnResult baseTrayOutStock(string loc ,string taskNo ,int exclude = 1)
        {
            LogHelper.Info("【母拖出库任务】开始下发母拖出库任务", "WMS");
            ReturnResult result = new ReturnResult();
            try
            {
                Location startLoc = LocationHelper.GetLoc(Settings.baseTrayInBufferLoc);
                Location startLoc = WMSHelper.GetEmptyTrayStartLoc(0, exclude);
                Location endLoc = LocationHelper.GetLoc(loc);
                var agvJBLoc = Settings.getAgvJBLoc(loc);
                if (startLoc != null && startLoc.N_CURRENT_NUM == 1 && agvJBLoc.type == 1)
                {
                   var locCntrRels = LocationHelper.GetLocCntrRel(startLoc.S_CODE);
                    if (locCntrRels.Count > 0)
                    {
                        var container = ContainerHelper.GetCntr(locCntrRels[0].S_CNTR_CODE);
                        if (container.N_TYPE != 0)
                        {
                            startLoc = null;
                        }
                    }
                }
                if(startLoc == null || startLoc.N_CURRENT_NUM != 1)
                {
                    startLoc = WMSHelper.GetEmptyTrayStartLoc(0);
                }
                if (startLoc != null)
                {
@@ -819,6 +769,7 @@
                            S_END_AREA = endLoc.S_AREA_CODE,
                            S_TYPE = "母拖出库任务",
                            S_OP_DEF_CODE = taskNo,
                            S_OP_DEF_NAME = "母拖出库任务",
                            N_PRIORITY = 1,
                            T_START_TIME = DateTime.Now,
                        };
@@ -877,15 +828,15 @@
        /// <param name="loc"></param>
        /// <param name="wmsTaskNo"></param>
        /// <returns></returns>
        public static ReturnResult baseTrayOutStockAgv(string loc, string wmsTaskNo)
        public static ReturnResult autoBaseTrayOutStock(string loc, string wmsTaskNo)
        {
            ReturnResult result = new ReturnResult();
            try
            {
                var mst = WMSHelper.GetWmsTask(wmsTaskNo);
                if (mst != null && mst.N_B_STATE < 2)
                var cst = WCSHelper.GetTaskByEnd(loc);
                if (cst == null)
                {
                    Location startLoc = WMSHelper.GetEmptyTrayStartLoc(0);
                    Location startLoc = WMSHelper.GetEmptyTrayStartLoc(0, 0);
                    Location endLoc = LocationHelper.GetLoc(loc);
                    if (startLoc != null)
@@ -902,8 +853,7 @@
                            // 创建入库任务
                            WCSTask wcsTask = new WCSTask()
                            {
                                S_OP_NAME = mst.S_OP_DEF_NAME,
                                S_OP_CODE = mst.S_CODE,
                                S_OP_CODE = wmsTaskNo,
                                S_CODE = WCSHelper.GenerateTaskNo(),
                                S_CNTR_CODE = trayCode,
                                S_TYPE = "母拖出库任务",
@@ -984,10 +934,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, "强制完成");
@@ -1004,7 +953,7 @@
                                if(mst.N_B_STATE != 2)
                                {
                                    // 创建下个任务
                                    if (cst.S_TYPE.Contains("出库") && !cst.S_TYPE.Contains("母拖"))
                                    if (cst.S_TYPE.Contains("出库") && !cst.S_TYPE.Contains("母拖") && !cst.S_TYPE.Contains("人工"))
                                    {
                                        WCSCore.createLastTask(cst.S_END_LOC, mst, 2);
                                    }
@@ -1015,6 +964,35 @@
                }  
            }
            return responseResult;
        }
        /// <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>
@@ -1124,9 +1102,6 @@
                    BOM3 = matl.bom3,
                    S_FOVRAGE = matl.fovrage,
                    S_JDGE = matl.jdge,
                    S_WMS_JDGE = matl.WMS_jdge,
                    EFFECTIVE_TIME = matl.effective_time,
                    EXPIRATION_TIME = matl.expiration_time,
                    LAST_MODIFY_TIME = matl.last_modify_time
                };
                itemBarcodeInfos.Add(itemBarcodeInfo);
@@ -1169,7 +1144,6 @@
            if (overages != null && overages.Count > 0) 
            {
                List<Overage> overageList = new List<Overage>();
                foreach (var item in overages)
                {
                    Overage overage = new Overage
@@ -1177,8 +1151,9 @@
                        MCNGRP = item.mcngrp,
                        ITEMPATT = item.itempatt,
                        OVERAGE = item.overage,
                        MINHOUR = int.Parse(item.minhour.ToString()) ,
                        MINHOUR = float.Parse(item.minhour.ToString()),
                        FLAG_STS = item.flag_sts,
                        RECID = item.recid,
                    };
                    overageList.Add(overage);
                }
@@ -1210,7 +1185,7 @@
            if (!bo)
            {
                responseResult.ResultCode = 1;
                responseResult.ResultMsg = "同步物料状态信息失败";
                responseResult.ResultMsg = "记录数据同步时间失败";
            }
            return responseResult;
        }
@@ -1225,7 +1200,13 @@
        {
            ReturnResult responseResult = new ReturnResult();
            var synDataTime = WMSHelper.getLastDataSynTime(recordTable);
            responseResult.data = synDataTime;
            if (synDataTime != null)
            {
                Dictionary<string, string> map = new Dictionary<string, string>();
                map.Add("S_SYN_TIME", synDataTime.S_SYN_TIME);
                map.Add("RECORD_TABLE", synDataTime.RECORD_TABLE);
                responseResult.data = map;
            }
            return responseResult;
        }
@@ -1290,6 +1271,7 @@
        public class CreateOutOrderModel
        {
            public string taskNo { get; set; } // 任务号
            public string trayCode { get; set; } // 任务号
            public string itemCode { get; set; } // 物料编码
            public string endLoc { get; set; } // 终点货位
            public int priority { get; set; } = 0; // 优先级 默认0