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 }