AutoMedinfo/Readme-RPA.md

433 lines
13 KiB
Markdown
Raw Permalink Normal View History

# RPA 对接约定CNKI/万方检索)
本文档用于终端 RPA影刀配置参考说明任务拉取、状态回传与结果上报协议。当前后端已提供完整 REST API可直接通过 HTTP 调用。
## 1. 基本信息
- 基础地址Base URL根据部署而定例如 `http://localhost:8080/api`
- 注意:后端配置了 context-path `/api`,所有接口路径需要加上此前缀
- 鉴权:当前环境默认放开 CORS无鉴权头生产建议加网关或 Token 认证
- 编码UTF-8JSON 请求与响应
## 2. 名词与对象
- Inquiry查询请求一次客户问题受理流程的载体
- RpaTaskRPA 任务面向某一数据源CNKI/WANFANG的具体检索任务1 条检索式 = 1 个任务
- SearchResultItem检索结果项RPA 回传的单条文献信息,归属某个 Inquiry
## 3. 任务流转状态
- PENDING → RUNNING → COMPLETED | FAILED
- 失败可被重新拉取并重试(见 4.4
## 4. API 说明
### 4.1 为某查询创建 RPA 任务(用于前端/调试)
POST `/api/rpa-tasks/inquiry/{inquiryId}/create`
Request Body
```json
{
"source": "CNKI",
"queryExpressions": [
"阿莫西林 AND 不良反应",
"Amoxicillin adverse events"
]
}
```
Response200
```json
{
"success": true,
"message": "Success",
"data": [
{
"id": 123,
"inquiryId": 88,
"source": "CNKI",
"status": "PENDING",
"queryExpression": "阿莫西林 AND 不良反应",
"remark": null,
"createdAt": "2025-10-30T12:00:00",
"startedAt": null,
"finishedAt": null
}
],
"timestamp": 1727683200000
}
```
错误响应400
```json
{
"success": false,
"message": "数据源不能为空",
"timestamp": 1727683200000
}
```
### 4.2 获取所有RPA任务用于管理页面
GET `/api/rpa-tasks`
说明返回所有RPA任务按创建时间倒序排列。
Response200
```json
{
"success": true,
"data": [
{
"id": 123,
"inquiryId": 88,
"source": "CNKI",
"status": "PENDING",
"queryExpression": "阿莫西林 AND 不良反应",
"createdAt": "2025-10-30T12:00:00"
}
]
}
```
### 4.3 获取指定查询的所有RPA任务
GET `/api/rpa-tasks/inquiry/{inquiryId}`
说明返回指定查询的所有RPA任务按ID升序排列。
Response200
```json
{
"success": true,
"data": [
{
"id": 123,
"inquiryId": 88,
"source": "CNKI",
"status": "PENDING",
"queryExpression": "阿莫西林 AND 不良反应",
"createdAt": "2025-10-30T12:00:00"
}
]
}
```
### 4.4 RPA 轮询获取待执行任务
GET `/api/rpa-tasks/pending?source=CNKI`
说明:返回 `PENDING``FAILED` 的任务失败可重试。RPA 应按顺序逐个领取。
参数:
- `source`(必填):数据源,值为 `CNKI``WANFANG`(不区分大小写,自动转换)
Response200
```json
{
"success": true,
"data": [
{
"id": 123,
"inquiryId": 88,
"source": "CNKI",
"status": "PENDING",
"queryExpression": "阿莫西林 AND 不良反应",
"createdAt": "2025-10-30T12:00:00"
}
]
}
```
### 4.5 RPA 标记任务开始
POST `/api/rpa-tasks/{taskId}/start`
Response200
```json
{
"success": true,
"data": {
"id": 123,
"status": "RUNNING",
"startedAt": "2025-10-30T12:01:00"
}
}
```
### 4.6 RPA 回传检索结果
POST `/api/rpa-tasks/{taskId}/results`
Request Body数组单项结构如下尽可能填充字段均为可选
```json
[
{
"title": "文献题目",
"authors": "作者A; 作者B",
"source": "CNKI",
"sourceUrl": "https://...",
"publicationDate": "2023-09-01",
"summary": "摘要...",
"content": "全文内容(可选)",
"doi": "10.xxxx/xxx可选",
"pmid": "12345678可选",
"metadata": "{}可选后端会注入rpaTaskId和queryExpression"
}
]
```
说明:
- 后端会自动补全 `inquiryRequestId`根据任务关联的查询ID
- 如果 `source` 为空,会自动设置为任务的数据源
- 后端会在 `metadata` 中注入 `{ rpaTaskId, queryExpression }` 以便前端按任务分组展示
- 如果 `metadata` 已存在,会保留原有内容
Response200
```json
{
"success": true,
"data": [
{
"id": 999,
"inquiryRequestId": 88,
"title": "文献题目",
"authors": "作者A; 作者B",
"source": "CNKI",
"sourceUrl": "https://...",
"publicationDate": "2023-09-01",
"summary": "摘要...",
"metadata": "{\"rpaTaskId\":123,\"queryExpression\":\"阿莫西林 AND 不良反应\"}",
"status": "ACTIVE",
"includeInResponse": false,
"needDownload": false,
"createdAt": "2025-10-30T12:02:00"
}
]
}
```
任务成功回传后,任务状态将置为 `COMPLETED`
### 4.7 RPA 回传结果CNKI字符串格式
POST `/api/rpa-tasks/{taskId}/results/text`
说明接收CNKI引用格式的字符串后端自动解析为检索结果项。适用于影刀RPA机器人返回的CNKI引用格式数据。
Request Body字符串格式
```
[1]王冰冰. 注射用醋酸曲普瑞林序贯地诺孕素治疗卵巢子宫内膜异位症的临床效果[J].临床合理用药,2025,18(30):125-127.DOI:10.15887/j.cnki.13-1389/r.2025.30.034.
[2]黄婉茹,黄小盼,林少勇. 醋酸曲普瑞林联合重组人生长激素治疗大骨龄特发性中枢性性早熟女童的效果观察[J].大医生,2025,10(19):62-64.
```
格式说明:
- `[序号]`:文献序号
- `作者.`:作者信息(以.结尾)
- `标题[J].`:文章标题和文献类型[J](期刊)
- `期刊名,`:期刊名称(以,结尾)
- `年份,`:发表年份(以,结尾)
- `卷(期):页码`卷号、期号和页码如18(30):125-127
- `.DOI:xxx`DOI号可选以.DOI:开头)
特殊处理:
- 如果 `rawResult` 为空或null表示未检索到文献任务仍会标记为完成状态COMPLETED但返回空结果列表
- 后端会自动解析字符串,提取以下字段:
- `title`:文章题目
- `authors`:作者
- `summary`:期刊名称
- `publicationDate`:发表年份
- `content`:卷期页码信息(格式:卷:18, 期:30, 页码:125-127
- `doi`DOI号
- `sourceUrl`DOI链接如果有DOI自动构造 https://dx.doi.org/{doi}
- `source`:自动设置为"CNKI"
Response200
```json
{
"success": true,
"data": [
{
"id": 999,
"inquiryRequestId": 88,
"title": "注射用醋酸曲普瑞林序贯地诺孕素治疗卵巢子宫内膜异位症的临床效果",
"authors": "王冰冰",
"source": "CNKI",
"summary": "临床合理用药",
"publicationDate": "2025",
"content": "卷:18, 期:30, 页码:125-127",
"doi": "10.15887/j.cnki.13-1389/r.2025.30.034",
"sourceUrl": "https://dx.doi.org/10.15887/j.cnki.13-1389/r.2025.30.034",
"metadata": "{\"rpaTaskId\":123,\"queryExpression\":\"阿莫西林 AND 不良反应\"}"
}
]
}
```
### 4.8 RPA 标记任务失败(可重试)
POST `/api/rpa-tasks/{taskId}/fail?reason=网络错误`
参数:
- `reason`(可选):失败原因说明
Response200
```json
{
"success": true,
"data": {
"id": 123,
"inquiryId": 88,
"source": "CNKI",
"status": "FAILED",
"queryExpression": "阿莫西林 AND 不良反应",
"remark": "网络错误",
"createdAt": "2025-10-30T12:00:00",
"startedAt": "2025-10-30T12:01:00",
"finishedAt": "2025-10-30T12:05:00"
}
}
```
## 5. 参数验证与错误处理
### 5.1 创建任务参数验证
- `inquiryId`:必须为有效数字,且对应的查询请求存在
- `source`:必须为 `CNKI``WANFANG`(不区分大小写,自动转换为大写)
- `queryExpressions`:必须为非空数组,每个检索式不能为空字符串
- 空的检索式会被自动跳过,但至少需要有一个有效检索式才能创建任务
### 5.2 错误响应格式
所有接口在发生错误时会返回统一的错误响应:
```json
{
"success": false,
"message": "错误描述信息",
"timestamp": 1727683200000
}
```
常见HTTP状态码
- `400 Bad Request`:参数验证失败(如数据源为空、检索式列表为空等)
- `500 Internal Server Error`:服务器内部错误(如数据库连接失败等)
### 5.3 异常处理说明
- `IllegalArgumentException`:参数验证失败,返回 400 状态码
- `RuntimeException`:业务逻辑错误(如任务不存在),返回 500 状态码
## 6. 建议的轮询与执行策略
- 轮询频率:每 60 秒调用一次 4.4 接口(获取待处理任务);若无任务可适当退避
- 领取策略:
1) 调用 4.4 拉取待处理任务列表2) 取第一条 `taskId` 调用 4.5 标记开始3) 执行检索;
4) 根据返回数据格式选择接口:
- 如果返回JSON格式数组调用 4.6 接口(标准格式)
- 如果返回CNKI引用格式字符串调用 4.7 接口(字符串格式,自动解析)
5) 异常则调用 4.8 标记失败(可重试)
- 并发建议:同一来源每台终端控制在 1~2 并发,避免目标站封禁
## 7. 字段说明(摘要)
### 7.1 RpaTaskDTO 字段
- `id`任务IDLong
- `inquiryId`关联的查询请求IDLong
- `source`:数据源,值为 `CNKI``WANFANG`String
- `status`:任务状态,值为 `PENDING`、`RUNNING`、`COMPLETED`、`FAILED`String
- `queryExpression`检索表达式String最大长度2000
- `remark`备注信息如失败原因String最大长度1024可选
- `createdAt`创建时间LocalDateTime
- `startedAt`开始执行时间LocalDateTime可选
- `finishedAt`完成时间LocalDateTime可选
### 7.2 SearchResultItemDTO 回传字段(主要字段)
- `title`文献标题String可选
- `authors`作者String可选
- `source`数据源String如果为空会使用任务的数据源
- `sourceUrl`源链接String可选
- `publicationDate`发表日期String可选
- `summary`摘要String可选
- `content`全文内容String可选
- `doi`DOI号String可选
- `pmid`PMID号String可选
- `nctId`NCT IDString可选
- `metadata`元数据JSON字符串String可选后端会注入rpaTaskId和queryExpression
注意:后端会自动设置以下字段:
- `inquiryRequestId`根据任务关联的查询ID自动设置
- `source`:如果为空,使用任务的数据源
- `metadata`:如果为空,会注入 `{"rpaTaskId":xxx,"queryExpression":"xxx"}`;如果已有内容,会保留
## 8. 示例curl
获取所有任务:
```bash
curl -X GET "http://localhost:8080/api/rpa-tasks"
```
获取指定查询的任务:
```bash
curl -X GET "http://localhost:8080/api/rpa-tasks/inquiry/88"
```
获取待处理任务:
```bash
curl -X GET "http://localhost:8080/api/rpa-tasks/pending?source=CNKI"
```
创建任务:
```bash
curl -X POST "http://localhost:8080/api/rpa-tasks/inquiry/88/create" \
-H "Content-Type: application/json" \
-d '{
"source": "CNKI",
"queryExpressions": ["阿莫西林 AND 不良反应", "Amoxicillin adverse events"]
}'
```
标记开始:
```bash
curl -X POST "http://localhost:8080/api/rpa-tasks/123/start"
```
回传结果:
```bash
curl -X POST "http://localhost:8080/api/rpa-tasks/123/results" \
-H "Content-Type: application/json" \
-d '[
{
"title": "文献题目",
"authors": "作者A; 作者B",
"source": "CNKI",
"sourceUrl": "https://example.com",
"publicationDate": "2023-09-01",
"summary": "摘要..."
}
]'
```
标记失败:
```bash
curl -X POST "http://localhost:8080/api/rpa-tasks/123/fail?reason=网络错误"
```
回传结果CNKI字符串格式
```bash
curl -X POST "http://localhost:8080/api/rpa-tasks/123/results/text" \
-H "Content-Type: application/json" \
-d '[1]王冰冰. 注射用醋酸曲普瑞林序贯地诺孕素治疗卵巢子宫内膜异位症的临床效果[J].临床合理用药,2025,18(30):125-127.DOI:10.15887/j.cnki.13-1389/r.2025.30.034.'
```
注意字符串格式接口需要传递纯文本字符串不是JSON格式。
## 9. 前端展示要点(供联调参考)
- 查询详情页"知网"Tab 按 `{ rpaTaskId, queryExpression }` 分组展示RPA 回传后点击"刷新"即可看到新结果
- 前端会从 `metadata` 字段解析 `rpaTaskId``queryExpression` 来分组显示结果
## 10. 常见问题
### 10.1 任务重复执行
若上一次失败,任务会出现在待处理列表(状态为 `FAILED`),可再次执行并回传。
### 10.2 去重处理
如需服务器去重,可在回传时于 `metadata` 提供文献唯一标识,后续可在服务端增加去重逻辑。
### 10.3 数据源大小写
`source` 参数不区分大小写,后端会自动转换为大写(`CNKI` 或 `WANFANG`)。
### 10.4 空检索式处理
创建任务时,空的检索式会被自动跳过。但至少需要有一个有效检索式才能创建任务。
### 10.5 任务状态说明
- `PENDING`待处理等待RPA终端拉取执行
- `RUNNING`执行中RPA终端已标记开始
- `COMPLETED`:已完成,结果已成功回传
- `FAILED`:执行失败,可重新拉取并重试