Commit c6b372f7 by Joneq

增加风控算法

parent dce71a7a
package ready
import (
"context"
"flag"
"github.com/bilibili/kratos/pkg/conf/paladin"
"github.com/bilibili/kratos/pkg/log"
"kaopu-server/internal/service"
)
var(
//设置svclient
Svclient *service.Service
//content Client
Conclient context.Context
)
//获取基础设置
func GetBase() {
//获取输入参数
flag.Parse()
if err := paladin.Init(); err != nil {
panic(err)
}
//初始化日志目录
log.Init(&log.Config{Dir: "logs"})
defer log.Close()
Svclient = service.New()
Conclient = context.Background()
Svclient.SetUseDb(1)
}
\ No newline at end of file
package main
import (
"fmt"
"kaopu-server/cmd/ready"
"kaopu-server/cmd/risk"
)
func main() {
fmt.Println("这是风控分类评级算法_银行")
//获取配置
ready.GetBase()
riskTypeDetail,_ := ready.Svclient.GetOpenRiskType(ready.Conclient);
riskTypeDetailSort := make(map[string]map[string]string)
for _,v := range riskTypeDetail{
riskTypeDetailSort[v["id"]] = v
}
ready.Svclient.SetUseDb(2)
//获取所有需要处理的用户
waitHadleUser,_ := ready.Svclient.GetRiskTypeDetailBasicMonth(ready.Conclient)
for _,companyData:= range waitHadleUser{
riskType := risk.GetAccordwithData(companyData,riskTypeDetailSort)
if riskType != 0 {
ready.Svclient.UpdateUserRiskType(ready.Conclient,companyData["erp_company_code"],riskType)
}
}
}
package risk
import (
"kaopu-server/cmd/ready"
"kaopu-server/internal/logic"
)
//获取启用的阶梯
func GetOpenGradient()(res []map[string]string){
returnData,_ := ready.Svclient.GetOpenRiskType(ready.Conclient)
return returnData
}
//获取符合等级的数据
func GetAccordwithData(companyData map[string]string,riskTypeDetail map[string]map[string]string)(riskTypeId int) {
//设置需要使用的分类id
typeIdSli := []int{5,4,3,2,1}
delayAmount := logic.StringTurnFloat64(companyData["delay_amount"])
delayCount := logic.StringTurnFloat64(companyData["delay_count"])
delayDay := logic.StringTurnFloat64(companyData["delay_day"])
receiveAmount := logic.StringTurnFloat64(companyData["delay_amount"])
receiveCount := logic.StringTurnFloat64(companyData["delay_amount"])
//平均支付时间
aveDelayDay := logic.GetExcept(delayDay,delayCount)
//逾期金额率
yqMoneyl := logic.GetExcept(delayAmount * 100,receiveAmount)
//逾期笔数率
yqCountl := logic.GetExcept(delayCount * 100,receiveCount)
//查找符合条件的等级,查找风险等级的
for _,v := range typeIdSli{
//查找详细的哪个不符合
for _,realV := range typeIdSli{
//真实的ID
realId := ((v-1)*5)+realV
currentValue := riskTypeDetail[logic.Int64TurnString(int64(realId))]
//如果是不是前两个条件,只计算一个就可以
if realV > 2 {
var useRangeValue float64 = 0
//要进行范围计算的值
switch realV {
case 5:
useRangeValue = aveDelayDay
case 4:
useRangeValue = yqCountl
case 3:
useRangeValue = yqMoneyl
default:
useRangeValue = 0
}
if (useRangeValue >= logic.StringTurnFloat64(currentValue["start_one"]) && useRangeValue < logic.StringTurnFloat64(currentValue["end_one"])) || (useRangeValue >= logic.StringTurnFloat64(currentValue["start_two"]) && useRangeValue < logic.StringTurnFloat64(currentValue["end_two"])) {
return v
}
}else if realV == 2{
if ((delayAmount >= logic.StringTurnFloat64(currentValue["start_one"]) && delayAmount < logic.StringTurnFloat64(currentValue["end_one"])) || (delayAmount >= logic.StringTurnFloat64(currentValue["start_two"]) && delayAmount < logic.StringTurnFloat64(currentValue["end_two"]))) {
currentValue := riskTypeDetail[logic.Int64TurnString(int64(realId-1))]
if ((delayDay >= logic.StringTurnFloat64(currentValue["start_one"]) && delayDay < logic.StringTurnFloat64(currentValue["end_one"])) || (delayDay >= logic.StringTurnFloat64(currentValue["start_two"]) && delayDay < logic.StringTurnFloat64(currentValue["end_two"]))) {
return v
}
}
}
}
}
return 0
}
\ No newline at end of file
package main
import (
"fmt"
"kaopu-server/cmd/ready"
"kaopu-server/cmd/risk"
)
func main() {
fmt.Println("这是风控分类评级算法")
//获取配置
ready.GetBase()
riskTypeDetail,_ := ready.Svclient.GetOpenRiskType(ready.Conclient);
riskTypeDetailSort := make(map[string]map[string]string)
for _,v := range riskTypeDetail{
riskTypeDetailSort[v["id"]] = v
}
//获取所有需要处理的用户
waitHadleUser,_ := ready.Svclient.GetRiskTypeDetailBasicMonth(ready.Conclient)
for _,companyData:= range waitHadleUser{
riskType := risk.GetAccordwithData(companyData,riskTypeDetailSort)
if riskType != 0 {
ready.Svclient.UpdateUserRiskType(ready.Conclient,companyData["erp_company_code"],riskType)
}
}
}
\ No newline at end of file
package dao
import (
"context"
"github.com/pkg/errors"
"kaopu-server/internal/logic"
"github.com/bilibili/kratos/pkg/database/sql"
)
const(
//获取所有的风险分类详情sql
GETRISKTYPEDETAILBASICMONTHSQL = "select " +
"sum(receive_amount) receive_amount,sum(delay_amount) delay_amount,sum(receive_count) receive_count,sum(delay_count) delay_count,sum(delay_day) delay_day,erp_company_code " +
"from lie_basic_month where delay_amount > 0 and delay_count > 0 group by erp_company_code "
//获取所有的风险分类详情sql
GETBANKRISKTYPEDETAILBASICMONTHSQL = "select " +
"sum(receive_amount) receive_amount,sum(delay_amount) delay_amount,sum(receive_count) receive_count,sum(delay_count) delay_count,sum(delay_day) delay_day,erp_company_code " +
"from lie_basic_month_tolerance where delay_amount > 0 and delay_count > 0 group by erp_company_code "
)
func (d *dao)GetRiskTypeDetailBasicMonth(ctx context.Context)(r []map[string]string, err error) {
var (
rows *sql.Rows
)
if rows, err = Dbselect.Query(ctx,GETRISKTYPEDETAILBASICMONTHSQL); err != nil {
err = errors.WithStack(err)
return
}
defer rows.Close()
logic.CheckErr(err)
return GetAllParam(rows)
}
func (d *dao)GetBankRiskTypeDetailBasicMonth(ctx context.Context)(r []map[string]string, err error) {
var (
rows *sql.Rows
)
if rows, err = Dbselect.Query(ctx,GETRISKTYPEDETAILBASICMONTHSQL); err != nil {
err = errors.WithStack(err)
return
}
defer rows.Close()
logic.CheckErr(err)
return GetAllParam(rows)
}
\ No newline at end of file
......@@ -10,6 +10,25 @@ import (
"github.com/bilibili/kratos/pkg/log"
)
//修改用户的风险等级
func (d *dao)UpdateUserRiskType(ctx context.Context,erp_company_code string,risk_type int) {
var(
execSql string
)
execSql = "update `lie_com_credits` set `risk_type` = ? where erp_company_code = ? "
row,err := Dbselect.Exec(ctx,execSql,risk_type,erp_company_code)
logic.CheckErr(err)
row.RowsAffected()
return
}
//列表方式获取会员信息
func (d *dao) GetCompanyCresitsList(ctx context.Context) (res []map[string]string, err error) {
var (
......
......@@ -11,8 +11,25 @@ import(
var(
//需要查询的字段,默认为*
SqlField string = "*"
Dbselect *sql.DB
)
//设置使用的db
func (d *dao)SetUseDb(dbNum int64){
switch dbNum {
case 1:
Dbselect = d.db
case 2:
Dbselect = d.db_bank
case 3:
Dbselect = d.db2
default:
Dbselect = d.db
}
}
//根据指针行获取所有的参数
func GetAllParam(rows *sql.Rows)(res []map[string]string, err error) {
cols,err := rows.Columns()
......
......@@ -24,6 +24,7 @@ type (
GetUserList(ctx context.Context) (r []*model.Users, err error)
QueryOne(ctx context.Context,db int,sql_str string)(res map[string]string, err error) //封装查询一条数据
QueryMany(ctx context.Context,db int,sql_str string)(res []map[string]string, err error) //封装查询多条数据
SetUseDb(dbNum int64)//设置使用的db
//---静态开始
GetCompanyCresitsList(ctx context.Context) (r []map[string]string, err error)
......@@ -52,6 +53,13 @@ type (
//--银行动态开始
BankDongMain(ctx context.Context,project_id int,erp_company_code string) (r []map[string]interface{},err error) //动态模型调用主函数
//--银行动态结束
//风险分类的开始
GetOpenRiskType(ctx context.Context) (res []map[string]string,err error)
GetRiskTypeDetailBasicMonth(ctx context.Context) (r []map[string]string, err error)
UpdateUserRiskType(ctx context.Context,erp_company_code string,risk_type int)
//风险分类的结束
}
)
......
package dao
import (
"context"
"github.com/pkg/errors"
"kaopu-server/internal/logic"
"github.com/bilibili/kratos/pkg/database/sql"
)
const (
//获取所有的风险分类详情sql
GETRISKTYPEDETAILSQL = "select * from lie_risk_type_detail"
//查找符合当前等级的数据
GETACCORDWITHGRADIENT = "select * from lie_risk_type_detail where (id = %s and start_one >= %s and end_one < %s) and (id = %s and start_two >= %s and end_two < %s) "
)
func(d *dao)GetOpenRiskType(ctx context.Context) (res []map[string]string,err error){
var (
rows *sql.Rows
)
if rows, err = Dbselect.Query(ctx,GETRISKTYPEDETAILSQL); err != nil {
err = errors.WithStack(err)
return
}
defer rows.Close()
logic.CheckErr(err)
return GetAllParam(rows)
}
\ No newline at end of file
......@@ -2260,3 +2260,11 @@ func DateTurnInt64(datetime string)(timestamp int64){
timeObj,_ :=time.ParseInLocation("2006-01-02 15:04:05", datetime, loc)
return timeObj.Unix()
}
//获取两个书数据相除
func GetExcept(son,mon float64)(rvalue float64) {
if mon == 0 {
return 0
}
return son/mon
}
package model
type RiskTypeDetail struct {
Id int64 `json:"id"`
RiskTypeId int64 `json:"risk_type_id"`
ProjectName string `json:"project_name"`
StartOne string `json:"start_one"`
EndOne float64 `json:"end_one"`
StartTwo float64 `json:"start_two"`
EndTwo float64 `json:"end_two"`
Unit int64 `json:"unit"`
Status int8 `json:"status"`
UpdateTime string `json:"update_time"`
UpdateUser string `json:"update_user"`
}
/*
CREATE TABLE `lie_risk_type_detail` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT '模型详情表',
`risk_type_id` tinyint(3) unsigned NOT NULL COMMENT '风险分类ID',
`project_name` varchar(255) NOT NULL DEFAULT ' ' COMMENT '项目名称',
`start_one` char(30) NOT NULL DEFAULT '' COMMENT '范围1开始',
`end_one` char(30) NOT NULL DEFAULT '' COMMENT '范围1结束',
`start_two` char(30) NOT NULL DEFAULT '' COMMENT '范围2开始',
`end_two` char(30) NOT NULL DEFAULT '' COMMENT '范围2结束',
`unit` tinyint(4) unsigned NOT NULL DEFAULT '6' COMMENT '范围1单位',
`status` tinyint(4) unsigned NOT NULL DEFAULT '1' COMMENT '1启用,0禁用',
`update_time` int(11) unsigned NOT NULL DEFAULT '0' COMMENT '更新时间',
`update_user` char(30) NOT NULL DEFAULT '' COMMENT '更新人',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8mb4;
*/
\ No newline at end of file
package service
import (
"context"
"kaopu-server/internal/logic"
)
//获取阶梯详情需要的月度信息
func (s *Service)GetRiskTypeDetailBasicMonth(ctx context.Context)(res []map[string]string, err error){
res, err = s.dao.GetRiskTypeDetailBasicMonth(ctx)
logic.CheckErr(err)
return
}
\ No newline at end of file
package service
import (
"context"
"kaopu-server/internal/logic"
)
//获取开启的风险类型
func (s *Service)GetOpenRiskType(c context.Context) (res []map[string]string, err error){
res, err = s.dao.GetOpenRiskType(c)
logic.CheckErr(err)
return
}
//获取开启的风险类型
func (s *Service)UpdateUserRiskType(c context.Context,erp_company_code string,risk_type int){
s.dao.UpdateUserRiskType(c,erp_company_code,risk_type)
}
\ No newline at end of file
......@@ -57,6 +57,11 @@ func (s *Service) GetUserList(ctx context.Context) (res []*model.Users, err erro
return
}
// 获取公司用户列表
func (s *Service) SetUseDb(dbNum int64)() {
s.dao.SetUseDb(dbNum)
}
//----------静态开始
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or sign in to comment