Project

General

Profile

Actions

缺陷 #4

open
RA

QA验收 #1: 会议管理与话题管理功能验收(含 Markdown/BFF 跨端验证)

[P1] 纪要预约NDB已创建记录但BFF因created_at无时区返回502

缺陷 #4: [P1] 纪要预约NDB已创建记录但BFF因created_at无时区返回502

Added by Redmine Admin about 1 month ago. Updated about 1 month ago.

Status:
新建
Priority:
普通
Assignee:
-
Start date:
10/07/2026
Due date:
% Done:

0%

Estimated time:

Description

纪要预约:NDB200但BFF因created_at无时区返回502

发现:2026-10-07 00:25,00:26独立干净临时库复现。父验收NDB #1;级别P1候选(阻断预约反馈,协调方决定修复路由)。现有业务库完全未使用。

环境与复现

独立PostgreSQL16 tmpfs 127.0.0.1:56488,ndb_qa/mp_conference_test;真实Backend18000与最新源码独立编译BFF13000,Notification仅本地mock13001。synthetic JWT/ApiApplication,不是真实微信认证;Backend保留仓库base USE_TZ=False,禁止读取.env。合成公司/联系人/项目,无合同;A已开始、0h、无人工纪要。

  1. 使用合成绑定用户 PUT /api/v2/meetings/1/minutes-subscription,Idempotency-Key=qa-a-minutes。
  2. NDB统一POST /internal/v1/meetings/1/registrations/ intent=minutes实际返回HTTP200。
  3. BFF返回HTTP502,error.code=NDB_CONTRACT_ERROR,“上游响应格式异常”。
  4. 使用合成AK签名GET NDB /internal/v1/meetings/1/registration/?client_contact_id=2,HTTP200;检查独立PG仍只有1个Registration、1个Task,未产生重复。

精确脱敏值与类型

字段 真实NDB值 JSON类型
id / meeting_id / client_contact_id / task_id 1 / 1 / 2 / 1 number(正整数)
attend_requested / minutes_requested false / true boolean
status reserved string
created_at 2026-10-07T00:26:08.883534 string,缺少Z或+08:00
task_status / charge_status / payment_status ongoing / unbilled / not_required string

DB状态:Registration.id=1、task_id=1、attend=false、minutes=true、内部status=confirmed(wire由序列化投影为reserved)。Task.id=1、status=ongoing、contract_id=null、charge_total_hours=0.0000、actual_price=0.00、total_price=0.00;合同数0。

原因证据

Backend api/meetings/serializers.py:99-134未给Registration.created_at声明带上海时区的字段,base.py USE_TZ=False,输出上述naive字符串。BFF src/ndb-client/meeting.adapter.ts:36要求 z.string().datetime({offset:true});实际字符串独立safeParse=false、Invalid ISO datetime。IDs、boolean、status均符合当前schema。

Backend serializer SHA256 611bc92ed9d1c5d84abd8318a50c9ae41232275a454cea0c5588831c0b1de958;BFF adapter SHA256 bae0ad5a83eb86faf95e6ffa21f2ab53656443da8c3442998f081e0ffd49140e;本次编译JS SHA256 1dc3e9afcfad80e884cbbc2d80159e5e75d7672a152ab1e4f8d78c744360deec。

修复与重测边界

QA不改业务源码,也不切USE_TZ=True以掩盖失败。协调方路由Backend/BFF确认正确兼容策略。修复后在新临时库重跑同幂等键PUT、GET权威状态、两个意图顺序及取消后保留Task,并再次核对数量,不能因客户端502直接认定NDB未写入。当前已做权威GET及数量快照;BFF同键重试尚未实测,不能声称完成。

证据:http-round2-results.json、http-integration-results.json(第3轮原始响应/快照)、http-backend.log。全部专用服务已停,容器已停,tmpfs合成数据已随停止消失;日志保留,无现有数据删除、真实邮件或生产操作。


Files

http-integration-results.json (4.87 KB) http-integration-results.json Redmine Admin, 10/06/2026 04:27 PM
http-contract-defect.md (3.04 KB) http-contract-defect.md Redmine Admin, 10/06/2026 04:27 PM
http-round4-case-results.md (15 KB) http-round4-case-results.md Redmine Admin, 10/06/2026 04:32 PM
http-integration-results.json (19.4 KB) http-integration-results.json Redmine Admin, 10/06/2026 04:32 PM
Actions

Also available in: PDF Atom