feat: video/list接口支持isOnline在线状态查询和筛选

- VideoDO/VideoCO 新增 isOnline、type 字段
- VideoPageQry 新增 eqIsOnline 查询参数
- 查询改为 LEFT JOIN vi_video 视图,通过 video_resource_id 关联
- xgfPersonAuditList 新增 employeePersonUserName 姓名查询
- 新增 VideoQueryExe 单元测试

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
koumen
dearLin 2026-05-26 15:30:45 +08:00
parent acd4efe71a
commit 3304e16943
11 changed files with 169 additions and 2 deletions

View File

@ -21,6 +21,23 @@
<groupId>com.zcloud.primeport</groupId>
<artifactId>web-infrastructure</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>net.bytebuddy</groupId>
<artifactId>byte-buddy</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>net.bytebuddy</groupId>
<artifactId>byte-buddy</artifactId>
<version>1.12.23</version>
<scope>test</scope>
</dependency>
</dependencies>
</project>

View File

@ -34,7 +34,7 @@ public class VideoQueryExe {
*/
public PageResponse<VideoCO> execute(VideoPageQry videoPageQry) {
Map<String, Object> parmas = PageQueryHelper.toHashMap(videoPageQry);
PageResponse<VideoDO> pageResponse = videoRepository.listPage(parmas);
PageResponse<VideoDO> pageResponse = videoRepository.listPageWithOnline(parmas);
List<VideoCO> examCenterCOS = videoCoConvertor.converDOsToCOs(pageResponse.getData());
return PageResponse.of(examCenterCOS, pageResponse.getTotalCount(), pageResponse.getPageSize(), pageResponse.getPageIndex());
}

View File

@ -0,0 +1,95 @@
package com.zcloud.primeport.command.query;
import com.alibaba.cola.dto.PageResponse;
import com.zcloud.primeport.command.convertor.VideoCoConvertor;
import com.zcloud.primeport.dto.VideoPageQry;
import com.zcloud.primeport.dto.clientobject.VideoCO;
import com.zcloud.primeport.persistence.dataobject.VideoDO;
import com.zcloud.primeport.persistence.repository.VideoRepository;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.mockito.Mock;
import org.mockito.junit.jupiter.MockitoExtension;
import java.util.Collections;
import java.util.List;
import static org.junit.jupiter.api.Assertions.*;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.anyMap;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
@ExtendWith(MockitoExtension.class)
class VideoQueryExeTest {
@Mock
private VideoRepository videoRepository;
@Mock
private VideoCoConvertor videoCoConvertor;
private VideoQueryExe videoQueryExe;
@BeforeEach
void setUp() {
videoQueryExe = new VideoQueryExe(videoRepository, videoCoConvertor);
}
@Test
void shouldCallListPageWithOnlineAndReturnIsOnlineAndType() {
VideoPageQry qry = new VideoPageQry();
qry.setEqIsOnline(1);
qry.setPageSize(10);
qry.setPageIndex(1);
VideoDO videoDO = new VideoDO();
videoDO.setId(1L);
videoDO.setVideoResourceName("test-camera");
videoDO.setIsOnline("1");
videoDO.setType("yd");
PageResponse<VideoDO> doPage = PageResponse.of(
Collections.singletonList(videoDO), 1, 10, 1);
VideoCO videoCO = new VideoCO();
videoCO.setId(1L);
videoCO.setVideoResourceName("test-camera");
videoCO.setIsOnline("1");
videoCO.setType("yd");
when(videoRepository.listPageWithOnline(anyMap())).thenReturn(doPage);
when(videoCoConvertor.converDOsToCOs(any())).thenReturn(Collections.singletonList(videoCO));
PageResponse<VideoCO> result = videoQueryExe.execute(qry);
assertNotNull(result);
assertEquals(1, result.getTotalCount());
List<VideoCO> data = result.getData();
assertEquals(1, data.size());
assertEquals("test-camera", data.get(0).getVideoResourceName());
assertEquals("1", data.get(0).getIsOnline());
assertEquals("yd", data.get(0).getType());
verify(videoRepository).listPageWithOnline(anyMap());
}
@Test
void shouldReturnEmptyListWhenNoData() {
VideoPageQry qry = new VideoPageQry();
qry.setPageSize(10);
qry.setPageIndex(1);
PageResponse<VideoDO> doPage = PageResponse.of(Collections.emptyList(), 0, 10, 1);
when(videoRepository.listPageWithOnline(anyMap())).thenReturn(doPage);
when(videoCoConvertor.converDOsToCOs(any())).thenReturn(Collections.emptyList());
PageResponse<VideoCO> result = videoQueryExe.execute(qry);
assertNotNull(result);
assertEquals(0, result.getTotalCount());
assertTrue(result.getData().isEmpty());
}
}

View File

@ -31,5 +31,8 @@ public class VideoPageQry extends PageQuery {
// 视频名称
private String videoResourceName;
// 是否在线(0离线/1在线)
private Integer eqIsOnline;
}

View File

@ -38,5 +38,9 @@ public class VideoCO extends ClientObject {
//纬度
@ApiModelProperty(value = "纬度")
private String latitude;
@ApiModelProperty(value = "是否在线")
private String isOnline;
@ApiModelProperty(value = "摄像头来源(yd移动/gd固定)")
private String type;
}

View File

@ -1,6 +1,7 @@
package com.zcloud.primeport.persistence.dataobject;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.jjb.saas.framework.repository.basedo.BaseDO;
@ -40,5 +41,11 @@ public class VideoDO extends BaseDO {
//纬度
@ApiModelProperty(value = "纬度")
private String latitude;
@ApiModelProperty(value = "是否在线")
@TableField(exist = false)
private String isOnline;
@ApiModelProperty(value = "摄像头来源(yd移动/gd固定)")
@TableField(exist = false)
private String type;
}

View File

@ -1,8 +1,13 @@
package com.zcloud.primeport.persistence.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.zcloud.primeport.persistence.dataobject.VideoDO;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import java.util.Map;
/**
* web-infrastructure
@ -13,5 +18,5 @@ import org.apache.ibatis.annotations.Mapper;
@Mapper
public interface VideoMapper extends BaseMapper<VideoDO> {
IPage<VideoDO> listPageWithOnline(Page<Map<String, Object>> page, @Param("params") Map<String, Object> params);
}

View File

@ -8,6 +8,8 @@ import java.util.Map;
public interface VideoRepository extends BaseRepository<VideoDO> {
PageResponse<VideoDO> listPage(Map<String, Object> params);
PageResponse<VideoDO> listPageWithOnline(Map<String, Object> params);
Integer countByForeignIdAndDeviceType(Long foreignId, Integer deviceType);
Integer countByForeignId(Long foreignId);

View File

@ -3,6 +3,7 @@ package com.zcloud.primeport.persistence.repository.impl;
import com.alibaba.cola.dto.PageResponse;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.jjb.saas.framework.repository.common.PageHelper;
import com.jjb.saas.framework.repository.repo.impl.BaseRepositoryImpl;
import com.zcloud.gbscommon.utils.PageQueryHelper;
@ -20,6 +21,14 @@ import java.util.Map;
public class VideoRepositoryImpl extends BaseRepositoryImpl<VideoMapper, VideoDO> implements VideoRepository {
private final VideoMapper videoMapper;
@Override
public PageResponse<VideoDO> listPageWithOnline(Map<String, Object> params) {
Page<Map<String, Object>> page = new Page<>(Integer.parseInt(params.get("pageIndex").toString()), Integer.parseInt(params.get("pageSize").toString()));
page.setOptimizeJoinOfCountSql(false);
IPage<VideoDO> result = videoMapper.listPageWithOnline(page, params);
return PageHelper.pageToResponse(result, result.getRecords());
}
@Override
public PageResponse<VideoDO> listPage(Map<String, Object> params) {
IPage<VideoDO> iPage = new Query<VideoDO>().getPage(params);

View File

@ -4,5 +4,27 @@
<mapper namespace="com.zcloud.primeport.persistence.mapper.VideoMapper">
<select id="listPageWithOnline" resultType="com.zcloud.primeport.persistence.dataobject.VideoDO">
SELECT v.*,
vv.is_online,
vv.type
FROM video v
LEFT JOIN vi_video vv ON v.video_resource_id = vv.id
WHERE v.delete_enum = 'FALSE'
<if test="params.eqForeignId != null">
AND v.foreign_id = #{params.eqForeignId}
</if>
<if test="params.eqDeviceType != null">
AND v.device_type = #{params.eqDeviceType}
</if>
<if test="params.videoResourceName != null and params.videoResourceName != ''">
AND v.video_resource_name LIKE CONCAT('%', #{params.videoResourceName}, '%')
</if>
<if test="params.eqIsOnline != null">
AND vv.is_online = #{params.eqIsOnline}
</if>
ORDER BY v.create_time DESC
</select>
</mapper>

View File

@ -108,6 +108,9 @@
<if test="params.applyCorpName != null and params.applyCorpName != ''">
AND p.apply_corp_name like CONCAT('%', #{params.applyCorpName}, '%')
</if>
<if test="params.employeePersonUserName != null and params.employeePersonUserName != ''">
AND p.id IN (SELECT pa.xgf_apply_person_id FROM person_apply pa WHERE pa.delete_enum = 'FALSE' AND pa.employee_person_user_name LIKE CONCAT('%', #{params.employeePersonUserName}, '%'))
</if>
ORDER BY
p.create_time DESC
</select>