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.External; using HH.WMS.Common.Response; using HH.WMS.DAL; using HH.WMS.DAL.Algorithm; using HH.WMS.DAL.Basic; using HH.WMS.DAL.SysMgr; using HH.WMS.DAL.Tzlj; using HH.WMS.Entitys; using HH.WMS.Entitys.Basic; using HH.WMS.Entitys.Entitys; using HH.WMS.Entitys.External; using HH.WMS.Entitys.Tzlj; 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 WmsApiForHsBLL : WmsApiBaseBLL { #region InWorkArea 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)) { var postData = "{\"appCode\":\"" + Constants.appCode + "\",\"ruleName\":\"" + Constants.VirtualTray + "\",\"orgId\":\"0\",\"orgFlag\":\"\"}"; executeInWorkAreaPara.InWorkAreaEntity.trayCode = WebApiManager.HttpAutoBom_Post("api/BillRule/GenBillNo", postData); if (string.IsNullOrEmpty(executeInWorkAreaPara.InWorkAreaEntity.trayCode)) { executeInWorkAreaPara.BasisResponse = BasisResponse.Error("生成虚拟托盘号异常,请检查是否维护生成规则!"); return executeInWorkAreaPara; } } //判断起点是否为单拖下线料口,如果是就要判断是否需要叠托(隆基特有业务) string singleBit = string.Empty; try { singleBit = System.Configuration.ConfigurationManager.AppSettings["singleBit"].ToString(); } catch (Exception ep) { executeInWorkAreaPara.BasisResponse = BasisResponse.Error("异常:获取webconfig中singleBit配置异常!" + ep.Message); return executeInWorkAreaPara; } if (string.IsNullOrEmpty(singleBit)) { executeInWorkAreaPara.BasisResponse = BasisResponse.Error("请在webconfig中配置输送线单托下线位置!"); return executeInWorkAreaPara; } List lstSingleBit = new List(singleBit.Split(new[] { "," }, StringSplitOptions.RemoveEmptyEntries)); if (lstSingleBit.Contains(executeInWorkAreaPara.InWorkAreaEntity.startBit)) { if (executeInWorkAreaPara.InWorkAreaEntity.data == null) { executeInWorkAreaPara.BasisResponse = BasisResponse.Error("单拖下线点请传物料信息!"); return executeInWorkAreaPara; } //判断是否满足叠托规则,满足则直接搬运至某个点,不满足搬运至高架库 List trayLocation = new List(); var workAreaProList = BLLCreator.Create().GetInWorkPosition(executeInWorkAreaPara); if (workAreaProList.Any()) { executeInWorkAreaPara.WorkAreaProEntitys = workAreaProList; } string areaCode = string.Empty; if (executeInWorkAreaPara.WorkAreaProEntitys.Count > 0) { areaCode = executeInWorkAreaPara.WorkAreaProEntitys[0].CN_S_END_AREA_CODE; } else { executeInWorkAreaPara.BasisResponse = BasisResponse.Error("请配置单拖下线点到高架库的作业流程!"); return executeInWorkAreaPara; } if (executeInWorkAreaPara.InWorkAreaEntity.data[0].POType == "A" || executeInWorkAreaPara.InWorkAreaEntity.data[0].POType == "D") { //分布式订单需要增加判断色系是否一致 var item = executeInWorkAreaPara.InWorkAreaEntity.data[0]; trayLocation = CreateDAL().GetNeedDoubleTray(areaCode, item.CustomerName, item.Power, item.CurrentLevel, item.Level, item.Color, item.POType,item.moduleType); } else { var item = executeInWorkAreaPara.InWorkAreaEntity.data[0]; trayLocation = CreateDAL().GetNeedDoubleTray(areaCode, item.CustomerName, item.Power, item.CurrentLevel, item.Level, "", item.POType, item.moduleType); } Log.Detail(logPara, "判断是否满足叠托规则-trayLocation!" + JsonConvert.SerializeObject(trayLocation)); if (trayLocation.Count > 0) { //下达从高架库到双托上料口的任务 List outWorkAreaDouble = new List(); var doubleOut = new OutWorkAreaEntity { IsTransport = "N", startBit = trayLocation[0].CN_S_LOCATION_CODE, endBit = executeInWorkAreaPara.InWorkAreaEntity.endBit, projectCode = "tzlj", trayCode = trayLocation[0].CN_S_TRAY_CODE, needCreateAMSTask = "Y" }; outWorkAreaDouble.Add(doubleOut); var logPara1 = LogType.LogPara("高架库双托出库"); var result = BLLCreator.Create().OutWorkArea(outWorkAreaDouble, logPara1); if (!result.success) { executeInWorkAreaPara.BasisResponse = BasisResponse.Error("从高架库位置:" + trayLocation[0].CN_S_LOCATION_CODE + "下达双托出库任务失败,具体原因为:" + result.errMsg); return executeInWorkAreaPara; } StringBuilder sbRemark = new StringBuilder(); var item = executeInWorkAreaPara.InWorkAreaEntity.data[0]; //查询托盘产品关联信息子表 sbRemark.Append(item.CustomerName); sbRemark.Append(","); sbRemark.Append(item.Power); sbRemark.Append(","); sbRemark.Append(item.CurrentLevel); sbRemark.Append(","); sbRemark.Append(item.Level); sbRemark.Append(","); sbRemark.Append(item.POType); sbRemark.Append(","); sbRemark.Append(item.Color); sbRemark.Append(","); sbRemark.Append(item.itemModel); executeInWorkAreaPara.InWorkAreaEntity.remark = sbRemark.ToString(); //将data设置为null 防止托盘物料关联表产生垃圾数据 executeInWorkAreaPara.InWorkAreaEntity.data = null; } else { //标记需要绑定托盘 executeInWorkAreaPara.InWorkAreaEntity.remark = "Y"; executeInWorkAreaPara.InWorkAreaEntity.endBit = ""; } } 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.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 override ExecuteInWorkAreaPara InWorkAreaCalculatePath(ref ExecuteInWorkAreaPara executeInWorkAreaPara, LogPara logPara) { //获取作业区列表 var workAreaProList = BLLCreator.Create().GetInWorkPosition(executeInWorkAreaPara); if (workAreaProList.Any()) { if (executeInWorkAreaPara.InWorkAreaEntity.startBit.IndexOf("A1") >= 0 || executeInWorkAreaPara.InWorkAreaEntity.startBit.IndexOf("A3") >= 0) { executeInWorkAreaPara.WorkAreaProEntitys = workAreaProList.Where(o => o.CN_S_TYPE_CODE == "A1A3").OrderBy(a => a.CN_N_PRIORITY).ToList(); } else if (executeInWorkAreaPara.InWorkAreaEntity.startBit.IndexOf("A2") >= 0 || executeInWorkAreaPara.InWorkAreaEntity.startBit.IndexOf("A4") >= 0) { executeInWorkAreaPara.WorkAreaProEntitys = workAreaProList.Where(o => o.CN_S_TYPE_CODE == "A2A4").OrderBy(a => a.CN_N_PRIORITY).ToList(); } else { executeInWorkAreaPara.WorkAreaProEntitys = workAreaProList.OrderBy(a => a.CN_N_PRIORITY).ToList(); } } else { executeInWorkAreaPara.BasisResponse = BasisResponse.Error("未找到该起点库区到终点库区的作业流转流程!"); return executeInWorkAreaPara; } 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().SendAmsCreateTaskLJ(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 override void InWorkAreaProcedureFunc(ExecuteInWorkAreaPara executeInWorkAreaPara, IDbTransaction trans, LogPara logPara) { Log.Detail(logPara, "入库执行存储过程!"); #region 废弃代码 //if (executeInWorkAreaPara.mesStackTrayItemDto != null) //{ // //删除托盘产品关联 // CreateDAL().DeleteTrayItem(" CN_S_TRAY_CODE='" + executeInWorkAreaPara.InWorkAreaEntity.trayCode + "' ", trans); // 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 = executeInWorkAreaPara.mesStackTrayItemDto.CN_S_ITEM_CODE, // CN_S_ITEM_NAME = executeInWorkAreaPara.mesStackTrayItemDto.CN_S_ITEM_NAME, // CN_S_ITEM_STATE = executeInWorkAreaPara.mesStackTrayItemDto.CN_S_ITEM_STATE, // CN_F_QUANTITY = 1, // CN_S_MEASURE_UNIT = executeInWorkAreaPara.mesStackTrayItemDto.CN_S_MEASURE_UNIT, // CN_F_ALLOC_QTY = 0, // CN_S_MODEL = executeInWorkAreaPara.mesStackTrayItemDto.CN_S_MODEL, // CN_S_FIGURE_NO = executeInWorkAreaPara.mesStackTrayItemDto.CN_S_FIGURE_NO, // CN_S_TRAY_GRID = executeInWorkAreaPara.mesStackTrayItemDto.CN_S_TRAY_GRID, // CN_S_OWNER = executeInWorkAreaPara.mesStackTrayItemDto.CN_S_OWNER, // }, 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 = executeInWorkAreaPara.mesStackTrayItemDto.CN_S_LOT_NO, // CN_S_UNIQUE_CODE = executeInWorkAreaPara.mesStackTrayItemDto.CN_S_UNIQUE_CODE, // CN_S_PACKING_UNIT = "", // CN_F_PACKING_QTY = 1, // CN_F_QUANTITY = 1, // CN_T_PRODUCTION = DateTime.Now, // CN_S_CREATOR = "hh", // CN_S_CREATOR_BY = "", // CN_T_CREATE = DateTime.Now, // CN_GUID = Guid.NewGuid().ToString(), // sqlwhere = " WHERE CN_PARENT_GUID='" + trayItemMstGuid + "' ", // CN_S_SERIAL_NO = executeInWorkAreaPara.mesStackTrayItemDto.CN_S_SERIAL_NO, // CN_S_PRODUCTION_BATCH = executeInWorkAreaPara.mesStackTrayItemDto.CN_S_PRODUCTION_BATCH, // CN_S_EXT1 = executeInWorkAreaPara.mesStackTrayItemDto.CN_S_EXT1, // CN_S_EXT2 = executeInWorkAreaPara.mesStackTrayItemDto.CN_S_EXT2, // CN_S_EXT3 = executeInWorkAreaPara.mesStackTrayItemDto.CN_S_EXT3 // } // }, trans); // transResult = new OperateResult { Success = curResult.Success, Msg = curResult.Success ? "" : curResult.Exception.Message }; // if (!transResult.Success) // { // trans.Rollback(); // return; // } //} #endregion 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(); //添加托盘物料关联主表 Log.Detail(logPara, "executeInWorkAreaPara.InWorkAreaEntity.data:" + JsonConvert.SerializeObject(item)); //string measuerUnit = item.l + "," + item.width + "," + item.height + "," + item.packInQty; if (item.itemModel == null) { item.itemModel = ""; } 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.CustomerName, //色系 CN_S_ITEM_NAME = item.Color, //订单类型 CN_S_ITEM_STATE = item.POType, //电流档 CN_S_OWNER = item.CurrentLevel, //组件等级 CN_S_FIGURE_NO = item.Level, CN_F_QUANTITY = item.qty, CN_F_ALLOC_QTY = item.qty, //标称功率 CN_S_MODEL = item.Power, //存放长度、宽度、高度、数量拼接起来的4个字段 CN_S_MEASURE_UNIT = 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); //Log.Detail(logPara, "curResult:" + JsonConvert.SerializeObject(curResult)); 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_EXT2 = transport.CN_S_REMARK, 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 ExecuteState public ExternalResponse OutWorkAreaLj(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 = OutWorkAreaLj(outWorkAreaList[i], logPara); if (result.BasisResponse.Success) { response.success = true; response.okList.Add(result.TaskExecuteState.okTask); } 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 ExecuteOutWorkAreaPara OutWorkAreaLj(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_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 override OperateResult CompleteTask(ExecuteStateParaDto executeStatePara, LogPara logPara) { // var isControlStockQty = executeStatePara.trayItemMsts.Count > 0; var isControlStockQty = false; Log.Detail(logPara, "isControlStockQty: " + isControlStockQty); #region 组合量表参数 //获取上架量=总量-分配量 //var trayInventory = CreateDAL().GetTrayInventoryQty(executeStatePara.transportTask.CN_S_TRAY_CODE); var addAreaQty = new List(); var addStockQty = new List(); if (isControlStockQty) { foreach (var trayItemMst in executeStatePara.trayItemMsts) { foreach (var trayItemDtl in trayItemMst.TrayItemDtlList) { addAreaQty.Add(new TN_WM_B_AREA_QTYEntity() { CN_S_ITEM_CODE = trayItemMst.CN_S_ITEM_CODE, CN_S_ITEM_NAME = trayItemMst.CN_S_ITEM_NAME, CN_S_ITEM_STATE = trayItemMst.CN_S_ITEM_STATE, CN_S_OWNER = trayItemMst.CN_S_OWNER, CN_S_PRODUCTION_BATCH = trayItemMst.CN_S_PRODUCTION_BATCH, CN_S_LOT_NO = trayItemDtl.CN_S_LOT_NO, CN_F_QUANTITY = Convert.ToDecimal(trayItemDtl.CN_S_SERIAL_NO),//.CN_S_WEIGHT,//重量 Convert.ToDecimal(trayItemMst.CN_F_INQTY),//trayItemMst.CN_F_QUANTITY * trayItemMst.CN_S_WEIGHT, CN_S_STOCK_CODE = executeStatePara.transportTask.CN_S_STOCK_CODE, CN_F_PLANNED_QTY = trayItemMst.CN_F_INQTY, CN_S_MODEL = trayItemMst.CN_S_MODEL, CN_S_MEASURE_UNIT = trayItemMst.CN_S_MEASURE_UNIT, CN_S_FIGURE_NO = trayItemDtl.CN_S_EXT1 }); addStockQty.Add(new TN_WM_B_STOCK_QTYEntity() { CN_S_ITEM_CODE = trayItemMst.CN_S_ITEM_CODE, CN_S_ITEM_NAME = trayItemMst.CN_S_ITEM_NAME, CN_S_ITEM_STATE = trayItemMst.CN_S_ITEM_STATE, CN_S_OWNER = trayItemMst.CN_S_OWNER, CN_S_PRODUCTION_BATCH = trayItemMst.CN_S_PRODUCTION_BATCH, CN_S_LOT_NO = trayItemDtl.CN_S_LOT_NO, CN_F_QUANTITY = Convert.ToDecimal(trayItemDtl.CN_S_SERIAL_NO),//CN_S_WEIGHT,//trayItemMst.CN_F_QUANTITY * trayItemMst.CN_S_WEIGHT, CN_S_STOCK_CODE = executeStatePara.transportTask.CN_S_STOCK_CODE, CN_S_STOCK_AREA = executeStatePara.transportTask.CN_S_END_AREA, CN_F_PLANNED_QTY = trayItemMst.CN_F_INQTY, CN_S_MODEL = trayItemMst.CN_S_MODEL, CN_S_FIGURE_NO = trayItemDtl.CN_S_EXT1, CN_S_MEASURE_UNIT = trayItemMst.CN_S_MEASURE_UNIT }); } } Log.Detail(logPara, LogDescribe.Content(addAreaQty)); Log.Detail(logPara, LogDescribe.Content(addStockQty)); } #endregion return UseTransaction(trans => { //更新任务状态 CreateDAL>().Update(new { CN_S_MODIFY = "", CN_S_MODIFY_BY = "", CN_T_END = DateTime.Now, CN_T_MODIFY = DateTime.Now, CN_S_STATE = executeStatePara.taskState }, new { executeStatePara.transportTask.CN_S_TASK_NO }, trans); Log.Detail(logPara, "更新任务状态-任务号:" + executeStatePara.transportTask.CN_S_TASK_NO + "状态为:" + executeStatePara.taskState); #region 入库 + 转运 if (executeStatePara.transportTask.CN_S_TASK_TYPE.Equals("入库") || executeStatePara.transportTask.CN_S_TASK_TYPE.Equals("转运")) { var trayLocation = new TN_WM_B_TRAY_LOCATIONEntity() { CN_GUID = Guid.NewGuid().ToString(), CN_N_INDEX = 1, CN_S_CREATOR = "", CN_S_CREATOR_BY = "", CN_S_LOCATION_CODE = executeStatePara.transportTask.CN_S_END_BIT, CN_S_STOCK_AREA = executeStatePara.transportTask.CN_S_END_AREA, CN_S_STOCK_CODE = executeStatePara.transportTask.CN_S_STOCK_CODE, CN_S_TRAY_CODE = executeStatePara.transportTask.CN_S_TRAY_CODE, CN_T_CREATE = DateTime.Now }; if (executeStatePara.startTrayLocation != null) { //解绑托盘与货位的关系 CreateDAL>().Delete(new { executeStatePara.transportTask.CN_S_TRAY_CODE, CN_S_LOCATION_CODE = executeStatePara.transportTask.CN_S_START_BIT }, trans); Log.Detail(logPara, "解绑任务的托盘和起点货位关联!"); #region 下架记录 CompleteTaskDownHistory(executeStatePara, logPara, trans); #endregion } if (executeStatePara.endTrayLocation == null) { //添加托盘货位 if (executeStatePara.transportTask.CN_S_EXT2 != "N") { CreateDAL>().Add(trayLocation, trans); Log.Detail(logPara, "添加托盘货位关联,内容:" + LogDescribe.Content(trayLocation)); } CompleteTaskUpHistory(executeStatePara, logPara, trans); //终点 if (executeStatePara.endIsCurrentTask != null && executeStatePara.transportTask.CN_C_END_IS_CONTROL_QTY.Equals("Y")) { CreateDAL().UpdateState(executeStatePara.transportTask.CN_S_END_BIT, "正常", "满", "预入库锁定", trans); Log.Detail(logPara, "更新预入库锁定的货位状态为正常、满,货位号:" + executeStatePara.transportTask.CN_S_END_BIT); //货位状态变化 BLLCreator.Create().AddStateChange(executeStatePara.transportTask.CN_S_END_BIT, "预入库锁定", "正常", "状态回报入库完成-终点", "", "", "", executeStatePara.endStockArea.CN_S_STOCK_CODE, executeStatePara.endStockArea.CN_S_AREA_CODE, trans); } //起点 if (executeStatePara.transportTask.CN_C_START_IS_CONTROL_QTY.Equals("Y") && executeStatePara.transportTask.CN_S_TASK_TYPE.Equals("转运")) { // BLLCreator.Create().UpdateState(executeStatePara.transportTask.CN_S_START_BIT, Constants.Location_State_Normal, Constants.Location_State_OutLock, trans); CreateDAL().UpdateState(executeStatePara.transportTask.CN_S_START_BIT, "正常", "空", "预出库锁定", trans); Log.Detail(logPara, "更新预出库锁定的货位状态为正常,起点货位号:" + executeStatePara.transportTask.CN_S_START_BIT); //货位状态变化 BLLCreator.Create().AddStateChange(executeStatePara.transportTask.CN_S_START_BIT, "预出库锁定", "正常", "状态回报转运完成-起点", "", "", "", executeStatePara.startStockArea.CN_S_STOCK_CODE, executeStatePara.startStockArea.CN_S_AREA_CODE, trans); } } } #endregion #region 出库 if (executeStatePara.transportTask.CN_S_TASK_TYPE.Equals("出库")) { if (executeStatePara.startTrayLocation != null) { BLLCreator.Create().Delete(executeStatePara.transportTask.CN_S_TRAY_CODE, executeStatePara.transportTask.CN_S_START_BIT, trans, logPara); BLLCreator.Create().Delete(" CN_S_TRAY_CODE='" + executeStatePara.transportTask.CN_S_TRAY_CODE + "' ", trans, logPara); //if (isControlStockQty) //{ // #region 添加下架记录,降库存 // CompleteTaskDownHistory(executeStatePara, logPara, trans); // if (executeStatePara.transportTask.CN_S_START_CONTROL_INV.Equals("Y")) // { // BLLCreator.Create().ReduceQtyAndAlloc(addAreaQty, executeStatePara.transportTask.CN_S_START_AREA, trans, logPara); // if (!executeStatePara.transportTask.CN_S_TASK_TYPE.Equals("转运")) // BLLCreator.Create().ReduceQtyAndAlloc(addStockQty, trans, logPara); // } // #endregion //} CompleteTaskDownHistory(executeStatePara, logPara, trans); if (executeStatePara.startIsCurrentTask != null && executeStatePara.transportTask.CN_C_START_IS_CONTROL_QTY.Equals("Y")) { BLLCreator.Create().UpdateState(executeStatePara.transportTask.CN_S_START_BIT, "正常", "空", "预出库锁定", trans, logPara); BLLCreator.Create().AddStateChange(executeStatePara.transportTask.CN_S_START_BIT, "预出库锁定", "正常", "状态回报出库完成", "", "", "", executeStatePara.endStockArea.CN_S_STOCK_CODE, executeStatePara.endStockArea.CN_S_AREA_CODE, trans); } } } #endregion #region 上架 if (executeStatePara.transportTask.CN_S_TASK_TYPE.Equals("上架")) { var trayLocation = new TN_WM_B_TRAY_LOCATIONEntity() { CN_GUID = Guid.NewGuid().ToString(), CN_N_INDEX = 1, CN_S_CREATOR = "", CN_S_CREATOR_BY = "", CN_S_LOCATION_CODE = executeStatePara.transportTask.CN_S_END_BIT, CN_S_STOCK_AREA = executeStatePara.transportTask.CN_S_END_AREA, CN_S_STOCK_CODE = executeStatePara.transportTask.CN_S_STOCK_CODE, CN_S_TRAY_CODE = executeStatePara.transportTask.CN_S_TRAY_CODE, CN_T_CREATE = DateTime.Now }; if (executeStatePara.endTrayLocation == null) { //添加托盘货位 var addResult = BLLCreator.Create().Add(trayLocation, trans, logPara); Log.Detail(logPara, "添加托盘货位结果:" + JsonConvert.SerializeObject(addResult)); //CreateDAL>().Add(trayLocation, trans); if (isControlStockQty) { //获取配置是否启用收货区 var strategyValue = BLLCreator.Create().GetStrategy(executeStatePara.transportTask.CN_S_STOCK_CODE, StrategyKey.AreaQtyReceiveGood); #region 添加上架记录,升库存 CompleteTaskUpHistory(executeStatePara, logPara, trans); if (string.IsNullOrEmpty(executeStatePara.transportTask.CN_S_END_CONTROL_INV)) { trans.Rollback(); return; } //启用收货区 if (strategyValue.Equals(Constants.Y)) { Log.Detail(logPara, "启用收货区!"); //降低起始库区(收货区)库存 CreateDAL().ReduceAreaQty(addAreaQty, executeStatePara.transportTask.CN_S_START_AREA, logPara, trans); if (executeStatePara.transportTask.CN_S_END_CONTROL_INV.Equals("Y")) { //增加结束库区量 CreateDAL().AddAreaQty(addAreaQty, executeStatePara.transportTask.CN_S_END_AREA, logPara, trans); } } else { if (executeStatePara.transportTask.CN_S_END_CONTROL_INV.Equals("Y")) { //按未入库量增加结束库区量 CreateDAL().AddAreaQty(addAreaQty, executeStatePara.transportTask.CN_S_END_AREA, logPara, trans); if (!executeStatePara.transportTask.CN_S_TASK_TYPE.Equals("转运")) { //升仓库库存 CreateDAL().AddStockQty(addStockQty, trans); Log.Detail(logPara, "增加仓库量表完成!"); } } } #endregion } if (executeStatePara.endIsCurrentTask != null && executeStatePara.transportTask.CN_C_END_IS_CONTROL_QTY.Equals("Y")) { CreateDAL().UpdateState(executeStatePara.transportTask.CN_S_END_BIT, "正常", "满", "预入库锁定", trans); Log.Detail(logPara, "更新预入库锁定的货位状态为正常、满,终点货位号:" + executeStatePara.transportTask.CN_S_END_BIT); ////更新终点货位的任务号 //CreateDAL>().Update(new { CN_S_TASK_NO = "" }, new { CN_S_LOCATION_CODE = executeStatePara.transportTask.CN_S_END_BIT }, trans); //Log.Detail(logPara, "更新终点货位" + executeStatePara.transportTask.CN_S_END_BIT + "的绑定任务号为空!"); //货位状态变化 BLLCreator.Create().AddStateChange(executeStatePara.transportTask.CN_S_END_BIT, "预入库锁定", "正常", "状态回报上架完成-终点", "", "", "", executeStatePara.endStockArea.CN_S_STOCK_CODE, executeStatePara.endStockArea.CN_S_AREA_CODE, trans); } if (executeStatePara.transportTask.CN_C_START_IS_CONTROL_QTY.Equals("Y")) { //解绑托盘与货位的关系 CreateDAL>().Delete(new { executeStatePara.transportTask.CN_S_TRAY_CODE, CN_S_LOCATION_CODE = executeStatePara.transportTask.CN_S_START_BIT }, trans); Log.Detail(logPara, "解绑任务的托盘和起点货位" + executeStatePara.transportTask.CN_S_START_BIT + "关联!"); CreateDAL().UpdateState(executeStatePara.transportTask.CN_S_START_BIT, "正常", "空", "预出库锁定", trans); Log.Detail(logPara, "更新预出库锁定的货位状态为正常、空,起点货位号:" + executeStatePara.transportTask.CN_S_START_BIT); ////更新起点货位的任务号 //CreateDAL>().Update(new { CN_S_TASK_NO = "" }, new { CN_S_LOCATION_CODE = executeStatePara.transportTask.CN_S_START_BIT }); //Log.Detail(logPara, "更新起点货位" + executeStatePara.transportTask.CN_S_START_BIT + "的绑定任务号为空!"); //货位状态变化 BLLCreator.Create().AddStateChange(executeStatePara.transportTask.CN_S_START_BIT, "预出库锁定", "正常", "状态回报上架完成-起点", "", "", "", executeStatePara.startStockArea.CN_S_STOCK_CODE, executeStatePara.startStockArea.CN_S_AREA_CODE, trans); } } } #endregion #region 下架/叫料 if (executeStatePara.transportTask.CN_S_TASK_TYPE.Equals("下架") || executeStatePara.transportTask.CN_S_TASK_TYPE.Equals("叫料")) { if (executeStatePara.startTrayLocation != null) { BLLCreator.Create().Delete(executeStatePara.transportTask.CN_S_TRAY_CODE, executeStatePara.transportTask.CN_S_START_BIT, trans, logPara); if (executeStatePara.endStockArea.CN_C_IS_CONTROL_QTY.Equals("N")) { BLLCreator.Create().Delete(" CN_S_TRAY_CODE='" + executeStatePara.transportTask.CN_S_TRAY_CODE + "' ", trans, logPara); } if (isControlStockQty) { #region 添加下架记录,降库存 CompleteTaskDownHistory(executeStatePara, logPara, trans); //获取配置是否启用收货区 var strategyValue = BLLCreator.Create().GetStrategy(executeStatePara.transportTask.CN_S_STOCK_CODE, StrategyKey.AreaQtyDeliverGood); if (strategyValue.Equals(Constants.Y)) { if (executeStatePara.transportTask.CN_S_START_CONTROL_INV.Equals("Y")) { CreateDAL().ReduceAreaQty(addAreaQty, executeStatePara.transportTask.CN_S_START_AREA, logPara, trans); } //增加终点库区(收货区)库存 CreateDAL().AddAreaQty(addAreaQty, executeStatePara.transportTask.CN_S_END_AREA, logPara, trans); } else { if (executeStatePara.transportTask.CN_S_START_CONTROL_INV.Equals("Y")) { BLLCreator.Create().ReduceQtyAndAlloc(addAreaQty, executeStatePara.transportTask.CN_S_START_AREA, trans, logPara); if (!executeStatePara.transportTask.CN_S_TASK_TYPE.Equals("转运")) BLLCreator.Create().ReduceQtyAndAlloc(addStockQty, trans, logPara); } } #endregion } if (executeStatePara.startIsCurrentTask != null && executeStatePara.transportTask.CN_C_START_IS_CONTROL_QTY.Equals("Y")) { BLLCreator.Create().UpdateState(executeStatePara.transportTask.CN_S_START_BIT, "正常", "空", "预出库锁定", trans, logPara); BLLCreator.Create().AddStateChange(executeStatePara.transportTask.CN_S_START_BIT, "预出库锁定", "正常", "状态回报下架完成-起点", "", "", "", executeStatePara.startStockArea.CN_S_STOCK_CODE, executeStatePara.startStockArea.CN_S_AREA_CODE, trans); } if (executeStatePara.transportTask.CN_C_END_IS_CONTROL_QTY.Equals("Y")) { var trayLocation = new TN_WM_B_TRAY_LOCATIONEntity() { CN_GUID = Guid.NewGuid().ToString(), CN_N_INDEX = 1, CN_S_CREATOR = "", CN_S_CREATOR_BY = "", CN_S_LOCATION_CODE = executeStatePara.transportTask.CN_S_END_BIT, CN_S_STOCK_AREA = executeStatePara.transportTask.CN_S_END_AREA, CN_S_STOCK_CODE = executeStatePara.transportTask.CN_S_STOCK_CODE, CN_S_TRAY_CODE = executeStatePara.transportTask.CN_S_TRAY_CODE, CN_T_CREATE = DateTime.Now }; //添加托盘货位 CreateDAL>().Add(trayLocation, trans); CreateDAL().UpdateState(executeStatePara.transportTask.CN_S_END_BIT, "正常", "满", "预入库锁定", trans); Log.Detail(logPara, "更新预入库锁定的货位状态为正常、满,结束货位号:" + executeStatePara.transportTask.CN_S_END_BIT); ////更新终点货位的任务号 //CreateDAL>().Update(new { CN_S_TASK_NO = "" }, new { CN_S_LOCATION_CODE = executeStatePara.transportTask.CN_S_END_BIT }); //Log.Detail(logPara, "更新终点货位" + executeStatePara.transportTask.CN_S_END_BIT + "的绑定任务号为空!"); //货位状态变化 BLLCreator.Create().AddStateChange(executeStatePara.transportTask.CN_S_END_BIT, "预入库锁定", "正常", "状态回报下架完成-终点", "", "", "", executeStatePara.endStockArea.CN_S_STOCK_CODE, executeStatePara.endStockArea.CN_S_AREA_CODE, trans); } } } #endregion #region 空托入(上架) if (executeStatePara.transportTask.CN_S_TASK_TYPE.Equals("空托入")) { Log.Detail(logPara, "开始执行空托入!"); var trayLocation = new TN_WM_B_TRAY_LOCATIONEntity() { CN_GUID = Guid.NewGuid().ToString(), CN_N_INDEX = 1, CN_S_CREATOR = "", CN_S_CREATOR_BY = "", CN_S_LOCATION_CODE = executeStatePara.transportTask.CN_S_END_BIT, CN_S_STOCK_AREA = executeStatePara.transportTask.CN_S_END_AREA, CN_S_STOCK_CODE = executeStatePara.transportTask.CN_S_STOCK_CODE, CN_S_TRAY_CODE = executeStatePara.transportTask.CN_S_TRAY_CODE, CN_T_CREATE = DateTime.Now }; Log.Detail(logPara, "endTrayLocation: " + JsonConvert.SerializeObject(executeStatePara.endTrayLocation)); if (executeStatePara.endTrayLocation == null) { //添加托盘货位 CreateDAL>().Add(trayLocation, trans); if (isControlStockQty) { //获取配置是否启用收货区 var strategyValue = BLLCreator.Create().GetStrategy(executeStatePara.transportTask.CN_S_STOCK_CODE, StrategyKey.AreaQtyReceiveGood); #region 添加上架记录,升库存 CompleteTaskUpHistory(executeStatePara, logPara, trans); if (string.IsNullOrEmpty(executeStatePara.transportTask.CN_S_END_CONTROL_INV)) { trans.Rollback(); return; } //启用收货区 if (strategyValue.Equals(Constants.Y)) { Log.Detail(logPara, "启用收货区!"); //降低起始库区(收货区)库存 CreateDAL().ReduceAreaQty(addAreaQty, executeStatePara.transportTask.CN_S_START_AREA, logPara, trans); if (executeStatePara.transportTask.CN_S_END_CONTROL_INV.Equals("Y")) { //增加结束库区量 CreateDAL().AddAreaQty(addAreaQty, executeStatePara.transportTask.CN_S_END_AREA, logPara, trans); } } else { if (executeStatePara.transportTask.CN_S_END_CONTROL_INV.Equals("Y")) { //按未入库量增加结束库区量 CreateDAL().AddAreaQty(addAreaQty, executeStatePara.transportTask.CN_S_END_AREA, logPara, trans); if (!executeStatePara.transportTask.CN_S_TASK_TYPE.Equals("转运")) { //升仓库库存 CreateDAL().AddStockQty(addStockQty, trans); Log.Detail(logPara, "增加仓库量表完成!"); } } } #endregion } if (executeStatePara.endIsCurrentTask != null && executeStatePara.transportTask.CN_C_END_IS_CONTROL_QTY.Equals("Y")) { CreateDAL().UpdateState(executeStatePara.transportTask.CN_S_END_BIT, "正常", "满", "预入库锁定", trans); Log.Detail(logPara, "更新预入库锁定的货位状态为正常、满,终点货位号:" + executeStatePara.transportTask.CN_S_END_BIT); ////更新终点货位的任务号 //CreateDAL>().Update(new { CN_S_TASK_NO = "" }, new { CN_S_LOCATION_CODE = executeStatePara.transportTask.CN_S_END_BIT }); //Log.Detail(logPara, "更新终点货位" + executeStatePara.transportTask.CN_S_END_BIT + "的绑定任务号为空!"); //货位状态变化 BLLCreator.Create().AddStateChange(executeStatePara.transportTask.CN_S_END_BIT, "预入库锁定", "正常", "状态回报上架完成-终点", "", "", "", executeStatePara.endStockArea.CN_S_STOCK_CODE, executeStatePara.endStockArea.CN_S_AREA_CODE, trans); } if (executeStatePara.transportTask.CN_C_START_IS_CONTROL_QTY.Equals("Y")) { //解绑托盘与货位的关系 CreateDAL>().Delete(new { executeStatePara.transportTask.CN_S_TRAY_CODE, CN_S_LOCATION_CODE = executeStatePara.transportTask.CN_S_START_BIT }, trans); Log.Detail(logPara, "解绑任务的托盘和起点货位关联!"); CreateDAL().UpdateState(executeStatePara.transportTask.CN_S_START_BIT, "正常", "空", "预出库锁定", trans); Log.Detail(logPara, "更新预出库锁定的货位状态为正常、空,起点货位号:" + executeStatePara.transportTask.CN_S_START_BIT); ////更新起点货位的任务号 //CreateDAL>().Update(new { CN_S_TASK_NO = "" }, new { CN_S_LOCATION_CODE = executeStatePara.transportTask.CN_S_START_BIT }); //Log.Detail(logPara, "更新起点货位" + executeStatePara.transportTask.CN_S_START_BIT + "的绑定任务号为空!"); //货位状态变化 BLLCreator.Create().AddStateChange(executeStatePara.transportTask.CN_S_START_BIT, "预出库锁定", "正常", "状态回报上架完成-起点", "", "", "", executeStatePara.startStockArea.CN_S_STOCK_CODE, executeStatePara.startStockArea.CN_S_AREA_CODE, trans); } } } #endregion #region 空托出(下架) if (executeStatePara.transportTask.CN_S_TASK_TYPE.Equals("空托出")) { Log.Detail(logPara, "开始执行空托出!"); Log.Detail(logPara, "startTrayLocation: " + JsonConvert.SerializeObject(executeStatePara.startTrayLocation)); if (executeStatePara.startTrayLocation != null) { //解绑托盘与货位的关系 CreateDAL>().Delete(new { executeStatePara.transportTask.CN_S_TRAY_CODE, CN_S_LOCATION_CODE = executeStatePara.transportTask.CN_S_START_BIT }, trans); Log.Detail(logPara, "解绑任务的托盘和起点货位关联!"); ////删除托盘产品关联 //CreateDAL().Delete(" CN_S_TRAY_CODE='" + executeStatePara.transportTask.CN_S_TRAY_CODE + "' "); //Log.Detail(logPara, "删除当前任务的托盘物料关联!"); if (isControlStockQty) { #region 添加下架记录,降库存 CompleteTaskDownHistory(executeStatePara, logPara, trans); //获取配置是否启用收货区 var strategyValue = BLLCreator.Create().GetStrategy(executeStatePara.transportTask.CN_S_STOCK_CODE, StrategyKey.AreaQtyDeliverGood); if (strategyValue.Equals(Constants.Y)) { if (executeStatePara.transportTask.CN_S_START_CONTROL_INV.Equals("Y")) { CreateDAL().ReduceAreaQty(addAreaQty, executeStatePara.transportTask.CN_S_START_AREA, logPara, trans); } //增加终点库区(收货区)库存 CreateDAL().AddAreaQty(addAreaQty, executeStatePara.transportTask.CN_S_END_AREA, logPara, trans); } else { if (executeStatePara.transportTask.CN_S_START_CONTROL_INV.Equals("Y")) { CreateDAL().ReduceAreaQty(addAreaQty, executeStatePara.transportTask.CN_S_START_AREA, logPara, trans); if (!executeStatePara.transportTask.CN_S_TASK_TYPE.Equals("转运")) { //降低仓库库存 CreateDAL().ReduceStockQty(addStockQty, trans); Log.Detail(logPara, "降低仓库量表完成!"); } } } #endregion } if (executeStatePara.startIsCurrentTask != null && executeStatePara.transportTask.CN_C_START_IS_CONTROL_QTY.Equals("Y")) { CreateDAL().UpdateState(executeStatePara.transportTask.CN_S_START_BIT, "正常", "空", "预出库锁定", trans); Log.Detail(logPara, "更新预出库锁定的货位状态为正常、空,起始货位号:" + executeStatePara.transportTask.CN_S_START_BIT); ////更新起点货位的任务号 //CreateDAL>().Update(new { CN_S_TASK_NO = "" }, new { CN_S_LOCATION_CODE = executeStatePara.transportTask.CN_S_START_BIT }); //Log.Detail(logPara, "更新起点货位" + executeStatePara.transportTask.CN_S_START_BIT + "的绑定任务号为空!"); //货位状态变化 BLLCreator.Create().AddStateChange(executeStatePara.transportTask.CN_S_START_BIT, "预出库锁定", "正常", "状态回报下架完成-起点", "", "", "", executeStatePara.startStockArea.CN_S_STOCK_CODE, executeStatePara.startStockArea.CN_S_AREA_CODE, trans); } if (executeStatePara.transportTask.CN_C_END_IS_CONTROL_QTY.Equals("Y")) { var trayLocation = new TN_WM_B_TRAY_LOCATIONEntity() { CN_GUID = Guid.NewGuid().ToString(), CN_N_INDEX = 1, CN_S_CREATOR = "", CN_S_CREATOR_BY = "", CN_S_LOCATION_CODE = executeStatePara.transportTask.CN_S_END_BIT, CN_S_STOCK_AREA = executeStatePara.transportTask.CN_S_END_AREA, CN_S_STOCK_CODE = executeStatePara.transportTask.CN_S_STOCK_CODE, CN_S_TRAY_CODE = executeStatePara.transportTask.CN_S_TRAY_CODE, CN_T_CREATE = DateTime.Now }; ////添加托盘货位 //CreateDAL>().Add(trayLocation, trans); CreateDAL().UpdateState(executeStatePara.transportTask.CN_S_END_BIT, "正常", "空", "预入库锁定", trans); Log.Detail(logPara, "更新预入库锁定的货位状态为正常、满,结束货位号:" + executeStatePara.transportTask.CN_S_END_BIT); ////更新终点货位的任务号 //CreateDAL>().Update(new { CN_S_TASK_NO = "" }, new { CN_S_LOCATION_CODE = executeStatePara.transportTask.CN_S_END_BIT }); //Log.Detail(logPara, "更新终点货位" + executeStatePara.transportTask.CN_S_END_BIT + "的绑定任务号为空!"); //货位状态变化 BLLCreator.Create().AddStateChange(executeStatePara.transportTask.CN_S_END_BIT, "预入库锁定", "正常", "状态回报下架完成-终点", "", "", "", executeStatePara.endStockArea.CN_S_STOCK_CODE, executeStatePara.endStockArea.CN_S_AREA_CODE, trans); } } } #endregion #region 移库 if (executeStatePara.transportTask.CN_S_TASK_TYPE.Equals("移库")) { var trayLocation = new TN_WM_B_TRAY_LOCATIONEntity() { CN_GUID = Guid.NewGuid().ToString(), CN_N_INDEX = 1, CN_S_CREATOR = "", CN_S_CREATOR_BY = "", CN_S_LOCATION_CODE = executeStatePara.transportTask.CN_S_END_BIT, CN_S_STOCK_AREA = executeStatePara.transportTask.CN_S_END_AREA, CN_S_STOCK_CODE = executeStatePara.transportTask.CN_S_STOCK_CODE, CN_S_TRAY_CODE = executeStatePara.transportTask.CN_S_TRAY_CODE, CN_T_CREATE = DateTime.Now }; if (executeStatePara.startTrayLocation != null) { //解绑托盘与货位的关系 CreateDAL>().Delete(new { executeStatePara.transportTask.CN_S_TRAY_CODE, CN_S_LOCATION_CODE = executeStatePara.transportTask.CN_S_START_BIT }, trans); Log.Detail(logPara, "解绑任务的托盘和起点货位关联!"); } if (executeStatePara.endTrayLocation == null) { //添加托盘货位 CreateDAL>().Add(trayLocation, trans); Log.Detail(logPara, "添加托盘货位关联,内容:" + LogDescribe.Content(trayLocation)); if (isControlStockQty) { #region 下架记录 CompleteTaskDownHistory(executeStatePara, logPara, trans); #endregion #region 上架记录 CompleteTaskUpHistory(executeStatePara, logPara, trans); if (string.IsNullOrEmpty(executeStatePara.transportTask.CN_S_END_CONTROL_INV)) { Log.Detail(logPara, "终点库区" + executeStatePara.transportTask.CN_S_END_AREA + "不管控库存!executeStatePara.transportTask.CN_S_END_CONTROL_INV:" + executeStatePara.transportTask.CN_S_END_CONTROL_INV); trans.Rollback(); return; } #endregion #region 库存 if (executeStatePara.transportTask.CN_S_START_CONTROL_INV.Equals("Y")) //降低起点库存 { CreateDAL().ReduceAreaQtyAndAllocQty(addAreaQty, executeStatePara.transportTask.CN_S_START_AREA, logPara, trans); } if (executeStatePara.transportTask.CN_S_END_CONTROL_INV.Equals("Y")) //增加终点库存 { //按未入库量增加结束库区量 CreateDAL().AddAreaQty(addAreaQty, executeStatePara.transportTask.CN_S_END_AREA, logPara, trans); } #endregion } //终点 if (executeStatePara.endIsCurrentTask != null && executeStatePara.transportTask.CN_C_END_IS_CONTROL_QTY.Equals("Y")) { CreateDAL().UpdateState(executeStatePara.transportTask.CN_S_END_BIT, "正常", "满", "预入库锁定", trans); Log.Detail(logPara, "更新预入库锁定的货位状态为正常、满,货位号:" + executeStatePara.transportTask.CN_S_END_BIT); //货位状态变化 BLLCreator.Create().AddStateChange(executeStatePara.transportTask.CN_S_END_BIT, "预入库锁定", "正常", "状态回报入库完成-终点", "", "", "", executeStatePara.endStockArea.CN_S_STOCK_CODE, executeStatePara.endStockArea.CN_S_AREA_CODE, trans); } //起点 if (executeStatePara.transportTask.CN_C_START_IS_CONTROL_QTY.Equals("Y")) { CreateDAL().UpdateState(executeStatePara.transportTask.CN_S_START_BIT, "正常", "空", "预出库锁定", trans); Log.Detail(logPara, "更新预出库锁定的货位状态为正常、空,起点货位号:" + executeStatePara.transportTask.CN_S_START_BIT); //货位状态变化 BLLCreator.Create().AddStateChange(executeStatePara.transportTask.CN_S_START_BIT, "预出库锁定", "正常", "状态回报转运完成-起点", "", "", "", executeStatePara.startStockArea.CN_S_STOCK_CODE, executeStatePara.startStockArea.CN_S_AREA_CODE, trans); } } } #endregion }); } public override void CompleteTaskDownHistory(ExecuteStateParaDto executeStatePara, LogPara logPara, IDbTransaction trans) { var downHis = new List(); foreach (var trayItemMst in executeStatePara.trayItemMsts) { downHis.Add(new TN_WM_DOWN_HISTORYEntity { CN_GUID = Guid.NewGuid().ToString(), CN_S_LOCATION_CODE = executeStatePara.transportTask.CN_S_START_BIT, CN_S_ITEM_STATE = trayItemMst.CN_S_ITEM_STATE, CN_S_TRAY_CODE = trayItemMst.CN_S_TRAY_CODE, CN_S_TRAY_GRID = trayItemMst.CN_S_TRAY_GRID, CN_S_ITEM_CODE = trayItemMst.CN_S_ITEM_CODE, CN_S_ITEM_NAME = trayItemMst.CN_S_ITEM_NAME, CN_S_PRODUCTION_BATCH = trayItemMst.CN_S_LOT_NO, CN_F_QUANTITY = trayItemMst.CN_F_QUANTITY,//CN_S_WEIGHT,//.CN_F_QUANTITY, CN_S_MODEL = trayItemMst.CN_S_MODEL, CN_S_STOCK_AREA = executeStatePara.transportTask.CN_S_START_AREA, CN_S_STOCK_CODE = executeStatePara.transportTask.CN_S_STOCK_CODE, CN_T_CREATE = DateTime.Now, CN_T_MODIFY = DateTime.Now, CN_S_OWNER = "", CN_S_MEASURE_UNIT = trayItemMst.CN_S_MEASURE_UNIT, CN_S_CREATOR = executeStatePara.transportTask.CN_S_CREATOR, CN_S_CREATOR_BY = executeStatePara.transportTask.CN_S_CREATOR_BY, CN_S_MODIFY = "", CN_S_MODIFY_BY = "", CN_S_OP_FROM = "任务完成-" + executeStatePara.transportTask.CN_S_TASK_TYPE, CN_S_EXT1 = trayItemMst.CN_S_UNIQUE_CODE, CN_S_EXT2 = executeStatePara.transportTask.CN_S_EXT1, CN_S_LOT_NO = trayItemMst.CN_S_LOT_NO, CN_S_FIGURE_NO = trayItemMst.CN_S_FIGURE_NO }); } //下架记录 if (downHis.Any()) { CreateDAL>().AddRange(downHis, trans); Log.Detail(logPara, "添加下架记录,内容:" + LogDescribe.Content(downHis)); } } #endregion public override ExecuteOutWorkAreaPara OutWorkArea(OutWorkAreaEntity outWorkAreaEntity, LogPara logPara) { 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); 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 }; 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("OutWorkArea 方法异常:" + JsonConvert.SerializeObject(ex.Message + ex.StackTrace)); } return executeOutWorkAreaPara; } public override string InWorkArea(List inWorkAreaEntitys) { var logPara = LogType.LogPara("入作业区"); Log.Detail(logPara, "InWorkArea接口请求参数:" + JsonConvert.SerializeObject(inWorkAreaEntitys)); foreach (var item in inWorkAreaEntitys) { Log.Info("InWorkArea", "start"); if (string.IsNullOrEmpty(item.trayCode)) { Log.Info("InWorkArea", "托盘为空取起点货位托盘"); if (!string.IsNullOrEmpty(item.startBit)) { var trayLocation = CreateDapperDAL().GetSingleEntity(new { CN_S_LOCATION_CODE = item.startBit }); if (trayLocation != null) item.trayCode = trayLocation.CN_S_TRAY_CODE; Log.Info("InWorkArea item.trayCode", item.trayCode); } } } var result = JsonConvert.SerializeObject(InWorkArea(inWorkAreaEntitys, logPara)); Log.Detail(logPara, "InWorkArea接口返回结果:" + result); return result; } } }