Sfoglia il codice sorgente

Merge branch 'ETA_1.4.5'

zwxi 1 anno fa
parent
commit
75cfee5b94

+ 118 - 8
controllers/base_from_smm.go

@@ -7,6 +7,7 @@ import (
 	"eta/eta_index_lib/services"
 	"eta/eta_index_lib/utils"
 	"fmt"
+	"math"
 	"strconv"
 	"time"
 )
@@ -44,12 +45,21 @@ func (this *SmmController) Add() {
 	cacheKey = utils.CACHE_EDB_DATA_ADD + strconv.Itoa(source) + "_" + req.EdbCode
 	if !utils.Rc.IsExist(cacheKey) {
 		utils.Rc.SetNX(cacheKey, 1, 1*time.Minute)
-		err = models.AddEdbDataFromSmm(req.EdbCode)
-		if err != nil {
+		smmBaseDataAllList, err := services.GetEdbDataFromSmm(req.EdbCode)
+		if err!= nil {
 			br.Msg = "获取指标信息失败!"
-			br.ErrMsg = "获取指标信息失败 AddEdbDataFromSmm,Err:" + err.Error()
+			br.ErrMsg = "获取指标信息失败 GetEdbDataFromSmm,Err:" + err.Error()
 			return
 		}
+		for _, item := range smmBaseDataAllList {
+			err = models.AddEdbDataFromSmm(item.IndexCode, item.Data)
+			if err != nil {
+				br.Msg = "获取指标信息失败!"
+				br.ErrMsg = "获取指标信息失败 AddEdbDataFromSmm,Err:" + err.Error()
+				return
+			}
+		}
+
 		br.Ret = 200
 		br.Success = true
 		br.Msg = "获取成功"
@@ -111,12 +121,23 @@ func (this *SmmController) Refresh() {
 	if req.EdbInfoId <= 0 {
 		req.EdbInfoId = edbInfo.EdbInfoId
 	}
-	err = models.RefreshEdbDataFromSmm(req.EdbInfoId, req.EdbCode, req.StartDate)
-	if err != nil && err.Error() != utils.ErrNoRow() {
-		br.Msg = "刷新指标信息失败!"
-		br.ErrMsg = "刷新指标信息失败 RefreshEdbDataFromSmm,Err:" + err.Error()
-		return
+	if utils.BusinessCode == "E2023110300" {
+		// 中基宁波走API更新
+		err = services.GetSmmIndexLatestFromBridge(req.EdbInfoId, req.EdbCode, req.StartDate)
+		if err != nil && err.Error() != utils.ErrNoRow() {
+			br.Msg = "刷新指标信息失败!"
+			br.ErrMsg = "刷新指标信息失败 RefreshEdbDataFromSmm,Err:" + err.Error()
+			return
+		}
+	} else {
+		err = models.RefreshEdbDataFromSmm(req.EdbInfoId, req.EdbCode, req.StartDate)
+		if err != nil && err.Error() != utils.ErrNoRow() {
+			br.Msg = "刷新指标信息失败!"
+			br.ErrMsg = "刷新指标信息失败 RefreshEdbDataFromSmm,Err:" + err.Error()
+			return
+		}
 	}
+
 	// 更新指标最大最小值
 	err, errMsg := models.UnifiedModifyEdbInfoMaxAndMinInfo(edbInfo)
 	if err != nil {
@@ -252,3 +273,92 @@ func (this *SmmController) GetIndexDetailFromDataSourceByCode() {
 	br.Success = true
 	br.Msg = "获取成功"
 }
+
+// @Title 新增有色指标接口
+// @Description 新增有色指标接口
+// @Success 200 {object} models.AddEdbInfoReq
+// @router /zhongji/list [post]
+func (this *SmmController) List() {
+	br := new(models.BaseResponse).Init()
+	var cacheKey string
+	defer func() {
+		utils.Rc.Delete(cacheKey)
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+
+	list, err := models.GetBaseFromSmmIndex()
+	if err!= nil {
+		br.Msg = "获取指标失败"
+		br.ErrMsg = "获取指标失败, Err: " + err.Error()
+		return
+	}
+
+	indexCodeMap := make(map[string]*models.BaseFromSmmIndex)
+	for _, item := range list {
+		indexCodeMap[item.IndexCode] = item
+	}
+
+	// 从桥接服务获取指标和数据
+	var params models.BridgeZhongJiIndexListParams
+	params.Page = 1
+	params.PageSize = 500
+	total, err := services.GetSmmNewIndexListTotalFromBridge(params)
+	if err!= nil {
+		br.Msg = "获取指标失败"
+		br.ErrMsg = "获取指标数据失败, Err: " + err.Error()
+		return
+	}
+	if total <= 0 {
+		br.Msg = "没有指标数据"
+		br.ErrMsg = "没有指标数据"
+		return
+	}
+	var addList []*models.BaseFromSmmIndex
+	for i := 1; i <= int(math.Ceil(float64(total)/float64(params.PageSize))); i++ {
+		params.Page = i
+		indexList, err := services.GetSmmNewIndexListFromBridge(params)
+		if err!= nil {
+			br.Msg = "获取指标失败"
+			br.ErrMsg = "获取指标数据失败, Err: " + err.Error()
+		}
+		for _, item := range indexList {
+			if _, ok := indexCodeMap[item.IndexCode]; !ok {
+				addList = append(addList, item)
+				indexCodeMap[item.IndexCode] = item
+			} else {
+				if indexCodeMap[item.IndexCode].DataState != item.DataState || indexCodeMap[item.IndexCode].EndDate != item.EndDate {
+					err = models.ModifyBaseFromSmmIndex(item)
+					if err != nil {
+						br.Msg = "更新指标失败"
+						br.ErrMsg = "更新指标失败,Err:" + err.Error()
+						return
+					}
+				}
+			}
+		}
+
+		if len(addList) > 900 {
+			_,err = models.AddBaseFromSmmIndex(addList)
+			if err!= nil {
+				br.Msg = "新增指标失败"
+				br.ErrMsg = "新增指标失败,Err:" + err.Error()
+				return
+			}
+		}
+	}
+
+	if len(addList) > 0 {
+		_,err = models.AddBaseFromSmmIndex(addList)
+		if err!= nil {
+			br.Msg = "新增指标失败"
+			br.ErrMsg = "新增指标失败,Err:" + err.Error()
+			return
+		}
+	}
+
+
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "操作成功"
+}

+ 239 - 12
models/base_from_smm.go

@@ -38,19 +38,8 @@ func GetBaseFromSmmDataByCondition(condition string, pars []interface{}) (list [
 }
 
 // 新增有色指标数据
-func AddEdbDataFromSmm(edbCode string) (err error) {
+func AddEdbDataFromSmm(edbCode string, smmBaseDataAll []*BaseFromSmmData) (err error) {
 	o := orm.NewOrm()
-
-	var condition string
-	var pars []interface{}
-	if edbCode != "" {
-		condition += " AND index_code=? "
-		pars = append(pars, edbCode)
-	}
-	smmBaseDataAll, err := GetBaseFromSmmDataByCondition(condition, pars)
-	if err != nil && err.Error() != utils.ErrNoRow() {
-		return
-	}
 	var isAdd bool
 	addSql := ` INSERT INTO edb_data_ys(edb_info_id,edb_code,data_time,value,create_time,modify_time,data_timestamp) values `
 	existMap := make(map[string]string)
@@ -214,6 +203,8 @@ type BaseFromSmmIndex struct {
 	TerminalCode       string `description:"编码"`
 	CreateTime         time.Time
 	ModifyTime         time.Time
+	DataState          string
+	ReleaseTime        string
 }
 
 func (d *BaseFromSmmIndex) AddBaseFromSmmIndex() (lastId int64, err error) {
@@ -332,3 +323,239 @@ func (m *BaseFromSmmIndex) Update(updateParams, whereParam map[string]interface{
 	_, err = qs.Update(updateParams)
 	return
 }
+
+// BridgeZhongJiIndexDataParams 桥接服务-获取中基指标数据入参
+type BridgeZhongJiIndexDataParams struct {
+	EdbCode string `json:"edb_code" form:"edb_code" description:"指标编码"`
+}
+
+type BridgeZhongJiIndexListParams struct {
+	Page     int `json:"page" form:"page" description:"页码"`
+	PageSize int `json:"page_size" form:"page_size" description:"每页指标个数,每页不能超过500条,超过会固定为500"`
+}
+
+type BaseFromSmmDataList struct {
+	Data      []*BaseFromSmmData
+	IndexCode string
+}
+
+type UpdateRule struct {
+	RuleDesc    string         `json:"rule_desc"`
+	Notice      string         `json:"notice"`
+	ReleaseTime string         `json:"release_time"`
+	RuleInfo    UpdateRuleInfo `json:"rule_info"`
+}
+
+type UpdateRuleInfo struct {
+	UpdCal       string `json:"upd_cal"`
+	UpdCalUnit   string `json:"upd_cal_unit"`
+	PeriodOffset int    `json:"period_offset"`
+	UpdCount     int    `json:"upd_count"`
+}
+
+type DataItem struct {
+	QuotaID     string     `json:"quota_id"`
+	QuotaName   string     `json:"quota_name"`
+	Mark        string     `json:"mark"`
+	Unit        string     `json:"unit"`
+	ValueType   string     `json:"value_type"`
+	Source      string     `json:"source"`
+	ListOrder   int        `json:"list_order"`
+	DataStart   string     `json:"data_start"`
+	DataEnd     string     `json:"data_end"`
+	Frequency   string     `json:"frequency"`
+	Precision   int        `json:"precision"`
+	TypeCode    string     `json:"type_code"`
+	TypeName    string     `json:"type_name"`
+	TypeCodeAll string     `json:"type_code_all"`
+	TypeAll     string     `json:"type_all"`
+	Tags        string     `json:"tags"`
+	AuthStart   string     `json:"auth_start"`
+	AuthFinish  string     `json:"auth_finish"`
+	AuthLang    string     `json:"auth_lang"`
+	AuthModule  string     `json:"auth_module"`
+	DataDur     string     `json:"data_dur"`
+	Spec        string     `json:"spec"`
+	Area        string     `json:"area"`
+	DataState   string     `json:"data_state"`
+	UpdateRule  UpdateRule `json:"update_rule"`
+}
+
+type ListData struct {
+	Total       int        `json:"total"`
+	CurrentPage int        `json:"current_page"`
+	PageSize    int        `json:"page_size"`
+	PageCount   int        `json:"page_count"`
+	Data        []DataItem `json:"data"`
+}
+
+type SmmIndexListResponse struct {
+	Code int      `json:"code"`
+	Msg  string   `json:"msg"`
+	Data ListData `json:"data"`
+}
+
+type SmmListResp struct {
+	Code int                  `json:"code"`
+	Msg  string               `json:"msg"`
+	Data SmmIndexListResponse `json:"data"`
+}
+
+func AddBaseFromSmmIndex(list []*BaseFromSmmIndex) (lastId int64, err error) {
+	o := orm.NewOrm()
+	_, err = o.InsertMulti(len(list), list)
+	return
+}
+
+// BridgeZhongJiIndexLatestDataParams 桥接服务-获取中基更新指标数据入参
+type BridgeZhongJiIndexLatestDataParams struct {
+	EdbCode  string `json:"edb_code" form:"edb_code" description:"指标编码"`
+	LastTime int64 `json:"last_time" form:"last_time" description:"上次更新时间戳(秒)"`
+}
+
+func GetBaseFromSmmIndex() (list []*BaseFromSmmIndex, err error) {
+	o := orm.NewOrm()
+	sql := ` SELECT * FROM base_from_smm_index`
+	_, err = o.Raw(sql).QueryRows(&list)
+	return
+}
+
+func ModifyBaseFromSmmIndex(item *BaseFromSmmIndex) (err error) {
+	o := orm.NewOrm()
+	sql := ` UPDATE base_from_smm_index SET end_date = ?, modify_time=NOW(), data_state= ? `
+	_, err = o.Raw(sql, item.EndDate, item.DataState).Exec()
+	return
+}
+
+type SmmLatestDataResponse struct {
+	Code int           `json:"code"`
+	Msg  string        `json:"msg"`
+	Data SmmLatestResp `json:"data"`
+}
+
+type SmmLatestResp struct {
+	Code int           `json:"code"`
+	Msg  string        `json:"msg"`
+	Data SmmLatestData `json:"data"`
+}
+
+type SmmLatestData struct {
+	DataLen  int     `json:"data_len"`
+	DataList []Datum `json:"data_list"`
+}
+
+type Datum struct {
+	QuotaID string `json:"quota_id"`
+	Date    string `json:"date"`
+	Value   string `json:"value"`
+	Mark    string `json:"mark"`
+	Create  string `json:"create"`
+	Update  string `json:"update"`
+}
+
+// RefreshEdbDataFromSmmToEdb 刷新有色指标数据
+func RefreshEdbDataFromSmmToEdb(edbInfoId int, edbCode, startDate string, smmDataList []*BaseFromSmmData) (err error) {
+	source := utils.DATA_SOURCE_YS
+	subSource := utils.DATA_SUB_SOURCE_EDB
+
+	o := orm.NewOrm()
+	if err != nil {
+		return
+	}
+	edbInfoIdStr := strconv.Itoa(edbInfoId)
+	//计算数据
+	var condition string
+	var pars []interface{}
+
+	if edbCode != "" {
+		condition += " AND index_code=? "
+		pars = append(pars, edbCode)
+	}
+
+	if startDate != "" {
+		condition += " AND data_time>=? "
+		pars = append(pars, startDate)
+	}
+
+	// 真实数据的最大日期  , 插入规则配置的日期
+	var realDataMaxDate, edbDataInsertConfigDate time.Time
+	var edbDataInsertConfig *EdbDataInsertConfig
+	var isFindConfigDateRealData bool //是否找到配置日期的实际数据的值
+	{
+		edbDataInsertConfig, err = GetEdbDataInsertConfigByEdbId(edbInfoId)
+		if err != nil && err.Error() != utils.ErrNoRow() {
+			return
+		}
+		if edbDataInsertConfig != nil {
+			edbDataInsertConfigDate = edbDataInsertConfig.Date
+		}
+	}
+
+	var existCondition string
+	var existPars []interface{}
+
+	existCondition += " AND edb_info_id=? "
+	existPars = append(existPars, edbInfoId)
+	if startDate != "" {
+		existCondition += " AND data_time>=? "
+		existPars = append(existPars, startDate)
+	}
+
+	existList, err := GetEdbDataByCondition(source, subSource, existCondition, existPars)
+	if err != nil {
+		return err
+	}
+	existMap := make(map[string]*EdbInfoSearchData)
+	for _, v := range existList {
+		existMap[v.DataTime] = v
+	}
+	addSql := ` INSERT INTO edb_data_ys(edb_info_id,edb_code,data_time,value,create_time,modify_time,data_timestamp) values `
+	var isAdd bool
+	for _, v := range smmDataList {
+		item := v
+		eDate := item.DataTime
+		dataTime, err := time.ParseInLocation(utils.FormatDate, eDate, time.Local)
+		if err != nil {
+			return err
+		}
+		if findItem, ok := existMap[v.DataTime]; !ok {
+			sValue := item.Value
+
+			timestamp := dataTime.UnixNano() / 1e6
+			timeStr := fmt.Sprintf("%d", timestamp)
+
+			addSql += GetAddSql(edbInfoIdStr, edbCode, eDate, timeStr, sValue)
+			isAdd = true
+		} else {
+			if findItem != nil && utils.SubFloatToString(findItem.Value, 30) != item.Value {
+				err = ModifyEdbDataById(source, subSource, findItem.EdbDataId, item.Value)
+				if err != nil {
+					return err
+				}
+			}
+		}
+
+		// 下面代码主要目的是处理掉手动插入的数据判断
+		{
+			if realDataMaxDate.IsZero() || dataTime.After(realDataMaxDate) {
+				realDataMaxDate = dataTime
+			}
+			if edbDataInsertConfigDate.IsZero() || dataTime.Equal(edbDataInsertConfigDate) {
+				isFindConfigDateRealData = true
+			}
+		}
+	}
+
+	// 处理手工数据补充的配置
+	HandleConfigInsertEdbData(realDataMaxDate, edbDataInsertConfig, edbInfoId, source, subSource, existMap, isFindConfigDateRealData)
+
+	if isAdd {
+		addSql = strings.TrimRight(addSql, ",")
+		_, err = o.Raw(addSql).Exec()
+		if err != nil {
+			fmt.Println("RefreshEdbDataFromSmm add Err", err.Error())
+			return
+		}
+	}
+	return
+}

+ 9 - 0
routers/commentsRouter.go

@@ -934,6 +934,15 @@ func init() {
             Filters: nil,
             Params: nil})
 
+    beego.GlobalControllerRouter["eta/eta_index_lib/controllers:SmmController"] = append(beego.GlobalControllerRouter["eta/eta_index_lib/controllers:SmmController"],
+        beego.ControllerComments{
+            Method: "List",
+            Router: `/zhongji/list`,
+            AllowHTTPMethods: []string{"post"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
     beego.GlobalControllerRouter["eta/eta_index_lib/controllers:StockPlantController"] = append(beego.GlobalControllerRouter["eta/eta_index_lib/controllers:StockPlantController"],
         beego.ControllerComments{
             Method: "Calculate",

+ 26 - 0
services/base_from_smm.go

@@ -218,3 +218,29 @@ func SmmIndexHandle(baseFilePath, renameFilePath, indexName, indexCode, unit, fr
 	}
 	return
 }
+
+func GetEdbDataFromSmm(edbCode string) (smmBaseDataAll []models.BaseFromSmmDataList, err error) {
+	if utils.BusinessCode == "E2023110300" {
+		return GetSmmNewIndexFromBridge(edbCode)
+	}
+
+	return getEdbDataFromSmmData(edbCode)
+}
+
+func getEdbDataFromSmmData(edbCode string) (smmBaseDataList []models.BaseFromSmmDataList, err error) {
+	var condition string
+	var pars []interface{}
+	if edbCode != "" {
+		condition += " AND index_code=? "
+		pars = append(pars, edbCode)
+	}
+	smmBaseDataAll, err := models.GetBaseFromSmmDataByCondition(condition, pars)
+	if err != nil && err.Error() != utils.ErrNoRow() {
+		return
+	}
+	var smmBaseDataListItem models.BaseFromSmmDataList
+	smmBaseDataListItem.Data = smmBaseDataAll
+	smmBaseDataListItem.IndexCode = edbCode
+	smmBaseDataList = append(smmBaseDataList, smmBaseDataListItem)
+	return
+}

+ 412 - 0
services/base_from_smm_http.go

@@ -0,0 +1,412 @@
+package services
+
+import (
+	"encoding/json"
+	"eta/eta_index_lib/models"
+	"eta/eta_index_lib/services/alarm_msg"
+	"eta/eta_index_lib/utils"
+	"fmt"
+	"io/ioutil"
+	netHttp "net/http"
+	"strings"
+	"time"
+)
+
+var (
+	BridgeApiZhongJiIndexDataUrl   = "/api/index_data/zhongji/smm/data"   // 获取指标数据API
+	BridgeApiZhongJiIndexListUrl   = "/api/index_data/zhongji/smm/list"   // 获取指标列表API
+	BridgeApiZhongJiIndexLatestUrl = "/api/index_data/zhongji/smm/latest" // 获取指标最新数据API
+)
+
+// Data is a struct that represents the data field in the JSON string
+type Data struct {
+	Date   string `json:"date"`
+	Value  string `json:"value"`
+	Create string `json:"create"`
+}
+
+// Quota is a struct that represents the quota information in the JSON string
+type Quota struct {
+	QuotaID   string `json:"quota_id"`
+	QuotaName string `json:"quota_name"`
+	Unit      string `json:"unit"`
+	Frequency string `json:"frequency"`
+	ValueType string `json:"value_type"`
+	Precision int    `json:"precision"`
+	PermState int    `json:"perm_state"`
+	Data      []Data `json:"data"`
+}
+
+// Response is a struct that represents the whole JSON string
+type SmmResponse struct {
+	Code  int     `json:"code"`
+	Msg   string  `json:"msg"`
+	Quota []Quota `json:"data"`
+}
+
+type SmmResp struct {
+	Code int         `json:"code"`
+	Msg  string      `json:"msg"`
+	Data SmmResponse `json:"data"`
+}
+
+type GetSmmTokenResp struct {
+	Code int          `json:"code"`
+	Msg  string       `json:"msg"`
+	Data SmmTokenData `json:"data"`
+}
+
+type SmmTokenData struct {
+	Token string `json:"token"`
+}
+
+// GetSmmNewIndexFromBridge 从桥接服务获取指标
+func GetSmmNewIndexFromBridge(edbCode string) (indexDataList []models.BaseFromSmmDataList, err error) {
+	defer func() {
+		if err != nil {
+			tips := fmt.Sprintf("桥接服务-获取SMM指标失败, err: %s", err.Error())
+			utils.FileLog.Info(tips)
+			go alarm_msg.SendAlarmMsg(tips, 3)
+		}
+	}()
+
+	url := fmt.Sprint(utils.EtaBridgeUrl, BridgeApiZhongJiIndexDataUrl)
+	param := models.BridgeZhongJiIndexDataParams{EdbCode: edbCode}
+	data, e := json.Marshal(param)
+	if e != nil {
+		err = fmt.Errorf("data json marshal err: %s", e.Error())
+		return
+	}
+	body := ioutil.NopCloser(strings.NewReader(string(data)))
+	client := &netHttp.Client{}
+	req, e := netHttp.NewRequest("POST", url, body)
+	if e != nil {
+		err = fmt.Errorf("http create request err: %s", e.Error())
+		return
+	}
+
+	checkToken := utils.MD5(utils.EtaBridgeAppNameEn + utils.EtaBridgeMd5Key)
+	contentType := "application/json;charset=utf-8"
+	req.Header.Set("Content-Type", contentType)
+	req.Header.Set("Authorization", checkToken)
+	resp, e := client.Do(req)
+	if e != nil {
+		err = fmt.Errorf("http client do err: %s", e.Error())
+		return
+	}
+	defer func() {
+		_ = resp.Body.Close()
+	}()
+	b, e := ioutil.ReadAll(resp.Body)
+	if e != nil {
+		err = fmt.Errorf("resp body read err: %s", e.Error())
+		return
+	}
+	if len(b) == 0 {
+		err = fmt.Errorf("resp body is empty")
+		return
+	}
+	// 生产环境解密
+	if utils.RunMode == "release" {
+		str := string(b)
+		str = strings.Trim(str, `"`)
+		b = utils.DesBase64Decrypt([]byte(str), utils.EtaBridgeDesKey)
+	}
+
+	result := new(SmmResp)
+	if e = json.Unmarshal(b, &result); e != nil {
+		err = fmt.Errorf("result unmarshal err: %s\nresult: %s", e.Error(), string(b))
+		return
+	}
+	if result.Code != 200 {
+		err = fmt.Errorf("result: %s", string(b))
+		return
+	}
+
+	dataList := make([]models.BaseFromSmmDataList, 0)
+	for _, quota := range result.Data.Quota {
+		var dataListItem models.BaseFromSmmDataList
+
+		dataListItem.IndexCode = quota.QuotaID
+		for _, v := range quota.Data {
+			dataItem := new(models.BaseFromSmmData)
+			dataItem.IndexCode = quota.QuotaID
+			dataItem.DataTime = v.Date
+			dataItem.Value = v.Value
+			createTime, e := time.Parse(utils.FormatDateTime, v.Create)
+			if e != nil {
+				err = fmt.Errorf("time parse err: %s", e.Error())
+				return
+			}
+			dataItem.CreateTime = createTime
+			dataItem.ModifyTime = createTime
+			currentDate, _ := time.ParseInLocation(utils.FormatDate, v.Date, time.Local)
+			timestamp := currentDate.UnixNano() / 1e6
+			dataItem.DataTimestamp = timestamp
+
+			dataListItem.Data = append(dataListItem.Data, dataItem)
+		}
+		dataList = append(dataList, dataListItem)
+	}
+	indexDataList = dataList
+	return
+}
+
+// GetSmmNewIndexListFromBridge 从桥接服务获取指标列表
+func GetSmmNewIndexListFromBridge(params models.BridgeZhongJiIndexListParams) (indexList []*models.BaseFromSmmIndex, err error) {
+	defer func() {
+		if err != nil {
+			tips := fmt.Sprintf("桥接服务-获取SMM指标失败, err: %s", err.Error())
+			utils.FileLog.Info(tips)
+			go alarm_msg.SendAlarmMsg(tips, 3)
+		}
+	}()
+
+	url := fmt.Sprint(utils.EtaBridgeUrl, BridgeApiZhongJiIndexListUrl)
+
+	data, e := json.Marshal(params)
+	if e != nil {
+		err = fmt.Errorf("data json marshal err: %s", e.Error())
+		return
+	}
+	body := ioutil.NopCloser(strings.NewReader(string(data)))
+	client := &netHttp.Client{}
+	req, e := netHttp.NewRequest("POST", url, body)
+	if e != nil {
+		err = fmt.Errorf("http create request err: %s", e.Error())
+		return
+	}
+
+	checkToken := utils.MD5(utils.EtaBridgeAppNameEn + utils.EtaBridgeMd5Key)
+	contentType := "application/json;charset=utf-8"
+	req.Header.Set("Content-Type", contentType)
+	req.Header.Set("Authorization", checkToken)
+	resp, e := client.Do(req)
+	if e != nil {
+		err = fmt.Errorf("http client do err: %s", e.Error())
+		return
+	}
+	defer func() {
+		_ = resp.Body.Close()
+	}()
+	b, e := ioutil.ReadAll(resp.Body)
+	if e != nil {
+		err = fmt.Errorf("resp body read err: %s", e.Error())
+		return
+	}
+	if len(b) == 0 {
+		err = fmt.Errorf("resp body is empty")
+		return
+	}
+	// 生产环境解密
+	if utils.RunMode == "release" {
+		str := string(b)
+		str = strings.Trim(str, `"`)
+		b = utils.DesBase64Decrypt([]byte(str), utils.EtaBridgeDesKey)
+	}
+
+	result := new(models.SmmListResp)
+	if e = json.Unmarshal(b, &result); e != nil {
+		err = fmt.Errorf("result unmarshal err: %s\nresult: %s", e.Error(), string(b))
+		return
+	}
+	if result.Code != 200 {
+		err = fmt.Errorf("result: %s", string(b))
+		return
+	}
+
+	for _, v := range result.Data.Data.Data {
+		typeList := strings.Split(v.TypeAll, ";")
+		item := new(models.BaseFromSmmIndex)
+		item.IndexCode = v.QuotaID
+		item.IndexName = v.QuotaName
+		item.Frequency = v.Frequency
+		item.StartDate = v.DataStart
+		item.EndDate = v.DataEnd
+		item.Name = v.TypeName
+		item.CreateTime = time.Now()
+		item.Unit = v.Unit
+		item.Frequency = v.Frequency
+		if v.Frequency != "半年" {
+			item.Frequency += "度"
+		}
+		item.Interface = "SMM"
+		item.ModifyTime = time.Now()
+		item.DataState = v.DataState
+		item.ReleaseTime = v.UpdateRule.ReleaseTime
+		for i, typeItem := range typeList {
+			if i == 0 {
+				item.Type1 = typeItem
+			} else if i == 1 {
+				item.Type2 = typeItem
+			} else if i == 2 {
+				item.Type3 = typeItem
+			}
+		}
+		indexList = append(indexList, item)
+	}
+
+	return
+}
+
+// GetSmmNewIndexListTotalFromBridge 从桥接服务获取指标列表总数
+func GetSmmNewIndexListTotalFromBridge(params models.BridgeZhongJiIndexListParams) (total int, err error) {
+	defer func() {
+		if err != nil {
+			tips := fmt.Sprintf("桥接服务-获取SMM指标失败, err: %s", err.Error())
+			utils.FileLog.Info(tips)
+			go alarm_msg.SendAlarmMsg(tips, 3)
+		}
+	}()
+
+	url := fmt.Sprint(utils.EtaBridgeUrl, BridgeApiZhongJiIndexListUrl)
+
+	data, e := json.Marshal(params)
+	if e != nil {
+		err = fmt.Errorf("data json marshal err: %s", e.Error())
+		return
+	}
+	body := ioutil.NopCloser(strings.NewReader(string(data)))
+	client := &netHttp.Client{}
+	req, e := netHttp.NewRequest("POST", url, body)
+	if e != nil {
+		err = fmt.Errorf("http create request err: %s", e.Error())
+		return
+	}
+
+	checkToken := utils.MD5(utils.EtaBridgeAppNameEn + utils.EtaBridgeMd5Key)
+	contentType := "application/json;charset=utf-8"
+	req.Header.Set("Content-Type", contentType)
+	req.Header.Set("Authorization", checkToken)
+	resp, e := client.Do(req)
+	if e != nil {
+		err = fmt.Errorf("http client do err: %s", e.Error())
+		return
+	}
+	defer func() {
+		_ = resp.Body.Close()
+	}()
+	b, e := ioutil.ReadAll(resp.Body)
+	if e != nil {
+		err = fmt.Errorf("resp body read err: %s", e.Error())
+		return
+	}
+	if len(b) == 0 {
+		err = fmt.Errorf("resp body is empty")
+		return
+	}
+	// 生产环境解密
+	if utils.RunMode == "release" {
+		str := string(b)
+		str = strings.Trim(str, `"`)
+		b = utils.DesBase64Decrypt([]byte(str), utils.EtaBridgeDesKey)
+	}
+
+	result := new(models.SmmListResp)
+	if e = json.Unmarshal(b, &result); e != nil {
+		err = fmt.Errorf("result unmarshal err: %s\nresult: %s", e.Error(), string(b))
+		return
+	}
+	if result.Code != 200 {
+		err = fmt.Errorf("result: %s", string(b))
+		return
+	}
+
+	total = result.Data.Data.Total
+	return
+}
+
+// GetSmmIndexLatestFromBridge 从桥接服务获取指标更新
+func GetSmmIndexLatestFromBridge(edbInfoId int, edbCode, startDate string) (err error) {
+	defer func() {
+		if err != nil {
+			tips := fmt.Sprintf("桥接服务-获取SMM指标失败, err: %s", err.Error())
+			utils.FileLog.Info(tips)
+			go alarm_msg.SendAlarmMsg(tips, 3)
+		}
+	}()
+
+	url := fmt.Sprint(utils.EtaBridgeUrl, BridgeApiZhongJiIndexLatestUrl)
+
+	startDateTime, err := time.Parse(utils.FormatDate, startDate)
+	if err != nil {
+		err = fmt.Errorf("startDateTime parse err: %s", err.Error())
+		return
+	}
+	timeStamp := startDateTime.UnixNano() / 1e6
+
+	param := models.BridgeZhongJiIndexLatestDataParams{
+		EdbCode:  edbCode,
+		LastTime: timeStamp,
+	}
+	data, e := json.Marshal(param)
+	if e != nil {
+		err = fmt.Errorf("data json marshal err: %s", e.Error())
+		return
+	}
+	body := ioutil.NopCloser(strings.NewReader(string(data)))
+	client := &netHttp.Client{}
+	req, e := netHttp.NewRequest("POST", url, body)
+	if e != nil {
+		err = fmt.Errorf("http create request err: %s", e.Error())
+		return
+	}
+
+	checkToken := utils.MD5(utils.EtaBridgeAppNameEn + utils.EtaBridgeMd5Key)
+	contentType := "application/json;charset=utf-8"
+	req.Header.Set("Content-Type", contentType)
+	req.Header.Set("Authorization", checkToken)
+	resp, e := client.Do(req)
+	if e != nil {
+		err = fmt.Errorf("http client do err: %s", e.Error())
+		return
+	}
+	defer func() {
+		_ = resp.Body.Close()
+	}()
+	b, e := ioutil.ReadAll(resp.Body)
+	if e != nil {
+		err = fmt.Errorf("resp body read err: %s", e.Error())
+		return
+	}
+	if len(b) == 0 {
+		err = fmt.Errorf("resp body is empty")
+		return
+	}
+	// 生产环境解密
+	if utils.RunMode == "release" {
+		str := string(b)
+		str = strings.Trim(str, `"`)
+		b = utils.DesBase64Decrypt([]byte(str), utils.EtaBridgeDesKey)
+	}
+
+	result := new(models.SmmLatestDataResponse)
+	if e = json.Unmarshal(b, &result); e != nil {
+		err = fmt.Errorf("result unmarshal err: %s\nresult: %s", e.Error(), string(b))
+		return
+	}
+	if result.Code != 200 {
+		err = fmt.Errorf("result: %s", string(b))
+		return
+	}
+	smmDataList := make([]*models.BaseFromSmmData, 0)
+
+	for _, v := range result.Data.Data.DataList {
+		item := new(models.BaseFromSmmData)
+		item.BaseFromSmmIndexId = edbInfoId
+		item.IndexCode = v.QuotaID
+		item.DataTime = v.Date
+		item.Value = v.Value
+		item.CreateTime = time.Now()
+		item.ModifyTime = time.Now()
+
+		timeDate, _ := time.Parse(utils.FormatDateTime, v.Date)
+		timestamp := timeDate.UnixNano() / 1e6
+		item.DataTimestamp = timestamp
+
+		smmDataList = append(smmDataList, item)
+	}
+
+	err = models.RefreshEdbDataFromSmmToEdb(edbInfoId, edbCode, startDate, smmDataList)
+	return
+}