Browse Source

Merge branch 'master' into dev/1.5

hsun 1 year ago
parent
commit
57b9c91482

+ 176 - 0
controllers/data_manage/chart_info.go

@@ -3,6 +3,7 @@ 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"
@@ -926,3 +927,178 @@ func (this *ChartInfoController) CopyChartInfo() {
 	}
 	br.IsAddLog = true
 }
+
+// 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 *ChartInfoController) 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_DEFAULT}, noPermissionChartIdList, startSize, pageSize)
+	} else {
+		total, searchList, err = data_manage.ChartInfoSearchByEmptyKeyWord(showSysId, []int{utils.CHART_SOURCE_DEFAULT}, 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
+}
+
+// BatchChartInfoRefresh
+// @Title 批量刷新图表接口
+// @Description 批量刷新图表接口
+// @Param	request	body data_manage.BatchChartRefreshReq true "type json string"
+// @Success Ret=200 刷新成功
+// @router /chart_info/batch_refresh [post]
+func (this *ChartInfoController) BatchChartInfoRefresh() {
+	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.BatchChartRefreshReq
+	err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
+	if err != nil {
+		br.Msg = "参数解析异常!"
+		br.ErrMsg = "参数解析失败,Err:" + err.Error()
+		return
+	}
+
+	//获取所有的图表列表
+	_, chartInfoList, err := data_manage.GetChartInfoListByUniqueCodeSlice(req.ChartInfoCode)
+	if len(chartInfoList) <= 0 {
+		br.Ret = 200
+		br.Success = true
+		br.Msg = "刷新成功"
+		return
+	}
+
+	err = data.BatchChartInfoRefreshV2(chartInfoList)
+	if err != nil {
+		br.Msg = "刷新失败"
+		br.ErrMsg = "刷新图表关联指标信息失败,Err:" + err.Error()
+		return
+	}
+
+	//清除图表缓存
+	for _, v := range chartInfoList {
+		key := utils.HZ_CHART_LIB_DETAIL + v.UniqueCode
+		_ = utils.Rc.Delete(key)
+	}
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "刷新成功"
+}

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

@@ -524,3 +524,134 @@ func (this *CorrelationChartInfoController) Copy() {
 	}
 	br.IsAddLog = true
 }
+
+// SearchByEs
+// @Title 图表模糊搜索(从es获取)
+// @Description  图表模糊搜索(从es获取)
+// @Param   Keyword   query   string  true       "图表名称"
+// @Param   IsShowMe   query   bool  true       "是否只看我的,true、false"
+// @Param   Source   query   int  true       "来源,3:相关性,4:滚动相关性,默认0:全部"
+// @Success 200 {object} data_manage.ChartInfo
+// @router /chart_info/search_by_es [get]
+func (this *CorrelationChartInfoController) SearchByEs() {
+	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
+	}
+
+	source, _ := this.GetInt("Source")
+	sourceList := make([]int, 0)
+	if source <= 0 {
+		sourceList = append(sourceList, utils.CHART_SOURCE_CORRELATION, utils.CHART_SOURCE_ROLLING_CORRELATION)
+	} else {
+		sourceList = append(sourceList, source)
+	}
+
+	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, sourceList, noPermissionChartIdList, startSize, pageSize)
+	} else {
+		total, searchList, err = data_manage.ChartInfoSearchByEmptyKeyWord(showSysId, sourceList, 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
+}

+ 95 - 2
controllers/data_manage/excel_info.go

@@ -1,6 +1,7 @@
 package data_manage
 
 import (
+	"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"
@@ -14,7 +15,101 @@ type ExcelInfoController struct {
 	controllers.BaseAuthController
 }
 
+// List
+// @Title ETA表格列表接口
+// @Description ETA表格列表接口
+// @Param   PageSize   query   int  true       "每页数据条数"
+// @Param   CurrentIndex   query   int  true       "当前页页码,从1开始"
+// @Param   ExcelClassifyId   query   int  true       "分类id"
+// @Param   Keyword   query   string  true       "搜索关键词"
+// @Param   AdminId   query   int  false       "创建人id"
+// @Success 200 {object} response.ExcelListResp
+// @router /excel_info/list [get]
+func (this *ExcelInfoController) List() {
+	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
+	}
+
+	excelClassifyId, _ := this.GetInt("ExcelClassifyId")
+
+	pageSize, _ := this.GetInt("PageSize")
+	currentIndex, _ := this.GetInt("CurrentIndex")
+	keyword := this.GetString("Keyword")
+	adminId, _ := this.GetInt("AdminId")
+
+	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{}
 
+	// 筛选分类
+	if excelClassifyId > 0 {
+		_, err := data_manage.GetExcelClassifyById(excelClassifyId)
+		if err != nil && err.Error() != utils.ErrNoRow() {
+			br.Msg = "获取表格信息失败"
+			br.ErrMsg = "获取信息失败,GetExcelClassify,Err:" + err.Error()
+			return
+		}
+		condition += " AND excel_classify_id = ? "
+		pars = append(pars, excelClassifyId)
+	}
+	if keyword != "" {
+		condition += ` AND  ( excel_name LIKE ? )`
+		pars = append(pars, `%`+keyword+`%`)
+	}
+	if adminId > 0 {
+		condition += " AND sys_user_id = ? "
+		pars = append(pars, adminId)
+	}
+	//获取表格信息
+	list, err := data_manage.GetNoContentExcelListByCondition(condition, pars, startSize, pageSize)
+	if err != nil && err.Error() != utils.ErrNoRow() {
+		br.Success = true
+		br.Msg = "获取表格信息失败"
+		br.ErrMsg = "获取表格信息失败,Err:" + err.Error()
+		return
+	}
+
+	if list == nil || len(list) <= 0 || (err != nil && err.Error() == utils.ErrNoRow()) {
+		list = make([]*data_manage.MyExcelInfoList, 0)
+	}
+	// 总数据量
+	dataCount, err := data_manage.GetExcelListCountByCondition(condition, pars)
+	if err != nil && err.Error() != utils.ErrNoRow() {
+		br.Msg = "获取表格列表信息失败"
+		br.ErrMsg = "获取表格列表数据总数失败,Err:" + err.Error()
+		return
+	}
+	page = paging.GetPaging(currentIndex, pageSize, dataCount)
+
+	resp := response.ExcelListResp{
+		Paging: page,
+		List:   list,
+	}
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "获取成功"
+	br.Data = resp
+}
 
 // GetExcelTableData
 // @Title 获取excel表格的table数据
@@ -83,5 +178,3 @@ func (this *ExcelInfoController) GetExcelTableData() {
 	br.Msg = "获取成功"
 	br.Data = resp
 }
-
-

+ 129 - 0
controllers/data_manage/line_equation/line_chart_info.go

@@ -3,13 +3,17 @@ package line_equation
 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/data_manage/line_equation/request"
 	"hongze/hongze_ETA_mobile_api/models/system"
 	"hongze/hongze_ETA_mobile_api/services/data"
 	"hongze/hongze_ETA_mobile_api/services/data/line_equation"
 	"hongze/hongze_ETA_mobile_api/utils"
+	"strconv"
+	"strings"
 	"time"
 )
 
