kobe6258 1 月之前
父節點
當前提交
a9ad73cca3

+ 1 - 0
controllers/rzd_controller.go

@@ -25,6 +25,7 @@ func (this *RzdController) DealData() {
 		this.ServeJSON()
 	}()
 	var err error
+	// 解析文件移动到目标目录
 	err = ruizide.FileResolverV2()
 	if err != nil {
 		utils.FileLog.Error("睿咨得数据处理失败 err:%v", err)

+ 11 - 31
services/ruizide/data_processor.go

@@ -27,6 +27,14 @@ var (
 		"Oil_Demand_Signals_Weekly_Report",
 		"Oil_Supply_Analysis",
 		"Supply_Revision_Analysis",
+		"Oil_Demand_Analysis_Product_Detail",
+		"Oil_Demand_Analysis_Region",
+		"Oil_Demand_Analysis_Scenario",
+		"Oil_Demand_Analysis_Continent",
+		"Oil_Demand_Analysis_Country",
+		"Oil_Demand_Analysis_Product_Category",
+		"Oil_Demand_Analysis_Sector_Category",
+		"Oil_Demand_Analysis_Sector_Detail",
 		"Oil_Market_Cube_Upstream_Supply_Oil_Quality_API",
 		"Oil_Market_Cube_Upstream_Supply_Oil_Quality_Sulphur",
 		"Oil_Market_Cube_Upstream_Supply_Capacity_Capacity",
@@ -44,14 +52,6 @@ var (
 		"Oil_Market_Cube_Balances_Total_Liquids_Balances",
 		"Oil_Market_Cube_Geography_Latitude",
 		"Oil_Market_Cube_Geography_Longitude",
-		"Oil_Demand_Analysis_Product_Detail",
-		"Oil_Demand_Analysis_Region",
-		"Oil_Demand_Analysis_Scenario",
-		"Oil_Demand_Analysis_Continent",
-		"Oil_Demand_Analysis_Country",
-		"Oil_Demand_Analysis_Product_Category",
-		"Oil_Demand_Analysis_Sector_Category",
-		"Oil_Demand_Analysis_Sector_Detail",
 	}
 )
 
@@ -88,7 +88,7 @@ func downloadData(ctx context.Context) error {
 	}
 
 	// 解析文件移动到目标目录
-	if err := waitAndRenameDownloadedFile("Oil_Demand_Signals_Weekly_Report_"+utils.GetCurrentYearMonth()+".xlsx", excelDir); err != nil {
+	if err := WaitAndRenameDownloadedFile("Oil_Demand_Signals_Weekly_Report_"+utils.GetCurrentYearMonth()+".xlsx", excelDir); err != nil {
 		return err
 	}
 
@@ -96,7 +96,7 @@ func downloadData(ctx context.Context) error {
 }
 
 // 等待下载文件并重命名
-func waitAndRenameDownloadedFile(newFileName, targetDir string) error {
+func WaitAndRenameDownloadedFile(newFileName, targetDir string) error {
 	// 等待一段时间以确保文件下载完成
 	time.Sleep(100 * time.Second) // 可能需要根据实际情况调整
 
@@ -276,27 +276,7 @@ func FileResolver() error {
 			// 遍历行并打印内容
 			var indexData []models.BaseFromRzdData
 			for rowIndex, rowData := range maxRow {
-				// 因为excel文件中的sheet表格不固定 对于 Supply_Revision_Analysis, Oil_Supply_Analysis 文件 手动调整sheet表格顺序
-				if tableName == "Supply_Revision_Analysis" && rowIndex == 0 {
-					if rowData[0] == "YearQuarter" && rowData[1] == "Revision" && rowData[2] == "CountryRevisionGroup" {
-						sheetName = "Chart1"
-					}
-					if rowData[0] == "YearQuarter" && rowData[1] == "Current" && rowData[2] == "Previous" {
-						sheetName = "Chart2"
-					}
-					if rowData[0] == "Year" && rowData[1] == "Revision" && rowData[2] == "CountryRevisionGroup" {
-						sheetName = "Chart3"
-					}
-					if rowData[0] == "Year" && rowData[1] == "Current" && rowData[2] == "Previous" {
-						sheetName = "Chart4"
-					}
-					if rowData[0] == "Previous" && rowData[1] == "Current" && rowData[2] == "YearMonth" {
-						sheetName = "Chart5"
-					}
-					if rowData[0] == "YearMonth" && rowData[1] == "CountryRevisionGroup" && rowData[2] == "Revision" {
-						sheetName = "Chart6"
-					}
-				} else if tableName == "Oil_Supply_Analysis" && rowIndex == 0 {
+				if tableName == "Oil_Supply_Analysis" && rowIndex == 0 {
 					if rowData[0] == "Viz Date" && rowData[1] == "OilAndGasCategory" && rowData[2] == "supply_kbbld" {
 						sheetName = "Chart1"
 					}

+ 3 - 3
services/ruizide/oil_demand_signals_weekly_report_processor.go

@@ -184,7 +184,7 @@ func (p *OilDemandSignalsWeeklyReportProcessor) Process(tableName string) (err e
 				}
 			}
 			// 匹配非数字字符
-			re := regexp.MustCompile(`^\d*\.?\d*\s*$`)
+			re := regexp.MustCompile(`^[+-]?\d{1,3}(,\d{3})*(\.\d+)?\s*$`)
 
 			classifyId := classifyIds[sheetName]
 			// step_2: 指标
@@ -200,7 +200,7 @@ func (p *OilDemandSignalsWeeklyReportProcessor) Process(tableName string) (err e
 				utils.FileLog.Error(fmt.Sprintf("转换时间数据失败,index_code:%s,time_value:%s err:%v", indexCodeOne, dataTime, convertErr))
 				continue
 			}
-			if rowData[sheetConfig.DataOneRow] != "" && re.MatchString(strings.TrimSpace(rowData[sheetConfig.DataOneRow])) {
+			if rowData[sheetConfig.DataOneRow] != "" && re.MatchString(strings.ReplaceAll(strings.TrimSpace(rowData[sheetConfig.DataOneRow]), ",", "")) {
 				valueOne, parseErr := decimal.NewFromString(strings.ReplaceAll(rowData[sheetConfig.DataOneRow], ",", ""))
 				if parseErr != nil {
 					utils.FileLog.Error(fmt.Sprintf("转换data数据失败,index_code:%s,data_value:%s err:%v", indexCodeOne, rowData[sheetConfig.DataOneRow], err))
@@ -238,7 +238,7 @@ func (p *OilDemandSignalsWeeklyReportProcessor) Process(tableName string) (err e
 					}
 				}
 			}
-			if rowData[sheetConfig.DataTwoRow] != "" && re.MatchString(strings.TrimSpace(rowData[sheetConfig.DataTwoRow])) {
+			if rowData[sheetConfig.DataTwoRow] != "" && re.MatchString(strings.ReplaceAll(strings.TrimSpace(rowData[sheetConfig.DataTwoRow]), ",", "")) {
 				valueTwo, parseErr := decimal.NewFromString(strings.ReplaceAll(rowData[sheetConfig.DataTwoRow], ",", ""))
 				if parseErr != nil {
 					utils.FileLog.Error(fmt.Sprintf("转换data数据失败,index_code:%s,data_value:%s err:%v", indexCodeTwo, rowData[sheetConfig.DataTwoRow], err))

文件差異過大導致無法顯示
+ 688 - 1340
services/ruizide/processor_business_logic.go


+ 22 - 40
services/ruizide/processor_factory.go

@@ -64,45 +64,25 @@ type RzdDataProcessor interface {
 }
 
 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" {
+	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
@@ -115,7 +95,8 @@ func GetProcessor(tableName string, sheetName string) (ReportProcessor, error) {
 	//	default:
 	//		return nil, fmt.Errorf("unknown sheetName: %s", sheetName)
 	//	}
-	//} else if tableName == "Oil_Demand_Analysis_Continent" {
+	//}
+	//else if tableName == "Oil_Demand_Analysis_Continent" {
 	//	switch sheetName {
 	//	case "Chart1":
 	//		return &OilDemandAnalysisContinentProcessor{}, nil
@@ -298,6 +279,7 @@ func GetProcessor(tableName string, sheetName string) (ReportProcessor, error) {
 
 var RzdProcessorMap = map[string]RzdDataProcessor{
 	"Oil_Demand_Signals_Weekly_Report": &OilDemandSignalsWeeklyReportProcessor{},
+	"Supply_Revision_Analysis":         &SupplyRevisionAnalysisProcessor{},
 }
 
 func GetRZDProcessor(tableName string) (RzdDataProcessor, error) {

+ 399 - 0
services/ruizide/supply_revision_analysis_processor.go

@@ -0,0 +1,399 @@
+package ruizide
+
+import (
+	"encoding/json"
+	"eta/eta_data_analysis/models"
+	"eta/eta_data_analysis/utils"
+	"fmt"
+	"github.com/shopspring/decimal"
+	"github.com/xuri/excelize/v2"
+	"os"
+	"path/filepath"
+	"regexp"
+	"strings"
+	"time"
+)
+
+const (
+	CubeDashboards         = "cube dashboards"
+	SupplyRevisionAnalysis = "Supply Revision Analysis"
+	BeginRow               = 1
+	Rows                   = 3
+)
+
+var (
+	SupplyRevisionAnalysisConfigMap = map[string]SRAPConfig{
+		"Chart 1": {
+			Frequency:          "季度",
+			Unit:               "千桶每天",
+			IndexNameColSuffix: "Index",
+			IndexNameColPrefix: "Index 7DMA",
+			chartType:          "one",
+			IndexRow:           2,
+			DateRow:            1,
+			DateType:           "quarter",
+		},
+		"Chart 2": {
+			Frequency:          "季度",
+			Unit:               "千桶每天",
+			IndexNameColSuffix: "Index",
+			IndexNameColPrefix: "Index 7DMA",
+			chartType:          "two",
+			NamePrevious:       "",
+			NameCurrent:        "",
+			CodePrevious:       "",
+			CodeCurrent:        "",
+			IndexRow:           2,
+			DataPreviousRow:    4,
+			DataCurrentRow:     5,
+			DateRow:            1,
+			DateType:           "quarter",
+		},
+		"Chart 3": {
+			Frequency:          "年度",
+			Unit:               "千桶每天",
+			IndexNameColSuffix: "Index",
+			IndexNameColPrefix: "Index 7DMA",
+			chartType:          "one",
+			IndexRow:           2,
+			DateRow:            1,
+			DateType:           "year",
+		},
+		"Chart 4": {
+			Frequency:          "月度",
+			Unit:               "千桶每天",
+			IndexNameColSuffix: "Index",
+			IndexNameColPrefix: "Index 7DMA",
+			chartType:          "two",
+			NamePrevious:       "",
+			NameCurrent:        "",
+			CodePrevious:       "",
+			CodeCurrent:        "",
+			IndexRow:           2,
+			DataPreviousRow:    4,
+			DataCurrentRow:     5,
+			DateRow:            1,
+			DateType:           "year",
+		},
+		"Chart 5": {
+			Frequency:          "月度",
+			Unit:               "千桶每天",
+			IndexNameColSuffix: "Index",
+			IndexNameColPrefix: "Index 7DMA",
+			chartType:          "two",
+			NamePrevious:       "",
+			NameCurrent:        "",
+			CodePrevious:       "",
+			CodeCurrent:        "",
+			IndexRow:           3,
+			DataPreviousRow:    4,
+			DataCurrentRow:     5,
+			DateRow:            3,
+			DateType:           "month",
+		},
+		"Chart 6": {
+			Frequency:          "日度",
+			Unit:               "千桶每天",
+			IndexNameColSuffix: "Index",
+			IndexNameColPrefix: "Index 7DMA",
+			chartType:          "one",
+			IndexRow:           3,
+			DateRow:            1,
+			DateType:           "month",
+		},
+	}
+)
+
+type SRAPConfig struct {
+	Frequency          string
+	Unit               string
+	IndexNameColSuffix string
+	IndexNameColPrefix string
+	IndexRow           int
+	DataPreviousRow    int
+	DataCurrentRow     int
+	DateRow            int
+	DateType           string
+	chartType          string
+	NamePrevious       string
+	NameCurrent        string
+	CodePrevious       string
+	CodeCurrent        string
+}
+
+type SupplyRevisionAnalysisProcessor struct {
+}
+
+func (p *SupplyRevisionAnalysisProcessor) 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) {
+		utils.FileLog.Error("文件不存在: %v", err)
+		return
+	}
+	// 打开 Excel 文件
+	file, err := excelize.OpenFile(filePath)
+	if err != nil {
+		utils.FileLog.Error("无法打开 Excel 文件: %v", err)
+		return
+	}
+	sheetNames := file.GetSheetList()
+	classifyIds, err := dealClassify(CubeDashboards, []string{SupplyRevisionAnalysis})
+	// 获取所有工作表
+	if err != nil {
+		utils.FileLog.Error("获取分类Id失败: %v", err)
+		return
+	}
+	//按照sheet页来处理数据,一个sheet发送一次服务器
+	for _, sheetName := range sheetNames {
+		var indexMap = make(map[string]*models.IndexInfo)
+		utils.FileLog.Info("读取工作表: %s\n", sheetName)
+		// 获取工作表的最大行数
+		dataRows, excelErr := file.GetRows(sheetName) // 直接获取所有行数据
+		if excelErr != nil {
+			utils.FileLog.Error("获取工作表数据时出错: %v", excelErr)
+			continue
+		}
+		fmt.Printf("sheetName:%s,sheetConfig:%d", sheetName, len(dataRows))
+		sheetConfig := SupplyRevisionAnalysisConfigMap[sheetName]
+		// 匹配非数字字符
+		classifyId := classifyIds[SupplyRevisionAnalysis]
+		switch sheetConfig.chartType {
+		case "one":
+			indexMap, err = OneDataHandler(dataRows, sheetConfig, classifyId)
+		case "two":
+			indexMap, err = TwoDataHandler(dataRows, sheetConfig, classifyId)
+		}
+		utils.FileLog.Info("读取工作表完成:", sheetName)
+		// 新增数据源指标数据
+		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
+					}
+				}
+			}
+		}
+	}
+	return
+}
+func OneDataHandler(dataRows [][]string, sheetConfig SRAPConfig, classifyId int) (indexMap map[string]*models.IndexInfo, err error) {
+	for _, rowData := range dataRows[BeginRow:] {
+		// step_2: 指标
+		// 指标名称
+		indexNameOne := sheetName + "/" + rowData[sheetConfig.IndexRow] + "/" + sheetConfig.IndexNameColOne
+		indexNameTwo := sheetName + "/" + rowData[sheetConfig.IndexRow] + "/" + sheetConfig.IndexNameColTwo
+		// 生成指标编码
+		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
+		}
+		if rowData[sheetConfig.DataOneRow] != "" && re.MatchString(strings.TrimSpace(rowData[sheetConfig.DataOneRow])) {
+			valueOne, parseErr := decimal.NewFromString(strings.ReplaceAll(rowData[sheetConfig.DataOneRow], ",", ""))
+			if parseErr != nil {
+				utils.FileLog.Error(fmt.Sprintf("转换data数据失败,index_code:%s,data_value:%s err:%v", indexCodeOne, rowData[sheetConfig.DataOneRow], err))
+				continue
+			} 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,
+							},
+						},
+					}
+				}
+			}
+		}
+		if rowData[sheetConfig.DataTwoRow] != "" && re.MatchString(strings.TrimSpace(rowData[sheetConfig.DataTwoRow])) {
+			valueTwo, parseErr := decimal.NewFromString(strings.ReplaceAll(rowData[sheetConfig.DataTwoRow], ",", ""))
+			if parseErr != nil {
+				utils.FileLog.Error(fmt.Sprintf("转换data数据失败,index_code:%s,data_value:%s err:%v", indexCodeTwo, rowData[sheetConfig.DataTwoRow], err))
+				continue
+			} 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,
+							},
+						},
+					}
+				}
+			}
+		}
+	}
+}
+func TwoDataHandler(dataRows [][]string, sheetConfig SRAPConfig, classifyId int) (indexMap map[string]*models.IndexInfo, err error) {
+	for _, rowData := range dataRows[BeginRow:] {
+		// 匹配非数字字符
+		re := regexp.MustCompile(`^\d*\.?\d*\s*$`)
+		//处理数据不全的情况
+		less := Rows - len(rowData)
+		if less > 0 {
+			for i := 0; i < less; i++ {
+				rowData = append(rowData, "")
+			}
+		}
+		// step_2: 指标
+		// 指标名称
+		indexNameCurrent := SupplyRevisionAnalysis + "/" + sheetConfig.IndexNameColPrefix + "/" + sheetConfig.NameCurrent
+		indexNamePrevious := SupplyRevisionAnalysis + "/" + sheetConfig.IndexNameColPrefix + "/" + sheetConfig.NamePrevious
+
+		// 生成指标编码
+		indexCodeCurrent := getIndexId(fmt.Sprintf("%s %s", SupplyRevisionAnalysis, sheetConfig.IndexNameColPrefix), sheetConfig.CodeCurrent, "")
+		indexCodePrevious := getIndexId(fmt.Sprintf("%s %s", SupplyRevisionAnalysis, sheetConfig.IndexNameColPrefix), sheetConfig.CodePrevious, "")
+
+		dataTime := rowData[sheetConfig.DateRow]
+		var date time.Time
+		var convertErr error
+		switch sheetConfig.DateType {
+		case "quarter":
+			date, _, convertErr = utils.ConvertDateFormatQuarter(dataTime)
+		case "month":
+			date, _, convertErr = utils.ConvertDateFormat(dataTime)
+		case "year":
+			date, _, convertErr = utils.ConvertDateFormat(dataTime)
+		}
+		if convertErr != nil {
+			utils.FileLog.Error(fmt.Sprintf("转换时间数据失败,index_code:%s,time_value:%s err:%v", indexNameCurrent, dataTime, convertErr))
+			continue
+		}
+
+		if rowData[sheetConfig.DataCurrentRow] != "" && re.MatchString(strings.TrimSpace(rowData[sheetConfig.DataCurrentRow])) {
+			valueCurrent, parseErr := decimal.NewFromString(rowData[sheetConfig.DataCurrentRow])
+			if parseErr != nil {
+				utils.FileLog.Error(fmt.Sprintf("转换data数据失败,index_code:%s,data_value:%s err:%v", indexCodeCurrent, rowData[sheetConfig.DataCurrentRow], err))
+				continue
+			} else {
+				if index, ok := indexMap[indexCodeCurrent]; ok {
+					if index.StartDate.After(date) {
+						index.StartDate = date
+					}
+					if index.EndDate.Before(date) {
+						index.EndDate = date
+						index.LatestValue = valueCurrent
+					}
+					index.DataList = append(index.DataList, models.IndexData{
+						DataTime: date,
+						Value:    valueCurrent,
+					})
+				} else {
+					indexMap[indexCodeCurrent] = &models.IndexInfo{
+						IndexName:   indexNameCurrent,
+						IndexCode:   indexCodeCurrent,
+						Frequency:   sheetConfig.Frequency,
+						Unit:        sheetConfig.Unit,
+						StartDate:   date,
+						EndDate:     date,
+						LatestValue: valueCurrent,
+						ClassifyId:  classifyId,
+						DataList: []models.IndexData{
+							{
+								DataTime: date,
+								Value:    valueCurrent,
+							},
+						},
+					}
+				}
+			}
+		}
+		if rowData[sheetConfig.DataPreviousRow] != "" && re.MatchString(strings.TrimSpace(rowData[sheetConfig.DataPreviousRow])) {
+			valuePrevious, parseErr := decimal.NewFromString(rowData[sheetConfig.DataPreviousRow])
+			if parseErr != nil {
+				utils.FileLog.Error(fmt.Sprintf("转换data数据失败,index_code:%s,data_value:%s err:%v", indexCodePrevious, rowData[sheetConfig.DataPreviousRow], err))
+				continue
+			} else {
+				if index, ok := indexMap[indexCodePrevious]; ok {
+					if index.StartDate.After(date) {
+						index.StartDate = date
+					}
+					if index.EndDate.Before(date) {
+						index.EndDate = date
+						index.LatestValue = valuePrevious
+					}
+					index.DataList = append(index.DataList, models.IndexData{
+						DataTime: date,
+						Value:    valuePrevious,
+					})
+				} else {
+					indexMap[indexCodePrevious] = &models.IndexInfo{
+						IndexName:   indexNamePrevious,
+						IndexCode:   indexCodePrevious,
+						Frequency:   sheetConfig.Frequency,
+						Unit:        sheetConfig.Unit,
+						StartDate:   date,
+						EndDate:     date,
+						LatestValue: valuePrevious,
+						ClassifyId:  classifyId,
+						DataList: []models.IndexData{
+							{
+								DataTime: date,
+								Value:    valuePrevious,
+							},
+						},
+					}
+				}
+			}
+		}
+	}
+}

