Explorar o código

直播回放 按照系统时间 范围 设置发红包还是积分

三七 hai 1 semana
pai
achega
8ec8e476b9

+ 8 - 2
fs-service/src/main/java/com/fs/live/domain/LiveWatchConfig.java

@@ -110,7 +110,13 @@ public class LiveWatchConfig extends BaseEntity{
     @Excel(name = "配置json")
     private String configJson;
 
-
-
+    /**
+    * 录播可领取奖励
+    */
+    private Boolean recordRedPacketEnabled;
+    /**
+    * 录播奖励配置
+    */
+    private String recordTimeRangeStr;
 
 }

+ 131 - 4
fs-service/src/main/java/com/fs/live/service/impl/LiveRedPacketLogServiceImpl.java

@@ -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;
@@ -306,8 +309,44 @@ 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 {
+                                return R.error("未设置回放奖励");
+                            }
+
+
                         }else {
                             return R.error("观看时长未达到完课要求,请看继续观看回放,之后再领取");
                         }
@@ -334,8 +373,46 @@ 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 {
+                        return R.error("未设置回放奖励");
+                    }
+
+                    return R.error("未设置回放奖励");
+//                    // 如果是 回放完课 发积分
+//                    return sendLiveIntegralReward(param, user, watchUser, config);
                 }else {
                     return R.error("未知 直播观看类型 ");
                 }
@@ -352,6 +429,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);

+ 23 - 0
fs-service/src/main/java/com/fs/live/vo/RecordTimeRangeVO.java

@@ -0,0 +1,23 @@
+package com.fs.live.vo;
+
+import lombok.Data;
+
+import java.math.BigDecimal;
+
+@Data
+public class RecordTimeRangeVO {
+
+    private String startTime;   // "17:44"
+    private String endTime;     // "18:00"
+    private String rewardType;  // 1=红包 2=积分
+    /**
+    * 红包金额
+    */
+    private BigDecimal redPacketAmount;
+
+    /**
+    * 积分
+    */
+    private Long scoreAmount;
+
+}