classStruct.go 3.9 KB

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