using HH.WMS.BLL.Algorithm; using HH.WMS.BLL.Basic; using HH.WMS.BLL.ERP; using HH.WMS.BLL.InStock; using HH.WMS.BLL.Interface; using HH.WMS.BLL.SysMgr; using HH.WMS.Common; using HH.WMS.Common.Algorithm; using HH.WMS.Common.External; using HH.WMS.Common.Response; using HH.WMS.DAL; using HH.WMS.DAL.Algorithm; using HH.WMS.DAL.Basic; using HH.WMS.DAL.MoveStock; using HH.WMS.DAL.SysMgr; using HH.WMS.Entitys; using HH.WMS.Entitys.Algorithm; using HH.WMS.Entitys.Basic; using HH.WMS.Entitys.Dto; using HH.WMS.Entitys.Entitys; using HH.WMS.Entitys.ERP; using HH.WMS.Entitys.External; using Newtonsoft.Json; using System; using System.Collections.Generic; using System.Data; using System.Linq; namespace HH.WMS.BLL.External { public class WmsApiForNtsdBLL : WmsApiBaseBLL { #region 入库 public override ExternalResponse InWorkArea(List inWorkAreaEntitys, LogPara logPara) { var response = new ExternalResponse(); if (inWorkAreaEntitys == null) return new ExternalResponse { success = false, errMsg = "参数不正确", errCode = "102" }; if (inWorkAreaEntitys.Count() == 0) return new ExternalResponse { success = false, errMsg = "参数不正确", errCode = "102" }; var result = InWorkArea(inWorkAreaEntitys[0], logPara); if (result.BasisResponse.Success) { response.success = true; response.errCode = "100"; response.okList.Add(result.TaskExecuteState.okTask); //发送到AMS // SendToAms(response, logPara); } else { if (result.BasisResponse.Message.Contains("空托不能原料入库")) { response.errCode = "201"; } else if (result.BasisResponse.Message.Contains("未找到合适的入库货位")) { response.errCode = "200"; } else { response.errCode = "201"; } response.failList.Add(result.TaskExecuteState.Error(0, 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[0].sysName, "", "", locationModel.CN_S_STOCK_CODE, locationModel.CN_S_AREA_CODE, null); } } } return response; //var curResult = (response.failList.Any() ? response.Error(null, string.Empty, inWorkAreaEntitys) : response.Ok(null, inWorkAreaEntitys)); //return curResult; } public override ExecuteInWorkAreaPara InWorkAreaVerifyPara(ref ExecuteInWorkAreaPara executeInWorkAreaPara, LogPara logPara) { Log.Detail(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; } Log.Detail(logPara, "起点是否管控QTY:" + executeInWorkAreaPara.StartStockAreaEntity.CN_C_IS_CONTROL_QTY); // 检查货位状态 是转运且管控数量时使用 if (executeInWorkAreaPara.StartStockAreaEntity.CN_C_IS_CONTROL_QTY.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("满")) { if (!executeInWorkAreaPara.StartStockAreaEntity.CN_S_AREA_CODE.Equals("CPMRK")) { executeInWorkAreaPara.BasisResponse = BasisResponse.Error("当前起始货位存储状态为" + executeInWorkAreaPara.StartLocationExt.CN_S_USE_STATE + ",货位不可用!"); return executeInWorkAreaPara; } } //锁定起点货位 OperateResult lockResult = BLLCreator.Create().UpdateState(executeInWorkAreaPara.InWorkAreaEntity.startBit, "预出库锁定", "正常"); if (lockResult.Success && lockResult.AffectedRows > 0) { AutoBomLocationEntity locationModel = DALCreator.Create().GetModel(executeInWorkAreaPara.InWorkAreaEntity.startBit); //添加货位状态变化 BLLCreator.Create().AddStateChange(executeInWorkAreaPara.InWorkAreaEntity.startBit, "正常", "预出库锁定", "入库并且转运需要锁定起点货位防止其他资源竞争", executeInWorkAreaPara.InWorkAreaEntity.sysName, "", "", locationModel.CN_S_STOCK_CODE, locationModel.CN_S_AREA_CODE, null); executeInWorkAreaPara.RollbackLocations.Add(executeInWorkAreaPara.InWorkAreaEntity.startBit); } else { if (!lockResult.Success) { executeInWorkAreaPara.BasisResponse = BasisResponse.Error("锁定起点货位" + executeInWorkAreaPara.InWorkAreaEntity.startBit + "失败!详细原因为:" + lockResult.Msg); } else { executeInWorkAreaPara.BasisResponse = BasisResponse.Error("锁定起点货位" + executeInWorkAreaPara.InWorkAreaEntity.startBit + "失败!详细原因为:SqlExecuteResult影响行数为0"); } return executeInWorkAreaPara; } } //检查起点货位是否为报废状态 executeInWorkAreaPara.InWorkAreaEntity.startArea = executeInWorkAreaPara.StartStockAreaEntity.CN_S_AREA_CODE; executeInWorkAreaPara.InWorkAreaEntity.startStock = executeInWorkAreaPara.StartStockAreaEntity.CN_S_STOCK_CODE; } return executeInWorkAreaPara; } public override ExecuteInWorkAreaPara InWorkAreaHandlePara(ref ExecuteInWorkAreaPara executeInWorkAreaPara, LogPara logPara) { //任务号 考虑是否重复? if (string.IsNullOrEmpty(executeInWorkAreaPara.InWorkAreaEntity.taskNo)) { var postData = "{\"appCode\":\"" + Constants.appCode + "\",\"ruleName\":\"" + Constants.Rule_InTaskNo + "\",\"orgId\":\"0\",\"orgFlag\":\"\"}"; executeInWorkAreaPara.InWorkAreaEntity.taskNo = WebApiManager.HttpAutoBom_Post("api/BillRule/GenBillNo", postData); ; if (string.IsNullOrEmpty(executeInWorkAreaPara.InWorkAreaEntity.taskNo)) { executeInWorkAreaPara.BasisResponse = BasisResponse.Error("获取AUTOBOM入库任务号异常,请检查是否维护生成规则!"); return executeInWorkAreaPara; } } //托盘码 if (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 { //生成虚拟托盘 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 { 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; var taskAll = BLLCreator.Create>().GetList(new { CN_S_TRAY_CODE = trayLocation.CN_S_TRAY_CODE }); taskAll = taskAll.Where(e => e.CN_S_STATE != "取消").ToList(); var task = taskAll.Select(e => e.CN_S_STATE != "完成").ToList(); if (task.Any()) { executeInWorkAreaPara.BasisResponse = BasisResponse.Error("当前托盘存在未完成的任务!"); return executeInWorkAreaPara; } // if (executeInWorkAreaPara.InWorkAreaEntity.projectCode == "nt001") //if (executeInWorkAreaPara.TrayInfo == null) //{ // { // executeInWorkAreaPara.BasisResponse = BasisResponse.Error("托盘信息表无当前托盘" + trayLocation.CN_S_TRAY_CODE); // return executeInWorkAreaPara; // } //} } } } else { var itemEntity = new ChaoYangItemDataEntity(); executeInWorkAreaPara.InWorkAreaEntity.data = new List(); //根据托盘号查询托盘产品关联信息主表 var trayItemMst = BLLCreator.Create().GetTrayItemMst(" AND CN_S_TRAY_CODE ='" + executeInWorkAreaPara.InWorkAreaEntity.trayCode + "'"); 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); } } //处理物料编码 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; } } } //原料入库时处理 if (executeInWorkAreaPara.InWorkAreaEntity.trayWeight > 0) { //判断托盘是否绑定物料,以及托盘是否已经绑定目的库区货位 var trayItem = BLLCreator.Create>().GetSingleEntity(new { CN_S_TRAY_CODE = executeInWorkAreaPara.InWorkAreaEntity.trayCode }); if (trayItem == null) { executeInWorkAreaPara.BasisResponse = BasisResponse.Error("空托不能原料入库,原因:托盘" + executeInWorkAreaPara.InWorkAreaEntity.trayCode + "未绑定物料!"); return executeInWorkAreaPara; } executeInWorkAreaPara.InWorkAreaEntity.itemCode = trayItem.CN_S_ITEM_CODE; //判断是否是并笼 var combineCages = BLLCreator.Create().GetList(executeInWorkAreaPara.InWorkAreaEntity.trayCode, "新建"); if (combineCages.Count() == 0) { executeInWorkAreaPara.IsCombineCage = false; } else { executeInWorkAreaPara.IsCombineCage = true; //如果是并笼,删除托盘和货位的关联 CreateDAL>().Delete(new { CN_S_TRAY_CODE = executeInWorkAreaPara.InWorkAreaEntity.trayCode }, null); } } return executeInWorkAreaPara; } public override ExecuteInWorkAreaPara InWorkAreaCalculatePath(ref ExecuteInWorkAreaPara executeInWorkAreaPara, LogPara logPara) { Log.Detail(logPara, "结算路径:"); //获取作业区列表 var workAreaProList = BLLCreator.Create().GetInWorkPosition(executeInWorkAreaPara); if (workAreaProList.Any()) { executeInWorkAreaPara.WorkAreaProEntitys = workAreaProList; Log.Detail(logPara, "executeInWorkAreaPara.InWorkAreaEntity.taskType:" + executeInWorkAreaPara.InWorkAreaEntity.taskType); if (executeInWorkAreaPara.InWorkAreaEntity.taskType != null) { if (executeInWorkAreaPara.InWorkAreaEntity.taskType.Equals("原料入库")) { //判断当前托盘是否已经绑定到目的库区 var trayLocations = BLLCreator.Create>().GetList(new { CN_S_TRAY_CODE = executeInWorkAreaPara.InWorkAreaEntity.trayCode }); if (trayLocations.Count() > 0) { var areaCodes = workAreaProList.Select(e=>e.CN_S_END_AREA_CODE); var trayLocationsPara = trayLocations.Where(e => areaCodes.Contains(e.CN_S_STOCK_AREA)); if (trayLocationsPara.Count() > 0) { executeInWorkAreaPara.BasisResponse = BasisResponse.Error("当前托盘" + executeInWorkAreaPara.InWorkAreaEntity.trayCode + "已经存在目的库区中,不允许重复入库!"); return executeInWorkAreaPara; } } Log.Detail(logPara, "当前托盘executeInWorkAreaPara.InWorkAreaEntity.trayCode:" + executeInWorkAreaPara.InWorkAreaEntity.trayCode); var trayInfo = BLLCreator.Create().GetByTrayCode(executeInWorkAreaPara.InWorkAreaEntity.trayCode); trayInfo.CN_S_USE_STATE = trayInfo.CN_S_USE_STATE.Trim(); Log.Detail(logPara, "trayInfo为: " + JsonConvert.SerializeObject(trayInfo)); if (trayInfo != null) { if (trayInfo.CN_S_USE_STATE != null) { if (trayInfo.CN_S_USE_STATE.Equals("不满")) { executeInWorkAreaPara.WorkAreaProEntitys = executeInWorkAreaPara.WorkAreaProEntitys.Where(e => e.CN_S_END_AREA_CODE.Equals("YLBM")).ToList(); Log.Detail(logPara, "原料入库 状态:不满,转运流程为:" + JsonConvert.SerializeObject(executeInWorkAreaPara.WorkAreaProEntitys)); } else if (trayInfo.CN_S_USE_STATE.Equals("满")) { var trayItemMst = BLLCreator.Create().GetTrayItemMst(" AND CN_S_TRAY_CODE ='" + executeInWorkAreaPara.InWorkAreaEntity.trayCode + "'"); if (trayItemMst.Count() <= 0) { executeInWorkAreaPara.BasisResponse = BasisResponse.Error("原料入库未找到托盘!"); return executeInWorkAreaPara; } executeInWorkAreaPara.WorkAreaProEntitys = executeInWorkAreaPara.WorkAreaProEntitys.Where(e => !e.CN_S_END_AREA_CODE.Equals("YLBM")).ToList(); //var item = BLLCreator.Create().GetItem(trayItemMst.First().CN_S_ITEM_CODE); //if (item == null) //{ // executeInWorkAreaPara.BasisResponse = BasisResponse.Error("未找到物料" + trayItemMst.First().CN_S_ITEM_CODE + "!"); // return executeInWorkAreaPara; //} //if (item.CN_S_FEATURE.Equals("YLENDC")) //放大件的 //{ // executeInWorkAreaPara.WorkAreaProEntitys = executeInWorkAreaPara.WorkAreaProEntitys.Where(e => e.CN_S_END_AREA_CODE.Equals("YLENDC")).ToList(); //} //else //{ // executeInWorkAreaPara.WorkAreaProEntitys = executeInWorkAreaPara.WorkAreaProEntitys.Where(e => !e.CN_S_END_AREA_CODE.Equals("YLENDC")).ToList(); //} Log.Detail(logPara, "原料入库 状态:满,转运流程为:" + JsonConvert.SerializeObject(executeInWorkAreaPara.WorkAreaProEntitys)); } } else { executeInWorkAreaPara.BasisResponse = BasisResponse.Error("请维护托盘的状态!"); return executeInWorkAreaPara; } } } } } else { executeInWorkAreaPara.BasisResponse = BasisResponse.Error("未找到该库区的作业流转流程!"); return executeInWorkAreaPara; } return executeInWorkAreaPara; } public override ExecuteInWorkAreaPara InWorkAreaInAss(ref ExecuteInWorkAreaPara executeInWorkAreaPara, LogPara logPara) { var logicAreaCode = string.Empty; if (executeInWorkAreaPara.InWorkAreaEntity.data != null) { if (executeInWorkAreaPara.InWorkAreaEntity.data.Count() > 0) { //根据物料查找逻辑分区 if (!string.IsNullOrEmpty(executeInWorkAreaPara.InWorkAreaEntity.data[0].itemCode)) { List lstLogicEntityByItem = DALCreator.Create().GetPartitionItem(executeInWorkAreaPara.InWorkAreaEntity.data[0].itemCode, 2); logicAreaCode = lstLogicEntityByItem.FirstOrDefault() != null ? lstLogicEntityByItem.First().CN_S_AREA_CODE : ""; } } } var aEntity = new InAssignEntity() { objectType = InAssignEntity.ObjectType.托盘, objectCode = executeInWorkAreaPara.InWorkAreaEntity.trayCode, itemCode = (executeInWorkAreaPara.InWorkAreaEntity.data != null && executeInWorkAreaPara.InWorkAreaEntity.data.Count > 0) ? executeInWorkAreaPara.InWorkAreaEntity.data[0].itemCode : "", 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); if (!executeInWorkAreaPara.BasisResponse.Success) { if (!string.IsNullOrEmpty(executeInWorkAreaPara.InWorkAreaEntity.taskType)) { if (executeInWorkAreaPara.InWorkAreaEntity.taskType.Equals("原料入库")) { Log.Detail(logPara, "绑定托盘到虚拟库区!"); var trayInfo = BLLCreator.Create().GetByTrayCode(executeInWorkAreaPara.InWorkAreaEntity.trayCode); trayInfo.CN_S_USE_STATE = trayInfo.CN_S_USE_STATE.Trim(); 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 = "", CN_S_STOCK_AREA = "XN01", //虚拟存储区 CN_S_STOCK_CODE = executeInWorkAreaPara.StartStockAreaEntity.CN_S_STOCK_CODE, CN_S_TRAY_CODE = executeInWorkAreaPara.InWorkAreaEntity.trayCode, CN_T_CREATE = DateTime.Now }; if (trayInfo.CN_S_USE_STATE.Equals("不满")) { Log.Detail(logPara, "绑定托盘到货位:HXN-BM-01"); trayLocation.CN_S_LOCATION_CODE = "HXN-BM-01"; } else if (trayInfo.CN_S_USE_STATE.Equals("满")) { Log.Detail(logPara, "绑定托盘到货位:HXN-MM-01"); trayLocation.CN_S_LOCATION_CODE = "HXN-MM-01"; } //添加托盘货位 CreateDAL>().Add(trayLocation, null); //添加仓库库存 var addStockQty = new List(); //托盘物料主表 var trayItemMsts = CreateDAL>().GetList(new { trayLocation.CN_S_TRAY_CODE }); if (trayItemMsts.Count > 0) { foreach (var trayItemMst in trayItemMsts) { var trayItemDtls = CreateDAL>().GetList(new { CN_PARENT_GUID = trayItemMst.CN_GUID }); foreach(var trayItemDtl in trayItemDtls){ addStockQty.Add(new TN_WM_B_STOCK_QTYEntity() { CN_S_ITEM_CODE = trayItemMst.CN_S_ITEM_CODE, CN_S_ITEM_NAME = trayItemMst.CN_S_ITEM_NAME, CN_S_ITEM_STATE = trayItemMst.CN_S_ITEM_STATE, CN_S_OWNER = trayItemMst.CN_S_OWNER, CN_S_PRODUCTION_BATCH = trayItemMst.CN_S_PRODUCTION_BATCH, CN_S_LOT_NO = trayItemDtl.CN_S_LOT_NO, CN_F_QUANTITY = trayItemMst.CN_F_QUANTITY, CN_S_STOCK_CODE = trayLocation.CN_S_STOCK_CODE, CN_S_STOCK_AREA = trayLocation.CN_S_STOCK_AREA, CN_F_PLANNED_QTY = trayItemMst.CN_F_INQTY, CN_S_MODEL = trayItemMst.CN_S_MODEL, CN_S_FIGURE_NO = trayItemDtl.CN_S_EXT1, CN_S_MEASURE_UNIT = trayItemMst.CN_S_MEASURE_UNIT }); } } } CreateDAL().AddStockQty(addStockQty, null); InWorkAreaProcedureItemPound(executeInWorkAreaPara, logPara); } } } } return executeInWorkAreaPara; } public override ExecuteInWorkAreaPara InWorkAreaProcedure(ExecuteInWorkAreaPara executeInWorkAreaPara, LogPara logPara) { var result = UseTransaction(trans => { InWorkAreaProcedureFunc(executeInWorkAreaPara, trans, logPara); if (executeInWorkAreaPara.InWorkAreaEntity.needCreateAMSTask == "Y") { OperateResult re = new OtherSysApi().SendAmsCreateTask(executeInWorkAreaPara.TransportEntity); if (!re.Success) { throw new Exception("SendAmsCreateTask异常:" + re.Msg); } } }); if (result.Success) { InWorkAreaProcedureItemPound(executeInWorkAreaPara, logPara); 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, itemCode = executeInWorkAreaPara.InWorkAreaEntity.itemCode }); } else { executeInWorkAreaPara.BasisResponse = BasisResponse.Error("ExecuteInWorkArea 方法异常:" + result.Msg); } return executeInWorkAreaPara; } /// /// 原料入库 处理小磅单 /// public void InWorkAreaProcedureItemPound(ExecuteInWorkAreaPara executeInWorkAreaPara, LogPara logPara) { //创建小榜单 if (executeInWorkAreaPara.InWorkAreaEntity.trayWeight > 0) { Log.Detail(logPara, "原料入库 处理小磅单"); //检查是否是并笼 if (executeInWorkAreaPara.IsCombineCage) { var combineCages = BLLCreator.Create().GetList(executeInWorkAreaPara.InWorkAreaEntity.trayCode, "新建"); //是否更新小磅单主笼、从笼的重量和数量 foreach (var combineCage in combineCages) { if (combineCage.CN_S_MAIN_TRAY_CODE.Equals(combineCage.CN_S_TRAY_CODE)) { //主笼 更新重量和数量 BLLCreator.Create().UpdateWeightAndQty(combineCage.CN_S_POUND_NO, combineCage.CN_S_TRAY_CODE, executeInWorkAreaPara.InWorkAreaEntity.trayWeight, combineCage.CN_F_QTY, null, logPara); } else { //从笼 BLLCreator.Create().UpdateWeightAndQty(combineCage.CN_S_POUND_NO, combineCage.CN_S_TRAY_CODE, 0, 0, null, logPara); } } } else { //不是并笼,则创建小磅单 //获取AUTOBOM小磅单号 var postData = "{\"appCode\":\"" + Constants.appCode + "\",\"ruleName\":\"" + Constants.Rule_ItemPound + "\",\"orgId\":\"0\",\"orgFlag\":\"\"}"; var itemPoundNo = WebApiManager.HttpAutoBom_Post("api/BillRule/GenBillNo", postData); BLLCreator.Create().Add(executeInWorkAreaPara.InWorkAreaEntity.trayCode, executeInWorkAreaPara.InWorkAreaEntity.trayWeight, executeInWorkAreaPara.TransportEntity.CN_S_TASK_NO, null); } } } #endregion #region 出库 public override 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, errCode = "102", errMsg = "参数不正确" }; if (outWorkAreaList.Count() == 0) return new ExternalResponse { success = false, errCode = "102", errMsg = "参数不正确" }; if (string.IsNullOrEmpty(outWorkAreaList[0].sysName)) { outWorkAreaList[0].sysName = "AMS"; } var result = OutWorkArea(outWorkAreaList[0], logPara); if (result.BasisResponse.Success) { response.success = true; response.okList.Add(result.TaskExecuteState.okTask); response.errCode = "100"; //发送到AMS //SendToAms(response, logPara); } else { if (result.BasisResponse.Message.Contains("算法返回结果")) { response.errCode = "203"; response.errMsg = result.BasisResponse.Message; } response.failList.Add(new TaskExecuteState().Error(0, 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[0].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 override ExecuteOutWorkAreaPara OutWorkAreaVerifyPara(ref ExecuteOutWorkAreaPara executeOutWorkAreaPara, LogPara logPara) { base.OutWorkAreaVerifyPara(ref executeOutWorkAreaPara, logPara); if (!executeOutWorkAreaPara.BasisResponse.Success) return executeOutWorkAreaPara; var produceLineMapStr = JsonHelper.GetValue("produceLineMapping"); List produceLineMaps = JsonConvert.DeserializeObject>(produceLineMapStr); foreach (var produceLineMap in produceLineMaps) { if (produceLineMap.locationCode.Equals(executeOutWorkAreaPara.OutWorkAreaEntity.endBit)) { executeOutWorkAreaPara.OutWorkAreaEntity.produceLine = produceLineMap.produceLine; if (!string.IsNullOrEmpty(executeOutWorkAreaPara.OutWorkAreaEntity.produceLine)) { var materialStockOuts = BLLCreator.Create().GetMaterialStockOut(executeOutWorkAreaPara.OutWorkAreaEntity.produceLine); if (materialStockOuts.Count() <= 0) { executeOutWorkAreaPara.BasisResponse = BasisResponse.Error("未找到产线" + executeOutWorkAreaPara.OutWorkAreaEntity.produceLine + "且状态为开工的料单!"); return executeOutWorkAreaPara; } executeOutWorkAreaPara.OutWorkAreaEntity.Data = new List(); executeOutWorkAreaPara.OutWorkAreaEntity.Data.Add(new OutWorkDataEntity { ItemCode = materialStockOuts.First().CN_S_ITEM_CODE }); executeOutWorkAreaPara.OutWorkAreaEntity.itemCode = materialStockOuts.First().CN_S_ITEM_CODE; } } } //var endBits = new Dictionary { { "HCX01", "1" }, { "HCX02", "2" }, { "HCX03", "3" }, { "HCX04", "4" } }; //if (endBits.ContainsKey(executeOutWorkAreaPara.OutWorkAreaEntity.endBit)) //{ //} //当前不穿传生产线 //if (executeOutWorkAreaPara.OutWorkAreaEntity.produceLine != null) //{ } return executeOutWorkAreaPara; } public override ExecuteOutWorkAreaPara OutWorkAreaCreateTask(ref ExecuteOutWorkAreaPara executeOutWorkAreaPara, LogPara logPara) { if (!executeOutWorkAreaPara.BasisResponse.Success) return executeOutWorkAreaPara; //生成原料出库明细 if (!string.IsNullOrEmpty(executeOutWorkAreaPara.OutWorkAreaEntity.produceLine)) { var task = executeOutWorkAreaPara.TransportList.FirstOrDefault(); var result = BLLCreator.Create().Add(task.CN_S_CIR_OBJ_CODE, executeOutWorkAreaPara.OutWorkAreaEntity.produceLine, task.CN_S_TASK_NO, task.CN_S_STOCK_CODE, logPara, -1); if (!result.Success) { executeOutWorkAreaPara.BasisResponse = BasisResponse.Error(result.Msg); return executeOutWorkAreaPara; } } executeOutWorkAreaPara = base.OutWorkAreaCreateTask(ref executeOutWorkAreaPara, logPara); return executeOutWorkAreaPara; } #endregion #region 完工回报 public override OperateResult CompleteTask(ExecuteStateParaDto executeStatePara, LogPara logPara) { var isControlStockQty = executeStatePara.trayItemMsts.Count > 0; Log.Detail(logPara, "isControlStockQty: " + isControlStockQty); #region 组合量表参数 //获取上架量=总量-分配量 //var trayInventory = CreateDAL().GetTrayInventoryQty(executeStatePara.transportTask.CN_S_TRAY_CODE); var addAreaQty = new List(); var addStockQty = new List(); if (isControlStockQty) { foreach (var trayItemMst in executeStatePara.trayItemMsts) { foreach (var trayItemDtl in trayItemMst.TrayItemDtlList) { addAreaQty.Add(new TN_WM_B_AREA_QTYEntity() { CN_S_ITEM_CODE = trayItemMst.CN_S_ITEM_CODE, CN_S_ITEM_NAME = trayItemMst.CN_S_ITEM_NAME, CN_S_ITEM_STATE = trayItemMst.CN_S_ITEM_STATE, CN_S_OWNER = trayItemMst.CN_S_OWNER, CN_S_PRODUCTION_BATCH = trayItemMst.CN_S_PRODUCTION_BATCH, CN_S_LOT_NO = trayItemDtl.CN_S_LOT_NO, CN_F_QUANTITY = trayItemMst.CN_F_QUANTITY, CN_S_STOCK_CODE = executeStatePara.transportTask.CN_S_STOCK_CODE, CN_F_PLANNED_QTY = 0, CN_S_MODEL = trayItemMst.CN_S_MODEL, CN_S_MEASURE_UNIT = trayItemMst.CN_S_MEASURE_UNIT, CN_S_FIGURE_NO = trayItemDtl.CN_S_EXT1 }); addStockQty.Add(new TN_WM_B_STOCK_QTYEntity() { CN_S_ITEM_CODE = trayItemMst.CN_S_ITEM_CODE, CN_S_ITEM_NAME = trayItemMst.CN_S_ITEM_NAME, CN_S_ITEM_STATE = trayItemMst.CN_S_ITEM_STATE, CN_S_OWNER = trayItemMst.CN_S_OWNER, CN_S_PRODUCTION_BATCH = trayItemMst.CN_S_PRODUCTION_BATCH, CN_S_LOT_NO = trayItemDtl.CN_S_LOT_NO, CN_F_QUANTITY = trayItemMst.CN_F_QUANTITY, CN_S_STOCK_CODE = executeStatePara.transportTask.CN_S_STOCK_CODE, CN_S_STOCK_AREA = executeStatePara.transportTask.CN_S_END_AREA, CN_F_PLANNED_QTY = 0, CN_S_MODEL = trayItemMst.CN_S_MODEL, CN_S_FIGURE_NO = trayItemDtl.CN_S_EXT1, CN_S_MEASURE_UNIT = trayItemMst.CN_S_MEASURE_UNIT }); } } Log.Detail(logPara, LogDescribe.Content(addAreaQty)); Log.Detail(logPara, LogDescribe.Content(addStockQty)); } #endregion var transResult = 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("转运")) { CreateDAL>().Delete(new { executeStatePara.transportTask.CN_S_TRAY_CODE, CN_S_STOCK_AREA = "XN01" }); var trayLocation = new TN_WM_B_TRAY_LOCATIONEntity() { CN_GUID = Guid.NewGuid().ToString(), CN_N_INDEX = 1, CN_S_CREATOR = "", CN_S_CREATOR_BY = "", CN_S_LOCATION_CODE = executeStatePara.transportTask.CN_S_END_BIT, CN_S_STOCK_AREA = executeStatePara.transportTask.CN_S_END_AREA, CN_S_STOCK_CODE = executeStatePara.transportTask.CN_S_STOCK_CODE, CN_S_TRAY_CODE = executeStatePara.transportTask.CN_S_TRAY_CODE, CN_T_CREATE = DateTime.Now }; if (executeStatePara.startTrayLocation != null) { //解绑托盘与货位的关系 CreateDAL>().Delete(new { executeStatePara.transportTask.CN_S_TRAY_CODE, CN_S_LOCATION_CODE = executeStatePara.transportTask.CN_S_START_BIT }, trans); Log.Detail(logPara, "解绑任务的托盘和起点货位关联!"); #region 下架记录 if (executeStatePara.transportTask.CN_S_TASK_TYPE.Equals("转运")) { CompleteTaskDownHistory(executeStatePara, logPara, trans); } if (executeStatePara.transportTask.CN_S_START_CONTROL_INV.Equals("Y") && executeStatePara.transportTask.CN_S_START_AREA != executeStatePara.transportTask.CN_S_END_AREA) //降低起点库存 { CreateDAL().ReduceAreaQty(addAreaQty, executeStatePara.transportTask.CN_S_START_AREA, logPara, trans); } #endregion } if (executeStatePara.endTrayLocation == null) { //添加托盘货位 CreateDAL>().Add(trayLocation, trans); Log.Detail(logPara, "添加托盘货位关联,内容:" + LogDescribe.Content(trayLocation)); if (isControlStockQty) { #region 添加上架记录,升库存 CompleteTaskUpHistory(executeStatePara, logPara, trans); if (string.IsNullOrEmpty(executeStatePara.transportTask.CN_S_END_CONTROL_INV)) { trans.Rollback(); return; } if (executeStatePara.transportTask.CN_S_END_CONTROL_INV.Equals("Y") && executeStatePara.transportTask.CN_S_START_AREA != executeStatePara.transportTask.CN_S_END_AREA) //如果起点和终点在一个库区,不增加 { //按未入库量增加结束库区量 CreateDAL().AddAreaQty(addAreaQty, executeStatePara.transportTask.CN_S_END_AREA, logPara, trans); if (!executeStatePara.transportTask.CN_S_TASK_TYPE.Equals("转运")) { //升仓库库存 CreateDAL().AddStockQty(addStockQty, trans); Log.Detail(logPara, "增加仓库库存!"); } } #endregion } //终点 if (executeStatePara.endIsCurrentTask != null && executeStatePara.transportTask.CN_C_END_IS_CONTROL_QTY.Equals("Y")) { CreateDAL().UpdateState(executeStatePara.transportTask.CN_S_END_BIT, "正常", "满", "预入库锁定", trans); Log.Detail(logPara, "更新预入库锁定的货位状态为正常、满,货位号:" + executeStatePara.transportTask.CN_S_END_BIT); //货位状态变化 BLLCreator.Create().AddStateChange(executeStatePara.transportTask.CN_S_END_BIT, "预入库锁定", "正常", "状态回报入库完成-终点", "", "", "", executeStatePara.endStockArea.CN_S_STOCK_CODE, executeStatePara.endStockArea.CN_S_AREA_CODE, trans); } //起点 if (executeStatePara.transportTask.CN_C_START_IS_CONTROL_QTY.Equals("Y") && executeStatePara.transportTask.CN_S_TASK_TYPE.Equals("转运")) { CreateDAL().UpdateState(executeStatePara.transportTask.CN_S_START_BIT, "正常", "空", "预出库锁定", trans); Log.Detail(logPara, "更新预出库锁定的货位状态为正常、空,起点货位号:" + executeStatePara.transportTask.CN_S_START_BIT); //货位状态变化 BLLCreator.Create().AddStateChange(executeStatePara.transportTask.CN_S_START_BIT, "预出库锁定", "正常", "状态回报转运完成-起点", "", "", "", executeStatePara.startStockArea.CN_S_STOCK_CODE, executeStatePara.startStockArea.CN_S_AREA_CODE, trans); } } } #endregion #region 改道 if (executeStatePara.transportTask.CN_S_TASK_TYPE.Equals("改道")) { CreateDAL>().Delete(new { executeStatePara.transportTask.CN_S_TRAY_CODE, CN_S_STOCK_AREA = "XN01" }); //清除托盘和物料 CreateDAL>().Delete(new { CN_S_TRAY_CODE = executeStatePara.transportTask.CN_S_TRAY_CODE }); var trayLocation = new TN_WM_B_TRAY_LOCATIONEntity() { CN_GUID = Guid.NewGuid().ToString(), CN_N_INDEX = 1, CN_S_CREATOR = "", CN_S_CREATOR_BY = "", CN_S_LOCATION_CODE = executeStatePara.transportTask.CN_S_END_BIT, CN_S_STOCK_AREA = executeStatePara.transportTask.CN_S_END_AREA, CN_S_STOCK_CODE = executeStatePara.transportTask.CN_S_STOCK_CODE, CN_S_TRAY_CODE = executeStatePara.transportTask.CN_S_TRAY_CODE, CN_T_CREATE = DateTime.Now }; if (executeStatePara.startTrayLocation != null) { //解绑托盘与货位的关系 CreateDAL>().Delete(new { executeStatePara.transportTask.CN_S_TRAY_CODE, CN_S_LOCATION_CODE = executeStatePara.transportTask.CN_S_START_BIT }, trans); Log.Detail(logPara, "解绑任务的托盘和起点货位关联!"); #region 下架记录 if (executeStatePara.transportTask.CN_S_TASK_TYPE.Equals("改道")) { CompleteTaskDownHistory(executeStatePara, logPara, trans); } //if (executeStatePara.transportTask.CN_S_START_CONTROL_INV.Equals("Y") && executeStatePara.transportTask.CN_S_START_AREA != executeStatePara.transportTask.CN_S_END_AREA) //降低起点库存 //{ // CreateDAL().ReduceAreaQty(addAreaQty, executeStatePara.transportTask.CN_S_START_AREA, logPara, trans); //} #endregion } if (executeStatePara.endTrayLocation == null) { //if (executeStatePara.endStockArea.CN_C_IS_CONTROL_QTY.Equals("Y")) //{ //} //添加托盘货位绑定 改道不绑定托盘货位 //CreateDAL>().Add(trayLocation, trans); //Log.Detail(logPara, "添加托盘货位关联,内容:" + LogDescribe.Content(trayLocation)); if (isControlStockQty) { #region 添加上架记录,升库存 CompleteTaskUpHistory(executeStatePara, logPara, trans); //if (string.IsNullOrEmpty(executeStatePara.transportTask.CN_S_END_CONTROL_INV)) //{ // trans.Rollback(); // return; //} //if (executeStatePara.transportTask.CN_S_END_CONTROL_INV.Equals("Y") && executeStatePara.transportTask.CN_S_START_AREA != executeStatePara.transportTask.CN_S_END_AREA) //如果起点和终点在一个库区,不增加 //{ // //按未入库量增加结束库区量 // CreateDAL().AddAreaQty(addAreaQty, executeStatePara.transportTask.CN_S_END_AREA, logPara, trans); // if (!executeStatePara.transportTask.CN_S_TASK_TYPE.Equals("转运")) // { // //升仓库库存 // CreateDAL().AddStockQty(addStockQty, trans); // Log.Detail(logPara, "增加仓库库存!"); // } //} #endregion } //终点 if (executeStatePara.endIsCurrentTask != null && executeStatePara.transportTask.CN_C_END_IS_CONTROL_QTY.Equals("Y")) { CreateDAL().UpdateState(executeStatePara.transportTask.CN_S_END_BIT, "正常", "满", "预入库锁定", trans); Log.Detail(logPara, "更新预入库锁定的货位状态为正常、满,货位号:" + executeStatePara.transportTask.CN_S_END_BIT); //货位状态变化 BLLCreator.Create().AddStateChange(executeStatePara.transportTask.CN_S_END_BIT, "预入库锁定", "正常", "状态回报入库完成-终点", "", "", "", executeStatePara.endStockArea.CN_S_STOCK_CODE, executeStatePara.endStockArea.CN_S_AREA_CODE, trans); } //起点 if (executeStatePara.transportTask.CN_C_START_IS_CONTROL_QTY.Equals("Y") && executeStatePara.transportTask.CN_S_TASK_TYPE.Equals("转运")) { CreateDAL().UpdateState(executeStatePara.transportTask.CN_S_START_BIT, "正常", "空", "预出库锁定", trans); Log.Detail(logPara, "更新预出库锁定的货位状态为正常、空,起点货位号:" + executeStatePara.transportTask.CN_S_START_BIT); //货位状态变化 BLLCreator.Create().AddStateChange(executeStatePara.transportTask.CN_S_START_BIT, "预出库锁定", "正常", "状态回报转运完成-起点", "", "", "", executeStatePara.startStockArea.CN_S_STOCK_CODE, executeStatePara.startStockArea.CN_S_AREA_CODE, trans); } } //改道后,添加领料单 var produceLine = ""; var produceLineMapStr = JsonHelper.GetValue("produceLineMapping"); List produceLineMaps = JsonConvert.DeserializeObject>(produceLineMapStr); foreach (var produceLineMap in produceLineMaps) { if (produceLineMap.locationCode.Equals(executeStatePara.transportTask.CN_S_END_BIT)) { produceLine = produceLineMap.produceLine; } } if (!string.IsNullOrEmpty(produceLine)) { var result = BLLCreator.Create().Add(executeStatePara.transportTask.CN_S_TRAY_CODE, produceLine, executeStatePara.transportTask.CN_S_TASK_NO, executeStatePara.transportTask.CN_S_STOCK_CODE, logPara); } } #endregion #region 出库 if (executeStatePara.transportTask.CN_S_TASK_TYPE.Equals("出库")) { if (executeStatePara.startTrayLocation != null) { BLLCreator.Create().Delete(executeStatePara.transportTask.CN_S_TRAY_CODE, executeStatePara.transportTask.CN_S_START_BIT, trans, logPara); BLLCreator.Create().Delete(" CN_S_TRAY_CODE='" + executeStatePara.transportTask.CN_S_TRAY_CODE + "' ", trans, logPara); if (isControlStockQty) { #region 添加下架记录,降库存 CompleteTaskDownHistory(executeStatePara, logPara, trans); if (executeStatePara.transportTask.CN_S_START_CONTROL_INV.Equals("Y")) { BLLCreator.Create().ReduceQtyAndAlloc(addAreaQty, executeStatePara.transportTask.CN_S_START_AREA, trans, logPara); if (!executeStatePara.transportTask.CN_S_TASK_TYPE.Equals("转运")) BLLCreator.Create().ReduceQtyAndAlloc(addStockQty, trans, logPara); } #endregion } if (executeStatePara.startIsCurrentTask != null && executeStatePara.transportTask.CN_C_START_IS_CONTROL_QTY.Equals("Y")) { BLLCreator.Create().UpdateState(executeStatePara.transportTask.CN_S_START_BIT, "正常", "空", "预出库锁定", trans, logPara); BLLCreator.Create().AddStateChange(executeStatePara.transportTask.CN_S_START_BIT, "预出库锁定", "正常", "状态回报出库完成", "", "", "", executeStatePara.endStockArea.CN_S_STOCK_CODE, executeStatePara.endStockArea.CN_S_AREA_CODE, trans); } } } #endregion #region 上架 if (executeStatePara.transportTask.CN_S_TASK_TYPE.Equals("上架")) { var trayLocation = new TN_WM_B_TRAY_LOCATIONEntity() { CN_GUID = Guid.NewGuid().ToString(), CN_N_INDEX = 1, CN_S_CREATOR = "", CN_S_CREATOR_BY = "", CN_S_LOCATION_CODE = executeStatePara.transportTask.CN_S_END_BIT, CN_S_STOCK_AREA = executeStatePara.transportTask.CN_S_END_AREA, CN_S_STOCK_CODE = executeStatePara.transportTask.CN_S_STOCK_CODE, CN_S_TRAY_CODE = executeStatePara.transportTask.CN_S_TRAY_CODE, CN_T_CREATE = DateTime.Now }; if (executeStatePara.endTrayLocation == null) { //添加托盘货位 var addResult = BLLCreator.Create().Add(trayLocation, trans, logPara); Log.Detail(logPara, "添加托盘货位结果:" + JsonConvert.SerializeObject(addResult)); //CreateDAL>().Add(trayLocation, trans); if (isControlStockQty) { //获取配置是否启用收货区 var strategyValue = BLLCreator.Create().GetStrategy(executeStatePara.transportTask.CN_S_STOCK_CODE, StrategyKey.AreaQtyReceiveGood); #region 添加上架记录,升库存 CompleteTaskUpHistory(executeStatePara, logPara, trans); if (string.IsNullOrEmpty(executeStatePara.transportTask.CN_S_END_CONTROL_INV)) { trans.Rollback(); return; } //启用收货区 if (strategyValue.Equals(Constants.Y)) { Log.Detail(logPara, "启用收货区!"); //降低起始库区(收货区)库存 CreateDAL().ReduceAreaQty(addAreaQty, executeStatePara.transportTask.CN_S_START_AREA, logPara, trans); if (executeStatePara.transportTask.CN_S_END_CONTROL_INV.Equals("Y")) { //增加结束库区量 CreateDAL().AddAreaQty(addAreaQty, executeStatePara.transportTask.CN_S_END_AREA, logPara, trans); } } else { if (executeStatePara.transportTask.CN_S_END_CONTROL_INV.Equals("Y")) { //按未入库量增加结束库区量 CreateDAL().AddAreaQty(addAreaQty, executeStatePara.transportTask.CN_S_END_AREA, logPara, trans); if (!executeStatePara.transportTask.CN_S_TASK_TYPE.Equals("转运")) { //升仓库库存 CreateDAL().AddStockQty(addStockQty, trans); Log.Detail(logPara, "增加仓库量表完成!"); } } } #endregion } if (executeStatePara.endIsCurrentTask != null && executeStatePara.transportTask.CN_C_END_IS_CONTROL_QTY.Equals("Y")) { CreateDAL().UpdateState(executeStatePara.transportTask.CN_S_END_BIT, "正常", "满", "预入库锁定", trans); Log.Detail(logPara, "更新预入库锁定的货位状态为正常、满,终点货位号:" + executeStatePara.transportTask.CN_S_END_BIT); ////更新终点货位的任务号 //CreateDAL>().Update(new { CN_S_TASK_NO = "" }, new { CN_S_LOCATION_CODE = executeStatePara.transportTask.CN_S_END_BIT }, trans); //Log.Detail(logPara, "更新终点货位" + executeStatePara.transportTask.CN_S_END_BIT + "的绑定任务号为空!"); //货位状态变化 BLLCreator.Create().AddStateChange(executeStatePara.transportTask.CN_S_END_BIT, "预入库锁定", "正常", "状态回报上架完成-终点", "", "", "", executeStatePara.endStockArea.CN_S_STOCK_CODE, executeStatePara.endStockArea.CN_S_AREA_CODE, trans); } if (executeStatePara.transportTask.CN_C_START_IS_CONTROL_QTY.Equals("Y")) { //解绑托盘与货位的关系 CreateDAL>().Delete(new { executeStatePara.transportTask.CN_S_TRAY_CODE, CN_S_LOCATION_CODE = executeStatePara.transportTask.CN_S_START_BIT }, trans); Log.Detail(logPara, "解绑任务的托盘和起点货位" + executeStatePara.transportTask.CN_S_START_BIT + "关联!"); CreateDAL().UpdateState(executeStatePara.transportTask.CN_S_START_BIT, "正常", "空", "预出库锁定", trans); Log.Detail(logPara, "更新预出库锁定的货位状态为正常、空,起点货位号:" + executeStatePara.transportTask.CN_S_START_BIT); ////更新起点货位的任务号 //CreateDAL>().Update(new { CN_S_TASK_NO = "" }, new { CN_S_LOCATION_CODE = executeStatePara.transportTask.CN_S_START_BIT }); //Log.Detail(logPara, "更新起点货位" + executeStatePara.transportTask.CN_S_START_BIT + "的绑定任务号为空!"); //货位状态变化 BLLCreator.Create().AddStateChange(executeStatePara.transportTask.CN_S_START_BIT, "预出库锁定", "正常", "状态回报上架完成-起点", "", "", "", executeStatePara.startStockArea.CN_S_STOCK_CODE, executeStatePara.startStockArea.CN_S_AREA_CODE, trans); } } } #endregion #region 下架/叫料 if (executeStatePara.transportTask.CN_S_TASK_TYPE.Equals("下架") || executeStatePara.transportTask.CN_S_TASK_TYPE.Equals("叫料")) { if (executeStatePara.startTrayLocation != null) { BLLCreator.Create().Delete(executeStatePara.transportTask.CN_S_TRAY_CODE, executeStatePara.transportTask.CN_S_START_BIT, trans, logPara); if (executeStatePara.endStockArea.CN_C_IS_CONTROL_QTY.Equals("N")) { BLLCreator.Create().Delete(" CN_S_TRAY_CODE='" + executeStatePara.transportTask.CN_S_TRAY_CODE + "' ", trans, logPara); } if (isControlStockQty) { #region 添加下架记录,降库存 CompleteTaskDownHistory(executeStatePara, logPara, trans); //获取配置是否启用收货区 var strategyValue = BLLCreator.Create().GetStrategy(executeStatePara.transportTask.CN_S_STOCK_CODE, StrategyKey.AreaQtyDeliverGood); if (strategyValue.Equals(Constants.Y)) { if (executeStatePara.transportTask.CN_S_START_CONTROL_INV.Equals("Y")) { CreateDAL().ReduceAreaQty(addAreaQty, executeStatePara.transportTask.CN_S_START_AREA, logPara, trans); } //增加终点库区(收货区)库存 CreateDAL().AddAreaQty(addAreaQty, executeStatePara.transportTask.CN_S_END_AREA, logPara, trans); } else { if (executeStatePara.transportTask.CN_S_START_CONTROL_INV.Equals("Y")) { BLLCreator.Create().ReduceQtyAndAlloc(addAreaQty, executeStatePara.transportTask.CN_S_START_AREA, trans, logPara); if (!executeStatePara.transportTask.CN_S_TASK_TYPE.Equals("转运")) BLLCreator.Create().ReduceQtyAndAlloc(addStockQty, trans, logPara); } } #endregion } if (executeStatePara.startIsCurrentTask != null && executeStatePara.transportTask.CN_C_START_IS_CONTROL_QTY.Equals("Y")) { BLLCreator.Create().UpdateState(executeStatePara.transportTask.CN_S_START_BIT, "正常", "空", "预出库锁定", trans, logPara); BLLCreator.Create().AddStateChange(executeStatePara.transportTask.CN_S_START_BIT, "预出库锁定", "正常", "状态回报下架完成-起点", "", "", "", executeStatePara.startStockArea.CN_S_STOCK_CODE, executeStatePara.startStockArea.CN_S_AREA_CODE, trans); } if (executeStatePara.transportTask.CN_C_END_IS_CONTROL_QTY.Equals("Y")) { var trayLocation = new TN_WM_B_TRAY_LOCATIONEntity() { CN_GUID = Guid.NewGuid().ToString(), CN_N_INDEX = 1, CN_S_CREATOR = "", CN_S_CREATOR_BY = "", CN_S_LOCATION_CODE = executeStatePara.transportTask.CN_S_END_BIT, CN_S_STOCK_AREA = executeStatePara.transportTask.CN_S_END_AREA, CN_S_STOCK_CODE = executeStatePara.transportTask.CN_S_STOCK_CODE, CN_S_TRAY_CODE = executeStatePara.transportTask.CN_S_TRAY_CODE, CN_T_CREATE = DateTime.Now }; //添加托盘货位 CreateDAL>().Add(trayLocation, trans); CreateDAL().UpdateState(executeStatePara.transportTask.CN_S_END_BIT, "正常", "满", "预入库锁定", trans); Log.Detail(logPara, "更新预入库锁定的货位状态为正常、满,结束货位号:" + executeStatePara.transportTask.CN_S_END_BIT); ////更新终点货位的任务号 //CreateDAL>().Update(new { CN_S_TASK_NO = "" }, new { CN_S_LOCATION_CODE = executeStatePara.transportTask.CN_S_END_BIT }); //Log.Detail(logPara, "更新终点货位" + executeStatePara.transportTask.CN_S_END_BIT + "的绑定任务号为空!"); //货位状态变化 BLLCreator.Create().AddStateChange(executeStatePara.transportTask.CN_S_END_BIT, "预入库锁定", "正常", "状态回报下架完成-终点", "", "", "", executeStatePara.endStockArea.CN_S_STOCK_CODE, executeStatePara.endStockArea.CN_S_AREA_CODE, trans); } } } #endregion #region 空托入(上架) if (executeStatePara.transportTask.CN_S_TASK_TYPE.Equals("空托入")) { Log.Detail(logPara, "开始执行空托入!"); var trayLocation = new TN_WM_B_TRAY_LOCATIONEntity() { CN_GUID = Guid.NewGuid().ToString(), CN_N_INDEX = 1, CN_S_CREATOR = "", CN_S_CREATOR_BY = "", CN_S_LOCATION_CODE = executeStatePara.transportTask.CN_S_END_BIT, CN_S_STOCK_AREA = executeStatePara.transportTask.CN_S_END_AREA, CN_S_STOCK_CODE = executeStatePara.transportTask.CN_S_STOCK_CODE, CN_S_TRAY_CODE = executeStatePara.transportTask.CN_S_TRAY_CODE, CN_T_CREATE = DateTime.Now }; Log.Detail(logPara, "endTrayLocation: " + JsonConvert.SerializeObject(executeStatePara.endTrayLocation)); if (executeStatePara.endTrayLocation == null) { //添加托盘货位 CreateDAL>().Add(trayLocation, trans); if (isControlStockQty) { //获取配置是否启用收货区 var strategyValue = BLLCreator.Create().GetStrategy(executeStatePara.transportTask.CN_S_STOCK_CODE, StrategyKey.AreaQtyReceiveGood); #region 添加上架记录,升库存 CompleteTaskUpHistory(executeStatePara, logPara, trans); if (string.IsNullOrEmpty(executeStatePara.transportTask.CN_S_END_CONTROL_INV)) { trans.Rollback(); return; } //启用收货区 if (strategyValue.Equals(Constants.Y)) { Log.Detail(logPara, "启用收货区!"); //降低起始库区(收货区)库存 CreateDAL().ReduceAreaQty(addAreaQty, executeStatePara.transportTask.CN_S_START_AREA, logPara, trans); if (executeStatePara.transportTask.CN_S_END_CONTROL_INV.Equals("Y")) { //增加结束库区量 CreateDAL().AddAreaQty(addAreaQty, executeStatePara.transportTask.CN_S_END_AREA, logPara, trans); } } else { if (executeStatePara.transportTask.CN_S_END_CONTROL_INV.Equals("Y")) { //按未入库量增加结束库区量 CreateDAL().AddAreaQty(addAreaQty, executeStatePara.transportTask.CN_S_END_AREA, logPara, trans); if (!executeStatePara.transportTask.CN_S_TASK_TYPE.Equals("转运")) { //升仓库库存 CreateDAL().AddStockQty(addStockQty, trans); Log.Detail(logPara, "增加仓库量表完成!"); } } } #endregion } if (executeStatePara.endIsCurrentTask != null && executeStatePara.transportTask.CN_C_END_IS_CONTROL_QTY.Equals("Y")) { CreateDAL().UpdateState(executeStatePara.transportTask.CN_S_END_BIT, "正常", "满", "预入库锁定", trans); Log.Detail(logPara, "更新预入库锁定的货位状态为正常、满,终点货位号:" + executeStatePara.transportTask.CN_S_END_BIT); ////更新终点货位的任务号 //CreateDAL>().Update(new { CN_S_TASK_NO = "" }, new { CN_S_LOCATION_CODE = executeStatePara.transportTask.CN_S_END_BIT }); //Log.Detail(logPara, "更新终点货位" + executeStatePara.transportTask.CN_S_END_BIT + "的绑定任务号为空!"); //货位状态变化 BLLCreator.Create().AddStateChange(executeStatePara.transportTask.CN_S_END_BIT, "预入库锁定", "正常", "状态回报上架完成-终点", "", "", "", executeStatePara.endStockArea.CN_S_STOCK_CODE, executeStatePara.endStockArea.CN_S_AREA_CODE, trans); } if (executeStatePara.transportTask.CN_C_START_IS_CONTROL_QTY.Equals("Y")) { //解绑托盘与货位的关系 CreateDAL>().Delete(new { executeStatePara.transportTask.CN_S_TRAY_CODE, CN_S_LOCATION_CODE = executeStatePara.transportTask.CN_S_START_BIT }, trans); Log.Detail(logPara, "解绑任务的托盘和起点货位关联!"); CreateDAL().UpdateState(executeStatePara.transportTask.CN_S_START_BIT, "正常", "空", "预出库锁定", trans); Log.Detail(logPara, "更新预出库锁定的货位状态为正常、空,起点货位号:" + executeStatePara.transportTask.CN_S_START_BIT); ////更新起点货位的任务号 //CreateDAL>().Update(new { CN_S_TASK_NO = "" }, new { CN_S_LOCATION_CODE = executeStatePara.transportTask.CN_S_START_BIT }); //Log.Detail(logPara, "更新起点货位" + executeStatePara.transportTask.CN_S_START_BIT + "的绑定任务号为空!"); //货位状态变化 BLLCreator.Create().AddStateChange(executeStatePara.transportTask.CN_S_START_BIT, "预出库锁定", "正常", "状态回报上架完成-起点", "", "", "", executeStatePara.startStockArea.CN_S_STOCK_CODE, executeStatePara.startStockArea.CN_S_AREA_CODE, trans); } } } #endregion #region 空托出(下架) if (executeStatePara.transportTask.CN_S_TASK_TYPE.Equals("空托出")) { Log.Detail(logPara, "开始执行空托出!"); Log.Detail(logPara, "startTrayLocation: " + JsonConvert.SerializeObject(executeStatePara.startTrayLocation)); if (executeStatePara.startTrayLocation != null) { //解绑托盘与货位的关系 CreateDAL>().Delete(new { executeStatePara.transportTask.CN_S_TRAY_CODE, CN_S_LOCATION_CODE = executeStatePara.transportTask.CN_S_START_BIT }, trans); Log.Detail(logPara, "解绑任务的托盘和起点货位关联!"); ////删除托盘产品关联 //CreateDAL().Delete(" CN_S_TRAY_CODE='" + executeStatePara.transportTask.CN_S_TRAY_CODE + "' "); //Log.Detail(logPara, "删除当前任务的托盘物料关联!"); if (isControlStockQty) { #region 添加下架记录,降库存 CompleteTaskDownHistory(executeStatePara, logPara, trans); //获取配置是否启用收货区 var strategyValue = BLLCreator.Create().GetStrategy(executeStatePara.transportTask.CN_S_STOCK_CODE, StrategyKey.AreaQtyDeliverGood); if (strategyValue.Equals(Constants.Y)) { if (executeStatePara.transportTask.CN_S_START_CONTROL_INV.Equals("Y")) { CreateDAL().ReduceAreaQty(addAreaQty, executeStatePara.transportTask.CN_S_START_AREA, logPara, trans); } //增加终点库区(收货区)库存 CreateDAL().AddAreaQty(addAreaQty, executeStatePara.transportTask.CN_S_END_AREA, logPara, trans); } else { if (executeStatePara.transportTask.CN_S_START_CONTROL_INV.Equals("Y")) { CreateDAL().ReduceAreaQty(addAreaQty, executeStatePara.transportTask.CN_S_START_AREA, logPara, trans); if (!executeStatePara.transportTask.CN_S_TASK_TYPE.Equals("转运")) { //降低仓库库存 CreateDAL().ReduceStockQty(addStockQty, trans); Log.Detail(logPara, "降低仓库量表完成!"); } } } #endregion } if (executeStatePara.startIsCurrentTask != null && executeStatePara.transportTask.CN_C_START_IS_CONTROL_QTY.Equals("Y")) { CreateDAL().UpdateState(executeStatePara.transportTask.CN_S_START_BIT, "正常", "空", "预出库锁定", trans); Log.Detail(logPara, "更新预出库锁定的货位状态为正常、空,起始货位号:" + executeStatePara.transportTask.CN_S_START_BIT); ////更新起点货位的任务号 //CreateDAL>().Update(new { CN_S_TASK_NO = "" }, new { CN_S_LOCATION_CODE = executeStatePara.transportTask.CN_S_START_BIT }); //Log.Detail(logPara, "更新起点货位" + executeStatePara.transportTask.CN_S_START_BIT + "的绑定任务号为空!"); //货位状态变化 BLLCreator.Create().AddStateChange(executeStatePara.transportTask.CN_S_START_BIT, "预出库锁定", "正常", "状态回报下架完成-起点", "", "", "", executeStatePara.startStockArea.CN_S_STOCK_CODE, executeStatePara.startStockArea.CN_S_AREA_CODE, trans); } if (executeStatePara.transportTask.CN_C_END_IS_CONTROL_QTY.Equals("Y")) { var trayLocation = new TN_WM_B_TRAY_LOCATIONEntity() { CN_GUID = Guid.NewGuid().ToString(), CN_N_INDEX = 1, CN_S_CREATOR = "", CN_S_CREATOR_BY = "", CN_S_LOCATION_CODE = executeStatePara.transportTask.CN_S_END_BIT, CN_S_STOCK_AREA = executeStatePara.transportTask.CN_S_END_AREA, CN_S_STOCK_CODE = executeStatePara.transportTask.CN_S_STOCK_CODE, CN_S_TRAY_CODE = executeStatePara.transportTask.CN_S_TRAY_CODE, CN_T_CREATE = DateTime.Now }; ////添加托盘货位 //CreateDAL>().Add(trayLocation, trans); CreateDAL().UpdateState(executeStatePara.transportTask.CN_S_END_BIT, "正常", "空", "预入库锁定", trans); Log.Detail(logPara, "更新预入库锁定的货位状态为正常、满,结束货位号:" + executeStatePara.transportTask.CN_S_END_BIT); ////更新终点货位的任务号 //CreateDAL>().Update(new { CN_S_TASK_NO = "" }, new { CN_S_LOCATION_CODE = executeStatePara.transportTask.CN_S_END_BIT }); //Log.Detail(logPara, "更新终点货位" + executeStatePara.transportTask.CN_S_END_BIT + "的绑定任务号为空!"); //货位状态变化 BLLCreator.Create().AddStateChange(executeStatePara.transportTask.CN_S_END_BIT, "预入库锁定", "正常", "状态回报下架完成-终点", "", "", "", executeStatePara.endStockArea.CN_S_STOCK_CODE, executeStatePara.endStockArea.CN_S_AREA_CODE, trans); } } } #endregion #region 移库 if (executeStatePara.transportTask.CN_S_TASK_TYPE.Equals("移库")) { var trayLocation = new TN_WM_B_TRAY_LOCATIONEntity() { CN_GUID = Guid.NewGuid().ToString(), CN_N_INDEX = 1, CN_S_CREATOR = "", CN_S_CREATOR_BY = "", CN_S_LOCATION_CODE = executeStatePara.transportTask.CN_S_END_BIT, CN_S_STOCK_AREA = executeStatePara.transportTask.CN_S_END_AREA, CN_S_STOCK_CODE = executeStatePara.transportTask.CN_S_STOCK_CODE, CN_S_TRAY_CODE = executeStatePara.transportTask.CN_S_TRAY_CODE, CN_T_CREATE = DateTime.Now }; if (executeStatePara.startTrayLocation != null) { //解绑托盘与货位的关系 CreateDAL>().Delete(new { executeStatePara.transportTask.CN_S_TRAY_CODE, CN_S_LOCATION_CODE = executeStatePara.transportTask.CN_S_START_BIT }, trans); Log.Detail(logPara, "解绑任务的托盘和起点货位关联!"); } if (executeStatePara.endTrayLocation == null) { //添加托盘货位 CreateDAL>().Add(trayLocation, trans); Log.Detail(logPara, "添加托盘货位关联,内容:" + LogDescribe.Content(trayLocation)); if (isControlStockQty) { #region 下架记录 CompleteTaskDownHistory(executeStatePara, logPara, trans); #endregion #region 上架记录 CompleteTaskUpHistory(executeStatePara, logPara, trans); if (string.IsNullOrEmpty(executeStatePara.transportTask.CN_S_END_CONTROL_INV)) { Log.Detail(logPara, "终点库区" + executeStatePara.transportTask.CN_S_END_AREA + "不管控库存!executeStatePara.transportTask.CN_S_END_CONTROL_INV:" + executeStatePara.transportTask.CN_S_END_CONTROL_INV); trans.Rollback(); return; } #endregion #region 库存 if (executeStatePara.transportTask.CN_S_START_CONTROL_INV.Equals("Y")) //降低起点库存 { CreateDAL().ReduceAreaQtyAndAllocQty(addAreaQty, executeStatePara.transportTask.CN_S_START_AREA, logPara, trans); } if (executeStatePara.transportTask.CN_S_END_CONTROL_INV.Equals("Y")) //增加终点库存 { //按未入库量增加结束库区量 CreateDAL().AddAreaQty(addAreaQty, executeStatePara.transportTask.CN_S_END_AREA, logPara, trans); } #endregion } //终点 if (executeStatePara.endIsCurrentTask != null && executeStatePara.transportTask.CN_C_END_IS_CONTROL_QTY.Equals("Y")) { CreateDAL().UpdateState(executeStatePara.transportTask.CN_S_END_BIT, "正常", "满", "预入库锁定", trans); Log.Detail(logPara, "更新预入库锁定的货位状态为正常、满,货位号:" + executeStatePara.transportTask.CN_S_END_BIT); //货位状态变化 BLLCreator.Create().AddStateChange(executeStatePara.transportTask.CN_S_END_BIT, "预入库锁定", "正常", "状态回报入库完成-终点", "", "", "", executeStatePara.endStockArea.CN_S_STOCK_CODE, executeStatePara.endStockArea.CN_S_AREA_CODE, trans); } //起点 if (executeStatePara.transportTask.CN_C_START_IS_CONTROL_QTY.Equals("Y")) { CreateDAL().UpdateState(executeStatePara.transportTask.CN_S_START_BIT, "正常", "空", "预出库锁定", trans); Log.Detail(logPara, "更新预出库锁定的货位状态为正常、空,起点货位号:" + executeStatePara.transportTask.CN_S_START_BIT); //货位状态变化 BLLCreator.Create().AddStateChange(executeStatePara.transportTask.CN_S_START_BIT, "预出库锁定", "正常", "状态回报转运完成-起点", "", "", "", executeStatePara.startStockArea.CN_S_STOCK_CODE, executeStatePara.startStockArea.CN_S_AREA_CODE, trans); } } } #endregion }); if (!transResult.Success) return transResult; return UpdateErpState(executeStatePara, logPara); } public override OperateResult CancelTask(ExecuteStateParaDto executeStatePara, LogPara logPara) { if (!executeStatePara.transportTask.CN_S_STATE.Equals("未执行") && !executeStatePara.transportTask.CN_S_STATE.Equals("执行中")) { return OperateResult.Error("只能取消未执行和执行中的任务!"); } var result = UseTransaction(trans => { //更新任务状态 CreateDAL>().Update(new { CN_S_MODIFY = "", CN_S_MODIFY_BY = "", CN_T_END = DateTime.Now, CN_T_MODIFY = DateTime.Now, CN_S_STATE = executeStatePara.taskState }, new { executeStatePara.transportTask.CN_S_TASK_NO }, trans); Log.Detail(logPara, "更新任务状态为:" + executeStatePara.taskState); //终点 if (executeStatePara.transportTask.CN_S_TASK_TYPE.Equals("入库") || executeStatePara.transportTask.CN_S_TASK_TYPE.Equals("转运") || executeStatePara.transportTask.CN_S_TASK_TYPE.Equals("移库") || executeStatePara.transportTask.CN_S_TASK_TYPE.Equals("上架") || executeStatePara.transportTask.CN_S_TASK_TYPE.Equals("下架") || executeStatePara.transportTask.CN_S_TASK_TYPE.Equals("叫料") || executeStatePara.transportTask.CN_S_TASK_TYPE.Equals("空托入") || executeStatePara.transportTask.CN_S_TASK_TYPE.Equals("空托出")) { if (executeStatePara.endIsCurrentTask != null && executeStatePara.transportTask.CN_C_END_IS_CONTROL_QTY.Equals("Y")) { CreateDAL().UpdateLocationStateByCodeAndState(executeStatePara.transportTask.CN_S_END_BIT, "正常", "预入库锁定", null); //更新终点货位的任务号 CreateDAL>().Update(new { CN_S_TASK_NO = "" }, new { CN_S_LOCATION_CODE = executeStatePara.transportTask.CN_S_END_BIT }); Log.Detail(logPara, "更新终点货位" + executeStatePara.transportTask.CN_S_END_BIT + "的绑定任务号为空!"); //货位状态变化 BLLCreator.Create().AddStateChange(executeStatePara.transportTask.CN_S_END_BIT, "预入库锁定", "正常", "状态回报入库取消", "", "", "", executeStatePara.endStockArea.CN_S_STOCK_CODE, executeStatePara.endStockArea.CN_S_AREA_CODE, null); } } //起点 if (executeStatePara.transportTask.CN_S_TASK_TYPE.Equals("入库") || executeStatePara.transportTask.CN_S_TASK_TYPE.Equals("出库") || executeStatePara.transportTask.CN_S_TASK_TYPE.Equals("转运") || executeStatePara.transportTask.CN_S_TASK_TYPE.Equals("移库") || executeStatePara.transportTask.CN_S_TASK_TYPE.Equals("上架") || executeStatePara.transportTask.CN_S_TASK_TYPE.Equals("下架") || executeStatePara.transportTask.CN_S_TASK_TYPE.Equals("叫料") || executeStatePara.transportTask.CN_S_TASK_TYPE.Equals("空托入") || executeStatePara.transportTask.CN_S_TASK_TYPE.Equals("空托出")) { if (executeStatePara.startIsCurrentTask != null && executeStatePara.transportTask.CN_C_START_IS_CONTROL_QTY.Equals("Y")) { CreateDAL().UpdateLocationStateByCodeAndState(executeStatePara.transportTask.CN_S_START_BIT, "正常", "预出库锁定", null); //更新起点货位的任务号 CreateDAL>().Update(new { CN_S_TASK_NO = "" }, new { CN_S_LOCATION_CODE = executeStatePara.transportTask.CN_S_END_BIT }); Log.Detail(logPara, "更新起点货位" + executeStatePara.transportTask.CN_S_START_BIT + "的绑定任务号为空!"); //货位状态变化 BLLCreator.Create().AddStateChange(executeStatePara.transportTask.CN_S_START_BIT, "预出库锁定", "正常", "状态回报" + executeStatePara.transportTask.CN_S_TASK_TYPE + "取消", "", "", "", executeStatePara.startStockArea.CN_S_STOCK_CODE, executeStatePara.startStockArea.CN_S_AREA_CODE, null); if (executeStatePara.transportTask.CN_S_TASK_TYPE.Equals("移库")) { //降库区分配量 CreateDAL().ReduceAllocQty(executeStatePara.transportTask.CN_S_START_AREA, executeStatePara.transportTask.CN_S_TRAY_CODE, null, logPara); } if (executeStatePara.transportTask.CN_S_TASK_TYPE.Equals("叫料")) { //降仓库分配量 CreateDAL().ReduceAreaAndStockAllocQty(executeStatePara.transportTask.CN_S_START_AREA, executeStatePara.transportTask.CN_S_TRAY_CODE, null, logPara); } } } if (executeStatePara.transportTask.CN_S_TASK_TYPE.Equals("移库")) { Log.Detail(logPara, "降移库任务" + executeStatePara.transportTask.CN_S_TASK_NO + "的移动量"); //降移库任务的移动量 var moveStockTaskDtl = CreateDAL().GetDtlByTaskNo(executeStatePara.transportTask.CN_S_TASK_NO); if (moveStockTaskDtl != null) { CreateDAL().ReduceAllocQty(moveStockTaskDtl.CN_PARENT_GUID, trans); //ReduceMoveQty(moveStockTaskDtl.CN_PARENT_GUID, moveStockTaskDtl.CN_F_QUANTITY.ToString(), trans); //删除移库子表任务记录 CreateDAL().DeleteDtl(" CN_S_TASK_NO='" + executeStatePara.transportTask.CN_S_TASK_NO + "' ", trans); } else { Log.Detail(logPara, "未找到移库任务" + executeStatePara.transportTask.CN_S_TASK_NO + "子表的数据"); } } }); if (result.Success) { DeleteErpState(executeStatePara, logPara); } return result; } private OperateResult UpdateErpState(ExecuteStateParaDto executeStatePara, LogPara logPara) { var result = OperateResult.Succeed(); if (executeStatePara.transportTask.CN_S_TASK_TYPE.Equals("入库")) { var itemPound = BLLCreator.Create().Get(executeStatePara.transportTask.CN_S_TASK_NO); if (itemPound != null) { result = BLLCreator.Create().Update(executeStatePara.transportTask.CN_S_TASK_NO, 0, logPara); } } if (executeStatePara.transportTask.CN_S_TASK_TYPE.Equals("出库")) { var stockOutDtl = BLLCreator.Create().Get(executeStatePara.transportTask.CN_S_TASK_NO); if (stockOutDtl != null) { result = BLLCreator.Create().Update(executeStatePara.transportTask.CN_S_TASK_NO, 0, logPara); } } return result; } private OperateResult DeleteErpState(ExecuteStateParaDto executeStatePara, LogPara logPara) { var result = OperateResult.Succeed(); if (executeStatePara.transportTask.CN_S_TASK_TYPE.Equals("入库")) { var itemPound = BLLCreator.Create().Get(executeStatePara.transportTask.CN_S_TASK_NO); if (itemPound != null) { result = BLLCreator.Create().Delete(executeStatePara.transportTask.CN_S_TASK_NO, logPara); } } if (executeStatePara.transportTask.CN_S_TASK_TYPE.Equals("出库")) { var stockOutDtl = BLLCreator.Create().Get(executeStatePara.transportTask.CN_S_TASK_NO); if (stockOutDtl != null) { result = BLLCreator.Create().Delete(executeStatePara.transportTask.CN_S_TASK_NO, logPara); } } return result; } #endregion #region 称重 public CommResponse InCarPound(string carNo, string areaCode, string weight, string itemType, string supplierCode, LogPara logPara) { var curWeight = Convert.ToDecimal(weight); if (curWeight <= 0) return CommResponse.Error("重量不能为空!", ErrorEnum.VerifyError); //验证车牌号是否存在 微信端已经登记 //var carInfo = BLLCreator.Create().GetCarInfo(carNo); //if (carInfo == null) return CommResponse.Error("未找到当前车牌信息,是否中间库中未同步车辆信息!", ErrorEnum.VerifyError); //库区是否存在 var areaModel = DALCreator.Create().GetModel(areaCode); if (areaModel == null) return CommResponse.Error("未找到当前库区!"); //更新当前车的磅单号为完成 BLLCreator.Create().UpdateState(areaCode, "已完成", logPara); //生产磅单号 var postData = "{\"appCode\":\"" + Constants.appCode + "\",\"ruleName\":\"" + Constants.Rule_CarPound + "\",\"orgId\":\"0\",\"orgFlag\":\"\"}"; var carPoundNo = WebApiManager.HttpAutoBom_Post("api/BillRule/GenBillNo", postData); if (string.IsNullOrEmpty(carPoundNo)) return CommResponse.Error("获取AutoBom磅单号异常,检查是否配置“大磅单号”的编码规则!"); var carPound = new TN_ER_CAR_POUNDEntity { CN_GUID = Guid.NewGuid().ToString(), CN_S_CAR_NO = carNo, CN_S_UNLOCAD_AREA_CODE = areaCode, CN_F_WEIGHT = curWeight, CN_S_ITEM_TYPE = itemType, CN_S_POUND_NO = carPoundNo, CN_T_ARRIVE = DateTime.Now, CN_T_CREATE = DateTime.Now, CN_S_VENDOR_NO = supplierCode, CN_S_STOCK_CODE = "NTCK", CN_S_STATE = "执行中", CN_T_OUT = DateTime.Now, CN_N_SYNC = 2//0 2状态为初始化磅单,离厂后状态更新为0才允许更新到中间库 }; //保存 var result = BLLCreator.Create().Add(carPound); if (!result.Success) return CommResponse.Error(result.Msg); return CommResponse.Normal(); } public CommResponse OutCarPound(string carNo, string weight, LogPara logPara) { //验证车牌号是否存在 var carInfo = BLLCreator.Create().GetCarInfo(carNo); if (carInfo == null) return CommResponse.Error("未找到当前车牌信息,是否中间库中未同步车辆信息!", ErrorEnum.VerifyError); var carPound = BLLCreator.Create().GetByCarNo(carNo, " ORDER BY CN_T_CREATE DESC "); if (carPound == null) return CommResponse.Error("未找到当前车号的磅单!", ErrorEnum.VerifyError); carPound.CN_F_CAR_WEIGHT = Convert.ToDecimal(weight); if (carPound.CN_F_CAR_WEIGHT <= 0) return CommResponse.Error("重量必须大于0!", ErrorEnum.VerifyError); carPound.CN_F_GROSS_WEIGHT = carPound.CN_F_WEIGHT - carPound.CN_F_CAR_WEIGHT; carPound.CN_T_OUT = DateTime.Now; carPound.CN_N_SYNC = 0; var result = BLLCreator.Create().Update(carPound, new { carPound.CN_GUID }, logPara); if (!result.Success) return CommResponse.Error(result.Msg); return CommResponse.Normal(); } #endregion } }