浏览代码

Merge remote-tracking branch 'origin/point_dev' into point_dev

jinshihui 5 天之前
父节点
当前提交
b979d01ce3
共有 56 个文件被更改,包括 3689 次插入0 次删除
  1. 103 0
      nightFragrance-admin/src/main/java/com/ylx/web/controller/point/PointActivityController.java
  2. 101 0
      nightFragrance-massage/src/main/java/com/ylx/point/domain/PointActivity.java
  3. 86 0
      nightFragrance-massage/src/main/java/com/ylx/point/domain/PointActivityTask.java
  4. 56 0
      nightFragrance-massage/src/main/java/com/ylx/point/domain/PointSignReward.java
  5. 50 0
      nightFragrance-massage/src/main/java/com/ylx/point/domain/PointSignTask.java
  6. 72 0
      nightFragrance-massage/src/main/java/com/ylx/point/domain/PointUserActivityTaskCompletion.java
  7. 108 0
      nightFragrance-massage/src/main/java/com/ylx/point/domain/PointUserLog.java
  8. 71 0
      nightFragrance-massage/src/main/java/com/ylx/point/domain/PointUserSignLog.java
  9. 64 0
      nightFragrance-massage/src/main/java/com/ylx/point/domain/PointUserSignStatus.java
  10. 69 0
      nightFragrance-massage/src/main/java/com/ylx/point/domain/dto/PointActivityDTO.java
  11. 26 0
      nightFragrance-massage/src/main/java/com/ylx/point/domain/dto/PointActivityPageDTO.java
  12. 35 0
      nightFragrance-massage/src/main/java/com/ylx/point/domain/dto/PointActivityTaskDTO.java
  13. 27 0
      nightFragrance-massage/src/main/java/com/ylx/point/domain/dto/PointActivityValidityDTO.java
  14. 17 0
      nightFragrance-massage/src/main/java/com/ylx/point/domain/dto/PointSignRewardDTO.java
  15. 22 0
      nightFragrance-massage/src/main/java/com/ylx/point/domain/dto/PointSignTaskDTO.java
  16. 53 0
      nightFragrance-massage/src/main/java/com/ylx/point/domain/vo/PointActivityBaseVo.java
  17. 20 0
      nightFragrance-massage/src/main/java/com/ylx/point/domain/vo/PointActivityDetailsVo.java
  18. 23 0
      nightFragrance-massage/src/main/java/com/ylx/point/domain/vo/PointActivityOverviewVO.java
  19. 50 0
      nightFragrance-massage/src/main/java/com/ylx/point/domain/vo/PointActivityPageVo.java
  20. 51 0
      nightFragrance-massage/src/main/java/com/ylx/point/domain/vo/PointActivityStatVo.java
  21. 23 0
      nightFragrance-massage/src/main/java/com/ylx/point/domain/vo/PointActivityTaskDetailVO.java
  22. 19 0
      nightFragrance-massage/src/main/java/com/ylx/point/domain/vo/PointActivityTaskVo.java
  23. 25 0
      nightFragrance-massage/src/main/java/com/ylx/point/domain/vo/PointSignTaskVo.java
  24. 19 0
      nightFragrance-massage/src/main/java/com/ylx/point/enums/PointActivityTypeEnum.java
  25. 62 0
      nightFragrance-massage/src/main/java/com/ylx/point/mapper/PointActivityMapper.java
  26. 35 0
      nightFragrance-massage/src/main/java/com/ylx/point/mapper/PointActivityTaskMapper.java
  27. 70 0
      nightFragrance-massage/src/main/java/com/ylx/point/mapper/PointSignRewardMapper.java
  28. 26 0
      nightFragrance-massage/src/main/java/com/ylx/point/mapper/PointSignTaskMapper.java
  29. 62 0
      nightFragrance-massage/src/main/java/com/ylx/point/mapper/PointUserActivityTaskCompletionMapper.java
  30. 62 0
      nightFragrance-massage/src/main/java/com/ylx/point/mapper/PointUserLogMapper.java
  31. 62 0
      nightFragrance-massage/src/main/java/com/ylx/point/mapper/PointUserSignLogMapper.java
  32. 62 0
      nightFragrance-massage/src/main/java/com/ylx/point/mapper/PointUserSignStatusMapper.java
  33. 32 0
      nightFragrance-massage/src/main/java/com/ylx/point/service/IPointActivityService.java
  34. 29 0
      nightFragrance-massage/src/main/java/com/ylx/point/service/IPointActivityTaskService.java
  35. 64 0
      nightFragrance-massage/src/main/java/com/ylx/point/service/IPointSignRewardService.java
  36. 31 0
      nightFragrance-massage/src/main/java/com/ylx/point/service/IPointSignTaskService.java
  37. 62 0
      nightFragrance-massage/src/main/java/com/ylx/point/service/IPointUserActivityTaskCompletionService.java
  38. 62 0
      nightFragrance-massage/src/main/java/com/ylx/point/service/IPointUserLogService.java
  39. 62 0
      nightFragrance-massage/src/main/java/com/ylx/point/service/IPointUserSignLogService.java
  40. 62 0
      nightFragrance-massage/src/main/java/com/ylx/point/service/IPointUserSignStatusService.java
  41. 231 0
      nightFragrance-massage/src/main/java/com/ylx/point/service/impl/PointActivityServiceImpl.java
  42. 76 0
      nightFragrance-massage/src/main/java/com/ylx/point/service/impl/PointActivityTaskServiceImpl.java
  43. 118 0
      nightFragrance-massage/src/main/java/com/ylx/point/service/impl/PointSignRewardServiceImpl.java
  44. 56 0
      nightFragrance-massage/src/main/java/com/ylx/point/service/impl/PointSignTaskServiceImpl.java
  45. 96 0
      nightFragrance-massage/src/main/java/com/ylx/point/service/impl/PointUserActivityTaskCompletionServiceImpl.java
  46. 95 0
      nightFragrance-massage/src/main/java/com/ylx/point/service/impl/PointUserLogServiceImpl.java
  47. 95 0
      nightFragrance-massage/src/main/java/com/ylx/point/service/impl/PointUserSignLogServiceImpl.java
  48. 95 0
      nightFragrance-massage/src/main/java/com/ylx/point/service/impl/PointUserSignStatusServiceImpl.java
  49. 127 0
      nightFragrance-massage/src/main/resources/mapper/point/PointActivityMapper.xml
  50. 116 0
      nightFragrance-massage/src/main/resources/mapper/point/PointActivityTaskMapper.xml
  51. 92 0
      nightFragrance-massage/src/main/resources/mapper/point/PointSignRewardMapper.xml
  52. 68 0
      nightFragrance-massage/src/main/resources/mapper/point/PointSignTaskMapper.xml
  53. 94 0
      nightFragrance-massage/src/main/resources/mapper/point/PointUserActivityTaskCompletionMapper.xml
  54. 120 0
      nightFragrance-massage/src/main/resources/mapper/point/PointUserLogMapper.xml
  55. 90 0
      nightFragrance-massage/src/main/resources/mapper/point/PointUserSignLogMapper.xml
  56. 85 0
      nightFragrance-massage/src/main/resources/mapper/point/PointUserSignStatusMapper.xml

+ 103 - 0
nightFragrance-admin/src/main/java/com/ylx/web/controller/point/PointActivityController.java

@@ -0,0 +1,103 @@
+package com.ylx.web.controller.point;
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ylx.common.annotation.Log;
+import com.ylx.common.core.controller.BaseController;
+import com.ylx.common.core.domain.R;
+import com.ylx.common.enums.BusinessType;
+import com.ylx.point.domain.PointActivity;
+import com.ylx.point.domain.dto.PointActivityDTO;
+import com.ylx.point.domain.dto.PointActivityPageDTO;
+import com.ylx.point.domain.dto.PointActivityValidityDTO;
+import com.ylx.point.domain.vo.PointActivityDetailsVo;
+import com.ylx.point.domain.vo.PointActivityPageVo;
+import com.ylx.point.domain.vo.PointActivityStatVo;
+import com.ylx.point.service.IPointActivityService;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.web.bind.annotation.*;
+
+/**
+ * 积分活动主Controller
+ *
+ * @author wzj
+ * @date 2026-03-26
+ */
+@RestController
+@RequestMapping("/point/activity")
+public class PointActivityController extends BaseController {
+
+    @Autowired
+    private IPointActivityService pointActivityService;
+
+    /**
+     * 查询积分活动主列表
+     */
+    @PreAuthorize("@ss.hasPermi('point:activity:list')")
+    @ApiOperation("根据条件分页查询积分活动")
+    @GetMapping("/page")
+    public R<Page<PointActivityPageVo>> page(Page<PointActivity> page, PointActivityPageDTO dto) {
+        Page<PointActivityPageVo> pageResult = this.pointActivityService.page(page, dto);
+        return R.ok(pageResult);
+    }
+
+    /**
+     * 获取积分活动主详细信息
+     */
+    @PreAuthorize("@ss.hasPermi('point:activity:query')")
+    @ApiOperation("根据id获取积分活动详情")
+    @GetMapping(value = "/{id}")
+    public R<PointActivityDetailsVo<?>> getDetailsInfo(@PathVariable("id") Long id) {
+        PointActivityDetailsVo<?> vo = this.pointActivityService.getDetailsInfo(id);
+        return R.ok(vo);
+    }
+
+    /**
+     * 新增积分活动主
+     */
+    @PreAuthorize("@ss.hasPermi('point:activity:add')")
+    @ApiOperation("新增积分活动")
+    @Log(title = "积分活动添加", businessType = BusinessType.INSERT)
+    @PostMapping
+    public R add(@RequestBody PointActivityDTO dto) {
+        this.pointActivityService.add(dto);
+        return R.ok();
+    }
+
+    /**
+     * 修改积分活动主
+     */
+    @PreAuthorize("@ss.hasPermi('point:activity:edit')")
+    @ApiOperation("编辑积分活动")
+    @Log(title = "积分活动编辑", businessType = BusinessType.UPDATE)
+    @PutMapping
+    public R edit(@RequestBody PointActivityDTO dto) {
+        this.pointActivityService.edit(dto);
+        return R.ok();
+    }
+
+    /**
+     * 获取积分活动主详细信息
+     */
+    @PreAuthorize("@ss.hasPermi('point:activity:query')")
+    @ApiOperation("根据id获取积分活动统计数据")
+    @GetMapping(value = "/stat/{id}")
+    public R<PointActivityStatVo> getStatInfo(@PathVariable("id") String id) {
+        PointActivityStatVo vo = this.pointActivityService.getStatInfo(id);
+        return R.ok(vo);
+    }
+
+    /**
+     * 修改积分活动主
+     */
+    @PreAuthorize("@ss.hasPermi('point:activity:edit')")
+    @ApiOperation("编辑积分活动时效")
+    @Log(title = "积分活动时效编辑", businessType = BusinessType.UPDATE)
+    @PutMapping(value = "/validity")
+    public R editValidity(@RequestBody PointActivityValidityDTO dto) {
+        this.pointActivityService.editValidity(dto);
+        return R.ok();
+    }
+
+}

+ 101 - 0
nightFragrance-massage/src/main/java/com/ylx/point/domain/PointActivity.java

@@ -0,0 +1,101 @@
+package com.ylx.point.domain;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.ylx.common.annotation.Excel;
+import com.ylx.common.core.domain.BaseEntity;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.util.Date;
+
+/**
+ * 积分活动主对象 point_activity
+ *
+ * @author wzj
+ * @date 2026-03-25
+ */
+@EqualsAndHashCode(callSuper = true)
+@Data
+public class PointActivity extends BaseEntity {
+    private static final long serialVersionUID = -6781693663144671191L;
+
+    /**
+     * 活动ID
+     */
+    private Long id;
+
+    /**
+     * 活动名称
+     */
+    @Excel(name = "活动名称")
+    private String name;
+
+    /**
+     * 活动简述
+     */
+    @Excel(name = "活动简述")
+    private String description;
+
+    /**
+     * 活动类型:0(签到活动), 1(新手活动), 2(每日活动), 3(每月活动)
+     */
+    @Excel(name = "活动类型:0(签到活动), 1(新手活动), 2(每日活动), 3(每月活动)")
+    private Integer activityType;
+
+    /**
+     * 覆盖城市代码 (0表示全国)
+     */
+    @Excel(name = "覆盖城市代码 (0表示全国)")
+    private String cityCode;
+
+    /**
+     * 活动开始时间
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    @Excel(name = "活动开始时间", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss")
+    private Date startTime;
+
+    /**
+     * 活动结束时间 (NULL表示长期有效)
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    @Excel(name = "活动结束时间", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss")
+    private Date endTime;
+
+    /**
+     * 是否长期有效 (1:是, 0:否)
+     */
+    @Excel(name = "是否长期有效 (1:是, 0:否)")
+    private Integer isPermanent;
+
+    /**
+     * 过期策略: 1=永久有效, 2=逐笔过期(N天), 3=逐年过期(N年)
+     */
+    @Excel(name = "过期策略: 1=永久有效, 2=逐笔过期(N天), 3=逐年过期(N年)")
+    private Integer expirePolicy;
+
+    /**
+     * 有效期天数 (仅当 expire_policy=2 时有效)
+     */
+    @Excel(name = "有效期天数 (仅当 expire_policy=2 时有效)")
+    private Long expireDays;
+
+    /**
+     * 逐年过期年份 (expire_policy=3时有效,如 "2027" 表示2027年1月1日过期)
+     */
+    @Excel(name = "逐年过期年份 (expire_policy=3时有效)")
+    private String expireYear;
+
+    /**
+     * 状态: 0=未开始, 1=进行中, 2=已结束, 3=草稿
+     */
+    @Excel(name = "状态: 0=未开始, 1=进行中, 2=已结束, 3=草稿")
+    private Long status;
+
+    /**
+     * 前端展示排序
+     */
+    @Excel(name = "前端展示排序")
+    private Long sortOrder;
+
+}

+ 86 - 0
nightFragrance-massage/src/main/java/com/ylx/point/domain/PointActivityTask.java

@@ -0,0 +1,86 @@
+package com.ylx.point.domain;
+
+import com.ylx.common.core.domain.BaseEntity;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.apache.commons.lang3.builder.ToStringBuilder;
+import org.apache.commons.lang3.builder.ToStringStyle;
+import com.ylx.common.annotation.Excel;
+
+/**
+ * 积分活动任务规则对象 point_activity_task
+ *
+ * @author wzj
+ * @date 2026-03-25
+ */
+@EqualsAndHashCode(callSuper = true)
+@Data
+public class PointActivityTask extends BaseEntity {
+    private static final long serialVersionUID = 2449395873912872626L;
+
+    /**
+     * 任务ID
+     */
+    private Long id;
+
+    /**
+     * 关联活动ID
+     */
+    @Excel(name = "关联活动ID")
+    private Long activityId;
+
+    /**
+     * 任务名称dict_label
+     */
+    @Excel(name = "任务名称dict_label")
+    private String taskName;
+
+    /**
+     * 任务代码dict_value
+     */
+    @Excel(name = "任务代码dict_value")
+    private String taskValue;
+
+    /**
+     * 触发条件描述dict_label
+     */
+    @Excel(name = "触发条件描述dict_label")
+    private String triggerName;
+
+    /**
+     * 触发阈值数值dict_value
+     */
+    @Excel(name = "触发阈值数值dict_value")
+    private String triggerValue;
+
+    /**
+     * 奖励积分数
+     */
+    @Excel(name = "奖励积分数")
+    private Long rewardPoints;
+
+    /**
+     * 限制类型描述dict_label
+     */
+    @Excel(name = "限制类型描述dict_label")
+    private String frequencyLimitName;
+
+    /**
+     * 限制类型值dict_value
+     */
+    @Excel(name = "限制类型值dict_value")
+    private String frequencyLimitValue;
+
+    /**
+     * 前端展示排序
+     */
+    @Excel(name = "前端展示排序")
+    private Long sortOrder;
+
+    /**
+     * 逻辑删除
+     */
+    @Excel(name = "逻辑删除")
+    private Integer isDeleted;
+
+}

+ 56 - 0
nightFragrance-massage/src/main/java/com/ylx/point/domain/PointSignReward.java

@@ -0,0 +1,56 @@
+package com.ylx.point.domain;
+
+import com.ylx.common.core.domain.BaseEntity;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.apache.commons.lang3.builder.ToStringBuilder;
+import org.apache.commons.lang3.builder.ToStringStyle;
+import com.ylx.common.annotation.Excel;
+
+/**
+ * 签到动态奖励配置对象 point_sign_reward
+ *
+ * @author wzj
+ * @date 2026-03-25
+ */
+@EqualsAndHashCode(callSuper = true)
+@Data
+public class PointSignReward extends BaseEntity {
+    private static final long serialVersionUID = 2857919632084775759L;
+
+    /**
+     * 奖励配置ID
+     */
+    private Long id;
+
+    /**
+     * 关联签到任务ID(point_sign_task.id)
+     */
+    @Excel(name = "关联签到任务ID(point_sign_task.id)")
+    private Long signTaskId;
+
+    /**
+     * 连续签到天数(3/5/7/10等)
+     */
+    @Excel(name = "连续签到天数(3/5/7/10等)")
+    private Long continueDays;
+
+    /**
+     * 对应奖励积分
+     */
+    @Excel(name = "对应奖励积分")
+    private Long rewardPoints;
+
+    /**
+     * 前端展示排序
+     */
+    @Excel(name = "前端展示排序")
+    private Long sortOrder;
+
+    /**
+     * 逻辑删除
+     */
+    @Excel(name = "逻辑删除")
+    private Integer isDeleted;
+
+}

