Prechádzať zdrojové kódy

feat(push): 添加推送系统核心功能模块

- 新增推送渠道配置表实体类及对应的服务层实现
- 新增推送审核表实体类及对应的控制器和服务层实现
- 新增推送任务表实体类及完整的CRUD操作支持
- 新增推送任务用户关联表实体类及管理接口
- 实现推送系统的完整数据模型和业务逻辑层
- 集成MyBatis-Plus分页查询和条件筛选功能
- 添加Swagger API文档注解和统一返回结果封装
fcw 1 deň pred
rodič
commit
5dd0dd0476
20 zmenil súbory, kde vykonal 1101 pridanie a 0 odobranie
  1. 105 0
      alien-entity/src/main/java/shop/alien/entity/store/CommonPushChannelConfig.java
  2. 75 0
      alien-entity/src/main/java/shop/alien/entity/store/CommonPushReview.java
  3. 152 0
      alien-entity/src/main/java/shop/alien/entity/store/CommonPushTask.java
  4. 78 0
      alien-entity/src/main/java/shop/alien/entity/store/CommonPushTaskUser.java
  5. 7 0
      alien-entity/src/main/java/shop/alien/mapper/CommonPushChannelConfigMapper.java
  6. 7 0
      alien-entity/src/main/java/shop/alien/mapper/CommonPushReviewMapper.java
  7. 7 0
      alien-entity/src/main/java/shop/alien/mapper/CommonPushTaskMapper.java
  8. 7 0
      alien-entity/src/main/java/shop/alien/mapper/CommonPushTaskUserMapper.java
  9. 78 0
      alien-store/src/main/java/shop/alien/store/controller/CommonPushChannelConfigController.java
  10. 76 0
      alien-store/src/main/java/shop/alien/store/controller/CommonPushReviewController.java
  11. 80 0
      alien-store/src/main/java/shop/alien/store/controller/CommonPushTaskController.java
  12. 78 0
      alien-store/src/main/java/shop/alien/store/controller/CommonPushTaskUserController.java
  13. 19 0
      alien-store/src/main/java/shop/alien/store/service/CommonPushChannelConfigService.java
  14. 19 0
      alien-store/src/main/java/shop/alien/store/service/CommonPushReviewService.java
  15. 19 0
      alien-store/src/main/java/shop/alien/store/service/CommonPushTaskService.java
  16. 19 0
      alien-store/src/main/java/shop/alien/store/service/CommonPushTaskUserService.java
  17. 69 0
      alien-store/src/main/java/shop/alien/store/service/impl/CommonPushChannelConfigServiceImpl.java
  18. 65 0
      alien-store/src/main/java/shop/alien/store/service/impl/CommonPushReviewServiceImpl.java
  19. 72 0
      alien-store/src/main/java/shop/alien/store/service/impl/CommonPushTaskServiceImpl.java
  20. 69 0
      alien-store/src/main/java/shop/alien/store/service/impl/CommonPushTaskUserServiceImpl.java

+ 105 - 0
alien-entity/src/main/java/shop/alien/entity/store/CommonPushChannelConfig.java

@@ -0,0 +1,105 @@
+package shop.alien.entity.store;
+
+import com.baomidou.mybatisplus.annotation.*;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.fasterxml.jackson.annotation.JsonInclude;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * 推送渠道配置表
+ */
+@Data
+@JsonInclude
+@TableName("common_push_channel_config")
+@ApiModel(value = "CommonPushChannelConfig", description = "推送渠道配置表")
+public class CommonPushChannelConfig implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty("主键ID")
+    @TableId(value = "id", type = IdType.AUTO)
+    private Long id;
+
+    @ApiModelProperty("渠道编码,唯一:apns/huawei/xiaomi/oppo/vivo/honor")
+    @TableField("channel_code")
+    private String channelCode;
+
+    @ApiModelProperty("渠道显示名称")
+    @TableField("channel_name")
+    private String channelName;
+
+    @ApiModelProperty("平台:iOS/Android")
+    @TableField("platform")
+    private String platform;
+
+    @ApiModelProperty("渠道开关:0-禁用 1-启用")
+    @TableField("enable")
+    private Integer enable;
+
+    @ApiModelProperty("并发优先级:P1/P2/P3,数字越小优先级越高")
+    @TableField("priority_level")
+    private String priorityLevel;
+
+    @ApiModelProperty("每日发送配额上限,0表示不限")
+    @TableField("daily_quota")
+    private Integer dailyQuota;
+
+    @ApiModelProperty("厂商凭证JSON(BundleID、TeamID、AuthKey等)")
+    @TableField("credential_json")
+    private String credentialJson;
+
+    @ApiModelProperty("今日已用推送数")
+    @TableField("today_usage")
+    private Integer todayUsage;
+
+    @ApiModelProperty("送达成功率百分比")
+    @TableField("success_rate")
+    private BigDecimal successRate;
+
+    @ApiModelProperty("证书过期时间(仅APNs)")
+    @TableField("cert_expire_time")
+    @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
+    private Date certExpireTime;
+
+    @ApiModelProperty("最近连通性测试时间")
+    @TableField("last_test_time")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    private Date lastTestTime;
+
+    @ApiModelProperty("在线状态:0-离线 1-在线")
+    @TableField("connect_status")
+    private Integer connectStatus;
+
+    @ApiModelProperty("告警信息(如配额预警)")
+    @TableField("warn_msg")
+    private String warnMsg;
+
+    @ApiModelProperty("删除标记,0:未删除,1:已删除")
+    @TableField("delete_flag")
+    @TableLogic
+    private Integer deleteFlag;
+
+    @ApiModelProperty("创建时间")
+    @TableField(value = "created_time", fill = FieldFill.INSERT)
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    private Date createdTime;
+
+    @ApiModelProperty("创建人ID")
+    @TableField("created_user_id")
+    private Integer createdUserId;
+
+    @ApiModelProperty("修改时间")
+    @TableField(value = "updated_time", fill = FieldFill.INSERT_UPDATE)
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    private Date updatedTime;
+
+    @ApiModelProperty("修改人ID")
+    @TableField("updated_user_id")
+    private Integer updatedUserId;
+}

