Compare commits

...

2 Commits

Author SHA1 Message Date
6dd392f673 Merge branch 'main' of http://1.117.67.95:3000/team/tyapi-server 2026-02-27 16:43:06 +08:00
8d5da9d88e f 2026-02-27 16:42:38 +08:00
2 changed files with 61 additions and 33 deletions

View File

@@ -3862,40 +3862,63 @@ func buildLeasingRiskAssessment(apiData map[string]interface{}, log *zap.Logger)
assessment[fieldNameNight] = fmt.Sprintf("%s/%s", idNightAllnum, cellNightAllnum) assessment[fieldNameNight] = fmt.Sprintf("%s/%s", idNightAllnum, cellNightAllnum)
} }
// 判断风险标识:如果有申请记录,设置为高风险 // 仅使用近12月Last12对应 m12的总次数作为判断依据
hasApplication := false // 因为近3月等短周期已经被近12月统计包含避免重复放大
for _, apiPeriod := range periodMap { totalCount := 0
fieldName := fmt.Sprintf("alc_%s_id_allnum", apiPeriod)
// 尝试多种类型string、int、float64 idKey12 := "alc_m12_id_allnum"
if allnum, ok := jrzq1d09Map[fieldName].(string); ok && allnum != "" && allnum != "0" { cellKey12 := "alc_m12_cell_allnum"
hasApplication = true
break // 身份证维度近12月
} else if allnum, ok := jrzq1d09Map[fieldName].(int); ok && allnum > 0 { if v, ok := jrzq1d09Map[idKey12]; ok {
hasApplication = true switch vv := v.(type) {
break case string:
} else if allnum, ok := jrzq1d09Map[fieldName].(float64); ok && allnum > 0 { if vv != "" && vv != "0" {
hasApplication = true if parsed, err := strconv.Atoi(vv); err == nil {
break totalCount += parsed
}
// 也检查cell字段
fieldNameCell := fmt.Sprintf("alc_%s_cell_allnum", apiPeriod)
if allnum, ok := jrzq1d09Map[fieldNameCell].(string); ok && allnum != "" && allnum != "0" {
hasApplication = true
break
} else if allnum, ok := jrzq1d09Map[fieldNameCell].(int); ok && allnum > 0 {
hasApplication = true
break
} else if allnum, ok := jrzq1d09Map[fieldNameCell].(float64); ok && allnum > 0 {
hasApplication = true
break
} }
} }
// 风险标识:如果有申请记录,风险较高;如果没有申请记录,风险较低 case float64:
// 注意riskFlag的值0=未查得1=低风险2=高风险 if vv > 0 {
if hasApplication { totalCount += int(vv)
assessment["riskFlag"] = 2 // 有申请记录,风险较高 }
case int:
if vv > 0 {
totalCount += vv
}
}
}
// 手机号维度近12月
if v, ok := jrzq1d09Map[cellKey12]; ok {
switch vv := v.(type) {
case string:
if vv != "" && vv != "0" {
if parsed, err := strconv.Atoi(vv); err == nil {
totalCount += parsed
}
}
case float64:
if vv > 0 {
totalCount += int(vv)
}
case int:
if vv > 0 {
totalCount += vv
}
}
}
// 根据近12月总申请次数设置风险标识
// - totalCount == 0 -> 0 无风险 / 未查得
// - 0 < totalCount <= 10 -> 2 低风险(有少量租赁申请)
// - totalCount > 10 -> 1 高风险(租赁申请很多)
if totalCount == 0 {
assessment["riskFlag"] = 0
} else if totalCount <= 10 {
assessment["riskFlag"] = 2
} else { } else {
assessment["riskFlag"] = 1 // 无申请记录,风险较低 assessment["riskFlag"] = 1
} }
} }
} }

View File

@@ -84,20 +84,25 @@ func TestEncryptWithInvalidKey(t *testing.T) {
} }
func TestDecryptWithInvalidData(t *testing.T) { func TestDecryptWithInvalidData(t *testing.T) {
key := "1234567890abcdef1234567890abcdef" key := "af4ca0098e6a202a5c08c413ebd9fd62"
// 测试无效的加密数据 // 测试无效的加密数据
invalidData := []string{ invalidData := []string{
"", // 空数据 "", // 空数据
"invalid_base64", // 无效的Base64 "invalid_base64", // 无效的Base64
"dGVzdA==", // 有效的Base64但不是AES加密数据 "dGVzdA==", // 有效的Base64但不是AES加密数据
"ZmJIKRQz6j+IboulkSfq0g==",
"qBijvRmmm3bbLEdaCMw2XvHc8SDq3oGh6lD6BwELyhU=",
"ITtZBkPMZQ88UTHWJuWjSA==",
} }
for _, data := range invalidData { for _, data := range invalidData {
_, err := Decrypt(data, key) decrypted, err := Decrypt(data, key)
if err == nil { if err == nil {
t.Errorf("使用无效数据 %s 应该返回错误", data) t.Errorf("使用无效数据 %s 应该返回错误", data)
} }
fmt.Println("data: ", data)
fmt.Println("decrypted: ", decrypted)
} }
} }