方式一:C#
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; }
}
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; }
}
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; }
}
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