Roc 2 kuukautta sitten
vanhempi
commit
05a585c0d6
5 muutettua tiedostoa jossa 499 lisäystä ja 377 poistoa
  1. 67 52
      models/edb_data_base.go
  2. 27 53
      models/edb_data_calculate_avg.go
  3. 336 209
      models/edb_info.go
  4. 57 52
      utils/common.go
  5. 12 11
      utils/constants.go

+ 67 - 52
models/edb_data_base.go

@@ -1,9 +1,10 @@
 package models
 
 import (
+	"eta/eta_index_lib/global"
 	"eta/eta_index_lib/utils"
 	"fmt"
-	"github.com/beego/beego/v2/client/orm"
+	"gorm.io/gorm"
 	"strings"
 	"time"
 )
@@ -20,15 +21,28 @@ type EdbDataItem struct {
 }
 
 type EdbData struct {
-	EdbDataId     int `orm:"column(edb_data_id);pk"`
-	EdbInfoId     int
-	EdbCode       string
-	DataTime      string
-	Value         string
-	Status        int
-	CreateTime    time.Time
-	ModifyTime    time.Time
-	DataTimestamp int64
+	EdbDataId     int       `gorm:"primaryKey;autoIncrement;column:edb_data_id"`
+	EdbInfoId     int       `gorm:"column:edb_info_id"`
+	EdbCode       string    `gorm:"column:edb_code"`
+	DataTime      string    `gorm:"column:data_time"`
+	Value         string    `gorm:"column:value"`
+	Status        int       `gorm:"column:status"`
+	CreateTime    time.Time `gorm:"column:create_time"`
+	ModifyTime    time.Time `gorm:"column:modify_time"`
+	DataTimestamp int64     `gorm:"column:data_timestamp"`
+}
+
+// AfterFind 在该模型上设置钩子函数,把日期转成正确的string,所以查询函数只能用Find函数,First或者Scan是不会触发该函数的来获取数据
+func (m *EdbData) AfterFind(db *gorm.DB) (err error) {
+	if m.DataTime == "" {
+		return
+	}
+	minDateTmp, err := time.ParseInLocation(utils.FormatDateWallWithLoc, m.DataTime, time.Local)
+	if err != nil {
+		return
+	}
+	m.DataTime = minDateTmp.Format(utils.FormatDate)
+	return
 }
 
 func GetAddSql(edbInfoId, edbCode, dataTime, timestampStr string, value string) (addSql string) {
@@ -40,6 +54,7 @@ func GetAddSql(edbInfoId, edbCode, dataTime, timestampStr string, value string)
 	addSql += "),"
 	return
 }
