hsun 1 anno fa
parent
commit
418535e1d1

+ 0 - 1
controllers/data_manage/correlation/correlation_chart_info.go

@@ -18,7 +18,6 @@ type CorrelationChartInfoController struct {
 	controllers.BaseAuthController
 }
 
-
 // GetChartInfoDetailFromUniqueCode 根据编码获取图表详情
 func GetChartInfoDetailFromUniqueCode(chartInfo *data_manage.ChartInfoView, isCache bool, sysUser *system.Admin) (resp *data_manage.ChartInfoDetailFromUniqueCodeResp, isOk bool, msg, errMsg string) {
 	resp = new(data_manage.ChartInfoDetailFromUniqueCodeResp)

+ 130 - 0
controllers/data_manage/future_good/future_good_chart_info.go

@@ -3,15 +3,24 @@ package future_good
 import (
 	"encoding/json"
 	"fmt"
+	"github.com/rdlucklib/rdluck_tools/paging"
+	"hongze/hongze_ETA_mobile_api/controllers"
+	"hongze/hongze_ETA_mobile_api/models"
 	"hongze/hongze_ETA_mobile_api/models/data_manage"
 	"hongze/hongze_ETA_mobile_api/models/system"
 	"hongze/hongze_ETA_mobile_api/services/data"
 	future_goodServ "hongze/hongze_ETA_mobile_api/services/data/future_good"
 	"hongze/hongze_ETA_mobile_api/utils"
+	"strconv"
 	"strings"
 	"time"
 )
 
+// FutureGoodChartInfoController 商品价格图表管理
+type FutureGoodChartInfoController struct {
+	controllers.BaseAuthController
+}
+
 // GetChartInfoDetailFromUniqueCode 根据编码获取图表详情
 func GetChartInfoDetailFromUniqueCode(chartInfo *data_manage.ChartInfoView, isCache bool, sysUser *system.Admin) (resp *data_manage.ChartInfoDetailFromUniqueCodeResp, isOk bool, msg, errMsg string) {
 	resp = new(data_manage.ChartInfoDetailFromUniqueCodeResp)
@@ -183,3 +192,124 @@ func GetChartInfoDetailFromUniqueCode(chartInfo *data_manage.ChartInfoView, isCa
 	return
 }
 
+// ChartInfoSearchByEs
+// @Title 图表模糊搜索(从es获取)
+// @Description  图表模糊搜索(从es获取)
+// @Param   Keyword   query   string  true       "图表名称"
+// @Param   IsShowMe   query   bool  true       "是否只看我的,true、false"
+// @Success 200 {object} data_manage.ChartInfo
+// @router /chart_info/search_by_es [get]
+func (this *FutureGoodChartInfoController) ChartInfoSearchByEs() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+
+	sysUser := this.SysUser
+	if sysUser == nil {
+		br.Msg = "请登录"
+		br.ErrMsg = "请登录,SysUser Is Empty"
+		br.Ret = 408
+		return
+	}
+	pageSize, _ := this.GetInt("PageSize")
+	currentIndex, _ := this.GetInt("CurrentIndex")
+
+	var startSize int
+	if pageSize <= 0 {
+		pageSize = utils.PageSize20
+	}
+	if currentIndex <= 0 {
+		currentIndex = 1
+	}
+	startSize = paging.StartIndex(currentIndex, pageSize)
+
+	keyword := this.GetString("Keyword")
+
+	//只看我的
+	isShowMe, _ := this.GetBool("IsShowMe")
+	showSysId := 0
+	if isShowMe {
+		showSysId = sysUser.AdminId
+	}
+
+	var searchList []*data_manage.ChartInfo
+	var total int64
+	var err error
+
+	// 获取当前账号的不可见指标
+	noPermissionChartIdList := make([]int, 0)
+	{
+		obj := data_manage.EdbInfoNoPermissionAdmin{}
+		confList, err := obj.GetAllChartListByAdminId(this.SysUser.AdminId)
+		if err != nil && err.Error() != utils.ErrNoRow() {
+			br.Msg = "获取失败"
+			br.ErrMsg = "获取不可见指标配置数据失败,Err:" + err.Error()
+			return
+		}
+		for _, v := range confList {
+			noPermissionChartIdList = append(noPermissionChartIdList, v.ChartInfoId)
+		}
+	}
+
+	if keyword != "" {
+		searchList, total, err = data.EsSearchChartInfo(keyword, showSysId, []int{utils.CHART_SOURCE_FUTURE_GOOD}, noPermissionChartIdList, startSize, pageSize)
+	} else {
+		total, searchList, err = data_manage.ChartInfoSearchByEmptyKeyWord(showSysId, []int{utils.CHART_SOURCE_FUTURE_GOOD}, noPermissionChartIdList)
+		if err != nil && err.Error() != utils.ErrNoRow() {
+			br.Msg = "获取失败"
+			br.ErrMsg = "获取图表信息失败,Err:" + err.Error()
+			return
+		}
+	}
+
+	finalList := make([]*data_manage.ChartInfoMore, 0)
+	if len(searchList) > 0 {
+		chartInfoIds := ""
+		chartEdbMap := make(map[int][]*data_manage.ChartEdbInfoMapping)
+		for _, v := range searchList {
+			chartInfoIds += strconv.Itoa(v.ChartInfoId) + ","
+		}
+		if chartInfoIds != "" {
+			chartInfoIds = strings.Trim(chartInfoIds, ",")
+			//判断是否需要展示英文标识
+			edbList, e := data_manage.GetChartEdbMappingListByChartInfoIds(chartInfoIds)
+			if e != nil {
+				br.Msg = "获取失败"
+				br.ErrMsg = "获取图表,指标信息失败,Err:" + e.Error()
+				return
+			}
+			for _, v := range edbList {
+				chartEdbMap[v.ChartInfoId] = append(chartEdbMap[v.ChartInfoId], v)
+			}
+		}
+
+		for _, v := range searchList {
+			tmp := new(data_manage.ChartInfoMore)
+			tmp.ChartInfo = *v
+			//判断是否需要展示英文标识
+			if edbTmpList, ok := chartEdbMap[v.ChartInfoId]; ok {
+				tmp.IsEnChart = data.CheckIsEnChart(v.ChartNameEn, edbTmpList, v.Source, v.ChartType)
+			}
+			finalList = append(finalList, tmp)
+		}
+	}
+	//新增搜索词记录
+	{
+		searchKeyword := new(data_manage.SearchKeyword)
+		searchKeyword.KeyWord = keyword
+		searchKeyword.CreateTime = time.Now()
+		go data_manage.AddSearchKeyword(searchKeyword)
+	}
+
+	page := paging.GetPaging(currentIndex, pageSize, int(total))
+	resp := data_manage.ChartInfoListByEsResp{
+		Paging: page,
+		List:   finalList,
+	}
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "获取成功"
+	br.Data = resp
+}

+ 1936 - 0
controllers/data_manage/my_chart.go

@@ -0,0 +1,1936 @@
+package data_manage
+
+import (
+	"encoding/json"
+	"fmt"
+	"github.com/rdlucklib/rdluck_tools/paging"
+	"hongze/hongze_ETA_mobile_api/controllers"
+	"hongze/hongze_ETA_mobile_api/models"
+	"hongze/hongze_ETA_mobile_api/models/data_manage"
+	"hongze/hongze_ETA_mobile_api/models/system"
+	"hongze/hongze_ETA_mobile_api/services/data"
+	"hongze/hongze_ETA_mobile_api/utils"
+	"strconv"
+	"strings"
+	"time"
+)
+
+// MyChartController 我的图库
+type MyChartController struct {
+	controllers.BaseAuthController
+}
+
+// ChartList
+// @Title ETA图表列表接口
+// @Description ETA图表列表接口
+// @Param   PageSize   query   int  true       "每页数据条数"
+// @Param   CurrentIndex   query   int  true       "当前页页码,从1开始"
+// @Param   ChartClassifyId   query   int  true       "分类id"
+// @Param   KeyWord   query   string  true       "搜索关键词"
+// @Param   IsShowMe   query   bool  true       "是否只看我的,true、false"
+// @Success 200 {object} data_manage.ChartListResp
+// @router /chart/list [get]
+func (this *MyChartController) ChartList() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+	sysUser := this.SysUser
+	if sysUser == nil {
+		br.Msg = "请登录"
+		br.ErrMsg = "请登录,SysUser Is Empty"
+		br.Ret = 408
+		return
+	}
+
+	chartClassifyId, _ := this.GetInt("ChartClassifyId")
+
+	pageSize, _ := this.GetInt("PageSize")
+	currentIndex, _ := this.GetInt("CurrentIndex")
+	keyWord := this.GetString("KeyWord")
+
+	var total int
+	page := paging.GetPaging(currentIndex, pageSize, total)
+
+	var startSize int
+	if pageSize <= 0 {
+		pageSize = utils.PageSize20
+	}
+	if currentIndex <= 0 {
+		currentIndex = 1
+	}
+	startSize = paging.StartIndex(currentIndex, pageSize)
+
+	var condition string
+	var pars []interface{}
+
+	// 普通图表
+	condition += ` AND source = ? `
+	pars = append(pars, utils.CHART_SOURCE_DEFAULT)
+
+	if chartClassifyId > 0 {
+		chartClassifyId, err := data_manage.GetChartClassify(chartClassifyId)
+		if err != nil && err.Error() != utils.ErrNoRow() {
+			br.Msg = "获取图表信息失败"
+			br.ErrMsg = "获取信息失败,GetChartClassify,Err:" + err.Error()
+			return
+		}
+		condition += " AND chart_classify_id IN(" + chartClassifyId + ") "
+		//pars = append(pars, chartClassifyId)
+	}
+	if keyWord != "" {
+		condition += ` AND  ( chart_name LIKE '%` + keyWord + `%' )`
+	}
+
+	//只看我的
+	isShowMe, _ := this.GetBool("IsShowMe")
+	if isShowMe {
+		condition += ` AND sys_user_id = ? `
+		pars = append(pars, sysUser.AdminId)
+	}
+
+	// 获取当前账号的不可见指标
+	noPermissionChartIdList := make([]int, 0)
+	{
+		obj := data_manage.EdbInfoNoPermissionAdmin{}
+		confList, err := obj.GetAllChartListByAdminId(this.SysUser.AdminId)
+		if err != nil && err.Error() != utils.ErrNoRow() {
+			br.Msg = "获取失败"
+			br.ErrMsg = "获取不可见指标配置数据失败,Err:" + err.Error()
+			return
+		}
+		for _, v := range confList {
+			noPermissionChartIdList = append(noPermissionChartIdList, v.ChartInfoId)
+		}
+	}
+
+	lenNoPermissionChartIdList := len(noPermissionChartIdList)
+	if lenNoPermissionChartIdList > 0 {
+		condition += ` AND chart_info_id not in (` + utils.GetOrmInReplace(lenNoPermissionChartIdList) + `) `
+		pars = append(pars, noPermissionChartIdList)
+	}
+
+	//获取图表信息
+	list, err := data_manage.GetChartListByCondition(condition, pars, startSize, pageSize)
+	if err != nil && err.Error() != utils.ErrNoRow() {
+		br.Success = true
+		br.Msg = "获取图表信息失败"
+		br.ErrMsg = "获取图表信息失败,Err:" + err.Error()
+		return
+	}
+
+	myChartList, err := data_manage.GetMyChartListByAdminId(sysUser.AdminId)
+	if err != nil && err.Error() != utils.ErrNoRow() {
+		br.Msg = "获取图表信息失败"
+		br.ErrMsg = "获取我的图表信息失败,Err:" + err.Error()
+		return
+	}
+	myChartMap := make(map[int]*data_manage.MyChartView)
+	for _, v := range myChartList {
+		myChartMap[v.ChartInfoId] = v
+	}
+	listLen := len(list)
+	chartEdbMap := make(map[int][]*data_manage.ChartEdbInfoMapping)
+	if listLen > 0 {
+		chartInfoIds := ""
+		for _, v := range list {
+			chartInfoIds += strconv.Itoa(v.ChartInfoId) + ","
+		}
+		if chartInfoIds != "" {
+			chartInfoIds = strings.Trim(chartInfoIds, ",")
+			//判断是否需要展示英文标识
+			edbList, e := data_manage.GetChartEdbMappingListByChartInfoIds(chartInfoIds)
+			if e != nil {
+				br.Msg = "获取失败"
+				br.ErrMsg = "获取图表,指标信息失败,Err:" + e.Error()
+				return
+			}
+			for _, v := range edbList {
+				chartEdbMap[v.ChartInfoId] = append(chartEdbMap[v.ChartInfoId], v)
+			}
+		}
+	}
+	for i := 0; i < listLen; i++ {
+		//判断是否需要展示英文标识
+		if edbTmpList, ok := chartEdbMap[list[i].ChartInfoId]; ok {
+			list[i].IsEnChart = data.CheckIsEnChart(list[i].ChartNameEn, edbTmpList, list[i].Source, list[i].ChartType)
+		}
+
+		if existItem, ok := myChartMap[list[i].ChartInfoId]; ok {
+			list[i].IsAdd = true
+			list[i].MyChartId = existItem.MyChartId
+			list[i].MyChartClassifyId = existItem.MyChartClassifyId
+		}
+	}
+
+	resp := new(data_manage.ChartListResp)
+	if list == nil || len(list) <= 0 || (err != nil && err.Error() == utils.ErrNoRow()) {
+		items := make([]*data_manage.ChartInfoView, 0)
+		resp.Paging = page
+		resp.List = items
+		br.Ret = 200
+		br.Success = true
+		br.Msg = "获取成功"
+		return
+	}
+
+	dataCount, err := data_manage.GetChartListCountByCondition(condition, pars)
+	if err != nil && err.Error() != utils.ErrNoRow() {
+		br.Msg = "获取指标信息失败"
+		br.ErrMsg = "获取指标数据总数失败,Err:" + err.Error()
+		return
+	}
+	page = paging.GetPaging(currentIndex, pageSize, dataCount)
+	resp.Paging = page
+	resp.List = list
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "获取成功"
+	br.Data = resp
+}
+
+// ClassifyList
+// @Title 我的图表-分类列表接口
+// @Description 我的图表-分类列表接口
+// @Success 200 {object} data_manage.MyChartClassifyResp
+// @router /classify/list [get]
+func (this *MyChartController) ClassifyList() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+
+	sysUser := this.SysUser
+	if sysUser == nil {
+		br.Msg = "请登录"
+		br.ErrMsg = "请登录,SysUser Is Empty"
+		br.Ret = 408
+		return
+	}
+	//获取图表信息
+	list, err := data_manage.GetMyChartClassifyAll(sysUser.AdminId)
+	if err != nil && err.Error() != utils.ErrNoRow() {
+		br.Success = true
+		br.Msg = "获取分类信息失败"
+		br.ErrMsg = "获取分类信息失败,Err:" + err.Error()
+		return
+	}
+
+	resp := new(data_manage.MyChartClassifyResp)
+	if list == nil || len(list) <= 0 || (err != nil && err.Error() == utils.ErrNoRow()) {
+		items := make([]*data_manage.MyChartClassify, 0)
+		resp.List = items
+		br.Ret = 200
+		br.Success = true
+		br.Msg = "获取成功"
+		return
+	}
+	resp.List = list
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "获取成功"
+	br.Data = resp
+}
+
+// ClassifyAdd
+// @Title 新增我的图表分类
+// @Description 新增我的图表接口
+// @Param	request	body data_manage.MyChartClassifyAddReq true "type json string"
+// @Success 200 Ret=200 保存成功
+// @router /classify/add [post]
+func (this *MyChartController) ClassifyAdd() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+
+	sysUser := this.SysUser
+	if sysUser == nil {
+		br.Msg = "请登录"
+		br.ErrMsg = "请登录,SysUser Is Empty"
+		br.Ret = 408
+		return
+	}
+
+	var req data_manage.MyChartClassifyAddReq
+	err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
+	if err != nil {
+		br.Msg = "参数解析异常!"
+		br.ErrMsg = "参数解析失败,Err:" + err.Error()
+		return
+	}
+	if req.MyChartClassifyName == "" {
+		br.Msg = "请输入分类名称"
+		br.IsSendEmail = false
+		return
+	}
+
+	var condition string
+	var pars []interface{}
+
+	condition += " AND admin_id=? "
+	pars = append(pars, sysUser.AdminId)
+
+	condition += " AND my_chart_classify_name=? "
+	pars = append(pars, req.MyChartClassifyName)
+
+	count, err := data_manage.GetMyChartClassifyCountByCondition(condition, pars)
+	if err != nil {
+		br.Msg = "保存失败"
+		br.ErrMsg = "保存失败,校验名称是否存在失败,Err:" + err.Error()
+		return
+	}
+	if count > 0 {
+		br.Msg = "分类已存在,请重新输入"
+		br.IsSendEmail = false
+		return
+	}
+
+	// 获取我的图库分类的最大排序值
+	sort, err := data_manage.GetMyChartClassifyMastSort(sysUser.AdminId)
+	if err != nil {
+		br.Msg = "保存失败"
+		br.ErrMsg = "保存失败,获取最大排序失败,Err:" + err.Error()
+		return
+	}
+	item := new(data_manage.MyChartClassify)
+	item.AdminId = sysUser.AdminId
+	item.MyChartClassifyName = req.MyChartClassifyName
+	item.Sort = sort + 1
+	item.ModifyTime = time.Now()
+	item.CreateTime = time.Now()
+	err = data_manage.AddMyChartClassify(item)
+	if err != nil {
+		br.Msg = "保存失败"
+		br.ErrMsg = "保存失败,Err:" + err.Error()
+		return
+	}
+
+	//新增操作日志
+	{
+		edbLog := new(data_manage.MyChartLog)
+		edbLog.MyChartId = 0
+		edbLog.ChartInfoId = 0
+		edbLog.SysUserId = sysUser.AdminId
+		edbLog.SysUserRealName = sysUser.RealName
+		edbLog.CreateTime = time.Now()
+		edbLog.Content = string(this.Ctx.Input.RequestBody)
+		edbLog.Status = "新增分类"
+		edbLog.Method = this.Ctx.Input.URI()
+		go data_manage.AddMyChartLog(edbLog)
+	}
+
+	br.Ret = 200
+	br.Msg = "保存成功"
+	br.Success = true
+	br.IsAddLog = true
+}
+
+// ClassifyEdit
+// @Title 编辑我的图表分类
+// @Description 编辑我的图表接口
+// @Param	request	body data_manage.MyChartClassifyEditReq true "type json string"
+// @Success 200 Ret=200 保存成功
+// @router /classify/edit [post]
+func (this *MyChartController) ClassifyEdit() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+
+	sysUser := this.SysUser
+	if sysUser == nil {
+		br.Msg = "请登录"
+		br.ErrMsg = "请登录,SysUser Is Empty"
+		br.Ret = 408
+		return
+	}
+
+	var req data_manage.MyChartClassifyEditReq
+	err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
+	if err != nil {
+		br.Msg = "参数解析异常!"
+		br.ErrMsg = "参数解析失败,Err:" + err.Error()
+		return
+	}
+	if req.MyChartClassifyName == "" {
+		br.Msg = "请输入分类名称"
+		br.IsSendEmail = false
+		return
+	}
+	item, err := data_manage.GetMyChartClassifyById(sysUser.AdminId, req.MyChartClassifyId)
+	if err != nil && err.Error() != utils.ErrNoRow() {
+		br.Msg = "保存失败"
+		br.ErrMsg = "获取分类信息失败,Err:" + err.Error()
+		return
+	}
+	if item == nil {
+		br.Msg = "分类不存在"
+		br.ErrMsg = "分类不存在,Err:" + err.Error()
+		return
+	}
+	var condition string
+	var pars []interface{}
+
+	condition += " AND admin_id=? "
+	pars = append(pars, sysUser.AdminId)
+
+	condition += " AND my_chart_classify_name=? "
+	pars = append(pars, req.MyChartClassifyName)
+
+	condition += " AND my_chart_classify_id<>? "
+	pars = append(pars, req.MyChartClassifyId)
+	//判断名称是否已经存在
+	count, err := data_manage.GetMyChartClassifyCountByCondition(condition, pars)
+	if err != nil {
+		br.Msg = "保存失败"
+		br.ErrMsg = "保存失败,校验名称是否存在失败,Err:" + err.Error()
+		return
+	}
+	if count > 0 {
+		br.Msg = "分类已存在,请重新输入"
+		br.IsSendEmail = false
+		return
+	}
+	err = data_manage.ModifyMyChartClassify(req.MyChartClassifyId, req.MyChartClassifyName)
+	if err != nil {
+		br.Msg = "保存失败"
+		br.ErrMsg = "保存失败,Err:" + err.Error()
+		return
+	}
+	//新增操作日志
+	{
+		edbLog := new(data_manage.MyChartLog)
+		edbLog.MyChartId = 0
+		edbLog.ChartInfoId = 0
+		edbLog.SysUserId = sysUser.AdminId
+		edbLog.SysUserRealName = sysUser.RealName
+		edbLog.CreateTime = time.Now()
+		edbLog.Content = string(this.Ctx.Input.RequestBody)
+		edbLog.Status = "编辑分类"
+		edbLog.Method = this.Ctx.Input.URI()
+		go data_manage.AddMyChartLog(edbLog)
+	}
+	br.Ret = 200
+	br.Msg = "保存成功"
+	br.Success = true
+	br.IsAddLog = true
+}
+
+// ClassifyMove
+// @Title 移动我的图表分类
+// @Description 移动我的图表分类接口
+// @Param	request	body data_manage.MyChartClassifyMoveReq true "type json string"
+// @Success 200 Ret=200 移动成功
+// @router /classify/move [post]
+func (this *MyChartController) ClassifyMove() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+
+	sysUser := this.SysUser
+	if sysUser == nil {
+		br.Msg = "请登录"
+		br.ErrMsg = "请登录,SysUser Is Empty"
+		br.Ret = 408
+		return
+	}
+
+	var req data_manage.MyChartClassifyMoveReq
+	err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
+	if err != nil {
+		br.Msg = "参数解析异常!"
+		br.ErrMsg = "参数解析失败,Err:" + err.Error()
+		return
+	}
+	//查询该分类存不存在
+	item, err := data_manage.GetMyChartClassifyById(sysUser.AdminId, req.MyChartClassifyId)
+	if err != nil && err.Error() != utils.ErrNoRow() {
+		br.Msg = "移动失败,找不到该分类"
+		br.ErrMsg = "获取分类信息失败,Err:" + err.Error()
+		return
+	}
+	if item == nil {
+		br.Msg = "分类不存在"
+		br.ErrMsg = "分类不存在,Err:" + err.Error()
+		return
+	}
+
+	updateCol := make([]string, 0)
+	//如果有传入 上一个兄弟节点分类id
+	if req.PrevClassifyId > 0 {
+		prevClassify, err := data_manage.GetMyChartClassifyById(sysUser.AdminId, req.PrevClassifyId)
+		if err != nil {
+			br.Msg = "移动失败"
+			br.ErrMsg = "获取上一个兄弟节点分类信息失败,Err:" + err.Error()
+			return
+		}
+
+		//如果是移动在两个兄弟节点之间
+		if req.NextClassifyId > 0 {
+			//下一个兄弟节点
+			nextClassify, err := data_manage.GetMyChartClassifyById(sysUser.AdminId, req.NextClassifyId)
+			if err != nil {
+				br.Msg = "移动失败"
+				br.ErrMsg = "获取下一个兄弟节点分类信息失败,Err:" + err.Error()
+				return
+			}
+			//如果上一个兄弟与下一个兄弟的排序权重是一致的,那么需要将下一个兄弟(以及下个兄弟的同样排序权重)的排序权重+2,自己变成上一个兄弟的排序权重+1
+			if prevClassify.Sort == nextClassify.Sort || prevClassify.Sort == item.Sort {
+				//变更兄弟节点的排序
+				updateSortStr := `sort + 2`
+				_ = data_manage.UpdateMyChartClassifySortByClassifyId(sysUser.AdminId, prevClassify.MyChartClassifyId, prevClassify.Sort, updateSortStr)
+			} else {
+				//如果下一个兄弟的排序权重正好是上个兄弟节点的下一层,那么需要再加一层了
+				if nextClassify.Sort-prevClassify.Sort == 1 {
+					//变更兄弟节点的排序
+					updateSortStr := `sort + 1`
+					_ = data_manage.UpdateMyChartClassifySortByClassifyId(sysUser.AdminId, 0, prevClassify.Sort, updateSortStr)
+				}
+			}
+		}
+
+		item.Sort = prevClassify.Sort + 1
+		item.ModifyTime = time.Now()
+		updateCol = append(updateCol, "Sort", "ModifyTime")
+	} else {
+		firstClassify, err := data_manage.GetFirstMyChartClassifyByAdminId(sysUser.AdminId)
+		if err != nil && err.Error() != utils.ErrNoRow() {
+			br.Msg = "移动失败"
+			br.ErrMsg = "获取获取当前账号下的排序第一条的分类信息失败,Err:" + err.Error()
+			return
+		}
+
+		//如果该分类下存在其他分类,且第一个其他分类的排序等于0,那么需要调整排序
+		if firstClassify != nil && firstClassify.Sort == 0 {
+			updateSortStr := ` sort + 1 `
+			_ = data_manage.UpdateMyChartClassifySortByClassifyId(sysUser.AdminId, firstClassify.MyChartClassifyId-1, 0, updateSortStr)
+		}
+
+		item.Sort = 0 //那就是排在第一位
+		item.ModifyTime = time.Now()
+		updateCol = append(updateCol, "Sort", "ModifyTime")
+	}
+
+	//更新
+	if len(updateCol) > 0 {
+		err = item.Update(updateCol)
+		if err != nil {
+			br.Msg = "移动失败"
+			br.ErrMsg = "修改失败,Err:" + err.Error()
+			return
+		}
+	}
+	//新增操作日志
+	{
+		edbLog := new(data_manage.MyChartLog)
+		edbLog.MyChartId = 0
+		edbLog.ChartInfoId = 0
+		edbLog.SysUserId = sysUser.AdminId
+		edbLog.SysUserRealName = sysUser.RealName
+		edbLog.CreateTime = time.Now()
+		edbLog.Content = string(this.Ctx.Input.RequestBody)
+		edbLog.Status = "移动分类"
+		edbLog.Method = this.Ctx.Input.URI()
+		go data_manage.AddMyChartLog(edbLog)
+	}
+	br.Ret = 200
+	br.Msg = "保存成功"
+	br.Success = true
+	br.IsAddLog = true
+}
+
+// ClassifyDelete
+// @Title 删除我的图表分类
+// @Description 删除我的图表接口
+// @Param	request	body data_manage.MyChartClassifyDeleteReq true "type json string"
+// @Success 200 Ret=200 保存成功
+// @router /classify/delete [post]
+func (this *MyChartController) ClassifyDelete() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+
+	sysUser := this.SysUser
+	if sysUser == nil {
+		br.Msg = "请登录"
+		br.ErrMsg = "请登录,SysUser Is Empty"
+		br.Ret = 408
+		return
+	}
+
+	var req data_manage.MyChartClassifyDeleteReq
+	err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
+	if err != nil {
+		br.Msg = "参数解析异常!"
+		br.ErrMsg = "参数解析失败,Err:" + err.Error()
+		return
+	}
+
+	item, err := data_manage.GetMyChartClassifyById(sysUser.AdminId, req.MyChartClassifyId)
+	if err != nil && err.Error() != utils.ErrNoRow() {
+		br.Msg = "保存失败"
+		br.ErrMsg = "获取分类信息失败,Err:" + err.Error()
+		return
+	}
+	if item == nil {
+		br.Msg = "分类已被删除"
+		br.ErrMsg = "分类已被删除,Err:" + err.Error()
+		return
+	}
+
+	//var condition string
+	//var pars []interface{}
+	//
+	//condition += " AND admin_id=? "
+	//pars = append(pars, sysUser.AdminId)
+	//
+	//condition += " AND my_chart_classify_id=? "
+	//pars = append(pars, req.MyChartClassifyId)
+	////判断是否包含图表
+	//count, err := data_manage.GetMyChartClassifyMappingCountByCondition(condition, pars)
+	//if err != nil {
+	//	br.Msg = "保存失败"
+	//	br.ErrMsg = "保存失败,校验名称是否存在失败,Err:" + err.Error()
+	//	return
+	//}
+	//if count > 0 {
+	//	br.Msg = "此分类下含有图表,不可删除"
+	//	br.IsSendEmail = false
+	//	return
+	//}
+	err = data_manage.DeleteMyChartClassify(req.MyChartClassifyId)
+	if err != nil {
+		br.Msg = "删除失败"
+		br.ErrMsg = "删除失败,Err:" + err.Error()
+		return
+	}
+	//新增操作日志
+	{
+		edbLog := new(data_manage.MyChartLog)
+		edbLog.MyChartId = 0
+		edbLog.ChartInfoId = 0
+		edbLog.SysUserId = sysUser.AdminId
+		edbLog.SysUserRealName = sysUser.RealName
+		edbLog.CreateTime = time.Now()
+		edbLog.Content = string(this.Ctx.Input.RequestBody)
+		edbLog.Status = "删除分类"
+		edbLog.Method = this.Ctx.Input.URI()
+		go data_manage.AddMyChartLog(edbLog)
+	}
+	br.Ret = 200
+	br.Msg = "删除成功"
+	br.Success = true
+	br.IsAddLog = true
+}
+
+// MyChartAdd
+// @Title 新增我的图表
+// @Description 新增我的图表接口
+// @Param	request	body data_manage.MyChartAddReq true "type json string"
+// @Success 200 Ret=200 保存成功
+// @router /add [post]
+func (this *MyChartController) MyChartAdd() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+
+	sysUser := this.SysUser
+	if sysUser == nil {
+		br.Msg = "请登录"
+		br.ErrMsg = "请登录,SysUser Is Empty"
+		br.Ret = 408
+		return
+	}
+
+	var req data_manage.MyChartAddReq
+	err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
+	if err != nil {
+		br.Msg = "参数解析异常!"
+		br.ErrMsg = "参数解析失败,Err:" + err.Error()
+		return
+	}
+
+	chartItem, err := data_manage.GetChartInfoById(req.ChartInfoId)
+	if err != nil && err.Error() != utils.ErrNoRow() {
+		br.Msg = "获取图表信息失败!"
+		br.ErrMsg = "获取图表信息失败,Err:" + err.Error()
+		return
+	}
+	if chartItem == nil {
+		br.Msg = "此图表已被删除!"
+		br.ErrMsg = "此图表已被删除,ChartInfoId:" + strconv.Itoa(req.ChartInfoId)
+		return
+	}
+
+	var condition string
+	var pars []interface{}
+
+	condition += " AND admin_id=? "
+	pars = append(pars, sysUser.AdminId)
+
+	condition += " AND chart_info_id=? "
+	pars = append(pars, req.ChartInfoId)
+
+	existItem, err := data_manage.GetMyChartDetailByCondition(condition, pars)
+	if err != nil && err.Error() != utils.ErrNoRow() {
+		br.Msg = "保存失败"
+		br.ErrMsg = "保存失败,校验名称是否存在失败,Err:" + err.Error()
+		return
+	}
+	resp := new(data_manage.MyChartAddResp)
+	var myChartClassifyId string
+	if existItem != nil { //修改
+		fmt.Println("modify")
+		for _, v := range req.MyChartClassifyId {
+			myChartClassifyId += strconv.Itoa(v) + ","
+		}
+		resp.MyChartInfoId = existItem.MyChartId
+		err = data_manage.MoveMyChartClassify(sysUser.AdminId, existItem.MyChartId, req.MyChartClassifyId)
+		if err != nil {
+			br.Msg = "保存失败"
+			br.ErrMsg = "保存我的图表失败,MoveMyChartClassify,Err:" + err.Error()
+			return
+		}
+	} else {
+		myChart := &data_manage.MyChart{
+			//MyChartId:   0,
+			ChartInfoId: chartItem.ChartInfoId,
+			Source:      chartItem.Source,
+			AdminId:     sysUser.AdminId,
+			CreateTime:  time.Now(),
+			ModifyTime:  time.Now(),
+		}
+		newMyChartId, err := data_manage.AddMyChart(myChart)
+		if err != nil {
+			br.Msg = "保存失败"
+			br.ErrMsg = "保存我的图表失败,Err:" + err.Error()
+			return
+		}
+		//step := float64(65536)
+
+		for _, v := range req.MyChartClassifyId {
+			//获取最大的排序字段
+			//count, _ := data_manage.GetMyChartMaxSort(sysUser.AdminId, v)
+			mappingItem := new(data_manage.MyChartClassifyMapping)
+			mappingItem.AdminId = sysUser.AdminId
+			mappingItem.MyChartId = int(newMyChartId)
+			mappingItem.MyChartClassifyId = v
+			mappingItem.CreateTime = time.Now()
+			mappingItem.ModifyTime = time.Now()
+			//mappingItem.Sort = (float64(count) + 1) * step
+			mappingItem.Sort = 0
+			_, err = data_manage.AddMyChartClassifyMapping(mappingItem)
+			if err != nil {
+				br.Msg = "保存失败"
+				br.ErrMsg = "保存我的图表AddMyChartClassifyMapping失败,Err:" + err.Error()
+				return
+			}
+			myChartClassifyId += strconv.Itoa(v) + ","
+		}
+		//新增操作日志
+		{
+			edbLog := new(data_manage.MyChartLog)
+			edbLog.MyChartId = myChart.MyChartId
+			edbLog.ChartInfoId = myChart.ChartInfoId
+			edbLog.SysUserId = sysUser.AdminId
+			edbLog.SysUserRealName = sysUser.RealName
+			edbLog.CreateTime = time.Now()
+			edbLog.Content = string(this.Ctx.Input.RequestBody)
+			edbLog.Status = "新增我的图表"
+			edbLog.Method = this.Ctx.Input.URI()
+			go data_manage.AddMyChartLog(edbLog)
+		}
+		resp.MyChartInfoId = int(newMyChartId)
+	}
+	resp.MyChartClassifyId = strings.Trim(myChartClassifyId, ",")
+
+	//更新es
+	if resp.MyChartInfoId > 0 {
+		go data.EsAddOrEditMyChartInfoByMyChartId(resp.MyChartInfoId)
+	}
+
+	br.Ret = 200
+	br.Msg = "保存成功"
+	br.Success = true
+	br.Data = resp
+	br.IsAddLog = true
+}
+
+// MyChartAddToClassify
+// @Title 将图表加入到我的图表分类
+// @Description 新增我的图表接口
+// @Param	request	body data_manage.MyChartAddReq true "type json string"
+// @Success 200 Ret=200 保存成功
+// @router /add_to_classify [post]
+func (this *MyChartController) MyChartAddToClassify() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+
+	sysUser := this.SysUser
+	if sysUser == nil {
+		br.Msg = "请登录"
+		br.ErrMsg = "请登录,SysUser Is Empty"
+		br.Ret = 408
+		return
+	}
+
+	var req data_manage.MyChartAddReq
+	err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
+	if err != nil {
+		br.Msg = "参数解析异常!"
+		br.ErrMsg = "参数解析失败,Err:" + err.Error()
+		return
+	}
+
+	chartItem, err := data_manage.GetChartInfoById(req.ChartInfoId)
+	if err != nil && err.Error() != utils.ErrNoRow() {
+		br.Msg = "获取图表信息失败!"
+		br.ErrMsg = "获取图表信息失败,Err:" + err.Error()
+		return
+	}
+	if chartItem == nil {
+		br.Msg = "此图表已被删除!"
+		br.ErrMsg = "此图表已被删除,ChartInfoId:" + strconv.Itoa(req.ChartInfoId)
+		return
+	}
+
+	var condition string
+	var pars []interface{}
+
+	condition += " AND admin_id=? "
+	pars = append(pars, sysUser.AdminId)
+
+	condition += " AND chart_info_id=? "
+	pars = append(pars, req.ChartInfoId)
+
+	existItem, err := data_manage.GetMyChartDetailByCondition(condition, pars)
+	if err != nil && err.Error() != utils.ErrNoRow() {
+		br.Msg = "保存失败"
+		br.ErrMsg = "保存失败,校验名称是否存在失败,Err:" + err.Error()
+		return
+	}
+	resp := new(data_manage.MyChartAddResp)
+	var myChartClassifyId string
+	if existItem != nil { //修改
+		fmt.Println("modify")
+		for _, v := range req.MyChartClassifyId {
+			myChartClassifyId += strconv.Itoa(v) + ","
+		}
+		resp.MyChartInfoId = existItem.MyChartId
+		err = data_manage.AddMyChartToMyChartClassify(sysUser.AdminId, existItem.MyChartId, req.MyChartClassifyId)
+		if err != nil {
+			br.Msg = "保存失败"
+			br.ErrMsg = "保存我的图表失败,MoveMyChartClassify,Err:" + err.Error()
+			return
+		}
+	} else {
+		myChart := &data_manage.MyChart{
+			//MyChartId:   0,
+			ChartInfoId: chartItem.ChartInfoId,
+			Source:      chartItem.Source,
+			AdminId:     sysUser.AdminId,
+			CreateTime:  time.Now(),
+			ModifyTime:  time.Now(),
+		}
+		newMyChartId, err := data_manage.AddMyChart(myChart)
+		if err != nil {
+			br.Msg = "保存失败"
+			br.ErrMsg = "保存我的图表失败,Err:" + err.Error()
+			return
+		}
+		step := float64(65536)
+
+		for _, v := range req.MyChartClassifyId {
+			//获取最大的排序字段
+			count, _ := data_manage.GetMyChartMaxSort(sysUser.AdminId, v)
+			mappingItem := new(data_manage.MyChartClassifyMapping)
+			mappingItem.AdminId = sysUser.AdminId
+			mappingItem.MyChartId = int(newMyChartId)
+			mappingItem.MyChartClassifyId = v
+			mappingItem.CreateTime = time.Now()
+			mappingItem.ModifyTime = time.Now()
+			mappingItem.Sort = (float64(count) + 1) * step
+			_, err = data_manage.AddMyChartClassifyMapping(mappingItem)
+			if err != nil {
+				br.Msg = "保存失败"
+				br.ErrMsg = "保存我的图表AddMyChartClassifyMapping失败,Err:" + err.Error()
+				return
+			}
+			myChartClassifyId += strconv.Itoa(v) + ","
+		}
+		//新增操作日志
+		{
+			edbLog := new(data_manage.MyChartLog)
+			edbLog.MyChartId = myChart.MyChartId
+			edbLog.ChartInfoId = myChart.ChartInfoId
+			edbLog.SysUserId = sysUser.AdminId
+			edbLog.SysUserRealName = sysUser.RealName
+			edbLog.CreateTime = time.Now()
+			edbLog.Content = string(this.Ctx.Input.RequestBody)
+			edbLog.Status = "新增我的图表"
+			edbLog.Method = this.Ctx.Input.URI()
+			go data_manage.AddMyChartLog(edbLog)
+		}
+		resp.MyChartInfoId = int(newMyChartId)
+	}
+	resp.MyChartClassifyId = strings.Trim(myChartClassifyId, ",")
+
+	//更新es
+	if resp.MyChartInfoId > 0 {
+		go data.EsAddOrEditMyChartInfoByMyChartId(resp.MyChartInfoId)
+	}
+
+	br.Ret = 200
+	br.Msg = "保存成功"
+	br.Success = true
+	br.Data = resp
+	br.IsAddLog = true
+}
+
+// GetMyChartClassifyIdList
+// @Title 根据我的图表id获取所属分类列表
+// @Description 根据我的图表id获取所属分类列表接口
+// @Param  query ChartInfoId       int   `description:"图表id"`
+// @Success 200 {object} []int
+// @router /get_mychart_classify_id_list [get]
+func (this *MyChartController) GetMyChartClassifyIdList() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+
+	sysUser := this.SysUser
+	if sysUser == nil {
+		br.Msg = "请登录"
+		br.ErrMsg = "请登录,SysUser Is Empty"
+		br.Ret = 408
+		return
+	}
+	chartInfoId, _ := this.GetInt("ChartInfoId")
+	if chartInfoId <= 0 {
+		br.Msg = "请传入图表id"
+		br.IsSendEmail = false
+		return
+	}
+
+	//图表分类id列表
+	chartClassifyIdList := make([]int, 0)
+
+	var condition string
+	var pars []interface{}
+
+	condition += " AND admin_id=? AND chart_info_id=? "
+	pars = append(pars, sysUser.AdminId, chartInfoId)
+
+	existItem, _ := data_manage.GetMyChartDetailByCondition(condition, pars)
+	if existItem != nil {
+		myChartClassifyList, err := data_manage.GetMyChartClassifyList(existItem.MyChartId)
+		if err != nil && err.Error() != utils.ErrNoRow() {
+			br.Msg = "获取图表信息失败!"
+			br.ErrMsg = "获取图表信息失败,Err:" + err.Error()
+			return
+		}
+
+		for _, v := range myChartClassifyList {
+			chartClassifyIdList = append(chartClassifyIdList, v.MyChartClassifyId)
+		}
+	}
+
+	br.Ret = 200
+	br.Msg = "获取成功"
+	br.Success = true
+	br.Data = chartClassifyIdList
+}
+
+// MyChartDelete
+// @Title 删除-我的图表-中的图表
+// @Description 删除-我的图表-中的图表接口
+// @Param	request	body data_manage.MyChartDeleteReq true "type json string"
+// @Success 200 Ret=200 保存成功
+// @router /delete [post]
+func (this *MyChartController) MyChartDelete() {
+	setNxKey := "MyChartDelete_"
+	deleteCache := true
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		if deleteCache {
+			utils.Rc.Delete(setNxKey)
+		}
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+
+	sysUser := this.SysUser
+	if sysUser == nil {
+		br.Msg = "请登录"
+		br.ErrMsg = "请登录,SysUser Is Empty"
+		br.Ret = 408
+		return
+	}
+
+	var req data_manage.MyChartDeleteReq
+	err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
+	if err != nil {
+		br.Msg = "参数解析异常!"
+		br.ErrMsg = "参数解析失败,Err:" + err.Error()
+		return
+	}
+	setNxKey += strconv.Itoa(req.MyChartId) + strconv.Itoa(req.MyChartClassifyId)
+	if !utils.Rc.SetNX(setNxKey, 1, 3*time.Second) {
+		deleteCache = false
+		br.Msg = "系统处理中,请稍后重试!"
+		br.IsSendEmail = false
+		return
+	}
+	if req.MyChartId <= 0 {
+		br.Msg = "参数错误!"
+		br.ErrMsg = "参数错误,Err:" + string(this.Ctx.Input.RequestBody)
+		return
+	}
+	isDelMyChart, err := data_manage.DeleteMyChart(req.MyChartId, req.MyChartClassifyId)
+	if err != nil {
+		br.Msg = "移除失败!"
+		br.ErrMsg = "移除失败,Err:" + err.Error()
+		return
+	}
+	//新增操作日志
+	{
+		edbLog := new(data_manage.MyChartLog)
+		edbLog.MyChartId = 0
+		edbLog.ChartInfoId = 0
+		edbLog.SysUserId = sysUser.AdminId
+		edbLog.SysUserRealName = sysUser.RealName
+		edbLog.CreateTime = time.Now()
+		edbLog.Content = string(this.Ctx.Input.RequestBody)
+		edbLog.Status = "删除-我的图表-中的图表"
+		edbLog.Method = this.Ctx.Input.URI()
+		go data_manage.AddMyChartLog(edbLog)
+	}
+
+	if isDelMyChart {
+		//如果确实删除了,那么就去ES同步删除
+		go data.EsDeleteMyChartInfoByMyChartId(req.MyChartId)
+	} else {
+		//如果只是删除了关系,那么就去ES同步更新数据
+		go data.EsAddOrEditMyChartInfoByMyChartId(req.MyChartId)
+	}
+	br.Ret = 200
+	br.Msg = "移除成功"
+	br.Success = true
+	br.IsAddLog = true
+}
+
+// MyChartEdit
+// @Title 编辑我的图表
+// @Description 编辑我的图表接口
+// @Param	request	body data_manage.MyChartEditReq true "type json string"
+// @Success 200 Ret=200 保存成功
+// @router /edit [post]
+func (this *MyChartController) MyChartEdit() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+
+	sysUser := this.SysUser
+	if sysUser == nil {
+		br.Msg = "请登录"
+		br.ErrMsg = "请登录,SysUser Is Empty"
+		br.Ret = 408
+		return
+	}
+
+	var req data_manage.MyChartEditReq
+	err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
+	if err != nil {
+		br.Msg = "参数解析异常!"
+		br.ErrMsg = "参数解析失败,Err:" + err.Error()
+		return
+	}
+	for _, v := range req.MyChartClassifyId {
+		myChartClassifyId := v
+		count, _ := data_manage.GetMyChartClassifyMappingCount(sysUser.AdminId, req.MyChartId, myChartClassifyId)
+		if count <= 0 {
+			mappingItem := new(data_manage.MyChartClassifyMapping)
+			mappingItem.AdminId = sysUser.AdminId
+			mappingItem.MyChartId = req.MyChartId
+			mappingItem.MyChartClassifyId = myChartClassifyId
+			mappingItem.CreateTime = time.Now()
+			_, err = data_manage.AddMyChartClassifyMapping(mappingItem)
+		}
+	}
+	err = data_manage.DeleteMyChartClassifyMapping(sysUser.AdminId, req.MyChartId, req.CurrentMyChartClassifyId)
+	if err != nil {
+		br.Msg = "保存失败!"
+		br.ErrMsg = "保存失败,移除分类失败,Err:" + err.Error()
+		return
+	}
+	//新增操作日志
+	{
+		edbLog := new(data_manage.MyChartLog)
+		edbLog.MyChartId = 0
+		edbLog.ChartInfoId = 0
+		edbLog.SysUserId = sysUser.AdminId
+		edbLog.SysUserRealName = sysUser.RealName
+		edbLog.CreateTime = time.Now()
+		edbLog.Content = string(this.Ctx.Input.RequestBody)
+		edbLog.Status = "编辑我的图表"
+		edbLog.Method = this.Ctx.Input.URI()
+		go data_manage.AddMyChartLog(edbLog)
+	}
+
+	//更新es
+	if req.MyChartId > 0 {
+		go data.EsAddOrEditMyChartInfoByMyChartId(req.MyChartId)
+	}
+
+	br.Ret = 200
+	br.Msg = "保存成功"
+	br.Success = true
+	br.IsAddLog = true
+}
+
+// MyChartList
+// @Title 我的图表-列表接口
+// @Description 我的图表-列表接口
+// @Param   PageSize   query   int  true       "每页数据条数"
+// @Param   CurrentIndex   query   int  true       "当前页页码,从1开始"
+// @Param   MyChartClassifyId   query   int  true       "我的图表分类id"
+// @Param   MyChartId   query   int  true       "我的图表id"
+// @Success 200 {object} data_manage.MyChartListResp
+// @router /list [get]
+func (this *MyChartController) MyChartList() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+
+	sysUser := this.SysUser
+	if sysUser == nil {
+		br.Msg = "请登录"
+		br.ErrMsg = "请登录,SysUser Is Empty"
+		br.Ret = 408
+		return
+	}
+
+	myChartClassifyId, _ := this.GetInt("MyChartClassifyId")
+
+	pageSize, _ := this.GetInt("PageSize")
+	currentIndex, _ := this.GetInt("CurrentIndex")
+
+	myChartId, _ := this.GetInt("MyChartId")
+
+	var total int
+	page := paging.GetPaging(currentIndex, pageSize, total)
+
+	var startSize int
+	if pageSize <= 0 {
+		pageSize = utils.PageSize20
+	}
+	if currentIndex <= 0 {
+		currentIndex = 1
+	}
+	startSize = paging.StartIndex(currentIndex, pageSize)
+
+	var condition string
+	var pars []interface{}
+
+	condition += " AND (a.admin_id=?  or  d.is_public=1)"
+	pars = append(pars, sysUser.AdminId)
+
+	if myChartClassifyId > 0 {
+		condition += " AND c.my_chart_classify_id=? "
+		pars = append(pars, myChartClassifyId)
+	}
+
+	if myChartId > 0 {
+		condition += " AND a.my_chart_id=? "
+		pars = append(pars, myChartId)
+	}
+
+	// 获取当前账号的不可见指标
+	noPermissionChartIdList := make([]int, 0)
+	{
+		obj := data_manage.EdbInfoNoPermissionAdmin{}
+		confList, err := obj.GetAllChartListByAdminId(this.SysUser.AdminId)
+		if err != nil && err.Error() != utils.ErrNoRow() {
+			br.Msg = "获取失败"
+			br.ErrMsg = "获取不可见指标配置数据失败,Err:" + err.Error()
+			return
+		}
+		for _, v := range confList {
+			noPermissionChartIdList = append(noPermissionChartIdList, v.ChartInfoId)
+		}
+	}
+
+	lenNoPermissionChartIdList := len(noPermissionChartIdList)
+	if lenNoPermissionChartIdList > 0 {
+		condition += ` AND b.chart_info_id not in (` + utils.GetOrmInReplace(lenNoPermissionChartIdList) + `) `
+		pars = append(pars, noPermissionChartIdList)
+	}
+
+	//获取图表信息
+	list, err := data_manage.GetMyChartListByCondition(condition, pars, startSize, pageSize)
+	if err != nil && err.Error() != utils.ErrNoRow() {
+		br.Success = true
+		br.Msg = "获取图表信息失败"
+		br.ErrMsg = "获取图表信息失败,Err:" + err.Error()
+		return
+	}
+	myChartList, err := data_manage.GetMyChartListByAdminId(sysUser.AdminId)
+	if err != nil && err.Error() != utils.ErrNoRow() {
+		br.Msg = "获取图表信息失败"
+		br.ErrMsg = "获取我的图表信息失败,Err:" + err.Error()
+		return
+	}
+	myChartMap := make(map[int]int)
+	chartInfoIds := ""
+	chartEdbMap := make(map[int][]*data_manage.ChartEdbInfoMapping)
+	for _, v := range myChartList {
+		myChartMap[v.ChartInfoId] = v.ChartInfoId
+		chartInfoIds += strconv.Itoa(v.ChartInfoId) + ","
+	}
+	if chartInfoIds != "" {
+		chartInfoIds = strings.Trim(chartInfoIds, ",")
+		//判断是否需要展示英文标识
+		edbList, e := data_manage.GetChartEdbMappingListByChartInfoIds(chartInfoIds)
+		if e != nil {
+			br.Msg = "获取失败"
+			br.ErrMsg = "获取图表,指标信息失败,Err:" + e.Error()
+			return
+		}
+		for _, v := range edbList {
+			chartEdbMap[v.ChartInfoId] = append(chartEdbMap[v.ChartInfoId], v)
+		}
+	}
+
+	listLen := len(list)
+	for i := 0; i < listLen; i++ {
+		//判断是否需要展示英文标识
+		if edbTmpList, ok := chartEdbMap[list[i].ChartInfoId]; ok {
+			list[i].IsEnChart = data.CheckIsEnChart(list[i].ChartNameEn, edbTmpList, list[i].Source, list[i].ChartType)
+		}
+		if _, ok := myChartMap[list[i].ChartInfoId]; ok {
+			list[i].IsAdd = true
+		}
+	}
+	resp := new(data_manage.MyChartListResp)
+	if list == nil || len(list) <= 0 || (err != nil && err.Error() == utils.ErrNoRow()) {
+		items := make([]*data_manage.MyChartList, 0)
+		resp.Paging = page
+		resp.List = items
+		br.Ret = 200
+		br.Success = true
+		br.Msg = "获取成功"
+		return
+	}
+	total, err = data_manage.GetMyChartListCountByCondition(condition, pars)
+	if err != nil && err.Error() != utils.ErrNoRow() {
+		br.Msg = "获取信息失败"
+		br.ErrMsg = "获取我的图表数据总数失败,Err:" + err.Error()
+		return
+	}
+	page = paging.GetPaging(currentIndex, pageSize, total)
+	resp.Paging = page
+	resp.List = list
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "获取成功"
+	br.Data = resp
+}
+
+// MyChartMove
+// @Title 移动我的图表接口
+// @Description 移动我的图表接口
+// @Success 200 {object} data_manage.MoveMyChartReq
+// @router /move [post]
+func (this *MyChartController) MyChartMove() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+
+	sysUser := this.SysUser
+	if sysUser == nil {
+		br.Msg = "请登录"
+		br.ErrMsg = "请登录,SysUser Is Empty"
+		br.Ret = 408
+		return
+	}
+	adminId := sysUser.AdminId
+	var req data_manage.MoveMyChartReq
+	err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
+	if err != nil {
+		br.Msg = "参数解析异常!"
+		br.ErrMsg = "参数解析失败,Err:" + err.Error()
+		return
+	}
+	step := float64(65536)
+	var newSort float64
+	if req.PrevMyChartId <= 0 {
+		firstMapItem, err := data_manage.GetMyChartSort(adminId, req.MyChartClassifyId, 0)
+		if err != nil {
+			br.Msg = "获取数据失败!"
+			br.ErrMsg = "获取数据失败,GetMyChartClassifyMapping,Err:" + err.Error()
+			return
+		}
+		if firstMapItem.Sort <= 0 {
+			firstSort := step / float64(2)
+			err = data_manage.MyChartMove(firstSort, adminId, firstMapItem.MyChartId, firstMapItem.MyChartClassifyId)
+			if err != nil {
+				br.Msg = "移动失败!"
+				br.ErrMsg = "移动失败,Err:" + err.Error()
+				return
+			}
+			newSort = step / float64(4)
+		} else {
+			newSort = firstMapItem.Sort / float64(2)
+		}
+	} else if req.NextMyChartId <= 0 {
+		latestMapItem, err := data_manage.GetMyChartSort(adminId, req.MyChartClassifyId, 1)
+		if err != nil {
+			br.Msg = "获取数据失败!"
+			br.ErrMsg = "获取数据失败,GetMyChartClassifyMapping,Err:" + err.Error()
+			return
+		}
+		if latestMapItem.Sort <= 0 {
+			latestSort := step / float64(2)
+			err = data_manage.MyChartMove(latestSort, adminId, latestMapItem.MyChartId, latestMapItem.MyChartClassifyId)
+			if err != nil {
+				br.Msg = "移动失败!"
+				br.ErrMsg = "移动失败,Err:" + err.Error()
+				return
+			}
+			newSort = step / float64(4)
+		} else {
+			newSort = latestMapItem.Sort + (step / float64(2)) - 1
+		}
+	} else {
+		preMapItem, err := data_manage.GetMyChartClassifyMapping(adminId, req.PrevMyChartId, req.MyChartClassifyId)
+		if err != nil {
+			br.Msg = "获取数据失败!"
+			br.ErrMsg = "获取数据失败,GetMyChartClassifyMapping,Err:" + err.Error()
+			return
+		}
+		nextMapItem, err := data_manage.GetMyChartClassifyMapping(adminId, req.NextMyChartId, req.MyChartClassifyId)
+		if err != nil {
+			br.Msg = "获取数据失败!"
+			br.ErrMsg = "获取数据失败,GetMyChartClassifyMapping,Err:" + err.Error()
+			return
+		}
+		newSort = (preMapItem.Sort + nextMapItem.Sort) / 2
+	}
+	if newSort >= 0 {
+		err = data_manage.MyChartMove(newSort, adminId, req.MyChartId, req.MyChartClassifyId)
+		if err != nil {
+			br.Msg = "移动失败!"
+			br.ErrMsg = "移动失败,Err:" + err.Error()
+			return
+		}
+	} else {
+		utils.FileLog.Info("MyChartMove Sort=0:" + string(this.Ctx.Input.RequestBody))
+	}
+	//新增操作日志
+	{
+		edbLog := new(data_manage.MyChartLog)
+		edbLog.MyChartId = 0
+		edbLog.ChartInfoId = 0
+		edbLog.SysUserId = sysUser.AdminId
+		edbLog.SysUserRealName = sysUser.RealName
+		edbLog.CreateTime = time.Now()
+		edbLog.Content = string(this.Ctx.Input.RequestBody)
+		edbLog.Status = "移动我的图表"
+		edbLog.Method = this.Ctx.Input.URI()
+		go data_manage.AddMyChartLog(edbLog)
+	}
+
+	//更新es
+	if req.MyChartId > 0 {
+		go data.EsAddOrEditMyChartInfoByMyChartId(req.MyChartId)
+	}
+
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "移动成功"
+	br.IsAddLog = true
+}
+
+// ChartRecommendList
+// @Title ETA图表-推荐列表接口
+// @Description ETA图表-推荐列表接口
+// @Param   ChartClassifyId   query   int  true       "分类id"
+// @Success 200 {object} data_manage.ChartRecommendListResp
+// @router /chart/recommend/list [get]
+func (this *MyChartController) ChartRecommendList() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+
+	sysUser := this.SysUser
+	if sysUser == nil {
+		br.Msg = "请登录"
+		br.ErrMsg = "请登录,SysUser Is Empty"
+		br.Ret = 408
+		return
+	}
+
+	pageSize := 6
+	currentIndex := 1
+	var startSize int
+	startSize = paging.StartIndex(currentIndex, pageSize)
+
+	var condition string
+	var pars []interface{}
+
+	if sysUser.AdminId > 0 {
+		condition += " AND a.admin_id=? "
+		pars = append(pars, sysUser.AdminId)
+	}
+
+	//获取图表信息
+	list, err := data_manage.GetRecommendChartListByCondition(condition, pars, startSize, pageSize)
+	if err != nil && err.Error() != utils.ErrNoRow() {
+		br.Success = true
+		br.Msg = "获取图表信息失败"
+		br.ErrMsg = "获取图表信息失败,Err:" + err.Error()
+		return
+	}
+
+	myChartList, err := data_manage.GetMyChartListByAdminId(sysUser.AdminId)
+	if err != nil && err.Error() != utils.ErrNoRow() {
+		br.Msg = "获取图表信息失败"
+		br.ErrMsg = "获取我的图表信息失败,Err:" + err.Error()
+		return
+	}
+	myChartMap := make(map[int]int)
+	for _, v := range myChartList {
+		myChartMap[v.ChartInfoId] = v.ChartInfoId
+	}
+	listLen := len(list)
+	for i := 0; i < listLen; i++ {
+		if _, ok := myChartMap[list[i].ChartInfoId]; ok {
+			list[i].IsAdd = true
+		}
+	}
+
+	resp := new(data_manage.ChartRecommendListResp)
+	if list == nil || len(list) <= 0 || (err != nil && err.Error() == utils.ErrNoRow()) {
+		items := make([]*data_manage.ChartInfoView, 0)
+		resp.List = items
+		br.Ret = 200
+		br.Success = true
+		br.Msg = "获取成功"
+		return
+	}
+
+	resp.List = list
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "获取成功"
+	br.Data = resp
+}
+
+// MyChartSearch
+// @Title 我的图表-列表接口
+// @Description 我的图表-列表接口
+// @Param   KeyWord   query   string  true       "搜索关键词"
+// @Success 200 {object} data_manage.MyChartListResp
+// @router /search [get]
+func (this *MyChartController) MyChartSearch() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+
+	sysUser := this.SysUser
+	if sysUser == nil {
+		br.Msg = "请登录"
+		br.ErrMsg = "请登录,SysUser Is Empty"
+		br.Ret = 408
+		return
+	}
+
+	var condition string
+	var pars []interface{}
+
+	condition += " AND a.admin_id=? "
+	pars = append(pars, sysUser.AdminId)
+
+	keyWord := this.GetString("KeyWord")
+	if keyWord != "" {
+		condition += ` AND chart_name LIKE '%` + keyWord + `%' `
+	}
+
+	//获取图表信息
+	list, err := data_manage.GetMyChartSearchByCondition(condition, pars)
+	if err != nil && err.Error() != utils.ErrNoRow() {
+		br.Success = true
+		br.Msg = "获取图表信息失败"
+		br.ErrMsg = "获取图表信息失败,Err:" + err.Error()
+		return
+	}
+	listLen := len(list)
+	for i := 0; i < listLen; i++ {
+		list[i].IsAdd = true
+	}
+	resp := new(data_manage.MyChartSearchListResp)
+	if list == nil {
+		list = make([]*data_manage.MyChartList, 0)
+	}
+	resp.List = list
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "获取成功"
+	br.Data = resp
+}
+
+// MyChartSearchByEs
+// @Title 我的图表-列表接口
+// @Description 我的图表-列表接口
+// @Param   Keyword   query   string  true       "搜索关键词"
+// @Success 200 {object} data_manage.MyChartListResp
+// @router /search_by_es [get]
+func (this *MyChartController) MyChartSearchByEs() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+
+	sysUser := this.SysUser
+	if sysUser == nil {
+		br.Msg = "请登录"
+		br.ErrMsg = "请登录,SysUser Is Empty"
+		br.Ret = 408
+		return
+	}
+
+	pageSize, _ := this.GetInt("PageSize")
+	currentIndex, _ := this.GetInt("CurrentIndex")
+
+	var startSize int
+	if pageSize <= 0 {
+		pageSize = utils.PageSize20
+	}
+	if currentIndex <= 0 {
+		currentIndex = 1
+	}
+	startSize = paging.StartIndex(currentIndex, pageSize)
+
+	keyword := this.GetString("Keyword")
+
+	// 获取当前账号的不可见指标
+	noPermissionChartIdList := make([]int, 0)
+	{
+		obj := data_manage.EdbInfoNoPermissionAdmin{}
+		confList, err := obj.GetAllChartListByAdminId(this.SysUser.AdminId)
+		if err != nil && err.Error() != utils.ErrNoRow() {
+			br.Msg = "获取失败"
+			br.ErrMsg = "获取不可见指标配置数据失败,Err:" + err.Error()
+			return
+		}
+		for _, v := range confList {
+			noPermissionChartIdList = append(noPermissionChartIdList, v.ChartInfoId)
+		}
+	}
+
+	//获取图表信息
+	list, total, err := data.EsSearchMyChartInfo(keyword, sysUser.AdminId, noPermissionChartIdList, startSize, pageSize)
+	if err != nil {
+		br.Msg = "获取失败"
+		br.ErrMsg = "获取图表信息失败,Err:" + err.Error()
+		return
+	}
+	if len(list) <= 0 {
+		list = make([]*data_manage.MyChartList, 0)
+	}
+	for _, v := range list {
+		v.IsAdd = true
+	}
+
+	page := paging.GetPaging(currentIndex, pageSize, int(total))
+	resp := data_manage.MyChartSearchListResp{
+		List:   list,
+		Paging: page,
+	}
+
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "获取成功"
+	br.Data = resp
+}
+
+// PublicClassifyList
+// @Title 我的图表-公共分类列表接口
+// @Description 我的图表-公共分类列表接口
+// @Success 200 {object} data_manage.MyChartClassifyResp
+// @router /classify/public_list [get]
+func (this *MyChartController) PublicClassifyList() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+
+	sysUser := this.SysUser
+	if sysUser == nil {
+		br.Msg = "请登录"
+		br.ErrMsg = "请登录,SysUser Is Empty"
+		br.Ret = 408
+		return
+	}
+	//获取图表信息
+	list, err := data_manage.GetPublicChartClassifyAllExceptMy(sysUser.AdminId)
+	if err != nil && err.Error() != utils.ErrNoRow() {
+		br.Success = true
+		br.Msg = "获取公共分类信息失败"
+		br.ErrMsg = "获取公共分类信息失败,Err:" + err.Error()
+		return
+	}
+
+	resp := new(data_manage.PublicChartClassifyResp)
+	if list == nil || len(list) <= 0 || (err != nil && err.Error() == utils.ErrNoRow()) {
+		items := make([]data_manage.PublicChartClassifyItem, 0)
+		resp.List = items
+		br.Ret = 200
+		br.Success = true
+		br.Msg = "获取成功"
+		return
+	}
+	publicChartClassifyItemList := make([]data_manage.PublicChartClassifyItem, 0)
+
+	adminIdStr := make([]string, 0)
+	for _, v := range list {
+		adminIdStr = append(adminIdStr, fmt.Sprint(v.AdminId))
+	}
+	adminMap := make(map[int]string)
+	adminList, _ := system.GetSysAdminByIdSlice(adminIdStr)
+	if len(adminList) > 0 {
+		for _, adminInfo := range adminList {
+			adminMap[adminInfo.AdminId] = adminInfo.RealName
+		}
+	}
+
+	for _, v := range list {
+		realName, ok := adminMap[v.AdminId]
+		if !ok {
+			realName = ``
+		}
+		publicChartClassifyItem := data_manage.PublicChartClassifyItem{
+			MyChartClassifyId:   v.MyChartClassifyId,
+			MyChartClassifyName: v.MyChartClassifyName,
+			AdminId:             v.AdminId,
+			RealName:            realName,
+			IsPublic:            v.IsPublic,
+			IsCompanyPublic:     v.IsCompanyPublic,
+		}
+		publicChartClassifyItemList = append(publicChartClassifyItemList, publicChartClassifyItem)
+	}
+	resp.List = publicChartClassifyItemList
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "获取成功"
+	br.Data = resp
+}
+
+// ModifyClassifyPublicStatus
+// @Title 修改我的图表分类的是否可见
+// @Description 修改我的图表分类的是否可见接口
+// @Param	request	body data_manage.ModifyChartClassifyPublicReq true "type json string"
+// @Success 200 Ret=200 修改成功
+// @router /classify/modify_public [post]
+func (this *MyChartController) ModifyClassifyPublicStatus() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+
+	sysUser := this.SysUser
+	if sysUser == nil {
+		br.Msg = "请登录"
+		br.ErrMsg = "请登录,SysUser Is Empty"
+		br.Ret = 408
+		return
+	}
+
+	var req data_manage.ModifyChartClassifyPublicReq
+	err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
+	if err != nil {
+		br.Msg = "参数解析异常!"
+		br.ErrMsg = "参数解析失败,Err:" + err.Error()
+		return
+	}
+	//查询该分类存不存在
+	item, err := data_manage.GetMyChartClassifyById(sysUser.AdminId, req.MyChartClassifyId)
+	if err != nil && err.Error() != utils.ErrNoRow() {
+		br.Msg = "修改失败,找不到该分类"
+		br.ErrMsg = "获取分类信息失败,Err:" + err.Error()
+		return
+	}
+	if item == nil {
+		br.Msg = "分类不存在"
+		br.ErrMsg = "分类不存在,Err:" + err.Error()
+		return
+	}
+
+	item.IsPublic = req.IsPublic
+	item.PublicTime = time.Now()
+	if req.IsPublic == 0 {
+		// 取消公开同时取消客户公开
+		item.IsCompanyPublic = 0
+	}
+	err = item.Update([]string{"IsPublic", "PublicTime", "IsCompanyPublic"})
+	if err != nil {
+		br.Msg = "修改失败"
+		br.ErrMsg = "修改是否公开失败,Err:" + err.Error()
+		return
+	}
+	//新增操作日志
+	{
+		edbLog := new(data_manage.MyChartLog)
+		edbLog.MyChartId = 0
+		edbLog.ChartInfoId = 0
+		edbLog.SysUserId = sysUser.AdminId
+		edbLog.SysUserRealName = sysUser.RealName
+		edbLog.CreateTime = time.Now()
+		edbLog.Content = string(this.Ctx.Input.RequestBody)
+		edbLog.Status = "修改分类是否公开"
+		edbLog.Method = this.Ctx.Input.URI()
+		go data_manage.AddMyChartLog(edbLog)
+	}
+	br.Ret = 200
+	br.Msg = "修改成功"
+	br.Success = true
+	br.IsAddLog = true
+}
+
+// CopyClassifyAndChart
+// @Title 复制我的图表分类
+// @Description 复制我的图表分类接口
+// @Param	request	body data_manage.CopyChartClassifyReq true "type json string"
+// @Success 200 Ret=200 复制成功
+// @router /classify/copy [post]
+func (this *MyChartController) CopyClassifyAndChart() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+
+	sysUser := this.SysUser
+	if sysUser == nil {
+		br.Msg = "请登录"
+		br.ErrMsg = "请登录,SysUser Is Empty"
+		br.Ret = 408
+		return
+	}
+
+	var req data_manage.CopyChartClassifyReq
+	err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
+	if err != nil {
+		br.Msg = "参数解析异常!"
+		br.ErrMsg = "参数解析失败,Err:" + err.Error()
+		return
+	}
+	//查询该公共分类存不存在
+	item, err := data_manage.GetPublicMyChartClassifyById(req.MyChartClassifyId)
+	if err != nil && err.Error() != utils.ErrNoRow() {
+		br.Msg = "复制失败,找不到该分类"
+		br.ErrMsg = "获取分类信息失败,Err:" + err.Error()
+		return
+	}
+	if item == nil {
+		br.Msg = "分类不存在"
+		br.ErrMsg = "分类不存在,Err:" + err.Error()
+		return
+	}
+
+	//获取所有的分类名称
+	chartClassifyList, err := data_manage.GetMyChartClassifyAll(sysUser.AdminId)
+	//生成新的分类名称
+	newChartClassifyName := generateMyChartClassifyName(item.MyChartClassifyName, 1, chartClassifyList)
+	//复制分类
+	newMyChartClassify, err := data_manage.CopyPublicMyChartClassifyById(item.MyChartClassifyId, sysUser.AdminId, newChartClassifyName)
+	if err != nil {
+		br.Msg = "复制失败"
+		br.ErrMsg = "复制失败,Err:" + err.Error()
+		return
+	}
+	//新增操作日志
+	{
+		edbLog := new(data_manage.MyChartLog)
+		edbLog.MyChartId = 0
+		edbLog.ChartInfoId = 0
+		edbLog.SysUserId = sysUser.AdminId
+		edbLog.SysUserRealName = sysUser.RealName
+		edbLog.CreateTime = time.Now()
+		edbLog.Content = string(this.Ctx.Input.RequestBody)
+		edbLog.Status = "复制分类"
+		edbLog.Method = this.Ctx.Input.URI()
+		go data_manage.AddMyChartLog(edbLog)
+	}
+	br.Data = newMyChartClassify
+	br.Ret = 200
+	br.Msg = "复制成功"
+	br.Success = true
+	br.IsAddLog = true
+}
+
+// generateMyChartClassifyName 生成我的图库分类名称
+func generateMyChartClassifyName(myChartClassifyName string, count int, chartClassifyList []*data_manage.MyChartClassify) (newChartClassifyName string) {
+	newChartClassifyName = fmt.Sprint(myChartClassifyName, count)
+	for _, v := range chartClassifyList {
+		if v.MyChartClassifyName == newChartClassifyName {
+			count++
+			newChartClassifyName = generateMyChartClassifyName(fmt.Sprint(myChartClassifyName), count, chartClassifyList)
+			return
+		}
+	}
+	return
+}
+
+// ModifyClassifyCompanyPublicStatus
+// @Title 修改公共分类是否用户可见
+// @Description 修改公共分类是否用户可见接口
+// @Param	request	body data_manage.ModifyChartClassifyCompanyPublicReq true "type json string"
+// @Success 200 Ret=200 修改成功
+// @router /classify/modify_company_public [post]
+func (this *MyChartController) ModifyClassifyCompanyPublicStatus() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+
+	sysUser := this.SysUser
+	if sysUser == nil {
+		br.Msg = "请登录"
+		br.ErrMsg = "请登录,SysUser Is Empty"
+		br.Ret = 408
+		return
+	}
+
+	var req data_manage.ModifyChartClassifyCompanyPublicReq
+	err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
+	if err != nil {
+		br.Msg = "参数解析异常!"
+		br.ErrMsg = "参数解析失败,Err:" + err.Error()
+		return
+	}
+
+	item, err := data_manage.GetPublicMyChartClassifyById(req.MyChartClassifyId)
+	if err != nil {
+		br.Msg = "找不到该分类"
+		br.ErrMsg = "获取分类信息失败, Err:" + err.Error()
+		return
+	}
+
+	if item.IsPublic != 1 {
+		br.Msg = "该分类未公开,不可设置为用户可见"
+		br.ErrMsg = "该分类未公开,不可设置为用户可见"
+		return
+	}
+
+	item.IsCompanyPublic = req.IsCompanyPublic
+	item.CompanyPublicTime = time.Now()
+	err = item.Update([]string{"IsCompanyPublic", "CompanyPublicTime"})
+	if err != nil {
+		br.Msg = "修改失败"
+		br.ErrMsg = "修改是否用户可见失败, Err:" + err.Error()
+		return
+	}
+
+	{
+		edbLog := new(data_manage.MyChartLog)
+		edbLog.MyChartId = 0
+		edbLog.ChartInfoId = 0
+		edbLog.SysUserId = sysUser.AdminId
+		edbLog.SysUserRealName = sysUser.RealName
+		edbLog.CreateTime = time.Now()
+		edbLog.Content = string(this.Ctx.Input.RequestBody)
+		edbLog.Status = "修改用户是否可见"
+		edbLog.Method = this.Ctx.Input.URI()
+		go data_manage.AddMyChartLog(edbLog)
+	}
+
+	br.Ret = 200
+	br.Msg = "修改成功"
+	br.Success = true
+	br.IsAddLog = true
+}
+
+// CompanyPublicClassifyList
+// @Title 我的图表-用户可见分类列表
+// @Description 我的图表-用户可见分类列表接口
+// @Param   Keyword		query	string  false	"分类名称关键词"
+// @Success 200 {object} data_manage.MyChartClassifyResp
+// @router /classify/company_public_list [get]
+func (this *MyChartController) CompanyPublicClassifyList() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+
+	sysUser := this.SysUser
+	if sysUser == nil {
+		br.Msg = "请登录"
+		br.ErrMsg = "请登录,SysUser Is Empty"
+		br.Ret = 408
+		return
+	}
+
+	var condition string
+	var pars []interface{}
+	keyword := this.GetString("Keyword")
+	if keyword != "" {
+		keyword = "%" + keyword + "%"
+		condition += ` AND my_chart_classify_name LIKE ? `
+		pars = append(pars, keyword)
+	}
+	list, err := data_manage.GetCompanyPublicClassifyList(condition, pars)
+	if err != nil && err.Error() != utils.ErrNoRow() {
+		br.Success = true
+		br.Msg = "获取用户可见分类列表失败"
+		br.ErrMsg = "获取用户可见分类列表失败, Err:" + err.Error()
+		return
+	}
+
+	resp := new(data_manage.MyChartClassifyResp)
+	if list == nil || len(list) <= 0 || (err != nil && err.Error() == utils.ErrNoRow()) {
+		items := make([]*data_manage.MyChartClassify, 0)
+		resp.List = items
+		br.Ret = 200
+		br.Success = true
+		br.Msg = "获取成功"
+		return
+	}
+
+	resp.List = list
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "获取成功"
+	br.Data = resp
+}

