123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358 |
- package service
- import (
- elastic "app.yhyue.com/moapp/jybase/es"
- "context"
- "fmt"
- "github.com/gogf/gf/v2/frame/g"
- "github.com/gogf/gf/v2/util/gconv"
- "math/rand"
- "strings"
- "time"
- )
- var (
- JySeoEnterprises *Enterprises = &Enterprises{}
- )
- type (
- Enterprises struct{}
- MapsTotalResp struct {
- Total int `json:"total"`
- List []map[string]interface{} `json:"list"`
- UpdateTime int64 `json:"updateTime"`
- }
- )
- const (
- NewMustSearch = `{"query":{"bool":{"must":[%s]}}%s}`
- biddingIndex, biddingType = "bidding", "bidding"
- )
- // GetEnterprisesList 获取最新采购单位或中标企业列表
- // identityType : 0 采购单位 1-中标单位
- // limit: 数量
- func (*Enterprises) GetEnterprisesList(ctx context.Context, identityType, pageNum, pageSize, limit int) (res *MapsTotalResp, err error) {
- key := fmt.Sprintf("enterpriseList_%d_%d_%d_%d", identityType, pageNum, pageSize, limit)
- gVal, err := g.Redis().Get(ctx, key)
- if err == nil && !gVal.IsNil() {
- res = &MapsTotalResp{}
- if err := gVal.Struct(res); err == nil {
- return res, nil
- }
- }
- var sql string
- if identityType == 0 {
- sql = fmt.Sprintf(`
- SELECT c.seo_id AS sid,c.name,c.company_id AS id,b.NAME AS buyerclass,p.area AS province,ca.city AS city
- FROM (
- SELECT dfeb.seo_id,dfeb.NAME, dfeb.company_id, dfeb.area_code, dfeb.city_code, dfeb.name_id,dfet.labelvalues
- FROM global_common_data.dws_f_ent_baseinfo dfeb
- INNER JOIN global_common_data.dws_f_ent_tags dfet
- ON (dfeb.identity_type &(1 << 0)) > 0 AND dfeb.name_id = dfet.name_id
- ORDER BY dfeb.latest_time DESC LIMIT %d
- ) c LEFT JOIN global_common_data.code_buyerclass b ON (b. CODE = c.labelvalues)
- LEFT JOIN global_common_data.code_area p ON (p. CODE = c.area_code)
- LEFT JOIN global_common_data.code_area ca ON (ca. CODE = c.city_code)`, limit)
- } else if identityType == 1 {
- sql = fmt.Sprintf(`
- SELECT c.seo_id AS sid,c.name, c.company_id AS id,c.address,cb.legal_person,cb.company_status,cb.capital,DATE_FORMAT(cb.establish_date, '%s') AS establish_date,cb.company_phone
- FROM (
- SELECT seo_id,name, company_id,address
- FROM global_common_data.dws_f_ent_baseinfo
- WHERE company_id!=''and (identity_type & (1 << 1)) > 0
- order by latest_time desc LIMIT %d
- ) c left join global_common_data.company_baseinfo cb on(cb.company_id=c.company_id)`, "%Y-%m-%d", limit)
- }
- rData, err := g.DB("tidb").Query(ctx, sql)
- if err != nil {
- return nil, fmt.Errorf("查询数据异常")
- }
- if count := rData.Len(); count > 0 {
- urlFlag := "dw"
- if identityType == 1 {
- urlFlag = "qy"
- }
- finalList := rData.List()
- for i := 0; i < count; i++ {
- finalList[i]["url"] = fmt.Sprintf("/%s/%s.html", urlFlag, gconv.String(finalList[i]["sid"]))
- if state := gconv.String(finalList[i]["company_status"]); state != "" {
- finalList[i]["company_status"] = strings.Split(state, "(")[0]
- }
- }
- totalPage := count / pageSize
- if count%pageSize != 0 {
- totalPage++
- }
- for i := 1; i <= gconv.Int(totalPage); i++ {
- start, end := (i-1)*pageSize, (i)*pageSize
- if end > count {
- end = count
- }
- pageTmp := &MapsTotalResp{
- Total: totalPage,
- List: finalList[start:end],
- }
- if i == pageNum {
- res = pageTmp
- }
- if err := g.Redis().SetEX(ctx, fmt.Sprintf("enterpriseList_%d_%d_%d_%d", identityType, i, pageSize, limit), pageTmp, 60*60*24); err != nil {
- g.Log().Errorf(ctx, "第%d页数据 存储redis err:%v", i, err)
- }
- }
- }
- return res, nil
- }
- // GetEntDetailMsg 查询企业详细信息
- func (*Enterprises) GetEntDetailMsg(ctx context.Context, seoId string, isWinner bool) map[string]interface{} {
- if isWinner {
- res, err := g.DB("tidb").Query(context.Background(), `
- SELECT c.seo_id AS sid,c.name,cb.*,DATE_FORMAT(cb.establish_date, '%Y-%m-%d') AS establish_formatDate,ca.area as areaName
- FROM (
- SELECT seo_id,name, company_id,address
- FROM global_common_data.dws_f_ent_baseinfo
- WHERE company_id !='' and (identity_type & (1 << 1)) > 0
- and seo_id = ?
- ) c LEFT JOIN global_common_data.company_baseinfo cb on(cb.company_id=c.company_id)
- LEFT JOIN global_common_data.code_area ca on(cb.area_code=ca.code )`, seoId)
- if err != nil {
- g.Log().Errorf(ctx, "GetEntDetailMsg 异常", err)
- }
- if res.Len() == 1 {
- return res.List()[0]
- }
- } else {
- res, err := g.DB("tidb").Query(context.Background(), `
- SELECT c.*,cb.name AS buyerclass,ca.area as areaName ,ca.city as cityName FROM
- (SELECT name,area_code,city_code,name_id FROM global_common_data.dws_f_ent_baseinfo WHERE seo_id = ?) c
- LEFT JOIN global_common_data.dws_f_ent_tags dfet on(c.name_id=dfet.name_id )
- LEFT JOIN global_common_data.code_buyerclass cb on(dfet.labelvalues=cb.code)
- LEFT JOIN global_common_data.code_area ca on(IF(c.city_code,ca.code=c.city_code,ca.code=c.area_code))`, seoId)
- if err != nil {
- g.Log().Errorf(ctx, "GetEntDetailMsg 异常", err)
- }
- if res.Len() == 1 {
- return res.List()[0]
- }
- }
- return nil
- }
- // GetDynamicNews 未登录用户动态信息
- func (pwp *Enterprises) GetDynamicNews(ctx context.Context, name string, isWinner bool) (res *MapsTotalResp, err error) {
- if name == "" {
- return
- }
- res = &MapsTotalResp{}
- redisKey := fmt.Sprintf("free_portrait_list_%s", name)
- gVal, err := g.Redis().Get(ctx, redisKey)
- if err == nil && !gVal.IsNil() {
- if err := gVal.Struct(res); err == nil {
- return res, nil
- }
- }
- res.Total = gconv.Int(elastic.Count(biddingIndex, biddingType, pareSelect(name, isWinner, true)))
- if res.Total == 0 {
- return
- }
- list := elastic.Get(biddingIndex, biddingType, pareSelect(name, isWinner, false))
- if list != nil && len(*list) > 0 {
- res.List = *list
- }
- res.UpdateTime = time.Now().Unix()
- _ = g.Redis().SetEX(ctx, redisKey, res, 60*60*24*7)
- return
- }
- // RelevanceData 关联单位
- func (pwp *Enterprises) RelevanceData(ctx context.Context, name string, isWinner bool) (randomMaps []map[string]interface{}) {
- if name == "" {
- return nil
- }
- redisKey := fmt.Sprintf("portrait_relevance_%v_%s", isWinner, name)
- getFullArr, fromCache := func() (data []map[string]interface{}, fromCache bool) {
- gVal, err := g.Redis().Get(ctx, redisKey)
- if err == nil && !gVal.IsNil() {
- if err := gVal.Struct(&data); err == nil {
- fromCache = true
- return
- }
- }
- data = []map[string]interface{}{}
- querySql := `{"query": {"bool": {"must": [%s]}},"_source":["buyer","s_winner","entidlist"],"size": 200}`
- var mustSql string
- if isWinner {
- mustSql = fmt.Sprintf(`{"terms": {"entidlist": ["%s"]}},{"exists": {"field": "buyer"}}`, name)
- } else {
- mustSql = fmt.Sprintf(`{"match": {"buyer": "%s"}},{"exists": {"field": "s_winner"}},{"exists": {"field": "entidlist"}}`, name)
- }
- getData := elastic.Get(biddingIndex, biddingType, fmt.Sprintf(querySql, mustSql))
- if getData != nil && len(*getData) > 0 {
- queryMap := make(map[string]bool)
- if !isWinner { //采购关联企业 校验正确性
- for _, v := range *getData {
- for _, name := range gconv.Strings(v["entidlist"]) {
- queryMap[name] = true
- }
- }
- } else {
- for _, v := range *getData {
- for _, name := range gconv.Strings(v["buyer"]) {
- queryMap[name] = true
- }
- }
- }
- if len(queryMap) == 0 {
- return
- }
- var queryArr []string = make([]string, 0, len(queryMap))
- for name, _ := range queryMap {
- queryArr = append(queryArr, name)
- }
- var sql string
- if !isWinner {
- sql = fmt.Sprintf(`SELECT name,seo_id FROM global_common_data.dws_f_ent_baseinfo WHERE company_id in ("%s")`, strings.Join(queryArr, `","`))
- } else {
- sql = fmt.Sprintf(`SELECT name,seo_id FROM global_common_data.dws_f_ent_baseinfo WHERE name in ("%s")`, strings.Join(queryArr, `","`))
- }
- //根据采购单位名字或中标企业id查询seo_id
- dbRes, _ := g.DB("tidb").Query(ctx, sql)
- if dbRes.IsEmpty() {
- return
- }
- for _, m := range dbRes.List() {
- name, seo_id := gconv.String(m["name"]), gconv.String(m["seo_id"])
- if name == "" || seo_id == "" {
- continue
- }
- var url string
- if isWinner {
- url = fmt.Sprintf("/dw/%s.html", seo_id)
- } else {
- url = fmt.Sprintf("/qy/%s.html", seo_id)
- }
- data = append(data, map[string]interface{}{
- "name": name,
- "url": url,
- })
- }
- }
- return
- }()
- if !fromCache {
- _ = g.Redis().SetEX(ctx, redisKey, getFullArr, 60*60*24)
- }
- if len(getFullArr) > 10 { //大于10 随机取10个
- rand.Seed(time.Now().UnixNano())
- start := rand.Intn(len(getFullArr) - 10)
- randomMaps = getFullArr[start : start+10]
- }
- return
- }
- // RecommendedData 其他推荐
- // name 名称 province 省份 isWinner 来源是否中标企业画像 false 来源企业画像
- func (pwp *Enterprises) RecommendedData(ctx context.Context, name, province string, isWinner bool) (rData []map[string]interface{}) {
- if name == "" || province == "" || len(province) != 6 {
- return
- }
- redisKey := fmt.Sprintf("jyseo_portrait_recommended_%v_%s", isWinner, province)
- getFullArr, formCache := func() (data []map[string]interface{}, formCache bool) {
- data = []map[string]interface{}{}
- province = province[:2] + "0000"
- gVal, err := g.Redis().Get(ctx, redisKey)
- if err == nil && !gVal.IsNil() {
- if err := gVal.Struct(&data); err == nil {
- formCache = true
- return
- }
- }
- var sql string
- if isWinner {
- sql = fmt.Sprintf(`
- SELECT name,seo_id FROM global_common_data.dws_f_ent_baseinfo
- WHERE area_code = %s
- AND (identity_type & (1 << 1)) > 0
- ORDER BY latest_time desc limit 200
- `, province)
- } else {
- sql = fmt.Sprintf(`
- SELECT name,seo_id FROM global_common_data.dws_f_ent_baseinfo
- WHERE area_code = %s
- AND (identity_type &(1 << 0)) > 0
- ORDER BY latest_time desc limit 200
- `, province)
- }
- dbRes, _ := g.DB("tidb").Query(ctx, sql)
- if dbRes.IsEmpty() {
- return
- }
- for _, m := range dbRes.List() {
- name, seo_id := gconv.String(m["name"]), gconv.String(m["seo_id"])
- if name == "" || seo_id == "" {
- continue
- }
- var url string
- if isWinner {
- url = fmt.Sprintf("/qy/%s.html", seo_id)
- } else {
- url = fmt.Sprintf("/dw/%s.html", seo_id)
- }
- data = append(data, map[string]interface{}{
- "name": name,
- "url": url,
- })
- }
- return
- }()
- if !formCache {
- _ = g.Redis().SetEX(ctx, redisKey, getFullArr, 60*60*24)
- }
- if len(getFullArr) > 0 { //大于10 随机取10个
- if len(getFullArr) > 10 {
- rand.Seed(time.Now().UnixNano())
- start := rand.Intn(len(getFullArr) - 10)
- return getFullArr[start : start+10]
- }
- return getFullArr
- } else { //TODO 无数据从运行数据从取
- }
- return
- }
- func pareSelect(name string, isWinner, onlyCount bool) string {
- sYear := 2018
- //返回默认时间
- sTimeStamp := time.Date(sYear, 1, 1, 0, 0, 0, 0, time.Local)
- var (
- mustQueryArr []string
- fields string
- )
- if isWinner {
- fields = `"_id","projectname","bidamount","budget","title","publishtime","subtype","toptype","area","bidopentime","buyer"`
- mustQueryArr = append(mustQueryArr, fmt.Sprintf(`{"term":{"entidlist":"%s"}}`, name))
- mustQueryArr = append(mustQueryArr, fmt.Sprintf(`{"range":{"publishtime":{"gte":"%d","lte":"%d"}}}`, sTimeStamp.Unix(), time.Now().Unix()))
- } else {
- fields = `"bidstatus","_id","title","subtype","projectname","publishtime","area","bidamount","budget","bidopentime","s_winner","entidlist"`
- mustQueryArr = append(mustQueryArr, fmt.Sprintf(`{"term":{"buyer":"%s"}}`, name))
- mustQueryArr = append(mustQueryArr, fmt.Sprintf(`{"range":{"publishtime":{"gte":"%d","lte":"%d"}}}`, sTimeStamp.Unix(), time.Now().Unix()))
- }
- if onlyCount {
- return fmt.Sprintf(NewMustSearch, strings.Join(mustQueryArr, ","), "")
- } else {
- return fmt.Sprintf(NewMustSearch, strings.Join(mustQueryArr, ","), fmt.Sprintf(`,"_source":[%s],"sort":{%s},"from":0,"size":30`, fields, `"publishtime":"desc","id":"desc"`))
- }
- }
|