Browse Source

查询收藏的图表信息

xyxie 3 months ago
parent
commit
d7803530e0

+ 62 - 30
controllers/chart_collect.go

@@ -164,7 +164,10 @@ func (this *ChartCollectController) ChartList() {
 	var pars []interface{}
 
 	chartAdminId := sysUser.UserId
+	condition += " AND (a.user_id = ?)"
+	pars = append(pars, chartAdminId)
 
+	collectClassifyIdSlice := make([]string, 0)
 	if collectClassifyIds != "" {
 		classifyIds := strings.Split(collectClassifyIds, ",")
 		if len(classifyIds) == 0 {
@@ -173,28 +176,20 @@ func (this *ChartCollectController) ChartList() {
 		}
 		classifyIdSlice := make([]int, 0)
 		for _, id := range classifyIds {
-			tmp, e := strconv.Atoi(id)
-			if e != nil {
-				br.Msg = "请选择正确的分类"
-				return
+			if id != "" {
+				collectClassifyIdSlice = append(collectClassifyIdSlice, id+",")
+				tmp, e := strconv.Atoi(id)
+				if e != nil {
+					br.Msg = "请选择正确的分类"
+					return
+				}
+				classifyIdSlice = append(classifyIdSlice, tmp)
 			}
-			classifyIdSlice = append(classifyIdSlice, tmp)
 		}
 		condition += "  AND a.collect_classify_id in (" + utils.GetOrmInReplace(len(classifyIdSlice)) + ") "
 		pars = append(pars, classifyIdSlice)
 	}
-	if keyword != "" {
-		/*if this.Lang == utils.LANG_EN {
-			condition += " AND (b.chart_name_en like ?) "
-		} else {*/
-		condition += " AND (b.chart_name like ?) "
-		//}
-		pars = append(pars, "%"+keyword+"%")
-	}
-
-	condition += " AND (a.user_id = ?)"
-	pars = append(pars, chartAdminId)
-
+	adminIdsSlice := make([]int, 0)
 	// 获取有权限的分类ID
 	permissionClassifyIds, err := services.GetPermissionClassifyIdByUserId(sysUser.UserId)
 	if err != nil {
@@ -208,21 +203,58 @@ func (this *ChartCollectController) ChartList() {
 		condition += ` AND b.chart_classify_id in (` + utils.GetOrmInReplace(lenPermissionClassifyIds) + `) `
 		pars = append(pars, permissionClassifyIds)
 	}
-	total, err = chart_collect.GetChartCollectCountByCondition(condition, pars)
-	if err != nil && err.Error() != utils.ErrNoRow() {
-		br.Msg = "获取信息失败"
-		br.ErrMsg = "获取收藏数据总数失败,Err:" + err.Error()
-		return
+	list := make([]*chart_collect.ChartCollectView, 0)
+	if keyword != "" {
+		// 从 es中查询收藏的图表列表
+		chartList := make([]*chart_collect.ChartCollectEsItem, 0)
+		chartList, total, err = services.EsSearchChartCollectData(keyword, chartAdminId, permissionClassifyIds, collectClassifyIdSlice, adminIdsSlice, startSize, pageSize)
+		if err != nil {
+			br.Msg = "获取收藏数据失败"
+			br.ErrMsg = "获取收藏数据失败,Err:" + err.Error()
+			return
+		}
+		for _, v := range chartList {
+			tmp := &chart_collect.ChartCollectView{
+				ChartInfoId: v.ChartInfoId,
+				UserId:      v.UserId,
+				CreateTime:  v.CreateTime,
+				CollectTime: v.CollectTime,
+				ChartName:   v.ChartName,
+				ChartNameEn: v.ChartNameEn,
+				ChartImage:  v.ChartImage,
+				UniqueCode:  v.UniqueCode,
+			}
+			list = append(list, tmp)
+		}
+		// 根据空格拆分
+		/*keys := strings.Split(keyword, " ")
+		condition += ` AND ( `
+		for _, v := range keys {
+			if v != "" {
+				condition += ` b.chart_name like ? and`
+				pars = append(pars, "%"+v+"%")
+			}
+		}
+		condition = condition[:len(condition)-3]
+		condition += ` )`*/
+	} else {
+		total, err = chart_collect.GetChartCollectCountByCondition(condition, pars)
+		if err != nil && err.Error() != utils.ErrNoRow() {
+			br.Msg = "获取信息失败"
+			br.ErrMsg = "获取收藏数据总数失败,Err:" + err.Error()
+			return
+		}
+		//获取图表信息
+		list, err = chart_collect.GetChartCollectPageByCondition(condition, pars, startSize, pageSize)
+		if err != nil && err.Error() != utils.ErrNoRow() {
+			br.Success = true
+			br.Msg = "获取图表信息失败"
+			br.ErrMsg = "获取图表信息失败,Err:" + err.Error()
+			return
+		}
 	}
+
 	page := paging.GetPaging(currentIndex, pageSize, int(total))
-	//获取图表信息
-	list, err := chart_collect.GetChartCollectPageByCondition(condition, pars, startSize, pageSize)
-	if err != nil && err.Error() != utils.ErrNoRow() {
-		br.Success = true
-		br.Msg = "获取图表信息失败"
-		br.ErrMsg = "获取图表信息失败,Err:" + err.Error()
-		return
-	}
 	resp := new(chart_collect.ChartCollectListResp)
 	if list == nil || len(list) <= 0 || (err != nil && err.Error() == utils.ErrNoRow()) {
 		items := make([]*chart_collect.ChartCollectView, 0)

+ 50 - 0
models/chart_collect/chart.go

@@ -85,6 +85,18 @@ func GetChartCollectListByAdminId(adminId int) (item []*ChartCollectView, err er
 	return
 }
 
+func GetChartCollectListByChartInfoId(chartInfoId int) (item []*ChartCollectView, err error) {
+	o := orm.NewOrm()
+	//sql := ` SELECT * FROM chart_collect WHERE 1=1 AND user_id=? `
+
+	sql := ` SELECT a.*,GROUP_CONCAT(c.classify_id SEPARATOR ',') AS classify_id FROM chart_collect AS a
+			LEFT JOIN chart_collect_classify AS c ON b.classify_id=c.classify_id
+			WHERE 1=1 AND a.chart_info_id=?
+			GROUP BY a.chart_info_id, a.user_id `
+	_, err = o.Raw(sql, chartInfoId).QueryRows(&item)
+	return
+}
+
 type ChartCollectEditReq struct {
 	ChartCollectId    int   `description:"我的图表主键"`
 	CurrentClassifyId int   `description:"当前分类ID"`
@@ -288,3 +300,41 @@ func UpdateCollectClassifyIdByChartInfoId(chartInfoIds []int, classifyId int, us
 	_, err = o.Raw(sql, classifyId, chartInfoIds, userId).Exec()
 	return
 }
+
+type ChartCollectEsItem struct {
+	UserChartInfoId           string
+	ChartInfoId               int       `description:"图表id"`
+	UserId                    int       `description:"用户id"`
+	CollectTime               time.Time `description:"收藏时间"`
+	ChartName                 string    `description:"来源名称"`
+	ChartNameEn               string    `description:"英文图表名称"`
+	ChartImage                string    `description:"图表图片"`
+	UniqueCode                string    `description:"图表唯一编码"`
+	ChartClassifyId           int       `description:"图表分类id"`
+	SysUserId                 int
+	SysUserRealName           string
+	CreateTime                time.Time
+	ModifyTime                time.Time
+	ChartSource               int
+	CollectClassifyIds        string
+	ChartCollectClassifyNames string
+}
+
+// GetChartCollectByChartInfoIdAndUserIdByCondition 获图表收藏数据
+func GetChartCollectByChartInfoIdAndUserIdByCondition(condition string, pars []interface{}) (item []*ChartCollectEsItem, err error) {
+	o := orm.NewOrm()
+	sql := ` SELECT a.user_id, CONCAT(a.chart_info_id,"_", a.user_id) as user_chart_info_id, max(a.collect_time) as collect_time,
+        	b.chart_info_id,b.chart_name,b.chart_name_en,b.chart_image,b.unique_code,b.chart_classify_id,b.sys_user_id,b.sys_user_real_name,b.create_time,b.modify_time,b.source as chart_source,
+        	GROUP_CONCAT(DISTINCT d.classify_name) AS chart_collect_classify_names,GROUP_CONCAT(DISTINCT d.collect_classify_id) AS collect_classify_ids
+			FROM  chart_collect AS a
+			INNER JOIN chart_info AS b ON a.chart_info_id=b.chart_info_id
+			INNER JOIN chart_collect_classify AS d ON a.collect_classify_id=d.collect_classify_id
+			WHERE 1=1 `
+
+	if condition != "" {
+		sql += condition
+	}
+	sql += " GROUP BY a.chart_info_id,a.user_id ORDER BY a.collect_time Desc, a.chart_collect_id DESC "
+	_, err = o.Raw(sql, pars).QueryRows(&item)
+	return
+}

+ 156 - 0
services/chart_collect_elastic.go

@@ -0,0 +1,156 @@
+package services
+
+import (
+	"eta/eta_forum_hub/models/chart_collect"
+	"eta/eta_forum_hub/services/elastic"
+	"eta/eta_forum_hub/utils"
+	"fmt"
+	"strconv"
+	"strings"
+)
+
+// EsAddOrEditChartCollectByChartInfoId 新增和修改ES中的收藏图表数据
+func EsAddOrEditChartCollectByChartInfoId(chartInfoId int) {
+	errMsg := make([]string, 0)
+	defer func() {
+		if len(errMsg) > 0 {
+			fmt.Println("新增和修改ES中的图表数据失败:", strings.Join(errMsg, "\n"))
+		}
+	}()
+
+	var condition string
+	var pars []interface{}
+	condition += " and a.chart_info_id = ? "
+	pars = append(pars, chartInfoId)
+
+	allList, err := chart_collect.GetChartCollectByChartInfoIdAndUserIdByCondition(condition, pars)
+	if err != nil {
+		errMsg = append(errMsg, fmt.Sprintf("EsAddOrEditChartCollectByChartInfoId Err:%s", err.Error()))
+		return
+	}
+	for _, v := range allList {
+		//添加es
+		v.CollectClassifyIds += ","
+		err = elastic.EsAddOrEditDataInterface(utils.CHART_COLLECT_INDEX_NAME, v.UserChartInfoId, v)
+		if err != nil {
+			errMsg = append(errMsg, fmt.Sprintf("图表收藏:%s,添加Es失败,err:%s", v.UserChartInfoId, err.Error()))
+		}
+
+	}
+	return
+}
+
+// EsAddOrEditChartCollectByChartInfoIdUserId 新增和修改ES中的收藏图表数据
+func EsAddOrEditChartCollectByChartInfoIdUserId(chartInfoId, userId int) {
+	errMsg := make([]string, 0)
+	defer func() {
+		if len(errMsg) > 0 {
+			fmt.Println("新增和修改ES中的图表数据失败:", strings.Join(errMsg, "\n"))
+		}
+	}()
+
+	var condition string
+	var pars []interface{}
+	condition += " and a.chart_info_id = ? and a.user_id = ? "
+	pars = append(pars, chartInfoId, userId)
+
+	allList, err := chart_collect.GetChartCollectByChartInfoIdAndUserIdByCondition(condition, pars)
+	if err != nil {
+		errMsg = append(errMsg, fmt.Sprintf("EsAddOrEditChartCollectByChartInfoId Err:%s", err.Error()))
+		return
+	}
+	for _, v := range allList {
+		//添加es
+		v.CollectClassifyIds += ","
+		fmt.Println(v)
+		err = elastic.EsAddOrEditDataInterface(utils.CHART_COLLECT_INDEX_NAME, v.UserChartInfoId, v)
+		if err != nil {
+			errMsg = append(errMsg, fmt.Sprintf("图表收藏:%s,添加Es失败,err:%s", v.UserChartInfoId, err.Error()))
+		}
+
+	}
+	return
+}
+
+// EsDeleteChartCollectByChartInfoIdUserId 取消收藏
+func EsDeleteChartCollectByChartInfoIdUserId(chartInfoId, userId int) {
+	var err error
+	defer func() {
+		if err != nil {
+			fmt.Println("删除ES中的图表数据失败:", err.Error())
+		}
+	}()
+	//添加es
+	// 先删除,再新增
+	userChartInfoId := strconv.Itoa(userId) + "_" + strconv.Itoa(chartInfoId)
+	err = elastic.EsDeleteDataV2(utils.CHART_COLLECT_INDEX_NAME, userChartInfoId)
+	if err != nil {
+		err = fmt.Errorf(fmt.Sprintf("图表收藏:%s,删除Es失败,err:%s", userChartInfoId, err.Error()))
+		return
+	}
+	var condition string
+	var pars []interface{}
+	condition += " and a.chart_info_id = ? and a.user_id = ? "
+	pars = append(pars, chartInfoId, userId)
+
+	allList, err := chart_collect.GetChartCollectByChartInfoIdAndUserIdByCondition(condition, pars)
+	if err != nil {
+		return
+	}
+	for _, v := range allList {
+		//添加es
+		v.CollectClassifyIds += ","
+		err = elastic.EsAddOrEditDataInterface(utils.CHART_COLLECT_INDEX_NAME, v.UserChartInfoId, v)
+		if err != nil {
+			err = fmt.Errorf("图表收藏:%s,添加Es失败,err:%s", v.UserChartInfoId, err.Error())
+			return
+		}
+	}
+
+	return
+}
+
+// EsDeleteChartCollectByChartInfoIdUserIds 删除图表时,删除图表的收藏记录
+func EsDeleteChartCollectByChartInfoIdUserIds(userChartInfoIds []string) {
+	if len(userChartInfoIds) == 0 {
+		return
+	}
+	errMsg := make([]string, 0)
+	defer func() {
+		if len(errMsg) > 0 {
+			fmt.Println("EsDeleteMyChartInfoByMyChartIds, 删除ES中的我的图表数据失败:", strings.Join(errMsg, "\n"))
+		}
+	}()
+	for _, v := range userChartInfoIds {
+		id := v
+		if e := elastic.EsDeleteDataV2(utils.CHART_COLLECT_INDEX_NAME, id); e != nil {
+			errMsg = append(errMsg, fmt.Sprintf("myChartId:%d,删除Es失败,err:%s", v, e.Error()))
+		}
+	}
+	return
+}
+
+func AddAllChartCollectData() {
+	var condition string
+	var pars []interface{}
+
+	allList, err := chart_collect.GetChartCollectByChartInfoIdAndUserIdByCondition(condition, pars)
+	if err != nil {
+		return
+	}
+	for _, v := range allList {
+		//添加es
+		v.CollectClassifyIds += ","
+		err = elastic.EsAddOrEditDataInterface(utils.CHART_COLLECT_INDEX_NAME, v.UserChartInfoId, v)
+		if err != nil {
+			err = fmt.Errorf("图表收藏:%s,添加Es失败,err:%s", v.UserChartInfoId, err.Error())
+			return
+		}
+	}
+}
+
+// EsSearchChartCollectData 搜索图表收藏信息
+func EsSearchChartCollectData(keyword string, userId int, permissionChartClassifyIdList []int, collectClassifyIds []string, adminIdsSlice []int, startSize, pageSize int) (list []*chart_collect.ChartCollectEsItem, total int64, err error) {
+	list, total, err = elastic.SearchChartCollectData(utils.CHART_COLLECT_INDEX_NAME, keyword, userId, permissionChartClassifyIdList, collectClassifyIds, adminIdsSlice, startSize, pageSize)
+	return
+}

+ 15 - 1
services/chart_info.go

@@ -4,6 +4,7 @@ import (
 	"encoding/json"
 	"errors"
 	"eta/eta_forum_hub/models"
+	"eta/eta_forum_hub/models/chart_collect"
 	"eta/eta_forum_hub/models/system"
 	"eta/eta_forum_hub/services/alarm_msg"
 	"eta/eta_forum_hub/utils"
@@ -548,7 +549,6 @@ func UpdateChartInfoAndEdbInfo(req *models.AddChartReq, sysUserId int, sysUserRe
 	}
 	//添加es数据
 	go EsAddOrEditChartInfo(chartInfo.ChartInfoId)
-
 	return
 }
 
@@ -579,6 +579,17 @@ func DeleteChart(chartInfoId int) (err error, errMsg string) {
 	for _, v := range oldChartEdbMappingList {
 		edbInfoIds = append(edbInfoIds, v.EdbInfoId)
 	}
+	// 查询所有的收藏图表数据
+	userChartCollect := make([]string, 0)
+	chartCollectList, err := chart_collect.GetChartCollectListByChartInfoId(chartInfo.ChartInfoId)
+	if err != nil {
+		errMsg = "删除失败"
+		err = fmt.Errorf("查询图表收藏数据失败, Err:" + err.Error())
+		return
+	}
+	for _, v := range chartCollectList {
+		userChartCollect = append(userChartCollect, fmt.Sprintf("%d_%d", v.UserId, v.ChartInfoId))
+	}
 
 	//删除图表及关联指标
 	err = models.DeleteChartInfoAndData(chartInfo.ChartInfoId)
@@ -603,6 +614,9 @@ func DeleteChart(chartInfoId int) (err error, errMsg string) {
 	}
 
 	go EsDeleteChartInfo(chartInfo.ChartInfoId)
+	if len(userChartCollect) > 0 {
+		go EsDeleteChartCollectByChartInfoIdUserIds(userChartCollect)
+	}
 	return
 }
 

+ 134 - 0
services/elastic/chart_collect.go

@@ -0,0 +1,134 @@
+package elastic
+
+import (
+	"context"
+	"encoding/json"
+	"eta/eta_forum_hub/models/chart_collect"
+	"eta/eta_forum_hub/services/alarm_msg"
+	"eta/eta_forum_hub/utils"
+	"fmt"
+)
+
+// SearchChartCollectData 查询es中的收藏图表数据
+func SearchChartCollectData(indexName, keywordStr string, userId int, permissionChartClassifyIdList []int, collectClassifyIds []string, adminIdsSlice []int, from, size int) (list []*chart_collect.ChartCollectEsItem, total int64, err error) {
+	list = make([]*chart_collect.ChartCollectEsItem, 0)
+	defer func() {
+		if err != nil {
+			utils.FileLog.Info("SearchChartCollectData Err:" + err.Error())
+			go alarm_msg.SendAlarmMsg("SearchChartCollectData Err:"+err.Error(), 3)
+		}
+	}()
+	client := utils.EsClient
+
+	mustMap := make([]interface{}, 0)
+	shouldItemMap := make([]interface{}, 0)
+
+	//指标来源
+	if userId > 0 {
+		mustMap = append(mustMap, map[string]interface{}{
+			"term": map[string]interface{}{
+				"UserId": userId,
+			},
+		})
+	}
+
+	// permissionChartClassifyIdList 有权限的分类
+	if len(permissionChartClassifyIdList) > 0 {
+		mustMap = append(mustMap, map[string]interface{}{
+			"terms": map[string]interface{}{
+				"ChartClassifyId": permissionChartClassifyIdList,
+			},
+		})
+	}
+	if keywordStr != "" {
+		mustMap = append(mustMap, map[string]interface{}{
+			"match_phrase": map[string]interface{}{
+				"ChartName": keywordStr,
+			},
+		})
+	}
+	if len(adminIdsSlice) > 0 {
+		mustMap = append(mustMap, map[string]interface{}{
+			"terms": map[string]interface{}{
+				"SysUserId": adminIdsSlice,
+			},
+		})
+	}
+	if len(collectClassifyIds) > 0 {
+		for _, cid := range collectClassifyIds {
+			shouldItemMap = append(shouldItemMap, map[string]interface{}{
+				"match_phrase": map[string]interface{}{
+					"CollectClassifyIds": cid,
+				},
+			})
+		}
+	}
+	/*mustMap = append(mustMap, map[string]interface{}{
+		"bool": shouldMap,
+	})*/
+
+	queryMap := map[string]interface{}{
+		"query": map[string]interface{}{
+			"bool": map[string]interface{}{
+				"must":   mustMap,
+				"should": shouldItemMap,
+			},
+		},
+	}
+	jsonBytes, _ := json.Marshal(queryMap)
+	fmt.Println(string(jsonBytes))
+	//根据条件数量统计
+	requestTotalHits := client.Count(indexName).BodyJson(queryMap)
+	total, err = requestTotalHits.Do(context.Background())
+	if err != nil {
+		return
+	}
+
+	// 分页查询
+	queryMap["from"] = from
+	queryMap["size"] = size
+
+	request := client.Search(indexName).Source(queryMap) // sets the JSON request
+
+	searchMap := make(map[string]string)
+
+	searchResp, err := request.Do(context.Background())
+	if err != nil {
+		return
+	}
+	fmt.Println(searchResp)
+	fmt.Println(searchResp.Status)
+	if searchResp.Status != 0 {
+		return
+	}
+
+	if searchResp.Hits != nil {
+		for _, v := range searchResp.Hits.Hits {
+			if _, ok := searchMap[v.Id]; !ok {
+				itemJson, tmpErr := v.Source.MarshalJSON()
+				if tmpErr != nil {
+					err = tmpErr
+					fmt.Println("movieJson err:", err)
+					return
+				}
+				chartInfoItem := new(chart_collect.ChartCollectEsItem)
+				tmpErr = json.Unmarshal(itemJson, &chartInfoItem)
+				if err != nil {
+					fmt.Println("json.Unmarshal chartInfoJson err:", err)
+					err = tmpErr
+					return
+				}
+				if len(v.Highlight["ChartName"]) > 0 {
+					chartInfoItem.ChartName = v.Highlight["ChartName"][0]
+				}
+				list = append(list, chartInfoItem)
+				searchMap[v.Id] = v.Id
+			}
+		}
+	}
+
+	//for _, v := range result {
+	//	fmt.Println(v)
+	//}
+	return
+}

+ 24 - 0
services/elastic/elastic.go

@@ -290,3 +290,27 @@ func SearchChartInfoData(indexName, keywordStr string, showSysId []int, sourceLi
 	//}
 	return
 }
+
+// EsAddOrEditDataInterface 新增/修改es中的数据
+func EsAddOrEditDataInterface(indexName, docId string, item interface{}) (err error) {
+	defer func() {
+		if err != nil {
+			fmt.Println("EsAddOrEditData Err:", err.Error())
+		}
+	}()
+	client := utils.EsClient
+
+	resp, err := client.Index().Index(indexName).Id(docId).BodyJson(item).Do(context.Background())
+	if err != nil {
+		fmt.Println("新增失败:", err.Error())
+		return err
+	}
+	fmt.Println(resp)
+	if resp.Status == 0 {
+		fmt.Println("新增成功", resp.Result)
+		err = nil
+	} else {
+		fmt.Println("AddData", resp.Status, resp.Result)
+	}
+	return
+}

+ 4 - 2
utils/config.go

@@ -41,8 +41,9 @@ var (
 
 // ES索引配置
 var (
-	DATA_INDEX_NAME  string //数据指标库索引
-	CHART_INDEX_NAME string //研究图库索引
+	DATA_INDEX_NAME          string //数据指标库索引
+	CHART_INDEX_NAME         string //研究图库索引
+	CHART_COLLECT_INDEX_NAME string
 )
 
 // 弘则
@@ -155,6 +156,7 @@ func init() {
 	{
 		DATA_INDEX_NAME = config["data_index_name"]
 		CHART_INDEX_NAME = config["chart_index_name"]
+		CHART_COLLECT_INDEX_NAME = config["chart_collect_index_name"]
 	}
 
 }