using HH.WMS.BLL.Algorithm; using HH.WMS.BLL.Basic; 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.SysMgr; using HH.WMS.Entitys; using HH.WMS.Entitys.Autobom; using HH.WMS.Entitys.Basic; 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.Data; using System.Globalization; using System.Linq; using System.Text; using System.Threading.Tasks; namespace HH.WMS.BLL.External { /// /// WMS对外接口-巨星海宁 /// public class WmsApiForJxhnBLL : WmsApiBaseBLL { #region 针对巨星需求定制的出入库代码 public override ExecuteInWorkAreaPara InWorkAreaVerifyPara(ref ExecuteInWorkAreaPara executeInWorkAreaPara, LogPara logPara) { // if (executeInWorkAreaPara.InWorkAreaEntity.isTransport == null) executeInWorkAreaPara.InWorkAreaEntity.isTransport = "N"; //任务号_当任务号不为空时,系统判断任务号是否重复 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.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); executeInWorkAreaPara.errorCode = "1001"; 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 + ",货位不可用!"); executeInWorkAreaPara.errorCode = "1001"; return executeInWorkAreaPara; } if (!executeInWorkAreaPara.StartLocationExt.CN_S_USE_STATE.Equals("满")) { executeInWorkAreaPara.BasisResponse = BasisResponse.Error("当前起始货位存储状态为" + executeInWorkAreaPara.StartLocationExt.CN_S_USE_STATE + ",货位不可用!"); executeInWorkAreaPara.errorCode = "1001"; 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入库任务号异常,请检查是否维护生成规则!"); } //托盘码 if (string.IsNullOrEmpty(executeInWorkAreaPara.InWorkAreaEntity.trayCode)) { //转运并且不传托盘号,默认从货位中获取 if (executeInWorkAreaPara.InWorkAreaEntity.isTransport == "Y") { //查找托盘号和物料编码 and by liuying #region 装运从货位中读取托盘号 var lstObj = BLLCreator.Create().GetListByLocationCode(executeInWorkAreaPara.InWorkAreaEntity.startBit); if (lstObj.Count > 0) { //去除已经在任务中的托盘 var strTray = string.Join("','", lstObj.Select(o => o.CN_S_TRAY_CODE).ToList()); var lstTasks = BLLCreator.Create().GetTask(" AND CN_S_TRAY_CODE in ('" + strTray + "') AND (CN_S_STATE = '未执行' or CN_S_STATE = '执行中')"); var lstInTaskTray = lstTasks.Select(o => o.CN_S_TRAY_CODE).ToList(); lstObj.RemoveAll(o => lstInTaskTray.Contains(o.CN_S_TRAY_CODE)); if (lstObj.Count > 0) { 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 = trayItemDtl[0].CN_S_PACKING_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 + "中的托盘都已在任务中,不允许重复下达"); } } else { executeInWorkAreaPara.BasisResponse = BasisResponse.Error("起点货位" + executeInWorkAreaPara.InWorkAreaEntity.startBit + "没有绑定托盘"); return executeInWorkAreaPara; } #endregion } else { var trayLocation = BLLCreator.Create().GetByLocationCode(executeInWorkAreaPara.InWorkAreaEntity.startBit); if (trayLocation == null) { //生成虚拟托盘 var postData = "{\"appCode\":\"" + Constants.appCode + "\",\"ruleName\":\"" + Constants.VirtualTray + "\",\"orgId\":\"0\",\"orgFlag\":\"\"}"; executeInWorkAreaPara.InWorkAreaEntity.trayCode = WebApiManager.HttpAutoBom_Post("api/BillRule/GenBillNo", postData); } else { executeInWorkAreaPara.InWorkAreaEntity.trayCode = trayLocation.CN_S_TRAY_CODE; } } } else { if (executeInWorkAreaPara.InWorkAreaEntity.isTransport == "Y") { var trayLocation = BLLCreator.Create().GetByLocationCodeAndTrayCode(executeInWorkAreaPara.InWorkAreaEntity.startBit, executeInWorkAreaPara.InWorkAreaEntity.trayCode); if (trayLocation == null) { executeInWorkAreaPara.BasisResponse = BasisResponse.Error("该托盘:" + executeInWorkAreaPara.InWorkAreaEntity.trayCode + "没有与起点绑定。"); executeInWorkAreaPara.errorCode = "1001"; return executeInWorkAreaPara; } } var lstTasks = BLLCreator.Create().GetTask(" AND CN_S_TRAY_CODE = '" + executeInWorkAreaPara.InWorkAreaEntity.trayCode + "' AND CN_S_STATE in ('未执行','执行中','取货完成','卸货完成')"); if (lstTasks.Count > 0) { executeInWorkAreaPara.BasisResponse = BasisResponse.Error("该托盘:" + executeInWorkAreaPara.InWorkAreaEntity.trayCode + "已在任务中,请勿重复下达任务。"); executeInWorkAreaPara.errorCode = "1001"; return executeInWorkAreaPara; } } if (!string.IsNullOrEmpty(executeInWorkAreaPara.InWorkAreaEntity.endBit)) { 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 + "未找到库区信息!"); executeInWorkAreaPara.errorCode = "1001"; return executeInWorkAreaPara; } } else { executeInWorkAreaPara.BasisResponse = BasisResponse.Error("结束位置:" + executeInWorkAreaPara.InWorkAreaEntity.endBit + "未找到货位信息!"); executeInWorkAreaPara.errorCode = "1001"; return executeInWorkAreaPara; } // 检查货位状态 if (executeInWorkAreaPara.EndStockAreaEntity.CN_C_IS_CONTROL_QTY.Equals("Y")) { #region 终点管控货位 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 + ",货位不可用!"); executeInWorkAreaPara.errorCode = "1001"; return executeInWorkAreaPara; } if (!executeInWorkAreaPara.EndLocationExt.CN_S_USE_STATE.Equals("空")) { executeInWorkAreaPara.BasisResponse = BasisResponse.Error("当前终点货位存储状态为" + executeInWorkAreaPara.EndLocationExt.CN_S_USE_STATE + ",货位不可用!"); executeInWorkAreaPara.errorCode = "1001"; 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 } executeInWorkAreaPara.InWorkAreaEntity.endArea = executeInWorkAreaPara.EndStockAreaEntity.CN_S_AREA_CODE; executeInWorkAreaPara.InWorkAreaEntity.endStock = executeInWorkAreaPara.EndStockAreaEntity.CN_S_STOCK_CODE; } return executeInWorkAreaPara; } public override ExecuteInWorkAreaPara InWorkAreaCalculatePath(ref ExecuteInWorkAreaPara executeInWorkAreaPara, LogPara logPara) { //获取作业区列表 List workAreaProList = new List(); if (executeInWorkAreaPara.InWorkAreaEntity.endArea == null) { executeInWorkAreaPara.BasisResponse = BasisResponse.Error("输入参数终点库区不能为空!"); return executeInWorkAreaPara; } string[] arrArea = executeInWorkAreaPara.InWorkAreaEntity.endArea.Split(','); int prior = 0; foreach (string endA in arrArea) { prior = prior + 1; TN_AB_B_WORK_AREA_PROEntity workAreaPro = new TN_AB_B_WORK_AREA_PROEntity(); workAreaPro.CN_S_START_AREA_CODE = executeInWorkAreaPara.InWorkAreaEntity.startArea; workAreaPro.CN_S_END_AREA_CODE = endA; workAreaPro.CN_N_PRIORITY = prior; workAreaProList.Add(workAreaPro); } if (workAreaProList.Any()) { executeInWorkAreaPara.WorkAreaProEntitys = workAreaProList; } else { executeInWorkAreaPara.BasisResponse = BasisResponse.Error("输入参数终点库区不能为空!"); return executeInWorkAreaPara; } return executeInWorkAreaPara; } public override ExecuteInWorkAreaPara InWorkAreaInAss(ref ExecuteInWorkAreaPara executeInWorkAreaPara, LogPara logPara) { var logicAreaCode = executeInWorkAreaPara.InWorkAreaEntity.locationGear; //增加货位档位逻辑判断 小档位可以放在大档位的货位中 // List lstInEntity = new List(); 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 : "", lstAreaPrior = executeInWorkAreaPara.WorkAreaProEntitys.Select(p => new areaPriorClass { areaCode = p.CN_S_END_AREA_CODE, Prior = p.CN_N_PRIORITY }).ToList(), //lockLocation = endArea != null ? endArea.CN_C_IS_CONTROL_QTY.Equals("Y") : false, //不管控数量时,不锁定目的货位 projectCode = executeInWorkAreaPara.InWorkAreaEntity.projectCode, logicAreaCode = logicAreaCode, stockCode = executeInWorkAreaPara.InWorkAreaEntity.startStock, callSys = executeInWorkAreaPara.InWorkAreaEntity.sysName, needCalLock = true }; //根据库区获取货位 InAssignResultEntity resultEntity = new InAssignResultEntity(); resultEntity.Success = false; 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 { if (resultEntity.errCode == "1002") { executeInWorkAreaPara.BasisResponse = BasisResponse.Error("在" + string.Join(",", executeInWorkAreaPara.WorkAreaProEntitys.Select(o => o.CN_S_END_AREA_CODE).ToList()) + "库区中计算货位异常,详细原因:" + resultEntity.Msg); } } if (!resultEntity.Success && resultEntity.errCode == "1001") { executeInWorkAreaPara.BasisResponse = BasisResponse.Error("在" + string.Join(",", executeInWorkAreaPara.WorkAreaProEntitys.Select(o => o.CN_S_END_AREA_CODE).ToList()) + "库区中未找到合适的入库货位,详细原因:" + resultEntity.Msg); } executeInWorkAreaPara.errorCode = "1002"; return executeInWorkAreaPara; } public override ExecuteOutWorkAreaPara InWorkAreaOutAss(ref ExecuteOutWorkAreaPara executeOutWorkAreaPara, LogPara logPara) { var logicAreaCode = string.Empty; var aEntity = new InAssignEntity() { objectType = InAssignEntity.ObjectType.托盘, objectCode = executeOutWorkAreaPara.OutWorkAreaEntity.trayCode, lstAreaPrior = executeOutWorkAreaPara.WorkAreaProEntitys.Select(p => new areaPriorClass { areaCode = p.CN_S_END_AREA_CODE, Prior = p.CN_N_PRIORITY }).ToList(), //lockLocation = endArea != null ? endArea.CN_C_IS_CONTROL_QTY.Equals("Y") : false, //不管控数量时,不锁定目的货位 projectCode = executeOutWorkAreaPara.OutWorkAreaEntity.projectCode, logicAreaCode = logicAreaCode, stockCode = executeOutWorkAreaPara.OutWorkAreaEntity.startStock, callSys = executeOutWorkAreaPara.OutWorkAreaEntity.sysName, needCalLock = true }; //根据库区获取货位 InAssignResultEntity resultEntity = BLLCreator.Create().InAssign(aEntity); if (resultEntity.Success) { executeOutWorkAreaPara.OutWorkAreaEntity.endBit = resultEntity.locationCode; //增加到回滚记录里面 if ((resultEntity.areaType == Constants.Area_Struc_PingStock || resultEntity.areaType == Constants.Area_Struc_LiStock) && resultEntity.isControlQty == "Y") { executeOutWorkAreaPara.RollLocations.Add(resultEntity.locationCode); } executeOutWorkAreaPara.EndLocationEntity = BLLCreator.Create().GetLocationModel(resultEntity.locationCode); if (executeOutWorkAreaPara.EndLocationEntity != null) { executeOutWorkAreaPara.EndStockAreaEntity = BLLCreator.Create().GetStockAreaEntity(executeOutWorkAreaPara.EndLocationEntity.CN_S_AREA_CODE); executeOutWorkAreaPara.OutWorkAreaEntity.endArea = executeOutWorkAreaPara.EndStockAreaEntity.CN_S_AREA_CODE; } } else { if (resultEntity.errCode == "1002") { executeOutWorkAreaPara.BasisResponse = BasisResponse.Error("在" + string.Join(",", executeOutWorkAreaPara.WorkAreaProEntitys.Select(o => o.CN_S_END_AREA_CODE).ToList()) + "库区中计算货位异常,详细原因:" + resultEntity.Msg); } else if (resultEntity.errCode == "1001") { executeOutWorkAreaPara.BasisResponse = BasisResponse.Error("在" + string.Join(",", executeOutWorkAreaPara.WorkAreaProEntitys.Select(o => o.CN_S_END_AREA_CODE).ToList()) + "库区中未找到合适的入库货位,详细原因:" + resultEntity.Msg); } else { executeOutWorkAreaPara.BasisResponse = BasisResponse.Error("在" + string.Join(",", executeOutWorkAreaPara.WorkAreaProEntitys.Select(o => o.CN_S_END_AREA_CODE).ToList()) + "库区中计算货位异常,详细原因:" + resultEntity.Msg); } executeOutWorkAreaPara.errorCode = "1002"; return executeOutWorkAreaPara; } //创建转运任务 var entity = new TN_WM_TRANSPORT_TASKEntity { CN_S_TASK_NO = executeOutWorkAreaPara.OutWorkAreaEntity.taskNo, CN_S_CIR_OBJ = "托盘", CN_S_CIR_OBJ_CODE = executeOutWorkAreaPara.OutWorkAreaEntity.trayCode, CN_S_START_BIT = executeOutWorkAreaPara.OutWorkAreaEntity.startBit, CN_S_START_AREA = executeOutWorkAreaPara.OutWorkAreaEntity.startArea, CN_S_STATE = Constants.TaskStateList[0], CN_S_REMARK = executeOutWorkAreaPara.OutWorkAreaEntity.remark, CN_N_PRIORITY = executeOutWorkAreaPara.OutWorkAreaEntity.priority, CN_S_END_AREA = executeOutWorkAreaPara.OutWorkAreaEntity.endArea, CN_S_END_BIT = executeOutWorkAreaPara.OutWorkAreaEntity.endBit, CN_T_START = DateTime.Now.ToString(CultureInfo.InvariantCulture), CN_T_CREATE = DateTime.Now.ToString(CultureInfo.InvariantCulture), CN_T_MODIFY = DateTime.Now.ToString(CultureInfo.InvariantCulture), CN_S_STOCK_CODE = executeOutWorkAreaPara.OutWorkAreaEntity.startStock, CN_S_TASK_TYPE = executeOutWorkAreaPara.OutWorkAreaEntity.IsTransport == "Y" ? "转运" : "出库", CN_S_QTY_INDEX = resultEntity.index, CN_C_END_IS_CONTROL_QTY = executeOutWorkAreaPara.EndStockAreaEntity.CN_C_IS_CONTROL_QTY, CN_S_END_AREA_TYPE = executeOutWorkAreaPara.EndStockAreaEntity.CN_S_STRUCTURE, CN_C_START_IS_CONTROL_QTY = executeOutWorkAreaPara.StartStockAreaEntity.CN_C_IS_CONTROL_QTY, CN_S_START_AREA_TYPE = executeOutWorkAreaPara.StartStockAreaEntity.CN_S_STRUCTURE, CN_S_END_CONTROL_INV = executeOutWorkAreaPara.EndStockAreaEntity.CN_C_IS_INVENTORY, CN_S_START_CONTROL_INV = executeOutWorkAreaPara.StartStockAreaEntity.CN_C_IS_INVENTORY }; executeOutWorkAreaPara.TransportList.Add(entity); return executeOutWorkAreaPara; } 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; //TODO EndLocationEntity、EndStockAreaEntity需要赋值 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_END_STOCK_CODE = executeInWorkAreaPara.EndStockAreaEntity.CN_S_STOCK_CODE; executeInWorkAreaPara.TransportEntity.CN_S_CREATOR = executeInWorkAreaPara.InWorkAreaEntity.creatorBy; executeInWorkAreaPara.TransportEntity.CN_S_CREATOR_BY = executeInWorkAreaPara.InWorkAreaEntity.creatorBy; return executeInWorkAreaPara; } public override ExecuteInWorkAreaPara InWorkAreaProcedure(ExecuteInWorkAreaPara executeInWorkAreaPara, LogPara logPara) { var result = UseTransaction(trans => { InWorkAreaProcedureFunc(executeInWorkAreaPara, trans, logPara); }); if (result.Success) { if (executeInWorkAreaPara.InWorkAreaEntity.needCreateAMSTask == "Y") { OperateResult re = new OtherSysApi().SendAmsCreateTaskJX(executeInWorkAreaPara.TransportEntity); if (!re.Success) { // throw new Exception("SendAmsCreateTaskJX异常:" + re.Msg); executeInWorkAreaPara.BasisResponse = BasisResponse.Error("SendAmsCreateTaskJX异常:" + re.Msg); return executeInWorkAreaPara; } } 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_END_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 }); } 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_F_ALLOC_QTY = item.qty, CN_S_MODEL = item.itemModel }, trans); //添加托盘物料关联子表 var curResult = CreateDAL().AddDtl(new List() { new TN_WM_B_TRAY_ITEM_DTLEntity{ CN_PARENT_GUID = trayItemMstGuid, CN_S_LOT_NO = item.lotNo, CN_S_UNIQUE_CODE = item.uniqueCode, CN_S_PACKING_UNIT = item.itemPackUnit, CN_F_PACKING_QTY = item.qty, CN_F_QUANTITY = item.qty, CN_T_PRODUCTION = item.productionDate, CN_S_CREATOR = "hh", CN_S_CREATOR_BY = "", CN_T_CREATE = DateTime.Now, CN_GUID = Guid.NewGuid().ToString(), sqlwhere = " WHERE CN_PARENT_GUID='" + trayItemMstGuid + "' " } }, trans); } } } 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_END_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_EXT1 = "N" //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")) { OperateResult updateResult = CreateDAL().UpdateLocationExtState(executeInWorkAreaPara.TransportEntity.CN_S_START_BIT, Constants.Location_State_OutLock, Constants.Location_State_Normal, executeInWorkAreaPara.TransportEntity.CN_S_TASK_NO, trans); if (!updateResult.Success || updateResult.AffectedRows == 0) { trans.Rollback(); } } } public override ExecuteOutWorkAreaPara OutWorkArea(OutWorkAreaEntity outWorkAreaEntity, LogPara logPara) { var executeOutWorkAreaPara = new ExecuteOutWorkAreaPara { OutWorkAreaEntity = outWorkAreaEntity }; executeOutWorkAreaPara.errorCode = "1000"; try { // Log.Detail(logPara, "1"); if (!OutWorkAreaVerifyPara(ref executeOutWorkAreaPara, logPara).BasisResponse.Success) return executeOutWorkAreaPara; // Log.Detail(logPara, "2"); if (!OutWorkAreaHandlePara(ref executeOutWorkAreaPara, logPara).BasisResponse.Success) return executeOutWorkAreaPara; // Log.Detail(logPara, "3"); if (string.IsNullOrEmpty(executeOutWorkAreaPara.OutWorkAreaEntity.endBit)) { if (!InWorkAreaOutAss(ref executeOutWorkAreaPara, logPara).BasisResponse.Success) { return executeOutWorkAreaPara; } } // Log.Detail(logPara, "4"); var result = UseTransaction(trans => { // Log.Detail(logPara, "5"); //任务 var transport = executeOutWorkAreaPara.TransportList.FirstOrDefault(); //添加任务 var sqlResult = 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_S_TASK_TYPE = transport.CN_S_TASK_TYPE, CN_C_START_IS_CONTROL_QTY = transport.CN_C_START_IS_CONTROL_QTY, CN_C_END_IS_CONTROL_QTY = transport.CN_C_END_IS_CONTROL_QTY, CN_S_START_CONTROL_INV = transport.CN_S_START_CONTROL_INV, CN_S_END_CONTROL_INV = transport.CN_S_END_CONTROL_INV, CN_S_START_AREA_TYPE = transport.CN_S_START_AREA_TYPE, CN_S_END_AREA_TYPE = transport.CN_S_END_AREA_TYPE, //CN_S_PROJECT_CODE = executeOutWorkAreaPara.OutWorkAreaEntity.projectCode }, trans); //更新结束点的任务号 if (transport.CN_S_END_AREA_TYPE.Equals("平库") || transport.CN_S_END_AREA_TYPE.Equals("立库")) { //if (transport.CN_C_END_IS_CONTROL_QTY.Equals("Y") && executeOutWorkAreaPara.OutWorkAreaEntity.IsTransport.Equals("Y")) if (transport.CN_C_END_IS_CONTROL_QTY.Equals("Y") && executeOutWorkAreaPara.OutWorkAreaEntity.IsTransport.Equals("Y")) { sqlResult = CreateDAL().UpdateLocationExtState(transport.CN_S_END_BIT, "", "", transport.CN_S_TASK_NO, trans); } } //锁定起点货位 sqlResult = CreateDAL().UpdateLocationExtState(transport.CN_S_START_BIT, "预出库锁定", "正常", transport.CN_S_TASK_NO, trans); if (sqlResult.Success && sqlResult.AffectedRows > 0) { BLLCreator.Create().AddStateChange(executeOutWorkAreaPara.OutWorkAreaEntity.startBit, "正常", "预出库锁定", "出库并且转运需要锁定起点货位防止其他资源竞争", executeOutWorkAreaPara.OutWorkAreaEntity.sysName, "", "", transport.CN_S_STOCK_CODE, transport.CN_S_END_AREA, trans); } else { if (sqlResult.AffectedRows == 0) { throw new Exception("锁定起点货位时SqlExecuteResult影响行数为0"); } } if (!sqlResult.Success) { return; } }); if (result.Success) { if (executeOutWorkAreaPara.OutWorkAreaEntity.needCreateAMSTask == "Y") { OperateResult re = new OtherSysApi().SendAmsCreateTaskJX(executeOutWorkAreaPara.TransportList[0]); if (!re.Success) { executeOutWorkAreaPara.BasisResponse = BasisResponse.Error("SendAmsCreateTaskJX异常:" + re.Msg); return executeOutWorkAreaPara; } } executeOutWorkAreaPara.TaskExecuteState = new TaskExecuteState().Ok(OutWorkAreaOkTaskResponse(executeOutWorkAreaPara.TransportList[0], executeOutWorkAreaPara.OutWorkAreaEntity.itemCode, executeOutWorkAreaPara.index), null); } else { executeOutWorkAreaPara.BasisResponse = BasisResponse.Error("执行事务失败!" + result.Msg); } } catch (Exception ex) { executeOutWorkAreaPara.BasisResponse = BasisResponse.Error("OutWorkArea 方法异常:" + JsonConvert.SerializeObject(ex.Message + ex.StackTrace)); } Log.Detail(logPara, "OutWorkArea方法返回参数:" + JsonConvert.SerializeObject(executeOutWorkAreaPara)); return executeOutWorkAreaPara; } public override ExecuteOutWorkAreaPara OutWorkAreaVerifyPara(ref ExecuteOutWorkAreaPara executeOutWorkAreaPara, LogPara logPara) { if (executeOutWorkAreaPara.OutWorkAreaEntity == null) { executeOutWorkAreaPara.BasisResponse = BasisResponse.Error("参数不合法,接收参数为null!"); return executeOutWorkAreaPara; } if (executeOutWorkAreaPara.OutWorkAreaEntity.IsTransport == null) executeOutWorkAreaPara.OutWorkAreaEntity.IsTransport = "Y"; if (string.IsNullOrEmpty(executeOutWorkAreaPara.OutWorkAreaEntity.endArea) && string.IsNullOrEmpty(executeOutWorkAreaPara.OutWorkAreaEntity.endBit)) { executeOutWorkAreaPara.BasisResponse = BasisResponse.Error("参数终点货位或终点库区至少输入一个!"); return executeOutWorkAreaPara; } #region 检验起点货位状态并锁定(起点为巨星WMS传递给汉和) if (string.IsNullOrEmpty(executeOutWorkAreaPara.OutWorkAreaEntity.startBit)) { var trayLocation = BLLCreator.Create().GetByTrayCode(executeOutWorkAreaPara.OutWorkAreaEntity.trayCode); if (trayLocation == null) { executeOutWorkAreaPara.BasisResponse = BasisResponse.Error("根据托盘号" + executeOutWorkAreaPara.OutWorkAreaEntity.trayCode + "没有找到对应绑定的货位。"); executeOutWorkAreaPara.errorCode = "1001"; return executeOutWorkAreaPara; } else { executeOutWorkAreaPara.OutWorkAreaEntity.startBit = trayLocation.CN_S_LOCATION_CODE; } } executeOutWorkAreaPara.StartStockAreaEntity = DALCreator.Create().GetAreaModelByLocation(executeOutWorkAreaPara.OutWorkAreaEntity.startBit.Trim()); if (executeOutWorkAreaPara.StartStockAreaEntity == null) { executeOutWorkAreaPara.BasisResponse = BasisResponse.Error("给定的起点位置未找到库区!"); executeOutWorkAreaPara.errorCode = "1001"; return executeOutWorkAreaPara; } else { if (executeOutWorkAreaPara.StartStockAreaEntity.CN_C_IS_CONTROL_QTY.Equals("Y")) { executeOutWorkAreaPara.StartLocationExt = BLLCreator.Create().GetModel(" where CN_S_LOCATION_CODE = '" + executeOutWorkAreaPara.OutWorkAreaEntity.startBit.Trim() + "'").FirstOrDefault(); if (!executeOutWorkAreaPara.StartLocationExt.CN_S_LOCATION_STATE.Equals("正常")) { executeOutWorkAreaPara.BasisResponse = BasisResponse.Error("当前起点货位状态为" + executeOutWorkAreaPara.StartLocationExt.CN_S_LOCATION_STATE + ",货位不可用!"); executeOutWorkAreaPara.errorCode = "1001"; return executeOutWorkAreaPara; } if (executeOutWorkAreaPara.StartLocationExt.CN_S_USE_STATE.Equals("空")) { executeOutWorkAreaPara.BasisResponse = BasisResponse.Error("当前起点货位存储状态为" + executeOutWorkAreaPara.StartLocationExt.CN_S_USE_STATE + ",货位不可用!"); executeOutWorkAreaPara.errorCode = "1001"; return executeOutWorkAreaPara; } //如果起点为缓冲区,则判断是否有托盘阻挡或与预入库任务冲突 if (executeOutWorkAreaPara.StartStockAreaEntity.CN_S_AREA_CLASS == "缓冲区") { } } executeOutWorkAreaPara.OutWorkAreaEntity.startStock = executeOutWorkAreaPara.StartStockAreaEntity.CN_S_STOCK_CODE; executeOutWorkAreaPara.OutWorkAreaEntity.startArea = executeOutWorkAreaPara.StartStockAreaEntity.CN_S_AREA_CODE; } #endregion #region 检验终点货位状态并锁定 (巨星WMS传递给汉和终点位置) //获取终点库区信息 if (!string.IsNullOrEmpty(executeOutWorkAreaPara.OutWorkAreaEntity.endBit)) { executeOutWorkAreaPara.EndStockAreaEntity = DALCreator.Create().GetAreaModelByLocation(executeOutWorkAreaPara.OutWorkAreaEntity.endBit.Trim()); if (executeOutWorkAreaPara.EndStockAreaEntity == null) { executeOutWorkAreaPara.BasisResponse = BasisResponse.Error("给定的目的位置未找到库区!"); return executeOutWorkAreaPara; } else { // 检查货位状态 是转运且管控数量时使用 if (executeOutWorkAreaPara.EndStockAreaEntity.CN_C_IS_CONTROL_QTY.Equals("Y") && executeOutWorkAreaPara.OutWorkAreaEntity.IsTransport.Equals("Y")) { executeOutWorkAreaPara.EndLocationExt = BLLCreator.Create().GetModel(" where CN_S_LOCATION_CODE = '" + executeOutWorkAreaPara.OutWorkAreaEntity.endBit.Trim() + "'").FirstOrDefault(); if (!executeOutWorkAreaPara.EndLocationExt.CN_S_LOCATION_STATE.Equals("正常")) { executeOutWorkAreaPara.BasisResponse = BasisResponse.Error("当前终点货位状态为" + executeOutWorkAreaPara.EndLocationExt.CN_S_LOCATION_STATE + ",货位不可用!"); executeOutWorkAreaPara.errorCode = "1001"; return executeOutWorkAreaPara; } if (!executeOutWorkAreaPara.EndLocationExt.CN_S_USE_STATE.Equals("空")) { executeOutWorkAreaPara.BasisResponse = BasisResponse.Error("当前终点货位存储状态为" + executeOutWorkAreaPara.EndLocationExt.CN_S_USE_STATE + ",货位不可用!"); executeOutWorkAreaPara.errorCode = "1001"; return executeOutWorkAreaPara; } //锁定终点货位 OperateResult lockResult = BLLCreator.Create().UpdateState(executeOutWorkAreaPara.OutWorkAreaEntity.endBit, "预入库锁定", "正常"); if (lockResult.Success && lockResult.AffectedRows > 0) { AutoBomLocationEntity locationModel = DALCreator.Create().GetModel(executeOutWorkAreaPara.OutWorkAreaEntity.endBit); BLLCreator.Create().AddStateChange(executeOutWorkAreaPara.OutWorkAreaEntity.endBit, "正常", "预入库锁定", "出库并且转运需要锁定终点货位防止其他资源竞争", executeOutWorkAreaPara.OutWorkAreaEntity.sysName, "", "", locationModel.CN_S_STOCK_CODE, locationModel.CN_S_AREA_CODE, null); executeOutWorkAreaPara.RollLocations.Add(executeOutWorkAreaPara.OutWorkAreaEntity.endBit); } else { if (lockResult.AffectedRows == 0) { executeOutWorkAreaPara.BasisResponse = BasisResponse.Error("锁定终点货位" + executeOutWorkAreaPara.OutWorkAreaEntity.endBit + "失败!详细原因为:SqlExecuteResult影响row为0"); return executeOutWorkAreaPara; } else { executeOutWorkAreaPara.BasisResponse = BasisResponse.Error("锁定终点货位" + executeOutWorkAreaPara.OutWorkAreaEntity.endBit + "失败!详细原因为:" + lockResult.Msg); return executeOutWorkAreaPara; } } } executeOutWorkAreaPara.OutWorkAreaEntity.startStock = executeOutWorkAreaPara.EndStockAreaEntity.CN_S_STOCK_CODE; executeOutWorkAreaPara.OutWorkAreaEntity.endArea = executeOutWorkAreaPara.EndStockAreaEntity.CN_S_AREA_CODE; } } #endregion return executeOutWorkAreaPara; } public override ExecuteOutWorkAreaPara OutWorkAreaHandlePara(ref ExecuteOutWorkAreaPara executeOutWorkAreaPara, LogPara logPara) { //任务号 if (string.IsNullOrEmpty(executeOutWorkAreaPara.OutWorkAreaEntity.taskNo)) { var postData = "{\"appCode\":\"" + Constants.appCode + "\",\"ruleName\":\"" + Constants.Rule_OutTaskNo + "\",\"orgId\":\"0\",\"orgFlag\":\"\"}"; executeOutWorkAreaPara.OutWorkAreaEntity.taskNo = WebApiManager.HttpAutoBom_Post("api/BillRule/GenBillNo", postData); if (string.IsNullOrEmpty(executeOutWorkAreaPara.OutWorkAreaEntity.taskNo)) executeOutWorkAreaPara.BasisResponse = BasisResponse.Error("获取AUTOBOM出库任务号异常!"); } var trayLocation = BLLCreator.Create().GetByLocationCodeAndTrayCode(executeOutWorkAreaPara.OutWorkAreaEntity.startBit, executeOutWorkAreaPara.OutWorkAreaEntity.trayCode); if (trayLocation == null) { executeOutWorkAreaPara.BasisResponse = BasisResponse.Error("该托盘:" + executeOutWorkAreaPara.OutWorkAreaEntity.trayCode + "没有与起点绑定。"); executeOutWorkAreaPara.errorCode = "1001"; return executeOutWorkAreaPara; } //获取作业区列表 List workAreaProList = new List(); if (!string.IsNullOrEmpty(executeOutWorkAreaPara.OutWorkAreaEntity.endArea)) { string[] arrArea = executeOutWorkAreaPara.OutWorkAreaEntity.endArea.Split(','); int prior = 0; foreach (string endA in arrArea) { prior = prior + 1; TN_AB_B_WORK_AREA_PROEntity workAreaPro = new TN_AB_B_WORK_AREA_PROEntity(); workAreaPro.CN_S_START_AREA_CODE = executeOutWorkAreaPara.OutWorkAreaEntity.startArea; workAreaPro.CN_S_END_AREA_CODE = endA; workAreaPro.CN_N_PRIORITY = prior; workAreaProList.Add(workAreaPro); } if (workAreaProList.Any()) { executeOutWorkAreaPara.WorkAreaProEntitys = workAreaProList; } else { executeOutWorkAreaPara.BasisResponse = BasisResponse.Error("输入参数终点库区不能为空!"); return executeOutWorkAreaPara; } } //创建转运任务 if (!string.IsNullOrEmpty(executeOutWorkAreaPara.OutWorkAreaEntity.endBit)) { var entity = new TN_WM_TRANSPORT_TASKEntity { CN_S_TASK_NO = executeOutWorkAreaPara.OutWorkAreaEntity.taskNo, CN_S_CIR_OBJ = "托盘", CN_S_CIR_OBJ_CODE = executeOutWorkAreaPara.OutWorkAreaEntity.trayCode, CN_S_START_BIT = executeOutWorkAreaPara.OutWorkAreaEntity.startBit, CN_S_START_AREA = executeOutWorkAreaPara.OutWorkAreaEntity.startArea, CN_S_STATE = Constants.TaskStateList[0], CN_S_REMARK = executeOutWorkAreaPara.OutWorkAreaEntity.remark, CN_N_PRIORITY = executeOutWorkAreaPara.OutWorkAreaEntity.priority, CN_S_END_AREA = executeOutWorkAreaPara.OutWorkAreaEntity.endArea, CN_S_END_BIT = executeOutWorkAreaPara.OutWorkAreaEntity.endBit, CN_T_START = DateTime.Now.ToString(CultureInfo.InvariantCulture), CN_T_CREATE = DateTime.Now.ToString(CultureInfo.InvariantCulture), CN_T_MODIFY = DateTime.Now.ToString(CultureInfo.InvariantCulture), CN_S_STOCK_CODE = executeOutWorkAreaPara.OutWorkAreaEntity.startStock, CN_S_TASK_TYPE = executeOutWorkAreaPara.OutWorkAreaEntity.IsTransport == "Y" ? "转运" : "出库", CN_S_QTY_INDEX = "1", CN_C_END_IS_CONTROL_QTY = executeOutWorkAreaPara.EndStockAreaEntity.CN_C_IS_CONTROL_QTY, CN_S_END_AREA_TYPE = executeOutWorkAreaPara.EndStockAreaEntity.CN_S_STRUCTURE, CN_C_START_IS_CONTROL_QTY = executeOutWorkAreaPara.StartStockAreaEntity.CN_C_IS_CONTROL_QTY, CN_S_START_AREA_TYPE = executeOutWorkAreaPara.StartStockAreaEntity.CN_S_STRUCTURE, CN_S_END_CONTROL_INV = executeOutWorkAreaPara.EndStockAreaEntity.CN_C_IS_INVENTORY, CN_S_START_CONTROL_INV = executeOutWorkAreaPara.StartStockAreaEntity.CN_C_IS_INVENTORY }; executeOutWorkAreaPara.TransportList.Add(entity); } return executeOutWorkAreaPara; } #endregion #region 绑定与解绑 public override BasisResponse BindingTrayLocation(BindingAndUnBindingDto binding, LogPara logPara) { if (string.IsNullOrEmpty(binding.locationCode)) { return BasisResponse.Error("货位号不能为空!"); } if (string.IsNullOrEmpty(binding.trayCode)) { return BasisResponse.Error("托盘号不能为空!"); } // string[] arrBindLocation = binding.locationCode.Split(','); List lstTrayLocation = new List(); List upHis = new List(); AutoBomStockAreaEntity areaModel = new AutoBomStockAreaEntity(); #region 检查托盘与货位是否满足绑定条件 //检查该托盘是否在(未执行或执行中的)任务中 List lstInTask = CreateDAL().GetTaskByTray(binding.trayCode); if (lstInTask.Count > 0) { return BasisResponse.Error(string.Format("当前托盘已在搬运任务{0}中,不允许绑定未执行或执行中的任务!", lstInTask[0].CN_S_TASK_NO)); } //检查该托盘是否绑定了其他货位 List lstEntity = CreateDAL().GetListByTrayCode(binding.trayCode); if (lstEntity.Count > 0) { return BasisResponse.Error(string.Format("当前托盘已绑定货位{0},不允许重复绑定!", lstEntity[0].CN_S_LOCATION_CODE)); } //判断该托盘绑定的货位是否阻挡了入库任务 List locationInLock = CreateDAL().GetLockLocationByState(areaModel.CN_S_STOCK_CODE, areaModel.CN_S_AREA_CODE, null, Constants.Location_State_InLock); List tmpLocation = new List(); //foreach (string strLocation in arrBindLocation) //{ List GetModel = BLLCreator.Create(this.userInfo).GetModel("where CN_S_LOCATION_CODE='" + binding.locationCode + "'"); if (GetModel.Count == 0) { return BasisResponse.Error(string.Format("在表TN_WM_LOCATION_EXT中未查询到货位{0}!", binding.locationCode)); } areaModel = CreateDAL().GetAreaModelByLocation(binding.locationCode); if (areaModel == null) { //非法的目的货位 return BasisResponse.Error(string.Format("在mongo(TN_AB_B_STOCK_AREA或TN_AB_STOCK_LOCATION表)中未查询到货位{0}信息!", binding.locationCode)); } if (areaModel.CN_C_IS_CONTROL_QTY.Equals("Y")) { //货位存储状态:非空 if (GetModel[0].CN_S_USE_STATE != Constants.Use_State_Empty) { return BasisResponse.Error(string.Format("货位{0}的存储状态为{1},不允许继续放置托盘!", binding.locationCode, GetModel[0].CN_S_USE_STATE)); } } //根据货位状态判断货位是否可用 if (GetModel[0].CN_S_LOCATION_STATE != Constants.Location_State_Normal) { return BasisResponse.Error(string.Format("货位{0}的状态为{1},不允许继续放置托盘!", binding.locationCode, GetModel[0].CN_S_LOCATION_STATE)); } lstEntity = CreateDAL().GetListByLocationCode(binding.locationCode); if (lstEntity.Count > 0) { return BasisResponse.Error(string.Format("货位{0}已绑定托盘{1},不允许重复绑定!", binding.locationCode, lstEntity[0].CN_S_TRAY_CODE)); } if (areaModel.CN_S_AREA_CLASS == "地堆") { int maxInLockCol = 0; if (locationInLock.Where(o => o.CN_S_ROW == GetModel[0].CN_S_ROW).Count() > 0) { tmpLocation = locationInLock.Where(o => o.CN_S_ROW == GetModel[0].CN_S_ROW).OrderByDescending(a => int.Parse(a.CN_S_COL)).ToList(); maxInLockCol = int.Parse(tmpLocation.FirstOrDefault().CN_S_COL); if (int.Parse(GetModel[0].CN_S_COL) < maxInLockCol) { return BasisResponse.Error(string.Format("绑定货位{0}阻挡货位{1}的入库任务,不允许绑定!", binding.locationCode, tmpLocation.FirstOrDefault().CN_S_LOCATION_CODE)); } } } lstTrayLocation.Add(new TN_WM_B_TRAY_LOCATIONEntity { CN_GUID = System.Guid.NewGuid().ToString().ToUpper(), CN_S_TRAY_CODE = binding.trayCode, CN_S_STOCK_CODE = areaModel.CN_S_STOCK_CODE, CN_S_STOCK_AREA = areaModel.CN_S_AREA_CODE, CN_S_LOCATION_CODE = binding.locationCode, CN_N_INDEX = 1, CN_S_CREATOR = "hh", CN_S_CREATOR_BY = "hh", CN_T_CREATE = DateTime.Now }); upHis.Add(new TN_WM_UP_HISTORYEntity() { CN_GUID = Guid.NewGuid().ToString(), CN_F_PACKING_QTY = 0, CN_S_CREATOR = "", CN_S_CREATOR_BY = "", CN_S_FIGURE_NO = "", CN_S_ITEM_CODE = "", CN_F_QUANTITY = 0, CN_S_ITEM_NAME = "", CN_S_ITEM_STATE = "", CN_S_LOCATION_CODE = binding.locationCode, CN_S_LOT_NO = "", CN_S_MEASURE_UNIT = "", CN_S_MODEL = "", CN_S_MODIFY = "", CN_S_MODIFY_BY = "", CN_S_OWNER = "", CN_S_PACKING_UNIT = "", CN_S_PRODUCTION_BATCH = "", CN_S_STOCK_AREA = areaModel.CN_S_AREA_CODE, CN_S_STOCK_CODE = areaModel.CN_S_STOCK_CODE, CN_S_EXT1 = "", CN_S_TRAY_CODE = binding.trayCode, CN_S_TRAY_GRID = "1", CN_T_CREATE = DateTime.Now, CN_T_MODIFY = DateTime.Now, CN_S_OP_FROM = "PDA绑定上架", }); //} #endregion OperateResult result = UseTransaction(trans => { result = CreateDAL>().AddRange(lstTrayLocation, trans); if (areaModel.CN_C_IS_CONTROL_QTY.Equals("Y")) { CreateDAL>().AddRange(upHis, trans); //foreach (string strLocation in arrBindLocation) //{ //更新货位贮存状态及货位状态 OperateResult operateResult = CreateDAL>().Update( new { CN_S_USE_STATE = Constants.Use_State_Full }, new { CN_S_LOCATION_CODE = binding.locationCode, CN_S_LOCATION_STATE = Constants.Location_State_Normal }, trans); Log.Detail(logPara, "BindingAndUnBinding接口绑定货位:" + binding.locationCode + "," + JsonConvert.SerializeObject(operateResult)); if (operateResult.AffectedRows == 0) { throw new Exception("更新货位存储状态并发冲突,该货位状态可能已经发生变化"); } // } } }); if (result.Success) { return BasisResponse.Normal(); } else { return BasisResponse.Error(result.Msg); } } public override BasisResponse UnBindingTrayLocation(BindingAndUnBindingDto binding, LogPara logPara) { if (string.IsNullOrEmpty(binding.locationCode) && string.IsNullOrEmpty(binding.trayCode)) { return BasisResponse.Error("货位号和托盘号不能同时为空!"); } if (!string.IsNullOrEmpty(binding.locationCode) && !string.IsNullOrEmpty(binding.trayCode)) { List lstEntity = CreateDAL().GetListByTrayCode(binding.trayCode, binding.locationCode); if (lstEntity.Count == 0) { return BasisResponse.Error("当前传入托盘号与传入货位号没有绑定关系,请检查!"); } } List downHis = new List(); OperateResult operateResult = new OperateResult(); AutoBomStockAreaEntity areaModel = new AutoBomStockAreaEntity(); if (binding.rowFlag) { if (string.IsNullOrEmpty(binding.locationCode)) { return BasisResponse.Error("排解绑传入货位码不能为空!"); } #region 根据货位码删除 //获取同排的货位 List lstLocation = BLLCreator.Create(this.userInfo).GetModel("where CN_S_LOCATION_CODE='" + binding.locationCode + "'"); if (lstLocation.Count == 0) { return BasisResponse.Error(string.Format("在表TN_WM_LOCATION_EXT中未查询到该货位{0}!", binding.locationCode)); } List lstSameRowLocation = BLLCreator.Create().GetModelByRow(lstLocation[0].CN_S_ROW, lstLocation[0].CN_S_AREA_CODE); foreach (TN_WM_LOCATION_EXTEntity locationEntity in lstSameRowLocation) { lstLocation = BLLCreator.Create(this.userInfo).GetModel("where CN_S_LOCATION_CODE='" + locationEntity.CN_S_LOCATION_CODE + "'"); if (lstLocation.Count == 0) { return BasisResponse.Error(string.Format("在表TN_WM_LOCATION_EXT中未查询到关联的货位{0}!", locationEntity.CN_S_LOCATION_CODE)); } List lstEntity = CreateDAL().GetListByLocationCode(locationEntity.CN_S_LOCATION_CODE); if (lstEntity.Count == 0) { continue; } //检查该托盘是否在(未执行或执行中的)任务中 List lstInTask = CreateDAL().GetTaskByTray(lstEntity[0].CN_S_TRAY_CODE); if (lstInTask.Count > 0) { return BasisResponse.Error(string.Format("当前货位所在排关联的托盘已在搬运任务{0}中,不允许解绑未执行或执行中的任务!", lstInTask[0].CN_S_TASK_NO)); } areaModel = CreateDAL().GetAreaModelByLocation(lstLocation[0].CN_S_LOCATION_CODE); if (areaModel == null) { return BasisResponse.Error(string.Format("在mongo(TN_AB_B_STOCK_AREA或TN_AB_STOCK_LOCATION表)中未查询到货位{0}的库区信息!", lstLocation[0].CN_S_LOCATION_CODE)); } if (areaModel.CN_C_IS_CONTROL_QTY.Equals("Y")) { //货位存储状态:非空 if (lstLocation[0].CN_S_USE_STATE != Constants.Use_State_Full) { return BasisResponse.Error(string.Format("该关联的货位{0}存储状态为{1},不允许从该位置解绑!", lstLocation[0].CN_S_LOCATION_CODE, lstLocation[0].CN_S_USE_STATE)); } } //货位状态:正常 if (lstLocation[0].CN_S_LOCATION_STATE != Constants.Location_State_Normal) { return BasisResponse.Error(string.Format("关联的货位{0}状态为{1},不允许从该位置解绑!", lstLocation[0].CN_S_LOCATION_CODE, lstLocation[0].CN_S_LOCATION_STATE)); } #region 拼接下架记录表 TN_WM_DOWN_HISTORYEntity down = new TN_WM_DOWN_HISTORYEntity(); down.CN_GUID = Guid.NewGuid().ToString(); down.CN_S_CREATOR = ""; down.CN_S_CREATOR_BY = ""; down.CN_S_MODIFY = ""; down.CN_S_MODIFY_BY = ""; down.CN_F_QUANTITY = 1; down.CN_F_PACKING_QTY = 0; down.CN_S_LOT_NO = ""; down.CN_S_FIGURE_NO = ""; down.CN_S_ITEM_CODE = ""; down.CN_S_ITEM_NAME = ""; down.CN_S_ITEM_STATE = ""; down.CN_S_LOCATION_CODE = lstLocation[0].CN_S_LOCATION_CODE; down.CN_S_MEASURE_UNIT = ""; down.CN_S_MODEL = ""; down.CN_S_OWNER = ""; down.CN_S_PACKING_UNIT = ""; down.CN_S_PRODUCTION_BATCH = ""; down.CN_S_STOCK_AREA = areaModel.CN_S_AREA_CODE; down.CN_S_STOCK_CODE = areaModel.CN_S_STOCK_CODE; down.CN_S_EXT1 = ""; down.CN_S_TRAY_CODE = lstEntity[0].CN_S_TRAY_CODE; down.CN_S_TRAY_GRID = "1"; down.CN_T_CREATE = down.CN_T_MODIFY = DateTime.Now; down.CN_S_OP_FROM = "PDA解绑下架"; downHis.Add(down); #endregion } if (downHis.Count ==0) { return BasisResponse.Error(string.Format("该货位{0}所在的排不需要解绑托盘!", binding.locationCode)); } operateResult = UseTransaction(trans => { if (areaModel.CN_C_IS_CONTROL_QTY.Equals("Y")) { CreateDAL>().AddRange(downHis, trans); foreach (TN_WM_DOWN_HISTORYEntity hisEntity in downHis) { //根据货位删除关联 CreateDAL>().Delete(new { CN_S_LOCATION_CODE = hisEntity.CN_S_LOCATION_CODE }, trans); //更新货位贮存状态 operateResult = CreateDAL>().Update( new { CN_S_USE_STATE = Constants.Use_State_Empty }, new { CN_S_LOCATION_CODE = hisEntity.CN_S_LOCATION_CODE, CN_S_LOCATION_STATE = Constants.Location_State_Normal }, trans); Log.Detail(logPara, "BindingAndUnBinding接口解绑货位状态:" + hisEntity.CN_S_LOCATION_CODE + "," + JsonConvert.SerializeObject(operateResult)); if (operateResult.AffectedRows == 0) { throw new Exception("更新货位状态并发冲突,该货位状态可能已经发生变化"); } } } }); #endregion } else { #region 根据托盘码删除 if (!string.IsNullOrEmpty(binding.trayCode)) { #region 判断托盘与货位是否满足解绑条件 //检查该托盘是否在(未执行或执行中的)任务中 List lstInTask = CreateDAL().GetTaskByTray(binding.trayCode); if (lstInTask.Count > 0) { return BasisResponse.Error(string.Format("当前托盘已在搬运任务{0}中,不允许绑定未执行或执行中的任务!", lstInTask[0].CN_S_TASK_NO)); } //判断托盘是否绑定货位 List lstEntity = CreateDAL().GetListByTrayCode(binding.trayCode); if (lstEntity.Count == 0) { return BasisResponse.Error("当前托盘没有绑定货位,不需要解绑!"); } else if (lstEntity.Count > 1) { return BasisResponse.Error("当前托盘绑定多个货位,请检查数据!"); } else { List GetModel = BLLCreator.Create(this.userInfo).GetModel("where CN_S_LOCATION_CODE='" + lstEntity[0].CN_S_LOCATION_CODE + "'"); if (GetModel.Count == 0) { return BasisResponse.Error(string.Format("在表TN_WM_LOCATION_EXT中未查询到该托盘关联的货位{0}!", lstEntity[0].CN_S_LOCATION_CODE)); } areaModel = CreateDAL().GetAreaModelByLocation(lstEntity[0].CN_S_LOCATION_CODE); if (areaModel == null) { return BasisResponse.Error(string.Format("在mongo(TN_AB_B_STOCK_AREA或TN_AB_STOCK_LOCATION表)中未查询到货位{0}的库区信息!", lstEntity[0].CN_S_LOCATION_CODE)); } if (areaModel.CN_C_IS_CONTROL_QTY.Equals("Y")) { //货位存储状态:非空 if (GetModel[0].CN_S_USE_STATE != Constants.Use_State_Full) { return BasisResponse.Error(string.Format("该托盘关联的货位{0}存储状态为{1},不允许从该位置解绑!", lstEntity[0].CN_S_LOCATION_CODE, GetModel[0].CN_S_USE_STATE)); } } //货位状态:正常 if (GetModel[0].CN_S_LOCATION_STATE != Constants.Location_State_Normal) { return BasisResponse.Error(string.Format("该托盘关联的货位{0}状态为{1},不允许从该位置解绑!", lstEntity[0].CN_S_LOCATION_CODE, GetModel[0].CN_S_LOCATION_STATE)); } #region 拼接下架记录表 TN_WM_DOWN_HISTORYEntity down = new TN_WM_DOWN_HISTORYEntity(); down.CN_GUID = Guid.NewGuid().ToString(); down.CN_S_CREATOR = ""; down.CN_S_CREATOR_BY = ""; down.CN_S_MODIFY = ""; down.CN_S_MODIFY_BY = ""; down.CN_F_QUANTITY = 1; down.CN_F_PACKING_QTY = 0; down.CN_S_LOT_NO = ""; down.CN_S_FIGURE_NO = ""; down.CN_S_ITEM_CODE = ""; down.CN_S_ITEM_NAME = ""; down.CN_S_ITEM_STATE = ""; down.CN_S_LOCATION_CODE = lstEntity[0].CN_S_LOCATION_CODE; down.CN_S_MEASURE_UNIT = ""; down.CN_S_MODEL = ""; down.CN_S_OWNER = ""; down.CN_S_PACKING_UNIT = ""; down.CN_S_PRODUCTION_BATCH = ""; down.CN_S_STOCK_AREA = areaModel.CN_S_AREA_CODE; down.CN_S_STOCK_CODE = areaModel.CN_S_STOCK_CODE; down.CN_S_EXT1 = ""; down.CN_S_TRAY_CODE = binding.trayCode; down.CN_S_TRAY_GRID = "1"; down.CN_T_CREATE = down.CN_T_MODIFY = DateTime.Now; down.CN_S_OP_FROM = "PDA解绑下架"; downHis.Add(down); #endregion } #endregion operateResult = UseTransaction(trans => { //根据托盘删除关联 CreateDAL>().Delete(new { CN_S_TRAY_CODE = binding.trayCode }, trans); if (areaModel.CN_C_IS_CONTROL_QTY.Equals("Y")) { CreateDAL>().AddRange(downHis, trans); foreach (TN_WM_DOWN_HISTORYEntity hisEntity in downHis) { //更新货位贮存状态 operateResult = CreateDAL>().Update( new { CN_S_USE_STATE = Constants.Use_State_Empty }, new { CN_S_LOCATION_CODE = lstEntity[0].CN_S_LOCATION_CODE.ToString(), CN_S_LOCATION_STATE = Constants.Location_State_Normal }, trans); Log.Detail(logPara, "BindingAndUnBinding接口解绑货位:" + lstEntity[0].CN_S_LOCATION_CODE.ToString() + "," + JsonConvert.SerializeObject(operateResult)); if (operateResult.AffectedRows == 0) { throw new Exception("更新货位状态并发冲突,该货位状态可能已经发生变化"); } } } }); if (!operateResult.Success) return BasisResponse.Error(operateResult.Msg); return BasisResponse.Normal(); } #endregion #region 根据货位码删除 if (!string.IsNullOrEmpty(binding.locationCode)) { List lstEntity = CreateDAL().GetListByLocationCode(binding.locationCode); if (lstEntity.Count == 0) { return BasisResponse.Error("当前货位没有绑定托盘,不需要解绑!"); } else if (lstEntity.Count > 1) { return BasisResponse.Error("当前货位绑定多个托盘,请检查数据!"); } else { //判断托盘是否绑定货位 binding.trayCode = lstEntity[0].CN_S_TRAY_CODE; //检查该托盘是否在(未执行或执行中的)任务中 List lstInTask = CreateDAL().GetTaskByTray(binding.trayCode); if (lstInTask.Count > 0) { return BasisResponse.Error(string.Format("当前货位关联的托盘已在搬运任务{0}中,不允许解绑未执行或执行中的任务!", lstInTask[0].CN_S_TASK_NO)); } List GetModel = BLLCreator.Create(this.userInfo).GetModel("where CN_S_LOCATION_CODE='" + binding.locationCode + "'"); if (GetModel.Count == 0) { return BasisResponse.Error(string.Format("在表TN_WM_LOCATION_EXT中未查询到关联的货位{0}!", binding.locationCode)); } areaModel = CreateDAL().GetAreaModelByLocation(binding.locationCode); if (areaModel == null) { return BasisResponse.Error(string.Format("在mongo(TN_AB_B_STOCK_AREA或TN_AB_STOCK_LOCATION表)中未查询到货位{0}的库区信息!", binding.locationCode)); } if (areaModel.CN_C_IS_CONTROL_QTY.Equals("Y")) { //货位存储状态:非空 if (GetModel[0].CN_S_USE_STATE != Constants.Use_State_Full) { return BasisResponse.Error(string.Format("该关联的货位{0}存储状态为{1},不允许从该位置解绑!", binding.locationCode, GetModel[0].CN_S_USE_STATE)); } } //货位状态:正常 if (GetModel[0].CN_S_LOCATION_STATE != Constants.Location_State_Normal) { return BasisResponse.Error(string.Format("关联的货位{0}状态为{1},不允许从该位置解绑!", binding.locationCode, GetModel[0].CN_S_LOCATION_STATE)); } #region 拼接下架记录表 TN_WM_DOWN_HISTORYEntity down = new TN_WM_DOWN_HISTORYEntity(); down.CN_GUID = Guid.NewGuid().ToString(); down.CN_S_CREATOR = ""; down.CN_S_CREATOR_BY = ""; down.CN_S_MODIFY = ""; down.CN_S_MODIFY_BY = ""; down.CN_F_QUANTITY = 1; down.CN_F_PACKING_QTY = 0; down.CN_S_LOT_NO = ""; down.CN_S_FIGURE_NO = ""; down.CN_S_ITEM_CODE = ""; down.CN_S_ITEM_NAME = ""; down.CN_S_ITEM_STATE = ""; down.CN_S_LOCATION_CODE = binding.locationCode; down.CN_S_MEASURE_UNIT = ""; down.CN_S_MODEL = ""; down.CN_S_OWNER = ""; down.CN_S_PACKING_UNIT = ""; down.CN_S_PRODUCTION_BATCH = ""; down.CN_S_STOCK_AREA = areaModel.CN_S_AREA_CODE; down.CN_S_STOCK_CODE = areaModel.CN_S_STOCK_CODE; down.CN_S_EXT1 = ""; down.CN_S_TRAY_CODE = binding.trayCode; down.CN_S_TRAY_GRID = "1"; down.CN_T_CREATE = down.CN_T_MODIFY = DateTime.Now; down.CN_S_OP_FROM = "PDA解绑下架"; downHis.Add(down); #endregion } // lstEntity = CreateDAL().GetListByTrayCode(lstEntity[0].CN_S_TRAY_CODE); operateResult = UseTransaction(trans => { //根据货位删除关联 CreateDAL>().Delete(new { CN_S_TRAY_CODE = binding.trayCode }, trans); if (areaModel.CN_C_IS_CONTROL_QTY.Equals("Y")) { CreateDAL>().AddRange(downHis, trans); foreach (TN_WM_DOWN_HISTORYEntity hisEntity in downHis) { //更新货位贮存状态 operateResult = CreateDAL>().Update( new { CN_S_USE_STATE = Constants.Use_State_Empty }, new { CN_S_LOCATION_CODE = hisEntity.CN_S_LOCATION_CODE, CN_S_LOCATION_STATE = Constants.Location_State_Normal }, trans); Log.Detail(logPara, "BindingAndUnBinding接口解绑货位状态:" + hisEntity.CN_S_LOCATION_CODE + "," + JsonConvert.SerializeObject(operateResult)); if (operateResult.AffectedRows == 0) { throw new Exception("更新货位状态并发冲突,该货位状态可能已经发生变化"); } } } }); } #endregion } if (!operateResult.Success) return BasisResponse.Error(operateResult.Msg); return BasisResponse.Normal(); } #endregion #region 完工回报定制代码 public override OperateResult CompleteTask(ExecuteStateParaDto executeStatePara, LogPara logPara) { var isControlStockQty = executeStatePara.trayItemMsts.Count > 0; Log.Detail(logPara, "isControlStockQty: " + isControlStockQty); 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("转运") || 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, "解绑任务的托盘和起点货位关联!"); CompleteTaskDownHistory(executeStatePara, logPara, trans); } if (executeStatePara.endTrayLocation == null && executeStatePara.transportTask.CN_C_END_IS_CONTROL_QTY.Equals("Y")) { //添加托盘货位 CreateDAL>().Add(trayLocation, trans); Log.Detail(logPara, "添加托盘货位关联,内容:" + LogDescribe.Content(trayLocation)); CompleteTaskUpHistory(executeStatePara, logPara, trans); } //终点 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.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); //货位状态变化 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("出库")) { 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) { 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); CompleteTaskDownHistory(executeStatePara, logPara, trans); } if (executeStatePara.endTrayLocation == null) { //添加托盘货位 CreateDAL>().Add(trayLocation, trans); Log.Detail(logPara, "添加托盘货位关联,内容:" + LogDescribe.Content(trayLocation)); CompleteTaskUpHistory(executeStatePara, logPara, trans); } 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); Log.Detail(logPara, "更新预出库锁定的货位状态为正常、空,终点货位号:" + executeStatePara.transportTask.CN_S_START_BIT); BLLCreator.Create().AddStateChange(executeStatePara.transportTask.CN_S_START_BIT, "预出库锁定", "正常", "状态回报出库完成", "", "", "", executeStatePara.endStockArea.CN_S_STOCK_CODE, executeStatePara.endStockArea.CN_S_AREA_CODE, trans); } //终点 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.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(); 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 = "", 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_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 = "", 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 (upHis.Any()) { Log.Detail(logPara, "添加上架记录,内容:" + LogDescribe.Content(upHis)); CreateDAL>().AddRange(upHis, trans); } } public override void CompleteTaskDownHistory(ExecuteStateParaDto executeStatePara, LogPara logPara, IDbTransaction trans) { var downHis = new List(); 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 } }