|
@@ -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
|
|
|
+}
|