schangxiang@126.com
2025-05-19 dc8427b7607f218021326405cab913137011d0c9
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
using CMS.Extensions.Variable;
using CMS.Project.Abstractions;
using KissUtil.Extensions;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
using Volo.Abp.BackgroundWorkers;
using Volo.Abp.Threading;
 
namespace CMS.Plugin.HIAWms.Workers
{
    /// <summary>
    /// HIAWms后台工作者
    /// </summary>
    public class HIAWmsWorker : AsyncPeriodicBackgroundWorkerBase
    {
        private readonly ILogger<HIAWmsWorker> _logger;
        private readonly VariableService _variableService;
 
        /// <summary>
        /// Initializes a new instance of the <see cref="HIAWmsWorker"/> class.
        /// </summary>
        /// <param name="timer">The timer.</param>
        /// <param name="serviceScopeFactory">The service scope factory.</param>
        public HIAWmsWorker(ILogger<HIAWmsWorker> logger, AbpAsyncTimer timer, VariableService variableService, IServiceScopeFactory serviceScopeFactory) : base(timer, serviceScopeFactory)
        {
            _logger = logger;
            _variableService = variableService;
            Timer.Period = 1 * 300 * 1000; // 每隔 300 秒 执行一次
            Timer.RunOnStart = true;
        }
 
        /// <inheritdoc />
        protected override async Task DoWorkAsync(PeriodicBackgroundWorkerContext workerContext)
        {
            var projectAccessor = workerContext.ServiceProvider.GetRequiredService<IProjectAccessor>();
            var project = await projectAccessor.GetProjectAsync();
            if (project?.Info == null)
            {
                return;
            }
 
            //_logger.LogInformation($"HIAWmsWorker is working for project {project.Info.Id}");
 
            //// 计算OEE
            //double oee = await CalculateOEEAsync();
 
            //// 使用百分比格式 打印结果日志
            //_logger.LogInformation($"OEE:{oee:P2}");
 
            //// 写入变量
            //await _variableService.WriteValueAsync(new Dictionary<string, object> {{ "OEE", oee } });
        }
 
        // 计算OEE=可用性×性能×质量
        public async Task<double> CalculateOEEAsync()
        {
            // 读取OEE计算所需的值  
            double availability = await ReadDoubleValueAsync("Availability");
            double performance = await ReadDoubleValueAsync("Performance");
            double quality = await ReadDoubleValueAsync("Quality");
 
            // 计算OEE  
            double oee = availability * performance * quality;
 
            // 返回计算结果  
            return oee;
        }
 
        // 提供一个泛型方法,方便直接获取double类型的值  
        public async Task<double> ReadDoubleValueAsync(string variableName)
        {
            var variable = await _variableService.ReadValueAsync(variableName);
            return (variable?.Content?.Value).SafeString().ToDoubleOrNull().GetValueOrDefault();
        }
    }
}