Create & Init Project...

This commit is contained in:
2019-04-22 18:49:16 +08:00
commit fc4fa37393
25440 changed files with 4054998 additions and 0 deletions

View File

@@ -0,0 +1,52 @@
package(default_visibility = ["//visibility:public"])
load(
"@io_bazel_rules_go//go:def.bzl",
"go_test",
"go_library",
)
go_test(
name = "go_default_test",
srcs = ["service_test.go"],
embed = [":go_default_library"],
rundir = ".",
tags = ["automanaged"],
deps = [
"//app/job/main/credit-timer/conf:go_default_library",
"//library/log:go_default_library",
"//vendor/github.com/smartystreets/goconvey/convey:go_default_library",
],
)
go_library(
name = "go_default_library",
srcs = [
"jury.go",
"kpi_func.go",
"service.go",
],
importpath = "go-common/app/job/main/credit-timer/service",
tags = ["automanaged"],
visibility = ["//visibility:public"],
deps = [
"//app/job/main/credit-timer/conf:go_default_library",
"//app/job/main/credit-timer/dao:go_default_library",
"//app/job/main/credit-timer/model:go_default_library",
"//library/log:go_default_library",
],
)
filegroup(
name = "package-srcs",
srcs = glob(["**"]),
tags = ["automanaged"],
visibility = ["//visibility:private"],
)
filegroup(
name = "all-srcs",
srcs = [":package-srcs"],
tags = ["automanaged"],
visibility = ["//visibility:public"],
)

View File