+ 75 - 0
alien-entity/src/main/java/shop/alien/entity/store/CommonPushReview.java

@@ -0,0 +1,75 @@
+package shop.alien.entity.store;
+
+import com.baomidou.mybatisplus.annotation.*;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.fasterxml.jackson.annotation.JsonInclude;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * 推送审核表
+ */
+@Data
+@JsonInclude
+@TableName("common_push_review")
+@ApiModel(value = "CommonPushReview", description = "推送审核表")
+public class CommonPushReview implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty("主键ID")
+    @TableId(value = "id", type = IdType.AUTO)
+    private Long id;
+
+    @ApiModelProperty("关联推送主表 common_push_task.id")
+    @TableField("push_task_id")
+    private Long pushTaskId;
+
+    @ApiModelProperty("审核状态:0-草稿/待提交 1-待审核 2-审核通过 3-审核驳回")
+    @TableField("review_status")
+    private Integer reviewStatus;
+
+    @ApiModelProperty("任务驳回次数,达到3次不可再次提交")
+    @TableField("reject_count")
+    private Integer rejectCount;
+
+    @ApiModelProperty("审核驳回原因")
+    @TableField("reject_reason")
+    private String rejectReason;
+
+    @ApiModelProperty("审核人用户ID")
+    @TableField("review_by")
+    private Long reviewBy;
+
+    @ApiModelProperty("审核操作时间")
+    @TableField("review_at")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    private Date reviewAt;
+
+    @ApiModelProperty("删除标记,0:未删除,1:已删除")
+    @TableField("delete_flag")
+    @TableLogic
+    private Integer deleteFlag;
+
+    @ApiModelProperty("创建时间")
+    @TableField(value = "created_time", fill = FieldFill.INSERT)
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    private Date createdTime;
+
+    @ApiModelProperty("创建人ID")
+    @TableField("created_user_id")
+    private Integer createdUserId;
+
+    @ApiModelProperty("修改时间")
+    @TableField(value = "updated_time", fill = FieldFill.INSERT_UPDATE)
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    private Date updatedTime;
+
+    @ApiModelProperty("修改人ID")
+    @TableField("updated_user_id")
+    private Integer updatedUserId;
+}

+ 152 - 0
alien-entity/src/main/java/shop/alien/entity/store/CommonPushTask.java

@@ -0,0 +1,152 @@
+package shop.alien.entity.store;
+
+import com.baomidou.mybatisplus.annotation.*;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.fasterxml.jackson.annotation.JsonInclude;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * 推送任务表
+ */
+@Data
+@JsonInclude
+@TableName("common_push_task")
+@ApiModel(value = "CommonPushTask", description = "推送任务表")
+public class CommonPushTask implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty("主键ID")
+    @TableId(value = "id", type = IdType.AUTO)
+    private Long id;
+
+    @ApiModelProperty("任务编号,全局唯一,自动生成")
+    @TableField("task_no")
+    private String taskNo;
+
+    @ApiModelProperty("推送标题")
+    @TableField("title")
+    private String title;
+
+    @ApiModelProperty("推送正文内容")
+    @TableField("content")
+    private String content;
+
+    @ApiModelProperty("推送类型:1-交易类 2-系统类 3-运营类 4-社交类")
+    @TableField("push_type")
+    private Integer pushType;
+
+    @ApiModelProperty("所选渠道数组,如 [\"notification\",\"inapp\"]")
+    @TableField("channels")
+    private String channels;
+
+    @ApiModelProperty("通知栏样式:1-文本 2-大图 3-大文本 4-收件箱")
+    @TableField("notification_style")
+    private Integer notificationStyle;
+
+    @ApiModelProperty("应用内类型:1-Banner 2-弹窗 3-卡片 4-全屏大图")
+    @TableField("inapp_type")
+    private Integer inappType;
+
+    @ApiModelProperty("推送图片OSS地址")
+    @TableField("image_url")
+    private String imageUrl;
+
+    @ApiModelProperty("跳转方式:1-首页 2-Deeplink 3-URL")
+    @TableField("jump_type")
+    private Integer jumpType;
+
+    @ApiModelProperty("跳转链接")
+    @TableField("jump_url")
+    private String jumpUrl;
+
+    @ApiModelProperty("附加键值参数JSON")
+    @TableField("extra_params")
+    private String extraParams;
+
+    @ApiModelProperty("推送声音:default/silent/自定义声音名")
+    @TableField("sound")
+    private String sound;
+
+    @ApiModelProperty("目标类型:1-全量 2-分组 3-标签 4-导入 5-条件")
+    @TableField("target_type")
+    private Integer targetType;
+
+    @ApiModelProperty("目标配置JSON:分组ID/标签ID/表达式等")
+    @TableField("target_config")
+    private String targetConfig;
+
+    @ApiModelProperty("创建时预估目标用户数")
+    @TableField("estimated_count")
+    private Integer estimatedCount;
+
+    @ApiModelProperty("实际发送人数,完成后回填")
+    @TableField("actual_count")
+    private Integer actualCount;
+
+    @ApiModelProperty("发送方式:1-立即 2-定时 3-周期 4-事件触发")
+    @TableField("send_type")
+    private Integer sendType;
+
+    @ApiModelProperty("定时执行时间")
+    @TableField("scheduled_at")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    private Date scheduledAt;
+
+    @ApiModelProperty("周期推送Cron表达式")
+    @TableField("cron_expr")
+    private String cronExpr;
+
+    @ApiModelProperty("定时推送过期时间")
+    @TableField("expire_at")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    private Date expireAt;
+
+    @ApiModelProperty("智能时机:0-否 1-是")
+    @TableField("smart_timing")
+    private Integer smartTiming;
+
+    @ApiModelProperty("优先级:1-普通 2-高 3-紧急")
+    @TableField("priority")
+    private Integer priority;
+
+    @ApiModelProperty("任务状态(状态机)")
+    @TableField("status")
+    private String status;
+
+    @ApiModelProperty("运营内部备注")
+    @TableField("remark")
+    private String remark;
+
+    @ApiModelProperty("关联消息模板ID")
+    @TableField("template_id")
+    private Long templateId;
+
+    @ApiModelProperty("删除标记,0:未删除,1:已删除")
+    @TableField("delete_flag")
+    @TableLogic
+    private Integer deleteFlag;
+
+    @ApiModelProperty("创建时间")
+    @TableField(value = "created_time", fill = FieldFill.INSERT)
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    private Date createdTime;
+
+    @ApiModelProperty("创建人ID")
+    @TableField("created_user_id")
+    private Integer createdUserId;
+
+    @ApiModelProperty("修改时间")
+    @TableField(value = "updated_time", fill = FieldFill.INSERT_UPDATE)
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    private Date updatedTime;
+
+    @ApiModelProperty("修改人ID")
+    @TableField("updated_user_id")
+    private Integer updatedUserId;
+}

