using HH.WCS.Mobox3.HD.models.other; using HH.WCS.Mobox3.HD.util; using SqlSugar; using SqlSugar.Extensions; using System; using System.Collections.Generic; using System.Globalization; using System.Linq; using System.Linq.Expressions; using System.Reflection; using System.Runtime.ConstrainedExecution; using System.Text; using System.Threading.Tasks; using System.Web.UI; using static HH.WCS.Mobox3.HD.api.WmsController; using static HH.WCS.Mobox3.HD.dispatch.NDC; using static HH.WCS.Mobox3.HD.util.ExpressionHelper; using static System.Runtime.CompilerServices.RuntimeHelpers; namespace HH.WCS.Mobox3.HD.wms { /// /// 容器帮助类 /// internal class ContainerHelper { internal static string GenerateCntrNo() { var id = SYSHelper.GetSerialNumber("托盘号", "TP"); var date = DateTime.Now.ToString("yyMMdd"); return $"TP{date}{id.ToString().PadLeft(4, '0')}"; } /// /// 根据容器类型、目的地、状态查询容器 /// /// /// /// /// internal static List GetCntrListByPurpose(string dest, string cntrType, int state) { //1.0 查货位容器表 var db = new SqlHelper().GetInstance(); var list = db.Queryable().Where(a => a.S_DEST == dest && a.S_TYPE == cntrType && a.N_B_STATE == state).ToList(); return list; } /// /// TN_ContainerHelper.test("4L天然水箱装6入", 50, "335ml东方树叶15入", 30); /// /// /// /// /// //internal static void test(string item1, int qty1, string item2, int qty2) { // var db = new SqlHelper().GetInstance(); // var cntr = db.Queryable().Includes(a => a.CntrItemRelList). // Where(a => a.CntrItemRelList.Count(b => b.S_ITEM_CODE == item1 && int.Parse(b.F_QTY) > qty1) > 0 // && a.CntrItemRelList.Count(b => b.S_ITEM_CODE == item2 && int.Parse(b.F_QTY) > qty2) > 0).First(); //} /// /// 判断容器是否有物料信息 /// /// /// internal static bool CheckEmpty(string cntr) { //1.0 查货位容器表 var db = new SqlHelper().GetInstance(); return db.Queryable().Count(a => a.S_LOC_CODE.Trim() == cntr) == 0; } internal static bool AddCntr(string cntrCode, string itemCode) { var res = false; var db = new SqlHelper().GetInstance(); var TN_Container = new Container { S_CODE = cntrCode }; var cntrItemRel = new CntrItemRel { S_CNTR_CODE = cntrCode, S_ITEM_CODE = itemCode }; try { db.BeginTran(); db.Insertable(TN_Container).ExecuteCommand(); db.Insertable(cntrItemRel).ExecuteCommand(); db.CommitTran(); res = true; } catch (Exception ex) { db.RollbackTran(); } return res; } /// /// 根据容器号获取容器信息 /// /// /// internal static Container GetCntr(string cntr, bool create = false) { //1.0 查货位容器表 var db = new SqlHelper().GetInstance(); var old = db.Queryable().Where(a => a.S_CODE == cntr).First(); if (old == null && create) { var model = new Container { S_CODE = cntr }; if (db.Insertable(model).ExecuteCommand() > 0) { old = model; } } return old; } /// /// 根据容器获取物料信息 /// /// /// internal static List GetCntrItemRel(string cntr) { var db = new SqlHelper().GetInstance(); var list = db.Queryable().Where(a => a.S_CNTR_CODE == cntr).ToList(); return list; } /// /// 绑定新容器与物料 /// /// /// /// /// internal static bool BindNewCntrItem(string loc,string cntrCode, string itemCode) { var res = false; var itemName = ItemHelper.GetItemInfo(itemCode).S_ITEM_NAME; var db = new SqlHelper().GetInstance(); try { db.BeginTran(); var cntr = new Container { S_CODE = cntrCode, N_DETAIL_COUNT = 1 }; db.Insertable(cntr).ExecuteCommand(); //获取物料信息,填充到容器货品明细,方便人工查看 var cir = new CntrItemRel { S_CNTR_CODE = cntr.S_CODE.Trim(), F_QTY = 1, S_ITEM_CODE = itemCode, S_ITEM_NAME = itemName }; db.Insertable(cir).ExecuteCommand(); var lcr = new LocCntrRel { S_CNTR_CODE = cntrCode, S_LOC_CODE = loc }; db.Insertable(lcr).ExecuteCommand(); db.CommitTran(); res = true; } catch (Exception ex) { db.RollbackTran(); Console.WriteLine(ex.Message); } return res; } /// /// 删除容器物料信息 /// /// /// /// /// internal static bool deleteCntrItem(string cntrCode) { bool res = false; var db = new SqlHelper().GetInstance(); try { db.BeginTran(); /* db.Deleteable().Where(a => a.S_CODE == cntrCode).ExecuteCommand();*/ db.Updateable().SetColumns(a => new Container() { N_DETAIL_COUNT = 1 ,T_MODIFY = DateTime.Now }).Where(a => a.S_CODE == cntrCode).ExecuteCommand(); db.Deleteable().Where(a => a.S_CNTR_CODE == cntrCode).ExecuteCommand(); LogHelper.Info($"物料删除留痕,容器编码:{cntrCode}", "WMS"); db.CommitTran(); res = true; } catch (Exception ex) { db.RollbackTran(); Console.WriteLine(ex.Message); } return res; } /// /// 物料信息绑定到满容器上 /// /// /// /// /// /// internal static bool BindCntrItem(Container cntr, string itemCode, string batchNo, float qty, string putawayNo) { var res = false; var db = new SqlHelper().GetInstance(); try { db.BeginTran(); //1.查看是否有相同物料批次的信息,如果有要累加,不同批次的可以分开 var cir = db.Queryable().Where(a => a.S_CNTR_CODE == cntr.S_CODE && a.S_ITEM_CODE == itemCode && a.S_BATCH_NO == batchNo).First(); if (cir != null) { cir.F_QTY += qty; db.Updateable(cir).UpdateColumns(it => new { it.F_QTY }).ExecuteCommand(); } else { //2.插入新的容器物料信息(容器号不变) cir = new CntrItemRel { S_CNTR_CODE = cntr.S_CODE.Trim(), S_BATCH_NO = batchNo, F_QTY = qty, S_ITEM_CODE = itemCode, S_PUTAWAY_NO = putawayNo }; db.Insertable(cir).ExecuteCommand(); } var count = db.Queryable().Count(a => a.S_CNTR_CODE == cntr.S_CODE); cntr.N_DETAIL_COUNT = count; cntr.C_ENABLE = "N";//码盘后将托盘设置为不可用状态,入库后变成可用 db.Updateable(cntr).UpdateColumns(it => new { it.N_DETAIL_COUNT, it.C_ENABLE, it.S_SRC }).ExecuteCommand(); db.CommitTran(); res = true; } catch (Exception ex) { db.RollbackTran(); Console.WriteLine(ex.Message); } return res; } internal static void addCntr(string cntrCode ,int detailCount = 1) { var db = new SqlHelper().GetInstance(); // 1.查询容器信息,如无,则新建容器信息 var cntr = db.Queryable().Where(a => a.S_CODE == cntrCode).First(); if (cntr == null) { cntr = new Container { S_CODE = cntrCode, N_DETAIL_COUNT = detailCount }; db.Insertable(cntr).ExecuteCommand(); } else { cntr.N_DETAIL_COUNT = detailCount; db.Updateable(cntr).UpdateColumns(it => new { it.N_DETAIL_COUNT }).ExecuteCommand(); } } /// /// 初始化容器 /// /// /// public static bool initContainer(string cntrCode) { var res = false; var db = new SqlHelper().GetInstance(); var cntr = db.Queryable().Where(a => a.S_CODE == cntrCode).First(); if (cntr == null) { cntr = new Container { S_CODE = cntrCode, N_DETAIL_COUNT = 1 }; res = db.Insertable(cntr).ExecuteCommand( )> 0; } else { res = db.Updateable().SetColumns(a => new Container() { N_DETAIL_COUNT = 1, T_MODIFY = DateTime.Now }).Where(a => a.S_CODE == cntrCode).ExecuteCommand() > 0; } return res; } /// /// 绑定容器和物料 /// /// /// /// /// internal static bool BindCntrItemSingle(string cntrCode, CntrItemRel cntrItemRel) { var res = false; var db = new SqlHelper().GetInstance(); try { db.BeginTran(); // 1.查询容器信息,如无,则新建容器信息 var cntr = db.Queryable().Where(a => a.S_CODE == cntrCode).First(); if (cntr == null) { cntr = new Container { S_CODE = cntrCode, N_DETAIL_COUNT = 1 }; db.Insertable(cntr).ExecuteCommand(); } // 2.查询容器物料信息,如无,则新建 cntrItemRel.S_CNTR_CODE = cntrCode; List oldCntrItemList = db.Queryable().Where(a => a.S_CNTR_CODE == cntrCode).ToList(); if (oldCntrItemList != null && oldCntrItemList.Count > 0) { ContainerHelper.deleteCntrItem(cntrCode); } db.Insertable(cntrItemRel).ExecuteCommand(); /* CntrItemRel cntrItemInfo = db.Queryable().Where(a => a.S_CNTR_CODE == cntrCode && a.S_ITEM_CODE == cntrItemRel.S_ITEM_CODE).First(); // 3.更新物料信息 if (cntrItemInfo == null) { db.Insertable(cntrItemRel).ExecuteCommand(); } else { cntrItemInfo. S_CNTR_CODE = cntrCode; cntrItemInfo. S_WORK_NO = cntrItemRel.S_WORK_NO; cntrItemInfo. S_WORK_NAME = cntrItemRel.S_WORK_NAME; cntrItemInfo. S_DEPART_NO = cntrItemRel.S_DEPART_NO; cntrItemInfo. S_PARTDRAW_NO = cntrItemRel.S_PARTDRAW_NO; cntrItemInfo. S_PART_NAME = cntrItemRel.S_PART_NAME; cntrItemInfo. S_OPER_NO = cntrItemRel.S_OPER_NO; cntrItemInfo. S_OPER_NAME = cntrItemRel.S_OPER_NAME; cntrItemInfo. F_QTY = cntrItemRel.F_QTY; cntrItemInfo. F_WEIGHT = cntrItemRel.F_WEIGHT; cntrItemInfo. S_ITEM_TYPE = cntrItemRel.S_ITEM_TYPE; cntrItemInfo.S_ITEM_CODE = cntrItemRel.S_ITEM_CODE; cntrItemInfo.S_ITEM_NAME = cntrItemRel.S_ITEM_NAME; // 钢卷信息 cntrItemInfo.S_COIL_NO = cntrItemRel.S_COIL_NO; cntrItemInfo.S_ITEM_SPEC = cntrItemRel.S_ITEM_SPEC; cntrItemInfo.S_HEAT_NO = cntrItemRel.S_HEAT_NO; cntrItemInfo.S_TEXTURE = cntrItemRel.S_TEXTURE; cntrItemInfo.S_SHOOT_NO = cntrItemRel.S_SHOOT_NO; cntrItemInfo.S_PHYSICAL_NO = cntrItemRel.S_PHYSICAL_NO; cntrItemInfo.F_INIT_WEIGHT = cntrItemRel.F_INIT_WEIGHT; cntrItemInfo.T_IN_STOCK = cntrItemRel.T_IN_STOCK; db.Updateable(cntrItemInfo).ExecuteCommand(); }*/ db.CommitTran(); res = true; } catch (Exception ex) { db.RollbackTran(); } return res; } /// /// 分页查询容器物料信息 /// /// /// internal static PageInfo GetCntrItemPage(QueryItemModel model) { PageInfo page = new PageInfo(); int totalCount = 0; var db = new SqlHelper().GetInstance(); var query = db.Queryable() .LeftJoin((a, i) => a.S_CNTR_CODE == i.S_CNTR_CODE) .LeftJoin((a, i, l) => i.S_LOC_CODE == l.S_CODE).Where((a, i, l) => (a.S_ITEM_TYPE == "成品" || a.S_ITEM_TYPE == "半成品")); if (model.trayCode != null) { query.Where((a, i, l) => a.S_CNTR_CODE.Contains(model.trayCode)); }; if (model.itemCode != null) { query.Where((a, i, l) => a.S_ITEM_CODE.Contains(model.itemCode)); }; if (model.workNo != null) { query.Where((a, i, l) => a.S_WORK_NO.Contains(model.workNo)); }; if (model.dePartNo != null) { query.Where((a, i, l) => a.S_DEPART_NO.Contains(model.dePartNo)); }; if (model.partDrawNo != null) { query.Where((a, i, l) => a.S_PARTDRAW_NO.Contains(model.partDrawNo)); }; if (model.areaCode != null) { query.Where((a, i, l) => l.S_AREA_CODE == model.areaCode); }; if (model.startTime != null) { DateTime startTime = DateTime.ParseExact(model.startTime, "yyyy-MM-dd HH:mm:ss", CultureInfo.InvariantCulture); query.Where("CONVERT(DATETIME, a.T_IN_STOCK, 121) >= @startTime ", new { startTime }); }; if (model.endTime != null) { DateTime endTime = DateTime.ParseExact(model.endTime, "yyyy-MM-dd HH:mm:ss", CultureInfo.InvariantCulture); query.Where("CONVERT(DATETIME, a.T_IN_STOCK, 121) <= @endTime ", new { endTime }); }; List list = query.OrderByDescending((a, i, l) => a.T_IN_STOCK).OrderBy((a, i, l) => new { a.S_PARTDRAW_NO, a.S_WORK_NO}).Select((a,i,l)=> new TrayItemInfoRes { trayCode = a.S_CNTR_CODE, workNo = a.S_WORK_NO, dePartNo = a.S_DEPART_NO, partDrawNo = a.S_PARTDRAW_NO, partName = a.S_PART_NAME, operNo = a.S_OPER_NO, operName = a.S_OPER_NAME, itemCode = a.S_ITEM_CODE, itemName = a.S_ITEM_NAME, quantity = a.F_QTY.ToString(), weight = a.F_WEIGHT.ToString(), fullTime = a.T_IN_STOCK, isFinish = a.S_ITEM_TYPE, areaCode = l.S_AREA_CODE }).ToPageList(model.pageNum, model.pageSize, ref totalCount); page.totalCount = totalCount; page.pageNum = model.pageNum; page.pageSize = model.pageSize; page.data = list; return page; } /// /// 根据容器来源和状态获取托盘 /// /// /// /// internal static List GetCntr(string dest, int state, string cntrType = "") { var db = new SqlHelper().GetInstance(); if (cntrType == "") { return db.Queryable().Where(a => a.S_DEST == dest && a.N_B_STATE == state).ToList(); } else { return db.Queryable().Where(a => a.S_DEST == dest && a.N_B_STATE == state && a.S_TYPE == cntrType).ToList(); } } internal static bool UpdateCntr(List cntrs, string dest, int state) { var res = false; var db = new SqlHelper().GetInstance(); var models = db.Queryable().Where(a => cntrs.Contains(a.S_CODE)).ToList(); if (models.Count > 0) { models.ForEach(a => { a.S_DEST = dest; a.N_B_STATE = state; db.Updateable(a).UpdateColumns(it => new { it.S_DEST, it.N_B_STATE }).ExecuteCommand(); }); res = true; } return res; } internal static bool UpdateCntrItem(string cntrNo ,int isFind) { var res = false; var db = new SqlHelper().GetInstance(); res = db.Updateable().SetColumns(a => new CntrItemRel() { ISFIND = isFind }).Where(a => a.S_CNTR_CODE == cntrNo).ExecuteCommand() > 0; return res; } internal static bool UpdateCntrDest(List cntrs, string dest) { var res = false; var db = new SqlHelper().GetInstance(); var models = db.Queryable().Where(a => cntrs.Contains(a.S_CODE)).ToList(); if (models.Count > 0) { models.ForEach(a => { a.S_DEST = dest; db.Updateable(a).UpdateColumns(it => new { it.S_DEST }).ExecuteCommand(); }); res = true; } return res; } /// /// 更新托盘来源 /// /// /// /// internal static bool UpdateCntrSrc(string cntr, string src) { var res = false; var db = new SqlHelper().GetInstance(); var model = db.Queryable().Where(a => a.S_CODE == cntr).First(); if (model != null) { model.S_SRC = src; model.T_MODIFY = DateTime.Now; res = db.Updateable(model).UpdateColumns(it => new { it.S_SRC, it.T_MODIFY }).ExecuteCommand() > 0; } return res; } internal static bool UpdateCntrState(List cntrs, int state) { var res = false; var db = new SqlHelper().GetInstance(); var models = db.Queryable().Where(a => cntrs.Contains(a.S_CODE)).ToList(); if (models.Count > 0) { models.ForEach(a => { a.N_B_STATE = state; db.Updateable(a).UpdateColumns(it => new { it.N_B_STATE }).ExecuteCommand(); }); res = true; } return res; } internal static bool UpdateCntr(List cntrs, string src, string dest, int state) { var res = false; var db = new SqlHelper().GetInstance(); var models = db.Queryable().Where(a => cntrs.Contains(a.S_CODE)).ToList(); if (models.Count > 0) { models.ForEach(a => { a.S_DEST = dest; a.N_B_STATE = state; a.S_SRC = src; db.Updateable(a).UpdateColumns(it => new { it.S_DEST, it.N_B_STATE, it.S_SRC }).ExecuteCommand(); }); res = true; } return res; } public static bool ClearCntrInfo(string cntr) { var db = new SqlHelper().GetInstance(); var model = db.Queryable().Where(a => a.S_CODE == cntr).First(); if (model != null) { model.S_SRC = ""; model.S_DEST = ""; model.N_B_STATE = 0; model.T_MODIFY = DateTime.Now; } db.Updateable(model).UpdateColumns(it => new { it.S_SRC, it.S_DEST, it.N_B_STATE, it.T_MODIFY }).ExecuteCommand(); return db.Deleteable().Where(a => a.S_CNTR_CODE.Trim() == cntr.Trim()).ExecuteCommand() > 0; } internal static List GetCntrBySrc(string src, int state, string cntrType = "") { var db = new SqlHelper().GetInstance(); if (cntrType == "") { return db.Queryable().Where(a => a.S_SRC == src && a.N_B_STATE == state).ToList(); } else { return db.Queryable().Where(a => a.S_SRC == src && a.N_B_STATE == state && a.S_TYPE == cntrType).ToList(); } } /// /// enable 让托盘允许被出库计算到,同时增加量表数据 /// /// internal static void Enable(string cntr, string loc) { var db = new SqlHelper().GetInstance(); var cntrInfo = db.Queryable().Where(a => a.S_CODE == cntr).First(); //获取仓库量表 //获取物理库区 //获取逻辑库区 if (cntrInfo != null) { try { db.BeginTran(); //防止接口重复调用,量表重复增加 if (cntrInfo.C_ENABLE == "N") { cntrInfo.C_ENABLE = "Y"; db.Updateable(cntrInfo).UpdateColumns(a => new { a.C_ENABLE, a.T_MODIFY }).ExecuteCommand(); var cirList = db.Queryable().Where(a => a.S_CNTR_CODE == cntr).ToList(); if (cirList.Count > 0) { cirList.ForEach(a => { var wh = db.Queryable().Where(b => b.S_ITEM_CODE == a.S_ITEM_CODE).First(); if (wh != null) { //更新仓库量表 wh.F_QTY += a.F_QTY; wh.T_MODIFY = DateTime.Now; db.Updateable(wh).UpdateColumns(it => new { it.F_QTY, it.T_MODIFY }).ExecuteCommand(); } else { //新增仓库量表 wh = new WHInventory { F_QTY = a.F_QTY, S_ITEM_CODE = a.S_ITEM_CODE }; db.Insertable(wh).ExecuteCommand(); } //写入第三方中间表 var di = new DayuanIn { CN_S_ARRIVAL_NO = a.S_PUTAWAY_NO, CN_F_QUANTITY = a.F_QTY, CN_S_BATCH_NO = a.S_BATCH_NO, CN_S_ITEM_CODE = a.S_ITEM_CODE, }; db.Insertable(di).ExecuteCommand(); //如果要统计分拣中,分拣回的量,无法跟踪托盘,除非对托盘加标识,属于哪个库区。 //另外分拣回可能去别的巷道,别的逻辑库区,逻辑库区的量控制更复杂,不能计算分拣中和分拣回。所以库区量表本项目暂不考虑 /* //获取货位的物理库区和所有逻辑库区 var location = db.Queryable().Where(l => l.S_CODE == loc).First(); if (location != null) { var az = db.Queryable().Where(b => b.S_ITEM_CODE == a.S_ITEM_CODE && b.S_AREA_CODE == location.S_AREA_CODE).First(); if (az != null) { //更新库区量表 az.F_QTY += a.F_QTY; az.T_MODIFY = DateTime.Now; db.Updateable(az).UpdateColumns(it => new { it.F_QTY, it.T_MODIFY }).ExecuteCommand(); } else { //新增库区量表 az = new AZInventory { F_QTY = a.F_QTY, S_ITEM_CODE = a.S_ITEM_CODE, S_AREA_CODE = location.S_AREA_CODE }; db.Insertable(az).ExecuteCommand(); } } //逻辑库区的量表 var zoneList = db.Queryable().Where(l => l.S_LOC_CODE == loc).ToList(); if (zoneList.Count > 0) { zoneList.ForEach(z => { var az = db.Queryable().Where(b => b.S_ITEM_CODE == a.S_ITEM_CODE && b.S_AREA_CODE == z.S_ZONE_CODE).First(); if (az != null) { //更新库区量表 az.F_QTY += a.F_QTY; az.T_MODIFY = DateTime.Now; db.Updateable(az).UpdateColumns(it => new { it.F_QTY, it.T_MODIFY }).ExecuteCommand(); } else { //新增库区量表 az = new AZInventory { F_QTY = a.F_QTY, S_ITEM_CODE = a.S_ITEM_CODE, S_AREA_CODE = z.S_ZONE_CODE, C_IS_LOGIC_AREA = "Y" }; db.Insertable(az).ExecuteCommand(); } }); } */ }); } } db.CommitTran(); } catch (Exception ex) { Console.WriteLine(ex.Message); db.RollbackTran(); } } } public static LocCntrRel getLocCntr(string cntrCode) { var db = new SqlHelper().GetInstance(); return db.Queryable().Where(a => a.S_CNTR_CODE == cntrCode).First(); } public static LocCntrRel getLocCntrByLoc(string locCode) { var db = new SqlHelper().GetInstance(); return db.Queryable().Where(a => a.S_LOC_CODE == locCode).OrderBy(a => a.T_CREATE).First(); } } }