Browse Source

提交签到接口

wangzhijun 18 hours ago
parent
commit
eae9bc1b04
33 changed files with 455 additions and 185 deletions
  1. 6 5
      nightFragrance-admin/src/main/java/com/ylx/web/controller/point/PointActivityController.java
  2. 2 2
      nightFragrance-admin/src/main/java/com/ylx/web/controller/point/UserPointController.java
  3. 2 2
      nightFragrance-massage/src/main/java/com/ylx/point/domain/PointActivityExpirePolicy.java
  4. 1 1
      nightFragrance-massage/src/main/java/com/ylx/point/domain/PointSignTask.java
  5. 2 2
      nightFragrance-massage/src/main/java/com/ylx/point/domain/PointUserActivityTaskCompletion.java
  6. 4 4
      nightFragrance-massage/src/main/java/com/ylx/point/domain/PointUserLog.java
  7. 5 5
      nightFragrance-massage/src/main/java/com/ylx/point/domain/PointUserSignLog.java
  8. 6 5
      nightFragrance-massage/src/main/java/com/ylx/point/domain/PointUserSignStatus.java
  9. 2 2
      nightFragrance-massage/src/main/java/com/ylx/point/domain/dto/PointActivityValidityDTO.java
  10. 1 1
      nightFragrance-massage/src/main/java/com/ylx/point/domain/dto/PointSignTaskDTO.java
  11. 16 0
      nightFragrance-massage/src/main/java/com/ylx/point/domain/dto/SignDTO.java
  12. 2 2
      nightFragrance-massage/src/main/java/com/ylx/point/domain/dto/UserPointPageDTO.java
  13. 1 1
      nightFragrance-massage/src/main/java/com/ylx/point/domain/vo/SignDayVo.java
  14. 2 2
      nightFragrance-massage/src/main/java/com/ylx/point/mapper/PointUserActivityTaskCompletionMapper.java
  15. 2 2
      nightFragrance-massage/src/main/java/com/ylx/point/mapper/PointUserLogMapper.java
  16. 2 2
      nightFragrance-massage/src/main/java/com/ylx/point/mapper/PointUserSignLogMapper.java
  17. 4 0
      nightFragrance-massage/src/main/java/com/ylx/point/mapper/PointUserSignStatusMapper.java
  18. 6 0
      nightFragrance-massage/src/main/java/com/ylx/point/service/IPointAccountService.java
  19. 3 6
      nightFragrance-massage/src/main/java/com/ylx/point/service/IPointActivityService.java
  20. 1 1
      nightFragrance-massage/src/main/java/com/ylx/point/service/IPointUserActivityTaskCompletionService.java
  21. 1 1
      nightFragrance-massage/src/main/java/com/ylx/point/service/IPointUserLogService.java
  22. 1 1
      nightFragrance-massage/src/main/java/com/ylx/point/service/IPointUserSignLogService.java
  23. 1 0
      nightFragrance-massage/src/main/java/com/ylx/point/service/IPointUserSignStatusService.java
  24. 163 0
      nightFragrance-massage/src/main/java/com/ylx/point/service/impl/PointAccountServiceImpl.java
  25. 187 99
      nightFragrance-massage/src/main/java/com/ylx/point/service/impl/PointActivityServiceImpl.java
  26. 2 2
      nightFragrance-massage/src/main/java/com/ylx/point/service/impl/PointUserActivityTaskCompletionServiceImpl.java
  27. 11 20
      nightFragrance-massage/src/main/java/com/ylx/point/service/impl/PointUserLogServiceImpl.java
  28. 2 2
      nightFragrance-massage/src/main/java/com/ylx/point/service/impl/PointUserSignLogServiceImpl.java
  29. 9 7
      nightFragrance-massage/src/main/java/com/ylx/point/service/impl/PointUserSignStatusServiceImpl.java
  30. 4 4
      nightFragrance-massage/src/main/resources/mapper/point/PointUserActivityTaskCompletionMapper.xml
  31. 2 2
      nightFragrance-massage/src/main/resources/mapper/point/PointUserLogMapper.xml
  32. 1 1
      nightFragrance-massage/src/main/resources/mapper/point/PointUserSignLogMapper.xml
  33. 1 1
      nightFragrance-massage/src/main/resources/mapper/point/PointUserSignStatusMapper.xml

+ 6 - 5
nightFragrance-admin/src/main/java/com/ylx/web/controller/point/PointActivityController.java

@@ -9,6 +9,7 @@ import com.ylx.common.enums.BusinessType;
 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.dto.SignDTO;
 import com.ylx.point.domain.vo.*;
 import com.ylx.point.service.IPointActivityService;
 import io.swagger.annotations.Api;
