|
|
@@ -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);
|