C#实现一个带过期时间的积分系统的完整解决方案

方式一:C#

// Model/IntegralRecord.cs
public class IntegralRecord
{
   
   
    public long Id {
   
    get; set; }
    public short Type {
   
    get; set; }
    public string OriginalId {
   
    get; set; }
    public int Value {
   
    get; set; }
    public DateTime ExpireTime {
   
    get; set; }
    public string Reason {
   
    get; set; }
    public string UserId {
   
    get; set; }
    public bool Deleted {
   
    get; set; }
    public DateTime CreateTime {
   
    get; set; }
    public DateTime UpdateTime {
   
    get; set; }
}

// Model/UsableIntegral.cs
public class UsableIntegral
{
   
   
    public long Id {
   
    get; set; }
    public long RecordId {
   
    get; set; }
    public int Value {
   
    get; set; }
    public DateTime ExpireTime {
   
    get; set; }
    public string UserId {
   
    get; set; }
    public bool Deleted {
   
    get; set; }
    public DateTime CreateTime {
   
    get; set; }
    public DateTime UpdateTime {
   
    get; set; }
}

// Model/ReduceIntegralDetail.cs
public class ReduceIntegralDetail
{
   
   
    public long Id {
   
    get; set; }
    public long ReduceId {
   
    get; set; }
    public long AddId {
   
    get; set; }
    public int UsedValue {
   
    get; set; }
    public DateTime ExpireTime {
   
    get; set; }
    public string UserId {
   
    get; set; }
    public bool Deleted {
   
    get; set; }
    public DateTime CreateTime {
   
    get; set; }
    public DateTime UpdateTime {
   
    get; set; }
}

// Service/IntegralService.cs
public class IntegralService
{
   
   
    private readonly DbContext _context;
    
    public IntegralService(DbContext context)
    {
   
   
        _context = context;
    }

    // 获取用户当前可用总积分
    public async Task<int> GetUserTotalIntegral(string userId)
    {
   
   
        return await _context.UsableIntegrals
            .Where(u => u.UserId == userId && !u.Deleted)
            .SumAsync(u => u.Value);
    }

    // 获取用户积分明细
    public async Task<List<IntegralDetailDto>> GetUserIntegralDetails(string userId)
    {
   
   
        var records = await _context.IntegralRecords
            .Where(r => r.UserId == userId)
            .OrderByDescending(r => r.CreateTime)
            .Select(r => new IntegralDetailDto
            {
   
   
                Id = r.Id,
                Type = r.Type,
                Value = r.Value,
                ExpireTime = r.ExpireTime,
                Reason = r.Reason,
                CreateTime = r.CreateTime
            })
            .ToListAsync();

        return records;
    }

    // 处理积分过期
    public async Task HandleExpiredIntegral()
    {
   
   
        var now = DateTime.Now;
        var expiredIntegrals = await _context.UsableIntegrals
            .Where(u => !u.Deleted && u.ExpireTime <= now)
            .ToListAsync();

        foreach (var integral in expiredIntegrals)
        {
   
   
            // 标记为已删除
            integral.Deleted = true;
            integral.UpdateTime = now;

            // 添加过期记录
            var record = new IntegralRecord
            {
   
   
                Type = 3, // 过期类型
                Value = -integral.Value,
                ExpireTime = now,
                Reason = "积分过期",
                UserId = integral.UserId,
                CreateTime = now,
                UpdateTime = now
            };
            _context.IntegralRecords.Add(record);

            // 添加扣减详情
            var detail = new ReduceIntegralDetail
            {
   
   
                ReduceId = record.Id,
                AddId = integral.RecordId,
                UsedValue = integral.Value,
                ExpireTime = integral.ExpireTime,
                UserId = integral.UserId,
                CreateTime = now,
                UpdateTime = now
            };
            _context.ReduceIntegralDetails.Add(detail
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值