using HH.WMS.BLL.Basic;
|
using HH.WMS.BLL.InStock;
|
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.Basic;
|
using HH.WMS.DAL.MoveStock;
|
using HH.WMS.DAL.SysMgr;
|
using HH.WMS.Entitys;
|
using HH.WMS.Entitys.Basic;
|
using HH.WMS.Entitys.Common;
|
using HH.WMS.Entitys.Dto;
|
using HH.WMS.Entitys.Entitys;
|
using HH.WMS.Entitys.External;
|
using Newtonsoft.Json;
|
using System;
|
using System.Collections.Generic;
|
using System.Linq;
|
using System.Text;
|
using System.Threading.Tasks;
|
|
namespace HH.WMS.BLL.External
|
{
|
public class WmsApiForMasymBLL : WmsApiBaseBLL
|
{
|
public ExternalResponse InWorkArea(List<InWorkAreaEntity> inWorkAreaEntitys)
|
{
|
var logPara = LogType.LogPara("入作业区");
|
Log.Detail(logPara, "InWorkArea接口请求参数:" + JsonConvert.SerializeObject(inWorkAreaEntitys));
|
var result = InWorkArea(inWorkAreaEntitys, logPara);
|
Log.Detail(logPara, "InWorkArea接口返回结果:" + JsonConvert.SerializeObject(result));
|
return result;
|
}
|
|
public ExternalResponse OutWorkArea(List<OutWorkAreaEntity> outWorkAreaList)
|
{
|
var logPara = LogType.LogPara("出作业区");
|
Log.Detail(logPara, "OutWorkArea接口请求参数:" + JsonConvert.SerializeObject(outWorkAreaList));
|
var result = OutWorkArea(outWorkAreaList, logPara);
|
Log.Detail(logPara, "OutWorkArea接口返回参数:" + JsonConvert.SerializeObject(result));
|
return result;
|
}
|
|
public override string ExecuteState(ExecuteStateDto executeState)
|
{
|
var logPara = LogType.LogPara("完工回报");
|
var res = ExecuteState(executeState, logPara);
|
return JsonConvert.SerializeObject(res);
|
}
|
|
public override string ExecuteState(List<ExecuteStateDto> executeStates)
|
{
|
var logPara = LogType.LogPara("完工回报");
|
var res = new CommInfResult();
|
foreach (var executeState in executeStates)
|
{
|
res = ExecuteState(executeState, logPara);
|
if (!res.success) return JsonConvert.SerializeObject(new { Success = res.success, Msg = res.errMsg });
|
}
|
return JsonConvert.SerializeObject(new { Success = res.success, Message = res.errMsg });
|
}
|
|
public override CommInfResult ExecuteState(ExecuteStateDto executeState, LogPara logPara)
|
{
|
Log.Detail(logPara, "ExecuteState接口请求参数:" + JsonConvert.SerializeObject(executeState));
|
|
var result = new SqlExecuteResult();
|
var res = new CommInfResult();
|
try
|
{
|
var taskNo = executeState.taskNo;
|
var taskStateNo = executeState.stateNo;
|
var taskState = Constants.TaskStateList[taskStateNo];
|
//任务号不能为空
|
if (string.IsNullOrEmpty(taskNo) || taskStateNo == 0)
|
{
|
res.success = false;
|
res.errMsg = "失败,参数缺失!";
|
}
|
else
|
{
|
//执行事务
|
var resultNew = ExecuteState(taskNo, taskState, logPara);
|
if (resultNew.Success)
|
{
|
res.success = true;
|
}
|
else
|
{
|
res.success = false;
|
res.errMsg = resultNew.Msg;
|
}
|
}
|
}
|
catch (Exception ex)
|
{
|
res.success = false;
|
res.errMsg = "ExecuteState方法异常!" + ex.Message + ex.StackTrace;
|
}
|
|
Log.Detail(logPara, "ExecuteState接口返回参数:" + JsonConvert.SerializeObject(res));
|
return res;
|
}
|
|
public override OperateResult ExecuteState(string taskNo, string taskState, LogPara logPara)
|
{
|
var executeStatePara = ExecuteStateHandlePara(taskNo, taskState, logPara);
|
if (executeStatePara == null)
|
{
|
return OperateResult.Error("在任务表中未查询到该任务号信息");
|
}
|
var result = new OperateResult();
|
string project = getProjectCode();
|
switch (taskState)
|
{
|
case "执行中":
|
result = StartTask(executeStatePara, logPara);
|
break;
|
case "完成":
|
result = CompleteTask(executeStatePara, logPara);
|
break;
|
case "取消":
|
result = CancelTask(executeStatePara, logPara);
|
break;
|
case "空取":
|
result = BLLCreator.Create<TN_WM_TASKBLL>().EmptyFetchTask(executeStatePara);
|
break;
|
case "取货完成":
|
if (project == ProjectCodes.TaiZhouLongJi)
|
{
|
result = BLLCreator.Create<TN_WM_TASKBLL>().PickSuccLJ(executeStatePara, logPara);
|
}
|
else
|
{
|
result = BLLCreator.Create<TN_WM_TASKBLL>().PickSucc(executeStatePara, logPara);
|
}
|
break;
|
case "卸货完成":
|
if (project == ProjectCodes.TaiZhouLongJi)
|
{
|
result = BLLCreator.Create<TN_WM_TASKBLL>().UnloadingSuccLJ(executeStatePara, new Redis.ReisModel.RedisUserEntity(), logPara);
|
}
|
else
|
{
|
result = BLLCreator.Create<TN_WM_TASKBLL>().UnloadingSucc(executeStatePara, new Redis.ReisModel.RedisUserEntity(), logPara);
|
}
|
break;
|
}
|
|
return result;
|
}
|
|
public override OperateResult CompleteTask(ExecuteStateParaDto executeStatePara, LogPara logPara)
|
{
|
var isControlStockQty = executeStatePara.trayItemMsts.Count > 0;
|
Log.Detail(logPara, "isControlStockQty: " + isControlStockQty);
|
|
#region 组合量表参数
|
|
//获取上架量=总量-分配量
|
//var trayInventory = CreateDAL<TN_WM_B_TRAY_ITEM_RELDAL>().GetTrayInventoryQty(executeStatePara.transportTask.CN_S_TRAY_CODE);
|
var addAreaQty = new List<TN_WM_B_AREA_QTYEntity>();
|
var addStockQty = new List<TN_WM_B_STOCK_QTYEntity>();
|
|
if (isControlStockQty)
|
{
|
foreach (var trayItemMst in executeStatePara.trayItemMsts)
|
{
|
foreach (var trayItemDtl in trayItemMst.TrayItemDtlList)
|
{
|
addAreaQty.Add(new TN_WM_B_AREA_QTYEntity()
|
{
|
CN_S_ITEM_CODE = trayItemMst.CN_S_ITEM_CODE,
|
CN_S_ITEM_NAME = trayItemMst.CN_S_ITEM_NAME,
|
CN_S_ITEM_STATE = trayItemMst.CN_S_ITEM_STATE,
|
CN_S_OWNER = trayItemMst.CN_S_OWNER,
|
CN_S_PRODUCTION_BATCH = trayItemMst.CN_S_PRODUCTION_BATCH,
|
CN_S_LOT_NO = trayItemDtl.CN_S_LOT_NO,
|
CN_F_QUANTITY = Convert.ToDecimal(trayItemDtl.CN_F_QUANTITY),//.CN_S_WEIGHT,//重量 Convert.ToDecimal(trayItemMst.CN_F_INQTY),//trayItemMst.CN_F_QUANTITY * trayItemMst.CN_S_WEIGHT,
|
CN_S_STOCK_CODE = executeStatePara.transportTask.CN_S_STOCK_CODE,
|
CN_F_PLANNED_QTY = trayItemMst.CN_F_INQTY,
|
CN_S_MODEL = trayItemMst.CN_S_MODEL,
|
CN_S_MEASURE_UNIT = trayItemMst.CN_S_MEASURE_UNIT,
|
CN_S_FIGURE_NO = trayItemDtl.CN_S_EXT1
|
});
|
|
addStockQty.Add(new TN_WM_B_STOCK_QTYEntity()
|
{
|
CN_S_ITEM_CODE = trayItemMst.CN_S_ITEM_CODE,
|
CN_S_ITEM_NAME = trayItemMst.CN_S_ITEM_NAME,
|
CN_S_ITEM_STATE = trayItemMst.CN_S_ITEM_STATE,
|
CN_S_OWNER = trayItemMst.CN_S_OWNER,
|
CN_S_PRODUCTION_BATCH = trayItemMst.CN_S_PRODUCTION_BATCH,
|
CN_S_LOT_NO = trayItemDtl.CN_S_LOT_NO,
|
CN_F_QUANTITY = Convert.ToDecimal(trayItemDtl.CN_F_QUANTITY),//CN_S_WEIGHT,//trayItemMst.CN_F_QUANTITY * trayItemMst.CN_S_WEIGHT,
|
CN_S_STOCK_CODE = executeStatePara.transportTask.CN_S_STOCK_CODE,
|
CN_S_STOCK_AREA = executeStatePara.transportTask.CN_S_END_AREA,
|
CN_F_PLANNED_QTY = trayItemMst.CN_F_INQTY,
|
CN_S_MODEL = trayItemMst.CN_S_MODEL,
|
CN_S_FIGURE_NO = trayItemDtl.CN_S_EXT1,
|
CN_S_MEASURE_UNIT = trayItemMst.CN_S_MEASURE_UNIT
|
});
|
}
|
}
|
Log.Detail(logPara, LogDescribe.Content(addAreaQty));
|
Log.Detail(logPara, LogDescribe.Content(addStockQty));
|
}
|
|
#endregion
|
|
return UseTransaction(trans =>
|
{
|
//更新任务状态
|
CreateDAL<DapperDAL<TN_WM_TASKEntity>>().Update(new
|
{
|
CN_S_MODIFY = "",
|
CN_S_MODIFY_BY = "",
|
CN_T_END = DateTime.Now,
|
CN_T_MODIFY = DateTime.Now,
|
CN_S_STATE = executeStatePara.taskState
|
}, new { executeStatePara.transportTask.CN_S_TASK_NO }, trans);
|
Log.Detail(logPara, "更新任务状态-任务号:" + executeStatePara.transportTask.CN_S_TASK_NO + "状态为:" + executeStatePara.taskState);
|
|
#region 入库 + 转运
|
|
if (executeStatePara.transportTask.CN_S_TASK_TYPE.Equals("入库") || executeStatePara.transportTask.CN_S_TASK_TYPE.Equals("转运"))
|
{
|
var trayLocation = new TN_WM_B_TRAY_LOCATIONEntity()
|
{
|
CN_GUID = Guid.NewGuid().ToString(),
|
CN_N_INDEX = 1,
|
CN_S_CREATOR = "",
|
CN_S_CREATOR_BY = "",
|
CN_S_LOCATION_CODE = executeStatePara.transportTask.CN_S_END_BIT,
|
CN_S_STOCK_AREA = executeStatePara.transportTask.CN_S_END_AREA,
|
CN_S_STOCK_CODE = executeStatePara.transportTask.CN_S_STOCK_CODE,
|
CN_S_TRAY_CODE = executeStatePara.transportTask.CN_S_TRAY_CODE,
|
CN_T_CREATE = DateTime.Now
|
};
|
|
if (executeStatePara.startTrayLocation != null)
|
{
|
//解绑托盘与货位的关系
|
CreateDAL<DapperDAL<TN_WM_B_TRAY_LOCATIONEntity>>().Delete(new
|
{
|
executeStatePara.transportTask.CN_S_TRAY_CODE,
|
CN_S_LOCATION_CODE = executeStatePara.transportTask.CN_S_START_BIT
|
}, trans);
|
Log.Detail(logPara, "解绑任务的托盘和起点货位关联!");
|
|
#region 下架记录
|
|
if (executeStatePara.transportTask.CN_S_TASK_TYPE.Equals("转运"))
|
{
|
CompleteTaskDownHistory(executeStatePara, logPara, trans);
|
}
|
|
if (executeStatePara.transportTask.CN_S_START_CONTROL_INV.Equals("Y") && executeStatePara.transportTask.CN_S_START_AREA != executeStatePara.transportTask.CN_S_END_AREA) //降低起点库存
|
{
|
CreateDAL<TN_WM_B_AREA_QTYDAL>().ReduceAreaQty(addAreaQty, executeStatePara.transportTask.CN_S_START_AREA, logPara, trans);
|
}
|
|
#endregion
|
}
|
|
if (executeStatePara.endTrayLocation == null)
|
{
|
//添加托盘货位
|
CreateDAL<DapperDAL<TN_WM_B_TRAY_LOCATIONEntity>>().Add(trayLocation, trans);
|
Log.Detail(logPara, "添加托盘货位关联,内容:" + LogDescribe.Content(trayLocation));
|
|
if (isControlStockQty)
|
{
|
#region 添加上架记录,升库存
|
|
CompleteTaskUpHistory(executeStatePara, logPara, trans);
|
|
|
if (string.IsNullOrEmpty(executeStatePara.transportTask.CN_S_END_CONTROL_INV))
|
{
|
trans.Rollback();
|
return;
|
}
|
|
if (executeStatePara.transportTask.CN_S_END_CONTROL_INV.Equals("Y") && executeStatePara.transportTask.CN_S_START_AREA != executeStatePara.transportTask.CN_S_END_AREA) //如果起点和终点在一个库区,不增加
|
{
|
//按未入库量增加结束库区量
|
CreateDAL<TN_WM_B_AREA_QTYDAL>().AddAreaQty(addAreaQty, executeStatePara.transportTask.CN_S_END_AREA, logPara, trans);
|
if (!executeStatePara.transportTask.CN_S_TASK_TYPE.Equals("转运"))
|
{
|
//升仓库库存
|
CreateDAL<TN_WM_B_STOCK_QTYDAL>().AddStockQty(addStockQty, trans);
|
Log.Detail(logPara, "增加仓库库存!");
|
}
|
}
|
|
#endregion
|
}
|
|
//终点
|
if (executeStatePara.endIsCurrentTask != null && executeStatePara.transportTask.CN_C_END_IS_CONTROL_QTY.Equals("Y"))
|
{
|
CreateDAL<TN_WM_TASKDAL>().UpdateState(executeStatePara.transportTask.CN_S_END_BIT, "正常", "满", "预入库锁定", trans);
|
Log.Detail(logPara, "更新预入库锁定的货位状态为正常、满,货位号:" + executeStatePara.transportTask.CN_S_END_BIT);
|
|
//货位状态变化
|
BLLCreator.Create<TN_WM_B_LOCATION_CHANGEBLL>().AddStateChange(executeStatePara.transportTask.CN_S_END_BIT, "预入库锁定", "正常", "状态回报入库完成-终点", "", "", "", executeStatePara.endStockArea.CN_S_STOCK_CODE, executeStatePara.endStockArea.CN_S_AREA_CODE, trans);
|
}
|
|
//起点
|
if (executeStatePara.transportTask.CN_C_START_IS_CONTROL_QTY.Equals("Y") && executeStatePara.transportTask.CN_S_TASK_TYPE.Equals("转运"))
|
{
|
CreateDAL<TN_WM_TASKDAL>().UpdateState(executeStatePara.transportTask.CN_S_START_BIT, "正常", "空", "预出库锁定", trans);
|
Log.Detail(logPara, "更新预出库锁定的货位状态为正常、空,起点货位号:" + executeStatePara.transportTask.CN_S_START_BIT);
|
|
//货位状态变化
|
BLLCreator.Create<TN_WM_B_LOCATION_CHANGEBLL>().AddStateChange(executeStatePara.transportTask.CN_S_START_BIT, "预出库锁定", "正常", "状态回报转运完成-起点", "", "", "", executeStatePara.startStockArea.CN_S_STOCK_CODE, executeStatePara.startStockArea.CN_S_AREA_CODE, trans);
|
}
|
}
|
}
|
|
#endregion
|
|
#region 出库
|
|
if (executeStatePara.transportTask.CN_S_TASK_TYPE.Equals("出库"))
|
{
|
if (executeStatePara.startTrayLocation != null)
|
{
|
BLLCreator.Create<TN_WM_B_TRAY_LOCATIONBLL>().Delete(executeStatePara.transportTask.CN_S_TRAY_CODE, executeStatePara.transportTask.CN_S_START_BIT, trans, logPara);
|
BLLCreator.Create<TN_WM_B_TRAY_ITEM_RELBLL>().Delete(" CN_S_TRAY_CODE='" + executeStatePara.transportTask.CN_S_TRAY_CODE + "' ", trans, logPara);
|
|
if (isControlStockQty)
|
{
|
#region 添加下架记录,降库存
|
|
CompleteTaskDownHistory(executeStatePara, logPara, trans);
|
|
if (executeStatePara.transportTask.CN_S_START_CONTROL_INV.Equals("Y"))
|
{
|
BLLCreator.Create<TN_WM_B_AREA_QTYBLL>().ReduceQtyAndAlloc(addAreaQty, executeStatePara.transportTask.CN_S_START_AREA, trans, logPara);
|
if (!executeStatePara.transportTask.CN_S_TASK_TYPE.Equals("转运"))
|
BLLCreator.Create<TN_WM_B_STOCK_QTYBLL>().ReduceQtyAndAlloc(addStockQty, trans, logPara);
|
}
|
|
#endregion
|
}
|
|
if (executeStatePara.startIsCurrentTask != null && executeStatePara.transportTask.CN_C_START_IS_CONTROL_QTY.Equals("Y"))
|
{
|
BLLCreator.Create<TN_WM_TASKBLL>().UpdateState(executeStatePara.transportTask.CN_S_START_BIT, "正常", "空", "预出库锁定", trans, logPara);
|
BLLCreator.Create<TN_WM_B_LOCATION_CHANGEBLL>().AddStateChange(executeStatePara.transportTask.CN_S_START_BIT, "预出库锁定", "正常", "状态回报出库完成", "", "", "", executeStatePara.endStockArea.CN_S_STOCK_CODE, executeStatePara.endStockArea.CN_S_AREA_CODE, trans);
|
}
|
}
|
}
|
|
#endregion
|
});
|
}
|
|
|
public override OperateResult CancelTask(ExecuteStateParaDto executeStatePara, LogPara logPara)
|
{
|
if (!executeStatePara.transportTask.CN_S_STATE.Equals("未执行") && !executeStatePara.transportTask.CN_S_STATE.Equals("执行中"))
|
{
|
return OperateResult.Error("只能取消未执行和执行中的任务!");
|
}
|
|
return UseTransaction(trans =>
|
{
|
//更新任务状态
|
CreateDAL<DapperDAL<TN_WM_TASKEntity>>().Update(new
|
{
|
CN_S_MODIFY = "",
|
CN_S_MODIFY_BY = "",
|
CN_T_END = DateTime.Now,
|
CN_T_MODIFY = DateTime.Now,
|
CN_S_STATE = executeStatePara.taskState
|
}, new { executeStatePara.transportTask.CN_S_TASK_NO }, trans);
|
Log.Detail(logPara, "更新任务状态为:" + executeStatePara.taskState);
|
|
//终点
|
if (executeStatePara.transportTask.CN_S_TASK_TYPE.Equals("入库") || executeStatePara.transportTask.CN_S_TASK_TYPE.Equals("转运")
|
|| executeStatePara.transportTask.CN_S_TASK_TYPE.Equals("移库")
|
|| executeStatePara.transportTask.CN_S_TASK_TYPE.Equals("上架")
|
|| executeStatePara.transportTask.CN_S_TASK_TYPE.Equals("下架")
|
|| executeStatePara.transportTask.CN_S_TASK_TYPE.Equals("叫料")
|
|| executeStatePara.transportTask.CN_S_TASK_TYPE.Equals("空托入")
|
|| executeStatePara.transportTask.CN_S_TASK_TYPE.Equals("空托出")
|
|| executeStatePara.transportTask.CN_S_TASK_TYPE.Equals("分拣出"))
|
{
|
if (executeStatePara.endIsCurrentTask != null && executeStatePara.transportTask.CN_C_END_IS_CONTROL_QTY.Equals("Y"))
|
{
|
CreateDAL<TN_WM_LOCATION_EXTDAL>().UpdateLocationStateByCodeAndState(executeStatePara.transportTask.CN_S_END_BIT, "正常", "预入库锁定", trans);
|
Log.Detail(logPara, "更新终点货位" + executeStatePara.transportTask.CN_S_END_BIT + "的状态为正常!");
|
//更新终点货位的任务号
|
CreateDAL<DapperDAL<TN_WM_LOCATION_EXTEntity>>().Update(new { CN_S_TASK_NO = "" }, new { CN_S_LOCATION_CODE = executeStatePara.transportTask.CN_S_END_BIT }, trans);
|
Log.Detail(logPara, "更新终点货位" + executeStatePara.transportTask.CN_S_END_BIT + "的绑定任务号为空!");
|
|
//货位状态变化
|
BLLCreator.Create<TN_WM_B_LOCATION_CHANGEBLL>().AddStateChange(executeStatePara.transportTask.CN_S_END_BIT, "预入库锁定", "正常", "状态回报入库取消", "", "", "", executeStatePara.endStockArea.CN_S_STOCK_CODE, executeStatePara.endStockArea.CN_S_AREA_CODE, trans);
|
}
|
}
|
|
//起点
|
if (executeStatePara.transportTask.CN_S_TASK_TYPE.Equals("出库") || executeStatePara.transportTask.CN_S_TASK_TYPE.Equals("转运")
|
|| executeStatePara.transportTask.CN_S_TASK_TYPE.Equals("移库")
|
|| executeStatePara.transportTask.CN_S_TASK_TYPE.Equals("上架")
|
|| executeStatePara.transportTask.CN_S_TASK_TYPE.Equals("下架")
|
|| executeStatePara.transportTask.CN_S_TASK_TYPE.Equals("叫料")
|
|| executeStatePara.transportTask.CN_S_TASK_TYPE.Equals("空托入")
|
|| executeStatePara.transportTask.CN_S_TASK_TYPE.Equals("空托出"))
|
{
|
if (executeStatePara.startIsCurrentTask != null && executeStatePara.transportTask.CN_C_START_IS_CONTROL_QTY.Equals("Y"))
|
{
|
CreateDAL<TN_WM_LOCATION_EXTDAL>().UpdateLocationStateByCodeAndState(executeStatePara.transportTask.CN_S_START_BIT, "正常", "预出库锁定", trans);
|
|
//更新起点货位的任务号
|
CreateDAL<DapperDAL<TN_WM_LOCATION_EXTEntity>>().Update(new { CN_S_TASK_NO = "" }, new { CN_S_LOCATION_CODE = executeStatePara.transportTask.CN_S_END_BIT }, trans);
|
Log.Detail(logPara, "更新起点货位" + executeStatePara.transportTask.CN_S_START_BIT + "的绑定任务号为空!");
|
|
//货位状态变化
|
BLLCreator.Create<TN_WM_B_LOCATION_CHANGEBLL>().AddStateChange(executeStatePara.transportTask.CN_S_START_BIT, "预出库锁定", "正常", "状态回报" + executeStatePara.transportTask.CN_S_TASK_TYPE + "取消", "", "", "", executeStatePara.startStockArea.CN_S_STOCK_CODE, executeStatePara.startStockArea.CN_S_AREA_CODE, trans);
|
}
|
}
|
});
|
}
|
}
|
}
|