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.ERP; 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.ERP; 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 NtApiBLL : DapperBaseBLL { #region 根据卸货区获取车牌号磅单号 /// /// 根据卸货区获取车牌号磅单号 /// /// /// public OperateResult GetPoundInfoByArea(string areaCode) { DataTable dt = DALCreator.Create().GetPoundInfoByArea(areaCode); if (dt.Rows.Count == 0) { return OperateResult.Error("当前卸货区不存在待卸货车辆"); } else if (dt.Rows.Count == 1) { //根据库区获取所有的卸货货位托盘信息 List lstEntity = DALCreator.Create().GetEncodeTrayByArea(areaCode); PoundTrayEntity poundTray = new PoundTrayEntity(); poundTray.CN_S_POUND_NO = dt.Rows[0]["CN_S_POUND_NO"].ToString(); poundTray.CN_S_CAR_NO = dt.Rows[0]["CN_S_CAR_NO"].ToString(); poundTray.CN_S_ITEM_TYPE = dt.Rows[0]["CN_S_ITEM_TYPE"].ToString(); poundTray.lstTrayEncode = lstEntity; return OperateResult.Succeed("", poundTray); } else { return OperateResult.Error("异常数据:当前卸货区存在两辆待卸货车辆"); } } #endregion #region 批量下达卸货区到称重点的任务 /// /// 批量下达卸货区到称重点的任务 /// /// /// public OperateResult CallAGVCarry(List lstNeedCarray, RedisUserEntity userEntity) { StringBuilder sbError = new StringBuilder(); OperateResult result = new OperateResult(); foreach (TrayOnShelfEntity entity in lstNeedCarray) { result = ZTShelfAutoCZ(entity, userEntity); if (!result.Success) { sbError.Append("货位" + entity.CN_S_DEVICE_NO + "绑定的笼箱下达呼叫任务失败,详细原因为:" + result.Msg + ";"); } } if (sbError.Length > 0) { sbError.Length = sbError.Length - 1; return OperateResult.Error(sbError.ToString()); } else { return OperateResult.Succeed(""); } } #endregion #region (PDA接口) 下达搬运任务 /// /// 下达搬运任务 称重 /// /// Json集合 /// 用户实体 /// /// [HANHE(XDL)] CREATED BY 2018-12-12 public OperateResult ZTShelfAutoCZ(TrayOnShelfEntity entity, RedisUserEntity userEntity) { string deviceNo = entity.CN_S_DEVICE_NO;//起点 string locationCode = entity.CN_S_LOCATION_CODE; //终点 string trayCode = entity.CN_S_TRAY_CODE; #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)); } #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_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_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 = new OtherSysApi().SendAmsCreateTask(taskEntity); if (!re.Success) { throw new Exception("SendAmsCreateTask异常:" + re.Msg); } 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_END_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); } }); return operateResult; } #endregion #region 笼箱与货位解绑 /// /// /// /// 托盘编码 /// 货位编码 /// 用户实体 /// /// [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(); //根据托盘码删除 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 //获取原托盘中的数据 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 ? "" : mstEntity.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_TRAY_CODE = trayCode; down.CN_S_TRAY_GRID = "1"; down.CN_S_EXT1 = dltEntity.CN_S_UNIQUE_CODE; down.CN_T_CREATE = down.CN_T_MODIFY = DateTime.Now; down.CN_S_OP_FROM = "PDA解绑下架"; 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 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 //获取原托盘中的数据 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 = Decimal.Parse(dltEntity.CN_S_SERIAL_NO); down.CN_S_LOT_NO = dltEntity.CN_S_LOT_NO == null ? "" : mstEntity.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 = 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 == 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_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 仓库量表 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 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 (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 operateResult; } #endregion #region (PDA接口)托盘货位绑定 /// /// 针对简易版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, CN_S_LOCATION_CODE = locationCode, CN_S_LOT_NO = 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, CN_S_PACKING_UNIT = "", CN_S_PRODUCTION_BATCH = 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 检查托盘是否可用并返回托盘中物料信息 public OperateResult CheckMpTray(string trayCode, string itemClass) { if (string.IsNullOrEmpty(trayCode)) { return OperateResult.Error("请传入托盘号参数!"); } //判断托盘是否在容器管理表中维护 // List lstInTask = CreateDAL().GetTaskByTray(trayCode); TN_WM_B_TRAY_INFOEntity trayModel = CreateDAL().GetModel(trayCode); if (trayModel == null) { return OperateResult.Error(string.Format("请在容器管理表(tn_wm_tray_info)表中维护托盘号{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)); } List lstTrayItem = CreateDAL().GetTrayDetail(trayCode); //CN_S_MAJOR_TYPE 根据大类获取该类型下的所有物料 List lstItemClass = new List(itemClass.Split(new string[] { ";" }, StringSplitOptions.RemoveEmptyEntries)); List lstItem = DALCreator.Create().GetItemByItemClass(lstItemClass); if (lstTrayItem.Count > 0) { lstTrayItem[0].CN_S_USE_STATE = trayModel.CN_S_USE_STATE; foreach (AutoBomItemEntity entity in lstItem) { if (entity.CN_S_ITEM_CODE != lstTrayItem[0].CN_S_ITEM_CODE.ToString()) { TrayEncodeInfo info = new TrayEncodeInfo(); info.CN_S_USE_STATE = trayModel.CN_S_USE_STATE; info.CN_S_ITEM_CODE = entity.CN_S_ITEM_CODE; info.CN_S_ITEM_NAME = entity.CN_S_ITEM_NAME; info.CN_F_QUANTITY = 0; info.CN_S_MEASURE_UNIT = entity.CN_S_MEASURE_UNIT; lstTrayItem.Add(info); } } } else { foreach (AutoBomItemEntity entity in lstItem) { TrayEncodeInfo info = new TrayEncodeInfo(); info.CN_S_USE_STATE = trayModel.CN_S_USE_STATE; info.CN_S_ITEM_CODE = entity.CN_S_ITEM_CODE; info.CN_S_ITEM_NAME = entity.CN_S_ITEM_NAME; info.CN_F_QUANTITY = 0; info.CN_S_MEASURE_UNIT = entity.CN_S_MEASURE_UNIT; lstTrayItem.Add(info); } } return OperateResult.Succeed(lstStartTray[0].CN_S_LOCATION_CODE, lstTrayItem); } else { List lstTrayItem = CreateDAL().GetTrayDetail(trayCode); //CN_S_MAJOR_TYPE 根据大类获取该类型下的所有物料 List lstItemClass = new List(itemClass.Split(new string[] { ";" }, StringSplitOptions.RemoveEmptyEntries)); List lstItem = DALCreator.Create().GetItemByItemClass(lstItemClass); if (lstTrayItem.Count > 0) { lstTrayItem[0].CN_S_USE_STATE = trayModel.CN_S_USE_STATE; foreach (AutoBomItemEntity entity in lstItem) { if (entity.CN_S_ITEM_CODE != lstTrayItem[0].CN_S_ITEM_CODE.ToString()) { TrayEncodeInfo info = new TrayEncodeInfo(); info.CN_S_USE_STATE = trayModel.CN_S_USE_STATE; info.CN_S_ITEM_CODE = entity.CN_S_ITEM_CODE; info.CN_S_ITEM_NAME = entity.CN_S_ITEM_NAME; info.CN_F_QUANTITY = 0; info.CN_S_MEASURE_UNIT = entity.CN_S_MEASURE_UNIT; lstTrayItem.Add(info); } } } else { foreach (AutoBomItemEntity entity in lstItem) { TrayEncodeInfo info = new TrayEncodeInfo(); info.CN_S_USE_STATE = trayModel.CN_S_USE_STATE; info.CN_S_ITEM_CODE = entity.CN_S_ITEM_CODE; info.CN_S_ITEM_NAME = entity.CN_S_ITEM_NAME; info.CN_F_QUANTITY = 0; info.CN_S_MEASURE_UNIT = entity.CN_S_MEASURE_UNIT; lstTrayItem.Add(info); } } return OperateResult.Succeed("", lstTrayItem); } } #endregion #region 检查托盘是否可用并返回托盘中物料信息 public OperateResult CheckMpLocation(string locationCode, string itemClass) { 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)); } List lstTrayItem = CreateDAL().GetTrayDetail(strTrayCode); //CN_S_MAJOR_TYPE 根据大类获取该类型下的所有物料 List lstItemClass = new List(itemClass.Split(new string[] { ";" }, StringSplitOptions.RemoveEmptyEntries)); List lstItem = DALCreator.Create().GetItemByItemClass(lstItemClass); if (lstTrayItem.Count > 0) { foreach (AutoBomItemEntity entity in lstItem) { if (entity.CN_S_ITEM_CODE != lstTrayItem[0].CN_S_ITEM_CODE.ToString()) { TrayEncodeInfo info = new TrayEncodeInfo(); info.CN_S_ITEM_CODE = entity.CN_S_ITEM_CODE; info.CN_S_ITEM_NAME = entity.CN_S_ITEM_NAME; info.CN_F_QUANTITY = 0; info.CN_S_MEASURE_UNIT = entity.CN_S_MEASURE_UNIT; lstTrayItem.Add(info); } } } else { foreach (AutoBomItemEntity entity in lstItem) { TrayEncodeInfo info = new TrayEncodeInfo(); info.CN_S_ITEM_CODE = entity.CN_S_ITEM_CODE; info.CN_S_ITEM_NAME = entity.CN_S_ITEM_NAME; info.CN_F_QUANTITY = 0; info.CN_S_MEASURE_UNIT = entity.CN_S_MEASURE_UNIT; lstTrayItem.Add(info); } } return OperateResult.Succeed(strTrayCode, lstTrayItem); } #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_LOT_NO = Group_List[i].CN_S_LOT_NO.ToString(), CN_S_ITEM_NAME = itemenity.CN_S_ITEM_NAME, CN_S_FIGURE_NO = entity.CN_S_POUND_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); } //更新托盘贮存状态 if (!string.IsNullOrEmpty(entity.CN_S_USE_STATE)) { CreateDAL>().Update(new { CN_S_USE_STATE = entity.CN_S_USE_STATE }, new { CN_S_TRAY_CODE = entity.CN_S_TRAY_CODE }, trans); } }); } catch (Exception ex) { return OperateResult.Error(ex.Message.ToString()); } //成功后,赋值托盘编码 if (operateResult.Success) { operateResult.Data = trayNo; } return operateResult; } #endregion #region 根据卸货区判断库区中是否有执行中的任务 /// /// 根据卸货区获取车牌号磅单号 /// /// /// public OperateResult CheckTaskInArea(string areaCode) { List lstInTask = CreateDAL().GetTaskByAreaCode(areaCode); if (lstInTask.Count > 0) { return OperateResult.Error("当前卸货区存在未执行或执行中的任务"); } else { return OperateResult.Succeed(""); } } #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)); } List lstEntity = DALCreator.Create().GetGoodByTrayCode(strTrayCode); return OperateResult.Succeed(strTrayCode, lstEntity); } /// /// 针对简易版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)); } List lstEntity = DALCreator.Create().GetGoodByTrayCode(trayCode); return OperateResult.Succeed(lstStartTray[0].CN_S_LOCATION_CODE, lstEntity); } else { List lstEntity = DALCreator.Create().GetGoodByTrayCode(trayCode); return OperateResult.Succeed("", lstEntity); } } #endregion #region (PDA接口)简易版整托上架(自动) /// /// 整托执行上架 /// /// 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 = entity.CN_S_END_AREA_CODE, Prior = 1 }); InAssignEntity iAe = new InAssignEntity() { lstAreaPrior = lstTmpArea, logicAreaCode = "", objectCode = trayCode, projectCode = "ntsd", 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 = new OtherSysApi().SendAmsCreateTask(taskEntity); if (!re.Success) { throw new Exception("SendAmsCreateTask异常:" + re.Msg); } 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); } }); return operateResult; } #endregion #region (PDA接口)叫料检查货位 /// /// 针对简易版WMS人工库,绑定货位等同入库,增加仓库、库区库存,不能应用在复杂的WMS(有到货区、出库单、自动化库)场景中 /// /// 托盘编码 /// 货位编码 /// 用户实体 /// /// [HANHE(XDL)] CREATED BY 2019-04-17 public OperateResult CheckLocation(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)); } //检查该货位外层是否有阻挡 if (!string.IsNullOrEmpty(GetModel[0].CN_S_FLOOR)) { var curFloor = Convert.ToInt32(GetModel[0].CN_S_FLOOR); var locations = BLLCreator.Create>().GetList(new { CN_S_COL = GetModel[0].CN_S_COL, CN_S_ROW = GetModel[0].CN_S_ROW }).Where(w => Convert.ToInt32(w.CN_S_FLOOR) > curFloor).OrderByDescending(e => e.CN_S_FLOOR); if (locations.Count() > 0) { foreach (var location in locations) { if (location.CN_S_USE_STATE.Equals("满") || !location.CN_S_LOCATION_STATE.Equals("正常")) { return OperateResult.Error(string.Format("当前货位的外层货位{0}状态为{1},存储状态为{2},导致当前货位不可用!", location.CN_S_LOCATION_CODE, location.CN_S_LOCATION_STATE, location.CN_S_USE_STATE)); } } } } return OperateResult.Succeed(""); } public OperateResult SimZTDownShelfCallMaterialYS(TrayOnShelfEntity entity, RedisUserEntity userEntity) { string endLocationCode = entity.CN_S_DEVICE_NO;//分拣台 string startLocationCode = entity.CN_S_LOCATION_CODE; string endAreaCode = entity.CN_S_END_AREA_CODE; string trayCode = entity.CN_S_TRAY_CODE; List lstStartTray = new List(); #region 货位逻辑判断检测 TN_WM_LOCATION_EXTEntity startlocation = BLLCreator.Create().GetExtModel(" where CN_S_LOCATION_CODE='" + startLocationCode + "'"); if (startlocation.CN_S_LOCATION_STATE == Constants.Location_State_Normal) { //锁定起点货位 BLLCreator.Create>().Update(new { CN_S_LOCATION_STATE = "预出库锁定" }, new { CN_S_LOCATION_CODE = startLocationCode }); } AutoBomStockAreaEntity startArea = CreateDAL().GetAreaModelByLocation(startLocationCode); if (startArea == null) { //非法的目的货位 return OperateResult.Error(string.Format("在mongo(TN_AB_B_STOCK_AREA或TN_AB_STOCK_LOCATION表)中未查询到该起点货位{0}的库区信息!", startLocationCode)); } 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(startLocationCode); 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='" + endLocationCode + "'"); 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},不允许往该位置卸料!", startlocation.CN_S_LOCATION_STATE)); } AutoBomStockAreaEntity endArea = CreateDAL().GetAreaModelByLocation(endLocationCode); if (endArea == null) { //非法的目的货位 return OperateResult.Error(string.Format("在mongo(TN_AB_B_STOCK_AREA或TN_AB_STOCK_LOCATION表)中未查询到该目的货位{0}的库区信息!", endLocationCode)); } 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(endLocationCode); 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 = entity.CN_S_TASK_TYPE; 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 = startLocationCode; taskEntity.CN_S_END_AREA = endArea.CN_S_AREA_CODE; taskEntity.CN_S_END_BIT = endLocationCode; 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 = new OtherSysApi().SendAmsCreateTask(taskEntity); if (!re.Success) { throw new Exception(re.Msg); } 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, "", "", 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); } }); return operateResult; } #endregion #region 并筐相关接口 /// /// 获取并筐区货位物料托盘信息 /// /// /// public OperateResult GetMergeTrayInfo(string locationCode) { if (string.IsNullOrEmpty(locationCode)) { return OperateResult.Error("请传入货位号参数!"); } //寻找该货位所在的并笼区的其他货位 AutoBomLocationEntity locationModel = CreateDAL().GetModel(locationCode); if (locationModel == null) { return OperateResult.Error("在TN_AB_STOCK_LOCATION表中找不到该货位!"); } List lstLocation = CreateDAL().GetAreaLocations(locationModel.CN_S_AREA_CODE); if (lstLocation.Count != 2) { return OperateResult.Error("并笼区的货位数量不等于2!"); } lstLocation.RemoveAll(o => o.CN_S_LOCATION_CODE == locationCode); List lstTrayE = new List(); #region 查询主笼数据 List lstEntity = CreateDAL().GetListByLocationCode(locationCode); if (lstEntity.Count > 0) { List lstOriginalMST = BLLCreator.Create>().GetList(new { CN_S_TRAY_CODE = lstEntity[0].CN_S_TRAY_CODE }); TrayEncodeInfo trayE = new TrayEncodeInfo(); if (lstOriginalMST.Count > 0) { trayE.CN_S_ITEM_CODE = lstOriginalMST[0].CN_S_ITEM_CODE; trayE.CN_S_ITEM_NAME = lstOriginalMST[0].CN_S_ITEM_NAME; trayE.CN_S_LOCATION_CODE = locationCode; trayE.CN_S_TRAY_CODE = lstOriginalMST[0].CN_S_TRAY_CODE; trayE.CN_S_MEASURE_UNIT = lstOriginalMST[0].CN_S_MEASURE_UNIT; trayE.CN_S_IN_AREA_CODE = lstOriginalMST[0].CN_S_IN_AREA_CODE; trayE.CN_S_TRAY_FLAG = "主笼"; trayE.CN_F_QUANTITY = lstOriginalMST[0].CN_F_QUANTITY; //记录笼箱的重量 trayE.CN_S_IN_AREA_CODE = lstOriginalMST[0].CN_S_IN_AREA_CODE; List lstLocationExt = BLLCreator.Create(this.userInfo).GetModel("where CN_S_LOCATION_CODE='" + locationCode + "'"); if (lstLocationExt.Count > 0) { if (lstLocationExt[0].CN_S_LOCATION_STATE == Constants.Location_State_OutLock) { trayE.CN_S_TRAY_REMARK = "预出库锁定,并笼托盘即将搬离该货位"; } else { trayE.CN_S_TRAY_REMARK = ""; } } lstTrayE.Add(trayE); } } else { //查询该货位的状态 List lstLocationExt = BLLCreator.Create(this.userInfo).GetModel("where CN_S_LOCATION_CODE='" + locationCode + "'"); TrayEncodeInfo trayE = new TrayEncodeInfo(); trayE.CN_S_TRAY_FLAG = "主笼"; if (lstLocationExt.Count > 0) { if (lstLocationExt[0].CN_S_LOCATION_STATE == Constants.Location_State_InLock) { trayE.CN_S_TRAY_REMARK = "预入库锁定,并笼托盘即将搬运到该货位"; //查询即将入库的托盘物料信息 List lstInTask = CreateDAL().GetTaskByEndLocation(locationCode); if (lstInTask.Count > 0) { List lstOriginalMST = BLLCreator.Create>().GetList(new { CN_S_TRAY_CODE = lstInTask[0].CN_S_TRAY_CODE }); if (lstOriginalMST.Count > 0) { trayE.CN_S_ITEM_CODE = lstOriginalMST[0].CN_S_ITEM_CODE; trayE.CN_S_ITEM_NAME = lstOriginalMST[0].CN_S_ITEM_NAME; trayE.CN_S_LOCATION_CODE = locationCode; trayE.CN_S_TRAY_CODE = lstOriginalMST[0].CN_S_TRAY_CODE; trayE.CN_S_MEASURE_UNIT = lstOriginalMST[0].CN_S_MEASURE_UNIT; trayE.CN_S_IN_AREA_CODE = lstOriginalMST[0].CN_S_IN_AREA_CODE; trayE.CN_F_QUANTITY = lstOriginalMST[0].CN_F_QUANTITY; //记录笼箱的重量 trayE.CN_S_IN_AREA_CODE = lstOriginalMST[0].CN_S_IN_AREA_CODE; } } } else if (lstLocationExt[0].CN_S_LOCATION_STATE == Constants.Location_State_Normal) { trayE.CN_S_TRAY_REMARK = "发呆中,请呼叫托盘做并笼操作"; } lstTrayE.Add(trayE); } } #endregion #region 查询并筐区另一个笼子数据 lstEntity = CreateDAL().GetListByLocationCode(lstLocation[0].CN_S_LOCATION_CODE.ToString()); if (lstEntity.Count > 0) { List lstOriginalMST = BLLCreator.Create>().GetList(new { CN_S_TRAY_CODE = lstEntity[0].CN_S_TRAY_CODE }); TrayEncodeInfo trayE = new TrayEncodeInfo(); if (lstOriginalMST.Count > 0) { trayE.CN_S_ITEM_CODE = lstOriginalMST[0].CN_S_ITEM_CODE; trayE.CN_S_ITEM_NAME = lstOriginalMST[0].CN_S_ITEM_NAME; trayE.CN_S_LOCATION_CODE = lstLocation[0].CN_S_LOCATION_CODE.ToString(); trayE.CN_S_TRAY_CODE = lstOriginalMST[0].CN_S_TRAY_CODE; trayE.CN_S_MEASURE_UNIT = lstOriginalMST[0].CN_S_MEASURE_UNIT; trayE.CN_S_IN_AREA_CODE = lstOriginalMST[0].CN_S_IN_AREA_CODE; trayE.CN_S_TRAY_FLAG = "副笼"; trayE.CN_F_QUANTITY = lstOriginalMST[0].CN_F_QUANTITY; //记录笼箱的重量 trayE.CN_S_IN_AREA_CODE = lstOriginalMST[0].CN_S_IN_AREA_CODE; List lstLocationExt = BLLCreator.Create(this.userInfo).GetModel("where CN_S_LOCATION_CODE='" + lstLocation[0].CN_S_LOCATION_CODE.ToString() + "'"); if (lstLocationExt.Count > 0) { if (lstLocationExt[0].CN_S_LOCATION_STATE == Constants.Location_State_OutLock) { trayE.CN_S_TRAY_REMARK = "预出库锁定,并笼托盘即将搬离该货位"; } else { trayE.CN_S_TRAY_REMARK = ""; } } lstTrayE.Add(trayE); } } else { //查询该货位的状态 List lstLocationExt = BLLCreator.Create(this.userInfo).GetModel("where CN_S_LOCATION_CODE='" + lstLocation[0].CN_S_LOCATION_CODE.ToString() + "'"); TrayEncodeInfo trayE = new TrayEncodeInfo(); trayE.CN_S_TRAY_FLAG = "副笼"; if (lstLocationExt.Count > 0) { if (lstLocationExt[0].CN_S_LOCATION_STATE == Constants.Location_State_InLock) { trayE.CN_S_TRAY_REMARK = "预入库锁定,并笼托盘即将搬运到该货位"; //查询即将入库的托盘物料信息 List lstInTask = CreateDAL().GetTaskByEndLocation(lstLocation[0].CN_S_LOCATION_CODE.ToString()); if (lstInTask.Count > 0) { List lstSubMST = BLLCreator.Create>().GetList(new { CN_S_TRAY_CODE = lstInTask[0].CN_S_TRAY_CODE }); if (lstSubMST.Count > 0) { trayE.CN_S_ITEM_CODE = lstSubMST[0].CN_S_ITEM_CODE; trayE.CN_S_ITEM_NAME = lstSubMST[0].CN_S_ITEM_NAME; trayE.CN_S_LOCATION_CODE = lstLocation[0].CN_S_LOCATION_CODE.ToString(); trayE.CN_S_TRAY_CODE = lstSubMST[0].CN_S_TRAY_CODE; trayE.CN_S_MEASURE_UNIT = lstSubMST[0].CN_S_MEASURE_UNIT; trayE.CN_S_IN_AREA_CODE = lstSubMST[0].CN_S_IN_AREA_CODE; trayE.CN_F_QUANTITY = lstSubMST[0].CN_F_QUANTITY; //记录笼箱的重量 trayE.CN_S_IN_AREA_CODE = lstSubMST[0].CN_S_IN_AREA_CODE; } } } else if (lstLocationExt[0].CN_S_LOCATION_STATE == Constants.Location_State_Normal) { trayE.CN_S_TRAY_REMARK = "发呆中,请呼叫托盘做并笼操作"; } lstTrayE.Add(trayE); } } #endregion return OperateResult.Succeed("", lstTrayE); } public OperateResult GetNeedMergeTray(string areaCode) { //根据库区获取所有的卸货货位托盘信息 List lstEntity = DALCreator.Create().GetEncodeTrayByArea(areaCode); return OperateResult.Succeed("", lstEntity); } /// /// 整托执行下架 /// /// 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(); #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")) { if (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 => { OperateResult re = new OtherSysApi().SendAmsCreateTask(taskEntity); if (!re.Success) { throw new Exception(re.Msg); } 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); } }); return operateResult; } public OperateResult SaveMergeTray(string locationCode, string isCreate, string inAreaCode, string trayUseState, RedisUserEntity userEntity) { if (string.IsNullOrEmpty(locationCode)) { return OperateResult.Error("请传入货位号参数!"); } //寻找该货位所在的并笼区的其他货位 AutoBomLocationEntity locationModel = CreateDAL().GetModel(locationCode); if (locationModel == null) { return OperateResult.Error("在TN_AB_STOCK_LOCATION表中找不到该货位!"); } List lstLocation = CreateDAL().GetAreaLocations(locationModel.CN_S_AREA_CODE); if (lstLocation.Count != 2) { return OperateResult.Error("并筐区的货位数量不等于2!"); } lstLocation.RemoveAll(o => o.CN_S_LOCATION_CODE == locationCode); List lstTrayE = new List(); TN_WM_B_TRAY_ITEM_MSTEntity mainMst = new TN_WM_B_TRAY_ITEM_MSTEntity(); TN_WM_B_TRAY_ITEM_MSTEntity subMst = new TN_WM_B_TRAY_ITEM_MSTEntity(); #region 查询主笼数据 List lstEntity = CreateDAL().GetListByLocationCode(locationCode); if (lstEntity.Count > 0) { List lstOriginalMST = BLLCreator.Create>().GetList(new { CN_S_TRAY_CODE = lstEntity[0].CN_S_TRAY_CODE }); if (lstOriginalMST.Count > 0) { mainMst = lstOriginalMST[0]; } else { return OperateResult.Error("主笼货位对应的托盘没有物料信息,不允许并笼!"); } } else { //查询该货位的状态 List lstLocationExt = BLLCreator.Create(this.userInfo).GetModel("where CN_S_LOCATION_CODE='" + locationCode + "'"); if (lstLocationExt.Count > 0) { if (lstLocationExt[0].CN_S_LOCATION_STATE == Constants.Location_State_InLock) { return OperateResult.Error("主笼货位" + locationCode + "为预入库状态,不允许并笼!"); } else if (lstLocationExt[0].CN_S_LOCATION_STATE == Constants.Location_State_OutLock) { return OperateResult.Error("主笼货位" + locationCode + "为预出库状态,不允许并笼!"); } else if (lstLocationExt[0].CN_S_LOCATION_STATE == Constants.Location_State_Normal) { return OperateResult.Error("主笼货位" + locationCode + "没有绑定托盘,不允许并笼!"); } } } #endregion #region 查询并筐区另一个笼子数据 lstEntity = CreateDAL().GetListByLocationCode(lstLocation[0].CN_S_LOCATION_CODE.ToString()); if (lstEntity.Count > 0) { List lstOriginalMST = BLLCreator.Create>().GetList(new { CN_S_TRAY_CODE = lstEntity[0].CN_S_TRAY_CODE }); if (lstOriginalMST.Count > 0) { subMst = lstOriginalMST[0]; } else { return OperateResult.Error("副笼货位对应的托盘没有物料信息,不允许并笼!"); } } else { //查询该货位的状态 List lstLocationExt = BLLCreator.Create(this.userInfo).GetModel("where CN_S_LOCATION_CODE='" + lstLocation[0].CN_S_LOCATION_CODE.ToString() + "'"); if (lstLocationExt.Count > 0) { if (lstLocationExt[0].CN_S_LOCATION_STATE == Constants.Location_State_InLock) { return OperateResult.Error("副笼货位" + lstLocation[0].CN_S_LOCATION_CODE.ToString() + "为预入库状态,不能并笼!"); } else if (lstLocationExt[0].CN_S_LOCATION_STATE == Constants.Location_State_OutLock) { return OperateResult.Error("副笼货位" + lstLocation[0].CN_S_LOCATION_CODE.ToString() + "为预出库状态,不能并笼!"); } else if (lstLocationExt[0].CN_S_LOCATION_STATE == Constants.Location_State_Normal) { return OperateResult.Error("副笼货位" + lstLocation[0].CN_S_LOCATION_CODE.ToString() + "没有绑定托盘,不能并笼!"); } } } #endregion if (mainMst.CN_S_ITEM_CODE != subMst.CN_S_ITEM_CODE) { return OperateResult.Error("主笼与副笼中的物料信息不一致,不允许并笼!"); } //if (mainMst.CN_S_IN_AREA_CODE == null) //{ // return OperateResult.Error("主笼没有称重数据,不允许并笼!"); //} //if (subMst.CN_S_IN_AREA_CODE == null) //{ // return OperateResult.Error("副笼没有称重数据,不允许并笼!"); //} mainMst.CN_F_QUANTITY = mainMst.CN_F_QUANTITY + subMst.CN_F_QUANTITY; // mainMst.CN_S_IN_AREA_CODE = (decimal.Parse(mainMst.CN_S_IN_AREA_CODE) + decimal.Parse(subMst.CN_S_IN_AREA_CODE)).ToString(); OperateResult operateResult = new OperateResult(); operateResult = UseTransaction(trans => { //更新托盘物料关联主表 // CreateDAL>().Update(new { CN_F_QUANTITY = mainMst.CN_F_QUANTITY, CN_S_IN_AREA_CODE = mainMst.CN_S_IN_AREA_CODE }, new { CN_GUID = mainMst.CN_GUID }, trans); CreateDAL>().Update(new { CN_F_QUANTITY = mainMst.CN_F_QUANTITY }, new { CN_GUID = mainMst.CN_GUID }, trans); CreateDAL>().Update(new { CN_F_QUANTITY = mainMst.CN_F_QUANTITY }, new { CN_PARENT_GUID = mainMst.CN_GUID }, trans); CreateDAL>().Delete(new { CN_GUID = subMst.CN_GUID }, trans); CreateDAL>().Delete(new { CN_PARENT_GUID = subMst.CN_GUID }, trans); //更新托盘贮存状态 CreateDAL>().Update(new { CN_S_USE_STATE = trayUseState }, new { CN_S_TRAY_CODE = mainMst.CN_S_TRAY_CODE }, trans); }); if (operateResult.Success) { var result = BLLCreator.Create().DeleteTrayLocationRelation(subMst.CN_S_TRAY_CODE, lstLocation[0].ToString(), userEntity, ""); if (result.Success) { if (isCreate == "Y") { TrayOnShelfEntity entity = new TrayOnShelfEntity(); entity.CN_S_DEVICE_NO = locationCode; //起点货位码 entity.CN_S_LOCATION_CODE = ""; //建议货位码 货位 entity.CN_S_END_AREA_CODE = inAreaCode;//目标库区 entity.CN_S_TRAY_CODE = mainMst.CN_S_TRAY_CODE; //起始托盘码 entity.CN_S_TASK_TYPE = "上架"; //任务类型 result = BLLCreator.Create().SimZTShelfAuto(entity, userEntity); if (result.Success) { return OperateResult.Succeed(""); } else { return OperateResult.Error("并笼成功但主笼入库失败,原因为:" + result.Msg); } } else { return OperateResult.Succeed(""); } } else { return OperateResult.Error("并笼成功但副笼解绑货位失败,原因为:" + result.Msg); } } else { return OperateResult.Error("并笼失败"); } } public OperateResult SaveMergeTrayNew(ItemOnTrayEntity entity, RedisUserEntity userEntity) { TN_WM_B_TRAY_ITEM_MSTEntity mainMst = null; TN_WM_B_TRAY_ITEM_MSTEntity subMst = null; List lstMergeHis = new List(); bool mainCombineFlag = false; bool subCombineFlag = false; List lstOriginalMST = BLLCreator.Create>().GetList(new { CN_S_TRAY_CODE = entity.CN_S_TRAY_CODE }); if (lstOriginalMST.Count > 0) { mainMst = lstOriginalMST[0]; } else { return OperateResult.Error("主笼中没有物料信息,不允许并笼!"); } List lstOriginalSUB = BLLCreator.Create>().GetList(new { CN_S_TRAY_CODE = entity.CN_S_TRAY_CODE_SUB }); if (lstOriginalSUB.Count > 0) { subMst = lstOriginalSUB[0]; } else { return OperateResult.Error("副笼中没有物料信息,不允许并笼!"); } Log.Info("SaveMergeTrayNew===>subMst:", JsonConvert.SerializeObject(subMst)); if (lstOriginalMST.Count > 0 && lstOriginalSUB.Count > 0) { if (mainMst.CN_S_ITEM_CODE != subMst.CN_S_ITEM_CODE) { return OperateResult.Error("主笼与副笼中的物料信息不一致,不允许并笼!"); } } //查询是否有并笼记录 List lstMainMergeHis = BLLCreator.Create>().GetList(new { CN_S_MAIN_TRAY_CODE = entity.CN_S_TRAY_CODE, CN_N_SYNC = "新建" }); List lstSubMergeHis = BLLCreator.Create>().GetList(new { CN_S_MAIN_TRAY_CODE = entity.CN_S_TRAY_CODE_SUB, CN_N_SYNC = "新建" }); if (lstMainMergeHis.Count > 0) { //将主笼中已经并笼过的数据添加到新主笼中 mainCombineFlag = true; foreach (TN_ER_COMBINE_CAGE_HISTORYEntity combine in lstMainMergeHis) { TN_ER_COMBINE_CAGE_HISTORYEntity mergeHis = new TN_ER_COMBINE_CAGE_HISTORYEntity(); mergeHis.CN_S_MAIN_TRAY_CODE = entity.CN_S_TRAY_CODE; mergeHis.CN_S_TRAY_CODE = combine.CN_S_TRAY_CODE; mergeHis.CN_S_POUND_NO = combine.CN_S_POUND_NO; mergeHis.CN_GUID = Guid.NewGuid().ToString(); mergeHis.CN_N_SYNC = "新建"; mergeHis.CN_S_LOT_NO = combine.CN_S_LOT_NO; mergeHis.CN_F_QTY = combine.CN_F_QTY; mergeHis.CN_T_CREATE = DateTime.Now; lstMergeHis.Add(mergeHis); } } else { List lstItemPound = BLLCreator.Create>().GetList(new { CN_S_POUND_NO = mainMst.CN_S_FIGURE_NO, CN_S_TRAY_CODE = mainMst.CN_S_TRAY_CODE }); if (lstItemPound.Count == 0) { return OperateResult.Error("未查询到主笼的小磅号数据!"); } TN_ER_COMBINE_CAGE_HISTORYEntity mergeHis = new TN_ER_COMBINE_CAGE_HISTORYEntity(); mergeHis.CN_S_MAIN_TRAY_CODE = entity.CN_S_TRAY_CODE; mergeHis.CN_S_TRAY_CODE = entity.CN_S_TRAY_CODE; mergeHis.CN_S_POUND_NO = mainMst.CN_S_FIGURE_NO; mergeHis.CN_GUID = Guid.NewGuid().ToString(); mergeHis.CN_N_SYNC = "新建"; mergeHis.CN_T_CREATE = DateTime.Now; mergeHis.CN_S_LOT_NO = lstItemPound[0].CN_S_LOT_NO; mergeHis.CN_F_QTY = mainMst.CN_F_QUANTITY; lstMergeHis.Add(mergeHis); } if (lstSubMergeHis.Count > 0) { //将副笼之前的并笼数据添加到新主笼中 subCombineFlag = true; foreach (TN_ER_COMBINE_CAGE_HISTORYEntity combine in lstSubMergeHis) { TN_ER_COMBINE_CAGE_HISTORYEntity mergeHis = new TN_ER_COMBINE_CAGE_HISTORYEntity(); mergeHis.CN_S_MAIN_TRAY_CODE = entity.CN_S_TRAY_CODE; mergeHis.CN_S_TRAY_CODE = combine.CN_S_TRAY_CODE; mergeHis.CN_S_POUND_NO = combine.CN_S_POUND_NO; mergeHis.CN_GUID = Guid.NewGuid().ToString(); mergeHis.CN_N_SYNC = "新建"; mergeHis.CN_S_LOT_NO = combine.CN_S_LOT_NO; mergeHis.CN_F_QTY = combine.CN_F_QTY; mergeHis.CN_T_CREATE = DateTime.Now; lstMergeHis.Add(mergeHis); } } else { Log.Info("SaveMergeTrayNew===>subMst(CN_S_POUND_NO,CN_S_TRAY_CODE):", subMst.CN_S_FIGURE_NO.ToString() +"," +subMst.CN_S_TRAY_CODE.ToString()); List lstItemPound = BLLCreator.Create>().GetList(new { CN_S_POUND_NO = subMst.CN_S_FIGURE_NO, CN_S_TRAY_CODE = subMst.CN_S_TRAY_CODE }); Log.Info("SaveMergeTrayNew===>lstItemPound:", JsonConvert.SerializeObject(lstItemPound)); if (lstItemPound.Count == 0) { return OperateResult.Error("未查询到副笼的小磅号数据!"); } TN_ER_COMBINE_CAGE_HISTORYEntity mergeHis = new TN_ER_COMBINE_CAGE_HISTORYEntity(); mergeHis.CN_S_MAIN_TRAY_CODE = entity.CN_S_TRAY_CODE; mergeHis.CN_S_TRAY_CODE = entity.CN_S_TRAY_CODE_SUB; mergeHis.CN_S_POUND_NO = subMst.CN_S_FIGURE_NO; mergeHis.CN_GUID = Guid.NewGuid().ToString(); mergeHis.CN_N_SYNC = "新建"; mergeHis.CN_S_LOT_NO = lstItemPound[0].CN_S_LOT_NO; mergeHis.CN_F_QTY = subMst.CN_F_QUANTITY; mergeHis.CN_T_CREATE = DateTime.Now; lstMergeHis.Add(mergeHis); } //if (mainMst == null) //{ // //插入 // mainInsert = true; //} //else //{ //更新 mainMst.CN_F_QUANTITY = mainMst.CN_F_QUANTITY + subMst.CN_F_QUANTITY; // } OperateResult operateResult = new OperateResult(); operateResult = UseTransaction(trans => { //更新托盘物料关联主表 //if (mainInsert) //{ // CreateDAL>().Update(new { CN_S_TRAY_CODE = entity.CN_S_TRAY_CODE }, new { CN_GUID = subMst.CN_GUID }, trans); //} //else //{ CreateDAL>().Update(new { CN_F_QUANTITY = mainMst.CN_F_QUANTITY }, new { CN_GUID = mainMst.CN_GUID }, trans); CreateDAL>().Update(new { CN_F_QUANTITY = mainMst.CN_F_QUANTITY }, new { CN_PARENT_GUID = mainMst.CN_GUID }, trans); // } CreateDAL>().Delete(new { CN_GUID = subMst.CN_GUID }, trans); CreateDAL>().Delete(new { CN_PARENT_GUID = subMst.CN_GUID }, trans); CreateDAL>().Delete(new { CN_S_TRAY_CODE = subMst.CN_S_TRAY_CODE }, trans); //处理并笼历史记录业务 if (mainCombineFlag) { CreateDAL().UpdateCombineStatus(entity.CN_S_TRAY_CODE, "删除", "新建", trans); } if (subCombineFlag) { CreateDAL().UpdateCombineStatus(entity.CN_S_TRAY_CODE_SUB, "删除", "新建", trans); } CreateDAL>().AddRange(lstMergeHis, trans); //更新托盘贮存状态 CreateDAL>().Update(new { CN_S_USE_STATE = entity.CN_S_USE_STATE }, new { CN_S_TRAY_CODE = mainMst.CN_S_TRAY_CODE }, trans); }); if (operateResult.Success) { return OperateResult.Succeed(""); } else { return OperateResult.Error("并笼失败" + operateResult.Msg); } } //public OperateResult SaveMergeTrayNew(ItemOnTrayEntity entity, RedisUserEntity userEntity) //{ // TN_WM_B_TRAY_ITEM_MSTEntity mainMst = null; // TN_WM_B_TRAY_ITEM_DTLEntity mainDtlentity = null; // TN_WM_B_TRAY_ITEM_MSTEntity subMst = null; // bool mainInsert = false; // bool subDelete = false; // List lstOriginalMST = BLLCreator.Create>().GetList(new { CN_S_TRAY_CODE = entity.CN_S_TRAY_CODE }); // if (lstOriginalMST.Count > 0) // { // mainMst = lstOriginalMST[0]; // } // List lstOriginalSUB = BLLCreator.Create>().GetList(new { CN_S_TRAY_CODE = entity.CN_S_TRAY_CODE_SUB }); // if (lstOriginalSUB.Count > 0) // { // subMst = lstOriginalMST[0]; // } // if (lstOriginalMST.Count > 0 && lstOriginalSUB.Count > 0) // { // if (mainMst.CN_S_ITEM_CODE != subMst.CN_S_ITEM_CODE) // { // return OperateResult.Error("主笼与副笼中的物料信息不一致,不允许并笼!"); // } // } // if (mainMst == null) // { // //插入 // mainInsert = true; // string mstGuid = Guid.NewGuid().ToString().ToUpper(); // mainMst = new TN_WM_B_TRAY_ITEM_MSTEntity // { // CN_GUID = mstGuid, // CN_S_TRAY_CODE = entity.CN_S_TRAY_CODE, // CN_S_TRAY_GRID = "1", // CN_S_OWNER = "", // CN_S_ITEM_CODE = entity.row[0].CN_S_ITEM_CODE.ToString(), // CN_S_LOT_NO = "", // CN_S_ITEM_NAME = entity.row[0].CN_S_ITEM_NAME, // CN_S_FIGURE_NO = "", // CN_S_MODEL = "", // CN_S_ITEM_STATE = "", // CN_F_QUANTITY = entity.row[0].CN_F_QUANTITY, // CN_S_MEASURE_UNIT = entity.row[0].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 = entity.row[0].CN_F_QUANTITY, // }; // mainDtlentity = new TN_WM_B_TRAY_ITEM_DTLEntity(); // mainDtlentity.CN_GUID = Guid.NewGuid().ToString().ToUpper(); // mainDtlentity.CN_PARENT_GUID = mstGuid; // mainDtlentity.CN_S_UNIQUE_CODE = "";// entity.row[i].CN_S_UNIQUE_CODE.ToString(); // mainDtlentity.CN_S_LOT_NO = ""; // mainDtlentity.CN_F_QUANTITY = entity.row[0].CN_F_QUANTITY; // mainDtlentity.CN_S_PRODUCTION_BATCH = ""; // mainDtlentity.CN_S_NOTE = ""; // mainDtlentity.CN_S_EXT1 = ""; // mainDtlentity.CN_S_EXT2 = ""; // mainDtlentity.CN_S_EXT3 = ""; // mainDtlentity.CN_S_EXT4 = ""; // mainDtlentity.CN_S_EXT5 = ""; // mainDtlentity.CN_S_CREATOR = userEntity.CN_S_LOGIN; // mainDtlentity.CN_S_CREATOR_BY = userEntity.CN_S_NAME; // mainDtlentity.CN_T_CREATE = DateTime.Now; // mainDtlentity.CN_S_MODIFY = userEntity.CN_S_LOGIN; // mainDtlentity.CN_S_MODIFY_BY = userEntity.CN_S_NAME; // mainDtlentity.CN_T_MODIFY = DateTime.Now; // } // else // { // //更新 // mainMst.CN_F_QUANTITY = mainMst.CN_F_QUANTITY + entity.row[0].CN_F_QUANTITY; // } // decimal remainQty = subMst.CN_F_QUANTITY - entity.row[0].CN_F_QUANTITY; // if (remainQty > 0) // { // //更新 // subMst.CN_F_QUANTITY = remainQty; // } // else // { // subDelete = true; // } // // mainMst.CN_S_IN_AREA_CODE = (decimal.Parse(mainMst.CN_S_IN_AREA_CODE) + decimal.Parse(subMst.CN_S_IN_AREA_CODE)).ToString(); // OperateResult operateResult = new OperateResult(); // operateResult = UseTransaction(trans => // { // //更新托盘物料关联主表 // // CreateDAL>().Update(new { CN_F_QUANTITY = mainMst.CN_F_QUANTITY, CN_S_IN_AREA_CODE = mainMst.CN_S_IN_AREA_CODE }, new { CN_GUID = mainMst.CN_GUID }, trans); // if (mainInsert) // { // CreateDAL>().Add(mainMst, trans); // CreateDAL>().Add(mainDtlentity, trans); // } // else // { // CreateDAL>().Update(new { CN_F_QUANTITY = mainMst.CN_F_QUANTITY }, new { CN_GUID = mainMst.CN_GUID }, trans); // CreateDAL>().Update(new { CN_F_QUANTITY = mainMst.CN_F_QUANTITY }, new { CN_PARENT_GUID = mainMst.CN_GUID }, trans); // } // if (subDelete) // { // CreateDAL>().Delete(new { CN_GUID = subMst.CN_GUID }, trans); // CreateDAL>().Delete(new { CN_PARENT_GUID = subMst.CN_GUID }, trans); // } // else // { // CreateDAL>().Update(new { CN_F_QUANTITY = remainQty }, new { CN_GUID = subMst.CN_GUID }, trans); // CreateDAL>().Update(new { CN_F_QUANTITY = remainQty }, new { CN_PARENT_GUID = subMst.CN_GUID }, trans); // } // //更新托盘贮存状态 // CreateDAL>().Update(new // { // CN_S_USE_STATE = entity.CN_S_USE_STATE, // CN_S_TRAY_CODE_EXT = 'Y' // }, new // { // CN_S_TRAY_CODE = mainMst.CN_S_TRAY_CODE // }, trans); // }); // if (operateResult.Success) // { // return OperateResult.Succeed(""); // } // else // { // return OperateResult.Error("并笼失败"); // } //} #endregion #region PDA专用 生成任务 /// /// PDA专用 生成任务 /// /// /// /// /// /// /// /// public OperateResult CreateTransTask(string startPosition, string endPosition, string taskPriority, string tranType, string projectCode, RedisUserEntity userEntity) { OperateResult result = new OperateResult(); #region 货位逻辑判断检测 TN_WM_LOCATION_EXTEntity startlocation = BLLCreator.Create().GetExtModel(" where CN_S_LOCATION_CODE='" + startPosition + "'"); 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(startPosition); if (startArea == null) { //非法的目的货位 return OperateResult.Error(string.Format("在mongo(TN_AB_B_STOCK_AREA或TN_AB_STOCK_LOCATION表)中未查询到该起点货位{0}的库区信息!", startPosition)); } List lstStartTray = new List(); 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(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")) { if (endlocation.CN_S_USE_STATE != Constants.Use_State_Empty) { return OperateResult.Error(string.Format("终点库区管控数量并且货位存储状态为{0},不允许往该位置卸料!", endlocation.CN_S_USE_STATE)); } //判断货位是否绑定托盘 List lstEndTray = CreateDAL().GetListByLocationCode(endPosition); if (lstEndTray.Count > 0) { return OperateResult.Error("该目的位置上已绑定其他托盘物料信息!"); } } #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; if (lstStartTray.Count > 0) { taskEntity.CN_S_TRAY_CODE = lstStartTray[0].CN_S_TRAY_CODE; } else { postData = "{\"appCode\":\"" + Constants.appCode + "\",\"ruleName\":\"" + Constants.VirtualTray + "\",\"orgId\":\"\",\"orgFlag\":\"0\"}"; string trayCode = WebApiManager.HttpAutoBom_Post("api/BillRule/GenBillNo", postData); if (string.IsNullOrEmpty(trayCode)) { return OperateResult.Error("虚拟托盘号生成失败,请检查autobom中是否配置了虚拟托盘号生成规则!"); } taskEntity.CN_S_TRAY_CODE = trayCode; } 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; 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().SendAmsCreateTask(taskEntity); if (!re.Success) { throw new Exception(re.Msg); } #endregion }); return result; } #endregion #region 检查并获取托盘信息 public OperateResult GetTrayInfo(string trayCode) { if (string.IsNullOrEmpty(trayCode)) { return OperateResult.Error("请传入托盘号参数!"); } //判断托盘是否在容器管理表中维护 TN_WM_B_TRAY_INFOEntity trayModel = CreateDAL().GetModel(trayCode); if (trayModel == null) { trayModel = new TN_WM_B_TRAY_INFOEntity(); trayModel.CN_S_TRAY_CODE = trayCode; } return OperateResult.Succeed("", trayModel); } #endregion #region 新增或更新托盘信息 public OperateResult UpdateTrayInfo(TN_WM_B_TRAY_INFOEntity trayM, RedisUserEntity user) { //判断托盘是否在容器管理表中维护 TN_WM_B_TRAY_INFOEntity trayModel = CreateDAL().GetModel(trayM.CN_S_TRAY_CODE); OperateResult result = new OperateResult(); if (trayModel == null) { //新增容器表 trayM.CN_N_COLUMN_NUM = 1; trayM.CN_N_GOODUPLINE = 1; trayM.CN_N_LATTICE_NUM = 1; trayM.CN_N_ROW_NUM = 1; trayM.CN_S_CREATOR = user.CN_S_LOGIN; trayM.CN_S_CREATOR_BY = user.CN_S_NAME; trayM.CN_S_MODIFY = user.CN_S_LOGIN; trayM.CN_S_MODIFY_BY = user.CN_S_NAME; trayM.CN_S_STATE = Constants.State_New; trayM.CN_S_TRAY_TYPE = "托盘"; trayM.CN_S_USE_STATE = Constants.TrayState_NotUse; trayM.CN_T_CREATE = DateTime.Now; trayM.CN_T_MODIFY = DateTime.Now; result = CreateDAL().Add(trayM, null); } else { //更新托盘实际重量、规格信息 result = CreateDAL().updateTrayInfo(trayM.CN_S_TRAY_CODE, trayM.CN_F_GROSSWEIGHT,trayM.CN_S_USE_STATE, trayM.CN_S_SPEC, null); } return result; } #endregion #region 根据巷道获取巷道内的货位状态 public DataTable ViewState(string stockCode, string areaCodes, string roadway) { var dt = CreateDAL().ViewStateByAreaCode(stockCode, areaCodes, roadway); dt.Columns["VIEW_STATE"].ReadOnly = false; foreach (DataRow row in dt.Rows) { if (row["VIEW_STATE"].ToString().Equals("满")) { var trayLocation = CreateDAL>().GetSingleEntity(new { CN_S_LOCATION_CODE = row["CN_S_LOCATION_CODE"].ToString() }); if (trayLocation != null) { var trayInfo = CreateDAL>().GetSingleEntity(new { CN_S_TRAY_CODE = trayLocation.CN_S_TRAY_CODE }); if (trayInfo != null) { if (!string.IsNullOrEmpty(trayInfo.CN_S_USE_STATE) && trayInfo.CN_S_USE_STATE.Trim() != "空") row["VIEW_STATE"] = trayInfo.CN_S_USE_STATE; } } } } return dt; } #endregion } }