HH.WCS.Mobox3/HH.WCS.Mobox3.FJJT/HH.WCS.Mobox3.FJJT.csproj
@@ -181,6 +181,7 @@ <Compile Include="models\other\DayuanOut.cs" /> <Compile Include="models\PutawayDetail.cs" /> <Compile Include="models\PutawayOrder.cs" /> <Compile Include="models\RfidAnomalyRecord.cs" /> <Compile Include="models\Safety_Inventory.cs" /> <Compile Include="models\SideLocConfig.cs" /> <Compile Include="models\TN_ASN_Detail.cs" /> HH.WCS.Mobox3/HH.WCS.Mobox3.FJJT/api/ApiHelper.cs
@@ -46,42 +46,18 @@ WMSHelper.addAlarmRecord("流程异常", "低", $"WMS系统未查询到终点货位:{model.endLocCode}"); throw new BusinessException($"WMS系统未查询到终点货位:{model.endLocCode},请检查终点货位编码是否正确"); } else var areaCodes = Settings.getRelAreaCodes(endLoc.S_AREA_CODE); if (areaCodes.Count == 0) { if (endLoc.C_ENABLE == "Y") { if (endLoc.N_LOCK_STATE != 0) { var existTask = WCSHelper.GetTaskByStartOrEnd(model.endLocCode); if (existTask != null) { WMSHelper.addAlarmRecord("流程异常", "低", $"终点货位:{model.endLocCode} 已有任务"); throw new BusinessException($"终点货位:{model.endLocCode} 已有任务"); } else { LocationHelper.UnLockLoc(model.endLocCode); // 没有任务就,自动解锁终点货位 } } } else { WMSHelper.addAlarmRecord("流程异常", "低", $"终点货位:{model.endLocCode} 已禁用,请联系管理人员解除禁用"); throw new BusinessException($"终点货位:{model.endLocCode} 已禁用,请联系管理人员解除禁用"); } WMSHelper.addAlarmRecord("流程异常", "低", $"未配置库区:{endLoc.S_AREA_CODE}的关联关系"); throw new BusinessException($"未配置库区:{endLoc.S_AREA_CODE}的关联关系"); } var transfeRelevance = WMSHelper.GetTransfeRelevance(model.endLocCode); // 接驳货位关联属性 if (transfeRelevance == null) { WMSHelper.addAlarmRecord("流程异常", "低", $"终点货位:{model.endLocCode},缺少配置属性,请联系管理人员进行配置属性"); throw new BusinessException($"终点货位:{model.endLocCode},缺少配置属性,请联系管理人员进行配置属性"); } Location startLoc = WMSHelper.getOutStockStartLoc(transfeRelevance.S_RELE_AREA, null); Location startLoc = WMSHelper.getOutStockStartLoc(areaCodes[0], null); if (startLoc == null) { WMSHelper.addAlarmRecord("流程异常", "低", $"未查询到空工装,立库可能缺少空工装"); WMSHelper.addAlarmRecord("流程异常", "低", $"库区:{areaCodes[0]}未查询到空工装"); throw new BusinessException($"未查询到空工装,立库可能缺少空工装"); } @@ -98,7 +74,7 @@ S_END_LOC = endLoc.S_CODE, S_END_AREA = endLoc.S_AREA_CODE, S_TYPE = "空工装出库任务", S_OP_DEF_NAME = "空工装出库缓存位", S_OP_DEF_NAME = "空工装出库", N_PRIORITY = 10, T_START_TIME = DateTime.Now, }; @@ -144,10 +120,10 @@ /// <summary> /// WCS读码请求流程 /// 1.判断RFID 是否读取成功(托盘号是否为空) /// 2.查询关于RFID的预创建任务 /// 3.如果读取成功,则激活预创建任务 /// 4.如果读取不成功,查看异常区是否有空货位,有则创建搬运异常区任务,无则,记录异常激活预创建任务 /// 业务场景:读码入库、读码出库 /// 1.判断RFID是否存在WMS系统中,否,则默认为RFID无法识别 /// 2.判断RFID是否与任务RFID是否一致 /// 3.记录RFID异常信息 /// </summary> /// <param name="request"></param> /// <returns></returns> @@ -155,47 +131,24 @@ ResponseResult responseResult = new ResponseResult(); Location loc = LocationHelper.GetLoc(request.loc); if (loc == null) if (loc != null) { WMSHelper.addAlarmRecord("流程异常", "中", $"读码位:{request.loc},没有在WMS系统中录入"); throw new BusinessException($"读码位:{request.loc},没有在WMS系统中录入"); } var locCntrRels = LocationHelper.GetLocCntr(request.loc); if (locCntrRels.Count > 0) { string taskCntrCode = locCntrRels[0].S_CNTR_CODE; // 2.查询关于RFID的预创建任务 var cst = WCSHelper.GetPreCreatedTaskByCntr(taskCntrCode); var cst = WCSHelper.GetTask(request.taskNo); if (cst != null) { bool errFlag = true; // 1.判断RFID 是否读取成功(托盘号是否为空) if (request.cntrNo != null) var container = ContainerHelper.GetCntr(request.cntrNo); if (container != null) { if (request.cntrNo == taskCntrCode) if (cst.S_CNTR_CODE == request.cntrNo) { Container container = ContainerHelper.GetCntr(request.cntrNo); if (container.N_E_STATE == 0) { errFlag = false; WCSHelper.ActivatePreCreateTask(cst.S_OP_CODE); } } else { ContainerHelper.UpdateCntrState(taskCntrCode, 1,"WCS反馈RFID与任务RFID不一致"); ContainerHelper.UpdateCntrState(cst.S_CNTR_CODE, 1); WMSHelper.addRfidAnomalyRecord(cst.S_CNTR_CODE, 2, request.loc, cst.S_CODE); } } else else { ContainerHelper.UpdateCntrState(taskCntrCode, 1,"WCS反馈RFID为null"); } // 方案1 4.激活预创建任务 if (errFlag) { WCSHelper.ActivatePreCreateTask(cst.S_OP_CODE,1); ContainerHelper.UpdateCntrState(cst.S_CNTR_CODE, 1); WMSHelper.addRfidAnomalyRecord(cst.S_CNTR_CODE, 1, request.loc, cst.S_CODE); } // 方案2 4.如果读取不成功,查看异常区是否有空货位 @@ -233,15 +186,15 @@ WCSHelper.ActivatePreCreateTask(cst.S_OP_CODE); }*/ } else else { WMSHelper.addAlarmRecord("流程异常", "低", $"读码位:{request.loc}触发读码请求,读码位上容器:{taskCntrCode}没有预创建任务"); WMSHelper.addAlarmRecord("流程异常", "低", $"没有查询到读码的任务,任务号:{request.taskNo}"); } } else { WMSHelper.addAlarmRecord("流程异常", "中", $"读码位:{request.loc},没有查询到容器"); throw new BusinessException($"读码位:{request.loc},没有查询到容器"); WMSHelper.addAlarmRecord("流程异常", "中", $"读码位:{request.loc},没有在WMS系统中录入"); throw new BusinessException($"读码位:{request.loc},没有在WMS系统中录入"); } return responseResult; } @@ -267,43 +220,40 @@ /// <returns></returns> public static ResponseResult offLineProcess(OffLineRequest model) { ResponseResult responseResult = new ResponseResult(); // 查询起点货位是否存在已存在任务,防止任务重复发起 var existWmsTask = WMSHelper.GetWmsTaskByStart(model.loc); if (existWmsTask == null) { // 判断满料接驳位对应的空工装缓存位状态(查询线体光电) // 查询对应机台的物料下线配置信息 var logicConfig = WMSHelper.getLogicConfigByJtCode(model.jtNo); if (logicConfig != null) { // 根据物料下线配置信息,判断任务类型是直连下线还是非直连下线 if (logicConfig.S_TASK_TYPE == "1" || logicConfig.S_TASK_TYPE == "2") { // 满料下线(直连) // 直连下线,需要判断校验RFID LjMesTask mesTask = null; if (model.cntrNo != null && model.cntrNo != "") var container = ContainerHelper.GetCntr(model.cntrNo); if (container != null) { var container = ContainerHelper.GetCntr(model.cntrNo); if (container == null) mesTask = WMSHelper.getLjMesTaskByCntr(model.cntrNo); if (mesTask == null) { ContainerHelper.AddCntr(model.cntrNo); ContainerHelper.UpdateCntrState(model.cntrNo, 1, $"满料下线(直连),WCS反馈的RFID:{model.cntrNo}在WMS系统中不存在"); WMSHelper.addAlarmRecord("流程异常", "中", $"满料下线(直连),WCS反馈的RFID:{model.cntrNo}在WMS系统中不存在"); } else { ContainerHelper.UpdateCntrState(model.cntrNo, 0, ""); mesTask = WMSHelper.getLjMesTaskByCntr(model.cntrNo); if (mesTask == null) { ContainerHelper.UpdateCntrState(model.cntrNo, 1, $"未查询到MES任务"); WMSHelper.addAlarmRecord("流程异常", "低", $"满料下线(直连),容器:{model.cntrNo}未查询到MES任务"); } ContainerHelper.UpdateCntrState(model.cntrNo, 1); WMSHelper.addRfidAnomalyRecord(model.cntrNo, 3, model.loc, null); } } else { model.cntrNo = ContainerHelper.GenerateCntrNo(); model.isNormal = false; } if (!model.isNormal) { ContainerHelper.AddCntr(model.cntrNo); ContainerHelper.UpdateCntrState(model.cntrNo, 1, $"WCS反馈的RFID:{model.cntrNo} 为空"); WMSHelper.addAlarmRecord("流程异常", "中", $"WCS反馈的RFID:{model.cntrNo} 为空"); ContainerHelper.UpdateCntrState(model.cntrNo, 1); WMSHelper.addRfidAnomalyRecord(model.cntrNo, 1, model.loc, null); } triggerItemOffLineFlow(model.loc, model.cntrNo, logicConfig, mesTask); } @@ -2194,6 +2144,7 @@ { public string reqId { get; set; } public string reqTime { get; set; } public string taskNo { get; set; } // 托盘号 public string loc { get; set; } // 货位 上料点、下料点、读码位、称重位(必填) public string cntrNo { get; set; } // 托盘号 public int signalType { get; set; } //请求类型 1:下线请求 2:叫料请求 3:读码请求(必填) @@ -2218,6 +2169,7 @@ public string loc { get; set; } // 货位 上料点、下料点、读码位、称重位(必填) public string cntrNo { get; set; } // 托盘号 public string jtNo { get; set; } // 机台号 public bool isNormal { get; set; } //是否异常 } /// <summary> @@ -2227,6 +2179,7 @@ { public string loc { get; set; } // 货位 上料点、下料点、读码位、称重位(必填) public string cntrNo { get; set; } // 托盘号 public string taskNo { get; set; } // 任务号 } public class AddTaskModel { HH.WCS.Mobox3/HH.WCS.Mobox3.FJJT/api/WmsController.cs
@@ -18,9 +18,7 @@ { /// <summary> /// 1.空工装出库 /// 业务场景: /// 1.直连流程初始化,补充空工装 /// 2.非直连流程,固定站台自动补充空工装 /// 业务场景:直连流程初始化,补充缓存位的空工装 /// </summary> /// <param name="model"></param> /// <returns></returns> @@ -36,7 +34,7 @@ } catch (BusinessException be) { responseResult.code = 501; responseResult.code = 201; responseResult.msg = be.Message; } catch (Exception ex) @@ -45,7 +43,6 @@ responseResult.msg = $"WMS内部错误,请联系开发人员处理"; WMSHelper.addAlarmRecord("系统错误", "高", $"WMS内部错误: 空工装出库错误,错误原因:{ex.Message}"); } LogHelper.Info("emptyPalletOutStock 出参:" + JsonConvert.SerializeObject(responseResult), "WMS"); return responseResult; } @@ -65,25 +62,25 @@ ResponseResult responseResult = new ResponseResult(); try { if (model.signalType == 1) // 物料下线入库请求 if (model.signalType == 1) // 正常物料下线入库请求 { OffLineRequest request = new OffLineRequest() { loc = model.loc, cntrNo = model.cntrNo, jtNo = model.deviceNo }; OffLineRequest request = new OffLineRequest() { loc = model.loc, cntrNo = model.cntrNo, jtNo = model.deviceNo, isNormal = true}; responseResult = ApiHelper.offLineProcess(request); } else if (model.signalType == 3) // 读码入库请求 { ReadCodeRequest request = new ReadCodeRequest() { loc = model.loc, cntrNo = model.cntrNo }; ReadCodeRequest request = new ReadCodeRequest() { loc = model.loc, cntrNo = model.cntrNo ,taskNo = model.taskNo }; responseResult = ApiHelper.readCodeProcess(request); } else if (model.signalType == 5) // 异常工装入库请求 { OffLineRequest request = new OffLineRequest() { loc = model.loc, cntrNo = model.cntrNo, jtNo = model.deviceNo }; OffLineRequest request = new OffLineRequest() { loc = model.loc, cntrNo = model.cntrNo, jtNo = model.deviceNo , isNormal = false}; responseResult = ApiHelper.offLineProcess(request); } } catch (BusinessException be) { responseResult.code = 501; responseResult.code = 201; responseResult.msg = be.Message; } catch (Exception ex) @@ -249,9 +246,9 @@ public class OutStockModel { public string endLocCode { get; set; } public string reqId { get; set; } public string reqTime { get; set; } public string endLocCode { get; set; } } } } HH.WCS.Mobox3/HH.WCS.Mobox3.FJJT/config/config.json
@@ -8,6 +8,20 @@ "FacCode": "0000", "WHCode": "W001", // 接驳区、缓存区、机台下线区、成型机叫料区 对应的立库库区 "AreaRelevance": [ { "areaCode": "", "relAreaCode": [ "" ] }, { "areaCode": "", "relAreaCode": [ "" ] } ], // cntrType 1.胎面;2.胎侧;3.内衬;4.帘布;5.环带;6.冠带;7.钢包 // type 1.直连 2.非直连 "AreaProperty": [ @@ -50,7 +64,7 @@ { "areaCode": "LBLKQ", "areaName": "环带库", "cntrType": [ 5,6 ], "cntrType": [ 5, 6 ], "type": 2 }, { @@ -66,8 +80,6 @@ "type": 2 } ], "DeviceInfo": [ HH.WCS.Mobox3/HH.WCS.Mobox3.FJJT/models/TransfeRelevance.cs
@@ -19,7 +19,6 @@ public string S_RELE_AREA { get; set; } // 所属库区 public string S_DEVICE_NO { get; set; } // 设备号 用途:用于查询线体光电,判断缓存位是否为空 public int N_IS_MANUAL { get; set; } // 是否为人工 (0.非人工 2.人工) 用途:切换人工站台 public int N_READ_LOC { get; set; } // 是否读码位 (0、否 1.是) public int N_READ_LOC { get; set; } // 是否读码位 (0、否 1.是) } } HH.WCS.Mobox3/HH.WCS.Mobox3.FJJT/process/DeviceProcess.cs
@@ -35,7 +35,8 @@ // 修改参数6为3 /* NDCApi.ChangeOrderParam(cst.S_CODE, 6, "3");*/ // 修改容器异常状态 ContainerHelper.UpdateCntrState(cst.S_CNTR_CODE, 2, $"{plc.deviceNo}AGV扫码器,扫描RFID:{rfid}与任务RFID:{cst.S_CNTR_CODE}不一致"); ContainerHelper.UpdateCntrState(cst.S_CNTR_CODE, 1); WMSHelper.addRfidAnomalyRecord(cst.S_CNTR_CODE, 2, cst.S_START_LOC, null); } } } HH.WCS.Mobox3/HH.WCS.Mobox3.FJJT/util/Settings.cs
@@ -16,6 +16,7 @@ public static List<LinePlcInfo> linePlcInfo { get; set; } public static List<PlcValue> plcValue { get; set; } public static List<AreaProperty> areaPropertyList { get; set; } public static List<AreaRelevance> areaRelevanceList { get; set; } public static int port { get; set; } public static string WHCode { get; set; } public static string FacCode { get; set; } @@ -73,6 +74,10 @@ { areaPropertyList = JsonConvert.DeserializeObject<List<AreaProperty>>(keyValue.Value.ToString()); } if (keyValue.Name == "AreaRelevance") { areaRelevanceList = JsonConvert.DeserializeObject<List<AreaRelevance>>(keyValue.Value.ToString()); } } } } @@ -92,17 +97,34 @@ return areaPropertyList.Where(a => a.cntrType.Contains(cntrType)).Select(a => a.areaCode).ToList(); } /// <summary> /// 查询存储库区 /// </summary> /// <param name="areaCode"></param> /// <returns></returns> public static List<string> getRelAreaCodes(string areaCode) { List<string> areaCodes = new List<string>(); var areaRelevance = areaRelevanceList.Where(a => a.areaCode == areaCode).FirstOrDefault(); if (areaRelevance != null) { areaCodes = areaRelevance.relAreaCode; } return areaCodes; } public class AreaRelevance { public string areaCode { get; set; } public List<string> relAreaCode { get; set; } } public class AreaProperty { public string areaName { get; set; } public string areaCode { get; set; } public List<int> cntrType { get; set; } // 容器类型 1.胎面;2.胎侧;3.内衬;4.帘布;5.环带;6.冠带;7.钢包 } public class deviceInfo { public string address { get; set; } HH.WCS.Mobox3/HH.WCS.Mobox3.FJJT/wms/ContainerHelper.cs
@@ -79,31 +79,21 @@ return res; }*/ internal static bool AddCntr(string cntrCode ,int detallCount = 1) internal static bool AddCntr(string cntrCode ,int detallCount = 0) { var res = false; var db = new SqlHelper<object>().GetInstance(); var TN_Container = new Container { S_CODE = cntrCode ,N_DETAIL_COUNT = detallCount }; try { db.BeginTran(); var container = db.Queryable<Container>().Where(a => a.S_CODE.Trim() == cntrCode).First(); if (container == null) { db.Insertable<Container>(TN_Container).ExecuteCommand(); res = db.Insertable<Container>(TN_Container).ExecuteCommand() > 0; } else { container.N_DETAIL_COUNT = detallCount; container.N_E_STATE = 0; db.Updateable(container).ExecuteCommand(); } db.CommitTran(); res = true; } catch (Exception ex) { db.RollbackTran(); WMSHelper.addAlarmRecord("系统错误", "高", $"添加容器错误,错误原因:{ex.Message}"); throw new BusinessException($"添加容器错误,错误原因:{ex.Message}"); } @@ -322,17 +312,15 @@ /// /// </summary> /// <param name="cntrCode"></param> /// <param name="state">托盘异常状态 0.默认 1.WCS读码异常 2.AGV读码器读码异常</param> /// <param name="errMsg">异常信息</param> /// <param name="state">托盘异常状态 0.正常 1.异常</param> /// <returns></returns> internal static bool UpdateCntrState(string cntrCode, int state ,string errMsg) { internal static bool UpdateCntrState(string cntrCode, int state) { var res = false; var db = new SqlHelper<object>().GetInstance(); var models = db.Queryable<Container>().Where(a => a.S_CODE.Trim() == cntrCode).ToList(); if (models.Count > 0) { models.ForEach(a => { a.N_E_STATE = state; a.S_ERR_DESC = errMsg; db.Updateable(a).UpdateColumns(it => new { it.N_E_STATE,it.S_ERR_DESC }).ExecuteCommand(); }); res = true; HH.WCS.Mobox3/HH.WCS.Mobox3.FJJT/wms/WMSHelper.cs
@@ -392,6 +392,20 @@ return db.Insertable<AlarmRecord>(alarmRecord).ExecuteCommand()>0; } public static bool addRfidAnomalyRecord(string rfid ,int anomalyType ,string locCode ,string taskNo) { var db = new SqlHelper<object>().GetInstance(); RfidAnomalyRecord anomalyRecord = new RfidAnomalyRecord() { S_RFID = rfid, N_ANOMALY_TYPE = anomalyType, S_ANOMALY_TYPE = RfidAnomalyRecord.getAnomalyType(anomalyType), S_LOC_CODE = locCode, S_TASK_NO = taskNo }; return db.Insertable<AlarmRecord>(anomalyRecord).ExecuteCommand() > 0; } /// <summary> /// 查询成型机线边 /// </summary> HH.WCS.Mobox3/HH.WCS.Mobox3.YNJT_BZP/api/ApiHelper.cs
@@ -36,7 +36,7 @@ ReturnResult result = new ReturnResult(); try { if (model.taskType == "机台半制品入库" || model.taskType == "成型机余料回库") if (model.taskType.Contains("机台半制品入库") || model.taskType.Contains("成型机余料入库")) { var itemInfos = model.itemInfo; if (itemInfos == null || itemInfos.Count == 0) @@ -61,6 +61,7 @@ // 计算生效时间、失效时间 var overage = WMSHelper.getOverage(item.bc_entried); LogHelper.Info($"计算生效时间、失效时间,返回值:{JsonConvert.SerializeObject(overage)}", "WMS"); if (overage != null) { DateTime txndate = DateTime.Parse(item.txndate); HH.WCS.Mobox3/HH.WCS.Mobox3.YNJT_BZP/process/TaskProcess.cs
@@ -92,6 +92,16 @@ if (state == 1102) { LogHelper.Info("向WCS发送取货完成安全退出信号", "AGV"); var locCntrRels = LocationHelper.GetLocCntr(cst.S_START_LOC); if (locCntrRels.Count == 1) { var container = ContainerHelper.GetCntr(locCntrRels[0].S_CNTR_CODE); if (container != null && container.N_TYPE == 0) { LogHelper.Info("取货完成后,起点货位存在母拖,下发母拖入库任务", "AGV"); ApiHelper.baseTrayInStock(cst.S_START_LOC, mst.S_CODE); } } /*result = WCSDispatch.safetyInteraction(cst.S_CODE, cst.S_START_LOC, "2"); //取货完成安全退出*/ result = true; } HH.WCS.Mobox3/HH.WCS.Mobox3.YNJT_BZP/wms/WMSHelper.cs
@@ -943,18 +943,14 @@ var sql1 = "SELECT get_minhour_bar(@barcode, @mcngrp) AS overage_value"; // 使用匿名对象传递参数 var ovg_bar = db.Ado.SqlQuery<int>(sql, new { barcode = bc_entried, mcngrp = "1"}); var minhour_bar = db.Ado.SqlQuery<float>(sql1, new { barcode = bc_entried, mcngrp = "1"}); if (ovg_bar.Count > 0 && minhour_bar.Count > 0) var ovg_bar = db.Ado.SqlQuery<int>(sql, new { barcode = bc_entried, mcngrp = "1"}).First(); var minhour_bar = db.Ado.SqlQuery<float>(sql1, new { barcode = bc_entried, mcngrp = "1"}).First(); Overage overage = new Overage() { Overage overage = new Overage() { MINHOUR = minhour_bar[0], OVERAGE = ovg_bar[0] }; return overage; } return null; MINHOUR = minhour_bar, OVERAGE = ovg_bar }; return overage; } /// <summary> HH.WCS.Mobox3/HH.WCS.Mobox3.YNJT_PT/api/ApiHelper.cs
@@ -48,7 +48,7 @@ OffLineRecord record = new OffLineRecord() { S_RFID = model.rfid, S_DEVICE_NO = model.S_DEVICE_NO, 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, @@ -948,7 +948,7 @@ public class OffLineModel { public string rfid { get; set; } // 托盘号 public string S_DEVICE_NO { get; set; } // 机台号 public string deviceNo { get; set; } // 机台号 public int isUrgent { get; set; } // N_IS_URGENT 是否加急(0.否 1.是) public int isFull { get; set; } // 是否满拖 0.否 1.是 }