From a6f858dbd3174320bdf2febc29ce1cd5d86c4177 Mon Sep 17 00:00:00 2001 From: Mrx <18278715334@163.com> Date: Sat, 31 Jan 2026 11:32:53 +0800 Subject: [PATCH] f --- internal/domains/api/dto/api_request_dto.go | 14 +++++- .../api/services/api_request_service.go | 3 ++ .../api/services/form_config_service.go | 24 +++++++++- .../processors/jrzq/jrzqdcbe_processor.go | 1 - .../processors/qcxg/qcxg3m7z_processor.go | 47 +++++++++++++++++++ .../processors/qcxg/qcxgu2k4_processor.go | 45 ++++++++++++++++++ .../processors/qcxg/qcxgy7f2_processor.go | 8 +++- 7 files changed, 137 insertions(+), 5 deletions(-) create mode 100644 internal/domains/api/services/processors/qcxg/qcxg3m7z_processor.go create mode 100644 internal/domains/api/services/processors/qcxg/qcxgu2k4_processor.go diff --git a/internal/domains/api/dto/api_request_dto.go b/internal/domains/api/dto/api_request_dto.go index 84cf7ed..ed4b9f7 100644 --- a/internal/domains/api/dto/api_request_dto.go +++ b/internal/domains/api/dto/api_request_dto.go @@ -123,6 +123,11 @@ type YYSYK9R4Req struct { type QCXG9F5CReq struct { PlateNo string `json:"plate_no" validate:"required"` } +type QCXG3M7ZReq struct { + PlateNo string `json:"plate_no" validate:"required"` + Name string `json:"name" validate:"required,min=1,validName"` + PlateColor string `json:"plate_color" validate:"omitempty"` +} type QCXG3B8ZReq struct { PlateNo string `json:"plate_no" validate:"required"` } @@ -135,8 +140,15 @@ type QCXGP1W3Req struct { type QCXG5U0ZReq struct { VinCode string `json:"vin_code" validate:"required"` } +type QCXGU2K4Req struct { + PlateNo string `json:"plate_no" validate:"required"` +} type QCXGY7F2Req struct { - VinCode string `json:"vin_code" validate:"required"` + VinCode string `json:"vin_code" validate:"required"` + VehicleName string `json:"vehicle_name" validate:"omitempty"` + VehicleLocation string `json:"vehicle_location" validate:"required"` + FirstRegistrationdate string `json:"first_registrationdate" validate:"required"` + Color string `json:"color" validate:"omitempty"` } type QYGL6F2DReq struct { IDCard string `json:"id_card" validate:"required,validIDCard"` diff --git a/internal/domains/api/services/api_request_service.go b/internal/domains/api/services/api_request_service.go index b0700d9..368e70f 100644 --- a/internal/domains/api/services/api_request_service.go +++ b/internal/domains/api/services/api_request_service.go @@ -205,6 +205,7 @@ func registerAllProcessors(combService *comb.CombService) { "YYSYS9W1": yysy.ProcessYYSYS9W1Request, //手机携号转网查询 "YYSYK8R3": yysy.ProcessYYSYK8R3Request, //手机空号检测查询 "YYSYH6F3": yysy.ProcessYYSYH6F3Request, //运营商三要素即时版查询 + "YYSYK9R4": yysy.ProcessYYSYK9R4Request, //全网手机三要素验证1979周更新版 // IVYZ系列处理器 "IVYZ0B03": ivyz.ProcessIVYZ0B03Request, @@ -274,8 +275,10 @@ func registerAllProcessors(combService *comb.CombService) { "QCXG3B8Z": qcxg.ProcessQCXG3B8ZRequest, //疑似运营车辆查询(月度里程)10268 "QCXGP1W3": qcxg.ProcessQCXGP1W3Request, //疑似运营车辆查询(季度里程)10269 "QCXGM7R9": qcxg.ProcessQCXGM7R9Request, //疑似运营车辆查询(半年度里程)10270 + "QCXGU2K4": qcxg.ProcessQCXGU2K4Request, //疑似运营车辆查询(年度里程)10271 "QCXG5U0Z": qcxg.ProcessQCXG5U0ZRequest, // 车辆静态信息查询 10479 "QCXGY7F2": qcxg.ProcessQCXGY7F2Request, // 二手车VIN估值 10443 + "QCXG3M7Z": qcxg.ProcessQCXG3M7ZRequest, //人车关系核验(ETC)10093 月更 // DWBG系列处理器 - 多维报告 "DWBG6A2C": dwbg.ProcessDWBG6A2CRequest, diff --git a/internal/domains/api/services/form_config_service.go b/internal/domains/api/services/form_config_service.go index 98fa35e..18f3a6e 100644 --- a/internal/domains/api/services/form_config_service.go +++ b/internal/domains/api/services/form_config_service.go @@ -249,9 +249,11 @@ func (s *FormConfigServiceImpl) getDTOStruct(ctx context.Context, apiCode string "QCXG3B8Z": &dto.QCXG3B8ZReq{}, //疑似运营车辆查询(月度里程)10268 "QCXGP1W3": &dto.QCXGP1W3Req{}, //疑似运营车辆查询(季度里程)10269 "QCXGM7R9": &dto.QCXGM7R9Req{}, //疑似运营车辆查询(半年度里程)10270 + "QCXGU2K4": &dto.QCXGU2K4Req{}, //疑似运营车辆查询(年度里程)10271 "QCXG5U0Z": &dto.QCXG5U0ZReq{}, //车辆静态信息查询 10479 "QCXGY7F2": &dto.QCXGY7F2Req{}, //二手车VIN估值 10443 - + "YYSYK9R4": &dto.YYSYK9R4Req{}, //全网手机三要素验证1979周更新版 + "QCXG3M7Z": &dto.QCXG3M7ZReq{}, //人车关系核验(ETC)10093 月更 } // 优先返回已配置的DTO @@ -467,6 +469,11 @@ func (s *FormConfigServiceImpl) generateFieldLabel(jsonTag string) string { "image_url": "行驶证图片地址", "reg_url": "车辆登记证图片地址", "token": "token采集及获取结果时所使用的凭证,有效期2个小时,在此时效内,应用侧可以发起采集请求(重复的采集所触发的结果会被忽略)和结果查询", + "vehicle_name": "车型名称", + "vehicle_location": "车辆所在地", + "first_registrationdate": "首次登记日期", + "color": "颜色", + "plate_color": "车牌颜色", } if label, exists := labelMap[jsonTag]; exists { @@ -524,6 +531,11 @@ func (s *FormConfigServiceImpl) generateExampleValue(fieldType reflect.Type, jso "image_url": "https://example.com/images/driving_license.jpg", "reg_url": "https://example.com/images/vehicle_registration.jpg", "token": "0fc79b80371f45e2ac1c693ef9136b24", + "vehicle_name": "车型名称,示例:凌派 2020款 锐·混动 1.5L 锐·舒适版", + "vehicle_location": "车辆所在地,示例:北京市", + "first_registrationdate": "首次登记日期,示例:2020-01-01", + "color": "颜色,示例:白色", + "plate_color": "车牌颜色,示例:蓝", } if example, exists := exampleMap[jsonTag]; exists { @@ -590,6 +602,11 @@ func (s *FormConfigServiceImpl) generatePlaceholder(jsonTag string, fieldType st "image_url": "请输入行驶证图片地址", "reg_url": "请输入车辆登记证图片地址", "token": "请输入token", + "vehicle_name": "请输入车型名称", + "vehicle_location": "请输入车辆所在地", + "first_registrationdate": "请输入首次登记日期", + "color": "请输入颜色", + "plate_color": "请输入车牌颜色", } if placeholder, exists := placeholderMap[jsonTag]; exists { @@ -658,6 +675,11 @@ func (s *FormConfigServiceImpl) generateDescription(jsonTag string, validation s "image_url": "行驶证图片地址(必填):请提供行驶证的图片URL地址", "reg_url": "车辆登记证图片地址(非必填):请提供车辆登记证的图片URL地址", "token": "token采集及获取结果时所使用的凭证,有效期2个小时,在此时效内,应用侧可以发起采集请求(重复的采集所触发的结果会被忽略)和结果查询", + "vehicle_name": "车型名称", + "vehicle_location": "车辆所在地", + "first_registrationdate": "首次登记日期", + "color": "颜色", + "plate_color": "车牌颜色", } if desc, exists := descMap[jsonTag]; exists { diff --git a/internal/domains/api/services/processors/jrzq/jrzqdcbe_processor.go b/internal/domains/api/services/processors/jrzq/jrzqdcbe_processor.go index c0b517a..4cca73a 100644 --- a/internal/domains/api/services/processors/jrzq/jrzqdcbe_processor.go +++ b/internal/domains/api/services/processors/jrzq/jrzqdcbe_processor.go @@ -58,6 +58,5 @@ func ProcessJRZQDCBERequest(ctx context.Context, params []byte, deps *processors return nil, errors.Join(processors.ErrSystem, err) } } - return respBytes, nil } diff --git a/internal/domains/api/services/processors/qcxg/qcxg3m7z_processor.go b/internal/domains/api/services/processors/qcxg/qcxg3m7z_processor.go new file mode 100644 index 0000000..c14c53b --- /dev/null +++ b/internal/domains/api/services/processors/qcxg/qcxg3m7z_processor.go @@ -0,0 +1,47 @@ +package qcxg + +import ( + "context" + "encoding/json" + "errors" + + "tyapi-server/internal/domains/api/dto" + "tyapi-server/internal/domains/api/services/processors" + "tyapi-server/internal/infrastructure/external/shujubao" +) + +// ProcessQCXG3M7ZRequest QCXG3M7Z 人车关系核验(ETC)10093 月更 API 处理方法(使用数据宝服务示例) +func ProcessQCXG3M7ZRequest(ctx context.Context, params []byte, deps *processors.ProcessorDependencies) ([]byte, error) { + var paramsDto dto.QCXG3M7ZReq + if err := json.Unmarshal(params, ¶msDto); err != nil { + return nil, errors.Join(processors.ErrSystem, err) + } + + if err := deps.Validator.ValidateStruct(paramsDto); err != nil { + return nil, errors.Join(processors.ErrInvalidParam, err) + } + + // 构建数据宝入参:姓名、身份证、手机号、银行卡号(sign 外的业务参数可按需 AES 加密后作为 bodyData) + reqParams := map[string]interface{}{ + "key": "a2f32fc54b44ebc85b97a2aaff1734ec", + "carNo": paramsDto.PlateNo, + "name": paramsDto.Name, + "plateColor": paramsDto.PlateColor, + } + + // 最终请求 URL = https://api.chinadatapay.com/communication + 拼接接口地址值,如 personal/197 + apiPath := "/communication/personal/10093" + data, err := deps.ShujubaoService.CallAPI(ctx, apiPath, reqParams) + if err != nil { + if errors.Is(err, shujubao.ErrDatasource) { + return nil, errors.Join(processors.ErrDatasource, err) + } + return nil, errors.Join(processors.ErrSystem, err) + } + + respBytes, err := json.Marshal(data) + if err != nil { + return nil, errors.Join(processors.ErrSystem, err) + } + return respBytes, nil +} diff --git a/internal/domains/api/services/processors/qcxg/qcxgu2k4_processor.go b/internal/domains/api/services/processors/qcxg/qcxgu2k4_processor.go new file mode 100644 index 0000000..8f94d17 --- /dev/null +++ b/internal/domains/api/services/processors/qcxg/qcxgu2k4_processor.go @@ -0,0 +1,45 @@ +package qcxg + +import ( + "context" + "encoding/json" + "errors" + + "tyapi-server/internal/domains/api/dto" + "tyapi-server/internal/domains/api/services/processors" + "tyapi-server/internal/infrastructure/external/shujubao" +) + +// ProcessQCXGU2K4Request QCXGU2K4 疑似运营车辆查询(年度里程)10271 API 处理方法(使用数据宝服务示例) +func ProcessQCXGU2K4Request(ctx context.Context, params []byte, deps *processors.ProcessorDependencies) ([]byte, error) { + var paramsDto dto.QCXGU2K4Req + if err := json.Unmarshal(params, ¶msDto); err != nil { + return nil, errors.Join(processors.ErrSystem, err) + } + + if err := deps.Validator.ValidateStruct(paramsDto); err != nil { + return nil, errors.Join(processors.ErrInvalidParam, err) + } + + // 构建数据宝入参:姓名、身份证、手机号、银行卡号(sign 外的业务参数可按需 AES 加密后作为 bodyData) + reqParams := map[string]interface{}{ + "key": "8c02f9c755b37b5a1bd39fc6ac9569d6", + "carNo": paramsDto.PlateNo, + } + + // 最终请求 URL = https://api.chinadatapay.com/communication + 拼接接口地址值,如 personal/197 + apiPath := "/communication/personal/10271" + data, err := deps.ShujubaoService.CallAPI(ctx, apiPath, reqParams) + if err != nil { + if errors.Is(err, shujubao.ErrDatasource) { + return nil, errors.Join(processors.ErrDatasource, err) + } + return nil, errors.Join(processors.ErrSystem, err) + } + + respBytes, err := json.Marshal(data) + if err != nil { + return nil, errors.Join(processors.ErrSystem, err) + } + return respBytes, nil +} diff --git a/internal/domains/api/services/processors/qcxg/qcxgy7f2_processor.go b/internal/domains/api/services/processors/qcxg/qcxgy7f2_processor.go index d5c9add..4182596 100644 --- a/internal/domains/api/services/processors/qcxg/qcxgy7f2_processor.go +++ b/internal/domains/api/services/processors/qcxg/qcxgy7f2_processor.go @@ -22,8 +22,12 @@ func ProcessQCXGY7F2Request(ctx context.Context, params []byte, deps *processors } reqParams := map[string]interface{}{ - "key": "463cea654a0a99d5d04c62f98ac882c0", - "vin": paramsDto.VinCode, + "key": "463cea654a0a99d5d04c62f98ac882c0", + "vin": paramsDto.VinCode, + "model_name": paramsDto.VehicleName, + "Vehicle_location": paramsDto.VehicleLocation, + "firstRegistrationDate": paramsDto.FirstRegistrationdate, + "color": paramsDto.Color, } apiPath := "/government/traffic/10443"