using HH.WMS.BLL.Basic;
using HH.WMS.BLL.OutStock;
using HH.WMS.Common;
using HH.WMS.Entitys;
using HH.WMS.Entitys.Basic;
using HH.WMS.Entitys.Common;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Threading.Tasks;
namespace HH.WMS.BLL.Common
{
public class WorkflowBLL : DapperBaseBLL
{
#region 找站点
///
/// 找站点
///
///
///
public OperateResult GetWorkPosition(WorkflowEntity entity)
{
try
{
//起点货位获取库区
if (string.IsNullOrEmpty(entity.StartArea) && !string.IsNullOrEmpty(entity.StartBit))
{
var location = BLLCreator.Create().GetLocationModel(entity.StartBit)
?? new AutoBomLocationEntity();
entity.StartArea = location.CN_S_AREA_CODE;
}
//终点货位获取库区
if (string.IsNullOrEmpty(entity.EndArea) && !string.IsNullOrEmpty(entity.EndBit))
{
var location = BLLCreator.Create().GetLocationModel(entity.EndBit)
?? new AutoBomLocationEntity();
entity.EndArea = location.CN_S_AREA_CODE;
}
var workAreaPros = BLLCreator.Create().GetWorkAreaPro(entity.Type, entity.StartArea, entity.EndArea);
if (workAreaPros.Any())
{
var notExpressWork = workAreaPros.FindAll(p => string.IsNullOrEmpty(p.CN_S_EXPRESS));
//有条件才会匹配,否则直接返回
if (!(workAreaPros.Count == notExpressWork.Count))
{
workAreaPros = GetMatchPro(entity, workAreaPros);
}
if (!workAreaPros.Any())
workAreaPros = notExpressWork;
}
if (workAreaPros.Any())
{
if (entity.ReturnList)
return OperateResult.Succeed(null, workAreaPros);
return OperateResult.Succeed(null, workAreaPros[0]);
}
return OperateResult.Error("未找到站点,请检查配置");
}
catch (Exception ex)
{
return OperateResult.Error(ex.Message);
}
}
#endregion
#region 匹配有条件的
///
/// 匹配有条件的
///
///
///
///
public List GetMatchPro(WorkflowEntity workflowEntity, List workAreaPros)
{
//托盘
if (workflowEntity.CirObj == Constants.Tray)
{
workflowEntity.TrayType = Constants.Tray;
var trayItems = BLLCreator.CreateDapper().GetList(new
{
CN_S_TRAY_CODE = workflowEntity.CirObjCode
});
workflowEntity.IsEmptyTray = "N";
if (!trayItems.Any())
{
workflowEntity.IsEmptyTray = "Y";
}
}
//周转箱
if (workflowEntity.CirObj == Constants.TurnoverBox)
{
workflowEntity.TrayType = Constants.TurnoverBox;
}
//分拣单
if (workflowEntity.CirObj == Constants.Rule_SortingNo)
{
var sortingEntity = BLLCreator.CreateDapper().GetSingleEntity(new
{
CN_S_SORTING_NO = workflowEntity.CirObjCode
});
if (sortingEntity != null)
workflowEntity.PickModel = sortingEntity.CN_S_SEEDING_MODE;
}
//出库单
if (workflowEntity.CirObj == Constants.Rule_OutNo)
{
var outEntity = BLLCreator.CreateDapper().GetSingleEntity(new
{
CN_S_OP_NO = workflowEntity.CirObjCode
});
if (outEntity != null)
workflowEntity.SalesStyle = outEntity.CN_S_SALES_STYLE;
}
//匹配的记录
var matchWorkAreaProList = new List();
foreach (var workAreaPro in workAreaPros)
{
string express = workAreaPro.CN_S_EXPRESS;
if (string.IsNullOrEmpty(express)) continue;
ConditionConfig conditionEntity = JsonConvert.DeserializeObject(express);
if (conditionEntity == null) continue;
bool isMatch = GetConditionValue(workflowEntity, conditionEntity);
if (isMatch)
matchWorkAreaProList.Add(workAreaPro);
}
return matchWorkAreaProList;
}
#endregion
#region 返回匹配逻辑bool
///
/// 返回匹配逻辑bool
///
///
///
///
private bool GetConditionValue(WorkflowEntity workflowEntity, 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(workflowEntity, conditionConfig);
}
else
{
//符号的 直接匹配到返回bool
RelationConfig relationConfig = JsonConvert.DeserializeObject(condition.ToString());
bool relationValue = GetRelationValue(workflowEntity, relationConfig);
//是or,有一个true,直接返回true
if (conditionEntity.Logic == LogicSymBol.Or)
{
if (relationValue)
return true;
}
//添加bool到List
boolList.Add(relationValue);
}
}
switch (conditionEntity.Logic)
{
case LogicSymBol.And:
return !boolList.Contains(false);
case LogicSymBol.Or:
return boolList.Contains(true);
}
return false;
}
#endregion
#region 返回匹配关系bool
///
/// 返回匹配关系bool
///
///
///
///
private bool GetRelationValue(WorkflowEntity workflowEntity, RelationConfig relationEntity)
{
string taskValue = string.Empty;
PropertyInfo[] props = workflowEntity.GetType().GetProperties();
foreach (var prop in props)
{
if (prop.Name.Equals(relationEntity.Name))
{
taskValue = Util.ToString(prop.GetValue(workflowEntity, null));
}
}
bool equal = taskValue.Equals(relationEntity.Value);
switch (relationEntity.Symbol)
{
case RelationSymBol.Eq: return equal;
case RelationSymBol.Ne: return !equal;
}
return false;
}
#endregion
}
}