@@ -1495,3 +1499,128 @@ func GetChartInfoDetailFromUniqueCode(chartInfo *data_manage.ChartInfoView, isCa
 //	br.Msg = "获取成功"
 //	br.Data = resp
 //}
+
+// SearchByEs
+// @Title 图表模糊搜索(从es获取)
+// @Description  图表模糊搜索(从es获取)
+// @Param   Keyword   query   string  true       "图表名称"
+// @Param   IsShowMe   query   bool  true       "是否只看我的,true、false"
+// @Param   Source   query   int  true       "来源,3:拟合方程,4:滚动拟合方程,默认0:全部"
+// @Success 200 {object} data_manage.ChartInfo
+// @router /chart_info/search_by_es [get]
+func (this *LineEquationChartInfoController) SearchByEs() {
+	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
+	}
+
+	sourceList := []int{utils.CHART_SOURCE_LINE_EQUATION}
+
+	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, sourceList, noPermissionChartIdList, startSize, pageSize)
+	} else {
+		total, searchList, err = data_manage.ChartInfoSearchByEmptyKeyWord(showSysId, sourceList, 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 _, ok := chartEdbMap[v.ChartInfoId]; ok {
+				tmp.IsEnChart = data.CheckIsEnChart(v.ChartNameEn, []*data_manage.ChartEdbInfoMapping{}, 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
+}

+ 528 - 0
controllers/english_report/report.go

@@ -2,16 +2,19 @@ package english_report
 
 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/company"
 	"hongze/hongze_ETA_mobile_api/services"
+	"hongze/hongze_ETA_mobile_api/services/alarm_msg"
 	"hongze/hongze_ETA_mobile_api/utils"
 	"html"
 	"sort"
 	"strconv"
 	"strings"
+	"time"
 )
 
 // EnglishReportController 研报活动模块
@@ -19,6 +22,214 @@ type EnglishReportController struct {
 	controllers.BaseAuthController
 }
 
+// @Title 新增报告接口
+// @Description 新增报告
+// @Param	request	body models.AddEnglishReportReq true "type json string"
+// @Success 200 {object} models.AddEnglishReportResp
+// @router /add [post]
+func (this *EnglishReportController) Add() {
+	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 models.AddEnglishReportReq
+	err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
+	if err != nil {
+		br.Msg = "参数解析异常!"
+		br.ErrMsg = "参数解析失败,Err:" + err.Error()
+		return
+	}
+	if req.Content == "" {
+		br.Msg = "请输入内容"
+		return
+	}
+	if req.Overview == "" {
+		br.Msg = "请输入overview"
+		return
+	}
+	if req.Abstract == "" {
+		br.Msg = "请输入摘要"
+		return
+	}
+
+	var contentSub string
+	if req.Content != "" {
+		content, e := services.FilterReportContentBr(req.Content)
+		if e != nil {
+			br.Msg = "内容去除前后空格失败"
+			br.ErrMsg = "内容去除前后空格失败, Err: " + e.Error()
+			return
+		}
+		req.Content = content
+
+		contentSub, err = services.GetReportContentSub(req.Content)
+		if err != nil {
+			go alarm_msg.SendAlarmMsg("ContentSub 失败,Err:"+err.Error(), 3)
+			//utils.SendEmail(utils.APPNAME+"失败提醒", "解析 ContentSub 失败,Err:"+err.Error(), utils.EmailSendToUsers)
+		}
+	}
+	maxStage, err := models.GetEnglishReportStage(req.ClassifyIdFirst, req.ClassifyIdSecond)
+	if err != nil {
+		br.Msg = "期数获取失败!"
+		br.ErrMsg = "期数获取失败,Err:" + err.Error()
+		return
+	}
+
+	item := new(models.EnglishReport)
+	item.AddType = req.AddType
+	item.ClassifyIdFirst = req.ClassifyIdFirst
+	item.ClassifyNameFirst = req.ClassifyNameFirst
+	item.ClassifyIdSecond = req.ClassifyIdSecond
+	item.ClassifyNameSecond = req.ClassifyNameSecond
+	item.Title = req.Title
+	item.Abstract = req.Abstract
+	item.Author = req.Author
+	item.Frequency = req.Frequency
+	item.State = req.State
+	item.Content = html.EscapeString(req.Content)
+	item.Stage = maxStage + 1
+	item.ContentSub = html.EscapeString(contentSub)
+	item.CreateTime = req.CreateTime
+	item.ModifyTime = time.Now()
+	item.Overview = req.Overview
+	item.AdminId = sysUser.AdminId
+	item.AdminRealName = sysUser.RealName
+	newReportId, err := models.AddEnglishReport(item)
+	if err != nil {
+		br.Msg = "保存失败"
+		br.ErrMsg = "保存失败,Err:" + err.Error()
+		return
+	}
+	reportCode := utils.MD5(strconv.Itoa(int(newReportId)))
+	//修改唯一编码
+	{
+		go models.ModifyEnglishReportCode(newReportId, reportCode)
+	}
+	resp := new(models.AddEnglishReportResp)
+	resp.ReportId = newReportId
+	resp.ReportCode = reportCode
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "保存成功"
+	br.Data = resp
+}
+
+// @Title 编辑报告接口
+// @Description 编辑报告
+// @Param	request	body models.EditEnglishReportReq true "type json string"
+// @Success 200 {object} models.EditEnglishReportResp
+// @router /edit [post]
+func (this *EnglishReportController) Edit() {
+	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 models.EditEnglishReportReq
+	err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
+	if err != nil {
+		br.Msg = "参数解析异常!"
+		br.ErrMsg = "参数解析失败,Err:" + err.Error()
+		return
+	}
+	if req.Content == "" {
+		br.Msg = "请输入内容"
+		return
+	}
+	if req.Overview == "" {
+		br.Msg = "请输入overview"
+		return
+	}
+	if req.Abstract == "" {
+		br.Msg = "请输入摘要"
+		return
+	}
+
+	markStatus, err := services.UpdateEnReportEditMark(int(req.ReportId), sysUser.AdminId, 1, sysUser.RealName)
+	if err != nil {
+		br.Msg = err.Error()
+		return
+	}
+	if markStatus.Status == 1 {
+		br.Msg = markStatus.Msg
+		return
+	}
+	var contentSub string
+	if req.Content != "" {
+		content, e := services.FilterReportContentBr(req.Content)
+		if e != nil {
+			br.Msg = "内容去除前后空格失败"
+			br.ErrMsg = "内容去除前后空格失败, Err: " + e.Error()
+			return
+		}
+		req.Content = content
+
+		contentSub, err = services.GetReportContentSub(req.Content)
+		if err != nil {
+			go alarm_msg.SendAlarmMsg("解析 ContentSub 失败,Err:"+err.Error(), 3)
+			//utils.SendEmail(utils.APPNAME+"失败提醒", "解析 ContentSub 失败,Err:"+err.Error(), utils.EmailSendToUsers)
+		}
+	}
+
+	var stage int
+	report, _ := models.GetEnglishReportById(int(req.ReportId))
+	if report != nil {
+		if report.ClassifyNameFirst != req.ClassifyNameFirst || report.ClassifyNameSecond != req.ClassifyNameSecond {
+			maxStage, _ := models.GetEnglishReportStageEdit(req.ClassifyIdFirst, req.ClassifyIdSecond, int(req.ReportId))
+			maxStage = maxStage + 1
+			stage = maxStage
+		} else {
+			stage = report.Stage
+		}
+	}
+
+	item := new(models.EnglishReport)
+	item.ClassifyIdFirst = req.ClassifyIdFirst
+	item.ClassifyNameFirst = req.ClassifyNameFirst
+	item.ClassifyIdSecond = req.ClassifyIdSecond
+	item.ClassifyNameSecond = req.ClassifyNameSecond
+	item.Title = req.Title
+	item.Abstract = req.Abstract
+	item.Author = req.Author
+	item.Frequency = req.Frequency
+	item.State = req.State
+	item.Stage = stage
+	item.Content = html.EscapeString(req.Content)
+	item.ContentSub = html.EscapeString(contentSub)
+	item.CreateTime = req.CreateTime
+	item.Overview = req.Overview
+	err = models.EditEnglishReport(item, req.ReportId)
+	if err != nil {
+		br.Msg = "保存失败"
+		br.ErrMsg = "保存失败,Err:" + err.Error()
+		return
+	}
+
+	reportCode := utils.MD5(strconv.Itoa(int(req.ReportId)))
+	resp := new(models.EditEnglishReportResp)
+	resp.ReportId = req.ReportId
+	resp.ReportCode = reportCode
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "保存成功"
+	br.Data = resp
+}
+
 // @Title 获取报告详情接口
 // @Description 获取报告详情
 // @Param	request	body models.ReportDetailReq true "type json string"
@@ -642,3 +853,320 @@ func (this *EnglishReportController) Delete() {
 	br.Success = true
 	br.Msg = "删除成功"
 }
+
+// @Title 保存草稿
+// @Description 保存草稿
+// @Param	request	body models.SaveReportContent true "type json string"
+// @Success 200 {object} models.ReportAuthorResp
+// @router /saveReportContent [post]
+func (this *EnglishReportController) SaveReportContent() {
+	br := new(models.BaseResponse).Init()
+	br.IsSendEmail = false
+	defer func() {
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+	var req models.SaveReportContent
+	err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
+	if err != nil {
+		br.Msg = "参数解析异常!"
+		br.ErrMsg = "参数解析失败,Err:" + err.Error()
+		return
+	}
+
+	sysUser := this.SysUser
+	if sysUser == nil {
+		br.Msg = "请登录"
+		br.ErrMsg = "请登录,SysUser Is Empty"
+		br.Ret = 408
+		return
+	}
+
+	reportId := req.ReportId
+	noChangeFlag := req.NoChange
+	fmt.Println("reportId:", reportId)
+	if reportId <= 0 {
+		br.Msg = "请输入报告ID"
+		return
+	}
+	markStatus, err := services.UpdateEnReportEditMark(int(req.ReportId), sysUser.AdminId, 1, sysUser.RealName)
+	if err != nil {
+		br.Msg = err.Error()
+		return
+	}
+	if markStatus.Status == 1 {
+		br.Msg = markStatus.Msg
+		return
+	}
+
+	if noChangeFlag != 1 {
+		content := req.Content
+		if content == "" {
+			content = this.GetString("Content")
+		}
+		if content != "" {
+			contentClean, e := services.FilterReportContentBr(req.Content)
+			if e != nil {
+				br.Msg = "内容去除前后空格失败"
+				br.ErrMsg = "内容去除前后空格失败, Err: " + e.Error()
+				return
+			}
+			content = contentClean
+
+			contentSub, err := services.GetReportContentSub(content)
+			if err != nil {
+				go alarm_msg.SendAlarmMsg("解析 ContentSub 失败,Err:"+err.Error(), 3)
+				//utils.SendEmail(utils.APPNAME+"失败提醒", "解析 ContentSub 失败,Err:"+err.Error(), utils.EmailSendToUsers)
+			}
+			content = html.EscapeString(content)
+			contentSub = html.EscapeString(contentSub)
+			err = models.EditEnglishReportContent(reportId, content, contentSub)
+			if err != nil {
+				br.Msg = "保存失败"
+				br.ErrMsg = "保存失败,Err:" + err.Error()
+				return
+			}
+			go models.AddEnglishReportSaveLog(reportId, this.SysUser.AdminId, content, contentSub, this.SysUser.AdminName)
+		}
+	}
+	resp := new(models.SaveReportContentResp)
+	resp.ReportId = reportId
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "保存成功成功"
+	br.Data = resp
+}
+
+// @Title 根据分类获取最近一次报告详情接口
+// @Description 根据分类获取最近一次报告详情
+// @Param	request	body models.ClassifyIdDetailReq true "type json string"
+// @Success 200 {object} models.Report
+// @router /classifyIdDetail [get]
+func (this *EnglishReportController) ClassifyIdDetail() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+	//classify_id_first=34&classify_id_second=36
+
+	/*var req models.ClassifyIdDetailReq
+	err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
+	if err != nil {
+		br.Msg = "参数解析异常!"
+		br.ErrMsg = "参数解析失败,Err:" + err.Error()
+		return
+	}*/
+	classifyIdFirst, _ := this.GetInt("classify_id_first")
+	if classifyIdFirst <= 0 {
+		classifyIdFirst, _ = this.GetInt("ClassifyIdFirst")
+	}
+	classifyIdSecond, _ := this.GetInt("classify_id_second")
+	if classifyIdSecond <= 0 {
+		classifyIdSecond, _ = this.GetInt("ClassifyIdSecond")
+	}
+	item, err := models.GetEnglishReportDetailByClassifyId(classifyIdFirst, classifyIdSecond)
+	if err != nil && err.Error() != utils.ErrNoRow() {
+		br.Msg = "获取失败!"
+		br.ErrMsg = "获取失败,Err:" + err.Error()
+		return
+	}
+	if item != nil {
+		item.Content = html.UnescapeString(item.Content)
+		item.ContentSub = html.UnescapeString(item.ContentSub)
+	}
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "获取成功"
+	br.Data = item
+}
+
+// Author
+// @Title 获取报告作者接口
+// @Description 获取报告作者
+// @Param   AuthorType   query   int  true       "来源类型,1:中文,2:英文"
+// @Param   Keyword   query   string  true       "搜索关键词"
+// @Param   CurrentIndex   query   int  true       "当前页页码,从1开始"
+// @Param   StartDate   query   string  true       "开始时间"
+// @Success 200 {object} models.ReportAuthorResp
+// @router /author [get]
+func (this *EnglishReportController) Author() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+
+	keyword := this.GetString("Keyword")
+
+	var condition string
+	var pars []interface{}
+	condition += ` AND author_type = 2 AND enable = 1`
+
+	if keyword != `` {
+		condition += ` AND report_author like ? `
+		pars = append(pars, "%"+keyword+"%")
+	}
+
+	_, items, err := models.GetReportAuthorList(condition, pars, 0, 10000)
+	if err != nil {
+		br.Msg = "获取失败!"
+		br.ErrMsg = "获取失败,Err:" + err.Error()
+		return
+	}
+	resp := models.ReportAuthorResp{
+		List: items,
+	}
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "获取成功"
+	br.Data = resp
+}
+
+// MarkEditStatus
+// @Title 标记报告编辑状态
+// @Description 标记报告编辑状态接口
+// @Param	request	body request.MarkEditEnReport true "type json string"
+// @Success 200 标记成功 ;202 标记成功
+// @router /mark [post]
+func (this *EnglishReportController) MarkEditStatus() {
+	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 models.MarkEditEnReport
+	err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
+	if err != nil {
+		br.Msg = "参数解析异常!"
+		br.ErrMsg = "参数解析失败,Err:" + err.Error()
+		return
+	}
+
+	if req.ReportId <= 0 {
+		br.Msg = "缺少报告Id"
+		return
+	}
+	if req.Status <= 0 {
+		br.Msg = "标记状态异常"
+		return
+	}
+	//更新标记key
+	data, err := services.UpdateEnReportEditMark(req.ReportId, sysUser.AdminId, req.Status, sysUser.RealName)
+	if err != nil {
+		br.Msg = err.Error()
+		return
+	}
+
+	msg := "标记成功"
+	br.Ret = 200
+	br.Success = true
+	br.Msg = msg
+	br.Data = data
+}
+
+// @Title 编辑来自策略报告的报告
+// @Description 编辑来自策略报告的报告
+// @Param	request	body models.EditEnglishReportFromPolicyReq true "type json string"
+// @Success 200 {object} models.EditEnglishReportResp
+// @router /edit_policy [post]
+func (this *EnglishReportController) EditPolicy() {
+	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 models.EditEnglishReportFromPolicyReq
+	err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
+	if err != nil {
+		br.Msg = "参数解析异常!"
+		br.ErrMsg = "参数解析失败,Err:" + err.Error()
+		return
+	}
+	if req.ReportId <= 0 {
+		br.Msg = "请选择报告ID"
+		return
+	}
+	if req.Title == "" {
+		br.Msg = "请输入标题"
+		return
+	}
+	if req.Abstract == "" {
+		br.Msg = "请输入摘要"
+		return
+	}
+
+	if req.Frequency == "" {
+		br.Msg = "请输入频度"
+		return
+	}
+	if req.Author == "" {
+		br.Msg = "请输入作者"
+		return
+	}
+
+	if req.CreateTime == "" {
+		br.Msg = "请输入创建时间"
+		return
+	}
+	//查询报告是否存在
+	reportInfo, err := models.GetEnglishReportItemById(int(req.ReportId))
+	if err != nil {
+		if err.Error() == utils.ErrNoRow() {
+			br.Msg = "报告不存在"
+			return
+		}
+		br.Msg = "查询报告信息失败"
+		br.ErrMsg = "查询报告信息失败, Err" + err.Error()
+		return
+	}
+	if reportInfo.State == 2 {
+		br.Msg = "报告已发布不允许编辑"
+		return
+	}
+	markStatus, err := services.UpdateEnReportEditMark(int(req.ReportId), sysUser.AdminId, 1, sysUser.RealName)
+	if err != nil {
+		br.Msg = err.Error()
+		return
+	}
+	if markStatus.Status == 1 {
+		br.Msg = markStatus.Msg
+		return
+	}
+
+	item := reportInfo
+	item.Title = req.Title
+	item.Abstract = req.Abstract
+	item.Author = req.Author
+	item.Frequency = req.Frequency
+	item.CreateTime = req.CreateTime
+	item.ModifyTime = time.Now()
+	err = item.Update([]string{"Title", "Abstract", "Author", "Frequency", "CreateTime", "ModifyTime"})
+	if err != nil {
+		br.Msg = "保存失败"
+		br.ErrMsg = "保存失败,Err:" + err.Error()
+		return
+	}
+	reportCode := reportInfo.ReportCode
+	resp := new(models.EditEnglishReportResp)
+	resp.ReportId = req.ReportId
+	resp.ReportCode = reportCode
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "保存成功"
+	br.Data = resp
+}

File diff suppressed because it is too large
+ 188 - 775
controllers/report.go


+ 82 - 0
controllers/sandbox/sandbox.go

@@ -0,0 +1,82 @@
+package sandbox
+
+import (
+	"github.com/rdlucklib/rdluck_tools/paging"
+	"hongze/hongze_ETA_mobile_api/controllers"
+	"hongze/hongze_ETA_mobile_api/models"
+	"hongze/hongze_ETA_mobile_api/models/sandbox"
+	"hongze/hongze_ETA_mobile_api/models/sandbox/response"
+	"hongze/hongze_ETA_mobile_api/utils"
+)
+
+//SandboxController 逻辑导图
+type SandboxController struct {
+	controllers.BaseAuthController
+}
+
+// ListByQuote
+// @Title 逻辑导图列表(其他地方引用到的,莫名其妙要根据输入的关键字匹配品种)
+// @Description 逻辑导图列表接口(其他地方引用到的,莫名其妙要根据输入的关键字匹配品种)
+// @Param   PageSize   query   int  true       "每页数据条数"
+// @Param   CurrentIndex   query   int  true       "当前页页码,从1开始"
+// @Param   ChartPermissionId   query   int  true       "权限编号id"
+// @Param   Keyword   query   string  false       "搜索关键词:沙盘名称/编辑人名称"
+// @Success 200 {object} response.ListResp
+// @router /list_by_quote [get]
+func (this *SandboxController) ListByQuote() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+
+	chartPermissionId, _ := this.GetInt("ChartPermissionId")
+	keyword := this.GetString("Keyword")
+
+	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)
+
+	var condition string
+	var pars []interface{}
+
+	if chartPermissionId > 0 {
+		condition += " AND a.chart_permission_id=? "
+		pars = append(pars, chartPermissionId)
+	}
+
+	if keyword != "" {
+		condition += ` AND  ( a.name LIKE '%` + keyword + `%'  OR  b.name LIKE '%` + keyword + `%' OR  a.chart_permission_name LIKE '%` + keyword + `%' )`
+	}
+
+	//获取指标信息
+	total, list, err := sandbox.GetList(condition, pars, startSize, pageSize)
+	if err != nil && err.Error() != utils.ErrNoRow() {
+		br.Success = true
+		br.Msg = "获取沙盘列表失败"
+		br.ErrMsg = "获取沙盘列表失败,Err:" + err.Error()
+		return
+	}
+
+	if list == nil || (err != nil && err.Error() == utils.ErrNoRow()) {
+		list = make([]*sandbox.SandboxListItem, 0)
+	}
+
+	page := paging.GetPaging(currentIndex, pageSize, total)
+	resp := response.SandboxListResp{
+		Paging: page,
+		List:   list,
+	}
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "获取成功"
+	br.Data = resp
+}

