kobe6258 1 week ago
parent
commit
ca2cde2d44

+ 1 - 1
controllers/rzd_controller.go

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

+ 8 - 185
services/ruizide/data_processor.go

@@ -7,7 +7,6 @@ import (
 	"eta/eta_data_analysis/models"
 	"eta/eta_data_analysis/utils"
 	"fmt"
-	"github.com/xuri/excelize/v2"
 	"io"
 	"log"
 	"os"
@@ -17,42 +16,11 @@ import (
 	"github.com/chromedp/chromedp"
 )
 
-// 定义选择器
 var (
-	excelDir      = utils.RZD_EXCEL_PATH
-	downloadDir   = utils.RZD_DOWNLOAD_PATH
-	rzdLoginPath  = utils.RZD_LOGIN_PATH
-	rzdBatchSize  = 500
-	tableNameList = []string{
-		"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",
-		"Oil_Market_Cube_Upstream_Supply_Production",
-		"Oil_Market_Cube_Upstream_Supply_Production_Wo_Seasonality",
-		"Oil_Market_Cube_Upstream_Supply_OPEC_Policy_Reference_Production",
-		"Oil_Market_Cube_Upstream_Supply_OPEC_Policy_Target_Production",
-		"Oil_Market_Cube_Upstream_Supply_OPEC_Policy_Target_Cut",
-		"Oil_Market_Cube_Upstream_Supply_OPEC_Policy_Actual_Cut",
-		"Oil_Market_Cube_Upstream_Supply_OPEC_Policy_Compliance",
-		"Oil_Market_Cube_Upstream_Supply_OPEC_Policy_Production_Subject_To_Cut",
-		"Oil_Market_Cube_Products_Demand_Products_Demand_Mean",
-		"Oil_Market_Cube_Products_Demand_Products_Demand+Sigma",
-		"Oil_Market_Cube_Products_Demand_Products_Demand-Sigma",
-		"Oil_Market_Cube_Balances_Total_Liquids_Balances",
-		"Oil_Market_Cube_Geography_Latitude",
-		"Oil_Market_Cube_Geography_Longitude",
-	}
+	excelDir     = utils.RZD_EXCEL_PATH
+	downloadDir  = utils.RZD_DOWNLOAD_PATH
+	rzdLoginPath = utils.RZD_LOGIN_PATH
+	rzdBatchSize = 500
 )
 
 // 处理数据下载的步骤
@@ -95,7 +63,7 @@ func downloadData(ctx context.Context) error {
 	return nil
 }
 
-// 等待下载文件并重命名
+// WaitAndRenameDownloadedFile 等待下载文件并重命名
 func WaitAndRenameDownloadedFile(newFileName, targetDir string) error {
 	// 等待一段时间以确保文件下载完成
 	time.Sleep(100 * time.Second) // 可能需要根据实际情况调整
@@ -237,155 +205,10 @@ func ResolverNet(_ context.Context) (err error) {
 	}
 	utils.FileLog.Info("睿咨得数据下载完成")
 	// 解析表格 读取数据
-	FileResolverV2()
+	err = FileResolver()
 	return
 }
 
-// 解析本地文件
-func FileResolver() error {
-	for _, tableName := range tableNameList {
-		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)
-			continue
-		}
-		// 打开 Excel 文件
-		f, err := excelize.OpenFile(filePath)
-		if err != nil {
-			utils.FileLog.Error("无法打开 Excel 文件: %v", err)
-			return err
-		}
-		// 获取所有工作表
-		sheetNames := f.GetSheetList()
-
-		for _, sheetName := range sheetNames {
-			if tableName == "Oil_Demand_Signals_Weekly_Report" && sheetName == "Content" {
-				utils.FileLog.Info(tableName+"跳过工作表:", sheetName)
-				continue
-			}
-			utils.FileLog.Info("读取工作表: %s\n", sheetName)
-			// 获取工作表的最大行数
-			maxRow, err := f.GetRows(sheetName) // 直接获取所有行数据
-			if err != nil {
-				utils.FileLog.Error("获取工作表数据时出错: %v", err)
-				continue
-			}
-			// 遍历行并打印内容
-			var indexData []models.BaseFromRzdData
-			for rowIndex, rowData := range maxRow {
-				if tableName == "Oil_Supply_Analysis" && rowIndex == 0 {
-					if rowData[0] == "Viz Date" && rowData[1] == "OilAndGasCategory" && rowData[2] == "supply_kbbld" {
-						sheetName = "Chart1"
-					}
-					if rowData[0] == "Viz Date" && rowData[1] == "supply_kbbld" && rowData[2] == "Region" {
-						sheetName = "Chart2"
-					}
-					if rowData[0] == "Viz Date" && rowData[1] == "CapacityDetail" && rowData[2] == "Capacity_kbbld" {
-						sheetName = "Chart3"
-					}
-					if rowData[0] == "Viz Date" && rowData[1] == "Oil Classification Group" && rowData[2] == "supply_kbbld" {
-						sheetName = "Chart4"
-					}
-				}
-				processor, err := GetProcessor(tableName, sheetName)
-				if err != nil {
-					utils.FileLog.Error("无法获取处理器: %v", err)
-					continue
-				}
-				baseFromRzdDataList, err := processor.Process(tableName, sheetName, rowIndex, rowData)
-				if err != nil {
-					utils.FileLog.Error("处理数据失败: %v", err)
-					return err
-				}
-				fmt.Printf("处理数据成功: %v\n", baseFromRzdDataList)
-				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
-					}
-
-					// 发送 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
-					}
-				}
-			}
-
-			// 新增指标库数据
-			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
-}
-
 func login(ctx context.Context) error {
 	if rzdLoginPath == "" {
 		return errors.New("睿咨得登录页面地址未配置")
@@ -427,8 +250,8 @@ func httpRequestFill(data interface{}, urlMethod string) (postEdbLib []byte, err
 	return postEdbLib, nil
 }
 
-// 解析本地文件
-func FileResolverV2() error {
+// FileResolver 解析本地文件
+func FileResolver() error {
 	//获取rzd数据库分类数据
 	rzdClassifyList, err := getRzdClassifyList()
 	if err != nil {

+ 0 - 9
services/ruizide/oil_demand_analysis_processor.go

@@ -83,15 +83,6 @@ var (
 	}
 )
 
-type ODAPConfig struct {
-	Frequency          string
-	Unit               string
-	IndexNameColSuffix string
-	IndexRow           int
-	DataRow            int
-	DateRow            int
-}
-
 type OilDemandAnalysisProcessor struct {
 }
 

+ 364 - 0
services/ruizide/oil_market_cube_processor.go

@@ -0,0 +1,364 @@
+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"
+	"strings"
+)
+
+const (
+	MCSheetName    = "ExportCubeBrowser 1"
+	OilMarketCube  = "Oil Market Cube"
+	UpstreamSupply = "Upstream Supply"
+	Balances       = "Balances"
+	ProductsDemand = "Products Demand"
+	Geography      = "Geography"
+	MCBeginRow     = 2
+	MCRows         = 3
+)
+
+type MCPConfig struct {
+	Frequency          string
+	Unit               string
+	IndexNameColSuffix string
+	IndexNameColPrefix string
+	YearRow            int
+	DataRow            int
+	MonthRow           int
+	SuffixName         string
+	CodeArea           string
+	PrefixStr          string
+	ClassifyName       string
+}
+
+var (
+	OilMarketCubeConfigMap = map[string]MCPConfig{
+		"Oil_Market_Cube_Upstream_Supply_Oil_Quality_API": {
+			Frequency:          "月度",
+			Unit:               "°",
+			IndexNameColSuffix: "Oil Quality",
+			MonthRow:           1,
+			DataRow:            2,
+			YearRow:            0,
+			SuffixName:         "API",
+			ClassifyName:       UpstreamSupply,
+			CodeArea:           "API",
+		},
+		"Oil_Market_Cube_Upstream_Supply_Oil_Quality_Sulphur": {
+			Frequency:          "月度",
+			Unit:               "%wt",
+			IndexNameColSuffix: "Oil Quality",
+			MonthRow:           1,
+			DataRow:            2,
+			YearRow:            0,
+			SuffixName:         "Sulphur",
+			ClassifyName:       UpstreamSupply,
+			CodeArea:           "Sulphur",
+		},
+		"Oil_Market_Cube_Upstream_Supply_Capacity_Capacity": {
+			Frequency:          "月度",
+			Unit:               "kbbl/d",
+			IndexNameColSuffix: "Capacity",
+			MonthRow:           1,
+			DataRow:            2,
+			YearRow:            0,
+			ClassifyName:       UpstreamSupply,
+		},
+		"Oil_Market_Cube_Upstream_Supply_Production": {
+			Frequency:          "月度",
+			Unit:               "kbbl/d",
+			IndexNameColSuffix: "Production",
+			MonthRow:           1,
+			DataRow:            2,
+			YearRow:            0,
+			ClassifyName:       UpstreamSupply,
+		},
+		"Oil_Market_Cube_Upstream_Supply_Production_Wo_Seasonality": {
+			Frequency:          "月度",
+			Unit:               "kbbl/d",
+			IndexNameColSuffix: "Production Wo Seasonality",
+			MonthRow:           1,
+			DataRow:            2,
+			YearRow:            0,
+			ClassifyName:       UpstreamSupply,
+		},
+		"Oil_Market_Cube_Upstream_Supply_OPEC_Policy_Reference_Production": {
+			Frequency:          "月度",
+			Unit:               "kbbl/d",
+			IndexNameColSuffix: "Reference Production",
+			IndexNameColPrefix: "OPEC_Policy",
+			MonthRow:           1,
+			DataRow:            2,
+			YearRow:            0,
+			ClassifyName:       UpstreamSupply,
+		},
+		"Oil_Market_Cube_Upstream_Supply_OPEC_Policy_Target_Production": {
+			Frequency:          "月度",
+			Unit:               "kbbl/d",
+			IndexNameColSuffix: "Target Production",
+			IndexNameColPrefix: "OPEC_Policy",
+			MonthRow:           1,
+			DataRow:            2,
+			YearRow:            0,
+			ClassifyName:       UpstreamSupply,
+		},
+		"Oil_Market_Cube_Upstream_Supply_OPEC_Policy_Target_Cut": {
+			Frequency:          "月度",
+			Unit:               "kbbl/d",
+			IndexNameColSuffix: "Target Cut",
+			IndexNameColPrefix: "OPEC_Policy",
+			MonthRow:           1,
+			DataRow:            2,
+			YearRow:            0,
+			ClassifyName:       UpstreamSupply,
+		},
+		"Oil_Market_Cube_Upstream_Supply_OPEC_Policy_Actual_Cut": {
+			Frequency:          "月度",
+			Unit:               "kbbl/d",
+			IndexNameColSuffix: "Actual Cut",
+			IndexNameColPrefix: "OPEC_Policy",
+			MonthRow:           1,
+			DataRow:            2,
+			YearRow:            0,
+			ClassifyName:       UpstreamSupply,
+		},
+		"Oil_Market_Cube_Upstream_Supply_OPEC_Policy_Compliance": {
+			Frequency:          "月度",
+			Unit:               "kbbl/d",
+			IndexNameColSuffix: "Compliance",
+			IndexNameColPrefix: "OPEC_Policy",
+			MonthRow:           1,
+			DataRow:            2,
+			YearRow:            0,
+			ClassifyName:       UpstreamSupply,
+		},
+		"Oil_Market_Cube_Upstream_Supply_OPEC_Policy_Production_Subject_To_Cut": {
+			Frequency:          "月度",
+			Unit:               "kbbl/d",
+			IndexNameColSuffix: "Production Subject To Cut",
+			IndexNameColPrefix: "OPEC_Policy",
+			MonthRow:           1,
+			DataRow:            2,
+			YearRow:            0,
+			ClassifyName:       UpstreamSupply,
+		},
+		"Oil_Market_Cube_Products_Demand_Products_Demand_Mean": {
+			Frequency:          "月度",
+			Unit:               "kbbl/d",
+			IndexNameColSuffix: "Products Demand Mean (1.0 DG) ",
+			MonthRow:           1,
+			DataRow:            2,
+			YearRow:            0,
+			ClassifyName:       ProductsDemand,
+			CodeArea:           "1.0dg",
+			PrefixStr:          "Products Demand Mean",
+		},
+		"Oil_Market_Cube_Products_Demand_Products_Demand+Sigma": {
+			Frequency:          "月度",
+			Unit:               "kbbl/d",
+			IndexNameColSuffix: "Products Demand +Sigma (2.2 DG) ",
+			MonthRow:           1,
+			DataRow:            2,
+			YearRow:            0,
+			ClassifyName:       ProductsDemand,
+			CodeArea:           "2.2dg",
+			PrefixStr:          "Products Demand Sigma",
+		},
+		"Oil_Market_Cube_Products_Demand_Products_Demand-Sigma": {
+			Frequency:          "月度",
+			Unit:               "kbbl/d",
+			IndexNameColSuffix: "Products Demand -Sigma (1.8 DG) ",
+			MonthRow:           1,
+			DataRow:            2,
+			YearRow:            0,
+			ClassifyName:       ProductsDemand,
+			CodeArea:           "1.8dg",
+			PrefixStr:          "Products Demand Sigma",
+		},
+		"Oil_Market_Cube_Balances_Total_Liquids_Balances": {
+			Frequency:          "月度",
+			Unit:               "kbbl/d",
+			IndexNameColSuffix: "Total Liquids Balances",
+			MonthRow:           1,
+			DataRow:            2,
+			YearRow:            0,
+			ClassifyName:       Balances,
+		},
+		"Oil_Market_Cube_Geography_Latitude": {
+			Frequency:          "月度",
+			Unit:               "",
+			IndexNameColSuffix: "Latitude",
+			MonthRow:           1,
+			DataRow:            2,
+			YearRow:            0,
+			ClassifyName:       Geography,
+		},
+		"Oil_Market_Cube_Geography_Longitude": {
+			Frequency:          "月度",
+			Unit:               "",
+			IndexNameColSuffix: "Longitude",
+			MonthRow:           1,
+			DataRow:            2,
+			YearRow:            0,
+			ClassifyName:       Geography,
+		},
+	}
+)
+
+type OilMarketCubeProcessor struct {
+}
+
+func (p *OilMarketCubeProcessor) 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
+	}
+
+	//按照sheet页来处理数据,一个sheet发送一次服务器
+	var indexMap = make(map[string]*models.IndexInfo)
+	// 获取工作表的最大行数
+	dataRows, excelErr := file.GetRows(MCSheetName) // 直接获取所有行数据
+	if excelErr != nil {
+		utils.FileLog.Error("获取工作表数据时出错: %v", excelErr)
+		return
+	}
+	if sheetConfig, ok := OilMarketCubeConfigMap[tableName]; ok {
+		classifyIds, classifyErr := dealClassify(OilMarketCube, []string{sheetConfig.ClassifyName})
+		// 获取所有工作表
+		if classifyErr != nil {
+			utils.FileLog.Error("获取分类Id失败: %v", classifyErr)
+			return
+		}
+		// 匹配非数字字符
+		classifyId := classifyIds[sheetConfig.ClassifyName]
+		indexMap, err = MarketCubeDataHandler(dataRows, sheetConfig, classifyId)
+		// 新增数据源指标数据
+		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 MarketCubeDataHandler(dataRows [][]string, sheetConfig MCPConfig, classifyId int) (indexMap map[string]*models.IndexInfo, err error) {
+	indexMap = make(map[string]*models.IndexInfo)
+	var yearStr string
+	for _, rowData := range dataRows[MCBeginRow : len(dataRows)-1] {
+		less := MCRows - len(rowData)
+		if less > 0 {
+			for i := 0; i < less; i++ {
+				rowData = append(rowData, "")
+			}
+		}
+		if rowData[sheetConfig.YearRow] != "" {
+			yearStr = rowData[sheetConfig.YearRow]
+		}
+		// step_2: 指标
+		// 指标名称
+		var indexName, indexCode string
+		if sheetConfig.IndexNameColPrefix == "" {
+			indexName = sheetConfig.ClassifyName + "/" + sheetConfig.IndexNameColSuffix
+			if sheetConfig.SuffixName != "" {
+				indexName = indexName + "/" + sheetConfig.SuffixName
+			}
+		} else {
+			indexName = sheetConfig.ClassifyName + "/" + sheetConfig.IndexNameColPrefix + "/" + sheetConfig.IndexNameColSuffix
+		}
+		// 生成指标编码
+		var area, prefix string
+		if sheetConfig.PrefixStr == "" {
+			prefix = sheetConfig.IndexNameColPrefix
+		} else {
+			prefix = sheetConfig.PrefixStr
+		}
+		if sheetConfig.CodeArea != "" {
+			area = sheetConfig.CodeArea
+		} else {
+			area = sheetConfig.IndexNameColSuffix
+		}
+		if sheetConfig.IndexNameColPrefix != "" {
+			indexCode = getIndexId(fmt.Sprintf("%s %s", sheetConfig.ClassifyName, prefix), strings.ReplaceAll(strings.ToLower(area), " ", ""), "")
+		} else {
+			indexCode = getIndexId(sheetConfig.ClassifyName, strings.ReplaceAll(strings.ToLower(area), " ", ""), "")
+		}
+		dataTime := fmt.Sprintf("%s-%s", yearStr, rowData[sheetConfig.MonthRow])
+		if dataTime == "0" {
+			continue
+		}
+		date, _, convertErr := utils.ConvertDateFormatForMC(dataTime)
+		if convertErr != nil {
+			utils.FileLog.Error(fmt.Sprintf("转换时间数据失败,index_code:%s,time_value:%s err:%v", indexCode, dataTime, convertErr))
+			continue
+		}
+		if rowData[sheetConfig.DataRow] != "" {
+			value, parseErr := decimal.NewFromString(rowData[sheetConfig.DataRow])
+			if parseErr != nil {
+				utils.FileLog.Error(fmt.Sprintf("转换data数据失败,index_code:%s,data_value:%s err:%v", indexCode, rowData[sheetConfig.DataRow], err))
+				continue
+			} else {
+				if index, ok := indexMap[indexCode]; ok {
+					if index.StartDate.After(date) {
+						index.StartDate = date
+					}
+					if index.EndDate.Before(date) {
+						index.EndDate = date
+						index.LatestValue = value
+					}
+					index.DataList = append(index.DataList, models.IndexData{
+						DataTime: date,
+						Value:    value,
+					})
+				} else {
+					indexMap[indexCode] = &models.IndexInfo{
+						IndexName:   indexName,
+						IndexCode:   indexCode,
+						Frequency:   sheetConfig.Frequency,
+						Unit:        sheetConfig.Unit,
+						StartDate:   date,
+						EndDate:     date,
+						LatestValue: value,
+						ClassifyId:  classifyId,
+						DataList: []models.IndexData{
+							{
+								DataTime: date,
+								Value:    value,
+							},
+						},
+					}
+				}
+			}
+		}
+	}
+	return
+}

+ 1343 - 1517
services/ruizide/processor_business_logic.go

@@ -2,1520 +2,1346 @@
 // @Author gmy 2024/10/21 10:50:00
 package ruizide
 
-import (
-	"encoding/json"
-	"eta/eta_data_analysis/models"
-	"eta/eta_data_analysis/utils"
-	"fmt"
-	"strings"
-	"unicode"
-)
-
-// // UpstreamSupplyOilQualityApiProcessor
-// // @Description: UpstreamSupplyOilQualityApiProcessor处理器
-// type UpstreamSupplyOilQualityApiProcessor struct{}
-//
-// var rzdApiFlag string
-//
-//	func (p *UpstreamSupplyOilQualityApiProcessor) Process(tableName string, sheetName string, rowIndex int, rowData []string) ([]models.BaseFromRzdData, error) {
-//		utils.FileLog.Info("Processing UpstreamSupplyOilQualityApiProcessor...")
-//		if rowIndex <= 1 {
-//			return nil, nil
-//		}
-//
-//		if rowData[0] != "" {
-//			rzdApiFlag = rowData[0]
-//		} else {
-//			rowData[0] = rzdApiFlag
-//		}
-//
-//		frequency := "月度"
-//		unit := "°"
-//		indexNameColSuffix := "Oil Quality"
-//		//indexNameColPrefix := "CountryRevisionGroup"
-//
-//		if !utils.IsNumeric(rowData[0]) {
-//			return nil, nil
-//		}
-//		if rowData[1] == "Sum" {
-//			return nil, nil
-//		}
-//
-//		// step_1: 分类
-//		classifyId, err := dealClassify("Oil Market Cube", "Upstream Supply")
-//		if err != nil {
-//			return nil, err
-//		}
-//		utils.FileLog.Info("classifyId: %v", classifyId)
-//
-//		// step_2: 指标
-//		// 指标名称
-//		indexName := "Upstream Supply" + "/" + indexNameColSuffix + "/" + "API"
-//
-//		// 生成指标编码
-//		indexCode, err := getIndexId("Upstream Supply "+indexNameColSuffix, strings.ToLower("API"), "")
-//
-//		var indexInfoList []*models.IndexInfo
-//		value, err := strconv.ParseFloat(rowData[len(rowData)-1], 64)
-//		if err != nil {
-//			return nil, err
-//		}
-//
-//		dataTime := rowData[0]
-//		format, err := utils.ConvertDateFormat6(dataTime + "-" + rowData[1])
-//		if err != nil {
-//			return nil, err
-//		}
-//
-//		indexInfoList = append(indexInfoList, &models.IndexInfo{
-//			IndexName: indexName,
-//			IndexCode: indexCode,
-//			Value:     value,
-//			DataTime:  format,
-//		})
-//
-//		indexInfoList, err = dealIndex(indexInfoList, frequency, unit, classifyId)
-//		if err != nil {
-//			return nil, err
-//		}
-//		utils.FileLog.Info("UpstreamSupplyOilQualityApiProcessor indexInfoList: %v", indexInfoList)
-//
-//		// step_3: 指标数据
-//		dataList, err := dealData(indexInfoList)
-//		if err != nil {
-//			return nil, err
-//		}
-//		utils.FileLog.Info("UpstreamSupplyOilQualityApiProcessor dataList: %v", dataList)
-//
-//		return dataList, err
-//	}
-//
-// // OilMarketCubeUpstreamSupplyOilQualitySulphurProcessor
-// // @Description: OilMarketCubeUpstreamSupplyOilQualitySulphurProcessor处理器
-// type OilMarketCubeUpstreamSupplyOilQualitySulphurProcessor struct{}
-//
-// var rzdSulphurFlag string
-//
-//	func (p *OilMarketCubeUpstreamSupplyOilQualitySulphurProcessor) Process(tableName string, sheetName string, rowIndex int, rowData []string) ([]models.BaseFromRzdData, error) {
-//		utils.FileLog.Info("Processing OilMarketCubeUpstreamSupplyOilQualitySulphurProcessor...")
-//		if rowIndex <= 1 {
-//			return nil, nil
-//		}
-//
-//		if rowData[0] != "" {
-//			rzdSulphurFlag = rowData[0]
-//		} else {
-//			rowData[0] = rzdSulphurFlag
-//		}
-//
-//		frequency := "月度"
-//		unit := "%wt"
-//		indexNameColSuffix := "Oil Quality"
-//		//indexNameColPrefix := "CountryRevisionGroup"
-//
-//		if !utils.IsNumeric(rowData[0]) {
-//			return nil, nil
-//		}
-//		if rowData[1] == "Sum" {
-//			return nil, nil
-//		}
-//
-//		// step_1: 分类
-//		classifyId, err := dealClassify("Oil Market Cube", "Upstream Supply")
-//		if err != nil {
-//			return nil, err
-//		}
-//		utils.FileLog.Info("classifyId: %v", classifyId)
-//
-//		// step_2: 指标
-//		// 指标名称
-//		indexName := "Upstream Supply" + "/" + indexNameColSuffix + "/" + "Sulphur"
-//
-//		// 生成指标编码
-//		indexCode, err := getIndexId("Upstream Supply "+indexNameColSuffix, strings.ToLower("Sulphur"), "")
-//
-//		var indexInfoList []*models.IndexInfo
-//		value, err := strconv.ParseFloat(rowData[len(rowData)-1], 64)
-//		if err != nil {
-//			return nil, err
-//		}
-//
-//		dataTime := rowData[0]
-//		format, err := utils.ConvertDateFormat6(dataTime + "-" + rowData[1])
-//		if err != nil {
-//			return nil, err
-//		}
-//
-//		indexInfoList = append(indexInfoList, &models.IndexInfo{
-//			IndexName: indexName,
-//			IndexCode: indexCode,
-//			Value:     value,
-//			DataTime:  format,
-//		})
-//
-//		indexInfoList, err = dealIndex(indexInfoList, frequency, unit, classifyId)
-//		if err != nil {
-//			return nil, err
-//		}
-//		utils.FileLog.Info("OilMarketCubeUpstreamSupplyOilQualitySulphurProcessor indexInfoList: %v", indexInfoList)
-//
-//		// step_3: 指标数据
-//		dataList, err := dealData(indexInfoList)
-//		if err != nil {
-//			return nil, err
-//		}
-//		utils.FileLog.Info("OilMarketCubeUpstreamSupplyOilQualitySulphurProcessor dataList: %v", dataList)
-//
-//		return dataList, err
-//	}
-//
-// // OilMarketCubeUpstreamSupplyCapacityCapacityProcessor
-// // @Description: OilMarketCubeUpstreamSupplyCapacityCapacityProcessor处理器
-// type OilMarketCubeUpstreamSupplyCapacityCapacityProcessor struct{}
-//
-// var rzdCapacityFlag string
-//
-//	func (p *OilMarketCubeUpstreamSupplyCapacityCapacityProcessor) Process(tableName string, sheetName string, rowIndex int, rowData []string) ([]models.BaseFromRzdData, error) {
-//		utils.FileLog.Info("Processing OilMarketCubeUpstreamSupplyCapacityCapacityProcessor...")
-//		if rowIndex <= 1 {
-//			return nil, nil
-//		}
-//
-//		if rowData[0] != "" {
-//			rzdCapacityFlag = rowData[0]
-//		} else {
-//			rowData[0] = rzdCapacityFlag
-//		}
-//
-//		frequency := "月度"
-//		unit := "kbbl/d"
-//		indexNameColSuffix := "Capacity"
-//		//indexNameColPrefix := "CountryRevisionGroup"
-//
-//		if !utils.IsNumeric(rowData[0]) {
-//			return nil, nil
-//		}
-//		if rowData[1] == "Sum" {
-//			return nil, nil
-//		}
-//
-//		// step_1: 分类
-//		classifyId, err := dealClassify("Oil Market Cube", "Upstream Supply")
-//		if err != nil {
-//			return nil, err
-//		}
-//		utils.FileLog.Info("classifyId: %v", classifyId)
-//
-//		// step_2: 指标
-//		// 指标名称
-//		indexName := "Upstream Supply" + "/" + indexNameColSuffix
-//
-//		// 生成指标编码
-//		indexCode, err := getIndexId("Upstream Supply ", strings.ReplaceAll(strings.ToLower(indexNameColSuffix), " ", ""), "")
-//
-//		var indexInfoList []*models.IndexInfo
-//		value, err := strconv.ParseFloat(rowData[len(rowData)-1], 64)
-//		if err != nil {
-//			return nil, err
-//		}
-//
-//		dataTime := rowData[0]
-//		format, err := utils.ConvertDateFormat6(dataTime + "-" + rowData[1])
-//		if err != nil {
-//			return nil, err
-//		}
-//
-//		indexInfoList = append(indexInfoList, &models.IndexInfo{
-//			IndexName: indexName,
-//			IndexCode: indexCode,
-//			Value:     value,
-//			DataTime:  format,
-//		})
-//
-//		indexInfoList, err = dealIndex(indexInfoList, frequency, unit, classifyId)
-//		if err != nil {
-//			return nil, err
-//		}
-//		utils.FileLog.Info("OilMarketCubeUpstreamSupplyCapacityCapacityProcessor indexInfoList: %v", indexInfoList)
-//
-//		// step_3: 指标数据
-//		dataList, err := dealData(indexInfoList)
-//		if err != nil {
-//			return nil, err
-//		}
-//		utils.FileLog.Info("OilMarketCubeUpstreamSupplyCapacityCapacityProcessor dataList: %v", dataList)
-//
-//		return dataList, err
-//	}
-//
-// // OilMarketCubeUpstreamSupplyProductionProcessor
-// // @Description: OilMarketCubeUpstreamSupplyProductionProcessor处理器
-// type OilMarketCubeUpstreamSupplyProductionProcessor struct{}
-//
-// var rzdProductionFlag string
-//
-//	func (p *OilMarketCubeUpstreamSupplyProductionProcessor) Process(tableName string, sheetName string, rowIndex int, rowData []string) ([]models.BaseFromRzdData, error) {
-//		utils.FileLog.Info("Processing OilMarketCubeUpstreamSupplyProductionProcessor...")
-//		if rowIndex <= 1 {
-//			return nil, nil
-//		}
-//
-//		if rowData[0] != "" {
-//			rzdProductionFlag = rowData[0]
-//		} else {
-//			rowData[0] = rzdProductionFlag
-//		}
-//
-//		frequency := "月度"
-//		unit := "kbbl/d"
-//		indexNameColSuffix := "Production"
-//		//indexNameColPrefix := "CountryRevisionGroup"
-//
-//		if !utils.IsNumeric(rowData[0]) {
-//			return nil, nil
-//		}
-//		if rowData[1] == "Sum" {
-//			return nil, nil
-//		}
-//
-//		// step_1: 分类
-//		classifyId, err := dealClassify("Oil Market Cube", "Upstream Supply")
-//		if err != nil {
-//			return nil, err
-//		}
-//		utils.FileLog.Info("classifyId: %v", classifyId)
-//
-//		// step_2: 指标
-//		// 指标名称
-//		indexName := "Upstream Supply" + "/" + indexNameColSuffix
-//
-//		// 生成指标编码
-//		indexCode, err := getIndexId("Upstream Supply", strings.ReplaceAll(strings.ToLower(indexNameColSuffix), " ", ""), "")
-//
-//		var indexInfoList []*models.IndexInfo
-//		value, err := strconv.ParseFloat(rowData[len(rowData)-1], 64)
-//		if err != nil {
-//			return nil, err
-//		}
-//
-//		dataTime := rowData[0]
-//		format, err := utils.ConvertDateFormat6(dataTime + "-" + rowData[1])
-//		if err != nil {
-//			return nil, err
-//		}
-//
-//		indexInfoList = append(indexInfoList, &models.IndexInfo{
-//			IndexName: indexName,
-//			IndexCode: indexCode,
-//			Value:     value,
-//			DataTime:  format,
-//		})
-//
-//		indexInfoList, err = dealIndex(indexInfoList, frequency, unit, classifyId)
-//		if err != nil {
-//			return nil, err
-//		}
-//		utils.FileLog.Info("OilMarketCubeUpstreamSupplyProductionProcessor indexInfoList: %v", indexInfoList)
-//
-//		// step_3: 指标数据
-//		dataList, err := dealData(indexInfoList)
-//		if err != nil {
-//			return nil, err
-//		}
-//		utils.FileLog.Info("OilMarketCubeUpstreamSupplyProductionProcessor dataList: %v", dataList)
-//
-//		return dataList, err
-//	}
-//
-// // UpstreamSupplyProductionWoSeasonalityProcessor
-// // @Description: UpstreamSupplyProductionWoSeasonalityProcessor处理器
-// type UpstreamSupplyProductionWoSeasonalityProcessor struct{}
-//
-// var rzdProductionWoSeasonalityFlag string
-//
-//	func (p *UpstreamSupplyProductionWoSeasonalityProcessor) Process(tableName string, sheetName string, rowIndex int, rowData []string) ([]models.BaseFromRzdData, error) {
-//		utils.FileLog.Info("Processing UpstreamSupplyProductionWoSeasonalityProcessor...")
-//		if rowIndex <= 1 {
-//			return nil, nil
-//		}
-//
-//		if rowData[0] != "" {
-//			rzdProductionWoSeasonalityFlag = rowData[0]
-//		} else {
-//			rowData[0] = rzdProductionWoSeasonalityFlag
-//		}
-//
-//		frequency := "月度"
-//		unit := "kbbl/d"
-//		indexNameColSuffix := "Production Wo Seasonality"
-//		//indexNameColPrefix := "CountryRevisionGroup"
-//
-//		if !utils.IsNumeric(rowData[0]) {
-//			return nil, nil
-//		}
-//		if rowData[1] == "Sum" {
-//			return nil, nil
-//		}
-//
-//		// step_1: 分类
-//		classifyId, err := dealClassify("Oil Market Cube", "Upstream Supply")
-//		if err != nil {
-//			return nil, err
-//		}
-//		utils.FileLog.Info("classifyId: %v", classifyId)
-//
-//		// step_2: 指标
-//		// 指标名称
-//		indexName := "Upstream Supply" + "/" + indexNameColSuffix
-//
-//		// 生成指标编码
-//		indexCode, err := getIndexId("Upstream Supply", strings.ReplaceAll(strings.ToLower(indexNameColSuffix), " ", ""), "")
-//
-//		var indexInfoList []*models.IndexInfo
-//		value, err := strconv.ParseFloat(rowData[len(rowData)-1], 64)
-//		if err != nil {
-//			return nil, err
-//		}
-//
-//		dataTime := rowData[0]
-//		format, err := utils.ConvertDateFormat6(dataTime + "-" + rowData[1])
-//		if err != nil {
-//			return nil, err
-//		}
-//
-//		indexInfoList = append(indexInfoList, &models.IndexInfo{
-//			IndexName: indexName,
-//			IndexCode: indexCode,
-//			Value:     value,
-//			DataTime:  format,
-//		})
-//
-//		indexInfoList, err = dealIndex(indexInfoList, frequency, unit, classifyId)
-//		if err != nil {
-//			return nil, err
-//		}
-//		utils.FileLog.Info("UpstreamSupplyProductionWoSeasonalityProcessor indexInfoList: %v", indexInfoList)
-//
-//		// step_3: 指标数据
-//		dataList, err := dealData(indexInfoList)
-//		if err != nil {
-//			return nil, err
-//		}
-//		utils.FileLog.Info("UpstreamSupplyProductionWoSeasonalityProcessor dataList: %v", dataList)
-//
-//		return dataList, err
-//	}
-//
-// // UpstreamSupplyOPECPolicyReferenceProductionProcessor
-// // @Description: UpstreamSupplyOPECPolicyReferenceProductionProcessor处理器
-// type UpstreamSupplyOPECPolicyReferenceProductionProcessor struct{}
-//
-// var rzdReferenceProductionFlag string
-//
-//	func (p *UpstreamSupplyOPECPolicyReferenceProductionProcessor) Process(tableName string, sheetName string, rowIndex int, rowData []string) ([]models.BaseFromRzdData, error) {
-//		utils.FileLog.Info("Processing UpstreamSupplyOPECPolicyReferenceProductionProcessor...")
-//		if rowIndex <= 1 {
-//			return nil, nil
-//		}
-//
-//		if rowData[0] != "" {
-//			rzdReferenceProductionFlag = rowData[0]
-//		} else {
-//			rowData[0] = rzdReferenceProductionFlag
-//		}
-//
-//		frequency := "月度"
-//		unit := "kbbl/d"
-//		indexNameColPrefix := "OPEC_Policy"
-//		indexNameColSuffix := "Reference Production"
-//
-//		if !utils.IsNumeric(rowData[0]) {
-//			return nil, nil
-//		}
-//		if rowData[1] == "Sum" {
-//			return nil, nil
-//		}
-//
-//		// step_1: 分类
-//		classifyId, err := dealClassify("Oil Market Cube", "Upstream Supply")
-//		if err != nil {
-//			return nil, err
-//		}
-//		utils.FileLog.Info("classifyId: %v", classifyId)
-//
-//		// step_2: 指标
-//		// 指标名称
-//		indexName := "Upstream Supply" + "/" + indexNameColPrefix + "/" + indexNameColSuffix
-//
-//		// 生成指标编码
-//		indexCode, err := getIndexId("Upstream Supply "+indexNameColPrefix, strings.ReplaceAll(strings.ToLower(indexNameColSuffix), " ", ""), "")
-//
-//		var indexInfoList []*models.IndexInfo
-//		value, err := strconv.ParseFloat(rowData[len(rowData)-1], 64)
-//		if err != nil {
-//			return nil, err
-//		}
-//
-//		dataTime := rowData[0]
-//		format, err := utils.ConvertDateFormat6(dataTime + "-" + rowData[1])
-//		if err != nil {
-//			return nil, err
-//		}
-//
-//		indexInfoList = append(indexInfoList, &models.IndexInfo{
-//			IndexName: indexName,
-//			IndexCode: indexCode,
-//			Value:     value,
-//			DataTime:  format,
-//		})
-//
-//		indexInfoList, err = dealIndex(indexInfoList, frequency, unit, classifyId)
-//		if err != nil {
-//			return nil, err
-//		}
-//		utils.FileLog.Info("UpstreamSupplyOPECPolicyReferenceProductionProcessor indexInfoList: %v", indexInfoList)
-//
-//		// step_3: 指标数据
-//		dataList, err := dealData(indexInfoList)
-//		if err != nil {
-//			return nil, err
-//		}
-//		utils.FileLog.Info("UpstreamSupplyOPECPolicyReferenceProductionProcessor dataList: %v", dataList)
-//
-//		return dataList, err
-//	}
-//
-// // UpstreamSupplyOPECPolicyTargetProductionProcessor
-// // @Description: UpstreamSupplyOPECPolicyTargetProductionProcessor处理器
-// type UpstreamSupplyOPECPolicyTargetProductionProcessor struct{}
-//
-// var rzdTargetProductionFlag string
-//
-//	func (p *UpstreamSupplyOPECPolicyTargetProductionProcessor) Process(tableName string, sheetName string, rowIndex int, rowData []string) ([]models.BaseFromRzdData, error) {
-//		utils.FileLog.Info("Processing UpstreamSupplyOPECPolicyTargetProductionProcessor...")
-//		if rowIndex <= 1 {
-//			return nil, nil
-//		}
-//
-//		if rowData[0] != "" {
-//			rzdTargetProductionFlag = rowData[0]
-//		} else {
-//			rowData[0] = rzdTargetProductionFlag
-//		}
-//
-//		frequency := "月度"
-//		unit := "kbbl/d"
-//		indexNameColPrefix := "OPEC_Policy"
-//		indexNameColSuffix := "Target Production"
-//
-//		if !utils.IsNumeric(rowData[0]) {
-//			return nil, nil
-//		}
-//		if rowData[1] == "Sum" {
-//			return nil, nil
-//		}
-//
-//		// step_1: 分类
-//		classifyId, err := dealClassify("Oil Market Cube", "Upstream Supply")
-//		if err != nil {
-//			return nil, err
-//		}
-//		utils.FileLog.Info("classifyId: %v", classifyId)
-//
-//		// step_2: 指标
-//		// 指标名称
-//		indexName := "Upstream Supply" + "/" + indexNameColPrefix + "/" + indexNameColSuffix
-//
-//		// 生成指标编码
-//		indexCode, err := getIndexId("Upstream Supply "+indexNameColPrefix, strings.ReplaceAll(strings.ToLower(indexNameColSuffix), " ", ""), "")
-//
-//		var indexInfoList []*models.IndexInfo
-//		value, err := strconv.ParseFloat(rowData[len(rowData)-1], 64)
-//		if err != nil {
-//			return nil, err
-//		}
-//
-//		dataTime := rowData[0]
-//		format, err := utils.ConvertDateFormat6(dataTime + "-" + rowData[1])
-//		if err != nil {
-//			return nil, err
-//		}
-//
-//		indexInfoList = append(indexInfoList, &models.IndexInfo{
-//			IndexName: indexName,
-//			IndexCode: indexCode,
-//			Value:     value,
-//			DataTime:  format,
-//		})
-//
-//		indexInfoList, err = dealIndex(indexInfoList, frequency, unit, classifyId)
-//		if err != nil {
-//			return nil, err
-//		}
-//		utils.FileLog.Info("UpstreamSupplyOPECPolicyTargetProductionProcessor indexInfoList: %v", indexInfoList)
-//
-//		// step_3: 指标数据
-//		dataList, err := dealData(indexInfoList)
-//		if err != nil {
-//			return nil, err
-//		}
-//		utils.FileLog.Info("UpstreamSupplyOPECPolicyTargetProductionProcessor dataList: %v", dataList)
-//
-//		return dataList, err
-//	}
-//
-// // UpstreamSupplyOPECPolicyTargetCutProcessor
-// // @Description: UpstreamSupplyOPECPolicyTargetCutProcessor处理器
-// type UpstreamSupplyOPECPolicyTargetCutProcessor struct{}
-//
-// var rzdTargetCutFlag string
-//
-//	func (p *UpstreamSupplyOPECPolicyTargetCutProcessor) Process(tableName string, sheetName string, rowIndex int, rowData []string) ([]models.BaseFromRzdData, error) {
-//		utils.FileLog.Info("Processing UpstreamSupplyOPECPolicyTargetCutProcessor...")
-//		if rowIndex <= 1 {
-//			return nil, nil
-//		}
-//
-//		if rowData[0] != "" {
-//			rzdTargetCutFlag = rowData[0]
-//		} else {
-//			rowData[0] = rzdTargetCutFlag
-//		}
-//
-//		frequency := "月度"
-//		unit := "kbbl/d"
-//		indexNameColPrefix := "OPEC_Policy"
-//		indexNameColSuffix := "Target Cut"
-//
-//		if !utils.IsNumeric(rowData[0]) {
-//			return nil, nil
-//		}
-//		if rowData[1] == "Sum" {
-//			return nil, nil
-//		}
-//
-//		// step_1: 分类
-//		classifyId, err := dealClassify("Oil Market Cube", "Upstream Supply")
-//		if err != nil {
-//			return nil, err
-//		}
-//		utils.FileLog.Info("classifyId: %v", classifyId)
-//
-//		// step_2: 指标
-//		// 指标名称
-//		indexName := "Upstream Supply" + "/" + indexNameColPrefix + "/" + indexNameColSuffix
-//
-//		// 生成指标编码
-//		indexCode, err := getIndexId("Upstream Supply "+indexNameColPrefix, strings.ReplaceAll(strings.ToLower(indexNameColSuffix), " ", ""), "")
-//
-//		var indexInfoList []*models.IndexInfo
-//		value, err := strconv.ParseFloat(rowData[len(rowData)-1], 64)
-//		if err != nil {
-//			return nil, err
-//		}
-//
-//		dataTime := rowData[0]
-//		format, err := utils.ConvertDateFormat6(dataTime + "-" + rowData[1])
-//		if err != nil {
-//			return nil, err
-//		}
-//
-//		indexInfoList = append(indexInfoList, &models.IndexInfo{
-//			IndexName: indexName,
-//			IndexCode: indexCode,
-//			Value:     value,
-//			DataTime:  format,
-//		})
-//
-//		indexInfoList, err = dealIndex(indexInfoList, frequency, unit, classifyId)
-//		if err != nil {
-//			return nil, err
-//		}
-//		utils.FileLog.Info("UpstreamSupplyOPECPolicyTargetCutProcessor indexInfoList: %v", indexInfoList)
-//
-//		// step_3: 指标数据
-//		dataList, err := dealData(indexInfoList)
-//		if err != nil {
-//			return nil, err
-//		}
-//		utils.FileLog.Info("UpstreamSupplyOPECPolicyTargetCutProcessor dataList: %v", dataList)
-//
-//		return dataList, err
-//	}
-//
-// // UpstreamSupplyOPECPolicyActualCutProcessor
-// // @Description: UpstreamSupplyOPECPolicyActualCutProcessor处理器
-// type UpstreamSupplyOPECPolicyActualCutProcessor struct{}
-//
-// var rzdActualCutFlag string
-//
-//	func (p *UpstreamSupplyOPECPolicyActualCutProcessor) Process(tableName string, sheetName string, rowIndex int, rowData []string) ([]models.BaseFromRzdData, error) {
-//		utils.FileLog.Info("Processing UpstreamSupplyOPECPolicyActualCutProcessor...")
-//		if rowIndex <= 1 {
-//			return nil, nil
-//		}
-//
-//		if rowData[0] != "" {
-//			rzdActualCutFlag = rowData[0]
-//		} else {
-//			rowData[0] = rzdActualCutFlag
-//		}
-//
-//		frequency := "月度"
-//		unit := "kbbl/d"
-//		indexNameColPrefix := "OPEC_Policy"
-//		indexNameColSuffix := "Actual Cut"
-//
-//		if !utils.IsNumeric(rowData[0]) {
-//			return nil, nil
-//		}
-//		if rowData[1] == "Sum" {
-//			return nil, nil
-//		}
-//
-//		// step_1: 分类
-//		classifyId, err := dealClassify("Oil Market Cube", "Upstream Supply")
-//		if err != nil {
-//			return nil, err
-//		}
-//		utils.FileLog.Info("classifyId: %v", classifyId)
-//
-//		// step_2: 指标
-//		// 指标名称
-//		indexName := "Upstream Supply" + "/" + indexNameColPrefix + "/" + indexNameColSuffix
-//
-//		// 生成指标编码
-//		indexCode, err := getIndexId("Upstream Supply "+indexNameColPrefix, strings.ReplaceAll(strings.ToLower(indexNameColSuffix), " ", ""), "")
-//
-//		var indexInfoList []*models.IndexInfo
-//		value, err := strconv.ParseFloat(rowData[len(rowData)-1], 64)
-//		if err != nil {
-//			return nil, err
-//		}
-//
-//		dataTime := rowData[0]
-//		format, err := utils.ConvertDateFormat6(dataTime + "-" + rowData[1])
-//		if err != nil {
-//			return nil, err
-//		}
-//
-//		indexInfoList = append(indexInfoList, &models.IndexInfo{
-//			IndexName: indexName,
-//			IndexCode: indexCode,
-//			Value:     value,
-//			DataTime:  format,
-//		})
-//
-//		indexInfoList, err = dealIndex(indexInfoList, frequency, unit, classifyId)
-//		if err != nil {
-//			return nil, err
-//		}
-//		utils.FileLog.Info("UpstreamSupplyOPECPolicyActualCutProcessor indexInfoList: %v", indexInfoList)
-//
-//		// step_3: 指标数据
-//		dataList, err := dealData(indexInfoList)
-//		if err != nil {
-//			return nil, err
-//		}
-//		utils.FileLog.Info("UpstreamSupplyOPECPolicyActualCutProcessor dataList: %v", dataList)
-//
-//		return dataList, err
-//	}
-//
-// // UpstreamSupplyOPECPolicyComplianceProcessor
-// // @Description: UpstreamSupplyOPECPolicyComplianceProcessor处理器
-// type UpstreamSupplyOPECPolicyComplianceProcessor struct{}
-//
-// var rzdComplianceFlag string
-//
-//	func (p *UpstreamSupplyOPECPolicyComplianceProcessor) Process(tableName string, sheetName string, rowIndex int, rowData []string) ([]models.BaseFromRzdData, error) {
-//		utils.FileLog.Info("Processing UpstreamSupplyOPECPolicyComplianceProcessor...")
-//		if rowIndex <= 1 {
-//			return nil, nil
-//		}
-//
-//		if rowData[0] != "" {
-//			rzdComplianceFlag = rowData[0]
-//		} else {
-//			rowData[0] = rzdComplianceFlag
-//		}
-//
-//		frequency := "月度"
-//		unit := "kbbl/d"
-//		indexNameColPrefix := "OPEC_Policy"
-//		indexNameColSuffix := "Compliance"
-//
-//		if !utils.IsNumeric(rowData[0]) {
-//			return nil, nil
-//		}
-//		if rowData[1] == "Sum" {
-//			return nil, nil
-//		}
-//
-//		// step_1: 分类
-//		classifyId, err := dealClassify("Oil Market Cube", "Upstream Supply")
-//		if err != nil {
-//			return nil, err
-//		}
-//		utils.FileLog.Info("classifyId: %v", classifyId)
-//
-//		// step_2: 指标
-//		// 指标名称
-//		indexName := "Upstream Supply" + "/" + indexNameColPrefix + "/" + indexNameColSuffix
-//
-//		// 生成指标编码
-//		indexCode, err := getIndexId("Upstream Supply "+indexNameColPrefix, strings.ReplaceAll(strings.ToLower(indexNameColSuffix), " ", ""), "")
-//
-//		var indexInfoList []*models.IndexInfo
-//		value, err := strconv.ParseFloat(rowData[len(rowData)-1], 64)
-//		if err != nil {
-//			return nil, err
-//		}
-//
-//		dataTime := rowData[0]
-//		format, err := utils.ConvertDateFormat6(dataTime + "-" + rowData[1])
-//		if err != nil {
-//			return nil, err
-//		}
-//
-//		indexInfoList = append(indexInfoList, &models.IndexInfo{
-//			IndexName: indexName,
-//			IndexCode: indexCode,
-//			Value:     value,
-//			DataTime:  format,
-//		})
-//
-//		indexInfoList, err = dealIndex(indexInfoList, frequency, unit, classifyId)
-//		if err != nil {
-//			return nil, err
-//		}
-//		utils.FileLog.Info("UpstreamSupplyOPECPolicyComplianceProcessor indexInfoList: %v", indexInfoList)
-//
-//		// step_3: 指标数据
-//		dataList, err := dealData(indexInfoList)
-//		if err != nil {
-//			return nil, err
-//		}
-//		utils.FileLog.Info("UpstreamSupplyOPECPolicyComplianceProcessor dataList: %v", dataList)
-//
-//		return dataList, err
-//	}
-//
-// // UpstreamSupplyOPECPolicyProductionSubjectToCutProcessor
-// // @Description: UpstreamSupplyOPECPolicyProductionSubjectToCutProcessor处理器
-// type UpstreamSupplyOPECPolicyProductionSubjectToCutProcessor struct{}
-//
-// var rzdProductionSubjectToCutFlag string
-//
-//	func (p *UpstreamSupplyOPECPolicyProductionSubjectToCutProcessor) Process(tableName string, sheetName string, rowIndex int, rowData []string) ([]models.BaseFromRzdData, error) {
-//		utils.FileLog.Info("Processing UpstreamSupplyOPECPolicyProductionSubjectToCutProcessor...")
-//		if rowIndex <= 1 {
-//			return nil, nil
-//		}
-//
-//		if rowData[0] != "" {
-//			rzdProductionSubjectToCutFlag = rowData[0]
-//		} else {
-//			rowData[0] = rzdProductionSubjectToCutFlag
-//		}
-//
-//		frequency := "月度"
-//		unit := "kbbl/d"
-//		indexNameColPrefix := "OPEC_Policy"
-//		indexNameColSuffix := "Production Subject To Cut"
-//
-//		if !utils.IsNumeric(rowData[0]) {
-//			return nil, nil
-//		}
-//		if rowData[1] == "Sum" {
-//			return nil, nil
-//		}
-//
-//		// step_1: 分类
-//		classifyId, err := dealClassify("Oil Market Cube", "Upstream Supply")
-//		if err != nil {
-//			return nil, err
-//		}
-//		utils.FileLog.Info("classifyId: %v", classifyId)
-//
-//		// step_2: 指标
-//		// 指标名称
-//		indexName := "Upstream Supply" + "/" + indexNameColPrefix + "/" + indexNameColSuffix
-//
-//		// 生成指标编码
-//		indexCode, err := getIndexId("Upstream Supply "+indexNameColPrefix, strings.ReplaceAll(strings.ToLower(indexNameColSuffix), " ", ""), "")
-//
-//		var indexInfoList []*models.IndexInfo
-//		value, err := strconv.ParseFloat(rowData[len(rowData)-1], 64)
-//		if err != nil {
-//			return nil, err
-//		}
-//
-//		dataTime := rowData[0]
-//		format, err := utils.ConvertDateFormat6(dataTime + "-" + rowData[1])
-//		if err != nil {
-//			return nil, err
-//		}
-//
-//		indexInfoList = append(indexInfoList, &models.IndexInfo{
-//			IndexName: indexName,
-//			IndexCode: indexCode,
-//			Value:     value,
-//			DataTime:  format,
-//		})
-//
-//		indexInfoList, err = dealIndex(indexInfoList, frequency, unit, classifyId)
-//		if err != nil {
-//			return nil, err
-//		}
-//		utils.FileLog.Info("UpstreamSupplyOPECPolicyProductionSubjectToCutProcessor indexInfoList: %v", indexInfoList)
-//
-//		// step_3: 指标数据
-//		dataList, err := dealData(indexInfoList)
-//		if err != nil {
-//			return nil, err
-//		}
-//		utils.FileLog.Info("UpstreamSupplyOPECPolicyProductionSubjectToCutProcessor dataList: %v", dataList)
-//
-//		return dataList, err
-//	}
-//
-// // ProductsDemandProductsDemandMeanProcessor
-// // @Description: ProductsDemandProductsDemandMeanProcessor处理器
-// type ProductsDemandProductsDemandMeanProcessor struct{}
-//
-// var rzdProductsDemandMeanFlag string
-//
-//	func (p *ProductsDemandProductsDemandMeanProcessor) Process(tableName string, sheetName string, rowIndex int, rowData []string) ([]models.BaseFromRzdData, error) {
-//		utils.FileLog.Info("Processing ProductsDemandProductsDemandMeanProcessor...")
-//		if rowIndex <= 1 {
-//			return nil, nil
-//		}
-//
-//		if rowData[0] != "" {
-//			rzdProductsDemandMeanFlag = rowData[0]
-//		} else {
-//			rowData[0] = rzdProductsDemandMeanFlag
-//		}
-//
-//		frequency := "月度"
-//		unit := "kbbl/d"
-//		//indexNameColPrefix := "OPEC_Policy"
-//		indexNameColSuffix := "Products Demand Mean (1.0 DG) "
-//
-//		if !utils.IsNumeric(rowData[0]) {
-//			return nil, nil
-//		}
-//		if rowData[1] == "Sum" {
-//			return nil, nil
-//		}
-//
-//		// step_1: 分类
-//		classifyId, err := dealClassify("Oil Market Cube", "Products Demand")
-//		if err != nil {
-//			return nil, err
-//		}
-//		utils.FileLog.Info("classifyId: %v", classifyId)
-//
-//		// step_2: 指标
-//		// 指标名称
-//		indexName := "Products Demand" + "/" + indexNameColSuffix
-//
-//		// 生成指标编码
-//		indexCode, err := getIndexId("Products Demand "+"Products Demand Mean", strings.ReplaceAll(strings.ToLower("1.0dg"), " ", ""), "")
-//
-//		var indexInfoList []*models.IndexInfo
-//		value, err := strconv.ParseFloat(rowData[len(rowData)-1], 64)
-//		if err != nil {
-//			return nil, err
-//		}
-//
-//		dataTime := rowData[0]
-//		format, err := utils.ConvertDateFormat6(dataTime + "-" + rowData[1])
-//		if err != nil {
-//			return nil, err
-//		}
-//
-//		indexInfoList = append(indexInfoList, &models.IndexInfo{
-//			IndexName: indexName,
-//			IndexCode: indexCode,
-//			Value:     value,
-//			DataTime:  format,
-//		})
-//
-//		indexInfoList, err = dealIndex(indexInfoList, frequency, unit, classifyId)
-//		if err != nil {
-//			return nil, err
-//		}
-//		utils.FileLog.Info("ProductsDemandProductsDemandMeanProcessor indexInfoList: %v", indexInfoList)
-//
-//		// step_3: 指标数据
-//		dataList, err := dealData(indexInfoList)
-//		if err != nil {
-//			return nil, err
-//		}
-//		utils.FileLog.Info("ProductsDemandProductsDemandMeanProcessor dataList: %v", dataList)
-//
-//		return dataList, err
-//	}
-//
-// // ProductsDemandProductsDemandAddSigmaProcessor
-// // @Description: ProductsDemandProductsDemandAddSigmaProcessor处理器
-// type ProductsDemandProductsDemandAddSigmaProcessor struct{}
-//
-// var rzdAddSigmaFlag string
-//
-//	func (p *ProductsDemandProductsDemandAddSigmaProcessor) Process(tableName string, sheetName string, rowIndex int, rowData []string) ([]models.BaseFromRzdData, error) {
-//		utils.FileLog.Info("Processing ProductsDemandProductsDemandAddSigmaProcessor...")
-//		if rowIndex <= 1 {
-//			return nil, nil
-//		}
-//
-//		if rowData[0] != "" {
-//			rzdAddSigmaFlag = rowData[0]
-//		} else {
-//			rowData[0] = rzdAddSigmaFlag
-//		}
-//
-//		frequency := "月度"
-//		unit := "kbbl/d"
-//		//indexNameColPrefix := "OPEC_Policy"
-//		indexNameColSuffix := "Products Demand +Sigma (2.2 DG) "
-//
-//		if !utils.IsNumeric(rowData[0]) {
-//			return nil, nil
-//		}
-//		if rowData[1] == "Sum" {
-//			return nil, nil
-//		}
-//
-//		// step_1: 分类
-//		classifyId, err := dealClassify("Oil Market Cube", "Products Demand")
-//		if err != nil {
-//			return nil, err
-//		}
-//		utils.FileLog.Info("classifyId: %v", classifyId)
-//
-//		// step_2: 指标
-//		// 指标名称
-//		indexName := "Products Demand" + "/" + indexNameColSuffix
-//
-//		// 生成指标编码
-//		indexCode, err := getIndexId("Products Demand "+"Products Demand Sigma", strings.ReplaceAll(strings.ToLower("2.2dg"), " ", ""), "")
-//
-//		var indexInfoList []*models.IndexInfo
-//		value, err := strconv.ParseFloat(rowData[len(rowData)-1], 64)
-//		if err != nil {
-//			return nil, err
-//		}
-//
-//		dataTime := rowData[0]
-//		format, err := utils.ConvertDateFormat6(dataTime + "-" + rowData[1])
-//		if err != nil {
-//			return nil, err
-//		}
-//
-//		indexInfoList = append(indexInfoList, &models.IndexInfo{
-//			IndexName: indexName,
-//			IndexCode: indexCode,
-//			Value:     value,
-//			DataTime:  format,
-//		})
-//
-//		indexInfoList, err = dealIndex(indexInfoList, frequency, unit, classifyId)
-//		if err != nil {
-//			return nil, err
-//		}
-//		utils.FileLog.Info("ProductsDemandProductsDemandAddSigmaProcessor indexInfoList: %v", indexInfoList)
-//
-//		// step_3: 指标数据
-//		dataList, err := dealData(indexInfoList)
-//		if err != nil {
-//			return nil, err
-//		}
-//		utils.FileLog.Info("ProductsDemandProductsDemandAddSigmaProcessor dataList: %v", dataList)
-//
-//		return dataList, err
-//	}
-//
-// // ProductsDemandProductsDemandSubSigmaProcessor
-// // @Description: ProductsDemandProductsDemandSubSigmaProcessor处理器
-// type ProductsDemandProductsDemandSubSigmaProcessor struct{}
-//
-// var rzdSubSigmaFlag string
-//
-//	func (p *ProductsDemandProductsDemandSubSigmaProcessor) Process(tableName string, sheetName string, rowIndex int, rowData []string) ([]models.BaseFromRzdData, error) {
-//		utils.FileLog.Info("Processing ProductsDemandProductsDemandSubSigmaProcessor...")
-//		if rowIndex <= 1 {
-//			return nil, nil
-//		}
-//
-//		if rowData[0] != "" {
-//			rzdSubSigmaFlag = rowData[0]
-//		} else {
-//			rowData[0] = rzdSubSigmaFlag
-//		}
-//
-//		frequency := "月度"
-//		unit := "kbbl/d"
-//		//indexNameColPrefix := "OPEC_Policy"
-//		indexNameColSuffix := "Products Demand -Sigma (1.8 DG) "
-//
-//		if !utils.IsNumeric(rowData[0]) {
-//			return nil, nil
-//		}
-//		if rowData[1] == "Sum" {
-//			return nil, nil
-//		}
-//
-//		// step_1: 分类
-//		classifyId, err := dealClassify("Oil Market Cube", "Products Demand")
-//		if err != nil {
-//			return nil, err
-//		}
-//		utils.FileLog.Info("classifyId: %v", classifyId)
-//
-//		// step_2: 指标
-//		// 指标名称
-//		indexName := "Products Demand" + "/" + indexNameColSuffix
-//
-//		// 生成指标编码
-//		indexCode, err := getIndexId("Products Demand "+"Products Demand Sigma", strings.ReplaceAll(strings.ToLower("1.8dg"), " ", ""), "")
-//
-//		var indexInfoList []*models.IndexInfo
-//		value, err := strconv.ParseFloat(rowData[len(rowData)-1], 64)
-//		if err != nil {
-//			return nil, err
-//		}
-//
-//		dataTime := rowData[0]
-//		format, err := utils.ConvertDateFormat6(dataTime + "-" + rowData[1])
-//		if err != nil {
-//			return nil, err
-//		}
-//
-//		indexInfoList = append(indexInfoList, &models.IndexInfo{
-//			IndexName: indexName,
-//			IndexCode: indexCode,
-//			Value:     value,
-//			DataTime:  format,
-//		})
-//
-//		indexInfoList, err = dealIndex(indexInfoList, frequency, unit, classifyId)
-//		if err != nil {
-//			return nil, err
-//		}
-//		utils.FileLog.Info("ProductsDemandProductsDemandSubSigmaProcessor indexInfoList: %v", indexInfoList)
-//
-//		// step_3: 指标数据
-//		dataList, err := dealData(indexInfoList)
-//		if err != nil {
-//			return nil, err
-//		}
-//		utils.FileLog.Info("ProductsDemandProductsDemandSubSigmaProcessor dataList: %v", dataList)
-//
-//		return dataList, err
-//	}
-//
-// // BalancesTotalLiquidsBalancesProcessor
-// // @Description: BalancesTotalLiquidsBalancesProcessor处理器
-// type BalancesTotalLiquidsBalancesProcessor struct{}
-//
-// var rzdTotalLiquidsBalancesFlag string
-//
-//	func (p *BalancesTotalLiquidsBalancesProcessor) Process(tableName string, sheetName string, rowIndex int, rowData []string) ([]models.BaseFromRzdData, error) {
-//		utils.FileLog.Info("Processing BalancesTotalLiquidsBalancesProcessor...")
-//		if rowIndex <= 1 {
-//			return nil, nil
-//		}
-//
-//		if rowData[0] != "" {
-//			rzdTotalLiquidsBalancesFlag = rowData[0]
-//		} else {
-//			rowData[0] = rzdTotalLiquidsBalancesFlag
-//		}
-//
-//		frequency := "月度"
-//		unit := "kbbl/d"
-//		//indexNameColPrefix := "OPEC_Policy"
-//		indexNameColSuffix := "Total Liquids Balances"
-//
-//		if !utils.IsNumeric(rowData[0]) {
-//			return nil, nil
-//		}
-//		if rowData[1] == "Sum" {
-//			return nil, nil
-//		}
-//
-//		// step_1: 分类
-//		classifyId, err := dealClassify("Oil Market Cube", "Balances")
-//		if err != nil {
-//			return nil, err
-//		}
-//		utils.FileLog.Info("classifyId: %v", classifyId)
-//
-//		// step_2: 指标
-//		// 指标名称
-//		indexName := "Balances" + "/" + indexNameColSuffix
-//
-//		// 生成指标编码
-//		indexCode, err := getIndexId("Balances", strings.ReplaceAll(strings.ToLower(indexNameColSuffix), " ", ""), "")
-//
-//		var indexInfoList []*models.IndexInfo
-//		value, err := strconv.ParseFloat(rowData[len(rowData)-1], 64)
-//		if err != nil {
-//			return nil, err
-//		}
-//
-//		dataTime := rowData[0]
-//		format, err := utils.ConvertDateFormat6(dataTime + "-" + rowData[1])
-//		if err != nil {
-//			return nil, err
-//		}
-//
-//		indexInfoList = append(indexInfoList, &models.IndexInfo{
-//			IndexName: indexName,
-//			IndexCode: indexCode,
-//			Value:     value,
-//			DataTime:  format,
-//		})
-//
-//		indexInfoList, err = dealIndex(indexInfoList, frequency, unit, classifyId)
-//		if err != nil {
-//			return nil, err
-//		}
-//		utils.FileLog.Info("BalancesTotalLiquidsBalancesProcessor indexInfoList: %v", indexInfoList)
-//
-//		// step_3: 指标数据
-//		dataList, err := dealData(indexInfoList)
-//		if err != nil {
-//			return nil, err
-//		}
-//		utils.FileLog.Info("BalancesTotalLiquidsBalancesProcessor dataList: %v", dataList)
-//
-//		return dataList, err
-//	}
-//
-// // GeographyLatitudeProcessor
-// // @Description: GeographyLatitudeProcessor处理器
-// type GeographyLatitudeProcessor struct{}
-//
-// var rzdLatitudeFlag string
-//
-//	func (p *GeographyLatitudeProcessor) Process(tableName string, sheetName string, rowIndex int, rowData []string) ([]models.BaseFromRzdData, error) {
-//		utils.FileLog.Info("Processing GeographyLatitudeProcessor...")
-//		if rowIndex <= 1 {
-//			return nil, nil
-//		}
-//
-//		if rowData[0] != "" {
-//			rzdLatitudeFlag = rowData[0]
-//		} else {
-//			rowData[0] = rzdLatitudeFlag
-//		}
-//
-//		frequency := "月度"
-//		unit := ""
-//		//indexNameColPrefix := "OPEC_Policy"
-//		indexNameColSuffix := "Latitude"
-//
-//		if !utils.IsNumeric(rowData[0]) {
-//			return nil, nil
-//		}
-//		if rowData[1] == "Sum" {
-//			return nil, nil
-//		}
-//
-//		// step_1: 分类
-//		classifyId, err := dealClassify("Oil Market Cube", "Geography")
-//		if err != nil {
-//			return nil, err
-//		}
-//		utils.FileLog.Info("classifyId: %v", classifyId)
-//
-//		// step_2: 指标
-//		// 指标名称
-//		indexName := "Geography" + "/" + indexNameColSuffix
-//
-//		// 生成指标编码
-//		indexCode, err := getIndexId("Geography", strings.ReplaceAll(strings.ToLower(indexNameColSuffix), " ", ""), "")
-//
-//		var indexInfoList []*models.IndexInfo
-//		value, err := strconv.ParseFloat(rowData[len(rowData)-1], 64)
-//		if err != nil {
-//			return nil, err
-//		}
-//
-//		dataTime := rowData[0]
-//		format, err := utils.ConvertDateFormat6(dataTime + "-" + rowData[1])
-//		if err != nil {
-//			return nil, err
-//		}
-//
-//		indexInfoList = append(indexInfoList, &models.IndexInfo{
-//			IndexName: indexName,
-//			IndexCode: indexCode,
-//			Value:     value,
-//			DataTime:  format,
-//		})
-//
-//		indexInfoList, err = dealIndex(indexInfoList, frequency, unit, classifyId)
-//		if err != nil {
-//			return nil, err
-//		}
-//		utils.FileLog.Info("GeographyLatitudeProcessor indexInfoList: %v", indexInfoList)
-//
-//		// step_3: 指标数据
-//		dataList, err := dealData(indexInfoList)
-//		if err != nil {
-//			return nil, err
-//		}
-//		utils.FileLog.Info("GeographyLatitudeProcessor dataList: %v", dataList)
-//
-//		return dataList, err
-//	}
-//
-// // GeographyLongitudeProcessor
-// // @Description: GeographyLongitudeProcessor处理器
-// type GeographyLongitudeProcessor struct{}
-//
-// var rzdLongitudeFlag string
-//
-//	func (p *GeographyLongitudeProcessor) Process(tableName string, sheetName string, rowIndex int, rowData []string) ([]models.BaseFromRzdData, error) {
-//		utils.FileLog.Info("Processing GeographyLongitudeProcessor...")
-//		if rowIndex <= 1 {
-//			return nil, nil
-//		}
-//
-//		if rowData[0] != "" {
-//			rzdLongitudeFlag = rowData[0]
-//		} else {
-//			rowData[0] = rzdLongitudeFlag
-//		}
-//
-//		frequency := "月度"
-//		unit := ""
-//		//indexNameColPrefix := "OPEC_Policy"
-//		indexNameColSuffix := "Longitude"
-//
-//		if !utils.IsNumeric(rowData[0]) {
-//			return nil, nil
-//		}
-//		if rowData[1] == "Sum" {
-//			return nil, nil
-//		}
-//
-//		// step_1: 分类
-//		classifyId, err := dealClassify("Oil Market Cube", "Geography")
-//		if err != nil {
-//			return nil, err
-//		}
-//		utils.FileLog.Info("classifyId: %v", classifyId)
-//
-//		// step_2: 指标
-//		// 指标名称
-//		indexName := "Geography" + "/" + indexNameColSuffix
-//
-//		// 生成指标编码
-//		indexCode, err := getIndexId("Geography", strings.ReplaceAll(strings.ToLower(indexNameColSuffix), " ", ""), "")
-//
-//		var indexInfoList []*models.IndexInfo
-//		value, err := strconv.ParseFloat(rowData[len(rowData)-1], 64)
-//		if err != nil {
-//			return nil, err
-//		}
-//
-//		dataTime := rowData[0]
-//		format, err := utils.ConvertDateFormat6(dataTime + "-" + rowData[1])
-//		if err != nil {
-//			return nil, err
-//		}
-//
-//		indexInfoList = append(indexInfoList, &models.IndexInfo{
-//			IndexName: indexName,
-//			IndexCode: indexCode,
-//			Value:     value,
-//			DataTime:  format,
-//		})
-//
-//		indexInfoList, err = dealIndex(indexInfoList, frequency, unit, classifyId)
-//		if err != nil {
-//			return nil, err
-//		}
-//		utils.FileLog.Info("GeographyLongitudeProcessor indexInfoList: %v", indexInfoList)
-//
-//		// step_3: 指标数据
-//		dataList, err := dealData(indexInfoList)
-//		if err != nil {
-//			return nil, err
-//		}
-//		utils.FileLog.Info("GeographyLongitudeProcessor dataList: %v", dataList)
-//
-//		return dataList, err
-//	}
-//
-//	func dealIndex(indexInfoList []*models.IndexInfo, frequency string, unit string, classifyId int) ([]*models.IndexInfo, error) {
-//		for _, index := range indexInfoList {
-//			// 处理第一个指标
-//			paramsLib := make(map[string]interface{})
-//			paramsLib["indexCode"] = index.IndexCode
-//			postEdbLib, err := httpRequestFill(paramsLib, utils.GET_RZD_INDEX_BY_CODE)
-//			if err != nil {
-//				return nil, fmt.Errorf("getIndexId() : Failed to get rzd index by code: %v", err)
-//			}
-//			var requestResponse models.RequestResponse[models.BaseFromRzdIndex]
-//			err = json.Unmarshal(postEdbLib, &requestResponse)
-//			if err != nil {
-//				return nil, err
-//			}
-//			if requestResponse.Data.BaseFromRzdIndexId == 0 {
-//				indexOne := models.BaseFromRzdIndex{
-//					CreateTime:           utils.GetCurrentTime(),
-//					ModifyTime:           utils.GetCurrentTime(),
-//					BaseFromLyClassifyId: classifyId,
-//					IndexCode:            index.IndexCode,
-//					IndexName:            index.IndexName,
-//					Frequency:            frequency,
-//					Unit:                 unit,
-//				}
-//				// 这里避免服务器宕机 出现唯一索引异常,进行分开保存
-//				postEdbLib, err = httpRequestFill(indexOne, utils.ADD_RZD_INDEX)
-//				if err != nil {
-//					return nil, fmt.Errorf("getIndexId() : Failed to get rzd index by code: %v", err)
-//				}
-//				var requestResponse models.RequestResponse[int]
-//				err = json.Unmarshal(postEdbLib, &requestResponse)
-//				if err != nil {
-//					return nil, err
-//				}
-//				utils.FileLog.Info("indexOneId: %v", requestResponse.Data)
-//				//index.IndexInfoId = requestResponse.Data
-//			} else {
-//				utils.FileLog.Info("indexOneId: %v", requestResponse.Data.BaseFromRzdIndexId)
-//				//index.IndexInfoId = requestResponse.Data.BaseFromRzdIndexId
-//			}
-//		}
-//		return indexInfoList, nil
-//	}
-func getIndexId(prefix string, area string, suffix string) (indexCode string) {
-	prefixWords := strings.Fields(prefix) // 分割字符串为单词
-	firstLetters := ""
-	for _, word := range prefixWords {
-		if len(word) > 0 {
-			firstLetters += string(unicode.ToLower(rune(word[0]))) // 获取小写的第一个字母
-		}
-	}
-	suffixWords := strings.Fields(suffix) // 分割字符串为单词
-	SecondLetters := ""
-
-	for _, word := range suffixWords {
-		if len(word) > 0 {
-			SecondLetters += string(unicode.ToLower(rune(word[0]))) // 获取小写的第一个字母
-		}
-	}
-	indexCode = "rzd" + firstLetters + area + SecondLetters
-	return
-}
-
-// 处理分类
-type BatchAddClassifyType struct {
-	List []models.AddRzdClassify
-}
-
-func dealClassify(tableName string, sheetNames []string) (classifyList map[string]int, err error) {
-	var rzdClassifyList []models.AddRzdClassify
-	var parentId int
-	classifyList = make(map[string]int)
-	rzdMapStruct := classifyMap[tableName]
-	// 查询一级分类是否存在
-	if classify, ok := RzdClassifyMap[rzdMapStruct.ClassifyName]; !ok {
-		parentClassify := models.AddRzdClassify{
-			ClassifyName: rzdMapStruct.ClassifyName,
-			Sort:         rzdMapStruct.Sort,
-			ParentId:     0,
-		}
-		rzdClassifyList = append(rzdClassifyList, parentClassify)
-		resp, httpErr := httpRequestFill(BatchAddClassifyType{
-			List: rzdClassifyList,
-		}, utils.BATCH_ADD_RZD_CLASSYFY)
-		if httpErr != nil {
-			err = fmt.Errorf("添加睿咨得分类失败: %v", err)
-			return
-		}
-		var rzdResp models.RequestResponse[[]models.BaseFromRzdClassify]
-		jsonErr := json.Unmarshal(resp, &rzdResp)
-		if jsonErr != nil {
-			err = fmt.Errorf("解析添加睿咨得分类失败: %v", err)
-			return
-		}
-		if rzdResp.Ret != 200 {
-			err = fmt.Errorf("添加睿咨得分类失败: %v", err)
-			return
-		}
-		parentId = rzdResp.Data[0].BaseFromRzdClassifyId
-		classifyList[tableName] = rzdResp.Data[0].BaseFromRzdClassifyId
-	} else {
-		parentId = classify.BaseFromRzdClassifyId
-		classifyList[tableName] = classify.BaseFromRzdClassifyId
-	}
-	rzdClassifyList = []models.AddRzdClassify{}
-	//处理二级分类
-	for _, sheetName := range sheetNames {
-		if sheetName == "Content" {
-			continue
-		}
-		rzdMapStruct = classifyMap[sheetName]
-		if classify, ok := RzdClassifyMap[rzdMapStruct.ClassifyName]; !ok {
-			rzdClassifyList = append(rzdClassifyList, models.AddRzdClassify{
-				ClassifyName: rzdMapStruct.ClassifyName,
-				Sort:         rzdMapStruct.Sort,
-				ParentId:     parentId,
-			})
-		} else {
-			classifyList[sheetName] = classify.BaseFromRzdClassifyId
-		}
-	}
-	if len(rzdClassifyList) > 0 {
-		resp, httpErr := httpRequestFill(BatchAddClassifyType{
-			List: rzdClassifyList}, utils.BATCH_ADD_RZD_CLASSYFY)
-		if httpErr != nil {
-			err = fmt.Errorf("添加睿咨得分类失败: %v", err)
-			return
-		}
-		var rzdResp models.RequestResponse[[]models.BaseFromRzdClassify]
-		jsonErr := json.Unmarshal(resp, &rzdResp)
-		if jsonErr != nil {
-			err = fmt.Errorf("解析添加睿咨得分类失败: %v", err)
-			return
-		}
-		if rzdResp.Ret != 200 {
-			err = fmt.Errorf("添加睿咨得分类失败: %v", err)
-			return
-		}
-		for _, classify := range rzdResp.Data {
-			classifyList[classify.ClassifyName] = classify.BaseFromRzdClassifyId
-		}
-	}
-	return
-}
-
-// 处理分类
-func getRzdClassifyList() (list []*models.BaseFromRzdClassify, err error) {
-	//查询睿咨得分类
-	postEdbLib, httpErr := httpRequestFill(nil, utils.GET_RZD_CLASSIFY)
-	if httpErr != nil {
-		err = fmt.Errorf("获取睿咨得分类数据失败: %v", httpErr)
-		return
-	}
-	var requestResponse models.RequestResponse[[]*models.BaseFromRzdClassify]
-	jsonErr := json.Unmarshal(postEdbLib, &requestResponse)
-	if jsonErr != nil {
-		err = fmt.Errorf("获取睿咨得分类数据失败,解析JSON数据失败: %v", jsonErr)
-		return
-	}
-	if requestResponse.Ret != 200 {
-		err = fmt.Errorf("获取睿咨得分类数据失败,请求应答异常: %v", requestResponse.ErrMsg)
-		return
-	}
-	return requestResponse.Data, nil
-}
+//
+//// UpstreamSupplyOilQualityApiProcessor
+//// @Description: UpstreamSupplyOilQualityApiProcessor处理器
+//type UpstreamSupplyOilQualityApiProcessor struct{}
+//
+//var rzdApiFlag string
+//
+//func (p *UpstreamSupplyOilQualityApiProcessor) Process(tableName string, sheetName string, rowIndex int, rowData []string) ([]models.BaseFromRzdData, error) {
+//	utils.FileLog.Info("Processing UpstreamSupplyOilQualityApiProcessor...")
+//	if rowIndex <= 1 {
+//		return nil, nil
+//	}
+//
+//	if rowData[0] != "" {
+//		rzdApiFlag = rowData[0]
+//	} else {
+//		rowData[0] = rzdApiFlag
+//	}
+//
+//	frequency := "月度"
+//	unit := "°"
+//	indexNameColSuffix := "Oil Quality"
+//	//indexNameColPrefix := "CountryRevisionGroup"
+//
+//	if !utils.IsNumeric(rowData[0]) {
+//		return nil, nil
+//	}
+//	if rowData[1] == "Sum" {
+//		return nil, nil
+//	}
+//
+//	// step_1: 分类
+//	classifyId, err := dealClassify("Oil Market Cube", "Upstream Supply")
+//	if err != nil {
+//		return nil, err
+//	}
+//	utils.FileLog.Info("classifyId: %v", classifyId)
+//
+//	// step_2: 指标
+//	// 指标名称
+//	indexName := "Upstream Supply" + "/" + indexNameColSuffix + "/" + "API"
+//
+//	// 生成指标编码
+//	indexCode, err := getIndexId("Upstream Supply "+indexNameColSuffix, strings.ToLower("API"), "")
+//
+//	var indexInfoList []*models.IndexInfo
+//	value, err := strconv.ParseFloat(rowData[len(rowData)-1], 64)
+//	if err != nil {
+//		return nil, err
+//	}
+//
+//	dataTime := rowData[0]
+//	format, err := utils.ConvertDateFormat6(dataTime + "-" + rowData[1])
+//	if err != nil {
+//		return nil, err
+//	}
+//
+//	indexInfoList = append(indexInfoList, &models.IndexInfo{
+//		IndexName: indexName,
+//		IndexCode: indexCode,
+//		Value:     value,
+//		DataTime:  format,
+//	})
+//
+//	indexInfoList, err = dealIndex(indexInfoList, frequency, unit, classifyId)
+//	if err != nil {
+//		return nil, err
+//	}
+//	utils.FileLog.Info("UpstreamSupplyOilQualityApiProcessor indexInfoList: %v", indexInfoList)
+//
+//	// step_3: 指标数据
+//	dataList, err := dealData(indexInfoList)
+//	if err != nil {
+//		return nil, err
+//	}
+//	utils.FileLog.Info("UpstreamSupplyOilQualityApiProcessor dataList: %v", dataList)
+//
+//	return dataList, err
+//}
+//
+//// OilMarketCubeUpstreamSupplyOilQualitySulphurProcessor
+//// @Description: OilMarketCubeUpstreamSupplyOilQualitySulphurProcessor处理器
+//type OilMarketCubeUpstreamSupplyOilQualitySulphurProcessor struct{}
+//
+//var rzdSulphurFlag string
+//
+//func (p *OilMarketCubeUpstreamSupplyOilQualitySulphurProcessor) Process(tableName string, sheetName string, rowIndex int, rowData []string) ([]models.BaseFromRzdData, error) {
+//	utils.FileLog.Info("Processing OilMarketCubeUpstreamSupplyOilQualitySulphurProcessor...")
+//	if rowIndex <= 1 {
+//		return nil, nil
+//	}
+//
+//	if rowData[0] != "" {
+//		rzdSulphurFlag = rowData[0]
+//	} else {
+//		rowData[0] = rzdSulphurFlag
+//	}
+//
+//	frequency := "月度"
+//	unit := "%wt"
+//	indexNameColSuffix := "Oil Quality"
+//	//indexNameColPrefix := "CountryRevisionGroup"
+//
+//	if !utils.IsNumeric(rowData[0]) {
+//		return nil, nil
+//	}
+//	if rowData[1] == "Sum" {
+//		return nil, nil
+//	}
+//
+//	// step_1: 分类
+//	classifyId, err := dealClassify("Oil Market Cube", "Upstream Supply")
+//	if err != nil {
+//		return nil, err
+//	}
+//	utils.FileLog.Info("classifyId: %v", classifyId)
+//
+//	// step_2: 指标
+//	// 指标名称
+//	indexName := "Upstream Supply" + "/" + indexNameColSuffix + "/" + "Sulphur"
+//
+//	// 生成指标编码
+//	indexCode, err := getIndexId("Upstream Supply "+indexNameColSuffix, strings.ToLower("Sulphur"), "")
+//
+//	var indexInfoList []*models.IndexInfo
+//	value, err := strconv.ParseFloat(rowData[len(rowData)-1], 64)
+//	if err != nil {
+//		return nil, err
+//	}
+//
+//	dataTime := rowData[0]
+//	format, err := utils.ConvertDateFormat6(dataTime + "-" + rowData[1])
+//	if err != nil {
+//		return nil, err
+//	}
+//
+//	indexInfoList = append(indexInfoList, &models.IndexInfo{
+//		IndexName: indexName,
+//		IndexCode: indexCode,
+//		Value:     value,
+//		DataTime:  format,
+//	})
+//
+//	indexInfoList, err = dealIndex(indexInfoList, frequency, unit, classifyId)
+//	if err != nil {
+//		return nil, err
+//	}
+//	utils.FileLog.Info("OilMarketCubeUpstreamSupplyOilQualitySulphurProcessor indexInfoList: %v", indexInfoList)
+//
+//	// step_3: 指标数据
+//	dataList, err := dealData(indexInfoList)
+//	if err != nil {
+//		return nil, err
+//	}
+//	utils.FileLog.Info("OilMarketCubeUpstreamSupplyOilQualitySulphurProcessor dataList: %v", dataList)
+//
+//	return dataList, err
+//}
+//
+//// OilMarketCubeUpstreamSupplyCapacityCapacityProcessor
+//// @Description: OilMarketCubeUpstreamSupplyCapacityCapacityProcessor处理器
+//type OilMarketCubeUpstreamSupplyCapacityCapacityProcessor struct{}
+//
+//var rzdCapacityFlag string
+//
+//func (p *OilMarketCubeUpstreamSupplyCapacityCapacityProcessor) Process(tableName string, sheetName string, rowIndex int, rowData []string) ([]models.BaseFromRzdData, error) {
+//	utils.FileLog.Info("Processing OilMarketCubeUpstreamSupplyCapacityCapacityProcessor...")
+//	if rowIndex <= 1 {
+//		return nil, nil
+//	}
+//
+//	if rowData[0] != "" {
+//		rzdCapacityFlag = rowData[0]
+//	} else {
+//		rowData[0] = rzdCapacityFlag
+//	}
+//
+//	frequency := "月度"
+//	unit := "kbbl/d"
+//	indexNameColSuffix := "Capacity"
+//	//indexNameColPrefix := "CountryRevisionGroup"
+//
+//	if !utils.IsNumeric(rowData[0]) {
+//		return nil, nil
+//	}
+//	if rowData[1] == "Sum" {
+//		return nil, nil
+//	}
+//
+//	// step_1: 分类
+//	classifyId, err := dealClassify("Oil Market Cube", "Upstream Supply")
+//	if err != nil {
+//		return nil, err
+//	}
+//	utils.FileLog.Info("classifyId: %v", classifyId)
+//
+//	// step_2: 指标
+//	// 指标名称
+//	indexName := "Upstream Supply" + "/" + indexNameColSuffix
+//
+//	// 生成指标编码
+//	indexCode, err := getIndexId("Upstream Supply ", strings.ReplaceAll(strings.ToLower(indexNameColSuffix), " ", ""), "")
+//
+//	var indexInfoList []*models.IndexInfo
+//	value, err := strconv.ParseFloat(rowData[len(rowData)-1], 64)
+//	if err != nil {
+//		return nil, err
+//	}
+//
+//	dataTime := rowData[0]
+//	format, err := utils.ConvertDateFormat6(dataTime + "-" + rowData[1])
+//	if err != nil {
+//		return nil, err
+//	}
+//
+//	indexInfoList = append(indexInfoList, &models.IndexInfo{
+//		IndexName: indexName,
+//		IndexCode: indexCode,
+//		Value:     value,
+//		DataTime:  format,
+//	})
+//
+//	indexInfoList, err = dealIndex(indexInfoList, frequency, unit, classifyId)
+//	if err != nil {
+//		return nil, err
+//	}
+//	utils.FileLog.Info("OilMarketCubeUpstreamSupplyCapacityCapacityProcessor indexInfoList: %v", indexInfoList)
+//
+//	// step_3: 指标数据
+//	dataList, err := dealData(indexInfoList)
+//	if err != nil {
+//		return nil, err
+//	}
+//	utils.FileLog.Info("OilMarketCubeUpstreamSupplyCapacityCapacityProcessor dataList: %v", dataList)
+//
+//	return dataList, err
+//}
+//
+//// OilMarketCubeUpstreamSupplyProductionProcessor
+//// @Description: OilMarketCubeUpstreamSupplyProductionProcessor处理器
+//type OilMarketCubeUpstreamSupplyProductionProcessor struct{}
+//
+//var rzdProductionFlag string
+//
+//func (p *OilMarketCubeUpstreamSupplyProductionProcessor) Process(tableName string, sheetName string, rowIndex int, rowData []string) ([]models.BaseFromRzdData, error) {
+//	utils.FileLog.Info("Processing OilMarketCubeUpstreamSupplyProductionProcessor...")
+//	if rowIndex <= 1 {
+//		return nil, nil
+//	}
+//
+//	if rowData[0] != "" {
+//		rzdProductionFlag = rowData[0]
+//	} else {
+//		rowData[0] = rzdProductionFlag
+//	}
+//
+//	frequency := "月度"
+//	unit := "kbbl/d"
+//	indexNameColSuffix := "Production"
+//	//indexNameColPrefix := "CountryRevisionGroup"
+//
+//	if !utils.IsNumeric(rowData[0]) {
+//		return nil, nil
+//	}
+//	if rowData[1] == "Sum" {
+//		return nil, nil
+//	}
+//
+//	// step_1: 分类
+//	classifyId, err := dealClassify("Oil Market Cube", "Upstream Supply")
+//	if err != nil {
+//		return nil, err
+//	}
+//	utils.FileLog.Info("classifyId: %v", classifyId)
+//
+//	// step_2: 指标
+//	// 指标名称
+//	indexName := "Upstream Supply" + "/" + indexNameColSuffix
+//
+//	// 生成指标编码
+//	indexCode, err := getIndexId("Upstream Supply", strings.ReplaceAll(strings.ToLower(indexNameColSuffix), " ", ""), "")
+//
+//	var indexInfoList []*models.IndexInfo
+//	value, err := strconv.ParseFloat(rowData[len(rowData)-1], 64)
+//	if err != nil {
+//		return nil, err
+//	}
+//
+//	dataTime := rowData[0]
+//	format, err := utils.ConvertDateFormat6(dataTime + "-" + rowData[1])
+//	if err != nil {
+//		return nil, err
+//	}
+//
+//	indexInfoList = append(indexInfoList, &models.IndexInfo{
+//		IndexName: indexName,
+//		IndexCode: indexCode,
+//		Value:     value,
+//		DataTime:  format,
+//	})
+//
+//	indexInfoList, err = dealIndex(indexInfoList, frequency, unit, classifyId)
+//	if err != nil {
+//		return nil, err
+//	}
+//	utils.FileLog.Info("OilMarketCubeUpstreamSupplyProductionProcessor indexInfoList: %v", indexInfoList)
+//
+//	// step_3: 指标数据
+//	dataList, err := dealData(indexInfoList)
+//	if err != nil {
+//		return nil, err
+//	}
+//	utils.FileLog.Info("OilMarketCubeUpstreamSupplyProductionProcessor dataList: %v", dataList)
+//
+//	return dataList, err
+//}
+//
+//// UpstreamSupplyProductionWoSeasonalityProcessor
+//// @Description: UpstreamSupplyProductionWoSeasonalityProcessor处理器
+//type UpstreamSupplyProductionWoSeasonalityProcessor struct{}
+//
+//var rzdProductionWoSeasonalityFlag string
+//
+//func (p *UpstreamSupplyProductionWoSeasonalityProcessor) Process(tableName string, sheetName string, rowIndex int, rowData []string) ([]models.BaseFromRzdData, error) {
+//	utils.FileLog.Info("Processing UpstreamSupplyProductionWoSeasonalityProcessor...")
+//	if rowIndex <= 1 {
+//		return nil, nil
+//	}
+//
+//	if rowData[0] != "" {
+//		rzdProductionWoSeasonalityFlag = rowData[0]
+//	} else {
+//		rowData[0] = rzdProductionWoSeasonalityFlag
+//	}
+//
+//	frequency := "月度"
+//	unit := "kbbl/d"
+//	indexNameColSuffix := "Production Wo Seasonality"
+//	//indexNameColPrefix := "CountryRevisionGroup"
+//
+//	if !utils.IsNumeric(rowData[0]) {
+//		return nil, nil
+//	}
+//	if rowData[1] == "Sum" {
+//		return nil, nil
+//	}
+//
+//	// step_1: 分类
+//	classifyId, err := dealClassify("Oil Market Cube", "Upstream Supply")
+//	if err != nil {
+//		return nil, err
+//	}
+//	utils.FileLog.Info("classifyId: %v", classifyId)
+//
+//	// step_2: 指标
+//	// 指标名称
+//	indexName := "Upstream Supply" + "/" + indexNameColSuffix
+//
+//	// 生成指标编码
+//	indexCode, err := getIndexId("Upstream Supply", strings.ReplaceAll(strings.ToLower(indexNameColSuffix), " ", ""), "")
+//
+//	var indexInfoList []*models.IndexInfo
+//	value, err := strconv.ParseFloat(rowData[len(rowData)-1], 64)
+//	if err != nil {
+//		return nil, err
+//	}
+//
+//	dataTime := rowData[0]
+//	format, err := utils.ConvertDateFormat6(dataTime + "-" + rowData[1])
+//	if err != nil {
+//		return nil, err
+//	}
+//
+//	indexInfoList = append(indexInfoList, &models.IndexInfo{
+//		IndexName: indexName,
+//		IndexCode: indexCode,
+//		Value:     value,
+//		DataTime:  format,
+//	})
+//
+//	indexInfoList, err = dealIndex(indexInfoList, frequency, unit, classifyId)
+//	if err != nil {
+//		return nil, err
+//	}
+//	utils.FileLog.Info("UpstreamSupplyProductionWoSeasonalityProcessor indexInfoList: %v", indexInfoList)
+//
+//	// step_3: 指标数据
+//	dataList, err := dealData(indexInfoList)
+//	if err != nil {
+//		return nil, err
+//	}
+//	utils.FileLog.Info("UpstreamSupplyProductionWoSeasonalityProcessor dataList: %v", dataList)
+//
+//	return dataList, err
+//}
+//
+//// UpstreamSupplyOPECPolicyReferenceProductionProcessor
+//// @Description: UpstreamSupplyOPECPolicyReferenceProductionProcessor处理器
+//type UpstreamSupplyOPECPolicyReferenceProductionProcessor struct{}
+//
+//var rzdReferenceProductionFlag string
+//
+//func (p *UpstreamSupplyOPECPolicyReferenceProductionProcessor) Process(tableName string, sheetName string, rowIndex int, rowData []string) ([]models.BaseFromRzdData, error) {
+//	utils.FileLog.Info("Processing UpstreamSupplyOPECPolicyReferenceProductionProcessor...")
+//	if rowIndex <= 1 {
+//		return nil, nil
+//	}
+//
+//	if rowData[0] != "" {
+//		rzdReferenceProductionFlag = rowData[0]
+//	} else {
+//		rowData[0] = rzdReferenceProductionFlag
+//	}
+//
+//	frequency := "月度"
+//	unit := "kbbl/d"
+//	indexNameColPrefix := "OPEC_Policy"
+//	indexNameColSuffix := "Reference Production"
+//
+//	if !utils.IsNumeric(rowData[0]) {
+//		return nil, nil
+//	}
+//	if rowData[1] == "Sum" {
+//		return nil, nil
+//	}
+//
+//	// step_1: 分类
+//	classifyId, err := dealClassify("Oil Market Cube", "Upstream Supply")
+//	if err != nil {
+//		return nil, err
+//	}
+//	utils.FileLog.Info("classifyId: %v", classifyId)
+//
+//	// step_2: 指标
+//	// 指标名称
+//	indexName := "Upstream Supply" + "/" + indexNameColPrefix + "/" + indexNameColSuffix
+//
+//	// 生成指标编码
+//	indexCode, err := getIndexId("Upstream Supply "+indexNameColPrefix, strings.ReplaceAll(strings.ToLower(indexNameColSuffix), " ", ""), "")
+//
+//	var indexInfoList []*models.IndexInfo
+//	value, err := strconv.ParseFloat(rowData[len(rowData)-1], 64)
+//	if err != nil {
+//		return nil, err
+//	}
+//
+//	dataTime := rowData[0]
+//	format, err := utils.ConvertDateFormat6(dataTime + "-" + rowData[1])
+//	if err != nil {
+//		return nil, err
+//	}
+//
+//	indexInfoList = append(indexInfoList, &models.IndexInfo{
+//		IndexName: indexName,
+//		IndexCode: indexCode,
+//		Value:     value,
+//		DataTime:  format,
+//	})
+//
+//	indexInfoList, err = dealIndex(indexInfoList, frequency, unit, classifyId)
+//	if err != nil {
+//		return nil, err
+//	}
+//	utils.FileLog.Info("UpstreamSupplyOPECPolicyReferenceProductionProcessor indexInfoList: %v", indexInfoList)
+//
+//	// step_3: 指标数据
+//	dataList, err := dealData(indexInfoList)
+//	if err != nil {
+//		return nil, err
+//	}
+//	utils.FileLog.Info("UpstreamSupplyOPECPolicyReferenceProductionProcessor dataList: %v", dataList)
+//
+//	return dataList, err
+//}
+//
+//// UpstreamSupplyOPECPolicyTargetProductionProcessor
+//// @Description: UpstreamSupplyOPECPolicyTargetProductionProcessor处理器
+//type UpstreamSupplyOPECPolicyTargetProductionProcessor struct{}
+//
+//var rzdTargetProductionFlag string
+//
+//func (p *UpstreamSupplyOPECPolicyTargetProductionProcessor) Process(tableName string, sheetName string, rowIndex int, rowData []string) ([]models.BaseFromRzdData, error) {
+//	utils.FileLog.Info("Processing UpstreamSupplyOPECPolicyTargetProductionProcessor...")
+//	if rowIndex <= 1 {
+//		return nil, nil
+//	}
+//
+//	if rowData[0] != "" {
+//		rzdTargetProductionFlag = rowData[0]
+//	} else {
+//		rowData[0] = rzdTargetProductionFlag
+//	}
+//
+//	frequency := "月度"
+//	unit := "kbbl/d"
+//	indexNameColPrefix := "OPEC_Policy"
+//	indexNameColSuffix := "Target Production"
+//
+//	if !utils.IsNumeric(rowData[0]) {
+//		return nil, nil
+//	}
+//	if rowData[1] == "Sum" {
+//		return nil, nil
+//	}
+//
+//	// step_1: 分类
+//	classifyId, err := dealClassify("Oil Market Cube", "Upstream Supply")
+//	if err != nil {
+//		return nil, err
+//	}
+//	utils.FileLog.Info("classifyId: %v", classifyId)
+//
+//	// step_2: 指标
+//	// 指标名称
+//	indexName := "Upstream Supply" + "/" + indexNameColPrefix + "/" + indexNameColSuffix
+//
+//	// 生成指标编码
+//	indexCode, err := getIndexId("Upstream Supply "+indexNameColPrefix, strings.ReplaceAll(strings.ToLower(indexNameColSuffix), " ", ""), "")
+//
+//	var indexInfoList []*models.IndexInfo
+//	value, err := strconv.ParseFloat(rowData[len(rowData)-1], 64)
+//	if err != nil {
+//		return nil, err
+//	}
+//
+//	dataTime := rowData[0]
+//	format, err := utils.ConvertDateFormat6(dataTime + "-" + rowData[1])
+//	if err != nil {
+//		return nil, err
+//	}
+//
+//	indexInfoList = append(indexInfoList, &models.IndexInfo{
+//		IndexName: indexName,
+//		IndexCode: indexCode,
+//		Value:     value,
+//		DataTime:  format,
+//	})
+//
+//	indexInfoList, err = dealIndex(indexInfoList, frequency, unit, classifyId)
+//	if err != nil {
+//		return nil, err
+//	}
+//	utils.FileLog.Info("UpstreamSupplyOPECPolicyTargetProductionProcessor indexInfoList: %v", indexInfoList)
+//
+//	// step_3: 指标数据
+//	dataList, err := dealData(indexInfoList)
+//	if err != nil {
+//		return nil, err
+//	}
+//	utils.FileLog.Info("UpstreamSupplyOPECPolicyTargetProductionProcessor dataList: %v", dataList)
+//
+//	return dataList, err
+//}
+//
+//// UpstreamSupplyOPECPolicyTargetCutProcessor
+//// @Description: UpstreamSupplyOPECPolicyTargetCutProcessor处理器
+//type UpstreamSupplyOPECPolicyTargetCutProcessor struct{}
+//
+//var rzdTargetCutFlag string
+//
+//func (p *UpstreamSupplyOPECPolicyTargetCutProcessor) Process(tableName string, sheetName string, rowIndex int, rowData []string) ([]models.BaseFromRzdData, error) {
+//	utils.FileLog.Info("Processing UpstreamSupplyOPECPolicyTargetCutProcessor...")
+//	if rowIndex <= 1 {
+//		return nil, nil
+//	}
+//
+//	if rowData[0] != "" {
+//		rzdTargetCutFlag = rowData[0]
+//	} else {
+//		rowData[0] = rzdTargetCutFlag
+//	}
+//
+//	frequency := "月度"
+//	unit := "kbbl/d"
+//	indexNameColPrefix := "OPEC_Policy"
+//	indexNameColSuffix := "Target Cut"
+//
+//	if !utils.IsNumeric(rowData[0]) {
+//		return nil, nil
+//	}
+//	if rowData[1] == "Sum" {
+//		return nil, nil
+//	}
+//
+//	// step_1: 分类
+//	classifyId, err := dealClassify("Oil Market Cube", "Upstream Supply")
+//	if err != nil {
+//		return nil, err
+//	}
+//	utils.FileLog.Info("classifyId: %v", classifyId)
+//
+//	// step_2: 指标
+//	// 指标名称
+//	indexName := "Upstream Supply" + "/" + indexNameColPrefix + "/" + indexNameColSuffix
+//
+//	// 生成指标编码
+//	indexCode, err := getIndexId("Upstream Supply "+indexNameColPrefix, strings.ReplaceAll(strings.ToLower(indexNameColSuffix), " ", ""), "")
+//
+//	var indexInfoList []*models.IndexInfo
+//	value, err := strconv.ParseFloat(rowData[len(rowData)-1], 64)
+//	if err != nil {
+//		return nil, err
+//	}
+//
+//	dataTime := rowData[0]
+//	format, err := utils.ConvertDateFormat6(dataTime + "-" + rowData[1])
+//	if err != nil {
+//		return nil, err
+//	}
+//
+//	indexInfoList = append(indexInfoList, &models.IndexInfo{
+//		IndexName: indexName,
+//		IndexCode: indexCode,
+//		Value:     value,
+//		DataTime:  format,
+//	})
+//
+//	indexInfoList, err = dealIndex(indexInfoList, frequency, unit, classifyId)
+//	if err != nil {
+//		return nil, err
+//	}
+//	utils.FileLog.Info("UpstreamSupplyOPECPolicyTargetCutProcessor indexInfoList: %v", indexInfoList)
+//
+//	// step_3: 指标数据
+//	dataList, err := dealData(indexInfoList)
+//	if err != nil {
+//		return nil, err
+//	}
+//	utils.FileLog.Info("UpstreamSupplyOPECPolicyTargetCutProcessor dataList: %v", dataList)
+//
+//	return dataList, err
+//}
+//
+//// UpstreamSupplyOPECPolicyActualCutProcessor
+//// @Description: UpstreamSupplyOPECPolicyActualCutProcessor处理器
+//type UpstreamSupplyOPECPolicyActualCutProcessor struct{}
+//
+//var rzdActualCutFlag string
+//
+//func (p *UpstreamSupplyOPECPolicyActualCutProcessor) Process(tableName string, sheetName string, rowIndex int, rowData []string) ([]models.BaseFromRzdData, error) {
+//	utils.FileLog.Info("Processing UpstreamSupplyOPECPolicyActualCutProcessor...")
+//	if rowIndex <= 1 {
+//		return nil, nil
+//	}
+//
+//	if rowData[0] != "" {
+//		rzdActualCutFlag = rowData[0]
+//	} else {
+//		rowData[0] = rzdActualCutFlag
+//	}
+//
+//	frequency := "月度"
+//	unit := "kbbl/d"
+//	indexNameColPrefix := "OPEC_Policy"
+//	indexNameColSuffix := "Actual Cut"
+//
+//	if !utils.IsNumeric(rowData[0]) {
+//		return nil, nil
+//	}
+//	if rowData[1] == "Sum" {
+//		return nil, nil
+//	}
+//
+//	// step_1: 分类
+//	classifyId, err := dealClassify("Oil Market Cube", "Upstream Supply")
+//	if err != nil {
+//		return nil, err
+//	}
+//	utils.FileLog.Info("classifyId: %v", classifyId)
+//
+//	// step_2: 指标
+//	// 指标名称
+//	indexName := "Upstream Supply" + "/" + indexNameColPrefix + "/" + indexNameColSuffix
+//
+//	// 生成指标编码
+//	indexCode, err := getIndexId("Upstream Supply "+indexNameColPrefix, strings.ReplaceAll(strings.ToLower(indexNameColSuffix), " ", ""), "")
+//
+//	var indexInfoList []*models.IndexInfo
+//	value, err := strconv.ParseFloat(rowData[len(rowData)-1], 64)
+//	if err != nil {
+//		return nil, err
+//	}
+//
+//	dataTime := rowData[0]
+//	format, err := utils.ConvertDateFormat6(dataTime + "-" + rowData[1])
+//	if err != nil {
+//		return nil, err
+//	}
+//
+//	indexInfoList = append(indexInfoList, &models.IndexInfo{
+//		IndexName: indexName,
+//		IndexCode: indexCode,
+//		Value:     value,
+//		DataTime:  format,
+//	})
+//
+//	indexInfoList, err = dealIndex(indexInfoList, frequency, unit, classifyId)
+//	if err != nil {
+//		return nil, err
+//	}
+//	utils.FileLog.Info("UpstreamSupplyOPECPolicyActualCutProcessor indexInfoList: %v", indexInfoList)
+//
+//	// step_3: 指标数据
+//	dataList, err := dealData(indexInfoList)
+//	if err != nil {
+//		return nil, err
+//	}
+//	utils.FileLog.Info("UpstreamSupplyOPECPolicyActualCutProcessor dataList: %v", dataList)
+//
+//	return dataList, err
+//}
+//
+//// UpstreamSupplyOPECPolicyComplianceProcessor
+//// @Description: UpstreamSupplyOPECPolicyComplianceProcessor处理器
+//type UpstreamSupplyOPECPolicyComplianceProcessor struct{}
+//
+//var rzdComplianceFlag string
+//
+//func (p *UpstreamSupplyOPECPolicyComplianceProcessor) Process(tableName string, sheetName string, rowIndex int, rowData []string) ([]models.BaseFromRzdData, error) {
+//	utils.FileLog.Info("Processing UpstreamSupplyOPECPolicyComplianceProcessor...")
+//	if rowIndex <= 1 {
+//		return nil, nil
+//	}
+//
+//	if rowData[0] != "" {
+//		rzdComplianceFlag = rowData[0]
+//	} else {
+//		rowData[0] = rzdComplianceFlag
+//	}
+//
+//	frequency := "月度"
+//	unit := "kbbl/d"
+//	indexNameColPrefix := "OPEC_Policy"
+//	indexNameColSuffix := "Compliance"
+//
+//	if !utils.IsNumeric(rowData[0]) {
+//		return nil, nil
+//	}
+//	if rowData[1] == "Sum" {
+//		return nil, nil
+//	}
+//
+//	// step_1: 分类
+//	classifyId, err := dealClassify("Oil Market Cube", "Upstream Supply")
+//	if err != nil {
+//		return nil, err
+//	}
+//	utils.FileLog.Info("classifyId: %v", classifyId)
+//
+//	// step_2: 指标
+//	// 指标名称
+//	indexName := "Upstream Supply" + "/" + indexNameColPrefix + "/" + indexNameColSuffix
+//
+//	// 生成指标编码
+//	indexCode, err := getIndexId("Upstream Supply "+indexNameColPrefix, strings.ReplaceAll(strings.ToLower(indexNameColSuffix), " ", ""), "")
+//
+//	var indexInfoList []*models.IndexInfo
+//	value, err := strconv.ParseFloat(rowData[len(rowData)-1], 64)
+//	if err != nil {
+//		return nil, err
+//	}
+//
+//	dataTime := rowData[0]
+//	format, err := utils.ConvertDateFormat6(dataTime + "-" + rowData[1])
+//	if err != nil {
+//		return nil, err
+//	}
+//
+//	indexInfoList = append(indexInfoList, &models.IndexInfo{
+//		IndexName: indexName,
+//		IndexCode: indexCode,
+//		Value:     value,
+//		DataTime:  format,
+//	})
+//
+//	indexInfoList, err = dealIndex(indexInfoList, frequency, unit, classifyId)
+//	if err != nil {
+//		return nil, err
+//	}
+//	utils.FileLog.Info("UpstreamSupplyOPECPolicyComplianceProcessor indexInfoList: %v", indexInfoList)
+//
+//	// step_3: 指标数据
+//	dataList, err := dealData(indexInfoList)
+//	if err != nil {
+//		return nil, err
+//	}
+//	utils.FileLog.Info("UpstreamSupplyOPECPolicyComplianceProcessor dataList: %v", dataList)
+//
+//	return dataList, err
+//}
+//
+//// UpstreamSupplyOPECPolicyProductionSubjectToCutProcessor
+//// @Description: UpstreamSupplyOPECPolicyProductionSubjectToCutProcessor处理器
+//type UpstreamSupplyOPECPolicyProductionSubjectToCutProcessor struct{}
+//
+//var rzdProductionSubjectToCutFlag string
+//
+//func (p *UpstreamSupplyOPECPolicyProductionSubjectToCutProcessor) Process(tableName string, sheetName string, rowIndex int, rowData []string) ([]models.BaseFromRzdData, error) {
+//	utils.FileLog.Info("Processing UpstreamSupplyOPECPolicyProductionSubjectToCutProcessor...")
+//	if rowIndex <= 1 {
+//		return nil, nil
+//	}
+//
+//	if rowData[0] != "" {
+//		rzdProductionSubjectToCutFlag = rowData[0]
+//	} else {
+//		rowData[0] = rzdProductionSubjectToCutFlag
+//	}
+//
+//	frequency := "月度"
+//	unit := "kbbl/d"
+//	indexNameColPrefix := "OPEC_Policy"
+//	indexNameColSuffix := "Production Subject To Cut"
+//
+//	if !utils.IsNumeric(rowData[0]) {
+//		return nil, nil
+//	}
+//	if rowData[1] == "Sum" {
+//		return nil, nil
+//	}
+//
+//	// step_1: 分类
+//	classifyId, err := dealClassify("Oil Market Cube", "Upstream Supply")
+//	if err != nil {
+//		return nil, err
+//	}
+//	utils.FileLog.Info("classifyId: %v", classifyId)
+//
+//	// step_2: 指标
+//	// 指标名称
+//	indexName := "Upstream Supply" + "/" + indexNameColPrefix + "/" + indexNameColSuffix
+//
+//	// 生成指标编码
+//	indexCode, err := getIndexId("Upstream Supply "+indexNameColPrefix, strings.ReplaceAll(strings.ToLower(indexNameColSuffix), " ", ""), "")
+//
+//	var indexInfoList []*models.IndexInfo
+//	value, err := strconv.ParseFloat(rowData[len(rowData)-1], 64)
+//	if err != nil {
+//		return nil, err
+//	}
+//
+//	dataTime := rowData[0]
+//	format, err := utils.ConvertDateFormat6(dataTime + "-" + rowData[1])
+//	if err != nil {
+//		return nil, err
+//	}
+//
+//	indexInfoList = append(indexInfoList, &models.IndexInfo{
+//		IndexName: indexName,
+//		IndexCode: indexCode,
+//		Value:     value,
+//		DataTime:  format,
+//	})
+//
+//	indexInfoList, err = dealIndex(indexInfoList, frequency, unit, classifyId)
+//	if err != nil {
+//		return nil, err
+//	}
+//	utils.FileLog.Info("UpstreamSupplyOPECPolicyProductionSubjectToCutProcessor indexInfoList: %v", indexInfoList)
+//
+//	// step_3: 指标数据
+//	dataList, err := dealData(indexInfoList)
+//	if err != nil {
+//		return nil, err
+//	}
+//	utils.FileLog.Info("UpstreamSupplyOPECPolicyProductionSubjectToCutProcessor dataList: %v", dataList)
+//
+//	return dataList, err
+//}
+//
+//// ProductsDemandProductsDemandMeanProcessor
+//// @Description: ProductsDemandProductsDemandMeanProcessor处理器
+//type ProductsDemandProductsDemandMeanProcessor struct{}
+//
+//var rzdProductsDemandMeanFlag string
+//
+//func (p *ProductsDemandProductsDemandMeanProcessor) Process(tableName string, sheetName string, rowIndex int, rowData []string) ([]models.BaseFromRzdData, error) {
+//	utils.FileLog.Info("Processing ProductsDemandProductsDemandMeanProcessor...")
+//	if rowIndex <= 1 {
+//		return nil, nil
+//	}
+//
+//	if rowData[0] != "" {
+//		rzdProductsDemandMeanFlag = rowData[0]
+//	} else {
+//		rowData[0] = rzdProductsDemandMeanFlag
+//	}
+//
+//	frequency := "月度"
+//	unit := "kbbl/d"
+//	//indexNameColPrefix := "OPEC_Policy"
+//	indexNameColSuffix := "Products Demand Mean (1.0 DG) "
+//
+//	if !utils.IsNumeric(rowData[0]) {
+//		return nil, nil
+//	}
+//	if rowData[1] == "Sum" {
+//		return nil, nil
+//	}
+//
+//	// step_1: 分类
+//	classifyId, err := dealClassify("Oil Market Cube", "Products Demand")
+//	if err != nil {
+//		return nil, err
+//	}
+//	utils.FileLog.Info("classifyId: %v", classifyId)
+//
+//	// step_2: 指标
+//	// 指标名称
+//	indexName := "Products Demand" + "/" + indexNameColSuffix
+//
+//	// 生成指标编码
+//	indexCode, err := getIndexId("Products Demand "+"Products Demand Mean", strings.ReplaceAll(strings.ToLower("1.0dg"), " ", ""), "")
+//
+//	var indexInfoList []*models.IndexInfo
+//	value, err := strconv.ParseFloat(rowData[len(rowData)-1], 64)
+//	if err != nil {
+//		return nil, err
+//	}
+//
+//	dataTime := rowData[0]
+//	format, err := utils.ConvertDateFormat6(dataTime + "-" + rowData[1])
+//	if err != nil {
+//		return nil, err
+//	}
+//
+//	indexInfoList = append(indexInfoList, &models.IndexInfo{
+//		IndexName: indexName,
+//		IndexCode: indexCode,
+//		Value:     value,
+//		DataTime:  format,
+//	})
+//
+//	indexInfoList, err = dealIndex(indexInfoList, frequency, unit, classifyId)
+//	if err != nil {
+//		return nil, err
+//	}
+//	utils.FileLog.Info("ProductsDemandProductsDemandMeanProcessor indexInfoList: %v", indexInfoList)
+//
+//	// step_3: 指标数据
+//	dataList, err := dealData(indexInfoList)
+//	if err != nil {
+//		return nil, err
+//	}
+//	utils.FileLog.Info("ProductsDemandProductsDemandMeanProcessor dataList: %v", dataList)
+//
+//	return dataList, err
+//}
+//
+//// ProductsDemandProductsDemandAddSigmaProcessor
+//// @Description: ProductsDemandProductsDemandAddSigmaProcessor处理器
+//type ProductsDemandProductsDemandAddSigmaProcessor struct{}
+//
+//var rzdAddSigmaFlag string
+//
+//func (p *ProductsDemandProductsDemandAddSigmaProcessor) Process(tableName string, sheetName string, rowIndex int, rowData []string) ([]models.BaseFromRzdData, error) {
+//	utils.FileLog.Info("Processing ProductsDemandProductsDemandAddSigmaProcessor...")
+//	if rowIndex <= 1 {
+//		return nil, nil
+//	}
+//
+//	if rowData[0] != "" {
+//		rzdAddSigmaFlag = rowData[0]
+//	} else {
+//		rowData[0] = rzdAddSigmaFlag
+//	}
+//
+//	frequency := "月度"
+//	unit := "kbbl/d"
+//	//indexNameColPrefix := "OPEC_Policy"
+//	indexNameColSuffix := "Products Demand +Sigma (2.2 DG) "
+//
+//	if !utils.IsNumeric(rowData[0]) {
+//		return nil, nil
+//	}
+//	if rowData[1] == "Sum" {
+//		return nil, nil
+//	}
+//
+//	// step_1: 分类
+//	classifyId, err := dealClassify("Oil Market Cube", "Products Demand")
+//	if err != nil {
+//		return nil, err
+//	}
+//	utils.FileLog.Info("classifyId: %v", classifyId)
+//
+//	// step_2: 指标
+//	// 指标名称
+//	indexName := "Products Demand" + "/" + indexNameColSuffix
+//
+//	// 生成指标编码
+//	indexCode, err := getIndexId("Products Demand "+"Products Demand Sigma", strings.ReplaceAll(strings.ToLower("2.2dg"), " ", ""), "")
+//
+//	var indexInfoList []*models.IndexInfo
+//	value, err := strconv.ParseFloat(rowData[len(rowData)-1], 64)
+//	if err != nil {
+//		return nil, err
+//	}
+//
+//	dataTime := rowData[0]
+//	format, err := utils.ConvertDateFormat6(dataTime + "-" + rowData[1])
+//	if err != nil {
+//		return nil, err
+//	}
+//
+//	indexInfoList = append(indexInfoList, &models.IndexInfo{
+//		IndexName: indexName,
+//		IndexCode: indexCode,
+//		Value:     value,
+//		DataTime:  format,
+//	})
+//
+//	indexInfoList, err = dealIndex(indexInfoList, frequency, unit, classifyId)
+//	if err != nil {
+//		return nil, err
+//	}
+//	utils.FileLog.Info("ProductsDemandProductsDemandAddSigmaProcessor indexInfoList: %v", indexInfoList)
+//
+//	// step_3: 指标数据
+//	dataList, err := dealData(indexInfoList)
+//	if err != nil {
+//		return nil, err
+//	}
+//	utils.FileLog.Info("ProductsDemandProductsDemandAddSigmaProcessor dataList: %v", dataList)
+//
+//	return dataList, err
+//}
+//
+//// ProductsDemandProductsDemandSubSigmaProcessor
+//// @Description: ProductsDemandProductsDemandSubSigmaProcessor处理器
+//type ProductsDemandProductsDemandSubSigmaProcessor struct{}
+//
+//var rzdSubSigmaFlag string
+//
+//func (p *ProductsDemandProductsDemandSubSigmaProcessor) Process(tableName string, sheetName string, rowIndex int, rowData []string) ([]models.BaseFromRzdData, error) {
+//	utils.FileLog.Info("Processing ProductsDemandProductsDemandSubSigmaProcessor...")
+//	if rowIndex <= 1 {
+//		return nil, nil
+//	}
+//
+//	if rowData[0] != "" {
+//		rzdSubSigmaFlag = rowData[0]
+//	} else {
+//		rowData[0] = rzdSubSigmaFlag
+//	}
+//
+//	frequency := "月度"
+//	unit := "kbbl/d"
+//	//indexNameColPrefix := "OPEC_Policy"
+//	indexNameColSuffix := "Products Demand -Sigma (1.8 DG) "
+//
+//	if !utils.IsNumeric(rowData[0]) {
+//		return nil, nil
+//	}
+//	if rowData[1] == "Sum" {
+//		return nil, nil
+//	}
+//
+//	// step_1: 分类
+//	classifyId, err := dealClassify("Oil Market Cube", "Products Demand")
+//	if err != nil {
+//		return nil, err
+//	}
+//	utils.FileLog.Info("classifyId: %v", classifyId)
+//
+//	// step_2: 指标
+//	// 指标名称
+//	indexName := "Products Demand" + "/" + indexNameColSuffix
+//
+//	// 生成指标编码
+//	indexCode, err := getIndexId("Products Demand "+"Products Demand Sigma", strings.ReplaceAll(strings.ToLower("1.8dg"), " ", ""), "")
+//
+//	var indexInfoList []*models.IndexInfo
+//	value, err := strconv.ParseFloat(rowData[len(rowData)-1], 64)
+//	if err != nil {
+//		return nil, err
+//	}
+//
+//	dataTime := rowData[0]
+//	format, err := utils.ConvertDateFormat6(dataTime + "-" + rowData[1])
+//	if err != nil {
+//		return nil, err
+//	}
+//
+//	indexInfoList = append(indexInfoList, &models.IndexInfo{
+//		IndexName: indexName,
+//		IndexCode: indexCode,
+//		Value:     value,
+//		DataTime:  format,
+//	})
+//
+//	indexInfoList, err = dealIndex(indexInfoList, frequency, unit, classifyId)
+//	if err != nil {
+//		return nil, err
+//	}
+//	utils.FileLog.Info("ProductsDemandProductsDemandSubSigmaProcessor indexInfoList: %v", indexInfoList)
+//
+//	// step_3: 指标数据
+//	dataList, err := dealData(indexInfoList)
+//	if err != nil {
+//		return nil, err
+//	}
+//	utils.FileLog.Info("ProductsDemandProductsDemandSubSigmaProcessor dataList: %v", dataList)
+//
+//	return dataList, err
+//}
+//
+//// BalancesTotalLiquidsBalancesProcessor
+//// @Description: BalancesTotalLiquidsBalancesProcessor处理器
+//type BalancesTotalLiquidsBalancesProcessor struct{}
+//
+//var rzdTotalLiquidsBalancesFlag string
+//
+//func (p *BalancesTotalLiquidsBalancesProcessor) Process(tableName string, sheetName string, rowIndex int, rowData []string) ([]models.BaseFromRzdData, error) {
+//	utils.FileLog.Info("Processing BalancesTotalLiquidsBalancesProcessor...")
+//	if rowIndex <= 1 {
+//		return nil, nil
+//	}
+//
+//	if rowData[0] != "" {
+//		rzdTotalLiquidsBalancesFlag = rowData[0]
+//	} else {
+//		rowData[0] = rzdTotalLiquidsBalancesFlag
+//	}
+//
+//	frequency := "月度"
+//	unit := "kbbl/d"
+//	//indexNameColPrefix := "OPEC_Policy"
+//	indexNameColSuffix := "Total Liquids Balances"
+//
+//	if !utils.IsNumeric(rowData[0]) {
+//		return nil, nil
+//	}
+//	if rowData[1] == "Sum" {
+//		return nil, nil
+//	}
+//
+//	// step_1: 分类
+//	classifyId, err := dealClassify("Oil Market Cube", "Balances")
+//	if err != nil {
+//		return nil, err
+//	}
+//	utils.FileLog.Info("classifyId: %v", classifyId)
+//
+//	// step_2: 指标
+//	// 指标名称
+//	indexName := "Balances" + "/" + indexNameColSuffix
+//
+//	// 生成指标编码
+//	indexCode, err := getIndexId("Balances", strings.ReplaceAll(strings.ToLower(indexNameColSuffix), " ", ""), "")
+//
+//	var indexInfoList []*models.IndexInfo
+//	value, err := strconv.ParseFloat(rowData[len(rowData)-1], 64)
+//	if err != nil {
+//		return nil, err
+//	}
+//
+//	dataTime := rowData[0]
+//	format, err := utils.ConvertDateFormat6(dataTime + "-" + rowData[1])
+//	if err != nil {
+//		return nil, err
+//	}
+//
+//	indexInfoList = append(indexInfoList, &models.IndexInfo{
+//		IndexName: indexName,
+//		IndexCode: indexCode,
+//		Value:     value,
+//		DataTime:  format,
+//	})
+//
+//	indexInfoList, err = dealIndex(indexInfoList, frequency, unit, classifyId)
+//	if err != nil {
+//		return nil, err
+//	}
+//	utils.FileLog.Info("BalancesTotalLiquidsBalancesProcessor indexInfoList: %v", indexInfoList)
+//
+//	// step_3: 指标数据
+//	dataList, err := dealData(indexInfoList)
+//	if err != nil {
+//		return nil, err
+//	}
+//	utils.FileLog.Info("BalancesTotalLiquidsBalancesProcessor dataList: %v", dataList)
+//
+//	return dataList, err
+//}
+//
+//// GeographyLatitudeProcessor
+//// @Description: GeographyLatitudeProcessor处理器
+//type GeographyLatitudeProcessor struct{}
+//
+//var rzdLatitudeFlag string
+//
+//func (p *GeographyLatitudeProcessor) Process(tableName string, sheetName string, rowIndex int, rowData []string) ([]models.BaseFromRzdData, error) {
+//	utils.FileLog.Info("Processing GeographyLatitudeProcessor...")
+//	if rowIndex <= 1 {
+//		return nil, nil
+//	}
+//
+//	if rowData[0] != "" {
+//		rzdLatitudeFlag = rowData[0]
+//	} else {
+//		rowData[0] = rzdLatitudeFlag
+//	}
+//
+//	frequency := "月度"
+//	unit := ""
+//	//indexNameColPrefix := "OPEC_Policy"
+//	indexNameColSuffix := "Latitude"
+//
+//	if !utils.IsNumeric(rowData[0]) {
+//		return nil, nil
+//	}
+//	if rowData[1] == "Sum" {
+//		return nil, nil
+//	}
+//
+//	// step_1: 分类
+//	classifyId, err := dealClassify("Oil Market Cube", "Geography")
+//	if err != nil {
+//		return nil, err
+//	}
+//	utils.FileLog.Info("classifyId: %v", classifyId)
+//
+//	// step_2: 指标
+//	// 指标名称
+//	indexName := "Geography" + "/" + indexNameColSuffix
+//
+//	// 生成指标编码
+//	indexCode, err := getIndexId("Geography", strings.ReplaceAll(strings.ToLower(indexNameColSuffix), " ", ""), "")
+//
+//	var indexInfoList []*models.IndexInfo
+//	value, err := strconv.ParseFloat(rowData[len(rowData)-1], 64)
+//	if err != nil {
+//		return nil, err
+//	}
+//
+//	dataTime := rowData[0]
+//	format, err := utils.ConvertDateFormat6(dataTime + "-" + rowData[1])
+//	if err != nil {
+//		return nil, err
+//	}
+//
+//	indexInfoList = append(indexInfoList, &models.IndexInfo{
+//		IndexName: indexName,
+//		IndexCode: indexCode,
+//		Value:     value,
+//		DataTime:  format,
+//	})
+//
+//	indexInfoList, err = dealIndex(indexInfoList, frequency, unit, classifyId)
+//	if err != nil {
+//		return nil, err
+//	}
+//	utils.FileLog.Info("GeographyLatitudeProcessor indexInfoList: %v", indexInfoList)
+//
+//	// step_3: 指标数据
+//	dataList, err := dealData(indexInfoList)
+//	if err != nil {
+//		return nil, err
+//	}
+//	utils.FileLog.Info("GeographyLatitudeProcessor dataList: %v", dataList)
+//
+//	return dataList, err
+//}
+//
+//// GeographyLongitudeProcessor
+//// @Description: GeographyLongitudeProcessor处理器
+//type GeographyLongitudeProcessor struct{}
+//
+//var rzdLongitudeFlag string
+//
+//func (p *GeographyLongitudeProcessor) Process(tableName string, sheetName string, rowIndex int, rowData []string) ([]models.BaseFromRzdData, error) {
+//	utils.FileLog.Info("Processing GeographyLongitudeProcessor...")
+//	if rowIndex <= 1 {
+//		return nil, nil
+//	}
+//
+//	if rowData[0] != "" {
+//		rzdLongitudeFlag = rowData[0]
+//	} else {
+//		rowData[0] = rzdLongitudeFlag
+//	}
+//
+//	frequency := "月度"
+//	unit := ""
+//	//indexNameColPrefix := "OPEC_Policy"
+//	indexNameColSuffix := "Longitude"
+//
+//	if !utils.IsNumeric(rowData[0]) {
+//		return nil, nil
+//	}
+//	if rowData[1] == "Sum" {
+//		return nil, nil
+//	}
+//
+//	// step_1: 分类
+//	classifyId, err := dealClassify("Oil Market Cube", "Geography")
+//	if err != nil {
+//		return nil, err
+//	}
+//	utils.FileLog.Info("classifyId: %v", classifyId)
+//
+//	// step_2: 指标
+//	// 指标名称
+//	indexName := "Geography" + "/" + indexNameColSuffix
+//
+//	// 生成指标编码
+//	indexCode, err := getIndexId("Geography", strings.ReplaceAll(strings.ToLower(indexNameColSuffix), " ", ""), "")
+//
+//	var indexInfoList []*models.IndexInfo
+//	value, err := strconv.ParseFloat(rowData[len(rowData)-1], 64)
+//	if err != nil {
+//		return nil, err
+//	}
+//
+//	dataTime := rowData[0]
+//	format, err := utils.ConvertDateFormat6(dataTime + "-" + rowData[1])
+//	if err != nil {
+//		return nil, err
+//	}
+//
+//	indexInfoList = append(indexInfoList, &models.IndexInfo{
+//		IndexName: indexName,
+//		IndexCode: indexCode,
+//		Value:     value,
+//		DataTime:  format,
+//	})
+//
+//	indexInfoList, err = dealIndex(indexInfoList, frequency, unit, classifyId)
+//	if err != nil {
+//		return nil, err
+//	}
+//	utils.FileLog.Info("GeographyLongitudeProcessor indexInfoList: %v", indexInfoList)
+//
+//	// step_3: 指标数据
+//	dataList, err := dealData(indexInfoList)
+//	if err != nil {
+//		return nil, err
+//	}
+//	utils.FileLog.Info("GeographyLongitudeProcessor dataList: %v", dataList)
+//
+//	return dataList, err
+//}

+ 203 - 137
services/ruizide/processor_factory.go

@@ -1,11 +1,47 @@
 package ruizide
 
 import (
+	"encoding/json"
 	"eta/eta_data_analysis/models"
+	"eta/eta_data_analysis/utils"
 	"fmt"
+	"strings"
+	"unicode"
 )
 
+// 定义选择器
 var (
+	tableNameList = []string{
+		"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",
+		"Oil_Market_Cube_Upstream_Supply_Production",
+		"Oil_Market_Cube_Upstream_Supply_Production_Wo_Seasonality",
+		"Oil_Market_Cube_Upstream_Supply_OPEC_Policy_Reference_Production",
+		"Oil_Market_Cube_Upstream_Supply_OPEC_Policy_Target_Production",
+		"Oil_Market_Cube_Upstream_Supply_OPEC_Policy_Target_Cut",
+		"Oil_Market_Cube_Upstream_Supply_OPEC_Policy_Actual_Cut",
+		"Oil_Market_Cube_Upstream_Supply_OPEC_Policy_Compliance",
+		"Oil_Market_Cube_Upstream_Supply_OPEC_Policy_Production_Subject_To_Cut",
+		"Oil_Market_Cube_Products_Demand_Products_Demand_Mean",
+		"Oil_Market_Cube_Products_Demand_Products_Demand+Sigma",
+		"Oil_Market_Cube_Products_Demand_Products_Demand-Sigma",
+		"Oil_Market_Cube_Balances_Total_Liquids_Balances",
+		"Oil_Market_Cube_Geography_Latitude",
+		"Oil_Market_Cube_Geography_Longitude",
+	}
+
 	RzdClassifyMap = make(map[string]*models.BaseFromRzdClassify)
 	classifyMap    = map[string]models.RzdClassifyMapStruct{
 		"Road Index": {
@@ -62,8 +98,24 @@ var (
 		},
 		"Oil Demand Analysis": {
 			ClassifyName: "Oil Demand Analysis",
+			Sort:         3,
+		},
+		"Upstream Supply": {
+			ClassifyName: "Upstream Supply",
+			Sort:         1,
+		},
+		"Products Demand": {
+			ClassifyName: "Products Demand",
 			Sort:         2,
 		},
+		"Balances": {
+			ClassifyName: "Balances",
+			Sort:         3,
+		},
+		"Geography": {
+			ClassifyName: "Geography",
+			Sort:         4,
+		},
 	}
 )
 
@@ -75,144 +127,35 @@ type RzdDataProcessor interface {
 	Process(tableName string) error
 }
 
-func GetProcessor(tableName string, sheetName string) (ReportProcessor, error) {
-
-	//} 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)
-}
-
 var RzdProcessorMap = map[string]RzdDataProcessor{
-	"Oil_Demand_Signals_Weekly_Report":     &OilDemandSignalsWeeklyReportProcessor{},
-	"Supply_Revision_Analysis":             &SupplyRevisionAnalysisProcessor{},
-	"Oil_Supply_Analysis":                  &OilSupplyAnalysisProcessor{},
-	"Oil_Demand_Analysis_Product_Detail":   &OilDemandAnalysisProcessor{},
-	"Oil_Demand_Analysis_Region":           &OilDemandAnalysisProcessor{},
-	"Oil_Demand_Analysis_Scenario":         &OilDemandAnalysisProcessor{},
-	"Oil_Demand_Analysis_Continent":        &OilDemandAnalysisProcessor{},
-	"Oil_Demand_Analysis_Country":          &OilDemandAnalysisProcessor{},
-	"Oil_Demand_Analysis_Product_Category": &OilDemandAnalysisProcessor{},
-	"Oil_Demand_Analysis_Sector_Category":  &OilDemandAnalysisProcessor{},
-	"Oil_Demand_Analysis_Sector_Detail":    &OilDemandAnalysisProcessor{},
+	"Oil_Demand_Signals_Weekly_Report":                                      &OilDemandSignalsWeeklyReportProcessor{},
+	"Supply_Revision_Analysis":                                              &SupplyRevisionAnalysisProcessor{},
+	"Oil_Supply_Analysis":                                                   &OilSupplyAnalysisProcessor{},
+	"Oil_Demand_Analysis_Product_Detail":                                    &OilDemandAnalysisProcessor{},
+	"Oil_Demand_Analysis_Region":                                            &OilDemandAnalysisProcessor{},
+	"Oil_Demand_Analysis_Scenario":                                          &OilDemandAnalysisProcessor{},
+	"Oil_Demand_Analysis_Continent":                                         &OilDemandAnalysisProcessor{},
+	"Oil_Demand_Analysis_Country":                                           &OilDemandAnalysisProcessor{},
+	"Oil_Demand_Analysis_Product_Category":                                  &OilDemandAnalysisProcessor{},
+	"Oil_Demand_Analysis_Sector_Category":                                   &OilDemandAnalysisProcessor{},
+	"Oil_Demand_Analysis_Sector_Detail":                                     &OilDemandAnalysisProcessor{},
+	"Oil_Market_Cube_Upstream_Supply_Oil_Quality_API":                       &OilMarketCubeProcessor{},
+	"Oil_Market_Cube_Upstream_Supply_Oil_Quality_Sulphur":                   &OilMarketCubeProcessor{},
+	"Oil_Market_Cube_Upstream_Supply_Capacity_Capacity":                     &OilMarketCubeProcessor{},
+	"Oil_Market_Cube_Upstream_Supply_Production":                            &OilMarketCubeProcessor{},
+	"Oil_Market_Cube_Upstream_Supply_Production_Wo_Seasonality":             &OilMarketCubeProcessor{},
+	"Oil_Market_Cube_Upstream_Supply_OPEC_Policy_Reference_Production":      &OilMarketCubeProcessor{},
+	"Oil_Market_Cube_Upstream_Supply_OPEC_Policy_Target_Production":         &OilMarketCubeProcessor{},
+	"Oil_Market_Cube_Upstream_Supply_OPEC_Policy_Target_Cut":                &OilMarketCubeProcessor{},
+	"Oil_Market_Cube_Upstream_Supply_OPEC_Policy_Actual_Cut":                &OilMarketCubeProcessor{},
+	"Oil_Market_Cube_Upstream_Supply_OPEC_Policy_Compliance":                &OilMarketCubeProcessor{},
+	"Oil_Market_Cube_Upstream_Supply_OPEC_Policy_Production_Subject_To_Cut": &OilMarketCubeProcessor{},
+	"Oil_Market_Cube_Products_Demand_Products_Demand_Mean":                  &OilMarketCubeProcessor{},
+	"Oil_Market_Cube_Products_Demand_Products_Demand+Sigma":                 &OilMarketCubeProcessor{},
+	"Oil_Market_Cube_Products_Demand_Products_Demand-Sigma":                 &OilMarketCubeProcessor{},
+	"Oil_Market_Cube_Balances_Total_Liquids_Balances":                       &OilMarketCubeProcessor{},
+	"Oil_Market_Cube_Geography_Latitude":                                    &OilMarketCubeProcessor{},
+	"Oil_Market_Cube_Geography_Longitude":                                   &OilMarketCubeProcessor{},
 }
 
 func GetRZDProcessor(tableName string) (RzdDataProcessor, error) {
@@ -222,3 +165,126 @@ func GetRZDProcessor(tableName string) (RzdDataProcessor, error) {
 		return processor, nil
 	}
 }
+
+func getIndexId(prefix string, area string, suffix string) (indexCode string) {
+	prefixWords := strings.Fields(prefix) // 分割字符串为单词
+	firstLetters := ""
+	for _, word := range prefixWords {
+		if len(word) > 0 {
+			firstLetters += string(unicode.ToLower(rune(word[0]))) // 获取小写的第一个字母
+		}
+	}
+	suffixWords := strings.Fields(suffix) // 分割字符串为单词
+	SecondLetters := ""
+
+	for _, word := range suffixWords {
+		if len(word) > 0 {
+			SecondLetters += string(unicode.ToLower(rune(word[0]))) // 获取小写的第一个字母
+		}
+	}
+	indexCode = "rzd" + firstLetters + area + SecondLetters
+	return
+}
+
+// 处理分类
+type BatchAddClassifyType struct {
+	List []models.AddRzdClassify
+}
+
+func dealClassify(tableName string, sheetNames []string) (classifyList map[string]int, err error) {
+	var rzdClassifyList []models.AddRzdClassify
+	var parentId int
+	classifyList = make(map[string]int)
+	rzdMapStruct := classifyMap[tableName]
+	// 查询一级分类是否存在
+	if classify, ok := RzdClassifyMap[rzdMapStruct.ClassifyName]; !ok {
+		parentClassify := models.AddRzdClassify{
+			ClassifyName: rzdMapStruct.ClassifyName,
+			Sort:         rzdMapStruct.Sort,
+			ParentId:     0,
+		}
+		rzdClassifyList = append(rzdClassifyList, parentClassify)
+		resp, httpErr := httpRequestFill(BatchAddClassifyType{
+			List: rzdClassifyList,
+		}, utils.BATCH_ADD_RZD_CLASSYFY)
+		if httpErr != nil {
+			err = fmt.Errorf("添加睿咨得分类失败: %v", err)
+			return
+		}
+		var rzdResp models.RequestResponse[[]models.BaseFromRzdClassify]
+		jsonErr := json.Unmarshal(resp, &rzdResp)
+		if jsonErr != nil {
+			err = fmt.Errorf("解析添加睿咨得分类失败: %v", err)
+			return
+		}
+		if rzdResp.Ret != 200 {
+			err = fmt.Errorf("添加睿咨得分类失败: %v", err)
+			return
+		}
+		parentId = rzdResp.Data[0].BaseFromRzdClassifyId
+		classifyList[tableName] = rzdResp.Data[0].BaseFromRzdClassifyId
+	} else {
+		parentId = classify.BaseFromRzdClassifyId
+		classifyList[tableName] = classify.BaseFromRzdClassifyId
+	}
+	rzdClassifyList = []models.AddRzdClassify{}
+	//处理二级分类
+	for _, sheetName := range sheetNames {
+		if sheetName == "Content" {
+			continue
+		}
+		rzdMapStruct = classifyMap[sheetName]
+		if classify, ok := RzdClassifyMap[rzdMapStruct.ClassifyName]; !ok {
+			rzdClassifyList = append(rzdClassifyList, models.AddRzdClassify{
+				ClassifyName: rzdMapStruct.ClassifyName,
+				Sort:         rzdMapStruct.Sort,
+				ParentId:     parentId,
+			})
+		} else {
+			classifyList[sheetName] = classify.BaseFromRzdClassifyId
+		}
+	}
+	if len(rzdClassifyList) > 0 {
+		resp, httpErr := httpRequestFill(BatchAddClassifyType{
+			List: rzdClassifyList}, utils.BATCH_ADD_RZD_CLASSYFY)
+		if httpErr != nil {
+			err = fmt.Errorf("添加睿咨得分类失败: %v", err)
+			return
+		}
+		var rzdResp models.RequestResponse[[]models.BaseFromRzdClassify]
+		jsonErr := json.Unmarshal(resp, &rzdResp)
+		if jsonErr != nil {
+			err = fmt.Errorf("解析添加睿咨得分类失败: %v", err)
+			return
+		}
+		if rzdResp.Ret != 200 {
+			err = fmt.Errorf("添加睿咨得分类失败: %v", err)
+			return
+		}
+		for _, classify := range rzdResp.Data {
+			classifyList[classify.ClassifyName] = classify.BaseFromRzdClassifyId
+		}
+	}
+	return
+}
+
+// 处理分类
+func getRzdClassifyList() (list []*models.BaseFromRzdClassify, err error) {
+	//查询睿咨得分类
+	postEdbLib, httpErr := httpRequestFill(nil, utils.GET_RZD_CLASSIFY)
+	if httpErr != nil {
+		err = fmt.Errorf("获取睿咨得分类数据失败: %v", httpErr)
+		return
+	}
+	var requestResponse models.RequestResponse[[]*models.BaseFromRzdClassify]
+	jsonErr := json.Unmarshal(postEdbLib, &requestResponse)
+	if jsonErr != nil {
+		err = fmt.Errorf("获取睿咨得分类数据失败,解析JSON数据失败: %v", jsonErr)
+		return
+	}
+	if requestResponse.Ret != 200 {
+		err = fmt.Errorf("获取睿咨得分类数据失败,请求应答异常: %v", requestResponse.ErrMsg)
+		return
+	}
+	return requestResponse.Data, nil
+}

+ 10 - 10
utils/date_util.go

@@ -633,31 +633,31 @@ func ConvertDateFormat5(dataText string) (string, error) {
 }
 
 // ConvertDateFormat6 转换时间格式 2023-March --> 2023-03-31
-func ConvertDateFormat6(dataText string) (string, error) {
+func ConvertDateFormatForMC(dataText string) (date time.Time, dateStr string, err error) {
 	// 拆分年份和月份
 	parts := strings.Split(dataText, "-")
 	if len(parts) != 2 {
-		return "", fmt.Errorf("日期格式不正确")
+		err = fmt.Errorf("日期格式不正确")
+		return
 	}
-
 	// 提取年份和月份
 	yearStr := parts[0]
 	monthStr := parts[1]
-
 	// 转换年份
 	year, err := strconv.Atoi(yearStr)
 	if err != nil {
-		return "", fmt.Errorf("无效的年份: %v", err)
+		err = fmt.Errorf("无效的年份: %v", err)
+		return
 	}
 
 	// 获取月份数字
 	month, err := time.Parse("January", monthStr)
 	if err != nil {
-		return "", fmt.Errorf("无效的月份: %v", err)
+		err = fmt.Errorf("无效的月份: %v", err)
+		return
 	}
-
 	// 获取最后一天
-	lastDay := time.Date(year, month.Month()+1, 0, 0, 0, 0, 0, time.UTC) // 使用月份数字加1,再设为0日得到上个月最后一天
-
-	return lastDay.Format("2006-01-02"), nil
+	date = time.Date(year, month.Month()+1, 0, 0, 0, 0, 0, time.UTC) // 使用月份数字加1,再设为0日得到上个月最后一天
+	dateStr = date.Format("2006-01-02")
+	return
 }