@@ -0,0 +1,285 @@
package service
import (
"context"
"time"
"go-common/app/job/main/credit-timer/model"
"go-common/library/log"
)
func (s *Service) caseProc(ctx context.Context) {
affect, err := s.dao.UpdateCaseEndTime(ctx, time.Now())
log.Info("UpdateCaseEndTime affect %d err %v", affect, err)
if s.c.Judge.CaseEndVoteTotal > 0 {
affect, err = s.dao.UpdateCaseEndVote(ctx, s.c.Judge.CaseEndVoteTotal, time.Now().Add(time.Duration(s.c.Judge.ReservedTime)))
log.Info("UpdateCaseEndVote affect %d err %v", affect, err)
}
}
func (s *Service) loadConf(ctx context.Context) {
vTotal, err := s.dao.LoadConf(ctx)
if err != nil {
log.Error("loadConf error(%v)", err)
return
}
s.c.Judge.CaseEndVoteTotal = vTotal
}
func (s *Service) juryProc(c context.Context) {
affect, err := s.dao.UpdateJury(c, time.Now())
log.Info("update jury affect %d err %v", affect, err)
}
func (s *Service) voteProc(c context.Context) {
affect, err := s.dao.UpdateVote(c, time.Now())
log.Info("update vote affect %d err %v", affect, err)
}
// ComputePoint compute KPI point.
func (s *Service) ComputePoint(c context.Context, mid int64) (r model.KpiPoint, err error) {
var (
voteTotal, voteRight, blockedTotal, activeDays, opinionNums, opinionQuality int64
voteRightViolate, voteRightLegal, likes, hates int64
//vr:投准率 vf:投准率系数 af:活跃系数 bf:违规系数 of:观点数量系数 oqf:观点质量系数
vr, vf, af, bf, of, oqf float64
point float64
begin, end string
)
begin = time.Now().AddDate(0, 0, -30).Format("2006-01-02")
end = time.Now().Format("2006-01-02")
if blockedTotal, err = s.dao.CountBlocked(c, mid, begin, end); err != nil {
return
}
if blockedTotal == 0 {
bf = float64(1)
}
if voteTotal, err = s.dao.CountVoteTotal(c, mid, begin, end); err != nil {
return
}
if voteRightViolate, err = s.dao.CountVoteRightViolate(c, mid, begin, end); err != nil {
return
}
if voteRightLegal, err = s.dao.CountVoteRightLegal(c, mid, begin, end); err != nil {
return
}
voteRight = voteRightViolate + voteRightLegal
if voteTotal > 0 {
vr = float64(voteRight) / float64(voteTotal)
vf = s.voteRightRatio(vr)
}
if activeDays, err = s.dao.CountVoteActive(c, mid, begin, end); err != nil {
return
}
af = s.activeDaysRatio(activeDays)
if opinionNums, err = s.dao.CountOpinion(c, mid, begin, end); err != nil {
return
}
of = s.opinionNumsRatio(opinionNums)
if likes, hates, err = s.dao.OpinionQuality(c, mid, begin, end); err != nil {
return
}
opinionQuality = likes - hates
oqf = s.opinionQualityRatio(opinionQuality)
log.Info("mid:%d voteTotal:%v vr:%v vf:%v af:%v bf:%v of:%v oqf:%v", mid, voteTotal, vr, vf, af, bf, of, oqf)
point = float64(voteTotal) * vr * vf * af * bf * of * oqf * 100
r.Point = int64(point)
r.ActiveDays = activeDays
r.Day = time.Now()
r.Mid = mid
r.VoteTotal = voteTotal
r.VoteRadio = int64(vr * 100)
r.BlockedTotal = blockedTotal
r.OpinionNum = opinionNums
r.OpinionLikes = likes
r.OpinionHates = hates
return
}
func (s *Service) kpiPointProc(c context.Context) (err error) {
var (
mids []int64
mid int64
r model.KpiPoint
)
if mids, err = s.dao.JuryList(c); err != nil {
log.Error("kpiPoint err(%v)", err)
return
}
for _, mid = range mids {
if r, err = s.ComputePoint(c, mid); err != nil {
log.Error("computePoint err(%v)", err)
continue
}
s.dao.UpdateKPIPoint(c, &r)
}
return
}
// KPIProc KPI process.
func (s *Service) KPIProc(c context.Context) (err error) {
var (
ps []model.Kpi
res []model.KpiPoint
k model.KpiPoint
kd model.KpiData
at int64
day string
m int64
)
day = time.Now().Format("2006-01-02")
if res, err = s.dao.KPIPointDay(c, day); err != nil {
log.Error("kpiPoint(%s) err(%v)", day, err)
}
for _, k = range res {
a := model.Kpi{}
a.Point = k.Point
if len(ps) == 0 {
a.PreCount = 0
m = 1
ps = append(ps, a)
continue
}
if ps[len(ps)-1].Point == k.Point {
m = m + 1
continue
}
a.PreCount = m
ps = append(ps, a)
m = m + 1
}
at = int64(len(res))
d := time.Now()
for _, k = range res {
if k.Expired.Format("2006-01-02") != day {
log.Info("Expired(%s)!=day(%s)", k.Expired.Format("2006-01-02"), day)
continue
}
for i, r := range ps {
log.Info("RankPer r(%+v) k(%+v)", r, k)
if r.Point == k.Point {
b := model.Kpi{}
b.Point = k.Point
b.Rank = int64(i + 1)
b.RankPer = (r.PreCount + 1) * 100 / at
b.RankTotal = at
p := b.RankPer
if p == 0 {
b.Rate = 1
b.RankPer = 1
} else if p > 0 && p <= 10 {
b.Rate = 1
} else if p > 10 && p <= 25 {
b.Rate = 2
} else if p > 25 && p <= 40 {
b.Rate = 3
} else if p > 40 && p <= 60 {
b.Rate = 4
} else if p > 60 && p <= 100 {
b.Rate = 5
}
if r.Point == 0 {
b.Rate = 5
}
b.Day = d
b.Mid = k.Mid
if err = s.dao.UpdateKPI(c, &b); err != nil {
log.Error("dao.UpdateKPI(%+v) err(%v)", b, err)
}
kd.KpiPoint = k
end := k.Day
begin := k.Day.AddDate(0, 0, -30)
count, _ := s.dao.CountVoteByTime(c, k.Mid, begin, end)
kd.VoteRealTotal = count
if err = s.dao.UpdateKPIData(c, &kd); err != nil {
log.Error("dao.UpdateKPIData(%+v) err(%v)", kd, err)
}
break
}
}
}
return
}
// FixKPI fix kpi.
func (s *Service) FixKPI(c context.Context, year, month, dd int, mid int64) (res []model.KpiPoint, err error) {
var (
ps []model.Kpi
k model.KpiPoint
kd model.KpiData
at int64
day string
m int64
)
t := time.Date(year, time.Month(month), dd, 0, 0, 0, 0, time.UTC)
day = t.Format("2006-01-02")
if res, err = s.dao.KPIPointDay(c, day); err != nil {
log.Error("kpiPoint(%s) err(%v)", day, err)
}
for _, k = range res {
a := model.Kpi{}
a.Point = k.Point
if len(ps) == 0 {
a.PreCount = 0
m = 1
ps = append(ps, a)
continue
}
if ps[len(ps)-1].Point == k.Point {
m = m + 1
continue
}
a.PreCount = m
ps = append(ps, a)
m = m + 1
}
at = int64(len(res))
for _, k = range res {
for i, r := range ps {
if r.Point == k.Point {
b := model.Kpi{}
b.Point = k.Point
b.Rank = int64(i + 1)
b.RankPer = (r.PreCount + 1) * 100 / at
b.RankTotal = at
p := b.RankPer
if p == 0 {
b.Rate = 1
b.RankPer = 1
} else if p > 0 && p <= 10 {
b.Rate = 1
} else if p > 10 && p <= 25 {
b.Rate = 2
} else if p > 25 && p <= 40 {
b.Rate = 3
} else if p > 40 && p <= 60 {
b.Rate = 4
} else if p > 60 && p <= 100 {
b.Rate = 5
}
if r.Point == 0 {
b.Rate = 5
}
b.Day = t
b.Mid = k.Mid
if b.Mid == mid {
log.Info("fix kpi mid %d kpi %v", mid, b)
if err = s.dao.UpdateKPI(c, &b); err != nil {
log.Error("dao.UpdateKPI(%+v) err(%v)", b, err)
}
kd.KpiPoint = k
end := k.Day
begin := k.Day.AddDate(0, 0, -30)
count, _ := s.dao.CountVoteByTime(c, k.Mid, begin, end)
kd.VoteRealTotal = count
if err = s.dao.UpdateKPIData(c, &kd); err != nil {
log.Error("dao.UpdateKPIData(%+v) err(%v)", kd, err)
}
}
break
}
}
}
return
}

