QA验收 #13
openCNB #102 专家费支付中状态|测试环境验收
0%
Description
关联 CNB:https://cnb.cool/mindsetech/NDB/backend/-/issues/102
范围:支付中状态、支付快照冻结、编辑删除锁定、完成与撤回、批量原子性、权限和客户收款回归。
环境:仅 https://tcrm.mindsetech.com 与 https://tcrm-api.mindsetech.com;版本待发布后核实。
禁止:生产、真实付款、真实企微审批及修改真实业务记录。使用唯一 QA102 标记的合成测试数据。
QA 每条执行用例追加结果与证据并重新读取验证;真实测试环境图文手册另行归档与 UI/项目复核。
当前状态:发布准备;尚未执行测试环境验收。
RA Updated by Redmine Admin 21 days ago
QA准备记录(非正式测试轮次,无Pass计数):已建立本任务唯一ego-browser Space32/p1,测试站已有Rex Linn管理员登录态,无需读取凭据;未重新登录,财务专用及低权限角色未验证。已准备23项计划矩阵,覆盖processing锁/CRUD和Task会议旁路、冻结主体、时间/原因、批量原子及混态、权限、旧路径、导出和客户收费回归;计划位于outputs/issue-102-20261021/qa/qa-preparation-plan.md。正式执行将仅经测试UI/API创建唯一QA102标记合成数据,严禁真实记录/角色修改、DB直写、真实付款、企微审批及生产操作。本轮未创建业务数据、未执行正式用例、未写两仓源码或手册。等待Ops部署版本/迁移证据及统筹正式释放;缺财务/低权限账号或安全fixture入口时如实Blocked。
RA Updated by Redmine Admin 21 days ago
- Subtask #14 added
RA Updated by Redmine Admin 21 days ago
#102 QA R1 — 2026-10-21 11:15 Asia/Shanghai¶
环境:仅 https://tcrm.mindsetech.com 与 https://tcrm-api.mindsetech.com。角色:服务端确认管理员。QA:原责任会话,Space32/p1。
候选:BE1.20.5b1 / FE2.16.4-beta.1。Ops回传0027已应用及测试DB/ES/Redis隔离;QA未直连数据库。正式23项矩阵 1 Pass / 0 Fail / 22 Blocked / 0 Skipped。另增加前置检查FIXTURE-01:Fail,关联缺陷#14。全部记录合计24项:1 Pass / 1 Fail / 22 Blocked。不能宣称#102通过。
直接证据¶
- 2026-10-21T03:13:04Z:GET测试API
/v1/version/返回1.20.5b1;测试Web无缓存根页引用/assets/index-eTCpaj2l.js,HTTP200;其登录模块/assets/login-Cqi2v3b1.jsHTTP200,版本2.16.4-beta.1。随后已刷新p1加载当前候选。 - GET
/v1/accounts/user-profile/code200,当前账号id2,roles包含admin;未记录token或登录材料。 - 唯一run标记
QA102-20261021-R1-06857c5e。已建公司8、专家574235、付款主体A=5/B=6。均合成,无联系方式;主体账户为明确NONPAYABLE文本,不是真实付款账户。保留,不清理。 - 首次专家请求的可选gender=unknown被code400拒绝;后续省略该字段创建成功。这是QA fixture参数修正,不算产品失败或新增Pass。
- 11:14,POST
/v1/tasks/quick-create:company_id8,expert_id574235,pm_id2、pa_id2,新project/requirement/industry_subject均带run标记。返回HTML,解析报Unexpected token '<'。未保存原HTTP状态,不断言500;未重试该写请求。 - 后续只读GET
/v1/projects?company_id=8&keyword=QA102-20261021-R1-06857c5e与/v1/tasks?keyword=QA102-20261021-R1-06857c5e均code200、results为空、total_counts0。未创建cost,未改变任何支付状态。 - 静态候选:
api/companies/models.py:382-398无有效合同返回None;api/projects/serializers.py:174-185直接读取其字段;这是可能根因,不替代运行日志证据。快捷创建事务路径位于api/projects/views.py:774。
逐条矩阵¶
共同前提:已核版本、仅test管理员、本run合成对象;除ENV与FIXTURE外,下表未发送业务验证请求。共同阻塞B1:未获得可用合成Task/cost,且原fixture授权不含合同创建;不借用旧真实合同/Task。执行时间同本轮标题。
| 编号 | 用例/操作与预期 | 层级 | 实际/证据 | 状态 |
|---|---|---|---|---|
| QA102-ENV-01 | 直接读取两端实际版本,应匹配收据 | 环境/浏览器 | BE1.20.5b1、FE2.16.4-beta.1,资产HTTP200;0027为Ops证据 | Pass |
| QA102-CAP-01 | 管理员列表/详情能力与状态一致 | API/页面 | B1;仅角色已确认,未验证成本capability | Blocked |
| QA102-CAP-02 | 低权限无状态写能力,服务端拒绝 | API/页面 | B1;本轮未切账号/验证低权限角色 | Blocked |
| QA102-START-01 | 专家费开始支付,冻结快照且Task仍未付 | API/页面 | B1;开始支付请求未发送 | Blocked |
| QA102-START-02 | 缺失/脱敏快照或主体应拒绝且零改变 | API | B1;未执行 | Blocked |
| QA102-START-03 | 非专家成本不得进入processing | API | B1;未执行 | Blocked |
| QA102-LOCK-01 | processing成本金额/币种/归属/元数据编辑及删除拒绝 | API/页面 | B1;未执行 | Blocked |
| QA102-LOCK-02 | Task关键写/快编/返回/重算受锁,非关键例外保留状态 | API/页面 | B1;未执行 | Blocked |
| QA102-LOCK-03 | 会议安全旁路不能重结算锁定成本 | API/页面 | B1;另无已确认不通知的会议fixture | Blocked |
| QA102-LOCK-04 | 新建其他未付成本不改变旧冻结快照 | API | B1;未执行 | Blocked |
| QA102-FINISH-01 | 完成必须时间,不能替换冻结付款主体 | API/页面 | B1;未执行 | Blocked |
| QA102-FINISH-02 | 完成保留快照、清优先标记、正确汇总Task | API/页面 | B1;未执行 | Blocked |
| QA102-WITHDRAW-01 | 必填撤回原因,清元数据并有审计 | API/页面 | B1;未执行 | Blocked |
| QA102-BATCH-01 | 全processing不同主体批量完成保留各快照 | API/页面 | B1;未执行 | Blocked |
| QA102-BATCH-02 | 混态批量在弹窗前拒绝 | 页面 | B1;未执行;按钮可点为既知非阻断优化,未改判 | Blocked |
| QA102-BATCH-03 | 非法/错归属/已删除合成对象使批量全成全败 | API | B1;未执行,无旧真实ID探测 | Blocked |
| QA102-RACE-01 | 两请求有限并发后状态一致无部分更新 | API | B1;0轮并发,无请求 | Blocked |
| QA102-LEGACY-01 | 原未付→已付及取消支付路径兼容 | API/页面 | B1;未执行 | Blocked |
| QA102-EXPORT-01 | 合成主档改变后导出仍使用冻结快照 | 导出 | B1;未改主档、未导出 | Blocked |
| QA102-COLLECT-01 | 支付中客户收费仅窄字段TaskPUT,无costPUT | API/页面 | B1;未执行 | Blocked |
| QA102-COLLECT-02 | 发票/金额/账期无旁路改变 | API/页面 | B1;未执行任何开票动作 | Blocked |
| QA102-REFRESH-01 | 刷新后状态/锁/能力一致 | 页面/API | B1;无可观察支付记录 | Blocked |
| QA102-MANUAL-01 | 当前候选完整复现并截图、UI/项目复核 | 手册 | 关键流程未执行,无通过流程截图,待两项复核 | Blocked |
| QA102-FIXTURE-01(新增前置) | 合成无合同公司快速建Task应成功或结构化报前提 | API | 返回HTML;限定run回查项目/Task均0;缺陷#14 | Fail |
下一步与边界¶
需要Backend/统筹确认:是否提供或授权创建仅本合成公司的最小无通知有效合同fixture,以及必要字段和公开API;同时核对快捷创建错误的运行日志。无需重新申请原支付测试包。未作产品修复;不自动扩大合同/会议范围。
手册路径已获准,但仅能记录Blocked与实际证据,不编造操作流程或截图;UI/项目完整复核尚未开展。Space32保留给续测与复核。
未操作生产、真实业务记录、真实付款、审批、回调、feedback、外部通知、DB/ES/队列直写;未创建账号/改角色;未commit/push/部署。两仓均release/issues-100-101-staging,保留BE原.aoci/config.json和FE旧100101手册/图片。仅QA输出及指定#102手册可写。
RA Updated by Redmine Admin 21 days ago
QA R2进行中(未结案):按统筹明确payload仅公司8单次创建合同12,HTTP200/Content-Type application/json/code200;GET合同列表读回id12 active=true。满足前置后quick-create成功:project88/89、requirement23/24、Task125/126;均仅本轮合成对象,Task is_recorded=false。新成本23/24专家费、25缺收款信息专家费、26非专家成本。#14保留原失败历史;本次是补足合同前置后成功,不代表源码已修复。管理员API已观察:START-01开始processing冻结主体5/6且paid_at为空;START-02缺主体/收款信息拒绝;START-03非expert拒绝;LOCK-01金额/币种/收款信息/归属/状态/付款元数据/删除拒绝且读回成本完全不变;FINISH-01缺时间及替换主体拒绝;FINISH-02不同主体批量完成后快照保留、priority=false,Task125因其他未付成本仍unpaid而Task126全成本付清为paid;BATCH-01成功;BATCH-03错Task归属/混合无效批次拒绝且cost23不变;LEGACY-01直接付款及取消成功;WITHDRAW-01空白原因拒绝、非空原因撤回后主体/时间清空、解除锁。均测试API,未真实付款/通知。Web已实际开始支付和撤回Task126成本24,真实截图采集进行中。脚本round-04对只读expert_payment_hours要求报错的断言已纠正:接口code200但GET仍null,未落库,不是产品Fail。低权限唯一test候选经bw在内存读取后认证HTTP400(未打印凭据、未换其他凭据),CAP-02暂Blocked;不阻断管理员其余项。剩余UI/并发/导出/手册继续,正式23项最终状态待本轮收束,不覆盖R1。
RA Updated by Redmine Admin 21 days ago
R2 已固化检查点 — 2026-10-21 11:23 Asia/Shanghai¶
关联Redmine#13 journal131;不是最终结案。候选BE1.20.5b1/FE2.16.4-beta.1,仅test管理员、本run合成对象。
23项中,目前可完整独立断言 10 Pass / 0 Fail / 1 Blocked / 12 待完成(ENV沿用同一候选R1证据,不重跑)。
| 编号 | 状态 | 操作/预期与实际证据 |
|---|---|---|
| ENV-01 | Pass | 两端实际版本匹配,沿用R1证据 |
| START-01 | Pass | 成本23/24开始支付后processing/locked=true、冻结主体5/6、paid_at空;Task仍unpaid |
| START-03 | Pass | 非expert成本26进入processing被INVALID_PAYMENT_TRANSITION拒绝 |
| LOCK-01 | Pass | 成本23关键字段及删除全拒绝,前后GET完全一致 |
| LOCK-04 | Pass | 成本24processing时新建未付成本27成功,原记录GET完全一致 |
| FINISH-01 | Pass | 完成缺时间、替换冻结主体被拒绝,记录未改变 |
| FINISH-02 | Pass | 时间/快照/priority及全部有效成本付清汇总均读回符合预期 |
| BATCH-01 | Pass | 成本23/24不同主体同时完成,分别保留5/6 |
| RACE-01 | Pass | 2轮各2请求,竞争结果和终态元数据一致;无重试 |
| LEGACY-01 | Pass | 成本24直接未付→已付及取消支付成功 |
| CAP-02 | Blocked | 唯一低权限候选认证HTTP400,未核实角色,未改账号或换凭据重试 |
其余12项:CAP-01、START-02(缺失已测,脱敏字段待补)、LOCK-02(API已测,快编/页面待补)、LOCK-03(安全会议fixture待确认)、WITHDRAW-01(API和UI已测,审计读回待补)、BATCH-02(页面混态弹窗前已拦,证据待补)、BATCH-03(错归属/混合无效已测,已删除对象边界待补)、EXPORT-01、COLLECT-01(页面成功/成本不变,请求数量证据待补)、COLLECT-02、REFRESH-01、MANUAL-01。
完整脱敏接口证据见r2-evidence-checkpoint.json,确切对象ID见r2-manifest.json;执行脚本round-03至06不可重放。没有关键产品失败;round-04只读字段断言误设已在round-05以GET未改变纠正。
手册:已采集且目视检查3张局部清晰真实截图(撤回原因、开始确认、完成时间/冻结主体),完成支付确认和结果截图、核心流程按文复现尚待完成;随后可交UI/项目只读审。旧Blocked手册尚待替换,不冒称通过。
RA Updated by Redmine Admin 21 days ago
- Subtask #15 added
RA Updated by Redmine Admin 21 days ago
#102 QA R2 最终状态 — 2026-10-21 11:32 Asia/Shanghai¶
环境:仅测试tcrm/tcrm-api;QA原责任会话,ego-browser Space32/p1。候选BE1.20.5b1、FE2.16.4-beta.1,QA已直接核实;0027和DB/ES/Redis隔离为Ops收据,未直连DB。
23项:19 Pass / 1 Fail / 3 Blocked / 0 Skipped,无pending。全量QA未通过。
R1受阻记录#13 journal130、R2阶段记录journal131/132保留,不覆盖历史。#14为无合同快捷建Task错误;本轮补足获准合同12后绕过前置续测,不表示错误处理已修复。本轮新增实际失败:导出缺陷#15,属于#13子缺陷。
前提与数据¶
管理员角色由自有profile确认;其余角色尚未验证。唯一合成标记QA102-20261021-R1-06857c5e沿用,不因轮次R2重建公司。公司8、专家574235、付款主体5/6、合同12、项目88/89、Task125/126、成本23–28、专家支付主档11均仅本任务合成对象。Task不录制、无自动会议、无联系人、无真实附件/签约/审批/通知/付款。仅成本28为删除边界专建后经公开API移除,其他保留;不是清理历史数据。
逐条最终表¶
共同执行前提:上述测试候选、管理员、本run合成对象。证据A=r2-evidence-checkpoint.json,证据B=r2-evidence-final.json;确切归属见r2-manifest.json;脚本round-03至08不可重放。下表操作足以结合脚本复现,响应只保留脱敏摘要。
| 编号 | 用例/层级 | 操作与预期 | 实际结果 | 状态 | 证据/缺陷 |
|---|---|---|---|---|---|
| QA102-ENV-01 | 版本门禁/环境 | 读取两端实际版本,应符合Ops收据 | BE1.20.5b1、FE2.16.4-beta.1;沿用同候选R1直接证据,未重复轮询 | Pass | R1直接版本/资产HTTP200 |
| QA102-CAP-01 | 管理员能力/API与页面 | unpaid专家可开始,processing只可完成/撤回,状态能力一致 | 成本23/24 allowed transitions符合状态;页面24开始/完成/撤回与API一致,27支付中无删除按钮 | Pass | A.START-01;B.UICompletion;截图06/07 |
| QA102-CAP-02 | 低权限拒绝/API | 同一test候选认证后核角色并验证无转换能力 | HTTP400/code400,无token;未验证角色。首次message未保留,不能猜为invalidcredentials。只读确认请求契约为非空username/password且构造符合;未再认证或换凭据 | Blocked | B.lowPrivilege;证据缺口明确,不要求用户现在处理 |
| QA102-START-01 | 开始支付/API与页面 | 23/24开始支付后冻结主体、无paid_at、Task仍未付 | processing、locked=true、主体5/6、paid_at空,页面实际开始成功 | Pass | A.round04;UI截图03 |
| QA102-START-02 | 不完整/脱敏资料拒绝/API | 缺付款主体、缺收款方式、脱敏值写回均不得成功 | PAYMENT_SNAPSHOT_INCOMPLETE;拒绝后成本GET完全一致 | Pass | A.START-02、B.START-02-supplement |
| QA102-START-03 | 非expert限制/API | 非专家成本26不能开始支付 | INVALID_PAYMENT_TRANSITION,保持unpaid | Pass | A.START-03 |
| QA102-LOCK-01 | 成本CRUD锁/API | 支付中23改金额/币种/收款/归属/状态/付款元数据及删除应拒绝 | PAYMENT_LOCKED,拒绝前后GET完全一致 | Pass | A.LOCK-01 |
| QA102-LOCK-02 | Task/快编保护/API与页面 | 关键字段不可变;非关键Task memo保留原状态;快编不能发关键写 | API状态/时长/专家等拒绝;Task关键控件disabled;快编推荐背景保存后零写请求;memo API保存保持finished。Task DELETE本身不支持,未把405当支付专用guard | Pass | A.LOCK-02、B.LOCK-02-UI;会议路径另列Blocked |
| QA102-LOCK-03 | 会议重结算旁路/API与页面 | 仅无通知安全会议fixture可执行 | 当前仅quick-task安全链,未建立经确认无通知的会议结算fixture;未调用会议创建/通知/结算 | Blocked | 本轮授权安全边界,不用mock/真实会议代替 |
| QA102-LOCK-04 | 新成本与主档独立/API | processing时新增未付成本、修改合成主档不能改旧快照 | 24processing时新增27成功,24前后GET完全一致;25冻结后主档11编辑/读回成功,未将主档锁死 | Pass | A.round06;B.EXPORT-01前置;导出值另Fail |
| QA102-FINISH-01 | 时间/主体约束/API与页面 | 无时间拒绝,不得替换冻结主体 | INVALID_PAYMENT_TRANSITION / PAYMENT_LOCKED,成本不变;页面展示时间和冻结主体 | Pass | A.round05;截图04 |
| QA102-FINISH-02 | 完成与Task汇总/API与页面 | 时间正确、快照保留、priority=false,仅全部有效成本付清汇总paid | 23/24批量后主体5/6不变、时间保存、priority=false;Task125有未付仍unpaid、126全付时paid;UI24完成刷新一致 | Pass | A.FINISH-02、B.UICompletion |
| QA102-WITHDRAW-01 | 撤回原因/清理/审计/API与页面 | 空白原因拒绝;非空撤回清时间/主体、保留审计 | 空白拒绝;24撤回后unpaid/locked=false/主体和时间空;审计7461记录原因与processing→unpaid | Pass | A.WITHDRAW-01、B.withdrawalAudit、截图02(仅确认前填写) |
| QA102-BATCH-01 | 不同主体批量/API | 23/24同时完成应分别保留主体 | code200、各自读回5/6,无交叉替换 | Pass | A.BATCH-01 |
| QA102-BATCH-02 | 混态批量/UI | 选unpaid25及processing24点击完成,应在弹窗前拒绝 | 可点完成菜单,但未打开确认弹窗(visible dialogs0),未执行提交;既知按钮可点优化不列失败 | Pass | B.mixedBatchUI;不虚称有该步网络计数 |
| QA102-BATCH-03 | 归属/无效/已删除原子性/API | 错Task归属、混合无效或删除对象批量不得部分写 | 错归属INVALID_PAYMENT_TRANSITION;23+25缺资料拒绝且23不变;25+已移除28拒绝且25不变 | Pass | A.BATCH-03、B.BATCH-03-supplement |
| QA102-RACE-01 | 有限竞争/API | 两轮各2请求,不能产生部分锁/矛盾元数据 | 开始vs金额:开始成功、编辑PAYMENT_LOCKED;完成vs撤回仅一个成功,终态unpaid且时间/主体空 | Pass | A.round06,2轮共4请求,无自动重试 |
| QA102-LEGACY-01 | 旧付款路径/API | 24直接未付→已付及取消仍可用 | 均code200,实际时间/主体读回正确 | Pass | A.LEGACY-01 |
| QA102-EXPORT-01 | 冻结快照导出/公开导出API | 主档11变更后导出仅成本24/25,冻结值不得被主档补写 | POST /v1/finances/export返回HTTP500;145字节HTML Server Error (500),非xlsx。未重试,冻结导出内容无法判定 | Fail | B.EXPORT-01;缺陷#15 |
| QA102-COLLECT-01 | 客户收费独立/UI与API | 同一合成Task窄收费保存只发一个TaskPUT、零costPUT | 126收费123→124成功;跨导航仅PUT /v1/tasks/126一次、costPUT0,成本GET完全一致 | Pass | B.collectionNetwork;不使用首次丢失内存日志作计数证据 |
| QA102-COLLECT-02 | 收费/发票状态无旁路/API | 安全memo编辑不改变账单/开票/账期/支付/收费金额字段 | 所列11字段前后完全一致;未调用开票/回款/审批 | Pass | B.COLLECT-02;不代表开票业务端到端通过 |
| QA102-REFRESH-01 | 刷新一致性/UI/API | 24完成后reload应保留状态、时间、主体及相应动作 | API paid/11:24/主体6;reload页面已支付/同时间/原主体,显示取消付款而非开始 | Pass | B.UICompletion,截图06/07 |
| QA102-MANUAL-01 | 正式手册与复核 | 同候选截图、完整按文复现、UI/项目审核完成才通过 | 核心路径真实操作成功,5张引用截图、首轮三方意见已统一修订;定向复核及最终按文复现未全部完成,另导出仍Fail | Blocked | 指定正式手册路径;不以局部正确升级全量通过 |
导出失败原响应¶
r2-frozen-export.xlsx是失败响应的历史文件名,实际为145字节HTML,不是有效工作簿;标题Server Error (500),非ZIP。SHA256 fd62a53afdd49595ccd111b6ac06466a1690e7c8da4aeb0e884b5e0f4e937624。不把文件下载成功当作导出成功,不读取或宣称不存在的单元格结果。
手册定向复核交接¶
路径:projects/ndb/frontend/docs/user-manual/issue-102-payment-processing.md;图片目录同路径下assets/issue-102-payment-processing/。
UI/Web首轮认为核心流程/按钮一致,Backend首轮认为状态/冻结/撤回/收费独立/汇总规则正确。已一次修订:R2轮次、Task号与成本号和多成本定位、实际时间填写/选择及核对、图2证据边界、角色尚未验证、Task备注按原权限可改但支付中成本memo不可改;补同Task上下文图及状态放大图。待三方定向复核,不冒称已最终通过。
边界与后续¶
不再导出、不修源码、不部署。Backend/Ops已由统筹分派只读定位#15;修复候选后另轮重测。低权限HTTP400保持Blocked(缺确切message,不推断凭据一定失效);安全会议fixture不可得保持Blocked,不为凑Pass扩数据或触发通知。无需重复申请原测试包。
保留所有本轮合成对象及manifest供复现;临时负例成本28已移除,恢复入口未验证。其他记录不清理。无prod/真实付款/审批/通知/DB直写/源码修改/分支切换/commit/push/部署。两仓release/issues-100-101-staging,原BE配置dirty与旧100101手册/图保留。
RA Updated by Redmine Admin 21 days ago
#102 QA R3 — 完整时间前置下的冻结导出专项¶
时间:2026-10-21 11:34 Asia/Shanghai。环境:仅tcrm/tcrm-api,BE1.20.5b1/FE2.16.4-beta.1,管理员,原Space32。本轮仅新增执行EXPORT-01的前置修正专项,不重复此前19条Pass。
原失败与根因¶
R2的EXPORT-01 Fail 原样保留于#13 journal134及缺陷#15,未修改旧结果、未关闭缺陷。Ops通过统筹确认同请求11:29:44运行栈:AttributeError NoneType.strftime,api/finance/excel_exports.py:1879 expert_template。Backend确认旧b98已有该行,#102未改;swift缺失本身不会抛此异常。原始Ops本地证据路径待其最终报告,当前明确标为Ops确认,而非QA独立读取日志。
QA限定GET确认Task125、126的started_at/ended_at原均null,is_recorded=false。与运行栈一致。
合法前置修正与操作¶
- 初态:Task125成本25 processing、23 unpaid、26 unpaid。Task126仍保持原数据,不改其空时间。
- 成本25通过正式payment-status API撤回为unpaid,原因
QA102 R3 withdraw to complete synthetic Task timestamps before new freeze export test;code200。 - GET确认Task125全部有效成本均非processing后,正常PUT
/v1/tasks/125补started_at=2026-10-21T10:00:00、ended_at=2026-10-21T11:00:00、duration60、is_recorded=false;code200并GET读回一致。未绕锁、未DB写、无自动会议/通知。 - 仅合成专家574235的收款主档11设SWIFT=
QA102-R3-BEFORE。成本23/25均在未锁状态通过正常成本API保存指向主档11的对公测试快照,刻意不带SWIFT;账户QA102-NONPAYABLE-EXPORT,无联系方式,金额分别100/10 RMB。 - 分别正常开始支付冻结,主体5,均code200且快照SWIFT缺失。再正常完成成本23,paid_at=
2026-10-21T11:00:00;成本25保持processing。 - 只把同一合成主档11的SWIFT改为
QA102-R3-AFTER并GET确认;两个成本快照仍缺SWIFT。 - 单次POST
/v1/finances/export,body={"export_method":"export_ids","export_type":"expert","finance_ids":[23,25]},HTTP200,获得有效xlsx。不是原[24,25]空时间请求的盲重试。 - 撤回审计GET读回id7469、Task125/成本25、processing→unpaid、上述R3原因。
实际单元格证据¶
只读ZIP/XML检查下载文件,未修改或重写工作簿;脚本inspect-r3-export.mjs。文件3行(1表头+2目标数据行):
| 单元格 | 实际值 | 判定意义 |
|---|---|---|
| J1 | SWIFT/IBAN | 待验证列 |
| B2 / B3 | 125 / 125 | 同一获准合成Task |
| W2 / W3 | 574235 / 574235 | 本轮合成专家 |
| L2 / Q2 | 10 / 支付中 | 对应成本25 |
| L3 / Q3 | 100 / 已支付 | 对应成本23 |
| R2 / R3 | 2026-10-21 10:00 | 正常完整前置时间 |
| J2 / J3 | 空 / 空 | 冻结后未从主档补写SWIFT |
| T2 / T3 | 空 / 2026-10-21 11:00 | processing与paid付款时间正确区分 |
整个工作簿XML不含QA102-R3-BEFORE或QA102-R3-AFTER。结合主档GET已确认AFTER,说明paid和processing两条冻结记录均未回退主档补写缺失值。
文件r3-frozen-export.xlsx:6412字节;SHA256 ee1b9b261e4cf080ed08b0d6b0e4510c5c031b16a4de56e9cac7c9bc8d751963。这是实际测试服务导出,不是本地生成或mock;未检查Excel客户端视觉排版,不把本次内容断言扩展成排版验收。
QA102-EXPORT-01(R3完整时间前置):Pass。 前置缺陷#15仍为未修复历史失败,不宣称原空时间请求已通过。
23项最新证据状态(不是23条重跑)¶
最新覆盖为 20 Pass / 0 Fail / 3 Blocked,但R2历史仍为19 Pass / 1 Fail / 3 Blocked,#15开放;完整交付/生产门禁未通过。沿用项的操作、预期及实际证据参见r2-final-results.md,本轮只替换最新EXPORT-01证据归属,不更改旧表。
| 编号 | 最新状态 | 证据轮次 |
|---|---|---|
| QA102-ENV-01 | Pass | R1同候选版本证据 |
| QA102-CAP-01 | Pass | R2 |
| QA102-CAP-02 | Blocked | R2:test候选认证HTTP400/code400,message未保留,未再认证 |
| QA102-START-01 | Pass | R2 |
| QA102-START-02 | Pass | R2 |
| QA102-START-03 | Pass | R2 |
| QA102-LOCK-01 | Pass | R2 |
| QA102-LOCK-02 | Pass | R2 |
| QA102-LOCK-03 | Blocked | R2:无已确认不通知的会议fixture |
| QA102-LOCK-04 | Pass | R2 |
| QA102-FINISH-01 | Pass | R2 |
| QA102-FINISH-02 | Pass | R2 |
| QA102-WITHDRAW-01 | Pass | R2 |
| QA102-BATCH-01 | Pass | R2 |
| QA102-BATCH-02 | Pass | R2 |
| QA102-BATCH-03 | Pass | R2 |
| QA102-RACE-01 | Pass | R2 |
| QA102-LEGACY-01 | Pass | R2 |
| QA102-EXPORT-01 | Pass | R3完整时间前置;R2 Fail/#15保留 |
| QA102-COLLECT-01 | Pass | R2 |
| QA102-COLLECT-02 | Pass | R2 |
| QA102-REFRESH-01 | Pass | R2 |
| QA102-MANUAL-01 | Blocked | 核心R2手册已修订,定向复核/最终按文复现未全部完成 |
无源码修改、提交、推送、部署、真实付款、审批、外部通知或DB直写。保留本轮对象、旧响应和新工作簿供复现。
RA Updated by Redmine Admin 21 days ago
#102 测试结果最终交接 — 2026-10-21 11:39 Asia/Shanghai¶
仅测试tcrm/tcrm-api;实际候选BE1.20.5b1、FE2.16.4-beta.1,0027为Ops已应用收据。QA原canonical CLI责任会话。只交付测试结果,不表示要修旧缺陷或已允许生产发布。
结论与历史边界¶
23项按最新独立证据 21 Pass / 0 Fail / 2 Blocked / 0 Skipped,没有pending。不是23项重跑:R2的19项Pass沿用,R3补EXPORT-01,最终补MANUAL-01。
- R2:19 Pass / 1 Fail / 3 Blocked,#13 journal134原样保留。EXPORT-01空开始时间HTTP500,关联#15,未修复或关闭。
- R3冻结导出:完整时间前置下Pass,#13 journal136;不是覆盖旧Fail,详见
r3-frozen-export-results.md及实际工作簿。 - 最终按文核心手册:本次Pass,三方内容/截图复核均通过;不受其他未测用例牵连,但不豁免完整QA/生产门禁。
- 仍Blocked:CAP-02(低权限test候选HTTP400,角色尚未验证);LOCK-03(未取得确认不通知的安全会议fixture)。不要求用户现在配合,不造账号/会议凑Pass。
最终23项索引¶
操作/预期/实际/证据详见R2最终表及R3补充,以下只更新最新状态与证据归属,不声称重跑。
| 编号 | 最新状态 | 证据归属 |
|---|---|---|
| QA102-ENV-01 | Pass | R1同候选实际版本 |
| QA102-CAP-01 | Pass | R2 |
| QA102-CAP-02 | Blocked | R2认证HTTP400/code400;message未保留,未盲重试 |
| QA102-START-01 | Pass | R2 |
| QA102-START-02 | Pass | R2 |
| QA102-START-03 | Pass | R2 |
| QA102-LOCK-01 | Pass | R2 |
| QA102-LOCK-02 | Pass | R2 |
| QA102-LOCK-03 | Blocked | 无安全无通知会议fixture |
| QA102-LOCK-04 | Pass | R2 |
| QA102-FINISH-01 | Pass | R2 |
| QA102-FINISH-02 | Pass | R2 |
| QA102-WITHDRAW-01 | Pass | R2 |
| QA102-BATCH-01 | Pass | R2 |
| QA102-BATCH-02 | Pass | R2 |
| QA102-BATCH-03 | Pass | R2 |
| QA102-RACE-01 | Pass | R2,2轮各2请求 |
| QA102-LEGACY-01 | Pass | R2 |
| QA102-EXPORT-01 | Pass | R3完整时间专项;原R2 Fail/#15保留 |
| QA102-COLLECT-01 | Pass | R2跨导航1 TaskPUT / 0 costPUT、成本不变 |
| QA102-COLLECT-02 | Pass | R2 |
| QA102-REFRESH-01 | Pass | R2 |
| QA102-MANUAL-01 | Pass | 本次按文完整复现+UI/Backend/Web定向复核通过 |
按文实际复现与计数¶
环境/角色:同测试候选,管理员,Space32/p1。无新fixture。目标Task126、成本24、expert / 100 RMB / QA102专家,付款主体6。
- 前置:仅本轮成本24原paid,通过正常取消付款API回unpaid,HTTP200/code200;审计7473,11:37:00。未DB改状态。
- UI开始支付:11:37:36,选择主体B;GET为processing、主体6、paid_at空;审计7474。
- UI填写原因撤回:11:37:40,原因
QA102 manual R3 full replay withdrawal reason;GET为unpaid、主体及paid_at空;审计7475保存原因。 - UI再次开始:11:37:57,选择主体B;审计7476。
- UI实际填写/确认时间
2026-10-21 11:37后完成:11:38:13;审计7477。 - reload并GET:11:38:17,成本24仍paid、paid_at=
2026-10-21T11:37:00、主体6、locked=false、amount100、categoryexpert;页面同Task126/100RMB行显示同时间和已支付。
跨导航计数仅记录method/path,无payload/token:4条PUT /v1/tasks/126/costs/24/payment-status,对应上述开始/撤回/再开始/完成;前置取消付款1次另计。审计GET本轮返回code200。
手册截图为同候选R2真实图,时间11:20弹窗观察/11:24完成;文中已交代R3按文复现实际为11:37,不为时间变化重拍全部图。当前5张引用图存在,已目视检查。UI最终:结构/截图可读性PASS、映射/锁提示/图注闭环;Backend/Web最终:修改项全部关闭、业务内容PASS。均为统筹在本责任线程回传,不冒称QA替代独立评审。
Ops证据与缺陷¶
已读取并向#15追加:outputs/issue-102-20261021/release/export-500-runtime-evidence.md。直接栈为11:29:44 NoneType.strftime、excel_exports.py:1879;结合Backend源码与QA空started_at读回确认原空时间问题,旧b98存在,#102未改。Ops文件没有独立业务查字段,不把栈本身夸大为字段查询。#15未修、不关闭;#14合同前置错误历史同样保留。
文件/安全交付¶
- 正式核心手册:
projects/ndb/frontend/docs/user-manual/issue-102-payment-processing.md,5张引用图位于assets/issue-102-payment-processing/。 - 对象清单:
r2-manifest.json(含R3与按文实际状态/审计);旧/新导出响应和接口证据完整保留。 - 无产品源码、版本或配置修改,无切分支/commit/push/部署,无生产、真实付款、审批、通知、DB直写。两仓均release/issues-100-101-staging,BE原.aoci/config.json及旧100101手册/图保留。
- 合成数据保留供复现;成本28的获准删除负例历史除外,不额外清理。浏览器空间结束后不自动新建替代空间;原QA canonical CLI会话继续保留。
RA Updated by Redmine Admin 20 days ago
生产候选安全补缺:L1 Backend收据复核 — QA-CLOSURE-20261022-R1 / #13¶
候选BE 85721778e8ee164a347fd8890aa8061dedbb4741、FE7194ace4292e07963b0f1e66cf3e9f7fc4ef8896。执行人为Backend,QA只读核对原始run-01.log、results.json、closure_tests.py和delivery.md;没有重跑。真实迁移、独占合成PG、TransactionTestCase/APIClient、真实JWT解析与crypto/receiver/guards;仅供应商/ES外边界mock,全进程禁止外联。JWT是本地签发,不是密码登录;ORM基础fixture不改称全程公开API创建。不是共享站UI、独立HTTP完整应用或真实企微E2E。
本issue关联本地集成子项14 Pass / 0 Fail;27项唯一执行总计AUTH1/CAP12/CRYPTO9/MEETING1/UNKNOWN4,7.438秒。#11与#12共享的URL/crypto负例5项是同一执行,不重复计总数。565旧测试不重造,旧R1/R2/R3和父例Blocked不覆盖。
| 用例(closure_tests.ClosureTests) | 预期 | 实际断言摘要 | 状态 |
|---|---|---|---|
| test_AUTH_invalid_jwt_is_rejected | 无效JWT应401 | {"http":401,"authentication":"actual JWT decode, not force_authenticate"} | Pass |
| test_CAP02_pa_batch_paid | 低权限完成/撤回应403且业务快照不变 | {"http":403,"role":"pa","target":"paid","batch":true,"complete_snapshot_unchanged":true,"real_jwt":true} | Pass |
| test_CAP02_pa_batch_unpaid | 低权限完成/撤回应403且业务快照不变 | {"http":403,"role":"pa","target":"unpaid","batch":true,"complete_snapshot_unchanged":true,"real_jwt":true} | Pass |
| test_CAP02_pa_single_paid | 低权限完成/撤回应403且业务快照不变 | {"http":403,"role":"pa","target":"paid","batch":false,"complete_snapshot_unchanged":true,"real_jwt":true} | Pass |
| test_CAP02_pa_single_unpaid | 低权限完成/撤回应403且业务快照不变 | {"http":403,"role":"pa","target":"unpaid","batch":false,"complete_snapshot_unchanged":true,"real_jwt":true} | Pass |
| test_CAP02_pm_batch_paid | 低权限完成/撤回应403且业务快照不变 | {"http":403,"role":"pm","target":"paid","batch":true,"complete_snapshot_unchanged":true,"real_jwt":true} | Pass |
| test_CAP02_pm_batch_unpaid | 低权限完成/撤回应403且业务快照不变 | {"http":403,"role":"pm","target":"unpaid","batch":true,"complete_snapshot_unchanged":true,"real_jwt":true} | Pass |
| test_CAP02_pm_single_paid | 低权限完成/撤回应403且业务快照不变 | {"http":403,"role":"pm","target":"paid","batch":false,"complete_snapshot_unchanged":true,"real_jwt":true} | Pass |
| test_CAP02_pm_single_unpaid | 低权限完成/撤回应403且业务快照不变 | {"http":403,"role":"pm","target":"unpaid","batch":false,"complete_snapshot_unchanged":true,"real_jwt":true} | Pass |
| test_CAP02_sales_batch_paid | 低权限完成/撤回应403且业务快照不变 | {"http":403,"role":"sales","target":"paid","batch":true,"complete_snapshot_unchanged":true,"real_jwt":true} | Pass |
| test_CAP02_sales_batch_unpaid | 低权限完成/撤回应403且业务快照不变 | {"http":403,"role":"sales","target":"unpaid","batch":true,"complete_snapshot_unchanged":true,"real_jwt":true} | Pass |
| test_CAP02_sales_single_paid | 低权限完成/撤回应403且业务快照不变 | {"http":403,"role":"sales","target":"paid","batch":false,"complete_snapshot_unchanged":true,"real_jwt":true} | Pass |
| test_CAP02_sales_single_unpaid | 低权限完成/撤回应403且业务快照不变 | {"http":403,"role":"sales","target":"unpaid","batch":false,"complete_snapshot_unchanged":true,"real_jwt":true} | Pass |
| test_LOCK03_meeting_web_settlement_and_cost_delete | 会议变参结算及成本删除拒绝,同参幂等不改业务 | {"real_web_add_and_settle":true,"changed_code":"INVALID_REQUEST","delete_code":"PAYMENT_LOCKED","same_parameter":"idempotent read only","complete_snapshot_unchanged":true,"real_jwt":true} | Pass |
证据:outputs/production-release-20261022/backend-closure-20261022/{results.json,run-01.log,closure_tests.py,delivery.md};QA映射在qa-closure-20261022/backend-receipt-map.md。results SHA256 438c04aba66bfa151c7914b446f1829c6fd3b4e802b3b5b5c66e7c0bb77bf9d3;脚本SHA256 97a2d4080d0411ef10433a4c6fc168d50fc69e647373941fa31886a2768aa93e。
共享补证CAP-02:本轮规定bw-login已解决,管理员真实UI登录成功并GET profile确认id2/admin。仅既有专用test PM候选一次真实POST /v1/auth/login返回HTTP400/code400/message=账号未激活。请求采用实际username/password字段,不是字段/格式错误,也不能说invalidcredentials;该账号角色未验证,未再认证、未换候选/改账号。共享低角色子项Blocked,本地12项权限拒绝不替代共享身份/UI验证。旧单笔手册Pass保留,新增会议路由本地Pass不等于共享会议页面完整通过。
未真实通知/付款/外部审批/生产造数,无产品修改或提交推送部署;102及安全手册工作继续。真实供应商层、共享缺口和适用手册按层分开,不能用本地Pass宣称全部生产QA通过。
RA Updated by Redmine Admin 20 days ago
共享测试站安全补缺 — QA-CLOSURE-20261022-SHARED-R2 / #13¶
环境仅tcrm/tcrm-api,直接核BE1.20.5b4/FE2.16.4-beta.2;对应最终main BE85721778/FE7194ace的关键blob复用依据由Backend/Web/统筹提供,不写成main已部署。QA原责任会话,ego本轮Space17,日期2026-10-22。管理员真实UI登录/profile id2/admin;新PM真实UI登录/profile id16/pm。没有真实通知/审批/开票/付款/生产造数。
本issue新增共享窄范围子项 2 Pass / 0 Fail / 0 Blocked;三issue合计唯一共享6项,不与Backend27或历史轮次相加。下列前提/操作及实际证据只说明对应子项,不自动升级整个父例。
| CaseID | 用例/操作与预期 | 实际与证据 | 状态 |
|---|---|---|---|
| SHARED-PM-AUTH-01 | 新专用PM真实认证及UI登录:合法身份/合成记录,应符合对应展示/权限边界 | 新active账号16/role_ids3,单次POST后唯一email查ID/GET/readback;实际密码UI登录及profile16/pm成功。凭据已stdin存BW,QA文件无秘密。 | Pass |
| SHARED-PM-CAP-01 | PM菜单/直链/服务端能力只读:合法身份/合成记录,应符合对应展示/权限边界 | PM财务菜单DOM仅客户收入/账期;直链Task126有锁提示/禁用更新,无支付动作;成本27processing/locked=true/allowed=[]、24paid/allowed=[],均GET200。图08。未向旧成本发送状态写。 | Pass |
fixture manifest位于outputs/production-release-20261022/qa-closure-20261022/:shared-rate-manifest.json、shared-fixture-manifest.json、shared-account-manifest.json、pm-capability-evidence.json,逐步HTTP/code/确切ID/读回及来源均保留。A创建/0费率应用会正常写测试ES,已读Ops es-readonly.json确认staging独立索引无fallback;不宣称零I/O。B只建内部draft/prepay,不关联Task、不申请开票。账号仅新建专用PM,不修改旧未激活账号/Role权限,随机凭据只内存与批准Bitwarden。
父例更新:CAP-02现在有本地真JWT十二条complete/withdraw单/批拒绝(journal207)+565已有start拒绝+共享新PM密码UI登录/菜单/直链/server capability证据;不重复对旧cost发拒绝写。LOCK-03本地真实结算/成本删除route已Pass,共享会议UI本轮未测。旧失效PM认证HTTP400/code400/message=账号未激活历史保留,新身份不等于旧账号已修。
手册:shared-safe-guide.md及首版3图已有UI/Web/Backend三方Pass;新增incremental-guide.md和图04–08已实测、目视检查并送统筹安排增量复核,未把待审写成已审。旧102核心单笔5图及Pass保留,不重复全量。报告、图、脚本仅写新QA目录;两产品仓/旧手册只读,无commit/push/tag/deploy/真实生产写;共享旧Task126成本只有GET。
RA Updated by Redmine Admin 20 days ago
手册审核/空间收尾补记 — QA-CLOSURE-20261022-MANUAL-CLOSE(非新测试轮次,不新增Pass、不重复27或共享6条用例)。
两份已实测安全指南均获UI/Web/Backend原责任线程独立定向Pass,登记outputs/production-release-20261022/manual-review-register.md。首版图01–03与增量图04–08分别审阅;新增0/未申请账单/PM只读章节不借旧Pass覆盖。仅调整审核状态,未引入新业务步骤。最终两文档/八图精确清单及逐文件SHA256见qa-closure-20261022/delivery-manifest.json。
shared-safe-guide.md SHA256 30e92ef42884d53888a2928042caa716b17c0e1fef3f03bf5f8b58a7ca8325ad
incremental-guide.md SHA256 413aed2c70a7324910c808345fd77f55fa2fcb6bf0c4d9564c2444c5cffad900
额外按文只读核对账单68过滤仅1行、详情刷新仍not_requested及空时间单号,未新增业务写/Pass。Space17于2026-10-22T05:40:46Z完成finish({keep:[]}),本轮浏览器已结束,合成fixture及Bitwarden凭据条目保留,不清理业务数据。新共享PM16与管理员均真实UI登录/profile已核;旧Task126成本仅GET。
边界仍保留:其它申请状态及非空单号时间的共享UI、共享会议UI、真实供应商提交/审批人/订阅投递/媒体OSS未执行;本地27不冒充这些层级。旧#14/#15历史未因此修复或关闭。QA本次安全包已收口,不继续扩场景或等待整套UI设施;用户手册/资产版本化及生产门禁由统筹/Web/Ops按后续精确释放安排。两产品仓和旧13项untracked未改,无commit/push/tag/部署/生产写。