|
|
@@ -14,15 +14,16 @@
|
|
14
|
14
|
| **第三方** | HTTP/RPC 客户端(`RestTemplate` / `OkHttp` 等,实现期选型);配置项:地址、鉴权、超时 |
|
|
15
|
15
|
| **关联主数据** | `biz_pasture`(牧场,可选 `pasture_id` 映射) |
|
|
16
|
16
|
|
|
17
|
|
-**分层**:`Controller` → `YakAssetSyncService`(拉取、合并入库)→ `IYakAssetService`(查询)→ `Mapper`/XML → `domain`。
|
|
|
17
|
+**分层**:`Controller` → `LivestockFinanceMasterSyncService`(全量编排)→ 各 `*SyncService` / `*SyncTxService` → `Mapper`/XML → `domain`;IoT 数据由 `IotDataIncrementalSyncTask` 定时触发,**不**经列表页「同步」按钮。
|
|
18
|
18
|
|
|
19
|
|
-**代码位置**:`baqing-admin` → `com.ruoyi.web.modules.industryservice`(`BizYakAsset`、子表 Mapper、`ThirdPartyYakClientImpl`)。
|
|
|
19
|
+**代码位置**:`baqing-admin` → `com.ruoyi.web.modules.industryservice`。
|
|
20
|
20
|
|
|
21
|
21
|
**业务摘要**
|
|
22
|
22
|
|
|
23
|
23
|
| 场景 | 行为 |
|
|
24
|
24
|
| --- | --- |
|
|
25
|
|
-| 同步 | 按 `yak_no` 合并主表;子表按「先删后插」或「按批次版本」覆盖(**默认:每头牦牛同步时删除其旧子表再批量插入**) |
|
|
|
25
|
+| 同步(手动) | `POST /dataModel/yakAsset/sync` 触发**五段**基础全量:养殖场→圈舍→生产计划→批次→入栏建档;**不含** IoT |
|
|
|
26
|
+| IoT 同步(定时) | 每日 **凌晨 1:00** Quartz 任务;称重/定位项圈/环境监测;见 **§3.9** |
|
|
26
|
27
|
| 列表/详情 | `del_flag='0'`;排序 `status_change_date DESC, id DESC`(或与 `last_sync_time` 统一) |
|
|
27
|
28
|
| 月龄 | 列表/详情可展示库字段;同步时可写入,亦可用 `birth_date` 现场计算 |
|
|
28
|
29
|
| 删除 | 第三方下架策略**默认不物理删除**:仅更新状态或 `del_flag`(若第三方提供「离场」状态则映射为已出售/死亡等);全量对账删除须评审 |
|
|
|
@@ -150,9 +151,19 @@
|
|
150
|
151
|
|
|
151
|
152
|
### 2.6 子表 `biz_yak_pen_rel` / `biz_yak_batch_rel`
|
|
152
|
153
|
|
|
153
|
|
-圈舍:`pen_name`;批次:`batch_no`;均关联 `yak_asset_id`。详情接口冗余返回 `yakNo`。
|
|
|
154
|
+圈舍、批次信息已合并入主表字段 `pen_location`、`batch_no`;上述关联子表已废弃删除。
|
|
154
|
155
|
|
|
155
|
|
-### 2.7 枚举 `asset_status`
|
|
|
156
|
+### 2.7 IoT 落库表(定时同步,非手动「同步」按钮)
|
|
|
157
|
+
|
|
|
158
|
+| 表名 | 第三方接口 | 唯一键 | DDL |
|
|
|
159
|
+| --- | --- | --- | --- |
|
|
|
160
|
+| `biz_yak_weighing_record` | `GET /open-api/v1/iot/weighings` | `external_id` | `sql/biz_yak_weighing_record.sql` |
|
|
|
161
|
+| `biz_yak_collar_location` | `GET /open-api/v1/iot/collar-locations` | `(yak_no, report_time)` | `sql/biz_yak_collar_location.sql` |
|
|
|
162
|
+| `biz_env_monitoring_record` | `GET /open-api/v1/iot/env-monitoring` | `external_id` | `sql/biz_env_monitoring_record.sql` |
|
|
|
163
|
+
|
|
|
164
|
+关联解析:称重/项圈可关联 `biz_yak_asset`(优先 `cattleId`→`external_id`,其次耳标/`cattleNo`→`yak_no`);环境/称重可关联 `biz_pasture`、`biz_farm_enclosure`。
|
|
|
165
|
+
|
|
|
166
|
+### 2.8 枚举 `asset_status`
|
|
156
|
167
|
|
|
157
|
168
|
| 值 | 含义 |
|
|
158
|
169
|
| --- | --- |
|
|
|
@@ -221,7 +232,7 @@ CREATE TABLE `biz_yak_asset` (
|
|
221
|
232
|
| 3.3 | 按编号查详情 | GET | `/dataModel/yakAsset/byNo/{yakNo}` | `query` | 系谱跳转父/母 |
|
|
222
|
233
|
| 3.4 | 生理曲线 | GET | `/dataModel/yakAsset/{id}/physioChart` | `query` | Query `days` 默认 30 |
|
|
223
|
234
|
| 3.5 | 生长曲线 | GET | `/dataModel/yakAsset/{id}/growthChart` | `query` | 实测+预测分 `dataKind` |
|
|
224
|
|
-| 3.6 | 第三方同步 | POST | `/dataModel/yakAsset/sync` | `sync` | 返回 **3.6.1** 摘要 |
|
|
|
235
|
+| 3.6 | 第三方全量同步 | POST | `/dataModel/yakAsset/sync` | `sync` | 返回 **3.6.1**(五段统计;顶层 `insertCount` 兼容旧前端,取自入栏建档) |
|
|
225
|
236
|
|
|
226
|
237
|
本期**不提供** `POST/PUT/DELETE` 档案维护接口。
|
|
227
|
238
|
|
|
|
@@ -261,19 +272,21 @@ CREATE TABLE `biz_yak_asset` (
|
|
261
|
272
|
|
|
262
|
273
|
返回:`{ actual: [...], forecast: [...] }`,按 `data_kind` 分组。
|
|
263
|
274
|
|
|
264
|
|
-#### 3.6.1 同步响应(`data`)
|
|
|
275
|
+#### 3.6.1 全量同步响应(`data`)
|
|
|
276
|
+
|
|
|
277
|
+编排类:`LivestockFinanceMasterSyncService.syncAll()`。
|
|
265
|
278
|
|
|
266
|
279
|
| 字段 | 说明 |
|
|
267
|
280
|
| --- | --- |
|
|
268
|
|
-| `insertCount` | 新增头数 |
|
|
269
|
|
-| `updateCount` | 更新头数 |
|
|
270
|
|
-| `failCount` | 失败头数 |
|
|
271
|
|
-| `failMessages` | 失败摘要列表(可选) |
|
|
272
|
|
-| `syncTime` | 本次同步完成时间 |
|
|
|
281
|
+| `pasture` / `enclosure` / `plan` / `batch` / `yakAsset` | 各步骤 `{ insertCount, updateCount, failCount, failMessages?, syncTime }` |
|
|
|
282
|
+| `insertCount` / `updateCount` / `failCount` | **兼容旧前端**:取值自 `yakAsset` 步骤(入栏建档头数) |
|
|
|
283
|
+| `syncTime` | 本次全量同步开始时间 |
|
|
|
284
|
+
|
|
|
285
|
+**同步顺序**:`biz_pasture` → `biz_farm_enclosure` → `biz_farming_plan` → `biz_farming_batch` → `biz_yak_asset`。
|
|
273
|
286
|
|
|
274
|
|
-同步过程建议 `@Log` + `biz_yak_sync_log`(可选表:操作人、起止时间、结果 JSON)。
|
|
|
287
|
+IoT 三类数据**不在此接口**内执行,见 **§3.9**。
|
|
275
|
288
|
|
|
276
|
|
-### 3.7 第三方对接(实现要点)
|
|
|
289
|
+### 3.7 第三方对接 — 入栏建档(实现要点)
|
|
277
|
290
|
|
|
278
|
291
|
| 项 | 说明 |
|
|
279
|
292
|
| --- | --- |
|
|
|
@@ -284,7 +297,7 @@ CREATE TABLE `biz_yak_asset` (
|
|
284
|
297
|
| 牧场 | `farmId` → `biz_pasture.external_id`;失败则仅写 `farmName` |
|
|
285
|
298
|
| 事务 | 每头牦牛独立事务(`REQUIRES_NEW`);子表仅当 bundle 携带对应列表时覆盖 |
|
|
286
|
299
|
| Stub | `thirdparty/stub-yak-entries.json`(OpenAPI 记录样例) |
|
|
287
|
|
-| 并发 | `synchronized` 防重复点击 |
|
|
|
300
|
+| 并发 | 全量编排 `syncLock`;各子步骤 `AtomicBoolean` 防重入 |
|
|
288
|
301
|
|
|
289
|
302
|
### 3.8 查询约定
|
|
290
|
303
|
|
|
|
@@ -292,6 +305,30 @@ CREATE TABLE `biz_yak_asset` (
|
|
292
|
305
|
- 列表排序:`status_change_date DESC, id DESC`。
|
|
293
|
306
|
- 子表列表:`collect_time` 或业务字段倒序。
|
|
294
|
307
|
|
|
|
308
|
+### 3.9 IoT 数据定时同步
|
|
|
309
|
+
|
|
|
310
|
+| 项 | 说明 |
|
|
|
311
|
+| --- | --- |
|
|
|
312
|
+| **触发** | Quartz:`iotDataIncrementalSyncTask.syncIncremental` |
|
|
|
313
|
+| **Cron** | `0 0 1 * * ?`(每天凌晨 **1:00**) |
|
|
|
314
|
+| **初始化 SQL** | `sql/biz_sys_job_iot_data_incremental_sync.sql`(`sys_job` + `sys_config` 水印) |
|
|
|
315
|
+| **编排** | `IotDataIncrementalSyncService` → `YakWeighingSyncService` / `YakCollarLocationSyncService` / `EnvMonitoringSyncService` |
|
|
|
316
|
+| **配置** | 同源 `third-party.farming`(`base-url`、`app-key`、`app-secret`、`mode=http\|stub`) |
|
|
|
317
|
+| **水印** | `sys_config.third_party.iot.last_sync_time`;增量时作为 `updatedAfter`;任务成功后更新 |
|
|
|
318
|
+
|
|
|
319
|
+**全量 / 增量策略(按表独立)**
|
|
|
320
|
+
|
|
|
321
|
+| 本地表行数 `count(*)` | 模式 | HTTP 查询参数 |
|
|
|
322
|
+| --- | --- | --- |
|
|
|
323
|
+| **= 0**(表已清空) | **全量** | 不传 `startTime` / `endTime` / `updatedAfter`,分页拉取全部 |
|
|
|
324
|
+| **> 0** | **增量** | `startTime` = 最大事件时间 − 5 分钟;`endTime` = 当前;`updatedAfter` = 配置水印 |
|
|
|
325
|
+
|
|
|
326
|
+行数统计**不按** `del_flag` 过滤;仅 `TRUNCATE`/`DELETE` 清空整表后才会对该表走全量。
|
|
|
327
|
+
|
|
|
328
|
+**Stub 样例**:`thirdparty/stub-iot-weighings.json`、`stub-iot-collar-locations.json`、`stub-iot-env-monitoring.json`。
|
|
|
329
|
+
|
|
|
330
|
+**日志**:任务开始/结束写入应用日志;结束行输出 `IotDataIncrementalSyncResultVo` JSON。
|
|
|
331
|
+
|
|
295
|
332
|
---
|
|
296
|
333
|
|
|
297
|
334
|
## 4. 菜单与权限(示例)
|
|
|
@@ -309,6 +346,8 @@ CREATE TABLE `biz_yak_asset` (
|
|
309
|
346
|
## 5. 交付清单
|
|
310
|
347
|
|
|
311
|
348
|
- [ ] `sql/biz_yak_asset.sql`(主表 + 4 子表 + 可选同步日志表)
|
|
|
349
|
+- [ ] `LivestockFinanceMasterSyncService`、IoT `IotDataIncrementalSyncTask`
|
|
|
350
|
+- [ ] `sql/biz_yak_weighing_record.sql` 等 IoT 三表 + `sql/biz_sys_job_iot_data_incremental_sync.sql`
|
|
312
|
351
|
- [ ] `ThirdPartyYakClient`、`YakAssetSyncService`
|
|
313
|
352
|
- [ ] `BizYakAsset` Domain / Mapper / `IYakAssetService` / `BizYakAssetController`
|
|
314
|
353
|
- [ ] 单元测试(同步合并、状态映射、曲线查询)
|
|
|
@@ -322,3 +361,4 @@ CREATE TABLE `biz_yak_asset` (
|
|
322
|
361
|
| --- | --- |
|
|
323
|
362
|
| 1.0 | 初稿:主表+四子表;只读查询+同步接口;生长实测/预测分 `data_kind`;对接可配置 |
|
|
324
|
363
|
| 1.1 | 对齐入栏建档 OpenAPI:`OpenYakEntryDto`、`external_id`、分页拉取、字段映射 **§2.1.1** |
|
|
|
364
|
+| 1.2 | 全量同步扩展为五段编排;IoT 三表独立定时同步 **§2.7、§3.9**;全量/增量按表 `count(*)` 判断 |
|