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
}
}