zhangxinlei1996 пре 1 година
родитељ
комит
23ec6e89a8
15 измењених фајлова са 1604 додато и 27 уклоњено
  1. 6 3
      conf.go
  2. 19 6
      conf.json
  3. 45 0
      decode.go
  4. 129 0
      deduplication.go
  5. 72 0
      excel.go
  6. 20 4
      go.mod
  7. 258 7
      go.sum
  8. 8 3
      main.go
  9. 459 0
      map.json
  10. 6 0
      rule/kedaxunfei.json
  11. 390 0
      upzip.go
  12. 69 0
      util.go
  13. 5 3
      webdav.go
  14. 66 1
      yusuan.go
  15. 52 0
      zhengfumingxi.go

+ 6 - 3
conf.go

@@ -28,9 +28,12 @@ type Config struct {
 		User    string `json:"user"`
 		Sercert string `json:"sercert"`
 	} `json:"wangpan"`
-	YusuanInfo        string   `json:"yusuaninfo"`
-	ProjectItem       string   `json:"projectitem"`
-	Projectitem_field []string `json:"projectitem_field"`
+	YusuanInfo               string   `json:"yusuaninfo"`
+	ProjectItem              string   `json:"projectitem"`
+	Projectitem_field        []string `json:"projectitem_field"`
+	Collections              string   `json:"collections"`
+	Projectitem_field_mingxi []string `json:"projectitem_field_mingxi"`
+	Yusuan_mingxi            string   `json:"yusuan_mingxi"`
 }
 
 type UserConfig struct {

+ 19 - 6
conf.json

@@ -1,16 +1,16 @@
 {
     "database": {
         "host": "192.168.3.71:29099",
-        "dbname": "yusuan",
+        "dbname": "zxl",
         "dbsize": 2
     },
     "wangpan": {
-        "webdav": "http://192.168.3.71:35212/dav",
+        "webdav": "https://cloudreve.jydev.jianyu360.com/dav",
         "user": "jichunling@topnet.net.cn",
-        "sercert": ""
+        "sercert": "imq6aZfwvWdu9XRsd368uywaalD5Jgwf"
     },
-    "yusuaninfo": "fileitem",
-    "projectitem": "project_yusuan",
+    "yusuaninfo": "zxl_fileitem",
+    "projectitem": "zxl_project_yusuan",
     "projectitem_field": [
         "file_path",
         "file_type",
@@ -19,5 +19,18 @@
         "valid_document",
         "area",
         "city"
-    ]
+    ],
+    "collections":"zxl",
+    "projectitem_field_mingxi": [
+        "file_path",
+        "file_type",
+        "year",
+        "publish_org",
+        "valid_document",
+        "area",
+        "city",
+        "publish_org_type",
+        "handle"
+    ],
+    "yusuan_mingxi":"zxl_yusuan_purchasing"
 }

+ 45 - 0
decode.go

@@ -0,0 +1,45 @@
+package main
+
+import (
+	"fmt"
+
+	"github.com/axgle/mahonia"
+)
+
+func decodeFilename(filename string) (string, error) {
+	decoded, err := decodeUTF8(filename)
+	if err == nil {
+		return decoded, nil
+	}
+	// 如果解码失败,尝试其他编码
+	// 在此处添加其他编码的处理逻辑,例如GBK、Big5等。
+	// 如果您知道文件名的正确编码,请在此处进行相应的转换。
+	return filename, nil
+}
+
+func decodeUTF8(s string) (string, error) {
+	decoded, err := decodeString(s, "UTF-8")
+	if err != nil {
+		return "", err
+	}
+	return decoded, nil
+}
+
+func decodeString(s, enc string) (string, error) {
+	encodings := []string{enc, "GBK", "Big5"} // 根据需要添加其他编码
+	for _, encoding := range encodings {
+		decoded, err := decode(s, encoding)
+		if err == nil {
+			return decoded, nil
+		}
+	}
+	return s, fmt.Errorf("无法解码字符串:%s", s)
+}
+
+func decode(s, enc string) (string, error) {
+	dec := mahonia.NewDecoder(enc)
+	if dec == nil {
+		return "", fmt.Errorf("不支持的编码:%s", enc)
+	}
+	return dec.ConvertString(s), nil
+}

+ 129 - 0
deduplication.go

@@ -0,0 +1,129 @@
+package main
+
+import (
+	"crypto/sha256"
+	"encoding/hex"
+	"fmt"
+	"log"
+	"strings"
+
+	"app.yhyue.com/moapp/jybase/mongodb"
+	"github.com/PuerkitoBio/goquery"
+	"github.com/gogf/gf/v2/util/gconv"
+)
+
+//年份、项目名称、项目情况、绩效目标、实施单位 的哈希值
+func Hash(year, projectname, procure_content, kpi, institution string) string {
+	procure_content = CleanString(procure_content)
+	kpi = CleanString(kpi)
+	str := fmt.Sprintf("%s%s%s%s%s", year, projectname, procure_content, kpi, institution)
+	return HashCode(str)
+}
+
+//刷库 更新project_yusuan
+func UpdateProject_yusuan() {
+	sess := db.GetMgoConn()
+	defer db.DestoryMongoConn(sess)
+
+	it := sess.DB(cf.Collections).C(cf.ProjectItem).Find(nil).Select(map[string]interface{}{
+		"year":            1,
+		"projectname":     1,
+		"procure_content": 1,
+		"kpi":             1,
+		"institution":     1,
+		"_id":             1,
+		"hash_code":       1,
+	}).Iter()
+	i := 0
+	for m := make(map[string]interface{}); it.Next(&m); {
+		i++
+		if i%1000 == 0 {
+			log.Println("count:", i)
+		}
+		hash_code := gconv.String(m["hash_code"])
+		year := gconv.String(m["year"])
+		projectname := gconv.String(m["projectname"])
+		procure_content := gconv.String(m["procure_content"])
+		kpi := gconv.String(m["kpi"])
+		institution := gconv.String(m["institution"])
+		id := mongodb.BsonIdToSId(m["_id"])
+		//清洗
+		procure_content = CleanString(procure_content)
+		kpi = CleanString(kpi)
+		newHashCode := Hash(year, projectname, procure_content, kpi, institution)
+		//修改hash值
+		if hash_code != newHashCode {
+			db.UpdateById(cf.ProjectItem, id, map[string]interface{}{
+				"$set": map[string]interface{}{
+					"hash_code": newHashCode,
+				},
+			})
+		}
+
+		m = make(map[string]interface{})
+	}
+}
+
+//生成hashCode
+func HashCode(input string) string {
+	hash := sha256.Sum256([]byte(input))
+	hashString := hex.EncodeToString(hash[:])
+	return hashString
+}
+
+// 纯文本
+func HtmlToText(con string) string {
+	doc2, _ := goquery.NewDocumentFromReader(strings.NewReader(con))
+	//log.Println(doc2.Html())
+	doc2.Find("tr").Each(func(i int, selection *goquery.Selection) {
+		selection.AfterHtml(string(rune(10)))
+	})
+	//log.Println(doc2.Html())
+	return doc2.Text()
+}
+
+//刷库 更新project_yusuan
+func UpdateProject_huipu() {
+	huipudb := "zxl_project_huipu"
+
+	sess := db.GetMgoConn()
+	defer db.DestoryMongoConn(sess)
+
+	it := sess.DB(cf.Collections).C(huipudb).Find(nil).Select(map[string]interface{}{
+		"year":            1,
+		"projectname":     1,
+		"procure_content": 1,
+		"kpi":             1,
+		"institution":     1,
+		"_id":             1,
+		"hash_code":       1,
+	}).Iter()
+	i := 0
+	for m := make(map[string]interface{}); it.Next(&m); {
+		i++
+		if i%1000 == 0 {
+			log.Println("count:", i)
+		}
+		hash_code := gconv.String(m["hash_code"])
+		year := gconv.String(m["year"])
+		projectname := gconv.String(m["projectname"])
+		procure_content := gconv.String(m["procure_content"])
+		kpi := gconv.String(m["kpi"])
+		institution := gconv.String(m["institution"])
+		id := mongodb.BsonIdToSId(m["_id"])
+		//清洗
+		procure_content = CleanString(procure_content)
+		kpi = CleanString(kpi)
+		newHashCode := Hash(year, projectname, procure_content, kpi, institution)
+		//修改hash值
+		if hash_code != newHashCode {
+			db.UpdateById(huipudb, id, map[string]interface{}{
+				"$set": map[string]interface{}{
+					"hash_code": newHashCode,
+				},
+			})
+		}
+
+		m = make(map[string]interface{})
+	}
+}

+ 72 - 0
excel.go

@@ -0,0 +1,72 @@
+package main
+
+import (
+	"github.com/shopspring/decimal"
+
+	"github.com/gogf/gf/v2/util/gconv"
+	"github.com/xuri/excelize/v2"
+
+	"app.yhyue.com/moapp/jybase/mongodb"
+)
+
+func Excel() {
+	file := excelize.NewFile()
+	//设置表名
+	file.SetSheetName("Sheet1", "表1")
+	//创建流式写入
+	writer, err := file.NewStreamWriter("表1")
+	//修改列宽
+	writer.SetColWidth(1, 15, 12)
+	//设置表头
+	writer.SetRow("A1", []interface{}{"id", "文件交付时间", "层级", "省份", "城市", "项目名称", "项目情况", "采购内容/项目目标", "项目单位", "项目联系人", "联系电话", "	预算金额(万元)", "匹配关键词"})
+	if err != nil {
+		return
+	}
+	data, _ := db.Find("project_kedaxunfei_zxl", nil, nil, nil, false, -1, -1)
+	i := 1
+	m := map[string]bool{}
+	for _, v := range *data {
+		projectname := gconv.String(v["projectname"])
+		if m[projectname] {
+			continue
+		}
+
+		id := mongodb.BsonIdToSId(v["_id"])
+		area := gconv.String(v["area"])
+		city := gconv.String(v["city"])
+		procure_content := gconv.String(v["procure_content"])
+		kpi := gconv.String(v["kpi"])
+		institution := gconv.String(v["institution"])
+		phone := gconv.String(v["phone"])
+		budget_f := gconv.Float64(v["budget_f"])
+
+		matchkey := gconv.String(v["matchkey"])
+		unit := gconv.String(v["unit"])
+
+		if unit == "元" {
+			budget_f = convertToWan(budget_f)
+		}
+
+		m[projectname] = true
+		i++
+
+		//索引转单元格坐标
+		cell, _ := excelize.CoordinatesToCellName(1, i+1)
+		//添加的数据
+		writer.SetRow(cell, []interface{}{id, "", "", area, city, projectname, procure_content, kpi, institution, "", phone, budget_f, matchkey})
+	}
+	//结束流式写入
+	writer.Flush()
+	file.SaveAs("kedaxunfei.xlsx")
+}
+
+func convertToWan(amount float64) float64 {
+	amountDecimal := decimal.NewFromFloat(amount)
+	convertFactor := decimal.NewFromInt(10000)
+	convertedAmount := amountDecimal.Div(convertFactor)
+	convertedFloat, ok := convertedAmount.Float64()
+	if !ok {
+		return 0
+	}
+	return convertedFloat
+}

+ 20 - 4
go.mod

@@ -1,23 +1,39 @@
 module yusuan
 
-go 1.20
+go 1.19
 
 require (
+	app.yhyue.com/moapp/jybase v0.0.0-20240226084952-7e7b38ef8a66
+	github.com/PuerkitoBio/goquery v1.8.0
+	github.com/axgle/mahonia v0.0.0-20180208002826-3358181d7394
+	github.com/gogf/gf/v2 v2.7.0
+	github.com/nwaples/rardecode v1.1.3
+	github.com/shopspring/decimal v1.3.1
 	github.com/studio-b12/gowebdav v0.9.0
+	github.com/xuri/excelize/v2 v2.8.1
 	jygit.jydev.jianyu360.cn/data_processing/common_utils v0.0.0-20240202055658-e2ef72e18b40
 )
 
 require (
-	github.com/golang/snappy v0.0.1 // indirect
+	github.com/andybalholm/cascadia v1.3.1 // indirect
+	github.com/golang/snappy v0.0.4 // indirect
 	github.com/klauspost/compress v1.13.6 // indirect
+	github.com/mohae/deepcopy v0.0.0-20170929034955-c48cc78d4826 // indirect
 	github.com/montanaflynn/stats v0.0.0-20171201202039-1bf9dbcd8cbe // indirect
 	github.com/pkg/errors v0.9.1 // indirect
+	github.com/richardlehane/mscfb v1.0.4 // indirect
+	github.com/richardlehane/msoleps v1.0.3 // indirect
 	github.com/xdg-go/pbkdf2 v1.0.0 // indirect
 	github.com/xdg-go/scram v1.1.1 // indirect
 	github.com/xdg-go/stringprep v1.0.3 // indirect
+	github.com/xuri/efp v0.0.0-20231025114914-d1ff6096ae53 // indirect
+	github.com/xuri/nfp v0.0.0-20230919160717-d98342af3f05 // indirect
 	github.com/youmark/pkcs8 v0.0.0-20181117223130-1be2e3e5546d // indirect
 	go.mongodb.org/mongo-driver v1.10.1 // indirect
-	golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d // indirect
+	go.opentelemetry.io/otel v1.14.0 // indirect
+	go.opentelemetry.io/otel/trace v1.14.0 // indirect
+	golang.org/x/crypto v0.19.0 // indirect
+	golang.org/x/net v0.21.0 // indirect
 	golang.org/x/sync v0.0.0-20210220032951-036812b2e83c // indirect
-	golang.org/x/text v0.3.7 // indirect
+	golang.org/x/text v0.14.0 // indirect
 )

+ 258 - 7
go.sum

@@ -1,40 +1,105 @@
+app.yhyue.com/moapp/esv1 v0.0.0-20220414031211-3da4123e648d/go.mod h1:91/lSD/hS+ckMVP3WdidRzDhC60lLMdyce9QHy0cSMA=
+app.yhyue.com/moapp/jybase v0.0.0-20240226084952-7e7b38ef8a66 h1:kCRYqzclN4dtGuGC89ID2w5lGrJgqZC8bNL8mRR+tiU=
+app.yhyue.com/moapp/jybase v0.0.0-20240226084952-7e7b38ef8a66/go.mod h1:XHNATN6tsJKHdCB0DbUtFdPPHXexTUFyB3RlO+lUUoM=
 cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
+cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
 github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
+github.com/BurntSushi/toml v1.2.0 h1:Rt8g24XnyGTyglgET/PRUNlrUeu9F5L+7FilkXfZgs0=
 github.com/BurntSushi/toml v1.2.0/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ=
+github.com/PuerkitoBio/goquery v1.8.0 h1:PJTF7AmFCFKk1N6V6jmKfrNH9tV5pNE6lZMkG0gta/U=
 github.com/PuerkitoBio/goquery v1.8.0/go.mod h1:ypIiRMtY7COPGk+I/YbZLbxsxn9g5ejnI2HSMtkjZvI=
+github.com/RoaringBitmap/roaring v1.5.0/go.mod h1:plvDsJQpxOC5bw8LRteu/MLWHsHez/3y6cubLI4/1yE=
+github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=
+github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=
+github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=
+github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=
+github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho=
+github.com/andybalholm/cascadia v1.3.1 h1:nhxRkql1kdYCc8Snf7D5/D3spOX+dBgjA6u8x004T2c=
 github.com/andybalholm/cascadia v1.3.1/go.mod h1:R4bJ1UQfqADjvDa4P6HZHLh/3OxWWEqc0Sk8XGwHqvA=
