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 logger, UserManager userManager, ApplicationDbContext context) : IJob { private readonly ILogger _logger = logger; private readonly UserManager _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() ?? new ResetUserFreeCountSettingModel(); if (resetFreeCountSetting.EnableMonthlyReset == false) { // 不允许重置 _logger.LogInformation("未开启用户重置换绑次数,有需要请开启!"); return; } // 获取所有用户 List 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 记录作业失败 } } }