.vs/HH.WCS.Mobox3.AnGang/FileContentIndex/040fc824-81e8-4390-903b-5e7d705a18ce.vsidxBinary files differ
.vs/HH.WCS.Mobox3.AnGang/FileContentIndex/1b7f29d3-94a7-4eab-a19b-3b99fefb9d52.vsidxBinary files differ
.vs/HH.WCS.Mobox3.AnGang/FileContentIndex/34ca764b-7d34-4fbf-b885-47b92ae831ee.vsidxBinary files differ
.vs/HH.WCS.Mobox3.AnGang/FileContentIndex/5ccf4a7c-ee31-4f90-9aba-eb5f05866b98.vsidxBinary files differ
.vs/HH.WCS.Mobox3.AnGang/FileContentIndex/67c4855d-af0b-4d46-837b-fbaab232d736.vsidxBinary files differ
.vs/HH.WCS.Mobox3.AnGang/FileContentIndex/ccea7477-49f1-46b2-a1d0-45ffab1fc2c9.vsidxBinary files differ
Program.cs
@@ -129,6 +129,9 @@ tasks.Add(GetTask(WCSCore.Dispatch)); //tasks.Add(GetTask(Monitor.CheckCountOrder)); tasks.Add(GetTask(Monitor.InboundDataSync)); tasks.Add(GetTask(Monitor.OutboundDataSync)); Task.WaitAll(tasks.ToArray()); } public void Stop() { Console.WriteLine("work stopped"); } api/AgvController.cs
@@ -17,7 +17,6 @@ /// <summary> /// 设备信息上报(hosttoagv上报、杭奥堆垛机、国自agv) /// </summary> [RoutePrefix("agv")] public class AgvController : ApiController { /// <summary> api/ApiHelper.cs
@@ -9,6 +9,8 @@ using HH.WCS.Mobox3.AnGang.util; using HH.WCS.Mobox3.AnGang.wms; using Newtonsoft.Json; using static HH.WCS.Mobox3.AnGang.api.ApiModel; using static HH.WCS.Mobox3.AnGang.api.OtherModel; @@ -30,7 +32,7 @@ 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 == 0) .Where(a => a.N_CURRENT_NUM == 0) .Where(a => startAreas.Contains(a.S_AREA_CODE)) .First(); @@ -76,9 +78,9 @@ if (!int.TryParse(model.Row.Trim(), out int row)) { return BuildSimpleResult(2, $"{model.Row} 不合法:无法转成整数类型"); } // 货架排号只能是 0 - 8 if (row <= 0 || row > 8) { return BuildSimpleResult(2, $"货架号 {model.Row} 必须是1-8之间的整数"); // 货架排号只能是 0 - 8(111-118) if (row <= 110 || row > 118) { return BuildSimpleResult(2, $"货架号 {model.Row} 必须是111-118之间的整数"); } } @@ -202,9 +204,9 @@ if (!int.TryParse(model.Row.Trim(), out int row)) { return BuildSimpleResult(2, $"{model.Row} 不合法:无法转成整数类型"); } // 货架排号只能是 0 - 8 if (row <= 0 || row > 8) { return BuildSimpleResult(2, $"货架号 {model.Row} 必须是1-8之间的整数"); // 货架排号只能是 0 - 8(111-118) if (row <= 110 || row > 118) { return BuildSimpleResult(2, $"货架号 {model.Row} 必须是111-118之间的整数"); } } @@ -617,11 +619,25 @@ var db = new SqlHelper<object>().GetInstance(); try { var err = ""; var cgDetailList = new List<TN_CG_Detail>(); var recordList = new List<TN_Inbound_DataRecord>(); if (model.stockTransactions.Count == 0) { return BuildErpResult(400, "不能传入空的数据列表"); } //var info = ""; //var cgDetailList = new List<TN_CG_Detail>(); var insetRecordList = new List<TN_Inbound_DataRecord>(); var deleteRecordOldList = new List<TN_Inbound_DataRecord> (); //var errList = new List<TN_Inbound_DataRecord>(); foreach (var transaction in model.stockTransactions) { var recordOld = db.Queryable<TN_Inbound_DataRecord>() .Where(r => r.S_LOCATION_CODE == transaction.locationCode).First(); if (recordOld != null) { deleteRecordOldList.Add(recordOld); //errList.Add(recordOld); //continue; } // 写入记录表 var record = new TN_Inbound_DataRecord { S_LOCATION_CODE = transaction.locationCode, @@ -639,44 +655,58 @@ S_SUPPLIER_NAME = transaction.supplierName, S_INVENTORY_MAN = transaction.inventoryManager }; recordList.Add(record); insetRecordList.Add(record); // 查询对应物料 var cgDetail = db.Queryable<TN_Location, TN_Loc_Container, TN_CG_Detail> ((l, c, d) => l.S_CODE == c.S_LOC_CODE && c.S_CNTR_CODE == d.S_CNTR_CODE) .Where(l => l.S_CODE == transaction.locationCode) .Select((l, c, d) => d) .First(); //// 查询对应物料 //var cgDetail = db.Queryable<TN_Location, TN_Loc_Container, TN_CG_Detail> // ((l, c, d) => l.S_CODE == c.S_LOC_CODE && c.S_CNTR_CODE == d.S_CNTR_CODE) // .Where(l => l.S_CODE == transaction.locationCode) // .Select((l, c, d) => d) // .First(); if (cgDetail == null) { err += $"储位码{transaction.locationCode}对应的货位物料不存在!"; continue; } cgDetail.S_ITEM_CODE = transaction.itemCode; cgDetail.S_ITEM_NAME = transaction.itemName; //if (cgDetail == null) { // err += $"储位码{transaction.locationCode}对应的货位物料不存在!"; // continue; //} //cgDetail.S_ITEM_CODE = transaction.itemCode; //cgDetail.S_ITEM_NAME = transaction.itemName; cgDetailList.Add(cgDetail); //cgDetailList.Add(cgDetail); } using (var tran = db.Ado.UseTran()) { if (db.Insertable<TN_Inbound_DataRecord>(recordList).ExecuteCommand() <= 0) { if (deleteRecordOldList.Count != 0 && db.Deleteable<TN_Inbound_DataRecord>(deleteRecordOldList).ExecuteCommand() <= 0) { tran.RollbackTran(); return BuildErpResult(500, $"写入入库记录表失败"); return BuildErpResult(500, $"删除旧入库记录数据失败:{JsonConvert.SerializeObject(deleteRecordOldList)}"); } if (db.Updateable<TN_CG_Detail>(cgDetailList).ExecuteCommand() <= 0) { if (db.Insertable<TN_Inbound_DataRecord>(insetRecordList).ExecuteCommand() <= 0) { tran.RollbackTran(); return BuildErpResult(500, $"更改物料信息失败"); return BuildErpResult(500, $"写入入库记录表失败!"); } //if (db.Updateable<TN_CG_Detail>(cgDetailList).ExecuteCommand() <= 0) { // tran.RollbackTran(); // return BuildErpResult(500, $"更改物料信息失败!待更新物料信息数量={cgDetailList.Count}"); //} tran.CommitTran(); return BuildErpResult(0, $"写入入库记录表成功!"); } if (err != "") { return BuildErpResult(2, err + "其他信息正常已写入"); } return BuildErpResult(0, $"更改物料信息成功"); //if (err != "") { // return BuildErpResult(2, err + "其他信息正常已写入"); //} //return BuildErpResult(0, $"更改物料信息成功"); // NOTE:暂时不检查,万一ERP发错了,可以选择重发 //if (errList.Count > 0) { // info = "更改物料信息部分成功,部分失败,原因:当前货位已经给过物料信息"; //} //else { // info = "更改物料信息成功!"; //} } catch (Exception ex) { return BuildErpResult(1, $"发生了异常:{ex.Message}"); @@ -688,11 +718,24 @@ var db = new SqlHelper<object>().GetInstance(); try { var err = ""; var cgDetailList = new List<TN_CG_Detail>(); var recordList = new List<TN_Outbound_DataRecord>(); if (model.materialIssues.Count == 0) { return BuildErpResult(400, "不能传入空的数据列表"); } //var err = ""; //var cgDetailList = new List<TN_CG_Detail>(); //var recordList = new List<TN_Outbound_DataRecord>(); var insetRecordList = new List<TN_Outbound_DataRecord>(); var deleteRecordOldList = new List<TN_Outbound_DataRecord>(); foreach (var issue in model.materialIssues) { var recordOld = db.Queryable<TN_Outbound_DataRecord>() .Where(r => r.S_LOCATION_CODE == issue.locationCode).First(); if (recordOld != null) { deleteRecordOldList.Add(recordOld); //errList.Add(recordOld); //continue; } // 写入记录表 var record = new TN_Outbound_DataRecord { S_LOCATION_CODE = issue.locationCode, @@ -709,44 +752,50 @@ S_LINE_CODE = issue.lineCode, S_BATCH_NO = issue.batchNo }; recordList.Add(record); insetRecordList.Add(record); // 查询对应物料 var cgDetail = db.Queryable<TN_Location, TN_Loc_Container, TN_CG_Detail> ((l, c, d) => l.S_CODE == c.S_LOC_CODE && c.S_CNTR_CODE == d.S_CNTR_CODE) .Where(l => l.S_CODE == issue.locationCode) .Select((l, c, d) => d) .First(); //// 查询对应物料 //var cgDetail = db.Queryable<TN_Location, TN_Loc_Container, TN_CG_Detail> // ((l, c, d) => l.S_CODE == c.S_LOC_CODE && c.S_CNTR_CODE == d.S_CNTR_CODE) // .Where(l => l.S_CODE == issue.locationCode) // .Select((l, c, d) => d) // .First(); if (cgDetail == null) { err += $"储位码{issue.locationCode}对应的货位物料不存在!"; continue; } //if (cgDetail == null) { // err += $"储位码{issue.locationCode}对应的货位物料不存在!"; // continue; //} cgDetail.S_ITEM_CODE = issue.itemCode; cgDetail.S_ITEM_NAME = issue.itemName; //cgDetail.S_ITEM_CODE = issue.itemCode; //cgDetail.S_ITEM_NAME = issue.itemName; cgDetailList.Add(cgDetail); //cgDetailList.Add(cgDetail); } using (var tran = db.Ado.UseTran()) { if (db.Insertable<TN_Outbound_DataRecord>(recordList).ExecuteCommand() <= 0) { if (deleteRecordOldList.Count != 0 && db.Deleteable<TN_Outbound_DataRecord>(deleteRecordOldList).ExecuteCommand() <= 0) { tran.RollbackTran(); return BuildErpResult(500, $"删除旧出库记录数据失败:{JsonConvert.SerializeObject(deleteRecordOldList)}"); } if (db.Insertable<TN_Outbound_DataRecord>(insetRecordList).ExecuteCommand() <= 0) { tran.RollbackTran(); return BuildErpResult(500, $"写入出库记录表失败"); } if (db.Updateable<TN_CG_Detail>(cgDetailList).ExecuteCommand() <= 0) { tran.RollbackTran(); return BuildErpResult(500, $"更改物料信息失败"); } //if (db.Updateable<TN_CG_Detail>(cgDetailList).ExecuteCommand() <= 0) { // tran.RollbackTran(); // return BuildErpResult(500, $"更改物料信息失败"); //} tran.CommitTran(); return BuildErpResult(0, $"写入出库记录表成功!"); } if (err != "") { return BuildErpResult(2, err + "其他信息正常已写入"); } return BuildErpResult(0, $"更改物料信息成功"); //if (err != "") { // return BuildErpResult(2, err + "其他信息正常已写入"); //} //return BuildErpResult(0, $"更改物料信息成功"); } catch (Exception ex) { api/ApiModel.cs
@@ -108,6 +108,16 @@ /// 额外信息2 /// </summary> public string extraInfo2 { get; set; } /// <summary> /// 创建用户 /// </summary> public string createUser { get; set; } /// <summary> /// 状态更改时间 /// </summary> public string statusChangeTime { get; set; } } /// <summary> core/Monitor.cs
@@ -8,6 +8,7 @@ using System; using System.Collections.Generic; using System.Linq; namespace HH.WCS.Mobox3.AnGang.core { /// <summary> @@ -15,7 +16,124 @@ /// </summary> public class Monitor { public static void InboundDataSync() { var db = new SqlHelper<object>().GetInstance(); try { var inboundDataList = db.Queryable<TN_Inbound_DataRecord>().ToList(); LogHelper.Info($"轮询:入库信息同步:当前没有待同步的ERP物料信息"); var needDeleteDataList = new List<TN_Inbound_DataRecord>(); var needUpdateLocCntrRelList = new List<TN_Loc_Container>(); var needUpdateCgDetailList = new List<TN_CG_Detail>(); foreach (var inboundData in inboundDataList) { var locCntrRel = db.Queryable<TN_Loc_Container>().Where(c => c.S_LOC_CODE == inboundData.S_LOCATION_CODE).First(); // 暂时不考虑如果当前关系表,锁状态为1(已经ERP覆盖过)的情况,默认有就覆盖 if (locCntrRel != null) { var cgDetail = db.Queryable<TN_CG_Detail>().Where(d => d.S_CNTR_CODE == locCntrRel.S_CNTR_CODE).First(); if (cgDetail == null) { LogHelper.Info($"轮询:入库信息同步:货位容器表中,包含货位={locCntrRel.S_LOC_CODE}, 容器={locCntrRel.S_CNTR_CODE};但容器对应的物料表,没有找到物料!"); continue; } cgDetail.S_ITEM_CODE = inboundData.S_ITEM_CODE; cgDetail.T_MODIFY = DateTime.Now; locCntrRel.N_LOCK_STATE = 1; locCntrRel.T_MODIFY = DateTime.Now; needUpdateLocCntrRelList.Add(locCntrRel); needUpdateCgDetailList.Add(cgDetail); needDeleteDataList.Add(inboundData); } } using (var tran = db.Ado.UseTran()) { if (needDeleteDataList.Count > 0 && db.Deleteable<TN_Inbound_DataRecord>(needDeleteDataList).ExecuteCommand() <= 0) { tran.RollbackTran(); LogHelper.Info($"轮询:入库信息同步:删除已有物料的入库信息表失败!" + JsonConvert.SerializeObject(needDeleteDataList)); return; } if (needUpdateCgDetailList.Count > 0 && db.Updateable<TN_CG_Detail>(needUpdateCgDetailList).ExecuteCommand() <= 0) { tran.RollbackTran(); LogHelper.Info($"轮询:入库信息同步:根据ERP信息,更新物料信息表失败!" + JsonConvert.SerializeObject(needUpdateCgDetailList)); return; } if (needUpdateLocCntrRelList.Count > 0 && db.Updateable<TN_Loc_Container>(needUpdateLocCntrRelList).ExecuteCommand() <= 0) { tran.RollbackTran(); LogHelper.Info($"轮询:入库信息同步:根据ERP信息,更新货位容器关系表失败!" + JsonConvert.SerializeObject(needUpdateLocCntrRelList)); return; } tran.CommitTran(); LogHelper.Info($"轮询:入库信息同步:根据ERP信息,更改货位容器关系、货品明细成功!已更改货位:" + JsonConvert.SerializeObject(needUpdateLocCntrRelList.Select(c => c.S_LOC_CODE).ToArray())); } } catch (Exception ex) { LogHelper.Info($"发生了异常:{ex.Message}"); } } public static void OutboundDataSync() { var db = new SqlHelper<object>().GetInstance(); try { var outboundDataList = db.Queryable<TN_Outbound_DataRecord>().ToList(); if (outboundDataList.Count== 0 ) { LogHelper.Info($"轮询:出库信息同步:当前没有待同步的ERP物料信息"); } var needDeleteDataList = new List<TN_Outbound_DataRecord>(); var needUpdateLocCntrRelList = new List<TN_Loc_Container>(); var needUpdateCgDetailList = new List<TN_CG_Detail>(); foreach (var outboundData in outboundDataList) { var locCntrRel = db.Queryable<TN_Loc_Container>().Where(c => c.S_LOC_CODE == outboundData.S_LOCATION_CODE).First(); // 暂时不考虑如果当前关系表,锁状态为1(已经ERP覆盖过)的情况,默认有就覆盖 if (locCntrRel != null) { var cgDetail = db.Queryable<TN_CG_Detail>().Where(d => d.S_CNTR_CODE == locCntrRel.S_CNTR_CODE).First(); if (cgDetail == null) { LogHelper.Info($"轮询:出库信息同步:货位容器表中,包含货位={locCntrRel.S_LOC_CODE}, 容器={locCntrRel.S_CNTR_CODE};但容器对应的物料表,没有找到物料!"); continue; } cgDetail.S_ITEM_CODE = outboundData.S_ITEM_CODE; cgDetail.T_MODIFY = DateTime.Now; locCntrRel.N_LOCK_STATE = 1; locCntrRel.T_MODIFY = DateTime.Now; needUpdateLocCntrRelList.Add(locCntrRel); needUpdateCgDetailList.Add(cgDetail); needDeleteDataList.Add(outboundData); } } using (var tran = db.Ado.UseTran()) { if (needDeleteDataList.Count > 0 && db.Deleteable<TN_Outbound_DataRecord>(needDeleteDataList).ExecuteCommand() <= 0) { tran.RollbackTran(); LogHelper.Info($"轮询:出库信息同步:删除已有物料的出库信息表失败!" + JsonConvert.SerializeObject(needDeleteDataList)); return; } if (needUpdateCgDetailList.Count > 0 && db.Updateable<TN_CG_Detail>(needUpdateCgDetailList).ExecuteCommand() <= 0) { tran.RollbackTran(); LogHelper.Info($"轮询:出库信息同步:根据ERP信息,更新物料信息表失败!" + JsonConvert.SerializeObject(needUpdateCgDetailList)); return; } if (needUpdateLocCntrRelList.Count > 0 && db.Updateable<TN_Loc_Container>(needUpdateLocCntrRelList).ExecuteCommand() <= 0) { tran.RollbackTran(); LogHelper.Info($"轮询:出库信息同步:根据ERP信息,更新货位容器关系表失败!" + JsonConvert.SerializeObject(needUpdateLocCntrRelList)); return; } tran.CommitTran(); LogHelper.Info($"轮询:出库信息同步:根据ERP信息,更改货位容器关系、货品明细成功!已更改货位:" + JsonConvert.SerializeObject(needUpdateLocCntrRelList.Select(c => c.S_LOC_CODE).ToArray())); } } catch (Exception ex) { LogHelper.Info($"发生了异常:{ex.Message}"); } } } } core/WCSCore.cs
@@ -206,6 +206,8 @@ return; } //row -= 100; // 118-1 // 只当之前指定终点货架后,才尝试计算终点货位 if (cgDetail.F_QTY > 2000) { // 重量超过 2t models/TN_Loc_Container.cs
@@ -9,7 +9,12 @@ { public string S_LOC_CODE { get; set; } public string S_CNTR_CODE { get; set; } /// <summary> /// 货位容器表,锁状态,默认为0(锁定:货品入库,但没有更新ERP信息,不能出库)<br/> /// 当ERP信息覆盖后,改为1,表示可以出入库 /// </summary> public int N_LOCK_STATE { get; set; } = 0; [Navigate(NavigateType.OneToMany, nameof(TN_CG_Detail.S_CNTR_CODE))] public List<TN_CG_Detail> CntrItemRels { get; set; } wms/LocationHelper.cs
@@ -105,22 +105,6 @@ { site = Location.S_AGV_SITE; } //if (Location.N_CURRENT_NUM == 1) //{ // site = Location.S_AGV_SITE2; //} //if (Location.N_CURRENT_NUM == 2) //{ // site = Location.S_AGV_SITE3; //} //if (Location.N_CURRENT_NUM == 3) //{ // site = Location.S_AGV_SITE4; //} //if (Location.N_CURRENT_NUM == 4) //{ // site = Location.S_AGV_SITE5; //} } } }