package main import ( "encoding/json" "fmt" "os" "strings" "time" "wasm-go/internal/api" "wasm-go/internal/excel" ) func main() { fmt.Println("========== Excel转JSON ==========") excelFile := "yst郑州惠兴财务报表2021(3).xlsx" // 检查Excel文件是否存在 if _, err := os.Stat(excelFile); os.IsNotExist(err) { fmt.Printf("❌ Excel文件不存在: %s\n", excelFile) return } // 读取Excel文件为bytes excelBytes, err := os.ReadFile(excelFile) if err != nil { fmt.Printf("❌ 读取Excel文件失败: %v\n", err) return } fmt.Println("✓ 读取Excel文件为字节成功") // 使用NewXLSXReaderFromBytes从bytes创建读取器 reader, err := excel.NewXLSXReaderFromBytes(excelBytes) if err != nil { fmt.Printf("❌ 创建XLSX读取器失败: %v\n", err) return } fmt.Println("✓ 创建XLSX读取器成功") // 读取所有的sheets并转换为markdown格式 var allMarkdownTables strings.Builder allMarkdownTables.WriteString("以下是Excel表格的数据:\n\n") sheets, err := reader.GetSheetNames() if err != nil { fmt.Printf("❌ 获取工作表名称失败: %v\n", err) return } for _, sheetName := range sheets { fmt.Printf("\n========== 工作表: %s ==========\n", sheetName) data, err := reader.GetSheetData(sheetName) if err != nil { fmt.Printf("❌ 读取工作表失败: %v\n", err) continue } if len(data) == 0 { fmt.Println("⚠️ 工作表为空") continue } fmt.Printf("找到 %d 行数据\n", len(data)) // 转换为markdown格式 markdown := excel.ConvertToMarkdown(data) allMarkdownTables.WriteString(fmt.Sprintf("## 工作表: %s\n", sheetName)) allMarkdownTables.WriteString(markdown) allMarkdownTables.WriteString("\n\n") } fmt.Println("\n✅ 所有工作表已转换为Markdown格式!") // 读取quarterly1.txt的prompt promptBytes, err := os.ReadFile("./quarterly1.txt") if err != nil { fmt.Printf("❌ 读取quarterly1.txt失败: %v\n", err) return } prompt := string(promptBytes) // 合并prompt和markdown表格 finalPrompt := fmt.Sprintf("%s\n\n%s", prompt, allMarkdownTables.String()) // 尝试连接到不同的LLM提供商 var response *api.ChatResponse var llmErr error // 首先尝试Ollama fmt.Println("\n🔄 尝试连接到Ollama服务...") if ollamaClient := api.NewOllamaClient("http://localhost:11434", "qwen3.5:9b"); ollamaClient != nil { response, llmErr = ollamaClient.Chat([]api.ChatMessage{ {Role: "user", Content: finalPrompt}, }) if llmErr == nil { fmt.Println("✓ 成功使用Ollama生成响应") } else { fmt.Printf("⚠ Ollama调用失败: %v\n", llmErr) // 检查是否是连接问题 if strings.Contains(llmErr.Error(), "connection refused") || strings.Contains(llmErr.Error(), "404") { fmt.Println("💡 提示:Ollama服务可能未启动,或模型未安装") } } } fmt.Println("\n========== LLM生成的JSON ==========") // 解析LLM返回的响应,提取```json{内容}```中的JSON部分 parsedJSON := extractJSONFromResponse(response.Choices[0].Message.Content) fmt.Println(parsedJSON) fmt.Println("==================================") // 使用解析出的JSON调用税务健康API fmt.Println("\n🔄 正在使用解析的JSON调用税务健康API...") // 创建税务健康服务客户端 // 注意:这里需要替换为实际的用户ID和私钥 taxHealthService := api.NewTaxHealthService("1560142251348287489", "") // 将解析的JSON解析为map结构 var companyData map[string]interface{} if err := json.Unmarshal([]byte(parsedJSON), &companyData); err != nil { fmt.Printf("❌ 解析JSON数据失败: %v\n", err) return } // 构建税务评估请求 request := api.TaxEvalRequest{ ReqNo: fmt.Sprintf("REQ%v", time.Now().Unix()), // 使用时间戳生成请求号 Detail: api.TaxEvalDetail{ CompanyName: "企业名称", // 可以从数据中提取公司名称 Data: companyData, }, } // 调用税务健康API taxResponse, err := taxHealthService.EvaluateTaxHealth(request) if err != nil { fmt.Printf("❌ 调用税务健康API失败: %v\n", err) return } fmt.Println("\n========== 税务健康API反馈结果 ==========") fmt.Printf("API响应: %+v\n", taxResponse) fmt.Println("======================================") } // extractJSONFromResponse 从LLM响应中提取JSON内容 // 查找并提取 ```json {...} ``` 或 ``` {...} ``` 中的内容 func extractJSONFromResponse(response string) string { // 首先尝试匹配 ```json 开头的代码块 start := strings.Index(response, "```json") if start != -1 { start += 7 // 跳过 "```json" end := strings.Index(response[start:], "```") if end != -1 { jsonContent := strings.TrimSpace(response[start : start+end]) return jsonContent } } // 然后尝试匹配 ``` 开头的代码块(假设是JSON) start = strings.Index(response, "```") if start != -1 { start += 3 // 跳过 "```" end := strings.Index(response[start:], "```") if end != -1 { jsonContent := strings.TrimSpace(response[start : start+end]) // 检查是否看起来像JSON jsonContent = strings.TrimSpace(jsonContent) if strings.HasPrefix(jsonContent, "{") || strings.HasPrefix(jsonContent, "[") { return jsonContent } } } // 如果没有找到代码块,尝试直接解析整个响应是否为JSON response = strings.TrimSpace(response) if strings.HasPrefix(response, "{") && strings.HasSuffix(response, "}") || strings.HasPrefix(response, "[") && strings.HasSuffix(response, "]") { return response } // 如果以上都失败,返回原内容 return response }