using IWareCC.CacheInfo; using IWareCC.CacheInfo.Container; using IWareCC.ORM; using IWareCC.Properties; using IWareCC.RGV.Entity; using IWareCommon.Enum.Common; using IWareCommon.Enum.Conveyor; using IWareCommon.Help; using IWareCommon.Util; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace IWareCC.RGV.Handle.DoRgvTaskAuto { public class 选择一个未执行的Rgv的任务 : IHandler { /// /// 该节点的下一个节点 /// private IHandler nextHandler = null; public IHandler NextHandler { set { nextHandler = value; } } private RgvEntity Rgv; /// /// 任务容器 /// private PartTaskContainer DecompositionTaskContainer; /// /// 构造函数 /// /// 结果容器 /// WIP任务容器 public 选择一个未执行的Rgv的任务(PartTaskContainer decompositionTaskContainer) { this.DecompositionTaskContainer = decompositionTaskContainer; } public void Handle() { using (var dbModel = new DbModel()) { try { string msg; var task = dbModel.PartTasks.OrderBy(x => x.priority).ThenBy(x => x.updatetime).FirstOrDefault(x => x.eqtype == (int)EPartTaskType.Rgv任务 && x.isreleased == (int)EYesOrNo.否 && x.isfinished == (int)EYesOrNo.否); if (task == null) { // LogTextHelper.WriteLine(Resources.LogDir + @"/自动执行Rgv任务流程/", "选择一个未执行的Rgv的任务:{0}", "未找到相应的Rgv任务"); return; } else { task.updatetime = DateTime.Now; dbModel.SaveChanges(); int tdevid = (int)((EDeviceId)task.eqid); var rgv = CacheEntity.Rgvs.FirstOrDefault(x => x.DeviceId == tdevid); Rgv = rgv; } ///如果是叠盘任务,必须校验去的位置是否有满托盘回库的任务,如果有不能执行 if (task.maintasktype == (int)EMainTaskType.出库叠盘) { var newtask = dbModel.PartTasks.OrderBy(x => x.priority).ThenBy(x => x.updatetime).FirstOrDefault(x => x.eqtype == (int)EPartTaskType.Rgv任务 && x.isreleased == (int)EYesOrNo.否 && x.isfinished == (int)EYesOrNo.否 && x.maintasktype == (int)EMainTaskType.满空托回库 && x.sourceplace == task.toplace); if (newtask != null) { LogTextHelper.WriteLine(Resources.LogDir + @"/自动执行Rgv任务流程/" + Rgv.RgvName, "选择一个未执行的Rgv的任务:Rgv{0}不能执行任务--{1}", Rgv.RgvName, "满托盘需要回库无法执行叠盘任务"); msg = "有满托盘回库的任务,不能执行出库叠盘"; if (task.filereason != msg) { task.filereason = msg; dbModel.SaveChanges(); } return; } else { int devno = (int)EDeviceId.小盘叠盘机; if (task.containertype != 1) { devno = (int)EDeviceId.大盘叠盘机; } var transporTask = dbModel.ChaiDieTransports.OrderBy(x => x.createtime).FirstOrDefault(x => x.status == 0 && x.type == 2 && x.dev == devno); if (transporTask != null) { msg = "叠盘机已叠满,不能执行叠盘任务!"; if (task.filereason != msg) { task.filereason = msg; dbModel.SaveChanges(); } return; } } } //检测上一任务是否完成 var notfinishtask = dbModel.PartTasks.OrderBy(x => x.priority).ThenBy(x => x.createtime).FirstOrDefault(x => x.eqtype == (int)EPartTaskType.Rgv任务 && x.isreleased == (int)EYesOrNo.是 && x.isfinished == (int)EYesOrNo.否 && x.eqid == Rgv.DeviceId); if (notfinishtask != null) { LogTextHelper.WriteLine(Resources.LogDir + @"/自动执行Rgv任务流程/" + Rgv.RgvName, "选择一个未执行的Rgv的任务:{0}", "当前设备还有未完成的任务"); msg = "上一任务未完成"; if (task.filereason != msg) { task.filereason = msg; dbModel.SaveChanges(); } return; } //检测同一个目标点,上一个rgv任务的完成时间是否超过了10s,如果未超过,则暂时不允许下发新的rgv任务【EditBy shaocx,2022-10-18】 var lastFinishtask = dbModel.PartTasks.OrderByDescending(x => x.createtime).FirstOrDefault(x => x.toplace == task.toplace && x.eqtype == (int)EPartTaskType.Rgv任务 && x.isfinished == (int)EYesOrNo.是 && x.eqid == Rgv.DeviceId); if (lastFinishtask != null && lastFinishtask.finishTime != null) { TimeSpan ts = DateTime.Now - Convert.ToDateTime(lastFinishtask.finishTime); if (ts.TotalSeconds <= 10) { msg = "同一个目标点,上一个rgv任务(" + lastFinishtask.taskcode + ")的完成时间没有超过10s,暂时不允许下发新的rgv任务"; LogTextHelper.WriteLine(Resources.LogDir + @"/自动执行Rgv任务流程/" + Rgv.RgvName, "选择一个未执行的Rgv的任务:{0}", msg); if (task.filereason != msg) { task.filereason = msg; dbModel.SaveChanges(); } return; } } if (!CheckSourAndToPlaceIsEmpty(task, out msg)) { LogTextHelper.WriteLine(Resources.LogDir + @"/自动执行Rgv任务流程/" + Rgv.RgvName, "选择一个未执行的Rgv的任务:{0}", "请检车RGV的起始位或目标位是否有货"); if (task.filereason != msg) { task.filereason = msg; dbModel.SaveChanges(); } return; } if (!Rgv.CanSendTask(Rgv.DeviceId, out msg)) { LogTextHelper.WriteLine(Resources.LogDir + @"/自动执行Rgv任务流程/" + Rgv.RgvName, "选择一个未执行的Rgv的任务:Rgv{0}不能执行任务--{1}", Rgv.RgvName, msg); if (task.filereason != msg) { task.filereason = msg; dbModel.SaveChanges(); } return; } if (task.maintasktype == (int)EMainTaskType.常规入库 && (task.heighttype == 0 || task.targetplace == "0")) { LogTextHelper.WriteLine(Resources.LogDir + @"/自动执行Rgv任务流程/" + Rgv.RgvName, "选择一个未执行的Rgv的任务:Rgv{0}不能执行任务--{1}", Rgv.RgvName, "入库任务未确定入库位置"); msg = "常规入库任务目标位置或者托盘高度没有,无法继续执行!"; if (task.filereason != msg) { task.filereason = msg; dbModel.SaveChanges(); } return; } DecompositionTaskContainer.DecompositionTask = task; LogTextHelper.WriteLine(Resources.LogDir + @"/自动执行Rgv任务流程/" + Rgv.RgvName, "选择一个未执行的Rgv的任务:{0}", DecompositionTaskContainer.DecompositionTask.id); if (nextHandler != null) { nextHandler.Handle(); } } catch (Exception ex) { LogTextHelper.WriteLog(Resources.LogDir, this.ToString(), "Handle", ex.Message); } } } /// /// 验证目标位置是否为空 /// /// /// public bool CheckSourAndToPlaceIsEmpty(PartTask task, out string msg) { if (task != null) { int tasktype = task.maintasktype; bool b1 = false; msg = ""; switch (tasktype) { case (int)EMainTaskType.常规入库: string name = "Line" + task.sourceplace; var sconveyor = CacheEntity.Conveyors.FirstOrDefault(x => x.ConveyorName == name); if ((sconveyor != null && (sconveyor.RPh1 == 1 && sconveyor.RPh2 == 1))) { b1 = true; } else { b1 = false; msg = "起始位置未检测到货物,请查看广电是否检测到"; LogTextHelper.WriteLine(Resources.LogDir + @"/自动执行Rgv任务流程/" + Rgv.RgvName, "{0}端口不为空:{1},{2}", sconveyor.ConveyorName, sconveyor.RPh1, sconveyor.RPh2); } string tname = "Line" + task.toplace; var tconveyor = CacheEntity.Conveyors.FirstOrDefault(x => x.ConveyorName == tname); if ((tconveyor != null && (tconveyor.RPh1 == 2 && tconveyor.RPh2 == 2 && tconveyor.RPh3 == 2))) { b1 = true; } else { b1 = false; msg = "目标位置检测到有货物,请确认无货才允许执行"; LogTextHelper.WriteLine(Resources.LogDir + @"/自动执行Rgv任务流程/" + Rgv.RgvName, "{0}端口不为空:{1},{2}", tconveyor.ConveyorName, tconveyor.RPh1, tconveyor.RPh2); } break; case (int)EMainTaskType.常规出库: if (task.toplace == "1001") { string t1name = "Line" + task.toplace; var t1conveyor = CacheEntity.Conveyors.FirstOrDefault(x => x.ConveyorName == t1name); if ((t1conveyor != null && (t1conveyor.RPh1 == 2 && t1conveyor.RPh2 == 2))) { b1 = true; } else { b1 = false; msg = "目标位置检测到有货物,请确认无货才允许执行"; LogTextHelper.WriteLine(Resources.LogDir + @"/自动执行Rgv任务流程/" + Rgv.RgvName, "{0}端口不为空:{1},{2}", t1conveyor.ConveyorName, t1conveyor.RPh1, t1conveyor.RPh2); } } else if (task.toplace == "1011") { string t2name = "Line1012"; var t2conveyor = CacheEntity.Conveyors.FirstOrDefault(x => x.ConveyorName == t2name); if ((t2conveyor != null && (t2conveyor.RPh1 == 2 && t2conveyor.RPh2 == 2))) { b1 = true; } else { b1 = false; msg = "目标位置检测到有货物,请确认无货才允许执行"; LogTextHelper.WriteLine(Resources.LogDir + @"/自动执行Rgv任务流程/" + Rgv.RgvName, "{0}端口不为空:{1},{2}", t2conveyor.ConveyorName, t2conveyor.RPh1, t2conveyor.RPh2); } } else if (task.toplace == "1005") { string t3name = "Line1006"; var t3conveyor = CacheEntity.Conveyors.FirstOrDefault(x => x.ConveyorName == t3name); if ((t3conveyor != null && (t3conveyor.RPh1 == 2 && t3conveyor.RPh2 == 2))) { b1 = true; } else { b1 = false; msg = "目标位置检测到有货物,请确认无货才允许执行"; LogTextHelper.WriteLine(Resources.LogDir + @"/自动执行Rgv任务流程/" + Rgv.RgvName, "{0}端口不为空:{1},{2}", t3conveyor.ConveyorName, t3conveyor.RPh1, t3conveyor.RPh2); } } else { b1 = false; } break; case (int)EMainTaskType.出库叠盘: if (task.sourceplace == "1001") { string t1name = "Line" + task.sourceplace; var t1conveyor = CacheEntity.Conveyors.FirstOrDefault(x => x.ConveyorName == t1name); if ((t1conveyor != null && (t1conveyor.RPh1 == 1 && t1conveyor.RPh2 == 1))) { b1 = true; } else { b1 = false; msg = "起始位置未检测到货物,请查看广电是否检测到"; LogTextHelper.WriteLine(Resources.LogDir + @"/自动执行Rgv任务流程/" + Rgv.RgvName, "{0}端口不为空:{1},{2}", t1conveyor.ConveyorName, t1conveyor.RPh1, t1conveyor.RPh2); } } else if (task.sourceplace == "1007") { string t2name = "Line1008"; var t2conveyor = CacheEntity.Conveyors.FirstOrDefault(x => x.ConveyorName == t2name); if ((t2conveyor != null && (t2conveyor.RPh1 == 1 && t2conveyor.RPh2 == 1))) { b1 = true; } else { b1 = false; msg = "起始位置未检测到货物,请查看广电是否检测到"; LogTextHelper.WriteLine(Resources.LogDir + @"/自动执行Rgv任务流程/" + Rgv.RgvName, "{0}端口不为空:{1},{2}", t2conveyor.ConveyorName, t2conveyor.RPh1, t2conveyor.RPh2); } } else if (task.sourceplace == "1002") { string t3name = "Line1003"; var t3conveyor = CacheEntity.Conveyors.FirstOrDefault(x => x.ConveyorName == t3name); if ((t3conveyor != null && (t3conveyor.RPh1 == 1 && t3conveyor.RPh2 == 1))) { b1 = true; } else { b1 = false; msg = "起始位置未检测到货物,请查看广电是否检测到"; LogTextHelper.WriteLine(Resources.LogDir + @"/自动执行Rgv任务流程/" + Rgv.RgvName, "{0}端口不为空:{1},{2}", t3conveyor.ConveyorName, t3conveyor.RPh1, t3conveyor.RPh2); } } else { b1 = false; } break; case (int)EMainTaskType.满空托回库: string tmname = "Line" + task.toplace; var tmconveyor = CacheEntity.Conveyors.FirstOrDefault(x => x.ConveyorName == tmname); if ((tmconveyor != null && (tmconveyor.RPh1 == 2 && tmconveyor.RPh2 == 2 && tmconveyor.RPh3 == 2))) { b1 = true; } else { b1 = false; msg = "目标位置检测到有货物,请确认无货才允许执行"; LogTextHelper.WriteLine(Resources.LogDir + @"/自动执行Rgv任务流程/" + Rgv.RgvName, "{0}端口不为空:{1},{2}", tmconveyor.ConveyorName, tmconveyor.RPh1, tmconveyor.RPh2); } break; case (int)EMainTaskType.余料回库: string tvname = "Line" + task.toplace; var tyconveyor = CacheEntity.Conveyors.FirstOrDefault(x => x.ConveyorName == tvname); if ((tyconveyor != null && (tyconveyor.RPh1 == 2 && tyconveyor.RPh2 == 2 && tyconveyor.RPh3 == 2))) { b1 = true; } else { b1 = false; msg = "目标位置检测到有货物,请确认无货才允许执行"; LogTextHelper.WriteLine(Resources.LogDir + @"/自动执行Rgv任务流程/" + Rgv.RgvName, "{0}端口不为空:{1},{2}", tyconveyor.ConveyorName, tyconveyor.RPh1, tyconveyor.RPh2); } if (task.sourceplace == "1001") { string t1name = "Line" + task.sourceplace; var t1conveyor = CacheEntity.Conveyors.FirstOrDefault(x => x.ConveyorName == t1name); if ((t1conveyor != null && (t1conveyor.RPh1 == 1 && t1conveyor.RPh2 == 1))) { b1 = true; } else { b1 = false; msg = "起始位置未检测到货物,请查看广电是否检测到"; LogTextHelper.WriteLine(Resources.LogDir + @"/自动执行Rgv任务流程/" + Rgv.RgvName, "{0}端口不为空:{1},{2}", t1conveyor.ConveyorName, t1conveyor.RPh1, t1conveyor.RPh2); } } else if (task.sourceplace == "1007") { string t2name = "Line1008"; var t2conveyor = CacheEntity.Conveyors.FirstOrDefault(x => x.ConveyorName == t2name); if ((t2conveyor != null && (t2conveyor.RPh1 == 1 && t2conveyor.RPh2 == 1))) { b1 = true; } else { b1 = false; msg = "起始位置未检测到货物,请查看广电是否检测到"; LogTextHelper.WriteLine(Resources.LogDir + @"/自动执行Rgv任务流程/" + Rgv.RgvName, "{0}端口不为空:{1},{2}", t2conveyor.ConveyorName, t2conveyor.RPh1, t2conveyor.RPh2); } } else if (task.sourceplace == "1002") { string t3name = "Line1003"; var t3conveyor = CacheEntity.Conveyors.FirstOrDefault(x => x.ConveyorName == t3name); if ((t3conveyor != null && (t3conveyor.RPh1 == 1 && t3conveyor.RPh2 == 1))) { b1 = true; } else { b1 = false; msg = "起始位置未检测到货物,请查看广电是否检测到"; LogTextHelper.WriteLine(Resources.LogDir + @"/自动执行Rgv任务流程/" + Rgv.RgvName, "{0}端口不为空:{1},{2}", t3conveyor.ConveyorName, t3conveyor.RPh1, t3conveyor.RPh2); } } else { b1 = false; } break; case (int)EMainTaskType.组盘出库: bool bt1 = false; string tzname = "Line" + task.toplace; var tzconveyor = CacheEntity.Conveyors.FirstOrDefault(x => x.ConveyorName == tzname); if ((tzconveyor != null && (tzconveyor.RPh1 == 2 && tzconveyor.RPh2 == 2)) && tzconveyor.RState == (int)EConveyorState.空闲) { bt1 = true; } else { bt1 = false; LogTextHelper.WriteLine(Resources.LogDir + @"/自动执行Rgv任务流程/" + Rgv.RgvName, "{0}端口不为空:{1},{2}", tzconveyor.ConveyorName, tzconveyor.RPh1, tzconveyor.RPh2); } bool bt2 = false; string t8name = "Line" + (int.Parse(task.toplace) - 1).ToString(); var ti1conveyor = CacheEntity.Conveyors.FirstOrDefault(x => x.ConveyorName == t8name); if ((ti1conveyor != null && (ti1conveyor.RPh1 == 2 && ti1conveyor.RPh2 == 2)) && ti1conveyor.RState == (int)EConveyorState.空闲) { bt2 = true; } else { bt2 = false; LogTextHelper.WriteLine(Resources.LogDir + @"/自动执行Rgv任务流程/" + Rgv.RgvName, "{0}端口不为空:{1},{2},{3}", ti1conveyor.ConveyorName, ti1conveyor.RPh1, ti1conveyor.RPh2, ti1conveyor.RState); } bool bt3 = false; string t10name = "Line" + (int.Parse(task.toplace) - 2).ToString(); var ti10conveyor = CacheEntity.Conveyors.FirstOrDefault(x => x.ConveyorName == t10name); if ((ti10conveyor != null && (ti10conveyor.RPh1 == 2 && ti10conveyor.RPh2 == 2)) && ti10conveyor.RState == (int)EConveyorState.空闲) { bt3 = true; } else { bt3 = false; LogTextHelper.WriteLine(Resources.LogDir + @"/自动执行Rgv任务流程/" + Rgv.RgvName, "{0}端口不为空:{1},{2},{3}", ti10conveyor.ConveyorName, ti10conveyor.RPh1, ti10conveyor.RPh2, ti10conveyor.RState); } bool bt4 = false; string t9name = "Line" + (int.Parse(task.toplace) - 3).ToString(); var ti2conveyor = CacheEntity.Conveyors.FirstOrDefault(x => x.ConveyorName == t9name); if ((ti2conveyor != null && (ti2conveyor.RPh1 == 2 && ti2conveyor.RPh2 == 2)) && ti2conveyor.RState == (int)EConveyorState.空闲) { bt4 = true; } else { bt4 = false; LogTextHelper.WriteLine(Resources.LogDir + @"/自动执行Rgv任务流程/" + Rgv.RgvName, "{0}端口不为空:{1},{2},{3}", ti2conveyor.ConveyorName, ti2conveyor.RPh1, ti2conveyor.RPh2, ti2conveyor.RState); } if (bt1 && bt2 && bt3 && bt4) { b1 = true; LogTextHelper.WriteLine(Resources.LogDir + @"/自动执行Rgv任务流程/" + Rgv.RgvName, "出库组盘可下发任务号:{0},起始位置;{1},目标位置:{2}", task.id, task.sourceplace, task.toplace); } else { msg = "目标位置检测到有货物,请确认无货才允许执行"; b1 = false; } break; default: b1 = true; break; } return b1; } else { msg = "未找到任务起始位置与目标位置验证失败"; return false; } } } }