123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260 |
- package upcrmservice
- import (
- "context"
- "errors"
- "fmt"
- "time"
- "go-common/app/admin/main/up/dao/upcrm"
- "go-common/app/admin/main/up/model/upcrmmodel"
- "go-common/library/ecode"
- "go-common/library/log"
- xtime "go-common/library/time"
- "github.com/jinzhu/gorm"
- )
- func convertValueList(score upcrmmodel.ScoreSectionHistory) []upcrmmodel.ScoreSection {
- var values []int
- values = append(values, score.Section0)
- values = append(values, score.Section1)
- values = append(values, score.Section2)
- values = append(values, score.Section3)
- values = append(values, score.Section4)
- values = append(values, score.Section5)
- values = append(values, score.Section6)
- values = append(values, score.Section7)
- values = append(values, score.Section8)
- values = append(values, score.Section9)
- var list []upcrmmodel.ScoreSection
- var total = 0
- for i, v := range values {
- var newsection = upcrmmodel.ScoreSection{
- Section: i,
- Value: v,
- }
- list = append(list, newsection)
- total += v
- }
- if total > 0 {
- for i := range list {
- list[i].Percent = int(float32(list[i].Value) * 10000.0 / float32(total))
- }
- }
- return list
- }
- func generateScoreQueryXAxis(num int) (axis []string) {
- if num == 0 {
- return
- }
- axis = append(axis, fmt.Sprintf("%d-%d", 0, 100))
- for i := 1; i < num; i++ {
- axis = append(axis, fmt.Sprintf("%d-%d", i*100+1, (i+1)*100))
- }
- return
- }
- //ScoreQuery query score
- func (s *Service) ScoreQuery(context context.Context, arg *upcrmmodel.ScoreQueryArgs) (result upcrmmodel.ScoreQueryResult, err error) {
- var today = time.Now()
- var yesterday, e = s.crmdb.GetLastHistory(arg.ScoreType)
- result = upcrmmodel.NewEmptyScoreQueryResult()
- err = e
- if err == ecode.NothingFound {
- log.Info("no record found in db, arg=%+v", arg)
- err = nil
- return
- }
- if err != nil {
- log.Error("fail get last history, arg=%+v, err=%+v", arg, err)
- return
- }
- yesterdayData, e := s.crmdb.ScoreQueryHistory(arg.ScoreType, yesterday)
- err = e
- // orm.go 里修改了gorm.ErrRecordNotFound!!
- if err != nil {
- log.Error("fail query score history, err=%+v", err)
- return
- }
- result.XAxis = generateScoreQueryXAxis(10)
- result.YAxis = convertValueList(yesterdayData)
- var comparedate time.Time
- // 获取对比数据
- switch arg.CompareType {
- case upcrmmodel.CompareTypeNothing:
- break
- case upcrmmodel.CompareType7day:
- comparedate = yesterday.AddDate(0, 0, -7)
- case upcrmmodel.CompareType30day:
- comparedate = yesterday.AddDate(0, 0, -30)
- case upcrmmodel.CompareTypeMonthFirstDay:
- y, m, _ := today.Date()
- comparedate = time.Date(y, m, 1, 0, 0, 0, 0, today.Location())
- }
- if !comparedate.IsZero() {
- var compareData, e = s.crmdb.ScoreQueryHistory(arg.ScoreType, comparedate)
- err = e
- // orm.go 里修改了gorm.ErrRecordNotFound!!
- if err != nil {
- log.Error("fail query score history, err=%+v", err)
- return
- }
- result.CompareAxis = convertValueList(compareData)
- }
- log.Info("result=%+v", result)
- return
- }
- func calcScoreInfo(datamap map[int8]map[time.Time]upcrmmodel.UpScoreHistory, stype int8, todate time.Time, fromdate time.Time) (info upcrmmodel.ScoreInfo) {
- var typeMap map[time.Time]upcrmmodel.UpScoreHistory
- var ok bool
- if typeMap, ok = datamap[stype]; !ok {
- log.Error("score type not found, type=%d", stype)
- return
- }
- var currentData upcrmmodel.UpScoreHistory
- if currentData, ok = typeMap[todate]; !ok {
- log.Error("score type for todate not exist, todate=%v", todate)
- return
- }
- info.Current = currentData.Score
- var lastScore = 0
- if lastData, ok := typeMap[fromdate]; ok {
- lastScore = lastData.Score
- }
- info.DiffLastDay = info.Current - lastScore
- return
- }
- func generateDataMap(scoreHistory []upcrmmodel.UpScoreHistory) map[int8]map[time.Time]upcrmmodel.UpScoreHistory {
- var dataMap = map[int8]map[time.Time]upcrmmodel.UpScoreHistory{}
- for _, v := range scoreHistory {
- var typeMap map[time.Time]upcrmmodel.UpScoreHistory
- var ok bool
- if typeMap, ok = dataMap[v.ScoreType]; !ok {
- typeMap = map[time.Time]upcrmmodel.UpScoreHistory{}
- dataMap[v.ScoreType] = typeMap
- }
- typeMap[GetDateStamp(v.GenerateDate.Time())] = v
- }
- return dataMap
- }
- func getDataFromMap(dataMap map[int8]map[time.Time]upcrmmodel.UpScoreHistory, scoreType int, date time.Time) (data upcrmmodel.UpScoreHistory, ok bool) {
- var mapDate, o = dataMap[int8(scoreType)]
- ok = o
- if !ok {
- return
- }
- data, ok = mapDate[date]
- return
- }
- //ScoreQueryUp query up score
- func (s *Service) ScoreQueryUp(context context.Context, arg *upcrmmodel.ScoreQueryUpArgs) (result upcrmmodel.ScoreQueryUpResult, err error) {
- var now = time.Now()
- var todate = GetDateStamp(now)
- if arg.Date != "" {
- todate, err = time.ParseInLocation(upcrmmodel.TimeFmtDate, arg.Date, now.Location())
- if err != nil {
- log.Error("fail to parse date, date=%s", arg.Date)
- return
- }
- }
- var latestDate, e = s.crmdb.GetLatestUpScoreDate(arg.Mid, upcrm.ScoreTypePr, todate)
- if e != nil && e != gorm.ErrRecordNotFound {
- err = e
- return
- }
- todate = latestDate
- var fromdate = GetDateStamp(todate.AddDate(0, 0, -1))
- log.Info("query up's score all")
- var scoreHistory []upcrmmodel.UpScoreHistory
- scoreHistory, err = s.crmdb.QueryUpScoreHistory(arg.Mid, []int{upcrm.ScoreTypePr, upcrm.ScoreTypeQuality, upcrm.ScoreTypeCredit}, fromdate, todate)
- if err != nil {
- log.Error("query up score error, err=%+v", err)
- return
- }
- var dataMap = generateDataMap(scoreHistory)
- // 计算数据
- result.PrScore = calcScoreInfo(dataMap, upcrm.ScoreTypePr, todate, fromdate)
- result.QualityScore = calcScoreInfo(dataMap, upcrm.ScoreTypeQuality, todate, fromdate)
- result.CreditScore = calcScoreInfo(dataMap, upcrm.ScoreTypeCredit, todate, fromdate)
- result.Date = xtime.Time(todate.Unix())
- log.Info("score history ok req=%+v, result=%+v", arg, result)
- return
- }
- //ScoreQueryUpHistory query up history
- func (s *Service) ScoreQueryUpHistory(context context.Context, arg *upcrmmodel.ScoreQueryUpHistoryArgs) (result upcrmmodel.ScoreQueryUpHistoryResult, err error) {
- var now = time.Now()
- var todate = now
- if arg.Date != "" {
- todate, err = time.ParseInLocation(upcrmmodel.TimeFmtDate, arg.Date, now.Location())
- if err != nil {
- log.Error("parse time fail, err=%+v", err)
- return
- }
- }
- switch arg.Day {
- case 7, 30, 90:
- break
- default:
- arg.Day = 7
- }
- latestDate, e := s.crmdb.GetLatestUpScoreDate(arg.Mid, upcrm.ScoreTypePr, todate)
- if e != nil && e != gorm.ErrRecordNotFound {
- err = e
- return
- }
- todate = latestDate
- var fromdate = todate.AddDate(0, 0, 1-arg.Day)
- var types []int
- switch arg.ScoreType {
- case 0:
- types = append(types, upcrm.ScoreTypePr, upcrm.ScoreTypeQuality, upcrm.ScoreTypeCredit)
- case upcrm.ScoreTypePr, upcrm.ScoreTypeQuality, upcrm.ScoreTypeCredit:
- types = append(types, arg.ScoreType)
- default:
- err = errors.New("score type not support")
- return
- }
- scoreHistory, e := s.crmdb.QueryUpScoreHistory(arg.Mid, types, fromdate, todate)
- err = e
- if err != nil {
- log.Error("query up score error, err=%+v", err)
- return
- }
- var dataMap = generateDataMap(scoreHistory)
- // 产生历史列表数据
- var dateSeries []xtime.Time
- var origDateSeries []time.Time
- for start := fromdate; !start.After(todate); start = start.AddDate(0, 0, 1) {
- var onlyDate = GetDateStamp(start)
- origDateSeries = append(origDateSeries, onlyDate)
- dateSeries = append(dateSeries, xtime.Time(onlyDate.Unix()))
- }
- //result.ScoreData = []
- for _, t := range types {
- var typehistory upcrmmodel.ScoreHistoryInfo
- typehistory.Type = t
- typehistory.Date = dateSeries
- for _, date := range origDateSeries {
- // 如果没有找到,就用默认的score = 0
- var score, _ = getDataFromMap(dataMap, t, date)
- typehistory.Score = append(typehistory.Score, score.Score)
- }
- result.ScoreData = append(result.ScoreData, typehistory)
- }
- log.Info("query up history sucessful, arg=%+v, result=%+v", arg, result)
- return
- }
|