feat(osi): 实现 JKDA 查询方法(T-203)
This commit is contained in:
+4
-2
@@ -6,13 +6,15 @@ import (
|
||||
)
|
||||
|
||||
const (
|
||||
ServiceIDJKDAFind = "JKDA00002"
|
||||
ServiceIDJKDAFind = "JKDA00002"
|
||||
ServiceIDJKDAFindRqbj = "JKDA00005"
|
||||
)
|
||||
|
||||
const codeRetryableTimeout = "405"
|
||||
|
||||
var servicePaths = map[string]string{
|
||||
ServiceIDJKDAFind: "/auto/jkda/find",
|
||||
ServiceIDJKDAFind: "/auto/jkda/find",
|
||||
ServiceIDJKDAFindRqbj: "/jkda/findrqbj",
|
||||
}
|
||||
|
||||
func PathOf(serviceID string) (string, error) {
|
||||
|
||||
+81
@@ -0,0 +1,81 @@
|
||||
package osi
|
||||
|
||||
import (
|
||||
"context"
|
||||
"fmt"
|
||||
|
||||
"chis_osi/contract"
|
||||
)
|
||||
|
||||
type FindHealthRecordQuery struct {
|
||||
IDCard string
|
||||
EMPIID string
|
||||
PHRID string
|
||||
PersonName string
|
||||
}
|
||||
|
||||
type FindRqbjQuery struct {
|
||||
IDCard string
|
||||
PHRID string
|
||||
}
|
||||
|
||||
type PersonSignResult struct {
|
||||
PersonSign string `json:"personSign"`
|
||||
}
|
||||
|
||||
func (c *Client) FindHealthRecord(ctx context.Context, query FindHealthRecordQuery) ([]contract.FindHealthRecord, Result, error) {
|
||||
baseInfo, err := query.baseInfo()
|
||||
if err != nil {
|
||||
return nil, Result{}, err
|
||||
}
|
||||
var records []contract.FindHealthRecord
|
||||
result, err := c.Call(ctx, ServiceIDJKDAFind, baseInfo, &records)
|
||||
return records, result, err
|
||||
}
|
||||
|
||||
func (c *Client) FindRqbj(ctx context.Context, query FindRqbjQuery) (PersonSignResult, Result, error) {
|
||||
baseInfo, err := query.baseInfo()
|
||||
if err != nil {
|
||||
return PersonSignResult{}, Result{}, err
|
||||
}
|
||||
var personSign PersonSignResult
|
||||
result, err := c.Call(ctx, ServiceIDJKDAFindRqbj, baseInfo, &personSign)
|
||||
return personSign, result, err
|
||||
}
|
||||
|
||||
func (q FindHealthRecordQuery) baseInfo() (map[string]string, error) {
|
||||
fields := []queryField{
|
||||
{name: "idCard", value: q.IDCard},
|
||||
{name: "empiId", value: q.EMPIID},
|
||||
{name: "phrid", value: q.PHRID},
|
||||
{name: "personName", value: q.PersonName},
|
||||
}
|
||||
return singleBaseInfo("find health record", fields)
|
||||
}
|
||||
|
||||
func (q FindRqbjQuery) baseInfo() (map[string]string, error) {
|
||||
fields := []queryField{
|
||||
{name: "idCard", value: q.IDCard},
|
||||
{name: "phrid", value: q.PHRID},
|
||||
}
|
||||
return singleBaseInfo("find rqbj", fields)
|
||||
}
|
||||
|
||||
type queryField struct {
|
||||
name string
|
||||
value string
|
||||
}
|
||||
|
||||
func singleBaseInfo(operation string, fields []queryField) (map[string]string, error) {
|
||||
baseInfo := make(map[string]string, 1)
|
||||
for _, field := range fields {
|
||||
if field.value == "" {
|
||||
continue
|
||||
}
|
||||
baseInfo[field.name] = field.value
|
||||
}
|
||||
if len(baseInfo) != 1 {
|
||||
return nil, fmt.Errorf("%s requires exactly one query key", operation)
|
||||
}
|
||||
return baseInfo, nil
|
||||
}
|
||||
@@ -0,0 +1,145 @@
|
||||
package osi
|
||||
|
||||
import (
|
||||
"context"
|
||||
"encoding/json"
|
||||
"net/http"
|
||||
"net/http/httptest"
|
||||
"testing"
|
||||
"time"
|
||||
)
|
||||
|
||||
func TestFindHealthRecordCallsJKDA00002WithBaseInfo(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":[{"healthRecord":{"phrId":"PHR001","idCard":"440000********1234","adressNumber":"101号"}}]}`))
|
||||
}))
|
||||
defer server.Close()
|
||||
|
||||
client := newTestJKDAClient(t, server.URL)
|
||||
records, result, err := client.FindHealthRecord(context.Background(), FindHealthRecordQuery{IDCard: "440000********1234"})
|
||||
if err != nil {
|
||||
t.Fatalf("FindHealthRecord: %v", err)
|
||||
}
|
||||
if !result.Success || result.Code != "01" {
|
||||
t.Fatalf("result = %#v", result)
|
||||
}
|
||||
if seenPath != "/osi/api/auto/jkda/find" {
|
||||
t.Fatalf("path = %q", seenPath)
|
||||
}
|
||||
if seenPayload["serviceId"] != ServiceIDJKDAFind {
|
||||
t.Fatalf("serviceId = %v", seenPayload["serviceId"])
|
||||
}
|
||||
baseInfo := seenPayload["uploadinfo"].(map[string]any)["baseInfo"].(map[string]any)
|
||||
if baseInfo["idCard"] != "440000********1234" {
|
||||
t.Fatalf("baseInfo = %#v", baseInfo)
|
||||
}
|
||||
if len(records) != 1 || records[0].HealthRecord.PhrID != "PHR001" || records[0].HealthRecord.AdressNumber != "101号" {
|
||||
t.Fatalf("records = %#v", records)
|
||||
}
|
||||
}
|
||||
|
||||
func TestFindHealthRecordSupportsEMPIAndPHRIDQueries(t *testing.T) {
|
||||
tests := []struct {
|
||||
name string
|
||||
q FindHealthRecordQuery
|
||||
key string
|
||||
want string
|
||||
}{
|
||||
{name: "empi", q: FindHealthRecordQuery{EMPIID: "empi-001"}, key: "empiId", want: "empi-001"},
|
||||
{name: "phrid", q: FindHealthRecordQuery{PHRID: "phr-001"}, key: "phrid", want: "phr-001"},
|
||||
}
|
||||
for _, tt := range tests {
|
||||
t.Run(tt.name, func(t *testing.T) {
|
||||
var seenPayload map[string]any
|
||||
server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
||||
if err := json.NewDecoder(r.Body).Decode(&seenPayload); err != nil {
|
||||
t.Fatalf("decode request: %v", err)
|
||||
}
|
||||
_, _ = w.Write([]byte(`{"code":"01","message":"操作成功","data":[]}`))
|
||||
}))
|
||||
defer server.Close()
|
||||
|
||||
client := newTestJKDAClient(t, server.URL)
|
||||
if _, _, err := client.FindHealthRecord(context.Background(), tt.q); err != nil {
|
||||
t.Fatalf("FindHealthRecord: %v", err)
|
||||
}
|
||||
baseInfo := seenPayload["uploadinfo"].(map[string]any)["baseInfo"].(map[string]any)
|
||||
if baseInfo[tt.key] != tt.want {
|
||||
t.Fatalf("baseInfo = %#v", baseInfo)
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
func TestFindHealthRecordRejectsEmptyOrAmbiguousQuery(t *testing.T) {
|
||||
client := NewClient(ClientConfig{})
|
||||
for _, q := range []FindHealthRecordQuery{
|
||||
{},
|
||||
{IDCard: "440000********1234", PHRID: "phr-001"},
|
||||
} {
|
||||
if _, _, err := client.FindHealthRecord(context.Background(), q); err == nil {
|
||||
t.Fatalf("FindHealthRecord accepted query %#v", q)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func TestFindRqbjCallsJKDA00005AndDecodesPersonSign(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":{"personSign":"PU,LAO"}}`))
|
||||
}))
|
||||
defer server.Close()
|
||||
|
||||
client := newTestJKDAClient(t, server.URL)
|
||||
personSign, result, err := client.FindRqbj(context.Background(), FindRqbjQuery{PHRID: "phr-001"})
|
||||
if err != nil {
|
||||
t.Fatalf("FindRqbj: %v", err)
|
||||
}
|
||||
if !result.Success || result.Code != "01" {
|
||||
t.Fatalf("result = %#v", result)
|
||||
}
|
||||
if seenPath != "/osi/api/jkda/findrqbj" {
|
||||
t.Fatalf("path = %q", seenPath)
|
||||
}
|
||||
if seenPayload["serviceId"] != ServiceIDJKDAFindRqbj {
|
||||
t.Fatalf("serviceId = %v", seenPayload["serviceId"])
|
||||
}
|
||||
baseInfo := seenPayload["uploadinfo"].(map[string]any)["baseInfo"].(map[string]any)
|
||||
if baseInfo["phrid"] != "phr-001" {
|
||||
t.Fatalf("baseInfo = %#v", baseInfo)
|
||||
}
|
||||
if personSign.PersonSign != "PU,LAO" {
|
||||
t.Fatalf("personSign = %#v", personSign)
|
||||
}
|
||||
}
|
||||
|
||||
func newTestJKDAClient(t *testing.T, baseURL string) *Client {
|
||||
t.Helper()
|
||||
transport, err := NewTransport(TransportConfig{Timeout: time.Second})
|
||||
if err != nil {
|
||||
t.Fatalf("NewTransport: %v", err)
|
||||
}
|
||||
return NewClient(ClientConfig{
|
||||
BaseURL: baseURL,
|
||||
OrgCode: "12441625456962881G",
|
||||
UserName: "dyytgw",
|
||||
Ask: "secret-key",
|
||||
OperateUser: "712041",
|
||||
OperateUnit: "12441625456962881G",
|
||||
Transport: transport,
|
||||
NowMillis: func() string {
|
||||
return "1700000000123"
|
||||
},
|
||||
})
|
||||
}
|
||||
Reference in New Issue
Block a user