+ 78 - 0
alien-entity/src/main/java/shop/alien/entity/store/CommonPushTaskUser.java

@@ -0,0 +1,78 @@
+package shop.alien.entity.store;
+
+import com.baomidou.mybatisplus.annotation.*;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.fasterxml.jackson.annotation.JsonInclude;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * 推送任务用户关联表
+ */
+@Data
+@JsonInclude
+@TableName("common_push_task_user")
+@ApiModel(value = "CommonPushTaskUser", description = "推送任务用户关联表")
+public class CommonPushTaskUser implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty("主键ID")
+    @TableId(value = "id", type = IdType.AUTO)
+    private Long id;
+
+    @ApiModelProperty("关联推送主表 common_push_task.id")
+    @TableField("push_task_id")
+    private Long pushTaskId;
+
+    @ApiModelProperty("关联系统用户ID(允许重复,同一用户可多设备)")
+    @TableField("user_id")
+    private Long userId;
+
+    @ApiModelProperty("设备唯一标识ID")
+    @TableField("device_id")
+    private String deviceId;
+
+    @ApiModelProperty("关联类型:1-接收用户 2-协办人 3-权限查看人")
+    @TableField("rel_type")
+    private Integer relType;
+
+    @ApiModelProperty("发送状态:0-已发送 1-已送达")
+    @TableField("status")
+    private String status;
+
+    @ApiModelProperty("展示状态:0-未展示 1-已展示")
+    @TableField("show_info")
+    private String showInfo;
+
+    @ApiModelProperty("点击状态:0-未点击 1-已点击")
+    @TableField("user_add")
+    private String userAdd;
+
+    @ApiModelProperty("删除标记,0:未删除,1:已删除")
+    @TableField("delete_flag")
+    @TableLogic
+    private Integer deleteFlag;
+
+    @ApiModelProperty("创建时间")
+    @TableField(value = "created_time", fill = FieldFill.INSERT)
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    private Date createdTime;
+
+    @ApiModelProperty("创建人ID")
+    @TableField("created_user_id")
+    private Integer createdUserId;
+
+    @ApiModelProperty("修改时间")
+    @TableField(value = "updated_time", fill = FieldFill.INSERT_UPDATE)
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    private Date updatedTime;
+
+    @ApiModelProperty("修改人ID")
+    @TableField("updated_user_id")
+    private Integer updatedUserId;
+}

+ 7 - 0
alien-entity/src/main/java/shop/alien/mapper/CommonPushChannelConfigMapper.java

@@ -0,0 +1,7 @@
+package shop.alien.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import shop.alien.entity.store.CommonPushChannelConfig;
+
+public interface CommonPushChannelConfigMapper extends BaseMapper<CommonPushChannelConfig> {
+}

+ 7 - 0
alien-entity/src/main/java/shop/alien/mapper/CommonPushReviewMapper.java

@@ -0,0 +1,7 @@
+package shop.alien.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import shop.alien.entity.store.CommonPushReview;
+
+public interface CommonPushReviewMapper extends BaseMapper<CommonPushReview> {
+}

+ 7 - 0
alien-entity/src/main/java/shop/alien/mapper/CommonPushTaskMapper.java

@@ -0,0 +1,7 @@
+package shop.alien.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import shop.alien.entity.store.CommonPushTask;
+
+public interface CommonPushTaskMapper extends BaseMapper<CommonPushTask> {
+}

+ 7 - 0
alien-entity/src/main/java/shop/alien/mapper/CommonPushTaskUserMapper.java

