Procházet zdrojové kódy

益寿缘app-完善App奖品重复新增的问题

cgp před 6 dny
rodič
revize
1ff70a2f7c

+ 5 - 0
fs-service/src/main/java/com/fs/his/domain/FsUserRewards.java

@@ -92,6 +92,11 @@ public class FsUserRewards {
     /** 商品图片*/
     private String goodsUrl;
 
+    /**
+     * 奖励日期(年月日)
+     */
+    private String rewardDate;
+
     /**
      * 剩余过期天数
      * */

+ 1 - 1
fs-service/src/main/java/com/fs/his/mapper/FsUserRewardsMapper.java

@@ -128,5 +128,5 @@ public interface FsUserRewardsMapper {
      * @param fsUserId 用户ID
      * @param videoId 视频ID
      * */
-    FsUserRewards selectByUserIdAndVideoId(@Param("fsUserId")Long fsUserId, @Param("videoId")Long videoId);
+    FsUserRewards selectByUserIdAndVideoId(@Param("fsUserId")Long fsUserId, @Param("videoId")Long videoId, @Param("rewardDate") String rewardDate);
 }

+ 13 - 5
fs-service/src/main/java/com/fs/his/service/impl/AppUserRewardServiceImpl.java

@@ -109,7 +109,7 @@ public class AppUserRewardServiceImpl implements IAppUserRewardService {
             return;
         }
         // 构建奖品记录
-        FsUserRewards reward = buildAppUserReward(fsUserId, activityType, appRoleConfig,null);
+        FsUserRewards reward = buildAppUserReward(fsUserId, activityType, appRoleConfig,null,null);
         try {
             // 插入奖品表
             int insertResult = rewardsMapper.insertFsUserRewards(reward);
@@ -139,6 +139,12 @@ public class AppUserRewardServiceImpl implements IAppUserRewardService {
     @Override
     @Transactional(rollbackFor = Exception.class)
     public void addUserWatchCourseRewards(Long fsUserId,Long videoId) {
+        String watchCourseKey = APP_WATCH_COURSE_DAY_KEY  + fsUserId;
+        Object cacheObject = redisCache.getCacheObject(watchCourseKey);
+        if (cacheObject == null) {
+            log.info("用户:{}今日无有效看课记录", fsUserId);
+            return;
+        }
         // 1. 生成锁的key:用户ID+视频ID
         String lockKey = LOCK_WATCH_REWARD_KEY + fsUserId + ":" + videoId;
         // 2. 创建分布式锁,设置10秒过期
@@ -156,11 +162,12 @@ public class AppUserRewardServiceImpl implements IAppUserRewardService {
             log.info("获取分布式锁成功: userId={}, videoId={}, secret={}",
                     fsUserId, videoId, lock.getLockSecretValue());
 
+            String toDay=DateUtils.getDate();
             // 4. 双重检查:再次确认是否已发放过奖励(防止锁内重复)
-            FsUserRewards existingReward = rewardsMapper.selectByUserIdAndVideoId(fsUserId, videoId);
+            FsUserRewards existingReward = rewardsMapper.selectByUserIdAndVideoId(fsUserId, videoId, toDay);
             if (existingReward != null) {
                 log.info("看课奖励已存在,不再重复发放: userId={}, videoId={}", fsUserId, videoId);
-                return; // 已存在,直接返回
+                return;
             }
 
             // 5. 原有的业务逻辑
@@ -174,7 +181,7 @@ public class AppUserRewardServiceImpl implements IAppUserRewardService {
             }
 
             // 构建奖品记录
-            FsUserRewards reward = buildAppUserReward(fsUserId, activityType, appRoleConfig, videoId);
+            FsUserRewards reward = buildAppUserReward(fsUserId, activityType, appRoleConfig, videoId,toDay);
 
             // 插入奖品表
             try {
@@ -214,7 +221,7 @@ public class AppUserRewardServiceImpl implements IAppUserRewardService {
      * @param activityType 活动类型
      * @param appRoleConfig 角色配置
      */
-    private FsUserRewards buildAppUserReward(Long fsUserId, String activityType, FsAppRole appRoleConfig,Long videoId) {
+    private FsUserRewards buildAppUserReward(Long fsUserId, String activityType, FsAppRole appRoleConfig,Long videoId,String toDay) {
         FsUserRewards reward = new FsUserRewards();
         reward.setFsUserId(fsUserId);
         reward.setActivityType(activityType);
@@ -244,6 +251,7 @@ public class AppUserRewardServiceImpl implements IAppUserRewardService {
             // 看课奖励
             reward.setRewardType(appRoleConfig.getCourseRewardType());
             reward.setVideoId(videoId);
+            reward.setRewardDate(toDay);
             // 获取当前用户的有效看课天数
             FsUser fsUser = fsUserMapper.selectFsUserById(fsUserId);
             if (fsUser == null) {

+ 7 - 2
fs-service/src/main/resources/mapper/his/FsUserRewardsMapper.xml

@@ -22,13 +22,14 @@
         <result property="updateTime" column="update_time"/>
         <result property="isFirstLogin" column="is_first_login"/>
         <result property="videoId" column="video_id"/>
+        <result property="rewardDate" column="reward_date"/>
     </resultMap>
 
     <!-- 基础字段列表 -->
     <sql id="selectFsUserRewardsVo">
         select id, fs_user_id, activity_type, reward_type, status,
                order_code, goods_id, product_type, reward_amount, reward_points,
-               goods_name, goods_url, grant_time, create_time, update_time, is_first_login,video_id
+               goods_name, goods_url, grant_time, create_time, update_time, is_first_login,video_id,reward_date
         from fs_user_rewards
     </sql>
 
@@ -91,6 +92,7 @@
             <if test="updateTime != null"> and update_time = #{updateTime}</if>
             <if test="isFirstLogin != null"> and is_first_login = #{isFirstLogin}</if>
             <if test="videoId != null"> and video_id = #{videoId}</if>
+            <if test="rewardDate != null"> and reward_date = #{rewardDate}</if>
         </where>
         order by create_time desc
     </select>
@@ -100,7 +102,7 @@
     </select>
     <select id="selectByUserIdAndVideoId" resultType="com.fs.his.domain.FsUserRewards">
         <include refid="selectFsUserRewardsVo"/>
-        where fs_user_id = #{fsUserId} and video_id = #{videoId}
+        where fs_user_id = #{fsUserId} and video_id = #{videoId} and reward_date= #{rewardDate}
     </select>
 
     <!-- 新增记录 -->
@@ -121,6 +123,7 @@
             <if test="grantTime != null">grant_time,</if>
             <if test="isFirstLogin != null">is_first_login,</if>
             <if test="videoId != null">video_id,</if>
+            <if test="rewardDate != null">reward_date,</if>
             create_time,
         </trim>
         <trim prefix="values (" suffix=")" suffixOverrides=",">
@@ -138,6 +141,7 @@
             <if test="grantTime != null">#{grantTime},</if>
             <if test="isFirstLogin != null">#{isFirstLogin},</if>
             <if test="videoId != null">#{videoId},</if>
+            <if test="rewardDate != null">#{rewardDate},</if>
             sysdate(),
         </trim>
     </insert>
@@ -160,6 +164,7 @@
             <if test="grantTime != null">grant_time = #{grantTime},</if>
             <if test="isFirstLogin != null">is_first_login = #{isFirstLogin},</if>
             <if test="videoId != null">video_id = #{videoId},</if>
+            <if test="rewardDate != null">reward_date = #{rewardDate},</if>
             update_time = sysdate()
         </trim>
         where id = #{id}

+ 1 - 1
fs-user-app/src/main/java/com/fs/app/controller/AppUserRewardController.java

@@ -72,7 +72,7 @@ public class AppUserRewardController  extends AppBaseController{
         try {
             //添加看课奖励
             appUserRewardService.addUserWatchCourseRewards(fsUserId, queryRewards.getVideoId());
-            log.info("用户App看课奖励添加成功: userId={}, videoId={}", loginUserId, queryRewards.getVideoId());
+            log.info("用户App看课奖励添加成功: userId={}, videoId={}", fsUserId, queryRewards.getVideoId());
             return R.ok();
         } catch (CustomException e) {
             log.warn("看课奖励发放被拦截: {}", e.getMessage());