+github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY=
+github.com/aws/aws-sdk-go v1.35.20/go.mod h1:tlPOdRjfxPBpNIwqDj61rmsnA85v9jc0Ps9+muhnW+k=
 github.com/aws/aws-sdk-go v1.43.21/go.mod h1:y4AeaBuwd2Lk+GepC1E9v0qOiTws0MIWAX4oIKwKHZo=
+github.com/axgle/mahonia v0.0.0-20180208002826-3358181d7394 h1:OYA+5W64v3OgClL+IrOD63t4i/RW7RqrAVl9LTZ9UqQ=
+github.com/axgle/mahonia v0.0.0-20180208002826-3358181d7394/go.mod h1:Q8n74mJTIgjX4RBBcHnJ05h//6/k6foqmgE45jTQtxg=
 github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA=
+github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q=
+github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8=
+github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw=
+github.com/bits-and-blooms/bitset v1.2.0/go.mod h1:gIdJ4wp64HaoK2YrL1Q5/N7Y16edYb8uY+O0FJTyyDA=
 github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=
+github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
+github.com/clbanning/mxj/v2 v2.7.0 h1:WA/La7UGCanFe5NpHF0Q3DNtnCsVoxbPKuyBNHWRyME=
 github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=
 github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc=
+github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk=
+github.com/cncf/udpa/go v0.0.0-20210930031921-04548b0d99d4/go.mod h1:6pvJx4me5XPnfI9Z40ddWsdw2W/uZgQLFXToKeRcDiI=
+github.com/cncf/xds/go v0.0.0-20210922020428-25de7278fc84/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs=
+github.com/cncf/xds/go v0.0.0-20211001041855-01bcc9b48dfe/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs=
+github.com/cncf/xds/go v0.0.0-20211011173535-cb28da3451f1/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs=
+github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk=
+github.com/coreos/go-systemd/v22 v22.3.2/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc=
+github.com/coscms/tagfast v0.0.0-20150925144250-2b69b2496250/go.mod h1:zX8vynptAghuV/KG8BOZlDeo4DsTKWfBQ154RWlkay0=
+github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=
 github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
 github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
 github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
 github.com/dchest/captcha v1.0.0/go.mod h1:7zoElIawLp7GUMLcj54K9kbw+jEyvz2K0FDdRRYhvWo=
+github.com/donnie4w/go-logger v0.0.0-20170827050443-4740c51383f4/go.mod h1:L7S4x0R7vv3xoOhGuyAJyCO2MYzWOpccM4Isn8jIUgY=
+github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk=
 github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=
 github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=
 github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98=
+github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk=
+github.com/envoyproxy/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk=
+github.com/envoyproxy/go-control-plane v0.10.2-0.20220325020618-49ff273808a1/go.mod h1:KJwIaB5Mv44NWtYuAOFCVOjcI94vtpEz2JU/D2v6IjE=
 github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=
+github.com/fatih/color v1.15.0 h1:kOqh6YHBtK8aywxGerMG2Eq3H6Qgoqeo13Bk2Mv/nBs=
 github.com/fortytw2/leaktest v1.3.0/go.mod h1:jDsjWgpAGjm2CA7WthBh/CdZYEPF31XHquHwclZch5g=
+github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ=
+github.com/fsnotify/fsnotify v1.7.0 h1:8JEhPFa5W2WU7YfeZzPNqzMP6Lwt7L2715Ggo0nosvA=
+github.com/garyburd/redigo v1.6.2/go.mod h1:NR3MbYisc3/PwhQ00EMzDiPmrwpPxAn5GI05/YaO1SY=
+github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04=
+github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=
+github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=
+github.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY=
+github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE=
+github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk=
+github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A=
 github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=
+github.com/go-logr/logr v1.2.3 h1:2DntVwHkVopvECVRSlL5PSo9eG+cAkDCuckLubN+rq0=
+github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag=
 github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE=
+github.com/go-sql-driver/mysql v1.5.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg=
 github.com/go-sql-driver/mysql v1.6.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg=
+github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY=
+github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA=
+github.com/gogf/gf/v2 v2.7.0 h1:CjxhbMiE7oqf6K8ZtGuKt3dQEwK4vL6LhiI+dI7tJGU=
+github.com/gogf/gf/v2 v2.7.0/go.mod h1:Qu8nimKt9aupJQcdUL85tWF4Mfxocz97zUt8UC4abVI=
+github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ=
+github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q=
+github.com/golang-jwt/jwt/v4 v4.4.2/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0=
 github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=
+github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
 github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
 github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
 github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=
 github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
+github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
 github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
+github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw=
 github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8=
 github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA=
 github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs=
 github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w=
 github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0=
 github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8=
+github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=
 github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=
-github.com/golang/snappy v0.0.1 h1:Qgr9rKW7uDUkrbSmQeiDsGa8SjGyCOGtuasMWwvp2P4=
+github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk=
+github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=
 github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
+github.com/golang/snappy v0.0.4 h1:yAGX7huGHXlcLOEtBnF4w7FQwA26wojNCwOYAEhLjQM=
+github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
 github.com/gomodule/redigo v1.8.9/go.mod h1:7ArFNvsTjH8GMMzB4uy1snslv2BwmginuMs06a1uzZE=
 github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=
 github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
@@ -43,127 +108,293 @@ github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/
 github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
 github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
 github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
-github.com/google/go-cmp v0.5.7 h1:81/ik6ipDQS2aGcBfIN5dHDB36BwrStyeAQquSYCV4o=
+github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
+github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
+github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
 github.com/google/go-cmp v0.5.7/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8/DtOE=
+github.com/google/go-cmp v0.5.8/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
+github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38=
+github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
 github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
+github.com/gorilla/websocket v1.5.0 h1:PPwGk2jz7EePpoHN/+ClbZu8SPxiqlu12wZP/3sWmnc=
+github.com/grokify/html-strip-tags-go v0.0.1 h1:0fThFwLbW7P/kOiTBs03FsJSV9RM2M/Q/MOnCQxKMo0=
+github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk=
+github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw=
+github.com/howeyc/fsnotify v0.9.0/go.mod h1:41HzSPxBGeFRQKEEwgh49TRw/nKBsYZ2cF1OzPjSJsA=
+github.com/jinzhu/inflection v1.0.0/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkryuEj+Srlc=
+github.com/jinzhu/now v1.1.1/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8=
 github.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo=
 github.com/jmespath/go-jmespath/internal/testify v1.5.1/go.mod h1:L3OGu8Wl2/fWfCI6z80xFu9LTZmf1ZRjMHUOPmWr69U=
 github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y=
+github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4=
+github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU=
+github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=
+github.com/json-iterator/go v1.1.11/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=
+github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w=
+github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM=
+github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8=
+github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=
 github.com/klauspost/compress v1.13.6 h1:P76CopJELS0TiO2mebmnzgWaajssP/EszplttgQxcgc=
 github.com/klauspost/compress v1.13.6/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk=
+github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
+github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
+github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc=
 github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
+github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=
 github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
 github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
+github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=
+github.com/magiconair/properties v1.8.6 h1:5ibWZ6iY0NctNGWo87LalDlEZ6R41TqbbDamhfG/Qzo=
+github.com/mailru/easyjson v0.7.6/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc=
 github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc=
+github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA=
+github.com/mattn/go-isatty v0.0.17 h1:BTarxUcIeDqL27Mc+vyvdWYSL28zpIhv3RoTdsLMPng=
+github.com/mattn/go-runewidth v0.0.9 h1:Lm995f3rfxdpd6TSmuVCHVb/QhupuXlYr8sCI/QdE+0=
+github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0=
+github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
+github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
+github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=
+github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=
+github.com/mohae/deepcopy v0.0.0-20170929034955-c48cc78d4826 h1:RWengNIwukTxcDr9M+97sNutRR1RKhG96O6jWumTTnw=
+github.com/mohae/deepcopy v0.0.0-20170929034955-c48cc78d4826/go.mod h1:TaXosZuwdSHYgviHp1DAtfrULt5eUgsSMsZf+YrPgl8=
 github.com/montanaflynn/stats v0.0.0-20171201202039-1bf9dbcd8cbe h1:iruDEfMl2E6fbMZ9s0scYfZQ84/6SPL6zC8ACM2oIL0=
 github.com/montanaflynn/stats v0.0.0-20171201202039-1bf9dbcd8cbe/go.mod h1:wL8QJuTMNUDYhXwkmfOly8iTdp5TEcJFWZD2D7SIkUc=
+github.com/mschoch/smat v0.2.0/go.mod h1:kc9mz7DoBKqDyiRL7VZN8KvXQMWeTaVnttLRXOlotKw=
+github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=
+github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=
 github.com/nsqio/go-nsq v1.1.0/go.mod h1:vKq36oyeVXgsS5Q8YEO7WghqidAVXQlcFxzQbQTuDEY=
+github.com/nwaples/rardecode v1.1.3 h1:cWCaZwfM5H7nAD6PyEdcVnczzV8i/JtotnyW/dD9lEc=
+github.com/nwaples/rardecode v1.1.3/go.mod h1:5DzqNKiOdpKKBH87u8VlvAnPZMXcGRhxWkRpHbbfGS0=
+github.com/olekukonko/tablewriter v0.0.5 h1:P2Ga83D34wi1o9J6Wh1mRuqd4mF/x/lgBS7N7AbDhec=
+github.com/olivere/elastic v6.2.37+incompatible/go.mod h1:J+q1zQJTgAz9woqsbVRqGeB5G1iqDKVBWLNSYW8yfJ8=
+github.com/olivere/elastic/v7 v7.0.22/go.mod h1:VDexNy9NjmtAkrjNoI7tImv7FR4tf5zUA3ickqu5Pc8=
 github.com/olivere/elastic/v7 v7.0.32/go.mod h1:c7PVmLe3Fxq77PIfY/bZmxY/TAamBhCzZ8xDOE09a9k=
 github.com/opentracing/opentracing-go v1.2.0/go.mod h1:GxEUsuufX4nBwe+T+Wl9TAgYrxe9dPLANfrWvHYVTgc=
+github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
 github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
 github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
 github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
 github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
 github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
+github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw=
+github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo=
+github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M=
+github.com/prometheus/client_golang v1.11.1/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0=
+github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo=
+github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
 github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
+github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
+github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4=
+github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo=
+github.com/prometheus/common v0.26.0/go.mod h1:M7rCNAaPfAosfx8veZJCuw84e35h3Cfd9VFqTh1DIvc=
+github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk=
+github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA=
+github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU=
+github.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA=
+github.com/richardlehane/mscfb v1.0.4 h1:WULscsljNPConisD5hR0+OyZjwK46Pfyr6mPu5ZawpM=
+github.com/richardlehane/mscfb v1.0.4/go.mod h1:YzVpcZg9czvAuhk9T+a3avCpcFPMUWm7gK3DypaEsUk=
+github.com/richardlehane/msoleps v1.0.1/go.mod h1:BWev5JBpU9Ko2WAgmZEuiz4/u3ZYTKbjLycmwiWUfWg=
+github.com/richardlehane/msoleps v1.0.3 h1:aznSZzrwYRl3rLKRT3gUk9am7T/mLNSnJINvN0AQoVM=
+github.com/richardlehane/msoleps v1.0.3/go.mod h1:BWev5JBpU9Ko2WAgmZEuiz4/u3ZYTKbjLycmwiWUfWg=
+github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ=
+github.com/shopspring/decimal v1.3.1 h1:2Usl1nmF/WZucqkFZhnfFYxxxu8LG21F6nPQBE5gKV8=
+github.com/shopspring/decimal v1.3.1/go.mod h1:DKyhrW/HYNuLGql+MJL6WCR6knT2jwCFRcu2hWCYk4o=
+github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo=
+github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE=
+github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88=
 github.com/smartystreets/assertions v1.1.1/go.mod h1:tcbTF8ujkAEcZ8TElKY+i30BzYlVhC/LOxJk7iOWnoo=
 github.com/smartystreets/go-aws-auth v0.0.0-20180515143844-0c1422d1fdb9/go.mod h1:SnhjPscd9TpLiy1LpzGSKh3bXCfxxXuqd9xmQJy3slM=
 github.com/smartystreets/gunit v1.4.2/go.mod h1:ZjM1ozSIMJlAz/ay4SG8PeKF00ckUp+zMHZXV9/bvak=
 github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
+github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
+github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=
+github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
 github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
+github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=
+github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA=
 github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
-github.com/stretchr/testify v1.7.0 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5CcY=
 github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
+github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
+github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=
+github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk=
 github.com/studio-b12/gowebdav v0.9.0 h1:1j1sc9gQnNxbXXM4M/CebPOX4aXYtr7MojAVcN4dHjU=
 github.com/studio-b12/gowebdav v0.9.0/go.mod h1:bHA7t77X/QFExdeAnDzK6vKM34kEZAcE1OX4MfiwjkE=
 github.com/tidwall/pretty v1.0.0 h1:HsD+QiTn7sK6flMKIvNmpqz1qrpP3Ps6jOKIKMooyg4=
 github.com/tidwall/pretty v1.0.0/go.mod h1:XNkn88O1ChpSDQmQeStsy+sBenx6DDtFZJxhVysOjyk=
 github.com/xdg-go/pbkdf2 v1.0.0 h1:Su7DPu48wXMwC3bs7MCNG+z4FhcyEuz5dlvchbq0B0c=
 github.com/xdg-go/pbkdf2 v1.0.0/go.mod h1:jrpuAogTd400dnrH08LKmI/xc1MbPOebTwRqcT5RDeI=
+github.com/xdg-go/scram v1.0.2/go.mod h1:1WAq6h33pAW+iRreB34OORO2Nf7qel3VV3fjBj+hCSs=
 github.com/xdg-go/scram v1.1.1 h1:VOMT+81stJgXW3CpHyqHN3AXDYIMsx56mEFrB37Mb/E=
 github.com/xdg-go/scram v1.1.1/go.mod h1:RaEWvsqvNKKvBPvcKeFjrG2cJqOkHTiyTpzz23ni57g=
+github.com/xdg-go/stringprep v1.0.2/go.mod h1:8F9zXuvzgwmyT5DUm4GUfZGDdT3W+LCvS6+da4O5kxM=
 github.com/xdg-go/stringprep v1.0.3 h1:kdwGpVNwPFtjs98xCGkHjQtGKh86rDcRZN17QEMCOIs=
 github.com/xdg-go/stringprep v1.0.3/go.mod h1:W3f5j4i+9rC0kuIEJL0ky1VpHXQU3ocBgklLGvcBnW8=