+ 3 - 0
go.mod

@@ -11,6 +11,7 @@ require (
 	github.com/go-xorm/xorm v0.7.9
 	github.com/kgiannakakis/mp3duration v0.0.0-20191013070830-d834f8d5ed53
 	github.com/nosixtools/solarlunar v0.0.0-20211112060703-1b6dea7b4a19
+	github.com/olivere/elastic/v7 v7.0.30
 	github.com/rdlucklib/rdluck_tools v1.0.3
 	github.com/shopspring/decimal v1.3.1
 	github.com/tealeg/xlsx v1.0.5
@@ -27,8 +28,10 @@ require (
 	github.com/golang/protobuf v1.5.2 // indirect
 	github.com/hashicorp/golang-lru v0.5.4 // indirect
 	github.com/jmespath/go-jmespath v0.4.0 // indirect
+	github.com/josharian/intern v1.0.0 // indirect
 	github.com/json-iterator/go v1.1.12 // indirect
 	github.com/kr/text v0.2.0 // indirect
+	github.com/mailru/easyjson v0.7.7 // indirect
 	github.com/matttproud/golang_protobuf_extensions v1.0.1 // indirect
 	github.com/mitchellh/mapstructure v1.5.0 // indirect
 	github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect

+ 13 - 0
go.sum

@@ -78,6 +78,7 @@ github.com/astaxie/beego v1.12.3/go.mod h1:p3qIm0Ryx7zeBHLljmd7omloyca1s4yu1a8kM
 github.com/aws/aws-lambda-go v1.13.3/go.mod h1:4UKl9IzQMoD+QF79YdCuzCwp8VbmG4VAQwij/eHl5CU=
 github.com/aws/aws-sdk-go v1.27.0/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo=
 github.com/aws/aws-sdk-go v1.40.45/go.mod h1:585smgzpB/KqRA+K3y/NL/oYRqQvpNJYvLm+LY1U59Q=
+github.com/aws/aws-sdk-go v1.42.23/go.mod h1:gyRszuZ/icHmHAVE4gc/r+cfCmhA1AD+vqfWbgI+eHs=
 github.com/aws/aws-sdk-go-v2 v0.18.0/go.mod h1:JWVYvqSMppoMJC0x5wdwiImzgXTI9FuZwxzkQq9wy+g=
 github.com/aws/aws-sdk-go-v2 v1.9.1/go.mod h1:cK/D0BBs0b/oWPIcX/Z/obahJK1TT7IPVjy53i/mX/4=
 github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.8.1/go.mod h1:CM+19rL1+4dFWnOQKwDc7H1KwXTz+h61oUSHyhV0b3o=
@@ -180,6 +181,8 @@ github.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYF
 github.com/flosch/pongo2 v0.0.0-20190707114632-bbf5a6c351f4/go.mod h1:T9YF2M40nIgbVgp3rreNmTged+9HrbNTIQf1PsaIiTA=
 github.com/flosch/pongo2 v0.0.0-20200529170236-5abacdfa4915/go.mod h1:fB4mx6dzqFinCxIf3a7Mf5yLk+18Bia9mPAnuejcvDA=
 github.com/fogleman/gg v1.2.1-0.20190220221249-0403632d5b90/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k=
+github.com/fortytw2/leaktest v1.3.0 h1:u8491cBMTQ8ft8aeV+adlcytMZylmA5nnwwkRZjI8vw=
+github.com/fortytw2/leaktest v1.3.0/go.mod h1:jDsjWgpAGjm2CA7WthBh/CdZYEPF31XHquHwclZch5g=
 github.com/franela/goblin v0.0.0-20200105215937-c9ffbefa60db/go.mod h1:7dvUGVsVBjqR7JHJk0brhHOZYGmfBYOrK0ZhYMEtBr4=
 github.com/franela/goblin v0.0.0-20210519012713-85d372ac71e2/go.mod h1:VzmDKDJVZI3aJmnRI9VjAn9nJ8qPPsN1fqzr9dqInIo=
 github.com/franela/goreq v0.0.0-20171204163338-bcd34c9993f8/go.mod h1:ZhphrRTfi2rbfLwlschooIH4+wKKDR4Pdxhh+TRoA20=
@@ -373,6 +376,8 @@ github.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHW
 github.com/jmespath/go-jmespath/internal/testify v1.5.1 h1:shLQSRRSCCPj3f2gpwzGwWFoC7ycTf1rcQZHOlsJ6N8=
 github.com/jmespath/go-jmespath/internal/testify v1.5.1/go.mod h1:L3OGu8Wl2/fWfCI6z80xFu9LTZmf1ZRjMHUOPmWr69U=
 github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo=
+github.com/josharian/intern v1.0.0 h1:vlS4z54oSdjm0bgjRigI+G1HpF+tI+9rE5LLzOg8HmY=
+github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y=
 github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4=
 github.com/json-iterator/go v1.1.5/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU=
 github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU=
@@ -418,6 +423,8 @@ github.com/lightstep/lightstep-tracer-common/golang/gogo v0.0.0-20190605223551-b
 github.com/lightstep/lightstep-tracer-go v0.18.1/go.mod h1:jlF1pusYV4pidLvZ+XD0UBX0ZE6WURAspgAczcDHrL4=
 github.com/lyft/protoc-gen-validate v0.0.13/go.mod h1:XbGvPuh87YZc5TdIa2/I4pLk0QoUACkjt2znoq26NVQ=
 github.com/magiconair/properties v1.8.1/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ=
+github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0=
+github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc=
 github.com/mattn/go-colorable v0.0.0-20170327083344-ded68f7a9561/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU=
 github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU=
 github.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE=
@@ -492,6 +499,8 @@ github.com/oklog/oklog v0.3.2/go.mod h1:FCV+B7mhrz4o+ueLpx+KqkyXRGMWOYEvfiXtdGtb
 github.com/oklog/run v1.0.0/go.mod h1:dlhp/R75TPv97u0XWUtDeV/lRKWPKSdTuV0TZvrmrQA=
 github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U=
 github.com/olekukonko/tablewriter v0.0.0-20170122224234-a0225b3f23b5/go.mod h1:vsDQFd/mU46D+Z4whnwzcISnGGzXWMclvtLoiIKAKIo=
+github.com/olivere/elastic/v7 v7.0.30 h1:MyDWv+ZSn+56AOmqr69Sg4EFaBdGMpWFEK5zuqaL8AM=
+github.com/olivere/elastic/v7 v7.0.30/go.mod h1:idEQxe7Es+Wr4XAuNnJdKeMZufkA9vQprOIFck061vg=
 github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
 github.com/onsi/ginkgo v1.7.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
 github.com/onsi/ginkgo v1.10.1/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
@@ -616,7 +625,10 @@ github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrf
 github.com/sirupsen/logrus v1.8.1/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0=
 github.com/smartwalle/pongo2render v1.0.1/go.mod h1:MGnTzND7nEMz7g194kjlnw8lx/V5JJlb1hr5kDXEO0I=
 github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc=
+github.com/smartystreets/assertions v1.1.1/go.mod h1:tcbTF8ujkAEcZ8TElKY+i30BzYlVhC/LOxJk7iOWnoo=
+github.com/smartystreets/go-aws-auth v0.0.0-20180515143844-0c1422d1fdb9/go.mod h1:SnhjPscd9TpLiy1LpzGSKh3bXCfxxXuqd9xmQJy3slM=
 github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA=
+github.com/smartystreets/gunit v1.4.2/go.mod h1:ZjM1ozSIMJlAz/ay4SG8PeKF00ckUp+zMHZXV9/bvak=
 github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM=
 github.com/sony/gobreaker v0.4.1/go.mod h1:ZKptC7FHNvhBz7dN2LGjPVBz2sZJmc0/PkyDJOjmxWY=
 github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA=
@@ -829,6 +841,7 @@ golang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qx
 golang.org/x/net v0.0.0-20210614182718-04defd469f4e/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
 golang.org/x/net v0.0.0-20210916014120-12bc252f5db8/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
 golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
+golang.org/x/net v0.0.0-20211209124913-491a49abca63/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
 golang.org/x/net v0.0.0-20211216030914-fe4d6282115f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
 golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk=
 golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk=

+ 612 - 23
models/data_manage/chart_info.go

@@ -64,7 +64,7 @@ type ChartInfoItem struct {
 func GetChartInfoAll(source int) (items []*ChartClassifyItems, err error) {
 	o := orm.NewOrmUsingDB("data")
 	sql := ` SELECT chart_info_id,chart_classify_id,chart_name AS chart_classify_name,
-             unique_code,sys_user_id,sys_user_real_name,date_type,start_date,end_date,chart_type,calendar,season_start_date,season_end_date
+             unique_code,sys_user_id,sys_user_real_name,date_type,start_date,end_date,chart_type,calendar,season_start_date,season_end_date,source
             FROM chart_info WHERE source = ?  ORDER BY sort asc,create_time ASC `
 	_, err = o.Raw(sql, source).QueryRows(&items)
 	return
@@ -443,9 +443,10 @@ type ChartEdbInfoMapping struct {
 	MinValue            float64 `json:"-" description:"最小值"`
 	MaxValue            float64 `json:"-" description:"最大值"`
 	DataList            interface{}
-	IsNullData          bool `json:"-" description:"是否空数据"`
-	MappingSource       int  `description:"1:ETA图库;2:商品价格曲线"`
-	ClassifyId          int  `description:"分类id"`
+	IsNullData          bool   `json:"-" description:"是否空数据"`
+	MappingSource       int    `description:"1:ETA图库;2:商品价格曲线"`
+	RegionType          string `description:"交易所来源,海外还是国内" json:"-"`
+	ClassifyId          int    `description:"分类id"`
 }
 
 type QuarterData struct {
@@ -482,15 +483,438 @@ type XData struct {
 
 // YData 柱方图的y轴数据
 type YData struct {
-	Date           string    `description:"数据日期"`
-	Color          string    `description:"数据颜色"`
-	Name           string    `description:"别名"`
-	NameEn         string    `description:"英文别名"`
-	Value          []float64 `description:"每个指标的值"`
-	NoDataEdbList  []int     `description:"没有数据的指标列表"`
-	XEdbInfoIdList []int     `description:"对应X轴的指标id列表"`
+	Date           string          `description:"数据日期"`
+	ConfigDate     time.Time       `description:"配置的日期" json:"-"`
+	Color          string          `description:"数据颜色"`
+	Name           string          `description:"别名"`
+	NameEn         string          `description:"英文别名"`
+	Value          []float64       `description:"每个指标的值"`
+	NoDataEdbList  []int           `description:"没有数据的指标列表"`
+	XEdbInfoIdList []int           `description:"对应X轴的指标id列表"`
+	EdbValMap      map[int]float64 `description:"指标与值的对应" json:"-"`
+	M              []int           `description:"对应开始日期的间隔值" json:"-"`
+}
+
+func ModifyChartInfoAndMapping(edbInfoIdStr string, req *SaveChartInfoReq, chartType int) (err error) {
+	o := orm.NewOrmUsingDB("data")
+	to, err := o.Begin()
+	if err != nil {
+		return
+	}
+	defer func() {
+		if err != nil {
+			_ = to.Rollback()
+		} else {
+			_ = to.Commit()
+		}
+	}()
+
+	//非季节图
+	if chartType != 2 {
+		updateStr := `edb_info_ids=?,
+			  modify_time = NOW(),
+              date_type=?,
+			  start_date=?,
+			  end_date=?,
+ 			  left_min=?,
+			  left_max=?,
+			  right_min=?,
+			  right_max=?`
+		pars := []interface{}{edbInfoIdStr, req.DateType, req.StartDate, req.EndDate, req.LeftMin, req.LeftMax, req.RightMin, req.RightMax}
+		if req.ExtraConfig != `` {
+			updateStr += `,extra_config=? `
+			pars = append(pars, req.ExtraConfig)
+		}
+		pars = append(pars, req.ChartInfoId)
+
+		sql := ` UPDATE  chart_info SET ` + updateStr + ` WHERE chart_info_id = ?`
+		_, err = to.Raw(sql, pars).Exec()
+		if err != nil {
+			fmt.Println("UPDATE  chart_info Err:", err.Error())
+			return err
+		}
+	} else {
+		sql := ` UPDATE  chart_info
+			SET
+              edb_info_ids=?,
+			  modify_time = NOW(),
+			  calendar=?,
+			  season_start_date=?,
+			  season_end_date=?,
+			  left_min=?,
+			  left_max=?,
+			  right_min=?,
+			  right_max=?
+			WHERE chart_info_id = ?`
+		_, err = to.Raw(sql, edbInfoIdStr, req.Calendar, req.SeasonStartDate, req.SeasonEndDate, req.LeftMin, req.LeftMax, req.RightMin, req.RightMax, req.ChartInfoId).Exec()
+		if err != nil {
+			fmt.Println("UPDATE  chart_info Err:", err.Error())
+			return err
+		}
+	}
+
+	var edbInfoIdArr []string
+	mapList := make([]*ChartEdbMapping, 0)
+	for _, v := range req.ChartEdbInfoList {
+		edbInfoIdArr = append(edbInfoIdArr, strconv.Itoa(v.EdbInfoId))
+		var count int
+		csql := `SELECT COUNT(1) AS count FROM chart_edb_mapping WHERE chart_info_id=? AND edb_info_id=? `
+		err = to.Raw(csql, req.ChartInfoId, v.EdbInfoId).QueryRow(&count)
+		if err != nil {
+			fmt.Println("QueryRow Err:", err.Error())
+			return err
+		}
+		if count > 0 {
+			msql := `UPDATE  chart_edb_mapping
+				SET
+                 modify_time = NOW(),
+				 max_data = ?,
+				 min_data = ?,
+				 is_order = ?,
+				 is_axis = ?,
+				 edb_info_type = ?,
+				 lead_value = ?,
+				 lead_unit = ?,
+				 chart_style = ?,
+				 chart_color = ?,
+				 predict_chart_color = ?,
+				 chart_width = ?
+				WHERE chart_info_id =? AND edb_info_id=? `
+			_, err = to.Raw(msql, v.MaxData, v.MinData, v.IsOrder, v.IsAxis, v.EdbInfoType, v.LeadValue, v.LeadUnit, v.ChartStyle, v.ChartColor, v.PredictChartColor, v.ChartWidth, req.ChartInfoId, v.EdbInfoId).Exec()
+			if err != nil {
+				fmt.Println("chart_edb_mapping Err:" + err.Error())
+				return err
+			}
+		} else {
+			mapItem := new(ChartEdbMapping)
+			mapItem.ChartInfoId = req.ChartInfoId
+			mapItem.EdbInfoId = v.EdbInfoId
+			mapItem.CreateTime = time.Now()
+			mapItem.ModifyTime = time.Now()
+			timestamp := strconv.FormatInt(time.Now().UnixNano(), 10)
+			mapItem.UniqueCode = utils.MD5(utils.CHART_PREFIX + "_" + timestamp)
+			mapItem.MaxData = v.MaxData
+			mapItem.MinData = v.MinData
+			mapItem.IsOrder = v.IsOrder
+			mapItem.IsAxis = v.IsAxis
+			mapItem.EdbInfoType = v.EdbInfoType
+			mapItem.LeadValue = v.LeadValue
+			mapItem.LeadUnit = v.LeadUnit
+			mapItem.ChartStyle = v.ChartStyle
+			mapItem.ChartColor = v.ChartColor
+			mapItem.PredictChartColor = v.PredictChartColor
+			mapItem.ChartWidth = v.ChartWidth
+			mapList = append(mapList, mapItem)
+		}
+	}
+	if len(mapList) > 0 {
+		_, err = to.InsertMulti(1, mapList)
+		if err != nil {
+			fmt.Println("AddChartEdbMapping Err:" + err.Error())
+			return err
+		}
+	}
+	if len(edbInfoIdArr) > 0 {
+		edbInfoIdStr := strings.Join(edbInfoIdArr, ",")
+		if edbInfoIdStr != "" {
+			dsql := `DELETE FROM chart_edb_mapping WHERE chart_info_id=? AND edb_info_id NOT IN(` + edbInfoIdStr + `)`
+			_, err = to.Raw(dsql, req.ChartInfoId).Exec()
+			if err != nil {
+				fmt.Println("delete err:" + err.Error())
+				return err
+			}
+		}
+	}
+	return
+}
+
+// EditChartInfoAndMapping 修改 ETA图库 的 图表与指标 的关系
+func EditChartInfoAndMapping(req *EditChartInfoReq, edbInfoIdStr string, calendar string, dateType, disabled int, barChartConf string, chartEdbInfoList []*ChartSaveItem) (err error) {
+	o := orm.NewOrmUsingDB("data")
+	to, err := o.Begin()
+	if err != nil {
+		return
+	}
+	defer func() {
+		if err != nil {
+			_ = to.Rollback()
+		} else {
+			_ = to.Commit()
+		}
+	}()
+	var pars []interface{}
+	pars = append(pars, req.ChartName)
+	pars = append(pars, edbInfoIdStr)
+	pars = append(pars, req.ChartType)
+	pars = append(pars, req.ChartClassifyId)
+	pars = append(pars, disabled)
+	pars = append(pars, barChartConf)
+	pars = append(pars, req.ExtraConfig)
+
+	sql := ` UPDATE  chart_info
+			SET
+			  chart_name =?,
+              edb_info_ids=?,
+			  chart_type=?,
+			  chart_classify_id = ?,
+			  modify_time = NOW(),
+              disabled = ?,
+              bar_config = ?,extra_config = ?
+			`
+	if calendar != "" {
+		sql += `,calendar = ? `
+		pars = append(pars, calendar)
+	}
+	if dateType > 0 {
+		sql += `,date_type = ? `
+		pars = append(pars, dateType)
+	}
+
+	sql += `,start_date = ? `
+	pars = append(pars, req.StartDate)
+
+	sql += `,end_date = ? `
+	pars = append(pars, req.EndDate)
+
+	sql += `,season_start_date = ? `
+	pars = append(pars, req.SeasonStartDate)
+
+	sql += `,season_end_date = ? `
+	pars = append(pars, req.SeasonEndDate)
+
+	sql += `,left_min = ? `
+	pars = append(pars, req.LeftMin)
+
+	sql += `,left_max = ? `
+	pars = append(pars, req.LeftMax)
+
+	sql += `,right_min = ? `
+	pars = append(pars, req.RightMin)
+
+	sql += `,right_max = ? `
+	pars = append(pars, req.RightMax)
+
+	sql += `WHERE chart_info_id = ?`
+
+	pars = append(pars, req.ChartInfoId)
+	_, err = to.Raw(sql, pars).Exec()
+	if err != nil {
+		fmt.Println("UPDATE  chart_info Err:", err.Error())
+		return err
+	}
+	chartEdbMappingIdList := make([]string, 0)
+
+	for _, v := range chartEdbInfoList {
+		// 查询该指标是否存在,如果存在的话,那么就去修改,否则新增
+		var tmpChartEdbMapping *ChartEdbMapping
+		csql := `SELECT *  FROM chart_edb_mapping WHERE chart_info_id=? AND edb_info_id=? AND source = ? `
+		err = to.Raw(csql, req.ChartInfoId, v.EdbInfoId, utils.CHART_SOURCE_DEFAULT).QueryRow(&tmpChartEdbMapping)
+		if err != nil && err.Error() != utils.ErrNoRow() {
+			fmt.Println("QueryRow Err:", err.Error())
+			return err
+		}
+		if tmpChartEdbMapping != nil {
+			chartEdbMappingIdList = append(chartEdbMappingIdList, strconv.Itoa(tmpChartEdbMapping.ChartEdbMappingId))
+			tmpChartEdbMapping.ModifyTime = time.Now()
+			tmpChartEdbMapping.MaxData = v.MaxData
+			tmpChartEdbMapping.MinData = v.MinData
+			tmpChartEdbMapping.IsOrder = v.IsOrder
+			tmpChartEdbMapping.IsAxis = v.IsAxis
+			tmpChartEdbMapping.EdbInfoType = v.EdbInfoType
+			tmpChartEdbMapping.LeadValue = v.LeadValue
+			tmpChartEdbMapping.LeadUnit = v.LeadUnit
+			tmpChartEdbMapping.ChartStyle = v.ChartStyle
+			tmpChartEdbMapping.ChartColor = v.ChartColor
+			tmpChartEdbMapping.PredictChartColor = v.PredictChartColor
+			tmpChartEdbMapping.ChartWidth = v.ChartWidth
+			_, err = to.Update(tmpChartEdbMapping, "ModifyTime", "MaxData", "MinData", "IsOrder", "IsAxis", "EdbInfoType", "LeadValue", "LeadUnit", "ChartStyle", "ChartColor", "PredictChartColor", "ChartWidth")
+			if err != nil {
+				fmt.Println("chart_edb_mapping Err:" + err.Error())
+				return err
+			}
+		} else {
+			mapItem := new(ChartEdbMapping)
+			mapItem.ChartInfoId = req.ChartInfoId
+			mapItem.EdbInfoId = v.EdbInfoId
+			mapItem.CreateTime = time.Now()
+			mapItem.ModifyTime = time.Now()
+			timestamp := strconv.FormatInt(time.Now().UnixNano(), 10)
+			mapItem.UniqueCode = utils.MD5(utils.CHART_PREFIX + "_" + timestamp + "_" + strconv.Itoa(v.EdbInfoId))
+			mapItem.MaxData = v.MaxData
+			mapItem.MinData = v.MinData
+			mapItem.IsOrder = v.IsOrder
+			mapItem.IsAxis = v.IsAxis
+			mapItem.EdbInfoType = v.EdbInfoType
+			mapItem.LeadValue = v.LeadValue
+			mapItem.LeadUnit = v.LeadUnit
+			mapItem.ChartStyle = v.ChartStyle
+			mapItem.ChartColor = v.ChartColor
+			mapItem.PredictChartColor = v.PredictChartColor
+			mapItem.ChartWidth = v.ChartWidth
+			mapItem.Source = utils.CHART_SOURCE_DEFAULT
+			tmpId, err := to.Insert(mapItem)
+			if err != nil {
+				fmt.Println("AddChartEdbMapping Err:" + err.Error())
+				return err
+			}
+			mapItem.ChartEdbMappingId = int(tmpId)
+			chartEdbMappingIdList = append(chartEdbMappingIdList, strconv.Itoa(mapItem.ChartEdbMappingId))
+		}
+	}
+	if len(chartEdbMappingIdList) > 0 {
+		chartEdbMappingIdStr := strings.Join(chartEdbMappingIdList, ",")
+		dsql := `DELETE FROM chart_edb_mapping WHERE chart_info_id=? AND chart_edb_mapping_id NOT IN(` + chartEdbMappingIdStr + `)`
+		_, err = to.Raw(dsql, req.ChartInfoId).Exec()
+		if err != nil {
+			fmt.Println("delete err:" + err.Error())
+			return err
+		}
+	}
+	return
 }
 
+// EditFutureGoodChartInfoAndMapping 修改商品价格曲线的 图表与指标 的关系
+func EditFutureGoodChartInfoAndMapping(req *EditChartInfoReq, edbInfoIdStr string, calendar string, dateType, disabled int, barChartConf string) (err error) {
+	o := orm.NewOrmUsingDB("data")
+	to, err := o.Begin()
+	if err != nil {
+		return
+	}
+	defer func() {
+		if err != nil {
+			_ = to.Rollback()
+		} else {
+			_ = to.Commit()
+		}
+	}()
+	var pars []interface{}
+	pars = append(pars, req.ChartName)
+	pars = append(pars, edbInfoIdStr)
+	pars = append(pars, req.ChartType)
+	pars = append(pars, req.ChartClassifyId)
+	pars = append(pars, disabled)
+	pars = append(pars, barChartConf)
+
+	sql := ` UPDATE  chart_info
+			SET
+			  chart_name =?,
+              edb_info_ids=?,
+			  chart_type=?,
+			  chart_classify_id = ?,
+			  modify_time = NOW(),
+              disabled = ?,
+              bar_config = ?
+			`
+	if calendar != "" {
+		sql += `,calendar = ? `
+		pars = append(pars, calendar)
+	}
+	if dateType > 0 {
+		sql += `,date_type = ? `
+		pars = append(pars, dateType)
+	}
+
+	sql += `,start_date = ? `
+	pars = append(pars, req.StartDate)
+
+	sql += `,end_date = ? `
+	pars = append(pars, req.EndDate)
+
+	sql += `,season_start_date = ? `
+	pars = append(pars, req.SeasonStartDate)
+
+	sql += `,season_end_date = ? `
+	pars = append(pars, req.SeasonEndDate)
+
+	sql += `,left_min = ? `
+	pars = append(pars, req.LeftMin)
+
+	sql += `,left_max = ? `
+	pars = append(pars, req.LeftMax)
+
+	sql += `,right_min = ? `
+	pars = append(pars, req.RightMin)
+
+	sql += `,right_max = ? `
+	pars = append(pars, req.RightMax)
+
+	sql += `WHERE chart_info_id = ?`
+
+	pars = append(pars, req.ChartInfoId)
+	_, err = to.Raw(sql, pars).Exec()
+	if err != nil {
+		fmt.Println("UPDATE  chart_info Err:", err.Error())
+		return err
+	}
+	chartEdbMappingIdList := make([]string, 0)
+	for _, v := range req.BarChartInfo.EdbInfoIdList {
+		// 查询该指标是否存在,如果存在的话,那么就去修改,否则新增
+		var tmpChartEdbMapping *ChartEdbMapping
+		csql := `SELECT *  FROM chart_edb_mapping WHERE chart_info_id=? AND edb_info_id=? AND source = ? `
+		err = to.Raw(csql, req.ChartInfoId, v.EdbInfoId, v.Source).QueryRow(&tmpChartEdbMapping)
+		if err != nil && err.Error() != utils.ErrNoRow() {
+			fmt.Println("QueryRow Err:", err.Error())
+			return err
+		}
+		if tmpChartEdbMapping != nil {
+			chartEdbMappingIdList = append(chartEdbMappingIdList, strconv.Itoa(tmpChartEdbMapping.ChartEdbMappingId))
+			//tmpChartEdbMapping.ModifyTime = time.Now()
+			//tmpChartEdbMapping.MaxData = v.MaxData
+			//tmpChartEdbMapping.MinData = v.MinData
+			//tmpChartEdbMapping.IsOrder = v.IsOrder
+			//tmpChartEdbMapping.IsAxis = v.IsAxis
+			//tmpChartEdbMapping.EdbInfoType = v.EdbInfoType
+			//tmpChartEdbMapping.LeadValue = v.LeadValue
+			//tmpChartEdbMapping.LeadUnit = v.LeadUnit
+			//tmpChartEdbMapping.ChartStyle = v.ChartStyle
+			//tmpChartEdbMapping.ChartColor = v.ChartColor
+			//tmpChartEdbMapping.PredictChartColor = v.PredictChartColor
+			//tmpChartEdbMapping.ChartWidth = v.ChartWidth
+			//_, err = to.Update(tmpChartEdbMapping, "ModifyTime", "MaxData", "MinData", "IsOrder", "IsAxis", "EdbInfoType", "LeadValue", "LeadUnit", "ChartStyle", "ChartColor", "PredictChartColor", "ChartWidth")
+			//if err != nil {
+			//	fmt.Println("chart_edb_mapping Err:" + err.Error())
+			//	return err
+			//}
+		} else {
+			mapItem := new(ChartEdbMapping)
+			mapItem.ChartInfoId = req.ChartInfoId
+			mapItem.EdbInfoId = v.EdbInfoId
+			mapItem.CreateTime = time.Now()
+			mapItem.ModifyTime = time.Now()
+			timestamp := strconv.FormatInt(time.Now().UnixNano(), 10)
+			mapItem.UniqueCode = utils.MD5(utils.CHART_PREFIX + "_" + timestamp + "_" + strconv.Itoa(v.EdbInfoId))
+			//mapItem.MaxData = v.MaxData
+			//mapItem.MinData = v.MinData
+			mapItem.IsOrder = true
+			mapItem.IsAxis = 1
+			mapItem.EdbInfoType = 1
+			//mapItem.LeadValue = v.LeadValue
+			//mapItem.LeadUnit = v.LeadUnit
+			//mapItem.ChartStyle = v.ChartStyle
+			//mapItem.ChartColor = v.ChartColor
+			//mapItem.PredictChartColor = v.PredictChartColor
+			//mapItem.ChartWidth = v.ChartWidth
+			mapItem.Source = v.Source
+			tmpId, err := to.Insert(mapItem)
+			if err != nil {
+				fmt.Println("AddChartEdbMapping Err:" + err.Error())
+				return err
+			}
+			mapItem.ChartEdbMappingId = int(tmpId)
+			chartEdbMappingIdList = append(chartEdbMappingIdList, strconv.Itoa(mapItem.ChartEdbMappingId))
+		}
+	}
+	if len(chartEdbMappingIdList) > 0 {
+		chartEdbMappingIdStr := strings.Join(chartEdbMappingIdList, ",")
+		dsql := `DELETE FROM chart_edb_mapping WHERE chart_info_id=? AND chart_edb_mapping_id NOT IN(` + chartEdbMappingIdStr + `)`
+		_, err = to.Raw(dsql, req.ChartInfoId).Exec()
+		if err != nil {
+			fmt.Println("delete err:" + err.Error())
+			return err
+		}
+	}
+	return
+}
 
 func EditChartEnInfoAndEdbEnInfo(req *EditChartEnInfoReq) (err error) {
 	o := orm.NewOrmUsingDB("data")
@@ -628,12 +1052,13 @@ func ChartInfoSearchByKeyWord(KeyWord string, showSysId int) (searchList []*Char
 }
 
 // ChartInfoSearchByEmptyKeyWord 没有关键字的时候获取默认100条数据
-func ChartInfoSearchByEmptyKeyWord(showSysId, source int, noPermissionChartIdList []int) (total int64, searchList []*ChartInfo, err error) {
+func ChartInfoSearchByEmptyKeyWord(showSysId int, sourceList []int, noPermissionChartIdList []int) (total int64, searchList []*ChartInfo, err error) {
+	num := len(sourceList)
 	o := orm.NewOrmUsingDB("data")
-	sql := ` SELECT * FROM chart_info WHERE 1=1 AND source = ? `
+	sql := ` SELECT * FROM chart_info WHERE 1=1 AND source in (` + utils.GetOrmInReplace(num) + `)`
 
 	var pars []interface{}
-	pars = append(pars, source)
+	pars = append(pars, sourceList)
 
 	if showSysId > 0 {
 		sql += ` AND sys_user_id = ? `
@@ -768,13 +1193,13 @@ func GetFirstChartInfoByClassifyId(classifyId int) (item *ChartInfo, err error)
 }
 
 // UpdateChartInfoSortByClassifyId 根据图表id更新排序
-func UpdateChartInfoSortByClassifyId(classifyId, nowSort, prevChartInfoId int, updateSort string) (err error) {
+func UpdateChartInfoSortByClassifyId(classifyId, nowSort, prevChartInfoId, source int, updateSort string) (err error) {
 	o := orm.NewOrmUsingDB("data")
-	sql := ` update chart_info set sort = ` + updateSort + ` WHERE chart_classify_id=? AND `
+	sql := ` update chart_info set sort = ` + updateSort + ` WHERE chart_classify_id=? AND source = ? AND `
 	if prevChartInfoId > 0 {
 		sql += ` (sort > ? or (chart_info_id > ` + fmt.Sprint(prevChartInfoId) + ` and sort = ` + fmt.Sprint(nowSort) + `))`
 	}
-	_, err = o.Raw(sql, classifyId, nowSort).Exec()
+	_, err = o.Raw(sql, classifyId, source, nowSort).Exec()
 	return
 }
 
@@ -824,7 +1249,16 @@ type ChartInfoView struct {
 	BarConfig         string `description:"柱方图的配置,json数据" json:"-"`
 	Source            int    `description:"1:ETA图库;2:商品价格曲线;3:相关性图表"`
 	//CorrelationLeadUnit string `description:"相关性图表-领先单位"`
-	ExtraConfig string `description:"图表额外配置,json数据"`
+	ExtraConfig string          `description:"图表额外配置,json数据"`
+	Button      ChartViewButton `description:"操作按钮"`
+}
+
+type ChartViewButton struct {
+	IsEdit    bool `description:"是否有编辑权限"`
+	IsEnChart bool `description:"是否展示英文标识"`
+	IsAdd     bool `description:"true:已加入我的图库,false:未加入我的图库"`
+	IsCopy    bool `description:"是否有另存为按钮"`
+	IsSetName int  `description:"设置名称"`
 }
 
 type ImageSvgToPngResp struct {
@@ -980,11 +1414,15 @@ type BarChartInfoSortReq struct {
 
 // CorrelationChartInfoReq 相关性图表请求体
 type CorrelationChartInfoReq struct {
-	LeadValue     int                              `description:"领先期数"`
-	LeadUnit      string                           `description:"频度"`
-	StartDate     string                           `description:"开始日期"`
-	EndDate       string                           `description:"结束日期"`
-	EdbInfoIdList []CorrelationChartInfoEdbItemReq `description:"指标信息"`
+	LeadValue          int                              `description:"领先期数"`
+	LeadUnit           string                           `description:"频度"`
+	CalculateValue     int                              `description:"计算窗口"`
+	CalculateUnit      string                           `description:"计算频度"`
+	BaseCalculateValue int                              `description:"基础计算窗口(滚动相关性的时候用到)"`
+	BaseCalculateUnit  string                           `description:"基础计算频度(滚动相关性的时候用到)"`
+	StartDate          string                           `description:"开始日期"`
+	EndDate            string                           `description:"结束日期"`
+	EdbInfoIdList      []CorrelationChartInfoEdbItemReq `description:"指标信息"`
 }
 
 // CorrelationChartInfoEdbItemReq 相关性图表请求指标
@@ -995,6 +1433,151 @@ type CorrelationChartInfoEdbItemReq struct {
 	//Source    int    `description:"1:ETA图库;2:商品价格"`
 }
 
+// EditCorrelationChartInfoAndMapping 修改相关性图表的 图表与指标 的关系
+func EditCorrelationChartInfoAndMapping(req *EditChartInfoReq, edbInfoIdStr string, calendar string, dateType, disabled int, barChartConf string, correlationChart *ChartInfoCorrelation, correlationUpdateCols []string) (err error) {
+	o := orm.NewOrmUsingDB("data")
+	to, err := o.Begin()
+	if err != nil {
+		return
+	}
+	defer func() {
+		if err != nil {
+			_ = to.Rollback()
+		} else {
+			_ = to.Commit()
+		}
+	}()
+	var pars []interface{}
+	pars = append(pars, req.ChartName)
+	pars = append(pars, edbInfoIdStr)
+	pars = append(pars, req.ChartType)
+	pars = append(pars, req.ChartClassifyId)
+	pars = append(pars, disabled)
+	pars = append(pars, barChartConf)
+
+	sql := ` UPDATE  chart_info
+			SET
+			  chart_name =?,
+              edb_info_ids=?,
+			  chart_type=?,
+			  chart_classify_id = ?,
+			  modify_time = NOW(),
+              disabled = ?,
+              bar_config = ?
+			`
+	if calendar != "" {
+		sql += `,calendar = ? `
+		pars = append(pars, calendar)
+	}
+	if dateType > 0 {
+		sql += `,date_type = ? `
+		pars = append(pars, dateType)
+	}
+
+	sql += `,start_date = ? `
+	pars = append(pars, req.StartDate)
+
+	sql += `,end_date = ? `
+	pars = append(pars, req.EndDate)
+
+	sql += `,season_start_date = ? `
+	pars = append(pars, req.SeasonStartDate)
+
+	sql += `,season_end_date = ? `
+	pars = append(pars, req.SeasonEndDate)
+
+	sql += `,left_min = ? `
+	pars = append(pars, req.LeftMin)
+
+	sql += `,left_max = ? `
+	pars = append(pars, req.LeftMax)
+
+	sql += `,right_min = ? `
+	pars = append(pars, req.RightMin)
+
+	sql += `,right_max = ? `
+	pars = append(pars, req.RightMax)
+
+	sql += `WHERE chart_info_id = ?`
+
+	pars = append(pars, req.ChartInfoId)
+	_, err = to.Raw(sql, pars).Exec()
+	if err != nil {
+		fmt.Println("UPDATE  chart_info Err:", err.Error())
+		return err
+	}
+	chartEdbMappingIdList := make([]string, 0)
+	for _, v := range req.CorrelationChartInfo.EdbInfoIdList {
+		// 查询该指标是否存在,如果存在的话,那么就去修改,否则新增
+		var tmpChartEdbMapping *ChartEdbMapping
+		csql := `SELECT *  FROM chart_edb_mapping WHERE chart_info_id=? AND edb_info_id=? AND source = ? `
+		err = to.Raw(csql, req.ChartInfoId, v.EdbInfoId, utils.CHART_SOURCE_CORRELATION).QueryRow(&tmpChartEdbMapping)
+		if err != nil && err.Error() != utils.ErrNoRow() {
+			fmt.Println("QueryRow Err:", err.Error())
+			return err
+		}
+		if tmpChartEdbMapping != nil {
+			chartEdbMappingIdList = append(chartEdbMappingIdList, strconv.Itoa(tmpChartEdbMapping.ChartEdbMappingId))
+			//tmpChartEdbMapping.ModifyTime = time.Now()
+			//tmpChartEdbMapping.MaxData = v.MaxData
+			//tmpChartEdbMapping.MinData = v.MinData
+			//tmpChartEdbMapping.IsOrder = v.IsOrder
+			//tmpChartEdbMapping.IsAxis = v.IsAxis
+			//tmpChartEdbMapping.EdbInfoType = v.EdbInfoType
+			//tmpChartEdbMapping.LeadValue = v.LeadValue
+			//tmpChartEdbMapping.LeadUnit = v.LeadUnit
+			//tmpChartEdbMapping.ChartStyle = v.ChartStyle
+			//tmpChartEdbMapping.ChartColor = v.ChartColor
+			//tmpChartEdbMapping.PredictChartColor = v.PredictChartColor
+			//tmpChartEdbMapping.ChartWidth = v.ChartWidth
+			//_, err = to.Update(tmpChartEdbMapping, "ModifyTime", "MaxData", "MinData", "IsOrder", "IsAxis", "EdbInfoType", "LeadValue", "LeadUnit", "ChartStyle", "ChartColor", "PredictChartColor", "ChartWidth")
+			//if err != nil {
+			//	fmt.Println("chart_edb_mapping Err:" + err.Error())
+			//	return err
+			//}
+		} else {
+			mapItem := new(ChartEdbMapping)
+			mapItem.ChartInfoId = req.ChartInfoId
+			mapItem.EdbInfoId = v.EdbInfoId
+			mapItem.CreateTime = time.Now()
+			mapItem.ModifyTime = time.Now()
+			timestamp := strconv.FormatInt(time.Now().UnixNano(), 10)
+			mapItem.UniqueCode = utils.MD5(utils.CHART_PREFIX + "_" + timestamp + "_" + strconv.Itoa(v.EdbInfoId))
+			//mapItem.MaxData = v.MaxData
+			//mapItem.MinData = v.MinData
+			mapItem.IsOrder = true
+			mapItem.IsAxis = 1
+			mapItem.EdbInfoType = 1
+			//mapItem.LeadValue = v.LeadValue
+			//mapItem.LeadUnit = v.LeadUnit
+			//mapItem.ChartStyle = v.ChartStyle
+			//mapItem.ChartColor = v.ChartColor
+			//mapItem.PredictChartColor = v.PredictChartColor
+			//mapItem.ChartWidth = v.ChartWidth
+			mapItem.Source = utils.CHART_SOURCE_CORRELATION
+			tmpId, err := to.Insert(mapItem)
+			if err != nil {
+				fmt.Println("AddChartEdbMapping Err:" + err.Error())
+				return err
+			}
+			mapItem.ChartEdbMappingId = int(tmpId)
+			chartEdbMappingIdList = append(chartEdbMappingIdList, strconv.Itoa(mapItem.ChartEdbMappingId))
+		}
+	}
+	if len(chartEdbMappingIdList) > 0 {
+		chartEdbMappingIdStr := strings.Join(chartEdbMappingIdList, ",")
+		dsql := `DELETE FROM chart_edb_mapping WHERE chart_info_id=? AND chart_edb_mapping_id NOT IN(` + chartEdbMappingIdStr + `)`
+		_, err = to.Raw(dsql, req.ChartInfoId).Exec()
+		if err != nil {
+			fmt.Println("delete err:" + err.Error())
+			return err
+		}
+	}
+
+	// 相关性图表
+	_, err = to.Update(correlationChart, correlationUpdateCols...)
+	return
+}
 
 // PreviewSectionScatterChartReq 预览截面散点图的请求
 type PreviewSectionScatterChartReq struct {
@@ -1100,3 +1683,9 @@ type CoordinatePoint struct {
 	X float64
 	Y float64
 }
+
+// RollingCorrelationChartDataResp 滚动相关性图
+type RollingCorrelationChartDataResp struct {
+	XDateTimeValue []string `description:"滚动相关性图的x轴数据,日期数据"`
+	YDataList      []YData  `description:"滚动相关性图的y轴数据"`
+}

+ 162 - 0
models/data_manage/edb_info_no_permission_admin.go

@@ -0,0 +1,162 @@
+package data_manage
+
+import (
+	"github.com/beego/beego/v2/client/orm"
+	"time"
+)
+
+// EdbInfoNoPermissionAdmin 指标不可见用户配置表
+type EdbInfoNoPermissionAdmin struct {
+	Id         int `orm:"column(id);pk"`
+	EdbInfoId  int `orm:"column(edb_info_id);"`
+	AdminId    int `orm:"column(admin_id);"`
+	CreateTime time.Time
+}
+
+func AddEdbInfoNoPermissionAdmin(item *EdbInfoNoPermissionAdmin) (lastId int64, err error) {
+	o := orm.NewOrmUsingDB("data")
+	lastId, err = o.Insert(item)
+	return
+}
+
+// GetAllListByEdbInfoId 根据指标id获取所有的配置
+func (item EdbInfoNoPermissionAdmin) GetAllListByEdbInfoId(edbInfoId int) (items []*EdbInfoNoPermissionAdmin, err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := `SELECT * FROM edb_info_no_permission_admin WHERE edb_info_id = ? ORDER BY create_time desc`
+	_, err = o.Raw(sql, edbInfoId).QueryRows(&items)
+	return
+}
+
+// GetAllListByAdminId 根据用户id获取该用户的所有配置
+func (item EdbInfoNoPermissionAdmin) GetAllListByAdminId(adminId int) (items []*EdbInfoNoPermissionAdmin, err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := `SELECT * FROM edb_info_no_permission_admin WHERE admin_id = ? ORDER BY create_time desc`
+	_, err = o.Raw(sql, adminId).QueryRows(&items)
+	return
+}
+
+// GetByEdbInfoIdAndAdminId 根据用户id和指标id获取配置
+func (item EdbInfoNoPermissionAdmin) GetByEdbInfoIdAndAdminId(adminId, edbInfoId int) (info *EdbInfoNoPermissionAdmin, err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := `SELECT * FROM edb_info_no_permission_admin WHERE admin_id = ? AND edb_info_id = ? ORDER BY create_time desc`
+	err = o.Raw(sql, adminId, edbInfoId).QueryRow(&info)
+	return
+}
+
+// DeleteAllByEdbInfoId 根据指标id删除所有的配置
+func (item EdbInfoNoPermissionAdmin) DeleteAllByEdbInfoId(edbInfoId int) (err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := `DELETE FROM edb_info_no_permission_admin WHERE edb_info_id = ? `
+	_, err = o.Raw(sql, edbInfoId).Exec()
+	return
+}
+
+// DeleteByEdbInfoIdAndAdminId 根据指标id和用户id删除配置
+func (item EdbInfoNoPermissionAdmin) DeleteByEdbInfoIdAndAdminId(edbInfoId, adminId int) (err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := `DELETE FROM edb_info_no_permission_admin WHERE edb_info_id = ? AND admin_id = ? `
+	_, err = o.Raw(sql, edbInfoId, adminId).Exec()
+	return
+}
+
+// ModifyByEdbInfoId 根据指标id和用户ID列表 重新配置
+func (item EdbInfoNoPermissionAdmin) ModifyByEdbInfoId(edbInfoId int, adminIdList []int) (err error) {
+	to, err := orm.NewOrmUsingDB("data").Begin()
+	if err != nil {
+		return
+	}
+	defer func() {
+		if err != nil {
+			_ = to.Rollback()
+		} else {
+			_ = to.Commit()
+		}
+	}()
+	sql := `DELETE FROM edb_info_no_permission_admin WHERE edb_info_id = ? `
+	_, err = to.Raw(sql, edbInfoId).Exec()
+	if err != nil {
+		return
+	}
+
+	insertArr := make([]*EdbInfoNoPermissionAdmin, 0)
+	for _, adminId := range adminIdList {
+		insertArr = append(insertArr, &EdbInfoNoPermissionAdmin{
+			//Id:         0,
+			EdbInfoId:  edbInfoId,
+			AdminId:    adminId,
+			CreateTime: time.Now(),
+		})
+	}
+	if len(insertArr) > 0 {
+		_, err = to.InsertMulti(len(insertArr), insertArr)
+	}
+	return
+}
+
+// AddByEdbInfoId 根据指标id和用户ID列表 添加配置
+func (item EdbInfoNoPermissionAdmin) AddByEdbInfoId(edbInfoId int, adminIdList []int) (err error) {
+	to, err := orm.NewOrmUsingDB("data").Begin()
+	if err != nil {
+		return
+	}
+	defer func() {
+		if err != nil {
+			_ = to.Rollback()
+		} else {
+			_ = to.Commit()
+		}
+	}()
+
+	var items []*EdbInfoNoPermissionAdmin
+	sql := `SELECT * FROM edb_info_no_permission_admin WHERE edb_info_id = ? ORDER BY create_time desc`
+	_, err = to.Raw(sql, edbInfoId).QueryRows(&items)
+	if err != nil {
+		return
+	}
+
+	hasMap := make(map[int]int)
+	for _, v := range items {
+		hasMap[v.AdminId] = v.EdbInfoId
+	}
+
+	insertArr := make([]*EdbInfoNoPermissionAdmin, 0)
+	for _, adminId := range adminIdList {
+		if _, ok := hasMap[adminId]; !ok {
+			insertArr = append(insertArr, &EdbInfoNoPermissionAdmin{
+				//Id:         0,
+				EdbInfoId:  edbInfoId,
+				AdminId:    adminId,
+				CreateTime: time.Now(),
+			})
+		}
+	}
+	if len(insertArr) > 0 {
+		_, err = to.InsertMulti(len(insertArr), insertArr)
+	}
+	return
+}
+
+type NoPermissionChart struct {
+	AdminId     int
+	ChartInfoId int
+}
+
+// GetAllChartListByAdminId 根据用户id获取该用户的所有配置
+func (item EdbInfoNoPermissionAdmin) GetAllChartListByAdminId(adminId int) (items []*NoPermissionChart, err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := `SELECT a.admin_id,b.chart_info_id FROM edb_info_no_permission_admin AS a 
+			JOIN chart_edb_mapping AS b ON a.edb_info_id=b. edb_info_id
+			WHERE a.admin_id = ? ORDER BY a.create_time desc `
+	_, err = o.Raw(sql, adminId).QueryRows(&items)
+	return
+}
+
+// GetChartByEdbInfoIdAndAdminId 根据用户id和指标id获取配置
+func (item EdbInfoNoPermissionAdmin) GetChartByEdbInfoIdAndAdminId(adminId, edbInfoId int) (info *NoPermissionChart, err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := `SELECT a.admin_id,b.chart_info_id FROM edb_info_no_permission_admin AS a 
+			JOIN chart_edb_mapping AS b ON a.edb_info_id=b. edb_info_id
+			WHERE a.admin_id = ? AND a.edb_info_id = ? ORDER BY a.create_time desc`
+	err = o.Raw(sql, adminId, edbInfoId).QueryRow(&info)
+	return
+}

+ 24 - 0
models/data_manage/my_chart_log.go

@@ -0,0 +1,24 @@
+package data_manage
+
+import (
+	"github.com/beego/beego/v2/client/orm"
+	"time"
+)
+
+type MyChartLog struct {
+	MyChartLogId    int `orm:"column(my_chart_log_id);pk"`
+	MyChartId       int
+	ChartInfoId     int `description:"图表id"`
+	SysUserId       int
+	SysUserRealName string
+	CreateTime      time.Time
+	Content         string `description:"内容"`
+	Status          string `description:"状态"`
+	Method          string `description:"执行方法"`
+}
+
+func AddMyChartLog(item *MyChartLog) (lastId int64, err error) {
+	o := orm.NewOrmUsingDB("data")
+	lastId, err = o.Insert(item)
+	return
+}

+ 18 - 0
models/data_manage/search_keyword.go

@@ -0,0 +1,18 @@
+package data_manage
+
+import (
+	"github.com/beego/beego/v2/client/orm"
+	"time"
+)
+
+type SearchKeyword struct {
+	Id         int `orm:"column(id);pk"`
+	KeyWord    string
+	CreateTime time.Time
+}
+
+func AddSearchKeyword(item *SearchKeyword) (err error) {
+	o := orm.NewOrmUsingDB("data")
+	_, err = o.Insert(item)
+	return
+}

+ 26 - 4
models/db.go

@@ -2,6 +2,7 @@ package models
 
 import (
 	_ "github.com/go-sql-driver/mysql"
+	"hongze/hongze_ETA_mobile_api/models/data_manage"
 	"hongze/hongze_ETA_mobile_api/models/system"
 	"hongze/hongze_ETA_mobile_api/utils"
 	"time"
@@ -53,7 +54,6 @@ func init() {
 	comein_datadb, _ := orm.GetDB("comein_data")
 	comein_datadb.SetConnMaxLifetime(10 * time.Minute)
 
-
 	orm.Debug = true
 	orm.DebugLog = orm.NewLog(utils.Binlog)
 
@@ -68,7 +68,7 @@ func init() {
 		new(PptV2SaveLog),
 		new(PptV2Group),
 		new(PptV2GroupMapping),
-		new(PptV2Grant),                 //ppt授权操作表
+		new(PptV2Grant), //ppt授权操作表
 	)
 
 	// 报告相关 数据表
@@ -76,6 +76,9 @@ func init() {
 
 	initSystem()
 
+	initChart()
+
+	initEdbData()
 }
 
 // initSystem 系统表 数据表
@@ -87,12 +90,31 @@ func initSystem() {
 	)
 }
 
-
 // initReport 报告相关 数据表
 func initReport() {
 	orm.RegisterModel(
-		new(ClassifyMenu),                  // 报告分类-子目录表
+		new(ClassifyMenu), // 报告分类-子目录表
 	)
 }
 
+// initChart 图表 数据表
+func initChart() {
+	orm.RegisterModel(
+		new(data_manage.ChartClassify),
+		new(data_manage.ChartInfo),
+		new(data_manage.ChartEdbMapping),
+		new(data_manage.MyChartClassify),
+		new(data_manage.MyChart),
+		new(data_manage.MyChartLog),
+		new(data_manage.MyChartClassifyMapping),
+		//new(data_manage.ChartInfoLog),
+		new(data_manage.ChartInfoCorrelation),
+	)
+}
 
+// initEdbData 指标服务 数据表
+func initEdbData() {
+	orm.RegisterModel(
+		new(data_manage.SearchKeyword),
+	)
+}

+ 449 - 0
models/system/sys_admin.go

@@ -0,0 +1,449 @@
+package system
+
+import (
+	"fmt"
+	"github.com/beego/beego/v2/client/orm"
+	"github.com/rdlucklib/rdluck_tools/paging"
+	"strings"
+	"time"
+)
+
+type AdminItem struct {
+	AdminId                 int    `description:"系统用户id"`
+	AdminName               string `description:"系统用户名称"`
+	RealName                string `description:"系统用户姓名"`
+	Password                string
+	LastUpdatedPasswordTime string `json:"-"`
+	Enabled                 int    `description:"1:有效,0:禁用"`
+	Email                   string `description:"系统用户邮箱"`
+	LastLoginTime           string
+	CreatedTime             time.Time
+	LastUpdatedTime         string
+	Role                    string `description:"系统用户角色"`
+	Mobile                  string `description:"手机号"`
+	RoleType                int    `description:"角色类型:1需要录入指标,0:不需要"`
+	RoleId                  int    `description:"角色id"`
+	RoleName                string `description:"角色名称"`
+	RoleTypeCode            string `description:"角色编码"`
+	DepartmentId            int    `description:"部门id"`
+	DepartmentName          string `json:"-" description:"部门名称"`
+	TeamId                  int    `description:"三级id"`
+	GroupId                 int    `description:"分组id"`
+	GroupName               string `json:"-" description:"分组名称"`
+	Authority               int    `description:"管理权限,0:无,1:部门负责人,2:小组负责人,或者ficc销售主管,4:ficc销售组长"`
+	Position                string `description:"职位"`
+	DepartmentGroup         string `description:"部门分组"`
+	LabelVal                int    `description:"标签:1:超级管理员,2:管理员,3:部门经理,4:组长,5:ficc销售主管"`
+	ResearchGroupName       string `description:"研究方向分组名称"`
+	Province                string `description:"省"`
+	ProvinceCode            string `description:"省编码"`
+	City                    string `description:"市"`
+	CityCode                string `description:"市编码"`
+	EmployeeId              string `description:"员工工号(钉钉/每刻报销)"`
+}
+
+func GetSysuserList(condition string, pars []interface{}, startSize, pageSize int) (items []*AdminItem, err error) {
+	o := orm.NewOrm()
+	sql := `SELECT * FROM admin WHERE 1=1 `
+	if condition != "" {
+		sql += condition
+	}
+	sql += `ORDER BY created_time DESC LIMIT ?,?`
+	_, err = o.Raw(sql, pars, startSize, pageSize).QueryRows(&items)
+	return
+}
+
+func GetSysuserListCount(condition string, pars []interface{}) (count int, err error) {
+	o := orm.NewOrm()
+	sql := `SELECT COUNT(1) AS count FROM admin WHERE 1=1 `
+	if condition != "" {
+		sql += condition
+	}
+	err = o.Raw(sql, pars).QueryRow(&count)
+	return
+}
+
+type AdminRespItem struct {
+	AdminId                 int    `description:"系统用户id"`
+	AdminName               string `description:"系统用户名称"`
+	RealName                string `description:"系统用户姓名"`
+	Password                string
+	LastUpdatedPasswordTime string `json:"-"`
+	Enabled                 int    `description:"1:有效,0:禁用"`
+	Email                   string `description:"系统用户邮箱"`
+	LastLoginTime           string
+	CreatedTime             time.Time
+	LastUpdatedTime         string
+	Role                    string `description:"系统用户角色"`
+	Mobile                  string `description:"手机号"`
+	RoleType                int    `description:"角色类型:1需要录入指标,0:不需要"`
+	RoleId                  int    `description:"角色id"`
+	RoleName                string `description:"角色名称"`
+	RoleTypeCode            string `description:"角色编码"`
+	DepartmentId            int    `description:"部门id"`
+	DepartmentName          string `json:"-" description:"部门名称"`
+	parentId                int    `description:"父级id"`
+	GroupId                 int    `description:"分组id"`
+	GroupName               string `json:"-" description:"分组名称"`
+	Authority               int    `description:"管理权限,0:无,1:部门负责人,2:小组负责人,或者ficc销售主管,4:ficc销售组长"`
+	Position                string `description:"职位"`
+	DepartmentGroup         string `description:"部门分组"`
+	LabelVal                int    `description:"标签:1:超级管理员,2:管理员,3:部门经理,4:组长,5:ficc销售主管"`
+}
+
+type SysuserListResp struct {
+	List   []*AdminItem
+	Paging *paging.PagingItem `description:"分页数据"`
+}
+
+type SysuserAddReq struct {
+	AdminName    string `description:"系统用户名称"`
+	AdminAvatar  string `description:"用户头像"`
+	RealName     string `description:"系统用户姓名"`
+	Password     string `description:"密码"`
+	Mobile       string `description:"手机号"`
+	RoleId       int    `description:"角色id"`
+	DepartmentId int    `description:"部门id"`
+	GroupId      int    `description:"分组id"`
+	TeamId       int    `description:"小组id"`
+	//Authority    int    `description:"管理权限,0:无,1:部门负责人,2:小组负责人"`
+	Position         string `description:"职位"`
+	ResearchGroupIds string `description:"研究方向分组IDs"`
+	Province         string `description:"省"`
+	ProvinceCode     string `description:"省编码"`
+	City             string `description:"市"`
+	CityCode         string `description:"市编码"`
+	EmployeeId       string `description:"员工工号(钉钉/每刻报销)"`
+}
+
+func GetSysAdminCount(adminName string) (count int, err error) {
+	sql := `SELECT COUNT(1) AS count FROM admin WHERE admin_name=? `
+	o := orm.NewOrm()
+	err = o.Raw(sql, adminName).QueryRow(&count)
+	return
+}
+
+func GetSysAdminByName(adminName string) (item *Admin, err error) {
+	sql := `SELECT * FROM admin WHERE admin_name=? `
+	o := orm.NewOrm()
+	err = o.Raw(sql, adminName).QueryRow(&item)
+	return
+}
+
+func GetSysAdminById(adminId int) (item *Admin, err error) {
+	sql := `SELECT * FROM admin WHERE admin_id=? `
+	o := orm.NewOrm()
+	err = o.Raw(sql, adminId).QueryRow(&item)
+	return
+}
+
+func AddAdmin(item *Admin) (err error) {
+	o := orm.NewOrm()
+	adminId, err := o.Insert(item)
+	item.AdminId = int(adminId)
+	return
+}
+
+type SysuserEditReq struct {
+	AdminId      int    `description:"系统用户id"`
+	AdminName    string `description:"系统用户名称"`
+	AdminAvatar  string `description:"用户头像"`
+	RealName     string `description:"系统用户姓名"`
+	Password     string `description:"密码"`
+	Mobile       string `description:"手机号"`
+	RoleId       int    `description:"角色id"`
+	DepartmentId int    `description:"部门id"`
+	GroupId      int    `description:"分组id"`
+	TeamId       int    `description:"小组id"`
+	Enabled      int    `description:"1:有效,0:禁用"`
+	//Authority    int    `description:"管理权限,0:无,1:部门负责人,2:小组负责人"`
+	Position         string `description:"职位"`
+	ResearchGroupIds string `description:"研究方向分组IDs"`
+	Province         string `description:"省"`
+	ProvinceCode     string `description:"省编码"`
+	City             string `description:"市"`
+	CityCode         string `description:"市编码"`
+	EmployeeId       string `description:"员工工号(钉钉/每刻报销)"`
+}
+
+// 用户状态编辑
+type SysuserEditEnabledReq struct {
+	AdminId int `description:"系统用户id"`
+	Enabled int `description:"1:有效,0:禁用"`
+}
+
+func EditAdmin(item *Admin) (err error) {
+	o := orm.NewOrm()
+	sql := `UPDATE admin
+			SET
+			  admin_name= ?,
+			  real_name = ?,
+			  password = ?,
+			  last_updated_password_time = NOW(),
+			  email = ?,
+			  last_updated_time = NOW(),
+			  mobile = ?,
+			  role_type = ?,
+			  role_id = ?,
+			  role_name = ?,
+			  department_id = ?,
+			  department_name = ?,
+			  group_id = ?,
+			  group_name = ?,
+			  authority = ?,
+			  position = ?,
+			  role_type_code=?,
+			  enabled=?,
+			  admin_avatar = ?,
+			  province=?,
+			  province_code=?,
+			  city=?,
+			  city_code=?,
+			  employee_id = ?
+			WHERE admin_id = ? `
+	_, err = o.Raw(sql, item.AdminName, item.RealName, item.Password, item.Email, item.Mobile, item.RoleType, item.RoleId, item.RoleName, item.DepartmentId, item.DepartmentName,
+		item.GroupId, item.GroupName, item.Authority, item.Position, item.RoleTypeCode, item.Enabled, item.AdminAvatar, item.Province, item.ProvinceCode, item.City, item.CityCode, item.EmployeeId, item.AdminId).Exec()
+	return
+}
+
+// 变更状态
+func EditAdminEnabled(item *Admin) (err error) {
+	o := orm.NewOrm()
+	sql := `UPDATE admin
+			SET
+			  last_updated_time = NOW(),enabled=? WHERE admin_id = ? `
+	_, err = o.Raw(sql, item.Enabled, item.AdminId).Exec()
+	return
+}
+
+// DisableAdmin 禁用用户
+func DisableAdmin(adminId int) (err error) {
+	o := orm.NewOrm()
+	sql := `UPDATE admin
+			SET
+			  last_updated_time = NOW(),disable_time=now(),enabled=0 WHERE admin_id = ? `
+	_, err = o.Raw(sql, adminId).Exec()
+	return
+}
+
+type SysuserDeleteReq struct {
+	AdminId int `description:"系统用户id"`
+}
+
+func DeleteSysuser(adminId int) (err error) {
+	sql := `DELETE FROM admin WHERE admin_id=? `
+	o := orm.NewOrm()
+	_, err = o.Raw(sql, adminId).Exec()
+	return
+}
+
+// GetSysAdminCountByMobile 查询系统中是否存在该手机号(如果有传入用户id,那么排除该用户)
+func GetSysAdminCountByMobile(mobile string, adminId int) (count int, err error) {
+	sql := `SELECT COUNT(1) AS count FROM admin WHERE mobile=? `
+	if adminId > 0 {
+		sql += ` AND admin_id != ` + fmt.Sprint(adminId)
+	}
+	o := orm.NewOrm()
+	err = o.Raw(sql, mobile).QueryRow(&count)
+	return
+}
+
+func GetSysUserItems(condition string, pars []interface{}) (items []*AdminItem, err error) {
+	o := orm.NewOrm()
+	sql := `SELECT * FROM admin WHERE 1=1 `
+	if condition != "" {
+		sql += condition
+	}
+	sql += `ORDER BY last_updated_time DESC `
+	_, err = o.Raw(sql, pars).QueryRows(&items)
+	return
+}
+
+func GetSysUserItemsOrderByCreated(condition string, pars []interface{}) (items []*AdminItem, err error) {
+	o := orm.NewOrm()
+	sql := `SELECT * FROM admin WHERE 1=1 `
+	if condition != "" {
+		sql += condition
+	}
+	sql += ` ORDER BY created_time DESC `
+	_, err = o.Raw(sql, pars).QueryRows(&items)
+	return
+}
+func GetSysUserItemsList(condition string, pars []interface{}, startSize, pageSize int) (items []*AdminItem, err error) {
+	o := orm.NewOrm()
+	sql := `SELECT * FROM admin WHERE 1=1 `
+	if condition != "" {
+		sql += condition
+	}
+	sql += ` ORDER BY created_time DESC limit ?,?`
+	_, err = o.Raw(sql, pars, startSize, pageSize).QueryRows(&items)
+	return
+}
+func GetSysUserItemsTotal(condition string, pars []interface{}) (total int64, err error) {
+	o := orm.NewOrm()
+	sql := `SELECT count(*) FROM admin WHERE 1=1 `
+	if condition != "" {
+		sql += condition
+	}
+	err = o.Raw(sql, pars).QueryRow(&total)
+	return
+}
+
+// GetGroupSysUserList 根据分组id获取系统用户列表
+func GetGroupSysUserList(groupId int) (items []*AdminItem, err error) {
+	o := orm.NewOrm()
+	sql := `SELECT * FROM admin WHERE group_id=? ORDER BY created_time DESC `
+	_, err = o.Raw(sql, groupId).QueryRows(&items)
+	return
+}
+
+// GetDepartmentGroupSysUserList 根据部门id和分组id获取系统用户列表
+func GetDepartmentGroupSysUserList(departmentId, groupId int, roleTypeCodes string) (items []*AdminItem, err error) {
+	o := orm.NewOrm()
+	sql := `SELECT * FROM admin WHERE department_id = ? and group_id=? and enabled=1 `
+	if roleTypeCodes != "" {
+		sql += ` and role_type_code in (` + roleTypeCodes + `) `
+	}
+	sql += ` ORDER BY created_time asc `
+	_, err = o.Raw(sql, departmentId, groupId).QueryRows(&items)
+	return
+}
+
+// GetGrooupsysUserList 根据大组id和小组id获取系统用户列表
+func GetGrooupsysUserList(groupId int, roleTypeCodes string, enabled int) (items []*AdminItem, err error) {
+	o := orm.NewOrm()
+	sql := `SELECT * FROM admin WHERE group_id = ? `
+	if roleTypeCodes != "" {
+		sql += ` and role_type_code in (` + roleTypeCodes + `) `
+	}
+	if enabled >= 0 {
+		sql += fmt.Sprint(` AND enabled=`, enabled, ` `)
+	}
+	sql += ` ORDER BY created_time asc `
+	_, err = o.Raw(sql, groupId).QueryRows(&items)
+	return
+}
+
+// GetSysAdminByIdSlice 根据账户id列表获取账户信息列表
+func GetSysAdminByIdSlice(adminIdList []string) (items []*Admin, err error) {
+	if len(adminIdList) <= 0 {
+		return
+	}
+	sql := `SELECT * FROM admin WHERE admin_id in (` + strings.Join(adminIdList, ",") + `) `
+	o := orm.NewOrm()
+	_, err = o.Raw(sql).QueryRows(&items)
+	return
+}
+
+// GetTeamSysUserList 根据小组id获取系统用户列表
+func GetTeamSysUserList(teamId, enabled int) (items []*AdminItem, err error) {
+	o := orm.NewOrm()
+	sql := `SELECT * FROM admin WHERE group_id=? `
+	if enabled >= 0 {
+		sql += fmt.Sprint(` AND enabled=`, enabled, ` `)
+	}
+	sql += ` ORDER BY created_time DESC `
+	_, err = o.Raw(sql, teamId).QueryRows(&items)
+	return
+}
+
+// GetTeamSysUserList 根据小组id获取系统用户列表
+func GetTeamSysUserListByIds(ids string) (items []*AdminItem, err error) {
+	o := orm.NewOrm()
+	sql := `SELECT * FROM admin WHERE group_id IN (` + ids + `) ORDER BY created_time DESC `
+	_, err = o.Raw(sql).QueryRows(&items)
+	return
+}
+
+func GetGroupIdByParentId(groupId int) (items []*string, err error) {
+	o := orm.NewOrm()
+	sql := `SELECT group_id FROM sys_group WHERE parent_id=? ORDER BY create_time DESC `
+	_, err = o.Raw(sql, groupId).QueryRows(&items)
+	return
+}
+
+// GetSysUserByParentIdGroupId 查询主管下的所有组员
+func GetSysUserByParentIdGroupId(groupId int) (items []*AdminItem, err error) {
+	o := orm.NewOrm()
+	sql := `select real_name, role_id, role_type_code, group_id, admin_id from admin where group_id in (SELECT group_id from sys_group where parent_id=?) OR group_id=?`
+	_, err = o.Raw(sql, groupId, groupId).QueryRows(&items)
+	return
+}
+func GetAdminByGroupId(groupId int) (items []*AdminItem, err error) {
+	o := orm.NewOrm()
+	sql := `SELECT * FROM admin WHERE group_id=? ORDER BY created_time DESC`
+	_, err = o.Raw(sql, groupId).QueryRows(&items)
+	return
+}
+
+// GetSysAdminByIds 根据主键集合获取管理员信息
+func GetSysAdminByIds(adminIds string) (items []*Admin, err error) {
+	if adminIds == "" {
+		return
+	}
+	o := orm.NewOrm()
+	sql := `SELECT * FROM admin WHERE admin_id IN (` + adminIds + `)`
+	_, err = o.Raw(sql).QueryRows(&items)
+	return
+}
+
+type OpenIdList struct {
+	OpenId  string
+	AdminId int
+}
+
+// GetAdminOpenIdListByMobile 根据手机号获取用户的openid列表
+func GetAdminOpenIdListByMobile(mobile string) (items []*OpenIdList, err error) {
+	sql := `SELECT admin_id, open_id FROM admin 
+          WHERE open_id != "" and mobile=? `
+	_, err = orm.NewOrm().Raw(sql, mobile).QueryRows(&items)
+	return
+}
+
+// ResearcherAdminAndUser 研究员admin信息及wx_user信息
+type ResearcherAdminAndUser struct {
+	UserId    int    `description:"用户ID"`
+	UserName  string `description:"用户名称"`
+	AdminId   int    `description:"管理员ID"`
+	AdminName string `description:"管理员姓名"`
+	OpenId    string `description:"openid"`
+}
+
+// GetResearcherAdminAndWxUserByAdminId 通过adminId获取研究员admin及user信息
+func GetResearcherAdminAndWxUserByAdminId(adminId int) (item *ResearcherAdminAndUser, err error) {
+	sql := `SELECT
+				a.admin_id,
+				a.real_name AS admin_name,
+				a.open_id,
+				b.user_id,
+				b.real_name AS user_name
+			FROM
+				admin AS a
+			JOIN wx_user AS b ON a.mobile = b.mobile
+			WHERE
+				a.admin_id = ? AND a.open_id != ""`
+	err = orm.NewOrm().Raw(sql, adminId).QueryRow(&item)
+	return
+}
+
+// 获取本组的销售ID
+func GetSelleridWhichGroup(companyId, productId int) (adminId string, err error) {
+	o := orm.NewOrm()
+	sql := ` SELECT
+			GROUP_CONCAT( DISTINCT admin_id SEPARATOR ',' ) AS adminId
+			FROM
+			admin
+			WHERE
+			group_id IN (
+			SELECT
+			a.group_id
+			FROM
+			company_product AS a
+			INNER JOIN admin AS b ON a.seller_id = b.admin_id
+			WHERE
+			a.company_id = ?
+			AND a.product_id = ?
+)`
+	err = o.Raw(sql, companyId, productId).QueryRow(&adminId)
+	return
+}

+ 1 - 0
models/system/sys_user.go

@@ -60,6 +60,7 @@ type Admin struct {
 	ProvinceCode              string    `description:"省编码"`
 	City                      string    `description:"市"`
 	CityCode                  string    `description:"市编码"`
+	EmployeeId                string    `description:"员工工号(钉钉/每刻报销)"`
 }
 
 // Update 更新用户基础信息

+ 264 - 0
services/data/chart_info_elastic.go

@@ -0,0 +1,264 @@
+package data
+
+import (
+	"fmt"
+	"hongze/hongze_ETA_mobile_api/models/data_manage"
+	"hongze/hongze_ETA_mobile_api/services/elastic"
+	"hongze/hongze_ETA_mobile_api/utils"
+	"strconv"
+	"strings"
+)
+
+//func CreateChartInfoIndex() {
+//	indexName := utils.CHART_INDEX_NAME
+//	mappingJson := `{
+//  "mappings": {
+//    "dynamic": true,
+//    "properties": {
+//      "ChartInfoId": {
+//        "type": "integer"
+//      },
+//      "ChartName": {
+//        "type": "text",
+//        "term_vector": "with_positions_offsets",
+//        "analyzer": "ik_smart"
+//      },
+//      "ChartClassifyId": {
+//        "type": "integer"
+//      },
+//      "SysUserId": {
+//        "type": "integer"
+//      },
+//      "SysUserRealName": {
+//        "type": "text",
+//        "term_vector": "with_positions_offsets",
+//        "analyzer": "ik_smart"
+//      },
+//      "UniqueCode": {
+//        "type": "text",
+//        "term_vector": "with_positions_offsets"
+//      },
+//      "Unit": {
+//        "type": "text",
+//        "term_vector": "with_positions_offsets"
+//      },
+//      "CreateTime": {
+//        "type": "date"
+//      },
+//      "ModifyTime": {
+//        "type": "date"
+//      },
+//      "DateType": {
+//        "type": "integer"
+//      },
+//      "StartDate": {
+//        "type": "text",
+//        "term_vector": "with_positions_offsets"
+//      },
+//      "EndDate": {
+//        "type": "text",
+//        "term_vector": "with_positions_offsets"
+//      },
+//      "IsSetName": {
+//        "type": "integer"
+//      },
+//      "EdbInfoIds": {
+//        "type": "text",
+//        "term_vector": "with_positions_offsets"
+//      },
+//      "ChartType": {
+//        "type": "integer"
+//      },
+//      "Calendar": {
+//        "type": "text",
+//        "term_vector": "with_positions_offsets"
+//      },
+//      "ChartImage": {
+//        "type": "text",
+//        "term_vector": "with_positions_offsets"
+//      }
+//    }
+//  }
+//}`
+//	EsCreateIndex(indexName, mappingJson)
+//}
+
+func AddAllChartInfo() {
+	allList, err := data_manage.GetChartInfoAllList()
+	if err != nil {
+		fmt.Println("GetArticleAll Err:", err.Error())
+		return
+	}
+	total := len(allList)
+	for k, v := range allList {
+		EsAddOrEditChartInfo(v.ChartInfoId)
+		//fmt.Println(v.ChartInfoId)
+		fmt.Println("剩余", total-k-1, "条数据,当前图表id:", v.ChartInfoId)
+	}
+}
+
+// EsAddOrEditChartInfo 新增和修改ES中的图表数据
+func EsAddOrEditChartInfo(chartInfoId int) {
+	var err error
+	defer func() {
+		if err != nil {
+			fmt.Println("新增和修改ES中的图表数据失败:", err.Error())
+		}
+	}()
+	itemInfo, _ := data_manage.GetChartInfoById(chartInfoId)
+	//添加es
+	err = elastic.EsAddOrEditChartInfoData(utils.CHART_INDEX_NAME, strconv.Itoa(itemInfo.ChartInfoId), itemInfo)
+	return
+}
+
+// EsDeleteChartInfo 删除ES中的图表数据
+func EsDeleteChartInfo(chartInfoId int) {
+	var err error
+	defer func() {
+		if err != nil {
+			fmt.Println("删除ES中的图表数据失败:", err.Error())
+		}
+	}()
+	//添加es
+	err = elastic.EsDeleteDataV2(utils.CHART_INDEX_NAME, strconv.Itoa(chartInfoId))
+	return
+}
+
+// EsSearchChartInfo 搜索图表信息
+func EsSearchChartInfo(keyword string, showSysId int, sourceList []int, noPermissionChartIdList []int, startSize, pageSize int) (list []*data_manage.ChartInfo, total int64, err error) {
+	list, total, err = elastic.SearchChartInfoData(utils.CHART_INDEX_NAME, keyword, showSysId, sourceList, noPermissionChartIdList, startSize, pageSize)
+	return
+}
+
+// AddAllMyChartInfo 添加所有的我的图库数据
+func AddAllMyChartInfo() {
+	errMsg := make([]string, 0)
+	defer func() {
+		if len(errMsg) > 0 {
+			fmt.Println("新增和修改ES中的图表数据失败:", strings.Join(errMsg, "\n"))
+		}
+	}()
+	var condition string
+	var pars []interface{}
+
+	allList, err := data_manage.GetMyChartListGroupByCharyInfoIdAndAdminIdByCondition(condition, pars)
+	if err != nil {
+		fmt.Println("AddAllMyChartInfo Err:", err.Error())
+		return
+	}
+
+	for _, v := range allList {
+		//添加es
+		err = elastic.EsAddOrEditDataInterface(utils.MY_CHART_INDEX_NAME, strconv.Itoa(v.MyChartId), v)
+		if err != nil {
+			errMsg = append(errMsg, fmt.Sprintf("myChartId:%d,添加Es失败,err:%s", v.MyChartId, err.Error()))
+		}
+	}
+}
+
+// EsAddOrEditMyChartInfoByChartInfoId 根据图表id 新增和修改ES中的图表数据
+func EsAddOrEditMyChartInfoByChartInfoId(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 := data_manage.GetMyChartListGroupByCharyInfoIdAndAdminIdByCondition(condition, pars)
+	if err != nil {
+		errMsg = append(errMsg, fmt.Sprintf("EsAddOrEditMyChartInfoByChartInfoId Err:%s", err.Error()))
+		return
+	}
+	for _, v := range allList {
+		//添加es
+		err = elastic.EsAddOrEditDataInterface(utils.MY_CHART_INDEX_NAME, strconv.Itoa(v.MyChartId), v)
+		if err != nil {
+			errMsg = append(errMsg, fmt.Sprintf("myChartId:%d,添加Es失败,err:%s", v.MyChartId, err.Error()))
+		}
+
+	}
+	return
+}
+
+// EsDeleteMyChartInfoByChartInfoId 根据图表id 删除ES中的图表数据
+func EsDeleteMyChartInfoByChartInfoId(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 += " a.chart_info_id = ? "
+	pars = append(pars, chartInfoId)
+
+	allList, err := data_manage.GetMyChartListGroupByCharyInfoIdAndAdminIdByCondition(condition, pars)
+	if err != nil {
+		errMsg = append(errMsg, fmt.Sprintf("AddAllMyChartInfo Err:%s", err.Error()))
+		return
+	}
+	for _, v := range allList {
+		//删除es
+		err = elastic.EsDeleteDataV2(utils.MY_CHART_INDEX_NAME, strconv.Itoa(v.MyChartId))
+		if err != nil {
+			errMsg = append(errMsg, fmt.Sprintf("myChartId:%d,删除Es失败,err:%s", v.MyChartId, err.Error()))
+		}
+	}
+	return
+}
+
+// EsAddOrEditMyChartInfoByMyChartId 根据我的图库id 新增和修改ES中的图表数据
+func EsAddOrEditMyChartInfoByMyChartId(myChartId 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.my_chart_id = ? "
+	pars = append(pars, myChartId)
+
+	allList, err := data_manage.GetMyChartListGroupByCharyInfoIdAndAdminIdByCondition(condition, pars)
+	if err != nil {
+		errMsg = append(errMsg, fmt.Sprintf("EsAddOrEditMyChartInfoByMyChartId Err:%s", err.Error()))
+		return
+	}
+	for _, v := range allList {
+		//添加es
+		err = elastic.EsAddOrEditDataInterface(utils.MY_CHART_INDEX_NAME, strconv.Itoa(v.MyChartId), v)
+		if err != nil {
+			errMsg = append(errMsg, fmt.Sprintf("myChartId:%d,添加Es失败,err:%s", v.MyChartId, err.Error()))
+		}
+	}
+	return
+}
+
+// EsDeleteMyChartInfoByMyChartId 根据我的图库id 删除ES中的图表数据
+func EsDeleteMyChartInfoByMyChartId(myChartId int) {
+	var err error
+	defer func() {
+		if err != nil {
+			fmt.Println("删除ES中的图表数据失败:", err.Error())
+		}
+	}()
+	//添加es
+	err = elastic.EsDeleteDataV2(utils.MY_CHART_INDEX_NAME, strconv.Itoa(myChartId))
+	return
+}
+
+// EsSearchMyChartInfo 搜索图表信息
+func EsSearchMyChartInfo(keyword string, adminId int, noPermissionChartIdList []int, startSize, pageSize int) (list []*data_manage.MyChartList, total int64, err error) {
+	list, total, err = elastic.SearchMyChartInfoData(utils.MY_CHART_INDEX_NAME, keyword, adminId, noPermissionChartIdList, startSize, pageSize)
+	return
+}

+ 1714 - 0
services/elastic/elastic.go

@@ -0,0 +1,1714 @@
+package elastic
+
+import (
+	"context"
+	"encoding/json"
+	"errors"
+	"fmt"
+	"github.com/olivere/elastic/v7"
+	"hongze/hongze_ETA_mobile_api/models/data_manage"
+	"strconv"
+)
+
+func NewClient() (client *elastic.Client, err error) {
+	client, err = elastic.NewClient(
+		elastic.SetURL(ES_URL),
+		elastic.SetBasicAuth(ES_USERNAME, ES_PASSWORD),
+		elastic.SetSniff(false))
+	return
+}
+
+// indexName:索引名称
+// mappingJson:表结构
+func EsCreateIndex(indexName, mappingJson string) (err error) {
+	client, err := NewClient()
+	if err != nil {
+		return
+	}
+	//定义表结构
+	exists, err := client.IndexExists(indexName).Do(context.Background()) //<5>
+	if err != nil {
+		return
+	}
+	if !exists {
+		resp, err := client.CreateIndex(indexName).BodyJson(mappingJson).Do(context.Background())
+		//BodyJson(bodyJson).Do(context.Background())
+		if err != nil {
+			fmt.Println("CreateIndex Err:" + err.Error())
+			return err
+		}
+		fmt.Println(resp.Index, resp.ShardsAcknowledged, resp.Acknowledged)
+	} else {
+		fmt.Println(indexName + " 已存在")
+	}
+	return
+}
+
+// 新增和修改数据
+//func EsAddOrEditData(item *cygx.CygxArticle) (err error) {
+//	defer func() {
+//		if err != nil {
+//			fmt.Println("EsAddOrEditData Err:", err.Error())
+//		}
+//	}()
+//	indexName := utils.IndexName
+//	content := html.UnescapeString(item.Body)
+//	doc, errDoc := goquery.NewDocumentFromReader(strings.NewReader(content))
+//	if errDoc != nil {
+//		return
+//	}
+//	doc.Find("a").Each(func(i int, a *goquery.Selection) {
+//		a.Remove()
+//	})
+//	bodyText := doc.Text()
+//	client, err := NewClient()
+//	if err != nil {
+//		fmt.Println(err, "err1")
+//		return
+//	}
+//	docId := strconv.Itoa(item.ArticleId)
+//	searchById, err := client.Get().Index(indexName).Id(docId).Do(context.Background())
+//	if err != nil && !strings.Contains(err.Error(), "404") {
+//		fmt.Println("Get Err" + err.Error())
+//		return
+//	}
+//	if err != nil && strings.Contains(err.Error(), "404") {
+//		err = nil
+//	}
+//	if searchById != nil && searchById.Found {
+//		resp, err := client.Update().Index(indexName).Id(docId).Doc(map[string]interface{}{
+//			"BodyText":         bodyText,
+//			"Title":            item.Title,
+//			"PublishDate":      item.PublishDate.Format(utils.FormatDateTime),
+//			"CategoryId":       item.CategoryId,
+//			"ExpertBackground": item.ExpertBackground,
+//		}).Do(context.Background())
+//		if err != nil {
+//			fmt.Println(err, "err")
+//			return err
+//		}
+//		if resp.Status == 0 {
+//			fmt.Println("修改成功")
+//		} else {
+//			fmt.Println("EditData", resp.Status, resp.Result)
+//		}
+//	} else {
+//		itemEs := new(cygx.ElasticTestArticleDetail)
+//		itemEs.ArticleId = item.ArticleId
+//		itemEs.Title = item.Title
+//		itemEs.PublishDate = item.PublishDate.Format(utils.FormatDateTime)
+//		itemEs.BodyText = bodyText
+//		itemEs.CategoryId = strconv.Itoa(item.CategoryId)
+//		itemEs.ExpertBackground = item.ExpertBackground
+//		resp, err := client.Index().Index(indexName).Id(docId).BodyJson(itemEs).Do(context.Background())
+//		if err != nil {
+//			fmt.Println("新增失败:", err.Error())
+//			return err
+//		}
+//		if resp.Status == 0 && resp.Result == "created" {
+//			fmt.Println("新增成功")
+//			err = nil
+//		} else {
+//			fmt.Println("AddData", resp.Status, resp.Result)
+//		}
+//	}
+//	return
+//}
+
+// 删除数据
+func EsDeleteData(indexName, docId string) (err error) {
+	client, err := NewClient()
+	if err != nil {
+		return
+	}
+	resp, err := client.Delete().Index(indexName).Id(docId).Do(context.Background())
+	fmt.Println(resp)
+	if err != nil {
+		return
+	}
+	if resp.Status == 0 {
+		fmt.Println("删除成功")
+	} else {
+		fmt.Println("AddData", resp.Status, resp.Result)
+	}
+	return
+}
+
+func MappingModify(indexName, mappingJson string) {
+	client, err := NewClient()
+	if err != nil {
+		return
+	}
+	result, err := client.PutMapping().Index(indexName).BodyString(mappingJson).Do(context.Background())
+	fmt.Println(err)
+	fmt.Println(result)
+	return
+}
+
+// EsAddOrEditEdbInfoData 新增/修改es中的指标数据
+func EsAddOrEditEdbInfoData(indexName, docId string, item *data_manage.EdbInfoList) (err error) {
+	defer func() {
+		if err != nil {
+			fmt.Println("EsAddOrEditData Err:", err.Error())
+		}
+	}()
+	client, err := NewClient()
+	if err != nil {
+		return
+	}
+
+	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
+}
+
+// SearchEdbInfoData 查询es中的指标数据
+func SearchEdbInfoData(indexName, keywordStr string, from, size, filterSource, source int, edbInfoType uint8, frequency string, noPermissionEdbInfoIdList []int) (total int64, list []*data_manage.EdbInfoList, err error) {
+	list = make([]*data_manage.EdbInfoList, 0)
+	defer func() {
+		if err != nil {
+			fmt.Println("EsAddOrEditData Err:", err.Error())
+		}
+	}()
+
+	highlight := elastic.NewHighlight()
+	highlight = highlight.Fields(elastic.NewHighlighterField("EdbCode"), elastic.NewHighlighterField("EdbName"))
+	highlight = highlight.PreTags("<font color='red'>").PostTags("</font>")
+
+	//var source map[string]interface{}
+	//source := map[string]interface{}{
+	//	"query": map[string]interface{}{
+	//		"match_all": map[string]interface{}{},
+	//	},
+	//}
+	mustMap := make([]interface{}, 0)
+	mustNotMap := make([]interface{}, 0)
+
+	//source := map[string]interface{}{
+	//	"query": map[string]interface{}{
+	//		"bool": map[string]interface{}{
+	//			"must": map[string]interface{}{
+	//				"query_string": map[string]interface{}{
+	//					"query":  keywordStr,
+	//					"fields": []string{"EdbCode", "EdbName"},
+	//				},
+	//			},
+	//		},
+	//	},
+	//}
+
+	switch filterSource {
+	case 2:
+		//source = map[string]interface{}{
+		//	"query": map[string]interface{}{
+		//		"bool": map[string]interface{}{
+		//			"must": map[string]interface{}{
+		//				"query_string": map[string]interface{}{
+		//					"query": keywordStr,
+		//				},
+		//			},
+		//			"filter": []interface{}{
+		//				map[string]interface{}{
+		//					"term": map[string]interface{}{
+		//						"Frequency.keyword": "月度",
+		//					},
+		//				}},
+		//		},
+		//	},
+		//}
+		mustMap = []interface{}{
+			map[string]interface{}{
+				"term": map[string]interface{}{
+					"Frequency.keyword": "月度",
+					//"Frequency.keyword": "月度",
+				},
+			},
+		}
+	case 3:
+		//source = map[string]interface{}{
+		//	"query": map[string]interface{}{
+		//		"bool": map[string]interface{}{
+		//			"must": map[string]interface{}{
+		//				"query_string": map[string]interface{}{
+		//					"query": keywordStr,
+		//				},
+		//			},
+		//			"must_not": []interface{}{
+		//				map[string]interface{}{
+		//					"match": map[string]interface{}{
+		//						"Frequency.keyword": "日度",
+		//					},
+		//				}},
+		//		},
+		//	},
+		//}
+
+		////注释掉,所有频度都可以变频 2022-08-31 14:31:28
+		//mustNotMap = []interface{}{
+		//	map[string]interface{}{
+		//		"match": map[string]interface{}{
+		//			"Frequency.keyword": "日度",
+		//			//"Frequency.keyword": "月度",
+		//		},
+		//	},
+		//}
+	case 4:
+		//source = map[string]interface{}{
+		//	"query": map[string]interface{}{
+		//		"bool": map[string]interface{}{
+		//			"must": map[string]interface{}{
+		//				"query_string": map[string]interface{}{
+		//					"query": keywordStr,
+		//				},
+		//			},
+		//			"filter": []interface{}{
+		//				map[string]interface{}{
+		//					"term": map[string]interface{}{
+		//						"EdbType": 1,
+		//					},
+		//				}},
+		//		},
+		//	},
+		//}
+		mustMap = []interface{}{
+			map[string]interface{}{
+				"term": map[string]interface{}{
+					"EdbType": 1,
+				},
+			},
+		}
+	case 5:
+		mustMap = []interface{}{
+			map[string]interface{}{
+				"term": map[string]interface{}{
+					"Source": 6,
+				},
+			},
+		}
+	}
+
+	//指标来源
+	if source > 0 {
+		mustMap = append(mustMap, map[string]interface{}{
+			"term": map[string]interface{}{
+				"Source": source,
+				//"Frequency.keyword": "月度",
+			},
+		})
+	}
+
+	if frequency != "" {
+		mustMap = append(mustMap, map[string]interface{}{
+			"term": map[string]interface{}{
+				"Frequency.keyword": frequency,
+				//"Frequency.keyword": "月度",
+			},
+		})
+	}
+
+	// noPermissionEdbInfoIdList 无权限指标id
+	if len(noPermissionEdbInfoIdList) > 0 {
+		mustNotMap = append(mustNotMap, map[string]interface{}{
+			"terms": map[string]interface{}{
+				"EdbInfoId": noPermissionEdbInfoIdList,
+				//"Frequency.keyword": "月度",
+			},
+		})
+	}
+
+	// 指标类型:普通指标、预算指标
+	mustMap = append(mustMap, map[string]interface{}{
+		"term": map[string]interface{}{
+			"EdbInfoType": edbInfoType,
+		},
+	})
+
+	//普通指标
+	//mustMap = append(mustMap, map[string]interface{}{
+	//	"term": map[string]interface{}{
+	//		"EdbInfoType": 0,
+	//		//"Frequency.keyword": "月度",
+	//	},
+	//})
+
+	//关键字匹配
+	shouldMap := map[string]interface{}{
+		"should": []interface{}{
+			map[string]interface{}{
+				"match": map[string]interface{}{
+					"EdbCode": keywordStr,
+					//"Frequency.keyword": "月度",
+				},
+			},
+			map[string]interface{}{
+				"match": map[string]interface{}{
+					"EdbName": keywordStr,
+					//"Frequency.keyword": "月度",
+				},
+			},
+			map[string]interface{}{
+				"match": map[string]interface{}{
+					"EdbNameEn": keywordStr,
+					//"Frequency.keyword": "月度",
+				},
+			},
+		},
+	}
+	mustMap = append(mustMap, map[string]interface{}{
+		"bool": shouldMap,
+	})
+
+	return searchEdbInfoData(indexName, mustMap, mustNotMap, shouldMap, from, size)
+}
+
+func SearchEdbInfoDataBak(indexName, keywordStr string, from, size, filterSource, source int, frequency string) (total int64, list []*data_manage.EdbInfoList, err error) {
+	list = make([]*data_manage.EdbInfoList, 0)
+	defer func() {
+		if err != nil {
+			fmt.Println("EsAddOrEditData Err:", err.Error())
+		}
+	}()
+	client, err := NewClient()
+	if err != nil {
+		return
+	}
+
+	//queryString := elastic.NewQueryStringQuery(keywordStr)
+	//boolQueryJson, err := json.Marshal(queryString)
+	//if err != nil {
+	//	fmt.Println("boolQueryJson err:", err)
+	//} else {
+	//	fmt.Println("boolQueryJson ", string(boolQueryJson))
+	//}
+
+	highlight := elastic.NewHighlight()
+	highlight = highlight.Fields(elastic.NewHighlighterField("EdbCode"), elastic.NewHighlighterField("EdbName"))
+	highlight = highlight.PreTags("<font color='red'>").PostTags("</font>")
+
+	//query := elastic.RawStringQuery(`{"match_all":{}}`)
+
+	//var source map[string]interface{}
+	//source := map[string]interface{}{
+	//	"query": map[string]interface{}{
+	//		"match_all": map[string]interface{}{},
+	//	},
+	//}
+	mustMap := make([]interface{}, 0)
+	mustNotMap := make([]interface{}, 0)
+
+	//source := map[string]interface{}{
+	//	"query": map[string]interface{}{
+	//		"bool": map[string]interface{}{
+	//			"must": map[string]interface{}{
+	//				"query_string": map[string]interface{}{
+	//					"query":  keywordStr,
+	//					"fields": []string{"EdbCode", "EdbName"},
+	//				},
+	//			},
+	//		},
+	//	},
+	//}
+
+	switch filterSource {
+	case 2:
+		//source = map[string]interface{}{
+		//	"query": map[string]interface{}{
+		//		"bool": map[string]interface{}{
+		//			"must": map[string]interface{}{
+		//				"query_string": map[string]interface{}{
+		//					"query": keywordStr,
+		//				},
+		//			},
+		//			"filter": []interface{}{
+		//				map[string]interface{}{
+		//					"term": map[string]interface{}{
+		//						"Frequency.keyword": "月度",
+		//					},
+		//				}},
+		//		},
+		//	},
+		//}
+		mustMap = []interface{}{
+			map[string]interface{}{
+				"term": map[string]interface{}{
+					"Frequency.keyword": "月度",
+					//"Frequency.keyword": "月度",
+				},
+			},
+		}
+	case 3:
+		//source = map[string]interface{}{
+		//	"query": map[string]interface{}{
+		//		"bool": map[string]interface{}{
+		//			"must": map[string]interface{}{
+		//				"query_string": map[string]interface{}{
+		//					"query": keywordStr,
+		//				},
+		//			},
+		//			"must_not": []interface{}{
+		//				map[string]interface{}{
+		//					"match": map[string]interface{}{
+		//						"Frequency.keyword": "日度",
+		//					},
+		//				}},
+		//		},
+		//	},
+		//}
+
+		////注释掉,所有频度都可以变频 2022-08-31 14:31:28
+		//mustNotMap = []interface{}{
+		//	map[string]interface{}{
+		//		"match": map[string]interface{}{
+		//			"Frequency.keyword": "日度",
+		//			//"Frequency.keyword": "月度",
+		//		},
+		//	},
+		//}
+	case 4:
+		//source = map[string]interface{}{
+		//	"query": map[string]interface{}{
+		//		"bool": map[string]interface{}{
+		//			"must": map[string]interface{}{
+		//				"query_string": map[string]interface{}{
+		//					"query": keywordStr,
+		//				},
+		//			},
+		//			"filter": []interface{}{
+		//				map[string]interface{}{
+		//					"term": map[string]interface{}{
+		//						"EdbType": 1,
+		//					},
+		//				}},
+		//		},
+		//	},
+		//}
+		mustMap = []interface{}{
+			map[string]interface{}{
+				"term": map[string]interface{}{
+					"EdbType": 1,
+				},
+			},
+		}
+	case 5:
+		mustMap = []interface{}{
+			map[string]interface{}{
+				"term": map[string]interface{}{
+					"Source": 6,
+				},
+			},
+		}
+	}
+
+	//指标来源
+	if source > 0 {
+		mustMap = append(mustMap, map[string]interface{}{
+			"term": map[string]interface{}{
+				"Source": source,
+				//"Frequency.keyword": "月度",
+			},
+		})
+	}
+
+	if frequency != "" {
+		mustMap = append(mustMap, map[string]interface{}{
+			"term": map[string]interface{}{
+				"Frequency.keyword": frequency,
+				//"Frequency.keyword": "月度",
+			},
+		})
+	}
+
+	//普通指标
+	//mustMap = append(mustMap, map[string]interface{}{
+	//	"term": map[string]interface{}{
+	//		"EdbInfoType": 0,
+	//		//"Frequency.keyword": "月度",
+	//	},
+	//})
+
+	//关键字匹配
+	shouldMap := map[string]interface{}{
+		"should": []interface{}{
+			map[string]interface{}{
+				"match": map[string]interface{}{
+					"EdbCode": keywordStr,
+					//"Frequency.keyword": "月度",
+				},
+			},
+			map[string]interface{}{
+				"match": map[string]interface{}{
+					"EdbName": keywordStr,
+					//"Frequency.keyword": "月度",
+				},
+			},
+
+			// 因为关键词被分了,所以需要用下面的语句来让他 整个词 查询,从而加重整词的权重
+			map[string]interface{}{
+				"match": map[string]interface{}{
+					"EdbCode": map[string]interface{}{
+						"query":    keywordStr,
+						"operator": "and",
+					},
+					//"Frequency.keyword": "月度",
+				},
+			},
+
+			// 因为关键词被分了,所以需要用下面的语句来让他 整个词 查询,从而加重整词的权重
+			map[string]interface{}{
+				"match": map[string]interface{}{
+					"EdbName": map[string]interface{}{
+						"query":    keywordStr,
+						"operator": "and",
+					},
+					//"Frequency.keyword": "月度",
+				},
+			},
+		},
+	}
+	mustMap = append(mustMap, map[string]interface{}{
+		"bool": shouldMap,
+	})
+
+	queryMap := map[string]interface{}{
+		"query": map[string]interface{}{
+			"bool": map[string]interface{}{
+				"must":     mustMap,
+				"must_not": mustNotMap,
+				//"should":   shouldMap,
+			},
+		},
+	}
+
+	//根据条件数量统计
+	requestTotalHits := client.Count(indexName).BodyJson(queryMap)
+	total, err = requestTotalHits.Do(context.Background())
+	if err != nil {
+		return
+	}
+
+	queryMap["from"] = from
+	queryMap["size"] = size
+	jsonBytes, _ := json.Marshal(queryMap)
+	fmt.Println(string(jsonBytes))
+
+	//queryStr := fmt.Sprintf(`{"query":{"bool":{"must":{"query_string":{"query":"%s","fields":["EdbCode","EdbName"]}}}}}`, keywordStr)
+	//switch filterSource {
+	//case 2:
+	//	queryStr = fmt.Sprintf(`{"query":{"bool":{"must":{"query_string":{"query":"%s","fields":["EdbCode","EdbName"]}},"filter":{"term":{"Frequency.keyword":"%s"}}}}}`, keywordStr, "月度")
+	//case 3:
+	//	queryStr = fmt.Sprintf(`{"query":{"bool":{"must":{"query_string":{"query":"%s","fields":["EdbCode","EdbName"]}},"must_not":[{"match":{"Frequency.keyword":"%s"}}]}}}`, keywordStr, "日度")
+	//case 4:
+	//	queryStr = fmt.Sprintf(`{"query":{"bool":{"must":{"query_string":{"query":"%s","fields":["EdbCode","EdbName"]}},"must_not":[{"match":{"EdbType":1}}]}}}`, keywordStr)
+	//}
+	//queryString := elastic.RawStringQuery(queryStr)
+	//fmt.Println("queryString:", queryString)
+
+	//queryString := elastic.NewMatchQuery("EdbCode", keywordStr)
+	//request := client.Search(indexName).Highlight(highlight).From(from).Size(size).Query(queryString)
+
+	request := client.Search(indexName).Highlight(highlight).Source(queryMap) // sets the JSON request
+
+	//requestJson, err := json.Marshal(request)
+	//if err != nil {
+	//	fmt.Println("requestJson err:", err)
+	//}
+	//fmt.Println("requestJson ", string(requestJson))
+	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
+				}
+				edbInfoItem := new(data_manage.EdbInfoList)
+				tmpErr = json.Unmarshal(itemJson, &edbInfoItem)
+				if err != nil {
+					fmt.Println("json.Unmarshal movieJson err:", err)
+					err = tmpErr
+					return
+				}
+				if len(v.Highlight["EdbCode"]) > 0 {
+					edbInfoItem.EdbCode = v.Highlight["EdbCode"][0]
+				}
+				if len(v.Highlight["EdbName"]) > 0 {
+					edbInfoItem.EdbCode = v.Highlight["EdbName"][0]
+				}
+				list = append(list, edbInfoItem)
+				searchMap[v.Id] = v.Id
+			}
+		}
+	}
+
+	//for _, v := range result {
+	//	fmt.Println(v)
+	//}
+	return
+}
+
+// SearchAddPredictEdbInfoData 查询允许添加预测指标的数据
+func SearchAddPredictEdbInfoData(indexName, keywordStr string, noPermissionEdbInfoIdList []int, from, size int) (total int64, list []*data_manage.EdbInfoList, err error) {
+	list = make([]*data_manage.EdbInfoList, 0)
+	defer func() {
+		if err != nil {
+			fmt.Println("EsAddOrEditData Err:", err.Error())
+		}
+	}()
+
+	highlight := elastic.NewHighlight()
+	highlight = highlight.Fields(elastic.NewHighlighterField("EdbCode"), elastic.NewHighlighterField("EdbName"))
+	highlight = highlight.PreTags("<font color='red'>").PostTags("</font>")
+
+	mustMap := make([]interface{}, 0)
+	mustNotMap := make([]interface{}, 0)
+
+	mustNotMap = []interface{}{
+		//map[string]interface{}{
+		//	"terms": map[string]interface{}{
+		//		"Frequency.keyword": []string{"日度", "周度", "月度"},
+		//	},
+		//	//"match": map[string]interface{}{
+		//	//	"Frequency": []string{"日度", "周度", "月度"},
+		//	//	//"Frequency.keyword": []string{"日度", "周度", "月度"},
+		//	//},
+		//},
+	}
+
+	// 指标类型:普通指标、预算指标
+	mustMap = append(mustMap, map[string]interface{}{
+		"term": map[string]interface{}{
+			"EdbInfoType": 0,
+		},
+	})
+	mustMap = append(mustMap, map[string]interface{}{
+		"terms": map[string]interface{}{
+			"Frequency.keyword": []string{"日度", "周度", "月度"},
+		},
+	})
+
+	//关键字匹配
+	shouldMap := map[string]interface{}{
+		"should": []interface{}{
+			map[string]interface{}{
+				"match": map[string]interface{}{
+					"EdbCode": keywordStr,
+					//"Frequency.keyword": "月度",
+				},
+			},
+			map[string]interface{}{
+				"match": map[string]interface{}{
+					"EdbName": keywordStr,
+					//"Frequency.keyword": "月度",
+				},
+			},
+		},
+	}
+
+	// noPermissionEdbInfoIdList 无权限指标id
+	if len(noPermissionEdbInfoIdList) > 0 {
+		mustNotMap = append(mustNotMap, map[string]interface{}{
+			"terms": map[string]interface{}{
+				"EdbInfoId": noPermissionEdbInfoIdList,
+				//"Frequency.keyword": "月度",
+			},
+		})
+	}
+	return searchEdbInfoData(indexName, mustMap, mustNotMap, shouldMap, from, size)
+}
+
+// searchEdbInfoData 查询es中的指标数据
+func searchEdbInfoData(indexName string, mustMap, mustNotMap []interface{}, shouldMap map[string]interface{}, from, size int) (total int64, list []*data_manage.EdbInfoList, err error) {
+	list = make([]*data_manage.EdbInfoList, 0)
+	defer func() {
+		if err != nil {
+			fmt.Println("EsAddOrEditData Err:", err.Error())
+		}
+	}()
+	client, err := NewClient()
+	if err != nil {
+		return
+	}
+
+	//queryString := elastic.NewQueryStringQuery(keywordStr)
+	//boolQueryJson, err := json.Marshal(queryString)
+	//if err != nil {
+	//	fmt.Println("boolQueryJson err:", err)
+	//} else {
+	//	fmt.Println("boolQueryJson ", string(boolQueryJson))
+	//}
+
+	highlight := elastic.NewHighlight()
+	highlight = highlight.Fields(elastic.NewHighlighterField("EdbCode"), elastic.NewHighlighterField("EdbName"))
+	highlight = highlight.PreTags("<font color='red'>").PostTags("</font>")
+
+	//query := elastic.RawStringQuery(`{"match_all":{}}`)
+
+	//关键字匹配
+	mustMap = append(mustMap, map[string]interface{}{
+		"bool": shouldMap,
+	})
+
+	queryMap := map[string]interface{}{
+		"query": map[string]interface{}{
+			"bool": map[string]interface{}{
+				"must":     mustMap,
+				"must_not": mustNotMap,
+				//"should":   shouldMap,
+			},
+		},
+	}
+
+	//根据条件数量统计
+	requestTotalHits := client.Count(indexName).BodyJson(queryMap)
+	total, err = requestTotalHits.Do(context.Background())
+	if err != nil {
+		return
+	}
+
+	queryMap["from"] = from
+	queryMap["size"] = size
+	jsonBytes, _ := json.Marshal(queryMap)
+	fmt.Println(string(jsonBytes))
+
+	//queryStr := fmt.Sprintf(`{"query":{"bool":{"must":{"query_string":{"query":"%s","fields":["EdbCode","EdbName"]}}}}}`, keywordStr)
+	//switch filterSource {
+	//case 2:
+	//	queryStr = fmt.Sprintf(`{"query":{"bool":{"must":{"query_string":{"query":"%s","fields":["EdbCode","EdbName"]}},"filter":{"term":{"Frequency.keyword":"%s"}}}}}`, keywordStr, "月度")
+	//case 3:
+	//	queryStr = fmt.Sprintf(`{"query":{"bool":{"must":{"query_string":{"query":"%s","fields":["EdbCode","EdbName"]}},"must_not":[{"match":{"Frequency.keyword":"%s"}}]}}}`, keywordStr, "日度")
+	//case 4:
+	//	queryStr = fmt.Sprintf(`{"query":{"bool":{"must":{"query_string":{"query":"%s","fields":["EdbCode","EdbName"]}},"must_not":[{"match":{"EdbType":1}}]}}}`, keywordStr)
+	//}
+	//queryString := elastic.RawStringQuery(queryStr)
+	//fmt.Println("queryString:", queryString)
+
+	//queryString := elastic.NewMatchQuery("EdbCode", keywordStr)
+	//request := client.Search(indexName).Highlight(highlight).From(from).Size(size).Query(queryString)
+
+	request := client.Search(indexName).Highlight(highlight).Source(queryMap) // sets the JSON request
+
+	//requestJson, err := json.Marshal(request)
+	//if err != nil {
+	//	fmt.Println("requestJson err:", err)
+	//}
+	//fmt.Println("requestJson ", string(requestJson))
+	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
+	}
+	//total = searchResp.TotalHits()
+	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
+				}
+				edbInfoItem := new(data_manage.EdbInfoList)
+				tmpErr = json.Unmarshal(itemJson, &edbInfoItem)
+				if err != nil {
+					fmt.Println("json.Unmarshal movieJson err:", err)
+					err = tmpErr
+					return
+				}
+				if len(v.Highlight["EdbCode"]) > 0 {
+					edbInfoItem.EdbCode = v.Highlight["EdbCode"][0]
+				}
+				if len(v.Highlight["EdbName"]) > 0 {
+					edbInfoItem.EdbCode = v.Highlight["EdbName"][0]
+				}
+				list = append(list, edbInfoItem)
+				searchMap[v.Id] = v.Id
+			}
+		}
+	}
+
+	return
+}
+
+// EsDeleteEdbInfoData 删除es中的指标数据
+func EsDeleteEdbInfoData(indexName, docId string) (err error) {
+	defer func() {
+		if err != nil {
+			fmt.Println("EsDeleteEdbInfoData Err:", err.Error())
+		}
+	}()
+	client, err := NewClient()
+	if err != nil {
+		return
+	}
+
+	resp, err := client.Delete().Index(indexName).Id(docId).Do(context.Background())
+	fmt.Println(resp)
+	if err != nil {
+		return
+	}
+	if resp.Status == 0 {
+		fmt.Println("删除成功")
+	} else {
+		fmt.Println("AddData", resp.Status, resp.Result)
+	}
+	return
+}
+
+// EsAddOrEditReport 新增编辑es报告
+//func EsAddOrEditReport(indexName, docId string, item *models.ElasticReportDetail) (err error) {
+//	defer func() {
+//		if err != nil {
+//			fmt.Println("EsAddOrEditReport Err:", err.Error())
+//		}
+//	}()
+//	client, err := NewClient()
+//	if err != nil {
+//		return
+//	}
+//	// docId为报告ID+章节ID
+//	searchById, err := client.Get().Index(indexName).Id(docId).Do(context.Background())
+//	if err != nil && !strings.Contains(err.Error(), "404") {
+//		fmt.Println("Get Err" + err.Error())
+//		return
+//	}
+//	if searchById != nil && searchById.Found {
+//		resp, err := client.Update().Index(indexName).Id(docId).Doc(map[string]interface{}{
+//			"ReportId":           item.ReportId,
+//			"ReportChapterId":    item.ReportChapterId,
+//			"Title":              item.Title,
+//			"Abstract":           item.Abstract,
+//			"BodyContent":        item.BodyContent,
+//			"PublishTime":        item.PublishTime,
+//			"PublishState":       item.PublishState,
+//			"Author":             item.Author,
+//			"ClassifyIdFirst":    item.ClassifyIdFirst,
+//			"ClassifyNameFirst":  item.ClassifyNameFirst,
+//			"ClassifyIdSecond":   item.ClassifyIdSecond,
+//			"ClassifyNameSecond": item.ClassifyNameSecond,
+//			"Categories":         item.Categories,
+//			"StageStr":           item.StageStr,
+//		}).Do(context.Background())
+//		if err != nil {
+//			return err
+//		}
+//		//fmt.Println(resp.Status, resp.Result)
+//		if resp.Status == 0 {
+//			fmt.Println("修改成功" + docId)
+//			err = nil
+//		} else {
+//			fmt.Println("EditData", resp.Status, resp.Result)
+//		}
+//	} else {
+//		resp, err := client.Index().Index(indexName).Id(docId).BodyJson(item).Do(context.Background())
+//		if err != nil {
+//			fmt.Println("新增失败:", err.Error())
+//			return err
+//		}
+//		if resp.Status == 0 && resp.Result == "created" {
+//			fmt.Println("新增成功" + docId)
+//			return nil
+//		} else {
+//			fmt.Println("AddData", resp.Status, resp.Result)
+//		}
+//	}
+//	return
+//}
+
+// AnalyzeResp 分词接口返回结构体
+type AnalyzeResp struct {
+	Tokens []struct {
+		EndOffset   int64  `json:"end_offset"`
+		Position    int64  `json:"position"`
+		StartOffset int64  `json:"start_offset"`
+		Token       string `json:"token"`
+		Type        string `json:"type"`
+	} `json:"tokens"`
+}
+
+// Analyze 根据输入的文字获取分词后的文字
+func Analyze(content string) (contentList []string, err error) {
+	defer func() {
+		if err != nil {
+			fmt.Println("Analyze Err:", err.Error())
+		}
+	}()
+	client, err := NewClient()
+	if err != nil {
+		return
+	}
+	queryMap := map[string]string{
+		"text":     content,
+		"analyzer": "ik_max_word",
+	}
+	res, err := client.PerformRequest(
+		context.Background(),
+		elastic.PerformRequestOptions{
+			Method: "GET",
+			Path:   "/_analyze",
+			Body:   queryMap,
+			Stream: false,
+		},
+	)
+	if res.StatusCode == 200 {
+		var analyzeResp AnalyzeResp
+		tmpErr := json.Unmarshal(res.Body, &analyzeResp)
+		if tmpErr != nil {
+			err = errors.New("返回数据转结构体失败:" + tmpErr.Error())
+			return
+		}
+		for _, v := range analyzeResp.Tokens {
+			contentList = append(contentList, v.Token)
+		}
+	} else {
+		err = errors.New("分词失败,返回code异常:" + strconv.Itoa(res.StatusCode))
+	}
+	return
+}
+
+// SearcCygxArticleHistoryData 查询查研观向的文章阅读记录
+//func SearcCygxArticleHistoryData(indexName, keyword, startDate, endDate, companyIds string, from, size int) (total int64, list []*cygx.EsUserInteraction, err error) {
+//	list = make([]*cygx.EsUserInteraction, 0)
+//	defer func() {
+//		if err != nil {
+//			fmt.Println("EsUserInteraction Err:", err.Error())
+//		}
+//	}()
+//	client, err := NewClient()
+//	if err != nil {
+//		return
+//	}
+//
+//	mustMap := make([]interface{}, 0)
+//	seliceid := []int{}
+//	//管理员权限||对应销售
+//	if companyIds != "" {
+//		silceCompanyId := strings.Split(companyIds, ",")
+//		for _, v := range silceCompanyId {
+//			companyId, _ := strconv.Atoi(v)
+//			seliceid = append(seliceid, companyId)
+//		}
+//		mustMap = append(mustMap, map[string]interface{}{
+//			"terms": map[string]interface{}{
+//				"CompanyId": seliceid,
+//			},
+//		})
+//	}
+//
+//	//时间
+//	if startDate != "" && endDate != "" {
+//		mustMap = append(mustMap, map[string]interface{}{
+//			"range": map[string]interface{}{
+//				"CreateTime": map[string]interface{}{
+//					"gte": startDate,
+//					"lte": endDate,
+//				},
+//			},
+//		})
+//	}
+//	shouldMap := make(map[string]interface{}, 0)
+//	//关键字匹配
+//	if keyword != "" {
+//		shouldMap = map[string]interface{}{
+//			"should": []interface{}{
+//				map[string]interface{}{
+//					"wildcard": map[string]interface{}{
+//						"RealName": "*" + keyword + "*",
+//					},
+//				},
+//				map[string]interface{}{
+//					"wildcard": map[string]interface{}{
+//						"Email": "*" + keyword + "*",
+//					},
+//				},
+//				map[string]interface{}{
+//					"wildcard": map[string]interface{}{
+//						"Mobile": "*" + keyword + "*",
+//					},
+//				},
+//				map[string]interface{}{
+//					"wildcard": map[string]interface{}{
+//						"CompanyName": "*" + keyword + "*",
+//					},
+//				},
+//			},
+//		}
+//	}
+//	mustMap = append(mustMap, map[string]interface{}{
+//		"bool": shouldMap,
+//	})
+//
+//	queryMap := map[string]interface{}{
+//		"query": map[string]interface{}{
+//			"bool": map[string]interface{}{
+//				"must": mustMap,
+//			},
+//		},
+//	}
+//	//排序
+//	//机构阅读数量
+//	sortMap := make([]interface{}, 0)
+//	//如果是一家公司就不按照这个字段排序
+//	if len(seliceid) > 1 {
+//		sortMap = append(sortMap, map[string]interface{}{
+//			"CompanyArticleHistoryNum": map[string]interface{}{
+//				"order": "desc",
+//			},
+//		})
+//	}
+//
+//	//用户阅读数量
+//	sortMap = append(sortMap, map[string]interface{}{
+//		"UserArticleHistoryNum": map[string]interface{}{
+//			"order": "desc",
+//		},
+//	})
+//	//时间
+//	sortMap = append(sortMap, map[string]interface{}{
+//		"CreateTime": map[string]interface{}{
+//			"order": "desc",
+//		},
+//	})
+//	//根据条件数量统计
+//	requestTotalHits := client.Count(indexName).BodyJson(queryMap)
+//	total, err = requestTotalHits.Do(context.Background())
+//	if err != nil {
+//		return
+//	}
+//
+//	queryMap["sort"] = sortMap
+//	queryMap["from"] = from
+//	queryMap["size"] = size
+//	jsonBytes, _ := json.Marshal(queryMap)
+//	fmt.Println(string(jsonBytes))
+//
+//	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
+//				}
+//				edbInfoItem := new(cygx.EsUserInteraction)
+//				tmpErr = json.Unmarshal(itemJson, &edbInfoItem)
+//				if tmpErr != nil {
+//					fmt.Println("json.Unmarshal movieJson err:", err)
+//					err = tmpErr
+//					return
+//				}
+//				list = append(list, edbInfoItem)
+//				searchMap[v.Id] = v.Id
+//			}
+//		}
+//	}
+//	return
+//}
+
+// EsAddOrEditChartInfoData 新增/修改es中的图表数据
+func EsAddOrEditChartInfoData(indexName, docId string, item *data_manage.ChartInfo) (err error) {
+	defer func() {
+		if err != nil {
+			fmt.Println("EsAddOrEditData Err:", err.Error())
+		}
+	}()
+	client, err := NewClient()
+	if err != nil {
+		return
+	}
+
+	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
+}
+
+// EsDeleteDataV2 删除es中的数据
+func EsDeleteDataV2(indexName, docId string) (err error) {
+	defer func() {
+		if err != nil {
+			fmt.Println("EsDeleteEdbInfoData Err:", err.Error())
+		}
+	}()
+	client, err := NewClient()
+	if err != nil {
+		return
+	}
+
+	resp, err := client.Delete().Index(indexName).Id(docId).Do(context.Background())
+	fmt.Println(resp)
+	if err != nil {
+		return
+	}
+	if resp.Status == 0 {
+		fmt.Println("删除成功")
+	} else {
+		fmt.Println("AddData", resp.Status, resp.Result)
+	}
+	return
+}
+
+// SearchChartInfoData 查询es中的图表数据
+func SearchChartInfoData(indexName, keywordStr string, showSysId int, sourceList []int, noPermissionChartIdList []int, from, size int) (list []*data_manage.ChartInfo, total int64, err error) {
+	list = make([]*data_manage.ChartInfo, 0)
+	defer func() {
+		if err != nil {
+			fmt.Println("EsAddOrEditData Err:", err.Error())
+		}
+	}()
+	client, err := NewClient()
+	if err != nil {
+		return
+	}
+
+	//queryString := elastic.NewQueryStringQuery(keywordStr)
+	//boolQueryJson, err := json.Marshal(queryString)
+	//if err != nil {
+	//	fmt.Println("boolQueryJson err:", err)
+	//} else {
+	//	fmt.Println("boolQueryJson ", string(boolQueryJson))
+	//}
+
+	highlight := elastic.NewHighlight()
+	highlight = highlight.Fields(elastic.NewHighlighterField("ChartName"))
+	highlight = highlight.PreTags("<font color='red'>").PostTags("</font>")
+
+	mustMap := make([]interface{}, 0)
+	mustNotMap := make([]interface{}, 0)
+
+	//指标来源
+	if showSysId > 0 {
+		mustMap = append(mustMap, map[string]interface{}{
+			"term": map[string]interface{}{
+				"SysUserId": showSysId,
+				//"Frequency.keyword": "月度",
+			},
+		})
+	}
+	mustMap = append(mustMap, map[string]interface{}{
+		"terms": map[string]interface{}{
+			"Source": sourceList,
+		},
+	})
+
+	//关键字匹配
+	shouldMap := map[string]interface{}{
+		"should": []interface{}{
+			map[string]interface{}{
+				"match": map[string]interface{}{
+					"ChartName": keywordStr,
+					//"Frequency.keyword": "月度",
+				},
+			},
+			// 因为关键词被分了,所以需要用下面的语句来让他 整个词 查询,从而加重整词的权重
+			map[string]interface{}{
+				"match": map[string]interface{}{
+					"ChartName": map[string]interface{}{
+						"query":    keywordStr,
+						"operator": "and",
+					},
+					//"Frequency.keyword": "月度",
+				},
+			},
+		},
+	}
+	mustMap = append(mustMap, map[string]interface{}{
+		"bool": shouldMap,
+	})
+
+	// noPermissionEdbInfoIdList 无权限指标id
+	if len(noPermissionChartIdList) > 0 {
+		mustNotMap = append(mustNotMap, map[string]interface{}{
+			"terms": map[string]interface{}{
+				"ChartInfoId": noPermissionChartIdList,
+				//"Frequency.keyword": "月度",
+			},
+		})
+	}
+
+	queryMap := map[string]interface{}{
+		"query": map[string]interface{}{
+			"bool": map[string]interface{}{
+				"must":     mustMap,
+				"must_not": mustNotMap,
+				//"should":   shouldMap,
+			},
+		},
+	}
+
+	//根据条件数量统计
+	requestTotalHits := client.Count(indexName).BodyJson(queryMap)
+	total, err = requestTotalHits.Do(context.Background())
+	if err != nil {
+		return
+	}
+
+	// 分页查询
+	queryMap["from"] = from
+	queryMap["size"] = size
+	jsonBytes, _ := json.Marshal(queryMap)
+	fmt.Println(string(jsonBytes))
+
+	request := client.Search(indexName).Highlight(highlight).Source(queryMap) // sets the JSON request
+
+	//requestJson, err := json.Marshal(request)
+	//if err != nil {
+	//	fmt.Println("requestJson err:", err)
+	//}
+	//fmt.Println("requestJson ", string(requestJson))
+	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(data_manage.ChartInfo)
+				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
+}
+
+// EsAddOrEditDataInterface 新增/修改es中的数据
+func EsAddOrEditDataInterface(indexName, docId string, item interface{}) (err error) {
+	defer func() {
+		if err != nil {
+			fmt.Println("EsAddOrEditData Err:", err.Error())
+		}
+	}()
+	client, err := NewClient()
+	if err != nil {
+		return
+	}
+
+	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
+}
+
+// SearchMyChartInfoData 查询es中的我的图表数据
+func SearchMyChartInfoData(indexName, keywordStr string, adminId int, noPermissionChartIdList []int, from, size int) (list []*data_manage.MyChartList, total int64, err error) {
+	list = make([]*data_manage.MyChartList, 0)
+	defer func() {
+		if err != nil {
+			fmt.Println("EsAddOrEditData Err:", err.Error())
+		}
+	}()
+	client, err := NewClient()
+	if err != nil {
+		return
+	}
+
+	//queryString := elastic.NewQueryStringQuery(keywordStr)
+	//boolQueryJson, err := json.Marshal(queryString)
+	//if err != nil {
+	//	fmt.Println("boolQueryJson err:", err)
+	//} else {
+	//	fmt.Println("boolQueryJson ", string(boolQueryJson))
+	//}
+
+	highlight := elastic.NewHighlight()
+	highlight = highlight.Fields(elastic.NewHighlighterField("ChartName"))
+	highlight = highlight.PreTags("<font color='red'>").PostTags("</font>")
+
+	mustMap := make([]interface{}, 0)
+	mustNotMap := make([]interface{}, 0)
+
+	//指标来源
+	if adminId > 0 {
+		mustMap = append(mustMap, map[string]interface{}{
+			"term": map[string]interface{}{
+				"AdminId": adminId,
+				//"Frequency.keyword": "月度",
+			},
+		})
+	}
+
+	//关键字匹配
+	shouldMap := map[string]interface{}{
+		"should": []interface{}{
+			map[string]interface{}{
+				"match": map[string]interface{}{
+					"ChartName": keywordStr,
+					//"Frequency.keyword": "月度",
+				},
+			},
+			// 因为关键词被分了,所以需要用下面的语句来让他 整个词 查询,从而加重整词的权重
+			map[string]interface{}{
+				"match": map[string]interface{}{
+					"ChartName": map[string]interface{}{
+						"query":    keywordStr,
+						"operator": "and",
+					},
+					//"Frequency.keyword": "月度",
+				},
+			},
+		},
+	}
+	mustMap = append(mustMap, map[string]interface{}{
+		"bool": shouldMap,
+	})
+
+	// noPermissionEdbInfoIdList 无权限指标id
+	if len(noPermissionChartIdList) > 0 {
+		mustNotMap = append(mustNotMap, map[string]interface{}{
+			"terms": map[string]interface{}{
+				"ChartInfoId": noPermissionChartIdList,
+				//"Frequency.keyword": "月度",
+			},
+		})
+	}
+
+	queryMap := map[string]interface{}{
+		"query": map[string]interface{}{
+			"bool": map[string]interface{}{
+				"must":     mustMap,
+				"must_not": mustNotMap,
+				//"should":   shouldMap,
+			},
+		},
+	}
+
+	//根据条件数量统计
+	requestTotalHits := client.Count(indexName).BodyJson(queryMap)
+	total, err = requestTotalHits.Do(context.Background())
+	if err != nil {
+		return
+	}
+
+	// 分页查询
+	queryMap["from"] = from
+	queryMap["size"] = size
+	jsonBytes, _ := json.Marshal(queryMap)
+	fmt.Println(string(jsonBytes))
+
+	request := client.Search(indexName).Highlight(highlight).Source(queryMap) // sets the JSON request
+
+	//requestJson, err := json.Marshal(request)
+	//if err != nil {
+	//	fmt.Println("requestJson err:", err)
+	//}
+	//fmt.Println("requestJson ", string(requestJson))
+	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(data_manage.MyChartList)
+				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
+}
+
+// SearchEdbInfoDataByAdminId 查询es中的指标数据
+func SearchEdbInfoDataByAdminId(indexName, keywordStr string, from, size, filterSource, source int, edbInfoType uint8, frequency string, adminId int) (total int64, list []*data_manage.EdbInfoList, err error) {
+	list = make([]*data_manage.EdbInfoList, 0)
+	defer func() {
+		if err != nil {
+			fmt.Println("EsAddOrEditData Err:", err.Error())
+		}
+	}()
+
+	highlight := elastic.NewHighlight()
+	highlight = highlight.Fields(elastic.NewHighlighterField("EdbCode"), elastic.NewHighlighterField("EdbName"))
+	highlight = highlight.PreTags("<font color='red'>").PostTags("</font>")
+
+	//var source map[string]interface{}
+	//source := map[string]interface{}{
+	//	"query": map[string]interface{}{
+	//		"match_all": map[string]interface{}{},
+	//	},
+	//}
+	mustMap := make([]interface{}, 0)
+	mustNotMap := make([]interface{}, 0)
+
+	//source := map[string]interface{}{
+	//	"query": map[string]interface{}{
+	//		"bool": map[string]interface{}{
+	//			"must": map[string]interface{}{
+	//				"query_string": map[string]interface{}{
+	//					"query":  keywordStr,
+	//					"fields": []string{"EdbCode", "EdbName"},
+	//				},
+	//			},
+	//		},
+	//	},
+	//}
+
+	switch filterSource {
+	case 2:
+		//source = map[string]interface{}{
+		//	"query": map[string]interface{}{
+		//		"bool": map[string]interface{}{
+		//			"must": map[string]interface{}{
+		//				"query_string": map[string]interface{}{
+		//					"query": keywordStr,
+		//				},
+		//			},
+		//			"filter": []interface{}{
+		//				map[string]interface{}{
+		//					"term": map[string]interface{}{
+		//						"Frequency.keyword": "月度",
+		//					},
+		//				}},
+		//		},
+		//	},
+		//}
+		mustMap = []interface{}{
+			map[string]interface{}{
+				"term": map[string]interface{}{
+					"Frequency.keyword": "月度",
+					//"Frequency.keyword": "月度",
+				},
+			},
+		}
+	case 3:
+		//source = map[string]interface{}{
+		//	"query": map[string]interface{}{
+		//		"bool": map[string]interface{}{
+		//			"must": map[string]interface{}{
+		//				"query_string": map[string]interface{}{
+		//					"query": keywordStr,
+		//				},
+		//			},
+		//			"must_not": []interface{}{
+		//				map[string]interface{}{
+		//					"match": map[string]interface{}{
+		//						"Frequency.keyword": "日度",
+		//					},
+		//				}},
+		//		},
+		//	},
+		//}
+
+		////注释掉,所有频度都可以变频 2022-08-31 14:31:28
+		//mustNotMap = []interface{}{
+		//	map[string]interface{}{
+		//		"match": map[string]interface{}{
+		//			"Frequency.keyword": "日度",
+		//			//"Frequency.keyword": "月度",
+		//		},
+		//	},
+		//}
+	case 4:
+		//source = map[string]interface{}{
+		//	"query": map[string]interface{}{
+		//		"bool": map[string]interface{}{
+		//			"must": map[string]interface{}{
+		//				"query_string": map[string]interface{}{
+		//					"query": keywordStr,
+		//				},
+		//			},
+		//			"filter": []interface{}{
+		//				map[string]interface{}{
+		//					"term": map[string]interface{}{
+		//						"EdbType": 1,
+		//					},
+		//				}},
+		//		},
+		//	},
+		//}
+		mustMap = []interface{}{
+			map[string]interface{}{
+				"term": map[string]interface{}{
+					"EdbType": 1,
+				},
+			},
+		}
+	case 5:
+		mustMap = []interface{}{
+			map[string]interface{}{
+				"term": map[string]interface{}{
+					"Source": 6,
+				},
+			},
+		}
+	}
+
+	//指标来源
+	if source > 0 {
+		mustMap = append(mustMap, map[string]interface{}{
+			"term": map[string]interface{}{
+				"Source": source,
+				//"Frequency.keyword": "月度",
+			},
+		})
+	}
+
+	if frequency != "" {
+		mustMap = append(mustMap, map[string]interface{}{
+			"term": map[string]interface{}{
+				"Frequency.keyword": frequency,
+				//"Frequency.keyword": "月度",
+			},
+		})
+	}
+
+	// 指标类型:普通指标、预算指标
+	mustMap = append(mustMap, map[string]interface{}{
+		"term": map[string]interface{}{
+			"EdbInfoType": edbInfoType,
+		},
+	})
+
+	//普通指标
+	//mustMap = append(mustMap, map[string]interface{}{
+	//	"term": map[string]interface{}{
+	//		"EdbInfoType": 0,
+	//		//"Frequency.keyword": "月度",
+	//	},
+	//})
+
+	//关键字匹配
+	shouldMap := map[string]interface{}{
+		"should": []interface{}{
+			map[string]interface{}{
+				"match": map[string]interface{}{
+					"EdbCode": keywordStr,
+					//"Frequency.keyword": "月度",
+				},
+			},
+			map[string]interface{}{
+				"match": map[string]interface{}{
+					"EdbName": keywordStr,
+					//"Frequency.keyword": "月度",
+				},
+			},
+		},
+	}
+	mustMap = append(mustMap, map[string]interface{}{
+		"bool": shouldMap,
+	})
+
+	//创建人
+	if adminId > 0 {
+		mustMap = append(mustMap, map[string]interface{}{
+			"term": map[string]interface{}{
+				"SysUserId": adminId,
+			},
+		})
+	}
+
+	return searchEdbInfoData(indexName, mustMap, mustNotMap, shouldMap, from, size)
+}

+ 20 - 0
services/elastic/elasticsearch.go

@@ -0,0 +1,20 @@
+package elastic
+
+import (
+	"fmt"
+)
+
+const (
+	ES_URL      = "http://es-cn-nif227b580019rgw6.public.elasticsearch.aliyuncs.com:9200" //<1>
+	ES_USERNAME = "elastic"                                                               //<2>
+	ES_PASSWORD = "hongze@2021"                                                           //<3>
+	//Grafana pwd-> 20521bb9
+	//Grafana username-> emon
+)
+
+type tracelog struct{}
+
+//实现输出
+func (tracelog) Printf(format string, v ...interface{}) {
+	fmt.Printf(format, v...)
+}