Project

General

Profile

Actions

QA验收 #13

open
RA

CNB #102 专家费支付中状态|测试环境验收

QA验收 #13: CNB #102 专家费支付中状态|测试环境验收

Added by Redmine Admin 21 days ago. Updated 20 days ago.

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

0%

Estimated time:
(Total: 0:00 h)

Description

关联 CNB:https://cnb.cool/mindsetech/NDB/backend/-/issues/102
范围:支付中状态、支付快照冻结、编辑删除锁定、完成与撤回、批量原子性、权限和客户收款回归。
环境:仅 https://tcrm.mindsetech.com 与 https://tcrm-api.mindsetech.com;版本待发布后核实。
禁止:生产、真实付款、真实企微审批及修改真实业务记录。使用唯一 QA102 标记的合成测试数据。
QA 每条执行用例追加结果与证据并重新读取验证;真实测试环境图文手册另行归档与 UI/项目复核。
当前状态:发布准备;尚未执行测试环境验收。


Subtasks 2 (2 open — 0 closed)

缺陷 #14: #102 QA前置阻塞:无有效合同的新合成公司快捷建Task返回HTML新建10/21/2026

Actions
缺陷 #15: #102 R2:仅合成专家成本24/25导出支付列表返回HTTP500新建10/21/2026

Actions

RA Updated by Redmine Admin 21 days ago Actions #1

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 Actions #2

  • Subtask #14 added

RA Updated by Redmine Admin 21 days ago Actions #3

#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.js HTTP200,版本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 Actions #4

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 Actions #5

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 Actions #6

  • Subtask #15 added

RA Updated by Redmine Admin 21 days ago Actions #7

#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 Actions #8

#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。与运行栈一致。

合法前置修正与操作

  1. 初态:Task125成本25 processing、23 unpaid、26 unpaid。Task126仍保持原数据,不改其空时间。
  2. 成本25通过正式payment-status API撤回为unpaid,原因QA102 R3 withdraw to complete synthetic Task timestamps before new freeze export test;code200。
  3. 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写、无自动会议/通知。
  4. 仅合成专家574235的收款主档11设SWIFT=QA102-R3-BEFORE。成本23/25均在未锁状态通过正常成本API保存指向主档11的对公测试快照,刻意不带SWIFT;账户QA102-NONPAYABLE-EXPORT,无联系方式,金额分别100/10 RMB。
  5. 分别正常开始支付冻结,主体5,均code200且快照SWIFT缺失。再正常完成成本23,paid_at=2026-10-21T11:00:00;成本25保持processing。
  6. 只把同一合成主档11的SWIFT改为QA102-R3-AFTER并GET确认;两个成本快照仍缺SWIFT。
  7. 单次POST /v1/finances/export,body={"export_method":"export_ids","export_type":"expert","finance_ids":[23,25]},HTTP200,获得有效xlsx。不是原[24,25]空时间请求的盲重试。
  8. 撤回审计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 Actions #9

#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。

  1. 前置:仅本轮成本24原paid,通过正常取消付款API回unpaid,HTTP200/code200;审计7473,11:37:00。未DB改状态。
  2. UI开始支付:11:37:36,选择主体B;GET为processing、主体6、paid_at空;审计7474。
  3. UI填写原因撤回:11:37:40,原因QA102 manual R3 full replay withdrawal reason;GET为unpaid、主体及paid_at空;审计7475保存原因。
  4. UI再次开始:11:37:57,选择主体B;审计7476。
  5. UI实际填写/确认时间2026-10-21 11:37后完成:11:38:13;审计7477。
  6. 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 Actions #10

生产候选安全补缺: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 Actions #11

共享测试站安全补缺 — 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 Actions #12

手册审核/空间收尾补记 — 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/部署/生产写。

Actions

Also available in: PDF Atom