فهرست منبع

图表刷新切换

hsun 3 سال پیش
والد
کامیت
c970fb2e05
4فایلهای تغییر یافته به همراه256 افزوده شده و 10 حذف شده
  1. 12 9
      controller/chart/chart_info.go
  2. 126 1
      services/chart/chart_info.go
  3. 111 0
      services/chart/edb_data.go
  4. 7 0
      utils/constants.go

+ 12 - 9
controller/chart/chart_info.go

@@ -405,18 +405,21 @@ func RefreshChartInfo(c *gin.Context)  {
 	}
 
 	// 刷新图表
-	err = chart.RefreshChartInfo(chartInfo.ChartInfoId)
-	if err != nil {
-		{
-			errContent := fmt.Sprint("ErrMsg: 刷新图表关联指标信息失败, " + err.Error())
-			if global.CONFIG.Serve.RunMode == "release" {
-				go services.SendEmail("弘则研报小程序-release-刷新图表报错", errContent, utils.EmailSendToUsers)
-			} else {
-				global.LOG.Info(errContent)
-			}
+	if err = chart.RefreshChart(chartInfo.ChartInfoId); err != nil {
+		errContent := fmt.Sprint("ErrMsg: 刷新图表关联指标信息失败, " + err.Error())
+		if global.CONFIG.Serve.RunMode == "release" {
+			go services.SendEmail("弘则研报小程序-release-刷新图表报错", errContent, utils.EmailSendToUsers)
+		} else {
+			global.LOG.Info(errContent)
 		}
 	}
 
+	//清除图表缓存
+	{
+		key := utils.HZ_CHART_LIB_DETAIL + chartInfo.UniqueCode
+		_ = global.Redis.Del(context.TODO(), key)
+	}
+
 	response.OkData("刷新成功", "", c)
 }
 

+ 126 - 1
services/chart/chart_info.go

@@ -1,6 +1,7 @@
 package chart
 
 import (
+	"errors"
 	"fmt"
 	"hongze/hongze_yb/global"
 	chartEdbMappingModel "hongze/hongze_yb/models/tables/chart_edb_mapping"
@@ -11,6 +12,7 @@ import (
 	"hongze/hongze_yb/models/tables/my_chart_classify"
 	"hongze/hongze_yb/models/tables/yb_chart_daily_visit_log"
 	"hongze/hongze_yb/models/tables/yb_chart_visit_log"
+	"hongze/hongze_yb/services"
 	"hongze/hongze_yb/services/user"
 	"hongze/hongze_yb/utils"
 	"sort"
@@ -642,4 +644,127 @@ func SaveChartVisitLog(userInfo user.UserInfo, chartInfo *chartInfoModel.ChartIn
 	}
 
 	return
-}
+}
+
+// RefreshChart 图表刷新
+func RefreshChart(chartInfoId int) (err error) {
+	var errMsg string
+	defer func() {
+		if err != nil {
+			if global.CONFIG.Serve.RunMode == "release" {
+				go services.SendEmail(utils.APPNAME+"【"+global.CONFIG.Serve.RunMode+"】"+"失败提醒", "RefreshChart:"+errMsg, utils.EmailSendToUsers)
+			}
+			fmt.Println("RefreshChart Err:" + errMsg)
+		}
+	}()
+
+	// 获取需要刷新的指标
+	baseEdbInfoArr, calculateInfoArr, err := GetChartInfoRefreshData(chartInfoId)
+	if err != nil {
+		errMsg = "获取需要刷新的指标失败:Err:" + err.Error()
+		return
+	}
+
+	newBaseEdbInfoArr := make([]*edbInfoModel.EdbInfo, 0)
+	baseMap := make(map[int]*edbInfoModel.EdbInfo)
+	for _, bv := range baseEdbInfoArr {
+		if _, ok := baseMap[bv.EdbInfoId]; !ok {
+			newBaseEdbInfoArr = append(newBaseEdbInfoArr, bv)
+		}
+		baseMap[bv.EdbInfoId] = bv
+	}
+	newCalculateInfoArr := make([]*edbInfoModel.EdbInfo, 0)
+	calculateMap := make(map[int]*edbInfoModel.EdbInfo)
+	var calculateArr []int
+	for _, bv := range calculateInfoArr {
+		if _, ok := calculateMap[bv.EdbInfoId]; !ok {
+			newCalculateInfoArr = append(newCalculateInfoArr, bv)
+			calculateArr = append(calculateArr, bv.EdbInfoId)
+		}
+		calculateMap[bv.EdbInfoId] = bv
+	}
+	sort.Ints(calculateArr)
+
+	// 刷新指标
+	var startDate string
+	for _, bv := range newBaseEdbInfoArr {
+		source := bv.Source
+		edbInfoId := bv.EdbInfoId
+		edbCode := bv.EdbCode
+		startDate = bv.StartDate.Format(utils.FormatDate)
+		frequency := bv.Frequency
+		if startDate == "0000-00-00" {
+			continue
+		}
+		sTime := bv.EndDate
+
+		var limitDay int
+		startDate := ""
+		switch frequency {
+		case "日度":
+			limitDay = utils.DATA_START_REFRESH_LIMIT
+		case "周度":
+			limitDay = utils.DATA_START_REFRESH_LIMIT * 7
+		case "月度":
+			limitDay = utils.DATA_START_REFRESH_LIMIT * 30
+		case "季度":
+			limitDay = utils.DATA_START_REFRESH_LIMIT * 90
+		case "年度":
+			limitDay = utils.DATA_START_REFRESH_LIMIT * 365
+		default:
+			limitDay = utils.DATA_START_REFRESH_LIMIT
+		}
+		startDate = sTime.AddDate(0, 0, -limitDay).Format(utils.FormatDate)
+
+		fmt.Println("source:", source)
+		respItem, err := RefreshEdbData(edbInfoId, source, edbCode, startDate)
+		if err != nil {
+			errMsg = errors.New("RefreshEdbData Err:" + err.Error()).Error()
+			return err
+		}
+		if respItem.Ret != 200 {
+			errMsg = errors.New(respItem.ErrMsg + ";EdbCode:" + edbCode).Error()
+			return err
+		}
+
+		maxAndMinItem, err := edbDataModel.GetEdbInfoMaxAndMinInfo(source, edbCode)
+		if err != nil {
+			return err
+		}
+		if maxAndMinItem != nil {
+			err = edbDataModel.ModifyEdbInfoMaxAndMinInfo(edbInfoId, maxAndMinItem)
+			if err != nil {
+				return err
+			}
+		}
+	}
+
+	// 刷新计算指标
+	for _, v := range calculateArr {
+		edbInfo := calculateMap[v]
+		if edbInfo == nil {
+			return err
+		}
+		startDate = edbInfo.StartDate.Format(utils.FormatDate)
+		source := edbInfo.Source
+
+		if source == utils.DATA_SOURCE_CALCULATE {
+			sTime := edbInfo.EndDate
+			startDate = sTime.Format(utils.FormatDate)
+		}
+
+		result, err := RefreshEdbCalculateData(edbInfo.EdbInfoId, edbInfo.EdbCode, startDate)
+		if err != nil {
+			fmt.Println(v, "RefreshEdbCalculateData err", time.Now())
+			errMsg = "RefreshEdbCalculateData Err:" + err.Error()
+			return err
+		}
+		if result.Ret != 200 {
+			fmt.Println(v, "RefreshEdbCalculateData err;msg:", result.Msg, ";errMsg:", result.ErrMsg)
+			errMsg = fmt.Sprint(v, "RefreshEdbCalculateData err;msg:", result.Msg, ";errMsg:", result.ErrMsg)
+			return fmt.Errorf("刷新失败")
+		}
+	}
+
+	return
+}

+ 111 - 0
services/chart/edb_data.go

@@ -3674,3 +3674,114 @@ func RefreshAllCalculateLjztbpj(edbInfo *edbInfoModel.EdbInfo) (err error) {
 	}
 	return
 }
