AgvSystems.cs 29 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391
  1. using Microsoft.AspNetCore.DataProtection.KeyManagement;
  2. using Newtonsoft.Json;
  3. using PlcSiemens.Core.Extension;
  4. using ServiceCenter.Extensions;
  5. using ServiceCenter.Logs;
  6. using ServiceCenter.Redis;
  7. using ServiceCenter.SqlSugars;
  8. using System.ComponentModel;
  9. using WCS.Core;
  10. using WCS.Entity;
  11. using WCS.Entity.Protocol.SRM;
  12. using WCS.Entity.Protocol.Station;
  13. using WCS.WorkEngineering.Extensions;
  14. using WCS.WorkEngineering.WebApi.Controllers;
  15. using WCS.WorkEngineering.Worlds;
  16. using static System.Runtime.InteropServices.JavaScript.JSType;
  17. using DeviceFlags = WCS.WorkEngineering.Extensions.DeviceFlags;
  18. namespace WCS.WorkEngineering.Systems
  19. {
  20. /// <summary>
  21. /// Agv交互系统
  22. /// </summary>
  23. [BelongTo(typeof(AgvWorld))]
  24. [Description("Agv交互系统")]
  25. public class AgvSystems : DeviceSystem<Station>
  26. {
  27. protected override bool ParallelDo => true;
  28. protected override bool SaveLogsToFile => true;
  29. private List<Station> devs = new List<Station>();
  30. private List<SRM> srms = new List<SRM>();
  31. public AgvSystems()
  32. {
  33. var stations = new List<string>() { "1011", "1012", "1013", "1014", "1015", "1016", "1021", "1022", "1023", "1024", "1025", "1026", "1117", "1118",
  34. "1131", "1132", "1133", "1134", "1135", "1136", "1137", "1138", "1139","1127" };
  35. devs = Device.All.Where(v => stations.Contains(v.Code)).Select(v => new Station(v, this.World)).ToList();
  36. srms = Device.All.Where(v => v.Code is "SRM1" or "SRM2" or "SRM3" or "SRM4").Select(v => new SRM(v, this.World)).ToList();
  37. }
  38. public override void Do(Station obj)
  39. {
  40. if (obj.Entity.Code == "1018"/*.HasFlag(DeviceFlags.出库)*/)
  41. {
  42. List<WCS_AgvTaskInfo> agvTaskInfos = new List<WCS_AgvTaskInfo>();
  43. //获取所有未结束的叫料及背负式补空AGV任务
  44. SqlSugarHelper.Do(db =>
  45. {
  46. agvTaskInfos = db.Default.Queryable<WCS_AgvTaskInfo>().Where(v => (v.TaskType == AGVTaskType.CallMaterial || v.TaskType == AGVTaskType.CallForMaterial || v.TaskType == AGVTaskType.ForkliftFilling))
  47. .Where(v => v.Status < AGVTaskStatus.MissionCompleted)
  48. .SplitTable(tabs => tabs.Take(2)).OrderBy(v => v.AddTime).ToList();
  49. });
  50. //有需要处理的AGV任务
  51. if (agvTaskInfos.Any())
  52. {
  53. //this.ExRecord(obj.Entity.Code, "可用出库AGV任务列表", agvTaskInfos.Select(v => v.ID).ToList());
  54. //List<WCS_TaskInfo> taskInfos = new List<WCS_TaskInfo>();
  55. foreach (var agv in agvTaskInfos)
  56. {
  57. try
  58. {
  59. SqlSugarHelper.Do(db =>
  60. {
  61. //取货点安全交互
  62. if (agv.AgvStatus == AGVTaskStatus.RequestOrPermission2 && agv.Status != AGVTaskStatus.Complete2)
  63. {
  64. var taskInfo = db.Default.Queryable<WCS_TaskInfo>().First(v => v.AgvTaskID == agv.ID);
  65. agv.Status = AGVTaskStatus.Complete2;
  66. db.Default.Updateable(agv).SplitTable(x => x.Take(2)).ExecuteCommand();
  67. taskInfo.AddWCS_TASK_DTL(db, "agv", $"允许AGV任务{agv.ID}在站台{agv.Station}取货");
  68. AgvApi.ContinueTask(agv.AgvID, agv.Station);
  69. }
  70. //完成任务
  71. else if (agv.AgvStatus == AGVTaskStatus.MissionCompleted && agv.Status != AGVTaskStatus.MissionCompleted)
  72. {
  73. if (agv.TaskType is AGVTaskType.CallForMaterial or AGVTaskType.ForkliftFilling or AGVTaskType.CallMaterial)
  74. {
  75. var taskInfo = db.Default.Queryable<WCS_TaskInfo>().First(v => v.AgvTaskID == agv.ID);
  76. if (taskInfo == null) throw new Exception($"未找到AGV任务{agv.ID}对应WCS任务");
  77. //更新AGV任务状态
  78. agv.Status = AGVTaskStatus.MissionCompleted;
  79. db.Default.Updateable(agv).SplitTable(x => x.Take(2)).ExecuteCommand();
  80. //更新WCS任务状态
  81. taskInfo.Status = Entity.TaskStatus.Finish;
  82. taskInfo.EedTime = DateTime.Now;
  83. db.Default.Updateable(taskInfo).ExecuteCommand();
  84. taskInfo.AddWCS_TASK_DTL(db, "agv", "任务完成");
  85. //通知WMS任务完成
  86. WmsApi.CompleteTask(taskInfo.ID);
  87. taskInfo.CompleteOrCancelTasks(db);
  88. //taskInfos.Add(taskInfo);
  89. }
  90. else
  91. {
  92. agv.Status = AGVTaskStatus.MissionCompleted;
  93. db.Default.Updateable(agv).SplitTable(x => x.Take(2)).ExecuteCommand();
  94. }
  95. }
  96. });
  97. }
  98. catch (Exception ex)
  99. {
  100. World.Log(ex.Message, LogLevelEnum.Mid);
  101. this.ExRecord(obj.Entity.Code, ex.Message);
  102. continue;
  103. }
  104. }
  105. //foreach (var item in taskInfos)
  106. //{
  107. // WmsApi.CompleteTask(item.ID);
  108. //}
  109. }
  110. }
  111. else if (obj.Entity.Code == "1017"/*.HasFlag(DeviceFlags.入库)*/)
  112. {
  113. List<WCS_AgvTaskInfo> agvTaskInfos = new List<WCS_AgvTaskInfo>();
  114. //获取所有未结束的入库AGV任务
  115. SqlSugarHelper.Do(db =>
  116. {
  117. agvTaskInfos = db.Default.Queryable<WCS_AgvTaskInfo>().Where(v => v.Status < AGVTaskStatus.MissionCompleted && v.TaskType == AGVTaskType.EnterDepot).SplitTable(tabs => tabs.Take(2)).OrderBy(v => v.EditTime).ToList();
  118. });
  119. if (agvTaskInfos.Any())
  120. {
  121. //this.ExRecord(obj.Entity.Code, "可用入库AGV任务列表", agvTaskInfos.Select(v => v.ID).ToList());
  122. var guid = Guid.NewGuid();
  123. World.Log($"agv任务处理:开始[{guid}]", LogLevelEnum.Mid);
  124. foreach (var agv in agvTaskInfos)
  125. {
  126. try
  127. {
  128. int isApplyContainue = 0;
  129. string agvid = "";
  130. string nextpos = "";
  131. SqlSugarHelper.Do(db =>
  132. {
  133. //找到对应WCS任务
  134. //var task = db.Default.Queryable<WCS_TaskInfo>().First(v => v.AgvTaskID == agv.ID);
  135. //if (task == null) throw new Exception($"AGV任务{agv.ID}未找到对应WCS任务");
  136. var agvInfo = db.Default.Queryable<WCS_AgvTaskInfo>().Where(x => x.ID == agv.ID).SplitTable(s => s.Take(3)).First();
  137. #region 开始跟据AGV状态做出处理
  138. //巷道分配
  139. if (agvInfo.AgvStatus == AGVTaskStatus.RequestOrPermission1 && agvInfo.Status != AGVTaskStatus.Complete1)
  140. {
  141. //找到对应WCS任务
  142. var task = db.Default.Queryable<WCS_TaskInfo>().First(v => v.AgvTaskID == agvInfo.ID);
  143. if (task == null) throw new Exception($"AGV任务{agvInfo.ID}未找到对应WCS任务");
  144. this.ExRecord(obj.Entity.Code, $"AGV任务{agvInfo.ID}开始进行巷道分配");
  145. //向WMS获取巷道优先级'
  146. var res = WmsApi.GetTunnelPriorityList(task.ID);
  147. this.ExRecord(obj.Entity.Code, $"AGV任务{agvInfo.ID},WMS返回巷道优先级{res.ResData}");
  148. var tunnelNo = res.ResData.Split(",").Select(v => "SRM" + v).ToList();
  149. //开始获取堆垛机与可用站台信息
  150. SRM srm = null;
  151. List<Station> stations = new List<Station>();
  152. if (task.Floor == 1) //一楼
  153. {
  154. //一楼三个入库口 新增一个巷道,两个入库口
  155. //proline 6-12
  156. if (agvInfo.WorkShop == 1138)
  157. {
  158. stations = devs.Where(v => v.Entity.Code is "1138").ToList();
  159. //过滤有任务的站台
  160. var taskinstations = db.Default.Queryable<WCS_AgvTaskInfo>().Where(v => v.TaskType == AGVTaskType.EnterDepot && v.Status < AGVTaskStatus.MissionCompleted && (v.Position == "1138")).SplitTable(v => v.Take(2)).Select(v => v.Position).ToList();
  161. stations = stations.Where(p => !taskinstations.Contains(p.Entity.Code)).ToList();
  162. //筛选出可用站台
  163. stations = stations.Where(v => v.Data.VoucherNo == v.Data2.VoucherNo && v.Data3.Status.HasFlag(StatusEunm.Auto))
  164. .Where(v => !v.Data3.Status.HasFlag(StatusEunm.PH_Status) && !v.Data3.Status.HasFlag(StatusEunm.OT_Status))
  165. .Where(v => !v.Data3.Status.HasFlag(StatusEunm.Run)).ToList(); // 筛选出可用站台
  166. //可用堆垛机
  167. srm = stations.Select(v => v.Entity.Sources).SelectMany(v => v).Where(v => v.IsTunnel()) //上一个地址是巷道的
  168. .Select(v => v.Sources).SelectMany(v => v).Where(v => v.HasProtocol(typeof(ISRM520))) //筛选出堆垛机
  169. .Select(v => new SRM(v, this.World)) //转换为SRM
  170. .Where(v => v != null && !v.Data2.Status.HasFlag(SrmStatus.Alarm) && v.Data2.AutoStatus == SrmAutoStatus.Automatic) //筛选出可用堆垛机
  171. .Where(v => tunnelNo.Contains(v.Entity.Code)) //筛选出巷道优先级最高的堆垛机
  172. .MinBy(v => tunnelNo.IndexOf(v.Entity.Code));//按照巷道优先级排序
  173. if (srm == null)
  174. {
  175. stations = devs.Where(v => v.Entity.Code is "1011" or "1013" or "1015" or "1117").ToList();
  176. //过滤有任务的站台
  177. var taskinstations1 = db.Default.Queryable<WCS_AgvTaskInfo>().Where(v => v.TaskType == AGVTaskType.EnterDepot && v.Status < AGVTaskStatus.MissionCompleted && (v.Position == "1011" || v.Position == "1013" || v.Position == "1015" || v.Position == "1117")).SplitTable(v => v.Take(2)).Select(v => v.Position).ToList();
  178. stations = stations.Where(p => !taskinstations1.Contains(p.Entity.Code)).ToList();
  179. //筛选出可用站台
  180. stations = stations.Where(v => v.Data.VoucherNo == v.Data2.VoucherNo && v.Data3.Status.HasFlag(StatusEunm.Auto))
  181. .Where(v => !v.Data3.Status.HasFlag(StatusEunm.PH_Status) && !v.Data3.Status.HasFlag(StatusEunm.OT_Status))
  182. .Where(v => !v.Data3.Status.HasFlag(StatusEunm.Run)).ToList(); // 筛选出可用站台
  183. //可用堆垛机
  184. srm = stations.Select(v => v.Entity.Sources).SelectMany(v => v).Where(v => v.IsTunnel()) //上一个地址是巷道的
  185. .Select(v => v.Sources).SelectMany(v => v).Where(v => v.HasProtocol(typeof(ISRM520))) //筛选出堆垛机
  186. .Select(v => new SRM(v, this.World)) //转换为SRM
  187. .Where(v => v != null && !v.Data2.Status.HasFlag(SrmStatus.Alarm) && v.Data2.AutoStatus == SrmAutoStatus.Automatic) //筛选出可用堆垛机
  188. .Where(v => tunnelNo.Contains(v.Entity.Code)) //筛选出巷道优先级最高的堆垛机
  189. .MinBy(v => tunnelNo.IndexOf(v.Entity.Code));//按照巷道优先级排序
  190. }
  191. }
  192. else
  193. {
  194. stations = devs.Where(v => v.Entity.Code is "1011" or "1013" or "1015" or "1117").ToList();
  195. //过滤有任务的站台
  196. var taskinstations = db.Default.Queryable<WCS_AgvTaskInfo>().Where(v => v.TaskType == AGVTaskType.EnterDepot && v.Status < AGVTaskStatus.MissionCompleted && (v.Position == "1011" || v.Position == "1013" || v.Position == "1015" || v.Position == "1117")).SplitTable(v => v.Take(2)).Select(v => v.Position).ToList();
  197. stations = stations.Where(p => !taskinstations.Contains(p.Entity.Code)).ToList();
  198. //筛选出可用站台
  199. stations = stations.Where(v => v.Data.VoucherNo == v.Data2.VoucherNo && v.Data3.Status.HasFlag(StatusEunm.Auto))
  200. .Where(v => !v.Data3.Status.HasFlag(StatusEunm.PH_Status) && !v.Data3.Status.HasFlag(StatusEunm.OT_Status))
  201. .Where(v => !v.Data3.Status.HasFlag(StatusEunm.Run)).ToList(); // 筛选出可用站台
  202. this.ExRecord(obj.Entity.Code, $"AGV任务{agvInfo.ID},可用放货站台", stations.Select(v => v.Entity.Code).ToList());
  203. //可用堆垛机
  204. srm = stations.Select(v => v.Entity.Sources).SelectMany(v => v).Where(v => v.IsTunnel()) //上一个地址是巷道的
  205. .Select(v => v.Sources).SelectMany(v => v).Where(v => v.HasProtocol(typeof(ISRM520))) //筛选出堆垛机
  206. .Select(v => new SRM(v, this.World)) //转换为SRM
  207. .Where(v => v != null && !v.Data2.Status.HasFlag(SrmStatus.Alarm) && v.Data2.AutoStatus == SrmAutoStatus.Automatic) //筛选出可用堆垛机
  208. .Where(v => tunnelNo.Contains(v.Entity.Code)) //筛选出巷道优先级最高的堆垛机
  209. .MinBy(v => tunnelNo.IndexOf(v.Entity.Code));//按照巷道优先级排序
  210. }
  211. }
  212. else //二楼
  213. {
  214. //二楼三个入库口 新增一个巷道,1个入库口
  215. stations = devs.Where(v => v.Entity.Code is "1021" or "1023" or "1025" or "1127").ToList();
  216. //过滤有任务的站台
  217. var taskinstations = db.Default.Queryable<WCS_AgvTaskInfo>().Where(v => v.TaskType == AGVTaskType.EnterDepot && v.Status < AGVTaskStatus.MissionCompleted && (v.Position == "1021" || v.Position == "1023" || v.Position == "1025" || v.Position == "1127")).SplitTable(v => v.Take(2)).Select(v => v.Position).ToList();
  218. stations = stations.Where(p => !taskinstations.Contains(p.Entity.Code)).ToList();
  219. //筛选出可用站台
  220. stations = stations.Where(v => v.Data.VoucherNo == v.Data2.VoucherNo && v.Data3.Status.HasFlag(StatusEunm.Auto))
  221. .Where(v => !v.Data3.Status.HasFlag(StatusEunm.PH_Status) && !v.Data3.Status.HasFlag(StatusEunm.OT_Status))
  222. .Where(v => !v.Data3.Status.HasFlag(StatusEunm.Run)).ToList(); // 筛选出可用站台
  223. //var putS1 = stations.Select(v => v.Entity.Code);
  224. var dev = devs.Find(v => v.Entity.Code == "1127");
  225. World.Log($"放货站台1127信号凭证号{dev.Data.VoucherNo}-{dev.Data2.VoucherNo}-自动{dev.Data3.Status.HasFlag(StatusEunm.Auto)}-光电{dev.Data3.Status.HasFlag(StatusEunm.PH_Status)}-有货光电{dev.Data3.Status.HasFlag(StatusEunm.OT_Status)}-{dev.Data3.Status.HasFlag(StatusEunm.Run)}");
  226. this.ExRecord(obj.Entity.Code, $"AGV任务{agvInfo.ID},可用放货站台", stations.Select(v => v.Entity.Code).ToList());
  227. //可用堆垛机
  228. srm = stations.Select(v => v.Entity.Sources).SelectMany(v => v).Where(v => v.IsTunnel()) //上一个地址是巷道的
  229. .Select(v => v.Sources).SelectMany(v => v).Where(v => v.HasProtocol(typeof(ISRM520))) //筛选出堆垛机
  230. .Select(v => new SRM(v, this.World)) //转换为SRM
  231. .Where(v => v != null && !v.Data2.Status.HasFlag(SrmStatus.Alarm) && v.Data2.AutoStatus == SrmAutoStatus.Automatic) //筛选出可用堆垛机
  232. .Where(v => tunnelNo.Contains(v.Entity.Code)) //筛选出巷道优先级最高的堆垛机
  233. .MinBy(v => tunnelNo.IndexOf(v.Entity.Code));//按照巷道优先级排序
  234. }
  235. if (srm == null) throw new Exception($"agv任务{agvInfo.ID}无可用堆垛机");
  236. //筛选出堆垛机的放货站台
  237. var nextPos = stations.FirstOrDefault(v => v.Entity.Sources.Where(t => t.IsTunnel()).Select(t => t.Sources).SelectMany(v => v) //获取所有巷道
  238. .Where(t => t.HasProtocol(typeof(ISRM520)))//筛选出堆垛机
  239. .SelectMany(v => v.Sources).Any(t => t.Code == srm.Entity.Parent.Code));
  240. this.ExRecord(obj.Entity.Code, $"AGV任务{agvInfo.ID},放货站台{nextPos}");
  241. bool flag = false;
  242. var agvs = db.Default.Queryable<WCS_AgvTaskInfo>().Where(v => v.Status < AGVTaskStatus.MissionCompleted && v.Position == nextPos.Entity.Code).SplitTable(v => v.Take(2)).ToList();
  243. if (agvs.Any())
  244. {
  245. var msg = "已无可用放货站台,任务正在执行中:";
  246. foreach (var ag in agvs)
  247. {
  248. msg = msg + $"[任务号:{ag.ID},目标地址:{ag.Position}]";
  249. }
  250. throw new Exception(msg);
  251. }
  252. //wcs任务状态卡控,防止因光电异常误判
  253. if (db.Default.Queryable<WCS_TaskInfo>().Any(v => v.AddrNext == nextPos.Entity.Code && v.Status == Entity.TaskStatus.ConveyorExecution)) return;
  254. //if (db.Default.Queryable<WCS_TaskDtl>().SplitTable(v => v.Take(2)).Any(v => v.NextPoint == nextPos.Entity.Code && v.Desc.Contains("任务分配至堆垛机"))) return;
  255. if (RedisHub.Default.Get("TaskTun:" + task.ID) != null && RedisHub.Default.Get("TaskTun:" + task.ID) != nextPos.Entity.Code)
  256. {
  257. throw new Exception("WCS任务:" + task.ID + "已经分配过巷道,不允许重新分配不同巷道");
  258. }
  259. //更新AGV任务状态
  260. agvInfo.Status = AGVTaskStatus.Complete1;
  261. //agv.Position = flag == true ? "1025" : nextPos.Entity.Code;
  262. agvInfo.Position = nextPos.Entity.Code;
  263. var upres1 = db.Default.Updateable(agvInfo).SplitTable(x => x.Take(2)).ExecuteCommand();
  264. //更新WCS任务状态
  265. //if (flag)
  266. //{
  267. // srm.Entity.Code = "SRM3";
  268. // task.Device = srm.Entity.Code;
  269. // task.Tunnel = "3";
  270. // task.AddrNext = "1025";
  271. // task.SrmStation = "1025";
  272. //}
  273. //else
  274. {
  275. task.Device = srm.Entity.Code;
  276. task.Tunnel = task.Device.GetLastDigit().ToString();
  277. task.AddrNext = agvInfo.Position;
  278. task.SrmStation = nextPos.Entity.Code;
  279. }
  280. var upres = db.Default.Updateable(task).ExecuteCommand();
  281. task.AddWCS_TASK_DTL(db, "AGV巷道分配点", nextPos.Entity.Code, $"任务分配至堆垛机:{srm.Entity.Code}");
  282. this.ExRecord(obj.Entity.Code, $"AGV任务{agvInfo.ID}分配至堆垛机:{srm.Entity.Code}");
  283. if (upres > 0 && upres1 > 0)
  284. {
  285. //调继续执行任务接口(监控发现海康接口有不响应的情况,会导致事务不执行,把接口调用拿到事务外面)
  286. //AgvApi.ContinueTask(agvInfo.AgvID, nextPos.Entity.Code);
  287. isApplyContainue = 1;
  288. agvid = agvInfo.AgvID;
  289. nextpos = nextPos.Entity.Code;
  290. RedisHub.Default.Set("TaskTun:" + task.ID, nextPos.Entity.Code, 600);
  291. }
  292. }
  293. //放货站点安全交互
  294. else if (agvInfo.AgvStatus == AGVTaskStatus.RequestOrPermission2 && agvInfo.Status != AGVTaskStatus.Complete2)
  295. {
  296. //找到对应WCS任务
  297. var task = db.Default.Queryable<WCS_TaskInfo>().First(v => v.AgvTaskID == agvInfo.ID);
  298. if (task == null) throw new Exception($"AGV任务{agvInfo.ID}未找到对应WCS任务");
  299. if (agvInfo.Position.IsNullOrEmpty()) throw new Exception($"无有效放货地址");
  300. if (db.Default.Queryable<WCS_TaskInfo>().Any(v => v.AddrNext == agvInfo.Position && v.Status == Entity.TaskStatus.ConveyorExecution)) throw new Exception($"AGV请求放货,但{agvInfo.Position}上任务状态异常"); ;
  301. var dev = devs.Find(v => v.Entity.Code == agvInfo.Position);
  302. if (dev.Data.VoucherNo != dev.Data2.VoucherNo) throw new Exception($"AGV请求放货,但{dev.Entity.Code}凭证号不一致");
  303. if (!dev.Data3.Status.HasFlag(StatusEunm.Auto)) throw new Exception($"AGV请求放货,但{dev.Entity.Code}不在自动状态");
  304. if (dev.Data3.Status.HasFlag(StatusEunm.PH_Status)) throw new Exception($"AGV请求放货,但{dev.Entity.Code}光电有货");
  305. if (dev.Data3.Status.HasFlag(StatusEunm.OT_Status)) throw new Exception($"AGV请求放货,但{dev.Entity.Code}任务有货");
  306. if (dev.Data3.Status.HasFlag(StatusEunm.Run)) throw new Exception($"AGV请求放货,但{dev.Entity.Code}在运行状态");
  307. agvInfo.Status = AGVTaskStatus.Complete2;
  308. db.Default.Updateable(agvInfo).SplitTable(x => x.Take(2)).ExecuteCommand();
  309. dev.Data.TaskNumber = task.ID;
  310. World.Log($"agvRequestOrPermission2:taskid[{dev.Data.TaskNumber}]", LogLevelEnum.Mid);
  311. //调继续执行任务接口
  312. AgvApi.ContinueTask(agvInfo.AgvID, dev.Entity.Code);
  313. }
  314. //完成任务
  315. else if (agvInfo.AgvStatus == AGVTaskStatus.MissionCompleted && agvInfo.Status != AGVTaskStatus.MissionCompleted)
  316. {
  317. agvInfo.Status = AGVTaskStatus.MissionCompleted;
  318. db.Default.Updateable(agvInfo).SplitTable(x => x.Take(2)).ExecuteCommand();
  319. }
  320. #endregion 开始跟据AGV状态做出处理
  321. });
  322. if (isApplyContainue > 0)
  323. {
  324. SqlSugarHelper.Do(db =>
  325. {
  326. var agvInfo = db.Default.Queryable<WCS_AgvTaskInfo>().Where(x => x.AgvID == agvid).SplitTable(s => s.Take(2)).First();
  327. if (agvInfo.Status == AGVTaskStatus.Complete1)
  328. {
  329. AgvApi.ContinueTask(agvid, nextpos);
  330. }
  331. });
  332. //AgvApi.ContinueTask(agvid, nextpos);
  333. }
  334. }
  335. catch (Exception ex)
  336. {
  337. World.Log(ex.Message, LogLevelEnum.Mid);
  338. this.ExRecord(obj.Entity.Code, ex.Message);
  339. continue;
  340. }
  341. }
  342. World.Log($"agv任务处理:结束[{guid}]", LogLevelEnum.Mid);
  343. }
  344. }
  345. }
  346. public override bool Select(Device dev)
  347. {
  348. return dev.Code is "1017" or "1018";
  349. }
  350. }
  351. }