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.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.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 { public class WmsApiBaseBLLLJ : DapperBaseBLL { #region 入库 public virtual string InWorkArea(List inWorkAreaEntitys) { var logPara = LogType.LogPara("入作业区"); Log.Detail(logPara, "InWorkArea接口请求参数:" + JsonConvert.SerializeObject(inWorkAreaEntitys)); var result = JsonConvert.SerializeObject(InWorkArea(inWorkAreaEntitys, logPara)); Log.Detail(logPara, "InWorkArea接口返回结果:" + result); return result; } public virtual ExternalResponse InWorkArea(List inWorkAreaEntitys, LogPara logPara) { var response = new ExternalResponse(); if (inWorkAreaEntitys == null) return new ExternalResponse { success = false, errMsg = "参数不正确" }; for (var i = 0; i < inWorkAreaEntitys.Count; i++) { var result = InWorkArea(inWorkAreaEntitys[i], logPara); if (result.BasisResponse.Success) { response.success = true; response.okList.Add(result.TaskExecuteState.okTask); //发送到AMS } else { response.failList.Add(result.TaskExecuteState.Error(i, result.BasisResponse.Message).FailTask); //入库转运锁定起点的,如果执行不成功则解锁 if (result.RollbackLocations.Count > 0) { foreach (string sLocation in result.RollbackLocations) { BLLCreator.Create().UpdateState(sLocation, Constants.Location_State_Normal, ""); AutoBomLocationEntity locationModel = CreateDAL().GetModel(sLocation); BLLCreator.Create().AddStateChange(sLocation, "", "正常", "出库请求失败回滚过程中锁定的货位", inWorkAreaEntitys[i].sysName, "", "", locationModel.CN_S_STOCK_CODE, locationModel.CN_S_AREA_CODE, null); } } } } var curResult = (response.failList.Any() ? response.Error(null, string.Empty, inWorkAreaEntitys) : response.Ok(null, inWorkAreaEntitys)); return curResult; } public virtual ExecuteInWorkAreaPara InWorkArea(InWorkAreaEntity inWorkAreaEntity, LogPara logPara) { if (string.IsNullOrEmpty(inWorkAreaEntity.sysName)) inWorkAreaEntity.sysName = "AMS"; var executeInWorkAreaPara = new ExecuteInWorkAreaPara { InWorkAreaEntity = inWorkAreaEntity }; try { if (!InWorkAreaVerifyPara(ref executeInWorkAreaPara, logPara).BasisResponse.Success) return executeInWorkAreaPara; if (!InWorkAreaHandlePara(ref executeInWorkAreaPara, logPara).BasisResponse.Success) return executeInWorkAreaPara; if (string.IsNullOrEmpty(inWorkAreaEntity.endBit)) { if (!InWorkAreaCalculatePath(ref executeInWorkAreaPara, logPara).BasisResponse.Success) return executeInWorkAreaPara; if (!InWorkAreaInAss(ref executeInWorkAreaPara, logPara).BasisResponse.Success) return executeInWorkAreaPara; } InWorkAreaCreateTask(ref executeInWorkAreaPara, logPara); executeInWorkAreaPara = InWorkAreaProcedure(executeInWorkAreaPara, logPara); } catch (Exception ex) { executeInWorkAreaPara.BasisResponse = BasisResponse.Error("ExecuteInWorkArea 方法异常:" + JsonConvert.SerializeObject(ex.Message + ex.StackTrace)); } return executeInWorkAreaPara; } public virtual ExecuteInWorkAreaPara InWorkAreaVerifyPara(ref ExecuteInWorkAreaPara executeInWorkAreaPara, LogPara logPara) { if (executeInWorkAreaPara.InWorkAreaEntity.isTransport == null) executeInWorkAreaPara.InWorkAreaEntity.isTransport = "N"; //if (executeInWorkAreaPara.InWorkAreaEntity.trayWeight != null) if (executeInWorkAreaPara.InWorkAreaEntity.trayWeight > 0) executeInWorkAreaPara.InWorkAreaEntity.taskType = "原料入库"; //物料编码_对象不为空时,必须存在物料编码 if (executeInWorkAreaPara.InWorkAreaEntity.data != null) if (executeInWorkAreaPara.InWorkAreaEntity.data.Any(entity => string.IsNullOrEmpty(entity.itemCode))) { executeInWorkAreaPara.BasisResponse = BasisResponse.Error("物料编码为空" + JsonConvert.SerializeObject(executeInWorkAreaPara.InWorkAreaEntity.data)); 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.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 virtual 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 (string.IsNullOrEmpty(executeInWorkAreaPara.InWorkAreaEntity.trayCode)) { //转运并且不传托盘号,默认从货位中获取 if (executeInWorkAreaPara.InWorkAreaEntity.isTransport == "Y") { //查找托盘号和物料编码 and by liuying 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.itemWeight = trayItemDtl[0].CN_S_SERIAL_NO; 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; } } 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); //executeInWorkAreaPara.BasisResponse = BasisResponse.Error("起点货位" + executeInWorkAreaPara.InWorkAreaEntity.startBit + "没有绑定托盘"); //return executeInWorkAreaPara; } else { executeInWorkAreaPara.InWorkAreaEntity.trayCode = trayLocation.CN_S_TRAY_CODE; // if (executeInWorkAreaPara.InWorkAreaEntity.projectCode == "nt001") //if (executeInWorkAreaPara.TrayInfo == null) //{ // { // executeInWorkAreaPara.BasisResponse = BasisResponse.Error("托盘信息表无当前托盘" + trayLocation.CN_S_TRAY_CODE); // return executeInWorkAreaPara; // } //} } } } //处理物料编码 if (executeInWorkAreaPara.InWorkAreaEntity.data != null) { foreach (var itemData in executeInWorkAreaPara.InWorkAreaEntity.data) { var item = BLLCreator.Create().GetItem(itemData.itemCode); //BLLCreator.Create>().GetSingleEntity(new { CN_S_ITEM_CODE = itemData.itemCode }); if (item != null) { itemData.itemPackUnit = item.CN_S_PACK_UNIT; itemData.itemName = item.CN_S_ITEM_NAME; } else { executeInWorkAreaPara.BasisResponse = BasisResponse.Error("物料" + itemData.itemCode + "在AutoBom中没有维护"); 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 + "未找到库区信息!"); 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.InWorkAreaEntity.isControlEndBit.Equals("true")) //{ 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; } } } return executeInWorkAreaPara; } public virtual ExecuteInWorkAreaPara InWorkAreaCalculatePath(ref ExecuteInWorkAreaPara executeInWorkAreaPara, LogPara logPara) { //获取作业区列表 var workAreaProList = BLLCreator.Create().GetInWorkPosition(executeInWorkAreaPara); if (workAreaProList.Any()) { executeInWorkAreaPara.WorkAreaProEntitys = workAreaProList; } else { executeInWorkAreaPara.BasisResponse = BasisResponse.Error("未找到该库区的作业流转流程!"); return executeInWorkAreaPara; } return executeInWorkAreaPara; } public virtual 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 : "", 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, //taskNo = executeInWorkAreaPara.InWorkAreaEntity.taskNo, 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 virtual 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 { executeOutWorkAreaPara.BasisResponse = BasisResponse.Error("在" + string.Join(",", executeOutWorkAreaPara.WorkAreaProEntitys.Select(o => o.CN_S_END_AREA_CODE).ToList()) + "库区中未找到合适的入库货位,详细原因:" + resultEntity.Msg); } //创建转运任务 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_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 virtual 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_CREATOR = executeInWorkAreaPara.InWorkAreaEntity.creatorBy; executeInWorkAreaPara.TransportEntity.CN_S_CREATOR_BY = executeInWorkAreaPara.InWorkAreaEntity.creatorBy; return executeInWorkAreaPara; } public virtual ExecuteInWorkAreaPara InWorkAreaProcedure(ExecuteInWorkAreaPara executeInWorkAreaPara, LogPara logPara) { var result = UseTransaction(trans => { InWorkAreaProcedureFunc(executeInWorkAreaPara, trans, logPara); if (executeInWorkAreaPara.InWorkAreaEntity.needCreateAMSTask == "Y") { OperateResult re = new OtherSysApi().SendAmsCreateTask(executeInWorkAreaPara.TransportEntity); if (!re.Success) { throw new Exception("SendAmsCreateTask异常:" + 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 }); } else { executeInWorkAreaPara.BasisResponse = BasisResponse.Error("ExecuteInWorkArea 方法异常:" + result.Msg); } return executeInWorkAreaPara; } public virtual 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); 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_LOT_NO = item.lotNo, CN_S_UNIQUE_CODE = item.uniqueCode, CN_S_PACKING_UNIT = item.itemPackUnit, CN_F_PACKING_QTY = item.qty, CN_F_QUANTITY = item.qty, CN_T_PRODUCTION = item.productionDate, CN_S_CREATOR = "hh", CN_S_CREATOR_BY = "", CN_T_CREATE = DateTime.Now, CN_GUID = Guid.NewGuid().ToString(), sqlwhere = " WHERE CN_PARENT_GUID='" + trayItemMstGuid + "' " } }, trans); transResult = new OperateResult { Success = curResult.Success, Msg = curResult.Success ? "" : curResult.Exception.Message }; if (!transResult.Success) { trans.Rollback(); return; } } } } var transport = executeInWorkAreaPara.TransportEntity; //创建任务 var operateResult = BLLCreator.Create>().Add(new TN_WM_TASKEntity { CN_S_TASK_NO = transport.CN_S_TASK_NO, CN_S_TRAY_CODE = transport.CN_S_CIR_OBJ_CODE, CN_S_START_BIT = transport.CN_S_START_BIT, CN_S_END_BIT = transport.CN_S_END_BIT, //CN_S_PRO_CODE = transport.CN_S_PRO_CODE, CN_S_STATE = transport.CN_S_STATE, CN_S_BF_TASK_NO = transport.CN_S_BF_TASK_NO, CN_S_AF_TASK_NO = transport.CN_S_AF_TASK_NO, CN_S_STOCK_CODE = transport.CN_S_STOCK_CODE, CN_S_START_AREA = transport.CN_S_START_AREA, CN_S_END_AREA = transport.CN_S_END_AREA, CN_N_PRIORITY = transport.CN_N_PRIORITY, CN_S_CREATOR = transport.CN_S_CREATOR, CN_S_CREATOR_BY = transport.CN_S_CREATOR_BY, CN_T_CREATE = Convert.ToDateTime(transport.CN_T_CREATE), CN_T_MODIFY = Convert.ToDateTime(transport.CN_T_MODIFY), CN_S_REMARK = transport.CN_S_REMARK, //CN_C_IS_AUTO = transport.CN_C_IS_AUTO, CN_S_TASK_TYPE = transport.CN_S_TASK_TYPE, CN_C_START_IS_CONTROL_QTY = transport.CN_C_START_IS_CONTROL_QTY, CN_C_END_IS_CONTROL_QTY = transport.CN_C_END_IS_CONTROL_QTY, CN_S_START_CONTROL_INV = transport.CN_S_START_CONTROL_INV, CN_S_END_CONTROL_INV = transport.CN_S_END_CONTROL_INV, CN_S_START_AREA_TYPE = transport.CN_S_START_AREA_TYPE, CN_S_END_AREA_TYPE = transport.CN_S_END_AREA_TYPE, CN_S_FROM_OP = "入库/转运" //CN_S_PROJECT_CODE = executeOutWorkAreaPara.OutWorkAreaEntity.projectCode }, 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_S_END_AREA_TYPE.Equals("平库") || executeInWorkAreaPara.TransportEntity.CN_S_END_AREA_TYPE.Equals("立库")){} //更新起点的任务号 if (executeInWorkAreaPara.TransportEntity.CN_C_START_IS_CONTROL_QTY.Equals("Y")) //&& executeInWorkAreaPara.InWorkAreaEntity.isTransport.Equals("Y") { CreateDAL().UpdateLocationExtState(executeInWorkAreaPara.TransportEntity.CN_S_START_BIT, "", "", executeInWorkAreaPara.TransportEntity.CN_S_TASK_NO, trans); } } #endregion #region 出库 public virtual string OutWorkArea(List outWorkAreaList) { var logPara = LogType.LogPara("出作业区"); var result = JsonConvert.SerializeObject(OutWorkArea(outWorkAreaList, logPara)); return result; } public virtual ExternalResponse OutWorkArea(List outWorkAreaList, LogPara logPara) { Log.Detail(logPara, "OutWorkArea接口请求参数隆基:" + JsonConvert.SerializeObject(outWorkAreaList)); var response = new ExternalResponse(); if (outWorkAreaList == null) return new ExternalResponse { success = false, errMsg = "参数不正确" }; for (var i = 0; i < outWorkAreaList.Count; i++) { if (string.IsNullOrEmpty(outWorkAreaList[i].sysName)) { outWorkAreaList[i].sysName = "AMS"; } Log.Detail(logPara, "循环OutWorkArea接口请求参数-隆基:准备进入OutWorkAreaLj方法"); var result = OutWorkArea(outWorkAreaList[i], logPara); if (result.BasisResponse.Success) { response.success = true; response.okList.Add(result.TaskExecuteState.okTask); //发送到AMS //SendToAms(response, logPara); } else { response.failList.Add(new TaskExecuteState().Error(i, result.BasisResponse.Message).FailTask); if (result.RollLocations.Count > 0) { foreach (string sLocation in result.RollLocations) { BLLCreator.Create().UpdateState(sLocation, Constants.Location_State_Normal, ""); AutoBomLocationEntity locationModel = CreateDAL().GetModel(sLocation); BLLCreator.Create().AddStateChange(sLocation, "", "正常", "出库请求失败回滚过程中锁定的货位", outWorkAreaList[i].sysName, "", "", locationModel.CN_S_STOCK_CODE, locationModel.CN_S_AREA_CODE, null); } } } } var curResult = response.failList.Any() ? response.Error(null, string.Empty, outWorkAreaList) : response.Ok(null, outWorkAreaList); Log.Detail(logPara, "OutWorkArea接口返回参数:" + curResult); return curResult; } public virtual ExecuteOutWorkAreaPara OutWorkArea(OutWorkAreaEntity outWorkAreaEntity, LogPara logPara) { Log.Detail(logPara, "进入隆基OutWorkArea方法"); var executeOutWorkAreaPara = new ExecuteOutWorkAreaPara { OutWorkAreaEntity = outWorkAreaEntity }; try { if (!OutWorkAreaVerifyPara(ref executeOutWorkAreaPara, logPara).BasisResponse.Success) return executeOutWorkAreaPara; if (!OutWorkAreaHandlePara(ref executeOutWorkAreaPara, logPara).BasisResponse.Success) return executeOutWorkAreaPara; //算法计算货位 if (string.IsNullOrEmpty(executeOutWorkAreaPara.OutWorkAreaEntity.startBit)) { OutWorkAreaCalculateLoaction(ref executeOutWorkAreaPara, logPara);//new ExternalOutWorkAreaBLL().CalculateLoaction(executeOutWorkAreaPara); if (!executeOutWorkAreaPara.BasisResponse.Success) return executeOutWorkAreaPara; if (!executeOutWorkAreaPara.TransportList.Any()) { OutWorkAreaOutAss(ref executeOutWorkAreaPara, logPara); if (!executeOutWorkAreaPara.BasisResponse.Success) return executeOutWorkAreaPara; } } else { //创建转运任务 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.StartStockAreaEntity.CN_S_AREA_CODE, CN_S_STATE = Constants.TaskStateList[0], 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, CN_S_EXT3 = executeOutWorkAreaPara.OutWorkAreaEntity.moduleType, CN_S_REMARK = executeOutWorkAreaPara.OutWorkAreaEntity.remark }; executeOutWorkAreaPara.TransportList.Add(entity); } if (string.IsNullOrEmpty(executeOutWorkAreaPara.OutWorkAreaEntity.endBit)) { if (!InWorkAreaOutAss(ref executeOutWorkAreaPara, logPara).BasisResponse.Success) return executeOutWorkAreaPara; } UseTransaction(trans => { OutWorkAreaCreateTask(ref executeOutWorkAreaPara, logPara); OutWorkAreaProcedure(ref executeOutWorkAreaPara, logPara); if (executeOutWorkAreaPara.OutWorkAreaEntity.needCreateAMSTask == "Y") { OperateResult re = new OtherSysApi().SendAmsCreateTaskLJ(executeOutWorkAreaPara.TransportList[0]); if (!re.Success) { throw new Exception("SendAmsCreateTask异常:" + re.Msg); } } }); } catch (Exception ex) { executeOutWorkAreaPara.BasisResponse = BasisResponse.Error("OutWorkAreaLj 方法异常:" + JsonConvert.SerializeObject(ex.Message + ex.StackTrace)); } return executeOutWorkAreaPara; } public virtual ExecuteOutWorkAreaPara OutWorkAreaVerifyPara(ref ExecuteOutWorkAreaPara executeOutWorkAreaPara, LogPara logPara) { if (executeOutWorkAreaPara.OutWorkAreaEntity == null) { executeOutWorkAreaPara.BasisResponse = BasisResponse.Error("参数不合法,接收参数为null!"); return executeOutWorkAreaPara; } #region 检查起点位置 if (!string.IsNullOrEmpty(executeOutWorkAreaPara.OutWorkAreaEntity.startBit)) { executeOutWorkAreaPara.StartStockAreaEntity = DALCreator.Create().GetAreaModelByLocation(executeOutWorkAreaPara.OutWorkAreaEntity.startBit.Trim()); if (executeOutWorkAreaPara.StartStockAreaEntity == null) { executeOutWorkAreaPara.BasisResponse = BasisResponse.Error("给定起点位置:" + executeOutWorkAreaPara.OutWorkAreaEntity.startBit + "不存在!"); return executeOutWorkAreaPara; } var trayLocation = BLLCreator.Create>().GetSingleEntity(new { CN_S_LOCATION_CODE = executeOutWorkAreaPara.OutWorkAreaEntity.startBit }); if (trayLocation == null) { executeOutWorkAreaPara.BasisResponse = BasisResponse.Error("当前起点未绑定托盘!"); return executeOutWorkAreaPara; } 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 + ",不允许出库!"); return executeOutWorkAreaPara; } BLLCreator.Create().UpdateState(executeOutWorkAreaPara.OutWorkAreaEntity.startBit, "预出库锁定", "正常"); executeOutWorkAreaPara.RollLocations.Add(executeOutWorkAreaPara.OutWorkAreaEntity.startBit); executeOutWorkAreaPara.OutWorkAreaEntity.trayCode = trayLocation.CN_S_TRAY_CODE; } #endregion #region 检验终点库区 if (string.IsNullOrEmpty(executeOutWorkAreaPara.OutWorkAreaEntity.endBit)) { executeOutWorkAreaPara.BasisResponse = BasisResponse.Error("给定的目的位置不存在!"); return executeOutWorkAreaPara; } //获取终点库区信息 executeOutWorkAreaPara.EndStockAreaEntity = DALCreator.Create().GetAreaModelByLocation(executeOutWorkAreaPara.OutWorkAreaEntity.endBit.Trim()); if (executeOutWorkAreaPara.EndStockAreaEntity == null) { executeOutWorkAreaPara.BasisResponse = BasisResponse.Error("给定的目的位置未找到库区!"); return executeOutWorkAreaPara; } if (executeOutWorkAreaPara.OutWorkAreaEntity.IsTransport == null) executeOutWorkAreaPara.OutWorkAreaEntity.IsTransport = "N"; // 检查货位状态 是转运且管控数量时使用 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 + ",货位不可用!"); return executeOutWorkAreaPara; } if (!executeOutWorkAreaPara.EndLocationExt.CN_S_USE_STATE.Equals("空")) { executeOutWorkAreaPara.BasisResponse = BasisResponse.Error("当前货位存储状态为" + executeOutWorkAreaPara.EndLocationExt.CN_S_USE_STATE + ",货位不可用!"); return executeOutWorkAreaPara; } //锁定终点货位 OperateResult lockResult = BLLCreator.Create().UpdateState(executeOutWorkAreaPara.OutWorkAreaEntity.endBit, "预入库锁定", "正常"); if (lockResult.Success) { 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 { executeOutWorkAreaPara.BasisResponse = BasisResponse.Error("锁定终点货位" + executeOutWorkAreaPara.OutWorkAreaEntity.endBit + "失败!详细原因为:SqlExecuteResult返回false或影响row为0"); return executeOutWorkAreaPara; } } executeOutWorkAreaPara.OutWorkAreaEntity.startStock = executeOutWorkAreaPara.EndStockAreaEntity.CN_S_STOCK_CODE; executeOutWorkAreaPara.OutWorkAreaEntity.endArea = executeOutWorkAreaPara.EndStockAreaEntity.CN_S_AREA_CODE; #endregion return executeOutWorkAreaPara; } public virtual 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出库任务号异常!"); } //获取作业区列表 //executeOutWorkAreaPara.WorkAreaProEntitys = BLLCreator.Create().GetOutWorkPosition(executeOutWorkAreaPara); if (!string.IsNullOrEmpty(executeOutWorkAreaPara.OutWorkAreaEntity.trayCode)) { //根据托盘号查询托盘产品关联信息主表 var trayItemMst = BLLCreator.Create().GetTrayItemMst(" AND CN_S_TRAY_CODE ='" + executeOutWorkAreaPara.OutWorkAreaEntity.trayCode + "'"); // Log.Detail(logPara, "OutWorkAreaHandlePara.trayItemMst:" + JsonConvert.SerializeObject(trayItemMst)); StringBuilder sbRemark = new StringBuilder(); if (trayItemMst.Count > 0) { //查询托盘产品关联信息子表 sbRemark.Append(trayItemMst[0].CN_S_ITEM_CODE); sbRemark.Append("&"); sbRemark.Append(trayItemMst[0].CN_S_MODEL); sbRemark.Append("&"); sbRemark.Append(trayItemMst[0].CN_S_OWNER); sbRemark.Append("&"); sbRemark.Append(trayItemMst[0].CN_S_FIGURE_NO); sbRemark.Append("&"); sbRemark.Append(trayItemMst[0].CN_S_ITEM_STATE); sbRemark.Append("&"); sbRemark.Append(trayItemMst[0].CN_S_ITEM_NAME); sbRemark.Append("&"); sbRemark.Append(trayItemMst[0].CN_S_MEASURE_UNIT); } executeOutWorkAreaPara.OutWorkAreaEntity.remark = sbRemark.ToString(); } return executeOutWorkAreaPara; } public virtual ExecuteOutWorkAreaPara OutWorkAreaCalculateLoaction(ref ExecuteOutWorkAreaPara executeOutWorkAreaPara, LogPara logPara) { executeOutWorkAreaPara.ItemQueryClassList = new List(); if (executeOutWorkAreaPara.OutWorkAreaEntity.Data != null) { foreach (var itemData in executeOutWorkAreaPara.OutWorkAreaEntity.Data) { if (!string.IsNullOrEmpty(itemData.TrayCode)) { #region 按照托盘出库 //起点货位 executeOutWorkAreaPara.TrayObjLocation = CreateDAL().GetListByTrayCode(itemData.TrayCode).First(); if (executeOutWorkAreaPara.TrayObjLocation == null) { executeOutWorkAreaPara.BasisResponse = BasisResponse.Error(string.Format("库区:{0},未找到托盘{1} ", "", itemData.TrayCode)); return executeOutWorkAreaPara; } if (string.IsNullOrEmpty(executeOutWorkAreaPara.TrayObjLocation.CN_S_LOCATION_CODE)) { executeOutWorkAreaPara.BasisResponse = BasisResponse.Error(string.Format("库区:{0},托盘{1} 未找到起始货位", "", itemData.TrayCode)); return executeOutWorkAreaPara; } var startStockLocation = DALCreator.Create().GetAreaModelByLocation(executeOutWorkAreaPara.TrayObjLocation.CN_S_LOCATION_CODE); //获取作业流转任务 var entity = new TN_WM_TRANSPORT_TASKEntity { CN_S_TASK_NO = executeOutWorkAreaPara.OutWorkAreaEntity.taskNo, CN_S_CIR_OBJ = "托盘", CN_S_CIR_OBJ_CODE = itemData.TrayCode, CN_S_START_BIT = executeOutWorkAreaPara.TrayObjLocation.CN_S_LOCATION_CODE, CN_S_START_AREA = executeOutWorkAreaPara.TrayObjLocation.CN_S_STOCK_AREA, CN_S_STATE = Constants.TaskStateList[0], 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 = "出库", 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 = startStockLocation.CN_C_IS_CONTROL_QTY, CN_S_START_AREA_TYPE = startStockLocation.CN_S_STRUCTURE }; executeOutWorkAreaPara.TransportList.Add(entity); //锁定起点货位 var lockResult = CreateDAL().UpdateLocationState(executeOutWorkAreaPara.TrayObjLocation.CN_S_LOCATION_CODE, Constants.Location_State_OutLock, "出库", null); if (lockResult.Success && lockResult.Row > 0) { executeOutWorkAreaPara.RollLocations.Add(executeOutWorkAreaPara.TrayObjLocation.CN_S_LOCATION_CODE); AutoBomLocationEntity locationModel = CreateDAL().GetModel(executeOutWorkAreaPara.TrayObjLocation.CN_S_LOCATION_CODE); BLLCreator.Create().AddStateChange(executeOutWorkAreaPara.TrayObjLocation.CN_S_LOCATION_CODE, "正常", "预出库锁定", "按托盘出库锁定起点货位防止其他资源竞争", executeOutWorkAreaPara.OutWorkAreaEntity.sysName, "", "", locationModel.CN_S_STOCK_CODE, locationModel.CN_S_AREA_CODE, null); } else executeOutWorkAreaPara.BasisResponse = BasisResponse.Error("按托盘出库锁定货位失败!"); #endregion } else { //算法位置 return executeOutWorkAreaPara;// = OutAss(executeOutWorkAreaPara); } } } else { //空托出库 return executeOutWorkAreaPara; //= OutAss(executeOutWorkAreaPara); } if (!executeOutWorkAreaPara.BasisResponse.Success) return executeOutWorkAreaPara; //if (executeOutWorkAreaPara.TransportList.Count == 0) // executeOutWorkAreaPara.BasisResponse = BasisResponse.Error("未找到合适的出库货位!"); return executeOutWorkAreaPara; } public virtual ExecuteOutWorkAreaPara OutWorkAreaOutAss(ref ExecuteOutWorkAreaPara executeOutWorkAreaPara, LogPara logPara) { #region 算法 //获取终点货位 OutAssignEnitty oEntity = new OutAssignEnitty() { stockCode = executeOutWorkAreaPara.OutWorkAreaEntity.startStock, itemCode = executeOutWorkAreaPara.OutWorkAreaEntity.Data == null ? "" : executeOutWorkAreaPara.OutWorkAreaEntity.Data.First().ItemCode, itemState = executeOutWorkAreaPara.OutWorkAreaEntity.Data == null ? "" : executeOutWorkAreaPara.OutWorkAreaEntity.Data.First().ItemState, projectCode = executeOutWorkAreaPara.OutWorkAreaEntity.projectCode, endBit = executeOutWorkAreaPara.OutWorkAreaEntity.endBit, lstAreaPrior = executeOutWorkAreaPara.WorkAreaProEntitys.Select(e => new areaPriorClass { areaCode = e.CN_S_START_AREA_CODE, Prior = e.CN_N_PRIORITY }).ToList() }; try { //执行算法 OutAssignResultEntity ire = BLLCreator.Create().OutAssign(oEntity); if (!ire.Success) { executeOutWorkAreaPara.BasisResponse = BasisResponse.Error("算法返回结果" + ire.Msg); return executeOutWorkAreaPara; } if ((ire.areaType == Constants.Area_Struc_PingStock || ire.areaType == Constants.Area_Struc_LiStock) && ire.isControlQty == "Y") { executeOutWorkAreaPara.RollLocations.Add(ire.locationCode); } //创建转运任务 var entity = new TN_WM_TRANSPORT_TASKEntity { CN_S_TASK_NO = executeOutWorkAreaPara.OutWorkAreaEntity.taskNo, CN_S_CIR_OBJ = "托盘", CN_S_CIR_OBJ_CODE = ire.trayCode, CN_S_START_BIT = ire.locationCode, CN_S_START_AREA = ire.areaCode, CN_S_STATE = Constants.TaskStateList[0], 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 = ire.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 = ire.isControlQty, CN_S_START_AREA_TYPE = ire.areaType, CN_S_END_CONTROL_INV = executeOutWorkAreaPara.EndStockAreaEntity.CN_C_IS_INVENTORY, CN_S_START_CONTROL_INV = ire.isControlInv }; executeOutWorkAreaPara.TransportList.Add(entity); } catch (Exception ex) { executeOutWorkAreaPara.BasisResponse = BasisResponse.Error("未找到合适的出库货位" + ex.Message); } #endregion return executeOutWorkAreaPara; } public virtual ExecuteOutWorkAreaPara OutWorkAreaCreateTask(ref ExecuteOutWorkAreaPara executeOutWorkAreaPara, LogPara logPara) { //任务 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_PRO_CODE = transport.CN_S_PRO_CODE, CN_S_STATE = transport.CN_S_STATE, CN_S_BF_TASK_NO = transport.CN_S_BF_TASK_NO, CN_S_AF_TASK_NO = transport.CN_S_AF_TASK_NO, CN_S_STOCK_CODE = transport.CN_S_STOCK_CODE, CN_S_START_AREA = transport.CN_S_START_AREA, CN_S_END_AREA = transport.CN_S_END_AREA, CN_N_PRIORITY = transport.CN_N_PRIORITY, CN_S_CREATOR = transport.CN_S_CREATOR, CN_S_CREATOR_BY = transport.CN_S_CREATOR_BY, CN_T_CREATE = Convert.ToDateTime(transport.CN_T_CREATE), CN_T_MODIFY = Convert.ToDateTime(transport.CN_T_MODIFY), CN_S_REMARK = transport.CN_S_REMARK, //CN_C_IS_AUTO = transport.CN_C_IS_AUTO, CN_S_TASK_TYPE = transport.CN_S_TASK_TYPE, CN_C_START_IS_CONTROL_QTY = transport.CN_C_START_IS_CONTROL_QTY, CN_C_END_IS_CONTROL_QTY = transport.CN_C_END_IS_CONTROL_QTY, CN_S_START_CONTROL_INV = transport.CN_S_START_CONTROL_INV, CN_S_END_CONTROL_INV = transport.CN_S_END_CONTROL_INV, CN_S_START_AREA_TYPE = transport.CN_S_START_AREA_TYPE, CN_S_END_AREA_TYPE = transport.CN_S_END_AREA_TYPE, //CN_S_PROJECT_CODE = executeOutWorkAreaPara.OutWorkAreaEntity.projectCode }); if (!sqlResult.Success) { executeOutWorkAreaPara.BasisResponse = BasisResponse.Error("创建任务失败!" + sqlResult.Msg); } return executeOutWorkAreaPara; } public virtual ExecuteOutWorkAreaPara OutWorkAreaProcedure(ref ExecuteOutWorkAreaPara executeOutWorkAreaPara, LogPara logPara) { var sqlResult = new OperateResult { Success = true }; //任务 var transport = executeOutWorkAreaPara.TransportList.FirstOrDefault(); //更新起点的任务号 if (transport.CN_S_START_AREA_TYPE.Equals("平库") || transport.CN_S_START_AREA_TYPE.Equals("立库")) { if (transport.CN_C_START_IS_CONTROL_QTY.Equals("Y")) { sqlResult = CreateDAL().UpdateLocationExtState(transport.CN_S_START_BIT, "", "", transport.CN_S_TASK_NO, null); } } //更新结束点的任务号 if (transport.CN_S_END_AREA_TYPE.Equals("平库") || transport.CN_S_END_AREA_TYPE.Equals("立库")) { if (transport.CN_C_END_IS_CONTROL_QTY.Equals("Y") && executeOutWorkAreaPara.OutWorkAreaEntity.IsTransport.Equals("Y")) { sqlResult = CreateDAL().UpdateLocationExtState(transport.CN_S_END_BIT, "", "", transport.CN_S_TASK_NO, null); } } if (!sqlResult.Success) { executeOutWorkAreaPara.BasisResponse = BasisResponse.Error("执行UpdateLocationExtState失败!" + sqlResult.Msg); } else { executeOutWorkAreaPara.TaskExecuteState = new TaskExecuteState().Ok(OutWorkAreaOkTaskResponse(executeOutWorkAreaPara.TransportList[0], executeOutWorkAreaPara.OutWorkAreaEntity.itemCode, executeOutWorkAreaPara.index), null); } return executeOutWorkAreaPara; } public virtual OkTask OutWorkAreaOkTaskResponse(TN_WM_TRANSPORT_TASKEntity trans, string itemCode, int index) { if (trans.CN_S_START_AREA_TYPE == Constants.Area_Struc_LiuLiStock || trans.CN_S_START_AREA_TYPE == Constants.Area_Struc_DuiDieStock) { trans.CN_S_START_BIT += "_" + trans.CN_S_QTY_INDEX; } var okTask = new OkTask() { index = index, taskNo = trans.CN_S_TASK_NO, startStock = trans.CN_S_STOCK_CODE, startArea = trans.CN_S_START_AREA, startBit = trans.CN_S_START_BIT, endStock = trans.CN_S_STOCK_CODE, endArea = trans.CN_S_END_AREA, endBit = trans.CN_S_END_BIT, priority = trans.CN_N_PRIORITY, trayCode = trans.CN_S_CIR_OBJ_CODE, itemCode = itemCode }; return okTask; } #endregion public virtual string getName() { return "基础"; } } }