+ 50 - 0
nightFragrance-massage/src/main/java/com/ylx/point/domain/PointSignTask.java

@@ -0,0 +1,50 @@
+package com.ylx.point.domain;
+
+import com.ylx.common.core.domain.BaseEntity;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.apache.commons.lang3.builder.ToStringBuilder;
+import org.apache.commons.lang3.builder.ToStringStyle;
+import com.ylx.common.annotation.Excel;
+
+/**
+ * 积分签到任务规则对象 point_sign_task
+ *
+ * @author wzj
+ * @date 2026-03-25
+ */
+@EqualsAndHashCode(callSuper = true)
+@Data
+public class PointSignTask extends BaseEntity {
+    private static final long serialVersionUID = 2848356392694836469L;
+
+    /**
+     * 主键ID
+     */
+    private Long id;
+
+    /**
+     * 关联积分活动ID(point_activity.id)
+     */
+    @Excel(name = "关联积分活动ID(point_activity.id)")
+    private Long activityId;
+
+    /**
+     * 每日签到基础积分
+     */
+    @Excel(name = "每日签到基础积分")
+    private Long basePoints;
+
+    /**
+     * 断签规则:0=重置,1=保留进度
+     */
+    @Excel(name = "断签规则:0=重置,1=保留进度")
+    private Integer breakRule;
+
+    /**
+     * 逻辑删除
+     */
+    @Excel(name = "逻辑删除")
+    private Integer isDeleted;
+
+}

+ 72 - 0
nightFragrance-massage/src/main/java/com/ylx/point/domain/PointUserActivityTaskCompletion.java

@@ -0,0 +1,72 @@
+package com.ylx.point.domain;
+
+import java.util.Date;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.ylx.common.core.domain.BaseEntity;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.apache.commons.lang3.builder.ToStringBuilder;
+import org.apache.commons.lang3.builder.ToStringStyle;
+import com.ylx.common.annotation.Excel;
+
+/**
+ * 用户活动任务完成对象 point_user_activity_task_completion
+ *
+ * @author wzj
+ * @date 2026-03-25
+ */
+@EqualsAndHashCode(callSuper = true)
+@Data
+public class PointUserActivityTaskCompletion extends BaseEntity {
+    private static final long serialVersionUID = 3546693435566695697L;
+
+    /**
+     * $column.columnComment
+     */
+    private Long id;
+
+    /**
+     * 活动ID
+     */
+    @Excel(name = "活动ID")
+    private Long activityId;
+
+    /**
+     * 任务ID
+     */
+    @Excel(name = "任务ID")
+    private Long taskId;
+
+    /**
+     * 1-活动 2-签到
+     */
+    @Excel(name = "1-活动 2-签到")
+    private Integer taskType;
+
+    /**
+     * 用户ID
+     */
+    @Excel(name = "用户ID")
+    private Long userId;
+
+    /**
+     * 该任务已完成次数
+     */
+    @Excel(name = "该任务已完成次数")
+    private Long completedCount;
+
+    /**
+     * 最后完成时间
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    @Excel(name = "最后完成时间", width = 30, dateFormat = "yyyy-MM-dd")
+    private Date lastCompletedTime;
+
+    /**
+     * 最后完成日期(生成列)
+     */
+    @Excel(name = "最后完成日期", readConverterExp = "生=成列")
+    private Date completedDate;
+
+}

+ 108 - 0
nightFragrance-massage/src/main/java/com/ylx/point/domain/PointUserLog.java

@@ -0,0 +1,108 @@
+package com.ylx.point.domain;
+
+import java.util.Date;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.ylx.common.core.domain.BaseEntity;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.apache.commons.lang3.builder.ToStringBuilder;
+import org.apache.commons.lang3.builder.ToStringStyle;
+import com.ylx.common.annotation.Excel;
+
+/**
+ * 用户积分流水对象 point_user_log
+ *
+ * @author wzj
+ * @date 2026-03-25
+ */
+@EqualsAndHashCode(callSuper = true)
+@Data
+public class PointUserLog extends BaseEntity {
+    private static final long serialVersionUID = -383943846291022514L;
+
+    /**
+     * $column.columnComment
+     */
+    private Long id;
+
+    /**
+     * 用户ID
+     */
+    @Excel(name = "用户ID")
+    private Long userId;
+
+    /**
+     * 活动ID
+     */
+    @Excel(name = "活动ID")
+    private Long activityId;
+
+    /**
+     * 活动名称
+     */
+    @Excel(name = "活动名称")
+    private String activityName;
+
+    /**
+     * 任务ID
+     */
+    @Excel(name = "任务ID")
+    private Long taskId;
+
+    /**
+     * 1-普通活动 2-签到活动
+     */
+    @Excel(name = "1-普通活动 2-签到活动")
+    private Integer taskType;
+
+    /**
+     * 变动值 (+获得, -消费, -过期)
+     */
+    @Excel(name = "变动值 (+获得, -消费, -过期)")
+    private Long points;
+
+    /**
+     * 变动后总余额 (快照)
+     */
+    @Excel(name = "变动后总余额 (快照)")
+    private Long balanceAfter;
+
+    /**
+     * 关联ID: 消耗/过期记录指向被扣减的"获得记录ID"
+     */
+    @Excel(name = "关联ID: 消耗/过期记录指向被扣减的获得记录ID")
+    private Long sourceLogId;
+
+    /**
+     * 业务订单号/流水号
+     */
+    @Excel(name = "业务订单号/流水号")
+    private String bizOrderId;
+
+    /**
+     * 该笔积分的过期时间 (仅获得记录有值)
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    @Excel(name = "该笔积分的过期时间 (仅获得记录有值)", width = 30, dateFormat = "yyyy-MM-dd")
+    private Date expireTime;
+
+    /**
+     * 该笔获得记录是否已完全核销/过期
+     */
+    @Excel(name = "该笔获得记录是否已完全核销/过期")
+    private Integer isExpired;
+
+    /**
+     * 1-收入 2-支出 3-过期
+     */
+    @Excel(name = "1-收入 2-支出 3-过期")
+    private Integer opType;
+
+    /**
+     * 年月(YYYYMM)
+     */
+    @Excel(name = "年月(YYYYMM)")
+    private String month;
+
+}

+ 71 - 0
nightFragrance-massage/src/main/java/com/ylx/point/domain/PointUserSignLog.java

@@ -0,0 +1,71 @@
+package com.ylx.point.domain;
+
+import java.util.Date;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.ylx.common.core.domain.BaseEntity;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.apache.commons.lang3.builder.ToStringBuilder;
+import org.apache.commons.lang3.builder.ToStringStyle;
+import com.ylx.common.annotation.Excel;
+
+/**
+ * 用户签到记录对象 point_user_sign_log
+ *
+ * @author wzj
+ * @date 2026-03-25
+ */
+@EqualsAndHashCode(callSuper = true)
+@Data
+public class PointUserSignLog extends BaseEntity {
+    private static final long serialVersionUID = -3042740595606704854L;
+
+    /**
+     * 主键
+     */
+    private Long id;
+
+    /**
+     * 用户ID
+     */
+    @Excel(name = "用户ID")
+    private Long userId;
+
+    /**
+     * 签到活动ID(对应point_activity.id)
+     */
+    @Excel(name = "签到活动ID", readConverterExp = "对=应point_activity.id")
+    private Long activityId;
+
+    /**
+     * 任务ID(对应point_sign_task.id)
+     */
+    @Excel(name = "任务ID", readConverterExp = "对=应point_sign_task.id")
+    private Long taskId;
+
+    /**
+     * 签到日期(yyyy-MM-dd)
+     */
+    @Excel(name = "签到日期", readConverterExp = "y=yyy-MM-dd")
+    private Date signDate;
+
+    /**
+     * 本次签到后连续天数
+     */
+    @Excel(name = "本次签到后连续天数")
+    private Long continuousDays;
+
+    /**
+     * 本次获得积分
+     */
+    @Excel(name = "本次获得积分")
+    private Long points;
+
+    /**
+     * 是否补签:0=否,1=是
+     */
+    @Excel(name = "是否补签:0=否,1=是")
+    private Integer isMakeUp;
+
+}

+ 64 - 0
nightFragrance-massage/src/main/java/com/ylx/point/domain/PointUserSignStatus.java

@@ -0,0 +1,64 @@
+package com.ylx.point.domain;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.ylx.common.annotation.Excel;
+import com.ylx.common.core.domain.BaseEntity;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.util.Date;
+
+/**
+ * 用户签到状态快照对象 point_user_sign_status
+ *
+ * @author wzj
+ * @date 2026-03-25
+ */
+@EqualsAndHashCode(callSuper = true)
+@Data
+public class PointUserSignStatus extends BaseEntity {
+    private static final long serialVersionUID = 7915471354684478199L;
+
+    /**
+     * $column.columnComment
+     */
+    private Long id;
+
+    /**
+     * $column.columnComment
+     */
+    @Excel(name = "${comment}", readConverterExp = "$column.readConverterExp()")
+    private Long userId;
+
+    /**
+     * $column.columnComment
+     */
+    @Excel(name = "${comment}", readConverterExp = "$column.readConverterExp()")
+    private Long activityId;
+
+    /**
+     * 最后成功签到日期
+     */
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    @Excel(name = "最后成功签到日期", width = 30, dateFormat = "yyyy-MM-dd")
+    private Date lastSignDate;
+
+    /**
+     * 当前连续天数
+     */
+    @Excel(name = "当前连续天数")
+    private Long currentContinuousDays;
+
+    /**
+     * 历史最高连续天数 (可选,用于成就系统)
+     */
+    @Excel(name = "历史最高连续天数 (可选,用于成就系统)")
+    private Long maxHistoricalDays;
+
+    /**
+     * 本周期已领取奖励的最高天数阈值 (防止重复发阶梯奖)
+     */
+    @Excel(name = "本周期已领取奖励的最高天数阈值 (防止重复发阶梯奖)")
+    private Long lastRewardCycleDays;
+
+}

+ 69 - 0
nightFragrance-massage/src/main/java/com/ylx/point/domain/dto/PointActivityDTO.java

@@ -0,0 +1,69 @@
+package com.ylx.point.domain.dto;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.NotNull;
+import javax.validation.constraints.Size;
+import java.util.Date;
+import java.util.List;
+
+@Data
+@ApiModel("积分活动创建DTO")
+public class PointActivityDTO {
+
+    @ApiModelProperty("活动主键id")
+    private Long id;
+
+    @ApiModelProperty("活动名称")
+    @NotBlank(message = "活动名称不能为空")
+    @Size(min = 2, max = 18, message = "活动名称长度必须在2-18个字符之间")
+    private String name;
+
+    @ApiModelProperty("活动简述")
+    @NotBlank(message = "活动简述不能为空")
+    @Size(min = 2, max = 30, message = "活动简述长度必须在2-30个字符之间")
+    private String description;
+
+    @ApiModelProperty("活动城市")
+    @NotBlank(message = "活动城市不能为空")
+    private String cityCode;
+
+    @ApiModelProperty("活动类型")
+    @NotNull(message = "活动类型不能为空")
+    private Integer activityType;
+
+    @ApiModelProperty("活动时间配置")
+    @NotNull(message = "活动时间配置不能为空")
+    private ActivityTimeConfig timeConfig;
+
+    @ApiModelProperty("活动时间配置")
+    private List<PointActivityTaskDTO> tasks;
+
+    @ApiModelProperty("签到活动奖励配置")
+    private PointSignTaskDTO signTaskDTO;
+
+    @ApiModelProperty("状态:草稿=3, 发布=4")
+    private Integer status;
+
+    @Data
+    public static class ActivityTimeConfig {
+
+        @ApiModelProperty("是否长期有效")
+        @JsonProperty(value = "isPermanent")
+        private boolean isPermanent;
+
+        @JsonFormat(pattern = "yyyy-MM-dd")
+        @ApiModelProperty("开始时间")
+        private Date startTime;
+
+        @JsonFormat(pattern = "yyyy-MM-dd")
+        @ApiModelProperty("结束时间")
+        private Date endTime;
+    }
+
+}

+ 26 - 0
nightFragrance-massage/src/main/java/com/ylx/point/domain/dto/PointActivityPageDTO.java

@@ -0,0 +1,26 @@
+package com.ylx.point.domain.dto;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+@Data
+@ApiModel("积分活动分页查询请求DTO")
+public class PointActivityPageDTO {
+
+    @ApiModelProperty("活动类型")
+    private Integer activityType;
+
+    @ApiModelProperty("覆盖城市")
+    private String cityCode;
+
+    @ApiModelProperty("状态")
+    private Long status;
+
+    @ApiModelProperty("活动开始时间")
+    private String startTime;
+
+    @ApiModelProperty("活动结束时间")
+    private String endTime;
+
+}

+ 35 - 0
nightFragrance-massage/src/main/java/com/ylx/point/domain/dto/PointActivityTaskDTO.java

@@ -0,0 +1,35 @@
+package com.ylx.point.domain.dto;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+@Data
+@ApiModel("积分普通活动添加DTO")
+public class PointActivityTaskDTO {
+
+    @ApiModelProperty("关联活动ID")
+    private Long activityId;
+
+    @ApiModelProperty("任务名称dict_label")
+    private String taskName;
+
+    @ApiModelProperty("任务代码dict_value")
+    private String taskValue;
+
+    @ApiModelProperty("触发条件描述dict_label")
+    private String triggerName;
+
+    @ApiModelProperty("触发阈值数值dict_value")
+    private String triggerValue;
+
+    @ApiModelProperty("奖励积分数")
+    private Long rewardPoints;
+
+    @ApiModelProperty("限制类型描述dict_label")
+    private String frequencyLimitName;
+
+    @ApiModelProperty("限制类型值dict_value")
+    private String frequencyLimitValue;
+
+}

+ 27 - 0
nightFragrance-massage/src/main/java/com/ylx/point/domain/dto/PointActivityValidityDTO.java

@@ -0,0 +1,27 @@
+package com.ylx.point.domain.dto;
+
+import com.ylx.common.annotation.Excel;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import javax.validation.constraints.NotNull;
+
+@Data
+@ApiModel("积分活动分页查询请求DTO")
+public class PointActivityValidityDTO {
+
+    @ApiModelProperty("活动类型")
+    @NotNull(message = "活动类型不能为空")
+    private Integer activityType;
+
+    @ApiModelProperty("过期策略: 1=永久有效, 2=逐笔过期(N天), 3=逐年过期(N年)")
+    private Integer expirePolicy;
+
+    @ApiModelProperty("有效期天数 (仅当 expire_policy=2 时有效)")
+    private Long expireDays;
+
+    @Excel(name = "逐年过期年份 (expire_policy=3时有效)")
+    private String expireYear;
+
+}

+ 17 - 0
nightFragrance-massage/src/main/java/com/ylx/point/domain/dto/PointSignRewardDTO.java

@@ -0,0 +1,17 @@
+package com.ylx.point.domain.dto;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+@Data
+@ApiModel("积分签到活动奖励配置添加DTO")
+public class PointSignRewardDTO {
+
+    @ApiModelProperty("连续签到天数(3/5/7/10等)")
+    private Long continueDays;
+
+    @ApiModelProperty("对应奖励积分")
+    private Long rewardPoints;
+
+}

+ 22 - 0
nightFragrance-massage/src/main/java/com/ylx/point/domain/dto/PointSignTaskDTO.java

@@ -0,0 +1,22 @@
+package com.ylx.point.domain.dto;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.List;
+
+@Data
+@ApiModel("积分签到活动添加DTO")
+public class PointSignTaskDTO {
+
+    @ApiModelProperty("每日签到基础积分")
+    private Long basePoints;
+
+    @ApiModelProperty("断签规则:0=重置,1=保留进度")
+    private Integer breakRule;
+
+    @ApiModelProperty("积分签到活动奖励配置集合")
+    private List<PointSignRewardDTO> signRewardList;
+
+}

+ 53 - 0
nightFragrance-massage/src/main/java/com/ylx/point/domain/vo/PointActivityBaseVo.java

@@ -0,0 +1,53 @@
+package com.ylx.point.domain.vo;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.ylx.common.annotation.Excel;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.Date;
+
+@Data
+@ApiModel("积分活动详情vo")
+public class PointActivityBaseVo {
+
+    @ApiModelProperty("活动主键id")
+    private Long id;
+
+    @ApiModelProperty("活动名称")
+    private String name;
+
+    @ApiModelProperty("活动简述")
+    private String description;
+
+    @ApiModelProperty("活动类型")
+    private Integer activityType;
+
+    @ApiModelProperty("覆盖城市代码")
+    private String cityCode;
+
+    @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
+    @ApiModelProperty("活动开始时间")
+    private Date startTime;
+
+    @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
+    @ApiModelProperty("活动结束时间")
+    private Date endTime;
+
+    @ApiModelProperty("是否长期有效 (1:是, 0:否)")
+    private Integer isPermanent;
+
+    @ApiModelProperty("过期策略: 1=永久有效, 2=逐笔过期(N天), 3=逐年过期(N年)")
+    private Integer expirePolicy;
+
+    @ApiModelProperty("有效期天数 (仅当 expire_policy=2 时有效)")
+    private Long expireDays;
+
+    @Excel(name = "逐年过期年份 (expire_policy=3时有效)")
+    private String expireYear;
+
+    @ApiModelProperty("状态: 0=未开始, 1=进行中, 2=已结束, 3=草稿")
+    private Long status;
+
+}

