杨前锦
2025-05-26 d0a265713fd18162f3a82bdcd22e267df7298c7b
HH.WCS.Mobox3/HH.WCS.Mobox3.YNJT_PT/api/ApiHelper.cs
@@ -1,10 +1,12 @@
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;
using HH.WCS.Mobox3.YNJT_PT.wms;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using SqlSugar;
using Swashbuckle.Swagger;
using System;
using System.Collections.Generic;
using System.Linq;
@@ -12,6 +14,8 @@
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 System.Net.Mime.MediaTypeNames;
namespace HH.WCS.Mobox3.YNJT_PT.api {
    /// <summary>
@@ -21,6 +25,404 @@
        static ApiHelper() {
        }
        /// <summary>
        /// 成型机下线记录
        /// </summary>
        /// <param name="model"></param>
        public static ResponseResult cxjOffLineRecord(OffLineModel model)
        {
            ResponseResult response = new ResponseResult();
            var container = ContainerHelper.GetCntr(model.rfid);
            var location = LocationHelper.GetLoc(model.loc);
            if (location != 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系统内部错误,请联系开发人员排查问题";
                }
            }
            else
            {
                response.code = 1;
                response.msg = $"货位:{model.loc}不存在";
            }
            return response;
        }
        /// <summary>
        /// 下线请求
        /// </summary>
        /// <returns></returns>
        public static ResponseResult offLineRequest(NotifyDeviceSignalModel model)
        {
            ResponseResult response = new ResponseResult();
            var startLoc = LocationHelper.GetLoc(model.loc);
            if (startLoc != null)
            {
                List<BarcodeModel> extData = model.extData;
                int dataCount = extData.Count;
                if (dataCount > 0)
                {
                    var rfidExistNull = extData.Where(a => string.IsNullOrEmpty(a.rfid)).Count()>0;
                    if (rfidExistNull)
                    {
                        response.code = 1;
                        response.msg = "rfid不能为空";
                    }
                    else
                    {
                        Dictionary<BarcodeModel, bool> rfidDic = new Dictionary<BarcodeModel, bool>();
                        foreach (var ext in extData)
                        {
                            string rfid = ext.rfid;
                            if (rfid.Contains("ET"))
                            {
                                rfidDic.Add(ext, false);
                            }
                            else
                            {
                                // 1.查询成型机中间表,rfid 是否存在
                                var offLineRecord = WMSHelper.getOffLineRecord(rfid);
                                if (offLineRecord != null)
                                {
                                    // 2.查询物料条码信息表,条码信息是否存在
                                    var itemBarcodeInfo = WMSHelper.GetGreenTireInformation(ext.barcode);
                                    if (itemBarcodeInfo == null)
                                    {
                                        rfidDic.Add(ext, false);
                                    }
                                    else
                                    {
                                        rfidDic.Add(ext, true);
                                    }
                                }
                                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()
                                    {
                                        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()
                                        {
                                            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);
                                            // 绑定容器物料信息
                                            WMSHelper.bindBarcodeItemInfo(wmsTask.S_CNTR_CODE,itemBarcodeInfo);
                                        }
                                    }
                                }
                            }
                            else
                            {
                                response.code = 1;
                                response.msg = "库区没有可入的空货位";
                            }
                        }
                        else
                        {
                            // 异常料出库检修 或 单拖物料入库
                            foreach (var dic in rfidDic)
                            {
                                Location middleLoc = null;
                                Location endLoc = null;
                                if (dic.Value)
                                {
                                    var itemBarcodeInfo = WMSHelper.GetGreenTireInformation(dic.Key.barcode);
                                    var endLocList = WMSHelper.getInStockEndLoc(itemBarcodeInfo.ITEMCODE, 1);
                                    if (endLocList.Count == 1)
                                    {
                                        endLoc = endLocList[0];
                                        var wmsTask = new WMSTask()
                                        {
                                            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()
                                            {
                                                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);
                                                // 绑定容器物料信息
                                                WMSHelper.bindBarcodeItemInfo(wmsTask.S_CNTR_CODE, itemBarcodeInfo);
                                            }
                                        }
                                    }
                                    else
                                    {
                                        response.code = 1;
                                        response.msg = "库区没有可入的空货位";
                                    }
                                }
                                else
                                {
                                    middleLoc = WMSHelper.getMinTaskMiddleLoc(1);  // 1.异常排出位
                                    endLoc = WMSHelper.getAbnormalAreaEmptyLoc(Settings.abnormalArea);
                                    var wmsTask = new WMSTask()
                                    {
                                        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()
                                        {
                                            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);
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
                else
                {
                    response.code = 1;
                    response.msg = "入参缺少托盘和条码信息";
                }
            }
            else
            {
                response.code = 1;
                response.msg = "起点货位不存在";
            }
            return response;
        }
        /// <summary>
        /// 读码请求
        /// </summary>
        public static ResponseResult readCodeRequest(NotifyDeviceSignalModel model)
        {
            ResponseResult response = new ResponseResult();
            readCodeFeedbackResponse readCodeFeedbackResponse = new readCodeFeedbackResponse()
            {
                verifyResult = true
            };
            var wmsTask = WMSHelper.GetWmsTask(model.taskNo);
            if (wmsTask != null)
            {
                if (wmsTask.S_TYPE != "异常托盘出库任务")
                {
                    Location endLoc = null;
                    Location middleLoc = null;
                    // 判断rfid是否异常
                    if (model.cntrNo != wmsTask.S_CNTR_CODE)
                    {
                        middleLoc = WMSHelper.getMinTaskMiddleLoc(1);  // 1.异常排出位
                        endLoc = WMSHelper.getAbnormalAreaEmptyLoc(Settings.abnormalArea);
                        wmsTask.S_END_LOC = endLoc.S_CODE;
                        wmsTask.S_END_AREA = endLoc.S_AREA_CODE;
                        WMSHelper.UpdateTaskEnd(wmsTask);
                        var wcsTask = WCSHelper.GetTaskBySrcNo(wmsTask.S_CODE);
                        if (wcsTask != null)
                        {
                            wcsTask.S_END_LOC = middleLoc.S_CODE;
                            wcsTask.S_END_AREA = middleLoc.S_AREA_CODE;
                            WCSHelper.updateTaskEnd(wcsTask);
                        }
                        readCodeFeedbackResponse.verifyResult = false;
                        readCodeFeedbackResponse.endLoc = middleLoc.S_CODE;
                        response.data = readCodeFeedbackResponse;
                    }
                    else
                    {
                        var cntrItemRels = ContainerHelper.GetCntrItemRel(wmsTask.S_CNTR_CODE);
                        if (cntrItemRels.Count > 0)
                        {
                            if (cntrItemRels[0].S_ITEM_STATE != "OK")
                            {
                                middleLoc = WMSHelper.getMinTaskMiddleLoc(1);  // 1.异常排出位
                                endLoc = WMSHelper.getAbnormalAreaEmptyLoc(Settings.abnormalArea);
                                wmsTask.S_END_LOC = endLoc.S_CODE;
                                wmsTask.S_END_AREA = endLoc.S_AREA_CODE;
                                WMSHelper.UpdateTaskEnd(wmsTask);
                                var wcsTask = WCSHelper.GetTaskBySrcNo(wmsTask.S_CODE);
                                if (wcsTask != null)
                                {
                                    wcsTask.S_END_LOC = middleLoc.S_CODE;
                                    wcsTask.S_END_AREA = middleLoc.S_AREA_CODE;
                                    WCSHelper.updateTaskEnd(wcsTask);
                                }
                                readCodeFeedbackResponse.verifyResult = false;
                                readCodeFeedbackResponse.endLoc = middleLoc.S_CODE;
                                response.data = readCodeFeedbackResponse;
                            }
                        }
                    }
                }
            }
            else
            {
                response.code = 1;
                response.msg = $"任务号:{model.taskNo},未查询到执行中的任务";
            }
            response.data = readCodeFeedbackResponse;
            return response;
        }
        /// <summary>
        /// 硫化机呼叫胚胎出库
        /// </summary>
        /// <param name="model"></param>
        public static ResponseResult callItemOutStock(CallItemModel model)
        {
            ResponseResult response = new ResponseResult();
            return response;
        }
        public class readCodeFeedbackResponse
        {
            public bool verifyResult { get; set; }
            public string endLoc { get; set; }
        }
        /// <summary>
        /// 创建任务
        /// </summary>
@@ -119,117 +521,6 @@
            }
        }
        
        internal static object in_lock = new object();
        /// <summary>
        /// pad入库
        /// </summary>
        /// <param name="model"></param>
        /// <returns></returns>
        internal static SimpleResult Instock(InstockInfo model) {
            var result = new SimpleResult();
            //pda入库
            //1 判断起点有没有任务,有没有入库锁
            lock (in_lock) {
                var loc = LocationHelper.GetLoc(model.start);
                if (loc != null && loc.N_LOCK_STATE == 0)
                {
                    //2 根据终点库区计算终点
                    var end = WMSHelper.GetInstockEnd(model.item, model.endArea);
                    LogHelper.Info("终点货位:" + JsonConvert.SerializeObject(end), "TSSG");
                    if (end != null)
                    {
                        var cntrCode = ContainerHelper.GenerateCntrNo();
                        var wcsTask = new WCSTask
                        {
                            S_OP_NAME = "入库",
                            S_CODE = WCSHelper.GenerateTaskNo(),
                            S_TYPE = "下线入库",
                            S_START_LOC = model.start,
                            S_END_LOC = end.S_CODE,
                            S_SCHEDULE_TYPE = "NDC",
                            N_CNTR_COUNT = 1,
                            S_CNTR_CODE = cntrCode,
                            N_START_LAYER = 1,
                            N_END_LAYER = end.N_CURRENT_NUM + 1
                        };
                        if (ContainerHelper.BindNewCntrItem(model.start, cntrCode, model.item) && WCSHelper.CreateTask(wcsTask))
                        {
                            LocationHelper.LockLoc(model.start, 2);
                            LocationHelper.LockLoc(end.S_CODE, 1);
                            result.resultCode = 0;
                            result.resultMsg = $"任务创建成功,任务号为{wcsTask.S_CODE},终点为{end.S_CODE}";
                        }
                    }
                    else
                    {
                        addKeyValuePair(model.ip, model);
                        LogHelper.Info("缓存入库信息:" + JsonConvert.SerializeObject(model), "TSSG");
                        result.resultCode = 2;
                        result.resultMsg = "未获取到入库终点";
                    }
                }
                else
                {
                    result.resultCode = 1;
                    result.resultMsg = "起点有任务未完成";
                }
            }
            return result;
        }
        /// <summary>
        /// 移库
        /// </summary>
        /// <param name="model"></param>
        /// <returns></returns>
        internal static SimpleResult shiftStock(ShiftStockInfo model)
        {
            var result = new SimpleResult();
            //1 根据起点库区、排 确定起始货位
            var startLoc = WMSHelper.GetShiftStockStart(model.startArea, model.startRow);
            if (startLoc != null && startLoc.N_LOCK_STATE == 0)
            {
                //2 根据终点库区计算终点
                var end = WMSHelper.GetShiftStockEnd( model.endArea, model.endRow);
                if (end != null && end.N_LOCK_STATE == 0)
                {
                    var wcsTask = new WCSTask
                    {
                        S_OP_NAME = "移库",
                        S_CODE = WCSHelper.GenerateTaskNo(),
                        S_TYPE = "移库",
                        S_START_LOC = startLoc.S_CODE,
                        S_END_LOC = end.S_CODE,
                        S_SCHEDULE_TYPE = "NDC",
                        N_CNTR_COUNT = 1,
                        S_CNTR_CODE = startLoc.LocCntrRel.S_CNTR_CODE,
                        N_START_LAYER = startLoc.N_CURRENT_NUM,
                        N_END_LAYER = end.N_CURRENT_NUM + 1
                    };
                    if (WCSHelper.CreateTask(wcsTask))
                    {
                        LocationHelper.LockLoc(startLoc.S_CODE, 2);
                        LocationHelper.LockLoc(end.S_CODE, 1);
                        result.resultCode = 0;
                        result.resultMsg = $"任务创建成功,任务号为{wcsTask.S_CODE},终点为{end.S_CODE}";
                    }
                }
                else
                {
                    result.resultCode = 2;
                    result.resultMsg = "终点库区没有可入的货位";
                }
            }
            else
            {
                result.resultCode = 1;
                result.resultMsg = "未找到指定物料";
            }
            return result;
        }
            internal static CodeInfo GetCodeInfo(string code, string org) {
            //return new CodeInfo {  Fitemid_XK=code, FSourceNo="123456"};
            CodeInfo result = null;
@@ -258,43 +549,16 @@
        public static void agvCarAlarm(string  forkliftNo, string errCode , string errCode2 , string failCode) {
            bool turnLight = false;
            var errCodeList = Settings.agvAlarmNoList.Where(a => a.type == 1).Select(a => a.dex).ToList();
            var errCode2List = Settings.agvAlarmNoList.Where(a => a.type == 2).Select(a => a.dex).ToList();
            var failCodeList = Settings.agvAlarmNoList.Where(a => a.type == 3).Select(a => a.dex).ToList();
            if (errCodeList.Contains(int.Parse(errCode)))
            {
                turnLight = true;
                LogHelper.Info("StopWord 错误码:" + errCode, "HosttoagvCar");
            }
            if (errCode2List.Contains(int.Parse(errCode2)))
            {
                turnLight = true;
                LogHelper.Info("StopWord2 错误码:" + errCode2, "HosttoagvCar");
            }
            if (failCodeList.Contains(int.Parse(failCode)))
            {
                turnLight = true;
                LogHelper.Info("failCode 错误码:" + failCode, "HosttoagvCar");
            }
            var alertorDevices = Settings.alertorLightInfos.Where(a => a.deviceNo == 5 || a.deviceNo == 6).ToList();
            foreach (var alertorDevice in alertorDevices)
        public class OffLineModel
            {
                if (turnLight)
                {
                    var result = HH.WCS.Mobox3.YNJT_PT.device.PlcHelper.SendHex(alertorDevice.address, alertorDevice.turnLight);
                    LogHelper.Info("开灯,modbus 返回信号:" + result, "HosttoagvCar");
            public string rfid { get; set; } // 托盘号
            public string loc { get; set; } // 下线货位
            public int isUrgent { get; set; } // N_IS_URGENT 是否加急(0.否 1.是)
            public int isFull { get; set; } // 是否满拖 0.否 1.是
                }
                /*else
                {
                    var result = HH.WCS.Mobox3.YNJT_PT.device.PlcHelper.SendHex(alertorDevice.address, alertorDevice.offLight);
                    LogHelper.Info("关灯,modbus 返回信号:" + result, "HosttoagvCar");
                }*/
            }
        }
        public class AddTaskModel {
            public string From { get; set; }
            public string To { get; set; }