缺陷 #38
openQA验收 #35: CNB #106|Task毛利率排除与KM零成本提醒|本地独立验收
DEF106-HOME-COUNT-01|全部销售聚合重复计算排除Task数
0%
Description
DEF106-HOME-COUNT-01。primary已确认106范围内Backend展示基数统计缺陷,唯一修复owner=NDB Backend Agent;当前仅记录归属,不释放修复或部署。
测试环境FE2.16.9-beta.3/4a303c3d,BE1.20.15b2/473cc345,管理员20,2026-11-01。公司15/项目96仅本轮Task148=false、149=true,两个销售归属;GET /v1/admin/sales-data/companies?start_month=2026-01&end_month=2026-11,company15返回实际income2000/cost600/gross_margin40,basis1000/600但excluded_task_count=2。同期POST /v1/finances/statistics(只读统计,company_id15/statistical_year2026/currencyRMB)返回相同金额、40%及excluded_task_count=1。预期按公司实际排除Task计数为1,实际2;月度10月聚合亦出现2。金额/40%计算正确,不能把排除数case记Pass。
源码api/sales/services.py:185每销售分摊行excluded_count=int(flag),公司聚合约280行再次逐行累加;双销售使一个Task重复计数。读源码定位不替代运行证据。原始响应位于outputs/issue-106-implementation-20261030/qa/home-roles-20261101/admin-sales-restored40.json;独立原始响应/图表数值核对independent-review.json;附件为仅本合成数据精简证据。
没有编辑源代码/配置/DB直写/账号/生产,没有真实付款/审批。A/B四次获准标记往返已恢复初始值,成本42及其他字段不变。待primary另行释放Backend修复/自测及QA定向回归;不自动关闭缺陷。
Files
RA Updated by Redmine Admin 10 days ago
- File case-index.json case-index.json added
- File results.md results.md added
- File execution-result.json execution-result.json added
- File request-responses-r2-oracle-corrected.jsonl request-responses-r2-oracle-corrected.jsonl added
- File runner-correction.md runner-correction.md added
#38 本地独立修复回归 — 2026-11-01¶
本地37项Pass /0Fail;未部署,原staging Fail不覆盖。 Backend候选base473cc345,source digest af64e859e8b54281a24f74b56c2185372b86fdfe31c06c7fd953e052895ce818,services SHA fb02b2b896ae61032067205a94c17cabd8fdda3ee95c96861b53812ec1fefb79,tests SHA 06758d048f77bf8ec1c49e3edae85c041ef28de0866fa440f663c262554c3cd7。执行前后全部hash一致;Backend工作区只有原owner两文件修改,QA未写产品文件。
执行时间:2026-11-01T01:31:55.087930+08:00。环境crm_backend;内存SQLite、禁repo env/网络/持久DB,使用真实Django URL→DRF APIClient→实际视图/ORM及真实xlsx生成/读取。APIClient不等于网络HTTP;force_authenticate仅临时admin,不等于密码登录或真实销售身份验收。 没有启动服务、浏览器、PG、迁移或测试站请求。
实际覆盖¶
| 影响 | 独立观察 | 结果与限制 |
|---|---|---|
| IMP106-05-HC01 | 全部/a/b/c/无匹配销售 × overview/companies/monthly/collection-status,共20项JSON视图观察 | 双销售仅B排除:baseline公司count2、候选count1;overview每销售各1。除排除数外完整响应相同。单销售/多销售/无归属/无匹配和重复ID均纳入;金额按既有原列表分摊权重保持,未另修历史重复归属。 |
| IMP106-05-HC03 | 3项monthly按公司筛选,独立9/10/12月期望与原始响应核对 | 每公司/每月独立去重,空月0;年范围与月范围各用真实参数,未混淆。 |
| IMP106-05-HC02 | 原pair本地全部计入/全部排除 × companies/monthly,共4项 | count0/2而非4,原income2000/cost600不变;70%及applicable=false/0基数正确;临时flag阶段后恢复。 |
| IMP106-05-HC04 | 5种筛选 × companies-export/collection-status-export,共10项 | 实际返回xlsx经openpyxl读取,逐单元格与旧baseline一致;客户导出仍4列,没有排除数字列,不能宣称导出修复了不存在的字段。工作簿在内存解析,原始逐格值保留JSONL,不冒称已保存独立xlsx二进制文件。 |
总计37项独立参数化断言,74份candidate/baseline响应,独立规格oracle来自合成输入,不调用候选计算期望。逐条预期/实际/层级/影响/时间见case-index.json;原始数据execution-result.json、request-responses-r2-oracle-corrected.jsonl。全临时账号/角色/公司/项目/Task/Cost模型快照恢复后完全一致;每个只读视图阶段未改DB。临时测试库由finally销毁,不新建持久库或改现有业务数据。
首轮runner断言错误与纠正:execution.log及首2份响应保留。QA错误假设重复销售ID先归一化,但既有helper保留列表权重;candidate/baseline原金额相同。仅修QA oracle到既有权重,execution-r2.log通过,不计产品失败或第二修复轮。8项offline支持自检不加到37。
原环境与剩余边界¶
原staging #35 journal356和#38 count2失败、真实截图全部保留,测试站尚未部署候选,不能把本地Pass说成线上已修或自动Closed。旧14项/其他角色未重跑,角色未测决定不变。PG/迁移/网络HTTP/浏览器新页面/真实供应商/性能均未覆盖;纯数值修复不要求额外测试发布。开发16Pass/red3Fail只引用owner证据,不与独立37相加。AOCI既有静态索引阻断不计业务失败或新增治理。
本轮QA可交primary审收据并决定后续;无source/config/Git/部署/生产/现有账号或业务fixture操作。Redmine38/35修复验证journal及读回见本目录writeback-receipt.json。
本轮独立Case索引(详细预期/实际见附件case-index.json)¶
| CaseID | 影响 | 状态 |
|---|---|---|
| QA106-COUNT-overview-all | IMP106-05-HC01 | Pass |
| QA106-COUNT-companies-all | IMP106-05-HC01 | Pass |
| QA106-COUNT-monthly-all | IMP106-05-HC01 | Pass |
| QA106-COUNT-collection-status-all | IMP106-05-HC04 | Pass |
| QA106-COUNT-companies-export-all | IMP106-05-HC04 | Pass |
| QA106-COUNT-collection-status-export-all | IMP106-05-HC04 | Pass |
| QA106-COUNT-overview-a | IMP106-05-HC01 | Pass |
| QA106-COUNT-companies-a | IMP106-05-HC01 | Pass |
| QA106-COUNT-monthly-a | IMP106-05-HC01 | Pass |
| QA106-COUNT-collection-status-a | IMP106-05-HC04 | Pass |
| QA106-COUNT-companies-export-a | IMP106-05-HC04 | Pass |
| QA106-COUNT-collection-status-export-a | IMP106-05-HC04 | Pass |
| QA106-COUNT-overview-b | IMP106-05-HC01 | Pass |
| QA106-COUNT-companies-b | IMP106-05-HC01 | Pass |
| QA106-COUNT-monthly-b | IMP106-05-HC01 | Pass |
| QA106-COUNT-collection-status-b | IMP106-05-HC04 | Pass |
| QA106-COUNT-companies-export-b | IMP106-05-HC04 | Pass |
| QA106-COUNT-collection-status-export-b | IMP106-05-HC04 | Pass |
| QA106-COUNT-overview-c | IMP106-05-HC01 | Pass |
| QA106-COUNT-companies-c | IMP106-05-HC01 | Pass |
| QA106-COUNT-monthly-c | IMP106-05-HC01 | Pass |
| QA106-COUNT-collection-status-c | IMP106-05-HC04 | Pass |
| QA106-COUNT-companies-export-c | IMP106-05-HC04 | Pass |
| QA106-COUNT-collection-status-export-c | IMP106-05-HC04 | Pass |
| QA106-COUNT-overview-absent | IMP106-05-HC01 | Pass |
| QA106-COUNT-companies-absent | IMP106-05-HC01 | Pass |
| QA106-COUNT-monthly-absent | IMP106-05-HC01 | Pass |
| QA106-COUNT-collection-status-absent | IMP106-05-HC04 | Pass |
| QA106-COUNT-companies-export-absent | IMP106-05-HC04 | Pass |
| QA106-COUNT-collection-status-export-absent | IMP106-05-HC04 | Pass |
| QA106-COUNT-company-filter-pair | IMP106-05-HC03 | Pass |
| QA106-COUNT-company-filter-three_duplicate | IMP106-05-HC03 | Pass |
| QA106-COUNT-company-filter-cross_month | IMP106-05-HC03 | Pass |
| QA106-COUNT-companies-allflag-False | IMP106-05-HC02 | Pass |
| QA106-COUNT-monthly-allflag-False | IMP106-05-HC02 | Pass |
| QA106-COUNT-companies-allflag-True | IMP106-05-HC02 | Pass |
| QA106-COUNT-monthly-allflag-True | IMP106-05-HC02 | Pass |