瀏覽代碼

添加专项债 处理程序

wcc 5 月之前
父節點
當前提交
cfcf0479f9
共有 11 個文件被更改,包括 1465 次插入0 次删除
  1. 5 0
      README.md
  2. 1 0
      bidding_tags/readme.md
  3. 5 0
      escheck/main.go
  4. 291 0
      zhaiquan/config.go
  5. 61 0
      zhaiquan/config.toml
  6. 53 0
      zhaiquan/go.mod
  7. 267 0
      zhaiquan/go.sum
  8. 100 0
      zhaiquan/init.go
  9. 470 0
      zhaiquan/main.go
  10. 211 0
      zhaiquan/readme.md
  11. 1 0
      zhaiquan/tools.go

+ 5 - 0
README.md

@@ -77,6 +77,11 @@
 
 - 芝麻企业画像标签
 
+### zhaiquan
+
++ 1.处理专项债和项目相关数据,存储到MySQL
++ 2 更新项目和专项债的关联关系
+
 
 ### pre_extract
 

+ 1 - 0
bidding_tags/readme.md

@@ -6,4 +6,5 @@
   `tag_topinformation` 字段是一个字符串数组,目前分类程序打的有 `情报_物业` ,现在要根据 李俊良
   那边字段 `gov_classify.zc_code`,
   去扩充 `tag_topinformation`,需要追加 `情报_环境采购`,`情报_印务商机`,`情报_家具招投标`,`情报_车辆租赁`,`情报_安防`。
+- "情报_物业", "情报_环境采购", "情报_印务商机", "情报_家具招投标", "情报_车辆租赁", "情报_安防", "情报_法务", "情报_财务审计", "情报_招标代理", "情报_管理咨询", "情报_保险", "情报_工程设计咨询"
 

+ 5 - 0
escheck/main.go

