瀏覽代碼

增加service层

renjiaojiao 3 年之前
父節點
當前提交
8850f6744a

+ 5 - 20
rpc/knowledge/internal/logic/findanswerlogic.go

@@ -1,16 +1,11 @@
 package logic
 
 import (
-	cm "app.yhyue.com/moapp/jybase/common"
-	. "app.yhyue.com/moapp/jybase/encrypt"
-	elastic "app.yhyue.com/moapp/jybase/esv1"
 	"context"
 	"github.com/zeromicro/go-zero/core/logx"
-	. "knowledgeBase/rpc/knowledge/init"
 	"knowledgeBase/rpc/knowledge/internal/svc"
 	"knowledgeBase/rpc/knowledge/knowledgeclient"
-	"knowledgeBase/rpc/knowledge/util"
-	"log"
+	"knowledgeBase/service"
 )
 
 type FindAnswerLogic struct {
@@ -28,22 +23,12 @@ func NewFindAnswerLogic(ctx context.Context, svcCtx *svc.ServiceContext) *FindAn
 }
 
 func (l *FindAnswerLogic) FindAnswer(in *knowledgeclient.FindAnswerReq) (*knowledgeclient.FindAnswerResp, error) {
-	var question knowledgeclient.Question
-	robotEntId := SE.Decode4Hex(in.RobotEntId)
-	logx.Info("机器人企业id:", robotEntId)
-	//组装es query
-	query := util.DSL4SmartResponse(in.Question, robotEntId, int(in.Type))
-	log.Println("111111", query)
-	logx.Info("es查询:", query)
-	res := elastic.Get(C.Es.Index, C.Es.Type, query)
-	if res != nil && len(*res) > 0 {
-		data := (*res)[0]
-		question.Answer = cm.ObjToString(data["answer"])
-		question.Question = cm.ObjToString(data["question"])
-	}
+
+	k := service.KnowledgeService{}
+	question := k.FindAnswer(in)
 	return &knowledgeclient.FindAnswerResp{
 		ErrorCode: 0,
 		ErrorMsg:  "请求成功",
-		Data:      &question,
+		Data:      question,
 	}, nil
 }

+ 8 - 26
rpc/knowledge/internal/logic/knowledgedellogic.go

