一楼出库工位处理系统.cs 3.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. using ServiceCenter.Logs;
  2. using ServiceCenter.Redis;
  3. using ServiceCenter.SqlSugars;
  4. using System.ComponentModel;
  5. using WCS.Core;
  6. using WCS.Entity;
  7. using WCS.WorkEngineering.Extensions;
  8. using WCS.WorkEngineering.Protocol.Station;
  9. using WCS.WorkEngineering.WebApi.Controllers;
  10. using WCS.WorkEngineering.WebApi.Models.AGV.Response;
  11. using WCS.WorkEngineering.Worlds;
  12. using DeviceFlags = WCS.WorkEngineering.Extensions.DeviceFlags;
  13. namespace WCS.WorkEngineering.Systems
  14. {
  15. /// <summary>
  16. /// 出库站台交互
  17. /// </summary>
  18. [BelongTo(typeof(MainWorld))]
  19. [Description("一楼出库工位处理系统")]
  20. public class 一楼出库工位处理系统 : DeviceSystem<Station>
  21. {
  22. protected override bool ParallelDo => true;
  23. protected override bool SaveLogsToFile => true;
  24. public override void Do(Station obj)
  25. {
  26. var key = $"WCS:Lock:{obj.Entity.Code}";
  27. try
  28. {
  29. if (RedisHub.Default.Get(key) != null)
  30. {
  31. throw new KnownException($"[{obj.Entity.Code}]--触发并发管控", LogLevelEnum.High);
  32. }
  33. RedisHub.Default.Set(key, obj.Entity.Code);
  34. //有任务需要执行
  35. if (obj.Data3.Status.HasFlag(StationStatus.PH_Status) && obj.Data3.Status.HasFlag(StationStatus.OT_Status))
  36. {
  37. SqlSugarHelper.Do(db =>
  38. {
  39. //当前站台是否有任务在执行
  40. var task = db.Default.Queryable<WCS_TaskInfo>().First(v => v.ID == obj.Data2.TaskNumber && v.Status == Entity.TaskStatus.ConveyorExecution) ?? throw new KnownException("无可执行任务", LogLevelEnum.Mid);
  41. var agv = db.Default.Queryable<WCS_AgvTaskInfo>().SplitTable(v => v.Take(2)).First(v => v.ID == task.AgvTaskID && v.Status == AGVTaskStatus.NewBuild) ?? throw new KnownException("未找到对应的AGV任务", LogLevelEnum.Mid);
  42. string endPos = "";
  43. if (task.AddrTo == "1021" || task.AddrTo == "1022" || task.AddrTo == "1023" || task.AddrTo == "1024")
  44. {
  45. endPos = "PT" + task.AddrTo;
  46. }
  47. else
  48. {
  49. endPos = task.AddrTo;
  50. }
  51. GenAgvSchedulingTaskResponse res = null;
  52. if (endPos.Contains("A") || endPos.Contains("B") || endPos.Contains("C") || endPos.Contains("D"))
  53. {
  54. res = AgvApi.搬运_wmsStart("PT", agv.Station, endPos, Guid.NewGuid().ToString().Replace("-", ""), "1");
  55. }
  56. else
  57. {
  58. res = AgvApi.叫料出库("PT", agv.Station, endPos, Guid.NewGuid().ToString().Replace("-", ""), "1");
  59. }
  60. agv.Status = AGVTaskStatus.Confirm;
  61. agv.AgvID = res.data;
  62. db.Default.Updateable(agv).SplitTable().ExecuteCommand();
  63. //更新WCS数据
  64. task.Status = Entity.TaskStatus.AGVExecution;
  65. db.Default.Updateable(task).ExecuteCommand();
  66. task.AddWCS_TASK_DTL(db, task.Device, $"任务下发至AGV-AGV任务ID{agv.AgvID}");
  67. });
  68. }
  69. }
  70. finally
  71. {
  72. RedisHub.Default.Del(key);
  73. }
  74. }
  75. public override bool Select(Device dev)
  76. {
  77. return dev.HasFlag(DeviceFlags.一楼出库口);
  78. }
  79. }
  80. }