bypos-collector: 移除硬编码 sdogid、添加重试、补全 CSV 导出、增加测试
CI / Go (api) (pull_request) Failing after 1s
CI / Python (ingestion) (pull_request) Failing after 0s
CI / Migrations (postgres) (pull_request) Failing after 2s

改进内容:
- sdogid 不再硬编码,优先从 $BYPOS_SDOGID 环境变量读取,其次 -sdogid 参数,
  也可在 Web 控制台输入框填写;三者都未设时启动警告、采集报错
- 网络错误自动重试(最多 3 次,指数退避 500ms/1s/2s)
- Web 控制台采集参数区增加 sdogid 输入框
- CSV 导出补全 retmsg 和 source 两列
- 新增 Go 单元测试(ean13Check、md5hex、sanitizeBarcodes、resolveSdogID 等)
- README 更新配置说明

Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
This commit is contained in:
ceyhandagdas51272
2026-06-24 03:10:09 +00:00
parent 8f9a03a929
commit 21c895a008
5 changed files with 171 additions and 17 deletions
+7 -6
View File
@@ -20,15 +20,16 @@ import (
//go:embed web/*
var webFS embed.FS
var collector = NewCollector("")
var collector *Collector
func main() {
addr := flag.String("addr", "127.0.0.1:8765", "本地监听地址")
noOpen := flag.Bool("no-open", false, "不自动打开浏览器")
sdog := flag.String("sdogid", "", "中心库账号 id(默认使用内置值)")
sdog := flag.String("sdogid", "", "中心库账号 id(优先读 $BYPOS_SDOGID 环境变量)")
flag.Parse()
if *sdog != "" {
collector.sdogID = *sdog
collector = NewCollector(*sdog)
if collector.sdogID == "" {
log.Println("警告: 未配置 sdogid,请通过 $BYPOS_SDOGID 环境变量、-sdogid 参数或控制台输入框指定")
}
sub, _ := fs.Sub(webFS, "web")
@@ -143,14 +144,14 @@ func handleExportCSV(w http.ResponseWriter, r *http.Request) {
w.Header().Set("Content-Disposition", "attachment; filename=products.csv")
w.Write([]byte{0xEF, 0xBB, 0xBF}) // UTF-8 BOM so Excel reads Chinese correctly
cw := csv.NewWriter(w)
cw.Write([]string{"barcode", "name", "spec", "unit", "area", "manufacturer", "license", "in_price", "sell_price", "status", "fetched_at"})
cw.Write([]string{"barcode", "name", "spec", "unit", "area", "manufacturer", "license", "in_price", "sell_price", "status", "retmsg", "fetched_at", "source"})
dec := json.NewDecoder(f)
for {
var p Product
if err := dec.Decode(&p); err != nil {
break
}
cw.Write([]string{p.Barcode, p.Name, p.Spec, p.Unit, p.Area, p.Manufacturer, p.License, p.InPrice, p.SellPrice, p.Status, p.FetchedAt})
cw.Write([]string{p.Barcode, p.Name, p.Spec, p.Unit, p.Area, p.Manufacturer, p.License, p.InPrice, p.SellPrice, p.Status, p.RetMsg, p.FetchedAt, p.Source})
}
cw.Flush()
}