把「配置 → 待办 → 确认履约 → 扣额度 → 写成本快照」整条链路打通, 客服点一下就完成履约,不需要填复杂的东西。 积分钱包(P1.3): - platform-credit-service.ts:充值 / 调整 / 消耗 / 流水查询。 - 三平台积分互不通用,每客服每平台一个账户;余额只能由流水产生, 消耗不足直接拒绝(409),不允许负余额,与备用金口径一致。 - 换算率按平台:南航、乐玩 1 积分 = 1 分,ROCK 1 积分 = 1 元。 - 充值 / 调整只对 admin/operator/finance 开放;客服只能看自己的钱包。 - 备用金现金不在这里,走现有 fund_* 链路。 确认履约(P1.4): - manual-fulfillment-service.ts:待办列表 + 确认履约。 - 待办口径:order_items.fulfillment_mode='manual' 且已配 fulfillment_config_id。 人工单**不建 fulfillment_tasks**——那是自动发货通道的体系,人工单历来不走它 (本地 102,955 个人工单的任务行数为 0)。 - 「已履约」判定:该订单项存在有效 manual_case 成本快照。 - 固定成本(消耗积分 > 0)→ 零输入;成本不固定(= 0)→ 只填实际成本金额。 - 确认时:积分平台扣积分钱包、备用金现金走 writeFundExpense, 随后写 actual 成本快照(主体 = 积分流水 id 或备用金支出单 id)。 - 渠道与消耗积分永远提前配好,客服不选;重复履约直接拒绝。 前端: - 新增「人工履约」页(客服菜单):待确认 / 已履约 / 全部,确认履约弹窗。 - 备用金页新增「平台积分」Tab(客服端与管理端各一份): 余额卡片、积分流水、管理员充值与调整。 E2E 实测:配置 ROCK 100 积分 → 成本 ¥100.00(1 积分 = 1 元);充值 5000 积分 = ¥5000;确认履约后积分 5000 → 4900,成本快照 actual ¥100.00 写入; 重复履约被拒绝。测试数据已清理,登记表保留 357 条扫描结果供运营使用。 校验:后端 765 项 / 0 失败,前端 143 项全通过(含 tsc -b 与 build)。 Co-Authored-By: Claude Opus 4.5 (1M context) <noreply@anthropic.com>
order-site-backend
快手轻量后端:订单入库、履约任务编排、91 卡券 / kuaishou-cloud / kuaishou-feifei / 行业电子凭证对接、后台管理接口,以及数据库迁移。
快速启动
npm install
cp ../../.env.mac-docker.example ../../.env
npm run dev
推荐优先用仓库根目录 Docker 开发环境(含 PostgreSQL 与 Caddy)。
生产构建:
npm run build
npm run start
常用验证:
npm run typecheck
npm run build
npm test
配置
环境变量来自工作区根目录 .env:
- 默认值:
src/config/defaults.ts - 覆盖:根目录
.env
常用项:
| 变量 | 说明 |
|---|---|
PORT |
服务端口(Compose 中常由 BACKEND_PORT 映射) |
LOG_LEVEL |
debug / info / warn / error |
LOG_MAX_FILE_SIZE_MB |
单个应用日志文件大小上限,默认 20 MB,超出后轮转 |
LOG_MAX_FILES |
同一日期最多保留的日志文件数量,默认 5(含当前文件) |
LOG_RETENTION_DAYS |
日志日期保留天数,默认 30 |
DATABASE_URL |
PostgreSQL 连接串 |
ADMIN_SESSION_SECRET |
后台登录态签名密钥 |
ADMIN_DEFAULT_USERS_JSON |
默认后台用户 |
KAQUAN91_USER_ID / KAQUAN91_SECRET |
91 卡券凭据 |
接口
| 路径 | 说明 |
|---|---|
GET /health |
健康检查 |
GET /health/live |
存活 |
GET /health/ready |
就绪 |
/api/v1/open/91/* |
91 卡券开放接口 |
/api/v1/open/kuaishou-industry/* |
快手行业电子凭证 |
/api/v1/open/kuaishou-feifei/* |
发货平台 feifei 回调等 |
/api/v1/claim/* |
领取页接口 |
/api/v1/admin/* |
后台管理 |
/s/* |
短链跳转 |
目录
| 路径 | 职责 |
|---|---|
src/index.ts |
服务入口 |
src/app.ts |
Express 组装 |
src/routes |
API 路由 |
src/services/order |
订单与任务同步 |
src/services/fulfillment |
履约路由与执行器 |
src/services/platforms |
外部平台实现 |
src/services/admin |
后台读写与配置 |
src/repositories |
数据库访问 |
src/db/migrations |
SQL 迁移 |
数据库迁移
策略:001 基线 + 后续渐进增量。
| 文件 | 作用 |
|---|---|
src/db/migrations/001_init.sql |
空库完整基线结构 |
src/db/migrations/002_*.sql 起 |
增量变更 |
规则:
- 已应用的迁移文件禁止改内容。
- 结构变更只新增文件,不回写
001_init.sql。 - 启动时自动执行未应用迁移;记录在
schema_migrations。 - 文件名必须为
NNN_name.sql(三位序号)。
命令:
# 对齐状态
npm run db:migrate:status
# 手动 up
npm run db:migrate
# 创建下一份增量(生成 00N_xxx.sql 模板)
npm run db:migrate:create -- add_something
创建后编辑 SQL,与业务代码一并提交。Docker 开发环境示例:
docker compose -f ../../docker-compose.dev.yml exec -T backend npm run db:migrate:create -- add_something
docker compose -f ../../docker-compose.dev.yml exec -T backend npm run db:migrate
Docker 开发
开发 Compose 会挂载源码:
postgres提供开发库- 后端启动时安装依赖并
npm run dev - 改
src/或.env通常不必重建镜像
需要重建 backend 镜像的情况:
deploy/docker/backend*.Dockerfile变更- Node 版本或系统依赖变更
package.json/package-lock.json变更
运行产物
日志默认:
data/logs/app-YYYY-MM-DD.logdata/logs/integration-YYYY-MM-DD.log
按天切分并按大小轮转,默认单文件 20MB、单日最多 5 个分片、保留 30 天。成功的 GET/HEAD 请求以 DEBUG 记录,生产默认 LOG_LEVEL=info 不落盘;写请求和所有 4xx/5xx 仍保留 access log。成功的 /health* 探活默认不写 access log。
data/*.json 为本地运行配置,可能含敏感信息,默认不提交;请从 *.example.json 复制后填写。