using HH.Redis.ReisModel; using HH.WMS.BLL.Basic; using HH.WMS.Common; using HH.WMS.DAL; using HH.WMS.DAL.Basic; using HH.WMS.DAL.InStock; using HH.WMS.DAL.SysMgr; using HH.WMS.Entitys; using HH.WMS.Entitys.Basic; using HH.WMS.Entitys.Entitys; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace HH.WMS.BLL.Pda { public class HsBLL : DapperBaseBLL { #region 托盘货位绑定 /// /// 针对简易版WMS人工库,绑定货位等同入库,增加仓库、库区库存,不能应用在复杂的WMS(有到货区、出库单、自动化库)场景中 /// /// 托盘编码 /// 货位编码 /// 用户实体 /// /// [HANHE(XDL)] CREATED BY 2019-04-17 public OperateResult AddTrayLocationRelation(string trayCode, string locationCode, RedisUserEntity userEntity, string projectCode) { if (string.IsNullOrEmpty(locationCode)) { return OperateResult.Error("货位不可为空!"); } List upHis = new List(); List addStockQty = new List(); List addAreaQty = new List(); #region 检查托盘与货位是否满足绑定条件 List trayLocationList = new List(); List GetModel = BLLCreator.Create(this.userInfo).GetModel("where CN_S_LOCATION_CODE='" + locationCode + "'"); if (GetModel.Count == 0) { return OperateResult.Error("在表TN_WM_LOCATION_EXT中未查询到该货位!"); } AutoBomStockAreaEntity areaModel = new AutoBomStockAreaEntity(); areaModel = CreateDAL().GetAreaModelByLocation(locationCode); if (areaModel == null) { //非法的目的货位 return OperateResult.Error(string.Format("在mongo(TN_AB_B_STOCK_AREA或TN_AB_STOCK_LOCATION表)中未查询到该货位信息!", locationCode)); } if (areaModel.CN_C_IS_CONTROL_QTY.Equals("Y")) { //货位存储状态:非空 if (GetModel[0].CN_S_USE_STATE != Constants.Use_State_Empty) { return OperateResult.Error(string.Format("当前货位存储状态为{0},不允许继续放置托盘!", GetModel[0].CN_S_USE_STATE)); } } //货位状态:正常 if (GetModel[0].CN_S_LOCATION_STATE != Constants.Location_State_Normal) { return OperateResult.Error(string.Format("当前货位状态为{0},不允许继续放置托盘!", GetModel[0].CN_S_LOCATION_STATE)); } if (!string.IsNullOrEmpty(trayCode)) { //检查该托盘是否在(未执行或执行中的)任务中 List lstInTask = CreateDAL().GetTaskByTray(trayCode); if (lstInTask.Count > 0) { return OperateResult.Error(string.Format("当前托盘已在搬运任务{0}中,不允许绑定未执行或执行中的任务!", lstInTask[0].CN_S_TASK_NO)); } //检查该托盘是否绑定了其他货位 List lstEntity = CreateDAL().GetListByTrayCode(trayCode); if (lstEntity.Count > 0) { return OperateResult.Error(string.Format("当前托盘已绑定货位{0},不允许重复绑定!", lstEntity[0].CN_S_LOCATION_CODE)); } lstEntity = CreateDAL().GetListByLocationCode(locationCode); if (lstEntity.Count > 0) { return OperateResult.Error(string.Format("当前货位已绑定托盘{0},不允许重复绑定!", lstEntity[0].CN_S_TRAY_CODE)); } } #endregion string _trayCode = trayCode; if (string.IsNullOrEmpty(_trayCode)) { //生成虚拟托盘 var postData = "{\"appCode\":\"" + Constants.appCode + "\",\"ruleName\":\"" + Constants.VirtualTray + "\",\"orgId\":\"0\",\"orgFlag\":\"\"}"; _trayCode = WebApiManager.HttpAutoBom_Post("api/BillRule/GenBillNo", postData); if (string.IsNullOrEmpty(_trayCode)) { return OperateResult.Error("生成虚拟托盘失败"); } } //拼接托盘货位实体 TN_WM_B_TRAY_LOCATIONEntity trayLocation = new TN_WM_B_TRAY_LOCATIONEntity() { CN_GUID = System.Guid.NewGuid().ToString().ToUpper(), CN_S_TRAY_CODE = _trayCode, CN_S_STOCK_CODE = GetModel[0].CN_S_STOCK_CODE, CN_S_STOCK_AREA = GetModel[0].CN_S_AREA_CODE, CN_S_LOCATION_CODE = locationCode, CN_N_INDEX = 1, CN_S_CREATOR = userEntity.CN_S_LOGIN, CN_S_CREATOR_BY = userEntity.CN_S_NAME, CN_T_CREATE = DateTime.Now }; trayLocationList.Add(trayLocation); if (areaModel.CN_C_IS_INVENTORY != null && !string.IsNullOrEmpty(trayCode)) { if (areaModel.CN_C_IS_INVENTORY == "Y") { //获取原托盘中的数据 List lstOriginalMST = BLLCreator.Create>().GetList(new { CN_S_TRAY_CODE = trayCode }); List lstOriginalDTL = new List(); foreach (TN_WM_B_TRAY_ITEM_MSTEntity mstEntity in lstOriginalMST) { lstOriginalDTL = BLLCreator.Create>().GetList(new { CN_PARENT_GUID = mstEntity.CN_GUID }); foreach (TN_WM_B_TRAY_ITEM_DTLEntity dltEntity in lstOriginalDTL) { #region 拼接上架记录表 upHis.Add(new TN_WM_UP_HISTORYEntity() { CN_GUID = Guid.NewGuid().ToString(), CN_F_PACKING_QTY = 0, CN_S_CREATOR = userEntity.CN_S_LOGIN, CN_S_CREATOR_BY = userEntity.CN_S_NAME, CN_S_FIGURE_NO = mstEntity.CN_S_FIGURE_NO, CN_S_ITEM_CODE = mstEntity.CN_S_ITEM_CODE, CN_F_QUANTITY = dltEntity.CN_F_QUANTITY, CN_S_ITEM_NAME = mstEntity.CN_S_ITEM_NAME, CN_S_ITEM_STATE = mstEntity.CN_S_ITEM_STATE == null ? "" : mstEntity.CN_S_ITEM_STATE, CN_S_LOCATION_CODE = locationCode, CN_S_LOT_NO = dltEntity.CN_S_LOT_NO == null ? "" : dltEntity.CN_S_LOT_NO, CN_S_MEASURE_UNIT = mstEntity.CN_S_MEASURE_UNIT, CN_S_MODEL = mstEntity.CN_S_MODEL, CN_S_MODIFY = userEntity.CN_S_NAME, CN_S_MODIFY_BY = userEntity.CN_S_NAME, CN_S_OWNER = mstEntity.CN_S_OWNER == null ? "" : mstEntity.CN_S_OWNER, CN_S_PACKING_UNIT = "", CN_S_PRODUCTION_BATCH = dltEntity.CN_S_PRODUCTION_BATCH == null ? "" : dltEntity.CN_S_PRODUCTION_BATCH, CN_S_STOCK_AREA = areaModel.CN_S_AREA_CODE, CN_S_STOCK_CODE = areaModel.CN_S_STOCK_CODE, CN_S_EXT1 = dltEntity.CN_S_UNIQUE_CODE, CN_S_TRAY_CODE = trayCode, CN_S_TRAY_GRID = "1", CN_T_CREATE = DateTime.Now, CN_T_MODIFY = DateTime.Now, CN_S_OP_FROM = "PDA绑定上架", }); #endregion } } #region 仓库量表 addStockQty = upHis.GroupBy(x => new { CN_S_ITEM_CODE = x.CN_S_ITEM_CODE, CN_S_ITEM_STATE = x.CN_S_ITEM_STATE, CN_S_ITEM_NAME = x.CN_S_ITEM_NAME, CN_S_STOCK_CODE = x.CN_S_STOCK_CODE, CN_S_OWNER = x.CN_S_OWNER, CN_S_MODEL = x.CN_S_MODEL, CN_S_LOT_NO = x.CN_S_LOT_NO, CN_S_MEASURE_UNIT = x.CN_S_MEASURE_UNIT, CN_S_FIGURE_NO = x.CN_S_FIGURE_NO, CN_S_PRODUCTION_BATCH = x.CN_S_PRODUCTION_BATCH }).Select(y => { return new TN_WM_B_STOCK_QTYEntity() { CN_GUID = Guid.NewGuid().ToString(), CN_F_QUANTITY = y.Sum(k => k.CN_F_QUANTITY), CN_S_ITEM_CODE = y.Key.CN_S_ITEM_CODE, CN_S_ITEM_NAME = y.Key.CN_S_ITEM_NAME, CN_S_ITEM_STATE = y.Key.CN_S_ITEM_STATE, CN_S_LOT_NO = y.Key.CN_S_LOT_NO, CN_S_OWNER = y.Key.CN_S_OWNER, CN_S_MODEL = y.Key.CN_S_MODEL, CN_S_MEASURE_UNIT = y.Key.CN_S_MEASURE_UNIT, CN_S_FIGURE_NO = y.Key.CN_S_FIGURE_NO, CN_S_PRODUCTION_BATCH = y.Key.CN_S_PRODUCTION_BATCH, CN_S_STOCK_CODE = y.Key.CN_S_STOCK_CODE, }; }).ToList(); #endregion #region 库区量表 addAreaQty = upHis.GroupBy(x => new { CN_S_ITEM_CODE = x.CN_S_ITEM_CODE, CN_S_ITEM_NAME = x.CN_S_ITEM_NAME, CN_S_ITEM_STATE = x.CN_S_ITEM_STATE, CN_S_STOCK_AREA = x.CN_S_STOCK_AREA, CN_S_STOCK_CODE = x.CN_S_STOCK_CODE, CN_S_OWNER = x.CN_S_OWNER, CN_S_LOT_NO = x.CN_S_LOT_NO, CN_S_MODEL = x.CN_S_MODEL, CN_S_MEASURE_UNIT = x.CN_S_MEASURE_UNIT, CN_S_FIGURE_NO = x.CN_S_FIGURE_NO, CN_S_PRODUCTION_BATCH = x.CN_S_PRODUCTION_BATCH }).Select(y => { return new TN_WM_B_AREA_QTYEntity() { CN_GUID = Guid.NewGuid().ToString(), CN_F_QUANTITY = y.Sum(k => k.CN_F_QUANTITY), CN_S_ITEM_CODE = y.Key.CN_S_ITEM_CODE, CN_S_ITEM_NAME = y.Key.CN_S_ITEM_NAME, CN_S_ITEM_STATE = y.Key.CN_S_ITEM_STATE, CN_S_LOT_NO = y.Key.CN_S_LOT_NO, CN_S_OWNER = y.Key.CN_S_OWNER, CN_S_MODEL = y.Key.CN_S_MODEL, CN_S_MEASURE_UNIT = y.Key.CN_S_MEASURE_UNIT, CN_S_FIGURE_NO = y.Key.CN_S_FIGURE_NO, CN_S_PRODUCTION_BATCH = y.Key.CN_S_PRODUCTION_BATCH, CN_S_STOCK_AREA = y.Key.CN_S_STOCK_AREA, CN_S_STOCK_CODE = y.Key.CN_S_STOCK_CODE }; }).ToList(); #endregion } } OperateResult operateResult = UseTransaction(trans => { //写入托盘货位关联表 if (trayLocationList.Any()) { CreateDAL>().AddRange(trayLocationList, trans); } if (areaModel.CN_C_IS_CONTROL_QTY.Equals("Y")) { //更新货位贮存状态及货位状态 operateResult = CreateDAL>().Update( new { CN_S_USE_STATE = Constants.Use_State_Full, CN_S_MODIFY = userEntity.CN_S_LOGIN, CN_S_MODIFY_BY = userEntity.CN_S_NAME, CN_T_MODIFY = DateTime.Now }, new { CN_S_LOCATION_CODE = locationCode, CN_S_LOCATION_STATE = Constants.Location_State_Normal }, trans); if (operateResult.AffectedRows == 0) { throw new Exception("更新货位存储状态并发冲突,该货位状态可能已经发生变化"); } } if (areaModel.CN_C_IS_INVENTORY != null) { if (areaModel.CN_C_IS_INVENTORY == "Y") { //上架记录 if (upHis.Any()) CreateDAL>().AddRange(upHis, trans); //更新仓库量表 if (addStockQty.Any()) BLLCreator.Create().AddList(addStockQty, trans); //CreateDAL().AddList(addStockQty, trans); //更新库区量表 if (addAreaQty.Any()) BLLCreator.Create().AddList(addAreaQty, trans); //CreateDAL().AddList(addAreaQty, trans); } } }); return operateResult; } #endregion } }