feat(notify): 新增用户通知授权管理功能

- 添加用户通知授权记录的完整CRUD操作
- 实现授权次数的记录与消费逻辑
- 提供授权状态检查与剩余次数查询接口
- 支持按用户、模板或景区维度查询授权记录
- 新增授权统计信息接口,包括总授权数、消费数等
- 完成移动端相关请求/响应DTO定义
- 集成MyBatis Mapper实现数据持久化操作
- 添加服务层事务控制确保操作一致性
This commit is contained in:
2025-10-14 21:54:45 +08:00
parent 19ca91778f
commit 44b20890d5
13 changed files with 1001 additions and 0 deletions

View File

@@ -0,0 +1,28 @@
package com.ycwl.basic.model.mobile.notify.req;
import lombok.Data;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotNull;
/**
* 通知授权检查请求
*
* @Author: System
* @Date: 2024/12/28
*/
@Data
public class NotificationAuthCheckReq {
/**
* 通知模板ID
*/
@NotBlank(message = "模板ID不能为空")
private String templateId;
/**
* 景区ID
*/
@NotNull(message = "景区ID不能为空")
private Long scenicId;
}

View File

@@ -0,0 +1,28 @@
package com.ycwl.basic.model.mobile.notify.req;
import lombok.Data;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotNull;
/**
* 通知授权消费请求
*
* @Author: System
* @Date: 2024/12/28
*/
@Data
public class NotificationAuthConsumeReq {
/**
* 通知模板ID
*/
@NotBlank(message = "模板ID不能为空")
private String templateId;
/**
* 景区ID
*/
@NotNull(message = "景区ID不能为空")
private Long scenicId;
}

View File

@@ -0,0 +1,28 @@
package com.ycwl.basic.model.mobile.notify.req;
import lombok.Data;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotNull;
/**
* 通知授权记录请求
*
* @Author: System
* @Date: 2024/12/28
*/
@Data
public class NotificationAuthRecordReq {
/**
* 通知模板ID
*/
@NotBlank(message = "模板ID不能为空")
private String templateId;
/**
* 景区ID
*/
@NotNull(message = "景区ID不能为空")
private Long scenicId;
}

View File

@@ -0,0 +1,28 @@
package com.ycwl.basic.model.mobile.notify.req;
import lombok.Data;
/**
* 通知授权记录查询请求
*
* @Author: System
* @Date: 2024/12/28
*/
@Data
public class NotificationAuthRecordsReq {
/**
* 模板ID(可选)
*/
private String templateId;
/**
* 页码
*/
private Integer page = 1;
/**
* 每页大小
*/
private Integer size = 10;
}

View File

@@ -0,0 +1,55 @@
package com.ycwl.basic.model.mobile.notify.resp;
import lombok.Data;
import java.util.Date;
/**
* 通知授权检查响应
*
* @Author: System
* @Date: 2024/12/28
*/
@Data
public class NotificationAuthCheckResp {
/**
* 是否有授权
*/
private Boolean hasAuthorization;
/**
* 剩余授权次数
*/
private Integer remainingCount;
/**
* 总授权次数
*/
private Integer authorizationCount;
/**
* 已消费次数
*/
private Integer consumedCount;
/**
* 最后授权时间
*/
private Date lastAuthorizedTime;
/**
* 最后消费时间
*/
private Date lastConsumedTime;
/**
* 模板ID
*/
private String templateId;
/**
* 景区ID
*/
private Long scenicId;
}

View File

@@ -0,0 +1,28 @@
package com.ycwl.basic.model.mobile.notify.resp;
import lombok.Data;
/**
* 通知授权消费响应
*
* @Author: System
* @Date: 2024/12/28
*/
@Data
public class NotificationAuthConsumeResp {
/**
* 是否消费成功
*/
private Boolean consumeSuccess;
/**
* 剩余授权次数
*/
private Integer remainingCount;
/**
* 消费失败原因
*/
private String failReason;
}

View File

@@ -0,0 +1,70 @@
package com.ycwl.basic.model.mobile.notify.resp;
import lombok.Data;
import java.util.Date;
/**
* 通知授权记录响应
*
* @Author: System
* @Date: 2024/12/28
*/
@Data
public class NotificationAuthRecordResp {
/**
* 记录ID
*/
private Long id;
/**
* 模板ID
*/
private String templateId;
/**
* 景区ID
*/
private Long scenicId;
/**
* 景区名称
*/
private String scenicName;
/**
* 授权次数
*/
private Integer authorizationCount;
/**
* 已消费次数
*/
private Integer consumedCount;
/**
* 剩余授权次数
*/
private Integer remainingCount;
/**
* 最后授权时间
*/
private Date lastAuthorizedTime;
/**
* 最后消费时间
*/
private Date lastConsumedTime;
/**
* 状态
*/
private Integer status;
/**
* 创建时间
*/
private Date createTime;
}

View File

@@ -0,0 +1,79 @@
package com.ycwl.basic.model.pc.notify.entity;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import java.util.Date;
/**
* 用户通知授权记录实体类
*
* @Author: System
* @Date: 2024/12/28
*/
@Data
@TableName("user_notification_authorization")
public class UserNotificationAuthorizationEntity {
/**
* 主键ID
*/
@TableId
private Long id;
/**
* 用户ID
*/
private Long memberId;
/**
* 通知模板ID(微信消息模板ID)
*/
private String templateId;
/**
* 景区ID
*/
private Long scenicId;
/**
* 授权次数
*/
private Integer authorizationCount;
/**
* 已消费次数
*/
private Integer consumedCount;
/**
* 剩余授权次数(计算字段)
*/
private Integer remainingCount;
/**
* 最后授权时间
*/
private Date lastAuthorizedTime;
/**
* 最后消费时间
*/
private Date lastConsumedTime;
/**
* 状态:1-有效,0-无效
*/
private Integer status;
/**
* 创建时间
*/
private Date createTime;
/**
* 更新时间
*/
private Date updateTime;
}