skill-bill 0.1.0 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/SKILL.md +127 -0
- package/dist/.gen-inputs.json +14 -0
- package/dist/cli/cmd_read.js +133 -142
- package/dist/cli/cmd_read.js.map +1 -1
- package/dist/cli/registry.d.ts +15 -0
- package/dist/cli/registry.d.ts.map +1 -0
- package/dist/cli/registry.js +22 -0
- package/dist/cli/registry.js.map +1 -0
- package/dist/fetch/db.d.ts +4 -0
- package/dist/fetch/db.d.ts.map +1 -1
- package/dist/fetch/db.js +12 -0
- package/dist/fetch/db.js.map +1 -1
- package/dist/fetch/index.d.ts +1 -1
- package/dist/fetch/index.d.ts.map +1 -1
- package/dist/fetch/index.js +1 -1
- package/dist/fetch/index.js.map +1 -1
- package/dist/help/index.d.ts +1 -0
- package/dist/help/index.d.ts.map +1 -1
- package/dist/help/index.js +1 -0
- package/dist/help/index.js.map +1 -1
- package/dist/help/lookup.d.ts.map +1 -1
- package/dist/help/lookup.js +3 -2
- package/dist/help/lookup.js.map +1 -1
- package/dist/help/writeWire.d.ts +16 -0
- package/dist/help/writeWire.d.ts.map +1 -0
- package/dist/help/writeWire.js +109 -0
- package/dist/help/writeWire.js.map +1 -0
- package/dist/output.d.ts +21 -0
- package/dist/output.d.ts.map +1 -0
- package/dist/output.js +48 -0
- package/dist/output.js.map +1 -0
- package/dist/policy/category.d.ts +5 -0
- package/dist/policy/category.d.ts.map +1 -1
- package/dist/policy/category.js +9 -2
- package/dist/policy/category.js.map +1 -1
- package/dist/policy/index.d.ts +1 -1
- package/dist/policy/index.d.ts.map +1 -1
- package/dist/policy/index.js +1 -1
- package/dist/policy/index.js.map +1 -1
- package/dist/policy/record.d.ts +12 -0
- package/dist/policy/record.d.ts.map +1 -1
- package/dist/policy/record.js +27 -0
- package/dist/policy/record.js.map +1 -1
- package/dist/policy/wakewords.d.ts +4 -0
- package/dist/policy/wakewords.d.ts.map +1 -1
- package/dist/policy/wakewords.js +12 -7
- package/dist/policy/wakewords.js.map +1 -1
- package/dist/query/commands.d.ts +19 -0
- package/dist/query/commands.d.ts.map +1 -0
- package/dist/query/commands.js +40 -0
- package/dist/query/commands.js.map +1 -0
- package/dist/query/detail.d.ts +26 -0
- package/dist/query/detail.d.ts.map +1 -0
- package/dist/query/detail.js +115 -0
- package/dist/query/detail.js.map +1 -0
- package/dist/query/index.d.ts +13 -0
- package/dist/query/index.d.ts.map +1 -0
- package/dist/query/index.js +12 -0
- package/dist/query/index.js.map +1 -0
- package/dist/query/list.d.ts +78 -0
- package/dist/query/list.d.ts.map +1 -0
- package/dist/query/list.js +110 -0
- package/dist/query/list.js.map +1 -0
- package/dist/query/read.d.ts +21 -0
- package/dist/query/read.d.ts.map +1 -0
- package/dist/query/read.js +301 -0
- package/dist/query/read.js.map +1 -0
- package/dist/record/collect.d.ts +18 -0
- package/dist/record/collect.d.ts.map +1 -0
- package/dist/record/collect.js +15 -0
- package/dist/record/collect.js.map +1 -0
- package/dist/record/collectBody.d.ts +29 -0
- package/dist/record/collectBody.d.ts.map +1 -0
- package/dist/record/collectBody.js +196 -0
- package/dist/record/collectBody.js.map +1 -0
- package/dist/record/commands.d.ts +11 -0
- package/dist/record/commands.d.ts.map +1 -0
- package/dist/record/commands.js +22 -0
- package/dist/record/commands.js.map +1 -0
- package/dist/record/index.d.ts +14 -0
- package/dist/record/index.d.ts.map +1 -0
- package/dist/record/index.js +12 -0
- package/dist/record/index.js.map +1 -0
- package/dist/record/receipt.d.ts +16 -0
- package/dist/record/receipt.d.ts.map +1 -0
- package/dist/record/receipt.js +11 -0
- package/dist/record/receipt.js.map +1 -0
- package/dist/record/receiptBody.d.ts +5 -0
- package/dist/record/receiptBody.d.ts.map +1 -0
- package/dist/record/receiptBody.js +112 -0
- package/dist/record/receiptBody.js.map +1 -0
- package/dist/record/scene-batch.d.ts +3 -0
- package/dist/record/scene-batch.d.ts.map +1 -0
- package/dist/record/scene-batch.js +211 -0
- package/dist/record/scene-batch.js.map +1 -0
- package/dist/record/scene-borrow.d.ts +3 -0
- package/dist/record/scene-borrow.d.ts.map +1 -0
- package/dist/record/scene-borrow.js +285 -0
- package/dist/record/scene-borrow.js.map +1 -0
- package/dist/record/scene-collect.d.ts +3 -0
- package/dist/record/scene-collect.d.ts.map +1 -0
- package/dist/record/scene-collect.js +294 -0
- package/dist/record/scene-collect.js.map +1 -0
- package/dist/record/scene-expense.d.ts +3 -0
- package/dist/record/scene-expense.d.ts.map +1 -0
- package/dist/record/scene-expense.js +21 -0
- package/dist/record/scene-expense.js.map +1 -0
- package/dist/record/scene-income.d.ts +3 -0
- package/dist/record/scene-income.d.ts.map +1 -0
- package/dist/record/scene-income.js +219 -0
- package/dist/record/scene-income.js.map +1 -0
- package/dist/record/scene-installment.d.ts +3 -0
- package/dist/record/scene-installment.d.ts.map +1 -0
- package/dist/record/scene-installment.js +248 -0
- package/dist/record/scene-installment.js.map +1 -0
- package/dist/record/scene-lend.d.ts +3 -0
- package/dist/record/scene-lend.d.ts.map +1 -0
- package/dist/record/scene-lend.js +273 -0
- package/dist/record/scene-lend.js.map +1 -0
- package/dist/record/scene-photo.d.ts +3 -0
- package/dist/record/scene-photo.d.ts.map +1 -0
- package/dist/record/scene-photo.js +262 -0
- package/dist/record/scene-photo.js.map +1 -0
- package/dist/record/scene-plain.d.ts +3 -0
- package/dist/record/scene-plain.d.ts.map +1 -0
- package/dist/record/scene-plain.js +221 -0
- package/dist/record/scene-plain.js.map +1 -0
- package/dist/record/scene-refund.d.ts +3 -0
- package/dist/record/scene-refund.d.ts.map +1 -0
- package/dist/record/scene-refund.js +281 -0
- package/dist/record/scene-refund.js.map +1 -0
- package/dist/record/scene-reimburse-done.d.ts +3 -0
- package/dist/record/scene-reimburse-done.d.ts.map +1 -0
- package/dist/record/scene-reimburse-done.js +288 -0
- package/dist/record/scene-reimburse-done.js.map +1 -0
- package/dist/record/scene-reimburse.d.ts +3 -0
- package/dist/record/scene-reimburse.d.ts.map +1 -0
- package/dist/record/scene-reimburse.js +224 -0
- package/dist/record/scene-reimburse.js.map +1 -0
- package/dist/record/scene-repay.d.ts +3 -0
- package/dist/record/scene-repay.d.ts.map +1 -0
- package/dist/record/scene-repay.js +294 -0
- package/dist/record/scene-repay.js.map +1 -0
- package/dist/record/scene-restore.d.ts +3 -0
- package/dist/record/scene-restore.d.ts.map +1 -0
- package/dist/record/scene-restore.js +250 -0
- package/dist/record/scene-restore.js.map +1 -0
- package/dist/record/scene-undo.d.ts +3 -0
- package/dist/record/scene-undo.d.ts.map +1 -0
- package/dist/record/scene-undo.js +262 -0
- package/dist/record/scene-undo.js.map +1 -0
- package/dist/record/scene-update.d.ts +3 -0
- package/dist/record/scene-update.d.ts.map +1 -0
- package/dist/record/scene-update.js +249 -0
- package/dist/record/scene-update.js.map +1 -0
- package/dist/record/scene.d.ts +79 -0
- package/dist/record/scene.d.ts.map +1 -0
- package/dist/record/scene.js +39 -0
- package/dist/record/scene.js.map +1 -0
- package/dist/record/slots.d.ts +16 -0
- package/dist/record/slots.d.ts.map +1 -0
- package/dist/record/slots.js +72 -0
- package/dist/record/slots.js.map +1 -0
- package/dist/record/write.d.ts +9 -0
- package/dist/record/write.d.ts.map +1 -0
- package/dist/record/write.js +186 -0
- package/dist/record/write.js.map +1 -0
- package/dist/render/envelope.d.ts.map +1 -1
- package/dist/render/envelope.js +21 -8
- package/dist/render/envelope.js.map +1 -1
- package/dist/render/errors.d.ts +1 -1
- package/dist/render/errors.d.ts.map +1 -1
- package/dist/render/errors.js.map +1 -1
- package/dist/render/helpFile.d.ts +85 -0
- package/dist/render/helpFile.d.ts.map +1 -0
- package/dist/render/helpFile.js +110 -0
- package/dist/render/helpFile.js.map +1 -0
- package/dist/render/helpPaths.d.ts +19 -0
- package/dist/render/helpPaths.d.ts.map +1 -0
- package/dist/render/helpPaths.js +19 -0
- package/dist/render/helpPaths.js.map +1 -0
- package/dist/render/html.js +1 -1
- package/dist/render/html.js.map +1 -1
- package/dist/render/index.d.ts +5 -1
- package/dist/render/index.d.ts.map +1 -1
- package/dist/render/index.js +4 -1
- package/dist/render/index.js.map +1 -1
- package/dist/render/templates.js +1 -1
- package/dist/render/templates.js.map +1 -1
- package/dist/render/views.d.ts +0 -22
- package/dist/render/views.d.ts.map +1 -1
- package/dist/render/views.js +1 -16
- package/dist/render/views.js.map +1 -1
- package/dist/shared/blockedSlots.d.ts +39 -0
- package/dist/shared/blockedSlots.d.ts.map +1 -0
- package/dist/shared/blockedSlots.js +105 -0
- package/dist/shared/blockedSlots.js.map +1 -0
- package/dist/shared/candidatePick.d.ts +50 -0
- package/dist/shared/candidatePick.d.ts.map +1 -0
- package/dist/shared/candidatePick.js +115 -0
- package/dist/shared/candidatePick.js.map +1 -0
- package/dist/shared/collectFrame.d.ts +15 -0
- package/dist/shared/collectFrame.d.ts.map +1 -0
- package/dist/shared/collectFrame.js +34 -0
- package/dist/shared/collectFrame.js.map +1 -0
- package/dist/shared/commandSpec.d.ts +72 -0
- package/dist/shared/commandSpec.d.ts.map +1 -0
- package/dist/shared/commandSpec.js +2 -0
- package/dist/shared/commandSpec.js.map +1 -0
- package/dist/shared/copyArea.d.ts +51 -0
- package/dist/shared/copyArea.d.ts.map +1 -0
- package/dist/shared/copyArea.js +122 -0
- package/dist/shared/copyArea.js.map +1 -0
- package/dist/shared/diffTable.d.ts +26 -0
- package/dist/shared/diffTable.d.ts.map +1 -0
- package/dist/shared/diffTable.js +77 -0
- package/dist/shared/diffTable.js.map +1 -0
- package/dist/shared/docPage.d.ts +17 -0
- package/dist/shared/docPage.d.ts.map +1 -0
- package/dist/shared/docPage.js +111 -0
- package/dist/shared/docPage.js.map +1 -0
- package/dist/shared/duplicateNote.d.ts +40 -0
- package/dist/shared/duplicateNote.d.ts.map +1 -0
- package/dist/shared/duplicateNote.js +96 -0
- package/dist/shared/duplicateNote.js.map +1 -0
- package/dist/shared/emptyNote.d.ts +15 -0
- package/dist/shared/emptyNote.d.ts.map +1 -0
- package/dist/shared/emptyNote.js +27 -0
- package/dist/shared/emptyNote.js.map +1 -0
- package/dist/shared/errorReceipt.d.ts +21 -0
- package/dist/shared/errorReceipt.d.ts.map +1 -0
- package/dist/shared/errorReceipt.js +37 -0
- package/dist/shared/errorReceipt.js.map +1 -0
- package/dist/shared/flowSteps.d.ts +25 -0
- package/dist/shared/flowSteps.d.ts.map +1 -0
- package/dist/shared/flowSteps.js +49 -0
- package/dist/shared/flowSteps.js.map +1 -0
- package/dist/shared/installmentPreview.d.ts +23 -0
- package/dist/shared/installmentPreview.d.ts.map +1 -0
- package/dist/shared/installmentPreview.js +144 -0
- package/dist/shared/installmentPreview.js.map +1 -0
- package/dist/shared/outsideScan.d.ts +34 -0
- package/dist/shared/outsideScan.d.ts.map +1 -0
- package/dist/shared/outsideScan.js +116 -0
- package/dist/shared/outsideScan.js.map +1 -0
- package/dist/shared/pageIdentity.d.ts +30 -0
- package/dist/shared/pageIdentity.d.ts.map +1 -0
- package/dist/shared/pageIdentity.js +33 -0
- package/dist/shared/pageIdentity.js.map +1 -0
- package/dist/shared/pageShell.d.ts +24 -0
- package/dist/shared/pageShell.d.ts.map +1 -0
- package/dist/shared/pageShell.js +42 -0
- package/dist/shared/pageShell.js.map +1 -0
- package/dist/shared/photoEscape.d.ts +53 -0
- package/dist/shared/photoEscape.d.ts.map +1 -0
- package/dist/shared/photoEscape.js +139 -0
- package/dist/shared/photoEscape.js.map +1 -0
- package/dist/shared/prefillNote.d.ts +21 -0
- package/dist/shared/prefillNote.d.ts.map +1 -0
- package/dist/shared/prefillNote.js +78 -0
- package/dist/shared/prefillNote.js.map +1 -0
- package/dist/shared/receiptParts.d.ts +12 -0
- package/dist/shared/receiptParts.d.ts.map +1 -0
- package/dist/shared/receiptParts.js +38 -0
- package/dist/shared/receiptParts.js.map +1 -0
- package/dist/shared/recentPicks.d.ts +26 -0
- package/dist/shared/recentPicks.d.ts.map +1 -0
- package/dist/shared/recentPicks.js +41 -0
- package/dist/shared/recentPicks.js.map +1 -0
- package/dist/shared/recordPicker.d.ts +32 -0
- package/dist/shared/recordPicker.d.ts.map +1 -0
- package/dist/shared/recordPicker.js +201 -0
- package/dist/shared/recordPicker.js.map +1 -0
- package/dist/shared/rowEditorTable.d.ts +31 -0
- package/dist/shared/rowEditorTable.d.ts.map +1 -0
- package/dist/shared/rowEditorTable.js +103 -0
- package/dist/shared/rowEditorTable.js.map +1 -0
- package/dist/shared/summaryRow.d.ts +44 -0
- package/dist/shared/summaryRow.d.ts.map +1 -0
- package/dist/shared/summaryRow.js +82 -0
- package/dist/shared/summaryRow.js.map +1 -0
- package/dist/shared/typeBadge.d.ts +21 -0
- package/dist/shared/typeBadge.d.ts.map +1 -0
- package/dist/shared/typeBadge.js +68 -0
- package/dist/shared/typeBadge.js.map +1 -0
- package/dist/shared/userWording.d.ts +54 -0
- package/dist/shared/userWording.d.ts.map +1 -0
- package/dist/shared/userWording.js +131 -0
- package/dist/shared/userWording.js.map +1 -0
- package/dist/shared/writeParts.d.ts +62 -0
- package/dist/shared/writeParts.d.ts.map +1 -0
- package/dist/shared/writeParts.js +39 -0
- package/dist/shared/writeParts.js.map +1 -0
- package/dist/triggers/wake-assets.d.ts +37 -0
- package/dist/triggers/wake-assets.d.ts.map +1 -0
- package/dist/triggers/wake-assets.js +951 -0
- package/dist/triggers/wake-assets.js.map +1 -0
- package/package.json +10 -4
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
import type { SerializableEnvelope } from 'base-paint';
|
|
2
|
+
/** 数据表的一行(值一律是已文本化的字符串:表格不吃对象,也不做二次格式化)。
|
|
3
|
+
* 写成 `type` 别名而不是 `interface`:公共层的表格与复制载荷收 `Record<string, unknown>`,
|
|
4
|
+
* 别名形态自带隐式索引签名、能直接过,interface 会被「缺索引签名」挡住。 */
|
|
5
|
+
export type QueryTableRow = {
|
|
6
|
+
readonly id: string;
|
|
7
|
+
readonly time: string;
|
|
8
|
+
readonly category: string;
|
|
9
|
+
readonly amount: string;
|
|
10
|
+
readonly account: string;
|
|
11
|
+
readonly ledger: string;
|
|
12
|
+
readonly note: string;
|
|
13
|
+
};
|
|
14
|
+
/** KPI 行四格的事实(口径来自 `../render/views.js` 的 `calcKpi`,本件只排版、不重算)。 */
|
|
15
|
+
export type QueryKpi = {
|
|
16
|
+
readonly count: number;
|
|
17
|
+
readonly expense: number;
|
|
18
|
+
readonly income: number;
|
|
19
|
+
readonly net: number;
|
|
20
|
+
};
|
|
21
|
+
/** 列表页的出口载荷(=envelope `data`):`items`/`total` 是表里形状的要求,其余是本域给页面看的窗口事实。
|
|
22
|
+
* `items` 是**搬迁前那一份行**(`../render/views.js` 的 `toBillItem` 形状:`id`/`amount` 是数,
|
|
23
|
+
* 下游拿它回查详情),与页面表格行(`QueryTableRow`,文本化)是两件事——一份给机器、一份给人。 */
|
|
24
|
+
export type QueryListData = {
|
|
25
|
+
items: unknown[];
|
|
26
|
+
total: number;
|
|
27
|
+
kpi: QueryKpi;
|
|
28
|
+
/** 单日查(查今天那一族):这一页查的是哪一天;`recent` 那支写 `'recent'`(与搬迁前同值)。 */
|
|
29
|
+
date?: string;
|
|
30
|
+
/** 区间查(查区间那一族):起止日;单条件那支两支都写空串(与搬迁前同值)。 */
|
|
31
|
+
start?: string;
|
|
32
|
+
end?: string;
|
|
33
|
+
/** 条件查(搜备注那一族):`search:<词>`/`tag:<标签>`/`debt`/`reimburse`/`installment`(与搬迁前同值)。 */
|
|
34
|
+
kind?: string;
|
|
35
|
+
};
|
|
36
|
+
/** 详情页的出口载荷(=envelope `data`):`item` 是搬迁前那一份(`toBillItem` 的形状)。 */
|
|
37
|
+
export type QueryDetailData = {
|
|
38
|
+
item: Record<string, unknown>;
|
|
39
|
+
};
|
|
40
|
+
/** 列表页的入参:这一页是谁(命令名/唤醒词/窗口)+ 查到什么(行与 KPI)+ 空态说什么 + 复制日志的取数。 */
|
|
41
|
+
export interface QueryListInput {
|
|
42
|
+
/** 对外命令名(`bill.record.today`),页标记与复制日志的调用链都读它。 */
|
|
43
|
+
readonly key: string;
|
|
44
|
+
/** 本次参数(复制日志那行命令原文照它拼,可照抄重跑)。 */
|
|
45
|
+
readonly params: Record<string, unknown>;
|
|
46
|
+
/** 本次 envelope 的形状(`list`/`detail`,页标记 `data-shape` 取它,是契约)。 */
|
|
47
|
+
readonly shape: string;
|
|
48
|
+
/** 页标题=用户说的那条唤醒词(能判出来的那几条按参数判,判不出的按本命令的代表词)。 */
|
|
49
|
+
readonly wakeWord: string;
|
|
50
|
+
/** 这一页查的是哪一段(副标题):日期/区间/条件说明。笔数不在这里——它有自己的胶囊行。 */
|
|
51
|
+
readonly window: string;
|
|
52
|
+
/** 结果胶囊(副标题之下、KPI 之上):如 `共 8 笔`。行内 `·` 不许进版式位(t407 用户语言整改同口径),
|
|
53
|
+
* 有几个事实就出几枚胶囊,不用一行串拼起来。 */
|
|
54
|
+
readonly chips: readonly string[];
|
|
55
|
+
/** 数据表的行。 */
|
|
56
|
+
readonly rows: readonly QueryTableRow[];
|
|
57
|
+
readonly kpi: QueryKpi;
|
|
58
|
+
/** 零行时那句话。 */
|
|
59
|
+
readonly emptyText: string;
|
|
60
|
+
/** 零行时那句引导(说清下一步该说什么词)。 */
|
|
61
|
+
readonly emptyHint: string;
|
|
62
|
+
/** 复制载荷:**本次查询的 envelope 本身**(`skill`/`shape`/`key`/`data`),复制区直接序列化它。 */
|
|
63
|
+
readonly envelope: SerializableEnvelope;
|
|
64
|
+
/** 本次数据来源(复制日志第 3 段)。 */
|
|
65
|
+
readonly source: string;
|
|
66
|
+
/** 本次执行时刻(复制日志第 5 段)。 */
|
|
67
|
+
readonly actionAt: string;
|
|
68
|
+
}
|
|
69
|
+
/** 通用查询列表页:一整页(页头 + 结果胶囊 + KPI 行 + 数据表或空态 + 复制区)。
|
|
70
|
+
* 数据表包一层 `.bill-query-wide`:7 列密表在桌面要铺满版心(base 表卡 `max-width:680px` 是给窄表定的,
|
|
71
|
+
* 判据见 `docPage.ts` 的 P1;空态分支不包——空态没有宽度问题)。 */
|
|
72
|
+
export declare function queryListDoc(input: QueryListInput): string;
|
|
73
|
+
/** 复制载荷那份 envelope 的取值口径(**唯一定义地**):技能名/版本由公共标识给、场景名过 `sceneKeyOf`,
|
|
74
|
+
* `data` 就是本次命令返回给出口的那一份载荷(同一件事不在页里再拼一遍)。列表与详情各一支——
|
|
75
|
+
* 形状与载荷必须成对,两支分开就写不出「list 配 detail 载荷」这种错。 */
|
|
76
|
+
export declare function listEnvelope(key: string, data: QueryListData): SerializableEnvelope;
|
|
77
|
+
export declare function detailEnvelope(key: string, data: QueryDetailData): SerializableEnvelope;
|
|
78
|
+
//# sourceMappingURL=list.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"list.d.ts","sourceRoot":"","sources":["../../src/query/list.ts"],"names":[],"mappings":"AAkCA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAC;AAMvD;;+CAE+C;AAC/C,MAAM,MAAM,aAAa,GAAG;IAC1B,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;CACvB,CAAC;AAEF,mEAAmE;AACnE,MAAM,MAAM,QAAQ,GAAG;IACrB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;CACtB,CAAC;AAEF;;6DAE6D;AAC7D,MAAM,MAAM,aAAa,GAAG;IAC1B,KAAK,EAAE,OAAO,EAAE,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,QAAQ,CAAC;IACd,6DAA6D;IAC7D,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,2CAA2C;IAC3C,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,oFAAoF;IACpF,IAAI,CAAC,EAAE,MAAM,CAAC;CACf,CAAC;AAEF,mEAAmE;AACnE,MAAM,MAAM,eAAe,GAAG;IAC5B,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAC/B,CAAC;AAEF,+DAA+D;AAC/D,MAAM,WAAW,cAAc;IAC7B,kDAAkD;IAClD,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,iCAAiC;IACjC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACzC,gEAAgE;IAChE,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,gDAAgD;IAChD,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,kDAAkD;IAClD,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB;gCAC4B;IAC5B,QAAQ,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,CAAC;IAClC,aAAa;IACb,QAAQ,CAAC,IAAI,EAAE,SAAS,aAAa,EAAE,CAAC;IACxC,QAAQ,CAAC,GAAG,EAAE,QAAQ,CAAC;IACvB,cAAc;IACd,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,2BAA2B;IAC3B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,0EAA0E;IAC1E,QAAQ,CAAC,QAAQ,EAAE,oBAAoB,CAAC;IACxC,yBAAyB;IACzB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,yBAAyB;IACzB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;CAC3B;AA+BD;;+CAE+C;AAC/C,wBAAgB,YAAY,CAAC,KAAK,EAAE,cAAc,GAAG,MAAM,CAiC1D;AAED;;+CAE+C;AAC/C,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,aAAa,GAAG,oBAAoB,CAEnF;AAED,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,eAAe,GAAG,oBAAoB,CAEvF"}
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
/** 通用查询列表页(查询域的**列表装配件**):KPI 行 + 数据表(零行走空态)+ 复制数据/日志 + 页壳。
|
|
2
|
+
*
|
|
3
|
+
* 谁在用(两个调用点,指名):`src/query/read.ts` 的四条读命令各出一页——
|
|
4
|
+
* `viewRecordToday`(查今天那一族)与 `viewRecordRange`(查区间那一族)走列表,
|
|
5
|
+
* `viewRecordSearch`(搜备注那一族)同形,`viewRecordDetail`(查账单详情)本票先借用同一种版式
|
|
6
|
+
* (单条也出一行;详情页的专属版式是 #415 那张票的事)。
|
|
7
|
+
*
|
|
8
|
+
* 三源融合(老 `templates/query_view.html` + 新迁移产物 + 外界取法;老侧逐块清单与逐块裁定见
|
|
9
|
+
* `docs/skills/skill-bill/t411-查询域-老模板逐块清单.md`,本件是那份清单的落地):
|
|
10
|
+
* - **留**(老页留用的块):KPI 行(老页 6 处 KPI 行共用同一套数:笔数/支出/收入/净额)+
|
|
11
|
+
* 明细列表(老页 `recordsList`:时间/分类/备注/金额带符号)+ 空态(老页 8 处 `emptyState`)+
|
|
12
|
+
* 复制数据/日志两条通道(老页动作区);
|
|
13
|
+
* - **舍**(老页不搬的部分):客户端 JS 渲染(老页把 payload 注入 `<script id="payload">` 再由
|
|
14
|
+
* `recordsList`/`kpiCard`/`init` 的路由表当场拼 DOM;新架构在 Node 侧渲染成静态页)+
|
|
15
|
+
* 自绘样式层与 `.records/.record` 版式(改走公共层组件)+ `CHARTS-HELPERS` 与环形图挂钩
|
|
16
|
+
* (老页只有 breakdown 用,17 词里没有该路径)+ 对比卡(老页 `compareCard`,属分析域)+
|
|
17
|
+
* 离线提示条与页脚的 `type` 代码(老侧机制块,静态页没有这两个成因);
|
|
18
|
+
* - **改**(新页比老页多的):语义表格(`renderDataTable`:`table/thead/th/td` + 窄屏每格
|
|
19
|
+
* `data-label` 行卡化,零行自带空表兜底)=老自绘 grid 拿不到的可访问性与手机端表现;
|
|
20
|
+
* KPI 走公共层 `renderKpiGrid`(数值走等宽数字字形对齐);空态用 `renderEmptyBlock`(多一句「下一步说什么」);
|
|
21
|
+
* 复制区走公共层三格式菜单(纯文本/JSON/CSV)。
|
|
22
|
+
*
|
|
23
|
+
* **本票不搬的老页块(留给页面票,不是漏项)**:分类聚合卡(`categoryBar` 前 8 类)与过滤芯片
|
|
24
|
+
* (老页 `:280`/`:287` 的 `data.filter`/占比芯片)——票面把骨架块序写死为「KPI 行+数据表+空态+复制区」四块,
|
|
25
|
+
* 这两块是**每个词各自的页**上的事(#412~#415);老页记录列表的 200 条显示上限同理:
|
|
26
|
+
* 老页是显示截断(`:524` `slice(0,200)` + `:533` 追一行提示),本票不截断、也不分页,
|
|
27
|
+
* 条数窗口细则随页面票定(地图「Not yet specified」原有此条)。
|
|
28
|
+
*
|
|
29
|
+
* 数据表的列(本页**唯一一处**定义;表头文本与每格 `data-label` 同源,不存在两处文案):
|
|
30
|
+
* 时间/分类/金额/账户/账本/备注/编号——「编号」列留着是为了说得出口的下一步:
|
|
31
|
+
* 用户拿它就能说「查账单详情」(老页没有这一列、也没有 detail 分支;这是新仓补的读链)。
|
|
32
|
+
*/
|
|
33
|
+
import { renderChips, renderDataTable, renderEmptyBlock, renderKpiGrid } from 'base-paint/blocks';
|
|
34
|
+
import { copyArea, copyLog } from '../shared/copyArea.js';
|
|
35
|
+
import { DOC_SKILL, DOC_TITLE, DOC_VERSION, sceneKeyOf } from '../shared/pageIdentity.js';
|
|
36
|
+
import { pageShell } from '../shared/pageShell.js';
|
|
37
|
+
import { commandLine } from '../shared/writeParts.js';
|
|
38
|
+
/** 数据表的列(**唯一定义地**):表头文本、列序与对齐档。 */
|
|
39
|
+
const COLUMNS = [
|
|
40
|
+
{ key: 'time', label: '时间' },
|
|
41
|
+
{ key: 'category', label: '分类' },
|
|
42
|
+
{ key: 'amount', label: '金额', align: 'right' },
|
|
43
|
+
{ key: 'account', label: '账户' },
|
|
44
|
+
{ key: 'ledger', label: '账本' },
|
|
45
|
+
{ key: 'note', label: '备注' },
|
|
46
|
+
{ key: 'id', label: '编号' },
|
|
47
|
+
];
|
|
48
|
+
/** 合计金额的文本(两位小数)。
|
|
49
|
+
* **不是** `src/shared/summaryRow.ts` 的 `money2`:那一件是「用户给的那一笔金额」的口径(0 与缺省都写「未给」),
|
|
50
|
+
* 这里是**合计**——合计为 0 是一个真实读数(这一天没花钱),写成「未给」就是撒谎。两件事,两个定义。 */
|
|
51
|
+
function sumText(n) {
|
|
52
|
+
return (Number.isFinite(n) ? n : 0).toFixed(2);
|
|
53
|
+
}
|
|
54
|
+
/** KPI 行四格:笔数/支出/收入/净额(净额=收入−支出,口径由 `calcKpi` 算好,本件只摆版式)。
|
|
55
|
+
* 笔数卡不带单位:label 已是「笔数」,再跟一个「笔」字就是同一件事说两遍。 */
|
|
56
|
+
function kpiCards(kpi) {
|
|
57
|
+
return [
|
|
58
|
+
{ label: '笔数', value: String(kpi.count), detail: '转账不计进收支' },
|
|
59
|
+
{ label: '支出', value: sumText(kpi.expense), detail: '本页支出合计' },
|
|
60
|
+
{ label: '收入', value: sumText(kpi.income), detail: '本页收入合计' },
|
|
61
|
+
{ label: '净额', value: sumText(kpi.net), detail: '收入减支出' },
|
|
62
|
+
];
|
|
63
|
+
}
|
|
64
|
+
/** 通用查询列表页:一整页(页头 + 结果胶囊 + KPI 行 + 数据表或空态 + 复制区)。
|
|
65
|
+
* 数据表包一层 `.bill-query-wide`:7 列密表在桌面要铺满版心(base 表卡 `max-width:680px` 是给窄表定的,
|
|
66
|
+
* 判据见 `docPage.ts` 的 P1;空态分支不包——空态没有宽度问题)。 */
|
|
67
|
+
export function queryListDoc(input) {
|
|
68
|
+
const table = input.rows.length === 0
|
|
69
|
+
? renderEmptyBlock({ text: input.emptyText, hint: input.emptyHint })
|
|
70
|
+
: '<div class="bill-query-wide">' + renderDataTable({ columns: COLUMNS, rows: input.rows, caption: '查到的记录', emptyText: input.emptyText }) + '</div>';
|
|
71
|
+
const content = [
|
|
72
|
+
renderChips({ items: input.chips.map((text) => ({ text })) }),
|
|
73
|
+
renderKpiGrid(kpiCards(input.kpi)),
|
|
74
|
+
table,
|
|
75
|
+
copyArea({
|
|
76
|
+
data: { envelope: input.envelope, title: input.wakeWord },
|
|
77
|
+
log: {
|
|
78
|
+
envelope: input.envelope,
|
|
79
|
+
copyLog: copyLog({
|
|
80
|
+
command: commandLine(input.key, input.params),
|
|
81
|
+
source: input.source,
|
|
82
|
+
detail: '查到 ' + input.rows.length + ' 笔',
|
|
83
|
+
actionAt: input.actionAt,
|
|
84
|
+
version: DOC_VERSION,
|
|
85
|
+
}),
|
|
86
|
+
},
|
|
87
|
+
}),
|
|
88
|
+
].join('');
|
|
89
|
+
return pageShell({
|
|
90
|
+
docTitle: DOC_TITLE + '·查询',
|
|
91
|
+
title: input.wakeWord,
|
|
92
|
+
subtitle: input.window,
|
|
93
|
+
slot: 'list',
|
|
94
|
+
page: 'list',
|
|
95
|
+
shape: input.shape,
|
|
96
|
+
key: input.key,
|
|
97
|
+
domain: 'query',
|
|
98
|
+
content,
|
|
99
|
+
});
|
|
100
|
+
}
|
|
101
|
+
/** 复制载荷那份 envelope 的取值口径(**唯一定义地**):技能名/版本由公共标识给、场景名过 `sceneKeyOf`,
|
|
102
|
+
* `data` 就是本次命令返回给出口的那一份载荷(同一件事不在页里再拼一遍)。列表与详情各一支——
|
|
103
|
+
* 形状与载荷必须成对,两支分开就写不出「list 配 detail 载荷」这种错。 */
|
|
104
|
+
export function listEnvelope(key, data) {
|
|
105
|
+
return { version: DOC_VERSION, skill: DOC_SKILL, shape: 'list', key: sceneKeyOf(key), data };
|
|
106
|
+
}
|
|
107
|
+
export function detailEnvelope(key, data) {
|
|
108
|
+
return { version: DOC_VERSION, skill: DOC_SKILL, shape: 'detail', key: sceneKeyOf(key), data };
|
|
109
|
+
}
|
|
110
|
+
//# sourceMappingURL=list.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"list.js","sourceRoot":"","sources":["../../src/query/list.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import type { BillDb } from '../fetch/index.js';
|
|
2
|
+
import type { ViewOut } from '../shared/commandSpec.js';
|
|
3
|
+
/** `bill.record.today`:查今天/查昨天/查某天(带 `date`)/查最近(`recent:true` + `limit` 1~200)/查账单。
|
|
4
|
+
* 当日无记录不是故障:照实出一张零行的页(老侧在 stderr 上留的那句 NOTE,本票改由页面上的空态承担)。 */
|
|
5
|
+
export declare function viewRecordToday(params: Record<string, unknown>, db: BillDb): ViewOut;
|
|
6
|
+
/** `bill.record.range`:查周/查月(`range`+锚点:周一..锚点/月初..锚点)/
|
|
7
|
+
* 查区间(`start`+`end` 同给,缺一即用法错 exit 2)/查分类(三级,无 / 视为 L1)/
|
|
8
|
+
* 查账户/查账本(只过滤:KPI 照窗内收支、转账除外,余额无关)。
|
|
9
|
+
* 区间查不到记录 → 阻断(exit 4),不返一张空表冒充正常。 */
|
|
10
|
+
export declare function viewRecordRange(params: Record<string, unknown>, db: BillDb): ViewOut;
|
|
11
|
+
/** `bill.record.search`:搜备注(`q` 必给)/查标签(`kind:"tag"` + `tag` 必给,精确匹配)/
|
|
12
|
+
* 查欠款(`kind:"debt"`)/查待报销(`kind:"reimburse"`)/查分期(`kind:"installment"`)。
|
|
13
|
+
* 空查询不返全量:既没 `q` 也没 `kind` → exit 2。 */
|
|
14
|
+
export declare function viewRecordSearch(params: Record<string, unknown>, db: BillDb): ViewOut;
|
|
15
|
+
/** `bill.record.detail`:查账单详情(`id` 必给,#415 专属版式)。
|
|
16
|
+
* 取数含软删行(`fetchAll includeDeleted` 经取数公开接口,不另写比对):真无此号才抛
|
|
17
|
+
* `BILL_RECORD_NOT_FOUND`(exit 4),已撤销走整页+已撤销徽,不冒充正常。
|
|
18
|
+
* 载荷 `item` 照搬迁前形状(`toBillItem` 8 字段)原样保留,另加 `created_at/deleted_at`
|
|
19
|
+
* 两列(加法式,旧 8 字段一字不动);页面字段表 10 列全交代,见 `./detail.js`。 */
|
|
20
|
+
export declare function viewRecordDetail(params: Record<string, unknown>, db: BillDb): ViewOut;
|
|
21
|
+
//# sourceMappingURL=read.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"read.d.ts","sourceRoot":"","sources":["../../src/query/read.ts"],"names":[],"mappings":"AAqBA,OAAO,KAAK,EAAE,MAAM,EAAW,MAAM,mBAAmB,CAAC;AAIzD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,0BAA0B,CAAC;AA4ExD;+DAC+D;AAC/D,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO,CA0BpF;AAuCD;;;uCAGuC;AACvC,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO,CA2CpF;AAoBD;;yCAEyC;AACzC,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO,CAgDrF;AAED;;;;wDAIwD;AACxD,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO,CAqBrF"}
|
|
@@ -0,0 +1,301 @@
|
|
|
1
|
+
/** 查询域四条命令的处理体(**从 `src/cli/cmd_read.ts` 归位到这里**):
|
|
2
|
+
* `bill.record.today`(查今天/查昨天/查某天/查最近/查账单)/
|
|
3
|
+
* `bill.record.range`(查周/查月/查区间/查分类/查账户/查账本)/
|
|
4
|
+
* `bill.record.search`(搜备注/查标签/查欠款/查待报销/查分期)/
|
|
5
|
+
* `bill.record.detail`(查账单详情)。一条命令一处,出口 `src/cli/cmd_read.ts` 只查注册表再调本域的门。
|
|
6
|
+
*
|
|
7
|
+
* **红线(本域既有语义,本次搬迁一字不改,逐条有测试钉着)**:
|
|
8
|
+
* - 空查询不返全量:`search` 既没 `q` 也没 `kind` → exit 2;`range` 既没 start/end 也没条件 → exit 2;
|
|
9
|
+
* - 坏输入阻断不冒充正常:区间查不到记录 → exit 4(不出一张空表冒充「查过了」);`detail` 查无此号 → exit 4;
|
|
10
|
+
* - `#tag` 精确匹配走取数层的 `listByTag`(本件不重写比对);
|
|
11
|
+
* - 时间缺时分由 `../policy` 的 `resolveQueryDate`/`resolveRange` 补,本件不自己算日期。
|
|
12
|
+
*
|
|
13
|
+
* 分工:取数走 `../fetch`、口径走 `../policy`、整页装配走 `./list.js`;本件只做**编排与页面入参装配**。
|
|
14
|
+
* KPI 的四项口径(`calcKpi`)与行投影(`toBillItem`)引 `../render/views.js` 的同名件——
|
|
15
|
+
* 分析域三条命令与写域回执也在用同一份,本票不搬它(那是「读命令搬迁」整条线的账,记在这里作**搬迁债务**)。
|
|
16
|
+
* 与写命令的处理体(`../record/write.ts`)不同的一点:查询没有「阻断改出过程型页」那一支——
|
|
17
|
+
* 查询缺参就是缺参,阻断即错误回执,页面只在真取到数(哪怕是零行)时出。
|
|
18
|
+
*/
|
|
19
|
+
import { DB_FILENAME, BillFetchError, fetchAll, listByTag, listToday, searchKeyword, tagMatch, } from '../fetch/index.js';
|
|
20
|
+
import { BillPolicyError } from '../fetch/errors.js';
|
|
21
|
+
import { needId, normalizeDate, resolveQueryDate, resolveRange, validateCategory, yesterdayStr } from '../policy/index.js';
|
|
22
|
+
import { calcKpi, toBillItem } from '../render/views.js';
|
|
23
|
+
import { actionStamp } from '../shared/copyArea.js';
|
|
24
|
+
import { detailEnvelope, listEnvelope, queryListDoc } from './list.js';
|
|
25
|
+
import { queryDetailDoc } from './detail.js';
|
|
26
|
+
/** 本次数据来源(复制日志第 3 段):库文件名逐字取本包常量,共用件不取本包文件名。 */
|
|
27
|
+
const SOURCE_QUERY = DB_FILENAME + '(查询结果:只读,不改库)';
|
|
28
|
+
/** 一条库行 → 表格行(值一律文本化;金额照库里的符号写两位小数:支出负数、收入正数)。 */
|
|
29
|
+
function tableRow(r) {
|
|
30
|
+
return {
|
|
31
|
+
id: String(r.id),
|
|
32
|
+
time: r.time,
|
|
33
|
+
category: r.category,
|
|
34
|
+
amount: r.amount.toFixed(2),
|
|
35
|
+
account: r.account,
|
|
36
|
+
ledger: r.ledger,
|
|
37
|
+
note: r.note,
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
/** 四条命令共用的收口:把「查到什么」装配成出口载荷(envelope `data`)+ 一整页列表。
|
|
41
|
+
* **载荷与页面同源但不同形**:载荷那一份照搬迁前的字段与类型(`items` 走 `toBillItem`,`id`/`amount` 是数,
|
|
42
|
+
* 下游按 id 再查详情走的就是它);页面那一份是文本化的表格行(`tableRow`)。两者都由同一个 `records` 派生。
|
|
43
|
+
* KPI 只算一次(`calcKpi`),既进载荷也进页面的 KPI 行。 */
|
|
44
|
+
function listOut(input) {
|
|
45
|
+
const records = [...input.records];
|
|
46
|
+
const rows = records.map(tableRow);
|
|
47
|
+
const kpi = calcKpi(records);
|
|
48
|
+
const data = { items: records.map(toBillItem), total: records.length, ...input.extra, kpi };
|
|
49
|
+
return {
|
|
50
|
+
data,
|
|
51
|
+
html: queryListDoc({
|
|
52
|
+
key: input.key,
|
|
53
|
+
params: input.params,
|
|
54
|
+
shape: 'list',
|
|
55
|
+
wakeWord: input.wakeWord,
|
|
56
|
+
window: input.window,
|
|
57
|
+
chips: ['共 ' + records.length + ' 笔'],
|
|
58
|
+
rows,
|
|
59
|
+
kpi,
|
|
60
|
+
emptyText: input.emptyText,
|
|
61
|
+
emptyHint: input.emptyHint,
|
|
62
|
+
envelope: listEnvelope(input.key, data),
|
|
63
|
+
source: SOURCE_QUERY,
|
|
64
|
+
actionAt: actionStamp(),
|
|
65
|
+
}),
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
/** today 分支的标题判(**唯一判地**):recent 不进本支(上游已分流);
|
|
69
|
+
* yesterday→查昨天/显式 date→查某天/无参→查今天(查账单别名同页,无入口标记)。 */
|
|
70
|
+
function todayWakeWord(params) {
|
|
71
|
+
if (params.date === 'yesterday')
|
|
72
|
+
return '查昨天';
|
|
73
|
+
if (params.date !== undefined && params.date !== null && params.date !== '')
|
|
74
|
+
return '查某天';
|
|
75
|
+
return '查今天';
|
|
76
|
+
}
|
|
77
|
+
/** today 分支的空态四句(**唯一判地**):今天/昨天/某天/最近各一句;
|
|
78
|
+
* 查某天自指已摘(不说「查某天」,说换个日子再查一次)。 */
|
|
79
|
+
function todayEmpty(params) {
|
|
80
|
+
if (params.date === 'yesterday')
|
|
81
|
+
return { emptyText: '昨天还没有记录', emptyHint: '要补昨天那笔就说「记支出」。' };
|
|
82
|
+
if (params.date !== undefined && params.date !== null && params.date !== '')
|
|
83
|
+
return { emptyText: '这一天没有记录', emptyHint: '要记一笔就说「记支出」。换个日子再查一次。' };
|
|
84
|
+
return { emptyText: '今天还没有记录', emptyHint: '要记一笔就说「记支出」。' };
|
|
85
|
+
}
|
|
86
|
+
/** `bill.record.today`:查今天/查昨天/查某天(带 `date`)/查最近(`recent:true` + `limit` 1~200)/查账单。
|
|
87
|
+
* 当日无记录不是故障:照实出一张零行的页(老侧在 stderr 上留的那句 NOTE,本票改由页面上的空态承担)。 */
|
|
88
|
+
export function viewRecordToday(params, db) {
|
|
89
|
+
const key = 'bill.record.today';
|
|
90
|
+
if (params.recent === true) {
|
|
91
|
+
const limit = params.limit === undefined ? 10 : params.limit;
|
|
92
|
+
if (!Number.isInteger(limit) || limit < 1 || limit > 200) {
|
|
93
|
+
throw new BillPolicyError('POLICY_BAD_INPUT', 'recent limit 须为 1~200 的整数:' + String(limit));
|
|
94
|
+
}
|
|
95
|
+
const records = fetchAll(db)
|
|
96
|
+
.sort((a, b) => b.time.localeCompare(a.time) || b.id - a.id)
|
|
97
|
+
.slice(0, limit);
|
|
98
|
+
return listOut({
|
|
99
|
+
key, params, wakeWord: '查最近', window: '最近 ' + String(limit) + ' 笔(按时间倒序)', records,
|
|
100
|
+
extra: { date: 'recent' },
|
|
101
|
+
emptyText: '库里还没有记录',
|
|
102
|
+
emptyHint: '要记一笔就说「记支出」。',
|
|
103
|
+
});
|
|
104
|
+
}
|
|
105
|
+
const date = params.date === 'yesterday' ? yesterdayStr() : resolveQueryDate(params);
|
|
106
|
+
const records = listToday(db, date);
|
|
107
|
+
const empty = todayEmpty(params);
|
|
108
|
+
return listOut({
|
|
109
|
+
key, params, wakeWord: todayWakeWord(params), window: date + ' 这一天', records,
|
|
110
|
+
extra: { date },
|
|
111
|
+
emptyText: empty.emptyText,
|
|
112
|
+
emptyHint: empty.emptyHint,
|
|
113
|
+
});
|
|
114
|
+
}
|
|
115
|
+
/** #413 · 区间查的「今天」锚点(与卡路里 #250 同序,种子日期不写死):
|
|
116
|
+
* 显式 `today` 参数 > 环境 `BILL_TODAY` > 机器时钟(UTC 日)。
|
|
117
|
+
* 种子日期只活在参数/环境里,不进源码;测试一律传相对日期。
|
|
118
|
+
* 分析侧的整周/整月仍是 `../policy` 的 `weekRange/monthRange`(`cmd_read.ts` 在用),
|
|
119
|
+
* 下面两件是查询侧截到锚点的窗口(未来不计),两处各管一摊。 */
|
|
120
|
+
function rangeAnchor(params) {
|
|
121
|
+
const t = params.today;
|
|
122
|
+
if (t !== undefined && t !== null && t !== '')
|
|
123
|
+
return normalizeDate(t, 'today');
|
|
124
|
+
const pin = process.env['BILL_TODAY'];
|
|
125
|
+
if (pin !== undefined && /^\d{4}-\d{2}-\d{2}$/.test(pin))
|
|
126
|
+
return normalizeDate(pin, 'BILL_TODAY');
|
|
127
|
+
return new Date().toISOString().slice(0, 10);
|
|
128
|
+
}
|
|
129
|
+
/** #413 · 周一..锚点(UTC,周一为第一天;截到锚点,未来不计,与 #250「本周」同义)。 */
|
|
130
|
+
function weekWindowFrom(anchor) {
|
|
131
|
+
const t = Date.parse(anchor + 'T12:00:00Z');
|
|
132
|
+
const back = (new Date(t).getUTCDay() + 6) % 7;
|
|
133
|
+
const mon = new Date(t - back * 86400000).toISOString().slice(0, 10);
|
|
134
|
+
return { start: mon, end: anchor };
|
|
135
|
+
}
|
|
136
|
+
/** #413 · 月初..锚点(月初到锚点,未来不计,与 #250「本月」同义)。 */
|
|
137
|
+
function monthWindowFrom(anchor) {
|
|
138
|
+
return { start: anchor.slice(0, 8) + '01', end: anchor };
|
|
139
|
+
}
|
|
140
|
+
/** #413 · 单条件取值:缺席→undefined(无此条件);空串/全空格/非串→阻断 exit 2。
|
|
141
|
+
* 空值不许悄悄退化成无条件全量(取数层 `fetchAll` 遇空串会忽略该条件,G2-2 穿透)。 */
|
|
142
|
+
function condValue(params, field) {
|
|
143
|
+
const v = params[field];
|
|
144
|
+
if (v === undefined || v === null)
|
|
145
|
+
return undefined;
|
|
146
|
+
if (typeof v !== 'string' || !v.trim()) {
|
|
147
|
+
throw new BillPolicyError('POLICY_BAD_INPUT', field + ' 不得为空(空查询不返全量)');
|
|
148
|
+
}
|
|
149
|
+
return v.trim();
|
|
150
|
+
}
|
|
151
|
+
/** `bill.record.range`:查周/查月(`range`+锚点:周一..锚点/月初..锚点)/
|
|
152
|
+
* 查区间(`start`+`end` 同给,缺一即用法错 exit 2)/查分类(三级,无 / 视为 L1)/
|
|
153
|
+
* 查账户/查账本(只过滤:KPI 照窗内收支、转账除外,余额无关)。
|
|
154
|
+
* 区间查不到记录 → 阻断(exit 4),不返一张空表冒充正常。 */
|
|
155
|
+
export function viewRecordRange(params, db) {
|
|
156
|
+
const key = 'bill.record.range';
|
|
157
|
+
const rawCategory = condValue(params, 'category');
|
|
158
|
+
const category = rawCategory === undefined ? undefined : validateCategory(rawCategory);
|
|
159
|
+
const account = condValue(params, 'account');
|
|
160
|
+
const ledger = condValue(params, 'ledger');
|
|
161
|
+
const cond = { category, account, ledger };
|
|
162
|
+
if (params.range === 'week' || params.range === 'month') {
|
|
163
|
+
const anchor = rangeAnchor(params);
|
|
164
|
+
const { start, end } = params.range === 'week' ? weekWindowFrom(anchor) : monthWindowFrom(anchor);
|
|
165
|
+
const records = fetchAll(db, { fromTime: start + ' 00:00:00', toTime: end + ' 23:59:59', ...cond });
|
|
166
|
+
if (!records.length)
|
|
167
|
+
throw new BillFetchError('BILL_EMPTY_RANGE', `区间无记录:${start}~${end}(缺失阻断,不返空统计)`);
|
|
168
|
+
return listOut({
|
|
169
|
+
key, params, wakeWord: params.range === 'week' ? '查周' : '查月',
|
|
170
|
+
window: start + ' ~ ' + end + (params.range === 'week' ? '(本周)' : '(本月)'),
|
|
171
|
+
records, extra: { start, end },
|
|
172
|
+
emptyText: '这一段没有记录',
|
|
173
|
+
emptyHint: '换个起止日期再查一次。',
|
|
174
|
+
});
|
|
175
|
+
}
|
|
176
|
+
if (params.start !== undefined || params.end !== undefined) {
|
|
177
|
+
const { start, end } = resolveRange(params);
|
|
178
|
+
const records = fetchAll(db, { fromTime: start + ' 00:00:00', toTime: end + ' 23:59:59', ...cond });
|
|
179
|
+
if (!records.length)
|
|
180
|
+
throw new BillFetchError('BILL_EMPTY_RANGE', `区间无记录:${start}~${end}(缺失阻断,不返空统计)`);
|
|
181
|
+
return listOut({
|
|
182
|
+
key, params, wakeWord: '查区间', window: start + ' ~ ' + end, records, extra: { start, end },
|
|
183
|
+
emptyText: '这一段没有记录',
|
|
184
|
+
emptyHint: '换个起止日期再查一次。',
|
|
185
|
+
});
|
|
186
|
+
}
|
|
187
|
+
if (category !== undefined || account !== undefined || ledger !== undefined) {
|
|
188
|
+
const records = fetchAll(db, cond);
|
|
189
|
+
if (!records.length)
|
|
190
|
+
throw new BillFetchError('BILL_EMPTY_RANGE', '条件无记录(缺失阻断,不返空统计)');
|
|
191
|
+
const by = category !== undefined ? '分类' : account !== undefined ? '账户' : '账本';
|
|
192
|
+
const value = String(category ?? account ?? ledger);
|
|
193
|
+
return listOut({
|
|
194
|
+
key, params, wakeWord: '查' + by, window: by + '=' + value + '(全部时间)', records,
|
|
195
|
+
extra: { start: '', end: '' },
|
|
196
|
+
emptyText: '这个条件没有记录',
|
|
197
|
+
emptyHint: '换个条件,或说「查区间」并给出起止日期。',
|
|
198
|
+
});
|
|
199
|
+
}
|
|
200
|
+
throw new BillPolicyError('POLICY_BAD_INPUT', '缺槽位 start/end(或 range=week/month,或 category/account/ledger 条件)');
|
|
201
|
+
}
|
|
202
|
+
/** #414 · 查欠款行判(**唯一判地**):借贷分类或带 `#未还` 精确,且未带 `#已还` 精确。
|
|
203
|
+
* 已还排除的理由:收回/偿还后原记录分类仍是 `借贷/*`(换的只是 tag),不排除就把还清的也算成还欠着。 */
|
|
204
|
+
function isDebtRow(r) {
|
|
205
|
+
return (r.category.startsWith('借贷/') || tagMatch(r.note, '未还')) && !tagMatch(r.note, '已还');
|
|
206
|
+
}
|
|
207
|
+
/** #414 · 查待报销行判(**唯一判地**):带 `#待报销` 精确,且未带 `#已报销` 精确。
|
|
208
|
+
* 到账后消 `#待报销` 补 `#已报销`(写侧 `scene-reimburse-done.ts`),残留双标也不算等着报销。 */
|
|
209
|
+
function isReimburseRow(r) {
|
|
210
|
+
return tagMatch(r.note, '待报销') && !tagMatch(r.note, '已报销');
|
|
211
|
+
}
|
|
212
|
+
/** #414 · 查分期行判(**唯一判地**):分期分类或带 `#分期`/`#分期中` 精确。
|
|
213
|
+
* 票面写“分期中”口径,代码旧口径只有 `#分期` 子串;写侧记分期不落 `#tag`(分类是主口径),两串并存。 */
|
|
214
|
+
function isInstallmentRow(r) {
|
|
215
|
+
return r.category.startsWith('分期/') || tagMatch(r.note, '分期') || tagMatch(r.note, '分期中');
|
|
216
|
+
}
|
|
217
|
+
/** `bill.record.search`:搜备注(`q` 必给)/查标签(`kind:"tag"` + `tag` 必给,精确匹配)/
|
|
218
|
+
* 查欠款(`kind:"debt"`)/查待报销(`kind:"reimburse"`)/查分期(`kind:"installment"`)。
|
|
219
|
+
* 空查询不返全量:既没 `q` 也没 `kind` → exit 2。 */
|
|
220
|
+
export function viewRecordSearch(params, db) {
|
|
221
|
+
const key = 'bill.record.search';
|
|
222
|
+
const kind = params.kind === undefined ? '' : String(params.kind);
|
|
223
|
+
let records;
|
|
224
|
+
let wakeWord;
|
|
225
|
+
let window;
|
|
226
|
+
let label;
|
|
227
|
+
if (kind === 'tag') {
|
|
228
|
+
const rawTag = params.tag;
|
|
229
|
+
if (typeof rawTag !== 'string' || !rawTag.trim()) {
|
|
230
|
+
throw new BillPolicyError('POLICY_BAD_INPUT', '查标签须给 tag');
|
|
231
|
+
}
|
|
232
|
+
const tag = rawTag.trim();
|
|
233
|
+
records = listByTag(db, tag);
|
|
234
|
+
label = 'tag:' + tag;
|
|
235
|
+
wakeWord = '查标签';
|
|
236
|
+
window = '标签 ' + tag + '(精确匹配)';
|
|
237
|
+
}
|
|
238
|
+
else if (kind === 'debt') {
|
|
239
|
+
records = fetchAll(db).filter(isDebtRow);
|
|
240
|
+
label = 'debt';
|
|
241
|
+
wakeWord = '查欠款';
|
|
242
|
+
window = '还欠着的那些账';
|
|
243
|
+
}
|
|
244
|
+
else if (kind === 'reimburse') {
|
|
245
|
+
records = fetchAll(db).filter(isReimburseRow);
|
|
246
|
+
label = 'reimburse';
|
|
247
|
+
wakeWord = '查待报销';
|
|
248
|
+
window = '等着报销的那些账';
|
|
249
|
+
}
|
|
250
|
+
else if (kind === 'installment') {
|
|
251
|
+
records = fetchAll(db).filter(isInstallmentRow);
|
|
252
|
+
label = 'installment';
|
|
253
|
+
wakeWord = '查分期';
|
|
254
|
+
window = '分期还款的那些账';
|
|
255
|
+
}
|
|
256
|
+
else {
|
|
257
|
+
const rawQ = params.q;
|
|
258
|
+
if (typeof rawQ !== 'string' || !rawQ.trim()) {
|
|
259
|
+
throw new BillPolicyError('POLICY_BAD_INPUT', '搜备注须给 q');
|
|
260
|
+
}
|
|
261
|
+
const q = rawQ.trim();
|
|
262
|
+
records = searchKeyword(db, q);
|
|
263
|
+
label = 'search:' + q;
|
|
264
|
+
wakeWord = '搜备注';
|
|
265
|
+
window = '备注里有「' + q + '」的记录';
|
|
266
|
+
}
|
|
267
|
+
return listOut({
|
|
268
|
+
key, params, wakeWord, window, records, extra: { kind: label },
|
|
269
|
+
emptyText: '没有找到符合条件的记录',
|
|
270
|
+
emptyHint: '换个关键词试试,也可以看看「查最近」。',
|
|
271
|
+
});
|
|
272
|
+
}
|
|
273
|
+
/** `bill.record.detail`:查账单详情(`id` 必给,#415 专属版式)。
|
|
274
|
+
* 取数含软删行(`fetchAll includeDeleted` 经取数公开接口,不另写比对):真无此号才抛
|
|
275
|
+
* `BILL_RECORD_NOT_FOUND`(exit 4),已撤销走整页+已撤销徽,不冒充正常。
|
|
276
|
+
* 载荷 `item` 照搬迁前形状(`toBillItem` 8 字段)原样保留,另加 `created_at/deleted_at`
|
|
277
|
+
* 两列(加法式,旧 8 字段一字不动);页面字段表 10 列全交代,见 `./detail.js`。 */
|
|
278
|
+
export function viewRecordDetail(params, db) {
|
|
279
|
+
const key = 'bill.record.detail';
|
|
280
|
+
const id = needId(params);
|
|
281
|
+
const row = fetchAll(db, { includeDeleted: true }).find((r) => r.id === id);
|
|
282
|
+
if (!row)
|
|
283
|
+
throw new BillFetchError('BILL_RECORD_NOT_FOUND', '无此账单:' + id);
|
|
284
|
+
const data = { item: { ...toBillItem(row), created_at: row.created_at, deleted_at: row.deleted_at } };
|
|
285
|
+
const deleted = row.deleted_at !== null && row.deleted_at !== '';
|
|
286
|
+
return {
|
|
287
|
+
data,
|
|
288
|
+
html: queryDetailDoc({
|
|
289
|
+
key,
|
|
290
|
+
params,
|
|
291
|
+
wakeWord: '查账单详情',
|
|
292
|
+
window: row.time,
|
|
293
|
+
chips: deleted ? ['记录编号 ' + row.id, '已撤销'] : ['记录编号 ' + row.id],
|
|
294
|
+
row,
|
|
295
|
+
envelope: detailEnvelope(key, data),
|
|
296
|
+
source: SOURCE_QUERY,
|
|
297
|
+
actionAt: actionStamp(),
|
|
298
|
+
}),
|
|
299
|
+
};
|
|
300
|
+
}
|
|
301
|
+
//# sourceMappingURL=read.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"read.js","sourceRoot":"","sources":["../../src/query/read.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AACH,OAAO,EACL,WAAW,EAAE,cAAc,EAAE,QAAQ,EAAE,SAAS,EAAE,SAAS,EAAE,aAAa,EAAE,QAAQ,GACrF,MAAM,mBAAmB,CAAC;AAE3B,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,EAAE,MAAM,EAAE,aAAa,EAAE,gBAAgB,EAAE,YAAY,EAAE,gBAAgB,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAC3H,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAEzD,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AACpD,OAAO,EAAE,cAAc,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AACvE,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAG7C,gDAAgD;AAChD,MAAM,YAAY,GAAG,WAAW,GAAG,eAAe,CAAC;AAEnD,kDAAkD;AAClD,SAAS,QAAQ,CAAC,CAAU;IAC1B,OAAO;QACL,EAAE,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC;QAChB,IAAI,EAAE,CAAC,CAAC,IAAI;QACZ,QAAQ,EAAE,CAAC,CAAC,QAAQ;QACpB,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC;QAC3B,OAAO,EAAE,CAAC,CAAC,OAAO;QAClB,MAAM,EAAE,CAAC,CAAC,MAAM;QAChB,IAAI,EAAE,CAAC,CAAC,IAAI;KACb,CAAC;AACJ,CAAC;AAED;;;2CAG2C;AAC3C,SAAS,OAAO,CAAC,KAShB;IACC,MAAM,OAAO,GAAG,CAAC,GAAG,KAAK,CAAC,OAAO,CAAC,CAAC;IACnC,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IACnC,MAAM,GAAG,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAC7B,MAAM,IAAI,GAAkB,EAAE,KAAK,EAAE,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,KAAK,EAAE,OAAO,CAAC,MAAM,EAAE,GAAG,KAAK,CAAC,KAAK,EAAE,GAAG,EAAE,CAAC;IAC3G,OAAO;QACL,IAAI;QACJ,IAAI,EAAE,YAAY,CAAC;YACjB,GAAG,EAAE,KAAK,CAAC,GAAG;YACd,MAAM,EAAE,KAAK,CAAC,MAAM;YACpB,KAAK,EAAE,MAAM;YACb,QAAQ,EAAE,KAAK,CAAC,QAAQ;YACxB,MAAM,EAAE,KAAK,CAAC,MAAM;YACpB,KAAK,EAAE,CAAC,IAAI,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;YACrC,IAAI;YACJ,GAAG;YACH,SAAS,EAAE,KAAK,CAAC,SAAS;YAC1B,SAAS,EAAE,KAAK,CAAC,SAAS;YAC1B,QAAQ,EAAE,YAAY,CAAC,KAAK,CAAC,GAAG,EAAE,IAAI,CAAC;YACvC,MAAM,EAAE,YAAY;YACpB,QAAQ,EAAE,WAAW,EAAE;SACxB,CAAC;KACH,CAAC;AACJ,CAAC;AAED;uDACuD;AACvD,SAAS,aAAa,CAAC,MAA+B;IACpD,IAAI,MAAM,CAAC,IAAI,KAAK,WAAW;QAAE,OAAO,KAAK,CAAC;IAC9C,IAAI,MAAM,CAAC,IAAI,KAAK,SAAS,IAAI,MAAM,CAAC,IAAI,KAAK,IAAI,IAAI,MAAM,CAAC,IAAI,KAAK,EAAE;QAAE,OAAO,KAAK,CAAC;IAC1F,OAAO,KAAK,CAAC;AACf,CAAC;AAED;kCACkC;AAClC,SAAS,UAAU,CAAC,MAA+B;IACjD,IAAI,MAAM,CAAC,IAAI,KAAK,WAAW;QAAE,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,gBAAgB,EAAE,CAAC;IAC9F,IAAI,MAAM,CAAC,IAAI,KAAK,SAAS,IAAI,MAAM,CAAC,IAAI,KAAK,IAAI,IAAI,MAAM,CAAC,IAAI,KAAK,EAAE;QAAE,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,uBAAuB,EAAE,CAAC;IACjJ,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,cAAc,EAAE,CAAC;AAC7D,CAAC;AAED;+DAC+D;AAC/D,MAAM,UAAU,eAAe,CAAC,MAA+B,EAAE,EAAU;IACzE,MAAM,GAAG,GAAG,mBAAmB,CAAC;IAChC,IAAI,MAAM,CAAC,MAAM,KAAK,IAAI,EAAE,CAAC;QAC3B,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;QAC7D,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,IAAK,KAAgB,GAAG,CAAC,IAAK,KAAgB,GAAG,GAAG,EAAE,CAAC;YACjF,MAAM,IAAI,eAAe,CAAC,kBAAkB,EAAE,4BAA4B,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;QAC9F,CAAC;QACD,MAAM,OAAO,GAAG,QAAQ,CAAC,EAAE,CAAC;aACzB,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,EAAE,CAAC;aAC3D,KAAK,CAAC,CAAC,EAAE,KAAe,CAAC,CAAC;QAC7B,OAAO,OAAO,CAAC;YACb,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,GAAG,WAAW,EAAE,OAAO;YAClF,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;YACzB,SAAS,EAAE,SAAS;YACpB,SAAS,EAAE,cAAc;SAC1B,CAAC,CAAC;IACL,CAAC;IACD,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,KAAK,WAAW,CAAC,CAAC,CAAC,YAAY,EAAE,CAAC,CAAC,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAAC;IACrF,MAAM,OAAO,GAAG,SAAS,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;IACpC,MAAM,KAAK,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC;IACjC,OAAO,OAAO,CAAC;QACb,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,aAAa,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,IAAI,GAAG,MAAM,EAAE,OAAO;QAC5E,KAAK,EAAE,EAAE,IAAI,EAAE;QACf,SAAS,EAAE,KAAK,CAAC,SAAS;QAC1B,SAAS,EAAE,KAAK,CAAC,SAAS;KAC3B,CAAC,CAAC;AACL,CAAC;AAED;;;;oCAIoC;AACpC,SAAS,WAAW,CAAC,MAA+B;IAClD,MAAM,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC;IACvB,IAAI,CAAC,KAAK,SAAS,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,EAAE;QAAE,OAAO,aAAa,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;IAChF,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;IACtC,IAAI,GAAG,KAAK,SAAS,IAAI,qBAAqB,CAAC,IAAI,CAAC,GAAG,CAAC;QAAE,OAAO,aAAa,CAAC,GAAG,EAAE,YAAY,CAAC,CAAC;IAClG,OAAO,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;AAC/C,CAAC;AAED,wDAAwD;AACxD,SAAS,cAAc,CAAC,MAAc;IACpC,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,YAAY,CAAC,CAAC;IAC5C,MAAM,IAAI,GAAG,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC;IAC/C,MAAM,GAAG,GAAG,IAAI,IAAI,CAAC,CAAC,GAAG,IAAI,GAAG,QAAQ,CAAC,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IACrE,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,MAAM,EAAE,CAAC;AACrC,CAAC;AAED,8CAA8C;AAC9C,SAAS,eAAe,CAAC,MAAc;IACrC,OAAO,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,MAAM,EAAE,CAAC;AAC3D,CAAC;AAED;wDACwD;AACxD,SAAS,SAAS,CAAC,MAA+B,EAAE,KAAa;IAC/D,MAAM,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;IACxB,IAAI,CAAC,KAAK,SAAS,IAAI,CAAC,KAAK,IAAI;QAAE,OAAO,SAAS,CAAC;IACpD,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC;QACvC,MAAM,IAAI,eAAe,CAAC,kBAAkB,EAAE,KAAK,GAAG,gBAAgB,CAAC,CAAC;IAC1E,CAAC;IACD,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC;AAClB,CAAC;AAED;;;uCAGuC;AACvC,MAAM,UAAU,eAAe,CAAC,MAA+B,EAAE,EAAU;IACzE,MAAM,GAAG,GAAG,mBAAmB,CAAC;IAChC,MAAM,WAAW,GAAG,SAAS,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;IAClD,MAAM,QAAQ,GAAG,WAAW,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,gBAAgB,CAAC,WAAW,CAAC,CAAC;IACvF,MAAM,OAAO,GAAG,SAAS,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;IAC7C,MAAM,MAAM,GAAG,SAAS,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;IAC3C,MAAM,IAAI,GAAG,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC;IAC3C,IAAI,MAAM,CAAC,KAAK,KAAK,MAAM,IAAI,MAAM,CAAC,KAAK,KAAK,OAAO,EAAE,CAAC;QACxD,MAAM,MAAM,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC;QACnC,MAAM,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,MAAM,CAAC,KAAK,KAAK,MAAM,CAAC,CAAC,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC;QAClG,MAAM,OAAO,GAAG,QAAQ,CAAC,EAAE,EAAE,EAAE,QAAQ,EAAE,KAAK,GAAG,WAAW,EAAE,MAAM,EAAE,GAAG,GAAG,WAAW,EAAE,GAAG,IAAI,EAAE,CAAC,CAAC;QACpG,IAAI,CAAC,OAAO,CAAC,MAAM;YAAE,MAAM,IAAI,cAAc,CAAC,kBAAkB,EAAE,SAAS,KAAK,IAAI,GAAG,cAAc,CAAC,CAAC;QACvG,OAAO,OAAO,CAAC;YACb,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,CAAC,KAAK,KAAK,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI;YAC5D,MAAM,EAAE,KAAK,GAAG,KAAK,GAAG,GAAG,GAAG,CAAC,MAAM,CAAC,KAAK,KAAK,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC;YACzE,OAAO,EAAE,KAAK,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE;YAC9B,SAAS,EAAE,SAAS;YACpB,SAAS,EAAE,aAAa;SACzB,CAAC,CAAC;IACL,CAAC;IACD,IAAI,MAAM,CAAC,KAAK,KAAK,SAAS,IAAI,MAAM,CAAC,GAAG,KAAK,SAAS,EAAE,CAAC;QAC3D,MAAM,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC;QAC5C,MAAM,OAAO,GAAG,QAAQ,CAAC,EAAE,EAAE,EAAE,QAAQ,EAAE,KAAK,GAAG,WAAW,EAAE,MAAM,EAAE,GAAG,GAAG,WAAW,EAAE,GAAG,IAAI,EAAE,CAAC,CAAC;QACpG,IAAI,CAAC,OAAO,CAAC,MAAM;YAAE,MAAM,IAAI,cAAc,CAAC,kBAAkB,EAAE,SAAS,KAAK,IAAI,GAAG,cAAc,CAAC,CAAC;QACvG,OAAO,OAAO,CAAC;YACb,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,GAAG,KAAK,GAAG,GAAG,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE;YACzF,SAAS,EAAE,SAAS;YACpB,SAAS,EAAE,aAAa;SACzB,CAAC,CAAC;IACL,CAAC;IACD,IAAI,QAAQ,KAAK,SAAS,IAAI,OAAO,KAAK,SAAS,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;QAC5E,MAAM,OAAO,GAAG,QAAQ,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;QACnC,IAAI,CAAC,OAAO,CAAC,MAAM;YAAE,MAAM,IAAI,cAAc,CAAC,kBAAkB,EAAE,mBAAmB,CAAC,CAAC;QACvF,MAAM,EAAE,GAAG,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC;QAC/E,MAAM,KAAK,GAAG,MAAM,CAAC,QAAQ,IAAI,OAAO,IAAI,MAAM,CAAC,CAAC;QACpD,OAAO,OAAO,CAAC;YACb,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,GAAG,GAAG,EAAE,EAAE,MAAM,EAAE,EAAE,GAAG,GAAG,GAAG,KAAK,GAAG,QAAQ,EAAE,OAAO;YAC7E,KAAK,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE;YAC7B,SAAS,EAAE,UAAU;YACrB,SAAS,EAAE,sBAAsB;SAClC,CAAC,CAAC;IACL,CAAC;IACD,MAAM,IAAI,eAAe,CAAC,kBAAkB,EAAE,gEAAgE,CAAC,CAAC;AAClH,CAAC;AAED;6DAC6D;AAC7D,SAAS,SAAS,CAAC,CAAU;IAC3B,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC,UAAU,CAAC,KAAK,CAAC,IAAI,QAAQ,CAAC,CAAC,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;AAC7F,CAAC;AAED;sEACsE;AACtE,SAAS,cAAc,CAAC,CAAU;IAChC,OAAO,QAAQ,CAAC,CAAC,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;AAC7D,CAAC;AAED;+DAC+D;AAC/D,SAAS,gBAAgB,CAAC,CAAU;IAClC,OAAO,CAAC,CAAC,QAAQ,CAAC,UAAU,CAAC,KAAK,CAAC,IAAI,QAAQ,CAAC,CAAC,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,QAAQ,CAAC,CAAC,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;AAC3F,CAAC;AAED;;yCAEyC;AACzC,MAAM,UAAU,gBAAgB,CAAC,MAA+B,EAAE,EAAU;IAC1E,MAAM,GAAG,GAAG,oBAAoB,CAAC;IACjC,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IAClE,IAAI,OAAkB,CAAC;IACvB,IAAI,QAAgB,CAAC;IACrB,IAAI,MAAc,CAAC;IACnB,IAAI,KAAa,CAAC;IAClB,IAAI,IAAI,KAAK,KAAK,EAAE,CAAC;QACnB,MAAM,MAAM,GAAG,MAAM,CAAC,GAAG,CAAC;QAC1B,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC;YACjD,MAAM,IAAI,eAAe,CAAC,kBAAkB,EAAE,WAAW,CAAC,CAAC;QAC7D,CAAC;QACD,MAAM,GAAG,GAAG,MAAM,CAAC,IAAI,EAAE,CAAC;QAC1B,OAAO,GAAG,SAAS,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC;QAC7B,KAAK,GAAG,MAAM,GAAG,GAAG,CAAC;QACrB,QAAQ,GAAG,KAAK,CAAC;QACjB,MAAM,GAAG,KAAK,GAAG,GAAG,GAAG,QAAQ,CAAC;IAClC,CAAC;SAAM,IAAI,IAAI,KAAK,MAAM,EAAE,CAAC;QAC3B,OAAO,GAAG,QAAQ,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;QACzC,KAAK,GAAG,MAAM,CAAC;QACf,QAAQ,GAAG,KAAK,CAAC;QACjB,MAAM,GAAG,SAAS,CAAC;IACrB,CAAC;SAAM,IAAI,IAAI,KAAK,WAAW,EAAE,CAAC;QAChC,OAAO,GAAG,QAAQ,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC;QAC9C,KAAK,GAAG,WAAW,CAAC;QACpB,QAAQ,GAAG,MAAM,CAAC;QAClB,MAAM,GAAG,UAAU,CAAC;IACtB,CAAC;SAAM,IAAI,IAAI,KAAK,aAAa,EAAE,CAAC;QAClC,OAAO,GAAG,QAAQ,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,gBAAgB,CAAC,CAAC;QAChD,KAAK,GAAG,aAAa,CAAC;QACtB,QAAQ,GAAG,KAAK,CAAC;QACjB,MAAM,GAAG,UAAU,CAAC;IACtB,CAAC;SAAM,CAAC;QACN,MAAM,IAAI,GAAG,MAAM,CAAC,CAAC,CAAC;QACtB,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC;YAC7C,MAAM,IAAI,eAAe,CAAC,kBAAkB,EAAE,SAAS,CAAC,CAAC;QAC3D,CAAC;QACD,MAAM,CAAC,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;QACtB,OAAO,GAAG,aAAa,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;QAC/B,KAAK,GAAG,SAAS,GAAG,CAAC,CAAC;QACtB,QAAQ,GAAG,KAAK,CAAC;QACjB,MAAM,GAAG,OAAO,GAAG,CAAC,GAAG,MAAM,CAAC;IAChC,CAAC;IACD,OAAO,OAAO,CAAC;QACb,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE;QAC9D,SAAS,EAAE,aAAa;QACxB,SAAS,EAAE,qBAAqB;KACjC,CAAC,CAAC;AACL,CAAC;AAED;;;;wDAIwD;AACxD,MAAM,UAAU,gBAAgB,CAAC,MAA+B,EAAE,EAAU;IAC1E,MAAM,GAAG,GAAG,oBAAoB,CAAC;IACjC,MAAM,EAAE,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC;IAC1B,MAAM,GAAG,GAAG,QAAQ,CAAC,EAAE,EAAE,EAAE,cAAc,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;IAC5E,IAAI,CAAC,GAAG;QAAE,MAAM,IAAI,cAAc,CAAC,uBAAuB,EAAE,OAAO,GAAG,EAAE,CAAC,CAAC;IAC1E,MAAM,IAAI,GAAoB,EAAE,IAAI,EAAE,EAAE,GAAG,UAAU,CAAC,GAAG,CAAC,EAAE,UAAU,EAAE,GAAG,CAAC,UAAU,EAAE,UAAU,EAAE,GAAG,CAAC,UAAU,EAAE,EAAE,CAAC;IACvH,MAAM,OAAO,GAAG,GAAG,CAAC,UAAU,KAAK,IAAI,IAAI,GAAG,CAAC,UAAU,KAAK,EAAE,CAAC;IACjE,OAAO;QACL,IAAI;QACJ,IAAI,EAAE,cAAc,CAAC;YACnB,GAAG;YACH,MAAM;YACN,QAAQ,EAAE,OAAO;YACjB,MAAM,EAAE,GAAG,CAAC,IAAI;YAChB,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,GAAG,GAAG,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,GAAG,GAAG,CAAC,EAAE,CAAC;YAC/D,GAAG;YACH,QAAQ,EAAE,cAAc,CAAC,GAAG,EAAE,IAAI,CAAC;YACnC,MAAM,EAAE,YAAY;YACpB,QAAQ,EAAE,WAAW,EAAE;SACxB,CAAC;KACH,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/** 采集页分派位:按 `kind`/`op` 取场景件,叫它的 `collect`。**装配体不住这里**(本票的拆件口径)。
|
|
2
|
+
*
|
|
3
|
+
* 谁在用(两个调用点,指名):
|
|
4
|
+
* ① `src/record/write.ts` 的 `writeRecordAdd`——`bill.record.add` 有阻断项(缺必需槽位/金额方向不符)时出这一页;
|
|
5
|
+
* ② `src/record/write.ts` 的 `writeRecordUpdate`——`bill.record.update` 有阻断项(缺 `id`)时出这一页。
|
|
6
|
+
* 第二个消费者:`src/query/`(随兄弟图 #403 的查询域一起到位,出来的是同一套采集页/回执页/复制区)。
|
|
7
|
+
*
|
|
8
|
+
* 本件只剩三件事:转出槽位表(`./slots.ts` 的定义,测试与 `write.ts` 照旧引这一条)、
|
|
9
|
+
* 按落点取件(`./scene.ts` 的 `sceneFor`)、把入参原样交给那一件场景件。
|
|
10
|
+
* 拆件前这里装着通用采集页的十块;本票把那十块原样搬进 `./collectBody.ts`,16 件场景件现在都指它。
|
|
11
|
+
* 后续三族窗口填各自那张页时改的是**场景件**,本件一行不动。
|
|
12
|
+
*/
|
|
13
|
+
import type { CollectInput } from './scene.js';
|
|
14
|
+
export { RECORD_SLOTS, missingSlots } from './slots.js';
|
|
15
|
+
export type { RecordSlot } from './slots.js';
|
|
16
|
+
/** 过程型采集页整页:取件交给场景件装配(判定四条见 `./scene.ts` 的 `sceneFor`)。 */
|
|
17
|
+
export declare function recordCollectDoc(input: CollectInput): string;
|
|
18
|
+
//# sourceMappingURL=collect.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"collect.d.ts","sourceRoot":"","sources":["../../src/record/collect.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AACH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAG/C,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AACxD,YAAY,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAO7C,2DAA2D;AAC3D,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,YAAY,GAAG,MAAM,CAM5D"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { sceneFor } from './scene.js';
|
|
2
|
+
export { RECORD_SLOTS, missingSlots } from './slots.js';
|
|
3
|
+
/** 一个值的字符串形态(判落点只认字符串;数字等其余形态一律当「没给这一格」)。 */
|
|
4
|
+
function textOf(v) {
|
|
5
|
+
return typeof v === 'string' ? v.trim() : '';
|
|
6
|
+
}
|
|
7
|
+
/** 过程型采集页整页:取件交给场景件装配(判定四条见 `./scene.ts` 的 `sceneFor`)。 */
|
|
8
|
+
export function recordCollectDoc(input) {
|
|
9
|
+
return sceneFor({
|
|
10
|
+
key: input.key,
|
|
11
|
+
kind: textOf(input.params['kind']),
|
|
12
|
+
op: textOf(input.params['op']),
|
|
13
|
+
}).collect(input);
|
|
14
|
+
}
|
|
15
|
+
//# sourceMappingURL=collect.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"collect.js","sourceRoot":"","sources":["../../src/record/collect.ts"],"names":[],"mappings":"AAaA,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAEtC,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAGxD,6CAA6C;AAC7C,SAAS,MAAM,CAAC,CAAU;IACxB,OAAO,OAAO,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;AAC/C,CAAC;AAED,2DAA2D;AAC3D,MAAM,UAAU,gBAAgB,CAAC,KAAmB;IAClD,OAAO,QAAQ,CAAC;QACd,GAAG,EAAE,KAAK,CAAC,GAAG;QACd,IAAI,EAAE,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QAClC,EAAE,EAAE,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;KAC/B,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;AACpB,CAAC"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import type { BlockedItem } from '../shared/blockedSlots.js';
|
|
2
|
+
import type { PrefillMark } from '../shared/prefillNote.js';
|
|
3
|
+
import type { CollectInput } from './scene.js';
|
|
4
|
+
/** 预填标注的「来源」串收短(**本族五页共用这一处**):只把括号里的附注去掉,两类来源的区分一字不动
|
|
5
|
+
* (`来自记录编号 N(最近一笔)`→`来自记录编号 N`、`缺省值(库里还没有可用的账户,留空=落库默认)`→`缺省值`)。
|
|
6
|
+
* 为什么要收:这一句会作为字段卡的提示上屏,390 宽下原来那串长文被输入框裁掉后半截(E 席基线
|
|
7
|
+
* n1 记的「账户 placeholder 后半框内半藏」),收短之后整句进得了框;口径条文仍在
|
|
8
|
+
* `../shared/prefillNote.ts` 那一处,本件只做展示用的收笔,不另立第二份来源说法。 */
|
|
9
|
+
export declare function prefillShort(marks: readonly PrefillMark[]): readonly PrefillMark[];
|
|
10
|
+
/** 采集页的缺项阻断块(**折叠形**,本族五页共用这一处摆法):共用的阻断条——「还缺什么」错误回执、
|
|
11
|
+
* 缺项明示表、写库口令原文、置灰的写库按钮——整条收进折叠区,首屏只留缺项标签与进度两处形状承担提示。
|
|
12
|
+
* 派单的架构级整改要的就是这一条(口令原文块整条可见 → 折叠)。
|
|
13
|
+
*
|
|
14
|
+
* **判定与文案仍是 `../shared/blockedSlots.ts` 那一份**:本件只把共用件的产出换个位置摆,不另写第二份缺项口径,
|
|
15
|
+
* 也不改阻断行为(写库那一半照旧由 `src/record/write.ts` 拦)。折叠区里那枚置灰按钮不带 `data-t`,
|
|
16
|
+
* 折叠与否都点不动(`packages/base-render/src/controls.ts` 的点击委派读到空 `data-t` 即早退)。
|
|
17
|
+
*
|
|
18
|
+
* 谁在用(本族五件,指名):`scene-expense`(经本件 `collectBody`)、`scene-income`、`scene-photo`、
|
|
19
|
+
* `scene-batch`、`scene-plain`——五张采集页同一摆法,改一处五页同时改。 */
|
|
20
|
+
export declare function collectBlockedFold(input: {
|
|
21
|
+
readonly items: readonly BlockedItem[];
|
|
22
|
+
/** 写库口令原文(补齐后照抄重跑那条);带尖括号占位符。 */
|
|
23
|
+
readonly command: string;
|
|
24
|
+
/** 补齐之后会发生什么(不给=走共用件那句缺省口径)。 */
|
|
25
|
+
readonly note?: string;
|
|
26
|
+
}): string;
|
|
27
|
+
/** 通用采集页整页:三段按序拼(见文件头信息层次)。 */
|
|
28
|
+
export declare function collectBody(input: CollectInput): string;
|
|
29
|
+
//# sourceMappingURL=collectBody.d.ts.map
|