Commit c76d9984 by Joneq

合并dev

parents 4a24c80c d3873971
......@@ -14,3 +14,7 @@ Homestead.json
.DS_Store?
.DS_Store
/configs
cmd/cmd.exe
cmd/move/logs/
/cmd/dong/logs/*.log
logs
package main
import (
"context"
"encoding/json"
"flag"
"fmt"
"github.com/bilibili/kratos/pkg/conf/paladin"
"github.com/ichunt2019/go-msgserver/utils/rabbitmq"
"kaopu-server/internal/dao"
"kaopu-server/internal/logic"
"kaopu-server/internal/service"
"os"
"strconv"
"time"
)
type Rabitmq struct {
Dsn string //rabitmq 配置1
}
type RecvPro struct {}
type RabbitMsg struct {
ComCreditsId string `json:"com_credits_id"`
ErpCompanyCode string `json:"erp_company_code"`
}
func main() {
//获取输入参数s
var mod int;
flag.IntVar(&mod, "m", 0, "请输入模块id") // 单独计算某个模块,默认计算全部,0计算全部
flag.Parse()
if err := paladin.Init(); err != nil {
panic(err)
}
model_dong := dao.Model_dong //所有动态模型算法列表
if mod == -1 {
queues() //队列监听
return
}
_ ,ok := model_dong[mod]
if !ok {
fmt.Println("模块名称输入错误!")
os.Exit(1)
}
ctx := context.Background() //上下文
if mod >0 {
svc := service.New()
svc.DongRun(ctx,mod,""); //运行main
svc.DongRun(ctx,999,""); //总计所有分数
svc.Close() //关闭数据库连接
logic.LogWrite("统计"+dao.Model_dong[mod]+"完成",dao.Model_dong_log[mod],1)
}else{
for {
logic.LogWrite("统计所有动态任务开始","_dong_main",1)
svc := service.New()
for k,_ := range model_dong{
if k == -1 || k == 0 {
continue;
}
mod_name := dao.Model_dong[k]
mod_name_log :=dao.Model_dong_log[k]
logic.LogWrite("统计项目"+mod_name+"开始:"+strconv.Itoa(k),mod_name_log,1)
svc.DongRun(ctx,k,""); //运行main
logic.LogWrite("统计项目"+mod_name+"结束:"+strconv.Itoa(k),mod_name_log,1)
}
svc.Close() //关闭数据库连接
time.Sleep(60*time.Second)
}
fmt.Println("\r\n所有任务已经完成")
}
}
//队列监听
func queues() {
t := &RecvPro{}
var (
dc struct {
Dsn1 *Rabitmq // rab配置1
}
)
paladin.Get("rabitmq.toml").UnmarshalTOML(&dc) //读取配置
queueExchange := &rabbitmq.QueueExchange{
"fengkong_dong_count",
"fengkong_dong_count",
"fengkong_exchange",
"direct",
"amqp://"+dc.Dsn1.Dsn+"/",
}
for{
mq := rabbitmq.New(queueExchange)
mq.RegisterReceiver(t)
err :=mq.Start()
if err != nil{
fmt.Println(err)
}
time.Sleep(3*time.Second)
}
}
//// 实现消费者 消费消息失败 自动进入延时尝试 尝试3次之后入库db
func (t *RecvPro) Consumer(dataByte []byte) error {
//转成json串
var rbm RabbitMsg
json.Unmarshal(dataByte,&rbm)
fmt.Print(rbm)
ctx := context.Background() //上下文
model_dong := dao.Model_dong //所有动态模型算法列表
svc := service.New()
for k,_ := range model_dong{
if k == -1 || k == 0 {
continue;
}
mod_name := dao.Model_dong[k]
mod_name_log :=dao.Model_dong_log[k]
fmt.Println("统计开始:"+strconv.Itoa(k))
logic.Loginfo("统计开始--"+mod_name,mod_name_log);
svc.DongRun(ctx,k,rbm.ErpCompanyCode); //运行main
fmt.Println("统计结束:"+strconv.Itoa(k))
logic.Loginfo("统计结束--"+mod_name,mod_name_log);
}
//最后关闭数据连接
svc.Close() //关闭数据库连接
//return errors.New("顶顶顶顶")
return nil
}
//消息已经消费3次 失败了 请进行处理
func (t *RecvPro) FailAction(dataByte []byte) error {
fmt.Println(string(dataByte))
fmt.Println("任务处理失败了,我要进入db日志库了")
fmt.Println("任务处理失败了,发送钉钉消息通知主人")
return nil
}
package main
import (
"flag"
"context"
"kaopu-server/internal/service"
"github.com/bilibili/kratos/pkg/conf/paladin"
"github.com/bilibili/kratos/pkg/log"
import "fmt"
func main() {
fmt.Print(1)
}
)
func main() {
//获取输入参数
flag.Parse()
if err := paladin.Init(); err != nil {
panic(err)
}
//初始化日志目录
log.Init(&log.Config{Dir: "logs"})
defer log.Close()
log.Info("caipu-server start")
//声明service层
svc := service.New()
ctx := context.Background()
//调用会员服务
svc.GetUserList(ctx)
}
package detail
import (
"context"
"fmt"
"strconv"
"time"
)
//计算单一项总的静态分
func SetSumScore(c context.Context) {
Com_credits.Id = InsertScoreMsg.ComCreditsId
Com_credits.StaticCreditScore = CompanyInfo()+ AddScore()+ EnterPriseCredit()+ HistoryBussiness() + PersonalCredit()
_,err := Svclient.UpdateStaticSumScores(c,Com_credits)
fmt.Print(err)
}
//协程增加分值记录
func InsertRecord() {
for InsertScoreMsgRecord := range SocreRecordChan{
insertId,err := Svclient.InsertScores(Conclient,InsertScoreMsgRecord)
if err != nil {
fmt.Print(err)
}
fmt.Print(insertId)
}
defer Wg.Done()
}
//设置插入的分数头
func SetInsertScoreChanFooter(_typy,project_pid,project_id int8) {
InsertScoreMsg.Type,InsertScoreMsg.ProjectPid,InsertScoreMsg.ProjectId = _typy,project_pid,project_id
SocreRecordChan <- InsertScoreMsg
}
//获取详细的计算基本数据
func GetCompanyRunInfo() {
CompanyBasicInfo,_ = Svclient.GetCompanyBaseInfoByCid(Conclient,InsertScoreMsg.ComCreditsId)
CompanySoreFields,_ = Svclient.GetCompanyScoreFieldsByCid(Conclient,InsertScoreMsg.ComCreditsId)
CompanyAddScore,_ = Svclient.GetCompanyAddSoreByCid(Conclient,InsertScoreMsg.ComCreditsId)
}
func GetTimeStamp()(timestamp int64) {
return time.Now().Unix()
}
func StringTurnInt64(val string) (int64) {
intval,_ := strconv.ParseInt(val, 10, 64)
return intval
}
func StringTurnFloat64(val string)(float64) {
floatval,_ := strconv.ParseFloat(val, 64)
return floatval
}
//获取项目详情
func getModelByProjectId(projectId int64)(modelInfo map[string]string) {
res,_ := Svclient.GetCompanyModelByProjectid(Conclient,projectId)
return res
}
//获取顶头详情
func GetModelTopsetByProjectId(projectId int64)(modelInfo map[string]string) {
res,_ := Svclient.GetModelTopsetByProjectId(Conclient,projectId)
return res
}
//获取顶头详情
func GetCompanyModelItemsByProjectid(projectId int64, score float64) (modelInfo map[string]string) {
res,_ := Svclient.GetCompanyModelItemsByProjectid(Conclient,projectId,score)
return res
}
//获取顶头详情
func GetCompanyModelItemsByProjectidWitchString(project_id int64 , stringVal string) (modelInfo map[string]string) {
res,_ := Svclient.GetCompanyModelItemsByProjectidWitchString(Conclient,project_id,stringVal)
return res
}
func GetScore(projectId int64, stringVal string) (fianlscore float64) {
modelTypeInfo,_ := Svclient.GetCompanyModelByProjectid(Conclient,projectId)
modelInfo := make(map[string]string)
//如果是四,就用文本类型查询
if modelTypeInfo["numeric_type"] == "4" {
modelInfo = GetCompanyModelItemsByProjectidWitchString(projectId,stringVal)
}else{
var score float64
switch modelTypeInfo["unit"] {
case "5":
score = StringTurnFloat64(stringVal) /10000
break
case "7":
score = StringTurnFloat64(stringVal) /100
break
default:
score = StringTurnFloat64(stringVal) /1
}
modelInfo = GetCompanyModelItemsByProjectid(projectId,score)
}
return StringTurnFloat64(modelInfo["score"])
}
//设置分数
func SetScore(curretScoreRelace float64,modelId int64)(fimalScore float64) {
modelInfo := getModelByProjectId(modelId)
weightReplace := StringTurnFloat64(modelInfo["weight"])
if curretScoreRelace > StringTurnFloat64(modelInfo["full_score"]) {
curretScoreRelace = StringTurnFloat64(modelInfo["full_score"])
}
InsertScoreMsg.TotalScore = curretScoreRelace
//设置分数
InsertScoreMsg.FinalScore ,InsertScoreMsg.CurrentScore = curretScoreRelace * weightReplace,curretScoreRelace * weightReplace
InsertScoreMsg.Weight = weightReplace
return InsertScoreMsg.FinalScore
}
//设置project总分
func SetProjectScore(totalScoreReplace [20]float64, weightReplace float64, fullScore float64)(finalScore float64) {
var(
sumScore float64 = 0
joinNum float64 = 0
)
//查找出所有不是0的分值
for i :=0;i < len(totalScoreReplace) ; i++ {
if totalScoreReplace[i] > 0 {
joinNum += 1
sumScore += totalScoreReplace[i]
}
}
InsertScoreMsg.CurrentScore,InsertScoreMsg.TotalScore = sumScore,sumScore
//如果是0则不判断了
if sumScore == 0 {
InsertScoreMsg.FinalScore = 0
}else{
//如果最后金额大于满分,则算为最满分
if sumScore > fullScore {
InsertScoreMsg.TotalScore = fullScore
}else{
InsertScoreMsg.TotalScore = sumScore
}
//经过权重计算之后的总分值
InsertScoreMsg.FinalScore = sumScore * weightReplace
}
InsertScoreMsg.Weight = weightReplace
return InsertScoreMsg.FinalScore
}
\ No newline at end of file
package detail
//加分项30分)
func AddScore()(finalScore float64) {
var(
sumScore float64 = 0
)
for _,v :=range CompanyAddScore{
sumScore += StringTurnFloat64(v["final_score"])
}
//经过权重计算之后的总分值
InsertScoreMsg.FinalScore ,InsertScoreMsg.TotalScore,InsertScoreMsg.CurrentScore = sumScore,sumScore,sumScore
InsertScoreMsg.Weight = 1
SetInsertScoreChanFooter(1,0,5)
finalScore = InsertScoreMsg.FinalScore
return finalScore
}
//业界口碑(2分))
func IndustryReputation() {
}
//开工率(1分))
func OperatingRate() {
}
//下游客户类型(2分))
func DownstreamCustomerType() {
}
//担保人个数(5分))
func NumberOfGuarantors() {
}
//抵押物(20分))
func Collateral() {
}
\ No newline at end of file
package detail
import (
"context"
"kaopu-server/internal/model"
"kaopu-server/internal/service"
"sync"
)
var (
//获取的公司信息
CompanyData []map[string]string
//分数记录通道
SocreRecordChan = make(chan model.Scores)
//分数的数据
InsertScoreMsg model.Scores
//公司总的信息
Com_credits model.ComCredits
//公司的详细数据
CompanyBasicInfo map[string]string
//公司的逾期数据
CompanySoreFields map[string]string
//公司的历史数据
BasicInfo map[string]string
//公司的加分数据
CompanyAddScore []map[string]string
//设置等待
Wg sync.WaitGroup
//设置svclient
Svclient *service.Service
//content Client
Conclient context.Context
)
package detail
import (
"strconv"
)
var(
c_currentScore float64
c_totalScore [20]float64
weight float64
)
//公司信息计算
func CompanyInfo()(finalScore float64) {
EstablishmentTime()
CompanyNature()
ChangeslegalInFiveYears()
RegisteredCapital()
AnnualTaxRate()
lawsuitsInPastTwoYars()
NumberOfSocial()
modelInfo := GetModelTopsetByProjectId(1)
weight = StringTurnFloat64(modelInfo["weight"])
finalScore = SetProjectScore(c_totalScore,weight,StringTurnFloat64(modelInfo["full_score"]))
SetInsertScoreChanFooter(1,0,1)
return finalScore
}
//成立时间(1分) 大于五年1分,小于零分
func EstablishmentTime() {
establishment_time := StringTurnInt64(CompanyBasicInfo["establishment_time"])
diffTime := (GetTimeStamp() - establishment_time) / (3600 * 24 * 365)
c_currentScore = GetScore(8,strconv.FormatInt(diffTime,10))
c_totalScore[0]= SetScore(c_currentScore,8)
SetInsertScoreChanFooter(1,1,8)
}
//公司性质(1分)上,国,央,一分,其它零分
func CompanyNature() {
c_currentScore = GetScore(9,CompanyBasicInfo["customer_property"])
c_totalScore[1]= SetScore(c_currentScore,9)
SetInsertScoreChanFooter(1,1,9)
}
//5年内法人变更次数(1分)
func ChangeslegalInFiveYears() {
c_currentScore = GetScore(10,CompanyBasicInfo["five_legal_change"])
c_totalScore[2]= SetScore(c_currentScore,10)
SetInsertScoreChanFooter(1,1,10)
}
//注册资本(2分)
func RegisteredCapital() {
c_currentScore = GetScore(11,CompanyBasicInfo["registered_capital"])
c_totalScore[3]= SetScore(c_currentScore,11)
SetInsertScoreChanFooter(1,1,11)
}
//年纳税额(2分)
func AnnualTaxRate() {
c_currentScore = GetScore(12,CompanyBasicInfo["year_tax_payable"])
c_totalScore[4]= SetScore(c_currentScore,12)
SetInsertScoreChanFooter(1,1,12)
}
//近两年内有无诉讼(2分)
func lawsuitsInPastTwoYars() {
c_currentScore = GetScore(13,CompanyBasicInfo["two_years_no_lawsuit"])
c_totalScore[5]= SetScore(c_currentScore,13)
SetInsertScoreChanFooter(1,1,13)
}
//社保参保人数(1分)
func NumberOfSocial() {
c_currentScore = GetScore(14,CompanyBasicInfo["social_security_participants"])
c_totalScore[6]= SetScore(c_currentScore,14)
SetInsertScoreChanFooter(1,1,14)
}
package detail
var(
e_totalScore [20]float64
e_currentScore float64
e_weight float64
)
//企业征信(10分)
func EnterPriseCredit()(finalScore float64) {
IsEnterpriseOverdueWhether()
IsHistoryOverdue()
modelInfo := GetModelTopsetByProjectId(2)
e_weight = StringTurnFloat64(modelInfo["weight"])
finalScore = SetProjectScore(e_totalScore,e_weight,StringTurnFloat64(modelInfo["full_score"]))
SetInsertScoreChanFooter(1,0,2)
return finalScore
}
//企业有无负债(5分)
func IsEnterpriseOverdueWhether() {
e_currentScore = GetScore(15,CompanySoreFields["company_has_liabilities"])
e_totalScore[0]= SetScore(e_currentScore,15)
SetInsertScoreChanFooter(1,2,15)
}
//历史有无逾期(5分)
func IsHistoryOverdue() {
e_currentScore = GetScore(16,CompanySoreFields["history_overdue"])
e_totalScore[1]= SetScore(e_currentScore,16)
SetInsertScoreChanFooter(1,2,16)
}
\ No newline at end of file
package detail
import (
"strconv"
)
var(
h_currentScore float64
h_totalScore [20]float64
h_weight float64
)
//历史交易情况(50分)
func HistoryBussiness()(finalScore float64) {
CooperationTime()
AccumulatedAmountOfCooperation()
AccumulatedGrossProfit()
HistoricalOverdueTimes()
AverageMoneyThreeMonths()
AverageMoneySixMonths()
modelInfo := GetModelTopsetByProjectId(4)
h_weight = StringTurnFloat64(modelInfo["weight"])
finalScore = SetProjectScore(h_totalScore,h_weight,StringTurnFloat64(modelInfo["full_score"]))
SetInsertScoreChanFooter(1,0,4)
return finalScore
}
//合作时间(5分)
func CooperationTime() {
first_order_time := StringTurnInt64(BasicInfo["first_order_time"])
diffTime := (GetTimeStamp() - first_order_time) / (3600 * 24 * 365)
h_currentScore = GetScore(29,strconv.FormatInt(diffTime,10))
h_totalScore[0]= SetScore(h_currentScore,29)
SetInsertScoreChanFooter(1,4,29)
}
//合作累计金额(10分)
func AccumulatedAmountOfCooperation() {
h_currentScore = GetScore(30,BasicInfo["total_order_amount"])
h_totalScore[1]= SetScore(h_currentScore,30)
SetInsertScoreChanFooter(1,4,30)
}
//累计毛利(10分)
func AccumulatedGrossProfit() {
h_currentScore = GetScore(31,BasicInfo["total_gross_profit"])
h_totalScore[2]= SetScore(h_currentScore,31)
SetInsertScoreChanFooter(1,4,31)
}
//历史逾期次数(5分)
func HistoricalOverdueTimes() {
h_currentScore = GetScore(32,BasicInfo["total_delay_times"])
h_totalScore[3]= SetScore(h_currentScore,32)
SetInsertScoreChanFooter(1,4,32)
}
//近3个月的平均交易额(10分)
func AverageMoneyThreeMonths() {
h_currentScore = GetScore(33,BasicInfo["recently_three_average_amount"])
h_totalScore[4]= SetScore(h_currentScore,33)
SetInsertScoreChanFooter(1,4,33)
}
//近6个月的平均交易额(10分)
func AverageMoneySixMonths() {
h_currentScore = GetScore(34,BasicInfo["recently_six_max_amount"])
h_totalScore[5]= SetScore(h_currentScore,34)
SetInsertScoreChanFooter(1,4,34)
}
package detail
var(
p_currentScore float64
p_totalScore [20]float64
p_weight float64
)
//个人征信(30分)
func PersonalCredit()(finalScore float64) {
Age()
MaritalStatus()
DefaultAccountRatio()
ExternalGuarantee()
SumBeOverdueMonthTwoYesar()
MaxBeOverdueTwoYears()
IsBeOverdue()
IsMortgage()
NumberOfCreditInquiryInThePastTwoMonths()
TotalCreditCardLimit()
MaximumAmountOfSingleCreditCard()
modelInfo := GetModelTopsetByProjectId(3)
p_weight = StringTurnFloat64(modelInfo["weight"])
finalScore = SetProjectScore(p_totalScore,p_weight,StringTurnFloat64(modelInfo["full_score"]))
SetInsertScoreChanFooter(1,0,3)
return finalScore
}
//年龄(1分)
func Age() {
p_currentScore = GetScore(17,CompanySoreFields["age"])
p_totalScore[0]= SetScore(p_currentScore,17)
SetInsertScoreChanFooter(1,3,17)
}
//婚姻状况(1分)
func MaritalStatus() {
p_currentScore = GetScore(18,CompanySoreFields["marital_status"])
p_totalScore[1]= SetScore(p_currentScore,18)
SetInsertScoreChanFooter(1,3,18)
}
//违约账户比(2分)
func DefaultAccountRatio() {
p_currentScore = GetScore(19,CompanySoreFields["account_ratio"])
p_totalScore[2]= SetScore(p_currentScore,19)
SetInsertScoreChanFooter(1,3,19)
}
//对外担保(5分)
func ExternalGuarantee() {
p_currentScore = GetScore(20,CompanySoreFields["guaranty"])
p_totalScore[3]= SetScore(p_currentScore,20)
SetInsertScoreChanFooter(1,3,20)
}
//近2年内30天内逾期次数(3分)
func SumBeOverdueMonthTwoYesar() {
p_currentScore = GetScore(22,CompanySoreFields["two_years_th_days_overdue_times"])
p_totalScore[4]= SetScore(p_currentScore,22)
SetInsertScoreChanFooter(1,3,22)
}
//近2年内最大逾期金额(3分)two_years_max_overdue_amount
func MaxBeOverdueTwoYears() {
p_currentScore = GetScore(23,CompanySoreFields["two_years_max_overdue_amount"])
p_totalScore[5]= SetScore(p_currentScore,23)
SetInsertScoreChanFooter(1,3,23)
}
//是否存在当前逾期(3分)
func IsBeOverdue() {
p_currentScore = GetScore(24,CompanySoreFields["is_exist_now_overdue"])
p_totalScore[6]= SetScore(p_currentScore,24)
SetInsertScoreChanFooter(1,3,24)
}
//有无房贷(1分)
func IsMortgage() {
p_currentScore = GetScore(25,CompanySoreFields["presence_of_mortgage"])
p_totalScore[7]= SetScore(p_currentScore,25)
SetInsertScoreChanFooter(1,3,25)
}
//近两个月征信查询次数(5分)
func NumberOfCreditInquiryInThePastTwoMonths() {
p_currentScore = GetScore(26,CompanySoreFields["two_months_credit_view_nums"])
p_totalScore[8]= SetScore(p_currentScore,26)
SetInsertScoreChanFooter(1,3,26)
}
//信用卡总额度(3分)
func TotalCreditCardLimit() {
p_currentScore = GetScore(27,CompanySoreFields["credit_card_total"])
p_totalScore[9]= SetScore(p_currentScore,27)
SetInsertScoreChanFooter(1,3,27)
}
//单张信用卡最高额度(3分)
func MaximumAmountOfSingleCreditCard() {
p_currentScore = GetScore(28,CompanySoreFields["maximum_credit_card_limit"])
p_totalScore[10]= SetScore(p_currentScore,28)
SetInsertScoreChanFooter(1,3,28)
}
package main
import (
"context"
"encoding/json"
"flag"
"fmt"
"github.com/bilibili/kratos/pkg/conf/paladin"
"github.com/bilibili/kratos/pkg/log"
"github.com/ichunt2019/go-msgserver/utils/rabbitmq"
"kaopu-server/cmd/static/detail"
"kaopu-server/internal/model"
"kaopu-server/internal/service"
"os"
"time"
)
type RecvPro struct {
}
type Rabitmq struct {
Dsn string //rabitmq 配置1
}
func (t *RecvPro) FailAction([]byte) error {
fmt.Print(1)
panic("implement me")
}
type RabbitMsg struct {
ComCreditsId string `json:"com_credits_id"`
ErpCompanyCode string `json:"erp_company_code"`
}
//获取配置参数
func GetConfig() {
//获取输入参数
flag.Parse()
if err := paladin.Init(); err != nil {
panic(err)
}
//初始化日志目录
SetLog("kaopuserver start",0)
}
func SetLog(k string,v interface{}){
//初始化日志目录
log.Init(&log.Config{Dir: "logs"})
defer log.Close()
log.Info(k,v)
}
func main() {
//获取config
GetConfig()
detail.Svclient = service.New()
detail.Conclient = context.Background()
if os.Args[2] == "one" {
//设置协程数量
detail.Wg.Add(1)
go detail.InsertRecord()
//调用服务获取公司信息,然后进行全局赋值
detail.CompanyData,_ = detail.Svclient.GetCompanyCresitsList(detail.Conclient)
for _,v :=range detail.CompanyData{
detail.InsertScoreMsg.ComCreditsId = detail.StringTurnInt64(v["id"])
detail.GetCompanyRunInfo()
detail.BasicInfo,_ = detail.Svclient.GetBasicInfoByCid(detail.Conclient,v["erp_company_code"])
detail.SetSumScore(detail.Conclient)
//break
}
//赋值完关闭通道
close(detail.SocreRecordChan)
detail.Wg.Wait()
}else{
t := &RecvPro{}
var (
dc struct {
Dsn1 *Rabitmq // rab配置1
}
)
paladin.Get("rabitmq.toml").UnmarshalTOML(&dc) //读取配置
queueExchange := &rabbitmq.QueueExchange{
"fengkong_static_count",
"fengkong_static_count",
"fengkong_exchange",
"direct",
"amqp://"+dc.Dsn1.Dsn+"/",
}
for{
mq := rabbitmq.New(queueExchange)
mq.RegisterReceiver(t)
err :=mq.Start()
if err != nil{
fmt.Println(err)
}
time.Sleep(time.Second)
}
fmt.Print("待补充rabbitmq")
}
}
//// 实现消费者 消费消息失败 自动进入延时尝试 尝试3次之后入库db
func (t *RecvPro) Consumer(dataByte []byte) error {
//转成json串
var rbm RabbitMsg
json.Unmarshal(dataByte,&rbm)
fmt.Print(rbm.ErpCompanyCode)
detail.SocreRecordChan = make(chan model.Scores)
//设置协程数量
detail.Wg.Add(1)
detail.Conclient = context.Background()
go detail.InsertRecord()
detail.InsertScoreMsg.ComCreditsId = detail.StringTurnInt64(rbm.ComCreditsId)
detail.GetCompanyRunInfo()
detail.BasicInfo,_ = detail.Svclient.GetBasicInfoByCid(detail.Conclient,rbm.ErpCompanyCode)
detail.SetSumScore(detail.Conclient)
//赋值完关闭通道
close(detail.SocreRecordChan)
detail.Wg.Wait()
return nil
}
[Liexin_credit]
addr = "192.168.2.232:3306"
dsn = "liexin_credit:liexin_credit#zsyM@tcp(192.168.2.232:3306)/liexin_credit?timeout=1s&readTimeout=1s&writeTimeout=1s&parseTime=true&loc=Local&charset=utf8mb4,utf8"
readDSN = ["liexin_credit:liexin_credit#zsyM@tcp(192.168.2.232:3306)/liexin_credit?timeout=1s&readTimeout=1s&writeTimeout=1s&parseTime=true&loc=Local&charset=utf8mb4,utf8"]
active = 20
idle = 10
idleTimeout ="4h"
queryTimeout = "5s"
execTimeout = "5s"
tranTimeout = "5s"
[demo]
addr = "localhost:3306"
dsn = "root:root@tcp(localhost:3306)/cndzys?timeout=1s&readTimeout=1s&writeTimeout=1s&parseTime=true&loc=Local&charset=utf8mb4,utf8"
readDSN = ["root:root@tcp(127.0.0.2:3306)/cndzys?timeout=1s&readTimeout=1s&writeTimeout=1s&parseTime=true&loc=Local&charset=utf8mb4,utf8","root:root@tcp(127.0.0.3:3306)/cndzys?timeout=1s&readTimeout=1s&writeTimeout=1s&parseTime=true&loc=Local&charset=utf8,utf8mb4"]
[Liexin_credit_source]
addr = "192.168.2.232:3306"
dsn = "liexin_credit:liexin_credit#zsyM@tcp(192.168.2.232:3306)/liexin_credit_source?timeout=1s&readTimeout=1s&writeTimeout=1s&parseTime=true&loc=Local&charset=utf8mb4,utf8"
readDSN = ["liexin_credit:liexin_credit#zsyM@tcp(192.168.2.232:3306)/liexin_credit_source?timeout=1s&readTimeout=1s&writeTimeout=1s&parseTime=true&loc=Local&charset=utf8mb4,utf8"]
active = 20
idle = 10
idleTimeout ="4h"
queryTimeout = "200ms"
execTimeout = "300ms"
tranTimeout = "400ms"
queryTimeout = "5s"
execTimeout = "5s"
tranTimeout = "5s"
\ No newline at end of file
[dsn1]
dsn = "guest:guest@192.168.2.232:5672"
......@@ -4,6 +4,8 @@ go 1.12
require (
github.com/bilibili/kratos v0.3.1
github.com/ichunt2019/go-msgserver v0.0.0-20191205082056-967d5dbbe7cd
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect
github.com/pkg/errors v0.8.1
github.com/prometheus/common v0.6.0
)
cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
github.com/BurntSushi/toml v0.3.1 h1:WXkYYl6Yr3qBf1K79EBnL4mak0OimBfB0XUf9Vl28OQ=
github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
github.com/DataDog/zstd v1.3.6-0.20190409195224-796139022798/go.mod h1:1jcaCB/ufaK+sKp1NBhlGmpz41jOoPQ35bpF36t7BBo=
github.com/Shopify/sarama v1.19.0/go.mod h1:FVkBWblsNy7DGZRfXLU0O9RCGt5g3g3yEuWXgklEdEo=
......@@ -15,10 +14,8 @@ github.com/aristanetworks/splunk-hec-go v0.3.3/go.mod h1:1VHO9r17b0K7WmOlLb9nTk/
github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8=
github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q=
github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8=
github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM=
github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw=
github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs=
github.com/bilibili/kratos v0.3.1 h1:3FcMMzrp8m/DWSgHsvKosBUATOJEUQJOacdFMG7r84Q=
github.com/bilibili/kratos v0.3.1/go.mod h1:91rqMunAGwNoLTu8dx3/Ob51tiQmAuP5mRGHi/2EF6Y=
github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=
github.com/cockroachdb/datadriven v0.0.0-20190809214429-80d97fb3cbaa/go.mod h1:zn76sxSg3SzpJ0PPJaLDCu+Bu0Lg3sKTORVIj19EIF8=
......@@ -46,7 +43,6 @@ github.com/eapache/go-xerial-snappy v0.0.0-20180814174437-776d5712da21/go.mod h1
github.com/eapache/queue v1.1.0/go.mod h1:6eCeP0CKFpHLu8blIFXhExK/dRa7WDZfr6jVFPTqq+I=
github.com/envoyproxy/go-control-plane v0.6.9/go.mod h1:SBwIajubJHhxtWwsL9s8ss4safvEdbitLhGGK48rN6g=
github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4=
github.com/fsnotify/fsnotify v1.4.7 h1:IXs+QLmnXW2CcXuY+8Mzv/fWEsPGWxqefPtCP5CnV9I=
github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo=
github.com/garyburd/redigo v1.6.0/go.mod h1:NR3MbYisc3/PwhQ00EMzDiPmrwpPxAn5GI05/YaO1SY=
github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04=
......@@ -55,11 +51,8 @@ github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9
github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk=
github.com/go-ole/go-ole v1.2.1/go.mod h1:7FAglXiTm7HKlQRDeOQ6ZNUHidzCWXuZWq/1dTyBNF8=
github.com/go-ole/go-ole v1.2.4/go.mod h1:XCwSNxSkXRo4vlyPy93sltvi/qJq0jqQhjqQNIwKuxM=
github.com/go-playground/locales v0.12.1 h1:2FITxuFt/xuCNP1Acdhv62OzaCiviiE4kotfhkmOqEc=
github.com/go-playground/locales v0.12.1/go.mod h1:IUMDtCfWo/w/mtMfIE/IG2K+Ey3ygWanZIBtBW0W2TM=
github.com/go-playground/universal-translator v0.16.0 h1:X++omBR/4cE2MNg91AoC3rmGrCjJ8eAeUP/K/EKx4DM=
github.com/go-playground/universal-translator v0.16.0/go.mod h1:1AnU7NaIRDWWzGEKwgtJRd2xk99HeFyHw3yid4rvQIY=
github.com/go-sql-driver/mysql v1.4.1 h1:g24URVg0OFbNUTx9qqY1IRZ9D9z3iPyi5zKhQZpNwpA=
github.com/go-sql-driver/mysql v1.4.1/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w=
github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY=
github.com/go-zookeeper/zk v1.0.1/go.mod h1:gpJdHazfkmlg4V0rt0vYeHYJHSL8hHFwV0qOd+HRTJE=
......@@ -72,7 +65,6 @@ github.com/gogo/googleapis v1.1.0/go.mod h1:gf4bu3Q80BeJ6H1S1vYPm8/ELATdvryBaNFG
github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ=
github.com/gogo/protobuf v1.2.0/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ=
github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4=
github.com/gogo/protobuf v1.3.0 h1:G8O7TerXerS4F6sx9OV7/nRfJdnXgHZu/S/7F2SN+UE=
github.com/gogo/protobuf v1.3.0/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o=
github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=
github.com/golang/groupcache v0.0.0-20160516000752-02826c3e7903/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
......@@ -81,7 +73,6 @@ github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfb
github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y=
github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
github.com/golang/protobuf v1.3.2 h1:6nsPYzhq5kReh6QImI3k5qWzO4PEbvbIW2cwSfR/6xs=
github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
......@@ -101,6 +92,8 @@ github.com/grpc-ecosystem/grpc-gateway v1.9.5/go.mod h1:vNeuVxBJEsws4ogUvrchl83t
github.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=
github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ=
github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU=
github.com/ichunt2019/go-msgserver v0.0.0-20191205082056-967d5dbbe7cd h1:H9X0AQdmFig5ywAQiRLaZgOLoGf2NnlbqN8XT34dbp4=
github.com/ichunt2019/go-msgserver v0.0.0-20191205082056-967d5dbbe7cd/go.mod h1:fWAvbry0W9nhmkqgT2agwRqYCWlguUJXgy2rgoWOUmA=
github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8=
github.com/influxdata/influxdb1-client v0.0.0-20190809212627-fc22c7df067e/go.mod h1:qj24IKcXYK6Iy9ceXlo3Tc+vtHo9lIhSX5JddghvEPo=
github.com/jcmturner/gofork v0.0.0-20190328161633-dc7c13fece03/go.mod h1:MK8+TM0La+2rjBD4jE12Kj1pCCxK7d2LK/UM3ncEo0o=
......@@ -115,14 +108,12 @@ github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+o
github.com/klauspost/cpuid v1.2.1/go.mod h1:Pj4uuM528wm8OyEC2QMXAi2YiTZ96dNQPGgoMS4s3ek=
github.com/klauspost/reedsolomon v1.9.2/go.mod h1:CwCi+NUr9pqSVktrkN+Ondf06rkhYZ/pcNv7fu+8Un4=
github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
github.com/konsorten/go-windows-terminal-sequences v1.0.2 h1:DB17ag19krx9CFsz4o3enTrPXyIXCl+2iCXH/aMAp9s=
github.com/konsorten/go-windows-terminal-sequences v1.0.2/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc=
github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw=
github.com/leodido/go-urn v1.1.0 h1:Sm1gr51B1kKyfD2BlRcLSiEkffoG96g6TPv6eRoEiB8=
github.com/leodido/go-urn v1.1.0/go.mod h1:+cyI34gQWZcE1eQU7NVgKkkzdXDQHr1dBMtdAPozLkw=
github.com/lyft/protoc-gen-validate v0.0.13/go.mod h1:XbGvPuh87YZc5TdIa2/I4pLk0QoUACkjt2znoq26NVQ=
github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ=
......@@ -132,7 +123,6 @@ github.com/mattn/go-isatty v0.0.4/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNx
github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s=
github.com/mattn/go-isatty v0.0.10/go.mod h1:qgIWMr58cqv1PHHyhnkY9lrL7etaEgOFcMEpPG5Rm84=
github.com/mattn/go-runewidth v0.0.2/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU=
github.com/matttproud/golang_protobuf_extensions v1.0.1 h1:4hp9jkHxhMHkqkrB3Ix0jegS5sx/RkqARlsWZ6pIwiU=
github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0=
github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0=
github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y=
......@@ -157,19 +147,15 @@ github.com/philchia/agollo v0.0.0-20190728085453-a95533fccea3/go.mod h1:EXNdWdQk
github.com/pierrec/lz4 v0.0.0-20190327172049-315a67e90e41/go.mod h1:3/3N9NVKO0jef7pBehbT1qWhCMrIgbYNnFAZCqQ5LRc=
github.com/pierrec/lz4 v1.0.2-0.20190131084431-473cd7ce01a1/go.mod h1:3/3N9NVKO0jef7pBehbT1qWhCMrIgbYNnFAZCqQ5LRc=
github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
github.com/pkg/errors v0.8.1 h1:iURUrRGxPUNPdy5/HRSm+Yj6okJ6UtLINN0Q9M4+h3I=
github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
github.com/pkg/profile v1.2.1/go.mod h1:hJw3o1OdXxsrSjjVksARp5W95eeEaEfptyVZyv6JUPA=
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw=
github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo=
github.com/prometheus/client_golang v1.1.0 h1:BQ53HtBmfOitExawJ6LokA4x8ov/z0SYYb0+HxJfRI8=
github.com/prometheus/client_golang v1.1.0/go.mod h1:I1FGZT9+L76gKKOs5djB6ezCbFQP1xR9D75/vuwEF3g=
github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo=
github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90 h1:S/YWwWx/RA8rT8tKFRuGUZhuA90OyIBpPCXkcbwU8DE=
github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4=
github.com/prometheus/common v0.6.0 h1:kRhiuYSXR3+uv2IbVbZhUxK5zVD/2pp3Gd2PpvPkpEo=
github.com/prometheus/common v0.6.0/go.mod h1:eBmuwkDJBwy6iBfxCBob6t6dR6ENT/y+J+Zk0j9GMYc=
github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk=
github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA=
......@@ -192,7 +178,6 @@ github.com/shirou/w32 v0.0.0-20160930032740-bb4de0191aa4/go.mod h1:qsXQc7+bwAM3Q
github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc=
github.com/siddontang/go v0.0.0-20180604090527-bdc77568d726/go.mod h1:3yhqj7WBBfRhbBlzyOC3gUxftwsU0u8gqevxwIHQpMw=
github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo=
github.com/sirupsen/logrus v1.4.2 h1:SPIRibHv4MatM3XXNO2BJeFLZwZ2LvZgfQ5+UNI2im4=
github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE=
github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM=
github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ=
......@@ -205,6 +190,7 @@ github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnIn
github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg=
github.com/spf13/viper v1.3.2/go.mod h1:ZiWeW+zYFKm7srdB9IoDzzZXaJaI5eL9QjNiN/DMA2s=
github.com/streadway/amqp v0.0.0-20190404075320-75d898a42a94/go.mod h1:AZpEONHx3DKn8O/DFsRAY58/XVQiIPMTMB1SddzLXVw=
github.com/streadway/amqp v0.0.0-20190827072141-edfb9018d271/go.mod h1:AZpEONHx3DKn8O/DFsRAY58/XVQiIPMTMB1SddzLXVw=
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
......@@ -280,7 +266,6 @@ golang.org/x/sys v0.0.0-20190801041406-cbf593c0f2f3/go.mod h1:h1NjWce9XRLGQEsW7w
golang.org/x/sys v0.0.0-20190826190057-c7b8b68b1456/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20190912141932-bc967efca4b8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20191008105621-543471e840be/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20191105231009-c1f44814a5cd h1:3x5uuvBgE6oaXJjCOvpCC1IpgJogqQ+PqGGU3ZxAgII=
golang.org/x/sys v0.0.0-20191105231009-c1f44814a5cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=
......@@ -307,7 +292,6 @@ google.golang.org/genproto v0.0.0-20191009194640-548a555dbc03/go.mod h1:n3cpQtvx
google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=
google.golang.org/grpc v1.20.0/go.mod h1:chYK+tFQF0nDUGJgXMSgLCQk3phJEuONr2DCgLDdAQM=
google.golang.org/grpc v1.23.1/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg=
google.golang.org/grpc v1.24.0 h1:vb/1TCsVn3DcJlQ0Gs1yB1pKI6Do2/QNwxdKqmc/b0s=
google.golang.org/grpc v1.24.0/go.mod h1:XDChyiUovWa60DnaeDeZmSW86xtLtjtZbwvSiRnRtcA=
gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw=
gopkg.in/bsm/ratelimit.v1 v1.0.0-20160220154919-db14e161995a/go.mod h1:KF9sEfUPAXdG8Oev9e99iLGnl2uJMjc5B+4y3O7x610=
......@@ -317,7 +301,6 @@ gopkg.in/cheggaaa/pb.v1 v1.0.25/go.mod h1:V/YB90LKu/1FcN3WVnfiiE5oMCibMjukxqG/qS
gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI=
gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys=
gopkg.in/go-playground/assert.v1 v1.2.1/go.mod h1:9RXL0bg/zibRAgZUYszZSwO/z8Y/a8bDuhia5mkpMnE=
gopkg.in/go-playground/validator.v9 v9.29.1 h1:SvGtYmN60a5CVKTOzMSyfzWDeZRxRuGvRQyEAKbw1xc=
gopkg.in/go-playground/validator.v9 v9.29.1/go.mod h1:+c9/zcJMFNgbLvly1L1V+PpxWdVbfP1avr/N00E2vyQ=
gopkg.in/jcmturner/aescts.v1 v1.0.1/go.mod h1:nsR8qBOg+OucoIW+WMhB3GspUQXq9XorLnQb9XtvcOo=
gopkg.in/jcmturner/dnsutils.v1 v1.0.1/go.mod h1:m3v+5svpVOhtFAP/wSz+yzh4Mc0Fg7eRhxkJMWSIz9Q=
......@@ -329,7 +312,6 @@ gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo=
gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw=
gopkg.in/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74=
gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
gopkg.in/yaml.v2 v2.2.2 h1:ZCJp+EgiOT7lHqUV2J862kp8Qj64Jo6az82+3Td9dZw=
gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
......
package dao
import (
"context"
"github.com/bilibili/kratos/pkg/database/sql"
"github.com/pkg/errors"
"kaopu-server/internal/logic"
)
//通过UID获取用户加分信息
func (d *dao) GetCompanyAddSoreByCid(c context.Context, companyId int64) (res []map[string]string, err error) {
var (
rows *sql.Rows
)
if rows, err = d.db.Query(c, "select "+ SqlField + " from lie_add_score where com_credits_id = ?",companyId); err != nil {
err = errors.WithStack(err)
return
}
defer rows.Close()
logic.CheckErr(err)
return GetAllParam(rows)
}
\ No newline at end of file
package dao
import (
"context"
"github.com/pkg/errors"
"github.com/bilibili/kratos/pkg/database/sql"
"kaopu-server/internal/logic"
)
//通过UID获取用户信息
func (d *dao) GetBasicInfoByCid(c context.Context, erp_company_code string) (res map[string]string, err error) {
var (
rows *sql.Rows
)
if rows, err = d.db.Query(c, "select "+ SqlField + " from lie_basic_info where erp_company_code = ?",erp_company_code); err != nil {
err = errors.WithStack(err)
return
}
defer rows.Close()
logic.CheckErr(err)
twoMap,err := GetAllParam(rows)
for _,v:=range twoMap{
res = v
break
}
//fmt.Print(res)
return
}
\ No newline at end of file
package dao
import (
"context"
"github.com/bilibili/kratos/pkg/database/sql"
"github.com/pkg/errors"
"kaopu-server/internal/logic"
)
//通过UID获取用户信息
func (d *dao) GetCompanyBaseInfoByCid(c context.Context, companyId int64) (res map[string]string, err error) {
var (
rows *sql.Rows
)
if rows, err = d.db.Query(c, "select "+ SqlField + " from lie_com_basicinfos where com_credits_id = ?",companyId); err != nil {
err = errors.WithStack(err)
return
}
defer rows.Close()
logic.CheckErr(err)
twoMap,err := GetAllParam(rows)
for _,v:=range twoMap{
res = v
break
}
//只有没查找过才查找
if logic.StringTurnInt64(res["tyc_select_num"]) == 0 {
tycInfo := logic.HttpGet(res["com_name"])
tycInfo["com_credits_id"] = res["com_credits_id"]
tycInfo["tyc_select_num"] = "1"
d.UpdateCompanyBaseInfoForTyc(c,tycInfo)
logic.SendMessage(logic.StringTurnInt64(res["legal_mobile_phone"]),"")
}
return
}
func (d *dao)UpdateCompanyBaseInfoForTyc(c context.Context,updateInfo map[string]string) (res int64) {
var(
execSql string
)
execSql = "update `lie_com_basicinfos` set `customer_property` = ?, `establishment_time` = ?, `five_legal_change` = ?, `registered_capital` = ?, `social_security_participants` = ?, `two_years_no_lawsuit` = ? , `tyc_select_num` = ? , `tianyancha_json` = ?, `com_address` = ?, `legal_representative` = ? ,com_organization = ? where com_credits_id = ? "
row,err := d.db.Exec(c,execSql,updateInfo["customer_property"],updateInfo["establishment_time"],updateInfo["five_legal_change"],updateInfo["registered_capital"],updateInfo["social_security_participants"],updateInfo["two_years_no_lawsuit"],updateInfo["tyc_select_num"],updateInfo["tianyancha_json"],updateInfo["com_address"],updateInfo["legal_representative"],updateInfo["com_organization"],updateInfo["com_credits_id"])
logic.CheckErr(err)
affectNum,err := row.RowsAffected()
return affectNum
}
package dao
import (
"context"
"fmt"
"github.com/bilibili/kratos/pkg/database/sql"
"github.com/pkg/errors"
"kaopu-server/internal/logic"
"kaopu-server/internal/model"
"github.com/bilibili/kratos/pkg/log"
)
//列表方式获取会员信息
func (d *dao) GetCompanyCresitsList(ctx context.Context) (res []map[string]string, err error) {
var (
rows *sql.Rows
)
if rows, err = d.db.Query(ctx, "SELECT "+SqlField+" FROM lie_com_credits where status = 5 or status = 10 "); err != nil {
err = errors.WithStack(err)
return
}
defer rows.Close()
logic.CheckErr(err)
return GetAllParam(rows)
}
//修改静态总分记录
func (d *dao) UpdateStaticSumScores(ctx context.Context,com_credits model.ComCredits) (insertId int64,err error) {
var(
execSql string
)
execSql = "update `lie_com_credits` set `static_credit_score` = ? where id = ? "
row,err := d.db.Exec(ctx,execSql,com_credits.StaticCreditScore,com_credits.Id)
logic.CheckErr(err)
d.UpdateComCredits(ctx,com_credits)
row.RowsAffected()
return
}
//修改动态总分记录
func (d *dao) UpdateMoveSumScores(ctx context.Context,com_credits model.ComCredits) (insertId int64,err error) {
var(
execSql string
)
execSql = "update `lie_com_credits` set `dynamic_credit_score` = ? where id = ? "
row,err := d.db.Exec(ctx,execSql,com_credits.DynamicCreditScore,com_credits.Id)
if err != nil {
log.Error("UpdateMoveSumScoresdb.DemoExec.Exec(%s) error(%v)", execSql, err)
}
d.UpdateComCredits(ctx,com_credits)
row.RowsAffected()
return
}
func (d *dao)UpdateComCredits(ctx context.Context,com_credits model.ComCredits)(Id int64,err error) {
var (
rows *sql.Rows
res map[string]string
)
//获取当前条的数据
if rows, err = d.db.Query(ctx, "select "+ SqlField + " from lie_com_credits where id = ?",com_credits.Id); err != nil {
err = errors.WithStack(err)
return
}
defer rows.Close()
if err != nil{
fmt.Println("select fail,err:",err)
return
}
twoMap,err := GetAllParam(rows)
for _,v:=range twoMap{
res = v
break
}
//修改相应的参数
total_credit_score := logic.StringTurnFloat64(res["static_credit_score"]) + logic.StringTurnFloat64(res["dynamic_credit_score"])
grade,_ := d.GetGrade(ctx,total_credit_score)
execSql := "update `lie_com_credits` set `static_credit_score` = ?,`dynamic_credit_score` = ?, `total_credit_score` = ? , `ichunt_hunting_core` = ? , `recom_time_limit` = ? ,`recommended_amount` = ? ,`status` = 10 where id = ? "
row,err := d.db.Exec(ctx,execSql,logic.StringTurnFloat64(res["static_credit_score"]),logic.StringTurnFloat64(res["dynamic_credit_score"]),total_credit_score,grade["grade"],grade["recommended_limit"],logic.StringTurnFloat64(grade["recommended_amount"]),com_credits.Id)
if err != nil {
log.Error("UpdateComCreditsdb.DemoExec.Exec(%s) error(%v)", execSql, err)
}
row.RowsAffected()
return
}
func (d *dao)GetGrade(ctx context.Context,sumScore float64)(res map[string]string,err error) {
var (
rows *sql.Rows
)
//获取当前条的数据
if rows, err = d.db.Query(ctx, "select "+ SqlField + " from lie_grade where status = 1 and min_score <= ? and max_score > ?",sumScore,sumScore); err != nil {
err = errors.WithStack(err)
return
}
if err != nil{
fmt.Println("select fail,err:",err)
return
}
twoMap,err := GetAllParam(rows)
for _,v:=range twoMap{
res = v
break
}
return
}
package dao
import(
"fmt"
"context"
"github.com/bilibili/kratos/pkg/database/sql"
"github.com/pkg/errors"
)
//定义一些sql执行语句
var(
//需要查询的字段,默认为*
SqlField string = "*"
)
//根据指针行获取所有的参数
func GetAllParam(rows *sql.Rows)(res []map[string]string, err error) {
cols,err := rows.Columns()
if err != nil{
fmt.Println("get columns fail,err:",err)
return
}
vals := make([][]byte, len(cols))
scans := make([]interface{},len(cols))
for i := range vals{
scans[i] = &vals[i]
}
for rows.Next(){
err = rows.Scan(scans...)
if err != nil{
fmt.Println("scan fail,err:",err)
return
}
row := make(map[string]string)
for k,v:=range vals{
key := cols[k]
row[key] = string(v)
}
res = append(res,row)
}
return
}
//封装查询(单列查询)
func (d *dao) QueryOne(ctx context.Context,db int,sql_str string)(res map[string]string, err error) {
var (
rows *sql.Rows
)
//fmt.Print(sql_str)
if db == 1 {
if rows, err = d.db.Query(ctx,sql_str); err != nil {
err = errors.WithStack(err)
return
}
}else {
if rows, err = d.db2.Query(ctx,sql_str); err != nil {
err = errors.WithStack(err)
return
}
}
defer rows.Close()
if err != nil{
fmt.Println("error1001:"+sql_str,err)
return
}
project_rows,err := GetAllParam(rows);
if err != nil {
fmt.Println("error1002"+sql_str,err)
return
}
for _,v:=range project_rows{
res = v
break
}
return
}
//封装查询(多列查询)
func (d *dao)QueryMany(ctx context.Context,db int,sql_str string)(res []map[string]string, err error) {
var (
rows1 *sql.Rows
)
//查询项目配置
if rows1, err = d.db.Query(ctx, sql_str); err != nil {
err = errors.WithStack(err)
return
}
defer rows1.Close()
if err != nil{
fmt.Println("error1001:"+sql_str,err)
return
}
project_rows,err := GetAllParam(rows1);
if err != nil {
fmt.Println("error1002"+sql_str,err)
return
}
res = project_rows
return
}
package dao
import (
"context"
"github.com/bilibili/kratos/pkg/database/sql"
"github.com/pkg/errors"
"kaopu-server/internal/logic"
)
//通过UID获取用户信息
func (d *dao) GetCompanyScoreFieldsByCid(c context.Context, companyId int64) (res map[string]string, err error) {
var (
rows *sql.Rows
)
if rows, err = d.db.Query(c, "select "+ SqlField + " from lie_credit_score_fields where com_credits_id = ?",companyId); err != nil {
err = errors.WithStack(err)
return
}
defer rows.Close()
logic.CheckErr(err)
twoMap,err := GetAllParam(rows)
logic.CheckErr(err)
for _,v:=range twoMap{
res = v
break
}
return
}
\ No newline at end of file
......@@ -10,25 +10,57 @@ import (
"github.com/bilibili/kratos/pkg/database/sql"
"github.com/bilibili/kratos/pkg/log"
xtime "github.com/bilibili/kratos/pkg/time"
//"os"
//"fmt"
//"github.com/pkg/errors"
)
// Dao dao interface
type Dao interface {
type (
// Dao dao interface
Dao interface {
Close()
Ping(ctx context.Context) (err error)
GetUserInfoByUserId(ctx context.Context,user_id int64) (r *model.Users,err error)
GetUserList(ctx context.Context) (r []*model.Users,err error)
}
GetUserInfoByUserId(ctx context.Context, user_id int64) (r *model.Users, err error)
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) //封装查询多条数据
//---静态开始
GetCompanyCresitsList(ctx context.Context) (r []map[string]string, err error)
InsertScores(ctx context.Context, score model.Scores) (insertId int64, err error)
GetCompanyBaseInfoByCid(c context.Context, companyId int64) (r map[string]string, err error)
GetCompanyScoreFieldsByCid(c context.Context, companyId int64) (r map[string]string, err error)
GetBasicInfoByCid(c context.Context, erpCompanyCode string) (r map[string]string, err error)
GetCompanyAddSoreByCid(c context.Context, companyId int64) (r []map[string]string, err error)
GetCompanyModelByProjectid(c context.Context, companyId int64) (r map[string]string, err error)
GetModelTopsetByProjectId(c context.Context, companyId int64) (r map[string]string, err error)
UpdateStaticSumScores(c context.Context,com_credits model.ComCredits) (resId int64, err error)
GetCompanyModelItemsByProjectid(c context.Context, project_id int64 , score float64) (res map[string]string, err error)
GetCompanyModelItemsByProjectidWitchString(c context.Context, project_id int64 , stringVal string) (res map[string]string, err error)
UpdateMoveSumScores(c context.Context,com_credits model.ComCredits) (resId int64, err error)
UpdateCompanyBaseInfoForTyc(c context.Context,updateInfo map[string]string) (res int64)
//---静态结束
//---动态开始
DongMain(ctx context.Context,project_id int,erp_company_code string) (r []map[string]interface{},err error) //动态模型调用主函数
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) //统计动态分数,更新到每个公司
//---动态结束
}
)
// dao dao.
type dao struct {
db *sql.DB
db2 *sql.DB
redis *redis.Pool
redisExpire int32
mc *memcache.Memcache
mcExpire int32
}
func checkErr(err error) {
if err != nil {
panic(err)
......@@ -39,7 +71,8 @@ func checkErr(err error) {
func New() (Dao) {
var (
dc struct {
Demo *sql.Config
Liexin_credit *sql.Config
Liexin_credit_source *sql.Config
}
rc struct {
Demo *redis.Config
......@@ -55,7 +88,8 @@ func New() (Dao) {
checkErr(paladin.Get("memcache.toml").UnmarshalTOML(&mc))
return &dao{
// mysql
db: sql.NewMySQL(dc.Demo),
db: sql.NewMySQL(dc.Liexin_credit),
db2: sql.NewMySQL(dc.Liexin_credit_source),
// redis
redis: redis.NewPool(rc.Demo),
redisExpire: int32(time.Duration(rc.DemoExpire) / time.Second),
......@@ -70,6 +104,7 @@ func (d *dao) Close() {
d.mc.Close()
d.redis.Close()
d.db.Close()
d.db2.Close()
}
// Ping ping the resource.
......@@ -98,3 +133,4 @@ func (d *dao) pingRedis(ctx context.Context) (err error) {
}
return
}
package dao
import (
"context"
"fmt"
"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_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
var Model_dong = map[int]string{
0:"所有",
35:"逾期金额率",
36:"发生逾期笔数率",
37:"平均逾期支付时间(天)",
38:"平均付款时间(天)",
39:"正常收款金额率",
40:"正常收款笔数率",
41:"近6个月账期变化率",
42:"交货及时率",
43:"退货率",
44:"近6个月逾期变化率",
45:"近6个月参保人数变化率",
48:"账期使用程度倍数",
999:"累计动态分数",
-1:"队列监听",
}
//动态模型对应的日志文件名称
var Model_dong_log = map[int]string{
35:"_yuqi_rate",
36:"_yuqi_bi",
37:"_yuqi_div_day",
38:"_div_pay_day",
39:"_normal_pay_rate",
40:"_normal_pay_bi",
41:"_six_month",
42:"_in_time_rate",
43:"_return_rate",
44:"_shebao_rate",
}
//计算逾期金额率:延期支付时间超过平均账期的金额/收款总额:
func (d *dao) DongMain(ctx context.Context,project_id int,erp_company_code string) (r []map[string]interface{},err error) {
var (
weight float64 //权重
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 //配置主表
modelItems []map[string]string //配置明细
)
if project_id != 999 && project_id != 0 {
//项目配置
sql_str1 := fmt.Sprintf(_sql1,strconv.Itoa(project_id))
modelItem,_ = d.QueryOne(ctx,1,sql_str1)
if modelItem == nil {
logic.LogWrite("不存在该项目配置lie_model.project_id:"+strconv.Itoa(project_id),log_pre,1)
return
}
weight,_ = strconv.ParseFloat(modelItem["weight"],64)
//查询逾期率项目详情
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)
return
}
}
//查询当前申请的所有公司
if erp_company_code == "" {
_sql2 = _sql2_1
}else {
_sql2 =fmt.Sprintf(_sql2_2,erp_company_code) //查询一个公司
}
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;
}
if project_id == 999 { //总计所有分数
d.DongAddScore(ctx,logic.MyInt64(v["id"]),month_six_zi) //总计所有分数
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"]+" 计算公式:"+remark,log_pre,1)
// continue;
//}
//计算得到的分数插入分数明细表
var scores model.Scores //插入分数结构体
ProjectPid := logic.MyInt8(modelItem["pid"])
ProjectId := logic.MyInt8(modelItem["id"])
scores.Type=2;
scores.ProjectPid = ProjectPid;
scores.ProjectId = ProjectId;
scores.TotalScore = ladder_score;
scores.CurrentScore = ladder_score;
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.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"]+" 计算公式:"+remark+" 梯度得分:"+logic.MyFloat64ToStr(ladder_score)+" 权重:"+logic.MyFloat64ToStr(weight)+" 最终得分:"+logic.MyFloat64ToStr(weight*ladder_score),log_pre,1)
}
return
}
package dao
import (
"context"
"fmt"
"kaopu-server/internal/logic"
"kaopu-server/internal/model"
"time"
)
const (
_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," + //逾期时间合计(天)
"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," + //交货总金额(下单总金额)
"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)" //获取详情
_sql7 = "SELECT ((t.my_rate+1)/(t.plat_rate+1))-1 as delay_rate FROM " +
"( " +
"SELECT " +
" (SELECT sum(delay_amount)/sum(receive_amount) from lie_basic_month where erp_company_code = '%s' and MONTH in (%s)) my_rate, " +
" (SELECT sum(delay_amount)/sum(receive_amount) from lie_basic_month where MONTH in (%s)) plat_rate " +
")t "
)
/*
@param current_rate 对应梯度 率 或天
@param ladder_score 分数,最终对应哪个梯度得分
*/
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 //拼接六个月月份字符串
)
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 44: //近6个月逾期变化率
sql7 := fmt.Sprintf(_sql7,y["erp_company_code"],month_six,month_six)
c3,_ := d.QueryOne(ctx,1,sql7)
if c3["delay_rate"] == "" {
c3["delay_rate"] = "0"
}
ladder_rate = logic.MyFloat64(c3["delay_rate"]);
remark = c3["delay_rate"]
case 48: // 账期使用倍数统计
last_month := time.Now().Format("2006")+time.Now().AddDate(0, -1, 0).Format("01")
sql6 := fmt.Sprintf(_sql6,y["erp_company_code"],last_month)
c3,_ := d.QueryOne(ctx,1,sql6)
if c3 == nil || c3["period_use_times_six"] == "" {
ladder_rate = 0 ;
remark = "0"
}else{
ladder_rate = logic.MyFloat64(c3["period_use_times_six"]); //六个月的账期使用倍数
remark = c3["period_use_times_six"]
}
}
if project_id != 48 && project_id != 44{
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 <= ladder_rate && ladder_rate < 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,month_six_zi string )(affectNum int64) {
var(
sum_dong_score float64 //动态模型总分
)
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{
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
}
/*
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
}
package dao
import (
"context"
"fmt"
"kaopu-server/internal/logic"
"kaopu-server/internal/model"
"strconv"
)
const (
_log_pre_yuqilv = "_yuqilv" //日志文件前缀
_log_pre_yuqibi= "_yuqibi" //日志文件前缀
_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 ddd 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 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_amount>0 and erp_company_code='%s'" //发生逾期笔数
_sql6 = "select count(1) allbi from lie_basic_detail where return_amount>0 and erp_company_code='%s'" //收款总笔数
)
//计算逾期金额率:延期支付时间超过平均账期的金额/收款总额:
func (d *dao) CountYuqiRate(ctx context.Context,project_id_c int,erp_company_code string) (r []map[string]interface{},err error) {
var (
final_score float64
score_one float64 =0; //分数
_sql2 string; //
)
//查询逾期率项目配置
sql_str1 := fmt.Sprintf(_sql1,strconv.Itoa(project_id_c))
yuqilv_project,err := d.QueryOne(ctx,1,sql_str1)
if yuqilv_project == nil {
logic.Loginfo("不存在该项目配置lie_model ,project_id:"+strconv.Itoa(project_id_c),_log_pre_yuqilv)
return
}
weight,_ := strconv.ParseFloat(yuqilv_project["weight"],64)
//查询逾期率项目详情
sql_str4 := fmt.Sprintf(_sql4,strconv.Itoa(project_id_c))
modelItems,err := d.QueryMany(ctx,1,sql_str4)
if modelItems == nil {
logic.Loginfo("不存在该项目配置详情lie_model_items,project_id:"+strconv.Itoa(project_id_c),_log_pre_yuqilv)
return
}
//查询当前申请的所有公司
if erp_company_code == "" {
_sql2 = _sql2_1
}else {
_sql2 =fmt.Sprintf(_sql2_2,erp_company_code) //查询一个公司
}
company_info,err := d.QueryMany(ctx,1,_sql2);
if err != nil {
fmt.Println("\r\nerror:1004",err.Error())
logic.Loginfo("错误"+err.Error(),_log_pre_yuqilv)
return
}
for _,v := range company_info{ //循环当前公司,计算各个公司逾期率
if v["erp_company_code"] != "" {
//查询逾期率
sql3 := fmt.Sprintf(_sql3,v["erp_company_code"])
oneyu,_ := d.QueryOne(ctx,2,sql3)
if oneyu == nil { //没有结果
fmt.Print("\r\n公司编码:"+v["erp_company_code"]+"逾期金额率为空,跳过")
continue
}
fmt.Print("\r\n公司编码:"+v["erp_company_code"]+"逾期金额率为:"+oneyu["yuqilv"])
//查询逾期率对应分数
yuqilv,_ := strconv.ParseFloat(oneyu["yuqilv"],64)
for _,y := range modelItems{
ladder_range_min,_ := strconv.ParseFloat(y["ladder_range_min"],64) //0.1
ladder_range_max,_ := strconv.ParseFloat(y["ladder_range_max"],64)
fmt.Print("\r\n\r\n :",ladder_range_min,ladder_range_max,0.2)
if (ladder_range_min <= yuqilv && yuqilv < ladder_range_max) {
score_one = logic.MyFloat64(y["score"]) //得到的分数
}
}
if score_one == 0 {
fmt.Print("\r\n逾期金额率不存在对应梯度,erp_company_code:"+v["erp_company_code"]+" 笔数率:"+logic.MyFloat64ToStr(yuqilv))
continue;
}
//拼接最终得分
final_score = weight*0.01*score_one
var scores model.Scores //插入分数结构体
scores.Type=2;
scores.ProjectPid = logic.MyInt8(yuqilv_project["pid"]);
scores.ProjectId = logic.MyInt8(yuqilv_project["id"]);
scores.TotalScore = score_one;
scores.CurrentScore = score_one;
scores.Weight= weight;
scores.FinalScore = final_score;
scores.ComCreditsId = logic.MyInt64(v["id"]);
fmt.Print("\r\n\r\n 结构体:",score_one)
insertid,err := d.InsertScores(ctx,scores)
if err != nil {
logic.Loginfo("错误:"+err.Error(),_log_pre_yuqilv)
fmt.Print("错误:"+err.Error(),insertid)
}
var log1 string = "统计逾期率成功--公司编码:"+v["erp_company_code"]+"计算得分:"+logic.MyFloat64ToStr(score_one)+" 最终得分:"+logic.MyFloat64ToStr(final_score);
fmt.Print(log1)
logic.Loginfo(log1,_log_pre_yuqilv)
}
}
logic.Loginfo("统计逾期率完成",_log_pre_yuqilv)
return
}
//发生逾期笔数率: 发生逾期笔数/收款总笔数
func (d *dao) CountYuqiBi(ctx context.Context,project_id_c int,erp_company_code string) (r []map[string]interface{},err error) {
var (
_sql2 string; //
)
//查询逾期率项目配置
sql_str1 := fmt.Sprintf(_sql1,strconv.Itoa(project_id_c))
yuqilv_project,err := d.QueryOne(ctx,1,sql_str1)
if yuqilv_project == nil {
logic.Loginfo("不存在该项目配置lie_model ,project_id:"+strconv.Itoa(project_id_c),_log_pre_yuqibi)
return
}
weight,_ := strconv.ParseFloat(yuqilv_project["weight"],64)
//查询逾期率项目详情
sql_str4 := fmt.Sprintf(_sql4,strconv.Itoa(project_id_c))
modelItems,err := d.QueryMany(ctx,1,sql_str4)
if modelItems == nil {
logic.Loginfo("不存在该项目配置详情lie_model_items,project_id:"+strconv.Itoa(project_id_c),_log_pre_yuqibi)
return
}
//查询当前申请的所有公司
if erp_company_code == "" {
_sql2 = _sql2_1
}else {
_sql2 =fmt.Sprintf(_sql2_2,erp_company_code) //查询一个公司
}
company_info,err := d.QueryMany(ctx,1,_sql2);
if err != nil {
fmt.Println("\r\nerror:1005",err.Error())
logic.Loginfo("错误"+err.Error(),_log_pre_yuqibi)
return
}
for _,v := range company_info{ //循环当前公司,计算各个公司逾期笔数率
if v["erp_company_code"] != "" {
//查询逾期笔数
yuqibi,_ := d.QueryOne(ctx,2,fmt.Sprintf(_sql5,v["erp_company_code"]))
if yuqibi["yuqibi"] == "0" { //没有结果
fmt.Print("\r\n公司编码:"+v["erp_company_code"]+"没有逾期笔数,跳过")
continue
}
//查询逾期笔数
allbi,_ := d.QueryOne(ctx,2,fmt.Sprintf(_sql6,v["erp_company_code"]))
birate := logic.MyFloat64(yuqibi["yuqibi"])/logic.MyFloat64(allbi["allbi"])
//查询收款总笔数
var score_one float64 =0; //对应梯度分数
for _,y := range modelItems{
ladder_range_min,_ := strconv.ParseFloat(y["ladder_range_min"],64) //0.1
ladder_range_max,_ := strconv.ParseFloat(y["ladder_range_max"],64)
if (ladder_range_min <= birate && birate < ladder_range_max) {
score_one = logic.MyFloat64(y["score"]) //得到的分数
}
}
if score_one == 0 {
log1 := "\r\n逾期笔数率不存在对应梯度,erp_company_code:"+v["erp_company_code"]+" 笔数率:"+logic.MyFloat64ToStr(birate)
fmt.Print(log1)
logic.Loginfo(log1,_log_pre_yuqibi)
continue;
}
//拼接最终得分
final_score := weight*0.01*score_one
var scores model.Scores //插入分数结构体
scores.Type=2;
scores.ProjectPid = logic.MyInt8(yuqilv_project["pid"]);
scores.ProjectId = logic.MyInt8(yuqilv_project["id"]);
scores.TotalScore = score_one;
scores.CurrentScore = score_one;
scores.Weight= weight;
scores.FinalScore = final_score;
scores.ComCreditsId = logic.MyInt64(v["id"]);
insertid,err := d.InsertScores(ctx,scores)
if err != nil {
logic.Loginfo("错误:"+err.Error(),_log_pre_yuqibi)
fmt.Print("错误:"+err.Error(),insertid)
}
log2 := "统计逾期笔数率成功--公司编码:"+v["erp_company_code"]+"计算得分:"+logic.MyFloat64ToStr(score_one)+" 最终得分:"+logic.MyFloat64ToStr(final_score);
fmt.Print(log2)
logic.Loginfo(log2,_log_pre_yuqibi)
}
}
logic.Loginfo("统计逾期笔数率完成",_log_pre_yuqibi)
return
}
package dao
import (
"context"
"github.com/pkg/errors"
"github.com/bilibili/kratos/pkg/database/sql"
"kaopu-server/internal/logic"
)
//通过projectId获取该项信息
func (d *dao) GetCompanyModelByProjectid(c context.Context, projectId int64) (res map[string]string, err error) {
var (
rows *sql.Rows
)
if rows, err = d.db.Query(c, "select "+ SqlField + " from lie_model where project_id = ?",projectId); err != nil {
err = errors.WithStack(err)
return
}
defer rows.Close()
logic.CheckErr(err)
twoMap,err := GetAllParam(rows)
for _,v:=range twoMap{
res = v
break
}
return
}
\ No newline at end of file
package dao
import (
"context"
"fmt"
"github.com/pkg/errors"
"github.com/bilibili/kratos/pkg/database/sql"
"kaopu-server/internal/logic"
)
//通过projectId获取该项信息
func (d *dao) GetCompanyModelItemsByProjectid(c context.Context, project_id int64 , score float64) (res map[string]string, err error) {
var (
rows *sql.Rows
)
if rows, err = d.db.Query(c, "select "+ SqlField + " from lie_model_items where project_id = ? and ladder_range_min <= ? and ladder_range_max > ? ",project_id,score,score); err != nil {
err = errors.WithStack(err)
return
}
defer rows.Close()
if err != nil{
fmt.Println("select fail,err:",err)
return
}
twoMap,err := GetAllParam(rows)
for _,v:=range twoMap{
res = v
break
}
return
}
func (d *dao) GetCompanyModelItemsByProjectidWitchString(c context.Context, project_id int64 , stringVal string) (res map[string]string, err error) {
var (
rows *sql.Rows
)
if rows, err = d.db.Query(c, "select "+ SqlField + " from lie_model_items where project_id = ? and ladder_text = ? ",project_id,stringVal); err != nil {
err = errors.WithStack(err)
return
}
defer rows.Close()
logic.CheckErr(err)
twoMap,err := GetAllParam(rows)
for _,v:=range twoMap{
res = v
break
}
//fmt.Print(res)
return
}
\ No newline at end of file
package dao
import (
"context"
"github.com/pkg/errors"
"github.com/bilibili/kratos/pkg/database/sql"
"kaopu-server/internal/logic"
)
//通过projectId获取该项信息
func (d *dao) GetModelTopsetByProjectId(c context.Context, projectId int64) (res map[string]string, err error) {
var (
rows *sql.Rows
)
if rows, err = d.db.Query(c, "select "+ SqlField + " from lie_model_topset where project_id = ?",projectId); err != nil {
err = errors.WithStack(err)
return
}
defer rows.Close()
logic.CheckErr(err)
twoMap,err := GetAllParam(rows)
for _,v:=range twoMap{
res = v
break
}
return
}
package dao
import (
"context"
"github.com/bilibili/kratos/pkg/database/sql"
"kaopu-server/internal/logic"
"kaopu-server/internal/model"
"time"
)
//增加或者修改记录
func (d *dao) InsertScores(ctx context.Context,score model.Scores) (insertId int64,err error) {
//defer d.db.Close()
var(
exitId int64
execSql string
affectNum int64
rows *sql.Rows
)
rows,err = d.db.Query(ctx,"select id from lie_scores where `type` = ? and project_pid = ? and project_id = ? and com_credits_id = ? limit 0,1", score.Type,score.ProjectPid,score.ProjectId,score.ComCreditsId)
defer rows.Close()
logic.CheckErr(err)
twoMap,err := GetAllParam(rows)
exitId = 0
for _,v:=range twoMap{
exitId = logic.StringTurnInt64(v["id"])
break
}
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`)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())
if err != nil {
logic.CheckErr(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` = ? where `type` = ? and project_pid = ? and project_id = ? and com_credits_id = ?"
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.Type,score.ProjectPid,score.ProjectId,score.ComCreditsId)
if err != nil {
logic.CheckErr(err)
}else{
affectNum,_ = row.RowsAffected()
}
}
insertId = affectNum
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 {
logic.CheckErr(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 {
logic.CheckErr(err)
}else{
affectNum,_ = row.RowsAffected()
}
}
insertId = affectNum
return
}
\ No newline at end of file
......@@ -5,7 +5,6 @@ import (
"kaopu-server/internal/model"
"github.com/bilibili/kratos/pkg/database/sql"
"github.com/pkg/errors"
)
......
package logic
import (
"archive/zip"
"bytes"
"crypto/md5"
"crypto/sha1"
"encoding/base64"
"encoding/binary"
"encoding/csv"
"encoding/hex"
"encoding/json"
"fmt"
"hash/crc32"
"html"
"io"
"io/ioutil"
"math"
"math/rand"
"net"
"net/url"
"os"
"os/exec"
"path/filepath"
"reflect"
"runtime"
"strconv"
"strings"
"syscall"
"time"
"unicode"
"unicode/utf8"
)
////////////类型转换(字符串转数字)/////////////////////
func MyInt8(str string) int8 {
res,_ := strconv.ParseInt(str,10,64)
return int8(res)
}
func MyInt16(str string) int16 {
res,_ := strconv.ParseInt(str,10,64)
return int16(res)
}
func MyInt64(str string) int64 {
res,_ := strconv.ParseInt(str,10,64)
return int64(res)
}
func MyFloat32(str string) float32 {
res,_ := strconv.ParseFloat(str,64)
return float32(res)
}
func MyFloat64(str string) float64 {
res,_ := strconv.ParseFloat(str,64)
return float64(res)
}
////////////类型转换(数字转字符串)/////////////////////
func MyFloat64ToStr(numb float64) string {
return strconv.FormatFloat(numb,'f',6,64)
}
func MyInt64ToStr(numb int64) string {
return strconv.FormatInt(numb,10)
}
//////////// Date/Time Functions ////////////
// Time time()
func GetTimeStamp()(timestamp int64) {
return time.Now().Unix()
}
// Strtotime strtotime()
// Strtotime("02/01/2006 15:04:05", "02/01/2016 15:04:05") == 1451747045
// Strtotime("3 04 PM", "8 41 PM") == -62167144740
func Strtotime(format, strtime string) (int64, error) {
t, err := time.Parse(format, strtime)
if err != nil {
return 0, err
}
return t.Unix(), nil
}
// Date date()
// Date("02/01/2006 15:04:05 PM", 1524799394)
func Date(format string, timestamp int64) string {
return time.Unix(timestamp, 0).Format(format)
}
// Checkdate checkdate()
// Validate a Gregorian date
func Checkdate(month, day, year int) bool {
if month < 1 || month > 12 || day < 1 || day > 31 || year < 1 || year > 32767 {
return false
}
switch month {
case 4, 6, 9, 11:
if day > 30 {
return false
}
case 2:
// leap year
if year%4 == 0 && (year%100 != 0 || year%400 == 0) {
if day > 29 {
return false
}
} else if day > 28 {
return false
}
}
return true
}
// Sleep sleep()
func Sleep(t int64) {
time.Sleep(time.Duration(t) * time.Second)
}
// Usleep usleep()
func Usleep(t int64) {
time.Sleep(time.Duration(t) * time.Microsecond)
}
//////////// String Functions ////////////
// Strpos strpos()
func Strpos(haystack, needle string, offset int) int {
length := len(haystack)
if length == 0 || offset > length || -offset > length {
return -1
}
if offset < 0 {
offset += length
}
pos := strings.Index(haystack[offset:], needle)
if pos == -1 {
return -1
}
return pos + offset
}
// Stripos stripos()
func Stripos(haystack, needle string, offset int) int {
length := len(haystack)
if length == 0 || offset > length || -offset > length {
return -1
}
haystack = haystack[offset:]
if offset < 0 {
offset += length
}
pos := strings.Index(strings.ToLower(haystack), strings.ToLower(needle))
if pos == -1 {
return -1
}
return pos + offset
}
// Strrpos strrpos()
func Strrpos(haystack, needle string, offset int) int {
pos, length := 0, len(haystack)
if length == 0 || offset > length || -offset > length {
return -1
}
if offset < 0 {
haystack = haystack[:offset+length+1]
} else {
haystack = haystack[offset:]
}
pos = strings.LastIndex(haystack, needle)
if offset > 0 && pos != -1 {
pos += offset
}
return pos
}
// Strripos strripos()
func Strripos(haystack, needle string, offset int) int {
pos, length := 0, len(haystack)
if length == 0 || offset > length || -offset > length {
return -1
}
if offset < 0 {
haystack = haystack[:offset+length+1]
} else {
haystack = haystack[offset:]
}
pos = strings.LastIndex(strings.ToLower(haystack), strings.ToLower(needle))
if offset > 0 && pos != -1 {
pos += offset
}
return pos
}
// StrReplace str_replace()
func StrReplace(search, replace, subject string, count int) string {
return strings.Replace(subject, search, replace, count)
}
// Strtoupper strtoupper()
func Strtoupper(str string) string {
return strings.ToUpper(str)
}
// Strtolower strtolower()
func Strtolower(str string) string {
return strings.ToLower(str)
}
// Ucfirst ucfirst()
func Ucfirst(str string) string {
for _, v := range str {
u := string(unicode.ToUpper(v))
return u + str[len(u):]
}
return ""
}
// Lcfirst lcfirst()
func Lcfirst(str string) string {
for _, v := range str {
u := string(unicode.ToLower(v))
return u + str[len(u):]
}
return ""
}
// Ucwords ucwords()
func Ucwords(str string) string {
return strings.Title(str)
}
// Substr substr()
func Substr(str string, start uint, length int) string {
if start < 0 || length < -1 {
return str
}
switch {
case length == -1:
return str[start:]
case length == 0:
return ""
}
end := int(start) + length
if end > len(str) {
end = len(str)
}
return str[start:end]
}
// Strrev strrev()
func Strrev(str string) string {
runes := []rune(str)
for i, j := 0, len(runes)-1; i < j; i, j = i+1, j-1 {
runes[i], runes[j] = runes[j], runes[i]
}
return string(runes)
}
// ParseStr parse_str()
// f1=m&f2=n -> map[f1:m f2:n]
// f[a]=m&f[b]=n -> map[f:map[a:m b:n]]
// f[a][a]=m&f[a][b]=n -> map[f:map[a:map[a:m b:n]]]
// f[]=m&f[]=n -> map[f:[m n]]
// f[a][]=m&f[a][]=n -> map[f:map[a:[m n]]]
// f[][]=m&f[][]=n -> map[f:[map[]]] // Currently does not support nested slice.
// f=m&f[a]=n -> error // This is not the same as PHP.
// a .[[b=c -> map[a___[b:c]
func ParseStr(encodedString string, result map[string]interface{}) error {
// build nested map.
var build func(map[string]interface{}, []string, interface{}) error
build = func(result map[string]interface{}, keys []string, value interface{}) error {
length := len(keys)
// trim ',"
key := strings.Trim(keys[0], "'\"")
if length == 1 {
result[key] = value
return nil
}
// The end is slice. like f[], f[a][]
if keys[1] == "" && length == 2 {
// todo nested slice
if key == "" {
return nil
}
val, ok := result[key]
if !ok {
result[key] = []interface{}{value}
return nil
}
children, ok := val.([]interface{})
if !ok {
return fmt.Errorf("expected type '[]interface{}' for key '%s', but got '%T'", key, val)
}
result[key] = append(children, value)
return nil
}
// The end is slice + map. like f[][a]
if keys[1] == "" && length > 2 && keys[2] != "" {
val, ok := result[key]
if !ok {
result[key] = []interface{}{}
val = result[key]
}
children, ok := val.([]interface{})
if !ok {
return fmt.Errorf("expected type '[]interface{}' for key '%s', but got '%T'", key, val)
}
if l := len(children); l > 0 {
if child, ok := children[l-1].(map[string]interface{}); ok {
if _, ok := child[keys[2]]; !ok {
_ = build(child, keys[2:], value)
return nil
}
}
}
child := map[string]interface{}{}
_ = build(child, keys[2:], value)
result[key] = append(children, child)
return nil
}
// map. like f[a], f[a][b]
val, ok := result[key]
if !ok {
result[key] = map[string]interface{}{}
val = result[key]
}
children, ok := val.(map[string]interface{})
if !ok {
return fmt.Errorf("expected type 'map[string]interface{}' for key '%s', but got '%T'", key, val)
}
return build(children, keys[1:], value)
}
// split encodedString.
parts := strings.Split(encodedString, "&")
for _, part := range parts {
pos := strings.Index(part, "=")
if pos <= 0 {
continue
}
key, err := url.QueryUnescape(part[:pos])
if err != nil {
return err
}
for key[0] == ' ' {
key = key[1:]
}
if key == "" || key[0] == '[' {
continue
}
value, err := url.QueryUnescape(part[pos+1:])
if err != nil {
return err
}
// split into multiple keys
var keys []string
left := 0
for i, k := range key {
if k == '[' && left == 0 {
left = i
} else if k == ']' {
if left > 0 {
if len(keys) == 0 {
keys = append(keys, key[:left])
}
keys = append(keys, key[left+1:i])
left = 0
if i+1 < len(key) && key[i+1] != '[' {
break
}
}
}
}
if len(keys) == 0 {
keys = append(keys, key)
}
// first key
first := ""
for i, chr := range keys[0] {
if chr == ' ' || chr == '.' || chr == '[' {
first += "_"
} else {
first += string(chr)
}
if chr == '[' {
first += keys[0][i+1:]
break
}
}
keys[0] = first
// build nested map
if err := build(result, keys, value); err != nil {
return err
}
}
return nil
}
// NumberFormat number_format()
// decimals: Sets the number of decimal points.
// decPoint: Sets the separator for the decimal point.
// thousandsSep: Sets the thousands separator.
func NumberFormat(number float64, decimals uint, decPoint, thousandsSep string) string {
neg := false
if number < 0 {
number = -number
neg = true
}
dec := int(decimals)
// Will round off
str := fmt.Sprintf("%."+strconv.Itoa(dec)+"F", number)
prefix, suffix := "", ""
if dec > 0 {
prefix = str[:len(str)-(dec+1)]
suffix = str[len(str)-dec:]
} else {
prefix = str
}
sep := []byte(thousandsSep)
n, l1, l2 := 0, len(prefix), len(sep)
// thousands sep num
c := (l1 - 1) / 3
tmp := make([]byte, l2*c+l1)
pos := len(tmp) - 1
for i := l1 - 1; i >= 0; i, n, pos = i-1, n+1, pos-1 {
if l2 > 0 && n > 0 && n%3 == 0 {
for j := range sep {
tmp[pos] = sep[l2-j-1]
pos--
}
}
tmp[pos] = prefix[i]
}
s := string(tmp)
if dec > 0 {
s += decPoint + suffix
}
if neg {
s = "-" + s
}
return s
}
// ChunkSplit chunk_split()
func ChunkSplit(body string, chunklen uint, end string) string {
if end == "" {
end = "\r\n"
}
runes, erunes := []rune(body), []rune(end)
l := uint(len(runes))
if l <= 1 || l < chunklen {
return body + end
}
ns := make([]rune, 0, len(runes)+len(erunes))
var i uint
for i = 0; i < l; i += chunklen {
if i+chunklen > l {
ns = append(ns, runes[i:]...)
} else {
ns = append(ns, runes[i:i+chunklen]...)
}
ns = append(ns, erunes...)
}
return string(ns)
}
// StrWordCount str_word_count()
func StrWordCount(str string) []string {
return strings.Fields(str)
}
// Wordwrap wordwrap()
func Wordwrap(str string, width uint, br string, cut bool) string {
strlen := len(str)
brlen := len(br)
linelen := int(width)
if strlen == 0 {
return ""
}
if brlen == 0 {
panic("break string cannot be empty")
}
if linelen == 0 && cut {
panic("can't force cut when width is zero")
}
current, laststart, lastspace := 0, 0, 0
var ns []byte
for current = 0; current < strlen; current++ {
if str[current] == br[0] && current+brlen < strlen && str[current:current+brlen] == br {
ns = append(ns, str[laststart:current+brlen]...)
current += brlen - 1
lastspace = current + 1
laststart = lastspace
} else if str[current] == ' ' {
if current-laststart >= linelen {
ns = append(ns, str[laststart:current]...)
ns = append(ns, br[:]...)
laststart = current + 1
}
lastspace = current
} else if current-laststart >= linelen && cut && laststart >= lastspace {
ns = append(ns, str[laststart:current]...)
ns = append(ns, br[:]...)
laststart = current
lastspace = current
} else if current-laststart >= linelen && laststart < lastspace {
ns = append(ns, str[laststart:lastspace]...)
ns = append(ns, br[:]...)
lastspace++
laststart = lastspace
}
}
if laststart != current {
ns = append(ns, str[laststart:current]...)
}
return string(ns)
}
// Strlen strlen()
func Strlen(str string) int {
return len(str)
}
// MbStrlen mb_strlen()
func MbStrlen(str string) int {
return utf8.RuneCountInString(str)
}
// StrRepeat str_repeat()
func StrRepeat(input string, multiplier int) string {
return strings.Repeat(input, multiplier)
}
// Strstr strstr()
func Strstr(haystack string, needle string) string {
if needle == "" {
return ""
}
idx := strings.Index(haystack, needle)
if idx == -1 {
return ""
}
return haystack[idx+len([]byte(needle))-1:]
}
// Strtr strtr()
//
// If the parameter length is 1, type is: map[string]string
// Strtr("baab", map[string]string{"ab": "01"}) will return "ba01"
// If the parameter length is 2, type is: string, string
// Strtr("baab", "ab", "01") will return "1001", a => 0; b => 1.
func Strtr(haystack string, params ...interface{}) string {
ac := len(params)
if ac == 1 {
pairs := params[0].(map[string]string)
length := len(pairs)
if length == 0 {
return haystack
}
oldnew := make([]string, length*2)
for o, n := range pairs {
if o == "" {
return haystack
}
oldnew = append(oldnew, o, n)
}
return strings.NewReplacer(oldnew...).Replace(haystack)
} else if ac == 2 {
from := params[0].(string)
to := params[1].(string)
trlen, lt := len(from), len(to)
if trlen > lt {
trlen = lt
}
if trlen == 0 {
return haystack
}
str := make([]uint8, len(haystack))
var xlat [256]uint8
var i int
var j uint8
if trlen == 1 {
for i = 0; i < len(haystack); i++ {
if haystack[i] == from[0] {
str[i] = to[0]
} else {
str[i] = haystack[i]
}
}
return string(str)
}
// trlen != 1
for {
xlat[j] = j
if j++; j == 0 {
break
}
}
for i = 0; i < trlen; i++ {
xlat[from[i]] = to[i]
}
for i = 0; i < len(haystack); i++ {
str[i] = xlat[haystack[i]]
}
return string(str)
}
return haystack
}
// StrShuffle str_shuffle()
func StrShuffle(str string) string {
runes := []rune(str)
r := rand.New(rand.NewSource(time.Now().UnixNano()))
s := make([]rune, len(runes))
for i, v := range r.Perm(len(runes)) {
s[i] = runes[v]
}
return string(s)
}
// Trim trim()
func Trim(str string, characterMask ...string) string {
if len(characterMask) == 0 {
return strings.TrimSpace(str)
}
return strings.Trim(str, characterMask[0])
}
// Ltrim ltrim()
func Ltrim(str string, characterMask ...string) string {
if len(characterMask) == 0 {
return strings.TrimLeftFunc(str, unicode.IsSpace)
}
return strings.TrimLeft(str, characterMask[0])
}
// Rtrim rtrim()
func Rtrim(str string, characterMask ...string) string {
if len(characterMask) == 0 {
return strings.TrimRightFunc(str, unicode.IsSpace)
}
return strings.TrimRight(str, characterMask[0])
}
// Explode explode()
func Explode(delimiter, str string) []string {
return strings.Split(str, delimiter)
}
// Chr chr()
func Chr(ascii int) string {
return string(ascii)
}
// Ord ord()
func Ord(char string) int {
r, _ := utf8.DecodeRune([]byte(char))
return int(r)
}
// Nl2br nl2br()
// \n\r, \r\n, \r, \n
func Nl2br(str string, isXhtml bool) string {
r, n, runes := '\r', '\n', []rune(str)
var br []byte
if isXhtml {
br = []byte("<br />")
} else {
br = []byte("<br>")
}
skip := false
length := len(runes)
var buf bytes.Buffer
for i, v := range runes {
if skip {
skip = false
continue
}
switch v {
case n, r:
if (i+1 < length) && (v == r && runes[i+1] == n) || (v == n && runes[i+1] == r) {
buf.Write(br)
skip = true
continue
}
buf.Write(br)
default:
buf.WriteRune(v)
}
}
return buf.String()
}
// JSONDecode json_decode()
func JSONDecode(data []byte, val interface{}) error {
return json.Unmarshal(data, val)
}
// JSONEncode json_encode()
func JSONEncode(val interface{}) ([]byte, error) {
return json.Marshal(val)
}
// Addslashes addslashes()
func Addslashes(str string) string {
var buf bytes.Buffer
for _, char := range str {
switch char {
case '\'', '"', '\\':
buf.WriteRune('\\')
}
buf.WriteRune(char)
}
return buf.String()
}
// Stripslashes stripslashes()
func Stripslashes(str string) string {
var buf bytes.Buffer
l, skip := len(str), false
for i, char := range str {
if skip {
skip = false
} else if char == '\\' {
if i+1 < l && str[i+1] == '\\' {
skip = true
}
continue
}
buf.WriteRune(char)
}
return buf.String()
}
// Quotemeta quotemeta()
func Quotemeta(str string) string {
var buf bytes.Buffer
for _, char := range str {
switch char {
case '.', '+', '\\', '(', '$', ')', '[', '^', ']', '*', '?':
buf.WriteRune('\\')
}
buf.WriteRune(char)
}
return buf.String()
}
// Htmlentities htmlentities()
func Htmlentities(str string) string {
return html.EscapeString(str)
}
// HTMLEntityDecode html_entity_decode()
func HTMLEntityDecode(str string) string {
return html.UnescapeString(str)
}
// Md5 md5()
func Md5(str string) string {
hash := md5.New()
hash.Write([]byte(str))
return hex.EncodeToString(hash.Sum(nil))
}
// Md5File md5_file()
func Md5File(path string) (string, error) {
data, err := ioutil.ReadFile(path)
if err != nil {
return "", err
}
hash := md5.New()
hash.Write([]byte(data))
return hex.EncodeToString(hash.Sum(nil)), nil
}
// Sha1 sha1()
func Sha1(str string) string {
hash := sha1.New()
hash.Write([]byte(str))
return hex.EncodeToString(hash.Sum(nil))
}
// Sha1File sha1_file()
func Sha1File(path string) (string, error) {
data, err := ioutil.ReadFile(path)
if err != nil {
return "", err
}
hash := sha1.New()
hash.Write([]byte(data))
return hex.EncodeToString(hash.Sum(nil)), nil
}
// Crc32 crc32()
func Crc32(str string) uint32 {
return crc32.ChecksumIEEE([]byte(str))
}
// Levenshtein levenshtein()
// costIns: Defines the cost of insertion.
// costRep: Defines the cost of replacement.
// costDel: Defines the cost of deletion.
func Levenshtein(str1, str2 string, costIns, costRep, costDel int) int {
var maxLen = 255
l1 := len(str1)
l2 := len(str2)
if l1 == 0 {
return l2 * costIns
}
if l2 == 0 {
return l1 * costDel
}
if l1 > maxLen || l2 > maxLen {
return -1
}
p1 := make([]int, l2+1)
p2 := make([]int, l2+1)
var c0, c1, c2 int
var i1, i2 int
for i2 := 0; i2 <= l2; i2++ {
p1[i2] = i2 * costIns
}
for i1 = 0; i1 < l1; i1++ {
p2[0] = p1[0] + costDel
for i2 = 0; i2 < l2; i2++ {
if str1[i1] == str2[i2] {
c0 = p1[i2]
} else {
c0 = p1[i2] + costRep
}
c1 = p1[i2+1] + costDel
if c1 < c0 {
c0 = c1
}
c2 = p2[i2] + costIns
if c2 < c0 {
c0 = c2
}
p2[i2+1] = c0
}
tmp := p1
p1 = p2
p2 = tmp
}
c0 = p1[l2]
return c0
}
// SimilarText similar_text()
func SimilarText(first, second string, percent *float64) int {
var similarText func(string, string, int, int) int
similarText = func(str1, str2 string, len1, len2 int) int {
var sum, max int
pos1, pos2 := 0, 0
// Find the longest segment of the same section in two strings
for i := 0; i < len1; i++ {
for j := 0; j < len2; j++ {
for l := 0; (i+l < len1) && (j+l < len2) && (str1[i+l] == str2[j+l]); l++ {
if l+1 > max {
max = l + 1
pos1 = i
pos2 = j
}
}
}
}
if sum = max; sum > 0 {
if pos1 > 0 && pos2 > 0 {
sum += similarText(str1, str2, pos1, pos2)
}
if (pos1+max < len1) && (pos2+max < len2) {
s1 := []byte(str1)
s2 := []byte(str2)
sum += similarText(string(s1[pos1+max:]), string(s2[pos2+max:]), len1-pos1-max, len2-pos2-max)
}
}
return sum
}
l1, l2 := len(first), len(second)
if l1+l2 == 0 {
return 0
}
sim := similarText(first, second, l1, l2)
if percent != nil {
*percent = float64(sim*200) / float64(l1+l2)
}
return sim
}
// Soundex soundex()
// Calculate the soundex key of a string.
func Soundex(str string) string {
if str == "" {
panic("str: cannot be an empty string")
}
table := [26]rune{
// A, B, C, D
'0', '1', '2', '3',
// E, F, G
'0', '1', '2',
// H
'0',
// I, J, K, L, M, N
'0', '2', '2', '4', '5', '5',
// O, P, Q, R, S, T
'0', '1', '2', '6', '2', '3',
// U, V
'0', '1',
// W, X
'0', '2',
// Y, Z
'0', '2',
}
last, code, small := -1, 0, 0
sd := make([]rune, 4)
// build soundex string
for i := 0; i < len(str) && small < 4; i++ {
// ToUpper
char := str[i]
if char < '\u007F' && 'a' <= char && char <= 'z' {
code = int(char - 'a' + 'A')
} else {
code = int(char)
}
if code >= 'A' && code <= 'Z' {
if small == 0 {
sd[small] = rune(code)
small++
last = int(table[code-'A'])
} else {
code = int(table[code-'A'])
if code != last {
if code != 0 {
sd[small] = rune(code)
small++
}
last = code
}
}
}
}
// pad with "0"
for ; small < 4; small++ {
sd[small] = '0'
}
return string(sd)
}
//////////// URL Functions ////////////
// ParseURL parse_url()
// Parse a URL and return its components
// -1: all; 1: scheme; 2: host; 4: port; 8: user; 16: pass; 32: path; 64: query; 128: fragment
func ParseURL(str string, component int) (map[string]string, error) {
u, err := url.Parse(str)
if err != nil {
return nil, err
}
if component == -1 {
component = 1 | 2 | 4 | 8 | 16 | 32 | 64 | 128
}
var components = make(map[string]string)
if (component & 1) == 1 {
components["scheme"] = u.Scheme
}
if (component & 2) == 2 {
components["host"] = u.Hostname()
}
if (component & 4) == 4 {
components["port"] = u.Port()
}
if (component & 8) == 8 {
components["user"] = u.User.Username()
}
if (component & 16) == 16 {
components["pass"], _ = u.User.Password()
}
if (component & 32) == 32 {
components["path"] = u.Path
}
if (component & 64) == 64 {
components["query"] = u.RawQuery
}
if (component & 128) == 128 {
components["fragment"] = u.Fragment
}
return components, nil
}
// URLEncode urlencode()
func URLEncode(str string) string {
return url.QueryEscape(str)
}
// URLDecode urldecode()
func URLDecode(str string) (string, error) {
return url.QueryUnescape(str)
}
// Rawurlencode rawurlencode()
func Rawurlencode(str string) string {
return strings.Replace(url.QueryEscape(str), "+", "%20", -1)
}
// Rawurldecode rawurldecode()
func Rawurldecode(str string) (string, error) {
return url.QueryUnescape(strings.Replace(str, "%20", "+", -1))
}
// HTTPBuildQuery http_build_query()
func HTTPBuildQuery(queryData url.Values) string {
return queryData.Encode()
}
// Base64Encode base64_encode()
func Base64Encode(str string) string {
return base64.StdEncoding.EncodeToString([]byte(str))
}
// Base64Decode base64_decode()
func Base64Decode(str string) (string, error) {
switch len(str) % 4 {
case 2:
str += "=="
case 3:
str += "="
}
data, err := base64.StdEncoding.DecodeString(str)
if err != nil {
return "", err
}
return string(data), nil
}
//////////// Array(Slice/Map) Functions ////////////
// ArrayFill array_fill()
func ArrayFill(startIndex int, num uint, value interface{}) map[int]interface{} {
m := make(map[int]interface{})
var i uint
for i = 0; i < num; i++ {
m[startIndex] = value
startIndex++
}
return m
}
// ArrayFlip array_flip()
func ArrayFlip(m map[interface{}]interface{}) map[interface{}]interface{} {
n := make(map[interface{}]interface{})
for i, v := range m {
n[v] = i
}
return n
}
// ArrayKeys array_keys()
func ArrayKeys(elements map[interface{}]interface{}) []interface{} {
i, keys := 0, make([]interface{}, len(elements))
for key := range elements {
keys[i] = key
i++
}
return keys
}
// ArrayValues array_values()
func ArrayValues(elements map[interface{}]interface{}) []interface{} {
i, vals := 0, make([]interface{}, len(elements))
for _, val := range elements {
vals[i] = val
i++
}
return vals
}
// ArrayMerge array_merge()
func ArrayMerge(ss ...[]interface{}) []interface{} {
n := 0
for _, v := range ss {
n += len(v)
}
s := make([]interface{}, 0, n)
for _, v := range ss {
s = append(s, v...)
}
return s
}
// ArrayChunk array_chunk()
func ArrayChunk(s []interface{}, size int) [][]interface{} {
if size < 1 {
panic("size: cannot be less than 1")
}
length := len(s)
chunks := int(math.Ceil(float64(length) / float64(size)))
var n [][]interface{}
for i, end := 0, 0; chunks > 0; chunks-- {
end = (i + 1) * size
if end > length {
end = length
}
n = append(n, s[i*size:end])
i++
}
return n
}
// ArrayPad array_pad()
func ArrayPad(s []interface{}, size int, val interface{}) []interface{} {
if size == 0 || (size > 0 && size < len(s)) || (size < 0 && size > -len(s)) {
return s
}
n := size
if size < 0 {
n = -size
}
n -= len(s)
tmp := make([]interface{}, n)
for i := 0; i < n; i++ {
tmp[i] = val
}
if size > 0 {
return append(s, tmp...)
}
return append(tmp, s...)
}
// ArraySlice array_slice()
func ArraySlice(s []interface{}, offset, length uint) []interface{} {
if offset > uint(len(s)) {
panic("offset: the offset is less than the length of s")
}
end := offset + length
if end < uint(len(s)) {
return s[offset:end]
}
return s[offset:]
}
// ArrayRand array_rand()
func ArrayRand(elements []interface{}) []interface{} {
r := rand.New(rand.NewSource(time.Now().UnixNano()))
n := make([]interface{}, len(elements))
for i, v := range r.Perm(len(elements)) {
n[i] = elements[v]
}
return n
}
// ArrayColumn array_column()
func ArrayColumn(input map[string]map[string]interface{}, columnKey string) []interface{} {
columns := make([]interface{}, 0, len(input))
for _, val := range input {
if v, ok := val[columnKey]; ok {
columns = append(columns, v)
}
}
return columns
}
// ArrayPush array_push()
// Push one or more elements onto the end of slice
func ArrayPush(s *[]interface{}, elements ...interface{}) int {
*s = append(*s, elements...)
return len(*s)
}
// ArrayPop array_pop()
// Pop the element off the end of slice
func ArrayPop(s *[]interface{}) interface{} {
if len(*s) == 0 {
return nil
}
ep := len(*s) - 1
e := (*s)[ep]
*s = (*s)[:ep]
return e
}
// ArrayUnshift array_unshift()
// Prepend one or more elements to the beginning of a slice
func ArrayUnshift(s *[]interface{}, elements ...interface{}) int {
*s = append(elements, *s...)
return len(*s)
}
// ArrayShift array_shift()
// Shift an element off the beginning of slice
func ArrayShift(s *[]interface{}) interface{} {
if len(*s) == 0 {
return nil
}
f := (*s)[0]
*s = (*s)[1:]
return f
}
// ArrayKeyExists array_key_exists()
func ArrayKeyExists(key interface{}, m map[interface{}]interface{}) bool {
_, ok := m[key]
return ok
}
// ArrayCombine array_combine()
func ArrayCombine(s1, s2 []interface{}) map[interface{}]interface{} {
if len(s1) != len(s2) {
panic("the number of elements for each slice isn't equal")
}
m := make(map[interface{}]interface{}, len(s1))
for i, v := range s1 {
m[v] = s2[i]
}
return m
}
// ArrayReverse array_reverse()
func ArrayReverse(s []interface{}) []interface{} {
for i, j := 0, len(s)-1; i < j; i, j = i+1, j-1 {
s[i], s[j] = s[j], s[i]
}
return s
}
// Implode implode()
func Implode(glue string, pieces []string) string {
var buf bytes.Buffer
l := len(pieces)
for _, str := range pieces {
buf.WriteString(str)
if l--; l > 0 {
buf.WriteString(glue)
}
}
return buf.String()
}
// InArray in_array()
// haystack supported types: slice, array or map
func InArray(needle interface{}, haystack interface{}) bool {
val := reflect.ValueOf(haystack)
switch val.Kind() {
case reflect.Slice, reflect.Array:
for i := 0; i < val.Len(); i++ {
if reflect.DeepEqual(needle, val.Index(i).Interface()) {
return true
}
}
case reflect.Map:
for _, k := range val.MapKeys() {
if reflect.DeepEqual(needle, val.MapIndex(k).Interface()) {
return true
}
}
default:
panic("haystack: haystack type muset be slice, array or map")
}
return false
}
//////////// Mathematical Functions ////////////
// Abs abs()
func Abs(number float64) float64 {
return math.Abs(number)
}
// Rand rand()
// Range: [0, 2147483647]
func Rand(min, max int) int {
if min > max {
panic("min: min cannot be greater than max")
}
// PHP: getrandmax()
if int31 := 1<<31 - 1; max > int31 {
panic("max: max can not be greater than " + strconv.Itoa(int31))
}
if min == max {
return min
}
r := rand.New(rand.NewSource(time.Now().UnixNano()))
return r.Intn(max+1-min) + min
}
// Round round()
func Round(value float64) float64 {
return math.Floor(value + 0.5)
}
// Floor floor()
func Floor(value float64) float64 {
return math.Floor(value)
}
// Ceil ceil()
func Ceil(value float64) float64 {
return math.Ceil(value)
}
// Pi pi()
func Pi() float64 {
return math.Pi
}
// Max max()
func Max(nums ...float64) float64 {
if len(nums) < 2 {
panic("nums: the nums length is less than 2")
}
max := nums[0]
for i := 1; i < len(nums); i++ {
max = math.Max(max, nums[i])
}
return max
}
// Min min()
func Min(nums ...float64) float64 {
if len(nums) < 2 {
panic("nums: the nums length is less than 2")
}
min := nums[0]
for i := 1; i < len(nums); i++ {
min = math.Min(min, nums[i])
}
return min
}
// Decbin decbin()
func Decbin(number int64) string {
return strconv.FormatInt(number, 2)
}
// Bindec bindec()
func Bindec(str string) (string, error) {
i, err := strconv.ParseInt(str, 2, 0)
if err != nil {
return "", err
}
return strconv.FormatInt(i, 10), nil
}
// Hex2bin hex2bin()
func Hex2bin(data string) (string, error) {
i, err := strconv.ParseInt(data, 16, 0)
if err != nil {
return "", err
}
return strconv.FormatInt(i, 2), nil
}
// Bin2hex bin2hex()
func Bin2hex(str string) (string, error) {
i, err := strconv.ParseInt(str, 2, 0)
if err != nil {
return "", err
}
return strconv.FormatInt(i, 16), nil
}
// Dechex dechex()
func Dechex(number int64) string {
return strconv.FormatInt(number, 16)
}
// Hexdec hexdec()
func Hexdec(str string) (int64, error) {
return strconv.ParseInt(str, 16, 0)
}
// Decoct decoct()
func Decoct(number int64) string {
return strconv.FormatInt(number, 8)
}
// Octdec Octdec()
func Octdec(str string) (int64, error) {
return strconv.ParseInt(str, 8, 0)
}
// BaseConvert base_convert()
func BaseConvert(number string, frombase, tobase int) (string, error) {
i, err := strconv.ParseInt(number, frombase, 0)
if err != nil {
return "", err
}
return strconv.FormatInt(i, tobase), nil
}
// IsNan is_nan()
func IsNan(val float64) bool {
return math.IsNaN(val)
}
//////////// Directory/Filesystem Functions ////////////
// Stat stat()
func Stat(filename string) (os.FileInfo, error) {
return os.Stat(filename)
}
// Pathinfo pathinfo()
// -1: all; 1: dirname; 2: basename; 4: extension; 8: filename
// Usage:
// Pathinfo("/home/go/path/src/php2go/php2go.go", 1|2|4|8)
func Pathinfo(path string, options int) map[string]string {
if options == -1 {
options = 1 | 2 | 4 | 8
}
info := make(map[string]string)
if (options & 1) == 1 {
info["dirname"] = filepath.Dir(path)
}
if (options & 2) == 2 {
info["basename"] = filepath.Base(path)
}
if ((options & 4) == 4) || ((options & 8) == 8) {
basename := ""
if (options & 2) == 2 {
basename, _ = info["basename"]
} else {
basename = filepath.Base(path)
}
p := strings.LastIndex(basename, ".")
filename, extension := "", ""
if p > 0 {
filename, extension = basename[:p], basename[p+1:]
} else if p == -1 {
filename = basename
} else if p == 0 {
extension = basename[p+1:]
}
if (options & 4) == 4 {
info["extension"] = extension
}
if (options & 8) == 8 {
info["filename"] = filename
}
}
return info
}
// FileExists file_exists()
func FileExists(filename string) bool {
_, err := os.Stat(filename)
if err != nil && os.IsNotExist(err) {
return false
}
return true
}
// IsFile is_file()
func IsFile(filename string) bool {
_, err := os.Stat(filename)
if err != nil && os.IsNotExist(err) {
return false
}
return true
}
// IsDir is_dir()
func IsDir(filename string) (bool, error) {
fd, err := os.Stat(filename)
if err != nil {
return false, err
}
fm := fd.Mode()
return fm.IsDir(), nil
}
// FileSize filesize()
func FileSize(filename string) (int64, error) {
info, err := os.Stat(filename)
if err != nil && os.IsNotExist(err) {
return 0, err
}
return info.Size(), nil
}
// FilePutContents file_put_contents()
func FilePutContents(filename string, data string, mode os.FileMode) error {
return ioutil.WriteFile(filename, []byte(data), mode)
}
// FileGetContents file_get_contents()
func FileGetContents(filename string) (string, error) {
data, err := ioutil.ReadFile(filename)
return string(data), err
}
// Unlink unlink()
func Unlink(filename string) error {
return os.Remove(filename)
}
// Delete delete()
func Delete(filename string) error {
return os.Remove(filename)
}
// Copy copy()
func Copy(source, dest string) (bool, error) {
fd1, err := os.Open(source)
if err != nil {
return false, err
}
defer fd1.Close()
fd2, err := os.OpenFile(dest, os.O_WRONLY|os.O_CREATE, 0644)
if err != nil {
return false, err
}
defer fd2.Close()
_, e := io.Copy(fd2, fd1)
if e != nil {
return false, e
}
return true, nil
}
// IsReadable is_readable()
func IsReadable(filename string) bool {
_, err := syscall.Open(filename, syscall.O_RDONLY, 0)
if err != nil {
return false
}
return true
}
// IsWriteable is_writeable()
func IsWriteable(filename string) bool {
_, err := syscall.Open(filename, syscall.O_WRONLY, 0)
if err != nil {
return false
}
return true
}
// Rename rename()
func Rename(oldname, newname string) error {
return os.Rename(oldname, newname)
}
// Touch touch()
func Touch(filename string) (bool, error) {
fd, err := os.OpenFile(filename, os.O_RDONLY|os.O_CREATE, 0666)
if err != nil {
return false, err
}
fd.Close()
return true, nil
}
// Mkdir mkdir()
func Mkdir(filename string, mode os.FileMode) error {
return os.Mkdir(filename, mode)
}
// Getcwd getcwd()
func Getcwd() (string, error) {
dir, err := os.Getwd()
return dir, err
}
// Realpath realpath()
func Realpath(path string) (string, error) {
return filepath.Abs(path)
}
// Basename basename()
func Basename(path string) string {
return filepath.Base(path)
}
// Chmod chmod()
func Chmod(filename string, mode os.FileMode) bool {
return os.Chmod(filename, mode) == nil
}
// Chown chown()
func Chown(filename string, uid, gid int) bool {
return os.Chown(filename, uid, gid) == nil
}
// Fclose fclose()
func Fclose(handle *os.File) error {
return handle.Close()
}
// Filemtime filemtime()
func Filemtime(filename string) (int64, error) {
fd, err := os.Open(filename)
if err != nil {
return 0, err
}
defer fd.Close()
fileinfo, err := fd.Stat()
if err != nil {
return 0, err
}
return fileinfo.ModTime().Unix(), nil
}
// Fgetcsv fgetcsv()
func Fgetcsv(handle *os.File, length int, delimiter rune) ([][]string, error) {
reader := csv.NewReader(handle)
reader.Comma = delimiter
// TODO length limit
return reader.ReadAll()
}
// Glob glob()
func Glob(pattern string) ([]string, error) {
return filepath.Glob(pattern)
}
//////////// Variable handling Functions ////////////
// Empty empty()
func Empty(val interface{}) bool {
if val == nil {
return true
}
v := reflect.ValueOf(val)
switch v.Kind() {
case reflect.String, reflect.Array:
return v.Len() == 0
case reflect.Map, reflect.Slice:
return v.Len() == 0 || v.IsNil()
case reflect.Bool:
return !v.Bool()
case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
return v.Int() == 0
case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr:
return v.Uint() == 0
case reflect.Float32, reflect.Float64:
return v.Float() == 0
case reflect.Interface, reflect.Ptr:
return v.IsNil()
}
return reflect.DeepEqual(val, reflect.Zero(v.Type()).Interface())
}
// IsNumeric is_numeric()
// Numeric strings consist of optional sign, any number of digits, optional decimal part and optional exponential part.
// Thus +0123.45e6 is a valid numeric value.
// In PHP hexadecimal (e.g. 0xf4c3b00c) is not supported, but IsNumeric is supported.
func IsNumeric(val interface{}) bool {
switch val.(type) {
case int, int8, int16, int32, int64, uint, uint8, uint16, uint32, uint64:
return true
case float32, float64, complex64, complex128:
return true
case string:
str := val.(string)
if str == "" {
return false
}
// Trim any whitespace
str = strings.TrimSpace(str)
if str[0] == '-' || str[0] == '+' {
if len(str) == 1 {
return false
}
str = str[1:]
}
// hex
if len(str) > 2 && str[0] == '0' && (str[1] == 'x' || str[1] == 'X') {
for _, h := range str[2:] {
if !((h >= '0' && h <= '9') || (h >= 'a' && h <= 'f') || (h >= 'A' && h <= 'F')) {
return false
}
}
return true
}
// 0-9, Point, Scientific
p, s, l := 0, 0, len(str)
for i, v := range str {
if v == '.' { // Point
if p > 0 || s > 0 || i+1 == l {
return false
}
p = i
} else if v == 'e' || v == 'E' { // Scientific
if i == 0 || s > 0 || i+1 == l {
return false
}
s = i
} else if v < '0' || v > '9' {
return false
}
}
return true
}
return false
}
//////////// Program execution Functions ////////////
// Exec exec()
// returnVar, 0: succ; 1: fail
// Return the last line from the result of the command.
// command format eg:
// "ls -a"
// "/bin/bash -c \"ls -a\""
func Exec(command string, output *[]string, returnVar *int) string {
q := rune(0)
parts := strings.FieldsFunc(command, func(r rune) bool {
switch {
case r == q:
q = rune(0)
return false
case q != rune(0):
return false
case unicode.In(r, unicode.Quotation_Mark):
q = r
return false
default:
return unicode.IsSpace(r)
}
})
// remove the " and ' on both sides
for i, v := range parts {
f, l := v[0], len(v)
if l >= 2 && (f == '"' || f == '\'') {
parts[i] = v[1 : l-1]
}
}
cmd := exec.Command(parts[0], parts[1:]...)
out, err := cmd.CombinedOutput()
if err != nil {
*returnVar = 1
return ""
}
*returnVar = 0
*output = strings.Split(strings.TrimRight(string(out), "\n"), "\n")
if l := len(*output); l > 0 {
return (*output)[l-1]
}
return ""
}
// System system()
// returnVar, 0: succ; 1: fail
// Returns the last line of the command output on success, and "" on failure.
func System(command string, returnVar *int) string {
*returnVar = 0
var stdBuf bytes.Buffer
var err, err1, err2, err3 error
// split command
q := rune(0)
parts := strings.FieldsFunc(command, func(r rune) bool {
switch {
case r == q:
q = rune(0)
return false
case q != rune(0):
return false
case unicode.In(r, unicode.Quotation_Mark):
q = r
return false
default:
return unicode.IsSpace(r)
}
})
// remove the " and ' on both sides
for i, v := range parts {
f, l := v[0], len(v)
if l >= 2 && (f == '"' || f == '\'') {
parts[i] = v[1 : l-1]
}
}
cmd := exec.Command(parts[0], parts[1:]...)
stdoutIn, _ := cmd.StdoutPipe()
stderrIn, _ := cmd.StderrPipe()
stdout := io.MultiWriter(os.Stdout, &stdBuf)
stderr := io.MultiWriter(os.Stderr, &stdBuf)
err = cmd.Start()
if err != nil {
*returnVar = 1
return ""
}
go func() {
_, err1 = io.Copy(stdout, stdoutIn)
}()
go func() {
_, err2 = io.Copy(stderr, stderrIn)
}()
err3 = cmd.Wait()
if err1 != nil || err2 != nil || err3 != nil {
if err1 != nil {
fmt.Println(err1)
}
if err2 != nil {
fmt.Println(err2)
}
if err3 != nil {
fmt.Println(err3)
}
*returnVar = 1
return ""
}
if output := strings.TrimRight(stdBuf.String(), "\n"); output != "" {
pos := strings.LastIndex(output, "\n")
if pos == -1 {
return output
}
return output[pos+1:]
}
return ""
}
// Passthru passthru()
// returnVar, 0: succ; 1: fail
func Passthru(command string, returnVar *int) {
q := rune(0)
parts := strings.FieldsFunc(command, func(r rune) bool {
switch {
case r == q:
q = rune(0)
return false
case q != rune(0):
return false
case unicode.In(r, unicode.Quotation_Mark):
q = r
return false
default:
return unicode.IsSpace(r)
}
})
// remove the " and ' on both sides
for i, v := range parts {
f, l := v[0], len(v)
if l >= 2 && (f == '"' || f == '\'') {
parts[i] = v[1 : l-1]
}
}
cmd := exec.Command(parts[0], parts[1:]...)
cmd.Stdout = os.Stdout
cmd.Stderr = os.Stderr
err := cmd.Run()
if err != nil {
*returnVar = 1
fmt.Println(err)
} else {
*returnVar = 0
}
}
//////////// Network Functions ////////////
// Gethostname gethostname()
func Gethostname() (string, error) {
return os.Hostname()
}
// Gethostbyname gethostbyname()
// Get the IPv4 address corresponding to a given Internet host name
func Gethostbyname(hostname string) (string, error) {
ips, err := net.LookupIP(hostname)
if ips != nil {
for _, v := range ips {
if v.To4() != nil {
return v.String(), nil
}
}
return "", nil
}
return "", err
}
// Gethostbynamel gethostbynamel()
// Get a list of IPv4 addresses corresponding to a given Internet host name
func Gethostbynamel(hostname string) ([]string, error) {
ips, err := net.LookupIP(hostname)
if ips != nil {
var ipstrs []string
for _, v := range ips {
if v.To4() != nil {
ipstrs = append(ipstrs, v.String())
}
}
return ipstrs, nil
}
return nil, err
}
// Gethostbyaddr gethostbyaddr()
// Get the Internet host name corresponding to a given IP address
func Gethostbyaddr(ipAddress string) (string, error) {
names, err := net.LookupAddr(ipAddress)
if names != nil {
return strings.TrimRight(names[0], "."), nil
}
return "", err
}
// IP2long ip2long()
// IPv4
func IP2long(ipAddress string) uint32 {
ip := net.ParseIP(ipAddress)
if ip == nil {
return 0
}
return binary.BigEndian.Uint32(ip.To4())
}
// Long2ip long2ip()
// IPv4
func Long2ip(properAddress uint32) string {
ipByte := make([]byte, 4)
binary.BigEndian.PutUint32(ipByte, properAddress)
ip := net.IP(ipByte)
return ip.String()
}
//////////// Misc. Functions ////////////
// Echo echo
func Echo(args ...interface{}) {
fmt.Print(args...)
}
// Uniqid uniqid()
func Uniqid(prefix string) string {
now := time.Now()
return fmt.Sprintf("%s%08x%05x", prefix, now.Unix(), now.UnixNano()%0x100000)
}
// Exit exit()
func Exit(status int) {
os.Exit(status)
}
// Die die()
func Die(status int) {
os.Exit(status)
}
// Getenv getenv()
func Getenv(varname string) string {
return os.Getenv(varname)
}
// Putenv putenv()
// The setting, like "FOO=BAR"
func Putenv(setting string) error {
s := strings.Split(setting, "=")
if len(s) != 2 {
panic("setting: invalid")
}
return os.Setenv(s[0], s[1])
}
// MemoryGetUsage memory_get_usage()
// return in bytes
func MemoryGetUsage(realUsage bool) uint64 {
stat := new(runtime.MemStats)
runtime.ReadMemStats(stat)
return stat.Alloc
}
// VersionCompare version_compare()
// The possible operators are: <, lt, <=, le, >, gt, >=, ge, ==, =, eq, !=, <>, ne respectively.
// special version strings these are handled in the following order,
// (any string not found) < dev < alpha = a < beta = b < RC = rc < # < pl = p
// Usage:
// VersionCompare("1.2.3-alpha", "1.2.3RC7", '>=')
// VersionCompare("1.2.3-beta", "1.2.3pl", 'lt')
// VersionCompare("1.1_dev", "1.2any", 'eq')
func VersionCompare(version1, version2, operator string) bool {
var vcompare func(string, string) int
var canonicalize func(string) string
var special func(string, string) int
// version compare
vcompare = func(origV1, origV2 string) int {
if origV1 == "" || origV2 == "" {
if origV1 == "" && origV2 == "" {
return 0
}
if origV1 == "" {
return -1
}
return 1
}
ver1, ver2, compare := "", "", 0
if origV1[0] == '#' {
ver1 = origV1
} else {
ver1 = canonicalize(origV1)
}
if origV2[0] == '#' {
ver2 = origV2
} else {
ver2 = canonicalize(origV2)
}
n1, n2 := 0, 0
for {
p1, p2 := "", ""
n1 = strings.IndexByte(ver1, '.')
if n1 == -1 {
p1, ver1 = ver1[:], ""
} else {
p1, ver1 = ver1[:n1], ver1[n1+1:]
}
n2 = strings.IndexByte(ver2, '.')
if n2 == -1 {
p2, ver2 = ver2, ""
} else {
p2, ver2 = ver2[:n2], ver2[n2+1:]
}
if (p1[0] >= '0' && p1[0] <= '9') && (p2[0] >= '0' && p2[0] <= '9') { // all is digit
l1, _ := strconv.Atoi(p1)
l2, _ := strconv.Atoi(p2)
if l1 > l2 {
compare = 1
} else if l1 == l2 {
compare = 0
} else {
compare = -1
}
} else if !(p1[0] >= '0' && p1[0] <= '9') && !(p2[0] >= '0' && p2[0] <= '9') { // all digit
compare = special(p1, p2)
} else { // part is digit
if p1[0] >= '0' && p1[0] <= '9' { // is digit
compare = special("#N#", p2)
} else {
compare = special(p1, "#N#")
}
}
if compare != 0 || n1 == -1 || n2 == -1 {
break
}
}
if compare == 0 {
if ver1 != "" {
if ver1[0] >= '0' && ver1[0] <= '9' {
compare = 1
} else {
compare = vcompare(ver1, "#N#")
}
} else if ver2 != "" {
if ver2[0] >= '0' && ver2[0] <= '9' {
compare = -1
} else {
compare = vcompare("#N#", ver2)
}
}
}
return compare
}
// canonicalize
canonicalize = func(version string) string {
ver := []byte(version)
l := len(ver)
if l == 0 {
return ""
}
var buf = make([]byte, l*2)
j := 0
for i, v := range ver {
next := uint8(0)
if i+1 < l { // Have the next one
next = ver[i+1]
}
if v == '-' || v == '_' || v == '+' { // replace '-', '_', '+' to '.'
if j > 0 && buf[j-1] != '.' {
buf[j] = '.'
j++
}
} else if (next > 0) &&
(!(next >= '0' && next <= '9') && (v >= '0' && v <= '9')) ||
(!(v >= '0' && v <= '9') && (next >= '0' && next <= '9')) { // Insert '.' before and after a non-digit
buf[j] = v
j++
if v != '.' && next != '.' {
buf[j] = '.'
j++
}
continue
} else if !((v >= '0' && v <= '9') ||
(v >= 'a' && v <= 'z') || (v >= 'A' && v <= 'Z')) { // Non-letters and numbers
if j > 0 && buf[j-1] != '.' {
buf[j] = '.'
j++
}
} else {
buf[j] = v
j++
}
}
return string(buf[:j])
}
// compare special version forms
special = func(form1, form2 string) int {
found1, found2, len1, len2 := -1, -1, len(form1), len(form2)
// (Any string not found) < dev < alpha = a < beta = b < RC = rc < # < pl = p
forms := map[string]int{
"dev": 0,
"alpha": 1,
"a": 1,
"beta": 2,
"b": 2,
"RC": 3,
"rc": 3,
"#": 4,
"pl": 5,
"p": 5,
}
for name, order := range forms {
if len1 < len(name) {
continue
}
if strings.Compare(form1[:len(name)], name) == 0 {
found1 = order
break
}
}
for name, order := range forms {
if len2 < len(name) {
continue
}
if strings.Compare(form2[:len(name)], name) == 0 {
found2 = order
break
}
}
if found1 == found2 {
return 0
} else if found1 > found2 {
return 1
} else {
return -1
}
}
compare := vcompare(version1, version2)
switch operator {
case "<", "lt":
return compare == -1
case "<=", "le":
return compare != 1
case ">", "gt":
return compare == 1
case ">=", "ge":
return compare != -1
case "==", "=", "eq":
return compare == 0
case "!=", "<>", "ne":
return compare != 0
default:
panic("operator: invalid")
}
}
// ZipOpen zip_open()
func ZipOpen(filename string) (*zip.ReadCloser, error) {
return zip.OpenReader(filename)
}
// Pack pack()
func Pack(order binary.ByteOrder, data interface{}) (string, error) {
buf := new(bytes.Buffer)
err := binary.Write(buf, order, data)
if err != nil {
return "", err
}
return buf.String(), nil
}
// Unpack unpack()
func Unpack(order binary.ByteOrder, data string) (interface{}, error) {
var result []byte
r := bytes.NewReader([]byte(data))
err := binary.Read(r, order, &result)
if err != nil {
return nil, err
}
return result, nil
}
// Ternary Ternary expression
// max := Ternary(a > b, a, b).(int)
func Ternary(condition bool, trueVal, falseVal interface{}) interface{} {
if condition {
return trueVal
}
return falseVal
}
func StringTurnInt64(val string) (int64) {
intval,_ := strconv.ParseInt(val, 10, 64)
return intval
}
func StringTurnFloat64(val string)(float64) {
floatval,_ := strconv.ParseFloat(val, 64)
return floatval
}
func StringIndex(stringDemo,stringKey string) int{
return strings.Index(stringDemo,stringKey)
}
func Int64TurnString(intval int64)(stringval string) {
return strconv.FormatInt(intval,10)
}
func DateTurnInt64(datetime string)(timestamp int64){
loc,_ := time.LoadLocation("Asia/Shanghai")
timeObj,_ :=time.ParseInLocation("2006-01-02 15:04:05", datetime, loc)
return timeObj.Unix()
}
\ No newline at end of file
package logic
import (
"encoding/json"
"fmt"
"net/http"
"net/url"
"time"
)
const APIMD5STR string = "fh6y5t4rr351d2c3bryi"
const APIDOMAIN string = "http://localhost/phpinfo.php"
func SendMessage(mobile int64 , content string){
timeNow := time.Now().Second()
requestContent,_ := json.Marshal(map[string]string{"content":content})
requestTel,_ := json.Marshal([]int64{mobile})
resp,err := http.PostForm(APIDOMAIN,url.Values{
"data" : {string(requestContent)},
"touser" : {string(requestTel)},
"keyword" : {"user_credit_apply_check"},
"k1" : {Int64TurnString(int64(timeNow))},
"k2" : {Md5(Md5(Int64TurnString(int64(timeNow)))+APIMD5STR)},
"is_ignore" : {},
})
if err != nil {
fmt.Print(err)
}
defer resp.Body.Close()
}
package logic
import (
"fmt"
"io"
"os"
"time"
)
func check(e error) {
if e != nil {
panic(e)
}
}
/**
* 判断文件是否存在 存在返回 true 不存在返回false
*/
func checkFileIsExist(filename string) bool {
var exist = true
if _, err := os.Stat(filename); os.IsNotExist(err) {
exist = false
}
return exist
}
/*
@param writeString 写入文件字符串
@param file_pre 附加文件前缀
eg: logic.Loginfo("逾期统计开始","_yuqilv_");
*/
func Loginfo(writeString string,log_file_pre string) {
date := time.Now().Format("2006-01-02")
date2 := time.Now().Format("2006-01-02 15:04:05")
var filename = "./logs/"+date+log_file_pre+".txt"
var f *os.File
var err1 error
if checkFileIsExist(filename) { //如果文件存在
f, err1 = os.OpenFile(filename, os.O_APPEND, 0666) //打开文件
} else {
f, err1 = os.Create(filename) //创建文件
}
check(err1)
ss := StrReplace("\r\n","",writeString,1) //替换多余换行
io.WriteString(f,"\r\n"+date2+"----"+ss) //写入文件(字符串)
//fmt.Print(err)
}
/*
打印并且记录日志
*/
func LogWrite(log1 string,log_pre string,is_write int) {
if is_write == 1 {
fmt.Print(log1+"\r\n")
}
Loginfo(log1,log_pre)
}
func CheckErr(err error) {
if err != nil {
Loginfo(err.Error(),"error")
}
}
/**
from: http://www.isharey.com/?p=143
*/
//
//func main() {
//
// var wireteString = "测试n"
// var filename = "./output1.txt"
//
// fmt.Print(filename)
//
//
// var f *os.File
// var err1 error
// /***************************** 第一种方式: 使用 io.WriteString 写入文件 ***********************************************/
// if checkFileIsExist(filename) { //如果文件存在
// f, err1 = os.OpenFile(filename, os.O_APPEND, 0666) //打开文件
// fmt.Println("文件存在")
// } else {
// f, err1 = os.Create(filename) //创建文件
// fmt.Println("文件不存在")
// }
// check(err1)
// n, err1 := io.WriteString(f, wireteString) //写入文件(字符串)
// check(err1)
// fmt.Printf("写入 %d 个字节n", n)
//
// /***************************** 第二种方式: 使用 ioutil.WriteFile 写入文件 ***********************************************/
// var d1 = []byte(wireteString)
// err2 := ioutil.WriteFile("./output2.txt", d1, 0666) //写入文件(字节数组)
// check(err2)
//
// /***************************** 第三种方式: 使用 File(Write,WriteString) 写入文件 ***********************************************/
// f, err3 := os.Create("./output3.txt") //创建文件
// check(err3)
// defer f.Close()
// n2, err3 := f.Write(d1) //写入文件(字节数组)
// check(err3)
// fmt.Printf("写入 %d 个字节n", n2)
// n3, err3 := f.WriteString("writesn") //写入文件(字节数组)
// fmt.Printf("写入 %d 个字节n", n3)
// f.Sync()
//
// /***************************** 第四种方式: 使用 bufio.NewWriter 写入文件 ***********************************************/
// w := bufio.NewWriter(f) //创建新的 Writer 对象
// n4, err3 := w.WriteString("bufferedn")
// fmt.Printf("写入 %d 个字节n", n4)
// w.Flush()
// f.Close()
//}
package logic
import (
"encoding/json"
"io/ioutil"
"log"
"net/http"
"strconv"
"strings"
"time"
)
type TianYanChaCompanyInfo struct {
EstiblishTime float64 `json:"estiblishTime"`
CompanyOrgType string `json:"companyOrgType"`
SocialStaffNum float64 `json:"socialStaffNum"`
RegCapital string `json:"regCapital"`
LegalPersonName string `json:"legalPersonName"`
RegLocation string `json:"regLocation"`
OrgNumber string `json:"orgNumber"`
}
type ResultStruct struct {
Result TianYanChaCompanyInfo `json:"result"`
}
type TotalResultStruct struct {
Result TotalNumResultStruct `json:"result"`
}
type TotalNumResultStruct struct {
Total int64 `json:"total"`
Items []map[string]string `json:"items"`
}
type ChangeInfo struct {
ChangeTime int64 `json:"changeTime"`
ChangeItem int64 `json:"changeItem"`
}
const TIANYANCHATOKEN = "4920e638-52c6-43c5-bdec-78affa06bdbe"
//公司信息
const COMPANYINFOURL = "http://open.api.tianyancha.com/services/open/ic/baseinfoV2/2.0"
//法律诉讼
const LAWSUIT = "http://open.api.tianyancha.com/services/open/jr/lawSuit/2.0"
//法人变更次数
const CHANGEINFO = "http://open.api.tianyancha.com/services/open/ic/changeinfo/2.0"
func HttpGet(companyName string)(returnDatas map[string]string) {
var totalNum TotalResultStruct
var companyTycInfo ResultStruct
respBody := BasicHttpGet(COMPANYINFOURL,companyName)
json.Unmarshal(respBody,&companyTycInfo)
returnData := make(map[string]string)
//成立时间
returnData["establishment_time"] = strconv.FormatFloat((companyTycInfo.Result.EstiblishTime/1000), 'f', -1, 64)
returnData["legal_representative"] = companyTycInfo.Result.LegalPersonName
returnData["com_address"] = companyTycInfo.Result.RegLocation
returnData["com_organization"] = companyTycInfo.Result.OrgNumber
returnData["tianyancha_json"] = string(respBody)
//公司性质
//var companyOrgType string
//if strings.Contains(companyTycInfo.Result.CompanyOrgType,"上市") {
// companyOrgType = "1"
//}else if strings.Contains(companyTycInfo.Result.CompanyOrgType,"国企"){
// companyOrgType = "2"
//}else if strings.Contains(companyTycInfo.Result.CompanyOrgType,"央企"){
// companyOrgType = "3"
//}else{
// companyOrgType = "0"
//}
returnData["customer_property"] = "其它"
//参保人数
returnData["social_security_participants"] = strconv.FormatFloat(companyTycInfo.Result.SocialStaffNum,'f', -1, 64)
//注册资本
var capitalNum float64
if strings.Contains(companyTycInfo.Result.RegCapital,"万") {
capitalNum = StringTurnFloat64(companyTycInfo.Result.RegCapital[:StringIndex(companyTycInfo.Result.RegCapital,"万")]) * 10000
}else if strings.Contains(companyTycInfo.Result.RegCapital,"亿"){
capitalNum = StringTurnFloat64(companyTycInfo.Result.RegCapital[:StringIndex(companyTycInfo.Result.RegCapital,"亿")]) * 100000000
}else{
capitalNum = StringTurnFloat64(companyTycInfo.Result.RegCapital)
}
returnData["registered_capital"] = strconv.FormatFloat(capitalNum, 'f', -1, 64)
//------------------------------------两年内是否有法律诉讼---------------------------------------//
respBody = BasicHttpGet(LAWSUIT,companyName)
json.Unmarshal(respBody,&totalNum)
returnData["tianyancha_json"] += "||||"+string(respBody)
if totalNum.Result.Total > 0 {
returnData["two_years_no_lawsuit"] = "有"
}else{
returnData["two_years_no_lawsuit"] = "无"
}
//------------------------------------两年内是否有法律诉讼---------------------------------------//
//------------------------------------五年内法人变更---------------------------------------//
respBody = BasicHttpGet(CHANGEINFO,companyName)
json.Unmarshal(respBody,&totalNum)
returnData["tianyancha_json"] += "||||"+string(respBody)
var changeInfoNum int64
changeInfoNum = 0
for _,v := range totalNum.Result.Items{
if strings.Contains(v["changeItem"],"法人变更") && (DateTurnInt64(v["changeTime"]) + (365 * 86400)) < time.Now().Unix() {
changeInfoNum ++
}
}
returnData["five_legal_change"] = strconv.FormatInt(changeInfoNum,10)
//------------------------------------五年内法人变更---------------------------------------//
return returnData
}
func NetBasicHttpGet(url,name string)(respBody []byte) {
req, err := http.NewRequest("GET", url, nil)
q := req.URL.Query()
q.Add("pageNum","1")
q.Add("name",name)
req.URL.RawQuery = q.Encode()
req.Header.Set("Authorization",TIANYANCHATOKEN)
var resp *http.Response
resp, err = http.DefaultClient.Do(req)
body, err := ioutil.ReadAll(resp.Body)
if err != nil {
log.Print(err)
}
return body
}
//内网访问
func BasicHttpGet(url,name string)(respBody []byte) {
req, err := http.NewRequest("GET", "http://172.18.137.21/tyc_turn.php", nil)
q := req.URL.Query()
q.Add("pageNum","1")
q.Add("name",name)
q.Add("url",url)
q.Add("token",TIANYANCHATOKEN)
req.URL.RawQuery = q.Encode()
var resp *http.Response
resp, err = http.DefaultClient.Do(req)
body, err := ioutil.ReadAll(resp.Body)
if err != nil {
log.Print(err)
}
return body
}
\ No newline at end of file
package model
/*CREATE TABLE `lie_add_score` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT '加分项id',
`com_credits_id` int(11) unsigned NOT NULL DEFAULT '0' COMMENT '关联信用分id',
`project_name` varchar(50) NOT NULL DEFAULT '' COMMENT '项目名',
`info` varchar(150) NOT NULL DEFAULT '' COMMENT '信息备注',
`current_score` decimal(6,2) unsigned NOT NULL DEFAULT '0.00' COMMENT '得分 没有进行权重运算的得分',
`weight` decimal(5,2) unsigned NOT NULL DEFAULT '0.00' COMMENT '权重',
`final_score` decimal(6,2) NOT NULL DEFAULT '0.00' COMMENT '最终得分-终评分 进行了权重运算后的得分',
`status` tinyint(1) unsigned NOT NULL DEFAULT '1' COMMENT '1正常 0删除',
`create_time` int(11) unsigned NOT NULL DEFAULT '0',
`update_time` int(11) unsigned NOT NULL DEFAULT '0',
PRIMARY KEY (`id`),
KEY `company_code` (`com_credits_id`)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8mb4 COMMENT='加分项表';*/
\ No newline at end of file
package model
//
//CREATE TABLE `lie_basic_info` (
//`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '业务明细ID',
//`erp_company_code` varchar(20) NOT NULL DEFAULT '' COMMENT 'erp公司编码',
//`first_order_time` int(11) NOT NULL COMMENT '首次下单时间',
//`total_order_amount` decimal(10,2) NOT NULL COMMENT '历史交易总额(收款总额)',
//`total_gross_profit` decimal(10,2) NOT NULL COMMENT '历史累计毛利',
//`recently_average_amount` decimal(10,2) NOT NULL COMMENT '近6个月平均交易额',
//`recently_max_amount` decimal(10,2) NOT NULL COMMENT '近6个月最大交易额',
//`last_month_amount` decimal(10,2) NOT NULL COMMENT '上个月交易额',
//`reveive_period_aomunt` decimal(10,2) NOT NULL COMMENT '已获账期金额',
//`total_delay_times` int(11) NOT NULL COMMENT '历史逾期次数',
//`mianly_class` varchar(255) NOT NULL COMMENT '主要交易品类',
//`create_time` int(11) NOT NULL COMMENT '创建时间',
//`update_time` int(11) NOT NULL COMMENT '更新时间',
//`recently_three_average_amount` decimal(10,2) NOT NULL COMMENT '近3个月最大交易额',
//`recently_three_max_amount` decimal(10,2) NOT NULL COMMENT '近3个月最大交易额',
//PRIMARY KEY (`id`)
//) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb4 COMMENT='业务信息';
\ No newline at end of file
package model
type ComCreditsBasicInfos struct {
Id int64 `json:"id"` //'模型条目ID'
ComCreditsId int64 `json:"com_credits_id"` //'关联信用分id'
ComName string `json:"com_name"` //'公司名称'
ComOrganization string `json:"com_organization"` //'组织结构代码'
EstanlishmentTime int64 `json:"establishment_time"` //'公司成立时间'
ComLeader string `json:"com_leader"` //'公司负责人'
RegisteredCapital string `json:"registered_capital"` //'注册资本'
CustomerProperty int64 `json:"customer_property"` //'客户性质'
ScoreTime int64 `json:"score_time"` //'评分时间'
ComAddress string `json:"com_address"` //'公司地址'
LegalRepresentative string `json:"legal_representative"` //'法定代表人'
LegalFixedTelephone string `json:"legal_fixed_telephone"` //'法定代表人固定电话'
LegalMobilePhone string `json:"legal_mobile_phone"` //'法定代表人移动电话'
ActualController string `json:"actual_controller"` //'实控人'
ActualFixTelephone string `json:"actual_fix_telephone"` //'企业实控人固定电话'
ActualMobilePhone string `json:"actual_mobile_phone"` //'企业实控人移动电话'
ComContact string `json:"com_contact"` //'企业联系人'
ContactFixTelephone string `json:"contact_fix_telephone"` //'企业联系人固定电话'
ContactMobilePhone string `json:"contact_mobile_phone"` //'企业联系人移动电话'
FiveLegalChange int8 `json:"five_legal_change"`
YearTaxPayable float64 `json:"year_tax_payable"`
TwoYearsnoLawsuit int8 `json:"two_years_no_lawsuit"`
SocialSecurityParticiPant int16 `json:"social_security_participants"`
IdCardFront string `json:"id_card_front"`
IdCardBack string `json:"id_card_back"`
PayDutyPic string `json:"pay_duty_pic"`
TianyanchaJson string `json:"tianyancha_json"`
TycSelectNum int64 `json:"tyc_select_num"`
CreateTime int64 `json:"create_time"` //'创建时间'
UpdateTime int64 `json:"update_time"` //'更新时间'
}
/*CREATE TABLE `lie_com_basicinfos` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键',
`com_credits_id` int(11) unsigned NOT NULL DEFAULT '0' COMMENT '关联信用分id',
`com_name` varchar(80) NOT NULL DEFAULT '' COMMENT '公司名称',
`com_organization` varchar(30) NOT NULL DEFAULT '' COMMENT '组织结构代码',
`establishment_time` int(11) unsigned NOT NULL DEFAULT '0' COMMENT '公司成立时间',
`com_leader` varchar(60) NOT NULL DEFAULT '' COMMENT '公司负责人',
`registered_capital` decimal(14,4) unsigned NOT NULL DEFAULT '0.0000' COMMENT '注册资本',
`customer_property` tinyint(1) unsigned NOT NULL DEFAULT '0' COMMENT '客户性质 0 其它 1上市 2国企 3央企',
`score_time` int(11) unsigned NOT NULL DEFAULT '0' COMMENT '评分时间',
`com_address` varchar(100) NOT NULL DEFAULT '' COMMENT '公司地址',
`legal_representative` varchar(50) NOT NULL DEFAULT '' COMMENT '法定代表人',
`legal_fixed_telephone` varchar(15) NOT NULL DEFAULT '' COMMENT '法定代表人固定电话',
`legal_mobile_phone` char(11) NOT NULL DEFAULT '' COMMENT '法定代表人移动电话',
`actual_controller` varchar(50) NOT NULL DEFAULT '' COMMENT '实控人',
`actual_fix_telephone` varchar(15) NOT NULL DEFAULT '' COMMENT '企业实控人固定电话',
`actual_mobile_phone` char(11) NOT NULL DEFAULT '' COMMENT '企业实控人移动电话',
`com_contact` varchar(50) NOT NULL DEFAULT '' COMMENT '企业联系人',
`contact_fix_telephone` varchar(15) NOT NULL DEFAULT '' COMMENT '企业联系人固定电话',
`contact_mobile_phone` char(11) NOT NULL DEFAULT '' COMMENT '企业联系人移动电话',
`five_legal_change` tinyint(1) unsigned NOT NULL DEFAULT '0' COMMENT '5年内法人变更次数',
`year_tax_payable` decimal(14,4) unsigned NOT NULL DEFAULT '0.0000' COMMENT '年纳税额',
`two_years_no_lawsuit` tinyint(1) unsigned NOT NULL DEFAULT '0' COMMENT '近两年内有无诉讼 1有 ',
`social_security_participants` smallint(10) unsigned NOT NULL DEFAULT '0' COMMENT '社保参保人数',
`id_card_front` varchar(100) NOT NULL DEFAULT '' COMMENT '身份证正面照',
`id_card_back` varchar(100) NOT NULL DEFAULT '' COMMENT '身份证反面照',
`pay_duty_pic` varchar(100) NOT NULL DEFAULT '' COMMENT '纳税凭证照片',
`tianyancha_json` varchar(500) NOT NULL DEFAULT '' COMMENT '天眼查返回的json',
`tyc_select_num` tinyint(1) unsigned NOT NULL DEFAULT '0' COMMENT '查询次数',
`create_time` int(11) unsigned NOT NULL DEFAULT '0',
`update_time` int(11) unsigned NOT NULL DEFAULT '0',
PRIMARY KEY (`id`),
KEY `company_code` (`com_credits_id`)
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8mb4 COMMENT='公司基础信息';*/
\ No newline at end of file
package model
type ComCredits struct {
Id int64 `json:"id"`
ApplyAccount string `json:"apply_account"`
ErpCompanyCode string `json:"erp_company_code"`
CompanyName string `json:"company_name"`
StaticCreditScore float64 `json:"static_credit_score"`
DynamicCreditScore float64 `json:"dynamic_credit_score"`
TotalCreditScore float64 `json:"total_credit_score"`
Creator string `json:"creator"`
Status int8 `json:"status"`
BlacklistHit string `json:"blacklist_hit"`
CreditInvestResult string `json:"credit_invest_result"`
IchuntHuntingCore string `json:"ichunt_hunting_core"`
RecommendedAmount float64 `json:"recommended_amount"`
RecomTimeLimit string `json:"recom_time_limit"`
ScoreTime int64 `json:"score_time"`
CreateTime int64 `json:"create_time"`
UpdateTime int64 `json:"update_time"`
}
/*CREATE TABLE `lie_com_credits` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键id',
`apply_account` varchar(11) NOT NULL DEFAULT '' COMMENT '申请账号 手机号 法人电话',
`erp_company_code` varchar(20) NOT NULL DEFAULT '' COMMENT 'erp公司编码',
`company_name` varchar(60) NOT NULL DEFAULT '' COMMENT '公司名字',
`static_credit_score` decimal(6,2) unsigned NOT NULL DEFAULT '0.00' COMMENT '静态信用分',
`dynamic_credit_score` decimal(6,2) unsigned NOT NULL DEFAULT '0.00' COMMENT '动态信用分',
`total_credit_score` decimal(6,2) NOT NULL DEFAULT '0.00' COMMENT '总信用分',
`creator` varchar(30) NOT NULL DEFAULT '' COMMENT '评分人',
`status` tinyint(1) unsigned NOT NULL DEFAULT '0' COMMENT '1已申请 5待评分 10已评分',
`blacklist_hit` varchar(50) NOT NULL DEFAULT '' COMMENT '黑名单命中',
`credit_invest_result` varchar(50) NOT NULL DEFAULT '' COMMENT '征信达标结果',
`ichunt_hunting_core` enum('H','G','F','E','D','C','B','A') NOT NULL COMMENT '猎芯网评分分级',
`recommended_amount` decimal(12,2) NOT NULL DEFAULT '0.00' COMMENT '建议额度',
`recom_time_limit` varchar(30) NOT NULL DEFAULT '' COMMENT '建议区间',
`score_time` int(11) unsigned NOT NULL DEFAULT '0' COMMENT '评分时间',
`create_time` int(11) unsigned NOT NULL DEFAULT '0' COMMENT '创建时间',
`update_time` int(11) unsigned NOT NULL DEFAULT '0' COMMENT '修改时间',
PRIMARY KEY (`id`),
UNIQUE KEY `company_code` (`erp_company_code`) USING BTREE,
UNIQUE KEY `company_name` (`company_name`) USING BTREE,
KEY `company_code_2` (`erp_company_code`,`status`,`create_time`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8mb4 COMMENT='公司信用分管理';*/
\ No newline at end of file
package model
//CREATE TABLE `lie_credit_score_fields` (
//`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
//`company_has_liabilities` tinyint(1) unsigned NOT NULL DEFAULT '0' COMMENT '企业有无负债 1有 0没有',
//`history overdue` tinyint(1) unsigned NOT NULL DEFAULT '0' COMMENT '历史有无逾期 1有 0无',
//`age` tinyint(1) unsigned NOT NULL DEFAULT '0' COMMENT '年龄',
//`marital_status` tinyint(1) unsigned NOT NULL DEFAULT '0' COMMENT '婚姻状况 1是 0否',
//`account_ratio` decimal(6,2) unsigned NOT NULL DEFAULT '0.00' COMMENT '违约账户比 50.23',
//`guaranty` tinyint(1) unsigned NOT NULL DEFAULT '0' COMMENT '对外担保 1有 0没有',
//`two_years_th_days_overdue_times` tinyint(1) unsigned NOT NULL DEFAULT '0' COMMENT '近2年内最大逾期金额',
//`two_years_max_overdue_amount` decimal(14,4) NOT NULL,
//`is_exist_now_overdue` tinyint(1) unsigned NOT NULL DEFAULT '0' COMMENT '1 是 0否',
//`presence_of_mortgage` tinyint(1) unsigned NOT NULL DEFAULT '0' COMMENT '有无房贷 1有 0没有',
//`two_months_credit_view_nums` tinyint(1) unsigned NOT NULL DEFAULT '0' COMMENT '近两个月征信查询次数',
//`credit_card_total` decimal(14,4) unsigned NOT NULL DEFAULT '0.0000' COMMENT '信用卡总额度',
//`maximum_credit_card_limit` decimal(14,4) unsigned NOT NULL DEFAULT '0.0000' COMMENT '单张信用卡最高额度',
//`com_credits_id` int(11) unsigned NOT NULL DEFAULT '0' COMMENT '关联公司信用id',
//`type` tinyint(1) unsigned NOT NULL DEFAULT '0' COMMENT '1个人 2企业',
//`create_time` int(11) unsigned NOT NULL DEFAULT '0',
//`update_time` int(11) unsigned NOT NULL DEFAULT '0',
//PRIMARY KEY (`id`)
//) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='征信相关评分字段表';
\ No newline at end of file
package model
type Grade struct {
Id int64 `json:"id"`
Grade int64 `json:"grade"`
MinScore float64 `json:"min_score"`
MaxScore float64 `json:"max_score"`
RecommendedAmount float64 `json:"recommended_amount"`
RecommendedLimit string `json:"recommended_limit"`
Status int64 `json:"status"`
Creator string `json:"creator"`
CreateTime int64 `json:"create_time"`
UpdateTime int64 `json:"update_time"`
}
/*CREATE TABLE `lie_grade` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT '信用等级ID',
`grade` tinyint(1) unsigned NOT NULL DEFAULT '0' COMMENT '等级,1-A,2-B, 3-C, 4-D, 5-E, 6-F',
`min_score` decimal(6,2) unsigned NOT NULL DEFAULT '0.00' COMMENT '最小分值',
`max_score` decimal(6,2) unsigned NOT NULL DEFAULT '0.00' COMMENT '最大分值',
`recommended_amount` decimal(12,2) unsigned NOT NULL DEFAULT '0.00' COMMENT '建议额度',
`recommended_limit` varchar(32) CHARACTER SET utf8 NOT NULL DEFAULT '' COMMENT '建议期限',
`status` tinyint(1) NOT NULL DEFAULT '1' COMMENT '状态,1-启用,-1-禁用',
`creator` varchar(64) CHARACTER SET utf8 NOT NULL DEFAULT '' COMMENT '创建人',
`create_time` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '创建时间',
`update_time` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '更新时间',
PRIMARY KEY (`id`),
UNIQUE KEY `grade` (`grade`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8mb4 COMMENT='信用等级表';*/
\ No newline at end of file
package model
/*
CREATE TABLE `lie_com_credits` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键id',
`apply_account` varchar(11) NOT NULL DEFAULT '' COMMENT '申请账号 手机号 法人电话',
`erp_company_code` varchar(20) NOT NULL DEFAULT '' COMMENT 'erp公司编码',
`company_name` varchar(60) NOT NULL DEFAULT '' COMMENT '公司名字',
`static_credit_score` decimal(6,2) unsigned NOT NULL DEFAULT '0.00' COMMENT '静态信用分',
`dynamic_credit_score` decimal(6,2) unsigned NOT NULL DEFAULT '0.00' COMMENT '动态信用分',
`total_credit_score` decimal(6,2) NOT NULL DEFAULT '0.00' COMMENT '总信用分',
`status` tinyint(1) unsigned NOT NULL DEFAULT '0' COMMENT '1已申请 5待评分 10已评分',
`blacklist_hit` varchar(50) NOT NULL DEFAULT '' COMMENT '黑名单命中',
`credit_invest_result` varchar(50) NOT NULL DEFAULT '' COMMENT '征信达标结果',
`ichunt_hunting_core` enum('H','G','F','E','D','C','B','A') NOT NULL COMMENT '猎芯网评分分级',
`recommended_amount` decimal(12,2) NOT NULL DEFAULT '0.00' COMMENT '建议额度',
`recom_time_limit` varchar(30) NOT NULL DEFAULT '' COMMENT '建议区间',
`admin_id` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '评分人ID',
`admin_name` varchar(30) NOT NULL DEFAULT '' COMMENT '评分人',
`score_time` int(11) unsigned NOT NULL DEFAULT '0' COMMENT '评分时间',
`create_time` int(11) unsigned NOT NULL DEFAULT '0' COMMENT '创建时间',
`update_time` int(11) unsigned NOT NULL DEFAULT '0' COMMENT '修改时间',
PRIMARY KEY (`id`),
UNIQUE KEY `company_code` (`erp_company_code`) USING BTREE,
UNIQUE KEY `company_name` (`company_name`) USING BTREE,
KEY `company_code_2` (`erp_company_code`,`status`,`create_time`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8mb4 COMMENT='公司信用分管理';
*/
\ No newline at end of file
package model
// Kratos hello kratos.
type Kratos struct {
Hello string
type Model struct {
Id int64 `json:"id"`
Project_id string `json:"project_id"`
Project_name string `json:"project_name"`
Classify_type int `json:"classify_type"`
}
//CREATE TABLE `lie_model` (
//`id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT '模型ID',
//`type` tinyint(1) unsigned NOT NULL DEFAULT '0' COMMENT '项目类型:1静态 2动态 3银行端',
//`project_id` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '项目ID',
//`project_name` varchar(128) CHARACTER SET utf8 NOT NULL DEFAULT '' COMMENT '项目名称',
//`classify_type` tinyint(1) unsigned NOT NULL DEFAULT '0' COMMENT '分类类型,1-公司信息,2-企业征信,3-个人征信,4-历史交易情况,5-加分项,6-动态模型',
//`numeric_type` tinyint(2) unsigned NOT NULL DEFAULT '0' COMMENT '数值类型',
//`unit` tinyint(2) unsigned NOT NULL DEFAULT '0' COMMENT '单位',
//`full_score` int(5) unsigned NOT NULL DEFAULT '0' COMMENT '满分分值',
//`weight` decimal(5,2) unsigned NOT NULL DEFAULT '0.00' COMMENT '权重',
//`ladder` int(3) unsigned NOT NULL DEFAULT '0' COMMENT '阶梯(项目阶梯总数目)',
//`max_score` int(5) unsigned NOT NULL DEFAULT '0' COMMENT '最高分值(项目各阶梯分值之和)',
//`status` tinyint(1) NOT NULL DEFAULT '1' COMMENT '状态,1-启用,-1-禁用',
//`creator` varchar(64) CHARACTER SET utf8 NOT NULL DEFAULT '' COMMENT '创建人',
//`create_time` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '创建时间',
//`update_time` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '更新时间',
//PRIMARY KEY (`id`),
//KEY `project_time` (`classify_type`,`create_time`) USING BTREE,
//KEY `status_time` (`status`,`create_time`) USING BTREE
//) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=utf8mb4 COMMENT='模型配置表'
\ No newline at end of file
package model
//CREATE TABLE `lie_model_topset` (
//`id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT '模型ID',
//`type` tinyint(1) unsigned NOT NULL DEFAULT '1' COMMENT '1静态 2动态 3银行',
//`project_id` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '项目ID',
//`project_name` varchar(128) CHARACTER SET utf8 NOT NULL DEFAULT '' COMMENT '项目名称',
//`full_score` int(5) unsigned NOT NULL DEFAULT '0' COMMENT '满分分值',
//`weight` decimal(5,2) unsigned NOT NULL DEFAULT '0.00' COMMENT '权重',
//`status` tinyint(1) NOT NULL DEFAULT '1' COMMENT '状态,1-启用,-1-禁用',
//`creator` varchar(64) CHARACTER SET utf8 NOT NULL DEFAULT '' COMMENT '创建人',
//`create_time` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '创建时间',
//`update_time` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '更新时间',
//PRIMARY KEY (`id`),
//UNIQUE KEY `project_id` (`project_id`) USING BTREE,
//KEY `status_time` (`status`,`create_time`) USING BTREE,
//KEY `type_time` (`type`,`create_time`) USING BTREE
//) ENGINE=InnoDB AUTO_INCREMENT=18 DEFAULT CHARSET=utf8mb4 COMMENT='模型配置表-一级分类配置';
\ No newline at end of file
package model
type ModelItems struct {
Id int64 `json:"id"` //'模型条目ID'
ModelId int64 `json:"model_id"` //'关联模型ID'
ProjectId int64 `json:"project_id"` //'项目ID'
ProjectName int64 `json:"project_name"` //'项目名称'
FullScore int64 `json:"full_score"` //'满分分值'
LadderRangeMin string `json:"ladder_range_min"` //'阶梯范围最小值'
LadderRangeMax string `json:"ladder_range_max"` //'阶梯范围最大值'
LadderText string `json:"id"` //'阶梯信息文本'
Score int64 `json:"id"` //'阶梯分值'
Creator string `json:"id"` //'创建人'
}
/*CREATE TABLE `lie_model_items` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT '模型条目ID',
`model_id` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '关联模型ID',
`project_id` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '项目ID',
`project_name` varchar(128) CHARACTER SET utf8 NOT NULL DEFAULT '' COMMENT '项目名称',
`full_score` decimal(5,2) unsigned NOT NULL DEFAULT '0.00' COMMENT '满分分值',
`ladder_range_min` varchar(10) CHARACTER SET utf8 NOT NULL DEFAULT '' COMMENT '阶梯范围最小值',
`ladder_range_max` varchar(10) CHARACTER SET utf8 NOT NULL DEFAULT '' COMMENT '阶梯范围最大值',
`ladder_text` text CHARACTER SET utf8 NOT NULL COMMENT '阶梯信息文本',
`score` decimal(5,2) unsigned NOT NULL DEFAULT '0.00' COMMENT '阶梯分值',
`creator` varchar(64) CHARACTER SET utf8 NOT NULL DEFAULT '' COMMENT '创建人',
`create_time` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '创建时间',
`update_time` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '更新时间',
PRIMARY KEY (`id`),
KEY `model_id` (`model_id`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=28 DEFAULT CHARSET=utf8mb4 COMMENT='模型阶梯配置表';*/
\ No newline at end of file
package model
type Scores struct {
Id int64 `json:"id"`
Type int8 `json:"type"`
ProjectPid int8 `json:"project_pid"`
ProjectId int8 `json:"project_id"`
TotalScore float64 `json:"total_score"`
CurrentScore float64 `json:"current_score"`
Weight float64 `json:"weight"`
FinalScore float64 `json:"final_score"`
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` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`type` tinyint(1) unsigned NOT NULL DEFAULT '0' COMMENT '1 静态模型 2动态模型 3银行端',
`project_pid` smallint(4) unsigned NOT NULL DEFAULT '0' COMMENT '模型pid',
`project_id` smallint(4) unsigned NOT NULL DEFAULT '0' COMMENT '模型id',
`total_score` decimal(6,2) unsigned NOT NULL DEFAULT '0.00' COMMENT '总分',
`current_score` decimal(6,2) unsigned NOT NULL DEFAULT '0.00' COMMENT '得分 没有进行权重运算的得分',
`weight` decimal(5,2) unsigned NOT NULL DEFAULT '0.00' COMMENT '权重',
`final_score` decimal(6,2) unsigned NOT NULL DEFAULT '0.00' COMMENT '最终得分-终评分 进行了权重运算后的得分',
`com_credits_id` int(11) unsigned NOT NULL DEFAULT '0' COMMENT '关联信用分id',
`create_time` int(11) unsigned NOT NULL DEFAULT '0',
`update_time` int(11) unsigned NOT NULL DEFAULT '0',
PRIMARY KEY (`id`),
UNIQUE KEY `type_2` (`type`,`project_pid`,`project_id`,`com_credits_id`) USING BTREE,
KEY `type` (`type`,`project_pid`,`project_id`)
) ENGINE=InnoDB AUTO_INCREMENT=13 DEFAULT CHARSET=utf8mb4 COMMENT='信用分统计-参数评分';*/
\ No newline at end of file
/*
动态模型server
*/
package service
import (
"context"
)
//动态模型服务
func (s *Service) DongRun(ctx context.Context,project_id int,erp_company_code string) (res []map[string]interface{}, err error) {
res, err = s.dao.DongMain(ctx,project_id,erp_company_code)
return
}
......@@ -2,12 +2,11 @@ package service
import (
"context"
"fmt"
"kaopu-server/internal/dao"
"kaopu-server/internal/model"
"github.com/bilibili/kratos/pkg/conf/paladin"
"github.com/pkg/errors"
"kaopu-server/internal/dao"
"kaopu-server/internal/logic"
"kaopu-server/internal/model"
)
// Service service.
......@@ -53,7 +52,114 @@ func (s *Service) GetUserList(ctx context.Context) (res []*model.Users, err erro
//调用DB方法,获取会员数据
res, _ = s.dao.GetUserList(ctx)
fmt.Println(res)
//fmt.Println(res)
return
}
//----------静态开始
// 获取公司用户列表
func (s *Service) GetCompanyCresitsList(c context.Context) (res []map[string]string, err error) {
//调用DB方法,获取会员数据
res, err = s.dao.GetCompanyCresitsList(c)
logic.CheckErr(err)
return
}
// 获取公司用户列表
func (s *Service) GetCompanyBaseInfoByCid(c context.Context, companyId int64) (res map[string]string, err error) {
//调用DB方法,获取会员数据
res, err = s.dao.GetCompanyBaseInfoByCid(c,companyId)
logic.CheckErr(err)
return
}
// 获取公司征信信息
func (s *Service) GetCompanyScoreFieldsByCid(c context.Context, companyId int64) (res map[string]string, err error) {
//调用DB方法,获取会员数据
res, err = s.dao.GetCompanyScoreFieldsByCid(c,companyId)
logic.CheckErr(err)
return
}
// 获取公司历史信息
func (s *Service) GetBasicInfoByCid(c context.Context, erpCompanyCode string) (res map[string]string, err error) {
//调用DB方法,获取会员数据
res, err = s.dao.GetBasicInfoByCid(c,erpCompanyCode)
logic.CheckErr(err)
return
}
// 获取模型数据
func (s *Service) GetCompanyModelByProjectid(c context.Context, projectId int64) (res map[string]string, err error) {
//调用DB方法,获取会员数据
res, err = s.dao.GetCompanyModelByProjectid(c,projectId)
logic.CheckErr(err)
return
}
// 获取公司加分项
func (s *Service) GetCompanyAddSore(c context.Context, companyId int64) (res []map[string]string, err error) {
//调用DB方法,获取会员数据
res, err = s.dao.GetCompanyAddSoreByCid(c,companyId)
logic.CheckErr(err)
return
}
//获取模型的详细数据
func (s *Service)GetCompanyModelItemsByProjectidWitchString(c context.Context, project_id int64 , stringVal string) (res map[string]string, err error){
res,err = s.dao.GetCompanyModelItemsByProjectidWitchString(c, project_id , stringVal)
logic.CheckErr(err)
return
}
//获取模型的头部信息
func (s *Service)GetModelTopsetByProjectId(c context.Context, companyId int64) (res map[string]string, err error){
res,err = s.dao.GetModelTopsetByProjectId(c,companyId)
logic.CheckErr(err)
return
}
func (s *Service)GetCompanyModelItemsByProjectid(c context.Context, project_id int64 , score float64) (res map[string]string, err error){
res,err = s.dao.GetCompanyModelItemsByProjectid(c, project_id , score )
return
}
// 修改公司静态加分项
func (s *Service) UpdateStaticSumScores(c context.Context,com_credits model.ComCredits) (res int64, err error) {
//调用DB方法,获取会员数据
res, err = s.dao.UpdateStaticSumScores(c,com_credits)
logic.CheckErr(err)
return
}
// 修改公司静态加分项
func (s *Service) InsertScores(c context.Context,score model.Scores) (res int64, err error) {
//调用DB方法,获取会员数据
res, err = s.dao.InsertScores(c,score)
logic.CheckErr(err)
return
}
func (s *Service)GetCompanyAddSoreByCid(c context.Context, companyId int64) (res []map[string]string, err error){
//调用DB方法,获取会员数据
res, err = s.dao.GetCompanyAddSoreByCid(c,companyId)
logic.CheckErr(err)
return
}
//----------静态结束
\ No newline at end of file
File mode changed
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