package service import ( "app.yhyue.com/moapp/jybase/common" elastic "app.yhyue.com/moapp/jybase/es" T "bp.jydev.jianyu360.cn/CRM/application/api/common" "bp.jydev.jianyu360.cn/CRM/application/api/internal/types" "context" "encoding/json" "fmt" "github.com/zeromicro/go-zero/core/logx" ) var ( INDEX_1 = "transaction_info" sql_2_0 = `SELECT buyer, buyer_id, agency, agency_id, property_form FROM information.transaction_info WHERE project_id = ?` sql_2_1 = `SELECT project_id, project_name, zbtime FROM information.transaction_info WHERE buyer_id = ? AND winner winner IN ? ORDER BY zbtime DESC` 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` es_query = `{ "query": { "bool": { "must": [ { "range": { "zbtime": { "gte": 123 } } }, { "term": { "buyer_id": "123" } } ], "must_not": { "term": { "property_form": "123123" } } } }, "aggs": { "winner_count": { "terms": { "field": "winner", "size": 100, "order": { "_count": "desc" } }, "aggs": { "amount_all": { "sum": { "field": "bidamount" } } } }, "agency_count": { "terms": { "field": "agency", "size": 100, "order": { "_count": "desc" } }, "aggs": { "amount_all": { "sum": { "field": "bidamount" } } } } }, "size": 1 }` ) type ResultData struct { channelType int `json:"channel_type"` channel string `json:"channel"` size int `json:"size"` data []map[string]interface{} `json:"data"` } func GetPrList(req *types.CoopHistoryReq) (result []*ResultData) { pMap := make(map[string]interface{}) err := T.ClickhouseConn.QueryRow(context.TODO(), sql_2_0, req.Pid).Scan(&pMap) if err != nil { return nil } propertyForm := "" m1 := T.CrmMysql.FindOne("config_tenant", map[string]interface{}{"account_id": req.EntAccountId}, "probusfor", "") if m1 != nil && len(*m1) > 0 { propertyForm = common.ObjToString((*m1)["probusfor"]) } // 1、同甲异业数据/招标代理机构渠道 if propertyForm != "" { r1, r2 := getData(propertyForm, common.ObjToString(pMap["buyer_id"])) if r1 != nil && len(r1) > 0 { tmp := &ResultData{ channelType: 1, channel: "同甲异业渠道", size: len(r1), data: r1, } result = append(result, tmp) } if r2 != nil && len(r2) > 0 { tmp := &ResultData{ channelType: 1, channel: "招标代理机构", size: len(r2), data: r2, } result = append(result, tmp) } } // 中间人可介绍业主 r3 := getData1(req) if r3 != nil && len(r3) > 0 { tmp := &ResultData{ channelType: 1, channel: "中间人", size: len(r3), data: r3, } result = append(result, tmp) } return } func getData(propertyForm, bid string) (result1, result2 []map[string]interface{}) { aggs, count, res := elastic.GetAggs(INDEX_1, INDEX_1, fmt.Sprintf(es_query, 1, propertyForm, bid)) logx.Info("es聚合查询结果:", aggs, count, res) type AggStruct struct { Buckets []struct { Key string `json:"key,omitempty"` Doc_count int64 `json:"doc_count,omitempty"` Amount_all struct { Value string `json:"value,omitempty"` } `json:"amount_all"` } `json:"buckets"` } m1 := make(map[string]interface{}) //采购单位-中标单位 m2 := make(map[string]interface{}) //采购单位-代理机构 var m1Buckets = AggStruct{} if aggs != nil && aggs["winner_count"] != nil { bs, err := aggs["winner_count"].MarshalJSON() if err != nil { logx.Info(err) } else { if len(bs) == 0 { logx.Info(err) } else { err := json.Unmarshal(bs, &m1Buckets) logx.Info(err) if len(m1Buckets.Buckets) > 0 { for _, v := range m1Buckets.Buckets { m1[v.Key] = map[string]interface{}{"name": v.Key, "amount": v.Amount_all.Value, "count": v.Doc_count} } } } } } var m2Buckets = AggStruct{} if aggs != nil && aggs["amount_all"] != nil { bs, err := aggs["amount_all"].MarshalJSON() if err != nil { logx.Info(err) } else { if len(bs) == 0 { logx.Info(err) } else { err := json.Unmarshal(bs, &m2Buckets) logx.Info(err) if len(m2Buckets.Buckets) > 0 { for _, v := range m2Buckets.Buckets { m1[v.Key] = map[string]interface{}{"name": v.Key, "amount": v.Amount_all.Value, "count": v.Doc_count} } } } } } for k, v := range m1 { if m2[k] != nil { tmp := make(map[string]interface{}) tmp["name"] = v tmp["coop_size"] = v tmp["coop_amount"] = m2[k] result1 = append(result1, tmp) } } for k, v := range m2 { if m2[k] != nil { tmp := make(map[string]interface{}) tmp["name"] = v tmp["coop_size"] = v tmp["coop_amount"] = m2[k] result2 = append(result2, tmp) } } // 合作项目, 业主与中标单位 for _, v := range result1 { rows, err := T.ClickhouseConn.Query(context.TODO(), sql_2_1, bid, v["name"]) var mlist []map[string]interface{} for err != nil && rows.Next() { m := make(map[string]interface{}) rows.Scan(&m) mlist = append(mlist, m) } v["data"] = mlist } // 业主与代理机构 for _, v := range result2 { rows, err := T.ClickhouseConn.Query(context.TODO(), sql_2_1, bid, v["name"]) var mlist []map[string]interface{} for err != nil && rows.Next() { m := make(map[string]interface{}) rows.Scan(&m) mlist = append(mlist, m) } v["data"] = mlist } return } func getData1(req *types.CoopHistoryReq) (result []map[string]interface{}) { info := T.CrmMysql.SelectBySql(sql_2_2, req.PositionId, req.Pid) if info != nil && len(*info) > 0 { for _, m := range *info { result = append(result, map[string]interface{}{"name": m["company_name"], "pserson": m["contact_name"]}) } } return }