ThearchyHelios
a137182145
Excel 期 5:列表按期累积、穿插的小计、表格对象起草、CSV 走配方(E)
为什么:每月一份的明细导出是最常见的场景,期 4 之前列表只能每期替换;夹在中间的小计会让规则起草失败;
表格对象这个现成的边界信号没用上;CSV 不能走配方。四项都复用现有的执行器、核对、累积、溯源,不另起一套。
- 列表按期累积:ListBlock.period 二选一——{column, check: within_context} 按日期列分期,试运行多一条结构类核对
D(每行的日期都在本期统计期内,空着也不行);{synthesize: 统计期} 每行加「统计期起」「统计期止」两列,列表在
统计期定下来之前就抽完了,这两格先放占位、写库时换成真值。accumulate_blockers 放行绑定了统计期的列表;合计行、
小计行另存的表各期主键分不开,照旧不能累积;同一订单两期都出现由并集的主键核对拒收。U3 按列表的分期方式核对。
说明里「按哪一列筛选」用分期列,加的两列有列说明;空行之后文字行的说法补了并集版本(列表能累积以后要用到)。
- 穿插的小计:ListRows.subtotals {label_column, pick, scope: since_previous | group_column, group_column, keep_as}。
小计行不进数据,每个数字格一条合计格(分段键是块 id + ·小计),核对模块按它所管那组明细的 rowid 区间用 SQL
求和比对(新 T 编号,标题「小计行按各组明细求和」),整行记进排除的行(reason=subtotal),可以另存成
reported_total 表(小计项、分组取值、各数字列);数字格全空报 subtotal_blank(结构类);合计行的公式引用了小计格
时按它管的明细换算。静态校验:标签列、分组列要在列里,按组小计要给分组列,小计和合计的开头词不能互为前缀。
规则起草把第一列同一个合计字样、下面还有明细的行提议成小计(以前记 stray_totals 失败),框选同一条规则。
- 表格对象起草:工作表有表格对象时按它出列表块:表头行、列范围、数据行、汇总行(映射成 total_row,标签取汇总行
第一列的文字)都由表格对象给,锚点仍按表头文字、不记坐标;表名优先用表格对象的名字(含数字的不用)。不调用 AI。
- CSV 走配方:新增 csv_grid,按内容认出 CSV(不是 zip、不是 OLE、开头没有 NUL),编码和分隔符复用 tabular 读 CSV
的那一段,适配成一张名为「CSV」的工作表(SheetScan.path=csv:,WorkbookScan.format=csv);只有写法毫无歧义的
整数、小数转成数,千分位、前导零、日期写法一律留作文字交给配方的规则。坐标沿用「工作表!A1」(偏离细案的
R{行}C{列},理由见 csv_grid 的模块说明)。CSV 不做稀疏判定。导入向导和简单上传的结构提示都放行 CSV。
- 每个列表一道题「每期怎么更新」(q_list_period):每期替换 / 按期累积并按某个日期列核对 / 按期累积并加统计期
起止两列,后两种同时把导入模式改成按期累积、缺统计期的工作表一并配上(问题集合按草稿生成、回答时不变,草稿里
的列表还不符合累积资格,q_mode 不会出现,所以并成一道题)。确认项新增 subtotals:<块>、list_period:<块>。
- 前端配方面板:列表块多「小计行」(标签列、开头词、管哪些明细、分组列、另存)和「按期累积时每一行属于哪一期」;
回执「排除的行」认 subtotal。
验证:新增 tests/test_csv_grid.py、test_recipe_p5.py(执行器、核对、校验、资格、并集物化、起草)、
test_recipe_p5_e2e.py(经接口:三份月度 CSV 累积、部分重叠拒收、同一期替换要确认;带穿插小计的 Excel 起草、
核对、提交)。去掉小计识别、统计期回填、D 核对分别回跑,新测试 10 条失败。旧测试里「夹在中间的小计一律失败」
「列表只能每期替换」的断言按新行为改写。
2026-10-16 11:09:39 +08:00
..
2026-10-15 07:15:37 +08:00
2026-10-16 10:25:28 +08:00
2026-10-15 12:09:29 +08:00
2026-10-13 10:03:24 +08:00
2026-10-04 23:40:20 +08:00
2026-10-06 11:44:58 +08:00
2026-10-14 21:55:51 +08:00
2026-09-30 08:05:15 +08:00
2026-09-30 08:05:15 +08:00
2026-09-30 08:05:15 +08:00
2026-09-25 15:20:46 +08:00
2026-09-30 08:05:15 +08:00
2026-10-14 21:55:51 +08:00
2026-10-14 21:55:51 +08:00
2026-10-15 12:09:29 +08:00
2026-10-14 21:55:51 +08:00
2026-10-15 07:15:37 +08:00
2026-10-15 08:35:28 +08:00
2026-10-15 07:15:37 +08:00
2026-10-14 21:55:51 +08:00
2026-10-15 08:35:28 +08:00
2026-10-15 12:09:29 +08:00
2026-10-15 13:55:19 +08:00
2026-10-15 08:35:28 +08:00
2026-09-29 05:26:34 +08:00
2026-10-04 12:03:14 +08:00
2026-09-30 08:05:15 +08:00
2026-10-15 08:35:28 +08:00
2026-10-15 07:15:37 +08:00
2026-10-14 20:05:23 +08:00
2026-09-30 08:05:15 +08:00
2026-09-30 08:05:15 +08:00
2026-09-30 08:05:15 +08:00
2026-10-15 14:32:25 +08:00
2026-10-15 13:55:19 +08:00
2026-10-15 17:31:20 +08:00
2026-10-15 13:55:19 +08:00
2026-10-15 13:55:19 +08:00
2026-10-15 13:55:19 +08:00
2026-10-15 13:55:19 +08:00
2026-09-30 09:48:16 +08:00
2026-10-12 17:23:27 +08:00
2026-10-13 10:03:24 +08:00
2026-10-12 17:23:27 +08:00
2026-10-12 19:09:50 +08:00
2026-10-06 19:21:23 +08:00
2026-10-12 19:09:50 +08:00
2026-10-12 23:01:09 +08:00
2026-09-17 18:29:16 +08:00
2026-10-14 22:08:33 +08:00
2026-10-15 14:44:26 +08:00
2026-10-14 21:55:51 +08:00
2026-10-04 02:19:26 +08:00
2026-10-14 15:38:15 +08:00
2026-10-14 09:59:19 +08:00
2026-10-16 10:25:28 +08:00
2026-10-14 14:07:14 +08:00
2026-10-14 22:17:00 +08:00
2026-10-13 20:30:02 +08:00
2026-10-14 20:05:23 +08:00
2026-10-13 20:30:02 +08:00
2026-10-14 15:38:15 +08:00
2026-10-15 19:43:29 +08:00
2026-10-16 10:25:28 +08:00
2026-10-16 10:25:28 +08:00
2026-10-04 01:07:15 +08:00
2026-10-14 16:11:04 +08:00
2026-10-04 02:00:17 +08:00
2026-10-14 09:51:49 +08:00
2026-10-03 11:09:09 +08:00
2026-10-14 20:05:23 +08:00
2026-10-16 10:25:28 +08:00
2026-10-04 02:19:26 +08:00
2026-10-03 12:14:17 +08:00
2026-10-14 16:11:04 +08:00
2026-10-07 01:09:36 +08:00
2026-10-14 20:05:23 +08:00
2026-10-12 15:55:19 +08:00
2026-09-29 11:10:53 +08:00
2026-09-30 08:05:15 +08:00
2026-09-24 23:15:19 +08:00
2026-10-06 16:42:29 +08:00
2026-10-05 16:41:59 +08:00
2026-10-05 16:41:59 +08:00
2026-09-30 08:05:15 +08:00
2026-09-30 08:05:15 +08:00
2026-09-30 08:05:15 +08:00
2026-09-30 08:05:15 +08:00
2026-10-06 19:51:29 +08:00
2026-09-30 10:04:52 +08:00
2026-10-15 13:55:19 +08:00
2026-09-28 02:42:40 +08:00
2026-10-14 21:55:51 +08:00
2026-10-14 20:05:23 +08:00
2026-10-04 11:07:40 +08:00
2026-10-15 13:55:19 +08:00
2026-10-05 15:08:53 +08:00
2026-10-04 11:10:28 +08:00
2026-10-14 20:05:23 +08:00
2026-09-29 11:10:53 +08:00
2026-09-30 08:05:15 +08:00
2026-10-15 12:09:29 +08:00
2026-10-14 20:05:23 +08:00
2026-10-14 20:05:23 +08:00
2026-09-30 08:05:15 +08:00
2026-10-14 20:05:23 +08:00
2026-09-27 10:16:32 +08:00
2026-10-14 20:05:23 +08:00
2026-10-15 17:31:20 +08:00
2026-09-25 15:41:30 +08:00
2026-10-15 14:59:40 +08:00
2026-09-30 18:05:33 +08:00
2026-10-16 11:09:39 +08:00
2026-09-27 10:16:32 +08:00
2026-09-30 08:05:15 +08:00
2026-10-05 00:26:04 +08:00
2026-09-27 23:37:32 +08:00
2026-09-30 08:05:15 +08:00
2026-10-02 07:38:44 +08:00
2026-10-02 14:38:10 +08:00
2026-10-05 15:54:03 +08:00
2026-10-05 15:54:03 +08:00
2026-10-14 15:38:15 +08:00
2026-10-07 01:34:59 +08:00
2026-10-15 07:15:37 +08:00
2026-10-12 12:24:14 +08:00
2026-10-06 18:03:12 +08:00
2026-09-18 09:39:24 +08:00
2026-10-15 07:15:37 +08:00
2026-10-01 13:42:04 +08:00
2026-09-28 11:47:23 +08:00
2026-09-30 08:05:15 +08:00
2026-10-06 12:02:03 +08:00
2026-09-30 08:05:15 +08:00
2026-09-30 08:05:15 +08:00
2026-10-06 12:58:37 +08:00
2026-10-06 12:58:37 +08:00
2026-09-29 05:26:34 +08:00
2026-09-29 05:26:34 +08:00
2026-09-30 08:05:15 +08:00
2026-10-12 13:50:31 +08:00
2026-10-12 17:23:27 +08:00
2026-10-12 13:50:31 +08:00
2026-10-12 17:23:27 +08:00
2026-10-12 10:48:19 +08:00
2026-10-04 02:35:33 +08:00
2026-09-30 08:05:15 +08:00
2026-09-30 08:05:15 +08:00
2026-10-12 12:24:14 +08:00
2026-09-30 15:03:31 +08:00
2026-10-01 13:42:04 +08:00
2026-09-30 08:05:15 +08:00
2026-10-06 11:37:22 +08:00
2026-10-01 13:42:04 +08:00
2026-09-30 08:05:15 +08:00
2026-10-04 11:02:06 +08:00
2026-09-25 14:33:56 +08:00
2026-10-15 13:55:19 +08:00
2026-10-02 07:38:44 +08:00
2026-10-15 13:55:19 +08:00
2026-09-30 08:05:15 +08:00
2026-09-30 10:04:52 +08:00
2026-09-30 08:05:15 +08:00
2026-09-27 10:16:32 +08:00
2026-09-30 08:05:15 +08:00
2026-09-27 10:16:32 +08:00
2026-10-12 15:55:19 +08:00
2026-10-07 01:09:36 +08:00
2026-10-06 22:52:28 +08:00
2026-10-12 15:55:19 +08:00
2026-10-05 01:18:03 +08:00
2026-10-01 13:42:04 +08:00
2026-10-03 09:30:50 +08:00
2026-09-28 11:47:23 +08:00
2026-09-28 11:47:23 +08:00
2026-10-05 18:45:59 +08:00
2026-09-25 15:30:32 +08:00
2026-09-29 16:07:19 +08:00
2026-10-12 13:50:31 +08:00
2026-10-02 14:38:10 +08:00
2026-09-30 10:04:52 +08:00
2026-09-30 10:04:52 +08:00
2026-09-30 10:04:52 +08:00
2026-10-06 12:58:37 +08:00
2026-10-06 14:30:15 +08:00
2026-09-27 10:16:32 +08:00
2026-09-28 11:47:45 +08:00
2026-09-25 12:47:07 +08:00
2026-09-30 08:05:15 +08:00
2026-10-14 20:05:23 +08:00
2026-09-30 08:05:15 +08:00
2026-09-30 08:05:15 +08:00
2026-10-12 10:48:19 +08:00
2026-10-12 10:48:19 +08:00
2026-10-07 01:09:36 +08:00
2026-10-12 13:14:36 +08:00
2026-10-06 19:11:14 +08:00
2026-10-06 21:50:48 +08:00
2026-10-12 10:50:40 +08:00
2026-10-13 16:59:58 +08:00
2026-10-12 12:18:34 +08:00
2026-10-07 01:09:36 +08:00
2026-10-14 20:05:23 +08:00
2026-10-04 01:08:42 +08:00
2026-10-04 02:17:32 +08:00
2026-10-03 09:36:20 +08:00
2026-10-03 10:40:47 +08:00
2026-09-28 11:47:23 +08:00
2026-10-15 07:15:37 +08:00
2026-10-05 03:26:43 +08:00
2026-10-15 07:15:37 +08:00
2026-09-30 11:19:25 +08:00
2026-10-06 14:29:48 +08:00
2026-09-30 08:05:15 +08:00
2026-10-01 13:42:04 +08:00
2026-09-25 23:14:50 +08:00
2026-09-30 08:05:15 +08:00
2026-10-14 20:05:23 +08:00
2026-10-04 12:27:38 +08:00
2026-10-02 07:38:44 +08:00
2026-10-15 13:55:19 +08:00
2026-10-15 12:09:29 +08:00
2026-10-15 07:15:37 +08:00
2026-10-15 07:15:37 +08:00
2026-10-14 22:08:33 +08:00
2026-10-14 22:08:33 +08:00
2026-10-16 10:25:28 +08:00
2026-10-16 10:25:28 +08:00
2026-10-02 14:38:10 +08:00
2026-10-02 14:38:10 +08:00
2026-10-03 09:36:20 +08:00
2026-10-02 14:38:10 +08:00
2026-10-12 10:17:40 +08:00
2026-10-02 14:38:10 +08:00
2026-10-06 19:43:44 +08:00
2026-10-06 19:43:44 +08:00
2026-10-06 17:29:18 +08:00
2026-10-06 19:43:44 +08:00
2026-10-06 19:43:44 +08:00
2026-09-30 08:05:15 +08:00
2026-10-15 17:31:20 +08:00
2026-10-04 02:52:43 +08:00
2026-09-28 21:20:04 +08:00
2026-09-30 08:05:15 +08:00
2026-09-25 14:44:56 +08:00
2026-10-02 07:38:44 +08:00
2026-10-02 07:38:44 +08:00
2026-10-02 07:38:44 +08:00
2026-10-01 22:00:07 +08:00
2026-10-01 22:00:07 +08:00
2026-10-02 07:38:44 +08:00
2026-10-02 07:38:44 +08:00
2026-10-02 07:38:44 +08:00
2026-10-16 11:09:39 +08:00
2026-10-02 07:38:44 +08:00
2026-10-01 22:00:07 +08:00
2026-10-02 07:38:44 +08:00
2026-10-02 14:38:10 +08:00
2026-10-02 07:38:44 +08:00
2026-10-16 11:09:39 +08:00
2026-10-02 07:38:44 +08:00
2026-10-02 07:38:44 +08:00
2026-10-02 07:38:44 +08:00
2026-10-02 07:38:44 +08:00
2026-10-01 22:00:07 +08:00
2026-10-16 11:09:39 +08:00
2026-10-02 07:38:44 +08:00
2026-10-16 11:09:39 +08:00
2026-10-16 11:09:39 +08:00
2026-10-02 07:38:44 +08:00
2026-10-16 11:09:39 +08:00
2026-10-16 11:09:39 +08:00
2026-10-16 11:09:39 +08:00
2026-10-16 11:09:39 +08:00
2026-10-05 18:50:34 +08:00
2026-10-06 09:20:09 +08:00
2026-10-15 13:55:19 +08:00
2026-10-14 20:05:23 +08:00
2026-10-04 11:28:23 +08:00
2026-10-04 12:28:07 +08:00
2026-09-30 08:05:15 +08:00
2026-09-30 08:05:15 +08:00
2026-10-04 11:33:09 +08:00
2026-10-12 14:26:43 +08:00
2026-10-13 10:04:30 +08:00
2026-10-10 12:59:21 +08:00
2026-10-06 13:32:38 +08:00
2026-09-30 10:04:52 +08:00
2026-10-12 13:50:31 +08:00
2026-10-12 23:01:09 +08:00
2026-10-12 12:33:32 +08:00
2026-10-12 23:01:09 +08:00
2026-10-12 23:01:09 +08:00
2026-10-12 19:09:50 +08:00
2026-10-12 17:23:27 +08:00
2026-10-12 13:50:31 +08:00
2026-10-12 17:23:27 +08:00
2026-09-30 15:03:31 +08:00
2026-09-30 08:05:15 +08:00
2026-10-04 02:24:49 +08:00
2026-10-04 02:33:15 +08:00
2026-09-30 08:05:15 +08:00
2026-10-06 09:31:00 +08:00
2026-09-30 08:05:15 +08:00
2026-10-05 01:18:03 +08:00
2026-10-05 18:45:59 +08:00
2026-10-06 14:32:30 +08:00
2026-09-26 23:11:31 +08:00
2026-10-14 22:08:33 +08:00
2026-10-05 00:07:07 +08:00
2026-09-30 08:05:15 +08:00
2026-09-30 08:05:15 +08:00
2026-09-30 08:05:15 +08:00
2026-10-14 20:05:23 +08:00
2026-09-27 10:16:32 +08:00
2026-10-14 20:05:23 +08:00
2026-10-14 21:55:51 +08:00
2026-10-04 01:52:24 +08:00
2026-09-27 23:37:32 +08:00
2026-10-07 00:02:15 +08:00
2026-10-06 08:48:56 +08:00
2026-10-06 16:42:29 +08:00
2026-10-05 08:50:57 +08:00
2026-10-05 08:37:57 +08:00
2026-10-15 07:15:37 +08:00
2026-10-05 18:39:10 +08:00
2026-10-06 08:48:56 +08:00
2026-10-06 08:48:56 +08:00
2026-10-15 07:15:37 +08:00
2026-09-30 08:05:15 +08:00
2026-10-15 12:09:29 +08:00
2026-10-05 08:37:57 +08:00
2026-09-25 16:05:14 +08:00
2026-10-02 07:38:44 +08:00
2026-10-06 08:10:41 +08:00
2026-09-29 05:26:34 +08:00
2026-09-25 14:44:56 +08:00
2026-10-07 01:34:59 +08:00
2026-10-07 01:34:59 +08:00
2026-10-04 02:19:26 +08:00
2026-10-01 13:42:04 +08:00
2026-09-30 08:05:15 +08:00
2026-09-30 08:05:15 +08:00
2026-10-02 07:38:44 +08:00
2026-10-02 07:38:44 +08:00
2026-10-02 07:38:44 +08:00
2026-10-02 07:38:44 +08:00
2026-10-02 07:38:44 +08:00
2026-10-01 22:00:07 +08:00
2026-10-14 21:55:51 +08:00
2026-09-30 08:05:15 +08:00
2026-09-26 23:11:31 +08:00
2026-10-15 07:15:37 +08:00
2026-09-28 21:20:04 +08:00
2026-09-18 17:57:20 +08:00
2026-10-07 00:02:15 +08:00
2026-10-14 20:05:23 +08:00
2026-10-15 07:15:37 +08:00
2026-10-14 21:55:51 +08:00
2026-09-30 08:05:15 +08:00
2026-09-30 08:05:15 +08:00
2026-10-03 11:09:09 +08:00
2026-09-30 08:05:15 +08:00
2026-09-30 08:05:15 +08:00
2026-10-15 13:55:19 +08:00
2026-09-27 10:16:32 +08:00
2026-09-30 08:05:15 +08:00
2026-09-30 08:05:15 +08:00
2026-10-06 21:50:48 +08:00
2026-10-05 01:46:55 +08:00
2026-10-06 14:32:30 +08:00
2026-10-05 18:45:44 +08:00
2026-10-12 12:24:14 +08:00
2026-10-07 00:02:15 +08:00
2026-10-14 22:17:00 +08:00
2026-10-07 01:19:26 +08:00
2026-10-05 00:06:03 +08:00
2026-10-06 14:30:03 +08:00
2026-09-29 05:26:34 +08:00
2026-09-30 09:48:16 +08:00
2026-10-15 07:15:37 +08:00
2026-10-12 17:23:27 +08:00
2026-10-05 06:49:33 +08:00
2026-09-26 23:11:31 +08:00
2026-10-14 21:55:51 +08:00
2026-09-28 02:42:40 +08:00
2026-10-06 23:56:31 +08:00
2026-10-01 22:00:07 +08:00
2026-10-01 13:42:04 +08:00