package main import ( "context" "fmt" "github.com/go-deepseek/deepseek" "github.com/go-deepseek/deepseek/request" "github.com/xuri/excelize/v2" "log" "sync" ) func main() { f, err := excelize.OpenFile("./与事业部核对(发剑鱼).xlsx") //f, err := excelize.OpenFile("./20220101--20241231三一重工_历史数据V2.xlsx") if err != nil { fmt.Println("Open file error:", err) return } defer func() { if err := f.Save(); err != nil { fmt.Println("Save error:", err) } if err := f.Close(); err != nil { fmt.Println("Close error:", err) } }() rows, err := f.GetRows("sheet1") if err != nil { fmt.Println("Read rows error:", err) return } // 并发数,可调整 const workerCount = 10 taskChan := make(chan [3]interface{}, workerCount) var wg sync.WaitGroup // 存储结果 results := make(map[int]string) var mu sync.Mutex // 启动 worker 处理数据 for i := 0; i < workerCount; i++ { wg.Add(1) go func() { defer wg.Done() for row := range taskChan { index := row[0].(int) // 取出 index title := row[1].(string) // 取出标题 content := row[2].(string) // 取出正文 text := joinText(title, content) res := PostDouBaoDSAI(text) // 并发安全写入结果 mu.Lock() results[index] = res mu.Unlock() } }() } // 分发任务 //for i := 1; i < len(rows); i++ { for i := 1; i < len(rows); i++ { if i%100 == 0 { log.Println("iiiiiii", i, rows[i][1]) } // 确保数据长度足够 row := rows[i] if len(rows[i]) >= 7 { //taskChan <- [3]interface{}{i, rows[i][5], rows[i][7]} taskChan <- [3]interface{}{i, rows[i][1], rows[i][6]} } else { log.Printf("Skipping row %d due to insufficient columns", i, row) } } close(taskChan) // 关闭通道,通知 worker 任务结束 // 等待所有 worker 结束 wg.Wait() // 批量写入 Excel for index, res := range results { //f.SetCellValue("Sheet1", fmt.Sprintf("J%v", index+1), res) f.SetCellValue("Sheet1", fmt.Sprintf("H%v", index+1), res) } // 处理完后保存 if err := f.Save(); err != nil { fmt.Println("Final save error:", err) } } func main2() { f, err := excelize.OpenFile("./20220101--20241231三一重工_历史数据V2.xlsx") if err != nil { fmt.Println(err) return } defer func() { f.Save() if err := f.Close(); err != nil { fmt.Println(err) } }() rows, err := f.GetRows("sheet1") if err != nil { fmt.Println(err) return } for i := 1; i < len(rows); i++ { title := rows[i][5] content := rows[i][7] text := joinText(title, content) if i%10 == 0 { log.Println("iii", i, title) f.Save() } res := PostDouBaoDSAI(text) f.SetCellValue("Sheet1", fmt.Sprintf("J%v", i+1), res) } } func joinText(title, content string) string { return fmt.Sprintf(""+ "你是一名招投标业务专家,可以根据我提供的信息清单,结合我公司(三一重工)的背景知识判断信息中的产品内容是否与我公司产品相关。\n==========\n背景知识:\n我公司(三一重工)业务范围是国内工程机械类,具体产内容如下:\n挖机 包括:挖机,挖掘机,装载机,挖土机\n泵送 包括:泵送,泵车,搅拌车,拖泵,搅拌站,车载泵,混凝土搅拌天泵一体车,喷湿机,砂浆泵,充填泵\n重起 包括:组合式起重机,重起,汽车起重机,履带起重机,塔式起重机,地面起重机,随车起重机,桥式起重机,起重机械,天车,吊车,航吊,起重机,履带吊,汽车吊,门式起重机\n桩机 包括:桩机,旋挖钻机,旋挖桩机,旋挖式钻机,大旋挖,中旋挖,小旋挖\n路机 包括:路机,铣刨机,摊铺机,平地机,压路机,沥青站,沥青搅拌站,液压夯实机,冲击碾压机,沥青混凝土拌和站,沥青搅拌设备\n===========\n\n判断相关的标准如下:\n1、信息中的产品和我司产品高度一致,认为相关。\n2、有相关产品的采购需求,认为相关。\n3、不用考虑是否是我司提供相关产品,只要和我司产品相关,认为相关。\n4、相关设备的“租赁、配件、服务”等需求,认为不相关。\n输出要求:不要解释说明,不要联想,直接输出结果:相关/不相关\n\n信息内容如下:\n标题: %s\n正文: %s", title, content) } func tes() { client, _ := deepseek.NewClient("ep-20250313104433-ptcxr") chatReq := &request.ChatCompletionsRequest{ Model: deepseek.DEEPSEEK_CHAT_MODEL, Temperature: ToPtr(float32(0.7)), TopP: ToPtr(float32(0.1)), Stream: false, Messages: []*request.Message{ { Role: "user", Content: "Hello Deepseek!", // set your input message }, }, } chatResp, err := client.CallChatCompletionsChat(context.Background(), chatReq) if err != nil { fmt.Println("Error =>", err) return } fmt.Printf("output => %s\n", chatResp.Choices[0].Message.Content) } /** 你是一名招投标业务专家,可以根据我提供的信息清单,结合我公司(三一重工)的背景知识判断信息中的产品内容是否与我公司产品相关。 ========== 背景知识: 我公司(三一重工)业务范围是国内工程机械类,具体产内容如下: 挖机 包括:挖机,挖掘机,装载机,挖土机 泵送 包括:泵送,泵车,搅拌车,拖泵,搅拌站,车载泵,混凝土搅拌天泵一体车,喷湿机,砂浆泵,充填泵 重起 包括:组合式起重机,重起,汽车起重机,履带起重机,塔式起重机,地面起重机,随车起重机,桥式起重机,起重机械,天车,吊车,航吊,起重机,履带吊,汽车吊,门式起重机 桩机 包括:桩机,旋挖钻机,旋挖桩机,旋挖式钻机,大旋挖,中旋挖,小旋挖 路机 包括:路机,铣刨机,摊铺机,平地机,压路机,沥青站,沥青搅拌站,液压夯实机,冲击碾压机,沥青混凝土拌和站,沥青搅拌设备 =========== 判断相关的标准如下: 1、信息中的产品和我司产品高度一致,认为相关。 2、有相关产品的采购需求,认为相关。 3、不用考虑是否是我司提供相关产品,只要和我司产品相关,认为相关。 4、相关设备的“租赁、配件、服务”等需求,认为不相关。 输出要求:不要解释说明,不要联想,直接输出结果:相关/不相关;如果不相关,请给出你的判断依据。 输出样例:1、相关,判断相关依据;2、不相关,判断不相关依据; 信息内容如下: 标题: 信息标题 正文: 正文+附件 */