using HH.WCS.Mobox3.TSSG.device; using HH.WCS.Mobox3.TSSG.process; using HH.WCS.Mobox3.TSSG.util; using HH.WCS.Mobox3.TSSG.wms; using Newtonsoft.Json; using Newtonsoft.Json.Linq; using SqlSugar; using System; using System.Collections.Generic; using System.Linq; using System.Reflection; using System.Threading; using static HH.WCS.Mobox3.TSSG.api.ApiModel; using static HH.WCS.Mobox3.TSSG.api.OtherModel; namespace HH.WCS.Mobox3.TSSG.api { /// /// api接口辅助类 /// public class ApiHelper { static ApiHelper() { } /// /// 创建任务 /// /// internal static void AddTask(AddTaskModel model) { if (!WCSHelper.CheckExist(model.No)) { if (LocationHelper.CheckExist(model.From) && LocationHelper.CheckExist(model.To)) { WCSHelper.CreateTask(model.No, model.From, model.To, "搬运", 99, ""); } } } /// /// 创建入库单主子表 /// /// /// internal static SimpleResult Putaway_Order_In(Putaway_Order_In model) { var result = new SimpleResult(); //创建入库单主子表 var po = WMSHelper.GetPutawayOrder(model.Data.arrival_no); if (po == null) { po = new PutawayOrder { S_NO = model.Data.arrival_no, S_BS_TYPE = model.Data.op_type }; po.Details = new List(); if (model.Data.items.Count > 0) { model.Data.items.ForEach(a => { po.Details.Add(new PutawayDetail { S_PUTAWAY_NO = model.Data.arrival_no, N_ROW_NO = po.Details.Count + 1, S_ITEM_CODE = a.item_code, F_QTY = a.qty, S_BATCH_NO = a.batch_no, }); }); WMSHelper.CreatePutawayOrder(po); } } return result; } /// /// 创建发货单主子表 /// /// /// internal static SimpleResult OutboundOrder(OutboundOrder model) { var result = new SimpleResult(); //创建发货单,人工点确认后生成分拣单,没有缺货的自动更新为失败,有货的更新为执行中 //创建出库单主子表 var po = WMSHelper.GetShippingOrder(model.Data.out_no); if (po == null) { po = new ShippingOrder { S_NO = model.Data.out_no, S_BS_TYPE = model.Data.op_type }; po.Details = new List(); if (model.Data.items.Count > 0) { model.Data.items.ForEach(a => { po.Details.Add(new ShippingDetail { S_SHIPPING_NO = model.Data.out_no, N_ROW_NO = po.Details.Count + 1, S_ITEM_CODE = a.item_code, F_QTY = a.qty, S_BATCH_NO = a.batch_no, }); }); WMSHelper.CreateShippingOrder(po); } } return result; } public static List> cacheInstockInfos = new List>(); public static void addKeyValuePair(string ip , InstockInfo instockInfo) { KeyValuePair pair = new KeyValuePair(ip,instockInfo); LogHelper.Info("添加缓存信号,缓存信息:" + JsonConvert.SerializeObject(pair), "TSSG"); // 查找并替换键值对 bool replaced = false; for (int i = 0; i < cacheInstockInfos.Count; i++) { if (cacheInstockInfos[i].Key == pair.Key) { cacheInstockInfos[i] = pair; replaced = true; LogHelper.Info("存在相同IP的缓存信号,替换缓存信息:" + JsonConvert.SerializeObject(pair), "TSSG"); break; // 如果只需要替换第一个匹配的项,就跳出循环 } } // 如果没有找到要替换的项,可以选择添加新的键值对或执行其他操作 if (!replaced) { cacheInstockInfos.Add(pair); } } internal static object in_lock = new object(); /// /// pad入库 /// /// /// 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; } /// /// 移库 /// /// /// 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; try { var db = new SqlHelper().GetInstance(Settings.SqlServer1); var nameP = new SugarParameter("@FBarCode", code); var orgP = new SugarParameter("@Forg", org); //var ageP = new SugarParameter("@age", null, true);//设置为output //var dt = db.Ado.UseStoredProcedure().GetDataTable("sp_school", nameP, ageP);//返回dt result = db.Ado.UseStoredProcedure().SqlQuery("WMS_FBarCode", nameP, orgP).First();//返回List Console.WriteLine($"读存储过程成功,result={result}"); } catch (Exception ex) { Console.WriteLine(ex.Message); } return result; } /// /// agv 车辆报警 /// /// /// /// /// 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) { if (turnLight) { var result = HH.WCS.Mobox3.TSSG.device.PlcHelper.SendHex(alertorDevice.address, alertorDevice.turnLight); LogHelper.Info("开灯,modbus 返回信号:" + result, "HosttoagvCar"); } /*else { var result = HH.WCS.Mobox3.TSSG.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; } public string No { get; set; } } public class TN_LocationModel { public string TN_Location { get; set; } } public class CodeInfo { /// /// 生产订单内码 /// public string FInterID { get; set; } /// /// 生产订单编号 /// public string FSourceNo { get; set; } /// /// 批号 /// public string FGMPBatchNo { get; set; } public string FState { get; set; } /// /// 物料编码(内码就是编码) /// public string Fitemid_XK { get; set; } /// /// 分录id /// public string Fentryid { get; set; } } public class NoteInfo : CodeInfo { public string WmsBillNo { get; set; } } } }