Browse Source

新增 EdbInfoResp 结构体用于 API 响应

新增 EdbInfoResp 结构体,用于经济数据库指标信息的 API 响应。该结构体基于 EdbInfo,并进行了必要的转换和处理,包括通过反射处理时间字段。此外,还修复了在 edb_info.go、edb_info_calculate.go 和 edb_info_full_classify.go 文件中使用该结构体的地方。
Roc 7 months ago
parent
commit
927f286c06

+ 16 - 2
controllers/data_manage/edb_info.go

@@ -3235,7 +3235,14 @@ func (this *EdbInfoController) EdbInfoDetail() {
 		}
 	}
 
-	resp.EdbInfo = edbInfo
+	edbInfoResp, err := edbInfo.ConvertToResp()
+	if err != nil {
+		br.Msg = err.Error()
+		br.ErrMsg = errMsg
+		return
+	}
+
+	resp.EdbInfoResp = edbInfoResp
 	resp.ClassifyList = classifyList
 
 	br.Ret = 200
@@ -3854,7 +3861,14 @@ func (this *ChartInfoController) EdbInfoData() {
 		br.ErrMsg = errMsg
 		return
 	}
-	fullEdb.EdbInfo = edbInfo
+	edbInfoResp, err := edbInfo.ConvertToResp()
+	if err != nil {
+		br.Msg = err.Error()
+		br.ErrMsg = errMsg
+		return
+	}
+	fullEdb.EdbInfoResp = edbInfoResp
+
 	// 是否供应商停更
 	fullEdb.IsSupplierStop = data.GetIsSupplierStop(edbInfo.Source, edbInfo.EdbCode)
 

+ 7 - 1
controllers/data_manage/edb_info_calculate.go

@@ -240,7 +240,13 @@ func (this *ChartInfoController) CalculateDetail() {
 		return
 	}
 
-	fullEdb.EdbInfo = edbInfo
+	edbInfoResp, err := edbInfo.ConvertToResp()
+	if err != nil {
+		br.Msg = err.Error()
+		br.ErrMsg = errMsg
+		return
+	}
+	fullEdb.EdbInfoResp = edbInfoResp
 	fullEdb.ClassifyList = classifyList
 
 	var currClassifyItem *data_manage.EdbClassifyIdItems

+ 2 - 1
models/data_manage/edb_info.go

