Change GET /api/admin/v1/yeeke-returns to return one row per yeeke_return_item joined with its parent package, with a placeholder row (hasItem:false) for packages that have no items. Add GET /yeeke-returns/shops (distinct sorted shop names) and GET /yeeke-returns/items/:itemId (item + parent package + sibling items) as static-prefixed routes registered before the /:packageId wildcard so they are not swallowed by it. Shop filter is now an exact match instead of a partial LIKE. Remove trackingNo/itemCount from the list projection while keeping them on package detail. Update the admin web list to item-level rows (reference image column, 店铺 dropdown sourced from /shops) and retitle the detail drawer to "退货商品详情", switching it to the item-detail endpoint for real rows and the existing package-detail endpoint for placeholder rows. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01NTDbDcwbDw1TSAcE6wfh2F
149 lines
10 KiB
Go
149 lines
10 KiB
Go
package access
|
|
|
|
// RolePurchaser is the fixed role key used by the GoAuto purchaser account.
|
|
const RolePurchaser = "purchaser"
|
|
|
|
// APIPermission describes one admin API known to GoAuto. Purchaser marks the
|
|
// APIs that the purchaser role may call; every other API remains admin-only.
|
|
type APIPermission struct {
|
|
Title string
|
|
Path string
|
|
Method string
|
|
Purchaser bool
|
|
}
|
|
|
|
// AdminAPIs is the auditable permission matrix for GoAuto's authenticated
|
|
// admin surface. Agent APIs are intentionally excluded from management roles.
|
|
var AdminAPIs = []APIPermission{
|
|
{"查看设备", "/api/admin/v1/devices", "GET", true},
|
|
{"停用设备", "/api/admin/v1/devices/:deviceId/disable", "POST", false},
|
|
{"吊销设备令牌", "/api/admin/v1/devices/:deviceId/token/revoke", "POST", false},
|
|
{"查看 Agent 版本", "/api/admin/v1/agent-app-releases", "GET", false},
|
|
{"上传 Agent APK", "/api/admin/v1/agent-app-releases", "POST", false},
|
|
{"设置当前 Agent 版本", "/api/admin/v1/agent-app-releases/current", "PUT", false},
|
|
{"下载 Agent APK", "/api/admin/v1/agent-app-releases/:releaseId/download", "GET", false},
|
|
|
|
{"查看 PDD 商品", "/api/admin/v1/pdd-products", "GET", true},
|
|
{"新增 PDD 商品", "/api/admin/v1/pdd-products", "POST", true},
|
|
{"查看 PDD 商品详情", "/api/admin/v1/pdd-products/:productId", "GET", true},
|
|
{"查看 PDD 关联 SYB 商品", "/api/admin/v1/pdd-products/:productId/related-syb-products", "GET", true},
|
|
{"修改 PDD 商品", "/api/admin/v1/pdd-products/:productId", "PATCH", true},
|
|
{"查看 PDD 商品替换记录", "/api/admin/v1/pdd-product-replacements", "GET", true},
|
|
{"查看 PDD 商品替换详情", "/api/admin/v1/pdd-product-replacements/:replacementId", "GET", true},
|
|
|
|
{"查看虾皮商品", "/api/admin/v1/shopee-products", "GET", true},
|
|
{"新增虾皮商品", "/api/admin/v1/shopee-products", "POST", true},
|
|
{"批量删除虾皮商品", "/api/admin/v1/shopee-products/batch-delete", "POST", true},
|
|
{"查看虾皮商品详情", "/api/admin/v1/shopee-products/:productId", "GET", true},
|
|
{"修改虾皮商品", "/api/admin/v1/shopee-products/:productId", "PATCH", true},
|
|
{"关联 PDD 商品", "/api/admin/v1/shopee-products/:productId/link-pdd", "POST", true},
|
|
{"恢复虾皮商品", "/api/admin/v1/shopee-products/:productId/restore", "POST", true},
|
|
{"新增虾皮规格值", "/api/admin/v1/shopee-products/:productId/specs/values", "POST", true},
|
|
{"删除虾皮规格值", "/api/admin/v1/shopee-products/:productId/specs/values", "DELETE", true},
|
|
{"设置规格映射", "/api/admin/v1/shopee-products/:productId/specs/mapping", "PUT", true},
|
|
{"清除规格映射", "/api/admin/v1/shopee-products/:productId/specs/mapping", "DELETE", true},
|
|
{"确认规格映射", "/api/admin/v1/shopee-products/:productId/specs/mapping/confirm", "POST", true},
|
|
{"确认精确规格映射", "/api/admin/v1/shopee-products/:productId/specs/mapping/confirm-exact-matches", "POST", true},
|
|
{"预览尺码匹配", "/api/admin/v1/shopee-products/:productId/specs/mapping/preview-auto-size", "POST", true},
|
|
{"AI 建议颜色映射", "/api/admin/v1/shopee-products/:productId/specs/mapping/suggest-colors", "POST", true},
|
|
{"AI 建议尺码映射", "/api/admin/v1/shopee-products/:productId/specs/mapping/suggest-sizes", "POST", true},
|
|
{"一键匹配并确认颜色尺码", "/api/admin/v1/shopee-products/:productId/specs/mapping/auto-match", "POST", true},
|
|
{"手动执行虾皮规格自动匹配", "/api/admin/v1/shopee-spec-auto-match/runs", "POST", false},
|
|
{"查看最近虾皮规格自动匹配", "/api/admin/v1/shopee-spec-auto-match/runs/latest", "GET", false},
|
|
|
|
{"查看 SYB 商品", "/api/admin/v1/syb-products", "GET", true},
|
|
{"查看 SYB 商品详情", "/api/admin/v1/syb-products/:productId", "GET", true},
|
|
{"重新解析 SYB 商品", "/api/admin/v1/syb-products/:productId/reparse", "POST", true},
|
|
{"批量重新解析 SYB 商品", "/api/admin/v1/syb-products/reparse-batch", "POST", true},
|
|
{"人工修正 SYB 商品", "/api/admin/v1/syb-products/:productId/correction", "PATCH", true},
|
|
{"手动同步 SYB 商品", "/api/admin/v1/syb-products/import", "POST", true},
|
|
{"查看 SYB 同步记录", "/api/admin/v1/syb-products/sync-runs", "GET", true},
|
|
{"查看 SYB 同步详情", "/api/admin/v1/syb-products/sync-runs/:runId", "GET", true},
|
|
|
|
{"查看档口入库码", "/api/admin/v1/syb-inner-codes", "GET", true},
|
|
{"查看档口入库码详情", "/api/admin/v1/syb-inner-codes/:recordId", "GET", true},
|
|
{"导入档口入库码", "/api/admin/v1/syb-inner-codes/import", "POST", true},
|
|
{"批量删除档口入库码", "/api/admin/v1/syb-inner-codes/batch-delete", "POST", true},
|
|
{"查看档口入库码匹配进度", "/api/admin/v1/syb-inner-codes/match-jobs/:jobId", "GET", true},
|
|
{"预检档口入库码回写", "/api/admin/v1/syb-inner-codes/apply-preview", "POST", true},
|
|
{"提交档口入库码回写", "/api/admin/v1/syb-inner-codes/apply", "POST", true},
|
|
{"查看档口入库码回写批次", "/api/admin/v1/syb-inner-codes/apply-batches/:batchId", "GET", true},
|
|
{"复核档口入库码", "/api/admin/v1/syb-inner-codes/:recordId/recheck", "POST", true},
|
|
{"重新匹配档口入库码", "/api/admin/v1/syb-inner-codes/rematch", "POST", true},
|
|
|
|
{"查看 SYB 店铺", "/api/admin/v1/syb-shops", "GET", true},
|
|
{"新增 SYB 店铺", "/api/admin/v1/syb-shops", "POST", false},
|
|
{"修改 SYB 店铺名称", "/api/admin/v1/syb-shops/:shopId/name", "PATCH", false},
|
|
{"启停 SYB 店铺", "/api/admin/v1/syb-shops/:shopId/enabled", "PATCH", false},
|
|
{"删除 SYB 店铺", "/api/admin/v1/syb-shops/:shopId", "DELETE", false},
|
|
{"从 SYB 发现店铺", "/api/admin/v1/syb-shops/discover", "POST", false},
|
|
{"查看 SYB 商品过滤", "/api/admin/v1/syb-product-filters", "GET", true},
|
|
{"新增 SYB 商品过滤", "/api/admin/v1/syb-product-filters", "POST", false},
|
|
{"启停 SYB 商品过滤", "/api/admin/v1/syb-product-filters/:filterId/enabled", "PATCH", false},
|
|
{"删除 SYB 商品过滤", "/api/admin/v1/syb-product-filters/:filterId", "DELETE", false},
|
|
|
|
{"查看采集规则模板", "/api/admin/v1/collection-rules/templates/:templateId", "GET", true},
|
|
{"查看采集规则", "/api/admin/v1/collection-rules", "GET", true},
|
|
{"新增采集规则", "/api/admin/v1/collection-rules", "POST", false},
|
|
{"修改采集规则", "/api/admin/v1/collection-rules/:ruleId", "PATCH", false},
|
|
{"删除采集规则", "/api/admin/v1/collection-rules/:ruleId", "DELETE", false},
|
|
|
|
{"查看采购规则", "/api/admin/v1/purchase-rules", "GET", false},
|
|
{"查看当前采购规则", "/api/admin/v1/purchase-rules/current", "GET", false},
|
|
{"新增采购规则", "/api/admin/v1/purchase-rules", "POST", false},
|
|
{"修改采购规则", "/api/admin/v1/purchase-rules/:ruleId", "PATCH", false},
|
|
{"删除采购规则", "/api/admin/v1/purchase-rules/:ruleId", "DELETE", false},
|
|
{"设置当前采购规则", "/api/admin/v1/purchase-rules/current", "PUT", false},
|
|
|
|
{"查看采集任务", "/api/admin/v1/collection-tasks", "GET", true},
|
|
{"创建采集任务", "/api/admin/v1/collection-tasks", "POST", true},
|
|
{"批量创建采集任务", "/api/admin/v1/collection-tasks/batch", "POST", true},
|
|
{"批量创建图搜采集任务", "/api/admin/v1/collection-tasks/image-search/batch", "POST", true},
|
|
{"查看采集任务详情", "/api/admin/v1/collection-tasks/:taskId", "GET", true},
|
|
{"重置采集任务", "/api/admin/v1/collection-tasks/:taskId/reset", "POST", true},
|
|
{"取消采集任务", "/api/admin/v1/collection-tasks/:taskId/cancel", "POST", true},
|
|
{"批量取消采集任务", "/api/admin/v1/collection-tasks/batch-cancel", "POST", true},
|
|
{"删除采集任务", "/api/admin/v1/collection-tasks/:taskId", "DELETE", true},
|
|
|
|
{"查看采购任务", "/api/admin/v1/purchase-tasks", "GET", true},
|
|
{"预检批量采购", "/api/admin/v1/purchase-tasks/batch-preview", "POST", true},
|
|
{"批量 AI 匹配采购规格", "/api/admin/v1/purchase-tasks/batch-spec-match", "POST", true},
|
|
{"批量创建采购任务", "/api/admin/v1/purchase-tasks/batch", "POST", true},
|
|
{"批量重试采购任务", "/api/admin/v1/purchase-tasks/batch-retry", "POST", true},
|
|
{"回填SYB采购单号", "/api/admin/v1/purchase-tasks/syb-order-writeback", "POST", true},
|
|
{"创建备货采购任务", "/api/admin/v1/purchase-tasks/stock", "POST", true},
|
|
{"查看采购任务详情", "/api/admin/v1/purchase-tasks/:taskId", "GET", true},
|
|
{"创建采购任务", "/api/admin/v1/purchase-tasks", "POST", true},
|
|
{"处理采购规格", "/api/admin/v1/purchase-tasks/:taskId/spec-decision", "POST", true},
|
|
{"查看采购规格匹配", "/api/admin/v1/purchase-tasks/:taskId/matching", "GET", true},
|
|
{"重新尝试采购规格匹配", "/api/admin/v1/purchase-tasks/:taskId/matching/requeue", "POST", true},
|
|
{"人工选择采购规格", "/api/admin/v1/purchase-tasks/:taskId/matching/manual", "POST", true},
|
|
{"授权重新采购", "/api/admin/v1/purchase-tasks/:taskId/authorize-repurchase", "POST", true},
|
|
{"复核支付状态", "/api/admin/v1/purchase-tasks/:taskId/payment-review", "POST", true},
|
|
{"选择回填候选", "/api/admin/v1/purchase-tasks/:taskId/writeback-candidate", "POST", true},
|
|
{"取消采购任务", "/api/admin/v1/purchase-tasks/:taskId/cancel", "POST", true},
|
|
{"处理结果不明确任务", "/api/admin/v1/purchase-tasks/:taskId/resolve-unknown", "POST", true},
|
|
|
|
{"查看 yeeke 退货包裹列表", "/api/admin/v1/yeeke-returns", "GET", true},
|
|
{"查看 yeeke 退货店铺列表", "/api/admin/v1/yeeke-returns/shops", "GET", true},
|
|
{"查看 yeeke 退货商品详情", "/api/admin/v1/yeeke-returns/items/:itemId", "GET", true},
|
|
{"查看 yeeke 退货包裹详情", "/api/admin/v1/yeeke-returns/:packageId", "GET", true},
|
|
{"查看 yeeke 同步记录", "/api/admin/v1/yeeke-returns/sync-runs", "GET", true},
|
|
{"查看 yeeke 同步详情", "/api/admin/v1/yeeke-returns/sync-runs/:runId", "GET", true},
|
|
{"手动触发 yeeke 同步", "/api/admin/v1/yeeke-returns/sync", "POST", true},
|
|
|
|
{"查看 AI 匹配状态", "/api/admin/v1/ai-matching-settings", "GET", true},
|
|
{"保存 AI 匹配设置", "/api/admin/v1/ai-matching-settings", "PUT", false},
|
|
{"测试 AI 服务连接", "/api/admin/v1/ai-matching-settings/test", "POST", false},
|
|
}
|
|
|
|
func PurchaserAPIs() []APIPermission {
|
|
result := make([]APIPermission, 0, len(AdminAPIs))
|
|
for _, permission := range AdminAPIs {
|
|
if permission.Purchaser {
|
|
result = append(result, permission)
|
|
}
|
|
}
|
|
return result
|
|
}
|