依据义父 2026-09-30 最新口令:prod 的商品/订单按测试数据对待,只要已上线 C 端不受损即可清理;
但执行须先完成本盘点(#320),再制定清理方案(#321),不得直接DROP goods/DROP retail_products。
>
取证方法:以miniprogram-v3(唯一活跃 + 唯一提审 C 端)实际代码为权威,grep 全仓/api/miniapp/*
调用点(file:line 取证),反查 backend/app/routers 路由与 SQL 表。不靠猜。
| 接口(C 端真实调用) | C 端调用点 | 后端 router | 依赖表 / 字段 |
|---|---|---|---|
POST /api/miniapp/auth/login | auth/login.ts:12,25 | auth.router | users / user_identities |
GET /api/miniapp/auth/me | login.ts:82 | auth.router | users |
GET /api/miniapp/user/footprints | status-timeline.ts, journey.ts | miniapp_user | 用户足迹 |
GET /api/miniapp/products | dsl-sources.ts:17, sel-routes.ts | miniapp_products.py | packages / package_components / site_config(default_leader) |
GET /api/miniapp/products/featured | sel-routes.ts | miniapp_products.py | packages |
GET /api/miniapp/products/{id} | product-detail.ts | miniapp_products.py | packages |
GET /api/miniapp/packages | destination.ts, vouchers.ts | packages.py | packages |
GET /api/miniapp/orders | dsl-sources.ts, orders.ts | miniapp_orders.py | orders / order_items / packages·goods(snapshot) |
GET /api/miniapp/orders/{id} | order-detail.ts | miniapp_orders.py | orders / order_items |
POST /api/miniapp/orders | pay.ts:66 | miniapp_orders.py | orders / order_items / goods(单品) 或 packages(套餐) |
POST /api/miniapp/orders/{id}/pay | pay.ts:34 | miniapp_orders.py / miniapp_pay | orders / wxpay |
POST /api/miniapp/orders/{id}/review | reviews.ts, review.ts | miniapp_orders.py | orders |
GET /api/miniapp/reviews | reviews.ts | miniapp_reviews | reviews |
GET/POST /api/miniapp/messages* | messages.ts | miniapp_messages | messages |
GET /api/miniapp/guides | dsl-sources/local/content-library/sel-routes/selection | guides | guides |
GET /api/miniapp/guides/{id} | content-article.ts | guides | guides |
GET /api/miniapp/guides/categories | content-library.ts | guides | guides |
GET/POST /api/miniapp/distribution* | distribution.ts, share-code.ts | miniapp_distribution | distribution |
GET /api/miniapp/weather/today | dsl-sources/today-card/sel-header | weather | weather |
GET /api/miniapp/calendar/upcoming | today-card.ts | calendar | calendar |
GET /api/miniapp/recommendations/combo-cards | dsl-sources.ts | recommendations | recommendations |
GET /api/miniapp/content/items | content-config.ts:58, texts.ts:973 | content | content_items(含 shop.items 配置键) |
GET /api/miniapp/redemption-codes | profile/order-detail/redemption-code | miniapp_redemption | redemption_codes |
GET /api/miniapp/redemption-codes/{codeNo} | redemption-code.ts | miniapp_redemption | redemption_codes |
GET /api/miniapp/hotel/room-types | hotel-booking.ts:58 | hotel.c_router | 住宿房型 |
POST /api/miniapp/hotel/bookings | hotel-booking.ts:180 | hotel.c_router | orders(order_type=room) / hotel |
GET /api/miniapp/hotel/orders/{id}/charges | hotel-booking.ts:227 | hotel | 住宿账单 |
POST /api/miniapp/hotel/charges/{id}/prepay | hotel-booking.ts:232 | hotel | 住宿账单 / wxpay |
GET/POST /api/miniapp/voice-guide* | voice-guide.ts, guide-companion.ts | miniapp_voice_guide | voice_guide |
POST /api/miniapp/feedback | feedback.ts:72 | miniapp_feedback | feedback |
DELETE /api/miniapp/privacy/me | privacy-notice.ts | privacy | 用户隐私 |
GET /api/miniapp/merchants/{mid}/presentation | merchant-store.ts | miniapp_merchants | 商户页 |
GET /api/miniapp/merchant-pages/{mid} | merchant-store.ts | miniapp_merchant_pages | merchant_pages |
⚠️ C 端零调用(死端点):/api/miniapp/retail/*(miniapp_retail.router,main.py:184 挂载)——
全仓miniapp-v3grepretail无任何匹配;该端点仅存在于 router 定义 + main.py 挂载 + 旧设计文档,
真实小程序 UI 从未接线。属小齐 2026-09-28 设计、未落地。
商品域实际有三套结构,C 端使用情况如下:
| 结构 | C 端是否使用 | 证据 | 结论 |
|---|---|---|---|
packages(套餐/线路) | ✅ 是(双入口) | /api/miniapp/products(miniapp_products.py:104→FROM packages)+ /api/miniapp/packages(packages.py:14,95→FROM packages) | 必须保留(含 package_components) |
goods(风物/单品) | ✅ 是(交易锁价) | item-detail.ts 取 goodsId(来自 shop.items 配置)→ _create_goods_order(miniapp_orders.py:518)→ SELECT * FROM goods WHERE id AND status='active'(:537)锁价,落 order_type='retail' | 必须保留(风物在线支付链路锁价表) |
retail_products | ❌ 否(仅 A 端) | miniprogram-v3 零 retail 引用;仅 A 端 /api/admin/retail-products(admin_retail.py + admin_backend.py:1122)使用 | **表保留(A 端 admin 用);其 C 端端点 /api/miniapp/retail/* 是死代码** |
shop.items(配置键) | ✅ 是(展示) | loadContent(['shop.items']) → content_items 表(shop.ts:99, item-detail.ts:80) | 非独立表,属 content_items |
关键结论(纠正"两套都保留"的笼统说法):
goods 与 retail_products。取证后二者并不冗余、不互斥:goods 服务 C 端风物交易(下单锁价);retail_products 服务 A 端 admin 商品管理(bobo 2026-09-30 新建能力)。DROP 其中任何一张表:goods 是 C 端契约依赖;retail_products 是 A 端管理依赖。packages + goods;retail_products 因 A 端仍用而保留,但其 **C 端死端点 /api/miniapp/retail/* 可下线(不动表)**。/api/miniapp/retail/*)。packages + package_components(套餐列表/详情/下单/支付前置);goods(风物锁价)。orders + order_items(创建 / 查询 / 支付 / 评价 / 取消)。content_items(shop.items 等 C 端展示配置);site_config.default_leader(products 映射依赖)。BASE_URL 对应路由:miniapp_products / packages / miniapp_orders / miniapp_pay / guides / content / redemption / hotel.c_router 等均已 main.py 挂载(107–217 行逐一确认)。/api/admin/retail-products(retail_products 表)、/api/admin/goods/*(admin_goods.router)、/api/admin/orders(admin 干预)。| 类别 | 对象 | 处置建议 | 风险 |
|---|---|---|---|
| 死代码(C 端零调用) | /api/miniapp/retail/* 整条 C 端零售购买域(miniapp_retail.router + retail.miniapp_router) | 下线端点(保留 retail.console_router 给 A 端) | 低:C 端无调用;但需确认无定时任务/内部调用 |
| 冗余但活 | /api/miniapp/products 与 /api/miniapp/packages 双入口读 packages | 收敛为单入口(不急) | 中:需改 C 端调用点 |
| 测试数据(新口令允许删) | goods / retail_products / orders / order_items 中的测试行 | 先备份 → 再删 → 回归 C 端;按 is_test / 已知测试单号筛选 | 中:须保证不误删真实/上线关联行 |
| 临时资产 | 临时镜像 kailash-staging-app:fix638、临时容器、/tmp/be638 | 删(已在"可清理"清单) | 低 |
| 冗余迁移说明 | 合并引入的 106/108 撞号(保留为已知债,非删) | 本项不删(按纪律留债) | — |
/api/miniapp/products + 风物下单 _create_goods_order + 订单查询)。/api/miniapp/retail/* C 端端点),保留 retail.console_router 给 A 端。goods(C端风物) 与 retail_products(A端admin) 各司其职,无重合可合并,故默认两套都保留、仅清 C 端死端点。本盘点仅输出"必须保留"清单,未做任何删改。所有清理动作待 #321 方案 + 义父确认后执行。