浏览代码

积分也扣钱-走实时扣款

三七 1 天之前
父节点
当前提交
c2376795d5
共有 1 个文件被更改,包括 66 次插入1 次删除
  1. 66 1
      fs-service/src/main/java/com/fs/course/service/impl/FsUserCourseVideoServiceImpl.java

+ 66 - 1
fs-service/src/main/java/com/fs/course/service/impl/FsUserCourseVideoServiceImpl.java

@@ -3258,10 +3258,20 @@ public class FsUserCourseVideoServiceImpl extends ServiceImpl<FsUserCourseVideoM
      * @return 处理结果
      */
     private R sendIntegralReward(FsCourseSendRewardUParam param, FsUser user, FsCourseWatchLog log, CourseConfig config) {
+
+
         Integer answerIntegral = resolveFinishCourseIntegral(param.getVideoId(), config);
         if (answerIntegral == null || answerIntegral <= 0) {
             return R.error("完课积分未配置");
         }
+
+        BigDecimal divideInter = BigDecimal.valueOf(answerIntegral).divide(BigDecimal.valueOf(1000));
+
+        //今正积分也扣钱
+        R deductResult = deductCompanyBalanceForJinzheng(param, config, divideInter);
+        if (deductResult != null) {
+            return deductResult;
+        }
         // 更新用户积分
         FsUser userMap = new FsUser();
         userMap.setUserId(user.getUserId());
@@ -3303,7 +3313,7 @@ public class FsUserCourseVideoServiceImpl extends ServiceImpl<FsUserCourseVideoM
         redPacketLog.setQwUserId(param.getQwUserId() != null ? param.getQwUserId() : null);
         redPacketLog.setCompanyUserId(param.getCompanyUserId());
         redPacketLog.setCreateTime(new Date());
-        redPacketLog.setAmount(BigDecimal.valueOf(answerIntegral).divide(BigDecimal.valueOf(1000)));
+        redPacketLog.setAmount(divideInter);
         redPacketLog.setRemark("点播答题领取积分转");
         redPacketLog.setWatchLogId(log.getLogId() != null ? log.getLogId() : null);
         redPacketLog.setPeriodId(param.getPeriodId());
@@ -3327,6 +3337,61 @@ public class FsUserCourseVideoServiceImpl extends ServiceImpl<FsUserCourseVideoM
         return config != null ? config.getAnswerIntegral() : null;
     }
 
+    /**
+     * 今正科技:积分发放时预扣减服务商余额
+     *
+     * @return null 表示扣减成功继续执行;非null 为错误结果需直接返回
+     */
+    private R deductCompanyBalanceForJinzheng(FsCourseSendRewardUParam param, CourseConfig config, BigDecimal divideInter) {
+        if (!CloudHostUtils.hasCloudHostName("今正科技") || !"1".equals(config.getIsRedPackageBalanceDeduction())) {
+            return null;
+        }
+
+        String companyMoneyKey = FsConstants.COMPANY_MONEY_KEY + param.getCompanyId();
+        RLock lock = redissonClient.getLock(FsConstants.COMPANY_MONEY_LOCK + param.getCompanyId());
+        boolean lockAcquired = false;
+        BigDecimal newMoney;
+        try {
+            if (lock.tryLock(3, 10, TimeUnit.SECONDS)) {
+                lockAcquired = true;
+                BigDecimal originalMoney;
+                // 获取当前余额
+                String moneyStr = redisCache.getCacheObject(companyMoneyKey);
+                if (StringUtils.isNotEmpty(moneyStr)) {
+                    originalMoney = new BigDecimal(moneyStr);
+                } else {
+                    // 缓存没有值,重启系统恢复redis数据 保证数据正确性
+                    logger.error("发送红包获取redis余额缓存异常,异常请求参数{}", param);
+                    return R.error("系统异常,请稍后重试");
+                }
+
+                if (originalMoney.compareTo(BigDecimal.ZERO) < 0) {
+                    logger.error("服务商余额不足,异常请求参数{}", param);
+                    return R.error("服务商余额不足,请联系群主服务器充值!");
+                }
+
+                // 预扣减金额
+                newMoney = originalMoney.subtract(divideInter);
+                redisCache.setCacheObject(companyMoneyKey, newMoney.toString());
+            } else {
+                logger.error("获取redis锁失败,异常请求参数{}", param);
+                return R.error("系统繁忙,请稍后重试");
+            }
+        } catch (Exception e) {
+            logger.error("预扣减余额失败: 异常请求参数{},异常信息{}", param, e.getMessage(), e);
+            return R.error("系统异常,请稍后重试");
+        } finally {
+            if (lockAcquired && lock.isHeldByCurrentThread()) {
+                try {
+                    lock.unlock();
+                } catch (IllegalMonitorStateException e) {
+                    logger.warn("尝试释放非当前线程持有的锁: companyId={}", param.getCompanyId());
+                }
+            }
+        }
+        return null;
+    }
+
     @Override
     public List<FsUserCourseVideoPageListVO> pageListCourseVideo(UserCourseVideoPageParam param) {
         List<FsUserCourseVideoPageListVO> courseVideoPageListVOList = fsUserCourseVideoMapper.selectFsUserCourseVideoPageList(param);