classStruct.go 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148
  1. package service
  2. import (
  3. "context"
  4. "fmt"
  5. "github.com/gogf/gf/v2/frame/g"
  6. "github.com/gogf/gf/v2/os/gctx"
  7. "github.com/gogf/gf/v2/util/gconv"
  8. "jybxseo/internal/consts"
  9. )
  10. var (
  11. JyBxSeoClassRoot *ClassRoot = &ClassRoot{}
  12. )
  13. type (
  14. ClassRoot struct {
  15. classTree map[string]*ClassNode //层级关系
  16. allClassCodeMap map[string]*ClassNode //所有节点平铺 key:code
  17. allClassNameMap map[string]*ClassNode //所有节点平铺 key:name
  18. rootCodeMap map[string]*ClassNode //根结点平铺 key:code
  19. rootList []*ClassNode //根节点
  20. hotClass []*ClassNode //热门行业
  21. }
  22. ClassNode struct {
  23. Name string `json:"name" doc:"名称"`
  24. Code string `json:"code" doc:"代码"`
  25. PNode *ClassNode `json:"pNode" doc:"父节点代码"`
  26. Type int `json:"type" doc:"1一级分类 2二级分类"`
  27. Child []*ClassNode `json:"child" doc:"子栏目"`
  28. }
  29. )
  30. func init() {
  31. JyBxSeoClassRoot.LoadClassFrom(gctx.New())
  32. }
  33. func (cRoot *ClassRoot) LoadClassFrom(ctx context.Context) {
  34. classTree, classCodeMap, classNameMap := map[string]*ClassNode{}, map[string]*ClassNode{}, map[string]*ClassNode{}
  35. rootCodeMap := map[string]*ClassNode{}
  36. var rootArr []*ClassNode
  37. for _, m := range g.Cfg("global").MustGet(context.Background(), "allClassTree").Maps() {
  38. root := &ClassNode{
  39. Name: gconv.String(m["name"]),
  40. Code: gconv.String(m["code"]),
  41. Type: 1,
  42. }
  43. for _, n := range gconv.Maps(m["child"]) {
  44. node := &ClassNode{
  45. Name: gconv.String(n["name"]),
  46. Code: gconv.String(n["code"]),
  47. PNode: root,
  48. Type: 2,
  49. }
  50. root.Child = append(root.Child, node)
  51. //if allClassCodeMap[node.Code] != nil {
  52. // fmt.Println("node.Code重复", node.Code)
  53. //}
  54. //if allClassNameMap[node.Name] != nil {
  55. // fmt.Println("node.Name重复", node.Name)
  56. //}
  57. classCodeMap[node.Code] = node
  58. classNameMap[node.Name] = node
  59. }
  60. classTree[root.Code] = root
  61. rootCodeMap[root.Code] = root
  62. classCodeMap[root.Code] = root
  63. classCodeMap[root.Name] = root
  64. rootArr = append(rootArr, root)
  65. }
  66. for _, class := range g.Cfg("global").MustGet(context.Background(), "topClass").Strings() {
  67. if node := classCodeMap[class]; node != nil {
  68. cRoot.hotClass = append(cRoot.hotClass, node)
  69. }
  70. }
  71. cRoot.classTree, cRoot.allClassCodeMap = classTree, classCodeMap
  72. cRoot.allClassNameMap = classNameMap
  73. cRoot.rootCodeMap = rootCodeMap
  74. cRoot.rootList = rootArr
  75. }
  76. // GetData 获取地区数据
  77. func (cRoot *ClassRoot) GetData(ctx context.Context, maxTotal int, query *SeoBiddingQuery) []map[string]interface{} {
  78. var sql string
  79. var values []interface{}
  80. if query.district != "" {
  81. sql += " AND b.district=? "
  82. values = append(values, query.district)
  83. } else if query.city != "" {
  84. sql += " AND b.city=? "
  85. values = append(values, query.city)
  86. } else if query.area != "" {
  87. sql += " AND b.area=? "
  88. values = append(values, query.area)
  89. }
  90. if query.topType != "" {
  91. if val, _ := consts.TopTypeMap[query.topType]; val != "" {
  92. sql += " AND b.toptype=? "
  93. values = append(values, val)
  94. } else {
  95. sql += " AND b.toptype=? "
  96. values = append(values, query.topType)
  97. }
  98. } else if query.subType != "" && query.keys == "" {
  99. sql += " AND b.subtype=? "
  100. values = append(values, query.subType)
  101. } else if query.topType == "" && query.subType == "" {
  102. sql += " AND (b.toptype !='拟建' AND b.toptype !='采购意向') "
  103. }
  104. values = append(values, maxTotal+50)
  105. queryRes, err := g.DB().Query(ctx, fmt.Sprintf(`SELECT b.bid_id
  106. FROM new_areaClass b
  107. WHERE 1=1 %s
  108. ORDER BY b.publish_time DESC
  109. LIMIT 0,?`, sql), values...)
  110. if err != nil || queryRes.IsEmpty() {
  111. return nil
  112. }
  113. return FillingBiddingBaseFields(ctx, queryRes.List())
  114. }
  115. // GetNodeByCode 根据code
  116. func (cRoot *ClassRoot) GetNodeByCode(code string) *ClassNode {
  117. return cRoot.allClassCodeMap[code]
  118. }
  119. // GetNodeByName 根据类型名字获取node
  120. func (cRoot *ClassRoot) GetNodeByName(name string) *ClassNode {
  121. return cRoot.allClassNameMap[name]
  122. }
  123. // GetRootNodeByCode 根据类型名字获取node
  124. func (cRoot *ClassRoot) GetRootNodeByCode(name string) *ClassNode {
  125. return cRoot.rootCodeMap[name]
  126. }
  127. // GetAllRootNodes 获取全部根地区节点
  128. func (cRoot *ClassRoot) GetAllRootNodes() []*ClassNode {
  129. return cRoot.rootList
  130. }
  131. // GetHot 获取热门行业
  132. func (cRoot *ClassRoot) GetHot() []*ClassNode {
  133. return cRoot.hotClass
  134. }