ソースを参照

益寿缘app-完善App看课弹窗逻辑

cgp 6 日 前
コミット
cf9fe08d4e

+ 55 - 0
fs-service/src/main/java/com/fs/his/domain/FsAppRewardCourseRedPacketLog.java

@@ -0,0 +1,55 @@
+package com.fs.his.domain;
+
+import lombok.Data;
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * app连续看课红包领取记录表实体类
+ * 
+ * @author yourname
+ * @date 2026-03-04
+ */
+@Data
+public class FsAppRewardCourseRedPacketLog {
+    
+    /**
+     * 日志Id
+     */
+    private Long logId;
+    
+    /**
+     * 用户id
+     */
+    private Long userId;
+    
+    /**
+     * 小节id
+     */
+    private Long videoId;
+    
+    /**
+     * 活动类型:FIRST_LOGIN-首次登录,WATCH_COURSE-看课
+     */
+    private String activityType;
+    
+    /**
+     * 转帐金额
+     */
+    private BigDecimal amount;
+    
+    /**
+     * 创建时间
+     */
+    private Date createTime;
+    
+    /**
+     * 更新时间
+     */
+    private Date updateTime;
+    
+    /**
+     * 备注
+     */
+    private String remark;
+}

+ 97 - 0
fs-service/src/main/java/com/fs/his/mapper/FsAppRewardCourseRedPacketLogMapper.java

@@ -0,0 +1,97 @@
+package com.fs.his.mapper;
+
+import com.fs.his.domain.FsAppRewardCourseRedPacketLog;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+import java.util.List;
+
+/**
+ * app连续看课红包领取记录表 Mapper 接口
+ * 
+ * @author yourname
+ * @date 2026-03-04
+ */
+@Mapper
+public interface FsAppRewardCourseRedPacketLogMapper {
+    
+    /**
+     * 根据ID查询
+     *
+     * @param logId 日志ID
+     * @return 红包领取记录信息
+     */
+    FsAppRewardCourseRedPacketLog selectById(@Param("logId") Long logId);
+    
+    /**
+     * 根据用户ID查询
+     *
+     * @param userId 用户ID
+     * @return 红包领取记录列表
+     */
+    List<FsAppRewardCourseRedPacketLog> selectByUserId(@Param("userId") Long userId);
+    
+    /**
+     * 根据视频ID查询
+     *
+     * @param videoId 视频ID
+     * @return 红包领取记录列表
+     */
+    List<FsAppRewardCourseRedPacketLog> selectByVideoId(@Param("videoId") Long videoId);
+    
+    /**
+     * 根据用户ID和视频ID查询
+     *
+     * @param userId 用户ID
+     * @param videoId 视频ID
+     * @return 红包领取记录
+     */
+    FsAppRewardCourseRedPacketLog selectByUserIdAndVideoId(@Param("userId") Long userId, @Param("videoId") Long videoId);
+    
+    /**
+     * 根据活动类型查询
+     *
+     * @param activityType 活动类型
+     * @return 红包领取记录列表
+     */
+    List<FsAppRewardCourseRedPacketLog> selectByActivityType(@Param("activityType") String activityType);
+    
+    /**
+     * 查询列表(支持条件查询)
+     *
+     * @param record 查询条件
+     * @return 列表
+     */
+    List<FsAppRewardCourseRedPacketLog> selectList(FsAppRewardCourseRedPacketLog record);
+    
+    /**
+     * 新增记录
+     *
+     * @param record 红包领取记录信息
+     * @return 结果
+     */
+    int insert(FsAppRewardCourseRedPacketLog record);
+    
+    /**
+     * 修改记录
+     *
+     * @param record 红包领取记录信息
+     * @return 结果
+     */
+    int update(FsAppRewardCourseRedPacketLog record);
+    
+    /**
+     * 删除记录
+     *
+     * @param logId 日志ID
+     * @return 结果
+     */
+    int deleteById(@Param("logId") Long logId);
+    
+    /**
+     * 批量删除
+     *
+     * @param logIds 需要删除的日志ID数组
+     * @return 结果
+     */
+    int deleteByIds(@Param("logIds") Long[] logIds);
+}