@@ -117,16 +118,16 @@ public class PointActivityController extends BaseController {
 
 
     @ApiOperation("获取签到面板数据")
-    @GetMapping(value = "/sign/info")
-    public R<List<SignDayVo>> getSignInfo(@RequestParam String cityName) {
-        List<SignDayVo> list = this.pointActivityService.getSignInfo(cityName);
+    @PostMapping(value = "/sign/info")
+    public R<List<SignDayVo>> getSignInfo(@Validated @RequestBody SignDTO dto) {
+        List<SignDayVo> list = this.pointActivityService.getSignInfo(dto);
         return R.ok(list);
     }
 
     @ApiOperation("用户签到接口")
     @PostMapping(value = "/sign")
-    public R sign() {
-        this.pointActivityService.sign();
+    public R sign(@Validated @RequestBody SignDTO dto) {
+        this.pointActivityService.sign(dto);
         return R.ok();
     }
 

+ 2 - 2
nightFragrance-admin/src/main/java/com/ylx/web/controller/point/UserPointController.java

@@ -30,8 +30,8 @@ public class UserPointController extends BaseController {
 
     @ApiOperation("获取当前用户的积分信息")
     @GetMapping
-    public R<UserPointInfoVO> getUserPointInfo() {
-        UserPointInfoVO vo = this.pointUserLogService.getUserPointInfo();
+    public R<UserPointInfoVO> getUserPointInfo(@RequestParam String cityCode) {
+        UserPointInfoVO vo = this.pointUserLogService.getUserPointInfo(cityCode);
         return R.ok(vo);
     }
 

+ 2 - 2
nightFragrance-massage/src/main/java/com/ylx/point/domain/PointActivityExpirePolicy.java

@@ -41,13 +41,13 @@ public class PointActivityExpirePolicy extends BaseEntity {
      */
     @Excel(name = "有效期天数 (仅当 expire_policy=2 时有效)")
     @TableField(updateStrategy = FieldStrategy.IGNORED)
-    private Long expireDays;
+    private Integer expireDays;
 
     /**
      * 逐年过期年份 (expire_policy=3时有效,如 "2027" 表示2027年1月1日过期)
      */
     @Excel(name = "逐年过期年份 (expire_policy=3时有效)")
     @TableField(updateStrategy = FieldStrategy.IGNORED)
-    private String expireYear;
+    private Integer expireYear;
 
 }

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

@@ -33,7 +33,7 @@ public class PointSignTask extends BaseEntity {
      * 每日签到基础积分
      */
     @Excel(name = "每日签到基础积分")
-    private Long basePoints;
+    private Integer basePoints;
 
     /**
      * 断签规则:0=重置,1=保留进度

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

@@ -47,8 +47,8 @@ public class PointUserActivityTaskCompletion extends BaseEntity {
     /**
      * 用户ID
      */
-    @Excel(name = "用户ID")
-    private String userId;
+    @Excel(name = "用户的openID")
+    private String openId;
 
     /**
      * 该任务已完成次数

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

@@ -30,8 +30,8 @@ public class PointUserLog extends BaseEntity {
     /**
      * 用户ID
      */
-    @Excel(name = "用户ID")
-    private String userId;
+    @Excel(name = "用户的openID")
+    private String openId;
 
     /**
      * 活动ID
@@ -61,13 +61,13 @@ public class PointUserLog extends BaseEntity {
      * 变动值 (+获得, -消费, -过期)
      */
     @Excel(name = "变动值 (+获得, -消费, -过期)")
-    private BigDecimal points;
+    private Integer points;
 
     /**
      * 变动后总余额 (快照)
      */
     @Excel(name = "变动后总余额 (快照)")
-    private BigDecimal balanceAfter;
+    private Integer balanceAfter;
 
     /**
      * 关联ID: 消耗/过期记录指向被扣减的"获得记录ID"

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

@@ -29,8 +29,8 @@ public class PointUserSignLog extends BaseEntity {
     /**
      * 用户ID
      */
-    @Excel(name = "用户ID")
-    private String userId;
+    @Excel(name = "用户的openID")
+    private String openId;
 
     /**
      * 签到活动ID(对应point_activity.id)
@@ -47,20 +47,20 @@ public class PointUserSignLog extends BaseEntity {
     /**
      * 签到日期(yyyy-MM-dd)
      */
-    @Excel(name = "签到日期", readConverterExp = "y=yyy-MM-dd")
+    @Excel(name = "签到日期", readConverterExp = "yyyy-MM-dd")
     private Date signDate;
 
     /**
      * 本次签到后连续天数
      */
     @Excel(name = "本次签到后连续天数")
-    private Long continuousDays;
+    private Integer continuousDays;
 
     /**
      * 本次获得积分
      */
     @Excel(name = "本次获得积分")
-    private Long points;
+    private Integer points;
 
     /**
      * 是否补签:0=否,1=是

+ 6 - 5
nightFragrance-massage/src/main/java/com/ylx/point/domain/PointUserSignStatus.java

@@ -1,5 +1,6 @@
 package com.ylx.point.domain;
 
+import cn.hutool.core.date.DateTime;
 import com.fasterxml.jackson.annotation.JsonFormat;
 import com.ylx.common.annotation.Excel;
 import com.ylx.common.core.domain.BaseEntity;
@@ -27,13 +28,13 @@ public class PointUserSignStatus extends BaseEntity {
     /**
      * $column.columnComment
      */
-    @Excel(name = "${comment}", readConverterExp = "$column.readConverterExp()")
-    private String userId;
+    @Excel(name = "用户的openID")
+    private String openId;
 
     /**
      * $column.columnComment
      */
-    @Excel(name = "${comment}", readConverterExp = "$column.readConverterExp()")
+    @Excel(name = "签到活动ID", readConverterExp = "对=应point_activity.id")
     private Long activityId;
 
     /**
@@ -41,7 +42,7 @@ public class PointUserSignStatus extends BaseEntity {
      */
     @JsonFormat(pattern = "yyyy-MM-dd")
     @Excel(name = "最后成功签到日期", width = 30, dateFormat = "yyyy-MM-dd")
-    private Date lastSignDate;
+    private DateTime lastSignDate;
 
     /**
      * 当前连续天数
@@ -59,6 +60,6 @@ public class PointUserSignStatus extends BaseEntity {
      * 本周期已领取奖励的最高天数阈值 (防止重复发阶梯奖)
      */
     @Excel(name = "本周期已领取奖励的最高天数阈值 (防止重复发阶梯奖)")
-    private Long lastRewardCycleDays;
+    private Integer lastRewardCycleDays;
 
 }

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

@@ -19,9 +19,9 @@ public class PointActivityValidityDTO {
     private Integer expirePolicy;
 
     @ApiModelProperty("有效期天数 (仅当 expire_policy=2 时有效)")
-    private Long expireDays;
+    private Integer expireDays;
 
     @Excel(name = "逐年过期年份 (expire_policy=3时有效)")
-    private String expireYear;
+    private Integer expireYear;
 
 }

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

@@ -11,7 +11,7 @@ import java.util.List;
 public class PointSignTaskDTO {
 
     @ApiModelProperty("每日签到基础积分")
-    private Long basePoints;
+    private Integer basePoints;
 
     @ApiModelProperty("断签规则:0=重置,1=保留进度")
     private Integer breakRule;

+ 16 - 0
nightFragrance-massage/src/main/java/com/ylx/point/domain/dto/SignDTO.java

@@ -0,0 +1,16 @@
+package com.ylx.point.domain.dto;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import javax.validation.constraints.NotNull;
+
+@Data
+@ApiModel("用户签到DTO")
+public class SignDTO {
+
+    @ApiModelProperty("当前所在的城市代码")
+    @NotNull(message = "城市代码不能为空")
+    private String cityCode;
+}

+ 2 - 2
nightFragrance-massage/src/main/java/com/ylx/point/domain/dto/UserPointPageDTO.java

@@ -15,6 +15,6 @@ public class UserPointPageDTO extends BaseEntity {
     @NotNull(message = "操作类型不能为空")
     private Integer opType;
 
-    @ApiModelProperty(name = "用户ID", hidden = true)
-    private String userId;
+    @ApiModelProperty(name = "用户的openID", hidden = true)
+    private String openId;
 }

+ 1 - 1
nightFragrance-massage/src/main/java/com/ylx/point/domain/vo/SignDayVo.java

@@ -18,7 +18,7 @@ public class SignDayVo {
     @ApiModelProperty("对应奖励积分")
     private Integer points;
 
-    @ApiModelProperty("状态:0:未签, 1:已签")
+    @ApiModelProperty("状态:0:未签, 1:已签, 2:今天未签")
     private Integer status;
 
 }

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

@@ -17,8 +17,8 @@ public interface PointUserActivityTaskCompletionMapper extends BaseMapper<PointU
 
     PointActivityOverviewVO getPointActivityOverviewByActivityId(Long activityId);
 
-    Integer selectCompletedTaskCount(String userId);
+    Integer selectCompletedTaskCount(String openId);
 
-    List<PointUserActivityTaskCompletion> selectCompletionsByUserAndTaskIds(@Param("userId") String userId, @Param("taskIds") List<Long> taskIds);
+    List<PointUserActivityTaskCompletion> selectCompletionsByUserAndTaskIds(@Param("openId") String openId, @Param("taskIds") List<Long> taskIds);
 
 }

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

@@ -25,10 +25,10 @@ public interface PointUserLogMapper extends BaseMapper<PointUserLog> {
             "   COALESCE(SUM(CASE WHEN month = #{currentMonth} AND op_type = 1 THEN points ELSE 0 END), 0) AS earnedPoints, " +
             "   COALESCE(SUM(CASE WHEN is_expired = 0 AND expire_time &gt;= #{startOfThisMonth} AND expire_time &lt;= #{endOfThisMonth} THEN points ELSE 0 END), 0) AS expirePoints " +
             "FROM point_user_log " +
-            "WHERE user_id = #{userId} " +
+            "WHERE open_id = #{openId} " +
             "</script>")
     Map<String, Object> selectPointStatistics(
-            @Param("userId") String userId,
+            @Param("openId") String openId,
             @Param("currentMonth") String currentMonth,
             @Param("startOfThisMonth") String startOfThisMonth,
             @Param("endOfThisMonth") String endOfThisMonth);

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

@@ -17,8 +17,8 @@ public interface PointUserSignLogMapper extends BaseMapper<PointUserSignLog> {
 
 
     @Select("SELECT COUNT(*) FROM point_user_sign_log " +
-            "WHERE user_id = #{userId} " +
+            "WHERE open_id = #{openId} " +
             "AND task_id = #{taskId} " +
             "AND sign_date = CURDATE()")
-    int countTodaySign(@Param("userId") String userId, @Param("taskId") Long taskId);
+    int countTodaySign(@Param("openId") String openId, @Param("taskId") Long taskId);
 }

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

@@ -2,6 +2,8 @@ package com.ylx.point.mapper;
 
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.ylx.point.domain.PointUserSignStatus;
+import org.apache.ibatis.annotations.Param;
+import org.apache.ibatis.annotations.Select;
 
 import java.util.List;
 
@@ -13,4 +15,6 @@ import java.util.List;
  */
 public interface PointUserSignStatusMapper extends BaseMapper<PointUserSignStatus> {
 
+    @Select("SELECT * FROM point_user_sign_status WHERE open_id = #{openId} AND activity_id = #{activityId} FOR UPDATE")
+    PointUserSignStatus selectByOpenIdAndActivityIdForUpdate(@Param("openId") String openId, @Param("activityId") Long activityId);
 }

+ 6 - 0
nightFragrance-massage/src/main/java/com/ylx/point/service/IPointAccountService.java

@@ -0,0 +1,6 @@
+package com.ylx.point.service;
+
+public interface IPointAccountService {
+
+    Integer addPoints(String openId, int points, String bizOrderNo, Long activityId, Long taskId, Integer taskType);
+}

+ 3 - 6
nightFragrance-massage/src/main/java/com/ylx/point/service/IPointActivityService.java

@@ -2,10 +2,7 @@ package com.ylx.point.service;
 
 import com.baomidou.mybatisplus.extension.service.IService;
 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.dto.UserPointActivityPageDTO;
+import com.ylx.point.domain.dto.*;
 import com.ylx.point.domain.vo.*;
 
 import java.util.List;
@@ -38,7 +35,7 @@ public interface IPointActivityService extends IService<PointActivity> {
 
     List<UserPointActivityVo> activityList();
 
-    List<SignDayVo> getSignInfo(String cityName);
+    List<SignDayVo> getSignInfo(SignDTO dto);
 
-    void sign();
+    void sign(SignDTO dto);
 }

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

@@ -16,7 +16,7 @@ public interface IPointUserActivityTaskCompletionService extends IService<PointU
 
     PointActivityOverviewVO getPointActivityOverviewByActivityId(Long activityId);
 
-    Integer selectCompletedTaskCount(String userId);
+    Integer selectCompletedTaskCount(String openId);
 
     List<PointUserActivityTaskCompletion> selectCompletionsByUserAndTaskIds(String userId, List<Long> taskIds);
 }

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

@@ -16,7 +16,7 @@ import java.util.List;
  */
 public interface IPointUserLogService extends IService<PointUserLog> {
 
-    UserPointInfoVO getUserPointInfo();
+    UserPointInfoVO getUserPointInfo(String cityCode);
 
     List<UserPointLogVO> getUserPointLogList(UserPointPageDTO dto);
 }

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

@@ -11,5 +11,5 @@ import com.ylx.point.domain.PointUserSignLog;
  */
 public interface IPointUserSignLogService extends IService<PointUserSignLog> {
 
-    int countTodaySign(String userId, Long taskId);
+    int countTodaySign(String openId, Long taskId);
 }

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

@@ -11,4 +11,5 @@ import com.ylx.point.domain.PointUserSignStatus;
  */
 public interface IPointUserSignStatusService extends IService<PointUserSignStatus> {
 
+    PointUserSignStatus selectByOpenIdAndActivityIdForUpdate(String openId, Long activityId);
 }

+ 163 - 0
nightFragrance-massage/src/main/java/com/ylx/point/service/impl/PointAccountServiceImpl.java

@@ -0,0 +1,163 @@
+package com.ylx.point.service.impl;
+
+import cn.hutool.core.date.DateUtil;
+import cn.hutool.core.util.ObjectUtil;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.ylx.point.domain.PointActivity;
+import com.ylx.point.domain.PointActivityExpirePolicy;
+import com.ylx.point.domain.PointUserLog;
+import com.ylx.point.enums.PointActivityExpirePolicyEnum;
+import com.ylx.point.service.IPointAccountService;
+import com.ylx.point.service.IPointActivityExpirePolicyService;
+import com.ylx.point.service.IPointActivityService;
+import com.ylx.point.service.IPointUserLogService;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+import springfox.documentation.annotations.Cacheable;
+
+import javax.annotation.Resource;
+import java.time.LocalDateTime;
+import java.util.*;
+
+@Service
+public class PointAccountServiceImpl implements IPointAccountService {
+
+    @Resource
+    private IPointUserLogService pointUserLogService;
+    @Resource
+    private IPointActivityService pointActivityService;
+    @Resource
+    private IPointActivityExpirePolicyService pointActivityExpirePolicyService;
+
+    /**
+     * 增加用户积分(无账户表版本)
+     */
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public Integer addPoints(String openId, int points, String bizOrderNo, Long activityId, Long taskId, Integer taskType) {
+        if (points <= 0) {
+            return getBalance(openId);
+        }
+
+        // 1. 计算过期时间
+        Date expireTime = calculateExpireTime(activityId);
+
+        // 2. 获取当前余额 (变动前)
+        Integer currentBalance = getBalance(openId);
+
+        // 3. 写入积分流水表 (point_user_log)
+        PointUserLog log = new PointUserLog();
+        log.setOpenId(openId);
+        log.setActivityId(activityId);
+        log.setTaskId(taskId);
+        log.setTaskType(taskType);
+        log.setPoints(points);
+        log.setOpType(1);        // 1-收入
+        log.setBizOrderId(bizOrderNo);
+        log.setSourceLogId(null);
+        log.setIsExpired(0);
+        log.setExpireTime(expireTime);
+        log.setMonth(DateUtil.format(new Date(), "yyyyMM"));
+
+        // 计算变动后余额 (快照)
+        Integer newBalance = currentBalance + points;
+        log.setBalanceAfter(newBalance);
+
+        boolean saveSuccess = pointUserLogService.save(log);
+        if (!saveSuccess) {
+            throw new RuntimeException("积分流水记录失败");
+        }
+
+        return newBalance;
+    }
+
+    /**
+     * 获取用户当前可用积分余额
+     * 逻辑:SUM(所有收入记录) - SUM(所有支出记录)
+     * 或者更简单的:SUM(points),因为支出记录的 points 是负数
+     */
+    /**
+     * 获取用户当前可用积分余额
+     * 逻辑:SUM(points),支出记录的 points 为负数
+     */
+    private Integer getBalance(String openId) {
+        // 使用 QueryWrapper (非 Lambda) 来执行原生 SQL 聚合函数
+        QueryWrapper<PointUserLog> queryWrapper = new QueryWrapper<>();
+        queryWrapper.select("SUM(points)");
+        queryWrapper.eq("open_id", openId);
+
+        // 执行查询,获取单个 Object 结果
+        PointUserLog pointUserLog = pointUserLogService.getOne(queryWrapper);
+
+        // 判空处理
+        if (ObjectUtil.isNull(pointUserLog)) {
+            return 0;
+        }
+
+        // 类型转换并返回
+        return pointUserLog.getPoints();
+    }
+
+
+    /**
+     * 计算过期时间
+     * 优化点:
+     * 1. 增加缓存注解,减少数据库查询
+     * 2. 统一使用 LocalDateTime 和 DateUtil,避免 Calendar 的繁琐与易错
+     * 3. 增加字段判空,防止 NPE
+     */
+    private Date calculateExpireTime(Long activityId) {
+        if (activityId == null) {
+            return null;
+        }
+
+        // 1. 获取活动信息 (建议 Service 层也配置缓存)
+        PointActivity activity = pointActivityService.getById(activityId);
+        if (activity == null || activity.getExpirePolicyId() == null) {
+            return null;
+        }
+
+        // 2. 获取过期策略 (建议 Service 层也配置缓存)
+        PointActivityExpirePolicy policy = pointActivityExpirePolicyService.getById(activity.getExpirePolicyId());
+        if (policy == null || policy.getExpirePolicy() == null) {
+            return null;
+        }
+
+        LocalDateTime now = LocalDateTime.now();
+        Integer expirePolicy = policy.getExpirePolicy();
+
+        // 3. 永久有效
+        if (PointActivityExpirePolicyEnum.PERMANENT_VALID.getCode().equals(expirePolicy)) {
+            return null;
+        }
+
+        // 4. N天有效 (增加判空,默认为0)
+        if (PointActivityExpirePolicyEnum.TRANSACTION_EXPIRE.getCode().equals(expirePolicy)) {
+            Integer days = Optional.ofNullable(policy.getExpireDays()).orElse(0);
+            return DateUtil.offsetDay(new Date(), days);
+        }
+
+        // 5. 固定年份 (次年/第N年) 1月1日过期
+        // 逻辑修正:通常"固定年份"指的是截止到当年的最后一天,或者次年的第一天。
+        // 这里假设逻辑是:当前年份 + 偏移量,当年的1月1日 (或者根据业务调整为12月31日)
+        if (PointActivityExpirePolicyEnum.YEARLY_EXPIRE.getCode().equals(expirePolicy)) {
+            Integer yearOffset = Optional.ofNullable(policy.getExpireYear()).orElse(0);
+
+            // 计算目标年份的 1月1日 00:00:00 (或者根据需求调整为 12月31日 23:59:59)
+            LocalDateTime expireTime = now
+                    .plusYears(yearOffset)
+                    .withMonth(1)
+                    .withDayOfMonth(1)
+                    .withHour(0)
+                    .withMinute(0)
+                    .withSecond(0);
+
+            return DateUtil.date(expireTime);
+        }
+
+        return null;
+    }
+
+}

+ 187 - 99
nightFragrance-massage/src/main/java/com/ylx/point/service/impl/PointActivityServiceImpl.java

@@ -2,6 +2,7 @@ package com.ylx.point.service.impl;
 
 import cn.hutool.core.bean.BeanUtil;
 import cn.hutool.core.collection.CollectionUtil;
+import cn.hutool.core.date.DateTime;
 import cn.hutool.core.date.DateUtil;
 import cn.hutool.core.util.ObjectUtil;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
@@ -61,6 +62,8 @@ public class PointActivityServiceImpl extends ServiceImpl<PointActivityMapper, P
     private IPointUserSignLogService pointUserSignLogService;
     @Resource
     private IPointUserSignStatusService pointUserSignStatusService;
+    @Resource
+    private IPointAccountService pointAccountService;
 
     private static final int BATCH_SIZE = 1000;
 
@@ -298,131 +301,216 @@ public class PointActivityServiceImpl extends ServiceImpl<PointActivityMapper, P
     }
 
     @Override
-    public List<SignDayVo> getSignInfo(String cityName) {
-
+    public List<SignDayVo> getSignInfo(SignDTO dto) {
+        // 1. 获取用户信息
         WxLoginUser wxLoginUser = SecurityUtils.getWxLoginUser();
-        TWxUser user = wxUserService.getByOpenId(wxLoginUser.getCOpenid());
-        if (user == null) {
+        if (ObjectUtil.isNull(wxLoginUser)) {
             throw new RuntimeException("用户不存在");
         }
+        String openId = wxLoginUser.getCOpenid();
 
-        String userId = user.getId();
-        // TODO 根据cityName换cityCode
-        String cityCode = "110000";
-        // 动态获取启用任务
-        PointSignTask task = getEnabledTask(cityCode);
+        // 2. 获取任务ID (模拟城市逻辑)
+        PointSignTask task = getEnabledTask(dto.getCityCode());
+        if (task == null) {
+            throw new RuntimeException("当前城市暂无签到活动");
+        }
         Long taskId = task.getId();
 
-        List<SignDayVo> voList = new ArrayList<>();
-        LocalDate today = LocalDate.now();
+        // 3. 查询奖励配置 (按天数正序查询)
+        LambdaQueryWrapper<PointSignReward> rewardQuery = new LambdaQueryWrapper<>();
+        rewardQuery.eq(PointSignReward::getSignTaskId, taskId);
+        rewardQuery.orderByAsc(PointSignReward::getContinueDays);
+        rewardQuery.last("LIMIT 7");
+        List<PointSignReward> rewardList = pointSignRewardService.list(rewardQuery);
 
-        // 奖励配置
-        LambdaQueryWrapper<PointSignReward> queryWrapper = new LambdaQueryWrapper<>();
-        queryWrapper.eq(PointSignReward::getSignTaskId, taskId);
-        queryWrapper.orderByAsc(PointSignReward::getContinueDays);
-        queryWrapper.last("LIMIT 7");
-        List<PointSignReward> rewardList = this.pointSignRewardService.list(queryWrapper);
+        // 4. 获取用户当前状态
+        boolean signedToday = pointUserSignLogService.countTodaySign(openId, taskId) > 0;
 
-        // 今日是否已签
-        boolean signedToday = pointUserSignLogService.countTodaySign(userId, taskId) > 0;
+        LambdaQueryWrapper<PointUserSignStatus> statusQuery = new LambdaQueryWrapper<>();
+        statusQuery.eq(PointUserSignStatus::getOpenId, openId);
+        statusQuery.eq(PointUserSignStatus::getActivityId, taskId);
+        PointUserSignStatus status = pointUserSignStatusService.getOne(statusQuery);
 
-        // 用户签到状态
-        LambdaQueryWrapper<PointUserSignStatus> statusQueryWrapper = new LambdaQueryWrapper<>();
-        statusQueryWrapper.eq(PointUserSignStatus::getUserId, userId);
-        statusQueryWrapper.eq(PointUserSignStatus::getActivityId, taskId);
-        PointUserSignStatus status = pointUserSignStatusService.getOne(statusQueryWrapper);
-        int continuousDays = ObjectUtil.isNull(status) ? 0 : status.getCurrentContinuousDays();
+        // 修正点:处理空指针,如果没记录则默认为0
+        int continuousDays = (status == null) ? 0 : status.getCurrentContinuousDays();
 
-        // 组装7天展示
+        // 5. 组装返回数据
+        List<SignDayVo> voList = new ArrayList<>();
+        LocalDate today = LocalDate.now();
         DateTimeFormatter formatter = DateTimeFormatter.ofPattern("MM-dd");
-        for (int i = 0; i < 7; i++) {
+
+        // 注意:UI通常要求从左到右是 [过去 -> 今天],所以我们需要倒序循环 (从第6天前 -> 今天)
+        for (int i = 6; i >= 0; i--) {
             LocalDate date = today.minusDays(i);
+            int dayIndex = 7 - i; // 计算这是第几天 (1, 2, 3... 7)
+
             SignDayVo vo = new SignDayVo();
+
+            // 修正点:格式化日期为字符串,避免前端处理麻烦
             vo.setDate(date);
 
-            // 奖励匹配
-//            PointSignReward reward = rewardList.stream()
-//                    .filter(r -> r.getContinueDays() == (i + 1))
-//                    .findFirst()
-//                    .orElse(null);
-//            vo.setPoints(reward == null ? 0 : reward.getRewardPoints());
+            // --- 核心逻辑修正:状态判断 ---
+            // 逻辑:
+            // 1. 如果是今天 (i==0):看 signedToday
+            // 2. 如果是过去 (i>0):看 continuousDays 是否覆盖了这一天
+            //    注意:只有当今天还没签时,continuousDays才代表截止到昨天的进度。
+            //    如果今天已签,continuousDays 包含了今天。
 
-            // 状态 0未签 1已签 2今日可签
+            boolean isSigned;
             if (i == 0) {
-                vo.setStatus(signedToday ? 1 : 2);
+                // 今天的情况
+                isSigned = signedToday;
+            } else {
+                // 过去的情况
+                // 如果今天已签,continuousDays 包含了今天,所以 i <= continuousDays - 1
+                // 如果今天没签,continuousDays 截止到昨天,所以 i <= continuousDays
+                // 简化逻辑:只要 (i < continuousDays) 或者 (i == continuousDays 且 今天已签)
+                // 最通用的判断:当前的循环索引 i (倒数第几天) 小于 总连续天数,说明已签
+                // 特殊情况:如果今天没签,continuousDays 是昨天的进度。
+
+                // 简单写法:
+                if (signedToday) {
+                    isSigned = i <= continuousDays; // 包含今天在内的已签天数
+                } else {
+                    isSigned = i < continuousDays; // 不包含今天
+                }
+            }
+
+            if (isSigned) {
+                vo.setStatus(1); // 已签
+            } else if (i == 0) {
+                vo.setStatus(2); // 今天未签 (可签到)
             } else {
-                vo.setStatus((i + 1) <= continuousDays ? 1 : 0);
+                vo.setStatus(0); // 未来/未签
             }
+
+            // --- 奖励匹配 ---
+            // 根据 dayIndex (1-7) 去 rewardList 找对应的配置
+            PointSignReward reward = rewardList.stream()
+                    .filter(r -> r.getContinueDays() == dayIndex)
+                    .findFirst()
+                    .orElse(null);
+
+            if (reward != null) {
+                vo.setPoints(reward.getRewardPoints());
+                // 如果有其他字段如图片,也可以在这里set
+            } else {
+                vo.setPoints(0);
+            }
+
             voList.add(vo);
         }
+
         return voList;
     }
 
     @Override
     @Transactional(rollbackFor = Exception.class)
-    public void sign() {
-//        // 1. 检查今天是否已签
-//        int count = pointUserSignLogService.countTodaySign(userId, DEFAULT_TASK_ID);
-//        if (count > 0) {
-//            throw new RuntimeException("今天已经签到过了");
-//        }
-//
-//        // 2. 锁定用户签到状态行 (悲观锁,防止并发重复签到)
-//        PointUserSignStatus status = statusMapper.selectByUserAndTaskForUpdate(userId, DEFAULT_TASK_ID);
-//
-//        int newContinuousDays = 1; // 默认第一天
-//
-//        if (status != null) {
-//            // 3. 判断是否断签
-//            // 逻辑:如果上次签到时间不是昨天,且断签规则是"重置",则重置天数
-//            boolean isBreak = !status.getLastSignTime().toLocalDate().equals(LocalDate.now().minusDays(1));
-//
-//            PointSignTask task = taskMapper.selectById(DEFAULT_TASK_ID);
-//            if (isBreak && task.getBreakRule() == 0) {
-//                newContinuousDays = 1;
-//            } else {
-//                newContinuousDays = status.getCurrentContinuousDays() + 1;
-//            }
-//
-//            // 更新状态表
-//            status.setCurrentContinuousDays(newContinuousDays);
-//            status.setLastSignTime(LocalDateTime.now());
-//            statusMapper.updateById(status);
-//        } else {
-//            // 第一次签到,插入状态
-//            PointUserSignStatus newStatus = new PointUserSignStatus();
-//            newStatus.setUserId(userId);
-//            newStatus.setTaskId(DEFAULT_TASK_ID);
-//            newStatus.setCurrentContinuousDays(1);
-//            newStatus.setLastSignTime(LocalDateTime.now());
-//            statusMapper.insert(newStatus);
-//        }
-//
-//        // 4. 计算奖励
-//        PointSignReward reward = rewardMapper.selectOne(
-//                new QueryWrapper<PointSignReward>()
-//                        .eq("task_id", DEFAULT_TASK_ID)
-//                        .eq("day", newContinuousDays)
-//        );
-//
-//        // 如果当前天数没有配置具体奖励,取最近的一个配置或者默认值
-//        if (reward == null) {
-//            // 这里可以写兜底逻辑,比如取最大天数的奖励
-//            reward = rewardMapper.selectOne(new QueryWrapper<PointSignReward>().eq("task_id", DEFAULT_TASK_ID).orderByDesc("day").last("limit 1"));
-//        }
-//
-//        int points = (reward == null) ? 1 : reward.getPoints();
-//
-//        // 5. 写入日志
-//        PointUserSignLog log = new PointUserSignLog();
-//        log.setUserId(userId);
-//        log.setTaskId(DEFAULT_TASK_ID);
-//        log.setPoints(points);
-//        log.setCreateTime(LocalDateTime.now());
-//        logMapper.insert(log);
-//
-//        // 6. 增加用户总积分 (调用账户服务)
-//        pointAccountService.addPoints(userId, points);
+    public void sign(SignDTO dto) {
+        // 1. 获取用户信息
+        WxLoginUser wxLoginUser = SecurityUtils.getWxLoginUser();
+        if (ObjectUtil.isNull(wxLoginUser)) {
+            throw new RuntimeException("用户未登录");
+        }
+        String openId = wxLoginUser.getCOpenid();
+
+        // 2. 获取当前城市有效的签到任务配置
+        // 建议:这里应该加缓存,避免每次签到都查库
+        PointSignTask task = getEnabledTask(dto.getCityCode());
+        if (ObjectUtil.isNull(task)) {
+            throw new RuntimeException("当前城市暂无签到活动");
+        }
+        Long activityId = task.getActivityId();
+        Long taskId = task.getId();
+
+        // 3. 防重复签到 (利用数据库唯一索引兜底,这里做快速失败)
+        // 优化:直接查库比 count 快,且逻辑更清晰
+        PointUserSignLog todayLog = pointUserSignLogService.getOne(new LambdaQueryWrapper<PointUserSignLog>()
+                .eq(PointUserSignLog::getOpenId, openId)
+                .eq(PointUserSignLog::getTaskId, taskId)
+                .eq(PointUserSignLog::getSignDate, DateUtils.getNowDate()) // 假设日志表有 sign_date 字段,如果没有用 create_time 转 date
+                .last("LIMIT 1"));
+
+        if (ObjectUtil.isNotNull(todayLog)) {
+            throw new RuntimeException("今日已签到");
+        }
+
+        // 4. 获取并锁定用户签到状态 (悲观锁)
+        // 注意:selectByOpenIdAndActivityIdForUpdate 必须使用 FOR UPDATE 语法
+        PointUserSignStatus status = pointUserSignStatusService.selectByOpenIdAndActivityIdForUpdate(openId, activityId);
+
+        int newContinuousDays = 1;
+        DateTime today = DateUtil.date();
+        DateTime yesterday = DateUtil.yesterday();
+
+        if (ObjectUtil.isNull(status)) {
+            // --- 首次签到 ---
+            status = new PointUserSignStatus();
+            status.setOpenId(openId);
+            status.setActivityId(activityId);
+            status.setLastSignDate(today);
+            status.setCurrentContinuousDays(1);
+            status.setLastRewardCycleDays(0);
+            pointUserSignStatusService.save(status);
+        } else {
+            // --- 非首次签到:计算连续天数 ---
+            DateTime lastSignDate = status.getLastSignDate();
+
+            // 判断是否断签:昨天不是最后签到日期,即为断签
+            boolean isBreak = !DateUtil.isSameDay(lastSignDate, yesterday);
+
+            if (isBreak) {
+                if (task.getBreakRule() == 0) {
+                    // 规则0:断签重置
+                    newContinuousDays = 1;
+                } else {
+                    // 规则1:断签保留进度 (这里逻辑通常是 +1,除非你想做补签逻辑)
+                    newContinuousDays = status.getCurrentContinuousDays() + 1;
+                }
+            } else {
+                // 正常连续
+                newContinuousDays = status.getCurrentContinuousDays() + 1;
+            }
+
+            // 更新状态
+            status.setLastSignDate(today);
+            status.setCurrentContinuousDays(newContinuousDays);
+            pointUserSignStatusService.updateById(status);
+        }
+
+        // 5. 计算奖励积分
+        // 优化:匹配 <= 当前天数的最大奖励配置 (例如配置了3天、7天,第5天应该拿3天的奖,或者拿基础奖)
+        int rewardPoints = task.getBasePoints(); // 默认基础积分
+        PointSignReward reward = pointSignRewardService.getOne(new LambdaQueryWrapper<PointSignReward>()
+                .eq(PointSignReward::getSignTaskId, taskId)
+                .le(PointSignReward::getContinueDays, newContinuousDays) // 小于等于当前天数
+                .orderByDesc(PointSignReward::getContinueDays)
+                .last("LIMIT 1"));
+
+        if (ObjectUtil.isNotNull(reward)) {
+            rewardPoints = reward.getRewardPoints();
+        }
+
+        // 6. 写入签到流水日志
+        PointUserSignLog signLog = new PointUserSignLog();
+        signLog.setOpenId(openId);
+        signLog.setActivityId(activityId);
+        signLog.setTaskId(taskId);
+        signLog.setSignDate(today); // 需确保数据库字段支持 Date 类型
+        signLog.setContinuousDays(newContinuousDays);
+        signLog.setPoints(rewardPoints);
+        signLog.setIsMakeUp(0);
+        pointUserSignLogService.save(signLog);
+
+        // 7. 增加用户积分账户余额
+        // 注意:这里假设 pointAccountService 内部会写入 point_user_log (积分总流水表)
+        try {
+            pointAccountService.addPoints(openId, rewardPoints, null, activityId, taskId, PointActivityTypeEnum.SIGN_TASK.getCode());
+        } catch (Exception e) {
+            log.error("签到发放积分失败", e);
+            throw new RuntimeException("签到成功,但积分发放失败,请联系客服");
+        }
+
     }
 
     /**

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

@@ -30,8 +30,8 @@ public class PointUserActivityTaskCompletionServiceImpl extends ServiceImpl<Poin
     }
 
     @Override
-    public Integer selectCompletedTaskCount(String userId) {
-        return pointUserActivityTaskCompletionMapper.selectCompletedTaskCount(userId);
+    public Integer selectCompletedTaskCount(String openId) {
+        return pointUserActivityTaskCompletionMapper.selectCompletedTaskCount(openId);
     }
 
     @Override

+ 11 - 20
nightFragrance-massage/src/main/java/com/ylx/point/service/impl/PointUserLogServiceImpl.java

@@ -1,11 +1,10 @@
 package com.ylx.point.service.impl;
 
 import cn.hutool.core.date.DateUtil;
+import cn.hutool.core.util.ObjectUtil;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
-import com.ylx.common.core.domain.R;
 import com.ylx.common.core.domain.model.WxLoginUser;
 import com.ylx.common.utils.SecurityUtils;
-import com.ylx.massage.domain.TWxUser;
 import com.ylx.massage.service.TWxUserService;
 import com.ylx.point.domain.PointUserLog;
 import com.ylx.point.domain.dto.UserPointPageDTO;
@@ -19,7 +18,6 @@ import org.springframework.stereotype.Service;
 
 import javax.annotation.Resource;
 import java.math.BigDecimal;
-import java.util.Collections;
 import java.util.List;
 import java.util.Map;
 
@@ -42,19 +40,14 @@ public class PointUserLogServiceImpl extends ServiceImpl<PointUserLogMapper, Poi
     private IPointActivityService pointActivityService;
 
     @Override
-    public UserPointInfoVO getUserPointInfo() {
+    public UserPointInfoVO getUserPointInfo(String cityCode) {
 
         // 当前登录用户信息
         WxLoginUser wxLoginUser = SecurityUtils.getWxLoginUser();
-        TWxUser user = wxUserService.getByOpenId(wxLoginUser.getCOpenid());
-        if (user == null) {
-            throw new RuntimeException("用户不存在");
+        if (ObjectUtil.isNull(wxLoginUser)) {
+            throw new RuntimeException("用户未登录");
         }
-
-        String userId = user.getId();
-
-        // TODO 用户当前所在地区code
-        String cityCode = "140400";
+        String openId = wxLoginUser.getCOpenid();
 
         UserPointInfoVO vo = new UserPointInfoVO();
 
@@ -67,10 +60,10 @@ public class PointUserLogServiceImpl extends ServiceImpl<PointUserLogMapper, Poi
         // 2. 查询积分相关数据 (Total, Earned, Expire)
 
         // A. 查询积分统计 (Total, Earned, Expire)
-        Map<String, Object> pointStats = pointUserLogMapper.selectPointStatistics(userId, currentMonth, startOfThisMonth, endOfThisMonth);
+        Map<String, Object> pointStats = pointUserLogMapper.selectPointStatistics(openId, currentMonth, startOfThisMonth, endOfThisMonth);
 
         // B. 查询已完成任务数
-        Integer completedCount = pointUserActivityTaskCompletionService.selectCompletedTaskCount(userId);
+        Integer completedCount = pointUserActivityTaskCompletionService.selectCompletedTaskCount(openId);
 
         // C. 查询系统总任务数
         Integer totalTasks = pointActivityService.selectTotalActiveTasks(cityCode);
@@ -101,13 +94,11 @@ public class PointUserLogServiceImpl extends ServiceImpl<PointUserLogMapper, Poi
 
         // 当前登录用户信息
         WxLoginUser wxLoginUser = SecurityUtils.getWxLoginUser();
-        TWxUser user = wxUserService.getByOpenId(wxLoginUser.getCOpenid());
-        if (user == null) {
-            throw new RuntimeException("用户不存在");
-        }
 
-        String userId = user.getId();
-        dto.setUserId(userId);
+        if (ObjectUtil.isNull(wxLoginUser)) {
+            throw new RuntimeException("用户未登录");
+        }
+        dto.setOpenId(wxLoginUser.getCOpenid());
         return pointUserLogMapper.getUserPointLogList(dto);
     }
 

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

@@ -20,7 +20,7 @@ public class PointUserSignLogServiceImpl extends ServiceImpl<PointUserSignLogMap
     private PointUserSignLogMapper pointUserSignLogMapper;
 
     @Override
-    public int countTodaySign(String userId, Long taskId) {
-        return pointUserSignLogMapper.countTodaySign(userId, taskId);
+    public int countTodaySign(String openId, Long taskId) {
+        return pointUserSignLogMapper.countTodaySign(openId, taskId);
     }
 }

+ 9 - 7
nightFragrance-massage/src/main/java/com/ylx/point/service/impl/PointUserSignStatusServiceImpl.java

@@ -1,14 +1,12 @@
 package com.ylx.point.service.impl;
 
-import java.util.List;
-
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
-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.mapper.PointUserSignStatusMapper;
 import com.ylx.point.service.IPointUserSignStatusService;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
 
 /**
  * 用户签到状态快照Service业务层处理
@@ -18,7 +16,11 @@ import com.ylx.point.service.IPointUserSignStatusService;
  */
 @Service
 public class PointUserSignStatusServiceImpl extends ServiceImpl<PointUserSignStatusMapper, PointUserSignStatus> implements IPointUserSignStatusService {
-    @Autowired
+    @Resource
     private PointUserSignStatusMapper pointUserSignStatusMapper;
 
+    @Override
+    public PointUserSignStatus selectByOpenIdAndActivityIdForUpdate(String openId, Long activityId) {
+        return pointUserSignStatusMapper.selectByOpenIdAndActivityIdForUpdate(openId, activityId);
+    }
 }

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

@@ -9,7 +9,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         <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="openId"    column="open_id"    />
         <result property="completedCount"    column="completed_count"    />
         <result property="lastCompletedTime"    column="last_completed_time"    />
         <result property="createTime"    column="create_time"    />
@@ -18,7 +18,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
     </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
+        select id, activity_id, task_id, task_type, open_id, completed_count, last_completed_time, create_time, update_time, completed_date from point_user_activity_task_completion
     </sql>
 
     <select id="getPointActivityOverviewByActivityId"
@@ -34,14 +34,14 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
     </select>
 
     <select id="selectCompletedTaskCount" resultType="java.lang.Integer">
-        SELECT COUNT(*) FROM point_user_activity_task_completion WHERE user_id = #{userId} AND completed_count > 0
+        SELECT COUNT(*) FROM point_user_activity_task_completion WHERE open_id = #{openId} AND completed_count > 0
     </select>
 
     <select id="selectCompletionsByUserAndTaskIds"
             resultType="com.ylx.point.domain.PointUserActivityTaskCompletion">
         <include refid="selectPointUserActivityTaskCompletionVo"/>
         WHERE
-            user_id = #{userId}
+            open_id = #{openId}
         AND task_id IN
         <foreach collection="taskIds" item="taskId" open="(" separator="," close=")">
             #{taskId}

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

@@ -6,7 +6,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
     
     <resultMap type="PointUserLog" id="PointUserLogResult">
         <result property="id"    column="id"    />
-        <result property="userId"    column="user_id"    />
+        <result property="openId"    column="open_id"    />
         <result property="activityId"    column="activity_id"    />
         <result property="activityName"    column="activity_name"    />
         <result property="taskId"    column="task_id"    />
@@ -31,7 +31,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         FROM
             point_user_log pul
         WHERE
-            pul.user_id = #{userId}
+            pul.open_id = #{openId}
         AND pul.op_type = #{opType}
         ORDER BY
             pul.create_time DESC

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

@@ -6,7 +6,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
     
     <resultMap type="PointUserSignLog" id="PointUserSignLogResult">
         <result property="id"    column="id"    />
-        <result property="userId"    column="user_id"    />
+        <result property="openId"    column="open_d"    />
         <result property="activityId"    column="activity_id"    />
         <result property="taskId"    column="task_id"    />
         <result property="signDate"    column="sign_date"    />

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

@@ -6,7 +6,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
     
     <resultMap type="PointUserSignStatus" id="PointUserSignStatusResult">
         <result property="id"    column="id"    />
-        <result property="userId"    column="user_id"    />
+        <result property="openId"    column="open_id"    />
         <result property="activityId"    column="activity_id"    />
         <result property="lastSignDate"    column="last_sign_date"    />
         <result property="currentContinuousDays"    column="current_continuous_days"    />