using HH.WMS.BLL.Algorithm; using HH.WMS.Common; using HH.WMS.Common.Algorithm; using HH.WMS.Common.External; using HH.WMS.Common.Response; using HH.WMS.DAL; using HH.WMS.DAL.Algorithm; using HH.WMS.DAL.Basic; using HH.WMS.DAL.External; using HH.WMS.DAL.InStock; using HH.WMS.Entitys.Basic; using HH.WMS.Entitys.External; using System; using System.Collections.Generic; using System.Globalization; using System.Linq; using System.Text; using System.Threading.Tasks; namespace HH.WMS.BLL.External { /// /// 出作业区任务 /// public class ExternalOutWorkAreaBLL : BaseBLL { private static string _className = "HH.BWMS.BLL.External.ExternalOutWorkAreaBLL."; #region 算法计算货位 + CalculateLoaction /// /// 算法计算货位 /// /// /// public ExecuteOutWorkAreaPara CalculateLoaction(ExecuteOutWorkAreaPara executeOutWorkAreaPara) { executeOutWorkAreaPara.ItemQueryClassList = new List(); if (executeOutWorkAreaPara.OutWorkAreaEntity.Data != null) { foreach (var itemData in executeOutWorkAreaPara.OutWorkAreaEntity.Data) { if (!string.IsNullOrEmpty(itemData.TrayCode)) { #region 按照托盘出库 //起点货位 executeOutWorkAreaPara.TrayObjLocation = CreateDAL().GetListByTrayCode(itemData.TrayCode).First(); if (executeOutWorkAreaPara.TrayObjLocation == null) { executeOutWorkAreaPara.BasisResponse = BasisResponse.Error(string.Format("库区:{0},未找到托盘{1} ", "", itemData.TrayCode)); return executeOutWorkAreaPara; } if (string.IsNullOrEmpty(executeOutWorkAreaPara.TrayObjLocation.CN_S_LOCATION_CODE)) { executeOutWorkAreaPara.BasisResponse = BasisResponse.Error(string.Format("库区:{0},托盘{1} 未找到起始货位", "", itemData.TrayCode)); return executeOutWorkAreaPara; } var startStockLocation = DALCreator.Create().GetAreaModelByLocation(executeOutWorkAreaPara.TrayObjLocation.CN_S_LOCATION_CODE); //获取作业流转任务 var entity = new TN_WM_TRANSPORT_TASKEntity { CN_S_TASK_NO = executeOutWorkAreaPara.OutWorkAreaEntity.taskNo, CN_S_CIR_OBJ = "托盘", CN_S_CIR_OBJ_CODE = itemData.TrayCode, CN_S_START_BIT = executeOutWorkAreaPara.TrayObjLocation.CN_S_LOCATION_CODE, CN_S_START_AREA = executeOutWorkAreaPara.TrayObjLocation.CN_S_STOCK_AREA, CN_S_STATE = Constants.TaskStateList[0], CN_N_PRIORITY = executeOutWorkAreaPara.OutWorkAreaEntity.priority, CN_S_END_AREA = executeOutWorkAreaPara.OutWorkAreaEntity.endArea, CN_S_END_BIT = executeOutWorkAreaPara.OutWorkAreaEntity.endBit, CN_T_START = DateTime.Now.ToString(CultureInfo.InvariantCulture), CN_T_CREATE = DateTime.Now.ToString(CultureInfo.InvariantCulture), CN_T_MODIFY = DateTime.Now.ToString(CultureInfo.InvariantCulture), CN_S_STOCK_CODE = executeOutWorkAreaPara.OutWorkAreaEntity.startStock, CN_S_TASK_TYPE = "出库", CN_C_END_IS_CONTROL_QTY = executeOutWorkAreaPara.EndStockAreaEntity.CN_C_IS_CONTROL_QTY, CN_S_END_AREA_TYPE = executeOutWorkAreaPara.EndStockAreaEntity.CN_S_STRUCTURE, CN_C_START_IS_CONTROL_QTY = startStockLocation.CN_C_IS_CONTROL_QTY, CN_S_START_AREA_TYPE = startStockLocation.CN_S_STRUCTURE }; executeOutWorkAreaPara.TransportList.Add(entity); //锁定起点货位 var lockResult = CreateDAL().UpdateLocationState(executeOutWorkAreaPara.TrayObjLocation.CN_S_LOCATION_CODE, Constants.Location_State_OutLock, "出库", null); if (lockResult.Success && lockResult.Row > 0) { executeOutWorkAreaPara.RollLocations.Add(executeOutWorkAreaPara.TrayObjLocation.CN_S_LOCATION_CODE); AutoBomLocationEntity locationModel = CreateDAL().GetModel(executeOutWorkAreaPara.TrayObjLocation.CN_S_LOCATION_CODE); BLLCreator.Create().AddStateChange(executeOutWorkAreaPara.TrayObjLocation.CN_S_LOCATION_CODE, "正常", "预出库锁定", "按托盘出库锁定起点货位防止其他资源竞争", executeOutWorkAreaPara.OutWorkAreaEntity.sysName, "", "", locationModel.CN_S_STOCK_CODE, locationModel.CN_S_AREA_CODE,null); } else executeOutWorkAreaPara.BasisResponse = BasisResponse.Error("按托盘出库锁定货位失败!", _className); #endregion } else { //算法位置 executeOutWorkAreaPara = OutAss(executeOutWorkAreaPara); } } } else { //空托出库 executeOutWorkAreaPara = OutAss(executeOutWorkAreaPara); } if (!executeOutWorkAreaPara.BasisResponse.Success) return executeOutWorkAreaPara; //if (executeOutWorkAreaPara.TransportList.Count == 0) // executeOutWorkAreaPara.BasisResponse = BasisResponse.Error("未找到合适的出库货位!"); return executeOutWorkAreaPara; } #endregion #region 调用算法 + OutAss /// /// 调用算法 /// /// /// private ExecuteOutWorkAreaPara OutAss(ExecuteOutWorkAreaPara executeOutWorkAreaPara) { _className += ".OutAss"; #region 算法 //获取终点货位 OutAssignEnitty oEntity = new OutAssignEnitty() { stockCode = executeOutWorkAreaPara.OutWorkAreaEntity.startStock, itemCode = executeOutWorkAreaPara.OutWorkAreaEntity.Data == null ? "" : executeOutWorkAreaPara.OutWorkAreaEntity.Data.First().ItemCode, itemState = executeOutWorkAreaPara.OutWorkAreaEntity.Data == null ? "" : executeOutWorkAreaPara.OutWorkAreaEntity.Data.First().ItemState, projectCode = executeOutWorkAreaPara.OutWorkAreaEntity.projectCode, lstAreaPrior = executeOutWorkAreaPara.WorkAreaProEntitys.Select(e => new areaPriorClass { areaCode = e.CN_S_START_AREA_CODE, Prior = e.CN_N_PRIORITY }).ToList() }; try { //执行算法 OutAssignResultEntity ire = BLLCreator.Create().OutAssign(oEntity); if (!ire.Success) { executeOutWorkAreaPara.BasisResponse = BasisResponse.Error("算法返回结果" + ire.Msg, _className); return executeOutWorkAreaPara; } if ((ire.areaType == Constants.Area_Struc_PingStock || ire.areaType == Constants.Area_Struc_LiStock) && ire.isControlQty == "Y") { executeOutWorkAreaPara.RollLocations.Add(ire.locationCode); } //创建转运任务 var entity = new TN_WM_TRANSPORT_TASKEntity { CN_S_TASK_NO = executeOutWorkAreaPara.OutWorkAreaEntity.taskNo, CN_S_CIR_OBJ = "托盘", CN_S_CIR_OBJ_CODE = ire.trayCode, CN_S_START_BIT = ire.locationCode, CN_S_START_AREA = ire.areaCode, CN_S_STATE = Constants.TaskStateList[0], CN_N_PRIORITY = executeOutWorkAreaPara.OutWorkAreaEntity.priority, CN_S_END_AREA = executeOutWorkAreaPara.OutWorkAreaEntity.endArea, CN_S_END_BIT = executeOutWorkAreaPara.OutWorkAreaEntity.endBit, CN_T_START = DateTime.Now.ToString(CultureInfo.InvariantCulture), CN_T_CREATE = DateTime.Now.ToString(CultureInfo.InvariantCulture), CN_T_MODIFY = DateTime.Now.ToString(CultureInfo.InvariantCulture), CN_S_STOCK_CODE = executeOutWorkAreaPara.OutWorkAreaEntity.startStock, CN_S_TASK_TYPE = executeOutWorkAreaPara.OutWorkAreaEntity.IsTransport == "Y" ? "转运" : "出库", CN_S_QTY_INDEX = ire.index, CN_C_END_IS_CONTROL_QTY = executeOutWorkAreaPara.EndStockAreaEntity.CN_C_IS_CONTROL_QTY, CN_S_END_AREA_TYPE = executeOutWorkAreaPara.EndStockAreaEntity.CN_S_STRUCTURE, CN_C_START_IS_CONTROL_QTY = ire.isControlQty, CN_S_START_AREA_TYPE = ire.areaType, CN_S_END_CONTROL_INV = executeOutWorkAreaPara.EndStockAreaEntity.CN_C_IS_INVENTORY, CN_S_START_CONTROL_INV = ire.isControlInv }; executeOutWorkAreaPara.TransportList.Add(entity); } catch (Exception ex) { executeOutWorkAreaPara.BasisResponse = BasisResponse.Error("未找到合适的出库货位" + ex.Message); } #endregion return executeOutWorkAreaPara; } #endregion } }