channel.go 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252
  1. package service
  2. import (
  3. "context"
  4. "fmt"
  5. "gadmin/config"
  6. "gadmin/internal/admin/consts"
  7. "gadmin/internal/admin/forms"
  8. "gadmin/internal/gorm/model"
  9. "gadmin/internal/gorm/query"
  10. "gadmin/utility/serializer"
  11. "github.com/gin-gonic/gin"
  12. "github.com/sirupsen/logrus"
  13. "strings"
  14. )
  15. // Channel 渠道
  16. var Channel = new(sChannel)
  17. type sChannel struct{}
  18. func (s *sChannel) Stat(ctx *gin.Context, req forms.ChannelStatReq) serializer.Response {
  19. type Result struct {
  20. ID int64 `json:"id"`
  21. ChannelId string `json:"channel_id"`
  22. Name string `json:"name"`
  23. TotalLogin int64 `json:"totalLogin"`
  24. TotalNewUser int64 `json:"totalNewUser"`
  25. LastAt int32 `json:"lastAt"`
  26. }
  27. var (
  28. q = query.Use(config.DB).Channel
  29. m = q.WithContext(ctx)
  30. a = query.Use(config.DB).AdvOriginLog
  31. offset int64 = 0
  32. models forms.ListRes
  33. lists []*Result
  34. err error
  35. )
  36. req.Page, req.PerPage, offset = forms.CalculatePage(req.Page, req.PerPage)
  37. count, err := m.Count()
  38. if err != nil {
  39. return serializer.Err(consts.CodeParamErr, "查询出错 count", err)
  40. }
  41. if count > 0 {
  42. if err = m.Limit(int(req.PerPage)).Offset(int(offset)).Scan(&lists); err != nil {
  43. return serializer.Err(consts.CodeParamErr, "查询出错 lists", err)
  44. }
  45. }
  46. for _, v := range lists {
  47. // 全部广告渠道
  48. if v.ChannelId == "1" {
  49. continue
  50. }
  51. v.TotalLogin, err = a.WithContext(ctx).Where(a.Traceid.Eq(v.ChannelId)).Count()
  52. if err != nil {
  53. return serializer.Err(consts.CodeParamErr, "查询出错 Count2", err)
  54. }
  55. v.TotalNewUser, err = a.WithContext(ctx).Where(a.Traceid.Eq(v.ChannelId), a.NewUser.Eq(1)).Count()
  56. if err != nil {
  57. return serializer.Err(consts.CodeParamErr, "查询出错 NewUser", err)
  58. }
  59. last, err := a.WithContext(ctx).Where(a.Traceid.Eq(v.ChannelId)).Last()
  60. if err != nil && err.Error() != "record not found" {
  61. //return serializer.Err(consts.CodeParamErr, "查询出错 Last", err)
  62. }
  63. if last != nil {
  64. v.LastAt = last.EventAt
  65. }
  66. }
  67. models.List = lists
  68. models.Page = req.Page
  69. models.PerPage = req.PerPage
  70. models.PageCount = (count + req.PerPage - 1) / req.PerPage
  71. return serializer.Suc(models)
  72. }
  73. func (s *sChannel) Edit(ctx *gin.Context, req forms.ChannelStatEditReq) serializer.Response {
  74. q := query.Use(config.DB).Channel
  75. _, err := q.WithContext(ctx).Where(q.ID.Eq(req.Id)).Update(q.Name, req.Name)
  76. if err != nil {
  77. return serializer.Err(consts.CodeParamErr, "更新出错", err)
  78. }
  79. return serializer.Suc(nil)
  80. }
  81. // Option 选项
  82. func (s *sChannel) Option(ctx *gin.Context) (list []forms.Option) {
  83. var (
  84. q = query.Use(config.DB).Channel
  85. m = q.WithContext(ctx)
  86. lists []*model.Channel
  87. err error
  88. )
  89. if err = m.Scan(&lists); err != nil {
  90. logrus.Warnf("查询出错 lists err:%+v", err)
  91. return list
  92. }
  93. list = append(list, forms.Option{
  94. Value: "",
  95. Label: "全部渠道",
  96. Name: "全部渠道",
  97. })
  98. for _, v := range lists {
  99. //if v.ChannelID == "0" {
  100. // v.Name = "自然玩家"
  101. //}
  102. list = append(list, forms.Option{
  103. Value: v.ChannelID,
  104. Label: fmt.Sprintf("%v(%v)", v.Name, v.ChannelID),
  105. Name: v.Name,
  106. })
  107. }
  108. return list
  109. }
  110. // TreeOption 选项
  111. func (s *sChannel) TreeOption(ctx *gin.Context) (list []*forms.TreeOption) {
  112. var (
  113. q = query.Use(config.DB).Channel
  114. m = q.WithContext(ctx)
  115. lists []*model.Channel
  116. err error
  117. )
  118. if err = m.Scan(&lists); err != nil {
  119. logrus.Warnf("查询出错 lists err:%+v", err)
  120. return list
  121. }
  122. list = []*forms.TreeOption{
  123. {
  124. Label: "全部渠道",
  125. Key: "",
  126. },
  127. {
  128. Label: "自然玩家",
  129. Key: consts.ChannelIdDefault,
  130. },
  131. {
  132. Label: "全部广告渠道",
  133. Key: consts.ChannelIdAllAdv,
  134. },
  135. }
  136. wx := &forms.TreeOption{
  137. Label: "微信渠道",
  138. Key: consts.ChannelIdAllWx,
  139. }
  140. tt := &forms.TreeOption{
  141. Label: "抖音渠道",
  142. Key: consts.ChannelIdAllTT,
  143. }
  144. for _, v := range lists {
  145. opt := &forms.TreeOption{
  146. Label: v.ChannelID,
  147. Key: v.ChannelID,
  148. }
  149. switch v.Type {
  150. case consts.ChannelTypeMaster:
  151. continue
  152. case consts.ChannelPlatformWx:
  153. wx.Children = append(wx.Children, opt)
  154. case consts.ChannelPlatformTT:
  155. tt.Children = append(tt.Children, opt)
  156. }
  157. }
  158. list = append(list, wx, tt)
  159. return list
  160. }
  161. func (s *sChannel) Ids() (resp []string, err error) {
  162. rdb := query.Use(config.DB).Channel
  163. results, err := rdb.Find()
  164. if err != nil {
  165. return
  166. }
  167. for _, v := range results {
  168. resp = append(resp, v.ChannelID)
  169. }
  170. return
  171. }
  172. // GetIdsByType 获取指定主渠道ID获取子级渠道ID集合
  173. func (s *sChannel) GetIdsByType(pid string) (resp []string) {
  174. rdb := query.Use(config.DB).Channel
  175. m := rdb.WithContext(context.TODO())
  176. switch pid {
  177. case consts.ChannelIdAllAdv:
  178. m = m.Where(rdb.Type.In(consts.ChannelPlatformWx, consts.ChannelPlatformTT))
  179. case consts.ChannelIdAllWx:
  180. m = m.Where(rdb.Type.Eq(consts.ChannelPlatformWx))
  181. case consts.ChannelIdAllTT:
  182. m = m.Where(rdb.Type.Eq(consts.ChannelPlatformTT))
  183. }
  184. results, err := m.Find()
  185. if err != nil {
  186. logrus.Warnf("service.GetIdsByType err:%+v", err)
  187. return
  188. }
  189. for _, v := range results {
  190. resp = append(resp, v.ChannelID)
  191. }
  192. return
  193. }
  194. func (s *sChannel) GetIdsByTypeToString(pid string) string {
  195. return strings.Join(s.GetIdsByType(pid), `,`)
  196. }
  197. // IsMasterChannel 是否是主渠道
  198. func (s *sChannel) IsMasterChannel(channelId string) bool {
  199. switch channelId {
  200. case consts.ChannelIdDefault, consts.ChannelIdAllAdv, consts.ChannelIdAllWx, consts.ChannelIdAllTT:
  201. return true
  202. }
  203. return false
  204. }
  205. // IsSubChannel 是否是子渠道
  206. func (s *sChannel) IsSubChannel(ctx *gin.Context, channelId string) bool {
  207. q := query.Use(config.DB).Channel
  208. data, err := q.WithContext(ctx).Where(q.ChannelID.Eq(channelId)).First()
  209. if err != nil || data == nil {
  210. return true // 默认子渠道
  211. }
  212. return data.Type != 0
  213. }