shinnosuke
2026-09-27 e073352eae4468b67a1a10654c72e03ba0c26d37
fix(live): 修复小程序养生列表查不到内容的问题

- TSysLiveMapper.xml: pageListApp 去掉无条件的 end_time > NOW() 过滤,可见性只由 disabled 控制,时间仅用于计算 liveStatus;默认排序改为 create_time DESC
- TSysLiveServiceImpl: pageListApp 补 start_time/end_time 判空,避免整个列表接口 500
- TSysLiveController(applet): appointmentPush 对无开始时间的内容只记录预约、不排定时任务

验证:本地 applet 启动后 /t-sys-live/pageList 由 0 条变为 3 条;视频(无时间)/直播(未开始)/直播(已结束)/已删除 四类边界逐条验证通过。

注:未包含小程序前端「观看」按钮的分流逻辑(mp4 走 maxVideo、网页链接走 liveView),线上仍有 3 条网页链接类型内容点击后无法播放。
3个文件已修改
45 ■■■■■ 已修改文件
ruoyi-applet/src/main/java/com/ruoyi/web/controller/api/TSysLiveController.java 25 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TSysLiveServiceImpl.java 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/resources/mapper/system/TSysLiveMapper.xml 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-applet/src/main/java/com/ruoyi/web/controller/api/TSysLiveController.java
@@ -97,17 +97,20 @@
        redisCache.setCacheSet(Constants.LIVE_APPOINTMENT_PUSH + id, appointmentPush);
        TSysLive sysLive = sysLiveService.getById(id);
        Map<String, ? extends Object> maps =
                new ImmutableMap.Builder<String, String>().
                        put("id", sysLive.getId())
                        .build();
        QuartzManager.addJob(
                LivePushJob.class,
                (LivePushJob.name+sysLive.getId()).toUpperCase(),
                TimeJobType.LIVE_PUSH,
                DateUtils.localDateTimeToDate(sysLive.getStartTime().minusHours(1)),
                maps
        );
        // 录播视频等没有开始时间的内容无法推算提醒时间,只记录预约、不排定时任务
        if (Objects.nonNull(sysLive) && Objects.nonNull(sysLive.getStartTime())) {
            Map<String, ? extends Object> maps =
                    new ImmutableMap.Builder<String, String>().
                            put("id", sysLive.getId())
                            .build();
            QuartzManager.addJob(
                    LivePushJob.class,
                    (LivePushJob.name + sysLive.getId()).toUpperCase(),
                    TimeJobType.LIVE_PUSH,
                    DateUtils.localDateTimeToDate(sysLive.getStartTime().minusHours(1)),
                    maps
            );
        }
        return R.ok();
    }
ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TSysLiveServiceImpl.java
@@ -120,15 +120,19 @@
        if (CollectionUtils.isEmpty(list)){
            return pageInfo;
        }
        // 判断状态
        // 判断状态(视频等内容可能没有开始/结束时间,需要判空,否则整个列表接口会 500)
        LocalDateTime now = LocalDateTime.now();
        for (TSysLiveVO sysLive : list) {
            if(sysLive.getStartTime().isAfter(LocalDateTime.now())){
            LocalDateTime startTime = sysLive.getStartTime();
            LocalDateTime endTime = sysLive.getEndTime();
            if(Objects.nonNull(startTime) && startTime.isAfter(now)){
                sysLive.setLiveStatus(1);
            }
            if(sysLive.getStartTime().isBefore(LocalDateTime.now()) && sysLive.getEndTime().isAfter(LocalDateTime.now())){
            if(Objects.nonNull(startTime) && Objects.nonNull(endTime)
                    && startTime.isBefore(now) && endTime.isAfter(now)){
                sysLive.setLiveStatus(2);
            }
            if(sysLive.getEndTime().isBefore(LocalDateTime.now())){
            if(Objects.nonNull(endTime) && endTime.isBefore(now)){
                sysLive.setLiveStatus(3);
            }
            if(StringUtils.hasLength(query.getAppUserId())){
ruoyi-system/src/main/resources/mapper/system/TSysLiveMapper.xml
@@ -73,11 +73,15 @@
                AND date_format(start_time,'%y%m%d %H%i%s') &lt;= date_format(NOW(),'%y%m%d %H%i%s')
                AND date_format(end_time,'%y%m%d %H%i%s') &gt;= date_format(NOW(),'%y%m%d %H%i%s')
            </if>
            AND date_format(end_time,'%y%m%d %H%i%s') &gt; date_format(NOW(),'%y%m%d %H%i%s')
            <!--
                说明:这里原先有一句无条件的时间过滤 AND end_time > NOW(),导致已结束的直播和录播视频(往往没有开始/结束时间)
                在小程序里永远查不到(与后台列表的规则也不一致)。可见性统一交给 disabled 控制,时间只用于计算 liveStatus,
                前端再用 liveStatus 区分「未开始/已开始/已结束」。
            -->
            AND disabled = ${@com.ruoyi.common.enums.DisabledEnum@NO.getCode()}
        </where>
        <if test="query.liveStatus == null">
            ORDER BY start_time
            ORDER BY create_time DESC
        </if>
        <if test="query.liveStatus != null">
            ORDER BY create_time DESC