using HH.WMS.BLL.Basic; using HH.WMS.Common; using HH.WMS.Common.Algorithm; using HH.WMS.Common.External; using HH.WMS.DAL.External; using HH.WMS.Entitys; using HH.WMS.Entitys.Autobom; using HH.WMS.Entitys.Basic; using HH.WMS.Entitys.External; using Newtonsoft.Json; using Newtonsoft.Json.Linq; using System.Collections.Generic; using System.Linq; using System.Reflection; namespace HH.WMS.BLL.External { /// /// /// public class TaskTransferBLL : BaseBLL { #region 获取入作业区列表 + GetInWorkPosition /// /// 获取入作业区列表 /// /// /// public List GetInWorkPosition(ExecuteInWorkAreaPara executeInWorkAreaPara) { //根据起始库区计算作业区 var workAreaProList = BLLCreator.Create().GetRoute("", executeInWorkAreaPara.InWorkAreaEntity.startArea, executeInWorkAreaPara.InWorkAreaEntity.endArea); if (workAreaProList.Any()) { //没有条件的记录 var notExpressWork = workAreaProList.FindAll(p => string.IsNullOrEmpty(p.CN_S_EXPRESS)); //有条件才会匹配,否则直接返回 if (workAreaProList.Count != notExpressWork.Count) { workAreaProList = GetMatchPro(new TaskTransferEntity() { StartArea = executeInWorkAreaPara.InWorkAreaEntity.startArea, StartBit = executeInWorkAreaPara.InWorkAreaEntity.startBit, CirObjCode = executeInWorkAreaPara.InWorkAreaEntity.trayCode }, workAreaProList); if (workAreaProList.Count == 0) workAreaProList = notExpressWork; } } return workAreaProList; } #endregion #region 获取出作业区列表 + GetOutWorkPosition /// /// 获取入作业区列表 /// /// /// public List GetOutWorkPosition(ExecuteOutWorkAreaPara executeOutWorkAreaPara) { //根据起始库区计算作业区 var workAreaProList = BLLCreator.Create().GetRoute("", executeOutWorkAreaPara.OutWorkAreaEntity.startArea, executeOutWorkAreaPara.OutWorkAreaEntity.endArea); if (workAreaProList.Any()) { //没有条件的记录 var notExpressWork = workAreaProList.FindAll(p => string.IsNullOrEmpty(p.CN_S_EXPRESS)); //有条件才会匹配,否则直接返回 if (workAreaProList.Count != notExpressWork.Count) { workAreaProList = GetMatchPro(new TaskTransferEntity { StartArea = executeOutWorkAreaPara.OutWorkAreaEntity.startArea, StartBit = executeOutWorkAreaPara.OutWorkAreaEntity.startBit, CirObjCode = executeOutWorkAreaPara.OutWorkAreaEntity.trayCode }, workAreaProList); if (workAreaProList.Count == 0) workAreaProList = notExpressWork; } } return workAreaProList; } #endregion #region 获取改道作业区列表 + GetWayWorkPosition /// /// 获取入作业区列表 /// /// /// public MsgEntity GetWayWorkPosition(TaskTransferEntity entity) { MsgEntity msg = new MsgEntity(); if (string.IsNullOrEmpty(entity.StartArea) && !string.IsNullOrEmpty(entity.StartBit)) { AutoBomLocationEntity location = BLLCreator.Create().GetLocationModel(entity.StartBit); if (location != null) { entity.StartArea = location.CN_S_AREA_CODE; } } if (string.IsNullOrEmpty(entity.EndArea) && !string.IsNullOrEmpty(entity.EndBit)) { AutoBomLocationEntity location = BLLCreator.Create().GetLocationModel(entity.EndBit); if (location != null) { entity.EndArea = location.CN_S_AREA_CODE; } } List workAreaProList = BLLCreator.Create() .GetRoute(entity.WorkType, entity.StartArea, entity.EndArea); if (workAreaProList.Any()) { var notExpressWork = workAreaProList.FindAll(p => string.IsNullOrEmpty(p.CN_S_EXPRESS)); //有条件才会匹配,否则直接返回 if (!(workAreaProList.Count == workAreaProList.FindAll(p => string.IsNullOrEmpty(p.CN_S_EXPRESS)).Count)) { workAreaProList = GetMatchPro(entity, workAreaProList); } if (!workAreaProList.Any()) workAreaProList = notExpressWork; } msg.Success = workAreaProList.Any(); msg.Data = workAreaProList; if (!msg.Success) msg.Msg = "请确认货位是否为空筒和半筒位置编码!"; return msg; } #endregion #region 分组匹配条件 /// /// 分组匹配条件 /// /// /// /// private List GetMatchPro(TaskTransferEntity taskEntity, List workAreaProList) { taskEntity.TrayCode = taskEntity.CirObjCode; taskEntity.TrayType = "托盘"; taskEntity.CirObj = Constants.TU_Tray; taskEntity.WorkType = Constants.WorkType_UpperReachesIn; List matchWorkAreaProList = new List(); foreach (var workAreaPro in workAreaProList) { string express = workAreaPro.CN_S_EXPRESS; if (string.IsNullOrEmpty(express)) continue; ConditionConfig conditionEntity = JsonConvert.DeserializeObject(express); if (conditionEntity == null) continue; bool isMatch = GetConditionValue(taskEntity, conditionEntity); if (isMatch) matchWorkAreaProList.Add(workAreaPro); } return matchWorkAreaProList; } #endregion #region 返回匹配逻辑bool /// /// 返回匹配逻辑bool /// /// /// /// private bool GetConditionValue(TaskTransferEntity taskEntity, ConditionConfig conditionEntity) { //逻辑List 下的所有bool值 List boolList = new List(); foreach (var condition in conditionEntity.List) { //可能为逻辑 或者 为符号 JObject _condition = condition as JObject; if (_condition["List"] != null) { //有逻辑的 带List ConditionConfig conditionConfig = JsonConvert.DeserializeObject(condition.ToString()); //继续 return GetConditionValue(taskEntity, conditionConfig); } else { //符号的 直接匹配到返回bool RelationConfig relationConfig = JsonConvert.DeserializeObject(condition.ToString()); bool relationValue = GetRelationValue(taskEntity, relationConfig); //是or,有一个true,直接返回true if (conditionEntity.LType == LogicSymBol.Or) { if (relationValue) return true; } //添加bool到List boolList.Add(relationValue); } } switch (conditionEntity.LType) { case LogicSymBol.And: return !boolList.Contains(false); case LogicSymBol.Or: return boolList.Contains(true); } return false; } #endregion #region 返回匹配关系bool /// /// 返回匹配关系bool /// /// /// /// private bool GetRelationValue(TaskTransferEntity taskEntity, RelationConfig relationEntity) { string taskValue = string.Empty; PropertyInfo[] props = taskEntity.GetType().GetProperties(); foreach (var prop in props) { if (prop.Name.Equals(relationEntity.Name)) { //特殊处理的条件 switch (prop.Name) { case "IsFullTray"://整托 taskEntity.IsFullTray = "N"; if (taskEntity.IsTrayAll.HasValue) { taskEntity.IsFullTray = taskEntity.IsTrayAll.Value ? "Y" : "N"; } break; case "IsEmptyTray"://空托 taskEntity.IsEmptyTray = "N"; if (taskEntity.ConditionDefine.IsEmptyTray.HasValue) { taskEntity.IsEmptyTray = taskEntity.ConditionDefine.IsEmptyTray.Value ? "Y" : "N"; } else { if (taskEntity.CirObj == "托盘" && !string.IsNullOrEmpty(taskEntity.CirObjCode)) { var _trayItemRel = CreateDAL().GetItemRelModel("WHERE CN_S_ITEM_CODE='" + taskEntity.CirObjCode + "'"); if (!_trayItemRel.Any()) { taskEntity.IsEmptyTray = "Y"; } } } break; case "ItemState"://物料状态 taskEntity.ItemState = ""; if (!string.IsNullOrEmpty(taskEntity.ConditionDefine.ItemState)) { taskEntity.ItemState = taskEntity.ConditionDefine.ItemState; } else { if (taskEntity.CirObj == "物料" && !string.IsNullOrEmpty(taskEntity.CirObjCode)) { var _trayItemRel = CreateDAL().GetItemRelModel("WHERE CN_S_TRAY_CODE='" + taskEntity.CirObjCode + "'"); if (_trayItemRel.Any()) { taskEntity.ItemState = _trayItemRel[0].CN_S_ITEM_STATE; } } } break; } taskValue = Util.ToString(prop.GetValue(taskEntity, null)); } } bool equal = taskValue.Equals(relationEntity.Value); switch (relationEntity.RType) { case RelationSymBol.Eq: return equal; case RelationSymBol.Ne: return !equal; } return false; } #endregion #region 设置是否合并,拣货模式 /// ///设置是否合并,拣货模式 /// /// /// private void SetTaskEntity(List sortingList, TaskTransferEntity taskEntity) { if (sortingList.Any()) { IEnumerable> ig = sortingList.GroupBy(p => p.CN_S_GROUP); taskEntity.PickModel = sortingList[0].CN_S_SEEDING_MODE; taskEntity.NeedMerge = "N"; foreach (var _ig in ig) { if (_ig.Count() > 1) { taskEntity.NeedMerge = "Y"; break; } } } } #endregion } }