# MOBOX3+WCS架构 ## 架构介绍 **前端框架**:MOBOX3(汉和自研) **后端架构**:.NETFrameWork 4.6.1 ## 测试环境 **MOBOX3**:http://192.168.1.188/mobox3 **Sqlserver**:Data Source=192.168.1.188;Initial Catalog=OIMobox;User ID=sa;Password=Am123123 **Sqlserver1**:Data Source=192.168.1.198\\sql2008;Initial Catalog=OIMobox;User ID=sa;Password=sa@2015 **ApiPort**:8901 **Swagger**:http://localhost:8901/swagger ## 业务功能 ### 上架单(入库单)功能 简易流程:创建入库单(生成上架单以及上架单明细)->执行入库单->码盘->PDA入库申请,生成作业(作业启动)->执行任务 ### 发货单(出库单)功能 简易流程:创建出库单(生成发货单)->执行发货单(发货单变为待分拣状态)->执行待分拣的发货单(可同时执行多条,多条情况下组成一条分拣单),生成分拣单->执行分拣单,生成分拣明细->分拣结果确认 ## 接口功能 ### 重置仓库量表 使用流程:测试时使用,根据传入的仓库编码对仓库量表以及库区量表进行重置操作 ```` internal static SimpleResult ResetWH_Inventory(ResetWH_InventoryModel model) { var result = new SimpleResult(); var db = new SqlHelper().GetInstance(); string msg = ""; // TN_WH_Inventory 仓库量表 WHInventory TN_AZ_Inventory 库区量表 AZInventory TN_Area 库区表 Area // 仓库量表 S_WH_CODE 仓库编号 S_ITEM_CODE 物料编码 F_QTY 库存数量 // 库区量表 S_WH_CODE 仓库编号 S_ITEM_CODE 物料编码 F_QTY 库存数量 S_AREA_CODE 库区编码 try { // 重置仓库量表(查询到仓库量表中有此仓库的量表数据,直接更改库存数量为0) var WHInventoryInfo = db.Queryable().Where(a => a.S_WH_CODE == model.whNo).ToList(); if (WHInventoryInfo.Count > 0) { WHInventoryInfo.ForEach(a => { a.F_QTY = 0; db.Updateable(a).UpdateColumns(it => new { it.F_QTY }).ExecuteCommand(); }); } else msg += $"ResetWH_Inventory Msg:仓库量表中无此仓库量表数据,等待后续重新计算插入。仓库编码:{model.whNo};\n"; // 根据传入的仓库编码获取该仓库下有哪些库区,并根据仓库编码+库区编码获取对应库区下有多少货,并更新库区量表和仓库量表(如果对应数据不存在,则插入) var areaInfo = db.Queryable().Where(a => a.S_WH_CODE == model.whNo).ToList(); if (areaInfo.Count > 0) { // 重置库区量表(查询到库区量表中有此库区以及仓库的量表数据,直接更改库存数量为0) areaInfo.ForEach(a => { var AZInventoryInfo = db.Queryable().Where(b => b.S_WH_CODE == model.whNo && b.S_AREA_CODE == a.S_CODE).ToList(); if (AZInventoryInfo.Count > 0) { AZInventoryInfo.ForEach(b => { b.F_QTY = 0; db.Updateable(b).UpdateColumns(it => new { it.F_QTY }).ExecuteCommand(); }); } else msg += $"ResetWH_Inventory Msg:库区量表中无此库区量表数据,等待后续重新计算插入。仓库编码:{model.whNo},库区编码:{a.S_CODE};\n"; }); areaInfo.ForEach(a => { try { // 查询此仓库以及库区下所有有货的货位的物料信息 var list = db.Queryable().Where(it => it.N_CURRENT_NUM > 0 && it.S_WH_CODE == model.whNo && it.S_AREA_CODE == a.S_CODE).ToList(); if (list.Count > 0) { //var list = db.Queryable().Where(it => it.N_CURRENT_NUM > 0 && it.S_WH_CODE == model.whNo && it.S_AREA_CODE == a.S_CODE).Includes(it => it.LocCntrRel, it => it.CntrItemRels).ToList(); list.ForEach(its => { string itemCode = ""; float qty = 0; try { List locCntrRel = db.Queryable().Where(it => it.S_LOC_CODE == its.S_CODE).Includes(it => it.CntrItemRels).ToList(); if (locCntrRel.Count > 0) { for (int i = 0; i < locCntrRel.Count; i++) { string cntrCode = locCntrRel[i].S_CNTR_CODE; CntrItemRel cntrItemRel = db.Queryable().Where(it => it.S_CNTR_CODE == cntrCode).First(); if (cntrItemRel != null) { itemCode = cntrItemRel.S_ITEM_CODE; qty += cntrItemRel.F_QTY; } else msg += $"ResetWH_Inventory Msg:当前货位有货,但是不存在对应容器物料数据,无法计算数量。仓库编码:{model.whNo},库区编码:{a.S_CODE},货位编码:{its.S_CODE};\n"; } } else msg += $"ResetWH_Inventory Msg:当前货位有货,但是不存在对应容器货位绑定数据,无法计算数量。仓库编码:{model.whNo},库区编码:{a.S_CODE},货位编码:{its.S_CODE};\n"; } catch (Exception ex) { msg += $"ResetWH_Inventory Error:计算当前货位托盘数量异常,异常信息:{ex.Message}.仓库编码:{model.whNo},库区编码:{a.S_CODE},货位编码:{its.S_CODE};\n"; } if (qty != 0) { // 根据当前货位上的物料以及物料数据更新库区量表以及仓库量表里面对应的数据,如果数据不存在,则进行插入 var whInventoryInfo = db.Queryable().Where(it => it.S_WH_CODE == model.whNo && it.S_ITEM_CODE == itemCode).First(); if (whInventoryInfo != null) { whInventoryInfo.F_QTY += qty; db.Updateable(whInventoryInfo).UpdateColumns(it => new { it.F_QTY }).ExecuteCommand(); msg += $"ResetWH_Inventory Msg:更新仓库量表数据。物料编码:{itemCode},增加数量数量:{qty}仓库编码:{model.whNo},库区编码:{a.S_CODE};\n"; } else { db.Insertable(new WHInventory { S_WH_CODE = model.whNo, S_ITEM_CODE = itemCode, F_QTY = qty }).ExecuteCommand(); msg += $"ResetWH_Inventory Msg:插入仓库量表数据。物料编码:{itemCode},增加数量数量:{qty}仓库编码:{model.whNo},库区编码:{a.S_CODE};\n"; } var azInventory = db.Queryable().Where(it => it.S_WH_CODE == model.whNo && it.S_AREA_CODE == its.S_AREA_CODE && it.S_ITEM_CODE == itemCode).First(); if (azInventory != null) { azInventory.F_QTY += qty; db.Updateable(azInventory).UpdateColumns(it => new { it.F_QTY }).ExecuteCommand(); msg += $"ResetWH_Inventory Msg:更新库区量表数据。物料编码:{itemCode},增加数量数量:{qty}仓库编码:{model.whNo},库区编码:{a.S_CODE};\n"; } else { db.Insertable(new AZInventory { S_WH_CODE = model.whNo, S_AREA_CODE = its.S_AREA_CODE, S_ITEM_CODE = itemCode, F_QTY = qty }).ExecuteCommand(); msg += $"ResetWH_Inventory Msg:插入库区量表数据。物料编码:{itemCode},增加数量数量:{qty}仓库编码:{model.whNo},库区编码:{a.S_CODE};\n"; } } }); } else msg += $"ResetWH_Inventory Msg:目标库区下无有货货位,不进行库区量表以及仓库量表更新操作。仓库编码:{model.whNo},库区编码:{a.S_CODE};\n"; } catch (Exception ex) { msg += $"ResetWH_Inventory Error:查询目标库区下有货货位异常,请检查托盘货位表以及容器物料表数据,异常信息:{ex.Message}。仓库编码:{model.whNo},库区编码:{a.S_CODE};\n"; } }); } else msg += $"ResetWH_Inventory Msg:目标仓库不存在下属库区。仓库编码:{model.whNo};\n"; } catch (Exception ex) { msg += $"ResetWH_Inventory Error:{ex.Message}。仓库编码:{model.whNo};\n"; } //Console.WriteLine(msg); result.resultMsg = msg; return result; } ````