+ 141 - 0
models/data_manage/excel_classify.go

@@ -0,0 +1,141 @@
+package data_manage
+
+import (
+	"fmt"
+	"github.com/beego/beego/v2/client/orm"
+	"time"
+)
+
+// ExcelClassify excel表格分类
+type ExcelClassify struct {
+	ExcelClassifyId   int       `orm:"column(excel_classify_id);pk"`
+	ExcelClassifyName string    `description:"分类名称"`
+	ParentId          int       `description:"父级id"`
+	SysUserId         int       `description:"创建人id"`
+	SysUserRealName   string    `description:"创建人姓名"`
+	Level             int       `description:"层级"`
+	UniqueCode        string    `description:"唯一编码"`
+	Sort              int       `description:"排序字段,越小越靠前,默认值:10"`
+	IsDelete          int       `description:"排序字段,越小越靠前,默认值:10"`
+	CreateTime        time.Time `description:"创建时间"`
+	ModifyTime        time.Time `description:"修改时间"`
+}
+
+// AddExcelClassify 添加excel分类
+func AddExcelClassify(item *ExcelClassify) (lastId int64, err error) {
+	o := orm.NewOrmUsingDB("data")
+	lastId, err = o.Insert(item)
+	return
+}
+
+// GetExcelClassifyCount 获取同级分类下存在同名分类的数量
+func GetExcelClassifyCount(ExcelClassifyName string, parentId int) (count int, err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := `SELECT COUNT(1) AS count FROM excel_classify WHERE parent_id=? AND excel_classify_name=? AND is_delete=0 `
+	err = o.Raw(sql, parentId, ExcelClassifyName).QueryRow(&count)
+	return
+}
+
+func GetExcelClassifyById(classifyId int) (item *ExcelClassify, err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := `SELECT * FROM excel_classify WHERE excel_classify_id=? AND is_delete=0 `
+	err = o.Raw(sql, classifyId).QueryRow(&item)
+	return
+}
+
+func GetExcelClassifyByParentId(parentId int) (items []*ExcelClassifyItems, err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := ` SELECT * FROM excel_classify WHERE parent_id=? AND is_delete=0 order by sort asc,excel_classify_id asc`
+	_, err = o.Raw(sql, parentId).QueryRows(&items)
+	return
+}
+
+func GetExcelClassifyAll() (items []*ExcelClassifyItems, err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := ` SELECT * FROM excel_classify WHERE parent_id<>0 AND is_delete=0 order by sort asc,excel_classify_id asc`
+	_, err = o.Raw(sql).QueryRows(&items)
+	return
+}
+
+type ExcelClassifyItems struct {
+	ExcelClassifyId   int `description:"分类id"`
+	ExcelInfoId       int `description:"表格id"`
+	ExcelClassifyName string
+	ParentId          int
+	Level             int    `description:"层级"`
+	Sort              int    `description:"排序字段,越小越靠前,默认值:10"`
+	UniqueCode        string `description:"唯一编码"`
+	SysUserId         int    `description:"创建人id"`
+	SysUserRealName   string `description:"创建人姓名"`
+	StartDate         string `description:"自定义开始日期"`
+	Children          []*ExcelClassifyItems
+}
+
+func GetExcelClassifyByCondition(condition string, pars []interface{}) (item *ExcelClassify, err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := ` SELECT * FROM excel_classify WHERE 1=1 AND is_delete=0 `
+	if condition != "" {
+		sql += condition
+	}
+	err = o.Raw(sql, pars).QueryRow(&item)
+	return
+}
+
+// GetNextExcelClassifyByCondition 获取下一个分类
+func GetNextExcelClassifyByCondition(condition string, pars []interface{}) (item *ExcelClassify, err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := ` SELECT * FROM excel_classify WHERE 1=1 AND is_delete=0 `
+	if condition != "" {
+		sql += condition
+	}
+	sql += " ORDER BY sort asc , create_time ASC LIMIT 1 "
+	err = o.Raw(sql, pars).QueryRow(&item)
+	return
+}
+
+// GetFirstExcelClassifyByParentId 获取当前父级图表分类下的排序第一条的数据
+func GetFirstExcelClassifyByParentId(parentId int) (item *ExcelClassify, err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := ` SELECT * FROM excel_classify WHERE parent_id=? AND is_delete=0 order by sort asc,excel_classify_id asc limit 1`
+	err = o.Raw(sql, parentId).QueryRow(&item)
+	return
+}
+
+// UpdateExcelClassifySortByParentId 根据图表父类id更新排序
+func UpdateExcelClassifySortByParentId(parentId, classifyId, nowSort int, updateSort string) (err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := ` update excel_classify set sort = ` + updateSort + ` WHERE parent_id=? and sort > ? AND is_delete=0 `
+	if classifyId > 0 {
+		sql += ` or ( excel_classify_id > ` + fmt.Sprint(classifyId) + ` and sort= ` + fmt.Sprint(nowSort) + `)`
+	}
+	_, err = o.Raw(sql, parentId, nowSort).Exec()
+	return
+}
+
+// Update 更新图表分类基础信息
+func (ExcelClassify *ExcelClassify) Update(cols []string) (err error) {
+	o := orm.NewOrmUsingDB("data")
+	_, err = o.Update(ExcelClassify, cols...)
+	return
+}
+
+// GetExcelClassifyMaxSort 获取图表分类下最大的排序数
+func GetExcelClassifyMaxSort(parentId int) (sort int, err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := `SELECT Max(sort) AS sort FROM excel_classify WHERE parent_id=? AND is_delete=0 `
+	err = o.Raw(sql, parentId).QueryRow(&sort)
+	return
+}
+
+type ExcelClassifyView struct {
+	ExcelClassifyId   int    `orm:"column(excel_classify_id);pk"`
+	ExcelClassifyName string `description:"分类名称"`
+	ParentId          int    `description:"父级id"`
+}
+
+func GetExcelClassifyViewById(classifyId int) (item *ExcelClassifyView, err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := `SELECT * FROM excel_classify WHERE excel_classify_id=? AND is_delete=0 `
+	err = o.Raw(sql, classifyId).QueryRow(&item)
+	return
+}