+ 0 - 6
utils/constants.go

@@ -267,15 +267,9 @@ const (
 	GET_LY_INDEX_BY_CODE                              = "/ly/get/ly/index/by/code"                              // 根据指标编码获取指标
 	GET_EDB_INFO_BY_INDEX_CODE                        = "/ly/get/edb/info/by/index/code"                        // 根据指标code获取指标信息
 	ADD_BATCH_LY_EDB_DATA                             = "/ly/add/batch/ly/edb/data"                             // 批量增加粮油指标库数据
-	ADD_RZD_INDEX                                     = "/rzd/add/rzd/index"                                    // 新增睿咨得指标
 	ADD_BATCH_RZD_DATA                                = "rzd/add/batch/rzd/data"                                // 新增数据源指标数据列表
-	GET_RZD_INDEX_DATA_BY_CODE_AND_TIME               = "/rzd/get/rzd/index/data/by/code/and/time"              // 根据指标编码和日期获取指标数据
-	GET_EDB_RZD_DATA_BY_CODE_AND_TIME                 = "/rzd/get/edb/rzd/data/by/code/and/time"                // 根据指标编码和日期获取指标数据
-	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                            = "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获取指标信息
 	UPDATE_RZD_EDB_DATA                               = "/rzd/update/rzd/edb/data"                              // 修改指标库指标数据

+ 13 - 14
utils/date_util.go

@@ -525,7 +525,7 @@ func ConvertDateFormat(dataText string) (date time.Time, dateStr string, err err
 }
 
 // ConvertDateFormat2 转换时间格式 yyyy-MMQ --> 取每一季度最后一天,例如 2024-01Q --> 2024-03-31
-func ConvertDateFormat2(dataText string) (string, error) {
+func ConvertDateFormatQuarter(dataText string) (date time.Time, dateStr string, err error) {
 
 	// 提取年份和季度信息
 	yearStr := dataText[:4]
@@ -534,31 +534,30 @@ func ConvertDateFormat2(dataText string) (string, error) {
 	// 转换年份
 	year, err := strconv.Atoi(yearStr)
 	if err != nil {
-		return "", fmt.Errorf("无效的年份: %v", err)
+		err = fmt.Errorf("无效的年份: %v", err)
+		return
 	}
-
 	// 根据季度选择最后一天
-	var endOfQuarter string
 	switch quarterStr {
 	case "1":
-		endOfQuarter = fmt.Sprintf("%d-03-31", year)
+		dateStr = fmt.Sprintf("%d-03-31", year)
 	case "2":
-		endOfQuarter = fmt.Sprintf("%d-06-30", year)
+		dateStr = fmt.Sprintf("%d-06-30", year)
 	case "3":
-		endOfQuarter = fmt.Sprintf("%d-09-30", year)
+		dateStr = fmt.Sprintf("%d-09-30", year)
 	case "4":
-		endOfQuarter = fmt.Sprintf("%d-12-31", year)
+		dateStr = fmt.Sprintf("%d-12-31", year)
 	default:
-		return "", fmt.Errorf("无效的季度: %s", quarterStr)
+		err = fmt.Errorf("无效的季度: %s", quarterStr)
+		return
 	}
-
 	// 确保日期格式正确
-	_, err = time.Parse("2006-01-02", endOfQuarter)
+	date, err = time.Parse("2006-01-02", dateStr)
 	if err != nil {
-		return "", fmt.Errorf("日期解析失败: %v", err)
+		err = fmt.Errorf("日期解析失败: %v", err)
+		return
 	}
-
-	return endOfQuarter, nil
+	return
 }
 
 // ConvertDateFormat3 转换时间格式 Jan-23 --> 2023-01-31

部分文件因文件數量過多而無法顯示