+github.com/xuri/efp v0.0.0-20231025114914-d1ff6096ae53 h1:Chd9DkqERQQuHpXjR/HSV1jLZA6uaoiwwH3vSuF3IW0=
+github.com/xuri/efp v0.0.0-20231025114914-d1ff6096ae53/go.mod h1:ybY/Jr0T0GTCnYjKqmdwxyxn2BQf2RcQIIvex5QldPI=
+github.com/xuri/excelize/v2 v2.8.1 h1:pZLMEwK8ep+CLIUWpWmvW8IWE/yxqG0I1xcN6cVMGuQ=
+github.com/xuri/excelize/v2 v2.8.1/go.mod h1:oli1E4C3Pa5RXg1TBXn4ENCXDV5JUMlBluUhG7c+CEE=
+github.com/xuri/nfp v0.0.0-20230919160717-d98342af3f05 h1:qhbILQo1K3mphbwKh1vNm4oGezE1eF9fQWmNiIpSfI4=
+github.com/xuri/nfp v0.0.0-20230919160717-d98342af3f05/go.mod h1:WwHg+CVyzlv/TX9xqBFXEZAuxOPxn2k1GNHwG41IIUQ=
+github.com/yl2chen/cidranger v1.0.2/go.mod h1:9U1yz7WPYDwf0vpNWFaeRh0bjwz5RVgRy/9UEQfHl0g=
 github.com/youmark/pkcs8 v0.0.0-20181117223130-1be2e3e5546d h1:splanxYIlg+5LfHAM6xpdFEAYOk8iySO56hMFq6uLyA=
 github.com/youmark/pkcs8 v0.0.0-20181117223130-1be2e3e5546d/go.mod h1:rHwXgn7JulP+udvsHwJoVG1YGAP6VLg4y9I5dyZdqmA=
+github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
+github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
 github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=
+go.etcd.io/etcd/api/v3 v3.5.4/go.mod h1:5GB2vv4A4AOn3yk7MftYGHkUfGtDHnEraIjym4dYz5A=
+go.etcd.io/etcd/client/pkg/v3 v3.5.4/go.mod h1:IJHfcCEKxYu1Os13ZdwCwIUTUVGYTSAM3YSwc9/Ac1g=
+go.etcd.io/etcd/client/v3 v3.5.4/go.mod h1:ZaRkVgBZC+L+dLCjTcF1hRXpgZXQPOvnA/Ak/gq3kiY=
+go.mongodb.org/mongo-driver v1.9.1/go.mod h1:0sQWfOeY63QTntERDJJ/0SuKK0T1uVSgKCuAROlKEPY=
 go.mongodb.org/mongo-driver v1.10.1 h1:NujsPveKwHaWuKUer/ceo9DzEe7HIj1SlJ6uvXZG0S4=
 go.mongodb.org/mongo-driver v1.10.1/go.mod h1:z4XpeoU6w+9Vht+jAFyLgVrD+jGSQQe0+CBWFHNiHt8=
+go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk=
 go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E=
 go.opentelemetry.io/otel v1.5.0/go.mod h1:Jm/m+rNp/z0eqJc74H7LPwQ3G87qkU/AnnAydAjSAHk=
+go.opentelemetry.io/otel v1.14.0 h1:/79Huy8wbf5DnIPhemGB+zEPVwnN6fuQybr/SRXa6hM=
+go.opentelemetry.io/otel v1.14.0/go.mod h1:o4buv+dJzx8rohcUeRmWUZhqupFvzWis188WlggnNeU=
+go.opentelemetry.io/otel/sdk v1.14.0 h1:PDCppFRDq8A1jL9v6KMI6dYesaq+DFcDZvjsoGvxGzY=
 go.opentelemetry.io/otel/trace v1.5.0/go.mod h1:sq55kfhjXYr1zVSyexg0w1mpa03AYXR5eyTkB9NPPdE=
+go.opentelemetry.io/otel/trace v1.14.0 h1:wp2Mmvj41tDsyAJXiWDWpfNsOiIyd38fy85pyKcFq/M=
+go.opentelemetry.io/otel/trace v1.14.0/go.mod h1:8avnQLK+CG77yNLUae4ea2JDQ6iT+gozhnZjy/rw9G8=
+go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI=
 go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc=
+go.uber.org/atomic v1.9.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc=
 go.uber.org/goleak v1.1.11/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ=
+go.uber.org/goleak v1.1.12/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ=
 go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU=
+go.uber.org/multierr v1.8.0/go.mod h1:7EAYxJLBy9rStEaz58O2t4Uvip6FSURkq8/ppBp95ak=
+go.uber.org/zap v1.17.0/go.mod h1:MXVU+bhUf/A7Xi2HNOnopQOrmycQ5Ih87HtOu4q5SSo=
+go.uber.org/zap v1.21.0/go.mod h1:wjWOCqI0f2ZZrJF/UufIOkiC8ii6tm1iqIsLo76RfJw=
 go.uber.org/zap v1.22.0/go.mod h1:H4siCOZOrAolnUPJEkfaSjDqyP+BDS0DdDWzwcgt3+U=
+golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
 golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
 golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
 golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
-golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d h1:sK3txAijHtOK88l68nt020reeT1ZdKLIYetKl95FzVY=
+golang.org/x/crypto v0.0.0-20201216223049-8b5274cf687f/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I=
+golang.org/x/crypto v0.0.0-20210920023735-84f357641f63/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
 golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4=
+golang.org/x/crypto v0.19.0 h1:ENy+Az/9Y1vSrlrvBSyna3PITt4tiZLf7sgCjZBX7Wo=
+golang.org/x/crypto v0.19.0/go.mod h1:Iy9bg/ha4yyC70EfRS8jz+B6ybOBKMaSxLj6P6oBDfU=
 golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
+golang.org/x/image v0.14.0 h1:tNgSxAFe3jC4uYqvZdTr84SZoM1KfwdC9SKIFrLjFn4=
 golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
 golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU=
 golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
 golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
+golang.org/x/lint v0.0.0-20210508222113-6edffad5e616/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=
+golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=
+golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
+golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
 golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
 golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
 golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
+golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
+golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
 golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
 golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
 golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
+golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
 golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
+golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
+golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
+golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
+golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
+golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
 golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
+golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
 golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM=
 golang.org/x/net v0.0.0-20210916014120-12bc252f5db8/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
 golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
-golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd h1:O7DYs+zxREGLKzKoMQrtrEacpb0ZVXA5rIwylE2Xchk=
 golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk=
+golang.org/x/net v0.0.0-20220531201128-c960675eff93/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=
+golang.org/x/net v0.21.0 h1:AQyQV4dYCvJ7vGmJyKki9+PBdyvhkSd8EIx/qb0AYv4=
+golang.org/x/net v0.21.0/go.mod h1:bIjVDfnllIU7BJ2DNgfnXvpSvtn8VRwhlsaeUTyUS44=
 golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
+golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
+golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
 golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
 golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
 golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
 golang.org/x/sync v0.0.0-20210220032951-036812b2e83c h1:5KslGYwFpkhGh+Q16bwMP3cOontH8FOep7tGV86Y7SQ=
 golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
 golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
+golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
+golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
 golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
 golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20210403161142-5e06dd20ab57/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.0.0-20210603081109-ebe580a85c40/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.17.0 h1:25cE3gD+tdBA7lp7QfhuV+rJiE9YXTcS3VG1SqssI/Y=
+golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw=
 golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
 golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
 golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
+golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=
 golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
+golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
 golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
-golang.org/x/text v0.3.7 h1:olpwvP2KacW1ZWvsR7uQhoyTYvKAupfQrRGBFM352Gk=
 golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=
+golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ=
+golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU=
 golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
 golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
 golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY=
 golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
 golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=
+golang.org/x/tools v0.0.0-20190531172133-b3315ee88b7d/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
 golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
+golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
+golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
+golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
+golang.org/x/tools v0.1.2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=
 golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=
 golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
 golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
 golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
-golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 h1:go1bK/D/BFZV2I8cIQd1NKEZ+0owSTG1fDTci4IqFcE=
 golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
 google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=
 google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
 google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=
+google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
 google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=
+google.golang.org/genproto v0.0.0-20200513103714-09dca8ec2884/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
 google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo=
+google.golang.org/genproto v0.0.0-20210602131652-f16073e35f0c/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0=
+google.golang.org/genproto v0.0.0-20220602131408-e326c6e8e9c8/go.mod h1:yKyY4AMRwFiC8yMMNaMi+RkCnjZJt9LoWuvhXjMs+To=
 google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=
+google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38=
 google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg=
 google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY=
 google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=
+google.golang.org/grpc v1.33.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTpR3n0=
 google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc=
+google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU=
+google.golang.org/grpc v1.38.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM=
+google.golang.org/grpc v1.46.2/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk=
+google.golang.org/grpc v1.47.0/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk=
 google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8=
 google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0=
 google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM=
@@ -173,16 +404,36 @@ google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2
 google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
 google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
 google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=
+google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw=
+google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=
+google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=
+google.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=
+gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw=
+gopkg.in/alexcesaro/quotedprintable.v3 v3.0.0-20150716171945-2caba252f4dc/go.mod h1:m7x9LTH6d71AHyAX77c9yqWCCa3UKHcVEj9y7hAtKDk=
 gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
 gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
+gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
+gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q=
+gopkg.in/gomail.v2 v2.0.0-20160411212932-81ebce5c23df/go.mod h1:LRQQ+SO6ZHR7tOkpBDuZnXENFzX8qRjMDMyPD6BRkCw=
 gopkg.in/mgo.v2 v2.0.0-20190816093944-a6b53ec6cb22/go.mod h1:yeKp02qBN3iKW1OzL3MGk2IdtZzaj7SFntXj72NppTA=
 gopkg.in/natefinch/lumberjack.v2 v2.0.0/go.mod h1:l0ndWWf7gzL7RNwBG7wST/UCcT4T24xpD6X8LsfU/+k=
+gopkg.in/natefinch/lumberjack.v2 v2.2.1/go.mod h1:YD8tP3GAjkrDg1eZH7EGmyESg/lsYskCTPBJVb9jqSc=
+gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
+gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
+gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
+gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
+gopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
 gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
+gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
 gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=
 gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
+gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
 gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
 gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
+gorm.io/driver/mysql v1.0.5/go.mod h1:N1OIhHAIhx5SunkMGqWbGFVeh4yTNWKmMo1GOAsohLI=
+gorm.io/gorm v1.21.3/go.mod h1:0HFTzE/SqkGTzK6TlDPPQbAYCluiVvhzoA1+aVyzenw=
 honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
 honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
 jygit.jydev.jianyu360.cn/data_processing/common_utils v0.0.0-20240202055658-e2ef72e18b40 h1:xTeRmpFgwOdu+NbWg/YntX3MnQpttm7jj33C1+JdBTk=
 jygit.jydev.jianyu360.cn/data_processing/common_utils v0.0.0-20240202055658-e2ef72e18b40/go.mod h1:1Rp0ioZBhikjXHYYXmnzL6RNfvTDM/2XvRB+vuPLurI=
+sigs.k8s.io/yaml v1.2.0/go.mod h1:yfXDCHCao9+ENCvLSE62v9VSji2MKu5jeNfTrofGhJc=

+ 8 - 3
main.go

