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"` IDCard string `json:"idCard"` PHRID string `json:"phrId"` } func (c *Client) CreateHealthRecord(ctx context.Context, req contract.HealthRecordCreate) (contract.HealthRecordSaveResult, Result, error) { req.ManageInfo = c.manageInfoFor(req.ManageInfo.OperateUser) 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.manageInfoFor(req.ManageInfo.OperateUser) 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 { 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 (c *Client) manageInfo() contract.ManageInfo { return c.manageInfoFor("") } func (c *Client) manageInfoFor(operateUser string) contract.ManageInfo { if operateUser == "" { operateUser = c.config.OperateUser } return contract.ManageInfo{ DSFMC: c.config.UserName, OperateUser: operateUser, OperateUnit: c.operateUnit(), } } 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 }