+
 func GetAddSqlV2(edbInfoId, edbCode, dataTime, timestampStr string, value, nowStr string) (addSql string) {
 	addSql += "("
 	addSql += edbInfoId + "," + "'" + edbCode + "'" + "," + "'" + dataTime + "'" + "," + value + "," + "'" + nowStr + "'" +
@@ -59,12 +74,11 @@ type AddEdbInfoReq struct {
 
 // GetEdbInfoCountByCondition 获取指标数量
 func GetEdbInfoCountByCondition(condition string, pars []interface{}) (count int, err error) {
-	o := orm.NewOrm()
 	sql := ` SELECT COUNT(1) AS count FROM edb_info WHERE 1=1 `
 	if condition != "" {
 		sql += condition
 	}
-	err = o.Raw(sql, pars).QueryRow(&count)
+	err = global.DEFAULT_DB.Raw(sql, pars...).Scan(&count).Error
 	return
 }
 
@@ -72,7 +86,6 @@ func GetEdbInfoCountByCondition(condition string, pars []interface{}) (count int
 func GetEdbDataAllByEdbCode(edbCode string, source, subSource, limit int) (items []*EdbInfoSearchData, err error) {
 	var pars []interface{}
 	pars = append(pars, edbCode)
-	o := orm.NewOrm()
 
 	tableName := GetEdbDataTableName(source, subSource)
 	sql := ` SELECT * FROM %s WHERE edb_code=? ORDER BY data_time DESC`
@@ -81,12 +94,11 @@ func GetEdbDataAllByEdbCode(edbCode string, source, subSource, limit int) (items
 		pars = append(pars, limit)
 	}
 	sql = fmt.Sprintf(sql, tableName)
-	_, err = o.Raw(sql, pars).QueryRows(&items)
+	err = global.DEFAULT_DB.Raw(sql, pars...).Scan(&items).Error
 	return
 }
 
 func GetEdbDataByCondition(source, subSource int, condition string, pars []interface{}) (items []*EdbInfoSearchData, err error) {
-	o := orm.NewOrm()
 	tableName := GetEdbDataTableName(source, subSource)
 	sql := ` SELECT * FROM %s WHERE 1=1 `
 	if condition != "" {
@@ -94,26 +106,32 @@ func GetEdbDataByCondition(source, subSource int, condition string, pars []inter
 	}
 	sql += ` ORDER BY data_time DESC `
 	sql = fmt.Sprintf(sql, tableName)
-	_, err = o.Raw(sql, pars).QueryRows(&items)
+	err = global.DEFAULT_DB.Raw(sql, pars...).Scan(&items).Error
+	if err != nil {
+		return
+	}
+
+	for _, v := range items {
+		v.ConvertTimeStr()
+	}
+
 	return
 }
 
 // GetEdbDataByDate 根据数据日期获取指标数据
 func GetEdbDataByDate(source, subSource int, edbCode, dataTime string) (item *EdbInfoSearchData, err error) {
-	o := orm.NewOrm()
 	tableName := GetEdbDataTableName(source, subSource)
 	sql := ` SELECT * FROM %s WHERE 1=1 AND edb_code = ? AND data_time =? ORDER BY data_time DESC `
 	sql = fmt.Sprintf(sql, tableName)
-	err = o.Raw(sql, edbCode, dataTime).QueryRow(&item)
+	err = global.DEFAULT_DB.Raw(sql, edbCode, dataTime).First(&item).Error
 	return
 }
 
 func ModifyEdbDataById(source, subSource, edbDataId int, value string) (err error) {
-	o := orm.NewOrm()
 	tableName := GetEdbDataTableName(source, subSource)
 	sql := ` UPDATE %s SET value=?,modify_time=NOW() WHERE edb_data_id=? `
 	sql = fmt.Sprintf(sql, tableName)
-	_, err = o.Raw(sql, value, edbDataId).Exec()
+	err = global.DEFAULT_DB.Exec(sql, value, edbDataId).Error
 	return
 }
 
@@ -122,8 +140,7 @@ func DeleteEdbDataById(source, subSource, edbDataId int) (err error) {
 	tableName := GetEdbDataTableName(source, subSource)
 	sql = fmt.Sprintf(sql, tableName)
 
-	o := orm.NewOrm()
-	_, err = o.Raw(sql, edbDataId).Exec()
+	err = global.DEFAULT_DB.Exec(sql, edbDataId).Error
 	return
 }
 
@@ -134,33 +151,22 @@ type RefreshEdbInfoReq struct {
 	Source    int    `description:"指标来源ID"`
 }
 
-// GetAllEdbDataList 获取所有的指标数据列表
-func GetAllEdbDataList(edbInfoId, source, subSource int) (existDataList []*EdbData, err error) {
-	o := orm.NewOrm()
-	dataTableName := GetEdbDataTableName(source, subSource)
-	fmt.Println("dataTableName:", dataTableName)
-	sql := `SELECT * FROM %s WHERE edb_info_id=? order by data_time asc`
-	sql = fmt.Sprintf(sql, dataTableName)
-	_, err = o.Raw(sql, edbInfoId).QueryRows(&existDataList)
-	return
-}
-
 // GetAllEdbDataListByTo 获取所有的指标数据列表
-func GetAllEdbDataListByTo(to orm.TxOrmer, edbInfoId, source, subSource int) (existDataList []*EdbData, err error) {
+func GetAllEdbDataListByTo(to *gorm.DB, edbInfoId, source, subSource int) (existDataList []*EdbData, err error) {
 	dataTableName := GetEdbDataTableName(source, subSource)
-	fmt.Println("dataTableName:", dataTableName)
 	sql := `SELECT * FROM %s WHERE edb_info_id=? order by data_time asc`
 	sql = fmt.Sprintf(sql, dataTableName)
-	_, err = to.Raw(sql, edbInfoId).QueryRows(&existDataList)
+	err = to.Raw(sql, edbInfoId).Find(&existDataList).Error
+
 	return
 }
 
 // GetFinalLastByTo 获取所有的指标数据列表
-func GetFinalLastByTo(to orm.TxOrmer, edbInfoId, source, subSource int, latestDate string) (finalLast EdbInfoSearchData, err error) {
+func GetFinalLastByTo(to *gorm.DB, edbInfoId, source, subSource int, latestDate string) (finalLast EdbInfoSearchData, err error) {
 	dataTableName := GetEdbDataTableName(source, subSource)
 	sql := fmt.Sprintf(` SELECT data_time , value FROM %s WHERE edb_info_id=? and data_time<=? ORDER BY data_time DESC `, dataTableName)
-	err = to.Raw(sql, edbInfoId, latestDate).QueryRow(&finalLast)
-	if err != nil && !utils.IsErrNoRow(err) {
+	err = to.Raw(sql, edbInfoId, latestDate).First(&finalLast).Error
+	if err != nil && err.Error() != utils.ErrNoRow() {
 		return
 	}
 	return
@@ -168,15 +174,15 @@ func GetFinalLastByTo(to orm.TxOrmer, edbInfoId, source, subSource int, latestDa
 
 // 新版本
 type EdbDataV1 struct {
-	EdbDataId     int `orm:"column(edb_data_id);pk"`
-	EdbInfoId     int
-	EdbCode       string
-	DataTime      string
-	Value         string
-	Status        int
-	CreateTime    time.Time
-	ModifyTime    time.Time
-	DataTimestamp int64
+	EdbDataId     int       `gorm:"primaryKey;autoIncrement;column:edb_data_id"`
+	EdbInfoId     int       `gorm:"column:edb_info_id"`
+	EdbCode       string    `gorm:"column:edb_code"`
+	DataTime      string    `gorm:"column:data_time"`
+	Value         string    `gorm:"column:value"`
+	Status        int       `gorm:"column:status"`
+	CreateTime    time.Time `gorm:"column:create_time"`
+	ModifyTime    time.Time `gorm:"column:modify_time"`
+	DataTimestamp int64     `gorm:"column:data_timestamp"`
 }
 
 type EdbDataList struct {
@@ -187,15 +193,15 @@ type EdbDataList struct {
 	Value         float64 `description:"数据值"`
 }
 
-func DelEdbDataByMysql(to orm.TxOrmer, edbInfoId int, tableName string, removeDateList []string) (err error) {
+func DelEdbDataByMysql(to *gorm.DB, edbInfoId int, tableName string, removeDateList []string) (err error) {
 	if len(removeDateList) <= 0 {
 		return
 	}
 	// 移除不存在的日期数据
-	removeDateStr := strings.Join(removeDateList, `","`)
-	removeDateStr = `"` + removeDateStr + `"`
+	removeDateStr := strings.Join(removeDateList, `','`)
+	removeDateStr = `'` + removeDateStr + `'`
 	sql := fmt.Sprintf(` DELETE FROM %s WHERE edb_info_id = ? and data_time in (%s) `, tableName, removeDateStr)
-	_, err = to.Raw(sql, edbInfoId).Exec()
+	err = to.Exec(sql, edbInfoId).Error
 	return
 }
 
@@ -258,3 +264,12 @@ type EditEdbBaseInfoReq struct {
 	UnitEn          string `description:"英文单位"`
 	ClassifyId      int    `description:"分类id"`
 }
+
+// ConvertDate
+// @Description: 格式化EdbData的日期
+// @receiver e
+func (m *EdbData) ConvertDate() {
+	m.DataTime = utils.GormDateStrToDateStr(m.DataTime)
+
+	return
+}

+ 27 - 53
models/edb_data_calculate_avg.go

@@ -3,11 +3,11 @@ package models
 import (
 	"encoding/json"
 	"errors"
+	"eta/eta_index_lib/global"
 	"eta/eta_index_lib/utils"
 	"fmt"
-	"github.com/beego/beego/v2/client/orm"
 	"github.com/shopspring/decimal"
-	"reflect"
+	"gorm.io/gorm"
 	"strconv"
 	"strings"
 	"time"
@@ -20,17 +20,12 @@ type CalculateAvg struct {
 func (obj CalculateAvg) Add(params AddCalculateBatchParams) (edbInfo *EdbInfo, err error, errMsg string) {
 	req := params.Req
 	edbCode := params.EdbCode
-	o := orm.NewOrm()
-	to, err := o.Begin()
-	if err != nil {
-		return
-	}
+	to := global.DEFAULT_DB.Begin()
 	defer func() {
 		if err != nil {
-			fmt.Println("CalculateAvg.Add,Err:" + err.Error())
-			_ = to.Rollback()
+			to.Rollback()
 		} else {
-			_ = to.Commit()
+			to.Commit()
 		}
 	}()
 	if req.EdbInfoId > 0 {
@@ -59,12 +54,11 @@ func (obj CalculateAvg) Add(params AddCalculateBatchParams) (edbInfo *EdbInfo, e
 	edbInfo.Extra = req.Extra
 	edbInfo.EdbNameEn = req.EdbName
 	edbInfo.UnitEn = req.Unit
-	newEdbInfoId, tmpErr := to.Insert(edbInfo)
+	tmpErr := to.Create(edbInfo).Error
 	if tmpErr != nil {
 		err = tmpErr
 		return
 	}
-	edbInfo.EdbInfoId = int(newEdbInfoId)
 
 	//关联关系
 	tagMap := make(map[string]int)
@@ -97,7 +91,7 @@ func (obj CalculateAvg) Add(params AddCalculateBatchParams) (edbInfo *EdbInfo, e
 
 		tagMap[v.FromTag] = v.EdbInfoId
 	}
-	_, err = to.InsertMulti(len(calculateMappingItemList), calculateMappingItemList)
+	err = to.CreateInBatches(calculateMappingItemList, 500).Error
 	if err != nil {
 		return
 	}
@@ -111,17 +105,12 @@ func (obj CalculateAvg) Add(params AddCalculateBatchParams) (edbInfo *EdbInfo, e
 func (obj CalculateAvg) Edit(params EditCalculateBatchParams) (err error, errMsg string) {
 	req := params.Req
 	edbInfo := params.EdbInfo
-	o := orm.NewOrm()
-	to, err := o.Begin()
-	if err != nil {
-		return
-	}
+	to := global.DEFAULT_DB.Begin()
 	defer func() {
 		if err != nil {
-			fmt.Println("CalculateAvg.Edit,Err:" + err.Error())
-			_ = to.Rollback()
+			to.Rollback()
 		} else {
-			_ = to.Commit()
+			to.Commit()
 		}
 	}()
 
@@ -147,22 +136,15 @@ func (obj CalculateAvg) Edit(params EditCalculateBatchParams) (err error, errMsg
 	edbInfo.EdbNameEn = req.EdbNameEn
 	edbInfo.UnitEn = req.UnitEn
 	edbInfo.ModifyTime = time.Now()
-	_, err = to.Update(edbInfo, "EdbName", "EdbNameSource", "Frequency", "Unit", "ClassifyId", "CalculateFormula", "Extra", "EmptyType", "MaxEmptyType", "ModifyTime", "EdbNameEn", "UnitEn")
+	err = to.Model(edbInfo).Select([]string{"EdbName", "EdbNameSource", "Frequency", "Unit", "ClassifyId", "CalculateFormula", "Extra", "EmptyType", "MaxEmptyType", "ModifyTime", "EdbNameEn", "UnitEn"}).Updates(edbInfo).Error
 	if err != nil {
 		return
 	}
 	//判断是否重复指标
-	//edbInfoMap := make(map[int]string)
 	if !needCalculate {
 		//用到的指标
 		newEdbInfoIdArr := make([]string, 0)
 		for _, tmpEdbInfo := range req.EdbInfoIdArr {
-			/*_, ok := edbInfoMap[tmpEdbInfo.EdbInfoId]
-			if ok {
-				br.Msg = "选择指标失败,请勿选择重复指标!"
-				return
-			}
-			edbInfoMap[tmpEdbInfo.EdbInfoId] = tmpEdbInfo.FromTag*/
 			newEdbInfoIdArr = append(newEdbInfoIdArr, strconv.Itoa(tmpEdbInfo.EdbInfoId))
 		}
 
@@ -184,7 +166,7 @@ func (obj CalculateAvg) Edit(params EditCalculateBatchParams) (err error, errMsg
 	}
 	//删除,计算指标关联的,基础指标的关联关系
 	sql := ` DELETE FROM edb_info_calculate_mapping WHERE edb_info_id = ? `
-	_, err = to.Raw(sql, edbInfo.EdbInfoId).Exec()
+	err = to.Exec(sql, edbInfo.EdbInfoId).Error
 	if err != nil {
 		err = errors.New("删除计算指标关联关系失败,Err:" + err.Error())
 		return
@@ -192,7 +174,7 @@ func (obj CalculateAvg) Edit(params EditCalculateBatchParams) (err error, errMsg
 	//清空原有数据
 	tableName := GetEdbDataTableName(edbInfo.Source, edbInfo.SubSource)
 	sql = ` DELETE FROM ` + tableName + ` WHERE edb_info_id = ? `
-	_, err = to.Raw(sql, edbInfo.EdbInfoId).Exec()
+	err = to.Exec(sql, edbInfo.EdbInfoId).Error
 	if err != nil {
 		return
 	}
@@ -228,7 +210,7 @@ func (obj CalculateAvg) Edit(params EditCalculateBatchParams) (err error, errMsg
 
 		tagMap[v.FromTag] = v.EdbInfoId
 	}
-	_, err = to.InsertMulti(len(calculateMappingItemList), calculateMappingItemList)
+	err = to.CreateInBatches(calculateMappingItemList, 500).Error
 	if err != nil {
 		return
 	}
@@ -252,17 +234,13 @@ func (obj CalculateAvg) Refresh(params RefreshParams) (err error, errMsg string)
 		fromEdbInfo, _ := GetEdbInfoById(v.FromEdbInfoId)
 		relationEdbInfoList = append(relationEdbInfoList, fromEdbInfo)
 	}
-	o := orm.NewOrm()
-	to, err := o.Begin()
-	if err != nil {
-		return
-	}
+
+	to := global.DEFAULT_DB.Begin()
 	defer func() {
 		if err != nil {
-			fmt.Println(reflect.TypeOf(obj).Name() + ",Err:" + err.Error())
-			_ = to.Rollback()
+			to.Rollback()
 		} else {
-			_ = to.Commit()
+			to.Commit()
 		}
 	}()
 
@@ -272,9 +250,7 @@ func (obj CalculateAvg) Refresh(params RefreshParams) (err error, errMsg string)
 	return
 }
 
-func (obj CalculateAvg) refresh(to orm.TxOrmer, edbInfoId, source, subSource int, edbInfoIdArr []*EdbInfo, edbCode, extra string, edbInfoTag map[string]int, emptyType int) (err error) {
-
-	//to orm.TxOrmer, edbInfoId, source, subSource int, edbInfoIdArr []*EdbInfo, edbCode, extra string, edbInfoTag map[string]int, emptyType int
+func (obj CalculateAvg) refresh(to *gorm.DB, edbInfoId, source, subSource int, edbInfoIdArr []*EdbInfo, edbCode, extra string, edbInfoTag map[string]int, emptyType int) (err error) {
 	realSaveDataMap := make(map[string]map[int]float64)
 	saveDataMap := make(map[string]map[int]float64)
 
@@ -369,12 +345,10 @@ func (obj CalculateAvg) refresh(to orm.TxOrmer, edbInfoId, source, subSource int
 	addSql := ` INSERT INTO ` + tableName + ` (edb_info_id,edb_code,data_time,value,create_time,modify_time,data_timestamp) values `
 	var isAdd bool
 
-	//获取指标所有数据
-	dataList := make([]*EdbData, 0)
 	dataTableName := GetEdbDataTableName(source, subSource)
-	sql := `SELECT * FROM %s WHERE edb_info_id=? `
-	sql = fmt.Sprintf(sql, dataTableName)
-	_, err = to.Raw(sql, edbInfoId).QueryRows(&dataList)
+
+	//获取指标所有数据
+	dataList, err := GetAllEdbDataListByTo(to, edbInfoId, source, subSource)
 	if err != nil {
 		return err
 	}
@@ -419,7 +393,7 @@ func (obj CalculateAvg) refresh(to orm.TxOrmer, edbInfoId, source, subSource int
 			if existStr != saveValue {
 				sql := ` UPDATE %s SET value=?,modify_time=NOW() WHERE edb_info_id=? AND data_time=? `
 				sql = fmt.Sprintf(sql, dataTableName)
-				_, err = to.Raw(sql, saveValue, edbInfoId, sk).Exec()
+				err = to.Exec(sql, saveValue, edbInfoId, sk).Error
 				if err != nil {
 					return err
 				}
@@ -429,7 +403,7 @@ func (obj CalculateAvg) refresh(to orm.TxOrmer, edbInfoId, source, subSource int
 
 	if isAdd {
 		addSql = strings.TrimRight(addSql, ",")
-		_, err = to.Raw(addSql).Exec()
+		err = to.Exec(addSql).Error
 		if err != nil {
 			fmt.Println("RefreshAllCalculate add Err", err.Error())
 			return
@@ -441,12 +415,12 @@ func (obj CalculateAvg) refresh(to orm.TxOrmer, edbInfoId, source, subSource int
 		for k := range removeDateMap {
 			removeDateList = append(removeDateList, k)
 		}
-		removeDateStr := strings.Join(removeDateList, `","`)
-		removeDateStr = `"` + removeDateStr + `"`
+		removeDateStr := strings.Join(removeDateList, `','`)
+		removeDateStr = `'` + removeDateStr + `'`
 		//如果拼接指标变更了,那么需要删除所有的指标数据
 		sql := fmt.Sprintf(` DELETE FROM %s WHERE edb_info_id = ? and data_time in (%s) `, tableName, removeDateStr)
 
-		_, err = to.Raw(sql, edbInfoId).Exec()
+		err = to.Exec(sql, edbInfoId).Error
 		if err != nil {
 			err = fmt.Errorf("删除计算失败的计算指标数据失败,Err:" + err.Error())
 			return

+ 336 - 209
models/edb_info.go

@@ -17,63 +17,111 @@ import (
 )
 
 type EdbInfo struct {
-	//EdbInfoId        int    `orm:"column(edb_info_id);pk"`
-	EdbInfoId        int    `gorm:"column:edb_info_id;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       time.Time
-	ModifyTime       time.Time
-	BaseModifyTime   time.Time
-	MinValue         float64 `description:"指标最小值"`
-	MaxValue         float64 `description:"指标最大值"`
-	CalculateFormula string  `description:"计算公式"`
-	EdbType          int     `description:"指标类型:1:基础指标,2:计算指标"`
-	IsUpdate         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(公历);"`
-	EmptyType        int     `description:"空值处理类型(0查找前后35天,1不计算,2前值填充,3后值填充,4等于0)"`
-	MaxEmptyType     int     `description:"MAX、MIN公式空值处理类型(1、等于0;2、跳过空值)"`
-	DataDateType     string  `orm:"column(data_date_type);size(255);null;default(交易日)"`
-	ManualSave       int     `description:"是否有手动保存过上下限: 0-否; 1-是"`
-	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:"指标的额外配置"`
-	IsStaticData     int     `description:"是否是静态指标,0否,1是"`
-	EndDateType      int     `description:"预测指标截止日期类型:0:未来日期,1未来期数"`
+	EdbInfoId        int       `gorm:"primaryKey;autoIncrement;column:edb_info_id" description:"唯一标识"`
+	EdbInfoType      int       `gorm:"column:edb_info_type" description:"指标类型,0:普通指标,1:预测指标"`
+	SourceName       string    `gorm:"column:source_name" description:"来源名称"`
+	Source           int       `gorm:"column:source" description:"来源id"`
+	EdbCode          string    `gorm:"column:edb_code" description:"指标编码"`
+	EdbName          string    `gorm:"column:edb_name" description:"指标名称"`
+	EdbNameEn        string    `gorm:"column:edb_name_en" description:"英文指标名称"`
+	EdbNameSource    string    `gorm:"column:edb_name_source" description:"指标名称来源"`
+	Frequency        string    `gorm:"column:frequency" description:"频率"`
+	Unit             string    `gorm:"column:unit" description:"单位"`
+	UnitEn           string    `gorm:"column:unit_en" description:"英文单位"`
+	StartDate        string    `gorm:"column:start_date" description:"起始日期"`
+	EndDate          string    `gorm:"column:end_date" description:"终止日期"`
+	ClassifyId       int       `gorm:"column:classify_id" description:"分类id"`
+	SysUserId        int       `gorm:"column:sys_user_id" description:"系统用户ID"`
+	SysUserRealName  string    `gorm:"column:sys_user_real_name" description:"系统用户真实姓名"`
+	UniqueCode       string    `gorm:"column:unique_code" description:"指标唯一编码"`
+	CreateTime       time.Time `gorm:"column:create_time" description:"创建时间"`
+	ModifyTime       time.Time `gorm:"column:modify_time" description:"修改时间"`
+	BaseModifyTime   time.Time `gorm:"column:base_modify_time" description:"基础修改时间"`
+	MinValue         float64   `gorm:"column:min_value" description:"指标最小值"`
+	MaxValue         float64   `gorm:"column:max_value" description:"指标最大值"`
+	CalculateFormula string    `gorm:"column:calculate_formula" description:"计算公式"`
+	EdbType          int       `gorm:"column:edb_type" description:"指标类型:1:基础指标,2:计算指标"`
+	IsUpdate         int       `gorm:"column:is_update" description:"当天是否已更新,1:未更新,2:已更新"`
+	Sort             int       `gorm:"column:sort" description:"排序字段"`
+	LatestDate       string    `gorm:"column:latest_date" description:"数据最新日期(实际日期)"`
+	LatestValue      float64   `gorm:"column:latest_value" description:"数据最新值(实际值)"`
+	EndValue         float64   `gorm:"column:end_value" description:"数据的最新值(预测日期的最新值)"`
+	MoveType         int       `gorm:"column:move_type" description:"移动方式:1:领先(默认),2:滞后"`
+	MoveFrequency    string    `gorm:"column:move_frequency" description:"移动频度"`
+	NoUpdate         int8      `gorm:"column:no_update" description:"是否停止更新,0:继续更新;1:停止更新"`
+	ServerUrl        string    `gorm:"column:server_url" description:"服务器地址"`
+	ChartImage       string    `gorm:"column:chart_image" description:"图表图片"`
+	Calendar         string    `gorm:"column:calendar;default:公历" description:"公历/农历"`
+	EmptyType        int       `gorm:"column:empty_type" description:"空值处理类型(0查找前后35天,1不计算,2前值填充,3后值填充,4等于0)"`
+	MaxEmptyType     int       `gorm:"column:max_empty_type" description:"MAX、MIN公式空值处理类型(1、等于0;2、跳过空值)"`
+	DataDateType     string    `gorm:"column:data_date_type;size:255;default:交易日" description:"数据日期类型"`
+	ManualSave       int       `gorm:"column:manual_save" description:"是否有手动保存过上下限: 0-否; 1-是"`
+	TerminalCode     string    `gorm:"column:terminal_code" description:"终端编码,用于配置在机器上"`
+	DataUpdateTime   string    `gorm:"column:data_update_time" description:"最近一次数据发生变化的时间"`
+	ErDataUpdateDate string    `gorm:"column:er_data_update_date" description:"本次更新,数据发生变化的最早日期"`
+	SourceIndexName  string    `gorm:"column:source_index_name" description:"数据源中的指标名称"`
+	SubSource        int       `gorm:"column:sub_source" description:"子数据来源:0:经济数据库,1:日期序列"`
+	SubSourceName    string    `gorm:"column:sub_source_name" description:"子数据来源名称"`
+	IndicatorCode    string    `gorm:"column:indicator_code" description:"指标代码"`
+	StockCode        string    `gorm:"column:stock_code" description:"证券代码"`
+	Extra            string    `gorm:"column:extra" description:"指标的额外配置"`
+	IsStaticData     int       `description:"是否是静态指标,0否,1是"`
+	EndDateType      int       `description:"预测指标截止日期类型:0:未来日期,1未来期数"`
 }
 
 func (e *EdbInfo) Add() (err error) {
-	//o := orm.NewOrm()
-	//_, err = o.Insert(e)
-	err = global.DEFAULT_DB.Create(&e).Error
+
+	err = global.DEFAULT_DB.Create(e).Error
+	return
+}
+
+// AfterFind 在该模型上设置钩子函数,把日期转成正确的string,所以查询函数只能用Find函数,First或者Scan是不会触发该函数的来获取数据
+func (m *EdbInfo) AfterFind(db *gorm.DB) (err error) {
+	if m.StartDate != "" {
+		minDateTmp, e := time.ParseInLocation(utils.FormatDateWallWithLoc, m.StartDate, time.Local)
+		if e != nil {
+			err = e
+			return
+		}
+		m.StartDate = minDateTmp.Format(utils.FormatDate)
+	}
+	if m.EndDate != "" {
+		maxDateTmp, e := time.ParseInLocation(utils.FormatDateWallWithLoc, m.EndDate, time.Local)
+		if e != nil {
+			err = e
+			return
+		}
+		m.EndDate = maxDateTmp.Format(utils.FormatDate)
+	}
+	if m.LatestDate != "" {
+		maxDateTmp, e := time.ParseInLocation(utils.FormatDateWallWithLoc, m.LatestDate, time.Local)
+		if e != nil {
+			err = e
+			return
+		}
+		m.LatestDate = maxDateTmp.Format(utils.FormatDate)
+	}
+	if m.DataUpdateTime != "" {
+		maxDateTmp, e := time.ParseInLocation(utils.FormatDateWallWithLoc, m.DataUpdateTime, time.Local)
+		if e != nil {
+			err = e
+			return
+		}
+		m.DataUpdateTime = maxDateTmp.Format(utils.FormatDate)
+	}
+
+	return
+}
+
+// ConvertDate
+// @Description: 格式化EdbInfo的日期
+// @receiver e
+func (e *EdbInfo) ConvertDate() {
+	e.StartDate = utils.GormDateStrToDateStr(e.StartDate)
+	e.EndDate = utils.GormDateStrToDateStr(e.EndDate)
+	e.LatestDate = utils.GormDateStrToDateStr(e.LatestDate)
+	e.DataUpdateTime = utils.GormDateStrToDateStr(e.DataUpdateTime)
+
 	return
 }
 
@@ -91,46 +139,74 @@ func AddEdbInfo(item *EdbInfo) (lastId int64, err error) {
 
 // EdbInfoList 指标数据列表
 type EdbInfoList struct {
-	EdbInfoId int `gorm:"column:edb_info_id;primaryKey"`
-	//EdbInfoId       int                    `orm:"column(edb_info_id);pk"`
-	EdbInfoType     int                    `description:"指标类型,0:普通指标,1:预测指标"`
-	SourceName      string                 `description:"来源名称"`
-	Source          int                    `description:"来源id"`
-	EdbCode         string                 `description:"指标编码"`
-	EdbNameEn       string                 `description:"英文指标名称"`
-	EdbName         string                 `description:"指标名称"`
-	Frequency       string                 `description:"频率"`
-	FrequencyEn     string                 `description:"英文频率"`
-	Unit            string                 `description:"单位"`
-	UnitEn          string                 `description:"英文单位"`
-	StartDate       string                 `description:"起始日期"`
-	EndDate         string                 `description:"终止日期"`
-	LatestDate      string                 `description:"数据最新日期(实际日期)"`
-	LatestValue     float64                `description:"数据最新值(实际值)"`
-	EndValue        float64                `description:"数据的最新值(预测日期的最新值)"`
-	ClassifyId      int                    `description:"分类id"`
-	UniqueCode      string                 `description:"指标唯一编码"`
-	SysUserId       int                    `description:"创建人id"`
-	SysUserRealName string                 `description:"创建人姓名"`
-	ModifyTime      string                 `description:"最新修改时间"`
-	CreateTime      string                 `description:"创建时间"`
-	EdbNameAlias    string                 `json:"-" description:"指标名称,别名"`
-	EdbType         int                    `description:"指标类型:1:基础指标,2:计算指标"`
-	ChartImage      string                 `description:"图表图片"`
-	RuleType        int                    `description:"预测规则,1:最新,2:固定值"`
-	FixedValue      float64                `description:"固定值"`
-	DataList        []*EdbData             `description:"实际指标数据"`
-	PredictDataList []*EdbData             `description:"预测指标数据"`
-	Button          EdbClassifyItemsButton `description:"操作权限"`
-	IsEnEdb         bool                   `description:"是否展示英文标识"`
-	DataDateType    string                 `description:"数据日期类型,枚举值:交易日、自然日"`
-	EmptyType       int                    `description:"空值处理类型(0查找前后35天,1不计算,2前值填充,3后值填充,4等于0)"`
-	MaxEmptyType    int                    `description:"MAX、MIN公式空值处理类型(1、等于0;2、跳过空值)"`
-	SubSource       int                    `description:"子数据来源:0:经济数据库,1:日期序列"`
-	SubSourceName   string                 `description:"子数据来源名称"`
-	IndicatorCode   string                 `description:"指标代码"`
-	StockCode       string                 `description:"证券代码"`
-	NoUpdate        int8                   `description:"是否停止更新,0:继续更新;1:停止更新"`
+	EdbInfoId   int    `gorm:"primaryKey;autoIncrement;column:edb_info_id" description:"唯一标识"`
+	EdbInfoType int    `gorm:"column:edb_info_type" description:"指标类型,0:普通指标,1:预测指标"`
+	SourceName  string `gorm:"column:source_name" description:"来源名称"`
+	Source      int    `gorm:"column:source" description:"来源id"`
+	EdbCode     string `gorm:"column:edb_code" description:"指标编码"`
+	EdbName     string `gorm:"column:edb_name" description:"指标名称"`
+	EdbNameEn   string `gorm:"column:edb_name_en" description:"英文指标名称"`
+	//EdbNameSource    string    `gorm:"column:edb_name_source" description:"指标名称来源"`
+	Frequency       string `gorm:"column:frequency" description:"频率"`
+	Unit            string `gorm:"column:unit" description:"单位"`
+	UnitEn          string `gorm:"column:unit_en" description:"英文单位"`
+	StartDate       string `gorm:"column:start_date" description:"起始日期"`
+	EndDate         string `gorm:"column:end_date" description:"终止日期"`
+	ClassifyId      int    `gorm:"column:classify_id" description:"分类id"`
+	SysUserId       int    `gorm:"column:sys_user_id" description:"系统用户ID"`
+	SysUserRealName string `gorm:"column:sys_user_real_name" description:"系统用户真实姓名"`
+	UniqueCode      string `gorm:"column:unique_code" description:"指标唯一编码"`
+	CreateTime      string `gorm:"column:create_time" description:"创建时间"`
+	ModifyTime      string `gorm:"column:modify_time" description:"修改时间"`
+	//BaseModifyTime   time.Time `gorm:"column:base_modify_time" description:"基础修改时间"`
+	//MinValue         float64   `gorm:"column:min_value" description:"指标最小值"`
+	/*MaxValue         float64   `gorm:"column:max_value" description:"指标最大值"`
+	CalculateFormula string    `gorm:"column:calculate_formula" description:"计算公式"`*/
+	EdbType int `gorm:"column:edb_type" description:"指标类型:1:基础指标,2:计算指标"`
+	//IsUpdate         int       `gorm:"column:is_update" description:"当天是否已更新,1:未更新,2:已更新"`
+	//Sort             int       `gorm:"column:sort" description:"排序字段"`
+	LatestDate  string  `gorm:"column:latest_date" description:"数据最新日期(实际日期)"`
+	LatestValue float64 `gorm:"column:latest_value" description:"数据最新值(实际值)"`
+	EndValue    float64 `gorm:"column:end_value" description:"数据的最新值(预测日期的最新值)"`
+	//MoveType         int       `gorm:"column:move_type" description:"移动方式:1:领先(默认),2:滞后"`
+	//MoveFrequency    string    `gorm:"column:move_frequency" description:"移动频度"`
+	NoUpdate int8 `gorm:"column:no_update" description:"是否停止更新,0:继续更新;1:停止更新"`
+	//ServerUrl        string    `gorm:"column:server_url" description:"服务器地址"`
+	ChartImage string `gorm:"column:chart_image" description:"图表图片"`
+	//Calendar         string    `gorm:"column:calendar;default:公历" description:"公历/农历"`
+	EdbNameAlias string `json:"-" description:"指标名称,别名"`
+	//RuleType        int                    `description:"预测规则,1:最新,2:固定值"`
+	//FixedValue      float64                `description:"固定值"`
+	EmptyType    int    `gorm:"column:empty_type" description:"空值处理类型(0查找前后35天,1不计算,2前值填充,3后值填充,4等于0)"`
+	MaxEmptyType int    `gorm:"column:max_empty_type" description:"MAX、MIN公式空值处理类型(1、等于0;2、跳过空值)"`
+	DataDateType string `gorm:"column:data_date_type;size:255;default:交易日" description:"数据日期类型"`
+	/*ManualSave       int       `gorm:"column:manual_save" description:"是否有手动保存过上下限: 0-否; 1-是"`
+	TerminalCode     string    `gorm:"column:terminal_code" description:"终端编码,用于配置在机器上"`
+	DataUpdateTime   string    `gorm:"column:data_update_time" description:"最近一次数据发生变化的时间"`
+	ErDataUpdateDate string    `gorm:"column:er_data_update_date" description:"本次更新,数据发生变化的最早日期"`
+	SourceIndexName  string    `gorm:"column:source_index_name" description:"数据源中的指标名称"`*/
+	SubSource     int    `gorm:"column:sub_source" description:"子数据来源:0:经济数据库,1:日期序列"`
+	SubSourceName string `gorm:"column:sub_source_name" description:"子数据来源名称"`
+	IndicatorCode string `gorm:"column:indicator_code" description:"指标代码"`
+	StockCode     string `gorm:"column:stock_code" description:"证券代码"`
+	//Extra            string    `gorm:"column:extra" description:"指标的额外配置"`
+	DataList []*EdbData `gorm:"column:-" description:"实际指标数据"`
+	//PredictDataList []*EdbData             `description:"预测指标数据"`
+	//Button          EdbClassifyItemsButton `description:"操作权限"`
+	//IsEnEdb         bool                   `description:"是否展示英文标识"`
+}
+
+// ConvertDate
+// @Description: 格式化EdbInfoList的日期
+// @receiver e
+func (e *EdbInfoList) ConvertDate() {
+	e.CreateTime = utils.GormDateStrToDateTimeStr(e.CreateTime)
+	e.ModifyTime = utils.GormDateStrToDateTimeStr(e.ModifyTime)
+	e.StartDate = utils.GormDateStrToDateStr(e.StartDate)
+	e.EndDate = utils.GormDateStrToDateStr(e.EndDate)
+	e.LatestDate = utils.GormDateStrToDateStr(e.LatestDate)
+
+	return
 }
 
 // EdbClassifyItemsButton 操作按钮
@@ -145,37 +221,53 @@ type EdbClassifyItemsButton struct {
 
 // GetEdbInfoByName 根据指标名称获取所有的指标数据列表
 func GetEdbInfoByName(edbName string) (items []*EdbInfoList, err error) {
-	//o := orm.NewOrm()
 	sql := ` SELECT * FROM edb_info WHERE edb_name=? `
-	//_, err = o.Raw(sql, edbName).QueryRows(&items)
-	err = global.DEFAULT_DB.Raw(sql, edbName).Find(&items).Error
+	err = global.DEFAULT_DB.Raw(sql, edbName).Scan(&items).Error
+
+	if err != nil {
+		return
+	}
+	for _, edbInfoItem := range items {
+		// 时间转格式
+		edbInfoItem.ConvertDate()
+	}
+
 	return
 }
 
 // ModifyEdbInfoNameSource 根据来源修改指标名称
 func ModifyEdbInfoNameSource(edbNameSource string, edbInfoId int) (err error) {
-	//o := orm.NewOrm()
+
 	sql := ` UPDATE  edb_info SET edb_name_source=? WHERE edb_info_id = ? `
-	//_, err = o.Raw(sql, edbNameSource, edbInfoId).Exec()
 	err = global.DEFAULT_DB.Exec(sql, edbNameSource, edbInfoId).Error
 	return
 }
 
 // GetEdbInfoById 根据指标id获取指标信息
 func GetEdbInfoById(edbInfoId int) (item *EdbInfo, err error) {
-	//o := orm.NewOrm()
-	sql := ` SELECT * FROM edb_info WHERE edb_info_id=? `
-	//err = o.Raw(sql, edbInfoId).QueryRow(&item)
+	sql := ` SELECT * FROM edb_info WHERE edb_info_id = ? `
 	err = global.DEFAULT_DB.Raw(sql, edbInfoId).First(&item).Error
+	if err != nil {
+		return
+	}
+
+	// 格式化日期
+	item.ConvertDate()
+
 	return
 }
 
 // GetEdbInfoByUniqueCode 根据指标唯一编码获取指标信息
 func GetEdbInfoByUniqueCode(uniqueCode string) (item *EdbInfo, err error) {
-	//o := orm.NewOrm()
+
 	sql := ` SELECT * FROM edb_info WHERE unique_code=? `
-	//err = o.Raw(sql, uniqueCode).QueryRow(&item)
 	err = global.DEFAULT_DB.Raw(sql, uniqueCode).First(&item).Error
+	if err != nil {
+		return
+	}
+
+	// 格式化日期
+	item.ConvertDate()
 	return
 }
 
@@ -185,11 +277,13 @@ func GetEdbInfoByIdList(edbInfoIdList []int) (items []*EdbInfo, err error) {
 	if num <= 0 {
 		return
 	}
-	//o := orm.NewOrm()
-	//sql := ` SELECT * FROM edb_info WHERE edb_info_id in (` + utils.GetOrmInReplace(num) + `) `
-	//_, err = o.Raw(sql, edbInfoIdList).QueryRows(&items)
-	sql := ` SELECT * FROM edb_info WHERE edb_info_id in ? `
-	err = global.DEFAULT_DB.Raw(sql, edbInfoIdList).Find(&items).Error
+
+	sql := ` SELECT * FROM edb_info WHERE edb_info_id in (` + utils.GetOrmInReplace(num) + `) `
+	err = global.DEFAULT_DB.Raw(sql, edbInfoIdList).Scan(&items).Error
+	// 日期格式转换
+	for _, v := range items {
+		v.ConvertDate()
+	}
 	return
 }
 
@@ -208,13 +302,13 @@ func GetEdbInfoListByIds(edbInfoIdList []int) (items []*EdbInfoList, err error)
 
 // Update 更新EdbInfo信息
 func (edbInfo *EdbInfo) Update(cols []string) (err error) {
-	//o := orm.NewOrm()
-	//_, err = o.Update(edbInfo, cols...)
-	err = global.DEFAULT_DB.Model(&edbInfo).Select(cols).Updates(&edbInfo).Error
+
+	err = global.DEFAULT_DB.Model(edbInfo).Select(cols).Updates(edbInfo).Error
 	return
 }
 
 // EdbInfoSearchData
+// @Description: 指标数据
 type EdbInfoSearchData struct {
 	EdbDataId     int     `description:"数据ID"`
 	EdbInfoId     int     `description:"指标ID"`
@@ -224,6 +318,15 @@ type EdbInfoSearchData struct {
 	DataTimestamp int64   `description:"时间戳"`
 }
 
+// ConvertTimeStr
+// @Description: 转成需要输出的格式
+// @receiver m
+func (m *EdbInfoSearchData) ConvertTimeStr() {
+	m.DataTime = utils.GormDateStrToDateStr(m.DataTime)
+
+	return
+}
+
 type FindEdbDataListAllCond struct {
 	EdbInfoId         int
 	StartDataTime     string
@@ -258,14 +361,13 @@ func GetEdbDataListAll(source, subSource int, findEdbDataListAllCond FindEdbData
 // @param subSource int
 // @param findEdbDataListAllCond FindEdbDataListAllCond
 // @param order int
-// @return item []*EdbInfoSearchData
+// @return items []*EdbInfoSearchData
 // @return err error
-func GetEdbDataListAllByMysql(source, subSource int, findEdbDataListAllCond FindEdbDataListAllCond, order int) (item []*EdbInfoSearchData, err error) {
+func GetEdbDataListAllByMysql(source, subSource int, findEdbDataListAllCond FindEdbDataListAllCond, order int) (items []*EdbInfoSearchData, err error) {
 	if findEdbDataListAllCond.EdbInfoId <= 0 {
 		return
 	}
-	//to := orm.NewOrm()
-	to := global.DEFAULT_DB.Begin()
+
 	sql := ``
 	tableName := GetEdbDataTableName(source, subSource)
 	sql = ` SELECT * FROM %s WHERE 1=1 `
@@ -295,8 +397,16 @@ func GetEdbDataListAllByMysql(source, subSource int, findEdbDataListAllCond Find
 	} else {
 		sql += ` ORDER BY data_time DESC `
 	}
-	//_, err = to.Raw(sql, pars).QueryRows(&item)
-	err = to.Raw(sql, pars...).Find(&item).Error
+	// todo
+	err = global.DEFAULT_DB.Raw(sql, pars...).Scan(&items).Error
+	if err != nil {
+		return
+	}
+	// 统一处理日期
+	for _, v := range items {
+		v.ConvertTimeStr()
+	}
+
 	return
 }
 
@@ -304,7 +414,7 @@ func GetEdbDataListAllByMysql(source, subSource int, findEdbDataListAllCond Find
 // @Description: 根据事务链接获取指标数据列表 order:1升序,其余值为降序
 // @author: Roc
 // @datetime 2024-05-08 15:34:06
-// @param to orm.TxOrmer
+// @param to *gorm.DB
 // @param source int
 // @param subSource int
 // @param findEdbDataListAllCond FindEdbDataListAllCond
@@ -323,14 +433,14 @@ func GetEdbDataListAllByTo(to *gorm.DB, source, subSource int, findEdbDataListAl
 // @Description: 根据事务链接获取指标数据列表 order:1升序,其余值为降序(Mysql)
 // @author: Roc
 // @datetime 2024-05-08 15:34:13
-// @param to orm.TxOrmer
+// @param to *gorm.DB
 // @param source int
 // @param subSource int
 // @param findEdbDataListAllCond FindEdbDataListAllCond
 // @param order int
-// @return item []*EdbInfoSearchData
+// @return items []*EdbInfoSearchData
 // @return err error
-func GetEdbDataListAllByMysqlTo(to *gorm.DB, source, subSource int, findEdbDataListAllCond FindEdbDataListAllCond, order int) (item []*EdbInfoSearchData, err error) {
+func GetEdbDataListAllByMysqlTo(to *gorm.DB, source, subSource int, findEdbDataListAllCond FindEdbDataListAllCond, order int) (items []*EdbInfoSearchData, err error) {
 	if findEdbDataListAllCond.EdbInfoId <= 0 {
 		return
 	}
@@ -363,9 +473,15 @@ func GetEdbDataListAllByMysqlTo(to *gorm.DB, source, subSource int, findEdbDataL
 	} else {
 		sql += ` ORDER BY data_time DESC `
 	}
-	//_, err = to.Raw(sql, pars).QueryRows(&item)
-	//err = to.Raw(sql, pars...).Find(&item).Error
-	err = to.Raw(sql, pars...).Find(&item).Error
+	err = to.Raw(sql, pars...).Scan(&items).Error
+	if err != nil {
+		return
+	}
+	// 统一处理日期
+	for _, v := range items {
+		v.ConvertTimeStr()
+	}
+
 	return
 }
 
@@ -428,25 +544,56 @@ type EdbInfoMaxAndMinInfo struct {
 	MaxDate     string  `description:"最大日期" bson:"max_date"`
 	MinValue    float64 `description:"最小值" bson:"min_value"`
 	MaxValue    float64 `description:"最大值" bson:"max_value"`
-	LatestValue float64 `description:"最新值" bson:"latest_value"`
-	LatestDate  string  `description:"实际数据最新日期" bson:"latest_date"`
+	LatestValue float64 `gorm:"-" description:"最新值" bson:"latest_value"`
+	LatestDate  string  `gorm:"-" description:"实际数据最新日期" bson:"latest_date"`
 	EndValue    float64 `description:"最新值" bson:"end_value"`
 	IndexCode   string  `description:"指标编码" bson:"index_code"`
 }
 
+// AfterFind 在该模型上设置钩子函数,把日期转成正确的string,所以查询函数只能用Find函数,First或者Scan是不会触发该函数的来获取数据
+func (m *EdbInfoMaxAndMinInfo) AfterFind(db *gorm.DB) (err error) {
+	if m.MinDate != "" {
+		minDateTmp, e := time.ParseInLocation(utils.FormatDateWallWithLoc, m.MinDate, time.Local)
+		if e != nil {
+			err = e
+			return
+		}
+		m.MinDate = minDateTmp.Format(utils.FormatDate)
+	}
+	if m.MaxDate != "" {
+		maxDateTmp, e := time.ParseInLocation(utils.FormatDateWallWithLoc, m.MaxDate, time.Local)
+		if e != nil {
+			err = e
+			return
+		}
+		m.MaxDate = maxDateTmp.Format(utils.FormatDate)
+	}
+	return
+}
+
+// EdbInfoMaxAndMinInfoTmp 指标最新数据记录结构体
+type EdbInfoMaxAndMinInfoTmp struct {
+	MinDate     time.Time `description:"最小日期" bson:"min_date"`
+	MaxDate     time.Time `description:"最大日期" bson:"max_date"`
+	MinValue    float64   `description:"最小值" bson:"min_value"`
+	MaxValue    float64   `description:"最大值" bson:"max_value"`
+	LatestValue float64   `gorm:"-" description:"最新值" bson:"latest_value"`
+	LatestDate  time.Time `gorm:"-" description:"实际数据最新日期" bson:"latest_date"`
+	EndValue    float64   `description:"最新值" bson:"end_value"`
+}
+
 // GetEdbInfoMaxAndMinInfo 获取指标的最新数据记录信息
 func GetEdbInfoMaxAndMinInfo(source, subSource int, edbCode string) (item *EdbInfoMaxAndMinInfo, err error) {
-	//o := orm.NewOrm()
 	sql := ``
 	tableName := GetEdbDataTableName(source, subSource)
 	sql = ` SELECT MIN(data_time) AS min_date,MAX(data_time) AS max_date,MIN(value) AS min_value,MAX(value) AS max_value FROM %s WHERE edb_code=? `
 	sql = fmt.Sprintf(sql, tableName)
-	//err = o.Raw(sql, edbCode).QueryRow(&item)
 	err = global.DEFAULT_DB.Raw(sql, edbCode).First(&item).Error
+
 	var latest_value float64
 	sql = ` SELECT value AS latest_value FROM %s WHERE edb_code=? ORDER BY data_time DESC LIMIT 1 `
 	sql = fmt.Sprintf(sql, tableName)
-	//err = o.Raw(sql, edbCode).QueryRow(&latest_value)
+	// todo 测试查询单个字段
 	err = global.DEFAULT_DB.Raw(sql, edbCode).Scan(&latest_value).Error
 	item.LatestValue = latest_value
 	return
@@ -456,42 +603,51 @@ type EdbIndoDataUpdateTime struct {
 	MinDate string `description:"本次更新,数据发生变化的最早日期"`
 }
 
+// AfterFind 在该模型上设置钩子函数,把日期转成正确的string,所以查询函数只能用Find函数,First或者Scan是不会触发该函数的来获取数据
+func (m *EdbIndoDataUpdateTime) AfterFind(db *gorm.DB) (err error) {
+	if m.MinDate == "" {
+		return
+	}
+	minDateTmp, err := time.ParseInLocation(utils.FormatDateWallWithLoc, m.MinDate, time.Local)
+	if err != nil {
+		return
+	}
+	m.MinDate = minDateTmp.Format(utils.FormatDate)
+	return
+}
+
 // GetEdbDataUpdateTimeByModify 获取指标的刷新时间获取最早的一条记录
 func GetEdbDataUpdateTimeByModify(source, subSource int, edbCode string, dataUpdateTime string) (item *EdbIndoDataUpdateTime, err error) {
-	//o := orm.NewOrm()
 	sql := ``
 	tableName := GetEdbDataTableName(source, subSource)
 	sql = ` SELECT MIN(data_time) AS min_date FROM %s WHERE edb_code=? and modify_time>=?`
 	sql = fmt.Sprintf(sql, tableName)
-	//err = o.Raw(sql, edbCode, dataUpdateTime).QueryRow(&item)
 	err = global.DEFAULT_DB.Raw(sql, edbCode, dataUpdateTime).First(&item).Error
+
 	return
 }
 
 // ModifyEdbInfoMaxAndMinInfo 修改指标的最新数据信息
 func ModifyEdbInfoMaxAndMinInfo(edbInfoId int, item *EdbInfoMaxAndMinInfo) (err error) {
-	//o := orm.NewOrm()
 	sql := ` UPDATE edb_info SET start_date=?,end_date=?,min_value=?,max_value=?,is_update=2,latest_date=?,latest_value=?, end_value = ?,modify_time=NOW() WHERE edb_info_id=? `
-	//_, err = o.Raw(sql, item.MinDate, item.MaxDate, item.MinValue, item.MaxValue, item.MaxDate, item.LatestValue, item.LatestValue, edbInfoId).Exec()
 	err = global.DEFAULT_DB.Exec(sql, item.MinDate, item.MaxDate, item.MinValue, item.MaxValue, item.MaxDate, item.LatestValue, item.LatestValue, edbInfoId).Error
+
 	return
 }
 
 // ModifyEdbTimeAndLastInfo 修改指标的最新数据信息(除上下限)
 func ModifyEdbTimeAndLastInfo(edbInfoId int, item *EdbInfoMaxAndMinInfo) (err error) {
-	//o := orm.NewOrm()
 	sql := `UPDATE edb_info SET start_date = ?, end_date = ?, is_update = 2,latest_date = ?, latest_value = ?, end_value = ?, modify_time = NOW() WHERE edb_info_id = ?`
-	//_, err = o.Raw(sql, item.MinDate, item.MaxDate, item.MaxDate, item.LatestValue, item.LatestValue, edbInfoId).Exec()
 	err = global.DEFAULT_DB.Exec(sql, item.MinDate, item.MaxDate, item.MaxDate, item.LatestValue, item.LatestValue, edbInfoId).Error
+
 	return
 }
 
 // ModifyEdbDataUpdateTime 修改指标刷新,本次数据刷新的最早日期
 func ModifyEdbDataUpdateTime(edbInfoId int, dataUpdateTime, erDataUpdateDate string) (err error) {
-	//o := orm.NewOrm()
 	sql := `UPDATE edb_info SET data_update_time = ?, er_data_update_date = ?, modify_time = NOW() WHERE edb_info_id = ?`
-	//_, err = o.Raw(sql, dataUpdateTime, erDataUpdateDate, edbInfoId).Exec()
 	err = global.DEFAULT_DB.Exec(sql, dataUpdateTime, erDataUpdateDate, edbInfoId).Error
+
 	return
 }
 
@@ -549,19 +705,16 @@ func GetLteZeroEdbDataCountByMongo(source, subSource, edbInfoId int) (count int,
 // @return count int
 // @return err error
 func GetLteZeroEdbDataCountByMysql(source, subSource, edbInfoId int) (count int, err error) {
-	//o := orm.NewOrm()
 	sql := ``
 	tableName := GetEdbDataTableName(source, subSource)
 	sql = ` SELECT COUNT(1) AS count FROM %s WHERE 1=1 AND edb_info_id =?  AND value <=0 `
 	sql = fmt.Sprintf(sql, tableName)
-	//err = o.Raw(sql, edbInfoId).QueryRow(&count)
 	err = global.DEFAULT_DB.Raw(sql, edbInfoId).Scan(&count).Error
 	return
 }
 
 // GetLastEdbData 获取最近的一条指标数据
 func GetLastEdbData(condition string, pars []interface{}, source, subSource int) (item *EdbInfoSearchData, err error) {
-	//o := orm.NewOrm()
 	sql := ``
 	tableName := GetEdbDataTableName(source, subSource)
 	sql = ` SELECT * FROM %s WHERE 1=1 `
@@ -571,19 +724,20 @@ func GetLastEdbData(condition string, pars []interface{}, source, subSource int)
 		sql += condition
 	}
 	sql += ` ORDER BY data_time DESC `
-	//err = o.Raw(sql, pars).QueryRow(&item)
 	err = global.DEFAULT_DB.Raw(sql, pars...).First(&item).Error
 	return
 }
 
 // GetEdbInfoByEdbCode 根据指标code获取指标信息
 func GetEdbInfoByEdbCode(source int, edbCode string) (item *EdbInfo, err error) {
-	//o := orm.NewOrm()
 	sql := ` SELECT * FROM edb_info WHERE source=? AND edb_code=? `
-	//err = o.Raw(sql, source, edbCode).QueryRow(&item)
 	err = global.DEFAULT_DB.Raw(sql, source, edbCode).First(&item).Error
-	if utils.IsErrNoRow(err) {
+
+	if errors.Is(err, orm.ErrNoRows) {
 		err = nil
+	} else {
+		// 格式化日期
+		item.ConvertDate()
 	}
 
 	return
@@ -591,36 +745,37 @@ func GetEdbInfoByEdbCode(source int, edbCode string) (item *EdbInfo, err error)
 
 // GetEdbInfoOnlyByEdbCode 仅根据指标code获取指标信息
 func GetEdbInfoOnlyByEdbCode(edbCode string) (item *EdbInfo, err error) {
-	//o := orm.NewOrm()
 	sql := ` SELECT * FROM edb_info WHERE edb_code=? `
-	//err = o.Raw(sql, edbCode).QueryRow(&item)
 	err = global.DEFAULT_DB.Raw(sql, edbCode).First(&item).Error
+	if err != nil {
+		return
+	}
+
+	// 格式化日期
+	item.ConvertDate()
+
 	return
 }
 
 // GetEdbInfoCalculateListByCondition 获取指标关系列表
 func GetEdbInfoCalculateListByCondition(condition string, pars []interface{}) (items []*EdbInfoCalculateMapping, err error) {
-	//o := orm.NewOrm()
-
 	sql := ` SELECT * FROM edb_info_calculate_mapping WHERE 1=1 `
 	if condition != "" {
 		sql += condition
 	}
-	err = global.DEFAULT_DB.Raw(sql, pars...).Find(&items).Error
-	//_, err = o.Raw(sql, pars).QueryRows(&items)
+	err = global.DEFAULT_DB.Raw(sql, pars...).Scan(&items).Error
+
 	return
 }
 
 // GetEdbInfoCalculateCountByCondition 获取关联指标数量
 func GetEdbInfoCalculateCountByCondition(condition string, pars []interface{}) (count int, err error) {
-	//o := orm.NewOrm()
-
 	sql := ` SELECT COUNT(1) AS count FROM edb_info_calculate_mapping WHERE 1=1 `
 	if condition != "" {
 		sql += condition
 	}
-	//err = o.Raw(sql, pars).QueryRow(&count)
 	err = global.DEFAULT_DB.Raw(sql, pars...).Scan(&count).Error
+
 	return
 }
 
@@ -631,9 +786,8 @@ type EdbInfoSearchDataV1 struct {
 	Value     string `description:"数据"`
 }
 
-// 优化版本-处理数据精度问题
-func GetEdbDataListAllV1(condition string, pars []interface{}, source, subSource, order int) (item []*EdbInfoSearchDataV1, err error) {
-	//o := orm.NewOrm()
+// GetEdbDataListAllV1ByTo 通过事务链接获取数据列表
+func GetEdbDataListAllV1ByTo(to *gorm.DB, condition string, pars []interface{}, source, subSource, order int) (items []*EdbInfoSearchDataV1, err error) {
 	sql := ``
 	tableName := GetEdbDataTableName(source, subSource)
 	sql = ` SELECT * FROM %s WHERE 1=1 `
@@ -647,28 +801,16 @@ func GetEdbDataListAllV1(condition string, pars []interface{}, source, subSource
 	} else {
 		sql += ` ORDER BY data_time DESC `
 	}
-	//_, err = o.Raw(sql, pars).QueryRows(&item)
-	err = global.DEFAULT_DB.Raw(sql, pars...).Find(&item).Error
-	return
-}
-
-// GetEdbDataListAllV1ByTo 通过事务链接获取数据列表
-func GetEdbDataListAllV1ByTo(to *gorm.DB, condition string, pars []interface{}, source, subSource, order int) (item []*EdbInfoSearchDataV1, err error) {
-	sql := ``
-	tableName := GetEdbDataTableName(source, subSource)
-	sql = ` SELECT * FROM %s WHERE 1=1 `
-	sql = fmt.Sprintf(sql, tableName)
-
-	if condition != "" {
-		sql += condition
+	err = to.Raw(sql, pars...).Scan(&items).Error
+	if err != nil {
+		return
 	}
-	if order == 1 {
-		sql += ` ORDER BY data_time ASC `
-	} else {
-		sql += ` ORDER BY data_time DESC `
+
+	// 日期格式化
+	for _, item := range items {
+		item.ConvertDate()
 	}
-	//_, err = to.Raw(sql, pars).QueryRows(&item)
-	err = to.Raw(sql, pars...).Find(&item).Error
+
 	return
 }
 
@@ -726,7 +868,6 @@ func UnifiedModifyEdbInfoMaxAndMinInfo(edbInfo *EdbInfo) (err error, errMsg stri
 	// 刷新关联的预测指标
 	go RefreshPredictStandardBaseByGeneralEdbInfoId(edbInfo.EdbInfoId)
 
-	//go ModifyPredictEdbInfoMaxAndMinInfoBySourceEdbInfoId(edbInfo.EdbInfoId, maxAndMinItem)
 	return
 }
 
@@ -739,7 +880,7 @@ func UnifiedModifyEdbInfoMaxAndMinInfoDataUpdate(edbInfo *EdbInfo, dataUpdateTim
 	// 获取本次刷新,指标数据更新的最早日期
 	erDataUpdateTime, tErr := GetEdbDataUpdateTimeByModify(edbInfo.Source, edbInfo.SubSource, edbInfo.EdbCode, dataUpdateTime)
 	if tErr != nil {
-		if !utils.IsErrNoRow(tErr) { //本次刷新指标数据无变化
+		if tErr.Error() != utils.ErrNoRow() { //本次刷新指标数据无变化
 			errMsg = "刷新指标失败!"
 			err = errors.New("查询指标刷新,数据更新的最早日期失败,err:" + tErr.Error())
 			return
@@ -1345,47 +1486,24 @@ func GetPredictEdbDataListAllByStartDate(edbInfo *EdbInfo, order int, startDate
 
 // ModifyPredictEdbInfoMaxAndMinInfo 修改预测指标的最新数据信息
 func ModifyPredictEdbInfoMaxAndMinInfo(edbInfoId int, item *EdbInfoMaxAndMinInfo) (err error) {
-	//o := orm.NewOrm()
+
 	sql := ` UPDATE edb_info SET start_date=?,end_date=?,min_value=?,max_value=?,is_update=2,latest_date=?,latest_value=?,end_value=?,modify_time=NOW() WHERE edb_info_id=? `
-	//_, err = o.Raw(sql, item.MinDate, item.MaxDate, item.MinValue, item.MaxValue, item.LatestDate, item.LatestValue, item.EndValue, edbInfoId).Exec()
 	err = global.DEFAULT_DB.Exec(sql, item.MinDate, item.MaxDate, item.MinValue, item.MaxValue, item.LatestDate, item.LatestValue, item.EndValue, edbInfoId).Error
 	return
 }
 
-// ModifyCalculateEdbInfo 修改计算指标信息
-func ModifyCalculateEdbInfo(edbName, frequency, unit, calculateFormula string, classifyId, edbInfoId int) (err error) {
-	//o := orm.NewOrm()
-	sql := ` UPDATE  edb_info
-			SET
-			  edb_name =?,
-			  edb_name_source =?,
-			  frequency = ?,
-			  unit = ?,
-			  classify_id = ?,
-			  calculate_formula=?,
-			  modify_time = NOW()
-			WHERE edb_info_id = ?`
-	//_, err = o.Raw(sql, edbName, edbName, frequency, unit, classifyId, calculateFormula, edbInfoId).Exec()
-	err = global.DEFAULT_DB.Exec(sql, edbName, edbName, frequency, unit, classifyId, calculateFormula, edbInfoId).Error
-	return
-}
-
 func GetEdbInfoItemByCondition(condition string, pars []interface{}) (item *EdbInfoList, err error) {
-	//o := orm.NewOrm()
 	sql := ` SELECT * FROM edb_info WHERE 1=1 `
 	if condition != "" {
 		sql += condition
 	}
-	//err = o.Raw(sql, pars).QueryRow(&item)
-	err = global.DEFAULT_DB.Raw(sql, pars...).Find(&item).Error
-	return
-}
+	err = global.DEFAULT_DB.Raw(sql, pars...).First(&item).Error
+	if err != nil {
+		return
+	}
+
+	item.ConvertDate()
 
-func GetEdbInfoItemListByCondition() (items []*EdbInfoList, err error) {
-	//o := orm.NewOrm()
-	sql := ` SELECT * FROM edb_info WHERE 1=1 `
-	//_, err = o.Raw(sql).QueryRows(&items)
-	err = global.DEFAULT_DB.Raw(sql).Find(&items).Error
 	return
 }
 
@@ -1756,3 +1874,12 @@ func ModifyEdbInfoDataStatus(edbInfoId int64, source, subSource int, edbCode str
 	err = global.DEFAULT_DB.Exec(sql, edbInfoId, edbCode).Error
 	return
 }
+
+// ConvertDate
+// @Description: 格式化EdbData的日期
+// @receiver e
+func (m *EdbInfoSearchDataV1) ConvertDate() {
+	m.DataTime = utils.GormDateStrToDateStr(m.DataTime)
+
+	return
+}

+ 57 - 52
utils/common.go

@@ -19,7 +19,6 @@ import (
 	"net"
 	"net/http"
 	"os"
-	"os/exec"
 	"path"
 	"regexp"
 	"runtime"
@@ -29,13 +28,12 @@ import (
 	"unicode"
 )
 
-// 随机数种子
-var rnd = rand.New(rand.NewSource(time.Now().UnixNano()))
-
 func GetRandString(size int) string {
 	allLetterDigit := []string{"0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z", "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z", "!", "@", "#", "$", "%", "^", "&", "*"}
 	randomSb := ""
 	digitSize := len(allLetterDigit)
+	// 随机数种子
+	rnd := rand.New(rand.NewSource(time.Now().UnixNano()))
 	for i := 0; i < size; i++ {
 		randomSb += allLetterDigit[rnd.Intn(digitSize)]
 	}
@@ -46,6 +44,8 @@ func GetRandStringNoSpecialChar(size int) string {
 	allLetterDigit := []string{"0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z", "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z"}
 	randomSb := ""
 	digitSize := len(allLetterDigit)
+	// 随机数种子
+	rnd := rand.New(rand.NewSource(time.Now().UnixNano()))
 	for i := 0; i < size; i++ {
 		randomSb += allLetterDigit[rnd.Intn(digitSize)]
 	}
@@ -80,21 +80,11 @@ func MD5(data string) string {
 
 // 获取数字随机字符
 func GetRandDigit(n int) string {
+	// 随机数种子
+	rnd := rand.New(rand.NewSource(time.Now().UnixNano()))
 	return fmt.Sprintf("%0"+strconv.Itoa(n)+"d", rnd.Intn(int(math.Pow10(n))))
 }
 
-// 获取随机数
-func GetRandNumber(n int) int {
-	return rnd.Intn(n)
-}
-
-func GetRandInt(min, max int) int {
-	if min >= max || min == 0 || max == 0 {
-		return max
-	}
-	return rand.Intn(max-min) + min
-}
-
 func GetToday(format string) string {
 	today := time.Now().Format(format)
 	return today
@@ -216,7 +206,8 @@ func GetToken() string {
 
 // 数据没有记录
 func ErrNoRow() string {
-	return "<QuerySeter> no row found"
+	//return "<QuerySeter> no row found"
+	return "record not found"
 }
 
 // 判断文件是否存在
@@ -518,39 +509,6 @@ func Sha1(data string) string {
 	return hex.EncodeToString(sha1.Sum([]byte("")))
 }
 
-func GetVideoPlaySeconds(videoPath string) (playSeconds float64, err error) {
-	cmd := `ffmpeg -i ` + videoPath + `  2>&1 | grep 'Duration' | cut -d ' ' -f 4 | sed s/,//`
-	out, err := exec.Command("bash", "-c", cmd).Output()
-	if err != nil {
-		return
-	}
-	outTimes := string(out)
-	fmt.Println("outTimes:", outTimes)
-	if outTimes != "" {
-		timeArr := strings.Split(outTimes, ":")
-		h := timeArr[0]
-		m := timeArr[1]
-		s := timeArr[2]
-		hInt, err := strconv.Atoi(h)
-		if err != nil {
-			return playSeconds, err
-		}
-
-		mInt, err := strconv.Atoi(m)
-		if err != nil {
-			return playSeconds, err
-		}
-		s = strings.Trim(s, " ")
-		s = strings.Trim(s, "\n")
-		sInt, err := strconv.ParseFloat(s, 64)
-		if err != nil {
-			return playSeconds, err
-		}
-		playSeconds = float64(hInt)*3600 + float64(mInt)*60 + float64(sInt)
-	}
-	return
-}
-
 func GetMaxTradeCode(tradeCode string) (maxTradeCode string, err error) {
 	tradeCode = strings.Replace(tradeCode, "W", "", -1)
 	tradeCode = strings.Trim(tradeCode, " ")
@@ -1022,11 +980,12 @@ func InArrayByInt(idStrList []int, searchId int) (has bool) {
 
 // GetOrmInReplace 获取orm的in查询替换?的方法
 func GetOrmInReplace(num int) string {
-	template := make([]string, num)
+	/*template := make([]string, num)
 	for i := 0; i < num; i++ {
 		template[i] = "?"
 	}
-	return strings.Join(template, ",")
+	return strings.Join(template, ",")*/
+	return "?"
 }
 
 // GetTimeSubDay 计算两个时间的自然日期差
@@ -1774,3 +1733,49 @@ func IsErrNoRow(err error) bool {
 	}
 	return errors.Is(err, gorm.ErrRecordNotFound)
 }
+
+// GormDateStrToDateTimeStr
+// @Description: gorm日期字符串格式转正常显示的日期时间字符串
+// @param originalString
+// @return formatStr
+func GormDateStrToDateTimeStr(originalString string) (formatStr string) {
+	formatStr = originalString
+	if !strings.Contains(originalString, "T") {
+		return
+	}
+
+	// 解析原始字符串
+	t, err := time.Parse(FormatDateWallWithLoc, originalString)
+	if err != nil {
+		fmt.Println("Error parsing time:", err)
+		return
+	}
+
+	// 重新格式化时间
+	formatStr = t.Format(FormatDateTime)
+
+	return
+}
+
+// GormDateStrToDateStr
+// @Description: gorm日期字符串格式转正常显示的日期字符串
+// @param originalString
+// @return formatStr
+func GormDateStrToDateStr(originalString string) (formatStr string) {
+	formatStr = originalString
+	if !strings.Contains(originalString, "T") {
+		return
+	}
+
+	// 解析原始字符串
+	t, err := time.Parse(FormatDateWallWithLoc, originalString)
+	if err != nil {
+		fmt.Println("Error parsing time:", err)
+		return
+	}
+
+	// 重新格式化时间
+	formatStr = t.Format(FormatDate)
+
+	return
+}

+ 12 - 11
utils/constants.go

@@ -4,17 +4,18 @@ import "time"
 
 // 常量定义
 const (
-	FormatTime                 = "15:04:05"                //时间格式
-	FormatDate                 = "2006-01-02"              //日期格式
-	FormatDateUnSpace          = "20060102"                //日期格式
-	FormatDateTime             = "2006-01-02 15:04:05"     //完整时间格式
-	FormatDateTimeMinute       = "2006-01-02 15:04"        //完整时间格式
-	HlbFormatDateTime          = "2006-01-02_15:04:05.999" //完整时间格式
-	FormatDateTimeUnSpace      = "20060102150405"          //完整时间格式
-	FormatShortDateTimeUnSpace = "060102150405"            //省去开头两位年份的时间格式
-	FormatYearMonthDate        = "2006-01"                 //日期格式
-	FormatYearMonthUnSpace     = "200601"                  //年月的日期格式
-	PageSize15                 = 15                        //列表页每页数据量
+	FormatTime                 = "15:04:05"                  //时间格式
+	FormatDate                 = "2006-01-02"                //日期格式
+	FormatDateUnSpace          = "20060102"                  //日期格式
+	FormatDateWallWithLoc      = "2006-01-02T15:04:05-07:00" //日期格式
+	FormatDateTime             = "2006-01-02 15:04:05"       //完整时间格式
+	FormatDateTimeMinute       = "2006-01-02 15:04"          //完整时间格式
+	HlbFormatDateTime          = "2006-01-02_15:04:05.999"   //完整时间格式
+	FormatDateTimeUnSpace      = "20060102150405"            //完整时间格式
+	FormatShortDateTimeUnSpace = "060102150405"              //省去开头两位年份的时间格式
+	FormatYearMonthDate        = "2006-01"                   //日期格式
+	FormatYearMonthUnSpace     = "200601"                    //年月的日期格式
+	PageSize15                 = 15                          //列表页每页数据量
 	PageSize5                  = 5
 	PageSize10                 = 10
 	PageSize20                 = 20