|
|
@@ -1,6 +1,8 @@
|
|
|
package com.fs.live.service.impl;
|
|
|
|
|
|
import java.math.BigDecimal;
|
|
|
+import java.text.SimpleDateFormat;
|
|
|
+import java.util.ArrayList;
|
|
|
import java.util.Date;
|
|
|
import java.util.List;
|
|
|
import java.util.Objects;
|
|
|
@@ -42,6 +44,7 @@ import com.fs.live.mapper.LiveMapper;
|
|
|
import com.fs.live.service.ILiveMsgService;
|
|
|
import com.fs.live.service.ILiveService;
|
|
|
import com.fs.live.service.ILiveWatchUserService;
|
|
|
+import com.fs.live.vo.RecordTimeRangeVO;
|
|
|
import com.fs.voice.utils.StringUtil;
|
|
|
import com.github.binarywang.wxpay.bean.transfer.TransferBillsResult;
|
|
|
import lombok.extern.slf4j.Slf4j;
|
|
|
@@ -200,7 +203,7 @@ public class LiveRedPacketLogServiceImpl extends ServiceImpl<LiveRedPacketLogMap
|
|
|
boolean isLocked = lock.tryLock(5, 120, TimeUnit.SECONDS);
|
|
|
if (!isLocked) {
|
|
|
logger.warn("直播获取锁失败,用户ID:{},直播ID:{}", param.getUserId(), param.getLiveId());
|
|
|
- return R.error("操作频繁,请稍后再试!");
|
|
|
+ return R.error("操作频繁,请2分钟后再试!");
|
|
|
}
|
|
|
|
|
|
// 从缓存里面更新一下时长
|
|
|
@@ -306,8 +309,51 @@ public class LiveRedPacketLogServiceImpl extends ServiceImpl<LiveRedPacketLogMap
|
|
|
//直播时长不满足,看录播 如果录播的时长看课时长 大于了 设定的百分比则 可以领取积分
|
|
|
if (replayUser != null && replayUser.getOnlineSeconds() != null
|
|
|
&& replayUser.getOnlineSeconds() * 100 >= duration * completionRate) {
|
|
|
- // 如果是 回放完课 发积分
|
|
|
- return sendLiveIntegralReward(param, user, watchUser, config);
|
|
|
+
|
|
|
+ // 如果是 回放完课 发积分 //新增 时间范围 范围内可以领取红包,范围外领取积分或者不领
|
|
|
+ if (config.getRecordRedPacketEnabled() && !StringUtil.strIsNullOrEmpty(config.getRecordTimeRangeStr())){
|
|
|
+
|
|
|
+ List<RecordTimeRangeVO> ranges = parseRecordRewards(config.getRecordTimeRangeStr());
|
|
|
+ RecordTimeRangeVO matched = matchCurrentTime(ranges);
|
|
|
+
|
|
|
+ if (matched != null) {
|
|
|
+ // 根据 rewardType 发放对应奖励 1=红包 2=积分
|
|
|
+ if ("1".equals(matched.getRewardType())) {
|
|
|
+
|
|
|
+ WxSendRedPacketParam packetParam = new WxSendRedPacketParam();
|
|
|
+
|
|
|
+ if (StringUtil.strIsNullOrEmpty(user.getAppOpenId())){
|
|
|
+ return R.error("请重新登录app");
|
|
|
+ }
|
|
|
+
|
|
|
+ // 用app的 appOpenId
|
|
|
+ String openId = user.getAppOpenId();
|
|
|
+ packetParam.setOpenId(openId);
|
|
|
+ BeanUtils.copyProperties(param, packetParam);
|
|
|
+
|
|
|
+ //重置红包数
|
|
|
+ config.setRedPacketAmount(matched.getRedPacketAmount());
|
|
|
+ return sendAppLiveRedPacketAuto(packetParam, watchUser, config, param);
|
|
|
+ }else if ("2".equals(matched.getRewardType())) {
|
|
|
+ //重置发放的积分
|
|
|
+ config.setScoreAmount(matched.getScoreAmount());
|
|
|
+ return sendLiveIntegralReward(param, user, watchUser, config);
|
|
|
+ }
|
|
|
+ }else {
|
|
|
+ return R.error("当前时间段,不满足领取奖励条件");
|
|
|
+ }
|
|
|
+ }else {
|
|
|
+ // 更新直播观看记录的奖励类型
|
|
|
+ watchUser.setRewardType(3);
|
|
|
+ watchUser.setSendType(1);
|
|
|
+
|
|
|
+ watchUserMapper.updateLiveWatchUser(watchUser);
|
|
|
+
|
|
|
+ log.error("未设置回放奖励里:{},{}",live.getLiveId(),config);
|
|
|
+ return R.ok("未设置回放奖励");
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
}else {
|
|
|
return R.error("观看时长未达到完课要求,请看继续观看回放,之后再领取");
|
|
|
}
|
|
|
@@ -334,8 +380,58 @@ public class LiveRedPacketLogServiceImpl extends ServiceImpl<LiveRedPacketLogMap
|
|
|
return R.error("观看时长未达到完课要求,请继续观看");
|
|
|
}
|
|
|
|
|
|
- // 如果是 回放完课 发积分
|
|
|
- return sendLiveIntegralReward(param, user, watchUser, config);
|
|
|
+ //新增 时间范围 范围内可以领取红包,范围外领取积分或者不领
|
|
|
+ // 如果是 回放完课 发积分 //新增 时间范围 范围内可以领取红包,范围外领取积分或者不领
|
|
|
+ if (config.getRecordRedPacketEnabled() && !StringUtil.strIsNullOrEmpty(config.getRecordTimeRangeStr())){
|
|
|
+
|
|
|
+ List<RecordTimeRangeVO> ranges = parseRecordRewards(config.getRecordTimeRangeStr());
|
|
|
+ RecordTimeRangeVO matched = matchCurrentTime(ranges);
|
|
|
+
|
|
|
+ if (matched != null) {
|
|
|
+ // 根据 rewardType 发放对应奖励 1=红包 2=积分
|
|
|
+ if ("1".equals(matched.getRewardType())) {
|
|
|
+
|
|
|
+ WxSendRedPacketParam packetParam = new WxSendRedPacketParam();
|
|
|
+
|
|
|
+ if (StringUtil.strIsNullOrEmpty(user.getAppOpenId())){
|
|
|
+ return R.error("请重新登录app");
|
|
|
+ }
|
|
|
+
|
|
|
+ // 用app的 appOpenId
|
|
|
+ String openId = user.getAppOpenId();
|
|
|
+ packetParam.setOpenId(openId);
|
|
|
+ BeanUtils.copyProperties(param, packetParam);
|
|
|
+
|
|
|
+ //重置红包数
|
|
|
+ config.setRedPacketAmount(matched.getRedPacketAmount());
|
|
|
+ return sendAppLiveRedPacketAuto(packetParam, watchUser, config, param);
|
|
|
+ }else if ("2".equals(matched.getRewardType())) {
|
|
|
+ //重置发放的积分
|
|
|
+ config.setScoreAmount(matched.getScoreAmount());
|
|
|
+ return sendLiveIntegralReward(param, user, watchUser, config);
|
|
|
+ }
|
|
|
+ }else {
|
|
|
+ return R.error("当前时间段,不满足领取奖励条件");
|
|
|
+ }
|
|
|
+ }else {
|
|
|
+ // 更新直播观看记录的奖励类型
|
|
|
+ watchUser.setRewardType(3);
|
|
|
+ watchUser.setSendType(1);
|
|
|
+
|
|
|
+ watchUserMapper.updateLiveWatchUser(watchUser);
|
|
|
+ log.error("未设置回放奖励内:{},{}",live.getLiveId(),config);
|
|
|
+ return R.ok("未设置回放奖励");
|
|
|
+ }
|
|
|
+
|
|
|
+ // 更新直播观看记录的奖励类型
|
|
|
+ watchUser.setRewardType(3);
|
|
|
+ watchUser.setSendType(1);
|
|
|
+
|
|
|
+ watchUserMapper.updateLiveWatchUser(watchUser);
|
|
|
+ log.error("回放未满足-奖励设置外:{},{}",live.getLiveId(),config);
|
|
|
+ return R.ok("未设置回放奖励");
|
|
|
+// // 如果是 回放完课 发积分
|
|
|
+// return sendLiveIntegralReward(param, user, watchUser, config);
|
|
|
}else {
|
|
|
return R.error("未知 直播观看类型 ");
|
|
|
}
|
|
|
@@ -352,6 +448,56 @@ public class LiveRedPacketLogServiceImpl extends ServiceImpl<LiveRedPacketLogMap
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+
|
|
|
+ public static List<RecordTimeRangeVO> parseRecordRewards(String recordTimeRangeStr) {
|
|
|
+ List<RecordTimeRangeVO> result = new ArrayList<>();
|
|
|
+ if (recordTimeRangeStr == null || recordTimeRangeStr.isEmpty()) {
|
|
|
+ return result;
|
|
|
+ }
|
|
|
+ String[] records = recordTimeRangeStr.split(",");
|
|
|
+ for (String record : records) {
|
|
|
+ String[] parts = record.split("-", 5);
|
|
|
+ if (parts.length < 3) continue;
|
|
|
+
|
|
|
+ RecordTimeRangeVO range = new RecordTimeRangeVO();
|
|
|
+ range.setStartTime(parts[0]);
|
|
|
+ range.setEndTime(parts[1]);
|
|
|
+ range.setRewardType(parts[2]);
|
|
|
+
|
|
|
+ if ("1".equals(parts[2]) && parts.length > 3 && !parts[3].isEmpty()) {
|
|
|
+ range.setRedPacketAmount(BigDecimal.valueOf(Double.parseDouble(parts[3])));
|
|
|
+ }
|
|
|
+ if ("2".equals(parts[2]) && parts.length > 4 && !parts[4].isEmpty()) {
|
|
|
+ range.setScoreAmount(Long.valueOf(parts[4]));
|
|
|
+ }
|
|
|
+
|
|
|
+ result.add(range);
|
|
|
+ }
|
|
|
+ return result;
|
|
|
+ }
|
|
|
+
|
|
|
+ private static int toMinutes(String timeStr) {
|
|
|
+ String[] parts = timeStr.split(":");
|
|
|
+ return Integer.parseInt(parts[0]) * 60 + Integer.parseInt(parts[1]);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 当前时间是否在某个时间段内
|
|
|
+ */
|
|
|
+ public static RecordTimeRangeVO matchCurrentTime(List<RecordTimeRangeVO> ranges) {
|
|
|
+ int nowMinutes = toMinutes(
|
|
|
+ new SimpleDateFormat("HH:mm").format(new Date())
|
|
|
+ );
|
|
|
+ for (RecordTimeRangeVO range : ranges) {
|
|
|
+ int start = toMinutes(range.getStartTime());
|
|
|
+ int end = toMinutes(range.getEndTime());
|
|
|
+ if (nowMinutes >= start && nowMinutes < end) {
|
|
|
+ return range;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+
|
|
|
@Override
|
|
|
public R syncLiveRedPacket(String outBatchNo, String batchId) {
|
|
|
LiveRedPacketLog log = redPacketLogMapper.selectLiveRedPacketLogByBatchNo(outBatchNo);
|