using DbCommon.BusinessCore.BaseCore; using DbCommon.Enties.DbModels; using Newtonsoft.Json; using ProjectManagementSystem.Common.Models.Crms; using ProjectManagementSystem.Common.Extenions; using ProjectManagementSystem.Common.Logger; using ProjectManagementSystem.Common.Service; using System; using System.Collections.Concurrent; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading; using System.Threading.Tasks; namespace ProjectManagementSystem.Common.Core { public class AsyncBehavior { private static ConcurrentDictionary tempLog = new ConcurrentDictionary(); private AsyncBehaviorManager asyncBehaviorManager = new AsyncBehaviorManager(); public Guid Id { get; set; } public int Behavior { get; set; } public int Interval { get; set; } = 1000; public string TaskID { get; set; } public int AgvId { get; set; } public int MaxStepId { get; set; } public bool FirstStart { get; set; } public void Init() { Id = Guid.NewGuid(); var mode = new AsyncBehaviorModel(); mode.Id = Id; mode.TaskID = TaskID; mode.AgvId = AgvId; mode.Behavior = Behavior; mode.Interval = Interval; mode.MaxStepId = MaxStepId; mode.FirstStart = FirstStart; mode.AssemblyString = this.GetType().Assembly.GetName().Name; mode.FullClassName = this.GetType().FullName; asyncBehaviorManager.Insert(mode); } public void Start() { Task.Factory.StartNew(BehaviorProc); } public void BehaviorProc() { FirstStart = true; CLog.Instance.GetAgvLog(AgvId).WriteInfo($"【异步】 {TaskID} {Behavior} 启动 检测间隔{Interval}ms 最大步骤{MaxStepId}"); while (true) { try { var taskData = Crms.PmsApi.GetTaskData(TaskID); if (taskData == null) { var taskList = Crms.PmsApi.GetTaskList(); if (taskList != null && taskList.FirstOrDefault(d => d.TaskID == TaskID) == null) { CLog.Instance.GetAgvLog(AgvId).WriteInfo($"【异步】 {TaskID} {Behavior} 未找到当前任务信息,异步行为码完成"); break; } CLog.Instance.GetAgvLog(AgvId).WriteInfo($"【异步】 {TaskID} {Behavior} 获取当前任务信息失败,再次尝试..."); Thread.Sleep(Interval); continue; } var stepInfo = taskData.GetCurrentStepInfo(); if (FirstStart && FirstOperator(taskData, stepInfo)) { FirstStart = false; } if (taskData.CurrentStepID > MaxStepId) { Log(taskData, stepInfo, $"当前任务步骤为{taskData.CurrentStepID} 大于 {MaxStepId},行为码完成(跳出)"); break; } if (!FirstStart) { if (CustomOperator(taskData, stepInfo)) { Log(taskData, stepInfo, "正常完成"); break; } } } catch (Exception ex) { CLog.Instance.TaskLog.WriteException("AsyncBehavior", ex); Thread.Sleep(5000); } Thread.Sleep(Interval); } RemoveTempLog(TaskID); asyncBehaviorManager.Delete(Id); } public virtual bool FirstOperator(TaskData taskData, StepData stepInfo) { return true; } public virtual bool CustomOperator(TaskData taskData, StepData stepInfo) { return true; } public static void RemoveTempLog(string taskId) { if (string.IsNullOrEmpty(taskId)) return; tempLog.TryRemove(taskId, out string _); } public static string GetTempLog(string taskId) { if (string.IsNullOrEmpty(taskId)) return null; return tempLog.TryGetValue(taskId, out string log) ? log : null; } public static void Log(TaskData taskData, StepData stepData, string log) { bool result = tempLog.TryGetValue(taskData.TaskID, out string templog) ? templog == log : false; if (result) return; tempLog.AddOrUpdate(taskData.TaskID, log, (key, vaule) => log); string strLog = $"【异步】 {taskData.TaskID} Step{taskData.CurrentStepID} {stepData.PmsBehavior} {stepData.AgvBehavior} {taskData.Carrier}# {stepData.WareHouseID} {log}"; CLog.Instance.GetAgvLog(taskData.Carrier).WriteInfo(strLog); } } }