@@ -0,0 +1,7 @@
+package shop.alien.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import shop.alien.entity.store.CommonPushTaskUser;
+
+public interface CommonPushTaskUserMapper extends BaseMapper<CommonPushTaskUser> {
+}

+ 78 - 0
alien-store/src/main/java/shop/alien/store/controller/CommonPushChannelConfigController.java

@@ -0,0 +1,78 @@
+package shop.alien.store.controller;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiImplicitParam;
+import io.swagger.annotations.ApiImplicitParams;
+import io.swagger.annotations.ApiOperation;
+import io.swagger.annotations.ApiOperationSupport;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.web.bind.annotation.*;
+import shop.alien.entity.result.R;
+import shop.alien.entity.store.CommonPushChannelConfig;
+import shop.alien.store.service.CommonPushChannelConfigService;
+
+@Api(tags = {"推送渠道配置管理"})
+@Slf4j
+@RestController
+@CrossOrigin
+@RequestMapping("/commonPushChannelConfig")
+@RequiredArgsConstructor
+public class CommonPushChannelConfigController {
+
+    private final CommonPushChannelConfigService commonPushChannelConfigService;
+
+    @ApiOperation("新增推送渠道配置")
+    @ApiOperationSupport(order = 1)
+    @PostMapping("/add")
+    public R<String> add(@RequestBody CommonPushChannelConfig config) {
+        return commonPushChannelConfigService.add(config);
+    }
+
+    @ApiOperation("根据主键删除(逻辑删除)")
+    @ApiOperationSupport(order = 2)
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "id", value = "主键ID", dataType = "Long", paramType = "query", required = true)
+    })
+    @GetMapping("/deleteById")
+    public R<String> deleteById(@RequestParam Long id) {
+        return commonPushChannelConfigService.deleteById(id);
+    }
+
+    @ApiOperation("更新推送渠道配置")
+    @ApiOperationSupport(order = 3)
+    @PostMapping("/update")
+    public R<String> update(@RequestBody CommonPushChannelConfig config) {
+        return commonPushChannelConfigService.update(config);
+    }
+
+    @ApiOperation("根据主键查询")
+    @ApiOperationSupport(order = 4)
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "id", value = "主键ID", dataType = "Long", paramType = "query", required = true)
+    })
+    @GetMapping("/getById")
+    public R<CommonPushChannelConfig> getById(@RequestParam Long id) {
+        return commonPushChannelConfigService.getInfoById(id);
+    }
+
+    @ApiOperation("分页列表")
+    @ApiOperationSupport(order = 5)
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "pageNum", value = "页码", dataType = "Integer", paramType = "query", required = true),
+            @ApiImplicitParam(name = "pageSize", value = "每页数量", dataType = "Integer", paramType = "query", required = true),
+            @ApiImplicitParam(name = "channelCode", value = "渠道编码", dataType = "String", paramType = "query"),
+            @ApiImplicitParam(name = "platform", value = "平台", dataType = "String", paramType = "query"),
+            @ApiImplicitParam(name = "enable", value = "是否启用", dataType = "Integer", paramType = "query")
+    })
+    @GetMapping("/list")
+    public R<IPage<CommonPushChannelConfig>> list(
+            @RequestParam Integer pageNum,
+            @RequestParam Integer pageSize,
+            @RequestParam(required = false) String channelCode,
+            @RequestParam(required = false) String platform,
+            @RequestParam(required = false) Integer enable) {
+        return commonPushChannelConfigService.list(pageNum, pageSize, channelCode, platform, enable);
+    }
+}

+ 76 - 0
alien-store/src/main/java/shop/alien/store/controller/CommonPushReviewController.java

@@ -0,0 +1,76 @@
+package shop.alien.store.controller;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiImplicitParam;
+import io.swagger.annotations.ApiImplicitParams;
+import io.swagger.annotations.ApiOperation;
+import io.swagger.annotations.ApiOperationSupport;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.web.bind.annotation.*;
+import shop.alien.entity.result.R;
+import shop.alien.entity.store.CommonPushReview;
+import shop.alien.store.service.CommonPushReviewService;
+
+@Api(tags = {"推送审核管理"})
+@Slf4j
+@RestController
+@CrossOrigin
+@RequestMapping("/commonPushReview")
+@RequiredArgsConstructor
+public class CommonPushReviewController {
+
+    private final CommonPushReviewService commonPushReviewService;
+
+    @ApiOperation("新增推送审核记录")
+    @ApiOperationSupport(order = 1)
+    @PostMapping("/add")
+    public R<String> add(@RequestBody CommonPushReview review) {
+        return commonPushReviewService.add(review);
+    }
+
+    @ApiOperation("根据主键删除(逻辑删除)")
+    @ApiOperationSupport(order = 2)
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "id", value = "主键ID", dataType = "Long", paramType = "query", required = true)
+    })
+    @GetMapping("/deleteById")
+    public R<String> deleteById(@RequestParam Long id) {
+        return commonPushReviewService.deleteById(id);
+    }
+
+    @ApiOperation("更新推送审核记录")
+    @ApiOperationSupport(order = 3)
+    @PostMapping("/update")
+    public R<String> update(@RequestBody CommonPushReview review) {
+        return commonPushReviewService.update(review);
+    }
+
+    @ApiOperation("根据主键查询")
+    @ApiOperationSupport(order = 4)
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "id", value = "主键ID", dataType = "Long", paramType = "query", required = true)
+    })
+    @GetMapping("/getById")
+    public R<CommonPushReview> getById(@RequestParam Long id) {
+        return commonPushReviewService.getInfoById(id);
+    }
+
+    @ApiOperation("分页列表")
+    @ApiOperationSupport(order = 5)
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "pageNum", value = "页码", dataType = "Integer", paramType = "query", required = true),
+            @ApiImplicitParam(name = "pageSize", value = "每页数量", dataType = "Integer", paramType = "query", required = true),
+            @ApiImplicitParam(name = "pushTaskId", value = "推送任务ID", dataType = "Long", paramType = "query"),
+            @ApiImplicitParam(name = "reviewStatus", value = "审核状态", dataType = "Integer", paramType = "query")
+    })
+    @GetMapping("/list")
+    public R<IPage<CommonPushReview>> list(
+            @RequestParam Integer pageNum,
+            @RequestParam Integer pageSize,
+            @RequestParam(required = false) Long pushTaskId,
+            @RequestParam(required = false) Integer reviewStatus) {
+        return commonPushReviewService.list(pageNum, pageSize, pushTaskId, reviewStatus);
+    }
+}

