依据:同目录
畜牧监控功能需求.md(v1.1 + v1.2 第三方同步扩展)。监控点位 CRUD + 逻辑删除 + 第三方同步;列表名称模糊、所属主体精确筛选;主体下拉为养殖主体(正常)+ 交易市场(正常)合并选项;播放地址由同步接口写入video_url。
| 项 | 说明 |
|---|---|
| 后端 | RuoYi v3.9.2(springboot2 分支):JDK 8、Spring Boot 2.x、Spring MVC、MyBatis、Druid |
| 数据库 | MySQL 5.7.39,InnoDB,utf8mb4 |
| 前端 | 若依 Vue2;「查看实时监控」本期仅前端 Message 提示,无播放页 |
| 第三方 | 与牧场管理共用 third-party.farming 配置;开放接口鉴权 X-App-Key / X-App-Secret |
分层:Controller → Service(LivestockMonitorValidation、主体有效性校验)→ Mapper/XML → domain;同步编排见 LivestockMonitorSyncService。
代码包:com.ruoyi.web.modules.video
业务摘要
| 场景 | 行为 |
|---|---|
| 新增 | 校验字段;若填写主体则校验存在且正常;冗余 owner_name;del_flag=0 |
| 修改 | 全字段可改;可更换主体;更新 owner_name |
| 列表/详情 | 仅 del_flag=0;排序 create_time DESC, id DESC |
| 列表筛选 | monitor_name 模糊;owner_type + owner_id 精确(成对) |
| 删除 | del_flag=2;不校验下游引用 |
| 第三方同步 | 拉取监控列表 upsert(按 monitor_id);再逐条拉取播放地址更新 video_url |
| 唯一性 | 不校验名称重复;同步以 monitor_id 为 upsert 键 |
biz_livestock_monitor(畜牧监控点位)| 字段 | 类型 | 非空 | 说明 |
|---|---|---|---|
id |
bigint(20) |
Y | 主键 |
monitor_id |
varchar(32) |
Y | 摄像头 ID(第三方 cameraId,同步 upsert 键) |
monitor_name |
varchar(32) |
Y | 监控名称(1~10 字) |
owner_type |
tinyint(4) |
N | 1 养殖主体 / 2 交易市场 |
owner_id |
bigint(20) |
N | 主体主键 |
owner_name |
varchar(64) |
N | 主体名称冗余 |
enclosure_name |
varchar(64) |
N | 圈舍 |
install_location |
varchar(32) |
N | 安装位置(≤10 字) |
video_source |
varchar(32) |
Y | 视频来源:wvp / ys7 / url |
video_url |
varchar(512) |
N | 视频播放地址(同步写入) |
del_flag |
char(1) |
Y | 0 存在 2 删除 |
| 审计字段 | 若依惯例 | — | create_by / create_time / update_by / update_time |
索引:PRIMARY KEY (id);KEY idx_monitor_id (monitor_id);KEY idx_monitor_name;KEY idx_owner;KEY idx_create_time;KEY idx_del_flag。
已移除历史字段
ip_address。DDL 与升级脚本见sql/biz_livestock_monitor.sql。
所属主体类型 owner_type
| 值 | 含义 | 关联表 |
|---|---|---|
| 1 | 养殖主体 | biz_pasture(biz_status=1 且 del_flag=0) |
| 2 | 交易市场 | biz_trade_market(operate_status=1 且 del_flag=0) |
视频来源 video_source
| 值 | 含义 |
|---|---|
| wvp | WVP 平台 |
| ys7 | 萤石云 |
| url | 直链 URL |
删除标记 del_flag
| 值 | 含义 |
|---|---|
| 0 | 正常 |
| 2 | 已逻辑删除 |
保存/修改时,仅当 owner_type 与 owner_id 均非空时校验:
owner_type |
校验要点 |
|---|---|
| 1 | biz_pasture:id=#{ownerId} AND del_flag='0' AND biz_status=1 |
| 2 | biz_trade_market:id=#{ownerId} AND del_flag='0' AND operate_status=1 |
仅填其一则报「所属主体信息不完整」。两者皆空则主体字段置空。
统一响应:AjaxResult / TableDataInfo(code、msg、rows/data)。
权限标识:videoSurveillance:livestockMonitor:list|query|add|edit|remove|sync
Base Path:/videoSurveillance/livestockMonitor
| # | 说明 | Method | URI | 权限 |
|---|---|---|---|---|
| 3.1 | 分页列表 | GET | /list |
list |
| 3.2 | 详情 | GET | /{id} |
query |
| 3.3 | 新增 | POST | / |
add |
| 3.4 | 修改 | PUT | / |
edit |
| 3.5 | 删除 | DELETE | /{ids} |
remove |
| 3.6 | 所属主体选项 | GET | /ownerOptions |
list |
| 3.7 | 第三方同步 | POST | /sync |
sync |
GET /listQuery:pageNum、pageSize、monitorName(模糊)、ownerType+ownerId(成对精确)。
列表行(驼峰):id、monitorId、monitorName、ownerType、ownerTypeName、ownerId、ownerName、enclosureName、installLocation、videoSource、videoSourceName、videoUrl、createTime。
GET /{id}返回上述字段及审计字段;仅 del_flag=0。
Body(驼峰)
| 字段 | 必填 | 说明 |
|---|---|---|
id |
修改必填 | 主键 |
monitorId |
Y | 摄像头 ID,≤32 字符 |
monitorName |
Y | 1~10 字 |
ownerType / ownerId |
N | 成对可选 |
enclosureName |
N | ≤64 字符 |
installLocation |
N | ≤10 字符 |
videoSource |
Y | wvp / ys7 / url |
videoUrl |
N | ≤512 字符 |
DELETE /{ids}逻辑删除,del_flag='2'。
GET /ownerOptionsQuery:keyword(可选,模糊)。
响应 data[]:ownerType、ownerTypeName、ownerId、ownerName。
POST /sync说明:从第三方生产管理系统拉取监控点位并落库,再按摄像头 ID 拉取播放地址。编排类 LivestockMonitorSyncService;返回 YakAssetSyncResultVo(与牧场同步结构一致)。
响应 data
| 字段 | 说明 |
|---|---|
insertCount |
新增条数 |
updateCount |
更新条数 |
failCount |
失败条数(含列表落库失败与播放地址失败) |
failMessages |
失败明细;播放地址失败键名为 {monitorId}(play-url): … |
syncTime |
同步完成时间 |
并发:同步进行中再次调用返回「正在同步,请稍候」。
LivestockMonitorValidation)| 项 | 规则 |
|---|---|
| 摄像头 ID | 非空;≤32 字符 |
| 监控名称 | trim 后 1~10 字 |
| 视频来源 | 非空;∈ {wvp, ys7, url} |
| 圈舍 | 可选;≤64 字符 |
| 安装位置 | 可选;≤10 字符 |
| 播放地址 | 可选;≤512 字符 |
| 主体 | 成对可选;填则 §2.3 校验 |
与牧场、牦牛档案等同源,配置前缀 third-party.farming:
| 配置项 | 说明 |
|---|---|
enabled |
是否允许同步 |
mode |
stub(classpath 样例)/ http(远程) |
base-url |
第三方根地址 |
app-key / app-secret |
请求头鉴权 |
page-size |
分页大小(上限 200) |
阶段一:查询监控数据
GET /open-api/v1/iot/cameraspageNum、pageSize;可选 farmId、enclosureId、updatedAfterOpenApiResponse<OpenApiPageResult<OpenCameraDto>>,code=0 成功records[] 字段映射:| 第三方字段 | 本地字段 |
|---|---|
cameraId |
monitor_id |
deviceName |
monitor_name(超长截断至 10 字) |
farmName |
owner_name |
enclosureName |
enclosure_name |
videoSource |
video_source |
阶段二:获取监控视频播放地址
GET /open-api/v1/iot/cameras/{cameraId}/play-urldata:cameraId、videoSource、videoUrlUPDATE … SET video_url=? WHERE monitor_id=? AND del_flag='0'实现类
| 类 | 职责 |
|---|---|
ThirdPartyCameraClient / ThirdPartyCameraClientImpl |
HTTP / stub 拉取 |
LivestockMonitorSyncService |
同步编排、防重入 |
LivestockMonitorSyncTxService |
单条 upsert、单条更新 video_url(REQUIRES_NEW) |
ThirdPartyFarmingHttpSupport |
共用 RestTemplate、鉴权头(industryservice 包) |
Stub 样例
thirdparty/stub-cameras.json — 监控列表thirdparty/stub-camera-play-urls.json — 播放地址msgLiveNotOpen 提示。| 类型 | 名称 | 权限标识 |
|---|---|---|
| 目录 | 视频监控系统 | — |
| 菜单 | 畜牧监控 | videoSurveillance:livestockMonitor:list |
| 按钮 | 查询 | videoSurveillance:livestockMonitor:query |
| 按钮 | 新增 | videoSurveillance:livestockMonitor:add |
| 按钮 | 修改 | videoSurveillance:livestockMonitor:edit |
| 按钮 | 删除 | videoSurveillance:livestockMonitor:remove |
| 按钮 | 同步 | videoSurveillance:livestockMonitor:sync |
组件路径:videoSurveillance/livestockMonitor/index
| 模块 | 关系 |
|---|---|
| 牧场管理 | owner_type=1;第三方同步养殖场列表同源配置 |
| 交易市场管理 | owner_type=2 |
| 第三方生产管理系统 | 监控列表 + 播放地址开放接口 |
sql/biz_livestock_monitor.sqlBizLivestockMonitor、BizLivestockMonitorMapper/XML、BizLivestockMonitorServiceImpl、BizLivestockMonitorControllerLivestockMonitorValidation、LivestockMonitorSyncService、ThirdPartyCameraClientImpllivestockMonitor/index.vue、livestockMonitor.js、同步按钮/sync)| 版本 | 说明 |
|---|---|
| 1.0 | 初稿:CRUD + ownerOptions;含 ip_address |
| 1.1 | 表结构:monitor_id、enclosure_name、video_source、video_url;移除 ip_address;主体/安装位置可选 |
| 1.2 | 第三方同步:POST /sync;对接 /iot/cameras 与 /iot/cameras/{id}/play-url;复用 third-party.farming |