TaskBehavior.cs 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344
  1. using Pms.DataLibrary.Order;
  2. using Pms.Models;
  3. using ProjectManagementSystem.Common.Extenions;
  4. using ProjectManagementSystem.Common.Logger;
  5. using ProjectManagementSystem.Common.WebApi;
  6. using System;
  7. using System.Collections.Concurrent;
  8. using System.Collections.Generic;
  9. using System.Linq;
  10. using System.Text;
  11. using System.Threading;
  12. using System.Threading.Tasks;
  13. namespace ProjectManagementSystem.Common.Core
  14. {
  15. public class TaskBehavior
  16. {
  17. private static TaskBehavior m_instance;
  18. private static ConcurrentDictionary<string, string> tempLog = new ConcurrentDictionary<string, string>();
  19. public static ConcurrentDictionary<int, BaseTaskBookBehaviorV2> BehaviorDict { get; set; } = new ConcurrentDictionary<int, BaseTaskBookBehaviorV2>();
  20. public static ConcurrentDictionary<int, PmsBehaviorLoop> PmsBehaviorLoopDict { get; set; } = new ConcurrentDictionary<int, PmsBehaviorLoop>();
  21. public static TaskBehavior Instance
  22. {
  23. get
  24. {
  25. if (m_instance == null)
  26. {
  27. m_instance = new TaskBehavior();
  28. if (!m_instance.Initialize())
  29. {
  30. m_instance = null;
  31. }
  32. }
  33. return m_instance;
  34. }
  35. }
  36. private TaskBehavior()
  37. {
  38. }
  39. private static bool CheckLogRepeat(string taskId, string log)
  40. {
  41. bool result = tempLog.ContainsKey(taskId) ? tempLog[taskId] == log : false;
  42. tempLog.AddOrUpdate(taskId, log, (key, vaule) => log);
  43. return result;
  44. }
  45. public static void Log(TaskData taskData, StepData stepData, string log)
  46. {
  47. string strLog = $"{taskData.TaskID} Step{taskData.CurrentStepID} {stepData.PmsBehavior} {stepData.AgvBehavior} {taskData.Carrier}# {stepData.WareHouseID} {log}";
  48. if (CheckLogRepeat(taskData.TaskID, log)) return;
  49. CLog.Instance.GetAgvLog(taskData.Carrier).WriteInfo(strLog);
  50. }
  51. public static void RemoveTempLog(string taskId)
  52. {
  53. if (string.IsNullOrEmpty(taskId)) return;
  54. tempLog.TryRemove(taskId, out string _);
  55. }
  56. public static string GetTempLog(string taskId)
  57. {
  58. if (string.IsNullOrEmpty(taskId)) return null;
  59. return tempLog.ContainsKey(taskId) ? tempLog[taskId] : null;
  60. }
  61. private bool Initialize()
  62. {
  63. try
  64. {
  65. Task.Factory.StartNew(UserThread);
  66. return true;
  67. }
  68. catch (Exception ex)
  69. {
  70. CLog.Instance.SystemLog.WriteException("TaskBehavior Initialize", ex);
  71. }
  72. return false;
  73. }
  74. private void ProcessPmsBehavior()
  75. {
  76. DateTime start = DateTime.Now;
  77. var dataDict = PmsApi.GetPmsBehavior();
  78. if (dataDict == null || dataDict.Count == 0) return;
  79. var taskList = PmsApi.GetTaskList();
  80. if (taskList == null || taskList.Count == 0) return;
  81. Parallel.ForEach(dataDict.Values, data =>
  82. {
  83. try
  84. {
  85. if (!BehaviorDict.ContainsKey(data.PmsBehavior)) return;
  86. //获取任务数据
  87. var taskData = taskList.FirstOrDefault(d => d.TaskID == data.TaskId);
  88. if (taskData == null) return;
  89. var stepList = PmsApi.GetStepList(data.TaskId);
  90. if (stepList == null) return;
  91. taskData.StepList = stepList;
  92. var stepData = taskData.GetCurrentStepInfo();
  93. if (stepData == null) return;
  94. if (stepData.PmsBehavior != data.PmsBehavior) return;
  95. var taskApiTimeSpan = (DateTime.Now - start).TotalMilliseconds;
  96. //执行PMS行为码
  97. DateTime start3 = DateTime.Now;
  98. bool result = BehaviorDict[data.PmsBehavior].TaskBookOperator(taskData, stepData);
  99. var operatorTimeSpan = (DateTime.Now - start3).TotalMilliseconds;
  100. //上报PMS行为码
  101. if (result)
  102. {
  103. bool setResult = PmsApi.SetPmsBehaviorFinish(data.TaskId, taskData.Carrier, data.PmsBehavior);
  104. var totalTimeSpan = (DateTime.Now - start).TotalMilliseconds;
  105. CLog.Instance.GetAgvLog(taskData.Carrier).WriteDebug($"{data.TaskId} Step{taskData.CurrentStepID} {data.PmsBehavior} {data.agvId}# PMS行为码完成上报{setResult.ToChineseString()}" +
  106. $" 耗时: {taskApiTimeSpan:F1}ms {operatorTimeSpan:F1}ms 总耗时:{totalTimeSpan:F1}ms");
  107. }
  108. }
  109. catch (Exception ex)
  110. {
  111. CLog.Instance.SystemLog.WriteExceptionCaller(ex);
  112. }
  113. });
  114. }
  115. private void ProcessPmsBehaviorTask()
  116. {
  117. //独立线程执行
  118. var dataDict = PmsApi.GetPmsBehavior();
  119. if (dataDict == null || dataDict.Count == 0) return;
  120. var dataDictValues = dataDict.Values.ToArray();
  121. foreach (var item in dataDictValues)
  122. {
  123. if (!BehaviorDict.ContainsKey(item.PmsBehavior)) continue;
  124. if (!PmsBehaviorLoopDict.ContainsKey(item.agvId))
  125. {
  126. PmsBehaviorLoop loop = new PmsBehaviorLoop();
  127. loop.BehavoirInfo = item;
  128. loop.Start();
  129. PmsBehaviorLoopDict.AddOrUpdate(loop.AgvId, loop, (key, value) => loop);
  130. }
  131. else
  132. {
  133. var loop = PmsBehaviorLoopDict[item.agvId];
  134. if (!loop.IsStart)
  135. {
  136. loop.BehavoirInfo = item;
  137. loop.Start();
  138. }
  139. }
  140. }
  141. }
  142. private void UserThread()
  143. {
  144. CLog.Instance.SystemLog.WriteDebug($"TaskBehavior已启动");
  145. while (true)
  146. {
  147. try
  148. {
  149. ProcessPmsBehaviorTask();
  150. }
  151. catch (Exception ex)
  152. {
  153. CLog.Instance.SystemLog.WriteException("TaskBehavior", ex);
  154. Thread.Sleep(5000);
  155. }
  156. Thread.Sleep(100);
  157. }
  158. }
  159. }
  160. public class PmsBehaviorLoop
  161. {
  162. public int AgvId { get { return BehavoirInfo.agvId; } }
  163. public bool IsStart { get; set; }
  164. public RequestPmsTaskInfo BehavoirInfo { get; set; }
  165. public PmsBehaviorLoop()
  166. {
  167. }
  168. public void Start()
  169. {
  170. IsStart = true;
  171. Task.Factory.StartNew(UserThread);
  172. }
  173. private bool Process()
  174. {
  175. DateTime start = DateTime.Now;
  176. var dataDict = PmsApi.GetPmsBehavior();
  177. if (dataDict == null)
  178. {
  179. LogDebug("获取所有PMS行为码失败");
  180. return true;
  181. }
  182. if (dataDict.Count == 0)
  183. {
  184. LogDebug("获取所有PMS行为码数量为0");
  185. return true;
  186. }
  187. var find = dataDict.Values.FirstOrDefault(d => d.TaskId == BehavoirInfo.TaskId && d.PmsBehavior == BehavoirInfo.PmsBehavior && d.agvId == BehavoirInfo.agvId);
  188. if (find == null)
  189. {
  190. LogDebug("未找到当前PMS行为码");
  191. return true;
  192. }
  193. //获取任务数据
  194. var taskData = PmsApi.GetTaskData(BehavoirInfo.TaskId);
  195. if (taskData == null)
  196. {
  197. LogDebug("获取当前任务失败");
  198. return true;
  199. }
  200. var stepData = taskData.GetCurrentStepInfo();
  201. if (stepData == null)
  202. {
  203. LogDebug("获取当前任务StepData失败");
  204. return true;
  205. }
  206. if (stepData.PmsBehavior != BehavoirInfo.PmsBehavior)
  207. {
  208. LogDebug($"PMS行为码不匹配,当前任务Step{taskData.CurrentStepID} {stepData.PmsBehavior}");
  209. return true;
  210. }
  211. var taskApiTimeSpan = (DateTime.Now - start).TotalMilliseconds;
  212. //执行PMS行为码
  213. DateTime start3 = DateTime.Now;
  214. bool result = TaskBehavior.BehaviorDict[BehavoirInfo.PmsBehavior].TaskBookOperator(taskData, stepData);
  215. var operatorTimeSpan = (DateTime.Now - start3).TotalMilliseconds;
  216. //上报PMS行为码
  217. if (result)
  218. {
  219. bool setResult = PmsApi.SetPmsBehaviorFinish(BehavoirInfo.TaskId, taskData.Carrier, BehavoirInfo.PmsBehavior);
  220. var totalTimeSpan = (DateTime.Now - start).TotalMilliseconds;
  221. CLog.Instance.GetAgvLog(taskData.Carrier).WriteDebug($"{BehavoirInfo.TaskId} Step{taskData.CurrentStepID} {BehavoirInfo.PmsBehavior} {BehavoirInfo.agvId}# PMS行为码完成上报{setResult.ToChineseString()}" +
  222. $" 耗时: {taskApiTimeSpan:F1}ms {operatorTimeSpan:F1}ms 总耗时:{totalTimeSpan:F1}ms");
  223. return setResult;
  224. }
  225. return false;
  226. }
  227. private void LogDebug(string log)
  228. {
  229. CLog.Instance.GetAgvLog(BehavoirInfo.agvId).WriteDebug($"{BehavoirInfo.TaskId} {BehavoirInfo.PmsBehavior} {BehavoirInfo.agvId}# {log}");
  230. }
  231. private void UserThread()
  232. {
  233. LogDebug("PmsBehaviorLoop已启动");
  234. while (IsStart)
  235. {
  236. bool processResult = false;
  237. try
  238. {
  239. processResult = Process();
  240. if (processResult)
  241. {
  242. TaskBehavior.RemoveTempLog(BehavoirInfo.TaskId);
  243. }
  244. }
  245. catch (Exception ex)
  246. {
  247. CLog.Instance.SystemLog.WriteException("PmsBehaviorLoop", ex);
  248. Thread.Sleep(5000);
  249. //抛异常退出循环
  250. processResult = true;
  251. }
  252. if (processResult)
  253. {
  254. break;
  255. }
  256. Thread.Sleep(100);
  257. }
  258. LogDebug("PmsBehaviorLoop已退出");
  259. IsStart = false;
  260. }
  261. }
  262. public abstract class BaseTaskBookBehaviorV2
  263. {
  264. public int Behavior { get; set; }
  265. public string Remark { get; set; }
  266. public BaseTaskBookBehaviorV2(int behavior, string remark)
  267. {
  268. Behavior = behavior;
  269. Remark = remark;
  270. TaskBehavior.BehaviorDict.AddOrUpdate(Behavior, this, (key, value) => this);
  271. }
  272. public abstract bool TaskBookOperator(TaskData taskData, StepData stepData);
  273. public void Log(TaskData taskData, StepData stepData, string log)
  274. {
  275. TaskBehavior.Log(taskData, stepData, log);
  276. }
  277. public void LogException(Exception ex)
  278. {
  279. CLog.Instance.TaskLog.WriteException("TaskBookBehavior", ex);
  280. }
  281. }
  282. }