+ 80 - 0
alien-store/src/main/java/shop/alien/store/controller/CommonPushTaskController.java

@@ -0,0 +1,80 @@
+package shop.alien.store.controller;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiImplicitParam;
+import io.swagger.annotations.ApiImplicitParams;
+import io.swagger.annotations.ApiOperation;
+import io.swagger.annotations.ApiOperationSupport;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.web.bind.annotation.*;
+import shop.alien.entity.result.R;
+import shop.alien.entity.store.CommonPushTask;
+import shop.alien.store.service.CommonPushTaskService;
+
+@Api(tags = {"推送任务管理"})
+@Slf4j
+@RestController
+@CrossOrigin
+@RequestMapping("/commonPushTask")
+@RequiredArgsConstructor
+public class CommonPushTaskController {
+
+    private final CommonPushTaskService commonPushTaskService;
+
+    @ApiOperation("新增推送任务")
+    @ApiOperationSupport(order = 1)
+    @PostMapping("/add")
+    public R<String> add(@RequestBody CommonPushTask task) {
+        return commonPushTaskService.add(task);
+    }
+
+    @ApiOperation("根据主键删除(逻辑删除)")
+    @ApiOperationSupport(order = 2)
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "id", value = "主键ID", dataType = "Long", paramType = "query", required = true)
+    })
+    @GetMapping("/deleteById")
+    public R<String> deleteById(@RequestParam Long id) {
+        return commonPushTaskService.deleteById(id);
+    }
+
+    @ApiOperation("更新推送任务")
+    @ApiOperationSupport(order = 3)
+    @PostMapping("/update")
+    public R<String> update(@RequestBody CommonPushTask task) {
+        return commonPushTaskService.update(task);
+    }
+
+    @ApiOperation("根据主键查询")
+    @ApiOperationSupport(order = 4)
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "id", value = "主键ID", dataType = "Long", paramType = "query", required = true)
+    })
+    @GetMapping("/getById")
+    public R<CommonPushTask> getById(@RequestParam Long id) {
+        return commonPushTaskService.getInfoById(id);
+    }
+
+    @ApiOperation("分页列表")
+    @ApiOperationSupport(order = 5)
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "pageNum", value = "页码", dataType = "Integer", paramType = "query", required = true),
+            @ApiImplicitParam(name = "pageSize", value = "每页数量", dataType = "Integer", paramType = "query", required = true),
+            @ApiImplicitParam(name = "taskNo", value = "任务编号", dataType = "String", paramType = "query"),
+            @ApiImplicitParam(name = "title", value = "标题(模糊)", dataType = "String", paramType = "query"),
+            @ApiImplicitParam(name = "status", value = "任务状态", dataType = "String", paramType = "query"),
+            @ApiImplicitParam(name = "pushType", value = "推送类型", dataType = "Integer", paramType = "query")
+    })
+    @GetMapping("/list")
+    public R<IPage<CommonPushTask>> list(
+            @RequestParam Integer pageNum,
+            @RequestParam Integer pageSize,
+            @RequestParam(required = false) String taskNo,
+            @RequestParam(required = false) String title,
+            @RequestParam(required = false) String status,
+            @RequestParam(required = false) Integer pushType) {
+        return commonPushTaskService.list(pageNum, pageSize, taskNo, title, status, pushType);
+    }
+}

+ 78 - 0
alien-store/src/main/java/shop/alien/store/controller/CommonPushTaskUserController.java

