wangchuanjin 5 сар өмнө
parent
commit
228d2d7220

+ 20 - 4
api/aiSearch/v1/aiSearchApi.go

@@ -63,10 +63,9 @@ type ChatReq struct {
 }
 }
 
 
 type ChatRes struct {
 type ChatRes struct {
-	ErrorCode int                      `dc:"状态码"`
-	Answer    string                   `dc:"答案"`
-	Count     int                      `dc:"列表长度"`
-	List      []map[string]interface{} `dc:"列表"`
+	Status int           `json:"status" dc:"状态码;0:服务器繁忙 1:成功"`
+	Count  int           `json:"count" dc:"列表长度"`
+	List   []*ResBidding `json:"list" dc:"答案列表"`
 }
 }
 
 
 type BiddingListReq struct {
 type BiddingListReq struct {
@@ -78,3 +77,20 @@ type BiddingListRes struct {
 	ErrorMsg  string      `dc:"错误信息"`
 	ErrorMsg  string      `dc:"错误信息"`
 	Data      interface{} `dc:"返回数据"`
 	Data      interface{} `dc:"返回数据"`
 }
 }
+type ResBidding struct {
+	InfoId        string `json:"infoId" dc:"内容"`
+	Id            string `json:"id" dc:""`
+	Title         string `json:"title" dc:"标题"`
+	Area          string `json:"area" dc:"地区"`
+	City          string `json:"city" dc:"地区"`
+	District      string `json:"district" dc:"地区"`
+	Subtype       string `json:"subtype" dc:"信息类型"`
+	Industry      string `json:"industry" dc:"信息行业"`
+	Annex         int    `json:"annex" dc:"是否有附件;0:否 1:是"`
+	Subscopeclass string `json:"subscopeclass" dc:"信息行业"`
+	Buyerclass    string `json:"buyerclass" dc:"采购单位行业"`
+	Budget        int64  `json:"budget" dc:"预算"`
+	Bidamount     int64  `json:"bidamount" dc:"中标金额"`
+	Publishtime   int64  `json:"publishtime" dc:"发布时间"`
+	Collect       int    `json:"collect" dc:"是否收藏;0:否 1:是"`
+}

+ 3 - 18
internal/controller/aiSearch/aiSearch_v1_bidding_list.go

@@ -3,15 +3,16 @@ package aiSearch
 import (
 import (
 	"aiChat/api/aiSearch/v1"
 	"aiChat/api/aiSearch/v1"
 	"aiChat/internal/model"
 	"aiChat/internal/model"
-	"app.yhyue.com/moapp/jybase/encrypt"
 	"context"
 	"context"
 	"fmt"
 	"fmt"
+
+	"app.yhyue.com/moapp/jybase/encrypt"
 	"github.com/gogf/gf/v2/frame/g"
 	"github.com/gogf/gf/v2/frame/g"
 	"github.com/gogf/gf/v2/util/gconv"
 	"github.com/gogf/gf/v2/util/gconv"
 )
 )
 
 
 func (c *ControllerV1) BiddingList(ctx context.Context, req *v1.BiddingListReq) (res *v1.BiddingListRes, err error) {
 func (c *ControllerV1) BiddingList(ctx context.Context, req *v1.BiddingListReq) (res *v1.BiddingListRes, err error) {
-	var hTmp []ResBidding
+	var hTmp []v1.ResBidding
 	session := model.SessionCtx.Get(ctx).JSession
 	session := model.SessionCtx.Get(ctx).JSession
 	if session.PositionId <= 0 {
 	if session.PositionId <= 0 {
 		return nil, fmt.Errorf("请登录")
 		return nil, fmt.Errorf("请登录")
@@ -38,19 +39,3 @@ func (c *ControllerV1) BiddingList(ctx context.Context, req *v1.BiddingListReq)
 		Data:      hTmp,
 		Data:      hTmp,
 	}, nil
 	}, nil
 }
 }
-
-type ResBidding struct {
-	InfoId         string  `json:"infoId" dc:"内容"`
-	Id             string  `json:"id" dc:""`
-	Title          string  `json:"title" dc:"标题"`
-	Area           string  `json:"area" dc:"地区"`
-	Subtype        string  `json:"subtype" dc:"信息类型"`
-	Annex          string  `json:"annex" dc:"是否有附件;0:否 1:是"`
-	Subscopeclass  string  `json:"subscopeclass" dc:"信息行业"`
-	Buyerclass     string  `json:"buyerclass" dc:"采购单位行业"`
-	Budget         float64 `json:"budget" dc:"预算"`
-	Bidanount      float64 `json:"bidanount" dc:"中标金额"`
-	Publishtime    int64   `json:"publishtime" dc:"发布时间"`
-	Create_time    string  `json:"create_time" dc:"创建时间"`
-	PublishtimeStr string  `json:"publishtimeStr" dc:"发布时间"`
-}

+ 62 - 16
internal/controller/aiSearch/aiSearch_v1_chat.go

@@ -4,28 +4,33 @@ import (
 	"aiChat/api/aiSearch/v1"
 	"aiChat/api/aiSearch/v1"
 	"aiChat/internal/model"
 	"aiChat/internal/model"
 	"aiChat/internal/model/bidSearch"
 	"aiChat/internal/model/bidSearch"
+	"aiChat/utility"
 	"context"
 	"context"
 	"fmt"
 	"fmt"
 	"io/ioutil"
 	"io/ioutil"
 	"strings"
 	"strings"
 	"time"
 	"time"
 
 
-	"github.com/gogf/gf/v2/util/gconv"
-
 	. "app.yhyue.com/moapp/jybase/encrypt"
 	. "app.yhyue.com/moapp/jybase/encrypt"
 	"github.com/gogf/gf/v2/database/gdb"
 	"github.com/gogf/gf/v2/database/gdb"
 	"github.com/gogf/gf/v2/encoding/gjson"
 	"github.com/gogf/gf/v2/encoding/gjson"
 	"github.com/gogf/gf/v2/frame/g"
 	"github.com/gogf/gf/v2/frame/g"
 	"github.com/gogf/gf/v2/os/gtime"
 	"github.com/gogf/gf/v2/os/gtime"
+	"github.com/gogf/gf/v2/util/gconv"
 )
 )
 
 
 func (c *ControllerV1) Chat(ctx context.Context, req *v1.ChatReq) (res *v1.ChatRes, err error) {
 func (c *ControllerV1) Chat(ctx context.Context, req *v1.ChatReq) (res *v1.ChatRes, err error) {
-	res = &v1.ChatRes{ErrorCode: 0}
+	res = &v1.ChatRes{Status: 0}
 	sid := gconv.Int64(SE.Decode4HexByCheck(req.SId))
 	sid := gconv.Int64(SE.Decode4HexByCheck(req.SId))
 	if sid == 0 {
 	if sid == 0 {
 		g.Log().Error(ctx, "无效的sid参数", req.SId)
 		g.Log().Error(ctx, "无效的sid参数", req.SId)
 		return
 		return
 	}
 	}
+	sess, sessErr := model.GetSession(g.RequestFromCtx(ctx))
+	if sessErr != nil {
+		g.Log().Error(ctx, "获取session出错", sessErr)
+		return
+	}
 	startTime := gtime.Now().Format("Y-m-d h:m:s.u")
 	startTime := gtime.Now().Format("Y-m-d h:m:s.u")
 	success := 0
 	success := 0
 	prompt := fmt.Sprintf(g.Cfg("ai_search.yaml").MustGet(ctx, "doubaoPrompt").String(), gtime.Now().Format("Ymd"), req.Question)
 	prompt := fmt.Sprintf(g.Cfg("ai_search.yaml").MustGet(ctx, "doubaoPrompt").String(), gtime.Now().Format("Ymd"), req.Question)
@@ -40,6 +45,7 @@ func (c *ControllerV1) Chat(ctx context.Context, req *v1.ChatReq) (res *v1.ChatR
 			large_model_success = 0
 			large_model_success = 0
 		}
 		}
 		callLogs = append(callLogs, g.Map{
 		callLogs = append(callLogs, g.Map{
+			"position_id":           sess.PositionId,
 			"large_model":           large_model,
 			"large_model":           large_model,
 			"large_model_reply":     largeModelReply,
 			"large_model_reply":     largeModelReply,
 			"large_model_starttime": startTime,
 			"large_model_starttime": startTime,
@@ -59,6 +65,7 @@ func (c *ControllerV1) Chat(ctx context.Context, req *v1.ChatReq) (res *v1.ChatR
 			large_model_success = 0
 			large_model_success = 0
 		}
 		}
 		callLogs = append(callLogs, g.Map{
 		callLogs = append(callLogs, g.Map{
+			"position_id":           sess.PositionId,
 			"large_model":           large_model,
 			"large_model":           large_model,
 			"large_model_reply":     largeModelReply,
 			"large_model_reply":     largeModelReply,
 			"large_model_starttime": startTime,
 			"large_model_starttime": startTime,
@@ -73,16 +80,30 @@ func (c *ControllerV1) Chat(ctx context.Context, req *v1.ChatReq) (res *v1.ChatR
 	} else {
 	} else {
 		large_model = ""
 		large_model = ""
 	}
 	}
-	sess, sessErr := model.GetSession(g.RequestFromCtx(ctx))
-	if sessErr != nil {
-		return
-	}
 	bs, bsErr := bidSearch.NewBidSearch(ctx, sess.PersonId, content)
 	bs, bsErr := bidSearch.NewBidSearch(ctx, sess.PersonId, content)
 	if bsErr != nil {
 	if bsErr != nil {
 		return
 		return
 	}
 	}
 	query, list := bs.Search()
 	query, list := bs.Search()
 	answer := ""
 	answer := ""
+	var bestBids []*v1.ResBidding
+	if len(list) > 0 {
+		if bestBidListMaxLen := g.Cfg("ai_search.yaml").MustGet(ctx, "bestBidListMaxLen").Int(); len(list) > bestBidListMaxLen {
+			bestBids = make([]*v1.ResBidding, bestBidListMaxLen)
+			copy(bestBids, list[:bestBidListMaxLen])
+		} else {
+			bestBids = make([]*v1.ResBidding, len(list))
+			copy(bestBids, list[:])
+		}
+		answer = gconv.String(bestBids)
+		collection := utility.GetMyBidCollect(ctx, sess.PositionId)
+		for _, v := range bestBids {
+			if collection[v.InfoId] {
+				v.Collect = 1
+			}
+			v.InfoId = EncodeArticleId2ByCheck(v.InfoId)
+		}
+	}
 	if err := g.DB().Transaction(ctx, func(ctx context.Context, tx gdb.TX) error {
 	if err := g.DB().Transaction(ctx, func(ctx context.Context, tx gdb.TX) error {
 		chatId, chatErr := tx.InsertAndGetId("ai_search_chat", g.Map{
 		chatId, chatErr := tx.InsertAndGetId("ai_search_chat", g.Map{
 			"position_id":         sess.PositionId,
 			"position_id":         sess.PositionId,
@@ -105,22 +126,47 @@ func (c *ControllerV1) Chat(ctx context.Context, req *v1.ChatReq) (res *v1.ChatR
 			return chatErr
 			return chatErr
 		}
 		}
 		//
 		//
-		// bids := g.List{}
-		// for _, v := range list {
-		// 	bids = append(bids, g.Map{
-		// 		"position_id": sess.PositionId,
-		// 		"chat_id":     chatId,
-		// 	})
-		// }
+		bids := g.List{}
+		for _, v := range list {
+			bids = append(bids, g.Map{
+				"position_id": sess.PositionId,
+				"chat_id":     chatId,
+				"infoid":      v.InfoId,
+				"title":       v.Title,
+				"area":        v.Area,
+				"city":        v.City,
+				"district":    v.District,
+				"subtype":     v.Subtype,
+				"industry":    v.Industry,
+				"annex":       v.Annex,
+				"buyerclass":  v.Buyerclass,
+				"budget":      v.Budget,
+				"bidamount":   v.Bidamount,
+				"publishtime": v.Publishtime,
+				"create_time": gtime.Datetime(),
+			})
+		}
+		if len(bids) > 0 {
+			if _, bidsErr := tx.Insert("ai_search_bidding", bids, 200); bidsErr != nil {
+				g.Log().Error(ctx, "ai_search_bidding保存出错", bidsErr)
+				return bidsErr
+			}
+		}
 		//
 		//
 		for _, v := range callLogs {
 		for _, v := range callLogs {
 			v["chat_id"] = chatId
 			v["chat_id"] = chatId
 			v["create_time"] = gtime.Datetime()
 			v["create_time"] = gtime.Datetime()
 		}
 		}
+		if len(callLogs) > 0 {
+			if _, callLogsErr := tx.Insert("ai_search_log", callLogs); callLogsErr != nil {
+				g.Log().Error(ctx, "ai_search_log保存出错", callLogsErr)
+				return callLogsErr
+			}
+		}
 		return nil
 		return nil
 	}); err == nil {
 	}); err == nil {
-		res.ErrorCode = 1
-		res.List = list
+		res.Status = 1
+		res.List = bestBids
 	} else {
 	} else {
 		g.Log().Error(ctx, sess.PositionId, "保存数据库出错", err)
 		g.Log().Error(ctx, sess.PositionId, "保存数据库出错", err)
 	}
 	}

+ 28 - 24
internal/model/bidSearch/bidSearch.go

@@ -1,6 +1,7 @@
 package bidSearch
 package bidSearch
 
 
 import (
 import (
+	"aiChat/api/aiSearch/v1"
 	"context"
 	"context"
 	"fmt"
 	"fmt"
 	"strconv"
 	"strconv"
@@ -8,7 +9,6 @@ import (
 	"time"
 	"time"
 
 
 	. "app.yhyue.com/moapp/jybase/common"
 	. "app.yhyue.com/moapp/jybase/common"
-	. "app.yhyue.com/moapp/jybase/encrypt"
 	elastic "app.yhyue.com/moapp/jybase/es"
 	elastic "app.yhyue.com/moapp/jybase/es"
 	"github.com/gogf/gf/v2/encoding/gjson"
 	"github.com/gogf/gf/v2/encoding/gjson"
 	"github.com/gogf/gf/v2/frame/g"
 	"github.com/gogf/gf/v2/frame/g"
@@ -163,32 +163,36 @@ func NewBidSearch(ctx context.Context, positionId int64, content string) (*BidSe
 	return bs, nil
 	return bs, nil
 }
 }
 
 
-func (b *BidSearch) Search() (string, []map[string]interface{}) {
+func (b *BidSearch) Search() (string, []*v1.ResBidding) {
 	qstr := b.GetSearchQuery()
 	qstr := b.GetSearchQuery()
 	list := elastic.Get(INDEX, TYPE, qstr)
 	list := elastic.Get(INDEX, TYPE, qstr)
-	result := []map[string]interface{}{}
-	if list != nil {
-		for _, v := range *list {
-			m := map[string]interface{}{
-				"id":          EncodeArticleId2ByCheck(ObjToString(v["_id"])),                                     //ME.EncodeArticleId2ByCheck(ObjToString(v["_id"]))                                         //加密信息id
-				"area":        ObjToString(v["area"]),                                                             //地区
-				"buyerClass":  ObjToString(v["buyerclass"]),                                                       //采购单位类型
-				"city":        ObjToString(v["city"]),                                                             //城市
-				"district":    ObjToString(v["district"]),                                                         // 区县       //城市
-				"industry":    b.IndustryFormat(b.Industry, strings.Trim(ObjToString(v["s_subscopeclass"]), ",")), //行业
-				"publishTime": Int64All(v["publishtime"]),                                                         //发布时间
-				"subtype":     ObjToString(v["subtype"]),                                                          //信息类型
-				"title":       ObjToString(v["title"]),
-			}
-			m["fileExists"], _ = v["isValidFile"].(bool)               //是否有附件
-			if budget, ok := v["budget"].(float64); ok && budget > 0 { //预算
-				m["budget"] = int64(budget)
-			}
-			if bidAmount, ok := v["bidamount"].(float64); ok && bidAmount > 0 { //中标金额
-				m["bidamount"] = int64(bidAmount)
-			}
-			result = append(result, m)
+	result := []*v1.ResBidding{}
+	if list == nil {
+		return qstr, result
+	}
+	for _, v := range *list {
+		rb := &v1.ResBidding{
+			InfoId:      ObjToString(v["_id"]),                                                              //ME.EncodeArticleId2ByCheck(ObjToString(v["_id"]))                                         //加密信息id
+			Area:        ObjToString(v["area"]),                                                             //地区
+			Buyerclass:  ObjToString(v["buyerclass"]),                                                       //采购单位类型
+			City:        ObjToString(v["city"]),                                                             //城市
+			District:    ObjToString(v["district"]),                                                         // 区县       //城市
+			Industry:    b.IndustryFormat(b.Industry, strings.Trim(ObjToString(v["s_subscopeclass"]), ",")), //行业
+			Publishtime: Int64All(v["publishtime"]),                                                         //发布时间
+			Subtype:     ObjToString(v["subtype"]),                                                          //信息类型
+			Title:       ObjToString(v["title"]),
+		}
+		isValidFile, _ := v["isValidFile"].(bool) //是否有附件
+		if isValidFile {
+			rb.Annex = 1
+		}
+		if budget, ok := v["budget"].(float64); ok && budget > 0 { //预算
+			rb.Budget = int64(budget)
+		}
+		if bidAmount, ok := v["bidamount"].(float64); ok && bidAmount > 0 { //中标金额
+			rb.Bidamount = int64(bidAmount)
 		}
 		}
+		result = append(result, rb)
 	}
 	}
 	return qstr, result
 	return qstr, result
 }
 }

+ 1 - 1
manifest/config/ai_search.yaml

@@ -16,7 +16,7 @@ timeout: 30000
 doubaoCallMax: 100
 doubaoCallMax: 100
 zhipuCallMax: 100
 zhipuCallMax: 100
 bestBidListMaxLen: 5
 bestBidListMaxLen: 5
-allBidListMaxLen: 100
+allBidListMaxLen: 10
 doubaoPrompt: '######
 doubaoPrompt: '######
 背景知识
 背景知识
 《剑鱼标讯检索系统》具备信息检索能力,提供的检索字段如下:
 《剑鱼标讯检索系统》具备信息检索能力,提供的检索字段如下:

+ 21 - 0
utility/utility.go

@@ -0,0 +1,21 @@
+package utility
+
+import (
+	"context"
+
+	"github.com/gogf/gf/v2/frame/g"
+)
+
+//获取我的收藏
+func GetMyBidCollect(ctx context.Context, positionId int64) map[string]bool {
+	m := map[string]bool{}
+	res, err := g.DB().GetArray(ctx, `select bid from jianyu.bdcollection where userid=?`, positionId)
+	if err != nil {
+		g.Log().Error(ctx, positionId, "查询标讯收藏出错", err)
+		return m
+	}
+	for _, v := range res {
+		m[v.String()] = true
+	}
+	return m
+}