123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405 |
- package service
- import (
- "app.yhyue.com/moapp/jybase/common"
- "app.yhyue.com/moapp/jybase/date"
- "app.yhyue.com/moapp/jybase/encrypt"
- elastic "app.yhyue.com/moapp/jybase/es"
- "app.yhyue.com/moapp/jybase/mongodb"
- "app.yhyue.com/moapp/jypkg/ent/util"
- "app.yhyue.com/moapp/jypkg/public"
- MC "bp.jydev.jianyu360.cn/CRM/application/api/common"
- "bp.jydev.jianyu360.cn/CRM/application/api/internal/types"
- "bp.jydev.jianyu360.cn/CRM/application/entity"
- "database/sql"
- "fmt"
- "github.com/RoaringBitmap/roaring"
- "go.mongodb.org/mongo-driver/bson"
- "time"
- )
- const (
- BuyerIndex = "buyer" // 采购单位index
- BuyerType = "buyer"
- query = `{%s "query":{"bool":{"must":[%s],"must_not": [{"term": {"buyer_name": ""}}]}}}`
- )
- type EmPloyService struct{}
- // 收录情况查询
- func (e *EmPloyService) InfoEmployinfo(in *types.InfoEmployinfoReq) []map[string]interface{} {
- data := []map[string]interface{}{}
- for _, v := range in.Id {
- vint := int64(0)
- table := entity.EMPLOY_CUSTOM
- id := ""
- source := 0
- if in.EmployType == 3 {
- //判断传过来的是名字还是ID
- //id转中文
- if len(v) > 0 && len([]rune(v)) == len(v) {
- //此数据是id
- //获取中文名字
- id = util.DecodeId(v)
- } else {
- //次数据传的名字
- id = getBuyerIdByName(v)
- }
- } else {
- id = util.DecodeId(v)
- }
- valueMap := map[string]interface{}{
- "id": v,
- }
- employKey := "company_id"
- findKey := "employ_custom_id"
- //有收录情况
- rb := roaring.NewBitmap()
- bytes := []byte{}
- byte1 := []byte{}
- byte2 := []byte{}
- byte3 := []byte{}
- byte4 := []byte{}
- MC.CrmMysql.DB.QueryRow("select search_tencent, search_buyer, search_ent, search_nzj from employ_summary where position_id=?", in.PositionId).Scan(&byte1, &byte2, &byte3, &byte4)
- if byte1 != nil {
- search_tencent := roaring.NewBitmap()
- search_buyer := roaring.NewBitmap()
- search_ent := roaring.NewBitmap()
- search_nzj := roaring.NewBitmap()
- if byte1 != nil && len(byte1) > 0 {
- search_tencent.UnmarshalBinary(byte1)
- }
- if byte2 != nil && len(byte2) > 0 {
- search_buyer.UnmarshalBinary(byte2)
- }
- if byte3 != nil && len(byte3) > 0 {
- search_ent.UnmarshalBinary(byte3)
- }
- if byte4 != nil && len(byte4) > 0 {
- search_nzj.UnmarshalBinary(byte4)
- }
- switch in.EmployType {
- case 1:
- bytes = byte1
- table = entity.EMPLOY_INFO
- employKey = "source_id"
- findKey = "employ_info_id"
- source = 1
- case 2:
- bytes = byte2
- source = 1
- case 3:
- bytes = byte3
- source = 2
- case 4:
- bytes = byte4
- source = 2
- table = entity.EMPLOY_INFO
- employKey = "source_id"
- findKey = "employ_info_id"
- }
- err := rb.UnmarshalBinary(bytes)
- if err != nil {
- break
- }
- vint = mongodb.StringTOBsonId(v).Timestamp().Unix()
- valueMap["isEmploy"] = rb.Contains(uint32(vint))
- }
- if len(in.Id) == 1 {
- //列表查询
- //是否忽略处理
- employData := MC.CrmMysql.FindOne(table, map[string]interface{}{
- employKey: id,
- "position_id": in.PositionId,
- "source": source,
- }, "", "")
- if employData != nil && len(*employData) > 0 {
- valueMap["isIgnore"] = common.Int64All((*employData)["is_ignore"])
- } else {
- valueMap["isIgnore"] = 0
- }
- //客户数量
- customCount := MC.CrmMysql.Count(entity.CUSTOM, map[string]interface{}{
- findKey: id,
- "position_id": in.PositionId,
- })
- valueMap["customCount"] = customCount
- if in.EmployType == 1 || in.EmployType == 4 {
- //销售线索数量
- clueCount := MC.CrmMysql.Count(entity.SALE_CLUE, map[string]interface{}{
- "employ_info_id": id,
- "position_id": in.PositionId,
- })
- valueMap["clueCount"] = clueCount
- //销售机会数量
- chanceCount := MC.CrmMysql.Count(entity.SALE_CHANCE, map[string]interface{}{
- "employ_info_id": id,
- "position_id": in.PositionId,
- })
- valueMap["chanceCount"] = chanceCount
- }
- }
- data = append(data, valueMap)
- }
- return data
- }
- // 收录操作
- func (e *EmPloyService) EmployOperate(in *types.EmployOperateReq) bool {
- //收录汇总表
- employSummaryData := MC.CrmMysql.FindOne(entity.EMPLOY_SUMMARY, map[string]interface{}{
- "position_id": in.PositionId,
- }, "", "")
- byte1 := []byte{}
- byte2 := []byte{}
- byte3 := []byte{}
- byte4 := []byte{}
- MC.CrmMysql.DB.QueryRow("select search_tencent, search_buyer, search_ent, search_nzj from employ_summary where position_id=?", in.PositionId).Scan(&byte1, &byte2, &byte3, &byte4)
- search_tencent := roaring.NewBitmap()
- search_buyer := roaring.NewBitmap()
- search_ent := roaring.NewBitmap()
- search_nzj := roaring.NewBitmap()
- if byte1 != nil && len(byte1) > 0 {
- search_tencent.UnmarshalBinary(byte1)
- }
- if byte2 != nil && len(byte2) > 0 {
- search_buyer.UnmarshalBinary(byte2)
- }
- if byte3 != nil && len(byte3) > 0 {
- search_ent.UnmarshalBinary(byte3)
- }
- if byte4 != nil && len(byte4) > 0 {
- search_nzj.UnmarshalBinary(byte4)
- }
- table := ""
- switch in.EmployType {
- case 1, 4:
- table = entity.EMPLOY_INFO
- case 2, 3:
- table = entity.EMPLOY_CUSTOM
- }
- return MC.CrmMysql.ExecTx("收录操作", func(tx *sql.Tx) bool {
- for _, v1 := range in.IdArr {
- //id转中文
- id := ""
- name := ""
- findMap := map[string]interface{}{}
- findMap["position_id"] = in.PositionId
- if in.EmployType == 3 {
- //判断传过来的是名字还是ID
- //id转中文
- if len(v1) > 0 && len([]rune(v1)) == len(v1) {
- //此数据是id
- //获取中文名字
- id = util.DecodeId(v1)
- name = getBuyerIdByName(id)
- } else {
- //次数据传的名字
- name = v1
- id = getBuyerIdByName(v1)
- }
- findMap["company_id"] = id
- } else if in.EmployType == 2 {
- id = encrypt.DecodeArticleId2ByCheck(v1)[0]
- findMap["company_id"] = id
- } else {
- id = encrypt.CommonDecodeArticle("content", v1)[0]
- findMap["source_id"] = id
- }
- if in.IsEmploy {
- if MC.CrmMysql.Count(table, findMap) > 0 {
- MC.CrmMysql.UpdateByTx(tx, table, findMap, map[string]interface{}{
- "status": 1,
- })
- } else {
- //收录新增
- data := map[string]interface{}{}
- if in.EmployType == 2 {
- data = CustomFind(id, "", in.EmployType)
- } else if in.EmployType == 3 {
- //id转中文
- data = CustomFind("", name, in.EmployType)
- } else {
- data = InfoFind(id, in.EmployType)
- data["type"] = in.SourceType
- data["source"] = in.EmployType
- data["employ_way"] = 1
- data["jybx_url"] = "/article/content/" + v1 + ".html"
- }
- data["position_id"] = in.PositionId
- data["ent_id"] = in.EntId
- MC.CrmMysql.InsertByTx(tx, table, data)
- }
- } else {
- //取消收录
- MC.CrmMysql.UpdateByTx(tx, table, findMap, map[string]interface{}{
- "status": -1,
- })
- }
- //收录汇总表处理
- KeyHandle(mongodb.StringTOBsonId(id).Timestamp().Unix(), in.EmployType, in.IsEmploy, search_tencent, search_buyer, search_ent, search_nzj)
- }
- search_tencent_byte, _ := search_tencent.ToBytes()
- search_buyer_byte, _ := search_buyer.ToBytes()
- search_ent_byte, _ := search_ent.ToBytes()
- search_nzj_byte, _ := search_nzj.ToBytes()
- if employSummaryData != nil && len(*employSummaryData) > 0 {
- //修改
- MC.CrmMysql.UpdateByTx(tx, entity.EMPLOY_SUMMARY, map[string]interface{}{
- "position_id": in.PositionId,
- }, map[string]interface{}{
- "search_tencent": search_tencent_byte,
- "search_buyer": search_buyer_byte,
- "search_ent": search_ent_byte,
- "search_nzj": search_nzj_byte,
- })
- } else {
- //新增
- MC.CrmMysql.InsertByTx(tx, entity.EMPLOY_SUMMARY, map[string]interface{}{
- "position_id ": in.PositionId,
- "search_tencent": search_tencent_byte,
- "search_buyer": search_buyer_byte,
- "search_ent": search_ent_byte,
- "search_nzj": search_nzj_byte,
- })
- }
- return true
- })
- }
- // 收录数据处理
- func KeyHandle(id int64, employType int64, isEmploy bool, search_tencent, search_buyer, search_ent, search_nzj *roaring.Bitmap) {
- switch employType {
- case 1:
- if isEmploy {
- search_tencent.Add(uint32(id))
- } else {
- search_tencent.Remove(uint32(id))
- }
- case 2:
- if isEmploy {
- search_buyer.Add(uint32(id))
- } else {
- search_buyer.Remove(uint32(id))
- }
- case 3:
- if isEmploy {
- search_ent.Add(uint32(id))
- } else {
- search_ent.Remove(uint32(id))
- }
- case 4:
- if isEmploy {
- search_nzj.Add(uint32(id))
- } else {
- search_nzj.Remove(uint32(id))
- }
- }
- return
- }
- // 企业信息查询
- func CustomFind(id string, name string, employType int64) map[string]interface{} {
- data := map[string]interface{}{}
- //company_id 企业id name户名称 address 地址
- if employType == 2 {
- //企业详情
- entinfo, _ := MC.MgoEnt.FindOneByField("qyxy_std", map[string]interface{}{"_id": id}, map[string]interface{}{
- "company_address": 1, //注册地
- "company_name": 1,
- })
- if entinfo != nil && len(*entinfo) > 0 {
- data["name"] = (*entinfo)["company_name"]
- data["address"] = (*entinfo)["company_address"]
- data["company_id"] = (*entinfo)["id"]
- }
- } else {
- //采购单位详情
- entNameQuery := fmt.Sprintf(`{"query":{"bool":{"must":[{"term":{"buyer_name":"%s"}}]}},"size":1,"_source":["city","buyer_name","id"]}`, name)
- rs := elastic.Get(BuyerIndex, BuyerType, entNameQuery)
- if rs != nil && len(*rs) > 0 {
- data["name"] = (*rs)[0]["buyer_name"]
- data["address"] = (*rs)[0]["city"]
- data["company_id"] = (*rs)[0]["id"]
- }
- }
- data["status"] = 1
- data["create_time"] = time.Now().Format(date.Date_Full_Layout)
- return data
- }
- // 标讯信息查询
- func InfoFind(id string, employType int64) map[string]interface{} {
- data := map[string]interface{}{}
- //source_id 信息id、项目id- title 标题-area 省 -city 市 -subtype 信息类型二级分类
- //buyerclass 采购单位行业 -budget 预算 -bidamount 中标金额 buyer采购单位 annex有无附件 publishtime发布时间 projectname 项目时间
- //ownerclass 业主类型(拟在建搜索) expurasing_time 预计采购时间 jybx_url 标讯详情页
- if employType == 1 {
- //标讯信息
- obj := map[string]interface{}{}
- brobj, ok := MC.Mgo.Find("bidding_rec", bson.M{"s_id": id}, `{"l_recoverydate":-1}`, public.MgoBiddingFields, false, 0, 1)
- if ok && (*brobj) != nil && len(*brobj) == 1 && (*brobj)[0] != nil {
- obj = (*brobj)[0]
- } else {
- aobj, ok := MC.MgoBidding.FindById("bidding", id, public.MgoBiddingFields)
- if ok && (aobj == nil || *aobj == nil || len(*aobj) == 0) {
- aobj, ok = MC.MgoBidding.FindById("bidding_back", id, public.MgoBiddingFields)
- }
- obj = *aobj
- }
- if ok && obj != nil && len(obj) > 0 {
- titleTmp := common.ObjToString(obj["title"])
- if len([]rune(titleTmp)) > 100 {
- titleTmp = string([]rune(titleTmp)[:100]) + "..."
- }
- titleTmp = public.ClearHtml.ReplaceAllString(titleTmp, "")
- data["title"] = titleTmp
- data["city"] = obj["city"]
- data["area"] = obj["area"]
- data["subtype"] = obj["subtype"]
- data["buyerclass"] = obj["buyerclass"]
- data["budget"] = obj["budget"]
- data["bidamount"] = obj["bidamount"]
- data["annex"] = 0
- if obj["projectinfo"] != nil {
- projectinfo := common.ObjToMap(obj["projectinfo"])
- if (*projectinfo)["attachments"] != nil {
- data["annex"] = 1
- }
- }
- data["publishtime"] = time.Unix(common.Int64All(obj["publishtime"]), 0).Format(date.Date_Full_Layout)
- data["show_time"] = time.Unix(common.Int64All(obj["publishtime"]), 0).Format(date.Date_Full_Layout)
- data["projectname"] = obj["projectname"]
- procurementlist, _ := obj["procurementlist"].([]interface{})
- for _, vs := range procurementlist { //1.采购意向清单数据集打码处理
- vsMap, _ := vs.(map[string]interface{})
- if vsMap["expurasingtime"] != nil {
- data["expurasing_time"] = vsMap["expurasingtime"]
- break
- }
- }
- }
- }
- data["status"] = 1
- data["employ_way"] = 1
- data["source_id"] = id
- data["create_time"] = time.Now().Format(date.Date_Full_Layout)
- return data
- }
- func getBuyerNameById(buyerId string) (buyerName string) {
- r := elastic.Get(BuyerIndex, BuyerType, fmt.Sprintf(`{"query":{"bool":{"must":[{"terms":{"_id":["%s"]}}]}},"size":1,"_source":["name"]}`, buyerId))
- if r == nil || len(*r) == 0 {
- return
- }
- buyerName, _ = (*r)[0]["name"].(string)
- return
- }
- func getBuyerIdByName(buyeName string) (buyerId string) {
- r := elastic.Get("buyer", "buyer", fmt.Sprintf(`{"query":{"bool":{"must":[{"term":{"buyer_name":"%s"}}]}},"size":1,"_source":["city","id"]}`, buyeName))
- if r == nil || len(*r) == 0 {
- return
- }
- buyerId, _ = (*r)[0]["_id"].(string)
- return
- }
|