Bläddra i källkod

feat:匿名状态画像详情页接口

wangkaiyue 1 år sedan
förälder
incheckning
4a7dd63d27

+ 10 - 0
README.MD

@@ -1,3 +1,13 @@
 ### 版本记录
 + dev1.0.0 新增移动端代码
 + dev1.1.0 新增省市级关键词聚合
+
+
+### 1.0.1.7待做工作
++ tdk
++ 猜你喜欢
++ a链接target="_blank"
+
++ 增量全部数据匹配
++ 行业关键词匹配正文
++ keywords页面

+ 6 - 6
internal/cmd/cmd.go

@@ -38,13 +38,13 @@ var (
 				group.GET("/tags/letter/{letterCode}_{pageNum}.html", controller.LetterIndexHandler)                                           //字母标签页
 				group.GET("/tags/letter/{industryClassId}_{areaCode}_{sTypeId}_{letterCode}_{keywordCode}.html", controller.LetterListHandler) //字母列表页
 
-				group.GET("/dw/", controller.EnterpriseList)             //采购单位列表
-				group.GET("/dw/p{pageNum}", controller.EnterpriseList)   //采购单位列表
-				group.GET("/dw/{eid}.html", controller.EnterpriseDetail) //采购单位详情
+				group.GET("/dw/", controller.EnterpriseList)               //采购单位列表
+				group.GET("/dw/p{pageNum}", controller.EnterpriseList)     //采购单位列表
+				group.GET("/dw/{seoId}.html", controller.EnterpriseDetail) //采购单位详情
 
-				group.GET("/qy/", controller.EnterpriseList)             //中标企业列表
-				group.GET("/qy/p{pageNum}", controller.EnterpriseList)   //中标企业列表
-				group.GET("/qy/{eid}.html", controller.EnterpriseDetail) //中标企业详情
+				group.GET("/qy/", controller.EnterpriseList)               //中标企业列表
+				group.GET("/qy/p{pageNum}", controller.EnterpriseList)     //中标企业列表
+				group.GET("/qy/{seoId}.html", controller.EnterpriseDetail) //中标企业详情
 			})
 			s.AddStaticPath("/jyseo", "/resource/staticres") //静态资源
 			s.Run()

+ 32 - 7
internal/controller/enterprise.go

@@ -45,11 +45,36 @@ func EnterpriseList(r *ghttp.Request) {
 }
 
 func EnterpriseDetail(r *ghttp.Request) {
-	service.HtmlRender.Render(r, utility.GetCommonRenderPatch(r.Request.UserAgent(), "enterprise_detail.html"),
-		g.Map{
-			//"list": rData.List,
-			//"tdk":        service.JySeoTdk.GetAreaSTypeListTdk(r.Context(), sTypeNode.Code, areaNode.Name),
-			//"pagination": service.GetLetterPaging(pageNum, gconv.Int(rData.Total), fmt.Sprintf("/list/%s/%s_%s/p%s", areaType, areaCode, sId, "%d")),
-		},
-	)
+	seoId := r.Get("seoId").String() //页码
+	status, flag, err := getRequestType(r)
+	if err != nil {
+		service.HtmlRender.NotFound(r)
+		return
+	}
+	rData := g.Map{"flag": flag}
+	switch status {
+	case 0: //采购单位
+		baseInfo := service.JySeoEnterprises.GetEntDetailMsg(r.Context(), seoId, false)
+		if baseInfo == nil || len(baseInfo) == 0 {
+			service.HtmlRender.NotFound(r)
+			return
+		}
+		rData["entDetail"] = baseInfo
+		dynamicNews, _ := service.JySeoEnterprises.GetDynamicNews(r.Context(), gconv.String(baseInfo["name"]), false)
+		rData["dynamicNews"] = dynamicNews
+		rData["otherEnt"] = service.JySeoEnterprises.RelevanceData(r.Context(), gconv.String(baseInfo["name"]), false)
+		rData["recommendedEnt"] = service.JySeoEnterprises.RecommendedData(r.Context(), gconv.String(baseInfo["name"]), gconv.String(baseInfo["area_code"]), false) //其他企业推荐
+	case 1: //中标企业
+		baseInfo := service.JySeoEnterprises.GetEntDetailMsg(r.Context(), seoId, true)
+		if baseInfo == nil || len(baseInfo) == 0 {
+			service.HtmlRender.NotFound(r)
+			return
+		}
+		rData["entDetail"] = baseInfo                                                                                                                                      //企业基本信息
+		dynamicNews, _ := service.JySeoEnterprises.GetDynamicNews(r.Context(), gconv.String(baseInfo["company_id"]), true)                                                 //企业动态
+		rData["dynamicNews"] = dynamicNews                                                                                                                                 //企业中标动态
+		rData["otherEnt"] = service.JySeoEnterprises.RelevanceData(r.Context(), gconv.String(baseInfo["company_id"]), true)                                                //关联采购单位
+		rData["recommendedEnt"] = service.JySeoEnterprises.RecommendedData(r.Context(), gconv.String(baseInfo["company_name"]), gconv.String(baseInfo["area_code"]), true) //其他企业推荐
+	}
+	service.HtmlRender.Render(r, utility.GetCommonRenderPatch(r.Request.UserAgent(), "enterprise_detail.html"), rData)
 }

