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
|
{
|
/// <summary>
|
/// 出作业区任务
|
/// </summary>
|
public class ExternalOutWorkAreaBLL : BaseBLL
|
{
|
private static string _className = "HH.BWMS.BLL.External.ExternalOutWorkAreaBLL.";
|
|
#region 算法计算货位 + CalculateLoaction
|
/// <summary>
|
/// 算法计算货位
|
/// </summary>
|
/// <param name="executeOutWorkAreaPara"></param>
|
/// <returns></returns>
|
public ExecuteOutWorkAreaPara CalculateLoaction(ExecuteOutWorkAreaPara executeOutWorkAreaPara)
|
{
|
executeOutWorkAreaPara.ItemQueryClassList = new List<itemQueryClass>();
|
|
if (executeOutWorkAreaPara.OutWorkAreaEntity.Data != null)
|
{
|
foreach (var itemData in executeOutWorkAreaPara.OutWorkAreaEntity.Data)
|
{
|
if (!string.IsNullOrEmpty(itemData.TrayCode))
|
{
|
#region 按照托盘出库
|
//起点货位
|
executeOutWorkAreaPara.TrayObjLocation = CreateDAL<TN_WM_B_TRAY_LOCATIONDAL>().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<TN_AB_STOCK_LOCATIONDAL>().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<TN_WM_LOCATION_EXTDAL>().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<TN_WMS_LOCATIONDAL>().GetModel(executeOutWorkAreaPara.TrayObjLocation.CN_S_LOCATION_CODE);
|
BLLCreator.Create<TN_WM_B_LOCATION_CHANGEBLL>().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
|
|
/// <summary>
|
/// 调用算法
|
/// </summary>
|
/// <param name="executeOutWorkAreaPara"></param>
|
/// <returns></returns>
|
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<Out_AlgorBLL>().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
|
|
}
|
}
|