diff --git a/internal/application/user/user_application_service_impl.go b/internal/application/user/user_application_service_impl.go index ddd48ee..f1df09f 100644 --- a/internal/application/user/user_application_service_impl.go +++ b/internal/application/user/user_application_service_impl.go @@ -339,19 +339,19 @@ func (s *UserApplicationServiceImpl) ListUsers(ctx context.Context, query *queri EnterpriseAddress: user.EnterpriseInfo.EnterpriseAddress, CreatedAt: user.EnterpriseInfo.CreatedAt, } - + // 获取企业合同信息 contracts, err := s.contractService.FindByUserID(ctx, user.ID) if err == nil && len(contracts) > 0 { contractItems := make([]*responses.ContractInfoItem, 0, len(contracts)) for _, contract := range contracts { contractItems = append(contractItems, &responses.ContractInfoItem{ - ID: contract.ID, - ContractName: contract.ContractName, - ContractType: string(contract.ContractType), + ID: contract.ID, + ContractName: contract.ContractName, + ContractType: string(contract.ContractType), ContractTypeName: contract.GetContractTypeName(), - ContractFileURL: contract.ContractFileURL, - CreatedAt: contract.CreatedAt, + ContractFileURL: contract.ContractFileURL, + CreatedAt: contract.CreatedAt, }) } item.EnterpriseInfo.Contracts = contractItems @@ -411,19 +411,19 @@ func (s *UserApplicationServiceImpl) GetUserDetail(ctx context.Context, userID s EnterpriseAddress: user.EnterpriseInfo.EnterpriseAddress, CreatedAt: user.EnterpriseInfo.CreatedAt, } - + // 获取企业合同信息 contracts, err := s.contractService.FindByUserID(ctx, user.ID) if err == nil && len(contracts) > 0 { contractItems := make([]*responses.ContractInfoItem, 0, len(contracts)) for _, contract := range contracts { contractItems = append(contractItems, &responses.ContractInfoItem{ - ID: contract.ID, - ContractName: contract.ContractName, - ContractType: string(contract.ContractType), + ID: contract.ID, + ContractName: contract.ContractName, + ContractType: string(contract.ContractType), ContractTypeName: contract.GetContractTypeName(), - ContractFileURL: contract.ContractFileURL, - CreatedAt: contract.CreatedAt, + ContractFileURL: contract.ContractFileURL, + CreatedAt: contract.CreatedAt, }) } item.EnterpriseInfo.Contracts = contractItems diff --git a/internal/domains/api/dto/api_request_dto.go b/internal/domains/api/dto/api_request_dto.go index e80b734..2de8555 100644 --- a/internal/domains/api/dto/api_request_dto.go +++ b/internal/domains/api/dto/api_request_dto.go @@ -584,6 +584,9 @@ type YYSY6F2BReq struct { MobileNo string `json:"mobile_no" validate:"required,min=11,max=11,validMobileNo"` } +type IVYZOCR1Req struct { + PhotoData string `json:"photo_data" validate:"required,validBase64Image"` +} type YYSY8B1CReq struct { MobileNo string `json:"mobile_no" validate:"required,min=11,max=11,validMobileNo"` } diff --git a/internal/domains/api/services/api_request_service.go b/internal/domains/api/services/api_request_service.go index 20bb17c..70b4cd6 100644 --- a/internal/domains/api/services/api_request_service.go +++ b/internal/domains/api/services/api_request_service.go @@ -248,6 +248,7 @@ func registerAllProcessors(combService *comb.CombService) { "IVYZN2P8": ivyz.ProcessIVYZN2P8Request, //身份证实名认证政务版 "IVYZX5QZ": ivyz.ProcessIVYZX5QZRequest, //活体检测 "IVYZX5Q2": ivyz.ProcessIVYZX5Q2Request, //活体识别步骤二 + "IVYZOCR1": ivyz.ProcessIVYZOCR1Request, //身份证OCR // COMB系列处理器 - 只注册有自定义逻辑的组合包 "COMB86PM": comb.ProcessCOMB86PMRequest, // 有自定义逻辑:重命名ApiCode diff --git a/internal/domains/api/services/form_config_service.go b/internal/domains/api/services/form_config_service.go index 800e0a0..2f321d1 100644 --- a/internal/domains/api/services/form_config_service.go +++ b/internal/domains/api/services/form_config_service.go @@ -255,6 +255,7 @@ func (s *FormConfigServiceImpl) getDTOStruct(ctx context.Context, apiCode string "YYSYK9R4": &dto.YYSYK9R4Req{}, //全网手机三要素验证1979周更新版 "QCXG3M7Z": &dto.QCXG3M7ZReq{}, //人车关系核验(ETC)10093 月更 "JRZQ1P5G": &dto.JRZQ1P5GReq{}, //全国自然人借贷压力指数查询(2) + "IVYZOCR1": &dto.IVYZOCR1Req{}, //身份证OCR } // 优先返回已配置的DTO diff --git a/internal/domains/api/services/processors/ivyz/ivyzocr1_processor.go b/internal/domains/api/services/processors/ivyz/ivyzocr1_processor.go new file mode 100644 index 0000000..4bbf7a4 --- /dev/null +++ b/internal/domains/api/services/processors/ivyz/ivyzocr1_processor.go @@ -0,0 +1,48 @@ +package ivyz + +import ( + "context" + "encoding/json" + "errors" + + "tyapi-server/internal/domains/api/dto" + "tyapi-server/internal/domains/api/services/processors" + "tyapi-server/internal/infrastructure/external/shujubao" +) + +// ProcessIVYZOCR1Request IVYZOCR1 身份证OCR API 处理方法(使用数据宝服务示例) +func ProcessIVYZOCR1Request(ctx context.Context, params []byte, deps *processors.ProcessorDependencies) ([]byte, error) { + var paramsDto dto.IVYZOCR1Req + 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": "8782f2a32463f75b53096323461df735", + "imageId": paramsDto.PhotoData, + } + + // 最终请求 URL = https://api.chinadatapay.com/communication + 拼接接口地址值,如 personal/197 + apiPath := "/trade/user/1985" + data, err := deps.ShujubaoService.CallAPI(ctx, apiPath, reqParams) + if err != nil { + if errors.Is(err, shujubao.ErrDatasource) { + return nil, errors.Join(processors.ErrDatasource, err) + } + if errors.Is(err, shujubao.ErrQueryEmpty) { + return nil, errors.Join(processors.ErrNotFound, 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/infrastructure/database/repositories/user/gorm_user_repository.go b/internal/infrastructure/database/repositories/user/gorm_user_repository.go index dee6ea7..7f98e85 100644 --- a/internal/infrastructure/database/repositories/user/gorm_user_repository.go +++ b/internal/infrastructure/database/repositories/user/gorm_user_repository.go @@ -20,7 +20,7 @@ import ( ) const ( - UsersTable = "users" + UsersTable = "users" UserCacheTTL = 30 * 60 // 30分钟 ) @@ -415,7 +415,7 @@ func (r *GormUserRepository) GetSystemUserStatsByDateRange(ctx context.Context, // GetSystemDailyUserStats 获取系统每日用户统计 func (r *GormUserRepository) GetSystemDailyUserStats(ctx context.Context, startDate, endDate time.Time) ([]map[string]interface{}, error) { var results []map[string]interface{} - + sql := ` SELECT DATE(created_at) as date, @@ -426,19 +426,19 @@ func (r *GormUserRepository) GetSystemDailyUserStats(ctx context.Context, startD GROUP BY DATE(created_at) ORDER BY date ASC ` - + err := r.GetDB(ctx).Raw(sql, startDate.Format("2006-01-02"), endDate.Format("2006-01-02")).Scan(&results).Error if err != nil { return nil, err } - + return results, nil } // GetSystemMonthlyUserStats 获取系统每月用户统计 func (r *GormUserRepository) GetSystemMonthlyUserStats(ctx context.Context, startDate, endDate time.Time) ([]map[string]interface{}, error) { var results []map[string]interface{} - + sql := ` SELECT TO_CHAR(created_at, 'YYYY-MM') as month, @@ -449,19 +449,19 @@ func (r *GormUserRepository) GetSystemMonthlyUserStats(ctx context.Context, star GROUP BY TO_CHAR(created_at, 'YYYY-MM') ORDER BY month ASC ` - + err := r.GetDB(ctx).Raw(sql, startDate, endDate).Scan(&results).Error if err != nil { return nil, err } - + return results, nil } // GetSystemDailyCertificationStats 获取系统每日认证用户统计(基于is_certified字段) func (r *GormUserRepository) GetSystemDailyCertificationStats(ctx context.Context, startDate, endDate time.Time) ([]map[string]interface{}, error) { var results []map[string]interface{} - + sql := ` SELECT DATE(updated_at) as date, @@ -473,19 +473,19 @@ func (r *GormUserRepository) GetSystemDailyCertificationStats(ctx context.Contex GROUP BY DATE(updated_at) ORDER BY date ASC ` - + err := r.GetDB(ctx).Raw(sql, startDate.Format("2006-01-02"), endDate.Format("2006-01-02")).Scan(&results).Error if err != nil { return nil, err } - + return results, nil } // GetSystemMonthlyCertificationStats 获取系统每月认证用户统计(基于is_certified字段) func (r *GormUserRepository) GetSystemMonthlyCertificationStats(ctx context.Context, startDate, endDate time.Time) ([]map[string]interface{}, error) { var results []map[string]interface{} - + sql := ` SELECT TO_CHAR(updated_at, 'YYYY-MM') as month, @@ -497,12 +497,12 @@ func (r *GormUserRepository) GetSystemMonthlyCertificationStats(ctx context.Cont GROUP BY TO_CHAR(updated_at, 'YYYY-MM') ORDER BY month ASC ` - + err := r.GetDB(ctx).Raw(sql, startDate, endDate).Scan(&results).Error if err != nil { return nil, err } - + return results, nil } @@ -510,7 +510,7 @@ func (r *GormUserRepository) GetSystemMonthlyCertificationStats(ctx context.Cont func (r *GormUserRepository) GetUserCallRankingByCalls(ctx context.Context, period string, limit int) ([]map[string]interface{}, error) { var sql string var args []interface{} - + switch period { case "today": sql = ` @@ -565,13 +565,13 @@ func (r *GormUserRepository) GetUserCallRankingByCalls(ctx context.Context, peri default: return nil, fmt.Errorf("不支持的时间周期: %s", period) } - + var results []map[string]interface{} err := r.GetDB(ctx).Raw(sql, args...).Scan(&results).Error if err != nil { return nil, err } - + return results, nil } @@ -579,7 +579,7 @@ func (r *GormUserRepository) GetUserCallRankingByCalls(ctx context.Context, peri func (r *GormUserRepository) GetUserCallRankingByConsumption(ctx context.Context, period string, limit int) ([]map[string]interface{}, error) { var sql string var args []interface{} - + switch period { case "today": sql = ` @@ -634,13 +634,13 @@ func (r *GormUserRepository) GetUserCallRankingByConsumption(ctx context.Context default: return nil, fmt.Errorf("不支持的时间周期: %s", period) } - + var results []map[string]interface{} err := r.GetDB(ctx).Raw(sql, args...).Scan(&results).Error if err != nil { return nil, err } - + return results, nil } @@ -648,7 +648,7 @@ func (r *GormUserRepository) GetUserCallRankingByConsumption(ctx context.Context func (r *GormUserRepository) GetRechargeRanking(ctx context.Context, period string, limit int) ([]map[string]interface{}, error) { var sql string var args []interface{} - + switch period { case "today": sql = ` @@ -709,12 +709,12 @@ func (r *GormUserRepository) GetRechargeRanking(ctx context.Context, period stri default: return nil, fmt.Errorf("不支持的时间周期: %s", period) } - + var results []map[string]interface{} err := r.GetDB(ctx).Raw(sql, args...).Scan(&results).Error if err != nil { return nil, err } - + return results, nil -} \ No newline at end of file +} diff --git a/resources/Pure Component.zip b/resources/Pure Component.zip deleted file mode 100644 index 552e5d5..0000000 Binary files a/resources/Pure Component.zip and /dev/null differ