classStruct.go 3.6 KB

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