Răsfoiți Sursa

解决sign接口报错

wangzhijun 9 ore în urmă
părinte
comite
37aa44babc

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

@@ -54,4 +54,7 @@ public class PointSignTask extends BaseEntity {
     @TableField(exist = false)
     private String updateBy;
 
+    @TableField(exist = false)
+    private String activityName;
+
 }

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

@@ -1,14 +1,12 @@
 package com.ylx.point.domain;
 
-import java.util.Date;
-
-import com.fasterxml.jackson.annotation.JsonFormat;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.ylx.common.annotation.Excel;
 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;
+
+import java.util.Date;
 
 /**
  * 用户签到记录对象 point_user_sign_log
@@ -68,4 +66,16 @@ public class PointUserSignLog extends BaseEntity {
     @Excel(name = "是否补签:0=否,1=是")
     private Integer isMakeUp;
 
+    @TableField(exist = false)
+    private String createBy;
+
+    @TableField(exist = false)
+    private String updateBy;
+
+    @TableField(exist = false)
+    private Date createTime;
+
+    @TableField(exist = false)
+    private Date updateTime;
+
 }

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

@@ -1,6 +1,5 @@
 package com.ylx.point.domain;
 
-import cn.hutool.core.date.DateTime;
 import com.baomidou.mybatisplus.annotation.TableField;
 import com.fasterxml.jackson.annotation.JsonFormat;
 import com.ylx.common.annotation.Excel;
@@ -43,7 +42,7 @@ public class PointUserSignStatus extends BaseEntity {
      */
     @JsonFormat(pattern = "yyyy-MM-dd")
     @Excel(name = "最后成功签到日期", width = 30, dateFormat = "yyyy-MM-dd")
-    private DateTime lastSignDate;
+    private Date lastSignDate;
 
     /**
      * 当前连续天数

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

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

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

@@ -36,7 +36,7 @@ public class PointAccountServiceImpl implements IPointAccountService {
      */
     @Override
     @Transactional(rollbackFor = Exception.class)
-    public Integer addPoints(String openId, int points, String bizOrderNo, Long activityId, Long taskId, Integer taskType) {
+    public Integer addPoints(String openId, int points, String activityName, String bizOrderNo, Long activityId, Long taskId, Integer taskType) {
         if (points <= 0) {
             return getBalance(openId);
         }
@@ -58,6 +58,7 @@ public class PointAccountServiceImpl implements IPointAccountService {
         log.setBizOrderId(bizOrderNo);
         log.setSourceLogId(null);
         log.setIsExpired(0);
+        log.setActivityName(activityName);
         log.setExpireTime(expireTime);
         log.setMonth(DateUtil.format(new Date(), "yyyyMM"));
 

+ 25 - 5
nightFragrance-massage/src/main/java/com/ylx/point/service/impl/PointActivityServiceImpl.java

@@ -400,6 +400,7 @@ public class PointActivityServiceImpl extends ServiceImpl<PointActivityMapper, P
         }
         Long activityId = task.getActivityId();
         Long taskId = task.getId();
+        String activityName = task.getActivityName();
 
         // 3. 防重复签到 (利用数据库唯一索引兜底,这里做快速失败)
         // 优化:直接查库比 count 快,且逻辑更清晰
@@ -417,6 +418,24 @@ public class PointActivityServiceImpl extends ServiceImpl<PointActivityMapper, P
         // 注意:selectByOpenIdAndActivityIdForUpdate 必须使用 FOR UPDATE 语法
         PointUserSignStatus status = pointUserSignStatusService.selectByOpenIdAndActivityIdForUpdate(openId, activityId);
 
+        // 检查今天是否已经签到
+        // 逻辑:如果是老用户(status不为空) 且 最后签到日期是今天
+        boolean isSignedToday = false;
+
+        if (ObjectUtil.isNotNull(status)) {
+            Date lastSignDate = status.getLastSignDate();
+            // 比较日期是否相同 (忽略时分秒)
+            if (DateUtil.isSameDay(lastSignDate, new Date())) {
+                isSignedToday = true;
+            }
+        }
+
+        // 如果今天已签,直接抛出异常
+        if (isSignedToday) {
+            // 这里可以定义一个自定义异常,或者使用通用的业务异常
+            throw new ServiceException("今日已签到,请勿重复操作");
+        }
+
         int newContinuousDays = 1;
         DateTime today = DateUtil.date();
         DateTime yesterday = DateUtil.yesterday();
@@ -432,7 +451,7 @@ public class PointActivityServiceImpl extends ServiceImpl<PointActivityMapper, P
             pointUserSignStatusService.save(status);
         } else {
             // --- 非首次签到:计算连续天数 ---
-            DateTime lastSignDate = status.getLastSignDate();
+            Date lastSignDate = status.getLastSignDate();
 
             // 判断是否断签:昨天不是最后签到日期,即为断签
             boolean isBreak = !DateUtil.isSameDay(lastSignDate, yesterday);
@@ -483,7 +502,7 @@ public class PointActivityServiceImpl extends ServiceImpl<PointActivityMapper, P
         // 7. 增加用户积分账户余额
         // 注意:这里假设 pointAccountService 内部会写入 point_user_log (积分总流水表)
         try {
-            pointAccountService.addPoints(openId, rewardPoints, null, activityId, taskId, PointActivityTypeEnum.SIGN_TASK.getCode());
+            pointAccountService.addPoints(openId, rewardPoints, activityName, null, activityId, taskId, PointActivityTypeEnum.SIGN_TASK.getCode());
         } catch (Exception e) {
             log.error("签到发放积分失败", e);
             throw new RuntimeException("签到成功,但积分发放失败,请联系客服");
@@ -779,7 +798,7 @@ public class PointActivityServiceImpl extends ServiceImpl<PointActivityMapper, P
                     ZoneId.systemDefault()
             );
             LocalDateTime endOfDay = localDateTime.with(
-                    java.time.LocalTime.of(23, 59, 59));
+                    LocalTime.of(23, 59, 59));
             return Date.from(endOfDay.atZone(ZoneId.systemDefault()).toInstant());
         } catch (DateTimeException e) {
             throw new IllegalArgumentException("Invalid end time", e);
@@ -945,12 +964,13 @@ public class PointActivityServiceImpl extends ServiceImpl<PointActivityMapper, P
         // 2. 根据活动绑定的 taskId 查询签到任务
         LambdaQueryWrapper<PointSignTask> queryWrapper = new LambdaQueryWrapper<>();
         queryWrapper.eq(PointSignTask::getActivityId, activity.getId());
-        queryWrapper.eq(PointSignTask::getIsDeleted, 1);
+        queryWrapper.eq(PointSignTask::getIsDeleted, 0);
         List<PointSignTask> list = pointSignTaskService.list(queryWrapper);
-        PointSignTask task = new PointSignTask();
+        PointSignTask task = null;
 
         if (CollectionUtil.isNotEmpty(list)) {
             task = CollectionUtil.getLast(list);
+            task.setActivityName(activity.getName());
         }
         return task;
     }