Browse Source

增加convert sql方法

kobe6258 3 weeks ago
parent
commit
8b9b3fa5ac

+ 16 - 0
models/data_manage/base_from_eia_stero.go

@@ -5,6 +5,7 @@ import (
 	"eta/eta_api/global"
 	"eta/eta_api/utils"
 	"github.com/rdlucklib/rdluck_tools/paging"
+	"gorm.io/gorm"
 	"time"
 )
 
@@ -84,6 +85,21 @@ type BaseFromEiaSteoDataItem struct {
 	CreateTime             string  `description:"创建时间"`
 }
 
+func (obj *BaseFromEiaSteoDataItem) AfterFind(tx *gorm.DB) (err error) {
+	if utils.NeedDateOrTimeFormat(utils.DbDriverName) {
+		if obj.CreateTime != "" {
+			obj.CreateTime = utils.GormDateStrToDateTimeStr(obj.CreateTime)
+		}
+		if obj.ModifyTime != "" {
+			obj.ModifyTime = utils.GormDateStrToDateTimeStr(obj.ModifyTime)
+		}
+		if obj.DataTime != "" {
+			obj.DataTime = utils.GormDateStrToDateStr(obj.DataTime)
+		}
+	}
+	return
+}
+
 // GetEiaSteoClassifyList 获取分类列表
 func GetEiaSteoClassifyList() (items []*BaseFromEiaSteoClassifyView, err error) {
 	sql := ` SELECT * FROM base_from_eia_steo_classify  ORDER BY base_from_eia_steo_classify_id ASC `

+ 2 - 1
models/data_manage/base_from_trade_index.go

@@ -136,7 +136,8 @@ func GetBaseFromTradeIndexByParam(exchange, date, classifyName, classifyType str
 
 func GetExchangeClassify(exchange, dataTime string) (classifyName []string, err error) {
 	o := global.DbMap[utils.DbNameIndex]
-	sql := "SELECT DISTINCT classify_name FROM base_from_trade_" + exchange + "_index where data_time=? ORDER BY CONVERT(classify_name using gbk) DESC"
+	sql := "SELECT DISTINCT classify_name FROM base_from_trade_" + exchange + fmt.Sprintf("_index where data_time=? ORDER BY %s DESC", utils.GenerateQuerySql(utils.ConvertColumn, &utils.QueryParam{ConvertColumn: "classify_name"}))
+	//sql := "SELECT DISTINCT classify_name FROM base_from_trade_" + exchange + "_index where data_time=? ORDER BY CONVERT(classify_name using gbk) DESC"
 	err = o.Raw(sql, dataTime).Scan(&classifyName).Error
 	return
 }

+ 1 - 1
models/data_manage/base_from_yongyi_classify.go

@@ -79,7 +79,7 @@ type BaseFromYongyiClassifyItems struct {
 	ParentId        int                            `description:"父级id"`
 	Level           int                            `description:"层级"`
 	Sort            int                            `description:"排序字段,越小越靠前,默认值:10"`
-	Children        []*BaseFromYongyiClassifyItems `grom:"-"`
+	Children        []*BaseFromYongyiClassifyItems `gorm:"-"`
 }
 
 type BaseFromYongyiClassifyNameItems struct {

+ 6 - 4
models/target.go

@@ -798,8 +798,10 @@ func GetTargetItems(mobile string, classifyId int) (lastItems SortEdbInfo, err e
 	//        WHERE a.classify_id=` + strconv.Itoa(classifyId) + ` AND a.classify_id>0
 	//         GROUP BY a.TRADE_CODE `
 	//}
-
-	sql = sql + ` ORDER BY CONVERT(a.SEC_NAME USING gbk )  COLLATE gbk_chinese_ci ASC `
+	//` ORDER BY CONVERT(a.SEC_NAME USING gbk )  COLLATE gbk_chinese_ci ASC `
+	sql = sql + fmt.Sprintf(` ORDER BY %s  COLLATE gbk_chinese_ci ASC `, utils.GenerateQuerySql(utils.ConvertColumn, &utils.QueryParam{
+		ConvertColumn: "a.SEC_NAME",
+	}))
 	err = o.Raw(sql).Find(&items).Error
 	if err != nil {
 		return
@@ -1414,8 +1416,8 @@ left join edbdata b on a.TRADE_CODE=b.TRADE_CODE `
 		sql += ` AND b.CLOSE is null `
 	}
 	sql += ` GROUP BY a.TRADE_CODE `
-
-	sql = sql + ` ORDER BY CONVERT(a.SEC_NAME USING gbk )  COLLATE gbk_chinese_ci ASC `
+	//sql = sql + ` ORDER BY CONVERT(a.SEC_NAME USING gbk )  COLLATE gbk_chinese_ci ASC `
+	sql = sql + fmt.Sprintf(` ORDER BY %s  COLLATE gbk_chinese_ci ASC `, utils.GenerateQuerySql(utils.ConvertColumn, &utils.QueryParam{ConvertColumn: "a.SEC_NAME"}))
 	err = o.Raw(sql, pars...).Find(&items).Error
 	return
 

+ 89 - 17
utils/sql.go

@@ -13,12 +13,13 @@ type Driver string
 type SqlCondition string
 
 const (
-	DM        Driver       = "dm"
-	MySql     Driver       = "mysql"
-	GroupUnit SqlCondition = "GroupUnit"
-	Distinct  SqlCondition = "Distinct"
-	Order     SqlCondition = "Order"
-	Delimiter SqlCondition = "Delimiter"
+	DM            Driver       = "dm"
+	MySql         Driver       = "mysql"
+	GroupUnit     SqlCondition = "GroupUnit"
+	Distinct      SqlCondition = "Distinct"
+	Order         SqlCondition = "Order"
+	Delimiter     SqlCondition = "Delimiter"
+	ConvertColumn SqlCondition = "ConvertColumn"
 )
 
 var TemplateMap = map[SqlCondition]map[Driver]string{
@@ -26,6 +27,10 @@ var TemplateMap = map[SqlCondition]map[Driver]string{
 		MySql: `GROUP_CONCAT({{.Distinct}} {{.Column}} {{.Order}} SEPARATOR '{{.Delimiter}}')`,
 		DM:    `LISTAGG({{.Distinct}} {{.Column}},'{{.Delimiter}}') WITHIN GROUP ({{.Order}})`,
 	},
+	ConvertColumn: {
+		MySql: `CONVERT({{.ConvertColumn}} USING gbk )`,
+		DM:    `{{.ConvertColumn}}`,
+	},
 }
 
 var supportDriverMap = map[string]Driver{
@@ -35,14 +40,15 @@ var supportDriverMap = map[string]Driver{
 }
 
 type QueryParam struct {
-	Driver      string
-	Column      string
-	Order       string
-	Distinct    string
-	Delimiter   string
-	OrderField  string
-	OrderRule   string
-	HasDistinct bool
+	Driver        string
+	Column        string
+	Order         string
+	Distinct      string
+	Delimiter     string
+	OrderField    string
+	OrderRule     string
+	ConvertColumn string `description:"Convert指令传递的clounm"`
+	HasDistinct   bool
 }
 type SqlParam interface {
 	GetParamName() string
@@ -61,6 +67,71 @@ func (distinctParam *DistinctParam) GetFormatConditionStr(param *QueryParam) str
 	return ""
 }
 
+type ConvertParam struct {
+}
+
+func (convertParam *ConvertParam) GetParamName() string {
+	return "Convert"
+}
+func (convertParam *ConvertParam) GetFormatConditionStr(param *QueryParam) (sqlStr string) {
+	dbDriver, _ := getDriverInstance(param.Driver)
+	if param.ConvertColumn == "" {
+		FileLog.Error("转换字段为空,无法生成聚合sql")
+		return
+	}
+	var templateSqlStr string
+	if _, ok := TemplateMap[ConvertColumn][dbDriver]; !ok {
+		templateSqlStr = TemplateMap[ConvertColumn][MySql]
+	} else {
+		templateSqlStr = TemplateMap[ConvertColumn][dbDriver]
+	}
+	if templateSqlStr == "" {
+		FileLog.Error("转换sql模板不存在,无法生成转换sql")
+		return
+	}
+	templateSql, err := template.New("ConvertColumn").Parse(templateSqlStr)
+	if err != nil {
+		FileLog.Error("failed to parse template: %v", err)
+		return
+	}
+	//反射获取结构体的值
+	value := reflect.ValueOf(param)
+	// 检查是否是指针
+	if value.Kind() != reflect.Ptr {
+		fmt.Println("请求参数必须是一个结构体")
+		return
+	}
+	// 获取结构体的元素
+	elem := value.Elem()
+	// 检查是否是结构体
+	if elem.Kind() != reflect.Struct {
+		fmt.Println("请求参数必须是一个结构体")
+		return
+	}
+	// 获取字段的值
+	fieldValue := elem.FieldByName("ConvertColumn")
+	// 检查字段是否存在
+	if !fieldValue.IsValid() {
+		fmt.Printf("Error: field %s not found\n", "ConvertColumn")
+		return
+	}
+	// 检查字段是否可导出
+	if !fieldValue.CanSet() {
+		fmt.Printf("Error: field %s is not exported and cannot be set\n", "ConvertColumn")
+		return
+	}
+	// 渲染模板
+	var buf bytes.Buffer
+	err = templateSql.Execute(&buf, param)
+	if err != nil {
+		fmt.Sprintf("执行模板填充失败: %v", err)
+		return
+	}
+	sqlStr = buf.String()
+	fmt.Printf("生成的准换编码语句为:%s\n", sqlStr)
+	return sqlStr
+}
+
 var sqlGeneratorFactory = map[SqlCondition]SqlParam{
 	// 添加支持的语法
 	GroupUnit: &GroupUnitParam{
@@ -70,9 +141,10 @@ var sqlGeneratorFactory = map[SqlCondition]SqlParam{
 			Delimiter,
 		},
 	},
-	Order:     &OrderParam{},
-	Delimiter: &DelimiterParam{},
-	Distinct:  &DistinctParam{},
+	Order:         &OrderParam{},
+	Delimiter:     &DelimiterParam{},
+	Distinct:      &DistinctParam{},
+	ConvertColumn: &ConvertParam{},
 }
 
 type DelimiterParam struct {