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:
+14
-9
@@ -49,6 +49,18 @@ func NewClient(config ClientConfig) *Client {
|
||||
}
|
||||
|
||||
func (c *Client) Call(ctx context.Context, serviceID string, baseInfo any, out any) (Result, error) {
|
||||
uploadInfo := contract.UploadInfo{
|
||||
BaseInfo: baseInfo,
|
||||
ManageInfo: contract.ManageInfo{
|
||||
DSFMC: c.config.UserName,
|
||||
OperateUser: c.config.OperateUser,
|
||||
OperateUnit: c.operateUnit(),
|
||||
},
|
||||
}
|
||||
return c.callUploadInfo(ctx, serviceID, uploadInfo, out)
|
||||
}
|
||||
|
||||
func (c *Client) callUploadInfo(ctx context.Context, serviceID string, uploadInfo any, out any) (Result, error) {
|
||||
if c.transport == nil {
|
||||
transport, err := NewTransport(TransportConfig{})
|
||||
if err != nil {
|
||||
@@ -63,15 +75,8 @@ func (c *Client) Call(ctx context.Context, serviceID string, baseInfo any, out a
|
||||
}
|
||||
|
||||
payload := contract.Envelope{
|
||||
ServiceID: serviceID,
|
||||
UploadInfo: contract.UploadInfo{
|
||||
BaseInfo: baseInfo,
|
||||
ManageInfo: contract.ManageInfo{
|
||||
DSFMC: c.config.UserName,
|
||||
OperateUser: c.config.OperateUser,
|
||||
OperateUnit: c.operateUnit(),
|
||||
},
|
||||
},
|
||||
ServiceID: serviceID,
|
||||
UploadInfo: uploadInfo,
|
||||
}
|
||||
|
||||
targetURL := c.urlFor(path)
|
||||
|
||||
@@ -6,7 +6,9 @@ import (
|
||||
)
|
||||
|
||||
const (
|
||||
ServiceIDJKDACreate = "JKDA00001"
|
||||
ServiceIDJKDAFind = "JKDA00002"
|
||||
ServiceIDJKDAUpdate = "JKDA00003"
|
||||
ServiceIDJKDAFindRqbj = "JKDA00005"
|
||||
ServiceIDGridAddress = "WGDZ00001"
|
||||
ServiceIDDoctors = "ZRYS00001"
|
||||
@@ -17,7 +19,9 @@ const (
|
||||
const codeRetryableTimeout = "405"
|
||||
|
||||
var servicePaths = map[string]string{
|
||||
ServiceIDJKDACreate: "/jkda/create",
|
||||
ServiceIDJKDAFind: "/auto/jkda/find",
|
||||
ServiceIDJKDAUpdate: "/jkda/update",
|
||||
ServiceIDJKDAFindRqbj: "/jkda/findrqbj",
|
||||
ServiceIDGridAddress: "/auto/wgdzcx/query",
|
||||
ServiceIDDoctors: "/auto/zryscx/query",
|
||||
|
||||
+20
@@ -23,6 +23,19 @@ type PersonSignResult struct {
|
||||
PersonSign string `json:"personSign"`
|
||||
}
|
||||
|
||||
func (c *Client) CreateHealthRecord(ctx context.Context, req contract.HealthRecordCreate) (contract.HealthRecordSaveResult, Result, error) {
|
||||
req.ManageInfo = c.manageInfo()
|
||||
var out contract.HealthRecordSaveResult
|
||||
result, err := c.callUploadInfo(ctx, ServiceIDJKDACreate, req, &out)
|
||||
return out, result, err
|
||||
}
|
||||
|
||||
func (c *Client) UpdateHealthRecord(ctx context.Context, req contract.HealthRecordCreate) (contract.HealthRecordSaveResult, Result, error) {
|
||||
req.ManageInfo = c.manageInfo()
|
||||
var out contract.HealthRecordSaveResult
|
||||
result, err := c.callUploadInfo(ctx, ServiceIDJKDAUpdate, req, &out)
|
||||
return out, result, err
|
||||
}
|
||||
func (c *Client) FindHealthRecord(ctx context.Context, query FindHealthRecordQuery) ([]contract.FindHealthRecord, Result, error) {
|
||||
baseInfo, err := query.baseInfo()
|
||||
if err != nil {
|
||||
@@ -43,6 +56,13 @@ func (c *Client) FindRqbj(ctx context.Context, query FindRqbjQuery) (PersonSignR
|
||||
return personSign, result, err
|
||||
}
|
||||
|
||||
func (c *Client) manageInfo() contract.ManageInfo {
|
||||
return contract.ManageInfo{
|
||||
DSFMC: c.config.UserName,
|
||||
OperateUser: c.config.OperateUser,
|
||||
OperateUnit: c.operateUnit(),
|
||||
}
|
||||
}
|
||||
func (q FindHealthRecordQuery) baseInfo() (map[string]string, error) {
|
||||
fields := []queryField{
|
||||
{name: "idCard", value: q.IDCard},
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user