@@ -110,6 +110,10 @@ func (t *T) task() {
 	fmt.Println("eq", eq)
 	eq1 := fmt.Sprintf(esQ1, st1, et1)
 	fmt.Println("eq1", eq1)
+	// 将时间戳转换为 time.Time 类型
+	stt := time.Unix(st, 0)
+	// 格式化时间为 "YYYY-MM-DD HH:MM:SS" 形式
+	formattedTime := stt.Format("2006-01-02")
 
 	rangeQuery := es.NewRangeQuery("id").Gte(st1).Lt(et1)
 	//竞品网站统计
@@ -335,6 +339,7 @@ func (t *T) task() {
 			var reportBuilder strings.Builder
 			// 开始表格
 			reportBuilder.WriteString("<table>")
+			reportBuilder.WriteString(formattedTime)
 			reportBuilder.WriteString("<tr><th>统计项</th><th>es统计</th><th>mgo统计</th><th>差值</th><th>mgo总入库量</th></tr>")
 
 			addTableRow(&reportBuilder, "阿里云es集群", count, count3, count3-count, count2)

+ 291 - 0
zhaiquan/config.go

@@ -0,0 +1,291 @@
+package main
+
+import "time"
+
+type GlobalConf struct {
+	Mongob      MgoConf
+	Cron        CronConf
+	Mongop      MgoConf
+	Mysql       MysqlConf
+	Log         Log
+	Mongospider MgoConf
+	Email       EmailConf
+	Clickhouse  CkConf
+}
+
+type MgoConf struct {
+	Host     string
+	DB       string
+	Coll     string // 查询表
+	Username string
+	Password string
+	Size     int
+	Direct   bool
+	List     string
+	Detail   string
+}
+
+// CronConf 定时任务
+type CronConf struct {
+	Spec   string
+	Url    string
+	Start  int
+	End    int
+	Delete int
+}
+
+type CkConf struct {
+	Host     string
+	Username string
+	Password string
+	DB       string
+}
+
+type MysqlConf struct {
+	Address  string
+	Dbname   string
+	Username string
+	Password string
+	Prefix   string //数据表前缀
+	Table    string
+	Stime    string
+	Etime    string
+	Test     bool
+}
+
+type Log struct {
+	LogPath    string
+	MaxSize    int
+	Compress   bool
+	MaxAge     int
+	MaxBackups int
+	LogLevel   string
+	Format     string
+}
+
+type EmailConf struct {
+	Api string
+	To  string
+}
+
+// ProjectBaseInfo 项目基本信息
+type ProjectBaseInfo struct {
+	ID                       int     `json:"id" gorm:"primaryKey;autoIncrement;column:id;comment:主键自增"`
+	ProjectName              string  `json:"project_name" gorm:"size:255;index;not null;column:project_name;comment:项目名称,索引"`
+	TotalInvestment          float64 `json:"total_investment" gorm:"column:total_investment;comment:总投资(万元)"`
+	Area                     string  `json:"area" gorm:"size:255;column:area;comment:省份"`
+	City                     string  `json:"city" gorm:"size:255;column:city;comment:城市"`
+	District                 string  `json:"district" gorm:"size:255;column:district;comment:区县"`
+	Capital                  float64 `json:"capital" gorm:"column:capital;comment:不含专项债的资本金(万元)"`
+	ApplyTotalBonds          float64 `json:"apply_total_bonds" gorm:"column:apply_total_bonds;comment:申请专项债总额(万元)"`
+	OtherDebtFinancing       float64 `json:"other_debt_financing" gorm:"column:other_debt_financing;comment:其他债务融资(万元)"`
+	SpecialDebtCapital       float64 `json:"special_debt_capital" gorm:"column:special_debt_capital;comment:专项债作资本金(万元)"`
+	ExpectedReturn           float64 `json:"expected_return" gorm:"column:expected_return;comment:预期收入(万元)"`
+	ProjectCost              int     `json:"project_cost" gorm:"column:project_cost;comment:成本"`
+	ProjectDomain            string  `json:"project_domain" gorm:"size:255;column:project_domain;comment:项目领域"`
+	ProjectOwner             string  `json:"project_owner" gorm:"size:255;column:project_owner;comment:项目业主"`
+	StartDate                string  `json:"start_date" gorm:"size:255;column:start_date;comment:建设期开始"`
+	EndDate                  string  `json:"end_date" gorm:"size:255;column:end_date;comment:建设期结束"`
+	OperationStartDate       string  `json:"operation_start_date" gorm:"size:255;column:operation_start_date;comment:运营期开始"`
+	OperationEndDate         string  `json:"operation_end_date" gorm:"size:255;column:operation_end_date;comment:运营期结束"`
+	SourceIncome             string  `json:"source_income" gorm:"size:500;column:source_income;comment:收入来源"`
+	ConstructionContent      string  `json:"construction_content" gorm:"size:500;column:construction_content;comment:建设内容"`
+	Remarks                  string  `json:"remarks" gorm:"size:500;column:remarks;comment:特殊情况备注"`
+	OtherDebtFinancingSource string  `json:"other_debt_financing_source" gorm:"size:500;column:other_debt_financing_source;comment:其他债务融资来源"`
+	CostIncomePercent        string  `json:"cost_income_percent" gorm:"size:50;column:cost_income_percent;comment:成本/收入(%)"`
+	CoverageMultiple         float64 `json:"coverage_multiple" gorm:"column:coverage_multiple;comment:覆盖倍数"`
+	CompetentDepartment      string  `json:"competent_department" gorm:"size:255;column:competent_department;comment:主管部门"`
+	AccountingFirm           string  `json:"accounting_firm" gorm:"size:255;column:accounting_firm;comment:会计所"`
+	LawFirm                  string  `json:"law_firm" gorm:"size:255;column:law_firm;comment:律所"`
+	CreateDate               string  `json:"create_date" gorm:"size:255;column:create_date;comment:原网站创建时间"`
+	UpdateDate               string  `json:"update_date" gorm:"size:255;column:update_date;comment:原网站更新时间"`
+}
+
+// TableName 指定数据库表名
+func (ProjectBaseInfo) TableName() string {
+	if GF.Mysql.Prefix != "" {
+		return GF.Mysql.Prefix + "_project_base_info"
+	} else {
+		return "project_base_info"
+	}
+
+}
+
+// ProjectChange 项目变更记录
+type ProjectChange struct {
+	ID            int        `json:"id" gorm:"primaryKey;autoIncrement;comment:主键自增"`
+	ProjectID     int        `json:"project_id" gorm:"column:project_id;comment:项目ID" `
+	ProjectName   string     `json:"project_name" gorm:"column:project_name;size:255;index;not null;comment:项目名称,索引"`
+	ChangeContent string     `json:"change_content,omitempty" gorm:"column:change_content;size:1000;comment:变更内容"`
+	UpdateReason  string     `json:"update_reason" gorm:"column:update_reason;size:1000;comment:变更原因"`
+	SubmitTime    string     `json:"submit_time" gorm:"column:submit_time;size:1000;comment:提交时间"`
+	Comeintime    *time.Time `json:"comeintime" gorm:"column:comeintime;autoCreateTime"` // 入库时间
+	Updatetime    *time.Time `json:"updatetime" gorm:"column:updatetime;autoUpdateTime"` // 更新时间
+}
+
+// TableName 指定数据库表名
+func (ProjectChange) TableName() string {
+	if GF.Mysql.Prefix != "" {
+		return GF.Mysql.Prefix + "_project_change"
+	} else {
+		return "project_change"
+	}
+
+}
+
+// ProjectRepayment 项目还本付息
+type ProjectRepayment struct {
+	ID                    int     `json:"id" gorm:"primaryKey;autoIncrement;column:id;comment:主键自增"`
+	ProjectID             int     `json:"project_id" gorm:"column:project_id;comment:项目ID" `
+	ProjectName           string  `json:"project_name" gorm:"size:255;index;not null;column:project_name;comment:项目名称"`
+	BondName              string  `json:"bond_name" gorm:"size:255;column:bond_name;comment:债券名称"`
+	IssueTerm             int     `json:"issue_term" gorm:"column:issue_term;comment:发行期限(年)"`
+	PayInterestMethodName string  `json:"pay_interest_method_name" gorm:"size:255;column:pay_interest_method_name;comment:付息方式"`
+	ValueDate             string  `json:"value_date" gorm:"size:50;column:value_date;comment:起息日"`
+	InterestDate          string  `json:"interest_date" gorm:"size:50;column:interest_date;comment:付息日"`
+	LastInterestDate      string  `json:"last_interest_date" gorm:"size:50;column:last_interest_date;comment:最近付息日"`
+	ReminderRepayDays     int     `json:"reminder_repay_days" gorm:"column:reminder_repay_days;comment:提醒还款(天)"`
+	MaturityDate          string  `json:"maturity_date" gorm:"size:50;column:maturity_date;comment:到期日"`
+	DebtService           float64 `json:"debt_service" gorm:"column:debt_service;comment:还本付息(万元)"`
+	RedemptionMethod      string  `json:"redemption_method" gorm:"size:255;column:redemption_method;comment:赎回方式"`
+	CumulativePayInterest int     `json:"cumulative_pay_interest" gorm:"column:cumulative_pay_interest;comment:累计付息(万元)"`
+	IsEarlyRepayPrincipal string  `json:"is_early_repay_principal" gorm:"size:50;column:is_early_repay_principal;comment:提前还本"`
+	Remarks               string  `json:"remarks" gorm:"size:5000;column:remarks;comment:备注"`
+}
+
+// TableName 指定数据库表名
+func (ProjectRepayment) TableName() string {
+	if GF.Mysql.Prefix != "" {
+		return GF.Mysql.Prefix + "_project_repayment"
+	} else {
+		return "project_repayment"
+	}
+
+}
+
+// ProjectIssueDetails 项目发行明细表
+type ProjectIssueDetails struct {
+	ID                     int     `json:"id" gorm:"primaryKey;autoIncrement;column:id;comment:主键自增"`
+	ProjectID              int     `json:"project_id" gorm:"column:project_id;comment:项目ID" `
+	ProjectName            string  `json:"project_name" gorm:"size:255;index;not null;column:project_name;comment:项目名称"`
+	ProjectBachName        string  `json:"project_bach_name" gorm:"size:255;index;not null;column:project_bach_name;comment:项目名称"`
+	BondName               string  `json:"bond_name" gorm:"size:255;column:bond_name;comment:债券名称"`
+	FirstPublishDate       string  `json:"first_publish_date" gorm:"size:50;column:first_publish_date;comment:发布时间"`
+	BatchNum               int     `json:"batch_num" gorm:"column:batch_num;comment:批次"`
+	PresentIssueAmount     float64 `json:"present_issue_amount" gorm:"column:present_issue_amount;comment:发行额"`
+	IssueInterestRate      float64 `json:"issue_interest_rate" gorm:"column:issue_interest_rate;comment:发行利率"`
+	PresentAsSpecialAmount float64 `json:"present_as_special_amount" gorm:"column:present_as_special_amount;comment:专项债作为资本金发行额"`
+	TotalIssueAmount       float64 `json:"total_issue_amount" gorm:"column:total_issue_amount;comment:累计发行金额"`
+	ReviseLog              string  `json:"revise_log" gorm:"size:1000;column:revise_log;comment:调整记录"`
+}
+
+// TableName 指定数据库表名
+func (ProjectIssueDetails) TableName() string {
+	if GF.Mysql.Prefix != "" {
+		return GF.Mysql.Prefix + "_project_issue_details"
+	} else {
+		return "project_issue_details"
+	}
+
+}
+
+// BondInfo 债券基本信息
+type BondInfo struct {
+	ID                    int     `json:"id" gorm:"primaryKey;autoIncrement;column:id;comment:主键自增"`
+	BondName              string  `json:"bond_name" gorm:"size:255;index;not null;column:bond_name;comment:债券名称"`
+	BondShortName         string  `json:"bond_short_name" gorm:"size:255;column:bond_short_name;comment:债券简称"`
+	BondNo                string  `json:"bond_no" gorm:"size:100;column:bond_no;comment:债券编码"`
+	Area                  string  `json:"area" gorm:"size:100;column:area;comment:省份"`
+	BondNature            string  `json:"bond_nature" gorm:"size:255;column:bond_nature;comment:债券性质"`
+	BondType              string  `json:"bond_type" gorm:"size:255;column:bond_type;comment:债券类型"`
+	OfficialProjectType   string  `json:"official_project_type" gorm:"size:255;column:official_project_type;comment:官方项目类型"`
+	TotalAmount           float64 `json:"total_amount" gorm:"column:total_amount;comment:发行金额(万元)"`
+	IssueDate             string  `json:"issue_date" gorm:"type:datetime;column:issue_date;comment:发行日期"`
+	IssuePlace            string  `json:"issue_place" gorm:"size:255;column:issue_place;comment:发行场所"`
+	IssueTerm             int     `json:"issue_term" gorm:"column:issue_term;comment:发行期限(年)"`
+	IssueInterestRate     string  `json:"issue_interest_rate" gorm:"size:50;column:issue_interest_rate;comment:发行利率(%)"`
+	IssuePhase            string  `json:"issue_phase" gorm:"size:50;column:issue_phase;comment:发行期数"`
+	WayOfPayInterest      string  `json:"way_of_pay_interest" gorm:"size:255;column:way_of_pay_interest;comment:付息方式"`
+	NewBondAmount         float64 `json:"new_bond_amount" gorm:"column:new_bond_amount;comment:新增债券(亿元)"`
+	CounterBondAmount     float64 `json:"counter_bond_amount" gorm:"column:counter_bond_amount;comment:置换债券(亿元)"`
+	RefinancingBondAmount float64 `json:"refinancing_bond_amount" gorm:"column:refinancing_bond_amount;comment:再融资债券(亿元)"`
+	RedemptionMethod      string  `json:"redemption_method" gorm:"size:255;column:redemption_method;comment:赎回方式"`
+	ValueDate             string  `json:"value_date" gorm:"size:50;column:value_date;comment:起息日"`
+	ExpiryDate            string  `json:"expiry_date" gorm:"size:50;column:expiry_date;comment:到息日"`
+	PayInterestDate       string  `json:"pay_interest_date" gorm:"size:50;column:pay_interest_date;comment:付息日"`
+	LatePayInterestDate   string  `json:"late_pay_interest_date" gorm:"size:50;column:late_pay_interest_date;comment:最近付息日"`
+	RemindPayDays         int     `json:"remind_pay_days" gorm:"column:remind_pay_days;comment:提醒还款(天)"`
+	LastPayInterest       float64 `json:"last_pay_interest" gorm:"column:last_pay_interest;comment:上期已付息(亿元)"`
+	IsEarlyRepayPrincipal string  `json:"is_early_repay_prinipal" gorm:"size:50;column:is_early_repay_prinipal;comment:提前还本"`
+	CumulativePayInterest float64 `json:"cumulative_pay_interest" gorm:"column:cumulative_pay_interest;comment:累计付息(亿元)"`
+	IsCounterBond         string  `json:"is_counter_bond" gorm:"size:50;column:is_counter_bond;comment:柜台债"`
+}
+
+// TableName 指定数据库表名
+func (BondInfo) TableName() string {
+	if GF.Mysql.Prefix != "" {
+		return GF.Mysql.Prefix + "_bond_info"
+	} else {
+		return "bond_info"
+	}
+
+}
+
+// BondAttachment 债券相关附件
+type BondAttachment struct {
+	ID          int        `json:"id" gorm:"primaryKey;autoIncrement;comment:主键自增"`
+	BondName    string     `json:"bondName" gorm:"column:bondName;size:255;index;not null;comment:债券名称,索引"`
+	File        string     `json:"file" gorm:"column:file;size:500;not null;comment:附件"`
+	FileType    string     `json:"fileType,omitempty" gorm:"column:fileType;size:100;comment:附件类型"`
+	Source      string     `json:"source,omitempty" gorm:"column:source;size:255;comment:资料来源"`
+	PublishTime string     `json:"publishTime,omitempty" gorm:"column:publishTime;size:50;comment:发布时间"`
+	Comeintime  *time.Time `json:"comeintime" gorm:"column:comeintime;autoCreateTime"` // 入库时间
+	Updatetime  *time.Time `json:"updatetime" gorm:"column:updatetime;autoUpdateTime"` // 更新时间
+}
+
+// TableName 指定数据库表名
+func (BondAttachment) TableName() string {
+	if GF.Mysql.Prefix != "" {
+		return GF.Mysql.Prefix + "_bond_attachment"
+	} else {
+		return "bond_attachment"
+	}
+
+}
+
+// BondChangeLog 债券修改记录
+type BondChangeLog struct {
+	ID           int        `json:"id" gorm:"primaryKey;autoIncrement;comment:主键自增"`
+	BondName     string     `json:"bondName" gorm:"column:bondName;size:255;index;not null;comment:债券名称"`
+	ProjectName  string     `json:"projectName,omitempty" gorm:"column:projectName;size:255;comment:项目名称"`
+	ChangeReason string     `json:"changeReason,omitempty" gorm:"column:changeReason;size:500;comment:变更原因"`
+	ChangeDetail string     `json:"changeDetail,omitempty" gorm:"column:changeDetail;size:1000;comment:变更内容"`
+	Comeintime   *time.Time `json:"comeintime" gorm:"column:comeintime;autoCreateTime"` // 入库时间
+	Updatetime   *time.Time `json:"updatetime" gorm:"column:updatetime;autoUpdateTime"` // 更新时间
+}
+
+// TableName 指定数据库表名
+func (BondChangeLog) TableName() string {
+	if GF.Mysql.Prefix != "" {
+		return GF.Mysql.Prefix + "_bond_change_log"
+	} else {
+		return "bond_change_log"
+	}
+
+}
+
+type ProjectBondRelation struct {
+	ID        int `json:"id" gorm:"primaryKey;autoIncrement;comment:主键自增"`
+	ProjectID int `json:"project_id" gorm:"column:project_id;comment:项目ID"`
+	BondID    int `json:"bond_id" gorm:"column:bond_id;comment:债券ID"`
+}
+
+// TableName 指定数据库表名
+func (ProjectBondRelation) TableName() string {
+	if GF.Mysql.Prefix != "" {
+		return GF.Mysql.Prefix + "_project_bond_relation"
+	} else {
+		return "project_bond_relation"
+	}
+
+}

+ 61 - 0
zhaiquan/config.toml

@@ -0,0 +1,61 @@
+[mongob]  ## bidding 链接
+    host = "127.0.0.1:27081"
+#    host = "172.17.189.140:27080"
+    db = "py_theme"
+    coll = ""
+    username = ""
+    password = ""
+    direct = true
+    list ="specialbond_list,specialbond_list_history,specialbond_list_202502"    ## 列表数据表
+    detail = "specialbond_detail,specialbond_detail_history,specialbond_detail_202502" ## 详情数据表
+
+
+
+
+[cron] ## 定时任务
+#    spec = "0 */1 * * * *"  ## 5分钟执行一次
+    spec = "0 03 7,12,15,20 * * *"   ## 每天7,12,15,20点执行
+    url = "https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=0fc090e3-ceda-448d-8aba-d00a2994be7e"## 微信群通知机器人
+
+
+[mysql] ## 数据库MySQL
+    address = "127.0.0.1:3306" ## 本地
+    dbname=   "jianyu_zhuanxiangzhai" ##
+    username = "root"
+    password= "123"
+    prefix = "zxz" ## mysql 数据表前缀
+
+
+
+#    address = "127.0.0.1:4001" ## 本地
+##    address = "172.17.162.27:14000" ## 线上
+#    dbname=   "data_analysis" ##
+#    username = "datascbi"
+#    password= "Da#Bi20221111SC"
+#    table = "dataexport_order" ## 订单表
+#    etime = ""  ## 数据截止时间,"2024-11-02"
+#    test = true
+
+
+
+
+## 日志
+# 日志
+[log]
+    # 日志路径,为空将输出控制台
+    logpath = ""
+#    logpath = "logs/log.out"
+    # log size (M)
+    maxsize = 10
+    # compress log
+    compress = true
+    # log save  time (day)
+    maxage =  7
+    # save total log file total
+    maxbackups = 10
+    # log level
+    loglevel  = "debug"
+    # text or json output
+    format = "json"
+
+

+ 53 - 0
zhaiquan/go.mod

@@ -0,0 +1,53 @@
+module zhaiquan
+
+go 1.22.6
+
+require (
+	github.com/spf13/viper v1.19.0
+	go.uber.org/zap v1.22.0
+	gorm.io/driver/mysql v1.5.7
+	gorm.io/gorm v1.25.12
+	jygit.jydev.jianyu360.cn/data_processing/common_utils v0.0.0-20240412074219-927f3f682cb3
+)
+
+require (
+	github.com/PuerkitoBio/goquery v1.8.0 // indirect
+	github.com/andybalholm/cascadia v1.3.1 // indirect
+	github.com/dchest/captcha v1.0.0 // indirect
+	github.com/fsnotify/fsnotify v1.7.0 // indirect
+	github.com/go-sql-driver/mysql v1.7.0 // indirect
+	github.com/golang/snappy v0.0.1 // indirect
+	github.com/hashicorp/hcl v1.0.0 // indirect
+	github.com/jinzhu/inflection v1.0.0 // indirect
+	github.com/jinzhu/now v1.1.5 // indirect
+	github.com/klauspost/compress v1.17.2 // indirect
+	github.com/magiconair/properties v1.8.7 // indirect
+	github.com/mitchellh/mapstructure v1.5.0 // indirect
+	github.com/montanaflynn/stats v0.0.0-20171201202039-1bf9dbcd8cbe // indirect
+	github.com/pelletier/go-toml/v2 v2.2.2 // indirect
+	github.com/pkg/errors v0.9.1 // indirect
+	github.com/sagikazarmark/locafero v0.4.0 // indirect
+	github.com/sagikazarmark/slog-shim v0.1.0 // indirect
+	github.com/sourcegraph/conc v0.3.0 // indirect
+	github.com/spf13/afero v1.11.0 // indirect
+	github.com/spf13/cast v1.6.0 // indirect
+	github.com/spf13/pflag v1.0.5 // indirect
+	github.com/subosito/gotenv v1.6.0 // 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/youmark/pkcs8 v0.0.0-20181117223130-1be2e3e5546d // indirect
+	go.mongodb.org/mongo-driver v1.10.1 // indirect
+	go.uber.org/atomic v1.9.0 // indirect
+	go.uber.org/multierr v1.9.0 // indirect
+	golang.org/x/crypto v0.21.0 // indirect
+	golang.org/x/exp v0.0.0-20230905200255-921286631fa9 // indirect
+	golang.org/x/net v0.23.0 // indirect
+	golang.org/x/sync v0.6.0 // indirect
+	golang.org/x/sys v0.18.0 // indirect
+	golang.org/x/text v0.14.0 // indirect
+	gopkg.in/ini.v1 v1.67.0 // indirect
+	gopkg.in/mgo.v2 v2.0.0-20190816093944-a6b53ec6cb22 // indirect
+	gopkg.in/natefinch/lumberjack.v2 v2.0.0 // indirect
+	gopkg.in/yaml.v3 v3.0.1 // indirect
+)

+ 267 - 0
zhaiquan/go.sum

@@ -0,0 +1,267 @@
+cloud.google.com/go v0.26.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/andybalholm/cascadia v1.3.1 h1:nhxRkql1kdYCc8Snf7D5/D3spOX+dBgjA6u8x004T2c=
+github.com/andybalholm/cascadia v1.3.1/go.mod h1:R4bJ1UQfqADjvDa4P6HZHLh/3OxWWEqc0Sk8XGwHqvA=
+github.com/aws/aws-sdk-go v1.43.21/go.mod h1:y4AeaBuwd2Lk+GepC1E9v0qOiTws0MIWAX4oIKwKHZo=
+github.com/benbjohnson/clock v1.1.0 h1:Q92kusRqC1XV2MjkWETPvjJVqKetz1OzxZB7mHJLju8=
+github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA=
+github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=
+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/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
+github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
+github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM=
+github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
+github.com/dchest/captcha v1.0.0 h1:vw+bm/qMFvTgcjQlYVTuQBJkarm5R0YSsDKhm1HZI2o=
+github.com/dchest/captcha v1.0.0/go.mod h1:7zoElIawLp7GUMLcj54K9kbw+jEyvz2K0FDdRRYhvWo=
+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/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=
+github.com/fortytw2/leaktest v1.3.0/go.mod h1:jDsjWgpAGjm2CA7WthBh/CdZYEPF31XHquHwclZch5g=
+github.com/frankban/quicktest v1.14.6 h1:7Xjx+VpznH+oBnejlPUj8oUpdxnVs4f8XU8WnHkI4W8=
+github.com/frankban/quicktest v1.14.6/go.mod h1:4ptaffx2x8+WTWXmUCuVU6aPUX1/Mz7zb5vbUoiM6w0=
+github.com/fsnotify/fsnotify v1.7.0 h1:8JEhPFa5W2WU7YfeZzPNqzMP6Lwt7L2715Ggo0nosvA=
+github.com/fsnotify/fsnotify v1.7.0/go.mod h1:40Bi/Hjc2AVfZrqy+aj+yEI+/bRxZnMJyTJwOpGvigM=
+github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=
+github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE=
+github.com/go-sql-driver/mysql v1.6.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg=
+github.com/go-sql-driver/mysql v1.7.0 h1:ueSltNNllEqE3qcWBTD0iQd3IpL/6U+mJxLkazJ7YPc=
+github.com/go-sql-driver/mysql v1.7.0/go.mod h1:OXbVy3sEdcQ2Doequ6Z5BW6fXNQTmx+9S1MCJN5yJMI=
+github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=
+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.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
+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.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=
+github.com/golang/snappy v0.0.1 h1:Qgr9rKW7uDUkrbSmQeiDsGa8SjGyCOGtuasMWwvp2P4=
+github.com/golang/snappy v0.0.1/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=
+github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
+github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
+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/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8/DtOE=
+github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38=
+github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
+github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
+github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4=
+github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ=
+github.com/jinzhu/inflection v1.0.0 h1:K317FqzuhWc8YvSVlFMCCUb36O/S9MCKRDI7QkRKD/E=
+github.com/jinzhu/inflection v1.0.0/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkryuEj+Srlc=
+github.com/jinzhu/now v1.1.5 h1:/o9tlHleP7gOFmsnYNz3RGnqzefHA47wQpKrrdTIwXQ=
+github.com/jinzhu/now v1.1.5/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/klauspost/compress v1.13.6/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk=
+github.com/klauspost/compress v1.17.2 h1:RlWWUY/Dr4fL8qk9YG7DTZ7PDgME2V4csBXA8L/ixi4=
+github.com/klauspost/compress v1.17.2/go.mod h1:ntbaceVETuRiXiv4DpjP66DpAtAGkEQskQzEyD//IeE=
+github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
+github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE=
+github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk=
+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 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=
+github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=
+github.com/magiconair/properties v1.8.7 h1:IeQXZAiQcpL9mgcAe1Nu6cX9LLw6ExEHKjN0VQdvPDY=
+github.com/magiconair/properties v1.8.7/go.mod h1:Dhd985XPs7jluiymwWYZ0G4Z61jb3vdS329zhj2hYo0=
+github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc=
+github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY=
+github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo=
+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/nsqio/go-nsq v1.1.0/go.mod h1:vKq36oyeVXgsS5Q8YEO7WghqidAVXQlcFxzQbQTuDEY=
+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/pelletier/go-toml/v2 v2.2.2 h1:aYUidT7k73Pcl9nb2gScu7NSrKCSHIDE89b3+6Wq+LM=
+github.com/pelletier/go-toml/v2 v2.2.2/go.mod h1:1t835xjRzz80PqgE6HHgN2JOsmgYu/h4qDAS4n929Rs=
+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/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
+github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U=
+github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
+github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
+github.com/rogpeppe/go-internal v1.9.0 h1:73kH8U+JUqXU8lRuOHeVHaa/SZPifC7BkcraZVejAe8=
+github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs=
+github.com/sagikazarmark/locafero v0.4.0 h1:HApY1R9zGo4DBgr7dqsTH/JJxLTTsOt7u6keLGt6kNQ=
+github.com/sagikazarmark/locafero v0.4.0/go.mod h1:Pe1W6UlPYUk/+wc/6KFhbORCfqzgYEpgQ3O5fPuL3H4=
+github.com/sagikazarmark/slog-shim v0.1.0 h1:diDBnUNK9N/354PgrxMywXnAwEr1QZcOr6gto+ugjYE=
+github.com/sagikazarmark/slog-shim v0.1.0/go.mod h1:SrcSrq8aKtyuqEI1uvTDTK1arOWRIczQRv+GVI1AkeQ=
+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/sourcegraph/conc v0.3.0 h1:OQTbbt6P72L20UqAkXXuLOj79LfEanQ+YQFNpLA9ySo=
+github.com/sourcegraph/conc v0.3.0/go.mod h1:Sdozi7LEKbFPqYX2/J+iBAM6HpqSLTASQIKqDmF7Mt0=
+github.com/spf13/afero v1.11.0 h1:WJQKhtpdm3v2IzqG8VMqrr6Rf3UYpEF239Jy9wNepM8=
+github.com/spf13/afero v1.11.0/go.mod h1:GH9Y3pIexgf1MTIWtNGyogA5MwRIDXGUr+hbWNoBjkY=
+github.com/spf13/cast v1.6.0 h1:GEiTHELF+vaR5dhz3VqZfFSzZjYbgeKDpBxQVS4GYJ0=
+github.com/spf13/cast v1.6.0/go.mod h1:ancEpBxwJDODSW/UG4rDrAqiKolqNNh2DX3mk86cAdo=
+github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA=
+github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg=
+github.com/spf13/viper v1.19.0 h1:RWq5SEjt8o25SROyN3z2OrDB9l7RPd3lwTWU8EcEdcI=
+github.com/spf13/viper v1.19.0/go.mod h1:GQUN9bilAbhU/jgc1bKs99f/suXKeUMct8Adx5+Ntkg=
+github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
+github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=
+github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=
+github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA=
+github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
+github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
+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/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=
+github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg=
+github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=
+github.com/subosito/gotenv v1.6.0 h1:9NlTDc1FTs4qu0DDq7AEtTPNw6SVm7uBMsUCUjABIf8=
+github.com/subosito/gotenv v1.6.0/go.mod h1:Dk4QP5c2W3ibzajGcXpNraDfq2IrhjMIvMSWPKKo0FU=
+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.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.3 h1:kdwGpVNwPFtjs98xCGkHjQtGKh86rDcRZN17QEMCOIs=
+github.com/xdg-go/stringprep v1.0.3/go.mod h1:W3f5j4i+9rC0kuIEJL0ky1VpHXQU3ocBgklLGvcBnW8=
+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.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=
+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.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/trace v1.5.0/go.mod h1:sq55kfhjXYr1zVSyexg0w1mpa03AYXR5eyTkB9NPPdE=
+go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc=
+go.uber.org/atomic v1.9.0 h1:ECmE8Bn/WFTYwEW/bpKD3M8VtR/zQVbavAoalC1PYyE=
+go.uber.org/atomic v1.9.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc=
+go.uber.org/goleak v1.1.11 h1:wy28qYRKZgnJTxGxvye5/wgWr1EKjmUDGYox5mGlRlI=
+go.uber.org/goleak v1.1.11/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ=
+go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU=
+go.uber.org/multierr v1.9.0 h1:7fIwc/ZtS0q++VgcfqFDxSBZVv/Xo49/SYnDFupUwlI=
+go.uber.org/multierr v1.9.0/go.mod h1:X2jQV1h+kxSjClGpnseKVIxpmcjrj7MNnI0bnlfKTVQ=
+go.uber.org/zap v1.22.0 h1:Zcye5DUgBloQ9BaT4qc9BnjOFog5TvBSAGkJ3Nf70c0=
+go.uber.org/zap v1.22.0/go.mod h1:H4siCOZOrAolnUPJEkfaSjDqyP+BDS0DdDWzwcgt3+U=
+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/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4=
+golang.org/x/crypto v0.21.0 h1:X31++rzVUdKhX5sWmSOFZxx8UW/ldWx55cbf08iNAMA=
+golang.org/x/crypto v0.21.0/go.mod h1:0BP7YvVV9gBbVKyeTG0Gyn+gZm94bibOW5BjDEYAOMs=
+golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
+golang.org/x/exp v0.0.0-20230905200255-921286631fa9 h1:GoHiUyI/Tp2nVkLI2mCxVkOjsbSXD66ic0XW0js0R9g=
+golang.org/x/exp v0.0.0-20230905200255-921286631fa9/go.mod h1:S2oDrQGGwySpoQPVqRShND87VCbxmc6bL1Yd2oYrm6k=
+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/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-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-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
+golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
+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/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk=
+golang.org/x/net v0.23.0 h1:7EYJ93RZ9vYSZAIb2x3lnuvqO5zneoD6IvWjuhfxjTs=
+golang.org/x/net v0.23.0/go.mod h1:JKghWKKOSdJwpW2GEx0Ja7fmaKnMsbu+MWVZTokSYmg=
+golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
+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-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.6.0 h1:5BMeUDZ7vkXGfEr1x9B4bRcTH4lpkTkpdh0T/J+qjbQ=
+golang.org/x/sync v0.6.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
+golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/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-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-20210330210617-4fbd30eecc44/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-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.18.0 h1:DBdB3niSjOA/O0blCZBqDefyWNYveAYMNF1Wum0DYQ4=
+golang.org/x/sys v0.18.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
+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.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
+golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
+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-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
+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/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-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=
+google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo=
+google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=
+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.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc=
+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=
+google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE=
+google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo=
+google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
+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=
+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 h1:YR8cESwS4TdDjEe65xsg0ogRM/Nc3DYOhEAlW+xobZo=
+gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
+gopkg.in/ini.v1 v1.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA=
+gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k=
+gopkg.in/mgo.v2 v2.0.0-20190816093944-a6b53ec6cb22 h1:VpOs+IwYnYBaFnrNAeB8UUWtL3vEUnzSCL1nVjPhqrw=
+gopkg.in/mgo.v2 v2.0.0-20190816093944-a6b53ec6cb22/go.mod h1:yeKp02qBN3iKW1OzL3MGk2IdtZzaj7SFntXj72NppTA=
+gopkg.in/natefinch/lumberjack.v2 v2.0.0 h1:1Lc07Kr7qY4U2YPouBjpCLxpiyxIVoxqXgkXLknAOE8=
+gopkg.in/natefinch/lumberjack.v2 v2.0.0/go.mod h1:l0ndWWf7gzL7RNwBG7wST/UCcT4T24xpD6X8LsfU/+k=
+gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
+gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY=
+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.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
+gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
+gorm.io/driver/mysql v1.5.7 h1:MndhOPYOfEp2rHKgkZIhJ16eVUIRf2HmzgoPmh7FCWo=
+gorm.io/driver/mysql v1.5.7/go.mod h1:sEtPWMiqiN1N1cMXoXmBbd8C6/l+TESwriotuRRpkDM=
+gorm.io/gorm v1.25.7/go.mod h1:hbnx/Oo0ChWMn1BIhpy1oYozzpM15i4YPuHDmfYtwg8=
+gorm.io/gorm v1.25.12 h1:I0u8i2hWQItBq1WfE0o2+WuL9+8L21K9e2HHSTE/0f8=
+gorm.io/gorm v1.25.12/go.mod h1:xh7N7RHfYlNc5EmcI/El95gXusucDrQnHXe0+CgWcLQ=
+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-20240412074219-927f3f682cb3 h1:mTokQIoOu/oZ2oCSAPayIFfnglIHP0qbOw1Ez6biKDo=
+jygit.jydev.jianyu360.cn/data_processing/common_utils v0.0.0-20240412074219-927f3f682cb3/go.mod h1:1Rp0ioZBhikjXHYYXmnzL6RNfvTDM/2XvRB+vuPLurI=

+ 100 - 0
zhaiquan/init.go

@@ -0,0 +1,100 @@
+package main
+
+import (
+	"fmt"
+	"github.com/spf13/viper"
+	"go.uber.org/zap"
+	"gorm.io/driver/mysql"
+	"gorm.io/gorm"
+	"gorm.io/gorm/logger"
+	"jygit.jydev.jianyu360.cn/data_processing/common_utils/log"
+	"jygit.jydev.jianyu360.cn/data_processing/common_utils/mongodb"
+	"os"
+	"time"
+)
+
+var GF GlobalConf
+
+func InitConfig() (err error) {
+	viper.SetConfigFile("config.toml") // 指定配置文件路径
+	viper.SetConfigName("config")      // 配置文件名称(无扩展名)
+	viper.SetConfigType("toml")        // 如果配置文件的名称中没有扩展名,则需要配置此项
+
+	viper.AddConfigPath("./")
+	viper.AddConfigPath("./conf/")  // 还可以在工作目录中查找配置
+	viper.AddConfigPath("../conf/") // 还可以在工作目录中查找配置
+	err = viper.ReadInConfig()      // 查找并读取配置文件
+	if err != nil {                 // 处理读取配置文件的错误
+		return
+	}
+
+	err = viper.Unmarshal(&GF)
+
+	return err
+
+}
+
+// Init 初始化配置
+func Init() {
+	InitConfig()
+	InitLog()
+	InitMgo()
+	InitMysql()
+}
+
+func InitMgo() {
+	//87 竞品
+	Mgo = &mongodb.MongodbSim{
+		//MongodbAddr: "172.17.189.140:27080",
+		MongodbAddr: GF.Mongob.Host,
+		Size:        10,
+		DbName:      GF.Mongob.DB,
+		UserName:    "",
+		Password:    "",
+		Direct:      GF.Mongob.Direct,
+	}
+	Mgo.InitPool()
+}
+
+func InitMysql() {
+	now := time.Now()
+	username := GF.Mysql.Username
+	password := GF.Mysql.Password
+	host := GF.Mysql.Address // 本地
+	//host := "172.17.162.27:14000" //线上
+	database := GF.Mysql.Dbname
+	dsn := fmt.Sprintf("%s:%s@tcp(%s)/%s?charset=utf8mb4&parseTime=True&loc=Local", username, password, host, database)
+	// 连接到数据库
+	var err error
+	MysqlDB, err = gorm.Open(mysql.Open(dsn), &gorm.Config{
+		Logger: logger.Default.LogMode(logger.Error), //不打印日志
+	})
+	if err != nil {
+		log.Info("InitMysql", zap.String("初始化MySQL", "data_analysis数据库失败"), zap.Error(err))
+		return
+	} else {
+		log.Info("InitMysql", zap.String("初始化MySQL", "data_analysis数据库成功"))
+	}
+
+	log.Info("InitMysql", zap.Any("duration", time.Since(now).Seconds()))
+
+}
+
+func InitLog() {
+	now := time.Now()
+	err := log.InitLog(
+		log.Path(GF.Log.LogPath),
+		log.Level(GF.Log.LogLevel),
+		log.Compress(GF.Log.Compress),
+		log.MaxSize(GF.Log.MaxSize),
+		log.MaxBackups(GF.Log.MaxBackups),
+		log.MaxAge(GF.Log.MaxAge),
+		log.Format(GF.Log.Format),
+	)
+	if err != nil {
+		fmt.Printf("InitLog failed: %v\n", err)
+		os.Exit(1)
+	}
+
+	log.Info("InitLog", zap.Any("duration", time.Since(now).Seconds()))
+}

+ 470 - 0
zhaiquan/main.go

@@ -0,0 +1,470 @@
+package main
+
+import (
+	"go.uber.org/zap"
+	"gorm.io/gorm"
+	"jygit.jydev.jianyu360.cn/data_processing/common_utils"
+	"jygit.jydev.jianyu360.cn/data_processing/common_utils/log"
+	"jygit.jydev.jianyu360.cn/data_processing/common_utils/mongodb"
+	"strings"
+)
+
+var (
+	Mgo     *mongodb.MongodbSim //87 环境,采集 存储的MongoDB
+	MysqlDB *gorm.DB
+)
+
+func main() {
+	Init()
+	dealProject()             // 处理项目、债券数据
+	dealProjectBondRelation() //更新项目和债券的关联关系
+}
+
+// dealProject 处理项目相关数据
+func dealProject() {
+	tables := strings.Split(GF.Mongob.List, ",")
+	detailNames := strings.Split(GF.Mongob.Detail, ",")
+	//table := GF.Mongob.List
+	//detailName := GF.Mongob.Detail //专项债详细表
+	sess := Mgo.GetMgoConn()
+	defer Mgo.DestoryMongoConn(sess)
+
+	for k, table := range tables {
+		detailName := detailNames[k]
+		/**
+		这里测试用,使用 “新建成都至达州至万州铁路(南充段)(万源市)” 这个项目测试,他有变更信息
+		*/
+
+		//where1 := map[string]interface{}{
+		//	//"projectName": "新建成都至达州至万州铁路(南充段)(万源市)",
+		//	"projectName": "新建成都至达州至万州铁路(南充段)(万源市)",
+		//}
+		//query := sess.DB("py_theme").C(table).Find(where1).Select(nil).Iter()
+
+		query := sess.DB("py_theme").C(table).Find(nil).Select(nil).Iter()
+		count := 0
+
+		for tmp := make(map[string]interface{}); query.Next(tmp); count++ {
+			if count%100 == 0 {
+				log.Info("current:", zap.Int("count", count), zap.Any("projectName", tmp["projectName"]), zap.String(table, detailName))
+			}
+
+			projectName := util.ObjToString(tmp["projectName"])
+			//
+			where := map[string]interface{}{
+				"project.jcxx.projectName": projectName,
+			}
+			detail, _ := Mgo.FindOne(detailName, where)
+			if len(*detail) == 0 {
+				continue
+			}
+			//1.项目数据
+			if project, ok := (*detail)["project"].(map[string]interface{}); ok {
+				//1.基础信息
+				var projectId int
+				if jcxx, ok := project["jcxx"].(map[string]interface{}); ok {
+					projectId = dealProjectBaseInfo(jcxx, projectName)
+				}
+				//2.还本付息
+				if hbfx, ok := project["hbfx"].(map[string]interface{}); ok {
+					dealProjectRepayment(hbfx, projectName, projectId)
+				}
+				//3.变更
+				if bg, ok := project["bg"].([]interface{}); ok {
+					if len(bg) > 0 {
+						dealProjectChange(bg, projectName, projectId)
+					}
+				}
+				//4.发行明细
+				if fxmx, ok := project["fxmx"].([]interface{}); ok {
+					if len(fxmx) > 0 {
+						dealProjectIssueDetails(fxmx, projectName, projectId)
+					}
+				}
+			}
+
+			//2.处理债券信息
+			if bonds, ok := (*detail)["bond"].([]interface{}); ok {
+				dealBondInfo(bonds, projectName)
+			}
+
+		}
+		log.Info("dealProject over ", zap.Int("total", count))
+	}
+}
+
+// dealProjectBaseInfo 处理项目基本信息
+func dealProjectBaseInfo(jcxx map[string]interface{}, projectName string) (projectID int) {
+	project_base_info_exist := ProjectBaseInfo{}
+	err := MysqlDB.Where(&ProjectBaseInfo{ProjectName: projectName}).First(&project_base_info_exist).Error
+	if err != nil && err != gorm.ErrRecordNotFound {
+		// 处理查询错误
+		log.Error("dealProjectBaseInfo;Error checking for existing project", zap.Error(err))
+	}
+	//当前项目基本信息已经存在
+	if project_base_info_exist.ID > 0 {
+		// 直接修改已存在记录的字段
+		project_base_info_exist.TotalInvestment = util.Float64All(jcxx["totalInvestment"])
+		project_base_info_exist.Area = util.ObjToString(jcxx["regionName"])
+		project_base_info_exist.City = strings.ReplaceAll(util.ObjToString(jcxx["cityName"]), "本级", "")
+		project_base_info_exist.District = strings.ReplaceAll(util.ObjToString(jcxx["countyName"]), "本级", "")
+		project_base_info_exist.Capital = util.Float64All(jcxx["capital"])
+		project_base_info_exist.ApplyTotalBonds = util.Float64All(jcxx["applyDebt"])
+		project_base_info_exist.OtherDebtFinancing = util.Float64All(jcxx["portfolioFinancing"])
+		project_base_info_exist.SpecialDebtCapital = util.Float64All(jcxx["specialDebtAsCapital"])
+		project_base_info_exist.ExpectedReturn = util.Float64All(jcxx["expectedReturn"])
+		project_base_info_exist.ProjectCost = util.IntAll(jcxx["projectCost"])
+		project_base_info_exist.ProjectDomain = util.ObjToString(jcxx["projectTypeName3"])
+		project_base_info_exist.ProjectOwner = util.ObjToString(jcxx["projectSubject"])
+		project_base_info_exist.StartDate = util.ObjToString(jcxx["startDate"])
+		project_base_info_exist.EndDate = util.ObjToString(jcxx["endDate"])
+		project_base_info_exist.OperationStartDate = util.ObjToString(jcxx["operationStartDate"])
+		project_base_info_exist.OperationEndDate = util.ObjToString(jcxx["operationEndDate"])
+		project_base_info_exist.SourceIncome = util.ObjToString(jcxx["sourceIncome"])
+		project_base_info_exist.ConstructionContent = util.ObjToString(jcxx["constructionContent"])
+		project_base_info_exist.Remarks = util.ObjToString(jcxx["remarks"])
+		project_base_info_exist.OtherDebtFinancingSource = util.ObjToString(jcxx["portfolioFinancingSource"])
+		project_base_info_exist.CostIncomePercent = util.ObjToString(jcxx["costIncomePercent"])
+		project_base_info_exist.CoverageMultiple = util.Float64All(jcxx["coverageMultiple"])
+		project_base_info_exist.CompetentDepartment = util.ObjToString(jcxx["implementingAgency"])
+		project_base_info_exist.AccountingFirm = util.ObjToString(jcxx["accountingFirm"])
+		project_base_info_exist.LawFirm = util.ObjToString(jcxx["lawFirm"])
+		project_base_info_exist.UpdateDate = util.ObjToString(jcxx["updateTime"])
+		project_base_info_exist.CreateDate = util.ObjToString(jcxx["createTime"])
+		// 使用 Save 来更新
+		err = MysqlDB.Save(&project_base_info_exist).Error
+		if err != nil {
+			log.Info("dealProject Save (Update) ", zap.Error(err))
+		}
+		return project_base_info_exist.ID
+	} else {
+		project_base_info := ProjectBaseInfo{
+			ProjectName:              projectName,
+			TotalInvestment:          util.Float64All(jcxx["totalInvestment"]),
+			Area:                     util.ObjToString(jcxx["regionName"]),
+			City:                     strings.ReplaceAll(util.ObjToString(jcxx["cityName"]), "本级", ""),
+			District:                 strings.ReplaceAll(util.ObjToString(jcxx["countyName"]), "本级", ""),
+			Capital:                  util.Float64All(jcxx["capital"]),
+			ApplyTotalBonds:          util.Float64All(jcxx["applyDebt"]),
+			OtherDebtFinancing:       util.Float64All(jcxx["portfolioFinancing"]),
+			SpecialDebtCapital:       util.Float64All(jcxx["specialDebtAsCapital"]),
+			ExpectedReturn:           util.Float64All(jcxx["expectedReturn"]),
+			ProjectCost:              util.IntAll(jcxx["projectCost"]),
+			ProjectDomain:            util.ObjToString(jcxx["projectTypeName3"]), // 项目领域
+			ProjectOwner:             util.ObjToString(jcxx["projectSubject"]),   //项目业主
+			StartDate:                util.ObjToString(jcxx["startDate"]),
+			EndDate:                  util.ObjToString(jcxx["endDate"]),
+			OperationStartDate:       util.ObjToString(jcxx["operationStartDate"]),
+			OperationEndDate:         util.ObjToString(jcxx["operationEndDate"]),
+			SourceIncome:             util.ObjToString(jcxx["sourceIncome"]),
+			ConstructionContent:      util.ObjToString(jcxx["constructionContent"]),
+			Remarks:                  util.ObjToString(jcxx["remarks"]),
+			OtherDebtFinancingSource: util.ObjToString(jcxx["portfolioFinancingSource"]),
+			CostIncomePercent:        util.ObjToString(jcxx["costIncomePercent"]),
+			CoverageMultiple:         util.Float64All(jcxx["coverageMultiple"]),
+			CompetentDepartment:      util.ObjToString(jcxx["implementingAgency"]),
+			AccountingFirm:           util.ObjToString(jcxx["accountingFirm"]),
+			LawFirm:                  util.ObjToString(jcxx["lawFirm"]),
+			CreateDate:               util.ObjToString(jcxx["createTime"]),
+			UpdateDate:               util.ObjToString(jcxx["updateTime"]),
+		}
+		err = MysqlDB.Create(&project_base_info).Error
+		if err != nil {
+			log.Info("dealProjectBaseInfo;dealProject Create ", zap.Error(err), zap.String("project", projectName))
+		}
+		return project_base_info.ID
+	}
+}
+
+// dealProjectRepayment 处理项目-还本付息
+func dealProjectRepayment(hbfx map[string]interface{}, projectName string, projectID int) {
+	project_repayment_exist := ProjectRepayment{}
+	err := MysqlDB.Where(&ProjectRepayment{ProjectName: projectName, BondName: util.ObjToString(hbfx["bondName"])}).First(&project_repayment_exist).Error
+	if err != nil && err != gorm.ErrRecordNotFound {
+		// 处理查询错误
+		log.Error("dealProjectRepayment;Error checking for existing project", zap.Error(err))
+	}
+	if project_repayment_exist.ID > 0 {
+		project_repayment_exist.IssueTerm = util.IntAll(hbfx["issueTerm"])
+		project_repayment_exist.PayInterestMethodName = util.ObjToString(hbfx["payInterestMethodName"])
+		project_repayment_exist.ValueDate = util.ObjToString(hbfx["valueDate"])
+		project_repayment_exist.InterestDate = util.ObjToString(hbfx["payInterestDate"])
+		project_repayment_exist.LastInterestDate = util.ObjToString(hbfx["latelyPayInterestDate"])
+		project_repayment_exist.ReminderRepayDays = util.IntAll(hbfx["days"])
+		project_repayment_exist.MaturityDate = util.ObjToString(hbfx["expiryDate"])
+		project_repayment_exist.DebtService = util.Float64All(hbfx["repayCapitalWithInterest"])
+		project_repayment_exist.RedemptionMethod = util.ObjToString(hbfx["redemptionMethod"])
+		project_repayment_exist.CumulativePayInterest = util.IntAll(hbfx["cumulativePayInterest"])
+		project_repayment_exist.IsEarlyRepayPrincipal = util.ObjToString(hbfx["isEarlyRepayPrincipal"])
+		project_repayment_exist.Remarks = util.ObjToString(hbfx["remarks"])
+		// 使用 Save 来更新
+		err = MysqlDB.Save(&project_repayment_exist).Error
+		if err != nil {
+			log.Info("dealProjectRepayment Save (Update) ", zap.Error(err))
+		}
+
+	} else {
+		project_payment := ProjectRepayment{
+			ProjectName:           projectName,
+			ProjectID:             projectID,
+			BondName:              util.ObjToString(hbfx["bondName"]),
+			IssueTerm:             util.IntAll(hbfx["issueTerm"]),
+			PayInterestMethodName: util.ObjToString(hbfx["payInterestMethodName"]),
+			ValueDate:             util.ObjToString(hbfx["valueDate"]),
+			InterestDate:          util.ObjToString(hbfx["payInterestDate"]),
+			LastInterestDate:      util.ObjToString(hbfx["latelyPayInterestDate"]),
+			ReminderRepayDays:     util.IntAll(hbfx["days"]),                         //提醒还款天数
+			MaturityDate:          util.ObjToString(hbfx["expiryDate"]),              //到期日
+			DebtService:           util.Float64All(hbfx["repayCapitalWithInterest"]), //还本付息(万元)
+			RedemptionMethod:      util.ObjToString(hbfx["redemptionMethod"]),
+			CumulativePayInterest: util.IntAll(hbfx["cumulativePayInterest"]),
+			IsEarlyRepayPrincipal: util.ObjToString(hbfx["isEarlyRepayPrincipal"]),
+			Remarks:               util.ObjToString(hbfx["remarks"]),
+		}
+		err = MysqlDB.Create(&project_payment).Error
+		if err != nil {
+			log.Info("dealProjectRepayment;dealProject Create ", zap.Error(err), zap.String("project", projectName))
+		}
+	}
+}
+
+// dealProjectChange 处理项目变更
+func dealProjectChange(bg []interface{}, projectName string, projectId int) {
+	for _, v := range bg {
+		if bgda, ok := v.(map[string]interface{}); ok {
+			project_change := ProjectChange{
+				ProjectName:   projectName,
+				ProjectID:     projectId,
+				ChangeContent: util.ObjToString(bgda["changeContent"]),
+				UpdateReason:  util.ObjToString(bgda["updateReason"]),
+				SubmitTime:    util.ObjToString(bgda["submitTime"]),
+			}
+			err := MysqlDB.Create(&project_change).Error
+			if err != nil {
+				log.Info("dealProjectChange; Create  err", zap.Error(err))
+			}
+		}
+	}
+}
+
+// dealProjectIssueDetails 处理项目发行明细
+func dealProjectIssueDetails(fxmx []interface{}, projectName string, projectId int) {
+	for _, v := range fxmx {
+		if fx, ok := v.(map[string]interface{}); ok {
+			project_bach_name := util.ObjToString(fx["projectBatchName"])
+			issue_detail_exist := ProjectIssueDetails{}
+			err := MysqlDB.Where(&ProjectIssueDetails{ProjectName: projectName, ProjectBachName: project_bach_name, BondName: util.ObjToString(fx["bondName"])}).First(&issue_detail_exist).Error
+			if err != nil && err != gorm.ErrRecordNotFound {
+				// 处理查询错误
+				log.Error("dealProjectIssueDetails;Error checking for existing project", zap.Error(err))
+			}
+			// 存在
+			if issue_detail_exist.ID > 0 {
+				issue_detail_exist.FirstPublishDate = util.ObjToString(fx["firstPublishDate"])
+				issue_detail_exist.BatchNum = util.IntAll(fx["batchNum"])
+				issue_detail_exist.PresentIssueAmount = util.Float64All(fx["presentIssueAmount"])
+				issue_detail_exist.IssueInterestRate = util.Float64All(fx["issueInterestRate"])
+				issue_detail_exist.PresentAsSpecialAmount = util.Float64All(fx["presentAsSpecialAmount"])
+				issue_detail_exist.TotalIssueAmount = util.Float64All(fx["totalIssueAmount"])
+				issue_detail_exist.ReviseLog = util.ObjToString(fx["revise_log"])
+				err = MysqlDB.Save(&issue_detail_exist).Error
+				if err != nil {
+					log.Info("dealProjectIssueDetails Save (Update) ", zap.Error(err))
+				}
+			} else {
+				issue_detail := ProjectIssueDetails{
+					ProjectName:            projectName,
+					ProjectID:              projectId,
+					ProjectBachName:        project_bach_name,
+					BondName:               util.ObjToString(fx["bondName"]),
+					FirstPublishDate:       util.ObjToString(fx["firstPublishDate"]),
+					BatchNum:               util.IntAll(fx["batchNum"]),
+					PresentIssueAmount:     util.Float64All(fx["presentIssueAmount"]),
+					IssueInterestRate:      util.Float64All(fx["issueInterestRate"]),
+					PresentAsSpecialAmount: util.Float64All(fx["presentAsSpecialAmount"]),
+					TotalIssueAmount:       util.Float64All(fx["totalIssueAmount"]),
+					ReviseLog:              util.ObjToString(fx["revise_log"]),
+				}
+				err := MysqlDB.Create(&issue_detail).Error
+				if err != nil {
+					log.Info("dealProjectIssueDetails; Create  err", zap.Error(err))
+				}
+			}
+		}
+	}
+}
+
+// dealBondInfo 处理债券信息
+func dealBondInfo(bonds []interface{}, projectName string) {
+	for _, v := range bonds {
+		if bond, ok := v.(map[string]interface{}); ok {
+			//1.基本信息
+			if jbxx, ok := bond["jbxx"].(map[string]interface{}); ok {
+				dealBondBase(jbxx, projectName)
+			}
+			//2.债券-修改记录;xgjl
+			if xgjl, ok := bond["xgjl"].([]interface{}); ok && len(xgjl) > 0 {
+				dealBondChange(xgjl)
+			}
+
+			////3.相关小项目
+			//if xgxxx, ok := bond["xgxxx"].([]interface{}); ok && len(xgxxx) > 0 {
+			//	dealRelationProject(xgxxx)
+			//}
+		}
+	}
+}
+
+// dealBondBase 处理债券基本信息
+func dealBondBase(jbxx map[string]interface{}, projectName string) {
+	bond_info_exist := BondInfo{}
+	err := MysqlDB.Where(&BondInfo{BondName: util.ObjToString(jbxx["bondName"]), BondNo: util.ObjToString(jbxx["bondNo"])}).First(&bond_info_exist).Error
+	if err != nil && err != gorm.ErrRecordNotFound {
+		// 处理查询错误
+		log.Error("dealBondBase;Error checking for existing project", zap.Error(err))
+	}
+
+	if bond_info_exist.ID > 0 {
+		bond_info_exist.BondShortName = util.ObjToString(jbxx["bondName"])
+		bond_info_exist.Area = util.ObjToString(jbxx["regionName"])
+		bond_info_exist.BondNature = util.ObjToString(jbxx["bondType1Name"])
+		bond_info_exist.BondType = util.ObjToString(jbxx["bondType2Name"])
+		bond_info_exist.OfficialProjectType = util.ObjToString(jbxx["projectType1Name"])
+		bond_info_exist.TotalAmount = util.Float64All(jbxx["totalAmount"])
+		bond_info_exist.IssueDate = util.ObjToString(jbxx["issueDate"])
+		bond_info_exist.IssuePlace = util.ObjToString(jbxx["issuePlaceName"])
+		bond_info_exist.IssueTerm = util.IntAll(jbxx["issueTerm"])
+		bond_info_exist.IssueInterestRate = util.ObjToString(jbxx["issueInterestRate"])
+		bond_info_exist.IssuePhase = util.ObjToString(jbxx["issuePhase"])
+		bond_info_exist.WayOfPayInterest = util.ObjToString(jbxx["payInterestMethodName"])
+		bond_info_exist.NewBondAmount = util.Float64All(jbxx["newBondAmount"])
+		bond_info_exist.CounterBondAmount = util.Float64All(jbxx["counterBondAmount"])
+		bond_info_exist.RefinancingBondAmount = util.Float64All(jbxx["refinancingBondAmount"])
+		bond_info_exist.RedemptionMethod = util.ObjToString(jbxx["redemptionMethod"])
+		bond_info_exist.ValueDate = util.ObjToString(jbxx["valueDate"])
+		bond_info_exist.ExpiryDate = util.ObjToString(jbxx["expiryDate"])
+		bond_info_exist.PayInterestDate = util.ObjToString(jbxx["payInterestDate"])
+		bond_info_exist.LatePayInterestDate = util.ObjToString(jbxx["latelyPayInterestDate"])
+		bond_info_exist.IsEarlyRepayPrincipal = util.ObjToString(jbxx["isEarlyRepayPrincipal"])
+		bond_info_exist.CumulativePayInterest = util.Float64All(jbxx["cumulativePayInterest"])
+		bond_info_exist.IsCounterBond = util.ObjToString(jbxx["isCounterBond"])
+		err = MysqlDB.Save(&bond_info_exist).Error
+		if err != nil {
+			log.Info("dealBondBase Save (Update) ", zap.Error(err))
+		}
+	} else {
+		bond_info := BondInfo{
+			BondName:              util.ObjToString(jbxx["bondName"]),
+			BondShortName:         util.ObjToString(jbxx["bondShortName"]),
+			BondNo:                util.ObjToString(jbxx["bondNo"]),
+			Area:                  util.ObjToString(jbxx["regionName"]),
+			BondNature:            util.ObjToString(jbxx["bondType1Name"]),
+			BondType:              util.ObjToString(jbxx["bondType2Name"]),
+			OfficialProjectType:   util.ObjToString(jbxx["projectType1Name"]),
+			TotalAmount:           util.Float64All(jbxx["totalAmount"]),
+			IssueDate:             util.ObjToString(jbxx["issueDate"]),
+			IssuePlace:            util.ObjToString(jbxx["issuePlaceName"]),
+			IssueTerm:             util.IntAll(jbxx["issueTerm"]),
+			IssueInterestRate:     util.ObjToString(jbxx["issueInterestRate"]),
+			IssuePhase:            util.ObjToString(jbxx["issuePhase"]),
+			WayOfPayInterest:      util.ObjToString(jbxx["payInterestMethodName"]),
+			NewBondAmount:         util.Float64All(jbxx["newBondAmount"]),
+			CounterBondAmount:     util.Float64All(jbxx["counterBondAmount"]),
+			RefinancingBondAmount: util.Float64All(jbxx["refinancingBondAmount"]),
+			RedemptionMethod:      util.ObjToString(jbxx["redemptionMethod"]),
+			ValueDate:             util.ObjToString(jbxx["valueDate"]),
+			ExpiryDate:            util.ObjToString(jbxx["expiryDate"]),
+			PayInterestDate:       util.ObjToString(jbxx["payInterestDate"]),
+			LatePayInterestDate:   util.ObjToString(jbxx["latelyPayInterestDate"]),
+			RemindPayDays:         util.IntAll(jbxx["days"]),
+			LastPayInterest:       util.Float64All(jbxx["lastPayInterest"]),
+			IsEarlyRepayPrincipal: util.ObjToString(jbxx["isEarlyRepayPrincipal"]),
+			CumulativePayInterest: util.Float64All(jbxx["cumulativePayInterest"]),
+			IsCounterBond:         util.ObjToString(jbxx["isCounterBond"]),
+		}
+		//
+		err = MysqlDB.Create(&bond_info).Error
+		if err != nil {
+			log.Info("dealBondBase;dealProject Create ", zap.Error(err), zap.String("project", projectName))
+		}
+	}
+
+}
+
+// dealBondChange 修改债券修改信息
+func dealBondChange(xgjl []interface{}) {
+
+}
+
+// dealProjectBondRelation 处理项目债券关联关系
+func dealProjectBondRelation() {
+	//detailName := GF.Mongob.Detail //专项债详细表
+	detailNames := strings.Split(GF.Mongob.Detail, ",")
+	sess := Mgo.GetMgoConn()
+	defer Mgo.DestoryMongoConn(sess)
+	for _, detailName := range detailNames {
+
+		query := sess.DB("py_theme").C(detailName).Find(nil).Select(nil).Iter()
+		count := 0
+		for tmp := make(map[string]interface{}); query.Next(tmp); count++ {
+			if count%100 == 0 {
+				log.Info("current:", zap.Int("count", count))
+			}
+
+			if project, ok := tmp["project"].(map[string]interface{}); ok {
+				//1.基础信息
+				if jcxx, ok := project["jcxx"].(map[string]interface{}); ok {
+					project_name := util.ObjToString(jcxx["projectName"])
+					//fmt.Println(project_name)
+					project_base_info_exist := ProjectBaseInfo{}
+					err := MysqlDB.Where(&ProjectBaseInfo{ProjectName: project_name}).First(&project_base_info_exist).Error
+					if err != nil && err != gorm.ErrRecordNotFound {
+						// 处理查询错误
+						log.Error("dealProjectBondRelation;Error checking for existing project", zap.Error(err))
+					} else {
+						if project_base_info_exist.ID > 0 {
+							//1.更新项目的创建时间
+							project_base_info_exist.CreateDate = util.ObjToString(jcxx["createTime"])
+							project_base_info_exist.UpdateDate = util.ObjToString(jcxx["updateTime"])
+							err = MysqlDB.Save(&project_base_info_exist).Error
+							if err != nil {
+								log.Info("dealProjectBondRelation Save (Update) ", zap.Error(err))
+							}
+
+							//2.更新项目和债券的对应关系
+							if fxmx, ok := project["fxmx"].([]interface{}); ok {
+								for _, v := range fxmx {
+									if fx, ok := v.(map[string]interface{}); ok {
+										bond_name := util.ObjToString(fx["bondName"])
+										bond_info_exist := BondInfo{}
+										err := MysqlDB.Where(&BondInfo{BondName: bond_name}).First(&bond_info_exist).Error
+										if err != nil && err != gorm.ErrRecordNotFound {
+											// 处理查询错误
+											log.Error("dealProjectBondRelation;Error checking for existing project", zap.Error(err))
+										} else {
+											// 整理对应关系
+											relation := ProjectBondRelation{
+												ProjectID: project_base_info_exist.ID,
+												BondID:    bond_info_exist.ID,
+											}
+											result := MysqlDB.FirstOrCreate(&relation, ProjectBondRelation{
+												ProjectID: relation.ProjectID,
+												BondID:    relation.BondID,
+											})
+											if result.Error != nil {
+												// 处理错误
+												log.Error("dealProjectBondRelation;Error checking for existing project", zap.Error(err), zap.String(project_name, bond_name))
+											}
+										}
+									}
+								}
+							}
+						}
+					}
+				}
+			}
+		}
+
+		log.Info("dealProjectBondRelation", zap.Any("数据处理完毕", count))
+	}
+}

+ 211 - 0
zhaiquan/readme.md

@@ -0,0 +1,211 @@
+# 专项债结构化
+
+> 为了规范化专项债数据。目前采集采集的数据并没有更新处理,需要对采集的数据进行结构化,并对存量数据进行更新;
+> 目前 主要针对 `https://www.zhuanxiangzhaiquan.com/home`  网站的数据处理的;如果后期有新的网站数据,需要更新项目代码
+
+
+## 使用说明
+
+1.  修改配置文件,`mongob` 里面的 `list` `detail` 字段,修改成最新的数据表
+2. 执行可执行文件
+
+### 数据表结构设计
+
+#### project_base_info 项目基本信息数据表
+
+```mysql
+CREATE TABLE `zxz_project_base_info`
+CREATE TABLE `zxz_project_base_info`
+(
+    `id`                          int(11)      NOT NULL AUTO_INCREMENT COMMENT '主键自增',
+    `project_name`                varchar(255) NOT NULL COMMENT '项目名称,索引',
+    `total_investment`            float                 DEFAULT NULL COMMENT '总投资(万元)',
+    `area`                        varchar(255)          DEFAULT NULL COMMENT '省份',
+    `city`                        varchar(255)          DEFAULT NULL COMMENT '城市',
+    `district`                    varchar(255)          DEFAULT NULL COMMENT '区县',
+    `capital`                     float                 DEFAULT NULL COMMENT '不含专项债的资本金(万元)',
+    `apply_total_bonds`           float                 DEFAULT NULL COMMENT '申请专项债总额(万元)',
+    `other_debt_financing`        float                 DEFAULT NULL COMMENT '其他债务融资(万元)',
+    `special_debt_capital`        float                 DEFAULT NULL COMMENT '专项债作资本金(万元)',
+    `expected_return`             float                 DEFAULT NULL COMMENT '预期收入(万元)',
+    `project_cost`                int(11)               DEFAULT NULL COMMENT '成本',
+    `project_domain`              varchar(255)          DEFAULT NULL COMMENT '项目领域',
+    `project_owner`               text                  DEFAULT NULL COMMENT '项目业主',
+    `start_date`                  varchar(255)          DEFAULT NULL COMMENT '建设期开始',
+    `end_date`                    varchar(255)          DEFAULT NULL COMMENT '建设期结束',
+    `operation_start_date`        varchar(255)          DEFAULT NULL COMMENT '运营期开始',
+    `operation_end_date`          varchar(255)          DEFAULT NULL COMMENT '运营期结束',
+    `source_income`               text                  DEFAULT NULL COMMENT '收入来源',
+    `construction_content`        text                  DEFAULT NULL COMMENT '建设内容',
+    `remarks`                     varchar(500)          DEFAULT NULL COMMENT '特殊情况备注',
+    `other_debt_financing_source` varchar(500)          DEFAULT NULL COMMENT '其他债务融资来源',
+    `cost_income_percent`         varchar(50)           DEFAULT NULL COMMENT '成本/收入(%)',
+    `coverage_multiple`           float                 DEFAULT NULL COMMENT '覆盖倍数',
+    `competent_department`        varchar(255)          DEFAULT NULL COMMENT '主管部门',
+    `accounting_firm`             varchar(255)          DEFAULT NULL COMMENT '会计所',
+    `law_firm`                    varchar(255)          DEFAULT NULL COMMENT '律所',
+    `create_date`                 varchar(255)          DEFAULT NULL COMMENT '原网站发行时间',
+    `update_date`                 varchar(255)          DEFAULT NULL COMMENT '原网站更新时间',
+    `comeintime`                  timestamp    NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '入库时间',
+    `updatetime`                  timestamp    NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
+    PRIMARY KEY (`id`) /*T![clustered_index] CLUSTERED */,
+    KEY `idx_project_name` (`project_name`)
+) ENGINE = InnoDB
+  DEFAULT CHARSET = utf8mb4
+  COLLATE = utf8mb4_bin COMMENT ='项目基本信息';
+```
+
+#### project_change 项目变更表
+
+```mysql
+CREATE TABLE `zxz_project_change`
+(
+    `id`             int(11)                          NOT NULL AUTO_INCREMENT COMMENT '主键自增',
+    `project_id`     int(11)                                   DEFAULT NULL COMMENT '项目ID',
+    `project_name`   varchar(255) COLLATE utf8mb4_bin NOT NULL COMMENT '项目名称,索引',
+    `change_content` varchar(1000) COLLATE utf8mb4_bin         DEFAULT NULL COMMENT '变更内容',
+    `update_reason`  varchar(1000) COLLATE utf8mb4_bin         DEFAULT NULL COMMENT '更新原因',
+    `submit_time`    varchar(255) COLLATE utf8mb4_bin          DEFAULT NULL COMMENT '提交时间',
+    `comeintime`     timestamp                        NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '入库时间',
+    `updatetime`     timestamp                        NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
+    PRIMARY KEY (`id`),
+    KEY `idx_projectName` (`project_name`),
+    KEY `project_id` (`project_id`)
+) ENGINE = InnoDB
+  DEFAULT CHARSET = utf8mb4
+  COLLATE = utf8mb4_bin COMMENT ='项目变更表';
+```
+
+#### project_issue_details 项目发行明细表
+
+```mysql
+CREATE TABLE `zxz_project_issue_details`
+(
+    `id`                        int(11)                          NOT NULL AUTO_INCREMENT COMMENT '主键自增',
+    `project_id`                int(11)                                   DEFAULT NULL COMMENT '项目ID',
+    `project_name`              varchar(255) COLLATE utf8mb4_bin NOT NULL COMMENT '项目名称',
+    `project_bach_name`         varchar(255) COLLATE utf8mb4_bin          DEFAULT NULL COMMENT '项目批次名称',
+    `bond_name`                 varchar(255) COLLATE utf8mb4_bin          DEFAULT NULL COMMENT '债券名称',
+    `first_publish_date`        varchar(50) COLLATE utf8mb4_bin           DEFAULT NULL COMMENT '发布时间',
+    `batch_num`                 int(11)                                   DEFAULT NULL COMMENT '批次',
+    `present_issue_amount`      float                                     DEFAULT NULL COMMENT '发行额',
+    `issue_interest_rate`       float                                     DEFAULT NULL COMMENT '发行利率',
+    `present_as_special_amount` float                                     DEFAULT NULL COMMENT '专项债作为资本金发行额',
+    `total_issue_amount`        float                                     DEFAULT NULL COMMENT '累计发行金额',
+    `revise_log`                varchar(1000) COLLATE utf8mb4_bin         DEFAULT NULL COMMENT '调整记录',
+    `comeintime`                timestamp                        NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '入库时间',
+    `updatetime`                timestamp                        NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
+    PRIMARY KEY (`id`),
+    KEY `idx_project_name` (`project_name`),
+    KEY `project_id` (`project_id`)
+) ENGINE = InnoDB
+  DEFAULT CHARSET = utf8mb4
+  COLLATE = utf8mb4_bin COMMENT ='项目发行明细信息';
+```
+
+#### project_repayment 项目还本付息表
+
+```mysql
+CREATE TABLE `zxz_project_repayment`
+(
+    `id`                       int(11)                          NOT NULL AUTO_INCREMENT COMMENT '主键自增',
+    `project_id`               int(11)                                   DEFAULT NULL COMMENT '项目ID',
+    `project_name`             varchar(255) COLLATE utf8mb4_bin NOT NULL COMMENT '项目名称',
+    `bond_name`                varchar(255) COLLATE utf8mb4_bin          DEFAULT NULL COMMENT '债券名称',
+    `issue_term`               int(11)                                   DEFAULT NULL COMMENT '发行期限(年)',
+    `pay_interest_method_name` varchar(255) COLLATE utf8mb4_bin          DEFAULT NULL COMMENT '付息方式',
+    `value_date`               varchar(50) COLLATE utf8mb4_bin           DEFAULT NULL COMMENT '起息日',
+    `interest_date`            varchar(50) COLLATE utf8mb4_bin           DEFAULT NULL COMMENT '付息日',
+    `last_interest_date`       varchar(50) COLLATE utf8mb4_bin           DEFAULT NULL COMMENT '最近付息日',
+    `reminder_repay_days`      int(11)                                   DEFAULT NULL COMMENT '提醒还款(天)',
+    `maturity_date`            varchar(50) COLLATE utf8mb4_bin           DEFAULT NULL COMMENT '到期日',
+    `debt_service`             float                                     DEFAULT NULL COMMENT '还本付息(万元)',
+    `redemption_method`        varchar(255) COLLATE utf8mb4_bin          DEFAULT NULL COMMENT '赎回方式',
+    `cumulative_pay_interest`  int(11)                                   DEFAULT NULL COMMENT '累计付息(万元)',
+    `is_early_repay_principal` varchar(50) COLLATE utf8mb4_bin           DEFAULT NULL COMMENT '提前还本',
+    `remarks`                  varchar(500) COLLATE utf8mb4_bin          DEFAULT NULL COMMENT '备注',
+    `comeintime`               timestamp                        NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '入库时间',
+    `updatetime`               timestamp                        NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
+    PRIMARY KEY (`id`),
+    KEY `idx_project_name` (`project_name`),
+    KEY `project_id` (`project_id`)
+) ENGINE = InnoDB
+  DEFAULT CHARSET = utf8mb4
+  COLLATE = utf8mb4_bin COMMENT ='项目还本付息信息';
+```
+
+#### bond_info  债券-基本信息表
+
+```mysql
+CREATE TABLE `zxz_bond_info`
+(
+    `id`                      int(11)      NOT NULL AUTO_INCREMENT COMMENT '主键自增',
+    `bond_name`               varchar(255) NOT NULL COMMENT '债券名称',
+    `bond_short_name`         varchar(255)          DEFAULT NULL COMMENT '债券简称',
+    `bond_no`                 varchar(100)          DEFAULT NULL COMMENT '债券编码',
+    `area`                    varchar(100)          DEFAULT NULL COMMENT '省份',
+    `bond_nature`             varchar(255)          DEFAULT NULL COMMENT '债券性质',
+    `bond_type`               varchar(255)          DEFAULT NULL COMMENT '债券类型',
+    `official_project_type`   varchar(255)          DEFAULT NULL COMMENT '官方项目类型',
+    `total_amount`            float                 DEFAULT NULL COMMENT '发行金额(万元)',
+    `issue_date`              datetime              DEFAULT NULL COMMENT '发行日期',
+    `issue_place`             varchar(255)          DEFAULT NULL COMMENT '发行场所',
+    `issue_term`              int(11)               DEFAULT NULL COMMENT '发行期限(年)',
+    `issue_interest_rate`     varchar(50)           DEFAULT NULL COMMENT '发行利率(%)',
+    `issue_phase`             varchar(50)           DEFAULT NULL COMMENT '发行期数',
+    `way_of_pay_interest`     varchar(255)          DEFAULT NULL COMMENT '付息方式',
+    `new_bond_amount`         float                 DEFAULT NULL COMMENT '新增债券(亿元)',
+    `counter_bond_amount`     float                 DEFAULT NULL COMMENT '置换债券(亿元)',
+    `refinancing_bond_amount` float                 DEFAULT NULL COMMENT '再融资债券(亿元)',
+    `redemption_method`       varchar(255)          DEFAULT NULL COMMENT '赎回方式',
+    `value_date`              varchar(50)           DEFAULT NULL COMMENT '起息日',
+    `expiry_date`             varchar(50)           DEFAULT NULL COMMENT '到息日',
+    `pay_interest_date`       varchar(50)           DEFAULT NULL COMMENT '付息日',
+    `late_pay_interest_date`  varchar(50)           DEFAULT NULL COMMENT '最近付息日',
+    `remind_pay_days`         int(11)               DEFAULT NULL COMMENT '提醒还款(天)',
+    `last_pay_interest`       float                 DEFAULT NULL COMMENT '上期已付息(亿元)',
+    `is_early_repay_prinipal` varchar(50)           DEFAULT NULL COMMENT '提前还本',
+    `cumulative_pay_interest` float                 DEFAULT NULL COMMENT '累计付息(亿元)',
+    `is_counter_bond`         varchar(50)           DEFAULT NULL COMMENT '柜台债',
+    `comeintime`              timestamp    NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '入库时间',
+    `updatetime`              timestamp    NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
+    PRIMARY KEY (`id`),
+    KEY `idx_bond_name` (`bond_name`)
+) ENGINE = InnoDB
+  DEFAULT CHARSET = utf8mb4 COMMENT ='债券基本信息';
+```
+
+
+
+#### bond_change_log  债券-修改记录表
+
+```mysql
+CREATE TABLE `zxz_bond_change_log`
+(
+    `id`            int(11)      NOT NULL AUTO_INCREMENT COMMENT '主键自增',
+    `bond_name`     varchar(255) NOT NULL COMMENT '债券名称',
+    `change_reason` varchar(500)          DEFAULT NULL COMMENT '变更原因',
+    `change_detail` varchar(1000)         DEFAULT NULL COMMENT '变更内容',
+    `comeintime`    timestamp    NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '入库时间',
+    `updatetime`    timestamp    NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
+    PRIMARY KEY (`id`),
+    KEY `idx_bondName` (`bond_name`)
+) ENGINE = InnoDB
+  DEFAULT CHARSET = utf8mb4 COMMENT ='债券-修改记录表';
+```
+
+
+#### project_bond_relation
+
+```mysql
+CREATE TABLE `zxz_project_bond_relation`
+(
+    `id`         int(11) NOT NULL AUTO_INCREMENT COMMENT '主键自增',
+    `project_id` int(11) DEFAULT NULL COMMENT '项目ID',
+    `bond_id`    int(11) DEFAULT NULL COMMENT '债券ID',
+    PRIMARY KEY (`id`),
+    KEY (`project_id`),
+    KEY (`bond_id`)
+) ENGINE = InnoDB
+  DEFAULT CHARSET = utf8mb4 COMMENT ='债券-项目关系表';
+```

+ 1 - 0
zhaiquan/tools.go

@@ -0,0 +1 @@
+package main