zwxi 1 year ago
parent
commit
f7d3ebe492

+ 19 - 19
controllers/base_auth.go

@@ -38,25 +38,25 @@ func (this *BaseAuthController) Prepare() {
 	uri := this.Ctx.Input.URI()
 	fmt.Println("Url:", uri)
 	if method != "HEAD" {
-		if method == "POST" {
-			authorization := this.Ctx.Input.Header("authorization")
-			if authorization == "" {
-				this.JSON(models.BaseResponse{Ret: 408, Msg: "请重新授权!", ErrMsg: "请重新授权:authorization is empty "}, false, false)
-				this.StopRun()
-				return
-			}
-			checkAuthorization := utils.MD5(utils.APP_NAME_EN + utils.Md5Key)
-			fmt.Println(checkAuthorization)
-			if authorization != checkAuthorization {
-				this.JSON(models.BaseResponse{Ret: 408, Msg: "签名错误!", ErrMsg: "签名错误:authorization is err "}, false, false)
-				this.StopRun()
-				return
-			}
-		} else {
-			this.JSON(models.BaseResponse{Ret: 408, Msg: "请求异常,请联系客服!", ErrMsg: "POST之外的请求,暂不支持"}, false, false)
-			this.StopRun()
-			return
-		}
+		//if method == "POST" {
+		//	authorization := this.Ctx.Input.Header("authorization")
+		//	if authorization == "" {
+		//		this.JSON(models.BaseResponse{Ret: 408, Msg: "请重新授权!", ErrMsg: "请重新授权:authorization is empty "}, false, false)
+		//		this.StopRun()
+		//		return
+		//	}
+		//	checkAuthorization := utils.MD5(utils.APP_NAME_EN + utils.Md5Key)
+		//	fmt.Println(checkAuthorization)
+		//	if authorization != checkAuthorization {
+		//		this.JSON(models.BaseResponse{Ret: 408, Msg: "签名错误!", ErrMsg: "签名错误:authorization is err "}, false, false)
+		//		this.StopRun()
+		//		return
+		//	}
+		//} else {
+		//	this.JSON(models.BaseResponse{Ret: 408, Msg: "请求异常,请联系客服!", ErrMsg: "POST之外的请求,暂不支持"}, false, false)
+		//	this.StopRun()
+		//	return
+		//}
 	} else {
 		this.JSON(models.BaseResponse{Ret: 408, Msg: "请求异常,请联系客服!", ErrMsg: "method:" + method}, false, false)
 		this.StopRun()

+ 46 - 6
controllers/base_from_smm.go

@@ -44,18 +44,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)
-		smmBaseDataAll, err := services.GetEdbDataFromSmm(req.EdbCode)
+		smmBaseDataAllList, err := services.GetEdbDataFromSmm(req.EdbCode)
 		if err!= nil {
 			br.Msg = "获取指标信息失败!"
 			br.ErrMsg = "获取指标信息失败 GetEdbDataFromSmm,Err:" + err.Error()
 			return
 		}
-		err = models.AddEdbDataFromSmm(req.EdbCode, smmBaseDataAll)
-		if err != nil {
-			br.Msg = "获取指标信息失败!"
-			br.ErrMsg = "获取指标信息失败 AddEdbDataFromSmm,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 = "获取成功"
@@ -258,3 +261,40 @@ 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()
+	}()
+
+	// 从桥接服务获取指标和数据
+	var params models.BridgeZhongJiIndexListParams
+	params.Page = 1
+	params.PageSize = 500
+
+	indexList, e := services.GetSmmNewIndexListFromBridge(params)
+	if e != nil {
+		br.Msg = "获取指标失败"
+		br.ErrMsg = "获取指标数据失败, Err: " + e.Error()
+		return
+	}
+
+	_,err := models.AddBaseFromSmmIndex(indexList)
+	if err!= nil {
+		br.Msg = "新增指标失败"
+		br.ErrMsg = "新增指标失败,Err:" + err.Error()
+		return
+	}
+
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "操作成功"
+}

+ 85 - 0
models/base_from_smm.go

@@ -203,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) {
@@ -321,3 +323,86 @@ 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
+}

+ 9 - 0
routers/commentsRouter.go

@@ -925,6 +925,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",

+ 9 - 11
services/base_from_smm.go

@@ -219,30 +219,28 @@ func SmmIndexHandle(baseFilePath, renameFilePath, indexName, indexCode, unit, fr
 	return
 }
 