@@ -0,0 +1,78 @@
+package shop.alien.store.controller;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiImplicitParam;
+import io.swagger.annotations.ApiImplicitParams;
+import io.swagger.annotations.ApiOperation;
+import io.swagger.annotations.ApiOperationSupport;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.web.bind.annotation.*;
+import shop.alien.entity.result.R;
+import shop.alien.entity.store.CommonPushTaskUser;
+import shop.alien.store.service.CommonPushTaskUserService;
+
+@Api(tags = {"推送任务用户管理"})
+@Slf4j
+@RestController
+@CrossOrigin
+@RequestMapping("/commonPushTaskUser")
+@RequiredArgsConstructor
+public class CommonPushTaskUserController {
+
+    private final CommonPushTaskUserService commonPushTaskUserService;
+
+    @ApiOperation("新增推送任务用户关联")
+    @ApiOperationSupport(order = 1)
+    @PostMapping("/add")
+    public R<String> add(@RequestBody CommonPushTaskUser taskUser) {
+        return commonPushTaskUserService.add(taskUser);
+    }
+
+    @ApiOperation("根据主键删除(逻辑删除)")
+    @ApiOperationSupport(order = 2)
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "id", value = "主键ID", dataType = "Long", paramType = "query", required = true)
+    })
+    @GetMapping("/deleteById")
+    public R<String> deleteById(@RequestParam Long id) {
+        return commonPushTaskUserService.deleteById(id);
+    }
+
+    @ApiOperation("更新推送任务用户关联")
+    @ApiOperationSupport(order = 3)
+    @PostMapping("/update")
+    public R<String> update(@RequestBody CommonPushTaskUser taskUser) {
+        return commonPushTaskUserService.update(taskUser);
+    }
+
+    @ApiOperation("根据主键查询")
+    @ApiOperationSupport(order = 4)
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "id", value = "主键ID", dataType = "Long", paramType = "query", required = true)
+    })
+    @GetMapping("/getById")
+    public R<CommonPushTaskUser> getById(@RequestParam Long id) {
+        return commonPushTaskUserService.getInfoById(id);
+    }
+
+    @ApiOperation("分页列表")
+    @ApiOperationSupport(order = 5)
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "pageNum", value = "页码", dataType = "Integer", paramType = "query", required = true),
+            @ApiImplicitParam(name = "pageSize", value = "每页数量", dataType = "Integer", paramType = "query", required = true),
+            @ApiImplicitParam(name = "pushTaskId", value = "推送任务ID", dataType = "Long", paramType = "query"),
+            @ApiImplicitParam(name = "userId", value = "用户ID", dataType = "Long", paramType = "query"),
+            @ApiImplicitParam(name = "deviceId", value = "设备ID", dataType = "String", paramType = "query")
+    })
+    @GetMapping("/list")
+    public R<IPage<CommonPushTaskUser>> list(
+            @RequestParam Integer pageNum,
+            @RequestParam Integer pageSize,
+            @RequestParam(required = false) Long pushTaskId,
+            @RequestParam(required = false) Long userId,
+            @RequestParam(required = false) String deviceId) {
+        return commonPushTaskUserService.list(pageNum, pageSize, pushTaskId, userId, deviceId);
+    }
+}

+ 19 - 0
alien-store/src/main/java/shop/alien/store/service/CommonPushChannelConfigService.java

@@ -0,0 +1,19 @@
+package shop.alien.store.service;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.service.IService;
+import shop.alien.entity.result.R;
+import shop.alien.entity.store.CommonPushChannelConfig;
+
+public interface CommonPushChannelConfigService extends IService<CommonPushChannelConfig> {
+
+    R<String> add(CommonPushChannelConfig config);
+
+    R<String> deleteById(Long id);
+
+    R<String> update(CommonPushChannelConfig config);
+
+    R<CommonPushChannelConfig> getInfoById(Long id);
+
+    R<IPage<CommonPushChannelConfig>> list(Integer pageNum, Integer pageSize, String channelCode, String platform, Integer enable);
+}

+ 19 - 0
alien-store/src/main/java/shop/alien/store/service/CommonPushReviewService.java

@@ -0,0 +1,19 @@
+package shop.alien.store.service;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.service.IService;
+import shop.alien.entity.result.R;
+import shop.alien.entity.store.CommonPushReview;
+
+public interface CommonPushReviewService extends IService<CommonPushReview> {
+
+    R<String> add(CommonPushReview review);
+
+    R<String> deleteById(Long id);
+
+    R<String> update(CommonPushReview review);
+
+    R<CommonPushReview> getInfoById(Long id);
+
+    R<IPage<CommonPushReview>> list(Integer pageNum, Integer pageSize, Long pushTaskId, Integer reviewStatus);
+}

+ 19 - 0
alien-store/src/main/java/shop/alien/store/service/CommonPushTaskService.java

@@ -0,0 +1,19 @@
+package shop.alien.store.service;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.service.IService;
+import shop.alien.entity.result.R;
+import shop.alien.entity.store.CommonPushTask;
+
+public interface CommonPushTaskService extends IService<CommonPushTask> {
+
+    R<String> add(CommonPushTask task);
+
+    R<String> deleteById(Long id);
+
+    R<String> update(CommonPushTask task);
+
+    R<CommonPushTask> getInfoById(Long id);
+
+    R<IPage<CommonPushTask>> list(Integer pageNum, Integer pageSize, String taskNo, String title, String status, Integer pushType);
+}

+ 19 - 0
alien-store/src/main/java/shop/alien/store/service/CommonPushTaskUserService.java

@@ -0,0 +1,19 @@
+package shop.alien.store.service;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.service.IService;
+import shop.alien.entity.result.R;
+import shop.alien.entity.store.CommonPushTaskUser;
+
+public interface CommonPushTaskUserService extends IService<CommonPushTaskUser> {
+
+    R<String> add(CommonPushTaskUser taskUser);
+
+    R<String> deleteById(Long id);
+
+    R<String> update(CommonPushTaskUser taskUser);
+
+    R<CommonPushTaskUser> getInfoById(Long id);
+
+    R<IPage<CommonPushTaskUser>> list(Integer pageNum, Integer pageSize, Long pushTaskId, Long userId, String deviceId);
+}

+ 69 - 0
alien-store/src/main/java/shop/alien/store/service/impl/CommonPushChannelConfigServiceImpl.java

