瀏覽代碼

Merge branch 'feature/v1.0.17' of https://jygit.jydev.jianyu360.cn/BaseService/biService into feature/v1.0.17

zhangxinlei1996 1 年之前
父節點
當前提交
1554a46ad1

+ 43 - 13
api/biService.api

@@ -3,16 +3,14 @@ syntax = "v1"
 type (
 	biResp {
 		Error_code int64       `json:"error_code"` //响应代码
-		Error_msg  string      `json:"error_msg"`  //响应消息
+		Error_msg  string      `json:"error_msg"` //响应消息
 		Data       interface{} `json:"data"`
 	}
-
 	myDataAssetReq {
 		UserId    string `header:"userId,optional"`
 		NewUserId int64  `header:"newUserId,optional"`
 		EntUserId int64  `header:"entUserId,optional"`
 	}
-
 	addProjectReq {
 		PositionId   int64  `header:"positionId,optional"`
 		Source       int64  `json:"source,optional"`
@@ -25,21 +23,17 @@ type (
 		EntId        int64  `header:"entId,optional"`
 		EntUserName  string `header:"entUserName,optional"`
 	}
-
 	getInfoIdReq {
 		PositionId int64 `header:"positionId,optional"`
 	}
-
 	drawClueReq {
 		PositionId int64 `header:"positionId,optional"`
 		Count      int64 `json:"count,optional"`
 	}
-
 	callReq {
 		PositionId int64  `header:"positionId,optional"`
 		Phone      string `json:"phone"`
 	}
-
 	DistributeClueReq {
 		ClueCount  string                   `json:"clueCount"`
 		ClueIdList []int64                  `json:"clueIdList"`
@@ -47,12 +41,17 @@ type (
 		PositionId int64                    `header:"positionId,optional"`
 		IsTask     int64                    `json:"isTask"`
 	}
-
+	DistributeClueShowReq {
+		ClueIdList string                   `json:"clueIdList"`
+		Datas      []map[string]interface{} `json:"datas"`
+		PositionId int64                    `header:"positionId,optional"`
+		IsTask     int64                    `json:"isTask"`
+		DataType   int64                    `json:"dataType"`
+	}
 	ClueImportReq {
 		PositionId int64  `header:"positionId,optional"`
 		Pcbh       string `json:"pcbh"`
 	}
-
 	ClueAddReq {
 		Phone            string `json:"phone"`
 		Username         string `json:"username,optional"`
@@ -97,52 +96,83 @@ type (
 		NewId string `json:"newId"`
 		Type  int64  `json:"type"`
 	}
-
 	getCompanyTypeReq {
 		CompanyName string `json:"companyName"`
 	}
+	ExportByDbReq {
+		Token   string `json:"token"`
+		Title   string `json:"title"`
+		Content string `json:"content"`
+		Mails   string `json:"mails"`
+		Query   string `json:"query"`
+		Stype   string `json:"stype"`
+	}
 )
 
 service biService-api {
 	@handler MyDataAsset
 	post /biService/myDataAsset (myDataAssetReq) returns (biResp)
+
 	@handler AddProjectReq
 	post /biService/addProject (addProjectReq) returns (biResp)
+
 	@handler GetInfoId
 	post /biService/getInfoId (getInfoIdReq) returns (biResp)
+
 	@handler DrawClue
 	post /biService/drawClue (drawClueReq) returns (biResp)
+
 	@handler Call
-	post /biService/call (callReq) returns (biResp)	//拨打电话
+	post /biService/call (callReq) returns (biResp) //拨打电话
+
 	@handler DistributeClue
 	post /biService/distributeClue (DistributeClueReq) returns (biResp)
+
+	@handler DistributeClueShow
+	post /biService/distributeClueShow (DistributeClueShowReq) returns (biResp)
+
 	@handler ClueImport
 	post /biService/clueImport (ClueImportReq) returns (biResp)
+
 	@handler ClueAdd
 	post /biService/ClueAdd (ClueAddReq) returns (biResp)
+
 	@handler ClueImportTl
 	post /biService/clueImportTt (ClueImportReq) returns (biResp)
+
 	@handler AutoFollow
 	post /biService/autoFollow (callReq) returns (biResp)
+
 	@doc "bi通用接口"
 	@handler sqlManage
 	post /biService/sqlManage (SqlManageReq) returns (biResp)
+
 	@doc "用户身份"
 	@handler Myinfo
 	post /biService/myInfo (MyInfoReq) returns (biResp)
+
 	@doc "资源中台授权"
 	@handler ResEmpower
 	post /biService/resEmpower (ResEmpowerReq) returns (biResp)
+
 	@doc "项目全量导出"
 	@handler allProjectExport
 	post /biService/allProjectExport (ExportReq) returns (biResp)
+
 	@doc "资讯全量导出"
 	@handler allInfoExport
 	post /biService/allInfoExport (ExportReq) returns (biResp)
+
 	@doc "资讯操作"
 	@handler infoOperate
 	post /biService/infoOperate (OperateReq) returns (biResp)
+
 	@doc "公司类型"
 	@handler getCompanyType
-	post /biService/getCompanyType(getCompanyTypeReq) returns (biResp)
-}
+	post /biService/getCompanyType (getCompanyTypeReq) returns (biResp)
+
+	@doc "数据导出(通用),发邮件"
+	@handler sendMail
+	post /biService/sendMail (ExportByDbReq) returns (biResp)
+}
+

+ 117 - 18
api/etc/biservice-api.yaml

@@ -1,21 +1,120 @@
-Name: biService-api
-Host: 0.0.0.0
-Port: 9995
-BiServiceRpc:
-  Etcd:
-    Hosts:
-    - 192.168.3.206:2379
-    Key: biservice.rpc
-  Timeout: 5000
-GatewayRpcConf:
-  Etcd:
-    Hosts:
-      -  192.168.3.206:2379
-    Key: gatewayDemo.rpc
+Name: biservice.rpc
+ListenOn: 0.0.0.0:9998
+Etcd:
+  Hosts:
+    - 192.168.3.240:2379
+  Key: biservice.rpc
+Mode: test
+Mysql:
+  JianYu:
+    DBName: jianyu
+    Address: 192.168.3.149:3306
+    UserName: root
+    PassWord: Topnet123
+    MaxOpenConns: 5
+    MaxIdleConns: 5
+  JyDoc:
+    DBName: jydocs
+    Address: 192.168.3.149:3306
+    UserName: root
+    PassWord: Topnet123
+    MaxOpenConns: 5
+    MaxIdleConns: 5
+  Bi:
+    DBName: jianyu_subjectdb_test
+    Address: 192.168.3.149:4000
+    UserName: xuzhiheng
+    PassWord: "Xzh#20221122K"
+    MaxOpenConns: 5
+    MaxIdleConns: 5
+  Tidb:
+    DBName: base_service
+    Address: 192.168.3.217:4000
+    UserName: root
+    PassWord: "=PDT49#80Z!RVv52_z"
+    MaxOpenConns: 5
+    MaxIdleConns: 5
+  BiTidb:
+    DBName: jianyu_subjectdb_test
+    Address: 192.168.3.149:4000
+    UserName: xuzhiheng
+    PassWord: "Xzh#20221122K"
+    MaxOpenConns: 5
+    MaxIdleConns: 5
+  CallTidb:
+    DBName: Call_Accounting
+    Address: 192.168.3.149:4000
+    UserName: xuzhiheng
+    PassWord: "Xzh#20221122K"
+    MaxOpenConns: 5
+    MaxIdleConns: 5
+  BiService:
+    DBName: bi_service
+    Address: 192.168.3.217:4000
+    UserName: root
+    PassWord: "=PDT49#80Z!RVv52_z"
+    MaxOpenConns: 5
+    MaxIdleConns: 5
+Mongo:
+  Qfw:
+    MongodbAddr: 192.168.3.206:27080
+    DbName: qfw
+    Size: 10
+  Bidding:
+    MongodbAddr: 192.168.3.206:27080
+    DbName: qfw
+    UserName:
+    Password:
+    Size: 10
+Es:
+  Address: http://192.168.3.241:9205
+  DbSize: 5
+  Version: v7
+  UserName:
+  Password:
+  Index: projectset
+  IType: projectset
+EntEs:
+  Address: http://192.168.3.241:9205
+  DbSize: 5
+  Version: v7
+  UserName:
+  Password:
 Logx:
   Mode: console #console|file|volume
-  Path: ./logs
+  Path: logs
   Level: info #info|error|severe
-  KeepDays: 10
-ResourceCenterKey: "resource.rpc" #资源中台rpc
-UserCenterKey: "usercenter.rpc" #用户中台rpc
+  KeepDays: 100
+CustomerCol: customer_test
+AddCountLimit: 500
+DrawCountLimit: 1000
+TopicName: jy_position_sync
+NsqUrl: 192.168.3.240:4161
+#合力亿捷account_token存储
+RedisAddress:
+  - newother=192.168.3.149:1712
+  - session=192.168.3.149:1713
+#合力亿捷相关调用参数
+Hlyj:
+  Appid: w4w2ex0bnt1n61or
+  Account: N000000029739
+  Secret: 3c8f7dd04d2c11edb786132b38c4d48a
+  TokenUrl: https://a1.7x24cc.com/accessToken #获取token接口
+  CallFlag: 104 #外呼集成的接口号
+  CallUrl: https://a1.7x24cc.com/commonInte #外呼集成接口
+  Integratedid: "8546"
+PublicKey: "791c521fec164e6c"
+Mail:
+  - Addr: smtp.exmail.qq.com
+    Port: 465
+    Pwd: "ue9Rg9Sf4CVtdm5a"
+    User: "public03@topnet.net.cn"
+  - Addr: smtp.exmail.qq.com
+    Port: 465
+    Pwd: "ue9Rg9Sf4CVtdm5a"
+    User: "public03@topnet.net.cn"
+UpdateProjectUrl: "http://192.168.3.206:7778/updateProject"
+ExportDirectory: "D:/top_git_projects/biService"
+CommonExportDir: "D:/top_git_projects/biComFileRes"
+ExportUrl: "https://jybx-webtest.jydev.jianyu360.com/tietaRes"
+ExportCount: 15000

+ 28 - 0
api/internal/handler/distributeclueshowhandler.go

@@ -0,0 +1,28 @@
+package handler
+
+import (
+	"net/http"
+
+	"bp.jydev.jianyu360.cn/BaseService/biService/api/internal/logic"
+	"bp.jydev.jianyu360.cn/BaseService/biService/api/internal/svc"
+	"bp.jydev.jianyu360.cn/BaseService/biService/api/internal/types"
+	"github.com/zeromicro/go-zero/rest/httpx"
+)
+
+func DistributeClueShowHandler(svcCtx *svc.ServiceContext) http.HandlerFunc {
+	return func(w http.ResponseWriter, r *http.Request) {
+		var req types.DistributeClueShowReq
+		if err := httpx.Parse(r, &req); err != nil {
+			httpx.ErrorCtx(r.Context(), w, err)
+			return
+		}
+
+		l := logic.NewDistributeClueShowLogic(r.Context(), svcCtx)
+		resp, err := l.DistributeClueShow(&req)
+		if err != nil {
+			httpx.ErrorCtx(r.Context(), w, err)
+		} else {
+			httpx.OkJsonCtx(r.Context(), w, resp)
+		}
+	}
+}

+ 40 - 30
api/internal/handler/routes.go

@@ -14,8 +14,8 @@ func RegisterHandlers(server *rest.Server, serverCtx *svc.ServiceContext) {
 		[]rest.Route{
 			{
 				Method:  http.MethodPost,
-				Path:    "/biService/myDataAsset",
-				Handler: MyDataAssetHandler(serverCtx),
+				Path:    "/biService/ClueAdd",
+				Handler: ClueAddHandler(serverCtx),
 			},
 			{
 				Method:  http.MethodPost,
@@ -24,23 +24,23 @@ func RegisterHandlers(server *rest.Server, serverCtx *svc.ServiceContext) {
 			},
 			{
 				Method:  http.MethodPost,
-				Path:    "/biService/getInfoId",
-				Handler: GetInfoIdHandler(serverCtx),
+				Path:    "/biService/allInfoExport",
+				Handler: allInfoExportHandler(serverCtx),
 			},
 			{
 				Method:  http.MethodPost,
-				Path:    "/biService/drawClue",
-				Handler: DrawClueHandler(serverCtx),
+				Path:    "/biService/allProjectExport",
+				Handler: allProjectExportHandler(serverCtx),
 			},
 			{
 				Method:  http.MethodPost,
-				Path:    "/biService/call",
-				Handler: CallHandler(serverCtx),
+				Path:    "/biService/autoFollow",
+				Handler: AutoFollowHandler(serverCtx),
 			},
 			{
 				Method:  http.MethodPost,
-				Path:    "/biService/distributeClue",
-				Handler: DistributeClueHandler(serverCtx),
+				Path:    "/biService/call",
+				Handler: CallHandler(serverCtx),
 			},
 			{
 				Method:  http.MethodPost,
@@ -49,53 +49,63 @@ func RegisterHandlers(server *rest.Server, serverCtx *svc.ServiceContext) {
 			},
 			{
 				Method:  http.MethodPost,
-				Path:    "/biService/ClueAdd",
-				Handler: ClueAddHandler(serverCtx),
+				Path:    "/biService/clueImportTt",
+				Handler: ClueImportTlHandler(serverCtx),
 			},
 			{
 				Method:  http.MethodPost,
-				Path:    "/biService/clueImportTt",
-				Handler: ClueImportTlHandler(serverCtx),
+				Path:    "/biService/distributeClue",
+				Handler: DistributeClueHandler(serverCtx),
 			},
 			{
 				Method:  http.MethodPost,
-				Path:    "/biService/autoFollow",
-				Handler: AutoFollowHandler(serverCtx),
+				Path:    "/biService/distributeClueShow",
+				Handler: DistributeClueShowHandler(serverCtx),
 			},
 			{
 				Method:  http.MethodPost,
-				Path:    "/biService/sqlManage",
-				Handler: sqlManageHandler(serverCtx),
+				Path:    "/biService/drawClue",
+				Handler: DrawClueHandler(serverCtx),
 			},
 			{
 				Method:  http.MethodPost,
-				Path:    "/biService/myInfo",
-				Handler: MyinfoHandler(serverCtx),
+				Path:    "/biService/getCompanyType",
+				Handler: getCompanyTypeHandler(serverCtx),
 			},
 			{
 				Method:  http.MethodPost,
-				Path:    "/biService/resEmpower",
-				Handler: ResEmpowerHandler(serverCtx),
+				Path:    "/biService/getInfoId",
+				Handler: GetInfoIdHandler(serverCtx),
 			},
 			{
 				Method:  http.MethodPost,
-				Path:    "/biService/allProjectExport",
-				Handler: allProjectExportHandler(serverCtx),
+				Path:    "/biService/infoOperate",
+				Handler: infoOperateHandler(serverCtx),
 			},
 			{
 				Method:  http.MethodPost,
-				Path:    "/biService/allInfoExport",
-				Handler: allInfoExportHandler(serverCtx),
+				Path:    "/biService/myDataAsset",
+				Handler: MyDataAssetHandler(serverCtx),
 			},
 			{
 				Method:  http.MethodPost,
-				Path:    "/biService/infoOperate",
-				Handler: infoOperateHandler(serverCtx),
+				Path:    "/biService/myInfo",
+				Handler: MyinfoHandler(serverCtx),
 			},
 			{
 				Method:  http.MethodPost,
-				Path:    "/biService/getCompanyType",
-				Handler: getCompanyTypeHandler(serverCtx),
+				Path:    "/biService/resEmpower",
+				Handler: ResEmpowerHandler(serverCtx),
+			},
+			{
+				Method:  http.MethodPost,
+				Path:    "/biService/sendMail",
+				Handler: sendMailHandler(serverCtx),
+			},
+			{
+				Method:  http.MethodPost,
+				Path:    "/biService/sqlManage",
+				Handler: sqlManageHandler(serverCtx),
 			},
 		},
 	)

+ 28 - 0
api/internal/handler/sendmailhandler.go

@@ -0,0 +1,28 @@
+package handler
+
+import (
+	"net/http"
+
+	"bp.jydev.jianyu360.cn/BaseService/biService/api/internal/logic"
+	"bp.jydev.jianyu360.cn/BaseService/biService/api/internal/svc"
+	"bp.jydev.jianyu360.cn/BaseService/biService/api/internal/types"
+	"github.com/zeromicro/go-zero/rest/httpx"
+)
+
+func sendMailHandler(svcCtx *svc.ServiceContext) http.HandlerFunc {
+	return func(w http.ResponseWriter, r *http.Request) {
+		var req types.ExportByDbReq
+		if err := httpx.Parse(r, &req); err != nil {
+			httpx.ErrorCtx(r.Context(), w, err)
+			return
+		}
+
+		l := logic.NewSendMailLogic(r.Context(), svcCtx)
+		resp, err := l.SendMail(&req)
+		if err != nil {
+			httpx.ErrorCtx(r.Context(), w, err)
+		} else {
+			httpx.OkJsonCtx(r.Context(), w, resp)
+		}
+	}
+}

+ 46 - 0
api/internal/logic/distributeclueshowlogic.go

@@ -0,0 +1,46 @@
+package logic
+
+import (
+	"context"
+
+	"bp.jydev.jianyu360.cn/BaseService/biService/api/internal/svc"
+	"bp.jydev.jianyu360.cn/BaseService/biService/api/internal/types"
+	"bp.jydev.jianyu360.cn/BaseService/biService/rpc/biservice"
+	"github.com/gogf/gf/v2/util/gconv"
+	"github.com/zeromicro/go-zero/core/logx"
+)
+
+type DistributeClueShowLogic struct {
+	logx.Logger
+	ctx    context.Context
+	svcCtx *svc.ServiceContext
+}
+
+func NewDistributeClueShowLogic(ctx context.Context, svcCtx *svc.ServiceContext) *DistributeClueShowLogic {
+	return &DistributeClueShowLogic{
+		Logger: logx.WithContext(ctx),
+		ctx:    ctx,
+		svcCtx: svcCtx,
+	}
+}
+
+func (l *DistributeClueShowLogic) DistributeClueShow(req *types.DistributeClueShowReq) (resp *types.BiResp, err error) {
+	// todo: add your logic here and delete this line
+
+	datas := []*biservice.DistributeClueShows{}
+	for _, v := range req.Datas {
+		data := &biservice.DistributeClueShows{
+			PositionId:       gconv.Int64(v["positionId"]),
+			DistributedCount: gconv.Int64(v["distributedCount"]),
+		}
+		datas = append(datas, data)
+	}
+	res, err := l.svcCtx.BiServiceRpc.DistributeClueShow(l.ctx, &biservice.DistributeClueShowReq{
+		DataType:   req.DataType,
+		ClueIdList: req.ClueIdList,
+		PositionId: req.PositionId,
+		Datas:      datas,
+		IsTask:     req.IsTask,
+	})
+	return &types.BiResp{Error_code: res.ErrorCode, Error_msg: res.ErrorMsg, Data: res.Data}, err
+}

+ 37 - 0
api/internal/logic/sendmaillogic.go

@@ -0,0 +1,37 @@
+package logic
+
+import (
+	"bp.jydev.jianyu360.cn/BaseService/biService/rpc/biservice"
+	"context"
+
+	"bp.jydev.jianyu360.cn/BaseService/biService/api/internal/svc"
+	"bp.jydev.jianyu360.cn/BaseService/biService/api/internal/types"
+
+	"github.com/zeromicro/go-zero/core/logx"
+)
+
+type SendMailLogic struct {
+	logx.Logger
+	ctx    context.Context
+	svcCtx *svc.ServiceContext
+}
+
+func NewSendMailLogic(ctx context.Context, svcCtx *svc.ServiceContext) *SendMailLogic {
+	return &SendMailLogic{
+		Logger: logx.WithContext(ctx),
+		ctx:    ctx,
+		svcCtx: svcCtx,
+	}
+}
+
+func (l *SendMailLogic) SendMail(req *types.ExportByDbReq) (resp *types.BiResp, err error) {
+	res, err := l.svcCtx.BiServiceRpc.SendMail(l.ctx, &biservice.ExportByDbReq{
+		Token:   req.Token,
+		Title:   req.Title,
+		Content: req.Content,
+		Mails:   req.Mails,
+		Query:   req.Query,
+		Stype:   req.Stype,
+	})
+	return &types.BiResp{Error_code: res.ErrorCode, Error_msg: res.ErrorMsg, Data: string(res.Data)}, err
+}

+ 82 - 65
api/internal/types/types.go

@@ -1,58 +1,6 @@
 // Code generated by goctl. DO NOT EDIT.
 package types
 
-type BiResp struct {
-	Error_code int64       `json:"error_code"` //响应代码
-	Error_msg  string      `json:"error_msg"`  //响应消息
-	Data       interface{} `json:"data"`
-}
-
-type MyDataAssetReq struct {
-	UserId    string `header:"userId,optional"`
-	NewUserId int64  `header:"newUserId,optional"`
-	EntUserId int64  `header:"entUserId,optional"`
-}
-
-type AddProjectReq struct {
-	PositionId   int64  `header:"positionId,optional"`
-	Source       int64  `json:"source,optional"`
-	InfoId       string `json:"info_id,optional"`
-	PositionType int64  `header:"positionType,optional"`
-	AccountId    int64  `header:"accountId,optional"`
-	CompanyName  string `header:"entName,optional"`
-	UserName     string `header:"userName,optional"`
-	UserId       int64  `header:"newUserId,optional"`
-	EntId        int64  `header:"entId,optional"`
-	EntUserName  string `header:"entUserName,optional"`
-}
-
-type GetInfoIdReq struct {
-	PositionId int64 `header:"positionId,optional"`
-}
-
-type DrawClueReq struct {
-	PositionId int64 `header:"positionId,optional"`
-	Count      int64 `json:"count,optional"`
-}
-
-type CallReq struct {
-	PositionId int64  `header:"positionId,optional"`
-	Phone      string `json:"phone"`
-}
-
-type DistributeClueReq struct {
-	ClueCount  string                   `json:"clueCount"`
-	ClueIdList []int64                  `json:"clueIdList"`
-	Datas      []map[string]interface{} `json:"datas"`
-	PositionId int64                    `header:"positionId,optional"`
-	IsTask     int64                    `json:"isTask"`
-}
-
-type ClueImportReq struct {
-	PositionId int64  `header:"positionId,optional"`
-	Pcbh       string `json:"pcbh"`
-}
-
 type ClueAddReq struct {
 	Phone            string `json:"phone"`
 	Username         string `json:"username,optional"`
@@ -70,14 +18,40 @@ type ClueAddReq struct {
 	CustomerBudget   string `json:"customerBudget,optional"`
 }
 
-type SqlManageReq struct {
-	Id     float64 `json:"id"`
-	Params []Param `json:"params"`
+type ClueImportReq struct {
+	PositionId int64  `header:"positionId,optional"`
+	Pcbh       string `json:"pcbh"`
 }
 
-type Param struct {
-	Value string `json:"value"`
-	Type  string `json:"type"`
+type DistributeClueReq struct {
+	ClueCount  string                   `json:"clueCount"`
+	ClueIdList []int64                  `json:"clueIdList"`
+	Datas      []map[string]interface{} `json:"datas"`
+	PositionId int64                    `header:"positionId,optional"`
+	IsTask     int64                    `json:"isTask"`
+}
+
+type DistributeClueShowReq struct {
+	ClueIdList string                   `json:"clueIdList"`
+	Datas      []map[string]interface{} `json:"datas"`
+	PositionId int64                    `header:"positionId,optional"`
+	IsTask     int64                    `json:"isTask"`
+	DataType   int64                    `json:"dataType"`
+}
+
+type ExportByDbReq struct {
+	Token   string `json:"token"`
+	Title   string `json:"title"`
+	Content string `json:"content"`
+	Mails   string `json:"mails"`
+	Query   string `json:"query"`
+	Stype   string `json:"stype"`
+}
+
+type ExportReq struct {
+	Mail       string   `json:"mail"`
+	Mapping    []string `json:"mapping"`
+	PositionId int64    `header:"positionId,optional"`
 }
 
 type MyInfoReq struct {
@@ -85,6 +59,16 @@ type MyInfoReq struct {
 	Sid string `json:"sid"`
 }
 
+type OperateReq struct {
+	NewId string `json:"newId"`
+	Type  int64  `json:"type"`
+}
+
+type Param struct {
+	Value string `json:"value"`
+	Type  string `json:"type"`
+}
+
 type ResEmpowerReq struct {
 	EntId        int64  `header:"entId"`
 	ReqType      int64  `json:"reqType"`
@@ -93,17 +77,50 @@ type ResEmpowerReq struct {
 	PositionId   string `json:"positionId"`
 }
 
-type ExportReq struct {
-	Mail       string   `json:"mail"`
-	Mapping    []string `json:"mapping"`
-	PositionId int64    `header:"positionId,optional"`
+type SqlManageReq struct {
+	Id     float64 `json:"id"`
+	Params []Param `json:"params"`
 }
 
-type OperateReq struct {
-	NewId string `json:"newId"`
-	Type  int64  `json:"type"`
+type AddProjectReq struct {
+	PositionId   int64  `header:"positionId,optional"`
+	Source       int64  `json:"source,optional"`
+	InfoId       string `json:"info_id,optional"`
+	PositionType int64  `header:"positionType,optional"`
+	AccountId    int64  `header:"accountId,optional"`
+	CompanyName  string `header:"entName,optional"`
+	UserName     string `header:"userName,optional"`
+	UserId       int64  `header:"newUserId,optional"`
+	EntId        int64  `header:"entId,optional"`
+	EntUserName  string `header:"entUserName,optional"`
+}
+
+type BiResp struct {
+	Error_code int64       `json:"error_code"` //响应代码
+	Error_msg  string      `json:"error_msg"`  //响应消息
+	Data       interface{} `json:"data"`
+}
+
+type CallReq struct {
+	PositionId int64  `header:"positionId,optional"`
+	Phone      string `json:"phone"`
+}
+
+type DrawClueReq struct {
+	PositionId int64 `header:"positionId,optional"`
+	Count      int64 `json:"count,optional"`
 }
 
 type GetCompanyTypeReq struct {
 	CompanyName string `json:"companyName"`
 }
+
+type GetInfoIdReq struct {
+	PositionId int64 `header:"positionId,optional"`
+}
+
+type MyDataAssetReq struct {
+	UserId    string `header:"userId,optional"`
+	NewUserId int64  `header:"newUserId,optional"`
+	EntUserId int64  `header:"entUserId,optional"`
+}

+ 5 - 1
entity/entity.go

@@ -53,7 +53,9 @@ var (
 	GmailAuth        []*mail.GmailAuth
 	UpdataProjectUrl string
 	ExportDirectory  string
+	ComFileDir       string
 	ExportUrl        string
+	ComFileUrl       string
 	ExportCount      int
 )
 
@@ -230,10 +232,12 @@ func (h *Handler) HandleMessage(m *nsq.Message) error {
 	}
 	return nil
 }
-func InitConfig(directory, projectUrl, exportUrl string, count int) {
+func InitConfig(directory, dir2, projectUrl, exportUrl, url1 string, count int) {
 	ExportDirectory = directory
+	ComFileDir = dir2
 	UpdataProjectUrl = projectUrl
 	ExportUrl = exportUrl
+	ComFileUrl = url1
 	ExportCount = count
 }
 

+ 46 - 0
rpc/biService.proto

@@ -67,11 +67,13 @@ message BiResp {
 	string error_msg = 2;
 	string data = 3;
 }
+
 message BiReply {
 	int64 error_code = 1;
 	string error_msg = 2;
 	bytes data = 3;
 }
+
 message DistributeClueReq {
 	string clueCount = 1;
 	repeated int64 clueIdList = 2;
@@ -120,23 +122,28 @@ message ClueAddReq {
 	string wantGoods = 13;
 	string customerBudget = 14;
 }
+
 message SqlManageReq {
 	float id = 1;
 	repeated Param params = 2;
 }
+
 message MyInfoReq {
 	string bid = 1;
 	string sid = 2;
 }
+
 message Param {
 	string value = 1;
 	string type = 2;
 }
+
 message ExportReq {
 	string mail = 1;
 	repeated string mapping = 2;
 	int64 PositionId=3;
 }
+
 message OperateReq {
 	string newId = 1;
 	int64 type=2;
@@ -145,10 +152,46 @@ message OperateReq {
 message CompanyReq {
 	string companyName = 1;
 }
+
 message CompanyResp {
 	int64 status = 1;
 }
 
+message DistributeClueShowReq {
+	int64 positionId = 1;
+	int64 dataType = 2;
+	string clueIdList = 3;
+	repeated DistributeClueShows datas = 4;
+	int64 IsTask = 5;
+}
+
+message DistributeClueShows {
+	int64 positionId = 1;
+	int64 distributedCount = 2;
+}
+message DistributeClueShowss {
+	int64 positionId = 1;
+	int64 companyCount = 2;
+	int64 clueCount = 3;
+	int64 minCount = 4;
+	int64 companyCounts = 5;
+}
+
+message DistributeClueShowResp {
+	int64 error_code = 1;
+	string error_msg = 2;
+	repeated DistributeClueShowss data = 3;
+}
+
+message ExportByDbReq {
+	string token = 1;
+	string title = 2;
+	string content = 3;
+	string mails = 4;
+	string query = 5;
+	string stype = 6;
+}
+
 service BiService {
 	rpc myDataAsset (MyDataAssetReq) returns (MyDataAssetResp); //我的数据资产
 	rpc addProject (AddProjectReq) returns (AddProjectResp); //添加项目
@@ -166,4 +209,7 @@ service BiService {
 	rpc allProjectExport (ExportReq) returns (BiReply); //项目全量导出
 	rpc infoOperate (OperateReq) returns (BiReply); //数据操作
 	rpc getCompanyType (CompanyReq) returns (CompanyResp); //判断公司类型
+	rpc distributeClueShow (DistributeClueShowReq) returns (DistributeClueShowResp); //批量分配展示
+	rpc exportDataByDb (ExportByDbReq) returns (BiReply); //数据导出(通用)
+	rpc sendMail (ExportByDbReq) returns (BiReply); //数据导出(通用)
 }

+ 1 - 1
rpc/biservice.go

@@ -37,7 +37,7 @@ func main() {
 	entity.InitEntEs(c.EntEs.Version, c.EntEs.Address, c.EntEs.UserName, c.EntEs.Password, c.EntEs.DbSize)
 	entity.InitArea()
 	entity.InitRedis(c.RedisAddress)
-	entity.InitConfig(c.ExportDirectory, c.UpdateProjectUrl, c.ExportUrl, c.ExportCount)
+	entity.InitConfig(c.ExportDirectory, c.ComFileDir, c.UpdateProjectUrl, c.ExportUrl, c.ComFileUrl, c.ExportCount)
 	//合力亿捷
 	entity.GetHlyj(c.Hlyj.Appid, c.Hlyj.Account, c.Hlyj.Secret, c.Hlyj.TokenUrl, c.Hlyj.CallUrl, c.Hlyj.Integratedid, c.Hlyj.CallFlag)
 	//nsq

+ 47 - 24
rpc/biservice/biservice.go

@@ -13,30 +13,35 @@ import (
 )
 
 type (
-	AddProject        = pb.AddProject
-	AddProjectReq     = pb.AddProjectReq
-	AddProjectResp    = pb.AddProjectResp
-	BiReply           = pb.BiReply
-	BiResp            = pb.BiResp
-	CallReq           = pb.CallReq
-	ClueAddReq        = pb.ClueAddReq
-	ClueImport        = pb.ClueImport
-	ClueImportReq     = pb.ClueImportReq
-	ClueImportResp    = pb.ClueImportResp
-	CompanyReq        = pb.CompanyReq
-	CompanyResp       = pb.CompanyResp
-	DistributeClueReq = pb.DistributeClueReq
-	DistributeDatas   = pb.DistributeDatas
-	DrawClueReq       = pb.DrawClueReq
-	ExportReq         = pb.ExportReq
-	GetInfoIdResp     = pb.GetInfoIdResp
-	MyDataAsset       = pb.MyDataAsset
-	MyDataAssetReq    = pb.MyDataAssetReq
-	MyDataAssetResp   = pb.MyDataAssetResp
-	MyInfoReq         = pb.MyInfoReq
-	OperateReq        = pb.OperateReq
-	Param             = pb.Param
-	SqlManageReq      = pb.SqlManageReq
+	AddProject             = pb.AddProject
+	AddProjectReq          = pb.AddProjectReq
+	AddProjectResp         = pb.AddProjectResp
+	BiReply                = pb.BiReply
+	BiResp                 = pb.BiResp
+	CallReq                = pb.CallReq
+	ClueAddReq             = pb.ClueAddReq
+	ClueImport             = pb.ClueImport
+	ClueImportReq          = pb.ClueImportReq
+	ClueImportResp         = pb.ClueImportResp
+	CompanyReq             = pb.CompanyReq
+	CompanyResp            = pb.CompanyResp
+	DistributeClueReq      = pb.DistributeClueReq
+	DistributeClueShowReq  = pb.DistributeClueShowReq
+	DistributeClueShowResp = pb.DistributeClueShowResp
+	DistributeClueShows    = pb.DistributeClueShows
+	DistributeClueShowss   = pb.DistributeClueShowss
+	DistributeDatas        = pb.DistributeDatas
+	DrawClueReq            = pb.DrawClueReq
+	ExportByDbReq          = pb.ExportByDbReq
+	ExportReq              = pb.ExportReq
+	GetInfoIdResp          = pb.GetInfoIdResp
+	MyDataAsset            = pb.MyDataAsset
+	MyDataAssetReq         = pb.MyDataAssetReq
+	MyDataAssetResp        = pb.MyDataAssetResp
+	MyInfoReq              = pb.MyInfoReq
+	OperateReq             = pb.OperateReq
+	Param                  = pb.Param
+	SqlManageReq           = pb.SqlManageReq
 
 	BiService interface {
 		MyDataAsset(ctx context.Context, in *MyDataAssetReq, opts ...grpc.CallOption) (*MyDataAssetResp, error)
@@ -55,6 +60,9 @@ type (
 		AllProjectExport(ctx context.Context, in *ExportReq, opts ...grpc.CallOption) (*BiReply, error)
 		InfoOperate(ctx context.Context, in *OperateReq, opts ...grpc.CallOption) (*BiReply, error)
 		GetCompanyType(ctx context.Context, in *CompanyReq, opts ...grpc.CallOption) (*CompanyResp, error)
+		DistributeClueShow(ctx context.Context, in *DistributeClueShowReq, opts ...grpc.CallOption) (*DistributeClueShowResp, error)
+		ExportDataByDb(ctx context.Context, in *ExportByDbReq, opts ...grpc.CallOption) (*BiReply, error)
+		SendMail(ctx context.Context, in *ExportByDbReq, opts ...grpc.CallOption) (*BiReply, error)
 	}
 
 	defaultBiService struct {
@@ -147,3 +155,18 @@ func (m *defaultBiService) GetCompanyType(ctx context.Context, in *CompanyReq, o
 	client := pb.NewBiServiceClient(m.cli.Conn())
 	return client.GetCompanyType(ctx, in, opts...)
 }
+
+func (m *defaultBiService) DistributeClueShow(ctx context.Context, in *DistributeClueShowReq, opts ...grpc.CallOption) (*DistributeClueShowResp, error) {
+	client := pb.NewBiServiceClient(m.cli.Conn())
+	return client.DistributeClueShow(ctx, in, opts...)
+}
+
+func (m *defaultBiService) ExportDataByDb(ctx context.Context, in *ExportByDbReq, opts ...grpc.CallOption) (*BiReply, error) {
+	client := pb.NewBiServiceClient(m.cli.Conn())
+	return client.ExportDataByDb(ctx, in, opts...)
+}
+
+func (m *defaultBiService) SendMail(ctx context.Context, in *ExportByDbReq, opts ...grpc.CallOption) (*BiReply, error) {
+	client := pb.NewBiServiceClient(m.cli.Conn())
+	return client.SendMail(ctx, in, opts...)
+}

+ 6 - 4
rpc/etc/biservice.yaml

@@ -2,7 +2,7 @@ Name: biservice.rpc
 ListenOn: 0.0.0.0:9998
 Etcd:
   Hosts:
-  - 127.0.0.1:2379
+    - 192.168.3.240:2379
   Key: biservice.rpc
 Mode: test
 Mysql:
@@ -77,7 +77,7 @@ Es:
   DbSize: 5
   Version: v7
   UserName:
-  Password: 
+  Password:
   Index: projectset
   IType: projectset
 EntEs:
@@ -106,7 +106,7 @@ Hlyj:
   Account: N000000029739
   Secret: 3c8f7dd04d2c11edb786132b38c4d48a
   TokenUrl: https://a1.7x24cc.com/accessToken #获取token接口
-  CallFlag: 104 #外呼集成的接口号	
+  CallFlag: 104 #外呼集成的接口号
   CallUrl: https://a1.7x24cc.com/commonInte #外呼集成接口
   Integratedid: "8546"
 PublicKey: "791c521fec164e6c"
@@ -119,7 +119,9 @@ Mail:
     Port: 465
     Pwd: "ue9Rg9Sf4CVtdm5a"
     User: "public03@topnet.net.cn"
-UpdateProjectUrl: "https://tieta.spdata.jianyu360.com/updateProject"
+UpdateProjectUrl: "http://192.168.3.206:7778/updateProject"
 ExportDirectory: "D:/top_git_projects/biService"
+ComFileDir: "D:/top_git_projects/biComFileRes"
 ExportUrl: "https://jybx-webtest.jydev.jianyu360.com/tietaRes"
+ComFileUrl: "https://jybx-webtest.jydev.jianyu360.com/tietaRes"
 ExportCount: 15000

+ 2 - 0
rpc/internal/config/config.go

@@ -80,6 +80,8 @@ type Config struct {
 	}
 	UpdateProjectUrl string
 	ExportDirectory  string
+	ComFileDir       string
 	ExportCount      int
 	ExportUrl        string
+	ComFileUrl       string
 }

+ 14 - 0
rpc/internal/logic/T_test.go

@@ -0,0 +1,14 @@
+package logic
+
+import (
+	"fmt"
+	"testing"
+)
+
+func TokenTest(t *testing.T) {
+	content := "你好老师,这是导出的数据"
+	mail := "516807046@qq.com"
+	query := "select t1.全称 as FULL_NAME,t0.CREATE_TIME as CREATE_TIME,coalesce(t0.pv_resp_person,t0.ofv_resp_person,t0.onv_resp_person) as SFZ,coalesce(t0.pv_visitor,t0.ofv_visitor,t0.onv_visitor) as BFZ,coalesce(t0.pv_visit_time,t0.ofv_visit_time,t0.onv_visit_time) as BFSJ,t0.FOLLOW_STATUS as FOLLOW_STATUS,coalesce(t0.pv_next_follow_time,t0.ofv_next_follow_time,t0.onv_next_follow_time) as XCGJSJ,coalesce(t0.pv_content,t0.ofv_content,t0.onv_content) as NR from crm.follow_record t0 left join (select t0.id as ID,t1.full_name as 全称 from crm.task t0 left join crm.custom t1 on (t0.source_id=t1.id) where (t0.source=3)) t1 on (t0.task_id=t1.ID) where (t0.CREATE_TIME>=str_to_date('2024-02-01','%Y-%m-%d') and t0.CREATE_TIME<str_to_date('2024-02-02','%Y-%m-%d') AND t0.CREATE_PERSON IN ('孙振杰','陈瑞文','朱凤超')) order by coalesce(t0.pv_visit_time,t0.ofv_visit_time,t0.onv_visit_time) desc limit 6"
+	title := "数据导出"
+	RsaEncrypt([]byte(fmt.Sprintf("%s&%s&%s&%s", content, mail, query, title)))
+}

+ 30 - 0
rpc/internal/logic/distributeclueshowlogic.go

@@ -0,0 +1,30 @@
+package logic
+
+import (
+	"context"
+
+	"bp.jydev.jianyu360.cn/BaseService/biService/rpc/internal/svc"
+	"bp.jydev.jianyu360.cn/BaseService/biService/rpc/pb"
+	"bp.jydev.jianyu360.cn/BaseService/biService/service"
+	"github.com/zeromicro/go-zero/core/logx"
+)
+
+type DistributeClueShowLogic struct {
+	ctx    context.Context
+	svcCtx *svc.ServiceContext
+	logx.Logger
+}
+
+func NewDistributeClueShowLogic(ctx context.Context, svcCtx *svc.ServiceContext) *DistributeClueShowLogic {
+	return &DistributeClueShowLogic{
+		ctx:    ctx,
+		svcCtx: svcCtx,
+		Logger: logx.WithContext(ctx),
+	}
+}
+
+func (l *DistributeClueShowLogic) DistributeClueShow(in *pb.DistributeClueShowReq) (*pb.DistributeClueShowResp, error) {
+	// todo: add your logic here and delete this line
+
+	return service.DistributeClueShow(in), nil
+}

+ 30 - 0
rpc/internal/logic/exportdatabydblogic.go

@@ -0,0 +1,30 @@
+package logic
+
+import (
+	"context"
+
+	"bp.jydev.jianyu360.cn/BaseService/biService/rpc/internal/svc"
+	"bp.jydev.jianyu360.cn/BaseService/biService/rpc/pb"
+
+	"github.com/zeromicro/go-zero/core/logx"
+)
+
+type ExportDataByDbLogic struct {
+	ctx    context.Context
+	svcCtx *svc.ServiceContext
+	logx.Logger
+}
+
+func NewExportDataByDbLogic(ctx context.Context, svcCtx *svc.ServiceContext) *ExportDataByDbLogic {
+	return &ExportDataByDbLogic{
+		ctx:    ctx,
+		svcCtx: svcCtx,
+		Logger: logx.WithContext(ctx),
+	}
+}
+
+func (l *ExportDataByDbLogic) ExportDataByDb(in *pb.ExportByDbReq) (*pb.BiReply, error) {
+	// todo: add your logic here and delete this line
+
+	return &pb.BiReply{}, nil
+}

+ 77 - 0
rpc/internal/logic/sendmaillogic.go

@@ -0,0 +1,77 @@
+package logic
+
+import (
+	"app.yhyue.com/moapp/jybase/common"
+	"bp.jydev.jianyu360.cn/BaseService/biService/entity"
+	"bp.jydev.jianyu360.cn/BaseService/biService/service"
+	"context"
+	"fmt"
+	"github.com/gogf/gf/v2/util/gconv"
+	"github.com/tjfoc/gmsm/sm4"
+	"regexp"
+
+	"bp.jydev.jianyu360.cn/BaseService/biService/rpc/internal/svc"
+	"bp.jydev.jianyu360.cn/BaseService/biService/rpc/pb"
+
+	"github.com/zeromicro/go-zero/core/logx"
+)
+
+type SendMailLogic struct {
+	ctx    context.Context
+	svcCtx *svc.ServiceContext
+	logx.Logger
+}
+
+func NewSendMailLogic(ctx context.Context, svcCtx *svc.ServiceContext) *SendMailLogic {
+	return &SendMailLogic{
+		ctx:    ctx,
+		svcCtx: svcCtx,
+		Logger: logx.WithContext(ctx),
+	}
+}
+
+var reg1 = regexp.MustCompile("(?i)(insert|delete|update|master|truncate|declare|exec|alter|use)\\s")
+var reg2 = regexp.MustCompile("(?i)(select|from)\\s")
+
+func (l *SendMailLogic) SendMail(in *pb.ExportByDbReq) (*pb.BiReply, error) {
+	if in.Query == "" || in.Token == "" || in.Title == "" || in.Content == "" || in.Mails == "" {
+		return &pb.BiReply{
+			ErrorCode: 1,
+			ErrorMsg:  "参数不能为空",
+			Data:      nil,
+		}, nil
+	}
+	if reg1.MatchString(in.Query) && !reg2.MatchString(in.Query) {
+		return &pb.BiReply{
+			ErrorCode: 1,
+			ErrorMsg:  "查询语句不合法",
+			Data:      nil,
+		}, nil
+	}
+	if RsaEncrypt([]byte(fmt.Sprintf("%s&%s&%s&%s", gconv.String(in.Content), gconv.String(in.Mails), gconv.String(in.Query), gconv.String(in.Title)))) == in.Token {
+		return &pb.BiReply{
+			ErrorCode: 1,
+			ErrorMsg:  "token验证不通过",
+			Data:      nil,
+		}, nil
+	}
+	res := (&service.ExportByDbReq{
+		Token:   in.Token,
+		Title:   in.Title,
+		Content: in.Content,
+		Mails:   in.Mails,
+		Query:   in.Query,
+		Stype:   in.Stype,
+	}).ExportDataByDb()
+	return &pb.BiReply{
+		ErrorCode: 0,
+		ErrorMsg:  "",
+		Data:      res,
+	}, nil
+}
+
+func RsaEncrypt(data []byte) string {
+	key := []byte(entity.PublicKey)
+	b, _ := sm4.Sm4Ecb(key, data, true)
+	return common.GetMd5String(string(b))
+}

+ 15 - 0
rpc/internal/server/biserviceserver.go

@@ -101,3 +101,18 @@ func (s *BiServiceServer) GetCompanyType(ctx context.Context, in *pb.CompanyReq)
 	l := logic.NewGetCompanyTypeLogic(ctx, s.svcCtx)
 	return l.GetCompanyType(in)
 }
+
+func (s *BiServiceServer) DistributeClueShow(ctx context.Context, in *pb.DistributeClueShowReq) (*pb.DistributeClueShowResp, error) {
+	l := logic.NewDistributeClueShowLogic(ctx, s.svcCtx)
+	return l.DistributeClueShow(in)
+}
+
+func (s *BiServiceServer) ExportDataByDb(ctx context.Context, in *pb.ExportByDbReq) (*pb.BiReply, error) {
+	l := logic.NewExportDataByDbLogic(ctx, s.svcCtx)
+	return l.ExportDataByDb(in)
+}
+
+func (s *BiServiceServer) SendMail(ctx context.Context, in *pb.ExportByDbReq) (*pb.BiReply, error) {
+	l := logic.NewSendMailLogic(ctx, s.svcCtx)
+	return l.SendMail(in)
+}

+ 603 - 110
rpc/pb/biService.pb.go

@@ -1,7 +1,7 @@
 // Code generated by protoc-gen-go. DO NOT EDIT.
 // versions:
-// 	protoc-gen-go v1.27.1
-// 	protoc        v3.19.4
+// 	protoc-gen-go v1.32.0
+// 	protoc        v4.25.2
 // source: biService.proto
 
 package pb
@@ -1620,6 +1620,369 @@ func (x *CompanyResp) GetStatus() int64 {
 	return 0
 }
 
+type DistributeClueShowReq struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	PositionId int64                  `protobuf:"varint,1,opt,name=positionId,proto3" json:"positionId,omitempty"`
+	DataType   int64                  `protobuf:"varint,2,opt,name=dataType,proto3" json:"dataType,omitempty"`
+	ClueIdList string                 `protobuf:"bytes,3,opt,name=clueIdList,proto3" json:"clueIdList,omitempty"`
+	Datas      []*DistributeClueShows `protobuf:"bytes,4,rep,name=datas,proto3" json:"datas,omitempty"`
+	IsTask     int64                  `protobuf:"varint,5,opt,name=IsTask,proto3" json:"IsTask,omitempty"`
+}
+
+func (x *DistributeClueShowReq) Reset() {
+	*x = DistributeClueShowReq{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_biService_proto_msgTypes[24]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *DistributeClueShowReq) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*DistributeClueShowReq) ProtoMessage() {}
+
+func (x *DistributeClueShowReq) ProtoReflect() protoreflect.Message {
+	mi := &file_biService_proto_msgTypes[24]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use DistributeClueShowReq.ProtoReflect.Descriptor instead.
+func (*DistributeClueShowReq) Descriptor() ([]byte, []int) {
+	return file_biService_proto_rawDescGZIP(), []int{24}
+}
+
+func (x *DistributeClueShowReq) GetPositionId() int64 {
+	if x != nil {
+		return x.PositionId
+	}
+	return 0
+}
+
+func (x *DistributeClueShowReq) GetDataType() int64 {
+	if x != nil {
+		return x.DataType
+	}
+	return 0
+}
+
+func (x *DistributeClueShowReq) GetClueIdList() string {
+	if x != nil {
+		return x.ClueIdList
+	}
+	return ""
+}
+
+func (x *DistributeClueShowReq) GetDatas() []*DistributeClueShows {
+	if x != nil {
+		return x.Datas
+	}
+	return nil
+}
+
+func (x *DistributeClueShowReq) GetIsTask() int64 {
+	if x != nil {
+		return x.IsTask
+	}
+	return 0
+}
+
+type DistributeClueShows struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	PositionId       int64 `protobuf:"varint,1,opt,name=positionId,proto3" json:"positionId,omitempty"`
+	DistributedCount int64 `protobuf:"varint,2,opt,name=distributedCount,proto3" json:"distributedCount,omitempty"`
+}
+
+func (x *DistributeClueShows) Reset() {
+	*x = DistributeClueShows{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_biService_proto_msgTypes[25]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *DistributeClueShows) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*DistributeClueShows) ProtoMessage() {}
+
+func (x *DistributeClueShows) ProtoReflect() protoreflect.Message {
+	mi := &file_biService_proto_msgTypes[25]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use DistributeClueShows.ProtoReflect.Descriptor instead.
+func (*DistributeClueShows) Descriptor() ([]byte, []int) {
+	return file_biService_proto_rawDescGZIP(), []int{25}
+}
+
+func (x *DistributeClueShows) GetPositionId() int64 {
+	if x != nil {
+		return x.PositionId
+	}
+	return 0
+}
+
+func (x *DistributeClueShows) GetDistributedCount() int64 {
+	if x != nil {
+		return x.DistributedCount
+	}
+	return 0
+}
+
+type DistributeClueShowss struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	PositionId    int64 `protobuf:"varint,1,opt,name=positionId,proto3" json:"positionId,omitempty"`
+	CompanyCount  int64 `protobuf:"varint,2,opt,name=companyCount,proto3" json:"companyCount,omitempty"`
+	ClueCount     int64 `protobuf:"varint,3,opt,name=clueCount,proto3" json:"clueCount,omitempty"`
+	MinCount      int64 `protobuf:"varint,4,opt,name=minCount,proto3" json:"minCount,omitempty"`
+	CompanyCounts int64 `protobuf:"varint,5,opt,name=companyCounts,proto3" json:"companyCounts,omitempty"`
+}
+
+func (x *DistributeClueShowss) Reset() {
+	*x = DistributeClueShowss{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_biService_proto_msgTypes[26]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *DistributeClueShowss) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*DistributeClueShowss) ProtoMessage() {}
+
+func (x *DistributeClueShowss) ProtoReflect() protoreflect.Message {
+	mi := &file_biService_proto_msgTypes[26]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use DistributeClueShowss.ProtoReflect.Descriptor instead.
+func (*DistributeClueShowss) Descriptor() ([]byte, []int) {
+	return file_biService_proto_rawDescGZIP(), []int{26}
+}
+
+func (x *DistributeClueShowss) GetPositionId() int64 {
+	if x != nil {
+		return x.PositionId
+	}
+	return 0
+}
+
+func (x *DistributeClueShowss) GetCompanyCount() int64 {
+	if x != nil {
+		return x.CompanyCount
+	}
+	return 0
+}
+
+func (x *DistributeClueShowss) GetClueCount() int64 {
+	if x != nil {
+		return x.ClueCount
+	}
+	return 0
+}
+
+func (x *DistributeClueShowss) GetMinCount() int64 {
+	if x != nil {
+		return x.MinCount
+	}
+	return 0
+}
+
+func (x *DistributeClueShowss) GetCompanyCounts() int64 {
+	if x != nil {
+		return x.CompanyCounts
+	}
+	return 0
+}
+
+type DistributeClueShowResp struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	ErrorCode int64                   `protobuf:"varint,1,opt,name=error_code,json=errorCode,proto3" json:"error_code,omitempty"`
+	ErrorMsg  string                  `protobuf:"bytes,2,opt,name=error_msg,json=errorMsg,proto3" json:"error_msg,omitempty"`
+	Data      []*DistributeClueShowss `protobuf:"bytes,3,rep,name=data,proto3" json:"data,omitempty"`
+}
+
+func (x *DistributeClueShowResp) Reset() {
+	*x = DistributeClueShowResp{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_biService_proto_msgTypes[27]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *DistributeClueShowResp) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*DistributeClueShowResp) ProtoMessage() {}
+
+func (x *DistributeClueShowResp) ProtoReflect() protoreflect.Message {
+	mi := &file_biService_proto_msgTypes[27]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use DistributeClueShowResp.ProtoReflect.Descriptor instead.
+func (*DistributeClueShowResp) Descriptor() ([]byte, []int) {
+	return file_biService_proto_rawDescGZIP(), []int{27}
+}
+
+func (x *DistributeClueShowResp) GetErrorCode() int64 {
+	if x != nil {
+		return x.ErrorCode
+	}
+	return 0
+}
+
+func (x *DistributeClueShowResp) GetErrorMsg() string {
+	if x != nil {
+		return x.ErrorMsg
+	}
+	return ""
+}
+
+func (x *DistributeClueShowResp) GetData() []*DistributeClueShowss {
+	if x != nil {
+		return x.Data
+	}
+	return nil
+}
+
+type ExportByDbReq struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	Token   string `protobuf:"bytes,1,opt,name=token,proto3" json:"token,omitempty"`
+	Title   string `protobuf:"bytes,2,opt,name=title,proto3" json:"title,omitempty"`
+	Content string `protobuf:"bytes,3,opt,name=content,proto3" json:"content,omitempty"`
+	Mails   string `protobuf:"bytes,4,opt,name=mails,proto3" json:"mails,omitempty"`
+	Query   string `protobuf:"bytes,5,opt,name=query,proto3" json:"query,omitempty"`
+	Stype   string `protobuf:"bytes,6,opt,name=stype,proto3" json:"stype,omitempty"`
+}
+
+func (x *ExportByDbReq) Reset() {
+	*x = ExportByDbReq{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_biService_proto_msgTypes[28]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *ExportByDbReq) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*ExportByDbReq) ProtoMessage() {}
+
+func (x *ExportByDbReq) ProtoReflect() protoreflect.Message {
+	mi := &file_biService_proto_msgTypes[28]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use ExportByDbReq.ProtoReflect.Descriptor instead.
+func (*ExportByDbReq) Descriptor() ([]byte, []int) {
+	return file_biService_proto_rawDescGZIP(), []int{28}
+}
+
+func (x *ExportByDbReq) GetToken() string {
+	if x != nil {
+		return x.Token
+	}
+	return ""
+}
+
+func (x *ExportByDbReq) GetTitle() string {
+	if x != nil {
+		return x.Title
+	}
+	return ""
+}
+
+func (x *ExportByDbReq) GetContent() string {
+	if x != nil {
+		return x.Content
+	}
+	return ""
+}
+
+func (x *ExportByDbReq) GetMails() string {
+	if x != nil {
+		return x.Mails
+	}
+	return ""
+}
+
+func (x *ExportByDbReq) GetQuery() string {
+	if x != nil {
+		return x.Query
+	}
+	return ""
+}
+
+func (x *ExportByDbReq) GetStype() string {
+	if x != nil {
+		return x.Stype
+	}
+	return ""
+}
+
 var File_biService_proto protoreflect.FileDescriptor
 
 var file_biService_proto_rawDesc = []byte{
@@ -1798,51 +2161,108 @@ var file_biService_proto_rawDesc = []byte{
 	0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x6e, 0x79,
 	0x4e, 0x61, 0x6d, 0x65, 0x22, 0x25, 0x0a, 0x0b, 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x6e, 0x79, 0x52,
 	0x65, 0x73, 0x70, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x01, 0x20,
-	0x01, 0x28, 0x03, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x32, 0xb2, 0x05, 0x0a, 0x09,
-	0x42, 0x69, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x30, 0x0a, 0x0b, 0x6d, 0x79, 0x44,
-	0x61, 0x74, 0x61, 0x41, 0x73, 0x73, 0x65, 0x74, 0x12, 0x0f, 0x2e, 0x4d, 0x79, 0x44, 0x61, 0x74,
-	0x61, 0x41, 0x73, 0x73, 0x65, 0x74, 0x52, 0x65, 0x71, 0x1a, 0x10, 0x2e, 0x4d, 0x79, 0x44, 0x61,
-	0x74, 0x61, 0x41, 0x73, 0x73, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x12, 0x2d, 0x0a, 0x0a, 0x61,
-	0x64, 0x64, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x0e, 0x2e, 0x41, 0x64, 0x64, 0x50,
-	0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, 0x71, 0x1a, 0x0f, 0x2e, 0x41, 0x64, 0x64, 0x50,
-	0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, 0x73, 0x70, 0x12, 0x2b, 0x0a, 0x09, 0x67, 0x65,
-	0x74, 0x49, 0x6e, 0x66, 0x6f, 0x49, 0x64, 0x12, 0x0e, 0x2e, 0x41, 0x64, 0x64, 0x50, 0x72, 0x6f,
-	0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, 0x71, 0x1a, 0x0e, 0x2e, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x66,
-	0x6f, 0x49, 0x64, 0x52, 0x65, 0x73, 0x70, 0x12, 0x29, 0x0a, 0x08, 0x64, 0x72, 0x61, 0x77, 0x43,
-	0x6c, 0x75, 0x65, 0x12, 0x0c, 0x2e, 0x44, 0x72, 0x61, 0x77, 0x43, 0x6c, 0x75, 0x65, 0x52, 0x65,
-	0x71, 0x1a, 0x0f, 0x2e, 0x41, 0x64, 0x64, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x65,
-	0x73, 0x70, 0x12, 0x19, 0x0a, 0x04, 0x43, 0x61, 0x6c, 0x6c, 0x12, 0x08, 0x2e, 0x43, 0x61, 0x6c,
-	0x6c, 0x52, 0x65, 0x71, 0x1a, 0x07, 0x2e, 0x42, 0x69, 0x52, 0x65, 0x73, 0x70, 0x12, 0x35, 0x0a,
-	0x0e, 0x64, 0x69, 0x73, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x43, 0x6c, 0x75, 0x65, 0x12,
-	0x12, 0x2e, 0x44, 0x69, 0x73, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x43, 0x6c, 0x75, 0x65,
-	0x52, 0x65, 0x71, 0x1a, 0x0f, 0x2e, 0x41, 0x64, 0x64, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74,
-	0x52, 0x65, 0x73, 0x70, 0x12, 0x2d, 0x0a, 0x0a, 0x63, 0x6c, 0x75, 0x65, 0x49, 0x6d, 0x70, 0x6f,
-	0x72, 0x74, 0x12, 0x0e, 0x2e, 0x43, 0x6c, 0x75, 0x65, 0x49, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x52,
-	0x65, 0x71, 0x1a, 0x0f, 0x2e, 0x43, 0x6c, 0x75, 0x65, 0x49, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x52,
-	0x65, 0x73, 0x70, 0x12, 0x27, 0x0a, 0x07, 0x63, 0x6c, 0x75, 0x65, 0x41, 0x64, 0x64, 0x12, 0x0b,
-	0x2e, 0x43, 0x6c, 0x75, 0x65, 0x41, 0x64, 0x64, 0x52, 0x65, 0x71, 0x1a, 0x0f, 0x2e, 0x41, 0x64,
-	0x64, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, 0x73, 0x70, 0x12, 0x2f, 0x0a, 0x0c,
-	0x63, 0x6c, 0x75, 0x65, 0x49, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x54, 0x74, 0x12, 0x0e, 0x2e, 0x43,
-	0x6c, 0x75, 0x65, 0x49, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x52, 0x65, 0x71, 0x1a, 0x0f, 0x2e, 0x43,
-	0x6c, 0x75, 0x65, 0x49, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x52, 0x65, 0x73, 0x70, 0x12, 0x27, 0x0a,
-	0x0a, 0x61, 0x75, 0x74, 0x6f, 0x46, 0x6f, 0x6c, 0x6c, 0x6f, 0x77, 0x12, 0x08, 0x2e, 0x43, 0x61,
-	0x6c, 0x6c, 0x52, 0x65, 0x71, 0x1a, 0x0f, 0x2e, 0x43, 0x6c, 0x75, 0x65, 0x49, 0x6d, 0x70, 0x6f,
-	0x72, 0x74, 0x52, 0x65, 0x73, 0x70, 0x12, 0x24, 0x0a, 0x09, 0x73, 0x71, 0x6c, 0x4d, 0x61, 0x6e,
-	0x61, 0x67, 0x65, 0x12, 0x0d, 0x2e, 0x53, 0x71, 0x6c, 0x4d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x52,
-	0x65, 0x71, 0x1a, 0x08, 0x2e, 0x42, 0x69, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x1e, 0x0a, 0x06,
-	0x6d, 0x79, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x0a, 0x2e, 0x4d, 0x79, 0x49, 0x6e, 0x66, 0x6f, 0x52,
-	0x65, 0x71, 0x1a, 0x08, 0x2e, 0x42, 0x69, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x25, 0x0a, 0x0d,
-	0x61, 0x6c, 0x6c, 0x49, 0x6e, 0x66, 0x6f, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x12, 0x0a, 0x2e,
-	0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x52, 0x65, 0x71, 0x1a, 0x08, 0x2e, 0x42, 0x69, 0x52, 0x65,
-	0x70, 0x6c, 0x79, 0x12, 0x28, 0x0a, 0x10, 0x61, 0x6c, 0x6c, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63,
-	0x74, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x12, 0x0a, 0x2e, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74,
-	0x52, 0x65, 0x71, 0x1a, 0x08, 0x2e, 0x42, 0x69, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x24, 0x0a,
-	0x0b, 0x69, 0x6e, 0x66, 0x6f, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x65, 0x12, 0x0b, 0x2e, 0x4f,
-	0x70, 0x65, 0x72, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x1a, 0x08, 0x2e, 0x42, 0x69, 0x52, 0x65,
-	0x70, 0x6c, 0x79, 0x12, 0x2b, 0x0a, 0x0e, 0x67, 0x65, 0x74, 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x6e,
-	0x79, 0x54, 0x79, 0x70, 0x65, 0x12, 0x0b, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x6e, 0x79, 0x52,
-	0x65, 0x71, 0x1a, 0x0c, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x6e, 0x79, 0x52, 0x65, 0x73, 0x70,
-	0x42, 0x06, 0x5a, 0x04, 0x2e, 0x2f, 0x70, 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
+	0x01, 0x28, 0x03, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x22, 0xb7, 0x01, 0x0a, 0x15,
+	0x44, 0x69, 0x73, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x43, 0x6c, 0x75, 0x65, 0x53, 0x68,
+	0x6f, 0x77, 0x52, 0x65, 0x71, 0x12, 0x1e, 0x0a, 0x0a, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f,
+	0x6e, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0a, 0x70, 0x6f, 0x73, 0x69, 0x74,
+	0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70,
+	0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x08, 0x64, 0x61, 0x74, 0x61, 0x54, 0x79, 0x70,
+	0x65, 0x12, 0x1e, 0x0a, 0x0a, 0x63, 0x6c, 0x75, 0x65, 0x49, 0x64, 0x4c, 0x69, 0x73, 0x74, 0x18,
+	0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x6c, 0x75, 0x65, 0x49, 0x64, 0x4c, 0x69, 0x73,
+	0x74, 0x12, 0x2a, 0x0a, 0x05, 0x64, 0x61, 0x74, 0x61, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b,
+	0x32, 0x14, 0x2e, 0x44, 0x69, 0x73, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x43, 0x6c, 0x75,
+	0x65, 0x53, 0x68, 0x6f, 0x77, 0x73, 0x52, 0x05, 0x64, 0x61, 0x74, 0x61, 0x73, 0x12, 0x16, 0x0a,
+	0x06, 0x49, 0x73, 0x54, 0x61, 0x73, 0x6b, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x06, 0x49,
+	0x73, 0x54, 0x61, 0x73, 0x6b, 0x22, 0x61, 0x0a, 0x13, 0x44, 0x69, 0x73, 0x74, 0x72, 0x69, 0x62,
+	0x75, 0x74, 0x65, 0x43, 0x6c, 0x75, 0x65, 0x53, 0x68, 0x6f, 0x77, 0x73, 0x12, 0x1e, 0x0a, 0x0a,
+	0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03,
+	0x52, 0x0a, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x2a, 0x0a, 0x10,
+	0x64, 0x69, 0x73, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x64, 0x43, 0x6f, 0x75, 0x6e, 0x74,
+	0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x10, 0x64, 0x69, 0x73, 0x74, 0x72, 0x69, 0x62, 0x75,
+	0x74, 0x65, 0x64, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0xba, 0x01, 0x0a, 0x14, 0x44, 0x69, 0x73,
+	0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x43, 0x6c, 0x75, 0x65, 0x53, 0x68, 0x6f, 0x77, 0x73,
+	0x73, 0x12, 0x1e, 0x0a, 0x0a, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x18,
+	0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0a, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x49,
+	0x64, 0x12, 0x22, 0x0a, 0x0c, 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x6e, 0x79, 0x43, 0x6f, 0x75, 0x6e,
+	0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0c, 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x6e, 0x79,
+	0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x63, 0x6c, 0x75, 0x65, 0x43, 0x6f, 0x75,
+	0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x63, 0x6c, 0x75, 0x65, 0x43, 0x6f,
+	0x75, 0x6e, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x6d, 0x69, 0x6e, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x18,
+	0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x08, 0x6d, 0x69, 0x6e, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12,
+	0x24, 0x0a, 0x0d, 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x6e, 0x79, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x73,
+	0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0d, 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x6e, 0x79, 0x43,
+	0x6f, 0x75, 0x6e, 0x74, 0x73, 0x22, 0x7f, 0x0a, 0x16, 0x44, 0x69, 0x73, 0x74, 0x72, 0x69, 0x62,
+	0x75, 0x74, 0x65, 0x43, 0x6c, 0x75, 0x65, 0x53, 0x68, 0x6f, 0x77, 0x52, 0x65, 0x73, 0x70, 0x12,
+	0x1d, 0x0a, 0x0a, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x5f, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x01, 0x20,
+	0x01, 0x28, 0x03, 0x52, 0x09, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x43, 0x6f, 0x64, 0x65, 0x12, 0x1b,
+	0x0a, 0x09, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x5f, 0x6d, 0x73, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28,
+	0x09, 0x52, 0x08, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x4d, 0x73, 0x67, 0x12, 0x29, 0x0a, 0x04, 0x64,
+	0x61, 0x74, 0x61, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x44, 0x69, 0x73, 0x74,
+	0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x43, 0x6c, 0x75, 0x65, 0x53, 0x68, 0x6f, 0x77, 0x73, 0x73,
+	0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x22, 0x97, 0x01, 0x0a, 0x0d, 0x45, 0x78, 0x70, 0x6f, 0x72,
+	0x74, 0x42, 0x79, 0x44, 0x62, 0x52, 0x65, 0x71, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x6f, 0x6b, 0x65,
+	0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x14,
+	0x0a, 0x05, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74,
+	0x69, 0x74, 0x6c, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x18,
+	0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x12, 0x14,
+	0x0a, 0x05, 0x6d, 0x61, 0x69, 0x6c, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6d,
+	0x61, 0x69, 0x6c, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x18, 0x05, 0x20,
+	0x01, 0x28, 0x09, 0x52, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74,
+	0x79, 0x70, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x74, 0x79, 0x70, 0x65,
+	0x32, 0xcb, 0x06, 0x0a, 0x09, 0x42, 0x69, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x30,
+	0x0a, 0x0b, 0x6d, 0x79, 0x44, 0x61, 0x74, 0x61, 0x41, 0x73, 0x73, 0x65, 0x74, 0x12, 0x0f, 0x2e,
+	0x4d, 0x79, 0x44, 0x61, 0x74, 0x61, 0x41, 0x73, 0x73, 0x65, 0x74, 0x52, 0x65, 0x71, 0x1a, 0x10,
+	0x2e, 0x4d, 0x79, 0x44, 0x61, 0x74, 0x61, 0x41, 0x73, 0x73, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70,
+	0x12, 0x2d, 0x0a, 0x0a, 0x61, 0x64, 0x64, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x0e,
+	0x2e, 0x41, 0x64, 0x64, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, 0x71, 0x1a, 0x0f,
+	0x2e, 0x41, 0x64, 0x64, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, 0x73, 0x70, 0x12,
+	0x2b, 0x0a, 0x09, 0x67, 0x65, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x49, 0x64, 0x12, 0x0e, 0x2e, 0x41,
+	0x64, 0x64, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, 0x71, 0x1a, 0x0e, 0x2e, 0x47,
+	0x65, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x49, 0x64, 0x52, 0x65, 0x73, 0x70, 0x12, 0x29, 0x0a, 0x08,
+	0x64, 0x72, 0x61, 0x77, 0x43, 0x6c, 0x75, 0x65, 0x12, 0x0c, 0x2e, 0x44, 0x72, 0x61, 0x77, 0x43,
+	0x6c, 0x75, 0x65, 0x52, 0x65, 0x71, 0x1a, 0x0f, 0x2e, 0x41, 0x64, 0x64, 0x50, 0x72, 0x6f, 0x6a,
+	0x65, 0x63, 0x74, 0x52, 0x65, 0x73, 0x70, 0x12, 0x19, 0x0a, 0x04, 0x43, 0x61, 0x6c, 0x6c, 0x12,
+	0x08, 0x2e, 0x43, 0x61, 0x6c, 0x6c, 0x52, 0x65, 0x71, 0x1a, 0x07, 0x2e, 0x42, 0x69, 0x52, 0x65,
+	0x73, 0x70, 0x12, 0x35, 0x0a, 0x0e, 0x64, 0x69, 0x73, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65,
+	0x43, 0x6c, 0x75, 0x65, 0x12, 0x12, 0x2e, 0x44, 0x69, 0x73, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74,
+	0x65, 0x43, 0x6c, 0x75, 0x65, 0x52, 0x65, 0x71, 0x1a, 0x0f, 0x2e, 0x41, 0x64, 0x64, 0x50, 0x72,
+	0x6f, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, 0x73, 0x70, 0x12, 0x2d, 0x0a, 0x0a, 0x63, 0x6c, 0x75,
+	0x65, 0x49, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x12, 0x0e, 0x2e, 0x43, 0x6c, 0x75, 0x65, 0x49, 0x6d,
+	0x70, 0x6f, 0x72, 0x74, 0x52, 0x65, 0x71, 0x1a, 0x0f, 0x2e, 0x43, 0x6c, 0x75, 0x65, 0x49, 0x6d,
+	0x70, 0x6f, 0x72, 0x74, 0x52, 0x65, 0x73, 0x70, 0x12, 0x27, 0x0a, 0x07, 0x63, 0x6c, 0x75, 0x65,
+	0x41, 0x64, 0x64, 0x12, 0x0b, 0x2e, 0x43, 0x6c, 0x75, 0x65, 0x41, 0x64, 0x64, 0x52, 0x65, 0x71,
+	0x1a, 0x0f, 0x2e, 0x41, 0x64, 0x64, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, 0x73,
+	0x70, 0x12, 0x2f, 0x0a, 0x0c, 0x63, 0x6c, 0x75, 0x65, 0x49, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x54,
+	0x74, 0x12, 0x0e, 0x2e, 0x43, 0x6c, 0x75, 0x65, 0x49, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x52, 0x65,
+	0x71, 0x1a, 0x0f, 0x2e, 0x43, 0x6c, 0x75, 0x65, 0x49, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x52, 0x65,
+	0x73, 0x70, 0x12, 0x27, 0x0a, 0x0a, 0x61, 0x75, 0x74, 0x6f, 0x46, 0x6f, 0x6c, 0x6c, 0x6f, 0x77,
+	0x12, 0x08, 0x2e, 0x43, 0x61, 0x6c, 0x6c, 0x52, 0x65, 0x71, 0x1a, 0x0f, 0x2e, 0x43, 0x6c, 0x75,
+	0x65, 0x49, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x52, 0x65, 0x73, 0x70, 0x12, 0x24, 0x0a, 0x09, 0x73,
+	0x71, 0x6c, 0x4d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x12, 0x0d, 0x2e, 0x53, 0x71, 0x6c, 0x4d, 0x61,
+	0x6e, 0x61, 0x67, 0x65, 0x52, 0x65, 0x71, 0x1a, 0x08, 0x2e, 0x42, 0x69, 0x52, 0x65, 0x70, 0x6c,
+	0x79, 0x12, 0x1e, 0x0a, 0x06, 0x6d, 0x79, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x0a, 0x2e, 0x4d, 0x79,
+	0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x1a, 0x08, 0x2e, 0x42, 0x69, 0x52, 0x65, 0x70, 0x6c,
+	0x79, 0x12, 0x25, 0x0a, 0x0d, 0x61, 0x6c, 0x6c, 0x49, 0x6e, 0x66, 0x6f, 0x45, 0x78, 0x70, 0x6f,
+	0x72, 0x74, 0x12, 0x0a, 0x2e, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x52, 0x65, 0x71, 0x1a, 0x08,
+	0x2e, 0x42, 0x69, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x28, 0x0a, 0x10, 0x61, 0x6c, 0x6c, 0x50,
+	0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x12, 0x0a, 0x2e, 0x45,
+	0x78, 0x70, 0x6f, 0x72, 0x74, 0x52, 0x65, 0x71, 0x1a, 0x08, 0x2e, 0x42, 0x69, 0x52, 0x65, 0x70,
+	0x6c, 0x79, 0x12, 0x24, 0x0a, 0x0b, 0x69, 0x6e, 0x66, 0x6f, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74,
+	0x65, 0x12, 0x0b, 0x2e, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x1a, 0x08,
+	0x2e, 0x42, 0x69, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x2b, 0x0a, 0x0e, 0x67, 0x65, 0x74, 0x43,
+	0x6f, 0x6d, 0x70, 0x61, 0x6e, 0x79, 0x54, 0x79, 0x70, 0x65, 0x12, 0x0b, 0x2e, 0x43, 0x6f, 0x6d,
+	0x70, 0x61, 0x6e, 0x79, 0x52, 0x65, 0x71, 0x1a, 0x0c, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x6e,
+	0x79, 0x52, 0x65, 0x73, 0x70, 0x12, 0x45, 0x0a, 0x12, 0x64, 0x69, 0x73, 0x74, 0x72, 0x69, 0x62,
+	0x75, 0x74, 0x65, 0x43, 0x6c, 0x75, 0x65, 0x53, 0x68, 0x6f, 0x77, 0x12, 0x16, 0x2e, 0x44, 0x69,
+	0x73, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x43, 0x6c, 0x75, 0x65, 0x53, 0x68, 0x6f, 0x77,
+	0x52, 0x65, 0x71, 0x1a, 0x17, 0x2e, 0x44, 0x69, 0x73, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65,
+	0x43, 0x6c, 0x75, 0x65, 0x53, 0x68, 0x6f, 0x77, 0x52, 0x65, 0x73, 0x70, 0x12, 0x2a, 0x0a, 0x0e,
+	0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x44, 0x61, 0x74, 0x61, 0x42, 0x79, 0x44, 0x62, 0x12, 0x0e,
+	0x2e, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x42, 0x79, 0x44, 0x62, 0x52, 0x65, 0x71, 0x1a, 0x08,
+	0x2e, 0x42, 0x69, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x24, 0x0a, 0x08, 0x73, 0x65, 0x6e, 0x64,
+	0x4d, 0x61, 0x69, 0x6c, 0x12, 0x0e, 0x2e, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x42, 0x79, 0x44,
+	0x62, 0x52, 0x65, 0x71, 0x1a, 0x08, 0x2e, 0x42, 0x69, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x42, 0x06,
+	0x5a, 0x04, 0x2e, 0x2f, 0x70, 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
 }
 
 var (
@@ -1857,32 +2277,37 @@ func file_biService_proto_rawDescGZIP() []byte {
 	return file_biService_proto_rawDescData
 }
 
-var file_biService_proto_msgTypes = make([]protoimpl.MessageInfo, 24)
+var file_biService_proto_msgTypes = make([]protoimpl.MessageInfo, 29)
 var file_biService_proto_goTypes = []interface{}{
-	(*MyDataAssetReq)(nil),    // 0: MyDataAssetReq
-	(*MyDataAssetResp)(nil),   // 1: MyDataAssetResp
-	(*MyDataAsset)(nil),       // 2: MyDataAsset
-	(*AddProjectReq)(nil),     // 3: AddProjectReq
-	(*AddProjectResp)(nil),    // 4: AddProjectResp
-	(*AddProject)(nil),        // 5: AddProject
-	(*GetInfoIdResp)(nil),     // 6: GetInfoIdResp
-	(*DrawClueReq)(nil),       // 7: DrawClueReq
-	(*CallReq)(nil),           // 8: CallReq
-	(*BiResp)(nil),            // 9: BiResp
-	(*BiReply)(nil),           // 10: BiReply
-	(*DistributeClueReq)(nil), // 11: DistributeClueReq
-	(*DistributeDatas)(nil),   // 12: DistributeDatas
-	(*ClueImportReq)(nil),     // 13: ClueImportReq
-	(*ClueImportResp)(nil),    // 14: ClueImportResp
-	(*ClueImport)(nil),        // 15: ClueImport
-	(*ClueAddReq)(nil),        // 16: ClueAddReq
-	(*SqlManageReq)(nil),      // 17: SqlManageReq
-	(*MyInfoReq)(nil),         // 18: MyInfoReq
-	(*Param)(nil),             // 19: Param
-	(*ExportReq)(nil),         // 20: ExportReq
-	(*OperateReq)(nil),        // 21: OperateReq
-	(*CompanyReq)(nil),        // 22: CompanyReq
-	(*CompanyResp)(nil),       // 23: CompanyResp
+	(*MyDataAssetReq)(nil),         // 0: MyDataAssetReq
+	(*MyDataAssetResp)(nil),        // 1: MyDataAssetResp
+	(*MyDataAsset)(nil),            // 2: MyDataAsset
+	(*AddProjectReq)(nil),          // 3: AddProjectReq
+	(*AddProjectResp)(nil),         // 4: AddProjectResp
+	(*AddProject)(nil),             // 5: AddProject
+	(*GetInfoIdResp)(nil),          // 6: GetInfoIdResp
+	(*DrawClueReq)(nil),            // 7: DrawClueReq
+	(*CallReq)(nil),                // 8: CallReq
+	(*BiResp)(nil),                 // 9: BiResp
+	(*BiReply)(nil),                // 10: BiReply
+	(*DistributeClueReq)(nil),      // 11: DistributeClueReq
+	(*DistributeDatas)(nil),        // 12: DistributeDatas
+	(*ClueImportReq)(nil),          // 13: ClueImportReq
+	(*ClueImportResp)(nil),         // 14: ClueImportResp
+	(*ClueImport)(nil),             // 15: ClueImport
+	(*ClueAddReq)(nil),             // 16: ClueAddReq
+	(*SqlManageReq)(nil),           // 17: SqlManageReq
+	(*MyInfoReq)(nil),              // 18: MyInfoReq
+	(*Param)(nil),                  // 19: Param
+	(*ExportReq)(nil),              // 20: ExportReq
+	(*OperateReq)(nil),             // 21: OperateReq
+	(*CompanyReq)(nil),             // 22: CompanyReq
+	(*CompanyResp)(nil),            // 23: CompanyResp
+	(*DistributeClueShowReq)(nil),  // 24: DistributeClueShowReq
+	(*DistributeClueShows)(nil),    // 25: DistributeClueShows
+	(*DistributeClueShowss)(nil),   // 26: DistributeClueShowss
+	(*DistributeClueShowResp)(nil), // 27: DistributeClueShowResp
+	(*ExportByDbReq)(nil),          // 28: ExportByDbReq
 }
 var file_biService_proto_depIdxs = []int32{
 	2,  // 0: MyDataAssetResp.data:type_name -> MyDataAsset
@@ -1890,43 +2315,51 @@ var file_biService_proto_depIdxs = []int32{
 	12, // 2: DistributeClueReq.datas:type_name -> DistributeDatas
 	15, // 3: ClueImportResp.data:type_name -> ClueImport
 	19, // 4: SqlManageReq.params:type_name -> Param
-	0,  // 5: BiService.myDataAsset:input_type -> MyDataAssetReq
-	3,  // 6: BiService.addProject:input_type -> AddProjectReq
-	3,  // 7: BiService.getInfoId:input_type -> AddProjectReq
-	7,  // 8: BiService.drawClue:input_type -> DrawClueReq
-	8,  // 9: BiService.Call:input_type -> CallReq
-	11, // 10: BiService.distributeClue:input_type -> DistributeClueReq
-	13, // 11: BiService.clueImport:input_type -> ClueImportReq
-	16, // 12: BiService.clueAdd:input_type -> ClueAddReq
-	13, // 13: BiService.clueImportTt:input_type -> ClueImportReq
-	8,  // 14: BiService.autoFollow:input_type -> CallReq
-	17, // 15: BiService.sqlManage:input_type -> SqlManageReq
-	18, // 16: BiService.myInfo:input_type -> MyInfoReq
-	20, // 17: BiService.allInfoExport:input_type -> ExportReq
-	20, // 18: BiService.allProjectExport:input_type -> ExportReq
-	21, // 19: BiService.infoOperate:input_type -> OperateReq
-	22, // 20: BiService.getCompanyType:input_type -> CompanyReq
-	1,  // 21: BiService.myDataAsset:output_type -> MyDataAssetResp
-	4,  // 22: BiService.addProject:output_type -> AddProjectResp
-	6,  // 23: BiService.getInfoId:output_type -> GetInfoIdResp
-	4,  // 24: BiService.drawClue:output_type -> AddProjectResp
-	9,  // 25: BiService.Call:output_type -> BiResp
-	4,  // 26: BiService.distributeClue:output_type -> AddProjectResp
-	14, // 27: BiService.clueImport:output_type -> ClueImportResp
-	4,  // 28: BiService.clueAdd:output_type -> AddProjectResp
-	14, // 29: BiService.clueImportTt:output_type -> ClueImportResp
-	14, // 30: BiService.autoFollow:output_type -> ClueImportResp
-	10, // 31: BiService.sqlManage:output_type -> BiReply
-	10, // 32: BiService.myInfo:output_type -> BiReply
-	10, // 33: BiService.allInfoExport:output_type -> BiReply
-	10, // 34: BiService.allProjectExport:output_type -> BiReply
-	10, // 35: BiService.infoOperate:output_type -> BiReply
-	23, // 36: BiService.getCompanyType:output_type -> CompanyResp
-	21, // [21:37] is the sub-list for method output_type
-	5,  // [5:21] is the sub-list for method input_type
-	5,  // [5:5] is the sub-list for extension type_name
-	5,  // [5:5] is the sub-list for extension extendee
-	0,  // [0:5] is the sub-list for field type_name
+	25, // 5: DistributeClueShowReq.datas:type_name -> DistributeClueShows
+	26, // 6: DistributeClueShowResp.data:type_name -> DistributeClueShowss
+	0,  // 7: BiService.myDataAsset:input_type -> MyDataAssetReq
+	3,  // 8: BiService.addProject:input_type -> AddProjectReq
+	3,  // 9: BiService.getInfoId:input_type -> AddProjectReq
+	7,  // 10: BiService.drawClue:input_type -> DrawClueReq
+	8,  // 11: BiService.Call:input_type -> CallReq
+	11, // 12: BiService.distributeClue:input_type -> DistributeClueReq
+	13, // 13: BiService.clueImport:input_type -> ClueImportReq
+	16, // 14: BiService.clueAdd:input_type -> ClueAddReq
+	13, // 15: BiService.clueImportTt:input_type -> ClueImportReq
+	8,  // 16: BiService.autoFollow:input_type -> CallReq
+	17, // 17: BiService.sqlManage:input_type -> SqlManageReq
+	18, // 18: BiService.myInfo:input_type -> MyInfoReq
+	20, // 19: BiService.allInfoExport:input_type -> ExportReq
+	20, // 20: BiService.allProjectExport:input_type -> ExportReq
+	21, // 21: BiService.infoOperate:input_type -> OperateReq
+	22, // 22: BiService.getCompanyType:input_type -> CompanyReq
+	24, // 23: BiService.distributeClueShow:input_type -> DistributeClueShowReq
+	28, // 24: BiService.exportDataByDb:input_type -> ExportByDbReq
+	28, // 25: BiService.sendMail:input_type -> ExportByDbReq
+	1,  // 26: BiService.myDataAsset:output_type -> MyDataAssetResp
+	4,  // 27: BiService.addProject:output_type -> AddProjectResp
+	6,  // 28: BiService.getInfoId:output_type -> GetInfoIdResp
+	4,  // 29: BiService.drawClue:output_type -> AddProjectResp
+	9,  // 30: BiService.Call:output_type -> BiResp
+	4,  // 31: BiService.distributeClue:output_type -> AddProjectResp
+	14, // 32: BiService.clueImport:output_type -> ClueImportResp
+	4,  // 33: BiService.clueAdd:output_type -> AddProjectResp
+	14, // 34: BiService.clueImportTt:output_type -> ClueImportResp
+	14, // 35: BiService.autoFollow:output_type -> ClueImportResp
+	10, // 36: BiService.sqlManage:output_type -> BiReply
+	10, // 37: BiService.myInfo:output_type -> BiReply
+	10, // 38: BiService.allInfoExport:output_type -> BiReply
+	10, // 39: BiService.allProjectExport:output_type -> BiReply
+	10, // 40: BiService.infoOperate:output_type -> BiReply
+	23, // 41: BiService.getCompanyType:output_type -> CompanyResp
+	27, // 42: BiService.distributeClueShow:output_type -> DistributeClueShowResp
+	10, // 43: BiService.exportDataByDb:output_type -> BiReply
+	10, // 44: BiService.sendMail:output_type -> BiReply
+	26, // [26:45] is the sub-list for method output_type
+	7,  // [7:26] is the sub-list for method input_type
+	7,  // [7:7] is the sub-list for extension type_name
+	7,  // [7:7] is the sub-list for extension extendee
+	0,  // [0:7] is the sub-list for field type_name
 }
 
 func init() { file_biService_proto_init() }
@@ -2223,6 +2656,66 @@ func file_biService_proto_init() {
 				return nil
 			}
 		}
+		file_biService_proto_msgTypes[24].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*DistributeClueShowReq); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_biService_proto_msgTypes[25].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*DistributeClueShows); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_biService_proto_msgTypes[26].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*DistributeClueShowss); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_biService_proto_msgTypes[27].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*DistributeClueShowResp); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_biService_proto_msgTypes[28].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*ExportByDbReq); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
 	}
 	type x struct{}
 	out := protoimpl.TypeBuilder{
@@ -2230,7 +2723,7 @@ func file_biService_proto_init() {
 			GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
 			RawDescriptor: file_biService_proto_rawDesc,
 			NumEnums:      0,
-			NumMessages:   24,
+			NumMessages:   29,
 			NumExtensions: 0,
 			NumServices:   1,
 		},

+ 164 - 34
rpc/pb/biService_grpc.pb.go

@@ -1,7 +1,7 @@
 // Code generated by protoc-gen-go-grpc. DO NOT EDIT.
 // versions:
-// - protoc-gen-go-grpc v1.2.0
-// - protoc             v3.19.4
+// - protoc-gen-go-grpc v1.3.0
+// - protoc             v4.25.2
 // source: biService.proto
 
 package pb
@@ -18,6 +18,28 @@ import (
 // Requires gRPC-Go v1.32.0 or later.
 const _ = grpc.SupportPackageIsVersion7
 
+const (
+	BiService_MyDataAsset_FullMethodName        = "/BiService/myDataAsset"
+	BiService_AddProject_FullMethodName         = "/BiService/addProject"
+	BiService_GetInfoId_FullMethodName          = "/BiService/getInfoId"
+	BiService_DrawClue_FullMethodName           = "/BiService/drawClue"
+	BiService_Call_FullMethodName               = "/BiService/Call"
+	BiService_DistributeClue_FullMethodName     = "/BiService/distributeClue"
+	BiService_ClueImport_FullMethodName         = "/BiService/clueImport"
+	BiService_ClueAdd_FullMethodName            = "/BiService/clueAdd"
+	BiService_ClueImportTt_FullMethodName       = "/BiService/clueImportTt"
+	BiService_AutoFollow_FullMethodName         = "/BiService/autoFollow"
+	BiService_SqlManage_FullMethodName          = "/BiService/sqlManage"
+	BiService_MyInfo_FullMethodName             = "/BiService/myInfo"
+	BiService_AllInfoExport_FullMethodName      = "/BiService/allInfoExport"
+	BiService_AllProjectExport_FullMethodName   = "/BiService/allProjectExport"
+	BiService_InfoOperate_FullMethodName        = "/BiService/infoOperate"
+	BiService_GetCompanyType_FullMethodName     = "/BiService/getCompanyType"
+	BiService_DistributeClueShow_FullMethodName = "/BiService/distributeClueShow"
+	BiService_ExportDataByDb_FullMethodName     = "/BiService/exportDataByDb"
+	BiService_SendMail_FullMethodName           = "/BiService/sendMail"
+)
+
 // BiServiceClient is the client API for BiService service.
 //
 // For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream.
@@ -38,6 +60,9 @@ type BiServiceClient interface {
 	AllProjectExport(ctx context.Context, in *ExportReq, opts ...grpc.CallOption) (*BiReply, error)
 	InfoOperate(ctx context.Context, in *OperateReq, opts ...grpc.CallOption) (*BiReply, error)
 	GetCompanyType(ctx context.Context, in *CompanyReq, opts ...grpc.CallOption) (*CompanyResp, error)
+	DistributeClueShow(ctx context.Context, in *DistributeClueShowReq, opts ...grpc.CallOption) (*DistributeClueShowResp, error)
+	ExportDataByDb(ctx context.Context, in *ExportByDbReq, opts ...grpc.CallOption) (*BiReply, error)
+	SendMail(ctx context.Context, in *ExportByDbReq, opts ...grpc.CallOption) (*BiReply, error)
 }
 
 type biServiceClient struct {
@@ -50,7 +75,7 @@ func NewBiServiceClient(cc grpc.ClientConnInterface) BiServiceClient {
 
 func (c *biServiceClient) MyDataAsset(ctx context.Context, in *MyDataAssetReq, opts ...grpc.CallOption) (*MyDataAssetResp, error) {
 	out := new(MyDataAssetResp)
-	err := c.cc.Invoke(ctx, "/BiService/myDataAsset", in, out, opts...)
+	err := c.cc.Invoke(ctx, BiService_MyDataAsset_FullMethodName, in, out, opts...)
 	if err != nil {
 		return nil, err
 	}
@@ -59,7 +84,7 @@ func (c *biServiceClient) MyDataAsset(ctx context.Context, in *MyDataAssetReq, o
 
 func (c *biServiceClient) AddProject(ctx context.Context, in *AddProjectReq, opts ...grpc.CallOption) (*AddProjectResp, error) {
 	out := new(AddProjectResp)
-	err := c.cc.Invoke(ctx, "/BiService/addProject", in, out, opts...)
+	err := c.cc.Invoke(ctx, BiService_AddProject_FullMethodName, in, out, opts...)
 	if err != nil {
 		return nil, err
 	}
@@ -68,7 +93,7 @@ func (c *biServiceClient) AddProject(ctx context.Context, in *AddProjectReq, opt
 
 func (c *biServiceClient) GetInfoId(ctx context.Context, in *AddProjectReq, opts ...grpc.CallOption) (*GetInfoIdResp, error) {
 	out := new(GetInfoIdResp)
-	err := c.cc.Invoke(ctx, "/BiService/getInfoId", in, out, opts...)
+	err := c.cc.Invoke(ctx, BiService_GetInfoId_FullMethodName, in, out, opts...)
 	if err != nil {
 		return nil, err
 	}
@@ -77,7 +102,7 @@ func (c *biServiceClient) GetInfoId(ctx context.Context, in *AddProjectReq, opts
 
 func (c *biServiceClient) DrawClue(ctx context.Context, in *DrawClueReq, opts ...grpc.CallOption) (*AddProjectResp, error) {
 	out := new(AddProjectResp)
-	err := c.cc.Invoke(ctx, "/BiService/drawClue", in, out, opts...)
+	err := c.cc.Invoke(ctx, BiService_DrawClue_FullMethodName, in, out, opts...)
 	if err != nil {
 		return nil, err
 	}
@@ -86,7 +111,7 @@ func (c *biServiceClient) DrawClue(ctx context.Context, in *DrawClueReq, opts ..
 
 func (c *biServiceClient) Call(ctx context.Context, in *CallReq, opts ...grpc.CallOption) (*BiResp, error) {
 	out := new(BiResp)
-	err := c.cc.Invoke(ctx, "/BiService/Call", in, out, opts...)
+	err := c.cc.Invoke(ctx, BiService_Call_FullMethodName, in, out, opts...)
 	if err != nil {
 		return nil, err
 	}
@@ -95,7 +120,7 @@ func (c *biServiceClient) Call(ctx context.Context, in *CallReq, opts ...grpc.Ca
 
 func (c *biServiceClient) DistributeClue(ctx context.Context, in *DistributeClueReq, opts ...grpc.CallOption) (*AddProjectResp, error) {
 	out := new(AddProjectResp)
-	err := c.cc.Invoke(ctx, "/BiService/distributeClue", in, out, opts...)
+	err := c.cc.Invoke(ctx, BiService_DistributeClue_FullMethodName, in, out, opts...)
 	if err != nil {
 		return nil, err
 	}
@@ -104,7 +129,7 @@ func (c *biServiceClient) DistributeClue(ctx context.Context, in *DistributeClue
 
 func (c *biServiceClient) ClueImport(ctx context.Context, in *ClueImportReq, opts ...grpc.CallOption) (*ClueImportResp, error) {
 	out := new(ClueImportResp)
-	err := c.cc.Invoke(ctx, "/BiService/clueImport", in, out, opts...)
+	err := c.cc.Invoke(ctx, BiService_ClueImport_FullMethodName, in, out, opts...)
 	if err != nil {
 		return nil, err
 	}
@@ -113,7 +138,7 @@ func (c *biServiceClient) ClueImport(ctx context.Context, in *ClueImportReq, opt
 
 func (c *biServiceClient) ClueAdd(ctx context.Context, in *ClueAddReq, opts ...grpc.CallOption) (*AddProjectResp, error) {
 	out := new(AddProjectResp)
-	err := c.cc.Invoke(ctx, "/BiService/clueAdd", in, out, opts...)
+	err := c.cc.Invoke(ctx, BiService_ClueAdd_FullMethodName, in, out, opts...)
 	if err != nil {
 		return nil, err
 	}
@@ -122,7 +147,7 @@ func (c *biServiceClient) ClueAdd(ctx context.Context, in *ClueAddReq, opts ...g
 
 func (c *biServiceClient) ClueImportTt(ctx context.Context, in *ClueImportReq, opts ...grpc.CallOption) (*ClueImportResp, error) {
 	out := new(ClueImportResp)
-	err := c.cc.Invoke(ctx, "/BiService/clueImportTt", in, out, opts...)
+	err := c.cc.Invoke(ctx, BiService_ClueImportTt_FullMethodName, in, out, opts...)
 	if err != nil {
 		return nil, err
 	}
@@ -131,7 +156,7 @@ func (c *biServiceClient) ClueImportTt(ctx context.Context, in *ClueImportReq, o
 
 func (c *biServiceClient) AutoFollow(ctx context.Context, in *CallReq, opts ...grpc.CallOption) (*ClueImportResp, error) {
 	out := new(ClueImportResp)
-	err := c.cc.Invoke(ctx, "/BiService/autoFollow", in, out, opts...)
+	err := c.cc.Invoke(ctx, BiService_AutoFollow_FullMethodName, in, out, opts...)
 	if err != nil {
 		return nil, err
 	}
@@ -140,7 +165,7 @@ func (c *biServiceClient) AutoFollow(ctx context.Context, in *CallReq, opts ...g
 
 func (c *biServiceClient) SqlManage(ctx context.Context, in *SqlManageReq, opts ...grpc.CallOption) (*BiReply, error) {
 	out := new(BiReply)
-	err := c.cc.Invoke(ctx, "/BiService/sqlManage", in, out, opts...)
+	err := c.cc.Invoke(ctx, BiService_SqlManage_FullMethodName, in, out, opts...)
 	if err != nil {
 		return nil, err
 	}
@@ -149,7 +174,7 @@ func (c *biServiceClient) SqlManage(ctx context.Context, in *SqlManageReq, opts
 
 func (c *biServiceClient) MyInfo(ctx context.Context, in *MyInfoReq, opts ...grpc.CallOption) (*BiReply, error) {
 	out := new(BiReply)
-	err := c.cc.Invoke(ctx, "/BiService/myInfo", in, out, opts...)
+	err := c.cc.Invoke(ctx, BiService_MyInfo_FullMethodName, in, out, opts...)
 	if err != nil {
 		return nil, err
 	}
@@ -158,7 +183,7 @@ func (c *biServiceClient) MyInfo(ctx context.Context, in *MyInfoReq, opts ...grp
 
 func (c *biServiceClient) AllInfoExport(ctx context.Context, in *ExportReq, opts ...grpc.CallOption) (*BiReply, error) {
 	out := new(BiReply)
-	err := c.cc.Invoke(ctx, "/BiService/allInfoExport", in, out, opts...)
+	err := c.cc.Invoke(ctx, BiService_AllInfoExport_FullMethodName, in, out, opts...)
 	if err != nil {
 		return nil, err
 	}
@@ -167,7 +192,7 @@ func (c *biServiceClient) AllInfoExport(ctx context.Context, in *ExportReq, opts
 
 func (c *biServiceClient) AllProjectExport(ctx context.Context, in *ExportReq, opts ...grpc.CallOption) (*BiReply, error) {
 	out := new(BiReply)
-	err := c.cc.Invoke(ctx, "/BiService/allProjectExport", in, out, opts...)
+	err := c.cc.Invoke(ctx, BiService_AllProjectExport_FullMethodName, in, out, opts...)
 	if err != nil {
 		return nil, err
 	}
@@ -176,7 +201,7 @@ func (c *biServiceClient) AllProjectExport(ctx context.Context, in *ExportReq, o
 
 func (c *biServiceClient) InfoOperate(ctx context.Context, in *OperateReq, opts ...grpc.CallOption) (*BiReply, error) {
 	out := new(BiReply)
-	err := c.cc.Invoke(ctx, "/BiService/infoOperate", in, out, opts...)
+	err := c.cc.Invoke(ctx, BiService_InfoOperate_FullMethodName, in, out, opts...)
 	if err != nil {
 		return nil, err
 	}
@@ -185,7 +210,34 @@ func (c *biServiceClient) InfoOperate(ctx context.Context, in *OperateReq, opts
 
 func (c *biServiceClient) GetCompanyType(ctx context.Context, in *CompanyReq, opts ...grpc.CallOption) (*CompanyResp, error) {
 	out := new(CompanyResp)
-	err := c.cc.Invoke(ctx, "/BiService/getCompanyType", in, out, opts...)
+	err := c.cc.Invoke(ctx, BiService_GetCompanyType_FullMethodName, in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *biServiceClient) DistributeClueShow(ctx context.Context, in *DistributeClueShowReq, opts ...grpc.CallOption) (*DistributeClueShowResp, error) {
+	out := new(DistributeClueShowResp)
+	err := c.cc.Invoke(ctx, BiService_DistributeClueShow_FullMethodName, in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *biServiceClient) ExportDataByDb(ctx context.Context, in *ExportByDbReq, opts ...grpc.CallOption) (*BiReply, error) {
+	out := new(BiReply)
+	err := c.cc.Invoke(ctx, BiService_ExportDataByDb_FullMethodName, in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *biServiceClient) SendMail(ctx context.Context, in *ExportByDbReq, opts ...grpc.CallOption) (*BiReply, error) {
+	out := new(BiReply)
+	err := c.cc.Invoke(ctx, BiService_SendMail_FullMethodName, in, out, opts...)
 	if err != nil {
 		return nil, err
 	}
@@ -212,6 +264,9 @@ type BiServiceServer interface {
 	AllProjectExport(context.Context, *ExportReq) (*BiReply, error)
 	InfoOperate(context.Context, *OperateReq) (*BiReply, error)
 	GetCompanyType(context.Context, *CompanyReq) (*CompanyResp, error)
+	DistributeClueShow(context.Context, *DistributeClueShowReq) (*DistributeClueShowResp, error)
+	ExportDataByDb(context.Context, *ExportByDbReq) (*BiReply, error)
+	SendMail(context.Context, *ExportByDbReq) (*BiReply, error)
 	mustEmbedUnimplementedBiServiceServer()
 }
 
@@ -267,6 +322,15 @@ func (UnimplementedBiServiceServer) InfoOperate(context.Context, *OperateReq) (*
 func (UnimplementedBiServiceServer) GetCompanyType(context.Context, *CompanyReq) (*CompanyResp, error) {
 	return nil, status.Errorf(codes.Unimplemented, "method GetCompanyType not implemented")
 }
+func (UnimplementedBiServiceServer) DistributeClueShow(context.Context, *DistributeClueShowReq) (*DistributeClueShowResp, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method DistributeClueShow not implemented")
+}
+func (UnimplementedBiServiceServer) ExportDataByDb(context.Context, *ExportByDbReq) (*BiReply, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method ExportDataByDb not implemented")
+}
+func (UnimplementedBiServiceServer) SendMail(context.Context, *ExportByDbReq) (*BiReply, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method SendMail not implemented")
+}
 func (UnimplementedBiServiceServer) mustEmbedUnimplementedBiServiceServer() {}
 
 // UnsafeBiServiceServer may be embedded to opt out of forward compatibility for this service.
@@ -290,7 +354,7 @@ func _BiService_MyDataAsset_Handler(srv interface{}, ctx context.Context, dec fu
 	}
 	info := &grpc.UnaryServerInfo{
 		Server:     srv,
-		FullMethod: "/BiService/myDataAsset",
+		FullMethod: BiService_MyDataAsset_FullMethodName,
 	}
 	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
 		return srv.(BiServiceServer).MyDataAsset(ctx, req.(*MyDataAssetReq))
@@ -308,7 +372,7 @@ func _BiService_AddProject_Handler(srv interface{}, ctx context.Context, dec fun
 	}
 	info := &grpc.UnaryServerInfo{
 		Server:     srv,
-		FullMethod: "/BiService/addProject",
+		FullMethod: BiService_AddProject_FullMethodName,
 	}
 	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
 		return srv.(BiServiceServer).AddProject(ctx, req.(*AddProjectReq))
@@ -326,7 +390,7 @@ func _BiService_GetInfoId_Handler(srv interface{}, ctx context.Context, dec func
 	}
 	info := &grpc.UnaryServerInfo{
 		Server:     srv,
-		FullMethod: "/BiService/getInfoId",
+		FullMethod: BiService_GetInfoId_FullMethodName,
 	}
 	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
 		return srv.(BiServiceServer).GetInfoId(ctx, req.(*AddProjectReq))
@@ -344,7 +408,7 @@ func _BiService_DrawClue_Handler(srv interface{}, ctx context.Context, dec func(
 	}
 	info := &grpc.UnaryServerInfo{
 		Server:     srv,
-		FullMethod: "/BiService/drawClue",
+		FullMethod: BiService_DrawClue_FullMethodName,
 	}
 	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
 		return srv.(BiServiceServer).DrawClue(ctx, req.(*DrawClueReq))
@@ -362,7 +426,7 @@ func _BiService_Call_Handler(srv interface{}, ctx context.Context, dec func(inte
 	}
 	info := &grpc.UnaryServerInfo{
 		Server:     srv,
-		FullMethod: "/BiService/Call",
+		FullMethod: BiService_Call_FullMethodName,
 	}
 	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
 		return srv.(BiServiceServer).Call(ctx, req.(*CallReq))
@@ -380,7 +444,7 @@ func _BiService_DistributeClue_Handler(srv interface{}, ctx context.Context, dec
 	}
 	info := &grpc.UnaryServerInfo{
 		Server:     srv,
-		FullMethod: "/BiService/distributeClue",
+		FullMethod: BiService_DistributeClue_FullMethodName,
 	}
 	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
 		return srv.(BiServiceServer).DistributeClue(ctx, req.(*DistributeClueReq))
@@ -398,7 +462,7 @@ func _BiService_ClueImport_Handler(srv interface{}, ctx context.Context, dec fun
 	}
 	info := &grpc.UnaryServerInfo{
 		Server:     srv,
-		FullMethod: "/BiService/clueImport",
+		FullMethod: BiService_ClueImport_FullMethodName,
 	}
 	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
 		return srv.(BiServiceServer).ClueImport(ctx, req.(*ClueImportReq))
@@ -416,7 +480,7 @@ func _BiService_ClueAdd_Handler(srv interface{}, ctx context.Context, dec func(i
 	}
 	info := &grpc.UnaryServerInfo{
 		Server:     srv,
-		FullMethod: "/BiService/clueAdd",
+		FullMethod: BiService_ClueAdd_FullMethodName,
 	}
 	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
 		return srv.(BiServiceServer).ClueAdd(ctx, req.(*ClueAddReq))
@@ -434,7 +498,7 @@ func _BiService_ClueImportTt_Handler(srv interface{}, ctx context.Context, dec f
 	}
 	info := &grpc.UnaryServerInfo{
 		Server:     srv,
-		FullMethod: "/BiService/clueImportTt",
+		FullMethod: BiService_ClueImportTt_FullMethodName,
 	}
 	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
 		return srv.(BiServiceServer).ClueImportTt(ctx, req.(*ClueImportReq))
@@ -452,7 +516,7 @@ func _BiService_AutoFollow_Handler(srv interface{}, ctx context.Context, dec fun
 	}
 	info := &grpc.UnaryServerInfo{
 		Server:     srv,
-		FullMethod: "/BiService/autoFollow",
+		FullMethod: BiService_AutoFollow_FullMethodName,
 	}
 	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
 		return srv.(BiServiceServer).AutoFollow(ctx, req.(*CallReq))
@@ -470,7 +534,7 @@ func _BiService_SqlManage_Handler(srv interface{}, ctx context.Context, dec func
 	}
 	info := &grpc.UnaryServerInfo{
 		Server:     srv,
-		FullMethod: "/BiService/sqlManage",
+		FullMethod: BiService_SqlManage_FullMethodName,
 	}
 	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
 		return srv.(BiServiceServer).SqlManage(ctx, req.(*SqlManageReq))
@@ -488,7 +552,7 @@ func _BiService_MyInfo_Handler(srv interface{}, ctx context.Context, dec func(in
 	}
 	info := &grpc.UnaryServerInfo{
 		Server:     srv,
-		FullMethod: "/BiService/myInfo",
+		FullMethod: BiService_MyInfo_FullMethodName,
 	}
 	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
 		return srv.(BiServiceServer).MyInfo(ctx, req.(*MyInfoReq))
@@ -506,7 +570,7 @@ func _BiService_AllInfoExport_Handler(srv interface{}, ctx context.Context, dec
 	}
 	info := &grpc.UnaryServerInfo{
 		Server:     srv,
-		FullMethod: "/BiService/allInfoExport",
+		FullMethod: BiService_AllInfoExport_FullMethodName,
 	}
 	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
 		return srv.(BiServiceServer).AllInfoExport(ctx, req.(*ExportReq))
@@ -524,7 +588,7 @@ func _BiService_AllProjectExport_Handler(srv interface{}, ctx context.Context, d
 	}
 	info := &grpc.UnaryServerInfo{
 		Server:     srv,
-		FullMethod: "/BiService/allProjectExport",
+		FullMethod: BiService_AllProjectExport_FullMethodName,
 	}
 	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
 		return srv.(BiServiceServer).AllProjectExport(ctx, req.(*ExportReq))
@@ -542,7 +606,7 @@ func _BiService_InfoOperate_Handler(srv interface{}, ctx context.Context, dec fu
 	}
 	info := &grpc.UnaryServerInfo{
 		Server:     srv,
-		FullMethod: "/BiService/infoOperate",
+		FullMethod: BiService_InfoOperate_FullMethodName,
 	}
 	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
 		return srv.(BiServiceServer).InfoOperate(ctx, req.(*OperateReq))
@@ -560,7 +624,7 @@ func _BiService_GetCompanyType_Handler(srv interface{}, ctx context.Context, dec
 	}
 	info := &grpc.UnaryServerInfo{
 		Server:     srv,
-		FullMethod: "/BiService/getCompanyType",
+		FullMethod: BiService_GetCompanyType_FullMethodName,
 	}
 	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
 		return srv.(BiServiceServer).GetCompanyType(ctx, req.(*CompanyReq))
@@ -568,6 +632,60 @@ func _BiService_GetCompanyType_Handler(srv interface{}, ctx context.Context, dec
 	return interceptor(ctx, in, info, handler)
 }
 
+func _BiService_DistributeClueShow_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(DistributeClueShowReq)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(BiServiceServer).DistributeClueShow(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: BiService_DistributeClueShow_FullMethodName,
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(BiServiceServer).DistributeClueShow(ctx, req.(*DistributeClueShowReq))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _BiService_ExportDataByDb_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(ExportByDbReq)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(BiServiceServer).ExportDataByDb(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: BiService_ExportDataByDb_FullMethodName,
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(BiServiceServer).ExportDataByDb(ctx, req.(*ExportByDbReq))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _BiService_SendMail_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(ExportByDbReq)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(BiServiceServer).SendMail(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: BiService_SendMail_FullMethodName,
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(BiServiceServer).SendMail(ctx, req.(*ExportByDbReq))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
 // BiService_ServiceDesc is the grpc.ServiceDesc for BiService service.
 // It's only intended for direct use with grpc.RegisterService,
 // and not to be introspected or modified (even as a copy)
@@ -639,6 +757,18 @@ var BiService_ServiceDesc = grpc.ServiceDesc{
 			MethodName: "getCompanyType",
 			Handler:    _BiService_GetCompanyType_Handler,
 		},
+		{
+			MethodName: "distributeClueShow",
+			Handler:    _BiService_DistributeClueShow_Handler,
+		},
+		{
+			MethodName: "exportDataByDb",
+			Handler:    _BiService_ExportDataByDb_Handler,
+		},
+		{
+			MethodName: "sendMail",
+			Handler:    _BiService_SendMail_Handler,
+		},
 	},
 	Streams:  []grpc.StreamDesc{},
 	Metadata: "biService.proto",

+ 2220 - 0
rpc/types/pb/biService.pb.go

@@ -0,0 +1,2220 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// versions:
+// 	protoc-gen-go v1.32.0
+// 	protoc        v4.25.2
+// source: biService.proto
+
+package pb
+
+import (
+	protoreflect "google.golang.org/protobuf/reflect/protoreflect"
+	protoimpl "google.golang.org/protobuf/runtime/protoimpl"
+	reflect "reflect"
+	sync "sync"
+)
+
+const (
+	// Verify that this generated code is sufficiently up-to-date.
+	_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)
+	// Verify that runtime/protoimpl is sufficiently up-to-date.
+	_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)
+)
+
+type MyDataAssetReq struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	UserId    string `protobuf:"bytes,1,opt,name=userId,proto3" json:"userId,omitempty"`
+	NewUserId int64  `protobuf:"varint,2,opt,name=newUserId,proto3" json:"newUserId,omitempty"`
+	EntUserId int64  `protobuf:"varint,3,opt,name=entUserId,proto3" json:"entUserId,omitempty"`
+}
+
+func (x *MyDataAssetReq) Reset() {
+	*x = MyDataAssetReq{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_biService_proto_msgTypes[0]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *MyDataAssetReq) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*MyDataAssetReq) ProtoMessage() {}
+
+func (x *MyDataAssetReq) ProtoReflect() protoreflect.Message {
+	mi := &file_biService_proto_msgTypes[0]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use MyDataAssetReq.ProtoReflect.Descriptor instead.
+func (*MyDataAssetReq) Descriptor() ([]byte, []int) {
+	return file_biService_proto_rawDescGZIP(), []int{0}
+}
+
+func (x *MyDataAssetReq) GetUserId() string {
+	if x != nil {
+		return x.UserId
+	}
+	return ""
+}
+
+func (x *MyDataAssetReq) GetNewUserId() int64 {
+	if x != nil {
+		return x.NewUserId
+	}
+	return 0
+}
+
+func (x *MyDataAssetReq) GetEntUserId() int64 {
+	if x != nil {
+		return x.EntUserId
+	}
+	return 0
+}
+
+type MyDataAssetResp struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	ErrorCode int64        `protobuf:"varint,1,opt,name=error_code,json=errorCode,proto3" json:"error_code,omitempty"`
+	ErrorMsg  string       `protobuf:"bytes,2,opt,name=error_msg,json=errorMsg,proto3" json:"error_msg,omitempty"`
+	Data      *MyDataAsset `protobuf:"bytes,3,opt,name=data,proto3" json:"data,omitempty"`
+}
+
+func (x *MyDataAssetResp) Reset() {
+	*x = MyDataAssetResp{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_biService_proto_msgTypes[1]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *MyDataAssetResp) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*MyDataAssetResp) ProtoMessage() {}
+
+func (x *MyDataAssetResp) ProtoReflect() protoreflect.Message {
+	mi := &file_biService_proto_msgTypes[1]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use MyDataAssetResp.ProtoReflect.Descriptor instead.
+func (*MyDataAssetResp) Descriptor() ([]byte, []int) {
+	return file_biService_proto_rawDescGZIP(), []int{1}
+}
+
+func (x *MyDataAssetResp) GetErrorCode() int64 {
+	if x != nil {
+		return x.ErrorCode
+	}
+	return 0
+}
+
+func (x *MyDataAssetResp) GetErrorMsg() string {
+	if x != nil {
+		return x.ErrorMsg
+	}
+	return ""
+}
+
+func (x *MyDataAssetResp) GetData() *MyDataAsset {
+	if x != nil {
+		return x.Data
+	}
+	return nil
+}
+
+type MyDataAsset struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	CollectInfoCount   int64 `protobuf:"varint,1,opt,name=collect_info_count,json=collectInfoCount,proto3" json:"collect_info_count,omitempty"`
+	FollowProjectCount int64 `protobuf:"varint,2,opt,name=follow_project_count,json=followProjectCount,proto3" json:"follow_project_count,omitempty"`
+	CollectDocCount    int64 `protobuf:"varint,3,opt,name=collect_doc_count,json=collectDocCount,proto3" json:"collect_doc_count,omitempty"`
+	ClaimCustomerCount int64 `protobuf:"varint,4,opt,name=claim_customer_count,json=claimCustomerCount,proto3" json:"claim_customer_count,omitempty"`
+	ClaimNzjCount      int64 `protobuf:"varint,5,opt,name=claim_nzj_count,json=claimNzjCount,proto3" json:"claim_nzj_count,omitempty"`
+}
+
+func (x *MyDataAsset) Reset() {
+	*x = MyDataAsset{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_biService_proto_msgTypes[2]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *MyDataAsset) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*MyDataAsset) ProtoMessage() {}
+
+func (x *MyDataAsset) ProtoReflect() protoreflect.Message {
+	mi := &file_biService_proto_msgTypes[2]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use MyDataAsset.ProtoReflect.Descriptor instead.
+func (*MyDataAsset) Descriptor() ([]byte, []int) {
+	return file_biService_proto_rawDescGZIP(), []int{2}
+}
+
+func (x *MyDataAsset) GetCollectInfoCount() int64 {
+	if x != nil {
+		return x.CollectInfoCount
+	}
+	return 0
+}
+
+func (x *MyDataAsset) GetFollowProjectCount() int64 {
+	if x != nil {
+		return x.FollowProjectCount
+	}
+	return 0
+}
+
+func (x *MyDataAsset) GetCollectDocCount() int64 {
+	if x != nil {
+		return x.CollectDocCount
+	}
+	return 0
+}
+
+func (x *MyDataAsset) GetClaimCustomerCount() int64 {
+	if x != nil {
+		return x.ClaimCustomerCount
+	}
+	return 0
+}
+
+func (x *MyDataAsset) GetClaimNzjCount() int64 {
+	if x != nil {
+		return x.ClaimNzjCount
+	}
+	return 0
+}
+
+type AddProjectReq struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	InfoId       string `protobuf:"bytes,1,opt,name=info_id,json=infoId,proto3" json:"info_id,omitempty"`                    //信息id
+	Source       int64  `protobuf:"varint,2,opt,name=source,proto3" json:"source,omitempty"`                                 //1-收藏,2-招标搜索,3-关注
+	PositionId   int64  `protobuf:"varint,3,opt,name=position_id,json=positionId,proto3" json:"position_id,omitempty"`       //职位id
+	PositionType int64  `protobuf:"varint,4,opt,name=position_type,json=positionType,proto3" json:"position_type,omitempty"` //职位类型
+	AccountId    int64  `protobuf:"varint,5,opt,name=account_id,json=accountId,proto3" json:"account_id,omitempty"`          //账户id
+	CompanyName  string `protobuf:"bytes,6,opt,name=company_name,json=companyName,proto3" json:"company_name,omitempty"`
+	UserName     string `protobuf:"bytes,7,opt,name=user_name,json=userName,proto3" json:"user_name,omitempty"`
+	UserId       int64  `protobuf:"varint,8,opt,name=userId,proto3" json:"userId,omitempty"`
+	EntId        int64  `protobuf:"varint,9,opt,name=entId,proto3" json:"entId,omitempty"`
+	EntUserName  string `protobuf:"bytes,10,opt,name=entUserName,proto3" json:"entUserName,omitempty"`
+}
+
+func (x *AddProjectReq) Reset() {
+	*x = AddProjectReq{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_biService_proto_msgTypes[3]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *AddProjectReq) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*AddProjectReq) ProtoMessage() {}
+
+func (x *AddProjectReq) ProtoReflect() protoreflect.Message {
+	mi := &file_biService_proto_msgTypes[3]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use AddProjectReq.ProtoReflect.Descriptor instead.
+func (*AddProjectReq) Descriptor() ([]byte, []int) {
+	return file_biService_proto_rawDescGZIP(), []int{3}
+}
+
+func (x *AddProjectReq) GetInfoId() string {
+	if x != nil {
+		return x.InfoId
+	}
+	return ""
+}
+
+func (x *AddProjectReq) GetSource() int64 {
+	if x != nil {
+		return x.Source
+	}
+	return 0
+}
+
+func (x *AddProjectReq) GetPositionId() int64 {
+	if x != nil {
+		return x.PositionId
+	}
+	return 0
+}
+
+func (x *AddProjectReq) GetPositionType() int64 {
+	if x != nil {
+		return x.PositionType
+	}
+	return 0
+}
+
+func (x *AddProjectReq) GetAccountId() int64 {
+	if x != nil {
+		return x.AccountId
+	}
+	return 0
+}
+
+func (x *AddProjectReq) GetCompanyName() string {
+	if x != nil {
+		return x.CompanyName
+	}
+	return ""
+}
+
+func (x *AddProjectReq) GetUserName() string {
+	if x != nil {
+		return x.UserName
+	}
+	return ""
+}
+
+func (x *AddProjectReq) GetUserId() int64 {
+	if x != nil {
+		return x.UserId
+	}
+	return 0
+}
+
+func (x *AddProjectReq) GetEntId() int64 {
+	if x != nil {
+		return x.EntId
+	}
+	return 0
+}
+
+func (x *AddProjectReq) GetEntUserName() string {
+	if x != nil {
+		return x.EntUserName
+	}
+	return ""
+}
+
+type AddProjectResp struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	ErrorCode int64       `protobuf:"varint,1,opt,name=error_code,json=errorCode,proto3" json:"error_code,omitempty"`
+	ErrorMsg  string      `protobuf:"bytes,2,opt,name=error_msg,json=errorMsg,proto3" json:"error_msg,omitempty"`
+	Data      *AddProject `protobuf:"bytes,3,opt,name=data,proto3" json:"data,omitempty"`
+}
+
+func (x *AddProjectResp) Reset() {
+	*x = AddProjectResp{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_biService_proto_msgTypes[4]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *AddProjectResp) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*AddProjectResp) ProtoMessage() {}
+
+func (x *AddProjectResp) ProtoReflect() protoreflect.Message {
+	mi := &file_biService_proto_msgTypes[4]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use AddProjectResp.ProtoReflect.Descriptor instead.
+func (*AddProjectResp) Descriptor() ([]byte, []int) {
+	return file_biService_proto_rawDescGZIP(), []int{4}
+}
+
+func (x *AddProjectResp) GetErrorCode() int64 {
+	if x != nil {
+		return x.ErrorCode
+	}
+	return 0
+}
+
+func (x *AddProjectResp) GetErrorMsg() string {
+	if x != nil {
+		return x.ErrorMsg
+	}
+	return ""
+}
+
+func (x *AddProjectResp) GetData() *AddProject {
+	if x != nil {
+		return x.Data
+	}
+	return nil
+}
+
+type AddProject struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	Status int64 `protobuf:"varint,1,opt,name=status,proto3" json:"status,omitempty"`
+	Count  int64 `protobuf:"varint,2,opt,name=count,proto3" json:"count,omitempty"`
+}
+
+func (x *AddProject) Reset() {
+	*x = AddProject{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_biService_proto_msgTypes[5]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *AddProject) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*AddProject) ProtoMessage() {}
+
+func (x *AddProject) ProtoReflect() protoreflect.Message {
+	mi := &file_biService_proto_msgTypes[5]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use AddProject.ProtoReflect.Descriptor instead.
+func (*AddProject) Descriptor() ([]byte, []int) {
+	return file_biService_proto_rawDescGZIP(), []int{5}
+}
+
+func (x *AddProject) GetStatus() int64 {
+	if x != nil {
+		return x.Status
+	}
+	return 0
+}
+
+func (x *AddProject) GetCount() int64 {
+	if x != nil {
+		return x.Count
+	}
+	return 0
+}
+
+type GetInfoIdResp struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	ErrorCode int64    `protobuf:"varint,1,opt,name=error_code,json=errorCode,proto3" json:"error_code,omitempty"`
+	ErrorMsg  string   `protobuf:"bytes,2,opt,name=error_msg,json=errorMsg,proto3" json:"error_msg,omitempty"`
+	Data      []string `protobuf:"bytes,3,rep,name=data,proto3" json:"data,omitempty"`
+}
+
+func (x *GetInfoIdResp) Reset() {
+	*x = GetInfoIdResp{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_biService_proto_msgTypes[6]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *GetInfoIdResp) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*GetInfoIdResp) ProtoMessage() {}
+
+func (x *GetInfoIdResp) ProtoReflect() protoreflect.Message {
+	mi := &file_biService_proto_msgTypes[6]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use GetInfoIdResp.ProtoReflect.Descriptor instead.
+func (*GetInfoIdResp) Descriptor() ([]byte, []int) {
+	return file_biService_proto_rawDescGZIP(), []int{6}
+}
+
+func (x *GetInfoIdResp) GetErrorCode() int64 {
+	if x != nil {
+		return x.ErrorCode
+	}
+	return 0
+}
+
+func (x *GetInfoIdResp) GetErrorMsg() string {
+	if x != nil {
+		return x.ErrorMsg
+	}
+	return ""
+}
+
+func (x *GetInfoIdResp) GetData() []string {
+	if x != nil {
+		return x.Data
+	}
+	return nil
+}
+
+type DrawClueReq struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	PositionId int64 `protobuf:"varint,1,opt,name=positionId,proto3" json:"positionId,omitempty"`
+	Count      int64 `protobuf:"varint,2,opt,name=count,proto3" json:"count,omitempty"`
+}
+
+func (x *DrawClueReq) Reset() {
+	*x = DrawClueReq{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_biService_proto_msgTypes[7]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *DrawClueReq) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*DrawClueReq) ProtoMessage() {}
+
+func (x *DrawClueReq) ProtoReflect() protoreflect.Message {
+	mi := &file_biService_proto_msgTypes[7]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use DrawClueReq.ProtoReflect.Descriptor instead.
+func (*DrawClueReq) Descriptor() ([]byte, []int) {
+	return file_biService_proto_rawDescGZIP(), []int{7}
+}
+
+func (x *DrawClueReq) GetPositionId() int64 {
+	if x != nil {
+		return x.PositionId
+	}
+	return 0
+}
+
+func (x *DrawClueReq) GetCount() int64 {
+	if x != nil {
+		return x.Count
+	}
+	return 0
+}
+
+type CallReq struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	PositionId int64  `protobuf:"varint,1,opt,name=position_id,json=positionId,proto3" json:"position_id,omitempty"`
+	Phone      string `protobuf:"bytes,2,opt,name=phone,proto3" json:"phone,omitempty"`
+}
+
+func (x *CallReq) Reset() {
+	*x = CallReq{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_biService_proto_msgTypes[8]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *CallReq) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*CallReq) ProtoMessage() {}
+
+func (x *CallReq) ProtoReflect() protoreflect.Message {
+	mi := &file_biService_proto_msgTypes[8]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use CallReq.ProtoReflect.Descriptor instead.
+func (*CallReq) Descriptor() ([]byte, []int) {
+	return file_biService_proto_rawDescGZIP(), []int{8}
+}
+
+func (x *CallReq) GetPositionId() int64 {
+	if x != nil {
+		return x.PositionId
+	}
+	return 0
+}
+
+func (x *CallReq) GetPhone() string {
+	if x != nil {
+		return x.Phone
+	}
+	return ""
+}
+
+type BiResp struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	ErrorCode int64  `protobuf:"varint,1,opt,name=error_code,json=errorCode,proto3" json:"error_code,omitempty"`
+	ErrorMsg  string `protobuf:"bytes,2,opt,name=error_msg,json=errorMsg,proto3" json:"error_msg,omitempty"`
+	Data      string `protobuf:"bytes,3,opt,name=data,proto3" json:"data,omitempty"`
+}
+
+func (x *BiResp) Reset() {
+	*x = BiResp{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_biService_proto_msgTypes[9]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *BiResp) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*BiResp) ProtoMessage() {}
+
+func (x *BiResp) ProtoReflect() protoreflect.Message {
+	mi := &file_biService_proto_msgTypes[9]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use BiResp.ProtoReflect.Descriptor instead.
+func (*BiResp) Descriptor() ([]byte, []int) {
+	return file_biService_proto_rawDescGZIP(), []int{9}
+}
+
+func (x *BiResp) GetErrorCode() int64 {
+	if x != nil {
+		return x.ErrorCode
+	}
+	return 0
+}
+
+func (x *BiResp) GetErrorMsg() string {
+	if x != nil {
+		return x.ErrorMsg
+	}
+	return ""
+}
+
+func (x *BiResp) GetData() string {
+	if x != nil {
+		return x.Data
+	}
+	return ""
+}
+
+type BiReply struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	ErrorCode int64  `protobuf:"varint,1,opt,name=error_code,json=errorCode,proto3" json:"error_code,omitempty"`
+	ErrorMsg  string `protobuf:"bytes,2,opt,name=error_msg,json=errorMsg,proto3" json:"error_msg,omitempty"`
+	Data      []byte `protobuf:"bytes,3,opt,name=data,proto3" json:"data,omitempty"`
+}
+
+func (x *BiReply) Reset() {
+	*x = BiReply{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_biService_proto_msgTypes[10]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *BiReply) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*BiReply) ProtoMessage() {}
+
+func (x *BiReply) ProtoReflect() protoreflect.Message {
+	mi := &file_biService_proto_msgTypes[10]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use BiReply.ProtoReflect.Descriptor instead.
+func (*BiReply) Descriptor() ([]byte, []int) {
+	return file_biService_proto_rawDescGZIP(), []int{10}
+}
+
+func (x *BiReply) GetErrorCode() int64 {
+	if x != nil {
+		return x.ErrorCode
+	}
+	return 0
+}
+
+func (x *BiReply) GetErrorMsg() string {
+	if x != nil {
+		return x.ErrorMsg
+	}
+	return ""
+}
+
+func (x *BiReply) GetData() []byte {
+	if x != nil {
+		return x.Data
+	}
+	return nil
+}
+
+type DistributeClueReq struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	ClueCount  string             `protobuf:"bytes,1,opt,name=clueCount,proto3" json:"clueCount,omitempty"`
+	ClueIdList []int64            `protobuf:"varint,2,rep,packed,name=clueIdList,proto3" json:"clueIdList,omitempty"`
+	Datas      []*DistributeDatas `protobuf:"bytes,3,rep,name=datas,proto3" json:"datas,omitempty"`
+	PositionId int64              `protobuf:"varint,4,opt,name=positionId,proto3" json:"positionId,omitempty"`
+	IsTask     int64              `protobuf:"varint,5,opt,name=isTask,proto3" json:"isTask,omitempty"`
+}
+
+func (x *DistributeClueReq) Reset() {
+	*x = DistributeClueReq{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_biService_proto_msgTypes[11]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *DistributeClueReq) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*DistributeClueReq) ProtoMessage() {}
+
+func (x *DistributeClueReq) ProtoReflect() protoreflect.Message {
+	mi := &file_biService_proto_msgTypes[11]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use DistributeClueReq.ProtoReflect.Descriptor instead.
+func (*DistributeClueReq) Descriptor() ([]byte, []int) {
+	return file_biService_proto_rawDescGZIP(), []int{11}
+}
+
+func (x *DistributeClueReq) GetClueCount() string {
+	if x != nil {
+		return x.ClueCount
+	}
+	return ""
+}
+
+func (x *DistributeClueReq) GetClueIdList() []int64 {
+	if x != nil {
+		return x.ClueIdList
+	}
+	return nil
+}
+
+func (x *DistributeClueReq) GetDatas() []*DistributeDatas {
+	if x != nil {
+		return x.Datas
+	}
+	return nil
+}
+
+func (x *DistributeClueReq) GetPositionId() int64 {
+	if x != nil {
+		return x.PositionId
+	}
+	return 0
+}
+
+func (x *DistributeClueReq) GetIsTask() int64 {
+	if x != nil {
+		return x.IsTask
+	}
+	return 0
+}
+
+type DistributeDatas struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	Name             string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
+	PositionId       int64  `protobuf:"varint,2,opt,name=positionId,proto3" json:"positionId,omitempty"`
+	TotalCount       string `protobuf:"bytes,3,opt,name=totalCount,proto3" json:"totalCount,omitempty"`
+	UncompletedCount string `protobuf:"bytes,4,opt,name=uncompletedCount,proto3" json:"uncompletedCount,omitempty"`
+	DistributedCount int64  `protobuf:"varint,5,opt,name=distributedCount,proto3" json:"distributedCount,omitempty"`
+}
+
+func (x *DistributeDatas) Reset() {
+	*x = DistributeDatas{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_biService_proto_msgTypes[12]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *DistributeDatas) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*DistributeDatas) ProtoMessage() {}
+
+func (x *DistributeDatas) ProtoReflect() protoreflect.Message {
+	mi := &file_biService_proto_msgTypes[12]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use DistributeDatas.ProtoReflect.Descriptor instead.
+func (*DistributeDatas) Descriptor() ([]byte, []int) {
+	return file_biService_proto_rawDescGZIP(), []int{12}
+}
+
+func (x *DistributeDatas) GetName() string {
+	if x != nil {
+		return x.Name
+	}
+	return ""
+}
+
+func (x *DistributeDatas) GetPositionId() int64 {
+	if x != nil {
+		return x.PositionId
+	}
+	return 0
+}
+
+func (x *DistributeDatas) GetTotalCount() string {
+	if x != nil {
+		return x.TotalCount
+	}
+	return ""
+}
+
+func (x *DistributeDatas) GetUncompletedCount() string {
+	if x != nil {
+		return x.UncompletedCount
+	}
+	return ""
+}
+
+func (x *DistributeDatas) GetDistributedCount() int64 {
+	if x != nil {
+		return x.DistributedCount
+	}
+	return 0
+}
+
+type ClueImportReq struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	Pcbh       string `protobuf:"bytes,1,opt,name=pcbh,proto3" json:"pcbh,omitempty"`
+	PositionId int64  `protobuf:"varint,2,opt,name=positionId,proto3" json:"positionId,omitempty"`
+}
+
+func (x *ClueImportReq) Reset() {
+	*x = ClueImportReq{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_biService_proto_msgTypes[13]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *ClueImportReq) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*ClueImportReq) ProtoMessage() {}
+
+func (x *ClueImportReq) ProtoReflect() protoreflect.Message {
+	mi := &file_biService_proto_msgTypes[13]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use ClueImportReq.ProtoReflect.Descriptor instead.
+func (*ClueImportReq) Descriptor() ([]byte, []int) {
+	return file_biService_proto_rawDescGZIP(), []int{13}
+}
+
+func (x *ClueImportReq) GetPcbh() string {
+	if x != nil {
+		return x.Pcbh
+	}
+	return ""
+}
+
+func (x *ClueImportReq) GetPositionId() int64 {
+	if x != nil {
+		return x.PositionId
+	}
+	return 0
+}
+
+type ClueImportResp struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	ErrorCode int64       `protobuf:"varint,1,opt,name=error_code,json=errorCode,proto3" json:"error_code,omitempty"`
+	ErrorMsg  string      `protobuf:"bytes,2,opt,name=error_msg,json=errorMsg,proto3" json:"error_msg,omitempty"`
+	Data      *ClueImport `protobuf:"bytes,3,opt,name=data,proto3" json:"data,omitempty"`
+}
+
+func (x *ClueImportResp) Reset() {
+	*x = ClueImportResp{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_biService_proto_msgTypes[14]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *ClueImportResp) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*ClueImportResp) ProtoMessage() {}
+
+func (x *ClueImportResp) ProtoReflect() protoreflect.Message {
+	mi := &file_biService_proto_msgTypes[14]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use ClueImportResp.ProtoReflect.Descriptor instead.
+func (*ClueImportResp) Descriptor() ([]byte, []int) {
+	return file_biService_proto_rawDescGZIP(), []int{14}
+}
+
+func (x *ClueImportResp) GetErrorCode() int64 {
+	if x != nil {
+		return x.ErrorCode
+	}
+	return 0
+}
+
+func (x *ClueImportResp) GetErrorMsg() string {
+	if x != nil {
+		return x.ErrorMsg
+	}
+	return ""
+}
+
+func (x *ClueImportResp) GetData() *ClueImport {
+	if x != nil {
+		return x.Data
+	}
+	return nil
+}
+
+type ClueImport struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	Status int64  `protobuf:"varint,1,opt,name=status,proto3" json:"status,omitempty"`
+	Result string `protobuf:"bytes,2,opt,name=result,proto3" json:"result,omitempty"`
+}
+
+func (x *ClueImport) Reset() {
+	*x = ClueImport{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_biService_proto_msgTypes[15]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *ClueImport) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*ClueImport) ProtoMessage() {}
+
+func (x *ClueImport) ProtoReflect() protoreflect.Message {
+	mi := &file_biService_proto_msgTypes[15]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use ClueImport.ProtoReflect.Descriptor instead.
+func (*ClueImport) Descriptor() ([]byte, []int) {
+	return file_biService_proto_rawDescGZIP(), []int{15}
+}
+
+func (x *ClueImport) GetStatus() int64 {
+	if x != nil {
+		return x.Status
+	}
+	return 0
+}
+
+func (x *ClueImport) GetResult() string {
+	if x != nil {
+		return x.Result
+	}
+	return ""
+}
+
+type ClueAddReq struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	Phone            string `protobuf:"bytes,1,opt,name=phone,proto3" json:"phone,omitempty"`
+	Username         string `protobuf:"bytes,2,opt,name=username,proto3" json:"username,omitempty"`
+	Source           string `protobuf:"bytes,3,opt,name=source,proto3" json:"source,omitempty"`
+	Status999        string `protobuf:"bytes,4,opt,name=status999,proto3" json:"status999,omitempty"`
+	Owner            string `protobuf:"bytes,5,opt,name=owner,proto3" json:"owner,omitempty"`
+	EmpNo            string `protobuf:"bytes,6,opt,name=empNo,proto3" json:"empNo,omitempty"`
+	Company          string `protobuf:"bytes,7,opt,name=company,proto3" json:"company,omitempty"`
+	IsPolicymaker    string `protobuf:"bytes,8,opt,name=isPolicymaker,proto3" json:"isPolicymaker,omitempty"`
+	BelongToIndustry string `protobuf:"bytes,9,opt,name=belongToIndustry,proto3" json:"belongToIndustry,omitempty"`
+	Job              string `protobuf:"bytes,10,opt,name=job,proto3" json:"job,omitempty"`
+	CustomerNeeds    string `protobuf:"bytes,11,opt,name=customerNeeds,proto3" json:"customerNeeds,omitempty"`
+	BelongTo         string `protobuf:"bytes,12,opt,name=belongTo,proto3" json:"belongTo,omitempty"`
+	WantGoods        string `protobuf:"bytes,13,opt,name=wantGoods,proto3" json:"wantGoods,omitempty"`
+	CustomerBudget   string `protobuf:"bytes,14,opt,name=customerBudget,proto3" json:"customerBudget,omitempty"`
+}
+
+func (x *ClueAddReq) Reset() {
+	*x = ClueAddReq{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_biService_proto_msgTypes[16]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *ClueAddReq) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*ClueAddReq) ProtoMessage() {}
+
+func (x *ClueAddReq) ProtoReflect() protoreflect.Message {
+	mi := &file_biService_proto_msgTypes[16]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use ClueAddReq.ProtoReflect.Descriptor instead.
+func (*ClueAddReq) Descriptor() ([]byte, []int) {
+	return file_biService_proto_rawDescGZIP(), []int{16}
+}
+
+func (x *ClueAddReq) GetPhone() string {
+	if x != nil {
+		return x.Phone
+	}
+	return ""
+}
+
+func (x *ClueAddReq) GetUsername() string {
+	if x != nil {
+		return x.Username
+	}
+	return ""
+}
+
+func (x *ClueAddReq) GetSource() string {
+	if x != nil {
+		return x.Source
+	}
+	return ""
+}
+
+func (x *ClueAddReq) GetStatus999() string {
+	if x != nil {
+		return x.Status999
+	}
+	return ""
+}
+
+func (x *ClueAddReq) GetOwner() string {
+	if x != nil {
+		return x.Owner
+	}
+	return ""
+}
+
+func (x *ClueAddReq) GetEmpNo() string {
+	if x != nil {
+		return x.EmpNo
+	}
+	return ""
+}
+
+func (x *ClueAddReq) GetCompany() string {
+	if x != nil {
+		return x.Company
+	}
+	return ""
+}
+
+func (x *ClueAddReq) GetIsPolicymaker() string {
+	if x != nil {
+		return x.IsPolicymaker
+	}
+	return ""
+}
+
+func (x *ClueAddReq) GetBelongToIndustry() string {
+	if x != nil {
+		return x.BelongToIndustry
+	}
+	return ""
+}
+
+func (x *ClueAddReq) GetJob() string {
+	if x != nil {
+		return x.Job
+	}
+	return ""
+}
+
+func (x *ClueAddReq) GetCustomerNeeds() string {
+	if x != nil {
+		return x.CustomerNeeds
+	}
+	return ""
+}
+
+func (x *ClueAddReq) GetBelongTo() string {
+	if x != nil {
+		return x.BelongTo
+	}
+	return ""
+}
+
+func (x *ClueAddReq) GetWantGoods() string {
+	if x != nil {
+		return x.WantGoods
+	}
+	return ""
+}
+
+func (x *ClueAddReq) GetCustomerBudget() string {
+	if x != nil {
+		return x.CustomerBudget
+	}
+	return ""
+}
+
+type SqlManageReq struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	Id     float32  `protobuf:"fixed32,1,opt,name=id,proto3" json:"id,omitempty"`
+	Params []*Param `protobuf:"bytes,2,rep,name=params,proto3" json:"params,omitempty"`
+}
+
+func (x *SqlManageReq) Reset() {
+	*x = SqlManageReq{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_biService_proto_msgTypes[17]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *SqlManageReq) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*SqlManageReq) ProtoMessage() {}
+
+func (x *SqlManageReq) ProtoReflect() protoreflect.Message {
+	mi := &file_biService_proto_msgTypes[17]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use SqlManageReq.ProtoReflect.Descriptor instead.
+func (*SqlManageReq) Descriptor() ([]byte, []int) {
+	return file_biService_proto_rawDescGZIP(), []int{17}
+}
+
+func (x *SqlManageReq) GetId() float32 {
+	if x != nil {
+		return x.Id
+	}
+	return 0
+}
+
+func (x *SqlManageReq) GetParams() []*Param {
+	if x != nil {
+		return x.Params
+	}
+	return nil
+}
+
+type MyInfoReq struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	Bid string `protobuf:"bytes,1,opt,name=bid,proto3" json:"bid,omitempty"`
+	Sid string `protobuf:"bytes,2,opt,name=sid,proto3" json:"sid,omitempty"`
+}
+
+func (x *MyInfoReq) Reset() {
+	*x = MyInfoReq{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_biService_proto_msgTypes[18]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *MyInfoReq) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*MyInfoReq) ProtoMessage() {}
+
+func (x *MyInfoReq) ProtoReflect() protoreflect.Message {
+	mi := &file_biService_proto_msgTypes[18]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use MyInfoReq.ProtoReflect.Descriptor instead.
+func (*MyInfoReq) Descriptor() ([]byte, []int) {
+	return file_biService_proto_rawDescGZIP(), []int{18}
+}
+
+func (x *MyInfoReq) GetBid() string {
+	if x != nil {
+		return x.Bid
+	}
+	return ""
+}
+
+func (x *MyInfoReq) GetSid() string {
+	if x != nil {
+		return x.Sid
+	}
+	return ""
+}
+
+type Param struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	Value string `protobuf:"bytes,1,opt,name=value,proto3" json:"value,omitempty"`
+	Type  string `protobuf:"bytes,2,opt,name=type,proto3" json:"type,omitempty"`
+}
+
+func (x *Param) Reset() {
+	*x = Param{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_biService_proto_msgTypes[19]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *Param) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*Param) ProtoMessage() {}
+
+func (x *Param) ProtoReflect() protoreflect.Message {
+	mi := &file_biService_proto_msgTypes[19]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use Param.ProtoReflect.Descriptor instead.
+func (*Param) Descriptor() ([]byte, []int) {
+	return file_biService_proto_rawDescGZIP(), []int{19}
+}
+
+func (x *Param) GetValue() string {
+	if x != nil {
+		return x.Value
+	}
+	return ""
+}
+
+func (x *Param) GetType() string {
+	if x != nil {
+		return x.Type
+	}
+	return ""
+}
+
+type ExportReq struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	Mail       string   `protobuf:"bytes,1,opt,name=mail,proto3" json:"mail,omitempty"`
+	Mapping    []string `protobuf:"bytes,2,rep,name=mapping,proto3" json:"mapping,omitempty"`
+	PositionId int64    `protobuf:"varint,3,opt,name=PositionId,proto3" json:"PositionId,omitempty"`
+}
+
+func (x *ExportReq) Reset() {
+	*x = ExportReq{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_biService_proto_msgTypes[20]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *ExportReq) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*ExportReq) ProtoMessage() {}
+
+func (x *ExportReq) ProtoReflect() protoreflect.Message {
+	mi := &file_biService_proto_msgTypes[20]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use ExportReq.ProtoReflect.Descriptor instead.
+func (*ExportReq) Descriptor() ([]byte, []int) {
+	return file_biService_proto_rawDescGZIP(), []int{20}
+}
+
+func (x *ExportReq) GetMail() string {
+	if x != nil {
+		return x.Mail
+	}
+	return ""
+}
+
+func (x *ExportReq) GetMapping() []string {
+	if x != nil {
+		return x.Mapping
+	}
+	return nil
+}
+
+func (x *ExportReq) GetPositionId() int64 {
+	if x != nil {
+		return x.PositionId
+	}
+	return 0
+}
+
+type OperateReq struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	NewId string `protobuf:"bytes,1,opt,name=newId,proto3" json:"newId,omitempty"`
+	Type  int64  `protobuf:"varint,2,opt,name=type,proto3" json:"type,omitempty"`
+}
+
+func (x *OperateReq) Reset() {
+	*x = OperateReq{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_biService_proto_msgTypes[21]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *OperateReq) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*OperateReq) ProtoMessage() {}
+
+func (x *OperateReq) ProtoReflect() protoreflect.Message {
+	mi := &file_biService_proto_msgTypes[21]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use OperateReq.ProtoReflect.Descriptor instead.
+func (*OperateReq) Descriptor() ([]byte, []int) {
+	return file_biService_proto_rawDescGZIP(), []int{21}
+}
+
+func (x *OperateReq) GetNewId() string {
+	if x != nil {
+		return x.NewId
+	}
+	return ""
+}
+
+func (x *OperateReq) GetType() int64 {
+	if x != nil {
+		return x.Type
+	}
+	return 0
+}
+
+type ExportByDbReq struct {
+	state         protoimpl.MessageState
+	sizeCache     protoimpl.SizeCache
+	unknownFields protoimpl.UnknownFields
+
+	Token   string `protobuf:"bytes,1,opt,name=token,proto3" json:"token,omitempty"`
+	Title   string `protobuf:"bytes,2,opt,name=title,proto3" json:"title,omitempty"`
+	Content string `protobuf:"bytes,3,opt,name=content,proto3" json:"content,omitempty"`
+	Mails   string `protobuf:"bytes,4,opt,name=mails,proto3" json:"mails,omitempty"`
+	Query   string `protobuf:"bytes,5,opt,name=query,proto3" json:"query,omitempty"`
+}
+
+func (x *ExportByDbReq) Reset() {
+	*x = ExportByDbReq{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_biService_proto_msgTypes[22]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *ExportByDbReq) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*ExportByDbReq) ProtoMessage() {}
+
+func (x *ExportByDbReq) ProtoReflect() protoreflect.Message {
+	mi := &file_biService_proto_msgTypes[22]
+	if protoimpl.UnsafeEnabled && x != nil {
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		if ms.LoadMessageInfo() == nil {
+			ms.StoreMessageInfo(mi)
+		}
+		return ms
+	}
+	return mi.MessageOf(x)
+}
+
+// Deprecated: Use ExportByDbReq.ProtoReflect.Descriptor instead.
+func (*ExportByDbReq) Descriptor() ([]byte, []int) {
+	return file_biService_proto_rawDescGZIP(), []int{22}
+}
+
+func (x *ExportByDbReq) GetToken() string {
+	if x != nil {
+		return x.Token
+	}
+	return ""
+}
+
+func (x *ExportByDbReq) GetTitle() string {
+	if x != nil {
+		return x.Title
+	}
+	return ""
+}
+
+func (x *ExportByDbReq) GetContent() string {
+	if x != nil {
+		return x.Content
+	}
+	return ""
+}
+
+func (x *ExportByDbReq) GetMails() string {
+	if x != nil {
+		return x.Mails
+	}
+	return ""
+}
+
+func (x *ExportByDbReq) GetQuery() string {
+	if x != nil {
+		return x.Query
+	}
+	return ""
+}
+
+var File_biService_proto protoreflect.FileDescriptor
+
+var file_biService_proto_rawDesc = []byte{
+	0x0a, 0x0f, 0x62, 0x69, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74,
+	0x6f, 0x22, 0x64, 0x0a, 0x0e, 0x4d, 0x79, 0x44, 0x61, 0x74, 0x61, 0x41, 0x73, 0x73, 0x65, 0x74,
+	0x52, 0x65, 0x71, 0x12, 0x16, 0x0a, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, 0x18, 0x01, 0x20,
+	0x01, 0x28, 0x09, 0x52, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, 0x12, 0x1c, 0x0a, 0x09, 0x6e,
+	0x65, 0x77, 0x55, 0x73, 0x65, 0x72, 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09,
+	0x6e, 0x65, 0x77, 0x55, 0x73, 0x65, 0x72, 0x49, 0x64, 0x12, 0x1c, 0x0a, 0x09, 0x65, 0x6e, 0x74,
+	0x55, 0x73, 0x65, 0x72, 0x49, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x65, 0x6e,
+	0x74, 0x55, 0x73, 0x65, 0x72, 0x49, 0x64, 0x22, 0x6f, 0x0a, 0x0f, 0x4d, 0x79, 0x44, 0x61, 0x74,
+	0x61, 0x41, 0x73, 0x73, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x12, 0x1d, 0x0a, 0x0a, 0x65, 0x72,
+	0x72, 0x6f, 0x72, 0x5f, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09,
+	0x65, 0x72, 0x72, 0x6f, 0x72, 0x43, 0x6f, 0x64, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x65, 0x72, 0x72,
+	0x6f, 0x72, 0x5f, 0x6d, 0x73, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x65, 0x72,
+	0x72, 0x6f, 0x72, 0x4d, 0x73, 0x67, 0x12, 0x20, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x03,
+	0x20, 0x01, 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x4d, 0x79, 0x44, 0x61, 0x74, 0x61, 0x41, 0x73, 0x73,
+	0x65, 0x74, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x22, 0xf3, 0x01, 0x0a, 0x0b, 0x4d, 0x79, 0x44,
+	0x61, 0x74, 0x61, 0x41, 0x73, 0x73, 0x65, 0x74, 0x12, 0x2c, 0x0a, 0x12, 0x63, 0x6f, 0x6c, 0x6c,
+	0x65, 0x63, 0x74, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01,
+	0x20, 0x01, 0x28, 0x03, 0x52, 0x10, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x49, 0x6e, 0x66,
+	0x6f, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x30, 0x0a, 0x14, 0x66, 0x6f, 0x6c, 0x6c, 0x6f, 0x77,
+	0x5f, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x02,
+	0x20, 0x01, 0x28, 0x03, 0x52, 0x12, 0x66, 0x6f, 0x6c, 0x6c, 0x6f, 0x77, 0x50, 0x72, 0x6f, 0x6a,
+	0x65, 0x63, 0x74, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x2a, 0x0a, 0x11, 0x63, 0x6f, 0x6c, 0x6c,
+	0x65, 0x63, 0x74, 0x5f, 0x64, 0x6f, 0x63, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x03, 0x20,
+	0x01, 0x28, 0x03, 0x52, 0x0f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x44, 0x6f, 0x63, 0x43,
+	0x6f, 0x75, 0x6e, 0x74, 0x12, 0x30, 0x0a, 0x14, 0x63, 0x6c, 0x61, 0x69, 0x6d, 0x5f, 0x63, 0x75,
+	0x73, 0x74, 0x6f, 0x6d, 0x65, 0x72, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x04, 0x20, 0x01,
+	0x28, 0x03, 0x52, 0x12, 0x63, 0x6c, 0x61, 0x69, 0x6d, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x65,
+	0x72, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x26, 0x0a, 0x0f, 0x63, 0x6c, 0x61, 0x69, 0x6d, 0x5f,
+	0x6e, 0x7a, 0x6a, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52,
+	0x0d, 0x63, 0x6c, 0x61, 0x69, 0x6d, 0x4e, 0x7a, 0x6a, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0xb5,
+	0x02, 0x0a, 0x0d, 0x41, 0x64, 0x64, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, 0x71,
+	0x12, 0x17, 0x0a, 0x07, 0x69, 0x6e, 0x66, 0x6f, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28,
+	0x09, 0x52, 0x06, 0x69, 0x6e, 0x66, 0x6f, 0x49, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x6f, 0x75,
+	0x72, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x06, 0x73, 0x6f, 0x75, 0x72, 0x63,
+	0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64,
+	0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0a, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e,
+	0x49, 0x64, 0x12, 0x23, 0x0a, 0x0d, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x74,
+	0x79, 0x70, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0c, 0x70, 0x6f, 0x73, 0x69, 0x74,
+	0x69, 0x6f, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x61, 0x63, 0x63, 0x6f, 0x75,
+	0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x61, 0x63, 0x63,
+	0x6f, 0x75, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x21, 0x0a, 0x0c, 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x6e,
+	0x79, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x63, 0x6f,
+	0x6d, 0x70, 0x61, 0x6e, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x75, 0x73, 0x65,
+	0x72, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x75, 0x73,
+	0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64,
+	0x18, 0x08, 0x20, 0x01, 0x28, 0x03, 0x52, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, 0x12, 0x14,
+	0x0a, 0x05, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x18, 0x09, 0x20, 0x01, 0x28, 0x03, 0x52, 0x05, 0x65,
+	0x6e, 0x74, 0x49, 0x64, 0x12, 0x20, 0x0a, 0x0b, 0x65, 0x6e, 0x74, 0x55, 0x73, 0x65, 0x72, 0x4e,
+	0x61, 0x6d, 0x65, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x65, 0x6e, 0x74, 0x55, 0x73,
+	0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x6d, 0x0a, 0x0e, 0x41, 0x64, 0x64, 0x50, 0x72, 0x6f,
+	0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, 0x73, 0x70, 0x12, 0x1d, 0x0a, 0x0a, 0x65, 0x72, 0x72, 0x6f,
+	0x72, 0x5f, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x65, 0x72,
+	0x72, 0x6f, 0x72, 0x43, 0x6f, 0x64, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x65, 0x72, 0x72, 0x6f, 0x72,
+	0x5f, 0x6d, 0x73, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x65, 0x72, 0x72, 0x6f,
+	0x72, 0x4d, 0x73, 0x67, 0x12, 0x1f, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x03, 0x20, 0x01,
+	0x28, 0x0b, 0x32, 0x0b, 0x2e, 0x41, 0x64, 0x64, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x52,
+	0x04, 0x64, 0x61, 0x74, 0x61, 0x22, 0x3a, 0x0a, 0x0a, 0x41, 0x64, 0x64, 0x50, 0x72, 0x6f, 0x6a,
+	0x65, 0x63, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x01, 0x20,
+	0x01, 0x28, 0x03, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x63,
+	0x6f, 0x75, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x05, 0x63, 0x6f, 0x75, 0x6e,
+	0x74, 0x22, 0x5f, 0x0a, 0x0d, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x49, 0x64, 0x52, 0x65,
+	0x73, 0x70, 0x12, 0x1d, 0x0a, 0x0a, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x5f, 0x63, 0x6f, 0x64, 0x65,
+	0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x43, 0x6f, 0x64,
+	0x65, 0x12, 0x1b, 0x0a, 0x09, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x5f, 0x6d, 0x73, 0x67, 0x18, 0x02,
+	0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x4d, 0x73, 0x67, 0x12, 0x12,
+	0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x04, 0x64, 0x61,
+	0x74, 0x61, 0x22, 0x43, 0x0a, 0x0b, 0x44, 0x72, 0x61, 0x77, 0x43, 0x6c, 0x75, 0x65, 0x52, 0x65,
+	0x71, 0x12, 0x1e, 0x0a, 0x0a, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x18,
+	0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0a, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x49,
+	0x64, 0x12, 0x14, 0x0a, 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03,
+	0x52, 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x40, 0x0a, 0x07, 0x43, 0x61, 0x6c, 0x6c, 0x52,
+	0x65, 0x71, 0x12, 0x1f, 0x0a, 0x0b, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69,
+	0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0a, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f,
+	0x6e, 0x49, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x70, 0x68, 0x6f, 0x6e, 0x65, 0x18, 0x02, 0x20, 0x01,
+	0x28, 0x09, 0x52, 0x05, 0x70, 0x68, 0x6f, 0x6e, 0x65, 0x22, 0x58, 0x0a, 0x06, 0x42, 0x69, 0x52,
+	0x65, 0x73, 0x70, 0x12, 0x1d, 0x0a, 0x0a, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x5f, 0x63, 0x6f, 0x64,
+	0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x43, 0x6f,
+	0x64, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x5f, 0x6d, 0x73, 0x67, 0x18,
+	0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x4d, 0x73, 0x67, 0x12,
+	0x12, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x64,
+	0x61, 0x74, 0x61, 0x22, 0x59, 0x0a, 0x07, 0x42, 0x69, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x1d,
+	0x0a, 0x0a, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x5f, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x01, 0x20, 0x01,
+	0x28, 0x03, 0x52, 0x09, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x43, 0x6f, 0x64, 0x65, 0x12, 0x1b, 0x0a,
+	0x09, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x5f, 0x6d, 0x73, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09,
+	0x52, 0x08, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x4d, 0x73, 0x67, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x61,
+	0x74, 0x61, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x22, 0xb1,
+	0x01, 0x0a, 0x11, 0x44, 0x69, 0x73, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x43, 0x6c, 0x75,
+	0x65, 0x52, 0x65, 0x71, 0x12, 0x1c, 0x0a, 0x09, 0x63, 0x6c, 0x75, 0x65, 0x43, 0x6f, 0x75, 0x6e,
+	0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x6c, 0x75, 0x65, 0x43, 0x6f, 0x75,
+	0x6e, 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x63, 0x6c, 0x75, 0x65, 0x49, 0x64, 0x4c, 0x69, 0x73, 0x74,
+	0x18, 0x02, 0x20, 0x03, 0x28, 0x03, 0x52, 0x0a, 0x63, 0x6c, 0x75, 0x65, 0x49, 0x64, 0x4c, 0x69,
+	0x73, 0x74, 0x12, 0x26, 0x0a, 0x05, 0x64, 0x61, 0x74, 0x61, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28,
+	0x0b, 0x32, 0x10, 0x2e, 0x44, 0x69, 0x73, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x44, 0x61,
+	0x74, 0x61, 0x73, 0x52, 0x05, 0x64, 0x61, 0x74, 0x61, 0x73, 0x12, 0x1e, 0x0a, 0x0a, 0x70, 0x6f,
+	0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0a,
+	0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x69, 0x73,
+	0x54, 0x61, 0x73, 0x6b, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x06, 0x69, 0x73, 0x54, 0x61,
+	0x73, 0x6b, 0x22, 0xbd, 0x01, 0x0a, 0x0f, 0x44, 0x69, 0x73, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74,
+	0x65, 0x44, 0x61, 0x74, 0x61, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01,
+	0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1e, 0x0a, 0x0a, 0x70, 0x6f,
+	0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0a,
+	0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x1e, 0x0a, 0x0a, 0x74, 0x6f,
+	0x74, 0x61, 0x6c, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a,
+	0x74, 0x6f, 0x74, 0x61, 0x6c, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x2a, 0x0a, 0x10, 0x75, 0x6e,
+	0x63, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x04,
+	0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x75, 0x6e, 0x63, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65,
+	0x64, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x2a, 0x0a, 0x10, 0x64, 0x69, 0x73, 0x74, 0x72, 0x69,
+	0x62, 0x75, 0x74, 0x65, 0x64, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03,
+	0x52, 0x10, 0x64, 0x69, 0x73, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x64, 0x43, 0x6f, 0x75,
+	0x6e, 0x74, 0x22, 0x43, 0x0a, 0x0d, 0x43, 0x6c, 0x75, 0x65, 0x49, 0x6d, 0x70, 0x6f, 0x72, 0x74,
+	0x52, 0x65, 0x71, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x63, 0x62, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28,
+	0x09, 0x52, 0x04, 0x70, 0x63, 0x62, 0x68, 0x12, 0x1e, 0x0a, 0x0a, 0x70, 0x6f, 0x73, 0x69, 0x74,
+	0x69, 0x6f, 0x6e, 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0a, 0x70, 0x6f, 0x73,
+	0x69, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x22, 0x6d, 0x0a, 0x0e, 0x43, 0x6c, 0x75, 0x65, 0x49,
+	0x6d, 0x70, 0x6f, 0x72, 0x74, 0x52, 0x65, 0x73, 0x70, 0x12, 0x1d, 0x0a, 0x0a, 0x65, 0x72, 0x72,
+	0x6f, 0x72, 0x5f, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x65,
+	0x72, 0x72, 0x6f, 0x72, 0x43, 0x6f, 0x64, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x65, 0x72, 0x72, 0x6f,
+	0x72, 0x5f, 0x6d, 0x73, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x65, 0x72, 0x72,
+	0x6f, 0x72, 0x4d, 0x73, 0x67, 0x12, 0x1f, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x03, 0x20,
+	0x01, 0x28, 0x0b, 0x32, 0x0b, 0x2e, 0x43, 0x6c, 0x75, 0x65, 0x49, 0x6d, 0x70, 0x6f, 0x72, 0x74,
+	0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x22, 0x3c, 0x0a, 0x0a, 0x43, 0x6c, 0x75, 0x65, 0x49, 0x6d,
+	0x70, 0x6f, 0x72, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x01,
+	0x20, 0x01, 0x28, 0x03, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x16, 0x0a, 0x06,
+	0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x72, 0x65,
+	0x73, 0x75, 0x6c, 0x74, 0x22, 0xa6, 0x03, 0x0a, 0x0a, 0x43, 0x6c, 0x75, 0x65, 0x41, 0x64, 0x64,
+	0x52, 0x65, 0x71, 0x12, 0x14, 0x0a, 0x05, 0x70, 0x68, 0x6f, 0x6e, 0x65, 0x18, 0x01, 0x20, 0x01,
+	0x28, 0x09, 0x52, 0x05, 0x70, 0x68, 0x6f, 0x6e, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x75, 0x73, 0x65,
+	0x72, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x75, 0x73, 0x65,
+	0x72, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x18,
+	0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x1c, 0x0a,
+	0x09, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x39, 0x39, 0x39, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09,
+	0x52, 0x09, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x39, 0x39, 0x39, 0x12, 0x14, 0x0a, 0x05, 0x6f,
+	0x77, 0x6e, 0x65, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6f, 0x77, 0x6e, 0x65,
+	0x72, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x6d, 0x70, 0x4e, 0x6f, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09,
+	0x52, 0x05, 0x65, 0x6d, 0x70, 0x4e, 0x6f, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x6f, 0x6d, 0x70, 0x61,
+	0x6e, 0x79, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x6e,
+	0x79, 0x12, 0x24, 0x0a, 0x0d, 0x69, 0x73, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x6d, 0x61, 0x6b,
+	0x65, 0x72, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x69, 0x73, 0x50, 0x6f, 0x6c, 0x69,
+	0x63, 0x79, 0x6d, 0x61, 0x6b, 0x65, 0x72, 0x12, 0x2a, 0x0a, 0x10, 0x62, 0x65, 0x6c, 0x6f, 0x6e,
+	0x67, 0x54, 0x6f, 0x49, 0x6e, 0x64, 0x75, 0x73, 0x74, 0x72, 0x79, 0x18, 0x09, 0x20, 0x01, 0x28,
+	0x09, 0x52, 0x10, 0x62, 0x65, 0x6c, 0x6f, 0x6e, 0x67, 0x54, 0x6f, 0x49, 0x6e, 0x64, 0x75, 0x73,
+	0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6a, 0x6f, 0x62, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09,
+	0x52, 0x03, 0x6a, 0x6f, 0x62, 0x12, 0x24, 0x0a, 0x0d, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x65,
+	0x72, 0x4e, 0x65, 0x65, 0x64, 0x73, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x63, 0x75,
+	0x73, 0x74, 0x6f, 0x6d, 0x65, 0x72, 0x4e, 0x65, 0x65, 0x64, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x62,
+	0x65, 0x6c, 0x6f, 0x6e, 0x67, 0x54, 0x6f, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x62,
+	0x65, 0x6c, 0x6f, 0x6e, 0x67, 0x54, 0x6f, 0x12, 0x1c, 0x0a, 0x09, 0x77, 0x61, 0x6e, 0x74, 0x47,
+	0x6f, 0x6f, 0x64, 0x73, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x77, 0x61, 0x6e, 0x74,
+	0x47, 0x6f, 0x6f, 0x64, 0x73, 0x12, 0x26, 0x0a, 0x0e, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x65,
+	0x72, 0x42, 0x75, 0x64, 0x67, 0x65, 0x74, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x63,
+	0x75, 0x73, 0x74, 0x6f, 0x6d, 0x65, 0x72, 0x42, 0x75, 0x64, 0x67, 0x65, 0x74, 0x22, 0x3e, 0x0a,
+	0x0c, 0x53, 0x71, 0x6c, 0x4d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x52, 0x65, 0x71, 0x12, 0x0e, 0x0a,
+	0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x02, 0x52, 0x02, 0x69, 0x64, 0x12, 0x1e, 0x0a,
+	0x06, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x06, 0x2e,
+	0x50, 0x61, 0x72, 0x61, 0x6d, 0x52, 0x06, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x22, 0x2f, 0x0a,
+	0x09, 0x4d, 0x79, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x12, 0x10, 0x0a, 0x03, 0x62, 0x69,
+	0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x62, 0x69, 0x64, 0x12, 0x10, 0x0a, 0x03,
+	0x73, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x73, 0x69, 0x64, 0x22, 0x31,
+	0x0a, 0x05, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65,
+	0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x12, 0x0a,
+	0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x79, 0x70,
+	0x65, 0x22, 0x59, 0x0a, 0x09, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x52, 0x65, 0x71, 0x12, 0x12,
+	0x0a, 0x04, 0x6d, 0x61, 0x69, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6d, 0x61,
+	0x69, 0x6c, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x61, 0x70, 0x70, 0x69, 0x6e, 0x67, 0x18, 0x02, 0x20,
+	0x03, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x61, 0x70, 0x70, 0x69, 0x6e, 0x67, 0x12, 0x1e, 0x0a, 0x0a,
+	0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03,
+	0x52, 0x0a, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x22, 0x36, 0x0a, 0x0a,
+	0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x12, 0x14, 0x0a, 0x05, 0x6e, 0x65,
+	0x77, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6e, 0x65, 0x77, 0x49, 0x64,
+	0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x04,
+	0x74, 0x79, 0x70, 0x65, 0x22, 0x81, 0x01, 0x0a, 0x0d, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x42,
+	0x79, 0x44, 0x62, 0x52, 0x65, 0x71, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18,
+	0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x14, 0x0a, 0x05,
+	0x74, 0x69, 0x74, 0x6c, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x69, 0x74,
+	0x6c, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x18, 0x03, 0x20,
+	0x01, 0x28, 0x09, 0x52, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x12, 0x14, 0x0a, 0x05,
+	0x6d, 0x61, 0x69, 0x6c, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6d, 0x61, 0x69,
+	0x6c, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x18, 0x05, 0x20, 0x01, 0x28,
+	0x09, 0x52, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x32, 0xb1, 0x05, 0x0a, 0x09, 0x42, 0x69, 0x53,
+	0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x30, 0x0a, 0x0b, 0x6d, 0x79, 0x44, 0x61, 0x74, 0x61,
+	0x41, 0x73, 0x73, 0x65, 0x74, 0x12, 0x0f, 0x2e, 0x4d, 0x79, 0x44, 0x61, 0x74, 0x61, 0x41, 0x73,
+	0x73, 0x65, 0x74, 0x52, 0x65, 0x71, 0x1a, 0x10, 0x2e, 0x4d, 0x79, 0x44, 0x61, 0x74, 0x61, 0x41,
+	0x73, 0x73, 0x65, 0x74, 0x52, 0x65, 0x73, 0x70, 0x12, 0x2d, 0x0a, 0x0a, 0x61, 0x64, 0x64, 0x50,
+	0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x0e, 0x2e, 0x41, 0x64, 0x64, 0x50, 0x72, 0x6f, 0x6a,
+	0x65, 0x63, 0x74, 0x52, 0x65, 0x71, 0x1a, 0x0f, 0x2e, 0x41, 0x64, 0x64, 0x50, 0x72, 0x6f, 0x6a,
+	0x65, 0x63, 0x74, 0x52, 0x65, 0x73, 0x70, 0x12, 0x2b, 0x0a, 0x09, 0x67, 0x65, 0x74, 0x49, 0x6e,
+	0x66, 0x6f, 0x49, 0x64, 0x12, 0x0e, 0x2e, 0x41, 0x64, 0x64, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63,
+	0x74, 0x52, 0x65, 0x71, 0x1a, 0x0e, 0x2e, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x49, 0x64,
+	0x52, 0x65, 0x73, 0x70, 0x12, 0x29, 0x0a, 0x08, 0x64, 0x72, 0x61, 0x77, 0x43, 0x6c, 0x75, 0x65,
+	0x12, 0x0c, 0x2e, 0x44, 0x72, 0x61, 0x77, 0x43, 0x6c, 0x75, 0x65, 0x52, 0x65, 0x71, 0x1a, 0x0f,
+	0x2e, 0x41, 0x64, 0x64, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, 0x73, 0x70, 0x12,
+	0x19, 0x0a, 0x04, 0x43, 0x61, 0x6c, 0x6c, 0x12, 0x08, 0x2e, 0x43, 0x61, 0x6c, 0x6c, 0x52, 0x65,
+	0x71, 0x1a, 0x07, 0x2e, 0x42, 0x69, 0x52, 0x65, 0x73, 0x70, 0x12, 0x35, 0x0a, 0x0e, 0x64, 0x69,
+	0x73, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x43, 0x6c, 0x75, 0x65, 0x12, 0x12, 0x2e, 0x44,
+	0x69, 0x73, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x43, 0x6c, 0x75, 0x65, 0x52, 0x65, 0x71,
+	0x1a, 0x0f, 0x2e, 0x41, 0x64, 0x64, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, 0x73,
+	0x70, 0x12, 0x2d, 0x0a, 0x0a, 0x63, 0x6c, 0x75, 0x65, 0x49, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x12,
+	0x0e, 0x2e, 0x43, 0x6c, 0x75, 0x65, 0x49, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x52, 0x65, 0x71, 0x1a,
+	0x0f, 0x2e, 0x43, 0x6c, 0x75, 0x65, 0x49, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x52, 0x65, 0x73, 0x70,
+	0x12, 0x27, 0x0a, 0x07, 0x63, 0x6c, 0x75, 0x65, 0x41, 0x64, 0x64, 0x12, 0x0b, 0x2e, 0x43, 0x6c,
+	0x75, 0x65, 0x41, 0x64, 0x64, 0x52, 0x65, 0x71, 0x1a, 0x0f, 0x2e, 0x41, 0x64, 0x64, 0x50, 0x72,
+	0x6f, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, 0x73, 0x70, 0x12, 0x2f, 0x0a, 0x0c, 0x63, 0x6c, 0x75,
+	0x65, 0x49, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x54, 0x74, 0x12, 0x0e, 0x2e, 0x43, 0x6c, 0x75, 0x65,
+	0x49, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x52, 0x65, 0x71, 0x1a, 0x0f, 0x2e, 0x43, 0x6c, 0x75, 0x65,
+	0x49, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x52, 0x65, 0x73, 0x70, 0x12, 0x27, 0x0a, 0x0a, 0x61, 0x75,
+	0x74, 0x6f, 0x46, 0x6f, 0x6c, 0x6c, 0x6f, 0x77, 0x12, 0x08, 0x2e, 0x43, 0x61, 0x6c, 0x6c, 0x52,
+	0x65, 0x71, 0x1a, 0x0f, 0x2e, 0x43, 0x6c, 0x75, 0x65, 0x49, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x52,
+	0x65, 0x73, 0x70, 0x12, 0x24, 0x0a, 0x09, 0x73, 0x71, 0x6c, 0x4d, 0x61, 0x6e, 0x61, 0x67, 0x65,
+	0x12, 0x0d, 0x2e, 0x53, 0x71, 0x6c, 0x4d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x52, 0x65, 0x71, 0x1a,
+	0x08, 0x2e, 0x42, 0x69, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x1e, 0x0a, 0x06, 0x6d, 0x79, 0x49,
+	0x6e, 0x66, 0x6f, 0x12, 0x0a, 0x2e, 0x4d, 0x79, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x1a,
+	0x08, 0x2e, 0x42, 0x69, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x25, 0x0a, 0x0d, 0x61, 0x6c, 0x6c,
+	0x49, 0x6e, 0x66, 0x6f, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x12, 0x0a, 0x2e, 0x45, 0x78, 0x70,
+	0x6f, 0x72, 0x74, 0x52, 0x65, 0x71, 0x1a, 0x08, 0x2e, 0x42, 0x69, 0x52, 0x65, 0x70, 0x6c, 0x79,
+	0x12, 0x28, 0x0a, 0x10, 0x61, 0x6c, 0x6c, 0x50, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x45, 0x78,
+	0x70, 0x6f, 0x72, 0x74, 0x12, 0x0a, 0x2e, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x52, 0x65, 0x71,
+	0x1a, 0x08, 0x2e, 0x42, 0x69, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x12, 0x24, 0x0a, 0x0b, 0x69, 0x6e,
+	0x66, 0x6f, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x65, 0x12, 0x0b, 0x2e, 0x4f, 0x70, 0x65, 0x72,
+	0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x1a, 0x08, 0x2e, 0x42, 0x69, 0x52, 0x65, 0x70, 0x6c, 0x79,
+	0x12, 0x2a, 0x0a, 0x0e, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x44, 0x61, 0x74, 0x61, 0x42, 0x79,
+	0x44, 0x62, 0x12, 0x0e, 0x2e, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x42, 0x79, 0x44, 0x62, 0x52,
+	0x65, 0x71, 0x1a, 0x08, 0x2e, 0x42, 0x69, 0x52, 0x65, 0x70, 0x6c, 0x79, 0x42, 0x06, 0x5a, 0x04,
+	0x2e, 0x2f, 0x70, 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
+}
+
+var (
+	file_biService_proto_rawDescOnce sync.Once
+	file_biService_proto_rawDescData = file_biService_proto_rawDesc
+)
+
+func file_biService_proto_rawDescGZIP() []byte {
+	file_biService_proto_rawDescOnce.Do(func() {
+		file_biService_proto_rawDescData = protoimpl.X.CompressGZIP(file_biService_proto_rawDescData)
+	})
+	return file_biService_proto_rawDescData
+}
+
+var file_biService_proto_msgTypes = make([]protoimpl.MessageInfo, 23)
+var file_biService_proto_goTypes = []interface{}{
+	(*MyDataAssetReq)(nil),    // 0: MyDataAssetReq
+	(*MyDataAssetResp)(nil),   // 1: MyDataAssetResp
+	(*MyDataAsset)(nil),       // 2: MyDataAsset
+	(*AddProjectReq)(nil),     // 3: AddProjectReq
+	(*AddProjectResp)(nil),    // 4: AddProjectResp
+	(*AddProject)(nil),        // 5: AddProject
+	(*GetInfoIdResp)(nil),     // 6: GetInfoIdResp
+	(*DrawClueReq)(nil),       // 7: DrawClueReq
+	(*CallReq)(nil),           // 8: CallReq
+	(*BiResp)(nil),            // 9: BiResp
+	(*BiReply)(nil),           // 10: BiReply
+	(*DistributeClueReq)(nil), // 11: DistributeClueReq
+	(*DistributeDatas)(nil),   // 12: DistributeDatas
+	(*ClueImportReq)(nil),     // 13: ClueImportReq
+	(*ClueImportResp)(nil),    // 14: ClueImportResp
+	(*ClueImport)(nil),        // 15: ClueImport
+	(*ClueAddReq)(nil),        // 16: ClueAddReq
+	(*SqlManageReq)(nil),      // 17: SqlManageReq
+	(*MyInfoReq)(nil),         // 18: MyInfoReq
+	(*Param)(nil),             // 19: Param
+	(*ExportReq)(nil),         // 20: ExportReq
+	(*OperateReq)(nil),        // 21: OperateReq
+	(*ExportByDbReq)(nil),     // 22: ExportByDbReq
+}
+var file_biService_proto_depIdxs = []int32{
+	2,  // 0: MyDataAssetResp.data:type_name -> MyDataAsset
+	5,  // 1: AddProjectResp.data:type_name -> AddProject
+	12, // 2: DistributeClueReq.datas:type_name -> DistributeDatas
+	15, // 3: ClueImportResp.data:type_name -> ClueImport
+	19, // 4: SqlManageReq.params:type_name -> Param
+	0,  // 5: BiService.myDataAsset:input_type -> MyDataAssetReq
+	3,  // 6: BiService.addProject:input_type -> AddProjectReq
+	3,  // 7: BiService.getInfoId:input_type -> AddProjectReq
+	7,  // 8: BiService.drawClue:input_type -> DrawClueReq
+	8,  // 9: BiService.Call:input_type -> CallReq
+	11, // 10: BiService.distributeClue:input_type -> DistributeClueReq
+	13, // 11: BiService.clueImport:input_type -> ClueImportReq
+	16, // 12: BiService.clueAdd:input_type -> ClueAddReq
+	13, // 13: BiService.clueImportTt:input_type -> ClueImportReq
+	8,  // 14: BiService.autoFollow:input_type -> CallReq
+	17, // 15: BiService.sqlManage:input_type -> SqlManageReq
+	18, // 16: BiService.myInfo:input_type -> MyInfoReq
+	20, // 17: BiService.allInfoExport:input_type -> ExportReq
+	20, // 18: BiService.allProjectExport:input_type -> ExportReq
+	21, // 19: BiService.infoOperate:input_type -> OperateReq
+	22, // 20: BiService.exportDataByDb:input_type -> ExportByDbReq
+	1,  // 21: BiService.myDataAsset:output_type -> MyDataAssetResp
+	4,  // 22: BiService.addProject:output_type -> AddProjectResp
+	6,  // 23: BiService.getInfoId:output_type -> GetInfoIdResp
+	4,  // 24: BiService.drawClue:output_type -> AddProjectResp
+	9,  // 25: BiService.Call:output_type -> BiResp
+	4,  // 26: BiService.distributeClue:output_type -> AddProjectResp
+	14, // 27: BiService.clueImport:output_type -> ClueImportResp
+	4,  // 28: BiService.clueAdd:output_type -> AddProjectResp
+	14, // 29: BiService.clueImportTt:output_type -> ClueImportResp
+	14, // 30: BiService.autoFollow:output_type -> ClueImportResp
+	10, // 31: BiService.sqlManage:output_type -> BiReply
+	10, // 32: BiService.myInfo:output_type -> BiReply
+	10, // 33: BiService.allInfoExport:output_type -> BiReply
+	10, // 34: BiService.allProjectExport:output_type -> BiReply
+	10, // 35: BiService.infoOperate:output_type -> BiReply
+	10, // 36: BiService.exportDataByDb:output_type -> BiReply
+	21, // [21:37] is the sub-list for method output_type
+	5,  // [5:21] is the sub-list for method input_type
+	5,  // [5:5] is the sub-list for extension type_name
+	5,  // [5:5] is the sub-list for extension extendee
+	0,  // [0:5] is the sub-list for field type_name
+}
+
+func init() { file_biService_proto_init() }
+func file_biService_proto_init() {
+	if File_biService_proto != nil {
+		return
+	}
+	if !protoimpl.UnsafeEnabled {
+		file_biService_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*MyDataAssetReq); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_biService_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*MyDataAssetResp); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_biService_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*MyDataAsset); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_biService_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*AddProjectReq); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_biService_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*AddProjectResp); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_biService_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*AddProject); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_biService_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*GetInfoIdResp); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_biService_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*DrawClueReq); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_biService_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*CallReq); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_biService_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*BiResp); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_biService_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*BiReply); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_biService_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*DistributeClueReq); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_biService_proto_msgTypes[12].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*DistributeDatas); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_biService_proto_msgTypes[13].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*ClueImportReq); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_biService_proto_msgTypes[14].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*ClueImportResp); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_biService_proto_msgTypes[15].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*ClueImport); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_biService_proto_msgTypes[16].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*ClueAddReq); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_biService_proto_msgTypes[17].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*SqlManageReq); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_biService_proto_msgTypes[18].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*MyInfoReq); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_biService_proto_msgTypes[19].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*Param); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_biService_proto_msgTypes[20].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*ExportReq); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_biService_proto_msgTypes[21].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*OperateReq); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+		file_biService_proto_msgTypes[22].Exporter = func(v interface{}, i int) interface{} {
+			switch v := v.(*ExportByDbReq); i {
+			case 0:
+				return &v.state
+			case 1:
+				return &v.sizeCache
+			case 2:
+				return &v.unknownFields
+			default:
+				return nil
+			}
+		}
+	}
+	type x struct{}
+	out := protoimpl.TypeBuilder{
+		File: protoimpl.DescBuilder{
+			GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
+			RawDescriptor: file_biService_proto_rawDesc,
+			NumEnums:      0,
+			NumMessages:   23,
+			NumExtensions: 0,
+			NumServices:   1,
+		},
+		GoTypes:           file_biService_proto_goTypes,
+		DependencyIndexes: file_biService_proto_depIdxs,
+		MessageInfos:      file_biService_proto_msgTypes,
+	}.Build()
+	File_biService_proto = out.File
+	file_biService_proto_rawDesc = nil
+	file_biService_proto_goTypes = nil
+	file_biService_proto_depIdxs = nil
+}

+ 664 - 0
rpc/types/pb/biService_grpc.pb.go

@@ -0,0 +1,664 @@
+// Code generated by protoc-gen-go-grpc. DO NOT EDIT.
+// versions:
+// - protoc-gen-go-grpc v1.3.0
+// - protoc             v4.25.2
+// source: biService.proto
+
+package pb
+
+import (
+	context "context"
+	grpc "google.golang.org/grpc"
+	codes "google.golang.org/grpc/codes"
+	status "google.golang.org/grpc/status"
+)
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the grpc package it is being compiled against.
+// Requires gRPC-Go v1.32.0 or later.
+const _ = grpc.SupportPackageIsVersion7
+
+const (
+	BiService_MyDataAsset_FullMethodName      = "/BiService/myDataAsset"
+	BiService_AddProject_FullMethodName       = "/BiService/addProject"
+	BiService_GetInfoId_FullMethodName        = "/BiService/getInfoId"
+	BiService_DrawClue_FullMethodName         = "/BiService/drawClue"
+	BiService_Call_FullMethodName             = "/BiService/Call"
+	BiService_DistributeClue_FullMethodName   = "/BiService/distributeClue"
+	BiService_ClueImport_FullMethodName       = "/BiService/clueImport"
+	BiService_ClueAdd_FullMethodName          = "/BiService/clueAdd"
+	BiService_ClueImportTt_FullMethodName     = "/BiService/clueImportTt"
+	BiService_AutoFollow_FullMethodName       = "/BiService/autoFollow"
+	BiService_SqlManage_FullMethodName        = "/BiService/sqlManage"
+	BiService_MyInfo_FullMethodName           = "/BiService/myInfo"
+	BiService_AllInfoExport_FullMethodName    = "/BiService/allInfoExport"
+	BiService_AllProjectExport_FullMethodName = "/BiService/allProjectExport"
+	BiService_InfoOperate_FullMethodName      = "/BiService/infoOperate"
+	BiService_ExportDataByDb_FullMethodName   = "/BiService/exportDataByDb"
+)
+
+// BiServiceClient is the client API for BiService service.
+//
+// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream.
+type BiServiceClient interface {
+	MyDataAsset(ctx context.Context, in *MyDataAssetReq, opts ...grpc.CallOption) (*MyDataAssetResp, error)
+	AddProject(ctx context.Context, in *AddProjectReq, opts ...grpc.CallOption) (*AddProjectResp, error)
+	GetInfoId(ctx context.Context, in *AddProjectReq, opts ...grpc.CallOption) (*GetInfoIdResp, error)
+	DrawClue(ctx context.Context, in *DrawClueReq, opts ...grpc.CallOption) (*AddProjectResp, error)
+	Call(ctx context.Context, in *CallReq, opts ...grpc.CallOption) (*BiResp, error)
+	DistributeClue(ctx context.Context, in *DistributeClueReq, opts ...grpc.CallOption) (*AddProjectResp, error)
+	ClueImport(ctx context.Context, in *ClueImportReq, opts ...grpc.CallOption) (*ClueImportResp, error)
+	ClueAdd(ctx context.Context, in *ClueAddReq, opts ...grpc.CallOption) (*AddProjectResp, error)
+	ClueImportTt(ctx context.Context, in *ClueImportReq, opts ...grpc.CallOption) (*ClueImportResp, error)
+	AutoFollow(ctx context.Context, in *CallReq, opts ...grpc.CallOption) (*ClueImportResp, error)
+	SqlManage(ctx context.Context, in *SqlManageReq, opts ...grpc.CallOption) (*BiReply, error)
+	MyInfo(ctx context.Context, in *MyInfoReq, opts ...grpc.CallOption) (*BiReply, error)
+	AllInfoExport(ctx context.Context, in *ExportReq, opts ...grpc.CallOption) (*BiReply, error)
+	AllProjectExport(ctx context.Context, in *ExportReq, opts ...grpc.CallOption) (*BiReply, error)
+	InfoOperate(ctx context.Context, in *OperateReq, opts ...grpc.CallOption) (*BiReply, error)
+	ExportDataByDb(ctx context.Context, in *ExportByDbReq, opts ...grpc.CallOption) (*BiReply, error)
+}
+
+type biServiceClient struct {
+	cc grpc.ClientConnInterface
+}
+
+func NewBiServiceClient(cc grpc.ClientConnInterface) BiServiceClient {
+	return &biServiceClient{cc}
+}
+
+func (c *biServiceClient) MyDataAsset(ctx context.Context, in *MyDataAssetReq, opts ...grpc.CallOption) (*MyDataAssetResp, error) {
+	out := new(MyDataAssetResp)
+	err := c.cc.Invoke(ctx, BiService_MyDataAsset_FullMethodName, in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *biServiceClient) AddProject(ctx context.Context, in *AddProjectReq, opts ...grpc.CallOption) (*AddProjectResp, error) {
+	out := new(AddProjectResp)
+	err := c.cc.Invoke(ctx, BiService_AddProject_FullMethodName, in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *biServiceClient) GetInfoId(ctx context.Context, in *AddProjectReq, opts ...grpc.CallOption) (*GetInfoIdResp, error) {
+	out := new(GetInfoIdResp)
+	err := c.cc.Invoke(ctx, BiService_GetInfoId_FullMethodName, in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *biServiceClient) DrawClue(ctx context.Context, in *DrawClueReq, opts ...grpc.CallOption) (*AddProjectResp, error) {
+	out := new(AddProjectResp)
+	err := c.cc.Invoke(ctx, BiService_DrawClue_FullMethodName, in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *biServiceClient) Call(ctx context.Context, in *CallReq, opts ...grpc.CallOption) (*BiResp, error) {
+	out := new(BiResp)
+	err := c.cc.Invoke(ctx, BiService_Call_FullMethodName, in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *biServiceClient) DistributeClue(ctx context.Context, in *DistributeClueReq, opts ...grpc.CallOption) (*AddProjectResp, error) {
+	out := new(AddProjectResp)
+	err := c.cc.Invoke(ctx, BiService_DistributeClue_FullMethodName, in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *biServiceClient) ClueImport(ctx context.Context, in *ClueImportReq, opts ...grpc.CallOption) (*ClueImportResp, error) {
+	out := new(ClueImportResp)
+	err := c.cc.Invoke(ctx, BiService_ClueImport_FullMethodName, in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *biServiceClient) ClueAdd(ctx context.Context, in *ClueAddReq, opts ...grpc.CallOption) (*AddProjectResp, error) {
+	out := new(AddProjectResp)
+	err := c.cc.Invoke(ctx, BiService_ClueAdd_FullMethodName, in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *biServiceClient) ClueImportTt(ctx context.Context, in *ClueImportReq, opts ...grpc.CallOption) (*ClueImportResp, error) {
+	out := new(ClueImportResp)
+	err := c.cc.Invoke(ctx, BiService_ClueImportTt_FullMethodName, in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *biServiceClient) AutoFollow(ctx context.Context, in *CallReq, opts ...grpc.CallOption) (*ClueImportResp, error) {
+	out := new(ClueImportResp)
+	err := c.cc.Invoke(ctx, BiService_AutoFollow_FullMethodName, in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *biServiceClient) SqlManage(ctx context.Context, in *SqlManageReq, opts ...grpc.CallOption) (*BiReply, error) {
+	out := new(BiReply)
+	err := c.cc.Invoke(ctx, BiService_SqlManage_FullMethodName, in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *biServiceClient) MyInfo(ctx context.Context, in *MyInfoReq, opts ...grpc.CallOption) (*BiReply, error) {
+	out := new(BiReply)
+	err := c.cc.Invoke(ctx, BiService_MyInfo_FullMethodName, in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *biServiceClient) AllInfoExport(ctx context.Context, in *ExportReq, opts ...grpc.CallOption) (*BiReply, error) {
+	out := new(BiReply)
+	err := c.cc.Invoke(ctx, BiService_AllInfoExport_FullMethodName, in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *biServiceClient) AllProjectExport(ctx context.Context, in *ExportReq, opts ...grpc.CallOption) (*BiReply, error) {
+	out := new(BiReply)
+	err := c.cc.Invoke(ctx, BiService_AllProjectExport_FullMethodName, in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *biServiceClient) InfoOperate(ctx context.Context, in *OperateReq, opts ...grpc.CallOption) (*BiReply, error) {
+	out := new(BiReply)
+	err := c.cc.Invoke(ctx, BiService_InfoOperate_FullMethodName, in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *biServiceClient) ExportDataByDb(ctx context.Context, in *ExportByDbReq, opts ...grpc.CallOption) (*BiReply, error) {
+	out := new(BiReply)
+	err := c.cc.Invoke(ctx, BiService_ExportDataByDb_FullMethodName, in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+// BiServiceServer is the server API for BiService service.
+// All implementations must embed UnimplementedBiServiceServer
+// for forward compatibility
+type BiServiceServer interface {
+	MyDataAsset(context.Context, *MyDataAssetReq) (*MyDataAssetResp, error)
+	AddProject(context.Context, *AddProjectReq) (*AddProjectResp, error)
+	GetInfoId(context.Context, *AddProjectReq) (*GetInfoIdResp, error)
+	DrawClue(context.Context, *DrawClueReq) (*AddProjectResp, error)
+	Call(context.Context, *CallReq) (*BiResp, error)
+	DistributeClue(context.Context, *DistributeClueReq) (*AddProjectResp, error)
+	ClueImport(context.Context, *ClueImportReq) (*ClueImportResp, error)
+	ClueAdd(context.Context, *ClueAddReq) (*AddProjectResp, error)
+	ClueImportTt(context.Context, *ClueImportReq) (*ClueImportResp, error)
+	AutoFollow(context.Context, *CallReq) (*ClueImportResp, error)
+	SqlManage(context.Context, *SqlManageReq) (*BiReply, error)
+	MyInfo(context.Context, *MyInfoReq) (*BiReply, error)
+	AllInfoExport(context.Context, *ExportReq) (*BiReply, error)
+	AllProjectExport(context.Context, *ExportReq) (*BiReply, error)
+	InfoOperate(context.Context, *OperateReq) (*BiReply, error)
+	ExportDataByDb(context.Context, *ExportByDbReq) (*BiReply, error)
+	mustEmbedUnimplementedBiServiceServer()
+}
+
+// UnimplementedBiServiceServer must be embedded to have forward compatible implementations.
+type UnimplementedBiServiceServer struct {
+}
+
+func (UnimplementedBiServiceServer) MyDataAsset(context.Context, *MyDataAssetReq) (*MyDataAssetResp, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method MyDataAsset not implemented")
+}
+func (UnimplementedBiServiceServer) AddProject(context.Context, *AddProjectReq) (*AddProjectResp, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method AddProject not implemented")
+}
+func (UnimplementedBiServiceServer) GetInfoId(context.Context, *AddProjectReq) (*GetInfoIdResp, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method GetInfoId not implemented")
+}
+func (UnimplementedBiServiceServer) DrawClue(context.Context, *DrawClueReq) (*AddProjectResp, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method DrawClue not implemented")
+}
+func (UnimplementedBiServiceServer) Call(context.Context, *CallReq) (*BiResp, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method Call not implemented")
+}
+func (UnimplementedBiServiceServer) DistributeClue(context.Context, *DistributeClueReq) (*AddProjectResp, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method DistributeClue not implemented")
+}
+func (UnimplementedBiServiceServer) ClueImport(context.Context, *ClueImportReq) (*ClueImportResp, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method ClueImport not implemented")
+}
+func (UnimplementedBiServiceServer) ClueAdd(context.Context, *ClueAddReq) (*AddProjectResp, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method ClueAdd not implemented")
+}
+func (UnimplementedBiServiceServer) ClueImportTt(context.Context, *ClueImportReq) (*ClueImportResp, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method ClueImportTt not implemented")
+}
+func (UnimplementedBiServiceServer) AutoFollow(context.Context, *CallReq) (*ClueImportResp, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method AutoFollow not implemented")
+}
+func (UnimplementedBiServiceServer) SqlManage(context.Context, *SqlManageReq) (*BiReply, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method SqlManage not implemented")
+}
+func (UnimplementedBiServiceServer) MyInfo(context.Context, *MyInfoReq) (*BiReply, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method MyInfo not implemented")
+}
+func (UnimplementedBiServiceServer) AllInfoExport(context.Context, *ExportReq) (*BiReply, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method AllInfoExport not implemented")
+}
+func (UnimplementedBiServiceServer) AllProjectExport(context.Context, *ExportReq) (*BiReply, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method AllProjectExport not implemented")
+}
+func (UnimplementedBiServiceServer) InfoOperate(context.Context, *OperateReq) (*BiReply, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method InfoOperate not implemented")
+}
+func (UnimplementedBiServiceServer) ExportDataByDb(context.Context, *ExportByDbReq) (*BiReply, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method ExportDataByDb not implemented")
+}
+func (UnimplementedBiServiceServer) mustEmbedUnimplementedBiServiceServer() {}
+
+// UnsafeBiServiceServer may be embedded to opt out of forward compatibility for this service.
+// Use of this interface is not recommended, as added methods to BiServiceServer will
+// result in compilation errors.
+type UnsafeBiServiceServer interface {
+	mustEmbedUnimplementedBiServiceServer()
+}
+
+func RegisterBiServiceServer(s grpc.ServiceRegistrar, srv BiServiceServer) {
+	s.RegisterService(&BiService_ServiceDesc, srv)
+}
+
+func _BiService_MyDataAsset_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(MyDataAssetReq)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(BiServiceServer).MyDataAsset(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: BiService_MyDataAsset_FullMethodName,
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(BiServiceServer).MyDataAsset(ctx, req.(*MyDataAssetReq))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _BiService_AddProject_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(AddProjectReq)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(BiServiceServer).AddProject(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: BiService_AddProject_FullMethodName,
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(BiServiceServer).AddProject(ctx, req.(*AddProjectReq))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _BiService_GetInfoId_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(AddProjectReq)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(BiServiceServer).GetInfoId(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: BiService_GetInfoId_FullMethodName,
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(BiServiceServer).GetInfoId(ctx, req.(*AddProjectReq))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _BiService_DrawClue_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(DrawClueReq)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(BiServiceServer).DrawClue(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: BiService_DrawClue_FullMethodName,
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(BiServiceServer).DrawClue(ctx, req.(*DrawClueReq))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _BiService_Call_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(CallReq)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(BiServiceServer).Call(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: BiService_Call_FullMethodName,
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(BiServiceServer).Call(ctx, req.(*CallReq))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _BiService_DistributeClue_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(DistributeClueReq)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(BiServiceServer).DistributeClue(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: BiService_DistributeClue_FullMethodName,
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(BiServiceServer).DistributeClue(ctx, req.(*DistributeClueReq))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _BiService_ClueImport_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(ClueImportReq)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(BiServiceServer).ClueImport(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: BiService_ClueImport_FullMethodName,
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(BiServiceServer).ClueImport(ctx, req.(*ClueImportReq))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _BiService_ClueAdd_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(ClueAddReq)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(BiServiceServer).ClueAdd(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: BiService_ClueAdd_FullMethodName,
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(BiServiceServer).ClueAdd(ctx, req.(*ClueAddReq))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _BiService_ClueImportTt_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(ClueImportReq)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(BiServiceServer).ClueImportTt(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: BiService_ClueImportTt_FullMethodName,
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(BiServiceServer).ClueImportTt(ctx, req.(*ClueImportReq))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _BiService_AutoFollow_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(CallReq)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(BiServiceServer).AutoFollow(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: BiService_AutoFollow_FullMethodName,
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(BiServiceServer).AutoFollow(ctx, req.(*CallReq))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _BiService_SqlManage_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(SqlManageReq)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(BiServiceServer).SqlManage(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: BiService_SqlManage_FullMethodName,
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(BiServiceServer).SqlManage(ctx, req.(*SqlManageReq))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _BiService_MyInfo_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(MyInfoReq)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(BiServiceServer).MyInfo(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: BiService_MyInfo_FullMethodName,
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(BiServiceServer).MyInfo(ctx, req.(*MyInfoReq))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _BiService_AllInfoExport_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(ExportReq)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(BiServiceServer).AllInfoExport(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: BiService_AllInfoExport_FullMethodName,
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(BiServiceServer).AllInfoExport(ctx, req.(*ExportReq))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _BiService_AllProjectExport_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(ExportReq)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(BiServiceServer).AllProjectExport(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: BiService_AllProjectExport_FullMethodName,
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(BiServiceServer).AllProjectExport(ctx, req.(*ExportReq))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _BiService_InfoOperate_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(OperateReq)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(BiServiceServer).InfoOperate(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: BiService_InfoOperate_FullMethodName,
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(BiServiceServer).InfoOperate(ctx, req.(*OperateReq))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _BiService_ExportDataByDb_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(ExportByDbReq)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(BiServiceServer).ExportDataByDb(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: BiService_ExportDataByDb_FullMethodName,
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(BiServiceServer).ExportDataByDb(ctx, req.(*ExportByDbReq))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+// BiService_ServiceDesc is the grpc.ServiceDesc for BiService service.
+// It's only intended for direct use with grpc.RegisterService,
+// and not to be introspected or modified (even as a copy)
+var BiService_ServiceDesc = grpc.ServiceDesc{
+	ServiceName: "BiService",
+	HandlerType: (*BiServiceServer)(nil),
+	Methods: []grpc.MethodDesc{
+		{
+			MethodName: "myDataAsset",
+			Handler:    _BiService_MyDataAsset_Handler,
+		},
+		{
+			MethodName: "addProject",
+			Handler:    _BiService_AddProject_Handler,
+		},
+		{
+			MethodName: "getInfoId",
+			Handler:    _BiService_GetInfoId_Handler,
+		},
+		{
+			MethodName: "drawClue",
+			Handler:    _BiService_DrawClue_Handler,
+		},
+		{
+			MethodName: "Call",
+			Handler:    _BiService_Call_Handler,
+		},
+		{
+			MethodName: "distributeClue",
+			Handler:    _BiService_DistributeClue_Handler,
+		},
+		{
+			MethodName: "clueImport",
+			Handler:    _BiService_ClueImport_Handler,
+		},
+		{
+			MethodName: "clueAdd",
+			Handler:    _BiService_ClueAdd_Handler,
+		},
+		{
+			MethodName: "clueImportTt",
+			Handler:    _BiService_ClueImportTt_Handler,
+		},
+		{
+			MethodName: "autoFollow",
+			Handler:    _BiService_AutoFollow_Handler,
+		},
+		{
+			MethodName: "sqlManage",
+			Handler:    _BiService_SqlManage_Handler,
+		},
+		{
+			MethodName: "myInfo",
+			Handler:    _BiService_MyInfo_Handler,
+		},
+		{
+			MethodName: "allInfoExport",
+			Handler:    _BiService_AllInfoExport_Handler,
+		},
+		{
+			MethodName: "allProjectExport",
+			Handler:    _BiService_AllProjectExport_Handler,
+		},
+		{
+			MethodName: "infoOperate",
+			Handler:    _BiService_InfoOperate_Handler,
+		},
+		{
+			MethodName: "exportDataByDb",
+			Handler:    _BiService_ExportDataByDb_Handler,
+		},
+	},
+	Streams:  []grpc.StreamDesc{},
+	Metadata: "biService.proto",
+}

+ 227 - 152
service/clue.go

@@ -184,6 +184,7 @@ func ClueAdd(this *biservice.ClueAddReq, col string) *biservice.AddProjectResp {
 	if this.Company == "" {
 		this.Company = this.Phone
 	}
+	isGroup, isCommerce := CompanyType(this.Company)
 	saveMap := map[string]interface{}{
 		"unique_id":        this.Phone,
 		"phone":            this.Phone,
@@ -217,6 +218,8 @@ func ClueAdd(this *biservice.ClueAddReq, col string) *biservice.AddProjectResp {
 	} else {
 		resMap := common.StringToMap(string(bs))
 		if resMap["success"] != nil && resMap["success"].(bool) {
+			saveMap["company_nature"] = isGroup
+			saveMap["company_verification"] = isCommerce
 			CallTidb.Insert(col, saveMap)
 		} else {
 			status = -1
@@ -530,172 +533,241 @@ func DrawClueSync(this *biservice.DrawClueReq) (int, int) {
 }
 
 func DrawClues(positionId, count1, count2, count3 int64) int {
+	nowTime := time.Now().Format("2006-01-02 15:04:05")
+	seatNumber, name := getSeatNumber(positionId)
 	data1, data2, data3, drawCount := &[]map[string]interface{}{}, &[]map[string]interface{}{}, &[]map[string]interface{}{}, 0
 	if count1 > 0 {
-		// data1 = JyBiTidb.Find("dwd_f_crm_clue_info", map[string]interface{}{"level_open": 1, "is_assign": 0}, "", "", 0, int(count1))
-		data1 = JyBiTidb.SelectBySql(`SELECT max(c.createTime) as ctime,a.id,a.trailstatus FROM dwd_f_crm_clue_info a 
-					LEFT JOIN Call_Accounting.voice_record c ON c.CalledNo = a.phone
-					WHERE a.level_open = ? AND a.is_assign = 0 AND a.uid !="" AND a.is_transfer != 1 GROUP BY a.id ORDER BY ctime asc limit ?`, 1, count1)
+		data1 = JyBiTidb.SelectBySql(`SELECT * from dwd_f_crm_clue_info where is_assign = 0 and level_open = ? and cluename in (SELECT cluename from dwd_f_crm_clue_info where position_id = ? GROUP BY cluename)`, 1, positionId)
+		if data1 != nil && len(*data1) > 0 {
+			if int64(len(*data1)) >= count1 {
+				data11 := (*data1)[0:count1]
+				data1 = &data11
+				count1 = 0
+			} else {
+				count1 = count1 - int64(len(*data1))
+			}
+		}
 	}
 	if count2 > 0 {
-		// data2 = JyBiTidb.Find("dwd_f_crm_clue_info", map[string]interface{}{"level_open": 2, "is_assign": 0}, "", "", 0, int(count2))
-		data2 = JyBiTidb.SelectBySql(`SELECT max(c.createTime) as ctime,a.id,a.trailstatus FROM dwd_f_crm_clue_info a 
-					LEFT JOIN Call_Accounting.voice_record c ON c.CalledNo = a.phone
-					WHERE a.level_open = ? AND a.is_assign = 0 AND a.uid !="" AND a.is_transfer != 1 GROUP BY a.id ORDER BY ctime asc limit ?`, 2, count2)
+		data2 = JyBiTidb.SelectBySql(`SELECT * from dwd_f_crm_clue_info where is_assign = 0 and level_open = ? and cluename in (SELECT cluename from dwd_f_crm_clue_info where position_id = ? GROUP BY cluename)`, 2, positionId)
+		if data2 != nil && len(*data2) > 0 {
+			if int64(len(*data2)) >= count2 {
+				data11 := (*data2)[0:count2]
+				data2 = &data11
+				count2 = 0
+			} else {
+				count2 = count2 - int64(len(*data2))
+			}
+		}
 	}
 	if count3 > 0 {
-		// data3 = JyBiTidb.Find("dwd_f_crm_clue_info", map[string]interface{}{"level_open": 3, "is_assign": 0}, "", "", 0, int(count3))
-		data3 = JyBiTidb.SelectBySql(`SELECT max(c.createTime) as ctime,a.id,a.trailstatus FROM dwd_f_crm_clue_info a 
-					LEFT JOIN Call_Accounting.voice_record c ON c.CalledNo = a.phone
-					WHERE a.level_open = ? AND a.is_assign = 0 AND a.uid !="" AND a.is_transfer != 1 GROUP BY a.id ORDER BY ctime asc limit ?`, 3, count3)
+		data3 = JyBiTidb.SelectBySql(`SELECT * from dwd_f_crm_clue_info where is_assign = 0 and level_open = ? and cluename in (SELECT cluename from dwd_f_crm_clue_info where position_id = ? GROUP BY cluename)`, 3, positionId)
+		if data3 != nil && len(*data3) > 0 {
+			if int64(len(*data3)) >= count3 {
+				data11 := (*data3)[0:count3]
+				data3 = &data11
+				count3 = 0
+			} else {
+				count3 = count3 - int64(len(*data3))
+			}
+		}
 	}
-	nowTime := time.Now().Format("2006-01-02 15:04:05")
-	seatNumber, name := getSeatNumber(positionId)
+	//
 	if data1 != nil && len(*data1) > 0 {
-		batchDraw(*data1, nowTime, seatNumber, name, positionId)
-		drawCount += len(*data1)
+		count := batchDraw(*data1, nowTime, seatNumber, name, positionId, "1")
+		drawCount += count
 	}
 	if data2 != nil && len(*data2) > 0 {
-		batchDraw(*data2, nowTime, seatNumber, name, positionId)
-		drawCount += len(*data2)
+		count := batchDraw(*data2, nowTime, seatNumber, name, positionId, "1")
+		drawCount += count
 	}
 	if data3 != nil && len(*data3) > 0 {
-		batchDraw(*data3, nowTime, seatNumber, name, positionId)
-		drawCount += len(*data3)
+		count := batchDraw(*data3, nowTime, seatNumber, name, positionId, "1")
+		drawCount += count
+	}
+	//
+	if count1 > 0 {
+		counts, counts1 := 0, 0
+		for {
+			counts1++
+			data := JyBiTidb.SelectBySql(`SELECT max(c.createTime) as ctime,a.id,a.trailstatus,a.cluename FROM dwd_f_crm_clue_info a 
+					LEFT JOIN Call_Accounting.voice_record c ON c.CalledNo = a.phone
+					WHERE a.level_open = 1 AND a.is_assign = 0 AND a.uid !="" AND a.is_transfer != 1 GROUP BY a.id ORDER BY ctime asc limit 1`)
+			if data != nil && len(*data) > 0 {
+				count := batchDraw(*data, nowTime, seatNumber, name, positionId, "2")
+				if count > 0 {
+					counts++
+				}
+			}
+			if counts == int(count1) {
+				drawCount += int(count1)
+				break
+			}
+			if counts1 > 5*int(count1) {
+				count2 += count1 - int64(counts)
+				break
+			}
+		}
+	}
+	if count2 > 0 {
+		counts, counts1 := 0, 0
+		for {
+			counts1++
+			data := JyBiTidb.SelectBySql(`SELECT max(c.createTime) as ctime,a.id,a.trailstatus FROM dwd_f_crm_clue_info a 
+					LEFT JOIN Call_Accounting.voice_record c ON c.CalledNo = a.phone
+					WHERE a.level_open = 2 AND a.is_assign = 0 AND a.uid !="" AND a.is_transfer != 1 GROUP BY a.id ORDER BY ctime asc limit 1`)
+			if data != nil && len(*data) > 0 {
+				count := batchDraw(*data, nowTime, seatNumber, name, positionId, "2")
+				if count > 0 {
+					counts++
+				}
+			}
+			if counts == int(count2) {
+				drawCount += int(count2)
+				break
+			}
+			if counts1 > 5*int(count2) {
+				count3 += count2 - int64(counts)
+				break
+			}
+		}
+	}
+	if count3 > 0 {
+		counts, counts1 := 0, 0
+		for {
+			counts1++
+			data := JyBiTidb.SelectBySql(`SELECT max(c.createTime) as ctime,a.id,a.trailstatus FROM dwd_f_crm_clue_info a 
+					LEFT JOIN Call_Accounting.voice_record c ON c.CalledNo = a.phone
+					WHERE a.level_open = 3 AND a.is_assign = 0 AND a.uid !="" AND a.is_transfer != 1 GROUP BY a.id ORDER BY ctime asc limit 1`)
+			if data != nil && len(*data) > 0 {
+				count := batchDraw(*data, nowTime, seatNumber, name, positionId, "2")
+				if count > 0 {
+					counts++
+				}
+			}
+			if counts == int(count3) {
+				drawCount += int(count3)
+				break
+			}
+		}
 	}
 	return drawCount
 }
 
-func batchDraw(data []map[string]interface{}, nowTime, seatNumber, name string, positionId int64) {
-	wg := new(sync.WaitGroup)
-	ch := make(chan bool, 20)
+func batchDraw(data []map[string]interface{}, nowTime, seatNumber, name string, positionId int64, dataType string) int {
+	count := 0
 	for _, v := range data {
-		wg.Add(1)
-		ch <- true
-		go func(v map[string]interface{}) {
-			defer func() {
-				wg.Done()
-				<-ch
-			}()
-			clueId := common.Int64All(v["id"])
-			trailstatus := common.ObjToString(v["trailstatus"])
-			if JyBiMysql.ExecTx("领取线索等", func(tx *sql.Tx) bool {
-				updateClue := map[string]interface{}{
-					"position_id":          positionId,
-					"seatNumber":           seatNumber,
-					"is_assign":            1,
-					"updatetime":           nowTime,
-					"comeintime":           nowTime,
-					"comeinsource_private": 3,
-					"is_task":              1,
-					"task_time":            nowTime,
-					"tasktime":             nowTime,
-					"taskstatus":           0,
-					"tasksource":           "领取公海线索",
-					"level_open":           nil,
-					"clue_level":           nil,
-					// "comeinsource_open":    nil,
-				}
-				if trailstatus != "08" {
-					updateClue["trailstatus"] = "01"
+		clueId := common.Int64All(v["id"])
+		cluename := common.ObjToString(v["cluename"])
+		if dataType == "2" {
+			cdata := JyBiMysql.FindOne("dwd_f_crm_clue_info", map[string]interface{}{"cluename": cluename, "is_assign": 1, "company_nature": 0, "company_verification": 1}, "", "")
+			if cdata != nil && len(*cdata) > 0 {
+				salePositionId := common.Int64All((*cdata)["position_id"])
+				if pcount := JyBiMysql.Count("dwd_f_crm_personnel_management", map[string]interface{}{"resign": 0, "position_id": salePositionId}); pcount > 0 {
+					return count
+				} else {
+					saledata := JyBiMysql.SelectBySql(`SELECT position_id from dwd_d_crm_department_level_succbi WHERE bi_pcode in (SELECT bi_pcode from dwd_d_crm_department_level_succbi WHERE position_id = ?) AND resign = 0`, salePositionId)
+					if saledata != nil && len(*saledata) > 0 {
+						isOk := false
+						for _, s := range *saledata {
+							sid := common.Int64All(s["position_id"])
+							if sid == positionId {
+								isOk = true
+							}
+						}
+						if !isOk {
+							return count
+						}
+					}
 				}
-				ok1 := JyBiTidb.UpdateByTx(tx, "dwd_f_crm_clue_info", map[string]interface{}{"id": clueId}, updateClue)
-				// ok2 := JyBiTidb.DeleteByTx(tx, "dwd_f_crm_open_sea", map[string]interface{}{"clue_id": clueId})
-				// seaId := JyBiTidb.InsertByTx(tx, "dwd_f_crm_private_sea", map[string]interface{}{
-				// 	"clue_id":      clueId,
-				// 	"seatNumber":   seatNumber,
-				// 	"position_id":  positionId,
-				// 	"comeintime":   nowTime,
-				// 	"comeinsource": 3,
-				// 	"is_task":      1,
-				// 	"task_time":    nowTime,
-				// 	"tasktime":     nowTime,
-				// 	"taskstatus":   0,
-				// 	"tasksource":   "领取公海线索",
-				// })
-				recordId := JyBiTidb.InsertByTx(tx, "dwd_f_crm_clue_change_record", map[string]interface{}{
+			}
+		}
+		trailstatus := common.ObjToString(v["trailstatus"])
+		if JyBiMysql.ExecTx("领取线索等", func(tx *sql.Tx) bool {
+			updateClue := map[string]interface{}{
+				"position_id":          positionId,
+				"seatNumber":           seatNumber,
+				"is_assign":            1,
+				"updatetime":           nowTime,
+				"comeintime":           nowTime,
+				"comeinsource_private": 3,
+				"is_task":              1,
+				"task_time":            nowTime,
+				"tasktime":             nowTime,
+				"taskstatus":           0,
+				"tasksource":           "领取公海线索",
+				"level_open":           nil,
+				"clue_level":           nil,
+			}
+			if trailstatus != "08" {
+				updateClue["trailstatus"] = "01"
+			}
+			ok1 := JyBiTidb.UpdateByTx(tx, "dwd_f_crm_clue_info", map[string]interface{}{"id": clueId}, updateClue)
+			recordId := JyBiTidb.InsertByTx(tx, "dwd_f_crm_clue_change_record", map[string]interface{}{
+				"clue_id":      clueId,
+				"position_id":  positionId,
+				"change_field": "position_id",
+				"change_type":  "所属人变更",
+				"old_value":    "/",
+				"new_value":    name,
+				"createtime":   nowTime,
+				"BCPCID":       common.GetRandom(32),
+				"operator_id":  positionId,
+			})
+			recordId1 := JyBiTidb.InsertByTx(tx, "dwd_f_crm_clue_change_record", map[string]interface{}{
+				"clue_id":     clueId,
+				"position_id": positionId,
+				"change_type": "领取公海线索",
+				"createtime":  nowTime,
+				"BCPCID":      common.GetRandom(32),
+				"operator_id": positionId,
+			})
+			recordId2 := JyBiTidb.InsertByTx(tx, "dwd_f_crm_clue_change_record", map[string]interface{}{
+				"clue_id":     clueId,
+				"position_id": positionId,
+				"change_type": "加入任务车",
+				"new_value":   "领取公海线索",
+				"createtime":  nowTime,
+				"BCPCID":      common.GetRandom(32),
+				"operator_id": positionId,
+			})
+			recordId3, recordId4 := int64(0), int64(0)
+			if trailstatus != "08" {
+				recordId3 = JyBiTidb.InsertByTx(tx, "dwd_f_crm_clue_change_record", map[string]interface{}{
 					"clue_id":      clueId,
 					"position_id":  positionId,
-					"change_field": "position_id",
-					"change_type":  "所属人变更",
-					"old_value":    "/",
-					"new_value":    name,
+					"change_field": "trailstatus",
+					"change_type":  "基本信息变更",
+					"old_value":    "商机线索",
+					"new_value":    "新增",
 					"createtime":   nowTime,
 					"BCPCID":       common.GetRandom(32),
 					"operator_id":  positionId,
 				})
-				recordId1 := JyBiTidb.InsertByTx(tx, "dwd_f_crm_clue_change_record", map[string]interface{}{
-					"clue_id":     clueId,
-					"position_id": positionId,
-					"change_type": "领取公海线索",
-					"createtime":  nowTime,
-					"BCPCID":      common.GetRandom(32),
-					"operator_id": positionId,
-				})
-				recordId2 := JyBiTidb.InsertByTx(tx, "dwd_f_crm_clue_change_record", map[string]interface{}{
-					"clue_id":     clueId,
-					"position_id": positionId,
-					"change_type": "加入任务车",
-					"new_value":   "领取公海线索",
-					"createtime":  nowTime,
-					"BCPCID":      common.GetRandom(32),
-					"operator_id": positionId,
+				recordId4 = JyBiTidb.InsertByTx(tx, "dwd_f_crm_clue_change_record", map[string]interface{}{
+					"clue_id":      clueId,
+					"position_id":  positionId,
+					"change_field": "trailstatus",
+					"change_type":  "基本信息变更",
+					"old_value":    CodeTrail[trailstatus],
+					"new_value":    "商机线索",
+					"createtime":   nowTime,
+					"BCPCID":       common.GetRandom(32),
+					"operator_id":  positionId,
 				})
-				recordId3, recordId4 := int64(0), int64(0)
-				if trailstatus != "08" {
-					recordId3 = JyBiTidb.InsertByTx(tx, "dwd_f_crm_clue_change_record", map[string]interface{}{
-						"clue_id":      clueId,
-						"position_id":  positionId,
-						"change_field": "trailstatus",
-						"change_type":  "基本信息变更",
-						"old_value":    "商机线索",
-						"new_value":    "新增",
-						"createtime":   nowTime,
-						"BCPCID":       common.GetRandom(32),
-						"operator_id":  positionId,
-					})
-					recordId4 = JyBiTidb.InsertByTx(tx, "dwd_f_crm_clue_change_record", map[string]interface{}{
-						"clue_id":      clueId,
-						"position_id":  positionId,
-						"change_field": "trailstatus",
-						"change_type":  "基本信息变更",
-						"old_value":    CodeTrail[trailstatus],
-						"new_value":    "商机线索",
-						"createtime":   nowTime,
-						"BCPCID":       common.GetRandom(32),
-						"operator_id":  positionId,
-					})
-				}
-				return ok1 && recordId > 0 && recordId1 > 0 && recordId2 > 0 && recordId3 > -1 && recordId4 > -1
-			}) {
-				log.Println("领取线索成功")
-			} else {
-				log.Println("领取线索失败")
 			}
-		}(v)
+			return ok1 && recordId > 0 && recordId1 > 0 && recordId2 > 0 && recordId3 > -1 && recordId4 > -1
+		}) {
+			log.Println("领取线索成功")
+			count++
+		} else {
+			log.Println("领取线索失败")
+		}
 	}
-	wg.Wait()
+	return count
 }
 
 func getSeatNumber(positionId int64) (seatNumber, name string) {
-	// positionData := JyTidb.FindOne("base_position", map[string]interface{}{"id": positionId}, "", "")
-	// if positionData != nil && len(*positionData) > 0 {
-	// 	userId := common.Int64All((*positionData)["user_id"])
-	// 	if userId > 0 {
-	// 		userData, ok := Mgo.FindOne("user", map[string]interface{}{"base_user_id": userId})
-	// 		if ok && userData != nil && len(*userData) > 0 {
-	// 			s_phone := common.ObjToString((*userData)["s_phone"])
-	// 			if s_phone == "" {
-	// 				s_phone = common.ObjToString((*userData)["s_m_phone"])
-	// 			}
-	// 			saleData := JyBiTidb.FindOne("jy_salesperson_info", map[string]interface{}{"phone": s_phone}, "", "")
-	// 			if saleData != nil && len(*saleData) > 0 {
-	// 				seatNumber = common.ObjToString((*saleData)["seatNumber"])
-	// 				name = common.ObjToString((*saleData)["name"])
-	// 			}
-	// 		}
-	// 	}
-	// }
 	saleData := JyBiTidb.FindOne("dwd_f_crm_personnel_management", map[string]interface{}{"position_id": positionId}, "", "")
 	if saleData != nil && len(*saleData) > 0 {
 		seatNumber = common.ObjToString((*saleData)["seat_number"])
@@ -836,6 +908,7 @@ func ClueImportSync(this *biservice.ClueImportReq) (string, int) {
 					cluename := common.ObjToString(v["cluename"])
 					name := common.ObjToString(v["name"])
 					position := common.ObjToString(v["position"])
+					isGroup, isCommerce := CompanyType(cluename)
 					clueData := JyBiTidb.FindOne("dwd_f_crm_clue_info", map[string]interface{}{"phone": phone}, "", "")
 					if clueData == nil || len(*clueData) == 0 {
 						countAdd++
@@ -854,22 +927,24 @@ func ClueImportSync(this *biservice.ClueImportReq) (string, int) {
 							})
 						}
 						clueId := JyBiTidb.Insert("dwd_f_crm_clue_info", map[string]interface{}{
-							"userid":            v["userId"],
-							"uid":               v["uId"],
-							"is_assign":         0,
-							"comeintime":        nowTime,
-							"createtime":        nowTime,
-							"updatetime":        nowTime,
-							"cluename":          cluename,
-							"top_cluetype":      v["top_cluetype"],
-							"sub_cluetype":      v["sub_cluetype"],
-							"trailstatus":       "01",
-							"name":              name,
-							"phone":             phone,
-							"position":          position,
-							"batch_import":      this.Pcbh,
-							"comeintime_open":   nowTime,
-							"comeinsource_open": 1,
+							"userid":               v["userId"],
+							"uid":                  v["uId"],
+							"is_assign":            0,
+							"comeintime":           nowTime,
+							"createtime":           nowTime,
+							"updatetime":           nowTime,
+							"cluename":             cluename,
+							"top_cluetype":         v["top_cluetype"],
+							"sub_cluetype":         v["sub_cluetype"],
+							"trailstatus":          "01",
+							"name":                 name,
+							"phone":                phone,
+							"position":             position,
+							"batch_import":         this.Pcbh,
+							"comeintime_open":      nowTime,
+							"comeinsource_open":    1,
+							"company_nature":       isGroup,
+							"company_verification": isCommerce,
 						})
 						JyBiTidb.Insert("dwd_f_crm_clue_change_record", map[string]interface{}{
 							"clue_id":     clueId,

+ 442 - 21
service/company.go

@@ -1,43 +1,464 @@
 package service
 
 import (
-	"bp.jydev.jianyu360.cn/BaseService/biService/entity"
+	"strconv"
+	"strings"
+
+	"log"
+	"sync"
+	"time"
+
+	"app.yhyue.com/moapp/jybase/common"
+	"app.yhyue.com/moapp/jybase/date"
+	. "bp.jydev.jianyu360.cn/BaseService/biService/entity"
 	"bp.jydev.jianyu360.cn/BaseService/biService/rpc/biservice"
 )
 
-/*
-判断是不是集团公司
-判断在不在工商库
-return
-1集团公司 2工商库  3都是  -1都不是
-*/
+// 判断是不是集团公司 判断在不在工商库 return 1集团公司 2工商库  3都是  -1都不是
 func GetCompanyType(this *biservice.CompanyReq) int {
 	status := -1
-
 	if this.CompanyName == "" {
 		return status
 	}
+	isGroup, isCommerce := CompanyType(this.CompanyName)
+	//判断
+	if isGroup && isCommerce {
+		status = 3
+	} else if isGroup {
+		status = 1
+	} else if isCommerce {
+		status = 2
+	}
+	return status
+}
 
+func CompanyType(companyName string) (bool, bool) {
+	isGroup, isCommerce := false, false
 	//是否是集团
-	isGroup := false
-	if c := entity.JyBiTidb.CountBySql(`select count(1) from group_company_name where company_name=?`, this.CompanyName); c > 0 {
+	if c := JyBiTidb.CountBySql(`select count(1) from group_company_name where company_name=?`, companyName); c > 0 {
 		isGroup = true
 	}
-
 	//是否在工商库
-	isCommerce := false
-	if c := entity.MgoQyxy.Count("qyxy_std", map[string]interface{}{"company_name": this.CompanyName}); c > 0 {
+	if c := MgoQyxy.Count("qyxy_std", map[string]interface{}{"company_name": companyName}); c > 0 {
 		isCommerce = true
 	}
+	return isGroup, isCommerce
+}
 
-	//判断
-	if isGroup && isCommerce {
-		status = 3
-	} else if isGroup {
-		status = 1
-	} else if isCommerce {
-		status = 2
+func DistributeClueShow(this *biservice.DistributeClueShowReq) *biservice.DistributeClueShowResp {
+	rdata := []*biservice.DistributeClueShowss{}
+	pArr := []string{}
+	for _, c := range this.Datas { //初始化返回数据
+		m := &biservice.DistributeClueShowss{}
+		m.PositionId = c.PositionId
+		m.ClueCount = 0
+		m.CompanyCounts = 0
+		if this.DataType == 1 {
+			m.CompanyCount = 0
+			m.MinCount = 0
+		} else {
+			m.CompanyCount = c.DistributedCount
+		}
+		rdata = append(rdata, m)
+		pArr = append(pArr, strconv.FormatInt(c.PositionId, 10))
+	}
+	clueArrs1 := []string{}
+	clueArrs := []string{}
+	clueArrSync := &sync.Mutex{}
+	sql1 := `SELECT b.cluename,b.position_id,count(*) as count FROM dwd_f_crm_clue_info a INNER JOIN (SELECT cluename,position_id FROM dwd_f_crm_clue_info WHERE position_id in (` + strings.Join(pArr, ",") + `) AND id not in (` + this.ClueIdList + `) AND company_nature = 0 AND company_verification = 1 GROUP BY cluename) AS b ON a.cluename = b.cluename WHERE id in (` + this.ClueIdList + `) GROUP BY cluename`
+	log.Println("sql1 ", sql1)
+	sdata := JyBiTidb.SelectBySql(sql1) //查这一批线索中属于当前分配人员的线索提前分配数量
+	if sdata != nil && len(*sdata) > 0 {
+		for _, v := range *sdata {
+			sPositionId := common.Int64All(v["position_id"])
+			count := common.IntAll(v["count"])
+			for k, r := range rdata {
+				if r.PositionId == sPositionId {
+					if this.DataType == 1 {
+						rdata[k].CompanyCount++
+						rdata[k].MinCount++
+						rdata[k].CompanyCounts++
+						rdata[k].ClueCount += int64(count)
+					} else {
+						if rdata[k].CompanyCounts < rdata[k].CompanyCount {
+							rdata[k].CompanyCounts++
+							rdata[k].ClueCount += int64(count)
+						}
+					}
+				}
+			}
+		}
 	}
+	sql2 := `SELECT a.id,b.position_id FROM dwd_f_crm_clue_info a INNER JOIN (SELECT id,cluename,position_id FROM dwd_f_crm_clue_info WHERE position_id in (` + strings.Join(pArr, ",") + `) AND id not in (` + this.ClueIdList + `) AND company_nature = 0 AND company_verification = 1 GROUP BY cluename) AS b ON a.cluename = b.cluename WHERE a.id in (` + this.ClueIdList + `)`
+	log.Println("sql2 ", sql2) //查这一批线索中属于当前分配人员的线索id,分出去,并且排除掉
+	ldata := JyBiTidb.SelectBySql(sql2)
+	if ldata != nil && len(*ldata) > 0 {
+		wg := new(sync.WaitGroup)
+		ch := make(chan bool, 20)
+		for _, a := range strings.Split(this.ClueIdList, ",") {
+			isOk := true
+			wg.Add(1)
+			ch <- true
+			go func(a string, isOk bool) {
+				defer func() {
+					wg.Done()
+					<-ch
+				}()
+				for _, v := range *ldata {
+					id := common.Int64All(v["id"])
+					positionId := common.Int64All(v["position_id"])
+					ids := strconv.FormatInt(id, 10)
+					if a == ids {
+						isOk = false
+						if this.DataType == 3 {
+							dclue(id, positionId, this.IsTask, this.PositionId) //分线索
+						}
+					}
+				}
+				if isOk {
+					clueArrSync.Lock()
+					clueArrs = append(clueArrs, a)
+					clueArrSync.Unlock()
+				}
+			}(a, isOk)
+		}
+		wg.Wait()
+	} else {
+		clueArrs = strings.Split(this.ClueIdList, ",")
+	}
+	log.Println("clueArrs ", clueArrs)
+	if len(clueArrs) > 0 {
+		sql0 := `SELECT a.cluename,a.id,b.position_id FROM dwd_f_crm_clue_info a INNER JOIN (SELECT a.cluename,a.position_id FROM dwd_f_crm_clue_info a INNER JOIN dwd_f_crm_personnel_management b on a.position_id = b.position_id WHERE a.cluename in (SELECT cluename FROM dwd_f_crm_clue_info WHERE id in (` + strings.Join(clueArrs, ",") + `) GROUP BY cluename) AND a.id not in (` + strings.Join(clueArrs, ",") + `) AND b.resign = 1 GROUP BY a.cluename) as b on b.cluename = a.cluename where a.id in (` + strings.Join(clueArrs, ",") + `)`
+		log.Println("sql0", sql0)
+		mdata := JyBiTidb.SelectBySql(sql0)
+		if mdata != nil && len(*mdata) > 0 {
+			nameMap := map[string][]int64{}
+			namePMap := map[string]int64{}
+			idMap := map[string]bool{}
+			for _, v := range *mdata {
+				cluename := common.ObjToString(v["cluename"])
+				id := common.Int64All(v["id"])
+				positionId := common.Int64All(v["position_id"])
+				nameMap[cluename] = append(nameMap[cluename], id)
+				namePMap[cluename] = positionId
+				ids := strconv.FormatInt(id, 10)
+				idMap[ids] = true
+			}
+			log.Println("nameMap ", nameMap)
+			log.Println("namePMap ", namePMap)
+			for _, v := range clueArrs {
+				if !idMap[v] {
+					clueArrs1 = append(clueArrs1, v)
+				}
+			}
+			for k, v := range nameMap {
+				ppdata := JyBiTidb.SelectBySql(`SELECT b.name,b.position_id,b.seat_number from dwd_d_crm_department_level_succbi a INNER JOIN dwd_f_crm_personnel_management b on a.position_id = b.position_id where a.bi_pcode = (SELECT bi_pcode from dwd_d_crm_department_level_succbi where position_id = ?) AND b.position_id != ?`, namePMap[k], namePMap[k])
+				if ppdata != nil && len(*ppdata) > 0 {
+					ppMap := map[int64]int{}
+					for _, vv := range *ppdata {
+						positionId := common.Int64All(vv["position_id"])
+						ppMap[positionId] = 0
+					}
+					isOk, sindex, paid := false, 0, int64(0)
+				L:
+					for pa, _ := range ppMap {
+						if pa > 0 {
+							for n, r := range rdata {
+								if r.PositionId == pa {
+									if this.DataType == 1 {
+										isOk = true
+										sindex = n
+										paid = pa
+										break L
+									} else {
+										if rdata[n].CompanyCounts < rdata[n].CompanyCount {
+											isOk = true
+											sindex = n
+											paid = pa
+											break L
+										}
+									}
+								}
+							}
+						}
+					}
+					log.Println("RDATA ", rdata[sindex].CompanyCount, rdata[sindex].MinCount, rdata[sindex].CompanyCounts, rdata[sindex].ClueCount, len(v))
+					if isOk {
+						if this.DataType == 1 {
+							rdata[sindex].CompanyCount++
+							rdata[sindex].MinCount++
+							rdata[sindex].CompanyCounts++
+							rdata[sindex].ClueCount += int64(len(v))
+						} else {
+							rdata[sindex].CompanyCounts++
+							rdata[sindex].ClueCount += int64(len(v))
+							if this.DataType == 3 {
+								for _, vv := range v {
+									dclue(vv, paid, this.IsTask, this.PositionId) //分线索
+								}
+							}
+						}
+					}
+					log.Println("RDATA2 ", rdata[sindex].CompanyCount, rdata[sindex].MinCount, rdata[sindex].CompanyCounts, rdata[sindex].ClueCount, len(v))
+				}
+			}
+		} else {
+			clueArrs1 = clueArrs
+		}
+	}
+	log.Println("clueArrs1 ", clueArrs1)
+	if len(clueArrs1) > 0 {
+		sql3 := `SELECT cluename,COUNT(*) AS count FROM dwd_f_crm_clue_info WHERE id in (` + strings.Join(clueArrs1, ",") + `) GROUP BY cluename ORDER BY count desc`
+		log.Println("sql3 ", sql3) //从大到小排列这一列线索名称分组及数量情况
+		cdata := JyBiTidb.SelectBySql(sql3)
+		if cdata != nil && len(*cdata) > 0 {
+			for _, v := range *cdata {
+				count := common.IntAll(v["count"])
+				cluename := common.ObjToString(v["cluename"])
+				minCount, minIndex := int64(0), 0
+				for k, r := range rdata {
+					if this.DataType == 1 {
+						if k == 0 {
+							minCount = r.CompanyCounts
+						}
+					} else {
+						if r.CompanyCounts < r.CompanyCount {
+							minCount = r.CompanyCounts
+						}
+					}
+				}
+				for _, r := range rdata {
+					if this.DataType == 1 {
+						if r.CompanyCounts < minCount {
+							minCount = r.CompanyCounts
+						}
+					} else {
+						if r.CompanyCounts < minCount && r.CompanyCounts < r.CompanyCount {
+							minCount = r.CompanyCounts
+						}
+					}
+				}
+				for k, r := range rdata {
+					if this.DataType == 1 {
+						if r.CompanyCounts <= minCount {
+							minCount = r.CompanyCounts
+							minIndex = k
+						}
+					} else {
+						if r.CompanyCounts <= minCount && r.CompanyCounts < r.CompanyCount {
+							minCount = r.CompanyCounts
+							minIndex = k
+						}
+					}
+				}
+				if this.DataType == 1 {
+					rdata[minIndex].CompanyCount++
+					rdata[minIndex].CompanyCounts++
+					rdata[minIndex].ClueCount += int64(count)
+				} else {
+					if rdata[minIndex].CompanyCounts < rdata[minIndex].CompanyCount {
+						rdata[minIndex].CompanyCounts++
+						rdata[minIndex].ClueCount += int64(count)
+					}
+				}
+				if this.DataType == 3 {
+					iddata := JyBiTidb.SelectBySql(`SELECT id FROM dwd_f_crm_clue_info WHERE cluename = "` + cluename + `" and id in (` + strings.Join(clueArrs1, ",") + `)`)
+					if iddata != nil { //分线索
+						wg := new(sync.WaitGroup)
+						ch := make(chan bool, 10)
+						for _, i := range *iddata {
+							wg.Add(1)
+							ch <- true
+							go func(i map[string]interface{}) {
+								defer func() {
+									wg.Done()
+									<-ch
+								}()
+								id := common.Int64All(i["id"])
+								dclue(id, rdata[minIndex].PositionId, this.IsTask, this.PositionId)
+							}(i)
+						}
+						wg.Wait()
+					}
+				}
+			}
+		}
+	}
+	return &biservice.DistributeClueShowResp{
+		ErrorCode: 0,
+		Data:      rdata,
+	}
+}
 
-	return status
+func dclue(v, positionId, isTask, thispositionId int64) {
+	clueData := JyBiTidb.FindOne("dwd_f_crm_clue_info", map[string]interface{}{"id": v}, "", "")
+	nowTime := time.Now().Format(date.Date_Full_Layout)
+	if clueData != nil && len(*clueData) > 0 {
+		isAssign := common.IntAll((*clueData)["is_assign"])
+		clueSeatNumber := common.ObjToString((*clueData)["seatNumber"])
+		oldName, seatNumber, name := "", "", ""
+		trailstatus := common.ObjToString((*clueData)["trailstatus"])
+		saleData := JyBiTidb.SelectBySql(`select * from dwd_f_crm_personnel_management where seat_number != "" and seat_number is not null`)
+		if saleData != nil && len(*saleData) > 0 {
+			for _, v := range *saleData {
+				if common.ObjToString(v["seat_number"]) == clueSeatNumber {
+					oldName = common.ObjToString(v["name"])
+				}
+				if common.Int64All(v["position_id"]) == positionId {
+					seatNumber = common.ObjToString(v["seat_number"])
+					name = common.ObjToString(v["name"])
+				}
+			}
+		}
+		if isAssign == 1 {
+			oldpositionId := common.Int64All((*clueData)["position_id"])
+			updateClue := map[string]interface{}{
+				"position_id":          positionId,
+				"seatNumber":           seatNumber,
+				"is_assign":            1,
+				"updatetime":           nowTime,
+				"comeintime":           nowTime,
+				"comeinsource_private": 4,
+				"level_open":           nil,
+				"clue_level":           nil,
+				"out_task_time":        nil,
+				"out_task_status":      nil,
+			}
+			if oldName != name {
+				updateClue["start_trail_time"] = nil
+				updateClue["next_trail_time"] = nil
+			}
+			if isTask == int64(1) {
+				updateClue["is_task"] = 1
+				updateClue["task_time"] = nowTime
+				updateClue["tasktime"] = nowTime
+				updateClue["taskstatus"] = 0
+				updateClue["tasksource"] = "主动分配客户"
+				JyBiTidb.Insert("dwd_f_crm_clue_change_record", map[string]interface{}{
+					"clue_id":     v,
+					"position_id": positionId,
+					"change_type": "加入任务车",
+					"new_value":   "主动分配客户",
+					"createtime":  nowTime,
+					"BCPCID":      common.GetRandom(32),
+					"operator_id": thispositionId,
+				})
+			}
+			ok := JyBiTidb.Update("dwd_f_crm_clue_info", map[string]interface{}{"id": v}, updateClue)
+			if ok {
+				JyBiTidb.Insert("dwd_f_crm_clue_change_record", map[string]interface{}{
+					"clue_id":      v,
+					"position_id":  positionId,
+					"change_field": "position_id",
+					"change_type":  "所属人变更",
+					"old_value":    oldName,
+					"new_value":    name,
+					"createtime":   nowTime,
+					"BCPCID":       common.GetRandom(32),
+					"operator_id":  thispositionId,
+				})
+				JyBiTidb.Insert("dwd_f_crm_clue_change_record", map[string]interface{}{
+					"clue_id":      v,
+					"position_id":  oldpositionId,
+					"change_field": "trailstatus",
+					"change_type":  "基本信息变更",
+					"old_value":    CodeTrail[trailstatus],
+					"new_value":    "流失",
+					"createtime":   nowTime,
+					"BCPCID":       common.GetRandom(32),
+					"operator_id":  thispositionId,
+				})
+				JyBiTidb.Insert("dwd_f_crm_clue_change_record", map[string]interface{}{
+					"clue_id":      v,
+					"position_id":  positionId,
+					"change_field": "trailstatus",
+					"change_type":  "基本信息变更",
+					"old_value":    CodeTrail[trailstatus],
+					"new_value":    "新增",
+					"createtime":   nowTime,
+					"BCPCID":       common.GetRandom(32),
+					"operator_id":  thispositionId,
+				})
+			} else {
+				log.Println("私海修改失败 ", v, positionId, seatNumber)
+			}
+		} else {
+			updateClue := map[string]interface{}{
+				"position_id":          positionId,
+				"seatNumber":           seatNumber,
+				"is_assign":            1,
+				"updatetime":           nowTime,
+				"comeintime":           nowTime,
+				"comeinsource_private": 4,
+				"is_task":              0,
+				"taskstatus":           0,
+				"level_open":           nil,
+				"clue_level":           nil,
+				"out_task_time":        nil,
+				"out_task_status":      nil,
+				"next_trail_time":      nil,
+				"start_trail_time":     nil,
+				// "comeinsource_open":    nil,
+			}
+			if trailstatus != "08" {
+				updateClue["trailstatus"] = "01"
+			}
+			if isTask == int64(1) {
+				updateClue["is_task"] = 1
+				updateClue["task_time"] = nowTime
+				updateClue["tasktime"] = nowTime
+				updateClue["taskstatus"] = 0
+				updateClue["tasksource"] = "主动分配客户"
+				JyBiTidb.Insert("dwd_f_crm_clue_change_record", map[string]interface{}{
+					"clue_id":     v,
+					"position_id": positionId,
+					"change_type": "加入任务车",
+					"new_value":   "主动分配客户",
+					"createtime":  nowTime,
+					"BCPCID":      common.GetRandom(32),
+					"operator_id": thispositionId,
+				})
+			}
+			ok := JyBiTidb.Update("dwd_f_crm_clue_info", map[string]interface{}{"id": v}, updateClue)
+			if ok {
+				JyBiTidb.Insert("dwd_f_crm_clue_change_record", map[string]interface{}{
+					"clue_id":      v,
+					"position_id":  positionId,
+					"change_field": "position_id",
+					"change_type":  "所属人变更",
+					"old_value":    "/",
+					"new_value":    name,
+					"createtime":   nowTime,
+					"BCPCID":       common.GetRandom(32),
+					"operator_id":  thispositionId,
+				})
+				if trailstatus != "08" {
+					JyBiTidb.Insert("dwd_f_crm_clue_change_record", map[string]interface{}{
+						"clue_id":      v,
+						"position_id":  positionId,
+						"change_field": "trailstatus",
+						"change_type":  "基本信息变更",
+						"old_value":    "商机线索",
+						"new_value":    "新增",
+						"createtime":   nowTime,
+						"BCPCID":       common.GetRandom(32),
+						"operator_id":  thispositionId,
+					})
+					JyBiTidb.Insert("dwd_f_crm_clue_change_record", map[string]interface{}{
+						"clue_id":      v,
+						"position_id":  positionId,
+						"change_field": "trailstatus",
+						"change_type":  "基本信息变更",
+						"old_value":    CodeTrail[trailstatus],
+						"new_value":    "商机线索",
+						"createtime":   nowTime,
+						"BCPCID":       common.GetRandom(32),
+						"operator_id":  thispositionId,
+					})
+				}
+			} else {
+				log.Println("私海插入失败 ", v, positionId, seatNumber)
+			}
+		}
+	}
 }

+ 115 - 13
service/exprot.go

@@ -1,6 +1,7 @@
 package service
 
 import (
+	"app.yhyue.com/moapp/jybase/common"
 	"app.yhyue.com/moapp/jybase/mail"
 	"archive/zip"
 	. "bp.jydev.jianyu360.cn/BaseService/biService/entity"
@@ -26,6 +27,15 @@ type ExportReq struct {
 	PositionId int64
 }
 
+type ExportByDbReq struct {
+	Token   string
+	Title   string
+	Content string
+	Mails   string
+	Query   string
+	Stype   string
+}
+
 // 全量项目导出
 func (a *ExportReq) AllProjectExport() {
 	tableColumn := []string{}
@@ -41,7 +51,8 @@ func (a *ExportReq) AllProjectExport() {
 	timeStr = fmt.Sprintf("%s%s", timeStr, gconv.String(randomInt))
 	pathArr := export("customer_data_ttzl_project", tableColumn, exportKey, timeStr)
 	if len(pathArr) > 0 {
-		pathstr := compressFiles(pathArr, timeStr)
+		folderPath := fmt.Sprintf("%s/%s", ExportDirectory, timeStr)
+		pathstr := compressFiles(pathArr, folderPath, ExportUrl, timeStr)
 		state := sendMail("项目", a.Mail, pathstr)
 		BiService.Insert("export_record", map[string]interface{}{
 			"positionId": a.PositionId,
@@ -69,7 +80,8 @@ func (a *ExportReq) AllInfoExport() {
 	timeStr = fmt.Sprintf("%s%s", timeStr, gconv.String(randomInt))
 	pathArr := export("customer_data_ttzl", tableColumn, exportKey, timeStr)
 	if len(pathArr) > 0 {
-		pathstr := compressFiles(pathArr, timeStr)
+		folderPath := fmt.Sprintf("%s/%s", ExportDirectory, timeStr)
+		pathstr := compressFiles(pathArr, folderPath, ExportUrl, timeStr)
 		state := sendMail("标讯", a.Mail, pathstr)
 		BiService.Insert("export_record", map[string]interface{}{
 			"positionId": a.PositionId,
@@ -94,7 +106,7 @@ func export(table string, tableColumn []string, key []interface{}, timeStr strin
 		if a%ExportCount == 0 && a > 0 {
 			a = 0
 			//入excel处理
-			writer, file, path = Warehousing(writer, file, fileCounter, key, timeStr)
+			writer, file, path = Warehousing(writer, file, fileCounter, key, ExportDirectory, timeStr)
 			fileCounter++
 			pathArr = append(pathArr, path)
 		}
@@ -103,7 +115,7 @@ func export(table string, tableColumn []string, key []interface{}, timeStr strin
 		return true
 	}, sqlStr)
 	if a > 0 && a != ExportCount {
-		writer, file, path = Warehousing(writer, file, fileCounter, key, timeStr)
+		writer, file, path = Warehousing(writer, file, fileCounter, key, ExportDirectory, timeStr)
 		pathArr = append(pathArr, path)
 	}
 	return pathArr
@@ -122,10 +134,10 @@ func dataHandle(writer *excelize.StreamWriter, l *[]map[string]interface{}, a in
 }
 
 // 入excel
-func Warehousing(writer *excelize.StreamWriter, file *excelize.File, fileCounter int, key []interface{}, timeStr string) (*excelize.StreamWriter, *excelize.File, string) {
+func Warehousing(writer *excelize.StreamWriter, file *excelize.File, fileCounter int, key []interface{}, path, timeStr string) (*excelize.StreamWriter, *excelize.File, string) {
 	log.Println(fmt.Sprintf("开始第%d数据", fileCounter))
 	writer.Flush()
-	folderPath := fmt.Sprintf("%s/%s", ExportDirectory, timeStr)
+	folderPath := fmt.Sprintf("%s/%s", path, timeStr)
 	_, err := os.Stat(folderPath)
 	if os.IsNotExist(err) {
 		//创建文件夹
@@ -151,7 +163,7 @@ func InirWrite(key []interface{}) (*excelize.StreamWriter, *excelize.File) {
 	file.SetSheetName("Sheet1", "表1")
 	//创建流式写入
 	writer, _ := file.NewStreamWriter("表1")
-	// 定义每个 Excel 文件的数据数限制
+	// 定义每个 Excel 文件的数据数限制
 	writer.SetRow("A1", key)
 	return writer, file
 }
@@ -178,17 +190,16 @@ func sendMail(title, target_mail string, path string) bool {
 }
 
 // 文件压缩
-func compressFiles(filePattern []string, timeStr string) string {
-	folderPath := fmt.Sprintf("%s/%s", ExportDirectory, timeStr)
-	_, err := os.Stat(folderPath)
+func compressFiles(filePattern []string, url, path, timeStr string) string {
+	_, err := os.Stat(path)
 	if os.IsNotExist(err) {
 		//创建文件夹
-		err := os.MkdirAll(folderPath, os.ModePerm)
+		err := os.MkdirAll(path, os.ModePerm)
 		if err != nil {
 			log.Println("创建文件夹失败:", err)
 		}
 	}
-	zipFilename := fmt.Sprintf("%s/%s.zip", folderPath, timeStr)
+	zipFilename := fmt.Sprintf("%s/%s.zip", path, timeStr)
 	// 创建 ZIP 文件
 	zipFile, err := os.Create(zipFilename)
 	if err != nil {
@@ -234,5 +245,96 @@ func compressFiles(filePattern []string, timeStr string) string {
 		log.Fatal(err)
 	}
 	log.Printf("Files compressed to: %s", absPath)
-	return fmt.Sprintf("%s/%s/%s.zip", ExportUrl, timeStr, timeStr)
+	return fmt.Sprintf("%s/%s/%s.zip", url, timeStr, timeStr)
+}
+
+// 数据导出(通用)
+func (e *ExportByDbReq) ExportDataByDb() []byte {
+
+	key := hName(e.Query)
+	timeStr := time.Now().Format("20060102150405")
+	rand.Seed(time.Now().UnixNano())
+	randomInt := rand.Intn(10000) // 生成0到9999之间的随机整数
+	timeStr = fmt.Sprintf("%s%s", timeStr, gconv.String(randomInt))
+	stype := e.Stype
+	if stype == "" {
+		stype = "public"
+	}
+	folderPath := fmt.Sprintf("%s/%s", ComFileDir, stype)
+	pathArr := exportA(e.Query, folderPath, timeStr, key)
+	if len(pathArr) > 0 {
+		folderPath = fmt.Sprintf("%s/%s", folderPath, timeStr)
+		pathstr := compressFiles(pathArr, ComFileUrl, folderPath, timeStr)
+		state := sendMailA(e.Title, e.Mails, e.Content, pathstr)
+
+		BiService.Insert("export_record", map[string]interface{}{
+			"positionId": "0",
+			"type":       stype,
+			"excelPath":  strings.Join(pathArr, ","),
+			"zipPath":    pathstr,
+			"sendState":  state,
+			"createTime": time.Now().Format(DateTime),
+		})
+		return gconv.Bytes(map[string]interface{}{"status": 1, "msg": "导出数据成功"})
+	}
+	return gconv.Bytes(map[string]interface{}{"status": -1, "msg": "导出数据失败,未查询到数据"})
+}
+
+// 表头
+func hName(sql string) []interface{} {
+	var key []interface{}
+	s := strings.Split(strings.ToLower(sql), "from")
+	keystr := strings.ReplaceAll(s[0], "select", "")
+	keystr = strings.ReplaceAll(keystr, " ", "")
+	for _, s1 := range strings.Split(keystr, ",") {
+		if strings.Contains(s1, "as") {
+			key = append(key, strings.Split(s1, "as")[1])
+		}
+	}
+	return key
+}
+
+// 导出开始
+func exportA(sql, path, timeStr string, key []interface{}) []string {
+	pathArr := []string{}
+	fileCounter := 1
+	writer, file := InirWrite(key)
+	a := 0
+	fpath := ""
+	BiService.SelectByBath(1, func(l *[]map[string]interface{}) bool {
+		if a%ExportCount == 0 && a > 0 {
+			a = 0
+			//入excel处理
+			writer, file, fpath = Warehousing(writer, file, fileCounter, key, path, timeStr)
+			fileCounter++
+			pathArr = append(pathArr, fpath)
+		}
+		dataHandle(writer, l, a, common.ObjArrToStringArr(key))
+		a++
+		return true
+	}, sql)
+	if a > 0 && a != ExportCount {
+		writer, file, fpath = Warehousing(writer, file, fileCounter, key, path, timeStr)
+		pathArr = append(pathArr, fpath)
+	}
+	return pathArr
+}
+
+func sendMailA(title, target_mail, content string, path string) bool {
+	html := strings.ReplaceAll(content, "#downLoadUrl#", path)
+	fool := false
+	for k, v := range GmailAuth {
+		fool := mail.GSendMail("剑鱼标讯", target_mail, "", "", fmt.Sprintf("%s数据导出", title), html, "", "", v)
+		if fool {
+			log.Println(target_mail, fmt.Sprintf("使用%s发送邮件成功", v.User))
+			break
+		}
+		if k < len(GmailAuth)-1 {
+			log.Println(target_mail, fmt.Sprintf("使用%s发送邮件失败!3s后使用其他邮箱尝试", v.User))
+		} else {
+			log.Println(target_mail, fmt.Sprintf("使用%s发送邮件失败!", v.User))
+		}
+		time.Sleep(time.Second * 3)
+	}
+	return fool
 }