docs: 依 JKDA00002 联调实测校准接口契约

- 成功码实测为字符串 "01"(docx 误写 "1"),判定按去前导零
- 查询类同走 uploadinfo 信封(baseInfo+manageInfo),非裸 baseInfo
- 三种机构码分层:18位统信码 / 9位机构码 / 12位区划码
- docs/04 新增 §8 JKDA00002 实测契约(请求信封+响应结构,已脱敏)
- docs/06 回填 A1~A9/B3/B6/C3/D2/D3 联调状态

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
ila
2026-07-06 20:09:43 +08:00
co-authored by Claude Opus 4.8
parent 1fd256993b
commit d7b769742b
4 changed files with 108 additions and 42 deletions
+63 -2
View File
@@ -126,12 +126,14 @@ checkId = 截断20位( 编码( 源系统标识 | dataType | 源记录主键 [ |
## 6. 校验与错误分类(与 pipeline 配合)
> 成功码以 docs/01 §1 为准:实测为字符串 `"01"`(非 `"1"`),判定按去前导零后 == `"1"`。
| 错误来源 | 分类 | 处理 |
| --- | --- | --- |
| 映射缺必填/码表未命中/格式非法 | 不可重试(数据错) | 直接 failed,回写 PHIS,附 ValidationError 明细 |
| 网络错误 / SOCKS / EOF / 超时 | 可重试 | 退避重试,计熔断 |
| OSI `code == "405"`(服务超时) | 可重试 | 退避重试 |
| OSI `code` 非 1 非 405(业务/权限拒绝) | 不可重试 | failed,记 message 供排查 |
| OSI `code` 非成功码非 405(业务/权限拒绝) | 不可重试 | failed,记 message 供排查 |
| HTTP 5xx / 429 | 可重试 | 退避重试 |
---
@@ -144,4 +146,63 @@ checkId = 截断20位( 编码( 源系统标识 | dataType | 源记录主键 [ |
- [ ] 老年人自理评估 `lnrzlpg` 字段
- [ ] 中医体质辨识 `lnrzyygl` 字段
- [ ] 中医健康指导 `zyjkzd` 字段 + serviceId
- [ ] 各列表/查询接口的分页与返回数组结构
- [x] 个人档案查询 JKDA00002 的请求信封与返回结构 —— 已联调实测,见 §8
- [ ] 其余列表/查询接口的分页与返回数组结构(体检/老年人/中医指导)
---
## 8. JKDA00002 个人档案查询 · 联调实测契约
> 来源:2026-07 沙箱一次成功查询(`code="01"` 操作成功)。**下方均为脱敏结构**,真实身份证/姓名/联系方式等 PII 只在本地样本,不入库。
> 这是 `contract/` 里 `FindHealthRecord` 请求/响应结构体与 `osi.FindHealthRecord` 的事实基线。
### 8.1 请求(POST `/osi/api/auto/jkda/find`)
```json
{
"serviceId": "JKDA00002",
"uploadinfo": {
"baseInfo": { "idCard": "<idCard>" },
"manageInfo": { "DSFMC": "<userName>", "operateUser": "<operateUser>", "operateUnit": "<orgCode-18位>" }
}
}
```
- `baseInfo` 三选一:`idCard` / `phrid` / `personName`。
- `manageInfo` 三字段来自机构级常量(见 docs/01 §3 三种机构码区分)。
- 请求头另带 `orgCode`(=operateUnit) / `deviceSN`(查询可空) / `ts` / `userName`(=DSFMC) / `password`,签名规则见 docs/01 §2。
### 8.2 响应(`code="01"`,`data` 为**数组**,每元素 = 一份档案聚合)
| 节点 | 类型 | 说明 |
| --- | --- | --- |
| `healthRecord` | object | 档案主体(人口学 + 管理字段),见 8.3 |
| `pastHistory` | object | 既往史**标志位**:`ywgms`(药物过敏)/`jwsjb`标志/`bls`/`ycbs`(遗传病)/`cjqk`(残疾)/`jzsfqn`/`jzsmq`/`jzszn`/`jzsxdjm`(家族史·父/母/子女/兄弟姐妹) 等 code |
| `jwsjb` | array | 既往疾病:`{ jwsjbcode, jwsjbmc, jwsjbqzsj(确诊时间) }` |
| `jwsss` | array | 既往手术:`{ jwssscode, jwsssmc, jwsssqzsj }` |
| `jwsws` | array | 既往外伤:`{ jwswscode, jwswsmc }` |
| `jwssx` | array | 既往输血:`{ jwssxcode, jwssxyy(原因) }` |
| `familyMiddle` | object | 生活环境:`waterSourceCode`/`fuelType`/`cookAirTool`/`washroom`/`livestockColumn`/`isFillShhj` |
> `pastHistory`/`familyMiddle` 实测是 **object**(非 docx 查询侧标的 list);多选标志仍以码值出现。
### 8.3 `healthRecord` 关键字段(实测字段名,注意坑点拼写)
| 字段 | 语义 | 备注 |
| --- | --- | --- |
| `idCard` `personName` `sexCode` `birthday` | 人口学主键四要素 | 直传+校验 |
| `phrId` | 健康档案号 | 注意驼峰 `phrId`(查询入参用小写 `phrid`) |
| `empiId` | EMPI 主索引 | 32 位十六进制串 |
| `checkId` | 第三方业务唯一码 | 本样本为 `null`(存量档案无 checkId)→ 佐证幂等键需我方生成,见 §5 |
| `manaUnitId` `createUnit` | 管辖/建档机构 | **9 位机构码**,≠ 请求头 orgCode(18位) |
| `manaDoctorId` `createUser` | 责任医生/建档人 | 机构内人员 ID |
| `regionCode` `addressCode` `homePlaceCode` | 行政区划/网格码 | 12 位 |
| `address` `adressNumber` | 现住址/门牌号 | ⚠门牌号字段名少一个 d:`adressNumber` |
| `homePlace` `homePlaceNumber` | 户籍地/门牌 | |
| `nationCode` `educationCode` `workCode` `maritalStatusCode` `bloodTypeCode` `rhBloodCode` `insuranceCode` | 码表字段 | 走 dict.go 双向查表(§3) |
| `personGroup` `otherPersonGroup` | 人群标记 | 与 JKDA00005 `personSign` 联动 |
| `isFillShhj` | 是否填生活环境 | `y`/`n` |
| `contact` `contactPhone` `mobileNumber` `phoneNumber` | 联系人/电话 | PII |
| `status` `createDate` | 档案状态/建档日期 | |
> 建模提示:`data` 用数组承接(可能多档案/多版本);`insuranceType`、`otherPersonGroup`、`checkId` 等实测可为 `null`,结构体用指针或 `omitempty`,映射层不得因 null 报错。