main.go 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180
  1. package main
  2. import (
  3. "context"
  4. "fmt"
  5. "github.com/go-deepseek/deepseek"
  6. "github.com/go-deepseek/deepseek/request"
  7. "github.com/xuri/excelize/v2"
  8. "log"
  9. "sync"
  10. )
  11. func main() {
  12. f, err := excelize.OpenFile("./与事业部核对(发剑鱼).xlsx")
  13. //f, err := excelize.OpenFile("./20220101--20241231三一重工_历史数据V2.xlsx")
  14. if err != nil {
  15. fmt.Println("Open file error:", err)
  16. return
  17. }
  18. defer func() {
  19. if err := f.Save(); err != nil {
  20. fmt.Println("Save error:", err)
  21. }
  22. if err := f.Close(); err != nil {
  23. fmt.Println("Close error:", err)
  24. }
  25. }()
  26. rows, err := f.GetRows("sheet1")
  27. if err != nil {
  28. fmt.Println("Read rows error:", err)
  29. return
  30. }
  31. // 并发数,可调整
  32. const workerCount = 10
  33. taskChan := make(chan [3]interface{}, workerCount)
  34. var wg sync.WaitGroup
  35. // 存储结果
  36. results := make(map[int]string)
  37. var mu sync.Mutex
  38. // 启动 worker 处理数据
  39. for i := 0; i < workerCount; i++ {
  40. wg.Add(1)
  41. go func() {
  42. defer wg.Done()
  43. for row := range taskChan {
  44. index := row[0].(int) // 取出 index
  45. title := row[1].(string) // 取出标题
  46. content := row[2].(string) // 取出正文
  47. text := joinText(title, content)
  48. res := PostDouBaoDSAI(text)
  49. // 并发安全写入结果
  50. mu.Lock()
  51. results[index] = res
  52. mu.Unlock()
  53. }
  54. }()
  55. }
  56. // 分发任务
  57. //for i := 1; i < len(rows); i++ {
  58. for i := 1; i < len(rows); i++ {
  59. if i%100 == 0 {
  60. log.Println("iiiiiii", i, rows[i][1])
  61. }
  62. // 确保数据长度足够
  63. row := rows[i]
  64. if len(rows[i]) >= 7 {
  65. //taskChan <- [3]interface{}{i, rows[i][5], rows[i][7]}
  66. taskChan <- [3]interface{}{i, rows[i][1], rows[i][6]}
  67. } else {
  68. log.Printf("Skipping row %d due to insufficient columns", i, row)
  69. }
  70. }
  71. close(taskChan) // 关闭通道,通知 worker 任务结束
  72. // 等待所有 worker 结束
  73. wg.Wait()
  74. // 批量写入 Excel
  75. for index, res := range results {
  76. //f.SetCellValue("Sheet1", fmt.Sprintf("J%v", index+1), res)
  77. f.SetCellValue("Sheet1", fmt.Sprintf("H%v", index+1), res)
  78. }
  79. // 处理完后保存
  80. if err := f.Save(); err != nil {
  81. fmt.Println("Final save error:", err)
  82. }
  83. }
  84. func main2() {
  85. f, err := excelize.OpenFile("./20220101--20241231三一重工_历史数据V2.xlsx")
  86. if err != nil {
  87. fmt.Println(err)
  88. return
  89. }
  90. defer func() {
  91. f.Save()
  92. if err := f.Close(); err != nil {
  93. fmt.Println(err)
  94. }
  95. }()
  96. rows, err := f.GetRows("sheet1")
  97. if err != nil {
  98. fmt.Println(err)
  99. return
  100. }
  101. for i := 1; i < len(rows); i++ {
  102. title := rows[i][5]
  103. content := rows[i][7]
  104. text := joinText(title, content)
  105. if i%10 == 0 {
  106. log.Println("iii", i, title)
  107. f.Save()
  108. }
  109. res := PostDouBaoDSAI(text)
  110. f.SetCellValue("Sheet1", fmt.Sprintf("J%v", i+1), res)
  111. }
  112. }
  113. func joinText(title, content string) string {
  114. return fmt.Sprintf(""+
  115. "你是一名招投标业务专家,可以根据我提供的信息清单,结合我公司(三一重工)的背景知识判断信息中的产品内容是否与我公司产品相关。\n==========\n背景知识:\n我公司(三一重工)业务范围是国内工程机械类,具体产内容如下:\n挖机 包括:挖机,挖掘机,装载机,挖土机\n泵送 包括:泵送,泵车,搅拌车,拖泵,搅拌站,车载泵,混凝土搅拌天泵一体车,喷湿机,砂浆泵,充填泵\n重起 包括:组合式起重机,重起,汽车起重机,履带起重机,塔式起重机,地面起重机,随车起重机,桥式起重机,起重机械,天车,吊车,航吊,起重机,履带吊,汽车吊,门式起重机\n桩机 包括:桩机,旋挖钻机,旋挖桩机,旋挖式钻机,大旋挖,中旋挖,小旋挖\n路机 包括:路机,铣刨机,摊铺机,平地机,压路机,沥青站,沥青搅拌站,液压夯实机,冲击碾压机,沥青混凝土拌和站,沥青搅拌设备\n===========\n\n判断相关的标准如下:\n1、信息中的产品和我司产品高度一致,认为相关。\n2、有相关产品的采购需求,认为相关。\n3、不用考虑是否是我司提供相关产品,只要和我司产品相关,认为相关。\n4、相关设备的“租赁、配件、服务”等需求,认为不相关。\n输出要求:不要解释说明,不要联想,直接输出结果:相关/不相关\n\n信息内容如下:\n标题: %s\n正文: %s", title, content)
  116. }
  117. func tes() {
  118. client, _ := deepseek.NewClient("ep-20250313104433-ptcxr")
  119. chatReq := &request.ChatCompletionsRequest{
  120. Model: deepseek.DEEPSEEK_CHAT_MODEL,
  121. Temperature: ToPtr(float32(0.7)),
  122. TopP: ToPtr(float32(0.1)),
  123. Stream: false,
  124. Messages: []*request.Message{
  125. {
  126. Role: "user",
  127. Content: "Hello Deepseek!", // set your input message
  128. },
  129. },
  130. }
  131. chatResp, err := client.CallChatCompletionsChat(context.Background(), chatReq)
  132. if err != nil {
  133. fmt.Println("Error =>", err)
  134. return
  135. }
  136. fmt.Printf("output => %s\n", chatResp.Choices[0].Message.Content)
  137. }
  138. /**
  139. 你是一名招投标业务专家,可以根据我提供的信息清单,结合我公司(三一重工)的背景知识判断信息中的产品内容是否与我公司产品相关。
  140. ==========
  141. 背景知识:
  142. 我公司(三一重工)业务范围是国内工程机械类,具体产内容如下:
  143. 挖机 包括:挖机,挖掘机,装载机,挖土机
  144. 泵送 包括:泵送,泵车,搅拌车,拖泵,搅拌站,车载泵,混凝土搅拌天泵一体车,喷湿机,砂浆泵,充填泵
  145. 重起 包括:组合式起重机,重起,汽车起重机,履带起重机,塔式起重机,地面起重机,随车起重机,桥式起重机,起重机械,天车,吊车,航吊,起重机,履带吊,汽车吊,门式起重机
  146. 桩机 包括:桩机,旋挖钻机,旋挖桩机,旋挖式钻机,大旋挖,中旋挖,小旋挖
  147. 路机 包括:路机,铣刨机,摊铺机,平地机,压路机,沥青站,沥青搅拌站,液压夯实机,冲击碾压机,沥青混凝土拌和站,沥青搅拌设备
  148. ===========
  149. 判断相关的标准如下:
  150. 1、信息中的产品和我司产品高度一致,认为相关。
  151. 2、有相关产品的采购需求,认为相关。
  152. 3、不用考虑是否是我司提供相关产品,只要和我司产品相关,认为相关。
  153. 4、相关设备的“租赁、配件、服务”等需求,认为不相关。
  154. 输出要求:不要解释说明,不要联想,直接输出结果:相关/不相关;如果不相关,请给出你的判断依据。
  155. 输出样例:1、相关,判断相关依据;2、不相关,判断不相关依据;
  156. 信息内容如下:
  157. 标题: 信息标题
  158. 正文: 正文+附件
  159. */