shinnosuke
2026-09-30 60ebfde91e9c975f59df4d60a6cb5a7861958bd2
ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/TSysLiveController.java
@@ -4,13 +4,20 @@
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.ruoyi.common.annotation.Log;
import com.ruoyi.common.basic.PageInfo;
import com.ruoyi.common.constant.Constants;
import com.ruoyi.common.core.domain.R;
import com.ruoyi.common.core.redis.RedisCache;
import com.ruoyi.common.enums.BusinessType;
import com.ruoyi.common.utils.DateUtils;
import com.ruoyi.common.utils.SecurityUtils;
import com.ruoyi.framework.web.service.TokenService;
import com.ruoyi.system.dto.XiaoeLiveDTO;
import com.ruoyi.system.model.TSysEducationalInfo;
import com.ruoyi.system.model.TSysLive;
import com.ruoyi.system.model.TSysProductIntroduction;
import com.ruoyi.system.query.TSysLiveQuery;
import com.ruoyi.system.service.TSysLiveService;
import com.ruoyi.system.utils.util.XiaoeUtils;
import com.ruoyi.system.vo.TSysLiveVO;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
@@ -19,7 +26,10 @@
import org.springframework.web.bind.annotation.*;
import java.time.LocalDateTime;
import java.util.HashSet;
import java.util.List;
import java.util.Objects;
import java.util.Set;
/**
 * <p>
@@ -36,10 +46,14 @@
    private final TSysLiveService sysLiveService;
    private final TokenService tokenService;
    private final RedisCache redisCache;
    private final XiaoeUtils xiaoeUtils;
    @Autowired
    public TSysLiveController(TSysLiveService sysLiveService, TokenService tokenService) {
    public TSysLiveController(TSysLiveService sysLiveService, TokenService tokenService, RedisCache redisCache, XiaoeUtils xiaoeUtils) {
        this.sysLiveService = sysLiveService;
        this.tokenService = tokenService;
        this.redisCache = redisCache;
        this.xiaoeUtils = xiaoeUtils;
    }
    /**
@@ -48,6 +62,12 @@
    @ApiOperation(value = "获取直播管理分页列表")
    @PostMapping(value = "/pageList")
    public R<PageInfo<TSysLiveVO>> pageList(@RequestBody TSysLiveQuery query) {
        Integer roleType = tokenService.getLoginUser().getUser().getRoleType();
        Long userId = tokenService.getLoginUser().getUserId();
        if(roleType == 5){
            query.setRoleType(roleType);
            query.setUserId(userId);
        }
        return R.ok(sysLiveService.pageList(query));
    }
@@ -59,6 +79,16 @@
    public R<List<TSysLive>> list() {
        return R.ok(sysLiveService.list(Wrappers.lambdaQuery(TSysLive.class).orderByDesc(TSysLive::getCreateTime)));
    }
    /**
     * 获取直播管理管理列表
     */
    @ApiOperation(value = "获取直播管理列表-banner使用")
    @PostMapping(value = "/listBanner")
    public R<List<TSysLive>> listBanner() {
        return R.ok(sysLiveService.list(Wrappers.lambdaQuery(TSysLive.class)
                .gt(TSysLive::getEndTime, LocalDateTime.now())
                .orderByDesc(TSysLive::getCreateTime)));
    }
    /**
     * 添加直播管理管理
@@ -68,12 +98,34 @@
    @PostMapping(value = "/add")
    public R<Boolean> add(@Validated @RequestBody TSysLive dto) {
        // 直播开始时间无法小于当前时间
        if (dto.getStartTime().isBefore(LocalDateTime.now())) {
        if (Objects.nonNull(dto.getStartTime()) && dto.getStartTime().isBefore(LocalDateTime.now())) {
            return R.fail("直播开始时间无法小于当前时间");
        }
        // 计算结束时间
        dto.setEndTime(dto.getStartTime().plusMinutes(dto.getExpectedDuration()));
        dto.setPassword(SecurityUtils.encryptPassword(dto.getPassword()));
        if(Objects.nonNull(dto.getStartTime()) && Objects.nonNull(dto.getExpectedDuration())){
            dto.setEndTime(dto.getStartTime().plusMinutes(dto.getExpectedDuration()));
        }
        // 点击次数默认 0,避免后续自增时 NPE
        if (Objects.isNull(dto.getClickCount())) {
            dto.setClickCount(0);
        }
        // 创建小鹅通直播
//        XiaoeLiveDTO xiaoeLiveDTO = new XiaoeLiveDTO();
//        xiaoeLiveDTO.setTitle(dto.getLiveTitle());
//        xiaoeLiveDTO.setSummary(dto.getLiveIntroduction());
//        xiaoeLiveDTO.setZbStartAt(DateUtils.localDateTimeToString(dto.getStartTime()));
//        xiaoeLiveDTO.setZbStopAt(dto.getExpectedDuration());
//        // 直播类型 0-语音,1-录播直播,2-推流直播,默认为0-语音直播
//        xiaoeLiveDTO.setAliveType(2);
//        xiaoeLiveDTO.setAliveMode(dto.getLiveMode()==1?0:1);
//        xiaoeLiveDTO.setUserId(dto.getLiveLecturer());
//        xiaoeLiveDTO.setPaymentType(dto.getLiveType()==1?1:3);
//        xiaoeLiveDTO.setResourcePassword(dto.getResourcePassword());
//        xiaoeLiveDTO.setDescrb(dto.getLiveDetail());
//        String goslingLiveId = xiaoeUtils.addLive(xiaoeLiveDTO);
//        dto.setGoslingLiveId(goslingLiveId);
        return R.ok(sysLiveService.save(dto));
    }
@@ -88,9 +140,26 @@
//        if (dto.getStartTime().isBefore(LocalDateTime.now())) {
//            return R.fail("直播已开始,无法编辑");
//        }
        // 计算结束时间
        dto.setEndTime(dto.getStartTime().plusMinutes(dto.getExpectedDuration()));
        dto.setPassword(SecurityUtils.encryptPassword(dto.getPassword()));
        // 计算结束时间(视频类型没有开始时间和预计时长,必须判空,否则编辑接口会 500)
        if (Objects.nonNull(dto.getStartTime()) && Objects.nonNull(dto.getExpectedDuration())) {
            dto.setEndTime(dto.getStartTime().plusMinutes(dto.getExpectedDuration()));
        }
        // 编辑小鹅通直播
//        XiaoeLiveDTO xiaoeLiveDTO = new XiaoeLiveDTO();
//        xiaoeLiveDTO.setTitle(dto.getLiveTitle());
//        xiaoeLiveDTO.setSummary(dto.getLiveIntroduction());
//        xiaoeLiveDTO.setZbStartAt(DateUtils.localDateTimeToString(dto.getStartTime()));
//        xiaoeLiveDTO.setZbStopAt(dto.getExpectedDuration());
//        // 直播类型 0-语音,1-录播直播,2-推流直播,默认为0-语音直播
//        xiaoeLiveDTO.setAliveType(2);
//        xiaoeLiveDTO.setAliveMode(dto.getLiveMode()==1?0:1);
//        xiaoeLiveDTO.setUserId(dto.getLiveLecturer());
//        xiaoeLiveDTO.setPaymentType(dto.getLiveType()==1?1:3);
//        xiaoeLiveDTO.setResourcePassword(dto.getResourcePassword());
//        xiaoeLiveDTO.setDescrb(dto.getLiveDetail());
//        xiaoeUtils.editLive(xiaoeLiveDTO);
        return R.ok(sysLiveService.updateById(dto));
    }
@@ -100,7 +169,19 @@
    @ApiOperation(value = "查看直播管理详情")
    @GetMapping(value = "/getDetailById")
    public R<TSysLive> getDetailById(@RequestParam String id) {
        return R.ok(sysLiveService.getById(id));
        TSysLive sysLive = sysLiveService.getById(id);
        // 查询次数自增(历史数据 click_count 可能为 NULL,需判空)
        sysLive.setClickCount(Objects.isNull(sysLive.getClickCount()) ? 1 : sysLive.getClickCount() + 1);
        sysLiveService.updateById(sysLive);
        // 如果是诊所
        Integer roleType = tokenService.getLoginUser().getUser().getRoleType();
        if(roleType == 5){
            Long userId = tokenService.getLoginUser().getUserId();
            Set<Long> clickCount = new HashSet<>();
            clickCount.add(userId);
            redisCache.setCacheSet(Constants.SYS_LIVE_CLICK_COUNT+id,clickCount);
        }
        return R.ok(sysLive);
    }
    /**
@@ -110,6 +191,12 @@
    @ApiOperation(value = "删除直播管理")
    @DeleteMapping(value = "/deleteById")
    public R<Boolean> deleteById(@RequestParam String id) {
        redisCache.deleteObject(Constants.SYS_LIVE_CLICK_COUNT+id);
        // 删除直播
//        TSysLive sysLive = sysLiveService.getById(id);
//        xiaoeUtils.deleteLive(sysLive.getGoslingLiveId());
        return R.ok(sysLiveService.removeById(id));
    }
@@ -120,6 +207,9 @@
    @ApiOperation(value = "批量删除直播管理")
    @DeleteMapping(value = "/deleteByIds")
    public R<Boolean> deleteByIds(@RequestBody List<String> ids) {
        for (String id : ids) {
            redisCache.deleteObject(Constants.SYS_LIVE_CLICK_COUNT+id);
        }
        return R.ok(sysLiveService.removeByIds(ids));
    }