浏览代码

Merge branch 'master' into feature/v4.8.96

lianbingjie 1 年之前
父节点
当前提交
adc92573d9

+ 2 - 1
src/jfw/modules/bigmember/src/config.json

@@ -187,5 +187,6 @@
   "nsq": "192.168.3.240:4260",
   "nsq_topic": "jy_event",
   "attachmentResPower": ["bi_sj_sjqk","bi_sf_sjqd","bi_sj_yyszs"],
-  "msgMaxCount": 20000
+  "msgMaxCount": 20000,
+  "analysisPDFPhone": "13027620557"
 }

+ 1 - 0
src/jfw/modules/bigmember/src/config/config.go

@@ -77,6 +77,7 @@ type config struct {
 	Nsq_topic           string   `json:"nsq_topic"`
 	AttachmentResPower  []string `json:"attachmentResPower"`
 	MsgMaxCount         int      `json:"msgMaxCount"`
+	AnalysisPDFPhone    string   `json:"analysisPDFPhone"`
 }
 
 type CustomerInfo struct {

+ 10 - 10
src/jfw/modules/bigmember/src/entity/marketAnalysis/customized_analysis.go

@@ -327,17 +327,17 @@ func ProjectScale(thisRow AreaCTop) (data []interface{}) {
 		Name      string  `bson:"Name"`
 		Persent_c float64 `bson:"Persent_c"`
 		Persent_a float64 `bson:"Persent_a"`
+		Ammount   float64 `json:"ammount"`
+		Total     int64   `json:"total"`
 	}
 	for _, v := range buckets {
-		name := v.Name
-		percent_a := Formula(float64(v.Total), float64(total))
-		percent_c := Formula(v.SumSortprice.Value, ammount)
-		sc := Scale{
-			Name:      name,
-			Persent_c: percent_c,
-			Persent_a: percent_a,
-		}
-		data = append(data, sc)
+		data = append(data, Scale{
+			Name:      v.Name,
+			Ammount:   v.SumSortprice.Value,
+			Total:     v.Total,
+			Persent_a: Formula(float64(v.Total), float64(total)),
+			Persent_c: Formula(v.SumSortprice.Value, ammount),
+		})
 	}
 	return
 }
