feat(barcode): 多条码管理(迁移 + GTIN 校验 + 后台/公开 API + 后台 UI) #5
Reference in New Issue
Block a user
Delete Branch "devin/1781934649-multi-barcode"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
背景
现有商品档案每个商品只有单一
gtin字段,且当前入库的样本都是国外(欧洲)条码。实际业务中同一件商品常有多个合法 GS1 条码:单品码(EAN-13/UPC)+ 整箱码(ITF-14/GTIN-14)、
不同规格/包装各自的码、进口品「原产国码 + 国内总代理 69x 码」、促销/捆绑装单独码等。
因此把「一个商品 → 多个条码」纳入数据模型。
按确认的两点约定:
本 PR 已完成(后端 + 迁移 + 校验)
迁移
migrations/0007_product_barcodeproduct.gtin保留为「主码」的反范式镜像,与is_primary行保持同步,公开 API/列表/旧调用方零改动。api/internal/gtin:GS1 GTIN-8/12/13/14 规范化——长度、mod-10 校验位、拒收非全球唯一号段;附单测(含中国 690 前缀通过、各类受限码被拒)。公开只读 API(
api/internal/store)GET /api/v1/products/barcode/{gtin}:任一条码(主码或附码)都能命中同一商品。barcodes数组(含 type/pack_level/region/is_primary)。q额外匹配任意条码。后台 store 层(
api/internal/adminstore)barcodes。AddBarcode/DeleteBarcode(删主码自动改选新主码并同步product.gtin)/SetPrimaryBarcode。ConflictError(带占用商品 id/名称),供后台「去重」提示。audit_log留痕(add_barcode / delete_barcode / set_primary_barcode)、来源manual、重算质量分。待办(按用户指示已暂停,未包含在本 PR)
POST/DELETE /api/products/{id}/barcodes、POST .../{barcodeID}/primary,及 409 去重响应。验证
go build ./...通过;go test ./internal/gtin/通过。更新:完成 API 接口 + 运营后台 UI + 公开站展示(本次提交)
此前分支仅含 store 层逻辑(迁移、GTIN 校验、AddBarcode/DeleteBarcode/SetPrimaryBarcode),缺少 HTTP 路由与前端,无法实际使用。现已补齐并端到端验证:
API(adminhandler)
POST /api/products/{id}/barcodes新增条码DELETE /api/products/{id}/barcodes/{barcodeID}删除(主条码删除后自动改选其一为主)POST /api/products/{id}/barcodes/{barcodeID}/primary设为主条码(镜像到product.gtin)409(返回冲突商品 id/name 供运营去重);非法 GTIN →400 invalid_gtin运营后台(admin-frontend)
公开站(public-frontend)
GET /products/barcode/{gtin}已支持按任一条码命中(store 层)验证:本地起 Postgres + 全量迁移 + admin/public 双服务,curl 跑通 新增/冲突409/非法400/设为主(镜像 product.gtin)/删除自动改选主,公开站按副条码命中;后台 UI 浏览器实测渲染与交互正常。Go
build/vet/test与前端tsc均通过。Wire the multi-barcode store layer to HTTP and the operator console: - adminhandler: add POST /products/{id}/barcodes, DELETE /products/{id}/barcodes/{barcodeID}, and POST .../primary. A barcode owned by another product returns 409 with the conflicting product (gtin/product_id/product_name); an invalid GTIN returns 400. - admin-frontend: BarcodesCard on the product detail page lists all barcodes (primary starred), adds with type/pack-level/region, sets primary, and deletes; audit labels for the new actions. - public-frontend: product detail surfaces non-primary barcodes so a case/region code resolves and is visible to consumers. Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>feat(barcode): 多条码管理(后端+迁移+GTIN校验,WIP)to feat(barcode): 多条码管理(迁移 + GTIN 校验 + 后台/公开 API + 后台 UI)