column_income_stat.go 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  1. package income
  2. import (
  3. "bytes"
  4. "context"
  5. "strconv"
  6. "strings"
  7. incomeD "go-common/app/job/main/growup/dao/income"
  8. model "go-common/app/job/main/growup/model/income"
  9. )
  10. // ColumnIncomeStatSvr column income statistics service
  11. type ColumnIncomeStatSvr struct {
  12. batchSize int
  13. dao *incomeD.Dao
  14. }
  15. // NewColumnIncomeStatSvr new column income stat service
  16. func NewColumnIncomeStatSvr(dao *incomeD.Dao, batchSize int) (svr *ColumnIncomeStatSvr) {
  17. return &ColumnIncomeStatSvr{
  18. batchSize: batchSize,
  19. dao: dao,
  20. }
  21. }
  22. // ColumnIncomeStat column income statistisc
  23. func (p *ColumnIncomeStatSvr) ColumnIncomeStat(c context.Context, limit int64) (m map[int64]*model.ColumnIncomeStat, err error) {
  24. m = make(map[int64]*model.ColumnIncomeStat)
  25. var id int64
  26. for {
  27. var cm map[int64]*model.ColumnIncomeStat
  28. cm, id, err = p.dao.ColumnIncomeStat(c, id, limit)
  29. if err != nil {
  30. return
  31. }
  32. if len(cm) == 0 {
  33. break
  34. }
  35. for sid, stat := range cm {
  36. m[sid] = stat
  37. }
  38. }
  39. return
  40. }
  41. // BatchInsertColumnIncomeStat batch insert column income stat
  42. func (p *ColumnIncomeStatSvr) BatchInsertColumnIncomeStat(ctx context.Context, cs map[int64]*model.ColumnIncomeStat) (err error) {
  43. var (
  44. buff = make([]*model.ColumnIncomeStat, p.batchSize)
  45. buffEnd = 0
  46. )
  47. for _, c := range cs {
  48. if c.DataState == 0 {
  49. continue
  50. }
  51. buff[buffEnd] = c
  52. buffEnd++
  53. if buffEnd >= p.batchSize {
  54. values := columnIncomeStatValues(buff[:buffEnd])
  55. buffEnd = 0
  56. _, err = p.dao.InsertColumnIncomeStat(ctx, values)
  57. if err != nil {
  58. return
  59. }
  60. }
  61. }
  62. if buffEnd > 0 {
  63. values := columnIncomeStatValues(buff[:buffEnd])
  64. buffEnd = 0
  65. _, err = p.dao.InsertColumnIncomeStat(ctx, values)
  66. }
  67. return
  68. }
  69. func columnIncomeStatValues(cs []*model.ColumnIncomeStat) (values string) {
  70. var buf bytes.Buffer
  71. for _, c := range cs {
  72. buf.WriteString("(")
  73. buf.WriteString(strconv.FormatInt(c.ArticleID, 10))
  74. buf.WriteByte(',')
  75. buf.WriteString("\"" + strings.Replace(c.Title, "\"", "\\\"", -1) + "\"")
  76. buf.WriteByte(',')
  77. buf.WriteString(strconv.FormatInt(c.MID, 10))
  78. buf.WriteByte(',')
  79. buf.WriteString(strconv.FormatInt(c.TagID, 10))
  80. buf.WriteByte(',')
  81. buf.WriteString("'" + c.UploadTime.Time().Format(_layoutSec) + "'")
  82. buf.WriteByte(',')
  83. buf.WriteString(strconv.FormatInt(c.TotalIncome, 10))
  84. buf.WriteString(")")
  85. buf.WriteByte(',')
  86. }
  87. if buf.Len() > 0 {
  88. buf.Truncate(buf.Len() - 1)
  89. }
  90. values = buf.String()
  91. buf.Reset()
  92. return
  93. }