@@ -109,7 +109,7 @@ func collectAPIData(ctx context.Context, params dto.DWBG8B4DReq, deps *processor
{
apiCode : "FLXG8B4D" ,
params : map [ string ] interface { } {
"mobile_no" : params . MobileNo ,
"mobile_no" : params . MobileNo ,
"authorized" : "1" ,
} ,
} ,
@@ -117,9 +117,9 @@ func collectAPIData(ctx context.Context, params dto.DWBG8B4DReq, deps *processor
{
apiCode : "JRZQ8A2D" ,
params : map [ string ] interface { } {
"mobile_no" : params . MobileNo ,
"id_card" : params . IDCard ,
"name" : params . Name ,
"mobile_no" : params . MobileNo ,
"id_card" : params . IDCard ,
"name" : params . Name ,
"authorized" : "1" ,
} ,
} ,
@@ -127,9 +127,9 @@ func collectAPIData(ctx context.Context, params dto.DWBG8B4DReq, deps *processor
{
apiCode : "JRZQ1D09" ,
params : map [ string ] interface { } {
"mobile_no" : params . MobileNo ,
"id_card" : params . IDCard ,
"name" : params . Name ,
"mobile_no" : params . MobileNo ,
"id_card" : params . IDCard ,
"name" : params . Name ,
"authorized" : "1" ,
} ,
} ,
@@ -155,9 +155,9 @@ func collectAPIData(ctx context.Context, params dto.DWBG8B4DReq, deps *processor
{
apiCode : "JRZQ5E9F" ,
params : map [ string ] interface { } {
"mobile_no" : params . MobileNo ,
"id_card" : params . IDCard ,
"name" : params . Name ,
"mobile_no" : params . MobileNo ,
"id_card" : params . IDCard ,
"name" : params . Name ,
"authorized" : "1" ,
} ,
} ,
@@ -165,8 +165,8 @@ func collectAPIData(ctx context.Context, params dto.DWBG8B4DReq, deps *processor
{
apiCode : "FLXGDEA9" ,
params : map [ string ] interface { } {
"id_card" : params . IDCard ,
"name" : params . Name ,
"id_card" : params . IDCard ,
"name" : params . Name ,
"authorized" : "1" ,
} ,
} ,
@@ -211,7 +211,7 @@ func collectAPIData(ctx context.Context, params dto.DWBG8B4DReq, deps *processor
} ( )
paramsBytes , err := json . Marshal ( ac . params )
if err != nil {
if err != nil {
log . Warn ( "序列化API参数失败" ,
zap . String ( "api_code" , ac . apiCode ) ,
zap . Error ( err ) ,
@@ -266,7 +266,7 @@ func callProcessor(ctx context.Context, apiCode string, params []byte, deps *pro
return nil , fmt . Errorf ( "未找到处理器: %s" , apiCode )
}
respBytes , err := processor ( ctx , params , deps )
if err != nil {
if err != nil {
return nil , err
}
var data interface { }
@@ -387,7 +387,7 @@ func buildBaseInfo(apiData map[string]interface{}, params dto.DWBG8B4DReq, log *
// 从运营商三要素获取户籍所在地( address字段)
if address , ok := yysyMap [ "address" ] . ( string ) ; ok && address != "" {
baseInfo [ "location" ] = address
} else {
} else {
// 如果address不存在, 尝试从身份证号获取
if location := getLocationFromIDCard ( params . IDCard ) ; location != "" {
baseInfo [ "location" ] = location
@@ -496,7 +496,7 @@ func buildStandLiveInfo(apiData map[string]interface{}, log *zap.Logger) map[str
}
}
}
if status != "" {
// "一致" -> "0", "不一致" -> "1"
if status == "一致" {
@@ -629,7 +629,7 @@ func buildVerifyRule(apiData map[string]interface{}, log *zap.Logger) string {
// buildFraudRule 构建反欺诈规则( 综合考虑fraudScore、特殊名单和借选指数风险)
func buildFraudRule ( apiData map [ string ] interface { } , log * zap . Logger ) string {
fraudScore := getFraudScore ( apiData )
// 如果fraudScore无效, 检查特殊名单和借选指数
if fraudScore == - 1 {
// 检查特殊名单
@@ -654,7 +654,7 @@ func buildFraudRule(apiData map[string]interface{}, log *zap.Logger) string {
}
return "低风险"
}
// 根据fraudScore判断风险等级
if fraudScore >= 80 {
return "高风险"
@@ -1039,13 +1039,13 @@ func buildRiskWarning(apiData map[string]interface{}, log *zap.Logger) map[strin
if variableValue , ok := variable [ "variableValue" ] . ( map [ string ] interface { } ) ; ok {
// 检查近期申请频率( 近7天、近15天、近1个月)
checkRecentApplicationFrequency ( variableValue , & riskWarning )
// 检查银行/非银申请次数
checkBankApplicationFrequency ( variableValue , & riskWarning )
// 检查偿债压力(从借选指数评估获取)
checkDebtPressure ( apiData , & riskWarning )
// 计算借贷评估风险计数
calculateLoanRiskCounts ( variableValue , & riskWarning )
}
@@ -1152,21 +1152,21 @@ func buildRiskWarning(apiData map[string]interface{}, log *zap.Logger) map[strin
// 计算总风险点数量( 排除Counts字段和level字段)
totalRiskCounts := 0
excludeFields := map [ string ] bool {
"totalRiskCounts" : true ,
"totalRiskCounts" : true ,
"level" : true ,
"sfhyfxRiskCounts" : true ,
"sfhyfxRiskHighCounts" : true ,
"sfhyfxRiskMiddleCounts" : true ,
"gazdyrhyRiskCounts" : true ,
"sfhyfxRiskCounts" : true ,
"sfhyfxRiskHighCounts" : true ,
"sfhyfxRiskMiddleCounts" : true ,
"gazdyrhyRiskCounts" : true ,
"gazdyrhyRiskHighCounts" : true ,
"gazdyrhyRiskMiddleCounts" : true ,
"yqfxRiskCounts" : true ,
"yqfxRiskHighCounts" : true ,
"yqfxRiskMiddleCounts" : true ,
"zlfxpgRiskCounts" : true ,
"zlfxpgRiskHighCounts" : true ,
"zlfxpgRiskMiddleCounts" : true ,
"jdpgRiskCounts" : true ,
"yqfxRiskCounts" : true ,
"yqfxRiskHighCounts" : true ,
"yqfxRiskMiddleCounts" : true ,
"zlfxpgRiskCounts" : true ,
"zlfxpgRiskHighCounts" : true ,
"zlfxpgRiskMiddleCounts" : true ,
"jdpgRiskCounts" : true ,
"jdpgRiskHighCounts" : true ,
"jdpgRiskMiddleCounts" : true ,
"idCardRiskCounts" : true ,
@@ -1277,7 +1277,7 @@ func buildElementVerificationDetail(apiData map[string]interface{}, log *zap.Log
}
}
}
if status != "" {
if status == "一致" {
detail [ "sfzeysFlag" ] = 2 // 低风险
@@ -1313,7 +1313,7 @@ func buildElementVerificationDetail(apiData map[string]interface{}, log *zap.Log
}
}
}
if status != "" {
personCheckDetails [ "result" ] = status
}
@@ -1365,7 +1365,7 @@ func buildElementVerificationDetail(apiData map[string]interface{}, log *zap.Log
// 如果没有data字段, 直接使用flxgMap( 新格式)
data = flxgMap
}
if moneyLaundering , ok := data [ "moneyLaundering" ] . ( string ) ; ok {
antiFraudInfo [ "moneyLaundering" ] = moneyLaundering
}
@@ -1448,7 +1448,7 @@ func buildElementVerificationDetail(apiData map[string]interface{}, log *zap.Log
if channel , ok := yysy4b21Map [ "channel" ] . ( string ) ; ok {
phoneVailRisks [ "phoneCompany" ] = convertChannelName ( channel )
}
// 获取在网时长( status=0时也要提取)
if yysy8b1cData != nil {
if yysy8b1cMap , ok := yysy8b1cData . ( map [ string ] interface { } ) ; ok {
@@ -1471,11 +1471,11 @@ func buildElementVerificationDetail(apiData map[string]interface{}, log *zap.Log
// 身份证号手机号归属地( belongRiskFlag 和 belongRisks)
belongRisks := make ( map [ string ] interface { } )
belongRisks [ "num" ] = "1"
// 重新获取数据
yysy9e4aDataForBelong := getMapValue ( apiData , "YYSY9E4A" )
yysyDataForBelong := getMapValue ( apiData , "YYSYH6D2" )
if yysy9e4aDataForBelong != nil && yysyDataForBelong != nil {
if yysy9e4aMap , ok := yysy9e4aDataForBelong . ( map [ string ] interface { } ) ; ok {
if yysyMapForBelong , ok := yysyDataForBelong . ( map [ string ] interface { } ) ; ok {
@@ -1621,7 +1621,7 @@ func buildRiskSupervision(apiData map[string]interface{}, log *zap.Logger) map[s
// 从3C租赁申请意向获取数据
jrzq1d09Data := getMapValue ( apiData , "JRZQ1D09" )
// 设置默认值
riskSupervision [ "rentalRiskListIdCardRelationsPhones" ] = 0
riskSupervision [ "rentalRiskListPhoneRelationsIdCards" ] = 0
@@ -1896,15 +1896,15 @@ func buildOverdueRiskProduct(apiData map[string]interface{}, log *zap.Logger) ma
// 判断风险标识
hasOverdue := overdueRiskProduct [ "hasUnsettledOverdue" ] == "逾期"
hasRecentOverdue := overdueRiskProduct [ "overdueLast7Days" ] == "逾期" ||
overdueRiskProduct [ "overdueLast14Days" ] == "逾期" ||
hasRecentOverdue := overdueRiskProduct [ "overdueLast7Days" ] == "逾期" ||
overdueRiskProduct [ "overdueLast14Days" ] == "逾期" ||
overdueRiskProduct [ "overdueLast30Days" ] == "逾期"
if hasOverdue || hasRecentOverdue {
overdueRiskProduct [ "lyjlhyFlag" ] = 1 // 高风险
overdueRiskProduct [ "lyjlhyFlag" ] = 1 // 高风险
overdueRiskProduct [ "dkzhktjFlag" ] = 1 // 高风险
} else {
overdueRiskProduct [ "lyjlhyFlag" ] = 2 // 低风险
overdueRiskProduct [ "lyjlhyFlag" ] = 2 // 低风险
overdueRiskProduct [ "dkzhktjFlag" ] = 2 // 低风险
}
}
@@ -2028,7 +2028,7 @@ func buildMultCourtInfo(apiData map[string]interface{}, log *zap.Logger) map[str
if lawsuitStat , ok := judicialData [ "lawsuitStat" ] . ( map [ string ] interface { } ) ; ok {
// 收集所有涉案公告案件(民事、刑事、行政、保全、破产)- 都归到legalCases
legalCases := make ( [ ] interface { } , 0 )
// 处理民事案件( civil) - 结构: civil.cases[]
if civilVal , exists := lawsuitStat [ "civil" ] ; exists && civilVal != nil {
if civil , ok := civilVal . ( map [ string ] interface { } ) ; ok && len ( civil ) > 0 {
@@ -2178,7 +2178,7 @@ func buildMultCourtInfo(apiData map[string]interface{}, log *zap.Logger) map[str
// convertCivilCase 转换民事案件
func convertCivilCase ( caseMap map [ string ] interface { } ) map [ string ] interface { } {
caseInfo := make ( map [ string ] interface { } )
// 案号
if cAh , ok := caseMap [ "c_ah" ] . ( string ) ; ok {
caseInfo [ "caseNumber" ] = cAh
@@ -2259,7 +2259,7 @@ func convertCivilCase(caseMap map[string]interface{}) map[string]interface{} {
// convertExecutionCase 转换执行案件
func convertExecutionCase ( caseMap map [ string ] interface { } ) map [ string ] interface { } {
caseInfo := make ( map [ string ] interface { } )
// 案号
if cAh , ok := caseMap [ "c_ah" ] . ( string ) ; ok {
caseInfo [ "caseNumber" ] = cAh
@@ -2393,7 +2393,7 @@ func convertExecutionCase(caseMap map[string]interface{}) map[string]interface{}
// convertBreachCase 转换失信案件
func convertBreachCase ( caseMap map [ string ] interface { } ) map [ string ] interface { } {
caseInfo := make ( map [ string ] interface { } )
// 案号
if caseNumber , ok := caseMap [ "caseNumber" ] . ( string ) ; ok {
caseInfo [ "caseNumber" ] = caseNumber
@@ -2470,7 +2470,7 @@ func convertBreachCase(caseMap map[string]interface{}) map[string]interface{} {
// convertLimitCase 转换限高案件
func convertLimitCase ( caseMap map [ string ] interface { } ) map [ string ] interface { } {
caseInfo := make ( map [ string ] interface { } )
// 案号
if caseNumber , ok := caseMap [ "caseNumber" ] . ( string ) ; ok {
caseInfo [ "caseNumber" ] = caseNumber
@@ -2513,7 +2513,7 @@ func convertLimitCase(caseMap map[string]interface{}) map[string]interface{} {
// convertPreservationCase 转换保全审查案件
func convertPreservationCase ( caseMap map [ string ] interface { } ) map [ string ] interface { } {
caseInfo := make ( map [ string ] interface { } )
// 案号
if cAh , ok := caseMap [ "c_ah" ] . ( string ) ; ok {
caseInfo [ "caseNumber" ] = cAh
@@ -2607,7 +2607,7 @@ func convertPreservationCase(caseMap map[string]interface{}) map[string]interfac
// convertCriminalCase 转换刑事案件
func convertCriminalCase ( caseMap map [ string ] interface { } ) map [ string ] interface { } {
caseInfo := make ( map [ string ] interface { } )
// 案号
if cAh , ok := caseMap [ "c_ah" ] . ( string ) ; ok {
caseInfo [ "caseNumber" ] = cAh
@@ -2689,7 +2689,7 @@ func convertCriminalCase(caseMap map[string]interface{}) map[string]interface{}
// convertAdministrativeCase 转换行政案件
func convertAdministrativeCase ( caseMap map [ string ] interface { } ) map [ string ] interface { } {
caseInfo := make ( map [ string ] interface { } )
// 案号
if cAh , ok := caseMap [ "c_ah" ] . ( string ) ; ok {
caseInfo [ "caseNumber" ] = cAh
@@ -2772,7 +2772,7 @@ func convertAdministrativeCase(caseMap map[string]interface{}) map[string]interf
// convertBankruptCase 转换破产清算案件
func convertBankruptCase ( caseMap map [ string ] interface { } ) map [ string ] interface { } {
caseInfo := make ( map [ string ] interface { } )
// 案号
if cAh , ok := caseMap [ "c_ah" ] . ( string ) ; ok {
caseInfo [ "caseNumber" ] = cAh
@@ -2919,11 +2919,11 @@ func buildOrganLoanPerformances(variableValue map[string]interface{}) []interfac
// 时间周期映射
periodMap := map [ string ] string {
"last7Day" : "d7" ,
"last15Day" : "d15" ,
"last1Month" : "m1" ,
"last3Month" : "m3" ,
"last6Month" : "m6" ,
"last7Day" : "d7" ,
"last15Day" : "d15" ,
"last1Month" : "m1" ,
"last3Month" : "m3" ,
"last6Month" : "m6" ,
"last12Month" : "m12" ,
}
@@ -2983,11 +2983,11 @@ func buildCustomerLoanPerformances(variableValue map[string]interface{}) []inter
}
periodMap := map [ string ] string {
"last7Day" : "d7" ,
"last15Day" : "d15" ,
"last1Month" : "m1" ,
"last3Month" : "m3" ,
"last6Month" : "m6" ,
"last7Day" : "d7" ,
"last15Day" : "d15" ,
"last1Month" : "m1" ,
"last3Month" : "m3" ,
"last6Month" : "m6" ,
"last12Month" : "m12" ,
}
@@ -3001,7 +3001,7 @@ func buildCustomerLoanPerformances(variableValue map[string]interface{}) []inter
cellOrgnum := getStringValue ( variableValue , fmt . Sprintf ( "als_%s_cell_%s_orgnum" , apiPeriod , customerType . prefix ) )
idAllnum := getStringValue ( variableValue , fmt . Sprintf ( "als_%s_id_%s_allnum" , apiPeriod , customerType . prefix ) )
cellAllnum := getStringValue ( variableValue , fmt . Sprintf ( "als_%s_cell_%s_allnum" , apiPeriod , customerType . prefix ) )
if idOrgnum == "" {
idOrgnum = "0"
}
@@ -3014,7 +3014,7 @@ func buildCustomerLoanPerformances(variableValue map[string]interface{}) []inter
if cellAllnum == "" {
cellAllnum = "0"
}
perf [ period ] = fmt . Sprintf ( "%s/%s" , idOrgnum , cellOrgnum )
perf [ period + "Count" ] = fmt . Sprintf ( "%s/%s" , idAllnum , cellAllnum )
}
@@ -3043,11 +3043,11 @@ func buildBusinessLoanPerformances(variableValue map[string]interface{}) []inter
}
periodMap := map [ string ] string {
"last7Day" : "d7" ,
"last15Day" : "d15" ,
"last1Month" : "m1" ,
"last3Month" : "m3" ,
"last6Month" : "m6" ,
"last7Day" : "d7" ,
"last15Day" : "d15" ,
"last1Month" : "m1" ,
"last3Month" : "m3" ,
"last6Month" : "m6" ,
"last12Month" : "m12" ,
}
@@ -3061,7 +3061,7 @@ func buildBusinessLoanPerformances(variableValue map[string]interface{}) []inter
cellOrgnum := getStringValue ( variableValue , fmt . Sprintf ( "als_%s_cell_%s_orgnum" , apiPeriod , businessType . prefix ) )
idAllnum := getStringValue ( variableValue , fmt . Sprintf ( "als_%s_id_%s_allnum" , apiPeriod , businessType . prefix ) )
cellAllnum := getStringValue ( variableValue , fmt . Sprintf ( "als_%s_cell_%s_allnum" , apiPeriod , businessType . prefix ) )
if idOrgnum == "" {
idOrgnum = "0"
}
@@ -3074,7 +3074,7 @@ func buildBusinessLoanPerformances(variableValue map[string]interface{}) []inter
if cellAllnum == "" {
cellAllnum = "0"
}
perf [ period ] = fmt . Sprintf ( "%s/%s" , idOrgnum , cellOrgnum )
perf [ period + "Count" ] = fmt . Sprintf ( "%s/%s" , idAllnum , cellAllnum )
}
@@ -3102,11 +3102,11 @@ func buildTimeLoanPerformances(variableValue map[string]interface{}) []interface
}
periodMap := map [ string ] string {
"last7Day" : "d7" ,
"last15Day" : "d15" ,
"last1Month" : "m1" ,
"last3Month" : "m3" ,
"last6Month" : "m6" ,
"last7Day" : "d7" ,
"last15Day" : "d15" ,
"last1Month" : "m1" ,
"last3Month" : "m3" ,
"last6Month" : "m6" ,
"last12Month" : "m12" ,
}
@@ -3120,7 +3120,7 @@ func buildTimeLoanPerformances(variableValue map[string]interface{}) []interface
cellOrgnum := getStringValue ( variableValue , fmt . Sprintf ( "als_%s_cell_%s_%s_orgnum" , apiPeriod , timeType . orgType , timeType . timeType ) )
idAllnum := getStringValue ( variableValue , fmt . Sprintf ( "als_%s_id_%s_%s_allnum" , apiPeriod , timeType . orgType , timeType . timeType ) )
cellAllnum := getStringValue ( variableValue , fmt . Sprintf ( "als_%s_cell_%s_%s_allnum" , apiPeriod , timeType . orgType , timeType . timeType ) )
if idOrgnum == "" {
idOrgnum = "0"
}
@@ -3133,7 +3133,7 @@ func buildTimeLoanPerformances(variableValue map[string]interface{}) []interface
if cellAllnum == "" {
cellAllnum = "0"
}
perf [ period ] = fmt . Sprintf ( "%s/%s" , idOrgnum , cellOrgnum )
perf [ period + "Count" ] = fmt . Sprintf ( "%s/%s" , idAllnum , cellAllnum )
}
@@ -3151,7 +3151,7 @@ func checkLoanRisk(variableValue map[string]interface{}) bool {
for _ , period := range periods {
bankAllnum := getStringValue ( variableValue , fmt . Sprintf ( "als_%s_id_bank_allnum" , period ) )
nbankAllnum := getStringValue ( variableValue , fmt . Sprintf ( "als_%s_id_nbank_allnum" , period ) )
if bankAllnum != "" && bankAllnum != "0" {
if count , err := strconv . Atoi ( bankAllnum ) ; err == nil && count >= 10 {
return true
@@ -3593,7 +3593,7 @@ func checkRecentApplicationFrequency(variableValue map[string]interface{}, riskW
for _ , period := range periods {
bankAllnum := getStringValue ( variableValue , fmt . Sprintf ( "als_%s_id_bank_allnum" , period . apiPeriod ) )
nbankAllnum := getStringValue ( variableValue , fmt . Sprintf ( "als_%s_id_nbank_allnum" , period . apiPeriod ) )
// 如果近7天申请次数>=10, 认为是极为频繁( 调高风险阈值, 进一步提高阈值)
if bankAllnum != "" && bankAllnum != "0" {
if count , err := strconv . Atoi ( bankAllnum ) ; err == nil && count >= 10 {
@@ -3626,7 +3626,7 @@ func checkBankApplicationFrequency(variableValue map[string]interface{}, riskWar
for _ , period := range periods {
bankAllnum := getStringValue ( variableValue , fmt . Sprintf ( "als_%s_id_bank_allnum" , period . apiPeriod ) )
nbankAllnum := getStringValue ( variableValue , fmt . Sprintf ( "als_%s_id_nbank_allnum" , period . apiPeriod ) )
if bankAllnum != "" && bankAllnum != "0" {
if count , err := strconv . Atoi ( bankAllnum ) ; err == nil {
bankTotal += count
@@ -3663,7 +3663,7 @@ func checkDebtPressure(apiData map[string]interface{}, riskWarning *map[string]i
// 检查当前逾期金额和机构数
currentOverdueAmount := getStringValue ( jrzq5e9fMap , "xyp_cpl0072" )
currentOverdueInstitutionCount := getStringValue ( jrzq5e9fMap , "xyp_cpl0071" )
// 如果当前逾期金额较大或机构数较多,认为偿债压力极高
if currentOverdueAmount != "" && currentOverdueAmount != "0" && currentOverdueAmount != "1" {
( * riskWarning ) [ "highDebtPressure" ] = 1
@@ -3718,7 +3718,7 @@ func checkRentalApplicationFrequency(jrzq1d09Map map[string]interface{}, riskWar
for _ , period := range periods {
idAllnum := getStringValue ( jrzq1d09Map , fmt . Sprintf ( "alc_%s_id_allnum" , period . apiPeriod ) )
cellAllnum := getStringValue ( jrzq1d09Map , fmt . Sprintf ( "alc_%s_cell_allnum" , period . apiPeriod ) )
// 取较大的值
idCount := 0
cellCount := 0
@@ -3732,7 +3732,7 @@ func checkRentalApplicationFrequency(jrzq1d09Map map[string]interface{}, riskWar
cellCount = count
}
}
if idCount > cellCount {
totalCount += idCount
} else {
@@ -3779,15 +3779,15 @@ func buildLeasingRiskAssessment(apiData map[string]interface{}, log *zap.Logger)
// - Institution( 3C机构) : 使用id( 身份证) 查询的数据
// - Platform( 3C平台) : 使用cell( 手机号) 查询的数据
// 格式: "身份证/手机号", 如果没有匹配的就是0
// 时间周期映射: 3Days->d3, 7Days->d7, 14Days->d14, Month->m1, 3Months->m3, 6Months->m6, 12Months->m12
periodMap := map [ string ] string {
"3Days" : "d3" ,
"7Days" : "d7" ,
"14Days" : "d14" ,
"Month" : "m1" ,
"3Months" : "m3" ,
"6Months" : "m6" ,
"3Days" : "d3" ,
"7Days" : "d7" ,
"14Days" : "d14" ,
"Month" : "m1" ,
"3Months" : "m3" ,
"6Months" : "m6" ,
"12Months" : "m12" ,
}
@@ -4050,21 +4050,21 @@ func normalizeProvinceName(province string) string {
if province == "" {
return ""
}
// 去除前后空格
province = strings . TrimSpace ( province )
// 特殊处理:内蒙古(必须在最前面)
if strings . Contains ( province , "内蒙古" ) {
return "内蒙古"
}
// 处理自治区、特别行政区、直辖市等后缀
suffixes := [ ] string {
"壮族自治区" , "回族自治区" , "维吾尔自治区" , "自治区" ,
"特别行政区" , "省" , "市" ,
}
normalized := province
for _ , suffix := range suffixes {
if strings . HasSuffix ( normalized , suffix ) {
@@ -4072,7 +4072,7 @@ func normalizeProvinceName(province string) string {
break
}
}
return normalized
}
@@ -4082,15 +4082,15 @@ func normalizeCityName(city string) string {
if city == "" {
return ""
}
// 去除前后空格
city = strings . TrimSpace ( city )
// 处理各种后缀
suffixes := [ ] string {
"地区" , "市" , "自治州" , "盟" , "县" , "区" ,
}
normalized := city
for _ , suffix := range suffixes {
if strings . HasSuffix ( normalized , suffix ) {
@@ -4098,7 +4098,7 @@ func normalizeCityName(city string) string {
break
}
}
return normalized
}
@@ -4107,12 +4107,12 @@ func extractProvinceFromAddress(address string) string {
if address == "" {
return ""
}
// 特殊处理:内蒙古(必须在最前面,因为"内蒙古"可能被其他模式误匹配)
if strings . HasPrefix ( address , "内蒙古" ) {
return "内蒙古自治区"
}
// 处理直辖市(必须在自治区之前)
if strings . HasPrefix ( address , "北京" ) {
return "北京市"
@@ -4126,7 +4126,7 @@ func extractProvinceFromAddress(address string) string {
if strings . HasPrefix ( address , "重庆" ) {
return "重庆市"
}
// 处理各种省份格式(按长度从长到短,避免误匹配)
patterns := [ ] struct {
pattern string
@@ -4170,12 +4170,12 @@ func extractProvinceFromAddress(address string) string {
// 处理"XX省"格式(最后处理,因为可能与其他模式冲突)
{ "省" , func ( addr string ) string {
if idx := strings . Index ( addr , "省" ) ; idx > 0 {
return addr [ : idx + 1 ]
return addr [ : idx + len ( "省" ) ]
}
return ""
} } ,
}
for _ , p := range patterns {
if strings . Contains ( address , p . pattern ) {
if result := p . extract ( address ) ; result != "" {
@@ -4183,7 +4183,7 @@ func extractProvinceFromAddress(address string) string {
}
}
}
return ""
}
@@ -4192,16 +4192,16 @@ func extractCityFromAddress(address string) string {
if address == "" {
return ""
}
// 先提取省份,然后从剩余部分提取城市
province := extractProvinceFromAddress ( address )
if province == "" {
return ""
}
// 去除省份部分
cityPart := address [ len ( province ) : ]
// 处理各种城市格式
patterns := [ ] string { "地区" , "市" , "自治州" , "盟" }
for _ , pattern := range patterns {
@@ -4209,7 +4209,7 @@ func extractCityFromAddress(address string) string {
return cityPart [ : idx + len ( pattern ) ]
}
}
return ""
}
@@ -4221,7 +4221,7 @@ func compareLocation(address1, province2, city2 string) bool {
if address1 == "" {
return false
}
// 如果号码归属地只有省份,检查省份是否出现在户籍所在地中
if province2 != "" && city2 == "" {
// 标准化省份名称,去除后缀
@@ -4229,20 +4229,20 @@ func compareLocation(address1, province2, city2 string) bool {
// 检查标准化后的省份名称是否出现在户籍所在地中
return strings . Contains ( address1 , province2Norm )
}
// 如果号码归属地有省份和城市,检查两者是否都出现在户籍所在地中
if province2 != "" && city2 != "" {
// 标准化省份和城市名称,去除后缀
province2Norm := normalizeProvinceName ( province2 )
city2Norm := normalizeCityName ( city2 )
// 检查省份和城市是否都出现在户籍所在地中
provinceMatch := strings . Contains ( address1 , province2Norm )
cityMatch := strings . Contains ( address1 , city2Norm )
return provinceMatch && cityMatch
}
return false
}
@@ -4262,7 +4262,7 @@ func convertChannel(channel string) string {
// convertChannelName 转换运营商名称(处理中文名称)
func convertChannelName ( channel string ) string {
// 如果已经是中文名称,直接返回
if strings . Contains ( channel , "移动" ) || strings . Contains ( channel , "联通" ) ||
if strings . Contains ( channel , "移动" ) || strings . Contains ( channel , "联通" ) ||
strings . Contains ( channel , "电信" ) || strings . Contains ( channel , "广电" ) {
return channel
}
@@ -4276,7 +4276,7 @@ func convertStatusFromOnlineStatus(data map[string]interface{}) int {
// 获取status字段( 0-在网, 1-不在网)
var statusVal interface { }
var ok bool
// status可能是int或float64类型
if statusVal , ok = data [ "status" ] ; ! ok {
return - 1 // 未查得
@@ -4362,7 +4362,7 @@ func getFraudScore(apiData map[string]interface{}) int {
// 从涉赌涉诈风险评估获取基础反欺诈评分
flxgData := getMapValue ( apiData , "FLXG8B4D" )
baseScore := - 1
if flxgData != nil {
flxgMap , ok := flxgData . ( map [ string ] interface { } )
if ok {
@@ -4505,7 +4505,7 @@ func getCreditScore(apiData map[string]interface{}) int {
return 900
}
parsed , err := strconv . ParseFloat ( v , 64 )
if err != nil {
if err != nil {
// 解析失败, 返回900( 默认信用较好)
return 900
}
@@ -4546,7 +4546,7 @@ func isDevelopmentMode() bool {
if useMock := os . Getenv ( "DWBG_USE_MOCK_DATA" ) ; useMock != "" {
return useMock == "1" || useMock == "true" || useMock == "yes"
}
env := os . Getenv ( "ENV" )
if env == "" {
env = os . Getenv ( "CONFIG_ENV" )
@@ -4554,12 +4554,12 @@ func isDevelopmentMode() bool {
if env == "" {
env = os . Getenv ( "APP_ENV" )
}
// 默认开发环境
if env == "" {
return true
}
return env == "development"
}
@@ -4571,32 +4571,32 @@ func loadMockAPIDataFromFile(log *zap.Logger) map[string]interface{} {
// 默认使用最新的导出文件
mockDataPath = "api_data_export/api_data_4522_20260214_152339.json"
}
// 检查文件是否存在
if _ , err := os . Stat ( mockDataPath ) ; os . IsNotExist ( err ) {
log . Warn ( "开发模式:模拟数据文件不存在" , zap . String ( "path" , mockDataPath ) )
return nil
}
// 读取文件内容
fileData , err := os . ReadFile ( mockDataPath )
if err != nil {
log . Warn ( "开发模式:读取模拟数据文件失败" , zap . String ( "path" , mockDataPath ) , zap . Error ( err ) )
return nil
}
// 解析JSON
var apiData map [ string ] interface { }
if err := json . Unmarshal ( fileData , & apiData ) ; err != nil {
log . Warn ( "开发模式: 解析模拟数据JSON失败" , zap . String ( "path" , mockDataPath ) , zap . Error ( err ) )
return nil
}
log . Info ( "开发模式:成功加载模拟数据" ,
log . Info ( "开发模式:成功加载模拟数据" ,
zap . String ( "path" , mockDataPath ) ,
zap . Int ( "api_count" , len ( apiData ) ) ,
)
return apiData
}