166 lines
4.2 KiB
Go
166 lines
4.2 KiB
Go
package main
|
||
|
||
import (
|
||
"bytes"
|
||
"encoding/json"
|
||
"fmt"
|
||
"io"
|
||
"mime/multipart"
|
||
"net/http"
|
||
"os"
|
||
"path/filepath"
|
||
)
|
||
|
||
// 测试发票申请通过的事件系统
|
||
func main() {
|
||
fmt.Println("🔍 开始测试发票事件系统...")
|
||
|
||
// 1. 首先获取待处理的发票申请列表
|
||
fmt.Println("\n📋 步骤1: 获取待处理的发票申请列表")
|
||
applications, err := getPendingApplications()
|
||
if err != nil {
|
||
fmt.Printf("❌ 获取申请列表失败: %v\n", err)
|
||
return
|
||
}
|
||
|
||
if len(applications) == 0 {
|
||
fmt.Println("⚠️ 没有待处理的发票申请")
|
||
return
|
||
}
|
||
|
||
// 选择第一个申请进行测试
|
||
application := applications[0]
|
||
fmt.Printf("✅ 找到申请: ID=%s, 公司=%s, 金额=%s\n",
|
||
application["id"], application["company_name"], application["amount"])
|
||
|
||
// 2. 创建一个测试PDF文件
|
||
fmt.Println("\n📄 步骤2: 创建测试PDF文件")
|
||
testFile, err := createTestPDF()
|
||
if err != nil {
|
||
fmt.Printf("❌ 创建测试文件失败: %v\n", err)
|
||
return
|
||
}
|
||
defer os.Remove(testFile)
|
||
|
||
// 3. 通过发票申请(上传文件)
|
||
fmt.Println("\n📤 步骤3: 通过发票申请并上传文件")
|
||
err = approveInvoiceApplication(application["id"].(string), testFile)
|
||
if err != nil {
|
||
fmt.Printf("❌ 通过申请失败: %v\n", err)
|
||
return
|
||
}
|
||
|
||
fmt.Println("✅ 发票申请通过成功!")
|
||
fmt.Println("📧 请检查日志中的邮件发送情况...")
|
||
}
|
||
|
||
// 获取待处理的发票申请列表
|
||
func getPendingApplications() ([]map[string]interface{}, error) {
|
||
url := "http://localhost:8080/api/v1/admin/invoices/pending"
|
||
|
||
resp, err := http.Get(url)
|
||
if err != nil {
|
||
return nil, err
|
||
}
|
||
defer resp.Body.Close()
|
||
|
||
body, err := io.ReadAll(resp.Body)
|
||
if err != nil {
|
||
return nil, err
|
||
}
|
||
|
||
var result map[string]interface{}
|
||
if err := json.Unmarshal(body, &result); err != nil {
|
||
return nil, err
|
||
}
|
||
|
||
if result["code"] != float64(200) {
|
||
return nil, fmt.Errorf("API返回错误: %s", result["message"])
|
||
}
|
||
|
||
data := result["data"].(map[string]interface{})
|
||
applications := data["applications"].([]interface{})
|
||
|
||
applicationsList := make([]map[string]interface{}, len(applications))
|
||
for i, app := range applications {
|
||
applicationsList[i] = app.(map[string]interface{})
|
||
}
|
||
|
||
return applicationsList, nil
|
||
}
|
||
|
||
// 创建测试PDF文件
|
||
func createTestPDF() (string, error) {
|
||
// 创建一个简单的PDF内容(这里只是示例)
|
||
pdfContent := []byte("%PDF-1.4\n1 0 obj\n<<\n/Type /Catalog\n/Pages 2 0 R\n>>\nendobj\n2 0 obj\n<<\n/Type /Pages\n/Kids [3 0 R]\n/Count 1\n>>\nendobj\n3 0 obj\n<<\n/Type /Page\n/Parent 2 0 R\n/MediaBox [0 0 612 792]\n/Contents 4 0 R\n>>\nendobj\n4 0 obj\n<<\n/Length 44\n>>\nstream\nBT\n/F1 12 Tf\n72 720 Td\n(Test Invoice) Tj\nET\nendstream\nendobj\nxref\n0 5\n0000000000 65535 f \n0000000009 00000 n \n0000000058 00000 n \n0000000115 00000 n \n0000000204 00000 n \ntrailer\n<<\n/Size 5\n/Root 1 0 R\n>>\nstartxref\n297\n%%EOF\n")
|
||
|
||
tempFile := filepath.Join(os.TempDir(), "test_invoice.pdf")
|
||
err := os.WriteFile(tempFile, pdfContent, 0644)
|
||
if err != nil {
|
||
return "", err
|
||
}
|
||
|
||
return tempFile, nil
|
||
}
|
||
|
||
// 通过发票申请
|
||
func approveInvoiceApplication(applicationID, filePath string) error {
|
||
url := fmt.Sprintf("http://localhost:8080/api/v1/admin/invoices/%s/approve", applicationID)
|
||
|
||
// 创建multipart表单
|
||
var buf bytes.Buffer
|
||
writer := multipart.NewWriter(&buf)
|
||
|
||
// 添加文件
|
||
file, err := os.Open(filePath)
|
||
if err != nil {
|
||
return err
|
||
}
|
||
defer file.Close()
|
||
|
||
part, err := writer.CreateFormFile("file", "test_invoice.pdf")
|
||
if err != nil {
|
||
return err
|
||
}
|
||
|
||
_, err = io.Copy(part, file)
|
||
if err != nil {
|
||
return err
|
||
}
|
||
|
||
// 添加备注
|
||
writer.WriteField("admin_notes", "测试通过 - 调试事件系统")
|
||
|
||
writer.Close()
|
||
|
||
// 发送请求
|
||
req, err := http.NewRequest("POST", url, &buf)
|
||
if err != nil {
|
||
return err
|
||
}
|
||
|
||
req.Header.Set("Content-Type", writer.FormDataContentType())
|
||
|
||
client := &http.Client{}
|
||
resp, err := client.Do(req)
|
||
if err != nil {
|
||
return err
|
||
}
|
||
defer resp.Body.Close()
|
||
|
||
body, err := io.ReadAll(resp.Body)
|
||
if err != nil {
|
||
return err
|
||
}
|
||
|
||
var result map[string]interface{}
|
||
if err := json.Unmarshal(body, &result); err != nil {
|
||
return err
|
||
}
|
||
|
||
if result["code"] != float64(200) {
|
||
return fmt.Errorf("API返回错误: %s", result["message"])
|
||
}
|
||
|
||
return nil
|
||
} |