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 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 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 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().EmptyFetchTask(executeStatePara); break; case "取货完成": if (project == ProjectCodes.TaiZhouLongJi) { result = BLLCreator.Create().PickSuccLJ(executeStatePara, logPara); } else { result = BLLCreator.Create().PickSucc(executeStatePara, logPara); } break; case "卸货完成": if (project == ProjectCodes.TaiZhouLongJi) { result = BLLCreator.Create().UnloadingSuccLJ(executeStatePara, new Redis.ReisModel.RedisUserEntity(), logPara); } else { result = BLLCreator.Create().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().GetTrayInventoryQty(executeStatePara.transportTask.CN_S_TRAY_CODE); var addAreaQty = new List(); var addStockQty = new List(); 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>().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>().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().ReduceAreaQty(addAreaQty, executeStatePara.transportTask.CN_S_START_AREA, logPara, trans); } #endregion } if (executeStatePara.endTrayLocation == null) { //添加托盘货位 CreateDAL>().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().AddAreaQty(addAreaQty, executeStatePara.transportTask.CN_S_END_AREA, logPara, trans); if (!executeStatePara.transportTask.CN_S_TASK_TYPE.Equals("转运")) { //升仓库库存 CreateDAL().AddStockQty(addStockQty, trans); Log.Detail(logPara, "增加仓库库存!"); } } #endregion } //终点 if (executeStatePara.endIsCurrentTask != null && executeStatePara.transportTask.CN_C_END_IS_CONTROL_QTY.Equals("Y")) { CreateDAL().UpdateState(executeStatePara.transportTask.CN_S_END_BIT, "正常", "满", "预入库锁定", trans); Log.Detail(logPara, "更新预入库锁定的货位状态为正常、满,货位号:" + executeStatePara.transportTask.CN_S_END_BIT); //货位状态变化 BLLCreator.Create().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().UpdateState(executeStatePara.transportTask.CN_S_START_BIT, "正常", "空", "预出库锁定", trans); Log.Detail(logPara, "更新预出库锁定的货位状态为正常、空,起点货位号:" + executeStatePara.transportTask.CN_S_START_BIT); //货位状态变化 BLLCreator.Create().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().Delete(executeStatePara.transportTask.CN_S_TRAY_CODE, executeStatePara.transportTask.CN_S_START_BIT, trans, logPara); BLLCreator.Create().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().ReduceQtyAndAlloc(addAreaQty, executeStatePara.transportTask.CN_S_START_AREA, trans, logPara); if (!executeStatePara.transportTask.CN_S_TASK_TYPE.Equals("转运")) BLLCreator.Create().ReduceQtyAndAlloc(addStockQty, trans, logPara); } #endregion } if (executeStatePara.startIsCurrentTask != null && executeStatePara.transportTask.CN_C_START_IS_CONTROL_QTY.Equals("Y")) { BLLCreator.Create().UpdateState(executeStatePara.transportTask.CN_S_START_BIT, "正常", "空", "预出库锁定", trans, logPara); BLLCreator.Create().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>().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().UpdateLocationStateByCodeAndState(executeStatePara.transportTask.CN_S_END_BIT, "正常", "预入库锁定", trans); Log.Detail(logPara, "更新终点货位" + executeStatePara.transportTask.CN_S_END_BIT + "的状态为正常!"); //更新终点货位的任务号 CreateDAL>().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().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().UpdateLocationStateByCodeAndState(executeStatePara.transportTask.CN_S_START_BIT, "正常", "预出库锁定", trans); //更新起点货位的任务号 CreateDAL>().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().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); } } }); } } }