Parcourir la source

定时更新图表信息

xyxie il y a 11 mois
Parent
commit
bafde29e24

+ 0 - 59
controllers/auth.go

@@ -1,59 +0,0 @@
-package controllers
-
-import (
-	"encoding/base64"
-	"encoding/json"
-	"eta/eta_forum_task/models"
-	"eta/eta_forum_task/utils"
-	"fmt"
-	"github.com/beego/beego/v2/server/web"
-)
-
-type AuthController struct {
-	web.Controller
-}
-
-// CreateAuthCode
-// @Title 生成编码
-// @Description 生成编码
-// @Param	request	body models.CreateAuthCodeReq true "type json string"
-// @Success 200 {object} data_manage.AddChartInfoResp
-// @router /auth_code [post]
-func (this *AuthController) CreateAuthCode() {
-	br := new(models.BaseResponse).Init()
-	defer func() {
-		this.Data["json"] = br
-		this.ServeJSON()
-	}()
-
-	var req models.CreateAuthCodeReq
-	err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
-	if err != nil {
-		br.Msg = "参数解析异常!"
-		br.ErrMsg = "参数解析失败,Err:" + err.Error()
-		return
-	}
-	prefix := map[int]string{
-		1: utils.CACHE_FORUM_AUTH_CODE_PREFIX,
-		2: utils.CACHE_CRM_AUTH_CODE_PREFIX,
-	}
-	str := base64.URLEncoding.EncodeToString([]byte(req.AdminName))
-	key := fmt.Sprint(prefix[req.Source], str)
-	// 是否已生成但未消费
-	exist, _ := utils.Rc.RedisString(key)
-	if exist != "" {
-		br.Ret = 200
-		br.Success = true
-		br.Msg = "保存成功"
-		br.Data = str
-		return
-	}
-	if !utils.Rc.SetNX(key, req.AdminName, utils.GetTodayLastSecond()) {
-		br.Msg = "授权码生成失败"
-		return
-	}
-	br.Ret = 200
-	br.Success = true
-	br.Msg = "保存成功"
-	br.Data = str
-}

+ 0 - 91
controllers/base_common.go

@@ -1,91 +0,0 @@
-package controllers
-
-import (
-	"encoding/json"
-	"eta/eta_forum_task/services/alarm_msg"
-	"net/http"
-	"net/url"
-
-	"github.com/beego/beego/v2/server/web"
-
-	"eta/eta_forum_task/models"
-	"eta/eta_forum_task/utils"
-)
-
-type BaseCommonController struct {
-	web.Controller
-}
-
-func (c *BaseCommonController) ServeJSON(encoding ...bool) {
-	// 方法处理完后,需要后置处理的业务逻辑
-	//if handlerList, ok := AfterHandlerUrlMap[c.Ctx.Request.URL.Path]; ok {
-	//	for _, handler := range handlerList {
-	//		handler(c.Ctx.Input.RequestBody)
-	//	}
-	//}
-
-	var (
-		hasIndent   = false
-		hasEncoding = false
-	)
-	if web.BConfig.RunMode == web.PROD {
-		hasIndent = false
-	}
-	if len(encoding) > 0 && encoding[0] == true {
-		hasEncoding = true
-	}
-	if c.Data["json"] == nil {
-		go alarm_msg.SendAlarmMsg("接口:URI:"+c.Ctx.Input.URI()+";无返回值", 3)
-		return
-	}
-
-	baseRes := c.Data["json"].(*models.BaseResponse)
-	if baseRes != nil && baseRes.Ret != 408 {
-		body, _ := json.Marshal(baseRes)
-		var requestBody string
-		method := c.Ctx.Input.Method()
-		if method == "GET" {
-			requestBody = c.Ctx.Request.RequestURI
-		} else {
-			requestBody, _ = url.QueryUnescape(string(c.Ctx.Input.RequestBody))
-		}
-		if baseRes.Ret != 200 && baseRes.IsSendEmail {
-			//go utils.SendEmail(utils.APP_NAME_CN+"【"+utils.RunMode+"】"+"失败提醒", "URI:"+c.Ctx.Input.URI()+"<br/> "+"Params"+requestBody+" <br/>"+"ErrMsg:"+baseRes.ErrMsg+";<br/>Msg:"+baseRes.Msg+";<br/> Body:"+string(body)+"<br/>", utils.EmailSendToUsers)
-			go alarm_msg.SendAlarmMsg("失败提醒:URI:"+c.Ctx.Input.URI()+";请求入参:Params"+requestBody+" ErrMsg:"+baseRes.ErrMsg+";Msg"+baseRes.Msg+"; Body:"+string(body), 3)
-		}
-	}
-	c.JSON(c.Data["json"], hasIndent, hasEncoding)
-}
-
-func (c *BaseCommonController) JSON(data interface{}, hasIndent bool, coding bool) error {
-	c.Ctx.Output.Header("Content-Type", "application/json; charset=utf-8")
-	var content []byte
-	var err error
-	if hasIndent {
-		content, err = json.MarshalIndent(data, "", "  ")
-	} else {
-		content, err = json.Marshal(data)
-	}
-	if err != nil {
-		http.Error(c.Ctx.Output.Context.ResponseWriter, err.Error(), http.StatusInternalServerError)
-		return err
-	}
-	ip := c.Ctx.Input.IP()
-	requestBody, err := url.QueryUnescape(string(c.Ctx.Input.RequestBody))
-	if err != nil {
-		requestBody = string(c.Ctx.Input.RequestBody)
-	}
-	if requestBody == "" {
-		requestBody = c.Ctx.Input.URI()
-	}
-	authorization := c.Ctx.Input.Header("authorization")
-	if authorization == "" {
-		authorization = c.Ctx.Input.Header("Authorization")
-	}
-
-	utils.ApiLog.Info("uri:%s, authorization:%s, requestBody:%s, responseBody:%s, ip:%s", c.Ctx.Input.URI(), authorization, requestBody, content, ip)
-	if coding {
-		content = []byte(utils.StringsToJSON(string(content)))
-	}
-	return c.Ctx.Output.Body(content)
-}

+ 0 - 211
controllers/chart_info.go

@@ -1,211 +0,0 @@
-package controllers
-
-import (
-	"encoding/json"
-	"eta/eta_forum_task/models"
-	"eta/eta_forum_task/services"
-	"strings"
-)
-
-type ChartInfoController struct {
-	BaseCommonController
-}
-
-// Update
-// @Title 图表-更新
-// @Description 图表-更新
-// @Param	request	body data_manage.AddChartReq true "type json string"
-// @Success 200 {object} data_manage.AddChartInfoResp
-// @router /update [post]
-func (this *ChartInfoController) Update() {
-	br := new(models.BaseResponse).Init()
-	defer func() {
-		this.Data["json"] = br
-		this.ServeJSON()
-	}()
-
-	/*deleteCache := true
-	cacheKey := "CACHE_CHART_INFO_ADD_" + 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(this.Ctx.Input.RequestBody)
-		return
-	}*/
-	var req models.AddChartReq
-	err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
-	if err != nil {
-		br.Msg = "参数解析异常!"
-		br.ErrMsg = "参数解析失败,Err:" + err.Error()
-		return
-	}
-
-	if req.ChartInfo == nil {
-		br.Msg = "请选择图表"
-		return
-	}
-	if req.ChartInfo.ChartInfoId <= 0 {
-		br.Msg = "请选择图表"
-		return
-	}
-	//校验图表名称是否重复
-	req.ChartInfo.ChartName = strings.Trim(req.ChartInfo.ChartName, " ")
-	if req.ChartInfo.ChartName == "" {
-		br.Msg = "请填写图表名称!"
-		return
-	}
-
-	if len(req.EdbInfoList) <= 0 {
-		br.Msg = "指标信息不能为空"
-		return
-	}
-	for _, edbInfo := range req.EdbInfoList {
-		if edbInfo.EdbName == "" {
-			br.Msg = "指标名称不能为空"
-			return
-		}
-	}
-
-	if len(req.ChartEdbMapping) <= 0 {
-		br.Msg = "图表指标映射不能为空"
-		return
-	}
-
-	chartInfo, err, errMsg, _ := services.UpdateChartInfoAndEdbInfo(&req, 0, "")
-	if err != nil {
-		br.Msg = errMsg
-		br.ErrMsg = err.Error()
-		return
-	}
-
-	br.Ret = 200
-	br.Success = true
-	br.Msg = "保存成功"
-	br.Data = models.AddChartInfoResp{
-		ChartInfoId: chartInfo.ChartInfoId,
-		UniqueCode:  chartInfo.UniqueCode,
-		ChartType:   chartInfo.ChartType,
-	}
-	return
-}
-
-// Save
-// @Title 图表-保存
-// @Description 图表-保存
-// @Param	request	body data_manage.AddChartReq true "type json string"
-// @Success 200 {object} data_manage.AddChartInfoResp
-// @router /save [post]
-func (this *ChartInfoController) Save() {
-	br := new(models.BaseResponse).Init()
-	defer func() {
-		this.Data["json"] = br
-		this.ServeJSON()
-	}()
-
-	/*deleteCache := true
-	cacheKey := "CACHE_CHART_INFO_ADD_" + 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(this.Ctx.Input.RequestBody)
-		return
-	}*/
-	var req models.AddChartReq
-	err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
-	if err != nil {
-		br.Msg = "参数解析异常!"
-		br.ErrMsg = "参数解析失败,Err:" + err.Error()
-		return
-	}
-
-	if req.ChartInfo == nil {
-		br.Msg = "请选择图表"
-		return
-	}
-	//校验图表名称是否重复
-	req.ChartInfo.ChartName = strings.Trim(req.ChartInfo.ChartName, " ")
-	if req.ChartInfo.ChartName == "" {
-		br.Msg = "请填写图表名称!"
-		return
-	}
-
-	if len(req.EdbInfoList) <= 0 {
-		br.Msg = "指标信息不能为空"
-		return
-	}
-	for _, edbInfo := range req.EdbInfoList {
-		if edbInfo.EdbName == "" {
-			br.Msg = "指标名称不能为空"
-			return
-		}
-	}
-
-	if len(req.ChartEdbMapping) <= 0 {
-		br.Msg = "图表指标映射不能为空"
-		return
-	}
-
-	chartInfo, err, errMsg, _ := services.AddChartInfo(&req, 0, "")
-	if err != nil {
-		br.Msg = errMsg
-		br.ErrMsg = err.Error()
-		return
-	}
-
-	br.Ret = 200
-	br.Success = true
-	br.Msg = "保存成功"
-	br.Data = models.AddChartInfoResp{
-		ChartInfoId: chartInfo.ChartInfoId,
-		UniqueCode:  chartInfo.UniqueCode,
-		ChartType:   chartInfo.ChartType,
-	}
-	return
-}
-
-// Delete
-// @Title 图表-删除
-// @Description 图表-删除
-// @Param	request	body data_manage.DeleteChartReq true "type json string"
-// @Success 200 {object}
-// @router /delete [post]
-func (this *ChartInfoController) Delete() {
-	br := new(models.BaseResponse).Init()
-	defer func() {
-		this.Data["json"] = br
-		this.ServeJSON()
-	}()
-
-	var req models.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 := services.DeleteChart(req.ChartInfoId)
-	if err != nil {
-		br.Msg = errMsg
-		br.ErrMsg = err.Error()
-		return
-	}
-
-	br.Ret = 200
-	br.Success = true
-	br.Msg = "删除成功"
-}

+ 0 - 9
go.mod

@@ -11,7 +11,6 @@ require (
 	github.com/gonum/stat v0.0.0-20181125101827-41a0da705a5b
 	github.com/olivere/elastic/v7 v7.0.32
 	github.com/shopspring/decimal v1.3.1
-	go.mongodb.org/mongo-driver v1.15.0
 	gopkg.in/gomail.v2 v2.0.0-20160411212932-81ebce5c23df
 )
 