+ 20 - 0
nightFragrance-massage/src/main/java/com/ylx/point/domain/vo/PointActivityDetailsVo.java

@@ -0,0 +1,20 @@
+package com.ylx.point.domain.vo;
+
+import io.swagger.annotations.ApiModel;
+import lombok.Data;
+
+@Data
+@ApiModel("活动详情vo")
+public class PointActivityDetailsVo<T extends PointActivityBaseVo> {
+
+    private Integer activityType;
+
+    private T detail; // 自动适配不同VO
+
+    public static <T extends PointActivityBaseVo> PointActivityDetailsVo<T> of(Integer activityType, T detail) {
+        PointActivityDetailsVo<T> resp = new PointActivityDetailsVo<>();
+        resp.setActivityType(activityType);
+        resp.setDetail(detail);
+        return resp;
+    }
+}

+ 23 - 0
nightFragrance-massage/src/main/java/com/ylx/point/domain/vo/PointActivityOverviewVO.java

@@ -0,0 +1,23 @@
+package com.ylx.point.domain.vo;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+@Data
+@ApiModel("数据总览vo")
+public class PointActivityOverviewVO {
+
+    @ApiModelProperty("参与总人数")
+    private Integer totalParticipants;
+
+    @ApiModelProperty("完成总人数")
+    private Integer totalCompleted;
+
+    @ApiModelProperty("任务完成人次")
+    private Integer totalTaskTimes;
+
+    @ApiModelProperty("已发放积分")
+    private Long totalPoints;
+
+}

+ 50 - 0
nightFragrance-massage/src/main/java/com/ylx/point/domain/vo/PointActivityPageVo.java

@@ -0,0 +1,50 @@
+package com.ylx.point.domain.vo;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.fasterxml.jackson.annotation.JsonIgnore;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.time.LocalDateTime;
+
+@Data
+@ApiModel("积分活动分页vo")
+public class PointActivityPageVo {
+
+    @ApiModelProperty("活动主键id")
+    private Long id;
+
+    @ApiModelProperty(name = "活动名称")
+    private String name;
+
+    @JsonIgnore
+    private Integer activityType;
+
+    @ApiModelProperty(name = "活动类型")
+    private Integer activityTypeName;
+
+    @JsonIgnore
+    private String cityCode;
+
+    @ApiModelProperty(name = "覆盖城市名称")
+    private String cityName;
+
+    @ApiModelProperty(name = "活动开始时间")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    private LocalDateTime startTime;
+
+    @ApiModelProperty(name = "活动结束时间")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    private LocalDateTime endTime;
+
+    @ApiModelProperty(name = "是否长期有效 (1:是, 0:否)")
+    private Integer isPermanent;
+
+    @JsonIgnore
+    private Long status;
+
+    @ApiModelProperty(name = "状态")
+    private Long statusName;
+
+}

+ 51 - 0
nightFragrance-massage/src/main/java/com/ylx/point/domain/vo/PointActivityStatVo.java

@@ -0,0 +1,51 @@
+package com.ylx.point.domain.vo;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.fasterxml.jackson.annotation.JsonIgnore;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.time.LocalDateTime;
+import java.util.List;
+
+@Data
+@ApiModel("积分活动统计信息vo")
+public class PointActivityStatVo {
+
+    @ApiModelProperty("活动主键id")
+    private Long id;
+
+    @ApiModelProperty(name = "活动名称")
+    private String name;
+
+    @JsonIgnore
+    private Integer activityType;
+
+    @ApiModelProperty(name = "活动类型")
+    private Integer activityTypeName;
+
+    @JsonIgnore
+    private String cityCode;
+
+    @ApiModelProperty(name = "覆盖城市名称")
+    private String cityName;
+
+    @ApiModelProperty(name = "是否长期有效 (1:是, 0:否)")
+    private Integer isPermanent;
+
+    @ApiModelProperty(name = "活动开始时间")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    private LocalDateTime startTime;
+
+    @ApiModelProperty(name = "活动结束时间")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    private LocalDateTime endTime;
+
+    @ApiModelProperty(name = "数据总览")
+    private PointActivityOverviewVO dataOverview;
+
+    @ApiModelProperty(name = "数据详情")
+    private List<PointActivityTaskDetailVO> taskDetailList;
+
+}

+ 23 - 0
nightFragrance-massage/src/main/java/com/ylx/point/domain/vo/PointActivityTaskDetailVO.java

@@ -0,0 +1,23 @@
+package com.ylx.point.domain.vo;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+@Data
+@ApiModel("数据详情vo")
+public class PointActivityTaskDetailVO {
+
+    @ApiModelProperty("任务名称")
+    private String taskName;
+
+    @ApiModelProperty("完成人数")
+    private Integer completedCount;
+
+    @ApiModelProperty("完成人次")
+    private Integer completedTimes;
+
+    @ApiModelProperty("发放积分")
+    private Long points;
+
+}

+ 19 - 0
nightFragrance-massage/src/main/java/com/ylx/point/domain/vo/PointActivityTaskVo.java

@@ -0,0 +1,19 @@
+package com.ylx.point.domain.vo;
+
+import com.ylx.point.domain.dto.PointActivityTaskDTO;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.util.List;
+
+@EqualsAndHashCode(callSuper = true)
+@Data
+@ApiModel("普通活动详情vo")
+public class PointActivityTaskVo extends PointActivityBaseVo {
+
+    @ApiModelProperty("积分普通活动集合")
+    private List<PointActivityTaskDTO> activityTaskList;
+
+}

+ 25 - 0
nightFragrance-massage/src/main/java/com/ylx/point/domain/vo/PointSignTaskVo.java

@@ -0,0 +1,25 @@
+package com.ylx.point.domain.vo;
+
+import com.ylx.point.domain.dto.PointSignRewardDTO;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.util.List;
+
+@EqualsAndHashCode(callSuper = true)
+@Data
+@ApiModel("签到活动详情vo")
+public class PointSignTaskVo extends PointActivityBaseVo {
+
+    @ApiModelProperty("每日签到基础积分")
+    private Long basePoints;
+
+    @ApiModelProperty("断签规则:0=重置,1=保留进度")
+    private Integer breakRule;
+
+    @ApiModelProperty("积分签到活动奖励配置集合")
+    private List<PointSignRewardDTO> signRewardList;
+
+}

+ 19 - 0
nightFragrance-massage/src/main/java/com/ylx/point/enums/PointActivityTypeEnum.java

@@ -0,0 +1,19 @@
+package com.ylx.point.enums;
+
+import lombok.Getter;
+
+@Getter
+public enum PointActivityTypeEnum {
+
+    SIGN_TASK(0, "签到任务"),
+    ACTIVITY_TASK(1, "活动任务");
+
+
+    private final Integer code;
+    private final String info;
+
+    PointActivityTypeEnum(Integer code, String info) {
+        this.code = code;
+        this.info = info;
+    }
+}

+ 62 - 0
nightFragrance-massage/src/main/java/com/ylx/point/mapper/PointActivityMapper.java

@@ -0,0 +1,62 @@
+package com.ylx.point.mapper;
+
+import com.ylx.point.domain.PointActivity;
+
+import java.util.List;
+
+/**
+ * 积分活动主Mapper接口
+ * 
+ * @author wzj
+ * @date 2026-03-25
+ */
+public interface PointActivityMapper 
+{
+    /**
+     * 查询积分活动主
+     * 
+     * @param id 积分活动主主键
+     * @return 积分活动主
+     */
+    public PointActivity selectPointActivityById(Long id);
+
+    /**
+     * 查询积分活动主列表
+     * 
+     * @param pointActivity 积分活动主
+     * @return 积分活动主集合
+     */
+    public List<PointActivity> selectPointActivityList(PointActivity pointActivity);
+
+    /**
+     * 新增积分活动主
+     * 
+     * @param pointActivity 积分活动主
+     * @return 结果
+     */
+    public int insertPointActivity(PointActivity pointActivity);
+
+    /**
+     * 修改积分活动主
+     * 
+     * @param pointActivity 积分活动主
+     * @return 结果
+     */
+    public int updatePointActivity(PointActivity pointActivity);
+
+    /**
+     * 删除积分活动主
+     * 
+     * @param id 积分活动主主键
+     * @return 结果
+     */
+    public int deletePointActivityById(String id);
+
+    /**
+     * 批量删除积分活动主
+     * 
+     * @param ids 需要删除的数据主键集合
+     * @return 结果
+     */
+    public int deletePointActivityByIds(String[] ids);
+}

+ 35 - 0
nightFragrance-massage/src/main/java/com/ylx/point/mapper/PointActivityTaskMapper.java

@@ -0,0 +1,35 @@
+package com.ylx.point.mapper;
+
+import com.ylx.point.domain.PointActivityTask;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+/**
+ * 积分活动任务规则Mapper接口
+ *
+ * @author wzj
+ * @date 2026-03-25
+ */
+public interface PointActivityTaskMapper {
+
+    /**
+     * 删除积分活动任务规则
+     *
+     * @param id 积分活动任务规则主键
+     * @return 结果
+     */
+    public int deletePointActivityTaskById(String id);
+
+    void insertPointActivityTask(PointActivityTask pointActivityTask);
+
+    void batchInsertPointActivityTask(@Param("list") List<PointActivityTask> activityTasks);
+
+    /**
+     * 根据活动ID查询任务列表
+     *
+     * @param activityId 活动ID
+     * @return 任务列表
+     */
+    List<PointActivityTask> selectPointActivityTaskByActivityId(@Param("activityId") Long activityId);
+}

+ 70 - 0
nightFragrance-massage/src/main/java/com/ylx/point/mapper/PointSignRewardMapper.java

@@ -0,0 +1,70 @@
+package com.ylx.point.mapper;
+
+import com.ylx.point.domain.PointSignReward;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+/**
+ * 签到动态奖励配置Mapper接口
+ *
+ * @author wzj
+ * @date 2026-03-25
+ */
+public interface PointSignRewardMapper {
+    /**
+     * 查询签到动态奖励配置
+     *
+     * @param id 签到动态奖励配置主键
+     * @return 签到动态奖励配置
+     */
+    public PointSignReward selectPointSignRewardById(String id);
+
+    /**
+     * 查询签到动态奖励配置列表
+     *
+     * @param pointSignReward 签到动态奖励配置
+     * @return 签到动态奖励配置集合
+     */
+    public List<PointSignReward> selectPointSignRewardList(PointSignReward pointSignReward);
+
+    /**
+     * 新增签到动态奖励配置
+     *
+     * @param pointSignReward 签到动态奖励配置
+     * @return 结果
+     */
+    public int insertPointSignReward(PointSignReward pointSignReward);
+
+    /**
+     * 修改签到动态奖励配置
+     *
+     * @param pointSignReward 签到动态奖励配置
+     * @return 结果
+     */
+    public int updatePointSignReward(PointSignReward pointSignReward);
+
+    /**
+     * 删除签到动态奖励配置
+     *
+     * @param id 签到动态奖励配置主键
+     * @return 结果
+     */
+    public int deletePointSignRewardById(String id);
+
+    /**
+     * 批量删除签到动态奖励配置
+     *
+     * @param ids 需要删除的数据主键集合
+     * @return 结果
+     */
+    public int deletePointSignRewardByIds(String[] ids);
+
+    /**
+     * 批量插入签到动态奖励配置
+     *
+     * @param rewards 签到动态奖励配置列表
+     * @return 结果
+     */
+    public int batchInsertPointSignReward(@Param("list") List<PointSignReward> rewards);
+}

+ 26 - 0
nightFragrance-massage/src/main/java/com/ylx/point/mapper/PointSignTaskMapper.java

@@ -0,0 +1,26 @@
+package com.ylx.point.mapper;
+
+import com.ylx.point.domain.PointSignTask;
+import com.ylx.point.domain.vo.PointSignTaskVo;
+
+/**
+ * 积分签到任务规则Mapper接口
+ * 
+ * @author wzj
+ * @date 2026-03-25
+ */
+public interface PointSignTaskMapper 
+{
+
+    /**
+     * 删除积分签到任务规则
+     * 
+     * @param id 积分签到任务规则主键
+     * @return 结果
+     */
+    public int deletePointSignTaskById(String id);
+
+    PointSignTaskVo getTaskWithRewards(Long activityId);
+
+    int insertPointSignTask(PointSignTask pointSignTask);
+}

+ 62 - 0
nightFragrance-massage/src/main/java/com/ylx/point/mapper/PointUserActivityTaskCompletionMapper.java

@@ -0,0 +1,62 @@
+package com.ylx.point.mapper;
+
+import com.ylx.point.domain.PointUserActivityTaskCompletion;
+
+import java.util.List;
+
+/**
+ * 用户活动任务完成Mapper接口
+ * 
+ * @author wzj
+ * @date 2026-03-25
+ */
+public interface PointUserActivityTaskCompletionMapper 
+{
+    /**
+     * 查询用户活动任务完成
+     * 
+     * @param id 用户活动任务完成主键
+     * @return 用户活动任务完成
+     */
+    public PointUserActivityTaskCompletion selectPointUserActivityTaskCompletionById(String id);
+
+    /**
+     * 查询用户活动任务完成列表
+     * 
+     * @param pointUserActivityTaskCompletion 用户活动任务完成
+     * @return 用户活动任务完成集合
+     */
+    public List<PointUserActivityTaskCompletion> selectPointUserActivityTaskCompletionList(PointUserActivityTaskCompletion pointUserActivityTaskCompletion);
+
+    /**
+     * 新增用户活动任务完成
+     * 
+     * @param pointUserActivityTaskCompletion 用户活动任务完成
+     * @return 结果
+     */
+    public int insertPointUserActivityTaskCompletion(PointUserActivityTaskCompletion pointUserActivityTaskCompletion);
+
+    /**
+     * 修改用户活动任务完成
+     * 
+     * @param pointUserActivityTaskCompletion 用户活动任务完成
+     * @return 结果
+     */
+    public int updatePointUserActivityTaskCompletion(PointUserActivityTaskCompletion pointUserActivityTaskCompletion);
+
+    /**
+     * 删除用户活动任务完成
+     * 
+     * @param id 用户活动任务完成主键
+     * @return 结果
+     */
+    public int deletePointUserActivityTaskCompletionById(String id);
+
+    /**
+     * 批量删除用户活动任务完成
+     * 
+     * @param ids 需要删除的数据主键集合
+     * @return 结果
+     */
+    public int deletePointUserActivityTaskCompletionByIds(String[] ids);
+}

+ 62 - 0
nightFragrance-massage/src/main/java/com/ylx/point/mapper/PointUserLogMapper.java

@@ -0,0 +1,62 @@
+package com.ylx.point.mapper;
+
+import com.ylx.point.domain.PointUserLog;
+
+import java.util.List;
+
+/**
+ * 用户积分流水Mapper接口
+ * 
+ * @author wzj
+ * @date 2026-03-25
+ */
+public interface PointUserLogMapper 
+{
+    /**
+     * 查询用户积分流水
+     * 
+     * @param id 用户积分流水主键
+     * @return 用户积分流水
+     */
+    public PointUserLog selectPointUserLogById(String id);
+
+    /**
+     * 查询用户积分流水列表
+     * 
+     * @param pointUserLog 用户积分流水
+     * @return 用户积分流水集合
+     */
+    public List<PointUserLog> selectPointUserLogList(PointUserLog pointUserLog);
+
+    /**
+     * 新增用户积分流水
+     * 
+     * @param pointUserLog 用户积分流水
+     * @return 结果
+     */
+    public int insertPointUserLog(PointUserLog pointUserLog);
+
+    /**
+     * 修改用户积分流水
+     * 
+     * @param pointUserLog 用户积分流水
+     * @return 结果
+     */
+    public int updatePointUserLog(PointUserLog pointUserLog);
+
+    /**
+     * 删除用户积分流水
+     * 
+     * @param id 用户积分流水主键
+     * @return 结果
+     */
+    public int deletePointUserLogById(String id);
+
+    /**
+     * 批量删除用户积分流水
+     * 
+     * @param ids 需要删除的数据主键集合
+     * @return 结果
+     */
+    public int deletePointUserLogByIds(String[] ids);
+}

+ 62 - 0
nightFragrance-massage/src/main/java/com/ylx/point/mapper/PointUserSignLogMapper.java

