Compare commits

...

10 Commits

Author SHA1 Message Date
Mrx
d7a5589873 f 2026-03-09 11:31:40 +08:00
Mrx
b0ec75d1af f 2026-03-06 16:39:00 +08:00
Mrx
57d18be972 f 2026-03-06 16:28:25 +08:00
Mrx
3d8775b6dc f 2026-03-06 15:20:27 +08:00
Mrx
f40950f890 f 2026-03-06 15:12:58 +08:00
Mrx
ba21a8f965 Merge branch 'main' of http://1.117.67.95:3000/team/tyapi-server 2026-03-06 10:56:37 +08:00
Mrx
7d2716da7a f 2026-03-06 10:56:36 +08:00
9a7bda9527 f 2026-03-05 19:03:18 +08:00
abdae033f0 f 2026-03-05 18:44:17 +08:00
96abacd392 f 2026-03-05 18:41:00 +08:00
8 changed files with 106 additions and 142 deletions

View File

@@ -420,7 +420,7 @@ type COMENT01Req struct {
}
type JRZQ09J8Req struct {
MobileNo string `json:"mobile_no" validate:"omitempty,min=11,max=11,validMobileNo"`
MobileNo string `json:"mobile_no" validate:"required,min=11,max=11,validMobileNo"`
IDCard string `json:"id_card" validate:"required,validIDCard"`
Name string `json:"name" validate:"required,min=1,validName"`
Authorized string `json:"authorized" validate:"required,oneof=0 1"`

View File

@@ -4011,8 +4011,10 @@ func calculateAgeAndSex(idCard string) (int, string) {
return 0, ""
}
now := time.Now()
// 计算年龄(简化处理,使用当前年份)
age := 2024 - year
age := now.Year() - year
// 提取性别第17位奇数为男偶数为女
sexCode := idCard[16:17]

View File

@@ -7,7 +7,7 @@ import (
"tyapi-server/internal/domains/api/dto"
"tyapi-server/internal/domains/api/services/processors"
"tyapi-server/internal/infrastructure/external/jiguang"
"tyapi-server/internal/infrastructure/external/zhicha"
)
// ProcessIVYZ5E3FRequest IVYZ5E3F API处理方法 - 婚姻评估查询
@@ -21,57 +21,36 @@ func ProcessIVYZ5E3FRequest(ctx context.Context, params []byte, deps *processors
return nil, errors.Join(processors.ErrInvalidParam, err)
}
// 构建极光请求参数(使用原始身份证和姓名)
reqData := map[string]interface{}{
// 与 IVYZ9H2M 一致,极光使用 id_no 作为身份证字段
"id_card": paramsDto.IDCard,
"name": paramsDto.Name,
encryptedName, err := deps.ZhichaService.Encrypt(paramsDto.Name)
if err != nil {
return nil, errors.Join(processors.ErrSystem, err)
}
// 调用极光婚姻查询接口
// apiCode: marriage-single用于请求头
// apiPath: marriage/single用于URL路径
respBytes, err := deps.JiguangService.CallAPI(ctx, "marriage-single", "marriage/single", reqData)
encryptedIDCard, err := deps.ZhichaService.Encrypt(paramsDto.IDCard)
if err != nil {
// 根据错误类型返回相应的错误
if errors.Is(err, jiguang.ErrNotFound) {
return nil, errors.Join(processors.ErrNotFound, err)
} else if errors.Is(err, jiguang.ErrDatasource) {
return nil, errors.Join(processors.ErrSystem, err)
}
reqData := map[string]interface{}{
"name": encryptedName,
"idCard": encryptedIDCard,
"authorized": paramsDto.Authorized,
}
respData, err := deps.ZhichaService.CallAPI(ctx, "ZCI029", reqData)
if err != nil {
if errors.Is(err, zhicha.ErrDatasource) {
return nil, errors.Join(processors.ErrDatasource, err)
} else {
return nil, errors.Join(processors.ErrSystem, err)
}
}
// 解析极光返回的数据
// 现在的婚姻状态编码为state
// 0-结婚 1-离婚 2-未匹配(均为字符串)
var jgResp struct {
State string `json:"state"`
}
if err := json.Unmarshal(respBytes, &jgResp); err != nil {
// 将响应数据转换为JSON字节
respBytes, err := json.Marshal(respData)
if err != nil {
return nil, errors.Join(processors.ErrSystem, err)
}
// 将极光的编码转换为旧的 state 定义:
// 1:已婚,2:未婚/未在民政局登记,3:离异
var state string
switch jgResp.State {
case "0": // 结婚
state = "1"
case "1": // 离婚
state = "3"
case "2": // 未匹配
state = "2"
default:
// 未知状态按未匹配处理
state = "2"
}
// 返回与之前一致的结构:{"state": "1/2/3"}
result := map[string]string{
"state": state,
}
return json.Marshal(result)
return respBytes, nil
}

View File

@@ -7,7 +7,7 @@ import (
"tyapi-server/internal/domains/api/dto"
"tyapi-server/internal/domains/api/services/processors"
"tyapi-server/internal/infrastructure/external/jiguang"
"tyapi-server/internal/infrastructure/external/zhicha"
)
// ProcessIVYZ81NCRequest IVYZ81NC API处理方法
@@ -21,55 +21,49 @@ func ProcessIVYZ81NCRequest(ctx context.Context, params []byte, deps *processors
return nil, errors.Join(processors.ErrInvalidParam, err)
}
// 构建极光请求参数(使用原始身份证和姓名)
reqData := map[string]interface{}{
// 与 IVYZ9H2M 一致,极光使用 id_no 作为身份证字段
"id_card": paramsDto.IDCard,
"name": paramsDto.Name,
encryptedName, err := deps.ZhichaService.Encrypt(paramsDto.Name)
if err != nil {
return nil, errors.Join(processors.ErrSystem, err)
}
// 调用极光婚姻查询接口
// apiCode: marriage-single用于请求头
// apiPath: marriage/single用于URL路径
respBytes, err := deps.JiguangService.CallAPI(ctx, "marriage-single", "marriage/single", reqData)
encryptedIDCard, err := deps.ZhichaService.Encrypt(paramsDto.IDCard)
if err != nil {
// 根据错误类型返回相应的错误
if errors.Is(err, jiguang.ErrNotFound) {
return nil, errors.Join(processors.ErrNotFound, err)
} else if errors.Is(err, jiguang.ErrDatasource) {
return nil, errors.Join(processors.ErrSystem, err)
}
reqData := map[string]interface{}{
"name": encryptedName,
"idCard": encryptedIDCard,
"authorized": "1", // 默认值
}
respData, err := deps.ZhichaService.CallAPI(ctx, "ZCI029", reqData)
if err != nil {
if errors.Is(err, zhicha.ErrDatasource) {
return nil, errors.Join(processors.ErrDatasource, err)
} else {
return nil, errors.Join(processors.ErrSystem, err)
}
}
// 解析极光返回的数据,期望格式为 {"state": "0"|"1"|"2"}
var jgResp struct {
// 解析响应数据,期望格式为 {"state": "1"}
var stateResp struct {
State string `json:"state"`
}
if err := json.Unmarshal(respBytes, &jgResp); err != nil {
// 将 respData 转换为 JSON 字节再解析
respDataBytes, err := json.Marshal(respData)
if err != nil {
return nil, errors.Join(processors.ErrSystem, err)
}
if err := json.Unmarshal(respDataBytes, &stateResp); err != nil {
return nil, errors.Join(processors.ErrSystem, err)
}
// 将极光的 state 编码转换为旧的 state 语义:
// 极光0-结婚 1-离婚 2-未匹配
// 旧定义1:已婚,2:未婚/未在民政局登记,3:离异
var oldState string
switch jgResp.State {
case "0": // 结婚
oldState = "1"
case "1": // 离婚
oldState = "3"
case "2": // 未匹配
oldState = "2"
default:
// 未知状态按未匹配处理
oldState = "2"
}
// 根据旧的 state 值转换为 81nc 格式
// 根据 state 转换为 81nc 格式
var opType, opTypeDesc string
switch oldState {
switch stateResp.State {
case "1": // 已婚
opType = "IA"
opTypeDesc = "结婚"

View File

@@ -8,7 +8,7 @@ import (
"tyapi-server/internal/domains/api/dto"
"tyapi-server/internal/domains/api/services/processors"
"tyapi-server/internal/infrastructure/external/jiguang"
"tyapi-server/internal/infrastructure/external/westdex"
)
// ProcessIVYZ9363Request IVYZ9363 API处理方法
@@ -17,6 +17,7 @@ func ProcessIVYZ9363Request(ctx context.Context, params []byte, deps *processors
if err := json.Unmarshal(params, &paramsDto); err != nil {
return nil, errors.Join(processors.ErrSystem, err)
}
if err := deps.Validator.ValidateStruct(paramsDto); err != nil {
return nil, errors.Join(processors.ErrInvalidParam, err)
}
@@ -25,72 +26,43 @@ func ProcessIVYZ9363Request(ctx context.Context, params []byte, deps *processors
return nil, errors.Join(processors.ErrInvalidParam, errors.New("请正确填写身份信息"))
}
// 构建极光双人婚姻查询请求参数
// 极光入参id_card_m / name_m / id_card_w / name_w / authCode
reqData := map[string]interface{}{
"id_card_m": paramsDto.ManIDCard,
"name_m": paramsDto.ManName,
"id_card_w": paramsDto.WomanIDCard,
"name_w": paramsDto.WomanName,
"authCode": deps.CallContext.ContractCode,
encryptedManName, err := deps.WestDexService.Encrypt(paramsDto.ManName)
if err != nil {
return nil, errors.Join(processors.ErrSystem, err)
}
// 调用极光双人婚姻查询接口
// apiCode: marriage-double-v2用于请求头
// apiPath: marriage/double-v2用于URL路径
respBytes, err := deps.JiguangService.CallAPI(ctx, "marriage-double-v2", "marriage/double-v2", reqData)
encryptedManIDCard, err := deps.WestDexService.Encrypt(paramsDto.ManIDCard)
if err != nil {
// 根据错误类型返回相应的错误
if errors.Is(err, jiguang.ErrNotFound) {
return nil, errors.Join(processors.ErrNotFound, err)
} else if errors.Is(err, jiguang.ErrDatasource) {
return nil, errors.Join(processors.ErrSystem, err)
}
encryptedWomanName, err := deps.WestDexService.Encrypt(paramsDto.WomanName)
if err != nil {
return nil, errors.Join(processors.ErrSystem, err)
}
encryptedWomanIDCard, err := deps.WestDexService.Encrypt(paramsDto.WomanIDCard)
if err != nil {
return nil, errors.Join(processors.ErrSystem, err)
}
reqData := map[string]interface{}{
"data": map[string]interface{}{
"name_man": encryptedManName,
"idcard_man": encryptedManIDCard,
"name_woman": encryptedWomanName,
"idcard_woman": encryptedWomanIDCard,
},
}
respBytes, err := deps.WestDexService.CallAPI(ctx, "G10XM02", reqData)
if err != nil {
if errors.Is(err, westdex.ErrDatasource) {
return nil, errors.Join(processors.ErrDatasource, err)
} else {
return nil, errors.Join(processors.ErrSystem, err)
}
}
// 解析极光返回的数据,示例:"result": "0"
// 0 结婚 1 离婚 2 未匹配(均为字符串)
var jgResp struct {
Result string `json:"result"`
}
if err := json.Unmarshal(respBytes, &jgResp); err != nil {
return nil, errors.Join(processors.ErrSystem, err)
}
// 将极光 result 映射为 81NC 业务类型
// 0: 结婚 -> IA / 结婚
// 1: 离婚 -> IB / 离婚
// 2: 未匹配 -> INR / 匹配不成功
var opType, opTypeDesc string
switch jgResp.Result {
case "0":
opType = "IA"
opTypeDesc = "结婚"
case "1":
opType = "IB"
opTypeDesc = "离婚"
case "2":
opType = "INR"
opTypeDesc = "匹配不成功"
default:
// 未知状态按未匹配处理
opType = "INR"
opTypeDesc = "匹配不成功"
}
// 构建当前接口对外约定的返回结构
result := map[string]interface{}{
"msg": "操作成功",
"code": 200,
"data": map[string]interface{}{
"op_date": "", // 极光未提供日期,这里保持空串
"op_type": opType, // IA / IB / INR
"op_type_desc": opTypeDesc, // 结婚 / 离婚 / 匹配不成功
},
"success": true,
}
return json.Marshal(result)
return respBytes, nil
}

View File

@@ -51,7 +51,13 @@ func ProcessQYGLJ0Q1Request(ctx context.Context, params []byte, deps *processors
return nil, errors.Join(processors.ErrSystem, err)
}
respBytes, err := json.Marshal(data)
// 解析响应中的 JSON 字符串(使用 qyglb4c0 中的 RecursiveParse
parsedResp, err := RecursiveParse(data)
if err != nil {
return nil, errors.Join(processors.ErrSystem, err)
}
respBytes, err := json.Marshal(parsedResp)
if err != nil {
return nil, errors.Join(processors.ErrSystem, err)
}

View File

@@ -42,7 +42,13 @@ func ProcessQYGLUY3SRequest(ctx context.Context, params []byte, deps *processors
return nil, errors.Join(processors.ErrSystem, err)
}
respBytes, err := json.Marshal(data)
// 解析响应中的 JSON 字符串(使用 qyglb4c0 中的 RecursiveParse
parsedResp, err := RecursiveParse(data)
if err != nil {
return nil, errors.Join(processors.ErrSystem, err)
}
respBytes, err := json.Marshal(parsedResp)
if err != nil {
return nil, errors.Join(processors.ErrSystem, err)
}

View File

@@ -210,8 +210,13 @@ func (z *ZhichaService) CallAPI(ctx context.Context, proID string, params map[st
return nil, ErrDatasource
}
// 201 表示查询为空,返回空对象
// 201 表示查询为空,兼容其它情况如果data也为空返回空对象
if zhichaResp.Code == "201" {
// 先做类型断言
dataMap, ok := zhichaResp.Data.(map[string]interface{})
if ok && len(dataMap) > 0 {
return dataMap, nil
}
return map[string]interface{}{}, nil
}