kobe6258 1 month ago
parent
commit
8234ddb3c6

+ 13 - 7
models/base_from_rzd_data.go

@@ -2,11 +2,17 @@
 package models
 
 type BaseFromRzdData struct {
-	BaseFromRzdDataId  int     `orm:"column(base_from_rzd_data_id);pk"`
-	BaseFromRzdIndexId int     `orm:"column(base_from_rzd_index_id)"`
-	CreateTime         string  `orm:"column(create_time)"`
-	DataTime           string  `orm:"column(data_time)"`
-	IndexCode          string  `orm:"column(index_code)"`
-	ModifyTime         string  `orm:"column(modify_time)"`
-	Value              float64 `orm:"column(value)"`
+	BaseFromRzdDataId  int
+	BaseFromRzdIndexId int
+	DataTime           string
+	IndexCode          string
+	Value              float64
+}
+
+type RzdIndexData struct {
+	BaseFromRzdDataId  int
+	BaseFromRzdIndexId int
+	DataTime           string
+	IndexCode          string
+	Value              float64
 }

+ 16 - 3
models/base_from_rzd_index.go

@@ -2,6 +2,10 @@
 // @Author gmy 2024/8/7 9:38:00
 package models
 
+import (
+	"time"
+)
+
 type BaseFromRzdIndex struct {
 	BaseFromRzdIndexId   int    `orm:"column(base_from_rzd_index_id);pk"`
 	CreateTime           string `orm:"column(create_time)"`
@@ -14,9 +18,18 @@ type BaseFromRzdIndex struct {
 }
 
 type IndexInfo struct {
+	StartDate   time.Time
+	EndDate     time.Time
+	LatestValue float64
 	IndexName   string
 	IndexCode   string
-	Value       float64
-	IndexInfoId int
-	DataTime    string
+	Frequency   string
+	Unit        string
+	ClassifyId  int
+	DataList    []IndexData
+}
+
+type IndexData struct {
+	DataTime time.Time
+	Value    float64
 }

+ 3 - 50
services/ruizide/data_processor.go

@@ -456,6 +456,7 @@ func FileResolverV2() error {
 		utils.FileLog.Error("获取睿咨得分类数据失败:", err.Error())
 		return err
 	}
+	RzdClassifyMap = make(map[string]*models.BaseFromRzdClassify)
 	//更新睿咨得分类Map
 	for _, classify := range rzdClassifyList {
 		RzdClassifyMap[classify.ClassifyName] = &classify
@@ -463,63 +464,15 @@ func FileResolverV2() error {
 	for _, tableName := range tableNameList {
 		rzdProcessor, processorErr := GetRZDProcessor(tableName)
 		if processorErr != nil {
-			fmt.Printf("获取睿咨得数据处理器: %v", processorErr)
+			//fmt.Printf("获取睿咨得数据处理器: %v", processorErr)
 			utils.FileLog.Error("获取睿咨得数据处理器:", processorErr.Error())
 			continue
 		}
-		_, err = rzdProcessor.Process(tableName)
+		err = rzdProcessor.Process(tableName)
 		if err != nil {
 			utils.FileLog.Error(fmt.Sprintf("%s处理数据失败:", tableName), err.Error())
 			continue
 		}
-		// 新增指标库数据
-		edbDataList := []models.EdbDataRzd{}
-		for _, index := range indexData {
-			// 补充 判断是否存在于指标库
-			paramsLib := make(map[string]interface{})
-			paramsLib["IndexCode"] = index.IndexCode
-			paramsLib["Source"] = utils.DATA_SOURCE_RZD
-			postEdbLib, err := httpRequestFill(paramsLib, utils.GET_RZD_EDB_INFO_BY_INDEX_CODE)
-			if err != nil {
-				// 有错误就不继续执行
-				utils.FileLog.Error("postEdbLib err: %v", err)
-				continue
-			}
-			var requestResponse models.RequestResponse[models.EdbInfo]
-			err = json.Unmarshal(postEdbLib, &requestResponse)
-			if err != nil {
-				utils.FileLog.Error("postEdbLib err: %v", err)
-				continue
-			}
-
-			if requestResponse.Data.EdbInfoId != 0 {
-				edbDataRzd := models.EdbDataRzd{
-					CreateTime:    utils.GetCurrentTime(),
-					ModifyTime:    utils.GetCurrentTime(),
-					EdbInfoId:     index.BaseFromRzdIndexId,
-					EdbCode:       index.IndexCode,
-					DataTime:      index.DataTime,
-					Value:         index.Value,
-					DataTimestamp: uint64(utils.StringToTimeFormat(index.DataTime, utils.FormatDate).UnixMilli()),
-				}
-				edbDataList = append(edbDataList, edbDataRzd)
-			}
-		}
-
-		if len(edbDataList) > 0 {
-			// 转换成json
-			marshal, err := json.Marshal(edbDataList)
-			if err != nil {
-				utils.FileLog.Error("postEdbLib err: %v", err)
-				return err
-			}
-			_, err = utils.HttpPostRequest(utils.EDB_LIB_URL+utils.ADD_BATCH_RZD_EDB_DATA, string(marshal), "application/json")
-			if err != nil {
-				// 有错误就不继续执行
-				utils.FileLog.Error("postEdbLib err: %v", err)
-				return err
-			}
-		}
 	}
 	return nil
 }

+ 153 - 171
services/ruizide/oil_demand_signals_weekly_report_processor.go

@@ -21,6 +21,7 @@ var (
 			IndexNameColOne: "Index",
 			IndexNameColTwo: "Index 7DMA",
 			IndexPrefix:     "Road Index",
+			BeginRow:        4,
 			Rows:            5,
 			IndexRow:        2,
 			DataOneRow:      3,
@@ -33,6 +34,7 @@ var (
 			IndexNameColOne: "Active Fleet",
 			IndexNameColTwo: "Active Fleet 7DMA",
 			IndexPrefix:     "Road Active Fleet",
+			BeginRow:        4,
 			Rows:            5,
 			IndexRow:        2,
 			DataOneRow:      3,
@@ -45,6 +47,7 @@ var (
 			IndexNameColOne: "Index",
 			IndexNameColTwo: "Index 7DMA",
 			IndexPrefix:     "Aviation Index",
+			BeginRow:        4,
 			Rows:            5,
 			IndexRow:        2,
 			DataOneRow:      3,
@@ -57,6 +60,7 @@ var (
 			IndexNameColOne: "Active Fleet",
 			IndexNameColTwo: "Active Fleet 7DMA",
 			IndexPrefix:     "Aviation Active Fleet",
+			BeginRow:        4,
 			Rows:            5,
 			IndexRow:        2,
 			DataOneRow:      3,
@@ -69,6 +73,7 @@ var (
 			IndexNameColOne: "Demand",
 			IndexNameColTwo: "Demand 7DMA",
 			IndexPrefix:     "Gasoline Demand",
+			BeginRow:        4,
 			Rows:            6,
 			IndexRow:        3,
 			DataOneRow:      4,
@@ -81,6 +86,7 @@ var (
 			IndexNameColOne: "Demand",
 			IndexNameColTwo: "Demand 7DMA",
 			IndexPrefix:     "Demand Diesel",
+			BeginRow:        4,
 			Rows:            6,
 			IndexRow:        3,
 			DataOneRow:      4,
@@ -93,6 +99,7 @@ var (
 			IndexNameColOne: "Demand",
 			IndexNameColTwo: "Demand 7DMA",
 			IndexPrefix:     "Demand Jet Fuel",
+			BeginRow:        4,
 			Rows:            6,
 			IndexRow:        3,
 			DataOneRow:      4,
@@ -105,6 +112,7 @@ var (
 			IndexNameColOne: "Demand",
 			IndexNameColTwo: "Demand 7DMA",
 			IndexPrefix:     "Demand Maritime Bunker",
+			BeginRow:        4,
 			Rows:            6,
 			IndexRow:        3,
 			DataOneRow:      4,
@@ -120,6 +128,7 @@ type config struct {
 	IndexNameColOne string
 	IndexNameColTwo string
 	IndexPrefix     string
+	BeginRow        int
 	Rows            int
 	IndexRow        int
 	DataOneRow      int
@@ -129,12 +138,12 @@ type config struct {
 type OilDemandSignalsWeeklyReportProcessor struct {
 }
 
-func (p *OilDemandSignalsWeeklyReportProcessor) Process(tableName string) (list []models.BaseFromRzdData, err error) {
+func (p *OilDemandSignalsWeeklyReportProcessor) Process(tableName string) (err error) {
 	var fileName string
 	// 解析表格
 	fileName = tableName + "_" + utils.GetCurrentYearMonth() + ".xlsx"
 	filePath := filepath.Join(excelDir, fileName)
-	if _, err := os.Stat(filePath); os.IsNotExist(err) {
+	if _, err = os.Stat(filePath); os.IsNotExist(err) {
 		utils.FileLog.Error("文件不存在: %v", err)
 		return
 	}
@@ -151,7 +160,9 @@ func (p *OilDemandSignalsWeeklyReportProcessor) Process(tableName string) (list
 		utils.FileLog.Error("获取分类Id失败: %v", err)
 		return
 	}
+	//按照sheet页来处理数据,一个sheet发送一次服务器
 	for _, sheetName := range sheetNames {
+		var indexMap = make(map[string]*models.IndexInfo)
 		if sheetName == "Content" {
 			utils.FileLog.Info("跳过工作表:", sheetName)
 			continue
@@ -163,190 +174,161 @@ func (p *OilDemandSignalsWeeklyReportProcessor) Process(tableName string) (list
 			utils.FileLog.Error("获取工作表数据时出错: %v", excelErr)
 			continue
 		}
-		var indexData []models.BaseFromRzdData
-		for rowIndex, rowData := range dataRows[:] {
-			if rowIndex < 4 {
-				return nil, nil
+		sheetConfig := OilDemandSignalsWeeklyReportConfigMap[sheetName]
+		for _, rowData := range dataRows[sheetConfig.BeginRow:] {
+			//处理数据不全的情况
+			less := sheetConfig.Rows - len(rowData)
+			if less > 0 {
+				for i := 0; i < less; i++ {
+					rowData = append(rowData, "")
+				}
 			}
-
-			frequency := "日度"
-			unit := "辆"
-			indexNameColOne := "Active Fleet"
-			indexNameColTwo := "Active Fleet 7DMA"
-
-			// step_1: 分类
-			classifyId, err := dealClassify(tableName, sheetName)
-			if err != nil {
-				return nil, err
+			// 匹配非数字字符
+			re := regexp.MustCompile(`^\d*\.?\d*\s*$`)
+			if !re.MatchString(strings.TrimSpace(rowData[sheetConfig.DataOneRow])) || !re.MatchString(strings.TrimSpace(rowData[sheetConfig.DataTwoRow])) {
+				utils.FileLog.Error("数据格式错误:", fmt.Sprintf("%v", rowData))
+				continue
 			}
-			utils.FileLog.Info("classifyId: %v", classifyId)
-
+			classifyId := classifyIds[sheetName]
 			// step_2: 指标
 			// 指标名称
-			indexNameOne := sheetName + "/" + rowData[len(rowData)-3] + "/" + indexNameColOne
-			indexNameTwo := sheetName + "/" + rowData[len(rowData)-3] + "/" + indexNameColTwo
-
+			indexNameOne := sheetName + "/" + rowData[sheetConfig.IndexRow] + "/" + sheetConfig.IndexNameColOne
+			indexNameTwo := sheetName + "/" + rowData[sheetConfig.IndexRow] + "/" + sheetConfig.IndexNameColTwo
 			// 生成指标编码
-			indexCodeOne, err := getIndexId(sheetName, strings.ReplaceAll(strings.ToLower(rowData[len(rowData)-3]), " ", ""), indexNameColOne)
-			indexCodeTwo, err := getIndexId(sheetName, strings.ReplaceAll(strings.ToLower(rowData[len(rowData)-3]), " ", ""), indexNameColTwo)
-
-			var indexInfoList []*models.IndexInfo
-			valueOne, err := strconv.ParseFloat(strings.ReplaceAll(rowData[len(rowData)-2], ",", ""), 64)
-			if err != nil {
-				utils.FileLog.Error(fmt.Sprintf("转换data数据失败,index_code:%s,data_value:%s err:%v", indexCodeOne, rowData[len(rowData)-2], err))
-				return nil, err
+			indexCodeOne := getIndexId(sheetName, strings.ReplaceAll(strings.ToLower(rowData[len(rowData)-3]), " ", ""), sheetConfig.IndexNameColOne)
+			indexCodeTwo := getIndexId(sheetName, strings.ReplaceAll(strings.ToLower(rowData[len(rowData)-3]), " ", ""), sheetConfig.IndexNameColTwo)
+			dataTime := rowData[sheetConfig.DateRow]
+			date, _, convertErr := utils.ConvertDateFormat(dataTime)
+			if convertErr != nil {
+				utils.FileLog.Error(fmt.Sprintf("转换时间数据失败,index_code:%s,time_value:%s err:%v", indexCodeOne, dataTime, convertErr))
+				continue
 			}
-
-			dataTimeOne := rowData[1]
-			formatOne, err := utils.ConvertDateFormat(dataTimeOne)
-			if err != nil {
-				utils.FileLog.Error(fmt.Sprintf("转换时间数据失败,index_code:%s,time_value:%s err:%v", indexCodeOne, dataTimeOne, err))
-				return nil, err
-			}
-
-			indexInfoList = append(indexInfoList, &models.IndexInfo{
-				IndexName: indexNameOne,
-				IndexCode: indexCodeOne,
-				Value:     valueOne,
-				DataTime:  formatOne,
-			})
-			valueTwo, err := strconv.ParseFloat(strings.ReplaceAll(rowData[len(rowData)-1], ",", ""), 64)
-			if err != nil {
-				utils.FileLog.Error(fmt.Sprintf("转换data数据失败,index_code:%s,data_value:%s err:%v", indexCodeTwo, rowData[len(rowData)-1], err))
-				return nil, err
-			}
-			indexInfoList = append(indexInfoList, &models.IndexInfo{
-				IndexName: indexNameTwo,
-				IndexCode: indexCodeTwo,
-				Value:     valueTwo,
-				DataTime:  formatOne,
-			})
-
-			indexInfoList, err = dealIndex(indexInfoList, frequency, unit, classifyId)
-			if err != nil {
-				return nil, err
+			if rowData[sheetConfig.DataOneRow] != "" {
+				valueOne, parseErr := strconv.ParseFloat(strings.ReplaceAll(rowData[sheetConfig.DataOneRow], ",", ""), 64)
+				if parseErr != nil {
+					utils.FileLog.Error(fmt.Sprintf("转换data数据失败,index_code:%s,data_value:%s err:%v", indexCodeOne, rowData[sheetConfig.DataOneRow], err))
+				} else {
+					if index, ok := indexMap[indexCodeOne]; ok {
+						if index.StartDate.After(date) {
+							index.StartDate = date
+						}
+						if index.EndDate.Before(date) {
+							index.EndDate = date
+							index.LatestValue = valueOne
+						}
+						index.DataList = append(index.DataList, models.IndexData{
+							DataTime: date,
+							Value:    valueOne,
+						})
+					} else {
+						indexMap[indexCodeOne] = &models.IndexInfo{
+							IndexName:   indexNameOne,
+							IndexCode:   indexCodeOne,
+							Frequency:   sheetConfig.Frequency,
+							Unit:        sheetConfig.Unit,
+							StartDate:   date,
+							EndDate:     date,
+							LatestValue: valueOne,
+							ClassifyId:  classifyId,
+							DataList: []models.IndexData{
+								{
+									DataTime: date,
+									Value:    valueOne,
+								},
+							},
+						}
+					}
+				}
 			}
-			utils.FileLog.Info("AviationActiveFleetProcessor indexInfoList: %v", indexInfoList)
-
-			// step_3: 指标数据
-			dataList, err := dealData(indexInfoList)
-			if err != nil {
-				return nil, err
+			if rowData[sheetConfig.DataTwoRow] != "" {
+				valueTwo, parseErr := strconv.ParseFloat(strings.ReplaceAll(rowData[sheetConfig.DataTwoRow], ",", ""), 64)
+				if parseErr != nil {
+					utils.FileLog.Error(fmt.Sprintf("转换data数据失败,index_code:%s,data_value:%s err:%v", indexCodeTwo, rowData[sheetConfig.DataTwoRow], err))
+				} else {
+					if index, ok := indexMap[indexCodeTwo]; ok {
+						if index.StartDate.After(date) {
+							index.StartDate = date
+						}
+						if index.EndDate.Before(date) {
+							index.EndDate = date
+							index.LatestValue = valueTwo
+						}
+						index.DataList = append(index.DataList, models.IndexData{
+							DataTime: date,
+							Value:    valueTwo,
+						})
+					} else {
+						indexMap[indexCodeTwo] = &models.IndexInfo{
+							IndexName:   indexNameTwo,
+							IndexCode:   indexCodeTwo,
+							Frequency:   sheetConfig.Frequency,
+							Unit:        sheetConfig.Unit,
+							StartDate:   date,
+							EndDate:     date,
+							LatestValue: valueTwo,
+							ClassifyId:  classifyId,
+							DataList: []models.IndexData{
+								{
+									DataTime: date,
+									Value:    valueTwo,
+								},
+							},
+						}
+					}
+				}
 			}
-			utils.FileLog.Info("AviationActiveFleetProcessor dataList: %v", dataList)
-
-			return dataList, err
-			indexData = append(indexData, baseFromRzdDataList...)
 		}
-		fmt.Printf("读取工作表完成: %s\n", sheetName)
 		utils.FileLog.Info("读取工作表完成:", sheetName)
 		// 新增数据源指标数据
-		if len(indexData) > 0 {
-			for i := 0; i < len(indexData); i += rzdBatchSize {
-				// 计算当前批次的结束索引
-				end := i + rzdBatchSize
-				if end > len(indexData) {
-					end = len(indexData)
-				}
-
-				// 获取当前批次的数据
-				batchData := indexData[i:end]
-
-				// 转换成json
-				marshal, err := json.Marshal(batchData)
-				if err != nil {
-					utils.FileLog.Error("json.Marshal err: %v", err)
-					return err
+		if len(indexMap) > 0 {
+			for _, index := range indexMap {
+				pars := chunkIndexData(index, rzdBatchSize)
+				for _, par := range pars {
+					// 转换成json
+					marshal, parseErr := json.Marshal(par)
+					if parseErr != nil {
+						utils.FileLog.Error("json.Marshal err: %v", parseErr)
+						return parseErr
+					}
+					// 发送 HTTP POST 请求
+					_, err = utils.HttpPostRequest(utils.EDB_LIB_URL+utils.ADD_BATCH_RZD_DATA, string(marshal), "application/json")
+					if err != nil {
+						utils.FileLog.Error("postEdbLib err: %v", err)
+						return err
+					}
 				}
-
-				// 发送 HTTP POST 请求
-				_, err = utils.HttpPostRequest(utils.EDB_LIB_URL+utils.ADD_BATCH_RZD_DATA, string(marshal), "application/json")
-				if err != nil {
-					utils.FileLog.Error("postEdbLib err: %v", err)
-					return err
-				}
-			}
-		}
-		utils.FileLog.Info("Processing AnalyticsLibrary...")
-		sheetConfig := OilDemandSignalsWeeklyReportConfigMap[sheetName]
-		if tableName == "Content" {
-			return nil, nil
-		}
-		if rowIndex < 4 {
-			return nil, nil
-		}
-		//处理数据不全的情况
-		less := sheetConfig.Rows - len(rowData)
-		if less > 0 {
-			for i := 0; i < less; i++ {
-				rowData = append(rowData, "")
 			}
 		}
-		// 匹配非数字字符
-		re := regexp.MustCompile(`^\d*\.?\d*\s*$`)
-		if !re.MatchString(strings.TrimSpace(rowData[sheetConfig.DataOneRow])) || !re.MatchString(strings.TrimSpace(rowData[sheetConfig.DataTwoRow])) {
-			utils.FileLog.Warn("数据格式错误:", fmt.Sprintf("%v", rowData))
-			return
-		}
-
-		// step_2: 指标
-		// 指标名称
-		indexNameOne := sheetName + "/" + rowData[len(rowData)-3] + "/" + sheetConfig.IndexNameColOne
-		indexNameTwo := sheetName + "/" + rowData[len(rowData)-3] + "/" + sheetConfig.IndexNameColTwo
-		// 生成指标编码
-		indexCodeOne, err := getIndexId(sheetName, strings.ReplaceAll(strings.ToLower(rowData[len(rowData)-3]), " ", ""), sheetConfig.IndexNameColOne)
-		indexCodeTwo, err := getIndexId(sheetName, strings.ReplaceAll(strings.ToLower(rowData[len(rowData)-3]), " ", ""), sheetConfig.IndexNameColTwo)
-
-		indexInfoMap := make(map[string]string)
-		indexInfoMap[indexCodeOne] = indexNameOne
-		indexInfoMap[indexCodeTwo] = indexNameTwo
+	}
+	return
+}
 
-		dataTime := rowData[1]
-		formatDate, err := utils.ConvertDateFormat(dataTime)
-		if err != nil {
-			return nil, err
-		}
-		var indexInfoList []*models.IndexInfo
-		dataOneStr := strings.TrimSpace(rowData[3])
-		if strings.TrimSpace(dataOneStr) != "" {
-			valueOne, err := strconv.ParseFloat(strings.ReplaceAll(dataOneStr, ",", ""), 64)
-			if err != nil {
-				utils.FileLog.Error(fmt.Sprintf("转换data数据失败,index_code:%s,data_value:%s err:%v", indexCodeOne, rowData[3], err))
-				return nil, err
-			}
-			indexInfoList = append(indexInfoList, &models.IndexInfo{
-				IndexName: indexNameOne,
-				IndexCode: indexCodeOne,
-				Value:     valueOne,
-				DataTime:  formatDate,
-			})
-		}
-		dataTwoStr := strings.TrimSpace(rowData[4])
-		if strings.TrimSpace(dataTwoStr) != "" {
-			valueTwo, err := strconv.ParseFloat(rowData[4], 64)
-			if err != nil {
-				utils.FileLog.Error(fmt.Sprintf("转换data数据失败,index_code:%s,data_value:%s err:%v", indexCodeTwo, rowData[4], err))
-				return nil, err
-			}
-			indexInfoList = append(indexInfoList, &models.IndexInfo{
-				IndexName: indexNameTwo,
-				IndexCode: indexCodeTwo,
-				Value:     valueTwo,
-				DataTime:  formatDate,
-			})
-		}
-		indexInfoList, err = dealIndex(indexInfoList, sheetConfig.Frequency, sheetConfig.Unit, classifyId)
-		if err != nil {
-			return nil, err
-		}
-		utils.FileLog.Info("indexInfoList: %v", indexInfoList)
-		// step_3: 指标数据
-		dataList, err := dealData(indexInfoList)
-		if err != nil {
-			return nil, err
+func chunkIndexData(index *models.IndexInfo, rzdBatchSize int) (pars []models.IndexInfo) {
+	var chunks int
+	total := len(index.DataList)
+	count := total % rzdBatchSize
+	if count > 0 {
+		chunks = (total + rzdBatchSize - count) / rzdBatchSize
+	} else {
+		chunks = total / rzdBatchSize
+	}
+	for i := 0; i < chunks; i++ {
+		start := i * rzdBatchSize
+		end := start + rzdBatchSize
+		if end > total {
+			end = total
 		}
-		utils.FileLog.Info("dataList: %v", dataList)
-		return dataList, err
+		pars = append(pars, models.IndexInfo{
+			IndexName:   index.IndexName,
+			IndexCode:   index.IndexCode,
+			LatestValue: index.LatestValue,
+			StartDate:   index.StartDate,
+			EndDate:     index.EndDate,
+			Frequency:   index.Frequency,
+			Unit:        index.Unit,
+			ClassifyId:  index.ClassifyId,
+			DataList:    index.DataList[start:end],
+		})
 	}
-	return nil, nil
+	return
 }

File diff suppressed because it is too large
+ 3357 - 3366
services/ruizide/processor_business_logic.go


+ 231 - 231
services/ruizide/processor_factory.go

@@ -6,7 +6,7 @@ import (
 )
 
 var (
-	RzdClassifyMap map[string]*models.BaseFromRzdClassify
+	RzdClassifyMap = make(map[string]*models.BaseFromRzdClassify)
 	classifyMap    = map[string]models.RzdClassifyMapStruct{
 		"Road Index": {
 			ClassifyName: "Road Index",
@@ -24,8 +24,8 @@ var (
 			ClassifyName: "Aviation Active Fleet",
 			Sort:         4,
 		},
-		"Demand-Gasoline": {
-			ClassifyName: "Demand-Gasoline",
+		"Demand - Gasoline": {
+			ClassifyName: "Demand - Gasoline",
 			Sort:         5,
 		},
 		"Demand - Diesel": {
@@ -60,237 +60,237 @@ type ReportProcessor interface {
 }
 
 type RzdDataProcessor interface {
-	Process(tableName string) ([]models.BaseFromRzdData, error)
+	Process(tableName string) error
 }
 
 func GetProcessor(tableName string, sheetName string) (ReportProcessor, error) {
-	if tableName == "Oil_Demand_Signals_Weekly_Report" {
-		switch sheetName {
-		case "Road Index":
-			return &RoadIndexProcessor{}, nil
-		case "Road Active Fleet":
-			return &RoadActiveFleetProcessor{}, nil
-		case "Aviation Index":
-			return &AviationIndexProcessor{}, nil
-		case "Aviation Active Fleet":
-			return &AviationActiveFleetProcessor{}, nil
-		case "Demand - Gasoline":
-			return &DemandGasolineProcessor{}, nil
-		case "Demand - Diesel":
-			return &DemandDieselProcessor{}, nil
-		case "Demand - Jet Fuel":
-			return &DemandJetFuelProcessor{}, nil
-		case "Demand - Maritime Bunker":
-			return &DemandMaritimeBunkerProcessor{}, nil
-		default:
-			return nil, fmt.Errorf("unknown sheetName: %s", sheetName)
-		}
-	} else if tableName == "Supply_Revision_Analysis" {
-		switch sheetName {
-		case "Chart1":
-			return &SupplyRevisionAnalysisChartOneProcessor{}, nil
-		case "Chart2":
-			return &SupplyRevisionAnalysisChartTwoProcessor{}, nil
-		case "Chart3":
-			return &SupplyRevisionAnalysisChartThreeProcessor{}, nil
-		case "Chart4":
-			return &SupplyRevisionAnalysisChartFourProcessor{}, nil
-		case "Chart5":
-			return &SupplyRevisionAnalysisChartFiveProcessor{}, nil
-		case "Chart6":
-			return &SupplyRevisionAnalysisChartSixProcessor{}, nil
-		default:
-			return nil, fmt.Errorf("unknown sheetName: %s", sheetName)
-		}
-	} else if tableName == "Oil_Supply_Analysis" {
-		switch sheetName {
-		case "Chart1":
-			return &OilSupplyAnalysisChartOneProcessor{}, nil
-		case "Chart2":
-			return &OilSupplyAnalysisChartTwoProcessor{}, nil
-		case "Chart3":
-			return &OilSupplyAnalysisChartThreeProcessor{}, nil
-		case "Chart4":
-			return &OilSupplyAnalysisChartFourProcessor{}, nil
-		default:
-			return nil, fmt.Errorf("unknown sheetName: %s", sheetName)
-		}
-	} else if tableName == "Oil_Demand_Analysis_Continent" {
-		switch sheetName {
-		case "Chart1":
-			return &OilDemandAnalysisContinentProcessor{}, nil
-		default:
-			return nil, fmt.Errorf("unknown sheetName: %s", sheetName)
-		}
-	} else if tableName == "Oil_Demand_Analysis_Region" {
-		switch sheetName {
-		case "Chart1":
-			return &OilDemandAnalysisRegionProcessor{}, nil
-		default:
-			return nil, fmt.Errorf("unknown sheetName: %s", sheetName)
-		}
-	} else if tableName == "Oil_Demand_Analysis_Country" {
-		switch sheetName {
-		case "Chart1":
-			return &OilDemandAnalysisCountryProcessor{}, nil
-		default:
-			return nil, fmt.Errorf("unknown sheetName: %s", sheetName)
-		}
-	} else if tableName == "Oil_Demand_Analysis_Product_Category" {
-		switch sheetName {
-		case "Chart1":
-			return &OilDemandAnalysisProductCategoryProcessor{}, nil
-		default:
-			return nil, fmt.Errorf("unknown sheetName: %s", sheetName)
-		}
-	} else if tableName == "Oil_Demand_Analysis_Product_Detail" {
-		switch sheetName {
-		case "Chart1":
-			return &OilDemandAnalysisProductDetailProcessor{}, nil
-		default:
-			return nil, fmt.Errorf("unknown sheetName: %s", sheetName)
-		}
-	} else if tableName == "Oil_Demand_Analysis_Sector_Category" {
-		switch sheetName {
-		case "Chart1":
-			return &OilDemandAnalysisSectorCategoryProcessor{}, nil
-		default:
-			return nil, fmt.Errorf("unknown sheetName: %s", sheetName)
-		}
-	} else if tableName == "Oil_Demand_Analysis_Sector_Detail" {
-		switch sheetName {
-		case "Chart1":
-			return &OilDemandAnalysisSectorDetailProcessor{}, nil
-		default:
-			return nil, fmt.Errorf("unknown sheetName: %s", sheetName)
-		}
-	} else if tableName == "Oil_Demand_Analysis_Scenario" {
-		switch sheetName {
-		case "Chart1":
-			return &OilDemandAnalysisScenarioProcessor{}, nil
-		default:
-			return nil, fmt.Errorf("unknown sheetName: %s", sheetName)
-		}
-	} else if tableName == "Oil_Market_Cube_Upstream_Supply_Oil_Quality_Api" {
-		switch sheetName {
-		case "ExportCubeBrowser 1":
-			return &UpstreamSupplyOilQualityApiProcessor{}, nil
-		default:
-			return nil, fmt.Errorf("unknown sheetName: %s", sheetName)
-		}
-	} else if tableName == "Oil_Market_Cube_Upstream_Supply_Oil_Quality_Sulphur" {
-		switch sheetName {
-		case "ExportCubeBrowser 1":
-			return &OilMarketCubeUpstreamSupplyOilQualitySulphurProcessor{}, nil
-		default:
-			return nil, fmt.Errorf("unknown sheetName: %s", sheetName)
-		}
-	} else if tableName == "Oil_Market_Cube_Upstream_Supply_Capacity_Capacity" {
-		switch sheetName {
-		case "ExportCubeBrowser 1":
-			return &OilMarketCubeUpstreamSupplyCapacityCapacityProcessor{}, nil
-		default:
-			return nil, fmt.Errorf("unknown sheetName: %s", sheetName)
-		}
-	} else if tableName == "Oil_Market_Cube_Upstream_Supply_Production" {
-		switch sheetName {
-		case "ExportCubeBrowser 1":
-			return &OilMarketCubeUpstreamSupplyProductionProcessor{}, nil
-		default:
-			return nil, fmt.Errorf("unknown sheetName: %s", sheetName)
-		}
-	} else if tableName == "Oil_Market_Cube_Upstream_Supply_Production_Wo_Seasonality" {
-		switch sheetName {
-		case "ExportCubeBrowser 1":
-			return &UpstreamSupplyProductionWoSeasonalityProcessor{}, nil
-		default:
-			return nil, fmt.Errorf("unknown sheetName: %s", sheetName)
-		}
-	} else if tableName == "Oil_Market_Cube_Upstream_Supply_OPEC_Policy_Reference_Production" {
-		switch sheetName {
-		case "ExportCubeBrowser 1":
-			return &UpstreamSupplyOPECPolicyReferenceProductionProcessor{}, nil
-		default:
-			return nil, fmt.Errorf("unknown sheetName: %s", sheetName)
-		}
-	} else if tableName == "Oil_Market_Cube_Upstream_Supply_OPEC_Policy_Target_Production" {
-		switch sheetName {
-		case "ExportCubeBrowser 1":
-			return &UpstreamSupplyOPECPolicyTargetProductionProcessor{}, nil
-		default:
-			return nil, fmt.Errorf("unknown sheetName: %s", sheetName)
-		}
-	} else if tableName == "Oil_Market_Cube_Upstream_Supply_OPEC_Policy_Target_Cut" {
-		switch sheetName {
-		case "ExportCubeBrowser 1":
-			return &UpstreamSupplyOPECPolicyTargetCutProcessor{}, nil
-		default:
-			return nil, fmt.Errorf("unknown sheetName: %s", sheetName)
-		}
-	} else if tableName == "Oil_Market_Cube_Upstream_Supply_OPEC_Policy_Actual_Cut" {
-		switch sheetName {
-		case "ExportCubeBrowser 1":
-			return &UpstreamSupplyOPECPolicyActualCutProcessor{}, nil
-		default:
-			return nil, fmt.Errorf("unknown sheetName: %s", sheetName)
-		}
-	} else if tableName == "Oil_Market_Cube_Upstream_Supply_OPEC_Policy_Compliance" {
-		switch sheetName {
-		case "ExportCubeBrowser 1":
-			return &UpstreamSupplyOPECPolicyComplianceProcessor{}, nil
-		default:
-			return nil, fmt.Errorf("unknown sheetName: %s", sheetName)
-		}
-	} else if tableName == "Oil_Market_Cube_Upstream_Supply_OPEC_Policy_Production_Subject_To_Cut" {
-		switch sheetName {
-		case "ExportCubeBrowser 1":
-			return &UpstreamSupplyOPECPolicyProductionSubjectToCutProcessor{}, nil
-		default:
-			return nil, fmt.Errorf("unknown sheetName: %s", sheetName)
-		}
-	} else if tableName == "Oil_Market_Cube_Products_Demand_Products_Demand_Mean" {
-		switch sheetName {
-		case "ExportCubeBrowser 1":
-			return &ProductsDemandProductsDemandMeanProcessor{}, nil
-		default:
-			return nil, fmt.Errorf("unknown sheetName: %s", sheetName)
-		}
-	} else if tableName == "Oil_Market_Cube_Products_Demand_Products_Demand+Sigma" {
-		switch sheetName {
-		case "ExportCubeBrowser 1":
-			return &ProductsDemandProductsDemandAddSigmaProcessor{}, nil
-		default:
-			return nil, fmt.Errorf("unknown sheetName: %s", sheetName)
-		}
-	} else if tableName == "Oil_Market_Cube_Products_Demand_Products_Demand-Sigma" {
-		switch sheetName {
-		case "ExportCubeBrowser 1":
-			return &ProductsDemandProductsDemandSubSigmaProcessor{}, nil
-		default:
-			return nil, fmt.Errorf("unknown sheetName: %s", sheetName)
-		}
-	} else if tableName == "Oil_Market_Cube_Balances_Total_Liquids_Balances" {
-		switch sheetName {
-		case "ExportCubeBrowser 1":
-			return &BalancesTotalLiquidsBalancesProcessor{}, nil
-		default:
-			return nil, fmt.Errorf("unknown sheetName: %s", sheetName)
-		}
-	} else if tableName == "Oil_Market_Cube_Geography_Latitude" {
-		switch sheetName {
-		case "ExportCubeBrowser 1":
-			return &GeographyLatitudeProcessor{}, nil
-		default:
-			return nil, fmt.Errorf("unknown sheetName: %s", sheetName)
-		}
-	} else if tableName == "Oil_Market_Cube_Geography_Longitude" {
-		switch sheetName {
-		case "ExportCubeBrowser 1":
-			return &GeographyLongitudeProcessor{}, nil
-		default:
-			return nil, fmt.Errorf("unknown sheetName: %s", sheetName)
-		}
-	}
+	//if tableName == "Oil_Demand_Signals_Weekly_Report" {
+	//	switch sheetName {
+	//	case "Road Index":
+	//		return &RoadIndexProcessor{}, nil
+	//	case "Road Active Fleet":
+	//		return &RoadActiveFleetProcessor{}, nil
+	//	case "Aviation Index":
+	//		return &AviationIndexProcessor{}, nil
+	//	case "Aviation Active Fleet":
+	//		return &AviationActiveFleetProcessor{}, nil
+	//	case "Demand - Gasoline":
+	//		return &DemandGasolineProcessor{}, nil
+	//	case "Demand - Diesel":
+	//		return &DemandDieselProcessor{}, nil
+	//	case "Demand - Jet Fuel":
+	//		return &DemandJetFuelProcessor{}, nil
+	//	case "Demand - Maritime Bunker":
+	//		return &DemandMaritimeBunkerProcessor{}, nil
+	//	default:
+	//		return nil, fmt.Errorf("unknown sheetName: %s", sheetName)
+	//	}
+	//} else if tableName == "Supply_Revision_Analysis" {
+	//	switch sheetName {
+	//	case "Chart1":
+	//		return &SupplyRevisionAnalysisChartOneProcessor{}, nil
+	//	case "Chart2":
+	//		return &SupplyRevisionAnalysisChartTwoProcessor{}, nil
+	//	case "Chart3":
+	//		return &SupplyRevisionAnalysisChartThreeProcessor{}, nil
+	//	case "Chart4":
+	//		return &SupplyRevisionAnalysisChartFourProcessor{}, nil
+	//	case "Chart5":
+	//		return &SupplyRevisionAnalysisChartFiveProcessor{}, nil
+	//	case "Chart6":
+	//		return &SupplyRevisionAnalysisChartSixProcessor{}, nil
+	//	default:
+	//		return nil, fmt.Errorf("unknown sheetName: %s", sheetName)
+	//	}
+	//} else if tableName == "Oil_Supply_Analysis" {
+	//	switch sheetName {
+	//	case "Chart1":
+	//		return &OilSupplyAnalysisChartOneProcessor{}, nil
+	//	case "Chart2":
+	//		return &OilSupplyAnalysisChartTwoProcessor{}, nil
+	//	case "Chart3":
+	//		return &OilSupplyAnalysisChartThreeProcessor{}, nil
+	//	case "Chart4":
+	//		return &OilSupplyAnalysisChartFourProcessor{}, nil
+	//	default:
+	//		return nil, fmt.Errorf("unknown sheetName: %s", sheetName)
+	//	}
+	//} else if tableName == "Oil_Demand_Analysis_Continent" {
+	//	switch sheetName {
+	//	case "Chart1":
+	//		return &OilDemandAnalysisContinentProcessor{}, nil
+	//	default:
+	//		return nil, fmt.Errorf("unknown sheetName: %s", sheetName)
+	//	}
+	//} else if tableName == "Oil_Demand_Analysis_Region" {
+	//	switch sheetName {
+	//	case "Chart1":
+	//		return &OilDemandAnalysisRegionProcessor{}, nil
+	//	default:
+	//		return nil, fmt.Errorf("unknown sheetName: %s", sheetName)
+	//	}
+	//} else if tableName == "Oil_Demand_Analysis_Country" {
+	//	switch sheetName {
+	//	case "Chart1":
+	//		return &OilDemandAnalysisCountryProcessor{}, nil
+	//	default:
+	//		return nil, fmt.Errorf("unknown sheetName: %s", sheetName)
+	//	}
+	//} else if tableName == "Oil_Demand_Analysis_Product_Category" {
+	//	switch sheetName {
+	//	case "Chart1":
+	//		return &OilDemandAnalysisProductCategoryProcessor{}, nil
+	//	default:
+	//		return nil, fmt.Errorf("unknown sheetName: %s", sheetName)
+	//	}
+	//} else if tableName == "Oil_Demand_Analysis_Product_Detail" {
+	//	switch sheetName {
+	//	case "Chart1":
+	//		return &OilDemandAnalysisProductDetailProcessor{}, nil
+	//	default:
+	//		return nil, fmt.Errorf("unknown sheetName: %s", sheetName)
+	//	}
+	//} else if tableName == "Oil_Demand_Analysis_Sector_Category" {
+	//	switch sheetName {
+	//	case "Chart1":
+	//		return &OilDemandAnalysisSectorCategoryProcessor{}, nil
+	//	default:
+	//		return nil, fmt.Errorf("unknown sheetName: %s", sheetName)
+	//	}
+	//} else if tableName == "Oil_Demand_Analysis_Sector_Detail" {
+	//	switch sheetName {
+	//	case "Chart1":
+	//		return &OilDemandAnalysisSectorDetailProcessor{}, nil
+	//	default:
+	//		return nil, fmt.Errorf("unknown sheetName: %s", sheetName)
+	//	}
+	//} else if tableName == "Oil_Demand_Analysis_Scenario" {
+	//	switch sheetName {
+	//	case "Chart1":
+	//		return &OilDemandAnalysisScenarioProcessor{}, nil
+	//	default:
+	//		return nil, fmt.Errorf("unknown sheetName: %s", sheetName)
+	//	}
+	//} else if tableName == "Oil_Market_Cube_Upstream_Supply_Oil_Quality_Api" {
+	//	switch sheetName {
+	//	case "ExportCubeBrowser 1":
+	//		return &UpstreamSupplyOilQualityApiProcessor{}, nil
+	//	default:
+	//		return nil, fmt.Errorf("unknown sheetName: %s", sheetName)
+	//	}
+	//} else if tableName == "Oil_Market_Cube_Upstream_Supply_Oil_Quality_Sulphur" {
+	//	switch sheetName {
+	//	case "ExportCubeBrowser 1":
+	//		return &OilMarketCubeUpstreamSupplyOilQualitySulphurProcessor{}, nil
+	//	default:
+	//		return nil, fmt.Errorf("unknown sheetName: %s", sheetName)
+	//	}
+	//} else if tableName == "Oil_Market_Cube_Upstream_Supply_Capacity_Capacity" {
+	//	switch sheetName {
+	//	case "ExportCubeBrowser 1":
+	//		return &OilMarketCubeUpstreamSupplyCapacityCapacityProcessor{}, nil
+	//	default:
+	//		return nil, fmt.Errorf("unknown sheetName: %s", sheetName)
+	//	}
+	//} else if tableName == "Oil_Market_Cube_Upstream_Supply_Production" {
+	//	switch sheetName {
+	//	case "ExportCubeBrowser 1":
+	//		return &OilMarketCubeUpstreamSupplyProductionProcessor{}, nil
+	//	default:
+	//		return nil, fmt.Errorf("unknown sheetName: %s", sheetName)
+	//	}
+	//} else if tableName == "Oil_Market_Cube_Upstream_Supply_Production_Wo_Seasonality" {
+	//	switch sheetName {
+	//	case "ExportCubeBrowser 1":
+	//		return &UpstreamSupplyProductionWoSeasonalityProcessor{}, nil
+	//	default:
+	//		return nil, fmt.Errorf("unknown sheetName: %s", sheetName)
+	//	}
+	//} else if tableName == "Oil_Market_Cube_Upstream_Supply_OPEC_Policy_Reference_Production" {
+	//	switch sheetName {
+	//	case "ExportCubeBrowser 1":
+	//		return &UpstreamSupplyOPECPolicyReferenceProductionProcessor{}, nil
+	//	default:
+	//		return nil, fmt.Errorf("unknown sheetName: %s", sheetName)
+	//	}
+	//} else if tableName == "Oil_Market_Cube_Upstream_Supply_OPEC_Policy_Target_Production" {
+	//	switch sheetName {
+	//	case "ExportCubeBrowser 1":
+	//		return &UpstreamSupplyOPECPolicyTargetProductionProcessor{}, nil
+	//	default:
+	//		return nil, fmt.Errorf("unknown sheetName: %s", sheetName)
+	//	}
+	//} else if tableName == "Oil_Market_Cube_Upstream_Supply_OPEC_Policy_Target_Cut" {
+	//	switch sheetName {
+	//	case "ExportCubeBrowser 1":
+	//		return &UpstreamSupplyOPECPolicyTargetCutProcessor{}, nil
+	//	default:
+	//		return nil, fmt.Errorf("unknown sheetName: %s", sheetName)
+	//	}
+	//} else if tableName == "Oil_Market_Cube_Upstream_Supply_OPEC_Policy_Actual_Cut" {
+	//	switch sheetName {
+	//	case "ExportCubeBrowser 1":
+	//		return &UpstreamSupplyOPECPolicyActualCutProcessor{}, nil
+	//	default:
+	//		return nil, fmt.Errorf("unknown sheetName: %s", sheetName)
+	//	}
+	//} else if tableName == "Oil_Market_Cube_Upstream_Supply_OPEC_Policy_Compliance" {
+	//	switch sheetName {
+	//	case "ExportCubeBrowser 1":
+	//		return &UpstreamSupplyOPECPolicyComplianceProcessor{}, nil
+	//	default:
+	//		return nil, fmt.Errorf("unknown sheetName: %s", sheetName)
+	//	}
+	//} else if tableName == "Oil_Market_Cube_Upstream_Supply_OPEC_Policy_Production_Subject_To_Cut" {
+	//	switch sheetName {
+	//	case "ExportCubeBrowser 1":
+	//		return &UpstreamSupplyOPECPolicyProductionSubjectToCutProcessor{}, nil
+	//	default:
+	//		return nil, fmt.Errorf("unknown sheetName: %s", sheetName)
+	//	}
+	//} else if tableName == "Oil_Market_Cube_Products_Demand_Products_Demand_Mean" {
+	//	switch sheetName {
+	//	case "ExportCubeBrowser 1":
+	//		return &ProductsDemandProductsDemandMeanProcessor{}, nil
+	//	default:
+	//		return nil, fmt.Errorf("unknown sheetName: %s", sheetName)
+	//	}
+	//} else if tableName == "Oil_Market_Cube_Products_Demand_Products_Demand+Sigma" {
+	//	switch sheetName {
+	//	case "ExportCubeBrowser 1":
+	//		return &ProductsDemandProductsDemandAddSigmaProcessor{}, nil
+	//	default:
+	//		return nil, fmt.Errorf("unknown sheetName: %s", sheetName)
+	//	}
+	//} else if tableName == "Oil_Market_Cube_Products_Demand_Products_Demand-Sigma" {
+	//	switch sheetName {
+	//	case "ExportCubeBrowser 1":
+	//		return &ProductsDemandProductsDemandSubSigmaProcessor{}, nil
+	//	default:
+	//		return nil, fmt.Errorf("unknown sheetName: %s", sheetName)
+	//	}
+	//} else if tableName == "Oil_Market_Cube_Balances_Total_Liquids_Balances" {
+	//	switch sheetName {
+	//	case "ExportCubeBrowser 1":
+	//		return &BalancesTotalLiquidsBalancesProcessor{}, nil
+	//	default:
+	//		return nil, fmt.Errorf("unknown sheetName: %s", sheetName)
+	//	}
+	//} else if tableName == "Oil_Market_Cube_Geography_Latitude" {
+	//	switch sheetName {
+	//	case "ExportCubeBrowser 1":
+	//		return &GeographyLatitudeProcessor{}, nil
+	//	default:
+	//		return nil, fmt.Errorf("unknown sheetName: %s", sheetName)
+	//	}
+	//} else if tableName == "Oil_Market_Cube_Geography_Longitude" {
+	//	switch sheetName {
+	//	case "ExportCubeBrowser 1":
+	//		return &GeographyLongitudeProcessor{}, nil
+	//	default:
+	//		return nil, fmt.Errorf("unknown sheetName: %s", sheetName)
+	//	}
+	//}
 
 	// 可以添加更多的逻辑来处理其他产品和类别
 	return nil, fmt.Errorf("no processor found for tableName %s and sheetName %s", tableName, sheetName)

+ 1 - 1
utils/constants.go

@@ -274,7 +274,7 @@ const (
 	GET_RZD_INDEX_BY_CODE                             = "/rzd/get/rzd/index/by/code"                            // 根据指标编码获取指标
 	GET_RZD_CLASSIFY_BY_NAME                          = "/rzd/get/rzd/classify/by/name"                         // 根据分类名称查询分类
 	GET_RZD_CLASSIFY                                  = "/rzd/get/rzd/classify"                                 // 睿咨得查询分类
-	BATCH_ADD_RZD_CLASSYFY                            = "/add/rzd/batch_add_classify"                           //批量增加睿咨得分类
+	BATCH_ADD_RZD_CLASSYFY                            = "/rzd/add/rzd/batch_add_classify"                       //批量增加睿咨得分类
 	ADD_RZD_CLASSIFY                                  = "/rzd/add/rzd/classify"                                 // 新增睿咨得分类
 	ADD_BATCH_RZD_EDB_DATA                            = "/rzd/add/batch/rzd/edb/data"                           // 批量增加指标库指标数据
 	GET_RZD_EDB_INFO_BY_INDEX_CODE                    = "/rzd/get/rzd/edb/info/by/code"                         // 根据指标code获取指标信息

+ 5 - 6
utils/date_util.go

@@ -510,19 +510,18 @@ func GetCurrentYearMonth() string {
 }
 
 // ConvertDateFormat 转换时间格式 MM-dd-yy --> yyyy-MM-dd
-func ConvertDateFormat(dataText string) (string, error) {
+func ConvertDateFormat(dataText string) (date time.Time, dateStr string, err error) {
 	// 定义输入和输出的时间格式
 	inputFormat := "01-02-06"    // MM-dd-yy
 	outputFormat := "2006-01-02" // yyyy-MM-dd
-
 	// 解析输入的日期
-	date, err := time.Parse(inputFormat, dataText)
+	date, err = time.ParseInLocation(inputFormat, dataText, time.Local)
 	if err != nil {
-		return "", err
+		return
 	}
-
 	// 格式化为输出格式
-	return date.Format(outputFormat), nil
+	dateStr = date.Format(outputFormat)
+	return
 }
 
 // ConvertDateFormat2 转换时间格式 yyyy-MMQ --> 取每一季度最后一天,例如 2024-01Q --> 2024-03-31

Some files were not shown because too many files changed in this diff