using HH.WMS.BLL.Algorithm; using HH.WMS.BLL.Basic; using HH.WMS.BLL.ERP; using HH.WMS.BLL.InStock; using HH.WMS.BLL.Interface; using HH.WMS.BLL.SysMgr; 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.InStock; using HH.WMS.DAL.MoveStock; using HH.WMS.DAL.SysMgr; using HH.WMS.Entitys; using HH.WMS.Entitys.Algorithm; using HH.WMS.Entitys.Basic; using HH.WMS.Entitys.Common; using HH.WMS.Entitys.Dto; using HH.WMS.Entitys.Entitys; using HH.WMS.Entitys.ERP; using HH.WMS.Entitys.External; using Newtonsoft.Json; using System; using System.Collections.Generic; using System.Data; using System.Linq; namespace HH.WMS.BLL.External { public class WmsApiForQzhkBLL : WmsApiBaseBLL { public override ExecuteInWorkAreaPara InWorkAreaVerifyPara(ref ExecuteInWorkAreaPara executeInWorkAreaPara, LogPara logPara) { if (executeInWorkAreaPara.InWorkAreaEntity.isTransport == null) executeInWorkAreaPara.InWorkAreaEntity.isTransport = "N"; //物料编码_对象不为空时,必须存在物料编码 if (executeInWorkAreaPara.InWorkAreaEntity.data == null) { executeInWorkAreaPara.BasisResponse = BasisResponse.Error("请传入物料信息"); return executeInWorkAreaPara; } //任务号_当任务号不为空时,系统判断任务号是否重复 if (!string.IsNullOrEmpty(executeInWorkAreaPara.InWorkAreaEntity.taskNo)) { if (DALCreator.Create().GetTaskByTaskNo(executeInWorkAreaPara.InWorkAreaEntity.taskNo).Count > 0) { executeInWorkAreaPara.BasisResponse = BasisResponse.Error("任务号" + executeInWorkAreaPara.InWorkAreaEntity.taskNo + "重复!"); return executeInWorkAreaPara; } } //判断产线编号是否为空 if (string.IsNullOrEmpty(executeInWorkAreaPara.InWorkAreaEntity.produceLine) && executeInWorkAreaPara.InWorkAreaEntity.isTransport == "N") { executeInWorkAreaPara.BasisResponse = BasisResponse.Error("物料下线请求入库的产线编号不能为空!"); return executeInWorkAreaPara; } //判断是否报警参数是否为空 if (string.IsNullOrEmpty(executeInWorkAreaPara.InWorkAreaEntity.needAlarm)) { executeInWorkAreaPara.BasisResponse = BasisResponse.Error("物料下线needAlarm参数不能为空!"); return executeInWorkAreaPara; } //起始库区 if (string.IsNullOrEmpty(executeInWorkAreaPara.InWorkAreaEntity.startBit)) { executeInWorkAreaPara.BasisResponse = BasisResponse.Error("参数中缺少起始位置!" + executeInWorkAreaPara.InWorkAreaEntity.startBit); return executeInWorkAreaPara; } else { //缓存起始库区实体 executeInWorkAreaPara.StartStockAreaEntity = DALCreator.Create().GetAreaModelByLocation(executeInWorkAreaPara.InWorkAreaEntity.startBit.Trim()); if (executeInWorkAreaPara.StartStockAreaEntity == null) { executeInWorkAreaPara.BasisResponse = BasisResponse.Error("当前起始位置未找到对应的库区!" + executeInWorkAreaPara.InWorkAreaEntity.startBit); return executeInWorkAreaPara; } // 检查货位状态 是转运且管控数量时使用 if (executeInWorkAreaPara.StartStockAreaEntity.CN_C_IS_CONTROL_QTY.Equals("Y") && executeInWorkAreaPara.InWorkAreaEntity.isTransport.Equals("Y")) { executeInWorkAreaPara.StartLocationExt = BLLCreator.Create().GetModel(" where CN_S_LOCATION_CODE = '" + executeInWorkAreaPara.InWorkAreaEntity.startBit.Trim() + "'").FirstOrDefault(); if (!executeInWorkAreaPara.StartLocationExt.CN_S_LOCATION_STATE.Equals("正常")) { executeInWorkAreaPara.BasisResponse = BasisResponse.Error("当前起始货位状态为" + executeInWorkAreaPara.StartLocationExt.CN_S_LOCATION_STATE + ",货位不可用!"); return executeInWorkAreaPara; } if (!executeInWorkAreaPara.StartLocationExt.CN_S_USE_STATE.Equals("满")) { executeInWorkAreaPara.BasisResponse = BasisResponse.Error("当前起始货位存储状态为" + executeInWorkAreaPara.StartLocationExt.CN_S_USE_STATE + ",货位不可用!"); return executeInWorkAreaPara; } //锁定起点货位 OperateResult lockResult = BLLCreator.Create().UpdateState(executeInWorkAreaPara.InWorkAreaEntity.startBit, "预出库锁定", "正常"); if (lockResult.Success && lockResult.AffectedRows > 0) { AutoBomLocationEntity locationModel = DALCreator.Create().GetModel(executeInWorkAreaPara.InWorkAreaEntity.startBit); //添加货位状态变化 BLLCreator.Create().AddStateChange(executeInWorkAreaPara.InWorkAreaEntity.startBit, "正常", "预出库锁定", "入库并且转运需要锁定起点货位防止其他资源竞争", executeInWorkAreaPara.InWorkAreaEntity.sysName, "", "", locationModel.CN_S_STOCK_CODE, locationModel.CN_S_AREA_CODE, null); executeInWorkAreaPara.RollbackLocations.Add(executeInWorkAreaPara.InWorkAreaEntity.startBit); } else { if (!lockResult.Success) { executeInWorkAreaPara.BasisResponse = BasisResponse.Error("锁定起点货位" + executeInWorkAreaPara.InWorkAreaEntity.startBit + "失败!详细原因为:" + lockResult.Msg); } else { executeInWorkAreaPara.BasisResponse = BasisResponse.Error("锁定起点货位" + executeInWorkAreaPara.InWorkAreaEntity.startBit + "失败!详细原因为:SqlExecuteResult影响行数为0"); } return executeInWorkAreaPara; } } //检查起点货位是否为报废状态 executeInWorkAreaPara.InWorkAreaEntity.startArea = executeInWorkAreaPara.StartStockAreaEntity.CN_S_AREA_CODE; executeInWorkAreaPara.InWorkAreaEntity.startStock = executeInWorkAreaPara.StartStockAreaEntity.CN_S_STOCK_CODE; } return executeInWorkAreaPara; } public override ExecuteInWorkAreaPara InWorkAreaHandlePara(ref ExecuteInWorkAreaPara executeInWorkAreaPara, LogPara logPara) { //任务号 考虑是否重复? if (string.IsNullOrEmpty(executeInWorkAreaPara.InWorkAreaEntity.taskNo)) { var postData = "{\"appCode\":\"" + Constants.appCode + "\",\"ruleName\":\"" + Constants.Rule_InTaskNo + "\",\"orgId\":\"0\",\"orgFlag\":\"\"}"; executeInWorkAreaPara.InWorkAreaEntity.taskNo = WebApiManager.HttpAutoBom_Post("api/BillRule/GenBillNo", postData); ; if (string.IsNullOrEmpty(executeInWorkAreaPara.InWorkAreaEntity.taskNo)) { executeInWorkAreaPara.BasisResponse = BasisResponse.Error("获取AUTOBOM入库任务号异常,请检查是否维护生成规则!"); return executeInWorkAreaPara; } } //转运,默认从货位中获取 if (executeInWorkAreaPara.InWorkAreaEntity.isTransport == "Y") { #region 如果是转运则从起点货位中读取物料信息 var lstObj = BLLCreator.Create().GetListByLocationCode(executeInWorkAreaPara.InWorkAreaEntity.startBit); if (lstObj.Count > 0) { #region 转运直接从起点货位中读取物料信息 executeInWorkAreaPara.InWorkAreaEntity.trayCode = lstObj[0].CN_S_TRAY_CODE; var itemEntity = new ChaoYangItemDataEntity(); executeInWorkAreaPara.InWorkAreaEntity.data = new List(); //根据托盘号查询托盘产品关联信息主表 var trayItemMst = BLLCreator.Create().GetTrayItemMst(" AND CN_S_TRAY_CODE ='" + lstObj[0].CN_S_TRAY_CODE + "'"); if (trayItemMst.Count > 0) { //查询托盘产品关联信息子表 var trayItemDtl = BLLCreator.Create().GetTrayItemDtl(" AND CN_PARENT_GUID='" + trayItemMst[0].CN_GUID + "'"); itemEntity.itemCode = trayItemMst[0].CN_S_ITEM_CODE; itemEntity.itemName = trayItemMst[0].CN_S_ITEM_NAME; itemEntity.itemPackUnit = trayItemMst[0].CN_S_MEASURE_UNIT; itemEntity.qty = (decimal)(trayItemMst[0].CN_F_QUANTITY == null ? 0 : trayItemMst[0].CN_F_QUANTITY); itemEntity.lotNo = trayItemDtl[0].CN_S_PRODUCTION_BATCH; itemEntity.itemState = trayItemMst[0].CN_S_ITEM_STATE; itemEntity.productionDate = trayItemDtl[0].CN_T_PRODUCTION; itemEntity.uniqueCode = trayItemDtl[0].CN_S_UNIQUE_CODE; itemEntity.itemModel = trayItemMst[0].CN_S_MODEL; executeInWorkAreaPara.InWorkAreaEntity.data.Add(itemEntity); } else { executeInWorkAreaPara.BasisResponse = BasisResponse.Error("起点货位" + executeInWorkAreaPara.InWorkAreaEntity.startBit + "绑定的托盘中没有物料信息"); return executeInWorkAreaPara; } #endregion } else { executeInWorkAreaPara.BasisResponse = BasisResponse.Error("起点货位" + executeInWorkAreaPara.InWorkAreaEntity.startBit + "没有绑定托盘"); return executeInWorkAreaPara; } //从打包点到仓库的作业优先级需要提高 executeInWorkAreaPara.InWorkAreaEntity.priority = 10; #endregion } else { #region 处理报警及计算物料数量、批次、规格等信息 List lstWorkOrder = CreateDAL().GetOrderInfoByLine(executeInWorkAreaPara.InWorkAreaEntity.produceLine); Log.Detail(logPara, "计算物料数量、批次、规格等信息:" + JsonConvert.SerializeObject(lstWorkOrder)); if (lstWorkOrder.Count > 0) { if (executeInWorkAreaPara.InWorkAreaEntity.needAlarm == "Y") { #region 需要尾托报警 // 获取是否尾托 decimal canTray = lstWorkOrder[0].CN_F_PLAN_TRAY_QTY - lstWorkOrder[0].CN_F_REAL_TRAY_QTY; if (canTray == 1) { if (lstWorkOrder[0].CN_F_PLAN_QTY - lstWorkOrder[0].CN_F_REAL_QTY < lstWorkOrder[0].CN_F_MIN_PACK_QTY) { executeInWorkAreaPara.InWorkAreaEntity.lastTrayAlarm = "Y"; } } //获取是否扫码异常 if (string.IsNullOrEmpty(executeInWorkAreaPara.InWorkAreaEntity.data[0].itemCode)) { executeInWorkAreaPara.InWorkAreaEntity.scanAlarm = "Y"; executeInWorkAreaPara.InWorkAreaEntity.scanAlarmMsg = "未扫描到物料码"; } else { if (!executeInWorkAreaPara.InWorkAreaEntity.data[0].itemCode.Equals(lstWorkOrder[0].CN_S_ITEM_CODE)) { executeInWorkAreaPara.InWorkAreaEntity.scanAlarm = "Y"; executeInWorkAreaPara.InWorkAreaEntity.scanAlarmMsg = "下线物料与工单不符"; } } if (executeInWorkAreaPara.InWorkAreaEntity.scanAlarm =="Y" || executeInWorkAreaPara.InWorkAreaEntity.lastTrayAlarm =="Y") { executeInWorkAreaPara.BasisResponse = BasisResponse.Error("最后一托因需报警暂不生成任务"); executeInWorkAreaPara.TaskExecuteState = new TaskExecuteState().Ok(new OkTask() { scanAlarm = executeInWorkAreaPara.InWorkAreaEntity.scanAlarm, scanAlarmMsg = executeInWorkAreaPara.InWorkAreaEntity.scanAlarmMsg, itemCode = executeInWorkAreaPara.InWorkAreaEntity.data[0].itemCode }); return executeInWorkAreaPara; } executeInWorkAreaPara.InWorkAreaEntity.data[0].itemName = lstWorkOrder[0].CN_S_ITEM_NAME; executeInWorkAreaPara.InWorkAreaEntity.data[0].lotNo = lstWorkOrder[0].CN_S_PRODUCT_BATCH; executeInWorkAreaPara.InWorkAreaEntity.data[0].itemState = ""; executeInWorkAreaPara.InWorkAreaEntity.data[0].productionDate = DateTime.Now; executeInWorkAreaPara.InWorkAreaEntity.data[0].uniqueCode = ""; executeInWorkAreaPara.InWorkAreaEntity.workOrder = lstWorkOrder[0].CN_S_WO_NO; var item = BLLCreator.Create().GetItem(executeInWorkAreaPara.InWorkAreaEntity.data[0].itemCode); if (item != null) { executeInWorkAreaPara.InWorkAreaEntity.data[0].itemPackUnit = item.CN_S_MEASURE_UNIT; executeInWorkAreaPara.InWorkAreaEntity.data[0].CN_C_IS_LOT_OU = lstWorkOrder[0].CN_C_IS_LOT_OUT; executeInWorkAreaPara.InWorkAreaEntity.data[0].itemModel = item.CN_S_MODEL; //if (lstWorkOrder[0].CN_F_MIN_PACK_QTY == 0) //{ // executeInWorkAreaPara.BasisResponse = BasisResponse.Error("物料" + executeInWorkAreaPara.InWorkAreaEntity.data[0].itemCode + "没有在工单中维护每托码盘数量"); // return executeInWorkAreaPara; //} canTray = lstWorkOrder[0].CN_F_PLAN_TRAY_QTY - lstWorkOrder[0].CN_F_REAL_TRAY_QTY; if (canTray == 1) { executeInWorkAreaPara.InWorkAreaEntity.data[0].qty = lstWorkOrder[0].CN_F_PLAN_QTY - lstWorkOrder[0].CN_F_REAL_QTY; } else if (canTray > 1) { executeInWorkAreaPara.InWorkAreaEntity.data[0].qty = lstWorkOrder[0].CN_F_MIN_PACK_QTY; } else { executeInWorkAreaPara.BasisResponse = BasisResponse.Error("工单" + lstWorkOrder[0].CN_S_WO_NO + "数据异常,计划生产托数小于实际生产托数"); return executeInWorkAreaPara; } executeInWorkAreaPara.InWorkAreaEntity.data[0].CN_F_MIN_PACK_QTY = lstWorkOrder[0].CN_F_MIN_PACK_QTY; } else { executeInWorkAreaPara.BasisResponse = BasisResponse.Error("物料" + executeInWorkAreaPara.InWorkAreaEntity.data[0].itemCode + "在AutoBom中没有维护"); return executeInWorkAreaPara; } #endregion } else { #region 不需要尾托报警 //获取是否扫码异常 if (string.IsNullOrEmpty(executeInWorkAreaPara.InWorkAreaEntity.data[0].itemCode)) { executeInWorkAreaPara.InWorkAreaEntity.scanAlarm = "Y"; executeInWorkAreaPara.InWorkAreaEntity.scanAlarmMsg = "未扫描到物料码"; } else { if (!executeInWorkAreaPara.InWorkAreaEntity.data[0].itemCode.Equals(lstWorkOrder[0].CN_S_ITEM_CODE)) { executeInWorkAreaPara.InWorkAreaEntity.scanAlarm = "Y"; executeInWorkAreaPara.InWorkAreaEntity.scanAlarmMsg = "下线物料与工单不符"; } } if (executeInWorkAreaPara.InWorkAreaEntity.scanAlarm == "Y" || executeInWorkAreaPara.InWorkAreaEntity.lastTrayAlarm == "Y") { executeInWorkAreaPara.BasisResponse = BasisResponse.Error("扫码异常因需报警暂不生成任务"); executeInWorkAreaPara.TaskExecuteState = new TaskExecuteState().Ok(new OkTask() { scanAlarm = executeInWorkAreaPara.InWorkAreaEntity.scanAlarm, scanAlarmMsg = executeInWorkAreaPara.InWorkAreaEntity.scanAlarmMsg, itemCode = executeInWorkAreaPara.InWorkAreaEntity.data[0].itemCode }); return executeInWorkAreaPara; } executeInWorkAreaPara.InWorkAreaEntity.data[0].itemName = lstWorkOrder[0].CN_S_ITEM_NAME; executeInWorkAreaPara.InWorkAreaEntity.data[0].lotNo = lstWorkOrder[0].CN_S_PRODUCT_BATCH; executeInWorkAreaPara.InWorkAreaEntity.data[0].itemState = ""; executeInWorkAreaPara.InWorkAreaEntity.data[0].productionDate = DateTime.Now; executeInWorkAreaPara.InWorkAreaEntity.data[0].uniqueCode = ""; executeInWorkAreaPara.InWorkAreaEntity.workOrder = lstWorkOrder[0].CN_S_WO_NO; var item = BLLCreator.Create().GetItem(executeInWorkAreaPara.InWorkAreaEntity.data[0].itemCode); if (item != null) { executeInWorkAreaPara.InWorkAreaEntity.data[0].itemPackUnit = item.CN_S_MEASURE_UNIT; executeInWorkAreaPara.InWorkAreaEntity.data[0].CN_C_IS_LOT_OU = lstWorkOrder[0].CN_C_IS_LOT_OUT; executeInWorkAreaPara.InWorkAreaEntity.data[0].itemModel = item.CN_S_MODEL; decimal canTray = lstWorkOrder[0].CN_F_PLAN_TRAY_QTY - lstWorkOrder[0].CN_F_REAL_TRAY_QTY; if (canTray == 1) { executeInWorkAreaPara.InWorkAreaEntity.data[0].qty = lstWorkOrder[0].CN_F_PLAN_QTY - lstWorkOrder[0].CN_F_REAL_QTY; } else if (canTray > 1) { executeInWorkAreaPara.InWorkAreaEntity.data[0].qty = lstWorkOrder[0].CN_F_MIN_PACK_QTY; } else { executeInWorkAreaPara.BasisResponse = BasisResponse.Error("工单" + lstWorkOrder[0].CN_S_WO_NO + "数据异常,计划生产托数小于实际生产托数"); return executeInWorkAreaPara; } executeInWorkAreaPara.InWorkAreaEntity.data[0].CN_F_MIN_PACK_QTY = lstWorkOrder[0].CN_F_MIN_PACK_QTY; } else { executeInWorkAreaPara.BasisResponse = BasisResponse.Error("物料" + executeInWorkAreaPara.InWorkAreaEntity.data[0].itemCode + "在AutoBom中没有维护"); return executeInWorkAreaPara; } #endregion } } else { executeInWorkAreaPara.BasisResponse = BasisResponse.Error(executeInWorkAreaPara.InWorkAreaEntity.produceLine + "在系统中没有正在执行中的工单信息"); return executeInWorkAreaPara; } #endregion #region 生成虚拟托盘号 //生成虚拟托盘 var postData = "{\"appCode\":\"" + Constants.appCode + "\",\"ruleName\":\"" + Constants.VirtualTray + "\",\"orgId\":\"0\",\"orgFlag\":\"\"}"; executeInWorkAreaPara.InWorkAreaEntity.trayCode = WebApiManager.HttpAutoBom_Post("api/BillRule/GenBillNo", postData); if (string.IsNullOrEmpty(executeInWorkAreaPara.InWorkAreaEntity.trayCode)) { executeInWorkAreaPara.BasisResponse = BasisResponse.Error("获取AUTOBOM托盘号异常,请检查是否维护生成规则!"); return executeInWorkAreaPara; } #endregion #region 计算入仓库左侧还是右侧算法 decimal workPlanQty = lstWorkOrder[0].CN_F_PLAN_TRAY_QTY; decimal realTrayQty = lstWorkOrder[0].CN_F_REAL_TRAY_QTY; if(workPlanQty < 12) { if(workPlanQty <=5) { executeInWorkAreaPara.InWorkAreaEntity.inLeftOrRight = "left"; } else { executeInWorkAreaPara.InWorkAreaEntity.inLeftOrRight = "right"; } } else if(workPlanQty == 12) { executeInWorkAreaPara.InWorkAreaEntity.inLeftOrRight = "left"; } else if (workPlanQty > 12) { if(workPlanQty -realTrayQty >= 12 ) { executeInWorkAreaPara.InWorkAreaEntity.inLeftOrRight = "left"; } else { if(workPlanQty%12<=5) { executeInWorkAreaPara.InWorkAreaEntity.inLeftOrRight = "right"; } else { executeInWorkAreaPara.InWorkAreaEntity.inLeftOrRight = "left"; } } } else { executeInWorkAreaPara.BasisResponse = BasisResponse.Error(lstWorkOrder[0].CN_S_WO_NO + "工单号的计划生产托数为负值不合法"); return executeInWorkAreaPara; } #endregion } if (string.IsNullOrEmpty(executeInWorkAreaPara.InWorkAreaEntity.produceLine)) { executeInWorkAreaPara.InWorkAreaEntity.produceLine = ""; } //处理是否需要打包的问题 if (executeInWorkAreaPara.InWorkAreaEntity.data[0].CN_C_IS_LOT_OU == "Y") { string packBit = string.Empty; try { packBit = System.Configuration.ConfigurationManager.AppSettings["packBit"].ToString(); } catch (Exception ex) { executeInWorkAreaPara.BasisResponse = BasisResponse.Error("在webconfig中没有维护打包机位置"); return executeInWorkAreaPara; } executeInWorkAreaPara.InWorkAreaEntity.endBit = packBit; //是否打包+物料编码+产线 已英文逗号隔开 executeInWorkAreaPara.InWorkAreaEntity.remark = "Y," + executeInWorkAreaPara.InWorkAreaEntity.data[0].itemCode + "," + executeInWorkAreaPara.InWorkAreaEntity.produceLine; executeInWorkAreaPara.InWorkAreaEntity.taskType = "下线打包"; } else { executeInWorkAreaPara.InWorkAreaEntity.remark = "N," + executeInWorkAreaPara.InWorkAreaEntity.data[0].itemCode + "," + executeInWorkAreaPara.InWorkAreaEntity.produceLine; } if (!string.IsNullOrEmpty(executeInWorkAreaPara.InWorkAreaEntity.endBit)) { #region 处理入库终点 executeInWorkAreaPara.EndLocationEntity = DALCreator.Create().GetModel(executeInWorkAreaPara.InWorkAreaEntity.endBit); if (executeInWorkAreaPara.EndLocationEntity != null) { executeInWorkAreaPara.EndStockAreaEntity = DALCreator.Create().GetStockAreaEntity(executeInWorkAreaPara.EndLocationEntity.CN_S_AREA_CODE); if (executeInWorkAreaPara.EndStockAreaEntity == null) { executeInWorkAreaPara.BasisResponse = BasisResponse.Error("结束位置:" + executeInWorkAreaPara.InWorkAreaEntity.endBit + ",库区:" + executeInWorkAreaPara.EndLocationEntity.CN_S_AREA_CODE + "未找到库区信息!"); return executeInWorkAreaPara; } } else { executeInWorkAreaPara.BasisResponse = BasisResponse.Error("结束位置:" + executeInWorkAreaPara.InWorkAreaEntity.endBit + "未找到货位信息!"); return executeInWorkAreaPara; } // 检查货位状态 管控数量时使用 if (executeInWorkAreaPara.EndStockAreaEntity.CN_C_IS_CONTROL_QTY.Equals("Y")) { executeInWorkAreaPara.EndLocationExt = BLLCreator.Create().GetModel(" where CN_S_LOCATION_CODE = '" + executeInWorkAreaPara.InWorkAreaEntity.endBit.Trim() + "'").FirstOrDefault(); if (!executeInWorkAreaPara.EndLocationExt.CN_S_LOCATION_STATE.Equals("正常")) { executeInWorkAreaPara.BasisResponse = BasisResponse.Error("当前终点货位状态为" + executeInWorkAreaPara.EndLocationExt.CN_S_LOCATION_STATE + ",货位不可用!"); return executeInWorkAreaPara; } if (!executeInWorkAreaPara.EndLocationExt.CN_S_USE_STATE.Equals("空")) { executeInWorkAreaPara.BasisResponse = BasisResponse.Error("当前终点货位存储状态为" + executeInWorkAreaPara.EndLocationExt.CN_S_USE_STATE + ",货位不可用!"); return executeInWorkAreaPara; } //锁定终点货位 OperateResult lockResult = BLLCreator.Create().UpdateState(executeInWorkAreaPara.InWorkAreaEntity.endBit, "预入库锁定", "正常"); if (lockResult.Success && lockResult.AffectedRows > 0) { AutoBomLocationEntity locationModel = DALCreator.Create().GetModel(executeInWorkAreaPara.InWorkAreaEntity.endBit); //添加货位状态变化 BLLCreator.Create().AddStateChange(executeInWorkAreaPara.InWorkAreaEntity.endBit, "正常", "预入库锁定", "入库并且转运需要锁定终点货位防止其他资源竞争", executeInWorkAreaPara.InWorkAreaEntity.sysName, "", "", locationModel.CN_S_STOCK_CODE, locationModel.CN_S_AREA_CODE, null); executeInWorkAreaPara.RollbackLocations.Add(executeInWorkAreaPara.InWorkAreaEntity.endBit); } else { if (!lockResult.Success) { executeInWorkAreaPara.BasisResponse = BasisResponse.Error("锁定终点货位" + executeInWorkAreaPara.InWorkAreaEntity.endBit + "失败!详细原因为:" + lockResult.Msg); } else { executeInWorkAreaPara.BasisResponse = BasisResponse.Error("锁定终点货位" + executeInWorkAreaPara.InWorkAreaEntity.endBit + "失败!详细原因为:SqlExecuteResult影响行数为0"); } return executeInWorkAreaPara; } } #endregion } return executeInWorkAreaPara; } public override ExecuteInWorkAreaPara InWorkAreaCalculatePath(ref ExecuteInWorkAreaPara executeInWorkAreaPara, LogPara logPara) { //获取作业区列表 var workAreaProList = BLLCreator.Create().GetInWorkPosition(executeInWorkAreaPara); if (workAreaProList.Any()) { if (executeInWorkAreaPara.InWorkAreaEntity.isRain.Equals("Y")) { executeInWorkAreaPara.WorkAreaProEntitys = workAreaProList.Where(o => o.CN_S_TYPE_CODE == "雨天入库").ToList(); } else { if (executeInWorkAreaPara.InWorkAreaEntity.inLeftOrRight == "left") { executeInWorkAreaPara.WorkAreaProEntitys = workAreaProList.Where(o => o.CN_S_TYPE_CODE == "晴天入左库").OrderBy(a => a.CN_N_PRIORITY).ToList(); } else { executeInWorkAreaPara.WorkAreaProEntitys = workAreaProList.Where(o => o.CN_S_TYPE_CODE == "晴天入右库").OrderBy(a => a.CN_N_PRIORITY).ToList(); } } } else { executeInWorkAreaPara.BasisResponse = BasisResponse.Error("未找到该起点库区到终点库区的作业流转流程!"); return executeInWorkAreaPara; } return executeInWorkAreaPara; } public override ExecuteInWorkAreaPara InWorkAreaInAss(ref ExecuteInWorkAreaPara executeInWorkAreaPara, LogPara logPara) { var logicAreaCode = string.Empty; if (executeInWorkAreaPara.InWorkAreaEntity.data != null) { if (executeInWorkAreaPara.InWorkAreaEntity.data.Count() > 0) { //根据物料查找逻辑分区 if (!string.IsNullOrEmpty(executeInWorkAreaPara.InWorkAreaEntity.data[0].itemCode)) { List lstLogicEntityByItem = DALCreator.Create().GetPartitionItem(executeInWorkAreaPara.InWorkAreaEntity.data[0].itemCode, 2); logicAreaCode = lstLogicEntityByItem.FirstOrDefault() != null ? lstLogicEntityByItem.First().CN_S_AREA_CODE : ""; } } } var aEntity = new InAssignEntity() { objectType = InAssignEntity.ObjectType.托盘, objectCode = executeInWorkAreaPara.InWorkAreaEntity.trayCode, itemCode = (executeInWorkAreaPara.InWorkAreaEntity.data != null && executeInWorkAreaPara.InWorkAreaEntity.data.Count > 0) ? executeInWorkAreaPara.InWorkAreaEntity.data[0].itemCode : "", lotNo = (executeInWorkAreaPara.InWorkAreaEntity.data != null && executeInWorkAreaPara.InWorkAreaEntity.data.Count > 0) ? executeInWorkAreaPara.InWorkAreaEntity.data[0].lotNo : "", lstAreaPrior = executeInWorkAreaPara.WorkAreaProEntitys.Select(p => new areaPriorClass { areaCode = p.CN_S_END_AREA_CODE, Prior = p.CN_N_PRIORITY }).ToList(), projectCode = executeInWorkAreaPara.InWorkAreaEntity.projectCode, logicAreaCode = logicAreaCode, stockCode = executeInWorkAreaPara.InWorkAreaEntity.startStock, callSys = executeInWorkAreaPara.InWorkAreaEntity.sysName, needCalLock = true }; //根据库区获取货位 InAssignResultEntity resultEntity = BLLCreator.Create().InAssign(aEntity); if (resultEntity.Success) { executeInWorkAreaPara.TransportEntity.CN_S_QTY_INDEX = resultEntity.index; //增加到回滚记录里面 if ((resultEntity.areaType == Constants.Area_Struc_PingStock || resultEntity.areaType == Constants.Area_Struc_LiStock) && resultEntity.isControlQty == "Y") { executeInWorkAreaPara.RollbackLocations.Add(resultEntity.locationCode); } executeInWorkAreaPara.EndLocationEntity = BLLCreator.Create().GetLocationModel(resultEntity.locationCode); if (executeInWorkAreaPara.EndLocationEntity != null) executeInWorkAreaPara.EndStockAreaEntity = BLLCreator.Create().GetStockAreaEntity(executeInWorkAreaPara.EndLocationEntity.CN_S_AREA_CODE); } else { executeInWorkAreaPara.BasisResponse = BasisResponse.Error("在" + string.Join(",", executeInWorkAreaPara.WorkAreaProEntitys.Select(o => o.CN_S_END_AREA_CODE).ToList()) + "库区中未找到合适的入库货位,详细原因:" + resultEntity.Msg); } return executeInWorkAreaPara; } public override ExecuteInWorkAreaPara InWorkAreaCreateTask(ref ExecuteInWorkAreaPara executeInWorkAreaPara, LogPara logPara) { 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 = executeInWorkAreaPara.EndLocationEntity.CN_S_LOCATION_CODE; executeInWorkAreaPara.TransportEntity.CN_S_END_AREA = executeInWorkAreaPara.EndLocationEntity.CN_S_AREA_CODE; executeInWorkAreaPara.TransportEntity.CN_C_END_IS_CONTROL_QTY = executeInWorkAreaPara.EndStockAreaEntity.CN_C_IS_CONTROL_QTY; executeInWorkAreaPara.TransportEntity.CN_S_END_CONTROL_INV = executeInWorkAreaPara.EndStockAreaEntity.CN_C_IS_INVENTORY; executeInWorkAreaPara.TransportEntity.CN_S_END_AREA_TYPE = executeInWorkAreaPara.EndStockAreaEntity.CN_S_STRUCTURE; executeInWorkAreaPara.TransportEntity.CN_S_CREATOR = executeInWorkAreaPara.InWorkAreaEntity.creatorBy; executeInWorkAreaPara.TransportEntity.CN_S_CREATOR_BY = executeInWorkAreaPara.InWorkAreaEntity.creatorBy; executeInWorkAreaPara.TransportEntity.AMSTaskType = executeInWorkAreaPara.InWorkAreaEntity.taskType; return executeInWorkAreaPara; } public override ExecuteInWorkAreaPara InWorkAreaProcedure(ExecuteInWorkAreaPara executeInWorkAreaPara, LogPara logPara) { var result = UseTransaction(trans => { InWorkAreaProcedureFunc(executeInWorkAreaPara, trans, logPara); if (executeInWorkAreaPara.InWorkAreaEntity.needCreateAMSTask == "Y") { OperateResult re = new OtherSysApi().SendAmsCreateTaskHK(executeInWorkAreaPara.TransportEntity); if (!re.Success) { throw new Exception("SendAmsCreateTaskHK异常:" + re.Msg); } } }); if (result.Success) { executeInWorkAreaPara.TaskExecuteState = new TaskExecuteState().Ok(new OkTask() { index = executeInWorkAreaPara.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, CN_C_IS_LOT_OU = executeInWorkAreaPara.TransportEntity.CN_S_REMARK }); } else { executeInWorkAreaPara.BasisResponse = BasisResponse.Error("ExecuteInWorkArea 方法异常:" + result.Msg); } return executeInWorkAreaPara; } public override void InWorkAreaProcedureFunc(ExecuteInWorkAreaPara executeInWorkAreaPara, IDbTransaction trans, LogPara logPara) { if (executeInWorkAreaPara.InWorkAreaEntity.data != null) { if (executeInWorkAreaPara.InWorkAreaEntity.data.Count > 0) { //删除托盘产品关联 CreateDAL().DeleteTrayItem(" CN_S_TRAY_CODE='" + executeInWorkAreaPara.InWorkAreaEntity.trayCode + "' ", trans); foreach (var item in executeInWorkAreaPara.InWorkAreaEntity.data) { var trayItemMstGuid = Guid.NewGuid().ToString(); //添加托盘物料关联主表 var transResult = CreateDAL().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_S_MODEL = item.itemModel }, trans); if (!transResult.Success) { trans.Rollback(); return; } //添加托盘物料关联子表 var curResult = CreateDAL().AddDtl(new List() { new TN_WM_B_TRAY_ITEM_DTLEntity{ CN_PARENT_GUID = trayItemMstGuid, CN_S_PRODUCTION_BATCH = 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; } } } } if (!executeInWorkAreaPara.InWorkAreaEntity.isTransport.Equals("Y")) { var oResult = BLLCreator.Create().WorkOrderQtyReportBack(executeInWorkAreaPara.InWorkAreaEntity.workOrder, executeInWorkAreaPara.InWorkAreaEntity.data[0].qty.ToString(), executeInWorkAreaPara.InWorkAreaEntity.data[0].CN_F_MIN_PACK_QTY.ToString(), trans); if (!oResult.Success) { trans.Rollback(); return; } } var transport = executeInWorkAreaPara.TransportEntity; //创建任务 var operateResult = BLLCreator.Create>().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_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 }, trans); //更新结束点的任务号 if (executeInWorkAreaPara.TransportEntity.CN_C_END_IS_CONTROL_QTY.Equals("Y")) { CreateDAL().UpdateLocationExtState(executeInWorkAreaPara.TransportEntity.CN_S_END_BIT, "", "", executeInWorkAreaPara.TransportEntity.CN_S_TASK_NO, trans); } //更新起点的任务号 if (executeInWorkAreaPara.TransportEntity.CN_C_START_IS_CONTROL_QTY.Equals("Y")) //&& executeInWorkAreaPara.InWorkAreaEntity.isTransport.Equals("Y") { CreateDAL().UpdateLocationExtState(executeInWorkAreaPara.TransportEntity.CN_S_START_BIT, "", "", executeInWorkAreaPara.TransportEntity.CN_S_TASK_NO, trans); } } public override string ExecuteState(ExecuteStateDto executeState) { var logPara = LogType.LogPara("完工回报"); var res = ExecuteState(executeState, logPara); return JsonConvert.SerializeObject(res); } 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 = PickSucc(executeStatePara, logPara); } break; case "卸货完成": if (project == ProjectCodes.TaiZhouLongJi) { result = BLLCreator.Create().UnloadingSuccLJ(executeStatePara, new Redis.ReisModel.RedisUserEntity(), logPara); } else if (project == ProjectCodes.QuZhouHuaKai) { result = BLLCreator.Create().UnloadingSuccQzhk(executeStatePara, new Redis.ReisModel.RedisUserEntity(), logPara); } else { result = BLLCreator.Create().UnloadingSucc(executeStatePara, new Redis.ReisModel.RedisUserEntity(), logPara); } break; } return result; } #region 取货完成 /// /// 取货完成 /// /// 任务号 /// 用户信息 /// /// [HANHE(dbs)] CREATED BY 2019-3-14 public OperateResult PickSucc(ExecuteStateParaDto executeStatePara, LogPara logPara) { //if (executeStatePara.transportTask.CN_S_TASK_TYPE.Equals("入库")) // return new OperateResult { Success = false, Msg = "当前任务类型为入库,不允许执行取货完成!" }; var locationExt = BLLCreator.Create>().GetSingleEntity(new { CN_S_LOCATION_CODE = executeStatePara.transportTask.CN_S_START_BIT }); if (locationExt == null) { 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.startTrayLocation != null) { //解绑托盘与货位的关系 CreateDAL>().Delete(new { executeStatePara.transportTask.CN_S_TRAY_CODE, CN_S_LOCATION_CODE = executeStatePara.transportTask.CN_S_START_BIT }, trans); //添加下架记录 // DownHistoryByEndTask(executeStatePara, logPara, trans); } if (executeStatePara.transportTask.CN_S_TASK_TYPE.Equals("出库")) { //删除托盘产品关联 CreateDAL().DeleteTrayItem(" CN_S_TRAY_CODE='" + executeStatePara.transportTask.CN_S_TRAY_CODE + "' ", trans); } //起点是否属于当前任务 if (executeStatePara.startIsCurrentTask != null && executeStatePara.transportTask.CN_C_START_IS_CONTROL_QTY.Equals("Y")) { if (locationExt.CN_S_LOCATION_STATE.Equals("预出库锁定")) { CreateDAL>().Update(new { CN_S_LOCATION_STATE = "正常", CN_S_USE_STATE = "空" }, new { CN_S_LOCATION_CODE = executeStatePara.transportTask.CN_S_START_BIT }, trans); } //货位状态变化 BLLCreator.Create().AddStateChange(executeStatePara.transportTask.CN_S_START_BIT, "预出库锁定", "正常", "状态回报取货完成", "", "", "", executeStatePara.endStockArea.CN_S_STOCK_CODE, executeStatePara.endStockArea.CN_S_AREA_CODE, trans); } }); } #endregion #region 下架记录(完成任务) private void DownHistoryByEndTask(ExecuteStateParaDto executeStatePara, LogPara logPara, IDbTransaction trans) { var downHis = new List(); if (executeStatePara.trayItemMsts.Count > 0) { foreach (var trayItemMst in executeStatePara.trayItemMsts) { var uniqueCode = ""; if (trayItemMst.TrayItemDtlList != null) { if (trayItemMst.TrayItemDtlList.Count > 0) { trayItemMst.TrayItemDtlList.ForEach(e => { uniqueCode += (e.CN_S_UNIQUE_CODE + ","); }); //uniqueCode = trayItemMst.TrayItemDtlList.Where(e => e.CN_S_ITEM_CODE.Equals(trayItemMst.CN_S_ITEM_CODE)).FirstOrDefault().CN_S_UNIQUE_CODE; } if (!string.IsNullOrEmpty(uniqueCode)) { uniqueCode = uniqueCode.Substring(0, uniqueCode.Length - 1); } } downHis.Add(new TN_WM_DOWN_HISTORYEntity { CN_GUID = Guid.NewGuid().ToString(), CN_S_LOCATION_CODE = executeStatePara.transportTask.CN_S_START_BIT, CN_S_ITEM_STATE = trayItemMst.CN_S_ITEM_STATE, CN_S_TRAY_CODE = trayItemMst.CN_S_TRAY_CODE, CN_S_TRAY_GRID = trayItemMst.CN_S_TRAY_GRID, CN_S_ITEM_CODE = trayItemMst.CN_S_ITEM_CODE, CN_S_ITEM_NAME = trayItemMst.CN_S_ITEM_NAME, CN_S_PRODUCTION_BATCH = trayItemMst.CN_S_LOT_NO, CN_F_QUANTITY = trayItemMst.CN_F_QUANTITY, CN_S_MODEL = trayItemMst.CN_S_MODEL, CN_S_STOCK_AREA = executeStatePara.transportTask.CN_S_START_AREA, CN_S_STOCK_CODE = executeStatePara.transportTask.CN_S_STOCK_CODE, CN_T_CREATE = DateTime.Now, CN_T_MODIFY = DateTime.Now, CN_S_OWNER = "", CN_S_MEASURE_UNIT = "", CN_S_CREATOR = executeStatePara.transportTask.CN_S_CREATOR, CN_S_CREATOR_BY = executeStatePara.transportTask.CN_S_CREATOR_BY, CN_S_MODIFY = "", CN_S_MODIFY_BY = "", CN_S_OP_FROM = "任务完成-" + executeStatePara.transportTask.CN_S_TASK_TYPE, CN_S_EXT1 = uniqueCode //executeStatePara.uniqueCodes }); } } else { downHis.Add(new TN_WM_DOWN_HISTORYEntity { CN_GUID = Guid.NewGuid().ToString(), CN_S_LOCATION_CODE = executeStatePara.transportTask.CN_S_START_BIT, CN_S_ITEM_STATE = "", CN_S_TRAY_CODE = executeStatePara.transportTask.CN_S_TRAY_CODE, CN_S_TRAY_GRID = "1", CN_S_ITEM_CODE = "", CN_S_ITEM_NAME = "", CN_S_PRODUCTION_BATCH = "", CN_F_QUANTITY = 1,//CN_S_WEIGHT,//.CN_F_QUANTITY, CN_S_MODEL = "", CN_S_STOCK_AREA = executeStatePara.transportTask.CN_S_START_AREA, CN_S_STOCK_CODE = executeStatePara.transportTask.CN_S_STOCK_CODE, CN_T_CREATE = DateTime.Now, CN_T_MODIFY = DateTime.Now, CN_S_OWNER = "", CN_S_MEASURE_UNIT = "", CN_S_CREATOR = executeStatePara.transportTask.CN_S_CREATOR, CN_S_CREATOR_BY = executeStatePara.transportTask.CN_S_CREATOR_BY, CN_S_MODIFY = "", CN_S_MODIFY_BY = "", CN_S_OP_FROM = "任务完成-" + executeStatePara.transportTask.CN_S_TASK_TYPE, CN_S_EXT1 = "", CN_S_EXT2 = executeStatePara.transportTask.CN_S_EXT1, CN_S_LOT_NO = "", CN_S_FIGURE_NO = "" }); } //下架记录 if (downHis.Any()) { CreateDAL>().AddRange(downHis, trans); Log.Detail(logPara, "添加下架记录,内容:" + LogDescribe.Content(downHis)); } } #endregion 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 = trayItemDtl.CN_S_PRODUCTION_BATCH, CN_S_LOT_NO = trayItemDtl.CN_S_LOT_NO, CN_F_QUANTITY = trayItemMst.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 = trayItemDtl.CN_S_PRODUCTION_BATCH, CN_S_LOT_NO = trayItemDtl.CN_S_LOT_NO, CN_F_QUANTITY = trayItemMst.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 添加上架记录,升库存 if (executeStatePara.endStockArea.CN_C_IS_INVENTORY.Equals("Y")) { CompleteTaskUpHistory(executeStatePara, logPara, trans); //按未入库量增加结束库区量 CreateDAL().AddAreaQty(addAreaQty, executeStatePara.transportTask.CN_S_END_AREA, logPara, trans); //升仓库库存 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("分拣回") || 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, "解绑任务的托盘和起点货位关联!"); } 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")) { 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); // //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 #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 #region 上架 if (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.endTrayLocation == null) { //添加托盘货位 var addResult = BLLCreator.Create().Add(trayLocation, trans, logPara); Log.Detail(logPara, "添加托盘货位结果:" + JsonConvert.SerializeObject(addResult)); //CreateDAL>().Add(trayLocation, trans); if (isControlStockQty) { //获取配置是否启用收货区 var strategyValue = BLLCreator.Create().GetStrategy(executeStatePara.transportTask.CN_S_STOCK_CODE, StrategyKey.AreaQtyReceiveGood); #region 添加上架记录,升库存 CompleteTaskUpHistory(executeStatePara, logPara, trans); if (string.IsNullOrEmpty(executeStatePara.transportTask.CN_S_END_CONTROL_INV)) { trans.Rollback(); return; } //启用收货区 if (strategyValue.Equals(Constants.Y)) { Log.Detail(logPara, "启用收货区!"); //降低起始库区(收货区)库存 CreateDAL().ReduceAreaQty(addAreaQty, executeStatePara.transportTask.CN_S_START_AREA, logPara, trans); if (executeStatePara.transportTask.CN_S_END_CONTROL_INV.Equals("Y")) { //增加结束库区量 CreateDAL().AddAreaQty(addAreaQty, executeStatePara.transportTask.CN_S_END_AREA, logPara, trans); } } else { if (executeStatePara.transportTask.CN_S_END_CONTROL_INV.Equals("Y")) { //按未入库量增加结束库区量 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); ////更新终点货位的任务号 //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_C_START_IS_CONTROL_QTY.Equals("Y")) { //解绑托盘与货位的关系 CreateDAL>().Delete(new { executeStatePara.transportTask.CN_S_TRAY_CODE, CN_S_LOCATION_CODE = executeStatePara.transportTask.CN_S_START_BIT }, trans); Log.Detail(logPara, "解绑任务的托盘和起点货位" + executeStatePara.transportTask.CN_S_START_BIT + "关联!"); CreateDAL().UpdateState(executeStatePara.transportTask.CN_S_START_BIT, "正常", "空", "预出库锁定", trans); Log.Detail(logPara, "更新预出库锁定的货位状态为正常、空,起点货位号:" + executeStatePara.transportTask.CN_S_START_BIT); ////更新起点货位的任务号 //CreateDAL>().Update(new { CN_S_TASK_NO = "" }, new { CN_S_LOCATION_CODE = executeStatePara.transportTask.CN_S_START_BIT }); //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("下架") || 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); if (executeStatePara.endStockArea.CN_C_IS_CONTROL_QTY.Equals("N")) { BLLCreator.Create().Delete(" CN_S_TRAY_CODE='" + executeStatePara.transportTask.CN_S_TRAY_CODE + "' ", trans, logPara); } if (isControlStockQty) { #region 添加下架记录,降库存 CompleteTaskDownHistory(executeStatePara, logPara, trans); //获取配置是否启用收货区 var strategyValue = BLLCreator.Create().GetStrategy(executeStatePara.transportTask.CN_S_STOCK_CODE, StrategyKey.AreaQtyDeliverGood); if (strategyValue.Equals(Constants.Y)) { if (executeStatePara.transportTask.CN_S_START_CONTROL_INV.Equals("Y")) { CreateDAL().ReduceAreaQty(addAreaQty, executeStatePara.transportTask.CN_S_START_AREA, logPara, trans); } //增加终点库区(收货区)库存 CreateDAL().AddAreaQty(addAreaQty, executeStatePara.transportTask.CN_S_END_AREA, logPara, trans); } else { 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.startStockArea.CN_S_STOCK_CODE, executeStatePara.startStockArea.CN_S_AREA_CODE, trans); } if (executeStatePara.transportTask.CN_C_END_IS_CONTROL_QTY.Equals("Y")) { 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 }; //添加托盘货位 CreateDAL>().Add(trayLocation, trans); CreateDAL().UpdateState(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 }); //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); } } } #endregion #region 空托入(上架) if (executeStatePara.transportTask.CN_S_TASK_TYPE.Equals("空托入")) { Log.Detail(logPara, "开始执行空托入!"); 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 }; Log.Detail(logPara, "endTrayLocation: " + JsonConvert.SerializeObject(executeStatePara.endTrayLocation)); if (executeStatePara.endTrayLocation == null) { //添加托盘货位 CreateDAL>().Add(trayLocation, trans); if (isControlStockQty) { //获取配置是否启用收货区 var strategyValue = BLLCreator.Create().GetStrategy(executeStatePara.transportTask.CN_S_STOCK_CODE, StrategyKey.AreaQtyReceiveGood); #region 添加上架记录,升库存 CompleteTaskUpHistory(executeStatePara, logPara, trans); if (string.IsNullOrEmpty(executeStatePara.transportTask.CN_S_END_CONTROL_INV)) { trans.Rollback(); return; } //启用收货区 if (strategyValue.Equals(Constants.Y)) { Log.Detail(logPara, "启用收货区!"); //降低起始库区(收货区)库存 CreateDAL().ReduceAreaQty(addAreaQty, executeStatePara.transportTask.CN_S_START_AREA, logPara, trans); if (executeStatePara.transportTask.CN_S_END_CONTROL_INV.Equals("Y")) { //增加结束库区量 CreateDAL().AddAreaQty(addAreaQty, executeStatePara.transportTask.CN_S_END_AREA, logPara, trans); } } else { if (executeStatePara.transportTask.CN_S_END_CONTROL_INV.Equals("Y")) { //按未入库量增加结束库区量 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); ////更新终点货位的任务号 //CreateDAL>().Update(new { CN_S_TASK_NO = "" }, new { CN_S_LOCATION_CODE = executeStatePara.transportTask.CN_S_END_BIT }); //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")) { //解绑托盘与货位的关系 CreateDAL>().Delete(new { executeStatePara.transportTask.CN_S_TRAY_CODE, CN_S_LOCATION_CODE = executeStatePara.transportTask.CN_S_START_BIT }, trans); Log.Detail(logPara, "解绑任务的托盘和起点货位关联!"); CreateDAL().UpdateState(executeStatePara.transportTask.CN_S_START_BIT, "正常", "空", "预出库锁定", trans); Log.Detail(logPara, "更新预出库锁定的货位状态为正常、空,起点货位号:" + executeStatePara.transportTask.CN_S_START_BIT); ////更新起点货位的任务号 //CreateDAL>().Update(new { CN_S_TASK_NO = "" }, new { CN_S_LOCATION_CODE = executeStatePara.transportTask.CN_S_START_BIT }); //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("空托出")) { Log.Detail(logPara, "开始执行空托出!"); Log.Detail(logPara, "startTrayLocation: " + JsonConvert.SerializeObject(executeStatePara.startTrayLocation)); 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, "解绑任务的托盘和起点货位关联!"); ////删除托盘产品关联 //CreateDAL().Delete(" CN_S_TRAY_CODE='" + executeStatePara.transportTask.CN_S_TRAY_CODE + "' "); //Log.Detail(logPara, "删除当前任务的托盘物料关联!"); if (isControlStockQty) { #region 添加下架记录,降库存 CompleteTaskDownHistory(executeStatePara, logPara, trans); //获取配置是否启用收货区 var strategyValue = BLLCreator.Create().GetStrategy(executeStatePara.transportTask.CN_S_STOCK_CODE, StrategyKey.AreaQtyDeliverGood); if (strategyValue.Equals(Constants.Y)) { if (executeStatePara.transportTask.CN_S_START_CONTROL_INV.Equals("Y")) { CreateDAL().ReduceAreaQty(addAreaQty, executeStatePara.transportTask.CN_S_START_AREA, logPara, trans); } //增加终点库区(收货区)库存 CreateDAL().AddAreaQty(addAreaQty, executeStatePara.transportTask.CN_S_END_AREA, logPara, trans); } else { if (executeStatePara.transportTask.CN_S_START_CONTROL_INV.Equals("Y")) { CreateDAL().ReduceAreaQty(addAreaQty, executeStatePara.transportTask.CN_S_START_AREA, logPara, trans); if (!executeStatePara.transportTask.CN_S_TASK_TYPE.Equals("转运")) { //降低仓库库存 CreateDAL().ReduceStockQty(addStockQty, trans); Log.Detail(logPara, "降低仓库量表完成!"); } } } #endregion } if (executeStatePara.startIsCurrentTask != null && executeStatePara.transportTask.CN_C_START_IS_CONTROL_QTY.Equals("Y")) { CreateDAL().UpdateState(executeStatePara.transportTask.CN_S_START_BIT, "正常", "空", "预出库锁定", trans); Log.Detail(logPara, "更新预出库锁定的货位状态为正常、空,起始货位号:" + executeStatePara.transportTask.CN_S_START_BIT); ////更新起点货位的任务号 //CreateDAL>().Update(new { CN_S_TASK_NO = "" }, new { CN_S_LOCATION_CODE = executeStatePara.transportTask.CN_S_START_BIT }); //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); } if (executeStatePara.transportTask.CN_C_END_IS_CONTROL_QTY.Equals("Y")) { 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 }; ////添加托盘货位 //CreateDAL>().Add(trayLocation, trans); CreateDAL().UpdateState(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 }); //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); } } } #endregion #region 移库 if (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, "解绑任务的托盘和起点货位关联!"); } if (executeStatePara.endTrayLocation == null) { //添加托盘货位 CreateDAL>().Add(trayLocation, trans); Log.Detail(logPara, "添加托盘货位关联,内容:" + LogDescribe.Content(trayLocation)); if (isControlStockQty) { #region 下架记录 CompleteTaskDownHistory(executeStatePara, logPara, trans); #endregion #region 上架记录 CompleteTaskUpHistory(executeStatePara, logPara, trans); if (string.IsNullOrEmpty(executeStatePara.transportTask.CN_S_END_CONTROL_INV)) { Log.Detail(logPara, "终点库区" + executeStatePara.transportTask.CN_S_END_AREA + "不管控库存!executeStatePara.transportTask.CN_S_END_CONTROL_INV:" + executeStatePara.transportTask.CN_S_END_CONTROL_INV); trans.Rollback(); return; } #endregion #region 库存 if (executeStatePara.transportTask.CN_S_START_CONTROL_INV.Equals("Y")) //降低起点库存 { CreateDAL().ReduceAreaQtyAndAllocQty(addAreaQty, executeStatePara.transportTask.CN_S_START_AREA, logPara, trans); } if (executeStatePara.transportTask.CN_S_END_CONTROL_INV.Equals("Y")) //增加终点库存 { //按未入库量增加结束库区量 CreateDAL().AddAreaQty(addAreaQty, executeStatePara.transportTask.CN_S_END_AREA, logPara, trans); } #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")) { 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 }); } public override void CompleteTaskUpHistory(ExecuteStateParaDto executeStatePara, LogPara logPara, IDbTransaction trans) { var upHis = new List(); foreach (var trayItemMst in executeStatePara.trayItemMsts) { foreach (var trayItemDtl in trayItemMst.TrayItemDtlList) { upHis.Add(new TN_WM_UP_HISTORYEntity { CN_GUID = Guid.NewGuid().ToString(), CN_S_LOCATION_CODE = executeStatePara.transportTask.CN_S_END_BIT, CN_S_ITEM_STATE = trayItemMst.CN_S_ITEM_STATE, CN_S_TRAY_CODE = trayItemMst.CN_S_TRAY_CODE, CN_S_TRAY_GRID = trayItemMst.CN_S_TRAY_GRID == null ? "" : trayItemMst.CN_S_TRAY_GRID, CN_S_ITEM_CODE = trayItemMst.CN_S_ITEM_CODE, CN_S_ITEM_NAME = trayItemMst.CN_S_ITEM_NAME, CN_S_PRODUCTION_BATCH = trayItemDtl.CN_S_PRODUCTION_BATCH, CN_F_QUANTITY = trayItemMst.CN_F_QUANTITY,//CN_S_WEIGHT CN_S_MODEL = trayItemMst.CN_S_MODEL, CN_S_STOCK_AREA = executeStatePara.transportTask.CN_S_END_AREA, CN_S_STOCK_CODE = executeStatePara.transportTask.CN_S_STOCK_CODE, CN_T_CREATE = DateTime.Now, CN_T_MODIFY = DateTime.Now, CN_S_OWNER = "", CN_S_MEASURE_UNIT = trayItemMst.CN_S_MEASURE_UNIT, CN_S_CREATOR = executeStatePara.transportTask.CN_S_CREATOR, CN_S_CREATOR_BY = executeStatePara.transportTask.CN_S_CREATOR_BY, CN_S_MODIFY = "", CN_S_MODIFY_BY = "", CN_S_OP_FROM = "任务完成-" + executeStatePara.transportTask.CN_S_TASK_TYPE, CN_S_EXT1 = trayItemMst.CN_S_UNIQUE_CODE, CN_S_EXT2 = executeStatePara.transportTask.CN_S_EXT1, CN_S_LOT_NO = trayItemMst.CN_S_LOT_NO, CN_S_FIGURE_NO = trayItemMst.CN_S_FIGURE_NO }); } } //上架记录 if (upHis.Any()) { Log.Detail(logPara, "添加上架记录,内容:" + LogDescribe.Content(upHis)); CreateDAL>().AddRange(upHis, trans); } } } }