@@ -8,15 +8,17 @@ import (
 )
 
 func main() {
+
 	// 使用for循环不断接收用户输入的指令
 	for {
 		// 定义一个变量存储输入的指令
 		var command string
 		fmt.Println("请输入指令:\n",
 			"0、更新fileitme目录\n",
-			"1、从fileitme表中获取所有项目数据(请先手动清除project_yusuan数据信息)\n",
-			"2、从project_yusuan表中匹配客户数据(请输入对应客户配置文件名称)\n",
-			"3、退出程序")
+			"1、从fileitme表中获取所有项目数据(请先手动清除yusuan_project数据信息)\n",
+			"2、从yusuan_project表中匹配客户数据(请输入对应客户配置文件名称)\n",
+			"3、从fileitme表中获取所有项目数据(请先手动清除yusuan_purchasing数据信息)\n",
+			"99、退出程序")
 		fmt.Scanln(&command)
 
 		// 根据输入的指令选择相应的操作
@@ -50,6 +52,9 @@ func main() {
 			getCustomerMatchProject()
 			fmt.Println("任务已执行完成")
 		case "3":
+			getYusuanPurchasing()
+			fmt.Println("任务已执行完成")
+		case "99":
 			fmt.Println("退出程序")
 			return // 退出程序
 		default:

+ 459 - 0
map.json

@@ -0,0 +1,459 @@
+{
+    "中央/中央": "https://www.gov.cn/zhuanti/zybmjs/zybmjs.htm",
+    "北京/北京": "https://www.beijing.gov.cn/gongkai/caizheng/czxx/sjbmys/",
+    "北京/东城区": "https://www.bjdch.gov.cn/zwgk/jgdh/qzfzcbmdh/qczj/dcqcz/czyjsbg/",
+    "北京/西城区": "https://www.bjxch.gov.cn/zt/yjs/index.html",
+    "北京/朝阳区": "http://www.bjchy.gov.cn/affair/caizhengsz/czyjs/",
+    "北京/丰台区": "http://www.bjft.gov.cn/ftq/yjsxx/yjsxx.shtml",
+    "北京/石景山区": "https://www.bjsjs.gov.cn/gongkai/zwgkpd/zdly_1960/csxx_1980/",
+    "北京/海淀区": "https://zyk.bjhd.gov.cn/zwdt/xxgk/ygcz/",
+    "北京/门头沟区": "https://www.bjmtg.gov.cn/11J000/2024ysxxgk/yjsxxgk.shtml",
+    "北京/房山区": "https://www.bjfsh.gov.cn/ztzx/2022/ysjs/",
+    "北京/通州区": "https://www.bjtzh.gov.cn/bjtz/c102935/common_list.shtml",
+    "北京/顺义区": "https://www.bjshy.gov.cn/web/zwgk/czsj/index.html",
+    "北京/昌平区": "http://www.bjchp.gov.cn/cpqzf/xxgk2671/zdlyxxgk57/cpqysjs/cp5746402/index.html",
+    "北京/大兴区": "https://www.bjdx.gov.cn/bjsdxqrmzf/zwfw/zdly/yjs/index.html",
+    "北京/怀柔区": "https://www.bjhr.gov.cn/zfxxgkzl/fdzdgknr/ysjs/",
+    "北京/平谷区": "https://www.bjpg.gov.cn/pgqrmzf/bm/czj/czsz/index.html",
+    "北京/密云区": "https://www.bjmy.gov.cn/zwgk/zfxxgk/fdzdgknr/ysjs/index.html",
+    "北京/延庆区": "http://www.bjyq.gov.cn/yanqing/zwgk/czxx/index.shtml",
+    "天津/天津": "https://www.tj.gov.cn/zwgk/zfxxgkzl/fdzdgknr/czyjs/",
+    "天津/河西区": "https://www.tjhx.gov.cn/zwgk/zfxxgk/fdzdgknr/czyjs/",
+    "天津/和平区": "https://www.tjhp.gov.cn/zw/zfxxgk/fdzdgknr/czyjs/",
+    "天津/河东区": "https://www.tjhd.gov.cn/zwgk/zfxxgk/zfxxgkqzf/hz/fdzdgknr41/czyjs41/czys117541/",
+    "天津/南开区": "https://www.tjnk.gov.cn/NKQZF/ZWGK5712/zfxxgkqzf/hz1/fdzdgknr1/czyjs1/zfys94551/",
+    "天津/河北区": "http://www.tjhb.gov.cn/zwgk/zfxxgk/zfxxgkqzf/hz/fdzdgknr1/czyjs1/czys112092/",
+    "天津/红桥区": "http://www.tjhq.gov.cn/zwgk/zfxxgkqzf/hz/fdzdgknr1/czyjs1/zfys87553/",
+    "天津/东丽区": "https://www.tjdl.gov.cn/gongkai/zfxxgkzl/gknr/czyjs/",
+    "天津/西青区": "https://www.tjxq.gov.cn/zwgk/zfxxgk/fdzdgknr/czyjs/",
+    "天津/津南区": "https://www.tjjn.gov.cn/zwgk/zfxxgkqzf/hz/fdzdgknr0/czyjs0/zfys77672/",
+    "天津/北辰区": "https://www.tjbc.gov.cn/zwgk/zfxxgk/xxgk_fdzdgk/xxgk_czyjs/",
+    "天津/武清区": "https://www.tjwq.gov.cn/zwgk/zfxxgk/zfxxgkqzf/hz/fdzdgknr1/czyjs1/zfys80676/",
+    "天津/宝坻区": "https://www.tjbd.gov.cn/zwgk/zfxxgkqzf/hz/fdzdgknr1/czyjs1/zfys103561/",
+    "天津/滨海新区": "https://www.tjbh.gov.cn/channels/14076.html",
+    "天津/宁河区": "https://www.tjnh.gov.cn/zwgk/zfxxgkqzf1/hz1/fdzdgknr50/czyjs50/zfys132060/",
+    "天津/静海区": "http://www.tjjh.gov.cn/jhqzf/zwgk_28985/zfxxgk_qzf1/hz1/fdzdgknr1/czyjs1/zfys120207/",
+    "天津/蓟州区": "https://www.tjjz.gov.cn/zwgk/zfxxgk/qzf1/fdzdgknr1/czyjs1/zfys107757/",
+    "河北/河北": "https://www.hebei.gov.cn/columns/53f1d9cd-f671-4c01-bc77-d46a1a10c4cc/index.html",
+    "河北/石家庄市": "https://www.sjz.gov.cn/yjsgk/",
+    "河北/唐山市": "http://new.tangshan.gov.cn/zhengwu/czxx/index.html",
+    "河北/秦皇岛市": "http://www.qhd.gov.cn/xxgk/front/index.html",
+    "河北/邯郸市": "https://www.hd.gov.cn/ztzl/czyjs/",
+    "河北/邢台市": "http://www.xingtai.gov.cn/zwgk/czyjszl/",
+    "河北/保定市": "https://www.baoding.gov.cn/czysindex.html",
+    "河北/张家口市": "https://www.zjk.gov.cn/xxgk/czyjs.thtml",
+    "河北/承德市": "https://www.chengde.gov.cn/col/col10261/index.html",
+    "河北/沧州市": "https://www.cangzhou.gov.cn/cangzhou/c100552/list.shtml",
+    "河北/廊坊市": "https://zfxxgk.lf.gov.cn/GKNR/Index?deptId=39501&menuId=253",
+    "河北/衡水市": "http://czj.hengshui.gov.cn/col/col2589/index.html",
+    "山西/山西": "https://www.shanxi.gov.cn/zfxxgk/zfxxgkzl/fdzdgknr/czxx/",
+    "山西/太原市": "https://www.taiyuan.gov.cn/p1/zfbmczyjs.html",
+    "山西/大同市": "https://www.dt.gov.cn/dtszf/czzjxx/list.shtml",
+    "山西/阳泉市": "http://xxgk.yq.gov.cn/yqsrmzf1/fdzdgknr_45346/czxx_45363/",
+    "山西/长治市": "https://www.changzhi.gov.cn/xxgkml/zfxxgkml/szfgzbm/sczj/czsrmzf/czyjs_522/",
+    "山西/晋城市": "https://www.jcgov.gov.cn/zwgk/czxx_23406/",
+    "山西/朔州市": "http://szxxgk.shuozhou.gov.cn/szfxxgk/fdzdgknr/czxx/",
+    "山西/晋中市": "https://www.sxjz.gov.cn/zwgk/fdzdgknr/czyjs",
+    "山西/运城市": "https://www.yuncheng.gov.cn/bmzt/ycsczj/zwgk/fdzdgk2/ycsczyjszl/czys/index.shtml",
+    "山西/忻州市": "https://zwgk.sxxz.gov.cn/xzsrmzf/zdlyxxgk/czyjs/",
+    "山西/临汾市": "https://czt.shanxi.gov.cn/bmp_pub/index_gfa.html",
+    "山西/吕梁市": "http://www.lvliang.gov.cn/llxxgk/zfxxgk/xxgkml/zjxx_21583/sjczyshsgjf/",
+    "内蒙古/内蒙古": "https://czt.nmg.gov.cn/yjs/business/page/index",
+    "内蒙古/呼和浩特市": "https://czt.nmg.gov.cn/yjs/business/page/list?type=2&basicId=150100zf",
+    "内蒙古/包头市": "https://czt.nmg.gov.cn/yjs/business/page/index?cityCode=150200",
+    "内蒙古/乌海市": "https://czt.nmg.gov.cn/yjs/business/page/index?cityCode=150300",
+    "内蒙古/赤峰市": "http://www.chifeng.gov.cn/zwgk/xxgkzl/fdzdgknr/czzj/czyjshsgjfgk/",
+    "内蒙古/通辽市": "https://czj.tongliao.gov.cn/czj/czyjs/xxgk_zlm_list.shtml",
+    "内蒙古/鄂尔多斯市": "http://202.99.230.232/yjs/business/page/index?cityCode=150600",
+    "内蒙古/呼伦贝尔市": "https://www.hlbe.gov.cn/OpennessContent/showList/2/70000/page_1.html",
+    "内蒙古/巴彦淖尔市": "https://czt.nmg.gov.cn/yjs/business/page/index?cityCode=150800",
+    "内蒙古/乌兰察布市": "http://202.99.230.232/yjs/business/page/index?cityCode=150900",
+    "内蒙古/兴安盟": "https://czt.nmg.gov.cn/yjs/business/page/list?type=2&basicId=152200zf",
+    "内蒙古/锡林郭勒盟": "https://czt.nmg.gov.cn/yjs/business/page/index?cityCode=152500&aisiteOutPageId=1124feff652e4b2bbb357fd4a32db7c4",
+    "内蒙古/阿拉善盟": "http://202.99.230.232/yjs/business/page/index?cityCode=152900",
+    "辽宁/辽宁": "https://www.ln.gov.cn/web/zwgkx/sjjhczbg/index.shtml",
+    "辽宁/沈阳市": "https://www.shenyang.gov.cn/zwgk/fdzdgknr/ysjs/czys/zfys/",
+    "辽宁/大连市": "https://www.dl.gov.cn/col/col2352/index.html",
+    "辽宁/鞍山市": "http://www.anshan.gov.cn/asszf/zfxxgkml/fdzdgknr/ysjs/glist.html",
+    "辽宁/抚顺市": "https://www.fushun.gov.cn/zwgk/002008/moreinfo.html",
+    "辽宁/本溪市": "https://www.benxi.gov.cn/publicity/szfxx/czyjs",
+    "辽宁/丹东市": "https://www.dandong.gov.cn/ddszf/zfxxgk/fdzdgknr/ysjs/zfys/glist.html",
+    "辽宁/锦州市": "http://www.jz.gov.cn/zwgk/fdzdgknr/ys_js1/czyjs1/zfys.htm",
+    "辽宁/营口市": "http://www.yingkou.gov.cn/govpub/govGuidePub.html?categorynum=001002008&lm=cate3",
+    "辽宁/阜新市": "https://www.fuxin.gov.cn/channel/list/16724.html",
+    "辽宁/辽阳市": "http://www.liaoyang.gov.cn/column_list_special.html?categorynum=004007&deptcode=033",
+    "辽宁/盘锦市": "https://www.panjin.gov.cn/html/2064/",
+    "辽宁/铁岭市": "http://www.tieling.gov.cn/tieling/zwgk/zfxxgk/fdzdgknr/ys_js/index.html",
+    "辽宁/朝阳市": "http://chaoyang.gov.cn/cyszf/zwgk/zfxxgkpt/fdzdgknr/czxx/index.html",
+    "辽宁/葫芦岛市": "https://www.hld.gov.cn/zwgk/fdzdgknr/ysjs/jsgk/",
+    "吉林/吉林": "http://xxgk.jl.gov.cn/zcbm/fgw_98017/xxgkmlqy/?stit=2729&num=2",
+    "吉林/长春市": "http://zwgk.changchun.gov.cn/zcbm/syjglj/yjjxxgkml/?stit=2231&num=2",
+    "吉林/吉林市": "http://wza.jlcity.gov.cn/esd/zw/zfczgk/yjsxxgk/",
+    "吉林/四平市": "http://www.siping.gov.cn/zw/zwxxgkzl/czysgk/",
+    "吉林/辽源市": "http://www.liaoyuan.gov.cn/xxgk/zwgkzdlyxx/czxx/",
+    "吉林/通化市": "http://wza.tonghua.gov.cn/esd/zwgk/czsj/ztjs/",
+    "吉林/白山市": "http://www.cbs.gov.cn/zw/ztzl/bssczjzl/",
+    "吉林/松原市": "https://wap.jlsy.gov.cn/zwgk/zdlygk/czysjs/zfczyjs/",
+    "吉林/白城市": "http://www.jlbc.gov.cn/xxgk_3148/yjsxx/",
+    "吉林/延边朝鲜族自治州": "http://zfxxgk.yanbian.gov.cn/cyqzf/xxgkml/?stit=5894&num=2",
+    "黑龙江/黑龙江": "https://www.hlj.gov.cn/hlj/c108397/zfxxgk.shtml",
+    "黑龙江/哈尔滨市": "https://www.harbin.gov.cn/haerbin/c104524/navlistsearch.shtml",
+    "黑龙江/齐齐哈尔市": "https://www.qqhr.gov.cn/qqhe/c100665/zfxxgk_list.shtml",
+    "黑龙江/鸡西市": "http://www.jixi.gov.cn/jixi/c100103/common_zfxxgk.shtml",
+    "黑龙江/鹤岗市": "https://www.hegang.gov.cn/hegang/ysjs/zwgk_seclist.shtml",
+    "黑龙江/双鸭山市": "http://www.shuangyashan.gov.cn/NewCMS/index/html/newslist/newslist_all.jsp?fjlm=24820&lmid=25859",
+    "黑龙江/大庆市": "https://www.daqing.gov.cn/daqing/c100392/zfxxgk_list.shtml",
+    "黑龙江/伊春市": "https://www.yc.gov.cn/ycsrmzf/c102038/xxgk_list.shtml",
+    "黑龙江/佳木斯市": "https://zejm.jms.gov.cn/zwgk/html/zwgk/list/40115_pall.html",
+    "黑龙江/七台河市": "http://www.qth.gov.cn/qth/c101124/zfxxgklby.shtml",
+    "黑龙江/牡丹江市": "http://zwgk.mdj.gov.cn/zdlyxxgk/czzj/czyjs/ysgk/zfys/2022_8250/",
+    "黑龙江/黑河市": "http://www.heihe.gov.cn/hhs/zdgknr/zfxxgk.shtml?tab=zdgknr",
+    "黑龙江/绥化市": "https://www.suihua.gov.cn/sh/sczj/zfxxgk.shtml",
+    "黑龙江/大兴安岭地区": "http://www.dxal.gov.cn/dxal/c100075/zfxxgk_list.shtml",
+    "上海/上海": "https://czj.sh.gov.cn/zss/zfxx/czsj/index.html?name=1",
+    "上海/黄浦区": "https://www.shhuangpu.gov.cn/zw/009001/009001009/009001009001/009001009001002/subList2.html",
+    "上海/徐汇区": "https://www.xuhui.gov.cn/xxgk/portal/article/list?menuType=wgk&code=zxgk_czgk",
+    "上海/长宁区": "https://zwgk.shcn.gov.cn/xxgk/qzfyjs-czyjs/index.html",
+    "上海/静安区": "https://www.jingan.gov.cn/dynamic/info-year.html?param=czgk",
+    "上海/普陀区": "https://www.shpt.gov.cn/shpt/gkxx-chaizheng/index.html",
+    "上海/虹口区": "https://www.shhk.gov.cn/hkxxgk/multilevelList.html?categoryNum=002002001",
+    "上海/杨浦区": "https://www.shyp.gov.cn/yp-zwgk/zwgk/buffersInformation/list?parentModuleCode=009300190002000500030001",
+    "上海/闵行区": "https://zwgk.shmh.gov.cn/mh-xxgk-cms/website/mh_xxgk/czzj/List/index.htm",
+    "上海/宝山区": "https://xxgk.shbsq.gov.cn/infoDirectory.html?cate=002001001",
+    "上海/嘉定区": "http://www.jiading.gov.cn/publicity/zhgk/czxx",
+    "上海/浦东新区": "https://www.pudong.gov.cn/zwgk/014005004/",
+    "上海/金山区": "https://www.jinshan.gov.cn/czzj-yjs/index.html",
+    "上海/松江区": "https://www.songjiang.gov.cn/Template/dynamic/currency/infoOpenMore.html?categorynum=004003002",
+    "上海/青浦区": "https://www.shqp.gov.cn/shqp/zwgk/ggzj/",
+    "上海/奉贤区": "https://xxgk.fengxian.gov.cn/dir/comm/64",
+    "上海/崇明区": "https://www.shcm.gov.cn/goverList.html?categorynum=009012",
+    "江苏/江苏": "https://www.jiangsu.gov.cn/col/col84525/index.html",
+    "江苏/南京市": "https://www.nanjing.gov.cn/zdgk/214/218/219/index_17647.html",
+    "江苏/无锡市": "https://www.wuxi.gov.cn/zfxxgk/szfxxgkml/czxx/zfbmczyjs/index_6.shtml",
+    "江苏/徐州市": "http://www.xz.gov.cn/002/002020/ysjs.html",
+    "江苏/常州市": "https://www.changzhou.gov.cn/gi_class/zwgk_05?furl=zdgk&cache=no&test=bbb",
+    "江苏/苏州市": "https://www.suzhou.gov.cn/szsrmzf/sbjczyjs/nav_list_3.shtml",
+    "江苏/南通市": "https://www.nantong.gov.cn/ntsrmzf/2023n_cz/2023n_cz.html",
+    "江苏/连云港市": "http://yjsgk.jsczt.cn/#/overView2?classinfoid=16&code=320700000&year=2023&parentid=48468",
+    "江苏/淮安市": "http://yjsgk.jsczt.cn/#/overView2?classinfoid=15&year=2023&code=320800000&parentid=48447",
+    "江苏/盐城市": "http://yjsgk.jsczt.cn/#/overView2?classinfoid=15&code=320900000&year=2023&parentid=48474",
+    "江苏/扬州市": "http://yjsgk.jsczt.cn/#/overView2?classinfoid=15&code=321000000&year=2023&parentid=48477",
+    "江苏/镇江市": "http://yjsgk.jsczt.cn/#/overView2?classinfoid=15&code=321100000&year=2023&parentid=48480",
+    "江苏/泰州市": "http://yjsgk.jsczt.cn/#/overView2?classinfoid=15&code=321200000&year=2023&parentid=48483",
+    "江苏/宿迁市": "http://yjsgk.jsczt.cn/#/overView2?classinfoid=15&code=321300000&year=2023&parentid=48486",
+    "浙江/浙江": "https://www.zj.gov.cn/col/col1629301/index.html",
+    "浙江/杭州市": "https://www.hangzhou.gov.cn/col/col1229063410/index.html",
+    "浙江/宁波市": "http://yjs.czj.ningbo.gov.cn/gkxxzl/nbcs/budget/main",
+    "浙江/温州市": "https://www.wenzhou.gov.cn/col/col1229723694/index.html",
+    "浙江/嘉兴市": "https://www.jiaxing.gov.cn/col/col1229664055/index.html",
+    "浙江/湖州市": "http://www.huzhou.gov.cn/col/col1229229001/index.html?s=1&c=17813",
+    "浙江/绍兴市": "https://www.sx.gov.cn/col/col1229724453/index.html",
+    "浙江/金华市": "http://www.jinhua.gov.cn/col/col1229160429/index.html",
+    "浙江/衢州市": "http://czj.qz.gov.cn/col/col1229128330/index.html",
+    "浙江/舟山市": "http://xxgk.zhoushan.gov.cn/col/col1229289178/index.html",
+    "浙江/台州市": "https://www.zjtz.gov.cn/col/col1229205171/index.html",
+    "浙江/丽水市": "http://www.lishui.gov.cn/col/col1229265119/index.html?df=/col/col1229283444/index.html&isgk=1",
+    "安徽/安徽": "https://www.ah.gov.cn/public/column/1681?type=4&catId=6708851&action=list",
+    "安徽/合肥市": "https://czj.hefei.gov.cn/public/column/4381?type=4&catId=7014531&action=list",
+    "安徽/芜湖市": "https://www.wuhu.gov.cn/openness/czzj/zgwhsw/bmyjs/index.html",
+    "安徽/蚌埠市": "https://www.bengbu.gov.cn/zfxxgk/public/column/21981?type=4&catId=6769621&action=list&nav=3",
+    "安徽/淮南市": "https://www.huainan.gov.cn/public/column/6596035?type=4&catId=4977271&action=list&isParent=false",
+    "安徽/马鞍山市": "https://www.mas.gov.cn/xxgk/opennessContent/?branch_id=57a3df762c262ea9a00aae84&type=bumen&column_code=250100",
+    "安徽/淮北市": "https://www.huaibei.gov.cn/zwgk/public/column/15?type=4&action=list&nav=3&catId=14235340",
+    "安徽/铜陵市": "https://www.tl.gov.cn/openness/Opennesstl/",
+    "安徽/安庆市": "https://www.anqing.gov.cn/public/column/3902119?type=4&catId=6980501&action=list",
+    "安徽/黄山市": "https://www.huangshan.gov.cn/zwgk/public/column/6615714?type=4&catId=6718275&action=list",
+    "安徽/滁州市": "https://czj.chuzhou.gov.cn/czdt/zfyjsgk/index.html",
+    "安徽/阜阳市": "https://www.fy.gov.cn/xxgkContent/?branch_id=545214aaba6de118f0c2bde5&column_code=150102",
+    "安徽/宿州市": "https://czj.ahsz.gov.cn/public/column/2655593?type=4&action=list&nav=&sub=&catId=4736141",
+    "安徽/六安市": "https://www.luan.gov.cn/public/column/6608171?type=4&action=list&nav=3&catId=7050804",
+    "安徽/亳州市": "https://www.bozhou.gov.cn/XxgkContent/showList/295/65517/page_1.html",
+    "安徽/池州市": "https://czj.chizhou.gov.cn/OpennessContent/showList/19/1914/page_1.html",
+    "安徽/宣城市": "https://www.xuancheng.gov.cn/XxgkContent/showList/226/104044/page_1.html",
+    "福建/福建": "https://czt.fujian.gov.cn/ztzl/sjyjsgkpt/",
+    "福建/福州市": "http://www.fuzhou.gov.cn/zgfzzt/czzj/bjndyjs/zfysgk/",
+    "福建/厦门市": "https://www.xm.gov.cn/zdxxgk/czzjxx/xmczyjspg/",
+    "福建/莆田市": "https://www.putian.gov.cn/zwgk/zdlyxxgk/czzj/bmyjs/",
+    "福建/三明市": "https://www.sm.gov.cn/zw/zfxxgkzdgz/czzj/czyjsjsgjf/sbjczyjs/",
+    "福建/泉州市": "https://www.quanzhou.gov.cn/zfb/xxgk/ztxxgk/czzj/czys/",
+    "福建/漳州市": "http://www.zhangzhou.gov.cn/cms/html/zzsrmzf/czyjsjsgjf/index.html",
+    "福建/南平市": "https://www.np.gov.cn/cms/html/npszf/npsyjsgkpt/index.html",
+    "福建/龙岩市": "https://www.longyan.gov.cn/gk/zdlyxxgk/czyjs/czyjs/",
+    "福建/宁德市": "https://www.ningde.gov.cn/zwgk/zdxxgk/czzjgk/czyjs/",
+    "四川/四川": "https://czt.sc.gov.cn/scczt/c102367/sbjyjs.shtml",
+    "四川/成都市": "https://www.chengdu.gov.cn/gkml/czyjs/column-index-1.shtml",
+    "四川/自贡市": "http://www.zg.gov.cn/web/guest/jingtai/-/articles/17252591.shtml",
+    "四川/攀枝花市": "http://www.panzhihua.gov.cn/zwgk/zdly/czxx/czyjs/index.shtml",
+    "四川/泸州市": "https://www.luzhou.gov.cn/zw/fdzdgknr/sjbmys/zfyjs/zfys",
+    "四川/德阳市": "https://www.deyang.gov.cn/info/iList.jsp?&node_id=GKdyszf&cat_id=25806",
+    "四川/绵阳市": "http://www.my.gov.cn/mysrmzf/c100043/list.shtml",
+    "四川/广元市": "https://www.cngy.gov.cn/ztzl/ysjs/ys2023.html",
+    "四川/遂宁市": "https://www.suining.gov.cn/zfxxgk/yjs/2023yjs.html",
+    "四川/内江市": "http://www.neijiang.gov.cn/njs/czxxzl/czxx.shtml",
+    "四川/乐山市": "https://www.leshan.gov.cn/lsswszf/czyjs/ysjsxxgk.shtml",
+    "四川/南充市": "https://www.nanchong.gov.cn/czj/zwxx/zfxxgkzl/fdzdgknr/ysjs/ncszfys/",
+    "四川/眉山市": "https://www.ms.gov.cn/zfxxgk/yjsxxgk/n2023nmssjbm_dw_ysgk.htm",
+    "四川/宜宾市": "http://www.yibin.gov.cn/ztzl/zfxxgk/fdzdgk/czyjs2/",
+    "四川/广安市": "https://www.guang-an.gov.cn/gasrmzfw/c105076/pc/list.html",
+    "四川/达州市": "http://www.dazhou.gov.cn/xxgk-list-yusuanjuesuan.html",
+    "四川/雅安市": "https://www.yaan.gov.cn/gongkai/jichu/40018.html",
+    "四川/巴中市": "http://czj.cnbz.gov.cn/xxgk/zdlyxx/czys/index.html",
+    "四川/资阳市": "http://sczj.ziyang.gov.cn/index.php?m=content&c=index&a=lists&catid=132",
+    "四川/阿坝藏族羌族自治州": "https://www.abazhou.gov.cn/abazhou/c101971/czyjsgg.shtml",
+    "四川/甘孜藏族自治州": "https://www.gzz.gov.cn/gzzczyjsxxgk",
+    "四川/凉山彝族自治州": "http://www.lsz.gov.cn/xxgk/zdlyxxgk/czxx/czyjsbg/",
+    "湖南/湖南": "https://czt.hunan.gov.cn/ztzl/hnczysgk/",
+    "湖南/长沙市": "http://www.changsha.gov.cn/szf/ztzl/ysgk/",
+    "湖南/株洲市": "http://czyjs.zhuzhou.gov.cn/c1927/",
+    "湖南/湘潭市": "http://cz.xiangtan.gov.cn/portal/",
+    "湖南/衡阳市": "https://www.hengyang.gov.cn/xxgk/szfxxgkml/czxx/sbjczysjs/index.html",
+    "湖南/邵阳市": "https://www.shaoyang.gov.cn/shaoyang/sbjzfyjs/xlist_djlb.shtml",
+    "湖南/岳阳市": "http://www.yueyang.gov.cn/zfxxgk/58868/58882/index.htm",
+    "湖南/常德市": "https://www.changde.gov.cn/zwgk/public/column/6616759?type=4&catId=6719105&action=list&nav=3",
+    "湖南/张家界市": "http://cz.zjj.gov.cn/c7017/index.html",
+    "湖南/益阳市": "http://220.170.153.212:9000/",
+    "湖南/郴州市": "http://czj.czs.gov.cn/12856/12863/14975/default.htm",
+    "湖南/永州市": "http://www.yzcity.gov.cn/cnyz/zwgk/xbzwgklist.shtml",
+    "湖南/怀化市": "https://www.huaihua.gov.cn/czj/c100743/czys.shtml",
+    "湖南/娄底市": "http://czj.hnloudi.gov.cn/ldczj/xxgk/xxgk.shtml?catecode=04&tempname=xxgk_lists",
+    "湖南/湘西土家族苗族自治州": "https://czj.xxz.gov.cn/yjsgk/govPre.html?type=4",
+    "广东/广东": "https://www.gd.gov.cn/zwgk/czxx/index.html",
+    "广东/广州市": "https://www.gz.gov.cn/gkmlpt/index#12627",
+    "广东/韶关市": "https://www.sg.gov.cn/zw/yjszl/index.html",
+    "广东/深圳市": "http://www.sz.gov.cn/cn/xxgk/zfxxgj/zjxx/szfczyjs/index.html",
+    "广东/珠海市": "https://www.zhuhai.gov.cn/xw/ztjj/zhszdlyxxgkzl/czysjshsgjfgk/czyjs/",
+    "广东/汕头市": "https://www.shantou.gov.cn/cnst/zwgk/jcxxgk/czyjsx/index.html",
+    "广东/佛山市": "http://www.foshan.gov.cn/zwgk/zdly/czxx/czyjs/index.html",
+    "广东/江门市": "http://www.jiangmen.gov.cn/newzwgk/czgk/index.html",
+    "广东/湛江市": "https://www.zhanjiang.gov.cn/zdlyxxgk/czyjshsg/czyjs/czys/index.html",
+    "广东/茂名市": "http://www.maoming.gov.cn/zwgk/zwzl/zdlyxxgkzl/czysjshsgjfgk/czyjus/index.html",
+    "广东/肇庆市": "http://www.zhaoqing.gov.cn/gkmlpt/index#3966",
+    "广东/惠州市": "http://www.huizhou.gov.cn/bmpd/hzczj/zt/hzsczyjsxxgkzl/sjczyjs/index.html",
+    "广东/梅州市": "https://www.meizhou.gov.cn/zwgk/zdlyxxgkzl/czxx/czyjs/",
+    "广东/汕尾市": "https://www.shanwei.gov.cn/shanwei/swzdly/sgjf/czyjs/szfys/index.html",
+    "广东/河源市": "http://www.heyuan.gov.cn/zwgk/czyjs/index.html",
+    "广东/阳江市": "http://www.yangjiang.gov.cn/zwgk/zdlyxxgk/czzj/czyjs/czys/",
+    "广东/清远市": "http://www.gdqy.gov.cn/gdqy/newxxgk/czxx/sjyjs/",
+    "广东/东莞市": "http://www.dg.gov.cn/zdlyxx_zfysxx.html",
+    "广东/中山市": "http://www.zs.gov.cn/zwgk/czxx/czyjs/",
+    "广东/潮州市": "http://www.chaozhou.gov.cn/zwgk/zdlyxxgk/czyjs/zcys/",
+    "广东/揭阳市": "http://www.jieyang.gov.cn/zwgk/jcxxgk/czxx/sjcz/sjczys/index.html",
+    "广东/云浮市": "https://www.yunfu.gov.cn/yfsrmzf/jcxxgk/czxx/czyjs/index.html",
+    "云南/云南": "https://www.yn.gov.cn/zwgk/wgk/zxgk/czzjsy/",
+    "云南/昆明市": "https://czj.km.gov.cn/zfxxgk/fdzdgknr/zdlyxxgk/sjczyjs/",
+    "云南/曲靖市": "https://www.qj.gov.cn/html/fdzdgknr/czyjs/sbjzfczyjs/",
+    "云南/玉溪市": "http://www.yuxi.gov.cn/yxgovfront/newzfxxgkUnderControl.jspx?path=yxszfxxgk&channelId=22380&pageNo=1",
+    "云南/保山市": "https://www.baoshan.gov.cn/bmym/bssczj1/zfxxgkpt/fdzdgknr/cz1.htm",
+    "云南/昭通市": "",
+    "云南/丽江市": "http://www.lijiang.gov.cn/ljsrmzf/c102170/zfxxgk_gknr.shtml",
+    "云南/普洱市": "https://www.puershi.gov.cn/zwgk/zfxxgk2/fdzdgknr/czyjs.htm",
+    "云南/临沧市": "https://www.lincang.gov.cn/zfxxgk/fdgd/zdlyxxgk/czxx/sss/bmyjsjsgjf.htm",
+    "云南/楚雄彝族自治州": "https://www.cxz.gov.cn/newSkin/xxgk_searchresult.jsp?urltype=egovinfo.EgovSearchList&wbtreeid=1003&stype=aindex",
+    "云南/红河哈尼族彝族自治州": "http://www.hh.gov.cn/zfxxgk/fdzdgknr/zdlyxxgk_1/czxxgk/",
+    "云南/文山壮族苗族自治州": "https://www.ynws.gov.cn/zfxxgk/zdgkxxml/czyjsgk.htm",
+    "云南/西双版纳傣族自治州": "https://www.xsbn.gov.cn/czj/93677.news.list.dhtml",
+    "云南/大理白族自治州": "https://www.dali.gov.cn/dlrmzf/xxgkml/c106264/czyjs.shtml",
+    "云南/德宏傣族景颇族自治州": "https://www.dh.gov.cn/czj/Web/_M25_1710240937253575135961892518eB_1.htm",
+    "云南/怒江傈僳族自治州": "https://www.nujiang.gov.cn/html/zwgk/yjsgk/",
+    "云南/迪庆藏族自治州": "http://www.diqing.gov.cn/zfxxgk_dqzzf/fdzdgknr/caizhengxinxigongkaizhuanlan/zhengfuyujuesuan",
+    "广西/广西": "https://czt.gxzf.gov.cn/zt/yjsgkxx/zzqbjzfys/",
+    "广西/南宁市": "https://www.nanning.gov.cn/zwgk/fdzdgknr/czxx/sbjyjs/sbjzfys/",
+    "广西/柳州市": "http://lzscz.liuzhou.gov.cn/zwgk/fdzdgknr/czyjsgk/",
+    "广西/桂林市": "http://czj.guilin.gov.cn/yfwlgk/czxx/",
+    "广西/梧州市": "http://117.141.250.58:10060/",
+    "广西/北海市": "http://www.beihai.gov.cn/xxgkbm/bhsczj/ztzl_3/yujuesuangongkai/index.shtml",
+    "广西/防城港市": "http://www.fcgs.gov.cn/zfxxgk/zdlyxxgk/czzj/",
+    "广西/钦州市": "http://www.qinzhou.gov.cn/zfxxgk/fdzdgknr_6/ysjs/",
+    "广西/贵港市": "http://czj.gxgg.gov.cn/ggsbjyjsgkpt/ggzfys/index.shtml",
+    "广西/玉林市": "http://www.yulin.gov.cn/zwgk/ylsbjyjsgkpt_30014/",
+    "广西/百色市": "http://www.baise.gov.cn/zwgk/jcxxgk/czyjs/",
+    "广西/贺州市": "http://www.gxhz.gov.cn/xxgk/czxx/ysjs/index.shtml",
+    "广西/河池市": "http://171.111.153.233/",
+    "广西/来宾市": "http://www.laibin.gov.cn/xxgk/fdzdgknr/zdlyxxgk_1/czyjs/",
+    "广西/崇左市": "http://www.chongzuo.gov.cn/zfxxgkzl/xxgkzn_fdzdgknr/czxx/",
+    "江西/江西": "https://www.jiangxi.gov.cn/col/col48455/index.html#div",
+    "江西/南昌市": "http://czj.nc.gov.cn/ncczj/zcyjszl/czyjszl.shtml",
+    "江西/景德镇市": "https://www.jdz.gov.cn/zwgk/fdzdgknr/czxx/yjsgk/",
+    "江西/萍乡市": "https://www.pingxiang.gov.cn/col/col231/index.html?index=bm",
+    "江西/九江市": "https://www.jiujiang.gov.cn/xxgk/xzwgk/glgk/czxx/sbj/",
+    "江西/新余市": "http://www.xinyu.gov.cn/xinyu/sjzfyjs/zzxxtk_list.shtml",
+    "江西/鹰潭市": "http://www.yingtan.gov.cn/col/col185/index.html?vc_xxgkarea=YT0001&number=Y50003",
+    "江西/赣州市": "https://www.ganzhou.gov.cn/zfxxgk/index.shtml?code=c100283&temp=xxgk_navs",
+    "江西/吉安市": "https://www.jian.gov.cn/xxgk-list-yujsuanx.html",
+    "江西/宜春市": "https://www.yichun.gov.cn/ycsrmzf/sbjczyjs/xxgk_list.shtml",
+    "江西/抚州市": "https://www.jxfz.gov.cn/col/col98/index.html",
+    "江西/上饶市": "https://www.zgsr.gov.cn/zgsr/czyjs/zwgk_xxgklist_8.shtml",
+    "湖北/湖北": "https://czt.hubei.gov.cn/budget/?IhgKt6cDPAH3=1705912704871#/dashboard",
+    "湖北/武汉市": "https://www.wuhan.gov.cn/ztzl/yjs/2023/",
+    "湖北/黄石市": "http://www.huangshi.gov.cn/xxxgk/fdzdgknr/2020czzj/czyjs/",
+    "湖北/十堰市": "https://www.shiyan.gov.cn/xxgk/xxgk_fdgk/ysjs/czyjs/sjczyjs/",
+    "湖北/宜昌市": "http://www.yichang.gov.cn/zfxxgk/list.html?catid=35&t=0",
+    "湖北/襄阳市": "http://www.xiangyang.gov.cn/szf/zfxxgk/fdzdgknr/czzj/czyjs/",
+    "湖北/鄂州市": "https://www.ezhou.gov.cn/gk/czzjgk/ys2023/",
+    "湖北/荆门市": "https://www.jingmen.gov.cn/col/col535/index.html",
+    "湖北/孝感市": "https://www.xiaogan.gov.cn/c/www/ys.jhtml",
+    "湖北/荆州市": "https://zwgk.jingzhou.gov.cn/special_yjs_index.shtml?column_id=40215",
+    "湖北/黄冈市": "https://www.hg.gov.cn/zt/2023sjyjs/index.html",
+    "湖北/咸宁市": "http://www.xianning.gov.cn/xxgk/xxgkml/czzj/zfys/2023ndszfys/",
+    "湖北/随州市": "http://www.suizhou.gov.cn/zwgk/xxgk/czzj/czyjs/2023yjs/",
+    "湖北/恩施土家族苗族自治州": "http://www.enshi.gov.cn/zc/xxgkml/czzj/czyjs2021/czyjsx/2024.shtml",
+    "湖北/省直辖县级行政单位": "",
+    "甘肃/甘肃": "https://www.gs.gov.cn/gsszf/c117386/xxgk_sfxm.shtml?code=c117386&channelId=b8d7eff5285f4dd2943a8ff514596f8c",
+    "甘肃/兰州市": "https://czj.lanzhou.gov.cn/col/col10272/index.html",
+    "甘肃/嘉峪关市": "https://www.jyg.gov.cn/zfxxgk/fdzdgknr/zdlyxxgk/czzjxx/index.html",
+    "甘肃/金昌市": "https://www.jcs.gov.cn/zfxxgk/fdzdgknr/ys/js/sjzfczyjsjsgjf/index.html",
+    "甘肃/白银市": "https://www.baiyin.gov.cn/zwgk/zfxxgk/fdzdgknr/ysjs/sjczyjs/index.html",
+    "甘肃/天水市": "https://www.tianshui.gov.cn/czj/zfxxgk/fdnrzdgk/zfyjs/zfys.htm",
+    "甘肃/武威市": "https://www.gswuwei.gov.cn/col/col44/index.html?vc_xxgkarea=116223000139309526&number=WWSA061",
+    "甘肃/张掖市": "https://www.zhangye.gov.cn/zyszfxxgk/fdzdgknr_5657/sgjfjysxx/sjczyjsjsgjf/",
+    "甘肃/平凉市": "http://czj.pingliang.gov.cn/zfxxgk/fdzdgknr/yjsgk/1/index.html",
+    "甘肃/酒泉市": "https://czj.jiuquan.gov.cn/czj/c105196/xxgj_list.shtml",
+    "甘肃/庆阳市": "https://www.zgqingyang.gov.cn/gk/zfxxgk/zfxxgkml/ysjs35zwgkb",
+    "甘肃/定西市": "http://www.dingxi.gov.cn/col/col16735/index.html",
+    "甘肃/陇南市": "https://www.longnan.gov.cn/zfxxgk/public/column/4455693?type=4&catId=103144129&action=list",
+    "甘肃/临夏回族自治州": "https://www.linxia.gov.cn/lxz/zwgk/fdzdgknr/ysjs/zfysgk/index.html",
+    "甘肃/甘南藏族自治州": "http://czj.gnzrmzf.gov.cn/sjgk.htm",
+    "贵州/贵州": "https://czt.guizhou.gov.cn/ztzl/gzsczzjxxgkzl/index.html",
+    "贵州/贵阳市": "https://www.guiyang.gov.cn/zwgk/zdlyxxgkx/czxx_5617879/sbjyjsjsgjf/#%E8%B4%A2%E6%94%BF%E4%BF%A1%E6%81%AF_5617879",
+    "贵州/六盘水市": "https://czj.gzlps.gov.cn/bmxxgk/zfxxgk/fdzdgknr/zdly/czysjsgjf/",
+    "贵州/遵义市": "https://www.zunyi.gov.cn/zwgk/zdlygk/czzj_5858315/sjczyjsjsgjf/",
+    "贵州/安顺市": "https://www.anshun.gov.cn/zwgk/zdlyxx/czzj/czysjsgjf/",
+    "贵州/毕节市": "https://www.bijie.gov.cn/zwgk/zdlyxxgk/czzj/szfyjsbg/",
+    "贵州/铜仁市": "https://www.trs.gov.cn/zwgk/zfxxgkzl/fdzdgknr/ysjs/zfyjs/",
+    "贵州/黔西南布依族苗族自治州": "https://www.qxn.gov.cn/zwgk/zjxx/index.html",
+    "贵州/黔东南苗族侗族自治州": "https://www.qdn.gov.cn/zwgk_5871642/zdlyxxgk/czzj_5872139/zfys/",
+    "贵州/黔南布依族苗族自治州": "https://www.qiannan.gov.cn/ztzl/qnzczzjxxgk/qnzczzjxxgk_zfyjs/",
+    "西藏/西藏": "https://www.xizang.gov.cn/zwgk/zdxxlygk/czyjsgk/index_13.html",
+    "西藏/拉萨市": "https://www.lasa.gov.cn/lsszfxxgk/czzj/zfxxgk_czzj.shtml",
+    "西藏/日喀则市": "http://www.rikaze.gov.cn/public-policy.thtml?id=10984",
+    "西藏/昌都市": "http://www.changdu.gov.cn/cdrmzf/c101573/czzj.shtml",
+    "西藏/林芝市": "http://www.linzhi.gov.cn/zfxxgkpt/c100051/zfxxgk_czzj.shtml",
+    "西藏/山南市": "http://www.shannan.gov.cn/zwgk/zfxxgkml/czzj/",
+    "西藏/那曲市": "",
+    "西藏/阿里地区": "https://www.al.gov.cn/zwgk/zdlyxxgk/czzj.htm",
+    "重庆/重庆": "http://wap.cq.gov.cn/zwgk/zfxxgkzl/fdzdgknr/ysjs/",
+    "重庆/渝中区": "http://www.cqyz.gov.cn/zwgk_229/fdzdgknr/czyjs/ys_yzq/",
+    "重庆/万州区": "http://www.wz.gov.cn/zwgk_266/fdzdgknr/ysjs/",
+    "重庆/涪陵区": "http://www.fl.gov.cn/bm/czj/zwgk_46264/zfxxgkml/czyjslyjzcwgk/jczwgk_bzml/",
+    "重庆/大渡口区": "http://www.ddk.gov.cn/zwgk_271/zfxxgk/fdzdgknr/ysjs/",
+    "重庆/江北区": "http://www.cqjb.gov.cn/bm/qczj_71909/zwgk_73798/jczwgk/jczwgk_131198/",
+    "重庆/沙坪坝区": "https://www.cqspb.gov.cn/zwgk_235/xxgk_19662/fdzdgknr/ysjs/ys/",
+    "重庆/九龙坡区": "http://cqjlp.gov.cn/zwgk_251/zfxxgkml/czyjs/qjczyjsqk/",
+    "重庆/南岸区": "https://www.cqna.gov.cn/bm/qczj/zwgk_59968/zfxxgkml/jczwgk/czyjs_141424/bzmul/",
+    "重庆/北碚区": "",
+    "重庆/綦江区": "https://www.cqqj.gov.cn/zwgk_159/fdzdgknr/czyjs/ys/",
+    "重庆/大足区": "http://www.dazu.gov.cn/zwgk_175/fdzdgknr/czyjs/",
+    "重庆/渝北区": "http://www.ybq.gov.cn/zwgk_263/zfxxgkml/czyjs/czys/",
+    "重庆/巴南区": "http://www.cqbn.gov.cn/zwgk_252/fdzdgknr/czyjs/qzfbm_162688/",
+    "重庆/黔江区": "https://www.qianjiang.gov.cn/zwgk_210/fdzdgknr/czyjs/zfys/",
+    "重庆/长寿区": "https://www.cqcs.gov.cn/zwgk_164/fdzdgknr/czyjs/",
+    "重庆/江津区": "http://www.jiangjin.gov.cn/zwgk_180/fdzdgknr/ysjs/ys/",
+    "重庆/合川区": "http://www.hc.gov.cn/xxgk/qzfwj/czyjs/ys/",
+    "重庆/永川区": "http://www.cqyc.gov.cn/zwgk_204/zfxxgk/zfxxgkml/czyjs/zfysbg/",
+    "重庆/南川区": "http://www.cqnc.gov.cn/qzfbm_197/czj/zwgk_53778/zfxxgkml2/jczwgk/ywjy/index.html",
+    "重庆/璧山区": "",
+    "重庆/铜梁区": "https://www.cqstl.gov.cn/bm/qczj_71105/zwgk_70831/fdzdgknr_70834/qtgknr/jczwgk_1/czyjslyxxgk/",
+    "重庆/潼南区": "http://www.cqtn.gov.cn/bm/qczj/zwgk_25192/zfxxgkml_bm/jczwgk/czyjsly/index.html",
+    "重庆/荣昌区": "http://www.rongchang.gov.cn/bm/qczj/zwgk_70831/zfxxgkml_160169/jczwgk_158289/ysjs/",
+    "重庆/开州区": "http://www.cqkz.gov.cn/zwgk_238/fdzdgknr/czyjs/",
+    "重庆/梁平区": "http://www.cqlp.gov.cn/zwgk_178/fdzdgknr/czyjs/ysgk/",
+    "重庆/武隆区": "http://cqwl.gov.cn/zwgk_170/fdzdgknr/czyjs/ysjs/",
+    "重庆/城口县": "",
+    "重庆/丰都县": "",
+    "重庆/垫江县": "",
+    "重庆/忠县": "",
+    "重庆/云阳县": "",
+    "重庆/奉节县": "",
+    "重庆/巫山县": "",
+    "重庆/巫溪县": "",
+    "重庆/石柱土家族自治县": "",
+    "重庆/秀山土家族苗族自治县": "",
+    "重庆/酉阳土家族苗族自治县": "",
+    "重庆/彭水苗族土家族自治县": "",
+    "海南/海南": "https://www.hainan.gov.cn/hainan/czyjs/list2.shtml?ddtab=true",
+    "海南/海口市": "https://www.haikou.gov.cn/xxgk/szfbjxxgk/cztz/czyjs/2023yjs/",
+    "海南/三亚市": "https://www.sanya.gov.cn/sanyasite/czyjs/simple_list_42.shtml",
+    "海南/三沙市": "",
+    "海南/儋州市": "https://www.danzhou.gov.cn/danzhou/rdzt/czyjs/",
+    "海南/省直辖县级行政单位": "",
+    "青海/青海": "http://www.qinghai.gov.cn/xxgk/xxgk/fd/ys/",
+    "青海/西宁市": "https://czj.xining.gov.cn/sy/ztzl/czyjsgkzl/bmys/",
+    "青海/海东市": "http://www.haidong.gov.cn/html/58/List.html",
+    "青海/海北藏族自治州": "http://www.haibei.gov.cn/public/column/6616331?type=4&catId=6719301&action=list&nav=3",
+    "青海/黄南藏族自治州": "http://www.huangnan.gov.cn/html/channels/30.html",
+    "青海/海南藏族自治州": "https://www.hainanzhou.gov.cn/zfxxgk/fdzdgknr/czyjs/index_14.html",
+    "青海/果洛藏族自治州": "http://www.guoluo.gov.cn/html/3385/List.html",
+    "青海/玉树藏族自治州": "https://www.yushuzhou.gov.cn/html/2856/List.html",
+    "青海/海西蒙古族藏族自治州": "https://czj.haixi.gov.cn/czysxxgk/zfysgk.htm",
+    "香港/香港": "",
+    "宁夏/宁夏": "https://czt.nx.gov.cn/zwgk/zfxxgkml/zfyjs/",
+    "宁夏/银川市": "https://www.yinchuan.gov.cn/xxgk/zfxxgkml/czyjsgk/zfys_47191/2023/",
+    "宁夏/石嘴山市": "http://www.shizuishan.gov.cn/zwgk/zfxxgkml/czyjsgk/zfys/sfubrber437874/",
+    "宁夏/吴忠市": "http://www.wuzhong.gov.cn/xxgk/zfxxgkml/yjsgkqk/zfys/2023/",
+    "宁夏/固原市": "http://www.nxgy.gov.cn/zwgk/zfxxgkml/czgk/czyjsjsgjf/",
+    "宁夏/中卫市": "https://www.nxzw.gov.cn/zwgk/zfxxgkml/czyjs/zfys/",
+    "澳门/澳门": "",
+    "台湾/台湾": "",
+    "河南/河南": "https://www.henan.gov.cn/zwgk/czxx/szfys/",
+    "河南/郑州市": "https://public.zhengzhou.gov.cn/?a=dir&h=1&p=D1901",
+    "河南/开封市": "https://www.kaifeng.gov.cn/kfsrmzfwz/ysjs/pc/list.html",
+    "河南/洛阳市": "https://cz.ly.gov.cn/sitesources/lyczj/page_pc/czyjsgkpt/sjbmczyjs/bmczys/2023/list1.html",
+    "河南/平顶山市": "https://www.pds.gov.cn/channels/1379.html",
+    "河南/安阳市": "https://www.anyang.gov.cn/zwgk/zdlyzfxxgk/czxx/",
+    "河南/鹤壁市": "https://czj.hebi.gov.cn/ztzl/czyjsgkpt/index.html",
+    "河南/新乡市": "http://www.xinxiangxian.gov.cn/portal/xxgk/zfxxgkzl/gkmlbzgf/czyjs/A0902010305index_1.htm",
+    "河南/焦作市": "http://czj.jiaozuo.gov.cn/list/38.html",
+    "河南/濮阳市": "https://caizheng.puyang.gov.cn/pc/fwzx.asp?a=lm-16",
+    "河南/许昌市": "http://czj.xuchang.gov.cn/czyjsgkpt/index.html",
+    "河南/漯河市": "http://www.luohe.gov.cn/sitesources/lhsrmzf/page_pc/zdlyxxgkzl/czzj/bmyjsj/list1.html",
+    "河南/三门峡市": "http://czj.smx.gov.cn/10438/616656384/1469158.html",
+    "河南/南阳市": "https://www.nanyang.gov.cn/zdlyxxgk/czzj/?channelId=4349",
+    "河南/商丘市": "https://www.shangqiu.gov.cn/zwgk/fdzdgknr/czzj47szfbgs",
+    "河南/信阳市": "http://czj.xinyang.gov.cn/c/113/",
+    "河南/周口市": "http://czj.zhoukou.gov.cn/sitesources/czj/page_pc/czzj/zfyjs/sjzfys/2023n/list1.html",
+    "河南/驻马店市": "http://czj.zhumadian.gov.cn/xxgk/news-8/",
+    "山东/山东": "http://www.shandong.gov.cn/col/col305190/index.html?vc_xxgkarea=113700000045022274&number=SD32",
+    "山东/济南市": "http://jncz.jinan.gov.cn/col/col115044/index.html",
+    "山东/青岛市": "http://www.qingdao.gov.cn/zwgk/zdgk/czxx/szfyjs/czys/",
+    "山东/淄博市": "https://www.zibo.gov.cn/gongkai/channel_c_5f3a4f3c43aa933a482b9195_n_1605680166.8526/",
+    "山东/枣庄市": "http://www.zaozhuang.gov.cn/zwgk/zt/czyjsgk/",
+    "山东/东营市": "http://www.dongying.gov.cn/col/col38805/index.html?number=&vc_xxgkarea=dongyingshi&jh=263",
+    "山东/烟台市": "https://www.yantai.gov.cn/col/col105504/index.html",
+    "山东/潍坊市": "http://www.weifang.gov.cn/xxgk/fdzdgk2020new.html",
+    "山东/济宁市": "https://www.jining.gov.cn/col/col33356/index.html?jh=263",
+    "山东/泰安市": "http://www.taian.gov.cn/col/col320284/index.html",
+    "山东/威海市": "https://www.weihai.gov.cn/col/col74423/index.html?vc_xxgkarea=11371000004359010J&jh=263",
+    "山东/日照市": "http://czj.rizhao.gov.cn/col/col32288/index.html?number=RZ090501",
+    "山东/临沂市": "https://www.linyi.gov.cn/gk/czxx.htm",
+    "山东/德州市": "https://www.dezhou.gov.cn/n1403/n38391670/n38392709/czzj_index.html",
+    "山东/聊城市": "http://www.liaocheng.gov.cn/channel_lc_lcsrmzfchannel201911221748354924346453/",
+    "山东/滨州市": "http://binzhou.gov.cn/zfxxgk/web/#/page/list1/1470590506136342530",
+    "山东/菏泽市": "http://www.heze.gov.cn/hzztlistNew/?pid=1557165825545342976&catas=1557166599193104384",
+    "新疆/新疆": "https://czt.xinjiang.gov.cn/czt/zfyjs/list_yjsgk.shtml",
+    "新疆/乌鲁木齐市": "http://www.urumqi.gov.cn/info/iList.jsp?cat_id=14856&tm_id=734",
+    "新疆/克拉玛依市": "https://www.klmy.gov.cn/klmys/czys/zfxxgk_lists.shtml",
+    "新疆/吐鲁番市": "https://www.tlf.gov.cn/tlfs/c106290/zfxxgk_zc.shtml",
+    "新疆/哈密市": "https://www.hami.gov.cn/zwgk1/fdzdzfxxgknr/zfys1.htm",
+    "新疆/阿克苏地区": "https://www.aks.gov.cn/zwgk/czxx/zfyjs/index.html",
+    "新疆/喀什地区": "http://www.xjks.gov.cn/kss/c109330/zfxxgk_lists.shtml",
+    "新疆/和田地区": "https://www.xjht.gov.cn/article/list.php?catid=6",
+    "新疆/昌吉回族自治州": "https://www.cj.gov.cn/p118/2023ndysjsgjf.html",
+    "新疆/博尔塔拉蒙古自治州": "http://www.xjboz.gov.cn/zwgk/zfxxgk/fdzdgknei_r/czyjs1/zfyjs.htm",
+    "新疆/巴音郭楞蒙古自治州": "http://www.xjbz.gov.cn/xjbz/c115231/zfxxgk_gknr.shtml",
+    "新疆/克孜勒苏柯尔克孜自治州": "https://www.xjkz.gov.cn/xjkz/c101815/czyjs.shtml",
+    "新疆/伊犁哈萨克自治州": "https://www.xjyl.gov.cn/xjylz/c116278/ylzczyjs.shtml",
+    "新疆/塔城地区": "http://654200.yujuesuan.cn/workbench/home?types=budget",
+    "新疆/阿勒泰地区": "https://www.xjalt.gov.cn/govxxgk/gov-listTwoPage.html",
+    "新疆/自治区直辖县级行政单位": "",
+    "陕西/陕西": "http://www.shaanxi.gov.cn/zfxxgk/fdzdgknr/ysjs/yjsbg/",
+    "陕西/西安市": "https://www.xa.gov.cn/gk/czzj/szfczys/1.html",
+    "陕西/铜川市": "http://www.tongchuan.gov.cn/resources/site/1/html/xxgk/xxgkml/zdlyxxgk/ggzj/czgk/index.html",
+    "陕西/宝鸡市": "http://www.baoji.gov.cn/col/col9845/index.html",
+    "陕西/咸阳市": "http://www.xianyang.gov.cn/zfxxgk/fdzdgknr/czzj/",
+    "陕西/渭南市": "https://www.weinan.gov.cn/zfxxgk/fdzdgknr/czxx/sjczyjs/1.html",
+    "陕西/延安市": "http://www.yanan.gov.cn/gk/fdzdgknr/czxx/1.html",
+    "陕西/汉中市": "http://www.hanzhong.gov.cn/hzszf/zwgk/czzj/gkzlm_list.shtml",
+    "陕西/榆林市": "",
+    "陕西/安康市": "",
+    "陕西/商洛市": "https://www.shangluo.gov.cn/zwgk/fdzdgknr/czxx/czyjs/czys1/a2023.htm"
+}

Разлика између датотеке није приказан због своје велике величине
+ 6 - 0
rule/kedaxunfei.json


+ 390 - 0
upzip.go

@@ -0,0 +1,390 @@
+package main
+
+import (
+	"archive/zip"
+	"bytes"
+	"fmt"
+	"io"
+	"io/ioutil"
+	"log"
+	"os"
+	"path/filepath"
+	"strings"
+
+	"github.com/axgle/mahonia"
+	"github.com/nwaples/rardecode"
+	"github.com/studio-b12/gowebdav"
+
+	"golang.org/x/text/encoding/simplifiedchinese"
+
+	"golang.org/x/text/transform"
+)
+
+/*
+	1.上云盘获取到zip、下载到本地
+	2.解压
+	3.上传云盘
+	4.删除本地文件
+
+*/
+
+func do(archivePath, extractPath string) {
+	// archivePath = "path/to/your/archive.zip" // 压缩包路径
+	// extractPath = "path/to/your/extracted"   // 解压路径
+
+	err := extractAndFlatten(archivePath, extractPath)
+	if err != nil {
+		fmt.Printf("解压缩出错:%v\n", err)
+		return
+	}
+
+	log.Println("压缩包路径:", archivePath)
+	log.Println("解压路径:", extractPath)
+
+	fmt.Println("解压缩完成!")
+}
+
+func extractAndFlatten(archivePath, extractPath string) error {
+	// 获取压缩包后缀名
+	ext := strings.ToLower(filepath.Ext(archivePath))
+
+	switch ext {
+	case ".zip":
+		return extractAndFlattenZip(archivePath, extractPath)
+	case ".rar":
+		return extractAndFlattenRar(archivePath, extractPath)
+	default:
+		return fmt.Errorf("不支持的压缩格式:%s", ext)
+	}
+}
+func decodeFilenameByByte(nameBytes []byte) (string, error) {
+	// 创建一个 GBK 解码器
+	decoder := mahonia.NewDecoder("gbk")
+
+	// 将字节切片解码为字符串
+	decodedName := decoder.ConvertString(string(nameBytes))
+
+	return decodedName, nil
+}
+func extractAndFlattenZip(archivePath, extractPath string) error {
+	r, err := zip.OpenReader(archivePath)
+	if err != nil {
+		return err
+	}
+	log.Println("---archivePath", archivePath)
+	defer r.Close()
+	var decodeName string
+	for _, f := range r.File {
+		// path := filepath.Join(extractPath, f.Name)
+		// log.Println("~~~~~~~~", f.Name)
+
+		if f.Flags == 0 {
+			i := bytes.NewReader([]byte(f.Name))
+			decoder := transform.NewReader(i, simplifiedchinese.GB18030.NewDecoder())
+			content, _ := ioutil.ReadAll(decoder)
+			decodeName = string(content)
+			f.Name = decodeName
+		} else {
+			decodeName = f.Name
+		}
+		path := filepath.Join(extractPath, decodeName)
+
+		if f.FileInfo().IsDir() {
+			os.MkdirAll(path, os.ModePerm)
+			continue
+		}
+
+		fileReader, err := f.Open()
+		if err != nil {
+			return err
+		}
+
+		targetFile, err := os.OpenFile(path, os.O_WRONLY|os.O_CREATE|os.O_TRUNC, f.Mode())
+		if err != nil {
+			fileReader.Close()
+			return err
+		}
+
+		_, err = io.Copy(targetFile, fileReader)
+		fileReader.Close()
+		targetFile.Close()
+		if err != nil {
+			return err
+		}
+
+		baseName := filepath.Base(f.Name)
+		ext := filepath.Ext(baseName)
+		//没有外层目录 取压缩包名称
+		mulu := filepath.Base(filepath.Dir(f.Name))
+		if filepath.Base(filepath.Dir(f.Name)) == "." {
+			muluarr := strings.Split(archivePath, `/`)
+			if len(muluarr) > 0 {
+				mulu = muluarr[len(muluarr)-1]
+				muluarr2 := strings.Split(mulu, ".")
+				muluarr3 := strings.Split(muluarr2[0], "_")
+				mulu = strings.Join(muluarr3[0:len(muluarr3)-1], "_")
+
+			}
+		}
+		//newName := filepath.Join(extractPath, fmt.Sprintf("%s_%s%s", filepath.Base(filepath.Dir(f.Name)), strings.TrimSuffix(baseName, ext), ext))
+		newName, err := decodeFilename(filepath.Join(extractPath, fmt.Sprintf("%s_%s%s", mulu, strings.TrimSuffix(baseName, ext), ext)))
+		if err != nil {
+			return err
+		}
+		err = os.Rename(path, newName)
+		if err != nil {
+			return err
+		}
+	}
+
+	return nil
+}
+
+func extractAndFlattenRar(archivePath, extractPath string) error {
+	rf, err := os.Open(archivePath)
+	if err != nil {
+		log.Println("rar1 err:", err)
+		return err
+	}
+	defer rf.Close()
+
+	reader, err := rardecode.NewReader(rf, "")
+	if err != nil {
+		return err
+	}
+
+	for {
+		header, err := reader.Next()
+		if err != nil {
+			if err.Error() == "EOF" {
+				break
+			}
+			return err
+		}
+		path := filepath.Join(extractPath, header.Name)
+		path = strings.ReplaceAll(path, `\`, `/`)
+		log.Println("===", path)
+		header.Name = strings.ReplaceAll(header.Name, `\`, `/`)
+		headerName := header.Name
+		if arr := strings.Split(headerName, "/"); len(arr) > 0 {
+			headerName = arr[len(arr)-1]
+			path = strings.ReplaceAll(path, header.Name, headerName)
+		}
+		if header.IsDir {
+			err = os.MkdirAll(path, os.ModePerm)
+			if err != nil {
+				return err
+			}
+			continue
+		}
+		file, err := os.OpenFile(path, os.O_WRONLY|os.O_CREATE|os.O_TRUNC, header.Mode().Perm())
+		if err != nil {
+			log.Println("rar err5:", err)
+			return err
+		}
+
+		_, err = io.Copy(file, reader)
+		file.Close()
+		if err != nil {
+			log.Println("rar err2:", err)
+			return err
+		}
+
+		baseName := filepath.Base(header.Name)
+		ext := filepath.Ext(baseName)
+		//没有外层目录 取压缩包名称
+		mulu := filepath.Base(filepath.Dir(header.Name))
+		if filepath.Base(filepath.Dir(header.Name)) == "." {
+			muluarr := strings.Split(archivePath, `/`)
+			if len(muluarr) > 0 {
+				mulu = muluarr[len(muluarr)-1]
+				muluarr2 := strings.Split(mulu, ".")
+				muluarr3 := strings.Split(muluarr2[0], "_")
+				mulu = strings.Join(muluarr3[0:len(muluarr3)-1], "_")
+
+			}
+		}
+		//newName := filepath.Join(extractPath, fmt.Sprintf("%s_%s%s", filepath.Base(filepath.Dir(header.Name)), strings.TrimSuffix(baseName, ext), ext))
+		newName, err := decodeFilename(filepath.Join(extractPath, fmt.Sprintf("%s_%s%s", mulu, strings.TrimSuffix(baseName, ext), ext)))
+		if err != nil {
+			log.Println("rar err3:", err)
+			return err
+		}
+
+		err = os.Rename(path, newName)
+		if err != nil {
+			log.Println("rar err4:", err)
+			return err
+		}
+	}
+
+	log.Println("+++++++++", extractPath)
+
+	return nil
+}
+
+// 获取数据目录
+func getRemoteFilePath_forunzip(webdav, user, secert, remote string) {
+
+	log.Println("准备下载 ", remote, cf.YusuanInfo)
+
+	client := gowebdav.NewAuthClient(webdav, gowebdav.NewAutoAuth(user, secert))
+	client.Connect()
+
+	// 获取根目录列表
+	entries, err := client.ReadDir(remote)
+	if err != nil {
+		log.Fatal(err)
+	}
+
+	// 遍历目录结构
+	for _, entry := range entries {
+		log.Println(remote + "/" + entry.Name())
+		if entry.IsDir() {
+			// 如果是目录,则递归遍历子目录
+			readDirRecursive_forunzip(client, remote+"/"+entry.Name())
+		}
+	}
+	log.Println(fmt.Sprintf("读取文件总数量为:%d", filenum))
+}
+
+//年份_承德热河地质博物馆2024年预算公开_承德热河地质博物馆2024年预算公开说明.pdf
+// 递归遍历目录结构
+func readDirRecursive_forunzip(client *gowebdav.Client, path string) {
+
+	filenum = 0 //重置数量
+	entries, err := client.ReadDir(path)
+	if err != nil {
+		log.Fatal(err)
+	}
+	for _, entry := range entries {
+		if entry.IsDir() {
+			// 如果是目录,则递归遍历子目录
+			readDirRecursive_forunzip(client, path+"/"+entry.Name())
+		} else {
+			filenum++
+			file_path := path + "/" + entry.Name()
+			yunpanPath := path
+			sp1 := strings.Split(file_path, "/")    //路径
+			sp2 := strings.Split(entry.Name(), ".") //文件名称
+			//log.Println("sp1:", sp1)
+			//log.Println("sp2:", sp2)
+			if len(sp2) < 2 {
+				continue
+			}
+			ext := sp2[1]
+			extMap := map[string]bool{
+				"rar": true,
+				"zip": true,
+			}
+			if !extMap[ext] {
+				continue
+			}
+			dirpath := fmt.Sprintf("./%s", strings.ReplaceAll(strings.Join(sp1, "@#$"), ".", ""))
+			log.Println(dirpath)
+			//创建文件
+			CreateDir(dirpath)
+			//下载
+			reader, err := client.ReadStream(file_path)
+			if err != nil {
+				log.Println("err1:", err)
+				continue
+			}
+			downLoadPath := dirpath + "/" + entry.Name()
+			fo, err := os.Create(downLoadPath)
+			if err != nil {
+				log.Println("err2:", err)
+				continue
+			}
+			io.Copy(fo, reader)
+			reader.Close()
+			fo.Close()
+
+			do(downLoadPath, dirpath)
+
+			GetPDFandWORDandEXCEL(client, dirpath, yunpanPath)
+			//yunpanPath
+		}
+	}
+}
+func GetPDFandWORDandEXCEL(client *gowebdav.Client, directory string, yunpanPath string) {
+	log.Println("寻找目标文件:", directory)
+	err := filepath.Walk(directory, func(path string, info os.FileInfo, err error) error {
+		path = strings.ReplaceAll(path, `\`, `/`)
+		if err != nil {
+			log.Println("###err:", err)
+			return err
+		}
+
+		// 检查文件扩展名
+		ext := strings.ToLower(filepath.Ext(path))
+		if ext == ".xlsx" || ext == ".xls" || ext == ".docx" || ext == ".doc" || ext == ".pdf" {
+			absPath, err := filepath.Abs(path)
+			if err != nil {
+				log.Println("转换为绝对路径出错:", err)
+				return nil
+			}
+			fmt.Println("最终文件:", absPath)
+			UploadYunPan(client, absPath, yunpanPath)
+		}
+
+		return nil
+	})
+
+	if err != nil {
+		fmt.Println("Error:", err)
+	}
+
+}
+
+func UploadYunPan(client *gowebdav.Client, localFilePath, cloudFilePath string) {
+
+	log.Println("localFilePath:", localFilePath)
+	log.Println("cloudFilePath:", cloudFilePath)
+	localFilePath = strings.ReplaceAll(localFilePath, `\`, `/`)
+	cloudFilePath = strings.ReplaceAll(cloudFilePath, `\`, `/`)
+
+	arr := strings.Split(localFilePath, "/")
+	if len(arr) > 0 {
+		cloudFilePath = cloudFilePath + "/" + "2024年_" + arr[len(arr)-1]
+	}
+
+	// 打开本地文件并读取文件内容
+	file, err := os.Open(localFilePath)
+	if err != nil {
+		fmt.Println("打开本地文件失败:", err)
+		return
+	}
+	defer file.Close()
+
+	data, err := ioutil.ReadAll(file)
+	if err != nil {
+		fmt.Println("读取本地文件内容失败:", err)
+		return
+	}
+
+	// 将文件上传到云盘
+	err = client.Write(cloudFilePath, data, 0644)
+	if err != nil {
+		fmt.Println("上传文件到云盘失败:", err)
+		return
+	}
+
+	fmt.Println("文件上传成功!")
+}
+
+func CreateDir(dirPath string) {
+	_, err := os.Stat(dirPath)
+	if os.IsNotExist(err) {
+		err := os.Mkdir(dirPath, os.ModePerm)
+		if err != nil {
+			fmt.Printf("创建文件夹出错:%v\n", err)
+			return
+		}
+		fmt.Println("文件夹创建成功!")
+	}
+}
+
+func DelDir(dirPath string) {
+	os.RemoveAll(dirPath)
+}

+ 69 - 0
util.go

@@ -0,0 +1,69 @@
+// clear
+package main
+
+import (
+	"regexp"
+	"strings"
+)
+
+var at = rune('&')
+var ed = rune(';')
+var lableMap = map[string]rune{
+	"&amp;":  rune('&'),
+	"&nbsp;": rune(' '),
+	"&gt;":   rune('>'),
+	"&lt;":   rune('<'),
+}
+
+func CleanString(input string) string {
+	reg := regexp.MustCompile("[^a-zA-Z0-9\u4e00-\u9fa5]+")
+	cleaned := reg.ReplaceAllString(input, "")
+	return cleaned
+}
+
+// 清洗正文
+func CleanDetailText(detail string) string {
+	detail = regexp.MustCompile(`<!--[\w\W]*?-->`).ReplaceAllString(detail, "")
+	detail = regexp.MustCompile(`<!--[\\n\\N]*?-->`).ReplaceAllString(detail, "")
+	detail = CutLableStr(detail)
+	return detail
+}
+
+//处理转义标签
+func CutLableStr(con string) string {
+	for i := 0; i < 3; i++ {
+		runes := []rune{}
+		pools := []rune{}
+		bpool := false
+		strings.IndexFunc(con, func(s rune) bool {
+			if !bpool && s == at {
+				bpool = true
+				pools = []rune{}
+			}
+			if bpool {
+				pools = append(pools, s)
+				if s == ed { //结束
+					lb := lableMap[string(pools)]
+					if lb != 0 {
+						runes = append(runes, lb)
+					} else {
+						runes = append(runes, pools...)
+					}
+					bpool = false
+				} else if len(pools) > 6 {
+					bpool = false
+					runes = append(runes, pools...)
+				}
+			} else {
+				runes = append(runes, s)
+			}
+			return false
+		})
+		str1 := string(runes)
+		if i > 0 && con == str1 {
+			break
+		}
+		con = str1
+	}
+	return con
+}

+ 5 - 3
webdav.go

@@ -16,7 +16,8 @@ var filenum = 0
 
 // 获取数据目录
 func getRemoteFilePath(webdav, user, secert, remote string) {
-	log.Println("准备下载 ", remote)
+	log.Println("准备下载 ", remote, cf.YusuanInfo)
+
 	client := gowebdav.NewAuthClient(webdav, gowebdav.NewAutoAuth(user, secert))
 	client.Connect()
 
@@ -58,7 +59,7 @@ func readDirRecursive(client *gowebdav.Client, path string) {
 			sp2 := strings.Split(entry.Name(), ".")
 			if len(sp2) < 2 || len(sp1) < 3 {
 				log.Println(file_path)
-				db.Update("fileitem_err",
+				db.Update(fmt.Sprintf("%s_err", cf.YusuanInfo),
 					map[string]interface{}{"file_path": file_path},
 					map[string]interface{}{
 						"$set": map[string]interface{}{
@@ -69,7 +70,7 @@ func readDirRecursive(client *gowebdav.Client, path string) {
 					false,
 				)
 			} else {
-				db.Update("fileitem",
+				db.Update(cf.YusuanInfo,
 					map[string]interface{}{"file_path": file_path},
 					map[string]interface{}{
 						"$set": map[string]interface{}{
@@ -82,6 +83,7 @@ func readDirRecursive(client *gowebdav.Client, path string) {
 							"area":       sp1[1],
 							"city":       sp1[2],
 							"updatetime": time.Now().Unix(),
+							// "publish_org_type":
 						}},
 					true,
 					false,

+ 66 - 1
yusuan.go

@@ -8,6 +8,9 @@ import (
 	"strconv"
 	"strings"
 	"time"
+
+	"app.yhyue.com/moapp/jybase/mongodb"
+	"github.com/gogf/gf/v2/util/gconv"
 )
 
 var regString = `(\d+[.,]{0,}\d+)`
@@ -15,8 +18,10 @@ var reg, _ = regexp.Compile(regString)
 
 // 从解析文档中提取全部项目信息
 func getProjectItemFromFilejx() {
+
 	list, _ := db.Find(cf.YusuanInfo, `{"handle":{"$exists":1}}`, nil, nil, false, -1, -1)
-	// list, _ := db.Find(cf.YusuanInfo, `{ "file_path" : "2024年/北京/北京市/政府/2024_北京市经济和信息化局_1.xlsx" }`, nil, nil, false, -1, -1)
+	//list, _ := db.Find(cf.YusuanInfo, `{"file_path" : "2024年/内蒙古/内蒙古/政府/2024_准格尔旗人民法院_9.xlsx"}`, nil, nil, false, -1, -1)
+
 	pronum := 0
 	for k, data := range *list {
 		tmp, _ := data["performance_result"].([]interface{})
@@ -48,6 +53,10 @@ func getProjectItemFromFilejx() {
 						if strings.Contains(unit, "万") {
 							item["budget_f"] = math.Round(item["budget_f"].(float64) * 10000)
 						}
+						budget_f := item["budget_f"].(float64)
+						if unit == "" && budget_f < 1000 {
+							item["budget_f"] = math.Round(budget_f * 10000)
+						}
 					} else {
 						total_amount, ok := item["total_amount"]
 						if ok {
@@ -71,11 +80,24 @@ func getProjectItemFromFilejx() {
 							if strings.Contains(unit, "万") {
 								item["budget_f"] = math.Round(item["budget_f"].(float64) * 10000)
 							}
+							budget_f := item["budget_f"].(float64)
+							if unit == "" && budget_f < 1000 {
+								item["budget_f"] = math.Round(budget_f * 10000)
+							}
 						}
 					}
 					for _, f := range cf.Projectitem_field {
 						item[f] = data[f]
 					}
+					year := gconv.String(item["year"])
+					projectname := gconv.String(item["projectname"])
+					procure_content := gconv.String(item["procure_content"])
+					kpi := gconv.String(item["kpi"])
+					institution := gconv.String(item["institution"])
+					//生成hashcode
+					item["hash_code"] = Hash(year, projectname, procure_content, kpi, institution)
+					item["fileitem_id"] = mongodb.BsonIdToSId(data["_id"])
+
 					pronum++
 					db.Save(cf.ProjectItem, item)
 				}
@@ -101,8 +123,43 @@ type Data struct {
 	rule_index string
 }
 
+func LoadingHash() map[string]bool {
+	HashMap := map[string]bool{}
+	sess := db.GetMgoConn()
+	defer db.DestoryMongoConn(sess)
+
+	it := sess.DB(cf.Collections).C(ucf.Totbale).Find(nil).Select(map[string]interface{}{
+		"year":            1,
+		"projectname":     1,
+		"procure_content": 1,
+		"kpi":             1,
+		"institution":     1,
+		"_id":             1,
+		"hash_code":       1,
+	}).Iter()
+	i := 0
+	for m := make(map[string]interface{}); it.Next(&m); {
+		i++
+		if i%1000 == 0 {
+			log.Println("count:", i)
+		}
+
+		hash_code := gconv.String(m["hash_code"])
+		HashMap[hash_code] = true
+
+		m = make(map[string]interface{})
+	}
+
+	return HashMap
+}
+
 func getCustomerMatchProject() {
+	log.Println("开始加载历史匹配数据")
+	HashMap := LoadingHash()
+	log.Println("历史匹配数据加载完毕,总数据量:", len(HashMap))
+	log.Println("开始加载数据")
 	list, _ := db.Find(cf.ProjectItem, nil, nil, nil, false, -1, -1)
+	log.Println("加载完毕,总数据量:", len(*list))
 	pipienum := 0
 	for k, tmp := range *list {
 		d := &Data{
@@ -179,6 +236,14 @@ func getCustomerMatchProject() {
 			tmp["matchkey_not"] = getKeyMap(d.notmatchkey)
 			tmp["matchkey_not_filed"] = getKeyMap(d.notmatchkey_field)
 
+			//TODO 	判断判重
+			hash_code := gconv.String(tmp["hash_code"])
+			if HashMap[hash_code] {
+				tmp["repeat"] = -1
+			} else {
+				tmp["repeat"] = 1
+			}
+
 			tmp["rule_index"] = d.rule_index
 			tmp["comeintime"] = time.Now().Unix()
 

+ 52 - 0
zhengfumingxi.go

@@ -0,0 +1,52 @@
+package main
+
+import (
+	"fmt"
+	"log"
+
+	"app.yhyue.com/moapp/jybase/mongodb"
+	"github.com/gogf/gf/v2/util/gconv"
+)
+
+// 从解析文档中提取全部项目信息
+// 没有单位 1000一下 默认 *10000
+func getYusuanPurchasing() {
+
+	list, _ := db.Find(cf.YusuanInfo, `{"handle":{"$exists":1}}`, nil, nil, false, -1, -1)
+	//list, _ := db.Find(cf.YusuanInfo, `{"file_path" : "2024年/内蒙古/内蒙古/政府/2024_准格尔旗人民法院_14.xlsx"}`, nil, nil, false, -1, -1)
+
+	pronum := 0
+	for k, data := range *list {
+		tmp, _ := data["procurementdetails_result"].([]interface{})
+		if len(tmp) > 0 {
+			for _, v := range tmp {
+				t, _ := v.(map[string]interface{})
+				tmp3, _ := t["sheetdata"].([]interface{})
+				for _, v := range tmp3 {
+					item, _ := v.(map[string]interface{})
+
+					for _, f := range cf.Projectitem_field_mingxi {
+						item[f] = data[f]
+					}
+					year := gconv.String(item["year"])
+					projectname := gconv.String(item["projectname"])
+					pro_code := gconv.String(item["pro_code"])
+					pro_item := gconv.String(item["pro_item"])
+					institution := gconv.String(item["institution"])
+					number := gconv.Int64(item["number"])
+					//生成hashcode
+					str := fmt.Sprintf("%s%s%s%s%s%v", year, projectname, pro_code, pro_item, institution, number)
+					hash_code := HashCode(str)
+					item["hash_code"] = hash_code
+					item["fileitem_id"] = mongodb.BsonIdToSId(data["_id"])
+
+					pronum++
+					db.Save(cf.Yusuan_mingxi, item)
+				}
+			}
+		}
+		if k%1000 == 0 {
+			log.Printf("加载数据量为:%d,生成项目数据量为:%d", k, pronum)
+		}
+	}
+}

Неке датотеке нису приказане због велике количине промена