Files
wasm-go/cmd/main.go
lychang 964f2f349a update
2026-05-21 04:01:00 +08:00

250 lines
7.7 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package main
import (
"encoding/json"
"fmt"
"os"
"strings"
"time"
prompt2 "wasm-go/internal/prompt"
"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格式!")
prompt := prompt2.TestPrompt
// 合并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("1554047490758508546", "00d502fcac7a2b0e227751cd6d8b0c725c55f71adcaccc6a50c4d63c73db6c8add")
// 将解析的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,
Period: "Q1",
Year: "2022",
},
}
// 调用税务健康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("======================================")
// 检查是否成功获取订单号
if taxResponse.Code != 200 || taxResponse.Data.OrderNo == "" {
fmt.Printf("❌ 税务健康API调用失败或未返回订单号: %+v\n", taxResponse)
return
}
orderNo := taxResponse.Data.OrderNo
fmt.Printf("\n🔄 获取到订单号: %s,开始轮询查询结果...\n", orderNo)
// 轮询查询结果,最多等待5分钟(60次 * 5秒)
maxAttempts := 60
attempt := 0
for attempt < maxAttempts {
// 查询税务评估结果
queryResponse, err := taxHealthService.QueryTaxEvalResult(orderNo)
fmt.Println(queryResponse)
if err != nil {
fmt.Printf("❌ 查询税务评估结果失败: %v\n", err)
return
}
fmt.Printf("\n========== 查询结果响应 ==========\n")
fmt.Printf("状态码: %d\n", queryResponse.Code)
fmt.Printf("消息: %s\n", queryResponse.Message)
fmt.Printf("订单状态: %d\n", queryResponse.Data.Status)
fmt.Printf("================================\n")
// 根据状态码判断处理结果
switch queryResponse.Data.Status {
case "执行成功": // 执行成功
fmt.Println("\n✅ 税务评估已完成!")
fmt.Printf("结果文件地址: %v\n", queryResponse.Data.Detail.Files)
// 如果有错误信息也显示
if queryResponse.Data.Detail.Error != "" {
fmt.Printf("警告信息: %s\n", queryResponse.Data.Detail.Error)
}
// 这里可以进一步处理结果文件,比如下载文件
for _, fileURL := range queryResponse.Data.Detail.Files {
fmt.Printf("文件URL: %s\n", fileURL)
// TODO: 实现文件下载逻辑
}
return // 完成任务,退出程序
case "正在执行": // 正在执行
fmt.Printf("⏳ 任务仍在处理中... (%d/%d)\n", attempt+1, maxAttempts)
time.Sleep(5 * time.Second) // 等待5秒后再次查询
attempt++
case "无效": // 无效订单
fmt.Printf("❌ 订单无效: %s\n", queryResponse.Data.Detail.Error)
return
case "执行失败": // 执行失败
fmt.Printf("❌ 任务执行失败: %s\n", queryResponse.Data.Detail.Error)
return
default:
fmt.Printf("⚠️ 未知状态码: %d\n", queryResponse.Data.Status)
time.Sleep(5 * time.Second)
attempt++
}
}
fmt.Println("\n⏰ 查询超时,建议稍后手动查询结果")
}
// 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
}