// compare-shop-specs 生成指定蝦皮店铺与关联 PDD 商品的只读规格对比报告。 // 它只执行 SELECT,没有写库或 --apply 功能。 package main import ( "encoding/json" "flag" "fmt" "log" "os" "strings" "time" "cmautobuy/admin/config" "cmautobuy/admin/repository" "cmautobuy/admin/service" ) func main() { shop := flag.String("shop", "", "要对比的蝦皮店铺名(精确匹配,必填)") output := flag.String("output", "", "可选:把 JSON 报告写入本机文件;不填则输出到终端") flag.Parse() if strings.TrimSpace(*shop) == "" { log.Fatal("必须通过 --shop 指定店铺名") } cfg, err := config.LoadDatabase() if err != nil { log.Fatalf("读取 MySQL 配置失败: %v", err) } db, err := repository.OpenMySQL(cfg) if err != nil { log.Fatalf("连接 MySQL 失败: %v", err) } defer db.Close() sources, err := repository.ListShopSpecSources(db, *shop) if err != nil { log.Fatal(err) } report := service.CompareShopSpecs(*shop, sources, time.Now()) raw, err := json.MarshalIndent(report, "", " ") if err != nil { log.Fatalf("生成 JSON 报告失败: %v", err) } raw = append(raw, '\n') if strings.TrimSpace(*output) == "" { fmt.Print(string(raw)) return } if err := os.WriteFile(*output, raw, 0o600); err != nil { log.Fatalf("写入本机报告失败: %v", err) } fmt.Printf("只读对比完成:%d 件商品,报告已写入 %s\n", report.Total, *output) }