CoopHistoryService.go 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242
  1. package service
  2. import (
  3. "app.yhyue.com/moapp/jybase/common"
  4. elastic "app.yhyue.com/moapp/jybase/es"
  5. T "bp.jydev.jianyu360.cn/CRM/application/api/common"
  6. "bp.jydev.jianyu360.cn/CRM/application/api/internal/types"
  7. "context"
  8. "encoding/json"
  9. "fmt"
  10. "github.com/zeromicro/go-zero/core/logx"
  11. )
  12. var (
  13. INDEX_1 = "transaction_info"
  14. sql_2_0 = `SELECT buyer, buyer_id, agency, agency_id, property_form FROM information.transaction_info WHERE project_id = ?`
  15. sql_2_1 = `SELECT project_id, project_name, zbtime FROM information.transaction_info WHERE buyer_id = ? AND winner winner IN ? ORDER BY zbtime DESC`
  16. sql_2_2 = `SELECT b.company_id, b.company_name, b.contact_name, a.relate_id, a.relate_name FROM connection_introduce a INNER JOIN connection b ON b.position_id =%d AND a.connection_id = b.id AND b.state = 1 AND a.itype = 1 AND b.itype = 4 AND a.relate_Id = %s`
  17. es_query = `{
  18. "query": {
  19. "bool": {
  20. "must": [
  21. {
  22. "range": {
  23. "zbtime": {
  24. "gte": 123
  25. }
  26. }
  27. },
  28. {
  29. "term": {
  30. "buyer_id": "123"
  31. }
  32. }
  33. ],
  34. "must_not": {
  35. "term": {
  36. "property_form": "123123"
  37. }
  38. }
  39. }
  40. },
  41. "aggs": {
  42. "winner_count": {
  43. "terms": {
  44. "field": "winner",
  45. "size": 100,
  46. "order": {
  47. "_count": "desc"
  48. }
  49. },
  50. "aggs": {
  51. "amount_all": {
  52. "sum": {
  53. "field": "bidamount"
  54. }
  55. }
  56. }
  57. },
  58. "agency_count": {
  59. "terms": {
  60. "field": "agency",
  61. "size": 100,
  62. "order": {
  63. "_count": "desc"
  64. }
  65. },
  66. "aggs": {
  67. "amount_all": {
  68. "sum": {
  69. "field": "bidamount"
  70. }
  71. }
  72. }
  73. }
  74. },
  75. "size": 1
  76. }`
  77. )
  78. type ResultData struct {
  79. channelType int `json:"channel_type"`
  80. channel string `json:"channel"`
  81. size int `json:"size"`
  82. data []map[string]interface{} `json:"data"`
  83. }
  84. func GetPrList(req *types.CoopHistoryReq) (result []*ResultData) {
  85. pMap := make(map[string]interface{})
  86. err := T.ClickhouseConn.QueryRow(context.TODO(), sql_2_0, req.Pid).Scan(&pMap)
  87. if err != nil {
  88. return nil
  89. }
  90. propertyForm := ""
  91. m1 := T.CrmMysql.FindOne("config_tenant", map[string]interface{}{"account_id": req.EntAccountId}, "probusfor", "")
  92. if m1 != nil && len(*m1) > 0 {
  93. propertyForm = common.ObjToString((*m1)["probusfor"])
  94. }
  95. // 1、同甲异业数据/招标代理机构渠道
  96. if propertyForm != "" {
  97. r1, r2 := getData(propertyForm, common.ObjToString(pMap["buyer_id"]))
  98. if r1 != nil && len(r1) > 0 {
  99. tmp := &ResultData{
  100. channelType: 1,
  101. channel: "同甲异业渠道",
  102. size: len(r1),
  103. data: r1,
  104. }
  105. result = append(result, tmp)
  106. }
  107. if r2 != nil && len(r2) > 0 {
  108. tmp := &ResultData{
  109. channelType: 1,
  110. channel: "招标代理机构",
  111. size: len(r2),
  112. data: r2,
  113. }
  114. result = append(result, tmp)
  115. }
  116. }
  117. // 中间人可介绍业主
  118. r3 := getData1(req)
  119. if r3 != nil && len(r3) > 0 {
  120. tmp := &ResultData{
  121. channelType: 1,
  122. channel: "中间人",
  123. size: len(r3),
  124. data: r3,
  125. }
  126. result = append(result, tmp)
  127. }
  128. return
  129. }
  130. func getData(propertyForm, bid string) (result1, result2 []map[string]interface{}) {
  131. aggs, count, res := elastic.GetAggs(INDEX_1, INDEX_1, fmt.Sprintf(es_query, 1, propertyForm, bid))
  132. logx.Info("es聚合查询结果:", aggs, count, res)
  133. type AggStruct struct {
  134. Buckets []struct {
  135. Key string `json:"key,omitempty"`
  136. Doc_count int64 `json:"doc_count,omitempty"`
  137. Amount_all struct {
  138. Value string `json:"value,omitempty"`
  139. } `json:"amount_all"`
  140. } `json:"buckets"`
  141. }
  142. m1 := make(map[string]interface{}) //采购单位-中标单位
  143. m2 := make(map[string]interface{}) //采购单位-代理机构
  144. var m1Buckets = AggStruct{}
  145. if aggs != nil && aggs["winner_count"] != nil {
  146. bs, err := aggs["winner_count"].MarshalJSON()
  147. if err != nil {
  148. logx.Info(err)
  149. } else {
  150. if len(bs) == 0 {
  151. logx.Info(err)
  152. } else {
  153. err := json.Unmarshal(bs, &m1Buckets)
  154. logx.Info(err)
  155. if len(m1Buckets.Buckets) > 0 {
  156. for _, v := range m1Buckets.Buckets {
  157. m1[v.Key] = map[string]interface{}{"name": v.Key, "amount": v.Amount_all.Value, "count": v.Doc_count}
  158. }
  159. }
  160. }
  161. }
  162. }
  163. var m2Buckets = AggStruct{}
  164. if aggs != nil && aggs["amount_all"] != nil {
  165. bs, err := aggs["amount_all"].MarshalJSON()
  166. if err != nil {
  167. logx.Info(err)
  168. } else {
  169. if len(bs) == 0 {
  170. logx.Info(err)
  171. } else {
  172. err := json.Unmarshal(bs, &m2Buckets)
  173. logx.Info(err)
  174. if len(m2Buckets.Buckets) > 0 {
  175. for _, v := range m2Buckets.Buckets {
  176. m1[v.Key] = map[string]interface{}{"name": v.Key, "amount": v.Amount_all.Value, "count": v.Doc_count}
  177. }
  178. }
  179. }
  180. }
  181. }
  182. for k, v := range m1 {
  183. if m2[k] != nil {
  184. tmp := make(map[string]interface{})
  185. tmp["name"] = v
  186. tmp["coop_size"] = v
  187. tmp["coop_amount"] = m2[k]
  188. result1 = append(result1, tmp)
  189. }
  190. }
  191. for k, v := range m2 {
  192. if m2[k] != nil {
  193. tmp := make(map[string]interface{})
  194. tmp["name"] = v
  195. tmp["coop_size"] = v
  196. tmp["coop_amount"] = m2[k]
  197. result2 = append(result2, tmp)
  198. }
  199. }
  200. // 合作项目, 业主与中标单位
  201. for _, v := range result1 {
  202. rows, err := T.ClickhouseConn.Query(context.TODO(), sql_2_1, bid, v["name"])
  203. var mlist []map[string]interface{}
  204. for err != nil && rows.Next() {
  205. m := make(map[string]interface{})
  206. rows.Scan(&m)
  207. mlist = append(mlist, m)
  208. }
  209. v["data"] = mlist
  210. }
  211. // 业主与代理机构
  212. for _, v := range result2 {
  213. rows, err := T.ClickhouseConn.Query(context.TODO(), sql_2_1, bid, v["name"])
  214. var mlist []map[string]interface{}
  215. for err != nil && rows.Next() {
  216. m := make(map[string]interface{})
  217. rows.Scan(&m)
  218. mlist = append(mlist, m)
  219. }
  220. v["data"] = mlist
  221. }
  222. return
  223. }
  224. func getData1(req *types.CoopHistoryReq) (result []map[string]interface{}) {
  225. info := T.CrmMysql.SelectBySql(sql_2_2, req.PositionId, req.Pid)
  226. if info != nil && len(*info) > 0 {
  227. for _, m := range *info {
  228. result = append(result, map[string]interface{}{"name": m["company_name"], "pserson": m["contact_name"]})
  229. }
  230. }
  231. return
  232. }