189 lines
5.5 KiB
Go
189 lines
5.5 KiB
Go
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
|
||
}
|