using HH.WMS.BLL.Basic;
|
using HH.WMS.BLL.SysMgr;
|
using HH.WMS.Common;
|
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.DAL.SysMgr;
|
using HH.WMS.Entitys;
|
using HH.WMS.Entitys.Basic;
|
using HH.WMS.Entitys.Common;
|
using HH.WMS.Entitys.Entitys;
|
using HH.WMS.Entitys.External;
|
using Newtonsoft.Json;
|
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 ExternalBLL : DapperBaseBLL
|
{
|
private static string _className = "ExternalBLL";
|
|
#region 入作业区批量 + InWorkArea
|
/// <summary>
|
/// 入作业区批量
|
/// </summary>
|
/// <param name="inWorkAreaList"></param>
|
/// <returns></returns>
|
public ExternalResponse InWorkArea(List<InWorkAreaEntity> inWorkAreaList)
|
{
|
_className += "_InWorkArea";
|
|
var response = new ExternalResponse();
|
if (inWorkAreaList == null) return response.Error<InWorkAreaEntity>(null, "参数不正确!");
|
for (var i = 0; i < inWorkAreaList.Count; i++)
|
{
|
if (string.IsNullOrEmpty(inWorkAreaList[i].sysName))
|
{
|
inWorkAreaList[i].sysName = "AMS";
|
}
|
var result = ExecuteInWorkArea(inWorkAreaList[i], i);
|
if (result.BasisResponse.Success)
|
{
|
response.success = true;
|
response.okList.Add(result.TaskExecuteState.okTask);
|
}
|
else
|
{
|
response.failList.Add(result.TaskExecuteState.Error(i, result.BasisResponse.Message).FailTask);
|
//入库转运锁定起点的,如果执行不成功则解锁
|
if (result.RollbackLocations.Count > 0)
|
{
|
foreach (string sLocation in result.RollbackLocations)
|
{
|
BLLCreator.Create<TN_WM_LOCATION_EXTBLL>().UpdateState(sLocation, Constants.Location_State_Normal, "");
|
AutoBomLocationEntity locationModel = CreateDAL<TN_WMS_LOCATIONDAL>().GetModel(sLocation);
|
BLLCreator.Create<TN_WM_B_LOCATION_CHANGEBLL>().AddStateChange(sLocation, "", "正常", "入库请求失败回滚过程中锁定的货位", inWorkAreaList[i].sysName, "", "", locationModel.CN_S_STOCK_CODE, locationModel.CN_S_AREA_CODE, null);
|
}
|
}
|
|
//删除当前托盘的任务
|
CreateDAL<DapperDAL<TN_WM_TASKEntity>>().Delete(new { CN_S_TRAY_CODE = result.InWorkAreaEntity.trayCode, CN_S_STATE = "未执行" });
|
}
|
}
|
|
return response.failList.Any() ? response.Error(null, string.Empty, inWorkAreaList) : response.Ok(null, inWorkAreaList);
|
}
|
#endregion
|
|
#region 入作业区执行 + ExecuteInWorkArea
|
/// <summary>
|
/// 入作业区
|
/// </summary>
|
/// <param name="inWorkAreaEntity"></param>
|
/// <param name="index">索引</param>
|
/// <returns></returns>
|
private ExecuteInWorkAreaPara ExecuteInWorkArea(InWorkAreaEntity inWorkAreaEntity, int index)
|
{
|
var executeInWorkAreaPara = new ExecuteInWorkAreaPara { InWorkAreaEntity = inWorkAreaEntity };
|
|
try
|
{
|
#region 参数验证
|
executeInWorkAreaPara = ParameterVerifyBLL.VerifyInWorkArea(executeInWorkAreaPara);
|
if (!executeInWorkAreaPara.BasisResponse.Success) return executeInWorkAreaPara;
|
#endregion
|
|
#region 参数处理
|
executeInWorkAreaPara = ParameterHandleBLL.HandleInWorkArea(executeInWorkAreaPara);
|
if (!executeInWorkAreaPara.BasisResponse.Success) return executeInWorkAreaPara;
|
#endregion
|
|
if (!string.IsNullOrEmpty(executeInWorkAreaPara.InWorkAreaEntity.endBit))
|
{
|
|
var endLocation = CreateDAL<DapperDAL<TN_WM_LOCATION_EXTEntity>>().GetSingleEntity(new { CN_S_LOCATION_CODE = executeInWorkAreaPara.InWorkAreaEntity.endBit });
|
if (endLocation == null)
|
{
|
executeInWorkAreaPara.BasisResponse = BasisResponse.Error("结束货位不正确!");
|
return executeInWorkAreaPara;
|
}
|
|
//结束库区实体
|
var endStockArea = DALCreator.Create<TN_AB_STOCK_LOCATIONDAL>().GetAreaModelByLocation(executeInWorkAreaPara.InWorkAreaEntity.startBit.Trim());
|
if (endStockArea == null)
|
{
|
executeInWorkAreaPara.BasisResponse = BasisResponse.Error("当前结束位置未找到对应的库区!", _className);
|
return executeInWorkAreaPara;
|
}
|
|
#region 创建转运任务
|
executeInWorkAreaPara.TransportEntity.CN_S_TASK_NO = executeInWorkAreaPara.InWorkAreaEntity.taskNo;
|
executeInWorkAreaPara.TransportEntity.CN_S_CIR_OBJ = "托盘";
|
executeInWorkAreaPara.TransportEntity.CN_S_CIR_OBJ_CODE = executeInWorkAreaPara.InWorkAreaEntity.trayCode;
|
executeInWorkAreaPara.TransportEntity.CN_S_START_BIT = executeInWorkAreaPara.InWorkAreaEntity.startBit;
|
executeInWorkAreaPara.TransportEntity.CN_S_STATE = Constants.TaskStateList[0];
|
executeInWorkAreaPara.TransportEntity.CN_N_PRIORITY = executeInWorkAreaPara.InWorkAreaEntity.priority;
|
executeInWorkAreaPara.TransportEntity.CN_T_CREATE = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff");//DateTime.Now.ToString();
|
executeInWorkAreaPara.TransportEntity.CN_T_MODIFY = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff");//DateTime.Now.ToString();
|
executeInWorkAreaPara.TransportEntity.CN_S_REMARK = executeInWorkAreaPara.InWorkAreaEntity.remark;
|
executeInWorkAreaPara.TransportEntity.CN_S_START_AREA = executeInWorkAreaPara.InWorkAreaEntity.startArea;
|
executeInWorkAreaPara.TransportEntity.CN_S_STOCK_CODE = executeInWorkAreaPara.InWorkAreaEntity.startStock;
|
executeInWorkAreaPara.TransportEntity.CN_S_TASK_TYPE = executeInWorkAreaPara.InWorkAreaEntity.isTransport == "Y" ? "转运" : "入库";
|
executeInWorkAreaPara.TransportEntity.CN_S_START_AREA_TYPE = executeInWorkAreaPara.StartStockAreaEntity.CN_S_STRUCTURE;
|
executeInWorkAreaPara.TransportEntity.CN_C_START_IS_CONTROL_QTY = executeInWorkAreaPara.StartStockAreaEntity.CN_C_IS_CONTROL_QTY;
|
executeInWorkAreaPara.TransportEntity.CN_S_START_CONTROL_INV = executeInWorkAreaPara.StartStockAreaEntity.CN_C_IS_INVENTORY;
|
executeInWorkAreaPara.TransportEntity.CN_S_END_BIT = endLocation.CN_S_LOCATION_CODE;
|
executeInWorkAreaPara.TransportEntity.CN_S_END_AREA = endLocation.CN_S_AREA_CODE;
|
executeInWorkAreaPara.TransportEntity.CN_C_END_IS_CONTROL_QTY = endStockArea.CN_C_IS_CONTROL_QTY;
|
executeInWorkAreaPara.TransportEntity.CN_S_END_CONTROL_INV = endStockArea.CN_C_IS_INVENTORY;
|
executeInWorkAreaPara.TransportEntity.CN_S_END_AREA_TYPE = endStockArea.CN_S_STRUCTURE;
|
|
#endregion
|
}
|
else
|
{
|
#region 计算转运路径
|
executeInWorkAreaPara = ExternalInWorkAreaBLL.CalculateTransPath(executeInWorkAreaPara);
|
if (!executeInWorkAreaPara.BasisResponse.Success) return executeInWorkAreaPara;
|
#endregion
|
|
#region 创建转运任务
|
executeInWorkAreaPara.TransportEntity.CN_S_TASK_NO = executeInWorkAreaPara.InWorkAreaEntity.taskNo;
|
executeInWorkAreaPara.TransportEntity.CN_S_CIR_OBJ = "托盘";
|
executeInWorkAreaPara.TransportEntity.CN_S_CIR_OBJ_CODE = executeInWorkAreaPara.InWorkAreaEntity.trayCode;
|
executeInWorkAreaPara.TransportEntity.CN_S_START_BIT = executeInWorkAreaPara.InWorkAreaEntity.startBit;
|
executeInWorkAreaPara.TransportEntity.CN_S_STATE = Constants.TaskStateList[0];
|
executeInWorkAreaPara.TransportEntity.CN_N_PRIORITY = executeInWorkAreaPara.InWorkAreaEntity.priority;
|
executeInWorkAreaPara.TransportEntity.CN_T_CREATE = DateTime.Now.ToString(CultureInfo.InvariantCulture);
|
executeInWorkAreaPara.TransportEntity.CN_T_MODIFY = DateTime.Now.ToString(CultureInfo.InvariantCulture);
|
executeInWorkAreaPara.TransportEntity.CN_S_REMARK = executeInWorkAreaPara.InWorkAreaEntity.remark;
|
executeInWorkAreaPara.TransportEntity.CN_S_START_AREA = executeInWorkAreaPara.InWorkAreaEntity.startArea;
|
executeInWorkAreaPara.TransportEntity.CN_S_STOCK_CODE = executeInWorkAreaPara.InWorkAreaEntity.startStock;
|
executeInWorkAreaPara.TransportEntity.CN_S_TASK_TYPE = executeInWorkAreaPara.InWorkAreaEntity.isTransport == "Y" ? "转运" : "入库";
|
executeInWorkAreaPara.TransportEntity.CN_S_START_AREA_TYPE = executeInWorkAreaPara.StartStockAreaEntity.CN_S_STRUCTURE;
|
executeInWorkAreaPara.TransportEntity.CN_C_START_IS_CONTROL_QTY = executeInWorkAreaPara.StartStockAreaEntity.CN_C_IS_CONTROL_QTY;
|
executeInWorkAreaPara.TransportEntity.CN_S_START_CONTROL_INV = executeInWorkAreaPara.StartStockAreaEntity.CN_C_IS_INVENTORY;
|
|
#endregion
|
|
#region 算法计算终点货位
|
executeInWorkAreaPara = ExternalInWorkAreaBLL.InAss(executeInWorkAreaPara);
|
Log.Detail("入作业区", "算法计算终点货位结果:" + JsonConvert.SerializeObject(executeInWorkAreaPara.BasisResponse) + "货位号:" + executeInWorkAreaPara.TransportEntity.CN_S_END_BIT);
|
|
if (!executeInWorkAreaPara.BasisResponse.Success) return executeInWorkAreaPara;
|
#endregion
|
}
|
|
#region 事务 执行存储过程(处理托盘、托盘产品关联、生成任务、设置任务号、更新货位状态)
|
var result = UseTransaction(trans => {
|
|
if (executeInWorkAreaPara.InWorkAreaEntity.data != null)
|
{
|
if (executeInWorkAreaPara.InWorkAreaEntity.data.Count > 0)
|
{
|
//删除托盘产品关联
|
CreateDAL<DAL.InStock.TN_WM_B_TRAY_ITEM_RELDAL>().DeleteTrayItem(" CN_S_TRAY_CODE='" + executeInWorkAreaPara.InWorkAreaEntity.trayCode + "' ", trans);
|
|
foreach (var item in executeInWorkAreaPara.InWorkAreaEntity.data)
|
{
|
var trayItemMstGuid = Guid.NewGuid().ToString();
|
//添加托盘物料关联主表
|
var transResult = CreateDAL<HH.WMS.DAL.InStock.TN_WM_B_TRAY_ITEM_RELDAL>().AddMst(new TN_WM_B_TRAY_ITEM_MSTEntity
|
{
|
CN_GUID = trayItemMstGuid,
|
CN_S_TRAY_CODE = executeInWorkAreaPara.InWorkAreaEntity.trayCode,
|
CN_S_ITEM_CODE = item.itemCode,
|
CN_S_ITEM_NAME = item.itemName,
|
CN_S_ITEM_STATE = item.itemState == null ? "" : item.itemState,
|
CN_F_QUANTITY = item.qty,
|
CN_S_MEASURE_UNIT = item.itemPackUnit,
|
CN_F_ALLOC_QTY = item.qty,
|
CN_S_MODEL = item.itemModel
|
}, trans);
|
|
if (!transResult.Success)
|
{
|
trans.Rollback();
|
return;
|
}
|
|
//添加托盘物料关联子表
|
var curResult = CreateDAL<HH.WMS.DAL.InStock.TN_WM_B_TRAY_ITEM_RELDAL>().AddDtl(new List<TN_WM_B_TRAY_ITEM_DTLEntity>()
|
{
|
new TN_WM_B_TRAY_ITEM_DTLEntity{
|
CN_PARENT_GUID = trayItemMstGuid,
|
CN_S_LOT_NO = item.lotNo,
|
CN_S_UNIQUE_CODE = item.uniqueCode,
|
CN_S_PACKING_UNIT = item.itemPackUnit,
|
CN_F_PACKING_QTY = item.qty,
|
CN_F_QUANTITY = item.qty,
|
CN_T_PRODUCTION = item.productionDate,
|
CN_S_CREATOR = "hh",
|
CN_S_CREATOR_BY = "",
|
CN_T_CREATE = DateTime.Now,
|
CN_GUID = Guid.NewGuid().ToString(),
|
sqlwhere = " WHERE CN_PARENT_GUID='" + trayItemMstGuid + "' "
|
}
|
}, trans);
|
transResult = new OperateResult { Success = curResult.Success, Msg = curResult.Success ? "" : curResult.Exception.Message };
|
if (!transResult.Success)
|
{
|
trans.Rollback();
|
return;
|
}
|
}
|
}
|
}
|
|
|
|
var transport = executeInWorkAreaPara.TransportEntity;
|
|
//创建任务
|
var operateResult = BLLCreator.Create<DapperBLL<TN_WM_TASKEntity>>().Add(new TN_WM_TASKEntity
|
{
|
CN_S_TASK_NO = transport.CN_S_TASK_NO,
|
CN_S_TRAY_CODE = transport.CN_S_CIR_OBJ_CODE,
|
CN_S_START_BIT = transport.CN_S_START_BIT,
|
CN_S_END_BIT = transport.CN_S_END_BIT,
|
//CN_S_PRO_CODE = transport.CN_S_PRO_CODE,
|
CN_S_STATE = transport.CN_S_STATE,
|
CN_S_BF_TASK_NO = transport.CN_S_BF_TASK_NO,
|
CN_S_AF_TASK_NO = transport.CN_S_AF_TASK_NO,
|
CN_S_STOCK_CODE = transport.CN_S_STOCK_CODE,
|
CN_S_START_AREA = transport.CN_S_START_AREA,
|
CN_S_END_AREA = transport.CN_S_END_AREA,
|
CN_N_PRIORITY = transport.CN_N_PRIORITY,
|
CN_S_CREATOR = transport.CN_S_CREATOR,
|
CN_S_CREATOR_BY = transport.CN_S_CREATOR_BY,
|
CN_T_CREATE = Convert.ToDateTime(transport.CN_T_CREATE),
|
CN_T_MODIFY = Convert.ToDateTime(transport.CN_T_MODIFY),
|
CN_S_REMARK = transport.CN_S_REMARK,
|
//CN_C_IS_AUTO = transport.CN_C_IS_AUTO,
|
CN_S_TASK_TYPE = transport.CN_S_TASK_TYPE,
|
CN_C_START_IS_CONTROL_QTY = transport.CN_C_START_IS_CONTROL_QTY,
|
CN_C_END_IS_CONTROL_QTY = transport.CN_C_END_IS_CONTROL_QTY,
|
CN_S_START_CONTROL_INV = transport.CN_S_START_CONTROL_INV,
|
CN_S_END_CONTROL_INV = transport.CN_S_END_CONTROL_INV,
|
CN_S_START_AREA_TYPE = transport.CN_S_START_AREA_TYPE,
|
CN_S_END_AREA_TYPE = transport.CN_S_END_AREA_TYPE,
|
CN_S_FROM_OP = "入库/转运"
|
//CN_S_PROJECT_CODE = executeOutWorkAreaPara.OutWorkAreaEntity.projectCode
|
});
|
|
//更新结束点的任务号
|
if (executeInWorkAreaPara.TransportEntity.CN_C_END_IS_CONTROL_QTY.Equals("Y"))
|
{
|
CreateDAL<TN_WM_LOCATION_EXTDAL>().UpdateLocationExtState(executeInWorkAreaPara.TransportEntity.CN_S_END_BIT, "", "", executeInWorkAreaPara.TransportEntity.CN_S_TASK_NO, trans);
|
}
|
//if (executeInWorkAreaPara.TransportEntity.CN_S_END_AREA_TYPE.Equals("平库") || executeInWorkAreaPara.TransportEntity.CN_S_END_AREA_TYPE.Equals("立库")){}
|
|
//更新起点的任务号
|
if (executeInWorkAreaPara.TransportEntity.CN_C_START_IS_CONTROL_QTY.Equals("Y") && executeInWorkAreaPara.InWorkAreaEntity.isTransport.Equals("Y"))
|
{
|
CreateDAL<TN_WM_LOCATION_EXTDAL>().UpdateLocationExtState(executeInWorkAreaPara.TransportEntity.CN_S_START_BIT, "", "", executeInWorkAreaPara.TransportEntity.CN_S_TASK_NO, trans);
|
}
|
//if (executeInWorkAreaPara.TransportEntity.CN_S_START_AREA_TYPE.Equals("平库") || executeInWorkAreaPara.TransportEntity.CN_S_START_AREA_TYPE.Equals("立库")){}
|
});
|
|
#endregion
|
|
#region 处理结果
|
if (!result.Success)
|
{
|
executeInWorkAreaPara.BasisResponse = BasisResponse.Error("执行存储过程失败!" + result.Msg, _className);
|
return executeInWorkAreaPara;
|
}
|
|
if (executeInWorkAreaPara.TransportEntity.CN_S_END_AREA_TYPE == Constants.Area_Struc_LiuLiStock || executeInWorkAreaPara.TransportEntity.CN_S_END_AREA_TYPE == Constants.Area_Struc_DuiDieStock)
|
{
|
executeInWorkAreaPara.TransportEntity.CN_S_END_BIT += "-" + executeInWorkAreaPara.TransportEntity.CN_S_QTY_INDEX;
|
}
|
executeInWorkAreaPara.TaskExecuteState = new TaskExecuteState().Ok(new OkTask()
|
{
|
index = index,
|
taskNo = executeInWorkAreaPara.TransportEntity.CN_S_TASK_NO,
|
startStock = executeInWorkAreaPara.TransportEntity.CN_S_STOCK_CODE,
|
startArea = executeInWorkAreaPara.TransportEntity.CN_S_START_AREA,
|
startBit = executeInWorkAreaPara.TransportEntity.CN_S_START_BIT,
|
endStock = executeInWorkAreaPara.TransportEntity.CN_S_STOCK_CODE,
|
endArea = executeInWorkAreaPara.TransportEntity.CN_S_END_AREA,
|
endBit = executeInWorkAreaPara.TransportEntity.CN_S_END_BIT,
|
priority = executeInWorkAreaPara.TransportEntity.CN_N_PRIORITY,
|
trayCode = executeInWorkAreaPara.TransportEntity.CN_S_CIR_OBJ_CODE,
|
startAreaClass = executeInWorkAreaPara.TransportEntity.CN_S_START_AREA_TYPE,
|
endAreaClass = executeInWorkAreaPara.TransportEntity.CN_S_END_AREA_TYPE
|
});
|
#endregion
|
}
|
catch (Exception ex)
|
{
|
executeInWorkAreaPara.BasisResponse = BasisResponse.Error("ExecuteInWorkArea 方法异常:" + JsonConvert.SerializeObject(ex.Message + ex.StackTrace));
|
}
|
|
return executeInWorkAreaPara;
|
}
|
#endregion
|
|
#region 出作业区 + OutWorkArea
|
/// <summary>
|
/// 出作业区批量
|
/// </summary>
|
/// <param name="outWorkAreaList"></param>
|
/// <returns></returns>
|
public ExternalResponse OutWorkArea(List<OutWorkAreaEntity> outWorkAreaList)
|
{
|
var response = new ExternalResponse();
|
if (outWorkAreaList == null) return response.Error<OutWorkAreaEntity>(null, "参数不正确!");
|
for (var i = 0; i < outWorkAreaList.Count; i++)
|
{
|
if (string.IsNullOrEmpty(outWorkAreaList[i].sysName))
|
{
|
outWorkAreaList[i].sysName = "AMS";
|
}
|
var result = ExecuteOutWorkArea(outWorkAreaList[i], i);
|
if (result.BasisResponse.Success)
|
{
|
response.success = true;
|
response.okList.Add(result.TaskExecuteState.okTask);
|
}
|
else
|
{
|
response.failList.Add(new TaskExecuteState().Error(i, result.BasisResponse.Message).FailTask);
|
if (result.RollLocations.Count > 0)
|
{
|
foreach (string sLocation in result.RollLocations)
|
{
|
BLLCreator.Create<TN_WM_LOCATION_EXTBLL>().UpdateState(sLocation, Constants.Location_State_Normal, "");
|
AutoBomLocationEntity locationModel = CreateDAL<TN_WMS_LOCATIONDAL>().GetModel(sLocation);
|
BLLCreator.Create<TN_WM_B_LOCATION_CHANGEBLL>().AddStateChange(sLocation, "", "正常", "出库请求失败回滚过程中锁定的货位", outWorkAreaList[i].sysName, "", "", locationModel.CN_S_STOCK_CODE, locationModel.CN_S_AREA_CODE, null);
|
}
|
}
|
}
|
}
|
return response.failList.Any() ? response.Error(null, string.Empty, outWorkAreaList) : response.Ok(null, outWorkAreaList);
|
}
|
#endregion
|
|
#region 出作业区执行 + ExecuteOutWorkArea
|
/// <summary>
|
/// 出作业区执行
|
/// </summary>
|
/// <param name="outWorkAreaEntity"></param>
|
/// <param name="index"></param>
|
/// <returns></returns>
|
private ExecuteOutWorkAreaPara ExecuteOutWorkArea(OutWorkAreaEntity outWorkAreaEntity, int index)
|
{
|
_className += ".ExecuteOutWorkArea";
|
var executeOutWorkAreaPara = new ExecuteOutWorkAreaPara { OutWorkAreaEntity = outWorkAreaEntity };
|
try
|
{
|
#region 参数验证
|
executeOutWorkAreaPara = ParameterVerifyBLL.VerifyOutWorkArea(executeOutWorkAreaPara);
|
if (!executeOutWorkAreaPara.BasisResponse.Success) return executeOutWorkAreaPara;
|
#endregion
|
|
#region 参数处理
|
executeOutWorkAreaPara = ParameterHandleBLL.HandleOutWorkArea(executeOutWorkAreaPara);
|
if (!executeOutWorkAreaPara.BasisResponse.Success) return executeOutWorkAreaPara;
|
#endregion
|
|
#region 算法计算货位
|
if (string.IsNullOrEmpty(executeOutWorkAreaPara.OutWorkAreaEntity.startBit))
|
{
|
executeOutWorkAreaPara = new ExternalOutWorkAreaBLL().CalculateLoaction(executeOutWorkAreaPara);
|
if (!executeOutWorkAreaPara.BasisResponse.Success) return executeOutWorkAreaPara;
|
}
|
#endregion
|
|
#region 事务 执行存储过程()
|
|
//任务
|
var transport = executeOutWorkAreaPara.TransportList.FirstOrDefault();
|
|
//添加任务
|
var sqlResult = BLLCreator.Create<DapperBLL<TN_WM_TASKEntity>>().Add(new TN_WM_TASKEntity
|
{
|
CN_S_TASK_NO = transport.CN_S_TASK_NO,
|
CN_S_TRAY_CODE = transport.CN_S_CIR_OBJ_CODE,
|
CN_S_START_BIT = transport.CN_S_START_BIT,
|
CN_S_END_BIT = transport.CN_S_END_BIT,
|
//CN_S_PRO_CODE = transport.CN_S_PRO_CODE,
|
CN_S_STATE = transport.CN_S_STATE,
|
CN_S_BF_TASK_NO = transport.CN_S_BF_TASK_NO,
|
CN_S_AF_TASK_NO = transport.CN_S_AF_TASK_NO,
|
CN_S_STOCK_CODE = transport.CN_S_STOCK_CODE,
|
CN_S_START_AREA = transport.CN_S_START_AREA,
|
CN_S_END_AREA = transport.CN_S_END_AREA,
|
CN_N_PRIORITY = transport.CN_N_PRIORITY,
|
CN_S_CREATOR = transport.CN_S_CREATOR,
|
CN_S_CREATOR_BY = transport.CN_S_CREATOR_BY,
|
CN_T_CREATE = Convert.ToDateTime(transport.CN_T_CREATE),
|
CN_T_MODIFY = Convert.ToDateTime(transport.CN_T_MODIFY),
|
CN_S_REMARK = transport.CN_S_REMARK,
|
//CN_C_IS_AUTO = transport.CN_C_IS_AUTO,
|
CN_S_TASK_TYPE = transport.CN_S_TASK_TYPE,
|
CN_C_START_IS_CONTROL_QTY = transport.CN_C_START_IS_CONTROL_QTY,
|
CN_C_END_IS_CONTROL_QTY = transport.CN_C_END_IS_CONTROL_QTY,
|
CN_S_START_CONTROL_INV = transport.CN_S_START_CONTROL_INV,
|
CN_S_END_CONTROL_INV = transport.CN_S_END_CONTROL_INV,
|
CN_S_START_AREA_TYPE = transport.CN_S_START_AREA_TYPE,
|
CN_S_END_AREA_TYPE = transport.CN_S_END_AREA_TYPE,
|
//CN_S_PROJECT_CODE = executeOutWorkAreaPara.OutWorkAreaEntity.projectCode
|
});
|
|
//更新起点的任务号
|
if (transport.CN_S_START_AREA_TYPE.Equals("平库") || transport.CN_S_START_AREA_TYPE.Equals("立库"))
|
{
|
if (transport.CN_C_START_IS_CONTROL_QTY.Equals("Y"))
|
{
|
sqlResult = CreateDAL<TN_WM_LOCATION_EXTDAL>().UpdateLocationExtState(transport.CN_S_START_BIT, "", "", transport.CN_S_TASK_NO, null);
|
}
|
}
|
|
//更新结束点的任务号
|
if (transport.CN_S_END_AREA_TYPE.Equals("平库") || transport.CN_S_END_AREA_TYPE.Equals("立库"))
|
{
|
if (transport.CN_C_END_IS_CONTROL_QTY.Equals("Y") && executeOutWorkAreaPara.OutWorkAreaEntity.IsTransport.Equals("Y"))
|
{
|
sqlResult = CreateDAL<TN_WM_LOCATION_EXTDAL>().UpdateLocationExtState(transport.CN_S_END_BIT, "", "", transport.CN_S_TASK_NO, null);
|
}
|
}
|
|
#region 出库影响库存,已注释
|
|
////托盘物料关联数据
|
//var trayItemMst = CreateDAL<DapperBaseDAL>().ExecuteQuery<TN_WM_B_TRAY_ITEM_MSTEntity>(" SELECT * FROM TN_WM_B_TRAY_ITEM_MST WHERE CN_S_TRAY_CODE='" + transport.CN_S_CIR_OBJ_CODE + "' ").FirstOrDefault();
|
//var trayItemDtl = CreateDAL<DapperBaseDAL>().ExecuteQuery<TN_WM_B_TRAY_ITEM_MSTEntity>(" SELECT * FROM TN_WM_B_TRAY_ITEM_DTL ", new {
|
// CN_PARENT_GUID=trayItemMst.CN_GUID
|
//}).FirstOrDefault();
|
|
//if (transport.CN_C_START_IS_CONTROL_QTY.Equals("Y") && transport.CN_S_START_CONTROL_INV.Equals("Y"))
|
//{
|
// //仓库量表
|
// var stockQtys = CreateDAL<DapperBaseDAL>().ExecuteQuery<TN_WM_B_STOCK_QTYEntity>(" SELECT * FROM tn_wm_b_stock_qty ", new {
|
// CN_S_STOCK_CODE = trayItemMst.CN_S_STOCK_CODE,
|
// CN_S_ITEM_CODE=trayItemMst.CN_S_ITEM_CODE,
|
// CN_S_ITEM_STATE=trayItemMst.CN_S_ITEM_STATE,
|
// CN_S_LOT_NO=trayItemDtl.CN_S_LOT_NO
|
// });
|
|
// if (stockQtys.Count > 0)
|
// {
|
// //升库存
|
// stockQtys.First().CN_F_ALLOC_QTY += (decimal) trayItemMst.CN_F_PACKING_QTY;
|
// CreateDAL<HH.WMS.DAL.Basic.TN_WM_B_STOCK_QTYDAL>().UpdateStockAllocQty(stockQtys, null);
|
// }
|
|
// //库区量表
|
// var areaQtys = CreateDAL<DapperBaseDAL>().ExecuteQuery<TN_WM_B_AREA_QTYEntity>(" SELECT * FROM tn_wm_b_stock_qty ", new
|
// {
|
// CN_S_STOCK_CODE = trayItemMst.CN_S_STOCK_CODE,
|
// CN_S_STOCK_AREA = trayItemMst.CN_S_IN_AREA_CODE,
|
// CN_S_ITEM_CODE = trayItemMst.CN_S_ITEM_CODE,
|
// CN_S_ITEM_STATE = trayItemMst.CN_S_ITEM_STATE,
|
// CN_S_LOT_NO = trayItemDtl.CN_S_LOT_NO
|
// });
|
|
// if (areaQtys.Count > 0)
|
// {
|
// //升库存
|
// areaQtys.First().CN_F_ALLOC_QTY += (decimal)trayItemMst.CN_F_PACKING_QTY;
|
// CreateDAL<HH.WMS.DAL.Basic.TN_WM_B_AREA_QTYDAL>().UpdateAreaAlloc(areaQtys, null);
|
// }
|
//}
|
|
#endregion
|
|
if (!sqlResult.Success)
|
{
|
executeOutWorkAreaPara.BasisResponse = BasisResponse.Error("执行存储过程失败!" + sqlResult.Msg, _className);
|
return executeOutWorkAreaPara;
|
}
|
#endregion
|
|
#region 处理结果
|
executeOutWorkAreaPara.TaskExecuteState = new TaskExecuteState().Ok(ParameterHandleBLL.HandleOutWorkAreaResponse(executeOutWorkAreaPara.TransportList[0], index), null);
|
#endregion
|
|
}
|
catch (Exception ex)
|
{
|
executeOutWorkAreaPara.BasisResponse = BasisResponse.Error("executeOutWorkArea 方法异常:" + JsonConvert.SerializeObject(ex.Message + ex.StackTrace));
|
}
|
return executeOutWorkAreaPara;
|
}
|
#endregion
|
|
#region 完工回报 + ExecuteState
|
|
public OperateResult ExecuteState(string taskNo, string taskState, LogPara logPara)
|
{
|
//TODO 加项目编号
|
|
var executeStatePara = new ExecuteStateParaDto();
|
|
var result = new OperateResult();
|
|
//查询任务
|
executeStatePara.transportTask = CreateDAL<DapperDAL<TN_WM_TASKEntity>>().GetSingleEntity(new { CN_S_TASK_NO = taskNo });
|
Log.Detail(logPara, LogDescribe.Content(executeStatePara.transportTask));
|
|
//起点货位是否绑定托盘
|
executeStatePara.startTrayLocation = CreateDAL<DapperDAL<TN_WM_B_TRAY_LOCATIONEntity>>().GetSingleEntity(new { CN_S_LOCATION_CODE = executeStatePara.transportTask.CN_S_START_BIT, executeStatePara.transportTask.CN_S_TRAY_CODE });
|
//终点货位是否绑定托盘
|
executeStatePara.endTrayLocation = CreateDAL<DapperDAL<TN_WM_B_TRAY_LOCATIONEntity>>().GetSingleEntity(new { CN_S_LOCATION_CODE = executeStatePara.transportTask.CN_S_END_BIT, executeStatePara.transportTask.CN_S_TRAY_CODE });
|
//起点货位是否绑定任务
|
executeStatePara.startIsCurrentTask = CreateDAL<DapperDAL<TN_WM_LOCATION_EXTEntity>>().GetSingleEntity(new { CN_S_LOCATION_CODE = executeStatePara.transportTask.CN_S_START_BIT, CN_S_TASK_NO = taskNo });
|
//终点货位是否绑定任务
|
executeStatePara.endIsCurrentTask = CreateDAL<DapperDAL<TN_WM_LOCATION_EXTEntity>>().GetSingleEntity(new { CN_S_LOCATION_CODE = executeStatePara.transportTask.CN_S_END_BIT, CN_S_TASK_NO = taskNo });
|
//托盘物料主表
|
executeStatePara.trayItemMsts = CreateDAL<DapperDAL<TN_WM_B_TRAY_ITEM_MSTEntity>>().GetList(new { executeStatePara.transportTask.CN_S_TRAY_CODE });
|
if (executeStatePara.trayItemMsts.Count > 0)
|
{
|
foreach (var trayItemMst in executeStatePara.trayItemMsts)
|
{
|
var item = CreateDAL<TN_WMS_ITEMDAL>().GetItemEntity(trayItemMst.CN_S_ITEM_CODE);
|
trayItemMst.CN_F_INQTY = item.CN_F_NW;
|
trayItemMst.CN_S_WEIGHT = trayItemMst.CN_F_QUANTITY;//= item.CN_F_NW;
|
//trayItemMst.CN_F_INQTY = 0;
|
trayItemMst.TrayItemDtlList = CreateDAL<DapperDAL<TN_WM_B_TRAY_ITEM_DTLEntity>>().GetList(new { CN_PARENT_GUID = trayItemMst.CN_GUID });
|
//foreach (var trayItemDtl in trayItemMst.TrayItemDtlList)
|
//{
|
// trayItemMst.CN_S_WEIGHT += Convert.ToDecimal(trayItemDtl.CN_S_SERIAL_NO);
|
//}
|
}
|
}
|
|
//起点库区
|
executeStatePara.startStockArea = CreateDAL<TN_AB_B_STOCK_AREADAL>().GetStockAreaEntity(executeStatePara.transportTask.CN_S_START_AREA.Trim());
|
//结束库区
|
executeStatePara.endStockArea = CreateDAL<TN_AB_B_STOCK_AREADAL>().GetStockAreaEntity(executeStatePara.transportTask.CN_S_END_AREA.Trim());
|
//任务状态
|
executeStatePara.taskState = taskState;
|
|
var t = new Redis.ReisModel.RedisUserEntity();
|
|
//完成
|
if (taskState.Equals(Constants.TaskState_Complete))
|
{
|
result = BLLCreator.Create<TN_WM_TASKBLL>().EndTaskForAuto(executeStatePara, logPara);
|
}
|
//取消
|
else if (taskState.Equals("取消"))
|
{
|
result = BLLCreator.Create<TN_WM_TASKBLL>().CancelTask(executeStatePara, logPara);
|
}
|
//空取
|
else if (taskState.Equals("空取"))
|
{
|
result = BLLCreator.Create<TN_WM_TASKBLL>().EmptyFetchTask(executeStatePara);
|
}
|
//取货完成
|
else if (taskState.Equals("取货完成"))
|
{
|
result = BLLCreator.Create<TN_WM_TASKBLL>().PickSucc(executeStatePara);
|
}
|
//卸货完成
|
else if (taskState.Equals("卸货完成"))
|
{
|
result = BLLCreator.Create<TN_WM_TASKBLL>().UnloadingSucc(executeStatePara, t, logPara);
|
}
|
|
return result;
|
}
|
|
#endregion
|
|
#region 完工回报(无锡宇寿) + ExecuteState
|
|
public OperateResult ExecuteStateForWxys(string taskNo, string taskState, LogPara logPara)
|
{
|
//TODO 加项目编号
|
|
var executeStatePara = new ExecuteStateParaDto();
|
|
var result = new OperateResult();
|
|
//查询任务
|
executeStatePara.transportTask = CreateDAL<DapperDAL<TN_WM_TASKEntity>>().GetSingleEntity(new { CN_S_TASK_NO = taskNo });
|
Log.Detail(logPara, LogDescribe.Content(executeStatePara.transportTask));
|
|
//起点货位是否绑定托盘
|
executeStatePara.startTrayLocation = CreateDAL<DapperDAL<TN_WM_B_TRAY_LOCATIONEntity>>().GetSingleEntity(new { CN_S_LOCATION_CODE = executeStatePara.transportTask.CN_S_START_BIT, executeStatePara.transportTask.CN_S_TRAY_CODE });
|
//终点货位是否绑定托盘
|
executeStatePara.endTrayLocation = CreateDAL<DapperDAL<TN_WM_B_TRAY_LOCATIONEntity>>().GetSingleEntity(new { CN_S_LOCATION_CODE = executeStatePara.transportTask.CN_S_END_BIT, executeStatePara.transportTask.CN_S_TRAY_CODE });
|
//起点货位是否绑定任务
|
executeStatePara.startIsCurrentTask = CreateDAL<DapperDAL<TN_WM_LOCATION_EXTEntity>>().GetSingleEntity(new { CN_S_LOCATION_CODE = executeStatePara.transportTask.CN_S_START_BIT, CN_S_TASK_NO = taskNo });
|
//终点货位是否绑定任务
|
executeStatePara.endIsCurrentTask = CreateDAL<DapperDAL<TN_WM_LOCATION_EXTEntity>>().GetSingleEntity(new { CN_S_LOCATION_CODE = executeStatePara.transportTask.CN_S_END_BIT, CN_S_TASK_NO = taskNo });
|
//托盘物料主表
|
executeStatePara.trayItemMsts = CreateDAL<DapperDAL<TN_WM_B_TRAY_ITEM_MSTEntity>>().GetList(new { executeStatePara.transportTask.CN_S_TRAY_CODE });
|
if (executeStatePara.trayItemMsts.Count > 0)
|
{
|
foreach (var trayItemMst in executeStatePara.trayItemMsts)
|
{
|
var item = CreateDAL<TN_WMS_ITEMDAL>().GetItemEntity(trayItemMst.CN_S_ITEM_CODE);
|
trayItemMst.CN_F_INQTY = item.CN_F_NW;
|
trayItemMst.CN_S_WEIGHT = 0;//= item.CN_F_NW;
|
//trayItemMst.CN_F_INQTY = 0;
|
trayItemMst.TrayItemDtlList = CreateDAL<DapperDAL<TN_WM_B_TRAY_ITEM_DTLEntity>>().GetList(new { CN_PARENT_GUID = trayItemMst.CN_GUID });
|
foreach (var trayItemDtl in trayItemMst.TrayItemDtlList)
|
{
|
trayItemMst.CN_S_WEIGHT += Convert.ToDecimal(trayItemDtl.CN_S_SERIAL_NO);
|
}
|
}
|
}
|
Log.Detail(logPara, "托盘物料关联表数据:" + LogDescribe.Content(executeStatePara.trayItemMsts));
|
|
//起点库区
|
executeStatePara.startStockArea = CreateDAL<TN_AB_B_STOCK_AREADAL>().GetStockAreaEntity(executeStatePara.transportTask.CN_S_START_AREA.Trim());
|
//结束库区
|
executeStatePara.endStockArea = CreateDAL<TN_AB_B_STOCK_AREADAL>().GetStockAreaEntity(executeStatePara.transportTask.CN_S_END_AREA.Trim());
|
//任务状态
|
executeStatePara.taskState = taskState;
|
|
var t = new Redis.ReisModel.RedisUserEntity();
|
|
//完成
|
if (taskState.Equals(Constants.TaskState_Complete))
|
{
|
result = BLLCreator.Create<TN_WM_TASKBLL>().EndTaskForAuto(executeStatePara, logPara);
|
}
|
//取消
|
else if (taskState.Equals("取消"))
|
{
|
result = BLLCreator.Create<TN_WM_TASKBLL>().CancelTask(executeStatePara, logPara);
|
}
|
//空取
|
else if (taskState.Equals("空取"))
|
{
|
result = BLLCreator.Create<TN_WM_TASKBLL>().EmptyFetchTask(executeStatePara);
|
}
|
//取货完成
|
else if (taskState.Equals("取货完成"))
|
{
|
result = BLLCreator.Create<TN_WM_TASKBLL>().PickSucc(executeStatePara);
|
}
|
//卸货完成
|
else if (taskState.Equals("卸货完成"))
|
{
|
result = BLLCreator.Create<TN_WM_TASKBLL>().UnloadingSucc(executeStatePara, t, logPara);
|
}
|
|
return result;
|
}
|
|
#endregion
|
|
#region 同步货位状态,货位状态不一致设为异常
|
/// <summary>
|
/// 同步货位状态,货位状态不一致设为异常
|
/// </summary>
|
/// <param name="synchroLocationEntity"></param>
|
/// <returns></returns>
|
/// <history>[HanHe(zh)] CREATED 2018/5/3</history>
|
public ExternalResponse SynchroLocation(List<SynchroLocationEntity> synchroLocationList)
|
{
|
ExternalResponse result = new ExternalResponse();
|
if (synchroLocationList == null || synchroLocationList.Count == 0)
|
return result.Error<SynchroLocationEntity>(null, "接受同步货位数据为空!", synchroLocationList);
|
foreach (var item in synchroLocationList)
|
{
|
result = ExecuteSynchroLocation(item);
|
if (!result.success)
|
{
|
return result;
|
}
|
}
|
return result;
|
}
|
public ExternalResponse ExecuteSynchroLocation(SynchroLocationEntity synchroLocationEntity)
|
{
|
ExternalResponse response = new ExternalResponse();
|
try
|
{
|
AutoBomLocationEntity location = BLLCreator.Create<HH.WMS.BLL.Basic.TN_AB_STOCK_LOCATIONBLL>().GetModel(synchroLocationEntity.Location, synchroLocationEntity.StockCode);
|
if (location != null)
|
{
|
//获取库区实体
|
AutoBomStockAreaEntity stockAreaEntity = CreateDAL<HH.WMS.DAL.Basic.TN_AB_B_STOCK_AREADAL>().GetEntityByArea(location.CN_S_AREA_CODE);
|
if (stockAreaEntity == null)
|
return response.Error<SynchroLocationEntity>(synchroLocationEntity, "未找到库区");
|
|
TN_WM_LOCATION_EXTEntity locationExt = CreateDAL<DapperDAL<TN_WM_LOCATION_EXTEntity>>().GetSingleEntity(new { CN_S_LOCATION_CODE = synchroLocationEntity.Location, CN_S_STOCK_CODE = synchroLocationEntity.StockCode });// CreateDAL<TN_WM_LOCATION_EXTDAL>().GetEntityByCode(synchroLocationEntity.Location, synchroLocationEntity.StockCode);
|
if (locationExt == null)
|
return response.Error<SynchroLocationEntity>(synchroLocationEntity, "货位在TN_WM_LOCATION_EXT表中不存在");
|
|
//是否没有故障
|
bool isNotFault = true;
|
|
switch (synchroLocationEntity.State)
|
{
|
//有货
|
case 1:
|
isNotFault = locationExt.CN_S_USE_STATE != "空";
|
break;
|
//无货
|
case 2:
|
isNotFault = locationExt.CN_S_USE_STATE == "空";
|
break;
|
//故障
|
case 3:
|
isNotFault = false;
|
break;
|
}
|
if (!isNotFault)
|
{
|
string updateState = "全部故障";
|
//switch (synchroLocationEntity.Type)
|
//{
|
// case 1:
|
// updateState = "入库故障";
|
// break;
|
// case 2:
|
// updateState = "出库故障";
|
// break;
|
//}
|
if (locationExt.CN_S_LOCATION_STATE == Constants.Location_State_Normal)
|
{
|
var result = CreateDAL<TN_WM_LOCATION_EXTDAL>().UpdateLocationState(synchroLocationEntity.Location, updateState, "", null);
|
if (!result.Success)
|
{
|
return response.Error<SynchroLocationEntity>(synchroLocationEntity, result.Exception.Message);
|
}
|
else
|
{
|
AutoBomLocationEntity locationModel = CreateDAL<TN_WMS_LOCATIONDAL>().GetModel(synchroLocationEntity.Location);
|
BLLCreator.Create<TN_WM_B_LOCATION_CHANGEBLL>().AddStateChange(synchroLocationEntity.Location, "正常", updateState, "同步货位状态发现货位存储状态不一致时将货位设置为故障状态", "AMS", "", "", locationModel.CN_S_STOCK_CODE, locationModel.CN_S_AREA_CODE, null);
|
}
|
}
|
}
|
else
|
{
|
if (locationExt.CN_S_LOCATION_STATE == Constants.Location_State_AllFault)
|
{
|
var result = CreateDAL<TN_WM_LOCATION_EXTDAL>().UpdateLocationState(synchroLocationEntity.Location, "正常", "", null);
|
if (!result.Success)
|
{
|
return response.Error<SynchroLocationEntity>(synchroLocationEntity, result.Exception.Message);
|
}
|
else
|
{
|
AutoBomLocationEntity locationModel = CreateDAL<TN_WMS_LOCATIONDAL>().GetModel(synchroLocationEntity.Location);
|
BLLCreator.Create<TN_WM_B_LOCATION_CHANGEBLL>().AddStateChange(synchroLocationEntity.Location, "全部故障", "正常", "同步货位状态发现货位存储状态一致时将货位设置为正常", "AMS", "", "", locationModel.CN_S_STOCK_CODE, locationModel.CN_S_AREA_CODE, null);
|
}
|
}
|
}
|
return response.Ok<SynchroLocationEntity>(synchroLocationEntity);
|
}
|
else
|
{
|
return response.Error<SynchroLocationEntity>(synchroLocationEntity, "在仓库中未找到该货位");
|
}
|
}
|
catch (Exception ex)
|
{
|
return response.Error<SynchroLocationEntity>(synchroLocationEntity, "ExecuteSynchroLocation方法异常;" + ex.Message + ex.StackTrace);
|
}
|
}
|
#endregion
|
|
#region 外部请求本地 返回消息
|
|
|
public class UpdateWayResult
|
{
|
public bool success { get; set; }
|
public string errCode { get; set; }
|
public string errMsg { get; set; }
|
public string location { get; set; }
|
}
|
|
|
#endregion
|
}
|
}
|