@@ -0,0 +1,69 @@
+package shop.alien.store.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.stereotype.Service;
+import shop.alien.entity.result.R;
+import shop.alien.entity.store.CommonPushChannelConfig;
+import shop.alien.mapper.CommonPushChannelConfigMapper;
+import shop.alien.store.service.CommonPushChannelConfigService;
+
+@Slf4j
+@Service
+@RequiredArgsConstructor
+public class CommonPushChannelConfigServiceImpl extends ServiceImpl<CommonPushChannelConfigMapper, CommonPushChannelConfig> implements CommonPushChannelConfigService {
+
+    @Override
+    public R<String> add(CommonPushChannelConfig config) {
+        log.info("CommonPushChannelConfigServiceImpl.add, param={}", config);
+        boolean result = this.save(config);
+        return result ? R.success("新增成功") : R.fail("新增失败");
+    }
+
+    @Override
+    public R<String> deleteById(Long id) {
+        log.info("CommonPushChannelConfigServiceImpl.deleteById, id={}", id);
+        boolean result = this.removeById(id);
+        return result ? R.success("删除成功") : R.fail("删除失败");
+    }
+
+    @Override
+    public R<String> update(CommonPushChannelConfig config) {
+        log.info("CommonPushChannelConfigServiceImpl.update, param={}", config);
+        if (config.getId() == null) {
+            return R.fail("id不能为空");
+        }
+        boolean result = this.updateById(config);
+        return result ? R.success("更新成功") : R.fail("更新失败");
+    }
+
+    @Override
+    public R<CommonPushChannelConfig> getInfoById(Long id) {
+        log.info("CommonPushChannelConfigServiceImpl.getInfoById, id={}", id);
+        return R.data(this.getById(id));
+    }
+
+    @Override
+    public R<IPage<CommonPushChannelConfig>> list(Integer pageNum, Integer pageSize, String channelCode, String platform, Integer enable) {
+        log.info("CommonPushChannelConfigServiceImpl.list, pageNum={}, pageSize={}, channelCode={}, platform={}, enable={}",
+                pageNum, pageSize, channelCode, platform, enable);
+        Page<CommonPushChannelConfig> page = new Page<>(pageNum, pageSize);
+        LambdaQueryWrapper<CommonPushChannelConfig> wrapper = new LambdaQueryWrapper<>();
+        if (StringUtils.isNotBlank(channelCode)) {
+            wrapper.eq(CommonPushChannelConfig::getChannelCode, channelCode);
+        }
+        if (StringUtils.isNotBlank(platform)) {
+            wrapper.eq(CommonPushChannelConfig::getPlatform, platform);
+        }
+        if (enable != null) {
+            wrapper.eq(CommonPushChannelConfig::getEnable, enable);
+        }
+        wrapper.orderByDesc(CommonPushChannelConfig::getUpdatedTime);
+        return R.data(this.page(page, wrapper));
+    }
+}

+ 65 - 0
alien-store/src/main/java/shop/alien/store/service/impl/CommonPushReviewServiceImpl.java

@@ -0,0 +1,65 @@
+package shop.alien.store.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+import shop.alien.entity.result.R;
+import shop.alien.entity.store.CommonPushReview;
+import shop.alien.mapper.CommonPushReviewMapper;
+import shop.alien.store.service.CommonPushReviewService;
+
+@Slf4j
+@Service
+@RequiredArgsConstructor
+public class CommonPushReviewServiceImpl extends ServiceImpl<CommonPushReviewMapper, CommonPushReview> implements CommonPushReviewService {
+
+    @Override
+    public R<String> add(CommonPushReview review) {
+        log.info("CommonPushReviewServiceImpl.add, param={}", review);
+        boolean result = this.save(review);
+        return result ? R.success("新增成功") : R.fail("新增失败");
+    }
+
+    @Override
+    public R<String> deleteById(Long id) {
+        log.info("CommonPushReviewServiceImpl.deleteById, id={}", id);
+        boolean result = this.removeById(id);
+        return result ? R.success("删除成功") : R.fail("删除失败");
+    }
+
+    @Override
+    public R<String> update(CommonPushReview review) {
+        log.info("CommonPushReviewServiceImpl.update, param={}", review);
+        if (review.getId() == null) {
+            return R.fail("id不能为空");
+        }
+        boolean result = this.updateById(review);
+        return result ? R.success("更新成功") : R.fail("更新失败");
+    }
+
+    @Override
+    public R<CommonPushReview> getInfoById(Long id) {
+        log.info("CommonPushReviewServiceImpl.getInfoById, id={}", id);
+        return R.data(this.getById(id));
+    }
+
+    @Override
+    public R<IPage<CommonPushReview>> list(Integer pageNum, Integer pageSize, Long pushTaskId, Integer reviewStatus) {
+        log.info("CommonPushReviewServiceImpl.list, pageNum={}, pageSize={}, pushTaskId={}, reviewStatus={}",
+                pageNum, pageSize, pushTaskId, reviewStatus);
+        Page<CommonPushReview> page = new Page<>(pageNum, pageSize);
+        LambdaQueryWrapper<CommonPushReview> wrapper = new LambdaQueryWrapper<>();
+        if (pushTaskId != null) {
+            wrapper.eq(CommonPushReview::getPushTaskId, pushTaskId);
+        }
+        if (reviewStatus != null) {
+            wrapper.eq(CommonPushReview::getReviewStatus, reviewStatus);
+        }
+        wrapper.orderByDesc(CommonPushReview::getUpdatedTime);
+        return R.data(this.page(page, wrapper));
+    }
+}

+ 72 - 0
alien-store/src/main/java/shop/alien/store/service/impl/CommonPushTaskServiceImpl.java