@@ -20,7 +19,6 @@ require (
 	github.com/cespare/xxhash/v2 v2.2.0 // indirect
 	github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f // 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
@@ -29,13 +27,11 @@ require (
 	github.com/gonum/matrix v0.0.0-20181209220409-c518dec07be9 // indirect
 	github.com/hashicorp/golang-lru v0.5.4 // indirect
 	github.com/josharian/intern v1.0.0 // indirect
-	github.com/klauspost/compress v1.13.6 // indirect
 	github.com/kr/text v0.2.0 // indirect
 	github.com/mailru/easyjson v0.7.7 // indirect
 	github.com/mattn/go-sqlite3 v2.0.3+incompatible // indirect
 	github.com/matttproud/golang_protobuf_extensions v1.0.4 // indirect
 	github.com/mitchellh/mapstructure v1.5.0 // indirect
-	github.com/montanaflynn/stats v0.0.0-20171201202039-1bf9dbcd8cbe // indirect
 	github.com/pkg/errors v0.9.1 // indirect
 	github.com/prometheus/client_golang v1.15.1 // indirect
 	github.com/prometheus/client_model v0.3.0 // indirect
@@ -43,13 +39,8 @@ require (
 	github.com/prometheus/procfs v0.9.0 // indirect
 	github.com/shiena/ansicolor v0.0.0-20200904210342-c7312218db18 // indirect
 	github.com/stretchr/testify v1.8.4 // 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/youmark/pkcs8 v0.0.0-20181117223130-1be2e3e5546d // indirect
 	golang.org/x/crypto v0.19.0 // indirect
 	golang.org/x/net v0.21.0 // indirect
-	golang.org/x/sync v0.1.0 // indirect
 	golang.org/x/sys v0.17.0 // indirect
 	golang.org/x/text v0.14.0 // indirect
 	google.golang.org/protobuf v1.30.0 // indirect

+ 0 - 42
go.sum

@@ -28,8 +28,6 @@ github.com/golang/protobuf v1.3.5/go.mod h1:6O5/vntMXwX2lRkT1hjjk0nAC1IDOTvTlVgj
 github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk=
 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.1 h1:Qgr9rKW7uDUkrbSmQeiDsGa8SjGyCOGtuasMWwvp2P4=
-github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
 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=
 github.com/gonum/floats v0.0.0-20181209220543-c233463c7e82 h1:EvokxLQsaaQjcWVWSV38221VAK7qc2zhaO17bKys/18=
@@ -51,8 +49,6 @@ github.com/hashicorp/golang-lru v0.5.4 h1:YDjusn29QI/Das2iO9M0BHnIbxPeyuCHsjMW+l
 github.com/hashicorp/golang-lru v0.5.4/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4=
 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/klauspost/compress v1.13.6 h1:P76CopJELS0TiO2mebmnzgWaajssP/EszplttgQxcgc=
-github.com/klauspost/compress v1.13.6/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk=
 github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE=
 github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk=
 github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=
@@ -67,8 +63,6 @@ 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/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY=
 github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo=
-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/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE=
 github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU=
 github.com/olivere/elastic/v7 v7.0.32 h1:R7CXvbu8Eq+WlsLgxmKVKPox0oOwAE/2T9Si5BnvK6E=
@@ -97,51 +91,15 @@ github.com/shopspring/decimal v1.3.1 h1:2Usl1nmF/WZucqkFZhnfFYxxxu8LG21F6nPQBE5g
 github.com/shopspring/decimal v1.3.1/go.mod h1:DKyhrW/HYNuLGql+MJL6WCR6knT2jwCFRcu2hWCYk4o=
 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/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.2 h1:FHX5I5B4i4hKRVRBCFRxq1iQRej7WO3hhBuJf+UUySY=
-github.com/xdg-go/scram v1.1.2/go.mod h1:RT/sEzTbU5y00aCK8UOx6R7YryM0iF1N2MOmC3kKLN4=
-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/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.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY=
-go.mongodb.org/mongo-driver v1.15.0 h1:rJCKC8eEliewXjZGf0ddURtl7tTVy1TK3bfl0gkUSLc=
-go.mongodb.org/mongo-driver v1.15.0/go.mod h1:Vzb0Mk/pa7e6cWw85R4F/endUC3u0U9jGcNU603k65c=
-golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
-golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
 golang.org/x/crypto v0.19.0 h1:ENy+Az/9Y1vSrlrvBSyna3PITt4tiZLf7sgCjZBX7Wo=
 golang.org/x/crypto v0.19.0/go.mod h1:Iy9bg/ha4yyC70EfRS8jz+B6ybOBKMaSxLj6P6oBDfU=
-golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4=
-golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
-golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
-golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=
 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/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
-golang.org/x/sync v0.0.0-20190423024810-112230192c58/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 h1:wsuoTGHzEhffawBOhz5CYhcrV4IdKZbEyZjBMuTp12o=
-golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
-golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
-golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
-golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
-golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/sys v0.17.0 h1:25cE3gD+tdBA7lp7QfhuV+rJiE9YXTcS3VG1SqssI/Y=
 golang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
-golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
-golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
-golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
-golang.org/x/text v0.3.3/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.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ=
 golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU=
-golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
-golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
-golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc=
-golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
 golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
 google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw=
 google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=

+ 3 - 1
main.go

@@ -2,6 +2,7 @@ package main
 
 import (
 	_ "eta/eta_forum_task/routers"
+	"eta/eta_forum_task/services"
 	beego "github.com/beego/beego/v2/server/web"
 )
 
@@ -10,6 +11,7 @@ func main() {
 		beego.BConfig.WebConfig.DirectoryIndex = true
 		beego.BConfig.WebConfig.StaticDir["/swagger"] = "swagger"
 	}
-
+	//ervices.UpdateChart(1784)
+	go services.Task()
 	beego.Run()
 }

+ 10 - 0
models/chart_edb_mapping.go

@@ -316,3 +316,13 @@ func GetChartEdbMappingCount(edbInfoId int) (count int, err error) {
 	err = o.Raw(sql, edbInfoId).QueryRow(&count)
 	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
+}

+ 1 - 16
models/chart_info.go

@@ -1,7 +1,6 @@
 package models
 
 import (
-	"eta/eta_forum_task/models/mgodb"
 	"eta/eta_forum_task/utils"
 	"fmt"
 	"github.com/beego/beego/v2/client/orm"
@@ -54,6 +53,7 @@ type ChartInfo struct {
 	Unit              string `description:"中文单位名称"`
 	UnitEn            string `description:"英文单位名称"`
 	IsJoinPermission  int    `description:"是否加入权限管控,0:不加入;1:加入;默认:0"`
+	ForumChartInfoId  int    `description:"社区的图表ID"`
 }
 
 type ChartInfoMore struct {
@@ -1060,21 +1060,6 @@ type AddChartInfoReq struct {
 	UnitEn               string                  `description:"英文单位名称"`
 }
 
-type AddChartReq struct {
-	ChartInfo               *ChartInfo
-	Description             string `description:"逻辑简述"`
-	EdbInfoList             []*EdbInfo
-	ChartThemeList          []*ChartTheme
-	EdbInfoDataList         []*AddEdbDataReq
-	ChartEdbMapping         []*ChartEdbMapping
-	EdbInfoCalculateMapping []*EdbInfoCalculateMapping
-}
-
-type AddEdbDataReq struct {
-	EdbCode  string
-	DataList []*mgodb.EdbDataBase
-}
-
 type DeleteChartReq struct {
 	ChartInfoId int `description:"图表id"`
 }

+ 151 - 0
models/chart_theme/chart_theme.go

@@ -0,0 +1,151 @@
+package chart_theme
+
+import (
+	"errors"
+	"github.com/beego/beego/v2/client/orm"
+	"time"
+)
+
+// ChartTheme
+// @Description: 图表主题表
+type ChartTheme struct {
+	ChartThemeId     int       `description:"图表主题类型ID" orm:"column(chart_theme_id);pk"`
+	ChartThemeName   string    `description:"图表主题名称"`
+	ChartThemeTypeId int       `description:"图表主题类型ID"`
+	ChartImage       string    `description:"缩略图"`
+	Config           string    `description:"配置"`
+	IsDelete         int       `description:"是否删除,0:未删除;1:已删除"`
+	SysUserId        int       `description:"操作人"`
+	SysUserRealName  string    `description:"操作人的真实名称"`
+	IsSystemTheme    int       `description:"是否是系统主题,0:不是;1:是"`
+	ModifyTime       time.Time `description:"修改时间"`
+	CreateTime       time.Time `description:"创建时间"`
+}
+
+// GetChartThemeId
+// @Description: 根据id获取主题
+// @author: Roc
+// @datetime 2023-12-14 16:05:36
+// @param chartThemeId int
+// @return item *ChartTheme
+// @return err error
+func GetChartThemeId(chartThemeId int) (item *ChartTheme, err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := `SELECT * FROM chart_theme where chart_theme_id = ? AND is_delete = 0`
+	err = o.Raw(sql, chartThemeId).QueryRow(&item)
+
+	return
+}
+
+// Add
+// @Description: 添加
+// @author: Roc
+// @receiver m
+// @datetime 2023-12-14 16:11:10
+// @param cols []string
+// @return err error
+func (m *ChartTheme) Add() (err error) {
+	if m.ChartThemeId > 0 {
+		err = errors.New("该配置已存在")
+		return
+	}
+	o := orm.NewOrmUsingDB("data")
+	lastId, err := o.Insert(m)
+	if err != nil {
+		return
+	}
+	m.ChartThemeId = int(lastId)
+
+	return
+}
+
+// Update
+// @Description: 更新
+// @author: Roc
+// @receiver m
+// @datetime 2023-12-14 16:11:10
+// @param cols []string
+// @return err error
+func (m *ChartTheme) Update(cols []string) (err error) {
+	o := orm.NewOrmUsingDB("data")
+	_, err = o.Update(m, cols...)
+	return
+}
+
+// GetChartThemeListByTypeId
+// @Description: 根据图表类型获取关联的图表主题列表
+// @author: Roc
+// @datetime 2023-12-13 17:39:48
+// @return list []*ChartTheme
+// @return err error
+func GetChartThemeListByTypeId(chartThemeTypeId int) (list []*ChartTheme, err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := `SELECT * FROM chart_theme WHERE chart_theme_type_id = ? AND  is_delete=0 ORDER BY chart_theme_id ASC `
+	_, err = o.Raw(sql, chartThemeTypeId).QueryRows(&list)
+
+	return
+}
+
+// GetAllChartThemeList
+// @Description: 获取所有图表主题列表
+// @author: Roc
+// @datetime 2023-12-13 17:39:48
+// @return list []*ChartTheme
+// @return err error
+func GetAllChartThemeList() (list []*ChartTheme, err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := `SELECT * FROM chart_theme WHERE  is_delete=0 ORDER BY chart_theme_id ASC `
+	_, err = o.Raw(sql).QueryRows(&list)
+
+	return
+}
+
+// ChartThemeItem
+// @Description: 图表主题配置
+type ChartThemeItem struct {
+	ChartThemeId     int    `description:"图表主题类型ID" orm:"column(chart_theme_id);pk"`
+	ChartThemeName   string `description:"图表主题名称"`
+	ChartThemeTypeId int    `description:"图表主题类型ID"`
+	Config           string `description:"配置"`
+	ChartImage       string `description:"缩略图"`
+	//IsDelete            int       `description:"是否删除,0:未删除;1:已删除"`
+	IsSystemTheme       int       `description:"是否是系统主题,0:不是;1:是"`
+	SysUserId           int       `description:"操作人"`
+	SysUserRealName     string    `description:"操作人的真实名称"`
+	ModifyTime          time.Time `description:"修改时间"`
+	CreateTime          time.Time `description:"创建时间"`
+	DefaultChartThemeId int       `description:"默认使用的图表主题ID"`
+}
+
+// GetChartThemeItemList
+// @Description: 根据图表类型id获取配置列表
+// @author: Roc
+// @datetime 2023-12-14 14:26:35
+// @param chartThemeTypeId int
+// @return list []*ChartThemeConfig
+// @return err error
+func GetChartThemeItemList(chartThemeTypeId int) (list []*ChartThemeItem, err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := `SELECT a.*,b.default_chart_theme_id FROM chart_theme a 
+         JOIN chart_theme_type b on a.chart_theme_type_id =b.chart_theme_type_id 
+         WHERE a.chart_theme_type_id = ? AND a.is_delete=0 ORDER BY a.chart_theme_id ASC `
+	_, err = o.Raw(sql, chartThemeTypeId).QueryRows(&list)
+
+	return
+}
+
+// GetSystemChartTheme
+// @Description: 根据图表类型id获取系统配置
+// @author: Roc
+// @datetime 2023-12-14 14:26:35
+// @param chartThemeTypeId int
+// @return item *ChartTheme
+// @return err error
+func GetSystemChartTheme(chartThemeTypeId int) (item *ChartTheme, err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := `SELECT a.* FROM chart_theme a
+         WHERE a.chart_theme_type_id = ? AND a.is_system_theme=1 ORDER BY a.chart_theme_id ASC `
+	err = o.Raw(sql, chartThemeTypeId).QueryRow(&item)
+
+	return
+}

+ 90 - 0
models/chart_theme/chart_theme_type.go

@@ -0,0 +1,90 @@
+package chart_theme
+
+import (
+	"github.com/beego/beego/v2/client/orm"
+	"time"
+)
+
+// ChartThemeType
+// @Description: 图表主题类型表
+type ChartThemeType struct {
+	ChartThemeTypeId    int       `description:"图表主题类型ID" orm:"column(chart_theme_type_id);pk"`
+	ChartTypeName       string    `description:"类型名称"`
+	ChartType           int       `description:"图表类型"`
+	ChartSource         int       `description:"图表来源"`
+	DefaultChartThemeId int       `description:"默认使用的主题id"`
+	ModifyTime          time.Time `description:"修改时间"`
+	CreateTime          time.Time `description:"创建时间"`
+}
+
+// Update
+// @Description: 更新
+// @author: Roc
+// @receiver m
+// @datetime 2023-12-14 16:11:10
+// @param cols []string
+// @return err error
+func (m *ChartThemeType) Update(cols []string) (err error) {
+	o := orm.NewOrmUsingDB("data")
+	_, err = o.Update(m, cols...)
+	return
+}
+
+// GetAllChartThemeTypeList
+// @Description: 获取所有图表主题类型列表
+// @author: Roc
+// @datetime 2023-12-13 17:31:03
+// @return list []*ChartThemeType
+// @return err error
+func GetAllChartThemeTypeList() (list []*ChartThemeType, err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := `SELECT * FROM chart_theme_type ORDER BY chart_theme_type_id ASC `
+	_, err = o.Raw(sql).QueryRows(&list)
+
+	return
+}
+
+// GetChartThemeTypeListBySource
+// @Description: 根据来源获取图表主题类型列表
+// @author: Roc
+// @datetime 2023-12-13 17:31:03
+// @param source int
+// @return list []*ChartThemeType
+// @return err error
+func GetChartThemeTypeListBySource(source int) (list []*ChartThemeType, err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := `SELECT * FROM chart_theme_type WHERE chart_source = ?  ORDER BY chart_theme_type_id ASC `
+	_, err = o.Raw(sql, source).QueryRows(&list)
+
+	return
+}
+
+// GetChartThemeTypeById
+// @Description: 通过类型id获取类型
+// @author: Roc
+// @datetime 2023-12-14 09:53:58
+// @param chartThemeTypeId int
+// @return item *ChartThemeType
+// @return err error
+func GetChartThemeTypeById(chartThemeTypeId int) (item *ChartThemeType, err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := `SELECT * FROM chart_theme_type where chart_theme_type_id = ? `
+	err = o.Raw(sql, chartThemeTypeId).QueryRow(&item)
+
+	return
+}
+
+// GetChartThemeTypeByChartTypeAndSource
+// @Description: 通过图表类型和来源获取类型
+// @author: Roc
+// @datetime 2023-12-14 09:53:58
+// @param chartThemeTypeId int
+// @return item *ChartThemeType
+// @return err error
+func GetChartThemeTypeByChartTypeAndSource(chartType, source int) (item *ChartThemeType, err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := `SELECT * FROM chart_theme_type where chart_type = ? AND chart_source = ? `
+	err = o.Raw(sql, chartType, source).QueryRow(&item)
+
+	return
+}

+ 331 - 0
models/edb_data_base.go

@@ -0,0 +1,331 @@
+package models
+
+import (
+	"eta/eta_forum_task/utils"
+	"fmt"
+	"github.com/beego/beego/v2/client/orm"
+	"time"
+)
+
+// GetEdbDataTableName 指标数据->存储表
+func GetEdbDataTableName(source, subSource int) (tableName string) {
+	switch source {
+	case utils.DATA_SOURCE_THS:
+		tableName = "edb_data_ths"
+		if subSource == utils.DATA_SUB_SOURCE_DATE {
+			tableName = "edb_data_ths_ds"
+		} else {
+			tableName = "edb_data_ths"
+		}
+	case utils.DATA_SOURCE_WIND:
+		if subSource == utils.DATA_SUB_SOURCE_DATE {
+			tableName = "edb_data_wind_wsd"
+		} else {
+			tableName = "edb_data_wind"
+		}
+	case utils.DATA_SOURCE_PB, utils.DATA_SOURCE_PB_FINANCE: //彭博经济数据、彭博财务数据
+		tableName = "edb_data_pb"
+	case utils.DATA_SOURCE_CALCULATE:
+		tableName = "edb_data_calculate"
+	case utils.DATA_SOURCE_CALCULATE_LJZZY:
+		tableName = "edb_data_calculate_ljzzy"
+	case utils.DATA_SOURCE_CALCULATE_TBZ:
+		tableName = "edb_data_calculate_tbz"
+	case utils.DATA_SOURCE_CALCULATE_TCZ:
+		tableName = "edb_data_calculate_tcz"
+	case utils.DATA_SOURCE_CALCULATE_NSZYDPJJS:
+		tableName = "edb_data_calculate_nszydpjjs"
+	case utils.DATA_SOURCE_MANUAL:
+		tableName = "edb_data_manual"
+	case utils.DATA_SOURCE_LZ:
+		tableName = "edb_data_lz"
+	case utils.DATA_SOURCE_YS:
+		tableName = "edb_data_ys"
+	case utils.DATA_SOURCE_CALCULATE_HBZ:
+		tableName = "edb_data_calculate_hbz"
+	case utils.DATA_SOURCE_CALCULATE_HCZ:
+		tableName = "edb_data_calculate_hcz"
+	case utils.DATA_SOURCE_CALCULATE_BP:
+		tableName = "edb_data_calculate_bp"
+	case utils.DATA_SOURCE_GL:
+		tableName = "edb_data_gl"
+	case utils.DATA_SOURCE_ZZ:
+		tableName = "edb_data_zz"
+	case utils.DATA_SOURCE_DL:
+		tableName = "edb_data_dl"
+	case utils.DATA_SOURCE_SH:
+		tableName = "edb_data_sh"
+	case utils.DATA_SOURCE_CFFEX:
+		tableName = "edb_data_cffex"
+	case utils.DATA_SOURCE_SHFE:
+		tableName = "edb_data_ine"
+	case utils.DATA_SOURCE_GIE:
+		tableName = "edb_data_gie"
+	case utils.DATA_SOURCE_CALCULATE_ZJPJ:
+		tableName = "edb_data_calculate_zjpj"
+	case utils.DATA_SOURCE_CALCULATE_TIME_SHIFT:
+		tableName = "edb_data_calculate_time_shift"
+	case utils.DATA_SOURCE_CALCULATE_LJZTBPJ:
+		tableName = "edb_data_calculate_ljztbpj"
+	case utils.DATA_SOURCE_LT:
+		tableName = "edb_data_lt"
+	case utils.DATA_SOURCE_COAL:
+		tableName = "edb_data_coal"
+	case utils.DATA_SOURCE_PYTHON:
+		tableName = "edb_data_python"
+	case utils.DATA_SOURCE_GOOGLE_TRAVEL:
+		tableName = "edb_data_google_travel"
+	case utils.DATA_SOURCE_PREDICT_CALCULATE:
+		tableName = "edb_data_predict_calculate"
+	case utils.DATA_SOURCE_PREDICT_CALCULATE_TBZ:
+		tableName = "edb_data_predict_calculate_tbz"
+	case utils.DATA_SOURCE_PREDICT_CALCULATE_TCZ:
+		tableName = "edb_data_predict_calculate_tcz"
+	case utils.DATA_SOURCE_MYSTEEL_CHEMICAL:
+		tableName = "edb_data_mysteel_chemical"
+	case utils.DATA_SOURCE_CALCULATE_CJJX:
+		tableName = "edb_data_calculate_cjjx"
+	case utils.DATA_SOURCE_EIA_STEO:
+		tableName = "edb_data_eia_steo"
+	case utils.DATA_SOURCE_CALCULATE_NHCC:
+		tableName = "edb_data_calculate_nhcc"
+	case utils.DATA_SOURCE_COM_TRADE:
+		tableName = "edb_data_com_trade"
+	case utils.DATA_SOURCE_PREDICT_CALCULATE_NSZYDPJJS:
+		tableName = "edb_data_predict_calculate_nszydpjjs"
+	case utils.DATA_SOURCE_CALCULATE_ADJUST:
+		tableName = "edb_data_calculate_adjust"
+	case utils.DATA_SOURCE_SCI:
+		tableName = "edb_data_sci"
+	case utils.DATA_SOURCE_PREDICT_CALCULATE_LJZZY:
+		tableName = "edb_data_predict_calculate_ljzzy"
+	case utils.DATA_SOURCE_PREDICT_CALCULATE_TIME_SHIFT:
+		tableName = "edb_data_predict_calculate_time_shift"
+	case utils.DATA_SOURCE_PREDICT_CALCULATE_ZJPJ:
+		tableName = "edb_data_predict_calculate_zjpj"
+	case utils.DATA_SOURCE_PREDICT_CALCULATE_LJZTBPJ:
+		tableName = "edb_data_predict_calculate_ljztbpj"
+	case utils.DATA_SOURCE_PREDICT_CALCULATE_NHCC:
+		tableName = "edb_data_predict_calculate_nhcc"
+	case utils.DATA_SOURCE_PREDICT_CALCULATE_CJJX:
+		tableName = "edb_data_predict_calculate_cjjx"
+	case utils.DATA_SOURCE_PREDICT_CALCULATE_HBZ:
+		tableName = "edb_data_predict_calculate_hbz"
+	case utils.DATA_SOURCE_PREDICT_CALCULATE_HCZ:
+		tableName = "edb_data_predict_calculate_hcz"
+	case utils.DATA_SOURCE_PREDICT_CALCULATE_BP:
+		tableName = "edb_data_predict_calculate_bp"
+	case utils.DATA_SOURCE_CALCULATE_JP:
+		tableName = "edb_data_calculate_jp"
+	case utils.DATA_SOURCE_CALCULATE_NH:
+		tableName = "edb_data_calculate_nh"
+	case utils.DATA_SOURCE_CALCULATE_KSZS:
+		tableName = "edb_data_calculate_kszs"
+	case utils.DATA_SOURCE_PREDICT_CALCULATE_JP:
+		tableName = "edb_data_predict_calculate_jp"
+	case utils.DATA_SOURCE_PREDICT_CALCULATE_NH:
+		tableName = "edb_data_predict_calculate_nh"
+	case utils.DATA_SOURCE_PREDICT_CALCULATE_KSZS:
+		tableName = "edb_data_predict_calculate_kszs"
+	case utils.DATA_SOURCE_BAIINFO:
+		tableName = "edb_data_baiinfo"
+	case utils.DATA_SOURCE_STOCK_PLANT:
+		tableName = "edb_data_stock_plant"
+	case utils.DATA_SOURCE_CALCULATE_CORRELATION:
+		tableName = "edb_data_calculate_correlation"
+	case utils.DATA_SOURCE_NATIONAL_STATISTICS:
+		tableName = "edb_data_national_statistics"
+	case utils.DATA_SOURCE_CALCULATE_LJZZJ: //累计值转季 -> 61
+		tableName = "edb_data_calculate_ljzzj"
+	case utils.DATA_SOURCE_CALCULATE_LJZ: //累计值 -> 62
+		tableName = "edb_data_calculate_ljz"
+	case utils.DATA_SOURCE_CALCULATE_LJZNCZJ: //累计值(年初至今) -> 63
+		tableName = "edb_data_calculate_ljznczj"
+	case utils.DATA_SOURCE_PREDICT_CALCULATE_LJZZJ: // 预测指标 - 累计值 -> 65
+		tableName = "edb_data_predict_calculate_ljzzj"
+	case utils.DATA_SOURCE_PREDICT_CALCULATE_LJZ: //预测指标 - 累计值转季->64
+		tableName = "edb_data_predict_calculate_ljz"
+	case utils.DATA_SOURCE_PREDICT_CALCULATE_LJZNCZJ: //预测指标 - 累计值(年初至今) -> 66
+		tableName = "edb_data_predict_calculate_ljznczj"
+	case utils.DATA_SOURCE_CALCULATE_STANDARD_DEVIATION: //标准差->67
+		tableName = "edb_data_calculate_standard_deviation"
+	case utils.DATA_SOURCE_CALCULATE_PERCENTILE: //百分位->68
+		tableName = "edb_data_calculate_percentile"
+	case utils.DATA_SOURCE_PREDICT_CALCULATE_STANDARD_DEVIATION: //预测标准差->69
+		tableName = "edb_data_predict_ccalculate_standard_deviation"
+	case utils.DATA_SOURCE_PREDICT_CALCULATE_PERCENTILE: //预测百分位->70
+		tableName = "edb_data_predict_ccalculate_percentile"
+	case utils.DATA_SOURCE_FUBAO: //富宝-71
+		tableName = "edb_data_fubao"
+	case utils.DATA_SOURCE_CALCULATE_ZSXY:
+		tableName = "edb_data_calculate_zsxy" // 指数修匀->72
+	case utils.DATA_SOURCE_PREDICT_CALCULATE_ZSXY:
+		tableName = "edb_data_predict_calculate_zsxy" // 预测指数修匀->73
+	case utils.DATA_SOURCE_CALCULATE_ZDYFX:
+		tableName = "edb_data_calculate_zdyfx" // 自定义分析->74
+	case utils.DATA_SOURCE_CALCULATE_RJZ: //日均值->75
+		tableName = "edb_data_calculate_rjz"
+	case utils.DATA_SOURCE_GFEX: //广州期货交易所->78
+		tableName = "edb_data_gz"
+	case utils.DATA_SOURCE_ICPI: //ICPI消费价格指数->79
+		tableName = "edb_data_icpi"
+	default:
+		edbSource := EdbSourceIdMap[source]
+		if edbSource != nil {
+			tableName = edbSource.TableName
+		}
+	}
+	return
+}
+
+//计算指标->关联的基础指标表
+//func GetEdbInfoCalculateTableName(source int) (tableName string) {
+//	switch source {
+//	case utils.DATA_SOURCE_CALCULATE:
+//		tableName = "edb_info_calculate"
+//	case utils.DATA_SOURCE_CALCULATE_LJZZY:
+//		tableName = "edb_info_calculate_ljzzy"
+//	case utils.DATA_SOURCE_CALCULATE_TBZ:
+//		tableName = "edb_info_calculate_tbz"
+//	case utils.DATA_SOURCE_CALCULATE_TCZ:
+//		tableName = "edb_info_calculate_tcz"
+//	case utils.DATA_SOURCE_CALCULATE_NSZYDPJJS:
+//		tableName = "edb_info_calculate_nszydpjjs"
+//	case utils.DATA_SOURCE_CALCULATE_HBZ:
+//		tableName = "edb_info_calculate_hbz"
+//	case utils.DATA_SOURCE_CALCULATE_HCZ:
+//		tableName = "edb_info_calculate_hcz"
+//	case utils.DATA_SOURCE_CALCULATE_BP:
+//		tableName = "edb_info_calculate_bp"
+//	default:
+//		tableName = ""
+//	}
+//	return
+//}
+
+type EdbDataBase struct {
+	EdbDataId     int `orm:"column(edb_data_id);pk"`
+	EdbInfoId     int
+	EdbCode       string
+	DataTime      string
+	Value         string
+	Status        int
+	CreateTime    time.Time
+	ModifyTime    time.Time
+	DataTimestamp int64
+}
+
+func GetEdbDataAllByEdbCode(edbCode string, source, subSource, limit int) (items []*EdbInfoSearchData, err error) {
+	var pars []interface{}
+	pars = append(pars, edbCode)
+	o := orm.NewOrmUsingDB("data")
+
+	tableName := GetEdbDataTableName(source, subSource)
+	sql := ` SELECT * FROM %s WHERE edb_code=? ORDER BY data_time DESC`
+	if limit > 0 {
+		sql += `  LIMIT ?  `
+		pars = append(pars, limit)
+	}
+	sql = fmt.Sprintf(sql, tableName)
+	_, err = o.Raw(sql, pars).QueryRows(&items)
+	return
+}
+
+func GetEdbDataBaseByEdbCode(edbInfoId int, source, subSource int) (items []*EdbDataBase, err error) {
+	o := orm.NewOrmUsingDB("data")
+	tableName := GetEdbDataTableName(source, subSource)
+	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 GetBaseIndexInfoByEdbCode(edbCode string, source int) (item *BaseIndexInfo, err error) {
+	var pars []interface{}
+	pars = append(pars, edbCode)
+	o := orm.NewOrmUsingDB("data")
+
+	tableName := GetBaseIndexTableName(source)
+	if tableName == "" {
+		err = fmt.Errorf("未找到对应的表")
+		return
+	}
+	sql := ` SELECT * FROM %s WHERE index_code=? `
+
+	sql = fmt.Sprintf(sql, tableName)
+	err = o.Raw(sql, pars).QueryRow(&item)
+	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 GetEdbDataAllByEdbCodeAndSubSource(edbCode string, source, subSource, limit int) (items []*EdbInfoSearchData, err error) {
+	var pars []interface{}
+	pars = append(pars, edbCode)
+	o := orm.NewOrmUsingDB("data")
+
+	tableName := GetEdbDataTableNameAndSubSource(source, subSource)
+	sql := ` SELECT * FROM %s WHERE edb_code=? ORDER BY data_time DESC`
+	if limit > 0 {
+		sql += `  LIMIT ?  `
+		pars = append(pars, limit)
+	}
+	sql = fmt.Sprintf(sql, tableName)
+	_, err = o.Raw(sql, pars).QueryRows(&items)
+	return
+}
+
+// GetEdbDataTableName 指标数据->存储表
+func GetEdbDataTableNameAndSubSource(source, subSource int) (tableName string) {
+	switch source {
+	case utils.DATA_SOURCE_WIND:
+		if subSource == utils.DATA_SUB_SOURCE_EDB {
+			tableName = "edb_data_wind"
+		} else {
+			tableName = "edb_data_wind_wsd"
+		}
+	case utils.DATA_SOURCE_THS:
+		if subSource == utils.DATA_SUB_SOURCE_EDB {
+			tableName = "edb_data_ths"
+		} else {
+			tableName = "edb_data_ths_ds"
+		}
+	case utils.DATA_SOURCE_YS:
+		tableName = "edb_data_ys"
+	default:
+		edbSource := EdbSourceIdMap[source]
+		if edbSource != nil {
+			tableName = edbSource.TableName
+		}
+	}
+	return
+}
+
+func GetBaseIndexTableName(source int) (tableName string) {
+	edbSource := EdbSourceIdMap[source]
+	if edbSource != nil {
+		tableName = edbSource.IndexTableName
+	}
+	return
+}
+
+func GetEdbDataAllByEdbCodes(edbCodes []string, limit int) (items []*EdbInfoSearchData, err error) {
+	var pars []interface{}
+	pars = append(pars, edbCodes)
+	o := orm.NewOrmUsingDB("data")
+
+	sql := ` SELECT * FROM edb_data_ys WHERE edb_code IN (` + utils.GetOrmInReplace(len(edbCodes)) + `) ORDER BY data_time DESC`
+	if limit > 0 {
+		sql += `  LIMIT ?  `
+		pars = append(pars, limit)
+	}
+	_, err = o.Raw(sql, pars).QueryRows(&items)
+	return
+}

+ 73 - 0
models/edb_source.go

@@ -0,0 +1,73 @@
+package models
+
+import (
+	"eta/eta_forum_task/utils"
+	"fmt"
+	"github.com/beego/beego/v2/client/orm"
+	"strings"
+)
+
+var (
+	EdbSourceIdMap map[int]*EdbSource // 指标来源
+)
+
+// EdbSource 指标来源表
+type EdbSource struct {
+	EdbSourceId      int    `orm:"column(edb_source_id);pk"`
+	SourceName       string `description:"指标来源名称"`
+	TableName        string `description:"数据表名"`
+	EdbAddMethod     string `description:"指标新增接口"`
+	EdbRefreshMethod string `description:"指标刷新接口"`
+	IsBase           int    `description:"是否为基础指标: 0-否; 1-是"`
+	FromBridge       int    `description:"是否来源于桥接服务: 0-否; 1-是"`
+	BridgeFlag       string `description:"桥接服务对象标识"`
+	SourceExtend     string `description:"扩展字段做查询用"`
+	EdbCodeRequired  int    `description:"指标编码是否必填: 0-否; 1-是"`
+	IndexTableName   string `description:"数据源指标表名"`
+}
+
+// GetEdbSourceItemsByCondition 获取指标来源列表
+func GetEdbSourceItemsByCondition(condition string, pars []interface{}, fieldArr []string, orderRule string) (items []*EdbSource, err error) {
+	o := orm.NewOrmUsingDB("data")
+	fields := strings.Join(fieldArr, ",")
+	if len(fieldArr) == 0 {
+		fields = `*`
+	}
+	order := `ORDER BY edb_source_id ASC`
+	if orderRule != "" {
+		order = ` ORDER BY ` + orderRule
+	}
+	sql := fmt.Sprintf(`SELECT %s FROM edb_source WHERE 1=1 %s %s`, fields, condition, order)
+	_, err = o.Raw(sql, pars).QueryRows(&items)
+	return
+}
+
+// EdbSourceChild 指标来源表
+type EdbSourceChild struct {
+	EdbSourceId int    `orm:"column(edb_source_id);pk"`
+	SourceName  string `description:"指标来源名称"`
+	TableName   string `description:"数据表名"`
+	IsBase      int    `description:"是否为基础指标: 2-否; 1-是"`
+	Child       []EdbSourceChild
+}
+
+// GetEdbSourceItemByCondition 获取指标来源
+func GetEdbSourceItemByCondition(condition string, pars []interface{}) (item *EdbSource, err error) {
+	o := orm.NewOrmUsingDB("data")
+	sql := fmt.Sprintf(`SELECT * FROM edb_source WHERE 1=1 %s`, condition)
+	err = o.Raw(sql, pars).QueryRow(&item)
+	return
+}
+
+// InitEdbSourceVar 初始化时加载指标来源对应信息, 避免循环中查库, 注意edb_source表修改table_name的话需要重启服务
+func InitEdbSourceVar() {
+	EdbSourceIdMap = make(map[int]*EdbSource)
+	sources, e := GetEdbSourceItemsByCondition(``, make([]interface{}, 0), []string{}, "")
+	if e != nil {
+		utils.FileLog.Info("init source table err: %s", e.Error())
+		return
+	}
+	for _, v := range sources {
+		EdbSourceIdMap[v.EdbSourceId] = v
+	}
+}

+ 0 - 39
models/mgodb/db.go

@@ -1,39 +0,0 @@
-package mgodb
-
-import (
-	"context"
-	"eta/eta_forum_task/utils"
-	"fmt"
-	"go.mongodb.org/mongo-driver/mongo"
-	"go.mongodb.org/mongo-driver/mongo/options"
-	"go.mongodb.org/mongo-driver/mongo/readpref"
-	"time"
-)
-
-var MgoClient *mongo.Client
-
-func init() {
-	var err error
-	ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
-	defer cancel()
-	credential := options.Credential{
-		AuthMechanism: utils.MONGODB_CREDENTIAL,
-		Username:      "hzeta",
-		Password:      "hzeta2023",
-	}
-	clientOpts := options.Client().ApplyURI(utils.MONGODB_URL).SetAuth(credential)
-	clientOpts.SetMinPoolSize(0)
-	clientOpts.SetMaxPoolSize(100)
-	clientOpts.SetConnectTimeout(10 * time.Second)
-
-	MgoClient, err = mongo.Connect(context.TODO(), clientOpts)
-	if err != nil {
-		panic(err)
-	}
-
-	if err = MgoClient.Ping(ctx, readpref.Primary()); err != nil {
-		panic(err)
-	}
-
-	fmt.Println("Connected to MongoDB!")
-}

+ 0 - 119
models/mgodb/edb_data_base.go

@@ -1,119 +0,0 @@
-package mgodb
-
-import (
-	"context"
-	"eta/eta_forum_task/utils"
-	"go.mongodb.org/mongo-driver/bson"
-	"go.mongodb.org/mongo-driver/mongo/options"
-	"time"
-)
-
-type EdbDataBase struct {
-	EdbInfoId     int    `bson:"edb_info_id"`
-	EdbCode       string `bson:"edb_code"`
-	DataTime      string `bson:"data_time"`
-	Value         string `bson:"value"`
-	Status        int    `bson:"status"`
-	CreateTime    string `bson:"create_time"`
-	ModifyTime    string `bson:"modify_time"`
-	DataTimestamp int64  `bson:"data_timestamp"`
-}
-
-type EdbInfoSearchData struct {
-	DataTime string  `description:"数据日期" bson:"data_time"`
-	Value    float64 `description:"数据" bson:"value"`
-	EdbCode  string  `description:"指标编码" bson:"edb_code"`
-}
-
-func GetEdbDataBaseByEdbInfoId(edbInfoId int) (items []*EdbDataBase, err error) {
-	findOptions := options.Find()
-	db := NewMgo(utils.MONGODB_COMMUNITY, "edb_data_base", MgoClient)
-	filter := bson.D{{"edb_info_id", edbInfoId}}
-	ctx := context.TODO()
-	cur, err := db.Find(filter, findOptions)
-	if err != nil {
-		return
-	}
-	// Close the cursor once finished
-	defer cur.Close(ctx)
-	for cur.Next(ctx) {
-		// create a value into which the single document can be decoded
-		var elem EdbDataBase
-		err = cur.Decode(&elem)
-		if err != nil {
-			return
-		}
-
-		items = append(items, &elem)
-	}
-
-	if err = cur.Err(); err != nil {
-		return
-	}
-	return
-}
-
-func GetEdbDataBaseByEdbCode(edbCode string) (items []*EdbDataBase, err error) {
-	findOptions := options.Find()
-	db := NewMgo(utils.MONGODB_COMMUNITY, "edb_data_base", MgoClient)
-	filter := bson.D{{"edb_code", edbCode}}
-	ctx := context.TODO()
-	cur, err := db.Find(filter, findOptions)
-	if err != nil {
-		return
-	}
-	// Close the cursor once finished
-	defer cur.Close(ctx)
-	for cur.Next(ctx) {
-		// create a value into which the single document can be decoded
-		var elem EdbDataBase
-		err = cur.Decode(&elem)
-		if err != nil {
-			return
-		}
-
-		items = append(items, &elem)
-	}
-
-	if err = cur.Err(); err != nil {
-		return
-	}
-	return
-}
-
-func InsertBatch(items []interface{}) (err error) {
-	db := NewMgo(utils.MONGODB_COMMUNITY, "edb_data_base", MgoClient)
-	_, err = db.InsertMany(items)
-	if err != nil {
-		return
-	}
-	return
-}
-
-func ModifyEdbInfoDataStatus(edbInfoId int64, edbCode string) (err error) {
-	filter := bson.D{{"edb_code", edbCode}}
-	update := bson.D{{"$set", bson.D{{"edb_info_id", edbInfoId}, {"modify_time", time.Now().Format("2006-01-02 15:04:05")}}}}
-	db := NewMgo(utils.MONGODB_COMMUNITY, "edb_data_base", MgoClient)
-	_, err = db.UpdateMany(filter, update)
-	if err != nil {
-		return
-	}
-	return
-}
-
-// 删除
-func DeleteEdbInfoDataByEdbInfoId(edbInfoId int) (err error) {
-	filter := bson.D{{"edb_info_id", edbInfoId}}
-	db := NewMgo(utils.MONGODB_COMMUNITY, "edb_data_base", MgoClient)
-	_, err = db.DeleteMany(filter)
-	return
-}
-
-// 更新指标的值
-func ModifyValueEdbInfoDataStatus(edbCode string, dataTime string, value string) (err error) {
-	filter := bson.D{{"edb_code", edbCode}, {"data_time", dataTime}}
-	update := bson.D{{"$set", bson.D{{"value", value}, {"modify_time", time.Now().Format("2006-01-02 15:04:05")}}}}
-	db := NewMgo(utils.MONGODB_COMMUNITY, "edb_data_base", MgoClient)
-	_, err = db.UpdateOne(filter, update)
-	return
-}

+ 0 - 156
models/mgodb/mgo.go

@@ -1,156 +0,0 @@
-package mgodb
-
-import (
-	"context"
-	"fmt"
-	"go.mongodb.org/mongo-driver/bson"
-	"go.mongodb.org/mongo-driver/mongo"
-	"go.mongodb.org/mongo-driver/mongo/options"
-	"strconv"
-	"time"
-)
-
-type mgo struct {
-	database   string
-	collection string
-	client     *mongo.Client
-}
-
-func NewMgo(database, collection string, client *mongo.Client) *mgo {
-	return &mgo{
-		database,
-		collection,
-		client,
-	}
-}
-
-// 查询单个
-func (m *mgo) FindOne(key string, value interface{}) *mongo.SingleResult {
-	collection, _ := m.client.Database(m.database).Collection(m.collection).Clone()
-	filter := bson.D{{key, value}}
-	singleResult := collection.FindOne(context.TODO(), filter)
-	return singleResult
-}
-
-// 查询单个
-func (m *mgo) Find(filter bson.D, findOptions *options.FindOptions) (cur *mongo.Cursor, err error) {
-	collection := m.client.Database(m.database).Collection(m.collection)
-
-	cur, err = collection.Find(context.TODO(), filter, findOptions)
-	if err != nil {
-		return
-	}
-	return
-}
-
-// 插入单个
-func (m *mgo) InsertOne(value interface{}) (insertResult *mongo.InsertOneResult, err error) {
-	collection := m.client.Database(m.database).Collection(m.collection)
-	insertResult, err = collection.InsertOne(context.TODO(), value)
-	if err != nil {
-		fmt.Println(err)
-		return
-	}
-	return
-}
-
-func (m *mgo) InsertMany(value []interface{}) (insertManyResult *mongo.InsertManyResult, err error) {
-	collection := m.client.Database(m.database).Collection(m.collection)
-	insertManyResult, err = collection.InsertMany(context.TODO(), value)
-	if err != nil {
-		return
-	}
-
-	fmt.Println("Inserted multiple documents: ", insertManyResult.InsertedIDs)
-	return
-}
-
-// 查询集合里有多少数据
-func (m *mgo) CollectionCount() (string, int64) {
-	collection := m.client.Database(m.database).Collection(m.collection)
-	name := collection.Name()
-	size, _ := collection.EstimatedDocumentCount(context.TODO())
-	return name, size
-}
-
-// 按选项查询集合 Skip 跳过 Limit 读取数量 sort 1 ,-1 . 1 为最初时间读取 , -1 为最新时间读取
-func (m *mgo) CollectionDocuments(Skip, Limit int64, sort int) *mongo.Cursor {
-	collection := m.client.Database(m.database).Collection(m.collection)
-	SORT := bson.D{{"_id", sort}} //filter := bson.D{{key,value}}
-	filter := bson.D{{}}
-	findOptions := options.Find().SetSort(SORT).SetLimit(Limit).SetSkip(Skip)
-	//findOptions.SetLimit(i)
-	temp, _ := collection.Find(context.Background(), filter, findOptions)
-	return temp
-}
-
-// 获取集合创建时间和编号
-func (m *mgo) ParsingId(result string) (time.Time, uint64) {
-	temp1 := result[:8]
-	timestamp, _ := strconv.ParseInt(temp1, 16, 64)
-	dateTime := time.Unix(timestamp, 0) //这是截获情报时间 时间格式 2019-04-24 09:23:39 +0800 CST
-	temp2 := result[18:]
-	count, _ := strconv.ParseUint(temp2, 16, 64) //截获情报的编号
-	return dateTime, count
-}
-
-// 删除文章和查询文章
-func (m *mgo) DeleteAndFind(key string, value interface{}) (int64, *mongo.SingleResult) {
-	collection := m.client.Database(m.database).Collection(m.collection)
-	filter := bson.D{{key, value}}
-	singleResult := collection.FindOne(context.TODO(), filter)
-	DeleteResult, err := collection.DeleteOne(context.TODO(), filter, nil)
-	if err != nil {
-		fmt.Println("删除时出现错误,你删不掉的~")
-	}
-	return DeleteResult.DeletedCount, singleResult
-}
-
-// 删除文章
-func (m *mgo) Delete(key string, value interface{}) int64 {
-	collection := m.client.Database(m.database).Collection(m.collection)
-	filter := bson.D{{key, value}}
-	count, err := collection.DeleteOne(context.TODO(), filter, nil)
-	if err != nil {
-		fmt.Println(err)
-	}
-	return count.DeletedCount
-
-}
-
-// 删除多个
-func (m *mgo) DeleteMany(filter bson.D) (num int64, err error) {
-	collection := m.client.Database(m.database).Collection(m.collection)
-	//filter := bson.D{{key, value}}
-
-	count, err := collection.DeleteMany(context.TODO(), filter)
-	if err != nil {
-		return
-	}
-	num = count.DeletedCount
-	return
-}
-
-func (m *mgo) UpdateMany(filter, update bson.D) (result *mongo.UpdateResult, err error) {
-	collection := m.client.Database(m.database).Collection(m.collection)
-	//filter := bson.D{{"name", "123456"}}
-	//update := bson.D{{"$set", bson.D{{"name", "张三"}}}}
-	result, err = collection.UpdateMany(context.TODO(), filter, update)
-	if err != nil {
-		return
-	}
-	fmt.Println(result)
-	return
-}
-
-func (m *mgo) UpdateOne(filter, update bson.D) (result *mongo.UpdateResult, err error) {
-	collection := m.client.Database(m.database).Collection(m.collection)
-	//filter := bson.D{{"name", "123456"}}
-	//update := bson.D{{"$set", bson.D{{"name", "张三"}}}}
-	result, err = collection.UpdateOne(context.TODO(), filter, update)
-	if err != nil {
-		return
-	}
-	fmt.Println(result)
-	return
-}

+ 1 - 13
routers/router.go

@@ -8,22 +8,10 @@
 package routers
 
 import (
-	"eta/eta_forum_task/controllers"
 	"github.com/beego/beego/v2/server/web"
 )
 
 func init() {
-	ns := web.NewNamespace("/v1",
-		web.NSNamespace("/chart",
-			web.NSInclude(
-				&controllers.ChartInfoController{},
-			),
-		),
-		web.NSNamespace("/auth",
-			web.NSInclude(
-				&controllers.AuthController{},
-			),
-		),
-	)
+	ns := web.NewNamespace("/v1")
 	web.AddNamespace(ns)
 }

+ 135 - 415
services/chart_info.go

@@ -1,476 +1,196 @@
 package services
 
 import (
-	"errors"
+	"encoding/json"
 	"eta/eta_forum_task/models"
+	"eta/eta_forum_task/services/eta_forum"
 	"eta/eta_forum_task/utils"
 	"fmt"
-	"sort"
-	"strconv"
-	"strings"
-	"time"
 )
 
-// AddChartInfo 添加图表
-func AddChartInfo(req *models.AddChartReq, sysUserId int, sysUserRealName string) (chartInfo *models.ChartInfo, err error, errMsg string, isSendEmail bool) {
-	isSendEmail = true // 默认错误的时候要发送邮件
+func EtaForumChartUpdate() (err error) {
+	// 设置缓存判断处理中则不更新
+	// 循环更新100个图表数据
 
-	req.ChartInfo.ChartName = strings.Trim(req.ChartInfo.ChartName, " ")
-	if req.ChartInfo.ChartName == "" {
-		errMsg = "请填写图表名称!"
-		err = errors.New(errMsg)
-		isSendEmail = false
-		return
-	}
-
-	//判断图表是否存在
-	var condition string
-	var pars []interface{}
-
-	// todo 判断同一个平台上的图表是否重复
-	condition += " AND chart_name=? AND source = ? "
-	pars = append(pars, req.ChartInfo.ChartName, req.ChartInfo.Source)
+	return
+}
 
-	count, err := models.GetChartInfoCountByCondition(condition, pars)
+// UpdateChart 更新社区里的图表接口
+func UpdateChart(chartInfoId int) (err error, errMsg string) {
+	// 查询图表信息
+	chartInfo, err := models.GetChartInfoById(chartInfoId)
 	if err != nil {
-		errMsg = "判断图表名称是否存在失败"
-		err = errors.New("判断图表名称是否存在失败,Err:" + err.Error())
+		if err.Error() == utils.ErrNoRow() {
+			errMsg = "图表不存在"
+			err = fmt.Errorf(errMsg)
+			return
+		}
+		errMsg = "获取图表信息失败"
+		err = fmt.Errorf("获取图表信息失败,Err:" + err.Error())
 		return
 	}
 
-	if count > 0 {
-		errMsg = "图表已存在"
-		err = errors.New("图表已存在")
-		isSendEmail = false
+	if chartInfo.ForumChartInfoId <= 0 {
 		return
 	}
-
-	// 添加指标数据
-	err = BatchAddOrUpdateEdbData(req.EdbInfoDataList)
+	//查询图表指标
+	//获取原图表关联的指标信息列表
+	chartMappingList, err := models.GetChartMappingList(chartInfoId)
 	if err != nil {
-		errMsg = "添加指标数据失败"
-		err = errors.New("添加指标数据失败,Err:" + err.Error())
+		errMsg = "获取图表关联的指标信息失败"
+		err = fmt.Errorf("获取图表关联的指标信息失败,Err:" + err.Error())
 		return
 	}
-	// 查询指标ID和指标编码之间的关系
-	originEdbInfoIdMap := make(map[int]string)
-	for _, v := range req.EdbInfoList {
-		originEdbInfoIdMap[v.EdbInfoId] = v.EdbCode
+	edbIds := make([]int, 0)
+	for _, v := range chartMappingList {
+		edbIds = append(edbIds, v.EdbInfoId)
 	}
-	// 添加关联指标
-	var edbInfoIdArr []int
-	edbInfoList := make([]*models.EdbInfo, 0)
-	edbInfoList, err, errMsg, isSendEmail = BatchAddOrUpdateEdbInfo(req.EdbInfoList, req.EdbInfoCalculateMapping, sysUserId, sysUserRealName)
+	var (
+		edbInfoList     []*models.EdbInfo
+		edbMappingList  []*models.EdbInfoCalculateMapping
+		edbInfoDataList []*eta_forum.AddEdbDataReq
+	)
+	//查询指标详情
+	edbInfoList, edbMappingList, edbInfoDataList, err = GetEdbListByEdbInfoId(edbIds)
 	if err != nil {
-		errMsg = "添加关联指标失败"
-		err = errors.New("添加关联指标失败,Err:" + err.Error())
+		errMsg = "获取指标详情失败"
+		err = fmt.Errorf("获取指标详情失败,Err:" + err.Error())
 		return
 	}
-	edbCodeMap := make(map[string]*models.EdbInfo, 0)
-	for _, v := range edbInfoList {
-		edbCodeMap[v.EdbCode] = v
-		edbInfoIdArr = append(edbInfoIdArr, v.EdbInfoId)
-	}
-
-	// todo 批量新增指标
-	sort.Ints(edbInfoIdArr)
-	var edbInfoIdArrStr []string
-	for _, v := range edbInfoIdArr {
-		edbInfoIdArrStr = append(edbInfoIdArrStr, strconv.Itoa(v))
-	}
-	edbInfoIdStr := strings.Join(edbInfoIdArrStr, ",")
-
-	chartInfo = new(models.ChartInfo)
-	chartInfo.ChartName = req.ChartInfo.ChartName
-	chartInfo.EdbInfoIds = edbInfoIdStr
-	chartInfo.SysUserId = req.ChartInfo.SysUserId
-	chartInfo.SysUserRealName = req.ChartInfo.SysUserRealName
-	chartInfo.CreateTime = time.Now()
-	chartInfo.ModifyTime = time.Now()
-	chartInfo.IsSetName = req.ChartInfo.IsSetName
-	timestamp := strconv.FormatInt(time.Now().UnixNano(), 10)
-
-	// todo 是否需要单独生成一个指标图表序列ID
-	chartInfo.UniqueCode = utils.MD5(utils.CHART_PREFIX + "_" + timestamp)
-	chartInfo.DateType = req.ChartInfo.DateType
-	chartInfo.ChartType = req.ChartInfo.ChartType
+	req := new(eta_forum.ChartSaveLibReq)
+	req.ChartInfo = chartInfo
+	req.ChartInfo.ChartInfoId = chartInfo.ForumChartInfoId
+	req.ChartEdbMapping = chartMappingList
+	req.EdbInfoList = edbInfoList
+	req.EdbInfoDataList = edbInfoDataList
+	req.EdbInfoCalculateMapping = edbMappingList
 
-	calendar := req.ChartInfo.Calendar
-	chartInfo.Calendar = calendar
-	chartInfo.StartDate = req.ChartInfo.StartDate
-	chartInfo.EndDate = req.ChartInfo.EndDate
-	chartInfo.SeasonStartDate = req.ChartInfo.StartDate
-	chartInfo.SeasonEndDate = req.ChartInfo.EndDate
-	chartInfo.LeftMin = req.ChartInfo.LeftMin
-	chartInfo.LeftMax = req.ChartInfo.LeftMax
-	chartInfo.RightMin = req.ChartInfo.RightMin
-	chartInfo.RightMax = req.ChartInfo.RightMax
-	chartInfo.Right2Min = req.ChartInfo.Right2Min
-	chartInfo.Right2Max = req.ChartInfo.Right2Max
-	chartInfo.MinMaxSave = req.ChartInfo.MinMaxSave
-	chartInfo.Disabled = req.ChartInfo.Disabled
-	chartInfo.BarConfig = req.ChartInfo.BarConfig
-	chartInfo.ExtraConfig = req.ChartInfo.ExtraConfig
-	chartInfo.SeasonExtraConfig = req.ChartInfo.SeasonExtraConfig
-	chartInfo.StartYear = req.ChartInfo.StartYear
-	chartInfo.Source = req.ChartInfo.Source
-	chartInfo.ChartThemeId = req.ChartInfo.ChartThemeId
-	chartInfo.SourcesFrom = req.ChartInfo.SourcesFrom
-	chartInfo.Instructions = req.ChartInfo.Instructions
-	chartInfo.MarkersLines = req.ChartInfo.MarkersLines
-	chartInfo.MarkersAreas = req.ChartInfo.MarkersAreas
-	chartInfo.Unit = req.ChartInfo.Unit
-	chartInfo.UnitEn = req.ChartInfo.UnitEn
-	newId, err := models.AddChartInfo(chartInfo)
+	// 添加计算指标
+	reqJson, err := json.Marshal(req)
 	if err != nil {
-		errMsg = `保存失败`
-		err = errors.New("保存失败,Err:" + err.Error())
+		errMsg = "参数解析异常"
+		err = fmt.Errorf("参数解析异常,Err:" + err.Error())
 		return
 	}
-	chartInfo.ChartInfoId = int(newId)
-
-	// todo 先整理好指标信息,生成指标ID,再将图表和指标ID进行绑定
-	chartEdbInfoList := req.ChartEdbMapping
-	mapList := make([]*models.ChartEdbMapping, 0)
-	for _, v := range chartEdbInfoList {
-		mapItem := new(models.ChartEdbMapping)
-		mapItem.ChartInfoId = int(newId)
-		edbCode, ok := originEdbInfoIdMap[v.EdbInfoId]
-		if !ok {
-			err = fmt.Errorf("指标代码不存在,EdbCode:%s", v.EdbCode)
-			errMsg = "指标代码不存在"
-			return
-		}
-		edbBase, ok := edbCodeMap[edbCode]
-		if !ok {
-			err = fmt.Errorf("指标代码不存在,EdbCode:%s", v.EdbCode)
-			errMsg = "指标代码不存在"
-			return
-		}
-		mapItem.EdbInfoId = edbBase.EdbInfoId
-		mapItem.CreateTime = time.Now()
-		mapItem.ModifyTime = time.Now()
-		timestamp := strconv.FormatInt(time.Now().UnixNano(), 10)
-		mapItem.UniqueCode = utils.MD5(fmt.Sprint(utils.CHART_PREFIX, "_", edbBase.EdbInfoId, "_", timestamp))
-		mapItem.MaxData = v.MaxData
-		mapItem.MinData = v.MinData
-		mapItem.IsOrder = v.IsOrder
-		mapItem.IsAxis = v.IsAxis
-		mapItem.EdbInfoType = v.EdbInfoType
-		mapItem.LeadValue = v.LeadValue
-		mapItem.LeadUnit = v.LeadUnit
-		mapItem.ChartStyle = v.ChartStyle
-		mapItem.ChartColor = v.ChartColor
-		mapItem.PredictChartColor = v.PredictChartColor
-		mapItem.ChartWidth = v.ChartWidth
-		mapItem.Source = v.Source
-		mapItem.EdbAliasName = v.EdbAliasName
-		mapItem.IsConvert = v.IsConvert
-		mapItem.ConvertType = v.ConvertType
-		mapItem.ConvertValue = v.ConvertValue
-		mapItem.ConvertUnit = v.ConvertUnit
-		mapItem.ConvertEnUnit = v.ConvertEnUnit
-		mapItem.EdbCode = edbCode
-		mapList = append(mapList, mapItem)
-	}
-	if len(mapList) <= 0 {
-		errMsg = `图表指标映射不能为空`
-		err = errors.New("图表指标映射不能为空")
+	respItem, err := eta_forum.ChartUpdateLib(string(reqJson))
+	if err != nil {
+		errMsg = "更新失败"
+		err = fmt.Errorf("上传失败,Err:" + err.Error())
 		return
 	}
-	err = models.AddChartEdbMapping(mapList)
-	if err != nil {
-		errMsg = `保存失败`
-		err = errors.New("保存失败,Err:" + err.Error())
+	if respItem.Ret != 200 {
+		errMsg = "更新失败"
+		err = fmt.Errorf(respItem.ErrMsg)
 		return
 	}
+
 	return
 }
 
-// UpdateChartInfoAndEdbInfo 刷新图表信息和指标信息
-func UpdateChartInfoAndEdbInfo(req *models.AddChartReq, sysUserId int, sysUserRealName string) (chartInfo *models.ChartInfo, err error, errMsg string, isSendEmail bool) {
-
-	isSendEmail = true // 默认错误的时候要发送邮件
-
-	req.ChartInfo.ChartName = strings.Trim(req.ChartInfo.ChartName, " ")
-	if req.ChartInfo.ChartName == "" {
-		errMsg = "请填写图表名称!"
-		err = errors.New(errMsg)
-		isSendEmail = false
-		return
-	}
-
-	chartInfo, err = models.GetChartInfoById(req.ChartInfo.ChartInfoId)
-	if err != nil {
-		if err.Error() == utils.ErrNoRow() {
-			errMsg = "图表已被删除,请刷新页面"
-			err = errors.New(errMsg)
-			isSendEmail = false
+func GetEdbListByEdbInfoId(edbInfoIds []int) (edbInfoList []*models.EdbInfo, edbMappingList []*models.EdbInfoCalculateMapping, edbInfoDataList []*eta_forum.AddEdbDataReq, err error) {
+	//查询指标信息
+	//查询指标映射
+	//查询所有指标数据
+	//查询这个指标相关的mapping信息放到数组里,
+	//将得到的指标ID信息放到数组里
+	hasFindMap := make(map[int]struct{})
+	edbInfoIdMap := make(map[int]struct{})
+	edbMappingList = make([]*models.EdbInfoCalculateMapping, 0)
+	edbMappingMap := make(map[int]struct{})
+	for _, edbInfoId := range edbInfoIds {
+		edbMappingList, err = traceEdbInfoByEdbInfoId(edbInfoId, hasFindMap, edbInfoIdMap, edbMappingList, edbMappingMap)
+		if err != nil {
 			return
 		}
-		errMsg = "获取图表信息失败"
-		err = errors.New("获取图表信息失败,Err:" + err.Error())
-		return
-	}
-
-	//判断图表是否存在
-	var condition string
-	var pars []interface{}
-
-	// todo 判断同一个平台上的图表是否重复
-	condition += " AND chart_name=? AND source = ? AND chart_info_id<>? "
-	pars = append(pars, req.ChartInfo.ChartName, req.ChartInfo.Source, req.ChartInfo.ChartInfoId)
-
-	count, err := models.GetChartInfoCountByCondition(condition, pars)
-	if err != nil {
-		errMsg = "判断图表名称是否存在失败"
-		err = errors.New("判断图表名称是否存在失败,Err:" + err.Error())
-		return
-	}
-
-	if count > 0 {
-		errMsg = "图表已存在"
-		err = errors.New("图表已存在")
-		isSendEmail = false
-		return
-	}
-
-	// 添加指标数据
-	err = BatchAddOrUpdateEdbData(req.EdbInfoDataList)
-	if err != nil {
-		errMsg = "添加指标数据失败"
-		err = errors.New("添加指标数据失败,Err:" + err.Error())
-		return
-	}
-	// 查询指标ID和指标编码之间的关系
-	originEdbInfoIdMap := make(map[int]string)
-	for _, v := range req.EdbInfoList {
-		originEdbInfoIdMap[v.EdbInfoId] = v.EdbCode
-	}
-	// 添加关联指标
-	var edbInfoIdArr []int
-	edbInfoList := make([]*models.EdbInfo, 0)
-	edbInfoList, err, errMsg, isSendEmail = BatchAddOrUpdateEdbInfo(req.EdbInfoList, req.EdbInfoCalculateMapping, sysUserId, sysUserRealName)
-	if err != nil {
-		errMsg = "添加关联指标失败"
-		err = errors.New("添加关联指标失败,Err:" + err.Error())
-		return
-	}
-	edbCodeMap := make(map[string]*models.EdbInfo, 0)
-	for _, v := range edbInfoList {
-		edbCodeMap[v.EdbCode] = v
-		edbInfoIdArr = append(edbInfoIdArr, v.EdbInfoId)
 	}
 
-	// todo 批量新增指标
-	sort.Ints(edbInfoIdArr)
-	var edbInfoIdArrStr []string
-	for _, v := range edbInfoIdArr {
-		edbInfoIdArrStr = append(edbInfoIdArrStr, strconv.Itoa(v))
+	// 指标信息map
+	edbInfoIdList := make([]int, 0)
+	for k, _ := range edbInfoIdMap {
+		edbInfoIdList = append(edbInfoIdList, k)
 	}
-	edbInfoIdStr := strings.Join(edbInfoIdArrStr, ",")
-
-	chartInfo.ChartName = req.ChartInfo.ChartName
-	chartInfo.EdbInfoIds = edbInfoIdStr
-	chartInfo.SysUserId = req.ChartInfo.SysUserId
-	chartInfo.SysUserRealName = req.ChartInfo.SysUserRealName
-	chartInfo.ModifyTime = time.Now()
-	chartInfo.IsSetName = req.ChartInfo.IsSetName
-	chartInfo.DateType = req.ChartInfo.DateType
-	chartInfo.ChartType = req.ChartInfo.ChartType
-
-	calendar := req.ChartInfo.Calendar
-	chartInfo.Calendar = calendar
-	chartInfo.StartDate = req.ChartInfo.StartDate
-	chartInfo.EndDate = req.ChartInfo.EndDate
-	chartInfo.SeasonStartDate = req.ChartInfo.StartDate
-	chartInfo.SeasonEndDate = req.ChartInfo.EndDate
-	chartInfo.LeftMin = req.ChartInfo.LeftMin
-	chartInfo.LeftMax = req.ChartInfo.LeftMax
-	chartInfo.RightMin = req.ChartInfo.RightMin
-	chartInfo.RightMax = req.ChartInfo.RightMax
-	chartInfo.Right2Min = req.ChartInfo.Right2Min
-	chartInfo.Right2Max = req.ChartInfo.Right2Max
-	chartInfo.MinMaxSave = req.ChartInfo.MinMaxSave
-	chartInfo.Disabled = req.ChartInfo.Disabled
-	chartInfo.BarConfig = req.ChartInfo.BarConfig
-	chartInfo.ExtraConfig = req.ChartInfo.ExtraConfig
-	chartInfo.SeasonExtraConfig = req.ChartInfo.SeasonExtraConfig
-	chartInfo.StartYear = req.ChartInfo.StartYear
-	chartInfo.Source = req.ChartInfo.Source
-	chartInfo.ChartThemeId = req.ChartInfo.ChartThemeId
-	chartInfo.SourcesFrom = req.ChartInfo.SourcesFrom
-	chartInfo.Instructions = req.ChartInfo.Instructions
-	chartInfo.MarkersLines = req.ChartInfo.MarkersLines
-	chartInfo.MarkersAreas = req.ChartInfo.MarkersAreas
-	chartInfo.Unit = req.ChartInfo.Unit
-	chartInfo.UnitEn = req.ChartInfo.UnitEn
-	err = chartInfo.Update([]string{})
+	edbInfoList, err = models.GetEdbInfoByIdList(edbInfoIdList)
 	if err != nil {
-		errMsg = `更新失败`
-		err = errors.New("更新失败,Err:" + err.Error())
+		err = fmt.Errorf("traceEdbInfoByEdbInfoId GetEdbInfoByIdList err: %s", err.Error())
 		return
 	}
 
-	// 处理映射,已存在的映射直接更新,不存在的映射再新增,同时删除旧的映射关系
-	oldChartEdbMappingList, err := models.GetChartEdbMappingListV2(chartInfo.ChartInfoId)
-
-	oldMappingIdMap := make(map[string]*models.ChartEdbMapping)
-	removeMapping := make(map[int]struct{})
-	for _, v := range oldChartEdbMappingList {
-		name := fmt.Sprintf("%s-%s", v.EdbCode, v.Source)
-		oldMappingIdMap[name] = v
-		removeMapping[v.ChartEdbMappingId] = struct{}{}
-	}
-	// todo 先整理好指标信息,生成指标ID,再将图表和指标ID进行绑定
-	chartEdbInfoList := req.ChartEdbMapping
-	addMappingList := make([]*models.ChartEdbMapping, 0)
-	for _, v := range chartEdbInfoList {
-		mapItem := new(models.ChartEdbMapping)
-		mapItem.ChartInfoId = chartInfo.ChartInfoId
-		edbCode, ok := originEdbInfoIdMap[v.EdbInfoId]
-		if !ok {
-			err = fmt.Errorf("指标代码不存在,EdbCode:%s", v.EdbCode)
-			errMsg = "指标代码不存在"
-			return
-		}
-		edbBase, ok := edbCodeMap[edbCode]
-		if !ok {
-			err = fmt.Errorf("指标代码不存在,EdbCode:%s", v.EdbCode)
-			errMsg = "指标代码不存在"
+	for _, v := range edbInfoList {
+		dataList, e := models.GetEdbDataBaseByEdbCode(v.EdbInfoId, v.Source, v.SubSource)
+		if e != nil {
+			err = fmt.Errorf("查询指标数据失败 Err: %s", e.Error())
 			return
 		}
-		// 判断是否已经存在映射关系
-		existName := fmt.Sprintf("%s-%s", edbCode, v.Source)
-		if oldMapping, ok1 := oldMappingIdMap[existName]; ok1 {
-			//更新映射关系
-			mapItem = oldMapping
-			mapItem.ModifyTime = time.Now()
-			mapItem.MaxData = v.MaxData
-			mapItem.MinData = v.MinData
-			mapItem.IsOrder = v.IsOrder
-			mapItem.IsAxis = v.IsAxis
-			mapItem.EdbInfoType = v.EdbInfoType
-			mapItem.LeadValue = v.LeadValue
-			mapItem.LeadUnit = v.LeadUnit
-			mapItem.ChartStyle = v.ChartStyle
-			mapItem.ChartColor = v.ChartColor
-			mapItem.PredictChartColor = v.PredictChartColor
-			mapItem.ChartWidth = v.ChartWidth
-			mapItem.Source = v.Source
-			mapItem.EdbAliasName = v.EdbAliasName
-			mapItem.IsConvert = v.IsConvert
-			mapItem.ConvertType = v.ConvertType
-			mapItem.ConvertValue = v.ConvertValue
-			mapItem.ConvertUnit = v.ConvertUnit
-			mapItem.ConvertEnUnit = v.ConvertEnUnit
-			mapItem.EdbCode = edbCode
-
-			err = mapItem.Update([]string{})
-			if err != nil {
-				errMsg = `更新失败`
-				err = errors.New("更新图表指标映射关系失败,Err:" + err.Error())
-				return
-			}
-			delete(removeMapping, mapItem.ChartEdbMappingId)
-		} else {
-			mapItem.EdbInfoId = edbBase.EdbInfoId
-			mapItem.CreateTime = time.Now()
-			mapItem.ModifyTime = time.Now()
-			timestamp := strconv.FormatInt(time.Now().UnixNano(), 10)
-			mapItem.UniqueCode = utils.MD5(fmt.Sprint(utils.CHART_PREFIX, "_", edbBase.EdbInfoId, "_", timestamp))
-			mapItem.MaxData = v.MaxData
-			mapItem.MinData = v.MinData
-			mapItem.IsOrder = v.IsOrder
-			mapItem.IsAxis = v.IsAxis
-			mapItem.EdbInfoType = v.EdbInfoType
-			mapItem.LeadValue = v.LeadValue
-			mapItem.LeadUnit = v.LeadUnit
-			mapItem.ChartStyle = v.ChartStyle
-			mapItem.ChartColor = v.ChartColor
-			mapItem.PredictChartColor = v.PredictChartColor
-			mapItem.ChartWidth = v.ChartWidth
-			mapItem.Source = v.Source
-			mapItem.EdbAliasName = v.EdbAliasName
-			mapItem.IsConvert = v.IsConvert
-			mapItem.ConvertType = v.ConvertType
-			mapItem.ConvertValue = v.ConvertValue
-			mapItem.ConvertUnit = v.ConvertUnit
-			mapItem.ConvertEnUnit = v.ConvertEnUnit
-			mapItem.EdbCode = edbCode
-			addMappingList = append(addMappingList, mapItem)
-		}
 
+		tmp := new(eta_forum.AddEdbDataReq)
+		tmp.EdbCode = v.EdbCode
+		tmp.DataList = dataList
+		edbInfoDataList = append(edbInfoDataList, tmp)
 	}
-	if len(addMappingList) > 0 {
-		err = models.AddChartEdbMapping(addMappingList)
-		if err != nil {
-			errMsg = `保存失败`
-			err = errors.New("保存失败,Err:" + err.Error())
-			return
-		}
-	}
-
-	// 删除原先的绑定关系
-	if len(removeMapping) > 0 {
-		removeIdList := make([]string, 0) //需要移除的日期
-		for _, v := range removeMapping {
-			removeIdList = append(removeIdList, fmt.Sprint(v))
-		}
-		removeIdStr := strings.Join(removeIdList, `","`)
-		removeIdStr = `"` + removeIdStr + `"`
-		err = models.DeleteChartEdbMappingByChartEdbMappingId(removeIdStr)
-		if err != nil {
-			errMsg = `删除失败`
-			err = errors.New("删除失败,Err:" + err.Error())
-			return
-		}
-	}
-
 	return
 }
 
-// 删除图表信息
-func DeleteChart(chartInfoId int) (err error, errMsg string) {
-	//删除图表
-	chartInfo, err := models.GetChartInfoById(chartInfoId)
-	if err != nil {
-		if err.Error() == utils.ErrNoRow() {
-			errMsg = "图表已删除,请刷新页面"
-			err = fmt.Errorf("图表不存在,Err:" + err.Error())
-			return
-		} else {
-			errMsg = "删除失败"
-			err = fmt.Errorf("删除失败, 获取图表信息失败Err:" + err.Error())
-			return
-		}
-	}
-	if chartInfo == nil {
-		errMsg = "图表已删除,请刷新页面"
-		err = fmt.Errorf(errMsg)
+// traceEdbInfoByEdbInfoId 指标追溯
+func traceEdbInfoByEdbInfoId(edbInfoId int, hasFindMap map[int]struct{}, edbInfoIdMap map[int]struct{}, edbMappingList []*models.EdbInfoCalculateMapping, edbMappingMap map[int]struct{}) (newEdbMappingList []*models.EdbInfoCalculateMapping, err error) {
+	newEdbMappingList = edbMappingList
+
+	_, ok := hasFindMap[edbInfoId]
+	if ok {
 		return
 	}
-	// 处理映射,已存在的映射直接更新,不存在的映射再新增,同时删除旧的映射关系
-	oldChartEdbMappingList, err := models.GetChartEdbMappingListV2(chartInfo.ChartInfoId)
 
-	edbInfoIds := make([]int, 0)
-	for _, v := range oldChartEdbMappingList {
-		edbInfoIds = append(edbInfoIds, v.EdbInfoId)
+	if _, ok1 := edbInfoIdMap[edbInfoId]; !ok1 {
+		edbInfoIdMap[edbInfoId] = struct{}{}
 	}
 
-	//删除图表及关联指标
-	err = models.DeleteChartInfoAndData(chartInfo.ChartInfoId)
-	if err != nil {
-		errMsg = "删除失败"
-		err = fmt.Errorf("删除图表数据失败, Err:" + err.Error())
+	edbInfoMappingList, e := models.GetEdbInfoCalculateMappingListByEdbInfoId(edbInfoId)
+	if e != nil {
+		err = fmt.Errorf("GetEdbInfoCalculateMappingListByEdbInfoId err: %s", e.Error())
 		return
 	}
 
-	err, errMsg = BatchDeleteEdbInfo(edbInfoIds)
-	if err != nil {
-		errMsg = "删除失败"
-		err = fmt.Errorf("删除指标数据失败, Err:" + err.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 := &models.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
 }

+ 0 - 48
services/edb_data.go

@@ -1,48 +0,0 @@
-package services
-
-import (
-	"eta/eta_forum_task/models"
-	"eta/eta_forum_task/models/mgodb"
-	"fmt"
-)
-
-func BatchAddOrUpdateEdbData(req []*models.AddEdbDataReq) (err error) {
-	for _, reqData := range req {
-		err = AddOrUpdateEdbData(reqData.EdbCode, reqData.DataList)
-		if err != nil {
-			return
-		}
-	}
-	return
-}
-
-func AddOrUpdateEdbData(edbCode string, dataList []*mgodb.EdbDataBase) (err error) {
-	addList := make([]interface{}, 0)
-	existList, err := mgodb.GetEdbDataBaseByEdbCode(edbCode)
-	if err != nil {
-		err = fmt.Errorf("查询指标数据出错 error, %v", err)
-		return
-	}
-	existMap := make(map[string]string, len(existList))
-	for _, exist := range existList {
-		existMap[exist.DataTime] = exist.Value
-	}
-	for _, v := range dataList {
-		if oldVal, ok := existMap[v.DataTime]; !ok {
-			v.EdbInfoId = 0
-			addList = append(addList, v)
-		} else {
-			if v.Value != oldVal {
-				err = mgodb.ModifyValueEdbInfoDataStatus(v.EdbCode, v.DataTime, v.Value)
-				if err != nil {
-					err = fmt.Errorf("更新指标数据出错 error, %v", err)
-					return
-				}
-			}
-		}
-	}
-	if len(addList) > 0 {
-		err = mgodb.InsertBatch(addList)
-	}
-	return
-}

+ 0 - 231
services/edb_info.go

@@ -1,231 +0,0 @@
-package services
-
-import (
-	"errors"
-	"eta/eta_forum_task/models"
-	"eta/eta_forum_task/models/mgodb"
-	"eta/eta_forum_task/utils"
-	"strconv"
-	"time"
-)
-
-// BatchAddOrUpdateEdbInfo 添加批量添加指标到指标库
-func BatchAddOrUpdateEdbInfo(edbList []*models.EdbInfo, edbMapping []*models.EdbInfoCalculateMapping, sysUserId int, sysUserRealName string) (newList []*models.EdbInfo, err error, errMsg string, isSendEmail bool) {
-	isSendEmail = true
-	edbCodeMap := make(map[string]*models.EdbInfo)
-	for _, v := range edbList {
-		tmp, e, msg, _ := AddOrUpdateEdbInfo(v, sysUserId, sysUserRealName)
-		if e != nil {
-			err = e
-			errMsg = msg
-			return
-		}
-		newList = append(newList, tmp)
-		edbCodeMap[tmp.EdbCode] = tmp
-	}
-	//批量添加指标的mapping信息
-	calculateMappingItemList := make([]*models.EdbInfoCalculateMapping, 0)
-	for _, v := range edbMapping {
-		edbInfo, ok := edbCodeMap[v.EdbCode]
-		if !ok {
-			continue
-		}
-		fromEdbInfo, ok := edbCodeMap[v.FromEdbCode]
-		if !ok {
-			continue
-		}
-
-		calculateMappingItem := new(models.EdbInfoCalculateMapping)
-		calculateMappingItem.CreateTime = time.Now()
-		calculateMappingItem.ModifyTime = time.Now()
-		calculateMappingItem.Sort = v.Sort
-		calculateMappingItem.EdbCode = edbInfo.EdbCode
-		calculateMappingItem.EdbInfoId = edbInfo.EdbInfoId
-		calculateMappingItem.FromEdbInfoId = fromEdbInfo.EdbInfoId
-		calculateMappingItem.FromEdbCode = fromEdbInfo.EdbCode
-		calculateMappingItem.FromEdbName = fromEdbInfo.EdbName
-		calculateMappingItem.FromSource = fromEdbInfo.Source
-		calculateMappingItem.FromSourceName = fromEdbInfo.SourceName
-		calculateMappingItem.FromTag = v.FromTag
-		calculateMappingItem.Source = edbInfo.Source
-		calculateMappingItem.SourceName = edbInfo.SourceName
-		calculateMappingItem.FromSubSource = edbInfo.SubSource
-		calculateMappingItemList = append(calculateMappingItemList, calculateMappingItem)
-	}
-	err = models.AddEdbInfoCalculateMappingMulti(calculateMappingItemList)
-	if err != nil {
-		errMsg = "指标映射关系添加失败"
-		return
-	}
-	return
-}
-
-// AddOrUpdateEdbInfo 添加指标到指标库
-func AddOrUpdateEdbInfo(edbItem *models.EdbInfo, sysUserId int, sysUserRealName string) (edbInfo *models.EdbInfo, err error, errMsg string, isSendEmail bool) {
-	isSendEmail = true
-	//判断指标是否存在
-	edbInfo, err = models.GetEdbInfoByEdbCode(edbItem.Source, edbItem.EdbCode)
-	if err != nil {
-		if err.Error() == utils.ErrNoRow() {
-			err = nil
-		} else {
-			errMsg = "判断指标名称是否存在失败"
-			err = errors.New("判断指标名称是否存在失败,Err:" + err.Error())
-			return
-		}
-	}
-	var edbInfoId int64
-	// 指标已存在
-	if edbInfo != nil && edbInfo.EdbInfoId > 0 {
-		edbInfoId = int64(edbInfo.EdbInfoId)
-		// 更新指标信息
-		edbInfo.Source = edbItem.Source
-		edbInfo.SourceName = edbItem.SourceName
-		edbInfo.EdbType = edbItem.EdbType
-		edbInfo.EdbCode = edbItem.EdbCode
-		edbInfo.EdbName = edbItem.EdbName
-		edbInfo.EdbNameSource = edbItem.EdbNameSource
-		edbInfo.Frequency = edbItem.Frequency
-		edbInfo.Unit = edbItem.Unit
-		edbInfo.StartDate = edbItem.StartDate
-		edbInfo.EndDate = edbItem.EndDate
-		edbInfo.ClassifyId = edbItem.ClassifyId
-		edbInfo.SysUserId = sysUserId
-		edbInfo.SysUserRealName = sysUserRealName
-		edbInfo.ModifyTime = time.Now()
-		edbInfo.ServerUrl = edbItem.ServerUrl
-		edbInfo.Sort = edbItem.Sort
-		edbInfo.DataDateType = edbItem.DataDateType
-		edbInfo.TerminalCode = edbItem.TerminalCode
-		edbInfo.SourceIndexName = edbItem.SourceIndexName
-
-		edbInfo.MaxValue = edbItem.MaxValue
-		edbInfo.MinValue = edbItem.MinValue
-		edbInfo.EdbType = edbItem.EdbType
-		err = edbInfo.Update([]string{})
-		if err != nil {
-			errMsg = "保存失败"
-			err = errors.New("保存失败,Err:" + err.Error())
-			return
-		}
-		//同时删除指标的映射信息
-		err = models.DeleteEdbInfoMapping(edbInfoId)
-		if err != nil {
-			errMsg = "删除指标映射信息失败"
-			err = errors.New("删除指标映射信息失败,Err:" + err.Error())
-			return
-		}
-	} else {
-		edbInfo = new(models.EdbInfo)
-		edbInfo.Source = edbItem.Source
-		edbInfo.SourceName = edbItem.SourceName
-		edbInfo.EdbType = edbItem.EdbType
-		edbInfo.EdbCode = edbItem.EdbCode
-		edbInfo.EdbName = edbItem.EdbName
-		edbInfo.EdbNameSource = edbItem.EdbNameSource
-		edbInfo.Frequency = edbItem.Frequency
-		edbInfo.Unit = edbItem.Unit
-		edbInfo.StartDate = edbItem.StartDate
-		edbInfo.EndDate = edbItem.EndDate
-		edbInfo.ClassifyId = edbItem.ClassifyId
-		edbInfo.SysUserId = sysUserId
-		edbInfo.SysUserRealName = sysUserRealName
-		edbInfo.CreateTime = time.Now()
-		edbInfo.ModifyTime = time.Now()
-		edbInfo.ServerUrl = edbItem.ServerUrl
-		edbInfo.Sort = edbItem.Sort
-		edbInfo.DataDateType = edbItem.DataDateType
-		edbInfo.TerminalCode = edbItem.TerminalCode
-		edbInfo.SourceIndexName = edbItem.SourceIndexName
-		timestamp := strconv.FormatInt(time.Now().UnixNano(), 10)
-		edbInfo.UniqueCode = utils.MD5(utils.DATA_PREFIX + "_" + timestamp)
-
-		edbInfo.MaxValue = edbItem.MaxValue
-		edbInfo.MinValue = edbItem.MinValue
-		edbInfo.EdbType = edbItem.EdbType
-		edbInfoId, err = models.AddEdbInfo(edbInfo)
-		if err != nil {
-			errMsg = "保存失败"
-			err = errors.New("保存失败,Err:" + err.Error())
-			return
-		}
-		edbInfo.EdbInfoId = int(edbInfoId)
-	}
-
-	err = mgodb.ModifyEdbInfoDataStatus(edbInfoId, edbInfo.EdbCode)
-	if err != nil {
-		errMsg = "保存失败"
-		err = errors.New("更新指标数据失败,Err:" + err.Error())
-		return
-	}
-
-	return
-}
-
-// 批量删除指标,
-func BatchDeleteEdbInfo(edbInfoIds []int) (err error, errMsg string) {
-	for _, v := range edbInfoIds {
-		//查询单个指标是否允许删除
-		err, errMsg = DeleteEdbInfo(v)
-		if err != nil {
-			errMsg = "删除指标失败"
-			return
-		}
-	}
-	return
-}
-
-// 删除单个指标
-func DeleteEdbInfo(edbInfoId int) (err error, errMsg string) {
-	//判断指标是否存在
-	_, err = models.GetEdbInfoById(edbInfoId)
-	if err != nil {
-		if err.Error() == utils.ErrNoRow() {
-			err = nil
-			return
-		} else {
-			errMsg = "判断指标名称是否存在失败"
-			err = errors.New("判断指标名称是否存在失败,Err:" + err.Error())
-			return
-		}
-	}
-	//判断指标是否用于作图,如果用于作图,则不可删除
-	chartCount, tmpErr := models.GetChartEdbMappingCount(edbInfoId)
-	if tmpErr != nil && tmpErr.Error() != utils.ErrNoRow() {
-		errMsg = "删除失败"
-		err = errors.New("判断指标是否被用于作图失败,Err:" + tmpErr.Error())
-		return
-	}
-	if chartCount > 0 {
-		errMsg = "当前指标已用作画图,不可删除"
-		return
-	}
-
-	//判断指标是否用作其他指标的计算
-	calculateCount, tmpErr := models.GetEdbInfoCalculateMappingCount(edbInfoId)
-	if tmpErr != nil {
-		errMsg = "删除失败"
-		err = errors.New("判断指标是否被用于计算失败,GetEdbInfoCalculateCount Err:" + tmpErr.Error())
-		return
-	}
-	if calculateCount > 0 {
-		errMsg = "当前指标已用作,指标运算,不可删除"
-		return
-	}
-
-	// 删除指标,删除映射关系,删除指标数据
-	err = models.DeleteEdbInfo(edbInfoId)
-	if err != nil {
-		errMsg = "删除失败"
-		err = errors.New("删除指标失败,Err:" + err.Error())
-		return
-	}
-
-	err = mgodb.DeleteEdbInfoDataByEdbInfoId(edbInfoId)
-	if err != nil {
-		errMsg = "删除失败"
-		err = errors.New("删除指标数据失败,Err:" + err.Error())
-		return
-	}
-	return
-}

+ 232 - 0
services/eta_forum/eta_forum_hub.go

@@ -0,0 +1,232 @@
+package eta_forum
+
+import (
+	"encoding/json"
+	"eta/eta_forum_task/models"
+	"eta/eta_forum_task/models/chart_theme"
+	"eta/eta_forum_task/utils"
+	"fmt"
+)
+
+type UploadChartToForumReq struct {
+	ChartInfoId int    `description:"图表ID"`
+	Description string `description:"逻辑简述"`
+}
+
+type UpdateChartToForumReq struct {
+	ChartInfoId int `description:"图表ID"`
+}
+
+type ChartSaveLibReq struct {
+	ChartInfo               *models.ChartInfo
+	Description             string `description:"逻辑简述"`
+	EdbInfoList             []*models.EdbInfo
+	ChartThemeList          []*chart_theme.ChartTheme
+	EdbInfoDataList         []*AddEdbDataReq
+	ChartEdbMapping         []*models.ChartEdbMapping
+	EdbInfoCalculateMapping []*models.EdbInfoCalculateMapping
+}
+
+type ChartSaveLibResp struct {
+	Ret         int
+	Msg         string
+	ErrMsg      string
+	ErrCode     string
+	Data        *models.AddChartInfoResp
+	Success     bool `description:"true 执行成功,false 执行失败"`
+	IsSendEmail bool `json:"-" description:"true 发送邮件,false 不发送邮件"`
+	IsAddLog    bool `json:"-" description:"true 新增操作日志,false 不新增操作日志" `
+}
+
+type AddEdbDataReq struct {
+	EdbCode  string
+	DataList []*models.EdbDataBase
+}
+
+type DeleteChartReq struct {
+	ChartInfoId int `description:"图表id"`
+}
+
+// UpdateChart 更新社区里的图表接口
+func UpdateChart(chartInfoId int) (err error, errMsg string) {
+	// 查询图表信息
+	chartInfo, err := models.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 := models.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     []*models.EdbInfo
+		edbMappingList  []*models.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
+
+	// 添加计算指标
+	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 []*models.EdbInfo, edbMappingList []*models.EdbInfoCalculateMapping, edbInfoDataList []*AddEdbDataReq, err error) {
+	//查询指标信息
+	//查询指标映射
+	//查询所有指标数据
+	//查询这个指标相关的mapping信息放到数组里,
+	//将得到的指标ID信息放到数组里
+	hasFindMap := make(map[int]struct{})
+	edbInfoIdMap := make(map[int]struct{})
+	edbMappingList = make([]*models.EdbInfoCalculateMapping, 0)
+	edbMappingMap := make(map[int]struct{})
+	for _, edbInfoId := range edbInfoIds {
+		edbMappingList, err = traceEdbInfoByEdbInfoId(edbInfoId, hasFindMap, edbInfoIdMap, edbMappingList, edbMappingMap)
+		if err != nil {
+			return
+		}
+	}
+
+	// 指标信息map
+	edbInfoIdList := make([]int, 0)
+	for k, _ := range edbInfoIdMap {
+		edbInfoIdList = append(edbInfoIdList, k)
+	}
+	edbInfoList, err = models.GetEdbInfoByIdList(edbInfoIdList)
+	if err != nil {
+		err = fmt.Errorf("traceEdbInfoByEdbInfoId GetEdbInfoByIdList err: %s", err.Error())
+		return
+	}
+
+	for _, v := range edbInfoList {
+		dataList, e := models.GetEdbDataBaseByEdbCode(v.EdbInfoId, v.Source, v.SubSource)
+		if e != nil {
+			err = fmt.Errorf("查询指标数据失败 Err: %s", e.Error())
+			return
+		}
+
+		tmp := new(AddEdbDataReq)
+		tmp.EdbCode = v.EdbCode
+		tmp.DataList = dataList
+		edbInfoDataList = append(edbInfoDataList, tmp)
+	}
+	return
+}
+
+// traceEdbInfoByEdbInfoId 指标追溯
+func traceEdbInfoByEdbInfoId(edbInfoId int, hasFindMap map[int]struct{}, edbInfoIdMap map[int]struct{}, edbMappingList []*models.EdbInfoCalculateMapping, edbMappingMap map[int]struct{}) (newEdbMappingList []*models.EdbInfoCalculateMapping, err error) {
+	newEdbMappingList = edbMappingList
+
+	_, ok := hasFindMap[edbInfoId]
+	if ok {
+		return
+	}
+
+	if _, ok1 := edbInfoIdMap[edbInfoId]; !ok1 {
+		edbInfoIdMap[edbInfoId] = struct{}{}
+	}
+
+	edbInfoMappingList, e := models.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 := &models.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
+}

+ 84 - 0
services/eta_forum/eta_forum_hub_lib.go

@@ -0,0 +1,84 @@
+package eta_forum
+
+import (
+	"encoding/json"
+	"eta/eta_forum_task/models"
+	"eta/eta_forum_task/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
+}
+
+// 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
+}

+ 25 - 0
services/task.go

@@ -0,0 +1,25 @@
+package services
+
+import (
+	"eta/eta_forum_task/utils"
+	"fmt"
+	"github.com/beego/beego/v2/task"
+)
+
+func Task() {
+	fmt.Println("task start")
+	//如果是生产环境,才需要走这些任务
+	if utils.RunMode == "release" {
+		releaseTask()
+	}
+	// 定时更新图表数据到eta社区
+	//etaForumChartUpdate := task.NewTask("publishSmartReport", "0 */1 * * * *", EtaForumChartUpdate)
+	//task.AddTask("定时更新图表数据到eta社区", etaForumChartUpdate)
+
+	task.StartTask()
+	fmt.Println("task end")
+}
+
+func releaseTask() {
+
+}

+ 14 - 0
utils/config.go

@@ -69,6 +69,13 @@ var (
 	SyncIndexPath      string // 桥接服务-指标同步服务地址
 )
 
+// eta_forum_hub ETA社区桥接服务地址
+var (
+	ETA_FORUM_HUB_URL     string
+	ETA_FORUM_HUB_NAME_EN string
+	ETA_FORUM_HUB_MD5_KEY string
+)
+
 // AlarmMsgUrl 报警服务地址
 var AlarmMsgUrl string
 
@@ -151,6 +158,13 @@ func init() {
 		DATA_INDEX_NAME = config["data_index_name"]
 		CHART_INDEX_NAME = config["chart_index_name"]
 	}
+
+	// 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"]
+	}
 }
 
 //修改接口文档