AsyncBehavior.cs 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163
  1. using DbCommon.BusinessCore.BaseCore;
  2. using DbCommon.Enties.DbModels;
  3. using Newtonsoft.Json;
  4. using Pms.DataLibrary.Order;
  5. using Pms.Models;
  6. using ProjectManagementSystem.Common.Extenions;
  7. using ProjectManagementSystem.Common.Logger;
  8. using ProjectManagementSystem.Common.WebApi;
  9. using System;
  10. using System.Collections.Concurrent;
  11. using System.Collections.Generic;
  12. using System.Linq;
  13. using System.Text;
  14. using System.Threading;
  15. using System.Threading.Tasks;
  16. namespace ProjectManagementSystem.Common.Core
  17. {
  18. public class AsyncBehavior
  19. {
  20. private static ConcurrentDictionary<string, string> tempLog = new ConcurrentDictionary<string, string>();
  21. private AsyncBehaviorManager asyncBehaviorManager = new AsyncBehaviorManager();
  22. public Guid Id { get; set; }
  23. public int Behavior { get; set; }
  24. public int Interval { get; set; } = 1000;
  25. public string TaskID { get; set; }
  26. public int MaxStepId { get; set; }
  27. public bool FirstStart { get; set; }
  28. public void Init()
  29. {
  30. Id = Guid.NewGuid();
  31. var mode = new AsyncBehaviorModel();
  32. mode.Id = Id;
  33. mode.TaskID = TaskID;
  34. mode.Behavior = Behavior;
  35. mode.Interval = Interval;
  36. mode.MaxStepId = MaxStepId;
  37. mode.FirstStart = FirstStart;
  38. mode.AssemblyString = this.GetType().Assembly.GetName().Name;
  39. mode.FullClassName = this.GetType().FullName;
  40. asyncBehaviorManager.Insert(mode);
  41. }
  42. public void Start()
  43. {
  44. Task.Factory.StartNew(BehaviorProc);
  45. }
  46. public bool IsRollerRotation(TaskData taskData, StepData stepInfo)
  47. {
  48. var agvData = PmsApi.GetCarrier(taskData.Carrier);
  49. if (agvData == null)
  50. {
  51. Log(taskData, stepInfo, "获取AGV数据失败");
  52. return false;
  53. }
  54. //判断AGV滚筒是否已经转动
  55. var logicBits = agvData.LogicBits;
  56. bool rollerMoveing = (logicBits & (0x01 << 7)) > 0;
  57. if (!rollerMoveing)
  58. {
  59. Log(taskData, stepInfo, $"等待AGV滚筒转动,LogicBits:{logicBits}");
  60. return false;
  61. }
  62. return true;
  63. }
  64. public void BehaviorProc()
  65. {
  66. FirstStart = true;
  67. CLog.Instance.TaskLog.WriteInfo($"{TaskID} {Behavior} 【异步】启动 检测间隔{Interval}ms 最大步骤{MaxStepId}");
  68. while (true)
  69. {
  70. try
  71. {
  72. var taskData = PmsApi.GetTaskData(TaskID);
  73. if (taskData == null)
  74. {
  75. var hisTaskData = PmsApi.GetHistoryTaskData(TaskID);
  76. if (hisTaskData != null)
  77. {
  78. CLog.Instance.TaskLog.WriteInfo($"{TaskID} {Behavior} 【异步】获取到历史任务信息,异步行为码完成");
  79. break;
  80. }
  81. CLog.Instance.TaskLog.WriteInfo($"{TaskID} {Behavior} 【异步】获取当前任务信息失败,再次尝试...");
  82. continue;
  83. }
  84. var stepInfo = taskData.GetCurrentStepInfo();
  85. if (FirstStart
  86. && FirstOperator(taskData, stepInfo))
  87. {
  88. FirstStart = false;
  89. }
  90. if (taskData.CurrentStepID > MaxStepId)
  91. {
  92. Log(taskData, stepInfo, $"当前任务步骤为{taskData.CurrentStepID} 大于 {MaxStepId},行为码完成(跳出)");
  93. break;
  94. }
  95. if (!FirstStart)
  96. {
  97. if (CustomOperator(taskData, stepInfo))
  98. {
  99. Log(taskData, stepInfo, "正常完成");
  100. break;
  101. }
  102. }
  103. }
  104. catch (Exception ex)
  105. {
  106. CLog.Instance.TaskLog.WriteException("AsyncBehavior", ex);
  107. Thread.Sleep(5000);
  108. }
  109. Thread.Sleep(Interval);
  110. }
  111. asyncBehaviorManager.Delete(Id);
  112. }
  113. public virtual bool FirstOperator(TaskData taskData, StepData stepInfo)
  114. {
  115. return true;
  116. }
  117. public virtual bool CustomOperator(TaskData taskData, StepData stepInfo)
  118. {
  119. return true;
  120. }
  121. private static bool CheckLogRepeat(string taskId, string log)
  122. {
  123. bool result = tempLog.ContainsKey(taskId) ? tempLog[taskId] == log : false;
  124. tempLog.AddOrUpdate(taskId, log, (key, vaule) => log);
  125. return result;
  126. }
  127. public static void Log(TaskData taskData, StepData stepData, string log)
  128. {
  129. string strLog = $"{taskData.TaskID} Step{taskData.CurrentStepID} {stepData.PmsBehavior} {stepData.AgvBehavior} {taskData.Carrier}# {stepData.WareHouseID} {log}";
  130. if (CheckLogRepeat(taskData.TaskID, log)) return;
  131. CLog.Instance.GetAgvLog(taskData.Carrier).WriteInfo($"【异步】{strLog}");
  132. }
  133. }
  134. }