123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152 |
- 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<string, string> tempLog = new ConcurrentDictionary<string, string>();
- 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);
- }
- }
- }
|