123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224 |
- package marketanalysis
- import "sort"
- const (
- _ = iota
- onlyTotal
- onlyAmount
- totalAndAmount
- topWinnerLimit = 3 //细分市场展示前x个企业
- topItemLimit = 300 //返回前x组关键词
- )
- type scaleRefineData struct {
- Data []*scaleRefineRow
- Total simpleTotal
- Amount simpleSum
- IdSwitch map[string]string
- ReturnData struct {
- Overall []map[string]interface{}
- TotalTop, AmountTop []*returnItem
- }
- IsOffline bool
- }
- type simpleTotal struct {
- Total int64 `json:"doc_count"`
- }
- type simpleSum struct {
- Value float64 `json:"value"`
- }
- type scaleRefineRow struct {
- Total int64 `json:"doc_count"`
- TotalProp float64 `json:"total_prop"`
- Amount simpleSum `json:"project_amount"`
- AmountProp float64 `json:"amount_prop"`
- WinnerTotalTop struct {
- Buckets []*struct {
- EntId string `json:"key"`
- EntName string `json:"entName"`
- Total int64 `json:"doc_count"`
- Prop float64 `json:"prop"`
- } `json:"buckets"`
- } `json:"winner_total_top"`
- WinnerAmountTop struct {
- Buckets []*struct {
- EntId string `json:"key"`
- EntName string `json:"entName"`
- Amount struct {
- Value float64 `json:"value"`
- } `json:"refine_winner_amount"`
- Prop float64 `json:"prop"`
- } `json:"buckets"`
- } `json:"winner_amount_top"`
- ItemName string `json:"itemName"`
- UpdateTime int64 `json:"updateTime"`
- }
- type returnItem struct {
- Name string `json:"name"`
- Value interface{} `json:"value"`
- Prop interface{} `json:"prop"`
- TopList []*entValue `json:"topList"`
- }
- type entValue struct {
- Id string `json:"id"`
- Name string `json:"name"`
- Value interface{} `json:"value"`
- Prop interface{} `json:"prop"`
- }
- // doIdSwitch 补充企业名称
- func (srd *scaleRefineData) doIdSwitch() {
- if len(srd.IdSwitch) == 0 {
- return
- }
- var ids []string
- for id, _ := range srd.IdSwitch {
- ids = append(ids, id)
- }
- srd.IdSwitch = GetEntNameByIds(ids)
- for _, v := range srd.ReturnData.TotalTop {
- var ents []*entValue
- for _, vv := range v.TopList {
- if !srd.IsOffline && len(ents) >= Top3 {
- break
- }
- vv.Name, _ = srd.IdSwitch[vv.Id]
- if vv.Name == "" {
- continue
- }
- vv.Id = encodeId(vv.Id)
- ents = append(ents, vv)
- }
- v.TopList = ents
- }
- for _, v := range srd.ReturnData.AmountTop {
- var ents []*entValue
- for _, vv := range v.TopList {
- if !srd.IsOffline && len(ents) >= Top3 {
- break
- }
- vv.Name, _ = srd.IdSwitch[vv.Id]
- if vv.Name == "" {
- continue
- }
- vv.Id = encodeId(vv.Id)
- ents = append(ents, vv)
- }
- v.TopList = ents
- }
- }
- // formatData 计算百分比&获取企业对应名称
- func (srd *scaleRefineData) formatData() {
- for _, v := range srd.Data {
- if srd.Total.Total == 0 {
- v.TotalProp = 0
- } else {
- v.TotalProp = float64(v.Total) / float64(srd.Total.Total)
- }
- if srd.Amount.Value == 0 {
- v.AmountProp = 0
- } else {
- v.AmountProp = v.Amount.Value / srd.Amount.Value
- }
- for _, vv := range v.WinnerTotalTop.Buckets {
- if v.Total == 0 {
- vv.Prop = 0
- } else {
- vv.Prop = float64(vv.Total) / float64(v.Total)
- }
- }
- for _, vv := range v.WinnerAmountTop.Buckets {
- if v.Amount.Value == 0 {
- vv.Prop = 0
- } else {
- vv.Prop = vv.Amount.Value / v.Amount.Value
- }
- }
- }
- srd.ReturnData.Overall = srd.sortBy(totalAndAmount).getOverallData()
- srd.ReturnData.AmountTop = srd.sortBy(onlyAmount).getFormatTop(topItemLimit, onlyAmount)
- srd.ReturnData.TotalTop = srd.sortBy(onlyTotal).getFormatTop(topItemLimit, onlyTotal)
- }
- // getOverallData 获取分类总览数据
- func (srd *scaleRefineData) getOverallData() (rData []map[string]interface{}) {
- for _, Value := range srd.Data {
- rData = append(rData, map[string]interface{}{
- "name": Value.ItemName,
- "total": Value.Total,
- "amount": Value.Amount.Value,
- })
- }
- return
- }
- // getArrayFormatTop 获取前n个数据,并格式化
- // limit 获取前x条
- // flag 1仅返回数量统计 2仅返回金额统计
- func (srd *scaleRefineData) getFormatTop(limit, flag int) (rData []*returnItem) {
- for index, Value := range srd.Data {
- if index >= limit && limit > -1 {
- return
- }
- thisRow := &returnItem{
- Name: Value.ItemName,
- }
- if flag == 1 || flag == 3 { //返回数量相关数据
- thisRow.Value = Value.Total
- if flag != 3 {
- for _, v := range Value.WinnerTotalTop.Buckets {
- thisRow.TopList = append(thisRow.TopList, &entValue{
- Id: v.EntId,
- Name: v.EntName,
- Value: v.Total,
- Prop: v.Prop,
- })
- srd.IdSwitch[v.EntId] = ""
- }
- thisRow.Prop = Value.TotalProp
- }
- }
- if flag == 2 || flag == 3 { //返回金额相关数据
- thisRow.Value = Value.Amount.Value
- if flag != 3 {
- for _, v := range Value.WinnerAmountTop.Buckets {
- thisRow.TopList = append(thisRow.TopList, &entValue{
- Id: v.EntId,
- Name: v.EntName,
- Value: v.Amount.Value,
- Prop: v.Prop,
- })
- srd.IdSwitch[v.EntId] = ""
- }
- thisRow.Prop = Value.TotalProp
- }
- }
- rData = append(rData, thisRow)
- }
- return
- }
- // getScaleRefineAll 根据订阅词组创建时间排序
- func (srd *scaleRefineData) sortBy(flag int) *scaleRefineData {
- sort.Slice(srd.Data, func(i, j int) bool {
- switch flag {
- case onlyTotal:
- return srd.Data[i].Total > srd.Data[j].Total
- case onlyAmount:
- return srd.Data[i].Amount.Value > srd.Data[j].Amount.Value
- case totalAndAmount:
- return srd.Data[i].UpdateTime > srd.Data[j].UpdateTime
- }
- return false
- })
- return srd
- }
|