Files
glz 766be485d0 feat: 新增操作日志功能并优化定时任务配置
1.  新增OperationLogAttribute与OperationLogActionFilter,实现自动化操作日志记录
2.  新增OperationLogRecordInput输入模型,重构IOperationLogService日志接口
3.  为所有业务控制器接口添加操作日志注解
4.  调整期刊AI批改任务的执行周期与方法适配异步调用
5.  优化Hangfire定时任务注册逻辑,支持异步任务
6.  补充完善操作日志类型与目标类型枚举
2026-07-09 18:01:37 +08:00

147 lines
5.2 KiB
C#
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

using Microsoft.AspNetCore.Mvc;
using QYZH.InteractiveMagazine.Infrastructure.Middleware;
using QYZH.InteractiveMagazine.IService;
using QYZH.InteractiveMagazine.Models.Common;
using QYZH.InteractiveMagazine.Models.Dto;
using QYZH.InteractiveMagazine.Models.Dto.CheckIn;
using QYZH.InteractiveMagazine.Models.Dto.Compensation;
using QYZH.InteractiveMagazine.Models.Dto.Points;
namespace QYZH.InteractiveMagazine.WebApi.Controllers;
/// <summary>
/// 用户控制器
/// </summary>
[Route("api/[controller]")]
[ApiController]
public class UsersController : BaseController
{
private readonly IUsersService _usersService;
private readonly ILogger<UsersController> _logger;
public UsersController(IUsersService usersService, ILogger<UsersController> logger)
{
_usersService = usersService;
_logger = logger;
}
/// <summary>
/// 获取用户列表(分页)
/// </summary>
[HttpPost]
public async Task<BaseResponse<PageListModel<UsersOutput>>> GetList([FromBody] UsersQueryInput input)
{
return await _usersService.GetListAsync(input);
}
/// <summary>
/// 获取用户详情(仅基本信息)
/// </summary>
[HttpGet("{id}")]
public async Task<BaseResponse<UserDetailOutput>> GetDetail(long id)
{
return await _usersService.GetDetailAsync(id);
}
/// <summary>
/// 分页查询用户积分记录
/// </summary>
[HttpPost("{id}/pointsRecords")]
public async Task<BaseResponse<PageListModel<PointsRecordOutput>>> GetUserPointsRecords(long id, [FromBody] PointsRecordQueryInput input)
{
return await _usersService.GetUserPointsRecordsAsync(id, input);
}
/// <summary>
/// 分页查询用户签到记录
/// </summary>
[HttpPost("{id}/checkInRecords")]
public async Task<BaseResponse<PageListModel<CheckInRecordOutput>>> GetUserCheckInRecords(long id, [FromBody] PageQueryModel input)
{
return await _usersService.GetUserCheckInRecordsAsync(id, input);
}
/// <summary>
/// 分页查询用户补偿任务
/// </summary>
[HttpPost("{id}/compensationTasks")]
public async Task<BaseResponse<PageListModel<CompensationTaskOutput>>> GetUserCompensationTasks(long id, [FromBody] CompensationTaskQueryInput input)
{
return await _usersService.GetUserCompensationTasksAsync(id, input);
}
/// <summary>
/// 分页查询用户期刊列表
/// </summary>
[HttpPost("{id}/journals")]
public async Task<BaseResponse<PageListModel<UserJournalItemOutput>>> GetUserJournals(long id, [FromBody] UserJournalQueryInput input)
{
return await _usersService.GetUserJournalsAsync(id, input);
}
/// <summary>
/// 更新用户状态
/// </summary>
[OperationLog(OperationLogActionType.StatusChange, OperationLogTargetType.User)]
[HttpPut("{id}/status")]
public async Task<BaseResponse> UpdateStatus(long id)
{
return await _usersService.UpdateStatusAsync(id);
}
/// <summary>
/// 手动增加用户积分
/// </summary>
[HttpPost("{userId}/points/add")]
public async Task<BaseResponse<ManualPointsOutput>> ManualAddPoints(long userId, [FromBody] ManualAddPointsInput input)
{
try
{
var operatorId = GetCurrentUserId() ?? 0;
var operatorName = GetCurrentUserName() ?? "Unknown";
var ipAddress = HttpContext.Connection.RemoteIpAddress?.ToString();
var result = await _usersService.ManualAddPointsAsync(userId, input, operatorId, operatorName, ipAddress);
return Success(result, "手动增加积分成功");
}
catch (BusinessException ex)
{
_logger.LogWarning(ex, "手动增加积分业务异常: {Message}", ex.Message);
return BaseResponse<ManualPointsOutput>.Fail(ex.Message);
}
catch (Exception ex)
{
_logger.LogError(ex, "手动增加积分系统异常UserId: {UserId}", userId);
return BaseResponse<ManualPointsOutput>.Fail("手动增加积分失败,请稍后重试");
}
}
/// <summary>
/// 手动扣除用户积分
/// </summary>
[HttpPost("{userId}/points/deduct")]
public async Task<BaseResponse<ManualPointsOutput>> ManualDeductPoints(long userId, [FromBody] ManualDeductPointsInput input)
{
try
{
var operatorId = GetCurrentUserId() ?? 0;
var operatorName = GetCurrentUserName() ?? "Unknown";
var ipAddress = HttpContext.Connection.RemoteIpAddress?.ToString();
var result = await _usersService.ManualDeductPointsAsync(userId, input, operatorId, operatorName, ipAddress);
return Success(result, "手动扣除积分成功");
}
catch (BusinessException ex)
{
_logger.LogWarning(ex, "手动扣除积分业务异常: {Message}", ex.Message);
return BaseResponse<ManualPointsOutput>.Fail(ex.Message);
}
catch (Exception ex)
{
_logger.LogError(ex, "手动扣除积分系统异常UserId: {UserId}", userId);
return BaseResponse<ManualPointsOutput>.Fail("手动扣除积分失败,请稍后重试");
}
}
}