View File

@@ -0,0 +1,81 @@
package service
// 根据投准率计算投准系数
func (s *Service) voteRightRatio(vr float64) (vf float64) {
switch {
case vr >= 0.9:
vf = float64(1.2)
case vr >= 0.8 && vr < 0.9:
vf = float64(1.1)
case vr >= 0.7 && vr < 0.8:
vf = float64(0.9)
case vr >= 0.6 && vr < 0.7:
vf = float64(0.6)
case vr >= 0.5 && vr < 0.6:
vf = float64(0.3)
case vr >= 0.4 && vr < 0.5:
vf = float64(0.1)
default:
vf = float64(0)
}
return
}
// 根据活跃天数计算活跃系数
func (s *Service) activeDaysRatio(activeDays int64) (af float64) {
switch {
case activeDays >= 26:
af = float64(1.3)
case activeDays >= 21 && activeDays <= 25:
af = float64(1.2)
case activeDays >= 16 && activeDays <= 20:
af = float64(1.1)
case activeDays >= 11 && activeDays <= 15:
af = float64(1.0)
case activeDays >= 6 && activeDays <= 10:
af = float64(0.9)
case activeDays >= 1 && activeDays <= 5:
af = float64(0.7)
default:
af = float64(0)
}
return
}
// 根据观点数量计算观点数量系数
func (s *Service) opinionNumsRatio(opinionNums int64) (of float64) {
switch {
case opinionNums >= 31:
of = 1.3
case opinionNums >= 16 && opinionNums <= 30:
of = 1.2
case opinionNums >= 6 && opinionNums <= 15:
of = 1.1
case opinionNums >= 1 && opinionNums <= 5:
of = 1
default:
of = 0.8
}
return
}
// 根据观点(赞-踩)数计算观点质量系数
func (s *Service) opinionQualityRatio(opinionQuality int64) (oqf float64) {
switch {
case opinionQuality >= 16:
oqf = 1.3
case opinionQuality >= 6 && opinionQuality <= 15:
oqf = 1.2
case opinionQuality >= 1 && opinionQuality <= 5:
oqf = 1.1
case opinionQuality == 0:
oqf = 1
case opinionQuality >= -10 && opinionQuality <= -1:
oqf = 0.8
case opinionQuality >= -20 && opinionQuality <= -11:
oqf = 0.7
case opinionQuality <= -21:
oqf = 0.5
}
return
}

View File