@@ -0,0 +1,62 @@
+package com.ylx.point.mapper;
+
+import com.ylx.point.domain.PointUserSignLog;
+
+import java.util.List;
+
+/**
+ * 用户签到记录Mapper接口
+ * 
+ * @author wzj
+ * @date 2026-03-25
+ */
+public interface PointUserSignLogMapper 
+{
+    /**
+     * 查询用户签到记录
+     * 
+     * @param id 用户签到记录主键
+     * @return 用户签到记录
+     */
+    public PointUserSignLog selectPointUserSignLogById(String id);
+
+    /**
+     * 查询用户签到记录列表
+     * 
+     * @param pointUserSignLog 用户签到记录
+     * @return 用户签到记录集合
+     */
+    public List<PointUserSignLog> selectPointUserSignLogList(PointUserSignLog pointUserSignLog);
+
+    /**
+     * 新增用户签到记录
+     * 
+     * @param pointUserSignLog 用户签到记录
+     * @return 结果
+     */
+    public int insertPointUserSignLog(PointUserSignLog pointUserSignLog);
+
+    /**
+     * 修改用户签到记录
+     * 
+     * @param pointUserSignLog 用户签到记录
+     * @return 结果
+     */
+    public int updatePointUserSignLog(PointUserSignLog pointUserSignLog);
+
+    /**
+     * 删除用户签到记录
+     * 
+     * @param id 用户签到记录主键
+     * @return 结果
+     */
+    public int deletePointUserSignLogById(String id);
+
+    /**
+     * 批量删除用户签到记录
+     * 
+     * @param ids 需要删除的数据主键集合
+     * @return 结果
+     */
+    public int deletePointUserSignLogByIds(String[] ids);
+}

+ 62 - 0
nightFragrance-massage/src/main/java/com/ylx/point/mapper/PointUserSignStatusMapper.java

@@ -0,0 +1,62 @@
+package com.ylx.point.mapper;
+
+import com.ylx.point.domain.PointUserSignStatus;
+
+import java.util.List;
+
+/**
+ * 用户签到状态快照Mapper接口
+ * 
+ * @author wzj
+ * @date 2026-03-25
+ */
+public interface PointUserSignStatusMapper 
+{
+    /**
+     * 查询用户签到状态快照
+     * 
+     * @param id 用户签到状态快照主键
+     * @return 用户签到状态快照
+     */
+    public PointUserSignStatus selectPointUserSignStatusById(String id);
+
+    /**
+     * 查询用户签到状态快照列表
+     * 
+     * @param pointUserSignStatus 用户签到状态快照
+     * @return 用户签到状态快照集合
+     */
+    public List<PointUserSignStatus> selectPointUserSignStatusList(PointUserSignStatus pointUserSignStatus);
+
+    /**
+     * 新增用户签到状态快照
+     * 
+     * @param pointUserSignStatus 用户签到状态快照
+     * @return 结果
+     */
+    public int insertPointUserSignStatus(PointUserSignStatus pointUserSignStatus);
+
+    /**
+     * 修改用户签到状态快照
+     * 
+     * @param pointUserSignStatus 用户签到状态快照
+     * @return 结果
+     */
+    public int updatePointUserSignStatus(PointUserSignStatus pointUserSignStatus);
+
+    /**
+     * 删除用户签到状态快照
+     * 
+     * @param id 用户签到状态快照主键
+     * @return 结果
+     */
+    public int deletePointUserSignStatusById(String id);
+
+    /**
+     * 批量删除用户签到状态快照
+     * 
+     * @param ids 需要删除的数据主键集合
+     * @return 结果
+     */
+    public int deletePointUserSignStatusByIds(String[] ids);
+}

+ 32 - 0
nightFragrance-massage/src/main/java/com/ylx/point/service/IPointActivityService.java

@@ -0,0 +1,32 @@
+package com.ylx.point.service;
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ylx.point.domain.PointActivity;
+import com.ylx.point.domain.dto.PointActivityDTO;
+import com.ylx.point.domain.dto.PointActivityPageDTO;
+import com.ylx.point.domain.dto.PointActivityValidityDTO;
+import com.ylx.point.domain.vo.PointActivityDetailsVo;
+import com.ylx.point.domain.vo.PointActivityPageVo;
+import com.ylx.point.domain.vo.PointActivityStatVo;
+
+/**
+ * 积分活动主Service接口
+ *
+ * @author wzj
+ * @date 2026-03-25
+ */
+public interface IPointActivityService {
+
+    Page<PointActivityPageVo> page(Page<PointActivity> page, PointActivityPageDTO dto);
+
+    PointActivityDetailsVo<?> getDetailsInfo(Long id);
+
+    void add(PointActivityDTO dto);
+
+    void edit(PointActivityDTO dto);
+
+    PointActivityStatVo getStatInfo(String id);
+
+    void editValidity(PointActivityValidityDTO dto);
+
+}

+ 29 - 0
nightFragrance-massage/src/main/java/com/ylx/point/service/IPointActivityTaskService.java

@@ -0,0 +1,29 @@
+package com.ylx.point.service;
+
+import com.ylx.point.domain.PointActivityTask;
+import com.ylx.point.domain.dto.PointActivityTaskDTO;
+
+import java.util.List;
+
+/**
+ * 积分活动任务规则Service接口
+ *
+ * @author wzj
+ * @date 2026-03-25
+ */
+public interface IPointActivityTaskService {
+
+    /**
+     * 删除积分活动任务规则信息
+     *
+     * @param id 积分活动任务规则主键
+     * @return 结果
+     */
+    public int deletePointActivityTaskById(String id);
+
+    List<PointActivityTaskDTO>  selectPointActivityTaskByActivityId(Long id);
+
+    void insertPointActivityTask(PointActivityTask pointActivityTask);
+
+    void batchInsertPointActivityTask(List<PointActivityTask> activityTasks);
+}

+ 64 - 0
nightFragrance-massage/src/main/java/com/ylx/point/service/IPointSignRewardService.java

@@ -0,0 +1,64 @@
+package com.ylx.point.service;
+
+import com.ylx.point.domain.PointSignReward;
+
+import java.util.List;
+
+/**
+ * 签到动态奖励配置Service接口
+ * 
+ * @author wzj
+ * @date 2026-03-25
+ */
+public interface IPointSignRewardService 
+{
+    /**
+     * 查询签到动态奖励配置
+     * 
+     * @param id 签到动态奖励配置主键
+     * @return 签到动态奖励配置
+     */
+    public PointSignReward selectPointSignRewardById(String id);
+
+    /**
+     * 查询签到动态奖励配置列表
+     * 
+     * @param pointSignReward 签到动态奖励配置
+     * @return 签到动态奖励配置集合
+     */
+    public List<PointSignReward> selectPointSignRewardList(PointSignReward pointSignReward);
+
+    /**
+     * 新增签到动态奖励配置
+     * 
+     * @param pointSignReward 签到动态奖励配置
+     * @return 结果
+     */
+    public int insertPointSignReward(PointSignReward pointSignReward);
+
+    /**
+     * 修改签到动态奖励配置
+     * 
+     * @param pointSignReward 签到动态奖励配置
+     * @return 结果
+     */
+    public int updatePointSignReward(PointSignReward pointSignReward);
+
+    /**
+     * 批量删除签到动态奖励配置
+     * 
+     * @param ids 需要删除的签到动态奖励配置主键集合
+     * @return 结果
+     */
+    public int deletePointSignRewardByIds(String[] ids);
+
+    /**
+     * 删除签到动态奖励配置信息
+     * 
+     * @param id 签到动态奖励配置主键
+     * @return 结果
+     */
+    public int deletePointSignRewardById(String id);
+
+    void batchInsertPointSignReward(List<PointSignReward> rewards);
+}

+ 31 - 0
nightFragrance-massage/src/main/java/com/ylx/point/service/IPointSignTaskService.java

@@ -0,0 +1,31 @@
+package com.ylx.point.service;
+
+import com.ylx.point.domain.PointSignTask;
+import com.ylx.point.domain.vo.PointSignTaskVo;
+
+/**
+ * 积分签到任务规则Service接口
+ *
+ * @author wzj
+ * @date 2026-03-25
+ */
+public interface IPointSignTaskService {
+
+
+    /**
+     * 新增积分签到任务规则
+     *
+     * @param pointSignTask 积分签到任务规则
+     * @return 结果
+     */
+    public int insertPointSignTask(PointSignTask pointSignTask);
+    /**
+     * 删除积分签到任务规则信息
+     *
+     * @param id 积分签到任务规则主键
+     * @return 结果
+     */
+    public int deletePointSignTaskById(String id);
+
+    PointSignTaskVo selectPointSignTaskByActivityId(Long id);
+}

+ 62 - 0
nightFragrance-massage/src/main/java/com/ylx/point/service/IPointUserActivityTaskCompletionService.java

@@ -0,0 +1,62 @@
+package com.ylx.point.service;
+
+import com.ylx.point.domain.PointUserActivityTaskCompletion;
+
+import java.util.List;
+
+/**
+ * 用户活动任务完成Service接口
+ * 
+ * @author wzj
+ * @date 2026-03-25
+ */
+public interface IPointUserActivityTaskCompletionService 
+{
+    /**
+     * 查询用户活动任务完成
+     * 
+     * @param id 用户活动任务完成主键
+     * @return 用户活动任务完成
+     */
+    public PointUserActivityTaskCompletion selectPointUserActivityTaskCompletionById(String id);
+
+    /**
+     * 查询用户活动任务完成列表
+     * 
+     * @param pointUserActivityTaskCompletion 用户活动任务完成
+     * @return 用户活动任务完成集合
+     */
+    public List<PointUserActivityTaskCompletion> selectPointUserActivityTaskCompletionList(PointUserActivityTaskCompletion pointUserActivityTaskCompletion);
+
+    /**
+     * 新增用户活动任务完成
+     * 
+     * @param pointUserActivityTaskCompletion 用户活动任务完成
+     * @return 结果
+     */
+    public int insertPointUserActivityTaskCompletion(PointUserActivityTaskCompletion pointUserActivityTaskCompletion);
+
+    /**
+     * 修改用户活动任务完成
+     * 
+     * @param pointUserActivityTaskCompletion 用户活动任务完成
+     * @return 结果
+     */
+    public int updatePointUserActivityTaskCompletion(PointUserActivityTaskCompletion pointUserActivityTaskCompletion);
+
+    /**
+     * 批量删除用户活动任务完成
+     * 
+     * @param ids 需要删除的用户活动任务完成主键集合
+     * @return 结果
+     */
+    public int deletePointUserActivityTaskCompletionByIds(String[] ids);
+
+    /**
+     * 删除用户活动任务完成信息
+     * 
+     * @param id 用户活动任务完成主键
+     * @return 结果
+     */
+    public int deletePointUserActivityTaskCompletionById(String id);
+}

+ 62 - 0
nightFragrance-massage/src/main/java/com/ylx/point/service/IPointUserLogService.java

@@ -0,0 +1,62 @@
+package com.ylx.point.service;
+
+import com.ylx.point.domain.PointUserLog;
+
+import java.util.List;
+
+/**
+ * 用户积分流水Service接口
+ * 
+ * @author wzj
+ * @date 2026-03-25
+ */
+public interface IPointUserLogService 
+{
+    /**
+     * 查询用户积分流水
+     * 
+     * @param id 用户积分流水主键
+     * @return 用户积分流水
+     */
+    public PointUserLog selectPointUserLogById(String id);
+
+    /**
+     * 查询用户积分流水列表
+     * 
+     * @param pointUserLog 用户积分流水
+     * @return 用户积分流水集合
+     */
+    public List<PointUserLog> selectPointUserLogList(PointUserLog pointUserLog);
+
+    /**
+     * 新增用户积分流水
+     * 
+     * @param pointUserLog 用户积分流水
+     * @return 结果
+     */
+    public int insertPointUserLog(PointUserLog pointUserLog);
+
+    /**
+     * 修改用户积分流水
+     * 
+     * @param pointUserLog 用户积分流水
+     * @return 结果
+     */
+    public int updatePointUserLog(PointUserLog pointUserLog);
+
+    /**
+     * 批量删除用户积分流水
+     * 
+     * @param ids 需要删除的用户积分流水主键集合
+     * @return 结果
+     */
+    public int deletePointUserLogByIds(String[] ids);
+
+    /**
+     * 删除用户积分流水信息
+     * 
+     * @param id 用户积分流水主键
+     * @return 结果
+     */
+    public int deletePointUserLogById(String id);
+}

+ 62 - 0
nightFragrance-massage/src/main/java/com/ylx/point/service/IPointUserSignLogService.java

@@ -0,0 +1,62 @@
+package com.ylx.point.service;
+
+import com.ylx.point.domain.PointUserSignLog;
+
+import java.util.List;
+
+/**
+ * 用户签到记录Service接口
+ * 
+ * @author wzj
+ * @date 2026-03-25
+ */
+public interface IPointUserSignLogService 
+{
+    /**
+     * 查询用户签到记录
+     * 
+     * @param id 用户签到记录主键
+     * @return 用户签到记录
+     */
+    public PointUserSignLog selectPointUserSignLogById(String id);
+
+    /**
+     * 查询用户签到记录列表
+     * 
+     * @param pointUserSignLog 用户签到记录
+     * @return 用户签到记录集合
+     */
+    public List<PointUserSignLog> selectPointUserSignLogList(PointUserSignLog pointUserSignLog);
+
+    /**
+     * 新增用户签到记录
+     * 
+     * @param pointUserSignLog 用户签到记录
+     * @return 结果
+     */
+    public int insertPointUserSignLog(PointUserSignLog pointUserSignLog);
+
+    /**
+     * 修改用户签到记录
+     * 
+     * @param pointUserSignLog 用户签到记录
+     * @return 结果
+     */
+    public int updatePointUserSignLog(PointUserSignLog pointUserSignLog);
+
+    /**
+     * 批量删除用户签到记录
+     * 
+     * @param ids 需要删除的用户签到记录主键集合
+     * @return 结果
+     */
+    public int deletePointUserSignLogByIds(String[] ids);
+
+    /**
+     * 删除用户签到记录信息
+     * 
+     * @param id 用户签到记录主键
+     * @return 结果
+     */
+    public int deletePointUserSignLogById(String id);
+}

+ 62 - 0
nightFragrance-massage/src/main/java/com/ylx/point/service/IPointUserSignStatusService.java

@@ -0,0 +1,62 @@
+package com.ylx.point.service;
+
+import com.ylx.point.domain.PointUserSignStatus;
+
+import java.util.List;
+
+/**
+ * 用户签到状态快照Service接口
+ * 
+ * @author wzj
+ * @date 2026-03-25
+ */
+public interface IPointUserSignStatusService 
+{
+    /**
+     * 查询用户签到状态快照
+     * 
+     * @param id 用户签到状态快照主键
+     * @return 用户签到状态快照
+     */
+    public PointUserSignStatus selectPointUserSignStatusById(String id);
+
+    /**
+     * 查询用户签到状态快照列表
+     * 
+     * @param pointUserSignStatus 用户签到状态快照
+     * @return 用户签到状态快照集合
+     */
+    public List<PointUserSignStatus> selectPointUserSignStatusList(PointUserSignStatus pointUserSignStatus);
+
+    /**
+     * 新增用户签到状态快照
+     * 
+     * @param pointUserSignStatus 用户签到状态快照
+     * @return 结果
+     */
+    public int insertPointUserSignStatus(PointUserSignStatus pointUserSignStatus);
+
+    /**
+     * 修改用户签到状态快照
+     * 
+     * @param pointUserSignStatus 用户签到状态快照
+     * @return 结果
+     */
+    public int updatePointUserSignStatus(PointUserSignStatus pointUserSignStatus);
+
+    /**
+     * 批量删除用户签到状态快照
+     * 
+     * @param ids 需要删除的用户签到状态快照主键集合
+     * @return 结果
+     */
+    public int deletePointUserSignStatusByIds(String[] ids);
+
+    /**
+     * 删除用户签到状态快照信息
+     * 
+     * @param id 用户签到状态快照主键
+     * @return 结果
+     */
+    public int deletePointUserSignStatusById(String id);
+}

+ 231 - 0
nightFragrance-massage/src/main/java/com/ylx/point/service/impl/PointActivityServiceImpl.java