@@ -364,7 +364,7 @@ func InterToSliceString(obj interface{}) []string {
 // top10
 func (mae *MarketAnalysisEntity) ProjectTop10() (rMap map[string]interface{}, err error) {
 	finalSql := fmt.Sprintf(mae.GetCommonQuerySql(), query_top10)
-    log.Println("ProjectTop10:",finalSql)
+	log.Println("ProjectTop10:", finalSql)
 	hits := elastic.Get("projectset", "projectset", finalSql)
 	rMap = map[string]interface{}{}
 	bArr := []map[string]interface{}{}

+ 146 - 3
src/jfw/modules/bigmember/src/entity/marketAnalysis/marketAnalysisEntity.go

@@ -7,6 +7,7 @@ import (
 	"app.yhyue.com/moapp/jybase/mongodb"
 	"app.yhyue.com/moapp/jybase/redis"
 	"encoding/json"
+	"errors"
 	"fmt"
 	"jy/src/jfw/modules/bigmember/src/config"
 	"jy/src/jfw/modules/bigmember/src/db"
@@ -45,7 +46,9 @@ const (
 	Tablejianyu_mar_user_account = "jianyu.mar_user_account"     // 离线市场报告分析关键词标准信息表
 )
 
-var MarketAnalysisPool chan bool
+var (
+	MarketAnalysisPool chan bool
+)
 
 func init() {
 	MarketAnalysisPool = make(chan bool, config.Config.MarketAnalysisPool.Limit)
@@ -111,6 +114,7 @@ type MarketAnalysisEntity struct {
 	Phone         string // 手机号
 	PositionId    int
 	OriginalTotal int64 // 数据总数
+	Source        string
 }
 
 type projectInfo struct {
@@ -222,6 +226,101 @@ func (mae *MarketAnalysisEntity) ForMatData() error {
 	return nil
 }
 
+// ForMatData 获取格式化请求参数
+func (mae *MarketAnalysisEntity) ForMatDataPdf() error {
+	//格式化订阅词
+	if err := json.Unmarshal([]byte(mae.BaseParam.KeysItemsStr), &mae.FormatParam.KeysItems); err != nil {
+		return fmt.Errorf("关键词组格式异常")
+	}
+
+	//格式化时间段
+	if timeArr := strings.Split(mae.BaseParam.RangeTime, "-"); len(timeArr) == 2 {
+		mae.FormatParam.STime = qutil.Int64All(timeArr[0])
+		mae.FormatParam.ETime = qutil.Int64All(timeArr[1])
+		if mae.FormatParam.STime == 0 || mae.FormatParam.ETime == 0 {
+			return fmt.Errorf("开始时间和结束时间不能为空")
+		}
+	} else {
+		return fmt.Errorf("时间戳格式异常")
+	}
+	//格式化省份、城市
+	if areaStr := strings.TrimSpace(mae.BaseParam.Area); areaStr != "" {
+		imap := map[string][]string{}
+		if err := json.Unmarshal([]byte(mae.BaseParam.Area), &imap); err != nil {
+			return fmt.Errorf("非法地区信息")
+		}
+		var city, area []string
+		for name, v := range imap {
+			if len(v) == 0 {
+				area = append(area, name)
+			} else {
+				for _, vv := range v {
+					city = append(city, vv)
+				}
+			}
+		}
+		mae.FormatParam.Area = area
+		mae.FormatParam.City = city
+	}
+	//格式化行业
+	if industryStr := strings.TrimSpace(mae.BaseParam.Industry); industryStr != "" {
+		imap := map[string][]string{}
+		if err := json.Unmarshal([]byte(industryStr), &imap); err != nil {
+			return fmt.Errorf("非法行业信息")
+		}
+		var farr []string
+		for name, v := range imap {
+			for _, vv := range v {
+				farr = append(farr, fmt.Sprintf("%s_%s", name, vv))
+			}
+		}
+		mae.FormatParam.Industry = farr
+	}
+	//格式化类型
+	if buyerClassStr := strings.TrimSpace(mae.BaseParam.BuyerClass); buyerClassStr != "" {
+		mae.FormatParam.BuyerClass = strings.Split(buyerClassStr, ",")
+	}
+	//中标企业
+	mae.FormatParam.Winner = mae.BaseParam.Winner
+	//采购单位
+	mae.FormatParam.Buyer = mae.BaseParam.Buyer
+	//排序
+	mae.FormatParam.Sort = qutil.If(mae.BaseParam.Sort != 0 && mae.BaseParam.Sort != 1, 0, mae.BaseParam.Sort).(int)
+	if mae.BaseParam.PageNum*mae.BaseParam.PageSize > config.Config.ProjectCount {
+		mae.BaseParam.PageNum = config.Config.ProjectCount / mae.BaseParam.PageSize
+	}
+	//当前页码
+	mae.FormatParam.PageNum = qutil.If(mae.BaseParam.PageNum < 1 || mae.BaseParam.PageNum > 1000, 1, mae.BaseParam.PageNum).(int)
+	//默认每页10条
+	mae.FormatParam.PageSize = qutil.If(mae.BaseParam.PageSize < 1 || mae.BaseParam.PageSize > 100, 50, mae.BaseParam.PageSize).(int)
+	data := map[string]interface{}{
+		"s_keysItems":      mae.BaseParam.KeysItemsStr,
+		"s_rangeTime":      mae.BaseParam.RangeTime,
+		"s_rangeTimeExtra": mae.BaseParam.RangeTimeExtra,
+		"s_area":           mae.BaseParam.Area,
+		"s_industry":       mae.BaseParam.Industry,
+		"s_buyerClass":     mae.BaseParam.BuyerClass,
+		"s_matchingMode":   mae.BaseParam.MatchingMode,
+		"s_userId":         mae.UId,
+		"s_parentId":       mae.Pid,
+		"s_mgoUserId":      mae.MgoUserId,
+		"i_positionId":     mae.PositionId,
+		"s_phone":          mae.Phone,
+		"audit":            1,
+	}
+	if mae.OriginalTotal > 0 {
+		data["l_originalTotal"] = mae.OriginalTotal
+	}
+	if mae.Source != "" {
+		data["source"] = mae.Source
+	}
+	rs, b := db.Mgo.FindOne(ReportHistoryTable, data)
+	if b && rs != nil && len(*rs) > 0 {
+		return errors.New("当期分析已存在")
+	}
+	return nil
+}
+
 // GetProjectInfoList 项目明细
 func (mae *MarketAnalysisEntity) GetProjectInfoList() error {
 	var (
@@ -287,10 +386,10 @@ func (mae *MarketAnalysisEntity) SaveAnalysisRecord() error {
 		"s_matchingMode":   mae.BaseParam.MatchingMode,
 		"s_userId":         mae.UId,
 		"s_parentId":       mae.Pid,
-		"i_state":          mae.State,         //状态:默认0:生成中;1:已生成;2:已取消;-1:生成失败
+		"i_state":          1,                 //状态:默认0:生成中;1:已生成;2:已取消;-1:生成失败
 		"l_updateTime":     time.Now().Unix(), //生成时间 or 取消时间
 		"l_createTime":     time.Now().Unix(),
-		"i_offline":        mae.Offline,
+		"i_offline":        2,
 		"s_mgoUserId":      mae.MgoUserId,
 		"i_positionId":     mae.PositionId,
 		"s_phone":          mae.Phone,
@@ -298,6 +397,9 @@ func (mae *MarketAnalysisEntity) SaveAnalysisRecord() error {
 	if mae.OriginalTotal > 0 {
 		data["l_originalTotal"] = mae.OriginalTotal
 	}
+	if mae.Source != "" {
+		data["source"] = mae.Source
+	}
 	mae.MgoRecordId = db.Mgo.Save(ReportHistoryTable, data)
 	if mae.MgoRecordId == "" {
 		return fmt.Errorf("分析创建异常")
@@ -402,6 +504,47 @@ func (mae *MarketAnalysisEntity) GetRecordList(pageNum, PageSize int) (total int
 	return
 }
 
+func (mae *MarketAnalysisEntity) GetRecordPdfList(pageNum, PageSize int) (total int, list []map[string]interface{}) {
+	queryMap := map[string]interface{}{
+		"i_del":  map[string]interface{}{"$ne": 1},
+		"source": "analysisPDF",
+	}
+	if mae.UId == mae.Pid { //主账号
+		queryMap["s_parentId"] = mae.Pid
+	} else {
+		queryMap["s_userId"] = mae.UId
+	}
+	if pageNum == 1 {
+		total = db.Mgo.Count(ReportHistoryTable, queryMap)
+		if total == 0 {
+			return
+		}
+	} else {
+		total = -1
+	}
+	res, _ := db.Mgo.Find(ReportHistoryTable, queryMap, `{"l_createTime":-1}`, nil, false, (pageNum-1)*PageSize, PageSize)
+	if res == nil || len(*res) == 0 {
+		return
+	}
+	for _, row := range *res {
+		data := map[string]interface{}{
+			"id":               util.EncodeId(mongodb.BsonIdToSId(row["_id"])),
+			"keysItems":        qutil.ObjToString(row["s_keysItems"]),
+			"area":             qutil.ObjToString(row["s_area"]),
+			"industry":         qutil.ObjToString(row["s_industry"]),
+			"buyerclass":       qutil.ObjToString(row["s_buyerClass"]),
+			"rangeTime":        qutil.ObjToString(row["s_rangeTime"]),
+			"s_rangeTimeExtra": qutil.ObjToString(row["s_rangeTimeExtra"]),
+			"createTime":       qutil.Int64All(row["l_createTime"]),
+			"matchingMode":     qutil.ObjToString(row["s_matchingMode"]), //项目匹配方式
+			"updateTime":       qutil.Int64All(row["l_updateTime"]),
+			"audit":            qutil.Int64All(row["audit"]),
+		}
+		list = append(list, data)
+	}
+	return
+}
+
 // GetQueryItem 获取查询条件,前端回显使用
 func (mae *MarketAnalysisEntity) getQueryItem() (map[string]interface{}, error) {
 	return map[string]interface{}{

+ 89 - 0
src/jfw/modules/bigmember/src/service/report/marketAnalysis.go

@@ -2,11 +2,13 @@ package report
 
 import (
 	"app.yhyue.com/moapp/jybase/go-xweb/httpsession"
+	"errors"
 	"fmt"
 	"jy/src/jfw/modules/bigmember/src/config"
 	"jy/src/jfw/modules/bigmember/src/entity/marketAnalysis"
 	"jy/src/jfw/modules/bigmember/src/util"
 	"log"
+	"strings"
 	"time"
 
 	. "app.yhyue.com/moapp/jybase/api"
@@ -26,6 +28,9 @@ type MarketAnalysis struct {
 	cancel            xweb.Mapper `xweb:"/marketAnalysis/cancel"`            // 取消分析
 	isOffline         xweb.Mapper `xweb:"/marketAnalysis/isOffline"`         // 是否为离线查询
 	delete            xweb.Mapper `xweb:"/marketAnalysis/delete"`            // 删除报告
+
+	doAnalysisPdf   xweb.Mapper `xweb:"/marketAnalysis/doAnalysisPdf"`   //市场分析分析查询仅用于运营生成pdf(此接口只做为保存查询条件,返回记录id)
+	analysisPdfList xweb.Mapper `xweb:"/marketAnalysis/analysisPdfList"` //市场分析分析查询仅用于运营生成pdf 列表
 }
 
 // 项目明细
@@ -120,6 +125,90 @@ const (
 	AnalysisStatusAnalyzing = 2 // 存在正在生成的报告
 )
 
+// DoAnalysis 开始分析报告
+func (this *MarketAnalysis) DoAnalysisPdf() {
+	sessVal := this.Session().GetMultiple()
+	mgoUserId := qutil.ObjToString(sessVal["mgoUserId"])
+	userId := qutil.ObjToString(sessVal["userId"])
+	positionId := qutil.IntAll(sessVal["positionId"])
+	phone := qutil.ObjToString(sessVal["phone"])
+	rData, errMsg := func() (interface{}, error) {
+		if phone == "" || !strings.Contains(config.Config.AnalysisPDFPhone, phone) {
+			log.Printf("配置手机号:%s,登录手机号:%s\n", config.Config.AnalysisPDFPhone, phone)
+			return nil, errors.New("手机号用户无权益")
+		}
+		pid, powerErr := checkPower(this.Session())
+		if powerErr != nil {
+			return nil, powerErr
+		}
+		//接受参数
+		bParam := marketAnalysis.AnalysisRequestParam{
+			KeysItemsStr:   this.GetString("keysItems"),      //分析内容【字符串】结构和o_member_jy.a_items保持一致
+			RangeTime:      this.GetString("rangeTime"),      //时间【字符串】 时间戳开始-结束时间戳
+			RangeTimeExtra: this.GetString("rangeTimeExtra"), //时间【字符串】 时间戳开始-结束时间戳
+			Area:           this.GetString("area"),           //省份【字符串】多个省份用逗号拼接
+			Industry:       this.GetString("industry"),       //行业【字符串】多个行业用逗号拼接
+			BuyerClass:     this.GetString("buyerclass"),     //采购单位类型【字符串】多个采购单位类型用逗号拼接
+			MatchingMode:   this.GetString("matchingMode"),   //匹配方式
+		}
+		mae := &marketAnalysis.MarketAnalysisEntity{BaseParam: bParam, UId: userId, Pid: pid, MgoUserId: mgoUserId, PositionId: positionId, Phone: phone, Source: "analysisPDF"}
+		if err := mae.ForMatDataPdf(); err != nil {
+			return nil, err
+		}
+
+		//存储分析记录
+		if err := mae.SaveAnalysisRecord(); err != nil {
+			return nil, err
+		}
+		//存储clickhouse
+		data := map[string]interface{}{
+			"id": util.EncodeId(mae.MgoRecordId),
+		}
+		return data, nil
+	}()
+	if errMsg != nil {
+		log.Printf("%s MarketAnalysis DoAnalysis Error:%s\n", userId, errMsg.Error())
+	}
+	this.ServeJson(NewResult(rData, errMsg))
+}
+
+func (this *MarketAnalysis) AnalysisPdfList() {
+	sessVal := this.Session().GetMultiple()
+	mgoUserId := qutil.ObjToString(sessVal["mgoUserId"])
+	userId := qutil.ObjToString(sessVal["userId"])
+	positionId := qutil.IntAll(sessVal["positionId"])
+	phone := qutil.ObjToString(sessVal["phone"])
+	rData, errMsg := func() (interface{}, error) {
+		if phone == "" || !strings.Contains(config.Config.AnalysisPDFPhone, phone) {
+			log.Printf("配置手机号:%s,登录手机号:%s\n", config.Config.AnalysisPDFPhone, phone)
+			return nil, errors.New("手机号用户无权益")
+		}
+		pid, powerErr := checkPower(this.Session())
+		if powerErr != nil {
+			return nil, powerErr
+		}
+		//接受参数
+		pageNum, pageNumErr := this.GetInteger("pageNum") //页码
+		if pageNumErr != nil {
+			pageNum = 1
+		}
+		pageSize, pageSizeErr := this.GetInteger("pageSize") //每页数量
+		if pageSizeErr != nil {
+			pageSize = 10
+		}
+		mae := &marketAnalysis.MarketAnalysisEntity{UId: userId, Pid: pid, MgoUserId: mgoUserId, PositionId: positionId}
+		total, list := mae.GetRecordPdfList(pageNum, pageSize)
+		return map[string]interface{}{
+			"total": total,
+			"list":  list,
+		}, nil
+	}()
+	if errMsg != nil {
+		log.Printf("%s MarketAnalysis AnalysisHistory Error:%s\n", userId, errMsg.Error())
+	}
+	this.ServeJson(NewResult(rData, errMsg))
+}
+
 // DoAnalysis 开始分析报告
 func (this *MarketAnalysis) DoAnalysis() {
 	sessVal := this.Session().GetMultiple()