杨前锦
2025-06-13 b7308bba3d7ffad271ce7fc7a93c8c45d76be87d
HH.WCS.Mobox3/HH.WCS.Mobox3.YNJT_PT/api/ApiHelper.cs
@@ -134,7 +134,13 @@
                            EndLocGroup endLocGroup = null;
                            if (barcodeList.Count > 0) 
                            {
                               endLocGroup = WMSHelper.getInStockEndLoc(barcodeList.Count);
                               string itemCode = null;
                               var cntrItemRels = ContainerHelper.GetCntrItemRel(barcodeList[0].rfid);
                               if (cntrItemRels.Count > 0)
                               {
                                    itemCode = cntrItemRels[0].S_ITEM_CODE;
                               }
                               endLocGroup = WMSHelper.getInStockEndLoc(barcodeList.Count, itemCode);
                            }
                            foreach (var ext in extData)
@@ -365,126 +371,120 @@
        {
            ResponseResult response = new ResponseResult();
            //参数校验
            if (model.locCodes.Count == 0)
            int locNum = model.locCodes.Count;
            if (locNum > 0)
            {
                string msg = $"硫化机:{model.mcn}呼叫胚胎出库,参数校验失败,缺少货位信息";
                LogHelper.Info(msg, "WMS");
                response.code = 1;
                response.msg = msg;
                return response;
            }
            // 1.一个硫化机工位只能同时存在一个正在执行中的任务
            WCSTask existTask = WCSHelper.GetTaskByEqNo(model.mcn);
            if (existTask == null)
            {
                // 2.根据当前时间,判断班次日期和班次
                var currentTime = DateTime.Now;
                var shift = getShift(currentTime.TimeOfDay);
                var dateShift = DateTime.Now.ToString("dd/MM/yyyy");
                TimeSpan shiftIII_Start = new TimeSpan(7, 00, 0); // 7:00:00
                if (shift == "III" && currentTime.TimeOfDay < shiftIII_Start)
                Location prevLoc = null;
                Dictionary<string,Location> outLocDic = new Dictionary<string,Location>();
                foreach (var mcn in model.locCodes)
                {
                    dateShift = DateTime.Now.AddDays(-1).ToString("dd/MM/yyyy");
                    // 1.一个硫化机工位只能同时存在一个正在执行中的任务
                    var existTask = WCSHelper.GetTaskByEnd(mcn);
                    if (existTask.Count == 0)
                    {
                        // 2.根据当前时间,判断班次日期和班次
                        var currentTime = DateTime.Now;
                        var shift = getShift(currentTime.TimeOfDay);  // 班次
                        var dateShift = currentTime.ToString("dd/MM/yyyy");
                        TimeSpan shiftIII_Start = new TimeSpan(7, 00, 0); // 7:00:00
                        if (shift == "III" && currentTime.TimeOfDay < shiftIII_Start)
                        {
                            dateShift = DateTime.Now.AddDays(-1).ToString("dd/MM/yyyy");
                        }
                        // 3.根据班次日期+班次+硫化机工位号查询 硫化机工单 中的物料编码、预计生产数量
                        var productionShedule = WMSHelper.getProductionShedule(dateShift, mcn, shift);
                        if (productionShedule != null && productionShedule.QTY != 0)
                        {
                            // 4查询【胚胎已完成的条码中间表】并计算当前班次的已完成数量
                            int finishNum = WMSHelper.getEmbryoFinishNum(dateShift, mcn, shift);
                            if (productionShedule.QTY > finishNum)
                            {
                                // 5.出库策略 1.优先查询前一拖货位的左右两边是否满足条件  2.计算(1.巷道不报警、2.物料状态OK、3.小于失效时间 大于等于生效时间 4.加急料先出、5.先入先出(生产时间))出库物料,生成任务
                                var startLoc = WMSHelper.getOutStockStartLoc(productionShedule.ITEMCODE, prevLoc);
                                if (startLoc != null)
                                {
                                    outLocDic.Add(mcn, startLoc);
                                    prevLoc = startLoc;
                                }
                            }
                        }
                    }
                }
                // 3.根据班次日期+班次+硫化机工位号查询呼叫的物料编码、预计生产数量
                var productionShedule = WMSHelper.getProductionShedule(dateShift, model.mcn, shift);
                if (productionShedule != null && productionShedule.QTY != 0)
                // 6.判断出库货位是否是同一巷道,同一巷道生成任务组号
                string groupNo = null;
                if (outLocDic.Count > 1)
                {
                    // 4.查询【胚胎已完成的条码中间表】并计算当前班次的已完成数量
                    int finishNum = WMSHelper.getEmbryoFinishNum(dateShift, model.mcn, shift);
                    if (productionShedule.QTY > finishNum)
                    var groupNum = outLocDic.Select(a => a.Value).ToList().GroupBy(a => a.N_ROADWAY).Count();
                    if (groupNum == 1)
                    {
                        // 5.计算(1.巷道不报警、2.物料状态OK、3.小于失效时间 大于等于生效时间 4.加急料先出、5.先入先出(生产时间))出库物料,生成任务
                        int locNum = model.locCodes.Count;
                        var startLocData = WMSHelper.getOutStockStartLoc(productionShedule.ITEMCODE,locNum);
                        if (startLocData.startLocList != null && startLocData.startLocList.Count == locNum)
                        groupNo = GenerateTaskGroupNo();
                    }
                }
                // 7.生成出库任务
                if (outLocDic.Count > 0)
                {
                    foreach (var item in outLocDic)
                    {
                        Location endLoc = LocationHelper.GetLoc(item.Key);
                        Location startLoc = item.Value;
                        if (endLoc != null)
                        {
                            var startLocList = startLocData.startLocList;
                            for (int i = 0; i < locNum; i++)
                            var locCntrRels = LocationHelper.GetLocCntr(startLoc.S_CODE);
                            if (locCntrRels != null && locCntrRels.Count > 0)
                            {
                                Location startLoc = startLocList[i];
                                Location endLoc =  LocationHelper.GetLoc(model.locCodes[i]);
                                if (endLoc != null)
                                var wmsTask = new WMSTask()
                                {
                                    var locCntrRels = LocationHelper.GetLocCntr(startLoc.S_CODE);
                                    if (locCntrRels != null && locCntrRels.Count > 0)
                                    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 = model.reqId,
                                    S_OP_DEF_NAME = "成型机满料下线入库",
                                    N_PRIORITY = 1,
                                    T_START_TIME = DateTime.Now,
                                    S_GROUP_NO = groupNo,
                                };
                                if (WMSHelper.CreateWmsTask(wmsTask))
                                {
                                    // 创建一段入库任务
                                    WCSTask wcsTask = new WCSTask()
                                    {
                                        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 = model.reqId,
                                            S_OP_DEF_NAME = "成型机满料下线入库",
                                            N_PRIORITY = 1,
                                            T_START_TIME = DateTime.Now,
                                            S_GROUP_NO = startLocData.groupNo,
                                        };
                                        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 = "WCS",
                                                N_PRIORITY = 1,
                                                T_START_TIME = DateTime.Now,
                                            };
                                        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 = "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);
                                    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);
                                            }
                                        }
                                        // 更新作业任务状态
                                        wmsTask.N_B_STATE = 1;
                                        WMSHelper.UpdateTaskState(wmsTask);
                                    }
                                }
                            }
                        }
                        else
                        {
                            string msg = $"库内没有满足条件的物料";
                            LogHelper.Info(msg, "WMS");
                            response.code = 1;
                            response.msg = msg;
                        }
                    }
                    else
                    {
                        string msg = $"硫化机:{model.mcn}的当前班次任务已完成,停止叫料";
                        LogHelper.Info(msg, "WMS");
                        response.code = 1;
                        response.msg = msg;
                    }
                }
            }
            else
            {
                string msg = $"硫化机:{model.mcn}的存在正在执行中的任务,请勿重复叫料";
                LogHelper.Info(msg, "WMS");
                response.code = 1;
                response.msg = msg;
            }
            return response;
        }
