|
|
@@ -1,6 +1,6 @@
|
|
1
|
1
|
# 畜牧监控 — 技术方案
|
|
2
|
2
|
|
|
3
|
|
-> 依据:同目录 `畜牧监控功能需求.md`(v1.1)。监控点位 **CRUD** + **逻辑删除**;列表**名称模糊**、**所属主体精确**筛选;**不含**实时拉流;主体下拉为养殖主体(正常)+ 交易市场(正常)合并选项。
|
|
|
3
|
+> 依据:同目录 `畜牧监控功能需求.md`(v1.1 + v1.2 第三方同步扩展)。监控点位 **CRUD** + **逻辑删除** + **第三方同步**;列表**名称模糊**、**所属主体精确**筛选;主体下拉为养殖主体(正常)+ 交易市场(正常)合并选项;播放地址由同步接口写入 `video_url`。
|
|
4
|
4
|
|
|
5
|
5
|
---
|
|
6
|
6
|
|
|
|
@@ -10,22 +10,24 @@
|
|
10
|
10
|
| --- | --- |
|
|
11
|
11
|
| **后端** | RuoYi **v3.9.2**(**springboot2** 分支):JDK 8、Spring Boot 2.x、Spring MVC、MyBatis、Druid |
|
|
12
|
12
|
| **数据库** | MySQL **5.7.39**,InnoDB,`utf8mb4` |
|
|
13
|
|
-| **前端** | 若依 Vue2;「查看实时监控」本期仅前端 `Message` 提示,无播放接口 |
|
|
|
13
|
+| **前端** | 若依 Vue2;「查看实时监控」本期仅前端 `Message` 提示,无播放页 |
|
|
|
14
|
+| **第三方** | 与牧场管理共用 `third-party.farming` 配置;开放接口鉴权 `X-App-Key` / `X-App-Secret` |
|
|
14
|
15
|
|
|
15
|
|
-**分层**:`Controller` → `Service`(`LivestockMonitorValidation`、主体有效性校验)→ `Mapper`/XML → `domain`。
|
|
|
16
|
+**分层**:`Controller` → `Service`(`LivestockMonitorValidation`、主体有效性校验)→ `Mapper`/XML → `domain`;同步编排见 `LivestockMonitorSyncService`。
|
|
16
|
17
|
|
|
17
|
|
-**代码包(建议)**:`com.ruoyi.web.modules.video`
|
|
|
18
|
+**代码包**:`com.ruoyi.web.modules.video`
|
|
18
|
19
|
|
|
19
|
20
|
**业务摘要**
|
|
20
|
21
|
|
|
21
|
22
|
| 场景 | 行为 |
|
|
22
|
23
|
| --- | --- |
|
|
23
|
|
-| 新增 | 校验字段;校验主体存在且 `del_flag=0`、状态为正常;冗余 `owner_name`;`del_flag=0` |
|
|
24
|
|
-| 修改 | 全字段可改;可更换主体类型与 ID;更新 `owner_name` |
|
|
25
|
|
-| 列表/详情 | 仅 `del_flag=0`;排序 `create_time DESC, id DESC`;列表**不返回** `ipAddress` 亦可(前端不展示列即可,接口可带) |
|
|
|
24
|
+| 新增 | 校验字段;若填写主体则校验存在且正常;冗余 `owner_name`;`del_flag=0` |
|
|
|
25
|
+| 修改 | 全字段可改;可更换主体;更新 `owner_name` |
|
|
|
26
|
+| 列表/详情 | 仅 `del_flag=0`;排序 `create_time DESC, id DESC` |
|
|
26
|
27
|
| 列表筛选 | `monitor_name` 模糊;`owner_type` + `owner_id` **精确**(成对) |
|
|
27
|
|
-| 删除 | `del_flag=2`;**不**校验下游视频平台引用 |
|
|
28
|
|
-| 唯一性 | **不**校验名称、IP 重复(对齐需求 v1.1) |
|
|
|
28
|
+| 删除 | `del_flag=2`;**不**校验下游引用 |
|
|
|
29
|
+| 第三方同步 | 拉取监控列表 upsert(按 `monitor_id`);再逐条拉取播放地址更新 `video_url` |
|
|
|
30
|
+| 唯一性 | **不**校验名称重复;同步以 `monitor_id` 为 upsert 键 |
|
|
29
|
31
|
|
|
30
|
32
|
---
|
|
31
|
33
|
|
|
|
@@ -33,56 +35,41 @@
|
|
33
|
35
|
|
|
34
|
36
|
### 2.1 表 `biz_livestock_monitor`(畜牧监控点位)
|
|
35
|
37
|
|
|
36
|
|
-| 字段 | 类型 | 非空 | 默认值 | 说明 |
|
|
37
|
|
-| --- | --- | --- | --- | --- |
|
|
38
|
|
-| `id` | `bigint(20)` | Y | 自增 | 主键 |
|
|
39
|
|
-| `monitor_name` | `varchar(32)` | Y | — | 监控名称(**1~10** 字) |
|
|
40
|
|
-| `owner_type` | `tinyint(4)` | Y | — | 所属主体类型,见 **§2.3** |
|
|
41
|
|
-| `owner_id` | `bigint(20)` | Y | — | 主体主键:`biz_pasture.id` 或 `biz_trade_market.id` |
|
|
42
|
|
-| `owner_name` | `varchar(64)` | Y | — | 主体名称冗余(登记/修改时快照,列表展示用) |
|
|
43
|
|
-| `install_location` | `varchar(32)` | Y | — | 安装位置(**1~10** 字) |
|
|
44
|
|
-| `ip_address` | `varchar(20)` | Y | — | IPv4 接入地址(**≤20** 字符) |
|
|
45
|
|
-| `del_flag` | `char(1)` | Y | `'0'` | `0` 存在 `2` 删除 |
|
|
46
|
|
-| `create_by` / `create_time` / `update_by` / `update_time` | 若依惯例 | — | — | 审计 |
|
|
47
|
|
-
|
|
48
|
|
-**索引**:`PRIMARY KEY (id)`;`KEY idx_monitor_name (monitor_name)`;`KEY idx_owner (owner_type, owner_id)`;`KEY idx_create_time (create_time)`;`KEY idx_del_flag (del_flag)`。
|
|
49
|
|
-
|
|
50
|
|
-> 不设 `(monitor_name)` / `(ip_address)` 唯一索引(需求允许重复)。
|
|
51
|
|
-
|
|
52
|
|
-### 2.2 DDL(MySQL 5.7)
|
|
53
|
|
-
|
|
54
|
|
-```sql
|
|
55
|
|
-CREATE TABLE `biz_livestock_monitor` (
|
|
56
|
|
- `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键',
|
|
57
|
|
- `monitor_name` varchar(32) NOT NULL COMMENT '监控名称',
|
|
58
|
|
- `owner_type` tinyint(4) NOT NULL COMMENT '1养殖主体 2交易市场',
|
|
59
|
|
- `owner_id` bigint(20) NOT NULL COMMENT '主体ID',
|
|
60
|
|
- `owner_name` varchar(64) NOT NULL COMMENT '主体名称冗余',
|
|
61
|
|
- `install_location` varchar(32) NOT NULL COMMENT '安装位置',
|
|
62
|
|
- `ip_address` varchar(20) NOT NULL COMMENT 'IP地址IPv4',
|
|
63
|
|
- `del_flag` char(1) NOT NULL DEFAULT '0' COMMENT '0存在 2删除',
|
|
64
|
|
- `create_by` varchar(64) DEFAULT '' COMMENT '创建者',
|
|
65
|
|
- `create_time` datetime DEFAULT NULL COMMENT '创建时间',
|
|
66
|
|
- `update_by` varchar(64) DEFAULT '' COMMENT '更新者',
|
|
67
|
|
- `update_time` datetime DEFAULT NULL COMMENT '更新时间',
|
|
68
|
|
- PRIMARY KEY (`id`),
|
|
69
|
|
- KEY `idx_monitor_name` (`monitor_name`),
|
|
70
|
|
- KEY `idx_owner` (`owner_type`, `owner_id`),
|
|
71
|
|
- KEY `idx_create_time` (`create_time`),
|
|
72
|
|
- KEY `idx_del_flag` (`del_flag`)
|
|
73
|
|
-) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='畜牧监控点位';
|
|
74
|
|
-```
|
|
75
|
|
-
|
|
76
|
|
-初始化脚本建议路径:`sql/biz_livestock_monitor.sql`。
|
|
77
|
|
-
|
|
78
|
|
-### 2.3 枚举
|
|
|
38
|
+| 字段 | 类型 | 非空 | 说明 |
|
|
|
39
|
+| --- | --- | --- | --- |
|
|
|
40
|
+| `id` | `bigint(20)` | Y | 主键 |
|
|
|
41
|
+| `monitor_id` | `varchar(32)` | Y | 摄像头 ID(第三方 `cameraId`,同步 upsert 键) |
|
|
|
42
|
+| `monitor_name` | `varchar(32)` | Y | 监控名称(**1~10** 字) |
|
|
|
43
|
+| `owner_type` | `tinyint(4)` | N | 1 养殖主体 / 2 交易市场 |
|
|
|
44
|
+| `owner_id` | `bigint(20)` | N | 主体主键 |
|
|
|
45
|
+| `owner_name` | `varchar(64)` | N | 主体名称冗余 |
|
|
|
46
|
+| `enclosure_name` | `varchar(64)` | N | 圈舍 |
|
|
|
47
|
+| `install_location` | `varchar(32)` | N | 安装位置(**≤10** 字) |
|
|
|
48
|
+| `video_source` | `varchar(32)` | Y | 视频来源:`wvp` / `ys7` / `url` |
|
|
|
49
|
+| `video_url` | `varchar(512)` | N | 视频播放地址(同步写入) |
|
|
|
50
|
+| `del_flag` | `char(1)` | Y | `0` 存在 `2` 删除 |
|
|
|
51
|
+| 审计字段 | 若依惯例 | — | `create_by` / `create_time` / `update_by` / `update_time` |
|
|
|
52
|
+
|
|
|
53
|
+**索引**:`PRIMARY KEY (id)`;`KEY idx_monitor_id (monitor_id)`;`KEY idx_monitor_name`;`KEY idx_owner`;`KEY idx_create_time`;`KEY idx_del_flag`。
|
|
|
54
|
+
|
|
|
55
|
+> 已移除历史字段 `ip_address`。DDL 与升级脚本见 `sql/biz_livestock_monitor.sql`。
|
|
|
56
|
+
|
|
|
57
|
+### 2.2 枚举
|
|
79
|
58
|
|
|
80
|
59
|
**所属主体类型 `owner_type`**
|
|
81
|
60
|
|
|
82
|
61
|
| 值 | 含义 | 关联表 |
|
|
83
|
62
|
| --- | --- | --- |
|
|
84
|
|
-| 1 | 养殖主体 | `biz_pasture`(`biz_status=1` 且 `del_flag=0` 可选) |
|
|
85
|
|
-| 2 | 交易市场 | `biz_trade_market`(`operate_status=1` 且 `del_flag=0` 可选) |
|
|
|
63
|
+| 1 | 养殖主体 | `biz_pasture`(`biz_status=1` 且 `del_flag=0`) |
|
|
|
64
|
+| 2 | 交易市场 | `biz_trade_market`(`operate_status=1` 且 `del_flag=0`) |
|
|
|
65
|
+
|
|
|
66
|
+**视频来源 `video_source`**
|
|
|
67
|
+
|
|
|
68
|
+| 值 | 含义 |
|
|
|
69
|
+| --- | --- |
|
|
|
70
|
+| wvp | WVP 平台 |
|
|
|
71
|
+| ys7 | 萤石云 |
|
|
|
72
|
+| url | 直链 URL |
|
|
86
|
73
|
|
|
87
|
74
|
**删除标记 `del_flag`**
|
|
88
|
75
|
|
|
|
@@ -91,18 +78,16 @@ CREATE TABLE `biz_livestock_monitor` (
|
|
91
|
78
|
| 0 | 正常 |
|
|
92
|
79
|
| 2 | 已逻辑删除 |
|
|
93
|
80
|
|
|
94
|
|
-### 2.4 主体主数据校验(Service)
|
|
|
81
|
+### 2.3 主体主数据校验(Service)
|
|
95
|
82
|
|
|
96
|
|
-保存/修改时:
|
|
|
83
|
+保存/修改时,**仅当** `owner_type` 与 `owner_id` **均非空**时校验:
|
|
97
|
84
|
|
|
98
|
|
-| `owner_type` | 校验 SQL 要点 |
|
|
|
85
|
+| `owner_type` | 校验要点 |
|
|
99
|
86
|
| --- | --- |
|
|
100
|
87
|
| 1 | `biz_pasture`:`id=#{ownerId}` AND `del_flag='0'` AND `biz_status=1` |
|
|
101
|
88
|
| 2 | `biz_trade_market`:`id=#{ownerId}` AND `del_flag='0'` AND `operate_status=1` |
|
|
102
|
89
|
|
|
103
|
|
-失败:`ServiceException`,如「所属主体不存在或已停用」。
|
|
104
|
|
-
|
|
105
|
|
-`owner_name` 取自主数据 `pasture_name` / `market_name` 写入冗余字段。
|
|
|
90
|
+仅填其一则报「所属主体信息不完整」。两者皆空则主体字段置空。
|
|
106
|
91
|
|
|
107
|
92
|
---
|
|
108
|
93
|
|
|
|
@@ -110,7 +95,7 @@ CREATE TABLE `biz_livestock_monitor` (
|
|
110
|
95
|
|
|
111
|
96
|
**统一响应**:`AjaxResult` / `TableDataInfo`(`code`、`msg`、`rows`/`data`)。
|
|
112
|
97
|
|
|
113
|
|
-**权限标识**:`videoSurveillance:livestockMonitor:list|query|add|edit|remove`
|
|
|
98
|
+**权限标识**:`videoSurveillance:livestockMonitor:list|query|add|edit|remove|sync`
|
|
114
|
99
|
|
|
115
|
100
|
**Base Path**:`/videoSurveillance/livestockMonitor`
|
|
116
|
101
|
|
|
|
@@ -122,149 +107,157 @@ CREATE TABLE `biz_livestock_monitor` (
|
|
122
|
107
|
| 3.4 | 修改 | PUT | `/` | `edit` |
|
|
123
|
108
|
| 3.5 | 删除 | DELETE | `/{ids}` | `remove` |
|
|
124
|
109
|
| 3.6 | 所属主体选项 | GET | `/ownerOptions` | `list` |
|
|
125
|
|
-
|
|
126
|
|
-> 完整路径示例:`GET /videoSurveillance/livestockMonitor/list`。
|
|
|
110
|
+| 3.7 | 第三方同步 | POST | `/sync` | `sync` |
|
|
127
|
111
|
|
|
128
|
112
|
### 3.1 列表 `GET /list`
|
|
129
|
113
|
|
|
130
|
|
-**Query**
|
|
|
114
|
+**Query**:`pageNum`、`pageSize`、`monitorName`(模糊)、`ownerType`+`ownerId`(成对精确)。
|
|
131
|
115
|
|
|
132
|
|
-| 参数 | 类型 | 必填 | 说明 |
|
|
133
|
|
-| --- | --- | --- | --- |
|
|
134
|
|
-| `pageNum` / `pageSize` | int | N | 默认 `1` / `20` |
|
|
135
|
|
-| `monitorName` | string | N | 名称**模糊**:`monitor_name LIKE %value%`(trim 后) |
|
|
136
|
|
-| `ownerType` | int | N | `1` / `2`;与 `ownerId` **成对**使用 |
|
|
137
|
|
-| `ownerId` | long | N | **精确**:`owner_type` + `owner_id` 同时匹配 |
|
|
|
116
|
+**列表行(驼峰)**:`id`、`monitorId`、`monitorName`、`ownerType`、`ownerTypeName`、`ownerId`、`ownerName`、`enclosureName`、`installLocation`、`videoSource`、`videoSourceName`、`videoUrl`、`createTime`。
|
|
138
|
117
|
|
|
139
|
|
-**列表行(驼峰)**
|
|
|
118
|
+### 3.2 详情 `GET /{id}`
|
|
140
|
119
|
|
|
141
|
|
-| 字段 | 说明 |
|
|
142
|
|
-| --- | --- |
|
|
143
|
|
-| `id` | 主键 |
|
|
144
|
|
-| `monitorName` | 监控名称 |
|
|
145
|
|
-| `ownerType` | 1 / 2 |
|
|
146
|
|
-| `ownerTypeName` | 养殖主体 / 交易市场(字典或 Service 填充) |
|
|
147
|
|
-| `ownerId` | 主体 ID |
|
|
148
|
|
-| `ownerName` | 冗余展示名 |
|
|
149
|
|
-| `installLocation` | 安装位置 |
|
|
150
|
|
-| `createTime` | 创建时间 |
|
|
|
120
|
+返回上述字段及审计字段;仅 `del_flag=0`。
|
|
151
|
121
|
|
|
152
|
|
-> 列表**可不返回** `ipAddress`(与需求「列表不展示 IP」一致);详情与编辑回显须含 `ipAddress`。
|
|
|
122
|
+### 3.3 新增 / 3.4 修改
|
|
153
|
123
|
|
|
154
|
|
-**排序**:`create_time DESC, id DESC`。
|
|
|
124
|
+**Body(驼峰)**
|
|
155
|
125
|
|
|
156
|
|
-### 3.2 详情 `GET /{id}`
|
|
|
126
|
+| 字段 | 必填 | 说明 |
|
|
|
127
|
+| --- | --- | --- |
|
|
|
128
|
+| `id` | 修改必填 | 主键 |
|
|
|
129
|
+| `monitorId` | Y | 摄像头 ID,≤32 字符 |
|
|
|
130
|
+| `monitorName` | Y | 1~10 字 |
|
|
|
131
|
+| `ownerType` / `ownerId` | N | 成对可选 |
|
|
|
132
|
+| `enclosureName` | N | ≤64 字符 |
|
|
|
133
|
+| `installLocation` | N | ≤10 字符 |
|
|
|
134
|
+| `videoSource` | Y | `wvp` / `ys7` / `url` |
|
|
|
135
|
+| `videoUrl` | N | ≤512 字符 |
|
|
157
|
136
|
|
|
158
|
|
-**`data`**:`id`、`monitorName`、`ownerType`、`ownerTypeName`、`ownerId`、`ownerName`、`installLocation`、`ipAddress`、审计字段。
|
|
|
137
|
+### 3.5 删除 `DELETE /{ids}`
|
|
159
|
138
|
|
|
160
|
|
-仅 `del_flag=0`;否则失败「记录不存在或已删除」。
|
|
|
139
|
+逻辑删除,`del_flag='2'`。
|
|
161
|
140
|
|
|
162
|
|
-### 3.3 新增 `POST /`
|
|
|
141
|
+### 3.6 所属主体选项 `GET /ownerOptions`
|
|
163
|
142
|
|
|
164
|
|
-### 3.4 修改 `PUT /`
|
|
|
143
|
+**Query**:`keyword`(可选,模糊)。
|
|
165
|
144
|
|
|
166
|
|
-**Body(驼峰)**
|
|
|
145
|
+**响应 `data[]`**:`ownerType`、`ownerTypeName`、`ownerId`、`ownerName`。
|
|
167
|
146
|
|
|
168
|
|
-| 字段 | 新增 | 修改 | 说明 |
|
|
169
|
|
-| --- | --- | --- | --- |
|
|
170
|
|
-| `id` | — | Y | 主键 |
|
|
171
|
|
-| `monitorName` | Y | Y | 1~10 字,trim |
|
|
172
|
|
-| `ownerType` | Y | Y | `1` / `2` |
|
|
173
|
|
-| `ownerId` | Y | Y | 对应主表主键 |
|
|
174
|
|
-| `installLocation` | Y | Y | 1~10 字 |
|
|
175
|
|
-| `ipAddress` | Y | Y | IPv4;≤20 字符 |
|
|
|
147
|
+### 3.7 第三方同步 `POST /sync`
|
|
176
|
148
|
|
|
177
|
|
-保存时 Service 解析并写入 `owner_name`(前端**不必**传 `ownerName`,传了也以库内主数据为准覆盖)。
|
|
|
149
|
+**说明**:从第三方生产管理系统拉取监控点位并落库,再按摄像头 ID 拉取播放地址。编排类 `LivestockMonitorSyncService`;返回 `YakAssetSyncResultVo`(与牧场同步结构一致)。
|
|
178
|
150
|
|
|
179
|
|
-### 3.5 删除 `DELETE /{ids}`
|
|
|
151
|
+**响应 `data`**
|
|
180
|
152
|
|
|
181
|
|
-- 路径参数:逗号分隔 id,与若依惯例一致。
|
|
182
|
|
-- `UPDATE … SET del_flag='2' WHERE id IN (…) AND del_flag='0'`。
|
|
183
|
|
-- 已删 id 忽略或返回 0 条,与项目其他台账一致。
|
|
|
153
|
+| 字段 | 说明 |
|
|
|
154
|
+| --- | --- |
|
|
|
155
|
+| `insertCount` | 新增条数 |
|
|
|
156
|
+| `updateCount` | 更新条数 |
|
|
|
157
|
+| `failCount` | 失败条数(含列表落库失败与播放地址失败) |
|
|
|
158
|
+| `failMessages` | 失败明细;播放地址失败键名为 `{monitorId}(play-url): …` |
|
|
|
159
|
+| `syncTime` | 同步完成时间 |
|
|
184
|
160
|
|
|
185
|
|
-### 3.6 所属主体选项 `GET /ownerOptions`
|
|
|
161
|
+**并发**:同步进行中再次调用返回「正在同步,请稍候」。
|
|
186
|
162
|
|
|
187
|
|
-供列表筛选、新增/编辑下拉(合并数据源,支持模糊搜索)。
|
|
|
163
|
+### 3.8 服务端校验(`LivestockMonitorValidation`)
|
|
188
|
164
|
|
|
189
|
|
-**Query**
|
|
|
165
|
+| 项 | 规则 |
|
|
|
166
|
+| --- | --- |
|
|
|
167
|
+| 摄像头 ID | 非空;≤32 字符 |
|
|
|
168
|
+| 监控名称 | trim 后 1~10 字 |
|
|
|
169
|
+| 视频来源 | 非空;∈ {wvp, ys7, url} |
|
|
|
170
|
+| 圈舍 | 可选;≤64 字符 |
|
|
|
171
|
+| 安装位置 | 可选;≤10 字符 |
|
|
|
172
|
+| 播放地址 | 可选;≤512 字符 |
|
|
|
173
|
+| 主体 | 成对可选;填则 §2.3 校验 |
|
|
190
|
174
|
|
|
191
|
|
-| 参数 | 类型 | 必填 | 说明 |
|
|
192
|
|
-| --- | --- | --- | --- |
|
|
193
|
|
-| `keyword` | string | N | 对 `pasture_name` / `market_name` **模糊**;空则返回前 N 条(建议各表最多 200,合并后按名称排序) |
|
|
|
175
|
+### 3.9 第三方开放接口(Apifox)
|
|
194
|
176
|
|
|
195
|
|
-**响应 `data`:数组项**
|
|
|
177
|
+与牧场、牦牛档案等同源,配置前缀 **`third-party.farming`**:
|
|
196
|
178
|
|
|
197
|
|
-| 字段 | 说明 |
|
|
|
179
|
+| 配置项 | 说明 |
|
|
198
|
180
|
| --- | --- |
|
|
199
|
|
-| `ownerType` | `1` / `2` |
|
|
200
|
|
-| `ownerTypeName` | 养殖主体 / 交易市场 |
|
|
201
|
|
-| `ownerId` | 主键 |
|
|
202
|
|
-| `ownerName` | 展示名称 |
|
|
|
181
|
+| `enabled` | 是否允许同步 |
|
|
|
182
|
+| `mode` | `stub`(classpath 样例)/ `http`(远程) |
|
|
|
183
|
+| `base-url` | 第三方根地址 |
|
|
|
184
|
+| `app-key` / `app-secret` | 请求头鉴权 |
|
|
|
185
|
+| `page-size` | 分页大小(上限 200) |
|
|
203
|
186
|
|
|
204
|
|
-**数据来源(服务端合并)**
|
|
|
187
|
+**阶段一:查询监控数据**
|
|
205
|
188
|
|
|
206
|
|
-1. `biz_pasture`:`del_flag='0'` AND `biz_status=1`;`keyword` 非空时 `pasture_name LIKE`。
|
|
207
|
|
-2. `biz_trade_market`:`del_flag='0'` AND `operate_status=1`;`keyword` 非空时 `market_name LIKE`。
|
|
|
189
|
+- `GET /open-api/v1/iot/cameras`
|
|
|
190
|
+- Query:`pageNum`、`pageSize`;可选 `farmId`、`enclosureId`、`updatedAfter`
|
|
|
191
|
+- 响应:`OpenApiResponse<OpenApiPageResult<OpenCameraDto>>`,`code=0` 成功
|
|
|
192
|
+- 单条 `records[]` 字段映射:
|
|
208
|
193
|
|
|
209
|
|
-> 亦可由前端分别调 `GET /dataModel/pasture/list` 与 `GET /livestock/tradeMarket/list` 自行合并;**推荐**本接口以减少权限与字段差异。
|
|
|
194
|
+| 第三方字段 | 本地字段 |
|
|
|
195
|
+| --- | --- |
|
|
|
196
|
+| `cameraId` | `monitor_id` |
|
|
|
197
|
+| `deviceName` | `monitor_name`(超长截断至 10 字) |
|
|
|
198
|
+| `farmName` | `owner_name` |
|
|
|
199
|
+| `enclosureName` | `enclosure_name` |
|
|
|
200
|
+| `videoSource` | `video_source` |
|
|
210
|
201
|
|
|
211
|
|
-### 3.7 服务端校验(`LivestockMonitorValidation`)
|
|
|
202
|
+**阶段二:获取监控视频播放地址**
|
|
212
|
203
|
|
|
213
|
|
-| 项 | 规则 |
|
|
|
204
|
+- `GET /open-api/v1/iot/cameras/{cameraId}/play-url`
|
|
|
205
|
+- 响应 `data`:`cameraId`、`videoSource`、`videoUrl`
|
|
|
206
|
+- 本地:`UPDATE … SET video_url=? WHERE monitor_id=? AND del_flag='0'`
|
|
|
207
|
+
|
|
|
208
|
+**实现类**
|
|
|
209
|
+
|
|
|
210
|
+| 类 | 职责 |
|
|
214
|
211
|
| --- | --- |
|
|
215
|
|
-| 监控名称 | trim 后 1~10 字;非纯空白 |
|
|
216
|
|
-| 安装位置 | trim 后 1~10 字 |
|
|
217
|
|
-| IP | IPv4 正则;长度 ≤20;不支持 IPv6/域名 |
|
|
218
|
|
-| 主体 | `ownerType`∈{1,2};`ownerId` 非空;**§2.4** 存在且正常 |
|
|
219
|
|
-| 名称/IP 唯一 | **不校验** |
|
|
220
|
|
-| 删除 | 记录存在且 `del_flag=0` |
|
|
|
212
|
+| `ThirdPartyCameraClient` / `ThirdPartyCameraClientImpl` | HTTP / stub 拉取 |
|
|
|
213
|
+| `LivestockMonitorSyncService` | 同步编排、防重入 |
|
|
|
214
|
+| `LivestockMonitorSyncTxService` | 单条 upsert、单条更新 `video_url`(`REQUIRES_NEW`) |
|
|
|
215
|
+| `ThirdPartyFarmingHttpSupport` | 共用 RestTemplate、鉴权头(`industryservice` 包) |
|
|
221
|
216
|
|
|
222
|
|
-### 3.8 Mapper 约定
|
|
|
217
|
+**Stub 样例**
|
|
223
|
218
|
|
|
224
|
|
-- 列表/详情条件均带 `del_flag='0'`。
|
|
225
|
|
-- 模糊:`AND monitor_name LIKE CONCAT('%', #{monitorName}, '%')`
|
|
226
|
|
-- 主体精确:`AND owner_type = #{ownerType} AND owner_id = #{ownerId}`(两参数均非空时)
|
|
227
|
|
-- 逻辑删除:`UPDATE biz_livestock_monitor SET del_flag='2', update_by=?, update_time=? WHERE …`
|
|
|
219
|
+- `thirdparty/stub-cameras.json` — 监控列表
|
|
|
220
|
+- `thirdparty/stub-camera-play-urls.json` — 播放地址
|
|
228
|
221
|
|
|
229
|
|
-### 3.9 实时监控(本期)
|
|
|
222
|
+### 3.10 实时监控(本期)
|
|
230
|
223
|
|
|
231
|
|
-- **无**后端接口;列表「查看实时监控」由前端 `this.$modal.msgWarning('实时监控功能暂未开放…')` 处理。
|
|
|
224
|
+- **无**独立播放接口;列表「查看实时监控」由前端 `msgLiveNotOpen` 提示。
|
|
232
|
225
|
|
|
233
|
226
|
---
|
|
234
|
227
|
|
|
235
|
228
|
## 4. 菜单与权限(示例)
|
|
236
|
229
|
|
|
237
|
|
-| 类型 | 名称 | 权限标识 | 组件路径 |
|
|
238
|
|
-| --- | --- | --- | --- |
|
|
239
|
|
-| 目录 | 视频监控系统 | — | — |
|
|
240
|
|
-| 菜单 | 畜牧监控 | `videoSurveillance:livestockMonitor:list` | `videoSurveillance/livestockMonitor/index` |
|
|
241
|
|
-| 按钮 | 查询 | `videoSurveillance:livestockMonitor:query` | — |
|
|
242
|
|
-| 按钮 | 新增 | `videoSurveillance:livestockMonitor:add` | — |
|
|
243
|
|
-| 按钮 | 修改 | `videoSurveillance:livestockMonitor:edit` | — |
|
|
244
|
|
-| 按钮 | 删除 | `videoSurveillance:livestockMonitor:remove` | — |
|
|
|
230
|
+| 类型 | 名称 | 权限标识 |
|
|
|
231
|
+| --- | --- | --- |
|
|
|
232
|
+| 目录 | 视频监控系统 | — |
|
|
|
233
|
+| 菜单 | 畜牧监控 | `videoSurveillance:livestockMonitor:list` |
|
|
|
234
|
+| 按钮 | 查询 | `videoSurveillance:livestockMonitor:query` |
|
|
|
235
|
+| 按钮 | 新增 | `videoSurveillance:livestockMonitor:add` |
|
|
|
236
|
+| 按钮 | 修改 | `videoSurveillance:livestockMonitor:edit` |
|
|
|
237
|
+| 按钮 | 删除 | `videoSurveillance:livestockMonitor:remove` |
|
|
|
238
|
+| 按钮 | 同步 | `videoSurveillance:livestockMonitor:sync` |
|
|
245
|
239
|
|
|
246
|
|
-挂载「视频监控系统」菜单目录下;与 `livestock/*`、`dataModel/*` 路径前缀区分。
|
|
|
240
|
+组件路径:`videoSurveillance/livestockMonitor/index`
|
|
247
|
241
|
|
|
248
|
242
|
---
|
|
249
|
243
|
|
|
250
|
244
|
## 5. 模块关联
|
|
251
|
245
|
|
|
252
|
|
-| 模块 | 表 / 接口 | 关系 |
|
|
253
|
|
-| --- | --- | --- |
|
|
254
|
|
-| 牧场管理 | `biz_pasture` | `owner_type=1`;选项与校验 `biz_status=1` |
|
|
255
|
|
-| 交易市场管理 | `biz_trade_market` | `owner_type=2`;选项与校验 `operate_status=1` |
|
|
256
|
|
-| 用户管理 | `sys_user` | 本期无 `sys_user_id`;删除用户时若扩展引用 `biz_livestock_monitor.sys_user_id` 另议(**本期无**) |
|
|
|
246
|
+| 模块 | 关系 |
|
|
|
247
|
+| --- | --- |
|
|
|
248
|
+| 牧场管理 | `owner_type=1`;第三方同步养殖场列表同源配置 |
|
|
|
249
|
+| 交易市场管理 | `owner_type=2` |
|
|
|
250
|
+| 第三方生产管理系统 | 监控列表 + 播放地址开放接口 |
|
|
257
|
251
|
|
|
258
|
252
|
---
|
|
259
|
253
|
|
|
260
|
254
|
## 6. 交付清单
|
|
261
|
255
|
|
|
262
|
|
-- [ ] `sql/biz_livestock_monitor.sql`、菜单权限 SQL
|
|
263
|
|
-- [ ] `BizLivestockMonitor`、`LivestockMonitorMapper`/XML、`LivestockMonitorService`、`BizLivestockMonitorController`
|
|
264
|
|
-- [ ] `LivestockMonitorValidation`、`ownerOptions` 合并查询
|
|
265
|
|
-- [ ] 前端 `videoSurveillance/livestockMonitor/index.vue`、`api/videoSurveillance/livestockMonitor.js`
|
|
266
|
|
-- [ ] 单元测试(校验、主体停用、列表 SQL)
|
|
267
|
|
-- [ ] MockMvc(list 筛选、CRUD、删除)
|
|
|
256
|
+- [x] `sql/biz_livestock_monitor.sql`
|
|
|
257
|
+- [x] `BizLivestockMonitor`、`BizLivestockMonitorMapper`/XML、`BizLivestockMonitorServiceImpl`、`BizLivestockMonitorController`
|
|
|
258
|
+- [x] `LivestockMonitorValidation`、`LivestockMonitorSyncService`、`ThirdPartyCameraClientImpl`
|
|
|
259
|
+- [x] 前端 `livestockMonitor/index.vue`、`livestockMonitor.js`、同步按钮
|
|
|
260
|
+- [x] 单元测试 / MockMvc(含 `/sync`)
|
|
268
|
261
|
|
|
269
|
262
|
---
|
|
270
|
263
|
|
|
|
@@ -272,4 +265,6 @@ CREATE TABLE `biz_livestock_monitor` (
|
|
272
|
265
|
|
|
273
|
266
|
| 版本 | 说明 |
|
|
274
|
267
|
| --- | --- |
|
|
275
|
|
-| 1.0 | 初稿:对齐功能需求 v1.1;`biz_livestock_monitor`;CRUD + `ownerOptions`;无实时流接口 |
|
|
|
268
|
+| 1.0 | 初稿:CRUD + `ownerOptions`;含 `ip_address` |
|
|
|
269
|
+| 1.1 | 表结构:`monitor_id`、`enclosure_name`、`video_source`、`video_url`;移除 `ip_address`;主体/安装位置可选 |
|
|
|
270
|
+| 1.2 | 第三方同步:`POST /sync`;对接 `/iot/cameras` 与 `/iot/cameras/{id}/play-url`;复用 `third-party.farming` |
|