@@ -71,7 +71,8 @@ type EdbInfo struct {
 }
 
 type EdbInfoFullClassify struct {
-	*EdbInfo
+	//*EdbInfo
+	*EdbInfoResp
 	CorrelationStr string `description:"相关性系数字符串"`
 	ClassifyList   []*EdbClassifyIdItems
 	HaveOperaAuth  bool `description:"是否有数据权限,默认:false"`

+ 84 - 0
models/data_manage/edb_info_resp.go

@@ -0,0 +1,84 @@
+package data_manage
+
+import (
+	"encoding/json"
+	"eta_gn/eta_api/utils"
+	"fmt"
+)
+
+type EdbInfoResp struct {
+	EdbInfoId        int    `gorm:"primaryKey" `
+	EdbInfoType      int    `description:"指标类型,0:普通指标,1:预测指标"`
+	SourceName       string `description:"来源名称"`
+	Source           int    `description:"来源id"`
+	EdbCode          string `description:"指标编码"`
+	EdbName          string `description:"指标名称"`
+	EdbNameEn        string `description:"英文指标名称"`
+	EdbNameSource    string `description:"指标名称来源"`
+	Frequency        string `description:"频率"`
+	Unit             string `description:"单位"`
+	UnitEn           string `description:"英文单位"`
+	StartDate        string `description:"起始日期"`
+	EndDate          string `description:"终止日期"`
+	ClassifyId       int    `description:"分类id"`
+	SysUserId        int
+	SysUserRealName  string
+	UniqueCode       string `description:"指标唯一编码"`
+	CreateTime       string
+	ModifyTime       string
+	BaseModifyTime   string
+	MinValue         float64 `description:"指标最小值"`
+	MaxValue         float64 `description:"指标最大值"`
+	CalculateFormula string  `description:"计算公式"`
+	EdbType          int     `description:"指标类型:1:基础指标,2:计算指标"`
+	Sort             int     `description:"排序字段"`
+	LatestDate       string  `description:"数据最新日期(实际日期)"`
+	LatestValue      float64 `description:"数据最新值(实际值)"`
+	EndValue         float64 `description:"数据的最新值(预测日期的最新值)"`
+	MoveType         int     `description:"移动方式:1:领先(默认),2:滞后"`
+	MoveFrequency    string  `description:"移动频度"`
+	NoUpdate         int8    `description:"是否停止更新,0:继续更新;1:停止更新"`
+	ServerUrl        string  `description:"服务器地址"`
+	ChartImage       string  `description:"图表图片"`
+	Calendar         string  `description:"公历/农历" orm:"default(公历);"`
+	DataDateType     string  `orm:"column(data_date_type);size(255);null;default(交易日)"`
+	ManualSave       int     `description:"是否有手动保存过上下限: 0-否; 1-是"`
+	EmptyType        int     `description:"空值处理类型(0查找前后35天,1不计算,2前值填充,3后值填充,4等于0)"`
+	MaxEmptyType     int     `description:"MAX、MIN公式空值处理类型(1、等于0;2、跳过空值)"`
+	TerminalCode     string  `description:"终端编码,用于配置在机器上"`
+	DataUpdateTime   string  `description:"最近一次数据发生变化的时间"`
+	ErDataUpdateDate string  `description:"本次更新,数据发生变化的最早日期"`
+	SourceIndexName  string  `description:"数据源中的指标名称"`
+	SubSource        int     `description:"子数据来源:0:经济数据库,1:日期序列"`
+	SubSourceName    string  `description:"子数据来源名称"`
+	IndicatorCode    string  `description:"指标代码"`
+	StockCode        string  `description:"证券代码"`
+	Extra            string  `description:"指标额外配置"`
+	IsJoinPermission int     `description:"是否加入权限管控,0:不加入;1:加入;默认:0"`
+}
+
+// ConvertToResp
+// @Description:
+// @receiver m
+// @return *EdbInfoResp
+// @return error
+func (m EdbInfo) ConvertToResp() (*EdbInfoResp, error) {
+	result := new(EdbInfoResp)
+
+	jsonBytes, err := json.Marshal(m)
+	if err != nil {
+		return nil, fmt.Errorf("failed to marshal input: %w", err)
+	}
+
+	err = json.Unmarshal(jsonBytes, result)
+	if err != nil {
+		return nil, fmt.Errorf("failed to unmarshal input: %w", err)
+	}
+
+	// 通过反射处理时间字段
+	fieldsToProcess := []string{"CreateTime", "ModifyTime", "BaseModifyTime", "StartDate", "EndDate"}
+
+	err = utils.ReflectSetField(m, result, fieldsToProcess)
+
+	return result, err
+}

+ 47 - 0
utils/common.go

@@ -25,6 +25,7 @@ import (
 	"os"
 	"os/exec"
 	"path"
+	"reflect"
 	"regexp"
 	"sort"
 	"strconv"
@@ -2751,3 +2752,49 @@ func FormatDateStrToTime(timeStr string) (currTime time.Time, err error) {
 	}
 	return time.ParseInLocation(FormatDate, timeStr, time.Local)
 }
+
+// ReflectSetField
+// @Description: 通过反射处理时间字段
+// @param original
+// @param result
+// @param fieldsToProcess
+// @return interface{}
+// @return error
+func ReflectSetField(original, result interface{}, fieldsToProcess []string) error {
+	// 通过反射处理时间字段
+	fieldsToProcess = []string{"CreateTime", "ModifyTime", "BaseModifyTime", "StartDate", "EndDate"}
+
+	for _, fieldName := range fieldsToProcess {
+		value := reflect.ValueOf(original).FieldByName(fieldName)
+		if !value.IsValid() {
+			continue
+		}
+		//fmt.Println("fieldName:", fieldName)
+		//fmt.Println(value.Kind())
+		//fmt.Println(value.Type())
+		//fmt.Println(reflect.TypeOf(time.Time{}) == value.Type())
+
+		// 如果是时间类型,那么就写入结果中
+		if reflect.TypeOf(time.Time{}) == value.Type() {
+			t := value.Interface().(time.Time)
+			tmpVal := ``
+			if t.IsZero() {
+				tmpVal = ``
+			} else {
+				tmpVal = t.Format(FormatDateTime)
+			}
+
+			v := reflect.ValueOf(result).Elem()
+			f := v.FieldByName(fieldName)
+
+			if !f.IsValid() {
+				fmt.Printf("Field '%s' not found in the struct.\n", fieldName)
+				continue
+			}
+
+			f.Set(reflect.ValueOf(tmpVal))
+		}
+	}
+
+	return nil
+}