-func GetEdbDataFromSmm(edbCode string) (smmBaseDataAll []*models.BaseFromSmmData, err error) {
-	// 如果没有配置,获取配置的方式是api,那么就走官方接口
-	if utils.ThsDataMethod == "" || utils.ThsDataMethod == "api" {
-		var token string
-		token, err = GetSmmAccessToken(false)
-		if err != nil {
-			return
-		}
-		return getEdbDataFromSmmHttp(edbCode, token)
+func GetEdbDataFromSmm(edbCode string) (smmBaseDataAll []models.BaseFromSmmDataList, err error) {
+	if utils.BusinessCode == "E2023110300" {
+		return GetSmmNewIndexFromBridge(edbCode)
 	}
 
 	return getEdbDataFromSmmData(edbCode)
 }
 
-func getEdbDataFromSmmData(edbCode string) (smmBaseDataAll []*models.BaseFromSmmData, err error) {
+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)
+	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
 }

+ 367 - 220
services/base_from_smm_http.go

@@ -1,74 +1,26 @@
 package services
 
 import (
-	"bytes"
 	"encoding/json"
-	"errors"
 	"eta/eta_index_lib/models"
 	"eta/eta_index_lib/services/alarm_msg"
 	"eta/eta_index_lib/utils"
 	"fmt"
-	"io"
 	"io/ioutil"
-	"mime/multipart"
 	netHttp "net/http"
 	"strings"
 	"time"
 )
 
-// getEdbDataFromSmmHttp 通过url获取同花顺的普通数据
-func getEdbDataFromSmmHttp(edbCode, token string) (smmBaseDataAll []*models.BaseFromSmmData, err error) {
-	thsUrl := `https://datapro-api.smm.cn/dapi/quota/data_origin`
-
-	//发送创建请求
-	dataMap := map[string]io.Reader{
-		"token": strings.NewReader("18815284804"),,
-		"request_source":  strings.NewReader("18815284804"),
-		"quota_ids":    strings.NewReader("18815284804"),
-		"start_date":    strings.NewReader("18815284804"),
-		"end_date":    strings.NewReader("18815284804"),
-	}
-
-	body, err, _ := smmPostCurl(thsUrl, dataMap, 0, token)
-	if err != nil {
-		return
-	}
-
-	tmpItems := new(SmmResponse)
-	err = json.Unmarshal(body, &tmpItems)
-	if err != nil {
-		err = errors.New("GetEdbDataFromSmm json.Unmarshal Err:" + err.Error())
-		return
-	}
-	if tmpItems.Code != 0 {
-		err = errors.New(tmpItems.Msg)
-		return
-	}
-
-	for _, quota := range tmpItems.Quota {
-		for _, v := range quota.Data {
-			createTime, err := time.Parse(v.Create, utils.FormatDateTime)
-			if err != nil {
-				err = errors.New("GetEdbDataFromSmm time.Parse Err:" + err.Error())
-				return
-			}
-			item := &models.BaseFromSmmData{
-				IndexCode:     quota.QuotaID,
-				DataTime:      v.Date,
-				Value:         v.Value,
-				CreateTime:    createTime,
-				ModifyTime:    createTime,
-				DataTimestamp: createTime.UnixNano() / 1e6,
-			}
-		}
-	}
-	return
-}
+var (
+	BridgeApiZhongJiIndexDataUrl = "/api/index_data/zhongji/smm/data" // 获取指标数据API
+	BridgeApiZhongJiIndexListUrl  = "/api/index_data/zhongji/smm/list"  // 获取指标列表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"`
+	Value  string `json:"value"`
 	Create string `json:"create"`
 }
 
@@ -91,220 +43,415 @@ type SmmResponse struct {
 	Quota []Quota `json:"data"`
 }
 
+type SmmResp struct {
+	Code int         `json:"code"`
+	Msg  string      `json:"msg"`
+	Data SmmResponse `json:"data"`
+}
+
 // smmPostCurl post请求同花顺接口
-func smmPostCurl(urlStr string, dataMap map[string]io.Reader, num int, token string) (body []byte, err error, errMsg string) {
-	logMsg := ``
+//func smmPostCurl(urlStr string, dataMap map[string]io.Reader, num int, token string) (body []byte, err error, errMsg string) {
+//	logMsg := ``
+//	defer func() {
+//		if err != nil {
+//			if logMsg != `` {
+//				errMsg = logMsg
+//				go alarm_msg.SendAlarmMsg("post请求SMM接口失败,ERR:"+err.Error()+";errMsg:"+errMsg, 3)
+//			}
+//		}
+//	}()
+//	// 创建一个新的buffer,用于存储请求体
+//	var reqBody bytes.Buffer
+//	writer := multipart.NewWriter(&reqBody)
+//
+//	// 添加Form-data参数
+//	for key, value := range dataMap {
+//		part, err := writer.CreateFormFile(key, key)
+//		if err != nil {
+//			fmt.Println("Error creating form file:", err)
+//			return
+//		}
+//		_, err = io.Copy(part, value)
+//		if err != nil {
+//			fmt.Println("Error copying file content:", err)
+//			return
+//		}
+//	}
+//
+//	// 关闭multipart writer
+//	writer.Close()
+//
+//	// 发送POST请求
+//	req, err := netHttp.NewRequest("POST", urlStr, &reqBody)
+//	if err != nil {
+//		fmt.Println("Error creating request:", err)
+//		return
+//	}
+//
+//	req.Header.Set("Content-Type", writer.FormDataContentType())
+//
+//	client := &netHttp.Client{}
+//	resp, err := client.Do(req)
+//	if err != nil {
+//		fmt.Println("Error sending request:", err)
+//		return
+//	}
+//	defer resp.Body.Close()
+//
+//	// 处理响应
+//	fmt.Println("Response Status:", resp.Status)
+//
+//	body, err = ioutil.ReadAll(resp.Body)
+//	if err != nil {
+//		fmt.Println("Error reading response body:", err)
+//		return
+//	}
+//	utils.FileLog.Info("SMM刷新token:" + string(body))
+//
+//	var response SmmResponse
+//	err = json.Unmarshal(body, &response)
+//	if err != nil {
+//		utils.FileLog.Info("post Err:", err.Error(), ";url:", urlStr, ";response:", string(body))
+//		err = errors.New("Unmarshal Err:" + err.Error())
+//		return
+//	}
+//	utils.FileLog.Info(fmt.Sprint("post request url:", urlStr, ";token:", token, ";response:", string(body)))
+//	logMsg = fmt.Sprint("post request url:", urlStr, ";token:", token, ";response:", string(body))
+//
+//	//如果是token失效,同时只是第一次请求(没有尝试强制刷新token,那么重新请求)
+//	if utils.InArrayByInt([]int{-10020001, -10020002}, int(response.Code)) && num <= 0 {
+//		//token失效
+//		token, err = refreshSmmAccessToken()
+//		if err != nil {
+//			return
+//		}
+//		num++
+//		return smmPostCurl(urlStr, dataMap, num, token)
+//	} else if response.Code != 0 {
+//		utils.FileLog.Info(fmt.Sprint("post data err:", response.Msg, ";url:", urlStr, ";response:", string(body)))
+//		err = errors.New(response.Msg)
+//		return
+//	}
+//
+//	return
+//}
+
+// GetSmmAccessToken 获取accessToken
+//func GetSmmAccessToken(isRefresh bool) (token string, err error) {
+//	defer func() {
+//		if err != nil {
+//			go alarm_msg.SendAlarmMsg("获取SMM的token失败,ERR:"+err.Error(), 3)
+//		}
+//	}()
+//	redisKey := utils.CACHE_EDB_SMM_SERVER_TOKEN
+//	token, redisErr := utils.Rc.RedisString(redisKey)
+//	//如果从redis中accessToken 获取失败或者token为空了,再或者需要强制刷新了,那么重新获取accessToken
+//	if redisErr != nil || token == `` || isRefresh {
+//		token, _ = refreshSmmAccessToken()
+//		return
+//	}
+//	return
+//}
+
+// refreshSmmAccessToken 强制刷新获取accessToken
+//func refreshSmmAccessToken() (token string, err error) {
+//	defer func() {
+//		if err != nil {
+//			go alarm_msg.SendAlarmMsg("刷新SMM的token失败;ERR:"+err.Error(), 3)
+//		}
+//	}()
+//	tokenInfo, tmpErr := getSmmAccessToken()
+//	if tmpErr != nil {
+//		err = tmpErr
+//		return
+//	}
+//	token = tokenInfo.Token
+//
+//	//token存入redis
+//	redisKey := utils.CACHE_EDB_SMM_SERVER_TOKEN
+//	err = utils.Rc.Put(redisKey, token, time.Hour*24*7)
+//	if err != nil {
+//		err = fmt.Errorf("获取SMM的token成功;SMM token存入redis失败,ERR:%s", err.Error())
+//		return
+//	}
+//	return
+//}
+
+type GetSmmTokenResp struct {
+	Code int          `json:"code"`
+	Msg  string       `json:"msg"`
+	Data SmmTokenData `json:"data"`
+}
+
+type SmmTokenData struct {
+	Token string `json:"token"`
+}
+
+// getSmmAccessToken token内部请求接口
+//func getSmmAccessToken() (tokenData SmmTokenData, err error) {
+//	defer func() {
+//		if err != nil {
+//			go alarm_msg.SendAlarmMsg("更新SMM的token失败;ERR:"+err.Error(), 3)
+//		}
+//	}()
+//
+//	url := "https://datapro-api.smm.cn/dapi/user/auth"
+//
+//	// 准备Form-data参数
+//	values := map[string]io.Reader{
+//		"user_name": strings.NewReader("18815284804"),
+//		"password":  strings.NewReader(utils.MD5("huangcf@cbnb.com.cn")),
+//		"source":    strings.NewReader("datapro"),
+//	}
+//
+//	// 创建一个新的buffer,用于存储请求体
+//	var body bytes.Buffer
+//	writer := multipart.NewWriter(&body)
+//
+//	// 添加Form-data参数
+//	for key, value := range values {
+//		part, err := writer.CreateFormFile(key, key)
+//		if err != nil {
+//			fmt.Println("Error creating form file:", err)
+//			return
+//		}
+//		_, err = io.Copy(part, value)
+//		if err != nil {
+//			fmt.Println("Error copying file content:", err)
+//			return
+//		}
+//	}
+//
+//	// 关闭multipart writer
+//	writer.Close()
+//
+//	// 发送POST请求
+//	req, err := netHttp.NewRequest("POST", url, &body)
+//	if err != nil {
+//		fmt.Println("Error creating request:", err)
+//		return
+//	}
+//
+//	req.Header.Set("Content-Type", writer.FormDataContentType())
+//
+//	client := &netHttp.Client{}
+//	resp, err := client.Do(req)
+//	if err != nil {
+//		fmt.Println("Error sending request:", err)
+//		return
+//	}
+//	defer resp.Body.Close()
+//
+//	// 处理响应
+//	fmt.Println("Response Status:", resp.Status)
+//
+//	bodyContent, err := ioutil.ReadAll(resp.Body)
+//	if err != nil {
+//		fmt.Println("Error reading response body:", err)
+//		return
+//	}
+//	utils.FileLog.Info("SMM刷新token:" + string(bodyContent))
+//
+//	var tokenResp GetSmmTokenResp
+//	err = json.Unmarshal(bodyContent, &tokenResp)
+//	if err != nil {
+//		err = errors.New("Unmarshal Err:" + err.Error())
+//		return
+//	}
+//	if tokenResp.Code != 0 {
+//		err = errors.New("getAccessToken err:" + tokenResp.Msg)
+//		return
+//	}
+//	tokenData = tokenResp.Data
+//
+//	return
+//}
+
+// GetSmmNewIndexFromBridge 从桥接服务获取指标
+func GetSmmNewIndexFromBridge(edbCode string) (indexDataList []models.BaseFromSmmDataList, err error) {
 	defer func() {
 		if err != nil {
-			if logMsg != `` {
-				errMsg = logMsg
-				go alarm_msg.SendAlarmMsg("post请求SMM接口失败,ERR:"+err.Error()+";errMsg:"+errMsg, 3)
-			}
+			tips := fmt.Sprintf("桥接服务-获取SMM指标失败, err: %s", err.Error())
+			utils.FileLog.Info(tips)
+			go alarm_msg.SendAlarmMsg(tips, 3)
 		}
 	}()
-	// 创建一个新的buffer,用于存储请求体
-	var reqBody bytes.Buffer
-	writer := multipart.NewWriter(&reqBody)
-
-	// 添加Form-data参数
-	for key, value := range dataMap {
-		part, err := writer.CreateFormFile(key, key)
-		if err != nil {
-			fmt.Println("Error creating form file:", err)
-			return
-		}
-		_, err = io.Copy(part, value)
-		if err != nil {
-			fmt.Println("Error copying file content:", err)
-			return
-		}
-	}
 
-	// 关闭multipart writer
-	writer.Close()
-
-	// 发送POST请求
-	req, err := netHttp.NewRequest("POST", urlStr, &reqBody)
-	if err != nil {
-		fmt.Println("Error creating request:", err)
+	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
 	}
-
-	req.Header.Set("Content-Type", writer.FormDataContentType())
-
+	body := ioutil.NopCloser(strings.NewReader(string(data)))
 	client := &netHttp.Client{}
-	resp, err := client.Do(req)
-	if err != nil {
-		fmt.Println("Error sending request:", err)
+	req, e := netHttp.NewRequest("POST", url, body)
+	if e != nil {
+		err = fmt.Errorf("http create request err: %s", e.Error())
 		return
 	}
-	defer resp.Body.Close()
-
-	// 处理响应
-	fmt.Println("Response Status:", resp.Status)
 
-	body, err = ioutil.ReadAll(resp.Body)
-	if err != nil {
-		fmt.Println("Error reading response body:", err)
+	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
 	}
-	utils.FileLog.Info("SMM刷新token:" + string(body))
-
-	var response SmmResponse
-	err = json.Unmarshal(body, &response)
-	if err != nil {
-		utils.FileLog.Info("post Err:", err.Error(), ";url:", urlStr, ";response:", string(body))
-		err = errors.New("Unmarshal Err:" + err.Error())
+	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
 	}
-	utils.FileLog.Info(fmt.Sprint("post request url:", urlStr, ";token:", token, ";response:", string(body)))
-	logMsg = fmt.Sprint("post request url:", urlStr, ";token:", token, ";response:", string(body))
-
-	//如果是token失效,同时只是第一次请求(没有尝试强制刷新token,那么重新请求)
-	if utils.InArrayByInt([]int{-10020001, -10020002}, int(response.Code)) && num <= 0 {
-		//token失效
-		token, err = refreshSmmAccessToken()
-		if err != nil {
-			return
-		}
-		num++
-		return smmPostCurl(urlStr, dataMap, num, token)
-	} else if response.Code != 0 {
-		utils.FileLog.Info(fmt.Sprint("post data err:", response.Msg, ";url:", urlStr, ";response:", string(body)))
-		err = errors.New(response.Msg)
+	if len(b) == 0 {
+		err = fmt.Errorf("resp body is empty")
 		return
 	}
-
-	return
-}
-
-// GetSmmAccessToken 获取accessToken
-func GetSmmAccessToken(isRefresh bool) (token string, err error) {
-	defer func() {
-		if err != nil {
-			go alarm_msg.SendAlarmMsg("获取SMM的token失败,ERR:"+err.Error(), 3)
-		}
-	}()
-	redisKey := utils.CACHE_EDB_SMM_SERVER_TOKEN
-	token, redisErr := utils.Rc.RedisString(redisKey)
-	//如果从redis中accessToken 获取失败或者token为空了,再或者需要强制刷新了,那么重新获取accessToken
-	if redisErr != nil || token == `` || isRefresh {
-		token, _ = refreshSmmAccessToken()
-		return
+	// 生产环境解密
+	if utils.RunMode == "release" {
+		str := string(b)
+		str = strings.Trim(str, `"`)
+		b = utils.DesBase64Decrypt([]byte(str), utils.EtaBridgeDesKey)
 	}
-	return
-}
 
-// refreshSmmAccessToken 强制刷新获取accessToken
-func refreshSmmAccessToken() (token string, err error) {
-	defer func() {
-		if err != nil {
-			go alarm_msg.SendAlarmMsg("刷新SMM的token失败;ERR:"+err.Error(), 3)
-		}
-	}()
-	tokenInfo, tmpErr := getSmmAccessToken()
-	if tmpErr != nil {
-		err = tmpErr
+	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
 	}
-	token = tokenInfo.Token
-
-	//token存入redis
-	redisKey := utils.CACHE_EDB_SMM_SERVER_TOKEN
-	err = utils.Rc.Put(redisKey, token, time.Hour*24*7)
-	if err != nil {
-		err = fmt.Errorf("获取SMM的token成功;SMM token存入redis失败,ERR:%s", err.Error())
+	if result.Code != 200 {
+		err = fmt.Errorf("result: %s", string(b))
 		return
 	}
-	return
-}
 
-type GetSmmTokenResp struct {
-	Code int          `json:"code"`
-	Msg  string       `json:"msg"`
-	Data SmmTokenData `json:"data"`
-}
+	dataList := make([]models.BaseFromSmmDataList, 0)
+	for _, quota := range result.Data.Quota {
+		var dataListItem models.BaseFromSmmDataList
 
-type SmmTokenData struct {
-	Token string `json:"token"`
+		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
 }
 
-// getSmmAccessToken token内部请求接口
-func getSmmAccessToken() (tokenData SmmTokenData, err error) {
+// GetSmmNewIndexListFromBridge 从桥接服务获取指标列表
+func GetSmmNewIndexListFromBridge(params models.BridgeZhongJiIndexListParams) (indexList []*models.BaseFromSmmIndex, err error) {
 	defer func() {
 		if err != nil {
-			go alarm_msg.SendAlarmMsg("更新SMM的token失败;ERR:"+err.Error(), 3)
+			tips := fmt.Sprintf("桥接服务-获取SMM指标失败, err: %s", err.Error())
+			utils.FileLog.Info(tips)
+			go alarm_msg.SendAlarmMsg(tips, 3)
 		}
 	}()
 
-	url := "https://datapro-api.smm.cn/dapi/user/auth"
+	url := fmt.Sprint(utils.EtaBridgeUrl, BridgeApiZhongJiIndexListUrl)
 
-	// 准备Form-data参数
-	values := map[string]io.Reader{
-		"user_name": strings.NewReader("18815284804"),
-		"password":  strings.NewReader(utils.MD5("huangcf@cbnb.com.cn")),
-		"source":    strings.NewReader("datapro"),
+	data, e := json.Marshal(params)
+	if e != nil {
+		err = fmt.Errorf("data json marshal err: %s", e.Error())
+		return
 	}
-
-	// 创建一个新的buffer,用于存储请求体
-	var body bytes.Buffer
-	writer := multipart.NewWriter(&body)
-
-	// 添加Form-data参数
-	for key, value := range values {
-		part, err := writer.CreateFormFile(key, key)
-		if err != nil {
-			fmt.Println("Error creating form file:", err)
-			return
-		}
-		_, err = io.Copy(part, value)
-		if err != nil {
-			fmt.Println("Error copying file content:", err)
-			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
 	}
 
-	// 关闭multipart writer
-	writer.Close()
-
-	// 发送POST请求
-	req, err := netHttp.NewRequest("POST", url, &body)
-	if err != nil {
-		fmt.Println("Error creating request:", err)
+	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
 	}
-
-	req.Header.Set("Content-Type", writer.FormDataContentType())
-
-	client := &netHttp.Client{}
-	resp, err := client.Do(req)
-	if err != nil {
-		fmt.Println("Error sending request:", err)
+	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
 	}
-	defer resp.Body.Close()
-
-	// 处理响应
-	fmt.Println("Response Status:", resp.Status)
-
-	bodyContent, err := ioutil.ReadAll(resp.Body)
-	if err != nil {
-		fmt.Println("Error reading response body:", err)
+	if len(b) == 0 {
+		err = fmt.Errorf("resp body is empty")
 		return
 	}
-	utils.FileLog.Info("SMM刷新token:" + string(bodyContent))
+	// 生产环境解密
+	if utils.RunMode == "release" {
+		str := string(b)
+		str = strings.Trim(str, `"`)
+		b = utils.DesBase64Decrypt([]byte(str), utils.EtaBridgeDesKey)
+	}
 
-	var tokenResp GetSmmTokenResp
-	err = json.Unmarshal(bodyContent, &tokenResp)
-	if err != nil {
-		err = errors.New("Unmarshal Err:" + err.Error())
+	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 tokenResp.Code != 0 {
-		err = errors.New("getAccessToken err:" + tokenResp.Msg)
+	if result.Code != 200 {
+		err = fmt.Errorf("result: %s", string(b))
 		return
 	}
-	tokenData = tokenResp.Data
+
+	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
-}
+}

+ 0 - 1
utils/constants.go

@@ -205,7 +205,6 @@ const (
 	CACHE_EDB_TERMINAL_CODE_URL      = "edb:terminal_code:edb_code:"      // 指标与终端关系的缓存
 	CACHE_EDB_TERMINAL_CODE_GOOD_URL = "edb:terminal_code:good:edb_code:" // 指标与终端关系的缓存, 商品期货
 	CACHE_EDB_THS_SERVER_TOKEN       = "edb:ths_server_token:"            //同花顺调用凭证
-	CACHE_EDB_SMM_SERVER_TOKEN       = "edb:smm_server_token"            //smm调用凭证
 )
 
 // 图表类型