Pārlūkot izejas kodu

Merge branch 'master' of http://8.136.199.33:3000/eta_server/eta_api into bzq1/admin

zqbao 10 mēneši atpakaļ
vecāks
revīzija
7e1a9838de
90 mainītis faili ar 5022 papildinājumiem un 8813 dzēšanām
  1. 10 0
      controllers/base_auth.go
  2. 1 1
      controllers/data_manage/bloomberg_data.go
  3. 591 0
      controllers/data_manage/business_data.go
  4. 139 0
      controllers/data_manage/chart_info.go
  5. 3 2
      controllers/data_manage/chart_theme.go
  6. 40 58
      controllers/data_manage/edb_info.go
  7. 9 5
      controllers/data_manage/edb_info_calculate.go
  8. 10 7
      controllers/data_manage/edb_info_refresh.go
  9. 10 2
      controllers/data_manage/multiple_graph_config.go
  10. 1 1
      controllers/data_manage/mysteel_chemical_data.go
  11. 3 33
      controllers/data_manage/predict_edb_info.go
  12. 1 1
      controllers/data_manage/supply_analysis/variety_edb.go
  13. 1 0
      controllers/data_stat/edb_source_stat.go
  14. 58 40
      controllers/english_report/email.go
  15. 72 144
      controllers/english_report/report.go
  16. 1 1
      controllers/ppt_v2_group.go
  17. 5 4
      controllers/report.go
  18. 31 14
      controllers/report_approve/report_approve_flow.go
  19. 3 3
      controllers/smart_report/smart_report.go
  20. 5 2
      controllers/sys_admin.go
  21. 56 15
      controllers/target.go
  22. 1 1
      controllers/trade_analysis/trade_analysis.go
  23. 22 0
      go.mod
  24. 204 1
      go.sum
  25. 252 0
      models/data_manage/base_from_business_index.go
  26. 10 0
      models/data_manage/chart_edb_mapping.go
  27. 197 38
      models/data_manage/chart_info.go
  28. 0 79
      models/data_manage/edb_data_baiinfo.go
  29. 92 10
      models/data_manage/edb_data_base.go
  30. 0 174
      models/data_manage/edb_data_calculate.go
  31. 0 27
      models/data_manage/edb_data_calculate_ljztbpj.go
  32. 0 3
      models/data_manage/edb_data_calculate_tbz.go
  33. 0 1
      models/data_manage/edb_data_calculate_tcz.go
  34. 0 552
      models/data_manage/edb_data_calculate_time_shift.go
  35. 0 34
      models/data_manage/edb_data_calculate_zjpj.go
  36. 0 270
      models/data_manage/edb_data_cffex.go
  37. 0 227
      models/data_manage/edb_data_coal.go
  38. 1 54
      models/data_manage/edb_data_fubao.go
  39. 0 316
      models/data_manage/edb_data_gl.go
  40. 161 5
      models/data_manage/edb_data_insert_config.go
  41. 0 315
      models/data_manage/edb_data_lz.go
  42. 2 194
      models/data_manage/edb_data_quarter.go
  43. 0 87
      models/data_manage/edb_data_sci.go
  44. 0 63
      models/data_manage/edb_data_ths_ds.go
  45. 0 48
      models/data_manage/edb_data_wind_wsd.go
  46. 226 516
      models/data_manage/edb_info.go
  47. 0 90
      models/data_manage/edb_info_calculate.go
  48. 0 601
      models/data_manage/edb_info_calculate_bp.go
  49. 0 526
      models/data_manage/edb_info_calculate_hbz.go
  50. 0 540
      models/data_manage/edb_info_calculate_hcz.go
  51. 0 650
      models/data_manage/edb_info_calculate_ljztbpj.go
  52. 0 798
      models/data_manage/edb_info_calculate_ljzzy.go
  53. 0 373
      models/data_manage/edb_info_calculate_nszydpjjs.go
  54. 0 319
      models/data_manage/edb_info_calculate_tbz.go
  55. 0 1019
      models/data_manage/edb_info_calculate_tcz.go
  56. 0 4
      models/data_manage/edb_info_calculate_time_shift.go
  57. 0 286
      models/data_manage/edb_info_calculate_zjpj.go
  58. 12 8
      models/data_manage/edb_refresh/edb_refresh_source.go
  59. 1 0
      models/data_manage/edb_source.go
  60. 26 0
      models/data_manage/request/business_data.go
  61. 7 6
      models/data_manage/trade_analysis/trade_analysis.go
  62. 19 17
      models/data_stat/edb_info_stat_column.go
  63. 0 10
      models/db.go
  64. 59 2
      models/english_report.go
  65. 26 15
      models/english_report_email_log.go
  66. 419 0
      models/mgo/base_from_business_data.go
  67. 511 0
      models/mgo/edb_data_business.go
  68. 274 0
      models/mgo_base.go
  69. 90 0
      routers/commentsRouter.go
  70. 1 0
      routers/router.go
  71. 2 2
      services/aliyun_email.go
  72. 25 0
      services/data/base_edb_lib.go
  73. 106 0
      services/data/base_from_business.go
  74. 125 0
      services/data/edb_data.go
  75. 42 1
      services/data/edb_info.go
  76. 0 103
      services/data/edb_info_calculate.go
  77. 6 2
      services/data/mysteel_chemical.go
  78. 9 1
      services/data/trade_analysis/trade_analysis.go
  79. 94 70
      services/english_report.go
  80. 506 0
      services/eta_forum/eta_forum_hub.go
  81. 114 0
      services/eta_forum/eta_forum_hub_lib.go
  82. 29 12
      services/ppt/ppt_group.go
  83. 6 2
      services/report.go
  84. 16 6
      services/smart_report.go
  85. BIN
      static/Data Import Template.xlsx
  86. 54 0
      static/ErrMsgConfig.json
  87. 50 2
      utils/config.go
  88. 1 0
      utils/constants.go
  89. 37 0
      utils/logs.go
  90. 137 0
      utils/mgodb/mgo_config.go

+ 10 - 0
controllers/base_auth.go

@@ -281,6 +281,16 @@ func (c *BaseAuthController) ServeJSON(encoding ...bool) {
 		}
 	}
 
+	if utils.ViperConfig != nil {
+		if c.Lang == utils.EnLangVersion {
+			msg := c.Data["json"].(*models.BaseResponse).Msg
+			if utils.ViperConfig.InConfig(msg) {
+				c.Data["json"].(*models.BaseResponse).Msg = utils.ViperConfig.GetString(msg)
+			}
+		}
+	}
+
+
 	//新增uuid记录
 	{
 		if _, ok := AdminOperateRecordMap[urlPath]; !ok && !strings.Contains(urlPath, "cygx") {

+ 1 - 1
controllers/data_manage/bloomberg_data.go

@@ -357,7 +357,7 @@ func (this *BloombergDataController) NameCheck() {
 	}
 
 	// 重名校验
-	edbList, e := data_manage.GetEdbInfoByNameArr(indexNames)
+	edbList, e := data_manage.GetEdbInfoByNameArr(indexNames, utils.EDB_INFO_TYPE)
 	if e != nil {
 		br.Msg = "操作失败"
 		br.ErrMsg = "获取重名指标失败, Err: " + e.Error()

+ 591 - 0
controllers/data_manage/business_data.go

@@ -0,0 +1,591 @@
+package data_manage
+
+import (
+	"encoding/json"
+	"eta/eta_api/controllers"
+	"eta/eta_api/models"
+	"eta/eta_api/models/data_manage"
+	"eta/eta_api/models/data_manage/request"
+	"eta/eta_api/models/system"
+	"eta/eta_api/services/data"
+	etaTrialService "eta/eta_api/services/eta_trial"
+	"eta/eta_api/utils"
+	"fmt"
+	"github.com/rdlucklib/rdluck_tools/paging"
+	"strconv"
+	"strings"
+	"time"
+)
+
+// EdbBusinessController 自有数据(商家)
+type EdbBusinessController struct {
+	controllers.BaseAuthController
+}
+
+// SourceList
+// @Title 来源列表
+// @Description 来源列表接口
+// @Success 200 {object} []*data_manageEdbBusinessSource
+// @router /business_data/source/list [get]
+func (c *EdbBusinessController) SourceList() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		c.Data["json"] = br
+		c.ServeJSON()
+	}()
+
+	obj := data_manage.EdbBusinessSource{}
+	list, err := obj.GetAllList()
+	if err != nil && err.Error() != utils.ErrNoRow() {
+		br.Msg = "获取失败"
+		br.ErrMsg = "获取数据失败,Err:" + err.Error()
+		return
+	}
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "获取成功"
+	br.Data = list
+}
+
+// List
+// @Title 获取指标列表
+// @Description 获取指标列表接口
+// @Param   PageSize   query   int  true       "每页数据条数"
+// @Param   CurrentIndex   query   int  true       "当前页页码,从1开始"
+// @Param   Frequency   query   string  true       "频度"
+// @Param   Source   query   int  true       "来源"
+// @Param   Keywords   query   string  true       "编码/名称关键词"
+// @Success 200 {object} models.DataListResp
+// @router /business_data/list [get]
+func (c *EdbBusinessController) List() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		c.Data["json"] = br
+		c.ServeJSON()
+	}()
+
+	req := &request.BusinessDataListReq{}
+	if e := c.ParseForm(req); e != nil {
+		br.Msg = "获取失败"
+		br.ErrMsg = "参数解析失败, Err: " + e.Error()
+		return
+	}
+
+	pageSize := req.PageSize
+	currentIndex := req.CurrentIndex
+	keywords := req.Keywords
+	frequency := req.Frequency
+	source := req.Source
+
+	var startSize int
+	if pageSize <= 0 {
+		pageSize = utils.PageSize20
+	}
+	if currentIndex <= 0 {
+		currentIndex = 1
+	}
+	startSize = utils.StartIndex(currentIndex, pageSize)
+
+	var condition string
+	var pars []interface{}
+
+	if keywords != "" {
+		keywordSlice := strings.Split(keywords, " ")
+		if len(keywordSlice) > 0 {
+			tmpConditionSlice := make([]string, 0)
+			tmpConditionSlice = append(tmpConditionSlice, ` a.index_name like ? or a.index_code like ? `)
+			pars = utils.GetLikeKeywordPars(pars, keywords, 2)
+
+			for _, v := range keywordSlice {
+				if v == ` ` || v == `` {
+					continue
+				}
+				tmpConditionSlice = append(tmpConditionSlice, ` a.index_name like ? or a.index_code like ? `)
+				pars = utils.GetLikeKeywordPars(pars, v, 2)
+			}
+			condition += ` AND (` + strings.Join(tmpConditionSlice, " or ") + `)`
+
+		} else {
+			condition += ` a.index_name like ? or a.index_code like ? `
+			pars = utils.GetLikeKeywordPars(pars, keywords, 2)
+		}
+	}
+
+	if frequency != "" {
+		condition += ` AND a.frequency = ? `
+		pars = append(pars, frequency)
+	}
+
+	if source > 0 {
+		condition += ` AND a.source = ? `
+		pars = append(pars, source)
+	}
+
+	// 排序, 默认创建时间倒序
+	orderFields := map[int]string{
+		0: data_manage.BaseFromBusinessIndexCols.CreateTime, 1: data_manage.BaseFromBusinessIndexCols.StartDate,
+		2: data_manage.BaseFromBusinessIndexCols.EndDate,
+	}
+	orderType := map[int]string{0: "DESC", 1: "ASC", 2: "DESC"}
+	orderRule := ``
+
+	_, ok1 := orderFields[req.SortField]
+	_, ok2 := orderType[req.SortRule]
+	if ok1 && ok2 {
+		orderRule = fmt.Sprintf("%s %s", orderFields[req.SortField], orderType[req.SortRule])
+	}
+
+	obj := data_manage.BaseFromBusinessIndex{}
+
+	total, err := obj.GetListCount(condition, pars)
+	if err != nil {
+		br.Msg = "获取失败"
+		br.ErrMsg = "获取失败,Err:" + err.Error()
+		return
+	}
+	list, err := obj.GetPageItemsByCondition(condition, pars, orderRule, startSize, pageSize)
+	if err != nil {
+		br.Msg = "获取失败"
+		br.ErrMsg = "获取失败,Err:" + err.Error()
+		return
+	}
+	if len(list) <= 0 {
+		list = make([]*data_manage.BaseFromBusinessIndexItem, 0)
+	}
+
+	page := paging.GetPaging(currentIndex, pageSize, total)
+	resp := data_manage.BusinessIndexListResp{
+		List:   list,
+		Paging: page,
+	}
+
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "获取成功"
+	br.Data = resp
+}
+
+// AddCheck
+// @Title 新增校验
+// @Description 新增校验
+// @Param	request	body request.BusinessDataBatchAddCheckReq true "type json string"
+// @Success 200 string "操作成功"
+// @router /business_data/add_check [post]
+func (c *EdbBusinessController) AddCheck() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		if br.ErrMsg == "" {
+			br.IsSendEmail = false
+		}
+		c.Data["json"] = br
+		c.ServeJSON()
+	}()
+	sysUser := c.SysUser
+	if sysUser == nil {
+		br.Msg = "请登录"
+		br.ErrMsg = "请登录,SysUser Is Empty"
+		br.Ret = 408
+		return
+	}
+	var req *request.BusinessDataBatchAddCheckReq
+	if e := json.Unmarshal(c.Ctx.Input.RequestBody, &req); e != nil {
+		br.Msg = "参数解析异常!"
+		br.ErrMsg = "参数解析失败,Err:" + e.Error()
+		return
+	}
+	codeMax := 100
+	codeLen := len(req.IndexCodes)
+
+	// 获取指标库已有指标
+	existsEdb, e := data_manage.GetEdbCodesBySource(utils.DATA_SOURCE_BUSINESS)
+	if e != nil {
+		br.Msg = "获取失败"
+		br.ErrMsg = "获取自有数据已添加的指标失败, Err: " + e.Error()
+		return
+	}
+	existMap := make(map[string]*data_manage.EdbInfo)
+	for _, v := range existsEdb {
+		existMap[v.EdbCode] = v
+	}
+
+	list := make([]*data_manage.BaseFromBusinessIndexItem, 0)
+	obj := data_manage.BaseFromBusinessIndex{}
+	if !req.ListAll {
+		// 非全选-不需要频率等筛选条件
+		if codeLen == 0 {
+			br.Msg = "请选择指标"
+			return
+		}
+		if codeLen > codeMax {
+			br.Msg = fmt.Sprintf("最多只能选择%d个指标", codeMax)
+			return
+		}
+
+		// 查询选中的指标
+		cond := fmt.Sprintf(` AND %s IN (%s)`, data_manage.BaseFromBusinessIndexCols.IndexCode, utils.GetOrmInReplace(codeLen))
+		pars := make([]interface{}, 0)
+		pars = append(pars, req.IndexCodes)
+		list, e = obj.GeItemsByCondition(cond, pars, 0)
+		if e != nil {
+			br.Msg = "获取失败"
+			br.ErrMsg = "获取自有数据原始指标列表失败, Err: " + e.Error()
+			return
+		}
+	} else {
+		// 全选-需要频率等筛选条件
+		condition := ``
+		pars := make([]interface{}, 0)
+
+		// 筛选项
+		req.Keywords = strings.TrimSpace(req.Keywords)
+		if req.Keywords != "" {
+			keywordSlice := strings.Split(req.Keywords, " ")
+			if len(keywordSlice) > 0 {
+				tmpConditionSlice := make([]string, 0)
+				tmpConditionSlice = append(tmpConditionSlice, ` a.index_name like ? or a.index_code like ? `)
+				pars = utils.GetLikeKeywordPars(pars, req.Keywords, 2)
+
+				for _, v := range keywordSlice {
+					if v == ` ` || v == `` {
+						continue
+					}
+					tmpConditionSlice = append(tmpConditionSlice, ` a.index_name like ? or a.index_code like ? `)
+					pars = utils.GetLikeKeywordPars(pars, v, 2)
+				}
+				condition += ` AND (` + strings.Join(tmpConditionSlice, " or ") + `)`
+
+			} else {
+				condition += ` a.index_name like ? or a.index_code like ? `
+				pars = utils.GetLikeKeywordPars(pars, req.Keywords, 2)
+			}
+		}
+
+		if req.Frequency != "" {
+			condition += ` AND a.frequency = ? `
+			pars = append(pars, req.Frequency)
+		}
+
+		if req.Source > 0 {
+			condition += ` AND a.source = ? `
+			pars = append(pars, req.Source)
+		}
+
+		// 排除对应指标
+		if codeLen > 0 {
+			condition += fmt.Sprintf(` AND a.%s NOT IN (%s)`, data_manage.BaseFromBusinessIndexCols.IndexCode, utils.GetOrmInReplace(codeLen))
+			pars = append(pars, req.IndexCodes)
+		}
+		// 查询max+1个指标
+		list, e = obj.GeItemsByCondition(condition, pars, codeMax+1)
+		if e != nil {
+			br.Msg = "获取失败"
+			br.ErrMsg = "获取外部原始指标列表失败, Err: " + e.Error()
+			return
+		}
+	}
+
+	if len(list) > codeMax {
+		br.Msg = fmt.Sprintf("最多只能选择%d个指标", codeMax)
+		return
+	}
+
+	resp := make([]*data_manage.BaseFromBusinessIndexItem, 0)
+	for _, v := range list {
+		if v.EdbInfoId > 0 {
+			v.EdbExist = 1
+		}
+		resp = append(resp, v)
+	}
+
+	br.Data = resp
+	br.Msg = "校验成功"
+	br.Ret = 200
+	br.Success = true
+}
+
+// NameCheck
+// @Title 重名校验
+// @Description 批量新增
+// @Param	request	body data_manage.AddEdbInfoReq true "type json string"
+// @Success 200 string "操作成功"
+// @router /business_data/name_check [post]
+func (c *EdbBusinessController) NameCheck() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		if br.ErrMsg == "" {
+			br.IsSendEmail = false
+		}
+		c.Data["json"] = br
+		c.ServeJSON()
+	}()
+	sysUser := c.SysUser
+	if sysUser == nil {
+		br.Msg = "请登录"
+		br.ErrMsg = "请登录,SysUser Is Empty"
+		br.Ret = 408
+		return
+	}
+	var req []*data_manage.AddEdbInfoReq
+	if e := json.Unmarshal(c.Ctx.Input.RequestBody, &req); e != nil {
+		br.Msg = "参数解析异常!"
+		br.ErrMsg = "参数解析失败,Err:" + e.Error()
+		return
+	}
+	if len(req) == 0 {
+		br.Msg = "请选择指标"
+		return
+	}
+
+	type NameCheckResult struct {
+		EdbCode string
+		EdbName string
+		Exist   bool
+	}
+	indexNames := make([]string, 0)
+	resp := make([]*NameCheckResult, 0)
+	for _, v := range req {
+		v.EdbCode = strings.TrimSpace(v.EdbCode)
+		if v.EdbCode == "" {
+			br.Msg = "指标ID不可为空"
+			return
+		}
+		v.EdbName = strings.TrimSpace(v.EdbName)
+		if v.EdbName == "" {
+			br.Msg = "请输入指标名称"
+			return
+		}
+		indexNames = append(indexNames, v.EdbName)
+		resp = append(resp, &NameCheckResult{
+			EdbCode: v.EdbCode,
+			EdbName: v.EdbName,
+		})
+	}
+
+	// 重名校验
+	edbList, e := data_manage.GetEdbInfoByNameArr(indexNames, utils.EDB_INFO_TYPE)
+	if e != nil {
+		br.Msg = "操作失败"
+		br.ErrMsg = "获取重名指标失败, Err: " + e.Error()
+		return
+	}
+	nameExists := make(map[string]bool)
+	for _, v := range edbList {
+		nameExists[v.EdbName] = true
+	}
+	if len(nameExists) > 0 {
+		for _, v := range resp {
+			v.Exist = nameExists[v.EdbName]
+		}
+	}
+
+	br.Data = resp
+	br.Msg = "校验成功"
+	br.Ret = 200
+	br.Success = true
+}
+
+// BatchAdd
+// @Title 批量新增
+// @Description 批量新增
+// @Param	request	body data_manage.AddEdbInfoReq true "type json string"
+// @Success 200 string "操作成功"
+// @router /business_data/batch_add [post]
+func (c *EdbBusinessController) BatchAdd() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		if br.ErrMsg == "" {
+			br.IsSendEmail = false
+		}
+		c.Data["json"] = br
+		c.ServeJSON()
+	}()
+	sysUser := c.SysUser
+	if sysUser == nil {
+		br.Msg = "请登录"
+		br.ErrMsg = "请登录,SysUser Is Empty"
+		br.Ret = 408
+		return
+	}
+
+	deleteCache := true
+	cacheKey := "CACHE_EDB_INFO_BATCH_ADD_BUSINESS_" + strconv.Itoa(sysUser.AdminId)
+	defer func() {
+		if deleteCache {
+			_ = utils.Rc.Delete(cacheKey)
+		}
+	}()
+	if !utils.Rc.SetNX(cacheKey, 1, 30*time.Second) {
+		deleteCache = false
+		br.Msg = "系统处理中,请稍后重试!"
+		br.ErrMsg = "系统处理中,请稍后重试!" + sysUser.RealName + ";data:" + string(c.Ctx.Input.RequestBody)
+		return
+	}
+	var req []*data_manage.AddEdbInfoReq
+	if e := json.Unmarshal(c.Ctx.Input.RequestBody, &req); e != nil {
+		br.Msg = "参数解析异常!"
+		br.ErrMsg = "参数解析失败,Err:" + e.Error()
+		return
+	}
+	if len(req) == 0 {
+		br.Msg = "请选择指标"
+		return
+	}
+	if len(req) > 30 {
+		br.Msg = "批量添加指标数量不得超过30个"
+		return
+	}
+	indexNames := make([]string, 0)
+	for _, v := range req {
+		v.EdbCode = strings.TrimSpace(v.EdbCode)
+		if v.EdbCode == "" {
+			br.Msg = "指标ID不可为空"
+			return
+		}
+		v.EdbName = strings.TrimSpace(v.EdbName)
+		if v.EdbName == "" {
+			br.Msg = "请输入指标名称"
+			return
+		}
+		indexNames = append(indexNames, v.EdbName)
+		v.Frequency = strings.TrimSpace(v.Frequency)
+		if v.Frequency == "" {
+			br.Msg = "请选择频度"
+			return
+		}
+		v.Unit = strings.TrimSpace(v.Unit)
+		if v.Unit == "" {
+			br.Msg = "请输入单位"
+			return
+		}
+		if v.ClassifyId <= 0 {
+			br.Msg = "请选择分类"
+			return
+		}
+	}
+
+	// 限定同一时间最多批量新增100个指标
+	for _, v := range req {
+		var r data.BusinessIndexSource2EdbReq
+		r.EdbCode = v.EdbCode
+		r.EdbName = v.EdbName
+		r.Frequency = v.Frequency
+		r.Unit = v.Unit
+		r.ClassifyId = v.ClassifyId
+		r.AdminId = sysUser.AdminId
+		r.AdminRealName = sysUser.RealName
+
+		edbInfo, e, errMsg, skip := data.BusinessIndexSource2Edb(r, c.Lang)
+		if e != nil {
+			br.Msg = "操作失败"
+			if errMsg != "" {
+				br.Msg = errMsg
+			}
+			br.ErrMsg = e.Error()
+			return
+		}
+		if skip {
+			continue
+		}
+
+		// 试用平台更新用户累计新增指标数
+		if utils.BusinessCode == utils.BusinessCodeSandbox {
+			go func() {
+				adminItem, e := system.GetSysAdminById(sysUser.AdminId)
+				if e != nil {
+					tips := fmt.Sprintf("试用平台更新用户累计新增指标数-获取用户失败, Err: " + e.Error())
+					utils.FileLog.Info(tips)
+					return
+				}
+				if adminItem.DepartmentName != "ETA试用客户" {
+					return
+				}
+				var ur etaTrialService.EtaTrialUserReq
+				ur.Mobile = adminItem.Mobile
+				_, _ = etaTrialService.UpdateUserIndexNum(ur)
+			}()
+		}
+
+		// 新增操作日志
+		{
+			edbLog := new(data_manage.EdbInfoLog)
+			edbLog.EdbInfoId = edbInfo.EdbInfoId
+			edbLog.SourceName = edbInfo.SourceName
+			edbLog.Source = edbInfo.Source
+			edbLog.EdbCode = edbInfo.EdbCode
+			edbLog.EdbName = edbInfo.EdbName
+			edbLog.ClassifyId = edbInfo.ClassifyId
+			edbLog.SysUserId = sysUser.AdminId
+			edbLog.SysUserRealName = sysUser.RealName
+			edbLog.CreateTime = time.Now()
+			edbLog.Content = string(c.Ctx.Input.RequestBody)
+			edbLog.Status = "新增指标"
+			edbLog.Method = c.Ctx.Input.URI()
+			go data_manage.AddEdbInfoLog(edbLog)
+		}
+	}
+
+	br.Msg = "操作成功"
+	br.Ret = 200
+	br.Success = true
+	br.IsAddLog = true
+}
+
+// DataList
+// @Title 获取指标数据列表
+// @Description 获取指标数据列表接口
+// @Param   PageSize   query   int  true       "每页数据条数"
+// @Param   CurrentIndex   query   int  true       "当前页页码,从1开始"
+// @Param   IndexCode   query   string  true       "频度"
+// @Success 200 {object} models.DataListResp
+// @router /business_data/data/list [get]
+func (c *EdbBusinessController) DataList() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		c.Data["json"] = br
+		c.ServeJSON()
+	}()
+
+	req := &request.BusinessDataDataListReq{}
+	if e := c.ParseForm(req); e != nil {
+		br.Msg = "获取失败"
+		br.ErrMsg = "参数解析失败, Err: " + e.Error()
+		return
+	}
+
+	pageSize := req.PageSize
+	currentIndex := req.CurrentIndex
+
+	var startSize int
+	if pageSize <= 0 {
+		pageSize = utils.PageSize20
+	}
+	if currentIndex <= 0 {
+		currentIndex = 1
+	}
+	startSize = utils.StartIndex(currentIndex, pageSize)
+
+	if req.IndexCode == "" {
+		br.Msg = "指标编码为空"
+		br.ErrMsg = "指标编码为空"
+		br.IsSendEmail = false
+		return
+	}
+
+	// 获取分页数据
+	dataCount, dataList, err := data.GetPageBaseBusinessIndexData(req.IndexCode, startSize, pageSize)
+	if err != nil && err.Error() != utils.ErrNoRow() {
+		br.Msg = "获取指标信息失败"
+		br.ErrMsg = "获取指标数据总数失败,Err:" + err.Error()
+		return
+	}
+	page := paging.GetPaging(currentIndex, pageSize, dataCount)
+	resp := data_manage.BusinessIndexDataListResp{
+		List:   dataList,
+		Paging: page,
+	}
+
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "获取成功"
+	br.Data = resp
+}

+ 139 - 0
controllers/data_manage/chart_info.go

@@ -10,6 +10,7 @@ import (
 	"eta/eta_api/services"
 	"eta/eta_api/services/data"
 	"eta/eta_api/services/data/data_manage_permission"
+	"eta/eta_api/services/eta_forum"
 	etaTrialService "eta/eta_api/services/eta_trial"
 	"eta/eta_api/utils"
 	"fmt"
@@ -4086,3 +4087,141 @@ func (this *ChartInfoController) ChartInfoConvertDetail() {
 	br.Msg = "获取成功"
 	br.Data = resp
 }
+
+// UploadToForum
+// @Title 上传至社区
+// @Description 上传至社区
+// @Param	request	body data_manage.SetChartInfoImageReq true "type json string"
+// @Success Ret=200 保存成功
+// @router /chart_info/forum/upload [post]
+func (this *ChartInfoController) UploadToForum() {
+	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 eta_forum.UploadChartToForumReq
+	err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
+	if err != nil {
+		br.Msg = "参数解析异常!"
+		br.ErrMsg = "参数解析失败,Err:" + err.Error()
+		return
+	}
+
+	if req.ChartInfoId <= 0 {
+		br.Msg = "请选择图表"
+		return
+	}
+
+	err, errMsg := eta_forum.UploadChart(req.ChartInfoId, req.Description, sysUser)
+	if err != nil {
+		br.Msg = errMsg
+		br.ErrMsg = err.Error()
+		return
+	}
+
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "保存成功"
+}
+
+// UpdateToForum
+// @Title 更新社区图表
+// @Description 更新社区图表
+// @Param	request	body data_manage.SetChartInfoImageReq true "type json string"
+// @Success Ret=200 保存成功
+// @router /chart_info/forum/update [post]
+func (this *ChartInfoController) UpdateToForum() {
+	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 eta_forum.UpdateChartToForumReq
+	err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
+	if err != nil {
+		br.Msg = "参数解析异常!"
+		br.ErrMsg = "参数解析失败,Err:" + err.Error()
+		return
+	}
+
+	if req.ChartInfoId <= 0 {
+		br.Msg = "请选择图表"
+		return
+	}
+
+	err, errMsg := eta_forum.UpdateChart(req.ChartInfoId)
+	if err != nil {
+		br.Msg = errMsg
+		br.ErrMsg = err.Error()
+		return
+	}
+
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "保存成功"
+}
+
+// ForumDelete
+// @Title 从社区撤回
+// @Description 从社区撤回
+// @Param	request	body data_manage.SetChartInfoImageReq true "type json string"
+// @Success Ret=200 保存成功
+// @router /chart_info/forum/delete [post]
+func (this *ChartInfoController) ForumDelete() {
+	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 eta_forum.DeleteChartReq
+	err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
+	if err != nil {
+		br.Msg = "参数解析异常!"
+		br.ErrMsg = "参数解析失败,Err:" + err.Error()
+		return
+	}
+
+	if req.ChartInfoId <= 0 {
+		br.Msg = "请选择图表"
+		return
+	}
+
+	err, errMsg := eta_forum.DeleteChart(req.ChartInfoId)
+	if err != nil {
+		br.Msg = errMsg
+		br.ErrMsg = err.Error()
+		return
+	}
+
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "操作成功"
+}

+ 3 - 2
controllers/data_manage/chart_theme.go

@@ -8,6 +8,7 @@ import (
 	"eta/eta_api/models/data_manage/chart_theme"
 	"eta/eta_api/models/data_manage/chart_theme/request"
 	"eta/eta_api/services/data"
+	"eta/eta_api/services/eta_forum"
 	"eta/eta_api/utils"
 	"time"
 )
@@ -321,7 +322,7 @@ func (c *ChartThemeController) Add() {
 		br.ErrMsg = "添加失败,Err:" + err.Error()
 		return
 	}
-
+	go eta_forum.ChartThemeSave(chartTheme)
 	br.Ret = 200
 	br.Success = true
 	br.Msg = "添加成功"
@@ -391,7 +392,7 @@ func (c *ChartThemeController) Edit() {
 		br.ErrMsg = "修改失败,Err:" + err.Error()
 		return
 	}
-
+	go eta_forum.ChartThemeSave(chartTheme)
 	br.Ret = 200
 	br.Success = true
 	br.Msg = "修改成功"

+ 40 - 58
controllers/data_manage/edb_info.go

@@ -9,6 +9,7 @@ import (
 	request2 "eta/eta_api/models/data_manage/excel/request"
 	"eta/eta_api/models/data_manage/request"
 	"eta/eta_api/models/data_manage/response"
+	"eta/eta_api/models/mgo"
 	"eta/eta_api/models/system"
 	"eta/eta_api/services/alarm_msg"
 	"eta/eta_api/services/data"
@@ -20,6 +21,7 @@ import (
 	"eta/eta_api/utils"
 	"fmt"
 	"github.com/rdlucklib/rdluck_tools/paging"
+	"go.mongodb.org/mongo-driver/bson"
 	"strconv"
 	"strings"
 	"sync"
@@ -1722,6 +1724,36 @@ func (this *EdbInfoController) EdbInfoSearch() {
 				searchItem.Unit = "%"
 				searchItem.EdbName = indexInfo.IndexName
 			}
+		} else if source == utils.DATA_SOURCE_BUSINESS { //自有数据
+			indexObj := data_manage.BaseFromBusinessIndex{}
+			indexInfo, err := indexObj.GetDetailByEdbCode(edbCode)
+			if err != nil && err.Error() != utils.ErrNoRow() {
+				br.Msg = "获取失败"
+				br.ErrMsg = "获取自有数据指标信息失败,Err:" + err.Error()
+				return
+			}
+
+			obj := mgo.BaseFromBusinessData{}
+			tmpDataList, err := obj.GetLimitDataList(bson.M{"index_code": edbCode}, utils.EDB_DATA_LIMIT, []string{"-data_time"})
+			if err != nil && err.Error() != utils.ErrNoRow() {
+				br.Msg = "获取失败"
+				br.ErrMsg = "获取自有数据已存在信息失败,Err:" + err.Error()
+				return
+			}
+			dataItems := make([]*data_manage.EdbInfoSearchData, 0)
+			for _, v := range tmpDataList {
+				dataItems = append(dataItems, &data_manage.EdbInfoSearchData{
+					DataTime: v.DataTime.Format(utils.FormatDate),
+					Value:    v.Value,
+				})
+			}
+			searchItem.EdbCode = edbCode
+			searchItem.DataList = dataItems
+			searchItem.StartDate = indexInfo.StartDate.Format(utils.FormatDate)
+			searchItem.EndDate = indexInfo.EndDate.Format(utils.FormatDate)
+			searchItem.Frequency = indexInfo.Frequency
+			searchItem.Unit = indexInfo.Unit
+			searchItem.EdbName = indexInfo.IndexName
 		} else {
 			// 代码中没有的来源那么从edb_source中找是否有对应的
 			sourceItem := data_manage.EdbSourceIdMap[source]
@@ -2093,64 +2125,14 @@ func (this *EdbInfoController) EdbInfoList() {
 
 	// 如果有数据权限,那么就去获取指标数据
 	if edbInfoItem.HaveOperaAuth {
-		var dataCondition string
-		var dataPars []interface{}
-
-		dataCondition += ` AND edb_info_id=? `
-		dataPars = append(dataPars, edbInfoItem.EdbInfoId)
-
-		if edbInfoItem.SubSource == utils.DATA_SUB_SOURCE_DATE {
-			if edbInfoItem.Source == utils.DATA_SOURCE_WIND {
-				dataCount, err := data_manage.GetEdbWsdDataCountByCondition(dataCondition, dataPars, edbInfoItem.Source)
-				if err != nil && err.Error() != utils.ErrNoRow() {
-					br.Msg = "获取指标信息失败"
-					br.ErrMsg = "获取指标数据总数失败,Err:" + err.Error()
-					return
-				}
-				page = paging.GetPaging(currentIndex, pageSize, dataCount)
-				dataList, err := data_manage.GetEdbWsdDataListByCondition(dataCondition, dataPars, edbInfoItem.Source, pageSize, startSize)
-				if err != nil {
-					br.Msg = "获取指标信息失败"
-					br.ErrMsg = "获取指标数据失败,Err:" + err.Error()
-					return
-				}
-				edbInfoItem.DataList = dataList
-			} else if edbInfoItem.Source == utils.DATA_SOURCE_THS {
-				dataCount, err := data_manage.GetTHsDsDataCountByCondition(dataCondition, dataPars, edbInfoItem.Source)
-				if err != nil && err.Error() != utils.ErrNoRow() {
-					br.Msg = "获取指标信息失败"
-					br.ErrMsg = "获取指标数据总数失败,Err:" + err.Error()
-					return
-				}
-				page = paging.GetPaging(currentIndex, pageSize, dataCount)
-				dataList, err := data_manage.GetThsDsDataListByCondition(dataCondition, dataPars, edbInfoItem.Source, pageSize, startSize)
-				if err != nil {
-					br.Msg = "获取指标信息失败"
-					br.ErrMsg = "获取指标数据失败,Err:" + err.Error()
-					return
-				}
-				edbInfoItem.DataList = dataList
-			} else {
-				br.Msg = "指标数据源id错误"
-				br.ErrMsg = "指标数据源id错误"
-				return
-			}
-		} else {
-			dataCount, err := data_manage.GetEdbDataCountByCondition(dataCondition, dataPars, edbInfoItem.Source, edbInfoItem.SubSource)
-			if err != nil && err.Error() != utils.ErrNoRow() {
-				br.Msg = "获取指标信息失败"
-				br.ErrMsg = "获取指标数据总数失败,Err:" + err.Error()
-				return
-			}
-			page = paging.GetPaging(currentIndex, pageSize, dataCount)
-			dataList, err := data_manage.GetEdbDataListByCondition(dataCondition, dataPars, edbInfoItem.Source, edbInfoItem.SubSource, pageSize, startSize)
-			if err != nil {
-				br.Msg = "获取指标信息失败"
-				br.ErrMsg = "获取指标数据失败,Err:" + err.Error()
-				return
-			}
-			edbInfoItem.DataList = dataList
+		dataCount, dataList, err := data.GetPageData(edbInfoItem.EdbInfoId, edbInfoItem.Source, edbInfoItem.SubSource, "", startSize, pageSize)
+		if err != nil && err.Error() != utils.ErrNoRow() {
+			br.Msg = "获取指标信息失败"
+			br.ErrMsg = "获取指标数据总数失败,Err:" + err.Error()
+			return
 		}
+		page = paging.GetPaging(currentIndex, pageSize, dataCount)
+		edbInfoItem.DataList = dataList
 	}
 
 	// 获取指标插入配置
@@ -2447,7 +2429,7 @@ func (this *EdbInfoController) EdbInfoEdit() {
 		edbInfo.Frequency = req.Frequency
 		edbInfo.Unit = req.Unit
 		edbInfo.ClassifyId = req.ClassifyId
-		updateCols = append(updateCols, "EdbNameEn", "EdbNameSource", "Frequency", "UnitEn", "ClassifyId")
+		updateCols = append(updateCols, "EdbName", "EdbNameSource", "Frequency", "UnitEn", "ClassifyId")
 	}
 	pars = append(pars, req.EdbName)
 

+ 9 - 5
controllers/data_manage/edb_info_calculate.go

@@ -1164,7 +1164,7 @@ func (this *ChartInfoController) ExecPythonCode() {
 		return
 	}
 	if resp.Ret != 200 {
-		br.Msg = "python代码执行失败,请检查代码"
+		br.Msg = "python代码执行失败,请检查代码:" + resp.Msg
 		br.ErrMsg = "python代码执行失败,Err:" + resp.ErrMsg
 		return
 	}
@@ -1453,9 +1453,6 @@ func (this *EdbInfoController) QueryEdbDataTable() {
 		br.ErrMsg = "获取指标信息失败,err:" + err.Error()
 		return
 	}
-
-	tableName := data_manage.GetEdbDataTableName(edbInfo.Source, edbInfo.SubSource)
-
 	columnList := []map[string]string{
 		{
 			"edb_code": "指标code",
@@ -1468,7 +1465,14 @@ func (this *EdbInfoController) QueryEdbDataTable() {
 		},
 	}
 
-	templateStr := fmt.Sprintf("sql1 = f\"\"\"SELECT data_time,`value` FROM %s WHERE edb_code = '%s' ORDER BY data_time DESC;\"\"\"\nraw = pandas_fetch_all(sql1, db)", tableName, edbInfo.EdbCode)
+	tableName := data_manage.GetEdbDataTableName(edbInfo.Source, edbInfo.SubSource)
+
+	var templateStr string
+	if edbInfo.Source == utils.DATA_SOURCE_BUSINESS {
+		templateStr = fmt.Sprintf("# 查询条件\nquery = {\"edb_code\": \"%s\"}\n# 排序\nsort = [(\"data_time\", -1)]  # -1 表示降序排列,对应 SQL 的 DESC\nprojection = {\"data_time\": 1, \"value\": 1, \"_id\": 0}  # 只选择data_time和value字段,忽略_id字段\n# 使用 find() 方法获取数据,然后使用 aggregate() 转换为列表\nraw_data = list(collection.find(query, projection).sort(sort))\n# 将结果转换为 DataFrame\nraw = pd.DataFrame(raw_data)\n# 转换data_time字段为本地时区时间\nraw['data_time'] = raw['data_time'].apply(lambda x: x.replace(tzinfo=utc_tz)).dt.tz_convert(local_tz).dt.strftime('%s')", edbInfo.EdbCode, "%Y-%m-%d")
+	} else {
+		templateStr = fmt.Sprintf("sql1 = f\"\"\"SELECT data_time,`value` FROM %s WHERE edb_code = '%s' ORDER BY data_time DESC;\"\"\"\nraw = pandas_fetch_all(sql1, db)", tableName, edbInfo.EdbCode)
+	}
 	info := data_manage.TableInfoResp{
 		ColumnList:  columnList,
 		TableName:   tableName,

+ 10 - 7
controllers/data_manage/edb_info_refresh.go

@@ -42,8 +42,9 @@ func (c *EdbInfoController) RefreshSourceList() {
 			continue
 		}
 		tmp = edb_refresh.EdbRefreshSourceList{
-			Source:     v.Source,
-			SourceName: v.SourceName,
+			Source:       v.Source,
+			SourceName:   v.SourceName,
+			SourceNameEn: v.SourceNameEn,
 			//SubSource:     v.SubSource,
 			//SubSourceName: v.SubSourceName,
 			Child:    make([]edb_refresh.EdbRefreshSourceList, 0),
@@ -54,11 +55,13 @@ func (c *EdbInfoController) RefreshSourceList() {
 			for _, v2 := range tmpList {
 				if v2.Source == v.Source {
 					tmp.Child = append(tmp.Child, edb_refresh.EdbRefreshSourceList{
-						Source:        v2.Source,
-						SourceName:    v2.SourceName,
-						SubSource:     v2.SubSource,
-						SubSourceName: v2.SubSourceName,
-						HasChild:      0,
+						Source:          v2.Source,
+						SourceName:      v2.SourceName,
+						SubSource:       v2.SubSource,
+						SubSourceName:   v2.SubSourceName,
+						SourceNameEn:    v2.SourceNameEn,
+						SubSourceNameEn: v2.SubSourceNameEn,
+						HasChild:        0,
 					})
 				}
 			}

+ 10 - 2
controllers/data_manage/multiple_graph_config.go

@@ -49,7 +49,11 @@ func (this *ChartInfoController) MultipleGraphConfigSave() {
 	}
 
 	if req.EdbInfoIdA <= 0 {
-		br.Msg = "指标A未选择"
+		if this.Lang == utils.EnLangVersion {
+			br.Msg = "Indicator A not selected"
+		} else {
+			br.Msg = "指标A未选择"
+		}
 		br.IsSendEmail = false
 		return
 	}
@@ -65,7 +69,11 @@ func (this *ChartInfoController) MultipleGraphConfigSave() {
 	}
 
 	if req.EdbInfoIdB <= 0 {
-		br.Msg = "指标B未选择"
+		if this.Lang == utils.EnLangVersion {
+			br.Msg = "Indicator B not selected"
+		} else {
+			br.Msg = "指标B未选择"
+		}
 		br.IsSendEmail = false
 		return
 	}

+ 1 - 1
controllers/data_manage/mysteel_chemical_data.go

@@ -861,7 +861,7 @@ func (this *EdbClassifyController) AddMysteelChemical() {
 		v.IndexCode = strings.Replace(v.IndexCode, "\t", "", -1)
 
 		//添加指标
-		mysteelChemicalIndexInfo, err, errMsg := data.AddMysteelChemicalIndex(v.BaseFromMysteelChemicalClassifyId, strings.ToUpper(v.IndexCode), v.UpdateWeek, v.UpdateTime, this.SysUser.AdminId, this.SysUser.RealName)
+		mysteelChemicalIndexInfo, err, errMsg := data.AddMysteelChemicalIndex(v.BaseFromMysteelChemicalClassifyId, strings.ToUpper(v.IndexCode), v.UpdateWeek, v.UpdateTime, this.SysUser.AdminId, this.SysUser.RealName, this.Lang)
 		if errMsg != `` {
 			br.Msg = errMsg
 			br.ErrMsg = errMsg

+ 3 - 33
controllers/data_manage/predict_edb_info.go

@@ -318,25 +318,13 @@ func (this *PredictEdbInfoController) List() {
 
 		//获取指标数据(实际已生成)
 		{
-			var dataCondition string
-			var dataPars []interface{}
-
-			dataCondition += ` AND edb_info_id=? `
-			dataPars = append(dataPars, sourceEdbInfoItem.EdbInfoId)
-
-			dataCount, err := data_manage.GetEdbDataCountByCondition(dataCondition, dataPars, sourceEdbInfoItem.Source, sourceEdbInfoItem.SubSource)
+			dataCount, dataList, err := data.GetPageData(sourceEdbInfoItem.EdbInfoId, sourceEdbInfoItem.Source, sourceEdbInfoItem.SubSource, "", startSize, pageSize)
 			if err != nil && err.Error() != utils.ErrNoRow() {
 				br.Msg = "获取指标信息失败"
 				br.ErrMsg = "获取指标数据总数失败,Err:" + err.Error()
 				return
 			}
 			page = paging.GetPaging(currentIndex, pageSize, dataCount)
-			dataList, err := data_manage.GetEdbDataListByCondition(dataCondition, dataPars, sourceEdbInfoItem.Source, sourceEdbInfoItem.SubSource, pageSize, startSize)
-			if err != nil {
-				br.Msg = "获取指标信息失败"
-				br.ErrMsg = "获取指标数据失败,Err:" + err.Error()
-				return
-			}
 			edbInfoItem.DataList = dataList
 		}
 
@@ -385,37 +373,19 @@ func (this *PredictEdbInfoController) List() {
 	} else {
 		//获取指标数据(实际已生成)
 		{
-			var dataCondition string
-			var dataPars []interface{}
-
-			dataCondition += ` AND edb_info_id=? AND data_time <= ? `
-			dataPars = append(dataPars, edbInfoItem.EdbInfoId, edbInfoItem.LatestDate)
-
-			dataCount, err := data_manage.GetEdbDataCountByCondition(dataCondition, dataPars, edbInfoItem.Source, edbInfoItem.SubSource)
+			dataCount, dataList, err := data.GetPageData(edbInfoItem.EdbInfoId, edbInfoItem.Source, edbInfoItem.SubSource, edbInfoItem.LatestDate, startSize, pageSize)
 			if err != nil && err.Error() != utils.ErrNoRow() {
 				br.Msg = "获取指标信息失败"
 				br.ErrMsg = "获取指标数据总数失败,Err:" + err.Error()
 				return
 			}
 			page = paging.GetPaging(currentIndex, pageSize, dataCount)
-			dataList, err := data_manage.GetEdbDataListByCondition(dataCondition, dataPars, edbInfoItem.Source, edbInfoItem.SubSource, pageSize, startSize)
-			if err != nil {
-				br.Msg = "获取指标信息失败"
-				br.ErrMsg = "获取指标数据失败,Err:" + err.Error()
-				return
-			}
 			edbInfoItem.DataList = dataList
 		}
 
 		// 第一页才需要 获取预测指标未来的数据
 		if currentIndex == 1 {
-			var dataCondition string
-			var dataPars []interface{}
-
-			dataCondition += ` AND edb_info_id=? AND data_time > ? `
-			dataPars = append(dataPars, edbInfoItem.EdbInfoId, edbInfoItem.LatestDate)
-
-			predictDataList, err = data_manage.GetAllEdbDataListByCondition(dataCondition, dataPars, edbInfoItem.Source, edbInfoItem.SubSource)
+			predictDataList, err = data_manage.GetAllEdbDataListData(edbInfoItem.EdbInfoId, edbInfoItem.Source, edbInfoItem.SubSource, edbInfoItem.LatestDate)
 			if err != nil {
 				br.Msg = "获取指标信息失败"
 				br.ErrMsg = "获取指标数据失败,Err:" + err.Error()

+ 1 - 1
controllers/data_manage/supply_analysis/variety_edb.go

@@ -96,7 +96,7 @@ func (this *VarietyController) EdbList() {
 
 		if tmpItem, ok := edbInfoAndClassifyMap[v.EdbInfoId]; ok {
 			classifyNameList := make([]string, 0)
-
+ 
 			// 所属分类
 			{
 				classifyList, tmpErr, errMsg := data.GetFullClassifyByClassifyId(tmpItem.ClassifyId)

+ 1 - 0
controllers/data_stat/edb_source_stat.go

@@ -53,6 +53,7 @@ func (this *EdbSourceStatController) Column() {
 		tmp.ColumnKey = v.ColumnKey
 		tmp.IsShow = v.IsShow
 		tmp.ColumnName = v.ColumnName
+		tmp.ColumnNameEn = v.ColumnNameEn
 		tmp.Id = v.Id
 		tmp.IsMust = v.IsMust
 		tmp.IsSort = v.IsSort

+ 58 - 40
controllers/english_report/email.go

@@ -726,17 +726,19 @@ func (this *EnglishReportEmailController) Send() {
 		r.ReportContent = overview
 		r.ReportShareLink = l
 		r.ReportTime = t
-		sendData = append(sendData, r)
-
-		// 日志
-		logData = append(logData, &models.EnglishReportEmailLog{
+		logItem := &models.EnglishReportEmailLog{
 			ReportId:   reportInfo.Id,
 			EmailId:    emails[i].Id,
 			Email:      emails[i].Email,
 			Source:     models.EnglishReportEmailLogSourceAli,
 			SendStatus: models.EnglishReportEmailLogStatusIng,
 			CreateTime: nowTime,
-		})
+		}
+		r.EmailLog = logItem
+		sendData = append(sendData, r)
+
+		// 日志
+		logData = append(logData, logItem)
 	}
 	if len(sendData) == 0 {
 		br.Msg = "无邮件可推送"
@@ -744,12 +746,19 @@ func (this *EnglishReportEmailController) Send() {
 	}
 
 	// 写入日志
-	emailLog := new(models.EnglishReportEmailLog)
-	if e = emailLog.InsertMulti(logData); e != nil {
-		br.Msg = "操作失败"
-		br.ErrMsg = "批量写入群发邮件日志失败, Err: " + e.Error()
-		return
+	for _, v := range logData {
+		if e = v.Create(); e != nil {
+			br.Msg = "操作失败"
+			br.ErrMsg = "写入群发邮件日志失败, Err: " + e.Error()
+			return
+		}
 	}
+	//emailLog := new(models.EnglishReportEmailLog)
+	//if e = emailLog.InsertMulti(logData); e != nil {
+	//	br.Msg = "操作失败"
+	//	br.ErrMsg = "批量写入群发邮件日志失败, Err: " + e.Error()
+	//	return
+	//}
 
 	// 修改推送状态
 	updateCols := []string{"EmailState", "ModifyTime"}
@@ -1499,17 +1508,19 @@ func (this *EnglishReportEmailController) Resend() {
 		r.ReportContent = reportInfo.Overview
 		r.ReportShareLink = l
 		r.ReportTime = t
-		sendData = append(sendData, r)
-
-		// 日志
-		logData = append(logData, &models.EnglishReportEmailLog{
+		logItem := &models.EnglishReportEmailLog{
 			ReportId:   reportInfo.Id,
 			EmailId:    emails[i].Id,
 			Email:      emails[i].Email,
 			Source:     models.EnglishReportEmailLogSourceAli,
 			SendStatus: models.EnglishReportEmailLogStatusIng,
 			CreateTime: nowTime,
-		})
+		}
+		r.EmailLog = logItem
+		sendData = append(sendData, r)
+
+		// 日志
+		logData = append(logData, logItem)
 	}
 
 	// 标记原有日志为已删除
@@ -1522,11 +1533,12 @@ func (this *EnglishReportEmailController) Resend() {
 	}
 
 	// 写入新的日志
-	emailLog := new(models.EnglishReportEmailLog)
-	if e = emailLog.InsertMulti(logData); e != nil {
-		br.Msg = "操作失败"
-		br.ErrMsg = "批量写入群发邮件日志失败, Err: " + e.Error()
-		return
+	for _, v := range logData {
+		if e = v.Create(); e != nil {
+			br.Msg = "操作失败"
+			br.ErrMsg = "写入群发邮件日志失败, Err: " + e.Error()
+			return
+		}
 	}
 
 	// 群发邮件
@@ -1810,10 +1822,7 @@ func (this *EnglishReportEmailController) VideoSend() {
 		r.ReportContent = overview
 		r.ReportShareLink = l
 		r.ReportTime = t
-		sendData = append(sendData, r)
-
-		// 日志
-		logData = append(logData, &models.EnglishReportEmailLog{
+		logItem := &models.EnglishReportEmailLog{
 			ReportId:   videoInfo.Id,
 			ReportType: 1,
 			EmailId:    emails[i].Id,
@@ -1821,7 +1830,12 @@ func (this *EnglishReportEmailController) VideoSend() {
 			Source:     models.EnglishReportEmailLogSourceAli,
 			SendStatus: models.EnglishReportEmailLogStatusIng,
 			CreateTime: nowTime,
-		})
+		}
+		r.EmailLog = logItem
+		sendData = append(sendData, r)
+
+		// 日志
+		logData = append(logData, logItem)
 	}
 	if len(sendData) == 0 {
 		br.Msg = "无邮件可推送"
@@ -1829,11 +1843,12 @@ func (this *EnglishReportEmailController) VideoSend() {
 	}
 
 	// 写入日志
-	emailLog := new(models.EnglishReportEmailLog)
-	if e = emailLog.InsertMulti(logData); e != nil {
-		br.Msg = "操作失败"
-		br.ErrMsg = "批量写入群发邮件日志失败, Err: " + e.Error()
-		return
+	for _, v := range logData {
+		if e = v.Create(); e != nil {
+			br.Msg = "操作失败"
+			br.ErrMsg = "写入群发邮件日志失败, Err: " + e.Error()
+			return
+		}
 	}
 
 	// 修改推送状态
@@ -2040,10 +2055,7 @@ func (this *EnglishReportEmailController) VideoResend() {
 		r.ReportContent = reportInfo.Overview
 		r.ReportShareLink = l
 		r.ReportTime = t
-		sendData = append(sendData, r)
-
-		// 日志
-		logData = append(logData, &models.EnglishReportEmailLog{
+		logItem := &models.EnglishReportEmailLog{
 			ReportId:   reportInfo.Id,
 			ReportType: 1,
 			EmailId:    emails[i].Id,
@@ -2051,7 +2063,12 @@ func (this *EnglishReportEmailController) VideoResend() {
 			Source:     models.EnglishReportEmailLogSourceAli,
 			SendStatus: models.EnglishReportEmailLogStatusIng,
 			CreateTime: nowTime,
-		})
+		}
+		r.EmailLog = logItem
+		sendData = append(sendData, r)
+
+		// 日志
+		logData = append(logData, logItem)
 	}
 
 	// 标记原有日志为已删除
@@ -2064,11 +2081,12 @@ func (this *EnglishReportEmailController) VideoResend() {
 	}
 
 	// 写入新的日志
-	emailLog := new(models.EnglishReportEmailLog)
-	if e = emailLog.InsertMulti(logData); e != nil {
-		br.Msg = "操作失败"
-		br.ErrMsg = "批量写入群发邮件日志失败, Err: " + e.Error()
-		return
+	for _, v := range logData {
+		if e = v.Create(); e != nil {
+			br.Msg = "操作失败"
+			br.ErrMsg = "写入群发邮件日志失败, Err: " + e.Error()
+			return
+		}
 	}
 
 	// 群发邮件

+ 72 - 144
controllers/english_report/report.go

@@ -16,7 +16,6 @@ import (
 	"html"
 	"strconv"
 	"strings"
-	"sync"
 	"time"
 )
 
@@ -177,7 +176,7 @@ func (this *EnglishReportController) Edit() {
 		return
 	}
 
-	markStatus, err := services.UpdateEnReportEditMark(int(req.ReportId), sysUser.AdminId, 1, sysUser.RealName)
+	markStatus, err := services.UpdateEnReportEditMark(int(req.ReportId), sysUser.AdminId, 1, sysUser.RealName, this.Lang)
 	if err != nil {
 		br.Msg = err.Error()
 		return
@@ -461,143 +460,71 @@ func (this *EnglishReportController) ListReport() {
 			return
 		}
 	}
-	// 未群发邮件(包含推送邮件失败的)
-	if emailState == 1 {
-		failIds, e := models.GetHasFailEmailLogReportIds()
-		if e != nil {
-			br.Msg = "获取失败"
-			br.ErrMsg = "获取存在邮件推送失败记录的英文报告IDs失败, Err:" + e.Error()
-			return
-		}
-		condition += ` AND email_state = 0`
-		if len(failIds) > 0 {
-			condition += ` OR id IN (` + utils.GetOrmInReplace(len(failIds)) + `)`
-			pars = append(pars, failIds)
-		}
-	}
-	// 已群发邮件
-	if emailState == 2 {
-		successIds, e := models.GetSuccessEmailLogReportIds()
-		if e != nil {
-			br.Msg = "获取失败"
-			br.ErrMsg = "获取邮件推送记录均为成功的英文报告IDs失败, Err:" + e.Error()
-			return
+
+	// 群发邮件状态筛选
+	{
+		// 未群发邮件(包含推送邮件失败的)
+		if emailState == 1 {
+			condition += ` AND (email_state = 0 OR email_has_fail = 1) `
 		}
-		condition += ` AND email_state = 1`
-		if len(successIds) > 0 {
-			condition += ` AND id IN (` + utils.GetOrmInReplace(len(successIds)) + `)`
-			pars = append(pars, successIds)
+		// 已群发邮件
+		if emailState == 2 {
+			condition += ` AND email_state = 1 AND email_has_fail = 0 `
 		}
 	}
 
-	var total int
-	var errCount, errList, errOther error
 	var authOk bool
-	list := make([]*models.EnglishReportList, 0)
-	failMap := make(map[int]bool, 0)    // 有群发失败记录的研报
 	adminMap := make(map[int]string, 0) // 编辑中的研究员姓名
 
-	wg := sync.WaitGroup{}
-	wg.Add(3)
-
-	// 列表总数
-	go func() {
-		defer func() {
-			wg.Done()
-		}()
-
-		t, e := models.GetEnglishReportListCount(condition, pars, companyType)
-		if e != nil {
-			errCount = fmt.Errorf("获取英文研报Count失败, Err: %s", e.Error())
-			return
-		}
-		total = t
-	}()
-
-	// 列表数据
-	go func() {
-		defer func() {
-			wg.Done()
-		}()
-
-		// 限制一下富文本字段, 列表用不到
-		fieldArr := []string{
-			"id", "add_type", "classify_id_first", "classify_name_first", "classify_id_second", "classify_name_second", "title", "abstract", "author",
-			"frequency", "create_time", "modify_time", "state", "publish_time", "pre_publish_time", "stage", "msg_is_send", "report_code", "pv", "share_url",
-			"pv_email", "email_state", "from_report_id", "key_takeaways", "admin_id", "admin_real_name", "approve_time","detail_img_url","detail_pdf_url",
-		}
-		items, e := models.GetEnglishReportList(condition, pars, companyType, startSize, pageSize, fieldArr)
-		if e != nil {
-			errList = fmt.Errorf("获取英文研报列表失败, Err: %s", e.Error())
-			return
-		}
-		list = items
-	}()
-
-	// 群发权限/失败记录
-	go func() {
-		defer func() {
-			wg.Done()
-		}()
-
-		// 获取邮件配置-是否有权限群发
-		conf := new(models.EnglishReportEmailConf)
-		authKey := "english_report_email_conf"
-		confAuth, e := company.GetConfigDetailByCode(authKey)
-		if e != nil {
-			errOther = fmt.Errorf("获取群发邮件权限失败, Err: %s", e.Error())
-			return
-		}
-		if confAuth.ConfigValue == "" {
-			errOther = fmt.Errorf("群发邮件配置为空")
-			return
-		}
-		if e := json.Unmarshal([]byte(confAuth.ConfigValue), &conf); e != nil {
-			errOther = fmt.Errorf("群发邮件配置有误")
-			return
-		}
-		authArr := strings.Split(conf.SendAuthGroup, ",")
-		if utils.InArrayByStr(authArr, sysUser.RoleTypeCode) {
-			authOk = true
-		}
-
-		// 是否有群发邮件失败的记录,标记红点
-		failList, e := models.GetEnglishReportEmailLogFailList(0)
-		if e != nil {
-			errOther = fmt.Errorf("获取群发邮件记录失败, Err: %s", e.Error())
-			return
-		}
-		for i := range failList {
-			failMap[failList[i].ReportId] = true
-		}
+	total, e := models.GetEnglishReportListCount(condition, pars, companyType)
+	if e != nil {
+		br.Msg = "获取失败"
+		br.ErrMsg = "获取英文研报Count失败, Err: " + e.Error()
+		return
+	}
 
-		// 获取admin, 用于匹配编辑中的研究员姓名
-		admins, e := system.GetSysAdminList("", make([]interface{}, 0), []string{"admin_id", "real_name"}, "")
-		if e != nil {
-			errOther = fmt.Errorf("获取系统用户列表失败, Err: %s", e.Error())
-			return
-		}
-		for _, a := range admins {
-			adminMap[a.AdminId] = a.RealName
-		}
-	}()
-	wg.Wait()
+	list, e := models.GetEnglishReportList(condition, pars, companyType, startSize, pageSize, []string{})
+	if e != nil {
+		br.Msg = "获取失败"
+		br.ErrMsg = "获取英文研报列表失败, Err: " + e.Error()
+		return
+	}
 
-	if errCount != nil {
+	// 获取邮件配置-是否有权限群发
+	conf := new(models.EnglishReportEmailConf)
+	authKey := "english_report_email_conf"
+	confAuth, e := company.GetConfigDetailByCode(authKey)
+	if e != nil {
 		br.Msg = "获取失败"
-		br.ErrMsg = errCount.Error()
+		br.ErrMsg = "获取群发邮件权限失败, Err: " + e.Error()
 		return
 	}
-	if errList != nil {
+	if confAuth.ConfigValue == "" {
 		br.Msg = "获取失败"
-		br.ErrMsg = errList.Error()
+		br.ErrMsg = "群发邮件配置为空"
 		return
 	}
-	if errOther != nil {
+	if e = json.Unmarshal([]byte(confAuth.ConfigValue), &conf); e != nil {
 		br.Msg = "获取失败"
-		br.ErrMsg = errOther.Error()
+		br.ErrMsg = "群发邮件配置有误, Err: " + e.Error()
 		return
 	}
+	authArr := strings.Split(conf.SendAuthGroup, ",")
+	if utils.InArrayByStr(authArr, sysUser.RoleTypeCode) {
+		authOk = true
+	}
+
+	// 获取admin, 用于匹配编辑中的研究员姓名
+	admins, e := system.GetSysAdminList("", make([]interface{}, 0), []string{"admin_id", "real_name"}, "")
+	if e != nil {
+		br.Msg = "获取失败"
+		br.ErrMsg = "获取系统用户列表失败, Err: " + e.Error()
+		return
+	}
+	for _, a := range admins {
+		adminMap[a.AdminId] = a.RealName
+	}
+
 	// 查询分类信息
 	var classifyIdSecondSlice []int
 	for _, item := range list {
@@ -615,21 +542,17 @@ func (this *EnglishReportController) ListReport() {
 			classifyNameMap[v.Id] = v
 		}
 	}
-	for _, item := range list {
-		if item.State == 2 {
-			item.ShareUrl = "https://share.hzinsights.com/reportEn?code=" + item.ReportCode
-		}
-		item.EmailAuth = authOk
-		item.EmailHasFail = failMap[item.Id]
-
-		// 邮箱PV大于0的时候, 不展示最初版本的PV
-		if item.PvEmail > 0 {
-			item.Pv = 0
+	respList := make([]*models.EnglishReportList, 0)
+	for _, v := range list {
+		t := models.FormatEnglishReport2ListItem(v)
+		if v.State == 2 {
+			t.ShareUrl = "https://share.hzinsights.com/reportEn?code=" + v.ReportCode
 		}
+		t.EmailAuth = authOk
 
 		// 报告是否正在编辑中
 		var opUser models.MarkReportItem
-		key := fmt.Sprint(`crm:enReport:edit:`, item.Id)
+		key := fmt.Sprint(`crm:enReport:edit:`, v.Id)
 		opUserId, e := utils.Rc.RedisInt(key)
 		if e != nil {
 			str, te := utils.Rc.RedisString(key)
@@ -647,31 +570,36 @@ func (this *EnglishReportController) ListReport() {
 				editor = adminMap[opUserId]
 			}
 			ret.Status = 1
-			ret.Msg = fmt.Sprintf("当前%s正在编辑报告", editor)
+			if this.Lang == utils.EnLangVersion {
+				ret.Msg = fmt.Sprintf("%s is currently editing the report", editor)
+			} else {
+				ret.Msg = fmt.Sprintf("当前%s正在编辑报告", editor)
+			}
 			ret.Editor = editor
 		}
 		if ret.Status == 0 {
-			item.CanEdit = true
+			t.CanEdit = true
 		} else {
-			item.Editor = ret.Editor
+			t.Editor = ret.Editor
 		}
 
 		//处理分类名
-		if n, ok := classifyNameMap[item.ClassifyIdSecond]; ok {
+		if n, ok := classifyNameMap[v.ClassifyIdSecond]; ok {
 			if n.RootId == 0 {
-				item.FullClassifyName = strings.Join([]string{n.ParentName, n.ClassifyName}, "/")
+				t.FullClassifyName = strings.Join([]string{n.ParentName, n.ClassifyName}, "/")
 			} else {
-				item.FullClassifyName = strings.Join([]string{n.RootName, n.ParentName, n.ClassifyName}, "/")
+				t.FullClassifyName = strings.Join([]string{n.RootName, n.ParentName, n.ClassifyName}, "/")
 			}
-			item.ClassifyIdRoot = n.RootId
-			item.ClassifyNameRoot = n.RootName
+			t.ClassifyIdRoot = n.RootId
+			t.ClassifyNameRoot = n.RootName
 		}
+		respList = append(respList, t)
 	}
 
 	page := paging.GetPaging(currentIndex, pageSize, total)
 	resp := new(models.EnglishReportListResp)
 	resp.Paging = page
-	resp.List = list
+	resp.List = respList
 	br.Ret = 200
 	br.Success = true
 	br.Msg = "获取成功"
@@ -1019,7 +947,7 @@ func (this *EnglishReportController) SaveReportContent() {
 		br.Msg = "请输入报告ID"
 		return
 	}
-	markStatus, err := services.UpdateEnReportEditMark(int(req.ReportId), sysUser.AdminId, 1, sysUser.RealName)
+	markStatus, err := services.UpdateEnReportEditMark(int(req.ReportId), sysUser.AdminId, 1, sysUser.RealName, this.Lang)
 	if err != nil {
 		br.Msg = err.Error()
 		return
@@ -1214,7 +1142,7 @@ func (this *EnglishReportController) MarkEditStatus() {
 		return
 	}
 	//更新标记key
-	data, err := services.UpdateEnReportEditMark(req.ReportId, sysUser.AdminId, req.Status, sysUser.RealName)
+	data, err := services.UpdateEnReportEditMark(req.ReportId, sysUser.AdminId, req.Status, sysUser.RealName, this.Lang)
 	if err != nil {
 		br.Msg = err.Error()
 		return
@@ -1293,7 +1221,7 @@ func (this *EnglishReportController) EditPolicy() {
 		br.Msg = "报告已发布不允许编辑"
 		return
 	}
-	markStatus, err := services.UpdateEnReportEditMark(int(req.ReportId), sysUser.AdminId, 1, sysUser.RealName)
+	markStatus, err := services.UpdateEnReportEditMark(int(req.ReportId), sysUser.AdminId, 1, sysUser.RealName, this.Lang)
 	if err != nil {
 		br.Msg = err.Error()
 		return

+ 1 - 1
controllers/ppt_v2_group.go

@@ -24,7 +24,7 @@ func (this *PptV2GroupController) GroupList() {
 	}()
 	IsNewPpt, _ := this.GetInt("IsNewPpt")
 	//data, err := ppt.GetGroupsByAdminId(IsNewPpt, this.SysUser.AdminId)
-	data, err := ppt.GetGroupsByAdminIdV2(IsNewPpt, this.SysUser.AdminId)
+	data, err := ppt.GetGroupsByAdminIdV2(IsNewPpt, this.SysUser.AdminId, this.Lang)
 	if err != nil {
 		br.Msg = err.Error()
 		return

+ 5 - 4
controllers/report.go

@@ -219,7 +219,7 @@ func (this *ReportController) ListReport() {
 		if item.ClassifyNameFirst == "周报" || item.ClassifyNameFirst == "晨报" {
 			item.CanEdit = true
 		} else {
-			markStatus, err := services.UpdateReportEditMark(item.Id, this.SysUser.AdminId, 2, this.SysUser.RealName)
+			markStatus, err := services.UpdateReportEditMark(item.Id, this.SysUser.AdminId, 2, this.SysUser.RealName, this.Lang)
 			if err != nil {
 				br.Msg = "查询标记状态失败"
 				br.ErrMsg = "查询标记状态失败,Err:" + err.Error()
@@ -693,7 +693,7 @@ func (this *ReportController) Edit() {
 	}
 
 	//更新标记key
-	markStatus, err := services.UpdateReportEditMark(int(req.ReportId), sysUser.AdminId, 1, sysUser.RealName)
+	markStatus, err := services.UpdateReportEditMark(int(req.ReportId), sysUser.AdminId, 1, sysUser.RealName, this.Lang)
 	if err != nil {
 		br.Msg = err.Error()
 		return
@@ -1208,7 +1208,7 @@ func (this *ReportController) SaveReportContent() {
 			return
 		}
 
-		markStatus, err := services.UpdateReportEditMark(int(req.ReportId), sysUser.AdminId, 1, sysUser.RealName)
+		markStatus, err := services.UpdateReportEditMark(int(req.ReportId), sysUser.AdminId, 1, sysUser.RealName, this.Lang)
 		if err != nil {
 			br.Msg = err.Error()
 			return
@@ -1297,6 +1297,7 @@ func (this *ReportUploadCommonController) UploadImg() {
 			err = fmt.Errorf("文件格式有误")
 			return
 		}
+		fmt.Printf("File type: %s. MIME: %s\n", kind.Extension, kind.MIME.Value)
 	}
 
 	ext := path.Ext(h.Filename)
@@ -3261,7 +3262,7 @@ func (this *ReportController) MarkEditStatus() {
 		return
 	}
 	//更新标记key
-	data, err := services.UpdateReportEditMark(req.ReportId, sysUser.AdminId, req.Status, sysUser.RealName)
+	data, err := services.UpdateReportEditMark(req.ReportId, sysUser.AdminId, req.Status, sysUser.RealName, this.Lang)
 	if err != nil {
 		br.Msg = err.Error()
 		return

+ 31 - 14
controllers/report_approve/report_approve_flow.go

@@ -411,7 +411,7 @@ func (this *ReportApproveFlowController) Edit() {
 			return
 		}
 		if !checkOk {
-			br.Msg = "当前有未走完流程的报告, 请走完流程后再做变更!"
+			br.Msg = "当前有未走完流程的报告, 请走完流程后再做变更"
 			return
 		}
 	}
@@ -720,19 +720,36 @@ func (this *ReportApproveFlowController) ReportClassifyTree() {
 		return
 	}
 
-	resp = append(resp, &report_approve.ReportClassifyTreeItem{
-		ClassifyId:   report_approve.FlowReportTypeChinese,
-		ClassifyName: "研报列表",
-		Children:     cnTree,
-	}, &report_approve.ReportClassifyTreeItem{
-		ClassifyId:   report_approve.FlowReportTypeEnglish,
-		ClassifyName: "英文研报",
-		Children:     enTree,
-	}, &report_approve.ReportClassifyTreeItem{
-		ClassifyId:   report_approve.FlowReportTypeSmart,
-		ClassifyName: "智能研报",
-		Children:     smartTree,
-	})
+	if this.Lang == utils.EnLangVersion {
+		resp = append(resp, &report_approve.ReportClassifyTreeItem{
+			ClassifyId:   report_approve.FlowReportTypeChinese,
+			ClassifyName: "Report list",
+			Children:     cnTree,
+		}, &report_approve.ReportClassifyTreeItem{
+			ClassifyId:   report_approve.FlowReportTypeEnglish,
+			ClassifyName: "English Report",
+			Children:     enTree,
+		}, &report_approve.ReportClassifyTreeItem{
+			ClassifyId:   report_approve.FlowReportTypeSmart,
+			ClassifyName: "Smart Report",
+			Children:     smartTree,
+		})
+	} else {
+		resp = append(resp, &report_approve.ReportClassifyTreeItem{
+			ClassifyId:   report_approve.FlowReportTypeChinese,
+			ClassifyName: "研报列表",
+			Children:     cnTree,
+		}, &report_approve.ReportClassifyTreeItem{
+			ClassifyId:   report_approve.FlowReportTypeEnglish,
+			ClassifyName: "英文研报",
+			Children:     enTree,
+		}, &report_approve.ReportClassifyTreeItem{
+			ClassifyId:   report_approve.FlowReportTypeSmart,
+			ClassifyName: "智能研报",
+			Children:     smartTree,
+		})
+	}
+
 
 	br.Data = resp
 	br.Ret = 200

+ 3 - 3
controllers/smart_report/smart_report.go

@@ -817,7 +817,7 @@ func (this *SmartReportController) SaveContent() {
 	for _, ad := range admins {
 		adminIdName[ad.AdminId] = ad.RealName
 	}
-	editing, e := services.UpdateSmartReportEditing(req.SmartReportId, 1, sysUser.AdminId, sysUser.RealName, adminIdName)
+	editing, e := services.UpdateSmartReportEditing(req.SmartReportId, 1, sysUser.AdminId, sysUser.RealName, adminIdName, this.Lang)
 	if e != nil {
 		br.Msg = e.Error()
 		return
@@ -928,7 +928,7 @@ func (this *SmartReportController) MarkEditStatus() {
 		adminIdName[ad.AdminId] = ad.RealName
 	}
 
-	data, e := services.UpdateSmartReportEditing(req.SmartReportId, req.Status, sysUser.AdminId, sysUser.RealName, adminIdName)
+	data, e := services.UpdateSmartReportEditing(req.SmartReportId, req.Status, sysUser.AdminId, sysUser.RealName, adminIdName, this.Lang)
 	if e != nil {
 		br.Msg = e.Error()
 		return
@@ -1091,7 +1091,7 @@ func (this *SmartReportController) List() {
 
 	for _, v := range list {
 		item := smart_report.FormatSmartReport2Item(v)
-		mark, e := services.UpdateSmartReportEditing(v.SmartReportId, 2, sysUser.AdminId, sysUser.RealName, adminIdName)
+		mark, e := services.UpdateSmartReportEditing(v.SmartReportId, 2, sysUser.AdminId, sysUser.RealName, adminIdName, this.Lang)
 		if e != nil {
 			br.Msg = "获取失败"
 			br.ErrMsg = "查询编辑中标记失败, Err:" + e.Error()

+ 5 - 2
controllers/sys_admin.go

@@ -8,6 +8,7 @@ import (
 	"eta/eta_api/models/data_manage"
 	"eta/eta_api/models/system"
 	"eta/eta_api/services"
+	"eta/eta_api/services/eta_forum"
 	etaTrialService "eta/eta_api/services/eta_trial"
 	"eta/eta_api/utils"
 	"fmt"
@@ -582,7 +583,7 @@ func (this *SysAdminController) Add() {
 
 	// 新增弘则联系人
 	//go services.AddHzCompanyUser(admin.Mobile, admin.RealName, this.SysUser.AdminId, this.SysUser.RealName)
-
+	go eta_forum.AdminSave(admin.AdminId)
 	br.Ret = 200
 	br.Success = true
 	br.Msg = "新增成功"
@@ -822,6 +823,7 @@ func (this *SysAdminController) Edit() {
 		}()
 	}
 
+	go eta_forum.AdminSave(adminInfo.AdminId)
 	br.Ret = 200
 	br.Success = true
 	br.IsAddLog = true
@@ -908,6 +910,7 @@ func (this *SysAdminController) EditEnabled() {
 		br.ErrMsg = "操作失败,Err:" + err.Error()
 		return
 	}
+	go eta_forum.AdminSave(adminItem.AdminId)
 	br.Ret = 200
 	br.Success = true
 	br.IsAddLog = true
@@ -977,7 +980,7 @@ func (this *SysAdminController) Delete() {
 			_, _ = etaTrialService.RemoveEtaTrialUser(r)
 		}()
 	}
-
+	go eta_forum.AdminDelete(adminInfo.AdminName)
 	br.Ret = 200
 	br.Success = true
 	br.IsAddLog = true

+ 56 - 15
controllers/target.go

@@ -777,7 +777,28 @@ func (this *TargetCommonController) TemplateDownload() {
 		this.Data["json"] = br
 		this.ServeJSON()
 	}()
+
 	this.Ctx.Output.Download("./static/数据导入模板.xlsx", "数据导入模板.xlsx")
+
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "下载成功"
+}
+
+// TemplateDownload
+// @Title 下载模板
+// @Description 下载模板
+// @Success 200 {object} models.EdbdataClassifyResp
+// @router /template/en [get]
+func (this *TargetCommonController) TemplateDownloadEn() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+
+	this.Ctx.Output.Download("./static/Data Import Template.xlsx", "Data Import Template.xlsx")
+
 	br.Ret = 200
 	br.Success = true
 	br.Msg = "下载成功"
@@ -878,22 +899,22 @@ func (this *TargetController) ImportData() {
 					return
 				}
 				templateFail := false
-				if cells[0].Value != "品种分类" {
+				if cells[0].Value != "品种分类" && cells[0].Value != "Species Category" {
 					templateFail = true
 				}
-				if cells[1].Value != "录入日期" {
+				if cells[1].Value != "录入日期" && cells[1].Value != "Input Date" {
 					templateFail = true
 				}
-				if cells[2].Value != "指标名称" {
+				if cells[2].Value != "指标名称" && cells[2].Value != "Indicator Name Indicator Name" {
 					templateFail = true
 				}
-				if cells[3].Value != "值" {
+				if cells[3].Value != "值" && cells[3].Value != "Value" {
 					templateFail = true
 				}
-				if cells[4].Value != "频度" {
+				if cells[4].Value != "频度" && cells[4].Value != "Frequency" {
 					templateFail = true
 				}
-				if cells[5].Value != "单位" {
+				if cells[5].Value != "单位" && cells[5].Value != "Unit" {
 					templateFail = true
 				}
 				if templateFail {
@@ -1260,15 +1281,30 @@ func (this *TargetController) ImportFailListDownload() {
 		return
 	}
 	xlsxFile := xlsx.NewFile()
-	sheet, err := xlsxFile.AddSheet("导入失败数据")
+	SheetName := "导入失败数据"
+	if this.Lang == utils.EnLangVersion {
+		SheetName = "Import Fail List"
+	}
+	sheet, err := xlsxFile.AddSheet(SheetName)
 	headRow := sheet.AddRow()
-	headRow.AddCell().SetValue("品种分类")
-	headRow.AddCell().SetValue("录入日期")
-	headRow.AddCell().SetValue("指标名称")
-	headRow.AddCell().SetValue("值")
-	headRow.AddCell().SetValue("频度")
-	headRow.AddCell().SetValue("单位")
-	headRow.AddCell().SetValue("备注")
+	if this.Lang == utils.EnLangVersion {
+		headRow.AddCell().SetValue("Species Category")
+		headRow.AddCell().SetValue("Input Date")
+		headRow.AddCell().SetValue("Indicator Name Indicator Name")
+		headRow.AddCell().SetValue("Value")
+		headRow.AddCell().SetValue("Frequency")
+		headRow.AddCell().SetValue("Unit")
+		headRow.AddCell().SetValue("Remark")
+	} else {
+		headRow.AddCell().SetValue("品种分类")
+		headRow.AddCell().SetValue("录入日期")
+		headRow.AddCell().SetValue("指标名称")
+		headRow.AddCell().SetValue("值")
+		headRow.AddCell().SetValue("频度")
+		headRow.AddCell().SetValue("单位")
+		headRow.AddCell().SetValue("备注")
+	}
+
 	for _, v := range item {
 		row := sheet.AddRow()
 		row.AddCell().SetValue(v.ClassifyName)
@@ -1290,7 +1326,12 @@ func (this *TargetController) ImportFailListDownload() {
 	defer func() {
 		os.Remove(savePath)
 	}()
-	this.Ctx.Output.Download(savePath, "失败列表.xlsx")
+	finalFileName := "失败列表.xlsx"
+
+	if this.Lang == utils.EnLangVersion {
+		finalFileName = "Failure List.xlsx"
+	}
+	this.Ctx.Output.Download(savePath, finalFileName)
 }
 
 // ExportDataList

+ 1 - 1
controllers/trade_analysis/trade_analysis.go

@@ -28,7 +28,7 @@ func (c *TradeAnalysisController) GetClassifyName() {
 		c.ServeJSON()
 	}()
 	//userinfo := userService.GetInfoByClaims(c)
-	list, err, errMsg := trade_analysis.GetClassifyName()
+	list, err, errMsg := trade_analysis.GetClassifyName(c.Lang)
 	if err != nil {
 		br.Msg = errMsg
 		br.ErrMsg = "获取失败, ErrMsg: " + err.Error()

+ 22 - 0
go.mod

@@ -33,15 +33,18 @@ require (
 	github.com/mojocn/base64Captcha v1.3.6
 	github.com/nosixtools/solarlunar v0.0.0-20211112060703-1b6dea7b4a19
 	github.com/olivere/elastic/v7 v7.0.32
+	github.com/qiniu/qmgo v1.1.8
 	github.com/rdlucklib/rdluck_tools v1.0.3
 	github.com/shopspring/decimal v1.3.1
 	github.com/silenceper/wechat/v2 v2.1.6
+	github.com/spf13/viper v1.7.0
 	github.com/tealeg/xlsx v1.0.5
 	github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/asr v1.0.873
 	github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.880
 	github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/ses v1.0.880
 	github.com/xuri/excelize/v2 v2.8.1
 	github.com/yidane/formula v0.0.0-20220322063702-c9da84ba3476
+	go.mongodb.org/mongo-driver v1.15.0
 	golang.org/x/net v0.21.0
 	gopkg.in/gomail.v2 v2.0.0-20160411212932-81ebce5c23df
 )
@@ -69,8 +72,12 @@ require (
 	github.com/dustin/go-humanize v1.0.1 // indirect
 	github.com/fatih/structs v1.1.0 // indirect
 	github.com/fsnotify/fsnotify v1.6.0 // indirect
+	github.com/go-playground/locales v0.13.0 // indirect
+	github.com/go-playground/universal-translator v0.17.0 // indirect
+	github.com/go-playground/validator/v10 v10.4.1 // indirect
 	github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0 // indirect
 	github.com/golang/protobuf v1.5.3 // indirect
+	github.com/golang/snappy v0.0.1 // indirect
 	github.com/gonum/blas v0.0.0-20181208220705-f22b278b28ac // indirect
 	github.com/gonum/floats v0.0.0-20181209220543-c233463c7e82 // indirect
 	github.com/gonum/integrate v0.0.0-20181209220457-a422b5c0fdf2 // indirect
@@ -80,11 +87,14 @@ require (
 	github.com/google/uuid v1.6.0 // indirect
 	github.com/gorilla/css v1.0.0 // indirect
 	github.com/hashicorp/golang-lru v0.5.4 // indirect
+	github.com/hashicorp/hcl v1.0.0 // 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/klauspost/compress v1.17.6 // indirect
 	github.com/klauspost/cpuid/v2 v2.2.6 // indirect
+	github.com/leodido/go-urn v1.2.0 // indirect
+	github.com/magiconair/properties v1.8.1 // indirect
 	github.com/mailru/easyjson v0.7.7 // indirect
 	github.com/matttproud/golang_protobuf_extensions v1.0.4 // indirect
 	github.com/minio/md5-simd v1.1.2 // indirect
@@ -93,7 +103,9 @@ require (
 	github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect
 	github.com/modern-go/reflect2 v1.0.2 // indirect
 	github.com/mohae/deepcopy v0.0.0-20170929034955-c48cc78d4826 // indirect
+	github.com/montanaflynn/stats v0.0.0-20171201202039-1bf9dbcd8cbe // indirect
 	github.com/opentracing/opentracing-go v1.2.1-0.20220228012449-10b1cf09e00b // indirect
+	github.com/pelletier/go-toml v1.9.2 // indirect
 	github.com/pkg/errors v0.9.1 // indirect
 	github.com/prometheus/client_golang v1.16.0 // indirect
 	github.com/prometheus/client_model v0.3.0 // indirect
@@ -104,15 +116,24 @@ require (
 	github.com/rs/xid v1.5.0 // indirect
 	github.com/shiena/ansicolor v0.0.0-20200904210342-c7312218db18 // indirect
 	github.com/sirupsen/logrus v1.9.3 // indirect
+	github.com/spf13/afero v1.1.2 // indirect
 	github.com/spf13/cast v1.5.0 // indirect
+	github.com/spf13/jwalterweatherman v1.0.0 // indirect
+	github.com/spf13/pflag v1.0.5 // indirect
+	github.com/subosito/gotenv v1.2.0 // indirect
 	github.com/tidwall/gjson v1.14.1 // indirect
 	github.com/tidwall/match v1.1.1 // indirect
 	github.com/tidwall/pretty v1.2.0 // indirect
 	github.com/tjfoc/gmsm v1.3.2 // indirect
+	github.com/xdg-go/pbkdf2 v1.0.0 // indirect
+	github.com/xdg-go/scram v1.1.2 // indirect
+	github.com/xdg-go/stringprep v1.0.4 // indirect
 	github.com/xuri/efp v0.0.0-20231025114914-d1ff6096ae53 // indirect
 	github.com/xuri/nfp v0.0.0-20230919160717-d98342af3f05 // indirect
+	github.com/youmark/pkcs8 v0.0.0-20181117223130-1be2e3e5546d // indirect
 	golang.org/x/crypto v0.19.0 // indirect
 	golang.org/x/image v0.15.0 // indirect
+	golang.org/x/sync v0.2.0 // indirect
 	golang.org/x/sys v0.17.0 // indirect
 	golang.org/x/text v0.14.0 // indirect
 	golang.org/x/time v0.0.0-20220609170525-579cf78fd858 // indirect
@@ -120,6 +141,7 @@ require (
 	gopkg.in/alexcesaro/quotedprintable.v3 v3.0.0-20150716171945-2caba252f4dc // indirect
 	gopkg.in/asn1-ber.v1 v1.0.0-20181015200546-f715ec2f112d // indirect
 	gopkg.in/ini.v1 v1.67.0 // indirect
+	gopkg.in/yaml.v2 v2.4.0 // indirect
 	gopkg.in/yaml.v3 v3.0.1 // indirect
 	xorm.io/builder v0.3.6 // indirect
 	xorm.io/core v0.7.2-0.20190928055935-90aeac8d08eb // indirect

+ 204 - 1
go.sum

@@ -2,13 +2,24 @@ baliance.com/gooxml v1.0.1 h1:fG5lmxmjEVFfbKQ2NuyCuU3hMuuOb5avh5a38SZNO1o=
 baliance.com/gooxml v1.0.1/go.mod h1:+gpUgmkAF4zCtwOFPNRLDAvpVRWoKs5EeQTSv/HYFnw=
 cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
 cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
-cloud.google.com/go v0.37.4 h1:glPeL3BQJsbF6aIIYfZizMwc5LTYz250bDMjttbBGAU=
 cloud.google.com/go v0.37.4/go.mod h1:NHPJ89PdicEuT9hdPXMROBD91xc5uRDxsMtSB16k7hw=
+cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU=
+cloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU=
+cloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY=
+cloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc=
+cloud.google.com/go v0.46.3 h1:AVXDdKsrtX33oR9fbCMu/+c1o8Ofjq6Ku/MInaLVg5Y=
+cloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0=
+cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o=
+cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE=
+cloud.google.com/go/firestore v1.1.0/go.mod h1:ulACoGHTpvq5r8rxGJ4ddJZBZqakUQqClKRT5SZwBmk=
+cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I=
+cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw=
 dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU=
 github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
 github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo=
 github.com/HdrHistogram/hdrhistogram-go v1.1.2/go.mod h1:yDgFjdqOqDEKOvasDdhWNXYg9BVp4O+o5f6V/ehm6Oo=
 github.com/Knetic/govaluate v3.0.0+incompatible/go.mod h1:r7JcOSlj0wfOMncg0iLm8Leh48TZaKVeNIfJntJ2wa0=
+github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU=
 github.com/PuerkitoBio/goquery v1.9.1 h1:mTL6XjbJTZdpfL+Gwl5U2h1l9yEkJjhmlTeV9VPW7UI=
 github.com/PuerkitoBio/goquery v1.9.1/go.mod h1:cW1n6TmIMDoORQU5IU/P1T3tGFunOeXEpGP2WHRwkbY=
 github.com/SebastiaanKlippert/go-wkhtmltopdf v1.9.2 h1:enQwehstpeaAnsyse1Aqb6r0sU5UJbiNvIqVmPo+KWI=
@@ -88,6 +99,9 @@ github.com/antlr/antlr4/runtime/Go/antlr v0.0.0-20211218165449-dd623ecc2f02/go.m
 github.com/apache/thrift v0.12.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ=
 github.com/araddon/dateparse v0.0.0-20210429162001-6b43995a97de h1:FxWPpzIjnTlhPwqqXc4/vE0f7GvRjuAsbW+HOIe8KnA=
 github.com/araddon/dateparse v0.0.0-20210429162001-6b43995a97de/go.mod h1:DCaWoUhZrYW9p1lxo/cm8EmUOOzAPSEZNGF2DK1dJgw=
+github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o=
+github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY=
+github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8=
 github.com/astaxie/beego v1.12.3/go.mod h1:p3qIm0Ryx7zeBHLljmd7omloyca1s4yu1a8kM1FkpIA=
 github.com/aws/aws-sdk-go v1.51.2 h1:Ruwgz5aqIXin5Yfcgc+PCzoqW5tEGb9aDL/JWDsre7k=
 github.com/aws/aws-sdk-go v1.51.2/go.mod h1:LF8svs817+Nz+DmiMQKTO3ubZ/6IaTpq3TjupRn3Eqk=
@@ -105,11 +119,14 @@ github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24
 github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8=
 github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM=
 github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw=
+github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs=
+github.com/bketelsen/crypt v0.0.3-0.20200106085610-5cbc8cc4026c/go.mod h1:MKsuJmJgSg28kpZDP6UIiPt0e0Oz0kqKNGyRaWEPv84=
 github.com/boombuler/barcode v1.0.0/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8=
 github.com/bradfitz/gomemcache v0.0.0-20180710155616-bc664df96737/go.mod h1:PmM6Mmwb0LSuEubjR8N7PtNe1KxZLtOUHtbeikc5h60=
 github.com/bradfitz/gomemcache v0.0.0-20220106215444-fb4bf637b56d h1:pVrfxiGfwelyab6n21ZBkbkmbevaf+WvMIiR7sr97hw=
 github.com/bradfitz/gomemcache v0.0.0-20220106215444-fb4bf637b56d/go.mod h1:H0wQNHz2YrLsuXOZozoeDmnHXkNCRmMW0gwFWDfEZDA=
 github.com/casbin/casbin v1.7.0/go.mod h1:c67qKN6Oum3UF5Q1+BByfFxkwKvhwW57ITjqwtzR1KE=
+github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc=
 github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
 github.com/cespare/xxhash/v2 v2.1.2/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
 github.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44=
@@ -122,6 +139,11 @@ github.com/clbanning/mxj/v2 v2.5.5/go.mod h1:hNiWqW14h+kc+MdF9C6/YoRfjEJoR3ou6tn
 github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=
 github.com/cloudflare/golz4 v0.0.0-20150217214814-ef862a3cdc58/go.mod h1:EOBUe0h4xcZ5GoxqC5SDxFQ8gwyZPKQoEzownBlhI80=
 github.com/cockroachdb/apd v1.1.0/go.mod h1:8Sl8LxpKi29FqWXR16WEFZRNSz3SoPzUzeMeY4+DwBQ=
+github.com/coreos/bbolt v1.3.2/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk=
+github.com/coreos/etcd v3.3.13+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE=
+github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk=
+github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4=
+github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA=
 github.com/couchbase/go-couchbase v0.0.0-20200519150804-63f3cdb75e0d/go.mod h1:TWI8EKQMs5u5jLKW/tsb9VwauIrMIxQG1r5fMsswK5U=
 github.com/couchbase/gomemcached v0.0.0-20200526233749-ec430f949808/go.mod h1:srVSlQLB8iXBVXHgnqemxUXqN6FCvClgCMPCsjBDR7c=
 github.com/couchbase/goutils v0.0.0-20180530154633-e865a1461c8a/go.mod h1:BQwMFlJzDjFDG3DJUdU0KORxn88UlsOULuxLExMh3Hs=
@@ -136,6 +158,7 @@ github.com/dgrijalva/jwt-go v3.2.0+incompatible h1:7qlOGliEKZXTDg6OTjfoBKDXWrumC
 github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ=
 github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f h1:lO4WD4F/rVNCu3HqELle0jiPLLBs70cWOduZpkS1E78=
 github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f/go.mod h1:cuUVRXasLTGF7a8hSLbxyZXjz+1KgoB3wDUb6vlszIc=
+github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no=
 github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY=
 github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto=
 github.com/eapache/go-resiliency v1.1.0/go.mod h1:kFI+JgMyC7bLPUVY133qvEBtVayf5mFgVsvEsIPBvNs=
@@ -146,6 +169,7 @@ github.com/elastic/go-elasticsearch/v6 v6.8.5/go.mod h1:UwaDJsD3rWLM5rKNFzv9hgox
 github.com/elazarl/go-bindata-assetfs v1.0.0/go.mod h1:v+YaWX3bdea5J/mo8dSETolEo7R71Vk1u8bnjau5yw4=
 github.com/elazarl/go-bindata-assetfs v1.0.1 h1:m0kkaHRKEu7tUIUFVwhGGGYClXvyl4RE03qmvRTNfbw=
 github.com/elazarl/go-bindata-assetfs v1.0.1/go.mod h1:v+YaWX3bdea5J/mo8dSETolEo7R71Vk1u8bnjau5yw4=
+github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4=
 github.com/fatih/structs v1.1.0 h1:Q7juDM0QtcnhCpeyLGQKyg4TOIghuNXrkL32pHAUMxo=
 github.com/fatih/structs v1.1.0/go.mod h1:9NiDSp5zOcgEDl+j00MP/WkGVPOlPRLejGD8Ga6PJ7M=
 github.com/fogleman/gg v1.2.1-0.20190220221249-0403632d5b90/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k=
@@ -158,6 +182,7 @@ github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4
 github.com/fsnotify/fsnotify v1.6.0 h1:n+5WquG0fcWoWp6xPWfHdbskMCQaFnG6PfBrh1Ky4HY=
 github.com/fsnotify/fsnotify v1.6.0/go.mod h1:sl3t1tCWJFWoRz9R8WJCbQihKKwmorjAbSClcnxKAGw=
 github.com/garyburd/redigo v1.6.3/go.mod h1:rTb6epsqigu3kYKBnaF028A7Tf/Aw5s0cqA47doKKqw=
+github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04=
 github.com/glendc/gopher-json v0.0.0-20170414221815-dc4743023d0c/go.mod h1:Gja1A+xZ9BoviGJNA2E9vFkPjjsl+CoJxSXiQM1UXtw=
 github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU=
 github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=
@@ -166,6 +191,14 @@ github.com/go-ldap/ldap v3.0.3+incompatible h1:HTeSZO8hWMS1Rgb2Ziku6b8a7qRIZZMHj
 github.com/go-ldap/ldap v3.0.3+incompatible/go.mod h1:qfd9rJvER9Q0/D/Sqn1DfHRoBp40uXYvFoEVrNEPqRc=
 github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE=
 github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk=
+github.com/go-playground/assert/v2 v2.0.1 h1:MsBgLAaY856+nPRTKrp3/OZK38U/wa0CcBYNjji3q3A=
+github.com/go-playground/assert/v2 v2.0.1/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4=
+github.com/go-playground/locales v0.13.0 h1:HyWk6mgj5qFqCT5fjGBuRArbVDfE4hi8+e8ceBS/t7Q=
+github.com/go-playground/locales v0.13.0/go.mod h1:taPMhCMXrRLJO55olJkUXHZBHCxTMfnGwq/HNwmWNS8=
+github.com/go-playground/universal-translator v0.17.0 h1:icxd5fm+REJzpZx7ZfpaD876Lmtgy7VtROAbHHXk8no=
+github.com/go-playground/universal-translator v0.17.0/go.mod h1:UkSxE5sNxxRwHyU+Scu5vgOQjsIJAF8j9muTVoKLVtA=
+github.com/go-playground/validator/v10 v10.4.1 h1:pH2c5ADXtd66mxoE0Zm9SUhxE20r7aM3F26W0hOn+GE=
+github.com/go-playground/validator/v10 v10.4.1/go.mod h1:nlOn6nFhuKACm19sB/8EGNn9GlaMV7XkbRSipzJ0Ii4=
 github.com/go-redis/redis v6.14.2+incompatible/go.mod h1:NAIEuMOZ/fxfXJIrKDQDz8wamY7mA7PouImQ2Jvg6kA=
 github.com/go-redis/redis/v8 v8.11.5/go.mod h1:gREzHqY1hg6oD9ngVRbLStwAWKhA0FEgq8Jd4h5lpwo=
 github.com/go-redis/redis/v8 v8.11.6-0.20220405070650-99c79f7041fc h1:jZY+lpZB92nvBo2f31oPC/ivGll6NcsnEOORm8Fkr4M=
@@ -184,12 +217,15 @@ github.com/go-xorm/xorm v0.7.9/go.mod h1:XiVxrMMIhFkwSkh96BW7PACl7UhLtx2iJIHMdmj
 github.com/gofrs/uuid v3.2.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM=
 github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ=
 github.com/gogo/protobuf v1.2.0/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ=
+github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4=
 github.com/goji/httpauth v0.0.0-20160601135302-2da839ab0f4d/go.mod h1:nnjvkQ9ptGaCkuDUx6wNykzzlUixGxvkme+H/lnzb+A=
 github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0 h1:DACJavvAHhabrF08vX0COfcOBJRhZ8lUbR+ZWIs0Y5g=
 github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k=
 github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=
+github.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
 github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=
 github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=
+github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y=
 github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
 github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
 github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
@@ -206,6 +242,8 @@ github.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg
 github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=
 github.com/golang/snappy v0.0.0-20170215233205-553a64147049/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
 github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
+github.com/golang/snappy v0.0.1 h1:Qgr9rKW7uDUkrbSmQeiDsGa8SjGyCOGtuasMWwvp2P4=
+github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
 github.com/gomodule/redigo v2.0.0+incompatible/go.mod h1:B4C85qUVwatsJoIUNIfCRsp7qO0iAmpGFZ4EELWSbC4=
 github.com/gonum/blas v0.0.0-20181208220705-f22b278b28ac h1:Q0Jsdxl5jbxouNs1TQYt0gxesYMU4VXRbsTlgDloZ50=
 github.com/gonum/blas v0.0.0-20181208220705-f22b278b28ac/go.mod h1:P32wAyui1PQ58Oce/KYkOqQv8cVw1zAapXOl+dRFGbc=
@@ -222,10 +260,12 @@ github.com/gonum/matrix v0.0.0-20181209220409-c518dec07be9/go.mod h1:0EXg4mc1CNP
 github.com/gonum/stat v0.0.0-20181125101827-41a0da705a5b h1:fbskpz/cPqWH8VqkQ7LJghFkl2KPAiIFUHrTJ2O3RGk=
 github.com/gonum/stat v0.0.0-20181125101827-41a0da705a5b/go.mod h1:Z4GIJBJO3Wa4gD4vbwQxXXZ+WHmW6E9ixmNrwvs0iZs=
 github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=
+github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=
 github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=
 github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
 github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
 github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
+github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
 github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
 github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
 github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38=
@@ -233,25 +273,52 @@ github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeN
 github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
 github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs=
 github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc=
+github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc=
 github.com/google/pprof v0.0.0-20210407192527-94a9f03dee38/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=
+github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI=
 github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0=
 github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
 github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg=
+github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk=
 github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=
 github.com/gopherjs/gopherjs v0.0.0-20200217142428-fce0ec30dd00/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=
 github.com/gorilla/context v1.1.1/go.mod h1:kBGZzfjB9CEq2AlWe17Uuf7NDRt0dE0s8S51q0aT7Yg=
 github.com/gorilla/css v1.0.0 h1:BQqNyPTi50JCFMTw/b67hByjMVXZRwGha6wxVGkeihY=
 github.com/gorilla/css v1.0.0/go.mod h1:Dn721qIggHpt4+EFCcTLTU/vk5ySda2ReITrtgBl60c=
 github.com/gorilla/mux v1.6.2/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs=
+github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE=
 github.com/gorilla/websocket v1.5.1 h1:gmztn0JnHVt9JZquRuzLw3g4wouNVzKL15iLr/zn/QY=
 github.com/gorilla/websocket v1.5.1/go.mod h1:x3kM2JMyaluk02fnUJpQuwD2dCS5NDG2ZHL0uE0tcaY=
+github.com/grpc-ecosystem/go-grpc-middleware v1.0.0/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs=
+github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk=
+github.com/grpc-ecosystem/grpc-gateway v1.9.0/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY=
 github.com/h2non/filetype v1.1.3 h1:FKkx9QbD7HR/zjK1Ia5XiBsq9zdLi5Kf3zGyFTAFkGg=
 github.com/h2non/filetype v1.1.3/go.mod h1:319b3zT68BvV+WRj7cwy856M2ehB3HqNOt6sy1HndBY=
 github.com/h2non/parth v0.0.0-20190131123155-b4df798d6542 h1:2VTzZjLZBgl62/EtslCrtky5vbi9dd7HrQPQIx6wqiw=
 github.com/h2non/parth v0.0.0-20190131123155-b4df798d6542/go.mod h1:Ow0tF8D4Kplbc8s8sSb3V2oUCygFHVp8gC3Dn6U4MNI=
+github.com/hashicorp/consul/api v1.1.0/go.mod h1:VmuI/Lkw1nC05EYQWNKwWGbkg+FbDBtguAZLlVdkD9Q=
+github.com/hashicorp/consul/sdk v0.1.1/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8=
+github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4=
+github.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80=
+github.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60=
+github.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM=
+github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk=
+github.com/hashicorp/go-rootcerts v1.0.0/go.mod h1:K6zTfqpRlCUIjkwsN4Z+hiSfzSTQa6eBIzfwKfwNnHU=
+github.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU=
+github.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4=
+github.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=
+github.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=
+github.com/hashicorp/go.net v0.0.1/go.mod h1:hjKkEWcCURg++eb33jQU7oqQcI9XDCnUzHA0oac0k90=
 github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=
+github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=
 github.com/hashicorp/golang-lru v0.5.4 h1:YDjusn29QI/Das2iO9M0BHnIbxPeyuCHsjMW+lJfyTc=
 github.com/hashicorp/golang-lru v0.5.4/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4=
+github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4=
+github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ=
+github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64=
+github.com/hashicorp/mdns v1.0.0/go.mod h1:tL+uN++7HEJ6SQLQ2/p+z2pH24WQKWjBPkE0mNTz8vQ=
+github.com/hashicorp/memberlist v0.1.3/go.mod h1:ajVTdAv/9Im8oMAAj5G31PhhMCZJV2pPBoIllUwCN7I=
+github.com/hashicorp/serf v0.8.2/go.mod h1:6hOLApaqBFA1NXqRQAsxw9QxuDEvNxSQRwA/JwenrHc=
 github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU=
 github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc=
 github.com/jackc/fake v0.0.0-20150926172116-812a484cc733/go.mod h1:WrMFNQdiFJ80sQsxDoMokWK1W5TQtxBFNpzWTD84ibQ=
@@ -261,6 +328,7 @@ github.com/jmespath/go-jmespath v0.4.0 h1:BEgLn5cpjn8UN1mAw4NjwDrS35OdebyEtFe+9Y
 github.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo=
 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/json-iterator/go v1.1.5/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU=
@@ -277,7 +345,9 @@ github.com/jung-kurt/gofpdf v1.16.2 h1:jgbatWHfRlPYiK85qgevsZTHviWXKwB1TTiKdz5Pt
 github.com/jung-kurt/gofpdf v1.16.2/go.mod h1:1hl7y57EsiPAkLbOwzpzqgx1A30nQCk/YmFV8S2vmK0=
 github.com/kgiannakakis/mp3duration v0.0.0-20191013070830-d834f8d5ed53 h1:+8X3HMX8A2QhvNg3dImiQTCiVUt6BQXz1mW+/DrWI+k=
 github.com/kgiannakakis/mp3duration v0.0.0-20191013070830-d834f8d5ed53/go.mod h1:E61jD6q4yJ6Cu9uDGRAfiENM1G5TVZhOog0Y3+GgTpQ=
+github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q=
 github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=
+github.com/klauspost/compress v1.13.6/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk=
 github.com/klauspost/compress v1.17.6 h1:60eq2E/jlfwQXtvZEeBUYADs+BwKBWURIY+Gj2eRGjI=
 github.com/klauspost/compress v1.17.6/go.mod h1:/dCuZOvVtNoHsyb+cuJD3itjs3NbnF6KH9zAO4BDxPM=
 github.com/klauspost/cpuid/v2 v2.0.1/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg=
@@ -293,12 +363,18 @@ github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
 github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=
 github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=
 github.com/ledisdb/ledisdb v0.0.0-20200510135210-d35789ec47e6/go.mod h1:n931TsDuKuq+uX4v1fulaMbA/7ZLLhjc85h7chZGBCQ=
+github.com/leodido/go-urn v1.2.0 h1:hpXL4XnriNwQ/ABnpepYM/1vCLWNDfUNts8dX3xTG6Y=
+github.com/leodido/go-urn v1.2.0/go.mod h1:+8+nEpDfqqsY+g338gtMEUOtuK+4dEMhiQEgxpxOKII=
 github.com/lib/pq v1.0.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo=
 github.com/lib/pq v1.10.4/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o=
 github.com/lib/pq v1.10.5 h1:J+gdV2cUmX7ZqL2B0lFcW0m+egaHC2V3lpO8nWxyYiQ=
 github.com/lib/pq v1.10.5/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o=
+github.com/magiconair/properties v1.8.1 h1:ZC2Vc7/ZFkGmsVC9KvOjumD+G5lXy2RtTKyzRKO2BQ4=
+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.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU=
+github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4=
 github.com/mattn/go-runewidth v0.0.10/go.mod h1:RAqKPSqVFrSLVXbA8x7dzmKdmGzieGRCM46jaSJTDAk=
 github.com/mattn/go-sqlite3 v1.10.0/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc=
 github.com/mattn/go-sqlite3 v2.0.3+incompatible h1:gXHsfypPkaMZrKbD5209QV9jbUTJKjyR5WD3HYQSd+U=
@@ -308,12 +384,20 @@ github.com/matttproud/golang_protobuf_extensions v1.0.4 h1:mmDVorXM7PCGKw94cs5zk
 github.com/matttproud/golang_protobuf_extensions v1.0.4/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4=
 github.com/microcosm-cc/bluemonday v1.0.26 h1:xbqSvqzQMeEHCqMi64VAs4d8uy6Mequs3rQ0k/Khz58=
 github.com/microcosm-cc/bluemonday v1.0.26/go.mod h1:JyzOCs9gkyQyjs+6h10UEVSe02CGwkhd72Xdqh78TWs=
+github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg=
 github.com/minio/md5-simd v1.1.2 h1:Gdi1DZK69+ZVMoNHRXJyNcxrMA4dSxoYHZSQbirFg34=
 github.com/minio/md5-simd v1.1.2/go.mod h1:MzdKDxYpY2BT9XQFocsiZf/NKVtR7nkE4RoEpN+20RM=
 github.com/minio/minio-go/v7 v7.0.69 h1:l8AnsQFyY1xiwa/DaQskY4NXSLA2yrGsW5iD9nRPVS0=
 github.com/minio/minio-go/v7 v7.0.69/go.mod h1:XAvOPJQ5Xlzk5o3o/ArO2NMbhSGkimC+bpW/ngRKDmQ=
 github.com/minio/sha256-simd v1.0.1 h1:6kaan5IFmwTNynnKKpDHe6FWHohJOHhCPchzK49dzMM=
 github.com/minio/sha256-simd v1.0.1/go.mod h1:Pz6AKMiUdngCLpeTL/RJY1M9rUuPMYujV5xJjtbRSN8=
+github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc=
+github.com/mitchellh/go-homedir v1.0.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0=
+github.com/mitchellh/go-testing-interface v1.0.0/go.mod h1:kRemZodwjscx+RGhAo8eIhFbs2+BFgRtFPeD/KE+zxI=
+github.com/mitchellh/gox v0.4.0/go.mod h1:Sd9lOJ0+aimLBi73mGofS1ycjY8lL3uZM3JPS42BGNg=
+github.com/mitchellh/iochan v1.0.0/go.mod h1:JwYml1nuB7xOzsp52dPpHFffvOCDupsG0QubkSMEySY=
+github.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y=
+github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y=
 github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY=
 github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo=
 github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
@@ -327,6 +411,8 @@ github.com/mohae/deepcopy v0.0.0-20170929034955-c48cc78d4826 h1:RWengNIwukTxcDr9
 github.com/mohae/deepcopy v0.0.0-20170929034955-c48cc78d4826/go.mod h1:TaXosZuwdSHYgviHp1DAtfrULt5eUgsSMsZf+YrPgl8=
 github.com/mojocn/base64Captcha v1.3.6 h1:gZEKu1nsKpttuIAQgWHO+4Mhhls8cAKyiV2Ew03H+Tw=
 github.com/mojocn/base64Captcha v1.3.6/go.mod h1:i5CtHvm+oMbj1UzEPXaA8IH/xHFZ3DGY3Wh3dBpZ28E=
+github.com/montanaflynn/stats v0.0.0-20171201202039-1bf9dbcd8cbe h1:iruDEfMl2E6fbMZ9s0scYfZQ84/6SPL6zC8ACM2oIL0=
+github.com/montanaflynn/stats v0.0.0-20171201202039-1bf9dbcd8cbe/go.mod h1:wL8QJuTMNUDYhXwkmfOly8iTdp5TEcJFWZD2D7SIkUc=
 github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=
 github.com/nbio/st v0.0.0-20140626010706-e9e8d9816f32/go.mod h1:9wM+0iRr9ahx58uYLpLIr5fm8diHn0JbqRycJi6w0Ms=
 github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno=
@@ -335,6 +421,7 @@ github.com/nosixtools/solarlunar v0.0.0-20211112060703-1b6dea7b4a19/go.mod h1:Lj
 github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A=
 github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE=
 github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU=
+github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U=
 github.com/olivere/elastic/v7 v7.0.32 h1:R7CXvbu8Eq+WlsLgxmKVKPox0oOwAE/2T9Si5BnvK6E=
 github.com/olivere/elastic/v7 v7.0.32/go.mod h1:c7PVmLe3Fxq77PIfY/bZmxY/TAamBhCzZ8xDOE09a9k=
 github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
@@ -355,8 +442,11 @@ github.com/onsi/gomega v1.19.0/go.mod h1:LY+I3pBVzYsTBU1AnDwOSxaYi9WoWiqgwooUqq9
 github.com/opentracing/opentracing-go v1.2.1-0.20220228012449-10b1cf09e00b h1:FfH+VrHHk6Lxt9HdVS0PXzSXFyS2NbZKXv33FYPol0A=
 github.com/opentracing/opentracing-go v1.2.1-0.20220228012449-10b1cf09e00b/go.mod h1:AC62GU6hc0BrNm+9RK9VSiwa/EUe1bkIeFORAMcHvJU=
 github.com/openzipkin/zipkin-go v0.1.6/go.mod h1:QgAqvLzwWbR/WpD4A3cGpPtJrZXNIiJc5AZX7/PBEpw=
+github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc=
 github.com/pelletier/go-toml v1.0.1/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic=
 github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic=
+github.com/pelletier/go-toml v1.9.2 h1:7NiByeVF4jKSG1lDF3X8LTIkq2/bu+1uYbIm1eS5tzk=
+github.com/pelletier/go-toml v1.9.2/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c=
 github.com/peterh/liner v1.0.1-0.20171122030339-3681c2a91233/go.mod h1:xIteQHvHuaLYG9IFj6mSxM0fCKrs34IrEQUhOYuGPHc=
 github.com/phpdave11/gofpdi v1.0.7/go.mod h1:vBmVV0Do6hSBHC8uKUQ71JGW+ZGQq74llk/7bXwjDoI=
 github.com/pierrec/lz4 v2.0.5+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY=
@@ -366,8 +456,10 @@ github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
 github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
 github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
 github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
+github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI=
 github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw=
 github.com/prometheus/client_golang v0.9.3-0.20190127221311-3c4408c8b829/go.mod h1:p2iRAGwDERtqlqzRXnrOVns+ignqQo//hLXqYxZYVNs=
+github.com/prometheus/client_golang v0.9.3/go.mod h1:/TN21ttK/J9q6uSwhBd54HahCDft0ttaMvbicHlPoso=
 github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo=
 github.com/prometheus/client_golang v1.7.0/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M=
 github.com/prometheus/client_golang v1.16.0 h1:yk/hx9hDbrGHovbci4BY+pRMfSuuat626eFsHb7tmT8=
@@ -378,17 +470,23 @@ github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:
 github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
 github.com/prometheus/client_model v0.3.0 h1:UBgGFHqYdG/TPFD1B1ogZywDqEkwp3fBMvqdiQ7Xew4=
 github.com/prometheus/client_model v0.3.0/go.mod h1:LDGWKZIo7rky3hgvBe+caln+Dr3dPggB5dvjtD7w9+w=
+github.com/prometheus/common v0.0.0-20181113130724-41aa239b4cce/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro=
 github.com/prometheus/common v0.2.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4=
+github.com/prometheus/common v0.4.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4=
 github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4=
 github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo=
 github.com/prometheus/common v0.42.0 h1:EKsfXEYo4JpWMHH5cg+KOUWeuJSov1Id8zGR8eeI1YM=
 github.com/prometheus/common v0.42.0/go.mod h1:xBwqVerjNdUDjgODMpudtOMwlOwf2SaTr1yjz4b7Zbc=
 github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk=
 github.com/prometheus/procfs v0.0.0-20190117184657-bf6a532e95b1/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk=
+github.com/prometheus/procfs v0.0.0-20190507164030-5867b95ac084/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA=
 github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA=
 github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU=
 github.com/prometheus/procfs v0.10.1 h1:kYK1Va/YMlutzCGazswoHKo//tZVlFpKYh+PymziUAg=
 github.com/prometheus/procfs v0.10.1/go.mod h1:nwNm2aOCAYw8uTR/9bWRREkZFxAUcWzPHWJq+XBB/FM=
+github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU=
+github.com/qiniu/qmgo v1.1.8 h1:E64M+P59aqQpXKI24ClVtluYkLaJLkkeD2hTVhrdMks=
+github.com/qiniu/qmgo v1.1.8/go.mod h1:QvZkzWNEv0buWPx0kdZsSs6URhESVubacxFPlITmvB8=
 github.com/rcrowley/go-metrics v0.0.0-20181016184325-3113b8401b8a/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4=
 github.com/rdlucklib/rdluck_tools v1.0.3 h1:iOtK2QPlPQ6CL6c1htCk5VnFCHzyG6DCfJtunrMswK0=
 github.com/rdlucklib/rdluck_tools v1.0.3/go.mod h1:9Onw9o4w19C8KE5lxb8GyxgRBbZweRVkQSc79v38EaA=
@@ -398,12 +496,16 @@ github.com/richardlehane/msoleps v1.0.1/go.mod h1:BWev5JBpU9Ko2WAgmZEuiz4/u3ZYTK
 github.com/richardlehane/msoleps v1.0.3 h1:aznSZzrwYRl3rLKRT3gUk9am7T/mLNSnJINvN0AQoVM=
 github.com/richardlehane/msoleps v1.0.3/go.mod h1:BWev5JBpU9Ko2WAgmZEuiz4/u3ZYTKbjLycmwiWUfWg=
 github.com/rivo/uniseg v0.1.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc=
+github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg=
+github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=
 github.com/rogpeppe/go-internal v1.10.0 h1:TMyTOH3F/DB16zRVcYyreMH6GnZZrwQVAoYjRBZyWFQ=
 github.com/rogpeppe/go-internal v1.10.0/go.mod h1:UQnix2H7Ngw/k4C5ijL5+65zddjncjaFoBhdsK/akog=
 github.com/rs/xid v1.5.0 h1:mKX4bl4iPYJtEIxp6CYiUuLQ/8DYMoz0PUdtGgMFRVc=
 github.com/rs/xid v1.5.0/go.mod h1:trrq9SKmegXys3aeAKXMUTdJsYXVwGY3RLcfgqegfbg=
 github.com/ruudk/golang-pdf417 v0.0.0-20181029194003-1af4ab5afa58/go.mod h1:6lfFZQK844Gfx8o5WFuvpxWRwnSoipWe/p622j1v06w=
+github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts=
 github.com/scylladb/termtables v0.0.0-20191203121021-c4c0b6d42ff4/go.mod h1:C1a7PQSMz9NShzorzCiG2fk9+xuCgLkPeCvMHYR2OWg=
+github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc=
 github.com/shiena/ansicolor v0.0.0-20151119151921-a422bbe96644/go.mod h1:nkxAfR/5quYxwPZhyDxgasBMnRtBZd0FCEpawpjMUFg=
 github.com/shiena/ansicolor v0.0.0-20200904210342-c7312218db18 h1:DAYUYH5869yV94zvCES9F51oYtN5oGlwjxJJz7ZCnik=
 github.com/shiena/ansicolor v0.0.0-20200904210342-c7312218db18/go.mod h1:nkxAfR/5quYxwPZhyDxgasBMnRtBZd0FCEpawpjMUFg=
@@ -423,21 +525,37 @@ github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVs
 github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc=
 github.com/smartystreets/assertions v1.1.0/go.mod h1:tcbTF8ujkAEcZ8TElKY+i30BzYlVhC/LOxJk7iOWnoo=
 github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA=
+github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM=
+github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA=
+github.com/spf13/afero v1.1.2 h1:m8/z1t7/fwjysjQRYbP0RD+bUIF/8tJwPdEZsI83ACI=
+github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ=
+github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE=
 github.com/spf13/cast v1.4.1/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE=
 github.com/spf13/cast v1.5.0 h1:rj3WzYc11XZaIZMPKmwP96zkFEnnAmV8s6XbB2aY32w=
 github.com/spf13/cast v1.5.0/go.mod h1:SpXXQ5YoyJw6s3/6cMTQuxvgRl3PCJiyaX9p6b155UU=
+github.com/spf13/jwalterweatherman v1.0.0 h1:XHEdyB+EcvlqZamSM4ZOMGlc93t6AcsBEu9Gc1vn7yk=
+github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo=
+github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4=
+github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA=
+github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg=
+github.com/spf13/viper v1.7.0 h1:xVKxvI7ouOI5I+U9s2eeiUfMaWBVoXA3AWskkrqK0VM=
+github.com/spf13/viper v1.7.0/go.mod h1:8WkrPz2fc9jxqZNCJI/76HCieCp4Q8HaLFoCha5qpdg=
 github.com/ssdb/gossdb v0.0.0-20180723034631-88f6b59b84ec/go.mod h1:QBvMkMya+gXctz3kmljlUCu/yB3GZ6oee+dUozsezQE=
 github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
 github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
+github.com/stretchr/objx v0.2.0 h1:Hbg2NidpLE8veEBkEZTL3CvlkUIVzuU9jDplZO54c48=
 github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE=
 github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
 github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
 github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=
 github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA=
+github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
 github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
 github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
 github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk=
 github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=
+github.com/subosito/gotenv v1.2.0 h1:Slr1R9HxAlEKefgq5jn9U+DnETlIUa6HfgEzj0g5d7s=
+github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw=
 github.com/syndtr/goleveldb v0.0.0-20160425020131-cfa635847112/go.mod h1:Z4AUp2Km+PwemOoO/VB5AOx9XSsIItzFjoJlOSiYmn0=
 github.com/syndtr/goleveldb v0.0.0-20181127023241-353a9fca669c/go.mod h1:Z4AUp2Km+PwemOoO/VB5AOx9XSsIItzFjoJlOSiYmn0=
 github.com/tealeg/xlsx v1.0.5 h1:+f8oFmvY8Gw1iUXzPk+kz+4GpbDZPK1FhPiQRd+ypgE=
@@ -453,16 +571,27 @@ github.com/tidwall/gjson v1.14.1 h1:iymTbGkQBhveq21bEvAQ81I0LEBork8BFe1CUZXdyuo=
 github.com/tidwall/gjson v1.14.1/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk=
 github.com/tidwall/match v1.1.1 h1:+Ho715JplO36QYgwN9PGYNhgZvoUSc9X2c80KVTi+GA=
 github.com/tidwall/match v1.1.1/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JTxsfmM=
+github.com/tidwall/pretty v1.0.0/go.mod h1:XNkn88O1ChpSDQmQeStsy+sBenx6DDtFZJxhVysOjyk=
 github.com/tidwall/pretty v1.2.0 h1:RWIZEg2iJ8/g6fDDYzMpobmaoGh5OLl4AXtGUGPcqCs=
 github.com/tidwall/pretty v1.2.0/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU=
 github.com/tjfoc/gmsm v1.3.2 h1:7JVkAn5bvUJ7HtU08iW6UiD+UTmJTIToHCfeFzkcCxM=
 github.com/tjfoc/gmsm v1.3.2/go.mod h1:HaUcFuY0auTiaHB9MHFGCPx5IaLhTUd2atbCFBQXn9w=
+github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U=
 github.com/uber/jaeger-client-go v2.30.0+incompatible h1:D6wyKGCecFaSRUpo8lCVbaOOb6ThwMmTEbhRwtKR97o=
 github.com/uber/jaeger-client-go v2.30.0+incompatible/go.mod h1:WVhlPFC8FDjOFMMWRy2pZqQJSXxYSwNYOkTr/Z6d3Kk=
 github.com/uber/jaeger-lib v2.4.1+incompatible h1:td4jdvLcExb4cBISKIpHuGoVXh+dVKhn2Um6rjCsSsg=
 github.com/uber/jaeger-lib v2.4.1+incompatible/go.mod h1:ComeNDZlWwrWnDv8aPp0Ba6+uUTzImX/AauajbLI56U=
 github.com/ugorji/go v0.0.0-20171122102828-84cb69a8af83/go.mod h1:hnLbHMwcvSihnDhEfx2/BzKp2xb0Y+ErdfYcrs9tkJQ=
 github.com/wendal/errors v0.0.0-20130201093226-f66c77a7882b/go.mod h1:Q12BUT7DqIlHRmgv3RskH+UCM/4eqVMgI0EMmlSpAXc=
+github.com/xdg-go/pbkdf2 v1.0.0 h1:Su7DPu48wXMwC3bs7MCNG+z4FhcyEuz5dlvchbq0B0c=
+github.com/xdg-go/pbkdf2 v1.0.0/go.mod h1:jrpuAogTd400dnrH08LKmI/xc1MbPOebTwRqcT5RDeI=
+github.com/xdg-go/scram v1.1.1/go.mod h1:RaEWvsqvNKKvBPvcKeFjrG2cJqOkHTiyTpzz23ni57g=
+github.com/xdg-go/scram v1.1.2 h1:FHX5I5B4i4hKRVRBCFRxq1iQRej7WO3hhBuJf+UUySY=
+github.com/xdg-go/scram v1.1.2/go.mod h1:RT/sEzTbU5y00aCK8UOx6R7YryM0iF1N2MOmC3kKLN4=
+github.com/xdg-go/stringprep v1.0.3/go.mod h1:W3f5j4i+9rC0kuIEJL0ky1VpHXQU3ocBgklLGvcBnW8=
+github.com/xdg-go/stringprep v1.0.4 h1:XLI/Ng3O1Atzq0oBs3TWm+5ZVgkq2aqdlvP9JtoZ6c8=
+github.com/xdg-go/stringprep v1.0.4/go.mod h1:mPGuuIYwz7CmR2bT9j4GbQqutWS1zV24gijq1dTyGkM=
+github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU=
 github.com/xuri/efp v0.0.0-20231025114914-d1ff6096ae53 h1:Chd9DkqERQQuHpXjR/HSV1jLZA6uaoiwwH3vSuF3IW0=
 github.com/xuri/efp v0.0.0-20231025114914-d1ff6096ae53/go.mod h1:ybY/Jr0T0GTCnYjKqmdwxyxn2BQf2RcQIIvex5QldPI=
 github.com/xuri/excelize/v2 v2.8.1 h1:pZLMEwK8ep+CLIUWpWmvW8IWE/yxqG0I1xcN6cVMGuQ=
@@ -472,6 +601,8 @@ github.com/xuri/nfp v0.0.0-20230919160717-d98342af3f05/go.mod h1:WwHg+CVyzlv/TX9
 github.com/yidane/formula v0.0.0-20220322063702-c9da84ba3476 h1:66fLxv8xlhSr42ZhVAYjUY/sEF0olUUAESVlsxVduuw=
 github.com/yidane/formula v0.0.0-20220322063702-c9da84ba3476/go.mod h1:9/dQiKiN04yPMdgsuFmKGuI2Hdp6OmFV9gSWS1col6g=
 github.com/ylywyn/jpush-api-go-client v0.0.0-20190906031852-8c4466c6e369/go.mod h1:Nv7wKD2/bCdKUFNKcJRa99a+1+aSLlCRJFriFYdjz/I=
+github.com/youmark/pkcs8 v0.0.0-20181117223130-1be2e3e5546d h1:splanxYIlg+5LfHAM6xpdFEAYOk8iySO56hMFq6uLyA=
+github.com/youmark/pkcs8 v0.0.0-20181117223130-1be2e3e5546d/go.mod h1:rHwXgn7JulP+udvsHwJoVG1YGAP6VLg4y9I5dyZdqmA=
 github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
 github.com/yuin/goldmark v1.1.30/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
 github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
@@ -481,13 +612,24 @@ github.com/yuin/gopher-lua v0.0.0-20220504180219-658193537a64 h1:5mLPGnFdSsevFRF
 github.com/yuin/gopher-lua v0.0.0-20220504180219-658193537a64/go.mod h1:GBR0iDaNXjAgGg9zfCvksxSRnQx76gclCIb7kdAd1Pw=
 github.com/ziutek/mymysql v1.5.4 h1:GB0qdRGsTwQSBVYuVShFBKaXSnSnYYC2d9knnE1LHFs=
 github.com/ziutek/mymysql v1.5.4/go.mod h1:LMSpPZ6DbqWFxNCHW77HeMg9I646SAhApZ/wKdgO/C0=
+go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU=
+go.mongodb.org/mongo-driver v1.11.6/go.mod h1:G9TgswdsWjX4tmDA5zfs2+6AEPpYJwqblyjsfuh8oXY=
+go.mongodb.org/mongo-driver v1.15.0 h1:rJCKC8eEliewXjZGf0ddURtl7tTVy1TK3bfl0gkUSLc=
+go.mongodb.org/mongo-driver v1.15.0/go.mod h1:Vzb0Mk/pa7e6cWw85R4F/endUC3u0U9jGcNU603k65c=
 go.opencensus.io v0.20.1/go.mod h1:6WKK9ahsWS3RSO+PY9ZHZUfv2irvY6gN279GOPZjmmk=
+go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU=
+go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8=
+go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE=
 go.uber.org/atomic v1.9.0 h1:ECmE8Bn/WFTYwEW/bpKD3M8VtR/zQVbavAoalC1PYyE=
 go.uber.org/atomic v1.9.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc=
+go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0=
+go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q=
 golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
+golang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
 golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
 golang.org/x/crypto v0.0.0-20190325154230-a5d413f7728c/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
 golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
+golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
 golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
 golang.org/x/crypto v0.0.0-20191219195013-becbf705a915/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
 golang.org/x/crypto v0.0.0-20200510223506-06a226fb4e37/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
@@ -504,6 +646,8 @@ golang.org/x/exp v0.0.0-20180807140117-3d87b88a115f/go.mod h1:CJ0aWSM057203Lf6IL
 golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
 golang.org/x/exp v0.0.0-20190125153040-c74c464bbbf2/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
 golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
+golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8=
+golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek=
 golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY=
 golang.org/x/image v0.0.0-20180708004352-c73c2afc3b81/go.mod h1:ux5Hcp/YLpHSI86hEcLt0YII63i6oz57MZXIpbrjZUs=
 golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js=
@@ -515,7 +659,13 @@ golang.org/x/image v0.15.0/go.mod h1:HUYqC05R2ZcZ3ejNQsIHQDQiwWM4JBqmm6MKANTp4LE
 golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
 golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU=
 golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
+golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
+golang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
+golang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
+golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
+golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE=
 golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o=
+golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc=
 golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY=
 golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
 golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
@@ -524,12 +674,18 @@ golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=
 golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
 golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
 golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
+golang.org/x/net v0.0.0-20181023162649-9b4f9f5ad519/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
 golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
+golang.org/x/net v0.0.0-20181201002055-351d144fa1fc/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
+golang.org/x/net v0.0.0-20181220203305-927f97764cc3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
 golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
 golang.org/x/net v0.0.0-20190125091013-d26f9f9a57f3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
 golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
 golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
 golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
+golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
+golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
+golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks=
 golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
 golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
 golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
@@ -551,6 +707,7 @@ golang.org/x/net v0.21.0 h1:AQyQV4dYCvJ7vGmJyKki9+PBdyvhkSd8EIx/qb0AYv4=
 golang.org/x/net v0.21.0/go.mod h1:bIjVDfnllIU7BJ2DNgfnXvpSvtn8VRwhlsaeUTyUS44=
 golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
 golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
+golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
 golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
 golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
 golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
@@ -559,11 +716,17 @@ golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJ
 golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
 golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
 golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
 golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
 golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.2.0 h1:PUR+T4wwASmuSTYdKjYHI5TD22Wy5ogLU5qZCOLxBrI=
+golang.org/x/sync v0.2.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
 golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
 golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
 golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
+golang.org/x/sys v0.0.0-20181026203630-95b1ffbd15a5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
+golang.org/x/sys v0.0.0-20181107165924-66b7b1311ac8/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
 golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
 golang.org/x/sys v0.0.0-20181122145206-62eef0e2fa9b/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
 golang.org/x/sys v0.0.0-20190204203706-41f3e6584952/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
@@ -571,6 +734,10 @@ golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5h
 golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
@@ -611,6 +778,7 @@ golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=
 golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
 golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
 golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=
+golang.org/x/text v0.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ=
 golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=
 golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8=
 golang.org/x/text v0.10.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE=
@@ -618,18 +786,30 @@ golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE=
 golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ=
 golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU=
 golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
+golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
 golang.org/x/time v0.0.0-20200416051211-89c76fbcd5d1/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
 golang.org/x/time v0.0.0-20220609170525-579cf78fd858 h1:Dpdu/EMxGMFgq0CeYMh4fazTD2vtlZRYE7wyynxJb9U=
 golang.org/x/time v0.0.0-20220609170525-579cf78fd858/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
+golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
 golang.org/x/tools v0.0.0-20180525024113-a5b4c53f6e8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
 golang.org/x/tools v0.0.0-20180828015842-6cd1fcedba52/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
 golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
 golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
 golang.org/x/tools v0.0.0-20190206041539-40960b6deb8e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
 golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY=
+golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
+golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
 golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
 golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
+golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=
+golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=
+golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
+golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
+golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
+golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
+golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
 golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
+golang.org/x/tools v0.0.0-20191112195655-aa38f8e97acc/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
 golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
 golang.org/x/tools v0.0.0-20200509030707-2212a7e161a5/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
 golang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
@@ -644,14 +824,30 @@ gonum.org/v1/gonum v0.8.2/go.mod h1:oe/vMfY3deqTw+1EZJhuvEW2iwGF1bW9wwu7XCu0+v0=
 gonum.org/v1/netlib v0.0.0-20190313105609-8cb42192e0e0/go.mod h1:wa6Ws7BG/ESfp6dHfk7C6KdzKA7wR7u/rKwOGE66zvw=
 gonum.org/v1/plot v0.0.0-20190515093506-e2840ee46a6b/go.mod h1:Wt8AAjI+ypCyYX3nZBvf6cAIx93T+c/OS2HFAYskSZc=
 google.golang.org/api v0.3.1/go.mod h1:6wY9I6uQWHQ8EM57III9mq/AjF+i8G65rmVagqKMtkk=
+google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE=
+google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M=
+google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg=
+google.golang.org/api v0.9.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg=
+google.golang.org/api v0.13.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI=
 google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=
 google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
+google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
 google.golang.org/appengine v1.6.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
+google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0=
 google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=
 google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
 google.golang.org/genproto v0.0.0-20190404172233-64821d5d2107/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
+google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
+google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
+google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
+google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=
+google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=
+google.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8=
+google.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=
 google.golang.org/grpc v1.17.0/go.mod h1:6QZJwpn2B+Zp71q/5VxRsJ6NXXVCE5NRUHRo+f3cWCs=
 google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=
+google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38=
+google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM=
 google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8=
 google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0=
 google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM=
@@ -673,18 +869,22 @@ gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8
 gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
 gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=
 gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q=
+gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI=
 gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys=
 gopkg.in/gomail.v2 v2.0.0-20160411212932-81ebce5c23df h1:n7WqCuqOuCbNr617RXOY0AWRXxgwEyPp2z+p0+hgMuE=
 gopkg.in/gomail.v2 v2.0.0-20160411212932-81ebce5c23df/go.mod h1:LRQQ+SO6ZHR7tOkpBDuZnXENFzX8qRjMDMyPD6BRkCw=
 gopkg.in/h2non/gock.v1 v1.1.2 h1:jBbHXgGBK/AoPVfJh5x4r/WxIrElvbLel8TCZkkZJoY=
 gopkg.in/h2non/gock.v1 v1.1.2/go.mod h1:n7UGz/ckNChHiK05rDoiC4MYSunEC/lyaUm2WWaDva0=
+gopkg.in/ini.v1 v1.51.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k=
 gopkg.in/ini.v1 v1.56.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k=
 gopkg.in/ini.v1 v1.66.2/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k=
 gopkg.in/ini.v1 v1.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA=
 gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k=
 gopkg.in/mgo.v2 v2.0.0-20190816093944-a6b53ec6cb22/go.mod h1:yeKp02qBN3iKW1OzL3MGk2IdtZzaj7SFntXj72NppTA=
+gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo=
 gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ=
 gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw=
+gopkg.in/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74=
 gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
 gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
 gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
@@ -700,6 +900,9 @@ gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
 honnef.co/go/tools v0.0.0-20180728063816-88497007e858/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
 honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
 honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
+honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
+honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg=
+rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8=
 rsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4=
 xorm.io/builder v0.3.6 h1:ha28mQ2M+TFx96Hxo+iq6tQgnkC9IZkM6D8w9sKHHF8=
 xorm.io/builder v0.3.6/go.mod h1:LEFAPISnRzG+zxaxj2vPicRwz67BdhFreKg8yv8/TgU=

+ 252 - 0
models/data_manage/base_from_business_index.go

@@ -0,0 +1,252 @@
+package data_manage
+
+import (
+	"eta/eta_api/utils"
+	"github.com/beego/beego/v2/client/orm"
+	"github.com/rdlucklib/rdluck_tools/paging"
+	"time"
+)
+
+// BaseFromBusinessIndex
+// @Description: 外部指标(商家系统)表
+type BaseFromBusinessIndex struct {
+	BaseFromBusinessIndexId int64     `orm:"column(base_from_business_index_id);pk"`
+	IndexCode               string    `description:"指标编码"`
+	IndexName               string    `description:"指标名称"`
+	Unit                    string    `description:"单位"`
+	Frequency               string    `description:"频度"`
+	Source                  int       `description:"数据来源"`
+	SourceName              string    `description:"数据来源名称"`
+	StartDate               time.Time `description:"开始日期"`
+	EndDate                 time.Time `description:"结束日期"`
+	Remark                  string    `description:"备注字段"`
+	BaseModifyTime          time.Time `description:"基础信息(名称,单位,频度)变更时间"`
+	DataUpdateTime          time.Time `description:"最近一次数据发生变化的时间"`
+	CreateTime              time.Time `description:"创建时间"`
+	ModifyTime              time.Time `description:"修改时间"`
+}
+
+var BaseFromBusinessIndexCols = struct {
+	BaseFromBusinessIndexId string
+	IndexCode               string
+	IndexName               string
+	Unit                    string
+	Frequency               string
+	Source                  string
+	SourceName              string
+	StartDate               string
+	EndDate                 string
+	Remark                  string
+	BaseModifyTime          string
+	DataUpdateTime          string
+	CreateTime              string
+	ModifyTime              string
+}{
+	BaseFromBusinessIndexId: "base_from_business_index_id",
+	IndexCode:               "index_code",
+	IndexName:               "index_name",
+	Unit:                    "unit",
+	Frequency:               "frequency",
+	Source:                  "source",
+	SourceName:              "source_name",
+	StartDate:               "start_date",
+	EndDate:                 "end_date",
+	Remark:                  "remark",
+	BaseModifyTime:          "base_modify_time",
+	DataUpdateTime:          "data_update_time",
+	CreateTime:              "create_time",
+	ModifyTime:              "modify_time",
+}
+
+// EdbBusinessSource
+// @Description: 自有数据(商家)指标来源
+type EdbBusinessSource struct {
+	EdbBusinessSourceId int64     `orm:"column(edb_business_source_id);pk"`
+	SourceName          string    `description:"来源名称"` // 来源名称
+	CreateTime          time.Time `description:"创建时间"` // 创建时间
+}
+
+// GetEdbBusinessSourceItem
+// @Description: 根据来源名称获取来源信息
+// @author: Roc
+// @receiver m
+// @datetime 2024-04-25 18:09:03
+// @param sourceName string
+// @return item *EdbBusinessSource
+// @return err error
+func (m *EdbBusinessSource) GetEdbBusinessSourceItem(sourceName string) (item *EdbBusinessSource, err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := `SELECT * FROM edb_business_source WHERE source_name = ? `
+	err = o.Raw(sql, sourceName).QueryRow(&item)
+	return
+}
+
+// GetAllList
+// @Description: 获取所有来源列表
+// @author: Roc
+// @receiver m
+// @datetime 2024-05-06 09:21:42
+// @return items []*EdbBusinessSource
+// @return err error
+func (m *EdbBusinessSource) GetAllList() (items []*EdbBusinessSource, err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := `SELECT * FROM edb_business_source order by  edb_business_source_id desc `
+	_, err = o.Raw(sql).QueryRows(&items)
+
+	return
+}
+
+// GetListCount
+// @Description: 根据条件获取列表页的总数量
+// @author: Roc
+// @receiver m
+// @datetime 2024-05-06 17:15:28
+// @param condition string
+// @param pars []interface{}
+// @return count int
+// @return err error
+func (m *BaseFromBusinessIndex) GetListCount(condition string, pars []interface{}) (count int, err error) {
+	sql := ` select count(1) as count FROM base_from_business_index as a WHERE 1=1 `
+	if condition != "" {
+		sql += condition
+	}
+	o := orm.NewOrmUsingDB("data")
+	err = o.Raw(sql, pars).QueryRow(&count)
+
+	return
+}
+
+// GetList
+// @Description: 根据条件获取列表页的数据
+// @author: Roc
+// @receiver m
+// @datetime 2024-05-06 17:15:42
+// @param condition string
+// @param pars []interface{}
+// @param startSize int
+// @param pageSize int
+// @return items []*BaseFromBusinessIndex
+// @return err error
+func (m *BaseFromBusinessIndex) GetList(condition string, pars []interface{}, startSize, pageSize int) (items []*BaseFromBusinessIndex, err error) {
+	sql := `select * FROM base_from_business_index AS a  WHERE 1=1 `
+	if condition != "" {
+		sql += condition
+	}
+	sql += ` order by a.base_from_business_index_id desc limit ?,? `
+	o := orm.NewOrmUsingDB("data")
+	_, err = o.Raw(sql, pars, startSize, pageSize).QueryRows(&items)
+
+	return
+}
+
+// BusinessIndexListResp
+// @Description: 外部(商家)指标列表返回
+type BusinessIndexListResp struct {
+	List   []*BaseFromBusinessIndexItem
+	Paging *paging.PagingItem `description:"分页数据"`
+}
+
+// BaseFromBusinessIndexItem
+// @Description: 外部指标(商家系统)结构
+type BaseFromBusinessIndexItem struct {
+	BaseFromBusinessIndexId int64  `orm:"column(base_from_business_index_id);pk"`
+	IndexCode               string `description:"指标编码"`
+	IndexName               string `description:"指标名称"`
+	Unit                    string `description:"单位"`
+	Frequency               string `description:"频度"`
+	Source                  int    `description:"数据来源"`
+	SourceName              string `description:"数据来源名称"`
+	StartDate               string `description:"开始日期"`
+	EndDate                 string `description:"结束日期"`
+	Remark                  string `description:"备注字段"`
+	BaseModifyTime          string `description:"基础信息(名称,单位,频度)变更时间"`
+	DataUpdateTime          string `description:"最近一次数据发生变化的时间"`
+	CreateTime              string `description:"创建时间"`
+	ModifyTime              string `description:"修改时间"`
+	EdbInfoId               int    `description:"eta指标库的id"`
+	EdbUniqueCode           string `description:"指标库唯一编码"`
+	EdbClassifyId           int    `description:"指标库分类ID"`
+	EdbExist                int    `description:"指标库是否已添加:0-否;1-是"`
+}
+
+func (m *BaseFromBusinessIndex) GetPageItemsByCondition(condition string, pars []interface{}, orderRule string, startSize, pageSize int) (items []*BaseFromBusinessIndexItem, err error) {
+	sql := `select a.*,b.edb_info_id,b.unique_code as edb_unique_code,b.classify_id as edb_classify_id FROM base_from_business_index AS a LEFT JOIN edb_info b on a.index_code=b.edb_code AND b.source=? WHERE 1=1 `
+	if condition != "" {
+		sql += condition
+	}
+	if orderRule == `` {
+		sql += ` order by a.base_from_business_index_id desc`
+	} else {
+		sql += ` order by ` + orderRule
+	}
+	sql += ` limit ?,? `
+	o := orm.NewOrmUsingDB("data")
+	_, err = o.Raw(sql, utils.DATA_SOURCE_BUSINESS, pars, startSize, pageSize).QueryRows(&items)
+
+	return
+}
+
+// GeItemsByCondition
+// @Description: 根据条件获取指定数量的指标
+// @author: Roc
+// @receiver m
+// @datetime 2024-05-06 17:16:02
+// @param condition string
+// @param pars []interface{}
+// @param limitSize int
+// @return items []*BaseFromBusinessIndexItem
+// @return err error
+func (m *BaseFromBusinessIndex) GeItemsByCondition(condition string, pars []interface{}, limitSize int) (items []*BaseFromBusinessIndexItem, err error) {
+	if pars == nil {
+		pars = make([]interface{}, 0)
+	}
+
+	sql := `select a.*,b.edb_info_id,b.unique_code as edb_unique_code,b.classify_id as edb_classify_id FROM base_from_business_index AS a LEFT JOIN edb_info b on a.index_code=b.edb_code AND b.source=? WHERE 1=1 `
+	if condition != "" {
+		sql += condition
+	}
+	sql += ` order by a.base_from_business_index_id desc `
+
+	if limitSize > 0 {
+		sql += " limit ? "
+		pars = append(pars, limitSize)
+	}
+
+	o := orm.NewOrmUsingDB("data")
+	_, err = o.Raw(sql, utils.DATA_SOURCE_BUSINESS, pars).QueryRows(&items)
+
+	return
+}
+
+// GetDetailByEdbCode
+// @Description: 根据edbCode获取指标详情
+// @author: Roc
+// @receiver m
+// @datetime 2024-05-07 11:00:07
+// @param edbCode string
+// @return item *BaseFromBusinessIndex
+// @return err error
+func (m *BaseFromBusinessIndex) GetDetailByEdbCode(edbCode string) (item *BaseFromBusinessIndex, err error) {
+	sql := `select *  FROM base_from_business_index  WHERE index_code = ? `
+	o := orm.NewOrmUsingDB("data")
+	err = o.Raw(sql, edbCode).QueryRow(&item)
+
+	return
+}
+
+// BusinessIndexDataListResp
+// @Description: 外部(商家)指标数据列表返回
+type BusinessIndexDataListResp struct {
+	List   []*BaseFromBusinessIndexDataItem
+	Paging *paging.PagingItem `description:"分页数据"`
+}
+
+// BaseFromBusinessIndexDataItem
+// @Description: 外部指标(商家系统)数据结构
+type BaseFromBusinessIndexDataItem struct {
+	ID        string
+	EdbDataId int `orm:"column(edb_data_id);pk"`
+	IndexCode string
+	DataTime  string
+	Value     float64
+}

+ 10 - 0
models/data_manage/chart_edb_mapping.go

@@ -56,6 +56,16 @@ a.is_convert, a.convert_type, a.convert_value, a.convert_unit, a.convert_en_unit
 	return
 }
 
+func GetChartMappingList(chartInfoId int) (list []*ChartEdbMapping, err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := ` SELECT a.*
+             FROM chart_edb_mapping AS a
+			 WHERE chart_info_id=? 
+             ORDER BY chart_edb_mapping_id ASC `
+	_, err = o.Raw(sql, chartInfoId).QueryRows(&list)
+	return
+}
+
 func GetChartEdbMappingListByChartInfoIds(chartInfoIds string) (list []*ChartEdbInfoMapping, err error) {
 	o := orm.NewOrmUsingDB("data")
 	sql := ` SELECT a.*,b.source_name,b.source,b.sub_source,b.edb_code,b.edb_name,b.edb_name_en,b.frequency,b.unit,b.unit_en,b.start_date,b.end_date,b.modify_time,b.latest_date,b.latest_value,b.unique_code,b.edb_info_type AS edb_info_category_type,b.edb_type,b.classify_id,b.is_join_permission

+ 197 - 38
models/data_manage/chart_info.go

@@ -2,10 +2,12 @@ package data_manage
 
 import (
 	"errors"
+	"eta/eta_api/models/mgo"
 	"eta/eta_api/utils"
 	"fmt"
 	"github.com/beego/beego/v2/client/orm"
 	"github.com/rdlucklib/rdluck_tools/paging"
+	"go.mongodb.org/mongo-driver/bson"
 	"strconv"
 	"strings"
 	"time"
@@ -55,6 +57,7 @@ type ChartInfo struct {
 	Unit              string `description:"中文单位名称"`
 	UnitEn            string `description:"英文单位名称"`
 	IsJoinPermission  int    `description:"是否加入权限管控,0:不加入;1:加入;默认:0"`
+	ForumChartInfoId  int    `description:"社区的图表ID"`
 }
 
 type ChartInfoMore struct {
@@ -298,6 +301,16 @@ func ModifyChartInfo(item *EditChartInfoReq) (err error) {
 	_, err = o.Raw(sql, item.ChartName, item.ChartClassifyId, item.ChartInfoId).Exec()
 	return
 }
+func SetForumChartInfoId(chartInfoId, forumChartInfoId int) (err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := ` UPDATE  chart_info
+			SET
+              forum_chart_info_id=?,
+			  modify_time = NOW()
+			WHERE chart_info_id = ?`
+	_, err = o.Raw(sql, forumChartInfoId, chartInfoId).Exec()
+	return
+}
 
 type ChartInfoList struct {
 	ChartInfoId          int    `orm:"column(chart_info_id);pk"`
@@ -369,8 +382,39 @@ type EdbDataList struct {
 	Value         float64 `description:"数据值"`
 }
 
-// GetEdbDataList 获取指标的数据(日期正序返回)
-func GetEdbDataList(source, subSource, endInfoId int, startDate, endDate string) (list []*EdbDataList, err error) {
+// GetEdbDataList
+// @Description: 获取指标的数据(日期正序返回)
+// @author: Roc
+// @datetime 2024-05-07 10:48:43
+// @param source int
+// @param subSource int
+// @param edbInfoId int
+// @param startDate string
+// @param endDate string
+// @return list []*EdbDataList
+// @return err error
+func GetEdbDataList(source, subSource, edbInfoId int, startDate, endDate string) (list []*EdbDataList, err error) {
+	// 自有数据需要额外处理(从mongo获取)
+	if source == utils.DATA_SOURCE_BUSINESS {
+		return getEdbDataListByMongo(source, subSource, edbInfoId, startDate, endDate)
+	}
+
+	return getEdbDataListByMysql(source, subSource, edbInfoId, startDate, endDate)
+
+}
+
+// getEdbDataListByMysql
+// @Description: 通过mysql查询指标数据
+// @author: Roc
+// @datetime 2024-05-07 10:40:43
+// @param source int
+// @param subSource int
+// @param edbInfoId int
+// @param startDate string
+// @param endDate string
+// @return list []*EdbDataList
+// @return err error
+func getEdbDataListByMysql(source, subSource, edbInfoId int, startDate, endDate string) (list []*EdbDataList, err error) {
 	tableName := GetEdbDataTableName(source, subSource)
 	if tableName == "" {
 		err = errors.New("无效的渠道:" + strconv.Itoa(source))
@@ -391,43 +435,75 @@ func GetEdbDataList(source, subSource, endInfoId int, startDate, endDate string)
 	sql += ` ORDER BY data_time ASC `
 	sql = fmt.Sprintf(sql, tableName)
 	o := orm.NewOrmUsingDB("data")
-	_, err = o.Raw(sql, endInfoId, pars).QueryRows(&list)
+	_, err = o.Raw(sql, edbInfoId, pars).QueryRows(&list)
 	return
 }
 
-type EdbDataListByUniqueCode struct {
-	EdbDataId     int     `description:" 指标数据ID" json:"-"`
-	EdbInfoId     int     `description:"指标ID" json:"-"`
-	DataTime      string  //`json:"-" description:"数据日期"`
-	DataTimestamp int64   `description:"数据日期"`
-	Value         float64 `description:"数据值"`
-}
+// getEdbDataListByMongo
+// @Description: 通过mongo查询指标数据
+// @author: Roc
+// @datetime 2024-05-07 10:40:43
+// @param source int
+// @param subSource int
+// @param endInfoId int
+// @param startDate string
+// @param endDate string
+// @return list []*EdbDataList
+// @return err error
+func getEdbDataListByMongo(source, subSource, edbInfoId int, startDate, endDate string) (list []*EdbDataList, err error) {
+	list = make([]*EdbDataList, 0)
 
-func GetEdbDataListByByUniqueCode(source, subSource, endInfoId int, startDate, endDate string) (list []*EdbDataListByUniqueCode, err error) {
-	tableName := GetEdbDataTableName(source, subSource)
-	if tableName == "" {
-		err = errors.New("无效的渠道:" + strconv.Itoa(source))
-		list = make([]*EdbDataListByUniqueCode, 0)
-		return list, err
+	mogDataObj := mgo.EdbDataBusiness{}
+	// 构建查询条件
+	queryConditions := bson.M{
+		"edb_info_id": edbInfoId,
 	}
-	var pars []interface{}
-	sql := `SELECT edb_data_id,edb_info_id,data_time,value,data_timestamp FROM %s WHERE edb_info_id=? `
-	if startDate != "" {
-		sql += ` AND data_time>=? `
-		pars = append(pars, startDate)
+
+	// 数据开始日期
+	if startDate != `` {
+		startDateTime, tmpErr := time.ParseInLocation(utils.FormatDate, startDate, time.Local)
+		if tmpErr != nil {
+			err = tmpErr
+			return
+		}
+		queryConditions["data_time"] = bson.M{"$gte": startDateTime}
 	}
+	// 数据结束日期
 	if endDate != "" {
-		sql += ` AND data_time<=? `
-		pars = append(pars, endDate)
+		endDateTime, tmpErr := time.ParseInLocation(utils.FormatDate, endDate, time.Local)
+		if tmpErr != nil {
+			err = tmpErr
+			return
+		}
+		queryConditions["data_time"] = bson.M{"$lte": endDateTime}
+	}
+	// 获取列表数据
+	tmpDataList, tmpErr := mogDataObj.GetAllDataList(queryConditions, []string{"data_time"})
+	if tmpErr != nil {
+		err = tmpErr
+		return
+	}
+	for k, v := range tmpDataList {
+		list = append(list, &EdbDataList{
+			EdbDataId:     k + 1,
+			EdbInfoId:     v.EdbInfoId,
+			DataTime:      v.DataTime.Format(utils.FormatDate),
+			DataTimestamp: v.DataTimestamp,
+			Value:         v.Value,
+		})
 	}
 
-	sql += ` ORDER BY data_time ASC `
-	sql = fmt.Sprintf(sql, tableName)
-	o := orm.NewOrmUsingDB("data")
-	_, err = o.Raw(sql, endInfoId, pars).QueryRows(&list)
 	return
 }
 
+type EdbDataListByUniqueCode struct {
+	EdbDataId     int     `description:" 指标数据ID" json:"-"`
+	EdbInfoId     int     `description:"指标ID" json:"-"`
+	DataTime      string  //`json:"-" description:"数据日期"`
+	DataTimestamp int64   `description:"数据日期"`
+	Value         float64 `description:"数据值"`
+}
+
 func GetEdbDataLunarList(endInfoId int, startDate, endDate string) (list []*EdbDataList, err error) {
 	tableName := "edb_data_quarter"
 	sql := `SELECT edb_data_id,edb_info_id,data_time,TRUNCATE(value,2) AS value,data_timestamp FROM %s WHERE edb_info_id=? AND data_time>=? AND data_time<=? ORDER BY data_time ASC `
@@ -437,7 +513,40 @@ func GetEdbDataLunarList(endInfoId int, startDate, endDate string) (list []*EdbD
 	return
 }
 
-func GetEdbDataListMinAndMax(source, subSource, endInfoId int, startDate, endDate string) (min_data, max_data float64, err error) {
+// GetEdbDataListMinAndMax
+// @Description: 根据条件数据库中获取指标数据最小值和最大值
+// @author: Roc
+// @datetime 2024-05-07 13:11:32
+// @param source int
+// @param subSource int
+// @param edbInfoId int
+// @param startDate string
+// @param endDate string
+// @return min_data float64
+// @return max_data float64
+// @return err error
+func GetEdbDataListMinAndMax(source, subSource, edbInfoId int, startDate, endDate string) (min_data, max_data float64, err error) {
+	// 自有数据需要额外处理(从mongo获取)
+	if source == utils.DATA_SOURCE_BUSINESS {
+		return getEdbDataListMinAndMaxByMongo(source, subSource, edbInfoId, startDate, endDate)
+	}
+
+	return getEdbDataListMinAndMaxByMysql(source, subSource, edbInfoId, startDate, endDate)
+}
+
+// getEdbDataListMinAndMaxByMysql
+// @Description: 根据条件从mysql数据库中获取指标数据最小值和最大值
+// @author: Roc
+// @datetime 2024-05-07 13:11:22
+// @param source int
+// @param subSource int
+// @param edbInfoId int
+// @param startDate string
+// @param endDate string
+// @return minData float64
+// @return maxData float64
+// @return err error
+func getEdbDataListMinAndMaxByMysql(source, subSource, edbInfoId int, startDate, endDate string) (minData, maxData float64, err error) {
 	tableName := GetEdbDataTableName(source, subSource)
 	sql := `SELECT min(value) AS min_data,max(value) AS max_data FROM %s WHERE edb_info_id=? `
 	var pars []interface{}
@@ -460,7 +569,63 @@ func GetEdbDataListMinAndMax(source, subSource, endInfoId int, startDate, endDat
 		sql += condition
 	}
 
-	err = o.Raw(sql, endInfoId, pars).QueryRow(&min_data, &max_data)
+	err = o.Raw(sql, edbInfoId, pars).QueryRow(&minData, &maxData)
+	return
+}
+
+// getEdbDataListMinAndMaxByMongo
+// @Description: 根据条件从mongo数据库中获取指标数据最小值和最大值
+// @author: Roc
+// @datetime 2024-05-07 13:10:26
+// @param source int
+// @param subSource int
+// @param edbInfoId int
+// @param startDate string
+// @param endDate string
+// @return minData float64
+// @return maxData float64
+// @return err error
+func getEdbDataListMinAndMaxByMongo(source, subSource, edbInfoId int, startDate, endDate string) (minData, maxData float64, err error) {
+	mogDataObj := mgo.EdbDataBusiness{}
+	// 构建查询条件
+	queryConditions := bson.M{
+		"edb_info_id": edbInfoId,
+	}
+
+	// 数据开始日期
+	if startDate != `` {
+		startDateTime, tmpErr := time.ParseInLocation(utils.FormatDate, startDate, time.Local)
+		if tmpErr != nil {
+			err = tmpErr
+			return
+		}
+		queryConditions["data_time"] = bson.M{"$gte": startDateTime}
+	}
+	// 数据结束日期
+	if endDate != "" {
+		endDateTime, tmpErr := time.ParseInLocation(utils.FormatDate, endDate, time.Local)
+		if tmpErr != nil {
+			err = tmpErr
+			return
+		}
+		queryConditions["data_time"] = bson.M{"$lte": endDateTime}
+	}
+	pipeline := []bson.M{
+		{"$match": queryConditions},
+		{"$group": bson.M{
+			"_id":       nil,
+			"min_value": bson.M{"$min": "$value"},
+			"max_value": bson.M{"$max": "$value"},
+		}},
+		{"$project": bson.M{"_id": 0}}, // 可选,如果不需要_id字段
+	}
+	result, err := mogDataObj.GetEdbInfoMaxAndMinInfo(pipeline)
+	if err != nil {
+		return
+	}
+	minData = result.MinValue
+	maxData = result.MaxValue
+
 	return
 }
 
@@ -509,6 +674,8 @@ type ChartEdbInfoMapping struct {
 	MappingSource       int     `description:"1:ETA图库;2:商品价格曲线"`
 	RegionType          string  `description:"交易所来源,海外还是国内" json:"-"`
 	ClassifyId          int     `description:"分类id"`
+	SubSourceName       string  `description:"子数据来源名称"`
+	IndicatorCode       string  `description:"指标代码"`
 	IsConvert           int     `description:"是否数据转换 0不转 1转"`
 	ConvertType         int     `description:"数据转换类型 1乘 2除 3对数"`
 	ConvertValue        float64 `description:"数据转换值"`
@@ -1213,15 +1380,6 @@ func EditChartBaseInfoAndEdbEnInfo(req *EditChartInfoBaseReq, chartItem *ChartIn
 	return
 }
 
-func ModifyEdbDatadTimestamp(source, subSource, edbDataId int, dataTimestamp int64) (err error) {
-	tableName := GetEdbDataTableName(source, subSource)
-	sql := `UPDATE %s SET data_timestamp=? WHERE edb_data_id=? `
-	sql = fmt.Sprintf(sql, tableName)
-	o := orm.NewOrmUsingDB("data")
-	_, err = o.Raw(sql, dataTimestamp, edbDataId).Exec()
-	return
-}
-
 type AddChartInfoReq struct {
 	ChartEdbInfoList     []*ChartSaveItem        `description:"指标及配置信息"`
 	ChartClassifyId      int                     `description:"分类id"`
@@ -1570,6 +1728,7 @@ type ChartInfoView struct {
 	MarkersAreas      string          `description:"标识区"`
 	IsJoinPermission  int             `description:"是否加入权限管控,0:不加入;1:加入;默认:0"`
 	HaveOperaAuth     bool            `description:"是否有数据权限,默认:false"`
+	ForumChartInfoId  int             `description:"社区的图表ID"`
 }
 
 type ChartViewButton struct {

+ 0 - 79
models/data_manage/edb_data_baiinfo.go

@@ -1,12 +1,7 @@
 package data_manage
 
 import (
-	"eta/eta_api/utils"
-	"fmt"
 	"github.com/beego/beego/v2/client/orm"
-	"strconv"
-	"strings"
-	"time"
 )
 
 type BaseFromBaiinfoDataSimple struct {
@@ -23,77 +18,3 @@ func GetEdbDataBaiinfoMaxAndMinDate(edbCode string) (min_date, max_date string,
 	err = o.Raw(sql, edbCode).QueryRow(&min_date, &max_date)
 	return
 }
-
-// 全部刷新有色数据
-func RefreshAllEdbDataByBaiinfo(edbInfoId, source, subSource int, edbCode, startDate, endDate 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()
-		}
-	}()
-
-	if err != nil {
-		return
-	}
-	edbInfoIdStr := strconv.Itoa(edbInfoId)
-
-	//获取已存在指标所有数据
-	existDataList := make([]*EdbDataBase, 0)
-	dataTableName := GetEdbDataTableName(source, subSource)
-	sql := `SELECT * FROM %s WHERE edb_info_id=? `
-	sql = fmt.Sprintf(sql, dataTableName)
-	_, err = to.Raw(sql, edbInfoId).QueryRows(&existDataList)
-	if err != nil {
-		return err
-	}
-	existDataMap := make(map[string]string)
-	for _, v := range existDataList {
-		existDataMap[v.DataTime] = v.Value
-	}
-
-	baiinfoDateList := make([]*BaseFromBaiinfoDataSimple, 0)
-	baiinfoSql := ` SELECT * FROM base_from_baiinfo_data WHERE index_code=? AND data_time>=? `
-	_, err = to.Raw(baiinfoSql, edbCode, startDate).QueryRows(&baiinfoDateList)
-	if err != nil {
-		return err
-	}
-
-	addSql := ` INSERT INTO edb_data_baiinfo(edb_info_id,edb_code,data_time,value,create_time,modify_time,status,data_timestamp) values `
-	var isAdd bool
-	for _, sv := range baiinfoDateList {
-		if existVal, ok := existDataMap[sv.DataTime]; !ok {
-			dataTime, err := time.Parse(utils.FormatDate, sv.DataTime)
-			if err != nil {
-				return err
-			}
-			timestamp := dataTime.UnixNano() / 1e6
-			timeStr := fmt.Sprintf("%d", timestamp)
-			addSql += GetAddSql(edbInfoIdStr, edbCode, sv.DataTime, timeStr, sv.Value)
-			isAdd = true
-		} else {
-			if existVal != sv.Value {
-				sql := ` UPDATE %s SET value=?,modify_time=NOW() WHERE edb_info_id=? AND data_time=? `
-				sql = fmt.Sprintf(sql, dataTableName)
-				_, err = to.Raw(sql, sv.Value, edbInfoId, sv.DataTime).Exec()
-				if err != nil {
-					return err
-				}
-			}
-		}
-	}
-	if isAdd {
-		addSql = strings.TrimRight(addSql, ",")
-		_, err = to.Raw(addSql).Exec()
-		if err != nil {
-			return err
-		}
-	}
-	return
-}

+ 92 - 10
models/data_manage/edb_data_base.go

@@ -1,9 +1,12 @@
 package data_manage
 
 import (
+	"eta/eta_api/models/mgo"
 	"eta/eta_api/utils"
 	"fmt"
 	"github.com/beego/beego/v2/client/orm"
+	"go.mongodb.org/mongo-driver/bson"
+	"strconv"
 	"time"
 )
 
@@ -216,6 +219,15 @@ type EdbDataBase struct {
 }
 
 func GetEdbDataAllByEdbCode(edbCode string, source, subSource, limit int) (items []*EdbInfoSearchData, err error) {
+	// 自有数据需要额外处理(从mongo获取)
+	if source == utils.DATA_SOURCE_BUSINESS {
+		return GetEdbDataAllByEdbCodeByMongo(edbCode, source, subSource, limit)
+	}
+
+	return GetEdbDataAllByEdbCodeByMysql(edbCode, source, subSource, limit)
+}
+
+func GetEdbDataAllByEdbCodeByMysql(edbCode string, source, subSource, limit int) (items []*EdbInfoSearchData, err error) {
 	var pars []interface{}
 	pars = append(pars, edbCode)
 	o := orm.NewOrmUsingDB("data")
@@ -231,6 +243,75 @@ func GetEdbDataAllByEdbCode(edbCode string, source, subSource, limit int) (items
 	return
 }
 
+func GetEdbDataBaseByEdbInfoId(edbInfoId int, source, subSource int) (items []*EdbDataBase, err error) {
+	o := orm.NewOrmUsingDB("data")
+	tableName := GetEdbDataTableName(source, subSource)
+	if source == utils.DATA_SOURCE_PREDICT {
+		tableName = "edb_data_predict_base"
+	}
+	sql := ` SELECT * FROM %s WHERE edb_info_id=? ORDER BY data_time DESC`
+	sql = fmt.Sprintf(sql, tableName)
+	_, err = o.Raw(sql, edbInfoId).QueryRows(&items)
+	return
+}
+
+func GetEdbDataBaseMongoByEdbInfoId(edbInfoId int, source, subSource int) (list []*EdbDataBase, err error) {
+	list = make([]*EdbDataBase, 0)
+
+	mogDataObj := mgo.EdbDataBusiness{}
+	// 构建查询条件
+	queryConditions := bson.M{
+		"edb_info_id": edbInfoId,
+	}
+	// 获取列表数据
+	tmpDataList, tmpErr := mogDataObj.GetAllDataList(queryConditions, []string{"data_time"})
+	if tmpErr != nil {
+		err = tmpErr
+		return
+	}
+	for k, v := range tmpDataList {
+
+		list = append(list, &EdbDataBase{
+			EdbDataId:     k + 1,
+			EdbInfoId:     v.EdbInfoId,
+			EdbCode:       v.EdbCode,
+			DataTime:      v.DataTime.Format(utils.FormatDate),
+			DataTimestamp: v.DataTimestamp,
+			Value:         strconv.FormatFloat(v.Value, 'f', -1, 64),
+		})
+	}
+
+	return
+}
+
+func GetEdbDataAllByEdbCodeByMongo(edbCode string, source, subSource, limit int) (list []*EdbInfoSearchData, err error) {
+	list = make([]*EdbInfoSearchData, 0)
+
+	mogDataObj := mgo.EdbDataBusiness{}
+	// 构建查询条件
+	queryConditions := bson.M{
+		"edb_code": edbCode,
+	}
+
+	var tmpDataList []*mgo.EdbDataBusiness
+	// 获取列表数据
+	if limit > 0 {
+		tmpDataList, err = mogDataObj.GetLimitDataList(queryConditions, int64(limit), []string{"-data_time"})
+	} else {
+		tmpDataList, err = mogDataObj.GetLimitDataList(queryConditions, int64(limit), []string{"-data_time"})
+	}
+	if err != nil {
+		return
+	}
+	for _, v := range tmpDataList {
+		list = append(list, &EdbInfoSearchData{
+			DataTime: v.DataTime.Format(utils.FormatDate),
+			Value:    v.Value,
+		})
+	}
+	return
+}
+
 func GetBaseIndexInfoByEdbCode(edbCode string, source int) (item *BaseIndexInfo, err error) {
 	var pars []interface{}
 	pars = append(pars, edbCode)
@@ -248,15 +329,6 @@ func GetBaseIndexInfoByEdbCode(edbCode string, source int) (item *BaseIndexInfo,
 	return
 }
 
-func GetEdbDataBaseByCodeAndDate(source, subSource int, edbCode string, startDate string) (count int, err error) {
-	o := orm.NewOrmUsingDB("data")
-	tableName := GetEdbDataTableName(source, subSource)
-	sql := ` SELECT COUNT(1) AS count FROM %s WHERE edb_code=? AND data_time=? `
-	sql = fmt.Sprintf(sql, tableName)
-	err = o.Raw(sql, edbCode, startDate).QueryRow(&count)
-	return
-}
-
 func GetBaseIndexTableName(source int) (tableName string) {
 	edbSource := EdbSourceIdMap[source]
 	if edbSource != nil {
@@ -280,7 +352,7 @@ func GetEdbDataAllByEdbCodeAndSubSource(edbCode string, source, subSource, limit
 	return
 }
 
-// GetEdbDataTableName 指标数据->存储表
+// GetEdbDataTableNameAndSubSource 指标数据->存储表
 func GetEdbDataTableNameAndSubSource(source, subSource int) (tableName string) {
 	switch source {
 	case utils.DATA_SOURCE_WIND:
@@ -319,3 +391,13 @@ func GetEdbDataAllByEdbCodes(edbCodes []string, limit int) (items []*EdbInfoSear
 	_, err = o.Raw(sql, pars).QueryRows(&items)
 	return
 }
+
+func GetAddSql(edbInfoId, edbCode, dataTime, timestampStr string, value string) (addSql string) {
+	nowStr := time.Now().Format(utils.FormatDateTime)
+	addSql += "("
+	addSql += edbInfoId + "," + "'" + edbCode + "'" + "," + "'" + dataTime + "'" + "," + value + "," + "'" + nowStr + "'" +
+		"," + "'" + nowStr + "'" + "," + "1"
+	addSql += "," + "'" + timestampStr + "'"
+	addSql += "),"
+	return
+}

+ 0 - 174
models/data_manage/edb_data_calculate.go

@@ -1,174 +0,0 @@
-package data_manage
-
-import (
-	"errors"
-	"eta/eta_api/utils"
-	"fmt"
-	"github.com/beego/beego/v2/client/orm"
-	"github.com/yidane/formula"
-	"strconv"
-	"strings"
-	"time"
-)
-
-type EdbDataCalculate struct {
-	EdbDataId     int `orm:"column(edb_data_id);pk"`
-	EdbInfoId     int
-	EdbCode       string
-	DataTime      string
-	Value         float64
-	Status        int
-	CreateTime    time.Time
-	ModifyTime    time.Time
-	DataTimestamp int64
-}
-
-func AddEdbDataCalculate(items []*EdbDataCalculate) (err error) {
-	o := orm.NewOrmUsingDB("data")
-	_, err = o.InsertMulti(1, items)
-	return
-}
-
-func AddEdbDataCalculateBySql(sqlStr string) (err error) {
-	o := orm.NewOrmUsingDB("data")
-	_, err = o.Raw(sqlStr).Exec()
-	return
-}
-
-func ModifyEdbDataCalculate(edbInfoId int64, dataTime string, value float64) (err error) {
-	o := orm.NewOrmUsingDB("data")
-	sql := ` UPDATE edb_data_calculate SET value=?,modify_time=NOW() WHERE edb_info_id=? AND data_time=? `
-	_, err = o.Raw(sql, value, edbInfoId, dataTime).Exec()
-	return
-}
-
-func GetEdbDataCalculateByCodeAndDate(edbCode string, startDate string) (count int, err error) {
-	o := orm.NewOrmUsingDB("data")
-	sql := ` SELECT COUNT(1) AS count FROM edb_data_calculate WHERE edb_code=? AND data_time=? `
-	err = o.Raw(sql, edbCode, startDate).QueryRow(&count)
-	return
-}
-
-// 刷新全部数据
-func RefreshAllCalculate(edbInfoIdArr []*EdbInfo, edbInfoId, source, subSource int, edbCode, formulaStr, startDate, endDate string, edbInfoIdBytes []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()
-		}
-	}()
-	fmt.Println(startDate, endDate)
-	saveDataMap := make(map[string]map[int]float64)
-	for _, v := range edbInfoIdArr {
-		var condition string
-		var pars []interface{}
-		condition += " AND edb_info_id=? "
-		pars = append(pars, v.EdbInfoId)
-		if startDate != "" {
-			condition += " AND data_time>=? "
-			pars = append(pars, startDate)
-		}
-		if endDate != "" {
-			condition += " AND data_time<=? "
-			pars = append(pars, endDate)
-		}
-		fmt.Println("v.Source:", v.Source)
-		dataList, err := GetEdbDataListAll(condition, pars, v.Source, v.SubSource, 1)
-		if err != nil {
-			return err
-		}
-		dataMap := make(map[string]float64)
-		for _, dv := range dataList {
-			if val, ok := saveDataMap[dv.DataTime]; ok {
-				if _, ok := val[v.EdbInfoId]; !ok {
-					val[v.EdbInfoId] = dv.Value
-				}
-			} else {
-				temp := make(map[int]float64)
-				temp[v.EdbInfoId] = dv.Value
-				saveDataMap[dv.DataTime] = temp
-			}
-		}
-		item := new(CalculateItems)
-		item.EdbInfoId = v.EdbInfoId
-		item.DataMap = dataMap
-	}
-
-	formulaMap := CheckFormula(formulaStr)
-	addSql := ` INSERT INTO edb_data_calculate(edb_info_id,edb_code,data_time,value,create_time,modify_time,status,data_timestamp) values `
-	var isAdd bool
-
-	//获取指标所有数据
-	dataList := make([]*EdbDataBase, 0)
-	dataTableName := GetEdbDataTableName(source, subSource)
-	sql := `SELECT * FROM %s WHERE edb_info_id=? `
-	sql = fmt.Sprintf(sql, dataTableName)
-	_, err = to.Raw(sql, edbInfoId).QueryRows(&dataList)
-	if err != nil {
-		return err
-	}
-	dataMap := make(map[string]string)
-	for _, v := range dataList {
-		dataMap[v.DataTime] = v.Value
-	}
-	edbInfoIdStr := strconv.Itoa(edbInfoId)
-	existDataMap := make(map[string]string)
-	for sk, sv := range saveDataMap {
-		fmt.Println(sk, sv)
-		formulaStr = strings.ToUpper(formulaStr)
-		formulaFormStr := ReplaceFormula(edbInfoIdArr, sv, formulaMap, formulaStr, edbInfoIdBytes)
-		if formulaFormStr != "" {
-			utils.FileLog.Info("formulaFormStr:%s", formulaFormStr)
-			expression := formula.NewExpression(formulaFormStr)
-			calResult, err := expression.Evaluate()
-			if err != nil {
-				err = errors.New("计算失败:Err:" + err.Error() + ";formulaStr:" + formulaFormStr)
-				fmt.Println(err)
-				return err
-			}
-			calVal, err := calResult.Float64()
-			if err != nil {
-				err = errors.New("计算失败:获取计算值失败 Err:" + err.Error() + ";formulaStr:" + formulaFormStr)
-				fmt.Println(err)
-				return err
-			}
-
-			saveValue := utils.SubFloatToString(calVal, 4)
-			if existVal, ok := dataMap[sk]; !ok {
-				dataTime, _ := time.Parse(utils.FormatDate, sk)
-				timestamp := dataTime.UnixNano() / 1e6
-				timeStr := fmt.Sprintf("%d", timestamp)
-
-				if _, existOk := existDataMap[sk]; !existOk {
-					addSql += GetAddSql(edbInfoIdStr, edbCode, sk, timeStr, saveValue)
-					isAdd = true
-				}
-				existDataMap[sk] = sk
-			} else {
-				if existVal != saveValue {
-					sql := ` UPDATE %s SET value=?,modify_time=NOW() WHERE edb_info_id=? AND data_time=? `
-					sql = fmt.Sprintf(sql, dataTableName)
-					_, err = to.Raw(sql, saveValue, edbInfoId, sk).Exec()
-					if err != nil {
-						return err
-					}
-				}
-			}
-		}
-	}
-	if isAdd {
-		addSql = strings.TrimRight(addSql, ",")
-		_, err = to.Raw(addSql).Exec()
-		if err != nil {
-			fmt.Println("RefreshAllCalculate add Err", err.Error())
-			return
-		}
-	}
-	return
-}

+ 0 - 27
models/data_manage/edb_data_calculate_ljztbpj.go

@@ -1,27 +0,0 @@
-package data_manage
-
-import (
-	"github.com/beego/beego/v2/client/orm"
-	"time"
-)
-
-// EdbDataCalculateLjztbpj 累计值同比拼接数据结构体
-type EdbDataCalculateLjztbpj struct {
-	EdbDataId     int `orm:"column(edb_data_id);pk"`
-	EdbInfoId     int
-	EdbCode       string
-	DataTime      string
-	Value         float64
-	Status        int
-	CreateTime    time.Time
-	ModifyTime    time.Time
-	DataTimestamp int64
-}
-
-// GetAllEdbDataCalculateLjztbpjByEdbInfoId 根据指标id获取全部的数据
-func GetAllEdbDataCalculateLjztbpjByEdbInfoId(edbInfoId int) (items []*EdbDataCalculateLjztbpj, err error) {
-	o := orm.NewOrmUsingDB("data")
-	sql := ` SELECT * FROM edb_data_calculate_ljztbpj WHERE edb_info_id=? ORDER BY data_time DESC `
-	_, err = o.Raw(sql, edbInfoId).QueryRows(&items)
-	return
-}

+ 0 - 3
models/data_manage/edb_data_calculate_tbz.go

@@ -1,3 +0,0 @@
-package data_manage
-
-

+ 0 - 1
models/data_manage/edb_data_calculate_tcz.go

@@ -1 +0,0 @@
-package data_manage

+ 0 - 552
models/data_manage/edb_data_calculate_time_shift.go

@@ -1,552 +0,0 @@
-package data_manage
-
-import (
-	"errors"
-	"eta/eta_api/utils"
-	"fmt"
-	"github.com/beego/beego/v2/client/orm"
-	"github.com/shopspring/decimal"
-	"strconv"
-	"strings"
-	"time"
-)
-
-//时间移位
-
-type EdbInfoCalculateMove struct {
-	EdbInfoCalculateBpId int       `orm:"column(edb_info_calculate_bp_id);pk"`
-	EdbInfoId            int       `description:"指标id"`
-	EdbCode              string    `description:"指标编码"`
-	FromEdbInfoId        int       `description:"计算指标id"`
-	FromEdbCode          string    `description:"计算指标编码"`
-	FromEdbName          string    `description:"计算指标名称"`
-	FromSource           int       `description:"计算指标来源"`
-	FromSourceName       string    `description:"计算指标来源名称"`
-	FromTag              string    `description:"来源指标标签"`
-	Sort                 int       `description:"计算指标名称排序"`
-	CreateTime           time.Time `description:"创建时间"`
-	ModifyTime           time.Time `description:"修改时间"`
-}
-
-// 时间移位
-func AddCalculateTimeShift(req *EdbInfoCalculateBatchSaveReq, fromEdbInfo *EdbInfo, edbCode, uniqueCode string, sysUserId int, sysUserRealName string) (edbInfoId int, err error) {
-	fmt.Println("AddCalculateTimeShift")
-	o := orm.NewOrmUsingDB("data")
-	to, err := o.Begin()
-	if err != nil {
-		return
-	}
-	defer func() {
-		if err != nil {
-			fmt.Println("AddCalculateTimeShift,Err:" + err.Error())
-			_ = to.Rollback()
-		} else {
-			_ = to.Commit()
-		}
-	}()
-	if req.EdbInfoId <= 0 {
-		edbInfo := new(EdbInfo)
-		edbInfo.Source = utils.DATA_SOURCE_CALCULATE_TIME_SHIFT
-		edbInfo.SourceName = "时间移位"
-		edbInfo.EdbCode = edbCode
-		edbInfo.EdbName = req.EdbName
-		edbInfo.EdbNameSource = req.EdbName
-		edbInfo.Frequency = req.Frequency
-		edbInfo.Unit = req.Unit
-		edbInfo.ClassifyId = req.ClassifyId
-		edbInfo.SysUserId = sysUserId
-		edbInfo.SysUserRealName = sysUserRealName
-		edbInfo.CreateTime = time.Now()
-		edbInfo.ModifyTime = time.Now()
-		edbInfo.UniqueCode = uniqueCode
-		edbInfo.CalculateFormula = req.Formula
-		edbInfo.EdbType = 2
-		edbInfo.MoveType = req.MoveType
-		edbInfo.MoveFrequency = req.MoveFrequency
-		newEdbInfoId, tmpErr := to.Insert(edbInfo)
-		if tmpErr != nil {
-			return edbInfoId, tmpErr
-		}
-		edbInfoId = int(newEdbInfoId)
-		//关联关系
-		{
-			calculateMappingItem := new(EdbInfoCalculateMapping)
-			calculateMappingItem.CreateTime = time.Now()
-			calculateMappingItem.ModifyTime = time.Now()
-			calculateMappingItem.Sort = 1
-			calculateMappingItem.EdbCode = edbCode
-			calculateMappingItem.EdbInfoId = edbInfoId
-			calculateMappingItem.FromEdbInfoId = fromEdbInfo.EdbInfoId
-			calculateMappingItem.FromEdbCode = fromEdbInfo.EdbCode
-			calculateMappingItem.FromEdbName = fromEdbInfo.EdbName
-			calculateMappingItem.FromSource = fromEdbInfo.Source
-			calculateMappingItem.FromSourceName = fromEdbInfo.SourceName
-			calculateMappingItem.FromTag = ""
-			calculateMappingItem.Source = edbInfo.Source
-			calculateMappingItem.SourceName = edbInfo.SourceName
-			_, err = to.Insert(calculateMappingItem)
-			if err != nil {
-				return
-			}
-		}
-	} else {
-		edbInfoId = req.EdbInfoId
-		dataTableName := GetEdbDataTableName(utils.DATA_SOURCE_CALCULATE_TIME_SHIFT, utils.DATA_SUB_SOURCE_EDB)
-		fmt.Println("dataTableName:" + dataTableName)
-		deleteSql := ` DELETE FROM %s WHERE edb_info_id=? `
-		deleteSql = fmt.Sprintf(deleteSql, dataTableName)
-		_, err = to.Raw(deleteSql, req.EdbInfoId).Exec()
-		if err != nil {
-			return 0, err
-		}
-	}
-
-	var shiftDay int
-	formulaInt, _ := strconv.Atoi(req.Formula)
-	switch req.MoveFrequency {
-	case "天":
-		shiftDay = formulaInt
-	case "周":
-		shiftDay = formulaInt * 7
-	case "月":
-		shiftDay = formulaInt * 30
-	case "季":
-		shiftDay = formulaInt * 90
-	case "年":
-		shiftDay = formulaInt * 365
-	default:
-		shiftDay = formulaInt
-	}
-
-	edbInfoIdStr := strconv.Itoa(edbInfoId)
-	//计算数据
-	var condition string
-	var pars []interface{}
-	condition += " AND edb_info_id=? "
-	if req.EdbInfoId <= 0 {
-		pars = append(pars, req.FromEdbInfoId)
-	} else {
-		pars = append(pars, fromEdbInfo.EdbInfoId)
-	}
-	dataList, err := GetEdbDataListAll(condition, pars, fromEdbInfo.Source, fromEdbInfo.SubSource, 0)
-	if err != nil {
-		return edbInfoId, err
-	}
-
-	addSql := ` INSERT INTO edb_data_calculate_time_shift(edb_info_id,edb_code,data_time,value,create_time,modify_time,status,data_timestamp) values `
-	var isAdd bool
-	existMap := make(map[string]string)
-	dataLen := len(dataList)
-	if req.MoveType == 2 {
-		shiftDay = -shiftDay
-	}
-	for i := 0; i < dataLen; i++ {
-		//当期
-		currentItem := dataList[i]
-		currentDate, _ := time.Parse(utils.FormatDate, currentItem.DataTime)
-
-		existKey := edbCode + currentItem.DataTime
-		if _, ok := existMap[existKey]; !ok {
-			newDate := currentDate.AddDate(0, 0, shiftDay)
-			timestamp := newDate.UnixNano() / 1e6
-			timestampStr := fmt.Sprintf("%d", timestamp)
-			valStr := decimal.NewFromFloat(currentItem.Value).String()
-			addSql += GetAddSql(edbInfoIdStr, edbCode, newDate.Format(utils.FormatDate), timestampStr, valStr)
-			isAdd = true
-		}
-		existMap[existKey] = currentItem.DataTime
-	}
-	if isAdd {
-		addSql = strings.TrimRight(addSql, ",")
-		_, err = to.Raw(addSql).Exec()
-		if err != nil {
-			return edbInfoId, err
-		}
-	}
-	return
-}
-
-// 环比值
-func EditCalculateTimeShift(req *EdbInfoCalculateBatchEditReq, fromEdbInfo *EdbInfo, edbCode string, oldEdbInfo *EdbInfo) (edbInfoId int, err error) {
-	edbInfoId = req.EdbInfoId
-	o := orm.NewOrmUsingDB("data")
-	to, err := o.Begin()
-	if err != nil {
-		return
-	}
-	defer func() {
-		if err != nil {
-			_ = to.Rollback()
-		} else {
-			_ = to.Commit()
-		}
-	}()
-
-	//修改指标信息
-	sql := ` UPDATE  edb_info
-			SET
-			  edb_name =?,
-			  edb_name_source=?,
-			  frequency = ?,
-			  unit = ?,
-			  classify_id = ?,
-			  move_type=?,
-			  move_frequency=?,
-			  calculate_formula=?,
-			  modify_time = NOW()
-			WHERE edb_info_id = ? `
-	_, err = to.Raw(sql, req.EdbName, req.EdbName, req.Frequency, req.Unit, req.ClassifyId, req.MoveType, req.MoveFrequency, req.Formula, edbInfoId).Exec()
-	if err != nil {
-		return
-	}
-
-	var existCondition string
-	var existPars []interface{}
-	existCondition += " AND edb_info_id=? "
-	existPars = append(existPars, edbInfoId)
-
-	existCondition += " AND from_edb_info_id=? "
-	existPars = append(existPars, req.FromEdbInfoId)
-
-	//判断计算指标是否被更换
-	count, err := GetEdbInfoCalculateCountByCondition(req.Source, existCondition, existPars)
-	if err != nil {
-		err = errors.New("判断指标是否改变失败,Err:" + err.Error())
-		return
-	}
-	if count <= 0 || req.MoveType != oldEdbInfo.MoveType || req.MoveFrequency != oldEdbInfo.MoveFrequency || req.Formula != oldEdbInfo.CalculateFormula {
-		if count <= 0 {
-			//删除,计算指标关联的,基础指标的关联关系
-			sql = ` DELETE FROM edb_info_calculate_mapping WHERE edb_info_id = ? `
-			_, err = to.Raw(sql, edbInfoId).Exec()
-			if err != nil {
-				err = errors.New("删除计算指标关联关系失败,Err:" + err.Error())
-				return
-			}
-			//关联关系
-			{
-				calculateMappingItem := new(EdbInfoCalculateMapping)
-				calculateMappingItem.CreateTime = time.Now()
-				calculateMappingItem.ModifyTime = time.Now()
-				calculateMappingItem.Sort = 1
-				calculateMappingItem.EdbCode = edbCode
-				calculateMappingItem.EdbInfoId = edbInfoId
-				calculateMappingItem.FromEdbInfoId = fromEdbInfo.EdbInfoId
-				calculateMappingItem.FromEdbCode = fromEdbInfo.EdbCode
-				calculateMappingItem.FromEdbName = fromEdbInfo.EdbName
-				calculateMappingItem.FromSource = fromEdbInfo.Source
-				calculateMappingItem.FromSourceName = fromEdbInfo.SourceName
-				calculateMappingItem.FromTag = ""
-				calculateMappingItem.Source = utils.DATA_SOURCE_CALCULATE_TIME_SHIFT
-				calculateMappingItem.SourceName = "时间移位"
-				_, err = to.Insert(calculateMappingItem)
-				if err != nil {
-					return
-				}
-			}
-		}
-		//清空原有数据
-		sql = ` DELETE FROM edb_data_calculate_time_shift WHERE edb_info_id = ? `
-		_, err = to.Raw(sql, edbInfoId).Exec()
-		if err != nil {
-			return edbInfoId, err
-		}
-
-		edbInfoIdStr := strconv.Itoa(edbInfoId)
-
-		var shiftDay int
-		formulaInt, _ := strconv.Atoi(req.Formula)
-		switch req.MoveFrequency {
-		case "天":
-			shiftDay = formulaInt
-		case "周":
-			shiftDay = formulaInt * 7
-		case "月":
-			shiftDay = formulaInt * 30
-		case "季":
-			shiftDay = formulaInt * 90
-		case "年":
-			shiftDay = formulaInt * 365
-		default:
-			shiftDay = formulaInt
-		}
-
-		//计算数据
-		var condition string
-		var pars []interface{}
-		condition += " AND edb_info_id=? "
-		pars = append(pars, req.FromEdbInfoId)
-		fmt.Println("EdbInfoId:", req.FromEdbInfoId)
-		dataList, err := GetEdbDataListAll(condition, pars, fromEdbInfo.Source, fromEdbInfo.SubSource, 0)
-		if err != nil {
-			return edbInfoId, err
-		}
-		addSql := ` INSERT INTO edb_data_calculate_time_shift(edb_info_id,edb_code,data_time,value,create_time,modify_time,status,data_timestamp) values `
-		var isAdd bool
-		existMap := make(map[string]string)
-		dataLen := len(dataList)
-		if req.MoveType == 2 {
-			shiftDay = -shiftDay
-		}
-		for i := 0; i < dataLen; i++ {
-			//当期
-			currentItem := dataList[i]
-			currentDate, _ := time.Parse(utils.FormatDate, currentItem.DataTime)
-			newDate := currentDate.AddDate(0, 0, shiftDay)
-			existKey := edbCode + newDate.Format(utils.FormatDate)
-			if _, ok := existMap[existKey]; !ok {
-				timestamp := newDate.UnixNano() / 1e6
-				timestampStr := fmt.Sprintf("%d", timestamp)
-				valStr := decimal.NewFromFloat(currentItem.Value).String()
-				addSql += GetAddSql(edbInfoIdStr, edbCode, newDate.Format(utils.FormatDate), timestampStr, valStr)
-				isAdd = true
-			}
-			existMap[existKey] = currentItem.DataTime
-		}
-		if isAdd {
-			addSql = strings.TrimRight(addSql, ",")
-			_, err = to.Raw(addSql).Exec()
-			if err != nil {
-				return edbInfoId, err
-			}
-		}
-	}
-	return
-}
-
-// 变频
-func RefreshCalculateTimeShift(edbInfoId, formulaInt, moveType int, fromEdbInfo *EdbInfo, edbCode, startDate, endDate, moveFrequency 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()
-		}
-	}()
-
-	if err != nil {
-		return
-	}
-	edbInfoIdStr := strconv.Itoa(edbInfoId)
-	//计算数据
-
-	//计算数据
-	var condition string
-	var pars []interface{}
-	condition += " AND edb_info_id=? "
-	pars = append(pars, fromEdbInfo.EdbInfoId)
-
-	if startDate != "" {
-		condition += " AND data_time>=? "
-		pars = append(pars, startDate)
-	}
-	if endDate != "" {
-		condition += " AND data_time<=? "
-		pars = append(pars, endDate)
-	}
-
-	var shiftDay int
-	switch moveFrequency {
-	case "天":
-		shiftDay = formulaInt
-	case "周":
-		shiftDay = formulaInt * 7
-	case "月":
-		shiftDay = formulaInt * 30
-	case "季":
-		shiftDay = formulaInt * 90
-	case "年":
-		shiftDay = formulaInt * 365
-	default:
-		shiftDay = formulaInt
-	}
-	if moveType == 2 {
-		shiftDay = -shiftDay
-	}
-	dataList, err := GetEdbDataListAll(condition, pars, fromEdbInfo.Source, fromEdbInfo.SubSource, 0)
-	if err != nil {
-		return err
-	}
-	existMap := make(map[string]string)
-	dataLen := len(dataList)
-	addSql := ` INSERT INTO edb_data_calculate_time_shift(edb_info_id,edb_code,data_time,value,create_time,modify_time,status,data_timestamp) values `
-	var isAdd bool
-	for i := 0; i < dataLen; i++ {
-		//当期
-		currentItem := dataList[i]
-		existKey := edbCode + currentItem.DataTime
-		if _, ok := existMap[existKey]; !ok {
-			currentDate, _ := time.Parse(utils.FormatDate, currentItem.DataTime)
-			newDate := currentDate.AddDate(0, 0, -shiftDay)
-			timestamp := newDate.UnixNano() / 1e6
-			timestampStr := fmt.Sprintf("%d", timestamp)
-			valStr := decimal.NewFromFloat(currentItem.Value).String()
-			addSql += GetAddSql(edbInfoIdStr, edbCode, newDate.Format(utils.FormatDate), timestampStr, valStr)
-		}
-		existMap[existKey] = currentItem.DataTime
-	}
-	if isAdd {
-		addSql = strings.TrimRight(addSql, ",")
-		_, err = to.Raw(addSql).Exec()
-		if err != nil {
-			return err
-		}
-	}
-	return
-}
-
-type EdbInfoCalculateTimeShiftDetail struct {
-	EdbInfoCalculateBpId int       `orm:"column(edb_info_calculate_bp_id);pk"`
-	EdbInfoId            int       `description:"指标id"`
-	EdbCode              string    `description:"指标编码"`
-	FromEdbInfoId        int       `description:"计算指标id"`
-	FromEdbCode          string    `description:"计算指标编码"`
-	FromEdbName          string    `description:"计算指标名称"`
-	FromSource           int       `description:"计算指标来源"`
-	FromSourceName       string    `description:"计算指标来源名称"`
-	FromTag              string    `description:"来源指标标签"`
-	Sort                 int       `description:"计算指标名称排序"`
-	CreateTime           time.Time `description:"创建时间"`
-	ModifyTime           time.Time `description:"修改时间"`
-	StartDate            string    `description:"开始日期"`
-	EndDate              string    `description:"结束日期"`
-}
-
-func GetEdbInfoCalculateTimeShiftDetail(edbInfoId int) (item *EdbInfoCalculateTbzDetail, err error) {
-	o := orm.NewOrmUsingDB("data")
-	sql := ` SELECT a.*,b.start_date,b.end_date FROM edb_info_calculate_mapping AS a
-			INNER JOIN edb_info AS b ON a.from_edb_info_id=b.edb_info_id
-			WHERE a.edb_info_id=? `
-	err = o.Raw(sql, edbInfoId).QueryRow(&item)
-	return
-}
-
-// 刷新所有变频数据
-func RefreshAllCalculateTimeShift(edbInfoId, source, subSource, formulaInt, moveType int, fromEdbInfo *EdbInfo, edbCode, startDate, endDate, moveFrequency 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()
-		}
-	}()
-
-	if err != nil {
-		return
-	}
-	edbInfoIdStr := strconv.Itoa(edbInfoId)
-	//计算数据
-
-	//计算数据
-	var condition string
-	var pars []interface{}
-	condition += " AND edb_info_id=? "
-	pars = append(pars, fromEdbInfo.EdbInfoId)
-
-	if startDate != "" {
-		condition += " AND data_time>=? "
-		pars = append(pars, startDate)
-	}
-	if endDate != "" {
-		condition += " AND data_time<=? "
-		pars = append(pars, endDate)
-	}
-
-	var shiftDay int
-	switch moveFrequency {
-	case "天":
-		shiftDay = formulaInt
-	case "周":
-		shiftDay = formulaInt * 7
-	case "月":
-		shiftDay = formulaInt * 30
-	case "季":
-		shiftDay = formulaInt * 90
-	case "年":
-		shiftDay = formulaInt * 365
-	default:
-		shiftDay = formulaInt
-	}
-
-	if moveType == 2 {
-		shiftDay = -shiftDay
-	}
-
-	dataList, err := GetEdbDataListAll(condition, pars, fromEdbInfo.Source, fromEdbInfo.SubSource, 0)
-	if err != nil {
-		return err
-	}
-	var dateArr []string
-	dataMap := make(map[string]*EdbInfoSearchData)
-	for _, v := range dataList {
-		dateArr = append(dateArr, v.DataTime)
-		dataMap[v.DataTime] = v
-	}
-	fmt.Println("source:", source)
-	//获取指标所有数据
-	existDataList := make([]*EdbDataBase, 0)
-	dataTableName := GetEdbDataTableName(source, subSource)
-	fmt.Println("dataTableName:", dataTableName)
-	sql := `SELECT * FROM %s WHERE edb_info_id=? `
-	sql = fmt.Sprintf(sql, dataTableName)
-	_, err = to.Raw(sql, edbInfoId).QueryRows(&existDataList)
-	if err != nil {
-		return err
-	}
-	existDataMap := make(map[string]string)
-	for _, v := range existDataList {
-		existDataMap[v.DataTime] = v.Value
-	}
-	fmt.Println("existDataMap:", existDataMap)
-	addSql := ` INSERT INTO edb_data_calculate_time_shift(edb_info_id,edb_code,data_time,value,create_time,modify_time,status,data_timestamp) values `
-	var isAdd bool
-
-	existMap := make(map[string]string)
-	dataLen := len(dataList)
-	for i := 0; i < dataLen; i++ {
-		//当期
-		currentItem := dataList[i]
-		existKey := edbCode + currentItem.DataTime
-		if _, ok := existMap[existKey]; !ok {
-			currentDate, _ := time.Parse(utils.FormatDate, currentItem.DataTime)
-			newDate := currentDate.AddDate(0, 0, shiftDay)
-
-			timestamp := newDate.UnixNano() / 1e6
-			timestampStr := fmt.Sprintf("%d", timestamp)
-			valStr := decimal.NewFromFloat(currentItem.Value).String()
-			if existVal, ok := existDataMap[newDate.Format(utils.FormatDate)]; !ok {
-				isAdd = true
-				addSql += GetAddSql(edbInfoIdStr, edbCode, newDate.Format(utils.FormatDate), timestampStr, valStr)
-			} else {
-				if existVal != valStr {
-					sql := ` UPDATE %s SET value=?,modify_time=NOW() WHERE edb_info_id=? AND data_time=? `
-					sql = fmt.Sprintf(sql, dataTableName)
-					_, err = to.Raw(sql, valStr, edbInfoId, newDate.Format(utils.FormatDate)).Exec()
-					if err != nil {
-						return err
-					}
-				}
-			}
-		}
-		existMap[existKey] = currentItem.DataTime
-	}
-
-	if isAdd {
-		addSql = strings.TrimRight(addSql, ",")
-		_, err = to.Raw(addSql).Exec()
-		if err != nil {
-			return err
-		}
-	}
-	return
-}

+ 0 - 34
models/data_manage/edb_data_calculate_zjpj.go

@@ -1,34 +0,0 @@
-package data_manage
-
-import (
-	"github.com/beego/beego/v2/client/orm"
-	"time"
-)
-
-// EdbDataCalculateZjpj 直接拼接数据结构体
-type EdbDataCalculateZjpj struct {
-	EdbDataId     int `orm:"column(edb_data_id);pk"`
-	EdbInfoId     int
-	EdbCode       string
-	DataTime      string
-	Value         float64
-	Status        int
-	CreateTime    time.Time
-	ModifyTime    time.Time
-	DataTimestamp int64
-}
-
-// GetAllEdbDataCalculateZjpjByEdbInfoId 根据指标id获取全部的数据
-func GetAllEdbDataCalculateZjpjByEdbInfoId(edbInfoId int) (items []*EdbDataCalculateZjpj, err error) {
-	o := orm.NewOrmUsingDB("data")
-	sql := ` SELECT * FROM edb_data_calculate_zjpj WHERE edb_info_id=? ORDER BY data_time DESC `
-	_, err = o.Raw(sql, edbInfoId).QueryRows(&items)
-	return
-}
-
-type EdbDataFromZjpj struct {
-	Date   map[string]int64   `json:"date"`
-	Ticker map[string]string  `json:"ticker"`
-	Field  map[string]string  `json:"field"`
-	Value  map[string]float64 `json:"value"`
-}

+ 0 - 270
models/data_manage/edb_data_cffex.go

@@ -1,11 +1,8 @@
 package data_manage
 
 import (
-	"eta/eta_api/utils"
 	"fmt"
 	"github.com/beego/beego/v2/client/orm"
-	"strconv"
-	"strings"
 	"time"
 )
 
@@ -64,227 +61,6 @@ func GetEdbDataCffexMaxOrMinDate(edbCode string) (minDate, maxDate string, err e
 	return
 }
 
-// RefreshEdbDataByCffex 刷新中金所指标数据
-func RefreshEdbDataByCffex(edbInfoId int, edbCode, startDate, endDate 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()
-		}
-	}()
-	if err != nil {
-		return
-	}
-	var suffix string
-	if strings.Contains(edbCode, "deal") {
-		suffix = "deal"
-	} else if strings.Contains(edbCode, "buy") {
-		suffix = "buy"
-	} else if strings.Contains(edbCode, "sold") {
-		suffix = "sold"
-	}
-	edbInfoIdStr := strconv.Itoa(edbInfoId)
-	//计算数据
-	var condition string
-	var pars []interface{}
-
-	if edbCode != "" {
-		if suffix == "deal" {
-			condition += " AND deal_code=? "
-		} else if suffix == "buy" {
-			condition += " AND buy_code=? "
-		} else {
-			condition += " AND sold_code=? "
-		}
-		pars = append(pars, edbCode)
-	}
-
-	if startDate != "" {
-		condition += " AND data_time>=? "
-		pars = append(pars, startDate)
-	}
-
-	if endDate != "" {
-		condition += " AND data_time<=? "
-		pars = append(pars, endDate)
-	}
-
-	glDataList, err := GetCffexDataByTradeCode(condition, pars)
-
-	addSql := ` INSERT INTO edb_data_cffex(edb_info_id,edb_code,data_time,value,create_time,modify_time,status,data_timestamp) values `
-	var isAdd bool
-	existMap := make(map[string]string)
-	for _, v := range glDataList {
-		var value string
-		if suffix == "deal" {
-			value = v.DealValue
-		} else if suffix == "buy" {
-			value = v.BuyValue
-		} else {
-			value = v.SoldValue
-		}
-		item := v
-		itemValue := value
-		if _, ok := existMap[v.DataTime]; !ok {
-			count, err := GetEdbDataCffexByCodeAndDate(edbCode, v.DataTime)
-			if err != nil && err.Error() != utils.ErrNoRow() {
-				return err
-			}
-			if count <= 0 {
-				eDate := item.DataTime
-				sValue := itemValue
-				if sValue != "" {
-					dataTime, err := time.Parse(utils.FormatDate, eDate)
-					if err != nil {
-						return err
-					}
-					timestamp := dataTime.UnixNano() / 1e6
-					timeStr := fmt.Sprintf("%d", timestamp)
-					addSql += GetAddSql(edbInfoIdStr, edbCode, eDate, timeStr, sValue)
-					isAdd = true
-				}
-			} else {
-				err = ModifyEdbDataCffex(int64(edbInfoId), v.DataTime, value)
-				if err != nil {
-					return err
-				}
-			}
-		}
-		existMap[v.DataTime] = value
-	}
-	if isAdd {
-		addSql = strings.TrimRight(addSql, ",")
-		_, err = to.Raw(addSql).Exec()
-		if err != nil {
-			return err
-		}
-	}
-	return
-}
-
-// RefreshAllEdbDataByCffex 全部刷新中金所
-func RefreshAllEdbDataByCffex(edbInfoId, source, subSource int, edbCode, startDate, endDate 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 suffix string
-	if strings.Contains(edbCode, "deal") {
-		suffix = "deal"
-	} else if strings.Contains(edbCode, "buy") {
-		suffix = "buy"
-	} else if strings.Contains(edbCode, "sold") {
-		suffix = "sold"
-	}
-	edbInfoIdStr := strconv.Itoa(edbInfoId)
-	//计算数据
-	var condition string
-	var pars []interface{}
-
-	if edbCode != "" {
-		if suffix == "deal" {
-			condition += " AND deal_code=? "
-		} else if suffix == "buy" {
-			condition += " AND buy_code=? "
-		} else {
-			condition += " AND sold_code=? "
-		}
-		pars = append(pars, edbCode)
-	}
-
-	if startDate != "" {
-		condition += " AND data_time>=? "
-		pars = append(pars, startDate)
-	}
-
-	if endDate != "" {
-		condition += " AND data_time<=? "
-		pars = append(pars, endDate)
-	}
-
-	glDataList, err := GetCffexDataByTradeCode(condition, pars)
-
-	//获取指标所有数据
-	dataList := make([]*EdbDataBase, 0)
-	dataTableName := GetEdbDataTableName(source, subSource)
-	sql := `SELECT * FROM %s WHERE edb_info_id=? `
-	sql = fmt.Sprintf(sql, dataTableName)
-	_, err = to.Raw(sql, edbInfoId).QueryRows(&dataList)
-	if err != nil {
-		return err
-	}
-	dataMap := make(map[string]string)
-	for _, v := range dataList {
-		dataMap[v.DataTime] = v.Value
-	}
-
-	addSql := ` INSERT INTO edb_data_cffex(edb_info_id,edb_code,data_time,value,create_time,modify_time,status,data_timestamp) values `
-	var isAdd bool
-	existMap := make(map[string]string)
-	for _, v := range glDataList {
-		var value string
-		if suffix == "deal" {
-			value = v.DealValue
-		} else if suffix == "buy" {
-			value = v.BuyValue
-		} else {
-			value = v.SoldValue
-		}
-		item := v
-		itemValue := value
-		if _, ok := existMap[v.DataTime]; !ok {
-			eDate := item.DataTime
-			sValue := itemValue
-			if sValue != "" {
-				dataTime, err := time.Parse(utils.FormatDate, eDate)
-				if err != nil {
-					return err
-				}
-				timestamp := dataTime.UnixNano() / 1e6
-				timeStr := fmt.Sprintf("%d", timestamp)
-				saveValue := sValue
-
-				if existVal, ok := dataMap[eDate]; !ok {
-					addSql += GetAddSql(edbInfoIdStr, edbCode, eDate, timeStr, saveValue)
-					isAdd = true
-				} else {
-					if existVal != saveValue {
-						sql := ` UPDATE %s SET value=?,modify_time=NOW() WHERE edb_info_id=? AND data_time=? `
-						sql = fmt.Sprintf(sql, dataTableName)
-						_, err = to.Raw(sql, sValue, edbInfoId, eDate).Exec()
-						if err != nil {
-							return err
-						}
-					}
-				}
-			}
-		}
-		existMap[v.DataTime] = v.DataTime
-	}
-	if isAdd {
-		addSql = strings.TrimRight(addSql, ",")
-		_, err = to.Raw(addSql).Exec()
-		if err != nil {
-			return err
-		}
-	}
-	return
-}
-
 // GetBaseInfoFromCffexByIndexCode 获取指标信息
 func GetBaseInfoFromCffexByIndexCode(indexCode, suffix string) (list []*BaseInfoFromCffex, err error) {
 	o := orm.NewOrmUsingDB("data")
@@ -293,49 +69,3 @@ func GetBaseInfoFromCffexByIndexCode(indexCode, suffix string) (list []*BaseInfo
 	_, err = o.Raw(sql, indexCode).QueryRows(&list)
 	return
 }
-
-func GetCffexDataByTradeCode(condition string, pars []interface{}) (item []*BaseFromCffexDataSimple, err error) {
-	sql := ` SELECT * FROM base_from_trade_cffex_index WHERE 1=1 `
-	o := orm.NewOrmUsingDB("data")
-	if condition != "" {
-		sql += condition
-	}
-	sql += ` ORDER BY data_time DESC `
-	_, err = o.Raw(sql, pars).QueryRows(&item)
-	return
-}
-
-func AddEdbDataCffexBySql(sqlStr string) (err error) {
-	o := orm.NewOrmUsingDB("data")
-	_, err = o.Raw(sqlStr).Exec()
-	return
-}
-
-func GetEdbDataCffexByCode(edbCode string) (items []*EdbInfoSearchData, err error) {
-	o := orm.NewOrmUsingDB("data")
-	sql := ` SELECT * FROM edb_data_cffex WHERE edb_code=? ORDER BY data_time DESC LIMIT ? `
-	_, err = o.Raw(sql, edbCode, utils.EDB_DATA_LIMIT).QueryRows(&items)
-	return
-}
-
-func GetBaseFromCffexDataAllByIndexCode(indexCode, suffix string) (list []*BaseFromTradeCFFEXIndex, err error) {
-	o := orm.NewOrmUsingDB("data")
-	sql := `SELECT * FROM base_from_trade_cffex_index WHERE %s_code=? `
-	sql = fmt.Sprintf(sql, suffix)
-	_, err = o.Raw(sql, indexCode).QueryRows(&list)
-	return
-}
-
-func GetEdbDataCffexByCodeAndDate(edbCode string, startDate string) (count int, err error) {
-	o := orm.NewOrmUsingDB("data")
-	sql := ` SELECT COUNT(1) AS count FROM edb_data_cffex WHERE edb_code=? AND data_time=? `
-	err = o.Raw(sql, edbCode, startDate).QueryRow(&count)
-	return
-}
-
-func ModifyEdbDataCffex(edbInfoId int64, dataTime, value string) (err error) {
-	o := orm.NewOrmUsingDB("data")
-	sql := ` UPDATE edb_data_cffex SET value=?,modify_time=NOW() WHERE edb_info_id=? AND data_time=? `
-	_, err = o.Raw(sql, value, edbInfoId, dataTime).Exec()
-	return
-}

+ 0 - 227
models/data_manage/edb_data_coal.go

@@ -1,11 +1,8 @@
 package data_manage
 
 import (
-	"eta/eta_api/utils"
 	"fmt"
 	"github.com/beego/beego/v2/client/orm"
-	"strconv"
-	"strings"
 	"time"
 )
 
@@ -64,204 +61,6 @@ func GetEdbDataCoalMaxOrMinDate(edbCode string) (minDate, maxDate string, err er
 	return
 }
 
-// RefreshEdbDataByCoal 刷新煤炭网指标数据
-func RefreshEdbDataByCoal(edbInfoId int, edbCode, startDate, endDate 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 suffix string
-	if strings.Contains(edbCode, "jsm") {
-		suffix = "jsm_index"
-	} else if strings.Contains(edbCode, "company") {
-		suffix = "company_index"
-	} else if strings.Contains(edbCode, "firm") {
-		suffix = "firm_index"
-	} else if strings.Contains(edbCode, "coastal") {
-		suffix = "coastal_index"
-	} else if strings.Contains(edbCode, "inland") {
-		suffix = "inland_index"
-	}
-	edbInfoIdStr := strconv.Itoa(edbInfoId)
-	//计算数据
-	var condition string
-	var pars []interface{}
-
-	if edbCode != "" {
-		condition += " AND index_code=? "
-		pars = append(pars, edbCode)
-	}
-
-	if startDate != "" {
-		condition += " AND data_time>=? "
-		pars = append(pars, startDate)
-	}
-
-	if endDate != "" {
-		condition += " AND data_time<=? "
-		pars = append(pars, endDate)
-	}
-
-	coalDataList, err := GetCoalDataByTradeCode(condition, suffix, pars)
-
-	addSql := ` INSERT INTO edb_data_coal(edb_info_id,edb_code,data_time,value,create_time,modify_time,status,data_timestamp) values `
-	var isAdd bool
-	existMap := make(map[string]string)
-	for _, v := range coalDataList {
-		item := v
-		itemValue := v.DealValue
-		if _, ok := existMap[v.DataTime]; !ok {
-			count, err := GetEdbDataCoalByCodeAndDate(edbCode, v.DataTime)
-			if err != nil && err.Error() != utils.ErrNoRow() {
-				return err
-			}
-			if count <= 0 {
-				eDate := item.DataTime
-				sValue := itemValue
-				if sValue != "" {
-					dataTime, err := time.Parse(utils.FormatDate, eDate)
-					if err != nil {
-						return err
-					}
-					timestamp := dataTime.UnixNano() / 1e6
-					timeStr := fmt.Sprintf("%d", timestamp)
-					addSql += GetAddSql(edbInfoIdStr, edbCode, eDate, timeStr, sValue)
-					isAdd = true
-				}
-			} else {
-				err = ModifyEdbDataCoal(int64(edbInfoId), v.DataTime, v.DealValue)
-				if err != nil {
-					return err
-				}
-			}
-		}
-		existMap[v.DataTime] = v.DealValue
-	}
-	if isAdd {
-		addSql = strings.TrimRight(addSql, ",")
-		_, err = to.Raw(addSql).Exec()
-		if err != nil {
-			return err
-		}
-	}
-	return
-}
-
-// RefreshAllEdbDataByCoal 全部刷新中金所
-func RefreshAllEdbDataByCoal(edbInfoId, source, subSource int, edbCode, startDate, endDate 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 suffix string
-	if strings.Contains(edbCode, "jsm") {
-		suffix = "jsm_index"
-	} else if strings.Contains(edbCode, "company") {
-		suffix = "company_index"
-	} else if strings.Contains(edbCode, "firm") {
-		suffix = "firm_index"
-	} else if strings.Contains(edbCode, "coastal") {
-		suffix = "coastal_index"
-	} else if strings.Contains(edbCode, "inland") {
-		suffix = "inland_index"
-	}
-	edbInfoIdStr := strconv.Itoa(edbInfoId)
-	//计算数据
-	var condition string
-	var pars []interface{}
-
-	if edbCode != "" {
-		condition += " AND index_code=? "
-		pars = append(pars, edbCode)
-	}
-
-	if startDate != "" {
-		condition += " AND data_time>=? "
-		pars = append(pars, startDate)
-	}
-
-	if endDate != "" {
-		condition += " AND data_time<=? "
-		pars = append(pars, endDate)
-	}
-
-	coalDataList, err := GetCoalDataByTradeCode(condition, suffix, pars)
-
-	//获取指标所有数据
-	dataList := make([]*EdbDataBase, 0)
-	dataTableName := GetEdbDataTableName(source, subSource)
-	sql := `SELECT * FROM %s WHERE edb_info_id=? `
-	sql = fmt.Sprintf(sql, dataTableName)
-	_, err = to.Raw(sql, edbInfoId).QueryRows(&dataList)
-	if err != nil {
-		return err
-	}
-	dataMap := make(map[string]string)
-	for _, v := range dataList {
-		dataMap[v.DataTime] = v.Value
-	}
-
-	addSql := ` INSERT INTO edb_data_coal(edb_info_id,edb_code,data_time,value,create_time,modify_time,status,data_timestamp) values `
-	var isAdd bool
-	existMap := make(map[string]string)
-	for _, v := range coalDataList {
-		item := v
-		itemValue := v.DealValue
-		if _, ok := existMap[v.DataTime]; !ok {
-			eDate := item.DataTime
-			sValue := itemValue
-			if sValue != "" {
-				dataTime, err := time.Parse(utils.FormatDate, eDate)
-				if err != nil {
-					return err
-				}
-				timestamp := dataTime.UnixNano() / 1e6
-				timeStr := fmt.Sprintf("%d", timestamp)
-				saveValue := sValue
-
-				if existVal, ok := dataMap[eDate]; !ok {
-					addSql += GetAddSql(edbInfoIdStr, edbCode, eDate, timeStr, saveValue)
-					isAdd = true
-				} else {
-					if existVal != saveValue {
-						sql := ` UPDATE %s SET value=?,modify_time=NOW() WHERE edb_info_id=? AND data_time=? `
-						sql = fmt.Sprintf(sql, dataTableName)
-						_, err = to.Raw(sql, sValue, edbInfoId, eDate).Exec()
-						if err != nil {
-							return err
-						}
-					}
-				}
-			}
-		}
-		existMap[v.DataTime] = v.DataTime
-	}
-	if isAdd {
-		addSql = strings.TrimRight(addSql, ",")
-		_, err = to.Raw(addSql).Exec()
-		if err != nil {
-			return err
-		}
-	}
-	return
-}
-
 // GetBaseInfoFromCoalByIndexCode 获取指标信息
 func GetBaseInfoFromCoalByIndexCode(indexCode, suffix string) (list []*BaseInfoFromCoal, err error) {
 	o := orm.NewOrmUsingDB("data")
@@ -270,29 +69,3 @@ func GetBaseInfoFromCoalByIndexCode(indexCode, suffix string) (list []*BaseInfoF
 	_, err = o.Raw(sql, indexCode).QueryRows(&list)
 	return
 }
-
-func GetCoalDataByTradeCode(condition, suffix string, pars []interface{}) (item []*BaseFromCoalDataSimple, err error) {
-	sql := ` SELECT * FROM base_from_coalmine_%s WHERE 1=1 `
-	sql = fmt.Sprintf(sql, suffix)
-	o := orm.NewOrmUsingDB("data")
-	if condition != "" {
-		sql += condition
-	}
-	sql += ` ORDER BY data_time DESC `
-	_, err = o.Raw(sql, pars).QueryRows(&item)
-	return
-}
-
-func GetEdbDataCoalByCodeAndDate(edbCode string, startDate string) (count int, err error) {
-	o := orm.NewOrmUsingDB("data")
-	sql := ` SELECT COUNT(1) AS count FROM edb_data_coal WHERE edb_code=? AND data_time=? `
-	err = o.Raw(sql, edbCode, startDate).QueryRow(&count)
-	return
-}
-
-func ModifyEdbDataCoal(edbInfoId int64, dataTime, value string) (err error) {
-	o := orm.NewOrmUsingDB("data")
-	sql := ` UPDATE edb_data_coal SET value=?,modify_time=NOW() WHERE edb_info_id=? AND data_time=? `
-	_, err = o.Raw(sql, value, edbInfoId, dataTime).Exec()
-	return
-}

+ 1 - 54
models/data_manage/edb_data_fubao.go

@@ -2,65 +2,12 @@ package data_manage
 
 import (
 	"github.com/beego/beego/v2/client/orm"
-	"time"
 )
 
-//富宝数据
-
-type EdbDataFubao struct {
-	EdbDataId     int `orm:"column(edb_data_id);pk"`
-	EdbInfoId     int
-	EdbCode       string
-	DataTime      string
-	Value         float64
-	Status        int
-	CreateTime    time.Time
-	ModifyTime    time.Time
-	DataTimestamp int64
-}
-
-func AddEdbDataFubaoBySql(sqlStr string) (err error) {
-	o := orm.NewOrmUsingDB("data")
-	_, err = o.Raw(sqlStr).Exec()
-	return
-}
-
-func ModifyEdbDataFubao(edbInfoId int64, dataTime string, value float64) (err error) {
-	o := orm.NewOrmUsingDB("data")
-	sql := ` UPDATE edb_data_ths SET value=?,modify_time=NOW() WHERE edb_info_id=? AND data_time=? `
-	_, err = o.Raw(sql, value, edbInfoId, dataTime).Exec()
-	return
-}
-
+// 富宝数据
 func GetEdbDataFubaoMaxOrMinDate(edbCode string) (min_date, max_date string, err error) {
 	o := orm.NewOrmUsingDB("data")
 	sql := ` SELECT MIN(data_time) AS min_date,MAX(data_time) AS max_date FROM edb_data_ths WHERE edb_code=? `
 	err = o.Raw(sql, edbCode).QueryRow(&min_date, &max_date)
 	return
 }
-
-func GetEdbDataFubaoByCodeAndDate(edbCode string, startDate string) (count int, err error) {
-	o := orm.NewOrmUsingDB("data")
-	sql := ` SELECT COUNT(1) AS count FROM edb_data_ths WHERE edb_code=? AND data_time=? `
-	err = o.Raw(sql, edbCode, startDate).QueryRow(&count)
-	return
-}
-
-func GetEdbDataFubaoByCode(edbCode string, size int) (items []*EdbInfoSearchData, err error) {
-	o := orm.NewOrmUsingDB("data")
-	sql := ` SELECT * FROM edb_data_ths WHERE edb_code=? ORDER BY data_time DESC LIMIT ? `
-	_, err = o.Raw(sql, edbCode, size).QueryRows(&items)
-	return
-}
-
-type EdbDataFromFubao struct {
-	DataVol   int64       `json:"dataVol"`
-	Errmsg    string      `json:"errmsg"`
-	Errorcode int64       `json:"errorcode"`
-	Perf      interface{} `json:"perf"`
-	Tables    []struct {
-		ID    []string  `json:"id"`
-		Time  []string  `json:"time"`
-		Value []float64 `json:"value"`
-	} `json:"tables"`
-}

+ 0 - 316
models/data_manage/edb_data_gl.go

@@ -1,27 +1,9 @@
 package data_manage
 
 import (
-	"eta/eta_api/utils"
-	"fmt"
 	"github.com/beego/beego/v2/client/orm"
-	"strconv"
-	"strings"
-	"time"
 )
 
-func AddEdbDataGlBySql(sqlStr string) (err error) {
-	o := orm.NewOrmUsingDB("data")
-	_, err = o.Raw(sqlStr).Exec()
-	return
-}
-
-func GetEdbDataGlByEdbCode(edbCode string) (items []*EdbInfoSearchData, err error) {
-	o := orm.NewOrmUsingDB("data")
-	sql := ` SELECT * FROM edb_data_gl WHERE edb_code=? ORDER BY data_time DESC LIMIT ? `
-	_, err = o.Raw(sql, edbCode, utils.EDB_DATA_LIMIT).QueryRows(&items)
-	return
-}
-
 func GetEdbDataGlMaxOrMinDate(edbCode string) (min_date, max_date string, err error) {
 	o := orm.NewOrmUsingDB("data")
 	sql := ` SELECT MIN(data_time) AS min_date,MAX(data_time) AS max_date FROM edb_data_gl WHERE edb_code=? `
@@ -33,301 +15,3 @@ type GlData struct {
 	InputValue string `orm:"column(DATA_VALUE)" description:"日期"`
 	DataTime   string `orm:"column(DATA_DATE)" description:"值"`
 }
-
-func GetGlDataByTradeCode(condition string, pars []interface{}) (item []*GlData, err error) {
-	condition += " AND IS_DELETE=0 "
-	sql := ` SELECT * FROM mb_index_main_data WHERE 1=1 `
-	o := orm.NewOrmUsingDB("gl")
-	if condition != "" {
-		sql += condition
-	}
-	sql += ` ORDER BY PUBLISH_TIME DESC `
-	_, err = o.Raw(sql, pars).QueryRows(&item)
-	return
-}
-
-func GetEdbDataGlByCode(edbCode string) (items []*EdbInfoSearchData, err error) {
-	o := orm.NewOrmUsingDB("data")
-	sql := ` SELECT * FROM edb_data_gl WHERE edb_code=? ORDER BY data_time DESC LIMIT ? `
-	_, err = o.Raw(sql, edbCode, utils.EDB_DATA_LIMIT).QueryRows(&items)
-	return
-}
-
-func GetEdbDataByGl(edbCode, startDate, endDate string) (searchItem *EdbInfoSearch, err error) {
-
-	var condition string
-	var pars []interface{}
-
-	if edbCode != "" {
-		condition += " AND INDEX_CODE=? "
-		pars = append(pars, edbCode)
-	}
-
-	glDataList, err := GetGlDataByTradeCode(condition, pars)
-	if err != nil {
-		return
-	}
-	searchItem = new(EdbInfoSearch)
-	searchItem.EdbCode = edbCode
-	dataLen := len(glDataList)
-
-	existMap := make(map[string]string)
-	if dataLen > 0 {
-		var isAdd bool
-		addSql := ` INSERT INTO edb_data_gl(edb_info_id,edb_code,data_time,value,create_time,modify_time,status,data_timestamp) values `
-		dataList := make([]*EdbInfoSearchData, 0)
-		for i := 0; i < dataLen; i++ {
-			item := glDataList[i]
-			eDate := item.DataTime
-			sValue := item.InputValue
-			if sValue != "" {
-				if _, ok := existMap[eDate]; !ok {
-					dataTime, err := time.Parse(utils.FormatDate, eDate)
-					if err != nil {
-						return nil, err
-					}
-					timestamp := dataTime.UnixNano() / 1e6
-					timeStr := fmt.Sprintf("%d", timestamp)
-					addSql += GetAddSql("0", edbCode, eDate, timeStr, sValue)
-					isAdd = true
-				}
-			}
-			existMap[eDate] = eDate
-		}
-		fmt.Println("isAdd:", isAdd)
-		if isAdd {
-			//addSql = strings.TrimRight(addSql, ",")
-			//fmt.Println("addSql:exec start")
-			//_, err = o.Raw(addSql).Exec()
-			//if err != nil {
-			//	utils.FileLogData.Info("GetEdbDataByGl Err:%s", err.Error())
-			//	return
-			//}
-			//fmt.Println("addSql:exec end")
-			addSql = strings.TrimRight(addSql, ",")
-			utils.FileLog.Info(addSql)
-			err = AddEdbDataGlBySql(addSql)
-			if err != nil {
-				utils.FileLogData.Info("AddEdbDataGlBySql Err:%s", err.Error())
-				return
-			}
-		}
-		dataList, err := GetEdbDataGlByCode(edbCode)
-		if err != nil {
-			utils.FileLogData.Info("GetEdbDataGlByCode Err:%s", err.Error())
-			return searchItem, err
-		}
-		minDate, maxDate, err := GetEdbDataGlMaxOrMinDate(edbCode)
-		if err != nil {
-			return searchItem, err
-		}
-		searchItem.DataList = dataList
-		searchItem.StartDate = minDate
-		searchItem.EndDate = maxDate
-	}
-	if searchItem.DataList == nil {
-		searchItem.DataList = make([]*EdbInfoSearchData, 0)
-	}
-	return
-}
-
-func ModifyEdbDataGlStatus(edbInfoId int64, edbCode string) (err error) {
-	o := orm.NewOrmUsingDB("data")
-	sql := ` UPDATE edb_data_gl SET edb_info_id=?, status=1,modify_time=NOW() WHERE edb_code=? `
-	_, err = o.Raw(sql, edbInfoId, edbCode).Exec()
-	return
-}
-
-func GetEdbDataGlByCodeAndDate(edbCode string, startDate string) (count int, err error) {
-	o := orm.NewOrmUsingDB("data")
-	sql := ` SELECT COUNT(1) AS count FROM edb_data_gl WHERE edb_code=? AND data_time=? `
-	err = o.Raw(sql, edbCode, startDate).QueryRow(&count)
-	return
-}
-
-func ModifyEdbDataGl(edbInfoId int64, dataTime, value string) (err error) {
-	o := orm.NewOrmUsingDB("data")
-	sql := ` UPDATE edb_data_gl SET value=?,modify_time=NOW() WHERE edb_info_id=? AND data_time=? `
-	_, err = o.Raw(sql, value, edbInfoId, dataTime).Exec()
-	return
-}
-
-// 刷新钢联指标数据
-func RefreshEdbDataByGl(edbInfoId int, edbCode, startDate, endDate 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()
-		}
-	}()
-
-	if err != nil {
-		return
-	}
-	edbInfoIdStr := strconv.Itoa(edbInfoId)
-	//计算数据
-	var condition string
-	var pars []interface{}
-
-	if edbCode != "" {
-		condition += " AND INDEX_CODE=? "
-		pars = append(pars, edbCode)
-	}
-
-	if startDate != "" {
-		condition += " AND DATA_DATE>=? "
-		pars = append(pars, startDate)
-	}
-
-	if endDate != "" {
-		condition += " AND DATA_DATE<=? "
-		pars = append(pars, endDate)
-	}
-
-	glDataList, err := GetGlDataByTradeCode(condition, pars)
-
-	addSql := ` INSERT INTO edb_data_gl(edb_info_id,edb_code,data_time,value,create_time,modify_time,status,data_timestamp) values `
-	var isAdd bool
-	existMap := make(map[string]string)
-	for _, v := range glDataList {
-		item := v
-		if _, ok := existMap[v.DataTime]; !ok {
-			count, err := GetEdbDataGlByCodeAndDate(edbCode, v.DataTime)
-			if err != nil && err.Error() != utils.ErrNoRow() {
-				return err
-			}
-			if count <= 0 {
-				eDate := item.DataTime
-				sValue := item.InputValue
-				if sValue != "" {
-					dataTime, err := time.Parse(utils.FormatDate, eDate)
-					if err != nil {
-						return err
-					}
-					timestamp := dataTime.UnixNano() / 1e6
-					timeStr := fmt.Sprintf("%d", timestamp)
-					addSql += GetAddSql(edbInfoIdStr, edbCode, eDate, timeStr, sValue)
-					isAdd = true
-				}
-			} else {
-				err = ModifyEdbDataGl(int64(edbInfoId), v.DataTime, v.InputValue)
-				if err != nil {
-					return err
-				}
-			}
-		}
-		existMap[v.DataTime] = v.InputValue
-	}
-	if isAdd {
-		addSql = strings.TrimRight(addSql, ",")
-		_, err = to.Raw(addSql).Exec()
-		if err != nil {
-			return err
-		}
-	}
-	return
-}
-
-// 全部刷新隆众数据
-func RefreshAllEdbDataByGl(edbInfoId, source, subSource int, edbCode, startDate, endDate 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()
-		}
-	}()
-
-	if err != nil {
-		return
-	}
-	edbInfoIdStr := strconv.Itoa(edbInfoId)
-	//计算数据
-	var condition string
-	var pars []interface{}
-
-	if edbCode != "" {
-		condition += " AND INDEX_CODE=? "
-		pars = append(pars, edbCode)
-	}
-
-	if startDate != "" {
-		condition += " AND DATA_DATE>=? "
-		pars = append(pars, startDate)
-	}
-
-	if endDate != "" {
-		condition += " AND DATA_DATE<=? "
-		pars = append(pars, endDate)
-	}
-
-	glDataList, err := GetGlDataByTradeCode(condition, pars)
-
-	//获取指标所有数据
-	dataList := make([]*EdbDataBase, 0)
-	dataTableName := GetEdbDataTableName(source, subSource)
-	sql := `SELECT * FROM %s WHERE edb_info_id=? `
-	sql = fmt.Sprintf(sql, dataTableName)
-	_, err = to.Raw(sql, edbInfoId).QueryRows(&dataList)
-	if err != nil {
-		return err
-	}
-	dataMap := make(map[string]string)
-	for _, v := range dataList {
-		dataMap[v.DataTime] = v.Value
-	}
-
-	addSql := ` INSERT INTO edb_data_gl(edb_info_id,edb_code,data_time,value,create_time,modify_time,status,data_timestamp) values `
-	var isAdd bool
-	existMap := make(map[string]string)
-	for _, v := range glDataList {
-		item := v
-		if _, ok := existMap[v.DataTime]; !ok {
-			eDate := item.DataTime
-			sValue := item.InputValue
-			if sValue != "" {
-				dataTime, err := time.Parse(utils.FormatDate, eDate)
-				if err != nil {
-					return err
-				}
-				timestamp := dataTime.UnixNano() / 1e6
-				timeStr := fmt.Sprintf("%d", timestamp)
-				saveValue := sValue
-
-				if existVal, ok := dataMap[eDate]; !ok {
-					addSql += GetAddSql(edbInfoIdStr, edbCode, eDate, timeStr, saveValue)
-					isAdd = true
-				} else {
-					if existVal != saveValue {
-						sql := ` UPDATE %s SET value=?,modify_time=NOW() WHERE edb_info_id=? AND data_time=? `
-						sql = fmt.Sprintf(sql, dataTableName)
-						_, err = to.Raw(sql, sValue, edbInfoId, eDate).Exec()
-						if err != nil {
-							return err
-						}
-					}
-				}
-			}
-		}
-		existMap[v.DataTime] = v.DataTime
-	}
-	if isAdd {
-		addSql = strings.TrimRight(addSql, ",")
-		_, err = to.Raw(addSql).Exec()
-		if err != nil {
-			return err
-		}
-	}
-	return
-}

+ 161 - 5
models/data_manage/edb_data_insert_config.go

@@ -2,9 +2,12 @@ package data_manage
 
 import (
 	"errors"
+	"eta/eta_api/models/mgo"
 	"eta/eta_api/utils"
 	"fmt"
 	"github.com/beego/beego/v2/client/orm"
+	"go.mongodb.org/mongo-driver/bson"
+	"go.mongodb.org/mongo-driver/mongo"
 	"strconv"
 	"time"
 )
@@ -51,8 +54,6 @@ func CreateEdbDataInsertConfigAndData(edbInfo *EdbInfo, date time.Time, value st
 	}
 
 	dateStr := date.Format(utils.FormatDate)
-	timestamp := date.UnixNano() / 1e6
-	timeStr := fmt.Sprintf("%d", timestamp)
 
 	var saveValue string
 	if value != "" {
@@ -65,7 +66,6 @@ func CreateEdbDataInsertConfigAndData(edbInfo *EdbInfo, date time.Time, value st
 		saveValue = utils.SubFloatToString(floatValue, 30)
 	}
 
-
 	to, err := orm.NewOrmUsingDB("data").Begin()
 	if err != nil {
 		return
@@ -132,6 +132,55 @@ func CreateEdbDataInsertConfigAndData(edbInfo *EdbInfo, date time.Time, value st
 		}
 	}
 
+	// 指标明细数据更新
+	if edbInfo.Source == utils.DATA_SOURCE_BUSINESS {
+		dateStr, err = updateInsertConfigValueByMongo(to, edbInfo, oldConfigDate, date, value)
+	} else {
+		dateStr, err = updateInsertConfigValueByMysql(to, edbInfo, oldConfigDate, date, value)
+	}
+	if err != nil {
+		return
+	}
+
+	// 指标信息更新
+	edbInfo.EndDate = dateStr
+	_, err = to.Update(edbInfo, "EndDate")
+
+	return
+}
+
+// updateInsertConfigValueByMysql
+// @Description: 从mysql更新或插入配置值
+// @author: Roc
+// @datetime 2024-05-09 11:05:41
+// @param to orm.TxOrmer
+// @param edbInfo *EdbInfo
+// @param oldConfigDate
+// @param date time.Time
+// @param value string
+// @return dateStr string
+// @return err error
+func updateInsertConfigValueByMysql(to orm.TxOrmer, edbInfo *EdbInfo, oldConfigDate, date time.Time, value string) (dateStr string, err error) {
+	tableName := GetEdbDataTableName(edbInfo.Source, edbInfo.SubSource)
+	if tableName == `` {
+		err = errors.New("找不到该指标的数据表")
+		return
+	}
+
+	dateStr = date.Format(utils.FormatDate)
+	timestamp := date.UnixNano() / 1e6
+	timeStr := fmt.Sprintf("%d", timestamp)
+	var saveValue string
+	if value != "" {
+		floatValue, e := strconv.ParseFloat(value, 64)
+		if e != nil {
+			err = e
+			fmt.Println("转换失败:", e.Error())
+			return
+		}
+		saveValue = utils.SubFloatToString(floatValue, 30)
+	}
+
 	var offsetDate string
 	// 更改数据
 	{
@@ -175,8 +224,115 @@ func CreateEdbDataInsertConfigAndData(edbInfo *EdbInfo, date time.Time, value st
 		}
 	}
 
-	edbInfo.EndDate = dateStr
-	_, err = to.Update(edbInfo, "EndDate")
+	return
+}
+
+// updateInsertConfigValueByMongo
+// @Description: 从mongo更新或插入配置值
+// @author: Roc
+// @datetime 2024-05-09 11:05:49
+// @param to orm.TxOrmer
+// @param edbInfo *EdbInfo
+// @param oldConfigDate
+// @param newDate time.Time
+// @param value string
+// @return dateStr string
+// @return err error
+func updateInsertConfigValueByMongo(to orm.TxOrmer, edbInfo *EdbInfo, oldConfigDate, newDate time.Time, value string) (dateStr string, err error) {
+	tableName := GetEdbDataTableName(edbInfo.Source, edbInfo.SubSource)
+	if tableName == `` {
+		err = errors.New("找不到该指标的数据表")
+		return
+	}
+
+	dateStr = newDate.Format(utils.FormatDate)
+	timestamp := newDate.UnixNano() / 1e6
+	var floatValue float64
+	if value != "" {
+		floatValue, err = strconv.ParseFloat(value, 64)
+		if err != nil {
+			fmt.Println("转换失败:", err.Error())
+			return
+		}
+	}
+
+	mogDataObj := mgo.EdbDataBusiness{}
+	coll := mogDataObj.GetCollection()
+
+	var edbDateData *mgo.EdbDataBusiness
+	if !oldConfigDate.IsZero() {
+		// 构建查询条件
+		queryConditions := bson.M{
+			"edb_info_id": edbInfo.EdbInfoId,
+			"data_time":   oldConfigDate,
+		}
+
+		edbDateData, err = mogDataObj.GetItem(queryConditions)
+		//if tmpErr != nil && tmpErr == mongo.ErrNoDocuments {
+		//	err = tmpErr
+		//	return
+		//}
+		if err != nil && err != mongo.ErrNoDocuments {
+			return
+		}
+		err = nil
+
+	}
+
+	// 如果是没有历史数据,那么就需要增加数据
+	if edbDateData == nil {
+		addDataItem := mgo.EdbDataBusiness{
+			//ID:            primitive.ObjectID{},
+			EdbInfoId:     edbInfo.EdbInfoId,
+			EdbCode:       edbInfo.EdbCode,
+			DataTime:      newDate,
+			Value:         floatValue,
+			CreateTime:    time.Now(),
+			ModifyTime:    time.Now(),
+			DataTimestamp: timestamp,
+		}
+		err = mogDataObj.InsertDataByColl(coll, addDataItem)
+		if err != nil {
+			fmt.Println("mogDataObj.BatchInsertData() Err:" + err.Error())
+			return
+		}
+		return
+	}
+
+	// 数据清空
+	if value == "" {
+		queryConditions := bson.M{
+			"edb_info_id": edbInfo.EdbInfoId,
+		}
+
+		// 获取最新的两条数据
+		tmpDataList, tmpErr := mogDataObj.GetLimitDataList(queryConditions, 2, []string{"-data_time"})
+		if tmpErr != nil {
+			fmt.Println("mogDataObj.GetLimitDataList() Err:" + tmpErr.Error())
+			return
+		}
+		// 如果并没有两条数据,那么就返回
+		if len(tmpDataList) < 2 {
+			return
+		}
+
+		// 实际应该是倒数第二条数据的日期
+		dateStr = tmpDataList[1].DataTime.Format(utils.FormatDate)
+
+		// 删除插入的数据
+		err = mogDataObj.RemoveManyByColl(coll, bson.M{"_id": tmpDataList[0].ID})
+
+		return
+	}
+
+	// 更新配置的数据
+	updateData := bson.M{"$set": bson.M{
+		"value":          floatValue,
+		"modify_time":    time.Now(),
+		"data_time":      newDate,
+		"data_timestamp": timestamp,
+	}}
+	err = mogDataObj.UpdateDataByColl(coll, bson.M{"_id": edbDateData.ID}, updateData)
 
 	return
 }

+ 0 - 315
models/data_manage/edb_data_lz.go

@@ -1,327 +1,12 @@
 package data_manage
 
 import (
-	"eta/eta_api/utils"
-	"fmt"
 	"github.com/beego/beego/v2/client/orm"
-	"strconv"
-	"strings"
-	"time"
 )
 
-func AddEdbDataLzBySql(sqlStr string) (err error) {
-	o := orm.NewOrmUsingDB("data")
-	_, err = o.Raw(sqlStr).Exec()
-	return
-}
-
-func GetEdbDataLzByEdbCode(edbCode string) (items []*EdbInfoSearchData, err error) {
-	o := orm.NewOrmUsingDB("data")
-	sql := ` SELECT * FROM edb_data_lz WHERE edb_code=? ORDER BY data_time DESC LIMIT ? `
-	_, err = o.Raw(sql, edbCode, utils.EDB_DATA_LIMIT).QueryRows(&items)
-	return
-}
-
 func GetEdbDataLzMaxOrMinDate(edbCode string) (min_date, max_date string, err error) {
 	o := orm.NewOrmUsingDB("data")
 	sql := ` SELECT MIN(data_time) AS min_date,MAX(data_time) AS max_date FROM edb_data_lz WHERE edb_code=? `
 	err = o.Raw(sql, edbCode).QueryRow(&min_date, &max_date)
 	return
 }
-
-type lzSurveyData struct {
-	DataTime   string `orm:"column(data_time)" description:"日期"`
-	InputValue string `orm:"column(input_value)" description:"值"`
-}
-
-func GetLzSurveyDataByTradeCode(condition string, pars []interface{}) (item []*lzSurveyData, err error) {
-	sql := ` SELECT  a.* FROM longzhong_survey_data AS a
-				INNER JOIN longzhong_survey_product AS b ON a.survey_product_id=b.survey_product_id
-				WHERE 1=1 `
-	o := orm.NewOrmUsingDB("edb")
-	if condition != "" {
-		sql += condition
-	}
-	sql += ` ORDER BY a.data_time DESC `
-	_, err = o.Raw(sql, pars).QueryRows(&item)
-	return
-}
-
-func GetEdbDataLzByCode(edbCode string) (items []*EdbInfoSearchData, err error) {
-	o := orm.NewOrmUsingDB("data")
-	sql := ` SELECT * FROM edb_data_lz WHERE edb_code=? ORDER BY data_time DESC LIMIT ? `
-	_, err = o.Raw(sql, edbCode, utils.EDB_DATA_LIMIT).QueryRows(&items)
-	return
-}
-
-func GetEdbDataByLz(edbCode, startDate, endDate string) (searchItem *EdbInfoSearch, 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 condition string
-	var pars []interface{}
-
-	if edbCode != "" {
-		condition += " AND b.lz_code=? "
-		pars = append(pars, edbCode)
-	}
-
-	lzDataList, err := GetLzSurveyDataByTradeCode(condition, pars)
-	if err != nil {
-		return
-	}
-	searchItem = new(EdbInfoSearch)
-	searchItem.EdbCode = edbCode
-	dataLen := len(lzDataList)
-
-	if dataLen > 0 {
-		var isAdd bool
-		addSql := ` INSERT INTO edb_data_lz(edb_info_id,edb_code,data_time,value,create_time,modify_time,status,data_timestamp) values `
-		nowStr := time.Now().Format(utils.FormatDateTime)
-		dataList := make([]*EdbInfoSearchData, 0)
-		for i := 0; i < dataLen; i++ {
-			item := lzDataList[i]
-			eDate := item.DataTime
-			sValue := item.InputValue
-			dataTime, err := time.Parse(utils.FormatDate, eDate)
-			if err != nil {
-				return nil, err
-			}
-			timestamp := dataTime.UnixNano() / 1e6
-			timeStr := fmt.Sprintf("%d", timestamp)
-			addSql += "("
-			addSql += "0," + "'" + edbCode + "'" + "," + "'" + eDate + "'" + "," + sValue + "," + "'" + nowStr + "'" +
-				"," + "'" + nowStr + "'" + "," + "0" + "," + "'" + timeStr + "'"
-			addSql += "),"
-			isAdd = true
-		}
-		if isAdd {
-			addSql = strings.TrimRight(addSql, ",")
-			err = AddEdbDataLzBySql(addSql)
-			if err != nil {
-				utils.FileLogData.Info("AddEdbDataLzBySql Err:%s", err.Error())
-				return
-			}
-		}
-
-		dataList, err := GetEdbDataLzByCode(edbCode)
-		if err != nil {
-			utils.FileLogData.Info("GetEdbDataLzByCode Err:%s", err.Error())
-			return searchItem, err
-		}
-		minDate, maxDate, err := GetEdbDataLzMaxOrMinDate(edbCode)
-		if err != nil {
-			return searchItem, err
-		}
-		searchItem.DataList = dataList
-		searchItem.StartDate = minDate
-		searchItem.EndDate = maxDate
-	}
-	if searchItem.DataList == nil {
-		searchItem.DataList = make([]*EdbInfoSearchData, 0)
-	}
-	return
-}
-
-func ModifyEdbDataLzStatus(edbInfoId int64, edbCode string) (err error) {
-	o := orm.NewOrmUsingDB("data")
-	sql := ` UPDATE edb_data_lz SET edb_info_id=?, status=1,modify_time=NOW() WHERE edb_code=? `
-	_, err = o.Raw(sql, edbInfoId, edbCode).Exec()
-	return
-}
-
-func GetEdbDataLzByCodeAndDate(edbCode string, startDate string) (count int, err error) {
-	o := orm.NewOrmUsingDB("data")
-	sql := ` SELECT COUNT(1) AS count FROM edb_data_lz WHERE edb_code=? AND data_time=? `
-	err = o.Raw(sql, edbCode, startDate).QueryRow(&count)
-	return
-}
-
-func ModifyEdbDataLz(edbInfoId int64, dataTime, value string) (err error) {
-	o := orm.NewOrmUsingDB("data")
-	sql := ` UPDATE edb_data_lz SET value=?,modify_time=NOW() WHERE edb_info_id=? AND data_time=? `
-	_, err = o.Raw(sql, value, edbInfoId, dataTime).Exec()
-	return
-}
-
-// 刷新隆众指标数据
-func RefreshEdbDataByLz(edbInfoId int, edbCode, startDate, endDate 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()
-		}
-	}()
-
-	if err != nil {
-		return
-	}
-	edbInfoIdStr := strconv.Itoa(edbInfoId)
-	//计算数据
-	var condition string
-	var pars []interface{}
-
-	if edbCode != "" {
-		condition += " AND b.lz_code=? "
-		pars = append(pars, edbCode)
-	}
-
-	if startDate != "" {
-		condition += " AND a.data_time>=? "
-		pars = append(pars, startDate)
-	}
-
-	if endDate != "" {
-		condition += " AND a.data_time<=? "
-		pars = append(pars, endDate)
-	}
-
-	lzDataList, err := GetLzSurveyDataByTradeCode(condition, pars)
-
-	addSql := ` INSERT INTO edb_data_lz(edb_info_id,edb_code,data_time,value,create_time,modify_time,status,data_timestamp) values `
-	var isAdd bool
-	for _, v := range lzDataList {
-		item := v
-		count, err := GetEdbDataLzByCodeAndDate(edbCode, v.DataTime)
-		if err != nil && err.Error() != utils.ErrNoRow() {
-			return err
-		}
-		if count <= 0 {
-			nowStr := time.Now().Format(utils.FormatDateTime)
-			eDate := item.DataTime
-			sValue := item.InputValue
-			dataTime, err := time.Parse(utils.FormatDate, eDate)
-			if err != nil {
-				return err
-			}
-			timestamp := dataTime.UnixNano() / 1e6
-			timeStr := fmt.Sprintf("%d", timestamp)
-			addSql += "("
-			addSql += edbInfoIdStr + "," + "'" + edbCode + "'" + "," + "'" + eDate + "'" + "," + sValue + "," + "'" + nowStr + "'" +
-				"," + "'" + nowStr + "'" + "," + "1" + "," + "'" + timeStr + "'"
-			addSql += "),"
-			isAdd = true
-		} else {
-			err = ModifyEdbDataLz(int64(edbInfoId), v.DataTime, v.InputValue)
-			if err != nil {
-				return err
-			}
-		}
-	}
-	if isAdd {
-		addSql = strings.TrimRight(addSql, ",")
-		_, err = to.Raw(addSql).Exec()
-		if err != nil {
-			return err
-		}
-	}
-	return
-}
-
-// 全部刷新隆众数据
-func RefreshAllEdbDataByLz(edbInfoId, source, subSource int, edbCode, startDate, endDate 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()
-		}
-	}()
-
-	if err != nil {
-		return
-	}
-	edbInfoIdStr := strconv.Itoa(edbInfoId)
-	//计算数据
-	var condition string
-	var pars []interface{}
-
-	if edbCode != "" {
-		condition += " AND b.lz_code=? "
-		pars = append(pars, edbCode)
-	}
-
-	if startDate != "" {
-		condition += " AND a.data_time>=? "
-		pars = append(pars, startDate)
-	}
-
-	if endDate != "" {
-		condition += " AND a.data_time<=? "
-		pars = append(pars, endDate)
-	}
-
-	lzDataList, err := GetLzSurveyDataByTradeCode(condition, pars)
-
-	//获取指标所有数据
-	dataList := make([]*EdbDataBase, 0)
-	dataTableName := GetEdbDataTableName(source, subSource)
-	sql := `SELECT * FROM %s WHERE edb_info_id=? `
-	sql = fmt.Sprintf(sql, dataTableName)
-	_, err = to.Raw(sql, edbInfoId).QueryRows(&dataList)
-	if err != nil {
-		return err
-	}
-	dataMap := make(map[string]string)
-	for _, v := range dataList {
-		dataMap[v.DataTime] = v.Value
-	}
-
-	addSql := ` INSERT INTO edb_data_lz(edb_info_id,edb_code,data_time,value,create_time,modify_time,status,data_timestamp) values `
-	var isAdd bool
-	for _, v := range lzDataList {
-		item := v
-
-		eDate := item.DataTime
-		sValue := item.InputValue
-		dataTime, err := time.Parse(utils.FormatDate, eDate)
-		if err != nil {
-			return err
-		}
-		timestamp := dataTime.UnixNano() / 1e6
-		timeStr := fmt.Sprintf("%d", timestamp)
-		saveValue := sValue
-
-		if existVal, ok := dataMap[eDate]; !ok {
-			addSql += GetAddSql(edbInfoIdStr, edbCode, eDate, timeStr, saveValue)
-			isAdd = true
-		} else {
-			if existVal != saveValue {
-				sql := ` UPDATE %s SET value=?,modify_time=NOW() WHERE edb_info_id=? AND data_time=? `
-				sql = fmt.Sprintf(sql, dataTableName)
-				_, err = to.Raw(sql, sValue, edbInfoId, eDate).Exec()
-				if err != nil {
-					return err
-				}
-			}
-		}
-	}
-	if isAdd {
-		addSql = strings.TrimRight(addSql, ",")
-		_, err = to.Raw(addSql).Exec()
-		if err != nil {
-			return err
-		}
-	}
-	return
-}

+ 2 - 194
models/data_manage/edb_data_quarter.go

@@ -1,7 +1,6 @@
 package data_manage
 
 import (
-	"encoding/json"
 	"eta/eta_api/utils"
 	"fmt"
 	"github.com/beego/beego/v2/client/orm"
@@ -43,14 +42,14 @@ func AddCalculateQuarter(edbInfoId, source int, edbCode string) (err error) {
 	var pars []interface{}
 	condition += " AND edb_info_id=? "
 	pars = append(pars, edbInfoId)
-	dataList, err := GetEdbDataListAll(condition, pars, source, utils.DATA_SUB_SOURCE_EDB, 0)
+	dataList, err := GetAllEdbDataListData(edbInfoId, source, utils.DATA_SUB_SOURCE_EDB, "")
 	if err != nil {
 		return err
 	}
 
 	var yearArr []int
 	yearMap := make(map[int]int)
-	dataMap := make(map[string]*EdbInfoSearchData)
+	dataMap := make(map[string]*EdbData)
 	for _, v := range dataList {
 		//日其中获取年
 		itemDate, err := time.Parse(utils.FormatDate, v.DataTime)
@@ -203,197 +202,6 @@ func AddCalculateQuarter(edbInfoId, source int, edbCode string) (err error) {
 	return
 }
 
-// 指标季度数据计算(公历转农历)
-func AddCalculateQuarterV2(edbInfoId, source int, edbCode string) (err error) {
-	o := orm.NewOrmUsingDB("data")
-	to, err := o.Begin()
-	if err != nil {
-		return
-	}
-	defer func() {
-		if err != nil {
-			fmt.Println("Err:", err)
-			_ = to.Rollback()
-		} else {
-			_ = to.Commit()
-		}
-	}()
-
-	edbInfoIdStr := strconv.Itoa(edbInfoId)
-	fmt.Println(edbInfoIdStr)
-	//计算数据
-	var condition string
-	var pars []interface{}
-	condition += " AND edb_info_id=? "
-	pars = append(pars, edbInfoId)
-	dataList, err := GetEdbDataListAll(condition, pars, source, utils.DATA_SUB_SOURCE_EDB, 0)
-	if err != nil {
-		return err
-	}
-
-	var yearArr []int
-	yearMap := make(map[int]int)
-	dataMap := make(map[string]*EdbInfoSearchData)
-	for _, v := range dataList {
-		//日其中获取年
-		itemDate, err := time.Parse(utils.FormatDate, v.DataTime)
-		if err != nil {
-			return err
-		}
-		year := itemDate.Year()
-		if _, ok := yearMap[year]; !ok {
-			yearArr = append(yearArr, year)
-			yearMap[year] = year
-		}
-		dataMap[v.DataTime] = v
-	}
-	sort.Sort(sort.Reverse(sort.IntSlice(yearArr)))
-	addSql := ` INSERT INTO edb_data_quarter(edb_info_id,edb_code,data_time,value,create_time,modify_time,status,data_timestamp) values `
-	var isAdd bool
-	//yearLen := len(yearArr)
-
-	fmt.Println(yearArr)
-
-	for _, yv := range yearArr {
-		fmt.Println(yv)
-	}
-	fmt.Println("isAdd", isAdd)
-	if isAdd {
-		addSql = strings.TrimRight(addSql, ",")
-		utils.FileLog.Info(addSql)
-		_, err = to.Raw(addSql).Exec()
-		fmt.Println("err:", err)
-		if err != nil {
-			return err
-		}
-	}
-	return
-}
-
-// 指标季度数据计算(公历转农历)
-func AddCalculateQuarterV3(edbInfoId, source int, edbCode string, list []*EdbDataList) (err error) {
-	var errMsg string
-	defer func() {
-		if errMsg != "" {
-			fmt.Println("errMsg:", errMsg)
-		}
-	}()
-	lunarDate := "2017-01-01" //农历
-	fmt.Println(solarlunar.LunarToSolar(lunarDate, false))
-
-	dataList, err := GetHzTestEdbdata()
-	var yearArr []int
-	yearMap := make(map[int]int)
-	var cureentDate time.Time
-	for k, v := range dataList {
-		if k == 0 {
-			cureentDate = v.Dt
-		}
-		year := v.Dt.Year()
-		if _, ok := yearMap[year]; !ok {
-			yearArr = append(yearArr, year)
-		}
-		yearMap[year] = year
-	}
-	//排序
-	fmt.Println(yearArr)
-	thisYear := cureentDate.Year()
-	thisMonth := int(cureentDate.Month())
-
-	sort.Ints(yearArr)
-	fmt.Println("thisYear:", thisYear)
-
-	result := new(HzTestEdbdataResult)
-	for ky, vy := range yearArr {
-		if thisMonth < 11 {
-			currentYearCjnl := strconv.Itoa(thisYear) + "-01-01"               //当前年份春节农历
-			currentYearCjgl := solarlunar.LunarToSolar(currentYearCjnl, false) //当前年份春节公历
-			currentYearCjglDate, err := time.Parse(utils.FormatDate, currentYearCjgl)
-			if err != nil {
-				errMsg = "生成当前春节失败,Err:" + err.Error()
-				return err
-			}
-
-			fmt.Println(ky, vy)
-			preYear := vy
-			preYearCjnl := strconv.Itoa(preYear) + "-01-01"            //之前年份春节农历
-			preYearCjgl := solarlunar.LunarToSolar(preYearCjnl, false) //之前年份春节公历
-			preYearCjglDate, err := time.Parse(utils.FormatDate, preYearCjgl)
-			if err != nil {
-				errMsg = "生成历史年份春节失败,Err:" + err.Error()
-				return err
-			}
-			day := currentYearCjglDate.Sub(preYearCjglDate).Hours() / float64(24)
-			fmt.Println("day:", day)
-			items := new(HzTestEdbdataItems)
-			dataLen := len(dataList)
-			for i := dataLen - 1; i >= 0; i-- {
-				v := dataList[i]
-				newDate := v.Dt.AddDate(0, 0, int(day))
-				selectDateStr := strconv.Itoa(thisYear) + "-11" + "-30"
-				selectDate, _ := time.Parse(utils.FormatDate, selectDateStr)
-
-				if newDate.Before(selectDate) {
-					item := new(HzTestEdbdata)
-					item.TtradeCode = v.TtradeCode
-					item.Dt = newDate
-					item.Close = v.Close
-					timestamp := item.Dt.UnixNano() / 1e6
-					item.DataTimestamp = timestamp
-					items.Items = append(items.Items, item)
-				}
-			}
-			result.List = append(result.List, items)
-		} else {
-			fmt.Println(ky, vy)
-			nextYear := thisYear + 1
-			nextYearCjnl := strconv.Itoa(nextYear) + "-01-01"            //当前年份春节农历
-			nextYearCjgl := solarlunar.LunarToSolar(nextYearCjnl, false) //当前年份春节公历
-
-			nextYearCjglDate, err := time.Parse(utils.FormatDate, nextYearCjgl)
-			if err != nil {
-				errMsg = "生成当前春节失败,Err:" + err.Error()
-				return err
-			}
-
-			preYear := vy
-			preYearCjnl := strconv.Itoa(preYear) + "-01-01"            //之前年份春节农历
-			preYearCjgl := solarlunar.LunarToSolar(preYearCjnl, false) //之前年份春节公历
-			preYearCjglDate, err := time.Parse(utils.FormatDate, preYearCjgl)
-			if err != nil {
-				errMsg = "生成历史年份春节失败,Err:" + err.Error()
-				return err
-			}
-			day := nextYearCjglDate.Sub(preYearCjglDate).Hours() / float64(24)
-
-			fmt.Println("day:", day)
-			items := new(HzTestEdbdataItems)
-			dataLen := len(dataList)
-			for i := dataLen - 1; i >= 0; i-- {
-				v := dataList[i]
-				newDate := v.Dt.AddDate(0, 0, int(day))
-				selectDateStr := strconv.Itoa(nextYear) + "-05" + "-31"
-				selectDate, _ := time.Parse(utils.FormatDate, selectDateStr)
-
-				if newDate.Before(selectDate) {
-					item := new(HzTestEdbdata)
-					item.TtradeCode = v.TtradeCode
-					item.Dt = newDate
-					item.Close = v.Close
-					timestamp := item.Dt.UnixNano() / 1e6
-					item.DataTimestamp = timestamp
-					items.Items = append(items.Items, item)
-				}
-			}
-			result.List = append(result.List, items)
-		}
-
-	}
-	resultJson, err := json.Marshal(result)
-	utils.FileLog.Info(string(resultJson))
-	return
-}
-
 // 指标季度数据计算(公历转农历)
 func AddCalculateQuarterV4(dataList []*EdbDataList) (result *EdbDataResult, err error) {
 	var errMsg string

+ 0 - 87
models/data_manage/edb_data_sci.go

@@ -1,99 +1,12 @@
 package data_manage
 
 import (
-	"eta/eta_api/utils"
-	"fmt"
 	"github.com/beego/beego/v2/client/orm"
-	"strconv"
-	"strings"
-	"time"
 )
 
-type BaseFromSciDataSimple struct {
-	SciDataId          int `orm:"column(sci_data_id);pk"`
-	BaseFromSciIndexId int
-	IndexCode          string
-	DataTime           string
-	Value              string
-}
-
 func GetEdbDataSciMaxAndMinDate(edbCode string) (min_date, max_date string, err error) {
 	o := orm.NewOrmUsingDB("data")
 	sql := ` SELECT MIN(data_time) AS min_date,MAX(data_time) AS max_date FROM edb_data_sci WHERE edb_code=? `
 	err = o.Raw(sql, edbCode).QueryRow(&min_date, &max_date)
 	return
 }
-
-// 全部刷新有色数据
-func RefreshAllEdbDataBySci(edbInfoId, source, subSource int, edbCode, startDate, endDate 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()
-		}
-	}()
-
-	if err != nil {
-		return
-	}
-	edbInfoIdStr := strconv.Itoa(edbInfoId)
-
-	//获取已存在指标所有数据
-	existDataList := make([]*EdbDataBase, 0)
-	dataTableName := GetEdbDataTableName(source, subSource)
-	sql := `SELECT * FROM %s WHERE edb_info_id=? `
-	sql = fmt.Sprintf(sql, dataTableName)
-	_, err = to.Raw(sql, edbInfoId).QueryRows(&existDataList)
-	if err != nil {
-		return err
-	}
-	existDataMap := make(map[string]string)
-	for _, v := range existDataList {
-		existDataMap[v.DataTime] = v.Value
-	}
-
-	sciDateList := make([]*BaseFromSciDataSimple, 0)
-	sciSql := ` SELECT * FROM base_from_sci_data WHERE index_code=? AND data_time>=? `
-	_, err = to.Raw(sciSql, edbCode, startDate).QueryRows(&sciDateList)
-	if err != nil {
-		return err
-	}
-
-	addSql := ` INSERT INTO edb_data_sci(edb_info_id,edb_code,data_time,value,create_time,modify_time,status,data_timestamp) values `
-	var isAdd bool
-	for _, sv := range sciDateList {
-		if existVal, ok := existDataMap[sv.DataTime]; !ok {
-			dataTime, err := time.Parse(utils.FormatDate, sv.DataTime)
-			if err != nil {
-				return err
-			}
-			timestamp := dataTime.UnixNano() / 1e6
-			timeStr := fmt.Sprintf("%d", timestamp)
-			addSql += GetAddSql(edbInfoIdStr, edbCode, sv.DataTime, timeStr, sv.Value)
-			isAdd = true
-		} else {
-			if existVal != sv.Value {
-				sql := ` UPDATE %s SET value=?,modify_time=NOW() WHERE edb_info_id=? AND data_time=? `
-				sql = fmt.Sprintf(sql, dataTableName)
-				_, err = to.Raw(sql, sv.Value, edbInfoId, sv.DataTime).Exec()
-				if err != nil {
-					return err
-				}
-			}
-		}
-	}
-	if isAdd {
-		addSql = strings.TrimRight(addSql, ",")
-		_, err = to.Raw(addSql).Exec()
-		if err != nil {
-			return err
-		}
-	}
-	return
-}

+ 0 - 63
models/data_manage/edb_data_ths_ds.go

@@ -1,63 +0,0 @@
-package data_manage
-
-import (
-	"fmt"
-	"github.com/beego/beego/v2/client/orm"
-)
-
-func ModifyEdbInfoThsDsDataStatus(edbInfoId int64, edbCode string) (err error) {
-	o := orm.NewOrmUsingDB("data")
-	tableName := `edb_data_ths_ds`
-	sql := ` UPDATE %s SET edb_info_id=?,modify_time=NOW() WHERE edb_code=? `
-	sql = fmt.Sprintf(sql, tableName)
-	_, err = o.Raw(sql, edbInfoId, edbCode).Exec()
-	return
-}
-
-// GetEdbDataList 获取指标的数据(日期正序返回)
-func GetEdbDataThsDsList(endInfoId int, startDate, endDate string) (list []*EdbDataList, err error) {
-	tableName := `edb_data_ths_ds`
-	var pars []interface{}
-	sql := `SELECT edb_data_id,edb_info_id,data_time,value,data_timestamp FROM %s WHERE edb_info_id=? `
-	if startDate != "" {
-		sql += ` AND data_time>=? `
-		pars = append(pars, startDate)
-	}
-	if endDate != "" {
-		sql += ` AND data_time<=? `
-		pars = append(pars, endDate)
-	}
-
-	sql += ` ORDER BY data_time ASC `
-	sql = fmt.Sprintf(sql, tableName)
-	o := orm.NewOrmUsingDB("data")
-	_, err = o.Raw(sql, endInfoId, pars).QueryRows(&list)
-	return
-}
-
-func GetTHsDsDataCountByCondition(condition string, pars []interface{}, source int) (count int, err error) {
-	o := orm.NewOrmUsingDB("data")
-	tableName := `edb_data_ths_ds`
-	sql := ` SELECT COUNT(1) AS count FROM %s WHERE 1=1 `
-	sql = fmt.Sprintf(sql, tableName)
-	if condition != "" {
-		sql += condition
-	}
-	err = o.Raw(sql, pars).QueryRow(&count)
-	return
-}
-
-func GetThsDsDataListByCondition(condition string, pars []interface{}, source, pageSize, startSize int) (item []*EdbData, err error) {
-	o := orm.NewOrmUsingDB("data")
-	tableName := `edb_data_ths_ds`
-	sql := ` SELECT * FROM %s WHERE 1=1 `
-	sql = fmt.Sprintf(sql, tableName)
-
-	if condition != "" {
-		sql += condition
-	}
-	sql += ` ORDER BY data_time DESC `
-	sql += ` LIMIT ?,? `
-	_, err = o.Raw(sql, pars, startSize, pageSize).QueryRows(&item)
-	return
-}

+ 0 - 48
models/data_manage/edb_data_wind_wsd.go

@@ -13,51 +13,3 @@ func ModifyEdbInfoWindWsdDataStatus(source, subSource int, edbInfoId int64, edbC
 	_, err = o.Raw(sql, edbInfoId, edbCode).Exec()
 	return
 }
-
-// GetEdbDataList 获取指标的数据(日期正序返回)
-func GetEdbDataWsdList(endInfoId int, startDate, endDate string) (list []*EdbDataList, err error) {
-	tableName := `edb_data_wind_wsd`
-	var pars []interface{}
-	sql := `SELECT edb_data_id,edb_info_id,data_time,value,data_timestamp FROM %s WHERE edb_info_id=? `
-	if startDate != "" {
-		sql += ` AND data_time>=? `
-		pars = append(pars, startDate)
-	}
-	if endDate != "" {
-		sql += ` AND data_time<=? `
-		pars = append(pars, endDate)
-	}
-
-	sql += ` ORDER BY data_time ASC `
-	sql = fmt.Sprintf(sql, tableName)
-	o := orm.NewOrmUsingDB("data")
-	_, err = o.Raw(sql, endInfoId, pars).QueryRows(&list)
-	return
-}
-
-func GetEdbWsdDataCountByCondition(condition string, pars []interface{}, source int) (count int, err error) {
-	o := orm.NewOrmUsingDB("data")
-	tableName := `edb_data_wind_wsd`
-	sql := ` SELECT COUNT(1) AS count FROM %s WHERE 1=1 `
-	sql = fmt.Sprintf(sql, tableName)
-	if condition != "" {
-		sql += condition
-	}
-	err = o.Raw(sql, pars).QueryRow(&count)
-	return
-}
-
-func GetEdbWsdDataListByCondition(condition string, pars []interface{}, source, pageSize, startSize int) (item []*EdbData, err error) {
-	o := orm.NewOrmUsingDB("data")
-	tableName := `edb_data_wind_wsd`
-	sql := ` SELECT * FROM %s WHERE 1=1 `
-	sql = fmt.Sprintf(sql, tableName)
-
-	if condition != "" {
-		sql += condition
-	}
-	sql += ` ORDER BY data_time DESC `
-	sql += ` LIMIT ?,? `
-	_, err = o.Raw(sql, pars, startSize, pageSize).QueryRows(&item)
-	return
-}

+ 226 - 516
models/data_manage/edb_info.go

@@ -1,12 +1,13 @@
 package data_manage
 
 import (
+	"eta/eta_api/models/mgo"
 	"eta/eta_api/services/alarm_msg"
 	"eta/eta_api/utils"
 	"fmt"
 	"github.com/beego/beego/v2/client/orm"
 	"github.com/rdlucklib/rdluck_tools/paging"
-	"strconv"
+	"go.mongodb.org/mongo-driver/bson"
 	"strings"
 	"time"
 )
@@ -224,26 +225,16 @@ func DeleteEdbInfoAndData(edbInfoId, source, subSource int) (err error) {
 		return
 	}
 
-	var tableName string
-	if subSource == 0 {
-		// 删除指标数据
-		tableName = GetEdbDataTableName(source, subSource)
+	// 删除指标的明细数据
+	if source == utils.DATA_SOURCE_BUSINESS {
+		err = deleteAllEdbDataByMongo(to, edbInfoId, source, subSource)
 	} else {
-		if source == utils.DATA_SOURCE_WIND {
-			tableName = "edb_data_wind_wsd"
-		} else if source == utils.DATA_SOURCE_THS {
-			tableName = "edb_data_ths_ds"
-		}
+		err = deleteAllEdbDataByMysql(to, edbInfoId, source, subSource)
 	}
-
-	if tableName != "" {
-		sql = ` DELETE FROM %s WHERE edb_info_id=? `
-		sql = fmt.Sprintf(sql, tableName)
-		_, err = to.Raw(sql, edbInfoId).Exec()
-		if err != nil {
-			return
-		}
+	if err != nil {
+		return
 	}
+
 	//calculateTableName := GetEdbInfoCalculateTableName(source)
 	//if calculateTableName != "" {
 	//	sql = ` DELETE FROM %s WHERE edb_info_id=? `
@@ -263,6 +254,42 @@ func DeleteEdbInfoAndData(edbInfoId, source, subSource int) (err error) {
 	return
 }
 
+// deleteAllEdbDataByMysql
+// @Description: 删除指标的明细数据(mysql)
+// @author: Roc
+// @datetime 2024-05-09 13:31:54
+// @param to orm.TxOrmer
+// @param edbInfoId int
+// @param source int
+// @param subSource int
+// @return err error
+func deleteAllEdbDataByMysql(to orm.TxOrmer, edbInfoId, source, subSource int) (err error) {
+	tableName := GetEdbDataTableName(source, subSource)
+	if tableName == `` {
+		return
+	}
+
+	sql := fmt.Sprintf(` DELETE FROM %s WHERE edb_info_id=? `, tableName)
+	_, err = to.Raw(sql, edbInfoId).Exec()
+
+	return
+}
+
+// deleteAllEdbDataByMongo
+// @Description: 删除指标的明细数据(mongo)
+// @author: Roc
+// @datetime 2024-05-09 13:31:37
+// @param to orm.TxOrmer
+// @param edbInfoId int
+// @param source int
+// @param subSource int
+// @return err error
+func deleteAllEdbDataByMongo(to orm.TxOrmer, edbInfoId, source, subSource int) (err error) {
+	mogDataObj := mgo.EdbDataBusiness{}
+	err = mogDataObj.RemoveMany(bson.M{"edb_info_id": edbInfoId})
+	return
+}
+
 func GetEdbInfoCountByCondition(condition string, pars []interface{}) (count int, err error) {
 	o := orm.NewOrmUsingDB("data")
 	sql := ` SELECT COUNT(1) AS count FROM edb_info WHERE 1=1 `
@@ -537,7 +564,35 @@ type EdbInfoMaxAndMinInfo struct {
 	LatestValue float64 `description:"最新值"`
 }
 
+// GetEdbInfoMaxAndMinInfo
+// @Description: 获取指标最大最小值
+// @author: Roc
+// @datetime 2024-05-07 15:34:00
+// @param source int
+// @param subSource int
+// @param edbCode string
+// @return item *EdbInfoMaxAndMinInfo
+// @return err error
 func GetEdbInfoMaxAndMinInfo(source, subSource int, edbCode string) (item *EdbInfoMaxAndMinInfo, err error) {
+	// 自有数据需要额外处理(从mongo获取)
+	if source == utils.DATA_SOURCE_BUSINESS {
+		return GetEdbInfoMaxAndMinInfoByMongo(source, subSource, edbCode)
+	}
+
+	// 默认走mysql
+	return GetEdbInfoMaxAndMinInfoByMysql(source, subSource, edbCode)
+}
+
+// GetEdbInfoMaxAndMinInfoByMysql
+// @Description: 从mysql中获取指标最大最小值
+// @author: Roc
+// @datetime 2024-05-07 15:33:43
+// @param source int
+// @param subSource int
+// @param edbCode string
+// @return item *EdbInfoMaxAndMinInfo
+// @return err error
+func GetEdbInfoMaxAndMinInfoByMysql(source, subSource int, edbCode string) (item *EdbInfoMaxAndMinInfo, err error) {
 	o := orm.NewOrmUsingDB("data")
 	sql := ``
 	tableName := GetEdbDataTableName(source, subSource)
@@ -556,88 +611,72 @@ func GetEdbInfoMaxAndMinInfo(source, subSource int, edbCode string) (item *EdbIn
 	return
 }
 
-func ModifyEdbInfoMaxAndMinInfo(edbInfoId int, item *EdbInfoMaxAndMinInfo) (err error) {
-	o := orm.NewOrmUsingDB("data")
-	sql := ` UPDATE edb_info SET start_date=?,end_date=?,min_value=?,max_value=?,is_update=2,latest_date=?,latest_value=?,modify_time=NOW() WHERE edb_info_id=? `
-	_, err = o.Raw(sql, item.MinDate, item.MaxDate, item.MinValue, item.MaxValue, item.MaxDate, item.LatestValue, edbInfoId).Exec()
-	return
-}
-
-func GetEdbInfoFilter(condition string, pars []interface{}) (list []*EdbInfoList, err error) {
-	o := orm.NewOrmUsingDB("data")
-	sql := ` SELECT * FROM edb_info WHERE 1=1  AND edb_info_type = 0 `
-	if condition != "" {
-		sql += condition
+// GetEdbInfoMaxAndMinInfoByMongo
+// @Description: 从mongo中获取指标最大最小值
+// @author: Roc
+// @datetime 2024-05-07 15:33:53
+// @param source int
+// @param subSource int
+// @param edbCode string
+// @return item *EdbInfoMaxAndMinInfo
+// @return err error
+func GetEdbInfoMaxAndMinInfoByMongo(source, subSource int, edbCode string) (item *EdbInfoMaxAndMinInfo, err error) {
+	mogDataObj := new(mgo.EdbDataBusiness)
+	pipeline := []bson.M{
+		{"$match": bson.M{"edb_code": edbCode}},
+		{"$group": bson.M{
+			"_id":       nil,
+			"min_date":  bson.M{"$min": "$data_time"},
+			"max_date":  bson.M{"$max": "$data_time"},
+			"min_value": bson.M{"$min": "$value"},
+			"max_value": bson.M{"$max": "$value"},
+		}},
+		{"$project": bson.M{"_id": 0}}, // 可选,如果不需要_id字段
+	}
+	result, err := mogDataObj.GetEdbInfoMaxAndMinInfo(pipeline)
+	if err != nil {
+		fmt.Println("EdbDataBusiness getEdbDataBusinessList Err:" + err.Error())
+		return
 	}
-	sql += ` ORDER BY create_time DESC `
-	_, err = o.Raw(sql, pars).QueryRows(&list)
-	return
-}
-
-//order:1升序,其余值为降序
-func GetEdbDataListAll(condition string, pars []interface{}, source, subSource, order int) (item []*EdbInfoSearchData, err error) {
-	o := orm.NewOrmUsingDB("data")
-	sql := ``
-	tableName := GetEdbDataTableName(source, subSource)
-	sql = ` SELECT * FROM %s WHERE 1=1 `
-	sql = fmt.Sprintf(sql, tableName)
 
-	if condition != "" {
-		sql += condition
+	if !result.MaxDate.IsZero() {
+		whereQuery := bson.M{"edb_code": edbCode, "data_time": result.MaxDate}
+		selectParam := bson.D{{"value", 1}, {"_id", 0}}
+		latestValue, tmpErr := mogDataObj.GetLatestValue(whereQuery, selectParam)
+		if tmpErr != nil {
+			err = tmpErr
+			return
+		}
+		result.LatestValue = latestValue.Value
+		result.EndValue = latestValue.Value
 	}
-	if order == 1 {
-		sql += ` ORDER BY data_time ASC `
-	} else {
-		sql += ` ORDER BY data_time DESC `
+
+	item = &EdbInfoMaxAndMinInfo{
+		MinDate:     result.MinDate.Format(utils.FormatDate),
+		MaxDate:     result.MaxDate.Format(utils.FormatDate),
+		MinValue:    result.MinValue,
+		MaxValue:    result.MaxValue,
+		LatestValue: result.LatestValue,
 	}
-	_, err = o.Raw(sql, pars).QueryRows(&item)
+
 	return
 }
 
-// GetLastEdbData 获取最近的一条指标数据
-func GetLastEdbData(condition string, pars []interface{}, source, subSource int) (item *EdbInfoSearchData, err error) {
+func ModifyEdbInfoMaxAndMinInfo(edbInfoId int, item *EdbInfoMaxAndMinInfo) (err error) {
 	o := orm.NewOrmUsingDB("data")
-	sql := ``
-	tableName := GetEdbDataTableName(source, subSource)
-	sql = ` SELECT * FROM %s WHERE 1=1 `
-	sql = fmt.Sprintf(sql, tableName)
-
-	if condition != "" {
-		sql += condition
-	}
-	sql += ` ORDER BY data_time DESC `
-	err = o.Raw(sql, pars).QueryRow(&item)
+	sql := ` UPDATE edb_info SET start_date=?,end_date=?,min_value=?,max_value=?,is_update=2,latest_date=?,latest_value=?,modify_time=NOW() WHERE edb_info_id=? `
+	_, err = o.Raw(sql, item.MinDate, item.MaxDate, item.MinValue, item.MaxValue, item.MaxDate, item.LatestValue, edbInfoId).Exec()
 	return
 }
 
-//order:1升序,其余值为降序
-func GetEdbDataCount(condition string, pars []interface{}, source, subSource int) (count int, err error) {
+func GetEdbInfoFilter(condition string, pars []interface{}) (list []*EdbInfoList, err error) {
 	o := orm.NewOrmUsingDB("data")
-	sql := ``
-	tableName := GetEdbDataTableName(source, subSource)
-	sql = ` SELECT COUNT(1) AS count FROM %s WHERE 1=1 `
-	sql = fmt.Sprintf(sql, tableName)
-
+	sql := ` SELECT * FROM edb_info WHERE 1=1  AND edb_info_type = 0 `
 	if condition != "" {
 		sql += condition
 	}
-	err = o.Raw(sql, pars).QueryRow(&count)
-	return
-}
-
-func ModifyCalculateEdbInfo(item *EditEdbInfoReq) (err error) {
-	o := orm.NewOrmUsingDB("data")
-	sql := ` UPDATE  edb_info
-			SET
-			  edb_name =?,
-			  edb_name_source =?,
-			  frequency = ?,
-			  unit = ?,
-			  classify_id = ?,
-			  calculate_formula=?,
-			  modify_time = NOW()
-			WHERE edb_info_id = ?`
-	_, err = o.Raw(sql, item.EdbName, item.EdbName, item.Frequency, item.Unit, item.ClassifyId, item.CalculateFormula, item.EdbInfoId).Exec()
+	sql += ` ORDER BY create_time DESC `
+	_, err = o.Raw(sql, pars).QueryRows(&list)
 	return
 }
 
@@ -648,69 +687,6 @@ type AddEdbInfoResp struct {
 	ExistEdbName []string `description:"重复指标名称"`
 }
 
-// 根据基础指标获取所有关联指标
-func GetNeedRefreshCalculateEdbInfoFromBase(fromEdbInfo int) (list []*EdbInfo, err error) {
-	o := orm.NewOrmUsingDB("data")
-	sql := ` SELECT b.*
-			FROM edb_info_calculate AS a
-			INNER JOIN edb_info AS b ON a.edb_info_id=b.edb_info_id
-			WHERE from_edb_info_id=? `
-	_, err = o.Raw(sql, fromEdbInfo).QueryRows(&list)
-	return
-}
-
-func GetEdbInfoCalculateCount(edbInfoId int) (count int, err error) {
-	o := orm.NewOrmUsingDB("data")
-	sql := ` SELECT COUNT(1) AS count FROM edb_info_calculate WHERE from_edb_info_id=? `
-	err = o.Raw(sql, edbInfoId).QueryRow(&count)
-	return
-}
-
-func GetEdbInfoCalculateLjzzyCount(edbInfoId int) (count int, err error) {
-	o := orm.NewOrmUsingDB("data")
-	sql := ` SELECT COUNT(1) AS count FROM edb_info_calculate_ljzzy WHERE from_edb_info_id=? `
-	err = o.Raw(sql, edbInfoId).QueryRow(&count)
-	return
-}
-
-func GetEdbInfoCalculateTbzCount(edbInfoId int) (count int, err error) {
-	o := orm.NewOrmUsingDB("data")
-	sql := ` SELECT COUNT(1) AS count FROM edb_info_calculate_tbz WHERE from_edb_info_id=? `
-	err = o.Raw(sql, edbInfoId).QueryRow(&count)
-	return
-}
-
-func GetEdbInfoCalculateTczCount(edbInfoId int) (count int, err error) {
-	o := orm.NewOrmUsingDB("data")
-	sql := ` SELECT COUNT(1) AS count FROM edb_info_calculate_tcz WHERE from_edb_info_id=? `
-	err = o.Raw(sql, edbInfoId).QueryRow(&count)
-	return
-}
-
-func GetEdbInfoCalculateNszydpjjsCount(edbInfoId int) (count int, err error) {
-	o := orm.NewOrmUsingDB("data")
-	sql := ` SELECT COUNT(1) AS count FROM edb_info_calculate_nszydpjjs WHERE from_edb_info_id=? `
-	err = o.Raw(sql, edbInfoId).QueryRow(&count)
-	return
-}
-
-func GetEdbInfoCalculateCountByCondition(source int, condition string, pars []interface{}) (count int, err error) {
-	o := orm.NewOrmUsingDB("data")
-	//calculateTableName := GetEdbInfoCalculateTableName(source)
-	//if calculateTableName == "" {
-	//	err = errors.New("无效的表名")
-	//	return
-	//}
-
-	sql := ` SELECT COUNT(1) AS count FROM edb_info_calculate_mapping WHERE 1=1 `
-	//sql = fmt.Sprintf(sql, calculateTableName)
-	if condition != "" {
-		sql += condition
-	}
-	err = o.Raw(sql, pars).QueryRow(&count)
-	return
-}
-
 // GetEdbInfoCalculateListByCondition 获取指标关系列表
 func GetEdbInfoCalculateListByCondition(condition string, pars []interface{}) (items []*EdbInfoCalculateMapping, err error) {
 	o := orm.NewOrmUsingDB("data")
@@ -729,36 +705,6 @@ func GetEdbInfoCalculateListByCondition(condition string, pars []interface{}) (i
 	return
 }
 
-func GetRefreshEdbInfoFromCalculate(edbInfoId, source int) (baseEdbInfoArr, calculateInfoArr []*EdbInfo, err error) {
-	calculateList, err := GetEdbInfoCalculateMap(edbInfoId, source)
-	if err != nil && err.Error() != utils.ErrNoRow() {
-		return
-	}
-	for _, item := range calculateList {
-		if item.EdbType == 1 {
-			baseEdbInfoArr = append(baseEdbInfoArr, item)
-		} else {
-			calculateInfoArr = append(calculateInfoArr, item)
-			newBaseEdbInfoArr, newCalculateInfoArr, _ := GetRefreshEdbInfoFromCalculate(item.EdbInfoId, item.Source)
-			baseEdbInfoArr = append(baseEdbInfoArr, newBaseEdbInfoArr...)
-			calculateInfoArr = append(calculateInfoArr, newCalculateInfoArr...)
-		}
-	}
-	return
-}
-
-// 获取基础指标对应的所有计算指标
-func GetEdbInfoAllCalculate(edbInfoId int) (list []*EdbInfo, err error) {
-	o := orm.NewOrmUsingDB("data")
-	sql := ` SELECT b.* FROM edb_info_calculate_mapping AS a
-			 INNER JOIN edb_info AS b ON a.edb_info_id=b.edb_info_id
-             WHERE a.from_edb_info_id=?
-			 GROUP BY a.edb_info_id
-			 ORDER BY a.edb_info_id ASC `
-	_, err = o.Raw(sql, edbInfoId).QueryRows(&list)
-	return
-}
-
 // GetEdbInfoAllCalculateByEdbInfoIdList 根据指标id集合 获取基础指标对应的所有计算指标
 func GetEdbInfoAllCalculateByEdbInfoIdList(edbInfoIdList []int) (list []*EdbInfo, err error) {
 	num := len(edbInfoIdList)
@@ -1010,341 +956,6 @@ func ReplaceChartEdb(oldEdbInfo, newEdbInfo *EdbInfo) (relationEdbInfoIdList []i
 	return
 }
 
-// replaceRelationEdbInfo 替换关联指标
-func replaceRelationEdbInfo(mappingList []*EdbInfoCalculateMapping, oldEdbInfo, newEdbInfo *EdbInfo, sysAdminId int, sysAdminRealName string) (err error) {
-	errmsg := ``
-	defer func() {
-		if errmsg != "" {
-			fmt.Println("errmsg:" + errmsg)
-		}
-		if err != nil && errmsg != "" {
-			go alarm_msg.SendAlarmMsg("替换关联指标失败提醒,errmsg:"+errmsg, 3)
-			//go utils.SendEmail(utils.APPNAME+"【"+utils.RunMode+"】"+"替换指标失败提醒", "errmsg:"+errmsg, utils.EmailSendToUsers)
-		}
-	}()
-	//获取计算指标关联指标
-	allMappingList := make([]*EdbInfoCalculateMapping, 0)
-	allMapping := make(map[int]int)
-	tmpMapping := make(map[int]int)
-	for _, v := range mappingList {
-		if _, ok := allMapping[v.EdbInfoId]; !ok {
-			allMappingList = append(allMappingList, v)
-		}
-		newList, _ := GetAllCalculateV2(v.EdbInfoId, newEdbInfo.EdbInfoId, tmpMapping)
-		for _, nv := range newList {
-			if _, ok := allMapping[v.EdbInfoId]; !ok {
-				allMappingList = append(allMappingList, nv)
-			}
-			allMapping[v.EdbInfoId] = v.EdbInfoId
-		}
-		allMapping[v.EdbInfoId] = v.EdbInfoId
-	}
-	for mk, mv := range allMappingList { //原指标关联的所有计算指标
-		fmt.Println("mk/mv", mk, mv)
-		//重新计算计算指标
-		{
-			edbInfo, tmpErr := GetEdbInfoById(mv.EdbInfoId) //计算指标
-			err = tmpErr
-			if err != nil {
-				if err.Error() == utils.ErrNoRow() {
-					errmsg = "计算指标已被删除"
-				} else {
-					errmsg = "获取计算指标失败:err:" + err.Error()
-				}
-				return
-			}
-
-			fromEdbInfoList, tmpErr := GetEdbInfoCalculateDetail(mv.EdbInfoId, edbInfo.Source)
-			err = tmpErr
-			if err != nil {
-				errmsg = "获取计算指标失败:err:" + err.Error()
-				return
-			}
-			if len(fromEdbInfoList) <= 0 {
-				errmsg = "计算指标所依赖指标不存在"
-				err = fmt.Errorf("计算指标所依赖指标不存在")
-				return
-			}
-			fromEdbInfoItem := fromEdbInfoList[0]
-			if fromEdbInfoItem == nil {
-				return
-			}
-			fromEdbInfo, tmpErr := GetEdbInfoById(fromEdbInfoItem.FromEdbInfoId)
-			err = tmpErr
-			if err != nil {
-				errmsg = "获取计算指标 来源指标失败:err:" + err.Error()
-				return
-			}
-			edbCode := edbInfo.EdbCode
-			uniqueCode := edbInfo.UniqueCode
-			sourName := edbInfo.SourceName
-			source := edbInfo.Source
-			subSource := edbInfo.SubSource
-			edbInfoId := edbInfo.EdbInfoId
-
-			req := new(EdbInfoCalculateBatchSaveReq)
-			req.EdbInfoId = edbInfoId
-			req.EdbName = edbInfo.EdbName
-			req.Frequency = edbInfo.Frequency
-			req.Unit = edbInfo.Unit
-			req.ClassifyId = edbInfo.ClassifyId
-			req.FromEdbInfoId = fromEdbInfoList[0].FromEdbInfoId
-
-			if source == utils.DATA_SOURCE_CALCULATE {
-				//检验公式
-				var formulaStr string
-				var edbInfoIdBytes []string
-				for _, v := range fromEdbInfoList {
-					formulaStr += v.FromTag + ","
-					edbInfoIdBytes = append(edbInfoIdBytes, v.FromTag)
-				}
-				formulaStr = strings.Trim(formulaStr, ",")
-				formulaMap := CheckFormula(edbInfo.CalculateFormula)
-				for _, v := range formulaMap {
-					if !strings.Contains(formulaStr, v) {
-						errmsg = "公式错误,请重新填写"
-						err = fmt.Errorf("公式错误,请重新填写")
-						return
-					}
-				}
-
-				edbInfoList := make([]*EdbInfo, 0)
-
-				for _, v := range fromEdbInfoList {
-					edbInfo, tmpErr := GetEdbInfoById(v.FromEdbInfoId)
-					err = tmpErr
-					if err != nil {
-						if err.Error() == utils.ErrNoRow() {
-							errmsg = "指标 " + strconv.Itoa(v.FromEdbInfoId) + " 不存在"
-						} else {
-							errmsg = "获取指标失败:Err:" + err.Error()
-						}
-						return
-					}
-					edbInfoList = append(edbInfoList, edbInfo)
-				}
-				//清除历史数据
-				err = DeleteCalculateData(edbInfoId)
-				if err != nil {
-					errmsg = "清空运算指标失败:Err:" + err.Error() + " edb_info_id:" + strconv.Itoa(edbInfoId)
-					return
-				}
-				err = Calculate(edbInfoList, int(edbInfoId), edbCode, edbInfo.CalculateFormula, edbInfoIdBytes)
-				if err != nil {
-					errmsg = "生成计算指标失败,Calculate Err:" + err.Error()
-					return
-				}
-			} else if source == utils.DATA_SOURCE_CALCULATE_LJZZY {
-				_, err = AddCalculateLjzzy(req, fromEdbInfo, edbCode, uniqueCode, sysAdminId, sysAdminRealName)
-			} else if source == utils.DATA_SOURCE_CALCULATE_TBZ {
-				sourName = "同比值"
-				edbInfoId, err = AddCalculateTbz(req, fromEdbInfo, edbCode, uniqueCode, sysAdminId, sysAdminRealName)
-			} else if source == utils.DATA_SOURCE_CALCULATE_TCZ {
-				sourName = "同差值"
-				edbInfoId, err = AddCalculateTcz(req, fromEdbInfo, edbCode, uniqueCode, sysAdminId, sysAdminRealName)
-			} else if source == utils.DATA_SOURCE_CALCULATE_NSZYDPJJS {
-				sourName = "N数值移动平均计算"
-				formulaInt, _ := strconv.Atoi(edbInfo.CalculateFormula)
-				edbInfoId, err = AddCalculateNszydpjjs(req, fromEdbInfo, edbCode, uniqueCode, sysAdminId, sysAdminRealName, formulaInt)
-			} else if source == utils.DATA_SOURCE_CALCULATE_HBZ {
-				sourName = "环比值"
-				formulaInt, _ := strconv.Atoi(edbInfo.CalculateFormula)
-				edbInfoId, err = AddCalculateHbz(req, fromEdbInfo, edbCode, uniqueCode, sysAdminId, sysAdminRealName, formulaInt)
-			} else if source == utils.DATA_SOURCE_CALCULATE_HCZ {
-				sourName = "环差值"
-				formulaInt, _ := strconv.Atoi(edbInfo.CalculateFormula)
-				edbInfoId, err = AddCalculateHcz(req, fromEdbInfo, edbCode, uniqueCode, sysAdminId, sysAdminRealName, formulaInt)
-			} else if source == utils.DATA_SOURCE_CALCULATE_BP {
-				sourName = "变频"
-				fmt.Println("变频", req, fromEdbInfo, edbCode, uniqueCode, sysAdminId, sysAdminRealName)
-				edbInfoId, err = AddCalculateBp(req, fromEdbInfo, edbCode, uniqueCode, sysAdminId, sysAdminRealName)
-			} else if source == utils.DATA_SOURCE_CALCULATE_TIME_SHIFT {
-				req2 := &EdbInfoCalculateBatchEditReq{
-					EdbName:       edbInfo.EdbName,
-					Frequency:     edbInfo.Frequency,
-					Unit:          edbInfo.Unit,
-					ClassifyId:    edbInfo.ClassifyId,
-					Formula:       edbInfo.CalculateFormula,
-					EdbInfoId:     edbInfo.EdbInfoId,
-					FromEdbInfoId: fromEdbInfoList[0].FromEdbInfoId,
-					Source:        edbInfo.Source,
-					MoveType:      edbInfo.MoveType,
-					MoveFrequency: edbInfo.MoveFrequency,
-				}
-				sourName = "时间移位"
-				edbInfoId, err = EditCalculateTimeShift(req2, fromEdbInfo, edbCode, edbInfo)
-			} else if source == utils.DATA_SOURCE_CALCULATE_ZJPJ {
-				edbInfoIdArr := make([]EdbInfoFromTag, 0)
-				//A指标
-				aFromEdbInfoId := fromEdbInfoList[0].FromEdbInfoId
-				for _, v := range fromEdbInfoList {
-					if v.FromTag == "A" {
-						if v.FromEdbInfoId == oldEdbInfo.EdbInfoId {
-							aFromEdbInfoId = newEdbInfo.EdbInfoId
-						} else {
-							aFromEdbInfoId = fromEdbInfoList[0].FromEdbInfoId
-						}
-					}
-					if v.FromTag == "B" {
-						if v.FromEdbInfoId == oldEdbInfo.EdbInfoId {
-							edbInfoIdArr = append(edbInfoIdArr, EdbInfoFromTag{
-								EdbInfoId: newEdbInfo.EdbInfoId,
-								FromTag:   v.FromTag,
-								MoveValue: v.MoveValue,
-							})
-						} else {
-							edbInfoIdArr = append(edbInfoIdArr, EdbInfoFromTag{
-								EdbInfoId: v.FromEdbInfoId,
-								FromTag:   v.FromTag,
-								MoveValue: v.MoveValue,
-							})
-						}
-					}
-				}
-				req2 := &EdbInfoCalculateBatchEditReq{
-					EdbName:       edbInfo.EdbName,
-					Frequency:     edbInfo.Frequency,
-					Unit:          edbInfo.Unit,
-					ClassifyId:    edbInfo.ClassifyId,
-					Formula:       edbInfo.CalculateFormula,
-					EdbInfoId:     edbInfo.EdbInfoId,
-					FromEdbInfoId: aFromEdbInfoId,
-					Source:        edbInfo.Source,
-					MoveType:      edbInfo.MoveType,
-					MoveFrequency: edbInfo.MoveFrequency,
-					EdbInfoIdArr:  edbInfoIdArr,
-				}
-
-				sourName = "直接拼接"
-				if len(req2.EdbInfoIdArr) != 1 {
-					errmsg = "请传入拼接日期之后的指标"
-					err = fmt.Errorf("请传入拼接日期之后的指标")
-					return
-				}
-
-				secondEdbInfoReq := req2.EdbInfoIdArr[0]
-				secondEdbInfo, tmpErr := GetEdbInfoById(secondEdbInfoReq.EdbInfoId)
-				err = tmpErr
-				if err != nil {
-					errmsg = "获取拼接日期之后的指标信息失败:Err:" + err.Error()
-					err = fmt.Errorf("获取拼接日期之后的指标信息失败:Err:" + err.Error())
-					return
-				}
-
-				if fromEdbInfo.EdbInfoId == secondEdbInfo.EdbInfoId {
-					errmsg = "两个指标不允许为同一个"
-					err = fmt.Errorf("两个指标不允许为同一个")
-					return
-				}
-				tmpEdbInfoId, tmpErr := EditCalculateZjpj(req2, edbInfo, fromEdbInfo, secondEdbInfo)
-				err = tmpErr
-				edbInfoId = tmpEdbInfoId
-			} else if source == utils.DATA_SOURCE_CALCULATE_LJZTBPJ { //累计值同比拼接
-				edbInfoIdArr := make([]EdbInfoFromTag, 0)
-				//A指标
-				aFromEdbInfoId := fromEdbInfoList[0].FromEdbInfoId
-				for _, v := range fromEdbInfoList {
-					if v.FromTag == "A" {
-						if v.FromEdbInfoId == oldEdbInfo.EdbInfoId {
-							aFromEdbInfoId = newEdbInfo.EdbInfoId
-						} else {
-							aFromEdbInfoId = fromEdbInfoList[0].FromEdbInfoId
-						}
-					}
-					if v.FromTag == "B" {
-						if v.FromEdbInfoId == oldEdbInfo.EdbInfoId {
-							edbInfoIdArr = append(edbInfoIdArr, EdbInfoFromTag{
-								EdbInfoId: newEdbInfo.EdbInfoId,
-								FromTag:   v.FromTag,
-								MoveValue: v.MoveValue,
-							})
-						} else {
-							edbInfoIdArr = append(edbInfoIdArr, EdbInfoFromTag{
-								EdbInfoId: v.FromEdbInfoId,
-								FromTag:   v.FromTag,
-								MoveValue: v.MoveValue,
-							})
-						}
-					}
-				}
-
-				req2 := &EdbInfoCalculateBatchEditReq{
-					EdbName:       edbInfo.EdbName,
-					Frequency:     edbInfo.Frequency,
-					Unit:          edbInfo.Unit,
-					ClassifyId:    edbInfo.ClassifyId,
-					Formula:       edbInfo.CalculateFormula,
-					EdbInfoId:     edbInfo.EdbInfoId,
-					FromEdbInfoId: aFromEdbInfoId,
-					Source:        edbInfo.Source,
-					MoveType:      edbInfo.MoveType,
-					MoveFrequency: edbInfo.MoveFrequency,
-					EdbInfoIdArr:  edbInfoIdArr,
-				}
-
-				sourName = "累计值同比拼接"
-
-				if fromEdbInfo.Frequency != "月度" {
-					errmsg = "累计值同比拼接,待拼接指标只能筛选月度指标"
-					err = fmt.Errorf("累计值同比拼接,待拼接指标只能筛选月度指标")
-					return
-				}
-				if len(req2.EdbInfoIdArr) != 1 {
-					errmsg = "请传入同比值指标"
-					err = fmt.Errorf("请传入同比值指标")
-					return
-				}
-
-				secondEdbInfoReq := req2.EdbInfoIdArr[0]
-				tbzEdbInfo, tmpErr := GetEdbInfoById(secondEdbInfoReq.EdbInfoId)
-				err = tmpErr
-				if err != nil {
-					errmsg = "获取同比值指标信息失败:Err:" + err.Error()
-					err = fmt.Errorf("获取同比值指标信息失败:Err:" + err.Error())
-					return
-				}
-				if tbzEdbInfo.Source != utils.DATA_SOURCE_CALCULATE_TBZ {
-					errmsg = "指标必须是传入同比值指标类型"
-					err = fmt.Errorf("指标必须是传入同比值指标类型")
-					return
-				}
-				if tbzEdbInfo.Frequency != "月度" {
-					errmsg = "同比值指标只能筛选月度指标"
-					err = fmt.Errorf("同比值指标只能筛选月度指标")
-					return
-				}
-
-				if fromEdbInfo.EdbInfoId == tbzEdbInfo.EdbInfoId {
-					errmsg = "两个指标不允许为同一个"
-					err = fmt.Errorf("两个指标不允许为同一个")
-					return
-				}
-				tmpEdbInfoId, tmpErr := EditCalculateLjztbpj(req2, edbInfo, fromEdbInfo, tbzEdbInfo)
-				err = tmpErr
-				edbInfoId = tmpEdbInfoId
-			} else if source == utils.DATA_SOURCE_PYTHON {
-				//python代码运算的过滤
-				continue
-			} else {
-				errmsg = "无效计算方式,source:" + strconv.Itoa(source)
-				err = fmt.Errorf("无效计算方式,source:" + strconv.Itoa(source))
-				return
-			}
-			maxAndMinItem, tmpErr := GetEdbInfoMaxAndMinInfo(source, subSource, edbCode)
-			err = tmpErr
-			if err != nil && err.Error() != utils.ErrNoRow() {
-				errmsg = "生成" + sourName + "失败,GetEdbInfoMaxAndMinInfo Err:" + err.Error()
-				err = fmt.Errorf("生成" + sourName + "失败,GetEdbInfoMaxAndMinInfo Err:" + err.Error())
-				return
-			}
-			if maxAndMinItem != nil {
-				err = ModifyEdbInfoMaxAndMinInfo(edbInfoId, maxAndMinItem)
-			}
-		}
-	}
-	return
-}
-
 type EdbInfoView struct {
 	EdbInfoId        int    `orm:"column(edb_info_id);pk"`
 	EdbInfoType      int    `description:"指标类型,0:普通指标,1:预测指标"`
@@ -1924,13 +1535,13 @@ func GetEdbInfoCount(source int, edbCode string) (count int, err error) {
 }
 
 // GetEdbInfoByNameArr 根据名称获取指标
-func GetEdbInfoByNameArr(names []string) (items []*EdbInfo, err error) {
+func GetEdbInfoByNameArr(names []string, edbInfoType int) (items []*EdbInfo, err error) {
 	if len(names) == 0 {
 		return
 	}
 	o := orm.NewOrmUsingDB("data")
-	sql := fmt.Sprintf(`SELECT edb_info_id, edb_code, edb_name FROM edb_info WHERE edb_name IN (%s)`, utils.GetOrmInReplace(len(names)))
-	_, err = o.Raw(sql, names).QueryRows(&items)
+	sql := fmt.Sprintf(`SELECT edb_info_id, edb_code, edb_name FROM edb_info WHERE edb_name IN (%s) AND edb_info_type = ? `, utils.GetOrmInReplace(len(names)))
+	_, err = o.Raw(sql, names, edbInfoType).QueryRows(&items)
 	return
 }
 
@@ -1941,3 +1552,102 @@ func GetEdbCodesBySource(source int) (items []*EdbInfo, err error) {
 	_, err = o.Raw(sql, source).QueryRows(&items)
 	return
 }
+
+// GetAllEdbDataListData
+// @Description: 获取指标的所有数据
+// @author: Roc
+// @datetime 2024-05-07 15:18:27
+// @param edbInfoId int
+// @param source int
+// @param subSource int
+// @param startDataTime string
+// @return dataList []*EdbData
+// @return err error
+func GetAllEdbDataListData(edbInfoId, source, subSource int, startDataTime string) (dataList []*EdbData, err error) {
+	// 自有数据需要额外处理(从mongo获取)
+	if source == utils.DATA_SOURCE_BUSINESS {
+		return getAllDataByMongo(edbInfoId, source, subSource, startDataTime)
+	}
+
+	// 默认走mysql
+	return getAllDataByMysql(edbInfoId, source, subSource, startDataTime)
+}
+
+// getAllDataByMysql
+// @Description: 从mysql获取指标的所有数据
+// @author: Roc
+// @datetime 2024-05-07 15:18:41
+// @param edbInfoId int
+// @param source int
+// @param subSource int
+// @param startDataTime string
+// @return dataList []*data_manage.EdbData
+// @return err error
+func getAllDataByMysql(edbInfoId, source, subSource int, startDataTime string) (dataList []*EdbData, err error) {
+	dataList = make([]*EdbData, 0)
+	var dataCondition string
+	var dataPars []interface{}
+
+	dataCondition += ` AND edb_info_id=? `
+	dataPars = append(dataPars, edbInfoId)
+
+	// 结束日期
+	if startDataTime != "" {
+		dataCondition += ` AND data_time > ? `
+		dataPars = append(dataPars, startDataTime)
+	}
+
+	// 获取列表数据
+	dataList, err = GetAllEdbDataListByCondition(dataCondition, dataPars, source, subSource)
+	if err != nil {
+		return
+	}
+
+	return
+}
+
+// getAllDataByMongo
+// @Description: 从mongo获取指标的所有数据
+// @author: Roc
+// @datetime 2024-05-07 15:18:53
+// @param edbInfoId int
+// @param source int
+// @param subSource int
+// @param startDataTime string
+// @return dataList []*data_manage.EdbData
+// @return err error
+func getAllDataByMongo(edbInfoId, source, subSource int, startDataTime string) (dataList []*EdbData, err error) {
+	dataList = make([]*EdbData, 0)
+
+	mogDataObj := mgo.EdbDataBusiness{}
+	// 构建查询条件
+	queryConditions := bson.M{
+		"edb_info_id": edbInfoId,
+	}
+	// 结束日期
+	if startDataTime != "" {
+		startDateTime, tmpErr := time.ParseInLocation(utils.FormatDate, startDataTime, time.Local)
+		if tmpErr != nil {
+			err = tmpErr
+			return
+		}
+		queryConditions["data_time"] = bson.M{"$gt": startDateTime}
+	}
+
+	// 获取列表数据
+	tmpDataList, tmpErr := mogDataObj.GetAllDataList(queryConditions, []string{"-data_time"})
+	if tmpErr != nil {
+		err = tmpErr
+		return
+	}
+	for k, v := range tmpDataList {
+		dataList = append(dataList, &EdbData{
+			EdbDataId: k + 1,
+			EdbInfoId: v.EdbInfoId,
+			DataTime:  v.DataTime.Format(utils.FormatDate),
+			Value:     v.Value,
+		})
+	}
+
+	return
+}

+ 0 - 90
models/data_manage/edb_info_calculate.go

@@ -1,13 +1,9 @@
 package data_manage
 
 import (
-	"errors"
-	"eta/eta_api/utils"
 	"fmt"
 	"github.com/beego/beego/v2/client/orm"
 	"github.com/rdlucklib/rdluck_tools/paging"
-	"github.com/yidane/formula"
-	"strconv"
 	"strings"
 	"time"
 )
@@ -439,92 +435,6 @@ func GetFormulaMap() map[string]string {
 	return funMap
 }
 
-func Calculate(edbInfoIdArr []*EdbInfo, edbInfoId int, edbCode, formulaStr string, edbInfoIdBytes []string) (err error) {
-	defer func() {
-		if err != nil {
-			utils.FileLog.Info("Calculate Err:%s" + err.Error())
-		}
-	}()
-	saveDataMap := make(map[string]map[int]float64)
-	for _, v := range edbInfoIdArr {
-		var condition string
-		var pars []interface{}
-		condition += " AND edb_info_id=? "
-		pars = append(pars, v.EdbInfoId)
-		dataList, err := GetEdbDataListAll(condition, pars, v.Source, v.SubSource, 1)
-		if err != nil {
-			return err
-		}
-		dataMap := make(map[string]float64)
-		for _, dv := range dataList {
-			if val, ok := saveDataMap[dv.DataTime]; ok {
-				if _, ok := val[v.EdbInfoId]; !ok {
-					val[v.EdbInfoId] = dv.Value
-				}
-			} else {
-				temp := make(map[int]float64)
-				temp[v.EdbInfoId] = dv.Value
-				saveDataMap[dv.DataTime] = temp
-			}
-		}
-		item := new(CalculateItems)
-		item.EdbInfoId = v.EdbInfoId
-		item.DataMap = dataMap
-	}
-	formulaMap := CheckFormula(formulaStr)
-	addSql := ` INSERT INTO edb_data_calculate(edb_info_id,edb_code,data_time,value,create_time,modify_time,status,data_timestamp) values `
-	nowStr := time.Now().Format(utils.FormatDateTime)
-	var isAdd bool
-
-	for sk, sv := range saveDataMap {
-		formulaStr = strings.ToUpper(formulaStr)
-		formulaFormStr := ReplaceFormula(edbInfoIdArr, sv, formulaMap, formulaStr, edbInfoIdBytes)
-		if formulaStr == "" {
-			return
-		}
-		if formulaFormStr != "" {
-			utils.FileLog.Info("formulaFormStr:%s", formulaFormStr)
-			expression := formula.NewExpression(formulaFormStr)
-			calResult, err := expression.Evaluate()
-			if err != nil {
-				err = errors.New("计算失败:Err:" + err.Error() + ";formulaStr:" + formulaFormStr)
-				fmt.Println(err)
-				return err
-			}
-			calVal, err := calResult.Float64()
-			if err != nil {
-				err = errors.New("计算失败:获取计算值失败 Err:" + err.Error() + ";formulaStr:" + formulaFormStr)
-				fmt.Println(err)
-				return err
-			}
-
-			//需要存入的数据
-			{
-				dataTime, _ := time.Parse(utils.FormatDate, sk)
-				timestamp := dataTime.UnixNano() / 1e6
-				timeStr := fmt.Sprintf("%d", timestamp)
-				addSql += "("
-				addSql += strconv.Itoa(edbInfoId) + "," + "'" + edbCode + "'" + "," + "'" + sk + "'" + "," + utils.SubFloatToString(calVal, 4) + "," + "'" + nowStr + "'" +
-					"," + "'" + nowStr + "'" + "," + "1"
-				addSql += "," + "'" + timeStr + "'"
-				addSql += "),"
-				isAdd = true
-			}
-		} else {
-			fmt.Println("formulaFormStr is empty")
-		}
-	}
-	if isAdd {
-		addSql = strings.TrimRight(addSql, ",")
-		AddEdbDataCalculateBySql(addSql)
-		if err != nil {
-			fmt.Println("AddEdbDataCalculate Err:" + err.Error())
-			return err
-		}
-	}
-	return
-}
-
 // SaveAdjustEdbInfoReq 保存数据调整请求参数(请求指标服务)
 type SaveAdjustEdbInfoReq struct {
 	AdminId       int                    `description:"添加人id"`

+ 0 - 601
models/data_manage/edb_info_calculate_bp.go

@@ -1,601 +0,0 @@
-package data_manage
-
-import (
-	"errors"
-	"eta/eta_api/utils"
-	"fmt"
-	"github.com/beego/beego/v2/client/orm"
-	"github.com/shopspring/decimal"
-	"strconv"
-	"strings"
-	"time"
-)
-
-type EdbInfoCalculateBp struct {
-	EdbInfoCalculateBpId int       `orm:"column(edb_info_calculate_bp_id);pk"`
-	EdbInfoId            int       `description:"指标id"`
-	EdbCode              string    `description:"指标编码"`
-	FromEdbInfoId        int       `description:"计算指标id"`
-	FromEdbCode          string    `description:"计算指标编码"`
-	FromEdbName          string    `description:"计算指标名称"`
-	FromSource           int       `description:"计算指标来源"`
-	FromSourceName       string    `description:"计算指标来源名称"`
-	FromTag              string    `description:"来源指标标签"`
-	Sort                 int       `description:"计算指标名称排序"`
-	CreateTime           time.Time `description:"创建时间"`
-	ModifyTime           time.Time `description:"修改时间"`
-}
-
-// 变频
-func AddCalculateBp(req *EdbInfoCalculateBatchSaveReq, fromEdbInfo *EdbInfo, edbCode, uniqueCode string, sysUserId int, sysUserRealName string) (edbInfoId int, err error) {
-	fmt.Println("AddCalculateBp")
-	o := orm.NewOrmUsingDB("data")
-	to, err := o.Begin()
-	if err != nil {
-		return
-	}
-	defer func() {
-		if err != nil {
-			fmt.Println("AddCalculateBp,Err:" + err.Error())
-			_ = to.Rollback()
-		} else {
-			_ = to.Commit()
-		}
-	}()
-	if req.EdbInfoId <= 0 {
-		edbInfo := new(EdbInfo)
-		edbInfo.Source = utils.DATA_SOURCE_CALCULATE_BP
-		edbInfo.SourceName = "变频"
-		edbInfo.EdbCode = edbCode
-		edbInfo.EdbName = req.EdbName
-		edbInfo.EdbNameSource = req.EdbName
-		edbInfo.Frequency = req.Frequency
-		edbInfo.Unit = req.Unit
-		edbInfo.ClassifyId = req.ClassifyId
-		edbInfo.SysUserId = sysUserId
-		edbInfo.SysUserRealName = sysUserRealName
-		edbInfo.CreateTime = time.Now()
-		edbInfo.ModifyTime = time.Now()
-		edbInfo.UniqueCode = uniqueCode
-		edbInfo.CalculateFormula = req.Formula
-		edbInfo.EdbType = 2
-		newEdbInfoId, tmpErr := to.Insert(edbInfo)
-		if tmpErr != nil {
-			return edbInfoId, tmpErr
-		}
-		edbInfoId = int(newEdbInfoId)
-		//关联关系
-		{
-			calculateMappingItem := new(EdbInfoCalculateMapping)
-			calculateMappingItem.CreateTime = time.Now()
-			calculateMappingItem.ModifyTime = time.Now()
-			calculateMappingItem.Sort = 1
-			calculateMappingItem.EdbCode = edbCode
-			calculateMappingItem.EdbInfoId = edbInfoId
-			calculateMappingItem.FromEdbInfoId = fromEdbInfo.EdbInfoId
-			calculateMappingItem.FromEdbCode = fromEdbInfo.EdbCode
-			calculateMappingItem.FromEdbName = fromEdbInfo.EdbName
-			calculateMappingItem.FromSource = fromEdbInfo.Source
-			calculateMappingItem.FromSourceName = fromEdbInfo.SourceName
-			calculateMappingItem.FromTag = ""
-			calculateMappingItem.Source = edbInfo.Source
-			calculateMappingItem.SourceName = edbInfo.SourceName
-			_, err = to.Insert(calculateMappingItem)
-			if err != nil {
-				return
-			}
-		}
-	} else {
-		edbInfoId = req.EdbInfoId
-		dataTableName := GetEdbDataTableName(utils.DATA_SOURCE_CALCULATE_BP, utils.DATA_SUB_SOURCE_EDB)
-		fmt.Println("dataTableName:" + dataTableName)
-		deleteSql := ` DELETE FROM %s WHERE edb_info_id=? `
-		deleteSql = fmt.Sprintf(deleteSql, dataTableName)
-		_, err = to.Raw(deleteSql, req.EdbInfoId).Exec()
-		if err != nil {
-			return 0, err
-		}
-	}
-
-	edbInfoIdStr := strconv.Itoa(edbInfoId)
-	fmt.Println("edbInfoIdStr:" + edbInfoIdStr)
-	//计算数据
-	var condition string
-	var pars []interface{}
-	condition += " AND edb_info_id=? "
-	if req.EdbInfoId <= 0 {
-		pars = append(pars, req.FromEdbInfoId)
-	} else {
-		pars = append(pars, fromEdbInfo.EdbInfoId)
-	}
-	dataList, err := GetEdbDataListAll(condition, pars, fromEdbInfo.Source, fromEdbInfo.SubSource, 0)
-	if err != nil {
-		return edbInfoId, err
-	}
-
-	addSql := ` INSERT INTO edb_data_calculate_bp(edb_info_id,edb_code,data_time,value,create_time,modify_time,status,data_timestamp) values `
-	var isAdd bool
-	existMap := make(map[string]string)
-	dataLen := len(dataList)
-	fmt.Println("dataLen:", dataLen)
-
-	for i := 0; i < dataLen; i++ {
-		//当期
-		currentItem := dataList[i]
-		currentDate, _ := time.Parse(utils.FormatDate, currentItem.DataTime)
-		var day int
-		var preItem *EdbInfoSearchData
-		var preDate time.Time
-		if i == 0 {
-			day = int(time.Now().Sub(currentDate).Hours() / float64(24))
-			preDate = time.Now()
-		} else {
-			j := i - 1
-			if j < dataLen {
-				preItem = dataList[j]
-				preDate, _ = time.Parse(utils.FormatDate, preItem.DataTime)
-				day = int(preDate.Sub(currentDate).Hours() / float64(24))
-				utils.FileLog.Info("preItem.DataTime:" + preItem.DataTime + ";currentItem.DataTime" + currentItem.DataTime)
-			}
-		}
-		for k := 0; k <= day; k++ {
-			needDay := preDate.AddDate(0, 0, -k)
-			needDayStr := needDay.Format(utils.FormatDate)
-			existKey := edbCode + needDayStr
-			if _, ok := existMap[existKey]; !ok {
-				timestamp := needDay.UnixNano() / 1e6
-				timestampStr := fmt.Sprintf("%d", timestamp)
-				valStr := decimal.NewFromFloat(currentItem.Value).String()
-				addSql += GetAddSql(edbInfoIdStr, edbCode, needDayStr, timestampStr, valStr)
-				isAdd = true
-			}
-			existMap[existKey] = needDayStr
-		}
-		existKey := edbCode + currentItem.DataTime
-		if _, ok := existMap[existKey]; !ok {
-			currentDate, _ := time.Parse(utils.FormatDate, currentItem.DataTime)
-			timestamp := currentDate.UnixNano() / 1e6
-			timestampStr := fmt.Sprintf("%d", timestamp)
-			valStr := decimal.NewFromFloat(currentItem.Value).String()
-			addSql += GetAddSql(edbInfoIdStr, edbCode, currentItem.DataTime, timestampStr, valStr)
-			isAdd = true
-		}
-		existMap[existKey] = currentItem.DataTime
-	}
-	if isAdd {
-		addSql = strings.TrimRight(addSql, ",")
-		_, err = to.Raw(addSql).Exec()
-		if err != nil {
-			return edbInfoId, err
-		}
-	}
-	return
-}
-
-// 环比值
-func EditCalculateBp(req *EdbInfoCalculateBatchEditReq, fromEdbInfo *EdbInfo, edbCode string) (edbInfoId int, err error) {
-	edbInfoId = req.EdbInfoId
-	o := orm.NewOrmUsingDB("data")
-	to, err := o.Begin()
-	if err != nil {
-		return
-	}
-	defer func() {
-		if err != nil {
-			_ = to.Rollback()
-		} else {
-			_ = to.Commit()
-		}
-	}()
-
-	//修改指标信息
-	sql := ` UPDATE  edb_info
-			SET
-			  edb_name =?,
-			  edb_name_source=?,
-			  frequency = ?,
-			  unit = ?,
-			  classify_id = ?,
-			  modify_time = NOW()
-			WHERE edb_info_id = ? `
-	_, err = to.Raw(sql, req.EdbName, req.EdbName, req.Frequency, req.Unit, req.ClassifyId, edbInfoId).Exec()
-	if err != nil {
-		return
-	}
-
-	var existCondition string
-	var existPars []interface{}
-	existCondition += " AND edb_info_id=? "
-	existPars = append(existPars, edbInfoId)
-
-	existCondition += " AND from_edb_info_id=? "
-	existPars = append(existPars, req.FromEdbInfoId)
-
-	//判断计算指标是否被更换
-	count, err := GetEdbInfoCalculateCountByCondition(req.Source, existCondition, existPars)
-	if err != nil {
-		err = errors.New("判断指标是否改变失败,Err:" + err.Error())
-		return
-	}
-	if count <= 0 {
-		//删除指标关联计算指标
-		//sql := ` DELETE FROM edb_info_calculate_bp WHERE edb_info_id = ? `
-		//_, err = to.Raw(sql, edbInfoId).Exec()
-		//if err != nil {
-		//	return
-		//}
-
-		//calculateItem := new(EdbInfoCalculateHbz)
-		//calculateItem.CreateTime = time.Now()
-		//calculateItem.ModifyTime = time.Now()
-		//calculateItem.Sort = 1
-		//calculateItem.EdbCode = edbCode
-		//calculateItem.EdbInfoId = edbInfoId
-		//calculateItem.FromEdbInfoId = fromEdbInfo.EdbInfoId
-		//calculateItem.FromEdbCode = fromEdbInfo.EdbCode
-		//calculateItem.FromEdbName = fromEdbInfo.EdbName
-		//calculateItem.FromSource = fromEdbInfo.Source
-		//calculateItem.FromSourceName = fromEdbInfo.SourceName
-		//
-		//_, err = to.Insert(calculateItem)
-		//if err != nil {
-		//	return
-		//}
-
-		//删除,计算指标关联的,基础指标的关联关系
-		sql = ` DELETE FROM edb_info_calculate_mapping WHERE edb_info_id = ? `
-		_, err = to.Raw(sql, edbInfoId).Exec()
-		if err != nil {
-			err = errors.New("删除计算指标关联关系失败,Err:" + err.Error())
-			return
-		}
-		//清空原有数据
-		sql = ` DELETE FROM edb_data_calculate_bp WHERE edb_info_id = ? `
-		_, err = to.Raw(sql, edbInfoId).Exec()
-		if err != nil {
-			return edbInfoId, err
-		}
-		//关联关系
-		{
-			calculateMappingItem := new(EdbInfoCalculateMapping)
-			calculateMappingItem.CreateTime = time.Now()
-			calculateMappingItem.ModifyTime = time.Now()
-			calculateMappingItem.Sort = 1
-			calculateMappingItem.EdbCode = edbCode
-			calculateMappingItem.EdbInfoId = edbInfoId
-			calculateMappingItem.FromEdbInfoId = fromEdbInfo.EdbInfoId
-			calculateMappingItem.FromEdbCode = fromEdbInfo.EdbCode
-			calculateMappingItem.FromEdbName = fromEdbInfo.EdbName
-			calculateMappingItem.FromSource = fromEdbInfo.Source
-			calculateMappingItem.FromSourceName = fromEdbInfo.SourceName
-			calculateMappingItem.FromTag = ""
-			calculateMappingItem.Source = utils.DATA_SOURCE_CALCULATE_BP
-			calculateMappingItem.SourceName = "变频"
-			_, err = to.Insert(calculateMappingItem)
-			if err != nil {
-				return
-			}
-		}
-		edbInfoIdStr := strconv.Itoa(edbInfoId)
-		fmt.Println("edbInfoIdStr:" + edbInfoIdStr)
-		//计算数据
-		var condition string
-		var pars []interface{}
-		condition += " AND edb_info_id=? "
-		pars = append(pars, req.FromEdbInfoId)
-		fmt.Println("EdbInfoId:", req.FromEdbInfoId)
-		dataList, err := GetEdbDataListAll(condition, pars, fromEdbInfo.Source, fromEdbInfo.SubSource, 0)
-		if err != nil {
-			return edbInfoId, err
-		}
-		addSql := ` INSERT INTO edb_data_calculate_bp(edb_info_id,edb_code,data_time,value,create_time,modify_time,status,data_timestamp) values `
-		var isAdd bool
-		existMap := make(map[string]string)
-		dataLen := len(dataList)
-		for i := 0; i < dataLen; i++ {
-			//当期
-			currentItem := dataList[i]
-			currentDate, _ := time.Parse(utils.FormatDate, currentItem.DataTime)
-			var day int
-			var preItem *EdbInfoSearchData
-			var preDate time.Time
-			if i == 0 {
-				day = int(time.Now().Sub(currentDate).Hours() / float64(24))
-				preDate = time.Now()
-			} else {
-				j := i + 1
-				if j < dataLen {
-					preItem = dataList[j]
-					preDate, _ = time.Parse(utils.FormatDate, preItem.DataTime)
-					day = int(currentDate.Sub(preDate).Hours() / float64(24))
-				}
-			}
-			for k := 0; k <= day; k++ {
-				needDay := preDate.AddDate(0, 0, -k)
-				needDayStr := needDay.Format(utils.FormatDate)
-				existKey := edbCode + needDayStr
-				if _, ok := existMap[existKey]; !ok {
-					timestamp := needDay.UnixNano() / 1e6
-					timestampStr := fmt.Sprintf("%d", timestamp)
-					valStr := decimal.NewFromFloat(currentItem.Value).String()
-					addSql += GetAddSql(edbInfoIdStr, edbCode, needDayStr, timestampStr, valStr)
-				}
-				existMap[existKey] = needDayStr
-			}
-			existKey := edbCode + currentItem.DataTime
-			if _, ok := existMap[existKey]; !ok {
-				currentDate, _ := time.Parse(utils.FormatDate, currentItem.DataTime)
-				timestamp := currentDate.UnixNano() / 1e6
-				timestampStr := fmt.Sprintf("%d", timestamp)
-				valStr := decimal.NewFromFloat(currentItem.Value).String()
-				addSql += GetAddSql(edbInfoIdStr, edbCode, currentItem.DataTime, timestampStr, valStr)
-			}
-			existMap[existKey] = currentItem.DataTime
-		}
-		if isAdd {
-			addSql = strings.TrimRight(addSql, ",")
-			_, err = to.Raw(addSql).Exec()
-			if err != nil {
-				return edbInfoId, err
-			}
-		}
-	}
-	return
-}
-
-// 变频
-func RefreshCalculateBp(edbInfoId int, fromEdbInfo *EdbInfo, edbCode, startDate, endDate 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()
-		}
-	}()
-
-	if err != nil {
-		return
-	}
-	edbInfoIdStr := strconv.Itoa(edbInfoId)
-	//计算数据
-
-	//计算数据
-	var condition string
-	var pars []interface{}
-	condition += " AND edb_info_id=? "
-	pars = append(pars, fromEdbInfo.EdbInfoId)
-
-	if startDate != "" {
-		condition += " AND data_time>=? "
-		pars = append(pars, startDate)
-	}
-	if endDate != "" {
-		condition += " AND data_time<=? "
-		pars = append(pars, endDate)
-	}
-
-	dataList, err := GetEdbDataListAll(condition, pars, fromEdbInfo.Source, fromEdbInfo.SubSource, 0)
-	if err != nil {
-		return err
-	}
-	existMap := make(map[string]string)
-	dataLen := len(dataList)
-	addSql := ` INSERT INTO edb_data_calculate_bp(edb_info_id,edb_code,data_time,value,create_time,modify_time,status,data_timestamp) values `
-	var isAdd bool
-	for i := 0; i < dataLen; i++ {
-		//当期
-		currentItem := dataList[i]
-		currentDate, _ := time.Parse(utils.FormatDate, currentItem.DataTime)
-		var day int
-		var preItem *EdbInfoSearchData
-		var preDate time.Time
-		if i == 0 {
-			day = int(time.Now().Sub(currentDate).Hours() / float64(24))
-			preDate = time.Now()
-		} else {
-			j := i + 1
-			if j < dataLen {
-				preItem = dataList[j]
-				preDate, _ = time.Parse(utils.FormatDate, preItem.DataTime)
-				day = int(currentDate.Sub(preDate).Hours() / float64(24))
-			}
-		}
-		for k := 0; k <= day; k++ {
-			needDay := preDate.AddDate(0, 0, -k)
-			needDayStr := needDay.Format(utils.FormatDate)
-			existKey := edbCode + needDayStr
-			if _, ok := existMap[existKey]; !ok {
-				timestamp := needDay.UnixNano() / 1e6
-				timestampStr := fmt.Sprintf("%d", timestamp)
-				valStr := decimal.NewFromFloat(currentItem.Value).String()
-				addSql += GetAddSql(edbInfoIdStr, edbCode, needDayStr, timestampStr, valStr)
-			}
-			existMap[existKey] = needDayStr
-		}
-		existKey := edbCode + currentItem.DataTime
-		if _, ok := existMap[existKey]; !ok {
-			currentDate, _ := time.Parse(utils.FormatDate, currentItem.DataTime)
-			timestamp := currentDate.UnixNano() / 1e6
-			timestampStr := fmt.Sprintf("%d", timestamp)
-			valStr := decimal.NewFromFloat(currentItem.Value).String()
-			addSql += GetAddSql(edbInfoIdStr, edbCode, currentItem.DataTime, timestampStr, valStr)
-		}
-		existMap[existKey] = currentItem.DataTime
-	}
-	if isAdd {
-		addSql = strings.TrimRight(addSql, ",")
-		_, err = to.Raw(addSql).Exec()
-		if err != nil {
-			return err
-		}
-	}
-	return
-}
-
-type EdbInfoCalculateBpDetail struct {
-	EdbInfoCalculateBpId int       `orm:"column(edb_info_calculate_bp_id);pk"`
-	EdbInfoId            int       `description:"指标id"`
-	EdbCode              string    `description:"指标编码"`
-	FromEdbInfoId        int       `description:"计算指标id"`
-	FromEdbCode          string    `description:"计算指标编码"`
-	FromEdbName          string    `description:"计算指标名称"`
-	FromSource           int       `description:"计算指标来源"`
-	FromSourceName       string    `description:"计算指标来源名称"`
-	FromTag              string    `description:"来源指标标签"`
-	Sort                 int       `description:"计算指标名称排序"`
-	CreateTime           time.Time `description:"创建时间"`
-	ModifyTime           time.Time `description:"修改时间"`
-	StartDate            string    `description:"开始日期"`
-	EndDate              string    `description:"结束日期"`
-}
-
-func GetEdbInfoCalculateBpDetail(edbInfoId int) (item *EdbInfoCalculateTbzDetail, err error) {
-	o := orm.NewOrmUsingDB("data")
-	sql := ` SELECT a.*,b.start_date,b.end_date FROM edb_info_calculate_mapping AS a
-			INNER JOIN edb_info AS b ON a.from_edb_info_id=b.edb_info_id
-			WHERE a.edb_info_id=? `
-	err = o.Raw(sql, edbInfoId).QueryRow(&item)
-	return
-}
-
-// 刷新所有变频数据
-func RefreshAllCalculateBp(edbInfoId, source, subSource int, fromEdbInfo *EdbInfo, edbCode, startDate, endDate 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()
-		}
-	}()
-
-	if err != nil {
-		return
-	}
-	edbInfoIdStr := strconv.Itoa(edbInfoId)
-	//计算数据
-
-	//计算数据
-	var condition string
-	var pars []interface{}
-	condition += " AND edb_info_id=? "
-	pars = append(pars, fromEdbInfo.EdbInfoId)
-
-	if startDate != "" {
-		condition += " AND data_time>=? "
-		pars = append(pars, startDate)
-	}
-	if endDate != "" {
-		condition += " AND data_time<=? "
-		pars = append(pars, endDate)
-	}
-
-	dataList, err := GetEdbDataListAll(condition, pars, fromEdbInfo.Source, fromEdbInfo.SubSource, 0)
-	if err != nil {
-		return err
-	}
-	var dateArr []string
-	dataMap := make(map[string]*EdbInfoSearchData)
-	for _, v := range dataList {
-		dateArr = append(dateArr, v.DataTime)
-		dataMap[v.DataTime] = v
-	}
-	//获取指标所有数据
-	existDataList := make([]*EdbDataBase, 0)
-	dataTableName := GetEdbDataTableName(source, subSource)
-	sql := `SELECT * FROM %s WHERE edb_info_id=? `
-	sql = fmt.Sprintf(sql, dataTableName)
-	_, err = to.Raw(sql, edbInfoId).QueryRows(&existDataList)
-	if err != nil {
-		return err
-	}
-	existDataMap := make(map[string]string)
-	for _, v := range existDataList {
-		existDataMap[v.DataTime] = v.Value
-	}
-	addSql := ` INSERT INTO edb_data_calculate_bp(edb_info_id,edb_code,data_time,value,create_time,modify_time,status,data_timestamp) values `
-	var isAdd bool
-
-	existMap := make(map[string]string)
-	dataLen := len(dataList)
-	for i := 0; i < dataLen; i++ {
-		//当期
-		currentItem := dataList[i]
-		currentDate, _ := time.Parse(utils.FormatDate, currentItem.DataTime)
-		var day int
-		var preItem *EdbInfoSearchData
-		var preDate time.Time
-		if i == 0 {
-			day = int(time.Now().Sub(currentDate).Hours() / float64(24))
-			preDate = time.Now()
-		} else {
-			j := i + 1
-			if j < dataLen {
-				preItem = dataList[j]
-				preDate, _ = time.Parse(utils.FormatDate, preItem.DataTime)
-				day = int(currentDate.Sub(preDate).Hours() / float64(24))
-			}
-		}
-		for k := 0; k <= day; k++ {
-			needDay := preDate.AddDate(0, 0, -k)
-			needDayStr := needDay.Format(utils.FormatDate)
-			existKey := edbCode + needDayStr
-			if _, ok := existMap[existKey]; !ok {
-				timestamp := needDay.UnixNano() / 1e6
-				timestampStr := fmt.Sprintf("%d", timestamp)
-				valStr := decimal.NewFromFloat(currentItem.Value).String()
-				if existVal, ok := existDataMap[needDayStr]; !ok {
-					addSql += GetAddSql(edbInfoIdStr, edbCode, needDayStr, timestampStr, valStr)
-				} else {
-					if existVal != valStr {
-						sql := ` UPDATE %s SET value=?,modify_time=NOW() WHERE edb_info_id=? AND data_time=? `
-						sql = fmt.Sprintf(sql, dataTableName)
-						_, err = to.Raw(sql, valStr, edbInfoId, needDay).Exec()
-						if err != nil {
-							return err
-						}
-					}
-				}
-			}
-			existMap[existKey] = needDayStr
-		}
-		existKey := edbCode + currentItem.DataTime
-		if _, ok := existMap[existKey]; !ok {
-			currentDate, _ := time.Parse(utils.FormatDate, currentItem.DataTime)
-			timestamp := currentDate.UnixNano() / 1e6
-			timestampStr := fmt.Sprintf("%d", timestamp)
-			valStr := decimal.NewFromFloat(currentItem.Value).String()
-			if existVal, ok := existDataMap[currentItem.DataTime]; !ok {
-				addSql += GetAddSql(edbInfoIdStr, edbCode, currentItem.DataTime, timestampStr, valStr)
-			} else {
-				if existVal != valStr {
-					sql := ` UPDATE %s SET value=?,modify_time=NOW() WHERE edb_info_id=? AND data_time=? `
-					sql = fmt.Sprintf(sql, dataTableName)
-					_, err = to.Raw(sql, valStr, edbInfoId, currentItem.DataTime).Exec()
-					if err != nil {
-						return err
-					}
-				}
-			}
-		}
-		existMap[existKey] = currentItem.DataTime
-	}
-
-	if isAdd {
-		addSql = strings.TrimRight(addSql, ",")
-		_, err = to.Raw(addSql).Exec()
-		if err != nil {
-			return err
-		}
-	}
-	return
-}

+ 0 - 526
models/data_manage/edb_info_calculate_hbz.go

@@ -1,526 +0,0 @@
-package data_manage
-
-import (
-	"errors"
-	"eta/eta_api/utils"
-	"fmt"
-	"github.com/beego/beego/v2/client/orm"
-	"strconv"
-	"strings"
-	"time"
-
-	"github.com/shopspring/decimal"
-)
-
-type EdbInfoCalculateHbz struct {
-	EdbInfoCalculateHbzId int       `orm:"column(edb_info_calculate_hbz_id);pk"`
-	EdbInfoId             int       `description:"指标id"`
-	EdbCode               string    `description:"指标编码"`
-	FromEdbInfoId         int       `description:"计算指标id"`
-	FromEdbCode           string    `description:"计算指标编码"`
-	FromEdbName           string    `description:"计算指标名称"`
-	FromSource            int       `description:"计算指标来源"`
-	FromSourceName        string    `description:"计算指标来源名称"`
-	FromTag               string    `description:"来源指标标签"`
-	Sort                  int       `description:"计算指标名称排序"`
-	CreateTime            time.Time `description:"创建时间"`
-	ModifyTime            time.Time `description:"修改时间"`
-}
-
-// 环比值
-func AddCalculateHbz(req *EdbInfoCalculateBatchSaveReq, fromEdbInfo *EdbInfo, edbCode, uniqueCode string, sysUserId int, sysUserRealName string, formulaInt int) (edbInfoId int, err error) {
-	fmt.Println("AddCalculateHbz")
-	o := orm.NewOrmUsingDB("data")
-	to, err := o.Begin()
-	if err != nil {
-		return
-	}
-	defer func() {
-		if err != nil {
-			fmt.Println("AddCalculateHbz,Err:" + err.Error())
-			_ = to.Rollback()
-		} else {
-			_ = to.Commit()
-		}
-	}()
-	if req.EdbInfoId <= 0 {
-		edbInfo := new(EdbInfo)
-		edbInfo.Source = utils.DATA_SOURCE_CALCULATE_HBZ
-		edbInfo.SourceName = "环比值"
-		edbInfo.EdbCode = edbCode
-		edbInfo.EdbName = req.EdbName
-		edbInfo.EdbNameSource = req.EdbName
-		edbInfo.Frequency = req.Frequency
-		edbInfo.Unit = req.Unit
-		edbInfo.ClassifyId = req.ClassifyId
-		edbInfo.SysUserId = sysUserId
-		edbInfo.SysUserRealName = sysUserRealName
-		edbInfo.CreateTime = time.Now()
-		edbInfo.ModifyTime = time.Now()
-		edbInfo.UniqueCode = uniqueCode
-		edbInfo.CalculateFormula = req.Formula
-		edbInfo.EdbType = 2
-		newEdbInfoId, tmpErr := to.Insert(edbInfo)
-		if tmpErr != nil {
-			return edbInfoId, tmpErr
-		}
-		edbInfoId = int(newEdbInfoId)
-		//关联关系
-		{
-			calculateMappingItem := new(EdbInfoCalculateMapping)
-			calculateMappingItem.CreateTime = time.Now()
-			calculateMappingItem.ModifyTime = time.Now()
-			calculateMappingItem.Sort = 1
-			calculateMappingItem.EdbCode = edbCode
-			calculateMappingItem.EdbInfoId = edbInfoId
-			calculateMappingItem.FromEdbInfoId = fromEdbInfo.EdbInfoId
-			calculateMappingItem.FromEdbCode = fromEdbInfo.EdbCode
-			calculateMappingItem.FromEdbName = fromEdbInfo.EdbName
-			calculateMappingItem.FromSource = fromEdbInfo.Source
-			calculateMappingItem.FromSourceName = fromEdbInfo.SourceName
-			calculateMappingItem.FromTag = ""
-			calculateMappingItem.Source = edbInfo.Source
-			calculateMappingItem.SourceName = edbInfo.SourceName
-			_, err = to.Insert(calculateMappingItem)
-			if err != nil {
-				return
-			}
-		}
-	} else {
-		edbInfoId = req.EdbInfoId
-		dataTableName := GetEdbDataTableName(utils.DATA_SOURCE_CALCULATE_HBZ, utils.DATA_SUB_SOURCE_EDB)
-		deleteSql := ` DELETE FROM %s WHERE edb_info_id=? `
-		deleteSql = fmt.Sprintf(deleteSql, dataTableName)
-		_, err = to.Raw(deleteSql, req.EdbInfoId).Exec()
-	}
-
-	edbInfoIdStr := strconv.Itoa(edbInfoId)
-	fmt.Println("edbInfoIdStr:" + edbInfoIdStr)
-	//计算数据
-	var condition string
-	var pars []interface{}
-	condition += " AND edb_info_id=? "
-	if req.EdbInfoId <= 0 {
-		pars = append(pars, req.FromEdbInfoId)
-	} else {
-		pars = append(pars, fromEdbInfo.EdbInfoId)
-	}
-	dataList, err := GetEdbDataListAll(condition, pars, fromEdbInfo.Source, fromEdbInfo.SubSource, 0)
-	if err != nil {
-		return edbInfoId, err
-	}
-
-	addSql := ` INSERT INTO edb_data_calculate_hbz(edb_info_id,edb_code,data_time,value,create_time,modify_time,status,data_timestamp) values `
-	var isAdd bool
-	existMap := make(map[string]string)
-	dataLen := len(dataList)
-	for i := 0; i < dataLen; i++ {
-		j := i + formulaInt
-		if j < dataLen {
-			//当期
-			currentItem := dataList[i]
-			preItem := dataList[j]
-			fmt.Println("preItem.Value:", preItem.Value)
-			if currentItem != nil && preItem != nil && preItem.Value != 0 {
-				existKey := edbCode + currentItem.DataTime
-				if _, ok := existMap[existKey]; !ok {
-					currentDate, _ := time.Parse(utils.FormatDate, currentItem.DataTime)
-					timestamp := currentDate.UnixNano() / 1e6
-					timestampStr := fmt.Sprintf("%d", timestamp)
-					val := HbzDiv(currentItem.Value, preItem.Value)
-					if val != "" {
-						addSql += GetAddSql(edbInfoIdStr, edbCode, currentItem.DataTime, timestampStr, val)
-						isAdd = true
-					}
-				}
-				existMap[existKey] = currentItem.DataTime
-			}
-		}
-	}
-	if isAdd {
-		addSql = strings.TrimRight(addSql, ",")
-		_, err = to.Raw(addSql).Exec()
-		if err != nil {
-			return edbInfoId, err
-		}
-	}
-	return
-}
-
-// 环比值,current:当期,pre:上期 公式: (当期-上期)/上期
-func HbzDiv(current, pre float64) string {
-	if pre == 0 {
-		return ""
-	}
-	currentVal := decimal.NewFromFloat(float64(current))
-	preVal := decimal.NewFromFloat(float64(pre))
-	val, _ := currentVal.Sub(preVal).Div(preVal).Float64()
-	valStr := utils.SubFloatToString(val, 4)
-	return valStr
-}
-
-// 环比值
-func EditCalculateHbz(req *EdbInfoCalculateBatchEditReq, fromEdbInfo *EdbInfo, edbCode string, formulaInt int, calculateFormula string) (edbInfoId int, err error) {
-	edbInfoId = req.EdbInfoId
-	o := orm.NewOrmUsingDB("data")
-	to, err := o.Begin()
-	if err != nil {
-		return
-	}
-	defer func() {
-		if err != nil {
-			_ = to.Rollback()
-		} else {
-			_ = to.Commit()
-		}
-	}()
-
-	//修改指标信息
-	sql := ` UPDATE  edb_info
-			SET
-			  edb_name =?,
-			  edb_name_source=?,
-			  frequency = ?,
-			  unit = ?,
-			  classify_id = ?,
- 			  calculate_formula=?,
-			  modify_time = NOW()
-			WHERE edb_info_id = ? `
-	_, err = to.Raw(sql, req.EdbName, req.EdbName, req.Frequency, req.Unit, req.ClassifyId, req.Formula, edbInfoId).Exec()
-	if err != nil {
-		return
-	}
-
-	var existCondition string
-	var existPars []interface{}
-	existCondition += " AND edb_info_id=? "
-	existPars = append(existPars, edbInfoId)
-
-	existCondition += " AND from_edb_info_id=? "
-	existPars = append(existPars, req.FromEdbInfoId)
-
-	//判断计算指标是否被更换
-	count, err := GetEdbInfoCalculateCountByCondition(req.Source, existCondition, existPars)
-	if err != nil {
-		err = errors.New("判断指标是否改变失败,Err:" + err.Error())
-		return
-	}
-	if count <= 0 || strconv.Itoa(formulaInt) != calculateFormula {
-		//删除,计算指标关联的,基础指标的关联关系
-		if count <= 0 {
-			sql = ` DELETE FROM edb_info_calculate_mapping WHERE edb_info_id = ? `
-			_, err = to.Raw(sql, edbInfoId).Exec()
-			if err != nil {
-				return
-			}
-			//关联关系
-			{
-				calculateMappingItem := new(EdbInfoCalculateMapping)
-				calculateMappingItem.CreateTime = time.Now()
-				calculateMappingItem.ModifyTime = time.Now()
-				calculateMappingItem.Sort = 1
-				calculateMappingItem.EdbCode = edbCode
-				calculateMappingItem.EdbInfoId = edbInfoId
-				calculateMappingItem.FromEdbInfoId = fromEdbInfo.EdbInfoId
-				calculateMappingItem.FromEdbCode = fromEdbInfo.EdbCode
-				calculateMappingItem.FromEdbName = fromEdbInfo.EdbName
-				calculateMappingItem.FromSource = fromEdbInfo.Source
-				calculateMappingItem.FromSourceName = fromEdbInfo.SourceName
-				calculateMappingItem.FromTag = ""
-				calculateMappingItem.Source = utils.DATA_SOURCE_CALCULATE_HBZ
-				calculateMappingItem.SourceName = "环比值"
-				_, err = to.Insert(calculateMappingItem)
-				if err != nil {
-					return
-				}
-			}
-		}
-		//清空原有数据
-		sql = ` DELETE FROM edb_data_calculate_hbz WHERE edb_info_id = ? `
-		_, err = to.Raw(sql, edbInfoId).Exec()
-		if err != nil {
-			return edbInfoId, err
-		}
-		edbInfoIdStr := strconv.Itoa(edbInfoId)
-		//计算数据
-		var condition string
-		var pars []interface{}
-		condition += " AND edb_info_id=? "
-		pars = append(pars, req.FromEdbInfoId)
-		dataList, err := GetEdbDataListAll(condition, pars, fromEdbInfo.Source, fromEdbInfo.SubSource, 0)
-		if err != nil {
-			return edbInfoId, err
-		}
-		addSql := ` INSERT INTO edb_data_calculate_hbz(edb_info_id,edb_code,data_time,value,create_time,modify_time,status,data_timestamp) values `
-		var isAdd bool
-		existMap := make(map[string]string)
-		dataLen := len(dataList)
-		for i := 0; i < dataLen; i++ {
-			j := i + formulaInt
-			if j < dataLen {
-				//当期
-				currentItem := dataList[i]
-				preItem := dataList[j]
-				if currentItem != nil && preItem != nil {
-					existKey := edbCode + currentItem.DataTime
-					if _, ok := existMap[existKey]; !ok {
-						currentDate, _ := time.Parse(utils.FormatDate, currentItem.DataTime)
-						timestamp := currentDate.UnixNano() / 1e6
-						timestampStr := fmt.Sprintf("%d", timestamp)
-						val := HbzDiv(currentItem.Value, preItem.Value)
-						if val != "" {
-							addSql += GetAddSql(edbInfoIdStr, edbCode, currentItem.DataTime, timestampStr, val)
-							isAdd = true
-						}
-					}
-					existMap[existKey] = currentItem.DataTime
-				}
-			}
-		}
-		if isAdd {
-			addSql = strings.TrimRight(addSql, ",")
-			_, err = to.Raw(addSql).Exec()
-			if err != nil {
-				return edbInfoId, err
-			}
-		}
-	}
-	return
-}
-
-// 刷新环比值数据
-func RefreshCalculateHbz(edbInfoId, source, subSource int, fromEdbInfo *EdbInfo, edbCode, startDate, endDate 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()
-		}
-	}()
-
-	if err != nil {
-		return
-	}
-	edbInfoIdStr := strconv.Itoa(edbInfoId)
-
-	var condition string
-	var pars []interface{}
-	condition += " AND edb_info_id=? "
-	pars = append(pars, fromEdbInfo.EdbInfoId)
-
-	if startDate != "" {
-		condition += " AND data_time>=? "
-		pars = append(pars, startDate)
-	}
-	if endDate != "" {
-		condition += " AND data_time<=? "
-		pars = append(pars, endDate)
-	}
-
-	dataList, err := GetEdbDataListAll(condition, pars, fromEdbInfo.Source, fromEdbInfo.SubSource, 0)
-	if err != nil {
-		return err
-	}
-
-	//获取指标所有数据
-	existDataList := make([]*EdbDataBase, 0)
-	dataTableName := GetEdbDataTableName(source, subSource)
-	fmt.Println("dataTableName:", dataTableName)
-	sql := `SELECT * FROM %s WHERE edb_info_id=? `
-	sql = fmt.Sprintf(sql, dataTableName)
-	_, err = to.Raw(sql, edbInfoId).QueryRows(&existDataList)
-	if err != nil {
-		return err
-	}
-	existDataMap := make(map[string]string)
-	for _, v := range existDataList {
-		existDataMap[v.DataTime] = v.Value
-	}
-	addSql := ` INSERT INTO edb_data_calculate_hbz(edb_info_id,edb_code,data_time,value,create_time,modify_time,status,data_timestamp) values `
-	var isAdd bool
-	existMap := make(map[string]string)
-	dataLen := len(dataList)
-	fmt.Println("dataLen:", dataLen)
-	for i := 0; i < dataLen; i++ {
-		j := i + 1
-		if j < dataLen {
-			//当期
-			currentItem := dataList[i]
-			preItem := dataList[j]
-			if currentItem != nil && preItem != nil {
-				existKey := edbCode + currentItem.DataTime
-				if _, ok := existMap[existKey]; !ok {
-					currentDate, _ := time.Parse(utils.FormatDate, currentItem.DataTime)
-					timestamp := currentDate.UnixNano() / 1e6
-					timestampStr := fmt.Sprintf("%d", timestamp)
-					val := HbzDiv(currentItem.Value, preItem.Value)
-					if val != "" {
-						if existVal, findOk := existDataMap[currentItem.DataTime]; !findOk {
-							addSql += GetAddSql(edbInfoIdStr, edbCode, currentItem.DataTime, timestampStr, val)
-							isAdd = true
-						} else {
-							if existVal != val {
-								sql := ` UPDATE %s SET value=?,modify_time=NOW() WHERE edb_info_id=? AND data_time=? `
-								sql = fmt.Sprintf(sql, dataTableName)
-								_, err = to.Raw(sql, val, edbInfoId, currentItem.DataTime).Exec()
-								if err != nil {
-									return err
-								}
-							}
-						}
-					}
-				}
-				existMap[existKey] = currentItem.DataTime
-			}
-		}
-	}
-	if isAdd {
-		addSql = strings.TrimRight(addSql, ",")
-		_, err = to.Raw(addSql).Exec()
-		if err != nil {
-			return err
-		}
-	}
-	return
-}
-
-type EdbInfoCalculateHbzDetail struct {
-	EdbInfoCalculateTbzId int       `orm:"column(edb_info_calculate_tbz_id);pk"`
-	EdbInfoId             int       `description:"指标id"`
-	EdbCode               string    `description:"指标编码"`
-	FromEdbInfoId         int       `description:"计算指标id"`
-	FromEdbCode           string    `description:"计算指标编码"`
-	FromEdbName           string    `description:"计算指标名称"`
-	FromSource            int       `description:"计算指标来源"`
-	FromSourceName        string    `description:"计算指标来源名称"`
-	FromTag               string    `description:"来源指标标签"`
-	Sort                  int       `description:"计算指标名称排序"`
-	CreateTime            time.Time `description:"创建时间"`
-	ModifyTime            time.Time `description:"修改时间"`
-	StartDate             string    `description:"开始日期"`
-	EndDate               string    `description:"结束日期"`
-}
-
-func GetEdbInfoCalculateHbzDetail(edbInfoId int) (item *EdbInfoCalculateTbzDetail, err error) {
-	o := orm.NewOrmUsingDB("data")
-	sql := ` SELECT a.*,b.start_date,b.end_date FROM edb_info_calculate_mapping AS a
-			INNER JOIN edb_info AS b ON a.from_edb_info_id=b.edb_info_id
-			WHERE a.edb_info_id=? `
-	err = o.Raw(sql, edbInfoId).QueryRow(&item)
-	return
-}
-
-// 刷新所有环比值数据
-func RefreshAllCalculateHbz(edbInfoId, source, subSource int, fromEdbInfo *EdbInfo, edbCode, startDate, endDate string, formulaInt 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 err != nil {
-		return
-	}
-	edbInfoIdStr := strconv.Itoa(edbInfoId)
-	//计算数据
-
-	//计算数据
-	var condition string
-	var pars []interface{}
-	condition += " AND edb_info_id=? "
-	pars = append(pars, fromEdbInfo.EdbInfoId)
-
-	if startDate != "" {
-		condition += " AND data_time>=? "
-		pars = append(pars, startDate)
-	}
-	if endDate != "" {
-		condition += " AND data_time<=? "
-		pars = append(pars, endDate)
-	}
-
-	dataList, err := GetEdbDataListAll(condition, pars, fromEdbInfo.Source, fromEdbInfo.SubSource, 0)
-	if err != nil {
-		return err
-	}
-	var dateArr []string
-	dataMap := make(map[string]*EdbInfoSearchData)
-	for _, v := range dataList {
-		dateArr = append(dateArr, v.DataTime)
-		dataMap[v.DataTime] = v
-	}
-	fmt.Println("source:", source)
-	//获取指标所有数据
-	existDataList := make([]*EdbDataBase, 0)
-	dataTableName := GetEdbDataTableName(source, subSource)
-	fmt.Println("dataTableName:", dataTableName)
-	sql := `SELECT * FROM %s WHERE edb_info_id=? `
-	sql = fmt.Sprintf(sql, dataTableName)
-	_, err = to.Raw(sql, edbInfoId).QueryRows(&existDataList)
-	if err != nil {
-		return err
-	}
-	existDataMap := make(map[string]string)
-	for _, v := range existDataList {
-		existDataMap[v.DataTime] = v.Value
-	}
-	addSql := ` INSERT INTO edb_data_calculate_hbz(edb_info_id,edb_code,data_time,value,create_time,modify_time,status,data_timestamp) values `
-	var isAdd bool
-	existMap := make(map[string]string)
-	dataLen := len(dataList)
-	fmt.Println("dataLen:", dataLen)
-	for i := 0; i < dataLen; i++ {
-		j := i + formulaInt
-		if j < dataLen {
-			//当期
-			currentItem := dataList[i]
-			preItem := dataList[j]
-			if currentItem != nil && preItem != nil {
-				existKey := edbCode + currentItem.DataTime
-
-				if _, ok := existMap[existKey]; !ok {
-					currentDate, _ := time.Parse(utils.FormatDate, currentItem.DataTime)
-					timestamp := currentDate.UnixNano() / 1e6
-					timestampStr := fmt.Sprintf("%d", timestamp)
-					val := HbzDiv(currentItem.Value, preItem.Value)
-					if val != "" {
-						if existVal, findOk := existDataMap[currentItem.DataTime]; !findOk {
-							addSql += GetAddSql(edbInfoIdStr, edbCode, currentItem.DataTime, timestampStr, val)
-							isAdd = true
-						} else {
-							if existVal != val {
-								sql := ` UPDATE %s SET value=?,modify_time=NOW() WHERE edb_info_id=? AND data_time=? `
-								sql = fmt.Sprintf(sql, dataTableName)
-								_, err = to.Raw(sql, val, edbInfoId, currentItem.DataTime).Exec()
-								if err != nil {
-									return err
-								}
-							}
-						}
-					}
-				}
-				existMap[existKey] = currentItem.DataTime
-			}
-		}
-	}
-	if isAdd {
-		addSql = strings.TrimRight(addSql, ",")
-		_, err = to.Raw(addSql).Exec()
-		if err != nil {
-			return err
-		}
-	}
-	return
-}

+ 0 - 540
models/data_manage/edb_info_calculate_hcz.go

@@ -1,540 +0,0 @@
-package data_manage
-
-import (
-	"errors"
-	"eta/eta_api/utils"
-	"fmt"
-	"github.com/beego/beego/v2/client/orm"
-	"github.com/shopspring/decimal"
-	"strconv"
-	"strings"
-	"time"
-)
-
-type EdbInfoCalculateHcz struct {
-	EdbInfoCalculateHczId int       `orm:"column(edb_info_calculate_hcz_id);pk"`
-	EdbInfoId             int       `description:"指标id"`
-	EdbCode               string    `description:"指标编码"`
-	FromEdbInfoId         int       `description:"计算指标id"`
-	FromEdbCode           string    `description:"计算指标编码"`
-	FromEdbName           string    `description:"计算指标名称"`
-	FromSource            int       `description:"计算指标来源"`
-	FromSourceName        string    `description:"计算指标来源名称"`
-	FromTag               string    `description:"来源指标标签"`
-	Sort                  int       `description:"计算指标名称排序"`
-	CreateTime            time.Time `description:"创建时间"`
-	ModifyTime            time.Time `description:"修改时间"`
-}
-
-// 环差值
-func AddCalculateHcz(req *EdbInfoCalculateBatchSaveReq, fromEdbInfo *EdbInfo, edbCode, uniqueCode string, sysUserId int, sysUserRealName string, formulaInt int) (edbInfoId int, err error) {
-	fmt.Println("AddCalculateHcz")
-	o := orm.NewOrmUsingDB("data")
-	to, err := o.Begin()
-	if err != nil {
-		return
-	}
-	defer func() {
-		if err != nil {
-			fmt.Println("AddCalculateHcz,Err:" + err.Error())
-			_ = to.Rollback()
-		} else {
-			_ = to.Commit()
-		}
-	}()
-	if req.EdbInfoId <= 0 {
-		edbInfo := new(EdbInfo)
-		edbInfo.Source = utils.DATA_SOURCE_CALCULATE_HCZ
-		edbInfo.SourceName = "环差值"
-		edbInfo.EdbCode = edbCode
-		edbInfo.EdbName = req.EdbName
-		edbInfo.EdbNameSource = req.EdbName
-		edbInfo.Frequency = req.Frequency
-		edbInfo.Unit = req.Unit
-		edbInfo.ClassifyId = req.ClassifyId
-		edbInfo.SysUserId = sysUserId
-		edbInfo.SysUserRealName = sysUserRealName
-		edbInfo.CreateTime = time.Now()
-		edbInfo.ModifyTime = time.Now()
-		edbInfo.UniqueCode = uniqueCode
-		edbInfo.CalculateFormula = req.Formula
-		edbInfo.EdbType = 2
-		newEdbInfoId, tmpErr := to.Insert(edbInfo)
-		if tmpErr != nil {
-			return edbInfoId, tmpErr
-		}
-		edbInfoId = int(newEdbInfoId)
-
-		//关联关系
-		{
-			calculateMappingItem := new(EdbInfoCalculateMapping)
-			calculateMappingItem.CreateTime = time.Now()
-			calculateMappingItem.ModifyTime = time.Now()
-			calculateMappingItem.Sort = 1
-			calculateMappingItem.EdbCode = edbCode
-			calculateMappingItem.EdbInfoId = edbInfoId
-			calculateMappingItem.FromEdbInfoId = fromEdbInfo.EdbInfoId
-			calculateMappingItem.FromEdbCode = fromEdbInfo.EdbCode
-			calculateMappingItem.FromEdbName = fromEdbInfo.EdbName
-			calculateMappingItem.FromSource = fromEdbInfo.Source
-			calculateMappingItem.FromSourceName = fromEdbInfo.SourceName
-			calculateMappingItem.FromTag = ""
-			calculateMappingItem.Source = edbInfo.Source
-			calculateMappingItem.SourceName = edbInfo.SourceName
-			_, err = to.Insert(calculateMappingItem)
-			if err != nil {
-				return
-			}
-		}
-	} else {
-		edbInfoId = req.EdbInfoId
-		dataTableName := GetEdbDataTableName(utils.DATA_SOURCE_CALCULATE_HCZ, utils.DATA_SUB_SOURCE_EDB)
-		deleteSql := ` DELETE FROM %s WHERE edb_info_id=? `
-		deleteSql = fmt.Sprintf(deleteSql, dataTableName)
-		_, err = to.Raw(deleteSql, req.EdbInfoId).Exec()
-	}
-
-	edbInfoIdStr := strconv.Itoa(edbInfoId)
-	fmt.Println("edbInfoIdStr:" + edbInfoIdStr)
-	//计算数据
-	var condition string
-	var pars []interface{}
-	condition += " AND edb_info_id=? "
-	if req.EdbInfoId <= 0 {
-		pars = append(pars, req.FromEdbInfoId)
-	} else {
-		pars = append(pars, fromEdbInfo.EdbInfoId)
-	}
-	dataList, err := GetEdbDataListAll(condition, pars, fromEdbInfo.Source, fromEdbInfo.SubSource, 0)
-	if err != nil {
-		return edbInfoId, err
-	}
-
-	addSql := ` INSERT INTO edb_data_calculate_hcz(edb_info_id,edb_code,data_time,value,create_time,modify_time,status,data_timestamp) values `
-	var isAdd bool
-	existMap := make(map[string]string)
-	dataLen := len(dataList)
-	fmt.Println("dataLen:", dataLen)
-	for i := 0; i < dataLen; i++ {
-		j := i + formulaInt
-		if j < dataLen {
-			//当期
-			currentItem := dataList[i]
-			preItem := dataList[j]
-			if currentItem != nil && preItem != nil {
-				existKey := edbCode + currentItem.DataTime
-				if _, ok := existMap[existKey]; !ok {
-					currentDate, _ := time.Parse(utils.FormatDate, currentItem.DataTime)
-					timestamp := currentDate.UnixNano() / 1e6
-					timestampStr := fmt.Sprintf("%d", timestamp)
-					val := ""
-					if preItem.Value == 0 {
-						val = "0"
-					} else {
-						val = HczDiv(currentItem.Value, preItem.Value)
-					}
-					if val != "" {
-						addSql += GetAddSql(edbInfoIdStr, edbCode, currentItem.DataTime, timestampStr, val)
-						isAdd = true
-					}
-				}
-				existMap[existKey] = currentItem.DataTime
-			}
-		}
-	}
-	if isAdd {
-		addSql = strings.TrimRight(addSql, ",")
-		_, err = to.Raw(addSql).Exec()
-		if err != nil {
-			return edbInfoId, err
-		}
-	}
-	return
-}
-
-// 环差值,current:当期,pre:上期 公式:当期-上期
-func HczDiv(current, pre float64) string {
-	if pre == 0 {
-		return ""
-	}
-	currentVal := decimal.NewFromFloat(current)
-	preVal := decimal.NewFromFloat(pre)
-	val, _ := currentVal.Sub(preVal).Float64()
-	valStr := utils.SubFloatToString(val, 4)
-	return valStr
-}
-
-// 环比值
-func EditCalculateHcz(req *EdbInfoCalculateBatchEditReq, fromEdbInfo *EdbInfo, edbCode string, formulaInt int, calculateFormula string) (edbInfoId int, err error) {
-	edbInfoId = req.EdbInfoId
-	o := orm.NewOrmUsingDB("data")
-	to, err := o.Begin()
-	if err != nil {
-		return
-	}
-	defer func() {
-		if err != nil {
-			_ = to.Rollback()
-		} else {
-			_ = to.Commit()
-		}
-	}()
-
-	//修改指标信息
-	sql := ` UPDATE  edb_info
-			SET
-			  edb_name =?,
-			  edb_name_source=?,
-			  frequency = ?,
-			  unit = ?,
-			  classify_id = ?,
- 			  calculate_formula=?,
-			  modify_time = NOW()
-			WHERE edb_info_id = ? `
-	_, err = to.Raw(sql, req.EdbName, req.EdbName, req.Frequency, req.Unit, req.ClassifyId, req.Formula, edbInfoId).Exec()
-	if err != nil {
-		return
-	}
-
-	var existCondition string
-	var existPars []interface{}
-	existCondition += " AND edb_info_id=? "
-	existPars = append(existPars, edbInfoId)
-
-	existCondition += " AND from_edb_info_id=? "
-	existPars = append(existPars, req.FromEdbInfoId)
-
-	//判断计算指标是否被更换
-	count, err := GetEdbInfoCalculateCountByCondition(req.Source, existCondition, existPars)
-	if err != nil {
-		err = errors.New("判断指标是否改变失败,Err:" + err.Error())
-		return
-	}
-
-	if count <= 0 || strconv.Itoa(formulaInt) != calculateFormula {
-		//删除,计算指标关联的,基础指标的关联关系
-		if count <= 0 {
-			sql = ` DELETE FROM edb_info_calculate_mapping WHERE edb_info_id = ? `
-			_, err = to.Raw(sql, edbInfoId).Exec()
-			if err != nil {
-				return edbInfoId, err
-			}
-			//关联关系
-			{
-				calculateMappingItem := new(EdbInfoCalculateMapping)
-				calculateMappingItem.CreateTime = time.Now()
-				calculateMappingItem.ModifyTime = time.Now()
-				calculateMappingItem.Sort = 1
-				calculateMappingItem.EdbCode = edbCode
-				calculateMappingItem.EdbInfoId = edbInfoId
-				calculateMappingItem.FromEdbInfoId = fromEdbInfo.EdbInfoId
-				calculateMappingItem.FromEdbCode = fromEdbInfo.EdbCode
-				calculateMappingItem.FromEdbName = fromEdbInfo.EdbName
-				calculateMappingItem.FromSource = fromEdbInfo.Source
-				calculateMappingItem.FromSourceName = fromEdbInfo.SourceName
-				calculateMappingItem.FromTag = ""
-				calculateMappingItem.Source = utils.DATA_SOURCE_CALCULATE_HCZ
-				calculateMappingItem.SourceName = "环差值"
-				_, err = to.Insert(calculateMappingItem)
-				if err != nil {
-					return
-				}
-			}
-		}
-		//清空原有数据
-		sql = ` DELETE FROM edb_data_calculate_hcz WHERE edb_info_id = ? `
-		_, err = to.Raw(sql, edbInfoId).Exec()
-		if err != nil {
-			return edbInfoId, err
-		}
-		edbInfoIdStr := strconv.Itoa(edbInfoId)
-		fmt.Println("edbInfoIdStr:" + edbInfoIdStr)
-		//计算数据
-		var condition string
-		var pars []interface{}
-		condition += " AND edb_info_id=? "
-		pars = append(pars, req.FromEdbInfoId)
-		fmt.Println("EdbInfoId:", req.FromEdbInfoId)
-		dataList, err := GetEdbDataListAll(condition, pars, fromEdbInfo.Source, fromEdbInfo.SubSource, 0)
-		if err != nil {
-			return edbInfoId, err
-		}
-		var dateArr []string
-		dataMap := make(map[string]*EdbInfoSearchData)
-		for _, v := range dataList {
-			dateArr = append(dateArr, v.DataTime)
-			dataMap[v.DataTime] = v
-		}
-
-		addSql := ` INSERT INTO edb_data_calculate_hcz(edb_info_id,edb_code,data_time,value,create_time,modify_time,status,data_timestamp) values `
-		var isAdd bool
-		existMap := make(map[string]string)
-		dataLen := len(dataList)
-		fmt.Println("dataLen:", dataLen)
-		for i := 0; i < dataLen; i++ {
-			j := i + formulaInt
-			if j < dataLen {
-				//当期
-				currentItem := dataList[i]
-				preItem := dataList[j]
-				if currentItem != nil && preItem != nil {
-					existKey := edbCode + currentItem.DataTime
-					if _, ok := existMap[existKey]; !ok {
-						currentDate, _ := time.Parse(utils.FormatDate, currentItem.DataTime)
-						timestamp := currentDate.UnixNano() / 1e6
-						timestampStr := fmt.Sprintf("%d", timestamp)
-						val := HczDiv(currentItem.Value, preItem.Value)
-						if val != "" {
-							addSql += GetAddSql(edbInfoIdStr, edbCode, currentItem.DataTime, timestampStr, val)
-							isAdd = true
-						}
-					}
-					existMap[existKey] = currentItem.DataTime
-				}
-			}
-		}
-		if isAdd {
-			addSql = strings.TrimRight(addSql, ",")
-			_, err = to.Raw(addSql).Exec()
-			if err != nil {
-				return edbInfoId, err
-			}
-		}
-	}
-	return
-}
-
-// 刷新环比值数据
-func RefreshCalculateHcz(edbInfoId, source, subSource int, fromEdbInfo *EdbInfo, edbCode, startDate, endDate 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()
-		}
-	}()
-
-	if err != nil {
-		return
-	}
-	edbInfoIdStr := strconv.Itoa(edbInfoId)
-
-	var condition string
-	var pars []interface{}
-	condition += " AND edb_info_id=? "
-	pars = append(pars, fromEdbInfo.EdbInfoId)
-
-	if startDate != "" {
-		condition += " AND data_time>=? "
-		pars = append(pars, startDate)
-	}
-	if endDate != "" {
-		condition += " AND data_time<=? "
-		pars = append(pars, endDate)
-	}
-
-	dataList, err := GetEdbDataListAll(condition, pars, fromEdbInfo.Source, fromEdbInfo.SubSource, 0)
-	if err != nil {
-		return err
-	}
-
-	//获取指标所有数据
-	existDataList := make([]*EdbDataBase, 0)
-	dataTableName := GetEdbDataTableName(source, subSource)
-	fmt.Println("dataTableName:", dataTableName)
-	sql := `SELECT * FROM %s WHERE edb_info_id=? `
-	sql = fmt.Sprintf(sql, dataTableName)
-	_, err = to.Raw(sql, edbInfoId).QueryRows(&existDataList)
-	if err != nil {
-		return err
-	}
-	existDataMap := make(map[string]string)
-	for _, v := range existDataList {
-		existDataMap[v.DataTime] = v.Value
-	}
-	addSql := ` INSERT INTO edb_data_calculate_hcz(edb_info_id,edb_code,data_time,value,create_time,modify_time,status,data_timestamp) values `
-	var isAdd bool
-	existMap := make(map[string]string)
-	dataLen := len(dataList)
-	for i := 0; i < dataLen; i++ {
-		j := i + 1
-		if j < dataLen {
-			//当期
-			currentItem := dataList[i]
-			preItem := dataList[j]
-			if currentItem != nil && preItem != nil {
-				existKey := edbCode + currentItem.DataTime
-				if _, ok := existMap[existKey]; !ok {
-					currentDate, _ := time.Parse(utils.FormatDate, currentItem.DataTime)
-					timestamp := currentDate.UnixNano() / 1e6
-					timestampStr := fmt.Sprintf("%d", timestamp)
-					val := HczDiv(currentItem.Value, preItem.Value)
-					if val != "" {
-						if existVal, findOk := existDataMap[currentItem.DataTime]; !findOk {
-							addSql += GetAddSql(edbInfoIdStr, edbCode, currentItem.DataTime, timestampStr, val)
-							isAdd = true
-						} else {
-							if existVal != val {
-								sql := ` UPDATE %s SET value=?,modify_time=NOW() WHERE edb_info_id=? AND data_time=? `
-								sql = fmt.Sprintf(sql, dataTableName)
-								_, err = to.Raw(sql, val, edbInfoId, currentItem.DataTime).Exec()
-								if err != nil {
-									return err
-								}
-							}
-						}
-					}
-				}
-				existMap[existKey] = currentItem.DataTime
-			}
-		}
-	}
-	if isAdd {
-		addSql = strings.TrimRight(addSql, ",")
-		_, err = to.Raw(addSql).Exec()
-		if err != nil {
-			return err
-		}
-	}
-	return
-}
-
-type EdbInfoCalculateHczDetail struct {
-	EdbInfoCalculateHczId int       `orm:"column(edb_info_calculate_hcz_id);pk"`
-	EdbInfoId             int       `description:"指标id"`
-	EdbCode               string    `description:"指标编码"`
-	FromEdbInfoId         int       `description:"计算指标id"`
-	FromEdbCode           string    `description:"计算指标编码"`
-	FromEdbName           string    `description:"计算指标名称"`
-	FromSource            int       `description:"计算指标来源"`
-	FromSourceName        string    `description:"计算指标来源名称"`
-	FromTag               string    `description:"来源指标标签"`
-	Sort                  int       `description:"计算指标名称排序"`
-	CreateTime            time.Time `description:"创建时间"`
-	ModifyTime            time.Time `description:"修改时间"`
-	StartDate             string    `description:"开始日期"`
-	EndDate               string    `description:"结束日期"`
-}
-
-func GetEdbInfoCalculateHczDetail(edbInfoId int) (item *EdbInfoCalculateHczDetail, err error) {
-	o := orm.NewOrmUsingDB("data")
-	sql := ` SELECT a.*,b.start_date,b.end_date FROM edb_info_calculate_mapping AS a
-			INNER JOIN edb_info AS b ON a.from_edb_info_id=b.edb_info_id
-			WHERE a.edb_info_id=? `
-	err = o.Raw(sql, edbInfoId).QueryRow(&item)
-	return
-}
-
-// 刷新所有环差值数据
-func RefreshAllCalculateHcz(edbInfoId, source, subSource int, fromEdbInfo *EdbInfo, edbCode, startDate, endDate string, formulaInt 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 err != nil {
-		return
-	}
-	edbInfoIdStr := strconv.Itoa(edbInfoId)
-
-	//计算数据
-	var condition string
-	var pars []interface{}
-	condition += " AND edb_info_id=? "
-	pars = append(pars, fromEdbInfo.EdbInfoId)
-
-	if startDate != "" {
-		condition += " AND data_time>=? "
-		pars = append(pars, startDate)
-	}
-	if endDate != "" {
-		condition += " AND data_time<=? "
-		pars = append(pars, endDate)
-	}
-
-	dataList, err := GetEdbDataListAll(condition, pars, fromEdbInfo.Source, fromEdbInfo.SubSource, 0)
-	if err != nil {
-		return err
-	}
-	var dateArr []string
-	dataMap := make(map[string]*EdbInfoSearchData)
-	for _, v := range dataList {
-		dateArr = append(dateArr, v.DataTime)
-		dataMap[v.DataTime] = v
-	}
-	fmt.Println("source:", source)
-	//获取指标所有数据
-	existDataList := make([]*EdbDataBase, 0)
-	dataTableName := GetEdbDataTableName(source, subSource)
-	fmt.Println("dataTableName:", dataTableName)
-	sql := `SELECT * FROM %s WHERE edb_info_id=? `
-	sql = fmt.Sprintf(sql, dataTableName)
-	_, err = to.Raw(sql, edbInfoId).QueryRows(&existDataList)
-	if err != nil {
-		return err
-	}
-	existDataMap := make(map[string]string)
-	for _, v := range existDataList {
-		existDataMap[v.DataTime] = v.Value
-	}
-	fmt.Println("existDataMap:", existDataMap)
-	addSql := ` INSERT INTO edb_data_calculate_hcz(edb_info_id,edb_code,data_time,value,create_time,modify_time,status,data_timestamp) values `
-	var isAdd bool
-	existMap := make(map[string]string)
-	dataLen := len(dataList)
-	fmt.Println("dataLen:", dataLen)
-	for i := 0; i < dataLen; i++ {
-		j := i + formulaInt
-		if j < dataLen {
-			//当期
-			currentItem := dataList[i]
-			preItem := dataList[j]
-			if currentItem != nil && preItem != nil {
-				existKey := edbCode + currentItem.DataTime
-				if _, ok := existMap[existKey]; !ok {
-					currentDate, _ := time.Parse(utils.FormatDate, currentItem.DataTime)
-					timestamp := currentDate.UnixNano() / 1e6
-					timestampStr := fmt.Sprintf("%d", timestamp)
-					val := HczDiv(currentItem.Value, preItem.Value)
-					if val != "" {
-						if existVal, findOk := existDataMap[currentItem.DataTime]; !findOk {
-							addSql += GetAddSql(edbInfoIdStr, edbCode, currentItem.DataTime, timestampStr, val)
-							isAdd = true
-						} else {
-							if existVal != val {
-								sql := ` UPDATE %s SET value=?,modify_time=NOW() WHERE edb_info_id=? AND data_time=? `
-								sql = fmt.Sprintf(sql, dataTableName)
-								_, err = to.Raw(sql, val, edbInfoId, currentItem.DataTime).Exec()
-								if err != nil {
-									return err
-								}
-							}
-						}
-					}
-				}
-				existMap[existKey] = currentItem.DataTime
-			}
-		}
-	}
-	if isAdd {
-		addSql = strings.TrimRight(addSql, ",")
-		_, err = to.Raw(addSql).Exec()
-		if err != nil {
-			return err
-		}
-	}
-	return
-}

+ 0 - 650
models/data_manage/edb_info_calculate_ljztbpj.go

@@ -1,650 +0,0 @@
-package data_manage
-
-import (
-	"errors"
-	"eta/eta_api/utils"
-	"fmt"
-	"github.com/beego/beego/v2/client/orm"
-	"github.com/shopspring/decimal"
-	"sort"
-	"strings"
-	"time"
-)
-
-// AddCalculateLjztbpj 新增累计值同比拼接数据
-func AddCalculateLjztbpj(req *EdbInfoCalculateBatchSaveReq, firstEdbInfo, secondEdbInfo *EdbInfo, edbCode, uniqueCode string, sysUserId int, sysUserRealName string) (edbInfoId int, err error) {
-	fmt.Println("AddCalculateLjztbpj")
-	o := orm.NewOrmUsingDB("data")
-	to, err := o.Begin()
-	if err != nil {
-		return
-	}
-	defer func() {
-		if err != nil {
-			fmt.Println("AddCalculateLjztbpj,Err:" + err.Error())
-			_ = to.Rollback()
-		} else {
-			_ = to.Commit()
-		}
-	}()
-	//待拼接指标map
-	pjDataMap := make(map[string]float64)
-
-	//拼接指标的日期切片数据
-	pjEdbDataTimeList := make([]string, 0)
-
-	//最近开始的时间
-	var lastDateTime time.Time
-	//获取待拼接指标
-	{
-		var condition string
-		var pars []interface{}
-
-		//获取待拼接指标最近的个12月31日有值的年份
-		condition += " AND data_time like ? AND edb_info_id=? "
-		pars = append(pars, "%12-31", firstEdbInfo.EdbInfoId)
-
-		lastEdbData, tmpErr := GetLastEdbData(condition, pars, firstEdbInfo.Source, firstEdbInfo.SubSource)
-		if tmpErr != nil {
-			return edbInfoId, tmpErr
-		}
-		lastDateTime, _ = time.ParseInLocation(utils.FormatDate, lastEdbData.DataTime, time.Local)
-
-		//获取待拼接指标的数据列表
-		condition = ``
-		pars = make([]interface{}, 0)
-		condition += " AND data_time <= ? AND edb_info_id=? "
-		pars = append(pars, lastEdbData.DataTime, firstEdbInfo.EdbInfoId)
-
-		firstDataList, tmpErr := GetEdbDataListAll(condition, pars, firstEdbInfo.Source, firstEdbInfo.SubSource, 0)
-		if tmpErr != nil {
-			return edbInfoId, tmpErr
-		}
-
-		for _, v := range firstDataList {
-			pjDataMap[v.DataTime] = v.Value
-			pjEdbDataTimeList = append(pjEdbDataTimeList, v.DataTime)
-		}
-	}
-
-	var edbInfo *EdbInfo
-	if req.EdbInfoId <= 0 {
-		edbInfo = &EdbInfo{
-			SourceName:       "累计值同比拼接",
-			Source:           utils.DATA_SOURCE_CALCULATE_LJZTBPJ,
-			EdbCode:          edbCode,
-			EdbName:          req.EdbName,
-			EdbNameSource:    req.EdbName,
-			Frequency:        req.Frequency,
-			Unit:             req.Unit,
-			StartDate:        firstEdbInfo.StartDate,
-			EndDate:          firstEdbInfo.EndDate,
-			ClassifyId:       req.ClassifyId,
-			SysUserId:        sysUserId,
-			SysUserRealName:  sysUserRealName,
-			UniqueCode:       uniqueCode,
-			CreateTime:       time.Now(),
-			ModifyTime:       time.Now(),
-			CalculateFormula: lastDateTime.Format(utils.FormatDate),
-			EdbType:          2,
-		}
-		newEdbInfoId, err := to.Insert(edbInfo)
-		if err != nil {
-			return edbInfoId, err
-		}
-		edbInfoId = int(newEdbInfoId)
-	} else {
-		edbInfoId = req.EdbInfoId
-		//查询
-		tmpEdbInfo, tmpErr := GetEdbInfoById(edbInfoId)
-		if tmpErr != nil {
-			err = tmpErr
-			return
-		}
-		tmpEdbInfo.EdbName = req.EdbName
-		tmpEdbInfo.ClassifyId = req.ClassifyId
-		tmpEdbInfo.Frequency = req.Frequency
-		tmpEdbInfo.Unit = req.Unit
-		tmpEdbInfo.CalculateFormula = req.Formula
-
-		edbInfo = tmpEdbInfo
-
-		//删除指标数据
-		dataTableName := GetEdbDataTableName(utils.DATA_SOURCE_CALCULATE_LJZTBPJ, utils.DATA_SUB_SOURCE_EDB)
-		fmt.Println("dataTableName:" + dataTableName)
-		deleteSql := ` DELETE FROM %s WHERE edb_info_id=? `
-		deleteSql = fmt.Sprintf(deleteSql, dataTableName)
-		_, err = to.Raw(deleteSql, req.EdbInfoId).Exec()
-		if err != nil {
-			return 0, err
-		}
-
-		//删除指标关系
-		sql := ` DELETE FROM edb_info_calculate_mapping WHERE edb_info_id=? `
-		_, err = to.Raw(sql, edbInfoId).Exec()
-	}
-
-	//关联关系
-
-	//拼接指标
-	{
-		calculateMappingItem := new(EdbInfoCalculateMapping)
-		calculateMappingItem.CreateTime = time.Now()
-		calculateMappingItem.ModifyTime = time.Now()
-		calculateMappingItem.Sort = 1
-		calculateMappingItem.EdbCode = edbCode
-		calculateMappingItem.EdbInfoId = edbInfoId
-		calculateMappingItem.FromEdbInfoId = firstEdbInfo.EdbInfoId
-		calculateMappingItem.FromEdbCode = firstEdbInfo.EdbCode
-		calculateMappingItem.FromEdbName = firstEdbInfo.EdbName
-		calculateMappingItem.FromSource = firstEdbInfo.Source
-		calculateMappingItem.FromSourceName = firstEdbInfo.SourceName
-		calculateMappingItem.FromTag = "A"
-		calculateMappingItem.Source = edbInfo.Source
-		calculateMappingItem.SourceName = edbInfo.SourceName
-		_, err = to.Insert(calculateMappingItem)
-		if err != nil {
-			return
-		}
-	}
-
-	//同比值指标
-	{
-		calculateMappingItem := new(EdbInfoCalculateMapping)
-		calculateMappingItem.CreateTime = time.Now()
-		calculateMappingItem.ModifyTime = time.Now()
-		calculateMappingItem.Sort = 1
-		calculateMappingItem.EdbCode = edbCode
-		calculateMappingItem.EdbInfoId = edbInfoId
-		calculateMappingItem.FromEdbInfoId = secondEdbInfo.EdbInfoId
-		calculateMappingItem.FromEdbCode = secondEdbInfo.EdbCode
-		calculateMappingItem.FromEdbName = secondEdbInfo.EdbName
-		calculateMappingItem.FromSource = secondEdbInfo.Source
-		calculateMappingItem.FromSourceName = secondEdbInfo.SourceName
-		calculateMappingItem.FromTag = "B"
-		calculateMappingItem.Source = edbInfo.Source
-		calculateMappingItem.SourceName = edbInfo.SourceName
-		_, err = to.Insert(calculateMappingItem)
-		if err != nil {
-			return
-		}
-	}
-
-	//同比值指标map
-	tbzEdbDataMap := make(map[string]float64)
-
-	//同比值日期切片列表
-	tbzEdbDataTimeList := make([]string, 0)
-
-	//同比值指标
-	{
-		var condition string
-		var pars []interface{}
-
-		condition += " AND data_time > ? AND edb_info_id = ? "
-		pars = append(pars, lastDateTime, secondEdbInfo.EdbInfoId)
-
-		//同比值指标的数据列表
-		secondDataList, tmpErr := GetEdbDataListAll(condition, pars, secondEdbInfo.Source, secondEdbInfo.SubSource, 0)
-		if tmpErr != nil {
-			return edbInfoId, tmpErr
-		}
-
-		for _, v := range secondDataList {
-			tbzEdbDataMap[v.DataTime] = v.Value
-			tbzEdbDataTimeList = append(tbzEdbDataTimeList, v.DataTime)
-		}
-	}
-
-	sort.Strings(tbzEdbDataTimeList)
-	for _, v := range tbzEdbDataTimeList {
-		tbzDataTime, _ := time.ParseInLocation(utils.FormatDate, v, time.Local)
-
-		//获取拼接指标上一年同一天的数据
-		var pjDataTime time.Time
-		if tbzDataTime.Month() == 2 {
-			pjDataTime = tbzDataTime.AddDate(0, -11, 0)
-			pjDataTime = time.Date(pjDataTime.Year(), pjDataTime.Month(), 1, 0, 0, 0, 0, time.Now().Location()).AddDate(0, 0, -1)
-		} else {
-			pjDataTime = tbzDataTime.AddDate(-1, 0, 0)
-		}
-
-		//如果存在数据,那么就去计算当前的数据
-		if pjDataValue, ok := pjDataMap[pjDataTime.Format(utils.FormatDate)]; ok {
-			tbzDataValue := tbzEdbDataMap[v] //同比值
-			currValue := pjDataValue * (1 + tbzDataValue/100)
-
-			currValue, _ = decimal.NewFromFloat(currValue).Truncate(4).Float64()
-			//将计算后的数据存入待拼接指标map里面,以便后续计算
-			pjDataMap[v] = currValue
-
-			pjEdbDataTimeList = append(pjEdbDataTimeList, v)
-		}
-	}
-
-	addDataList := make([]*EdbDataCalculateLjztbpj, 0)
-
-	//日期排序下
-	sort.Strings(pjEdbDataTimeList)
-	//这么做的目的是为了让数据插入的时候,可以正序插入(业务上没啥卵用,就是为了让我看数据的时候舒服点,手动狗头-_-|)
-	for _, dataTime := range pjEdbDataTimeList {
-		if dataValue, ok := pjDataMap[dataTime]; ok {
-			//时间戳
-			currentDate, _ := time.Parse(utils.FormatDate, dataTime)
-			timestamp := currentDate.UnixNano() / 1e6
-
-			edbDataLjztbpj := &EdbDataCalculateLjztbpj{
-				EdbInfoId:     edbInfoId,
-				EdbCode:       edbInfo.EdbCode,
-				DataTime:      dataTime,
-				Value:         dataValue,
-				Status:        1,
-				CreateTime:    time.Now(),
-				ModifyTime:    time.Now(),
-				DataTimestamp: timestamp,
-			}
-			addDataList = append(addDataList, edbDataLjztbpj)
-		}
-	}
-
-	//数据入库
-	tmpAddDataList := make([]*EdbDataCalculateLjztbpj, 0)
-	for _, v := range addDataList {
-		tmpAddDataList = append(tmpAddDataList, v)
-
-		if len(tmpAddDataList) >= 200 {
-			_, tmpErr := to.InsertMulti(len(tmpAddDataList), tmpAddDataList)
-			if tmpErr != nil {
-				err = tmpErr
-				return
-			}
-			//重新初始化需要加入的数据切片
-			tmpAddDataList = make([]*EdbDataCalculateLjztbpj, 0)
-		}
-	}
-	//最后如果还有需要新增的数据,那么就统一入库
-	if len(tmpAddDataList) > 0 {
-		_, tmpErr := to.InsertMulti(len(tmpAddDataList), tmpAddDataList)
-		if tmpErr != nil {
-			err = tmpErr
-			return
-		}
-	}
-
-	return
-}
-
-// EditCalculateLjztbpj 编辑累计值同比拼接数据
-func EditCalculateLjztbpj(req *EdbInfoCalculateBatchEditReq, nowEdbInfo, firstEdbInfo, secondEdbInfo *EdbInfo) (edbInfoId int, err error) {
-	edbInfoId = req.EdbInfoId
-	o := orm.NewOrmUsingDB("data")
-	to, err := o.Begin()
-	if err != nil {
-		return
-	}
-	defer func() {
-		if err != nil {
-			_ = to.Rollback()
-		} else {
-			_ = to.Commit()
-		}
-	}()
-
-	sql := ``
-
-	var existCondition string
-	var existPars []interface{}
-	existCondition += " AND edb_info_id=? "
-	existPars = append(existPars, edbInfoId)
-
-	//查询出所有的关联指标
-	existList, err := GetEdbInfoCalculateListByCondition(existCondition, existPars)
-	if err != nil {
-		err = errors.New("判断指标是否改变失败,Err:" + err.Error())
-		return
-	}
-
-	var existItemA, existItemB *EdbInfoCalculateMapping
-	for _, existItem := range existList {
-		if existItem.FromTag == "A" {
-			existItemA = existItem
-		} else if existItem.FromTag == "B" {
-			existItemB = existItem
-		}
-	}
-	// 原数据开始计算日期
-	startCalculationDate, _ := time.ParseInLocation(utils.FormatDate, nowEdbInfo.CalculateFormula, time.Local)
-
-	//待拼接指标map
-	pjDataMap := make(map[string]float64)     //需要入库的数据
-	nowEdbDataMap := make(map[string]float64) //当前指标的数据(已经在库里了,不需要重新)
-
-	//拼接指标的日期切片数据
-	pjEdbDataTimeList := make([]string, 0)
-
-	//最近开始的时间
-	lastDateTime := startCalculationDate
-
-	//待拼接指标数据
-	{
-		//如果拼接指标变更了,那么需要删除所有的指标进行重新拼接
-		if existItemA.FromEdbInfoId != firstEdbInfo.EdbInfoId {
-			//删除旧的指标数据
-			{
-				//删除之前的A指标关联关系
-				sql = ` DELETE FROM edb_info_calculate_mapping WHERE edb_info_id = ? and from_edb_info_id = ?`
-				_, err = to.Raw(sql, edbInfoId, existItemA.FromEdbInfoId).Exec()
-				if err != nil {
-					err = errors.New("删除拼接日期之前的指标关联关系失败,Err:" + err.Error())
-					return
-				}
-
-				//如果拼接指标变更了,那么需要删除所有的指标数据
-				tableName := GetEdbDataTableName(nowEdbInfo.Source, nowEdbInfo.SubSource)
-				sql = fmt.Sprintf(` DELETE FROM %s WHERE edb_info_id = ? `, tableName)
-
-				_, err = to.Raw(sql, edbInfoId).Exec()
-				if err != nil {
-					err = errors.New("删除所有的累计值同比拼接指标数据失败,Err:" + err.Error())
-					return
-				}
-			}
-
-			//添加新的指标关系
-			{
-				calculateMappingItem := new(EdbInfoCalculateMapping)
-				calculateMappingItem.CreateTime = time.Now()
-				calculateMappingItem.ModifyTime = time.Now()
-				calculateMappingItem.Sort = 1
-				calculateMappingItem.EdbCode = nowEdbInfo.EdbCode
-				calculateMappingItem.EdbInfoId = edbInfoId
-				calculateMappingItem.FromEdbInfoId = firstEdbInfo.EdbInfoId
-				calculateMappingItem.FromEdbCode = firstEdbInfo.EdbCode
-				calculateMappingItem.FromEdbName = firstEdbInfo.EdbName
-				calculateMappingItem.FromSource = firstEdbInfo.Source
-				calculateMappingItem.FromSourceName = firstEdbInfo.SourceName
-				calculateMappingItem.FromTag = "A"
-				calculateMappingItem.Source = nowEdbInfo.Source
-				calculateMappingItem.SourceName = nowEdbInfo.SourceName
-				_, err = to.Insert(calculateMappingItem)
-				if err != nil {
-					return
-				}
-			}
-
-			var condition string
-			var pars []interface{}
-
-			//获取待拼接指标最近的个12月31日有值的年份
-			condition += " AND data_time like ? AND edb_info_id=? "
-			pars = append(pars, "%12-31", firstEdbInfo.EdbInfoId)
-
-			//获取最新的待拼接指标
-			lastEdbData, tmpErr := GetLastEdbData(condition, pars, firstEdbInfo.Source, firstEdbInfo.SubSource)
-			if tmpErr != nil {
-				return edbInfoId, tmpErr
-			}
-			lastDateTime, _ = time.ParseInLocation(utils.FormatDate, lastEdbData.DataTime, time.Local)
-
-			//获取待拼接指标的数据列表
-			condition = ``
-			pars = make([]interface{}, 0)
-			condition += " AND data_time <= ? AND edb_info_id=? "
-			pars = append(pars, lastEdbData.DataTime, firstEdbInfo.EdbInfoId)
-
-			firstDataList, tmpErr := GetEdbDataListAll(condition, pars, firstEdbInfo.Source, firstEdbInfo.SubSource, 0)
-			if tmpErr != nil {
-				return edbInfoId, tmpErr
-			}
-
-			for _, v := range firstDataList {
-				pjDataMap[v.DataTime] = v.Value
-				pjEdbDataTimeList = append(pjEdbDataTimeList, v.DataTime)
-
-				//将新的数据存入已入库指标map里面,以便后续计算
-				nowEdbDataMap[v.DataTime] = v.Value
-			}
-		} else {
-			// 获取当前指标的所有数据
-			var condition string
-			var pars []interface{}
-			condition += " AND edb_info_id=? and data_time <= ?"
-			pars = append(pars, nowEdbInfo.EdbInfoId, nowEdbInfo.CalculateFormula)
-
-			nowEdbDataList, tmpErr := GetEdbDataListAll(condition, pars, nowEdbInfo.Source, nowEdbInfo.SubSource, 0)
-			if tmpErr != nil {
-				return edbInfoId, tmpErr
-			}
-
-			for _, v := range nowEdbDataList {
-				nowEdbDataMap[v.DataTime] = v.Value
-				pjEdbDataTimeList = append(pjEdbDataTimeList, v.DataTime)
-			}
-		}
-	}
-
-	//同比值指标map
-	tbzEdbDataMap := make(map[string]float64)
-
-	//同比值日期切片列表
-	tbzEdbDataTimeList := make([]string, 0)
-
-	//同比值指标
-	{
-		if existItemB.FromEdbInfoId != secondEdbInfo.EdbInfoId {
-			//删除通过B指标生成的数据
-			{
-				//删除之前的B指标关联关系
-				sql = ` DELETE FROM edb_info_calculate_mapping WHERE edb_info_id = ? and from_edb_info_id = ?`
-				_, err = to.Raw(sql, edbInfoId, existItemB.FromEdbInfoId).Exec()
-				if err != nil {
-					err = errors.New("删除拼接日期之后的指标关联关系失败,Err:" + err.Error())
-					return
-				}
-
-				//如果同比值指标变更了,那么需要删除所有计算出来的指标数据
-				tableName := GetEdbDataTableName(nowEdbInfo.Source, nowEdbInfo.SubSource)
-				sql = fmt.Sprintf(` DELETE FROM %s WHERE edb_info_id = ? and data_time > ? `, tableName)
-
-				_, err = to.Raw(sql, edbInfoId, nowEdbInfo.CalculateFormula).Exec()
-				if err != nil {
-					err = errors.New("删除计算出来的累计值同比拼接指标数据失败,Err:" + err.Error())
-					return
-				}
-			}
-
-			//添加新的指标关系
-			{
-				calculateMappingItem := new(EdbInfoCalculateMapping)
-				calculateMappingItem.CreateTime = time.Now()
-				calculateMappingItem.ModifyTime = time.Now()
-				calculateMappingItem.Sort = 1
-				calculateMappingItem.EdbCode = nowEdbInfo.EdbCode
-				calculateMappingItem.EdbInfoId = edbInfoId
-				calculateMappingItem.FromEdbInfoId = secondEdbInfo.EdbInfoId
-				calculateMappingItem.FromEdbCode = secondEdbInfo.EdbCode
-				calculateMappingItem.FromEdbName = secondEdbInfo.EdbName
-				calculateMappingItem.FromSource = secondEdbInfo.Source
-				calculateMappingItem.FromSourceName = secondEdbInfo.SourceName
-				calculateMappingItem.FromTag = "B"
-				calculateMappingItem.Source = nowEdbInfo.Source
-				calculateMappingItem.SourceName = nowEdbInfo.SourceName
-				_, err = to.Insert(calculateMappingItem)
-				if err != nil {
-					return
-				}
-			}
-		}
-
-		var condition string
-		var pars []interface{}
-
-		condition += " AND data_time > ? AND edb_info_id = ? "
-		pars = append(pars, lastDateTime, secondEdbInfo.EdbInfoId)
-
-		//同比值指标的数据列表
-		secondDataList, tmpErr := GetEdbDataListAll(condition, pars, secondEdbInfo.Source, secondEdbInfo.SubSource, 0)
-		if tmpErr != nil {
-			return edbInfoId, tmpErr
-		}
-
-		for _, v := range secondDataList {
-			tbzEdbDataMap[v.DataTime] = v.Value
-			tbzEdbDataTimeList = append(tbzEdbDataTimeList, v.DataTime)
-		}
-	}
-
-	sort.Strings(tbzEdbDataTimeList)
-
-	// 遍历现有的数据,判断拼接指标中是否存在该日期数据,如果拼接指标无此数据,那么需要删除该日期数据(日期的判断:需要在开始计算日期之后)
-	removeDateList := make([]string, 0)
-	for nowEdbDate := range nowEdbDataMap {
-		nowEdbDateTime, _ := time.ParseInLocation(utils.FormatDate, nowEdbDate, time.Local)
-		//校验日期 需要 大于 拼接前日期
-		if startCalculationDate.Before(nowEdbDateTime) {
-			if _, ok := tbzEdbDataMap[nowEdbDate]; !ok {
-				// 同比指标中,不存在该日期数据,那么需要移除 现有数据 中该日期的数据
-				removeDateList = append(removeDateList, nowEdbDate)
-			}
-		}
-	}
-
-	//待修改的指标数据map(index:日期,value:值)
-	updateEdbDataMap := make(map[string]float64)
-	for _, v := range tbzEdbDataTimeList {
-		tbzDataTime, _ := time.ParseInLocation(utils.FormatDate, v, time.Local)
-
-		//获取拼接指标上一年同一天的数据
-		var pjDataTime time.Time
-		if tbzDataTime.Month() == 2 {
-			pjDataTime = tbzDataTime.AddDate(0, -11, 0)
-			pjDataTime = time.Date(pjDataTime.Year(), pjDataTime.Month(), 1, 0, 0, 0, 0, time.Now().Location()).AddDate(0, 0, -1)
-		} else {
-			pjDataTime = tbzDataTime.AddDate(-1, 0, 0)
-		}
-
-		//校验现有数据中,是否存在该日期的数据,如果存在的话,那么就要去校验 最新计算数据 与 现有数据 是否一致
-		if nowEdbDataValue, isHas := nowEdbDataMap[v]; isHas {
-			//获取去年今日的数据,获取到后,然后是去修改该日期的数据
-			if lastYearEdbDataValue, ok := nowEdbDataMap[pjDataTime.Format(utils.FormatDate)]; ok {
-				tbzDataValue := tbzEdbDataMap[v] //同比值
-				currValue := lastYearEdbDataValue * (1 + tbzDataValue/100)
-				currValue, _ = decimal.NewFromFloat(currValue).Truncate(4).Float64() //保留4位小数
-				//如果计算出来的值与库里面的值不匹配,那么就去修改该值
-				if nowEdbDataValue != currValue {
-					//将计算后的数据存入待拼接指标map里面,以便后续计算
-					updateEdbDataMap[v] = currValue
-				}
-			}
-		} else {
-			//因为 现有数据中 不存在该日期数据,那么需要做新增数据处理
-
-			//如果去年今日存在该数据,那么就去计算当前的数据
-			if pjDataValue, ok := nowEdbDataMap[pjDataTime.Format(utils.FormatDate)]; ok {
-				tbzDataValue := tbzEdbDataMap[v] //同比值
-				currValue := pjDataValue * (1 + tbzDataValue/100)
-
-				currValue, _ = decimal.NewFromFloat(currValue).Truncate(4).Float64()
-				//将计算后的数据存入已入库指标map里面,以便后续计算
-				nowEdbDataMap[v] = currValue
-
-				//将计算后的数据存入待拼接指标map里面,以便后续入库
-				pjDataMap[v] = currValue
-				pjEdbDataTimeList = append(pjEdbDataTimeList, v)
-			}
-		}
-	}
-
-	//新增的数据入库
-	{
-		addDataList := make([]*EdbDataCalculateLjztbpj, 0)
-		for dataTime, dataValue := range pjDataMap {
-			//时间戳
-			currentDate, _ := time.Parse(utils.FormatDate, dataTime)
-			timestamp := currentDate.UnixNano() / 1e6
-
-			edbDataLjztbpj := &EdbDataCalculateLjztbpj{
-				EdbInfoId:     edbInfoId,
-				EdbCode:       nowEdbInfo.EdbCode,
-				DataTime:      dataTime,
-				Value:         dataValue,
-				Status:        1,
-				CreateTime:    time.Now(),
-				ModifyTime:    time.Now(),
-				DataTimestamp: timestamp,
-			}
-			addDataList = append(addDataList, edbDataLjztbpj)
-		}
-
-		tmpAddDataList := make([]*EdbDataCalculateLjztbpj, 0)
-		for _, v := range addDataList {
-			tmpAddDataList = append(tmpAddDataList, v)
-
-			if len(tmpAddDataList) >= 200 {
-				_, tmpErr := to.InsertMulti(len(tmpAddDataList), tmpAddDataList)
-				if tmpErr != nil {
-					err = tmpErr
-					return
-				}
-				//重新初始化需要加入的数据切片
-				tmpAddDataList = make([]*EdbDataCalculateLjztbpj, 0)
-			}
-		}
-		//最后如果还有需要新增的数据,那么就统一入库
-		if len(tmpAddDataList) > 0 {
-			_, tmpErr := to.InsertMulti(len(tmpAddDataList), tmpAddDataList)
-			if tmpErr != nil {
-				err = tmpErr
-				return
-			}
-		}
-	}
-
-	//删除已经不存在的累计同比拼接指标数据(由于同比值当日的数据删除了)
-	{
-		if len(removeDateList) > 0 {
-			removeDateStr := strings.Join(removeDateList, `","`)
-			removeDateStr = `"` + removeDateStr + `"`
-			//如果拼接指标变更了,那么需要删除所有的指标数据
-			tableName := GetEdbDataTableName(nowEdbInfo.Source, nowEdbInfo.SubSource)
-			sql = fmt.Sprintf(` DELETE FROM %s WHERE edb_info_id = ? and data_time in (%s) `, tableName, removeDateStr)
-
-			_, err = to.Raw(sql, edbInfoId).Exec()
-			if err != nil {
-				err = errors.New("删除不存在的累计值同比拼接指标数据失败,Err:" + err.Error())
-				return
-			}
-		}
-	}
-
-	//修改现有的数据中对应的值
-	{
-		tableName := GetEdbDataTableName(nowEdbInfo.Source, nowEdbInfo.SubSource)
-		for edbDate, edbDataValue := range updateEdbDataMap {
-			sql = fmt.Sprintf(` UPDATE  %s set value = %f,modify_time=now() WHERE edb_info_id = ? and data_time = %s `, tableName, edbDataValue, edbDate)
-
-			_, err = to.Raw(sql, edbInfoId).Exec()
-			if err != nil {
-				err = errors.New("更新现有的累计值同比拼接指标数据失败,Err:" + err.Error())
-				return
-			}
-		}
-	}
-
-	//修改指标信息
-	sql = ` UPDATE  edb_info SET
-			  edb_name =?,
-			  edb_name_source=?,
-			  frequency = ?,
-			  unit = ?,
-			  classify_id = ?, 
-			  calculate_formula=?,
-			  modify_time = NOW()
-			WHERE edb_info_id = ? `
-	_, err = to.Raw(sql, req.EdbName, req.EdbName, req.Frequency, req.Unit, req.ClassifyId, lastDateTime.Format(utils.FormatDate), edbInfoId).Exec()
-	if err != nil {
-		return
-	}
-
-	return
-}

+ 0 - 798
models/data_manage/edb_info_calculate_ljzzy.go

@@ -1,798 +0,0 @@
-package data_manage
-
-import (
-	"errors"
-	"eta/eta_api/utils"
-	"fmt"
-	"github.com/beego/beego/v2/client/orm"
-	"github.com/shopspring/decimal"
-	"strconv"
-	"strings"
-	"time"
-)
-
-type EdbInfoCalculateLjzzy struct {
-	EdbInfoCalculateLjzzyId int       `orm:"column(edb_info_calculate_ljzzy_id);pk"`
-	EdbInfoId               int       `description:"指标id"`
-	EdbCode                 string    `description:"指标编码"`
-	FromEdbInfoId           int       `description:"计算指标id"`
-	FromEdbCode             string    `description:"计算指标编码"`
-	FromEdbName             string    `description:"计算指标名称"`
-	FromSource              int       `description:"计算指标来源"`
-	FromSourceName          string    `description:"计算指标来源名称"`
-	FromTag                 string    `description:"来源指标标签"`
-	Sort                    int       `description:"计算指标名称排序"`
-	CreateTime              time.Time `description:"创建时间"`
-	ModifyTime              time.Time `description:"修改时间"`
-}
-
-func AddEdbInfoCalculateLjzzyMulti(items []*EdbInfoCalculateLjzzy) (err error) {
-	o := orm.NewOrmUsingDB("data")
-	_, err = o.InsertMulti(1, items)
-	return
-}
-
-// 累计值转月
-func AddCalculateLjzzy(req *EdbInfoCalculateBatchSaveReq, fromEdbInfo *EdbInfo, edbCode, uniqueCode string, sysUserId int, sysUserRealName string) (edbInfoId 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 req.EdbInfoId <= 0 {
-		edbInfo := new(EdbInfo)
-		edbInfo.Source = utils.DATA_SOURCE_CALCULATE_LJZZY
-		edbInfo.SourceName = "累计值转月值"
-		edbInfo.EdbCode = edbCode
-		edbInfo.EdbName = req.EdbName
-		edbInfo.EdbNameSource = req.EdbName
-		edbInfo.Frequency = req.Frequency
-		edbInfo.Unit = req.Unit
-		edbInfo.ClassifyId = req.ClassifyId
-		edbInfo.SysUserId = sysUserId
-		edbInfo.SysUserRealName = sysUserRealName
-		edbInfo.CreateTime = time.Now()
-		edbInfo.ModifyTime = time.Now()
-		edbInfo.UniqueCode = uniqueCode
-		edbInfo.CalculateFormula = req.Formula
-		edbInfo.EdbType = 2
-		newEdbInfoId, tmpErr := to.Insert(edbInfo)
-		if tmpErr != nil {
-			return int(newEdbInfoId), tmpErr
-		}
-		edbInfoId = int(newEdbInfoId)
-
-		//calculateItem := new(EdbInfoCalculateLjzzy)
-		//calculateItem.CreateTime = time.Now()
-		//calculateItem.ModifyTime = time.Now()
-		//calculateItem.Sort = 1
-		//calculateItem.EdbCode = edbCode
-		//calculateItem.EdbInfoId = edbInfoId
-		//calculateItem.FromEdbInfoId = fromEdbInfo.EdbInfoId
-		//calculateItem.FromEdbCode = fromEdbInfo.EdbCode
-		//calculateItem.FromEdbName = fromEdbInfo.EdbName
-		//calculateItem.FromSource = fromEdbInfo.Source
-		//calculateItem.FromSourceName = fromEdbInfo.SourceName
-		//_, err = to.Insert(calculateItem)
-		//if err != nil {
-		//	return edbInfoId, err
-		//}
-		//关联关系
-		{
-			calculateMappingItem := new(EdbInfoCalculateMapping)
-			calculateMappingItem.CreateTime = time.Now()
-			calculateMappingItem.ModifyTime = time.Now()
-			calculateMappingItem.Sort = 1
-			calculateMappingItem.EdbCode = edbCode
-			calculateMappingItem.EdbInfoId = edbInfoId
-			calculateMappingItem.FromEdbInfoId = fromEdbInfo.EdbInfoId
-			calculateMappingItem.FromEdbCode = fromEdbInfo.EdbCode
-			calculateMappingItem.FromEdbName = fromEdbInfo.EdbName
-			calculateMappingItem.FromSource = fromEdbInfo.Source
-			calculateMappingItem.FromSourceName = fromEdbInfo.SourceName
-			calculateMappingItem.FromTag = ""
-			calculateMappingItem.Source = edbInfo.Source
-			calculateMappingItem.SourceName = edbInfo.SourceName
-			_, err = to.Insert(calculateMappingItem)
-			if err != nil {
-				return
-			}
-		}
-	} else {
-		edbInfoId = req.EdbInfoId
-		dataTableName := GetEdbDataTableName(utils.DATA_SOURCE_CALCULATE_LJZZY, utils.DATA_SUB_SOURCE_EDB)
-		deleteSql := ` DELETE FROM %s WHERE edb_info_id=? `
-		deleteSql = fmt.Sprintf(deleteSql, dataTableName)
-		_, err = to.Raw(deleteSql, req.EdbInfoId).Exec()
-	}
-	edbInfoIdStr := strconv.Itoa(edbInfoId)
-	//计算数据
-	var condition string
-	var pars []interface{}
-	condition += " AND edb_info_id=? "
-	if req.EdbInfoId <= 0 {
-		pars = append(pars, req.FromEdbInfoId)
-	} else {
-		pars = append(pars, fromEdbInfo.EdbInfoId)
-	}
-	fmt.Println("EdbInfoId:", req.FromEdbInfoId)
-	dataList, err := GetEdbDataListAll(condition, pars, fromEdbInfo.Source, fromEdbInfo.SubSource, 1)
-	if err != nil {
-		return edbInfoId, err
-	}
-
-	yearMap := make(map[int]map[int]*EdbInfoSearchData)
-	dataLen := len(dataList)
-	for i := 0; i < dataLen; i++ {
-		item := dataList[i]
-		//日其中获取年
-		itemDate, err := time.Parse(utils.FormatDate, item.DataTime)
-		if err != nil {
-			return edbInfoId, err
-		}
-		year := itemDate.Year()
-		month := int(itemDate.Month())
-		if monthMap, yok := yearMap[year]; yok {
-			monthMap[month] = item
-			yearMap[year] = monthMap
-		} else {
-			monthMap = make(map[int]*EdbInfoSearchData)
-			monthMap[month] = item
-			yearMap[year] = monthMap
-		}
-	}
-
-	addSql := ` INSERT INTO edb_data_calculate_ljzzy(edb_info_id,edb_code,data_time,value,create_time,modify_time,status,data_timestamp) values `
-	var isAdd bool
-	existMap := make(map[string]string)
-	for yk, yv := range yearMap {
-		_, oneMonthOk := yv[1]
-		_, twoMonthOk := yv[2]
-		if !oneMonthOk && !twoMonthOk {
-			continue
-		}
-		for i := 1; i <= 12; i++ {
-			fmt.Println(yk, i, yv[i])
-			dataCurrentItem := yv[i]
-			fmt.Println("i:", i, yk, dataCurrentItem)
-			var date string
-			var val float64
-			if i == 1 || i == 2 {
-				if _, mok := yv[1]; mok { //1月有值
-					if i == 1 {
-						date = dataCurrentItem.DataTime
-						val, _ = decimal.NewFromFloat(dataCurrentItem.Value).Float64() //a.Div(b).Float64()
-					}
-					if i == 2 {
-						dataOneItem := yv[1]
-						if dataCurrentItem != nil {
-							date = dataCurrentItem.DataTime
-							twoMonth := decimal.NewFromFloat(dataCurrentItem.Value)
-							oneMonth := decimal.NewFromFloat(dataOneItem.Value)
-							val, _ = twoMonth.Sub(oneMonth).Float64()
-						} else {
-							continue
-						}
-					}
-				} else { //1月无值
-					dataTwoItem := yv[2]
-					if i == 1 {
-						date = strconv.Itoa(yk) + "-01-31"
-						a := decimal.NewFromFloat(dataTwoItem.Value)
-						b := decimal.NewFromFloat(2.0)
-						val, _ = a.Div(b).Float64()
-					}
-					if i == 2 {
-						date = dataCurrentItem.DataTime
-						a := decimal.NewFromFloat(dataTwoItem.Value)
-						b := decimal.NewFromFloat(2.0)
-						val, _ = a.Div(b).Float64()
-					}
-				}
-			} else {
-				dataPreItem := yv[i-1]
-				if dataCurrentItem != nil && dataPreItem != nil {
-					date = dataCurrentItem.DataTime
-					//val, _ = decimal.NewFromFloat(dataCurrentItem.Value).Sub(decimal.NewFromFloat(dataPreItem.Value)).Float64()
-					a := decimal.NewFromFloat(dataCurrentItem.Value)
-					b := decimal.NewFromFloat(dataPreItem.Value)
-					val, _ = a.Sub(b).Float64()
-				}
-			}
-
-			if date != "" {
-				dataTime, _ := time.Parse(utils.FormatDate, date)
-				timestamp := dataTime.UnixNano() / 1e6
-				timeStr := fmt.Sprintf("%d", timestamp)
-
-				if _, ok := existMap[edbCode+date]; !ok {
-					addSql += GetAddSql(edbInfoIdStr, edbCode, date, timeStr, utils.SubFloatToString(val, 4))
-					isAdd = true
-				}
-				existMap[edbCode+date] = date
-			}
-		}
-	}
-	if isAdd {
-		addSql = strings.TrimRight(addSql, ",")
-		_, err = to.Raw(addSql).Exec()
-		if err != nil {
-			return edbInfoId, err
-		}
-	}
-	return
-}
-
-// 修改累计值转月
-func EditCalculateLjzzy(req *EdbInfoCalculateBatchEditReq, fromEdbInfo *EdbInfo, edbCode string) (edbInfoId int, err error) {
-	edbInfoId = req.EdbInfoId
-	o := orm.NewOrmUsingDB("data")
-	to, err := o.Begin()
-	if err != nil {
-		return
-	}
-	defer func() {
-		if err != nil {
-			_ = to.Rollback()
-		} else {
-			_ = to.Commit()
-		}
-	}()
-
-	//修改指标信息
-	sql := ` UPDATE  edb_info
-			SET
-			  edb_name =?,
-              edb_name_source=?,
-			  frequency = ?,
-			  unit = ?,
-			  classify_id = ?,
-			  modify_time = NOW()
-			WHERE edb_info_id = ? `
-	_, err = to.Raw(sql, req.EdbName, req.EdbName, req.Frequency, req.Unit, req.ClassifyId, edbInfoId).Exec()
-	if err != nil {
-		return
-	}
-
-	var existCondition string
-	var existPars []interface{}
-	existCondition += " AND edb_info_id=? "
-	existPars = append(existPars, edbInfoId)
-
-	existCondition += " AND from_edb_info_id=? "
-	existPars = append(existPars, req.FromEdbInfoId)
-
-	//判断计算指标是否被更换
-	count, err := GetEdbInfoCalculateCountByCondition(req.Source, existCondition, existPars)
-	if err != nil {
-		err = errors.New("判断指标是否改变失败,Err:" + err.Error())
-		return
-	}
-	if count <= 0 {
-		//删除指标关联计算指标
-		//sql := ` DELETE FROM edb_info_calculate_ljzzy WHERE edb_info_id = ? `
-		//_, err = to.Raw(sql, edbInfoId).Exec()
-		//if err != nil {
-		//	return
-		//}
-
-		//calculateItem := new(EdbInfoCalculateLjzzy)
-		//calculateItem.CreateTime = time.Now()
-		//calculateItem.ModifyTime = time.Now()
-		//calculateItem.Sort = 1
-		//calculateItem.EdbCode = edbCode
-		//calculateItem.EdbInfoId = edbInfoId
-		//calculateItem.FromEdbInfoId = fromEdbInfo.EdbInfoId
-		//calculateItem.FromEdbCode = fromEdbInfo.EdbCode
-		//calculateItem.FromEdbName = fromEdbInfo.EdbName
-		//calculateItem.FromSource = fromEdbInfo.Source
-		//calculateItem.FromSourceName = fromEdbInfo.SourceName
-		//_, err = to.Insert(calculateItem)
-		//if err != nil {
-		//	return
-		//}
-
-		//删除,计算指标关联的,基础指标的关联关系
-		sql = ` DELETE FROM edb_info_calculate_mapping WHERE edb_info_id = ? `
-		_, err = to.Raw(sql, edbInfoId).Exec()
-		if err != nil {
-			return
-		}
-
-		//清空原有数据
-		sql = ` DELETE FROM edb_data_calculate_ljzzy WHERE edb_info_id = ? `
-		_, err = to.Raw(sql, edbInfoId).Exec()
-		if err != nil {
-			return edbInfoId, err
-		}
-
-		//关联关系
-		{
-			calculateMappingItem := new(EdbInfoCalculateMapping)
-			calculateMappingItem.CreateTime = time.Now()
-			calculateMappingItem.ModifyTime = time.Now()
-			calculateMappingItem.Sort = 1
-			calculateMappingItem.EdbCode = edbCode
-			calculateMappingItem.EdbInfoId = edbInfoId
-			calculateMappingItem.FromEdbInfoId = fromEdbInfo.EdbInfoId
-			calculateMappingItem.FromEdbCode = fromEdbInfo.EdbCode
-			calculateMappingItem.FromEdbName = fromEdbInfo.EdbName
-			calculateMappingItem.FromSource = fromEdbInfo.Source
-			calculateMappingItem.FromSourceName = fromEdbInfo.SourceName
-			calculateMappingItem.FromTag = ""
-			calculateMappingItem.Source = utils.DATA_SOURCE_CALCULATE_LJZZY
-			calculateMappingItem.SourceName = "累计值转月"
-			_, err = to.Insert(calculateMappingItem)
-			if err != nil {
-				return
-			}
-		}
-
-		//计算数据
-		var condition string
-		var pars []interface{}
-		condition += " AND edb_info_id=? "
-		pars = append(pars, req.FromEdbInfoId)
-		fmt.Println("EdbInfoId:", req.FromEdbInfoId)
-		dataList, err := GetEdbDataListAll(condition, pars, fromEdbInfo.Source, fromEdbInfo.SubSource, 1)
-		if err != nil {
-			return edbInfoId, err
-		}
-
-		yearMap := make(map[int]map[int]*EdbInfoSearchData)
-		dataLen := len(dataList)
-		for i := 0; i < dataLen; i++ {
-			item := dataList[i]
-			//日其中获取年
-			itemDate, err := time.Parse(utils.FormatDate, item.DataTime)
-			if err != nil {
-				return edbInfoId, err
-			}
-			year := itemDate.Year()
-			month := int(itemDate.Month())
-			if monthMap, yok := yearMap[year]; yok {
-				monthMap[month] = item
-				yearMap[year] = monthMap
-			} else {
-				monthMap = make(map[int]*EdbInfoSearchData)
-				monthMap[month] = item
-				yearMap[year] = monthMap
-			}
-		}
-
-		addSql := ` INSERT INTO edb_data_calculate_ljzzy(edb_info_id,edb_code,data_time,value,create_time,modify_time,status,data_timestamp) values `
-		nowStr := time.Now().Format(utils.FormatDateTime)
-		var isAdd bool
-
-		for yk, yv := range yearMap {
-			_, oneMonthOk := yv[1]
-			_, twoMonthOk := yv[2]
-			if !oneMonthOk && !twoMonthOk {
-				continue
-			}
-			for i := 1; i <= 12; i++ {
-				fmt.Println(yk, i, yv[i])
-				dataCurrentItem := yv[i]
-				var date string
-				var val float64
-				if i == 1 || i == 2 {
-					if _, mok := yv[1]; mok { //1月有值
-						if i == 1 {
-							date = dataCurrentItem.DataTime
-							val, _ = decimal.NewFromFloat(dataCurrentItem.Value).Float64() //a.Div(b).Float64()
-						}
-						if i == 2 {
-							dataOneItem := yv[1]
-							date = dataCurrentItem.DataTime
-							twoMonth := decimal.NewFromFloat(dataCurrentItem.Value)
-							oneMonth := decimal.NewFromFloat(dataOneItem.Value)
-							val, _ = twoMonth.Sub(oneMonth).Float64()
-						}
-					} else { //1月无值
-						dataTwoItem := yv[2]
-						if i == 1 {
-							date = strconv.Itoa(yk) + "-01-31"
-							a := decimal.NewFromFloat(dataTwoItem.Value)
-							b := decimal.NewFromFloat(2.0)
-							val, _ = a.Div(b).Float64()
-						}
-						if i == 2 {
-							date = dataCurrentItem.DataTime
-							a := decimal.NewFromFloat(dataTwoItem.Value)
-							b := decimal.NewFromFloat(2.0)
-							val, _ = a.Div(b).Float64()
-						}
-					}
-				} else {
-					dataPreItem := yv[i-1]
-					if dataCurrentItem != nil && dataPreItem != nil {
-						date = dataCurrentItem.DataTime
-						//val = dataCurrentItem.Value - dataPreItem.Value
-						a := decimal.NewFromFloat(dataCurrentItem.Value)
-						b := decimal.NewFromFloat(dataPreItem.Value)
-						val, _ = a.Sub(b).Float64()
-					}
-				}
-				if date != "" {
-					dataTime, _ := time.Parse(utils.FormatDate, date)
-					timestamp := dataTime.UnixNano() / 1e6
-					timeStr := fmt.Sprintf("%d", timestamp)
-
-					addSql += "("
-					addSql += strconv.Itoa(edbInfoId) + "," + "'" + edbCode + "'" + "," + "'" + date + "'" + "," + utils.SubFloatToString(val, 4) + "," + "'" + nowStr + "'" +
-						"," + "'" + nowStr + "'" + "," + "1"
-					addSql += "," + "'" + timeStr + "'"
-					addSql += "),"
-					isAdd = true
-				}
-			}
-		}
-		if isAdd {
-			addSql = strings.TrimRight(addSql, ",")
-			_, err = to.Raw(addSql).Exec()
-			if err != nil {
-				return edbInfoId, err
-			}
-		}
-	}
-	return
-}
-
-// 刷新累计值转月值数据
-func RefreshCalculateLjzzy(edbInfoId int, fromEdbInfo *EdbInfo, edbCode, startDate, endDate 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()
-		}
-	}()
-
-	if err != nil {
-		return
-	}
-	edbInfoIdStr := strconv.Itoa(edbInfoId)
-	//计算数据
-	var condition string
-	var pars []interface{}
-	condition += " AND edb_info_id=? "
-	pars = append(pars, fromEdbInfo.EdbInfoId)
-
-	if startDate != "" {
-		condition += " AND data_time>=? "
-		pars = append(pars, startDate)
-	}
-	if endDate != "" {
-		condition += " AND data_time<=? "
-		pars = append(pars, endDate)
-	}
-
-	dataList, err := GetEdbDataListAll(condition, pars, fromEdbInfo.Source, fromEdbInfo.SubSource, 1)
-	if err != nil {
-		return err
-	}
-
-	yearMap := make(map[int]map[int]*EdbInfoSearchData)
-	dataLen := len(dataList)
-	for i := 0; i < dataLen; i++ {
-		item := dataList[i]
-		//日其中获取年
-		itemDate, err := time.Parse(utils.FormatDate, item.DataTime)
-		if err != nil {
-			return err
-		}
-		year := itemDate.Year()
-		month := int(itemDate.Month())
-		if monthMap, yok := yearMap[year]; yok {
-			monthMap[month] = item
-			yearMap[year] = monthMap
-		} else {
-			monthMap = make(map[int]*EdbInfoSearchData)
-			monthMap[month] = item
-			yearMap[year] = monthMap
-		}
-	}
-
-	addSql := ` INSERT INTO edb_data_calculate_ljzzy(edb_info_id,edb_code,data_time,value,create_time,modify_time,status,data_timestamp) values `
-	nowStr := time.Now().Format(utils.FormatDateTime)
-	var isAdd bool
-
-	for yk, yv := range yearMap {
-		_, oneMonthOk := yv[1]
-		_, twoMonthOk := yv[2]
-		if !oneMonthOk && !twoMonthOk {
-			continue
-		}
-		for i := 1; i <= 12; i++ {
-			fmt.Println(yk, i, yv[i])
-			dataCurrentItem := yv[i]
-			var date string
-			var val float64
-			if i == 1 || i == 2 {
-				if _, mok := yv[1]; mok { //1月有值
-					if i == 1 {
-						date = dataCurrentItem.DataTime
-						val, _ = decimal.NewFromFloat(dataCurrentItem.Value).Float64() //a.Div(b).Float64()
-					}
-					if i == 2 {
-						dataOneItem := yv[1]
-						date = dataCurrentItem.DataTime
-						twoMonth := decimal.NewFromFloat(dataCurrentItem.Value)
-						oneMonth := decimal.NewFromFloat(dataOneItem.Value)
-						val, _ = twoMonth.Sub(oneMonth).Float64()
-					}
-				} else { //1月无值
-					dataTwoItem := yv[2]
-					if i == 1 {
-						date = strconv.Itoa(yk) + "-01-31"
-						a := decimal.NewFromFloat(dataTwoItem.Value)
-						b := decimal.NewFromFloat(2.0)
-						val, _ = a.Div(b).Float64()
-					}
-					if i == 2 {
-						date = dataCurrentItem.DataTime
-						a := decimal.NewFromFloat(dataTwoItem.Value)
-						b := decimal.NewFromFloat(2.0)
-						val, _ = a.Div(b).Float64()
-					}
-				}
-			} else {
-				dataPreItem := yv[i-1]
-				if dataCurrentItem != nil && dataPreItem != nil {
-					date = dataCurrentItem.DataTime
-					//val =  dataCurrentItem.Value - dataPreItem.Value
-					a := decimal.NewFromFloat(dataCurrentItem.Value)
-					b := decimal.NewFromFloat(dataPreItem.Value)
-					val, _ = a.Sub(b).Float64()
-				}
-			}
-			if date != "" {
-				//判断数据是否存在
-				count, err := GetEdbDataCalculateLjzzyByCodeAndDate(edbCode, date)
-				if err != nil && err.Error() != utils.ErrNoRow() {
-					return err
-				}
-				if count <= 0 {
-					dataTime, _ := time.Parse(utils.FormatDate, date)
-					timestamp := dataTime.UnixNano() / 1e6
-					timeStr := fmt.Sprintf("%d", timestamp)
-
-					addSql += "("
-					addSql += edbInfoIdStr + "," + "'" + edbCode + "'" + "," + "'" + date + "'" + "," + utils.SubFloatToString(val, 4) + "," + "'" + nowStr + "'" +
-						"," + "'" + nowStr + "'" + "," + "1"
-					addSql += "," + "'" + timeStr + "'"
-					addSql += "),"
-					isAdd = true
-				} else {
-					valStr := utils.SubFloatToString(val, 4)
-					err = ModifyEdbDataCalculateLjzzy(int64(edbInfoId), date, valStr)
-					if err != nil {
-						return err
-					}
-				}
-			}
-		}
-	}
-	if isAdd {
-		addSql = strings.TrimRight(addSql, ",")
-		_, err = to.Raw(addSql).Exec()
-		if err != nil {
-			return err
-		}
-	}
-	return
-}
-
-type EdbInfoCalculateLjzzyDetail struct {
-	EdbInfoCalculateLjzzyId int       `orm:"column(edb_info_calculate_ljzzy_id);pk"`
-	EdbInfoId               int       `description:"指标id"`
-	EdbCode                 string    `description:"指标编码"`
-	FromEdbInfoId           int       `description:"计算指标id"`
-	FromEdbCode             string    `description:"计算指标编码"`
-	FromEdbName             string    `description:"计算指标名称"`
-	FromSource              int       `description:"计算指标来源"`
-	FromSourceName          string    `description:"计算指标来源名称"`
-	FromTag                 string    `description:"来源指标标签"`
-	Sort                    int       `description:"计算指标名称排序"`
-	CreateTime              time.Time `description:"创建时间"`
-	ModifyTime              time.Time `description:"修改时间"`
-	StartDate               string    `description:"开始日期"`
-	EndDate                 string    `description:"结束日期"`
-}
-
-func GetEdbInfoCalculateLjzzyDetail(edbInfoId int) (item *EdbInfoCalculateLjzzyDetail, err error) {
-	o := orm.NewOrmUsingDB("data")
-	sql := ` SELECT a.*,b.start_date,b.end_date FROM edb_info_calculate_mapping AS a
-			INNER JOIN edb_info AS b ON a.from_edb_info_id=b.edb_info_id
-			WHERE a.edb_info_id=? `
-	err = o.Raw(sql, edbInfoId).QueryRow(&item)
-	return
-}
-
-func GetEdbDataCalculateLjzzyByCodeAndDate(edbCode string, startDate string) (count int, err error) {
-	o := orm.NewOrmUsingDB("data")
-	sql := ` SELECT COUNT(1) AS count FROM edb_data_calculate_ljzzy WHERE edb_code=? AND data_time=? `
-	err = o.Raw(sql, edbCode, startDate).QueryRow(&count)
-	return
-}
-
-func ModifyEdbDataCalculateLjzzy(edbInfoId int64, dataTime, value string) (err error) {
-	o := orm.NewOrmUsingDB("data")
-	sql := ` UPDATE edb_data_calculate_ljzzy SET value=?,modify_time=NOW() WHERE edb_info_id=? AND data_time=? `
-	_, err = o.Raw(sql, value, edbInfoId, dataTime).Exec()
-	return
-}
-
-// 刷新全部数据
-func RefreshAllCalculateLjzzy(edbInfoId, source, subSource int, fromEdbInfo *EdbInfo, edbCode, startDate, endDate 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()
-		}
-	}()
-
-	if err != nil {
-		return
-	}
-	edbInfoIdStr := strconv.Itoa(edbInfoId)
-	//计算数据
-	var condition string
-	var pars []interface{}
-	condition += " AND edb_info_id=? "
-	pars = append(pars, fromEdbInfo.EdbInfoId)
-
-	if startDate != "" {
-		condition += " AND data_time>=? "
-		pars = append(pars, startDate)
-	}
-	if endDate != "" {
-		condition += " AND data_time<=? "
-		pars = append(pars, endDate)
-	}
-
-	dataList, err := GetEdbDataListAll(condition, pars, fromEdbInfo.Source, fromEdbInfo.SubSource, 1)
-	if err != nil {
-		return err
-	}
-
-	yearMap := make(map[int]map[int]*EdbInfoSearchData)
-	dataLen := len(dataList)
-	for i := 0; i < dataLen; i++ {
-		item := dataList[i]
-		//日其中获取年
-		itemDate, err := time.Parse(utils.FormatDate, item.DataTime)
-		if err != nil {
-			return err
-		}
-		year := itemDate.Year()
-		month := int(itemDate.Month())
-		if monthMap, yok := yearMap[year]; yok {
-			monthMap[month] = item
-			yearMap[year] = monthMap
-		} else {
-			monthMap = make(map[int]*EdbInfoSearchData)
-			monthMap[month] = item
-			yearMap[year] = monthMap
-		}
-	}
-
-	addSql := ` INSERT INTO edb_data_calculate_ljzzy(edb_info_id,edb_code,data_time,value,create_time,modify_time,status,data_timestamp) values `
-	var isAdd bool
-	//获取指标所有数据
-	existDataList := make([]*EdbDataBase, 0)
-	dataTableName := GetEdbDataTableName(source, subSource)
-	sql := `SELECT * FROM %s WHERE edb_info_id=? `
-	sql = fmt.Sprintf(sql, dataTableName)
-	_, err = to.Raw(sql, edbInfoId).QueryRows(&existDataList)
-	if err != nil {
-		return err
-	}
-	dataMap := make(map[string]string)
-	for _, v := range existDataList {
-		dataMap[v.DataTime] = v.Value
-	}
-	existDataMap := make(map[string]string)
-	for yk, yv := range yearMap {
-		_, oneMonthOk := yv[1]
-		_, twoMonthOk := yv[2]
-		if !oneMonthOk && !twoMonthOk {
-			continue
-		}
-		for i := 1; i <= 12; i++ {
-			fmt.Println(yk, i, yv[i])
-			dataCurrentItem := yv[i]
-			var date string
-			var val float64
-			if i == 1 || i == 2 {
-				if _, mok := yv[1]; mok { //1月有值
-					if i == 1 {
-						date = dataCurrentItem.DataTime
-						val, _ = decimal.NewFromFloat(dataCurrentItem.Value).Float64() //a.Div(b).Float64()
-					}
-					if i == 2 {
-						dataOneItem := yv[1]
-						date = dataCurrentItem.DataTime
-						twoMonth := decimal.NewFromFloat(dataCurrentItem.Value)
-						oneMonth := decimal.NewFromFloat(dataOneItem.Value)
-						val, _ = twoMonth.Sub(oneMonth).Float64()
-					}
-				} else { //1月无值
-					dataTwoItem := yv[2]
-					if i == 1 {
-						date = strconv.Itoa(yk) + "-01-31"
-						a := decimal.NewFromFloat(dataTwoItem.Value)
-						b := decimal.NewFromFloat(2.0)
-						val, _ = a.Div(b).Float64()
-					}
-					if i == 2 {
-						date = dataCurrentItem.DataTime
-						a := decimal.NewFromFloat(dataTwoItem.Value)
-						b := decimal.NewFromFloat(2.0)
-						val, _ = a.Div(b).Float64()
-					}
-				}
-			} else {
-				dataPreItem := yv[i-1]
-				if dataCurrentItem != nil && dataPreItem != nil {
-					date = dataCurrentItem.DataTime
-					//val =  dataCurrentItem.Value - dataPreItem.Value
-					a := decimal.NewFromFloat(dataCurrentItem.Value)
-					b := decimal.NewFromFloat(dataPreItem.Value)
-					val, _ = a.Sub(b).Float64()
-				}
-			}
-			if date != "" {
-				saveValue := utils.SubFloatToString(val, 4)
-				//判断数据是否存在
-				if existVal, ok := dataMap[date]; !ok {
-					dataTime, _ := time.Parse(utils.FormatDate, date)
-					timestamp := dataTime.UnixNano() / 1e6
-					timeStr := fmt.Sprintf("%d", timestamp)
-					if _, existOk := existDataMap[date]; !existOk {
-						addSql += GetAddSql(edbInfoIdStr, edbCode, date, timeStr, saveValue)
-						isAdd = true
-					}
-					existDataMap[date] = date
-				} else {
-					if existVal != saveValue {
-						sql := ` UPDATE %s SET value=?,modify_time=NOW() WHERE edb_info_id=? AND data_time=? `
-						sql = fmt.Sprintf(sql, dataTableName)
-						_, err = to.Raw(sql, saveValue, edbInfoId, date).Exec()
-						if err != nil {
-							return err
-						}
-					}
-				}
-			}
-		}
-	}
-	if isAdd {
-		addSql = strings.TrimRight(addSql, ",")
-		_, err = to.Raw(addSql).Exec()
-		if err != nil {
-			fmt.Println("RefreshAllCalculateLjzzy add Err", err.Error())
-			return
-		}
-	}
-	return
-}

+ 0 - 373
models/data_manage/edb_info_calculate_nszydpjjs.go

@@ -1,373 +0,0 @@
-package data_manage
-
-import (
-	"errors"
-	"eta/eta_api/utils"
-	"fmt"
-	"github.com/beego/beego/v2/client/orm"
-	"github.com/shopspring/decimal"
-	"strconv"
-	"strings"
-	"time"
-)
-
-type EdbInfoCalculateNszydpjjs struct {
-	EdbInfoCalculateNszydpjjsId int       `orm:"column(edb_info_calculate_nszydpjjs_id);pk"`
-	EdbInfoId                   int       `description:"指标id"`
-	EdbCode                     string    `description:"指标编码"`
-	FromEdbInfoId               int       `description:"计算指标id"`
-	FromEdbCode                 string    `description:"计算指标编码"`
-	FromEdbName                 string    `description:"计算指标名称"`
-	FromSource                  int       `description:"计算指标来源"`
-	FromSourceName              string    `description:"计算指标来源名称"`
-	FromTag                     string    `description:"来源指标标签"`
-	Sort                        int       `description:"计算指标名称排序"`
-	CreateTime                  time.Time `description:"创建时间"`
-	ModifyTime                  time.Time `description:"修改时间"`
-}
-
-// N数值移动平均计算
-func AddCalculateNszydpjjs(req *EdbInfoCalculateBatchSaveReq, fromEdbInfo *EdbInfo, edbCode, uniqueCode string, sysUserId int, sysUserRealName string, formulaInt int) (edbInfoId 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 req.EdbInfoId <= 0 {
-		edbInfo := new(EdbInfo)
-		edbInfo.Source = utils.DATA_SOURCE_CALCULATE_NSZYDPJJS
-		edbInfo.SourceName = "N数值移动平均计算"
-		edbInfo.EdbCode = edbCode
-		edbInfo.EdbName = req.EdbName
-		edbInfo.EdbNameSource = req.EdbName
-		edbInfo.Frequency = req.Frequency
-		edbInfo.Unit = req.Unit
-		edbInfo.ClassifyId = req.ClassifyId
-		edbInfo.SysUserId = sysUserId
-		edbInfo.SysUserRealName = sysUserRealName
-		edbInfo.CreateTime = time.Now()
-		edbInfo.ModifyTime = time.Now()
-		edbInfo.UniqueCode = uniqueCode
-		edbInfo.CalculateFormula = req.Formula
-		edbInfo.EdbType = 2
-		newEdbInfoId, tmpErr := to.Insert(edbInfo)
-		if tmpErr != nil {
-			return edbInfoId, tmpErr
-		}
-		edbInfoId = int(newEdbInfoId)
-
-		//calculateItem := new(EdbInfoCalculateNszydpjjs)
-		//calculateItem.CreateTime = time.Now()
-		//calculateItem.ModifyTime = time.Now()
-		//calculateItem.Sort = 1
-		//calculateItem.EdbCode = edbCode
-		//calculateItem.EdbInfoId = edbInfoId
-		//calculateItem.FromEdbInfoId = fromEdbInfo.EdbInfoId
-		//calculateItem.FromEdbCode = fromEdbInfo.EdbCode
-		//calculateItem.FromEdbName = fromEdbInfo.EdbName
-		//calculateItem.FromSource = fromEdbInfo.Source
-		//calculateItem.FromSourceName = fromEdbInfo.SourceName
-		//
-		//_, err = to.Insert(calculateItem)
-		//if err != nil {
-		//	return edbInfoId, err
-		//}
-
-		//关联关系
-		{
-			calculateMappingItem := new(EdbInfoCalculateMapping)
-			calculateMappingItem.CreateTime = time.Now()
-			calculateMappingItem.ModifyTime = time.Now()
-			calculateMappingItem.Sort = 1
-			calculateMappingItem.EdbCode = edbCode
-			calculateMappingItem.EdbInfoId = edbInfoId
-			calculateMappingItem.FromEdbInfoId = fromEdbInfo.EdbInfoId
-			calculateMappingItem.FromEdbCode = fromEdbInfo.EdbCode
-			calculateMappingItem.FromEdbName = fromEdbInfo.EdbName
-			calculateMappingItem.FromSource = fromEdbInfo.Source
-			calculateMappingItem.FromSourceName = fromEdbInfo.SourceName
-			calculateMappingItem.FromTag = ""
-			calculateMappingItem.Source = edbInfo.Source
-			calculateMappingItem.SourceName = edbInfo.SourceName
-			_, err = to.Insert(calculateMappingItem)
-			if err != nil {
-				return
-			}
-		}
-	} else {
-		edbInfoId = req.EdbInfoId
-		dataTableName := GetEdbDataTableName(utils.DATA_SOURCE_CALCULATE_NSZYDPJJS, utils.DATA_SUB_SOURCE_EDB)
-		deleteSql := ` DELETE FROM %s WHERE edb_info_id=? `
-		deleteSql = fmt.Sprintf(deleteSql, dataTableName)
-		_, err = to.Raw(deleteSql, req.EdbInfoId).Exec()
-	}
-
-	edbInfoIdStr := strconv.Itoa(edbInfoId)
-	//计算数据
-	var condition string
-	var pars []interface{}
-	condition += " AND edb_info_id=? "
-	if req.EdbInfoId <= 0 {
-		pars = append(pars, req.FromEdbInfoId)
-	} else {
-		pars = append(pars, fromEdbInfo.EdbInfoId)
-	}
-	dataList, err := GetEdbDataListAll(condition, pars, fromEdbInfo.Source, fromEdbInfo.SubSource, 0)
-	if err != nil {
-		return edbInfoId, err
-	}
-	var dateArr []string
-	dataMap := make(map[string]*EdbInfoSearchData)
-	for _, v := range dataList {
-		dateArr = append(dateArr, v.DataTime)
-		dataMap[v.DataTime] = v
-	}
-
-	addSql := ` INSERT INTO edb_data_calculate_nszydpjjs(edb_info_id,edb_code,data_time,value,create_time,modify_time,status,data_timestamp) values `
-	var isAdd bool
-
-	arrLen := len(dateArr)
-	for ak, av := range dateArr {
-		//处理第一个值
-		var valArr []float64
-		if findItem, ok := dataMap[av]; ok {
-			valArr = append(valArr, findItem.Value)
-		} else {
-			continue
-		}
-		if ak+1 != arrLen {
-			//处理除第一个值之外的N-1个值
-			for i := 1; i < formulaInt; i++ {
-				arrIndex := ak + i
-				if arrIndex >= arrLen {
-					break
-				}
-				arrVal := dateArr[arrIndex]
-				if findItem, ok := dataMap[arrVal]; ok {
-					valArr = append(valArr, findItem.Value)
-				} else {
-					continue
-				}
-			}
-		}
-		valArrLen := len(valArr)
-		totalVal := decimal.NewFromFloat(0.00)
-		for _, v := range valArr {
-			newDecimal := decimal.NewFromFloat(v)
-			totalVal = totalVal.Add(newDecimal)
-		}
-		af := totalVal //decimal.NewFromFloat(totalVal)
-		bf := decimal.NewFromFloat(float64(valArrLen))
-		val, _ := af.Div(bf).Float64()
-		currentDate, err := time.Parse(utils.FormatDate, av)
-		if err != nil {
-			return edbInfoId, err
-		}
-
-		timestamp := currentDate.UnixNano() / 1e6
-		timestampStr := fmt.Sprintf("%d", timestamp)
-		valStr := utils.SubFloatToString(val, 4)
-		addSql += GetAddSql(edbInfoIdStr, edbCode, av, timestampStr, valStr)
-		isAdd = true
-	}
-
-	if isAdd {
-		addSql = strings.TrimRight(addSql, ",")
-		_, err = to.Raw(addSql).Exec()
-		if err != nil {
-			return edbInfoId, err
-		}
-	}
-	return
-}
-
-// 修改N数值移动平均计算
-func EditCalculateNszydpjjs(req *EdbInfoCalculateBatchEditReq, fromEdbInfo *EdbInfo, edbCode string, formulaInt int, oldCalculateFormula string) (edbInfoId int, err error) {
-	edbInfoId = req.EdbInfoId
-
-	o := orm.NewOrmUsingDB("data")
-	to, err := o.Begin()
-	if err != nil {
-		return
-	}
-	defer func() {
-		if err != nil {
-			_ = to.Rollback()
-		} else {
-			_ = to.Commit()
-		}
-	}()
-	//修改指标信息
-	sql := ` UPDATE  edb_info
-			SET
-			  edb_name =?,
-              edb_name_source=?,
-			  frequency = ?,
-			  unit = ?,
-			  classify_id = ?,
-			  calculate_formula=?,
-			  modify_time = NOW()
-			WHERE edb_info_id = ? `
-	_, err = to.Raw(sql, req.EdbName, req.EdbName, req.Frequency, req.Unit, req.ClassifyId, req.Formula, edbInfoId).Exec()
-	if err != nil {
-		return
-	}
-
-	var existCondition string
-	var existPars []interface{}
-	existCondition += " AND edb_info_id=? "
-	existPars = append(existPars, edbInfoId)
-
-	existCondition += " AND from_edb_info_id=? "
-	existPars = append(existPars, req.FromEdbInfoId)
-
-	//判断计算指标是否被更换
-	count, err := GetEdbInfoCalculateCountByCondition(req.Source, existCondition, existPars)
-	if err != nil && err.Error() != utils.ErrNoRow() {
-		err = errors.New("判断指标是否改变失败,Err:" + err.Error())
-		return
-	}
-	if count <= 0 || oldCalculateFormula != req.Formula {
-		//删除,计算指标关联的,基础指标的关联关系
-		sql = ` DELETE FROM edb_info_calculate_mapping WHERE edb_info_id = ? `
-		_, err = to.Raw(sql, edbInfoId).Exec()
-		if err != nil {
-			return edbInfoId, err
-		}
-		//清空原有数据
-		sql = ` DELETE FROM edb_data_calculate_nszydpjjs WHERE edb_info_id = ? `
-		_, err = to.Raw(sql, edbInfoId).Exec()
-		if err != nil {
-			return edbInfoId, err
-		}
-		//关联关系
-		{
-			calculateMappingItem := new(EdbInfoCalculateMapping)
-			calculateMappingItem.CreateTime = time.Now()
-			calculateMappingItem.ModifyTime = time.Now()
-			calculateMappingItem.Sort = 1
-			calculateMappingItem.EdbCode = edbCode
-			calculateMappingItem.EdbInfoId = edbInfoId
-			calculateMappingItem.FromEdbInfoId = fromEdbInfo.EdbInfoId
-			calculateMappingItem.FromEdbCode = fromEdbInfo.EdbCode
-			calculateMappingItem.FromEdbName = fromEdbInfo.EdbName
-			calculateMappingItem.FromSource = fromEdbInfo.Source
-			calculateMappingItem.FromSourceName = fromEdbInfo.SourceName
-			calculateMappingItem.FromTag = ""
-			calculateMappingItem.Source = utils.DATA_SOURCE_CALCULATE_NSZYDPJJS
-			calculateMappingItem.SourceName = "N数值移动平均计算"
-			_, err = to.Insert(calculateMappingItem)
-			if err != nil {
-				return
-			}
-		}
-
-		edbInfoIdStr := strconv.Itoa(edbInfoId)
-		//计算数据
-		var condition string
-		var pars []interface{}
-		condition += " AND edb_info_id=? "
-		pars = append(pars, req.FromEdbInfoId)
-		dataList, err := GetEdbDataListAll(condition, pars, fromEdbInfo.Source, fromEdbInfo.SubSource, 0)
-		if err != nil {
-			return edbInfoId, err
-		}
-		var dateArr []string
-		dataMap := make(map[string]*EdbInfoSearchData)
-		for _, v := range dataList {
-			dateArr = append(dateArr, v.DataTime)
-			dataMap[v.DataTime] = v
-		}
-
-		addSql := ` INSERT INTO edb_data_calculate_nszydpjjs(edb_info_id,edb_code,data_time,value,create_time,modify_time,status,data_timestamp) values `
-		var isAdd bool
-
-		arrLen := len(dateArr)
-		for ak, av := range dateArr {
-			//处理第一个值
-			var valArr []float64
-			if findItem, ok := dataMap[av]; ok {
-				valArr = append(valArr, findItem.Value)
-			} else {
-				continue
-			}
-			if ak+1 != arrLen {
-				//处理除第一个值之外的N-1个值
-				for i := 1; i < formulaInt; i++ {
-					arrIndex := ak + i
-					if arrIndex >= arrLen {
-						break
-					}
-					arrVal := dateArr[arrIndex]
-					if findItem, ok := dataMap[arrVal]; ok {
-						valArr = append(valArr, findItem.Value)
-					} else {
-						continue
-					}
-				}
-			}
-			valArrLen := len(valArr)
-			totalVal := decimal.NewFromFloat(0.00)
-			for _, v := range valArr {
-				newDecimal := decimal.NewFromFloat(v)
-				totalVal = totalVal.Add(newDecimal)
-			}
-			af := totalVal
-			bf := decimal.NewFromFloat(float64(valArrLen))
-			val, _ := af.Div(bf).Float64()
-			currentDate, err := time.Parse(utils.FormatDate, av)
-			if err != nil {
-				return edbInfoId, err
-			}
-
-			timestamp := currentDate.UnixNano() / 1e6
-			timestampStr := fmt.Sprintf("%d", timestamp)
-
-			valStr := utils.SubFloatToString(val, 4)
-			addSql += GetAddSql(edbInfoIdStr, edbCode, av, timestampStr, valStr)
-			isAdd = true
-		}
-
-		if isAdd {
-			addSql = strings.TrimRight(addSql, ",")
-			_, err = to.Raw(addSql).Exec()
-			if err != nil {
-				return edbInfoId, err
-			}
-		}
-	}
-	return
-}
-
-type EdbInfoCalculateNszydpjjsDetail struct {
-	EdbInfoCalculateNszydpjjsId int       `orm:"column(edb_info_calculate_nszydpjjs_id);pk"`
-	EdbInfoId                   int       `description:"指标id"`
-	EdbCode                     string    `description:"指标编码"`
-	FromEdbInfoId               int       `description:"计算指标id"`
-	FromEdbCode                 string    `description:"计算指标编码"`
-	FromEdbName                 string    `description:"计算指标名称"`
-	FromSource                  int       `description:"计算指标来源"`
-	FromSourceName              string    `description:"计算指标来源名称"`
-	FromTag                     string    `description:"来源指标标签"`
-	Sort                        int       `description:"计算指标名称排序"`
-	CreateTime                  time.Time `description:"创建时间"`
-	ModifyTime                  time.Time `description:"修改时间"`
-	StartDate                   string    `description:"开始日期"`
-	EndDate                     string    `description:"结束日期"`
-}
-
-func GetEdbInfoCalculateNszydpjjsDetail(edbInfoId int) (item *EdbInfoCalculateNszydpjjsDetail, err error) {
-	o := orm.NewOrmUsingDB("data")
-	sql := ` SELECT a.*,b.start_date,b.end_date FROM edb_info_calculate_mapping AS a
-			INNER JOIN edb_info AS b ON a.from_edb_info_id=b.edb_info_id
-			WHERE a.edb_info_id=? `
-	err = o.Raw(sql, edbInfoId).QueryRow(&item)
-	return
-}

+ 0 - 319
models/data_manage/edb_info_calculate_tbz.go

@@ -1,319 +0,0 @@
-package data_manage
-
-import (
-	"eta/eta_api/utils"
-	"fmt"
-	"github.com/beego/beego/v2/client/orm"
-	"github.com/shopspring/decimal"
-	"strconv"
-	"strings"
-	"time"
-)
-
-type EdbInfoCalculateTbz struct {
-	EdbInfoCalculateTbzId int       `orm:"column(edb_info_calculate_tbz_id);pk"`
-	EdbInfoId             int       `description:"指标id"`
-	EdbCode               string    `description:"指标编码"`
-	FromEdbInfoId         int       `description:"计算指标id"`
-	FromEdbCode           string    `description:"计算指标编码"`
-	FromEdbName           string    `description:"计算指标名称"`
-	FromSource            int       `description:"计算指标来源"`
-	FromSourceName        string    `description:"计算指标来源名称"`
-	FromTag               string    `description:"来源指标标签"`
-	Sort                  int       `description:"计算指标名称排序"`
-	CreateTime            time.Time `description:"创建时间"`
-	ModifyTime            time.Time `description:"修改时间"`
-}
-
-// 同比值
-func AddCalculateTbz(req *EdbInfoCalculateBatchSaveReq, fromEdbInfo *EdbInfo, edbCode, uniqueCode string, sysUserId int, sysUserRealName string) (edbInfoId int, err error) {
-	fmt.Println("AddCalculateTbz")
-	o := orm.NewOrmUsingDB("data")
-	to, err := o.Begin()
-	if err != nil {
-		return
-	}
-	defer func() {
-		if err != nil {
-			_ = to.Rollback()
-		} else {
-			_ = to.Commit()
-		}
-	}()
-	if req.EdbInfoId <= 0 {
-		edbInfo := new(EdbInfo)
-		edbInfo.Source = utils.DATA_SOURCE_CALCULATE_TBZ
-		edbInfo.SourceName = "同比值"
-		edbInfo.EdbCode = edbCode
-		edbInfo.EdbName = req.EdbName
-		edbInfo.EdbNameSource = req.EdbName
-		edbInfo.Frequency = req.Frequency
-		edbInfo.Unit = req.Unit
-		edbInfo.ClassifyId = req.ClassifyId
-		edbInfo.SysUserId = sysUserId
-		edbInfo.SysUserRealName = sysUserRealName
-		edbInfo.CreateTime = time.Now()
-		edbInfo.ModifyTime = time.Now()
-		edbInfo.UniqueCode = uniqueCode
-		edbInfo.CalculateFormula = req.Formula
-		edbInfo.EdbType = 2
-		newEdbInfoId, tmpErr := to.Insert(edbInfo)
-		if tmpErr != nil {
-			return edbInfoId, tmpErr
-		}
-		edbInfoId = int(newEdbInfoId)
-
-		//calculateItem := new(EdbInfoCalculateTbz)
-		//calculateItem.CreateTime = time.Now()
-		//calculateItem.ModifyTime = time.Now()
-		//calculateItem.Sort = 1
-		//calculateItem.EdbCode = edbCode
-		//calculateItem.EdbInfoId = edbInfoId
-		//calculateItem.FromEdbInfoId = fromEdbInfo.EdbInfoId
-		//calculateItem.FromEdbCode = fromEdbInfo.EdbCode
-		//calculateItem.FromEdbName = fromEdbInfo.EdbName
-		//calculateItem.FromSource = fromEdbInfo.Source
-		//calculateItem.FromSourceName = fromEdbInfo.SourceName
-		//
-		//_, err = to.Insert(calculateItem)
-		//if err != nil {
-		//	return edbInfoId, err
-		//}
-
-		//关联关系
-		{
-			calculateMappingItem := new(EdbInfoCalculateMapping)
-			calculateMappingItem.CreateTime = time.Now()
-			calculateMappingItem.ModifyTime = time.Now()
-			calculateMappingItem.Sort = 1
-			calculateMappingItem.EdbCode = edbCode
-			calculateMappingItem.EdbInfoId = edbInfoId
-			calculateMappingItem.FromEdbInfoId = fromEdbInfo.EdbInfoId
-			calculateMappingItem.FromEdbCode = fromEdbInfo.EdbCode
-			calculateMappingItem.FromEdbName = fromEdbInfo.EdbName
-			calculateMappingItem.FromSource = fromEdbInfo.Source
-			calculateMappingItem.FromSourceName = fromEdbInfo.SourceName
-			calculateMappingItem.FromTag = ""
-			calculateMappingItem.Source = edbInfo.Source
-			calculateMappingItem.SourceName = edbInfo.SourceName
-			_, err = to.Insert(calculateMappingItem)
-			if err != nil {
-				return
-			}
-		}
-
-	} else {
-		edbInfoId = req.EdbInfoId
-		dataTableName := GetEdbDataTableName(utils.DATA_SOURCE_CALCULATE_TBZ, utils.DATA_SUB_SOURCE_EDB)
-		deleteSql := ` DELETE FROM %s WHERE edb_info_id=? `
-		deleteSql = fmt.Sprintf(deleteSql, dataTableName)
-		_, err = to.Raw(deleteSql, req.EdbInfoId).Exec()
-	}
-
-	edbInfoIdStr := strconv.Itoa(edbInfoId)
-
-	//计算数据
-	var condition string
-	var pars []interface{}
-	condition += " AND edb_info_id=? "
-	if req.EdbInfoId <= 0 {
-		pars = append(pars, req.FromEdbInfoId)
-	} else {
-		pars = append(pars, fromEdbInfo.EdbInfoId)
-	}
-	dataList, err := GetEdbDataListAll(condition, pars, fromEdbInfo.Source, fromEdbInfo.SubSource, 0)
-	if err != nil {
-		return edbInfoId, err
-	}
-	var dateArr []string
-	dataMap := make(map[string]*EdbInfoSearchData)
-	for _, v := range dataList {
-		dateArr = append(dateArr, v.DataTime)
-		dataMap[v.DataTime] = v
-	}
-
-	addSql := ` INSERT INTO edb_data_calculate_tbz(edb_info_id,edb_code,data_time,value,create_time,modify_time,status,data_timestamp) values `
-	var isAdd bool
-	existMap := make(map[string]string)
-	for _, av := range dateArr {
-		//fmt.Println(ak, av)
-		currentItem := dataMap[av]
-		if currentItem != nil {
-			//当前日期
-			currentDate, err := time.Parse(utils.FormatDate, av)
-			if err != nil {
-				return edbInfoId, err
-			}
-			//上一年的日期
-			preDate := currentDate.AddDate(-1, 0, 0)
-			preDateStr := preDate.Format(utils.FormatDate)
-			if findItem, ok := dataMap[preDateStr]; ok { //上一年同期找到
-				//dataTime, _ := time.Parse(utils.FormatDate, date)
-				if _, ok := existMap[edbCode+av]; !ok {
-					timestamp := currentDate.UnixNano() / 1e6
-					timestampStr := fmt.Sprintf("%d", timestamp)
-					val := TbzDiv(currentItem.Value, findItem.Value)
-					addSql += GetAddSql(edbInfoIdStr, edbCode, av, timestampStr, val)
-					isAdd = true
-					utils.FileLog.Info("同期找到:" + av + ";" + preDateStr)
-				}
-				existMap[edbCode+av] = av
-			} else {
-				if fromEdbInfo.Frequency == "月度" { //向上和向下,各找一个月
-					nextDateDay := preDate
-					preDateDay := preDate
-					for i := 0; i <= 35; i++ {
-						nextDateDayStr := nextDateDay.Format(utils.FormatDate)
-						if findItem, ok := dataMap[nextDateDayStr]; ok { //上一年同期->下一个月找到
-							if _, ok := existMap[edbCode+av]; !ok {
-								timestamp := currentDate.UnixNano() / 1e6
-								timestampStr := fmt.Sprintf("%d", timestamp)
-								val := TbzDiv(currentItem.Value, findItem.Value)
-								addSql += GetAddSql(edbInfoIdStr, edbCode, av, timestampStr, val)
-								isAdd = true
-							}
-							existMap[edbCode+av] = av
-							break
-						} else {
-							preDateDayStr := preDateDay.Format(utils.FormatDate)
-							if findItem, ok := dataMap[preDateDayStr]; ok { //上一年同期->上一个月找到
-								if _, ok := existMap[edbCode+av]; !ok {
-									timestamp := currentDate.UnixNano() / 1e6
-									timestampStr := fmt.Sprintf("%d", timestamp)
-									val := TbzDiv(currentItem.Value, findItem.Value)
-
-									addSql += GetAddSql(edbInfoIdStr, edbCode, av, timestampStr, val)
-									isAdd = true
-								}
-								existMap[edbCode+av] = av
-								break
-							}
-						}
-						nextDateDay = nextDateDay.AddDate(0, 0, 1)
-						preDateDay = preDateDay.AddDate(0, 0, -1)
-					}
-				} else if fromEdbInfo.Frequency == "季度" || fromEdbInfo.Frequency == "年度" {
-					if findItem, ok := dataMap[preDateStr]; ok { //上一年同期->下一个月找到
-						if _, ok := existMap[edbCode+av]; !ok {
-							timestamp := currentDate.UnixNano() / 1e6
-							timestampStr := fmt.Sprintf("%d", timestamp)
-							val := TbzDiv(currentItem.Value, findItem.Value)
-
-							addSql += GetAddSql(edbInfoIdStr, edbCode, av, timestampStr, val)
-							isAdd = true
-						}
-						existMap[edbCode+av] = av
-						break
-					}
-				} else {
-					nextDateDay := preDate
-					preDateDay := preDate
-
-					for i := 0; i < 35; i++ {
-						nextDateDayStr := nextDateDay.Format(utils.FormatDate)
-						if findItem, ok := dataMap[nextDateDayStr]; ok { //上一年同期->下一个月找到
-							if _, ok := existMap[edbCode+av]; !ok {
-								timestamp := currentDate.UnixNano() / 1e6
-								timestampStr := fmt.Sprintf("%d", timestamp)
-								val := TbzDiv(currentItem.Value, findItem.Value)
-								addSql += GetAddSql(edbInfoIdStr, edbCode, av, timestampStr, val)
-								isAdd = true
-							}
-							existMap[edbCode+av] = av
-							break
-						} else {
-							preDateDayStr := preDateDay.Format(utils.FormatDate)
-							if findItem, ok := dataMap[preDateDayStr]; ok { //上一年同期->上一个月找到
-								if _, ok := existMap[edbCode+av]; !ok {
-									timestamp := currentDate.UnixNano() / 1e6
-									timestampStr := fmt.Sprintf("%d", timestamp)
-									val := TbzDiv(currentItem.Value, findItem.Value)
-									addSql += GetAddSql(edbInfoIdStr, edbCode, av, timestampStr, val)
-									isAdd = true
-								}
-								existMap[edbCode+av] = av
-								break
-							} else {
-								//fmt.Println("pre not find:", preDateStr, "i:", i)
-							}
-						}
-						nextDateDay = nextDateDay.AddDate(0, 0, 1)
-						preDateDay = preDateDay.AddDate(0, 0, -1)
-					}
-				}
-			}
-		}
-	}
-	if isAdd {
-		addSql = strings.TrimRight(addSql, ",")
-		_, err = to.Raw(addSql).Exec()
-		if err != nil {
-			return edbInfoId, err
-		}
-	}
-	return
-}
-
-func GetAddSql(edbInfoId, edbCode, dataTime, timestampStr string, value string) (addSql string) {
-	nowStr := time.Now().Format(utils.FormatDateTime)
-	addSql += "("
-	addSql += edbInfoId + "," + "'" + edbCode + "'" + "," + "'" + dataTime + "'" + "," + value + "," + "'" + nowStr + "'" +
-		"," + "'" + nowStr + "'" + "," + "1"
-	addSql += "," + "'" + timestampStr + "'"
-	addSql += "),"
-	return
-}
-
-func TbzDiv(a, b float64) string {
-	var valStr string
-	if b != 0 {
-		af := decimal.NewFromFloat(float64(a))
-		bf := decimal.NewFromFloat(float64(b))
-		val, _ := af.Div(bf).Float64()
-		val = val - 1
-		valStr = utils.SubFloatToString(val, 4)
-	} else {
-		valStr = "0"
-	}
-	return valStr
-}
-
-type EdbInfoCalculateTbzDetail struct {
-	EdbInfoCalculateTbzId int       `orm:"column(edb_info_calculate_tbz_id);pk"`
-	EdbInfoId             int       `description:"指标id"`
-	EdbCode               string    `description:"指标编码"`
-	FromEdbInfoId         int       `description:"计算指标id"`
-	FromEdbCode           string    `description:"计算指标编码"`
-	FromEdbName           string    `description:"计算指标名称"`
-	FromSource            int       `description:"计算指标来源"`
-	FromSourceName        string    `description:"计算指标来源名称"`
-	FromTag               string    `description:"来源指标标签"`
-	Sort                  int       `description:"计算指标名称排序"`
-	CreateTime            time.Time `description:"创建时间"`
-	ModifyTime            time.Time `description:"修改时间"`
-	StartDate             string    `description:"开始日期"`
-	EndDate               string    `description:"结束日期"`
-}
-
-func GetEdbInfoCalculateTbzDetail(edbInfoId int) (item *EdbInfoCalculateTbzDetail, err error) {
-	o := orm.NewOrmUsingDB("data")
-	sql := ` SELECT a.*,b.start_date,b.end_date FROM edb_info_calculate_mapping AS a
-			INNER JOIN edb_info AS b ON a.from_edb_info_id=b.edb_info_id
-			WHERE a.edb_info_id=? `
-	err = o.Raw(sql, edbInfoId).QueryRow(&item)
-	return
-}
-
-func GetEdbDataCalculateTbzByCodeAndDate(edbCode string, startDate string) (count int, err error) {
-	o := orm.NewOrmUsingDB("data")
-	sql := ` SELECT COUNT(1) AS count FROM edb_data_calculate_tbz WHERE edb_code=? AND data_time=? `
-	err = o.Raw(sql, edbCode, startDate).QueryRow(&count)
-	return
-}
-
-func ModifyEdbDataCalculateTbz(edbInfoId int64, dataTime, value string) (err error) {
-	o := orm.NewOrmUsingDB("data")
-	sql := ` UPDATE edb_data_calculate_tbz SET value=?,modify_time=NOW() WHERE edb_info_id=? AND data_time=? `
-	_, err = o.Raw(sql, value, edbInfoId, dataTime).Exec()
-	return
-}

+ 0 - 1019
models/data_manage/edb_info_calculate_tcz.go

@@ -1,1019 +0,0 @@
-package data_manage
-
-import (
-	"errors"
-	"eta/eta_api/utils"
-	"fmt"
-	"github.com/beego/beego/v2/client/orm"
-	"github.com/shopspring/decimal"
-	"strconv"
-	"strings"
-	"time"
-)
-
-type EdbInfoCalculateTcz struct {
-	EdbInfoCalculateTbzId int       `orm:"column(edb_info_calculate_tcz_id);pk"`
-	EdbInfoId             int       `description:"指标id"`
-	EdbCode               string    `description:"指标编码"`
-	FromEdbInfoId         int       `description:"计算指标id"`
-	FromEdbCode           string    `description:"计算指标编码"`
-	FromEdbName           string    `description:"计算指标名称"`
-	FromSource            int       `description:"计算指标来源"`
-	FromSourceName        string    `description:"计算指标来源名称"`
-	FromTag               string    `description:"来源指标标签"`
-	Sort                  int       `description:"计算指标名称排序"`
-	CreateTime            time.Time `description:"创建时间"`
-	ModifyTime            time.Time `description:"修改时间"`
-}
-
-// 同差值
-func AddCalculateTcz(req *EdbInfoCalculateBatchSaveReq, fromEdbInfo *EdbInfo, edbCode, uniqueCode string, sysUserId int, sysUserRealName string) (edbInfoId int, err error) {
-	o := orm.NewOrmUsingDB("data")
-	to, err := o.Begin()
-	if err != nil {
-		return
-	}
-	defer func() {
-		if err != nil {
-			fmt.Println("err:", err.Error())
-			_ = to.Rollback()
-		} else {
-			_ = to.Commit()
-		}
-	}()
-	fmt.Println("req.EdbInfoId:", req.EdbInfoId)
-	if req.EdbInfoId <= 0 {
-		edbInfo := new(EdbInfo)
-		edbInfo.Source = utils.DATA_SOURCE_CALCULATE_TCZ
-		edbInfo.SourceName = "同差值"
-		edbInfo.EdbCode = edbCode
-		edbInfo.EdbName = req.EdbName
-		edbInfo.EdbNameSource = req.EdbName
-		edbInfo.Frequency = req.Frequency
-		edbInfo.Unit = req.Unit
-		edbInfo.ClassifyId = req.ClassifyId
-		edbInfo.SysUserId = sysUserId
-		edbInfo.SysUserRealName = sysUserRealName
-		edbInfo.CreateTime = time.Now()
-		edbInfo.ModifyTime = time.Now()
-		edbInfo.UniqueCode = uniqueCode
-		edbInfo.CalculateFormula = req.Formula
-		edbInfo.EdbType = 2
-		newEdbInfoId, tmpErr := to.Insert(edbInfo)
-		if tmpErr != nil {
-			return edbInfoId, tmpErr
-		}
-		edbInfoId = int(newEdbInfoId)
-
-		//calculateItem := new(EdbInfoCalculateTcz)
-		//calculateItem.CreateTime = time.Now()
-		//calculateItem.ModifyTime = time.Now()
-		//calculateItem.Sort = 1
-		//calculateItem.EdbCode = edbCode
-		//calculateItem.EdbInfoId = edbInfoId
-		//calculateItem.FromEdbInfoId = fromEdbInfo.EdbInfoId
-		//calculateItem.FromEdbCode = fromEdbInfo.EdbCode
-		//calculateItem.FromEdbName = fromEdbInfo.EdbName
-		//calculateItem.FromSource = fromEdbInfo.Source
-		//calculateItem.FromSourceName = fromEdbInfo.SourceName
-		//
-		//_, err = to.Insert(calculateItem)
-		//if err != nil {
-		//	return edbInfoId, err
-		//}
-
-		//关联关系
-		{
-			calculateMappingItem := new(EdbInfoCalculateMapping)
-			calculateMappingItem.CreateTime = time.Now()
-			calculateMappingItem.ModifyTime = time.Now()
-			calculateMappingItem.Sort = 1
-			calculateMappingItem.EdbCode = edbCode
-			calculateMappingItem.EdbInfoId = edbInfoId
-			calculateMappingItem.FromEdbInfoId = fromEdbInfo.EdbInfoId
-			calculateMappingItem.FromEdbCode = fromEdbInfo.EdbCode
-			calculateMappingItem.FromEdbName = fromEdbInfo.EdbName
-			calculateMappingItem.FromSource = fromEdbInfo.Source
-			calculateMappingItem.FromSourceName = fromEdbInfo.SourceName
-			calculateMappingItem.FromTag = ""
-			calculateMappingItem.Source = edbInfo.Source
-			calculateMappingItem.SourceName = edbInfo.SourceName
-			_, err = to.Insert(calculateMappingItem)
-			if err != nil {
-				return
-			}
-		}
-	} else {
-		edbInfoId = req.EdbInfoId
-		dataTableName := GetEdbDataTableName(utils.DATA_SOURCE_CALCULATE_TCZ, utils.DATA_SUB_SOURCE_EDB)
-		fmt.Println("dataTableName:", dataTableName)
-		deleteSql := ` DELETE FROM %s WHERE edb_info_id=? `
-		deleteSql = fmt.Sprintf(deleteSql, dataTableName)
-		_, err = to.Raw(deleteSql, req.EdbInfoId).Exec()
-		if err != nil {
-			return edbInfoId, err
-		}
-	}
-
-	edbInfoIdStr := strconv.Itoa(edbInfoId)
-
-	//计算数据
-	var condition string
-	var pars []interface{}
-	condition += " AND edb_info_id=? "
-	if req.EdbInfoId <= 0 {
-		pars = append(pars, req.FromEdbInfoId)
-	} else {
-		pars = append(pars, fromEdbInfo.EdbInfoId)
-	}
-
-	fmt.Println("EdbInfoId:", req.FromEdbInfoId)
-	dataList, err := GetEdbDataListAll(condition, pars, fromEdbInfo.Source, fromEdbInfo.SubSource, 0)
-	if err != nil {
-		return edbInfoId, err
-	}
-	var dateArr []string
-	dataMap := make(map[string]*EdbInfoSearchData)
-	for _, v := range dataList {
-		dateArr = append(dateArr, v.DataTime)
-		dataMap[v.DataTime] = v
-	}
-	fmt.Println("Frequency:", fromEdbInfo.Frequency)
-	addSql := ` INSERT INTO edb_data_calculate_tcz(edb_info_id,edb_code,data_time,value,create_time,modify_time,status,data_timestamp) values `
-	var isAdd bool
-	existMap := make(map[string]string)
-	for _, av := range dateArr {
-		//fmt.Println("dateArr:", ak, av)
-		currentItem := dataMap[av]
-		if currentItem != nil {
-			//当前日期
-			currentDate, err := time.Parse(utils.FormatDate, av)
-			if err != nil {
-				return edbInfoId, err
-			}
-			//上一年的日期
-			preDate := currentDate.AddDate(-1, 0, 0)
-			preDateStr := preDate.Format(utils.FormatDate)
-			if findItem, ok := dataMap[preDateStr]; ok { //上一年同期找到
-				//dataTime, _ := time.Parse(utils.FormatDate, date)
-				if _, ok := existMap[edbCode+av]; !ok {
-					timestamp := currentDate.UnixNano() / 1e6
-					timestampStr := fmt.Sprintf("%d", timestamp)
-
-					val := TczSub(currentItem.Value, findItem.Value)
-					addSql += GetAddSql(edbInfoIdStr, edbCode, av, timestampStr, val)
-					isAdd = true
-				}
-				existMap[edbCode+av] = av
-			} else {
-				if fromEdbInfo.Frequency == "月度" { //向上和向下,各找一个月
-					nextDateDay := preDate
-					preDateDay := preDate
-					for i := 0; i <= 35; i++ {
-						nextDateDayStr := nextDateDay.Format(utils.FormatDate)
-						if findItem, ok := dataMap[nextDateDayStr]; ok { //下一年同期->下一个月找到
-							if _, ok := existMap[edbCode+av]; !ok {
-								timestamp := currentDate.UnixNano() / 1e6
-								timestampStr := fmt.Sprintf("%d", timestamp)
-								val := TczSub(currentItem.Value, findItem.Value)
-
-								addSql += GetAddSql(edbInfoIdStr, edbCode, av, timestampStr, val)
-								isAdd = true
-							}
-							existMap[edbCode+av] = av
-							break
-						} else {
-							preDateDayStr := preDateDay.Format(utils.FormatDate)
-							if findItem, ok := dataMap[preDateDayStr]; ok { //上一年同期->上一个月找到
-								if _, ok := existMap[edbCode+av]; !ok {
-									timestamp := currentDate.UnixNano() / 1e6
-									timestampStr := fmt.Sprintf("%d", timestamp)
-									val := TczSub(currentItem.Value, findItem.Value)
-
-									addSql += GetAddSql(edbInfoIdStr, edbCode, av, timestampStr, val)
-									isAdd = true
-								}
-								existMap[edbCode+av] = av
-								break
-							}
-						}
-						nextDateDay = nextDateDay.AddDate(0, 0, 1)
-						preDateDay = preDateDay.AddDate(0, 0, -1)
-					}
-				} else if fromEdbInfo.Frequency == "季度" || fromEdbInfo.Frequency == "年度" {
-					if findItem, ok := dataMap[preDateStr]; ok { //上一年同期->下一个月找到
-						if _, ok := existMap[edbCode+av]; !ok {
-							timestamp := currentDate.UnixNano() / 1e6
-							timestampStr := fmt.Sprintf("%d", timestamp)
-							val := TczSub(currentItem.Value, findItem.Value)
-							addSql += GetAddSql(edbInfoIdStr, edbCode, av, timestampStr, val)
-							isAdd = true
-						}
-						existMap[edbCode+av] = av
-						break
-					}
-				} else {
-					nextDateDay := preDate
-					preDateDay := preDate
-					for i := 0; i < 35; i++ {
-						nextDateDayStr := nextDateDay.Format(utils.FormatDate)
-						if findItem, ok := dataMap[nextDateDayStr]; ok { //上一年同期->下一个月找到
-							if _, ok := existMap[edbCode+av]; !ok {
-								timestamp := currentDate.UnixNano() / 1e6
-								timestampStr := fmt.Sprintf("%d", timestamp)
-								val := TczSub(currentItem.Value, findItem.Value)
-
-								addSql += GetAddSql(edbInfoIdStr, edbCode, av, timestampStr, val)
-								isAdd = true
-							}
-							existMap[edbCode+av] = av
-							break
-						} else {
-							preDateDayStr := preDateDay.Format(utils.FormatDate)
-							if findItem, ok := dataMap[preDateDayStr]; ok { //上一年同期->上一个月找到
-								if _, ok := existMap[edbCode+av]; !ok {
-									timestamp := currentDate.UnixNano() / 1e6
-									timestampStr := fmt.Sprintf("%d", timestamp)
-									val := TczSub(currentItem.Value, findItem.Value)
-
-									addSql += GetAddSql(edbInfoIdStr, edbCode, av, timestampStr, val)
-									isAdd = true
-								}
-								existMap[edbCode+av] = av
-								break
-							} else {
-
-							}
-						}
-						nextDateDay = nextDateDay.AddDate(0, 0, 1)
-						preDateDay = preDateDay.AddDate(0, 0, -1)
-					}
-				}
-			}
-		}
-	}
-	if isAdd {
-		addSql = strings.TrimRight(addSql, ",")
-		_, err = to.Raw(addSql).Exec()
-		if err != nil {
-			return edbInfoId, err
-		}
-	}
-	return
-}
-
-func TczSub(a, b float64) string {
-	af := decimal.NewFromFloat(float64(a))
-	fmt.Println(af)
-	bf := decimal.NewFromFloat(float64(b))
-	val, _ := af.Sub(bf).Float64()
-	valStr := utils.SubFloatToString(val, 4)
-	return valStr
-}
-
-// 同差值
-func EditCalculateTcz(req *EdbInfoCalculateBatchEditReq, fromEdbInfo *EdbInfo, edbCode string) (edbInfoId int, err error) {
-	edbInfoId = req.EdbInfoId
-	o := orm.NewOrmUsingDB("data")
-	to, err := o.Begin()
-	if err != nil {
-		return
-	}
-	defer func() {
-		if err != nil {
-			fmt.Println("err:", err.Error())
-			_ = to.Rollback()
-		} else {
-			_ = to.Commit()
-		}
-	}()
-
-	//修改指标信息
-	sql := ` UPDATE  edb_info
-			SET
-			  edb_name =?,
-			  edb_name_source=?,
-			  frequency = ?,
-			  unit = ?,
-			  classify_id = ?,
-			  modify_time = NOW()
-			WHERE edb_info_id = ? `
-	_, err = to.Raw(sql, req.EdbName, req.EdbName, req.Frequency, req.Unit, req.ClassifyId, edbInfoId).Exec()
-	if err != nil {
-		return
-	}
-
-	var existCondition string
-	var existPars []interface{}
-	existCondition += " AND edb_info_id=? "
-	existPars = append(existPars, edbInfoId)
-
-	existCondition += " AND from_edb_info_id=? "
-	existPars = append(existPars, req.FromEdbInfoId)
-
-	//判断计算指标是否被更换
-	count, err := GetEdbInfoCalculateCountByCondition(req.Source, existCondition, existPars)
-	if err != nil {
-		err = errors.New("判断指标是否改变失败,Err:" + err.Error())
-		return
-	}
-	if count <= 0 {
-		//删除指标关联计算指标
-		//sql := ` DELETE FROM edb_info_calculate_tcz WHERE edb_info_id = ? `
-		//_, err = to.Raw(sql, edbInfoId).Exec()
-		//if err != nil {
-		//	return
-		//}
-		//
-		//calculateItem := new(EdbInfoCalculateTcz)
-		//calculateItem.CreateTime = time.Now()
-		//calculateItem.ModifyTime = time.Now()
-		//calculateItem.Sort = 1
-		//calculateItem.EdbCode = edbCode
-		//calculateItem.EdbInfoId = edbInfoId
-		//calculateItem.FromEdbInfoId = fromEdbInfo.EdbInfoId
-		//calculateItem.FromEdbCode = fromEdbInfo.EdbCode
-		//calculateItem.FromEdbName = fromEdbInfo.EdbName
-		//calculateItem.FromSource = fromEdbInfo.Source
-		//calculateItem.FromSourceName = fromEdbInfo.SourceName
-		//
-		//_, err = to.Insert(calculateItem)
-		//if err != nil {
-		//	return
-		//}
-
-		//删除,计算指标关联的,基础指标的关联关系
-		sql = ` DELETE FROM edb_info_calculate_mapping WHERE edb_info_id = ? `
-		_, err = to.Raw(sql, edbInfoId).Exec()
-		if err != nil {
-			return
-		}
-
-		//清空原有数据
-		sql = ` DELETE FROM edb_data_calculate_tcz WHERE edb_info_id = ? `
-		_, err = to.Raw(sql, edbInfoId).Exec()
-		if err != nil {
-			return edbInfoId, err
-		}
-
-		//关联关系
-		{
-			calculateMappingItem := new(EdbInfoCalculateMapping)
-			calculateMappingItem.CreateTime = time.Now()
-			calculateMappingItem.ModifyTime = time.Now()
-			calculateMappingItem.Sort = 1
-			calculateMappingItem.EdbCode = edbCode
-			calculateMappingItem.EdbInfoId = edbInfoId
-			calculateMappingItem.FromEdbInfoId = fromEdbInfo.EdbInfoId
-			calculateMappingItem.FromEdbCode = fromEdbInfo.EdbCode
-			calculateMappingItem.FromEdbName = fromEdbInfo.EdbName
-			calculateMappingItem.FromSource = fromEdbInfo.Source
-			calculateMappingItem.FromSourceName = fromEdbInfo.SourceName
-			calculateMappingItem.FromTag = ""
-			calculateMappingItem.Source = utils.DATA_SOURCE_CALCULATE_TCZ
-			calculateMappingItem.SourceName = "同差值"
-			_, err = to.Insert(calculateMappingItem)
-			if err != nil {
-				return
-			}
-		}
-
-		edbInfoIdStr := strconv.Itoa(edbInfoId)
-
-		//计算数据
-		var condition string
-		var pars []interface{}
-		condition += " AND edb_info_id=? "
-		pars = append(pars, req.FromEdbInfoId)
-		fmt.Println("EdbInfoId:", req.FromEdbInfoId)
-		dataList, err := GetEdbDataListAll(condition, pars, fromEdbInfo.Source, fromEdbInfo.SubSource, 0)
-		if err != nil {
-			return edbInfoId, err
-		}
-		var dateArr []string
-		dataMap := make(map[string]*EdbInfoSearchData)
-		for _, v := range dataList {
-			dateArr = append(dateArr, v.DataTime)
-			dataMap[v.DataTime] = v
-		}
-
-		addSql := ` INSERT INTO edb_data_calculate_tcz(edb_info_id,edb_code,data_time,value,create_time,modify_time,status,data_timestamp) values `
-		var isAdd bool
-		for ak, av := range dateArr {
-			fmt.Println(ak, av)
-			currentItem := dataMap[av]
-			if currentItem != nil {
-				//当前日期
-				currentDate, err := time.Parse(utils.FormatDate, av)
-				if err != nil {
-					return edbInfoId, err
-				}
-				//上一年的日期
-				preDate := currentDate.AddDate(-1, 0, 0)
-				preDateStr := preDate.Format(utils.FormatDate)
-				if findItem, ok := dataMap[preDateStr]; ok { //上一年同期找到
-					//dataTime, _ := time.Parse(utils.FormatDate, date)
-					timestamp := currentDate.UnixNano() / 1e6
-					timestampStr := fmt.Sprintf("%d", timestamp)
-
-					val := TczSub(currentItem.Value, findItem.Value)
-					addSql += GetAddSql(edbInfoIdStr, edbCode, av, timestampStr, val)
-					isAdd = true
-					utils.FileLog.Info("同期找到:" + av + ";" + preDateStr)
-					continue
-				} else {
-					if fromEdbInfo.Frequency == "月度" { //向上和向下,各找一个月
-						nextDateDay := preDate.AddDate(0, 1, 0)
-						nextDateDayStr := nextDateDay.Format(utils.FormatDate)
-
-						preDateDay := preDate.AddDate(0, -1, 0)
-						preDateDayStr := preDateDay.Format(utils.FormatDate)
-
-						for i := 0; i <= 6; i++ {
-							if i >= 1 {
-								nextDateDay = nextDateDay.AddDate(0, 0, i)
-								nextDateDayStr = nextDateDay.Format(utils.FormatDate)
-							}
-							if findItem, ok := dataMap[nextDateDayStr]; ok { //上一年同期->下一个月找到
-								timestamp := currentDate.UnixNano() / 1e6
-								timestampStr := fmt.Sprintf("%d", timestamp)
-								val := TczSub(currentItem.Value, findItem.Value)
-
-								addSql += GetAddSql(edbInfoIdStr, edbCode, av, timestampStr, val)
-								isAdd = true
-								break
-							} else {
-								if i >= 1 {
-									preDateDay = preDate.AddDate(0, 0, -i)
-									preDateDayStr = nextDateDay.Format(utils.FormatDate)
-								}
-								if findItem, ok := dataMap[preDateDayStr]; ok { //上一年同期->上一个月找到
-									timestamp := currentDate.UnixNano() / 1e6
-									timestampStr := fmt.Sprintf("%d", timestamp)
-									val := TczSub(currentItem.Value, findItem.Value)
-
-									addSql += GetAddSql(edbInfoIdStr, edbCode, av, timestampStr, val)
-									isAdd = true
-									break
-								}
-							}
-						}
-					} else if fromEdbInfo.Frequency == "季度" || fromEdbInfo.Frequency == "年度" {
-						if findItem, ok := dataMap[preDateStr]; ok { //上一年同期->下一个月找到
-							timestamp := currentDate.UnixNano() / 1e6
-							timestampStr := fmt.Sprintf("%d", timestamp)
-							val := TczSub(currentItem.Value, findItem.Value)
-
-							addSql += GetAddSql(edbInfoIdStr, edbCode, av, timestampStr, val)
-							isAdd = true
-							break
-						}
-					} else {
-						nextDateDay := preDate.AddDate(0, 0, 1)
-						nextDateDayStr := nextDateDay.Format(utils.FormatDate)
-
-						preDateDay := preDate.AddDate(0, 0, -1)
-						preDateDayStr := preDateDay.Format(utils.FormatDate)
-
-						for i := 0; i < 35; i++ {
-							if i >= 1 {
-								nextDateDay = nextDateDay.AddDate(0, 0, i)
-								nextDateDayStr = nextDateDay.Format(utils.FormatDate)
-							}
-							if findItem, ok := dataMap[nextDateDayStr]; ok { //上一年同期->下一个月找到
-								timestamp := currentDate.UnixNano() / 1e6
-								timestampStr := fmt.Sprintf("%d", timestamp)
-								val := TczSub(currentItem.Value, findItem.Value)
-
-								addSql += GetAddSql(edbInfoIdStr, edbCode, av, timestampStr, val)
-								isAdd = true
-								break
-							} else {
-								if i >= 1 {
-									preDateDay = preDate.AddDate(0, 0, -i)
-									preDateDayStr = nextDateDay.Format(utils.FormatDate)
-								}
-								if findItem, ok := dataMap[preDateDayStr]; ok { //上一年同期->上一个月找到
-									timestamp := currentDate.UnixNano() / 1e6
-									timestampStr := fmt.Sprintf("%d", timestamp)
-									val := TczSub(currentItem.Value, findItem.Value)
-
-									addSql += GetAddSql(edbInfoIdStr, edbCode, av, timestampStr, val)
-									isAdd = true
-									break
-								}
-							}
-						}
-					}
-				}
-			}
-		}
-		if isAdd {
-			addSql = strings.TrimRight(addSql, ",")
-			_, err = to.Raw(addSql).Exec()
-			if err != nil {
-				return edbInfoId, err
-			}
-		}
-	}
-	return
-}
-
-// 刷新同差值数据
-func RefreshCalculateTcz(edbInfoId int, fromEdbInfo *EdbInfo, edbCode, startDate, endDate 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()
-		}
-	}()
-
-	if err != nil {
-		return
-	}
-	edbInfoIdStr := strconv.Itoa(edbInfoId)
-	//计算数据
-
-	//计算数据
-	var condition string
-	var pars []interface{}
-	condition += " AND edb_info_id=? "
-	pars = append(pars, fromEdbInfo.EdbInfoId)
-
-	if startDate != "" {
-		condition += " AND data_time>=? "
-		pars = append(pars, startDate)
-	}
-	if endDate != "" {
-		condition += " AND data_time<=? "
-		pars = append(pars, endDate)
-	}
-
-	dataList, err := GetEdbDataListAll(condition, pars, fromEdbInfo.Source, fromEdbInfo.SubSource, 0)
-	if err != nil {
-		return err
-	}
-	var dateArr []string
-	dataMap := make(map[string]*EdbInfoSearchData)
-	for _, v := range dataList {
-		dateArr = append(dateArr, v.DataTime)
-		dataMap[v.DataTime] = v
-	}
-
-	addSql := ` INSERT INTO edb_data_calculate_tcz(edb_info_id,edb_code,data_time,value,create_time,modify_time,status,data_timestamp) values `
-	var isAdd bool
-	for ak, av := range dateArr {
-		fmt.Println(ak, av)
-		currentItem := dataMap[av]
-		if currentItem != nil {
-			//当前日期
-			currentDate, err := time.Parse(utils.FormatDate, av)
-			if err != nil {
-				return err
-			}
-			//上一年的日期
-			preDate := currentDate.AddDate(-1, 0, 0)
-			preDateStr := preDate.Format(utils.FormatDate)
-			if findItem, ok := dataMap[preDateStr]; ok { //上一年同期找到
-				//dataTime, _ := time.Parse(utils.FormatDate, date)
-				timestamp := currentDate.UnixNano() / 1e6
-				timestampStr := fmt.Sprintf("%d", timestamp)
-				val := TczSub(currentItem.Value, findItem.Value)
-
-				count, err := GetEdbDataCalculateTczByCodeAndDate(edbCode, av)
-				if err != nil && err.Error() != utils.ErrNoRow() {
-					return err
-				}
-				if count <= 0 {
-					addSql += GetAddSql(edbInfoIdStr, edbCode, av, timestampStr, val)
-					isAdd = true
-				} else {
-					err = ModifyEdbDataCalculateTcz(int64(edbInfoId), av, val)
-					if err != nil {
-						return err
-					}
-				}
-				utils.FileLog.Info("同期找到:" + av + ";" + preDateStr)
-				continue
-			} else {
-				if fromEdbInfo.Frequency == "月度" { //向上和向下,各找一个月
-					for i := 0; i <= 35; i++ {
-						nextDateDay := preDate.AddDate(0, 0, 1)
-						nextDateDayStr := nextDateDay.Format(utils.FormatDate)
-						if findItem, ok := dataMap[nextDateDayStr]; ok { //上一年同期->下一个月找到
-							timestamp := currentDate.UnixNano() / 1e6
-							timestampStr := fmt.Sprintf("%d", timestamp)
-							val := TczSub(currentItem.Value, findItem.Value)
-
-							count, err := GetEdbDataCalculateTczByCodeAndDate(edbCode, av)
-							if err != nil && err.Error() != utils.ErrNoRow() {
-								return err
-							}
-							if count <= 0 {
-								addSql += GetAddSql(edbInfoIdStr, edbCode, av, timestampStr, val)
-								isAdd = true
-							} else {
-								err = ModifyEdbDataCalculateTcz(int64(edbInfoId), av, val)
-								if err != nil {
-									return err
-								}
-							}
-							break
-						} else {
-							preDateDay := preDate.AddDate(0, 0, -1)
-							preDateDayStr := preDateDay.Format(utils.FormatDate)
-							if findItem, ok := dataMap[preDateDayStr]; ok { //上一年同期->上一个月找到
-								timestamp := currentDate.UnixNano() / 1e6
-								timestampStr := fmt.Sprintf("%d", timestamp)
-								val := TczSub(currentItem.Value, findItem.Value)
-
-								count, err := GetEdbDataCalculateTczByCodeAndDate(edbCode, av)
-								if err != nil && err.Error() != utils.ErrNoRow() {
-									return err
-								}
-								if count <= 0 {
-									addSql += GetAddSql(edbInfoIdStr, edbCode, av, timestampStr, val)
-									isAdd = true
-								} else {
-									err = ModifyEdbDataCalculateTcz(int64(edbInfoId), av, val)
-									if err != nil {
-										return err
-									}
-								}
-								break
-							}
-						}
-					}
-				} else if fromEdbInfo.Frequency == "季度" || fromEdbInfo.Frequency == "年度" {
-					if findItem, ok := dataMap[preDateStr]; ok { //上一年同期->下一个月找到
-						timestamp := currentDate.UnixNano() / 1e6
-						timestampStr := fmt.Sprintf("%d", timestamp)
-						val := TczSub(currentItem.Value, findItem.Value)
-
-						count, err := GetEdbDataCalculateTczByCodeAndDate(edbCode, av)
-						if err != nil && err.Error() != utils.ErrNoRow() {
-							return err
-						}
-						if count <= 0 {
-							addSql += GetAddSql(edbInfoIdStr, edbCode, av, timestampStr, val)
-							isAdd = true
-						} else {
-							err = ModifyEdbDataCalculateTcz(int64(edbInfoId), av, val)
-							if err != nil {
-								return err
-							}
-						}
-						break
-					}
-				} else {
-					for i := 0; i < 35; i++ {
-						nextDateDay := preDate.AddDate(0, 0, 1)
-						nextDateDayStr := nextDateDay.Format(utils.FormatDate)
-						if findItem, ok := dataMap[nextDateDayStr]; ok { //上一年同期->下一个月找到
-							timestamp := currentDate.UnixNano() / 1e6
-							timestampStr := fmt.Sprintf("%d", timestamp)
-							val := TczSub(currentItem.Value, findItem.Value)
-
-							count, err := GetEdbDataCalculateTczByCodeAndDate(edbCode, av)
-							if err != nil && err.Error() != utils.ErrNoRow() {
-								return err
-							}
-							if count <= 0 {
-								addSql += GetAddSql(edbInfoIdStr, edbCode, av, timestampStr, val)
-								isAdd = true
-							} else {
-								err = ModifyEdbDataCalculateTcz(int64(edbInfoId), av, val)
-								if err != nil {
-									return err
-								}
-							}
-							break
-						} else {
-							preDateDay := preDate.AddDate(0, 0, -1)
-							preDateDayStr := preDateDay.Format(utils.FormatDate)
-							if findItem, ok := dataMap[preDateDayStr]; ok { //上一年同期->上一个月找到
-								timestamp := currentDate.UnixNano() / 1e6
-								timestampStr := fmt.Sprintf("%d", timestamp)
-								val := TczSub(currentItem.Value, findItem.Value)
-
-								count, err := GetEdbDataCalculateTczByCodeAndDate(edbCode, av)
-								if err != nil && err.Error() != utils.ErrNoRow() {
-									return err
-								}
-								if count <= 0 {
-									addSql += GetAddSql(edbInfoIdStr, edbCode, av, timestampStr, val)
-									isAdd = true
-								} else {
-									err = ModifyEdbDataCalculateTcz(int64(edbInfoId), av, val)
-									if err != nil {
-										return err
-									}
-								}
-								break
-							}
-						}
-					}
-				}
-			}
-		}
-	}
-	if isAdd {
-		addSql = strings.TrimRight(addSql, ",")
-		_, err = to.Raw(addSql).Exec()
-		if err != nil {
-			return err
-		}
-	}
-	return
-}
-
-type EdbInfoCalculateTczDetail struct {
-	EdbInfoCalculateTczId int       `orm:"column(edb_info_calculate_tcz_id);pk"`
-	EdbInfoId             int       `description:"指标id"`
-	EdbCode               string    `description:"指标编码"`
-	FromEdbInfoId         int       `description:"计算指标id"`
-	FromEdbCode           string    `description:"计算指标编码"`
-	FromEdbName           string    `description:"计算指标名称"`
-	FromSource            int       `description:"计算指标来源"`
-	FromSourceName        string    `description:"计算指标来源名称"`
-	FromTag               string    `description:"来源指标标签"`
-	Sort                  int       `description:"计算指标名称排序"`
-	CreateTime            time.Time `description:"创建时间"`
-	ModifyTime            time.Time `description:"修改时间"`
-	StartDate             string    `description:"开始日期"`
-	EndDate               string    `description:"结束日期"`
-}
-
-func GetEdbInfoCalculateTczDetail(edbInfoId int) (item *EdbInfoCalculateTczDetail, err error) {
-	o := orm.NewOrmUsingDB("data")
-	sql := ` SELECT a.*,b.start_date,b.end_date FROM edb_info_calculate_mapping AS a
-			INNER JOIN edb_info AS b ON a.from_edb_info_id=b.edb_info_id
-			WHERE a.edb_info_id=? `
-	err = o.Raw(sql, edbInfoId).QueryRow(&item)
-	return
-}
-
-func GetEdbDataCalculateTczByCodeAndDate(edbCode string, startDate string) (count int, err error) {
-	o := orm.NewOrmUsingDB("data")
-	sql := ` SELECT COUNT(1) AS count FROM edb_data_calculate_tcz WHERE edb_code=? AND data_time=? `
-	err = o.Raw(sql, edbCode, startDate).QueryRow(&count)
-	return
-}
-
-func ModifyEdbDataCalculateTcz(edbInfoId int64, dataTime, value string) (err error) {
-	o := orm.NewOrmUsingDB("data")
-	sql := ` UPDATE edb_data_calculate_tcz SET value=?,modify_time=NOW() WHERE edb_info_id=? AND data_time=? `
-	_, err = o.Raw(sql, value, edbInfoId, dataTime).Exec()
-	return
-}
-
-// 刷新全部同差值数据
-func RefreshAllCalculateTcz(edbInfoId, source, subSource int, fromEdbInfo *EdbInfo, edbCode, startDate, endDate 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()
-		}
-	}()
-
-	if err != nil {
-		return
-	}
-	edbInfoIdStr := strconv.Itoa(edbInfoId)
-	//计算数据
-
-	//计算数据
-	var condition string
-	var pars []interface{}
-	condition += " AND edb_info_id=? "
-	pars = append(pars, fromEdbInfo.EdbInfoId)
-
-	if startDate != "" {
-		condition += " AND data_time>=? "
-		pars = append(pars, startDate)
-	}
-	if endDate != "" {
-		condition += " AND data_time<=? "
-		pars = append(pars, endDate)
-	}
-
-	dataList, err := GetEdbDataListAll(condition, pars, fromEdbInfo.Source, fromEdbInfo.SubSource, 0)
-	if err != nil {
-		return err
-	}
-	var dateArr []string
-	dataMap := make(map[string]*EdbInfoSearchData)
-	for _, v := range dataList {
-		dateArr = append(dateArr, v.DataTime)
-		dataMap[v.DataTime] = v
-	}
-	//获取指标所有数据
-	existDataList := make([]*EdbDataBase, 0)
-	dataTableName := GetEdbDataTableName(source, subSource)
-	sql := `SELECT * FROM %s WHERE edb_info_id=? `
-	sql = fmt.Sprintf(sql, dataTableName)
-	_, err = to.Raw(sql, edbInfoId).QueryRows(&existDataList)
-	if err != nil {
-		return err
-	}
-	existDataMap := make(map[string]string)
-	for _, v := range existDataList {
-		existDataMap[v.DataTime] = v.Value
-	}
-
-	addSql := ` INSERT INTO edb_data_calculate_tcz(edb_info_id,edb_code,data_time,value,create_time,modify_time,status,data_timestamp) values `
-	var isAdd bool
-	existAddDataMap := make(map[string]string)
-	for _, av := range dateArr {
-		currentItem := dataMap[av]
-		if currentItem != nil {
-			//当前日期
-			currentDate, err := time.Parse(utils.FormatDate, av)
-			if err != nil {
-				return err
-			}
-			//上一年的日期
-			preDate := currentDate.AddDate(-1, 0, 0)
-			preDateStr := preDate.Format(utils.FormatDate)
-			if findItem, ok := dataMap[preDateStr]; ok { //上一年同期找到
-				//dataTime, _ := time.Parse(utils.FormatDate, date)
-				timestamp := currentDate.UnixNano() / 1e6
-				timestampStr := fmt.Sprintf("%d", timestamp)
-				val := TczSub(currentItem.Value, findItem.Value)
-
-				if existVal, ok := existDataMap[av]; !ok {
-					if _, existOk := existAddDataMap[av]; !existOk {
-						addSql += GetAddSql(edbInfoIdStr, edbCode, av, timestampStr, val)
-						isAdd = true
-					}
-					existAddDataMap[av] = av
-				} else {
-					if existVal != val {
-						sql := ` UPDATE %s SET value=?,modify_time=NOW() WHERE edb_info_id=? AND data_time=? `
-						sql = fmt.Sprintf(sql, dataTableName)
-						_, err = to.Raw(sql, val, edbInfoId, av).Exec()
-						if err != nil {
-							return err
-						}
-					}
-				}
-				utils.FileLog.Info("同期找到:" + av + ";" + preDateStr)
-				continue
-			} else {
-				if fromEdbInfo.Frequency == "月度" { //向上和向下,各找一个月
-					for i := 0; i <= 35; i++ {
-						nextDateDay := preDate.AddDate(0, 0, 1)
-						nextDateDayStr := nextDateDay.Format(utils.FormatDate)
-						if findItem, ok := dataMap[nextDateDayStr]; ok { //上一年同期->下一个月找到
-							timestamp := currentDate.UnixNano() / 1e6
-							timestampStr := fmt.Sprintf("%d", timestamp)
-							val := TczSub(currentItem.Value, findItem.Value)
-
-							if existVal, ok := existDataMap[av]; !ok {
-								if _, existOk := existAddDataMap[av]; !existOk {
-									addSql += GetAddSql(edbInfoIdStr, edbCode, av, timestampStr, val)
-									isAdd = true
-								}
-								existAddDataMap[av] = av
-							} else {
-								if existVal != val {
-									sql := ` UPDATE %s SET value=?,modify_time=NOW() WHERE edb_info_id=? AND data_time=? `
-									sql = fmt.Sprintf(sql, dataTableName)
-									_, err = to.Raw(sql, val, edbInfoId, av).Exec()
-									if err != nil {
-										return err
-									}
-								}
-							}
-							break
-						} else {
-							preDateDay := preDate.AddDate(0, 0, -1)
-							preDateDayStr := preDateDay.Format(utils.FormatDate)
-							if findItem, ok := dataMap[preDateDayStr]; ok { //上一年同期->上一个月找到
-								timestamp := currentDate.UnixNano() / 1e6
-								timestampStr := fmt.Sprintf("%d", timestamp)
-								val := TczSub(currentItem.Value, findItem.Value)
-
-								if existVal, ok := existDataMap[av]; !ok {
-									if _, existOk := existAddDataMap[av]; !existOk {
-										addSql += GetAddSql(edbInfoIdStr, edbCode, av, timestampStr, val)
-										isAdd = true
-									}
-									existAddDataMap[av] = av
-								} else {
-									if existVal != val {
-										sql := ` UPDATE %s SET value=?,modify_time=NOW() WHERE edb_info_id=? AND data_time=? `
-										sql = fmt.Sprintf(sql, dataTableName)
-										_, err = to.Raw(sql, val, edbInfoId, av).Exec()
-										if err != nil {
-											return err
-										}
-									}
-								}
-								break
-							}
-						}
-					}
-				} else if fromEdbInfo.Frequency == "季度" || fromEdbInfo.Frequency == "年度" {
-					if findItem, ok := dataMap[preDateStr]; ok { //上一年同期->下一个月找到
-						timestamp := currentDate.UnixNano() / 1e6
-						timestampStr := fmt.Sprintf("%d", timestamp)
-						val := TczSub(currentItem.Value, findItem.Value)
-
-						if existVal, ok := existDataMap[av]; !ok {
-							if _, existOk := existAddDataMap[av]; !existOk {
-								addSql += GetAddSql(edbInfoIdStr, edbCode, av, timestampStr, val)
-								isAdd = true
-							}
-							existAddDataMap[av] = av
-						} else {
-							if existVal != val {
-								sql := ` UPDATE %s SET value=?,modify_time=NOW() WHERE edb_info_id=? AND data_time=? `
-								sql = fmt.Sprintf(sql, dataTableName)
-								_, err = to.Raw(sql, val, edbInfoId, av).Exec()
-								if err != nil {
-									return err
-								}
-							}
-						}
-						break
-					}
-				} else {
-					for i := 0; i < 35; i++ {
-						nextDateDay := preDate.AddDate(0, 0, 1)
-						nextDateDayStr := nextDateDay.Format(utils.FormatDate)
-						if findItem, ok := dataMap[nextDateDayStr]; ok { //上一年同期->下一个月找到
-							timestamp := currentDate.UnixNano() / 1e6
-							timestampStr := fmt.Sprintf("%d", timestamp)
-							val := TczSub(currentItem.Value, findItem.Value)
-
-							if existVal, ok := existDataMap[av]; !ok {
-								if _, existOk := existAddDataMap[av]; !existOk {
-									addSql += GetAddSql(edbInfoIdStr, edbCode, av, timestampStr, val)
-									isAdd = true
-								}
-								existAddDataMap[av] = av
-							} else {
-								if existVal != val {
-									sql := ` UPDATE %s SET value=?,modify_time=NOW() WHERE edb_info_id=? AND data_time=? `
-									sql = fmt.Sprintf(sql, dataTableName)
-									_, err = to.Raw(sql, val, edbInfoId, av).Exec()
-									if err != nil {
-										return err
-									}
-								}
-							}
-							break
-						} else {
-							preDateDay := preDate.AddDate(0, 0, -1)
-							preDateDayStr := preDateDay.Format(utils.FormatDate)
-							if findItem, ok := dataMap[preDateDayStr]; ok { //上一年同期->上一个月找到
-								timestamp := currentDate.UnixNano() / 1e6
-								timestampStr := fmt.Sprintf("%d", timestamp)
-								val := TczSub(currentItem.Value, findItem.Value)
-
-								if existVal, ok := existDataMap[av]; !ok {
-									if _, existOk := existAddDataMap[av]; !existOk {
-										addSql += GetAddSql(edbInfoIdStr, edbCode, av, timestampStr, val)
-										isAdd = true
-									}
-									existAddDataMap[av] = av
-								} else {
-									if existVal != val {
-										sql := ` UPDATE %s SET value=?,modify_time=NOW() WHERE edb_info_id=? AND data_time=? `
-										sql = fmt.Sprintf(sql, dataTableName)
-										_, err = to.Raw(sql, val, edbInfoId, av).Exec()
-										if err != nil {
-											return err
-										}
-									}
-								}
-								break
-							}
-						}
-					}
-				}
-			}
-		}
-	}
-	if isAdd {
-		addSql = strings.TrimRight(addSql, ",")
-		_, err = to.Raw(addSql).Exec()
-		if err != nil {
-			return err
-		}
-	}
-	return
-}

+ 0 - 4
models/data_manage/edb_info_calculate_time_shift.go

@@ -1,4 +0,0 @@
-package data_manage
-
-//时间移位
-

+ 0 - 286
models/data_manage/edb_info_calculate_zjpj.go

@@ -1,286 +0,0 @@
-package data_manage
-
-import (
-	"errors"
-	"eta/eta_api/utils"
-	"github.com/beego/beego/v2/client/orm"
-	"time"
-)
-
-// EditCalculateZjpj 编辑直接拼接数据
-func EditCalculateZjpj(req *EdbInfoCalculateBatchEditReq, nowEdbInfo, firstEdbInfo, secondEdbInfo *EdbInfo) (edbInfoId int, err error) {
-	edbInfoId = req.EdbInfoId
-	o := orm.NewOrmUsingDB("data")
-	to, err := o.Begin()
-	if err != nil {
-		return
-	}
-	defer func() {
-		if err != nil {
-			_ = to.Rollback()
-		} else {
-			_ = to.Commit()
-		}
-	}()
-
-	//修改指标信息
-	sql := ` UPDATE  edb_info SET
-			  edb_name =?,
-			  edb_name_source=?,
-			  frequency = ?,
-			  unit = ?,
-			  classify_id = ?, 
-			  calculate_formula=?,
-			  modify_time = NOW()
-			WHERE edb_info_id = ? `
-	_, err = to.Raw(sql, req.EdbName, req.EdbName, req.Frequency, req.Unit, req.ClassifyId, req.Formula, edbInfoId).Exec()
-	if err != nil {
-		return
-	}
-
-	var existCondition string
-	var existPars []interface{}
-	existCondition += " AND edb_info_id=? "
-	existPars = append(existPars, edbInfoId)
-
-	//查询出所有的关联指标
-	existList, err := GetEdbInfoCalculateListByCondition(existCondition, existPars)
-	if err != nil {
-		err = errors.New("判断指标是否改变失败,Err:" + err.Error())
-		return
-	}
-
-	var existItemA, existItemB *EdbInfoCalculateMapping
-	for _, existItem := range existList {
-		if existItem.FromTag == "A" {
-			existItemA = existItem
-		} else if existItem.FromTag == "B" {
-			existItemB = existItem
-		}
-	}
-
-	addDataList := make([]*EdbDataCalculateZjpj, 0)
-	firstDataList := make([]*EdbInfoSearchData, 0)
-	secondDataList := make([]*EdbInfoSearchData, 0)
-
-	//如果 之前的拼接日期 与 现在的拼接日期 不一致的话,需要做以下处理
-	nowFormulaDate, _ := time.ParseInLocation(utils.FormatDate, nowEdbInfo.CalculateFormula, time.Local)
-	reqFormulaDate, _ := time.ParseInLocation(utils.FormatDate, req.Formula, time.Local)
-
-	//如果前后选择的日期不一致,那么需要删除一部分数据
-	if nowEdbInfo.CalculateFormula != req.Formula {
-		var startDate, endDate time.Time
-		//如果当前选择的日期 小于 之前选择的日期
-		if reqFormulaDate.Before(nowFormulaDate) {
-			startDate = reqFormulaDate
-			endDate = nowFormulaDate
-		} else { //如果当前选择的日期 大于 之前选择的日期
-			startDate = nowFormulaDate
-			endDate = reqFormulaDate
-		}
-		//删除 之前日期 与 当前日期 之间的指标数据
-		sql = ` DELETE FROM edb_data_calculate_zjpj WHERE edb_info_id = ? and data_time >= ? and data_time < ?`
-		_, err = to.Raw(sql, edbInfoId, startDate, endDate).Exec()
-		if err != nil {
-			err = errors.New("删除 之前日期 与 当前日期 之间的指标数据失败,Err:" + err.Error())
-			return
-		}
-	}
-	//第一个指标数据
-	{
-		var condition string
-		var pars []interface{}
-		if existItemA.FromEdbInfoId != firstEdbInfo.EdbInfoId {
-			//删除之前的A指标关联关系
-			sql = ` DELETE FROM edb_info_calculate_mapping WHERE edb_info_id = ? and from_edb_info_id = ?`
-			_, err = to.Raw(sql, edbInfoId, existItemA.FromEdbInfoId).Exec()
-			if err != nil {
-				err = errors.New("删除拼接日期之前的指标关联关系失败,Err:" + err.Error())
-				return
-			}
-
-			//删除之前所有的A指标数据
-			sql = ` DELETE FROM edb_data_calculate_zjpj WHERE edb_info_id = ? and data_time < ?`
-			_, err = to.Raw(sql, edbInfoId, req.Formula).Exec()
-			if err != nil {
-				err = errors.New("删除拼接日期之前的数据失败,Err:" + err.Error())
-				return
-			}
-
-			//获取第一个指标的数据列表
-			condition += " AND data_time < ? AND edb_info_id=? "
-			pars = append(pars, req.Formula, firstEdbInfo.EdbInfoId)
-
-			tmpFirstDataList, tmpErr := GetEdbDataListAll(condition, pars, firstEdbInfo.Source, firstEdbInfo.SubSource, 0)
-			if tmpErr != nil {
-				return edbInfoId, tmpErr
-			}
-			firstDataList = tmpFirstDataList
-
-			//添加新的指标关系
-			{
-				calculateMappingItem := new(EdbInfoCalculateMapping)
-				calculateMappingItem.CreateTime = time.Now()
-				calculateMappingItem.ModifyTime = time.Now()
-				calculateMappingItem.Sort = 1
-				calculateMappingItem.EdbCode = nowEdbInfo.EdbCode
-				calculateMappingItem.EdbInfoId = edbInfoId
-				calculateMappingItem.FromEdbInfoId = firstEdbInfo.EdbInfoId
-				calculateMappingItem.FromEdbCode = firstEdbInfo.EdbCode
-				calculateMappingItem.FromEdbName = firstEdbInfo.EdbName
-				calculateMappingItem.FromSource = firstEdbInfo.Source
-				calculateMappingItem.FromSourceName = firstEdbInfo.SourceName
-				calculateMappingItem.FromTag = "A"
-				calculateMappingItem.Source = nowEdbInfo.Source
-				calculateMappingItem.SourceName = nowEdbInfo.SourceName
-				_, err = to.Insert(calculateMappingItem)
-				if err != nil {
-					return
-				}
-			}
-		} else {
-			if req.Formula != nowEdbInfo.CalculateFormula {
-				//获取第一个指标的数据列表
-				condition += " AND data_time >= ?  AND data_time < ? AND edb_info_id=? "
-				pars = append(pars, nowFormulaDate, reqFormulaDate, firstEdbInfo.EdbInfoId)
-
-				tmpFirstDataList, tmpErr := GetEdbDataListAll(condition, pars, firstEdbInfo.Source, firstEdbInfo.SubSource, 0)
-				if tmpErr != nil {
-					return edbInfoId, tmpErr
-				}
-				firstDataList = tmpFirstDataList
-			}
-		}
-
-		//待插入数据
-		for _, v := range firstDataList {
-			//时间戳
-			currentDate, _ := time.Parse(utils.FormatDate, v.DataTime)
-			timestamp := currentDate.UnixNano() / 1e6
-
-			edbDataZjpj := &EdbDataCalculateZjpj{
-				EdbInfoId:     edbInfoId,
-				EdbCode:       nowEdbInfo.EdbCode,
-				DataTime:      v.DataTime,
-				Value:         v.Value,
-				Status:        1,
-				CreateTime:    time.Now(),
-				ModifyTime:    time.Now(),
-				DataTimestamp: timestamp,
-			}
-			addDataList = append(addDataList, edbDataZjpj)
-		}
-	}
-
-	//第二个指标数据
-	{
-		var condition string
-		var pars []interface{}
-
-		if existItemB.FromEdbInfoId != secondEdbInfo.EdbInfoId {
-			//删除之前的B指标关联关系
-			sql = ` DELETE FROM edb_info_calculate_mapping WHERE edb_info_id = ? and from_edb_info_id = ?`
-			_, err = to.Raw(sql, edbInfoId, existItemB.FromEdbInfoId).Exec()
-			if err != nil {
-				err = errors.New("删除拼接日期之后的指标关联关系失败,Err:" + err.Error())
-				return
-			}
-
-			//删除历史拼接日期之前所有的B指标数据
-			sql = ` DELETE FROM edb_data_calculate_zjpj WHERE edb_info_id = ? and data_time >= ?`
-			_, err = to.Raw(sql, edbInfoId, nowEdbInfo.CalculateFormula).Exec()
-			if err != nil {
-				err = errors.New("删除历史拼接日期之后的数据失败,Err:" + err.Error())
-				return
-			}
-
-			//第二个指标的数据列表
-			condition = " AND data_time >= ?  AND edb_info_id=? "
-			pars = append(pars, reqFormulaDate, secondEdbInfo.EdbInfoId)
-			tmpSecondDataList, tmpErr := GetEdbDataListAll(condition, pars, secondEdbInfo.Source, secondEdbInfo.SubSource, 0)
-			if tmpErr != nil {
-				return edbInfoId, tmpErr
-			}
-			secondDataList = tmpSecondDataList
-
-			//添加新的指标关系
-			{
-				calculateMappingItem := new(EdbInfoCalculateMapping)
-				calculateMappingItem.CreateTime = time.Now()
-				calculateMappingItem.ModifyTime = time.Now()
-				calculateMappingItem.Sort = 1
-				calculateMappingItem.EdbCode = nowEdbInfo.EdbCode
-				calculateMappingItem.EdbInfoId = edbInfoId
-				calculateMappingItem.FromEdbInfoId = secondEdbInfo.EdbInfoId
-				calculateMappingItem.FromEdbCode = secondEdbInfo.EdbCode
-				calculateMappingItem.FromEdbName = secondEdbInfo.EdbName
-				calculateMappingItem.FromSource = secondEdbInfo.Source
-				calculateMappingItem.FromSourceName = secondEdbInfo.SourceName
-				calculateMappingItem.FromTag = "B"
-				calculateMappingItem.Source = nowEdbInfo.Source
-				calculateMappingItem.SourceName = nowEdbInfo.SourceName
-				_, err = to.Insert(calculateMappingItem)
-				if err != nil {
-					return
-				}
-			}
-		} else {
-			if req.Formula != nowEdbInfo.CalculateFormula {
-				//获取第二个指标的数据列表
-				condition += " AND data_time >= ?  AND data_time < ? AND edb_info_id=? "
-				pars = append(pars, reqFormulaDate, nowFormulaDate, secondEdbInfo.EdbInfoId)
-
-				tmpSecondDataList, tmpErr := GetEdbDataListAll(condition, pars, secondEdbInfo.Source, secondEdbInfo.SubSource, 0)
-				if tmpErr != nil {
-					return edbInfoId, tmpErr
-				}
-				secondDataList = tmpSecondDataList
-			}
-		}
-
-		//待插入数据
-		for _, v := range secondDataList {
-			//时间戳
-			currentDate, _ := time.Parse(utils.FormatDate, v.DataTime)
-			timestamp := currentDate.UnixNano() / 1e6
-
-			edbDataZjpj := &EdbDataCalculateZjpj{
-				EdbInfoId:     edbInfoId,
-				EdbCode:       nowEdbInfo.EdbCode,
-				DataTime:      v.DataTime,
-				Value:         v.Value,
-				Status:        1,
-				CreateTime:    time.Now(),
-				ModifyTime:    time.Now(),
-				DataTimestamp: timestamp,
-			}
-			addDataList = append(addDataList, edbDataZjpj)
-		}
-	}
-
-	//数据入库
-	tmpAddDataList := make([]*EdbDataCalculateZjpj, 0)
-	for _, v := range addDataList {
-		tmpAddDataList = append(tmpAddDataList, v)
-
-		if len(tmpAddDataList) >= 200 {
-			_, tmpErr := to.InsertMulti(len(tmpAddDataList), tmpAddDataList)
-			if tmpErr != nil {
-				err = tmpErr
-				return
-			}
-			//重新初始化需要加入的数据切片
-			tmpAddDataList = make([]*EdbDataCalculateZjpj, 0)
-		}
-	}
-	//最后如果还有需要新增的数据,那么就统一入库
-	if len(tmpAddDataList) > 0 {
-		_, tmpErr := to.InsertMulti(len(tmpAddDataList), tmpAddDataList)
-		if tmpErr != nil {
-			err = tmpErr
-			return
-		}
-	}
-
-	return
-}

+ 12 - 8
models/data_manage/edb_refresh/edb_refresh_source.go

@@ -8,14 +8,16 @@ import (
 // EdbRefreshSource
 // @Description: 刷新的数据源表
 type EdbRefreshSource struct {
-	Id            int       `orm:"column(id);pk"`
-	Source        int       `orm:"column(source)" description:"来源"`
-	SourceName    string    `description:"来源名称"`
-	SubSource     int       `description:"子数据来源:0:经济数据库,1:日期序列"`
-	SubSourceName string    `description:"子来源名称"`
-	HasChild      int       `description:"是否有子来源,0:否,1:是"`
-	ModifyTime    time.Time `description:"修改时间"`
-	CreateTime    time.Time `description:"创建时间"`
+	Id              int       `orm:"column(id);pk"`
+	Source          int       `orm:"column(source)" description:"来源"`
+	SourceName      string    `description:"来源名称"`
+	SubSource       int       `description:"子数据来源:0:经济数据库,1:日期序列"`
+	SubSourceName   string    `description:"子来源名称"`
+	HasChild        int       `description:"是否有子来源,0:否,1:是"`
+	ModifyTime      time.Time `description:"修改时间"`
+	CreateTime      time.Time `description:"创建时间"`
+	SourceNameEn    string    `description:"英文来源名称"`
+	SubSourceNameEn string    `description:"英文子来源名称"`
 }
 
 // EdbRefreshSourceList
@@ -27,6 +29,8 @@ type EdbRefreshSourceList struct {
 	SubSourceName string                 `description:"子来源名称"`
 	Child         []EdbRefreshSourceList `description:"子来源"`
 	HasChild      int                    `description:"是否有子来源,0:否,1:是"`
+	SourceNameEn    string    `description:"英文来源名称"`
+	SubSourceNameEn string    `description:"英文子来源名称"`
 }
 
 // GetAllList

+ 1 - 0
models/data_manage/edb_source.go

@@ -15,6 +15,7 @@ var (
 type EdbSource struct {
 	EdbSourceId      int    `orm:"column(edb_source_id);pk"`
 	SourceName       string `description:"指标来源名称"`
+	SourceNameEn     string `description:"指标来源名称英文"`
 	TableName        string `description:"数据表名"`
 	EdbAddMethod     string `description:"指标新增接口"`
 	EdbRefreshMethod string `description:"指标刷新接口"`

+ 26 - 0
models/data_manage/request/business_data.go

@@ -0,0 +1,26 @@
+package request
+
+// BusinessDataListReq 指标列表筛选
+type BusinessDataListReq struct {
+	PageSize     int    `form:"PageSize"`
+	CurrentIndex int    `form:"CurrentIndex"`
+	Frequency    string `form:"Frequency" description:"频度"`
+	Source       int    `form:"Source" description:"来源id"`
+	Keywords     string `form:"Keywords" description:"指标ID/指标名称"`
+	ListAll      bool   `form:"ListAll" description:"列表全选"`
+	SortField    int    `form:"SortField" description:"排序字段: 0-默认; 1-开始时间; 2-最新时间; 3-更新时间"`
+	SortRule     int    `form:"SortRule" description:"排序方式: 0-默认; 1-正序; 2-倒序"`
+}
+
+// BusinessDataBatchAddCheckReq 外部(商家)指标批量添加校验
+type BusinessDataBatchAddCheckReq struct {
+	BusinessDataListReq
+	IndexCodes []string `form:"IndexCodes" description:"全选为false时, 该数组为选中; 全选为true时, 该数组为不选的指标"`
+}
+
+// BusinessDataDataListReq 指标数据列表筛选
+type BusinessDataDataListReq struct {
+	PageSize     int    `form:"PageSize"`
+	CurrentIndex int    `form:"CurrentIndex"`
+	IndexCode    string `form:"IndexCode" description:"指标编码"`
+}

+ 7 - 6
models/data_manage/trade_analysis/trade_analysis.go

@@ -22,12 +22,13 @@ type TradePositionTop struct {
 }
 
 type TradeClassifyNameList struct {
-	Exchange string                      `description:"交易所"`
-	Sort     int                         `description:"排序字段" `
-	Num      int                         `description:"品种数量"`
-	DataTime string                      `description:"最新更新时间"`
-	CurrDate string                      `description:"当前日期"`
-	Items    []TradeClassifyNameListItem `description:"子类"`
+	Exchange   string                      `description:"交易所"`
+	ExchangeEn string                      `description:"交易所英文"`
+	Sort       int                         `description:"排序字段" `
+	Num        int                         `description:"品种数量"`
+	DataTime   string                      `description:"最新更新时间"`
+	CurrDate   string                      `description:"当前日期"`
+	Items      []TradeClassifyNameListItem `description:"子类"`
 }
 type TradeClassifyNameListSort []TradeClassifyNameList
 

+ 19 - 17
models/data_stat/edb_info_stat_column.go

@@ -4,26 +4,28 @@ import "github.com/beego/beego/v2/client/orm"
 
 // EdbInfoStatColumn 数据源统计表自定义列
 type EdbInfoStatColumn struct {
-	Id         int    `orm:"column(id);pk" description:"自增id"`
-	ColumnName string `description:"字段名称"`
-	ColumnKey  string `description:"字段"`
-	CreateTime string `description:" 创建时间"`
-	ModifyTime string `description:"修改时间"`
-	Type       int    `description:"列表类型:1数据源明细表,2数据源统计表,3删除指标列表,4指标信息变更表"`
-	Sort       int    `description:"列排序"`
-	IsMust     int    `description:"是否必选列: 0非必选 1必须"`
-	IsSort     int    `description:"是否是允许排序的列,0否,1是"`
-	IsShow     int    `description:"是否展示:1展示,0不展示"`
+	Id           int    `orm:"column(id);pk" description:"自增id"`
+	ColumnName   string `description:"字段名称"`
+	ColumnKey    string `description:"字段"`
+	CreateTime   string `description:" 创建时间"`
+	ModifyTime   string `description:"修改时间"`
+	Type         int    `description:"列表类型:1数据源明细表,2数据源统计表,3删除指标列表,4指标信息变更表"`
+	Sort         int    `description:"列排序"`
+	IsMust       int    `description:"是否必选列: 0非必选 1必须"`
+	IsSort       int    `description:"是否是允许排序的列,0否,1是"`
+	IsShow       int    `description:"是否展示:1展示,0不展示"`
+	ColumnNameEn string `description:"英文字段名称"`
 }
 
 type EdbInfoStatColumnListItem struct {
-	Id         int    `description:"自增id"`
-	ColumnName string `description:"字段名称"`
-	ColumnKey  string `description:"字段"`
-	Type       int    `description:"列表类型:1数据源明细表,2数据源统计表,3删除指标列表,4指标信息变更表"`
-	IsMust     int    `description:"是否必选列: 0非必选 1必须"`
-	IsSort     int    `description:"是否是允许排序的列,0否,1是"`
-	IsShow     int    `description:"是否展示:1展示,0不展示"`
+	Id           int    `description:"自增id"`
+	ColumnName   string `description:"字段名称"`
+	ColumnKey    string `description:"字段"`
+	Type         int    `description:"列表类型:1数据源明细表,2数据源统计表,3删除指标列表,4指标信息变更表"`
+	IsMust       int    `description:"是否必选列: 0非必选 1必须"`
+	IsSort       int    `description:"是否是允许排序的列,0否,1是"`
+	IsShow       int    `description:"是否展示:1展示,0不展示"`
+	ColumnNameEn string `description:"英文字段名称"`
 }
 
 type StatColumnList struct {

+ 0 - 10
models/db.go

@@ -305,23 +305,13 @@ func initEdbData() {
 		new(data_manage.EdbdataClassify),
 		new(data_manage.ManualUser),
 		new(data_manage.EdbInfoCalculate),
-		new(data_manage.EdbDataCalculate),
-		new(data_manage.EdbInfoCalculateLjzzy),
-		new(data_manage.EdbInfoCalculateTbz),
-		new(data_manage.EdbInfoCalculateTcz),
-		new(data_manage.EdbInfoCalculateNszydpjjs),
 		new(data_manage.SearchKeyword),
-		new(data_manage.EdbInfoCalculateHbz),
-		new(data_manage.EdbInfoCalculateHcz),
-		new(data_manage.EdbInfoCalculateBp),
 		new(data_manage.BaseFromSmm),
 		new(data_manage.BaseFromSmmIndex),
 		new(data_manage.BaseFromSmmData),
 		new(data_manage.BaseFromSmmClassify),
 		new(data_manage.EdbInfoLog),
 		new(data_manage.EdbInfoCalculateMapping),
-		new(data_manage.EdbDataCalculateZjpj),            //直接拼接
-		new(data_manage.EdbDataCalculateLjztbpj),         //累计同比值拼接
 		new(data_manage.PredictEdbConf),                  //预测指标配置
 		new(data_manage.BaseFromMysteelChemicalClassify), //预测指标配置
 		new(data_manage.BaseFromMysteelChemicalIndex),    //钢联化工

+ 59 - 2
models/english_report.go

@@ -44,6 +44,9 @@ type EnglishReport struct {
 	AdminRealName      string    `description:"创建者姓名"`
 	ApproveTime        time.Time `description:"审批时间"`
 	ApproveId          int       `description:"审批ID"`
+	DetailImgUrl       string    `description:"报告详情长图地址"`
+	DetailPdfUrl       string    `description:"报告详情PDF地址"`
+	EmailHasFail       int       `description:"是否存在邮件发送失败的记录: 0-否; 1-是"`
 }
 
 func GetEnglishReportStage(classifyIdFirst, classifyIdSecond int) (count int, err error) {
@@ -294,7 +297,7 @@ func GetEnglishReportListCount(condition string, pars []interface{}, companyType
 	return
 }
 
-func GetEnglishReportList(condition string, pars []interface{}, companyType string, startSize, pageSize int, fieldArr []string) (items []*EnglishReportList, err error) {
+func GetEnglishReportList(condition string, pars []interface{}, companyType string, startSize, pageSize int, fieldArr []string) (items []*EnglishReport, err error) {
 	o := orm.NewOrmUsingDB("rddp")
 	//产品权限
 	companyTypeSqlStr := ``
@@ -314,7 +317,7 @@ func GetEnglishReportList(condition string, pars []interface{}, companyType stri
 		sql += condition
 	}
 	// 排序:1:未发布;2:已发布;3-待提交;4-待审批;5-已驳回;6-已通过
-	sql += `ORDER BY FIELD(state,3,1,4,5,6,2), modify_time DESC LIMIT ?,?`
+	sql += ` ORDER BY FIELD(state,3,1,4,5,6,2), modify_time DESC LIMIT ?,?`
 	_, err = o.Raw(sql, pars, startSize, pageSize).QueryRows(&items)
 	return
 }
@@ -929,3 +932,57 @@ func ModifyEnglishReportImgUrl(reportId int, detailImgUrl string) (err error) {
 	_, err = o.Raw(sql, detailImgUrl, reportId).Exec()
 	return
 }
+
+func FormatEnglishReport2ListItem(origin *EnglishReport) (item *EnglishReportList) {
+	if origin == nil {
+		return
+	}
+	item = new(EnglishReportList)
+	item.Id = origin.Id
+	item.AddType = origin.AddType
+	item.ClassifyIdFirst = origin.ClassifyIdFirst
+	item.ClassifyNameFirst = origin.ClassifyNameFirst
+	item.ClassifyIdSecond = origin.ClassifyIdSecond
+	item.ClassifyNameSecond = origin.ClassifyNameSecond
+	item.Title = origin.Title
+	item.Abstract = origin.Abstract
+	item.Author = origin.Author
+	item.Frequency = origin.Frequency
+	item.CreateTime = origin.CreateTime
+	item.ModifyTime = origin.ModifyTime
+	item.State = origin.State
+	item.PublishTime = utils.TimeTransferString(utils.FormatDateTime, origin.PublishTime)
+	item.PrePublishTime = utils.TimeTransferString(utils.FormatDateTime, origin.PrePublishTime)
+	item.Stage = origin.Stage
+	//item.Content = origin.Content
+	item.VideoUrl = origin.VideoUrl
+	item.VideoName = origin.VideoName
+	item.VideoPlaySeconds = origin.VideoPlaySeconds
+	item.ContentSub = origin.ContentSub
+	item.ReportCode = origin.ReportCode
+	item.Pv = origin.Pv
+	item.PvEmail = origin.PvEmail
+	// 邮箱PV大于0的时候, 不展示最初版本的PV
+	if item.PvEmail > 0 {
+		item.Pv = 0
+	}
+	item.EmailState = origin.EmailState
+	if origin.EmailHasFail == 1 {
+		item.EmailHasFail = true
+	}
+	item.FromReportId = origin.FromReportId
+	item.AdminId = origin.AdminId
+	item.AdminRealName = origin.AdminRealName
+	item.ApproveTime = utils.TimeTransferString(utils.FormatDateTime, origin.ApproveTime)
+	item.DetailImgUrl = origin.DetailImgUrl
+	item.DetailPdfUrl = origin.DetailPdfUrl
+	return
+}
+
+// UpdateEnglishReportEmailHasFail 标记报告邮件发送失败
+func UpdateEnglishReportEmailHasFail(reportId int) (err error) {
+	o := orm.NewOrmUsingDB("rddp")
+	sql := `UPDATE english_report SET email_has_fail = 1 WHERE id = ?`
+	_, err = o.Raw(sql, reportId).Exec()
+	return
+}

+ 26 - 15
models/english_report_email_log.go

@@ -30,7 +30,7 @@ type EnglishReportEmailLog struct {
 	Source       int       `description:"服务商:1-阿里云;2-腾讯云"`
 	IsDeleted    int       `description:"是否已删除: 0-正常; 1-已删除"`
 	CallbackData string    `description:"回调信息"`
-	ErrMsg       string    `description:"错误信息(Result/CallbackData里面的取起来麻烦=_=!)"`
+	ErrMsg       string    `description:"错误信息"`
 }
 
 func (item *EnglishReportEmailLog) TableName() string {
@@ -39,7 +39,12 @@ func (item *EnglishReportEmailLog) TableName() string {
 
 func (item *EnglishReportEmailLog) Create() (err error) {
 	o := orm.NewOrmUsingDB("rddp")
-	_, err = o.Insert(item)
+	id, e := o.Insert(item)
+	if e != nil {
+		err = e
+		return
+	}
+	item.Id = int(id)
 	return
 }
 
@@ -113,8 +118,12 @@ func GetEnglishReportEmailLogById(id int) (item *EnglishReportEmailLog, err erro
 
 // DeleteEnglishReportEmailLogByIds IDs删除日志
 func DeleteEnglishReportEmailLogByIds(logIds []int) (err error) {
+	if len(logIds) == 0 {
+		return
+	}
 	o := orm.NewOrmUsingDB("rddp")
-	sql := `UPDATE english_report_email_log SET is_deleted = 1 WHERE id IN (` + utils.GetOrmInReplace(len(logIds)) + `)`
+	sql := `DELETE FROM english_report_email_log WHERE id IN (` + utils.GetOrmInReplace(len(logIds)) + `)`
+	//sql := `UPDATE english_report_email_log SET is_deleted = 1 WHERE id IN (` + utils.GetOrmInReplace(len(logIds)) + `)`
 	_, err = o.Raw(sql, logIds).Exec()
 	return
 }
@@ -143,18 +152,20 @@ func GetEnglishReportEmailLog(condition string, pars []interface{}) (item *Engli
 	return
 }
 
-// GetHasFailEmailLogReportIds 获取存在邮件推送失败记录的英文报告IDs
-func GetHasFailEmailLogReportIds() (reportIds []int, err error) {
+func (item *EnglishReportEmailLog) MultiUpdateResult(items []*EnglishReportEmailLog) (err error) {
 	o := orm.NewOrmUsingDB("rddp")
-	sql := `SELECT DISTINCT report_id FROM english_report_email_log WHERE is_deleted = 0 AND send_status = 0`
-	_, err = o.Raw(sql).QueryRows(&reportIds)
-	return
-}
-
-// GetSuccessEmailLogReportIds 获取邮件推送记录均为成功的英文报告IDs
-func GetSuccessEmailLogReportIds() (reportIds []int, err error) {
-	o := orm.NewOrmUsingDB("rddp")
-	sql := `SELECT DISTINCT report_id FROM english_report_email_log WHERE is_deleted = 0 AND (send_status != 0 AND send_status != -1)`
-	_, err = o.Raw(sql).QueryRows(&reportIds)
+	p, err := o.Raw("UPDATE english_report_email_log SET send_data = ?, result = ?, send_status = ?, err_msg = ? WHERE id = ?").Prepare()
+	if err != nil {
+		return
+	}
+	defer func() {
+		_ = p.Close()
+	}()
+	for _, v := range items {
+		_, err = p.Exec(v.SendData, v.Result, v.SendStatus, v.ErrMsg, v.Id)
+		if err != nil {
+			return
+		}
+	}
 	return
 }

+ 419 - 0
models/mgo/base_from_business_data.go

@@ -0,0 +1,419 @@
+package mgo
+
+import (
+	"context"
+	"errors"
+	"eta/eta_api/utils"
+	"fmt"
+	"github.com/qiniu/qmgo"
+	"go.mongodb.org/mongo-driver/bson"
+	"go.mongodb.org/mongo-driver/bson/primitive"
+	"time"
+)
+
+// BaseFromBusinessData
+// @Description: 自有数据集合
+type BaseFromBusinessData struct {
+	ID primitive.ObjectID `json:"_id" bson:"_id,omitempty"` // 文档id
+	//ID string `json:"_id" bson:"_id" ` // 文档id
+	BaseFromBusinessIndexId int64     `json:"base_from_business_index_id" bson:"base_from_business_index_id"` // 指标id
+	IndexCode               string    `json:"index_code" bson:"index_code"`                                   // 指标编码
+	DataTime                time.Time `json:"data_time" bson:"data_time"`                                     // 数据日期
+	Value                   float64   `json:"value" bson:"value"`                                             // 数据值
+	CreateTime              time.Time `json:"create_time" bson:"create_time"`                                 // 创建时间
+	ModifyTime              time.Time `json:"modify_time" bson:"modify_time"`                                 // 修改时间
+}
+
+// CollectionName
+// @Description:  获取集合名称
+// @author: Roc
+// @receiver m
+// @datetime 2024-04-26 13:41:36
+// @return string
+func (m *BaseFromBusinessData) CollectionName() string {
+	return "base_from_business_data"
+}
+
+// DataBaseName
+// @Description: 获取数据库名称
+// @author: Roc
+// @receiver m
+// @datetime 2024-04-26 13:41:33
+// @return string
+func (m *BaseFromBusinessData) DataBaseName() string {
+	return utils.MgoDataDbName
+}
+
+// GetCollection
+// @Description: 获取mongodb集合的句柄
+// @author: Roc
+// @receiver m
+// @datetime 2024-04-26 13:41:33
+// @return string
+func (m *BaseFromBusinessData) GetCollection() *qmgo.Collection {
+	db := utils.MgoDataCli.Database(m.DataBaseName())
+	return db.Collection(m.CollectionName())
+}
+
+// GetAllDataList
+// @Description: 根据条件获取所有数据
+// @author: Roc
+// @receiver m
+// @datetime 2024-04-26 13:42:19
+// @param sort []string
+// @param whereParams interface{}
+// @return result []BaseFromBusinessData
+// @return err error
+func (m *BaseFromBusinessData) GetAllDataList(whereParams interface{}, sort []string) (result []*BaseFromBusinessData, err error) {
+	if utils.MgoDataCli == nil {
+		err = errors.New("mongodb连接失败")
+		return
+	}
+	db := utils.MgoDataCli.Database(m.DataBaseName())
+	coll := db.Collection(m.CollectionName())
+	ctx := context.TODO()
+	if err != nil {
+		fmt.Println("MgoGetColl Err:", err.Error())
+		return
+	}
+	err = coll.Find(ctx, whereParams).Sort(sort...).All(&result)
+	if err != nil {
+		return
+	}
+
+	for _, v := range result {
+		v.DataTime = v.DataTime.In(time.Local)
+		v.CreateTime = v.CreateTime.In(time.Local)
+		v.ModifyTime = v.ModifyTime.In(time.Local)
+	}
+
+	return
+}
+
+// GetLimitDataList
+// @Description: 根据条件获取指定数量数据列表
+// @author: Roc
+// @receiver m
+// @datetime 2024-05-06 17:08:32
+// @param whereParams interface{}
+// @param size int64
+// @return result []*BaseFromBusinessData
+// @return err error
+func (m *BaseFromBusinessData) GetLimitDataList(whereParams interface{}, size int64, sort []string) (result []*BaseFromBusinessData, err error) {
+	if utils.MgoDataCli == nil {
+		err = errors.New("mongodb连接失败")
+		return
+	}
+	db := utils.MgoDataCli.Database(m.DataBaseName())
+	coll := db.Collection(m.CollectionName())
+	ctx := context.TODO()
+	if err != nil {
+		fmt.Println("MgoGetColl Err:", err.Error())
+		return
+	}
+	err = coll.Find(ctx, whereParams).Sort(sort...).Limit(size).All(&result)
+	if err != nil {
+		return
+	}
+
+	for _, v := range result {
+		v.DataTime = v.DataTime.In(time.Local)
+		v.CreateTime = v.CreateTime.In(time.Local)
+		v.ModifyTime = v.ModifyTime.In(time.Local)
+	}
+
+	return
+}
+
+// GetPageDataList
+// @Description: 根据条件获取分页数据列表
+// @author: Roc
+// @receiver m
+// @datetime 2024-05-07 10:21:07
+// @param whereParams interface{}
+// @param startSize int64
+// @param size int64
+// @param sort []string
+// @return result []*BaseFromBusinessData
+// @return err error
+func (m *BaseFromBusinessData) GetPageDataList(whereParams interface{}, startSize, size int64, sort []string) (result []*BaseFromBusinessData, err error) {
+	if utils.MgoDataCli == nil {
+		err = errors.New("mongodb连接失败")
+		return
+	}
+	db := utils.MgoDataCli.Database(m.DataBaseName())
+	coll := db.Collection(m.CollectionName())
+	ctx := context.TODO()
+	if err != nil {
+		fmt.Println("MgoGetColl Err:", err.Error())
+		return
+	}
+	err = coll.Find(ctx, whereParams).Sort(sort...).Skip(startSize).Limit(size).All(&result)
+	if err != nil {
+		return
+	}
+
+	for _, v := range result {
+		v.DataTime = v.DataTime.In(time.Local)
+		v.CreateTime = v.CreateTime.In(time.Local)
+		v.ModifyTime = v.ModifyTime.In(time.Local)
+	}
+
+	return
+}
+
+// GetCountDataList
+// @Description:  根据条件获取数据列表总数
+// @author: Roc
+// @receiver m
+// @datetime 2024-05-07 10:29:00
+// @param whereParams interface{}
+// @return count int64
+// @return err error
+func (m *BaseFromBusinessData) GetCountDataList(whereParams interface{}) (count int64, err error) {
+	if utils.MgoDataCli == nil {
+		err = errors.New("mongodb连接失败")
+		return
+	}
+	db := utils.MgoDataCli.Database(m.DataBaseName())
+	coll := db.Collection(m.CollectionName())
+	ctx := context.TODO()
+	if err != nil {
+		fmt.Println("MgoGetColl Err:", err.Error())
+		return
+	}
+	count, err = coll.Find(ctx, whereParams).Count()
+
+	return
+}
+
+// InsertDataByColl
+// @Description: 写入单条数据(外部传入集合)
+// @author: Roc
+// @receiver m
+// @datetime 2024-04-26 14:22:18
+// @param addData interface{}
+// @return err error
+func (m *BaseFromBusinessData) InsertDataByColl(coll *qmgo.Collection, addData interface{}) (err error) {
+	ctx := context.TODO()
+	_, err = coll.InsertOne(ctx, addData)
+	if err != nil {
+		fmt.Println("InsertDataByColl:Err:" + err.Error())
+		return
+	}
+
+	return
+}
+
+// BatchInsertData
+// @Description: 批量写入数据
+// @author: Roc
+// @receiver m
+// @datetime 2024-04-26 14:22:18
+// @param bulk int 每次请求保存的数据量
+// @param dataList []interface{}
+// @return err error
+func (m *BaseFromBusinessData) BatchInsertData(bulk int, dataList []interface{}) (err error) {
+	db := utils.MgoDataCli.Database(m.DataBaseName())
+	coll := db.Collection(m.CollectionName())
+
+	return m.BatchInsertDataByColl(coll, bulk, dataList)
+}
+
+// BatchInsertDataByColl
+// @Description: 批量写入数据(外部传入集合)
+// @author: Roc
+// @receiver m
+// @datetime 2024-04-26 14:22:18
+// @param coll *qmgo.Collection
+// @param bulk int 每次请求保存的数据量
+// @param dataList []interface{}
+// @return err error
+func (m *BaseFromBusinessData) BatchInsertDataByColl(coll *qmgo.Collection, bulk int, dataList []interface{}) (err error) {
+	ctx := context.TODO()
+	dataNum := len(dataList)
+	if dataNum <= 0 {
+		return
+	}
+
+	// 不设置每次保存切片数量大小,或者实际数据量小于设置的切片数量大小,那么就直接保存吧
+	if bulk <= 0 || dataNum <= bulk {
+		_, err = coll.InsertMany(ctx, dataList)
+		if err != nil {
+			fmt.Println("BatchInsertData:Err:" + err.Error())
+			return
+		}
+		return
+	}
+
+	// 分批保存
+	i := 0
+	tmpAddDataList := make([]interface{}, 0)
+	for _, v := range dataList {
+		tmpAddDataList = append(tmpAddDataList, v)
+		i++
+		if i >= bulk {
+			_, err = coll.InsertMany(ctx, tmpAddDataList)
+			if err != nil {
+				fmt.Println("BatchInsertData:Err:" + err.Error())
+				return
+			}
+			i = 0
+			tmpAddDataList = make([]interface{}, 0)
+		}
+	}
+
+	if len(tmpAddDataList) > 0 {
+		_, err = coll.InsertMany(ctx, tmpAddDataList)
+		if err != nil {
+			fmt.Println("BatchInsertData:Err:" + err.Error())
+			return
+		}
+	}
+
+	return
+}
+
+// UpdateDataByColl
+// @Description: 单条数据修改
+// @author: Roc
+// @receiver m
+// @datetime 2024-04-26 15:01:51
+// @param whereParams interface{}
+// @param updateParams interface{}
+// @return err error
+func (m *BaseFromBusinessData) UpdateDataByColl(coll *qmgo.Collection, whereParams, updateParams interface{}) (err error) {
+	ctx := context.TODO()
+	err = coll.UpdateOne(ctx, whereParams, updateParams)
+	if err != nil {
+		fmt.Println("UpdateDataByColl:Err:" + err.Error())
+		return
+	}
+	return
+}
+
+// UpdateData
+// @Description: 单条数据修改
+// @author: Roc
+// @receiver m
+// @datetime 2024-04-26 15:01:51
+// @param whereParams interface{}
+// @param updateParams interface{}
+// @return err error
+func (m *BaseFromBusinessData) UpdateData(whereParams, updateParams interface{}) (err error) {
+	db := utils.MgoDataCli.Database(m.DataBaseName())
+	coll := db.Collection(m.CollectionName())
+	ctx := context.TODO()
+	err = coll.UpdateOne(ctx, whereParams, updateParams)
+	if err != nil {
+		fmt.Println("UpdateData:Err:" + err.Error())
+		return
+	}
+	return
+}
+
+// HandleData
+// @Description: 事务处理数据
+// @author: Roc
+// @receiver m
+// @datetime 2024-04-30 10:40:20
+// @param addDataList []BaseAddFromBusinessData
+// @param updateDataList []BaseFromBusinessData
+// @return result interface{}
+// @return err error
+func (m *BaseFromBusinessData) HandleData(addDataList, updateDataList []BaseFromBusinessData) (result interface{}, err error) {
+
+	ctx := context.TODO()
+
+	callback := func(sessCtx context.Context) (interface{}, error) {
+		// 重要:确保事务中的每一个操作,都使用传入的sessCtx参数
+
+		db := utils.MgoDataCli.Database(m.DataBaseName())
+		coll := db.Collection(m.CollectionName())
+
+		// 插入数据
+		if len(addDataList) > 0 {
+			_, err = coll.InsertMany(sessCtx, addDataList)
+			if err != nil {
+				return nil, err
+			}
+		}
+
+		// 修改
+
+		if len(updateDataList) > 0 {
+			for _, v := range updateDataList {
+				err = coll.UpdateOne(ctx, bson.M{"_id": v.ID}, bson.M{"$set": bson.M{"value": v.Value, "modify_time": v.ModifyTime}})
+				if err != nil {
+					fmt.Println("BatchInsertData:Err:" + err.Error())
+					return nil, err
+				}
+			}
+		}
+
+		return nil, nil
+	}
+	result, err = utils.MgoDataCli.DoTransaction(ctx, callback)
+
+	return
+}
+
+// GetEdbInfoMaxAndMinInfo
+// @Description: 获取当前指标的最大最小值
+// @author: Roc
+// @receiver m
+// @datetime 2024-04-30 17:15:39
+// @param whereParams interface{}
+// @return result EdbInfoMaxAndMinInfo
+// @return err error
+func (m *BaseFromBusinessData) GetEdbInfoMaxAndMinInfo(whereParams interface{}) (result EdbInfoMaxAndMinInfo, err error) {
+	if utils.MgoDataCli == nil {
+		err = errors.New("mongodb连接失败")
+		return
+	}
+	db := utils.MgoDataCli.Database(m.DataBaseName())
+	coll := db.Collection(m.CollectionName())
+	ctx := context.TODO()
+	if err != nil {
+		fmt.Println("MgoGetColl Err:", err.Error())
+		return
+	}
+	err = coll.Aggregate(ctx, whereParams).One(&result)
+	if err != nil {
+		return
+	}
+	result.MinDate = result.MinDate.In(time.Local)
+	result.MaxDate = result.MaxDate.In(time.Local)
+	result.LatestDate = result.LatestDate.In(time.Local)
+
+	return
+}
+
+// GetLatestValue
+// @Description: 获取当前指标的最新数据记录
+// @author: Roc
+// @receiver m
+// @datetime 2024-04-30 17:16:15
+// @param whereParams interface{}
+// @param selectParam interface{}
+// @return latestValue LatestValue
+// @return err error
+func (m *BaseFromBusinessData) GetLatestValue(whereParams, selectParam interface{}) (latestValue LatestValue, err error) {
+	if utils.MgoDataCli == nil {
+		err = errors.New("mongodb连接失败")
+		return
+	}
+	db := utils.MgoDataCli.Database(m.DataBaseName())
+	coll := db.Collection(m.CollectionName())
+	ctx := context.TODO()
+	if err != nil {
+		fmt.Println("MgoGetColl Err:", err.Error())
+		return
+	}
+
+	//var result interface{}
+	//err = coll.Find(ctx, whereParams).Select(selectParam).One(&result)
+	err = coll.Find(ctx, whereParams).Select(selectParam).One(&latestValue)
+
+	return
+}

+ 511 - 0
models/mgo/edb_data_business.go

@@ -0,0 +1,511 @@
+package mgo
+
+import (
+	"context"
+	"errors"
+	"eta/eta_api/utils"
+	"fmt"
+	"github.com/qiniu/qmgo"
+	"go.mongodb.org/mongo-driver/bson"
+	"go.mongodb.org/mongo-driver/bson/primitive"
+	"time"
+)
+
+// EdbDataBusiness
+// @Description: 自有数据集合(指标库)
+type EdbDataBusiness struct {
+	ID            primitive.ObjectID `json:"_id" bson:"_id,omitempty" `            // 文档id
+	EdbInfoId     int                `json:"edb_info_id" bson:"edb_info_id"`       // 指标编码
+	EdbCode       string             `json:"edb_code" bson:"edb_code"`             // 指标编码
+	DataTime      time.Time          `json:"data_time" bson:"data_time"`           // 数据日期
+	Value         float64            `json:"value" bson:"value"`                   // 数据值
+	CreateTime    time.Time          `json:"create_time" bson:"create_time"`       // 创建时间
+	ModifyTime    time.Time          `json:"modify_time" bson:"modify_time"`       // 修改时间
+	DataTimestamp int64              `json:"data_timestamp" bson:"data_timestamp"` // 数据日期时间戳
+}
+
+// CollectionName
+// @Description:  获取集合名称
+// @author: Roc
+// @receiver m
+// @datetime 2024-04-26 13:41:36
+// @return string
+func (m *EdbDataBusiness) CollectionName() string {
+	return "edb_data_business"
+}
+
+// DataBaseName
+// @Description: 获取数据库名称
+// @author: Roc
+// @receiver m
+// @datetime 2024-04-26 13:41:33
+// @return string
+func (m *EdbDataBusiness) DataBaseName() string {
+	return utils.MgoDataDbName
+}
+
+// GetCollection
+// @Description: 获取mongodb集合的句柄
+// @author: Roc
+// @receiver m
+// @datetime 2024-04-26 13:41:33
+// @return string
+func (m *EdbDataBusiness) GetCollection() *qmgo.Collection {
+	db := utils.MgoDataCli.Database(m.DataBaseName())
+	return db.Collection(m.CollectionName())
+}
+
+// GetItem
+// @Description: 根据条件获取单条数据
+// @author: Roc
+// @receiver m
+// @datetime 2024-05-09 10:00:49
+// @param whereParams interface{}
+// @return item *EdbDataBusiness
+// @return err error
+func (m *EdbDataBusiness) GetItem(whereParams interface{}) (item *EdbDataBusiness, err error) {
+	if utils.MgoDataCli == nil {
+		err = errors.New("mongodb连接失败")
+		return
+	}
+	db := utils.MgoDataCli.Database(m.DataBaseName())
+	coll := db.Collection(m.CollectionName())
+
+	return m.GetItemByColl(coll, whereParams)
+}
+
+// GetItemByColl
+// @Description: 根据条件获取单条数据
+// @author: Roc
+// @receiver m
+// @datetime 2024-05-09 13:22:06
+// @param coll *qmgo.Collection
+// @param whereParams interface{}
+// @return item *EdbDataBusiness
+// @return err error
+func (m *EdbDataBusiness) GetItemByColl(coll *qmgo.Collection, whereParams interface{}) (item *EdbDataBusiness, err error) {
+	ctx := context.TODO()
+	if err != nil {
+		fmt.Println("MgoGetColl Err:", err.Error())
+		return
+	}
+	err = coll.Find(ctx, whereParams).One(&item)
+	if err != nil {
+		return
+	}
+
+	item.DataTime = item.DataTime.In(time.Local)
+	item.CreateTime = item.CreateTime.In(time.Local)
+	item.ModifyTime = item.ModifyTime.In(time.Local)
+
+	return
+}
+
+// GetAllDataList
+// @Description: 根据条件获取所有数据
+// @author: Roc
+// @receiver m
+// @datetime 2024-04-26 13:42:19
+// @param whereParams interface{}
+// @param sort []string
+// @return result []EdbDataBusiness
+// @return err error
+func (m *EdbDataBusiness) GetAllDataList(whereParams interface{}, sort []string) (result []*EdbDataBusiness, err error) {
+	if utils.MgoDataCli == nil {
+		err = errors.New("mongodb连接失败")
+		return
+	}
+	db := utils.MgoDataCli.Database(m.DataBaseName())
+	coll := db.Collection(m.CollectionName())
+	ctx := context.TODO()
+	if err != nil {
+		fmt.Println("MgoGetColl Err:", err.Error())
+		return
+	}
+	err = coll.Find(ctx, whereParams).Sort(sort...).All(&result)
+	if err != nil {
+		return
+	}
+
+	for _, v := range result {
+		v.DataTime = v.DataTime.In(time.Local)
+		v.CreateTime = v.CreateTime.In(time.Local)
+		v.ModifyTime = v.ModifyTime.In(time.Local)
+	}
+
+	return
+}
+
+// GetLimitDataList
+// @Description: 根据条件获取指定数量数据列表
+// @author: Roc
+// @receiver m
+// @datetime 2024-05-06 17:08:32
+// @param whereParams interface{}
+// @param size int64
+// @param sort []string
+// @return result []*BaseFromBusinessData
+// @return err error
+func (m *EdbDataBusiness) GetLimitDataList(whereParams interface{}, size int64, sort []string) (result []*EdbDataBusiness, err error) {
+	if utils.MgoDataCli == nil {
+		err = errors.New("mongodb连接失败")
+		return
+	}
+	db := utils.MgoDataCli.Database(m.DataBaseName())
+	coll := db.Collection(m.CollectionName())
+	ctx := context.TODO()
+	if err != nil {
+		fmt.Println("MgoGetColl Err:", err.Error())
+		return
+	}
+	err = coll.Find(ctx, whereParams).Sort(sort...).Limit(size).All(&result)
+	if err != nil {
+		return
+	}
+
+	for _, v := range result {
+		v.DataTime = v.DataTime.In(time.Local)
+		v.CreateTime = v.CreateTime.In(time.Local)
+		v.ModifyTime = v.ModifyTime.In(time.Local)
+	}
+
+	return
+}
+
+// GetPageDataList
+// @Description: 根据条件获取分页数据列表
+// @author: Roc
+// @receiver m
+// @datetime 2024-05-07 10:21:07
+// @param whereParams interface{}
+// @param startSize int64
+// @param size int64
+// @param sort []string
+// @return result []*EdbDataBusiness
+// @return err error
+func (m *EdbDataBusiness) GetPageDataList(whereParams interface{}, startSize, size int64, sort []string) (result []*EdbDataBusiness, err error) {
+	if utils.MgoDataCli == nil {
+		err = errors.New("mongodb连接失败")
+		return
+	}
+	db := utils.MgoDataCli.Database(m.DataBaseName())
+	coll := db.Collection(m.CollectionName())
+	ctx := context.TODO()
+	if err != nil {
+		fmt.Println("MgoGetColl Err:", err.Error())
+		return
+	}
+	err = coll.Find(ctx, whereParams).Sort(sort...).Skip(startSize).Limit(size).All(&result)
+	if err != nil {
+		return
+	}
+
+	for _, v := range result {
+		v.DataTime = v.DataTime.In(time.Local)
+		v.CreateTime = v.CreateTime.In(time.Local)
+		v.ModifyTime = v.ModifyTime.In(time.Local)
+	}
+
+	return
+}
+
+// GetCountDataList
+// @Description:  根据条件获取数据列表总数
+// @author: Roc
+// @receiver m
+// @datetime 2024-05-07 10:29:00
+// @param whereParams interface{}
+// @return count int64
+// @return err error
+func (m *EdbDataBusiness) GetCountDataList(whereParams interface{}) (count int64, err error) {
+	if utils.MgoDataCli == nil {
+		err = errors.New("mongodb连接失败")
+		return
+	}
+	db := utils.MgoDataCli.Database(m.DataBaseName())
+	coll := db.Collection(m.CollectionName())
+	ctx := context.TODO()
+	if err != nil {
+		fmt.Println("MgoGetColl Err:", err.Error())
+		return
+	}
+	count, err = coll.Find(ctx, whereParams).Count()
+
+	return
+}
+
+// InsertDataByColl
+// @Description: 写入单条数据(外部传入集合)
+// @author: Roc
+// @receiver m
+// @datetime 2024-04-26 14:22:18
+// @param addData interface{}
+// @return err error
+func (m *EdbDataBusiness) InsertDataByColl(coll *qmgo.Collection, addData interface{}) (err error) {
+	ctx := context.TODO()
+	_, err = coll.InsertOne(ctx, addData)
+	if err != nil {
+		fmt.Println("InsertDataByColl:Err:" + err.Error())
+		return
+	}
+
+	return
+}
+
+// BatchInsertData
+// @Description: 批量写入数据
+// @author: Roc
+// @receiver m
+// @datetime 2024-04-26 14:22:18
+// @param bulk int 每次请求保存的数据量
+// @param dataList []interface{}
+// @return err error
+func (m *EdbDataBusiness) BatchInsertData(bulk int, dataList []interface{}) (err error) {
+	db := utils.MgoDataCli.Database(m.DataBaseName())
+	coll := db.Collection(m.CollectionName())
+
+	return m.BatchInsertDataByColl(coll, bulk, dataList)
+}
+
+// BatchInsertDataByColl
+// @Description: 批量写入数据(外部传入集合)
+// @author: Roc
+// @receiver m
+// @datetime 2024-04-26 14:22:18
+// @param coll *qmgo.Collection
+// @param bulk int 每次请求保存的数据量
+// @param dataList []interface{}
+// @return err error
+func (m *EdbDataBusiness) BatchInsertDataByColl(coll *qmgo.Collection, bulk int, dataList []interface{}) (err error) {
+	ctx := context.TODO()
+	dataNum := len(dataList)
+	if dataNum <= 0 {
+		return
+	}
+
+	// 不设置每次保存切片数量大小,或者实际数据量小于设置的切片数量大小,那么就直接保存吧
+	if bulk <= 0 || dataNum <= bulk {
+		_, err = coll.InsertMany(ctx, dataList)
+		if err != nil {
+			fmt.Println("BatchInsertData:Err:" + err.Error())
+			return
+		}
+		return
+	}
+
+	// 分批保存
+	i := 0
+	tmpAddDataList := make([]interface{}, 0)
+	for _, v := range dataList {
+		tmpAddDataList = append(tmpAddDataList, v)
+		i++
+		if i >= bulk {
+			_, err = coll.InsertMany(ctx, tmpAddDataList)
+			if err != nil {
+				fmt.Println("BatchInsertData:Err:" + err.Error())
+				return
+			}
+			i = 0
+			tmpAddDataList = make([]interface{}, 0)
+		}
+	}
+
+	if len(tmpAddDataList) > 0 {
+		_, err = coll.InsertMany(ctx, tmpAddDataList)
+		if err != nil {
+			fmt.Println("BatchInsertData:Err:" + err.Error())
+			return
+		}
+	}
+
+	return
+}
+
+// UpdateData
+// @Description: 单条数据修改
+// @author: Roc
+// @receiver m
+// @datetime 2024-04-26 15:01:51
+// @param whereParams interface{}
+// @param updateParams interface{}
+// @return err error
+func (m *EdbDataBusiness) UpdateData(whereParams, updateParams interface{}) (err error) {
+	db := utils.MgoDataCli.Database(m.DataBaseName())
+	coll := db.Collection(m.CollectionName())
+
+	return m.UpdateDataByColl(coll, whereParams, updateParams)
+}
+
+// UpdateDataByColl
+// @Description: 单条数据修改(外部传入集合)
+// @author: Roc
+// @receiver m
+// @datetime 2024-04-26 15:01:51
+// @param whereParams interface{}
+// @param updateParams interface{}
+// @return err error
+func (m *EdbDataBusiness) UpdateDataByColl(coll *qmgo.Collection, whereParams, updateParams interface{}) (err error) {
+	ctx := context.TODO()
+	err = coll.UpdateOne(ctx, whereParams, updateParams)
+	if err != nil {
+		fmt.Println("UpdateDataByColl:Err:" + err.Error())
+		return
+	}
+
+	return
+}
+
+// RemoveMany
+// @Description: 根据条件删除多条数据
+// @author: Roc
+// @receiver m
+// @datetime 2024-04-30 13:17:02
+// @param whereParams interface{}
+// @return err error
+func (m *EdbDataBusiness) RemoveMany(whereParams interface{}) (err error) {
+	db := utils.MgoDataCli.Database(m.DataBaseName())
+	coll := db.Collection(m.CollectionName())
+
+	return m.RemoveManyByColl(coll, whereParams)
+}
+
+// RemoveManyByColl
+// @Description: 根据条件删除多条数据(外部传入集合)
+// @author: Roc
+// @receiver m
+// @datetime 2024-04-30 13:18:42
+// @param coll *qmgo.Collection
+// @param whereParams interface{}
+// @return err error
+func (m *EdbDataBusiness) RemoveManyByColl(coll *qmgo.Collection, whereParams interface{}) (err error) {
+	ctx := context.TODO()
+	_, err = coll.RemoveAll(ctx, whereParams)
+	if err != nil {
+		fmt.Println("RemoveManyByColl:Err:" + err.Error())
+		return
+	}
+
+	return
+}
+
+// HandleData
+// @Description: 事务处理数据
+// @author: Roc
+// @receiver m
+// @datetime 2024-04-30 10:39:01
+// @param addDataList []AddEdbDataBusiness
+// @param updateDataList []EdbDataBusiness
+// @return result interface{}
+// @return err error
+func (m *EdbDataBusiness) HandleData(addDataList, updateDataList []EdbDataBusiness) (result interface{}, err error) {
+
+	ctx := context.TODO()
+
+	callback := func(sessCtx context.Context) (interface{}, error) {
+		// 重要:确保事务中的每一个操作,都使用传入的sessCtx参数
+
+		db := utils.MgoDataCli.Database(m.DataBaseName())
+		coll := db.Collection(m.CollectionName())
+
+		// 插入数据
+		if len(addDataList) > 0 {
+			_, err = coll.InsertMany(sessCtx, addDataList)
+			if err != nil {
+				return nil, err
+			}
+		}
+
+		// 修改
+
+		if len(updateDataList) > 0 {
+			for _, v := range updateDataList {
+				err = coll.UpdateOne(ctx, bson.M{"_id": v.ID}, bson.M{"$set": bson.M{"value": v.Value, "modify_time": v.ModifyTime}})
+				if err != nil {
+					fmt.Println("BatchInsertData:Err:" + err.Error())
+					return nil, err
+				}
+			}
+		}
+
+		return nil, nil
+	}
+	result, err = utils.MgoDataCli.DoTransaction(ctx, callback)
+
+	return
+}
+
+// EdbInfoMaxAndMinInfo 指标最新数据记录结构体
+type EdbInfoMaxAndMinInfo struct {
+	MinDate     time.Time `description:"最小日期" bson:"min_date"`
+	MaxDate     time.Time `description:"最大日期" bson:"max_date"`
+	MinValue    float64   `description:"最小值" bson:"min_value"`
+	MaxValue    float64   `description:"最大值" bson:"max_value"`
+	LatestValue float64   `description:"最新值" bson:"latest_value"`
+	LatestDate  time.Time `description:"实际数据最新日期" bson:"latest_date"`
+	EndValue    float64   `description:"最新值" bson:"end_value"`
+}
+
+// GetEdbInfoMaxAndMinInfo
+// @Description: 获取当前指标的最大最小值
+// @author: Roc
+// @receiver m
+// @datetime 2024-04-30 17:15:39
+// @param whereParams interface{}
+// @return result EdbInfoMaxAndMinInfo
+// @return err error
+func (m *EdbDataBusiness) GetEdbInfoMaxAndMinInfo(whereParams interface{}) (result EdbInfoMaxAndMinInfo, err error) {
+	if utils.MgoDataCli == nil {
+		err = errors.New("mongodb连接失败")
+		return
+	}
+	db := utils.MgoDataCli.Database(m.DataBaseName())
+	coll := db.Collection(m.CollectionName())
+	ctx := context.TODO()
+	if err != nil {
+		fmt.Println("MgoGetColl Err:", err.Error())
+		return
+	}
+	err = coll.Aggregate(ctx, whereParams).One(&result)
+	if err != nil {
+		return
+	}
+	result.MinDate = result.MinDate.In(time.Local)
+	result.MaxDate = result.MaxDate.In(time.Local)
+	result.LatestDate = result.LatestDate.In(time.Local)
+
+	return
+}
+
+// LatestValue 指标最新数据记录结构体
+type LatestValue struct {
+	Value float64 `description:"值" bson:"value"`
+}
+
+// GetLatestValue
+// @Description: 获取当前指标的最新数据记录
+// @author: Roc
+// @receiver m
+// @datetime 2024-04-30 17:16:15
+// @param whereParams interface{}
+// @param selectParam interface{}
+// @return latestValue LatestValue
+// @return err error
+func (m *EdbDataBusiness) GetLatestValue(whereParams, selectParam interface{}) (latestValue LatestValue, err error) {
+	if utils.MgoDataCli == nil {
+		err = errors.New("mongodb连接失败")
+		return
+	}
+	db := utils.MgoDataCli.Database(m.DataBaseName())
+	coll := db.Collection(m.CollectionName())
+	ctx := context.TODO()
+	if err != nil {
+		fmt.Println("MgoGetColl Err:", err.Error())
+		return
+	}
+
+	//var result interface{}
+	//err = coll.Find(ctx, whereParams).Select(selectParam).One(&result)
+	err = coll.Find(ctx, whereParams).Select(selectParam).One(&latestValue)
+
+	return
+}

+ 274 - 0
models/mgo_base.go

@@ -0,0 +1,274 @@
+package models
+
+import (
+	"context"
+	"encoding/json"
+	"errors"
+	"eta/eta_api/utils"
+	"eta/eta_api/utils/mgodb"
+	"fmt"
+)
+
+func init() {
+	if utils.MgoUrlData != `` {
+		var mgoConfig mgodb.MgoConfig
+		if e := json.Unmarshal([]byte(utils.MgoUrlData), &mgoConfig); e != nil {
+			panic("mongodb链接失败,Err:" + e.Error())
+			return
+		}
+
+		mgoCli := mgodb.MgoNewClient(mgoConfig)
+		utils.MgoDataCli = mgoCli
+		utils.MgoDataDbName = mgoConfig.Database
+		//result, err := TestMgoFindOne("data_ths", bson.M{"edbcode": "s0033227", "datatime": "2015-12-04"})
+		//fmt.Println(time.Now())
+		//result, err := TestMgoFindOne("data_wind", bson.M{"edbcode": "s0033227", "datatime": "2007-12-29"})
+		//fmt.Println(time.Now())
+		//
+		//fmt.Println(err)
+		//fmt.Println(result)
+	}
+
+}
+
+// TestMgoFindOne
+// @Description: 获取单条数据
+// @author: Roc
+// @datetime 2024-04-25 15:44:07
+// @param colName string 集合名词:`data_ths`
+// @param whereParams interface{} bson.M{"edbcode": "s0033227", "datatime": "2015-12-04"}
+// @return result interface{}
+// @return err error
+func TestMgoFindOne(colName string, whereParams interface{}) (result interface{}, err error) {
+	if colName == "" {
+		err = errors.New("集合名称不可为空")
+		return
+	}
+	if utils.MgoDataCli == nil {
+		err = errors.New("mongodb连接失败")
+		return
+	}
+	db := utils.MgoDataCli.Database("hz_data")
+	coll := db.Collection("data_ths")
+	ctx := context.TODO()
+	if err != nil {
+		fmt.Println("MgoGetColl Err:", err.Error())
+		return
+	}
+	//err = coll.Find(ctx, whereParams).One(&result)
+	err = coll.Find(ctx, whereParams).All(&result)
+	return
+}
+
+// 创建集合
+//func MgoCreateCollection(collectionName string) (err error) {
+//	ctx := context.TODO()
+//
+//	mgoClient := mgodb.MgoNewClient()
+//
+//	defer func() {
+//		mgoClient.Close(ctx)
+//	}()
+//
+//	colName := collectionName
+//	err = mgoClient.Database("hz_data").CreateCollection(ctx, colName)
+//	return
+//}
+
+// 批量新增多条数据
+func MgoBatchInsertData(colName string, dataList interface{}) (err error) {
+	if colName == "" {
+		err = errors.New("集合名称不可为空")
+		return
+	}
+	ctx := context.TODO()
+	coll, err := mgodb.MgoGetColl(colName)
+	if err != nil {
+		fmt.Println("MgoGetColl Err:", err.Error())
+		return
+	}
+	defer func() {
+		coll.Close(ctx)
+	}()
+	_, err = coll.Collection.InsertMany(ctx, dataList)
+	if err != nil {
+		fmt.Println("InsertMany:Err:" + err.Error())
+		return
+	}
+	return
+}
+
+// 插入单条数据
+func MgoInsertData(colName string, dataItem interface{}) (insertedID interface{}, err error) {
+	if colName == "" {
+		err = errors.New("集合名称不可为空")
+		return
+	}
+	ctx := context.TODO()
+	coll, err := mgodb.MgoGetColl(colName)
+	if err != nil {
+		fmt.Println("MgoGetColl Err:", err.Error())
+		return
+	}
+	defer func() {
+		coll.Close(ctx)
+	}()
+	result, err := coll.Collection.InsertOne(ctx, dataItem)
+	if err != nil {
+		return
+	}
+	insertedID = result.InsertedID
+	return
+}
+
+/*
+删除数据
+colName := `data_gl`
+whereParams := bson.M{"edbcode": "s0033227"}
+err := MgoRemove(colName, whereParams)
+*/
+func MgoRemove(colName string, whereParams interface{}) (err error) {
+	if colName == "" {
+		err = errors.New("集合名称不可为空")
+		return
+	}
+	ctx := context.TODO()
+	coll, err := mgodb.MgoGetColl(colName)
+	if err != nil {
+		fmt.Println("MgoGetColl Err:", err.Error())
+		return
+	}
+	defer func() {
+		coll.Close(ctx)
+	}()
+	err = coll.Remove(ctx, whereParams)
+	return
+}
+
+/*
+删除多条数据
+colName := `data_gl`
+whereParams := bson.M{"edbcode": "s0033227"}
+err := MgoRemoveAll(colName, whereParams)
+*/
+func MgoRemoveAll(colName string, whereParams interface{}) (count int64, err error) {
+	if colName == "" {
+		err = errors.New("集合名称不可为空")
+		return
+	}
+	ctx := context.TODO()
+	coll, err := mgodb.MgoGetColl(colName)
+	if err != nil {
+		fmt.Println("MgoGetColl Err:", err.Error())
+		return
+	}
+	defer func() {
+		coll.Close(ctx)
+	}()
+	res, err := coll.RemoveAll(ctx, whereParams)
+	if err != nil {
+		fmt.Println("RemoveAll Err:", err.Error())
+		return
+	}
+	count = res.DeletedCount
+	return
+}
+
+/*
+修改单条数据
+colName := `data_ths`
+whereParams := bson.M{"edbcode": "s0033227", "datatime": "2015-12-04"}
+params := bson.M{"$set": bson.M{"value": "1000"}}
+*/
+func MgoUpdateData(colName string, params, whereParams interface{}) (err error) {
+	if colName == "" {
+		err = errors.New("集合名称不可为空")
+		return
+	}
+	ctx := context.TODO()
+	coll, err := mgodb.MgoGetColl(colName)
+	if err != nil {
+		fmt.Println("MgoGetColl Err:", err.Error())
+		return
+	}
+	defer func() {
+		coll.Close(ctx)
+	}()
+	err = coll.UpdateOne(ctx, whereParams, params)
+	return
+}
+
+/*
+获取单条数据
+colName := `data_ths`
+whereParams := bson.M{"edbcode": "s0033227", "datatime": "2015-12-04"}
+*/
+func MgoFindOne(colName string, whereParams interface{}) (result interface{}, err error) {
+	if colName == "" {
+		err = errors.New("集合名称不可为空")
+		return
+	}
+	ctx := context.TODO()
+	coll, err := mgodb.MgoGetColl(colName)
+	if err != nil {
+		fmt.Println("MgoGetColl Err:", err.Error())
+		return
+	}
+	defer func() {
+		coll.Close(ctx)
+	}()
+	err = coll.Find(ctx, whereParams).One(&result)
+	return
+}
+
+/*
+分页获取数据
+colName := `data_ths`
+whereParams := bson.M{"edbcode": "s0033227", "datatime": "2015-12-04"}
+
+sort:="-weight"
+skip:0
+limit:10
+*/
+func MgoBatchFind(colName, sort string, whereParams interface{}, skip, limit int64) (list []interface{}, err error) {
+	if colName == "" {
+		err = errors.New("集合名称不可为空")
+		return
+	}
+	ctx := context.TODO()
+	coll, err := mgodb.MgoGetColl(colName)
+	if err != nil {
+		fmt.Println("MgoGetColl Err:", err.Error())
+		return
+	}
+	defer func() {
+		coll.Close(ctx)
+	}()
+	err = coll.Find(ctx, whereParams).Sort(sort).Skip(skip).Limit(limit).All(&list)
+	return
+}
+
+/*
+MgoUpsertData
+更新插入数据-数据存在即更新, 否则新增
+colName := `data_ths`
+filter := bson.M{"edbcode": "s0033227", "datatime": "2015-12-04"}
+replacement := bson.M{"edb_info_id":0,"edb_code":m.EdbCode,"data_time":d.DataTime,"value":f,"create_time":now,"modify_time":now,"data_timestamp": stamp}
+*/
+func MgoUpsertData(colName string, filter, replacement interface{}) (err error) {
+	if colName == "" {
+		err = errors.New("集合名称不可为空")
+		return
+	}
+	ctx := context.TODO()
+	coll, err := mgodb.MgoGetColl(colName)
+	if err != nil {
+		fmt.Println("MgoGetColl Err:", err.Error())
+		return
+	}
+	defer func() {
+		_ = coll.Close(ctx)
+	}()
+	_, err = coll.Upsert(ctx, filter, replacement)
+	return
+}

+ 90 - 0
routers/commentsRouter.go

@@ -2257,6 +2257,33 @@ func init() {
             Filters: nil,
             Params: nil})
 
+    beego.GlobalControllerRouter["eta/eta_api/controllers/data_manage:ChartInfoController"] = append(beego.GlobalControllerRouter["eta/eta_api/controllers/data_manage:ChartInfoController"],
+        beego.ControllerComments{
+            Method: "ForumDelete",
+            Router: `/chart_info/forum/delete`,
+            AllowHTTPMethods: []string{"post"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["eta/eta_api/controllers/data_manage:ChartInfoController"] = append(beego.GlobalControllerRouter["eta/eta_api/controllers/data_manage:ChartInfoController"],
+        beego.ControllerComments{
+            Method: "UpdateToForum",
+            Router: `/chart_info/forum/update`,
+            AllowHTTPMethods: []string{"post"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["eta/eta_api/controllers/data_manage:ChartInfoController"] = append(beego.GlobalControllerRouter["eta/eta_api/controllers/data_manage:ChartInfoController"],
+        beego.ControllerComments{
+            Method: "UploadToForum",
+            Router: `/chart_info/forum/upload`,
+            AllowHTTPMethods: []string{"post"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
     beego.GlobalControllerRouter["eta/eta_api/controllers/data_manage:ChartInfoController"] = append(beego.GlobalControllerRouter["eta/eta_api/controllers/data_manage:ChartInfoController"],
         beego.ControllerComments{
             Method: "ChartInfoImageSet",
@@ -2662,6 +2689,60 @@ func init() {
             Filters: nil,
             Params: nil})
 
+    beego.GlobalControllerRouter["eta/eta_api/controllers/data_manage:EdbBusinessController"] = append(beego.GlobalControllerRouter["eta/eta_api/controllers/data_manage:EdbBusinessController"],
+        beego.ControllerComments{
+            Method: "AddCheck",
+            Router: `/business_data/add_check`,
+            AllowHTTPMethods: []string{"post"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["eta/eta_api/controllers/data_manage:EdbBusinessController"] = append(beego.GlobalControllerRouter["eta/eta_api/controllers/data_manage:EdbBusinessController"],
+        beego.ControllerComments{
+            Method: "BatchAdd",
+            Router: `/business_data/batch_add`,
+            AllowHTTPMethods: []string{"post"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["eta/eta_api/controllers/data_manage:EdbBusinessController"] = append(beego.GlobalControllerRouter["eta/eta_api/controllers/data_manage:EdbBusinessController"],
+        beego.ControllerComments{
+            Method: "DataList",
+            Router: `/business_data/data/list`,
+            AllowHTTPMethods: []string{"get"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["eta/eta_api/controllers/data_manage:EdbBusinessController"] = append(beego.GlobalControllerRouter["eta/eta_api/controllers/data_manage:EdbBusinessController"],
+        beego.ControllerComments{
+            Method: "List",
+            Router: `/business_data/list`,
+            AllowHTTPMethods: []string{"get"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["eta/eta_api/controllers/data_manage:EdbBusinessController"] = append(beego.GlobalControllerRouter["eta/eta_api/controllers/data_manage:EdbBusinessController"],
+        beego.ControllerComments{
+            Method: "NameCheck",
+            Router: `/business_data/name_check`,
+            AllowHTTPMethods: []string{"post"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
+    beego.GlobalControllerRouter["eta/eta_api/controllers/data_manage:EdbBusinessController"] = append(beego.GlobalControllerRouter["eta/eta_api/controllers/data_manage:EdbBusinessController"],
+        beego.ControllerComments{
+            Method: "SourceList",
+            Router: `/business_data/source/list`,
+            AllowHTTPMethods: []string{"get"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
     beego.GlobalControllerRouter["eta/eta_api/controllers/data_manage:EdbClassifyController"] = append(beego.GlobalControllerRouter["eta/eta_api/controllers/data_manage:EdbClassifyController"],
         beego.ControllerComments{
             Method: "AddEdbClassify",
@@ -8593,6 +8674,15 @@ func init() {
             Filters: nil,
             Params: nil})
 
+    beego.GlobalControllerRouter["eta/eta_api/controllers:TargetCommonController"] = append(beego.GlobalControllerRouter["eta/eta_api/controllers:TargetCommonController"],
+        beego.ControllerComments{
+            Method: "TemplateDownloadEn",
+            Router: `/template/en`,
+            AllowHTTPMethods: []string{"get"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
     beego.GlobalControllerRouter["eta/eta_api/controllers:TargetController"] = append(beego.GlobalControllerRouter["eta/eta_api/controllers:TargetController"],
         beego.ControllerComments{
             Method: "ClassifyList",

+ 1 - 0
routers/router.go

@@ -169,6 +169,7 @@ func init() {
 				&data_manage.ChartThemeController{},
 				&data_manage_permission.DataMangePermissionController{},
 				&data_manage.BloombergDataController{},
+				&data_manage.EdbBusinessController{},
 			),
 		),
 		web.NSNamespace("/my_chart",

+ 2 - 2
services/aliyun_email.go

@@ -111,10 +111,10 @@ func (em *AliyunEmail) BatchSendEmail(list []*EnglishReportSendEmailRequest) (re
 	}
 
 	// sendSingleMail接口有QPS100的限制, 保险起见每秒只请求50次接口
-	max := 50
+	secondMax := 50
 	c := 0
 	for i := range list {
-		if c >= max {
+		if c >= secondMax {
 			time.Sleep(time.Second)
 			c = 0
 		}

+ 25 - 0
services/data/base_edb_lib.go

@@ -472,6 +472,31 @@ func BaseCalculate(param, lang string) (resp *BaseCalculateResp, err error) {
 	return
 }
 
+// AddBaseEdbInfo 新增基础指标
+func AddBaseEdbInfo(addBaseEdbInfoReqStr string, source, subSource int, lang string) (resp *AddPredictEdbDataResponse, err error) {
+	urlStr := ``
+	switch source {
+	case utils.DATA_SOURCE_BUSINESS:
+		urlStr = "business_index/add"
+	default:
+		edbSource := data_manage.EdbSourceIdMap[source]
+		if edbSource != nil {
+			urlStr = edbSource.EdbRefreshMethod
+		}
+	}
+	if urlStr == "" {
+		err = fmt.Errorf(fmt.Sprint("source:", source, ";未实现该指标的刷新接口,请联系管理员"))
+		return
+	}
+	_, resultByte, err := postAddEdbData(addBaseEdbInfoReqStr, urlStr, lang)
+	if err != nil {
+		return
+	}
+	err = json.Unmarshal(resultByte, &resp)
+
+	return
+}
+
 // postRefreshEdbData 刷新指标数据
 func postRefreshEdbData(param map[string]interface{}, urlStr string) (resp *models.BaseResponse, err error) {
 	postUrl := utils.EDB_LIB_URL + urlStr

+ 106 - 0
services/data/base_from_business.go

@@ -0,0 +1,106 @@
+package data
+
+import (
+	"eta/eta_api/models/data_manage"
+	"eta/eta_api/models/mgo"
+	"eta/eta_api/utils"
+	"fmt"
+	"go.mongodb.org/mongo-driver/bson"
+)
+
+type BusinessIndexSource2EdbReq struct {
+	EdbCode       string
+	EdbName       string
+	Frequency     string
+	Unit          string
+	ClassifyId    int
+	AdminId       int
+	AdminRealName string
+}
+
+// BusinessIndexSource2Edb 新增彭博数据源到指标库
+func BusinessIndexSource2Edb(req BusinessIndexSource2EdbReq, lang string) (edb *data_manage.EdbInfo, err error, errMsg string, skip bool) {
+	if req.EdbCode == "" {
+		err = fmt.Errorf("指标ID为空")
+		return
+	}
+	defer func() {
+		if err != nil {
+			tips := fmt.Sprintf("BusinessIndexSource2Edb新增失败, Err: %s", err.Error())
+			fmt.Println(tips)
+			utils.FileLog.Info(tips)
+		}
+	}()
+	source := utils.DATA_SOURCE_BUSINESS
+
+	// 是否新增过指标
+	exist, e := data_manage.GetEdbInfoByEdbCode(source, req.EdbCode)
+	if e != nil && e.Error() != utils.ErrNoRow() {
+		err = fmt.Errorf("获取指标是否存在失败, err: %s", e.Error())
+		return
+	}
+	if exist != nil {
+		skip = true
+		return
+	}
+
+	// 开始结束时间
+	var startDate, endDate string
+
+	// 新增指标库
+	edbInfo, e, msg, _ := EdbInfoAdd(source, utils.DATA_SUB_SOURCE_EDB, req.ClassifyId, req.EdbCode, req.EdbName, req.Frequency, req.Unit, startDate, endDate, req.AdminId, req.AdminRealName, lang)
+	if e != nil {
+		errMsg = msg
+		err = fmt.Errorf("EdbInfo: 新增指标失败, err: %s", e.Error())
+		return
+	}
+
+	edb = edbInfo
+
+	return
+}
+
+// GetPageBaseBusinessIndexData
+// @Description: 获取自有数据的分页数据
+// @author: Roc
+// @datetime 2024-05-07 11:02:51
+// @param indexCode int
+// @param startSize int
+// @param pageSize int
+// @return dataCount int
+// @return dataList []*data_manage.BaseFromBusinessIndexDataItem
+// @return err error
+func GetPageBaseBusinessIndexData(indexCode string, startSize, pageSize int) (dataCount int, dataList []*data_manage.BaseFromBusinessIndexDataItem, err error) {
+	dataList = make([]*data_manage.BaseFromBusinessIndexDataItem, 0)
+
+	mogDataObj := mgo.BaseFromBusinessData{}
+	// 构建查询条件
+	queryConditions := bson.M{
+		"index_code": indexCode,
+	}
+
+	// 获取数据总量
+	tmpCount, tmpErr := mogDataObj.GetCountDataList(queryConditions)
+	if tmpErr != nil && tmpErr.Error() != utils.ErrNoRow() {
+		err = tmpErr
+		return
+	}
+	dataCount = int(tmpCount)
+
+	// 获取列表数据
+	tmpDataList, tmpErr := mogDataObj.GetPageDataList(queryConditions, int64(startSize), int64(pageSize), []string{"-data_time"})
+	if tmpErr != nil {
+		err = tmpErr
+		return
+	}
+	for _, v := range tmpDataList {
+		dataList = append(dataList, &data_manage.BaseFromBusinessIndexDataItem{
+			ID:        v.ID.String(),
+			IndexCode: v.IndexCode,
+			DataTime:  v.DataTime.Format(utils.FormatDate),
+			Value:     v.Value,
+		})
+	}
+
+	return
+}

+ 125 - 0
services/data/edb_data.go

@@ -4,9 +4,11 @@ import (
 	"errors"
 	"eta/eta_api/models"
 	"eta/eta_api/models/data_manage"
+	"eta/eta_api/models/mgo"
 	"eta/eta_api/utils"
 	"fmt"
 	"github.com/shopspring/decimal"
+	"go.mongodb.org/mongo-driver/bson"
 	"time"
 )
 
@@ -390,3 +392,126 @@ func GetEdbBeforeAndAfterDateData(targetDate string, dataList []*data_manage.Edb
 	}
 	return
 }
+
+// GetPageData
+// @Description: 获取指标的分页数据
+// @author: Roc
+// @datetime 2024-05-07 10:33:02
+// @param edbInfoId int
+// @param source int
+// @param subSource int
+// @param startSize int
+// @param pageSize int
+// @return dataCount int
+// @return dataList []*data_manage.EdbData
+// @return err error
+func GetPageData(edbInfoId, source, subSource int, endDataTime string, startSize, pageSize int) (dataCount int, dataList []*data_manage.EdbData, err error) {
+	dataList = make([]*data_manage.EdbData, 0)
+
+	// 自有数据需要额外处理(从mongo获取)
+	if source == utils.DATA_SOURCE_BUSINESS {
+		return getPageDataByMongo(edbInfoId, source, subSource, endDataTime, startSize, pageSize)
+	}
+
+	// 默认走mysql
+	return getPageDataByMysql(edbInfoId, source, subSource, endDataTime, startSize, pageSize)
+}
+
+// getPageDataByMysql
+// @Description: 从Mysql获取数据
+// @author: Roc
+// @datetime 2024-05-07 15:08:41
+// @param edbInfoId int
+// @param source int
+// @param subSource int
+// @param endDataTime string
+// @param startSize int
+// @param pageSize int
+// @return dataCount int
+// @return dataList []*data_manage.EdbData
+// @return err error
+func getPageDataByMysql(edbInfoId, source, subSource int, endDataTime string, startSize, pageSize int) (dataCount int, dataList []*data_manage.EdbData, err error) {
+	dataList = make([]*data_manage.EdbData, 0)
+	var dataCondition string
+	var dataPars []interface{}
+
+	dataCondition += ` AND edb_info_id=? `
+	dataPars = append(dataPars, edbInfoId)
+
+	// 结束日期
+	if endDataTime != "" {
+		dataCondition += ` AND data_time <= ? `
+		dataPars = append(dataPars, endDataTime)
+	}
+
+	// 获取数据总量
+	dataCount, err = data_manage.GetEdbDataCountByCondition(dataCondition, dataPars, source, subSource)
+	if err != nil && err.Error() != utils.ErrNoRow() {
+		return
+	}
+
+	// 获取列表数据
+	dataList, err = data_manage.GetEdbDataListByCondition(dataCondition, dataPars, source, subSource, pageSize, startSize)
+	if err != nil {
+		return
+	}
+
+	return
+}
+
+// getPageDataByMongo
+// @Description: 从MongoDB获取数据
+// @author: Roc
+// @datetime 2024-05-07 15:06:42
+// @param edbInfoId int
+// @param source int
+// @param subSource int
+// @param endDataTime string
+// @param startSize int
+// @param pageSize int
+// @return dataCount int
+// @return dataList []*data_manage.EdbData
+// @return err error
+func getPageDataByMongo(edbInfoId, source, subSource int, endDataTime string, startSize, pageSize int) (dataCount int, dataList []*data_manage.EdbData, err error) {
+	dataList = make([]*data_manage.EdbData, 0)
+
+	mogDataObj := mgo.EdbDataBusiness{}
+	// 构建查询条件
+	queryConditions := bson.M{
+		"edb_info_id": edbInfoId,
+	}
+	// 结束日期
+	if endDataTime != "" {
+		endDateTime, tmpErr := time.ParseInLocation(utils.FormatDate, endDataTime, time.Local)
+		if tmpErr != nil {
+			err = tmpErr
+			return
+		}
+		queryConditions["data_time"] = bson.M{"$lte": endDateTime}
+	}
+
+	// 获取数据总量
+	tmpCount, tmpErr := mogDataObj.GetCountDataList(queryConditions)
+	if tmpErr != nil && tmpErr.Error() != utils.ErrNoRow() {
+		err = tmpErr
+		return
+	}
+	dataCount = int(tmpCount)
+
+	// 获取列表数据
+	tmpDataList, tmpErr := mogDataObj.GetPageDataList(queryConditions, int64(startSize), int64(pageSize), []string{"-data_time"})
+	if tmpErr != nil {
+		err = tmpErr
+		return
+	}
+	for k, v := range tmpDataList {
+		dataList = append(dataList, &data_manage.EdbData{
+			EdbDataId: k + 1,
+			EdbInfoId: v.EdbInfoId,
+			DataTime:  v.DataTime.Format(utils.FormatDate),
+			Value:     v.Value,
+		})
+	}
+
+	return
+}

+ 42 - 1
services/data/edb_info.go

@@ -1718,8 +1718,48 @@ func getRefreshEdbInfoListByIds(edbInfoIdList []int) (newBaseEdbInfoArr, newBase
 	return
 }
 
+type AddEdbBaseInfoReq struct {
+	EdbCode         string `description:"指标编码"`
+	EdbName         string `description:"指标名称"`
+	Unit            string `description:"单位"`
+	ClassifyId      int    `description:"所属分类"`
+	SysUserId       int    `description:"用户id"`
+	SysUserRealName string `description:"用户真实名称"`
+}
+
 // EdbInfoAdd 添加指标到指标库
 func EdbInfoAdd(source, subSource, classifyId int, edbCode, edbName, frequency, unit, startDate, endDate string, sysUserId int, sysUserRealName, lang string) (edbInfo *data_manage.EdbInfo, err error, errMsg string, isSendEmail bool) {
+	// 有些指标的添加是走的指标公共服务
+	if source == utils.DATA_SOURCE_BUSINESS {
+		req2 := AddEdbBaseInfoReq{
+			EdbCode:         edbCode,
+			EdbName:         edbName,
+			Unit:            unit,
+			ClassifyId:      classifyId,
+			SysUserId:       sysUserId,
+			SysUserRealName: sysUserRealName,
+		}
+		reqJson, tmpErr := json.Marshal(req2)
+		if tmpErr != nil {
+			err = tmpErr
+			return
+		}
+		respItem, tmpErr := AddBaseEdbInfo(string(reqJson), source, subSource, lang)
+		if tmpErr != nil {
+			errMsg = "添加失败"
+			err = tmpErr
+			return
+		}
+		isSendEmail = respItem.IsSendEmail
+		if respItem.Ret != 200 {
+			errMsg = respItem.Msg
+			err = errors.New(respItem.ErrMsg)
+		} else {
+			edbInfo, err = data_manage.GetEdbInfoById(respItem.Data.EdbInfoId)
+		}
+		return
+	}
+
 	isSendEmail = true
 
 	//判断指标名称是否存在
@@ -2111,7 +2151,7 @@ func getEdbRuleTitle(edbInfo, parentEdbInfo *data_manage.EdbInfo, childList []da
 			for _, v := range edbMappingList {
 				if v.FromEdbInfoId == edbInfo.EdbInfoId {
 					edbName = fmt.Sprintf("%s(%s)", edbInfo.EdbName, v.FromTag)
-					edbName = fmt.Sprintf("%s(%s)", edbInfo.EdbNameEn, v.FromTag)
+					edbNameEn = fmt.Sprintf("%s(%s)", edbInfo.EdbNameEn, v.FromTag)
 				}
 			}
 
@@ -2152,6 +2192,7 @@ func getEdbRuleTitle(edbInfo, parentEdbInfo *data_manage.EdbInfo, childList []da
 			for _, v := range edbMappingList {
 				if v.FromEdbInfoId == edbInfo.EdbInfoId {
 					edbName = fmt.Sprintf("%s(%s)", edbInfo.EdbName, v.FromTag)
+					edbNameEn = fmt.Sprintf("%s(%s)", edbInfo.EdbNameEn, v.FromTag)
 				}
 			}
 

+ 0 - 103
services/data/edb_info_calculate.go

@@ -7,10 +7,8 @@ import (
 	"eta/eta_api/utils"
 	"fmt"
 	"github.com/shopspring/decimal"
-	"github.com/yidane/formula"
 	"math"
 	"regexp"
-	"strconv"
 	"strings"
 	"time"
 )
@@ -365,107 +363,6 @@ func GetFormulaMap() map[string]string {
 	return funMap
 }
 
-// 刷新数据
-func RefreshCalculate(edbInfoIdArr []*data_manage.EdbInfo, edbInfoId int, edbCode, formulaStr, startDate, endDate string, edbInfoIdBytes []string) (err error) {
-	defer func() {
-		if err != nil {
-			fmt.Println("RefreshCalculate:Err " + err.Error())
-			utils.FileLog.Info("Calculate Err:%s" + err.Error())
-		}
-	}()
-	saveDataMap := make(map[string]map[int]float64)
-	for _, v := range edbInfoIdArr {
-		var condition string
-		var pars []interface{}
-		condition += " AND edb_info_id=? "
-		pars = append(pars, v.EdbInfoId)
-		if startDate != "" {
-			condition += " AND data_time>=? "
-			pars = append(pars, startDate)
-		}
-		if endDate != "" {
-			condition += " AND data_time<=? "
-			pars = append(pars, endDate)
-		}
-		dataList, err := data_manage.GetEdbDataListAll(condition, pars, v.Source, v.SubSource, 1)
-		if err != nil {
-			return err
-		}
-		dataMap := make(map[string]float64)
-		for _, dv := range dataList {
-			if val, ok := saveDataMap[dv.DataTime]; ok {
-				if _, ok := val[v.EdbInfoId]; !ok {
-					val[v.EdbInfoId] = dv.Value
-				}
-			} else {
-				temp := make(map[int]float64)
-				temp[v.EdbInfoId] = dv.Value
-				saveDataMap[dv.DataTime] = temp
-			}
-		}
-		item := new(CalculateItems)
-		item.EdbInfoId = v.EdbInfoId
-		item.DataMap = dataMap
-	}
-
-	formulaMap := CheckFormula(formulaStr)
-	addSql := ` INSERT INTO edb_data_calculate(edb_info_id,edb_code,data_time,value,create_time,modify_time,status,data_timestamp) values `
-	nowStr := time.Now().Format(utils.FormatDateTime)
-	var isAdd bool
-
-	for sk, sv := range saveDataMap {
-		formulaStr = strings.ToUpper(formulaStr)
-		formulaFormStr := ReplaceFormula(edbInfoIdArr, sv, formulaMap, formulaStr, edbInfoIdBytes)
-		if formulaFormStr != "" {
-			utils.FileLog.Info("formulaFormStr:%s", formulaFormStr)
-			expression := formula.NewExpression(formulaFormStr)
-			calResult, err := expression.Evaluate()
-			if err != nil {
-				err = errors.New("计算失败:Err:" + err.Error() + ";formulaStr:" + formulaFormStr)
-				fmt.Println(err)
-				return err
-			}
-			calVal, err := calResult.Float64()
-			if err != nil {
-				err = errors.New("计算失败:获取计算值失败 Err:" + err.Error() + ";formulaStr:" + formulaFormStr)
-				fmt.Println(err)
-				return err
-			}
-
-			count, err := data_manage.GetEdbDataCalculateByCodeAndDate(edbCode, sk)
-			if err != nil && err.Error() != utils.ErrNoRow() {
-				return err
-			}
-			if count <= 0 { //需要存入的数据
-				dataTime, _ := time.Parse(utils.FormatDate, sk)
-				timestamp := dataTime.UnixNano() / 1e6
-				timeStr := fmt.Sprintf("%d", timestamp)
-				addSql += "("
-				addSql += strconv.Itoa(edbInfoId) + "," + "'" + edbCode + "'" + "," + "'" + sk + "'" + "," + utils.SubFloatToString(calVal, 4) + "," + "'" + nowStr + "'" +
-					"," + "'" + nowStr + "'" + "," + "1"
-				addSql += "," + "'" + timeStr + "'"
-				addSql += "),"
-				isAdd = true
-			} else {
-				calVal = utils.FixFloat(calVal, 4)
-				err = data_manage.ModifyEdbDataCalculate(int64(edbInfoId), sk, calVal)
-				if err != nil {
-					return err
-				}
-			}
-		}
-	}
-	if isAdd {
-		addSql = strings.TrimRight(addSql, ",")
-		data_manage.AddEdbDataCalculateBySql(addSql)
-		if err != nil {
-			fmt.Println("AddEdbDataCalculate Err:" + err.Error())
-			return err
-		}
-	}
-	return
-}
-
 // 处理整个数据
 func handleDateSaveDataMap(dateList []string, realSaveDataMap, saveDataMap map[string]map[int]float64, edbInfoIdArr []*data_manage.EdbInfo, emptyType int) {
 	var startDate, endDate string

+ 6 - 2
services/data/mysteel_chemical.go

@@ -302,14 +302,18 @@ func DelMysteelChemicalClassify(classifyId int, sysUser *system.Admin) (err erro
 }
 
 // AddMysteelChemicalIndex 添加钢联化工指标
-func AddMysteelChemicalIndex(classifyId int, indexCode, updateWeek, updateTimeStr string, sysUserId int, sysUserName string) (baseFromMysteelChemicalIndex *data_manage.BaseFromMysteelChemicalIndex, err error, errMsg string) {
+func AddMysteelChemicalIndex(classifyId int, indexCode, updateWeek, updateTimeStr string, sysUserId int, sysUserName,lang string) (baseFromMysteelChemicalIndex *data_manage.BaseFromMysteelChemicalIndex, err error, errMsg string) {
 	baseFromMysteelChemicalIndex, err = data_manage.GetBaseFromMysteelChemicalIndexByCode(indexCode)
 	if err != nil && err.Error() != utils.ErrNoRow() {
 		errMsg = `获取数据失败`
 		return
 	}
 	if baseFromMysteelChemicalIndex != nil {
-		errMsg = `指标ID:` + indexCode + ` 已存在,请重新输入`
+		if lang == utils.EnLangVersion {
+			errMsg = `Metric ID:` + indexCode + ` already exists, please re-enter.`
+		} else {
+			errMsg = `指标ID:` + indexCode + ` 已存在,请重新输入`
+		}
 		return
 	}
 	// 更新时间切割

+ 9 - 1
services/data/trade_analysis/trade_analysis.go

@@ -9,7 +9,7 @@ import (
 	"time"
 )
 
-func GetClassifyName() (list trade_analysis.TradeClassifyNameListSort, err error, errMsg string) {
+func GetClassifyName(lang string) (list trade_analysis.TradeClassifyNameListSort, err error, errMsg string) {
 	//定义交易所
 	exchanges := map[string]string{
 		"zhengzhou": "郑商所",
@@ -19,6 +19,13 @@ func GetClassifyName() (list trade_analysis.TradeClassifyNameListSort, err error
 		"ine":       "上期能源",
 		"guangzhou": "广期所",
 	}
+	exchangesEn := map[string]string{
+		"郑商所":  "Zhengzhou ComEx",
+		"大商所":  "Dalian ComEx",
+		"上期所":  "SH Intl Energy Ex",
+		"中金所":  "China Fin Futures Ex",
+		"上期能源": "SH Energy Ex",
+	}
 	exchangesSortMap := map[string]int{
 		"zhengzhou": 1,
 		"dalian":    2,
@@ -69,6 +76,7 @@ func GetClassifyName() (list trade_analysis.TradeClassifyNameListSort, err error
 	for k, v := range exchanges {
 		tmp := trade_analysis.TradeClassifyNameList{
 			Exchange: v,
+			ExchangeEn: exchangesEn[v],
 			Items:    nil,
 			Sort:     exchangesSortMap[k],
 			CurrDate: currDate,

+ 94 - 70
services/english_report.go

@@ -78,17 +78,18 @@ type IEnglishEmailSend interface {
 
 // EnglishReportSendEmailRequest 英文研报-推送邮件请求体
 type EnglishReportSendEmailRequest struct {
-	ReportId        int    `description:"英文报告ID"`
-	EmailId         int    `description:"邮箱ID"`
-	Email           string `description:"邮箱地址"`
-	Subject         string `description:"邮件主题"`
-	FromAlias       string `description:"发信人昵称"`
-	ReportTitle     string `description:"报告标题"`
-	ReportAbstract  string `description:"报告摘要"`
-	ReportContent   string `description:"报告内容"`
-	ReportShareLink string `description:"报告分享链接"`
-	ReportTime      string `description:"报告时间"`
-	HtmlBody        string `description:"模板内容主体"`
+	ReportId        int                           `description:"英文报告ID"`
+	EmailId         int                           `description:"邮箱ID"`
+	Email           string                        `description:"邮箱地址"`
+	Subject         string                        `description:"邮件主题"`
+	FromAlias       string                        `description:"发信人昵称"`
+	ReportTitle     string                        `description:"报告标题"`
+	ReportAbstract  string                        `description:"报告摘要"`
+	ReportContent   string                        `description:"报告内容"`
+	ReportShareLink string                        `description:"报告分享链接"`
+	ReportTime      string                        `description:"报告时间"`
+	HtmlBody        string                        `description:"模板内容主体"`
+	EmailLog        *models.EnglishReportEmailLog `description:"日志记录"`
 }
 
 // EnglishReportSendEmailResult 英文研报-推送邮件响应体
@@ -106,15 +107,18 @@ type EnglishReportSendEmailResult struct {
 func BatchSendAliEnglishReportEmail(list []*EnglishReportSendEmailRequest) (err error) {
 	defer func() {
 		if err != nil {
-			go alarm_msg.SendAlarmMsg("阿里云群发英文研报邮件失败, Err: "+err.Error(), 3)
+			tips := fmt.Sprintf("阿里云群发英文研报邮件失败 err: %s\n", err.Error())
+			utils.FileLog.Info(tips)
+			fmt.Println(tips)
+			go alarm_msg.SendAlarmMsg(tips, 3)
 		}
 	}()
 	if len(list) == 0 {
 		return
 	}
 	requestMap := make(map[int]*EnglishReportSendEmailRequest, 0)
-	for i := range list {
-		requestMap[list[i].EmailId] = list[i]
+	for _, v := range list {
+		requestMap[v.EmailId] = v
 	}
 
 	// 请求阿里云接口批量推送
@@ -128,29 +132,30 @@ func BatchSendAliEnglishReportEmail(list []*EnglishReportSendEmailRequest) (err
 	// 返回的结果更新日志
 	resendList := make([]*EnglishReportSendEmailRequest, 0)
 	failLogIds := make([]int, 0)
-	updateCols := []string{"SendData", "Result", "SendStatus", "ErrMsg"}
-	for i := range resultList {
-		var cond string
-		var pars []interface{}
-		cond = ` AND is_deleted = 0 AND report_id = ? AND email_id = ? AND source = ? AND send_status = ?`
-		pars = append(pars, resultList[i].ReportId, resultList[i].EmailId, models.EnglishReportEmailLogSourceAli, models.EnglishReportEmailLogStatusIng)
-		l, e := models.GetEnglishReportEmailLog(cond, pars)
-		if e != nil {
+	updateLogs := make([]*models.EnglishReportEmailLog, 0)
+	for _, v := range resultList {
+		req := requestMap[v.EmailId]
+		if req == nil {
+			continue
+		}
+		l := req.EmailLog
+		if l == nil {
 			continue
 		}
-		l.SendData = resultList[i].SendData
-		l.Result = resultList[i].ResultData
-		if resultList[i].Ok {
+
+		//l.SendData = v.SendData
+		l.Result = v.ResultData
+		if v.Ok {
 			l.SendStatus = models.EnglishReportEmailLogStatusSuccess
 		} else {
 			l.SendStatus = models.EnglishReportEmailLogStatusFail
 			failLogIds = append(failLogIds, l.Id)
-			if requestMap[resultList[i].EmailId] != nil {
-				resendList = append(resendList, requestMap[resultList[i].EmailId])
+			if requestMap[v.EmailId] != nil {
+				resendList = append(resendList, requestMap[v.EmailId])
 			}
 			// 取出错误信息
 			r := new(AliyunEmailResult)
-			if e = json.Unmarshal([]byte(resultList[i].ResultData), &r); e != nil {
+			if e = json.Unmarshal([]byte(v.ResultData), &r); e != nil {
 				continue
 			}
 			rd := new(AliyunEmailResultData)
@@ -160,23 +165,40 @@ func BatchSendAliEnglishReportEmail(list []*EnglishReportSendEmailRequest) (err
 			}
 			l.ErrMsg = rd.Message
 		}
-		if e = l.Update(updateCols); e != nil {
-			continue
-		}
+		updateLogs = append(updateLogs, l)
+	}
+
+	// 更新日志
+	logOb := new(models.EnglishReportEmailLog)
+	if e = logOb.MultiUpdateResult(updateLogs); e != nil {
+		err = fmt.Errorf("批量更新日志信息失败, Err: " + e.Error())
+		return
 	}
 
 	// 推送失败的重新腾讯云, 若腾讯云也失败将不再自动重推, 用户手动去重推
 	if len(resendList) > 0 && len(failLogIds) > 0 {
-		_ = ResendTencentEnglishReportEmail(resendList, failLogIds)
+		hasFail, _ := ResendTencentEnglishReportEmail(resendList, failLogIds)
+		//fmt.Printf("hasFail: %v", hasFail)
+		// 存在发送失败则更新报告标识
+		if hasFail {
+			if e = models.UpdateEnglishReportEmailHasFail(list[0].ReportId); e != nil {
+				err = fmt.Errorf("UpdateEnglishReportEmailHasFail err: %s", e.Error())
+				return
+			}
+		}
 	}
 	return
 }
 
 // ResendTencentEnglishReportEmail 腾讯云邮件重新推送
-func ResendTencentEnglishReportEmail(resendList []*EnglishReportSendEmailRequest, failLogIds []int) (err error) {
+func ResendTencentEnglishReportEmail(resendList []*EnglishReportSendEmailRequest, failLogIds []int) (hasFail bool, err error) {
 	defer func() {
 		if err != nil {
-			go alarm_msg.SendAlarmMsg("腾讯云重发英文研报邮件失败, Err: "+err.Error(), 3)
+			hasFail = true
+			tips := fmt.Sprintf("腾讯云重发英文研报邮件失败 err: %s\n", err.Error())
+			utils.FileLog.Info(tips)
+			fmt.Println(tips)
+			go alarm_msg.SendAlarmMsg(tips, 3)
 		}
 	}()
 	if len(resendList) == 0 || len(failLogIds) == 0 {
@@ -194,61 +216,59 @@ func ResendTencentEnglishReportEmail(resendList []*EnglishReportSendEmailRequest
 	// 写入新的日志
 	nowTime := time.Now().Local()
 	logData := make([]*models.EnglishReportEmailLog, 0)
-	for i := range resendList {
-		sendByte, e := json.Marshal(resendList[i])
-		if e != nil {
-			err = errors.New("sendByte json.Marshal Err, Err: " + e.Error())
-			return
-		}
-
-		logData = append(logData, &models.EnglishReportEmailLog{
-			ReportId:   resendList[i].ReportId,
-			EmailId:    resendList[i].EmailId,
-			Email:      resendList[i].Email,
-			SendData:   string(sendByte),
+	logMap := make(map[int]*models.EnglishReportEmailLog, 0)
+	for _, v := range resendList {
+		logItem := &models.EnglishReportEmailLog{
+			ReportId:   v.ReportId,
+			EmailId:    v.EmailId,
+			Email:      v.Email,
 			Source:     models.EnglishReportEmailLogSourceTencent,
 			SendStatus: models.EnglishReportEmailLogStatusIng,
 			CreateTime: nowTime,
-		})
+		}
+		logData = append(logData, logItem)
+		logMap[v.EmailId] = logItem
 	}
-	emailLog := new(models.EnglishReportEmailLog)
-	if e := emailLog.InsertMulti(logData); e != nil {
-		err = errors.New("批量写入群发邮件日志失败, Err: " + e.Error())
-		return
+	for _, v := range logData {
+		if e := v.Create(); e != nil {
+			err = fmt.Errorf("写入群发邮件日志失败, err: %s", e.Error())
+			return
+		}
 	}
 
 	// 请求腾讯云
-	tecentEmail := new(TencentEmail)
-	resultList, e := tecentEmail.BatchSendEmail(resendList)
+	tencentEmail := new(TencentEmail)
+	resultList, e := tencentEmail.BatchSendEmail(resendList)
 	if e != nil {
 		err = e
 		return
 	}
-	updateCols := []string{"SendData", "Result", "SendStatus", "ErrMsg"}
-	for i := range resultList {
-		var cond string
-		var pars []interface{}
-		cond = ` AND is_deleted = 0 AND report_id = ? AND email_id = ? AND source = ? AND send_status = ?`
-		pars = append(pars, resultList[i].ReportId, resultList[i].EmailId, models.EnglishReportEmailLogSourceTencent, models.EnglishReportEmailLogStatusIng)
-		l, e := models.GetEnglishReportEmailLog(cond, pars)
-		if e != nil {
+	updateLogs := make([]*models.EnglishReportEmailLog, 0)
+	for _, v := range resultList {
+		l := logMap[v.EmailId]
+		if l == nil {
 			continue
 		}
-		l.SendData = resultList[i].SendData
-		l.Result = resultList[i].ResultData
-		if resultList[i].Ok {
+		l.Result = v.ResultData
+		if v.Ok {
 			l.SendStatus = models.EnglishReportEmailLogStatusSuccess
 		} else {
 			l.SendStatus = models.EnglishReportEmailLogStatusFail
 			r := new(TencentEmailResult)
-			if e = json.Unmarshal([]byte(resultList[i].ResultData), &r); e != nil {
+			if e = json.Unmarshal([]byte(v.ResultData), &r); e != nil {
 				continue
 			}
 			l.ErrMsg = r.Message
+			hasFail = true
 		}
-		if e = l.Update(updateCols); e != nil {
-			continue
-		}
+		updateLogs = append(updateLogs, l)
+	}
+
+	// 更新日志
+	logOb := new(models.EnglishReportEmailLog)
+	if e = logOb.MultiUpdateResult(updateLogs); e != nil {
+		err = fmt.Errorf("批量更新日志信息失败, Err: " + e.Error())
+		return
 	}
 	return
 }
@@ -642,7 +662,7 @@ func CreateEnglishReportIndex() {
 
 // UpdateEnReportEditMark 更新英文研报当前更新状态
 // status 枚举值 1:编辑中,0:完成编辑, 2:只做查询
-func UpdateEnReportEditMark(reportId, nowUserId, status int, nowUserName string) (ret models.MarkReportResp, err error) {
+func UpdateEnReportEditMark(reportId, nowUserId, status int, nowUserName, lang string) (ret models.MarkReportResp, err error) {
 	//更新标记key
 	key := fmt.Sprint(`crm:enReport:edit:`, reportId)
 	opUserId, e := utils.Rc.RedisInt(key)
@@ -669,7 +689,11 @@ func UpdateEnReportEditMark(reportId, nowUserId, status int, nowUserName string)
 		}
 
 		ret.Status = 1
-		ret.Msg = fmt.Sprintf("当前%s正在编辑报告", editor)
+		if lang == utils.EnLangVersion {
+			ret.Msg = fmt.Sprintf("%s is currently editing the report", editor)
+		} else {
+			ret.Msg = fmt.Sprintf("当前%s正在编辑报告", editor)
+		}
 		ret.Editor = editor
 		return
 	}

+ 506 - 0
services/eta_forum/eta_forum_hub.go

@@ -0,0 +1,506 @@
+package eta_forum
+
+import (
+	"encoding/json"
+	"eta/eta_api/models/data_manage"
+	"eta/eta_api/models/data_manage/chart_theme"
+	"eta/eta_api/models/system"
+	"eta/eta_api/services/alarm_msg"
+	"eta/eta_api/utils"
+	"fmt"
+)
+
+type UploadChartToForumReq struct {
+	ChartInfoId int    `description:"图表ID"`
+	Description string `description:"逻辑简述"`
+}
+
+type UpdateChartToForumReq struct {
+	ChartInfoId int `description:"图表ID"`
+}
+
+type ChartSaveLibReq struct {
+	ChartInfo               *data_manage.ChartInfo
+	Description             string `description:"逻辑简述"`
+	EdbInfoList             []*data_manage.EdbInfo
+	ChartThemeList          []*chart_theme.ChartTheme
+	EdbInfoDataList         []*AddEdbDataReq
+	ChartEdbMapping         []*data_manage.ChartEdbMapping
+	EdbInfoCalculateMapping []*data_manage.EdbInfoCalculateMapping
+	CreatorInfo             *system.Admin //创建者的账号信息
+	UploaderInfo            *system.Admin //上传者的账号信息
+}
+
+type ChartSaveLibResp struct {
+	Ret         int
+	Msg         string
+	ErrMsg      string
+	ErrCode     string
+	Data        *data_manage.AddChartInfoResp
+	Success     bool `description:"true 执行成功,false 执行失败"`
+	IsSendEmail bool `json:"-" description:"true 发送邮件,false 不发送邮件"`
+	IsAddLog    bool `json:"-" description:"true 新增操作日志,false 不新增操作日志" `
+}
+
+type AddEdbDataReq struct {
+	EdbCode  string
+	EdbType  int
+	DataList []*data_manage.EdbDataBase
+}
+
+type DeleteChartReq struct {
+	ChartInfoId int `description:"图表id"`
+}
+
+// UploadChart 上传图表接口
+func UploadChart(chartInfoId int, description string, uploaderInfo *system.Admin) (err error, errMsg string) {
+	defer func() {
+		if err != nil {
+			go alarm_msg.SendAlarmMsg(fmt.Sprintf("上传图表至社区失败:Err:%v,ErrMsg:%s", err, errMsg), 3)
+		}
+	}()
+	// 查询图表信息
+	chartInfo, err := data_manage.GetChartInfoById(chartInfoId)
+	if err != nil {
+		if err.Error() == utils.ErrNoRow() {
+			errMsg = "图表不存在"
+			err = fmt.Errorf(errMsg)
+			return
+		}
+		errMsg = "获取图表信息失败"
+		err = fmt.Errorf("获取图表信息失败,Err:" + err.Error())
+		return
+	}
+	if chartInfo.ForumChartInfoId > 0 {
+		errMsg = "该图表已上传至社区,无法再次上传"
+		err = fmt.Errorf(errMsg)
+		return
+	}
+	//查询图表主题
+
+	//查询图表指标
+	//获取原图表关联的指标信息列表
+	chartMappingList, err := data_manage.GetChartMappingList(chartInfoId)
+	if err != nil {
+		errMsg = "获取图表关联的指标信息失败"
+		err = fmt.Errorf("获取图表关联的指标信息失败,Err:" + err.Error())
+		return
+	}
+	edbIds := make([]int, 0)
+	for _, v := range chartMappingList {
+		edbIds = append(edbIds, v.EdbInfoId)
+	}
+	var (
+		edbInfoList     []*data_manage.EdbInfo
+		edbMappingList  []*data_manage.EdbInfoCalculateMapping
+		edbInfoDataList []*AddEdbDataReq
+	)
+	//查询指标详情
+	edbInfoList, edbMappingList, edbInfoDataList, err = GetEdbListByEdbInfoId(edbIds)
+	if err != nil {
+		errMsg = "获取指标详情失败"
+		err = fmt.Errorf("获取指标详情失败,Err:" + err.Error())
+		return
+	}
+
+	req := new(ChartSaveLibReq)
+	req.ChartInfo = chartInfo
+	req.ChartEdbMapping = chartMappingList
+	req.EdbInfoList = edbInfoList
+	req.EdbInfoDataList = edbInfoDataList
+	req.EdbInfoCalculateMapping = edbMappingList
+	req.Description = description
+
+	// 查询创建者信息
+	creatorInfo, _ := system.GetSysAdminById(chartInfo.SysUserId)
+	if creatorInfo != nil {
+		req.CreatorInfo = creatorInfo
+	}
+
+	req.UploaderInfo = uploaderInfo
+	// 添加计算指标
+	reqJson, err := json.Marshal(req)
+	if err != nil {
+		errMsg = "参数解析异常"
+		err = fmt.Errorf("参数解析异常,Err:" + err.Error())
+		return
+	}
+	respItem, err := ChartSaveLib(string(reqJson))
+	if err != nil {
+		errMsg = "上传失败"
+		err = fmt.Errorf("上传失败,Err:" + err.Error())
+		return
+	}
+	if respItem.Ret != 200 {
+		errMsg = "上传失败"
+		err = fmt.Errorf(respItem.ErrMsg)
+		return
+	}
+
+	if respItem.Data != nil && respItem.Data.ChartInfoId != 0 {
+		// 更新社区返回的图表ID
+		err = data_manage.SetForumChartInfoId(chartInfoId, respItem.Data.ChartInfoId)
+		if err != nil {
+			errMsg = "更新图表ID失败"
+			err = fmt.Errorf("更新图表ID失败,Err:" + err.Error())
+			return
+		}
+	}
+
+	return
+}
+
+// UpdateChart 更新社区里的图表接口
+func UpdateChart(chartInfoId int) (err error, errMsg string) {
+	defer func() {
+		if err != nil {
+			go alarm_msg.SendAlarmMsg(fmt.Sprintf("同步图表信息至社区失败:Err:%v,ErrMsg:%s", err, errMsg), 3)
+		}
+	}()
+	// 查询图表信息
+	chartInfo, err := data_manage.GetChartInfoById(chartInfoId)
+	if err != nil {
+		if err.Error() == utils.ErrNoRow() {
+			errMsg = "图表不存在"
+			err = fmt.Errorf(errMsg)
+			return
+		}
+		errMsg = "获取图表信息失败"
+		err = fmt.Errorf("获取图表信息失败,Err:" + err.Error())
+		return
+	}
+
+	if chartInfo.ForumChartInfoId <= 0 {
+		errMsg = "该图表未上传至社区"
+		err = fmt.Errorf(errMsg)
+		return
+	}
+	//查询图表主题
+
+	//查询图表指标
+	//获取原图表关联的指标信息列表
+	chartMappingList, err := data_manage.GetChartMappingList(chartInfoId)
+	if err != nil {
+		errMsg = "获取图表关联的指标信息失败"
+		err = fmt.Errorf("获取图表关联的指标信息失败,Err:" + err.Error())
+		return
+	}
+	edbIds := make([]int, 0)
+	for _, v := range chartMappingList {
+		edbIds = append(edbIds, v.EdbInfoId)
+	}
+	var (
+		edbInfoList     []*data_manage.EdbInfo
+		edbMappingList  []*data_manage.EdbInfoCalculateMapping
+		edbInfoDataList []*AddEdbDataReq
+	)
+	//查询指标详情
+	edbInfoList, edbMappingList, edbInfoDataList, err = GetEdbListByEdbInfoId(edbIds)
+	if err != nil {
+		errMsg = "获取指标详情失败"
+		err = fmt.Errorf("获取指标详情失败,Err:" + err.Error())
+		return
+	}
+	req := new(ChartSaveLibReq)
+	req.ChartInfo = chartInfo
+	req.ChartInfo.ChartInfoId = chartInfo.ForumChartInfoId
+	req.ChartEdbMapping = chartMappingList
+	req.EdbInfoList = edbInfoList
+	req.EdbInfoDataList = edbInfoDataList
+	req.EdbInfoCalculateMapping = edbMappingList
+	// 查询创建者信息
+	creatorInfo, _ := system.GetSysAdminById(chartInfo.SysUserId)
+	if creatorInfo != nil {
+		req.CreatorInfo = creatorInfo
+	}
+
+	// 添加计算指标
+	reqJson, err := json.Marshal(req)
+	if err != nil {
+		errMsg = "参数解析异常"
+		err = fmt.Errorf("参数解析异常,Err:" + err.Error())
+		return
+	}
+	respItem, err := ChartUpdateLib(string(reqJson))
+	if err != nil {
+		errMsg = "更新失败"
+		err = fmt.Errorf("上传失败,Err:" + err.Error())
+		return
+	}
+	if respItem.Ret != 200 {
+		errMsg = "更新失败"
+		err = fmt.Errorf(respItem.ErrMsg)
+		return
+	}
+
+	return
+}
+
+func GetEdbListByEdbInfoId(edbInfoIds []int) (edbInfoList []*data_manage.EdbInfo, edbMappingList []*data_manage.EdbInfoCalculateMapping, edbInfoDataList []*AddEdbDataReq, err error) {
+	//查询指标信息
+	//查询指标映射
+	//查询所有指标数据
+	//查询这个指标相关的mapping信息放到数组里,
+	//将得到的指标ID信息放到数组里
+	hasFindMap := make(map[int]struct{})
+	edbInfoIdMap := make(map[int]struct{})
+	edbMappingList = make([]*data_manage.EdbInfoCalculateMapping, 0)
+	edbMappingMap := make(map[int]struct{})
+	for _, edbInfoId := range edbInfoIds {
+		edbMappingList, err = traceEdbInfoByEdbInfoId(edbInfoId, hasFindMap, edbInfoIdMap, edbMappingList, edbMappingMap)
+		if err != nil {
+			err = fmt.Errorf(" traceEdbInfoByEdbInfoId err: %s", err.Error())
+			return
+		}
+	}
+
+	// 指标信息map
+	edbInfoIdList := make([]int, 0)
+	for k, _ := range edbInfoIdMap {
+		edbInfoIdList = append(edbInfoIdList, k)
+	}
+	edbInfoList, err = data_manage.GetEdbInfoByIdList(edbInfoIdList)
+	if err != nil {
+		err = fmt.Errorf(" GetEdbInfoByIdList err: %s", err.Error())
+		return
+	}
+
+	for _, v := range edbInfoList {
+		var dataList []*data_manage.EdbDataBase
+		if v.Source == utils.DATA_SOURCE_BUSINESS {
+			dataList, err = data_manage.GetEdbDataBaseMongoByEdbInfoId(v.EdbInfoId, v.Source, v.SubSource)
+		} else {
+			dataList, err = data_manage.GetEdbDataBaseByEdbInfoId(v.EdbInfoId, v.Source, v.SubSource)
+		}
+
+		if err != nil {
+			err = fmt.Errorf("查询指标数据失败 Err: %s", err.Error())
+			return
+		}
+
+		tmp := new(AddEdbDataReq)
+		tmp.EdbCode = v.EdbCode
+		tmp.EdbType = v.EdbType
+		tmp.DataList = dataList
+		edbInfoDataList = append(edbInfoDataList, tmp)
+	}
+	return
+}
+
+// traceEdbInfoByEdbInfoId 指标追溯
+func traceEdbInfoByEdbInfoId(edbInfoId int, hasFindMap map[int]struct{}, edbInfoIdMap map[int]struct{}, edbMappingList []*data_manage.EdbInfoCalculateMapping, edbMappingMap map[int]struct{}) (newEdbMappingList []*data_manage.EdbInfoCalculateMapping, err error) {
+	newEdbMappingList = edbMappingList
+
+	_, ok := hasFindMap[edbInfoId]
+	if ok {
+		return
+	}
+
+	if _, ok1 := edbInfoIdMap[edbInfoId]; !ok1 {
+		edbInfoIdMap[edbInfoId] = struct{}{}
+	}
+
+	edbInfoMappingList, e := data_manage.GetEdbInfoCalculateMappingListByEdbInfoId(edbInfoId)
+	if e != nil {
+		err = fmt.Errorf("GetEdbInfoCalculateMappingListByEdbInfoId err: %s", e.Error())
+		return
+	}
+
+	if len(edbInfoMappingList) > 0 {
+		fromEdbInfoIdList := make([]int, 0)
+		for _, v := range edbInfoMappingList {
+			fromEdbInfoIdList = append(fromEdbInfoIdList, v.FromEdbInfoId)
+			if _, ok1 := edbInfoIdMap[v.FromEdbInfoId]; !ok1 {
+				edbInfoIdMap[v.FromEdbInfoId] = struct{}{}
+			}
+			if _, ok2 := edbMappingMap[v.EdbInfoCalculateMappingId]; !ok2 {
+				edbMappingMap[v.EdbInfoCalculateMappingId] = struct{}{}
+				tmp := &data_manage.EdbInfoCalculateMapping{
+					EdbInfoCalculateMappingId: v.EdbInfoCalculateMappingId,
+					EdbInfoId:                 v.EdbInfoId,
+					Source:                    v.Source,
+					SourceName:                v.SourceName,
+					EdbCode:                   v.EdbCode,
+					FromEdbInfoId:             v.FromEdbInfoId,
+					FromEdbCode:               v.FromEdbCode,
+					FromEdbName:               v.FromEdbName,
+					FromSource:                v.FromSource,
+					FromSourceName:            v.FromSourceName,
+					FromTag:                   v.FromTag,
+					Sort:                      v.Sort,
+					CreateTime:                v.CreateTime,
+					ModifyTime:                v.ModifyTime,
+				}
+				newEdbMappingList = append(newEdbMappingList, tmp)
+			}
+
+			if edbInfoId != v.FromEdbInfoId && (v.FromEdbType == 2 || v.FromEdbInfoType == 1) {
+				// 查过了就不查了
+				if _, ok2 := hasFindMap[v.FromEdbInfoId]; !ok2 {
+					newEdbMappingList, e = traceEdbInfoByEdbInfoId(v.FromEdbInfoId, hasFindMap, edbInfoIdMap, newEdbMappingList, edbMappingMap)
+					if e != nil {
+						err = fmt.Errorf("traceEdbInfoByEdbInfoId err: %s", e.Error())
+						return
+					}
+				}
+			}
+			hasFindMap[v.FromEdbInfoId] = struct{}{}
+		}
+	}
+
+	hasFindMap[edbInfoId] = struct{}{}
+	return
+}
+
+// DeleteChart 上传图表接口
+func DeleteChart(chartInfoId int) (err error, errMsg string) {
+	// 查询图表信息
+	chartInfo, err := data_manage.GetChartInfoById(chartInfoId)
+	if err != nil {
+		if err.Error() == utils.ErrNoRow() {
+			errMsg = "图表不存在"
+			err = fmt.Errorf(errMsg)
+			return
+		}
+		errMsg = "获取图表信息失败"
+		err = fmt.Errorf("获取图表信息失败,Err:" + err.Error())
+		return
+	}
+	if chartInfo.ForumChartInfoId <= 0 {
+		errMsg = "该图表未上传至社区,无需撤回"
+		err = fmt.Errorf(errMsg)
+		return
+	}
+
+	req := new(DeleteChartReq)
+	req.ChartInfoId = chartInfo.ForumChartInfoId
+
+	// 添加计算指标
+	reqJson, err := json.Marshal(req)
+	if err != nil {
+		errMsg = "参数解析异常"
+		err = fmt.Errorf("参数解析异常,Err:" + err.Error())
+		return
+	}
+	respItem, err := ChartDeleteLib(string(reqJson))
+	if err != nil {
+		errMsg = "撤回失败"
+		err = fmt.Errorf("撤回失败,Err:" + err.Error())
+		return
+	}
+	if respItem.Ret != 200 {
+		errMsg = "撤回失败"
+		err = fmt.Errorf(respItem.ErrMsg)
+		return
+	}
+
+	// 更新社区返回的图表ID
+	err = data_manage.SetForumChartInfoId(chartInfoId, 0)
+	if err != nil {
+		errMsg = "撤回失败"
+		err = fmt.Errorf("更新图表ID失败,Err:" + err.Error())
+		return
+	}
+
+	return
+}
+
+type AdminSaveReq struct {
+	*system.Admin
+	BusinessCode string `description:"商家编码"`
+}
+
+// 上传管理员信息
+func AdminSave(adminId int) (err error) {
+	if utils.BusinessCode == "" || (utils.BusinessCode != utils.BusinessCodeRelease && utils.BusinessCode != utils.BusinessCodeDebug && utils.BusinessCode != utils.BusinessCodeSandbox) {
+		return
+	}
+	//查询用户信息
+	adminInfo, err := system.GetSysAdminById(adminId)
+	if err != nil {
+		if err.Error() == utils.ErrNoRow() {
+			err = fmt.Errorf("用户不存在")
+			return
+		}
+		err = fmt.Errorf("获取用户信息失败,Err:" + err.Error())
+		return
+	}
+	var req AdminSaveReq
+	req.Admin = adminInfo
+	req.BusinessCode = utils.BusinessCode
+	reqJson, err := json.Marshal(req)
+	if err != nil {
+		err = fmt.Errorf("参数解析异常,Err:" + err.Error())
+		return
+	}
+	respItem, err := AdminSaveLib(string(reqJson))
+	if err != nil {
+		err = fmt.Errorf("上传管理员信息失败,Err:" + err.Error())
+		return
+	}
+	if respItem.Ret != 200 {
+		err = fmt.Errorf("上传管理员信息失败,Err:%v,errMsg:%v", respItem.Msg, respItem.ErrMsg)
+		return
+	}
+	return
+}
+
+type AdminDeleteReq struct {
+	AdminName    string
+	BusinessCode string `description:"商家编码"`
+}
+
+// 上传管理员信息
+func AdminDelete(adminName string) (err error) {
+	if utils.BusinessCode == "" || (utils.BusinessCode != utils.BusinessCodeRelease && utils.BusinessCode != utils.BusinessCodeDebug && utils.BusinessCode != utils.BusinessCodeSandbox) {
+		return
+	}
+	var req AdminDeleteReq
+	req.AdminName = adminName
+	req.BusinessCode = utils.BusinessCode
+	reqJson, err := json.Marshal(req)
+	if err != nil {
+		err = fmt.Errorf("参数解析异常,Err:" + err.Error())
+		return
+	}
+	respItem, err := AdminDeleteLib(string(reqJson))
+	if err != nil {
+		err = fmt.Errorf("删除管理员信息失败,Err:" + err.Error())
+		return
+	}
+	if respItem.Ret != 200 {
+		err = fmt.Errorf("删除管理员信息失败,Err:%v,errMsg:%v", respItem.Msg, respItem.ErrMsg)
+		return
+	}
+	return
+}
+
+type ChartThemeReq struct {
+	*chart_theme.ChartTheme
+	BusinessCode string `description:"商家编码"`
+}
+
+// 上传主题信息
+func ChartThemeSave(theme *chart_theme.ChartTheme) (err error) {
+	if utils.BusinessCode == "" || (utils.BusinessCode != utils.BusinessCodeRelease && utils.BusinessCode != utils.BusinessCodeDebug && utils.BusinessCode != utils.BusinessCodeSandbox) {
+		return
+	}
+	var req ChartThemeReq
+	req.ChartTheme = theme
+	req.BusinessCode = utils.BusinessCode
+	reqJson, err := json.Marshal(req)
+	if err != nil {
+		err = fmt.Errorf("参数解析异常,Err:" + err.Error())
+		return
+	}
+	respItem, err := ChartThemeSaveLib(string(reqJson))
+	if err != nil {
+		err = fmt.Errorf("上传图表主题信息失败,Err:" + err.Error())
+		return
+	}
+	if respItem.Ret != 200 {
+		err = fmt.Errorf("上传图表主题信息失败,Err:%v,errMsg:%v", respItem.Msg, respItem.ErrMsg)
+		return
+	}
+	return
+}

+ 114 - 0
services/eta_forum/eta_forum_hub_lib.go

@@ -0,0 +1,114 @@
+package eta_forum
+
+import (
+	"encoding/json"
+	"eta/eta_api/models"
+	"eta/eta_api/utils"
+	"fmt"
+	"io/ioutil"
+	"net/http"
+	"strings"
+)
+
+// ChartSaveLib 上传图表信息
+func ChartSaveLib(req string) (resp *ChartSaveLibResp, err error) {
+	_, resultByte, err := post(req, "/v1/chart/save")
+	err = json.Unmarshal(resultByte, &resp)
+	if err != nil {
+		return
+	}
+	return
+}
+
+// ChartUpdateLib 更新图表信息
+func ChartUpdateLib(req string) (resp *ChartSaveLibResp, err error) {
+	_, resultByte, err := post(req, "/v1/chart/update")
+	err = json.Unmarshal(resultByte, &resp)
+	if err != nil {
+		return
+	}
+	return
+}
+
+// ChartDeleteLib 从社区撤回图表
+func ChartDeleteLib(req string) (resp *models.BaseResponse, err error) {
+	_, resultByte, err := post(req, "/v1/chart/delete")
+	err = json.Unmarshal(resultByte, &resp)
+	if err != nil {
+		return
+	}
+	return
+}
+
+// AdminSaveLib 上传管理员信息
+func AdminSaveLib(req string) (resp *models.BaseResponse, err error) {
+	_, resultByte, err := post(req, "/v1/admin/save")
+	err = json.Unmarshal(resultByte, &resp)
+	if err != nil {
+		return
+	}
+	return
+}
+
+// AdminDeleteLib 删除管理员信息
+func AdminDeleteLib(req string) (resp *models.BaseResponse, err error) {
+	_, resultByte, err := post(req, "/v1/admin/delete")
+	err = json.Unmarshal(resultByte, &resp)
+	if err != nil {
+		return
+	}
+	return
+}
+
+// ChartThemeSaveLib 上传图表主题信息
+func ChartThemeSaveLib(req string) (resp *models.BaseResponse, err error) {
+	_, resultByte, err := post(req, "/v1/chart/theme/save")
+	err = json.Unmarshal(resultByte, &resp)
+	if err != nil {
+		return
+	}
+	return
+}
+
+// post
+func post(paramStr string, urlStr string) (resp *models.BaseResponse, result []byte, err error) {
+	if utils.ETA_FORUM_HUB_URL == "" {
+		err = fmt.Errorf("ETA社区桥接服务地址为空")
+		return
+	}
+	postUrl := utils.ETA_FORUM_HUB_URL + urlStr
+	result, err = HttpPost(postUrl, paramStr, "application/json")
+	if err != nil {
+		err = fmt.Errorf("调用ETA社区桥接服务接口失败 error:%s", err.Error())
+		return
+	}
+	err = json.Unmarshal(result, &resp)
+	if err != nil {
+		return
+	}
+
+	return
+}
+
+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.ETA_FORUM_HUB_NAME_EN+utils.ETA_FORUM_HUB_MD5_KEY))
+	resp, err := client.Do(req)
+	if err != nil {
+		return nil, err
+	}
+	defer resp.Body.Close()
+	b, err := ioutil.ReadAll(resp.Body)
+	utils.FileLog.Debug("HttpPost:" + string(b))
+	return b, err
+}

+ 29 - 12
services/ppt/ppt_group.go

@@ -1178,21 +1178,38 @@ func InitPptGroup() (err error) {
 // GetGroupsByAdminIdV2 查询ppt目录列表
 // @Author roc
 // @Time 2022-08-29 15:22:20
-func GetGroupsByAdminIdV2(IsNewPpt, adminId int) (ret models.RespGroupList, err error) {
+func GetGroupsByAdminIdV2(IsNewPpt, adminId int, lang string) (ret models.RespGroupList, err error) {
 	myPptList := make([]*models.RespGroupPptNameListItem, 0)
 	otherPptList := make([]*models.RespGroupPptNameListItem, 0)
-	grantList := []models.RespGroupListItem{
-		{
-			GroupId:   1,
-			GroupName: "我共享的",
-			PptList:   myPptList,
-		},
-		{
-			GroupId:   2,
-			GroupName: "收到共享",
-			PptList:   otherPptList,
-		},
+	grantList := []models.RespGroupListItem{}
+	if lang == utils.EnLangVersion {
+		grantList = append(grantList, []models.RespGroupListItem{
+			{
+				GroupId:   1,
+				GroupName: "My shared",
+				PptList:   myPptList,
+			},
+			{
+				GroupId:   2,
+				GroupName: "Received shared",
+				PptList:   otherPptList,
+			},
+		}...)
+	} else {
+		grantList = append(grantList, []models.RespGroupListItem{
+			{
+				GroupId:   1,
+				GroupName: "我共享的",
+				PptList:   myPptList,
+			},
+			{
+				GroupId:   2,
+				GroupName: "收到共享",
+				PptList:   otherPptList,
+			},
+		}...)
 	}
+
 	ret.PublicList = make([]*models.RespGroupListItem, 0)
 	ret.PrivateList = make([]*models.RespGroupListItem, 0)
 	ret.GrantList = grantList

+ 6 - 2
services/report.go

@@ -1197,7 +1197,7 @@ func GetReportContentSubWithoutIframe(content string) (contentSub string, err er
 
 // UpdateReportEditMark 更新研报当前更新状态
 // status 枚举值 1:编辑中,0:完成编辑, 2:只做查询
-func UpdateReportEditMark(reportId, nowUserId, status int, nowUserName string) (ret models.MarkReportResp, err error) {
+func UpdateReportEditMark(reportId, nowUserId, status int, nowUserName, lang string) (ret models.MarkReportResp, err error) {
 	//更新标记key
 	key := fmt.Sprint(`crm:report:edit:`, reportId)
 	ret.Status = 0
@@ -1244,7 +1244,11 @@ func UpdateReportEditMark(reportId, nowUserId, status int, nowUserName string) (
 		}
 
 		ret.Status = 1
-		ret.Msg = fmt.Sprintf("当前%s正在编辑报告", editor)
+		if lang == utils.EnLangVersion {
+			ret.Msg = fmt.Sprintf("%s is currently editing the report", editor)
+		} else {
+			ret.Msg = fmt.Sprintf("当前%s正在编辑报告", editor)
+		}
 		ret.Editor = editor
 		return
 	}

+ 16 - 6
services/smart_report.go

@@ -47,7 +47,7 @@ func SmartReportBuildVideoAndUpdate(item *smart_report.SmartReport) {
 
 // UpdateSmartReportEditing 更新研报当前更新状态
 // status 枚举值 1:编辑中,0:完成编辑, 2:只做查询
-func UpdateSmartReportEditing(reportId, status, thisUserId int, thisUserName string, adminIdName map[int]string) (ret models.MarkReportResp, err error) {
+func UpdateSmartReportEditing(reportId, status, thisUserId int, thisUserName string, adminIdName map[int]string, lang string) (ret models.MarkReportResp, err error) {
 	key := fmt.Sprint(utils.CACHE_SMART_REPORT_EDITING, reportId)
 	ret.Status = 0
 	ret.Msg = "无人编辑"
@@ -71,7 +71,11 @@ func UpdateSmartReportEditing(reportId, status, thisUserId int, thisUserName str
 			editor = adminIdName[opUserId]
 		}
 		ret.Status = 1
-		ret.Msg = fmt.Sprintf("当前%s正在编辑报告", editor)
+		if lang == utils.EnLangVersion {
+			ret.Msg = fmt.Sprintf("%s is currently editing the report", editor)
+		} else {
+			ret.Msg = fmt.Sprintf("当前%s正在编辑报告", editor)
+		}
 		ret.Editor = editor
 		return
 	}
@@ -181,10 +185,13 @@ finally:
 	pyCode = fmt.Sprintf(pyCode, utils.ChromePath, reportUrl, filePath)
 	utils.FileLog.Info("pdf pyCode: \n" + pyCode)
 	cmd := exec.Command("python3", "-c", pyCode)
-	_, err = cmd.CombinedOutput()
-	if err != nil {
+	output, e := cmd.CombinedOutput()
+	if e != nil {
+		err = e
 		utils.FileLog.Info("ReportToPdf failed: , error: \n" + err.Error())
+		utils.FileLog.Info("Output: %s\n", string(output))
 		go alarm_msg.SendAlarmMsg("ReportToPdf failed:"+err.Error(), 3)
+		go alarm_msg.SendAlarmMsg("Output :"+string(output), 3)
 	}
 	defer func() {
 		cmd.Process.Kill()
@@ -253,10 +260,13 @@ finally:
 	utils.FileLog.Info("jpeg pyCode: \n" + pyCode)
 	cmd := exec.Command("python3", "-c", pyCode)
 
-	_, err = cmd.CombinedOutput()
-	if err != nil {
+	output, e := cmd.CombinedOutput()
+	if e != nil {
+		err = e
 		utils.FileLog.Info("ReportToJpeg failed: , error: \n" + err.Error())
+		utils.FileLog.Info("Output: %s\n", string(output))
 		go alarm_msg.SendAlarmMsg("ReportToJpeg failed:"+err.Error(), 3)
+		go alarm_msg.SendAlarmMsg("Output :"+string(output), 3)
 	}
 	defer func() {
 		cmd.Process.Kill()

BIN
static/Data Import Template.xlsx


+ 54 - 0
static/ErrMsgConfig.json

@@ -0,0 +1,54 @@
+{
+  "目录名称已存在,不可重复添加": "Directory name already exists, cannot be added repeatedly",
+  "与原名字一致,无需修改": "Identical to the original name, no need to modify",
+  "分类名称已存在,请重新输入": "Category name already exists, please re-enter",
+  "获取失败": "Retrieval Failed",
+  "删除成功": "Delete Successful",
+  "请添加日期": "Please Add Date",
+  "移动成功": "Move Successful",
+  "刷新成功": "Refresh Successful",
+  "保存成功": "Save Successful",
+  "重新计算成功": "Recalculation Successful",
+  "请选择正确的时间段": "Select the correct time period",
+  "该指标已加入ETA指标库,不可删除": "This metric has been added to the ETA database and cannot be deleted",
+  "最多只能选择30个指标": "A maximum of 30 metrics can be selected",
+  "当前指标已被引用,不可删除": "Current metric is referenced and cannot be deleted",
+  "交易日期不能为空": "Trading day cannot be empty",
+  "框架名称已存在": "Framework name already exists",
+  "已关联指标,不可删除!": "Metric is linked and cannot be deleted!",
+  "表格名称已存在,请重新填写表格名称": "Table name exists, please enter a new name",
+  "公式错误,请重新填写": "Formula Error, Please Re-enter",
+  "文档名称已存在": "Document name already exists",
+  "该文档分类已存在": "The document category already exists",
+  "标题已存在": "Title already exists",
+  "操作成功": "Operation successful",
+  "上级分类不能选择自己": "Cannot select itself as parent category",
+  "一级分类不允许更改为二级分类或三级分类": "Primary categories cannot be changed to secondary or tertiary categories",
+  "该名称已存在": "Category name exists",
+  "请先删除该分类下关联分类": "Please delete associated subcategories first",
+  "该分类有关联报告,不允许删除": "This category has associated reports and cannot be deleted",
+  "品种名称已存在": "Product type exist",
+  "该文件夹已存在": "The folder exists",
+  "修改成功": "Modification Successful",
+  "添加失败,标签名称不能重复": "Addition Failed, Tag Name Must Be Unique",
+  "请输入终端名称": "Please Enter Terminal Name",
+  "当前有未走完流程的报告,请走完流程后再做变更": "There are reports with incomplete processes,please complete the process before making changes.",
+  "当前有未走完流程的报告, 请走完流程后再做删除!": "There are reports with incomplete processes,please complete the process before deleting!",
+  "请选择PPT": "Please Select PPT",
+  "请输入章节名称": "Please enter the chapter name",
+  "请输入品种名称": "Please enter the variety name",
+  "计算成功": "Calculation successful",
+  "已关联图表的品种,不允许删除!": "Varieties with associated charts cannot be deleted!",
+  "刷新失败": "Refresh failed",
+  "请传入日期序列": "Please enter a date sequence",
+  "指标未选择": "Indicator not selected",
+  "ETA表格名称已存在,请重新填写": "The name of the ETA form already exists, please fill in a new one",
+  "添加成功": "Added successfully",
+  "添加失败,品种名称不能重复": "Addition failed, the variety name must not be duplicated",
+  "分析周期不允许设置为负数或0": "The analysis period cannot be set to a negative number or zero",
+  "相关性计算窗口必须大于0": "The correlation calculation window must be greater than 0",
+  "系统处理中,请稍后重试!": "The system is processing, please try again later!",
+  "固定日期不可为空": "The fixed date cannot be empty",
+  "日期数量已达上限!": "The number of dates has reached the limit!",
+  "该品种已在指标库生成指标,不可删除": "This variety has already generated indicators in the index library and cannot be deleted"
+}

+ 50 - 2
utils/config.go

@@ -1,9 +1,12 @@
 package utils
 
 import (
+	"errors"
 	"fmt"
 	beeLogger "github.com/beego/bee/v2/logger"
 	"github.com/beego/beego/v2/server/web"
+	"github.com/qiniu/qmgo"
+	"github.com/spf13/viper"
 	"strconv"
 )
 
@@ -17,11 +20,14 @@ var (
 	MYSQL_LOG_URL    string
 	MYSQL_WEEKLY_URL string //用户主库
 	MYSQL_AI_URL     string //ETA-AI 数据库
+	MgoUrlData       string // mongodb数据库连接配置
 
 	REDIS_CACHE string //缓存地址
 	//Rc          *cache.Cache //redis缓存
-	Re error       //redis错误
-	Rc RedisClient //redis缓存
+	Re            error        //redis错误
+	Rc            RedisClient  //redis缓存
+	MgoDataCli    *qmgo.Client // mongodb客户端连接
+	MgoDataDbName string       // mongodb指标数据的库名
 )
 
 // 基础配置
@@ -177,6 +183,13 @@ var (
 	CrmEtaServerDes3Key string
 )
 
+// eta_forum_hub ETA社区桥接服务地址
+var (
+	ETA_FORUM_HUB_URL     string
+	ETA_FORUM_HUB_NAME_EN string
+	ETA_FORUM_HUB_MD5_KEY string
+)
+
 // BusinessCode 商家编码
 var BusinessCode string
 
@@ -241,6 +254,14 @@ var (
 	ChromePath string // chrome浏览器地址
 )
 
+var (
+	ErrMsgConfigFile string
+)
+
+var (
+	ViperConfig *viper.Viper
+)
+
 func init() {
 	tmpRunMode, err := web.AppConfig.String("run_mode")
 	if err != nil {
@@ -285,6 +306,9 @@ func init() {
 	//ETA-AI
 	MYSQL_AI_URL = config["mysql_url_ai"]
 
+	// mongodb数据库连接配置
+	MgoUrlData = config["mgo_url_data"]
+
 	REDIS_CACHE = config["beego_cache"]
 	if len(REDIS_CACHE) <= 0 {
 		panic(any("redis链接参数没有配置"))
@@ -502,6 +526,12 @@ func init() {
 	CrmEtaServerDes3Key = config["crm_eta_server_des3_key"]
 	LibreOfficePath = config["libre_office_path"]
 
+	// eta_forum_hub ETA社区桥接服务地址
+	{
+		ETA_FORUM_HUB_URL = config["eta_forum_hub_url"]
+		ETA_FORUM_HUB_NAME_EN = config["eta_forum_hub_name_en"]
+		ETA_FORUM_HUB_MD5_KEY = config["eta_forum_hub_md5_key"]
+	}
 	// 商家编码
 	BusinessCode = config["business_code"]
 
@@ -549,4 +579,22 @@ func init() {
 
 	// 初始化ES
 	initEs()
+
+	ErrMsgConfigFile = config["err_msg_config_file"]
+
+	if ErrMsgConfigFile != "" {
+		viper.SetConfigFile(ErrMsgConfigFile)
+		err = viper.ReadInConfig()
+		if err != nil {
+			if _, ok := err.(viper.ConfigFileNotFoundError); ok {
+				fmt.Println(errors.New("config file not found"))
+				panic(any("config file not found"))
+			} else {
+				fmt.Println(errors.New("config file was found but another error was produced err:" + err.Error()))
+				panic(any("config file was found but another error was produced err:" + err.Error()))
+			}
+			return
+		}
+		ViperConfig = viper.GetViper()
+	}
 }

+ 1 - 0
utils/constants.go

@@ -171,6 +171,7 @@ const (
 	DATA_SOURCE_GFEX                                 = 78       // 广州期货交易所->78
 	DATA_SOURCE_ICPI                                 = 79       // ICPI消费价格指数->79
 	DATA_SOURCE_BLOOMBERG                            = 83       // bloomberg彭博数据
+	DATA_SOURCE_BUSINESS                             = 84       // 来源于自有数据
 )
 
 // 数据刷新频率

+ 37 - 0
utils/logs.go

@@ -18,6 +18,7 @@ var FileLog *logs.BeeLogger
 var ApiLog *logs.BeeLogger
 var FileLogData *logs.BeeLogger
 var Binlog *logs.BeeLogger
+var MongoLog *logs.BeeLogger
 
 func init() {
 	if LogMaxDays == 0 {
@@ -46,6 +47,7 @@ func init() {
 	initBinlog()
 	initApiLog()
 	initFileLogData()
+	initMgoLog()
 }
 
 type logConfig struct {
@@ -128,6 +130,41 @@ func initFileLogData() {
 	FileLogData.EnableFuncCallDepth(true)
 }
 
+// initMgoLog
+// @Description: mongo日志
+// @author: Roc
+// @datetime 2024-05-06 16:42:47
+func initMgoLog() {
+	//mgo日志
+
+	var logPath string
+	{
+		binlogPath := BinLogPath
+		if binlogPath == "" {
+			binlogPath = DefaultBinlogPath
+		}
+		logPath = path.Dir(binlogPath)
+	}
+	if logPath == `` {
+		logPath = "./etalogs"
+	}
+
+	mongoLogPath := logPath + "/mongolog"
+	mongoLogFile := "mongolog.log"
+
+	os.MkdirAll(mongoLogPath, os.ModePerm)
+	logFileName := path.Join(mongoLogPath, mongoLogFile)
+	MongoLog = logs.NewLogger(1000000)
+	logConf := getDefaultLogConfig()
+
+	logConf.FileName = logFileName
+	//logConf.MaxLines = 10000000
+	//logConf.Rotate = true
+	b, _ := json.Marshal(logConf)
+	MongoLog.SetLogger(logs.AdapterFile, string(b))
+	MongoLog.EnableFuncCallDepth(true)
+}
+
 func getDefaultLogConfig() logConfig {
 	return logConfig{
 		FileName: "",

+ 137 - 0
utils/mgodb/mgo_config.go

@@ -0,0 +1,137 @@
+package mgodb
+
+import (
+	"context"
+	"eta/eta_api/utils"
+	"github.com/qiniu/qmgo"
+	"github.com/qiniu/qmgo/options"
+	"go.mongodb.org/mongo-driver/bson"
+	"go.mongodb.org/mongo-driver/event"
+	mgoptions "go.mongodb.org/mongo-driver/mongo/options"
+	"sync"
+)
+
+var (
+	ConnectTimeoutMS = int64(3000)
+	SocketTimeoutMS  = int64(500000)
+	MaxPoolSize      = uint64(50)
+	MinPoolSize      = uint64(0)
+)
+
+//func init() {
+//	fmt.Println("start MgoNewClient")
+//	MgoNewClient()
+//	fmt.Println("end MgoNewClient")
+//}
+
+type MgoConfig struct {
+	Host          string `json:"host"`
+	Url           string `json:"url"`
+	Port          string `json:"port"`
+	Username      string `json:"username"`
+	Password      string `json:"password"`
+	AuthSource    string `json:"authSource"`
+	AuthMechanism string `json:"auth_mechanism"`
+	Database      string `json:"database"`
+}
+
+// MgoNewClient
+// @Description: 创建一个mongodb客户端链接
+// @author: Roc
+// @datetime 2024-04-25 14:01:14
+// @return *qmgo.Client
+func MgoNewClient(mgoConfig MgoConfig) *qmgo.Client {
+	// 创建cmdMonitor,用于打印SQL
+	//startedCommands := make(map[int64]bson.Raw)
+	startedCommands := sync.Map{} // map[int64]bson.Raw
+
+	cmdMonitor := &event.CommandMonitor{
+		Started: func(_ context.Context, evt *event.CommandStartedEvent) {
+			startedCommands.Store(evt.RequestID, evt.Command)
+			//startedCommands[evt.RequestID] = evt.Command
+		},
+		Succeeded: func(_ context.Context, evt *event.CommandSucceededEvent) {
+			//log.Printf("Command: %v Reply: %v\n",
+			//	startedCommands[evt.RequestID],
+			//	evt.Reply,
+			//)
+			var commands bson.Raw
+			v, ok := startedCommands.Load(evt.RequestID)
+			if ok {
+				commands = v.(bson.Raw)
+			}
+			//utils.MongoLog.Info("\n【MongoDB】[%.3fms] [%v] %v \n", float64(evt.Duration)/1e6, commands, evt.Reply)
+			utils.MongoLog.Info("\n【MongoDB】[%.3fms] [%v] \n", float64(evt.Duration)/1e6, commands)
+		},
+		Failed: func(_ context.Context, evt *event.CommandFailedEvent) {
+			//log.Printf("Command: %v Failure: %v\n",
+			//	startedCommands[evt.RequestID],
+			//	evt.Failure,
+			//)
+			var commands bson.Raw
+			v, ok := startedCommands.Load(evt.RequestID)
+			if ok {
+				commands = v.(bson.Raw)
+			}
+			utils.MongoLog.Info("\n【MongoDB】[%.3fms] [%v] \n %v \n", float64(evt.Duration)/1e6, commands, evt.Failure)
+		},
+	}
+
+	// 创建options
+	ops := options.ClientOptions{ClientOptions: &mgoptions.ClientOptions{}}
+	ops.SetMonitor(cmdMonitor)
+
+	ctx := context.Background()
+
+	//mongodb+srv://myDatabaseUser:D1fficultP%40ssw0rd@mongodb0.example.com/?authSource=admin&replicaSet=myRepl
+
+	//var mongoUrl string
+	//if mgoConfig.Password != "" {
+	//	mongoUrl = "mongodb://" + mgoConfig.Username + ":" + mgoConfig.Password + "@" +
+	//		mgoConfig.Host + ":" + mgoConfig.Port
+	//
+	//	if mgoConfig.AuthSource != `` {
+	//		mongoUrl += mongoUrl + "?&authSource=" + mgoConfig.AuthSource
+	//	}
+	//} else {
+	//	mongoUrl = "mongodb://" + mgoConfig.Host + ":" + mgoConfig.Port
+	//}
+
+	// 创建一个数据库链接
+	client, err := qmgo.NewClient(ctx, &qmgo.Config{
+		Uri: mgoConfig.Url,
+		Auth: &qmgo.Credential{
+			AuthMechanism: mgoConfig.AuthMechanism,
+			AuthSource:    mgoConfig.AuthSource,
+			Username:      mgoConfig.Username,
+			Password:      mgoConfig.Password,
+			//PasswordSet:   false,
+		},
+		Database:         mgoConfig.Database,
+		ConnectTimeoutMS: &ConnectTimeoutMS,
+		SocketTimeoutMS:  &SocketTimeoutMS,
+		MaxPoolSize:      &MaxPoolSize,
+		MinPoolSize:      &MinPoolSize,
+	}, ops)
+
+	if err != nil {
+		panic("MongoDB连接异常:" + err.Error())
+	}
+
+	return client
+}
+
+func MgoGetColl(collName string) (cli *qmgo.QmgoClient, err error) {
+	ctx := context.Background()
+	config := &qmgo.Config{
+		//Uri:              MGO_URL,
+		//Database:         MGO_DB,
+		Coll:             collName,
+		ConnectTimeoutMS: &ConnectTimeoutMS,
+		SocketTimeoutMS:  &SocketTimeoutMS,
+		MaxPoolSize:      &MaxPoolSize,
+		MinPoolSize:      &MinPoolSize,
+	}
+	cli, err = qmgo.Open(ctx, config)
+	return
+}