feat: 新增签到、宠物、期刊绑定、补偿任务等业务模块,优化微信登录流程
本次提交完成了多个核心业务模块的开发与优化: 1. 宠物模块:新增宠物实体、服务接口与实现,支持创建默认宠物、激活、喂养、进化以及喂养记录查询 2. 签到模块:新增签到实体、服务接口、控制器以及相关DTO,支持用户签到和签到信息查询,新增成长值奖励字段 3. 期刊绑定模块:新增用户期刊关联实体、服务接口与控制器,支持扫码绑定期刊、解绑和查询绑定列表 4. 补偿任务模块:新增补偿任务实体、服务接口与实现,用于处理业务失败后的异步重试补偿 5. 优化微信登录流程:拆分登录与快捷登录接口,支持手机号获取,新增首次登录自动创建默认宠物逻辑 6. 调整基础路由与实体状态:修改微信控制器路由前缀,更新宠物状态枚举与默认值
This commit is contained in:
@ -33,6 +33,13 @@ namespace QYZH.InteractiveMagazine.Models.Entity
|
||||
/// </summary>
|
||||
public int PointsAwarded {get;set;}
|
||||
|
||||
/// <summary>
|
||||
/// Desc:本次签到获得成长值(喂养宠物)
|
||||
/// Default:0
|
||||
/// Nullable:False
|
||||
/// </summary>
|
||||
public int GrowthPointsAwarded {get;set;}
|
||||
|
||||
/// <summary>
|
||||
/// Desc:连续签到天数
|
||||
/// Default:
|
||||
|
||||
108
QYZH.InteractiveMagazine.Models/Entity/CompensationTask.cs
Normal file
108
QYZH.InteractiveMagazine.Models/Entity/CompensationTask.cs
Normal file
@ -0,0 +1,108 @@
|
||||
using SqlSugar;
|
||||
|
||||
namespace QYZH.InteractiveMagazine.Models.Entity
|
||||
{
|
||||
/// <summary>
|
||||
/// 补偿任务表 — 记录业务执行失败后需要异步重试的操作
|
||||
/// </summary>
|
||||
[SugarTable("CompensationTask")]
|
||||
public partial class CompensationTask : SqlSugarBaseEntity
|
||||
{
|
||||
public CompensationTask() { }
|
||||
|
||||
/// <summary>
|
||||
/// Desc:任务类型,决定补偿处理逻辑
|
||||
/// PetFeeding — 宠物喂养补偿
|
||||
/// UserPoints — 用户积分补偿
|
||||
/// UserGrowth — 用户成长值补偿
|
||||
/// SendNotification — 发送通知补偿
|
||||
/// Default:
|
||||
/// Nullable:False
|
||||
/// </summary>
|
||||
public string TaskType { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Desc:业务来源(如 CheckIn、Purchase、Activity)
|
||||
/// Default:
|
||||
/// Nullable:False
|
||||
/// </summary>
|
||||
public string BusinessSource { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Desc:关联业务记录Id(如签到记录Id、订单Id)
|
||||
/// Default:
|
||||
/// Nullable:True
|
||||
/// </summary>
|
||||
public string? BusinessId { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Desc:关联用户Id
|
||||
/// Default:
|
||||
/// Nullable:False
|
||||
/// </summary>
|
||||
public long UserId { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Desc:处理参数(JSON格式,不同TaskType对应不同结构)
|
||||
/// Default:
|
||||
/// Nullable:False
|
||||
/// </summary>
|
||||
public string Payload { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Desc:原始异常消息
|
||||
/// Default:
|
||||
/// Nullable:False
|
||||
/// </summary>
|
||||
public string ErrorMessage { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Desc:异常来源(如 CheckInService.CheckInAsync)
|
||||
/// Default:
|
||||
/// Nullable:False
|
||||
/// </summary>
|
||||
public string ErrorSource { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Desc:已重试次数
|
||||
/// Default:0
|
||||
/// Nullable:False
|
||||
/// </summary>
|
||||
public int RetryCount { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Desc:最大重试次数
|
||||
/// Default:3
|
||||
/// Nullable:False
|
||||
/// </summary>
|
||||
public int MaxRetries { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Desc:处理状态 Pending / Processing / Success / Failed / Cancelled
|
||||
/// Default:Pending
|
||||
/// Nullable:False
|
||||
/// </summary>
|
||||
public new string Status { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Desc:最后处理时间
|
||||
/// Default:
|
||||
/// Nullable:True
|
||||
/// </summary>
|
||||
public DateTime? ProcessedAt { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Desc:下次计划执行时间(用于退避重试)
|
||||
/// Default:
|
||||
/// Nullable:True
|
||||
/// </summary>
|
||||
public DateTime? ScheduledAt { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Desc:处理结果描述(成功/失败原因)
|
||||
/// Default:
|
||||
/// Nullable:True
|
||||
/// </summary>
|
||||
public string? ResultMessage { get; set; }
|
||||
}
|
||||
}
|
||||
@ -55,8 +55,8 @@ namespace QYZH.InteractiveMagazine.Models.Entity
|
||||
public string Type {get;set;}
|
||||
|
||||
/// <summary>
|
||||
/// Desc:状态: Active, Sleeping
|
||||
/// Default:Active
|
||||
/// Desc:状态: Inactive, Active, Sleeping
|
||||
/// Default:Inactive
|
||||
/// Nullable:False
|
||||
/// </summary>
|
||||
public string Status {get;set;}
|
||||
|
||||
56
QYZH.InteractiveMagazine.Models/Entity/UserJournal.cs
Normal file
56
QYZH.InteractiveMagazine.Models/Entity/UserJournal.cs
Normal file
@ -0,0 +1,56 @@
|
||||
using SqlSugar;
|
||||
|
||||
namespace QYZH.InteractiveMagazine.Models.Entity
|
||||
{
|
||||
///<summary>
|
||||
///用户与期刊关联表
|
||||
///</summary>
|
||||
[SugarTable("UserJournal")]
|
||||
public partial class UserJournal : SqlSugarBaseEntity
|
||||
{
|
||||
public UserJournal()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Desc:用户Id
|
||||
/// Default:
|
||||
/// Nullable:False
|
||||
/// </summary>
|
||||
[SugarColumn(ColumnName = "UserId")]
|
||||
public long UserId { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Desc:期刊模板Id(对应Journal表的期刊定义)
|
||||
/// Default:
|
||||
/// Nullable:False
|
||||
/// </summary>
|
||||
[SugarColumn(ColumnName = "JournalId")]
|
||||
public long JournalId { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Desc:实例化期刊Id(扫码获取的具体期刊实例,可为空表示绑定到期刊模板本身)
|
||||
/// Default:
|
||||
/// Nullable:True
|
||||
/// </summary>
|
||||
[SugarColumn(ColumnName = "JournalInstanceId", IsNullable = true)]
|
||||
public long? JournalInstanceId { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Desc:关联类型: Read(已读), Favorite(收藏), Subscribe(订阅)
|
||||
/// Default:Read
|
||||
/// Nullable:False
|
||||
/// </summary>
|
||||
[SugarColumn(ColumnName = "Type")]
|
||||
public string Type { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Desc:状态: Active(正常), Inactive(失效)
|
||||
/// Default:Active
|
||||
/// Nullable:False
|
||||
/// </summary>
|
||||
[SugarColumn(ColumnName = "Status")]
|
||||
public new string Status { get; set; }
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user