+ 264 - 79
internal/service/enterpriseStruct.go

@@ -1,11 +1,14 @@
 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 (
@@ -16,11 +19,17 @@ type (
 	Enterprises struct{}
 
 	MapsTotalResp struct {
-		Total int                      `json:"total"`
-		List  []map[string]interface{} `json:"list"`
+		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: 数量
@@ -36,9 +45,9 @@ func (*Enterprises) GetEnterprisesList(ctx context.Context, identityType, pageNu
 	var sql string
 	if identityType == 0 {
 		sql = fmt.Sprintf(`
-			SELECT c.id AS sid,c.name,c.company_id AS id,b.NAME AS buyerclass,p.area AS province,ca.city AS city
+			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.id,dfeb.NAME, dfeb.company_id, dfeb.area_code, dfeb.city_code, dfeb.name_id,dfet.labelvalues
+				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
@@ -48,12 +57,12 @@ func (*Enterprises) GetEnterprisesList(ctx context.Context, identityType, pageNu
 				LEFT JOIN global_common_data.code_area ca ON (ca. CODE = c.city_code)`, limit)
 	} else if identityType == 1 {
 		sql = fmt.Sprintf(`
-			SELECT c.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  
+			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 id,name, company_id,address
+				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
+				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)
 	}
 
@@ -100,74 +109,250 @@ func (*Enterprises) GetEnterprisesList(ctx context.Context, identityType, pageNu
 	return res, nil
 }
 
-// GetEnterprisesListOld 获取最新采购单位或中标企业列表
-// identityType : 0 采购单位 1-中标单位
-// limit: 数量
-//func (*Enterprises) GetEnterprisesListOld(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
-//		}
-//	}
-//
-//	arr, err := func() (r []string, err error) {
-//		res, err := g.DB("tidb").Query(context.Background(), "SELECT  company_id AS end_id,name_id as buyer_id FROM global_common_data.dws_f_ent_baseinfo WHERE company_id !='' and company_id is not null  AND (identity_type &(1 << ?)) > 0 order by latest_time desc  limit ?", identityType, limit)
-//		if err != nil {
-//			return nil, err
-//		}
-//		for _, m := range res.List() {
-//			if identityType == 0 {
-//				r = append(r, gconv.String(m["buyer_id"]))
-//			} else if identityType == 1 {
-//				r = append(r, gconv.String(m["end_id"]))
-//			}
-//		}
-//		return
-//	}()
-//
-//	if err != nil {
-//		return nil, err
-//	}
-//	if len(arr) == 0 {
-//		return nil, nil
-//	}
-//
-//	var finalArr []map[string]interface{}
-//	switch identityType {
-//	case 0:
-//		if res := elastic.Get("buyer", "buyer", fmt.Sprintf(`{"query":{"bool":{"must":[{"terms":{"id":["%s"]}}]}},"size":%d,"_source":["_id","name","province","city","buyerclass"]}`, strings.Join(arr, `","`), limit)); res != nil && len(*res) > 0 {
-//			finalArr = *res
-//		}
-//	case 1:
-//		if res := elastic.Get("qyxy", "qyxy", fmt.Sprintf(`{"query":{"bool":{"must":[{"terms":{"id":["%s"]}}]}},"size":%d,"_source":["_id","company_name","company_status","legal_person","capital","establish_date","company_phone","company_address"]}`, strings.Join(arr, `","`), limit)); res != nil && len(*res) > 0 {
-//			finalArr = *res
-//		}
-//	}
-//
-//	if count := len(finalArr); count > 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:  finalArr[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"`))
+	}
+}

+ 13 - 2
internal/tags/init.go

@@ -1,8 +1,11 @@
 package tags
 
 import (
+	"fmt"
 	"github.com/gogf/gf/v2/frame/g"
+	"github.com/gogf/gf/v2/util/gconv"
 	"jyseo/internal/service"
+	"jyseo/utility"
 )
 
 func init() {
@@ -18,8 +21,8 @@ func init() {
 	g.View().BindFunc("Cdn", Cdn) //静态资源
 
 	g.View().BindFunc("Cdn2", func() string { //开发环境使用,上线续删除
-		return "/jyseo"
-		//return Cdn()
+		//return "/jyseo"
+		return Cdn()
 	}) //静态资源
 
 	// 工具类
@@ -29,7 +32,15 @@ func init() {
 	g.View().BindFunc("ConvString", ConvString)
 	g.View().BindFunc("ConvInt64", ConvInt64)
 	g.View().BindFunc("CardFormat", CardFormat)
+	g.View().BindFunc("EncodeId", utility.EncodeId)
 	g.View().BindFunc("Split", Split)
+	g.View().BindFunc("FormatMoney", func(val interface{}) string {
+		if fVal := gconv.Float64(val); fVal == 0 {
+			return ""
+		} else {
+			return fmt.Sprintf("%.2f", fVal)
+		}
+	})
 	//g.View().BindFunc("Highlight", Highlight)
 
 	g.View().BindFunc("GetMiniTab", GetMiniTab) //查询Tab数据

+ 0 - 6
manifest/config/config.yaml

@@ -35,12 +35,6 @@ elasticsearch:
   "userName": ""
   "password": ""
 
-entMongodb:
-  address: "192.168.3.206:27080"
-  size: 5
-  dbName: "qfw"
-  replSet: ""
-
 redis:
   default: # 配置seo的redis
     address: 127.0.0.1:6379

Filskillnaden har hållts tillbaka eftersom den är för stor
+ 0 - 0
manifest/config/global.yaml


+ 102 - 0
resource/template/mobile/enterprise_detail.html

@@ -0,0 +1,102 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+    <meta charset="UTF-8">
+    <title>{{.tdk.Title}}</title>
+    <meta name="Keywords" content='{{.tdk.KeyWords}}'/>
+    <meta name="Description" content='{{.tdk.Description}}'/>
+    <meta name="applicable-device" content="pc" />
+    <meta name="viewport" content="width=device-width,minimum-scale=1.0,maximum-scale=1.0,initial-scale=1.0" user-scalable="no" />
+    <link href="//cdn-common.jianyu360.com/cdn/lib/reset-css/5.0.1/reset.min.css" rel="stylesheet" type="text/css" />
+    <link href="https://cdn-common.jianyu360.com/cdn/lib/bootstrap/4.5.0/bootstrap.min.css" rel="stylesheet" type="text/css" />
+    <link href='{{Cdn}}/jyseo/css/common.css?v={{Msg "version"}}' rel="stylesheet" type="text/css" />
+    <link href='{{Cdn}}/jyseo/css/icons.css?v={{Msg "version"}}' rel="stylesheet" type="text/css" />
+    <link href='{{Cdn}}/jyseo/css/header.css?v={{Msg "version"}}' rel="stylesheet">
+    <link href='{{Cdn}}/jyseo/css/card.css?v={{Msg "version"}}' rel="stylesheet" type="text/css" />
+    <link href="https://cdn-common.jianyu360.com/cdn/lib/element-ui/2.15.13-rc/lib/theme-chalk/index.css" rel="stylesheet">
+    <link href='{{Cdn}}/jyseo/css/index.css?v={{Msg "version"}}' rel="stylesheet" type="text/css" />
+    <script src="https://cdn-common.jianyu360.com/cdn/lib/jquery/3.6.0/jquery.min.js"></script>
+    <script src="/common-module/public/head.js"></script>
+
+</head>
+<body style="background-color: #F5F6F7;">
+<div class="page-container">
+    <header class="page-header">
+        <!-- 顶部导航 -->
+        {{include "pc/common/header.html" .}}
+    </header>
+    <main class="page-main page-main-stype">
+        <table>
+            <tr>
+                <td style="width: 11%;">法人代表</td>
+                <td>{{.entDetail.legal_person}}</td>
+            </tr>
+            <tr>
+                <td>经营状态</td>
+                <td>{{.entDetail.company_status}}</td>
+            </tr>
+            <tr>
+                <td>社会统一信用代码</td>
+                <td>{{.entDetail.credit_no}}</td>
+            </tr>
+            <tr>
+                <td>成立日期</td>
+                <td>{{.entDetail.establish_formatDate}}</td>
+            </tr>
+            <tr>
+                <td>组织机构代码</td>
+                <td>{{.entDetail.org_code}}</td>
+            </tr>
+            <tr>
+                <td>注册资本</td>
+                <td>{{if .entDetail.capital}} {{.entDetail.capital}}万元 {{end}}</td>
+            </tr>
+            <tr>
+                <td>纳税人识别号</td>
+                <td>{{.entDetail.tax_code}}</td>
+            </tr>
+            <tr>
+                <td>营业期限</td>
+                <td>
+                    {{if or (.entDetail.operation_startdate) (.entDetail.operation_enddate) }}
+                    {{.entDetail.operation_startdate}} 至 {{.entDetail.operation_enddate}}
+                    {{end}}
+                </td>
+            </tr>
+            <tr>
+                <td>工商注册号</td>
+                <td>{{.entDetail.company_code}}</td>
+            </tr>
+            <tr>
+                <td>公司类型</td>
+                <td>{{.entDetail.company_type}}</td>
+            </tr>
+            <tr>
+                <td>人员规模</td>
+                <td>{{.entDetail.employee_no}}</td>
+            </tr>
+            <tr>
+                <td>联系方式</td>
+                <td>{{.entDetail.company_phone}}</td>
+            </tr>
+            <tr>
+                <td>注册地址</td>
+                <td>{{.entDetail.company_address}}</td>
+            </tr>
+            <tr>
+                <td>经营范围</td>
+                <td>{{.entDetail.business_scope}}</td>
+            </tr>
+        </table>
+    </main>
+    <footer class="page-footer">
+        {{include "pc/components/ad-bottom.html" .}}
+        {{include "pc/common/footer.html" .}}
+    </footer>
+</div>
+<script src="https://cdn-common.jianyu360.com/cdn/lib/bootstrap/4.5.0/bootstrap.min.js"></script>
+<script src='{{Cdn}}/jyseo/js/common.js?v={{Msg "version"}}'></script>
+<script src='{{Cdn}}/jyseo/js/area-stype-list-pagination.js?v={{Msg "version"}}'></script>
+<script src='{{Cdn}}/jyseo/js/index.js?v={{Msg "version"}}'></script>
+</body>
+</html>

+ 134 - 0
resource/template/pc/enterprise_detail.html

@@ -0,0 +1,134 @@
+<h1>企业测试地址 :</h1>
+<a href="/qy/1084868750098116.html">广东商文科技有限公司</a>
+<h1>采购单位测试地址 :</h1>
+<a href="/dw/1084868750033507.html">河南工程学院</a>
+<a href="/dw/085004540044635.html">益阳市林业局</a>
+{{$global:=.}}
+{{if eq $global.flag "qy"}}
+    <!--企业画像-->
+    <h1>{{$global.entDetail.company_name}}</h1>
+
+    <table>
+        <tr>
+            <td style="width: 11%;">法人代表</td>
+            <td>{{if $global.entDetail.legal_person}}{{$global.entDetail.legal_person}}{{end}}</td>
+        </tr>
+        <tr>
+            <td>经营状态</td>
+            <td>{{$global.entDetail.company_status}}</td>
+        </tr>
+        <tr>
+            <td>社会统一信用代码</td>
+            <td>{{$global.entDetail.credit_no}}</td>
+        </tr>
+        <tr>
+            <td>成立日期</td>
+            <td>{{$global.entDetail.establish_formatDate}}</td>
+        </tr>
+        <tr>
+            <td>组织机构代码</td>
+            <td>{{$global.entDetail.org_code}}</td>
+        </tr>
+        <tr>
+            <td>注册资本</td>
+            <td>{{if $global.entDetail.capital}} {{$global.entDetail.capital}}万元 {{end}}</td>
+        </tr>
+        <tr>
+            <td>纳税人识别号</td>
+            <td>{{$global.entDetail.tax_code}}</td>
+        </tr>
+        <tr>
+            <td>营业期限</td>
+            <td>
+                {{if or ($global.entDetail.operation_startdate) ($global.entDetail.operation_enddate) }}
+                {{$global.entDetail.operation_startdate}} 至 {{$global.entDetail.operation_enddate}}
+                {{end}}
+            </td>
+        </tr>
+        <tr>
+            <td>工商注册号</td>
+            <td>{{$global.entDetail.company_code}}</td>
+        </tr>
+        <tr>
+            <td>公司类型</td>
+            <td>{{$global.entDetail.company_type}}</td>
+        </tr>
+        <tr>
+            <td>人员规模</td>
+            <td>{{$global.entDetail.employee_no}}</td>
+        </tr>
+        <tr>
+            <td>联系方式</td>
+            <td>{{$global.entDetail.company_phone}}</td>
+        </tr>
+        <tr>
+            <td>注册地址</td>
+            <td>{{$global.entDetail.company_address}}</td>
+        </tr>
+        <tr>
+            <td>经营范围</td>
+            <td>{{$global.entDetail.business_scope}}</td>
+        </tr>
+    </table>
+{{else}}
+<!--采购单位画像-->
+<h1>{{$global.entDetail.name}}</h1>
+<table>
+    <tr>
+        <td>所在地</td>
+        <td>
+            {{if $global.entDetail.areaName}} {{$global.entDetail.areaName}} {{end}}
+            {{if $global.entDetail.cityName}} {{$global.entDetail.cityName}} {{end}}
+        </td>
+    </tr>
+    <tr>
+        <td>采购单位类型</td>
+        <td>{{if $global.entDetail.buyerclass}} {{$global.entDetail.buyerclass}} {{end}}</td>
+    </tr>
+</table>
+{{end}}
+
+
+{{if .dynamicNews}}
+<h1>招标动态{{.dynamicNews.Total}}</h1>
+<ul>
+    {{range $v:= .dynamicNews.List}}
+    <li>
+        <a href="/nologin/content/{{$v._id | EncodeId}}.html">{{$v.title}}</a> {{$v.publishtime | date "Y-m-d"}} <br>
+        {{if or (eq $v.toptype "其它") (not $v.toptype)}}{{$v.subtype}}{{else}}{{$v.toptype}}{{end}}
+        {{$v.area}}
+        {{if $v.bidamount}}{{1000 | divide  $v.bidamount |FormatMoney}}万元{{else if $v.budget}}{{ 1000 | divide $v.budget |FormatMoney}}万元{{end}}
+    </li>
+    {{end}}
+</ul>
+{{end}}
+
+{{if .otherEnt}}
+<h1>相关采购单位</h1>
+<ul>
+    {{range $v:=  .otherEnt}}
+    <li><a href="{{$v.url}}">{{$v.name}}</a></li>
+    {{end}}
+</ul>
+{{end}}
+
+
+
+<h1>其他企业推荐</h1>
+<ul>
+    {{range $v:=  .recommendedEnt}}
+    <li><a href="{{$v.url}}">{{$v.name}}</a></li>
+    {{end}}
+</ul>
+
+{{if $global.entDetail.areaName}}
+    {{range $v:=JySeoRootAreaList}}
+        {{if and (eq $v.Name $global.entDetail.areaName) (not $v.Special)}}
+<h1>{{$global.entDetail.areaName}}地区导航</h1>
+            {{range $n:=$v.Child}}
+                <a href="/list/city/{{$n.Code}}.html">{{$n.Name}}</a>
+            {{end}}
+        {{end}}
+    {{end}}
+{{end}}
+

+ 0 - 219
utility/anonymousPortrait.go

@@ -1,219 +0,0 @@
-package utility
-
-import (
-	"app.yhyue.com/moapp/jybase/common"
-	elastic "app.yhyue.com/moapp/jybase/es"
-	"app.yhyue.com/moapp/jybase/redis"
-	"encoding/json"
-	"errors"
-	"fmt"
-	"math/rand"
-	"strings"
-	"time"
-)
-
-// PortraitScreen 画像筛选
-type PortraitScreen struct {
-	Ent        string //企业id
-	Match      string //检索词 50个字符
-	MatchRange string //搜索范围 项目名称/项目标的物、招标代理机构、采购单位、中标单位
-	ExactMatch bool   //匹配方式 true精确匹配、false模糊匹配
-	Area       string //省份
-	ScopeClass string //行业
-	BuyerClass string //采购单位类型
-	TimeRange  string //信息发布时间 以年为单位,逗号分隔、结束时间不得超过当前时间
-	HasPower   bool   //是否有相应权限
-	//数据导出回显
-	PareStartTime, PareEndTime int64 //筛选时间戳
-	ShowMatch                  string
-	KeyWordArr                 []string
-	UserLevel                  int //用户身份 3:未登录;2:免费;1:付费
-}
-
-// PortraitProjectScreen 动态翻页
-type PortraitProjectScreen struct {
-	Ent      string //企业id
-	PageNum  int    //页码
-	PageSize int    //每页数量
-}
-
-const (
-	NewMustSearch             = `{"query":{"bool":{"must":[%s]}}%s}`
-	biddingIndex, biddingType = "bidding", "bidding"
-)
-
-// 未登录用户动态信息
-func (pwp *PortraitProjectScreen) FreeBuyerNews(name string, isWinner bool) ([]map[string]interface{}, int64, error) {
-	if pwp.Ent == "" {
-		return nil, 0, errors.New("参数错误")
-	}
-	pwp.PageNum = common.If(pwp.PageNum == 0, 1, pwp.PageNum).(int)     //默认第一页
-	pwp.PageSize = common.If(pwp.PageSize == 0, 10, pwp.PageSize).(int) //默认每页10条
-
-	redisKey := fmt.Sprintf("free_portrait_list_%s", pwp.Ent)
-	var data []map[string]interface{}
-	if rBytes, err := redis.GetBytes("other", redisKey); err == nil && len(*rBytes) != 0 {
-		_ = json.Unmarshal(*rBytes, &data)
-	} else {
-		list := elastic.Get(biddingIndex, biddingIndex, PareSelect(name, isWinner))
-		if list != nil && len(*list) > 0 {
-			data = *list
-			go func() {
-				redis.Put("other", redisKey, data, int(redisTime()))
-			}()
-		}
-	}
-	total := int64(len(data))
-	if len(data) > 0 {
-		start := (pwp.PageNum - 1) * pwp.PageSize
-		// 对数据切片进行裁剪
-		if start < 0 {
-			start = 0
-		}
-		if start >= len(data) {
-			data = []map[string]interface{}{}
-		} else {
-			end := start + pwp.PageSize
-			if end > len(data) {
-				end = len(data)
-			}
-			data = data[start:end]
-		}
-	}
-	return data, total, nil
-}
-
-// PareSelect sql
-func PareSelect(name string, isWinner 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()))
-	}
-	return fmt.Sprintf(NewMustSearch, strings.Join(mustQueryArr, ","), fmt.Sprintf(`,"_source":[%s],"sort":{%s},"from":0,"size":30`, fields, `"publishtime":"desc","id":"desc"`))
-}
-
-func redisTime() float64 {
-	currentTime := time.Now()
-
-	currentWeekday := currentTime.Weekday()
-	daysUntilMonday := time.Monday - currentWeekday
-	if daysUntilMonday < 0 {
-		daysUntilMonday += 7
-	}
-	nextMonday := currentTime.AddDate(0, 0, int(daysUntilMonday))
-
-	nextMondayMidnight := time.Date(nextMonday.Year(), nextMonday.Month(), nextMonday.Day(), 0, 0, 0, 0, nextMonday.Location())
-
-	return nextMondayMidnight.Sub(currentTime).Seconds()
-}
-
-func RelevanceData(name string, isWinner bool) []map[string]interface{} {
-	if name == "" {
-		return nil
-	}
-	redisKey := fmt.Sprintf("portrait_relevance_%v_%s", isWinner, name)
-	var data []map[string]interface{}
-	if rBytes, err := redis.GetBytes("other", redisKey); err == nil && len(*rBytes) != 0 {
-		_ = json.Unmarshal(*rBytes, &data)
-	} else {
-		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 {
-			if !isWinner { //采购关联企业 校验正确性
-				entMap := make(map[string]string)
-				for _, v := range *getData {
-					s_winner := common.InterfaceToStr(v["s_winner"])
-					entidlist, _ := v["entidlist"].([]interface{})
-					winners := strings.Split(s_winner, ",")
-					if s_winner == "" || entidlist == nil || len(winners) != len(entidlist) {
-						continue
-					}
-					//中标企业去重
-					for k, v1 := range winners {
-						entMap[v1] = EncodeId(common.InterfaceToStr(entidlist[k]))
-					}
-				}
-				for entname, entid := range entMap {
-					data = append(data, map[string]interface{}{"s_winner": entname, "entidlist": []string{entid}})
-				}
-			} else {
-				data = *getData
-			}
-
-			go func() {
-				redis.Put("other", redisKey, data, 24*3600)
-			}()
-		}
-	}
-	var start int
-	if len(data) > 10 { //大于10 随机取10个
-		rand.Seed(time.Now().UnixNano())
-		start = rand.Intn(len(data) - 10)
-		data = data[start : start+10]
-	}
-	return data
-}
-
-// name 名称 province 省份 isWinner 来源是否中标企业画像 false 来源企业画像
-func RecommendedData(name, province string, isWinner bool) []map[string]interface{} {
-	var data []map[string]interface{}
-	if name != "" && province != "" && province != "其他" {
-		redisKey := fmt.Sprintf("portrait_recommended_%v_%s", isWinner, province)
-		if rBytes, err := redis.GetBytes("other", redisKey); err == nil && len(*rBytes) != 0 {
-			_ = json.Unmarshal(*rBytes, &data)
-		} else {
-			if isWinner {
-				winnerData, _ := Mgo_Ent.Find("qyxy_std", map[string]interface{}{"company_area": province, "name": map[string]interface{}{"$ne": name}},
-					"", `{"company_area": 1,"_id": 1,"company_name": 1,}`, true, 0, 200)
-				if winnerData != nil && len(*winnerData) > 0 {
-					for _, v := range *winnerData {
-						v["id"] = EncodeId(common.InterfaceToStr(v["_id"]))
-						delete(v, "_id")
-					}
-					data = *winnerData
-				}
-			} else {
-				qsl := `{"query": {"bool": {"must": [{"term": {"province": "%s"}}],"must_not": [{"term": {"name": "%s"}}]}},"_source":["buyer_name"],"size": 200}`
-				buyerData := elastic.Get("buyer", "buyer", fmt.Sprintf(qsl, province, name))
-				if buyerData != nil {
-					data = *buyerData
-				}
-			}
-			if len(data) > 0 {
-				go func() {
-					redis.Put("other", redisKey, data, 24*3600)
-				}()
-			}
-		}
-		var start int
-		if len(data) > 10 { //大于10 随机取10个
-			rand.Seed(time.Now().UnixNano())
-			start = rand.Intn(len(data) - 10)
-			data = data[start : start+10]
-		}
-	}
-
-	//TODO 无数据从运行数据从取
-	if len(data) == 0 {
-
-	}
-	return data
-}

+ 0 - 12
utility/db.go

@@ -32,7 +32,6 @@ var (
 	elasticConf esConf
 	mongdbConf  mgoConf
 	Mgo         m.MongodbSim
-	Mgo_Ent     m.MongodbSim
 )
 
 func init() {
@@ -54,17 +53,6 @@ func init() {
 		panic(err)
 	}
 
-	Mgo_Ent = m.MongodbSim{
-		MongodbAddr: mongdbConf.Address,
-		Size:        mongdbConf.Size,
-		DbName:      mongdbConf.DbName,
-		UserName:    mongdbConf.UserName,
-		Password:    mongdbConf.Password,
-		ReplSet:     mongdbConf.ReplSet,
-	}
-	Mgo_Ent.InitPool()
-	g.Log().Info(context.Background(), "初始化 mongodb 完成")
-
 	if err := g.Cfg().MustGet(initCtx, "elasticsearch").Struct(&elasticConf); err != nil {
 		panic(err)
 	}

Vissa filer visades inte eftersom för många filer har ändrats