Explorar el Código

更新 订单归集

wcc hace 1 mes
padre
commit
f31147d8eb

BIN
account_order/account_order_all_0613


+ 17 - 16
account_order/config.go

@@ -202,22 +202,23 @@ func (DwdFAccountOrder) TableName() string {
 
 
 // OrderSaleRecord  原来的业绩变更表
 // OrderSaleRecord  原来的业绩变更表
 type OrderSaleRecord struct {
 type OrderSaleRecord struct {
-	ID             int        `gorm:"primaryKey;autoIncrement"`
-	Ordercode      string     `gorm:"column:ordercode;unique;comment:'订单编号'"`
-	State          int        `gorm:"column:state;comment:'1 生效业绩,2:待生效业绩 -2:作废业绩 -1:历史业绩变更'"`
-	SalerID        int        `gorm:"column:saler_Id;comment:'销售人员在剑鱼后台的用户 id'"`
-	SalerName      string     `gorm:"column:saler_name;comment:'销售人员名字'"`
-	SalerDept      string     `gorm:"column:saler_dept;comment:'销售部门'"`
-	SalerDeptID    int        `gorm:"column:saler_dept_id;comment:'销售部门 id'"`
-	Money          int        `gorm:"column:money;comment:'销售业绩,单位分'"`
-	ChangeValue    int        `gorm:"column:change_value;comment:'变更值'"`
-	GroupUUID      string     `gorm:"column:group_uuid;comment:'业绩组 id'"`
-	LastGroupUUID  string     `gorm:"column:last_group_uuid;comment:'上次业绩组 id'"`
-	ChangeReason   string     `gorm:"column:change_reason;comment:'变更原因'"`
-	Operator       string     `gorm:"column:operator;comment:'操作人'"`
-	StatisticsTime *time.Time `gorm:"column:statistics_time;comment:'业绩统计时间'"`
-	CreateTime     *time.Time `gorm:"column:create_time;comment:'创建时间'"`
-	AutoUpdate     *time.Time `gorm:"column:autoUpdate;comment:'自动更新时间'"`
+	ID                  int        `gorm:"primaryKey;autoIncrement"`
+	Ordercode           string     `gorm:"column:ordercode;unique;comment:'订单编号'"`
+	State               int        `gorm:"column:state;comment:'1 生效业绩,2:待生效业绩 -2:作废业绩 -1:历史业绩变更'"`
+	SalerID             int        `gorm:"column:saler_Id;comment:'销售人员在剑鱼后台的用户 id'"`
+	SalerName           string     `gorm:"column:saler_name;comment:'销售人员名字'"`
+	SalerDept           string     `gorm:"column:saler_dept;comment:'销售部门'"`
+	SalerDeptID         int        `gorm:"column:saler_dept_id;comment:'销售部门 id'"`
+	Money               int        `gorm:"column:money;comment:'销售业绩,单位分'"`
+	ChangeValue         int        `gorm:"column:change_value;comment:'变更值'"`
+	GroupUUID           string     `gorm:"column:group_uuid;comment:'业绩组 id'"`
+	LastGroupUUID       string     `gorm:"column:last_group_uuid;comment:'上次业绩组 id'"`
+	ChangeReason        string     `gorm:"column:change_reason;comment:'变更原因'"`
+	Operator            string     `gorm:"column:operator;comment:'操作人'"`
+	DistributionChannel string     `gorm:"column:distribution_channel"` // 销售渠道
+	StatisticsTime      *time.Time `gorm:"column:statistics_time;comment:'业绩统计时间'"`
+	CreateTime          *time.Time `gorm:"column:create_time;comment:'创建时间'"`
+	AutoUpdate          *time.Time `gorm:"column:autoUpdate;comment:'自动更新时间'"`
 }
 }
 
 
 func (OrderSaleRecord) TableName() string {
 func (OrderSaleRecord) TableName() string {

+ 1 - 1
account_order/config.toml

@@ -40,7 +40,7 @@
     table6 = "dwd_f_userbase_baseinfo" ## 用户归集表
     table6 = "dwd_f_userbase_baseinfo" ## 用户归集表
     table7 = "dwd_f_userbase_id_mapping" ## 用户归集表
     table7 = "dwd_f_userbase_id_mapping" ## 用户归集表
     etime = ""  ## 数据截止时间,"2024-11-02"
     etime = ""  ## 数据截止时间,"2024-11-02"
-    test = true
+    test = false
 
 
 
 
 [clickhouse] ## clickhouse 数据库
 [clickhouse] ## clickhouse 数据库

+ 3 - 3
account_order/init.go

@@ -82,7 +82,7 @@ func InitMysql() {
 	// 连接到数据库
 	// 连接到数据库
 	var err error
 	var err error
 	AnalysisDB, err = gorm.Open(mysql.Open(dsn), &gorm.Config{
 	AnalysisDB, err = gorm.Open(mysql.Open(dsn), &gorm.Config{
-		Logger: logger.Default.LogMode(logger.Error), //不打印日志
+		Logger: logger.Default.LogMode(logger.Silent), //不打印日志
 	})
 	})
 	if err != nil {
 	if err != nil {
 		log.Info("InitMysql", zap.String("初始化MySQL", "data_analysis数据库失败"), zap.Error(err))
 		log.Info("InitMysql", zap.String("初始化MySQL", "data_analysis数据库失败"), zap.Error(err))
@@ -93,7 +93,7 @@ func InitMysql() {
 
 
 	dsn2 := fmt.Sprintf("%s:%s@tcp(%s)/%s?charset=utf8mb4&parseTime=True&loc=Local", username, password, host, GF.Mysql.Dbname2)
 	dsn2 := fmt.Sprintf("%s:%s@tcp(%s)/%s?charset=utf8mb4&parseTime=True&loc=Local", username, password, host, GF.Mysql.Dbname2)
 	JianyuDB, err = gorm.Open(mysql.Open(dsn2), &gorm.Config{
 	JianyuDB, err = gorm.Open(mysql.Open(dsn2), &gorm.Config{
-		Logger: logger.Default.LogMode(logger.Error), //不打印日志
+		Logger: logger.Default.LogMode(logger.Silent), //不打印日志
 	})
 	})
 	if err != nil {
 	if err != nil {
 		log.Info("InitMysql", zap.String("初始化MySQL", "jianyu 数据库失败"), zap.Error(err))
 		log.Info("InitMysql", zap.String("初始化MySQL", "jianyu 数据库失败"), zap.Error(err))
@@ -104,7 +104,7 @@ func InitMysql() {
 
 
 	dsn3 := fmt.Sprintf("%s:%s@tcp(%s)/%s?charset=utf8mb4&parseTime=True&loc=Local", username, password, host, GF.Mysql.Dbname3)
 	dsn3 := fmt.Sprintf("%s:%s@tcp(%s)/%s?charset=utf8mb4&parseTime=True&loc=Local", username, password, host, GF.Mysql.Dbname3)
 	JianyuSubjectDB, err = gorm.Open(mysql.Open(dsn3), &gorm.Config{
 	JianyuSubjectDB, err = gorm.Open(mysql.Open(dsn3), &gorm.Config{
-		Logger: logger.Default.LogMode(logger.Error), //不打印日志
+		Logger: logger.Default.LogMode(logger.Silent), //不打印日志
 	})
 	})
 	if err != nil {
 	if err != nil {
 		log.Info("InitMysql", zap.String("初始化MySQL", "Jianyu_subjectdb 数据库失败"), zap.Error(err))
 		log.Info("InitMysql", zap.String("初始化MySQL", "Jianyu_subjectdb 数据库失败"), zap.Error(err))

+ 7 - 8
account_order/main.go

@@ -262,16 +262,15 @@ func dealAllDataAccountOrder2() {
 					accountOrder.SaleTime = dataExOrder.SaleTime
 					accountOrder.SaleTime = dataExOrder.SaleTime
 					accountOrder.OriginalPrice = dataExOrder.OriginalPrice
 					accountOrder.OriginalPrice = dataExOrder.OriginalPrice
 					//合同金额
 					//合同金额
-					if dataExOrder.IsBackstageOrder == 0 { //线上订单
-						if dataExOrder.OrderStatus == 1 {
-							accountOrder.ContractMoney = util.IntAll(filterMap["originalAmount"])
-						} else {
+					if util.IntAll(filterMap["originalAmount"]) != 0 {
+						accountOrder.ContractMoney = util.IntAll(filterMap["originalAmount"])
+					} else {
+						if dataExOrder.IsBackstageOrder == 0 { //线上订单
 							accountOrder.ContractMoney = dataExOrder.OrderMoney
 							accountOrder.ContractMoney = dataExOrder.OrderMoney
+						} else {
+							accountOrder.ContractMoney = dataExOrder.PayMoney
 						}
 						}
-					} else { //线下订单
-						accountOrder.ContractMoney = dataExOrder.PayMoney
 					}
 					}
-
 					accountOrder.Commission = dataExOrder.Commission
 					accountOrder.Commission = dataExOrder.Commission
 					accountOrder.ProceduresMoney = dataExOrder.ProceduresMoney
 					accountOrder.ProceduresMoney = dataExOrder.ProceduresMoney
 					accountOrder.ReceivableAmount = accountOrder.ContractMoney - accountOrder.Commission - accountOrder.ProceduresMoney
 					accountOrder.ReceivableAmount = accountOrder.ContractMoney - accountOrder.Commission - accountOrder.ProceduresMoney
@@ -387,7 +386,7 @@ func dealAllDataAccountOrder2() {
 						accountOrder.SigningSubject = "北京拓普丰联信息科技股份有限公司"
 						accountOrder.SigningSubject = "北京拓普丰联信息科技股份有限公司"
 					}
 					}
 					accountOrder.OrderChannel = dataExOrder.OrderChannel
 					accountOrder.OrderChannel = dataExOrder.OrderChannel
-					accountOrder.DistributionChannel = dataExOrder.DistributionChannel
+					accountOrder.DistributionChannel = osr.DistributionChannel
 					if dataExOrder.IsBackstageOrder == 1 {
 					if dataExOrder.IsBackstageOrder == 1 {
 						accountOrder.IsBackstageOrder = "是"
 						accountOrder.IsBackstageOrder = "是"
 					} else {
 					} else {

+ 243 - 0
zhaiquan/attach.go

@@ -0,0 +1,243 @@
+package main
+
+import (
+	"fmt"
+	"github.com/yanyiwu/gojieba"
+	"gorm.io/gorm"
+	util "jygit.jydev.jianyu360.cn/data_processing/common_utils"
+	"regexp"
+	"strings"
+)
+
+// dealAttachment 处理债券附件
+//func dealAttachment1() {
+//	sess := Mgo.GetMgoConn()
+//	defer Mgo.DestoryMongoConn(sess)
+//	query := sess.DB("py_theme").C("special_purpose_bond_files_detail").Find(nil).Select(nil).Iter()
+//	count := 0
+//
+//	bonds := make([]BondInfo, 0) // MySQL 债券数据
+//	for tmp := make(map[string]interface{}); query.Next(tmp); count++ {
+//		if count%100 == 0 {
+//			log.Info("current:", zap.Int("count", count), zap.Any("title", tmp["title"]))
+//		}
+//		//
+//		if atta, ok := tmp["attachments"]; ok {
+//			if atm, ok := atta.(map[string]interface{}); ok {
+//				for _, v := range atm {
+//					if dd, ok := v.(map[string]interface{}); ok {
+//						//attachments 里面的文件名称
+//						filename := util.ObjToString(dd["filename"])
+//						fmt.Println(filename)
+//					}
+//				}
+//			}
+//		}
+//	}
+//}
+
+func dealAttachment(db *gorm.DB) {
+	sess := Mgo.GetMgoConn()
+	defer Mgo.DestoryMongoConn(sess)
+
+	// 1. 获取 MySQL 所有债券数据
+	var bonds []BondInfo
+	if err := db.Table("zxz_bond_info").Find(&bonds).Error; err != nil {
+		fmt.Println("获取 MySQL 债券数据失败:", err)
+		return
+	}
+
+	// 2. 初始化分词器
+	tokenizer := gojieba.NewJieba()
+	defer tokenizer.Free()
+
+	// 3. 遍历 MongoDB
+	query := sess.DB("py_theme").C("special_purpose_bond_files_detail").Find(nil).Iter()
+	count := 0
+	tmp := make(map[string]interface{})
+
+	for query.Next(&tmp) {
+		count++
+		if count%100 == 0 {
+			fmt.Println("Progress:", count)
+		}
+
+		if attachments, ok := tmp["attachments"].(map[string]interface{}); ok {
+			for _, item := range attachments {
+				if attMap, ok := item.(map[string]interface{}); ok {
+					filename := util.ObjToString(attMap["filename"])
+					cleanFilename := strings.TrimSuffix(filename, ".pdf")
+					// 提取 MongoDB 附件关键词
+					k1 := ExtractKeywords(cleanFilename, tokenizer)
+
+					// 逐个匹配 MySQL 中的 bond_name
+					for _, bond := range bonds {
+						k2 := ExtractKeywords(bond.BondName, tokenizer)
+						if IsMatch(k1, k2) {
+							fmt.Printf("匹配成功: [%s] <=> [%s]\n", cleanFilename, bond.BondName)
+							// 可记录匹配对结果到文件/数据库
+							break
+						}
+					}
+				}
+			}
+		}
+	}
+}
+
+func ExtractKeywordsV4(text string) []map[string]string {
+	text = strings.ReplaceAll(text, "(", "(")
+	text = strings.ReplaceAll(text, ")", ")")
+
+	// 匹配模式:完整提取年 + 省 + 债券类型 + 期数 + 括号说明
+	mainReg := regexp.MustCompile(`(?P<year>\d{4}年)(?P<province>[\p{Han}]{2,3}省)(?P<type>[\p{Han}]{2,20}债券)(?P<phase>[一二三四五六七八九十百至]{1,6}期)?(?:\((?P<bracket>[^)]+)\))?`)
+	matches := mainReg.FindAllStringSubmatch(text, -1)
+
+	results := make([]map[string]string, 0, len(matches))
+
+	for _, match := range matches {
+		if len(match) < 6 {
+			continue
+		}
+		year := match[1]
+		province := match[2]
+		bondType := match[3]
+		phase := match[4]
+		bracket := match[5]
+
+		results = append(results, map[string]string{
+			"year":     year,
+			"province": province,
+			"type":     bondType,
+			"phase":    phase,
+			"bracket":  bracket,
+		})
+	}
+
+	return results
+}
+
+func ExtractKeywordsV3WithJieba(text string, tokenizer *gojieba.Jieba) []map[string]string {
+	text = strings.ReplaceAll(text, "(", "(")
+	text = strings.ReplaceAll(text, ")", ")")
+
+	// 提取年份
+	yearReg := regexp.MustCompile(`\d{4}年`)
+	year := yearReg.FindString(text)
+
+	// 提取“年”后的省份
+	province := ""
+	if year != "" {
+		afterYear := text[strings.Index(text, year)+len(year):]
+		provinceReg := regexp.MustCompile(`[\p{Han}]{2,3}省`)
+		province = provinceReg.FindString(afterYear)
+	}
+
+	// 债券类型词典
+	bondTypes := []string{
+		"专项债券", "政府专项债券", "一般债券", "政府一般债券",
+		"再融资专项债券", "再融资一般债券", "再融资债券",
+	}
+
+	// combo 匹配正则
+	comboReg := regexp.MustCompile(`(?P<type>[\p{Han}]{2,12}债券)[,、,]?(?P<phase>[一二三四五六七八九十百至]{1,6}期)?(?:\((?P<bracket>[^)]+)\))?`)
+	matches := comboReg.FindAllStringSubmatch(text, -1)
+
+	results := make([]map[string]string, 0, len(matches))
+
+	for _, match := range matches {
+		if len(match) < 4 {
+			continue
+		}
+		bondType := match[1]
+		phase := match[2]
+		bracket := match[3]
+
+		// 精确类型匹配
+		bestMatch := ""
+		for _, t := range bondTypes {
+			if strings.Contains(bondType, t) {
+				bestMatch = t
+				break
+			}
+		}
+		if bestMatch == "" {
+			bestMatch = bondType // fallback
+		}
+
+		results = append(results, map[string]string{
+			"year":     year,
+			"province": province,
+			"type":     bestMatch,
+			"phase":    phase,
+			"bracket":  bracket,
+		})
+	}
+
+	return results
+}
+
+// ExtractKeywords 提取五类关键词
+func ExtractKeywords(text string, tokenizer *gojieba.Jieba) map[string]string {
+	text = removeFileExtension(text)
+	// 分词
+	words := tokenizer.Cut(text, true)
+	wordSet := make(map[string]bool)
+	for _, w := range words {
+		wordSet[w] = true
+	}
+
+	// 正则抽取
+	yearReg := regexp.MustCompile(`\d{4}(年|年度)`)
+	provinceReg := regexp.MustCompile(`20\d{2}年([\p{Han}]{2,3}省)`)
+	phaseReg := regexp.MustCompile(`(第[一二三四五六七八九十百]{1,3}期|[一二三四五六七八九十百]{1,3}至[一二三四五六七八九十百]{1,3}期)`)
+	bracketReg := regexp.MustCompile(`([^)]+)`)
+
+	// 提取关键字段
+	year := yearReg.FindString(text)
+	province := ""
+	if match := provinceReg.FindStringSubmatch(text); len(match) == 2 {
+		province = match[1]
+	}
+	phase := phaseReg.FindString(text)
+	bracket := bracketReg.FindString(text)
+
+	// 通过词判断类型
+	bondType := ""
+	for _, t := range []string{"专项债券", "专项债", "一般债券", "一般债", "再融资债", "再融资一般债"} {
+		if wordSet[t] {
+			bondType = t
+			break
+		}
+	}
+
+	return map[string]string{
+		"year":     year,
+		"province": province,
+		"phase":    phase,
+		"bracket":  bracket,
+		"type":     bondType,
+	}
+}
+
+// removeFileExtension 去除常见扩展名
+func removeFileExtension(text string) string {
+	suffixes := []string{".pdf", ".doc", ".docx", ".xls", ".xlsx", ".txt", ".zip"}
+	for _, ext := range suffixes {
+		if strings.HasSuffix(text, ext) {
+			return strings.TrimSuffix(text, ext)
+		}
+	}
+	return text
+}
+
+// IsMatch 判断关键词是否完全一致
+func IsMatch(k1, k2 map[string]string) bool {
+	for k := range k1 {
+		if k1[k] != "" && k1[k] == k2[k] {
+			continue
+		}
+		return false
+	}
+	return true
+}

+ 2 - 2
zhaiquan/config.toml

@@ -6,8 +6,8 @@
     username = ""
     username = ""
     password = ""
     password = ""
     direct = true
     direct = true
-    list = "specialbond_list_weekly"
-    detail = "specialbond_detail_weekly"
+    list = "specialbond_list_daily"
+    detail = "specialbond_detail_daily"
 #    list ="specialbond_list,specialbond_list_history,specialbond_list_202502"    ## 列表数据表
 #    list ="specialbond_list,specialbond_list_history,specialbond_list_202502"    ## 列表数据表
 #    detail = "specialbond_detail,specialbond_detail_history,specialbond_detail_202502" ## 详情数据表
 #    detail = "specialbond_detail,specialbond_detail_history,specialbond_detail_202502" ## 详情数据表
 
 

+ 3 - 0
zhaiquan/go.mod

@@ -3,9 +3,11 @@ module zhaiquan
 go 1.22.6
 go 1.22.6
 
 
 require (
 require (
+	github.com/itcwc/go-zhipu v0.0.0-20241012024741-d3403fa63180
 	github.com/robfig/cron/v3 v3.0.1
 	github.com/robfig/cron/v3 v3.0.1
 	github.com/spf13/viper v1.19.0
 	github.com/spf13/viper v1.19.0
 	github.com/xuri/excelize/v2 v2.9.0
 	github.com/xuri/excelize/v2 v2.9.0
+	github.com/yanyiwu/gojieba v1.4.5
 	go.uber.org/zap v1.22.0
 	go.uber.org/zap v1.22.0
 	gorm.io/driver/mysql v1.5.7
 	gorm.io/driver/mysql v1.5.7
 	gorm.io/gorm v1.25.12
 	gorm.io/gorm v1.25.12
@@ -18,6 +20,7 @@ require (
 	github.com/dchest/captcha v1.0.0 // indirect
 	github.com/dchest/captcha v1.0.0 // indirect
 	github.com/fsnotify/fsnotify v1.7.0 // indirect
 	github.com/fsnotify/fsnotify v1.7.0 // indirect
 	github.com/go-sql-driver/mysql v1.7.0 // indirect
 	github.com/go-sql-driver/mysql v1.7.0 // indirect
+	github.com/golang-jwt/jwt v3.2.2+incompatible // indirect
 	github.com/golang/snappy v0.0.1 // indirect
 	github.com/golang/snappy v0.0.1 // indirect
 	github.com/hashicorp/hcl v1.0.0 // indirect
 	github.com/hashicorp/hcl v1.0.0 // indirect
 	github.com/jinzhu/inflection v1.0.0 // indirect
 	github.com/jinzhu/inflection v1.0.0 // indirect

+ 6 - 0
zhaiquan/go.sum

@@ -32,6 +32,8 @@ github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre
 github.com/go-sql-driver/mysql v1.6.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg=
 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 h1:ueSltNNllEqE3qcWBTD0iQd3IpL/6U+mJxLkazJ7YPc=
 github.com/go-sql-driver/mysql v1.7.0/go.mod h1:OXbVy3sEdcQ2Doequ6Z5BW6fXNQTmx+9S1MCJN5yJMI=
 github.com/go-sql-driver/mysql v1.7.0/go.mod h1:OXbVy3sEdcQ2Doequ6Z5BW6fXNQTmx+9S1MCJN5yJMI=
+github.com/golang-jwt/jwt v3.2.2+incompatible h1:IfV12K8xAKAnZqdXVzCZ+TOjboZ2keLg81eXfW3O+oY=
+github.com/golang-jwt/jwt v3.2.2+incompatible/go.mod h1:8pz2t5EyA70fFQQSrl6XZXzqecmYZeUEB8OUGHkxJ+I=
 github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=
 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-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/groupcache v0.0.0-20210331224755-41bb18bfe9da/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
@@ -61,6 +63,8 @@ github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeN
 github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
 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 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4=
 github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ=
 github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ=
+github.com/itcwc/go-zhipu v0.0.0-20241012024741-d3403fa63180 h1:VdR4JGLcc5fQIIjX6ZOidxlnM/V7K1gH/Fa1AsjdJQc=
+github.com/itcwc/go-zhipu v0.0.0-20241012024741-d3403fa63180/go.mod h1:z7QZm7ol2nikFFGHwArJr1NTtBSE0M0g9MvHKxm1Sw0=
 github.com/jinzhu/inflection v1.0.0 h1:K317FqzuhWc8YvSVlFMCCUb36O/S9MCKRDI7QkRKD/E=
 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/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 h1:/o9tlHleP7gOFmsnYNz3RGnqzefHA47wQpKrrdTIwXQ=
@@ -153,6 +157,8 @@ github.com/xuri/excelize/v2 v2.9.0 h1:1tgOaEq92IOEumR1/JfYS/eR0KHOCsRv/rYXXh6YJQ
 github.com/xuri/excelize/v2 v2.9.0/go.mod h1:uqey4QBZ9gdMeWApPLdhm9x+9o2lq4iVmjiLfBS5hdE=
 github.com/xuri/excelize/v2 v2.9.0/go.mod h1:uqey4QBZ9gdMeWApPLdhm9x+9o2lq4iVmjiLfBS5hdE=
 github.com/xuri/nfp v0.0.0-20240318013403-ab9948c2c4a7 h1:hPVCafDV85blFTabnqKgNhDCkJX25eik94Si9cTER4A=
 github.com/xuri/nfp v0.0.0-20240318013403-ab9948c2c4a7 h1:hPVCafDV85blFTabnqKgNhDCkJX25eik94Si9cTER4A=
 github.com/xuri/nfp v0.0.0-20240318013403-ab9948c2c4a7/go.mod h1:WwHg+CVyzlv/TX9xqBFXEZAuxOPxn2k1GNHwG41IIUQ=
 github.com/xuri/nfp v0.0.0-20240318013403-ab9948c2c4a7/go.mod h1:WwHg+CVyzlv/TX9xqBFXEZAuxOPxn2k1GNHwG41IIUQ=
+github.com/yanyiwu/gojieba v1.4.5 h1:VyZogGtdFSnJbACHvDRvDreXPPVPCg8axKFUdblU/JI=
+github.com/yanyiwu/gojieba v1.4.5/go.mod h1:JUq4DddFVGdHXJHxxepxRmhrKlDpaBxR8O28v6fKYLY=
 github.com/youmark/pkcs8 v0.0.0-20181117223130-1be2e3e5546d h1:splanxYIlg+5LfHAM6xpdFEAYOk8iySO56hMFq6uLyA=
 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/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=
 github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=

+ 2 - 0
zhaiquan/main.go

@@ -17,6 +17,8 @@ var (
 )
 )
 
 
 func main() {
 func main() {
+
+	return
 	Init()
 	Init()
 	local, _ := time.LoadLocation("Asia/Shanghai")
 	local, _ := time.LoadLocation("Asia/Shanghai")
 	c := cron.New(cron.WithLocation(local), cron.WithSeconds())
 	c := cron.New(cron.WithLocation(local), cron.WithSeconds())

+ 60 - 0
zhaiquan/tools.go

@@ -1,5 +1,14 @@
 package main
 package main
 
 
+import (
+	"encoding/json"
+	"fmt"
+	zhipu "github.com/itcwc/go-zhipu/model_api"
+	"github.com/itcwc/go-zhipu/utils"
+	"log"
+	"strings"
+)
+
 // removeDuplicates 去除数组重复数据
 // removeDuplicates 去除数组重复数据
 func removeDuplicates(bondIds []int) []int {
 func removeDuplicates(bondIds []int) []int {
 	unique := make(map[int]struct{}) // 使用 struct{} 作为值,占用内存小
 	unique := make(map[int]struct{}) // 使用 struct{} 作为值,占用内存小
@@ -13,3 +22,54 @@ func removeDuplicates(bondIds []int) []int {
 	}
 	}
 	return result
 	return result
 }
 }
+
+// ZpAI4 传参主营业务
+func ZpAI4(apiKey, model, name string, businessScope string, names []string) (rest map[string]interface{}) {
+	expireAtTime := int64(1751339252) // token 过期时间
+	sys := `请根据我给出的公司名称,依据其单位性质、单位职能和业务范围,准确给出最符合的二个国标行业分类标签;分别给出一级标签、二级标签、三级标签和四级标签,并给出每一个的可靠性,可靠性用浮点数表示,比如:0.85,输出结果以JSON格式返回,格式如下:
+{
+  "result":[
+      {"label1":"制造业","label2":"通用设备制造业","label3":"通用零部件制造","label4":"机械零部件加工","score":0.83},
+      {"label1":"制造业","label2":"食品制造业","label3":"罐头食品制造","label4":"蔬菜、水果罐头制造","score":0.80}
+    ]
+};返回结果按照score 降序排序。我只要最匹配的二个国标行业标签,只需要返回对应的中文。如果无法识别出类别,直接给我空字符串。按照以上要求输出,不要联想,不要无中生有,不要生成解释。公司是:`
+
+	text := fmt.Sprintf("%s,%s", sys, name)
+	text = text + "请在我提供的国标行标签里返回,国标行业标签有:" + strings.Join(names, ",")
+
+	if businessScope != "" {
+		text = text + ";主营业务是:" + businessScope
+	}
+	mssage := zhipu.PostParams{
+		Model: model,
+		Messages: []zhipu.Message{
+			{
+				Role:    "user", // 消息的角色信息 详见文档
+				Content: text,
+			},
+		},
+	}
+	token, _ := utils.GenerateToken(apiKey, expireAtTime)
+	postResponse, err := zhipu.BeCommonModel(mssage, token)
+	if err != nil {
+		fmt.Println(err)
+		return
+	}
+
+	if choices, ok := postResponse["choices"].([]interface{}); ok {
+		if choice, ok2 := choices[0].(map[string]interface{}); ok2 {
+			if message, ok3 := choice["message"].(map[string]interface{}); ok3 {
+				if content, ok4 := message["content"].(string); ok4 {
+					content = strings.ReplaceAll(content, "\n", "")
+					content = strings.ReplaceAll(content, "json", "")
+					content = strings.ReplaceAll(content, "`", "")
+					err = json.Unmarshal([]byte(content), &rest)
+					if err != nil {
+						log.Println("Unmarshal err", err, "content:", content)
+					}
+				}
+			}
+		}
+	}
+	return
+}

+ 24 - 0
zhaiquan/zz_test.go

@@ -0,0 +1,24 @@
+package main
+
+import (
+	"fmt"
+	"github.com/yanyiwu/gojieba"
+	"testing"
+)
+
+func TestExtractKeywords(t *testing.T) {
+	s1 := "2025年山西省政府一般债券(三期)、专项债券(七至十一期)和再融资一般债券(二期)信息披露文件.pdf"
+	s2 := "2025年河南省专项债券十五期(城乡发展专项债)"
+	// 2. 初始化分词器
+	tokenizer := gojieba.NewJieba()
+	defer tokenizer.Free()
+
+	r1 := ExtractKeywordsV4(s1)
+	r2 := ExtractKeywordsV4(s2)
+
+	fmt.Println(r1, r2)
+
+	k1 := ExtractKeywordsV3WithJieba(s1, tokenizer)
+	k2 := ExtractKeywordsV3WithJieba(s2, tokenizer)
+	fmt.Println(k1, k2)
+}