浏览代码

粮油商务网数据对接

gmy 8 月之前
父节点
当前提交
07dd0951c9
共有 5 个文件被更改,包括 337 次插入501 次删除
  1. 65 34
      cmd/commodity_trade_liangyou.go
  2. 166 0
      cmd/processor_business_logic.go
  3. 29 0
      cmd/processor_factory.go
  4. 52 467
      static/liangyou.json
  5. 25 0
      utils/date_util.go

+ 65 - 34
cmd/commodity_trade_liangyou.go

@@ -12,6 +12,10 @@ import (
 	"github.com/chromedp/chromedp"
 )
 
+const (
+	lyLoginPath = "https://www.fao.com.cn/"
+)
+
 // UserInfo 登录用户信息
 type UserInfo struct {
 	Username string
@@ -79,7 +83,7 @@ func login(ctx context.Context) error {
 		Password: "828384Abc@",
 	}
 	return chromedp.Run(ctx,
-		chromedp.Navigate(`https://www.fao.com.cn/`),
+		chromedp.Navigate(lyLoginPath),
 		chromedp.Sleep(5*time.Second),
 		chromedp.Click(`a[id="btnLogin"]`, chromedp.ByQuery),
 		chromedp.Sleep(2*time.Second),
@@ -94,7 +98,7 @@ func login(ctx context.Context) error {
 func fetchReportData(ctx context.Context, product, category, report string, keywords []string) error {
 	// Navigate to the main page
 	err := chromedp.Run(ctx,
-		chromedp.Navigate(`https://www.fao.com.cn/`),
+		chromedp.Navigate(lyLoginPath),
 		chromedp.Sleep(5*time.Second),
 	)
 	if err != nil {
@@ -105,7 +109,7 @@ func fetchReportData(ctx context.Context, product, category, report string, keyw
 	var productPageURL string
 
 	selector := fmt.Sprintf(`//dl[contains(@class, 'dl_hot')]//a[text()='%s']`, product)
-	fmt.Printf("选择器表达式: %s\n", selector)
+	logs.Info("选择器表达式: %s", selector)
 
 	// 增加超时
 	/*ctx, cancel := context.WithTimeout(ctx, 15*time.Second)
@@ -136,48 +140,71 @@ func fetchReportData(ctx context.Context, product, category, report string, keyw
 	}
 	logs.Info("categoryPageURL: %s", categoryPageURL)
 
-	var htmlContent string
-	err = chromedp.Run(ctx,
-		chromedp.Navigate(categoryPageURL),
-		chromedp.Sleep(5*time.Second),
-		chromedp.OuterHTML("html", &htmlContent),
-	)
-	if err != nil {
-		return err
-	}
-	fmt.Printf("页面内容: %s\n", htmlContent)
+	var allReportURLs []string
+	for {
+		var htmlContent string
+		err = chromedp.Run(ctx,
+			chromedp.Navigate(categoryPageURL),
+			chromedp.Sleep(5*time.Second),
+			chromedp.OuterHTML("html", &htmlContent),
+		)
+		if err != nil {
+			return err
+		}
+		fmt.Printf("页面内容: %s\n", htmlContent)
 
-	// Navigate to the report page and extract data
-	var reportURLs []string
-	// Extract report URLs containing the partial keyword
-	reportURLs = extractReportURLs(htmlContent, report)
+		// Extract report URLs containing the partial keyword
+		reportURLs := extractReportURLs(htmlContent, report)
+		allReportURLs = append(allReportURLs, reportURLs...)
 
-	/*for _, keyword := range keywords {
-		keyword = strings.Split(keyword, ":")[0]
+		// Check if next page button is disabled
+		var nextPageDisabled bool
+		err = chromedp.Run(ctx,
+			chromedp.Evaluate(`document.querySelector('div.my-page-next').classList.contains('my-page-forbid')`, &nextPageDisabled),
+		)
+		if err != nil {
+			return err
+		}
+
+		if nextPageDisabled {
+			break
+		}
+
+		// Click the next page button
+		err = chromedp.Run(ctx,
+			chromedp.Click(`div.my-page-next`, chromedp.ByQuery),
+			chromedp.Sleep(5*time.Second),
+			chromedp.Location(&categoryPageURL),
+		)
+		if err != nil {
+			return err
+		}
+	}
 
-	}*/
+	logs.Info("所有报告 URLs: %v", allReportURLs)
 
-	if len(reportURLs) == 0 {
+	if len(allReportURLs) == 0 {
 		return fmt.Errorf("未找到报告 URL")
 	}
 
-	// Process each report URL
-	for _, reportURL := range reportURLs {
-		err = processReport(ctx, reportURL, keywords)
+	// 处理报告数据
+	for _, reportURL := range allReportURLs {
+		err = processReport(ctx, product, category, reportURL, keywords)
 		if err != nil {
-			fmt.Printf("处理报告错误: %s: %v\n", reportURL, err)
+			logs.Error("处理报告错误: %s: %s: %s: %s: %v", product, category, report, reportURL, err)
 		}
 	}
 
 	return nil
 }
 
+// Extract report URLs from the HTML content
 func extractReportURLs(htmlContent, keyword string) []string {
 	var reportURLs []string
 
 	// Find all occurrences of the keyword and extract report URLs
+	content := htmlContent
 	for {
-		content := htmlContent
 		startIdx := strings.Index(content, keyword)
 		if startIdx == -1 {
 			break
@@ -186,23 +213,22 @@ func extractReportURLs(htmlContent, keyword string) []string {
 
 		// Extract the URL from the HTML content
 		urlStartIdx := strings.LastIndex(content[:startIdx], `href="`) + len(`href="`)
-		logs.Info("strings.Index(content[urlStartIdx:])", strings.Index(content[urlStartIdx:], `"`))
 		urlEndIdx := strings.Index(content[urlStartIdx:], `"`) + urlStartIdx
 		if urlStartIdx > 0 && urlEndIdx > urlStartIdx {
 			reportURLs = append(reportURLs, content[urlStartIdx:urlEndIdx])
 		}
 
-		content = content[urlEndIdx:]
+		content = content[startIdx:]
 	}
 
 	return reportURLs
 }
 
-func processReport(ctx context.Context, reportURL string, keywords []string) error {
+func processReport(ctx context.Context, product string, category string, reportURL string, keywords []string) error {
 	// Navigate to the report page
 	var reportContent string
 	err := chromedp.Run(ctx,
-		chromedp.Navigate(reportURL),
+		chromedp.Navigate(lyLoginPath+reportURL),
 		chromedp.Sleep(5*time.Second),
 		chromedp.OuterHTML("html", &reportContent),
 	)
@@ -212,11 +238,16 @@ func processReport(ctx context.Context, reportURL string, keywords []string) err
 
 	// Process the data based on keywords
 	for _, keyword := range keywords {
-		partialKeyword := strings.SplitN(keyword, ":", 2)[0]
-		if strings.Contains(reportContent, partialKeyword) {
-			fmt.Printf("找到关键词: %s 在报告: %s 中\n", partialKeyword, reportURL)
-			// 这里可以添加进一步的处理逻辑,比如提取具体的值
+		partialKeyword := strings.Split(keyword, ":")
+		// Select appropriate processor based on product and category
+		processor, err := GetProcessor(product, category)
+		if err != nil {
+			return err
 		}
+
+		// Process the report content using the selected processor
+		err = processor.Process(ctx, product, reportContent, partialKeyword)
+
 	}
 
 	return nil

+ 166 - 0
cmd/processor_business_logic.go

@@ -0,0 +1,166 @@
+// @Author gmy 2024/8/6 10:50:00
+package main
+
+import (
+	"context"
+	"encoding/json"
+	"eta/eta_crawler/utils"
+	"fmt"
+	"github.com/PuerkitoBio/goquery"
+	"github.com/beego/beego/v2/core/logs"
+	"github.com/chromedp/chromedp"
+	"log"
+	"strings"
+)
+
+// ImportCostProcessor
+// @Description: 进口成本处理器
+type ImportCostProcessor struct{}
+
+func (p *ImportCostProcessor) Process(ctx context.Context, product string, reportContent string, keywords []string) error {
+	fmt.Println("Processing import cost...")
+	// 实现具体的处理逻辑
+	return nil
+}
+
+// ProcessingProfitProcessor
+// @Description: 加工利润处理器
+type ProcessingProfitProcessor struct{}
+
+func (p *ProcessingProfitProcessor) Process(ctx context.Context, product string, reportContent string, keywords []string) error {
+	fmt.Println("Processing processing profit...")
+	// 实现具体的处理逻辑
+	return nil
+}
+
+// ProcessingReportProcessor
+// @Description: 加工报告处理器
+type ProcessingReportProcessor struct {
+}
+
+// TableData 用于存储表格的数据
+type TableData struct {
+	Headers []string   `json:"headers"`
+	Rows    [][]string `json:"rows"`
+}
+
+func (p *ProcessingReportProcessor) Process(ctx context.Context, product string, reportContent string, keywords []string) error {
+	logs.Info("Processing processing report...")
+	// 解析关键字
+	if len(keywords) < 3 {
+		return fmt.Errorf("ProcessingReportProcessor Process() : keywords must contain at least 3 elements")
+	}
+
+	// 拿到 行关键字和列关键字
+	columnName := keywords[0]
+	rowName := keywords[1]
+
+	// 提取所有表格数据
+	var tableData []TableData
+
+	doc, err := goquery.NewDocumentFromReader(strings.NewReader(reportContent))
+	if err != nil {
+		log.Fatal(err)
+	}
+
+	// 选择 id 为 "a_content" 的 div
+	doc.Find("#a_content").Each(func(index int, item *goquery.Selection) {
+		item.Find("table").Each(func(index int, table *goquery.Selection) {
+			var headers []string
+			var rows [][]string
+
+			// 提取表头
+			table.Find("thead th").Each(func(index int, th *goquery.Selection) {
+				headers = append(headers, th.Text())
+			})
+
+			// 提取表格行数据
+			table.Find("tbody tr").Each(func(index int, row *goquery.Selection) {
+				var rowData []string
+				row.Find("td").Each(func(index int, td *goquery.Selection) {
+					rowData = append(rowData, td.Text())
+				})
+				rows = append(rows, rowData)
+			})
+
+			// 仅在表头存在时添加到结果中
+			if len(headers) > 0 {
+				tableData = append(tableData, TableData{
+					Headers: headers,
+					Rows:    rows,
+				})
+			}
+		})
+	})
+	// 打印提取的数据以进行调试
+	dataJSON, _ := json.MarshalIndent(tableData, "", "  ")
+	fmt.Printf("Extracted Table Data: %s\n", dataJSON)
+
+	// 提取日期信息
+	var dateText string
+	err = chromedp.Run(ctx,
+		chromedp.Evaluate(`document.querySelector('div.a_date span').innerText`, &dateText),
+	)
+	if err != nil {
+		return err
+	}
+
+	logs.Info("ProcessingReportProcessor Process() : Extracted Date: %s", dateText)
+
+	// 解析日期并计算当前周数
+	targetWeek, err := utils.ParseDateAndWeek(dateText)
+	if err != nil {
+		return err
+	}
+
+	fmt.Printf("Target Week: %s\n", targetWeek)
+
+	// 处理提取的表格数据
+	for _, data := range tableData {
+		tableHeaders := data.Headers
+		tableRows := data.Rows
+
+		// 查找目标列
+		columnIdx := -1
+		for i, header := range tableHeaders {
+			if strings.Contains(columnName, header) {
+				columnIdx = i
+				break
+			}
+		}
+
+		if columnIdx == -1 {
+			logs.Error("ProcessingReportProcessor Process() : Column '%s' not found in table", columnName)
+			continue
+		}
+
+		// 查找本周的列位置
+		weekIdx := -1
+		for i, header := range tableHeaders {
+			if strings.Contains(header, targetWeek) && i > columnIdx {
+				weekIdx = i
+				break
+			}
+		}
+
+		if weekIdx == -1 {
+			fmt.Printf("Week column '%s' not found in table\n", targetWeek)
+			continue
+		}
+
+		// 查找目标行
+		for _, row := range tableRows {
+			if len(row) > 0 && strings.Contains(row[0], rowName) {
+				fmt.Printf("Row matching '%s':\n", rowName)
+				if weekIdx < len(row) {
+					logs.Info("Value in column '%s' - '%s': %s", columnName, rowName, row[columnIdx])
+				} else {
+					logs.Error("ProcessingReportProcessor Process() : Column index out of range")
+				}
+			}
+		}
+
+	}
+
+	return nil
+}

+ 29 - 0
cmd/processor_factory.go

@@ -0,0 +1,29 @@
+// @Author gmy 2024/8/6 10:48:00
+package main
+
+import (
+	"context"
+	"fmt"
+)
+
+type ReportProcessor interface {
+	Process(ctx context.Context, product string, reportContent string, keywords []string) error
+}
+
+func GetProcessor(product string, category string) (ReportProcessor, error) {
+	if product == "大豆" {
+		switch category {
+		case "进口成本":
+			return &ImportCostProcessor{}, nil
+		case "加工利润":
+			return &ProcessingProfitProcessor{}, nil
+		case "加工报告":
+			return &ProcessingReportProcessor{}, nil
+
+		default:
+			return nil, fmt.Errorf("unknown category: %s", category)
+		}
+	}
+	// 可以添加更多的逻辑来处理其他产品和类别
+	return nil, fmt.Errorf("no processor found for product %s and category %s", product, category)
+}

+ 52 - 467
static/liangyou.json

@@ -1,474 +1,59 @@
 {
   "大豆": {
-    "进口成本": {
-      "国际大豆进口成本参考价": [
-        "美湾:国际大豆进口成本价:期货收盘:张家港:美分/蒲式耳:日度",
-        "美湾:国际大豆进口成本价:升贴水:张家港:美分/蒲式耳:日度",
-        "美湾:国际大豆进口成本价:FOB价:张家港:美元/吨:日度",
-        "美湾:国际大豆进口成本价:运费:张家港:美元/吨:日度",
-        "美湾:国际大豆进口成本价:CNF升贴水:张家港:美分/蒲式耳:日度",
-        "美湾:国际大豆进口成本价:CNF:张家港:美元/吨:日度",
-        "美湾:国际大豆进口成本价:进口成本:张家港:元/吨:日度",
-        "巴西:国际大豆进口成本价:期货收盘:张家港:美分/蒲式耳:日度",
-        "巴西:国际大豆进口成本价:升贴水:张家港:美分/蒲式耳:日度",
-        "巴西:国际大豆进口成本价:FOB价:张家港:美元/吨:日度",
-        "巴西:国际大豆进口成本价:运费:张家港:美元/吨:日度",
-        "巴西:国际大豆进口成本价:CNF升贴水:张家港:美分/蒲式耳:日度",
-        "巴西:国际大豆进口成本价:CNF:张家港:美元/吨:日度",
-        "巴西:国际大豆进口成本价:进口成本:张家港:元/吨:日度"
-      ]
-    },
-    "加工利润": {
-      "进口大豆盘面榨利及现货榨利表": [
-        "美湾:进口大豆盘面榨利:元/吨:日度",
-        "巴西:进口大豆盘面榨利:元/吨:日度",
-        "美湾:进口大豆现货榨利:元/吨:日度",
-        "巴西:进口大豆现货榨利:元/吨:日度"
-      ]
-    },
-    "船运费用": {
-      "国际谷物船运费报价及走势图": [
-        "巴西桑托斯:中国北方港口:超灵便型船:国际谷物船运费:美元:日度",
-        "阿根廷:中国北方港口:巴拿马型船:国际谷物船运费:美元:日度",
-        "美湾密西西比河:中国北方港口:巴拿马型船:国际谷物船运费:美元:日度",
-        "美西塔科马:中国北方港口:巴拿马型船:国际谷物船运费:美元:日度",
-        "美国北太平洋沿岸:中国:巴拿马型船:国际谷物船运费:美元:日度",
-        "美国墨西哥湾:中国:巴拿马型船:国际谷物船运费:美元:日度",
-        "巴西巴拉那瓜:中国:巴拿马型船:国际谷物船运费:美元:日度",
-        "伊特科提亚拉港:中国:巴拿马型船:国际谷物船运费:美元:日度",
-        "波罗的海巴拿马型指数(BPI):国际谷物船运费:%:日度",
-        "波罗的海超灵便型指数(BSI):国际谷物船运费:%:日度",
-        "波罗的海海岬型指数(BCI):国际谷物船运费:%:日度",
-        "波罗的海干散货指数(BDI):国际谷物船运费:%:日度",
-        "波罗的海灵便型指数(BHSI):国际谷物船运费:%:日度"
-      ]
-    },
-    "供需平衡": {
-      "年度中国大豆市场供需报告": [
-        "中国大豆市场供需:期初库存:万吨:月度",
-        "中国大豆市场供需:种植面积:万吨:月度",
-        "中国大豆市场供需:国内产量:万吨:月度",
-        "中国大豆市场供需:进口量:万吨:月度",
-        "中国大豆市场供需:总供应量:万吨:月度",
-        "中国大豆市场供需:压榨用量:万吨:月度",
-        "中国大豆市场供需:其中:国产大豆:万吨:月度",
-        "中国大豆市场供需:进口大豆:万吨:月度",
-        "中国大豆市场供需:出口量:万吨:月度",
-        "中国大豆市场供需:食用量:万吨:月度",
-        "中国大豆市场供需:种用及其他:万吨:月度",
-        "中国大豆市场供需:总需求量:万吨:月度",
-        "中国大豆市场供需:期末库存:万吨:月度"
-      ]
-    },
-    "采购装船": {
-      "中国大豆采购进度周统计": [
-        "中国大豆计划采购量:万吨:周度",
-        "中国大豆已采购量:美国:万吨:周度",
-        "中国大豆已采购量:巴西:万吨:周度",
-        "中国大豆已采购量:阿根廷/乌拉圭:万吨:周度",
-        "中国大豆已采购量:小计:万吨:周度",
-        "中国大豆未采购量:万吨:周度",
-        "中国大豆采购进度:%:周度"
-      ]
-    },
     "加工报告": {
       "国内大豆周度加工量调查": [
-        "国内大豆周度加工量:河南省:万吨:周度",
-        "国内大豆周度加工量:湖北省:万吨:周度",
-        "国内大豆周度加工量:湖南省:万吨:周度",
-        "国内大豆周度加工量:黑龙江:万吨:周度",
-        "国内大豆周度加工量:吉林省:万吨:周度",
-        "国内大豆周度加工量:辽宁省:万吨:周度",
-        "国内大豆周度加工量:内蒙古:万吨:周度",
-        "国内大豆周度加工量:河北省:万吨:周度",
-        "国内大豆周度加工量:天津市:万吨:周度",
-        "国内大豆周度加工量:山西省:万吨:周度",
-        "国内大豆周度加工量:山东省:万吨:周度",
-        "国内大豆周度加工量:安徽省:万吨:周度",
-        "国内大豆周度加工量:江苏省:万吨:周度",
-        "国内大豆周度加工量:上海市:万吨:周度",
-        "国内大豆周度加工量:浙江省:万吨:周度",
-        "国内大豆周度加工量:福建省:万吨:周度",
-        "国内大豆周度加工量:广东省:万吨:周度",
-        "国内大豆周度加工量:广西省:万吨:周度",
-        "国内大豆周度加工量:海南省:万吨:周度",
-        "国内大豆周度加工量:陕西省:万吨:周度",
-        "国内大豆周度加工量:四川省:万吨:周度",
-        "国内大豆周度加工量:重庆市:万吨:周度",
-        "国内大豆周度加工量:云南省:万吨:周度",
-        "国内大豆周度加工量:合计:万吨:周度",
-        "国内大豆周度加工量:其中:国产:万吨:周度",
-        "国内大豆周度加工量:进口:万吨:周度",
-        "国内大豆周度开机率:河南省:%:周度",
-        "国内大豆周度开机率:湖北省:%:周度",
-        "国内大豆周度开机率:湖南省:%:周度",
-        "国内大豆周度开机率:黑龙江:%:周度",
-        "国内大豆周度开机率:吉林省:%:周度",
-        "国内大豆周度开机率:辽宁省:%:周度",
-        "国内大豆周度开机率:内蒙古:%:周度",
-        "国内大豆周度开机率:河北省:%:周度",
-        "国内大豆周度开机率:天津市:%:周度",
-        "国内大豆周度开机率:山西省:%:周度",
-        "国内大豆周度开机率:山东省:%:周度",
-        "国内大豆周度开机率:安徽省:%:周度",
-        "国内大豆周度开机率:江苏省:%:周度",
-        "国内大豆周度开机率:上海市:%:周度",
-        "国内大豆周度开机率:浙江省:%:周度",
-        "国内大豆周度开机率:福建省:%:周度",
-        "国内大豆周度开机率:广东省:%:周度",
-        "国内大豆周度开机率:广西省:%:周度",
-        "国内大豆周度开机率:海南省:%:周度",
-        "国内大豆周度开机率:陕西省:%:周度",
-        "国内大豆周度开机率:四川省:%:周度",
-        "国内大豆周度开机率:重庆市:%:周度",
-        "国内大豆周度开机率:云南省:%:周度",
-        "国内大豆周度开机率:合计:%:周度",
-        "国内大豆周度开机率:其中:国产:%:周度",
-        "国内大豆周度开机率:进口:%:周度"
-      ]
-    },
-    "库存分析": {
-      "全国油厂进口大豆库存量统计周报": [
-        "全国油厂进口大豆库存量:东北地区:万吨:周度",
-        "全国油厂进口大豆库存量:华北地区:万吨:周度",
-        "全国油厂进口大豆库存量:华东地区:万吨:周度",
-        "全国油厂进口大豆库存量:华南地区:万吨:周度",
-        "全国油厂进口大豆库存量:西南地区:万吨:周度",
-        "全国油厂进口大豆库存量:其他地区:万吨:周度",
-        "全国油厂进口大豆库存量:全国统计:万吨:周度",
-        "全国油厂进口大豆库存量:东北地区:万吨:周度"
-      ]
-    }
-  },
-  "豆粕": {
-    "库存分析": {
-      "全国油厂豆粕库存与合同统计周报": [
-        "全国油厂豆粕库存量:东北地区:万吨:周度",
-        "全国油厂豆粕库存量:华北地区:万吨:周度",
-        "全国油厂豆粕库存量:华东地区:万吨:周度",
-        "全国油厂豆粕库存量:华中地区:万吨:周度",
-        "全国油厂豆粕库存量:华南地区:万吨:周度",
-        "全国油厂豆粕库存量:西南地区:万吨:周度",
-        "全国油厂豆粕库存量:西北地区:万吨:周度",
-        "全国油厂豆粕库存量:全国合计:万吨:周度",
-        "全国油厂豆粕库存量:其中:沿海库存:万吨:周度",
-        "全国油厂豆粕合同量:东北地区:万吨:周度",
-        "全国油厂豆粕合同量:华北地区:万吨:周度",
-        "全国油厂豆粕合同量:华东地区:万吨:周度",
-        "全国油厂豆粕合同量:华中地区:万吨:周度",
-        "全国油厂豆粕合同量:华南地区:万吨:周度",
-        "全国油厂豆粕合同量:西南地区:万吨:周度",
-        "全国油厂豆粕合同量:西北地区:万吨:周度",
-        "全国油厂豆粕合同量:全国合计:万吨:周度",
-        "全国油厂豆粕合同量:其中:沿海库存:万吨:周度"
-      ]
-    }
-  },
-  "大豆油": {
-    "库存分析": {
-      "全国油厂豆油库存与合同统计周报": [
-        "全国油厂豆油库存量:东北地区:万吨:周度",
-        "全国油厂豆油库存量:华北地区:万吨:周度",
-        "全国油厂豆油库存量:华东地区:万吨:周度",
-        "全国油厂豆油库存量:华中地区:万吨:周度",
-        "全国油厂豆油库存量:华南地区:万吨:周度",
-        "全国油厂豆油库存量:西南地区:万吨:周度",
-        "全国油厂豆油库存量:西北地区:万吨:周度",
-        "全国油厂豆油库存量:全国合计:万吨:周度",
-        "全国油厂豆油库存量:其中:沿海库存:万吨:周度",
-        "全国油厂豆油合同量:东北地区:万吨:周度",
-        "全国油厂豆油合同量:华北地区:万吨:周度",
-        "全国油厂豆油合同量:华东地区:万吨:周度",
-        "全国油厂豆油合同量:华中地区:万吨:周度",
-        "全国油厂豆油合同量:华南地区:万吨:周度",
-        "全国油厂豆油合同量:西南地区:万吨:周度",
-        "全国油厂豆油合同量:西北地区:万吨:周度",
-        "全国油厂豆油合同量:全国合计:万吨:周度",
-        "全国油厂豆油合同量:其中:沿海库存:万吨:周度"
-      ]
-    },
-    "价差套利": {
-      "豆棕油期现货价差统计": [
-        "棕榈油主力:大商所:期现货价差:元/吨:日度",
-        "豆油主力:大商所:期现货价差:元/吨:日度",
-        "24度棕榈油:进口液:期现货价差:元/吨:日度",
-        "一级豆油:进口压榨:期现货价差:元/吨:日度"
-      ]
-    },
-    "每日成交": {
-      "豆油成交量及价格统计": [
-        "豆油成交量:东北:吨:日度",
-        "豆油成交量:华北:吨:日度",
-        "豆油成交量:江苏:吨:日度",
-        "豆油成交量:浙江:吨:日度",
-        "豆油成交量:山东:吨:日度",
-        "豆油成交量:广东:吨:日度",
-        "豆油成交量:广西:吨:日度",
-        "豆油成交量:福建:吨:日度",
-        "豆油成交量:其他:吨:日度",
-        "豆油成交量:合计:吨:日度",
-        "豆油周度成交量:东北:吨:周度",
-        "豆油周度成交量:华北:吨:周度",
-        "豆油周度成交量:江苏:吨:周度",
-        "豆油周度成交量:浙江:吨:周度",
-        "豆油周度成交量:山东:吨:周度",
-        "豆油周度成交量:广东:吨:周度",
-        "豆油周度成交量:广西:吨:周度",
-        "豆油周度成交量:福建:吨:周度",
-        "豆油周度成交量:其他:吨:周度",
-        "豆油周度成交量:合计:吨:周度",
-        "主要集团:九三:豆油周度现货成交量:吨:周度",
-        "主要集团:中粮:豆油周度现货成交量:吨:周度",
-        "主要集团:中储粮:豆油周度现货成交量:吨:周度",
-        "主要集团:达孚:豆油周度现货成交量:吨:周度",
-        "主要集团:嘉吉:豆油周度现货成交量:吨:周度",
-        "主要集团:金光:豆油周度现货成交量:吨:周度",
-        "主要集团:邦基:豆油周度现货成交量:吨:周度",
-        "主要集团:益海:豆油周度现货成交量:吨:周度",
-        "主要集团:汇福:豆油周度现货成交量:吨:周度",
-        "主要集团:渤海:豆油周度现货成交量:吨:周度",
-        "主要集团:香驰:豆油周度现货成交量:吨:周度",
-        "主要集团:中海:豆油周度现货成交量:吨:周度",
-        "主要集团:其他:豆油周度现货成交量:吨:周度",
-        "主要集团:合计:豆油周度现货成交量:吨:周度",
-        "主要集团:九三:豆油周度基差成交量:吨:周度",
-        "主要集团:中粮:豆油周度基差成交量:吨:周度",
-        "主要集团:中储粮:豆油周度基差成交量:吨:周度",
-        "主要集团:达孚:豆油周度基差成交量:吨:周度",
-        "主要集团:嘉吉:豆油周度基差成交量:吨:周度",
-        "主要集团:金光:豆油周度基差成交量:吨:周度",
-        "主要集团:邦基:豆油周度基差成交量:吨:周度",
-        "主要集团:益海:豆油周度基差成交量:吨:周度",
-        "主要集团:汇福:豆油周度基差成交量:吨:周度",
-        "主要集团:渤海:豆油周度基差成交量:吨:周度",
-        "主要集团:香驰:豆油周度基差成交量:吨:周度",
-        "主要集团:中海:豆油周度基差成交量:吨:周度",
-        "主要集团:其他:豆油周度基差成交量:吨:周度",
-        "主要集团:合计:豆油周度基差成交量:吨:周度"
-      ]
-    }
-  },
-  "棕榈油": {
-    "国际价格": {
-      "国际棕榈油FOB报价及走势": [
-        "马来棕榈液油:FOB价格:美元/吨:日度",
-        "马来棕榈油:FOB价格:美元/吨:日度",
-        "马来棕榈硬脂:FOB价格:美元/吨:日度",
-        "印尼毛棕油:FOB价格:美元/吨:日度"
-      ]
-    },
-    "进口成本": {
-      "马来西亚棕榈油进口成本参考价": [
-        "棕榈液油(24度):运费:张家港:美元/吨:日度",
-        "棕榈液油(24度):CNF:张家港:美元/吨:日度",
-        "棕榈液油(24度):宗税价:张家港:美元/吨:日度",
-        "棕榈液油(24度):进口成本:张家港:元/吨:日度"
-      ]
-    },
-    "库存分析": {
-      "全国棕榈油库存与合同统计周报": [
-        "棕榈油:24度及以下库存:华北地区:万吨:周度",
-        "棕榈油:24度及以下库存:华东地区:万吨:周度",
-        "棕榈油:24度及以下库存:华南地区:万吨:周度",
-        "棕榈油:24度及以下库存:其他地区:万吨:周度",
-        "棕榈油:24度及以下库存:全国合计:万吨:周度",
-        "棕榈油:总库存:华北地区:万吨:周度",
-        "棕榈油:总库存:华东地区:万吨:周度",
-        "棕榈油:总库存:华南地区:万吨:周度",
-        "棕榈油:总库存:其他地区:万吨:周度",
-        "棕榈油:总库存:全国合计:万吨:周度",
-        "棕榈油:合同量:华北地区:万吨:周度",
-        "棕榈油:合同量:华东地区:万吨:周度",
-        "棕榈油:合同量:华南地区:万吨:周度",
-        "棕榈油:合同量:其他地区:万吨:周度",
-        "棕榈油:合同量:全国合计:万吨:周度"
-      ]
-    },
-    "每日成交": {
-      "棕榈油成交量及价格统计": [
-        "棕榈油成交量:华北:吨:日度",
-        "棕榈油成交量:山东:吨:日度",
-        "棕榈油成交量:江苏:吨:日度",
-        "棕榈油成交量:浙江:吨:日度",
-        "棕榈油成交量:福建:吨:日度",
-        "棕榈油成交量:广东:吨:日度",
-        "棕榈油成交量:广西:吨:日度",
-        "棕榈油成交量:其他:吨:日度",
-        "棕榈油成交量:合计:吨:日度",
-        "棕榈油周度成交量:华北:吨:日度",
-        "棕榈油周度成交量:山东:吨:日度",
-        "棕榈油周度成交量:江苏:吨:日度",
-        "棕榈油周度成交量:浙江:吨:日度",
-        "棕榈油周度成交量:福建:吨:日度",
-        "棕榈油周度成交量:广东:吨:日度",
-        "棕榈油周度成交量:广西:吨:日度",
-        "棕榈油周度成交量:其他:吨:日度",
-        "棕榈油周度成交量:合计:吨:日度",
-        "主要集团:中粮:豆油周度现货成交量:吨:周度",
-        "主要集团:金光:豆油周度现货成交量:吨:周度",
-        "主要集团:益海:豆油周度现货成交量:吨:周度",
-        "主要集团:来宝:豆油周度现货成交量:吨:周度",
-        "主要集团:合益荣:豆油周度现货成交量:吨:周度",
-        "主要集团:其他:豆油周度现货成交量:吨:周度",
-        "主要集团:总计:豆油周度现货成交量:吨:周度",
-        "主要集团:中粮:豆油周度基差成交量:吨:周度",
-        "主要集团:金光:豆油周度基差成交量:吨:周度",
-        "主要集团:益海:豆油周度基差成交量:吨:周度",
-        "主要集团:来宝:豆油周度基差成交量:吨:周度",
-        "主要集团:合益荣:豆油周度基差成交量:吨:周度",
-        "主要集团:其他:豆油周度基差成交量:吨:周度",
-        "主要集团:总计:豆油周度基差成交量:吨:周度"
-      ]
-    }
-  },
-  "油菜籽": {
-    "进口成本": {
-      "加拿大油菜籽理论进口成本": [
-        "加拿大油菜籽:期货收盘:广州港:美分/蒲式耳:日度",
-        "加拿大油菜籽:升贴水:广州港:美元/吨:日度",
-        "加拿大油菜籽:FOB价:广州港:美元/吨:日度",
-        "加拿大油菜籽:运费:广州港:美元/吨:日度",
-        "加拿大油菜籽:CNF升贴水:广州港:美元/吨:日度",
-        "加拿大油菜籽:CNF:广州港:美元/吨:日度",
-        "加拿大油菜籽:进口成本:广州港:元/吨:日度"
-      ]
-    },
-    "库存分析": {
-      "全国油厂进口油菜籽库存量统计周报": [
-        "全国油厂进口油菜籽库存量:广西地区:万吨:周度",
-        "全国油厂进口油菜籽库存量:广东地区:万吨:周度",
-        "全国油厂进口油菜籽库存量:福建地区:万吨:周度",
-        "全国油厂进口油菜籽库存量:江苏地区:万吨:周度",
-        "全国油厂进口油菜籽库存量:辽宁地区:万吨:周度",
-        "全国油厂进口油菜籽库存量:其他地区:万吨:周度",
-        "全国油厂进口油菜籽库存量:全国统计:万吨:周度"
-      ]
-    },
-    "进口预估": {
-      "进口油菜籽月度进口量预估": [
-        "进口油菜籽月度进口量预估:本年进口量:万吨:周度",
-        "进口油菜籽月度进口量预估:本年海关进口量:万吨:周度"
-      ]
-    },
-    "加拿大统计局": {
-      "加拿大双低油菜籽周度商业库存": [
-        "加拿大双低油菜籽:期初库存:万吨:周度",
-        "加拿大双低油菜籽:上市量:万吨:周度",
-        "加拿大双低油菜籽:出口量:万吨:周度",
-        "加拿大双低油菜籽:消费量:万吨:周度",
-        "加拿大双低油菜籽:期末库存:万吨:周度"
-      ]
-    },
-    "进出口分析": {
-      "油菜籽进口数量分析": [
-        "油菜籽进口量:万吨:月度"
-      ],
-      "油菜籽出口数量分析": [
-        "油菜籽出口量:吨:月度"
-      ]
-    }
-  },
-  "菜粕": {
-    "库存分析": {
-      "全国油厂进口压榨菜粕库存与合同统计周报": [
-        "全国油厂进口压榨菜粕库存量:广西地区:万吨:周度",
-        "全国油厂进口压榨菜粕库存量:广东地区:万吨:周度",
-        "全国油厂进口压榨菜粕库存量:福建地区:万吨:周度",
-        "全国油厂进口压榨菜粕库存量:江苏地区:万吨:周度",
-        "全国油厂进口压榨菜粕库存量:辽宁地区:万吨:周度",
-        "全国油厂进口压榨菜粕库存量:其他地区:万吨:周度",
-        "全国油厂进口压榨菜粕库存量:全国合计:万吨:周度",
-        "全国油厂进口压榨菜粕合同量:广西地区:万吨:周度",
-        "全国油厂进口压榨菜粕合同量:广东地区:万吨:周度",
-        "全国油厂进口压榨菜粕合同量:福建地区:万吨:周度",
-        "全国油厂进口压榨菜粕合同量:江苏地区:万吨:周度",
-        "全国油厂进口压榨菜粕合同量:辽宁地区:万吨:周度",
-        "全国油厂进口压榨菜粕合同量:其他地区:万吨:周度",
-        "全国油厂进口压榨菜粕合同量:全国合计:万吨:周度"
-
-      ]
-    },
-    "进出口分析": {
-      "菜粕出口数量分析": [
-        "菜粕出口数量:吨:月度"
-      ],
-      "菜粕进口数量分析": [
-        "菜粕进口数量:万吨:月度"
-      ]
-    }
-  },
-  "菜籽油": {
-    "库存分析": {
-      "全国油厂进口压榨菜油库存与合同统计周报": [
-        "全国油厂进口压榨菜油库存量:广西地区:万吨:周度",
-        "全国油厂进口压榨菜油库存量:广东地区:万吨:周度",
-        "全国油厂进口压榨菜油库存量:福建地区:万吨:周度",
-        "全国油厂进口压榨菜油库存量:江苏地区:万吨:周度",
-        "全国油厂进口压榨菜油库存量:辽宁地区:万吨:周度",
-        "全国油厂进口压榨菜油库存量:其他地区:万吨:周度",
-        "全国油厂进口压榨菜油库存量:全国合计:万吨:周度",
-        "全国油厂进口压榨菜油库存量:其中:非油企库存:万吨:周度",
-        "全国油厂进口压榨菜油库存量:油企库存:万吨:周度",
-        "全国油厂进口压榨菜油合同量:广西地区:万吨:周度",
-        "全国油厂进口压榨菜油合同量:广东地区:万吨:周度",
-        "全国油厂进口压榨菜油合同量:福建地区:万吨:周度",
-        "全国油厂进口压榨菜油合同量:江苏地区:万吨:周度",
-        "全国油厂进口压榨菜油合同量:辽宁地区:万吨:周度",
-        "全国油厂进口压榨菜油合同量:其他地区:万吨:周度",
-        "全国油厂进口压榨菜油合同量:全国合计:万吨:周度",
-        "全国油厂进口压榨菜油合同量:其中:非油企库存:万吨:周度",
-        "全国油厂进口压榨菜油合同量:油企库存:万吨:周度"
-      ]
-    },
-    "进口预估": {
-      "菜籽油月度进口量预估": [
-        "菜籽油月度进口量预估:本年进口量:万吨:周度",
-        "菜籽油月度进口量预估:本年海关进口量:万吨:周度"
-
-      ]
-    },
-    "每日成交": {
-      "菜籽油成交量及价格统计": [
-        "菜籽油成交量:东北:吨:日度",
-        "菜籽油成交量:华东:吨:日度",
-        "菜籽油成交量:福建:吨:日度",
-        "菜籽油成交量:广东:吨:日度",
-        "菜籽油成交量:广西:吨:日度",
-        "菜籽油成交量:其他:吨:日度",
-        "菜籽油成交量:合计:吨:日度",
-        "菜籽油成交量:华南合计:吨:日度",
-        "菜籽油成交量:华沿海合计:吨:日度",
-        "菜籽油周度成交量:东北:吨:周度",
-        "菜籽油周度成交量:华东:吨:周度",
-        "菜籽油周度成交量:福建:吨:周度",
-        "菜籽油周度成交量:广东:吨:周度",
-        "菜籽油周度成交量:广西:吨:周度",
-        "菜籽油周度成交量:其他:吨:周度",
-        "菜籽油周度成交量:合计:吨:周度",
-        "菜籽油周度成交量:华南合计:吨:周度",
-        "菜籽油周度成交量:华沿海合计:吨:周度",
-        "主要集团:营口嘉里:菜籽油周度现货成交量:吨:周度",
-        "主要集团:富之源:菜籽油周度现货成交量:吨:周度",
-        "主要集团:防城大海:菜籽油周度现货成交量:吨:周度",
-        "主要集团:防城澳加:菜籽油周度现货成交量:吨:周度",
-        "主要集团:成都中粮:菜籽油周度现货成交量:吨:周度",
-        "主要集团:其他:菜籽油周度现货成交量:吨:周度",
-        "主要集团:合计:菜籽油周度现货成交量:吨:周度",
-        "主要集团:营口嘉里:菜籽油周度基差成交量:吨:周度",
-        "主要集团:富之源:菜籽油周度基差成交量:吨:周度",
-        "主要集团:防城大海:菜籽油周度基差成交量:吨:周度",
-        "主要集团:防城澳加:菜籽油周度基差成交量:吨:周度",
-        "主要集团:成都中粮:菜籽油周度基差成交量:吨:周度",
-        "主要集团:其他:菜籽油周度基差成交量:吨:周度",
-        "主要集团:合计:菜籽油周度基差成交量:吨:周度"
-      ]
-    }
-  },
-  "葵花粕": {
-    "进口预估": {
-      "进口葵花粕月度进口量预估": [
-        "进口葵花粕月度进口量预估:本年进口量:万吨:周度",
-        "进口葵花粕月度进口量预估:本年海关进口量:万吨:周度"
+        "国内大豆加工量:河南省:万吨:周度",
+        "国内大豆加工量:湖北省:万吨:周度",
+        "国内大豆加工量:湖南省:万吨:周度",
+        "国内大豆加工量:黑龙江:万吨:周度",
+        "国内大豆加工量:吉林省:万吨:周度",
+        "国内大豆加工量:辽宁省:万吨:周度",
+        "国内大豆加工量:内蒙古:万吨:周度",
+        "国内大豆加工量:河北省:万吨:周度",
+        "国内大豆加工量:天津市:万吨:周度",
+        "国内大豆加工量:山西省:万吨:周度",
+        "国内大豆加工量:山东省:万吨:周度",
+        "国内大豆加工量:安徽省:万吨:周度",
+        "国内大豆加工量:江苏省:万吨:周度",
+        "国内大豆加工量:上海市:万吨:周度",
+        "国内大豆加工量:浙江省:万吨:周度",
+        "国内大豆加工量:福建省:万吨:周度",
+        "国内大豆加工量:广东省:万吨:周度",
+        "国内大豆加工量:广西省:万吨:周度",
+        "国内大豆加工量:海南省:万吨:周度",
+        "国内大豆加工量:陕西省:万吨:周度",
+        "国内大豆加工量:四川省:万吨:周度",
+        "国内大豆加工量:重庆市:万吨:周度",
+        "国内大豆加工量:云南省:万吨:周度",
+        "国内大豆加工量:合计:万吨:周度",
+        "国内大豆加工量:其中:国产:万吨:周度",
+        "国内大豆加工量:进口:万吨:周度",
+        "国内大豆开机率:河南省:%:周度",
+        "国内大豆开机率:湖北省:%:周度",
+        "国内大豆开机率:湖南省:%:周度",
+        "国内大豆开机率:黑龙江:%:周度",
+        "国内大豆开机率:吉林省:%:周度",
+        "国内大豆开机率:辽宁省:%:周度",
+        "国内大豆开机率:内蒙古:%:周度",
+        "国内大豆开机率:河北省:%:周度",
+        "国内大豆开机率:天津市:%:周度",
+        "国内大豆开机率:山西省:%:周度",
+        "国内大豆开机率:山东省:%:周度",
+        "国内大豆开机率:安徽省:%:周度",
+        "国内大豆开机率:江苏省:%:周度",
+        "国内大豆开机率:上海市:%:周度",
+        "国内大豆开机率:浙江省:%:周度",
+        "国内大豆开机率:福建省:%:周度",
+        "国内大豆开机率:广东省:%:周度",
+        "国内大豆开机率:广西省:%:周度",
+        "国内大豆开机率:海南省:%:周度",
+        "国内大豆开机率:陕西省:%:周度",
+        "国内大豆开机率:四川省:%:周度",
+        "国内大豆开机率:重庆市:%:周度",
+        "国内大豆开机率:云南省:%:周度",
+        "国内大豆开机率:合计:%:周度",
+        "国内大豆开机率:其中:国产:%:周度",
+        "国内大豆开机率:进口:%:周度"
       ]
     }
   }

+ 25 - 0
utils/date_util.go

@@ -0,0 +1,25 @@
+// @Author gmy 2024/8/6 16:06:00
+package utils
+
+import (
+	"fmt"
+	"strings"
+	"time"
+)
+
+// parseDateAndWeek 解析日期并计算当前周数
+func ParseDateAndWeek(dateText string) (string, error) {
+	// 解析日期
+	reportDate, err := time.Parse("2006-01-02", strings.TrimSpace(strings.Split(dateText, " ")[0]))
+	if err != nil {
+		return "", fmt.Errorf("failed to parse report date: %v", err)
+	}
+
+	// 计算年份和周数
+	year, week := reportDate.ISOWeek()
+	// 获取年份的后两位
+	shortYear := year % 100
+	targetWeek := fmt.Sprintf("%02d年第%d周", shortYear, week)
+
+	return targetWeek, nil
+}