@@ -1,16 +1,11 @@
 package logic
 
 import (
-	elastic "app.yhyue.com/moapp/jybase/esv1"
 	"context"
 	"github.com/zeromicro/go-zero/core/logx"
-	. "knowledgeBase/rpc/knowledge/init"
-	"knowledgeBase/rpc/knowledge/knowledgeclient"
-	"knowledgeBase/rpc/knowledge/util"
-	"strconv"
-	"time"
-
 	"knowledgeBase/rpc/knowledge/internal/svc"
+	"knowledgeBase/rpc/knowledge/knowledgeclient"
+	"knowledgeBase/service"
 )
 
 type KnowledgeDelLogic struct {
@@ -31,27 +26,14 @@ func NewKnowledgeDelLogic(ctx context.Context, svcCtx *svc.ServiceContext) *Know
 func (l *KnowledgeDelLogic) KnowledgeDel(in *knowledgeclient.KnowledgeDelReq) (*knowledgeclient.AddResponse, error) {
 	// todo: add your logic here and delete this line
 	result := &knowledgeclient.AddResponse{}
-	//修改答案
-	answerUpdate := map[string]interface{}{
-		"update_time": time.Now().Local().Format(util.Date_Full_Layout),
-		"status":      0,
-	}
-	fool := Mysql.Update(util.ANSWER, map[string]interface{}{"id": in.AnswerId}, answerUpdate)
-
-	if fool {
-		//删除es数据
-		query := `{"query":{"bool":{"must":[{"term":{"answerId":"` + strconv.Itoa(int(in.AnswerId)) + `"}}],"must_not":[],"should":[]}},"from":0,"size":10,"sort":[],"facets":{}}`
-		ok := elastic.Del(C.Es.Index, C.Es.Type, query)
-		if ok {
-			result.ErrorCode = 0
-			result.ErrorMsg = "删除问题成功"
-		} else {
-			result.ErrorCode = -1
-			result.ErrorMsg = "删除es问题失败"
-		}
+	k := service.KnowledgeService{}
+	ok, msg := k.KnowledgeDel(in.AnswerId)
+	if ok {
+		result.ErrorCode = 0
+		result.ErrorMsg = msg
 	} else {
 		result.ErrorCode = -1
-		result.ErrorMsg = "删除mysql问题失败"
+		result.ErrorMsg = msg
 	}
 	return result, nil
 }

+ 16 - 10
rpc/knowledge/internal/logic/knowledgeeditlogic.go

@@ -1,18 +1,11 @@
 package logic
 
 import (
-	elastic "app.yhyue.com/moapp/jybase/esv1"
-	"bp.jydev.jianyu360.cn/BaseService/userCenter/rpc/usercenter"
 	"context"
-	"database/sql"
 	"github.com/zeromicro/go-zero/core/logx"
-	"knowledgeBase/entity"
-	. "knowledgeBase/rpc/knowledge/init"
 	"knowledgeBase/rpc/knowledge/internal/svc"
 	"knowledgeBase/rpc/knowledge/knowledgeclient"
-	"knowledgeBase/rpc/knowledge/util"
-	"strconv"
-	"time"
+	"knowledgeBase/service"
 )
 
 type KnowledgeEditLogic struct {
@@ -33,8 +26,20 @@ func NewKnowledgeEditLogic(ctx context.Context, svcCtx *svc.ServiceContext) *Kno
 func (l *KnowledgeEditLogic) KnowledgeEdit(in *knowledgeclient.KnowledgeEditReq) (*knowledgeclient.AddResponse, error) {
 
 	result := &knowledgeclient.AddResponse{}
-	//获取问题分词
+	k := service.KnowledgeService{}
+	ok, msg, err := k.KnowledgeEdit(in)
+	if !ok && err != nil {
+		result.ErrorCode = -1
+		result.ErrorMsg = msg
+	} else {
+		result.ErrorCode = 0
+		result.ErrorMsg = msg
+	}
+	/*//获取问题分词
 	keywords := util.HttpDo(in.Question)
+	if keywords == "" {
+		keywords = in.Question
+	}
 	//通过entUserId获取创建人名称
 	req := &usercenter.EntUserReq{
 		EntId:     in.EntId,
@@ -89,6 +94,7 @@ func (l *KnowledgeEditLogic) KnowledgeEdit(in *knowledgeclient.KnowledgeEditReq)
 	} else {
 		result.ErrorCode = -1
 		result.ErrorMsg = "修改mysql问题失败"
-	}
+	}*/
+
 	return result, nil
 }

+ 5 - 13
rpc/knowledge/internal/logic/knowledgeinfologic.go

@@ -1,13 +1,11 @@
 package logic
 
 import (
-	cm "app.yhyue.com/moapp/jybase/common"
 	"context"
 	"github.com/zeromicro/go-zero/core/logx"
-	. "knowledgeBase/rpc/knowledge/init"
 	"knowledgeBase/rpc/knowledge/internal/svc"
 	"knowledgeBase/rpc/knowledge/knowledgeclient"
-	"knowledgeBase/rpc/knowledge/util"
+	"knowledgeBase/service"
 )
 
 type KnowledgeInfoLogic struct {
@@ -29,16 +27,10 @@ func (l *KnowledgeInfoLogic) KnowledgeInfo(in *knowledgeclient.KnowledgeEntity)
 	// todo: add your logic here and delete this line
 	//答案问题详情
 	result := &knowledgeclient.InfoResponse{}
-	sql := "SELECT b.content as answer,c.content as question,b.id,b.knowledge_id  FROM " + util.ANSWER +
-		" b LEFT JOIN " + util.QUESTION + " c ON b.id = c.answer_id WHERE b.`status` =1 AND b.id = ? "
-	datalist := Mysql.SelectBySql(sql, in.AnswerId)
-	if datalist != nil && *datalist != nil && len(*datalist) > 0 {
-		knowledge := knowledgeclient.KnowledgeEntity{}
-		knowledge.Answer = cm.ObjToString((*datalist)[0]["answer"])
-		knowledge.Question = cm.ObjToString((*datalist)[0]["question"])
-		knowledge.AnswerId = cm.Int64All((*datalist)[0]["id"])
-		knowledge.KnowledgeId = cm.Int64All((*datalist)[0]["knowledge_id"])
-		result.Data = &knowledge
+	k := service.KnowledgeService{}
+	knowledge, ok := k.KnowledgeInfo(in.AnswerId)
+	if knowledge != nil && ok {
+		result.Data = knowledge
 		result.ErrorCode = 0
 	} else {
 		result.ErrorCode = -1

+ 6 - 7
rpc/knowledge/internal/logic/knowledgelistlogic.go

@@ -1,14 +1,11 @@
 package logic
 
 import (
-	cm "app.yhyue.com/moapp/jybase/common"
 	"context"
 	"github.com/zeromicro/go-zero/core/logx"
-	. "knowledgeBase/rpc/knowledge/init"
 	"knowledgeBase/rpc/knowledge/internal/svc"
 	"knowledgeBase/rpc/knowledge/knowledgeclient"
-	"knowledgeBase/rpc/knowledge/util"
-	"log"
+	"knowledgeBase/service"
 )
 
 type KnowledgeListLogic struct {
@@ -29,7 +26,7 @@ func NewKnowledgeListLogic(ctx context.Context, svcCtx *svc.ServiceContext) *Kno
 func (l *KnowledgeListLogic) KnowledgeList(in *knowledgeclient.ListRequest) (*knowledgeclient.ListResponse, error) {
 	// todo: add your logic here and delete this line
 	result := &knowledgeclient.ListResponse{}
-	var knowledgeList knowledgeclient.ListData
+	/*var knowledgeList knowledgeclient.ListData
 	var data []*knowledgeclient.KnowledgeEntity
 	countSql := "SELECT COUNT(b.id)  FROM " + util.KNOWLEDGE +
 		" a LEFT JOIN " + util.ANSWER + " b ON a.id = b.knowledge_id LEFT JOIN " + util.QUESTION +
@@ -56,8 +53,10 @@ func (l *KnowledgeListLogic) KnowledgeList(in *knowledgeclient.ListRequest) (*kn
 		//log.Println("数据:", data)
 		knowledgeList.Total = count
 		knowledgeList.Data = data
-	}
+	}*/
+	k := service.KnowledgeService{}
+	knowledgeList := k.KnowledgeList(in)
 	result.ErrorCode = 0
-	result.Data = &knowledgeList
+	result.Data = knowledgeList
 	return result, nil
 }

+ 4 - 26
rpc/knowledge/internal/logic/recommendanswerlogic.go

@@ -1,16 +1,11 @@
 package logic
 
 import (
-	cm "app.yhyue.com/moapp/jybase/common"
-	. "app.yhyue.com/moapp/jybase/encrypt"
-	elastic "app.yhyue.com/moapp/jybase/esv1"
 	"context"
 	"github.com/zeromicro/go-zero/core/logx"
-	. "knowledgeBase/rpc/knowledge/init"
 	"knowledgeBase/rpc/knowledge/internal/svc"
 	"knowledgeBase/rpc/knowledge/knowledgeclient"
-	"knowledgeBase/rpc/knowledge/util"
-	"log"
+	"knowledgeBase/service"
 )
 
 type RecommendAnswerLogic struct {
@@ -28,26 +23,9 @@ func NewRecommendAnswerLogic(ctx context.Context, svcCtx *svc.ServiceContext) *R
 }
 
 func (l *RecommendAnswerLogic) RecommendAnswer(in *knowledgeclient.FindAnswerReq) (*knowledgeclient.RecommendAnswerResp, error) {
-	var (
-		keyWords    = ""
-		searchField = `"answer","question"`
-		answers     []*knowledgeclient.Question
-		result      = &knowledgeclient.RecommendAnswerResp{}
-	)
-	//根据问题进行分词
-	keyWords = util.HttpDo(in.Question)
-	log.Println("问题分词关键字:", keyWords)
-	var query = util.DSL4SearchByKwsOrid(keyWords, SE.Decode4Hex(in.RobotEntId))
-	res := elastic.GetAllByNgram(C.Es.Index, C.Es.Type, query, "", "", searchField, 0, 3, 0, false)
-
-	if res != nil && len(*res) > 0 {
-		for _, val := range *res {
-			answers = append(answers, &knowledgeclient.Question{
-				Question: cm.ObjToString(val["question"]),
-				Answer:   cm.ObjToString(val["answer"]),
-			})
-		}
-	}
+	var result = &knowledgeclient.RecommendAnswerResp{}
+	k := service.KnowledgeService{}
+	answers := k.RecommendAnswer(in)
 	result.ErrorCode = 0
 	result.ErrorMsg = "请求成功"
 	result.Data = answers

+ 3 - 3
rpc/knowledge/test/knowledge_test.go

@@ -83,7 +83,7 @@ func Test_FindAnswer(t *testing.T) {
 	ctx, _ := context.WithTimeout(context.Background(), 10*time.Second)
 	TestSystem := knowledgeclient.NewKnowledge(zrpc.MustNewClient(c.TestConf))
 	req := &knowledgeclient.FindAnswerReq{}
-	req.Question = "在"
+	req.Question = "在不在"
 	req.RobotEntId = "455b495c5c"
 	req.Type = 1
 	res, err := TestSystem.FindAnswer(ctx, req)
@@ -95,8 +95,8 @@ func Test_RecommendAnswer(t *testing.T) {
 	ctx, _ := context.WithTimeout(context.Background(), 10*time.Second)
 	TestSystem := knowledgeclient.NewKnowledge(zrpc.MustNewClient(c.TestConf))
 	req := &knowledgeclient.FindAnswerReq{}
-	req.Question = "超级订阅用户权益有订阅设置"
-	req.RobotEntId = "10000"
+	req.Question = "大会员"
+	req.RobotEntId = "455b495c5c"
 	req.Type = 1
 	res, err := TestSystem.RecommendAnswer(ctx, req)
 	log.Println("res ", res)

+ 5 - 1
rpc/knowledge/util/elasticsearch_dsl.go

@@ -22,9 +22,13 @@ func DSL4SmartResponse(question string, entId string, msgType int) string {
 	/*1.首先将问题使用hanlp分词*/
 	//hanlpCutWords := HanlpGetNormalWords(question, "http://39.106.145.77:8080/api/segment")
 	hanlpCutWords := HanlpGetNormalWords(question, C.Segment)
+	log.Println("hanlp分词结果:", hanlpCutWords)
+	if len(hanlpCutWords) == 0 {
+		hanlpCutWords = append(hanlpCutWords, question)
+	}
 	question = strings.Join(hanlpCutWords, "")
 	lenQuestion := len([]rune(question))
-	log.Println("len", lenQuestion)
+	//log.Println("len", lenQuestion)
 	if lenQuestion >= 2 {
 		queryPercent := "40%"
 		if lenQuestion < 5 {

+ 181 - 0
service/knowledgeService.go

@@ -1,6 +1,8 @@
 package service
 
 import (
+	cm "app.yhyue.com/moapp/jybase/common"
+	. "app.yhyue.com/moapp/jybase/encrypt"
 	elastic "app.yhyue.com/moapp/jybase/esv1"
 	"bp.jydev.jianyu360.cn/BaseService/userCenter/rpc/usercenter"
 	"context"
@@ -11,6 +13,8 @@ import (
 	. "knowledgeBase/rpc/knowledge/init"
 	"knowledgeBase/rpc/knowledge/knowledgeclient"
 	"knowledgeBase/rpc/knowledge/util"
+	"log"
+	"strconv"
 	"time"
 )
 
@@ -23,6 +27,9 @@ func (k *KnowledgeService) KnowledgeAdd(param *knowledgeclient.AddRequest) (bool
 	if datalist != nil && *datalist != nil && len(*datalist) > 0 {
 		//问题进行分词
 		keywords := util.HttpDo(param.Question)
+		if keywords == "" {
+			keywords = param.Question
+		}
 		//通过entUserId获取创建人名称,调用用户中心
 		req := &usercenter.EntUserReq{
 			EntId:     param.EntId,
@@ -83,3 +90,177 @@ func (k *KnowledgeService) KnowledgeAdd(param *knowledgeclient.AddRequest) (bool
 		return false, "租户不存在", errors.New("租户不存在")
 	}
 }
+
+func (k *KnowledgeService) KnowledgeEdit(param *knowledgeclient.KnowledgeEditReq) (ok bool, msg string, err error) {
+	//获取问题分词
+	keywords := util.HttpDo(param.Question)
+	if keywords == "" {
+		keywords = param.Question
+	}
+	//通过entUserId获取创建人名称
+	req := &usercenter.EntUserReq{
+		EntId:     param.EntId,
+		EntUserId: param.EntUserId,
+		AppId:     param.AppId,
+	}
+	resp := &usercenter.EntUserResp{}
+	resp, err = entity.UserCenterLib.GetEntUserInfo(context.Background(), req)
+	if err != nil {
+		logx.Infof("查询用户中台创建人信息失败", param.EntId, param.EntUserId, "err:", err)
+		return false, "查询用户中台创建人信息失败", err
+	}
+	createPerson := resp.Data.Name
+	fool := Mysql.ExecTx("编辑问题、答案", func(tx *sql.Tx) bool {
+		//修改答案
+		answerUpdate := map[string]interface{}{
+			"update_time": time.Now().Local().Format(util.Date_Full_Layout),
+			"content":     param.Answer,
+		}
+		ok1 := Mysql.UpdateByTx(tx, util.ANSWER, map[string]interface{}{"id": param.AnswerId}, answerUpdate)
+		//修改问题
+		questionUpdate := map[string]interface{}{
+			"content":  param.Question,
+			"keywords": keywords,
+		}
+		ok2 := Mysql.UpdateByTx(tx, util.QUESTION, map[string]interface{}{"answer_id": param.AnswerId}, questionUpdate)
+		return ok1 && ok2
+	})
+
+	if fool {
+		query := `{"query":{"bool":{"must":[{"term":{"answerId":"` + strconv.Itoa(int(param.AnswerId)) + `"}}],"must_not":[],"should":[]}},"from":0,"size":10,"sort":[],"facets":{}}`
+		//修改es数据
+		newKnowledge := map[string]interface{}{
+			"knowledgeId":  param.KnowledgeId,
+			"status":       1,
+			"createTime":   time.Now().Unix(),
+			"createPerson": createPerson,
+			"answer":       param.Answer,
+			"question":     param.Question,
+			"keywords":     keywords,
+			"answerId":     param.AnswerId,
+			"entId":        param.EntId,
+		}
+		ok1 := elastic.Del(C.Es.Index, C.Es.Type, query)
+		ok := elastic.Save(C.Es.Index, C.Es.Type, newKnowledge)
+		if ok && ok1 {
+			ok = true
+			msg = "修改问题成功"
+		} else {
+			ok = false
+			err = errors.New("删除es问题失败")
+			msg = "删除es问题失败"
+		}
+	} else {
+		ok = false
+		err = errors.New("修改mysql问题失败")
+		msg = "修改mysql问题失败"
+	}
+	return
+}
+
+func (k *KnowledgeService) KnowledgeList(param *knowledgeclient.ListRequest) *knowledgeclient.ListData {
+	var knowledgeList knowledgeclient.ListData
+	var data []*knowledgeclient.KnowledgeEntity
+	countSql := "SELECT COUNT(b.id)  FROM " + util.KNOWLEDGE +
+		" a LEFT JOIN " + util.ANSWER + " b ON a.id = b.knowledge_id LEFT JOIN " + util.QUESTION +
+		" c ON b.id = c.answer_id WHERE b.`status` =1 and a.ent_id=?"
+	count := Mysql.CountBySql(countSql, param.EntId)
+	log.Println("总数:", count)
+	if count > 0 {
+		//列表数据
+		sql1 := "SELECT b.content as answer,c.content as question,b.id,b.knowledge_id  FROM " + util.KNOWLEDGE +
+			" a LEFT JOIN " + util.ANSWER + " b ON a.id = b.knowledge_id LEFT JOIN " + util.QUESTION +
+			" c ON b.id = c.answer_id WHERE b.`status` =1 and a.ent_id=? order by b.update_time desc limit ?,?"
+		//log.Println(sql, param.EntId, (param.PageIndex-1)*param.PageSize, param.PageSize)
+		datalist := Mysql.SelectBySql(sql1, param.EntId, (param.PageIndex-1)*param.PageSize, param.PageSize)
+		if datalist != nil && *datalist != nil && len(*datalist) > 0 {
+			for _, value := range *datalist {
+				knowledge := knowledgeclient.KnowledgeEntity{}
+				knowledge.Answer = cm.ObjToString(value["answer"])
+				knowledge.Question = cm.ObjToString(value["question"])
+				knowledge.AnswerId = cm.Int64All(value["id"])
+				knowledge.KnowledgeId = cm.Int64All(value["knowledge_id"])
+				data = append(data, &knowledge)
+			}
+		}
+		//log.Println("数据:", data)
+		knowledgeList.Total = count
+		knowledgeList.Data = data
+	}
+	return &knowledgeList
+}
+
+func (k *KnowledgeService) KnowledgeInfo(answerId int64) (data *knowledgeclient.KnowledgeEntity, ok bool) {
+	sql1 := "SELECT b.content as answer,c.content as question,b.id,b.knowledge_id  FROM " + util.ANSWER +
+		" b LEFT JOIN " + util.QUESTION + " c ON b.id = c.answer_id WHERE b.`status` =1 AND b.id = ? "
+	datalist := Mysql.SelectBySql(sql1, answerId)
+	if datalist != nil && *datalist != nil && len(*datalist) > 0 {
+		knowledge := knowledgeclient.KnowledgeEntity{}
+		knowledge.Answer = cm.ObjToString((*datalist)[0]["answer"])
+		knowledge.Question = cm.ObjToString((*datalist)[0]["question"])
+		knowledge.AnswerId = cm.Int64All((*datalist)[0]["id"])
+		knowledge.KnowledgeId = cm.Int64All((*datalist)[0]["knowledge_id"])
+		return &knowledge, true
+	}
+	return nil, false
+}
+
+func (k *KnowledgeService) KnowledgeDel(answerId int64) (ok bool, msg string) {
+	//修改答案
+	answerUpdate := map[string]interface{}{
+		"update_time": time.Now().Local().Format(util.Date_Full_Layout),
+		"status":      0,
+	}
+	fool := Mysql.Update(util.ANSWER, map[string]interface{}{"id": answerId}, answerUpdate)
+
+	if fool {
+		//删除es数据
+		query := `{"query":{"bool":{"must":[{"term":{"answerId":"` + strconv.Itoa(int(answerId)) + `"}}],"must_not":[],"should":[]}},"from":0,"size":10,"sort":[],"facets":{}}`
+		ok := elastic.Del(C.Es.Index, C.Es.Type, query)
+		if ok {
+			return true, "删除成功"
+		} else {
+			return false, "删除es问题失败"
+		}
+	}
+	return false, "删除mysql问题失败"
+}
+
+func (k *KnowledgeService) FindAnswer(param *knowledgeclient.FindAnswerReq) *knowledgeclient.Question {
+	var question knowledgeclient.Question
+	robotEntId := SE.Decode4Hex(param.RobotEntId)
+	logx.Info("机器人企业id:", robotEntId)
+	//组装es query
+	query := util.DSL4SmartResponse(param.Question, robotEntId, int(param.Type))
+	logx.Info("es查询:", query)
+	res := elastic.Get(C.Es.Index, C.Es.Type, query)
+	if res != nil && len(*res) > 0 {
+		data := (*res)[0]
+		question.Answer = cm.ObjToString(data["answer"])
+		question.Question = cm.ObjToString(data["question"])
+	}
+	return &question
+}
+
+func (k *KnowledgeService) RecommendAnswer(param *knowledgeclient.FindAnswerReq) []*knowledgeclient.Question {
+	var (
+		keyWords    = ""
+		searchField = `"answer","question"`
+		answers     []*knowledgeclient.Question
+	)
+	//根据问题进行分词
+	keyWords = util.HttpDo(param.Question)
+	log.Println("问题分词关键字:", keyWords)
+	var query = util.DSL4SearchByKwsOrid(keyWords, SE.Decode4Hex(param.RobotEntId))
+	res := elastic.GetAllByNgram(C.Es.Index, C.Es.Type, query, "", "", searchField, 0, 3, 0, false)
+	//log.Println("推荐3个答案:", res)
+	if res != nil && len(*res) > 0 {
+		for _, val := range *res {
+			answers = append(answers, &knowledgeclient.Question{
+				Question: cm.ObjToString(val["question"]),
+				Answer:   cm.ObjToString(val["answer"]),
+			})
+		}
+	}
+	return answers
+}