@@ -0,0 +1,72 @@
+package shop.alien.store.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.stereotype.Service;
+import shop.alien.entity.result.R;
+import shop.alien.entity.store.CommonPushTask;
+import shop.alien.mapper.CommonPushTaskMapper;
+import shop.alien.store.service.CommonPushTaskService;
+
+@Slf4j
+@Service
+@RequiredArgsConstructor
+public class CommonPushTaskServiceImpl extends ServiceImpl<CommonPushTaskMapper, CommonPushTask> implements CommonPushTaskService {
+
+    @Override
+    public R<String> add(CommonPushTask task) {
+        log.info("CommonPushTaskServiceImpl.add, param={}", task);
+        boolean result = this.save(task);
+        return result ? R.success("新增成功") : R.fail("新增失败");
+    }
+
+    @Override
+    public R<String> deleteById(Long id) {
+        log.info("CommonPushTaskServiceImpl.deleteById, id={}", id);
+        boolean result = this.removeById(id);
+        return result ? R.success("删除成功") : R.fail("删除失败");
+    }
+
+    @Override
+    public R<String> update(CommonPushTask task) {
+        log.info("CommonPushTaskServiceImpl.update, param={}", task);
+        if (task.getId() == null) {
+            return R.fail("id不能为空");
+        }
+        boolean result = this.updateById(task);
+        return result ? R.success("更新成功") : R.fail("更新失败");
+    }
+
+    @Override
+    public R<CommonPushTask> getInfoById(Long id) {
+        log.info("CommonPushTaskServiceImpl.getInfoById, id={}", id);
+        return R.data(this.getById(id));
+    }
+
+    @Override
+    public R<IPage<CommonPushTask>> list(Integer pageNum, Integer pageSize, String taskNo, String title, String status, Integer pushType) {
+        log.info("CommonPushTaskServiceImpl.list, pageNum={}, pageSize={}, taskNo={}, title={}, status={}, pushType={}",
+                pageNum, pageSize, taskNo, title, status, pushType);
+        Page<CommonPushTask> page = new Page<>(pageNum, pageSize);
+        LambdaQueryWrapper<CommonPushTask> wrapper = new LambdaQueryWrapper<>();
+        if (StringUtils.isNotBlank(taskNo)) {
+            wrapper.eq(CommonPushTask::getTaskNo, taskNo);
+        }
+        if (StringUtils.isNotBlank(title)) {
+            wrapper.like(CommonPushTask::getTitle, title);
+        }
+        if (StringUtils.isNotBlank(status)) {
+            wrapper.eq(CommonPushTask::getStatus, status);
+        }
+        if (pushType != null) {
+            wrapper.eq(CommonPushTask::getPushType, pushType);
+        }
+        wrapper.orderByDesc(CommonPushTask::getUpdatedTime);
+        return R.data(this.page(page, wrapper));
+    }
+}

+ 69 - 0
alien-store/src/main/java/shop/alien/store/service/impl/CommonPushTaskUserServiceImpl.java

@@ -0,0 +1,69 @@
+package shop.alien.store.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.stereotype.Service;
+import shop.alien.entity.result.R;
+import shop.alien.entity.store.CommonPushTaskUser;
+import shop.alien.mapper.CommonPushTaskUserMapper;
+import shop.alien.store.service.CommonPushTaskUserService;
+
+@Slf4j
+@Service
+@RequiredArgsConstructor
+public class CommonPushTaskUserServiceImpl extends ServiceImpl<CommonPushTaskUserMapper, CommonPushTaskUser> implements CommonPushTaskUserService {
+
+    @Override
+    public R<String> add(CommonPushTaskUser taskUser) {
+        log.info("CommonPushTaskUserServiceImpl.add, param={}", taskUser);
+        boolean result = this.save(taskUser);
+        return result ? R.success("新增成功") : R.fail("新增失败");
+    }
+
+    @Override
+    public R<String> deleteById(Long id) {
+        log.info("CommonPushTaskUserServiceImpl.deleteById, id={}", id);
+        boolean result = this.removeById(id);
+        return result ? R.success("删除成功") : R.fail("删除失败");
+    }
+
+    @Override
+    public R<String> update(CommonPushTaskUser taskUser) {
+        log.info("CommonPushTaskUserServiceImpl.update, param={}", taskUser);
+        if (taskUser.getId() == null) {
+            return R.fail("id不能为空");
+        }
+        boolean result = this.updateById(taskUser);
+        return result ? R.success("更新成功") : R.fail("更新失败");
+    }
+
+    @Override
+    public R<CommonPushTaskUser> getInfoById(Long id) {
+        log.info("CommonPushTaskUserServiceImpl.getInfoById, id={}", id);
+        return R.data(this.getById(id));
+    }
+
+    @Override
+    public R<IPage<CommonPushTaskUser>> list(Integer pageNum, Integer pageSize, Long pushTaskId, Long userId, String deviceId) {
+        log.info("CommonPushTaskUserServiceImpl.list, pageNum={}, pageSize={}, pushTaskId={}, userId={}, deviceId={}",
+                pageNum, pageSize, pushTaskId, userId, deviceId);
+        Page<CommonPushTaskUser> page = new Page<>(pageNum, pageSize);
+        LambdaQueryWrapper<CommonPushTaskUser> wrapper = new LambdaQueryWrapper<>();
+        if (pushTaskId != null) {
+            wrapper.eq(CommonPushTaskUser::getPushTaskId, pushTaskId);
+        }
+        if (userId != null) {
+            wrapper.eq(CommonPushTaskUser::getUserId, userId);
+        }
+        if (StringUtils.isNotBlank(deviceId)) {
+            wrapper.eq(CommonPushTaskUser::getDeviceId, deviceId);
+        }
+        wrapper.orderByDesc(CommonPushTaskUser::getUpdatedTime);
+        return R.data(this.page(page, wrapper));
+    }
+}