FatigueTestConfigService.cs 4.79 KB
using System.Text.Json;
using Microsoft.Extensions.Logging;
using Rcs.Application.Services;
using Rcs.Domain.Entities;
using StackExchange.Redis;

namespace Rcs.Infrastructure.Services;

/// <summary>
/// 疲劳测试配置服务实现(基于Redis存储)
/// @author zzy
/// </summary>
public class FatigueTestConfigService : IFatigueTestConfigService
{
    private readonly IConnectionMultiplexer _redis;
    private readonly ILogger<FatigueTestConfigService> _logger;
    private const string ConfigKey = "hahrcs:fatigue_test:config";
    private const string RunningStatusKey = "hahrcs:fatigue_test:running";
    private static readonly JsonSerializerOptions JsonOptions = new()
    {
        PropertyNamingPolicy = JsonNamingPolicy.CamelCase
    };

    public FatigueTestConfigService(
        IConnectionMultiplexer redis,
        ILogger<FatigueTestConfigService> logger)
    {
        _redis = redis;
        _logger = logger;
    }

    /// <summary>
    /// 获取疲劳测试配置
    /// </summary>
    public async Task<FatigueTestConfig?> GetConfigAsync(CancellationToken cancellationToken = default)
    {
        try
        {
            var db = _redis.GetDatabase();
            var json = await db.StringGetAsync(ConfigKey);
            
            if (json.IsNullOrEmpty)
            {
                return null;
            }

            return JsonSerializer.Deserialize<FatigueTestConfig>(json!, JsonOptions);
        }
        catch (Exception ex)
        {
            _logger.LogError(ex, "[FatigueTestConfig] 获取配置失败");
            return null;
        }
    }

    /// <summary>
    /// 保存疲劳测试配置
    /// </summary>
    public async Task<bool> SaveConfigAsync(FatigueTestConfig config, CancellationToken cancellationToken = default)
    {
        try
        {
            var db = _redis.GetDatabase();
            config.UpdatedAt = DateTime.Now;
            
            var json = JsonSerializer.Serialize(config, JsonOptions);
            await db.StringSetAsync(ConfigKey, json);
            
            _logger.LogInformation("[FatigueTestConfig] 配置已保存到Redis");
            return true;
        }
        catch (Exception ex)
        {
            _logger.LogError(ex, "[FatigueTestConfig] 保存配置失败");
            return false;
        }
    }

    /// <summary>
    /// 获取运行状态
    /// </summary>
    public async Task<bool> GetRunningStatusAsync(CancellationToken cancellationToken = default)
    {
        try
        {
            var db = _redis.GetDatabase();
            var value = await db.StringGetAsync(RunningStatusKey);
            
            if (value.IsNullOrEmpty)
            {
                return false;
            }

            return bool.TryParse(value, out var result) && result;
        }
        catch (Exception ex)
        {
            _logger.LogError(ex, "[FatigueTestConfig] 获取运行状态失败");
            return false;
        }
    }

    /// <summary>
    /// 设置运行状态
    /// </summary>
    public async Task<bool> SetRunningStatusAsync(bool isRunning, CancellationToken cancellationToken = default)
    {
        try
        {
            var db = _redis.GetDatabase();
            await db.StringSetAsync(RunningStatusKey, isRunning.ToString());
            
            _logger.LogInformation("[FatigueTestConfig] 运行状态已设置为: {IsRunning}", isRunning);
            return true;
        }
        catch (Exception ex)
        {
            _logger.LogError(ex, "[FatigueTestConfig] 设置运行状态失败");
            return false;
        }
    }

    /// <summary>
    /// 启动疲劳测试
    /// </summary>
    public async Task<bool> StartAsync(CancellationToken cancellationToken = default)
    {
        var config = await GetConfigAsync(cancellationToken);
        if (config == null)
        {
            _logger.LogWarning("[FatigueTestConfig] 启动失败:配置不存在");
            return false;
        }

        config.IsRunning = true;
        config.UpdatedAt = DateTime.Now;
        await SaveConfigAsync(config, cancellationToken);
        await SetRunningStatusAsync(true, cancellationToken);
        
        _logger.LogInformation("[FatigueTestConfig] 疲劳测试已启动");
        return true;
    }

    /// <summary>
    /// 停止疲劳测试
    /// </summary>
    public async Task<bool> StopAsync(CancellationToken cancellationToken = default)
    {
        var config = await GetConfigAsync(cancellationToken);
        if (config != null)
        {
            config.IsRunning = false;
            config.UpdatedAt = DateTime.Now;
            await SaveConfigAsync(config, cancellationToken);
        }
        
        await SetRunningStatusAsync(false, cancellationToken);
        _logger.LogInformation("[FatigueTestConfig] 疲劳测试已停止");
        return true;
    }
}