LMS.service/LMS.Tools/TaskScheduler/ResetUserFreeCount.cs

67 lines
2.7 KiB
C#
Raw Permalink Normal View History

using Quartz;
using Microsoft.AspNetCore.Identity;
using LMS.Repository.Models.DB;
using Microsoft.Extensions.Logging;
using LMS.Repository.DB;
using LMS.DAO;
using LMS.Common.Enums;
using Microsoft.EntityFrameworkCore;
using LMS.Repository.Options;
namespace LMS.Tools.TaskScheduler;
[DisallowConcurrentExecution]
public class ResetUserFreeCount(ILogger<ResetUserFreeCount> logger, UserManager<User> userManager, ApplicationDbContext context) : IJob
{
private readonly ILogger<ResetUserFreeCount> _logger = logger;
private readonly UserManager<User> _userManager = userManager;
private readonly ApplicationDbContext _context = context;
public async Task Execute(IJobExecutionContext context)
{
_logger.LogInformation($"开始执行月度任务 - 当前时间: {DateTime.Now}");
await ProcessResetUserFreeCount();
_logger.LogInformation($"月度任务执行完成 - 当前时间: {DateTime.Now}");
}
private async Task ProcessResetUserFreeCount()
{
using var transaction = await _context.Database.BeginTransactionAsync();
try
{
// 这里是您的业务逻辑
_logger.LogInformation("正在重置用户余换绑次数数据...");
// 加载Options
Options? options = await _context.Options.FirstOrDefaultAsync(x => x.Key == OptionKeyName.ResetFreeCountSetting) ?? throw new Exception("未找到重置用户免费次数的设置,请检查!");
ResetUserFreeCountSettingModel resetFreeCountSetting = options.GetValueObject<ResetUserFreeCountSettingModel>() ?? new ResetUserFreeCountSettingModel();
if (resetFreeCountSetting.EnableMonthlyReset == false)
{
// 不允许重置
_logger.LogInformation("未开启用户重置换绑次数,有需要请开启!");
return;
}
// 获取所有用户
List<User> users = await _userManager.Users.ToListAsync();
// 修改所有的用户的免费次数
foreach (User user in users)
{
long machineCount = user.AllDeviceCount;
user.FreeCount = resetFreeCountSetting.OnceFreeCount * machineCount;
await _userManager.UpdateAsync(user);
}
await transaction.CommitAsync();
await _context.SaveChangesAsync();
_logger.LogInformation("重置用户余换绑次数数据成功!");
}
catch (Exception ex)
{
await transaction.RollbackAsync();
_logger.LogError(ex, "月度任务执行失败");
throw; // 重新抛出异常以便 Quartz 记录作业失败
}
}
}