+ 14 - 0
models/db.go

@@ -4,6 +4,7 @@ import (
 	_ "github.com/go-sql-driver/mysql"
 	"hongze/hongze_ETA_mobile_api/models/data_manage"
 	"hongze/hongze_ETA_mobile_api/models/ppt_english"
+	"hongze/hongze_ETA_mobile_api/models/sandbox"
 	"hongze/hongze_ETA_mobile_api/models/system"
 	"hongze/hongze_ETA_mobile_api/utils"
 	"time"
@@ -47,6 +48,7 @@ func init() {
 	//注册对象
 	orm.RegisterModel(
 		new(Classify),
+		new(Resource),
 		new(Ppt),
 		new(PptPages),
 		new(PptPublishRecord),
@@ -75,6 +77,9 @@ func init() {
 
 	// 英文报告
 	initEnglishReport()
+
+	// 沙盘推演
+	initSandbox()
 }
 
 // initSystem 系统表 数据表
@@ -125,6 +130,7 @@ func initChart() {
 func initEdbData() {
 	orm.RegisterModel(
 		new(data_manage.SearchKeyword),
+		new(data_manage.ExcelClassify), //ETA excel表格分类
 	)
 }
 
@@ -162,3 +168,11 @@ func initEnglishReport() {
 		new(EnglishVideo), // 英文研报线上路演
 	)
 }
+
+// initSandbox 注册Edb沙盘 数据表
+func initSandbox() {
+	//注册对象
+	orm.RegisterModel(
+		new(sandbox.Sandbox), //沙盘主表
+	)
+}

+ 12 - 0
models/sandbox/response/sandbox.go

@@ -0,0 +1,12 @@
+package response
+
+import (
+	"github.com/rdlucklib/rdluck_tools/paging"
+	"hongze/hongze_ETA_mobile_api/models/sandbox"
+)
+
+// SandboxListResp 沙盘列表返回数据
+type SandboxListResp struct {
+	Paging *paging.PagingItem
+	List   []*sandbox.SandboxListItem
+}

+ 68 - 0
models/sandbox/sandbox.go

@@ -0,0 +1,68 @@
+package sandbox
+
+import (
+	"github.com/beego/beego/v2/client/orm"
+	"time"
+)
+
+// Sandbox 沙盘推演主表
+type Sandbox struct {
+	SandboxId           int       `orm:"column(sandbox_id);pk" description:"沙盘id"`
+	Name                string    `description:"沙盘名称"`
+	ChartPermissionId   int       `description:"品种id"`
+	ChartPermissionName string    `description:"品种名称"`
+	CurrVersion         int       `description:"当前版本"`
+	Code                string    `description:"沙盘code"`
+	Content             string    `description:"沙盘数据"`
+	PicUrl              string    `description:"沙盘图片地址"`
+	OpUserId            int       `description:"最近一次编辑操作的用户id"`
+	OpUserName          string    `description:"最近一次编辑的用户名称(冗余字段,避免查表)"`
+	IsDelete            int8      `description:"是否删除,0:未删除,1:已删除"`
+	ModifyTime          time.Time `description:"修改时间"`
+	CreateTime          time.Time `description:"创建时间"`
+}
+
+// Update 沙盘字段变更
+func (sandbox *Sandbox) Update(cols []string) (err error) {
+	o := orm.NewOrm()
+	_, err = o.Update(sandbox, cols...)
+	return
+}
+
+// SandboxListItem 沙盘推演列表数据
+type SandboxListItem struct {
+	SandboxId           int    `description:"沙盘id"`
+	Name                string `description:"沙盘名称"`
+	ChartPermissionId   int    `description:"品种id"`
+	ChartPermissionName string `description:"品种名称"`
+	CurrVersion         int    `description:"当前版本"`
+	Code                string `description:"沙盘code"`
+	VersionCode         string `description:"沙盘版本code"`
+	//Content             string    `description:"沙盘数据"`
+	PicUrl       string    `description:"沙盘图片地址"`
+	OpUserId     int       `description:"最近一次编辑操作的用户id"`
+	OpUserName   string    `description:"最近一次编辑的用户名称(冗余字段,避免查表)"`
+	IsDelete     int8      `description:"是否删除,0:未删除,1:已删除" json:"is_delete"`
+	CanEdit      bool      `description:"是否可编辑"`
+	Editor       string    `description:"编辑人"`
+	VersionTotal int       `description:"历史版本数量"`
+	ModifyTime   time.Time `description:"修改时间"`
+	CreateTime   time.Time `description:"创建时间"`
+}
+
+// GetList 获取沙盘列表页
+func GetList(condition string, pars []interface{}, startSize, pageSize int) (total int, list []*SandboxListItem, err error) {
+	o := orm.NewOrm()
+	sql := "select a.sandbox_id,a.name,a.chart_permission_id,a.chart_permission_name,a.curr_version,a.code,a.pic_url,a.op_user_id,a.op_user_name,a.modify_time,a.create_time,b.version_code from sandbox as a join sandbox_version b on a.sandbox_id=b.sandbox_id and a.curr_version=b.curr_version where 1=1 AND a.is_delete = 0 "
+	sql += condition
+	sql += ` order by a.modify_time desc,a.sandbox_id desc`
+
+	totalSql := `select count(1) total from (` + sql + `) z `
+	err = o.Raw(totalSql, pars).QueryRow(&total)
+	if err != nil {
+		return
+	}
+	sql += ` LIMIT ?,? `
+	_, err = o.Raw(sql, pars, startSize, pageSize).QueryRows(&list)
+	return
+}

+ 180 - 0
routers/commentsRouter.go

@@ -34,6 +34,15 @@ func init() {
             Filters: nil,
             Params: nil})
 
+    beego.GlobalControllerRouter["hongze/hongze_ETA_mobile_api/controllers/data_manage/correlation:CorrelationChartInfoController"] = append(beego.GlobalControllerRouter["hongze/hongze_ETA_mobile_api/controllers/data_manage/correlation:CorrelationChartInfoController"],
+        beego.ControllerComments{
+            Method: "SearchByEs",
+            Router: `/chart_info/search_by_es`,
+            AllowHTTPMethods: []string{"get"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
     beego.GlobalControllerRouter["hongze/hongze_ETA_mobile_api/controllers/data_manage/future_good:FutureGoodChartClassifyController"] = append(beego.GlobalControllerRouter["hongze/hongze_ETA_mobile_api/controllers/data_manage/future_good:FutureGoodChartClassifyController"],
         beego.ControllerComments{
             Method: "ChartClassifyList",
@@ -61,6 +70,15 @@ func init() {
             Filters: nil,
             Params: nil})
 
+    beego.GlobalControllerRouter["hongze/hongze_ETA_mobile_api/controllers/data_manage/line_equation:LineEquationChartInfoController"] = append(beego.GlobalControllerRouter["hongze/hongze_ETA_mobile_api/controllers/data_manage/line_equation:LineEquationChartInfoController"],
+        beego.ControllerComments{
+            Method: "SearchByEs",
+            Router: `/chart_info/search_by_es`,
+            AllowHTTPMethods: []string{"get"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
     beego.GlobalControllerRouter["hongze/hongze_ETA_mobile_api/controllers/data_manage:ChartClassifyController"] = append(beego.GlobalControllerRouter["hongze/hongze_ETA_mobile_api/controllers/data_manage:ChartClassifyController"],
         beego.ControllerComments{
             Method: "DeleteChartClassify",
@@ -88,6 +106,15 @@ func init() {
             Filters: nil,
             Params: nil})
 
+    beego.GlobalControllerRouter["hongze/hongze_ETA_mobile_api/controllers/data_manage:ChartInfoController"] = append(beego.GlobalControllerRouter["hongze/hongze_ETA_mobile_api/controllers/data_manage:ChartInfoController"],
+        beego.ControllerComments{
+            Method: "BatchChartInfoRefresh",
+            Router: `/chart_info/batch_refresh`,
+            AllowHTTPMethods: []string{"post"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
     beego.GlobalControllerRouter["hongze/hongze_ETA_mobile_api/controllers/data_manage:ChartInfoController"] = append(beego.GlobalControllerRouter["hongze/hongze_ETA_mobile_api/controllers/data_manage:ChartInfoController"],
         beego.ControllerComments{
             Method: "CommonChartInfoDetailFromUniqueCode",
@@ -124,6 +151,24 @@ func init() {
             Filters: nil,
             Params: nil})
 
+    beego.GlobalControllerRouter["hongze/hongze_ETA_mobile_api/controllers/data_manage:ChartInfoController"] = append(beego.GlobalControllerRouter["hongze/hongze_ETA_mobile_api/controllers/data_manage:ChartInfoController"],
+        beego.ControllerComments{
+            Method: "ChartInfoSearchByEs",
+            Router: `/chart_info/search_by_es`,
+            AllowHTTPMethods: []string{"get"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["hongze/hongze_ETA_mobile_api/controllers/data_manage:ExcelInfoController"] = append(beego.GlobalControllerRouter["hongze/hongze_ETA_mobile_api/controllers/data_manage:ExcelInfoController"],
+        beego.ControllerComments{
+            Method: "List",
+            Router: `/excel_info/list`,
+            AllowHTTPMethods: []string{"get"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
     beego.GlobalControllerRouter["hongze/hongze_ETA_mobile_api/controllers/data_manage:ExcelInfoController"] = append(beego.GlobalControllerRouter["hongze/hongze_ETA_mobile_api/controllers/data_manage:ExcelInfoController"],
         beego.ControllerComments{
             Method: "GetExcelTableData",
@@ -304,6 +349,24 @@ func init() {
             Filters: nil,
             Params: nil})
 
+    beego.GlobalControllerRouter["hongze/hongze_ETA_mobile_api/controllers/english_report:EnglishReportController"] = append(beego.GlobalControllerRouter["hongze/hongze_ETA_mobile_api/controllers/english_report:EnglishReportController"],
+        beego.ControllerComments{
+            Method: "Add",
+            Router: `/add`,
+            AllowHTTPMethods: []string{"post"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["hongze/hongze_ETA_mobile_api/controllers/english_report:EnglishReportController"] = append(beego.GlobalControllerRouter["hongze/hongze_ETA_mobile_api/controllers/english_report:EnglishReportController"],
+        beego.ControllerComments{
+            Method: "Author",
+            Router: `/author`,
+            AllowHTTPMethods: []string{"get"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
     beego.GlobalControllerRouter["hongze/hongze_ETA_mobile_api/controllers/english_report:EnglishReportController"] = append(beego.GlobalControllerRouter["hongze/hongze_ETA_mobile_api/controllers/english_report:EnglishReportController"],
         beego.ControllerComments{
             Method: "DelClassify",
@@ -322,6 +385,15 @@ func init() {
             Filters: nil,
             Params: nil})
 
+    beego.GlobalControllerRouter["hongze/hongze_ETA_mobile_api/controllers/english_report:EnglishReportController"] = append(beego.GlobalControllerRouter["hongze/hongze_ETA_mobile_api/controllers/english_report:EnglishReportController"],
+        beego.ControllerComments{
+            Method: "ClassifyIdDetail",
+            Router: `/classifyIdDetail`,
+            AllowHTTPMethods: []string{"get"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
     beego.GlobalControllerRouter["hongze/hongze_ETA_mobile_api/controllers/english_report:EnglishReportController"] = append(beego.GlobalControllerRouter["hongze/hongze_ETA_mobile_api/controllers/english_report:EnglishReportController"],
         beego.ControllerComments{
             Method: "Delete",
@@ -340,6 +412,24 @@ func init() {
             Filters: nil,
             Params: nil})
 
+    beego.GlobalControllerRouter["hongze/hongze_ETA_mobile_api/controllers/english_report:EnglishReportController"] = append(beego.GlobalControllerRouter["hongze/hongze_ETA_mobile_api/controllers/english_report:EnglishReportController"],
+        beego.ControllerComments{
+            Method: "Edit",
+            Router: `/edit`,
+            AllowHTTPMethods: []string{"post"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["hongze/hongze_ETA_mobile_api/controllers/english_report:EnglishReportController"] = append(beego.GlobalControllerRouter["hongze/hongze_ETA_mobile_api/controllers/english_report:EnglishReportController"],
+        beego.ControllerComments{
+            Method: "EditPolicy",
+            Router: `/edit_policy`,
+            AllowHTTPMethods: []string{"post"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
     beego.GlobalControllerRouter["hongze/hongze_ETA_mobile_api/controllers/english_report:EnglishReportController"] = append(beego.GlobalControllerRouter["hongze/hongze_ETA_mobile_api/controllers/english_report:EnglishReportController"],
         beego.ControllerComments{
             Method: "ListReport",
@@ -349,6 +439,15 @@ func init() {
             Filters: nil,
             Params: nil})
 
+    beego.GlobalControllerRouter["hongze/hongze_ETA_mobile_api/controllers/english_report:EnglishReportController"] = append(beego.GlobalControllerRouter["hongze/hongze_ETA_mobile_api/controllers/english_report:EnglishReportController"],
+        beego.ControllerComments{
+            Method: "MarkEditStatus",
+            Router: `/mark`,
+            AllowHTTPMethods: []string{"post"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
     beego.GlobalControllerRouter["hongze/hongze_ETA_mobile_api/controllers/english_report:EnglishReportController"] = append(beego.GlobalControllerRouter["hongze/hongze_ETA_mobile_api/controllers/english_report:EnglishReportController"],
         beego.ControllerComments{
             Method: "PublishReport",
@@ -367,6 +466,15 @@ func init() {
             Filters: nil,
             Params: nil})
 
+    beego.GlobalControllerRouter["hongze/hongze_ETA_mobile_api/controllers/english_report:EnglishReportController"] = append(beego.GlobalControllerRouter["hongze/hongze_ETA_mobile_api/controllers/english_report:EnglishReportController"],
+        beego.ControllerComments{
+            Method: "SaveReportContent",
+            Router: `/saveReportContent`,
+            AllowHTTPMethods: []string{"post"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
     beego.GlobalControllerRouter["hongze/hongze_ETA_mobile_api/controllers/english_report:EnglishReportEmailController"] = append(beego.GlobalControllerRouter["hongze/hongze_ETA_mobile_api/controllers/english_report:EnglishReportEmailController"],
         beego.ControllerComments{
             Method: "List",
@@ -403,6 +511,15 @@ func init() {
             Filters: nil,
             Params: nil})
 
+    beego.GlobalControllerRouter["hongze/hongze_ETA_mobile_api/controllers/sandbox:SandboxController"] = append(beego.GlobalControllerRouter["hongze/hongze_ETA_mobile_api/controllers/sandbox:SandboxController"],
+        beego.ControllerComments{
+            Method: "ListByQuote",
+            Router: `/list_by_quote`,
+            AllowHTTPMethods: []string{"get"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
     beego.GlobalControllerRouter["hongze/hongze_ETA_mobile_api/controllers:ClassifyController"] = append(beego.GlobalControllerRouter["hongze/hongze_ETA_mobile_api/controllers:ClassifyController"],
         beego.ControllerComments{
             Method: "ListClassify",
@@ -1042,6 +1159,15 @@ func init() {
             Filters: nil,
             Params: nil})
 
+    beego.GlobalControllerRouter["hongze/hongze_ETA_mobile_api/controllers:ReportController"] = append(beego.GlobalControllerRouter["hongze/hongze_ETA_mobile_api/controllers:ReportController"],
+        beego.ControllerComments{
+            Method: "Author",
+            Router: `/author`,
+            AllowHTTPMethods: []string{"get"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
     beego.GlobalControllerRouter["hongze/hongze_ETA_mobile_api/controllers:ReportController"] = append(beego.GlobalControllerRouter["hongze/hongze_ETA_mobile_api/controllers:ReportController"],
         beego.ControllerComments{
             Method: "ClassifyIdDetail",
@@ -1114,6 +1240,15 @@ func init() {
             Filters: nil,
             Params: nil})
 
+    beego.GlobalControllerRouter["hongze/hongze_ETA_mobile_api/controllers:ReportController"] = append(beego.GlobalControllerRouter["hongze/hongze_ETA_mobile_api/controllers:ReportController"],
+        beego.ControllerComments{
+            Method: "GetDayReportTickerList",
+            Router: `/getDayReportTickerList`,
+            AllowHTTPMethods: []string{"get"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
     beego.GlobalControllerRouter["hongze/hongze_ETA_mobile_api/controllers:ReportController"] = append(beego.GlobalControllerRouter["hongze/hongze_ETA_mobile_api/controllers:ReportController"],
         beego.ControllerComments{
             Method: "GetDayWeekChapter",
@@ -1123,6 +1258,15 @@ func init() {
             Filters: nil,
             Params: nil})
 
+    beego.GlobalControllerRouter["hongze/hongze_ETA_mobile_api/controllers:ReportController"] = append(beego.GlobalControllerRouter["hongze/hongze_ETA_mobile_api/controllers:ReportController"],
+        beego.ControllerComments{
+            Method: "GetLastDayWeekReportChapter",
+            Router: `/getLastDayWeekReportChapter`,
+            AllowHTTPMethods: []string{"get"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
     beego.GlobalControllerRouter["hongze/hongze_ETA_mobile_api/controllers:ReportController"] = append(beego.GlobalControllerRouter["hongze/hongze_ETA_mobile_api/controllers:ReportController"],
         beego.ControllerComments{
             Method: "GetReportChapterList",
@@ -1150,6 +1294,15 @@ func init() {
             Filters: nil,
             Params: nil})
 
+    beego.GlobalControllerRouter["hongze/hongze_ETA_mobile_api/controllers:ReportController"] = append(beego.GlobalControllerRouter["hongze/hongze_ETA_mobile_api/controllers:ReportController"],
+        beego.ControllerComments{
+            Method: "IsLastDayWeekReportChapter",
+            Router: `/isLastDayWeekReportChapter`,
+            AllowHTTPMethods: []string{"get"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
     beego.GlobalControllerRouter["hongze/hongze_ETA_mobile_api/controllers:ReportController"] = append(beego.GlobalControllerRouter["hongze/hongze_ETA_mobile_api/controllers:ReportController"],
         beego.ControllerComments{
             Method: "ListReport",
@@ -1195,6 +1348,24 @@ func init() {
             Filters: nil,
             Params: nil})
 
+    beego.GlobalControllerRouter["hongze/hongze_ETA_mobile_api/controllers:ReportController"] = append(beego.GlobalControllerRouter["hongze/hongze_ETA_mobile_api/controllers:ReportController"],
+        beego.ControllerComments{
+            Method: "PublishDayWeekReportChapter",
+            Router: `/publishDayWeekReportChapter`,
+            AllowHTTPMethods: []string{"post"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["hongze/hongze_ETA_mobile_api/controllers:ReportController"] = append(beego.GlobalControllerRouter["hongze/hongze_ETA_mobile_api/controllers:ReportController"],
+        beego.ControllerComments{
+            Method: "SaveReportContent",
+            Router: `/saveReportContent`,
+            AllowHTTPMethods: []string{"post"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
     beego.GlobalControllerRouter["hongze/hongze_ETA_mobile_api/controllers:ReportController"] = append(beego.GlobalControllerRouter["hongze/hongze_ETA_mobile_api/controllers:ReportController"],
         beego.ControllerComments{
             Method: "SendMsg",
@@ -1213,6 +1384,15 @@ func init() {
             Filters: nil,
             Params: nil})
 
+    beego.GlobalControllerRouter["hongze/hongze_ETA_mobile_api/controllers:ReportUploadCommonController"] = append(beego.GlobalControllerRouter["hongze/hongze_ETA_mobile_api/controllers:ReportUploadCommonController"],
+        beego.ControllerComments{
+            Method: "UploadImg",
+            Router: `/uploadImg`,
+            AllowHTTPMethods: []string{"post"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
     beego.GlobalControllerRouter["hongze/hongze_ETA_mobile_api/controllers:ResourceController"] = append(beego.GlobalControllerRouter["hongze/hongze_ETA_mobile_api/controllers:ResourceController"],
         beego.ControllerComments{
             Method: "Upload",

+ 13 - 0
routers/router.go

@@ -12,7 +12,9 @@ import (
 	"hongze/hongze_ETA_mobile_api/controllers/data_manage"
 	"hongze/hongze_ETA_mobile_api/controllers/data_manage/correlation"
 	"hongze/hongze_ETA_mobile_api/controllers/data_manage/future_good"
+	"hongze/hongze_ETA_mobile_api/controllers/data_manage/line_equation"
 	"hongze/hongze_ETA_mobile_api/controllers/english_report"
+	"hongze/hongze_ETA_mobile_api/controllers/sandbox"
 
 	"github.com/beego/beego/v2/server/web"
 	"github.com/beego/beego/v2/server/web/filter/cors"
@@ -79,6 +81,11 @@ func init() {
 				&data_manage.MyChartController{},
 			),
 		),
+		web.NSNamespace("/sandbox",
+			web.NSInclude(
+				&sandbox.SandboxController{},
+			),
+		),
 		web.NSNamespace("/future_good",
 			web.NSInclude(
 				//&future_good.FutureGoodEdbInfoController{},
@@ -92,6 +99,12 @@ func init() {
 				&correlation.CorrelationChartInfoController{},
 			),
 		),
+		web.NSNamespace("/line_equation",
+			web.NSInclude(
+				//&line_equation.LineEquationChartClassifyController{},
+				&line_equation.LineEquationChartInfoController{},
+			),
+		),
 		web.NSNamespace("/classify",
 			web.NSInclude(
 				&controllers.ClassifyController{},

+ 137 - 0
services/data/base_edb_lib.go

@@ -0,0 +1,137 @@
+package data
+
+import (
+	"encoding/json"
+	"fmt"
+	"hongze/hongze_ETA_mobile_api/models"
+	"hongze/hongze_ETA_mobile_api/utils"
+	"io/ioutil"
+	"net/http"
+	"strings"
+)
+
+// RefreshEdbData 刷新指标数据
+func RefreshEdbData(edbInfoId, source int, edbCode, startDate string) (resp *models.BaseResponse, err error) {
+	param := make(map[string]interface{})
+	param["EdbCode"] = edbCode
+	param["EdbInfoId"] = edbInfoId
+	param["StartDate"] = startDate
+	urlStr := ``
+	switch source {
+	case utils.DATA_SOURCE_THS:
+		urlStr = "ths/refresh"
+	case utils.DATA_SOURCE_WIND:
+		urlStr = "wind/refresh"
+	case utils.DATA_SOURCE_PB:
+		urlStr = "pb/refresh"
+	case utils.DATA_SOURCE_PB_FINANCE:
+		urlStr = "pb_finance/refresh"
+	case utils.DATA_SOURCE_MANUAL:
+		urlStr = "manual/refresh"
+	case utils.DATA_SOURCE_LZ:
+		urlStr = "lz/refresh"
+	case utils.DATA_SOURCE_YS:
+		urlStr = "smm/refresh"
+	case utils.DATA_SOURCE_GL:
+		urlStr = "mysteel/refresh"
+	case utils.DATA_SOURCE_ZZ:
+		urlStr = "zz/refresh"
+	case utils.DATA_SOURCE_DL:
+		urlStr = "dl/refresh"
+	case utils.DATA_SOURCE_SH:
+		urlStr = "sh/refresh"
+	case utils.DATA_SOURCE_CFFEX:
+		urlStr = "cffex/refresh"
+	case utils.DATA_SOURCE_SHFE:
+		urlStr = "shfe/refresh"
+	case utils.DATA_SOURCE_GIE:
+		urlStr = "gie/refresh"
+	case utils.DATA_SOURCE_LT:
+		urlStr = "lt/refresh"
+	case utils.DATA_SOURCE_COAL:
+		urlStr = "coal/refresh"
+	case utils.DATA_SOURCE_GOOGLE_TRAVEL:
+		urlStr = "google_travel/refresh"
+	case utils.DATA_SOURCE_MYSTEEL_CHEMICAL:
+		urlStr = "mysteel_chemical/refresh"
+	case utils.DATA_SOURCE_EIA_STEO:
+		urlStr = "eia_steo/refresh"
+	case utils.DATA_SOURCE_PREDICT:
+		urlStr = "predict/refresh"
+	case utils.DATA_SOURCE_COM_TRADE:
+		urlStr = "com_trade/refresh"
+	case utils.DATA_SOURCE_SCI:
+		urlStr = "sci/refresh"
+	case utils.DATA_SOURCE_BAIINFO:
+		urlStr = "baiinfo/refresh"
+	case utils.DATA_SOURCE_STOCK_PLANT:
+		urlStr = "stock_plant/refresh"
+	case utils.DATA_SOURCE_NATIONAL_STATISTICS:
+		urlStr = "national_statistics/refresh"
+	}
+	if urlStr == "" {
+		err = fmt.Errorf(fmt.Sprint("source:", source, ";未实现该指标的刷新接口,请联系管理员"))
+		return
+	}
+	resp, err = postRefreshEdbData(param, urlStr)
+	return
+}
+
+// RefreshEdbCalculateData 刷新普通计算指标数据请求
+func RefreshEdbCalculateData(edbInfoId int, edbCode, startDate string) (resp *models.BaseResponse, err error) {
+	param := make(map[string]interface{})
+	param["EdbCode"] = edbCode
+	param["EdbInfoId"] = edbInfoId
+	param["StartDate"] = startDate
+	resp, err = postRefreshEdbData(param, "calculate/refresh")
+	return
+}
+
+// RefreshPredictEdbCalculateData 刷新 预测计算指标 数据请求
+func RefreshPredictEdbCalculateData(edbInfoId int, edbCode, startDate string) (resp *models.BaseResponse, err error) {
+	param := make(map[string]interface{})
+	param["EdbCode"] = edbCode
+	param["EdbInfoId"] = edbInfoId
+	param["StartDate"] = startDate
+	resp, err = postRefreshEdbData(param, "predict_calculate/refresh")
+	return
+}
+
+// postRefreshEdbData 刷新指标数据
+func postRefreshEdbData(param map[string]interface{}, urlStr string) (resp *models.BaseResponse, err error) {
+	postUrl := utils.EDB_LIB_URL + urlStr
+	postData, err := json.Marshal(param)
+	if err != nil {
+		return
+	}
+	result, err := HttpPost(postUrl, string(postData), "application/json")
+	if err != nil {
+		return
+	}
+	utils.FileLog.Info("postRefreshEdbData:" + postUrl + ";" + string(postData) + ";result:" + string(result))
+	err = json.Unmarshal(result, &resp)
+	if err != nil {
+		return
+	}
+	return resp, nil
+}
+
+func HttpPost(url, postData string, params ...string) ([]byte, error) {
+	body := ioutil.NopCloser(strings.NewReader(postData))
+	client := &http.Client{}
+	req, err := http.NewRequest("POST", url, body)
+	if err != nil {
+		return nil, err
+	}
+	contentType := "application/x-www-form-urlencoded;charset=utf-8"
+	if len(params) > 0 && params[0] != "" {
+		contentType = params[0]
+	}
+	req.Header.Set("Content-Type", contentType)
+	req.Header.Set("authorization", utils.MD5(utils.APP_EDB_LIB_NAME_EN+utils.EDB_LIB_Md5_KEY))
+	resp, err := client.Do(req)
+	defer resp.Body.Close()
+	b, err := ioutil.ReadAll(resp.Body)
+	fmt.Println("HttpPost:" + string(b))
+	return b, err
+}

+ 41 - 0
services/data/chart_info.go

@@ -8,6 +8,7 @@ import (
 	"hongze/hongze_ETA_mobile_api/models/company"
 	"hongze/hongze_ETA_mobile_api/models/data_manage"
 	"hongze/hongze_ETA_mobile_api/models/system"
+	"hongze/hongze_ETA_mobile_api/services/alarm_msg"
 	"hongze/hongze_ETA_mobile_api/utils"
 	"math"
 	"sort"
@@ -992,3 +993,43 @@ func GetEdbDataMapList(chartInfoId, chartType int, calendar, startDate, endDate
 	edbDataListMap, edbList, err = getEdbDataMapList(chartInfoId, chartType, calendar, startDate, endDate, mappingList)
 	return
 }
+
+// BatchChartInfoRefreshV2 图表批量刷新
+// @author Roc
+// @datetime 2022-09-16 10:15:38
+// @description 将原来自己写的一套获取所有关联指标,然后刷新指标逻辑 改成  只获取使用的指标id,然后遍历去调用“指标刷新服务”
+func BatchChartInfoRefreshV2(chartInfoList []*data_manage.ChartInfo) (err error) {
+	if len(chartInfoList) <= 0 {
+		return
+	}
+	chartInfoIdSlice := make([]int, 0)
+	for _, chartInfo := range chartInfoList {
+		chartInfoIdSlice = append(chartInfoIdSlice, chartInfo.ChartInfoId)
+	}
+
+	var errmsg string
+	defer func() {
+		if err != nil {
+			go alarm_msg.SendAlarmMsg("ChartInfoRefresh:"+errmsg, 3)
+			//go utils.SendEmail(utils.APPNAME+"【"+utils.RunMode+"】"+"失败提醒", "ChartInfoRefresh:"+errmsg, utils.EmailSendToUsers)
+			fmt.Println("ChartInfoRefresh Err:" + errmsg)
+		}
+	}()
+
+	edbIdList := make([]int, 0)
+	edbInfoIdMap := make(map[int]int)
+	edbMappingList, err := data_manage.GetChartEdbMappingListByIdList(chartInfoIdSlice)
+	for _, v := range edbMappingList {
+		if _, ok := edbInfoIdMap[v.EdbInfoId]; !ok {
+			edbIdList = append(edbIdList, v.EdbInfoId)
+			edbInfoIdMap[v.EdbInfoId] = v.EdbInfoId
+		}
+	}
+
+	// 批量刷新
+	err = EdbInfoRefreshAllFromBaseV3(edbIdList, false)
+	if err != nil {
+		return
+	}
+	return
+}

+ 543 - 0
services/data/edb_info.go

@@ -1,5 +1,15 @@
 package data
 
+import (
+	"errors"
+	"fmt"
+	"hongze/hongze_ETA_mobile_api/models/data_manage"
+	"hongze/hongze_ETA_mobile_api/services/alarm_msg"
+	"hongze/hongze_ETA_mobile_api/utils"
+	"sort"
+	"time"
+)
+
 // 获取频度的英文版
 func GetFrequencyEn(frequency string) (frequencyEn string) {
 	switch frequency {
@@ -45,3 +55,536 @@ func GetLeadUnitEn(unit string) (unitEn string) {
 	}
 	return
 }
+
+// EdbInfoRefreshAllFromBaseV3 全部刷新指标(切换到edb_lib服务)
+// @author Roc
+// @datetime 2022-09-16 11:04:44
+// @description 将原有的单个指标刷新,调整为批量多个指标刷新
+func EdbInfoRefreshAllFromBaseV3(edbInfoIdList []int, refreshAll bool) (err error) {
+	var errmsg string
+	defer func() {
+		if err != nil {
+			fmt.Println("EdbInfoRefreshAllFromBaseV2 Err:" + err.Error() + ";errmsg:" + errmsg)
+			go alarm_msg.SendAlarmMsg("EdbInfoRefreshFromBaseV2,Err"+err.Error()+";errMsg:"+errmsg, 3)
+			//go utils.SendEmail(utils.APPNAME+"【"+utils.RunMode+"】"+"失败提醒", "EdbInfoRefreshFromBase:"+errmsg, utils.EmailSendToUsers)
+		}
+	}()
+
+	// 获取关联的基础指标
+	newBaseEdbInfoArr, newBasePredictEdbInfoArr, newCalculateMap, newPredictCalculateMap, calculateArr, predictCalculateArr, err, errmsg := getRefreshEdbInfoListByIds(edbInfoIdList)
+	if err != nil {
+		return
+	}
+	var startDate string
+	for _, bv := range newBaseEdbInfoArr {
+		//source := bv.Source
+		//edbInfoId := bv.EdbInfoId
+		//edbCode := bv.EdbCode
+		if bv.StartDate == "0000-00-00" {
+			continue
+		}
+		//开始时间
+		startDate = ``
+		if refreshAll { //刷新所有数据,用开始时间作为起始日期去刷新
+			sTime, err := time.Parse(utils.FormatDate, bv.StartDate)
+			if err != nil {
+				return err
+			}
+			startDate = sTime.Format(utils.FormatDate)
+		} else {
+			sTime, err := time.Parse(utils.FormatDate, bv.EndDate)
+			if err != nil {
+				return err
+			}
+			frequency := bv.Frequency
+			var limitDay int
+			switch frequency {
+			case "日度":
+				limitDay = utils.DATA_START_REFRESH_LIMIT
+			case "周度":
+				limitDay = utils.DATA_START_REFRESH_LIMIT * 7
+			case "月度":
+				limitDay = utils.DATA_START_REFRESH_LIMIT * 30
+			case "季度":
+				limitDay = utils.DATA_START_REFRESH_LIMIT * 90
+			case "年度":
+				limitDay = utils.DATA_START_REFRESH_LIMIT * 365
+			default:
+				limitDay = utils.DATA_START_REFRESH_LIMIT
+			}
+			startDate = sTime.AddDate(0, 0, -limitDay).Format(utils.FormatDate)
+		}
+		result, err := RefreshEdbData(bv.EdbInfoId, bv.Source, bv.EdbCode, startDate)
+		if err != nil {
+			fmt.Println(bv.EdbInfoId, "RefreshBaseEdbData err", time.Now())
+			errmsg = "RefreshBaseEdbData Err:" + err.Error()
+			return err
+		}
+		if result.Ret != 200 {
+			fmt.Println(bv.EdbInfoId, "RefreshBaseEdbData err;msg:", result.Msg, ";errMsg:", result.ErrMsg)
+			errmsg = fmt.Sprint(bv.EdbInfoId, "RefreshBaseEdbData err;msg:", result.Msg, ";errMsg:", result.ErrMsg)
+			return fmt.Errorf("刷新失败, err:", errmsg)
+		}
+
+		//maxAndMinItem, err := data_manage.GetEdbInfoMaxAndMinInfo(source, edbCode)
+		//if err != nil {
+		//	if err.Error() == utils.ErrNoRow() { //找不到数据,那么就进入到下一条数据做处理
+		//		continue
+		//	}
+		//	return err
+		//}
+		//if maxAndMinItem != nil {
+		//	err = data_manage.ModifyEdbInfoMaxAndMinInfo(edbInfoId, maxAndMinItem)
+		//	if err != nil {
+		//		return err
+		//	}
+		//}
+		fmt.Println("end newBaseEdbInfoArr:", bv, time.Now())
+	}
+
+	//刷新相关普通计算指标
+	for _, v := range calculateArr {
+		edbInfo := newCalculateMap[v]
+		if edbInfo == nil {
+			return err
+		}
+
+		//计算指标就不用开始时间了吧,因为存在说开始时间变更的情况
+		startDate = ``
+		if !refreshAll { //如果不是全部更新,那么以指标的开始时间作为刷新
+			startDate = edbInfo.StartDate
+			source := edbInfo.Source
+			if startDate == "" || startDate == "0000-00-00" { //如果没有开始日期,说明还没有计算出来数据,那么就往前面推40年吧(也意味着重新计算了)
+				startDate = time.Now().AddDate(-40, 0, 0).Format(utils.FormatDate)
+			} else {
+				if source == utils.DATA_SOURCE_CALCULATE {
+					sTime, err := time.Parse(utils.FormatDate, edbInfo.EndDate)
+					if err != nil {
+						return err
+					}
+					frequency := edbInfo.Frequency
+					var limitDay int
+					switch frequency {
+					case "日度":
+						limitDay = utils.DATA_START_REFRESH_LIMIT
+					case "周度":
+						limitDay = utils.DATA_START_REFRESH_LIMIT * 7
+					case "月度":
+						limitDay = utils.DATA_START_REFRESH_LIMIT * 30
+					case "季度":
+						limitDay = utils.DATA_START_REFRESH_LIMIT * 90
+					case "年度":
+						limitDay = utils.DATA_START_REFRESH_LIMIT * 365
+					default:
+						limitDay = utils.DATA_START_REFRESH_LIMIT
+					}
+					startDate = sTime.AddDate(0, 0, -limitDay).Format(utils.FormatDate)
+				}
+			}
+		}
+
+		result, err := RefreshEdbCalculateData(edbInfo.EdbInfoId, edbInfo.EdbCode, startDate)
+		if err != nil {
+			fmt.Println(v, "RefreshEdbCalculateData err", time.Now())
+			errmsg = "RefreshEdbCalculateData Err:" + err.Error()
+			return err
+		}
+		if result.Ret != 200 {
+			fmt.Println(v, "RefreshEdbCalculateData err;msg:", result.Msg, ";errMsg:", result.ErrMsg)
+			errmsg = fmt.Sprint(v, "RefreshEdbCalculateData err;msg:", result.Msg, ";errMsg:", result.ErrMsg)
+			return fmt.Errorf("刷新失败")
+		}
+	}
+
+	//刷新相关预测计算指标
+	for _, v := range predictCalculateArr {
+		edbInfo := newPredictCalculateMap[v]
+		if edbInfo == nil {
+			return err
+		}
+		startDate = edbInfo.StartDate
+		source := edbInfo.Source
+		if startDate == "" || startDate == "0000-00-00" { //如果没有开始日期,说明还没有计算出来数据,那么就往前面推40年吧(也意味着重新计算了)
+			startDate = time.Now().AddDate(-40, 0, 0).Format(utils.FormatDate)
+		} else {
+			if source == utils.DATA_SOURCE_PREDICT_CALCULATE {
+				startDate = ``
+				if refreshAll { //刷新所有数据,用开始时间作为起始日期去刷新
+					startDate = edbInfo.StartDate
+				} else {
+					sTime, err := time.Parse(utils.FormatDate, edbInfo.EndDate)
+					if err != nil {
+						return err
+					}
+					frequency := edbInfo.Frequency
+					var limitDay int
+					switch frequency {
+					case "日度":
+						limitDay = utils.DATA_START_REFRESH_LIMIT
+					case "周度":
+						limitDay = utils.DATA_START_REFRESH_LIMIT * 7
+					case "月度":
+						limitDay = utils.DATA_START_REFRESH_LIMIT * 30
+					case "季度":
+						limitDay = utils.DATA_START_REFRESH_LIMIT * 90
+					case "年度":
+						limitDay = utils.DATA_START_REFRESH_LIMIT * 365
+					default:
+						limitDay = utils.DATA_START_REFRESH_LIMIT
+					}
+					startDate = sTime.AddDate(0, 0, -limitDay).Format(utils.FormatDate)
+				}
+			}
+		}
+
+		result, err := RefreshPredictEdbCalculateData(edbInfo.EdbInfoId, edbInfo.EdbCode, startDate)
+		if err != nil {
+			fmt.Println(v, "RefreshEdbCalculateData err", time.Now())
+			errmsg = "RefreshEdbCalculateData Err:" + err.Error()
+			return err
+		}
+		if result.Ret != 200 {
+			fmt.Println(v, "RefreshPredictEdbCalculateData err;msg:", result.Msg, ";errMsg:", result.ErrMsg)
+			errmsg = fmt.Sprint(v, "RefreshPredictEdbCalculateData err;msg:", result.Msg, ";errMsg:", result.ErrMsg)
+			return fmt.Errorf("刷新失败")
+		}
+	}
+
+	// 4、更新动态环差值
+	{
+		predictEdbInfoIdList := make([]int, 0)
+		for _, v := range newBasePredictEdbInfoArr {
+			predictEdbInfoIdList = append(predictEdbInfoIdList, v.EdbInfoId)
+		}
+		fmt.Println("predictEdbConfCalculateMappingDetailList:", predictEdbInfoIdList)
+		predictEdbConfCalculateMappingDetailList, err := data_manage.GetPredictEdbConfCalculateMappingDetailListByEdbInfoId(predictEdbInfoIdList)
+		if err != nil {
+			errmsg = fmt.Sprint("更新动态环差值时,获取数据失败:" + err.Error())
+			return fmt.Errorf("刷新失败, err:", errmsg)
+		}
+		for _, bv := range predictEdbConfCalculateMappingDetailList {
+			result, err := RefreshEdbData(bv.EdbInfoId, utils.DATA_SOURCE_PREDICT, bv.EdbCode, "")
+			if err != nil {
+				fmt.Println(bv.EdbInfoId, "RefreshBasePredictEdbData err", time.Now())
+				errmsg = "RefreshBasePredictEdbData Err:" + err.Error()
+				return err
+			}
+			if result.Ret != 200 {
+				fmt.Println(bv.EdbInfoId, "RefreshBasePredictEdbData err;msg:", result.Msg, ";errMsg:", result.ErrMsg)
+				errmsg = fmt.Sprint(bv.EdbInfoId, "RefreshBasePredictEdbData err;msg:", result.Msg, ";errMsg:", result.ErrMsg)
+				return fmt.Errorf("刷新失败, err:%s", errmsg)
+			}
+			fmt.Println("end predictEdbConfCalculateMappingDetailList:", bv, time.Now())
+		}
+	}
+
+	//5、再次刷新相关预测计算指标
+	for _, v := range predictCalculateArr {
+		edbInfo := newPredictCalculateMap[v]
+		if edbInfo == nil {
+			return err
+		}
+		startDate = edbInfo.StartDate
+		source := edbInfo.Source
+		if startDate == "" || startDate == "0000-00-00" { //如果没有开始日期,说明还没有计算出来数据,那么就往前面推40年吧(也意味着重新计算了)
+			startDate = time.Now().AddDate(-40, 0, 0).Format(utils.FormatDate)
+		} else {
+			if source == utils.DATA_SOURCE_PREDICT_CALCULATE {
+				startDate = ``
+				if refreshAll { //刷新所有数据,用开始时间作为起始日期去刷新
+					startDate = edbInfo.StartDate
+				} else {
+					sTime, err := time.Parse(utils.FormatDate, edbInfo.EndDate)
+					if err != nil {
+						return err
+					}
+					frequency := edbInfo.Frequency
+					var limitDay int
+					switch frequency {
+					case "日度":
+						limitDay = utils.DATA_START_REFRESH_LIMIT
+					case "周度":
+						limitDay = utils.DATA_START_REFRESH_LIMIT * 7
+					case "月度":
+						limitDay = utils.DATA_START_REFRESH_LIMIT * 30
+					case "季度":
+						limitDay = utils.DATA_START_REFRESH_LIMIT * 90
+					case "年度":
+						limitDay = utils.DATA_START_REFRESH_LIMIT * 365
+					default:
+						limitDay = utils.DATA_START_REFRESH_LIMIT
+					}
+					startDate = sTime.AddDate(0, 0, -limitDay).Format(utils.FormatDate)
+				}
+			}
+		}
+
+		result, err := RefreshPredictEdbCalculateData(edbInfo.EdbInfoId, edbInfo.EdbCode, startDate)
+		if err != nil {
+			fmt.Println(v, "RefreshEdbCalculateData err", time.Now())
+			errmsg = "RefreshEdbCalculateData Err:" + err.Error()
+			return err
+		}
+		if result.Ret != 200 {
+			fmt.Println(v, "RefreshPredictEdbCalculateData err;msg:", result.Msg, ";errMsg:", result.ErrMsg)
+			errmsg = fmt.Sprint(v, "RefreshPredictEdbCalculateData err;msg:", result.Msg, ";errMsg:", result.ErrMsg)
+			return fmt.Errorf("刷新失败")
+		}
+	}
+
+	return err
+}
+
+// getRefreshEdbInfoList 获取待更新的指标(普通基础指标、普通运算指标,预测运算指标)
+func getRefreshEdbInfoListByIds(edbInfoIdList []int) (newBaseEdbInfoArr, newBasePredictEdbInfoArr []*data_manage.EdbInfo, newCalculateMap, newPredictCalculateMap map[int]*data_manage.EdbInfo, calculateArr, predictCalculateArr []int, err error, errMsg string) {
+	calculateList, err := data_manage.GetEdbInfoAllCalculateByEdbInfoIdList(edbInfoIdList)
+	if err != nil && err.Error() != utils.ErrNoRow() {
+		err = errors.New("GetEdbInfoAllCalculate Err:" + err.Error())
+		return
+	}
+	// 获取指标信息
+	edbInfoList, err := data_manage.GetEdbInfoByIdList(edbInfoIdList)
+	if err != nil {
+		err = errors.New("GetEdbInfoAllCalGetEdbInfoByIdr:" + err.Error())
+		return
+	}
+
+	baseEdbInfoArr := make([]*data_manage.EdbInfo, 0)          // 基础普通指标
+	calculateInfoArr := make([]*data_manage.EdbInfo, 0)        //基础运算指标
+	basePredictEdbInfoArr := make([]*data_manage.EdbInfo, 0)   // 预测普通指标
+	predictCalculateInfoArr := make([]*data_manage.EdbInfo, 0) //预测运算指标
+
+	for _, baseEdbInfo := range edbInfoList {
+		if baseEdbInfo.EdbInfoType == 0 { //普通指标
+			switch baseEdbInfo.EdbType {
+			case 1: //基础指标
+				baseEdbInfoArr = append(baseEdbInfoArr, baseEdbInfo)
+			case 2: //计算指标
+				calculateList = append(calculateList, baseEdbInfo)
+			}
+		} else { //预测指标
+			switch baseEdbInfo.EdbType {
+			case 1: //基础指标
+				basePredictEdbInfoArr = append(basePredictEdbInfoArr, baseEdbInfo)
+			case 2: //计算指标
+				predictCalculateInfoArr = append(predictCalculateInfoArr, baseEdbInfo)
+			}
+		}
+	}
+
+	// 计算指标
+	for _, v := range calculateList {
+		getBaseEdbInfoArr, getCalculateInfoArr, tmpErr := data_manage.GetRefreshEdbInfoFromBase(v.EdbInfoId, v.Source)
+		if tmpErr != nil {
+			err = tmpErr
+			fmt.Println("GetRefreshEdbInfoFromBase err:" + err.Error())
+			errMsg = "获取需要刷新的指标失败:Err:" + err.Error()
+			return
+		}
+		for _, tmpEdbInfo := range getBaseEdbInfoArr {
+			switch tmpEdbInfo.EdbInfoType {
+			case 0: //普通基础指标
+				baseEdbInfoArr = append(baseEdbInfoArr, tmpEdbInfo)
+			case 1: //预测基础指标
+				basePredictEdbInfoArr = append(basePredictEdbInfoArr, tmpEdbInfo)
+			}
+		}
+
+		for _, tmpEdbInfo := range getCalculateInfoArr {
+			switch tmpEdbInfo.EdbInfoType {
+			case 0: //普通运算指标
+				calculateInfoArr = append(calculateInfoArr, tmpEdbInfo)
+			case 1: //预测运算指标
+				//predictCalculateInfoArr = append(predictCalculateInfoArr, tmpEdbInfo)
+				if tmpEdbInfo.EdbType == 1 { //预测普通指标
+					basePredictEdbInfoArr = append(basePredictEdbInfoArr, tmpEdbInfo)
+				} else {
+					predictCalculateInfoArr = append(predictCalculateInfoArr, tmpEdbInfo)
+				}
+			}
+		}
+		switch v.EdbInfoType {
+		case 0: //普通运算指标
+			calculateInfoArr = append(calculateInfoArr, v)
+		case 1: //预测指标
+			if v.EdbType == 1 { //预测普通指标
+				basePredictEdbInfoArr = append(basePredictEdbInfoArr, v)
+			} else {
+				predictCalculateInfoArr = append(predictCalculateInfoArr, v)
+			}
+		}
+	}
+
+	// 预测计算指标
+	for _, v := range predictCalculateInfoArr {
+		getBaseEdbInfoArr, getCalculateInfoArr, tmpErr := data_manage.GetRefreshEdbInfoFromBase(v.EdbInfoId, v.Source)
+		if tmpErr != nil {
+			err = tmpErr
+			fmt.Println("GetRefreshEdbInfoFromBase err:" + err.Error())
+			errMsg = "获取需要刷新的指标失败:Err:" + err.Error()
+			return
+		}
+		for _, tmpEdbInfo := range getBaseEdbInfoArr {
+			switch tmpEdbInfo.EdbInfoType {
+			case 0: //普通基础指标
+				baseEdbInfoArr = append(baseEdbInfoArr, tmpEdbInfo)
+			case 1: //预测基础指标
+				if tmpEdbInfo.EdbType == 1 { //预测普通指标
+					basePredictEdbInfoArr = append(basePredictEdbInfoArr, tmpEdbInfo)
+				} else {
+					predictCalculateInfoArr = append(predictCalculateInfoArr, tmpEdbInfo)
+				}
+				//basePredictEdbInfoArr = append(basePredictEdbInfoArr, tmpEdbInfo)
+			}
+		}
+
+		for _, tmpEdbInfo := range getCalculateInfoArr {
+			switch tmpEdbInfo.EdbInfoType {
+			case 0: //普通运算指标
+				calculateInfoArr = append(calculateInfoArr, tmpEdbInfo)
+			case 1: //预测运算指标
+				if tmpEdbInfo.EdbType == 1 { //预测普通指标
+					basePredictEdbInfoArr = append(basePredictEdbInfoArr, tmpEdbInfo)
+				} else {
+					predictCalculateInfoArr = append(predictCalculateInfoArr, tmpEdbInfo)
+				}
+				//predictCalculateInfoArr = append(predictCalculateInfoArr, tmpEdbInfo)
+			}
+		}
+		switch v.EdbInfoType {
+		case 0: //普通运算指标
+			calculateInfoArr = append(calculateInfoArr, v)
+		case 1: //预测指标
+			if v.EdbType == 1 { //预测普通指标
+				basePredictEdbInfoArr = append(basePredictEdbInfoArr, v)
+			} else {
+				predictCalculateInfoArr = append(predictCalculateInfoArr, v)
+			}
+		}
+	}
+
+	// 第一次的计算指标map
+	newCalculateMap = make(map[int]*data_manage.EdbInfo)
+	for _, v := range calculateInfoArr {
+		if _, ok := newCalculateMap[v.EdbInfoId]; !ok {
+			calculateArr = append(calculateArr, v.EdbInfoId)
+		}
+		newCalculateMap[v.EdbInfoId] = v
+	}
+
+	// 基础预测指标
+	if len(basePredictEdbInfoArr) > 0 {
+		basePredictEdbInfoIdList := make([]int, 0)
+		for _, v := range basePredictEdbInfoArr {
+			basePredictEdbInfoIdList = append(basePredictEdbInfoIdList, v.EdbInfoId)
+		}
+		baseEdbInfoList, tmpErr := data_manage.GetPredictEdbInfoAllCalculate(basePredictEdbInfoIdList)
+		if tmpErr != nil {
+			err = tmpErr
+			return
+		}
+
+		tmpCalculateList := make([]*data_manage.EdbInfo, 0)
+		for _, v := range baseEdbInfoList {
+			switch v.EdbType {
+			case 1:
+				baseEdbInfoArr = append(baseEdbInfoArr, v)
+			case 2:
+				// 如果不在第一次里面,那么在第二次 刷新预测指标的时候 需要加进去
+				if _, ok := newCalculateMap[v.EdbInfoId]; !ok {
+					tmpCalculateList = append(tmpCalculateList, v)
+				}
+			}
+		}
+
+		// 这里是查询预测指标用到的 普通计算指标
+		for _, v := range tmpCalculateList {
+			getBaseEdbInfoArr, getCalculateInfoArr, tmpErr := data_manage.GetRefreshEdbInfoFromBase(v.EdbInfoId, v.Source)
+			if tmpErr != nil {
+				err = tmpErr
+				fmt.Println("GetRefreshEdbInfoFromBase err:" + err.Error())
+				errMsg = "获取需要刷新的指标失败:Err:" + err.Error()
+				return
+			}
+
+			// 基础指标
+			for _, tmpEdbInfo := range getBaseEdbInfoArr {
+				switch tmpEdbInfo.EdbInfoType {
+				case 0: //普通基础指标
+					baseEdbInfoArr = append(baseEdbInfoArr, tmpEdbInfo)
+				case 1: //预测基础指标
+					basePredictEdbInfoArr = append(basePredictEdbInfoArr, tmpEdbInfo)
+				}
+			}
+
+			// 计算指标
+			for _, tmpEdbInfo := range getCalculateInfoArr {
+				switch tmpEdbInfo.EdbInfoType {
+				case 0: //普通运算指标
+					calculateInfoArr = append(calculateInfoArr, tmpEdbInfo)
+				case 1: //预测运算指标
+					if v.EdbType == 1 { //预测普通指标
+						basePredictEdbInfoArr = append(basePredictEdbInfoArr, tmpEdbInfo)
+					} else {
+						predictCalculateInfoArr = append(predictCalculateInfoArr, tmpEdbInfo)
+					}
+				}
+			}
+
+			switch v.EdbInfoType {
+			case 0: //普通运算指标
+				calculateInfoArr = append(calculateInfoArr, v)
+			case 1: //预测指标
+				if v.EdbType == 1 { //预测普通指标
+					basePredictEdbInfoArr = append(basePredictEdbInfoArr, v)
+				} else { //预测运算指标
+					predictCalculateInfoArr = append(predictCalculateInfoArr, v)
+				}
+			}
+		}
+
+		// 第二次计算指标的map
+		for _, v := range calculateInfoArr {
+			if _, ok := newCalculateMap[v.EdbInfoId]; !ok {
+				calculateArr = append(calculateArr, v.EdbInfoId)
+			}
+			newCalculateMap[v.EdbInfoId] = v
+		}
+	}
+
+	// 普通基础指标去重
+	newBaseEdbInfoArr = make([]*data_manage.EdbInfo, 0)
+	baseMap := make(map[int]int)
+	for _, v := range baseEdbInfoArr {
+		if _, ok := baseMap[v.EdbInfoId]; !ok {
+			newBaseEdbInfoArr = append(newBaseEdbInfoArr, v)
+		}
+		baseMap[v.EdbInfoId] = v.EdbInfoId
+	}
+
+	// 普通计算指标的id
+	sort.Ints(calculateArr)
+
+	// 普通预测指标去重
+	newBasePredictEdbInfoArr = make([]*data_manage.EdbInfo, 0)
+	basePredictMap := make(map[int]int)
+	for _, v := range basePredictEdbInfoArr {
+		if _, ok := basePredictMap[v.EdbInfoId]; !ok {
+			newBasePredictEdbInfoArr = append(newBasePredictEdbInfoArr, v)
+		}
+		basePredictMap[v.EdbInfoId] = v.EdbInfoId
+	}
+
+	// 预测计算指标去重
+	newPredictCalculateMap = make(map[int]*data_manage.EdbInfo)
+	for _, v := range predictCalculateInfoArr {
+		if _, ok := newPredictCalculateMap[v.EdbInfoId]; !ok {
+			predictCalculateArr = append(predictCalculateArr, v.EdbInfoId)
+		}
+		newPredictCalculateMap[v.EdbInfoId] = v
+	}
+	// 预测计算指标的id
+	sort.Ints(predictCalculateArr)
+
+	return
+}

Some files were not shown because too many files changed in this diff