瀏覽代碼

Merge branch 'debug'

kobe6258 2 月之前
父節點
當前提交
7ddaae93a2
共有 7 個文件被更改,包括 272 次插入1 次删除
  1. 35 0
      controllers/htController.go
  2. 6 1
      controllers/user_login.go
  3. 11 0
      routers/commentsRouter.go
  4. 4 0
      routers/router.go
  5. 66 0
      services/htService.go
  6. 8 0
      utils/config.go
  7. 142 0
      utils/http/http_client.go

+ 35 - 0
controllers/htController.go

@@ -0,0 +1,35 @@
+package controllers
+
+import (
+	"eta/eta_mini_crm_ht/models"
+	"eta/eta_mini_crm_ht/services"
+)
+
+type HTController struct {
+	BaseAuthController
+}
+
+// GetIndexInfo
+// @Title 获取一期指标信息
+// @Description  获取一期指标信息
+// @Success 200 {object} models.LoginResp
+// @router /getIndexInfo [get]
+func (this *HTController) GetIndexInfo(IndexCode string) {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+
+	IndexInfo, err := services.GetIndexInfo(IndexCode)
+	if err != nil {
+		br.Msg = "分类列表获取失败"
+		br.ErrMsg = "分类列表获取失败,系统错误,Err:" + err.Error()
+		return
+	}
+
+	br.Data = IndexInfo
+	br.Ret = 200
+	br.Msg = "指标信息获取成功"
+	br.Success = true
+}

+ 6 - 1
controllers/user_login.go

@@ -22,9 +22,14 @@ func ssoLogin(req request.UserLoginReq, br *models.BaseResponse) {
 		return
 	}
 	ssoResp, err := services.SSOLogin(req.Code)
+	if err != nil {
+		br.Msg = "登录失败"
+		br.ErrMsg = "sso登录失败, Err:" + err.Error()
+		return
+	}
 	utils.FileLog.Info(fmt.Sprintf("sso 登录请求结果:%s", ssoResp))
 	sysUser, err := models.GetSysUserBySysUserName(ssoResp.UserName)
