scalerefine.go 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224
  1. package marketanalysis
  2. import "sort"
  3. const (
  4. _ = iota
  5. onlyTotal
  6. onlyAmount
  7. totalAndAmount
  8. topWinnerLimit = 3 //细分市场展示前x个企业
  9. topItemLimit = 300 //返回前x组关键词
  10. )
  11. type scaleRefineData struct {
  12. Data []*scaleRefineRow
  13. Total simpleTotal
  14. Amount simpleSum
  15. IdSwitch map[string]string
  16. ReturnData struct {
  17. Overall []map[string]interface{}
  18. TotalTop, AmountTop []*returnItem
  19. }
  20. IsOffline bool
  21. }
  22. type simpleTotal struct {
  23. Total int64 `json:"doc_count"`
  24. }
  25. type simpleSum struct {
  26. Value float64 `json:"value"`
  27. }
  28. type scaleRefineRow struct {
  29. Total int64 `json:"doc_count"`
  30. TotalProp float64 `json:"total_prop"`
  31. Amount simpleSum `json:"project_amount"`
  32. AmountProp float64 `json:"amount_prop"`
  33. WinnerTotalTop struct {
  34. Buckets []*struct {
  35. EntId string `json:"key"`
  36. EntName string `json:"entName"`
  37. Total int64 `json:"doc_count"`
  38. Prop float64 `json:"prop"`
  39. } `json:"buckets"`
  40. } `json:"winner_total_top"`
  41. WinnerAmountTop struct {
  42. Buckets []*struct {
  43. EntId string `json:"key"`
  44. EntName string `json:"entName"`
  45. Amount struct {
  46. Value float64 `json:"value"`
  47. } `json:"refine_winner_amount"`
  48. Prop float64 `json:"prop"`
  49. } `json:"buckets"`
  50. } `json:"winner_amount_top"`
  51. ItemName string `json:"itemName"`
  52. UpdateTime int64 `json:"updateTime"`
  53. }
  54. type returnItem struct {
  55. Name string `json:"name"`
  56. Value interface{} `json:"value"`
  57. Prop interface{} `json:"prop"`
  58. TopList []*entValue `json:"topList"`
  59. }
  60. type entValue struct {
  61. Id string `json:"id"`
  62. Name string `json:"name"`
  63. Value interface{} `json:"value"`
  64. Prop interface{} `json:"prop"`
  65. }
  66. // doIdSwitch 补充企业名称
  67. func (srd *scaleRefineData) doIdSwitch() {
  68. if len(srd.IdSwitch) == 0 {
  69. return
  70. }
  71. var ids []string
  72. for id, _ := range srd.IdSwitch {
  73. ids = append(ids, id)
  74. }
  75. srd.IdSwitch = GetEntNameByIds(ids)
  76. for _, v := range srd.ReturnData.TotalTop {
  77. var ents []*entValue
  78. for _, vv := range v.TopList {
  79. if !srd.IsOffline && len(ents) >= Top3 {
  80. break
  81. }
  82. vv.Name, _ = srd.IdSwitch[vv.Id]
  83. if vv.Name == "" {
  84. continue
  85. }
  86. vv.Id = encodeId(vv.Id)
  87. ents = append(ents, vv)
  88. }
  89. v.TopList = ents
  90. }
  91. for _, v := range srd.ReturnData.AmountTop {
  92. var ents []*entValue
  93. for _, vv := range v.TopList {
  94. if !srd.IsOffline && len(ents) >= Top3 {
  95. break
  96. }
  97. vv.Name, _ = srd.IdSwitch[vv.Id]
  98. if vv.Name == "" {
  99. continue
  100. }
  101. vv.Id = encodeId(vv.Id)
  102. ents = append(ents, vv)
  103. }
  104. v.TopList = ents
  105. }
  106. }
  107. // formatData 计算百分比&获取企业对应名称
  108. func (srd *scaleRefineData) formatData() {
  109. for _, v := range srd.Data {
  110. if srd.Total.Total == 0 {
  111. v.TotalProp = 0
  112. } else {
  113. v.TotalProp = float64(v.Total) / float64(srd.Total.Total)
  114. }
  115. if srd.Amount.Value == 0 {
  116. v.AmountProp = 0
  117. } else {
  118. v.AmountProp = v.Amount.Value / srd.Amount.Value
  119. }
  120. for _, vv := range v.WinnerTotalTop.Buckets {
  121. if v.Total == 0 {
  122. vv.Prop = 0
  123. } else {
  124. vv.Prop = float64(vv.Total) / float64(v.Total)
  125. }
  126. }
  127. for _, vv := range v.WinnerAmountTop.Buckets {
  128. if v.Amount.Value == 0 {
  129. vv.Prop = 0
  130. } else {
  131. vv.Prop = vv.Amount.Value / v.Amount.Value
  132. }
  133. }
  134. }
  135. srd.ReturnData.Overall = srd.sortBy(totalAndAmount).getOverallData()
  136. srd.ReturnData.AmountTop = srd.sortBy(onlyAmount).getFormatTop(topItemLimit, onlyAmount)
  137. srd.ReturnData.TotalTop = srd.sortBy(onlyTotal).getFormatTop(topItemLimit, onlyTotal)
  138. }
  139. // getOverallData 获取分类总览数据
  140. func (srd *scaleRefineData) getOverallData() (rData []map[string]interface{}) {
  141. for _, Value := range srd.Data {
  142. rData = append(rData, map[string]interface{}{
  143. "name": Value.ItemName,
  144. "total": Value.Total,
  145. "amount": Value.Amount.Value,
  146. })
  147. }
  148. return
  149. }
  150. // getArrayFormatTop 获取前n个数据,并格式化
  151. // limit 获取前x条
  152. // flag 1仅返回数量统计 2仅返回金额统计
  153. func (srd *scaleRefineData) getFormatTop(limit, flag int) (rData []*returnItem) {
  154. for index, Value := range srd.Data {
  155. if index >= limit && limit > -1 {
  156. return
  157. }
  158. thisRow := &returnItem{
  159. Name: Value.ItemName,
  160. }
  161. if flag == 1 || flag == 3 { //返回数量相关数据
  162. thisRow.Value = Value.Total
  163. if flag != 3 {
  164. for _, v := range Value.WinnerTotalTop.Buckets {
  165. thisRow.TopList = append(thisRow.TopList, &entValue{
  166. Id: v.EntId,
  167. Name: v.EntName,
  168. Value: v.Total,
  169. Prop: v.Prop,
  170. })
  171. srd.IdSwitch[v.EntId] = ""
  172. }
  173. thisRow.Prop = Value.TotalProp
  174. }
  175. }
  176. if flag == 2 || flag == 3 { //返回金额相关数据
  177. thisRow.Value = Value.Amount.Value
  178. if flag != 3 {
  179. for _, v := range Value.WinnerAmountTop.Buckets {
  180. thisRow.TopList = append(thisRow.TopList, &entValue{
  181. Id: v.EntId,
  182. Name: v.EntName,
  183. Value: v.Amount.Value,
  184. Prop: v.Prop,
  185. })
  186. srd.IdSwitch[v.EntId] = ""
  187. }
  188. thisRow.Prop = Value.TotalProp
  189. }
  190. }
  191. rData = append(rData, thisRow)
  192. }
  193. return
  194. }
  195. // getScaleRefineAll 根据订阅词组创建时间排序
  196. func (srd *scaleRefineData) sortBy(flag int) *scaleRefineData {
  197. sort.Slice(srd.Data, func(i, j int) bool {
  198. switch flag {
  199. case onlyTotal:
  200. return srd.Data[i].Total > srd.Data[j].Total
  201. case onlyAmount:
  202. return srd.Data[i].Amount.Value > srd.Data[j].Amount.Value
  203. case totalAndAmount:
  204. return srd.Data[i].UpdateTime > srd.Data[j].UpdateTime
  205. }
  206. return false
  207. })
  208. return srd
  209. }