+
+type RefreshResponse struct {
+	Ret         int
+	Msg         string
+	ErrMsg      string
+	ErrCode     string
+	Data        interface{}
+	Success     bool `description:"true 执行成功,false 执行失败"`
+	IsSendEmail bool `json:"-" description:"true 发送邮件,false 不发送邮件"`
+	IsAddLog    bool `json:"-" description:"true 新增操作日志,false 不新增操作日志" `
+}
+
+// RefreshEdbData 刷新指标数据
+func RefreshEdbData(edbInfoId, source int, edbCode, startDate string) (resp *RefreshResponse, err error) {
+	param := make(map[string]interface{})
+	param["EdbCode"] = edbCode
+	param["EdbInfoId"] = edbInfoId
+	param["StartDate"] = startDate
+	urlStr := ``
+	switch source {
+	case utils.DATA_SOURCE_THS:
+		urlStr = "/ths/refresh"
+	case utils.DATA_SOURCE_WIND:
+		urlStr = "/wind/refresh"
+	case utils.DATA_SOURCE_PB:
+		urlStr = "/pb/refresh"
+	case utils.DATA_SOURCE_MANUAL:
+		urlStr = "/manual/refresh"
+	case utils.DATA_SOURCE_LZ:
+		urlStr = "/lz/refresh"
+	case utils.DATA_SOURCE_YS:
+		urlStr = "/smm/refresh"
+	case utils.DATA_SOURCE_GL:
+		urlStr = "/mysteel/refresh"
+	case utils.DATA_SOURCE_ZZ:
+		urlStr = "/zz/refresh"
+	case utils.DATA_SOURCE_DL:
+		urlStr = "/dl/refresh"
+	case utils.DATA_SOURCE_SH:
+		urlStr = "/sh/refresh"
+	case utils.DATA_SOURCE_CFFEX:
+		urlStr = "/cffex/refresh"
+	case utils.DATA_SOURCE_SHFE:
+		urlStr = "/shfe/refresh"
+	case utils.DATA_SOURCE_GIE:
+		urlStr = "/gie/refresh"
+	case utils.DATA_SOURCE_LT:
+		urlStr = "/lt/refresh"
+	}
+	if urlStr == "" {
+		err = fmt.Errorf(fmt.Sprint("source:", source, ";未实现该指标的刷新接口,请联系管理员"))
+		return
+	}
+	resp, err = postRefreshEdbData(param, urlStr)
+	return
+}
+
+// postRefreshEdbData 请求刷新指标数据
+func postRefreshEdbData(param map[string]interface{}, urlStr string) (resp *RefreshResponse, err error) {
+	edbLibUrl := ""
+	if global.CONFIG.Serve.RunMode == "release" {
+		edbLibUrl = "http://172.19.173.232:8300/edbapi/"
+	} else {
+		edbLibUrl = "http://8.136.199.33:8300/edbapi/"
+	}
+	postUrl := edbLibUrl + urlStr
+	postData, err := json.Marshal(param)
+	if err != nil {
+		return
+	}
+	result, err := EdbLibHttpPost(postUrl, string(postData), "application/json")
+	if err != nil {
+		return
+	}
+	err = json.Unmarshal(result, &resp)
+	if err != nil {
+		return
+	}
+	return resp, nil
+}
+
+// EdbLibHttpPost post请求edb库
+func EdbLibHttpPost(url, postData string, params ...string) ([]byte, error) {
+	body := ioutil.NopCloser(strings.NewReader(postData))
+	client := &http.Client{}
+	req, err := http.NewRequest("POST", url, body)
+	if err != nil {
+		return nil, err
+	}
+	contentType := "application/x-www-form-urlencoded;charset=utf-8"
+	if len(params) > 0 && params[0] != "" {
+		contentType = params[0]
+	}
+	req.Header.Set("Content-Type", contentType)
+	req.Header.Set("authorization", utils.MD5(utils.APP_EDB_LIB_NAME_EN+utils.EDB_LIB_Md5_KEY))
+	resp, err := client.Do(req)
+	defer resp.Body.Close()
+	b, err := ioutil.ReadAll(resp.Body)
+	fmt.Println("HttpPost:" + string(b))
+	return b, err
+}
+
+// RefreshEdbCalculateData 刷新计算指标数据请求
+func RefreshEdbCalculateData(edbInfoId int, edbCode, startDate string) (resp *RefreshResponse, err error) {
+	param := make(map[string]interface{})
+	param["EdbCode"] = edbCode
+	param["EdbInfoId"] = edbInfoId
+	param["StartDate"] = startDate
+	resp, err = postRefreshEdbData(param, "/calculate/refresh")
+	return
+}

+ 7 - 0
utils/constants.go

@@ -87,6 +87,7 @@ const (
 //数据刷新频率
 const (
 	DATA_REFRESH        = 7 //7个单位,日/周/月/季度/年
+	DATA_START_REFRESH_LIMIT = 7 //7个单位,日/周/月/季度/年
 	DATA_END_DATE_LIMIT = 4 //数据结束日期为,当前日期,加上4年时间
 )
 
@@ -101,3 +102,9 @@ const (
 const (
 	CACHE_KEY_USER_VIEW = "user_view_record" //用户阅读数据
 )
+
+//EDB_LIB
+var (
+	APP_EDB_LIB_NAME_EN = "hongze_edb_lib"
+	EDB_LIB_Md5_KEY     = "GuRaB6dY1bXOJcwG"
+)