using HH.Redis.ReisModel; using HH.WMS.BLL.Algorithm; using HH.WMS.BLL.Basic; using HH.WMS.BLL.External; using HH.WMS.BLL.InStock; using HH.WMS.BLL.Interface; using HH.WMS.BLL.MoveStock; using HH.WMS.Common; using HH.WMS.Common.Algorithm; using HH.WMS.Common.External; using HH.WMS.DAL; using HH.WMS.DAL.Basic; using HH.WMS.DAL.InStock; using HH.WMS.DAL.Pda; using HH.WMS.DAL.SysMgr; using HH.WMS.Entitys; using HH.WMS.Entitys.Basic; using HH.WMS.Entitys.Dto; using HH.WMS.Entitys.Entitys; using HH.WMS.Entitys.External; using HH.WMS.Entitys.MoveStock; using Newtonsoft.Json; using System; using System.Collections.Generic; using System.Data; using System.Linq; using System.Text; using System.Threading.Tasks; namespace HH.WMS.BLL.Pda { public class LjBLL : DapperBaseBLL { #region (PDA接口)获取货位所在仓库 /// /// /// /// 托盘编码 /// 货位编码 /// 用户实体 /// /// [HANHE(XDL)] CREATED BY 2019-04-17 public OperateResult GetLocationInfo(string locationCode) { if (string.IsNullOrEmpty(locationCode)) { return OperateResult.Error("请传入货位号参数!"); } 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)); } return OperateResult.Succeed("", areaModel); } /// /// 针对简易版WMS人工库,绑定货位等同入库,增加仓库、库区库存,不能应用在复杂的WMS(有到货区、出库单、自动化库)场景中 /// /// 托盘编码 /// 货位编码 /// 用户实体 /// /// [HANHE(XDL)] CREATED BY 2019-04-17 public OperateResult CheckMpTray(string trayCode) { if (string.IsNullOrEmpty(trayCode)) { return OperateResult.Error("请传入托盘号参数!"); } //判断货位是否绑定托盘 List lstStartTray = CreateDAL().GetListByTrayCode(trayCode); //检查该托盘是否在(未执行或执行中的)任务中 List lstInTask = CreateDAL().GetTaskByTray(trayCode); if (lstInTask.Count > 0) { return OperateResult.Error(string.Format("当前托盘已在搬运任务{0}中,不允许码盘!", lstInTask[0].CN_S_TASK_NO)); } if (lstStartTray.Count > 0) { List GetModel = BLLCreator.Create(this.userInfo).GetModel("where CN_S_LOCATION_CODE='" + lstStartTray[0].CN_S_LOCATION_CODE + "'"); if (GetModel.Count == 0) { return OperateResult.Error("在表TN_WM_LOCATION_EXT中未查询到该托盘绑定的货位!"); } AutoBomStockAreaEntity areaModel = new AutoBomStockAreaEntity(); areaModel = CreateDAL().GetAreaModelByLocation(lstStartTray[0].CN_S_LOCATION_CODE); if (areaModel == null) { //非法的目的货位 return OperateResult.Error(string.Format("在mongo(TN_AB_B_STOCK_AREA或TN_AB_STOCK_LOCATION表)中未查询到该货位信息!", lstStartTray[0].CN_S_LOCATION_CODE)); } //货位状态:正常 if (GetModel[0].CN_S_LOCATION_STATE != Constants.Location_State_Normal) { return OperateResult.Error(string.Format("当前托盘绑定的货位状态为{0},不允许在该货位码盘!", GetModel[0].CN_S_LOCATION_STATE)); } DataTable dt = BLLCreator.Create().GetTrayDetail(trayCode); return OperateResult.Succeed(lstStartTray[0].CN_S_LOCATION_CODE, dt); } else { DataTable dt = BLLCreator.Create().GetTrayDetail(trayCode); return OperateResult.Succeed("", dt); } } #endregion #region (PDA接口)检查码盘起点是否可用 /// /// /// /// 托盘编码 /// 货位编码 /// 用户实体 /// /// [HANHE(XDL)] CREATED BY 2019-04-17 public OperateResult CheckMpLocation(string locationCode) { if (string.IsNullOrEmpty(locationCode)) { return OperateResult.Error("请传入货位号参数!"); } string strTrayCode = ""; //判断货位是否绑定托盘 List lstStartTray = CreateDAL().GetListByLocationCode(locationCode); if (lstStartTray.Count > 0) { strTrayCode = lstStartTray[0].CN_S_TRAY_CODE; //检查该托盘是否在(未执行或执行中的)任务中 List lstInTask = CreateDAL().GetTaskByTray(lstStartTray[0].CN_S_TRAY_CODE); if (lstInTask.Count > 0) { return OperateResult.Error(string.Format("当前货位绑定的托盘已在搬运任务{0}中,不允许重复码盘!", lstInTask[0].CN_S_TASK_NO)); } } 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 (GetModel[0].CN_S_LOCATION_STATE != Constants.Location_State_Normal) { return OperateResult.Error(string.Format("当前货位状态为{0},不允许在该位置码盘!", GetModel[0].CN_S_LOCATION_STATE)); } DataTable dt = BLLCreator.Create().GetTrayDetail(strTrayCode); return OperateResult.Succeed(strTrayCode, dt); } /// /// 针对简易版WMS人工库,绑定货位等同入库,增加仓库、库区库存,不能应用在复杂的WMS(有到货区、出库单、自动化库)场景中 /// /// 托盘编码 /// 货位编码 /// 用户实体 /// /// [HANHE(XDL)] CREATED BY 2019-04-17 #endregion #region 简易码盘保存 /// /// 码盘 /// /// 数据Json /// 登陆信息实体 /// /// [HANHE(XDL)] CREATED BY 2018-11-17 public OperateResult SaveSimPalletItemRelation(ItemOnTrayEntity entity, RedisUserEntity userEntity) { OperateResult operateResult = new OperateResult(); string trayNo = entity.CN_S_TRAY_CODE; try { List trayInfoList = new List(); //删除托盘物料关联主子表 //拼接托盘物料关联主子表 List TrayItemMstlst = new List(); List TrayItemDtllst = new List(); Log.Info("SaveSimPalletItemRelation===>传参:====>", JsonConvert.SerializeObject(entity)); var Group_List = entity.row.GroupBy(x => new { x.CN_S_TRAY_CODE, x.CN_S_TRAY_GRID, x.CN_S_ITEM_CODE, x.CN_S_ITEM_STATE, x.CN_S_LOT_NO, x.CN_S_OWNER }).Select(g => new TrayItemRow { CN_S_TRAY_CODE = g.FirstOrDefault().CN_S_TRAY_CODE.Trim(), CN_S_TRAY_GRID = string.IsNullOrEmpty(g.FirstOrDefault().CN_S_TRAY_GRID.Trim()) ? "1" : g.FirstOrDefault().CN_S_TRAY_GRID.Trim(), CN_S_ITEM_CODE = g.FirstOrDefault().CN_S_ITEM_CODE.Trim(), CN_S_ITEM_STATE = g.FirstOrDefault().CN_S_ITEM_STATE.Trim(), CN_S_LOT_NO = g.FirstOrDefault().CN_S_LOT_NO.Trim(), CN_S_OWNER = g.FirstOrDefault().CN_S_OWNER.Trim(), CN_F_QUANTITY = g.Sum(p => p.CN_F_QUANTITY) }).ToList(); Log.Info("SaveSimPalletItemRelation===>Group_List:====>", JsonConvert.SerializeObject(Group_List)); for (int i = 0; i < Group_List.Count; i++) { AutoBomItemEntity itemenity = CreateDAL().GetItemEntity(Group_List[i].CN_S_ITEM_CODE.ToString()); //拼接托盘物料关联主表实体 #region 拼接托盘物料关联主表实体 var mstGuid = Guid.NewGuid().ToString().ToUpper(); var trayItemMstEntity = new TN_WM_B_TRAY_ITEM_MSTEntity { CN_GUID = mstGuid, CN_S_TRAY_CODE = entity.CN_S_TRAY_CODE, CN_S_TRAY_GRID = Group_List[i].CN_S_TRAY_GRID.ToString(), CN_S_OWNER = string.IsNullOrEmpty(Group_List[i].CN_S_OWNER.ToString()) ? Constants.DefaultOwner : Group_List[i].CN_S_OWNER.ToString(), CN_S_ITEM_CODE = Group_List[i].CN_S_ITEM_CODE.ToString(), CN_S_ITEM_NAME = itemenity.CN_S_ITEM_NAME, CN_S_FIGURE_NO = itemenity.CN_S_FIGURE_NO, CN_S_MODEL = itemenity.CN_S_MODEL, CN_S_ITEM_STATE = string.IsNullOrEmpty(Group_List[i].CN_S_ITEM_STATE.ToString()) ? Constants.ItemState_Qualified : Group_List[i].CN_S_ITEM_STATE.ToString(), CN_F_QUANTITY = Convert.ToDecimal(Group_List[i].CN_F_QUANTITY.ToString()), CN_S_MEASURE_UNIT = itemenity.CN_S_MEASURE_UNIT, CN_F_ALLOC_QTY = 0, CN_S_TIMESTAMP = (DateTime.Now - TimeZone.CurrentTimeZone.ToLocalTime(new DateTime(1970, 1, 1))).TotalMilliseconds.ToString(), CN_F_INQTY = Convert.ToDecimal(Group_List[i].CN_F_QUANTITY.ToString()), }; #endregion Log.Info("SaveSimPalletItemRelation===>trayItemMstEntity:====>", JsonConvert.SerializeObject(trayItemMstEntity)); #region 拼接托盘物料关联子表实体 TrayItemMstlst.Add(trayItemMstEntity); var parentGuid = trayItemMstEntity.CN_GUID; var dtl_List = entity.row.Where(o => o.CN_S_OWNER.Trim() == Group_List[i].CN_S_OWNER.Trim() && o.CN_S_LOT_NO.Trim() == Group_List[i].CN_S_LOT_NO.Trim() && o.CN_S_ITEM_CODE.Trim() == Group_List[i].CN_S_ITEM_CODE.Trim()).ToList(); Log.Info("===>dtl_List:====>", JsonConvert.SerializeObject(dtl_List)); for (int j = 0; j < dtl_List.Count; j++) { var dtlentity = new TN_WM_B_TRAY_ITEM_DTLEntity(); dtlentity.CN_GUID = Guid.NewGuid().ToString().ToUpper(); dtlentity.CN_PARENT_GUID = parentGuid; dtlentity.CN_S_UNIQUE_CODE = "";// entity.row[i].CN_S_UNIQUE_CODE.ToString(); dtlentity.CN_S_LOT_NO = dtl_List[j].CN_S_LOT_NO.ToString(); dtlentity.CN_F_QUANTITY = Convert.ToDecimal(dtl_List[j].CN_F_QUANTITY); dtlentity.CN_S_PRODUCTION_BATCH = dtl_List[j].CN_S_PRODUCTION_BATCH.ToString(); dtlentity.CN_S_NOTE = ""; dtlentity.CN_S_EXT1 = ""; dtlentity.CN_S_EXT2 = ""; dtlentity.CN_S_EXT3 = ""; dtlentity.CN_S_EXT4 = ""; dtlentity.CN_S_EXT5 = ""; dtlentity.CN_S_CREATOR = userEntity.CN_S_LOGIN; dtlentity.CN_S_CREATOR_BY = userEntity.CN_S_NAME; dtlentity.CN_T_CREATE = DateTime.Now; dtlentity.CN_S_MODIFY = userEntity.CN_S_LOGIN; dtlentity.CN_S_MODIFY_BY = userEntity.CN_S_NAME; dtlentity.CN_T_MODIFY = DateTime.Now; TrayItemDtllst.Add(dtlentity); Log.Info("===>TrayItemDtllst:" + j + "==>", JsonConvert.SerializeObject(TrayItemDtllst)); } #endregion } //获取原托盘中的数据 List lstOriginalMST = BLLCreator.Create>().GetList(new { CN_S_TRAY_CODE = trayNo }); operateResult = UseTransaction(trans => { //删除主表 CreateDAL>().Delete(new { CN_S_TRAY_CODE = trayNo }, trans); //删除子表 foreach (TN_WM_B_TRAY_ITEM_MSTEntity mEntity in lstOriginalMST) { CreateDAL>().Delete(new { CN_PARENT_GUID = mEntity.CN_GUID }, trans); } if (TrayItemMstlst.Any()) { //新增托盘物料关联主表 CreateDAL>().AddRange(TrayItemMstlst, trans); } if (TrayItemDtllst.Any()) { CreateDAL>().AddRange(TrayItemDtllst, trans); } }); } catch (Exception ex) { return OperateResult.Error(ex.Message.ToString()); } //成功后,赋值托盘编码 if (operateResult.Success) { operateResult.Data = trayNo; } return operateResult; } #endregion #region 唯一码码盘保存 /// /// 码盘 /// /// 数据Json /// 登陆信息实体 /// /// [HANHE(XDL)] CREATED BY 2018-11-17 public OperateResult SaveUniPalletItemRelation(ItemOnTrayEntity entity, RedisUserEntity userEntity) { OperateResult operateResult = new OperateResult(); string trayNo = entity.CN_S_TRAY_CODE; try { List trayInfoList = new List(); //删除托盘物料关联主子表 //拼接托盘物料关联主子表 List TrayItemMstlst = new List(); List TrayItemUpdateMstlst = new List(); List TrayItemDtllst = new List(); Log.Info("SaveSimPalletItemRelation===>传参:====>", JsonConvert.SerializeObject(entity)); var Group_List = entity.row.GroupBy(x => new { x.CN_S_TRAY_CODE, x.CN_S_TRAY_GRID, x.CN_S_ITEM_CODE, x.CN_S_ITEM_STATE, x.CN_S_OWNER }).Select(g => new TrayItemRow { CN_S_TRAY_CODE = g.FirstOrDefault().CN_S_TRAY_CODE.Trim(), CN_S_TRAY_GRID = string.IsNullOrEmpty(g.FirstOrDefault().CN_S_TRAY_GRID.Trim()) ? "1" : g.FirstOrDefault().CN_S_TRAY_GRID.Trim(), CN_S_ITEM_CODE = g.FirstOrDefault().CN_S_ITEM_CODE.Trim(), CN_S_ITEM_STATE = g.FirstOrDefault().CN_S_ITEM_STATE.Trim(), CN_S_OWNER = g.FirstOrDefault().CN_S_OWNER.Trim(), CN_F_QUANTITY = g.Sum(p => p.CN_F_QUANTITY) }).ToList(); Log.Info("SaveSimPalletItemRelation===>Group_List:====>", JsonConvert.SerializeObject(Group_List)); for (int i = 0; i < Group_List.Count; i++) { AutoBomItemEntity itemenity = CreateDAL().GetItemEntity(Group_List[i].CN_S_ITEM_CODE.ToString()); //拼接托盘物料关联主表实体 #region 拼接托盘物料关联主表实体 var mstGuid = Guid.NewGuid().ToString().ToUpper(); var trayItemMstEntity = new TN_WM_B_TRAY_ITEM_MSTEntity { CN_GUID = mstGuid, CN_S_TRAY_CODE = entity.CN_S_TRAY_CODE, CN_S_TRAY_GRID = Group_List[i].CN_S_TRAY_GRID.ToString(), CN_S_OWNER = string.IsNullOrEmpty(Group_List[i].CN_S_OWNER.ToString()) ? Constants.DefaultOwner : Group_List[i].CN_S_OWNER.ToString(), CN_S_ITEM_CODE = Group_List[i].CN_S_ITEM_CODE.ToString(), CN_S_ITEM_NAME = itemenity.CN_S_ITEM_NAME, CN_S_FIGURE_NO = itemenity.CN_S_FIGURE_NO, CN_S_MODEL = itemenity.CN_S_MODEL, CN_S_ITEM_STATE = string.IsNullOrEmpty(Group_List[i].CN_S_ITEM_STATE.ToString()) ? Constants.ItemState_Qualified : Group_List[i].CN_S_ITEM_STATE.ToString(), CN_F_QUANTITY = Convert.ToDecimal(Group_List[i].CN_F_QUANTITY.ToString()), CN_S_MEASURE_UNIT = itemenity.CN_S_MEASURE_UNIT, CN_F_ALLOC_QTY = 0, CN_S_TIMESTAMP = (DateTime.Now - TimeZone.CurrentTimeZone.ToLocalTime(new DateTime(1970, 1, 1))).TotalMilliseconds.ToString(), CN_F_INQTY = Convert.ToDecimal(Group_List[i].CN_F_QUANTITY.ToString()), }; #endregion //判断是否在数据库中已存在,存在的话,主表递增数量,不存在的话,主表追加行 var result = CreateDAL().CheckExists(trayItemMstEntity); var parentGuid = ""; if (result.Any()) { trayItemMstEntity.CN_GUID = result[0].CN_GUID; TrayItemUpdateMstlst.Add(trayItemMstEntity); parentGuid = result[0].CN_GUID; } else { TrayItemMstlst.Add(trayItemMstEntity); parentGuid = trayItemMstEntity.CN_GUID; } Log.Info("SaveSimPalletItemRelation===>trayItemMstEntity:====>", JsonConvert.SerializeObject(trayItemMstEntity)); #region 拼接托盘物料关联子表实体 var dtl_List = entity.row.Where(o => o.CN_S_OWNER.Trim() == Group_List[i].CN_S_OWNER.Trim() && o.CN_S_ITEM_STATE.Trim() == Group_List[i].CN_S_ITEM_STATE.Trim() && o.CN_S_ITEM_CODE.Trim() == Group_List[i].CN_S_ITEM_CODE.Trim()).ToList(); Log.Info("===>dtl_List:====>", JsonConvert.SerializeObject(dtl_List)); for (int j = 0; j < dtl_List.Count; j++) { var dtlentity = new TN_WM_B_TRAY_ITEM_DTLEntity(); dtlentity.CN_GUID = Guid.NewGuid().ToString().ToUpper(); dtlentity.CN_PARENT_GUID = parentGuid; dtlentity.CN_S_UNIQUE_CODE = entity.row[i].CN_S_UNIQUE_CODE.ToString(); dtlentity.CN_S_LOT_NO = dtl_List[j].CN_S_LOT_NO.ToString(); dtlentity.CN_S_SERIAL_NO = dtl_List[j].CN_S_SERIAL_NO.ToString(); dtlentity.CN_F_QUANTITY = Convert.ToDecimal(dtl_List[j].CN_F_QUANTITY); dtlentity.CN_S_VENDOR_NO = dtl_List[j].CN_S_VENDOR_NO.ToString(); dtlentity.CN_S_VENDOR_NAME = dtl_List[j].CN_S_VENDOR_NAME.ToString(); dtlentity.CN_T_PRODUCTION = dtl_List[j].CN_T_PRODUCTION; dtlentity.CN_T_EXPIRATION = dtl_List[j].CN_T_EXPIRATION; dtlentity.CN_S_PRODUCTION_BATCH = dtl_List[j].CN_S_PRODUCTION_BATCH.ToString(); dtlentity.CN_S_NOTE = ""; dtlentity.CN_S_EXT1 = ""; dtlentity.CN_S_EXT2 = ""; dtlentity.CN_S_EXT3 = ""; dtlentity.CN_S_EXT4 = ""; dtlentity.CN_S_EXT5 = ""; dtlentity.CN_S_CREATOR = userEntity.CN_S_LOGIN; dtlentity.CN_S_CREATOR_BY = userEntity.CN_S_NAME; dtlentity.CN_T_CREATE = DateTime.Now; dtlentity.CN_S_MODIFY = userEntity.CN_S_LOGIN; dtlentity.CN_S_MODIFY_BY = userEntity.CN_S_NAME; dtlentity.CN_T_MODIFY = DateTime.Now; TrayItemDtllst.Add(dtlentity); Log.Info("===>TrayItemDtllst:" + j + "==>", JsonConvert.SerializeObject(TrayItemDtllst)); } #endregion } operateResult = UseTransaction(trans => { if (TrayItemMstlst.Any()) { //新增托盘物料关联主表 CreateDAL>().AddRange(TrayItemMstlst, trans); } if (TrayItemUpdateMstlst.Any()) { //更新托盘物料关联主表 var aa = CreateDAL().UpdateMstQty(TrayItemUpdateMstlst, trans); Log.Info("===>更新托盘物料关联主表", ""); Log.Info("===>影响行数", aa.AffectedRows.ToString()); } if (TrayItemDtllst.Any()) { CreateDAL>().AddRange(TrayItemDtllst, trans); } }); } catch (Exception ex) { return OperateResult.Error(ex.Message.ToString()); } //成功后,赋值托盘编码 if (operateResult.Success) { operateResult.Data = trayNo; } return operateResult; } #endregion #region 根据入库单码盘保存 /// /// 码盘 /// /// 数据Json /// 登陆信息实体 /// /// [HANHE(XDL)] CREATED BY 2018-11-17 public OperateResult SaveRkdPalletItemRelation(ItemOnTrayEntity entity, RedisUserEntity userEntity) { OperateResult operateResult = new OperateResult(); string trayNo = entity.CN_S_TRAY_CODE; try { List trayInfoList = new List(); //删除托盘物料关联主子表 //拼接托盘物料关联主子表 List TrayItemMstlst = new List(); List TrayItemUpdateMstlst = new List(); List TrayItemDtllst = new List(); Log.Info("SaveRkdPalletItemRelation===>传参:====>", JsonConvert.SerializeObject(entity)); var Group_List = entity.row.GroupBy(x => new { x.CN_S_TRAY_CODE, x.CN_S_TRAY_GRID, x.CN_S_ITEM_CODE, x.CN_S_ITEM_STATE, x.CN_S_OWNER }).Select(g => new TrayItemRow { CN_S_TRAY_CODE = g.FirstOrDefault().CN_S_TRAY_CODE.Trim(), CN_S_TRAY_GRID = string.IsNullOrEmpty(g.FirstOrDefault().CN_S_TRAY_GRID.Trim()) ? "1" : g.FirstOrDefault().CN_S_TRAY_GRID.Trim(), CN_S_ITEM_CODE = g.FirstOrDefault().CN_S_ITEM_CODE.Trim(), CN_S_ITEM_STATE = g.FirstOrDefault().CN_S_ITEM_STATE.Trim(), CN_S_OWNER = g.FirstOrDefault().CN_S_OWNER.Trim(), CN_F_QUANTITY = g.Sum(p => p.CN_F_QUANTITY) }).ToList(); Log.Info("SaveRkdPalletItemRelation===>Group_List:====>", JsonConvert.SerializeObject(Group_List)); for (int i = 0; i < Group_List.Count; i++) { AutoBomItemEntity itemenity = CreateDAL().GetItemEntity(Group_List[i].CN_S_ITEM_CODE.ToString()); //拼接托盘物料关联主表实体 #region 拼接托盘物料关联主表实体 var mstGuid = Guid.NewGuid().ToString().ToUpper(); var trayItemMstEntity = new TN_WM_B_TRAY_ITEM_MSTEntity { CN_GUID = mstGuid, CN_S_TRAY_CODE = entity.CN_S_TRAY_CODE, CN_S_TRAY_GRID = Group_List[i].CN_S_TRAY_GRID.ToString(), CN_S_OWNER = string.IsNullOrEmpty(Group_List[i].CN_S_OWNER.ToString()) ? Constants.DefaultOwner : Group_List[i].CN_S_OWNER.ToString(), CN_S_ITEM_CODE = Group_List[i].CN_S_ITEM_CODE.ToString(), CN_S_ITEM_NAME = itemenity.CN_S_ITEM_NAME, CN_S_FIGURE_NO = itemenity.CN_S_FIGURE_NO, CN_S_MODEL = itemenity.CN_S_MODEL, CN_S_ITEM_STATE = string.IsNullOrEmpty(Group_List[i].CN_S_ITEM_STATE.ToString()) ? Constants.ItemState_Qualified : Group_List[i].CN_S_ITEM_STATE.ToString(), CN_F_QUANTITY = Convert.ToDecimal(Group_List[i].CN_F_QUANTITY.ToString()), CN_S_MEASURE_UNIT = itemenity.CN_S_MEASURE_UNIT, CN_F_ALLOC_QTY = 0, CN_S_TIMESTAMP = (DateTime.Now - TimeZone.CurrentTimeZone.ToLocalTime(new DateTime(1970, 1, 1))).TotalMilliseconds.ToString(), CN_F_INQTY = Convert.ToDecimal(Group_List[i].CN_F_QUANTITY.ToString()), }; #endregion //判断是否在数据库中已存在,存在的话,主表递增数量,不存在的话,主表追加行 var result = CreateDAL().CheckExists(trayItemMstEntity); var parentGuid = ""; if (result.Any()) { trayItemMstEntity.CN_GUID = result[0].CN_GUID; TrayItemUpdateMstlst.Add(trayItemMstEntity); parentGuid = result[0].CN_GUID; } else { TrayItemMstlst.Add(trayItemMstEntity); parentGuid = trayItemMstEntity.CN_GUID; } Log.Info("SaveRkdPalletItemRelation===>trayItemMstEntity:====>", JsonConvert.SerializeObject(trayItemMstEntity)); #region 拼接托盘物料关联子表实体 var dtl_List = entity.row.Where(o => o.CN_S_OWNER.Trim() == Group_List[i].CN_S_OWNER.Trim() && o.CN_S_ITEM_STATE.Trim() == Group_List[i].CN_S_ITEM_STATE.Trim() && o.CN_S_ITEM_CODE.Trim() == Group_List[i].CN_S_ITEM_CODE.Trim()).ToList(); Log.Info("===>dtl_List:====>", JsonConvert.SerializeObject(dtl_List)); for (int j = 0; j < dtl_List.Count; j++) { var dtlentity = new TN_WM_B_TRAY_ITEM_DTLEntity(); dtlentity.CN_GUID = Guid.NewGuid().ToString().ToUpper(); dtlentity.CN_PARENT_GUID = parentGuid; dtlentity.CN_S_UNIQUE_CODE = ""; dtlentity.CN_S_LOT_NO = dtl_List[j].CN_S_LOT_NO.ToString(); dtlentity.CN_S_SERIAL_NO = dtl_List[j].CN_S_SERIAL_NO.ToString(); dtlentity.CN_F_QUANTITY = Convert.ToDecimal(dtl_List[j].CN_F_QUANTITY); dtlentity.CN_S_VENDOR_NO = dtl_List[j].CN_S_VENDOR_NO.ToString(); dtlentity.CN_S_VENDOR_NAME = dtl_List[j].CN_S_VENDOR_NAME.ToString(); dtlentity.CN_T_PRODUCTION = dtl_List[j].CN_T_PRODUCTION; dtlentity.CN_T_EXPIRATION = dtl_List[j].CN_T_EXPIRATION; dtlentity.CN_S_PRODUCTION_BATCH = dtl_List[j].CN_S_PRODUCTION_BATCH.ToString(); dtlentity.CN_S_NOTE = ""; dtlentity.CN_S_EXT1 = ""; dtlentity.CN_S_EXT2 = ""; dtlentity.CN_S_EXT3 = ""; dtlentity.CN_S_EXT4 = ""; dtlentity.CN_S_EXT5 = ""; dtlentity.CN_S_CREATOR = userEntity.CN_S_LOGIN; dtlentity.CN_S_CREATOR_BY = userEntity.CN_S_NAME; dtlentity.CN_T_CREATE = DateTime.Now; dtlentity.CN_S_MODIFY = userEntity.CN_S_LOGIN; dtlentity.CN_S_MODIFY_BY = userEntity.CN_S_NAME; dtlentity.CN_T_MODIFY = DateTime.Now; TrayItemDtllst.Add(dtlentity); Log.Info("===>TrayItemDtllst:" + j + "==>", JsonConvert.SerializeObject(TrayItemDtllst)); } #endregion } operateResult = UseTransaction(trans => { if (TrayItemMstlst.Any()) { //新增托盘物料关联主表 CreateDAL>().AddRange(TrayItemMstlst, trans); } if (TrayItemUpdateMstlst.Any()) { //更新托盘物料关联主表 var aa = CreateDAL().UpdateMstQty(TrayItemUpdateMstlst, trans); Log.Info("===>更新托盘物料关联主表", ""); Log.Info("===>影响行数", aa.AffectedRows.ToString()); } if (TrayItemDtllst.Any()) { CreateDAL>().AddRange(TrayItemDtllst, trans); } //根据单号和物料编码更新累积码盘数 CreateDAL().updateOntrayQty(entity.row, trans); Log.Info("===>根据单号和物料编码更新累积码盘数", ""); }); } catch (Exception ex) { return OperateResult.Error(ex.Message.ToString()); } //成功后,赋值托盘编码 if (operateResult.Success) { operateResult.Data = trayNo; } return operateResult; } #endregion #region 托盘货位绑定 /// /// 针对简易版WMS人工库,绑定货位等同入库,增加仓库、库区库存,不能应用在复杂的WMS(有到货区、出库单、自动化库)场景中 /// /// 托盘编码 /// 货位编码 /// 用户实体 /// /// [HANHE(XDL)] CREATED BY 2019-04-17 public OperateResult AddTrayLocationRelation(string trayCode, string locationCode, RedisUserEntity userEntity, string projectCode) { if (string.IsNullOrEmpty(trayCode) || 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)); } //检查该托盘是否在(未执行或执行中的)任务中 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 //拼接托盘货位实体 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) { 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 #region (PDA接口)托盘货位解绑 /// /// 针对简易版WMS人工库,绑定货位等同出库,减少仓库、库区库存,不能应用在复杂的WMS(有到货区、出库单、自动化库)场景中 /// /// 托盘编码 /// 货位编码 /// 用户实体 /// /// [HANHE(XDL)] CREATED BY 2019-04-17 public OperateResult DeleteTrayLocationRelation(string trayCode, string locationCode, RedisUserEntity userEntity, string projectCode) { if (string.IsNullOrEmpty(trayCode) && string.IsNullOrEmpty(locationCode)) { return OperateResult.Error("参数不全!"); } OperateResult operateResult = new OperateResult(); List downHis = new List(); List reduceStockQty = new List(); List reduceAreaQty = new List(); //根据托盘码删除 if (!string.IsNullOrEmpty(trayCode)) { #region 判断托盘与货位是否满足解绑条件 //判断托盘是否绑定货位 List lstEntity = CreateDAL().GetListByTrayCode(trayCode); if (lstEntity.Count == 0) { return OperateResult.Error("当前托盘没有绑定货位,不需要解绑!"); } List GetModel = BLLCreator.Create(this.userInfo).GetModel("where CN_S_LOCATION_CODE='" + lstEntity[0].CN_S_LOCATION_CODE.ToString() + "'"); if (GetModel.Count == 0) { return OperateResult.Error(string.Format("在表TN_WM_LOCATION_EXT中未查询到该货位{0}!", lstEntity[0].CN_S_LOCATION_CODE.ToString())); } AutoBomStockAreaEntity areaModel = new AutoBomStockAreaEntity(); areaModel = CreateDAL().GetAreaModelByLocation(lstEntity[0].CN_S_LOCATION_CODE.ToString()); if (areaModel == null) { //非法的目的货位 return OperateResult.Error(string.Format("在mongo(TN_AB_B_STOCK_AREA或TN_AB_STOCK_LOCATION表)中未查询到该货位的相关信息!", lstEntity[0].CN_S_LOCATION_CODE.ToString())); } if (areaModel.CN_C_IS_CONTROL_QTY.Equals("Y")) { //货位存储状态:非空 if (GetModel[0].CN_S_USE_STATE != Constants.Use_State_Full) { return OperateResult.Error(string.Format("该托盘关联的货位{0}存储状态为{1},不允许从该位置解绑!", lstEntity[0].CN_S_LOCATION_CODE.ToString(), GetModel[0].CN_S_USE_STATE)); } } //货位状态:正常 if (GetModel[0].CN_S_LOCATION_STATE != Constants.Location_State_Normal) { return OperateResult.Error(string.Format("该托盘关联的货位{0}状态为{1},不允许从该位置解绑!", lstEntity[0].CN_S_LOCATION_CODE.ToString(), GetModel[0].CN_S_LOCATION_STATE)); } #endregion if (areaModel.CN_C_IS_INVENTORY != null) { 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 拼接下架记录表 TN_WM_DOWN_HISTORYEntity down = new TN_WM_DOWN_HISTORYEntity(); down.CN_GUID = Guid.NewGuid().ToString(); down.CN_S_CREATOR = userEntity.CN_S_LOGIN; down.CN_S_CREATOR_BY = userEntity.CN_S_NAME; down.CN_S_MODIFY = userEntity.CN_S_LOGIN; down.CN_S_MODIFY_BY = userEntity.CN_S_NAME; down.CN_F_QUANTITY = dltEntity.CN_F_QUANTITY; down.CN_F_PACKING_QTY = 0; down.CN_S_LOT_NO = dltEntity.CN_S_LOT_NO == null ? "" : dltEntity.CN_S_LOT_NO; ; down.CN_S_FIGURE_NO = mstEntity.CN_S_FIGURE_NO; down.CN_S_ITEM_CODE = mstEntity.CN_S_ITEM_CODE; down.CN_S_ITEM_NAME = mstEntity.CN_S_ITEM_NAME; down.CN_S_ITEM_STATE = mstEntity.CN_S_ITEM_STATE == null ? "" : mstEntity.CN_S_ITEM_STATE; down.CN_S_LOCATION_CODE = lstEntity[0].CN_S_LOCATION_CODE.ToString(); down.CN_S_MEASURE_UNIT = mstEntity.CN_S_MEASURE_UNIT; down.CN_S_MODEL = mstEntity.CN_S_MODEL; down.CN_S_OWNER = mstEntity.CN_S_OWNER == null ? "" : mstEntity.CN_S_OWNER; down.CN_S_PACKING_UNIT = ""; down.CN_S_PRODUCTION_BATCH = dltEntity.CN_S_PRODUCTION_BATCH == null ? "" : mstEntity.CN_S_PRODUCTION_BATCH; down.CN_S_STOCK_AREA = areaModel.CN_S_AREA_CODE; down.CN_S_STOCK_CODE = areaModel.CN_S_STOCK_CODE; down.CN_S_EXT1 = dltEntity.CN_S_UNIQUE_CODE; down.CN_S_TRAY_CODE = trayCode; down.CN_S_TRAY_GRID = "1"; down.CN_T_CREATE = down.CN_T_MODIFY = DateTime.Now; down.CN_S_OP_FROM = "PDA解绑下架"; downHis.Add(down); #endregion } } #region 仓库量表 reduceStockQty = downHis.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_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_STOCK_QTYEntity() { 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_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_OWNER = y.Key.CN_S_OWNER, CN_S_PRODUCTION_BATCH = y.Key.CN_S_PRODUCTION_BATCH, CN_S_STOCK_CODE = y.Key.CN_S_STOCK_CODE }; }).ToList(); #endregion #region 库区量表 reduceAreaQty = downHis.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_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 = UseTransaction(trans => { string waitlocationCode = locationCode; //根据托盘删除关联 CreateDAL>().Delete(new { CN_S_TRAY_CODE = trayCode }, trans); if (areaModel.CN_C_IS_CONTROL_QTY.Equals("Y")) { //更新货位贮存状态 operateResult = CreateDAL>().Update( new { CN_S_USE_STATE = Constants.Use_State_Empty, 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 = lstEntity[0].CN_S_LOCATION_CODE.ToString(), 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 (reduceStockQty.Any()) CreateDAL().ReduceStockQty(reduceStockQty, trans); //更新库区量表 if (reduceAreaQty.Any()) CreateDAL().ReduceAreaQty(reduceAreaQty, trans); //下架记录 if (downHis.Any()) CreateDAL>().AddRange(downHis, trans); } } }); return operateResult; } //根据货位码删除 if (!string.IsNullOrEmpty(locationCode)) { #region 判断托盘与货位是否满足解绑条件 //判断货位是否绑定托盘 List lstEntity = CreateDAL().GetListByLocationCode(locationCode); if (lstEntity.Count == 0) { return OperateResult.Error("当前货位没有绑定托盘,不需要解绑!"); } List GetModel = BLLCreator.Create(this.userInfo).GetModel("where CN_S_LOCATION_CODE='" + locationCode + "'"); if (GetModel.Count == 0) { return OperateResult.Error(string.Format("在表TN_WM_LOCATION_EXT中未查询到该货位{0}!", locationCode)); } 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_INVENTORY == "Y") { //货位存储状态:非空 if (GetModel[0].CN_S_USE_STATE != Constants.Use_State_Full) { return OperateResult.Error(string.Format("当前货位{0}存储状态为{1},不允许从该位置解绑!", locationCode, GetModel[0].CN_S_USE_STATE)); } } //货位状态:正常 if (GetModel[0].CN_S_LOCATION_STATE != Constants.Location_State_Normal) { return OperateResult.Error(string.Format("当前货位{0}状态为{1},不允许从该位置解绑!", locationCode, GetModel[0].CN_S_LOCATION_STATE)); } #endregion if (areaModel.CN_C_IS_INVENTORY != null) { if (areaModel.CN_C_IS_INVENTORY == "Y") { //获取原托盘中的数据 List lstOriginalMST = BLLCreator.Create>().GetList(new { CN_S_TRAY_CODE = lstEntity[0].CN_S_TRAY_CODE }); 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 拼接下架记录表 TN_WM_DOWN_HISTORYEntity down = new TN_WM_DOWN_HISTORYEntity(); down.CN_GUID = Guid.NewGuid().ToString(); down.CN_S_CREATOR = userEntity.CN_S_LOGIN; down.CN_S_CREATOR_BY = userEntity.CN_S_NAME; down.CN_S_MODIFY = userEntity.CN_S_LOGIN; down.CN_S_MODIFY_BY = userEntity.CN_S_NAME; down.CN_F_PACKING_QTY = 0; down.CN_F_QUANTITY = dltEntity.CN_F_QUANTITY; down.CN_S_LOT_NO = dltEntity.CN_S_LOT_NO; down.CN_S_FIGURE_NO = mstEntity.CN_S_FIGURE_NO; down.CN_S_ITEM_CODE = mstEntity.CN_S_ITEM_CODE; down.CN_S_ITEM_NAME = mstEntity.CN_S_ITEM_NAME; down.CN_S_ITEM_STATE = mstEntity.CN_S_ITEM_STATE; down.CN_S_LOCATION_CODE = locationCode; down.CN_S_MEASURE_UNIT = mstEntity.CN_S_MEASURE_UNIT; down.CN_S_MODEL = mstEntity.CN_S_MODEL; down.CN_S_OWNER = mstEntity.CN_S_OWNER; down.CN_S_PACKING_UNIT = ""; down.CN_S_PRODUCTION_BATCH = dltEntity.CN_S_PRODUCTION_BATCH; down.CN_S_EXT1 = dltEntity.CN_S_UNIQUE_CODE; down.CN_S_STOCK_AREA = areaModel.CN_S_AREA_CODE; down.CN_S_STOCK_CODE = areaModel.CN_S_STOCK_CODE; down.CN_S_TRAY_CODE = lstEntity[0].CN_S_TRAY_CODE; down.CN_S_TRAY_GRID = "1"; down.CN_T_CREATE = down.CN_T_MODIFY = DateTime.Now; down.CN_S_OP_FROM = "PDA解绑下架"; downHis.Add(down); #endregion } } #region 仓库量表 reduceStockQty = downHis.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_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_STOCK_QTYEntity() { 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_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_OWNER = y.Key.CN_S_OWNER, CN_S_PRODUCTION_BATCH = y.Key.CN_S_PRODUCTION_BATCH, CN_S_STOCK_CODE = y.Key.CN_S_STOCK_CODE }; }).ToList(); #endregion #region 库区量表 reduceAreaQty = downHis.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_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 = UseTransaction(trans => { string waitlocationCode = locationCode; //根据货位删除关联 CreateDAL>().Delete(new { CN_S_LOCATION_CODE = locationCode }, trans); if (areaModel.CN_C_IS_INVENTORY == "Y") { //更新货位贮存状态 operateResult = CreateDAL>().Update( new { CN_S_USE_STATE = Constants.Use_State_Empty, 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 (downHis.Any()) CreateDAL>().AddRange(downHis, trans); //更新仓库量表 if (reduceStockQty.Any()) CreateDAL().ReduceStockQty(reduceStockQty, trans); //更新库区量表 if (reduceAreaQty.Any()) CreateDAL().ReduceAreaQty(reduceAreaQty, trans); } } }); } return operateResult; } #endregion #region 整托上架 /// /// 整托执行上架 /// /// Json集合 /// 用户实体 /// /// [HANHE(XDL)] CREATED BY 2018-12-12 public OperateResult SimZTShelfAuto(TrayOnShelfEntity entity, RedisUserEntity userEntity) { string deviceNo = entity.CN_S_DEVICE_NO;//起点 string locationCode = entity.CN_S_LOCATION_CODE; string endAreaCode = entity.CN_S_END_AREA_CODE; string trayCode = entity.CN_S_TRAY_CODE; if (string.IsNullOrEmpty(locationCode)) { //调用算法计算终点货位 //调用算法计算终点货位 //调用入库算法,获取空货位 List lstTmpArea = new List(); lstTmpArea.Add(new areaPriorClass { areaCode = endAreaCode, Prior = 1 }); InAssignEntity iAe = new InAssignEntity() { lstAreaPrior = lstTmpArea, logicAreaCode = "", objectCode = trayCode, lockLocation = false,//是否需要锁定货位 needCalLock = false }; iAe.lstDevice = null; InAssignResultEntity irEresult = BLLCreator.Create().InAssign(iAe); if (!irEresult.Success) { return OperateResult.Error(irEresult.Msg);//货位获取失败! } else { locationCode = irEresult.locationCode.ToString(); } } #region 货位逻辑判断检测 TN_WM_LOCATION_EXTEntity startlocation = BLLCreator.Create().GetExtModel(" where CN_S_LOCATION_CODE='" + deviceNo + "'"); if (startlocation == null) { return OperateResult.Error("在表TN_WM_LOCATION_EXT中未查询到该起点货位!"); } if (startlocation.CN_S_LOCATION_STATE != Constants.Location_State_Normal) { return OperateResult.Error(string.Format("当前起点位置状态为{0},不允许从该位置取料!", startlocation.CN_S_LOCATION_STATE)); } AutoBomStockAreaEntity startArea = CreateDAL().GetAreaModelByLocation(deviceNo); if (startArea == null) { //非法的目的货位 return OperateResult.Error(string.Format("在mongo(TN_AB_B_STOCK_AREA或TN_AB_STOCK_LOCATION表)中未查询到该起点货位{0}的库区信息!", deviceNo)); } if (startArea.CN_C_IS_CONTROL_QTY.Equals("Y")) { if (startlocation.CN_S_USE_STATE != Constants.Use_State_Full) { return OperateResult.Error(string.Format("起点库区管控数量并且货位存储状态为{0},不允许从该位置取料!", startlocation.CN_S_USE_STATE)); } //判断货位是否绑定托盘 List lstStartTray = CreateDAL().GetListByLocationCode(deviceNo); if (lstStartTray.Count == 0) { return OperateResult.Error("在该起点位置上未绑定托盘物料信息!"); } } //检查该托盘是否在(未执行或执行中的)任务中 List lstInTask = CreateDAL().GetTaskByTray(trayCode); if (lstInTask.Count > 0) { return OperateResult.Error(string.Format("当前托盘已在搬运任务{0}中,不允许绑定未执行或执行中的任务!", lstInTask[0].CN_S_TASK_NO)); } TN_WM_LOCATION_EXTEntity endlocation = BLLCreator.Create().GetExtModel(" where CN_S_LOCATION_CODE='" + locationCode + "'"); if (endlocation == null) { return OperateResult.Error("在表TN_WM_LOCATION_EXT未查询到该目的货位!"); } if (endlocation.CN_S_LOCATION_STATE != Constants.Location_State_Normal) { return OperateResult.Error(string.Format("当前起点位置状态为{0},不允许往该位置卸料!", endlocation.CN_S_LOCATION_STATE)); } AutoBomStockAreaEntity endArea = CreateDAL().GetAreaModelByLocation(locationCode); if (endArea == null) { //非法的目的货位 return OperateResult.Error(string.Format("在mongo(TN_AB_B_STOCK_AREA或TN_AB_STOCK_LOCATION表)中未查询到该目的货位{0}的库区信息!", locationCode)); } if (endArea.CN_C_IS_CONTROL_QTY.Equals("Y") && endlocation.CN_S_USE_STATE != Constants.Use_State_Empty) { return OperateResult.Error(string.Format("终点库区管控数量并且货位存储状态为{0},不允许往该位置卸料!", endlocation.CN_S_USE_STATE)); } //判断货位是否绑定托盘 List lstEndTray = CreateDAL().GetListByLocationCode(locationCode); if (lstEndTray.Count > 0) { return OperateResult.Error("该目的位置上已绑定其他托盘物料信息!"); } #endregion List TrayLocationlst = new List(); List Group_List = new List(); //生成入库任务 List taskEntityList = new List(); //生成入库任务 TN_WM_TASKEntity taskEntity = new TN_WM_TASKEntity(); string postData = "{\"appCode\":\"" + Constants.appCode + "\",\"ruleName\":\"" + Constants.Rule_InTaskNo + "\",\"orgId\":\"\",\"orgFlag\":\"0\"}"; string taskNo = WebApiManager.HttpAutoBom_Post("api/BillRule/GenBillNo", postData); if (string.IsNullOrEmpty(taskNo)) { return OperateResult.Error("入库任务号生成失败,请检查在AUTOBOM中是否配置转运任务号生成规则!"); } taskEntity.CN_S_TASK_NO = taskNo; taskEntity.CN_S_TASK_TYPE = entity.CN_S_TASK_TYPE; taskEntity.CN_S_FROM_OP = "整托上架"; taskEntity.CN_S_STOCK_CODE = startArea.CN_S_STOCK_CODE; taskEntity.CN_S_START_AREA = startArea.CN_S_AREA_CODE; taskEntity.CN_S_START_BIT = deviceNo; taskEntity.CN_S_END_AREA = endArea.CN_S_AREA_CODE; taskEntity.CN_S_END_BIT = locationCode; taskEntity.CN_S_STATE = Constants.TaskState_NoExecuted; taskEntity.CN_S_TRAY_CODE = trayCode; taskEntity.CN_S_PROJECT_CODE = entity.projectCode; taskEntity.CN_S_START_AREA_TYPE = startArea.CN_S_STRUCTURE; taskEntity.CN_S_END_AREA_TYPE = endArea.CN_S_STRUCTURE; taskEntity.CN_C_START_IS_CONTROL_QTY = startArea.CN_C_IS_CONTROL_QTY; taskEntity.CN_C_END_IS_CONTROL_QTY = endArea.CN_C_IS_CONTROL_QTY; taskEntity.CN_S_START_CONTROL_INV = startArea.CN_C_IS_INVENTORY; taskEntity.CN_S_END_CONTROL_INV = endArea.CN_C_IS_INVENTORY; taskEntity.CN_S_CREATOR = userEntity.CN_S_LOGIN; taskEntity.CN_S_CREATOR_BY = userEntity.CN_S_NAME; taskEntity.CN_T_CREATE = DateTime.Now; taskEntity.CN_S_MODIFY = userEntity.CN_S_LOGIN; taskEntity.CN_S_MODIFY_BY = userEntity.CN_S_NAME; taskEntity.CN_T_MODIFY = DateTime.Now; taskEntityList.Add(taskEntity); OperateResult operateResult = UseTransaction(trans => { OperateResult re = CreateDAL>().Add(taskEntity, trans); //锁定目的位置货位-预入库锁定 if (endArea.CN_C_IS_CONTROL_QTY.Equals("Y")) { operateResult = CreateDAL().UpdateLocationExtStateLock(taskEntity.CN_S_END_BIT, Constants.Location_State_InLock, Constants.Location_State_Normal, "", taskNo, trans); if (operateResult.AffectedRows == 0) { throw new Exception("更新目的货位状态并发冲突,该货位状态可能已经发生变化"); } BLLCreator.Create().AddStateChange(taskEntity.CN_S_START_BIT, "正常", "预入库锁定", "PDA生成任务锁定终点货位", "PDA", userEntity.CN_S_LOGIN, taskNo, endArea.CN_S_STOCK_CODE, endArea.CN_S_AREA_CODE, trans); } if (startArea.CN_C_IS_CONTROL_QTY.Equals("Y")) { //锁定起始位置货位-预出库锁定 operateResult = CreateDAL().UpdateLocationExtStateLock(taskEntity.CN_S_START_BIT, Constants.Location_State_OutLock, Constants.Location_State_Normal, "", taskNo, trans); if (operateResult.AffectedRows == 0) { throw new Exception("更新起点货位状态并发冲突,该货位状态可能已经发生变化"); } BLLCreator.Create().AddStateChange(taskEntity.CN_S_START_BIT, "正常", "预出库锁定", "PDA生成任务锁定起点货位", "PDA", userEntity.CN_S_LOGIN, taskNo, startArea.CN_S_STOCK_CODE, startArea.CN_S_AREA_CODE, trans); } re = new OtherSysApi().SendAmsCreateTask(taskEntity); if (!re.Success) { throw new Exception("SendAmsCreateTask异常:" + re.Msg); } }); return operateResult; } #endregion #region (PDA接口)检查入库起点是否可用 /// /// 针对简易版WMS人工库,绑定货位等同入库,增加仓库、库区库存,不能应用在复杂的WMS(有到货区、出库单、自动化库)场景中 /// /// 托盘编码 /// 货位编码 /// 用户实体 /// /// [HANHE(XDL)] CREATED BY 2019-04-17 public OperateResult CheckInStockLocation(string locationCode) { if (string.IsNullOrEmpty(locationCode)) { return OperateResult.Error("请传入货位号参数!"); } string strTrayCode = ""; //判断货位是否绑定托盘 List lstStartTray = CreateDAL().GetListByLocationCode(locationCode); if (lstStartTray.Count > 0) { strTrayCode = lstStartTray[0].CN_S_TRAY_CODE; //检查该托盘是否在(未执行或执行中的)任务中 List lstInTask = CreateDAL().GetTaskByTray(lstStartTray[0].CN_S_TRAY_CODE); if (lstInTask.Count > 0) { return OperateResult.Error(string.Format("当前货位绑定的托盘已在搬运任务{0}中,不允许重复入库!", lstInTask[0].CN_S_TASK_NO)); } List lstMst = BLLCreator.Create().GetTrayItemMst(" and CN_S_TRAY_CODE ='" + lstStartTray[0].CN_S_TRAY_CODE + "'"); if (lstMst.Count == 0) { return OperateResult.Error(string.Format("当前货位{0}绑定的托盘没有物料信息,不允许入库!", locationCode)); } } 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 (GetModel[0].CN_S_LOCATION_STATE != Constants.Location_State_Normal) { return OperateResult.Error(string.Format("当前货位状态为{0},不允许从该位置取料!", GetModel[0].CN_S_LOCATION_STATE)); } DataTable dt = BLLCreator.Create().GetTrayItemDetail(strTrayCode); return OperateResult.Succeed(strTrayCode, dt); } /// /// 针对简易版WMS人工库,绑定货位等同入库,增加仓库、库区库存,不能应用在复杂的WMS(有到货区、出库单、自动化库)场景中 /// /// 托盘编码 /// 货位编码 /// 用户实体 /// /// [HANHE(XDL)] CREATED BY 2019-04-17 public OperateResult CheckInStockTray(string trayCode) { if (string.IsNullOrEmpty(trayCode)) { return OperateResult.Error("请传入托盘号参数!"); } List lstMst = BLLCreator.Create().GetTrayItemMst(" and CN_S_TRAY_CODE ='" + trayCode + "'"); if (lstMst.Count == 0) { return OperateResult.Error(string.Format("当前托盘{0}没有物料信息,不允许入库!", trayCode)); } //判断货位是否绑定托盘 List lstStartTray = CreateDAL().GetListByTrayCode(trayCode); //检查该托盘是否在(未执行或执行中的)任务中 List lstInTask = CreateDAL().GetTaskByTray(trayCode); if (lstInTask.Count > 0) { return OperateResult.Error(string.Format("当前托盘已在搬运任务{0}中,不允许重复入库!", lstInTask[0].CN_S_TASK_NO)); } if (lstStartTray.Count > 0) { List GetModel = BLLCreator.Create(this.userInfo).GetModel("where CN_S_LOCATION_CODE='" + lstStartTray[0].CN_S_LOCATION_CODE + "'"); if (GetModel.Count == 0) { return OperateResult.Error("在表TN_WM_LOCATION_EXT中未查询到该货位!"); } AutoBomStockAreaEntity areaModel = new AutoBomStockAreaEntity(); areaModel = CreateDAL().GetAreaModelByLocation(lstStartTray[0].CN_S_LOCATION_CODE); if (areaModel == null) { //非法的目的货位 return OperateResult.Error(string.Format("在mongo(TN_AB_B_STOCK_AREA或TN_AB_STOCK_LOCATION表)中未查询到该货位信息!", lstStartTray[0].CN_S_LOCATION_CODE)); } //货位状态:正常 if (GetModel[0].CN_S_LOCATION_STATE != Constants.Location_State_Normal) { return OperateResult.Error(string.Format("当前托盘绑定的货位状态为{0},不允许从该位置取料!", GetModel[0].CN_S_LOCATION_STATE)); } //货位存储状态:非空 if (GetModel[0].CN_S_USE_STATE != Constants.Use_State_Full) { return OperateResult.Error(string.Format("当前货位存储状态为{0},不允许从该位置取料!", GetModel[0].CN_S_USE_STATE)); } DataTable dt = BLLCreator.Create().GetTrayItemDetail(trayCode); return OperateResult.Succeed(lstStartTray[0].CN_S_LOCATION_CODE, dt); } else { DataTable dt = BLLCreator.Create().GetTrayItemDetail(trayCode); return OperateResult.Succeed("", dt); } } #endregion #region(PDA接口)托盘货位绑定带码盘 /// /// 加生成任务接口模拟AMS接口调用出入库, /// /// /// /// public OperateResult LoadAndUnload(HH.WMS.Entitys.Basic.LocationTrayItmRelEntity entity, RedisUserEntity userEntity) { OperateResult result = new OperateResult(); List upHis = new List(); List downHis = new List(); if (entity.type == 1) { #region 绑定 #region 检验货位是否可用 List trayLocationList = new List(); List GetModel = BLLCreator.Create(this.userInfo).GetModel("where CN_S_LOCATION_CODE='" + entity.location + "'"); if (GetModel.Count == 0) { return OperateResult.Error("在表TN_WM_LOCATION_EXT中未查询到该货位!"); } //货位存储状态:非空 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)); } List lstEntity = CreateDAL().GetListByLocationCode(entity.location); if (lstEntity.Count > 0) { return OperateResult.Error(string.Format("当前货位已绑定托盘{0},不允许重复绑定!", lstEntity[0].CN_S_TRAY_CODE)); } AutoBomStockAreaEntity areaModel = new AutoBomStockAreaEntity(); areaModel = CreateDAL().GetAreaModelByLocation(entity.location); if (areaModel == null) { //非法的目的货位 return OperateResult.Error(string.Format("在mongo(TN_AB_B_STOCK_AREA或TN_AB_STOCK_LOCATION表)中未查询到该货位信息!", entity.location)); } #endregion #region 检验托盘是否可用 if (!string.IsNullOrEmpty(entity.trayCode)) { //检查该托盘是否在(未执行或执行中的)任务中 List lstInTask = CreateDAL().GetTaskByTray(entity.trayCode); if (lstInTask.Count > 0) { return OperateResult.Error(string.Format("当前托盘已在搬运任务{0}中,不允许绑定未执行或执行中的任务!", lstInTask[0].CN_S_TASK_NO)); } //检查该托盘是否绑定了其他货位 lstEntity = CreateDAL().GetListByTrayCode(entity.trayCode); if (lstEntity.Count > 0) { return OperateResult.Error(string.Format("当前托盘已绑定货位{0},不允许重复绑定!", lstEntity[0].CN_S_LOCATION_CODE)); } } else { var postData = "{\"appCode\":\"" + Constants.appCode + "\",\"ruleName\":\"" + Constants.VirtualTray + "\",\"orgId\":\"0\",\"orgFlag\":\"\"}"; entity.trayCode = WebApiManager.HttpAutoBom_Post("api/BillRule/GenBillNo", postData); if (string.IsNullOrEmpty(entity.trayCode)) { return OperateResult.Error("获取Autobom托盘号异常,请检查是否配置虚拟托盘生成规则"); } } #endregion #region 拼接处理数据 //拼接托盘物料关联主子表 List TrayItemMstlst = new List(); List TrayItemDtllst = new List(); var Group_List = entity.itemData.GroupBy(x => new { x.itemCode, x.itemState, x.owner }).Select(g => new TrayItemRow { CN_S_TRAY_CODE = entity.trayCode, CN_S_TRAY_GRID = "1", CN_S_ITEM_CODE = g.FirstOrDefault().itemCode.Trim(), CN_S_ITEM_STATE = g.FirstOrDefault().itemState.Trim(), CN_S_OWNER = g.FirstOrDefault().owner.Trim(), CN_F_QUANTITY = g.Sum(p => p.qty) }).ToList(); for (int i = 0; i < Group_List.Count; i++) { AutoBomItemEntity itemenity = CreateDAL().GetItemEntity(Group_List[i].CN_S_ITEM_CODE.ToString()); //拼接托盘物料关联主表实体 #region 拼接托盘物料关联主表实体 var mstGuid = Guid.NewGuid().ToString().ToUpper(); var trayItemMstEntity = new TN_WM_B_TRAY_ITEM_MSTEntity { CN_GUID = mstGuid, CN_S_TRAY_CODE = entity.trayCode, CN_S_TRAY_GRID = Group_List[i].CN_S_TRAY_GRID.ToString(), CN_S_OWNER = string.IsNullOrEmpty(Group_List[i].CN_S_OWNER.ToString()) ? Constants.DefaultOwner : Group_List[i].CN_S_OWNER.ToString(), CN_S_ITEM_CODE = Group_List[i].CN_S_ITEM_CODE.ToString(), CN_S_ITEM_NAME = itemenity.CN_S_ITEM_NAME, CN_S_FIGURE_NO = itemenity.CN_S_FIGURE_NO, CN_S_MODEL = itemenity.CN_S_MODEL, CN_S_ITEM_STATE = string.IsNullOrEmpty(Group_List[i].CN_S_ITEM_STATE.ToString()) ? Constants.ItemState_Qualified : Group_List[i].CN_S_ITEM_STATE.ToString(), CN_F_QUANTITY = Convert.ToDecimal(Group_List[i].CN_F_QUANTITY.ToString()), CN_S_MEASURE_UNIT = itemenity.CN_S_MEASURE_UNIT, CN_F_ALLOC_QTY = 0, CN_S_TIMESTAMP = (DateTime.Now - TimeZone.CurrentTimeZone.ToLocalTime(new DateTime(1970, 1, 1))).TotalMilliseconds.ToString(), CN_F_INQTY = Convert.ToDecimal(Group_List[i].CN_F_QUANTITY.ToString()), }; #endregion #region 拼接托盘物料关联子表实体 TrayItemMstlst.Add(trayItemMstEntity); var parentGuid = trayItemMstEntity.CN_GUID; var dtl_List = entity.itemData.Where(o => o.owner.Trim() == Group_List[i].CN_S_OWNER.Trim() && o.itemCode.Trim() == Group_List[i].CN_S_ITEM_CODE.Trim()).ToList(); for (int j = 0; j < dtl_List.Count; j++) { var dtlentity = new TN_WM_B_TRAY_ITEM_DTLEntity(); dtlentity.CN_GUID = Guid.NewGuid().ToString().ToUpper(); dtlentity.CN_PARENT_GUID = parentGuid; dtlentity.CN_S_UNIQUE_CODE = "";// entity.row[i].CN_S_UNIQUE_CODE.ToString(); dtlentity.CN_S_LOT_NO = dtl_List[j].lotNo.ToString(); dtlentity.CN_F_QUANTITY = Convert.ToDecimal(dtl_List[j].qty); dtlentity.CN_S_PRODUCTION_BATCH = dtl_List[j].batchNo.ToString(); dtlentity.CN_S_NOTE = ""; dtlentity.CN_S_EXT1 = ""; dtlentity.CN_S_EXT2 = ""; dtlentity.CN_S_EXT3 = ""; dtlentity.CN_S_EXT4 = ""; dtlentity.CN_S_EXT5 = ""; dtlentity.CN_S_CREATOR = userEntity.CN_S_LOGIN; dtlentity.CN_S_CREATOR_BY = userEntity.CN_S_NAME; dtlentity.CN_T_CREATE = DateTime.Now; dtlentity.CN_S_MODIFY = userEntity.CN_S_LOGIN; dtlentity.CN_S_MODIFY_BY = userEntity.CN_S_NAME; dtlentity.CN_T_MODIFY = DateTime.Now; TrayItemDtllst.Add(dtlentity); 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 = trayItemMstEntity.CN_S_FIGURE_NO, CN_S_ITEM_CODE = trayItemMstEntity.CN_S_ITEM_CODE, CN_F_QUANTITY = dtlentity.CN_F_QUANTITY, CN_S_ITEM_NAME = trayItemMstEntity.CN_S_ITEM_NAME, CN_S_ITEM_STATE = trayItemMstEntity.CN_S_ITEM_STATE, CN_S_LOCATION_CODE = entity.location, CN_S_LOT_NO = dtlentity.CN_S_LOT_NO, CN_S_MEASURE_UNIT = trayItemMstEntity.CN_S_MEASURE_UNIT, CN_S_MODEL = trayItemMstEntity.CN_S_MODEL, CN_S_MODIFY = userEntity.CN_S_NAME, CN_S_MODIFY_BY = userEntity.CN_S_NAME, CN_S_OWNER = trayItemMstEntity.CN_S_OWNER, CN_S_PACKING_UNIT = "", CN_S_PRODUCTION_BATCH = dtlentity.CN_S_PRODUCTION_BATCH, CN_S_STOCK_AREA = areaModel.CN_S_AREA_CODE, CN_S_STOCK_CODE = areaModel.CN_S_STOCK_CODE, CN_S_TRAY_CODE = entity.trayCode, CN_S_TRAY_GRID = "1", CN_T_CREATE = DateTime.Now, CN_T_MODIFY = DateTime.Now, CN_S_OP_FROM = "PDA绑定上架", CN_S_EXT1 = "" }); } #endregion } //获取原托盘中的数据 List lstOriginalMST = BLLCreator.Create>().GetList(new { CN_S_TRAY_CODE = entity.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 拼接下架记录表 TN_WM_DOWN_HISTORYEntity down = new TN_WM_DOWN_HISTORYEntity(); down.CN_GUID = Guid.NewGuid().ToString(); down.CN_S_CREATOR = userEntity.CN_S_LOGIN; down.CN_S_CREATOR_BY = userEntity.CN_S_NAME; down.CN_S_MODIFY = userEntity.CN_S_LOGIN; down.CN_S_MODIFY_BY = userEntity.CN_S_NAME; down.CN_F_PACKING_QTY = 0; down.CN_F_QUANTITY = dltEntity.CN_F_QUANTITY; down.CN_S_LOT_NO = dltEntity.CN_S_LOT_NO; down.CN_S_FIGURE_NO = mstEntity.CN_S_FIGURE_NO; down.CN_S_ITEM_CODE = mstEntity.CN_S_ITEM_CODE; down.CN_S_ITEM_NAME = mstEntity.CN_S_ITEM_NAME; down.CN_S_ITEM_STATE = mstEntity.CN_S_ITEM_STATE; down.CN_S_LOCATION_CODE = entity.location; down.CN_S_MEASURE_UNIT = mstEntity.CN_S_MEASURE_UNIT; down.CN_S_MODEL = mstEntity.CN_S_MODEL; down.CN_S_OWNER = mstEntity.CN_S_OWNER; down.CN_S_PACKING_UNIT = ""; down.CN_S_PRODUCTION_BATCH = dltEntity.CN_S_PRODUCTION_BATCH; down.CN_S_STOCK_AREA = areaModel.CN_S_AREA_CODE; down.CN_S_STOCK_CODE = areaModel.CN_S_STOCK_CODE; down.CN_S_TRAY_CODE = entity.trayCode; down.CN_S_TRAY_GRID = "1"; down.CN_T_CREATE = down.CN_T_MODIFY = DateTime.Now; down.CN_S_OP_FROM = "PDA解绑下架"; down.CN_S_EXT1 = ""; downHis.Add(down); #endregion } } #region 仓库量表 List 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(); List reduceStockQty = downHis.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_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_STOCK_QTYEntity() { 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_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_OWNER = y.Key.CN_S_OWNER, CN_S_PRODUCTION_BATCH = y.Key.CN_S_PRODUCTION_BATCH, CN_S_STOCK_CODE = y.Key.CN_S_STOCK_CODE }; }).ToList(); #endregion #region 库区量表 List 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(); List reduceAreaQty = downHis.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_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 //拼接托盘货位实体 TN_WM_B_TRAY_LOCATIONEntity trayLocation = new TN_WM_B_TRAY_LOCATIONEntity() { CN_GUID = System.Guid.NewGuid().ToString().ToUpper(), CN_S_TRAY_CODE = entity.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 = entity.location, CN_N_INDEX = 1, CN_S_CREATOR = userEntity.CN_S_LOGIN, CN_S_CREATOR_BY = userEntity.CN_S_NAME, CN_T_CREATE = DateTime.Now }; #endregion result = UseTransaction(trans => { #region 事务 //删除原托盘中绑定的物料 CreateDAL>().Delete(new { CN_S_TRAY_CODE = entity.trayCode }, trans); //删除子表 foreach (TN_WM_B_TRAY_ITEM_MSTEntity mEntity in lstOriginalMST) { CreateDAL>().Delete(new { CN_PARENT_GUID = mEntity.CN_GUID }, trans); } if (TrayItemMstlst.Any()) { //新增托盘物料关联主表 CreateDAL>().AddRange(TrayItemMstlst, trans); } if (TrayItemDtllst.Any()) { CreateDAL>().AddRange(TrayItemDtllst, trans); } //Log.Info("LoadAndUnload", "7"); CreateDAL>().Add(trayLocation, trans); //更新货位贮存状态及货位状态 result = 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 = entity.location, CN_S_LOCATION_STATE = Constants.Location_State_Normal }, trans); if (result.AffectedRows == 0) { throw new Exception("更新货位状态并发冲突,该货位状态可能已经发生变化"); } //上架记录 if (upHis.Any()) CreateDAL>().AddRange(upHis, trans); //下架记录 if (downHis.Any()) CreateDAL>().AddRange(downHis, trans); if (areaModel.CN_C_IS_INVENTORY != null) { if (areaModel.CN_C_IS_INVENTORY == "Y") { //更新仓库量表 if (addStockQty.Any()) CreateDAL().AddStockQty(addStockQty, trans); if (reduceStockQty.Any()) CreateDAL().ReduceStockQty(reduceStockQty, trans); //更新库区量表 if (addAreaQty.Any()) CreateDAL().AddAreaQty(addAreaQty, trans); if (reduceAreaQty.Any()) CreateDAL().ReduceAreaQty(reduceAreaQty, trans); } } #endregion }); #endregion } else if (entity.type == 2) { //根据托盘码删除 if (!string.IsNullOrEmpty(entity.trayCode)) { #region 根据托盘解除绑定 #region 判断托盘货位是否满足解绑条件 //判断托盘是否绑定货位 List lstEntity = CreateDAL().GetListByTrayCode(entity.trayCode); if (lstEntity.Count == 0) { return OperateResult.Error("当前托盘没有绑定货位,不需要绑定!"); } List GetModel = BLLCreator.Create(this.userInfo).GetModel("where CN_S_LOCATION_CODE='" + lstEntity[0].CN_S_LOCATION_CODE.ToString() + "'"); if (GetModel.Count == 0) { return OperateResult.Error(string.Format("在表TN_WM_LOCATION_EXT中未查询到该货位{0}!", lstEntity[0].CN_S_LOCATION_CODE.ToString())); } //货位存储状态:非空 if (GetModel[0].CN_S_USE_STATE != Constants.Use_State_Full) { return OperateResult.Error(string.Format("当前货位{0}存储状态为{1},不允许从该位置解绑!", lstEntity[0].CN_S_LOCATION_CODE.ToString(), GetModel[0].CN_S_USE_STATE)); } //货位状态:正常 if (GetModel[0].CN_S_LOCATION_STATE != Constants.Location_State_Normal) { return OperateResult.Error(string.Format("当前货位{0}状态为{1},不允许从该位置解绑!", lstEntity[0].CN_S_LOCATION_CODE.ToString(), GetModel[0].CN_S_LOCATION_STATE)); } AutoBomStockAreaEntity areaModel = new AutoBomStockAreaEntity(); areaModel = CreateDAL().GetAreaModelByLocation(lstEntity[0].CN_S_LOCATION_CODE.ToString()); if (areaModel == null) { //非法的目的货位 return OperateResult.Error(string.Format("在mongo(TN_AB_B_STOCK_AREA或TN_AB_STOCK_LOCATION表)中未查询到该货位信息!", lstEntity[0].CN_S_LOCATION_CODE.ToString())); } #endregion //获取原托盘中的数据 List lstOriginalMST = BLLCreator.Create>().GetList(new { CN_S_TRAY_CODE = entity.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 拼接下架记录表 TN_WM_DOWN_HISTORYEntity down = new TN_WM_DOWN_HISTORYEntity(); down.CN_GUID = Guid.NewGuid().ToString(); down.CN_S_CREATOR = userEntity.CN_S_LOGIN; down.CN_S_CREATOR_BY = userEntity.CN_S_NAME; down.CN_S_MODIFY = userEntity.CN_S_LOGIN; down.CN_S_MODIFY_BY = userEntity.CN_S_NAME; down.CN_F_PACKING_QTY = 0; down.CN_F_QUANTITY = dltEntity.CN_F_QUANTITY; down.CN_S_LOT_NO = dltEntity.CN_S_LOT_NO; down.CN_S_FIGURE_NO = mstEntity.CN_S_FIGURE_NO; down.CN_S_ITEM_CODE = mstEntity.CN_S_ITEM_CODE; down.CN_S_ITEM_NAME = mstEntity.CN_S_ITEM_NAME; down.CN_S_ITEM_STATE = mstEntity.CN_S_ITEM_STATE; down.CN_S_LOCATION_CODE = lstEntity[0].CN_S_LOCATION_CODE.ToString(); down.CN_S_MEASURE_UNIT = mstEntity.CN_S_MEASURE_UNIT; down.CN_S_MODEL = mstEntity.CN_S_MODEL; down.CN_S_OWNER = mstEntity.CN_S_OWNER; down.CN_S_PACKING_UNIT = ""; down.CN_S_PRODUCTION_BATCH = dltEntity.CN_S_PRODUCTION_BATCH; down.CN_S_STOCK_AREA = areaModel.CN_S_AREA_CODE; down.CN_S_STOCK_CODE = areaModel.CN_S_STOCK_CODE; down.CN_S_TRAY_CODE = entity.trayCode; down.CN_S_TRAY_GRID = "1"; down.CN_T_CREATE = down.CN_T_MODIFY = DateTime.Now; down.CN_S_OP_FROM = "PDA解绑下架"; down.CN_S_EXT1 = ""; downHis.Add(down); #endregion } } #region 仓库量表 List reduceStockQty = downHis.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_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_STOCK_QTYEntity() { 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_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_OWNER = y.Key.CN_S_OWNER, CN_S_PRODUCTION_BATCH = y.Key.CN_S_PRODUCTION_BATCH, CN_S_STOCK_CODE = y.Key.CN_S_STOCK_CODE }; }).ToList(); #endregion #region 库区量表 List reduceAreaQty = downHis.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_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 result = UseTransaction(trans => { string waitlocationCode = lstEntity[0].CN_S_LOCATION_CODE.ToString(); //根据托盘删除关联 CreateDAL>().Delete(new { CN_S_TRAY_CODE = entity.trayCode }, trans); //删除托盘物料关联 //删除原托盘中绑定的物料 CreateDAL>().Delete(new { CN_S_TRAY_CODE = entity.trayCode }, trans); //删除子表 foreach (TN_WM_B_TRAY_ITEM_MSTEntity mEntity in lstOriginalMST) { CreateDAL>().Delete(new { CN_PARENT_GUID = mEntity.CN_GUID }, trans); } //更新货位贮存状态 result = CreateDAL>().Update( new { CN_S_USE_STATE = Constants.Use_State_Empty, 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 = lstEntity[0].CN_S_LOCATION_CODE.ToString(), CN_S_LOCATION_STATE = Constants.Location_State_Normal }, trans); if (result.AffectedRows == 0) { throw new Exception("更新货位状态并发冲突,该货位状态可能已经发生变化"); } //下架记录 if (downHis.Any()) CreateDAL>().AddRange(downHis, trans); if (areaModel.CN_C_IS_INVENTORY != null) { if (areaModel.CN_C_IS_INVENTORY == "Y") { //更新仓库量表 if (reduceStockQty.Any()) CreateDAL().ReduceStockQty(reduceStockQty, trans); //更新库区量表 if (reduceAreaQty.Any()) CreateDAL().ReduceAreaQty(reduceAreaQty, trans); } } }); return result; #endregion } //根据货位码删除 if (!string.IsNullOrEmpty(entity.location)) { #region 根据货位解除绑定 #region 判断托盘与货位是否满足解绑条件 //判断货位是否绑定托盘 List lstEntity = CreateDAL().GetListByLocationCode(entity.location); if (lstEntity.Count == 0) { return OperateResult.Error("当前货位没有绑定托盘,不需要解绑!"); } List GetModel = BLLCreator.Create(this.userInfo).GetModel("where CN_S_LOCATION_CODE='" + entity.location + "'"); if (GetModel.Count == 0) { return OperateResult.Error(string.Format("在表TN_WM_LOCATION_EXT中未查询到该货位{0}!", entity.location)); } //货位存储状态:非空 if (GetModel[0].CN_S_USE_STATE != Constants.Use_State_Full) { return OperateResult.Error(string.Format("当前货位{0}存储状态为{1},不允许从该位置解绑!", entity.location, GetModel[0].CN_S_USE_STATE)); } //货位状态:正常 if (GetModel[0].CN_S_LOCATION_STATE != Constants.Location_State_Normal) { return OperateResult.Error(string.Format("当前货位{0}状态为{1},不允许从该位置解绑!", entity.location, GetModel[0].CN_S_LOCATION_STATE)); } AutoBomStockAreaEntity areaModel = new AutoBomStockAreaEntity(); areaModel = CreateDAL().GetAreaModelByLocation(entity.location); if (areaModel == null) { //非法的目的货位 return OperateResult.Error(string.Format("在mongo(TN_AB_B_STOCK_AREA或TN_AB_STOCK_LOCATION表)中未查询到该货位信息!", entity.location)); } #endregion //获取原托盘中的数据 List lstOriginalMST = BLLCreator.Create>().GetList(new { CN_S_TRAY_CODE = lstEntity[0].CN_S_TRAY_CODE }); 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 拼接下架记录表 TN_WM_DOWN_HISTORYEntity down = new TN_WM_DOWN_HISTORYEntity(); down.CN_GUID = Guid.NewGuid().ToString(); down.CN_S_CREATOR = userEntity.CN_S_LOGIN; down.CN_S_CREATOR_BY = userEntity.CN_S_NAME; down.CN_S_MODIFY = userEntity.CN_S_LOGIN; down.CN_S_MODIFY_BY = userEntity.CN_S_NAME; down.CN_F_PACKING_QTY = 0; down.CN_F_QUANTITY = dltEntity.CN_F_QUANTITY; down.CN_S_LOT_NO = dltEntity.CN_S_LOT_NO; down.CN_S_FIGURE_NO = mstEntity.CN_S_FIGURE_NO; down.CN_S_ITEM_CODE = mstEntity.CN_S_ITEM_CODE; down.CN_S_ITEM_NAME = mstEntity.CN_S_ITEM_NAME; down.CN_S_ITEM_STATE = mstEntity.CN_S_ITEM_STATE; down.CN_S_LOCATION_CODE = entity.location; down.CN_S_MEASURE_UNIT = mstEntity.CN_S_MEASURE_UNIT; down.CN_S_MODEL = mstEntity.CN_S_MODEL; down.CN_S_OWNER = mstEntity.CN_S_OWNER; down.CN_S_PACKING_UNIT = ""; down.CN_S_PRODUCTION_BATCH = dltEntity.CN_S_PRODUCTION_BATCH; down.CN_S_STOCK_AREA = areaModel.CN_S_AREA_CODE; down.CN_S_STOCK_CODE = areaModel.CN_S_STOCK_CODE; down.CN_S_TRAY_CODE = lstEntity[0].CN_S_TRAY_CODE; down.CN_S_TRAY_GRID = "1"; down.CN_T_CREATE = down.CN_T_MODIFY = DateTime.Now; down.CN_S_OP_FROM = "PDA解绑下架"; down.CN_S_EXT1 = ""; downHis.Add(down); #endregion } } #region 仓库量表 List reduceStockQty = downHis.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_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_STOCK_QTYEntity() { 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_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_OWNER = y.Key.CN_S_OWNER, CN_S_PRODUCTION_BATCH = y.Key.CN_S_PRODUCTION_BATCH, CN_S_STOCK_CODE = y.Key.CN_S_STOCK_CODE }; }).ToList(); #endregion #region 库区量表 List reduceAreaQty = downHis.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_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 result = UseTransaction(trans => { # region 执行事务 string waitlocationCode = entity.location; //根据货位删除关联 CreateDAL>().Delete(new { CN_S_LOCATION_CODE = entity.location }, trans); //删除托盘物料关联 //删除原托盘中绑定的物料 result = CreateDAL>().Delete(new { CN_S_TRAY_CODE = lstEntity[0].CN_S_TRAY_CODE }, trans); //删除子表 foreach (TN_WM_B_TRAY_ITEM_MSTEntity mEntity in lstOriginalMST) { CreateDAL>().Delete(new { CN_PARENT_GUID = mEntity.CN_GUID }, trans); } //更新货位贮存状态 result = CreateDAL>().Update( new { CN_S_USE_STATE = Constants.Use_State_Empty, 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 = entity.location, CN_S_LOCATION_STATE = Constants.Location_State_Normal }, trans); if (result.AffectedRows == 0) { throw new Exception("更新货位状态并发冲突,该货位状态可能已经发生变化"); } //下架记录 if (downHis.Any()) CreateDAL>().AddRange(downHis, trans); if (areaModel.CN_C_IS_INVENTORY != null) { if (areaModel.CN_C_IS_INVENTORY == "Y") { //更新仓库量表 if (reduceStockQty.Any()) CreateDAL().ReduceStockQty(reduceStockQty, trans); //更新库区量表 if (reduceAreaQty.Any()) CreateDAL().ReduceAreaQty(reduceAreaQty, trans); } } #endregion }); return result; #endregion } } return result; } #endregion #region PDA专用 生成任务 /// /// PDA专用 生成任务 /// /// /// /// /// /// /// /// public OperateResult CreateTransTask(string startPosition, string endPosition, string tranType, string taskPriority, string projectCode, string remark, RedisUserEntity userEntity) { OperateResult result = new OperateResult(); #region 货位逻辑判断检测 TN_WM_LOCATION_EXTEntity startlocation = BLLCreator.Create().GetExtModel(" where CN_S_LOCATION_CODE='" + startPosition + "'"); if (startlocation.CN_S_LOCATION_STATE != Constants.Location_State_Normal) { return OperateResult.Error(string.Format("当前起点位置状态为{0},不允许从该位置下达运输任务!", startlocation.CN_S_LOCATION_STATE)); } AutoBomStockAreaEntity startArea = CreateDAL().GetAreaModelByLocation(startPosition); if (startArea.CN_C_IS_CONTROL_QTY.Equals("Y")) { if (startlocation.CN_S_USE_STATE != Constants.Use_State_Full) { return OperateResult.Error(string.Format("起点库区管控数量并且货位存储状态为{0},不允许从该位置下达运输任务!", startlocation.CN_S_USE_STATE)); } } //判断货位是否绑定托盘 List lstStartTray = CreateDAL().GetListByLocationCode(startPosition); if (lstStartTray.Count == 0) { return OperateResult.Error("在该起点位置上未绑定托盘物料信息!"); } TN_WM_LOCATION_EXTEntity endlocation = BLLCreator.Create().GetExtModel(" where CN_S_LOCATION_CODE='" + endPosition + "'"); if (endlocation == null) { return OperateResult.Error("在表TN_WM_LOCATION_EXT未查询到该目的货位!"); } if (endlocation.CN_S_LOCATION_STATE != Constants.Location_State_Normal) { return OperateResult.Error(string.Format("当前起点位置状态为{0},不允许往该位置卸料!", endlocation.CN_S_LOCATION_STATE)); } AutoBomStockAreaEntity endArea = CreateDAL().GetAreaModelByLocation(endPosition); if (endArea == null) { //非法的目的货位 return OperateResult.Error(string.Format("在mongo(TN_AB_B_STOCK_AREA或TN_AB_STOCK_LOCATION表)中未查询到该目的货位{0}的库区信息!", startPosition)); } if (endArea.CN_C_IS_CONTROL_QTY.Equals("Y") && endlocation.CN_S_USE_STATE != Constants.Use_State_Empty) { return OperateResult.Error(string.Format("终点库区管控数量并且货位存储状态为{0},不允许往该位置卸料!", endlocation.CN_S_USE_STATE)); } #endregion //生成入库任务 TN_WM_TASKEntity taskEntity = new TN_WM_TASKEntity(); string postData = "{\"appCode\":\"" + Constants.appCode + "\",\"ruleName\":\"" + Constants.Rule_TransTaskNo + "\",\"orgId\":\"\",\"orgFlag\":\"0\"}"; string taskNo = WebApiManager.HttpAutoBom_Post("api/BillRule/GenBillNo", postData); if (string.IsNullOrEmpty(taskNo)) { return OperateResult.Error("任务号生成失败,请检查autobom中是否配置了转运任务号生成规则!"); } taskEntity.CN_S_TASK_NO = taskNo; taskEntity.CN_S_STATE = Constants.TaskStateList[Constants.TaskExecState_NoExec]; taskEntity.CN_T_CREATE = DateTime.Now; taskEntity.CN_S_TASK_TYPE = tranType; taskEntity.CN_S_TRAY_CODE = lstStartTray[0].CN_S_TRAY_CODE; taskEntity.CN_S_START_BIT = startPosition; taskEntity.CN_S_END_BIT = endPosition; taskEntity.CN_N_PRIORITY = int.Parse(taskPriority); taskEntity.CN_S_PROJECT_CODE = projectCode; taskEntity.CN_S_END_AREA = endArea.CN_S_AREA_CODE; taskEntity.CN_S_START_AREA = startArea.CN_S_AREA_CODE; taskEntity.CN_S_STOCK_CODE = startArea.CN_S_STOCK_CODE; taskEntity.CN_S_START_AREA_TYPE = startArea.CN_S_STRUCTURE; taskEntity.CN_S_END_AREA_TYPE = endArea.CN_S_STRUCTURE; taskEntity.CN_C_START_IS_CONTROL_QTY = startArea.CN_C_IS_CONTROL_QTY; taskEntity.CN_C_END_IS_CONTROL_QTY = endArea.CN_C_IS_CONTROL_QTY; taskEntity.CN_S_START_CONTROL_INV = startArea.CN_C_IS_INVENTORY; taskEntity.CN_S_END_CONTROL_INV = endArea.CN_C_IS_INVENTORY; taskEntity.CN_S_CREATOR = userEntity.CN_S_LOGIN; taskEntity.CN_S_CREATOR_BY = userEntity.CN_S_NAME; taskEntity.CN_T_CREATE = DateTime.Now; taskEntity.CN_S_MODIFY = userEntity.CN_S_LOGIN; taskEntity.CN_S_MODIFY_BY = userEntity.CN_S_NAME; taskEntity.CN_T_MODIFY = DateTime.Now; taskEntity.mesInfo = remark; string[] arr = remark.Split('&'); if (arr.Length > 0) { taskEntity.CN_S_EXT3 = arr[arr.Length-1].ToString(); } result = UseTransaction(trans => { #region 事务 //新增任务 CreateDAL>().Add(taskEntity, trans); //锁定目的位置货位-预入库锁定 if (endArea.CN_C_IS_CONTROL_QTY.Equals("Y")) { result = CreateDAL().UpdateLocationExtStateLock(taskEntity.CN_S_END_BIT, Constants.Location_State_InLock, Constants.Location_State_Normal, "", taskNo, trans); if (result.AffectedRows == 0) { throw new Exception("更新目的货位状态并发冲突,该货位状态可能已经发生变化"); } BLLCreator.Create().AddStateChange(endPosition, "正常", "预入库锁定", "PDA生成任务锁定终点货位", "PDA", userEntity.CN_S_LOGIN, taskNo, endArea.CN_S_STOCK_CODE, endArea.CN_S_AREA_CODE, trans); } if (startArea.CN_C_IS_CONTROL_QTY.Equals("Y")) { //锁定起始位置货位-预出库锁定 result = CreateDAL().UpdateLocationExtStateLock(taskEntity.CN_S_START_BIT, Constants.Location_State_OutLock, Constants.Location_State_Normal, "", taskNo, trans); if (result.AffectedRows == 0) { throw new Exception("更新起点货位状态并发冲突,该货位状态可能已经发生变化"); } BLLCreator.Create().AddStateChange(startPosition, "正常", "预出库锁定", "PDA生成任务锁定起点货位", "PDA", userEntity.CN_S_LOGIN, taskNo, startArea.CN_S_STOCK_CODE, startArea.CN_S_AREA_CODE, trans); } OperateResult re = new OtherSysApi().SendAmsCreateTaskLJ(taskEntity); if (!re.Success) { throw new Exception(re.Msg); } #endregion }); return result; } #endregion #region(PDA接口)简易版整托下架(自动) /// /// 整托执行上架 /// /// Json集合 /// 用户实体 /// /// [HANHE(XDL)] CREATED BY 2018-12-12 public OperateResult SimZTDownShelfAuto(TrayOnShelfEntity entity, RedisUserEntity userEntity) { string deviceNo = entity.CN_S_DEVICE_NO;//分拣台 string locationCode = entity.CN_S_LOCATION_CODE; string endAreaCode = entity.CN_S_END_AREA_CODE; string trayCode = entity.CN_S_TRAY_CODE; List lstStartTray = new List(); if (string.IsNullOrEmpty(locationCode)) { //调用算法计算起点货位 List lstArea = new List(); areaPriorClass areaClass = new areaPriorClass(); areaClass.areaCode = endAreaCode; areaClass.Prior = 1; lstArea.Add(areaClass); //调用出库算法,获取出库货位 OutAssignEnitty oAe = new OutAssignEnitty() { lstAreaPrior = lstArea, stockCode = entity.CN_S_STOCK_CODE, itemCode = entity.CN_S_ITEM_CODE, traySpec = entity.CN_S_TRAY_SPEC, lockLocation = false,//是否需要锁定货位 needCalLock = false }; OutAssignResultEntity oaEresult = BLLCreator.Create().OutAssign(oAe); if (!oaEresult.Success) { return OperateResult.Error(oaEresult.Msg);//货位获取失败! } else { locationCode = oaEresult.locationCode.ToString(); } } #region 货位逻辑判断检测 TN_WM_LOCATION_EXTEntity startlocation = BLLCreator.Create().GetExtModel(" where CN_S_LOCATION_CODE='" + locationCode + "'"); if (startlocation.CN_S_LOCATION_STATE != Constants.Location_State_Normal) { return OperateResult.Error(string.Format("当前起点位置状态为{0},不允许从该位置取料!", startlocation.CN_S_LOCATION_STATE)); } AutoBomStockAreaEntity startArea = CreateDAL().GetAreaModelByLocation(locationCode); if (startArea == null) { //非法的目的货位 return OperateResult.Error(string.Format("在mongo(TN_AB_B_STOCK_AREA或TN_AB_STOCK_LOCATION表)中未查询到该起点货位{0}的库区信息!", locationCode)); } if (startArea.CN_C_IS_CONTROL_QTY.Equals("Y")) { if (startlocation.CN_S_USE_STATE != Constants.Use_State_Full) { return OperateResult.Error(string.Format("起点库区管控数量并且货位存储状态为{0},不允许从该位置取料!", startlocation.CN_S_USE_STATE)); } //判断货位是否绑定托盘 根据项目需要也可不检查该策略 lstStartTray = CreateDAL().GetListByLocationCode(locationCode); if (lstStartTray.Count == 0) { return OperateResult.Error("在该起点位置上未绑定托盘物料信息!"); } } //检查该托盘是否在(未执行或执行中的)任务中 List lstInTask = CreateDAL().GetTaskByTray(lstStartTray[0].CN_S_TRAY_CODE); if (lstInTask.Count > 0) { return OperateResult.Error(string.Format("当前托盘已在搬运任务{0}中,不允许下架未执行或执行中的任务!", lstInTask[0].CN_S_TASK_NO)); } TN_WM_LOCATION_EXTEntity endlocation = BLLCreator.Create().GetExtModel(" where CN_S_LOCATION_CODE='" + deviceNo + "'"); if (endlocation == null) { return OperateResult.Error("在表TN_WM_LOCATION_EXT未查询到该目的货位!"); } if (endlocation.CN_S_LOCATION_STATE != Constants.Location_State_Normal) { return OperateResult.Error(string.Format("当前终点位置状态为{0},不允许往该位置卸料!", endlocation.CN_S_LOCATION_STATE)); } AutoBomStockAreaEntity endArea = CreateDAL().GetAreaModelByLocation(deviceNo); if (endArea == null) { //非法的目的货位 return OperateResult.Error(string.Format("在mongo(TN_AB_B_STOCK_AREA或TN_AB_STOCK_LOCATION表)中未查询到该目的货位{0}的库区信息!", deviceNo)); } if (endArea.CN_C_IS_CONTROL_QTY.Equals("Y") && endlocation.CN_S_USE_STATE != Constants.Use_State_Empty) { return OperateResult.Error(string.Format("终点库区管控数量并且货位存储状态为{0},不允许往该位置卸料!", endlocation.CN_S_USE_STATE)); } //判断货位是否绑定托盘 List lstEndTray = CreateDAL().GetListByLocationCode(deviceNo); if (lstEndTray.Count > 0) { return OperateResult.Error("该目的位置上已绑定其他托盘物料信息!"); } #endregion List TrayLocationlst = new List(); List Group_List = new List(); //生成入库任务 List taskEntityList = new List(); //生成入库任务 TN_WM_TASKEntity taskEntity = new TN_WM_TASKEntity(); string postData = "{\"appCode\":\"" + Constants.appCode + "\",\"ruleName\":\"" + Constants.Rule_OutTaskNo + "\",\"orgId\":\"\",\"orgFlag\":\"0\"}"; string taskNo = WebApiManager.HttpAutoBom_Post("api/BillRule/GenBillNo", postData); if (string.IsNullOrEmpty(taskNo)) { return OperateResult.Error("出库任务号生成失败,请检查在AUTOBOM中是否配置转运任务号生成规则!"); } taskEntity.CN_S_TASK_NO = taskNo; taskEntity.CN_S_TASK_TYPE = entity.CN_S_TASK_TYPE; taskEntity.CN_S_FROM_OP = "整托下架"; taskEntity.CN_S_STOCK_CODE = startArea.CN_S_STOCK_CODE; taskEntity.CN_S_START_AREA = startArea.CN_S_AREA_CODE; taskEntity.CN_S_START_BIT = locationCode; taskEntity.CN_S_END_AREA = endArea.CN_S_AREA_CODE; taskEntity.CN_S_END_BIT = deviceNo; taskEntity.CN_S_STATE = Constants.TaskState_NoExecuted; taskEntity.CN_S_TRAY_CODE = trayCode; taskEntity.CN_S_PROJECT_CODE = entity.projectCode; taskEntity.CN_S_START_AREA_TYPE = startArea.CN_S_STRUCTURE; taskEntity.CN_S_END_AREA_TYPE = endArea.CN_S_STRUCTURE; taskEntity.CN_C_START_IS_CONTROL_QTY = startArea.CN_C_IS_CONTROL_QTY; taskEntity.CN_C_END_IS_CONTROL_QTY = endArea.CN_C_IS_CONTROL_QTY; taskEntity.CN_S_START_CONTROL_INV = startArea.CN_C_IS_INVENTORY; taskEntity.CN_S_END_CONTROL_INV = endArea.CN_C_IS_INVENTORY; taskEntity.CN_S_CREATOR = userEntity.CN_S_LOGIN; taskEntity.CN_S_CREATOR_BY = userEntity.CN_S_NAME; taskEntity.CN_T_CREATE = DateTime.Now; taskEntity.CN_S_MODIFY = userEntity.CN_S_LOGIN; taskEntity.CN_S_MODIFY_BY = userEntity.CN_S_NAME; taskEntity.CN_T_MODIFY = DateTime.Now; taskEntityList.Add(taskEntity); OperateResult operateResult = UseTransaction(trans => { CreateDAL>().Add(taskEntity, trans); //锁定目的位置货位-预入库锁定 if (endArea.CN_C_IS_CONTROL_QTY.Equals("Y")) { operateResult = CreateDAL().UpdateLocationExtStateLock(taskEntity.CN_S_END_BIT, Constants.Location_State_InLock, Constants.Location_State_Normal, "", taskNo, trans); if (operateResult.AffectedRows == 0) { throw new Exception("更新目的货位状态并发冲突,该货位状态可能已经发生变化"); } BLLCreator.Create().AddStateChange(taskEntity.CN_S_START_BIT, "正常", "预入库锁定", "PDA生成任务锁定终点货位", "PDA", userEntity.CN_S_LOGIN, taskNo, endArea.CN_S_STOCK_CODE, endArea.CN_S_AREA_CODE, trans); } if (startArea.CN_C_IS_CONTROL_QTY.Equals("Y")) { //锁定起始位置货位-预出库锁定 operateResult = CreateDAL().UpdateLocationExtStateLock(taskEntity.CN_S_START_BIT, Constants.Location_State_OutLock, Constants.Location_State_Normal, "", taskNo, trans); if (operateResult.AffectedRows == 0) { throw new Exception("更新起点货位状态并发冲突,该货位状态可能已经发生变化"); } BLLCreator.Create().AddStateChange(taskEntity.CN_S_START_BIT, "正常", "预出库锁定", "PDA生成任务锁定起点货位", "PDA", userEntity.CN_S_LOGIN, taskNo, startArea.CN_S_STOCK_CODE, startArea.CN_S_AREA_CODE, trans); } OperateResult re = new OtherSysApi().SendAmsCreateTask(taskEntity); if (!re.Success) { throw new Exception(re.Msg); } }); return operateResult; } #endregion #region 验证料箱码是否属于当前托盘 public bool CheckUniqueIsCurTray(string tryaCode, string uniqueCode) { return CreateDAL().CheckUniqueIsCurTray(tryaCode, uniqueCode); } #endregion #region 上料确认(整托、部分) public OperateResult UpMaterialSure(string trayCode, string type, string uniqueCodes, LogPara logPara) { try { var trayItemMstList = BLLCreator.Create>().GetList(new { CN_S_TRAY_CODE = trayCode }); var trayItemDtlList = type == "all" ? BLLCreator.Create().GetTrayItemDtlByTrayCode(trayCode) : DALCreator.Create().GetDtlByUniques(uniqueCodes); var trayLocaiton = BLLCreator.Create>().GetSingleEntity(new { CN_S_TRAY_CODE = trayCode }); var transResult = UseTransaction(trans => { //删除托盘货位关联 var result = DALCreator.Create>().Delete(new { CN_S_TRAY_CODE = trayCode }, trans); Log.Detail(logPara, "删除托盘货位关联结果:" + (result.Success ? "成功!" : ("失败" + result.Msg))); if (!result.Success) return; //删除料箱托盘关联 if (type.Equals("all")) { //删除托盘产品关联主表、子表 result = BLLCreator.Create().Delete(" CN_S_TRAY_CODE='" + trayCode + "' ", trans, logPara); if (!result.Success) return; //修改托盘状态为空 CreateDAL>().Update(new { CN_S_USE_STATE = "空" }, new { CN_S_TRAY_CODE = trayCode }, trans); Log.Detail(logPara, "修改托盘状态为空!"); } else if (type.Equals("part")) { var useState = "空"; foreach (var trayItemMst in trayItemMstList) { var curTrayItemDtls = trayItemDtlList.Where(e => e.CN_PARENT_GUID.Equals(trayItemMst.CN_GUID)); if (curTrayItemDtls.Count() > 0) { trayItemMst.CN_F_QUANTITY -= curTrayItemDtls.Count(); if (trayItemMst.CN_F_QUANTITY > 0) { useState = "不满"; result = DALCreator.Create>().Update(new { trayItemMst.CN_F_QUANTITY }, new { CN_GUID = trayItemMst.CN_GUID }, trans); } else { result = DALCreator.Create>().Delete(new { CN_GUID = trayItemMst.CN_GUID }, trans); } Log.Detail(logPara, "主表" + trayItemMst.CN_GUID + "降量结果:" + (result.Success ? "成功!" : ("失败" + result.Msg))); } } foreach (var trayItemDtl in trayItemDtlList) { //删除托盘物料关联子表 result = DALCreator.Create>().Delete(new { CN_GUID = trayItemDtl.CN_GUID }, trans); Log.Detail(logPara, "删除托盘物料关联子表结果:" + (result.Success ? "成功!" : ("失败" + result.Msg))); if (!result.Success) return; } //修改托盘状态为空 CreateDAL>().Update(new { CN_S_USE_STATE = useState }, new { CN_S_TRAY_CODE = trayCode }, trans); } //修改货位扩展表 result = BLLCreator.Create().UpdateLocationExtState(trayLocaiton.CN_S_LOCATION_CODE, "", "空", "", trans); Log.Detail(logPara, "货位扩展表的状态置为空结果:" + JsonConvert.SerializeObject(result)); }); //if (transResult.Success) //{ // foreach (var trayItemDtl in trayItemDtlList) // { // //更新BARCODE表使用状态 // var resultCur = BLLCreator.Create().UpdateUpMetarialState(trayItemDtl.CN_S_UNIQUE_CODE, "N"); // Log.Detail(logPara, "唯一码:" + trayItemDtl.CN_S_UNIQUE_CODE + ",更新BARCODE表使用状态结果:" + (resultCur ? "成功!" : "失败")); // } //} return transResult; } catch (Exception ex) { Log.Detail(logPara, "上料失败!" + ex.Message); return new OperateResult { Success = false, Msg = ex.Message }; } } #endregion #region 检查托盘(上料) public OperateResult CheckTrayByUpMaterial(string trayCode) { try { bool result = DALCreator.Create().CheckTrayBindLoc(trayCode); if (!result) { return OperateResult.Error("托盘未绑定货位!"); } result = DALCreator.Create().CheckCurTrayIsHasItem(trayCode); if (!result) { return OperateResult.Error("当前是空托盘!"); } return OperateResult.Succeed(); } catch (Exception ex) { return OperateResult.Error(ex.Message); } } #endregion #region 检查叫料货位是否可用 public OperateResult CheckLocationJL(string locationCode) { if (string.IsNullOrEmpty(locationCode)) { return OperateResult.Error("参数不全!"); } 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)); } //检查该托盘是否绑定了其他货位 List lstEntity = CreateDAL().GetListByLocationCode(locationCode); if (lstEntity.Count > 0) { return OperateResult.Error(string.Format("当前货位已绑定托盘{0},不允许重复绑定!", lstEntity[0].CN_S_TRAY_CODE)); } return OperateResult.Succeed(""); } #endregion #region 增加库区分配量 public void AddAllocQty(string trayCode, string stockCode, string areaCode, LogPara logPara) { Log.Detail(logPara, "升起始库区分配量"); var trayItemMsts = CreateDAL>().GetList(new { CN_S_TRAY_CODE = trayCode }); if (trayItemMsts != null) { if (trayItemMsts.Count > 0) { foreach (var trayItemMst in trayItemMsts) { trayItemMst.CN_F_QUANTITY = 0; trayItemMst.TrayItemDtlList = CreateDAL>().GetList(new { CN_PARENT_GUID = trayItemMst.CN_GUID }); foreach (var trayItemDtl in trayItemMst.TrayItemDtlList) { trayItemMst.CN_F_QUANTITY += Convert.ToDecimal(trayItemDtl.CN_S_SERIAL_NO); } Log.Detail(logPara, "库区:" + areaCode + "," + LogDescribe.Content(trayItemMst)); var curReuslt = CreateDAL().AddAllocQty(new TN_WM_B_AREA_QTYEntity { CN_F_QUANTITY = trayItemMst.CN_F_QUANTITY, CN_S_ITEM_CODE = trayItemMst.CN_S_ITEM_CODE, CN_S_ITEM_STATE = trayItemMst.CN_S_ITEM_STATE, CN_S_STOCK_AREA = areaCode, CN_S_LOT_NO = trayItemMst.CN_S_LOT_NO, CN_S_PRODUCTION_BATCH = trayItemMst.CN_S_PRODUCTION_BATCH }, null, logPara); Log.Detail(logPara, LogDescribe.Content(trayItemMst) + " 库区量表执行结果:" + LogDescribe.Content(curReuslt)); curReuslt = CreateDAL().AddAllocQty(new TN_WM_B_STOCK_QTYEntity { CN_F_QUANTITY = trayItemMst.CN_F_QUANTITY, CN_S_ITEM_CODE = trayItemMst.CN_S_ITEM_CODE, CN_S_ITEM_STATE = trayItemMst.CN_S_ITEM_STATE, CN_S_STOCK_CODE = stockCode, CN_S_LOT_NO = trayItemMst.CN_S_LOT_NO, CN_S_PRODUCTION_BATCH = trayItemMst.CN_S_PRODUCTION_BATCH }, null, logPara); Log.Detail(logPara, LogDescribe.Content(trayItemMst) + " 仓库量表执行结果:" + LogDescribe.Content(curReuslt)); } } } } #endregion #region 空托回库检测托盘码 /// /// 针对简易版WMS人工库,绑定货位等同入库,增加仓库、库区库存,不能应用在复杂的WMS(有到货区、出库单、自动化库)场景中 /// /// 托盘编码 /// 货位编码 /// 用户实体 /// /// [HANHE(XDL)] CREATED BY 2019-04-17 public OperateResult CheckTrayCodeKT(string trayCode) { if (string.IsNullOrEmpty(trayCode)) { return OperateResult.Error("请传入托盘号参数!"); } //判断货位是否绑定托盘 List lstStartTray = CreateDAL().GetListByTrayCode(trayCode); //检查该托盘是否在(未执行或执行中的)任务中 List lstInTask = CreateDAL().GetTaskByTray(trayCode); if (lstInTask.Count > 0) { return OperateResult.Error(string.Format("当前托盘已在搬运任务{0}中,不允许重复入库!", lstInTask[0].CN_S_TASK_NO)); } if (lstStartTray.Count > 0) { List GetModel = BLLCreator.Create(this.userInfo).GetModel("where CN_S_LOCATION_CODE='" + lstStartTray[0].CN_S_LOCATION_CODE + "'"); if (GetModel.Count == 0) { return OperateResult.Error("在表TN_WM_LOCATION_EXT中未查询到该托盘绑定的货位!"); } AutoBomStockAreaEntity areaModel = new AutoBomStockAreaEntity(); areaModel = CreateDAL().GetAreaModelByLocation(lstStartTray[0].CN_S_LOCATION_CODE); if (areaModel == null) { //非法的目的货位 return OperateResult.Error(string.Format("在mongo(TN_AB_B_STOCK_AREA或TN_AB_STOCK_LOCATION表)中未查询到该托盘绑定的货位信息!", lstStartTray[0].CN_S_LOCATION_CODE)); } //货位状态:正常 if (GetModel[0].CN_S_LOCATION_STATE != Constants.Location_State_Normal) { return OperateResult.Error(string.Format("当前托盘绑定的货位状态为{0},不允许空托回库!", GetModel[0].CN_S_LOCATION_STATE)); } //检测该托盘码上是否有物料 List ITEMMSTLIST = CreateDAL>().GetList(new { CN_S_TRAY_CODE = trayCode }); if (ITEMMSTLIST.Any()) { return OperateResult.Error(string.Format("当前托盘存在物料:{0},不允许空托回库!", ITEMMSTLIST[0].CN_S_ITEM_NAME)); } ////货位存储状态:非空 //if (GetModel[0].CN_S_USE_STATE != Constants.Use_State_Full) //{ // return OperateResult.Error(string.Format("当前货位存储状态为{0},不允许从该位置取料!", GetModel[0].CN_S_USE_STATE)); //} return OperateResult.Succeed("", lstStartTray[0].CN_S_LOCATION_CODE); } else { return OperateResult.Succeed("", ""); } } #endregion #region 空托回库检测货位码 /// /// 空托回库检测货位码和托盘码 /// /// /// public OperateResult CheckLocationCodeKT(string locationCode) { if (string.IsNullOrEmpty(locationCode)) { return OperateResult.Error("请传入货位号参数!"); } string strTrayCode = ""; 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 (GetModel[0].CN_S_LOCATION_STATE != Constants.Location_State_Normal) { return OperateResult.Error(string.Format("当前货位状态为{0},不允许从空托回库!", GetModel[0].CN_S_LOCATION_STATE)); } //判断货位是否绑定托盘 List lstStartTray = CreateDAL().GetListByLocationCode(locationCode); if (lstStartTray.Count > 0) { strTrayCode = lstStartTray[0].CN_S_TRAY_CODE; //检查该托盘是否在(未执行或执行中的)任务中 List lstInTask = CreateDAL().GetTaskByTray(lstStartTray[0].CN_S_TRAY_CODE); if (lstInTask.Count > 0) { return OperateResult.Error(string.Format("当前托盘已在搬运任务{0}中,不允许重复入库!", lstInTask[0].CN_S_TASK_NO)); } //检测该托盘码上是否有物料 List ITEMMSTLIST = CreateDAL>().GetList(new { CN_S_TRAY_CODE = lstStartTray[0].CN_S_TRAY_CODE }); if (ITEMMSTLIST.Any()) { return OperateResult.Error(string.Format("当前托盘存在物料:{0},不允许空托回库!", ITEMMSTLIST[0].CN_S_ITEM_NAME)); } } return OperateResult.Succeed("", strTrayCode); } #endregion } }