叫料生成AGV任务.cs 4.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. using ServiceCenter.Extensions;
  2. using ServiceCenter.Logs;
  3. using ServiceCenter.SqlSugars;
  4. using System.ComponentModel;
  5. using WCS.Core;
  6. using WCS.Entity;
  7. using WCS.Entity.Protocol.Station;
  8. using WCS.WorkEngineering.Extensions;
  9. using WCS.WorkEngineering.WebApi.Controllers;
  10. using WCS.WorkEngineering.Worlds;
  11. using DeviceFlags = WCS.WorkEngineering.Extensions.DeviceFlags;
  12. using TaskStatus = WCS.Entity.TaskStatus;
  13. namespace WCS.WorkEngineering.Systems.重绕区
  14. {
  15. [BelongTo(typeof(RewindWorld))]
  16. [Description("叫料生成AGV任务")]
  17. public class 叫料生成AGV任务 : DeviceSystem<Device<IStation520, IStation521, IStation523>>
  18. {
  19. protected override bool ParallelDo => true;
  20. public override void Do(Device<IStation520, IStation521, IStation523> obj)
  21. {
  22. //if (!obj.Data3.Status.HasFlag(StationStatus.Auto))
  23. //{
  24. // World.Log($"设备处于{obj.Data3.Status.GetDisplayName()}状态");
  25. // return;
  26. //}
  27. if (!obj.Data3.Status.HasFlag(StationStatus.PH_Status))
  28. {
  29. World.Log($"设备无光电");
  30. return;
  31. }
  32. SqlSugarHelper.Do(db =>
  33. {
  34. var task = db.Queryable<WCS_TaskInfo>().ReadPastUpdLock().Single(x => x.Status == TaskStatus.WaitingToExecute && x.AddrFrom == obj.Entity.Code
  35. && x.Type == TaskType.OutDepot);
  36. if (task == null)
  37. {
  38. World.Log($"未找到对应任务[{obj.Data.TaskNumber}],请检查该任务状态与更新状态是否均为输送机执行中", LogLevelEnum.High);
  39. return;
  40. }
  41. var agvId = DateTime.Now.GetFormat(GetFormatterEnum.only) + task.ID;
  42. //开始创建AGV任务
  43. var agvTask = db.Queryable<WCS_AgvTaskInfo>().RowLock().SplitTable(x => x.Take(2)).Single(x => x.TaskId == task.ID && x.TaskType == AGVTaskType.CallMaterial);
  44. if (agvTask == null)
  45. {
  46. //开始处理叫料AGV任务任务
  47. db.InsertableRowLock(new WCS_AgvTaskInfo()
  48. {
  49. ID = db.GetAgvTaskId(),
  50. TaskType = AGVTaskType.CallMaterial,
  51. Status = AGVTaskStatus.NewBuild,
  52. TaskId = task.ID,
  53. Position = task.WorkBench,
  54. Station = task.AddrFrom,
  55. AddWho = "WCS",
  56. AddTime = DateTime.Now,
  57. AgvID = agvId
  58. }).SplitTable().ExecuteCommand();
  59. World.Log($"{task.ID}未找到对应的AGV任务");
  60. return;
  61. }
  62. if (agvTask.Status != AGVTaskStatus.NewBuild)
  63. {
  64. World.Log($"AGV任务{agvTask.ID}状态不是新建", LogLevelEnum.High);
  65. return;
  66. }
  67. agvId = agvTask.AgvID;
  68. //agvTask.AgvID = agvId;
  69. agvTask.Status = AGVTaskStatus.Confirm;
  70. agvTask.AgvStatus = AGVTaskStatus.Confirm;
  71. db.UpdateableRowLock(agvTask).UpdateColumns(x => new { x.AgvID, x.Status, x.AgvStatus }).SplitTable(x => x.Take(2)).ExecuteCommand();
  72. task.Status = TaskStatus.AGVExecution;
  73. task.AgvTaskID = agvTask.ID;
  74. task.EditTime = DateTime.Now;
  75. task.EditWho = "WCS";
  76. db.Updateable(task).UpdateColumns(x => new { x.Status, x.AgvTaskID, x.EditTime, x.EditWho }).ExecuteCommand();
  77. task.AddWCS_TASK_DTL(db, obj.Entity.Code, "AGV", $"任务下发至AGV{agvId}");
  78. var res = AgvApi.重绕叫料(obj.Entity.Code, task.WorkBench, agvId);
  79. });
  80. }
  81. public override bool Select(Device dev)
  82. {
  83. return dev.HasFlag(DeviceFlags.重绕区叫料工位);
  84. }
  85. }
  86. }