// 将 raw fixture(各处理器原始 JSON)经 BuildReportFromRawSources 转化为与线上一致的完整报告 JSON。 // // go run ./cmd/qygl_report_build -in resources/dev-report/fixture.raw.example.json -out resources/dev-report/built.json // go run ./cmd/qygl_report_build -in raw.json -out - # 输出到 stdout package main import ( "encoding/json" "flag" "fmt" "log" "os" "tyapi-server/internal/domains/api/services/processors/qygl" ) type rawBundle struct { Kind string `json:"kind"` JiguangFull map[string]interface{} `json:"jiguangFull"` JudicialCertFull map[string]interface{} `json:"judicialCertFull"` EquityPanorama map[string]interface{} `json:"equityPanorama"` AnnualReport map[string]interface{} `json:"annualReport"` TaxViolation map[string]interface{} `json:"taxViolation"` TaxArrears map[string]interface{} `json:"taxArrears"` } func main() { inPath := flag.String("in", "", "raw fixture JSON 路径(含 jiguangFull 等字段,可参考 fixture.raw.example.json)") outPath := flag.String("out", "", "输出文件;- 或留空表示输出到 stdout") flag.Parse() if *inPath == "" { log.Fatal("请指定 -in ") } raw, err := os.ReadFile(*inPath) if err != nil { log.Fatalf("读取输入失败: %v", err) } var b rawBundle if err := json.Unmarshal(raw, &b); err != nil { log.Fatalf("解析 JSON 失败: %v", err) } if b.Kind == "full" { log.Fatal("输入为 kind=full(已是 build 结果),无需再转化;预览请用: go run ./cmd/qygl_report_preview") } if b.Kind != "" && b.Kind != "raw" { log.Fatalf("若填写 kind,仅支持 raw,当前: %q", b.Kind) } report := qygl.BuildReportFromRawSources( b.JiguangFull, b.JudicialCertFull, b.EquityPanorama, b.AnnualReport, b.TaxViolation, b.TaxArrears, ) out, err := json.MarshalIndent(report, "", " ") if err != nil { log.Fatalf("序列化报告失败: %v", err) } if *outPath == "" || *outPath == "-" { if _, err := os.Stdout.Write(append(out, '\n')); err != nil { log.Fatal(err) } return } if err := os.WriteFile(*outPath, append(out, '\n'), 0644); err != nil { log.Fatalf("写入失败: %v", err) } fmt.Fprintf(os.Stderr, "已写入 %s\n", *outPath) }