using HH.Redis.ReisModel; using HH.WMS.Common; using HH.WMS.Common.Algorithm; using HH.WMS.DAL; using HH.WMS.DAL.Basic; using HH.WMS.Entitys; using HH.WMS.Entitys.Basic; using HH.WMS.Entitys.Common; using HH.WMS.Entitys.Entitys; using Newtonsoft.Json; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace HH.WMS.BLL.SysMgr { public class StockInitBLL : DapperBaseBLL { public OperateResult SaveStockInit(List importTempList, RedisUserEntity redisUserEntity) { #region 拼接入库单主子表实体 TN_WM_INCREASE_INVENTORY_MSTEntity MstEntity = new TN_WM_INCREASE_INVENTORY_MSTEntity(); string postData = "{\"appCode\":\"AutoWMS\",\"ruleName\":\"" + Constants.Rule_In + "\",\"orgId\":\"" + redisUserEntity.CN_S_ORGCODE + "\",\"orgFlag\":\"" + redisUserEntity.CN_S_ORGFLAG + "\"}"; string OPNo = WebApiManager.HttpAutoBom_Post("Api/BillRule/GenBillNo", postData); string postDataLot = "{\"appCode\":\"AutoWMS\",\"ruleName\":\"" + Constants.BatchNo + "\",\"orgId\":\"" + redisUserEntity.CN_S_ORGCODE + "\",\"orgFlag\":\"" + redisUserEntity.CN_S_ORGFLAG + "\"}"; string lotNo = WebApiManager.HttpAutoBom_Post("Api/BillRule/GenBillNo", postDataLot); string inMstGuid = System.Guid.NewGuid().ToString().ToUpper(); MstEntity.CN_GUID = inMstGuid; MstEntity.CN_S_OP_NO = OPNo; MstEntity.CN_S_OP_TYPE = Constants.OpSystemInit; MstEntity.CN_S_STOCK_CODE = importTempList[0].CN_S_STOCK_CODE; MstEntity.CN_T_OPERATE = DateTime.Now; MstEntity.CN_S_STATE = Constants.State_Audit; MstEntity.CN_S_CREATOR = redisUserEntity.CN_S_LOGIN; MstEntity.CN_S_OPERATOR = redisUserEntity.CN_S_NAME; MstEntity.CN_S_CREATOR_BY = redisUserEntity.CN_S_NAME; MstEntity.CN_T_CREATE = DateTime.Now; MstEntity.CN_S_MODIFY = redisUserEntity.CN_S_LOGIN; MstEntity.CN_S_MODIFY_BY = redisUserEntity.CN_S_NAME; MstEntity.CN_T_MODIFY = DateTime.Now; MstEntity.CN_S_AUDITOR = redisUserEntity.CN_S_NAME; MstEntity.CN_S_AUDIT_REMARK = "初始化入库"; MstEntity.CN_T_AUDIT_TIME = DateTime.Now; MstEntity.CN_S_OWNER = Constants.DefaultOwner; MstEntity.CN_S_LOT_NO = lotNo; var Group_List1 = importTempList.GroupBy(x => new { x.CN_S_ITEM_CODE, x.CN_S_ITEM_NAME, x.CN_S_PRODUCTION_BATCH, x.CN_S_FIGURE_NO, x.CN_S_MODEL, x.CN_S_MEASURE_UNIT, x.CN_S_ITEM_STATE }).Select(g => new ImportTemplateEntity { CN_S_ITEM_CODE = g.FirstOrDefault().CN_S_ITEM_CODE.Trim(), CN_S_ITEM_NAME = g.FirstOrDefault().CN_S_ITEM_NAME.Trim(), CN_S_PRODUCTION_BATCH = g.FirstOrDefault().CN_S_PRODUCTION_BATCH.Trim(), CN_S_FIGURE_NO = g.FirstOrDefault().CN_S_FIGURE_NO.Trim(), CN_S_MODEL = g.FirstOrDefault().CN_S_MODEL.Trim(), CN_S_MEASURE_UNIT = g.FirstOrDefault().CN_S_MEASURE_UNIT.Trim(), CN_S_ITEM_STATE = g.FirstOrDefault().CN_S_ITEM_STATE.Trim(), CN_F_QUANTITY = g.Sum(p => p.CN_F_QUANTITY) }).ToList(); List dtlEntityList = new List(); int rowIndex = 1; foreach (var item in Group_List1) { TN_WM_INCREASE_INVENTORY_DTLEntity dtlEntity = new TN_WM_INCREASE_INVENTORY_DTLEntity(); dtlEntity.CN_GUID = System.Guid.NewGuid().ToString().ToUpper(); dtlEntity.CN_S_OP_NO = OPNo; dtlEntity.CN_N_ROW_NO = rowIndex; dtlEntity.CN_S_MSTGUID = inMstGuid; dtlEntity.CN_S_ITEM_CODE = item.CN_S_ITEM_CODE; dtlEntity.CN_S_ITEM_NAME = item.CN_S_ITEM_NAME; dtlEntity.CN_S_ITEM_STATE = item.CN_S_ITEM_STATE; dtlEntity.CN_S_MEASURE_UNIT = item.CN_S_MEASURE_UNIT; dtlEntity.CN_S_PRODUCTION_BATCH = item.CN_S_PRODUCTION_BATCH; dtlEntity.CN_F_QUANTITY = Convert.ToDecimal(item.CN_F_QUANTITY); dtlEntity.CN_S_FIGURE_NO = item.CN_S_FIGURE_NO; dtlEntity.CN_S_MODEL = item.CN_S_MODEL; dtlEntity.CN_S_STATE = Constants.State_Audit; dtlEntity.CN_C_IS_BALANCE = "N"; dtlEntity.CN_C_IS_SCRAP = "N"; dtlEntity.CN_F_UPSHELF_QTY = dtlEntity.CN_F_QUANTITY; dtlEntity.CN_F_ALLOT_QTY = 0; dtlEntity.CN_F_PRINTING_QTY = 0; dtlEntity.CN_F_ADD_ONTRAY_QTY = dtlEntity.CN_F_QUANTITY; dtlEntity.CN_S_CREATOR = redisUserEntity.CN_S_LOGIN; dtlEntity.CN_S_CREATOR_BY = redisUserEntity.CN_S_NAME; dtlEntity.CN_T_CREATE = DateTime.Now; dtlEntity.CN_S_MODIFY = redisUserEntity.CN_S_LOGIN; dtlEntity.CN_S_MODIFY_BY = redisUserEntity.CN_S_NAME; dtlEntity.CN_T_MODIFY = DateTime.Now; dtlEntityList.Add(dtlEntity); rowIndex++; } MstEntity.DTLEntity = dtlEntityList; #endregion #region 拼接仓库和库区量表实体 List stockQtyList = new List();//影响仓库量表 List stockAreaQtyList = new List();//影响库区量表 var Group_List2 = importTempList.GroupBy(x => new { x.CN_S_ITEM_CODE, x.CN_S_ITEM_NAME, x.CN_S_STOCK_CODE, x.CN_S_ITEM_STATE, x.CN_S_PRODUCTION_BATCH }).Select(g => new ImportTemplateEntity { CN_S_ITEM_CODE = g.FirstOrDefault().CN_S_ITEM_CODE.Trim(), CN_S_ITEM_NAME = g.FirstOrDefault().CN_S_ITEM_NAME.Trim(), CN_S_STOCK_CODE = g.FirstOrDefault().CN_S_STOCK_CODE.Trim(), CN_S_PRODUCTION_BATCH = g.FirstOrDefault().CN_S_PRODUCTION_BATCH.Trim(), CN_S_ITEM_STATE = g.FirstOrDefault().CN_S_ITEM_STATE.Trim(), CN_F_QUANTITY = g.Sum(p => p.CN_F_QUANTITY) }).ToList(); DateTime startTime = TimeZone.CurrentTimeZone.ToLocalTime(new DateTime(1970, 1, 1)); // 当地时区 long timeStamp = (long)(DateTime.Now - startTime).TotalMilliseconds; // 相差毫秒数 foreach (var item in Group_List2) { #region 拼接仓库量表实体 stockQtyList.Add(new TN_WM_B_STOCK_QTYEntity() { CN_GUID = System.Guid.NewGuid().ToString().ToUpper(), CN_S_OWNER = Constants.DefaultOwner, CN_S_ITEM_CODE = item.CN_S_ITEM_CODE, CN_S_ITEM_NAME = item.CN_S_ITEM_NAME, CN_S_ITEM_STATE = item.CN_S_ITEM_STATE, CN_S_LOT_NO = lotNo, CN_S_PRODUCTION_BATCH = item.CN_S_PRODUCTION_BATCH, CN_S_STOCK_CODE = item.CN_S_STOCK_CODE, CN_F_QUANTITY = Convert.ToDecimal(item.CN_F_QUANTITY), CN_F_PLANNED_QTY = 0, CN_F_ALLOC_QTY = 0, CN_F_PRELOCK_QTY = 0, CN_S_TIMESTAMP = timeStamp.ToString() }); #endregion } var Group_List3 = importTempList.GroupBy(x => new { x.CN_S_ITEM_CODE, x.CN_S_ITEM_NAME, x.CN_S_STOCK_CODE, x.CN_S_AREA_CODE, x.CN_S_ITEM_STATE, x.CN_S_PRODUCTION_BATCH }).Select(g => new ImportTemplateEntity { CN_S_ITEM_CODE = g.FirstOrDefault().CN_S_ITEM_CODE.Trim(), CN_S_ITEM_NAME = g.FirstOrDefault().CN_S_ITEM_NAME.Trim(), CN_S_STOCK_CODE = g.FirstOrDefault().CN_S_STOCK_CODE.Trim(), CN_S_AREA_CODE = g.FirstOrDefault().CN_S_AREA_CODE.Trim(), CN_S_PRODUCTION_BATCH = g.FirstOrDefault().CN_S_PRODUCTION_BATCH.Trim(), CN_S_ITEM_STATE = g.FirstOrDefault().CN_S_ITEM_STATE.Trim(), CN_F_QUANTITY = g.Sum(p => p.CN_F_QUANTITY) }).ToList(); foreach (var item in Group_List3) { #region 拼接库区量表实体 stockAreaQtyList.Add(new TN_WM_B_AREA_QTYEntity() { CN_GUID = System.Guid.NewGuid().ToString().ToUpper(), CN_S_OWNER = Constants.DefaultOwner, CN_S_ITEM_CODE = item.CN_S_ITEM_CODE, CN_S_ITEM_NAME = item.CN_S_ITEM_NAME, CN_S_ITEM_STATE = item.CN_S_ITEM_STATE, CN_S_LOT_NO = lotNo, CN_S_PRODUCTION_BATCH = item.CN_S_PRODUCTION_BATCH, CN_S_STOCK_CODE = item.CN_S_STOCK_CODE, CN_S_STOCK_AREA = item.CN_S_AREA_CODE, CN_F_QUANTITY = Convert.ToDecimal(item.CN_F_QUANTITY), CN_F_PLANNED_QTY = 0, CN_F_ALLOC_QTY = 0, CN_S_TIMESTAMP = timeStamp.ToString() }); #endregion } #endregion #region 拼接到货批次实体 TN_WM_LOT_INFOEntity lotInfo = new TN_WM_LOT_INFOEntity(); lotInfo.CN_GUID = System.Guid.NewGuid().ToString().ToUpper(); lotInfo.CN_S_LOT_CODE = lotNo; lotInfo.CN_S_VENDOR_NO = ""; lotInfo.CN_S_CREATOR = redisUserEntity.CN_S_LOGIN; lotInfo.CN_S_CREATOR_BY = redisUserEntity.CN_S_NAME; lotInfo.CN_T_CREATE = DateTime.Now; #endregion #region 拼接托盘物料关联主子表、拼接托盘货位关联表 List TrayLocationEntityList = new List(); List TrayItemMstEntityList = new List(); List TrayItemDtlEntityList = new List(); List trayInfoList = new List(); var Group_List4 = importTempList.GroupBy(x => new { x.CN_S_STOCK_CODE, x.CN_S_AREA_CODE, x.CN_S_LOCATION_CODE, x.CN_S_TRAY_CODE }).Select(g => new ImportTemplateEntity { CN_S_STOCK_CODE = g.FirstOrDefault().CN_S_STOCK_CODE.Trim(), CN_S_AREA_CODE = g.FirstOrDefault().CN_S_AREA_CODE.Trim(), CN_S_LOCATION_CODE = g.FirstOrDefault().CN_S_LOCATION_CODE.Trim(), CN_S_TRAY_CODE = g.FirstOrDefault().CN_S_TRAY_CODE.Trim(), CN_F_QUANTITY = g.Sum(p => p.CN_F_QUANTITY) }).ToList(); foreach (var item in Group_List4) { var trayCode = ""; if (!string.IsNullOrEmpty(item.CN_S_TRAY_CODE)) { trayCode = item.CN_S_TRAY_CODE; } else { TN_WM_B_TRAY_INFOEntity trayInfo = DocreateTrayInfo(redisUserEntity); trayCode = trayInfo.CN_S_TRAY_CODE; if (trayInfo != null) { trayInfoList.Add(trayInfo); } } #region 拼接托盘货位实体 TN_WM_B_TRAY_LOCATIONEntity trayLocation = new TN_WM_B_TRAY_LOCATIONEntity(); trayLocation.CN_N_INDEX = 1; trayLocation.CN_S_STOCK_CODE = item.CN_S_STOCK_CODE; trayLocation.CN_S_STOCK_AREA = item.CN_S_AREA_CODE; trayLocation.CN_S_LOCATION_CODE = item.CN_S_LOCATION_CODE; trayLocation.CN_S_CREATOR = redisUserEntity.CN_S_LOGIN; trayLocation.CN_S_CREATOR_BY = redisUserEntity.CN_S_NAME; trayLocation.CN_T_CREATE = DateTime.Now; trayLocation.CN_S_TRAY_CODE = trayCode; TrayLocationEntityList.Add(trayLocation); #endregion var mstResult_1 = importTempList.Where(t => t.CN_S_TRAY_CODE == item.CN_S_TRAY_CODE && t.CN_S_LOCATION_CODE == item.CN_S_LOCATION_CODE).ToList(); var Group_List5 = mstResult_1.GroupBy(x => new { x.CN_S_ITEM_CODE, x.CN_S_ITEM_NAME, x.CN_S_ITEM_STATE, x.CN_S_MEASURE_UNIT, x.CN_S_PRODUCTION_BATCH, x.CN_S_FIGURE_NO, x.CN_S_MODEL }).Select(g => new ImportTemplateEntity { CN_S_ITEM_CODE = g.FirstOrDefault().CN_S_ITEM_CODE.Trim(), CN_S_ITEM_NAME = g.FirstOrDefault().CN_S_ITEM_NAME.Trim(), CN_S_ITEM_STATE = g.FirstOrDefault().CN_S_ITEM_STATE.Trim(), CN_S_FIGURE_NO = g.FirstOrDefault().CN_S_FIGURE_NO.Trim(), CN_S_MODEL = g.FirstOrDefault().CN_S_MODEL.Trim(), CN_S_MEASURE_UNIT = g.FirstOrDefault().CN_S_MEASURE_UNIT.Trim(), CN_F_QUANTITY = g.Sum(p => p.CN_F_QUANTITY) }).ToList(); foreach (var itemtray in Group_List5) { #region 拼接托盘物料关联实体-主子表 var parentGuid = System.Guid.NewGuid().ToString().ToUpper(); TN_WM_B_TRAY_ITEM_MSTEntity relMst = new TN_WM_B_TRAY_ITEM_MSTEntity(); relMst.CN_GUID = parentGuid; relMst.CN_S_TRAY_CODE = trayCode; relMst.CN_S_TRAY_GRID = "1"; relMst.CN_S_OWNER = Constants.DefaultOwner; relMst.CN_S_ITEM_CODE = itemtray.CN_S_ITEM_CODE; relMst.CN_S_ITEM_NAME = itemtray.CN_S_ITEM_NAME; relMst.CN_S_FIGURE_NO = itemtray.CN_S_FIGURE_NO; relMst.CN_S_MODEL = itemtray.CN_S_MODEL; relMst.CN_S_ITEM_STATE = itemtray.CN_S_ITEM_STATE; relMst.CN_F_QUANTITY = Convert.ToDecimal(itemtray.CN_F_QUANTITY); relMst.CN_S_MEASURE_UNIT = itemtray.CN_S_MEASURE_UNIT; relMst.CN_F_INQTY = Convert.ToDecimal(itemtray.CN_F_QUANTITY); relMst.CN_F_ALLOC_QTY = 0; relMst.CN_S_TIMESTAMP = timeStamp.ToString(); TrayItemMstEntityList.Add(relMst); TN_WM_B_TRAY_ITEM_DTLEntity relDtl = new TN_WM_B_TRAY_ITEM_DTLEntity(); relDtl.CN_GUID = System.Guid.NewGuid().ToString().ToUpper(); relDtl.CN_PARENT_GUID = parentGuid; relDtl.CN_S_LOT_NO = lotNo; relDtl.CN_F_QUANTITY = Convert.ToDecimal(itemtray.CN_F_QUANTITY); relDtl.CN_S_PRODUCTION_BATCH = itemtray.CN_S_PRODUCTION_BATCH; relDtl.CN_S_CREATOR = redisUserEntity.CN_S_LOGIN; relDtl.CN_S_CREATOR_BY = redisUserEntity.CN_S_NAME; relDtl.CN_T_CREATE = DateTime.Now; TrayItemDtlEntityList.Add(relDtl); #endregion } } #endregion #region 获取货位汇总 var Group_List6 = importTempList.GroupBy(x => new { x.CN_S_LOCATION_CODE }).Select(g => new ImportTemplateEntity { CN_S_LOCATION_CODE = g.FirstOrDefault().CN_S_LOCATION_CODE.Trim() }).ToList(); #endregion OperateResult operateResult = UseTransaction(trans => { if (MstEntity != null) { //新增入库单主表 CreateDAL>().Add(MstEntity, trans); //新增入库单子表 CreateDAL>().AddRange(MstEntity.DTLEntity, trans); } if (stockQtyList.Any()) { //影响仓库量表 CreateDAL().AddStockQty(stockQtyList, trans); } if (stockAreaQtyList.Any()) { //影响库区量表 CreateDAL().AddAreaQty(stockAreaQtyList, trans); } if (lotInfo != null) { //影响到货批次表 CreateDAL>().Add(lotInfo, trans); } if (TrayLocationEntityList.Any()) { //影响托盘货位关联表 CreateDAL>().AddRange(TrayLocationEntityList, trans); } if (TrayItemMstEntityList.Any()) { //影响托盘物料主表 CreateDAL>().AddRange(TrayItemMstEntityList, trans); } if (TrayItemDtlEntityList.Any()) { //影响托盘物料子表 CreateDAL>().AddRange(TrayItemDtlEntityList, trans); } if (trayInfoList.Any()) { //影响托盘表 CreateDAL>().AddRange(trayInfoList, trans); } if (Group_List6.Any()) { //影响货位状态表 CreateDAL().UpdateLocationUseState(Group_List6, Constants.Use_State_NoFull, trans); } //调用AutoBom接口更新初始化 var param = new { stocks = stockQtyList[0].CN_S_STOCK_CODE, locations = "" }; string res = WebApiManager.HttpAutoBom_Post("api/Stock/UpdateInit", JsonConvert.SerializeObject(param)); if (!string.IsNullOrEmpty(res)) { MsgEntity msgEntity = JsonConvert.DeserializeObject(res); if (!msgEntity.Success) { throw new Exception(msgEntity.Msg); } } else { throw new Exception("仓库初始化接口未调通!"); } }); return operateResult; } /// /// 生成虚拟托盘实体 /// /// /// private TN_WM_B_TRAY_INFOEntity DocreateTrayInfo(RedisUserEntity userEntity) { #region 生成虚拟托盘实体 TN_WM_B_TRAY_INFOEntity trayInfo = new TN_WM_B_TRAY_INFOEntity(); string postData = "{\"appCode\":\"AutoWMS\",\"ruleName\":\"" + Constants.VirtualTray + "\",\"orgId\":\"" + userEntity.CN_S_ORG_GUID + "\",\"orgFlag\":\"" + userEntity.CN_S_ORGFLAG + "\"}"; string trayNo = WebApiManager.HttpAutoBom_Post("api/BillRule/GenBillNo", postData); if (string.IsNullOrEmpty(trayNo)) { return null; } trayInfo.CN_S_TRAY_CODE = trayNo; trayInfo.CN_S_TRAY_TYPE = Constants.VirtualTray; trayInfo.CN_S_TRAY_CODE_EXT = ""; trayInfo.CN_S_SPEC = ""; trayInfo.CN_S_SORTING_CODE = ""; trayInfo.CN_S_STATE = "使用中"; trayInfo.CN_S_USE_STATE = "满"; trayInfo.CN_N_COLUMN_NUM = 1; trayInfo.CN_F_GROSSWEIGHT = 0; trayInfo.CN_F_LOADBEARING = 0; trayInfo.CN_F_WEIGHT = 0; trayInfo.CN_N_LATTICE_NUM = 1; trayInfo.CN_N_ROW_NUM = 1; trayInfo.CN_S_COLLECT_CODE = ""; trayInfo.CN_S_COLLECT_LOCATION = ""; trayInfo.CN_S_CREATOR = userEntity.CN_S_LOGIN; trayInfo.CN_S_CREATOR_BY = userEntity.CN_S_NAME; trayInfo.CN_T_CREATE = DateTime.Now; trayInfo.CN_S_MODIFY = userEntity.CN_S_LOGIN; trayInfo.CN_S_MODIFY_BY = userEntity.CN_S_NAME; trayInfo.CN_T_MODIFY = DateTime.Now; trayInfo.CN_S_DESC = "初始化生成虚拟托盘"; return trayInfo; #endregion } } }