@@ -0,0 +1,96 @@
package service
import (
"context"
"time"
"go-common/app/job/main/credit-timer/conf"
"go-common/app/job/main/credit-timer/dao"
"go-common/library/log"
)
// Service struct of service.
type Service struct {
c *conf.Config
dao *dao.Dao
}
// New create service instance and return.
func New(c *conf.Config) (s *Service) {
s = &Service{
c: c,
dao: dao.New(c),
}
go s.loadConfproc()
go s.caseproc()
go s.juryproc()
go s.voteproc()
go s.kpiproc()
return
}
func (s *Service) loadConfproc() {
for {
s.loadConf(context.TODO())
time.Sleep(time.Duration(s.c.Judge.ConfTimer))
}
}
func (s *Service) caseproc() {
for {
s.caseProc(context.TODO())
time.Sleep(time.Duration(s.c.Judge.CaseTimer))
}
}
func (s *Service) juryproc() {
for {
s.juryProc(context.TODO())
time.Sleep(time.Duration(s.c.Judge.JuryTimer))
}
}
func (s *Service) voteproc() {
for {
s.voteProc(context.TODO())
time.Sleep(time.Duration(s.c.Judge.VoteTimer))
}
}
func (s *Service) kpiproc() {
var err error
for {
d := time.Now().AddDate(0, 0, 1)
ts := time.Until(time.Date(d.Year(), d.Month(), d.Day(), 0, 0, 1, 0, time.Local))
time.Sleep(ts)
for {
err = s.kpiPointProc(context.TODO())
if err != nil {
log.Error("kpiPointProc err(%v)", err)
time.Sleep(time.Second * 5)
continue
}
break
}
log.Info("KPIPointproc err(%v)", err)
for {
err = s.KPIProc(context.TODO())
if err != nil {
log.Error("kpiProc err(%v)", err)
time.Sleep(time.Second * 5)
continue
}
break
}
log.Info("kpiproc err(%v)", err)
}
}
// Close kafka consumer close.
func (s *Service) Close() (err error) {
return
}
// Ping check service health.
func (s *Service) Ping(c context.Context) error {
return s.dao.Ping(c)
}

View File

@@ -0,0 +1,121 @@
package service
import (
"context"
"flag"
"fmt"
"path/filepath"
"testing"
"time"
"go-common/app/job/main/credit-timer/conf"
"go-common/library/log"
. "github.com/smartystreets/goconvey/convey"
)
var (
s *Service
)
func init() {
dir, _ := filepath.Abs("../cmd/convey-test.toml")
flag.Set("conf", dir)
conf.Init()
s = New(conf.Conf)
time.Sleep(time.Second)
}
func WithService(f func(s *Service)) func() {
return func() {
f(s)
}
}
// TestService_loadConf
func Test_loadConf(t *testing.T) {
Convey("should return err be nil", t, func() {
s.loadConf(context.TODO())
So(s.c.Judge.CaseEndVoteTotal, ShouldBeGreaterThanOrEqualTo, 0)
})
}
// TestService_ComputePoint
func Test_ComputePoint(t *testing.T) {
Convey("should return err be nil", t, func() {
r, err := s.ComputePoint(context.TODO(), 88889017)
So(err, ShouldBeNil)
So(r, ShouldNotBeNil)
// So(r, ShouldResemble,model.KpiPoint{})
})
}
func TestService_sort(t *testing.T) {
var (
res = []int64{1, 3, 4, 5, 5, 6, 7, 9, 9, 10, 11, 12}
ps []int64
)
for _, k := range res {
if len(ps) == 0 {
ps = append(ps, k)
continue
}
if ps[len(ps)-1] == k {
continue
}
ps = append(ps, k)
}
t.Logf("%v", ps)
for _, k := range res {
for i, r := range ps {
if r == k {
t.Logf("%d,%d,%d", k, i+1, (i+1)*100/len(ps))
break
}
}
}
}
func TestService_point(t *testing.T) {
var (
point float64
voteTotal int64
voteRight int64
//投准率
vr float64
//投准率系数
vf float64
)
voteTotal = 12
voteRight = 5
vr = float64(voteRight) / float64(voteTotal)
vf = float64(1.0)
point = float64(voteTotal) * vr * vf
t.Logf("%f", point)
}
func initConf(t *testing.T) {
if err := conf.Init(); err != nil {
t.Errorf("conf.Init() error(%v)", err)
t.FailNow()
}
log.Init(conf.Conf.Xlog)
defer log.Close()
}
func Test_Time(t *testing.T) {
Convey("should return err be nil", t, func() {
d := time.Now().AddDate(0, 0, 1)
ts1 := time.Until(time.Date(d.Year(), d.Month(), d.Day(), 0, 0, 1, 0, time.Local))
ts2 := time.Date(d.Year(), d.Month(), d.Day(), 0, 0, 1, 0, time.Local).Sub(time.Now())
t.Errorf("%#v %#v", ts1, ts2)
So(ts1, ShouldEqual, ts2)
})
}
func Test_FixKPI(t *testing.T) {
Convey("should return err be nil", t, func() {
res, err := s.FixKPI(context.TODO(), 2018, 2, 10, 7584862)
fmt.Printf("res:%+v \n", res)
So(err, ShouldBeNil)
})
}