杨前锦
2025-06-06 16d2162a833cebeae72c363962917bb9da8145ef
HH.WCS.Mobox3/HH.WCS.Mobox3.YNJT_PT/api/ApiHelper.cs
@@ -1,4 +1,5 @@
using HH.WCS.Mobox3.YNJT_PT.device;
using HH.WCS.Mobox3.YNJT_PT.core;
using HH.WCS.Mobox3.YNJT_PT.device;
using HH.WCS.Mobox3.YNJT_PT.models;
using HH.WCS.Mobox3.YNJT_PT.process;
using HH.WCS.Mobox3.YNJT_PT.util;
@@ -11,10 +12,13 @@
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Text.RegularExpressions;
using System.Threading;
using static HH.WCS.Mobox3.YNJT_PT.api.ApiModel;
using static HH.WCS.Mobox3.YNJT_PT.api.OtherModel;
using static HH.WCS.Mobox3.YNJT_PT.api.WmsController;
using static HH.WCS.Mobox3.YNJT_PT.util.Settings;
using static HH.WCS.Mobox3.YNJT_PT.wms.WMSHelper;
using static System.Net.Mime.MediaTypeNames;
namespace HH.WCS.Mobox3.YNJT_PT.api {
@@ -34,38 +38,29 @@
        {
            ResponseResult response = new ResponseResult();
            var container = ContainerHelper.GetCntr(model.rfid);
            var location = LocationHelper.GetLoc(model.loc);
            if (location != null)
            if (container == null)
            {
                if (container == null)
                {
                    ContainerHelper.AddCntr(model.rfid);
                }
                try
                {
                    OffLineRecord record = new OffLineRecord()
                    {
                        S_RFID = model.rfid,
                        S_LOC = model.loc,
                        N_IS_URGENT = model.isUrgent,
                        T_OFF_TIME = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"),
                        N_IS_FULL = model.isFull,
                    };
                    WMSHelper.addOffLineRecord(record);
                }
                catch (Exception ex)
                {
                    LogHelper.Info($"添加成型机下线记录错误,错误原因:{ex.Message}", "WMS");
                    response.code = 500;
                    response.msg = "WMS系统内部错误,请联系开发人员排查问题";
                }
                ContainerHelper.AddCntr(model.rfid);
            }
            else
            try
            {
                response.code = 1;
                response.msg = $"货位:{model.loc}不存在";
                OffLineRecord record = new OffLineRecord()
                {
                    S_RFID = model.rfid,
                    S_DEVICE_NO = model.deviceNo,
                    N_IS_URGENT = model.isUrgent,
                    T_OFF_TIME = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"),
                    N_IS_FULL = model.isFull,
                };
                WMSHelper.addOffLineRecord(record);
            }
            catch (Exception ex)
            {
                LogHelper.Info($"添加成型机下线记录错误,错误原因:{ex.Message}", "WMS");
                response.code = 500;
                response.msg = "WMS系统内部错误,请联系开发人员排查问题";
            }
            return response;
        }
@@ -89,129 +84,78 @@
                    {
                        response.code = 1;
                        response.msg = "rfid不能为空";
                        return response;
                    }
                    else 
                    {
                        Dictionary<BarcodeModel, bool> rfidDic = new Dictionary<BarcodeModel, bool>();
                        foreach (var ext in extData)
                        if (extData.Count > 0)
                        {
                            string rfid = ext.rfid;
                            if (rfid.Contains("ET"))
                            List<BarcodeModel> barcodeList = new List<BarcodeModel>();
                            foreach (var ext in extData)
                            {
                                rfidDic.Add(ext, false);
                            }
                            else
                            {
                                // 1.查询成型机中间表,rfid 是否存在
                                var offLineRecord = WMSHelper.getOffLineRecord(rfid);
                                if (offLineRecord != null)
                                string rfid = ext.rfid;
                                if (rfid == "88888888")
                                {
                                    // 2.查询物料条码信息表,条码信息是否存在
                                    var itemBarcodeInfo = WMSHelper.GetGreenTireInformation(ext.barcode);
                                    if (itemBarcodeInfo == null)
                                    {
                                        rfidDic.Add(ext, false);
                                    }
                                    else
                                    {
                                        rfidDic.Add(ext, true);
                                    }
                                    // 记录托盘异常
                                }
                                else
                                else
                                {
                                    rfidDic.Add(ext, false);
                                }
                            }
                        }
                        // 判断是否有异常托盘
                        bool isNormal = rfidDic.Where(a => a.Value == false).Count() == 0;
                        if (isNormal && extData.Count == 2)
                        {
                            // 双托正常料入库
                            Location endLoc = null;
                            var itemBarcodeInfo = WMSHelper.GetGreenTireInformation(extData[0].barcode);
                            string groupNo = WMSHelper.GenerateTaskGroupNo();
                            var endLocList  = WMSHelper.getInStockEndLoc(itemBarcodeInfo.ITEMCODE, 2);
                            if (endLocList.Count == 2)
                            {
                                var rfidList = rfidDic.Keys.ToList();
                                for (int i = 0; i < rfidList.Count; i++)
                                {
                                    endLoc = endLocList[i];
                                    var wmsTask = new WMSTask()
                                    // 查询成型机中间表,rfid 是否存在
                                    var offLineRecord = WMSHelper.getOffLineRecord(rfid);
                                    if (offLineRecord != null)
                                    {
                                        S_CNTR_CODE = rfidList[i].rfid,
                                        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()
                                        if (offLineRecord.N_IS_FULL == 1)
                                        {
                                            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 (ext.barcode.Contains("99999999"))
                                            {
                                                // 记录条码扫描异常
                                        if (WCSHelper.CreateTask(wcsTask))
                                        {
                                            // 起点、接驳点、终点加锁
                                            LocationHelper.LockLoc(wcsTask.S_START_LOC, 2);
                                            LocationHelper.LockLoc(wcsTask.S_END_LOC, 1);
                                            }
                                            else
                                            {
                                                // 2.查询物料条码信息表,条码信息是否存在
                                                var itemBarcodeInfo = WMSHelper.GetGreenTireInformation(ext.barcode);
                                                if (itemBarcodeInfo != null)
                                                {
                                                    barcodeList.Add(ext);
                                                }
                                                else
                                                {
                                                   // 记录查询条码信息异常
                                            // 更新作业任务状态
                                            wmsTask.N_B_STATE = 1;
                                            WMSHelper.UpdateTaskState(wmsTask);
                                            // 绑定容器物料信息
                                            WMSHelper.bindBarcodeItemInfo(wmsTask.S_CNTR_CODE,itemBarcodeInfo);
                                                }
                                            }
                                        }
                                    }
                                }
                            }
                            else
                            EndLocGroup endLocGroup = null;
                            if (barcodeList.Count > 0)
                            {
                                response.code = 1;
                                response.msg = "库区没有可入的空货位";
                               endLocGroup = WMSHelper.getInStockEndLoc(barcodeList.Count);
                            }
                        }
                        else
                        {
                            // 异常料出库检修 或 单拖物料入库
                            foreach (var dic in rfidDic)
                            foreach (var ext in extData)
                            {
                                Location middleLoc = null;
                                Location endLoc = null;
                                if (dic.Value)
                                string groupNo = null;
                                if (barcodeList.Contains(ext))
                                {
                                    var itemBarcodeInfo = WMSHelper.GetGreenTireInformation(dic.Key.barcode);
                                    var endLocList = WMSHelper.getInStockEndLoc(itemBarcodeInfo.ITEMCODE, 1);
                                    if (endLocList.Count == 1)
                                    // 满料入库
                                    if (endLocGroup != null)
                                    {
                                        endLoc = endLocList[0];
                                        groupNo = endLocGroup.groupNo;
                                        endLoc = endLocGroup.endLocList[0];
                                        endLocGroup.endLocList.Remove(endLoc);
                                    }
                                    if (endLoc != null)
                                    {
                                        var wmsTask = new WMSTask()
                                        {
                                            S_CNTR_CODE = dic.Key.rfid,
                                            S_CNTR_CODE = ext.rfid,
                                            S_CODE = WMSHelper.GenerateTaskNo(),
                                            S_START_LOC = startLoc.S_CODE,
                                            S_START_AREA = startLoc.S_AREA_CODE,
@@ -222,6 +166,7 @@
                                            S_OP_DEF_NAME = "成型机满料下线入库",
                                            N_PRIORITY = 1,
                                            T_START_TIME = DateTime.Now,
                                            S_GROUP_NO = groupNo,
                                        };
                                        if (WMSHelper.CreateWmsTask(wmsTask))
                                        {
@@ -253,63 +198,67 @@
                                                WMSHelper.UpdateTaskState(wmsTask);
                                                // 绑定容器物料信息
                                                var itemBarcodeInfo = WMSHelper.GetGreenTireInformation(ext.barcode);
                                                WMSHelper.bindBarcodeItemInfo(wmsTask.S_CNTR_CODE, itemBarcodeInfo);
                                            }
                                        }
                                    }
                                    else
                                    {
                                        response.code = 1;
                                        response.msg = "库区没有可入的空货位";
                                    }
                                }
                                else
                                else
                                {
                                    middleLoc = WMSHelper.getMinTaskMiddleLoc(1);  // 1.异常排出位
                                    // 异常托盘排除
                                    var middleLoc = WMSHelper.getMinTaskMiddleLoc(1);  // 1.异常排出位
                                    endLoc = WMSHelper.getAbnormalAreaEmptyLoc(Settings.abnormalArea);
                                    var wmsTask = new WMSTask()
                                    if (endLoc != null && middleLoc != null)
                                    {
                                        S_CNTR_CODE = dic.Key.rfid,
                                        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,
                                    };
                                    if (WMSHelper.CreateWmsTask(wmsTask))
                                    {
                                        // 创建一段入库任务
                                        WCSTask wcsTask = new WCSTask()
                                        var wmsTask = new WMSTask()
                                        {
                                            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_CNTR_CODE = ext.rfid,
                                            S_CODE = WMSHelper.GenerateTaskNo(),
                                            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",
                                            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,
                                        };
                                        if (WCSHelper.CreateTask(wcsTask))
                                        if (WMSHelper.CreateWmsTask(wmsTask))
                                        {
                                            // 起点、接驳点、终点加锁
                                            LocationHelper.LockLoc(wcsTask.S_START_LOC, 2);
                                            LocationHelper.LockLoc(wcsTask.S_END_LOC, 1);
                                            // 创建一段入库任务
                                            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 = 1,
                                                T_START_TIME = DateTime.Now,
                                            };
                                            // 更新作业任务状态
                                            wmsTask.N_B_STATE = 1;
                                            WMSHelper.UpdateTaskState(wmsTask);
                                            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
                                    {
                                        LogHelper.Info("异常托盘排出,未获取异常排除接驳位", "WMS");
                                    }
                                }
                            }
@@ -350,7 +299,9 @@
                    // 判断rfid是否异常
                    if (model.cntrNo != wmsTask.S_CNTR_CODE)
                    {
                        middleLoc = WMSHelper.getMinTaskMiddleLoc(1);  // 1.异常排出位
                        endLoc = LocationHelper.GetLoc(wmsTask.S_END_LOC);
                        var connectLoc = Settings.connectLocList.Where(a => a.roadway == endLoc.N_ROADWAY && a.type == 1).FirstOrDefault();
                        middleLoc = LocationHelper.GetLoc(connectLoc.locCode);
                        endLoc = WMSHelper.getAbnormalAreaEmptyLoc(Settings.abnormalArea);
                        wmsTask.S_END_LOC = endLoc.S_CODE;
                        wmsTask.S_END_AREA = endLoc.S_AREA_CODE;
@@ -414,7 +365,449 @@
        {
            ResponseResult response = new ResponseResult();
            //参数校验
            if (model.locCodes.Count == 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)
                {
                    dateShift = DateTime.Now.AddDays(-1).ToString("dd/MM/yyyy");
                }
                // 3.根据班次日期+班次+硫化机工位号查询呼叫的物料编码、预计生产数量
                var productionShedule = WMSHelper.getProductionShedule(dateShift, model.mcn, shift);
                if (productionShedule != null && productionShedule.QTY != 0)
                {
                    // 4.查询【胚胎已完成的条码中间表】并计算当前班次的已完成数量
                    int finishNum = WMSHelper.getEmbryoFinishNum(dateShift, model.mcn, shift);
                    if (productionShedule.QTY > finishNum)
                    {
                        // 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)
                        {
                            var startLocList = startLocData.startLocList;
                            for (int i = 0; i < locNum; i++)
                            {
                                Location startLoc = startLocList[i];
                                Location endLoc =  LocationHelper.GetLoc(model.locCodes[i]);
                                if (endLoc != null)
                                {
                                    var locCntrRels = LocationHelper.GetLocCntr(startLoc.S_CODE);
                                    if (locCntrRels != null && locCntrRels.Count > 0)
                                    {
                                        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,
                                            };
                                            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
                        {
                            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;
        }
        /// <summary>
        /// 空托入库
        /// </summary>
        /// <param name="model"></param>
        /// <returns></returns>
        public static ResponseResult emptyTrayInStock(EmptyTrayInStockModel model)
        {
            ResponseResult response = new ResponseResult();
            Location startLoc = LocationHelper.GetLoc(model.startLoc);
            var endLocGroup = WMSHelper.getInStockEndLoc(1);
            if (endLocGroup.endLocList.Count == 1)
            {
                Location endLoc = endLocGroup.endLocList[0];
                var wmsTask = new WMSTask()
                {
                    S_CNTR_CODE = model.trayCode,
                    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,
                };
                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,
                    };
                    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
            {
                response.code = 1;
                response.msg = "库区没有可入的空货位";
            }
            return response;
        }
        /// <summary>
        /// 呼叫空托出库
        /// </summary>
        /// <returns></returns>
        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 = startLocData.startLocList[0];
                if (endLoc != null)
                {
                    var locCntrRels = LocationHelper.GetLocCntr(startLoc.S_CODE);
                    if (locCntrRels != null && locCntrRels.Count > 0)
                    {
                        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,
                            };
                            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
            {
                string msg = $"库内没有满足条件的物料";
                LogHelper.Info(msg, "WMS");
                responseResult.code = 1;
                responseResult.msg = msg;
            }
            return responseResult;
        }
        /// <summary>
        /// 胚胎抽检出库
        /// </summary>
        /// <returns></returns>
        public static ResponseResult embryoCheckOutStock(EmbryoCheckOutStockModel model)
        {
            ResponseResult responseResult = new ResponseResult();
            var locCntrs = LocationHelper.GetLocCntrRelByCntr(model.trayCode);
            if (locCntrs.Count == 1)
            {
                Location startLoc = LocationHelper.GetLoc(locCntrs[0].S_LOC_CODE);
                var connectLoc = Settings.connectLocList.Where(a => a.roadway == startLoc.N_ROADWAY && a.type == 1).First();
                Location middleLoc = LocationHelper.GetLoc(connectLoc.locCode);
                Location endLoc = LocationHelper.GetLoc("");
                if (endLoc != null)
                {
                    var wmsTask = new WMSTask()
                    {
                        S_CNTR_CODE = model.trayCode,
                        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,
                    };
                    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 = 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);
                        }
                    }
                }
            }
            return responseResult;
        }
        /// <summary>
        /// 异常托盘回库流程
        /// </summary>
        /// <param name="model"></param>
        /// <returns></returns>
        public static ResponseResult anomalyTrayInStock(AnomalyTrayInStockModel model)
        {
            ResponseResult responseResult = new ResponseResult();
            LocationHelper.UnBindingLoc(model.startLoc, new List<string>() { model.trayCode });
            ContainerHelper.deleteCntrItemRelByCntr(model.trayCode);
            return responseResult;
        }
        /// <summary>
        /// 任务状态回报
        /// 任务状态 1:开始/执行中;完成;3:准备取货;4:取货完成;5:准备卸货;6:卸货完成;7:异常取消;8:强制完成
        /// 1.根据任务状态回报更新货位状态、任务状态
        /// 2.更新任务中间表状态
        /// 4.更新出库任务中间表状态
        /// </summary>
        /// <param name="model"></param>
        /// <returns></returns>
        public static ReturnResult taskStatusFeedback(TaskStatusFeedbackModel model)
        {
            ReturnResult responseResult = new ReturnResult();
            WCSTask cst = WCSHelper.GetTask(model.taskNo);
            if (cst != null)
            {
                bool isExist = WCSHelper.CheckActionRecordExist(cst.S_CODE, model.status);
                if (!isExist)
                {
                    WMSTask mst = WMSHelper.GetWmsTask(cst.S_OP_CODE);
                    if (mst != null)
                    {
                        switch (model.status)
                        {
                            case 1:
                                WCSHelper.Begin(cst);
                                break;
                            case 2:
                                WCSHelper.End(cst);
                                break;
                            case 3:
                                WCSHelper.UpdateStatus(cst, "准备取货");
                                break;
                            case 4:
                                WCSHelper.UpdateStatus(cst, "取货完成");
                                TaskProcess.OperateStatus(cst, 4);
                                break;
                            case 5:
                                WCSHelper.UpdateStatus(cst, "准备卸货");
                                break;
                            case 6:
                                WCSHelper.UpdateStatus(cst, "卸货完成");
                                TaskProcess.OperateStatus(cst, 6);
                                break;
                            case 7:
                                WCSHelper.Cancel(cst);
                                WCSHelper.UpdateStatus(cst, "取消");
                                TaskProcess.OperateStatus(cst, 7);
                                break;
                            case 8:
                                WCSHelper.UpdateStatus(cst, "强制完成");
                                WCSHelper.End(cst);
                                break;
                        }
                        // 添加WCS动作记录
                        WCSHelper.AddActionRecord(model.taskNo, model.status, model.deviceNo, model.loc);
                        if (model.status == 2 || model.status == 8)
                        {
                            if (mst != null)
                            {
                                if (mst.N_B_STATE != 2)
                                {
                                    WCSCore.createLastTask(cst.S_END_LOC, mst);
                                }
                            }
                        }
                    }
                }
            }
            return responseResult;
        }
        /// <summary>
        /// 查询班次
        /// </summary>
        /// <param name="time"></param>
        /// <returns></returns>
        public static string getShift(TimeSpan time)
        {
            TimeSpan shiftI_Start = new TimeSpan(07, 00, 0);  // 07:00:00
            TimeSpan shiftI_End = new TimeSpan(14, 59, 59);    // 14:59:59
            TimeSpan shiftII_Start = new TimeSpan(15, 00, 0); // 15:00:00
            TimeSpan shiftII_End = new TimeSpan(22, 59, 59);    // 22:59:59
            TimeSpan shiftIII_Start = new TimeSpan(23, 00, 0); // 23:00:00
            TimeSpan shiftIII_End = new TimeSpan(06, 59, 59);   // 06:59:59
            // 判断是否在 Shift III(跨天需特殊处理)
            bool isShiftIII = time >= shiftIII_Start || time <= shiftIII_End;
            // 返回结果
            if (time >= shiftI_Start && time <= shiftI_End)
                return "I";
            else if (time >= shiftII_Start && time <= shiftII_End)
                return "II";
            else if (isShiftIII)
                return "III";
            else
                return "No shift"; // 理论上不会触发
        }
        public class readCodeFeedbackResponse
@@ -555,7 +948,7 @@
        public class OffLineModel
        {
            public string rfid { get; set; } // 托盘号
            public string loc { get; set; } // 下线货位
            public string deviceNo { get; set; } // 机台号
            public int isUrgent { get; set; } // N_IS_URGENT 是否加急(0.否 1.是)
            public int isFull { get; set; } // 是否满拖 0.否 1.是
        }