@@ -498,7 +498,7 @@
        {
            ResponseResult response = new ResponseResult();
            Location startLoc = LocationHelper.GetLoc(model.startLoc);
            var endLocGroup = WMSHelper.getInStockEndLoc(1);
            var endLocGroup = WMSHelper.getInStockEndLoc(1,null);
            if (endLocGroup.endLocList.Count == 1)
            {
                Location endLoc = endLocGroup.endLocList[0];
@@ -562,11 +562,10 @@
        public static ResponseResult callEmptyTrayOutStock(CallEmptyTrayOutStockModel model) 
        {
            ResponseResult responseResult = new ResponseResult();
            Location endLoc = LocationHelper.GetLoc(model.endLoc);
            var startLocData = WMSHelper.getOutStockStartLoc(null, 1);
            if (startLocData.startLocList != null && startLocData.startLocList.Count == 1)
            Location startLoc = WMSHelper.getOutStockStartLoc(null);
            if (startLoc != null)
            {
                Location startLoc = startLocData.startLocList[0];
                Location endLoc = LocationHelper.GetLoc(model.endLoc);
                if (endLoc != null)
                {
                    var locCntrRels = LocationHelper.GetLocCntr(startLoc.S_CODE);
@@ -584,8 +583,7 @@
                            S_OP_DEF_CODE = model.reqId,
                            S_OP_DEF_NAME = "呼叫空托出库",
                            N_PRIORITY = 1,
                            T_START_TIME = DateTime.Now,
                            S_GROUP_NO = startLocData.groupNo,
                            T_START_TIME = DateTime.Now
                        };
                        if (WMSHelper.CreateWmsTask(wmsTask))
                        {
@@ -619,13 +617,16 @@
                        }
                    }
                }
                else
                {
                    responseResult.code = 1;
                    responseResult.msg = $"终点货位:{model.endLoc}在WMS系统中不存在";
                }
            }
            else
            else
            {
                string msg = $"库内没有满足条件的物料";
                LogHelper.Info(msg, "WMS");
                responseResult.code = 1;
                responseResult.msg = msg;
                responseResult.msg = "库内空托不足";
            }
            return responseResult;
        }