.vs/HH.WCS.Mobox3.DSZSH/FileContentIndex/06d8e01f-6afb-4384-90b8-31f0488cd604.vsidxBinary files differ
.vs/HH.WCS.Mobox3.DSZSH/FileContentIndex/21a5a3a3-5cdb-4cd3-a5e2-25be17fb4dfe.vsidxBinary files differ
.vs/HH.WCS.Mobox3.DSZSH/FileContentIndex/6450fb4e-6068-4bff-9055-f0bd1f177c4d.vsidxBinary files differ
.vs/HH.WCS.Mobox3.DSZSH/FileContentIndex/67e4ef9b-7188-43f4-a60f-46c9a1d6bd44.vsidxBinary files differ
.vs/HH.WCS.Mobox3.DSZSH/FileContentIndex/798bf6bf-6818-456f-ab4b-aad13079f168.vsidxBinary files differ
.vs/HH.WCS.Mobox3.DSZSH/FileContentIndex/870c2cc4-322b-42e1-a32f-bc410b5f82a5.vsidxBinary files differ
.vs/HH.WCS.Mobox3.DSZSH/FileContentIndex/c9195d04-088d-47d3-be93-4565501364ba.vsidxBinary files differ
.vs/HH.WCS.Mobox3.DSZSH/FileContentIndex/f1cb2527-5e7a-4ff5-bd94-7e85a024df58.vsidxBinary files differ
Dispatch/NDCApi.cs
@@ -17,7 +17,6 @@ public static string NDCApiUrl { set; get; } static NDCApi() { NDCApiUrl = Settings.NdcApiUrl; } HH.WCS.Mobox3.DSZSH.csproj
@@ -289,6 +289,9 @@ <ItemGroup> <None Include=".editorconfig" /> <None Include="App.config" /> <None Include="config\config.comment.json"> <CopyToOutputDirectory>Always</CopyToOutputDirectory> </None> <None Include="config\config.json"> <CopyToOutputDirectory>Always</CopyToOutputDirectory> </None> Models/TN_CG_Detail.cs
@@ -76,7 +76,7 @@ // ---------------- // TODO // [NOTE] ///// <summary> ///// 物料所在的区域 Models/TN_Container_Item.cs
@@ -8,8 +8,13 @@ namespace HH.WCS.Mobox3.DSZSH.models { /// <summary> /// 容器-物料类型 关系表 /// 容器-物料类型 关系表(只用于托盘) /// </summary> /// <remarks> /// 目前理解为:第一次满托下料的时候,将绑定关系记录在这个表中,然后不再删除<br/> /// 后面空托叫托盘的时候,联表查物料编号<br/> /// 后续可能是提前维护,将容器和物料编码写入这个表,或者直接让类型在容器编码中体现 /// </remarks> [SugarTable("TN_Container_Item")] public class TN_Container_Item : BaseModel { public string S_CNTR_CODE { get; set; } api/ApiHelper.cs
@@ -33,7 +33,7 @@ // 将PDA提供的物料编码与贴标机的信息比对 var cgDetail = db.Queryable<TN_CG_Detail>() .Where(d => d.S_ITEM_CODE == model.ItemCode && d.S_BATCH_NO == model.BatchNo) // 指定:物料编码、批次号 .Where(d => d.N_ITEM_STATE == 1 && d.S_ITEM_STATE == "待检") // NOTE 冗余检查:物料状态应该为 1待检 .Where(d => d.N_ITEM_STATE == 1 && d.S_ITEM_STATE == "待检") // 新增物料,故物料状态应该为 1待检 .First(); if (cgDetail == null) { @@ -42,6 +42,8 @@ return NewSimpleResult(1, info); } // 起点货位绑定后,可以不立即设置N_CURRENT_NUM为1 // 因为AGV取货后就会恢复0,而且货位上锁后不会被访问到 var startLoc = db.Queryable<TN_Location>() .Where(l => l.S_CODE == model.StartLoc) // 指定:起点货位号 .Where(l => l.N_LOCK_STATE == 0 && l.S_LOCK_STATE == "无" && l.C_ENABLE == "Y") // 筛选:未上锁 @@ -63,9 +65,9 @@ // TODO 满箱入库算法待优化 var endLoc = db.Queryable<TN_Location>() .Where(a => Settings.AreaMap[AreaName.满托存放区].Contains(a.S_AREA_CODE)) .Where(a => a.N_LOCK_STATE == 0 && a.S_LOCK_STATE == "无" && a.C_ENABLE == "Y") // 筛选:未上锁 .Where(a => a.N_CURRENT_NUM == 0) // 筛选:空货位 .Where(l => Settings.AreaMap[AreaName.满托存放区].Contains(l.S_AREA_CODE)) .Where(l => l.N_LOCK_STATE == 0 && l.S_LOCK_STATE == "无" && l.C_ENABLE == "Y") // 筛选:未上锁 .Where(l => l.N_CURRENT_NUM == 0) // 筛选:空货位 .OrderBy(l => l.N_LAYER) .First(); @@ -243,10 +245,11 @@ var db = new SqlHelper<object>().GetInstance(); var info = ""; try { // 现在PDA没有单独的绑定流程,绑定在入库时完成 var startLoc = db.Queryable<TN_Location>() .Where(a => a.S_CODE == model.StartLoc) // 指定:起点货位 .Where(a => a.N_LOCK_STATE == 0 && a.S_LOCK_STATE == "无" && a.C_ENABLE == "Y") // 筛选:未上锁 .Where(a => a.N_CURRENT_NUM == 1) .Where(l => l.S_CODE == model.StartLoc) // 指定:起点货位 .Where(l => l.N_LOCK_STATE == 0 && l.S_LOCK_STATE == "无" && l.C_ENABLE == "Y") // 筛选:未上锁 .Where(l => l.N_CURRENT_NUM == 0) // 绑定前货位为空 .First(); if (startLoc == null) { @@ -256,22 +259,29 @@ } // 查看容器与起点货位是否绑定 var locCntrRel = db.Queryable<TN_Loc_Container>() .Where(c => c.S_LOC_CODE == model.StartLoc && c.S_CNTR_CODE == model.CntrCode) .First(); //var locCntrRel = db.Queryable<TN_Loc_Container>() // .Where(c => c.S_LOC_CODE == model.StartLoc && c.S_CNTR_CODE == model.CntrCode) // .First(); if (locCntrRel == null) { info = $"起点位置{model.StartLoc}没有绑定容器{model.CntrCode}"; LogHelper.Info(info); return NewSimpleResult(3, info); } //if (locCntrRel == null) { // info = $"起点位置{model.StartLoc}没有绑定容器{model.CntrCode}"; // LogHelper.Info(info); // return NewSimpleResult(3, info); //} // 绑定货位和容器号 var locCntrRel = new TN_Loc_Container { S_LOC_CODE = model.StartLoc, S_CNTR_CODE = model.CntrCode, S_CNTR_TYPE = "托盘", }; // TODO 暂定选择最低层按区位顺序入库,后面待修改 var endLoc = db.Queryable<TN_Location>() .Where(l => Settings.AreaMap[AreaName.空托存放区].Contains(l.S_AREA_CODE)) .Where(a => a.N_LOCK_STATE == 0 && a.S_LOCK_STATE == "无" && a.C_ENABLE == "Y") // 筛选:未上锁 .Where(a => a.N_CURRENT_NUM == 0) .OrderBy(l => l.N_LAYER) .Where(l => l.N_LOCK_STATE == 0 && l.S_LOCK_STATE == "无" && l.C_ENABLE == "Y") // 筛选:未上锁 .Where(l => l.N_CURRENT_NUM == 0) .OrderBy(l => new { l.N_LAYER, row=SqlFunc.Desc(l.S_AREA_CODE) }) .First(); if (endLoc == null) { @@ -287,6 +297,13 @@ LocationHelper.LockLoc(ref endLoc, 1); // 终点入库锁 using (var tran = db.Ado.UseTran()) { if (db.Insertable<TN_Loc_Container>(locCntrRel).ExecuteCommand() <= 0) { info = $"插入货位容器关系失败:" + JsonConvert.SerializeObject(locCntrRel); tran.RollbackTran(); LogHelper.Info(info); return NewSimpleResult(4, info); } if (db.Updateable<TN_Location>(startLoc).UpdateColumns(it => new { it.N_LOCK_STATE, it.S_LOCK_STATE, @@ -341,9 +358,9 @@ var info = ""; try { var startLoc = db.Queryable<TN_Location>() .Where(a => a.S_CODE == model.StartLoc) .Where(a => a.N_LOCK_STATE == 0 && a.S_LOCK_STATE == "无" && a.C_ENABLE == "Y") // 筛选:未上锁 .Where(a => a.N_CURRENT_NUM == 1) // 筛选:有货货位 .Where(l => l.S_CODE == model.StartLoc) .Where(l => l.N_LOCK_STATE == 0 && l.S_LOCK_STATE == "无" && l.C_ENABLE == "Y") .Where(l => l.N_CURRENT_NUM == 0) // 绑定前货位为空 .First(); if (startLoc == null) { @@ -353,21 +370,28 @@ } // 查看容器与起点货位是否绑定 var locCntrRel = db.Queryable<TN_Loc_Container>() .Where(c => c.S_LOC_CODE == model.StartLoc && c.S_CNTR_CODE == model.CntrCode) .First(); //var locCntrRel = db.Queryable<TN_Loc_Container>() // .Where(c => c.S_LOC_CODE == model.StartLoc && c.S_CNTR_CODE == model.CntrCode) // .First(); if (locCntrRel == null) { info = $"起点位置{model.StartLoc}没有绑定容器{model.CntrCode}"; LogHelper.Info(info); return NewSimpleResult(3, info); } //if (locCntrRel == null) { // info = $"起点位置{model.StartLoc}没有绑定容器{model.CntrCode}"; // LogHelper.Info(info); // return NewSimpleResult(3, info); //} // TODO 暂定选择最低层按区位顺序入库,后面待修改 // 绑定货位和容器号 var locCntrRel = new TN_Loc_Container { S_LOC_CODE = model.StartLoc, S_CNTR_CODE = model.CntrCode, S_CNTR_TYPE = "好运箱", }; // TODO 暂定选择最低层顺序入库,后面待修改 var endLoc = db.Queryable<TN_Location>() .Where(l => Settings.AreaMap[AreaName.空箱存放区].Contains(l.S_AREA_CODE)) .Where(a => a.N_LOCK_STATE == 0 && a.S_LOCK_STATE == "无" && a.C_ENABLE == "Y") // 筛选:未上锁 .Where(a => a.N_CURRENT_NUM == 0) .Where(l => l.N_LOCK_STATE == 0 && l.S_LOCK_STATE == "无" && l.C_ENABLE == "Y") .Where(l => l.N_CURRENT_NUM == 0) .OrderBy(l => new { l.N_LAYER }) .First(); @@ -382,6 +406,13 @@ LocationHelper.LockLoc(ref endLoc, 1); // 终点入库锁 using (var tran = db.Ado.UseTran()) { if (db.Insertable<TN_Loc_Container>(locCntrRel).ExecuteCommand() <= 0) { info = $"插入货位容器关系失败:" + JsonConvert.SerializeObject(locCntrRel); tran.RollbackTran(); LogHelper.Info(info); return NewSimpleResult(4, info); } if (db.Updateable<TN_Location>(startLoc).UpdateColumns(it => new { it.N_LOCK_STATE, it.S_LOCK_STATE, @@ -437,23 +468,53 @@ var taskInfo = Settings.TaskMap[taskName]; var info = ""; try { // TODO 符合物料信息的货位 // 找符合物料信息的货位 //var startLoc = db.Queryable<TN_Location>() // .LeftJoin<TN_Loc_Container>((l, c) => l.S_CODE == c.S_LOC_CODE) // 联表:货位容器关系表 // .LeftJoin<TN_Container_Item>((l, c, i) => c.S_CNTR_CODE == i.S_CNTR_CODE) // 联表:容器与物料类型绑定表 // .Where(l => taskInfo.StartAreas.Contains(l.S_AREA_CODE)) // 限定在空托存放区中找容器货位 // .Where(l => l.N_LOCK_STATE == 0 && l.S_LOCK_STATE == "无" && l.C_ENABLE == "Y") // 筛选:没有锁状态 // .Where(l => l.N_CURRENT_NUM == 1) // 筛选:有货货位 // .Where((l, c) => c.S_CNTR_CODE == model.CntId) // 找指定容器号 // .Where((l, c, i) => i.S_ITEM_CODE == model.ItemCode) // 确保容器编码绑定的物料编码与所需一致 // .First(); //if (startLoc == null) { // info = $"在空托存放区中,找不到符合{model.ItemCode}物料,且编码为{model.CntId}的空托盘"; // LogHelper.Info(info); // return NewSimpleResult(2, info); //} //var locCntrRel = db.Queryable<TN_Loc_Container>().First( // a => a.S_LOC_CODE == startLoc.S_CODE // && a.S_CNTR_CODE == model.CntId); //if (locCntrRel == null) { // return NewSimpleResult(3, $"起点位置 '{startLoc.S_CODE}' 没有绑定容器 '{model.CntId}'"); //} var cntrItemRel = db.Queryable<TN_Container_Item>() .Where(i => i.S_CNTR_CODE == model.CntId && i.S_ITEM_CODE == model.ItemCode) .First(); if (cntrItemRel == null) { info = $"容器{model.CntId}不符合物料{model.ItemCode}:没有在容器物料类型登记表中找到"; LogHelper.Info(info); return NewSimpleResult(2, info); } var startLoc = db.Queryable<TN_Location>() .Where(l => taskInfo.StartAreas.Contains(l.S_AREA_CODE)) .Where(a => a.N_LOCK_STATE == 0 && a.S_LOCK_STATE == "无" && a.C_ENABLE == "Y") // 筛选:未上锁 .Where(a => a.N_CURRENT_NUM == 1) // 筛选:有货货位 .LeftJoin<TN_Loc_Container>((l, c) => l.S_CODE == c.S_LOC_CODE) // 联表:货位容器关系表 .Where(l => taskInfo.StartAreas.Contains(l.S_AREA_CODE)) // 限定在空托存放区中找容器货位 .Where(l => l.N_LOCK_STATE == 0 && l.S_LOCK_STATE == "无" && l.C_ENABLE == "Y") // 筛选:没有锁状态 .Where(l => l.N_CURRENT_NUM == 1) // 筛选:有货货位 .Where((l, c) => c.S_CNTR_CODE == model.CntId) // 找指定容器号 .First(); if (startLoc == null) { return NewSimpleResult(2, $"没有合适的起点位置"); } var locCntrRel = db.Queryable<TN_Loc_Container>().First( a => a.S_LOC_CODE == startLoc.S_CODE && a.S_CNTR_CODE == model.CntId); if (locCntrRel == null) { return NewSimpleResult(3, $"起点位置 '{startLoc.S_CODE}' 没有绑定容器 '{model.CntId}'"); info = $"在空托存放区中,找不到符合{model.ItemCode}物料,且编码为{model.CntId}的空托盘"; LogHelper.Info(info); return NewSimpleResult(3, info); } var endLoc = db.Queryable<TN_Location>() @@ -464,10 +525,12 @@ .First(); if (endLoc == null) { return NewSimpleResult(4, $"终点位置 不存在或不具备放货要求"); info = $"终点位置 不存在或不具备放货要求"; LogHelper.Info(info); return NewSimpleResult(4, info); } var cntId = locCntrRel.S_CNTR_CODE; var cntId = model.CntId; var task = WCSHelper.BuildTask(startLoc, endLoc, cntId, taskName); LocationHelper.LockLoc(ref startLoc, 2); // 起点出库锁 @@ -529,23 +592,27 @@ var taskInfo = Settings.TaskMap[taskName]; var info = ""; try { // TODO 符合物料信息的货位 var startLoc = db.Queryable<TN_Location>() .LeftJoin<TN_Loc_Container>((l, c) => l.S_CODE == c.S_LOC_CODE) .Where(l => taskInfo.StartAreas.Contains(l.S_AREA_CODE)) .Where(a => a.N_LOCK_STATE == 0 && a.S_LOCK_STATE == "无" && a.C_ENABLE == "Y") // 筛选:未上锁 .Where(a => a.N_CURRENT_NUM == 1).First(); .Where(l => l.N_LOCK_STATE == 0 && l.S_LOCK_STATE == "无" && l.C_ENABLE == "Y") .Where(l => l.N_CURRENT_NUM == 1) .Where((l, c) => c.S_CNTR_CODE == model.CntId) .First(); if (startLoc == null) { return NewSimpleResult(2, $"没有合适的起点位置"); info = $"在空箱存放区中,找不到编码为{model.CntId}的空好运箱"; LogHelper.Info(info); return NewSimpleResult(2, info); } var locCntrRel = db.Queryable<TN_Loc_Container>().First( a => a.S_LOC_CODE == startLoc.S_CODE && a.S_CNTR_CODE == model.CntId); //var locCntrRel = db.Queryable<TN_Loc_Container>().First( // a => a.S_LOC_CODE == startLoc.S_CODE // && a.S_CNTR_CODE == model.CntId); if (locCntrRel == null) { return NewSimpleResult(3, $"起点位置 '{startLoc.S_CODE}' 没有绑定容器 '{model.CntId}'"); } //if (locCntrRel == null) { // return NewSimpleResult(3, $"起点位置 '{startLoc.S_CODE}' 没有绑定容器 '{model.CntId}'"); //} var endLoc = db.Queryable<TN_Location>() .Where(l => Settings.AreaMap[AreaName.包装区].Contains(l.S_AREA_CODE)) @@ -558,7 +625,7 @@ return NewSimpleResult(4, $"终点位置 不存在或不具备放货要求"); } var cntId = locCntrRel.S_CNTR_CODE; var cntId = model.CntId; var task = WCSHelper.BuildTask(startLoc, endLoc, cntId, taskName); LocationHelper.LockLoc(ref startLoc, 2); // 起点出库锁 @@ -935,9 +1002,30 @@ return NewSimpleResult(2, $"起点货位 {model.StartLoc}"); } var endLoc = db.Queryable<TN_Location, TN_Loc_Container>((l, c) => l.S_CODE == c.S_LOC_CODE) .Where((l, c) => c.S_CNTR_TYPE == locCntrRel.S_CNTR_TYPE) var endLoc = new TN_Location(); if (locCntrRel.S_CNTR_TYPE == "托盘") { endLoc = db.Queryable<TN_Location>() .Where(l => Settings.AreaMap[AreaName.满托存放区].Contains(l.S_AREA_CODE)) .Where(l => l.N_LOCK_STATE == 0 && l.S_LOCK_STATE == "无" && l.C_ENABLE == "Y") // 筛选:未上锁 .Where(l => l.N_CURRENT_NUM == 0) // 起点绑定前没有容器 .First(); } else if (locCntrRel.S_CNTR_TYPE =="好运箱"){ endLoc = db.Queryable<TN_Location>() .Where(l => Settings.AreaMap[AreaName.满箱存放区].Contains(l.S_AREA_CODE)) .Where(l => l.N_LOCK_STATE == 0 && l.S_LOCK_STATE == "无" && l.C_ENABLE == "Y") // 筛选:未上锁 .Where(l => l.N_CURRENT_NUM == 0) // 起点绑定前没有容器 .First(); } else { endLoc = null; } //var endLoc = db.Queryable<TN_Location, TN_Loc_Container>((l, c) => l.S_CODE == c.S_LOC_CODE) // .Where((l, c) => c.S_CNTR_TYPE == locCntrRel.S_CNTR_TYPE) // .Where(l => l.N_LOCK_STATE == 0 && l.S_LOCK_STATE == "无" && l.C_ENABLE == "Y") // 筛选:未上锁 // .Where(l => l.N_CURRENT_NUM == 0) // 起点绑定前没有容器 // .First(); if (endLoc == null) { return NewSimpleResult(3, $"不存在合适的终点货位可以回库"); api/DebugController.cs
@@ -82,13 +82,15 @@ //typeof(SysHelper.OI_SYS_MAXID), //typeof(TN_Inbound_Order), typeof(TN_Check_Detail), //typeof(TN_Check_Detail), //typeof(TN_Check_Order), //typeof(TN_CNTR_ITEM), //typeof(TN_Outbound_Detail), //typeof(TN_Outbound_Order), //typeof(TN_Shift_Order), //typeof(TN_Shift_Detail) typeof(TN_Container_Item), }; using (var tran = db.Ado.UseTran()) { @@ -203,6 +205,68 @@ return $"Error reading CSV file: {ex.Message}"; } } /// <summary> /// DEBUG:根据容器物料信息表,插入容器物料登记信息表 /// </summary> /// <returns></returns> [HttpPost] [Route("InsertContainerItemByCgDetail")] public string InsertContainerItemByCgDetail(CoverInfo _) { var db = new SqlHelper<object>().GetInstance(); try { var cgDetailList = db.Queryable<TN_CG_Detail>().ToList(); var cntrItemList = new List<TN_Container_Item>(); foreach (var cgDetail in cgDetailList) { if (db.Queryable<TN_Container_Item>().Where(i => i.S_CNTR_CODE == cgDetail.S_CNTR_CODE).Any()) { continue; } cntrItemList.Add(new TN_Container_Item { S_CNTR_CODE = cgDetail.S_CNTR_CODE, S_ITEM_CODE = cgDetail.S_ITEM_CODE, }); } if (db.Insertable<TN_Container_Item>(cntrItemList).ExecuteCommand() <= 0) { return "插入失败"; } return "插入成功"; } catch (Exception ex) { LogHelper.InfoEx(ex); return ex.Message; } } /// <summary> /// DEBUG:根据容器物料信息表,插入容器物料登记信息表 /// </summary> /// <returns></returns> [HttpPost] [Route("InsertContainerItem")] public string InsertContainerItem(InsertCntrItemInfo cgDetail) { var db = new SqlHelper<object>().GetInstance(); try { var cntrItem = new TN_Container_Item { S_CNTR_CODE = cgDetail.Cntr, S_ITEM_CODE = cgDetail.Item, }; if (db.Insertable<TN_Container_Item>(cntrItem).ExecuteCommand() <= 0) { return "插入失败"; } return "插入成功"; } catch (Exception ex) { LogHelper.InfoEx(ex); return ex.Message; } } } /// <summary> @@ -227,6 +291,11 @@ public bool IsCover { set; get; } = false; } public class InsertCntrItemInfo { public string Cntr { set; get; } public string Item { set; get; } } /// <summary> /// /// </summary> api/MoboxController.cs
@@ -59,14 +59,14 @@ var apiName = "空托/空箱入库"; LogHelper.InfoApi(apiName, model); if (model.CntrType == "托盘") { if (model.CntrType == "空托盘") { return ApiHelper.EmptyInboundPallet(model); } else if (model.CntrType == "好运箱") { else if (model.CntrType == "空好运箱") { return ApiHelper.EmptyInboundGoodpack(model); } else { return NewSimpleResult(-1, $"容器类型 '{model.CntrType}' 不合法:应为 '托盘' 或 '好运箱'"); return NewSimpleResult(-1, $"容器类型 '{model.CntrType}' 不合法:应为 '空托盘' 或 '空好运箱'"); } } config/config.comment.json
New file @@ -0,0 +1,201 @@ { "WebApiUrl": "http://192.168.1.141:8901", //WCS自己的地址 "NdcApiUrl": "http://127.0.0.1:5201/api/order/", // "SqlServer": "Data Source=192.168.1.87;Initial Catalog=AMS_OIMobox;User ID=sa;Password=123456;", "TcpServerIp": "127.0.0.1", "TcpServerPort": 8085, "Areas": [ // 货区 { "Name": "包装区", "Codes": [ "BZQ" ] }, { "Name": "操作区", "Codes": [ "CZQ1", "CZQ2" ] }, { "Name": "货架区", "Codes": [ "HJQ1", "HJQ2", "HJQ3", "HJQ4" ] }, { "Name": "空托存放区", "Codes": [ "KTCFQ" ] }, { "Name": "空箱存放区", "Codes": [ "HJQ1" ] }, { "Name": "满托存放区", "Codes": [ "HJQ2" ] }, { "Name": "满箱存放区", "Codes": [ "HJQ3" ] }, { "Name": "抽检区", "Codes": [ "CJQ1" ] }, { "Name": "抽检异常区", "Codes": [ "CJYCQ" ] }, { "Name": "空箱操作区", "Codes": [ "CZQ1" ] }, { "Name": "满箱操作区", "Codes": [ "CZQ2" ] }, { "Name": "空托入库接驳区", "Codes": [ "KTRKJBQ" ] }, { "Name": "空箱入库接驳区", "Codes": [ "KXRKJBQ1", "KXRKJBQ2" ] }, { "Name": "汽车出库备货区", // 汽车出库月台 "Codes": [ "CKQ-QC" ] // 拼音:出库区-汽车 }, { "Name": "火车出库备货区", // 火车出库月台 "Codes": [ "CKQ-HC" ] // 拼音:出库区-火车 } ], "Tasks": [ { "Name": "托盘-满托下线入库", "StartAreas": [ "BZQ" ], "EndAreas": [ "HJQ2" ] }, { "Name": "好运箱-满箱下线入库", "StartAreas": [ "CZQ2" ], "EndAreas": [ "HJQ3" ] }, { "Name": "托盘-空托上线", "StartAreas": [ "KTCFQ" ], "EndAreas": [ "BZQ" ] }, { "Name": "好运箱-空箱上线", "StartAreas": [ "HJQ1" ], "EndAreas": [ "CZQ1" ] }, { "Name": "托盘-空托入库", "StartAreas": [ "KTRKJBQ" ], "EndAreas": [ "KTCFQ" ] }, { "Name": "好运箱-空箱入库", "StartAreas": [ "KXRKJBQ1" ], "EndAreas": [ "HJQ1" ] }, { "Name": "抽检-出库" }, { "Name": "抽检-合格回库" }, { "Name": "抽检-不合格移库" }, { "Name": "成品胶出库" } ], "ProductionLines": [ // 产线的 { "Id": "1", "Name": "托盘产线1", "PlcIp": "127.0.0.1", "PlcPort": 502, "SlaveId": 1, "OnLoc": [ "CX11" ], "OffLoc": [ "CX12" ] }, { "Id": "2", "Name": "托盘产线2", "PlcIp": "127.0.0.1", "PlcPort": 503, "SlaveId": 2, "OnLoc": [ "CX21" ], "OffLoc": [ "CX22" ] }, { "Id": "3", "Name": "好运箱产线1", "PlcIp": "127.0.0.1", "PlcPort": 504, "SlaveId": 3, "OnLoc": [ "CX31" ], "OffLoc": [ "CX32" ] }, { "Id": "4", "Name": "好运箱产线2", "PlcIp": "127.0.0.1", "PlcPort": 505, "SlaveId": 4, "OnLoc": [ "CX41" ], "OffLoc": [ "CX42" ] } ], "ProdAgvSite": [ { "Code": "work111", "ProdId": 0 }, { "Code": "work112", "ProdId": 0 }, { "Code": "work121", "ProdId": 1 }, { "Code": "work122", "ProdId": 1 }, { "Code": "work131", "ProdId": 2 }, { "Code": "work132", "ProdId": 2 }, { "Code": "work141", "ProdId": 3 }, { "Code": "work142", "ProdId": 3 } ] } config/config.json
@@ -11,11 +11,11 @@ }, { "Name": "操作区", "Codes": [ "CZQ1", "CZQ2" ] "Codes": [ "CZQ-KX", "CZQ-MX" ] }, { "Name": "货架区", "Codes": [ "HJQ1", "HJQ2", "HJQ3", "HJQ4" ] "Codes": [ "HJQ-KX", "HJQ-MT", "HJQ-MT" ] }, { "Name": "空托存放区", @@ -23,19 +23,19 @@ }, { "Name": "空箱存放区", "Codes": [ "HJQ1" ] "Codes": [ "HJQ-KX" ] }, { "Name": "满托存放区", "Codes": [ "HJQ2" ] "Codes": [ "HJQ-MT" ] }, { "Name": "满箱存放区", "Codes": [ "HJQ3" ] "Codes": [ "HJQ-MX" ] }, { "Name": "抽检区", "Codes": [ "CJQ1" ] "Codes": [ "CJQ" ] }, { "Name": "抽检异常区", @@ -43,39 +43,39 @@ }, { "Name": "空箱操作区", "Codes": [ "CZQ1" ] "Codes": [ "CZQ-KX" ] }, { "Name": "满箱操作区", "Codes": [ "CZQ2" ] "Codes": [ "CZQ-MX" ] }, { "Name": "空托入库接驳区", "Codes": [ "KTRKJBQ" ] "Codes": [ "JBQ-KT" ] }, { "Name": "空箱入库接驳区", "Codes": [ "KXRKJBQ1", "KXRKJBQ2" ] "Codes": [ "JBQ-KX1", "JBQ-KX2" ] }, { "Name": "汽车出库备货区", "Codes": [ "QCCKBHQ" ] "Codes": [ "CKQ-QC" ] }, { "Name": "火车出库备货区", "Codes": [ "HCCKBHQ" ] "Codes": [ "CKQ-HC" ] } ], "Tasks": [ { "Name": "托盘-满托下线入库", "StartAreas": [ "BZQ" ], "EndAreas": [ "HJQ2" ] "EndAreas": [ "HJQ-MT" ] }, { "Name": "好运箱-满箱下线入库", "StartAreas": [ "CZQ2" ], "EndAreas": [ "HJQ3" ] "StartAreas": [ "CZQ-MX" ], "EndAreas": [ "HJQ-MX" ] }, { "Name": "托盘-空托上线", core/Monitor.cs
@@ -66,6 +66,21 @@ S_CNTR_CODE = cntrCode, }; // TODO 每次轮询都检查对应容器是否已登记,登记则更新,未登记则插入 var cntrItemRel = db.Queryable<TN_Container_Item>() .Where(i => i.S_CNTR_CODE == cntrCode).First(); var insertTable = cntrItemRel == null; if (insertTable) { // 暂定在满托下线入库的时候,登记托盘容器-物料号关系(后面可能会改成系统维护) cntrItemRel = new TN_Container_Item { S_ITEM_CODE = itemCode, S_CNTR_CODE = cntrCode, }; } // END TODO var startLoc = db.Queryable<TN_Location>() .Where(l => l.S_CODE == startLocCode) // 指定:起点货位号 .Where(l => l.N_LOCK_STATE == 0 && l.S_LOCK_STATE == "无" && l.C_ENABLE == "Y") // 筛选:未上锁 @@ -93,7 +108,6 @@ // //return; //} // TODO 满箱入库算法待优化 var endLoc = db.Queryable<TN_Location>() .Where(a => Settings.AreaMap[AreaName.空托存放区].Contains(a.S_AREA_CODE)) .Where(a => a.N_LOCK_STATE == 0 && a.S_LOCK_STATE == "无" && a.C_ENABLE == "Y") // 筛选:未上锁 @@ -120,6 +134,25 @@ LogHelper.Info(info); continue; } // TODO 插入或更新容器与物料类型的绑定表 if (insertTable) { if (db.Insertable<TN_Container_Item>(cntrItemRel).ExecuteCommand() <= 0) { tran.RollbackTran(); info = $"登记容器物料类型绑定表失败:物料编码{cntrItemRel.S_ITEM_CODE},容器编码{cntrItemRel.S_CNTR_CODE}"; LogHelper.Info(info); continue; } } else { if (db.Updateable<TN_Container_Item>(cntrItemRel).ExecuteCommand() <= 0) { tran.RollbackTran(); info = $"登记容器物料类型绑定表失败:物料编码{cntrItemRel.S_ITEM_CODE},容器编码{cntrItemRel.S_CNTR_CODE}"; LogHelper.Info(info); continue; } } // END TODO if (db.Insertable<TN_Loc_Container>(locCntrRel).ExecuteCommand() <= 0) { tran.RollbackTran(); @@ -206,7 +239,7 @@ } var lastDetail = db.Queryable<TN_Outbound_Detail>() .Where(d => d.S_OO_NO == order.S_NO && d.N_B_STATE == 2) // TODO 或者改成查task .Where(d => d.S_OO_NO == order.S_NO && d.N_B_STATE == 2) // [NOTE] 或者改成查task .First(); if (lastDetail != null) { util/LogHelper.cs
@@ -70,8 +70,7 @@ } } // ------------ #region DIY public static void InfoEx(Exception ex) { Info($"发生了异常:{ex.Message}\n{ex.StackTrace}"); } @@ -79,6 +78,7 @@ public static void InfoApi(string apiName, object model) { Info($"触发API:{apiName} " + JsonConvert.SerializeObject(model), "API"); } #endregion }