瀏覽代碼

修复rzd数据

kobe6258 1 月之前
父節點
當前提交
67e33d57fd

+ 1 - 2
controllers/rzd_controller.go

@@ -1,7 +1,6 @@
 package controllers
 
 import (
-	"context"
 	"eta/eta_data_analysis/models"
 	"eta/eta_data_analysis/services/ruizide"
 	"eta/eta_data_analysis/utils"
@@ -26,7 +25,7 @@ func (this *RzdController) DealData() {
 		this.ServeJSON()
 	}()
 	var err error
-	err = ruizide.ResolverNet(context.Background())
+	err = ruizide.FileResolver()
 	if err != nil {
 		utils.FileLog.Error("睿咨得数据处理失败 err:%v", err)
 		br.Msg = "操作异常"

+ 130 - 128
services/ruizide/data_processor.go

@@ -19,10 +19,40 @@ import (
 
 // 定义选择器
 var (
-	excelDir     = utils.RZD_EXCEL_PATH
-	downloadDir  = utils.RZD_DOWNLOAD_PATH
-	rzdLoginPath = utils.RZD_LOGIN_PATH
-	rzdBatchSize = 500
+	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_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",
+		"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",
+	}
 )
 
 // 处理数据下载的步骤
@@ -112,21 +142,25 @@ func waitAndRenameDownloadedFile(newFileName, targetDir string) error {
 	return nil
 }
 
-func moveFile(source, destination string) error {
+func moveFile(source, destination string) (err error) {
 	// 复制文件
 	srcFile, err := os.Open(source)
 	if err != nil {
 		return fmt.Errorf("打开源文件时出错: %v", err)
 	}
-	defer srcFile.Close()
+	defer func() {
+		_ = srcFile.Close()
+	}()
 
 	dstFile, err := os.Create(destination)
 	if err != nil {
 		return fmt.Errorf("创建目标文件时出错: %v", err)
 	}
-	defer dstFile.Close()
+	defer func() {
+		_ = dstFile.Close()
+	}()
 
-	if _, err := io.Copy(dstFile, srcFile); err != nil {
+	if _, err = io.Copy(dstFile, srcFile); err != nil {
 		return fmt.Errorf("复制文件时出错: %v", err)
 	}
 	time.Sleep(60 * time.Second)
@@ -202,145 +236,46 @@ func ResolverNet(_ context.Context) (err error) {
 		return
 	}
 	utils.FileLog.Info("睿咨得数据下载完成")
-	fmt.Println("数据下载完成")
 	// 解析表格 读取数据
-	fileResolver()
+	FileResolver()
 	return
 }
 
-//	func setFolderPermissions(path string) error {
-//		// 获取当前用户的信息
-//		currentUser, err := user.Current()
-//		if err != nil {
-//			return err
-//		}
-//
-//		// 设置权限
-//		err = os.Chmod(path, 0755)
-//		if err != nil {
-//			return err
-//		}
-//
-//		// 获取文件夹的安全描述符
-//		handle, err := syscall.Open(path, syscall.GENERIC_READ|syscall.GENERIC_WRITE, 0)
-//		if err != nil {
-//			return err
-//		}
-//		defer syscall.CloseHandle(handle)
-//
-//		var securityDescriptor *syscall.SecurityDescriptor
-//		err = syscall.GetSecurityInfo(
-//			handle,
-//			syscall.SE_FILE_OBJECT,
-//			syscall.DACL_SECURITY_INFORMATION,
-//			nil,
-//			nil,
-//			&securityDescriptor,
-//			nil,
-//		)
-//		if err != nil {
-//			return err
-//		}
-//
-//		// 添加当前用户的写权限
-//		userSID, err := syscall.StringToSid(currentUser.Uid)
-//		if err != nil {
-//			return err
-//		}
-//
-//		ace := &syscall.ACE{
-//			Mask:     syscall.GENERIC_ALL,
-//			Sid:      userSID,
-//			Flags:    syscall.INHERITED_ACE | syscall.OBJECT_INHERIT_ACE | syscall.CONTAINER_INHERIT_ACE,
-//			Type:     syscall.ACCESS_ALLOWED_ACE_TYPE,
-//			Inherits: true,
-//		}
-//
-//		dacl, err := securityDescriptor.Dacl()
-//		if err != nil {
-//			return err
-//		}
-//
-//		dacl.AddAce(ace)
-//		err = syscall.SetSecurityInfo(
-//			handle,
-//			syscall.SE_FILE_OBJECT,
-//			syscall.DACL_SECURITY_INFORMATION,
-//			nil,
-//			nil,
-//			dacl,
-//			nil,
-//		)
-//		if err != nil {
-//			return err
-//		}
-//
-//		return nil
-//	}
-//
 // 解析本地文件
-func fileResolver() {
-	//func main() {
-	var tableNameList = []string{
-		"Oil_Demand_Signals_Weekly_Report",
-		"Oil_Supply_Analysis",
-		"Supply_Revision_Analysis",
-		"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",
-		"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",
-	}
+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
+			return err
 		}
-
 		// 获取所有工作表
 		sheetNames := f.GetSheetList()
 
 		for _, sheetName := range sheetNames {
-			fmt.Printf("读取工作表: %s\n", sheetName)
-
+			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
 			}
-
 			// 遍历行并打印内容
-			indexData := []models.BaseFromRzdData{}
+			var indexData []models.BaseFromRzdData
 			for rowIndex, rowData := range maxRow {
-
 				// 因为excel文件中的sheet表格不固定 对于 Supply_Revision_Analysis, Oil_Supply_Analysis 文件 手动调整sheet表格顺序
 				if tableName == "Supply_Revision_Analysis" && rowIndex == 0 {
 					if rowData[0] == "YearQuarter" && rowData[1] == "Revision" && rowData[2] == "CountryRevisionGroup" {
@@ -375,7 +310,6 @@ func fileResolver() {
 						sheetName = "Chart4"
 					}
 				}
-
 				processor, err := GetProcessor(tableName, sheetName)
 				if err != nil {
 					utils.FileLog.Error("无法获取处理器: %v", err)
@@ -384,11 +318,13 @@ func fileResolver() {
 				baseFromRzdDataList, err := processor.Process(tableName, sheetName, rowIndex, rowData)
 				if err != nil {
 					utils.FileLog.Error("处理数据失败: %v", err)
-					return
+					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 {
@@ -405,14 +341,14 @@ func fileResolver() {
 					marshal, err := json.Marshal(batchData)
 					if err != nil {
 						utils.FileLog.Error("json.Marshal err: %v", err)
-						return
+						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
+						return err
 					}
 				}
 			}
@@ -456,18 +392,18 @@ func fileResolver() {
 				marshal, err := json.Marshal(edbDataList)
 				if err != nil {
 					utils.FileLog.Error("postEdbLib err: %v", err)
-					return
+					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
+					return err
 				}
 			}
-
 		}
 	}
+	return nil
 }
 
 func login(ctx context.Context) error {
@@ -510,3 +446,69 @@ func httpRequestFill(data interface{}, urlMethod string) (postEdbLib []byte, err
 	}
 	return postEdbLib, nil
 }
+
+// 解析本地文件
+func FileResolverV2() error {
+	for _, tableName := range tableNameList {
+		rzdProcessor, err := GetRZDProcessor(tableName)
+		if err != nil {
+			fmt.Printf("获取睿咨得数据处理器: %v", err)
+			utils.FileLog.Error("获取睿咨得数据处理器:", err.Error())
+			continue
+		}
+		_, err = rzdProcessor.Process(tableName)
+		if err != nil {
+			utils.FileLog.Error(fmt.Sprintf("%s处理数据失败:", tableName), err.Error())
+			continue
+		}
+		// 新增指标库数据
+		edbDataList := []models.EdbDataRzd{}
+		for _, index := range indexData {
+			// 补充 判断是否存在于指标库
+			paramsLib := make(map[string]interface{})
+			paramsLib["IndexCode"] = index.IndexCode
+			paramsLib["Source"] = utils.DATA_SOURCE_RZD
+			postEdbLib, err := httpRequestFill(paramsLib, utils.GET_RZD_EDB_INFO_BY_INDEX_CODE)
+			if err != nil {
+				// 有错误就不继续执行
+				utils.FileLog.Error("postEdbLib err: %v", err)
+				continue
+			}
+			var requestResponse models.RequestResponse[models.EdbInfo]
+			err = json.Unmarshal(postEdbLib, &requestResponse)
+			if err != nil {
+				utils.FileLog.Error("postEdbLib err: %v", err)
+				continue
+			}
+
+			if requestResponse.Data.EdbInfoId != 0 {
+				edbDataRzd := models.EdbDataRzd{
+					CreateTime:    utils.GetCurrentTime(),
+					ModifyTime:    utils.GetCurrentTime(),
+					EdbInfoId:     index.BaseFromRzdIndexId,
+					EdbCode:       index.IndexCode,
+					DataTime:      index.DataTime,
+					Value:         index.Value,
+					DataTimestamp: uint64(utils.StringToTimeFormat(index.DataTime, utils.FormatDate).UnixMilli()),
+				}
+				edbDataList = append(edbDataList, edbDataRzd)
+			}
+		}
+
+		if len(edbDataList) > 0 {
+			// 转换成json
+			marshal, err := json.Marshal(edbDataList)
+			if err != nil {
+				utils.FileLog.Error("postEdbLib err: %v", err)
+				return err
+			}
+			_, err = utils.HttpPostRequest(utils.EDB_LIB_URL+utils.ADD_BATCH_RZD_EDB_DATA, string(marshal), "application/json")
+			if err != nil {
+				// 有错误就不继续执行
+				utils.FileLog.Error("postEdbLib err: %v", err)
+				return err
+			}
+		}
+	}
+	return nil
+}

+ 290 - 0
services/ruizide/oil_demand_signals_weekly_report_processor.go

@@ -0,0 +1,290 @@
+package ruizide
+
+import (
+	"encoding/json"
+	"eta/eta_data_analysis/models"
+	"eta/eta_data_analysis/utils"
+	"fmt"
+	"github.com/xuri/excelize/v2"
+	"os"
+	"path/filepath"
+	"regexp"
+	"strconv"
+	"strings"
+)
+
+var (
+	OilDemandSignalsWeeklyReportConfigMap = map[string]config{
+		"Road Index": {
+			Frequency:       "日度",
+			Unit:            "%",
+			IndexNameColOne: "Index",
+			IndexNameColTwo: "Index 7DMA",
+			IndexPrefix:     "Road Index",
+			Rows:            5,
+			IndexRow:        2,
+			DataOneRow:      3,
+			DataTwoRow:      4,
+			DateRow:         1,
+		},
+		"Road Active Fleet": {
+			Frequency:       "日度",
+			Unit:            "辆",
+			IndexNameColOne: "Active Fleet",
+			IndexNameColTwo: "Active Fleet 7DMA",
+			IndexPrefix:     "Road Active Fleet",
+			Rows:            5,
+			IndexRow:        2,
+			DataOneRow:      3,
+			DataTwoRow:      4,
+			DateRow:         1,
+		},
+		"Aviation Index": {
+			Frequency:       "日度",
+			Unit:            "%",
+			IndexNameColOne: "Index",
+			IndexNameColTwo: "Index 7DMA",
+			IndexPrefix:     "Aviation Index",
+			Rows:            5,
+			IndexRow:        2,
+			DataOneRow:      3,
+			DataTwoRow:      4,
+			DateRow:         1,
+		},
+		"Aviation Active Fleet": {
+			Frequency:       "日度",
+			Unit:            "辆",
+			IndexNameColOne: "Active Fleet",
+			IndexNameColTwo: "Active Fleet 7DMA",
+			IndexPrefix:     "Aviation Active Fleet",
+			Rows:            5,
+			IndexRow:        2,
+			DataOneRow:      3,
+			DataTwoRow:      4,
+			DateRow:         1,
+		},
+		"Demand - Gasoline": {
+			Frequency:       "日度",
+			Unit:            "千桶每天",
+			IndexNameColOne: "Demand",
+			IndexNameColTwo: "Demand 7DMA",
+			IndexPrefix:     "Gasoline Demand",
+			Rows:            6,
+			IndexRow:        3,
+			DataOneRow:      4,
+			DataTwoRow:      5,
+			DateRow:         1,
+		},
+		"Demand - Diesel": {
+			Frequency:       "日度",
+			Unit:            "千桶每天",
+			IndexNameColOne: "Demand",
+			IndexNameColTwo: "Demand 7DMA",
+			IndexPrefix:     "Demand Diesel",
+			Rows:            6,
+			IndexRow:        3,
+			DataOneRow:      4,
+			DataTwoRow:      5,
+			DateRow:         1,
+		},
+		"Demand - Jet Fuel": {
+			Frequency:       "日度",
+			Unit:            "千桶每天",
+			IndexNameColOne: "Demand",
+			IndexNameColTwo: "Demand 7DMA",
+			IndexPrefix:     "Demand Jet Fuel",
+			Rows:            6,
+			IndexRow:        3,
+			DataOneRow:      4,
+			DataTwoRow:      5,
+			DateRow:         1,
+		},
+		"Demand - Maritime Bunker": {
+			Frequency:       "日度",
+			Unit:            "千桶每天",
+			IndexNameColOne: "Demand",
+			IndexNameColTwo: "Demand 7DMA",
+			IndexPrefix:     "Demand Maritime Bunker",
+			Rows:            6,
+			IndexRow:        3,
+			DataOneRow:      4,
+			DataTwoRow:      5,
+			DateRow:         1,
+		},
+	}
+)
+
+type config struct {
+	Frequency       string
+	Unit            string
+	IndexNameColOne string
+	IndexNameColTwo string
+	IndexPrefix     string
+	Rows            int
+	IndexRow        int
+	DataOneRow      int
+	DataTwoRow      int
+	DateRow         int
+}
+type OilDemandSignalsWeeklyReportProcessor struct {
+}
+
+func (p *OilDemandSignalsWeeklyReportProcessor) Process(tableName string) (list []models.BaseFromRzdData, 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
+	}
+	classifyIdList, httpErr := dealClassify(tableName, sheetName)
+	// 获取所有工作表
+	sheetNames := file.GetSheetList()
+	for _, sheetName := range sheetNames {
+		// step_1: 分类
+
+		if httpErr != nil {
+			utils.FileLog.Error("获取分类Id失败: %v", err)
+			continue
+		}
+		utils.FileLog.Info("classifyId: %v", classifyId)
+		if sheetName == "Content" {
+			utils.FileLog.Info("跳过工作表:", sheetName)
+			continue
+		}
+		utils.FileLog.Info("读取工作表: %s\n", sheetName)
+		// 获取工作表的最大行数
+		maxRow, err := file.GetRows(sheetName) // 直接获取所有行数据
+		if err != nil {
+			utils.FileLog.Error("获取工作表数据时出错: %v", err)
+			continue
+		}
+		var indexData []models.BaseFromRzdData
+		for rowIndex, rowData := range maxRow {
+			// 因为excel文件中的sheet表格不固定 对于 Supply_Revision_Analysis, Oil_Supply_Analysis 文件 手动调整sheet表格顺序
+			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
+				}
+			}
+		}
+		utils.FileLog.Info("Processing AnalyticsLibrary...")
+		sheetConfig := OilDemandSignalsWeeklyReportConfigMap[sheetName]
+		if tableName == "Content" {
+			return nil, nil
+		}
+		if rowIndex < 4 {
+			return nil, nil
+		}
+		//处理数据不全的情况
+		less := sheetConfig.Rows - len(rowData)
+		if less > 0 {
+			for i := 0; i < less; i++ {
+				rowData = append(rowData, "")
+			}
+		}
+		// 匹配非数字字符
+		re := regexp.MustCompile(`^\d*\.?\d*\s*$`)
+		if !re.MatchString(strings.TrimSpace(rowData[sheetConfig.DataOneRow])) || !re.MatchString(strings.TrimSpace(rowData[sheetConfig.DataTwoRow])) {
+			utils.FileLog.Warn("数据格式错误:", fmt.Sprintf("%v", rowData))
+			return
+		}
+
+		// step_2: 指标
+		// 指标名称
+		indexNameOne := sheetName + "/" + rowData[len(rowData)-3] + "/" + sheetConfig.IndexNameColOne
+		indexNameTwo := sheetName + "/" + rowData[len(rowData)-3] + "/" + sheetConfig.IndexNameColTwo
+		// 生成指标编码
+		indexCodeOne, err := getIndexId(sheetName, strings.ReplaceAll(strings.ToLower(rowData[len(rowData)-3]), " ", ""), sheetConfig.IndexNameColOne)
+		indexCodeTwo, err := getIndexId(sheetName, strings.ReplaceAll(strings.ToLower(rowData[len(rowData)-3]), " ", ""), sheetConfig.IndexNameColTwo)
+
+		indexInfoMap := make(map[string]string)
+		indexInfoMap[indexCodeOne] = indexNameOne
+		indexInfoMap[indexCodeTwo] = indexNameTwo
+
+		dataTime := rowData[1]
+		formatDate, err := utils.ConvertDateFormat(dataTime)
+		if err != nil {
+			return nil, err
+		}
+		var indexInfoList []*models.IndexInfo
+		dataOneStr := strings.TrimSpace(rowData[3])
+		if strings.TrimSpace(dataOneStr) != "" {
+			valueOne, err := strconv.ParseFloat(strings.ReplaceAll(dataOneStr, ",", ""), 64)
+			if err != nil {
+				utils.FileLog.Error(fmt.Sprintf("转换data数据失败,index_code:%s,data_value:%s err:%v", indexCodeOne, rowData[3], err))
+				return nil, err
+			}
+			indexInfoList = append(indexInfoList, &models.IndexInfo{
+				IndexName: indexNameOne,
+				IndexCode: indexCodeOne,
+				Value:     valueOne,
+				DataTime:  formatDate,
+			})
+		}
+		dataTwoStr := strings.TrimSpace(rowData[4])
+		if strings.TrimSpace(dataTwoStr) != "" {
+			valueTwo, err := strconv.ParseFloat(rowData[4], 64)
+			if err != nil {
+				utils.FileLog.Error(fmt.Sprintf("转换data数据失败,index_code:%s,data_value:%s err:%v", indexCodeTwo, rowData[4], err))
+				return nil, err
+			}
+			indexInfoList = append(indexInfoList, &models.IndexInfo{
+				IndexName: indexNameTwo,
+				IndexCode: indexCodeTwo,
+				Value:     valueTwo,
+				DataTime:  formatDate,
+			})
+		}
+		indexInfoList, err = dealIndex(indexInfoList, sheetConfig.Frequency, sheetConfig.Unit, classifyId)
+		if err != nil {
+			return nil, err
+		}
+		utils.FileLog.Info("indexInfoList: %v", indexInfoList)
+		// step_3: 指标数据
+		dataList, err := dealData(indexInfoList)
+		if err != nil {
+			return nil, err
+		}
+		utils.FileLog.Info("dataList: %v", dataList)
+		return dataList, err
+	}
+}

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


+ 16 - 0
services/ruizide/processor_factory.go

@@ -9,6 +9,10 @@ type ReportProcessor interface {
 	Process(string, string, int, []string) ([]models.BaseFromRzdData, error)
 }
 
+type RzdDataProcessor interface {
+	Process(tableName string) ([]models.BaseFromRzdData, error)
+}
+
 func GetProcessor(tableName string, sheetName string) (ReportProcessor, error) {
 	if tableName == "Oil_Demand_Signals_Weekly_Report" {
 		switch sheetName {
@@ -241,3 +245,15 @@ func GetProcessor(tableName string, sheetName string) (ReportProcessor, error) {
 	// 可以添加更多的逻辑来处理其他产品和类别
 	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{},
+}
+
+func GetRZDProcessor(tableName string) (RzdDataProcessor, error) {
+	if processor, ok := RzdProcessorMap[tableName]; !ok {
+		return nil, fmt.Errorf("no processor found for tableName %s", tableName)
+	} else {
+		return processor, nil
+	}
+}

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