Commit d3916a31 by Joneq

Merge branch 'dev' of http://119.23.72.7/sunlong_v5/kaopu-server into dev

parents eb637bb9 dfa8dfa2
......@@ -43,16 +43,9 @@ type (
//---动态开始
DongMain(ctx context.Context,project_id int,erp_company_code string) (r []map[string]interface{},err error) //动态模型调用主函数
//1 计算逾期金额率 ,ladder_rate 计算出来的此算法对应梯度率,ladder_score 梯度对应的分数
DongYuqiRate(ctx context.Context,y map[string]string,modelItems []map[string]string,project_id int ) (ladder_rate string,ladder_score float64,err error)
DongYuqiBi(ctx context.Context,y map[string]string,modelItems []map[string]string,project_id int ) (ladder_rate string,ladder_score float64,err error)//2 发生逾期笔数率
DongYuqiDivDay(ctx context.Context,y map[string]string,modelItems []map[string]string,project_id int ) (ladder_rate string,ladder_score float64,err error)//3 平均逾期支付时间
DongDivPayDay(ctx context.Context,y map[string]string,modelItems []map[string]string,project_id int ) (ladder_rate string,ladder_score float64,err error)//4 平均付款时间
DongNormalPayRate(ctx context.Context,y map[string]string,modelItems []map[string]string,project_id int ) (ladder_rate string,ladder_score float64,err error)//5 正常收款金额率
DongNormalPayBi(ctx context.Context,y map[string]string,modelItems []map[string]string,project_id int ) (ladder_rate string,ladder_score float64,err error)//6 正常收款笔数率
DongInTimeRate(ctx context.Context,y map[string]string,modelItems []map[string]string,project_id int ) (ladder_rate string,ladder_score float64,err error)//8 交货及时率
DongReturnRate(ctx context.Context,y map[string]string,modelItems []map[string]string,project_id int ) (ladder_rate string,ladder_score float64,err error)//9 退货率
DongAddScore(ctx context.Context,com_credits_id int64)(affectNum int64) //统计动态分数,更新到每个公司
InsertScores2(ctx context.Context, score model.Scores,month_six_zi int64) (insertId int64, err error) //插入分数
DongRate(ctx context.Context,y map[string]string,modelItems []map[string]string,project_id int,month_six string ) (ladder_rate float64,ladder_score float64,remark string,err error)
DongAddScore(ctx context.Context,com_credits_id int64,month_six_zi string )(affectNum int64) //统计动态分数,更新到每个公司
//---动态结束
}
)
......
......@@ -6,13 +6,16 @@ import (
"kaopu-server/internal/logic"
"kaopu-server/internal/model"
"strconv"
"strings"
"time"
)
//存放动态模型所有常量
const (
_sql1= "select m.full_score,m.weight,m.max_score,p.id,p.pid from lie_model m,lie_project p where m.project_id=p.id and p.id=%s" //查询项目配置
_sql2_1 = "select id,erp_company_code,company_name from lie_com_credits where status=5 order by id asc " //查询公司所有信息
_sql2_1 = "select id,erp_company_code,company_name from lie_com_credits where status>=5 order by id asc " //查询公司所有信息
_sql2_2 = "select id,erp_company_code,company_name from lie_com_credits where erp_company_code = '%s' order by id asc " //查询单个公司所有信息
_sql3 = "select * from lie_model_items where project_id=%s " //查询统计项目梯度详情
)
//项目对应的id
......@@ -29,6 +32,7 @@ var Model_dong = map[int]string{
43:"退货率",
44:"近6个月逾期变化率",
45:"近6个月参保人数变化率",
48:"账期使用程度倍数",
999:"累计动态分数",
-1:"队列监听",
}
......@@ -50,9 +54,12 @@ var Model_dong_log = map[int]string{
func (d *dao) DongMain(ctx context.Context,project_id int,erp_company_code string) (r []map[string]interface{},err error) {
var (
weight float64 //权重
ladder_rate string //计算出来的各个动态分数率
ladder_score float64 =0; //对应梯度分数
_sql2 string; //查询公司信息sql
month_six string //拼接6个月字符串,sql用
month_six_zi string //拼接6个月字符串,日期自动用
ladder_rate float64 //计算出来的各个动态分数率
ladder_score float64 =0 //对应梯度分数
_sql2 string //查询公司信息sql
remark string //备注
mod_name string = Model_dong[project_id] //统计动态模型名称
log_pre string = Model_dong_log[project_id] //日志文件名称
modelItem map[string]string //配置主表
......@@ -70,7 +77,7 @@ func (d *dao) DongMain(ctx context.Context,project_id int,erp_company_code strin
weight,_ = strconv.ParseFloat(modelItem["weight"],64)
//查询逾期率项目详情
sql_str4 := fmt.Sprintf(_sql4,strconv.Itoa(project_id))
sql_str4 := fmt.Sprintf(_sql3,strconv.Itoa(project_id))
modelItems,_ = d.QueryMany(ctx,1,sql_str4)
if modelItems == nil {
logic.LogWrite("不存在该项目配置详情lie_model_items,project_id:"+strconv.Itoa(project_id),log_pre,1)
......@@ -86,44 +93,52 @@ func (d *dao) DongMain(ctx context.Context,project_id int,erp_company_code strin
}
company_info,err := d.QueryMany(ctx,1,_sql2);
if err != nil {
logic.LogWrite("错误"+err.Error(),log_pre,1)
return
}
nowTime := time.Now()
getTime := nowTime.AddDate(0, -6, 0) //年,月,日 获取前六个月的时间
year := logic.MyInt64(getTime.Format("2006"))
month := logic.MyInt64(getTime.Format("01"))
month_six_zi = getTime.Format("2006")+getTime.Format("01")+time.Now().AddDate(0, -1, 0).Format("01") //20190612 代表 2019年6 至 12 月
p := 0
for i := month; i <= 12; i++ {
if p == 6 {
break;
}
if i <10 {
month_six += logic.MyInt64ToStr(year)+"0"+logic.MyInt64ToStr(i)+","
}else{
month_six += logic.MyInt64ToStr(year)+logic.MyInt64ToStr(i)+","
}
if i == 12 { //1月
year = year+1
i = 1
}
p +=1
}
month_six = strings.TrimRight(month_six,",") // 六个月sql
for _,v := range company_info{ //循环当前公司,计算各个公司对应分数
if v["erp_company_code"] == "" {
continue;
}
//调用公共动态算法去查对应得分
switch project_id{
case 35: //逾期金额率
ladder_rate,ladder_score,_ = d.DongYuqiRate(ctx,v,modelItems,project_id)
case 36: //发生逾期笔数率
ladder_rate,ladder_score,_ = d.DongYuqiBi(ctx,v,modelItems,project_id)
case 37: //平均逾期支付时间
ladder_rate,ladder_score,_ = d.DongYuqiDivDay(ctx,v,modelItems,project_id)
case 38: //平均付款时间
ladder_rate,ladder_score,_ = d.DongDivPayDay(ctx,v,modelItems,project_id)
case 39: //正常收款金额率
ladder_rate,ladder_score,_ = d.DongNormalPayRate(ctx,v,modelItems,project_id)
case 40: //正常收款笔数率
ladder_rate,ladder_score,_ = d.DongNormalPayBi(ctx,v,modelItems,project_id)
case 42: //交货及时率
ladder_rate,ladder_score,_ = d.DongInTimeRate(ctx,v,modelItems,project_id)
case 43: //退货率
ladder_rate,ladder_score,_ = d.DongReturnRate(ctx,v,modelItems,project_id)
case 999:
d.DongAddScore(ctx,logic.MyInt64(v["id"])) //总计所有分数
if project_id == 999 { //总计所有分数
d.DongAddScore(ctx,logic.MyInt64(v["id"]),month_six_zi) //总计所有分数
continue
default:
continue;
}else{
ladder_rate,ladder_score,remark,_ = d.DongRate(ctx,v,modelItems,project_id,month_six) //调用公共动态算法去查对应得分
}
if ladder_score == 0 {
logic.LogWrite("统计"+mod_name+"--没有梯度对应分数,公司编码:"+v["erp_company_code"]+" 计算公式:"+ladder_rate,log_pre,1)
continue;
}
//if ladder_score == 0 {
// logic.LogWrite("统计"+mod_name+"--没有梯度对应分数,公司编码:"+v["erp_company_code"]+" 计算公式:"+remark,log_pre,1)
// continue;
//}
//计算得到的分数插入分数明细表
var scores model.Scores //插入分数结构体
ProjectPid := logic.MyInt8(modelItem["pid"])
......@@ -137,16 +152,21 @@ func (d *dao) DongMain(ctx context.Context,project_id int,erp_company_code strin
scores.Weight= weight;
scores.FinalScore = weight*ladder_score; //权重乘以单位
scores.ComCreditsId = logic.MyInt64(v["id"]);
scores.Month = logic.MyInt64(month_six_zi);
scores.Current_rate = ladder_rate
scores.Remark = remark
//fmt.Print(scores)
//os.Exit(1)
//d := New()
insertid,err := d.InsertScores(ctx,scores)
insertid,err := d.InsertScores2(ctx,scores,logic.MyInt64(month_six_zi))
if err != nil {
logic.Loginfo("错误:"+err.Error(),log_pre)
fmt.Print("错误:"+err.Error(),insertid,ladder_rate)
}
//日志
logic.LogWrite("统计"+mod_name+"--成功,公司编码:"+v["erp_company_code"]+" 计算公式:"+ladder_rate+" 梯度得分:"+logic.MyFloat64ToStr(ladder_score)+" 权重:"+logic.MyFloat64ToStr(weight)+" 最终得分:"+logic.MyFloat64ToStr(weight*ladder_score),log_pre,1)
logic.LogWrite("统计"+mod_name+"--成功,公司编码:"+v["erp_company_code"]+" 计算公式:"+remark+" 梯度得分:"+logic.MyFloat64ToStr(ladder_score)+" 权重:"+logic.MyFloat64ToStr(weight)+" 最终得分:"+logic.MyFloat64ToStr(weight*ladder_score),log_pre,1)
}
return
......
......@@ -5,278 +5,110 @@ import (
"fmt"
"kaopu-server/internal/logic"
"kaopu-server/internal/model"
"time"
)
const (
_sql3 = "select sum(delay_amount)/sum(order_amount) yuqilv from lie_basic_detail where erp_company_code='%s' " //基础数据
_sql4 = "select * from lie_model_items where project_id=%s " //查询统计项目梯度详情
_sql5 = "select count(1) yuqibi from lie_basic_detail where delay_day>0 and erp_company_code='%s'" //发生逾期总笔数
_sql6 = "select count(1) allbi from lie_basic_detail where return_amount>0 and erp_company_code='%s'" //收款总笔数
_sql8 = "select sum(delay_day) sum_delay_day from lie_basic_detail where delay_day>0 and erp_company_code='%s'" //每笔逾期账款的逾期时间合计
_sql9 = "select sum(TIMESTAMPDIFF(DAY,FROM_UNIXTIME(business_time,'%Y-%m-%d'),FROM_UNIXTIME(return_time,'%Y-%m-%d'))) sum_zhang from lie_basic_detail where erp_company_code=" //每笔付款账期合计 应收日期在1/1-1/31的支付天数合计
_sql10 = "select sum(return_amount) sum_rongcha_huan from lie_basic_detail where delay_day<0 and erp_company_code='%s'" //容差范围内的收款(还款)金额 应收日期在1/1-1/31且逾期支付天数<容差值(目前为0)的下单金额合计
_sql11 = "select count(1) sum_rongcha_bi from lie_basic_detail where delay_day<0 and erp_company_code='%s'" //完成容差范围内收款的笔数 应收日期在1/1-1/31且0<逾期支付天数<容差值(目前为0)的下单订单数
_sql12 = "select sum(order_amount) sum_jiaohuo from lie_basic_detail where erp_company_code='%s'" //交货总金额 退货总金额+出库总金额
_sql13 = "select abs(sum(return_amount)) sum_tuihuo from lie_basic_detail where return_amount<0 and erp_company_code='%s'" //退货总金额 下单时间在1/1-1/30且下单金额为负数的金额合计
_sql14 = "select sum(order_amount) sum_chuhuo from lie_basic_detail where order_amount>0 and erp_company_code='%s'" //出货总金额 下单时间在1/1-1/30的下单总金额合计
_sql15 = "select sum(return_amount) sum_shou from lie_basic_detail where return_amount>0 and erp_company_code='%s'" //收款总额 应收日期在1/1-1/31的回款金额 下单时间在1/1-1/30的下单总金额合计
_sql16 = "select sum(final_score) sum_dong_score from lie_scores where type=2 and com_credits_id=%d"; //总计动态信用分
)
var (
chrate float64; //算出来的率或天
score_one float64 =0; //对应梯度分数
_sql4 = "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," + //逾期时间合计(天)
"abs(sum(period_day)) period_day," + //每笔付款账期合计(天)
"sum(tolerance_receive_amount) tolerance_receive_amount," + //容差范围内收款金额
"sum(tolerance_receive_count) tolerance_receive_count," + //容差范围内收款笔数
"sum(appoint_tolerance) appoint_tolerance," + //给定账期
"sum(schedule_delivery_amount) schedule_delivery_amount," + //按期交货总金额
"sum(delivery_amount) delivery_amount," + //交货总金额(下单总金额)
"abs(sum(return_amount)) return_amount," + //退货总金额
"sum(unload_amount) unload_amount," + //出货总金额
"sum(insurance_user_count) insurance_user_count," + //社保参保人数
"sum(gross_profit) gross_profit " + //累计毛利
" from lie_basic_month where erp_company_code='%s' and month in(%s)" //基础数据
_sql5 = "select sum(final_score) sum_dong_score from lie_scores where type=2 and com_credits_id=%d and month in(%s)"; //总计动态信用分
_sql6 = "select * from lie_basic_month where erp_company_code='%s' and month in(%s)" //获取详情
)
/*
@param ladder_score 对应梯度 率 或天
@param current_rate 对应梯度 率 或天
@param ladder_score 分数,最终对应哪个梯度得分
*/
//1 计算逾期金额率:延期支付时间超过平均账期的金额/收款总额:
func (d *dao) DongYuqiRate(ctx context.Context,y map[string]string,modelItems []map[string]string,project_id int) (ladder_rate string,ladder_score float64,err error) {
//查询逾期率
oneyu,_ := d.QueryOne(ctx,2,fmt.Sprintf(_sql3,y["erp_company_code"]))
if oneyu["yuqilv"] == "" || oneyu == nil { //没有结果
chrate = 0
ladder_rate = "查询逾期率:0"
}else{
chrate = logic.MyFloat64(oneyu["yuqilv"])
ladder_rate = oneyu["yuqilv"]
}
//查询逾期率对应分数
for _,y := range modelItems{
ladder_range_min := logic.MyFloat64(y["ladder_range_min"])
ladder_range_max := logic.MyFloat64(y["ladder_range_max"])
if (ladder_range_min <= chrate && chrate < ladder_range_max ) {
score_one = logic.MyFloat64(y["score"]) //得到的分数
}
}
ladder_score = score_one
return
}
//2 发生逾期笔数率: 发生逾期笔数/收款总笔数
func (d *dao) DongYuqiBi(ctx context.Context,y map[string]string,modelItems []map[string]string,project_id int) (ladder_rate string,ladder_score float64,err error) {
//查询逾期笔数
c1,_ := d.QueryOne(ctx,2,fmt.Sprintf(_sql5,y["erp_company_code"]))
if c1["yuqibi"] == "0" { //没有结果
chrate = 0
ladder_rate = "查询逾期笔数:0"
}else{
//收款总笔数
c2,_ := d.QueryOne(ctx,2,fmt.Sprintf(_sql6,y["erp_company_code"]))
chrate = logic.MyFloat64(c1["yuqibi"])/logic.MyFloat64(c2["allbi"])
ladder_rate = c1["yuqibi"]+"/"+c2["allbi"]+"="+logic.MyFloat64ToStr(chrate)
}
//计算分数
for _,y := range modelItems{
ladder_range_min := logic.MyFloat64(y["ladder_range_min"])
ladder_range_max := logic.MyFloat64(y["ladder_range_max"])
if (ladder_range_min <= chrate && chrate < ladder_range_max ) {
score_one = logic.MyFloat64(y["score"]) //得到的分数
}
}
ladder_score = score_one
return
}
//3 平均逾期支付时间(天): 每笔逾期账款的逾期时间合计/发生逾期总笔数
func (d *dao) DongYuqiDivDay(ctx context.Context,y map[string]string,modelItems []map[string]string,project_id int) (ladder_rate string,ladder_score float64,err error) {
//每笔逾期账款的逾期时间合计
c1,_ := d.QueryOne(ctx,2,fmt.Sprintf(_sql8,y["erp_company_code"]))
if c1["sum_delay_day"] == "0" { //没有结果
chrate = 0
ladder_rate = "每笔逾期账款的逾期时间合计:0"
}else{
//发生逾期总笔数
c2,_ := d.QueryOne(ctx,2,fmt.Sprintf(_sql5,y["erp_company_code"]))
chrate = logic.MyFloat64(c1["sum_delay_day"])/logic.MyFloat64(c2["yuqibi"])
ladder_rate = c1["sum_delay_day"]+"/"+c2["yuqibi"]+"="+logic.MyFloat64ToStr(chrate)
}
//计算分数
for _,y := range modelItems{
ladder_range_min := logic.MyFloat64(y["ladder_range_min"])
ladder_range_max := logic.MyFloat64(y["ladder_range_max"])
if (ladder_range_min <= chrate && chrate < ladder_range_max ) {
score_one = logic.MyFloat64(y["score"]) //得到的分数
}
}
ladder_score = score_one
return
}
//4 平均付款时间(天): 每笔付款账期合计/收款总笔数
func (d *dao) DongDivPayDay(ctx context.Context,y map[string]string,modelItems []map[string]string,project_id int) (ladder_rate string,ladder_score float64,err error) {
//每笔付款账期合计
sql9 := _sql9+"'"+y["erp_company_code"]+"'"
c1,_ := d.QueryOne(ctx,2,sql9)
if c1["sum_zhang"] == "0" { //没有结果
chrate = 0
ladder_rate = "每笔付款账期合计:0"
}else{
//每笔付款账期合计算天,向下取整 1.1 =1
//收款总笔数
c2,_ := d.QueryOne(ctx,2,fmt.Sprintf(_sql6,y["erp_company_code"]))
if c2["allbi"] == "0" { //没有结果
chrate = 0;
ladder_rate = "收款总笔数:0"
}else{
chrate = logic.MyFloat64(c1["sum_zhang"])/logic.MyFloat64(c2["allbi"])
ladder_rate = logic.MyFloat64ToStr(logic.MyFloat64(c1["sum_zhang"]))+"/"+c2["allbi"]+"="+logic.MyFloat64ToStr(chrate)
}
}
//计算分数
for _,y := range modelItems{
ladder_range_min := logic.MyFloat64(y["ladder_range_min"])
ladder_range_max := logic.MyFloat64(y["ladder_range_max"])
if (ladder_range_min <= chrate && chrate < ladder_range_max ) {
score_one = logic.MyFloat64(y["score"]) //得到的分数
}
}
ladder_score = score_one
return
}
//5 正常收款金额率: 容差范围内的收款(还款)金额/收款总金额
func (d *dao) DongNormalPayRate(ctx context.Context,y map[string]string,modelItems []map[string]string,project_id int) (ladder_rate string,ladder_score float64,err error) {
//容差范围内的收款(还款)金额
c1,_ := d.QueryOne(ctx,2,fmt.Sprintf(_sql10,y["erp_company_code"]))
if c1["sum_rongcha_huan"] == "0" { //没有结果
chrate = 0
ladder_rate = "容差范围内的收款(还款)金额:0"
}else{
//收款金额
c2,_ := d.QueryOne(ctx,2,fmt.Sprintf(_sql15,y["erp_company_code"]))
if c2["sum_shou"] == "0" { //没有结果
chrate = 0;
ladder_rate = "收款金额:0"
}else{
chrate = logic.MyFloat64(c1["sum_rongcha_huan"])/logic.MyFloat64(c2["sum_shou"])
ladder_rate = c1["sum_rongcha_huan"]+"/"+c2["sum_shou"]+"="+logic.MyFloat64ToStr(chrate)
}
}
//计算分数
for _,y := range modelItems{
ladder_range_min := logic.MyFloat64(y["ladder_range_min"])
ladder_range_max := logic.MyFloat64(y["ladder_range_max"])
if (ladder_range_min <= chrate && chrate < ladder_range_max ) {
score_one = logic.MyFloat64(y["score"]) //得到的分数
}
}
ladder_score = score_one
return
}
func (d *dao) DongRate(ctx context.Context,y map[string]string,modelItems []map[string]string,project_id int,month_six string) (ladder_rate float64,ladder_score float64,remark string,err error) {
var (
score_one float64 =0; //对应梯度分数
s1,s2 string //拼接六个月月份字符串
)
//6 正常收款笔数率:完成容差范围内收款的笔数/收款总笔数
func (d *dao) DongNormalPayBi(ctx context.Context,y map[string]string,modelItems []map[string]string,project_id int) (ladder_rate string,ladder_score float64,err error) {
//完成容差范围内收款的笔数
c1,_ := d.QueryOne(ctx,2,fmt.Sprintf(_sql11,y["erp_company_code"]))
if c1["sum_rongcha_bi"] == "0" { //没有结果
chrate = 0
ladder_rate = "完成容差范围内收款的笔数:0"
}else{
//收款总笔数
c2,_ := d.QueryOne(ctx,2,fmt.Sprintf(_sql6,y["erp_company_code"]))
if c1["sum_rongcha_bi"] == "0" {
chrate = 0;
ladder_rate = "收款总笔数:0"
}else{
chrate := logic.MyFloat64(c1["sum_rongcha_bi"])/logic.MyFloat64(c2["allbi"])
ladder_rate = c1["sum_rongcha_bi"]+"/"+c2["allbi"]+"="+logic.MyFloat64ToStr(chrate)
}
}
//计算分数
for _,y := range modelItems{
ladder_range_min := logic.MyFloat64(y["ladder_range_min"])
ladder_range_max := logic.MyFloat64(y["ladder_range_max"])
if (ladder_range_min <= chrate && chrate < ladder_range_max ) {
score_one = logic.MyFloat64(y["score"]) //得到的分数
sqla := fmt.Sprintf(_sql4,y["erp_company_code"],month_six)
c1,_ := d.QueryOne(ctx,1,sqla)
switch project_id {
case 35: ////1 计算逾期金额率:逾期金额/收款总额:
s1 = c1["delay_amount"]
s2 = c1["receive_amount"]
case 36: //2 发生逾期笔数率: 发生逾期笔数/收款总笔数
s1 = c1["delay_count"]
s2 = c1["receive_count"]
case 37: //3 平均逾期支付时间(天): 每笔逾期账款的逾期时间合计/发生逾期总笔数
s1 = c1["delay_day"]
s2 = c1["delay_count"]
case 38: //4 平均付款时间(天): 每笔付款账期合计/收款总笔数
s1 = c1["period_day"]
s2 = c1["receive_count"]
case 39: //5 正常收款金额率: 容差范围内的收款(还款)金额/收款总金额
s1 = c1["tolerance_receive_amount"]
s2 = c1["receive_amount"]
case 40: //6 正常收款笔数率:完成容差范围内收款的笔数/收款总笔数
s1 = c1["tolerance_receive_count"]
s2 = c1["receive_count"]
case 42: //8 交货及时率: 按期交货总金额/交货总金额(下单总金额) PS按期交货:逾期交付天数<0
s1 = c1["schedule_delivery_amount"]
s2 = c1["delivery_amount"]
case 43: //9 退货率 : 退货总金额/出库总金额(下单总金额) PS退货总金额金额为负数的订单
s1 = c1["return_amount"]
s2 = c1["unload_amount"]
case 48: // 账期使用倍数统计
last_month := time.Now().Format("2006")+time.Now().AddDate(0, -1, 0).Format("01")
sql6 := fmt.Sprintf(_sql4,y["erp_company_code"],last_month)
c3,_ := d.QueryOne(ctx,1,sql6)
if c3["period_use_times_six"] == "" {
logic.LogWrite("账期使用倍数为空:"+y["erp_company_code"],"dong_error",1)
return
}
ladder_rate = logic.MyFloat64(c3["period_use_times_six"]); //六个月的账期使用倍数
}
ladder_score = score_one
return
}
//8 交货及时率: 按期交货总金额/交货总金额(下单总金额) PS按期交货:逾期交付天数<0
func (d *dao) DongInTimeRate(ctx context.Context,y map[string]string,modelItems []map[string]string,project_id int) (ladder_rate string,ladder_score float64,err error) {
//按期交货总金额
c1,_ := d.QueryOne(ctx,2,fmt.Sprintf(_sql10,y["erp_company_code"]))
if c1["sum_rongcha_huan"] == "0" { //没有结果
chrate = 0
ladder_rate = "按期交货总金额:0";
}else{
//下单总金额
c2,_ := d.QueryOne(ctx,2,fmt.Sprintf(_sql12,y["erp_company_code"]))
if c2["sum_jiaohuo"] == "0" { //没有结果
chrate = 0;
ladder_rate = "下单总金额:0"
}else{
chrate = logic.MyFloat64(c1["sum_rongcha_huan"])/logic.MyFloat64(c2["sum_jiaohuo"])
ladder_rate = c1["sum_rongcha_huan"]+"/"+c2["sum_jiaohuo"]+"="+logic.MyFloat64ToStr(chrate)
if project_id != 48 {
if s1 == "" || s2 == "" {
logic.LogWrite("没有订单数据跳过:"+y["erp_company_code"],"dong_error",1)
return
}
ladder_rate = logic.MyFloat64(s1)/logic.MyFloat64(s2)
remark = s1+"/"+s2+"="+logic.MyFloat64ToStr(ladder_rate)
}
//计算分数
for _,y := range modelItems{
ladder_range_min := logic.MyFloat64(y["ladder_range_min"])
ladder_range_max := logic.MyFloat64(y["ladder_range_max"])
if (ladder_range_min <= chrate && chrate < ladder_range_max ) {
if (ladder_range_min <= ladder_rate && ladder_rate < ladder_range_max ) {
score_one = logic.MyFloat64(y["score"]) //得到的分数
}
}
ladder_score = score_one
return
}
//9 退货率 : 退货总金额/出库总金额(下单总金额) PS退货总金额金额为负数的订单
func (d *dao) DongReturnRate(ctx context.Context,y map[string]string,modelItems []map[string]string,project_id int) (ladder_rate string,ladder_score float64,err error) {
//退货总金额
c1,_ := d.QueryOne(ctx,2,fmt.Sprintf(_sql13,y["erp_company_code"]))
if c1["sum_tuihuo"] == "0" { //没有结果
chrate = 0
ladder_rate = "退货总金额:0"
}else{
//出库总金额
c2,_ := d.QueryOne(ctx,2,fmt.Sprintf(_sql14,y["erp_company_code"]))
if c2["sum_chuhuo"] == "0" { //没有结果
chrate = 0;
ladder_rate = "出库总金额:0"
}else{
chrate = logic.MyFloat64(c1["sum_tuihuo"])/logic.MyFloat64(c2["sum_chuhuo"])
ladder_rate = c1["sum_tuihuo"]+"/"+c2["sum_chuhuo"]+"="+logic.MyFloat64ToStr(chrate)
}
}
//计算分数
for _,y := range modelItems{
ladder_range_min := logic.MyFloat64(y["ladder_range_min"])
ladder_range_max := logic.MyFloat64(y["ladder_range_max"])
if (ladder_range_min <= chrate && chrate < ladder_range_max ) {
score_one = logic.MyFloat64(y["score"]) //得到的分数
}
}
ladder_score = score_one
return
}
//累计公司动态信用分
func (d *dao) DongAddScore(ctx context.Context,com_credits_id int64)(affectNum int64) {
func (d *dao) DongAddScore(ctx context.Context,com_credits_id int64,month_six_zi string )(affectNum int64) {
var(
sum_dong_score float64 //动态模型总分
)
c1,_ := d.QueryOne(ctx,1,fmt.Sprintf(_sql16,com_credits_id))
c1,_ := d.QueryOne(ctx,1,fmt.Sprintf(_sql5,com_credits_id,month_six_zi))
if c1["sum_dong_score"] == "0" || c1["sum_dong_score"] == "" { //没有结果
sum_dong_score = 0
}else{
......@@ -294,7 +126,14 @@ func (d *dao) DongAddScore(ctx context.Context,com_credits_id int64)(affectNum i
return
}
/*
ear := time.Now().Format("2006")
month := time.Now().Format("01")
day := time.Now().Format("02")
hour := time.Now().Format("15")
min := time.Now().Format("04")
second := time.Now().Format("05")
*/
......
package dao
import (
"context"
"fmt"
"kaopu-server/internal/logic"
"kaopu-server/internal/model"
)
const (
_sql3 = "select sum(delay_amount)/sum(order_amount) yuqilv from lie_basic_detail where erp_company_code='%s' " //基础数据
_sql4 = "select * from lie_model_items where project_id=%s " //查询统计项目梯度详情
_sql5 = "select count(1) yuqibi from lie_basic_detail where delay_day>0 and erp_company_code='%s'" //发生逾期总笔数
_sql6 = "select count(1) allbi from lie_basic_detail where return_amount>0 and erp_company_code='%s'" //收款总笔数
_sql8 = "select sum(delay_day) sum_delay_day from lie_basic_detail where delay_day>0 and erp_company_code='%s'" //每笔逾期账款的逾期时间合计
_sql9 = "select sum(TIMESTAMPDIFF(DAY,FROM_UNIXTIME(business_time,'%Y-%m-%d'),FROM_UNIXTIME(return_time,'%Y-%m-%d'))) sum_zhang from lie_basic_detail where erp_company_code=" //每笔付款账期合计 应收日期在1/1-1/31的支付天数合计
_sql10 = "select sum(return_amount) sum_rongcha_huan from lie_basic_detail where delay_day<0 and erp_company_code='%s'" //容差范围内的收款(还款)金额 应收日期在1/1-1/31且逾期支付天数<容差值(目前为0)的下单金额合计
_sql11 = "select count(1) sum_rongcha_bi from lie_basic_detail where delay_day<0 and erp_company_code='%s'" //完成容差范围内收款的笔数 应收日期在1/1-1/310<逾期支付天数<容差值(目前为0)的下单订单数
_sql12 = "select sum(order_amount) sum_jiaohuo from lie_basic_detail where erp_company_code='%s'" //交货总金额 退货总金额+出库总金额
_sql13 = "select abs(sum(return_amount)) sum_tuihuo from lie_basic_detail where return_amount<0 and erp_company_code='%s'" //退货总金额 下单时间在1/1-1/30且下单金额为负数的金额合计
_sql14 = "select sum(order_amount) sum_chuhuo from lie_basic_detail where order_amount>0 and erp_company_code='%s'" //出货总金额 下单时间在1/1-1/30的下单总金额合计
_sql15 = "select sum(return_amount) sum_shou from lie_basic_detail where return_amount>0 and erp_company_code='%s'" //收款总额 应收日期在1/1-1/31的回款金额 下单时间在1/1-1/30的下单总金额合计
_sql16 = "select sum(final_score) sum_dong_score from lie_scores where type=2 and com_credits_id=%d"; //总计动态信用分
)
var (
chrate float64; //算出来的率或天
score_one float64 =0; //对应梯度分数
)
/*
@param ladder_score 对应梯度 或天
@param ladder_score 分数,最终对应哪个梯度得分
*/
//1 计算逾期金额率:延期支付时间超过平均账期的金额/收款总额:
func (d *dao) DongYuqiRate(ctx context.Context,y map[string]string,modelItems []map[string]string,project_id int) (ladder_rate string,ladder_score float64,err error) {
//查询逾期率
oneyu,_ := d.QueryOne(ctx,2,fmt.Sprintf(_sql3,y["erp_company_code"]))
if oneyu["yuqilv"] == "" || oneyu == nil { //没有结果
chrate = 0
ladder_rate = "查询逾期率:0"
}else{
chrate = logic.MyFloat64(oneyu["yuqilv"])
ladder_rate = oneyu["yuqilv"]
}
//查询逾期率对应分数
for _,y := range modelItems{
ladder_range_min := logic.MyFloat64(y["ladder_range_min"])
ladder_range_max := logic.MyFloat64(y["ladder_range_max"])
if (ladder_range_min <= chrate && chrate < ladder_range_max ) {
score_one = logic.MyFloat64(y["score"]) //得到的分数
}
}
ladder_score = score_one
return
}
//2 发生逾期笔数率: 发生逾期笔数/收款总笔数
func (d *dao) DongYuqiBi(ctx context.Context,y map[string]string,modelItems []map[string]string,project_id int) (ladder_rate string,ladder_score float64,err error) {
//查询逾期笔数
c1,_ := d.QueryOne(ctx,2,fmt.Sprintf(_sql5,y["erp_company_code"]))
if c1["yuqibi"] == "0" { //没有结果
chrate = 0
ladder_rate = "查询逾期笔数:0"
}else{
//收款总笔数
c2,_ := d.QueryOne(ctx,2,fmt.Sprintf(_sql6,y["erp_company_code"]))
chrate = logic.MyFloat64(c1["yuqibi"])/logic.MyFloat64(c2["allbi"])
ladder_rate = c1["yuqibi"]+"/"+c2["allbi"]+"="+logic.MyFloat64ToStr(chrate)
}
//计算分数
for _,y := range modelItems{
ladder_range_min := logic.MyFloat64(y["ladder_range_min"])
ladder_range_max := logic.MyFloat64(y["ladder_range_max"])
if (ladder_range_min <= chrate && chrate < ladder_range_max ) {
score_one = logic.MyFloat64(y["score"]) //得到的分数
}
}
ladder_score = score_one
return
}
//3 平均逾期支付时间(天): 每笔逾期账款的逾期时间合计/发生逾期总笔数
func (d *dao) DongYuqiDivDay(ctx context.Context,y map[string]string,modelItems []map[string]string,project_id int) (ladder_rate string,ladder_score float64,err error) {
//每笔逾期账款的逾期时间合计
c1,_ := d.QueryOne(ctx,2,fmt.Sprintf(_sql8,y["erp_company_code"]))
if c1["sum_delay_day"] == "0" { //没有结果
chrate = 0
ladder_rate = "每笔逾期账款的逾期时间合计:0"
}else{
//发生逾期总笔数
c2,_ := d.QueryOne(ctx,2,fmt.Sprintf(_sql5,y["erp_company_code"]))
chrate = logic.MyFloat64(c1["sum_delay_day"])/logic.MyFloat64(c2["yuqibi"])
ladder_rate = c1["sum_delay_day"]+"/"+c2["yuqibi"]+"="+logic.MyFloat64ToStr(chrate)
}
//计算分数
for _,y := range modelItems{
ladder_range_min := logic.MyFloat64(y["ladder_range_min"])
ladder_range_max := logic.MyFloat64(y["ladder_range_max"])
if (ladder_range_min <= chrate && chrate < ladder_range_max ) {
score_one = logic.MyFloat64(y["score"]) //得到的分数
}
}
ladder_score = score_one
return
}
//4 平均付款时间(天): 每笔付款账期合计/收款总笔数
func (d *dao) DongDivPayDay(ctx context.Context,y map[string]string,modelItems []map[string]string,project_id int) (ladder_rate string,ladder_score float64,err error) {
//每笔付款账期合计
sql9 := _sql9+"'"+y["erp_company_code"]+"'"
c1,_ := d.QueryOne(ctx,2,sql9)
if c1["sum_zhang"] == "0" { //没有结果
chrate = 0
ladder_rate = "每笔付款账期合计:0"
}else{
//每笔付款账期合计算天,向下取整 1.1 =1
//收款总笔数
c2,_ := d.QueryOne(ctx,2,fmt.Sprintf(_sql6,y["erp_company_code"]))
if c2["allbi"] == "0" { //没有结果
chrate = 0;
ladder_rate = "收款总笔数:0"
}else{
chrate = logic.MyFloat64(c1["sum_zhang"])/logic.MyFloat64(c2["allbi"])
ladder_rate = logic.MyFloat64ToStr(logic.MyFloat64(c1["sum_zhang"]))+"/"+c2["allbi"]+"="+logic.MyFloat64ToStr(chrate)
}
}
//计算分数
for _,y := range modelItems{
ladder_range_min := logic.MyFloat64(y["ladder_range_min"])
ladder_range_max := logic.MyFloat64(y["ladder_range_max"])
if (ladder_range_min <= chrate && chrate < ladder_range_max ) {
score_one = logic.MyFloat64(y["score"]) //得到的分数
}
}
ladder_score = score_one
return
}
//5 正常收款金额率: 容差范围内的收款(还款)金额/收款总金额
func (d *dao) DongNormalPayRate(ctx context.Context,y map[string]string,modelItems []map[string]string,project_id int) (ladder_rate string,ladder_score float64,err error) {
//容差范围内的收款(还款)金额
c1,_ := d.QueryOne(ctx,2,fmt.Sprintf(_sql10,y["erp_company_code"]))
if c1["sum_rongcha_huan"] == "0" { //没有结果
chrate = 0
ladder_rate = "容差范围内的收款(还款)金额:0"
}else{
//收款金额
c2,_ := d.QueryOne(ctx,2,fmt.Sprintf(_sql15,y["erp_company_code"]))
if c2["sum_shou"] == "0" { //没有结果
chrate = 0;
ladder_rate = "收款金额:0"
}else{
chrate = logic.MyFloat64(c1["sum_rongcha_huan"])/logic.MyFloat64(c2["sum_shou"])
ladder_rate = c1["sum_rongcha_huan"]+"/"+c2["sum_shou"]+"="+logic.MyFloat64ToStr(chrate)
}
}
//计算分数
for _,y := range modelItems{
ladder_range_min := logic.MyFloat64(y["ladder_range_min"])
ladder_range_max := logic.MyFloat64(y["ladder_range_max"])
if (ladder_range_min <= chrate && chrate < ladder_range_max ) {
score_one = logic.MyFloat64(y["score"]) //得到的分数
}
}
ladder_score = score_one
return
}
//6 正常收款笔数率:完成容差范围内收款的笔数/收款总笔数
func (d *dao) DongNormalPayBi(ctx context.Context,y map[string]string,modelItems []map[string]string,project_id int) (ladder_rate string,ladder_score float64,err error) {
//完成容差范围内收款的笔数
c1,_ := d.QueryOne(ctx,2,fmt.Sprintf(_sql11,y["erp_company_code"]))
if c1["sum_rongcha_bi"] == "0" { //没有结果
chrate = 0
ladder_rate = "完成容差范围内收款的笔数:0"
}else{
//收款总笔数
c2,_ := d.QueryOne(ctx,2,fmt.Sprintf(_sql6,y["erp_company_code"]))
if c1["sum_rongcha_bi"] == "0" {
chrate = 0;
ladder_rate = "收款总笔数:0"
}else{
chrate := logic.MyFloat64(c1["sum_rongcha_bi"])/logic.MyFloat64(c2["allbi"])
ladder_rate = c1["sum_rongcha_bi"]+"/"+c2["allbi"]+"="+logic.MyFloat64ToStr(chrate)
}
}
//计算分数
for _,y := range modelItems{
ladder_range_min := logic.MyFloat64(y["ladder_range_min"])
ladder_range_max := logic.MyFloat64(y["ladder_range_max"])
if (ladder_range_min <= chrate && chrate < ladder_range_max ) {
score_one = logic.MyFloat64(y["score"]) //得到的分数
}
}
ladder_score = score_one
return
}
//8 交货及时率: 按期交货总金额/交货总金额(下单总金额) PS按期交货:逾期交付天数<0
func (d *dao) DongInTimeRate(ctx context.Context,y map[string]string,modelItems []map[string]string,project_id int) (ladder_rate string,ladder_score float64,err error) {
//按期交货总金额
c1,_ := d.QueryOne(ctx,2,fmt.Sprintf(_sql10,y["erp_company_code"]))
if c1["sum_rongcha_huan"] == "0" { //没有结果
chrate = 0
ladder_rate = "按期交货总金额:0";
}else{
//下单总金额
c2,_ := d.QueryOne(ctx,2,fmt.Sprintf(_sql12,y["erp_company_code"]))
if c2["sum_jiaohuo"] == "0" { //没有结果
chrate = 0;
ladder_rate = "下单总金额:0"
}else{
chrate = logic.MyFloat64(c1["sum_rongcha_huan"])/logic.MyFloat64(c2["sum_jiaohuo"])
ladder_rate = c1["sum_rongcha_huan"]+"/"+c2["sum_jiaohuo"]+"="+logic.MyFloat64ToStr(chrate)
}
}
//计算分数
for _,y := range modelItems{
ladder_range_min := logic.MyFloat64(y["ladder_range_min"])
ladder_range_max := logic.MyFloat64(y["ladder_range_max"])
if (ladder_range_min <= chrate && chrate < ladder_range_max ) {
score_one = logic.MyFloat64(y["score"]) //得到的分数
}
}
ladder_score = score_one
return
}
//9 退货率 : 退货总金额/出库总金额(下单总金额) PS退货总金额金额为负数的订单
func (d *dao) DongReturnRate(ctx context.Context,y map[string]string,modelItems []map[string]string,project_id int) (ladder_rate string,ladder_score float64,err error) {
//退货总金额
c1,_ := d.QueryOne(ctx,2,fmt.Sprintf(_sql13,y["erp_company_code"]))
if c1["sum_tuihuo"] == "0" { //没有结果
chrate = 0
ladder_rate = "退货总金额:0"
}else{
//出库总金额
c2,_ := d.QueryOne(ctx,2,fmt.Sprintf(_sql14,y["erp_company_code"]))
if c2["sum_chuhuo"] == "0" { //没有结果
chrate = 0;
ladder_rate = "出库总金额:0"
}else{
chrate = logic.MyFloat64(c1["sum_tuihuo"])/logic.MyFloat64(c2["sum_chuhuo"])
ladder_rate = c1["sum_tuihuo"]+"/"+c2["sum_chuhuo"]+"="+logic.MyFloat64ToStr(chrate)
}
}
//计算分数
for _,y := range modelItems{
ladder_range_min := logic.MyFloat64(y["ladder_range_min"])
ladder_range_max := logic.MyFloat64(y["ladder_range_max"])
if (ladder_range_min <= chrate && chrate < ladder_range_max ) {
score_one = logic.MyFloat64(y["score"]) //得到的分数
}
}
ladder_score = score_one
return
}
//累计公司动态信用分
func (d *dao) DongAddScore(ctx context.Context,com_credits_id int64)(affectNum int64) {
var(
sum_dong_score float64 //动态模型总分
)
c1,_ := d.QueryOne(ctx,1,fmt.Sprintf(_sql16,com_credits_id))
if c1["sum_dong_score"] == "0" || c1["sum_dong_score"] == "" { //没有结果
sum_dong_score = 0
}else{
sum_dong_score = logic.MyFloat64(c1["sum_dong_score"])
}
var com_credit model.ComCredits
com_credit.DynamicCreditScore = sum_dong_score
com_credit.Id = com_credits_id
logic.LogWrite("统计动态分数完成,供应商id:"+logic.MyInt64ToStr(com_credits_id)+"总动态分:"+logic.MyFloat64ToStr(sum_dong_score),"dong_sum",1)
//最后累计总分评分
affectNum,_ = d.UpdateMoveSumScores(ctx,com_credit)
return
}
......@@ -61,3 +61,46 @@ func (d *dao) InsertScores(ctx context.Context,score model.Scores) (insertId int
return
}
//增加或者修改记录(动态模型专用)
func (d *dao) InsertScores2(ctx context.Context,score model.Scores,month_six_zi int64) (insertId int64,err error) {
//defer d.db.Close()
var(
exitId int
execSql string
affectNum int64
)
//ss := fmt.Sprintf("select id from lie_scores where `type` = %d and project_pid = %d and project_id = %d and com_credits_id = %d limit 0,1", score.Type,score.ProjectPid,score.ProjectId,score.ComCreditsId)
//print(ss)
err = d.db.QueryRow(ctx,"select id from lie_scores where `type` = ? and project_pid = ? and project_id = ? and com_credits_id = ? and month= ? limit 0,1", score.Type,score.ProjectPid,score.ProjectId,score.ComCreditsId,month_six_zi).Scan(&exitId)
if err != nil {
//fmt.Print(err)
//sql := fmt.Sprintf("select id from lie_scores where `type` = %d and project_pid = %d and project_id = %d and com_credits_id = %d and month= %d limit 0,1", score.Type,score.ProjectPid,score.ProjectId,score.ComCreditsId,month_six_zi);
//fmt.Print("查询失败:"+sql)
//os.Exit(1)
}
if exitId == 0 {
execSql = "INSERT INTO `lie_scores` (`type`, `project_pid`, `project_id`, `total_score`, `current_score`, `weight`, `final_score`, `com_credits_id`, `create_time`,`current_rate`,`month`,`remark`)VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?,?,?,?)"
row,err := d.db.Exec(ctx,execSql,score.Type,score.ProjectPid,score.ProjectId,score.TotalScore,score.CurrentScore,score.Weight,score.FinalScore,score.ComCreditsId,time.Now().Unix(),score.Current_rate,score.Month,score.Remark)
if err != nil {
log.Error("InsertScoresdb.DemoExec.Exec(%s) error(%v)", execSql, err)
}else{
affectNum,_ = row.LastInsertId()
}
}else{
execSql = "update `lie_scores` set `type` = ?, `project_pid` = ?, `project_id` = ?, `total_score` = ?, `current_score` = ?, `weight` = ?, `final_score` = ?, `update_time` = ?, `current_rate` = ?, `remark` = ? where `type` = ? and project_pid = ? and project_id = ? and com_credits_id = ? and month = ?"
row,err := d.db.Exec(ctx,execSql,score.Type,score.ProjectPid,score.ProjectId,score.TotalScore,score.CurrentScore,score.Weight,score.FinalScore,time.Now().Unix(), score.Current_rate,score.Remark,score.Type,score.ProjectPid,score.ProjectId,score.ComCreditsId,month_six_zi)
if err != nil {
log.Error("updateScoresdb.DemoExec.Exec(%s) error(%v)", execSql, err)
}else{
affectNum,_ = row.RowsAffected()
}
}
insertId = affectNum
return
}
\ No newline at end of file
......@@ -14,6 +14,9 @@ type Scores struct {
ComCreditsId int64 `json:"com_credits_id"`
CreateTime int64 `json:"create_time"`
UpdateTime int64 `json:"update_time"`
Month int64 `json:"month"`
Current_rate float64 `json:"current_rate"`
Remark string `json:"remark"`
}
/*CREATE TABLE `lie_scores` (
......
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