feat(video): 完善视频评价功能,增加问题机位和标签管理

- 新增VideoReviewSourceEnum枚举,定义评价来源类型(订单、渲染)
- 添加LongListTypeHandler和StringListTypeHandler,处理数据库JSON字段与Java列表转换
- 修改VideoReviewEntity实体类,将机位评价改为问题机位ID列表和问题标签列表
- 创建AdminVideoReviewLogReqDTO和AdminVideoReviewLogRespDTO,实现管理后台评价日志查询
- 在VideoReviewController中增加管理后台分页查询评价日志接口
- 更新视频评价添加逻辑,验证来源参数并记录问题机位和标签信息
- 修改
This commit is contained in:
2026-01-27 21:28:33 +08:00
parent 1c0a506238
commit 93744510ec
15 changed files with 826 additions and 112 deletions

View File

@@ -0,0 +1,123 @@
package com.ycwl.basic.model.pc.videoreview.dto;
import lombok.Data;
/**
* 管理后台视频评价日志查询请求DTO
*/
@Data
public class AdminVideoReviewLogReqDTO {
/**
* 评价ID(可选,精确查询)
*/
private Long id;
/**
* 视频ID(可选)
*/
private Long videoId;
/**
* 景区ID(可选)
*/
private Long scenicId;
/**
* 评价人ID(可选)
*/
private Long creator;
/**
* 评价人名称(可选,模糊查询)
*/
private String creatorName;
/**
* 评分(可选,精确匹配)
*/
private Integer rating;
/**
* 最小评分(可选,范围查询)
*/
private Integer minRating;
/**
* 最大评分(可选,范围查询)
*/
private Integer maxRating;
/**
* 开始时间(可选,格式: yyyy-MM-dd HH:mm:ss)
*/
private String startTime;
/**
* 结束时间(可选,格式: yyyy-MM-dd HH:mm:ss)
*/
private String endTime;
/**
* 关键词搜索(可选,搜索评价内容、景区名称、模板名称)
*/
private String keyword;
/**
* 模板ID(可选)
*/
private Long templateId;
/**
* 模板名称(可选,模糊查询)
*/
private String templateName;
/**
* 是否有机位评价(可选)
* true: 仅查询有机位评价的记录
* false: 仅查询无机位评价的记录
* null: 不限制
*/
private Boolean hasCameraRating;
/**
* 问题机位ID(可选,筛选包含该机位ID的评价)
* 任意一个问题机位匹配即可
*/
private Long problemDeviceId;
/**
* 问题标签(可选,筛选包含该标签的评价)
* 任意一个标签匹配即可
*/
private String problemTag;
/**
* 来源(可选,筛选指定来源的评价)
* 固定值: ORDER(订单), RENDER(渲染)
*/
private String source;
/**
* 页码(必填,默认1)
*/
private Integer pageNum = 1;
/**
* 每页数量(必填,默认20)
*/
private Integer pageSize = 20;
/**
* 排序字段(可选,默认create_time)
* 可选值: create_time, rating, update_time, id
*/
private String orderBy = "create_time";
/**
* 排序方向(可选,默认DESC)
* 可选值: ASC, DESC
*/
private String orderDirection = "DESC";
}

View File

@@ -0,0 +1,120 @@
package com.ycwl.basic.model.pc.videoreview.dto;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;
import java.util.Date;
import java.util.List;
/**
* 管理后台视频评价日志响应DTO
*/
@Data
public class AdminVideoReviewLogRespDTO {
/**
* 评价ID
*/
private Long id;
/**
* 视频ID
*/
private Long videoId;
/**
* 视频URL(关联查询)
*/
private String videoUrl;
/**
* 模板ID(关联查询video表)
*/
private Long templateId;
/**
* 模板名称(关联查询)
*/
private String templateName;
/**
* 景区ID
*/
private Long scenicId;
/**
* 景区名称(关联查询)
*/
private String scenicName;
/**
* 评价人ID(管理员ID)
*/
private Long creator;
/**
* 评价人名称(关联查询)
*/
private String creatorName;
/**
* 评价人账号(关联查询,管理后台显示)
*/
private String creatorAccount;
/**
* 购买评分 1-5
*/
private Integer rating;
/**
* 文字评价内容
*/
private String content;
/**
* 有问题的机位ID列表
* 格式: [12345, 12346, 12347]
*/
private List<Long> problemDeviceIds;
/**
* 问题机位数量(方便前端展示)
*/
private Integer problemDeviceCount;
/**
* 问题标签列表
* 格式: ["画面模糊", "抖动严重", "色彩异常"]
*/
private List<String> problemTags;
/**
* 来源
* 固定值: ORDER(订单), RENDER(渲染)
*/
private String source;
/**
* 来源ID
* 用于溯源,关联订单ID或渲染任务ID等
*/
private Long sourceId;
/**
* 创建时间
*/
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
private Date createTime;
/**
* 更新时间
*/
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
private Date updateTime;
/**
* 操作时长(创建到更新的时间差,单位:秒)
*/
private Long operationDuration;
}