-	if err != nil {
+	if err != nil || sysUser.SysUserName == "" {
 		br.ErrMsg = err.Error()
 		br.Msg = "sso登录失败,获取用户信息失败"
 		return

+ 11 - 0
routers/commentsRouter.go

@@ -162,6 +162,17 @@ func init() {
             Filters: nil,
             Params: nil})
 
+    beego.GlobalControllerRouter["eta/eta_mini_crm_ht/controllers:HTController"] = append(beego.GlobalControllerRouter["eta/eta_mini_crm_ht/controllers:HTController"],
+        beego.ControllerComments{
+            Method: "GetIndexInfo",
+            Router: `/getIndexInfo`,
+            AllowHTTPMethods: []string{"get"},
+            MethodParams: param.Make(
+				param.New("IndexCode"),
+			),
+            Filters: nil,
+            Params: nil})
+
     beego.GlobalControllerRouter["eta/eta_mini_crm_ht/controllers:ImageController"] = append(beego.GlobalControllerRouter["eta/eta_mini_crm_ht/controllers:ImageController"],
         beego.ControllerComments{
             Method: "AddImage",

+ 4 - 0
routers/router.go

@@ -102,6 +102,10 @@ func init() {
 			beego.NSInclude(
 				&controllers.ProductController{},
 			),
+		), beego.NSNamespace("/ht/v1",
+			beego.NSInclude(
+				&controllers.HTController{},
+			),
 		),
 	)
 	beego.AddNamespace(ns)

+ 66 - 0
services/htService.go

@@ -0,0 +1,66 @@
+package services
+
+import (
+	"encoding/json"
+	"errors"
+	"eta/eta_mini_crm_ht/utils"
+	httpClient "eta/eta_mini_crm_ht/utils/http"
+	"fmt"
+	"io"
+)
+
+const (
+	GetIndexInfoUrl = "/htApi/v1/index/getIndexInfo"
+)
+
+type IndexInfo struct {
+	IndexCode      string        `json:"indexCode"`
+	IndexName      string        `json:"indexName"`
+	Frequency      string        `json:"frequency"`
+	SourceName     string        `json:"sourceName"`
+	LatestDataDate string        `json:"latestDataDate"`
+	LastPushTime   string        `json:"lastPushTime"`
+	Remark         string        `json:"remark"`
+	Unit           string        `json:"unit"`
+	DataList       []interface{} `json:"dataList"`
+}
+
+type HTResponse struct {
+	Code    string          `json:"code"`
+	Success bool            `json:"success"`
+	Message string          `json:"message"`
+	Data    json.RawMessage `json:"data"`
+}
+
+func GetIndexInfo(indexCode string) (indexInfo *IndexInfo, err error) {
+	client := httpClient.DefaultClient()
+	if utils.HT_ADDRESS == "" {
+		err = errors.New("未配置海通钢联地址")
+		return
+	}
+	url := fmt.Sprintf("%s%s?indexCode=%s", utils.HT_ADDRESS, GetIndexInfoUrl, indexCode)
+	resp, err := client.Get(url)
+	if err != nil {
+		utils.FileLog.Error("获取钢联指标信息失败", err.Error())
+		return
+	}
+	defer func(Body io.ReadCloser) {
+		closeErr := Body.Close()
+		if closeErr != nil {
+			utils.FileLog.Error("关闭Response失败:%v", closeErr)
+		}
+	}(resp.Body)
+	body, _ := io.ReadAll(resp.Body)
+	var htRes HTResponse
+	err = json.Unmarshal(body, &htRes)
+	if err != nil {
+		utils.FileLog.Error("解析应答信息失败:%v", err)
+		return
+	}
+	if htRes.Success {
+		err = json.Unmarshal(htRes.Data, &indexInfo)
+	} else {
+		err = errors.New(htRes.Message)
+	}
+	return
+}

+ 8 - 0
utils/config.go

@@ -104,6 +104,11 @@ var (
 	LogMaxDays int // 日志最大保留天数
 )
 
+// 钢联一期地址
+var (
+	HT_ADDRESS string
+)
+
 // SSO登录
 var (
 	SSO_URL string
@@ -212,6 +217,9 @@ func init() {
 	{
 		SSO_URL = config["sso_url"]
 	}
+	{
+		HT_ADDRESS = config["ht_address"]
+	}
 	// 初始化ES
 	initEs()
 

+ 142 - 0
utils/http/http_client.go

@@ -0,0 +1,142 @@
+package httpClient
+
+import (
+	"context"
+	"encoding/json"
+	"errors"
+	"eta/eta_mini_crm_ht/utils"
+	"fmt"
+	"io"
+	"net/http"
+	"strings"
+	"time"
+)
+
+type HttpClient struct {
+	*http.Client
+	maxRetries     int
+	retryDelayFunc RetryDelayFunc
+}
+
+// NewClient 构造函数,其中 delayFunc 参数是可选的
+func NewClient(timeout time.Duration, maxRetries int, delayFunc ...RetryDelayFunc) *HttpClient {
+	var df RetryDelayFunc
+	if len(delayFunc) > 0 {
+		df = delayFunc[0]
+	} else {
+		df = defaultRetryDelayFunc
+	}
+	return &HttpClient{
+		Client:         &http.Client{Timeout: timeout},
+		maxRetries:     maxRetries,
+		retryDelayFunc: df,
+	}
+}
+
+func DefaultClient() *HttpClient {
+	return NewClient(time.Second*10, 3)
+}
+func defaultRetryDelayFunc(attempt int) time.Duration {
+	delay := time.Duration(attempt) * time.Second
+	if attempt > 0 {
+		delay *= 2
+	}
+	return delay
+}
+
+type RetryDelayFunc func(attempt int) time.Duration
+
+func retryErr(err error) bool {
+	return errors.Is(err, context.DeadlineExceeded) || errors.Is(err, context.Canceled)
+}
+
+// DoWithRetry 发送带有重试机制的HTTP请求,允许用户自定义重试延迟逻辑
+func (hc *HttpClient) DoWithRetry(ctx context.Context, req *http.Request) (resp *http.Response, err error) {
+	attempt := 0
+	for {
+		resp, err = hc.Do(req.WithContext(ctx))
+		if err != nil && retryErr(err) {
+			if attempt >= hc.maxRetries {
+
+				return nil, fmt.Errorf("请求失败: %w", err)
+			}
+			attempt++
+			delay := hc.retryDelayFunc(attempt)
+			time.Sleep(delay)
+			continue
+		}
+		return
+	}
+}
+
+func (hc *HttpClient) Post(url string, data interface{}) (resp *http.Response, err error) {
+	dataStr, err := json.Marshal(data)
+	if err != nil {
+		utils.FileLog.Error("请求data json序列化失败,err:" + err.Error())
+	}
+	body := io.NopCloser(strings.NewReader(string(dataStr)))
+	req, err := http.NewRequest(http.MethodPost, url, body)
+	req.Header.Set("Content-Type", "application/json")
+	if err != nil {
+		utils.FileLog.Error("创建POST请求失败: %v", err)
+	}
+	resp, err = hc.DoWithRetry(req.Context(), req)
+	if err == nil {
+		code := resp.StatusCode
+		if code != 200 {
+			utils.FileLog.Error("请求错误应答,状态码:%d", code)
+			errMsg := fmt.Sprintf("请求状态码异常,StatusCode:[%d]", code)
+			respBody, respErr := io.ReadAll(resp.Body)
+			if respErr != nil {
+				utils.FileLog.Error("读取body失败,err:%v", err)
+				err = errors.New(errMsg)
+				return
+			}
+			utils.FileLog.Error("请求错误应答,body:%s", string(respBody))
+			errMsg = fmt.Sprintf("%s,body:%s", errMsg, string(respBody))
+			err = errors.New(errMsg)
+			return
+		}
+	} else {
+		utils.FileLog.Error("未知的应答错误,获取第三方授权信息失败")
+	}
+	return
+}
+func (hc *HttpClient) PostWithAuth(url string, data interface{}, token string) (resp *http.Response, err error) {
+	dataStr, err := json.Marshal(data)
+	if err != nil {
+		utils.FileLog.Error("请求data json序列化失败,err:" + err.Error())
+	}
+	body := io.NopCloser(strings.NewReader(string(dataStr)))
+	req, err := http.NewRequest(http.MethodPost, url, body)
+	req.Header.Set("Content-Type", "application/json")
+	req.Header.Set("Authorization", token)
+	if err != nil {
+		utils.FileLog.Error("创建POST请求失败: %v", err)
+	}
+	resp, err = hc.DoWithRetry(req.Context(), req)
+	code := resp.StatusCode
+	if code != 200 {
+		utils.FileLog.Error("请求错误应答,状态码:%d", code)
+		errMsg := fmt.Sprintf("请求状态码异常,StatusCode:[%d]", code)
+		respBody, respErr := io.ReadAll(resp.Body)
+		if respErr != nil {
+			utils.FileLog.Error("读取body失败,err:%v", err)
+			err = errors.New(errMsg)
+			return
+		}
+		utils.FileLog.Error("请求错误应答,body:%s", string(respBody))
+		errMsg = fmt.Sprintf("%s,body:%s", errMsg, string(respBody))
+		err = errors.New(errMsg)
+		return
+	}
+	return
+}
+func (hc *HttpClient) Get(url string) (resp *http.Response, err error) {
+	req, err := http.NewRequestWithContext(context.Background(), http.MethodGet, url, nil)
+	if err != nil {
+		utils.FileLog.Error("创建请求失败: %v", err)
+	}
+	resp, err = hc.DoWithRetry(req.Context(), req)
+	return
+}