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 JxBLL : DapperBaseBLL { #region 生成任务 /// /// PDA专用 生成任务 /// /// /// /// /// /// /// /// public OperateResult CreateTransTask(string startPosition, string endPosition, string taskPriority, string tranType, string projectCode) { 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)); } 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)); } //判断货位是否绑定托盘 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; 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 = "AmsPoint"; taskEntity.CN_S_CREATOR_BY = "AmsPoint"; taskEntity.CN_T_CREATE = DateTime.Now; taskEntity.CN_S_MODIFY = "AmsPoint"; taskEntity.CN_S_MODIFY_BY = "AmsPoint"; 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, "正常", "预入库锁定", "AMS生成点对点任务锁定终点货位", "AMS", "ams", 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, "正常", "预出库锁定", "AMS生成点对点任务锁定起点货位", "AMS", "ams", 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 }); result.Data = taskNo; return result; } #endregion } }