@@ -0,0 +1,231 @@
+package com.ylx.point.service.impl;
+
+import java.util.Date;
+import java.util.List;
+import java.util.stream.Collectors;
+
+import cn.hutool.core.bean.BeanUtil;
+import cn.hutool.core.collection.CollectionUtil;
+import cn.hutool.core.date.DateUtil;
+import cn.hutool.core.util.ObjectUtil;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ylx.common.core.domain.R;
+import com.ylx.common.exception.base.BaseException;
+import com.ylx.common.utils.DateUtils;
+import com.ylx.point.domain.PointActivityTask;
+import com.ylx.point.domain.PointSignReward;
+import com.ylx.point.domain.PointSignTask;
+import com.ylx.point.domain.dto.*;
+import com.ylx.point.domain.vo.*;
+import com.ylx.point.enums.PointActivityTypeEnum;
+import com.ylx.point.service.IPointActivityTaskService;
+import com.ylx.point.service.IPointSignRewardService;
+import com.ylx.point.service.IPointSignTaskService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import com.ylx.point.domain.PointActivity;
+import com.ylx.point.mapper.PointActivityMapper;
+import com.ylx.point.service.IPointActivityService;
+import org.springframework.transaction.annotation.Transactional;
+
+
+/**
+ * 积分活动主Service业务层处理
+ *
+ * @author wzj
+ * @date 2026-03-25
+ */
+@Service
+public class PointActivityServiceImpl implements IPointActivityService {
+    @Autowired
+    private PointActivityMapper pointActivityMapper;
+    @Autowired
+    private IPointActivityTaskService pointActivityTaskService;
+    @Autowired
+    private IPointSignTaskService pointSignTaskService;
+    @Autowired
+    private IPointSignRewardService pointSignRewardService;
+
+
+    @Override
+    public Page<PointActivityPageVo> page(Page<PointActivity> page, PointActivityPageDTO dto) {
+        return null;
+    }
+
+    @Override
+    public PointActivityDetailsVo<?> getDetailsInfo(Long id) {
+
+        PointActivity pointActivity = this.pointActivityMapper.selectPointActivityById(id);
+        if (ObjectUtil.isNull(pointActivity)) {
+            return null;
+        }
+
+        Integer activityType = pointActivity.getActivityType();
+        if (PointActivityTypeEnum.SIGN_TASK.getCode().equals(activityType)) {
+            PointSignTaskVo vo = this.pointSignTaskService.selectPointSignTaskByActivityId(pointActivity.getId());
+            BeanUtil.copyProperties(pointActivity, vo);
+            return PointActivityDetailsVo.of(PointActivityTypeEnum.SIGN_TASK.getCode(), vo);
+        } else if (PointActivityTypeEnum.ACTIVITY_TASK.getCode().equals(activityType)) {
+            PointActivityTaskVo vo = new PointActivityTaskVo();
+            BeanUtil.copyProperties(pointActivity, vo);
+            List<PointActivityTaskDTO> activityTaskList = this.pointActivityTaskService.selectPointActivityTaskByActivityId(pointActivity.getId());
+            vo.setActivityTaskList(activityTaskList);
+            return PointActivityDetailsVo.of(PointActivityTypeEnum.ACTIVITY_TASK.getCode(), vo);
+        }
+
+        return PointActivityDetailsVo.of(activityType, new PointActivityBaseVo());
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void add(PointActivityDTO dto) {
+
+        // 校验参数
+        validateActivityDTO(dto);
+
+        // 保存活动信息
+        PointActivity entity = createActivityEntity(dto);
+        saveActivity(entity);
+
+        // 保存活动详情信息
+        saveActivityDetails(dto, entity.getId());
+
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void edit(PointActivityDTO dto) {
+
+    }
+
+    @Override
+    public PointActivityStatVo getStatInfo(String id) {
+        return null;
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void editValidity(PointActivityValidityDTO dto) {
+
+    }
+
+    private void validateActivityDTO(PointActivityDTO dto) {
+        if (ObjectUtil.isNull(dto)) {
+            throw new BaseException("活动信息不能为空");
+        }
+
+        PointActivityDTO.ActivityTimeConfig timeConfig = dto.getTimeConfig();
+        if (ObjectUtil.isNull(timeConfig) || (!timeConfig.isPermanent() &&
+                (ObjectUtil.isNull(timeConfig.getStartTime()) || ObjectUtil.isNull(timeConfig.getEndTime())))) {
+            throw new BaseException("活动时间配置不能为空");
+        }
+    }
+
+    private PointActivity createActivityEntity(PointActivityDTO dto) {
+        PointActivity entity = new PointActivity();
+        BeanUtil.copyProperties(dto, entity);
+
+        PointActivityDTO.ActivityTimeConfig timeConfig = dto.getTimeConfig();
+        entity.setStartTime(DateUtil.beginOfDay(timeConfig.getStartTime()));
+        
+        // 处理endTime,确保时间部分正确设置为23:59:59
+        Date endTime = timeConfig.getEndTime();
+        if (endTime != null) {
+            // 使用Java 8的日期时间API处理时区问题
+            java.time.LocalDateTime localDateTime = java.time.LocalDateTime.ofInstant(
+                endTime.toInstant(),
+                java.time.ZoneId.systemDefault()
+            );
+            // 设置为当天的23:59:59
+            java.time.LocalDateTime endOfDay = localDateTime.with(
+                java.time.LocalTime.of(23, 59, 59)
+            );
+            // 转换回Date对象
+            endTime = Date.from(
+                endOfDay.atZone(java.time.ZoneId.systemDefault()).toInstant()
+            );
+        }
+        entity.setEndTime(endTime);
+        entity.setIsPermanent(timeConfig.isPermanent() ? 1 : 0);
+
+        return entity;
+    }
+
+    private void saveActivity(PointActivity entity) {
+        int affectedRows = pointActivityMapper.insertPointActivity(entity);
+        if (affectedRows <= 0) {
+            throw new BaseException("保存积分活动失败");
+        }
+    }
+
+    private void saveActivityDetails(PointActivityDTO dto, Long activityId) {
+        if (PointActivityTypeEnum.SIGN_TASK.getCode().equals(dto.getActivityType())) {
+            saveSignTaskDetails(dto, activityId);
+        } else if (PointActivityTypeEnum.ACTIVITY_TASK.getCode().equals(dto.getActivityType())) {
+            saveActivityTaskDetails(dto, activityId);
+        }
+    }
+
+    private void saveSignTaskDetails(PointActivityDTO dto, Long activityId) {
+        PointSignTaskDTO signTaskDTO = dto.getSignTaskDTO();
+        if (ObjectUtil.isNull(signTaskDTO)) {
+            throw new BaseException("签到任务配置不能为空");
+        }
+
+        PointSignTask pointSignTask = new PointSignTask();
+        pointSignTask.setActivityId(activityId);
+        pointSignTask.setBasePoints(signTaskDTO.getBasePoints());
+        pointSignTask.setBreakRule(signTaskDTO.getBreakRule());
+        pointSignTask.setCreateTime(new Date());
+        pointSignTask.setUpdateTime(pointSignTask.getCreateTime());
+        pointSignTask.setIsDeleted(0);
+        int affectedRows = pointSignTaskService.insertPointSignTask(pointSignTask);
+        if (affectedRows <= 0) {
+            throw new BaseException("保存积分签到任务规则失败");
+        }
+
+        saveSignRewards(signTaskDTO.getSignRewardList(), pointSignTask.getId());
+    }
+
+    private void saveSignRewards(List<PointSignRewardDTO> rewardList, Long taskId) {
+        if (CollectionUtil.isEmpty(rewardList)) {
+            return;
+        }
+
+        List<PointSignReward> rewards = rewardList.stream()
+                .map(dto -> {
+                    PointSignReward reward = new PointSignReward();
+                    reward.setRewardPoints(dto.getRewardPoints());
+                    reward.setContinueDays(dto.getContinueDays());
+                    reward.setCreateTime(new Date());
+                    reward.setUpdateTime(reward.getCreateTime());
+                    reward.setIsDeleted(0);
+                    reward.setSignTaskId(taskId);
+                    return reward;
+                })
+                .collect(Collectors.toList());
+
+        pointSignRewardService.batchInsertPointSignReward(rewards);
+    }
+
+    private void saveActivityTaskDetails(PointActivityDTO dto, Long activityId) {
+        List<PointActivityTaskDTO> tasks = dto.getTasks();
+        if (CollectionUtil.isEmpty(tasks)) {
+            return;
+        }
+
+        List<PointActivityTask> activityTasks = tasks.stream()
+                .map(task -> {
+                    PointActivityTask activityTask = new PointActivityTask();
+                    BeanUtil.copyProperties(task, activityTask);
+                    activityTask.setActivityId(activityId);
+                    activityTask.setIsDeleted(0);
+                    activityTask.setCreateTime(new Date());
+                    activityTask.setUpdateTime(activityTask.getCreateTime());
+                    return activityTask;
+                })
+                .collect(Collectors.toList());
+
+        pointActivityTaskService.batchInsertPointActivityTask(activityTasks);
+    }
+}

+ 76 - 0
nightFragrance-massage/src/main/java/com/ylx/point/service/impl/PointActivityTaskServiceImpl.java

@@ -0,0 +1,76 @@
+package com.ylx.point.service.impl;
+
+import cn.hutool.core.bean.BeanUtil;
+import cn.hutool.core.collection.CollectionUtil;
+import com.ylx.common.utils.DateUtils;
+import com.ylx.point.domain.PointActivityTask;
+import com.ylx.point.domain.dto.PointActivityTaskDTO;
+import com.ylx.point.mapper.PointActivityTaskMapper;
+import com.ylx.point.service.IPointActivityTaskService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.Date;
+import java.util.List;
+
+
+/**
+ * 积分活动任务规则Service业务层处理
+ *
+ * @author wzj
+ * @date 2026-03-25
+ */
+@Service
+public class PointActivityTaskServiceImpl implements IPointActivityTaskService {
+    @Autowired
+    private PointActivityTaskMapper pointActivityTaskMapper;
+
+    /**
+     * 删除积分活动任务规则信息
+     *
+     * @param id 积分活动任务规则主键
+     * @return 结果
+     */
+    @Override
+    public int deletePointActivityTaskById(String id) {
+        return pointActivityTaskMapper.deletePointActivityTaskById(id);
+    }
+
+    @Override
+    public List<PointActivityTaskDTO> selectPointActivityTaskByActivityId(Long id) {
+        // 查询活动任务列表
+        List<PointActivityTask> taskList = pointActivityTaskMapper.selectPointActivityTaskByActivityId(id);
+        
+        if (CollectionUtil.isEmpty(taskList)) {
+            return java.util.Collections.emptyList();
+        }
+        
+        // 转换为DTO列表
+        return taskList.stream().map(task -> {
+            PointActivityTaskDTO dto = new PointActivityTaskDTO();
+            BeanUtil.copyProperties(task, dto);
+            return dto;
+        }).collect(java.util.stream.Collectors.toList());
+    }
+
+    @Override
+    public void insertPointActivityTask(PointActivityTask pointActivityTask) {
+        pointActivityTaskMapper.insertPointActivityTask(pointActivityTask);
+    }
+
+    @Override
+    public void batchInsertPointActivityTask(List<PointActivityTask> activityTasks) {
+        if (CollectionUtil.isEmpty(activityTasks)) {
+            return;
+        }
+
+        // 设置创建时间
+        Date now = DateUtils.getNowDate();
+        for (PointActivityTask activityTask : activityTasks) {
+            activityTask.setCreateTime(now);
+        }
+
+        // 批量插入
+        pointActivityTaskMapper.batchInsertPointActivityTask(activityTasks);
+    }
+}

+ 118 - 0
nightFragrance-massage/src/main/java/com/ylx/point/service/impl/PointSignRewardServiceImpl.java

@@ -0,0 +1,118 @@
+package com.ylx.point.service.impl;
+
+import cn.hutool.core.collection.CollectionUtil;
+import com.ylx.common.utils.DateUtils;
+import com.ylx.point.domain.PointSignReward;
+import com.ylx.point.mapper.PointSignRewardMapper;
+import com.ylx.point.service.IPointSignRewardService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.Date;
+import java.util.List;
+
+/**
+ * 签到动态奖励配置Service业务层处理
+ *
+ * @author wzj
+ * @date 2026-03-25
+ */
+@Service
+public class PointSignRewardServiceImpl implements IPointSignRewardService
+{
+    @Autowired
+    private PointSignRewardMapper pointSignRewardMapper;
+
+    /**
+     * 查询签到动态奖励配置
+     *
+     * @param id 签到动态奖励配置主键
+     * @return 签到动态奖励配置
+     */
+    @Override
+    public PointSignReward selectPointSignRewardById(String id)
+    {
+        return pointSignRewardMapper.selectPointSignRewardById(id);
+    }
+
+    /**
+     * 查询签到动态奖励配置列表
+     *
+     * @param pointSignReward 签到动态奖励配置
+     * @return 签到动态奖励配置
+     */
+    @Override
+    public List<PointSignReward> selectPointSignRewardList(PointSignReward pointSignReward)
+    {
+        return pointSignRewardMapper.selectPointSignRewardList(pointSignReward);
+    }
+
+    /**
+     * 新增签到动态奖励配置
+     *
+     * @param pointSignReward 签到动态奖励配置
+     * @return 结果
+     */
+    @Override
+    public int insertPointSignReward(PointSignReward pointSignReward)
+    {
+        pointSignReward.setCreateTime(DateUtils.getNowDate());
+        return pointSignRewardMapper.insertPointSignReward(pointSignReward);
+    }
+
+    /**
+     * 修改签到动态奖励配置
+     *
+     * @param pointSignReward 签到动态奖励配置
+     * @return 结果
+     */
+    @Override
+    public int updatePointSignReward(PointSignReward pointSignReward)
+    {
+        pointSignReward.setUpdateTime(DateUtils.getNowDate());
+        return pointSignRewardMapper.updatePointSignReward(pointSignReward);
+    }
+
+    /**
+     * 批量删除签到动态奖励配置
+     *
+     * @param ids 需要删除的签到动态奖励配置主键
+     * @return 结果
+     */
+    @Override
+    public int deletePointSignRewardByIds(String[] ids)
+    {
+        return pointSignRewardMapper.deletePointSignRewardByIds(ids);
+    }
+
+    /**
+     * 删除签到动态奖励配置信息
+     *
+     * @param id 签到动态奖励配置主键
+     * @return 结果
+     */
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public int deletePointSignRewardById(String id)
+    {
+        return pointSignRewardMapper.deletePointSignRewardById(id);
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public void batchInsertPointSignReward(List<PointSignReward> rewards) {
+        if (CollectionUtil.isEmpty(rewards)) {
+            return;
+        }
+        
+        // 设置创建时间
+        Date now = DateUtils.getNowDate();
+        for (PointSignReward reward : rewards) {
+            reward.setCreateTime(now);
+        }
+        
+        // 批量插入
+        pointSignRewardMapper.batchInsertPointSignReward(rewards);
+    }
+}

+ 56 - 0
nightFragrance-massage/src/main/java/com/ylx/point/service/impl/PointSignTaskServiceImpl.java

@@ -0,0 +1,56 @@
+package com.ylx.point.service.impl;
+
+import java.util.List;
+
+import cn.hutool.core.util.ObjectUtil;
+import com.ylx.common.utils.DateUtils;
+import com.ylx.point.domain.vo.PointSignTaskVo;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import com.ylx.point.mapper.PointSignTaskMapper;
+import com.ylx.point.domain.PointSignTask;
+import com.ylx.point.service.IPointSignTaskService;
+import org.springframework.transaction.annotation.Transactional;
+
+/**
+ * 积分签到任务规则Service业务层处理
+ *
+ * @author wzj
+ * @date 2026-03-25
+ */
+@Service
+public class PointSignTaskServiceImpl implements IPointSignTaskService {
+    @Autowired
+    private PointSignTaskMapper pointSignTaskMapper;
+
+    /**
+     * 新增积分签到任务规则
+     *
+     * @param pointSignTask 积分签到任务规则
+     * @return 结果
+     */
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public int insertPointSignTask(PointSignTask pointSignTask) {
+        pointSignTask.setCreateTime(DateUtils.getNowDate());
+        return pointSignTaskMapper.insertPointSignTask(pointSignTask);
+    }
+
+    /**
+     * 删除积分签到任务规则信息
+     *
+     * @param id 积分签到任务规则主键
+     * @return 结果
+     */
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public int deletePointSignTaskById(String id) {
+        return pointSignTaskMapper.deletePointSignTaskById(id);
+    }
+
+    @Override
+    public PointSignTaskVo selectPointSignTaskByActivityId(Long id) {
+        PointSignTaskVo vo = pointSignTaskMapper.getTaskWithRewards(id);
+        return ObjectUtil.isNull(vo) ? new PointSignTaskVo() : vo;
+    }
+}

+ 96 - 0
nightFragrance-massage/src/main/java/com/ylx/point/service/impl/PointUserActivityTaskCompletionServiceImpl.java

@@ -0,0 +1,96 @@
+package com.ylx.point.service.impl;
+
+import java.util.List;
+import com.ylx.common.utils.DateUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import com.ylx.point.mapper.PointUserActivityTaskCompletionMapper;
+import com.ylx.point.domain.PointUserActivityTaskCompletion;
+import com.ylx.point.service.IPointUserActivityTaskCompletionService;
+
+/**
+ * 用户活动任务完成Service业务层处理
+ *
+ * @author wzj
+ * @date 2026-03-25
+ */
+@Service
+public class PointUserActivityTaskCompletionServiceImpl implements IPointUserActivityTaskCompletionService
+{
+    @Autowired
+    private PointUserActivityTaskCompletionMapper pointUserActivityTaskCompletionMapper;
+
+    /**
+     * 查询用户活动任务完成
+     *
+     * @param id 用户活动任务完成主键
+     * @return 用户活动任务完成
+     */
+    @Override
+    public PointUserActivityTaskCompletion selectPointUserActivityTaskCompletionById(String id)
+    {
+        return pointUserActivityTaskCompletionMapper.selectPointUserActivityTaskCompletionById(id);
+    }
+
+    /**
+     * 查询用户活动任务完成列表
+     *
+     * @param pointUserActivityTaskCompletion 用户活动任务完成
+     * @return 用户活动任务完成
+     */
+    @Override
+    public List<PointUserActivityTaskCompletion> selectPointUserActivityTaskCompletionList(PointUserActivityTaskCompletion pointUserActivityTaskCompletion)
+    {
+        return pointUserActivityTaskCompletionMapper.selectPointUserActivityTaskCompletionList(pointUserActivityTaskCompletion);
+    }
+
+    /**
+     * 新增用户活动任务完成
+     *
+     * @param pointUserActivityTaskCompletion 用户活动任务完成
+     * @return 结果
+     */
+    @Override
+    public int insertPointUserActivityTaskCompletion(PointUserActivityTaskCompletion pointUserActivityTaskCompletion)
+    {
+        pointUserActivityTaskCompletion.setCreateTime(DateUtils.getNowDate());
+        return pointUserActivityTaskCompletionMapper.insertPointUserActivityTaskCompletion(pointUserActivityTaskCompletion);
+    }
+
+    /**
+     * 修改用户活动任务完成
+     *
+     * @param pointUserActivityTaskCompletion 用户活动任务完成
+     * @return 结果
+     */
+    @Override
+    public int updatePointUserActivityTaskCompletion(PointUserActivityTaskCompletion pointUserActivityTaskCompletion)
+    {
+        pointUserActivityTaskCompletion.setUpdateTime(DateUtils.getNowDate());
+        return pointUserActivityTaskCompletionMapper.updatePointUserActivityTaskCompletion(pointUserActivityTaskCompletion);
+    }
+
+    /**
+     * 批量删除用户活动任务完成
+     *
+     * @param ids 需要删除的用户活动任务完成主键
+     * @return 结果
+     */
+    @Override
+    public int deletePointUserActivityTaskCompletionByIds(String[] ids)
+    {
+        return pointUserActivityTaskCompletionMapper.deletePointUserActivityTaskCompletionByIds(ids);
+    }
+
+    /**
+     * 删除用户活动任务完成信息
+     *
+     * @param id 用户活动任务完成主键
+     * @return 结果
+     */
+    @Override
+    public int deletePointUserActivityTaskCompletionById(String id)
+    {
+        return pointUserActivityTaskCompletionMapper.deletePointUserActivityTaskCompletionById(id);
+    }
+}

+ 95 - 0
nightFragrance-massage/src/main/java/com/ylx/point/service/impl/PointUserLogServiceImpl.java

@@ -0,0 +1,95 @@
+package com.ylx.point.service.impl;
+
+import java.util.List;
+import com.ylx.common.utils.DateUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import com.ylx.point.mapper.PointUserLogMapper;
+import com.ylx.point.domain.PointUserLog;
+import com.ylx.point.service.IPointUserLogService;
+
+/**
+ * 用户积分流水Service业务层处理
+ *
+ * @author wzj
+ * @date 2026-03-25
+ */
+@Service
+public class PointUserLogServiceImpl implements IPointUserLogService
+{
+    @Autowired
+    private PointUserLogMapper pointUserLogMapper;
+
+    /**
+     * 查询用户积分流水
+     *
+     * @param id 用户积分流水主键
+     * @return 用户积分流水
+     */
+    @Override
+    public PointUserLog selectPointUserLogById(String id)
+    {
+        return pointUserLogMapper.selectPointUserLogById(id);
+    }
+
+    /**
+     * 查询用户积分流水列表
+     *
+     * @param pointUserLog 用户积分流水
+     * @return 用户积分流水
+     */
+    @Override
+    public List<PointUserLog> selectPointUserLogList(PointUserLog pointUserLog)
+    {
+        return pointUserLogMapper.selectPointUserLogList(pointUserLog);
+    }
+
+    /**
+     * 新增用户积分流水
+     *
+     * @param pointUserLog 用户积分流水
+     * @return 结果
+     */
+    @Override
+    public int insertPointUserLog(PointUserLog pointUserLog)
+    {
+        pointUserLog.setCreateTime(DateUtils.getNowDate());
+        return pointUserLogMapper.insertPointUserLog(pointUserLog);
+    }
+
+    /**
+     * 修改用户积分流水
+     *
+     * @param pointUserLog 用户积分流水
+     * @return 结果
+     */
+    @Override
+    public int updatePointUserLog(PointUserLog pointUserLog)
+    {
+        return pointUserLogMapper.updatePointUserLog(pointUserLog);
+    }
+
+    /**
+     * 批量删除用户积分流水
+     *
+     * @param ids 需要删除的用户积分流水主键
+     * @return 结果
+     */
+    @Override
+    public int deletePointUserLogByIds(String[] ids)
+    {
+        return pointUserLogMapper.deletePointUserLogByIds(ids);
+    }
+
+    /**
+     * 删除用户积分流水信息
+     *
+     * @param id 用户积分流水主键
+     * @return 结果
+     */
+    @Override
+    public int deletePointUserLogById(String id)
+    {
+        return pointUserLogMapper.deletePointUserLogById(id);
+    }
+}

+ 95 - 0
nightFragrance-massage/src/main/java/com/ylx/point/service/impl/PointUserSignLogServiceImpl.java

@@ -0,0 +1,95 @@
+package com.ylx.point.service.impl;
+
+import java.util.List;
+import com.ylx.common.utils.DateUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import com.ylx.point.mapper.PointUserSignLogMapper;
+import com.ylx.point.domain.PointUserSignLog;
+import com.ylx.point.service.IPointUserSignLogService;
+
+/**
+ * 用户签到记录Service业务层处理
+ *
+ * @author wzj
+ * @date 2026-03-25
+ */
+@Service
+public class PointUserSignLogServiceImpl implements IPointUserSignLogService
+{
+    @Autowired
+    private PointUserSignLogMapper pointUserSignLogMapper;
+
+    /**
+     * 查询用户签到记录
+     *
+     * @param id 用户签到记录主键
+     * @return 用户签到记录
+     */
+    @Override
+    public PointUserSignLog selectPointUserSignLogById(String id)
+    {
+        return pointUserSignLogMapper.selectPointUserSignLogById(id);
+    }
+
+    /**
+     * 查询用户签到记录列表
+     *
+     * @param pointUserSignLog 用户签到记录
+     * @return 用户签到记录
+     */
+    @Override
+    public List<PointUserSignLog> selectPointUserSignLogList(PointUserSignLog pointUserSignLog)
+    {
+        return pointUserSignLogMapper.selectPointUserSignLogList(pointUserSignLog);
+    }
+
+    /**
+     * 新增用户签到记录
+     *
+     * @param pointUserSignLog 用户签到记录
+     * @return 结果
+     */
+    @Override
+    public int insertPointUserSignLog(PointUserSignLog pointUserSignLog)
+    {
+        pointUserSignLog.setCreateTime(DateUtils.getNowDate());
+        return pointUserSignLogMapper.insertPointUserSignLog(pointUserSignLog);
+    }
+
+    /**
+     * 修改用户签到记录
+     *
+     * @param pointUserSignLog 用户签到记录
+     * @return 结果
+     */
+    @Override
+    public int updatePointUserSignLog(PointUserSignLog pointUserSignLog)
+    {
+        return pointUserSignLogMapper.updatePointUserSignLog(pointUserSignLog);
+    }
+
+    /**
+     * 批量删除用户签到记录
+     *
+     * @param ids 需要删除的用户签到记录主键
+     * @return 结果
+     */
+    @Override
+    public int deletePointUserSignLogByIds(String[] ids)
+    {
+        return pointUserSignLogMapper.deletePointUserSignLogByIds(ids);
+    }
+
+    /**
+     * 删除用户签到记录信息
+     *
+     * @param id 用户签到记录主键
+     * @return 结果
+     */
+    @Override
+    public int deletePointUserSignLogById(String id)
+    {
+        return pointUserSignLogMapper.deletePointUserSignLogById(id);
+    }
+}

+ 95 - 0
nightFragrance-massage/src/main/java/com/ylx/point/service/impl/PointUserSignStatusServiceImpl.java

@@ -0,0 +1,95 @@
+package com.ylx.point.service.impl;
+
+import java.util.List;
+import com.ylx.common.utils.DateUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import com.ylx.point.mapper.PointUserSignStatusMapper;
+import com.ylx.point.domain.PointUserSignStatus;
+import com.ylx.point.service.IPointUserSignStatusService;
+
+/**
+ * 用户签到状态快照Service业务层处理
+ *
+ * @author wzj
+ * @date 2026-03-25
+ */
+@Service
+public class PointUserSignStatusServiceImpl implements IPointUserSignStatusService
+{
+    @Autowired
+    private PointUserSignStatusMapper pointUserSignStatusMapper;
+
+    /**
+     * 查询用户签到状态快照
+     *
+     * @param id 用户签到状态快照主键
+     * @return 用户签到状态快照
+     */
+    @Override
+    public PointUserSignStatus selectPointUserSignStatusById(String id)
+    {
+        return pointUserSignStatusMapper.selectPointUserSignStatusById(id);
+    }
+
+    /**
+     * 查询用户签到状态快照列表
+     *
+     * @param pointUserSignStatus 用户签到状态快照
+     * @return 用户签到状态快照
+     */
+    @Override
+    public List<PointUserSignStatus> selectPointUserSignStatusList(PointUserSignStatus pointUserSignStatus)
+    {
+        return pointUserSignStatusMapper.selectPointUserSignStatusList(pointUserSignStatus);
+    }
+
+    /**
+     * 新增用户签到状态快照
+     *
+     * @param pointUserSignStatus 用户签到状态快照
+     * @return 结果
+     */
+    @Override
+    public int insertPointUserSignStatus(PointUserSignStatus pointUserSignStatus)
+    {
+        return pointUserSignStatusMapper.insertPointUserSignStatus(pointUserSignStatus);
+    }
+
+    /**
+     * 修改用户签到状态快照
+     *
+     * @param pointUserSignStatus 用户签到状态快照
+     * @return 结果
+     */
+    @Override
+    public int updatePointUserSignStatus(PointUserSignStatus pointUserSignStatus)
+    {
+        pointUserSignStatus.setUpdateTime(DateUtils.getNowDate());
+        return pointUserSignStatusMapper.updatePointUserSignStatus(pointUserSignStatus);
+    }
+
+    /**
+     * 批量删除用户签到状态快照
+     *
+     * @param ids 需要删除的用户签到状态快照主键
+     * @return 结果
+     */
+    @Override
+    public int deletePointUserSignStatusByIds(String[] ids)
+    {
+        return pointUserSignStatusMapper.deletePointUserSignStatusByIds(ids);
+    }
+
+    /**
+     * 删除用户签到状态快照信息
+     *
+     * @param id 用户签到状态快照主键
+     * @return 结果
+     */
+    @Override
+    public int deletePointUserSignStatusById(String id)
+    {
+        return pointUserSignStatusMapper.deletePointUserSignStatusById(id);
+    }
+}

+ 127 - 0
nightFragrance-massage/src/main/resources/mapper/point/PointActivityMapper.xml

@@ -0,0 +1,127 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.ylx.point.mapper.PointActivityMapper">
+    
+    <resultMap type="PointActivity" id="PointActivityResult">
+        <result property="id"    column="id"    />
+        <result property="name"    column="name"    />
+        <result property="description"    column="description"    />
+        <result property="activityType"    column="activity_type"    />
+        <result property="cityCode"    column="city_code"    />
+        <result property="startTime"    column="start_time"    />
+        <result property="endTime"    column="end_time"    />
+        <result property="isPermanent"    column="is_permanent"    />
+        <result property="expirePolicy"    column="expire_policy"    />
+        <result property="expireDays"    column="expire_days"    />
+        <result property="expireYear"    column="expire_year"    />
+        <result property="status"    column="status"    />
+        <result property="sortOrder"    column="sort_order"    />
+        <result property="createBy"    column="create_by"    />
+        <result property="createTime"    column="create_time"    />
+        <result property="updateBy"    column="update_by"    />
+        <result property="updateTime"    column="update_time"    />
+    </resultMap>
+
+    <sql id="selectPointActivityVo">
+        select id, name, description, activity_type, city_code, start_time, end_time, is_permanent, expire_policy, expire_days, expire_year, status, sort_order, create_by, create_time, update_by, update_time from point_activity
+    </sql>
+
+    <select id="selectPointActivityList" parameterType="PointActivity" resultMap="PointActivityResult">
+        <include refid="selectPointActivityVo"/>
+        <where>  
+            <if test="name != null  and name != ''"> and name like concat('%', #{name}, '%')</if>
+            <if test="description != null  and description != ''"> and description = #{description}</if>
+            <if test="activityType != null "> and activity_type = #{activityType}</if>
+            <if test="cityCode != null  and cityCode != ''"> and city_code = #{cityCode}</if>
+            <if test="startTime != null "> and start_time = #{startTime}</if>
+            <if test="endTime != null "> and end_time = #{endTime}</if>
+            <if test="isPermanent != null "> and is_permanent = #{isPermanent}</if>
+            <if test="expirePolicy != null "> and expire_policy = #{expirePolicy}</if>
+            <if test="expireDays != null "> and expire_days = #{expireDays}</if>
+            <if test="expireYear != null  and expireYear != ''"> and expire_year = #{expireYear}</if>
+            <if test="status != null "> and status = #{status}</if>
+            <if test="sortOrder != null "> and sort_order = #{sortOrder}</if>
+        </where>
+    </select>
+    
+    <select id="selectPointActivityById" parameterType="Long" resultMap="PointActivityResult">
+        <include refid="selectPointActivityVo"/>
+        where id = #{id}
+    </select>
+        
+    <insert id="insertPointActivity" parameterType="PointActivity" useGeneratedKeys="true" keyProperty="id">
+        insert into point_activity
+        <trim prefix="(" suffix=")" suffixOverrides=",">
+            <if test="name != null and name != ''">name,</if>
+            <if test="description != null">description,</if>
+            <if test="activityType != null">activity_type,</if>
+            <if test="cityCode != null">city_code,</if>
+            <if test="startTime != null">start_time,</if>
+            <if test="endTime != null">end_time,</if>
+            <if test="isPermanent != null">is_permanent,</if>
+            <if test="expirePolicy != null">expire_policy,</if>
+            <if test="expireDays != null">expire_days,</if>
+            <if test="expireYear != null">expire_year,</if>
+            <if test="status != null">status,</if>
+            <if test="sortOrder != null">sort_order,</if>
+            <if test="createBy != null">create_by,</if>
+            <if test="createTime != null">create_time,</if>
+            <if test="updateBy != null">update_by,</if>
+            <if test="updateTime != null">update_time,</if>
+         </trim>
+        <trim prefix="values (" suffix=")" suffixOverrides=",">
+            <if test="name != null and name != ''">#{name},</if>
+            <if test="description != null">#{description},</if>
+            <if test="activityType != null">#{activityType},</if>
+            <if test="cityCode != null">#{cityCode},</if>
+            <if test="startTime != null">#{startTime,jdbcType=TIMESTAMP},</if>
+            <if test="endTime != null">#{endTime,jdbcType=TIMESTAMP},</if>
+            <if test="isPermanent != null">#{isPermanent},</if>
+            <if test="expirePolicy != null">#{expirePolicy},</if>
+            <if test="expireDays != null">#{expireDays},</if>
+            <if test="expireYear != null">#{expireYear},</if>
+            <if test="status != null">#{status},</if>
+            <if test="sortOrder != null">#{sortOrder},</if>
+            <if test="createBy != null">#{createBy},</if>
+            <if test="createTime != null">#{createTime,jdbcType=TIMESTAMP},</if>
+            <if test="updateBy != null">#{updateBy},</if>
+            <if test="updateTime != null">#{updateTime,jdbcType=TIMESTAMP},</if>
+         </trim>
+    </insert>
+
+    <update id="updatePointActivity" parameterType="PointActivity">
+        update point_activity
+        <trim prefix="SET" suffixOverrides=",">
+            <if test="name != null and name != ''">name = #{name},</if>
+            <if test="description != null">description = #{description},</if>
+            <if test="activityType != null">activity_type = #{activityType},</if>
+            <if test="cityCode != null">city_code = #{cityCode},</if>
+            <if test="startTime != null">start_time = #{startTime},</if>
+            <if test="endTime != null">end_time = #{endTime},</if>
+            <if test="isPermanent != null">is_permanent = #{isPermanent},</if>
+            <if test="expirePolicy != null">expire_policy = #{expirePolicy},</if>
+            <if test="expireDays != null">expire_days = #{expireDays},</if>
+            <if test="expireYear != null">expire_year = #{expireYear},</if>
+            <if test="status != null">status = #{status},</if>
+            <if test="sortOrder != null">sort_order = #{sortOrder},</if>
+            <if test="createBy != null">create_by = #{createBy},</if>
+            <if test="createTime != null">create_time = #{createTime},</if>
+            <if test="updateBy != null">update_by = #{updateBy},</if>
+            <if test="updateTime != null">update_time = #{updateTime},</if>
+        </trim>
+        where id = #{id}
+    </update>
+
+    <delete id="deletePointActivityById" parameterType="String">
+        delete from point_activity where id = #{id}
+    </delete>
+
+    <delete id="deletePointActivityByIds" parameterType="String">
+        delete from point_activity where id in 
+        <foreach item="id" collection="array" open="(" separator="," close=")">
+            #{id}
+        </foreach>
+    </delete>
+</mapper>

+ 116 - 0
nightFragrance-massage/src/main/resources/mapper/point/PointActivityTaskMapper.xml

@@ -0,0 +1,116 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.ylx.point.mapper.PointActivityTaskMapper">
+    
+    <resultMap type="PointActivityTask" id="PointActivityTaskResult">
+        <result property="id"    column="id"    />
+        <result property="activityId"    column="activity_id"    />
+        <result property="taskName"    column="task_name"    />
+        <result property="taskValue"    column="task_value"    />
+        <result property="triggerName"    column="trigger_name"    />
+        <result property="triggerValue"    column="trigger_value"    />
+        <result property="rewardPoints"    column="reward_points"    />
+        <result property="frequencyLimitName"    column="frequency_limit_name"    />
+        <result property="frequencyLimitValue"    column="frequency_limit_value"    />
+        <result property="sortOrder"    column="sort_order"    />
+        <result property="isDeleted"    column="is_deleted"    />
+        <result property="createTime"    column="create_time"    />
+        <result property="updateTime"    column="update_time"    />
+    </resultMap>
+
+    <sql id="selectPointActivityTaskVo">
+        select id, activity_id, task_name, task_value, trigger_name, trigger_value, reward_points, frequency_limit_name, frequency_limit_value, sort_order, is_deleted, create_time, update_time from point_activity_task
+    </sql>
+
+    <select id="selectPointActivityTaskList" parameterType="PointActivityTask" resultMap="PointActivityTaskResult">
+        <include refid="selectPointActivityTaskVo"/>
+        <where>  
+            <if test="activityId != null "> and activity_id = #{activityId}</if>
+            <if test="taskName != null  and taskName != ''"> and task_name like concat('%', #{taskName}, '%')</if>
+            <if test="taskValue != null  and taskValue != ''"> and task_value = #{taskValue}</if>
+            <if test="triggerName != null  and triggerName != ''"> and trigger_name like concat('%', #{triggerName}, '%')</if>
+            <if test="triggerValue != null  and triggerValue != ''"> and trigger_value = #{triggerValue}</if>
+            <if test="rewardPoints != null "> and reward_points = #{rewardPoints}</if>
+            <if test="frequencyLimitName != null  and frequencyLimitName != ''"> and frequency_limit_name like concat('%', #{frequencyLimitName}, '%')</if>
+            <if test="frequencyLimitValue != null  and frequencyLimitValue != ''"> and frequency_limit_value = #{frequencyLimitValue}</if>
+            <if test="sortOrder != null "> and sort_order = #{sortOrder}</if>
+            <if test="isDeleted != null "> and is_deleted = #{isDeleted}</if>
+        </where>
+    </select>
+    
+    <select id="selectPointActivityTaskById" parameterType="String" resultMap="PointActivityTaskResult">
+        <include refid="selectPointActivityTaskVo"/>
+        where id = #{id}
+    </select>
+        
+    <insert id="insertPointActivityTask" parameterType="PointActivityTask" useGeneratedKeys="true" keyProperty="id">
+        insert into point_activity_task
+        <trim prefix="(" suffix=")" suffixOverrides=",">
+            <if test="activityId != null">activity_id,</if>
+            <if test="taskName != null and taskName != ''">task_name,</if>
+            <if test="taskValue != null and taskValue != ''">task_value,</if>
+            <if test="triggerName != null and triggerName != ''">trigger_name,</if>
+            <if test="triggerValue != null and triggerValue != ''">trigger_value,</if>
+            <if test="rewardPoints != null">reward_points,</if>
+            <if test="frequencyLimitName != null and frequencyLimitName != ''">frequency_limit_name,</if>
+            <if test="frequencyLimitValue != null and frequencyLimitValue != ''">frequency_limit_value,</if>
+            <if test="sortOrder != null">sort_order,</if>
+            <if test="isDeleted != null">is_deleted,</if>
+            <if test="createTime != null">create_time,</if>
+            <if test="updateTime != null">update_time,</if>
+         </trim>
+        <trim prefix="values (" suffix=")" suffixOverrides=",">
+            <if test="activityId != null">#{activityId},</if>
+            <if test="taskName != null and taskName != ''">#{taskName},</if>
+            <if test="taskValue != null and taskValue != ''">#{taskValue},</if>
+            <if test="triggerName != null and triggerName != ''">#{triggerName},</if>
+            <if test="triggerValue != null and triggerValue != ''">#{triggerValue},</if>
+            <if test="rewardPoints != null">#{rewardPoints},</if>
+            <if test="frequencyLimitName != null and frequencyLimitName != ''">#{frequencyLimitName},</if>
+            <if test="frequencyLimitValue != null and frequencyLimitValue != ''">#{frequencyLimitValue},</if>
+            <if test="sortOrder != null">#{sortOrder},</if>
+            <if test="isDeleted != null">#{isDeleted},</if>
+            <if test="createTime != null">#{createTime},</if>
+            <if test="updateTime != null">#{updateTime},</if>
+         </trim>
+    </insert>
+    <insert id="batchInsertPointActivityTask">
+        insert into point_activity_task (activity_id, task_name, task_value, trigger_name, trigger_value, reward_points, frequency_limit_name, frequency_limit_value, sort_order, is_deleted, create_time, update_time)
+        values
+        <foreach collection="list" item="item" separator=",">
+            (#{item.activityId}, #{item.taskName}, #{item.taskValue},#{item.triggerName}, #{item.triggerValue}, #{item.rewardPoints}, #{item.frequencyLimitName}, #{item.frequencyLimitValue}, #{item.sortOrder}, #{item.isDeleted}, #{item.createTime}, #{item.updateTime})
+        </foreach>
+    </insert>
+
+    <update id="updatePointActivityTask" parameterType="PointActivityTask">
+        update point_activity_task
+        <trim prefix="SET" suffixOverrides=",">
+            <if test="activityId != null">activity_id = #{activityId},</if>
+            <if test="taskName != null and taskName != ''">task_name = #{taskName},</if>
+            <if test="taskValue != null and taskValue != ''">task_value = #{taskValue},</if>
+            <if test="triggerName != null and triggerName != ''">trigger_name = #{triggerName},</if>
+            <if test="triggerValue != null and triggerValue != ''">trigger_value = #{triggerValue},</if>
+            <if test="rewardPoints != null">reward_points = #{rewardPoints},</if>
+            <if test="frequencyLimitName != null and frequencyLimitName != ''">frequency_limit_name = #{frequencyLimitName},</if>
+            <if test="frequencyLimitValue != null and frequencyLimitValue != ''">frequency_limit_value = #{frequencyLimitValue},</if>
+            <if test="sortOrder != null">sort_order = #{sortOrder},</if>
+            <if test="isDeleted != null">is_deleted = #{isDeleted},</if>
+            <if test="createTime != null">create_time = #{createTime},</if>
+            <if test="updateTime != null">update_time = #{updateTime},</if>
+        </trim>
+        where id = #{id}
+    </update>
+
+    <delete id="deletePointActivityTaskById" parameterType="String">
+        delete from point_activity_task where id = #{id}
+    </delete>
+
+    <select id="selectPointActivityTaskByActivityId" resultMap="PointActivityTaskResult">
+        <include refid="selectPointActivityTaskVo"/>
+        where activity_id = #{activityId} and is_deleted = 0
+        order by sort_order
+    </select>
+
+</mapper>

+ 92 - 0
nightFragrance-massage/src/main/resources/mapper/point/PointSignRewardMapper.xml

@@ -0,0 +1,92 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.ylx.point.mapper.PointSignRewardMapper">
+    
+    <resultMap type="PointSignReward" id="PointSignRewardResult">
+        <result property="id"    column="id"    />
+        <result property="signTaskId"    column="sign_task_id"    />
+        <result property="continueDays"    column="continue_days"    />
+        <result property="rewardPoints"    column="reward_points"    />
+        <result property="sortOrder"    column="sort_order"    />
+        <result property="isDeleted"    column="is_deleted"    />
+        <result property="createTime"    column="create_time"    />
+        <result property="updateTime"    column="update_time"    />
+    </resultMap>
+
+    <sql id="selectPointSignRewardVo">
+        select id, sign_task_id, continue_days, reward_points, sort_order, is_deleted, create_time, update_time from point_sign_reward
+    </sql>
+
+    <select id="selectPointSignRewardList" parameterType="PointSignReward" resultMap="PointSignRewardResult">
+        <include refid="selectPointSignRewardVo"/>
+        <where>  
+            <if test="signTaskId != null  and signTaskId != ''"> and sign_task_id = #{signTaskId}</if>
+            <if test="continueDays != null "> and continue_days = #{continueDays}</if>
+            <if test="rewardPoints != null "> and reward_points = #{rewardPoints}</if>
+            <if test="sortOrder != null "> and sort_order = #{sortOrder}</if>
+            <if test="isDeleted != null "> and is_deleted = #{isDeleted}</if>
+        </where>
+    </select>
+    
+    <select id="selectPointSignRewardById" parameterType="String" resultMap="PointSignRewardResult">
+        <include refid="selectPointSignRewardVo"/>
+        where id = #{id}
+    </select>
+        
+    <insert id="insertPointSignReward" parameterType="PointSignReward" useGeneratedKeys="true" keyProperty="id">
+        insert into point_sign_reward
+        <trim prefix="(" suffix=")" suffixOverrides=",">
+            <if test="signTaskId != null and signTaskId != ''">sign_task_id,</if>
+            <if test="continueDays != null">continue_days,</if>
+            <if test="rewardPoints != null">reward_points,</if>
+            <if test="sortOrder != null">sort_order,</if>
+            <if test="isDeleted != null">is_deleted,</if>
+            <if test="createTime != null">create_time,</if>
+            <if test="updateTime != null">update_time,</if>
+         </trim>
+        <trim prefix="values (" suffix=")" suffixOverrides=",">
+            <if test="signTaskId != null and signTaskId != ''">#{signTaskId},</if>
+            <if test="continueDays != null">#{continueDays},</if>
+            <if test="rewardPoints != null">#{rewardPoints},</if>
+            <if test="sortOrder != null">#{sortOrder},</if>
+            <if test="isDeleted != null">#{isDeleted},</if>
+            <if test="createTime != null">#{createTime},</if>
+            <if test="updateTime != null">#{updateTime},</if>
+         </trim>
+    </insert>
+
+    <update id="updatePointSignReward" parameterType="PointSignReward">
+        update point_sign_reward
+        <trim prefix="SET" suffixOverrides=",">
+            <if test="signTaskId != null and signTaskId != ''">sign_task_id = #{signTaskId},</if>
+            <if test="continueDays != null">continue_days = #{continueDays},</if>
+            <if test="rewardPoints != null">reward_points = #{rewardPoints},</if>
+            <if test="sortOrder != null">sort_order = #{sortOrder},</if>
+            <if test="isDeleted != null">is_deleted = #{isDeleted},</if>
+            <if test="createTime != null">create_time = #{createTime},</if>
+            <if test="updateTime != null">update_time = #{updateTime},</if>
+        </trim>
+        where id = #{id}
+    </update>
+
+    <delete id="deletePointSignRewardById" parameterType="String">
+        delete from point_sign_reward where id = #{id}
+    </delete>
+
+    <delete id="deletePointSignRewardByIds" parameterType="String">
+        delete from point_sign_reward where id in 
+        <foreach item="id" collection="array" open="(" separator="," close=")">
+            #{id}
+        </foreach>
+    </delete>
+
+    <insert id="batchInsertPointSignReward" parameterType="java.util.List">
+        insert into point_sign_reward (sign_task_id, continue_days, reward_points, sort_order, is_deleted, create_time, update_time)
+        values
+        <foreach collection="list" item="item" separator=",">
+            (#{item.signTaskId}, #{item.continueDays}, #{item.rewardPoints}, #{item.sortOrder}, #{item.isDeleted}, #{item.createTime}, #{item.updateTime})
+        </foreach>
+    </insert>
+</mapper>

+ 68 - 0
nightFragrance-massage/src/main/resources/mapper/point/PointSignTaskMapper.xml

@@ -0,0 +1,68 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.ylx.point.mapper.PointSignTaskMapper">
+    
+    <resultMap type="PointSignTask" id="PointSignTaskResult">
+        <result property="id"    column="id"    />
+        <result property="activityId"    column="activity_id"    />
+        <result property="basePoints"    column="base_points"    />
+        <result property="breakRule"    column="break_rule"    />
+        <result property="isDeleted"    column="is_deleted"    />
+        <result property="createTime"    column="create_time"    />
+        <result property="updateTime"    column="update_time"    />
+    </resultMap>
+
+    <resultMap id="PointSignTaskMap" type="com.ylx.point.domain.vo.PointSignTaskVo">
+        <result column="base_points" property="basePoints"/>
+        <result column="break_rule" property="breakRule"/>
+        <!-- 关联奖励列表 -->
+        <collection property="signRewardList" ofType="com.ylx.point.domain.dto.PointSignRewardDTO">
+            <result column="continue_days" property="continueDays"/>
+            <result column="reward_points" property="rewardPoints"/>
+        </collection>
+    </resultMap>
+
+    <sql id="selectPointSignTaskVo">
+        select id, activity_id, base_points, break_rule, is_deleted, create_time, update_time from point_sign_task
+    </sql>
+
+    <delete id="deletePointSignTaskById" parameterType="String">
+        delete from point_sign_task where id = #{id}
+    </delete>
+
+    <select id="getTaskWithRewards" resultMap="PointSignTaskMap">
+        SELECT
+            t.base_points,
+            t.break_rule,
+            r.reward_points,
+            r.continue_days
+        FROM point_sign_task t
+        LEFT JOIN point_sign_reward r ON t.id = r.sign_task_id AND r.is_deleted = 0
+        WHERE
+            t.activity_id = #{activityId}
+          AND t.is_deleted = 0
+    </select>
+
+    <insert id="insertPointSignTask" parameterType="PointSignTask" useGeneratedKeys="true" keyProperty="id">
+        insert into point_sign_task
+        <trim prefix="(" suffix=")" suffixOverrides=",">
+            <if test="activityId != null">activity_id,</if>
+            <if test="basePoints != null">base_points,</if>
+            <if test="breakRule != null">break_rule,</if>
+            <if test="isDeleted != null">is_deleted,</if>
+            <if test="createTime != null">create_time,</if>
+            <if test="updateTime != null">update_time,</if>
+        </trim>
+        <trim prefix="values (" suffix=")" suffixOverrides=",">
+            <if test="activityId != null">#{activityId},</if>
+            <if test="basePoints != null">#{basePoints},</if>
+            <if test="breakRule != null">#{breakRule},</if>
+            <if test="isDeleted != null">#{isDeleted},</if>
+            <if test="createTime != null">#{createTime},</if>
+            <if test="updateTime != null">#{updateTime},</if>
+        </trim>
+    </insert>
+
+</mapper>

+ 94 - 0
nightFragrance-massage/src/main/resources/mapper/point/PointUserActivityTaskCompletionMapper.xml

@@ -0,0 +1,94 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.ylx.point.mapper.PointUserActivityTaskCompletionMapper">
+    
+    <resultMap type="PointUserActivityTaskCompletion" id="PointUserActivityTaskCompletionResult">
+        <result property="id"    column="id"    />
+        <result property="activityId"    column="activity_id"    />
+        <result property="taskId"    column="task_id"    />
+        <result property="taskType"    column="task_type"    />
+        <result property="userId"    column="user_id"    />
+        <result property="completedCount"    column="completed_count"    />
+        <result property="lastCompletedTime"    column="last_completed_time"    />
+        <result property="createTime"    column="create_time"    />
+        <result property="updateTime"    column="update_time"    />
+        <result property="completedDate"    column="completed_date"    />
+    </resultMap>
+
+    <sql id="selectPointUserActivityTaskCompletionVo">
+        select id, activity_id, task_id, task_type, user_id, completed_count, last_completed_time, create_time, update_time, completed_date from point_user_activity_task_completion
+    </sql>
+
+    <select id="selectPointUserActivityTaskCompletionList" parameterType="PointUserActivityTaskCompletion" resultMap="PointUserActivityTaskCompletionResult">
+        <include refid="selectPointUserActivityTaskCompletionVo"/>
+        <where>  
+            <if test="activityId != null "> and activity_id = #{activityId}</if>
+            <if test="taskId != null "> and task_id = #{taskId}</if>
+            <if test="taskType != null "> and task_type = #{taskType}</if>
+            <if test="userId != null "> and user_id = #{userId}</if>
+            <if test="completedCount != null "> and completed_count = #{completedCount}</if>
+            <if test="lastCompletedTime != null "> and last_completed_time = #{lastCompletedTime}</if>
+            <if test="completedDate != null "> and completed_date = #{completedDate}</if>
+        </where>
+    </select>
+    
+    <select id="selectPointUserActivityTaskCompletionById" parameterType="String" resultMap="PointUserActivityTaskCompletionResult">
+        <include refid="selectPointUserActivityTaskCompletionVo"/>
+        where id = #{id}
+    </select>
+        
+    <insert id="insertPointUserActivityTaskCompletion" parameterType="PointUserActivityTaskCompletion" useGeneratedKeys="true" keyProperty="id">
+        insert into point_user_activity_task_completion
+        <trim prefix="(" suffix=")" suffixOverrides=",">
+            <if test="activityId != null">activity_id,</if>
+            <if test="taskId != null">task_id,</if>
+            <if test="taskType != null">task_type,</if>
+            <if test="userId != null">user_id,</if>
+            <if test="completedCount != null">completed_count,</if>
+            <if test="lastCompletedTime != null">last_completed_time,</if>
+            <if test="createTime != null">create_time,</if>
+            <if test="updateTime != null">update_time,</if>
+            <if test="completedDate != null">completed_date,</if>
+         </trim>
+        <trim prefix="values (" suffix=")" suffixOverrides=",">
+            <if test="activityId != null">#{activityId},</if>
+            <if test="taskId != null">#{taskId},</if>
+            <if test="taskType != null">#{taskType},</if>
+            <if test="userId != null">#{userId},</if>
+            <if test="completedCount != null">#{completedCount},</if>
+            <if test="lastCompletedTime != null">#{lastCompletedTime},</if>
+            <if test="createTime != null">#{createTime},</if>
+            <if test="updateTime != null">#{updateTime},</if>
+            <if test="completedDate != null">#{completedDate},</if>
+         </trim>
+    </insert>
+
+    <update id="updatePointUserActivityTaskCompletion" parameterType="PointUserActivityTaskCompletion">
+        update point_user_activity_task_completion
+        <trim prefix="SET" suffixOverrides=",">
+            <if test="activityId != null">activity_id = #{activityId},</if>
+            <if test="taskId != null">task_id = #{taskId},</if>
+            <if test="taskType != null">task_type = #{taskType},</if>
+            <if test="userId != null">user_id = #{userId},</if>
+            <if test="completedCount != null">completed_count = #{completedCount},</if>
+            <if test="lastCompletedTime != null">last_completed_time = #{lastCompletedTime},</if>
+            <if test="createTime != null">create_time = #{createTime},</if>
+            <if test="updateTime != null">update_time = #{updateTime},</if>
+            <if test="completedDate != null">completed_date = #{completedDate},</if>
+        </trim>
+        where id = #{id}
+    </update>
+
+    <delete id="deletePointUserActivityTaskCompletionById" parameterType="String">
+        delete from point_user_activity_task_completion where id = #{id}
+    </delete>
+
+    <delete id="deletePointUserActivityTaskCompletionByIds" parameterType="String">
+        delete from point_user_activity_task_completion where id in 
+        <foreach item="id" collection="array" open="(" separator="," close=")">
+            #{id}
+        </foreach>
+    </delete>
+</mapper>

+ 120 - 0
nightFragrance-massage/src/main/resources/mapper/point/PointUserLogMapper.xml

@@ -0,0 +1,120 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.ylx.point.mapper.PointUserLogMapper">
+    
+    <resultMap type="PointUserLog" id="PointUserLogResult">
+        <result property="id"    column="id"    />
+        <result property="userId"    column="user_id"    />
+        <result property="activityId"    column="activity_id"    />
+        <result property="activityName"    column="activity_name"    />
+        <result property="taskId"    column="task_id"    />
+        <result property="taskType"    column="task_type"    />
+        <result property="points"    column="points"    />
+        <result property="balanceAfter"    column="balance_after"    />
+        <result property="sourceLogId"    column="source_log_id"    />
+        <result property="bizOrderId"    column="biz_order_id"    />
+        <result property="expireTime"    column="expire_time"    />
+        <result property="isExpired"    column="is_expired"    />
+        <result property="createTime"    column="create_time"    />
+        <result property="opType"    column="op_type"    />
+        <result property="month"    column="month"    />
+    </resultMap>
+
+    <sql id="selectPointUserLogVo">
+        select id, user_id, activity_id, activity_name, task_id, task_type, points, balance_after, source_log_id, biz_order_id, expire_time, is_expired, create_time, op_type, month from point_user_log
+    </sql>
+
+    <select id="selectPointUserLogList" parameterType="PointUserLog" resultMap="PointUserLogResult">
+        <include refid="selectPointUserLogVo"/>
+        <where>  
+            <if test="userId != null "> and user_id = #{userId}</if>
+            <if test="activityId != null "> and activity_id = #{activityId}</if>
+            <if test="activityName != null  and activityName != ''"> and activity_name like concat('%', #{activityName}, '%')</if>
+            <if test="taskId != null "> and task_id = #{taskId}</if>
+            <if test="taskType != null "> and task_type = #{taskType}</if>
+            <if test="points != null "> and points = #{points}</if>
+            <if test="balanceAfter != null "> and balance_after = #{balanceAfter}</if>
+            <if test="sourceLogId != null "> and source_log_id = #{sourceLogId}</if>
+            <if test="bizOrderId != null  and bizOrderId != ''"> and biz_order_id = #{bizOrderId}</if>
+            <if test="expireTime != null "> and expire_time = #{expireTime}</if>
+            <if test="isExpired != null "> and is_expired = #{isExpired}</if>
+            <if test="opType != null "> and op_type = #{opType}</if>
+            <if test="month != null  and month != ''"> and month = #{month}</if>
+        </where>
+    </select>
+    
+    <select id="selectPointUserLogById" parameterType="String" resultMap="PointUserLogResult">
+        <include refid="selectPointUserLogVo"/>
+        where id = #{id}
+    </select>
+        
+    <insert id="insertPointUserLog" parameterType="PointUserLog" useGeneratedKeys="true" keyProperty="id">
+        insert into point_user_log
+        <trim prefix="(" suffix=")" suffixOverrides=",">
+            <if test="userId != null">user_id,</if>
+            <if test="activityId != null">activity_id,</if>
+            <if test="activityName != null and activityName != ''">activity_name,</if>
+            <if test="taskId != null">task_id,</if>
+            <if test="taskType != null">task_type,</if>
+            <if test="points != null">points,</if>
+            <if test="balanceAfter != null">balance_after,</if>
+            <if test="sourceLogId != null">source_log_id,</if>
+            <if test="bizOrderId != null">biz_order_id,</if>
+            <if test="expireTime != null">expire_time,</if>
+            <if test="isExpired != null">is_expired,</if>
+            <if test="createTime != null">create_time,</if>
+            <if test="opType != null">op_type,</if>
+            <if test="month != null and month != ''">month,</if>
+         </trim>
+        <trim prefix="values (" suffix=")" suffixOverrides=",">
+            <if test="userId != null">#{userId},</if>
+            <if test="activityId != null">#{activityId},</if>
+            <if test="activityName != null and activityName != ''">#{activityName},</if>
+            <if test="taskId != null">#{taskId},</if>
+            <if test="taskType != null">#{taskType},</if>
+            <if test="points != null">#{points},</if>
+            <if test="balanceAfter != null">#{balanceAfter},</if>
+            <if test="sourceLogId != null">#{sourceLogId},</if>
+            <if test="bizOrderId != null">#{bizOrderId},</if>
+            <if test="expireTime != null">#{expireTime},</if>
+            <if test="isExpired != null">#{isExpired},</if>
+            <if test="createTime != null">#{createTime},</if>
+            <if test="opType != null">#{opType},</if>
+            <if test="month != null and month != ''">#{month},</if>
+         </trim>
+    </insert>
+
+    <update id="updatePointUserLog" parameterType="PointUserLog">
+        update point_user_log
+        <trim prefix="SET" suffixOverrides=",">
+            <if test="userId != null">user_id = #{userId},</if>
+            <if test="activityId != null">activity_id = #{activityId},</if>
+            <if test="activityName != null and activityName != ''">activity_name = #{activityName},</if>
+            <if test="taskId != null">task_id = #{taskId},</if>
+            <if test="taskType != null">task_type = #{taskType},</if>
+            <if test="points != null">points = #{points},</if>
+            <if test="balanceAfter != null">balance_after = #{balanceAfter},</if>
+            <if test="sourceLogId != null">source_log_id = #{sourceLogId},</if>
+            <if test="bizOrderId != null">biz_order_id = #{bizOrderId},</if>
+            <if test="expireTime != null">expire_time = #{expireTime},</if>
+            <if test="isExpired != null">is_expired = #{isExpired},</if>
+            <if test="createTime != null">create_time = #{createTime},</if>
+            <if test="opType != null">op_type = #{opType},</if>
+            <if test="month != null and month != ''">month = #{month},</if>
+        </trim>
+        where id = #{id}
+    </update>
+
+    <delete id="deletePointUserLogById" parameterType="String">
+        delete from point_user_log where id = #{id}
+    </delete>
+
+    <delete id="deletePointUserLogByIds" parameterType="String">
+        delete from point_user_log where id in 
+        <foreach item="id" collection="array" open="(" separator="," close=")">
+            #{id}
+        </foreach>
+    </delete>
+</mapper>

+ 90 - 0
nightFragrance-massage/src/main/resources/mapper/point/PointUserSignLogMapper.xml

@@ -0,0 +1,90 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.ylx.point.mapper.PointUserSignLogMapper">
+    
+    <resultMap type="PointUserSignLog" id="PointUserSignLogResult">
+        <result property="id"    column="id"    />
+        <result property="userId"    column="user_id"    />
+        <result property="activityId"    column="activity_id"    />
+        <result property="taskId"    column="task_id"    />
+        <result property="signDate"    column="sign_date"    />
+        <result property="continuousDays"    column="continuous_days"    />
+        <result property="points"    column="points"    />
+        <result property="isMakeUp"    column="is_make_up"    />
+        <result property="createTime"    column="create_time"    />
+    </resultMap>
+
+    <sql id="selectPointUserSignLogVo">
+        select id, user_id, activity_id, task_id, sign_date, continuous_days, points, is_make_up, create_time from point_user_sign_log
+    </sql>
+
+    <select id="selectPointUserSignLogList" parameterType="PointUserSignLog" resultMap="PointUserSignLogResult">
+        <include refid="selectPointUserSignLogVo"/>
+        <where>  
+            <if test="userId != null "> and user_id = #{userId}</if>
+            <if test="activityId != null "> and activity_id = #{activityId}</if>
+            <if test="taskId != null "> and task_id = #{taskId}</if>
+            <if test="signDate != null "> and sign_date = #{signDate}</if>
+            <if test="continuousDays != null "> and continuous_days = #{continuousDays}</if>
+            <if test="points != null "> and points = #{points}</if>
+            <if test="isMakeUp != null "> and is_make_up = #{isMakeUp}</if>
+        </where>
+    </select>
+    
+    <select id="selectPointUserSignLogById" parameterType="String" resultMap="PointUserSignLogResult">
+        <include refid="selectPointUserSignLogVo"/>
+        where id = #{id}
+    </select>
+        
+    <insert id="insertPointUserSignLog" parameterType="PointUserSignLog" useGeneratedKeys="true" keyProperty="id">
+        insert into point_user_sign_log
+        <trim prefix="(" suffix=")" suffixOverrides=",">
+            <if test="userId != null">user_id,</if>
+            <if test="activityId != null">activity_id,</if>
+            <if test="taskId != null">task_id,</if>
+            <if test="signDate != null">sign_date,</if>
+            <if test="continuousDays != null">continuous_days,</if>
+            <if test="points != null">points,</if>
+            <if test="isMakeUp != null">is_make_up,</if>
+            <if test="createTime != null">create_time,</if>
+         </trim>
+        <trim prefix="values (" suffix=")" suffixOverrides=",">
+            <if test="userId != null">#{userId},</if>
+            <if test="activityId != null">#{activityId},</if>
+            <if test="taskId != null">#{taskId},</if>
+            <if test="signDate != null">#{signDate},</if>
+            <if test="continuousDays != null">#{continuousDays},</if>
+            <if test="points != null">#{points},</if>
+            <if test="isMakeUp != null">#{isMakeUp},</if>
+            <if test="createTime != null">#{createTime},</if>
+         </trim>
+    </insert>
+
+    <update id="updatePointUserSignLog" parameterType="PointUserSignLog">
+        update point_user_sign_log
+        <trim prefix="SET" suffixOverrides=",">
+            <if test="userId != null">user_id = #{userId},</if>
+            <if test="activityId != null">activity_id = #{activityId},</if>
+            <if test="taskId != null">task_id = #{taskId},</if>
+            <if test="signDate != null">sign_date = #{signDate},</if>
+            <if test="continuousDays != null">continuous_days = #{continuousDays},</if>
+            <if test="points != null">points = #{points},</if>
+            <if test="isMakeUp != null">is_make_up = #{isMakeUp},</if>
+            <if test="createTime != null">create_time = #{createTime},</if>
+        </trim>
+        where id = #{id}
+    </update>
+
+    <delete id="deletePointUserSignLogById" parameterType="String">
+        delete from point_user_sign_log where id = #{id}
+    </delete>
+
+    <delete id="deletePointUserSignLogByIds" parameterType="String">
+        delete from point_user_sign_log where id in 
+        <foreach item="id" collection="array" open="(" separator="," close=")">
+            #{id}
+        </foreach>
+    </delete>
+</mapper>

+ 85 - 0
nightFragrance-massage/src/main/resources/mapper/point/PointUserSignStatusMapper.xml

@@ -0,0 +1,85 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.ylx.point.mapper.PointUserSignStatusMapper">
+    
+    <resultMap type="PointUserSignStatus" id="PointUserSignStatusResult">
+        <result property="id"    column="id"    />
+        <result property="userId"    column="user_id"    />
+        <result property="activityId"    column="activity_id"    />
+        <result property="lastSignDate"    column="last_sign_date"    />
+        <result property="currentContinuousDays"    column="current_continuous_days"    />
+        <result property="maxHistoricalDays"    column="max_historical_days"    />
+        <result property="lastRewardCycleDays"    column="last_reward_cycle_days"    />
+        <result property="updateTime"    column="update_time"    />
+    </resultMap>
+
+    <sql id="selectPointUserSignStatusVo">
+        select id, user_id, activity_id, last_sign_date, current_continuous_days, max_historical_days, last_reward_cycle_days, update_time from point_user_sign_status
+    </sql>
+
+    <select id="selectPointUserSignStatusList" parameterType="PointUserSignStatus" resultMap="PointUserSignStatusResult">
+        <include refid="selectPointUserSignStatusVo"/>
+        <where>  
+            <if test="userId != null "> and user_id = #{userId}</if>
+            <if test="activityId != null "> and activity_id = #{activityId}</if>
+            <if test="lastSignDate != null "> and last_sign_date = #{lastSignDate}</if>
+            <if test="currentContinuousDays != null "> and current_continuous_days = #{currentContinuousDays}</if>
+            <if test="maxHistoricalDays != null "> and max_historical_days = #{maxHistoricalDays}</if>
+            <if test="lastRewardCycleDays != null "> and last_reward_cycle_days = #{lastRewardCycleDays}</if>
+        </where>
+    </select>
+    
+    <select id="selectPointUserSignStatusById" parameterType="String" resultMap="PointUserSignStatusResult">
+        <include refid="selectPointUserSignStatusVo"/>
+        where id = #{id}
+    </select>
+        
+    <insert id="insertPointUserSignStatus" parameterType="PointUserSignStatus" useGeneratedKeys="true" keyProperty="id">
+        insert into point_user_sign_status
+        <trim prefix="(" suffix=")" suffixOverrides=",">
+            <if test="userId != null">user_id,</if>
+            <if test="activityId != null">activity_id,</if>
+            <if test="lastSignDate != null">last_sign_date,</if>
+            <if test="currentContinuousDays != null">current_continuous_days,</if>
+            <if test="maxHistoricalDays != null">max_historical_days,</if>
+            <if test="lastRewardCycleDays != null">last_reward_cycle_days,</if>
+            <if test="updateTime != null">update_time,</if>
+         </trim>
+        <trim prefix="values (" suffix=")" suffixOverrides=",">
+            <if test="userId != null">#{userId},</if>
+            <if test="activityId != null">#{activityId},</if>
+            <if test="lastSignDate != null">#{lastSignDate},</if>
+            <if test="currentContinuousDays != null">#{currentContinuousDays},</if>
+            <if test="maxHistoricalDays != null">#{maxHistoricalDays},</if>
+            <if test="lastRewardCycleDays != null">#{lastRewardCycleDays},</if>
+            <if test="updateTime != null">#{updateTime},</if>
+         </trim>
+    </insert>
+
+    <update id="updatePointUserSignStatus" parameterType="PointUserSignStatus">
+        update point_user_sign_status
+        <trim prefix="SET" suffixOverrides=",">
+            <if test="userId != null">user_id = #{userId},</if>
+            <if test="activityId != null">activity_id = #{activityId},</if>
+            <if test="lastSignDate != null">last_sign_date = #{lastSignDate},</if>
+            <if test="currentContinuousDays != null">current_continuous_days = #{currentContinuousDays},</if>
+            <if test="maxHistoricalDays != null">max_historical_days = #{maxHistoricalDays},</if>
+            <if test="lastRewardCycleDays != null">last_reward_cycle_days = #{lastRewardCycleDays},</if>
+            <if test="updateTime != null">update_time = #{updateTime},</if>
+        </trim>
+        where id = #{id}
+    </update>
+
+    <delete id="deletePointUserSignStatusById" parameterType="String">
+        delete from point_user_sign_status where id = #{id}
+    </delete>
+
+    <delete id="deletePointUserSignStatusByIds" parameterType="String">
+        delete from point_user_sign_status where id in 
+        <foreach item="id" collection="array" open="(" separator="," close=")">
+            #{id}
+        </foreach>
+    </delete>
+</mapper>