Files
order_site/apps/backend
yml2213 40ee36d72a fix(consignment): 修复寄卖取消解绑、SUB 单号写空、拼单门禁与后台工单列表实时乱跳
1. 问题单处置「取消」后打手信息不消失:resolveProblemWorkOrder 的取消分支从未解绑寄卖现货,现货永久停在 consumed 占库不还,工单 material 上的寄售标记残留又让列表继续显示「供货打手」。取消时补上解绑;调用必须排在状态 UPDATE 之前——那条 UPDATE 会清空 friend_added_at,清完再解绑会把已确认加好友的货误判成可回池(二次出货);
2. 解绑函数在没有现货可解绑时直接 return,跳过了摘标记,于是「库存行早已不存在」的老帖永远摘不掉寄售标记(列表一直显示供货打手)。现在无论是否解绑到现货都摘标记,痕迹保留在 material.consignmentHistory 的 detachReason 里;
3. 内部现货履约写入的 sourceSubmissionNo 恒为空:取的是占库 `UPDATE ... RETURNING *` 的行,只带回本表列,没有 join 出来的 submission_no,导致工单列表把所有寄卖单都显示成「老单无提报单号」,SUB 单号这个唯一锚点丢失。改取带 join 的预读库存(内部现货资料、指派工单资料、指派事件留痕三处)。存量老单按业务口径不回填;
4. 后台接单工单列表实时乱跳:SSE 快照补丁按数组下标读 queryKey,面板 key 加了字段后下标全错(page 被读成 targetWorkOrderId → 任何页都被当成第 1 页),且完全没判「内部寄售匹配」等筛选,于是任意一条不在当前页的老单只要发生变更就被插到列表顶部。改为结构化 queryKey + 三态判定(match 才允许插顶、mismatch 才允许移除、其余只原地更新),插入还要求 page===1 且工单 id 大于当前首行;状态比对改用 rawStatus(快照的 status 是运营态,拼单母单会被显示成 in_progress),分类筛选因快照不带 parentCategoryId 归入不可证伪;
5. 新增「寄卖只做整单」硬门禁:已有人参与的拼单工单不参与现货匹配与库存提醒,履约入口一律返回 work_order_sharing_not_consignable,前端「手动匹配寄卖」入口按同一口径收敛;开了拼单但无人参与的整单不受影响,避免过度拦截。

验证:后端 520 项单测(517 pass / 3 skip)、前端 78 项全绿;并对真实开发库跑通问题单取消三类场景(老帖无库存行 / 回库 / 已加好友作废)、退回打手与退回大厅的反向用例(不得解绑)、履约写入真实 SUB 单号、拼单门禁四入口 + 未过度拦截反向用例。
2026-10-01 12:17:00 +08:00
..
2026-05-25 22:27:11 +08:00
2026-08-23 12:54:38 +08:00

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 起 增量变更

规则:

  1. 已应用的迁移文件禁止改内容。
  2. 结构变更只新增文件,不回写 001_init.sql。
  3. 启动时自动执行未应用迁移;记录在 schema_migrations。
  4. 文件名必须为 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.log
  • data/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 复制后填写。