scoresection.go 7.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260
  1. package upcrmservice
  2. import (
  3. "context"
  4. "errors"
  5. "fmt"
  6. "time"
  7. "go-common/app/admin/main/up/dao/upcrm"
  8. "go-common/app/admin/main/up/model/upcrmmodel"
  9. "go-common/library/ecode"
  10. "go-common/library/log"
  11. xtime "go-common/library/time"
  12. "github.com/jinzhu/gorm"
  13. )
  14. func convertValueList(score upcrmmodel.ScoreSectionHistory) []upcrmmodel.ScoreSection {
  15. var values []int
  16. values = append(values, score.Section0)
  17. values = append(values, score.Section1)
  18. values = append(values, score.Section2)
  19. values = append(values, score.Section3)
  20. values = append(values, score.Section4)
  21. values = append(values, score.Section5)
  22. values = append(values, score.Section6)
  23. values = append(values, score.Section7)
  24. values = append(values, score.Section8)
  25. values = append(values, score.Section9)
  26. var list []upcrmmodel.ScoreSection
  27. var total = 0
  28. for i, v := range values {
  29. var newsection = upcrmmodel.ScoreSection{
  30. Section: i,
  31. Value: v,
  32. }
  33. list = append(list, newsection)
  34. total += v
  35. }
  36. if total > 0 {
  37. for i := range list {
  38. list[i].Percent = int(float32(list[i].Value) * 10000.0 / float32(total))
  39. }
  40. }
  41. return list
  42. }
  43. func generateScoreQueryXAxis(num int) (axis []string) {
  44. if num == 0 {
  45. return
  46. }
  47. axis = append(axis, fmt.Sprintf("%d-%d", 0, 100))
  48. for i := 1; i < num; i++ {
  49. axis = append(axis, fmt.Sprintf("%d-%d", i*100+1, (i+1)*100))
  50. }
  51. return
  52. }
  53. //ScoreQuery query score
  54. func (s *Service) ScoreQuery(context context.Context, arg *upcrmmodel.ScoreQueryArgs) (result upcrmmodel.ScoreQueryResult, err error) {
  55. var today = time.Now()
  56. var yesterday, e = s.crmdb.GetLastHistory(arg.ScoreType)
  57. result = upcrmmodel.NewEmptyScoreQueryResult()
  58. err = e
  59. if err == ecode.NothingFound {
  60. log.Info("no record found in db, arg=%+v", arg)
  61. err = nil
  62. return
  63. }
  64. if err != nil {
  65. log.Error("fail get last history, arg=%+v, err=%+v", arg, err)
  66. return
  67. }
  68. yesterdayData, e := s.crmdb.ScoreQueryHistory(arg.ScoreType, yesterday)
  69. err = e
  70. // orm.go 里修改了gorm.ErrRecordNotFound!!
  71. if err != nil {
  72. log.Error("fail query score history, err=%+v", err)
  73. return
  74. }
  75. result.XAxis = generateScoreQueryXAxis(10)
  76. result.YAxis = convertValueList(yesterdayData)
  77. var comparedate time.Time
  78. // 获取对比数据
  79. switch arg.CompareType {
  80. case upcrmmodel.CompareTypeNothing:
  81. break
  82. case upcrmmodel.CompareType7day:
  83. comparedate = yesterday.AddDate(0, 0, -7)
  84. case upcrmmodel.CompareType30day:
  85. comparedate = yesterday.AddDate(0, 0, -30)
  86. case upcrmmodel.CompareTypeMonthFirstDay:
  87. y, m, _ := today.Date()
  88. comparedate = time.Date(y, m, 1, 0, 0, 0, 0, today.Location())
  89. }
  90. if !comparedate.IsZero() {
  91. var compareData, e = s.crmdb.ScoreQueryHistory(arg.ScoreType, comparedate)
  92. err = e
  93. // orm.go 里修改了gorm.ErrRecordNotFound!!
  94. if err != nil {
  95. log.Error("fail query score history, err=%+v", err)
  96. return
  97. }
  98. result.CompareAxis = convertValueList(compareData)
  99. }
  100. log.Info("result=%+v", result)
  101. return
  102. }
  103. func calcScoreInfo(datamap map[int8]map[time.Time]upcrmmodel.UpScoreHistory, stype int8, todate time.Time, fromdate time.Time) (info upcrmmodel.ScoreInfo) {
  104. var typeMap map[time.Time]upcrmmodel.UpScoreHistory
  105. var ok bool
  106. if typeMap, ok = datamap[stype]; !ok {
  107. log.Error("score type not found, type=%d", stype)
  108. return
  109. }
  110. var currentData upcrmmodel.UpScoreHistory
  111. if currentData, ok = typeMap[todate]; !ok {
  112. log.Error("score type for todate not exist, todate=%v", todate)
  113. return
  114. }
  115. info.Current = currentData.Score
  116. var lastScore = 0
  117. if lastData, ok := typeMap[fromdate]; ok {
  118. lastScore = lastData.Score
  119. }
  120. info.DiffLastDay = info.Current - lastScore
  121. return
  122. }
  123. func generateDataMap(scoreHistory []upcrmmodel.UpScoreHistory) map[int8]map[time.Time]upcrmmodel.UpScoreHistory {
  124. var dataMap = map[int8]map[time.Time]upcrmmodel.UpScoreHistory{}
  125. for _, v := range scoreHistory {
  126. var typeMap map[time.Time]upcrmmodel.UpScoreHistory
  127. var ok bool
  128. if typeMap, ok = dataMap[v.ScoreType]; !ok {
  129. typeMap = map[time.Time]upcrmmodel.UpScoreHistory{}
  130. dataMap[v.ScoreType] = typeMap
  131. }
  132. typeMap[GetDateStamp(v.GenerateDate.Time())] = v
  133. }
  134. return dataMap
  135. }
  136. func getDataFromMap(dataMap map[int8]map[time.Time]upcrmmodel.UpScoreHistory, scoreType int, date time.Time) (data upcrmmodel.UpScoreHistory, ok bool) {
  137. var mapDate, o = dataMap[int8(scoreType)]
  138. ok = o
  139. if !ok {
  140. return
  141. }
  142. data, ok = mapDate[date]
  143. return
  144. }
  145. //ScoreQueryUp query up score
  146. func (s *Service) ScoreQueryUp(context context.Context, arg *upcrmmodel.ScoreQueryUpArgs) (result upcrmmodel.ScoreQueryUpResult, err error) {
  147. var now = time.Now()
  148. var todate = GetDateStamp(now)
  149. if arg.Date != "" {
  150. todate, err = time.ParseInLocation(upcrmmodel.TimeFmtDate, arg.Date, now.Location())
  151. if err != nil {
  152. log.Error("fail to parse date, date=%s", arg.Date)
  153. return
  154. }
  155. }
  156. var latestDate, e = s.crmdb.GetLatestUpScoreDate(arg.Mid, upcrm.ScoreTypePr, todate)
  157. if e != nil && e != gorm.ErrRecordNotFound {
  158. err = e
  159. return
  160. }
  161. todate = latestDate
  162. var fromdate = GetDateStamp(todate.AddDate(0, 0, -1))
  163. log.Info("query up's score all")
  164. var scoreHistory []upcrmmodel.UpScoreHistory
  165. scoreHistory, err = s.crmdb.QueryUpScoreHistory(arg.Mid, []int{upcrm.ScoreTypePr, upcrm.ScoreTypeQuality, upcrm.ScoreTypeCredit}, fromdate, todate)
  166. if err != nil {
  167. log.Error("query up score error, err=%+v", err)
  168. return
  169. }
  170. var dataMap = generateDataMap(scoreHistory)
  171. // 计算数据
  172. result.PrScore = calcScoreInfo(dataMap, upcrm.ScoreTypePr, todate, fromdate)
  173. result.QualityScore = calcScoreInfo(dataMap, upcrm.ScoreTypeQuality, todate, fromdate)
  174. result.CreditScore = calcScoreInfo(dataMap, upcrm.ScoreTypeCredit, todate, fromdate)
  175. result.Date = xtime.Time(todate.Unix())
  176. log.Info("score history ok req=%+v, result=%+v", arg, result)
  177. return
  178. }
  179. //ScoreQueryUpHistory query up history
  180. func (s *Service) ScoreQueryUpHistory(context context.Context, arg *upcrmmodel.ScoreQueryUpHistoryArgs) (result upcrmmodel.ScoreQueryUpHistoryResult, err error) {
  181. var now = time.Now()
  182. var todate = now
  183. if arg.Date != "" {
  184. todate, err = time.ParseInLocation(upcrmmodel.TimeFmtDate, arg.Date, now.Location())
  185. if err != nil {
  186. log.Error("parse time fail, err=%+v", err)
  187. return
  188. }
  189. }
  190. switch arg.Day {
  191. case 7, 30, 90:
  192. break
  193. default:
  194. arg.Day = 7
  195. }
  196. latestDate, e := s.crmdb.GetLatestUpScoreDate(arg.Mid, upcrm.ScoreTypePr, todate)
  197. if e != nil && e != gorm.ErrRecordNotFound {
  198. err = e
  199. return
  200. }
  201. todate = latestDate
  202. var fromdate = todate.AddDate(0, 0, 1-arg.Day)
  203. var types []int
  204. switch arg.ScoreType {
  205. case 0:
  206. types = append(types, upcrm.ScoreTypePr, upcrm.ScoreTypeQuality, upcrm.ScoreTypeCredit)
  207. case upcrm.ScoreTypePr, upcrm.ScoreTypeQuality, upcrm.ScoreTypeCredit:
  208. types = append(types, arg.ScoreType)
  209. default:
  210. err = errors.New("score type not support")
  211. return
  212. }
  213. scoreHistory, e := s.crmdb.QueryUpScoreHistory(arg.Mid, types, fromdate, todate)
  214. err = e
  215. if err != nil {
  216. log.Error("query up score error, err=%+v", err)
  217. return
  218. }
  219. var dataMap = generateDataMap(scoreHistory)
  220. // 产生历史列表数据
  221. var dateSeries []xtime.Time
  222. var origDateSeries []time.Time
  223. for start := fromdate; !start.After(todate); start = start.AddDate(0, 0, 1) {
  224. var onlyDate = GetDateStamp(start)
  225. origDateSeries = append(origDateSeries, onlyDate)
  226. dateSeries = append(dateSeries, xtime.Time(onlyDate.Unix()))
  227. }
  228. //result.ScoreData = []
  229. for _, t := range types {
  230. var typehistory upcrmmodel.ScoreHistoryInfo
  231. typehistory.Type = t
  232. typehistory.Date = dateSeries
  233. for _, date := range origDateSeries {
  234. // 如果没有找到,就用默认的score = 0
  235. var score, _ = getDataFromMap(dataMap, t, date)
  236. typehistory.Score = append(typehistory.Score, score.Score)
  237. }
  238. result.ScoreData = append(result.ScoreData, typehistory)
  239. }
  240. log.Info("query up history sucessful, arg=%+v, result=%+v", arg, result)
  241. return
  242. }