Files
chis_osi/docs/current-state.md
T
ilaandClaude Opus 4.8 66bf37bcd3 docs: 登记 T-301 体检查询契约与字段清单
- docs/04 §11 体检 ~260 字段清单(7 节点)供将来 create 用
- docs/01 §5.2 标注各体检接口联调状态(单查未部署)
- tasks T-301 DONE;gitignore 收敛为 scripts/*.py

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-08 00:45:47 +08:00

9.1 KiB
Raw Blame History

当前实现状态

可覆盖的当前快照:记录仓库现实、可运行命令、blocker 和下一步,防止只看计划而忽略现状。 历史流水追加到 ../progress.md;任务状态以 ../tasks.md 为准。

当前快照

  • 日期:2026-07-07
  • 阶段:Phase D 创建/更新代码基线完成,真实写入验收受阻;T-001~T-006、T-201、T-203、T-102、T-202、T-205、T-101、T-103 已验收;T-206 已完成本地契约/客户端/映射组装代码,但未执行真实 JKDA00001 create
  • 技术栈:Go 1.24 单二进制;main.go -mode server|deliver;配置读取使用 viper,支持环境变量覆盖;OSI 客户端已具备签名、信封、传输、基础判码、JKDA00002 Find、JKDA00005 FindRqbj、JKDA00001 Create、JKDA00003 Update,以及 WGDZ/ZRYS/YPML/CXJG 四个公开查询薄封装
  • 生产代码:已有 main.go、config/、contract/envelope.go、contract/jkda.go、osi/ 薄客户端、cache/dictionary.go、verify_jkda.go、go.mod/go.sum;mapping/dict.go、mapping/health_record.go、mapping/checkid.go 已建立映射纯函数、码表基线、主数据反查接入点和创建请求组装;handler/health_record.go+server.go 提供 server 模式查询端点;pipeline/ 等业务模块仍待后续任务建立
  • 联调现实:JKDA00002 个人档案查询已用 Go 侧真实请求打通,返回 code="01" message="操作成功" data_count=1;公开查询 WGDZ00001/ZRYS00001/CXJG00002 已用真实档案主数据验证通过,均返回 code="01" 且数组非空;药品目录 YPML00001 已完成客户端封装和单测,尚未做真实药品关键字样本验证;JKDA00001 create 未跑真实请求,避免在没有安全测试居民/写入授权时污染平台档案
  • 测试:go test ./... 通过;当前测试覆盖 mode 解析、配置加载与环境变量覆盖、MD5 签名、请求头组装、JSON POST 传输、头名大小写保留、identity 响应编码声明、超时配置、SOCKS5 代理地址校验、信封结构、serviceId 路由、成功/重试判码、Client.Call 请求与响应解析、JKDA00002 查询响应契约、JKDA00001/00003 创建更新请求契约与客户端方法、JKDA00002 Find、JKDA00005 FindRqbj、公开查询四接口、字典缓存快照与持久化失败不阻断、映射码表双向查找、民族 01~56 完整性、健康档案映射必填/码表校验、主数据名称反查、创建请求组装、checkId 确定性、docx/联调风格映射样本基线、JKDA00002 验证入口
  • 标准启动路径:./init.sh 已配置三步:依赖下载、go test ./...、go run . -mode server -config config.yaml.example
  • 标准验证路径:go test ./...、go build ./...
  • 当前 blocker:T-206 真实 create 验收缺少可写入沙箱的安全测试居民资料或明确写入授权。软限制:当前机器从 Git Bash 启动 Go 会出现标准库路径/构建缓存权限异常,init.sh 无法完整跑完;PowerShell 下等价 Go 命令和真实查询通过。厂家侧 B1/B2/B4/B5 契约缺口只影响阶段 4

当前目录要点

路径 状态 说明
main.go 已有 单入口,解析 `-mode server
config/ 已有 viper 配置加载,支持 OSI_* 等环境变量覆盖
contract/envelope.go 已有 OSI 通用信封与 manageInfo 结构
contract/jkda.go 已有 JKDA00002 查询响应结构体;JKDA00001/00003 创建更新请求结构体与保存结果结构体
osi/sign.go 已有 OSI 请求头 MD5 签名与 headers 组装
osi/transport.go 已有 OSI JSON POST 传输层;原始 HTTP/1.1 写请求以保留头名大小写;支持超时与可选 SOCKS5
osi/codes.go 已有 serviceId 路由与成功/可重试判码;已包含 JKDA 查询/创建/更新与四个公开查询 serviceId
osi/client.go 已有 通用 Call:签名头 + 查询信封 + 传输 + 响应解析;内部 callUploadInfo 支持创建/更新完整 uploadinfo
osi/jkda.go 已有 JKDA00001 Create、JKDA00003 Update、JKDA00002 Find、JKDA00005 FindRqbj
osi/public.go 已有 WGDZ00001 网格、ZRYS00001 责任医生、YPML00001 药品、CXJG00002 机构查询
cache/dictionary.go 已有 公开字典内存快照;按名称反查 regionCode/manaDoctorId/manaUnitId;可选持久化失败不阻断
verify_jkda.go 已有 JKDA00002 真实请求验证辅助入口
config.yaml.example 已有 占位配置,不含真实凭据
go.mod go.sum 已有 module chis_osi,依赖 viper 与 golang.org/x/net/proxy
docs/ 已有 设计文档集 01~06 + 本快照;docs/04 §9 记录公开查询脱敏实测契约,docs/04 §10 记录创建/更新本地契约;账号.txt 本地留存不入库
tasks.md progress.md 已有 任务看板 / 执行流水(根目录)
scripts/ 已有·不入库 Python 联调脚本(硬编码真实凭据与身份证,勿提交)
config.yaml 已有·不入库 真实/本地配置;不要提交
mapping/dict.go 已有 性别/民族/血型/RH/文化程度/职业/婚姻/医保/personSign 双向码表;未命中返回 ValidationError
mapping/health_record.go mapping/checkid.go 已有 健康档案映射草稿、字典快照注入、主数据反查、创建请求组装(含 createUser/createUnit 派生)、必填/码表校验、确定性 checkId
mapping/health_record_baseline_test.go 已有 docx 风格、联调风格、脏数据映射回归样本
handler/health_record.go 已有 GET /api/health-record/find 查询端点,回写平台完整响应
server.go osi_client.go 已有 server 模式起 HTTP 服务、注册路由;buildOSIClient 共用构造(verify 与 server 复用)
pipeline/ 等 待建 后续任务

已验证事实(写代码时直接依赖)

  • 签名:password = md5("ts=<13位毫秒ts>&ask=<ask>") 32 位小写,与 Python hashlib 向量一致。
  • 信封:查询也走 {"serviceId", "uploadinfo": {"baseInfo", "manageInfo"}},见 docs/04 §8 与 docs/04 §9。
  • 创建/更新信封:baseInfo、manageInfo、healthRecord 等节点在 uploadinfo 下同级;本地契约见 docs/04 §10,真实 create 样本待补。
  • 成功码:字符串 "01"(判定按去前导零 == "1"),见 docs/01 §1。
  • 405 为平台服务调用超时,可重试。
  • 机构码分层:请求头 orgCode=18 位统信码 ≠ manaUnitId=9 位机构码 ≠ 12 位区划码,见 docs/01 §3。
  • deviceSN 查询可空。
  • OSI 代理语义:socks5_proxy 非空即只对 OSI 客户端走 SOCKS5,不做直连回退。
  • 真实平台/代理对请求头名大小写敏感;Go net/http 会规范化头名,OSI 传输层需保留 orgCode/deviceSN/userName 的原始大小写。裸写传输层默认请求 Accept-Encoding: identity,避免收到未解压压缩响应。
  • 公开字典查询返回 data 数组;网格、责任医生、机构三类已真实验证可作为 T-103 字典缓存来源。
  • cache.DictionarySnapshot 可作为 mapping.MapContext.MasterData 注入;PHIS 只有名称、缺平台码时,映射层可反查补齐主数据,未命中仍按必填错误处理。
  • 创建请求侧门牌号字段为 addressNumber;查询响应侧实测字段为错拼 adressNumber,两者分开建模。

当前可运行内容

# Go 骨架验证
go test ./...
go build ./...
go test ./contract ./osi
go test ./cache ./mapping
go run . -mode deliver -config config.yaml.example

# 统一入口(当前 Git Bash 环境存在 Go 标准库/缓存权限限制)
./init.sh

# Go 侧 JKDA00002 联调验证(已实测查通,返回 code=01 data_count=1)
# config.yaml 已迁为 Go 嵌套 osi: 结构并从中读凭据;仅身份证走环境变量,不落文件/命令行历史
OSI_VERIFY_ID_CARD=<idCard> go run . -verify-jkda -config config.yaml

# server 模式 HTTP 查询端点(已实测;用真实 config.yaml,默认仅绑 127.0.0.1:8080)
go run . -mode server                 # 起服务(阻塞)
curl "http://127.0.0.1:8080/api/health-record/find?idCard=<idCard>"   # 返回平台完整档案 JSON

# 本地 Python 联调查询(脚本硬编码凭据,勿提交)
python3 scripts/query_health_record.py

下一步

读先行调整(2026-07-08):写入(T-206/T-204)被厂家授权锁死,先推其余业务线查询。

  1. ✅ T-301 体检查询打通(osi.LastHealthCheck JKTJLSJL00002;字段清单 docs/04 §11)——待 go test ./... 复验。
  2. T-302 体检 HTTP 查询端点(复用 T-208 handler 模式)——当前可领。
  3. 并行催厂家(docs/06 ★ 优先催办):写入授权+测试档案、缺失列表/单查 serviceId、checkId/完整度规则。
  4. 授权到位后回到 T-206 真实 create 验收 → T-204。

维护规则

发生以下变化时覆盖更新本文:入口/目录变动、任务状态变化、新增可运行命令、发现文档与代码现实不一致。本文只留当前快照,不留历史。