This commit is contained in:
lychang
2026-05-20 03:25:35 +08:00
parent 5e3dac3020
commit 7f5350db62
30 changed files with 3370 additions and 1752 deletions

188
cmd/main.go Normal file
View File

@@ -0,0 +1,188 @@
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
}