feat(osi): 实现 JKDA 档案 Create/Update 与创建请求契约(T-206)

- contract/jkda.go 补创建请求结构体(healthRecord + manageInfo + 既往史节点)
- osi/jkda.go 新增 CreateHealthRecord/UpdateHealthRecord
- osi/codes.go 登记 JKDA00001 create / JKDA00003 update serviceId 与路径
- mapping 映射创建路径(真实字典快照反查主数据)
- 代码与单测完成;真实 create 待安全测试档案与写入授权(见 tasks.md T-206 BLOCKED)

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
ila
2026-07-07 23:11:17 +08:00
co-authored by Claude Opus 4.8
parent 12346c9923
commit f95a779daa
8 changed files with 253 additions and 9 deletions
+75
View File
@@ -7,8 +7,83 @@ import (
"net/http/httptest"
"testing"
"time"
"chis_osi/contract"
)
func TestCreateHealthRecordCallsJKDA00001WithUploadInfo(t *testing.T) {
var seenPath string
var seenPayload map[string]any
server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
seenPath = r.URL.Path
if err := json.NewDecoder(r.Body).Decode(&seenPayload); err != nil {
t.Fatalf("decode request: %v", err)
}
_, _ = w.Write([]byte(`{"code":"01","message":"操作成功","data":{"phrId":"PHR001","createUnit":"123456789"}}`))
}))
defer server.Close()
client := newTestJKDAClient(t, server.URL)
resultData, result, err := client.CreateHealthRecord(context.Background(), contract.HealthRecordCreate{
BaseInfo: contract.HealthRecordBaseInfo{IDCard: "440000********1234", PersonName: "测试人员"},
HealthRecord: contract.HealthRecordCreateInfo{
CheckID: "CHK2026070700000001",
IDCard: "440000********1234",
PersonName: "测试人员",
RegionCode: "441625000000",
ManaDoctorID: "doc-001",
ManaUnitID: "123456789",
},
})
if err != nil {
t.Fatalf("CreateHealthRecord: %v", err)
}
if !result.Success || result.Code != "01" {
t.Fatalf("result = %#v", result)
}
if seenPath != "/osi/api/jkda/create" {
t.Fatalf("path = %q", seenPath)
}
if seenPayload["serviceId"] != ServiceIDJKDACreate {
t.Fatalf("serviceId = %v", seenPayload["serviceId"])
}
uploadInfo := seenPayload["uploadinfo"].(map[string]any)
healthRecord := uploadInfo["healthRecord"].(map[string]any)
if healthRecord["checkId"] != "CHK2026070700000001" || healthRecord["manaUnitId"] != "123456789" {
t.Fatalf("healthRecord = %#v", healthRecord)
}
if resultData.PhrID != "PHR001" || resultData.CreateUnit != "123456789" {
t.Fatalf("resultData = %#v", resultData)
}
}
func TestUpdateHealthRecordCallsJKDA00003(t *testing.T) {
var seenPath string
var seenPayload map[string]any
server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
seenPath = r.URL.Path
if err := json.NewDecoder(r.Body).Decode(&seenPayload); err != nil {
t.Fatalf("decode request: %v", err)
}
_, _ = w.Write([]byte(`{"code":"01","message":"操作成功","data":{"phrId":"PHR001"}}`))
}))
defer server.Close()
client := newTestJKDAClient(t, server.URL)
_, _, err := client.UpdateHealthRecord(context.Background(), contract.HealthRecordCreate{
BaseInfo: contract.HealthRecordBaseInfo{IDCard: "440000********1234"},
HealthRecord: contract.HealthRecordCreateInfo{CheckID: "CHK2026070700000001", PhrID: "PHR001"},
})
if err != nil {
t.Fatalf("UpdateHealthRecord: %v", err)
}
if seenPath != "/osi/api/jkda/update" {
t.Fatalf("path = %q", seenPath)
}
if seenPayload["serviceId"] != ServiceIDJKDAUpdate {
t.Fatalf("serviceId = %v", seenPayload["serviceId"])
}
}
func TestFindHealthRecordCallsJKDA00002WithBaseInfo(t *testing.T) {
var seenPath string
var seenPayload map[string]any