View File

@@ -2,7 +2,7 @@ package com.ycwl.basic.model.pc.videoreview.dto;
import lombok.Data;
import java.util.Map;
import java.util.List;
/**
* 新增视频评价请求DTO
@@ -26,9 +26,28 @@ public class VideoReviewAddReqDTO {
private String content;
/**
* 机位评价JSON(可选)
* 格式: {"12345": 5, "12346": 4}
* key为机位ID,value为该机位的评分(1-5)
* 有问题的机位ID列表(可选)
* 格式: [12345, 12346, 12347]
* 选择有问题的机位ID
*/
private Map<String, Integer> cameraPositionRating;
private List<Long> problemDeviceIds;
/**
* 问题标签列表(可选)
* 格式: ["画面模糊", "抖动严重", "色彩异常"]
* 可多选问题标签
*/
private List<String> problemTags;
/**
* 来源(必填)
* 固定值: ORDER(订单), RENDER(渲染)
*/
private String source;
/**
* 来源ID(可选)
* 用于溯源,关联订单ID或渲染任务ID等
*/
private Long sourceId;
}

View File

@@ -53,6 +53,24 @@ public class VideoReviewListReqDTO {
*/
private String keyword;
/**
* 问题机位ID(可选,筛选包含该机位ID的评价)
* 任意一个问题机位匹配即可
*/
private Long problemDeviceId;
/**
* 问题标签(可选,筛选包含该标签的评价)
* 任意一个标签匹配即可
*/
private String problemTag;
/**
* 来源(可选,筛选指定来源的评价)
* 固定值: ORDER(订单), RENDER(渲染)
*/
private String source;
/**
* 页码(必填,默认1)
*/

View File

@@ -4,7 +4,7 @@ import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;
import java.util.Date;
import java.util.Map;
import java.util.List;
/**
* 视频评价详情响应DTO
@@ -68,11 +68,28 @@ public class VideoReviewRespDTO {
private String content;
/**
* 机位评价JSON
* 格式: {"12345": 5, "12346": 4}
* key为机位ID,value为该机位的评分(1-5)
* 有问题的机位ID列表
* 格式: [12345, 12346, 12347]
*/
private Map<String, Integer> cameraPositionRating;
private List<Long> problemDeviceIds;
/**
* 问题标签列表
* 格式: ["画面模糊", "抖动严重", "色彩异常"]
*/
private List<String> problemTags;
/**
* 来源
* 固定值: ORDER(订单), RENDER(渲染)
*/
private String source;
/**
* 来源ID
* 用于溯源,关联订单ID或渲染任务ID等
*/
private Long sourceId;
/**
* 创建时间

View File

@@ -40,10 +40,10 @@ public class VideoReviewStatisticsRespDTO {
private List<ScenicReviewRank> scenicRankList;
/**
* 机位评价统计
* key: 机位ID, value: 该机位的平均评分
* 问题机位统计
* key: 机位ID, value: 该机位被标记为问题的次数
*/
private Map<String, BigDecimal> cameraPositionAverage;
private Map<Long, Long> problemDeviceStatistics;
/**
* 景区评价排行内部类

View File

@@ -4,12 +4,13 @@ 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.ycwl.basic.handler.MapTypeHandler;
import com.ycwl.basic.handler.LongListTypeHandler;
import com.ycwl.basic.handler.StringListTypeHandler;
import lombok.Data;
import org.apache.ibatis.type.JdbcType;
import java.util.Date;
import java.util.Map;
import java.util.List;
/**
* 视频评价实体类
@@ -50,12 +51,32 @@ public class VideoReviewEntity {
private String content;
/**
* 机位评价JSON
* 格式: {"12345": 5, "12346": 4}
* key为机位ID,value为该机位的评分(1-5)
* 有问题的机位ID列表
* 格式: [12345, 12346, 12347]
* 存储被标记为有问题的机位ID
*/
@TableField(typeHandler = MapTypeHandler.class, jdbcType = JdbcType.VARCHAR)
private Map<String, Integer> cameraPositionRating;
@TableField(typeHandler = LongListTypeHandler.class, jdbcType = JdbcType.VARCHAR)
private List<Long> problemDeviceIds;
/**
* 问题标签列表
* 格式: ["画面模糊", "抖动严重", "色彩异常"]
* 存储视频或机位的问题标签,可多选
*/
@TableField(typeHandler = StringListTypeHandler.class, jdbcType = JdbcType.VARCHAR)
private List<String> problemTags;
/**
* 来源
* 固定值: ORDER(订单), RENDER(渲染)
*/
private String source;
/**
* 来源ID
* 用于溯源,关联订单ID或渲染任务ID等
*/
private Long sourceId;
/**
* 创建时间