+ 12 - 1
fs-service/src/main/java/com/fs/his/service/impl/AppUserRewardServiceImpl.java

@@ -1,5 +1,8 @@
 package com.fs.his.service.impl;
 
+import com.fs.course.domain.FsCourseRedPacketLog;
+import com.fs.course.mapper.FsCourseRedPacketLogMapper;
+import com.fs.his.mapper.FsAppRewardCourseRedPacketLogMapper;
 import me.chanjar.weixin.common.util.locks.RedisTemplateSimpleDistributedLock;
 import com.fs.app.domain.FsAppRole;
 import com.fs.app.mapper.FsAppRoleMapper;
@@ -58,6 +61,9 @@ public class AppUserRewardServiceImpl implements IAppUserRewardService {
     @Autowired
     private StringRedisTemplate stringRedisTemplate;
 
+    @Autowired
+    private FsCourseRedPacketLogMapper redPacketLogMapper;
+
     private static final String APP_WATCH_COURSE_DAY_KEY ="app:watch:course:day:";
 
     private static final String LOCK_WATCH_REWARD_KEY ="lock:watch:reward:";
@@ -400,7 +406,12 @@ public class AppUserRewardServiceImpl implements IAppUserRewardService {
         if (defaultConfig == null) {
             return noShowWindow;
         }
-
+        //查询今日领取红包记录
+        FsCourseRedPacketLog fsCourseRedPacketLog = redPacketLogMapper.selectRedPacketLogByUserIdToday(fsUserId);
+        if (fsCourseRedPacketLog != null) {
+            log.info("用户:{}已领取过课程看课红包,status={}", fsUserId, fsCourseRedPacketLog.getStatus());
+            return noShowWindow;
+        }
         String activityType = ActivityTypeEnum.WATCH_COURSE.getCode();
 
         // 1. 有效期检查

+ 13 - 27
fs-service/src/main/java/com/fs/his/strategy/impl/FirstLoginRedPacketStrategy.java

@@ -3,6 +3,7 @@ package com.fs.his.strategy.impl;
 import cn.hutool.json.JSONUtil;
 import com.alibaba.fastjson.JSON;
 import com.fs.common.core.domain.R;
+import com.fs.common.utils.DateUtils;
 import com.fs.common.utils.StringUtils;
 import com.fs.core.config.WxOpenProperties;
 import com.fs.course.config.CourseConfig;
@@ -15,23 +16,21 @@ import com.fs.course.mapper.FsCourseRedPacketLogMapper;
 import com.fs.course.mapper.FsCourseWatchLogMapper;
 import com.fs.course.mapper.FsUserCourseVideoMapper;
 import com.fs.course.param.FsCourseSendRewardUParam;
+import com.fs.his.domain.FsAppRewardCourseRedPacketLog;
 import com.fs.his.domain.FsUser;
 import com.fs.his.domain.FsUserRewards;
 import com.fs.his.enums.ActivityTypeEnum;
+import com.fs.his.mapper.FsAppRewardCourseRedPacketLogMapper;
 import com.fs.his.mapper.FsUserMapper;
 import com.fs.his.param.WxSendRedPacketParam;
 import com.fs.his.service.IFsStorePaymentService;
 import com.fs.his.strategy.RewardResult;
 import com.fs.his.strategy.RewardStrategy;
 import com.fs.system.service.ISysConfigService;
-import com.github.binarywang.wxpay.bean.transfer.TransferBillsResult;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
 
-import java.util.Date;
-import java.util.Objects;
-
 @Slf4j
 @Component
 public class FirstLoginRedPacketStrategy implements RewardStrategy {
@@ -59,6 +58,9 @@ public class FirstLoginRedPacketStrategy implements RewardStrategy {
 
     @Autowired
     private WxOpenProperties openProperties;
+
+    @Autowired
+    private FsAppRewardCourseRedPacketLogMapper appRewardCourseRedPacketLogMapper;
     @Override
     public RewardResult process(FsUserRewards reward) {
         log.info("处理首次登录红包发放: rewardId={}", reward.getId());
@@ -72,29 +74,13 @@ public class FirstLoginRedPacketStrategy implements RewardStrategy {
                 //调用发送红包接口逻辑
                 R sendRedPacket = fsStorePaymentService.sendRedPacketAppReward(param);
                 if (sendRedPacket.get("code").equals(200)) {
-                    FsCourseRedPacketLog redPacketLog = new FsCourseRedPacketLog();
-                    TransferBillsResult transferBillsResult;
-                    if (sendRedPacket.get("isNew").equals(1)){
-                        transferBillsResult = (TransferBillsResult)sendRedPacket.get("data");
-                        redPacketLog.setResult(JSON.toJSONString(sendRedPacket));
-                        redPacketLog.setOutBatchNo(transferBillsResult.getOutBillNo());
-                    }else {
-                        redPacketLog.setOutBatchNo(sendRedPacket.get("orderCode").toString());
-                        redPacketLog.setBatchId(sendRedPacket.get("batchId").toString());
-                    }
-                    // 添加红包记录
-                    //redPacketLog.setCourseId(param.getCourseId());
-                    //redPacketLog.setCompanyId(param.getCompanyId());
-                    redPacketLog.setUserId(reward.getFsUserId());
-                    //redPacketLog.setVideoId(reward.getVideoId()); 注册登录奖励无视频小节id
-                    redPacketLog.setStatus(0);
-                    redPacketLog.setCreateTime(new Date());
-                    redPacketLog.setAmount(reward.getRewardAmount());
-                    //redPacketLog.setWatchLogId(log.getLogId() != null ? log.getLogId() : null);
-                    //redPacketLog.setPeriodId(param.getPeriodId());
-                    //redPacketLog.setAppId(param.getAppId());
-
-                    redPacketLogMapper.insertFsCourseRedPacketLog(redPacketLog);
+                    FsAppRewardCourseRedPacketLog record=new FsAppRewardCourseRedPacketLog();
+                    record.setUserId(fsUser.getUserId());
+                    record.setActivityType(ActivityTypeEnum.FIRST_LOGIN.getCode());
+                    record.setAmount(reward.getRewardAmount());
+                    record.setVideoId(reward.getGoodsId());
+                    record.setCreateTime(DateUtils.getNowDate());
+                    appRewardCourseRedPacketLogMapper.insert(record);
                 } else {
                     return RewardResult.fail("红包发放失败,请联系客服");
                 }

+ 13 - 23
fs-service/src/main/java/com/fs/his/strategy/impl/WatchCourseRedPacketStrategy.java

@@ -2,12 +2,15 @@ package com.fs.his.strategy.impl;
 
 import com.alibaba.fastjson.JSON;
 import com.fs.common.core.domain.R;
+import com.fs.common.utils.DateUtils;
 import com.fs.core.config.WxOpenProperties;
 import com.fs.course.domain.FsCourseRedPacketLog;
 import com.fs.course.mapper.FsCourseRedPacketLogMapper;
+import com.fs.his.domain.FsAppRewardCourseRedPacketLog;
 import com.fs.his.domain.FsUser;
 import com.fs.his.domain.FsUserRewards;
 import com.fs.his.enums.ActivityTypeEnum;
+import com.fs.his.mapper.FsAppRewardCourseRedPacketLogMapper;
 import com.fs.his.mapper.FsUserMapper;
 import com.fs.his.param.WxSendRedPacketParam;
 import com.fs.his.service.IFsStorePaymentService;
@@ -35,6 +38,9 @@ public class WatchCourseRedPacketStrategy implements RewardStrategy {
 
     @Autowired
     private WxOpenProperties openProperties;
+
+    @Autowired
+    private FsAppRewardCourseRedPacketLogMapper appRewardCourseRedPacketLogMapper;
     @Override
     public RewardResult process(FsUserRewards reward) {
         log.info("处理看课红包发放: rewardId={}", reward.getId());
@@ -48,29 +54,13 @@ public class WatchCourseRedPacketStrategy implements RewardStrategy {
                 //调用发送红包接口逻辑
                 R sendRedPacket = fsStorePaymentService.sendRedPacketAppReward(param);
                 if (sendRedPacket.get("code").equals(200)) {
-                    FsCourseRedPacketLog redPacketLog = new FsCourseRedPacketLog();
-                    TransferBillsResult transferBillsResult;
-                    if (sendRedPacket.get("isNew").equals(1)){
-                        transferBillsResult = (TransferBillsResult)sendRedPacket.get("data");
-                        redPacketLog.setResult(JSON.toJSONString(sendRedPacket));
-                        redPacketLog.setOutBatchNo(transferBillsResult.getOutBillNo());
-                    }else {
-                        redPacketLog.setOutBatchNo(sendRedPacket.get("orderCode").toString());
-                        redPacketLog.setBatchId(sendRedPacket.get("batchId").toString());
-                    }
-                    // 添加红包记录
-                    //redPacketLog.setCourseId(param.getCourseId());
-                    //redPacketLog.setCompanyId(param.getCompanyId());
-                    redPacketLog.setUserId(reward.getFsUserId());
-                    redPacketLog.setVideoId(reward.getVideoId());
-                    redPacketLog.setStatus(0);
-                    redPacketLog.setCreateTime(new Date());
-                    redPacketLog.setAmount(reward.getRewardAmount());
-                    //redPacketLog.setWatchLogId(log.getLogId() != null ? log.getLogId() : null);
-                    //redPacketLog.setPeriodId(param.getPeriodId());
-                    //redPacketLog.setAppId(param.getAppId());
-
-                    redPacketLogMapper.insertFsCourseRedPacketLog(redPacketLog);
+                    FsAppRewardCourseRedPacketLog record=new FsAppRewardCourseRedPacketLog();
+                    record.setUserId(fsUser.getUserId());
+                    record.setActivityType(ActivityTypeEnum.WATCH_COURSE.getCode());
+                    record.setAmount(reward.getRewardAmount());
+                    record.setVideoId(reward.getGoodsId());
+                    record.setCreateTime(DateUtils.getNowDate());
+                    appRewardCourseRedPacketLogMapper.insert(record);
                 } else {
                     return RewardResult.fail("红包发放失败,请联系客服");
                 }

+ 125 - 0
fs-service/src/main/resources/mapper/his/FsAppRewardCourseRedPacketLogMapper.xml

@@ -0,0 +1,125 @@
+<?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.fs.his.mapper.FsAppRewardCourseRedPacketLogMapper">
+
+    <!-- 实体类与数据库字段映射关系 -->
+    <resultMap type="com.fs.his.domain.FsAppRewardCourseRedPacketLog" id="BaseResultMap">
+        <id property="logId" column="log_id"/>
+        <result property="userId" column="user_id"/>
+        <result property="videoId" column="video_id"/>
+        <result property="activityType" column="activity_type"/>
+        <result property="amount" column="amount"/>
+        <result property="createTime" column="create_time"/>
+        <result property="updateTime" column="update_time"/>
+        <result property="remark" column="remark"/>
+    </resultMap>
+
+    <!-- 基础字段列表 -->
+    <sql id="baseColumns">
+        select log_id, user_id, video_id, activity_type, amount,
+        create_time, update_time, remark from fs_app_reward_course_red_packet_log
+    </sql>
+
+    <!-- 根据ID查询 -->
+    <select id="selectById" parameterType="Long" resultMap="BaseResultMap">
+        <include refid="baseColumns"/>
+        WHERE log_id = #{logId}
+    </select>
+
+    <!-- 根据用户ID查询 -->
+    <select id="selectByUserId" parameterType="Long" resultMap="BaseResultMap">
+        <include refid="baseColumns"/>
+        WHERE user_id = #{userId}
+        ORDER BY create_time DESC
+    </select>
+
+    <!-- 根据视频ID查询 -->
+    <select id="selectByVideoId" parameterType="Long" resultMap="BaseResultMap">
+        <include refid="baseColumns"/>
+        WHERE video_id = #{videoId}
+        ORDER BY create_time DESC
+    </select>
+
+    <!-- 根据用户ID和视频ID查询 -->
+    <select id="selectByUserIdAndVideoId" resultMap="BaseResultMap">
+        <include refid="baseColumns"/>
+        WHERE user_id = #{userId} AND video_id = #{videoId}
+        ORDER BY create_time DESC
+        LIMIT 1
+    </select>
+
+    <!-- 根据活动类型查询 -->
+    <select id="selectByActivityType" parameterType="String" resultMap="BaseResultMap">
+        <include refid="baseColumns"/>
+        WHERE activity_type = #{activityType}
+        ORDER BY create_time DESC
+    </select>
+
+    <!-- 条件查询列表 -->
+    <select id="selectList" parameterType="com.fs.his.domain.FsAppRewardCourseRedPacketLog" resultMap="BaseResultMap">
+        <include refid="baseColumns"/>
+        <where>
+            <if test="userId != null"> AND user_id = #{userId}</if>
+            <if test="videoId != null"> AND video_id = #{videoId}</if>
+            <if test="activityType != null and activityType != ''"> AND activity_type = #{activityType}</if>
+            <if test="amount != null"> AND amount = #{amount}</if>
+            <if test="remark != null and remark != ''"> AND remark LIKE CONCAT('%', #{remark}, '%')</if>
+        </where>
+        ORDER BY create_time DESC
+    </select>
+
+    <!-- 新增记录 -->
+    <insert id="insert" parameterType="com.fs.his.domain.FsAppRewardCourseRedPacketLog" useGeneratedKeys="true" keyProperty="logId">
+        INSERT INTO fs_app_reward_course_red_packet_log
+        <trim prefix="(" suffix=")" suffixOverrides=",">
+            <if test="userId != null">user_id,</if>
+            <if test="videoId != null">video_id,</if>
+            <if test="activityType != null and activityType != ''">activity_type,</if>
+            <if test="amount != null">amount,</if>
+            <if test="remark != null and remark != ''">remark,</if>
+            create_time,
+            update_time
+        </trim>
+        <trim prefix="VALUES (" suffix=")" suffixOverrides=",">
+            <if test="userId != null">#{userId},</if>
+            <if test="videoId != null">#{videoId},</if>
+            <if test="activityType != null and activityType != ''">#{activityType},</if>
+            <if test="amount != null">#{amount},</if>
+            <if test="remark != null and remark != ''">#{remark},</if>
+            SYSDATE(),
+            SYSDATE()
+        </trim>
+    </insert>
+
+    <!-- 修改记录 -->
+    <update id="update" parameterType="com.fs.his.domain.FsAppRewardCourseRedPacketLog">
+        UPDATE fs_app_reward_course_red_packet_log
+        <set>
+            <if test="userId != null">user_id = #{userId},</if>
+            <if test="videoId != null">video_id = #{videoId},</if>
+            <if test="activityType != null and activityType != ''">activity_type = #{activityType},</if>
+            <if test="amount != null">amount = #{amount},</if>
+            <if test="remark != null and remark != ''">remark = #{remark},</if>
+            update_time = SYSDATE()
+        </set>
+        WHERE log_id = #{logId}
+    </update>
+
+    <!-- 删除记录 -->
+    <delete id="deleteById" parameterType="Long">
+        DELETE FROM fs_app_reward_course_red_packet_log
+        WHERE log_id = #{logId}
+    </delete>
+
+    <!-- 批量删除 -->
+    <delete id="deleteByIds" parameterType="Long">
+        DELETE FROM fs_app_reward_course_red_packet_log
+        WHERE log_id IN
+        <foreach collection="logIds" item="logId" open="(" separator="," close=")">
+            #{logId}
+        </foreach>
+    </delete>
+
+</mapper>

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

@@ -33,6 +33,7 @@ import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import lombok.Synchronized;
 import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.collections4.CollectionUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.ibatis.annotations.Param;
 import org.slf4j.Logger;
@@ -310,7 +311,11 @@ public class AppLoginController extends AppBaseController{
         String phone = map.get("phone");
         String code = map.get("code");
         String encryptPhone = encryptPhone(phone);
-        List<FsUser> user = userService.selectFsUserListByPhone(encryptPhone);
+        List<FsUser> user;
+        user = userService.selectFsUserListByPhone(encryptPhone);
+        if (CollectionUtils.isEmpty(user)){
+            user=userService.selectFsUserListByPhone(phone);//如果加密后的电话号码没有搜到就直接用号码搜索
+        }
         logger.info("加密手机号查询用户列表数据:{}", JsonUtils.toJson(user));
         if (CollectionUtil.isEmpty(user)){
             user = userService.selectFsUserListByPhone(encryptPhoneOldKey(phone));