Browse Source

95:红德堂APP调试 答题、发红包代码同步

Long 1 week ago
parent
commit
5095256ff2

+ 4 - 0
fs-service/src/main/java/com/fs/course/domain/FsCourseRedPacketLog.java

@@ -59,4 +59,8 @@ public class FsCourseRedPacketLog extends BaseEntity
 
     private String result;
 
+    private String batchId;//微信批次单号
+
+    private String appId;//小程序appId
+
 }

+ 2 - 0
fs-service/src/main/java/com/fs/course/param/FsCourseSendRewardUParam.java

@@ -29,4 +29,6 @@ public class FsCourseSendRewardUParam implements Serializable
 
     private String appId;
 
+    private String code;
+
 }

+ 27 - 34
fs-service/src/main/java/com/fs/course/service/impl/FsCourseQuestionBankServiceImpl.java

@@ -241,7 +241,11 @@ public class FsCourseQuestionBankServiceImpl implements IFsCourseQuestionBankSer
 
     @Override
     @Transactional
-    public R courseAnswer(FsCourseQuestionAnswerUParam param,Boolean isH5User) {
+    public R courseAnswer(FsCourseQuestionAnswerUParam param, Boolean isH5User) {
+        FsUser user = fsUserMapper.selectFsUserByUserId(param.getUserId());
+        if (user==null){
+            return R.error("未识别到领取信息");
+        }
         //获取配置参数
         String json = configService.selectConfigByKey("course.config");
         CourseConfig config = JSONUtil.toBean(json, CourseConfig.class);
@@ -254,46 +258,35 @@ public class FsCourseQuestionBankServiceImpl implements IFsCourseQuestionBankSer
         //日志id
         Long logId = null;
 
-        FsCourseAnswerLogs rightLog = new FsCourseAnswerLogs();
+        new FsCourseAnswerLogs();
+        FsCourseAnswerLogs rightLog;
         //判断短链类型
-        if (param.getLinkType()!=null&&param.getLinkType()==1){
-            rightLog = courseAnswerLogsMapper.selectRightLogByCourseVideo(param.getVideoId(), param.getUserId(),null);
-            if (rightLog!=null){
-                return R.error("该课程已答题完成,不可重复答题");
-            }
-            errorCount = courseAnswerLogsMapper.selectErrorCountByCourseVideo(param.getVideoId(), param.getUserId(),null);
 
-        }else {
-            FsCourseWatchLog log;
-            if(isH5User){
-                log = courseWatchLogMapper.getWatchLogByFsUser(param.getVideoId(), param.getUserId(), param.getCompanyUserId());
-            } else {
-                log = courseWatchLogMapper.getWatchCourseVideo(param.getUserId(), param.getVideoId(), param.getQwUserId(), param.getQwExternalId());
-            }
-            if (log==null){
-                return R.error("无记录");
-            }
-            if (log.getLogType()!=2){
-                return R.error("未完课");
-            }
-            logId = log.getLogId();
-
-            rightLog = courseAnswerLogsMapper.selectRightLogByCourseVideo(param.getVideoId(), param.getUserId(), param.getQwUserId());
-            if (rightLog != null) {
-                if (log.getRewardType() != null) {
-                    // 增加判断,去查询红包记录是否已发送成功,如果成功,则返回当前提示,否则返回答题成功(让其可以继续答题,直到红包领取完成)
-                    FsCourseRedPacketLog fsCourseRedPacketLog = redPacketLogMapper.selectUserFsCourseRedPacketLog(param.getVideoId(), param.getUserId(),param.getPeriodId());
-                    if(fsCourseRedPacketLog != null && fsCourseRedPacketLog.getStatus() == 1) {
-                        return R.error("该课程已答题完成,不可重复答题");
-                    } else {
-                        return R.ok("答题成功");
-                    }
+        FsCourseWatchLog log = courseWatchLogMapper.getWatchLogByFsUser(param.getVideoId(), param.getUserId(), param.getCompanyUserId());
+        if (log==null){
+            return R.error("无记录");
+        }
+        if (log.getLogType()!=2){
+            return R.error("未完课");
+        }
+        logId = log.getLogId();
+
+        rightLog = courseAnswerLogsMapper.selectRightLogByCourseVideo(param.getVideoId(), param.getUserId(), param.getQwUserId());
+        if (rightLog != null) {
+            if (log.getRewardType() != null) {
+                // 增加判断,去查询红包记录是否已发送成功,如果成功,则返回当前提示,否则返回答题成功(让其可以继续答题,直到红包领取完成)
+                FsCourseRedPacketLog fsCourseRedPacketLog = redPacketLogMapper.selectUserFsCourseRedPacketLog(param.getVideoId(), param.getUserId(),param.getPeriodId());
+                if(fsCourseRedPacketLog != null && fsCourseRedPacketLog.getStatus() == 1) {
+                    return R.error("该课程已答题完成,不可重复答题");
                 } else {
                     return R.ok("答题成功");
                 }
+            } else {
+                return R.ok("答题成功");
             }
-            errorCount = courseAnswerLogsMapper.selectErrorCountByCourseVideo(param.getVideoId(), param.getUserId(),param.getQwUserId());
         }
+        errorCount = courseAnswerLogsMapper.selectErrorCountByCourseVideo(param.getVideoId(), param.getUserId(),param.getQwUserId());
+
 
 
         if (errorCount >= config.getAnswerErrorCount()) {

+ 75 - 58
fs-service/src/main/java/com/fs/course/service/impl/FsUserCourseVideoServiceImpl.java

@@ -863,28 +863,21 @@ public class FsUserCourseVideoServiceImpl implements IFsUserCourseVideoService
         FsCourseWatchLog log = new FsCourseWatchLog();
 
         // 根据链接类型判断是否已发放奖励
-        log = courseWatchLogMapper.getWatchCourseVideo(param.getUserId(), param.getVideoId(), param.getQwUserId(), param.getQwExternalId());
-        if (log == null) {
-            return R.error("无记录");
-        }
-        if (log.getRewardType() != null) {
+        if (param.getLinkType() != null && param.getLinkType() == 1) {
             FsCourseRedPacketLog packetLog = redPacketLogMapper.selectFsCourseRedPacketLogByTemporary(param.getVideoId(), param.getUserId());
-            if(packetLog != null && packetLog.getStatus() == 1) {
+            if (packetLog != null) {
                 return R.error("奖励已发放");
             }
-            if(packetLog != null && packetLog.getStatus() == 0) {
-                if(StringUtils.isNotEmpty(packetLog.getResult())){
-                    R r = JSON.parseObject(packetLog.getResult(), R.class);
-                    return r;
-                } else {
-                    return R.error("奖励已发放");
-                }
+        } else {
+            log = courseWatchLogMapper.getWatchCourseVideo(param.getUserId(), param.getVideoId(), param.getQwUserId(), param.getQwExternalId());
+            if (log == null) {
+                return R.error("无记录");
             }
-            if(packetLog != null && packetLog.getStatus() == 2) {
-                return R.error("请联系客服补发");
+            if (log.getRewardType() != null) {
+                return R.error("奖励已发放");
             }
-            return R.error("奖励已发放");
         }
+
         // 获取视频信息
         FsUserCourseVideo video = fsUserCourseVideoMapper.selectFsUserCourseVideoByVideoId(param.getVideoId());
 
@@ -962,6 +955,19 @@ public class FsUserCourseVideoServiceImpl implements IFsUserCourseVideoService
      * @return 处理结果
      */
     private R sendRedPacketReward(FsCourseSendRewardUParam param, FsUser user, FsCourseWatchLog log, FsUserCourseVideo video, CourseConfig config) {
+        // 判断是否属于领取红包时间(会员看课发放红包)
+        FsUserCoursePeriodDays periodDays = new FsUserCoursePeriodDays();
+        periodDays.setVideoId(param.getVideoId());
+        periodDays.setPeriodId(param.getPeriodId());
+        //正常情况是只能查询到一条,之前可能存在重复的脏数据,暂使用查询list的方式
+        List<FsUserCoursePeriodDays> fsUserCoursePeriodDays = fsUserCoursePeriodDaysMapper.selectFsUserCoursePeriodDaysList(periodDays);
+        if(fsUserCoursePeriodDays != null && !fsUserCoursePeriodDays.isEmpty()){
+            periodDays = fsUserCoursePeriodDays.get(0);
+        }
+
+        if(periodDays != null && periodDays.getLastJoinTime() !=null && LocalDateTime.now().isAfter(periodDays.getLastJoinTime())) {
+            return R.error(403,"已超过领取红包时间");
+        }
 
         // 确定红包金额
         BigDecimal amount = BigDecimal.ZERO;
@@ -977,46 +983,39 @@ public class FsUserCourseVideoServiceImpl implements IFsUserCourseVideoService
         WxSendRedPacketParam packetParam = new WxSendRedPacketParam();
         packetParam.setOpenId(user.getMpOpenId());
         // 来源是小程序切换openId
+//        if (param.getSource() == 2) {
+//            packetParam.setOpenId(user.getMaOpenId());
+//        }
         if (param.getSource() == 2) {
-            //处理多小程序问题
             FsUserWx fsUserWx = fsUserWxService.selectByAppIdAndUserId(param.getAppId(),user.getUserId(),1);
-            if (fsUserWx ==null || fsUserWx.getOpenId()==null){
-                packetParam.setOpenId(user.getCourseMaOpenId());
+            if (fsUserWx ==null){
+                packetParam.setOpenId(user.getMaOpenId());
+                try {
+                    handleFsUserWx(user,param.getAppId());
+                } catch (Exception e){
+                    e.printStackTrace();
+                    logger.error(e.getMessage(),e);
+                }
+
             }else {
+                //查出openid并赋值
                 packetParam.setOpenId(fsUserWx.getOpenId());
             }
-            //查出公司绑定openid并赋值
+
 
         }
         packetParam.setAmount(amount);
         packetParam.setSource(param.getSource());
         packetParam.setRedPacketMode(config.getRedPacketMode());
         packetParam.setCompanyId(param.getCompanyId());
+        packetParam.setAppId(param.getAppId());
+        if (StringUtils.isNotEmpty(param.getCode())){
+            packetParam.setCode(param.getCode());
+            packetParam.setUser(user);
+        }
 
-        System.out.println("红包金额"+amount);
-        System.out.println("红包商户号"+packetParam);
-        //2025.6.19 红包金额为0的时候
+        //2025.7.11 红包金额为0的时候
         if (amount.compareTo(BigDecimal.ZERO)>0){
-
-            Company company = companyMapper.selectCompanyByIdForUpdate(param.getCompanyId());
-            BigDecimal money = company.getMoney();
-            BigDecimal subtract = money.subtract(amount);
-            if (subtract.compareTo(BigDecimal.ZERO)<0){
-                FsCourseRedPacketLog redPacketLog = new FsCourseRedPacketLog();
-                redPacketLog.setCourseId(param.getCourseId());
-                redPacketLog.setCompanyId(param.getCompanyId());
-                redPacketLog.setUserId(param.getUserId());
-                redPacketLog.setVideoId(param.getVideoId());
-                redPacketLog.setStatus(2);
-                redPacketLog.setQwUserId(param.getQwUserId() != null ? param.getQwUserId() : null);
-                redPacketLog.setCompanyUserId(param.getCompanyUserId());
-                redPacketLog.setCreateTime(new Date());
-                redPacketLog.setAmount(amount);
-                redPacketLog.setWatchLogId(log.getLogId() != null ? log.getLogId() : null);
-                redPacketLog.setPeriodId(param.getPeriodId());
-                redPacketLogMapper.insertFsCourseRedPacketLog(redPacketLog);
-                return R.error("销售公司余额不足");
-            }
             // 发送红包
             R sendRedPacket = paymentService.sendRedPacket(packetParam);
             if (sendRedPacket.get("code").equals(200)) {
@@ -1026,8 +1025,10 @@ public class FsUserCourseVideoServiceImpl implements IFsUserCourseVideoService
                     transferBillsResult = (TransferBillsResult)sendRedPacket.get("data");
                     redPacketLog.setResult(JSON.toJSONString(sendRedPacket));
                     redPacketLog.setOutBatchNo(transferBillsResult.getOutBillNo());
+                    redPacketLog.setBatchId(transferBillsResult.getTransferBillNo());
                 }else {
                     redPacketLog.setOutBatchNo(sendRedPacket.get("orderCode").toString());
+                    redPacketLog.setBatchId(sendRedPacket.get("batchId").toString());
                 }
                 // 添加红包记录
                 redPacketLog.setCourseId(param.getCourseId());
@@ -1042,28 +1043,22 @@ public class FsUserCourseVideoServiceImpl implements IFsUserCourseVideoService
                 redPacketLog.setAmount(amount);
                 redPacketLog.setWatchLogId(log.getLogId() != null ? log.getLogId() : null);
                 redPacketLog.setPeriodId(param.getPeriodId());
+                redPacketLog.setAppId(param.getAppId());
+
                 redPacketLogMapper.insertFsCourseRedPacketLog(redPacketLog);
 
                 // 更新观看记录的奖励类型
+//            if (param.getLinkType() == null || param.getLinkType() == 0) {
                 log.setRewardType(config.getRewardType());
                 courseWatchLogMapper.updateFsCourseWatchLog(log);
-                company.setMoney(subtract);
-                companyMapper.updateCompany(company);
-
-                CompanyMoneyLogs logs=new CompanyMoneyLogs();
-                logs.setCompanyId(company.getCompanyId());
-                logs.setRemark("扣除红包金额");
-                logs.setMoney(amount.multiply(new BigDecimal(-1)));
-                logs.setLogsType(15);
-                logs.setBalance(company.getMoney());
-                logs.setCreateTime(new Date());
-                moneyLogsMapper.insertCompanyMoneyLogs(logs);
-
+//            }
                 return sendRedPacket;
             } else {
                 return R.error("奖励发送失败,请联系客服");
             }
+
         } else {
+            // 发送红包
             FsCourseRedPacketLog redPacketLog = new FsCourseRedPacketLog();
             // 添加红包记录
             redPacketLog.setCourseId(param.getCourseId());
@@ -1071,7 +1066,8 @@ public class FsUserCourseVideoServiceImpl implements IFsUserCourseVideoService
             redPacketLog.setCompanyId(param.getCompanyId());
             redPacketLog.setUserId(param.getUserId());
             redPacketLog.setVideoId(param.getVideoId());
-            redPacketLog.setStatus(0);
+            redPacketLog.setStatus(1);//直接设置发送成功
+            redPacketLog.setResult("{\"msg\":\"发送0红包成功\",\"code\":200,\"isNew\":1}");
             redPacketLog.setQwUserId(param.getQwUserId() != null ? param.getQwUserId() : null);
             redPacketLog.setCompanyUserId(param.getCompanyUserId());
             redPacketLog.setCreateTime(new Date());
@@ -1081,13 +1077,34 @@ public class FsUserCourseVideoServiceImpl implements IFsUserCourseVideoService
             redPacketLogMapper.insertFsCourseRedPacketLog(redPacketLog);
 
             // 更新观看记录的奖励类型
-//            if (param.getLinkType() == null || param.getLinkType() == 0) {
             log.setRewardType(config.getRewardType());
             courseWatchLogMapper.updateFsCourseWatchLog(log);
-//            }
             return R.ok("红包发送成功");
         }
+    }
 
+    private void handleFsUserWx(FsUser user, String appId) {
+        // 尝试更新
+        boolean updated = fsUserWxService.lambdaUpdate()
+                .eq(FsUserWx::getFsUserId, user.getUserId())
+                .eq(FsUserWx::getAppId,appId )
+                .eq(FsUserWx::getOpenId, user.getMaOpenId())
+//                .set(FsUserWx::getUnionId, session.getUnionid() == null ? "" : session.getUnionid())
+                .set(FsUserWx::getUpdateTime, new Date())
+                .update();
+
+        // 如果更新失败(记录不存在),则插入
+        if (!updated) {
+            FsUserWx fsUserWx = new FsUserWx();
+            fsUserWx.setType(1);
+            fsUserWx.setFsUserId(user.getUserId());
+            fsUserWx.setAppId(appId);
+            fsUserWx.setOpenId(user.getMaOpenId());
+//            fsUserWx.setUnionId(session.getUnionid() == null ? "" : session.getUnionid());
+            fsUserWx.setCreateTime(new Date());
+            fsUserWx.setUpdateTime(new Date());
+            fsUserWxService.save(fsUserWx);
+        }
     }
 
     /**

+ 12 - 4
fs-service/src/main/java/com/fs/his/param/WxSendRedPacketParam.java

@@ -1,5 +1,6 @@
 package com.fs.his.param;
 
+import com.fs.his.domain.FsUser;
 import lombok.Data;
 
 import java.io.Serializable;
@@ -10,12 +11,19 @@ public class WxSendRedPacketParam implements Serializable {
 
     private String openId;
 
-    private BigDecimal amount;
+    private BigDecimal amount; //金额
 
-    private Integer source=1;//来源 1:h5  2:小程序
+    private Long companyId; //公司id
 
-    private Integer redPacketMode;
+    private Integer source=1;//来源 1:h5  2:看课小程序
 
-    private Long companyId;
+    private Integer redPacketMode;//红包模式
+
+    private String appId;
+
+    private String code;
+
+
+    private FsUser user;
 
 }

+ 9 - 1
fs-service/src/main/resources/mapper/course/FsCourseRedPacketLogMapper.xml

@@ -21,10 +21,12 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         <result property="remark"    column="remark"    />
         <result property="result"    column="result"    />
         <result property="periodId"    column="period_id"    />
+        <result property="batchId"    column="batch_id"    />
+        <result property="appId"    column="app_id"    />
     </resultMap>
 
     <sql id="selectFsCourseRedPacketLogVo">
-        select log_id,watch_log_id, remark,out_batch_no,status,update_time,course_id, user_id, video_id, company_user_id, company_id, amount, create_time, qw_user_id,period_id from fs_course_red_packet_log
+        select log_id,watch_log_id, remark,out_batch_no,status,update_time,course_id, user_id, video_id, company_user_id, company_id, amount, create_time, qw_user_id,period_id,result,app_id,batch_id from fs_course_red_packet_log
     </sql>
 
     <select id="selectFsCourseRedPacketLogList" parameterType="FsCourseRedPacketLog" resultMap="FsCourseRedPacketLogResult">
@@ -105,6 +107,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <if test="remark != null">remark,</if>
             <if test="periodId != null">period_id,</if>
             <if test="result != null">result,</if>
+            <if test="batchId != null">batch_id,</if>
+            <if test="appId != null">app_id,</if>
          </trim>
         <trim prefix="values (" suffix=")" suffixOverrides=",">
             <if test="courseId != null">#{courseId},</if>
@@ -122,6 +126,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <if test="remark != null">#{remark},</if>
             <if test="periodId != null">#{periodId},</if>
             <if test="result != null">#{result},</if>
+            <if test="batchId != null">#{batchId},</if>
+            <if test="appId != null">#{appId},</if>
         </trim>
     </insert>
 
@@ -142,6 +148,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <if test="watchLogId != null">watch_log_id = #{watchLogId},</if>
             <if test="periodId != null">period_id = #{periodId},</if>
             <if test="remark != null">remark = #{remark},</if>
+            <if test="batchId != null">batch_id = #{batchId},</if>
+            <if test="appId != null">app_id = #{appId},</if>
         </trim>
         where log_id = #{logId}
     </update>