123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148 |
- package service
- import (
- "context"
- "fmt"
- "github.com/gogf/gf/v2/frame/g"
- "github.com/gogf/gf/v2/os/gctx"
- "github.com/gogf/gf/v2/util/gconv"
- "jybxseo/internal/consts"
- )
- var (
- JyBxSeoClassRoot *ClassRoot = &ClassRoot{}
- )
- type (
- ClassRoot struct {
- classTree map[string]*ClassNode //层级关系
- allClassCodeMap map[string]*ClassNode //所有节点平铺 key:code
- allClassNameMap map[string]*ClassNode //所有节点平铺 key:name
- rootCodeMap map[string]*ClassNode //根结点平铺 key:code
- rootList []*ClassNode //根节点
- hotClass []*ClassNode //热门行业
- }
- ClassNode struct {
- Name string `json:"name" doc:"名称"`
- Code string `json:"code" doc:"代码"`
- PNode *ClassNode `json:"pNode" doc:"父节点代码"`
- Type int `json:"type" doc:"1一级分类 2二级分类"`
- Child []*ClassNode `json:"child" doc:"子栏目"`
- }
- )
- func init() {
- JyBxSeoClassRoot.LoadClassFrom(gctx.New())
- }
- func (cRoot *ClassRoot) LoadClassFrom(ctx context.Context) {
- classTree, classCodeMap, classNameMap := map[string]*ClassNode{}, map[string]*ClassNode{}, map[string]*ClassNode{}
- rootCodeMap := map[string]*ClassNode{}
- var rootArr []*ClassNode
- for _, m := range g.Cfg("global").MustGet(context.Background(), "allClassTree").Maps() {
- root := &ClassNode{
- Name: gconv.String(m["name"]),
- Code: gconv.String(m["code"]),
- Type: 1,
- }
- for _, n := range gconv.Maps(m["child"]) {
- node := &ClassNode{
- Name: gconv.String(n["name"]),
- Code: gconv.String(n["code"]),
- PNode: root,
- Type: 2,
- }
- root.Child = append(root.Child, node)
- //if allClassCodeMap[node.Code] != nil {
- // fmt.Println("node.Code重复", node.Code)
- //}
- //if allClassNameMap[node.Name] != nil {
- // fmt.Println("node.Name重复", node.Name)
- //}
- classCodeMap[node.Code] = node
- classNameMap[node.Name] = node
- }
- classTree[root.Code] = root
- rootCodeMap[root.Code] = root
- classCodeMap[root.Code] = root
- classCodeMap[root.Name] = root
- rootArr = append(rootArr, root)
- }
- for _, class := range g.Cfg("global").MustGet(context.Background(), "topClass").Strings() {
- if node := classCodeMap[class]; node != nil {
- cRoot.hotClass = append(cRoot.hotClass, node)
- }
- }
- cRoot.classTree, cRoot.allClassCodeMap = classTree, classCodeMap
- cRoot.allClassNameMap = classNameMap
- cRoot.rootCodeMap = rootCodeMap
- cRoot.rootList = rootArr
- }
- // GetData 获取地区数据
- func (cRoot *ClassRoot) GetData(ctx context.Context, maxTotal int, query *SeoBiddingQuery) []map[string]interface{} {
- var sql string
- var values []interface{}
- if query.district != "" {
- sql += " AND b.district=? "
- values = append(values, query.district)
- } else if query.city != "" {
- sql += " AND b.city=? "
- values = append(values, query.city)
- } else if query.area != "" {
- sql += " AND b.area=? "
- values = append(values, query.area)
- }
- if query.topType != "" {
- if val, _ := consts.TopTypeMap[query.topType]; val != "" {
- sql += " AND b.toptype=? "
- values = append(values, val)
- } else {
- sql += " AND b.toptype=? "
- values = append(values, query.topType)
- }
- } else if query.subType != "" && query.keys == "" {
- sql += " AND b.subtype=? "
- values = append(values, query.subType)
- } else if query.topType == "" && query.subType == "" {
- sql += " AND (b.toptype !='拟建' AND b.toptype !='采购意向') "
- }
- values = append(values, maxTotal+50)
- queryRes, err := g.DB().Query(ctx, fmt.Sprintf(`SELECT b.bid_id
- FROM new_areaClass b
- WHERE 1=1 %s
- ORDER BY b.publish_time DESC
- LIMIT 0,?`, sql), values...)
- if err != nil || queryRes.IsEmpty() {
- return nil
- }
- return FillingBiddingBaseFields(ctx, queryRes.List())
- }
- // GetNodeByCode 根据code
- func (cRoot *ClassRoot) GetNodeByCode(code string) *ClassNode {
- return cRoot.allClassCodeMap[code]
- }
- // GetNodeByName 根据类型名字获取node
- func (cRoot *ClassRoot) GetNodeByName(name string) *ClassNode {
- return cRoot.allClassNameMap[name]
- }
- // GetRootNodeByCode 根据类型名字获取node
- func (cRoot *ClassRoot) GetRootNodeByCode(name string) *ClassNode {
- return cRoot.rootCodeMap[name]
- }
- // GetAllRootNodes 获取全部根地区节点
- func (cRoot *ClassRoot) GetAllRootNodes() []*ClassNode {
- return cRoot.rootList
- }
- // GetHot 获取热门行业
- func (cRoot *ClassRoot) GetHot() []*ClassNode {
- return cRoot.hotClass
- }
|