using HH.WCS.Hexafluo; using HH.WCS.Hexafluo.util; using HH.WCS.Hexafluo.wms; using HH.WCS.SJML.Comm; using HH.WCS.SJML.dispatch; using HH.WCS.SJML.Dto; using HH.WCS.SJML.Entitys; using HH.WCS.SJML.OutWork; using HH.WCS.SJML.util; using HH.WCS.ZCQTJ.Entitys; using Newtonsoft.Json; using SqlSugar; using System; using System.Collections.Generic; using System.Data; using System.Globalization; using System.Linq; namespace HH.WCS.SJML.Bll { public class OutWorkAreaBll { public virtual OperateResult OutWorkArea(List outWorkAreaList) { var logPara = LogType.LogPara("出作业区"); LogHelper.OutDetail(logPara, "OutWorkArea接口请求参数:" + JsonConvert.SerializeObject(outWorkAreaList)); OperateResult er = OutWorkArea(outWorkAreaList, logPara); // var result = JsonConvert.SerializeObject(er); LogHelper.OutDetail(logPara, "OutWorkArea接口返回参数:" + JsonConvert.SerializeObject(er)); return er; } public virtual OperateResult OutWorkArea(List outWorkAreaList, LogPara logPara) { var response = new OperateResult(); if (outWorkAreaList == null) return new OperateResult { Success = false, Msg = "参数不正确" }; for (var i = 0; i < outWorkAreaList.Count; i++) { var result = OutWorkArea(outWorkAreaList[i], logPara); if (result.BasisResponse.Success) { response.Success = true; response.okList.Add(result.TaskExecuteState.okTask); //发送到AMS //SendToAms(response, logPara); } else { response.failList.Add(new TaskExecuteState().Error(i, result.BasisResponse.Msg).FailTask); if (result.RollLocations.Count > 0) { var chi = new SqlHelper().GetInstance(); var newDb = chi.CopyNew(); foreach (string sLocation in result.RollLocations) { newDb.BeginTran(); var I = newDb.Updateable().SetColumns(it => it.S_LOCK_STATE == "无").Where(x => x.S_LOC_CODE == sLocation).ExecuteCommand(); if (I == 0) { newDb.RollbackTran(); } newDb.CommitTran(); } } } response.Code = result.BasisResponse.Code; response.Msg = result.BasisResponse.Msg; } LogHelper.OutDetail(logPara, "response结果:" + JsonConvert.SerializeObject(response)); //var curResult = response.failList.Any() ? response.Error(null, string.Empty, outWorkAreaList) : response.Ok(null, outWorkAreaList); //if (!curResult.Success) //{ // curResult.Code = response.Code; //} // Log.Info("错误代码 response.errCode是", JsonConvert.SerializeObject(curResult)); return response; } public virtual ExecuteOutWorkAreaPara OutWorkArea(OutWorkAreaEntity outWorkAreaEntity, LogPara logPara) { if (string.IsNullOrEmpty(outWorkAreaEntity.TaskOrderType)) outWorkAreaEntity.TaskOrderType = "自管"; var executeOutWorkAreaPara = new ExecuteOutWorkAreaPara { OutWorkAreaEntity = outWorkAreaEntity }; try { if (!OutWorkAreaVerifyPara(ref executeOutWorkAreaPara, logPara).BasisResponse.Success) return executeOutWorkAreaPara; LogHelper.OutDetail(logPara, "OutWorkAreaVerifyPara"); if (!OutWorkAreaHandlePara(ref executeOutWorkAreaPara, logPara).BasisResponse.Success) return executeOutWorkAreaPara; LogHelper.OutDetail(logPara, "OutWorkAreaHandlePara"); //算法计算货位 if (string.IsNullOrEmpty(executeOutWorkAreaPara.OutWorkAreaEntity.startBit)) { OutWorkAreaOutAss(ref executeOutWorkAreaPara, logPara); LogHelper.OutDetail(logPara, "OutWorkAreaOutAss"); if (!executeOutWorkAreaPara.BasisResponse.Success) return executeOutWorkAreaPara; } if (string.IsNullOrEmpty(executeOutWorkAreaPara.OutWorkAreaEntity.endBit)) { if (!InWorkAreaOutAss(ref executeOutWorkAreaPara, logPara).BasisResponse.Success) return executeOutWorkAreaPara; LogHelper.OutDetail(logPara, "InWorkAreaOutAss"); } if (!DoCreateTransportList(ref executeOutWorkAreaPara, logPara).BasisResponse.Success) return executeOutWorkAreaPara; LogHelper.OutDetail(logPara, "DoCreateTransportList"); OutWorkAreaCreateTask(ref executeOutWorkAreaPara, logPara); LogHelper.OutDetail(logPara, "OutWorkAreaCreateTask"); OutWorkAreaProcedure(ref executeOutWorkAreaPara, logPara); LogHelper.OutDetail(logPara, "OutWorkAreaProcedure"); if (!string.IsNullOrEmpty(executeOutWorkAreaPara.objectTask)) { //下达任务给agv----双申位不用写 LogHelper.OutDetail(logPara, "执行的辅助表数据为:" + JsonConvert.SerializeObject(executeOutWorkAreaPara.WorkSubsidiary)); if (executeOutWorkAreaPara.WorkSubsidiary?.S_YN_JOBPATH == "Y") { LogHelper.OutDetail(logPara, "执行的作业路径为:" + JsonConvert.SerializeObject(executeOutWorkAreaPara.WorkAreaProEntity)); if (executeOutWorkAreaPara.WorkAreaProEntity?.S_Subtask != "Y") { if (executeOutWorkAreaPara.WorkAreaProEntity?.S_TransAgv == "Y") { //var ta = TaskProcess.SendTask(executeOutWorkAreaPara.TaskEntity); //LogHelper.InDetail(logPara, "通知小车是否成功:" + ta); //LogHelper.InDetail(logPara, "通知小车"); //if (!ta) //{ // throw new Exception("通知小车失败"); //} //else //{ // SqlSugarHelper.Db.CommitTran(); //} SqlSugarHelper.Db.CommitTran(); } if (executeOutWorkAreaPara.WorkAreaProEntity?.S_TransWcs == "Y") { LogHelper.InDetail(logPara, "开始通知立库"); var ta = BLLCreator.CreateSingleton().WcsTaskEntity(executeOutWorkAreaPara.TaskEntity); LogHelper.InDetail(logPara, "通知立库是否成功:" + JsonConvert.SerializeObject(ta)); LogHelper.InDetail(logPara, "结束通知立库"); if (!ta.Success) { throw new Exception("通知立库失败"); } else { SqlSugarHelper.Db.CommitTran(); } } } } else { if (executeOutWorkAreaPara.OutWorkAreaEntity.S_Subtask != "Y") { if (executeOutWorkAreaPara.OutWorkAreaEntity.S_TransAgv == "Y") { //LogHelper.OutDetail(logPara, "开始通知小车"); //var ta = TaskProcess.SendTask(executeOutWorkAreaPara.TaskEntity); //LogHelper.OutDetail(logPara, "通知小车是否成功:" + ta); //LogHelper.OutDetail(logPara, "结束通知小车"); //if (!ta) //{ // throw new Exception("通知小车失败"); //} //else //{ // SqlSugarHelper.Db.CommitTran(); //} SqlSugarHelper.Db.CommitTran(); } if (executeOutWorkAreaPara.OutWorkAreaEntity.S_TransWcs == "Y") { LogHelper.OutDetail(logPara, "开始通知立库"); var ta = BLLCreator.CreateSingleton().WcsTaskEntity(executeOutWorkAreaPara.TaskEntity); LogHelper.OutDetail(logPara, "通知立库是否成功:" + JsonConvert.SerializeObject(ta)); LogHelper.OutDetail(logPara, "结束通知立库"); if (!ta.Success) { throw new Exception("通知立库失败"); } else { SqlSugarHelper.Db.CommitTran(); } } } } } SqlSugarHelper.Db.CommitTran(); } catch (Exception ex) { executeOutWorkAreaPara.BasisResponse = OperateResult.Error("OutWorkArea 方法异常:" + JsonConvert.SerializeObject(ex.Message)); SqlSugarHelper.Db.RollbackTran(); } return executeOutWorkAreaPara; } public virtual ExecuteOutWorkAreaPara OutWorkAreaVerifyPara(ref ExecuteOutWorkAreaPara executeOutWorkAreaPara, LogPara logPara) { if (executeOutWorkAreaPara.OutWorkAreaEntity == null) { executeOutWorkAreaPara.BasisResponse = OperateResult.Error("参数不合法,接收参数为null!"); return executeOutWorkAreaPara; } var chi = new SqlHelper().GetInstance(); var newDb = chi.CopyNew(); #region 检查起点位置 if (!string.IsNullOrEmpty(executeOutWorkAreaPara.OutWorkAreaEntity.startBit)) { var startBit = executeOutWorkAreaPara.OutWorkAreaEntity.startBit?.Trim(); executeOutWorkAreaPara.StartLocationExt = SqlSugarHelper.Db.Queryable().Where(e => e.S_LOC_CODE == startBit)?.First(); if (!executeOutWorkAreaPara.StartLocationExt.S_LOCK_STATE.Equals("无")) { executeOutWorkAreaPara.BasisResponse = OperateResult.Error("当前起点货位状态为:" + executeOutWorkAreaPara.StartLocationExt.S_LOCK_STATE + ",不允许出库!"); return executeOutWorkAreaPara; } var AreaCode = executeOutWorkAreaPara.StartLocationExt.S_AREA_CODE; executeOutWorkAreaPara.StartStockAreaEntity = SqlSugarHelper.Db.Queryable().Where(e => e.S_AREA_CODE == AreaCode)?.First(); if (executeOutWorkAreaPara.StartStockAreaEntity == null) { executeOutWorkAreaPara.BasisResponse = OperateResult.Error("给定起点位置:" + executeOutWorkAreaPara.OutWorkAreaEntity.startBit + "不存在!"); return executeOutWorkAreaPara; } executeOutWorkAreaPara.OutWorkAreaEntity.startArea = executeOutWorkAreaPara.StartStockAreaEntity.S_AREA_CODE; executeOutWorkAreaPara.OutWorkAreaEntity.startStock = executeOutWorkAreaPara.StartStockAreaEntity.S_WH_CODE; //SqlSugarHelper.Db.Queryable().Where(e => e.S_LOC_CODE == startBit)?.First(); LocCntrRel trayLocation = new LocCntrRel(); if (string.IsNullOrEmpty(executeOutWorkAreaPara.StartStockAreaEntity.S_CONTROL_QTY)) { executeOutWorkAreaPara.BasisResponse = OperateResult.Error("起点库区是否管控字段为空"); return executeOutWorkAreaPara; } if (executeOutWorkAreaPara.StartStockAreaEntity.S_CONTROL_QTY == "Y") { if (executeOutWorkAreaPara.StartLocationExt.N_CAPACITY == 1) { trayLocation = SqlSugarHelper.Db.Queryable().Where(e => e.S_LOC_CODE == startBit)?.First(); if (trayLocation == null) { executeOutWorkAreaPara.BasisResponse = OperateResult.Error("当前起点未绑定托盘!"); return executeOutWorkAreaPara; } try { newDb.BeginTran(); var I = newDb.Updateable().SetColumns(it => it.S_LOCK_STATE == "出库锁").Where(x => x.S_LOC_CODE == startBit && x.S_LOCK_STATE == "无").ExecuteCommand(); if (I == 0) { throw new System.Exception("锁定起点货位失败!"); } else { executeOutWorkAreaPara.RollLocations.Add(executeOutWorkAreaPara.OutWorkAreaEntity.startBit); } newDb.CommitTran(); } catch (System.Exception ex) { newDb.RollbackTran(); executeOutWorkAreaPara.BasisResponse = OperateResult.Error(ex.Message + ex.StackTrace); return executeOutWorkAreaPara; } } } if (!string.IsNullOrEmpty(trayLocation.S_CNTR_CODE)) { executeOutWorkAreaPara.OutWorkAreaEntity.trayCode = trayLocation.S_CNTR_CODE; } } #endregion #region 当起点为空且指定了托盘 if (string.IsNullOrEmpty(executeOutWorkAreaPara.OutWorkAreaEntity.startBit) && !string.IsNullOrEmpty(executeOutWorkAreaPara.OutWorkAreaEntity.trayCode)) { var trayCode = executeOutWorkAreaPara.OutWorkAreaEntity.trayCode; var Cns = SqlSugarHelper.Db.Queryable().Where(e => e.S_CNTR_CODE == trayCode)?.First(); if (Cns == null) { LogHelper.Info("任务下发", $"未查询到指定工装出库 指定的工装码为:{trayCode} 的工装货位信息"); throw new Exception($"未查询到指定工装出库 指定的工装码为:{trayCode} 的工装货位信息"); } else { var startBit = Cns.S_LOC_CODE; executeOutWorkAreaPara.OutWorkAreaEntity.startBit = startBit; executeOutWorkAreaPara.StartLocationExt = SqlSugarHelper.Db.Queryable().Where(e => e.S_LOC_CODE == startBit)?.First(); if (!executeOutWorkAreaPara.StartLocationExt.S_LOCK_STATE.Equals("无")) { executeOutWorkAreaPara.BasisResponse = OperateResult.Error("当前起点货位状态为:" + executeOutWorkAreaPara.StartLocationExt.S_LOCK_STATE + ",不允许出库!"); return executeOutWorkAreaPara; } var AreaCode = executeOutWorkAreaPara.StartLocationExt.S_AREA_CODE; executeOutWorkAreaPara.StartStockAreaEntity = SqlSugarHelper.Db.Queryable().Where(e => e.S_AREA_CODE == AreaCode)?.First(); if (executeOutWorkAreaPara.StartStockAreaEntity == null) { executeOutWorkAreaPara.BasisResponse = OperateResult.Error($"给定工装 {trayCode} 的起点位置:" + executeOutWorkAreaPara.OutWorkAreaEntity.startBit + "不存在!"); return executeOutWorkAreaPara; } LocCntrRel trayLocation = new LocCntrRel(); if (string.IsNullOrEmpty(executeOutWorkAreaPara.StartStockAreaEntity.S_CONTROL_QTY)) { executeOutWorkAreaPara.BasisResponse = OperateResult.Error("起点库区是否管控字段为空"); return executeOutWorkAreaPara; } if (executeOutWorkAreaPara.StartStockAreaEntity.S_CONTROL_QTY == "Y") { if (executeOutWorkAreaPara.StartLocationExt.N_CAPACITY == 1) { try { newDb.BeginTran(); var I = newDb.Updateable().SetColumns(it => it.S_LOCK_STATE == "出库锁").Where(x => x.S_LOC_CODE == startBit && x.S_LOCK_STATE == "无").ExecuteCommand(); if (I == 0) { throw new System.Exception("锁定起点货位失败!"); } else { executeOutWorkAreaPara.RollLocations.Add(executeOutWorkAreaPara.OutWorkAreaEntity.startBit); } newDb.CommitTran(); } catch (System.Exception ex) { newDb.RollbackTran(); executeOutWorkAreaPara.BasisResponse = OperateResult.Error(ex.Message + ex.StackTrace); return executeOutWorkAreaPara; } } } } } #endregion #region 检验终点库区 if (!string.IsNullOrEmpty(executeOutWorkAreaPara.OutWorkAreaEntity.endBit)) { //if (string.IsNullOrEmpty(executeOutWorkAreaPara.OutWorkAreaEntity.endBit)) //{ //executeOutWorkAreaPara.BasisResponse = BasisResponse.Error("给定的目的位置不存在!"); //return executeOutWorkAreaPara; //获取终点库区信息 var endBit = executeOutWorkAreaPara.OutWorkAreaEntity.endBit; executeOutWorkAreaPara.EndLocationExt = SqlSugarHelper.Db.Queryable().Where(e => e.S_LOC_CODE == endBit)?.First(); LogHelper.OutDetail(logPara, "查询终点货位:" + JsonConvert.SerializeObject(executeOutWorkAreaPara.EndLocationExt)); if (executeOutWorkAreaPara.EndLocationExt == null) { executeOutWorkAreaPara.BasisResponse = OperateResult.Error("未查询到当前终点货位信息"); return executeOutWorkAreaPara; } if (executeOutWorkAreaPara.EndLocationExt.C_ENABLE != "Y") { executeOutWorkAreaPara.BasisResponse = OperateResult.Error("查询到当前终点货位信息未在启用状态"); return executeOutWorkAreaPara; } var EndArea = executeOutWorkAreaPara.EndLocationExt.S_AREA_CODE; executeOutWorkAreaPara.EndStockAreaEntity = SqlSugarHelper.Db.Queryable().Where(e => e.S_AREA_CODE == EndArea)?.First(); LogHelper.OutDetail(logPara, "查询终点货位库区:" + JsonConvert.SerializeObject(executeOutWorkAreaPara.EndStockAreaEntity)); if (executeOutWorkAreaPara.EndStockAreaEntity == null) { executeOutWorkAreaPara.BasisResponse = OperateResult.Error("给定的目的位置未找到库区!"); return executeOutWorkAreaPara; } if (executeOutWorkAreaPara.OutWorkAreaEntity.IsTransport == null) { executeOutWorkAreaPara.OutWorkAreaEntity.IsTransport = "N"; } // 检查货位状态 是转运且管控数量时使用 if (string.IsNullOrEmpty(executeOutWorkAreaPara.EndStockAreaEntity.S_CONTROL_QTY)) { executeOutWorkAreaPara.BasisResponse = OperateResult.Error("终点库区是否管控字段为空!"); return executeOutWorkAreaPara; } if (executeOutWorkAreaPara.EndStockAreaEntity.S_CONTROL_QTY.Equals("Y")) { if (string.IsNullOrEmpty(executeOutWorkAreaPara.OutWorkAreaEntity.IsTransport)) { executeOutWorkAreaPara.OutWorkAreaEntity.IsTransport = "Y"; } if (!executeOutWorkAreaPara.EndLocationExt.S_LOCK_STATE.Equals("无")) { executeOutWorkAreaPara.BasisResponse = OperateResult.Error("当前终点货位状态为:" + executeOutWorkAreaPara.EndLocationExt.S_LOCK_STATE + ",货位不可用!"); return executeOutWorkAreaPara; } if (executeOutWorkAreaPara.EndLocationExt.N_CURRENT_NUM > 0) { executeOutWorkAreaPara.BasisResponse = OperateResult.Error("当前货位容量为" + executeOutWorkAreaPara.EndLocationExt.N_CURRENT_NUM + ",货位不可用!"); return executeOutWorkAreaPara; } //锁定终点货位 if (executeOutWorkAreaPara.EndLocationExt.N_CAPACITY == 1) { try { newDb.BeginTran(); var I = newDb.Updateable().SetColumns(it => it.S_LOCK_STATE == "入库锁").Where(x => x.S_LOC_CODE == endBit && x.S_LOCK_STATE == "无").ExecuteCommand(); if (I == 0) { throw new System.Exception("锁定终点货位失败!"); } else { executeOutWorkAreaPara.RollLocations.Add(executeOutWorkAreaPara.OutWorkAreaEntity.endBit); } newDb.CommitTran(); } catch (System.Exception ex) { newDb.RollbackTran(); executeOutWorkAreaPara.BasisResponse = OperateResult.Error(ex.Message + ex.StackTrace); return executeOutWorkAreaPara; } } } executeOutWorkAreaPara.OutWorkAreaEntity.startStock = executeOutWorkAreaPara.EndStockAreaEntity.S_WH_CODE; executeOutWorkAreaPara.OutWorkAreaEntity.endStock = executeOutWorkAreaPara.EndStockAreaEntity.S_WH_CODE; executeOutWorkAreaPara.OutWorkAreaEntity.endArea = executeOutWorkAreaPara.EndStockAreaEntity.S_AREA_CODE; } #endregion return executeOutWorkAreaPara; } public virtual ExecuteOutWorkAreaPara OutWorkAreaHandlePara(ref ExecuteOutWorkAreaPara executeOutWorkAreaPara, LogPara logPara) { //任务号 if (string.IsNullOrEmpty(executeOutWorkAreaPara.OutWorkAreaEntity.taskNo)) { executeOutWorkAreaPara.OutWorkAreaEntity.taskNo = BLLCreator.Create().TaskNo("CK"); if (string.IsNullOrEmpty(executeOutWorkAreaPara.OutWorkAreaEntity.taskNo)) executeOutWorkAreaPara.BasisResponse = OperateResult.Error("生成出库任务号异常!"); } //这里--是否启用作业路径 LogHelper.OutDetail(logPara, "是否有起点库区 " + JsonConvert.SerializeObject(executeOutWorkAreaPara.OutWorkAreaEntity)); if (!string.IsNullOrEmpty(executeOutWorkAreaPara.OutWorkAreaEntity?.startArea) && executeOutWorkAreaPara.OutWorkAreaEntity.NoAssist == "Y") { var chi = new SqlHelper().GetInstance(); var newDb = chi.CopyNew(); var S_WH_CODE = executeOutWorkAreaPara.StartStockAreaEntity?.S_WH_CODE; var S_AREA_CODE = executeOutWorkAreaPara.StartStockAreaEntity?.S_AREA_CODE; if (executeOutWorkAreaPara.StartStockAreaEntity?.S_AREA_TYPE == "立库") { var Subs = Expressionable.Create(); Subs.And(it => it.S_WH_CODE == S_WH_CODE); Subs.And(it => it.S_AREA_CODE == S_AREA_CODE); var Subsidiary = newDb.Queryable().Where(Subs.ToExpression()).ToList(); // LogHelper.OutDetail(logPara, "是否启用作业路径: 辅助表数据 " + JsonConvert.SerializeObject(Subsidiary)); if (!Subsidiary.Any()) { executeOutWorkAreaPara.BasisResponse = OperateResult.Error("辅助表未查询到对应库区的数据!库区:" + S_AREA_CODE); } else { if (Subsidiary.FindAll(e => e.S_YN_JOBPATH == "Y").Count() == 0) { //不需要的话就直接返回 TN_WorkFlowEntitys Flow = new TN_WorkFlowEntitys(); Flow.S_StartArea = executeOutWorkAreaPara.StartStockAreaEntity.S_AREA_CODE; Flow.S_EndArea = executeOutWorkAreaPara.EndStockAreaEntity.S_AREA_CODE; if (string.IsNullOrEmpty(Flow.S_StartArea)) { executeOutWorkAreaPara.BasisResponse = OperateResult.Error("未启用作业路径,并且未下达起点库区参数 库区:" + S_AREA_CODE); throw new Exception("未启用作业路径,并且未下达起点库区参数!库区:" + S_AREA_CODE); } executeOutWorkAreaPara.WorkAreaProEntitys.Add(Flow); LogHelper.OutDetail(logPara, "是否启用作业路径: 自己组建的作业流程 " + JsonConvert.SerializeObject(Flow)); return executeOutWorkAreaPara; } } } else { //不需要的话就直接返回 TN_WorkFlowEntitys Flow = new TN_WorkFlowEntitys(); Flow.S_StartArea = executeOutWorkAreaPara.StartStockAreaEntity?.S_AREA_CODE; Flow.S_EndArea = executeOutWorkAreaPara.EndStockAreaEntity?.S_AREA_CODE; if (string.IsNullOrEmpty(Flow?.S_StartArea)) { executeOutWorkAreaPara.BasisResponse = OperateResult.Error("未启用作业路径,并且未下达起点库区参数 库区:" + S_AREA_CODE); throw new Exception("未启用作业路径,并且未下达起点库区参数!库区:" + S_AREA_CODE); } executeOutWorkAreaPara.WorkAreaProEntitys.Add(Flow); LogHelper.OutDetail(logPara, "是否启用作业路径: 自己组建的作业流程 " + JsonConvert.SerializeObject(Flow)); return executeOutWorkAreaPara; } } executeOutWorkAreaPara.WorkAreaProEntitys = GetOutWorkPosition(executeOutWorkAreaPara); if (!executeOutWorkAreaPara.WorkAreaProEntitys.Any()) { executeOutWorkAreaPara.BasisResponse = OperateResult.Error(string.Format("未获取到当前库区:{0}货位:{1}下的作业路径!", executeOutWorkAreaPara.OutWorkAreaEntity.endArea, executeOutWorkAreaPara.OutWorkAreaEntity.endBit)); return executeOutWorkAreaPara; } return executeOutWorkAreaPara; } /// /// 获取作业区流程列表 /// /// /// public List GetOutWorkPosition(ExecuteOutWorkAreaPara executeOutWorkAreaPara) { var chi = new SqlHelper().GetInstance(); var newDb = chi.CopyNew(); //根据起始库区计算作业区 var startArea = executeOutWorkAreaPara.OutWorkAreaEntity.startArea; var endArea = executeOutWorkAreaPara.OutWorkAreaEntity.endArea; var TaskFlow = executeOutWorkAreaPara.OutWorkAreaEntity.TaskFlow; var exp = Expressionable.Create(); exp.AndIF(!string.IsNullOrEmpty(startArea), it => it.S_StartArea == startArea); exp.AndIF(!string.IsNullOrEmpty(endArea), it => it.S_EndArea == endArea); exp.AndIF(!string.IsNullOrEmpty(TaskFlow), it => it.S_FlowNo == TaskFlow); exp.And(it => it.S_IS_IN_OUT == "出库"); var workAreaProList = newDb.Queryable().Where(exp.ToExpression()).ToList(); return workAreaProList; } public virtual ExecuteOutWorkAreaPara OutWorkAreaOutAss(ref ExecuteOutWorkAreaPara executeOutWorkAreaPara, LogPara logPara) { #region 算法 //List Roadway = new List(); //if (!string.IsNullOrEmpty(executeOutWorkAreaPara.OutWorkAreaEntity.S_Roadway)) //{ // Roadway.Add(executeOutWorkAreaPara.OutWorkAreaEntity.S_Roadway); //} //获取起点货位 OutAssignEnitty oEntity = new OutAssignEnitty() { stockCode = executeOutWorkAreaPara.OutWorkAreaEntity.startStock, TrayType = executeOutWorkAreaPara.OutWorkAreaEntity.TrayType, S_TASK_NO = executeOutWorkAreaPara.OutWorkAreaEntity.taskNo, itemCode = executeOutWorkAreaPara.OutWorkAreaEntity.Data == null ? "" : executeOutWorkAreaPara.OutWorkAreaEntity.Data?.First()?.ItemCode, itemState = executeOutWorkAreaPara.OutWorkAreaEntity.Data == null ? "" : executeOutWorkAreaPara.OutWorkAreaEntity.Data?.First()?.itemState, projectCode = executeOutWorkAreaPara.OutWorkAreaEntity.projectCode, endBit = executeOutWorkAreaPara.OutWorkAreaEntity.endBit, // S_Roadway = Roadway, lstAreaPrior = executeOutWorkAreaPara.WorkAreaProEntitys.Select(p => new areaPriorClass { areaCode = p.S_StartArea, Prior = p.S_Priority, S_FlowNo = p.S_FlowNo }).ToList() }; try { //执行算法 OutAssignResultEntity ire = BLLCreator.Create().OutAssign(oEntity); if (!ire.Success) { executeOutWorkAreaPara.BasisResponse = OperateResult.Error("算法返回结果" + ire.Msg); executeOutWorkAreaPara.BasisResponse.Code = ire.errCode; return executeOutWorkAreaPara; } executeOutWorkAreaPara.StartLocationExt = SqlSugarHelper.Db.Queryable().Where(e => e.S_LOC_CODE == ire.locationCode)?.First(); if ((ire.areaType == Constants.Area_Struc_PingStock || ire.areaType == Constants.Area_Struc_LiStock) && ire.isControlQty == "Y") { executeOutWorkAreaPara.RollLocations.Add(ire.locationCode); } executeOutWorkAreaPara.OutWorkAreaEntity.startBit = ire.locationCode; executeOutWorkAreaPara.OutWorkAreaEntity.startArea = ire.areaCode; if (executeOutWorkAreaPara.StartStockAreaEntity == null) { executeOutWorkAreaPara.StartStockAreaEntity = SqlSugarHelper.Db.Queryable().Where(e => e.S_AREA_CODE == ire.areaCode)?.First(); } if (string.IsNullOrEmpty(executeOutWorkAreaPara.OutWorkAreaEntity.trayCode)) { executeOutWorkAreaPara.OutWorkAreaEntity.trayCode = ire.trayCode; executeOutWorkAreaPara.LocCntr = SqlSugarHelper.Db.Queryable().Where(e => e.S_CNTR_CODE == ire.trayCode)?.First(); if (executeOutWorkAreaPara.OutWorkAreaEntity.Data != null) { foreach (var item in executeOutWorkAreaPara.OutWorkAreaEntity.Data) { item.TrayCode = ire.trayCode; var trayItem = SqlSugarHelper.Db.Queryable().Where(e => e.S_CNTR_CODE == ire.trayCode)?.First(); if (trayItem != null) { item.UnitQty = Convert.ToInt32(trayItem.F_QTY); } } } } } catch (Exception ex) { executeOutWorkAreaPara.BasisResponse = OperateResult.Error("未找到合适的出库货位" + ex.Message); } #endregion return executeOutWorkAreaPara; } public virtual ExecuteOutWorkAreaPara InWorkAreaOutAss(ref ExecuteOutWorkAreaPara executeOutWorkAreaPara, LogPara logPara) { var logicAreaCode = string.Empty; var aEntity = new InAssignEntity() { objectType = InAssignEntity.ObjectType.托盘, objectCode = executeOutWorkAreaPara.OutWorkAreaEntity.trayCode, lstAreaPrior = executeOutWorkAreaPara.WorkAreaProEntitys.Select(p => new areaPriorClass { areaCode = p.S_EndArea, Prior = p.S_Priority }).ToList(), //lockLocation = endArea != null ? endArea.CN_C_IS_CONTROL_QTY.Equals("Y") : false, //不管控数量时,不锁定目的货位 projectCode = executeOutWorkAreaPara.OutWorkAreaEntity.projectCode, logicAreaCode = logicAreaCode, stockCode = executeOutWorkAreaPara.OutWorkAreaEntity.startStock, callSys = executeOutWorkAreaPara.OutWorkAreaEntity.sysName, needCalLock = true }; //根据库区获取货位 InAssignResultEntity resultEntity = BLLCreator.Create().InAssign(aEntity); if (resultEntity.Success) { executeOutWorkAreaPara.OutWorkAreaEntity.endBit = resultEntity.locationCode; executeOutWorkAreaPara.OutWorkAreaEntity.qtyIndex = resultEntity.index; //增加到回滚记录里面 if ((resultEntity.areaType == Constants.Area_Struc_PingStock || resultEntity.areaType == Constants.Area_Struc_LiStock) && resultEntity.isControlQty == "Y") { executeOutWorkAreaPara.RollLocations.Add(resultEntity.locationCode); } executeOutWorkAreaPara.EndLocationEntity = SqlSugarHelper.Db.Queryable().Where(e => e.S_LOC_CODE == resultEntity.locationCode)?.First(); if (executeOutWorkAreaPara.EndLocationEntity != null) { var S_AREA_CODE = executeOutWorkAreaPara.EndLocationEntity.S_AREA_CODE; executeOutWorkAreaPara.EndStockAreaEntity = SqlSugarHelper.Db.Queryable().Where(o => o.S_AREA_CODE == S_AREA_CODE).Select(o => o)?.First(); executeOutWorkAreaPara.OutWorkAreaEntity.endArea = S_AREA_CODE; } } else { executeOutWorkAreaPara.BasisResponse = OperateResult.Error("在" + string.Join(",", executeOutWorkAreaPara.WorkAreaProEntitys.Select(o => o.S_EndArea).ToList()) + "库区中未找到合适的入库货位,详细原因:" + resultEntity.Msg); return executeOutWorkAreaPara; } return executeOutWorkAreaPara; } public virtual ExecuteOutWorkAreaPara DoCreateTransportList(ref ExecuteOutWorkAreaPara executeOutWorkAreaPara, LogPara logPara) { //创建转运任务 var entity = new TN_WM_TRANSPORT_TASKEntity { CN_S_TASK_NO = executeOutWorkAreaPara.OutWorkAreaEntity.taskNo, CN_S_CIR_OBJ = "托盘", CN_S_CIR_OBJ_CODE = executeOutWorkAreaPara.OutWorkAreaEntity.trayCode, CN_S_START_BIT = executeOutWorkAreaPara.OutWorkAreaEntity.startBit, CN_S_START_AREA = executeOutWorkAreaPara.OutWorkAreaEntity.startArea ?? executeOutWorkAreaPara.StartStockAreaEntity.S_AREA_CODE, CN_S_STATE = "未执行", CN_N_PRIORITY = executeOutWorkAreaPara.OutWorkAreaEntity.priority, CN_S_END_AREA = executeOutWorkAreaPara.OutWorkAreaEntity.endArea ?? executeOutWorkAreaPara.EndStockAreaEntity.S_AREA_CODE, 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 = executeOutWorkAreaPara.OutWorkAreaEntity.qtyIndex, CN_C_END_IS_CONTROL_QTY = executeOutWorkAreaPara.EndStockAreaEntity.S_CONTROL_QTY, CN_S_END_AREA_TYPE = executeOutWorkAreaPara.EndStockAreaEntity.S_NOTE, CN_C_START_IS_CONTROL_QTY = executeOutWorkAreaPara.StartStockAreaEntity.S_CONTROL_QTY, CN_S_START_AREA_TYPE = executeOutWorkAreaPara.StartStockAreaEntity.S_NOTE, CN_S_REMARK = executeOutWorkAreaPara.OutWorkAreaEntity.remark }; executeOutWorkAreaPara.TransportList.Add(entity); return executeOutWorkAreaPara; } public virtual ExecuteOutWorkAreaPara OutWorkAreaCreateTask(ref ExecuteOutWorkAreaPara executeOutWorkAreaPara, LogPara logPara) { var Subs = Expressionable.Create(); WcsReturnEntityTwo WcsRet = new WcsReturnEntityTwo(); var S_WH_CODE = executeOutWorkAreaPara.StartStockAreaEntity.S_WH_CODE; var S_AREA_CODE = executeOutWorkAreaPara.StartStockAreaEntity.S_AREA_CODE; var N_ROADWAY = executeOutWorkAreaPara.StartLocationExt.N_ROADWAY; var S_Jb_Bit = ""; var S_Subtask = ""; //任务 var transport = executeOutWorkAreaPara.TransportList.FirstOrDefault(); executeOutWorkAreaPara.WorkAreaProEntity = executeOutWorkAreaPara.WorkAreaProEntitys.Find(e => e.S_StartArea == transport.CN_S_START_AREA && e.S_EndArea == transport.CN_S_END_AREA); Subs.And(it => it.S_WH_CODE == S_WH_CODE); Subs.And(it => it.S_AREA_CODE == S_AREA_CODE); Subs.And(it => it.N_ROADWAY == N_ROADWAY); Subs.And(it => it.S_IS_IN_OUT == "出库"); var Subsidiary = SqlSugarHelper.Db.Queryable().Where(Subs.ToExpression()).ToList(); if (Subsidiary.Count() == 0 && executeOutWorkAreaPara.OutWorkAreaEntity.NoAssist != "Y") { executeOutWorkAreaPara.BasisResponse = OperateResult.Error($"辅助表未查询到对应的库区数据 请核实 仓库:{S_WH_CODE} 库区:{S_AREA_CODE} 巷道:{N_ROADWAY} 流程去向:出库"); throw new Exception($"辅助表未查询到对应的库区数据 请核实 仓库:{S_WH_CODE} 库区:{S_AREA_CODE} 巷道:{N_ROADWAY} 流程去向:出库"); } var Subsidia = Subsidiary.FirstOrDefault(); executeOutWorkAreaPara.WorkSubsidiary = Subsidia; if (Subsidia?.S_AREA_TYPE == Constants.Area_Struc_LiStock && Subsidia?.S_YN_JOBPATH != "Y") { S_Jb_Bit = Subsidia.S_CONNECTION; } else { if (!string.IsNullOrEmpty(executeOutWorkAreaPara?.WorkAreaProEntity?.S_FlowNo)) { var S_FlowNo = executeOutWorkAreaPara?.WorkAreaProEntity?.S_FlowNo; LogHelper.Info("出库", $"流程编码为:{S_FlowNo}"); var ttr = Subsidiary.Find(e => e.S_FlowNo == S_FlowNo); LogHelper.Info("出库", $"作业流程编码查辅助表数据{JsonConvert.SerializeObject(ttr)}"); var Location = ttr.S_CONNECTION.Split(',').ToList(); var IsJb = SqlSugarHelper.Db.Queryable().Where(e => e.S_IsOpen == "N" && Location.Contains(e.S_JbBit)).ToList(); if (IsJb.Count() > 0) { var A = 0; var lo = new List(); if (S_AREA_CODE == "LC11M") { WcsRet = BLLCreator.Create().WcsPositionAvailableCk(executeOutWorkAreaPara.OutWorkAreaEntity.taskNo); } foreach (var item in Location) { if (S_AREA_CODE == "LC11M") { if (N_ROADWAY == 1) { var Jbw1 = IsJb.Find(e => e.S_JbBit == "TMCKHCW-01"); if (Jbw1 != null) { if (item == "TMCKJBW-02" || item == "TMCKJBW-03") { if (WcsRet.code == "0") { if (WcsRet.available.Contains("TMCKJBW-02") || WcsRet.available.Contains("TMCKJBW-03")) { continue; } } } } } if (N_ROADWAY == 4) { var Jbw3 = IsJb.Find(e => e.S_JbBit == "TMCKHCW-02"); if (Jbw3 != null) { if (item == "TMCKJBW-05" || item == "TMCKJBW-06") { if (WcsRet.code == "0") { if (WcsRet.available.Contains("TMCKJBW-02") || WcsRet.available.Contains("TMCKJBW-03")) { continue; } } } } } } if (S_AREA_CODE == "LC11M") { if (IsJb.FindAll(e => e.S_JbBit == item).ToList().Count() == 0 && WcsRet.available.Contains(item)) { A++; lo.Add(item); } } else { if (IsJb.FindAll(e => e.S_JbBit == item).ToList().Count() == 0) { A++; lo.Add(item); } } } if (Location.Count() == A && ttr != null) { S_Jb_Bit = ttr.S_CONNECTION; } else { S_Jb_Bit = String.Join(",", lo); } } else { if (ttr != null) { //executeOutWorkAreaPara.WorkSubsidiary = ttr; S_Jb_Bit = ttr.S_CONNECTION; } else { S_Jb_Bit = ""; } } } else { S_Jb_Bit = ""; } //S_Jb_Bit = executeOutWorkAreaPara?.WorkAreaProEntity?.S_Jb_Bit; if (string.IsNullOrEmpty(S_Jb_Bit) && executeOutWorkAreaPara.OutWorkAreaEntity.NoAssist != "Y") { executeOutWorkAreaPara.BasisResponse = OperateResult.Error($"未筛选出对应的作业流程接驳位,请查询核对{executeOutWorkAreaPara?.WorkAreaProEntity?.S_Jb_Bit} 仓库:{S_WH_CODE} 库区:{S_AREA_CODE} 巷道:{N_ROADWAY} 流程去向:出库 流程编码为{executeOutWorkAreaPara?.WorkAreaProEntity?.S_FlowNo} ,请确定立库是否报警"); throw new Exception($"未筛选出对应的作业流程接驳位,请查询核对{executeOutWorkAreaPara?.WorkAreaProEntity?.S_Jb_Bit} 仓库:{S_WH_CODE} 库区:{S_AREA_CODE} 巷道:{N_ROADWAY} 流程去向:出库 流程编码为{executeOutWorkAreaPara?.WorkAreaProEntity?.S_FlowNo}, 请确定立库是否报警"); } } //添加任务 string objectTask = ""; if (string.IsNullOrEmpty(executeOutWorkAreaPara.WorkAreaProEntity?.S_Subtask)) { S_Subtask = executeOutWorkAreaPara.OutWorkAreaEntity?.S_Subtask; } else { S_Subtask = executeOutWorkAreaPara.WorkAreaProEntity?.S_Subtask; } if (Subsidia?.S_YN_JOBPATH == "Y") { if (executeOutWorkAreaPara.WorkAreaProEntity?.S_Subtask != "Y") { if (executeOutWorkAreaPara.WorkAreaProEntity?.S_TransAgv == "Y") { objectTask = Constants.TaskFlag_AGV; executeOutWorkAreaPara.objectTask = Constants.TaskFlag_AGV; } if (executeOutWorkAreaPara.WorkAreaProEntity?.S_TransWcs == "Y") { objectTask = Constants.TaskFlag_LG; executeOutWorkAreaPara.objectTask = Constants.TaskFlag_LG; } } } else { if (executeOutWorkAreaPara.OutWorkAreaEntity?.S_Subtask != "Y") { if (executeOutWorkAreaPara.OutWorkAreaEntity.S_TransAgv == "Y") { objectTask = Constants.TaskFlag_AGV; executeOutWorkAreaPara.objectTask = Constants.TaskFlag_AGV; } if (executeOutWorkAreaPara.OutWorkAreaEntity.S_TransWcs == "Y") { objectTask = Constants.TaskFlag_LG; executeOutWorkAreaPara.objectTask = Constants.TaskFlag_LG; } if (string.IsNullOrEmpty(S_Jb_Bit)) { S_Jb_Bit = executeOutWorkAreaPara.OutWorkAreaEntity.S_Jb_Bit; } } else { if (executeOutWorkAreaPara.OutWorkAreaEntity.S_TransAgv == "Y") { objectTask = Constants.TaskFlag_AGV; } if (executeOutWorkAreaPara.OutWorkAreaEntity.S_TransWcs == "Y") { objectTask = Constants.TaskFlag_LG; } } } if (string.IsNullOrEmpty(executeOutWorkAreaPara.objectTask)) { if (string.IsNullOrEmpty(S_Jb_Bit)) { throw new Exception("出库自管任务,接驳位为空"); } } var S_TOOLS_TPYE = executeOutWorkAreaPara.LocCntr?.S_TYPE; //判断是否是 立库 如果是的话 获取接驳位和准备点 SqlSugarHelper.Db.BeginTran(); WMSTask Task = new WMSTask(); Task.S_TASK_NO = transport.CN_S_TASK_NO; Task.S_START_LAREA = transport.CN_S_START_AREA; Task.S_END_LAREA = transport.CN_S_END_AREA; Task.S_START_LOC = transport.CN_S_START_BIT; Task.S_END_LOC = transport.CN_S_END_BIT; Task.S_TYPE = executeOutWorkAreaPara.OutWorkAreaEntity.IsTransport == "Y" ? "转运" : "出库"; Task.S_B_STATE = "未执行"; Task.S_CNTRS = transport.CN_S_CIR_OBJ_CODE; Task.N_CNTR_COUNT = 1; Task.N_PRIORITY = transport.CN_N_PRIORITY; Task.S_NOTE = executeOutWorkAreaPara.objectTask ?? "自管任务"; Task.S_READ_LOCK = "N"; Task.S_Subtask = executeOutWorkAreaPara.WorkAreaProEntity?.S_Subtask; Task.S_FlowNo = executeOutWorkAreaPara.WorkAreaProEntity?.S_FlowNo; Task.S_Jb_Bit = S_Jb_Bit; Task.S_SRC_SYS = executeOutWorkAreaPara.OutWorkAreaEntity.TaskOrderType; Task.S_Zb_Bit = executeOutWorkAreaPara.WorkAreaProEntity?.S_Zb_Bit; Task.S_UpstreamNo = executeOutWorkAreaPara.OutWorkAreaEntity.mesTaskNo; Task.S_SRC_NO = transport.CN_S_TASK_NO; Task.S_TOOLS_TPYE = executeOutWorkAreaPara.OutWorkAreaEntity.TrayType ?? S_TOOLS_TPYE; Task.S_Main_task = "主任务"; var C = SqlSugarHelper.Db.Insertable(Task).ExecuteCommand(); executeOutWorkAreaPara.TaskEntity = Task; LogHelper.Info("出库", " 创建任务结束"); if (C == 0) { SqlSugarHelper.Db.RollbackTran(); executeOutWorkAreaPara.BasisResponse = OperateResult.Error("创建任务失败"); throw new Exception("创建任务失败"); } return executeOutWorkAreaPara; } public virtual ExecuteOutWorkAreaPara OutWorkAreaProcedure(ref ExecuteOutWorkAreaPara executeOutWorkAreaPara, LogPara logPara) { executeOutWorkAreaPara.TaskExecuteState = new TaskExecuteState().Ok(OutWorkAreaOkTaskResponse(executeOutWorkAreaPara.TransportList[0], executeOutWorkAreaPara.OutWorkAreaEntity.itemCode, executeOutWorkAreaPara.index), null); return executeOutWorkAreaPara; } public virtual OkTask OutWorkAreaOkTaskResponse(TN_WM_TRANSPORT_TASKEntity trans, string itemCode, int index) { if (trans.CN_S_START_AREA_TYPE == Constants.Area_Struc_LiuLiStock || trans.CN_S_START_AREA_TYPE == Constants.Area_Struc_DuiDieStock) { trans.CN_S_START_BIT += "_" + trans.CN_S_QTY_INDEX; } var okTask = new OkTask() { index = index, taskNo = trans.CN_S_TASK_NO, startStock = trans.CN_S_STOCK_CODE, startArea = trans.CN_S_START_AREA, startBit = trans.CN_S_START_BIT, endStock = trans.CN_S_STOCK_CODE, endArea = trans.CN_S_END_AREA, endBit = trans.CN_S_END_BIT, priority = trans.CN_N_PRIORITY, trayCode = trans.CN_S_CIR_OBJ_CODE, itemCode = itemCode }; return okTask; } } /// /// 转运 /// public class TransportTaskBll { /// /// 点对点转运 /// /// /// public OperateResult TransportTask(OutWorkAreaEntity Model) { var chi = new SqlHelper().GetInstance(); var newDb = chi.CopyNew(); try { //判断起点终点是否为空 if (string.IsNullOrEmpty(Model.startBit)) { throw new Exception("点对点任务起点不能为空"); } if (string.IsNullOrEmpty(Model.endBit)) { throw new Exception("点对点任务终点不能为空"); } if (string.IsNullOrEmpty(Model.S_Subtask)) { throw new Exception("是否下任务给AGV开关不允许为空 要么N 要么Y S_Subtask字段"); } if (string.IsNullOrEmpty(Model.S_TransAgv)) { throw new Exception("是否下任务给立库开关不允许为空 要么N 要么Y S_TransAgv字段"); } if (string.IsNullOrEmpty(Model.S_TransWcs)) { throw new Exception("是否分发立库任务开关不允许为空 要么N 要么Y S_TransWcs字段"); } //验证起点 #region 验证起点 var startBit = Model.startBit?.Trim(); var StartLocationExt = SqlSugarHelper.Db.Queryable().Where(e => e.S_LOC_CODE == startBit)?.First(); if (!StartLocationExt.S_LOCK_STATE.Equals("无")) { throw new Exception("当前起点货位状态为:" + StartLocationExt.S_LOCK_STATE + ",不允许下任务!"); } var AreaCode = StartLocationExt.S_AREA_CODE; var StartStockAreaEntity = SqlSugarHelper.Db.Queryable().Where(e => e.S_AREA_CODE == AreaCode)?.First(); if (StartStockAreaEntity == null) { throw new Exception("给定起点位置库区:" + startBit + "不存在!"); } //SqlSugarHelper.Db.Queryable().Where(e => e.S_LOC_CODE == startBit)?.First(); LocCntrRel trayLocation = new LocCntrRel(); if (string.IsNullOrEmpty(StartStockAreaEntity.S_CONTROL_QTY)) { throw new Exception("起点库区是否管控字段为空"); } if (StartStockAreaEntity.S_CONTROL_QTY == "Y") { trayLocation = SqlSugarHelper.Db.Queryable().Where(e => e.S_LOC_CODE == startBit)?.First(); if (trayLocation == null) { throw new Exception("当前起点未绑定托盘"); } Model.trayCode = trayLocation.S_CNTR_CODE; } else { if (string.IsNullOrEmpty(Model.trayCode)) { throw new Exception("点对点任务工装编号不能为空"); } } #endregion //验证终点 //获取终点库区信息 #region 验证终点 var endBit = Model.endBit; var EndLocationExt = SqlSugarHelper.Db.Queryable().Where(e => e.S_LOC_CODE == endBit)?.First(); LogHelper.Info("转运", "查询终点货位:" + JsonConvert.SerializeObject(EndLocationExt)); if (EndLocationExt == null) { throw new Exception("未查询到当前终点货位信息"); } if (EndLocationExt.C_ENABLE != "Y") { throw new Exception("查询到当前终点货位信息未在启用状态"); } var EndArea = EndLocationExt.S_AREA_CODE; var EndStockAreaEntity = SqlSugarHelper.Db.Queryable().Where(e => e.S_AREA_CODE == EndArea)?.First(); LogHelper.Info("转运", "查询终点货位库区:" + JsonConvert.SerializeObject(EndStockAreaEntity)); if (EndStockAreaEntity == null) { throw new Exception("给定的目的位置未找到库区"); } // 检查货位状态 是转运且管控数量时使用 if (string.IsNullOrEmpty(EndStockAreaEntity.S_CONTROL_QTY)) { throw new Exception("终点库区是否管控字段为空"); } if (EndStockAreaEntity.S_CONTROL_QTY.Equals("Y")) { if (!EndLocationExt.S_LOCK_STATE.Equals("无")) { throw new Exception("当前终点货位状态为:" + EndLocationExt.S_LOCK_STATE + ",货位不可用!"); } if (EndLocationExt.N_CURRENT_NUM > 0) { throw new Exception("当前货位容量为" + EndLocationExt.N_CURRENT_NUM + ",货位不可用!"); } } #endregion var objectTask = ""; #region 判断任务类型 if (Model.S_Subtask == "Y") { objectTask = Constants.TaskFlag_ZG; if (Model.S_TransAgv == "N" && Model.S_TransWcs == "N") { throw new Exception("禁止 通知任务AGV和立库开关全部为N"); } } else { if (Model.S_TransAgv == "N" && Model.S_TransWcs == "N") { throw new Exception("禁止 通知任务开关全部为N"); } if (Model.S_TransAgv == "Y") { objectTask = Constants.TaskFlag_AGV; } else if (Model.S_TransWcs == "Y") { objectTask = Constants.TaskFlag_LG; } } #endregion #region 生成转运任务号 var taskNo = BLLCreator.Create().TaskNo("ZY"); if (string.IsNullOrEmpty(taskNo)) { throw new Exception("任务"); } #endregion #region 组装任务 WMSTask Task = new WMSTask(); Task.S_TASK_NO = taskNo; Task.S_START_LAREA = StartLocationExt.S_AREA_CODE; Task.S_END_LAREA = EndLocationExt.S_AREA_CODE; Task.S_START_LOC = StartLocationExt.S_LOC_CODE; Task.S_END_LOC = EndLocationExt.S_LOC_CODE; Task.S_TYPE = "出库"; Task.S_B_STATE = "未执行"; Task.S_CNTRS = Model.trayCode; Task.N_CNTR_COUNT = 1; Task.N_PRIORITY = Model.priority; Task.S_NOTE = objectTask; Task.S_READ_LOCK = "N"; Task.S_Subtask = Model.S_Subtask; Task.S_FlowNo = ""; Task.S_Jb_Bit = ""; Task.S_SRC_SYS = "Mobox"; Task.S_Zb_Bit = ""; Task.S_UpstreamNo = taskNo; #endregion #region 事务即任务下达 try { newDb.BeginTran(); if (StartStockAreaEntity.S_CONTROL_QTY == "Y") { var I = newDb.Updateable().SetColumns(it => it.S_LOCK_STATE == "出库锁").Where(x => x.S_LOC_CODE == startBit && x.S_LOCK_STATE == "无").ExecuteCommand(); if (I == 0) { throw new System.Exception("锁定起点货位失败!"); } LogHelper.Info("转运", $"锁定起点货位成功 影响行数{I}"); } if (EndStockAreaEntity.S_CONTROL_QTY == "Y") { var I = newDb.Updateable().SetColumns(it => it.S_LOCK_STATE == "入库锁").Where(x => x.S_LOC_CODE == endBit && x.S_LOCK_STATE == "无").ExecuteCommand(); if (I == 0) { throw new System.Exception("锁定终点货位失败!"); } LogHelper.Info("转运", $"锁定终点货位成功 影响行数{I}"); } var C = newDb.Insertable(Task).ExecuteCommand(); if (C == 0) { throw new System.Exception("任务生成失败!"); } LogHelper.Info("转运", $"生成任务 影响行数{C}"); #region 判断是否下任务给立库 if (Model.S_Subtask == "N" && Model.S_TransWcs == "Y") { LogHelper.Info("转运", "开始通知立库"); var ta = BLLCreator.CreateSingleton().WcsTaskEntity(Task); LogHelper.Info("转运", "通知立库是否成功:" + JsonConvert.SerializeObject(ta)); LogHelper.Info("转运", "结束通知立库"); if (!ta.Success) { throw new Exception("通知立库失败"); } } #endregion newDb.CommitTran(); return OperateResult.Succeed("成功"); } catch (Exception ex) { newDb.RollbackTran(); LogHelper.Info("转运", "报错:" + ex.Message + ex.StackTrace); return OperateResult.Error(ex.Message + ex.StackTrace); } #endregion } catch (Exception ex) { LogHelper.Info("转运", "报错:" + ex.Message + ex.StackTrace); return OperateResult.Error(ex.Message + ex.StackTrace); } } } }