areaStruct.go 3.7 KB

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