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,249 @@
|
|
|
1
|
+
/** 场景件:改记录(`bill.record.update` 的缺省那一支,`op` 空=改字段)。**本票:两格都换成这一件自己的装配体**。
|
|
2
|
+
*
|
|
3
|
+
* 服务哪条唤醒词:改记录(`src/policy/wakewords.ts` 的 `WAKE_TABLE` 里不带 `op` preset 的那一条)。
|
|
4
|
+
* 现在出哪张页:采集页=本件 `collectOf`(**三形态**:缺 `id` 列候选/带 `id` 出确认面/`id` 那一条已打标撤销),
|
|
5
|
+
* 回执页=本件 `receiptOf`(落库后那一张)。三形态由 `id` 给没给 + 那一条读不读得到判出来,判定只在本件。
|
|
6
|
+
* 施工图那一行(`docs/skills/skill-bill/t407-页面块清单-16词.md` 第二节「改记录」)要的块,逐块落位:
|
|
7
|
+
* 类型徽章(改记录)/原记录只读回显(`../shared/recordPicker.ts` 的 `snapshotTable`)/
|
|
8
|
+
* diff 表(`../shared/diffTable.ts`,字段/原值/新值)/候选单选(缺 `id` 时,`../shared/recordPicker.ts`)/
|
|
9
|
+
* 复制指令块/动作区/错误回执(缺项阻断条里那一件,`../shared/blockedSlots.ts`)。
|
|
10
|
+
*
|
|
11
|
+
* 缺 `id` 不再由路由层报错(那是本票修的破口):路由只说「改记录」时落这一页,由**候选记录列表**让用户挑一条,
|
|
12
|
+
* 挑完仍走同一条写命令。**没给 `id` 就不出可跑的写库指令**(阻断条里那条指令带尖括号占位符、只给看不给复制)。
|
|
13
|
+
*/
|
|
14
|
+
import { renderCaliberLine, renderDataTable, renderDisclosure, renderKpiGrid } from 'base-paint/blocks';
|
|
15
|
+
import { blockedBar, blockedItems, blockedMessage } from '../shared/blockedSlots.js';
|
|
16
|
+
import { collectMissingTags, collectSectionTitle } from '../shared/collectFrame.js';
|
|
17
|
+
import { copyArea, copyLog, promptCopyArea, undoExit } from '../shared/copyArea.js';
|
|
18
|
+
import { diffTable } from '../shared/diffTable.js';
|
|
19
|
+
import { emptyNote } from '../shared/emptyNote.js';
|
|
20
|
+
import { DOC_SKILL, DOC_TITLE, DOC_VERSION, sceneKeyOf } from '../shared/pageIdentity.js';
|
|
21
|
+
import { pageShell } from '../shared/pageShell.js';
|
|
22
|
+
import { diffRowsFor, pickModeOf, pickerBlock, readRowById, snapshotTable } from '../shared/recordPicker.js';
|
|
23
|
+
import { receiptStatusCard, reconcileDisclosure } from '../shared/receiptParts.js';
|
|
24
|
+
import { summaryCards, summaryRow } from '../shared/summaryRow.js';
|
|
25
|
+
import { typeBadge } from '../shared/typeBadge.js';
|
|
26
|
+
import { fieldLabelOf } from '../shared/userWording.js';
|
|
27
|
+
import { commandLine } from '../shared/writeParts.js';
|
|
28
|
+
/** 一条唤醒词一件:本件服务的那条。 */
|
|
29
|
+
const WAKE = '改记录';
|
|
30
|
+
/** 本件的命令名(两条页与复制指令都引它一份)。 */
|
|
31
|
+
const KEY = 'bill.record.update';
|
|
32
|
+
/** 一个值的字符串形态(数字写十进制串,其余形态按空串用)。 */
|
|
33
|
+
function textOf(v) {
|
|
34
|
+
if (typeof v === 'string')
|
|
35
|
+
return v.trim();
|
|
36
|
+
return typeof v === 'number' ? String(v) : '';
|
|
37
|
+
}
|
|
38
|
+
/** 记录编号:`params.id` 是正整数才算给了(其余形态一律当没给,不猜)。 */
|
|
39
|
+
function idOf(params) {
|
|
40
|
+
const raw = params['id'];
|
|
41
|
+
const n = typeof raw === 'number' ? raw : textOf(raw) === '' ? NaN : Number(textOf(raw));
|
|
42
|
+
return Number.isInteger(n) && n > 0 ? n : null;
|
|
43
|
+
}
|
|
44
|
+
/** 允许改的字段名单:取自槽位表(`id`/`op` 两格不是被改的字段),本件不另抄一份。 */
|
|
45
|
+
function changeFieldsOf(slots) {
|
|
46
|
+
return slots.filter((s) => s.name !== 'id' && s.name !== 'op').map((s) => s.name);
|
|
47
|
+
}
|
|
48
|
+
/** 摘要行的事实:有原记录就取库内那一行(页面说的是那一条的现状),没有就取本次参数。 */
|
|
49
|
+
function factsOf(row, params) {
|
|
50
|
+
if (row !== null) {
|
|
51
|
+
return { amount: row.amount, category: row.category, account: row.account, ledger: row.ledger, time: row.time };
|
|
52
|
+
}
|
|
53
|
+
const raw = params['amount'];
|
|
54
|
+
const n = typeof raw === 'number' ? raw : textOf(raw) === '' ? NaN : Number(textOf(raw));
|
|
55
|
+
return {
|
|
56
|
+
amount: Number.isFinite(n) ? n : null,
|
|
57
|
+
category: textOf(params['category']),
|
|
58
|
+
account: textOf(params['account']),
|
|
59
|
+
ledger: textOf(params['ledger']),
|
|
60
|
+
time: textOf(params['time']),
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
/** 缺项时那条写库指令原文:缺的值留成尖括号占位符,**只给看不给复制**。 */
|
|
64
|
+
function blockedCommand(params, blocked) {
|
|
65
|
+
const filled = { ...params };
|
|
66
|
+
for (const b of blocked)
|
|
67
|
+
filled[b.name] = '<' + b.label + '>';
|
|
68
|
+
return commandLine(KEY, filled);
|
|
69
|
+
}
|
|
70
|
+
/** 缺项阻断条整条收进折叠区:首屏只留缺项标签与一行副标题,口令原文不再常驻版面。
|
|
71
|
+
* 内容与判定一字不动(仍是共用件 `blockedBar` 的产出),只换摆法;折叠与否那枚置灰按钮都点不动。 */
|
|
72
|
+
function blockedFold(items, command) {
|
|
73
|
+
if (items.length === 0)
|
|
74
|
+
return '';
|
|
75
|
+
return renderDisclosure({
|
|
76
|
+
title: '还缺什么,以及补齐后照抄的那条',
|
|
77
|
+
contentHtml: blockedBar({ items, command }),
|
|
78
|
+
});
|
|
79
|
+
}
|
|
80
|
+
/** 「照这句跟助手说一遍」那块话:这一页是哪一形态、接下来怎么办、补齐后重跑哪条命令。 */
|
|
81
|
+
function promptOf(input) {
|
|
82
|
+
if (input.id === null) {
|
|
83
|
+
return '这一页先不写库。挑一条记录,说清要改哪一项、改成什么,再跟助手说一遍「改记录」。';
|
|
84
|
+
}
|
|
85
|
+
if (input.deleted) {
|
|
86
|
+
return '记录编号 ' + input.id + ' 那一条已经撤销过,改记录这一支不动它。\n'
|
|
87
|
+
+ '要它回到库里就说「恢复」:' + commandLine(KEY, { op: 'restore', id: input.id }) + '。';
|
|
88
|
+
}
|
|
89
|
+
if (input.row === null) {
|
|
90
|
+
return '记录编号 ' + input.id + ' 在库里读不到,可能已不在这个库。\n'
|
|
91
|
+
+ '核一下编号,或先说清是哪一笔,再跟助手说一遍「改记录」。';
|
|
92
|
+
}
|
|
93
|
+
return '原记录与改动对照都在下面:核一眼「原值/新值」,没问题就照这条说。\n'
|
|
94
|
+
+ commandLine(KEY, input.params);
|
|
95
|
+
}
|
|
96
|
+
/** 采集页整页:三形态共用同一串头的块,中段按形态换(候选表/原记录+diff 表/空态)。 */
|
|
97
|
+
function collectOf(input) {
|
|
98
|
+
const { params, slots, missing } = input;
|
|
99
|
+
const blocked = blockedItems({ params, missing, kind: '' });
|
|
100
|
+
const message = blockedMessage(missing, blocked);
|
|
101
|
+
/** 副标题只报缺哪一项(不重复「已出采集页,补齐之后跟助手说一遍」那句)。 */
|
|
102
|
+
const subtitle = blocked.length === 0 ? '' : '缺必需槽位:' + blocked.map((i) => i.label).join('、');
|
|
103
|
+
const envelope = {
|
|
104
|
+
version: DOC_VERSION, skill: DOC_SKILL, shape: 'receipt', key: sceneKeyOf(KEY),
|
|
105
|
+
data: { ok: false, message },
|
|
106
|
+
};
|
|
107
|
+
const id = idOf(params);
|
|
108
|
+
const probe = id === null
|
|
109
|
+
? { ok: true, reason: '', row: null, deleted: false }
|
|
110
|
+
: readRowById(id);
|
|
111
|
+
const row = probe.row;
|
|
112
|
+
// 撤销标记口径取自 `../shared/recordPicker.ts` 的 `isDeleted`(读一条时一次算好,本件不重判一次)。
|
|
113
|
+
const deleted = probe.deleted;
|
|
114
|
+
const form = id === null ? '缺记录编号,先挑一条' : deleted ? '那一条已撤销过' : row === null ? '那一条读不到' : '带记录编号,待确认';
|
|
115
|
+
const middle = [];
|
|
116
|
+
if (id === null) {
|
|
117
|
+
middle.push(pickerBlock({ mode: pickModeOf(params['op']) }));
|
|
118
|
+
}
|
|
119
|
+
else if (deleted && row !== null) {
|
|
120
|
+
middle.push(snapshotTable(row, '这一条记录 已撤销过,只读回显'));
|
|
121
|
+
middle.push(emptyNote({
|
|
122
|
+
title: '这一条已经撤销过',
|
|
123
|
+
text: '记录编号 ' + id + ' 在 ' + String(row.deleted_at) + ' 撤销过,改记录这一支不动已撤销的记录。',
|
|
124
|
+
next: '要它回到库里就说「恢复」,恢复之后再改。要改别的记录就换一个编号。',
|
|
125
|
+
}));
|
|
126
|
+
}
|
|
127
|
+
else if (row === null) {
|
|
128
|
+
middle.push(emptyNote({
|
|
129
|
+
title: '这个编号没有记录',
|
|
130
|
+
text: '记录编号 ' + id + ' 在库里一条都没读到。' + (probe.ok ? '' : probe.reason + '。'),
|
|
131
|
+
next: '核一下编号,或先说清是哪一笔。',
|
|
132
|
+
}));
|
|
133
|
+
}
|
|
134
|
+
else {
|
|
135
|
+
middle.push(snapshotTable(row, '原记录 只读回显 记录编号 ' + row.id));
|
|
136
|
+
middle.push(diffTable({
|
|
137
|
+
rows: diffRowsFor({ row, params, fields: changeFieldsOf(slots) }),
|
|
138
|
+
caption: '改前改后对照(本次打算改的那几项)',
|
|
139
|
+
}));
|
|
140
|
+
}
|
|
141
|
+
const content = [
|
|
142
|
+
typeBadge({
|
|
143
|
+
kind: '',
|
|
144
|
+
status: 'danger',
|
|
145
|
+
state: form === '缺记录编号,先挑一条' ? '三形态之一:缺记录编号 · 先挑一条' : '待核对 · 未写库',
|
|
146
|
+
next: '',
|
|
147
|
+
}),
|
|
148
|
+
blocked.length === 0 ? '' : collectSectionTitle({ no: 1, title: '先看这一笔缺什么' }),
|
|
149
|
+
collectMissingTags({ labels: blocked.map((i) => i.label) }),
|
|
150
|
+
summaryRow(factsOf(row, params)),
|
|
151
|
+
collectSectionTitle({ no: 2, title: id === null ? '先挑一条记录' : '核对这一条' }),
|
|
152
|
+
blockedFold(blocked, blockedCommand(params, blocked)),
|
|
153
|
+
middle.join(''),
|
|
154
|
+
promptCopyArea(promptOf({ id, row, deleted, blocked, params }), '挑好记录后照这句跟助手说一遍'),
|
|
155
|
+
copyArea({
|
|
156
|
+
data: { envelope },
|
|
157
|
+
log: {
|
|
158
|
+
envelope,
|
|
159
|
+
copyLog: copyLog({
|
|
160
|
+
command: commandLine(KEY, params),
|
|
161
|
+
source: input.source,
|
|
162
|
+
detail: '没写库(采集页)',
|
|
163
|
+
actionAt: input.actionAt,
|
|
164
|
+
version: DOC_VERSION,
|
|
165
|
+
}),
|
|
166
|
+
},
|
|
167
|
+
}),
|
|
168
|
+
].join('');
|
|
169
|
+
return pageShell({
|
|
170
|
+
docTitle: DOC_TITLE + '·补齐槽位',
|
|
171
|
+
title: WAKE + ' · ' + (id === null ? '挑一条记录' : '确认改动'),
|
|
172
|
+
subtitle,
|
|
173
|
+
slot: 'collect',
|
|
174
|
+
page: 'collect',
|
|
175
|
+
shape: envelope.shape,
|
|
176
|
+
key: KEY,
|
|
177
|
+
content,
|
|
178
|
+
});
|
|
179
|
+
}
|
|
180
|
+
/** 回执页整页:类型徽章(写库成功)→ 一张大网格 → 写入明细表 → 对账折叠区 → 退出口 → 复制区三件。
|
|
181
|
+
* diff 表落在**落库前**那一面(回执这一面拿不到原值,`ReceiptInput` 只给写后的真值),页上照实说清。 */
|
|
182
|
+
function receiptOf(input) {
|
|
183
|
+
const { params, receipt } = input;
|
|
184
|
+
const envelope = {
|
|
185
|
+
version: DOC_VERSION, skill: DOC_SKILL, shape: 'receipt', key: sceneKeyOf(KEY),
|
|
186
|
+
data: { ok: true, message: receipt.summary },
|
|
187
|
+
};
|
|
188
|
+
const content = [
|
|
189
|
+
typeBadge({
|
|
190
|
+
kind: '',
|
|
191
|
+
status: 'ok',
|
|
192
|
+
state: '写库成功',
|
|
193
|
+
next: '这一笔已记下,撤销见下方按钮。',
|
|
194
|
+
}),
|
|
195
|
+
renderKpiGrid([
|
|
196
|
+
...summaryCards(input.facts),
|
|
197
|
+
receiptStatusCard(receipt, input.writtenDetail),
|
|
198
|
+
{ label: '这次记了几笔', value: receipt.affectedRows + ' 笔', detail: '按库里的改动算' },
|
|
199
|
+
{
|
|
200
|
+
label: '写进去的项',
|
|
201
|
+
value: receipt.writtenFields.length + ' 项',
|
|
202
|
+
detail: receipt.writtenFields.map((f) => fieldLabelOf(f)).join('、') || '没改到任何一项',
|
|
203
|
+
},
|
|
204
|
+
]),
|
|
205
|
+
renderCaliberLine('这一页只报写后的真值,改前改后对照落在写库前那一面。'),
|
|
206
|
+
renderDataTable({
|
|
207
|
+
columns: [{ key: 'k', label: '哪一项' }, { key: 'v', label: '记成什么' }],
|
|
208
|
+
rows: input.detail,
|
|
209
|
+
caption: '写进去的项与值',
|
|
210
|
+
}),
|
|
211
|
+
reconcileDisclosure(receipt),
|
|
212
|
+
receipt.recordId === null ? '' : undoExit(receipt.recordId),
|
|
213
|
+
copyArea({
|
|
214
|
+
data: { envelope },
|
|
215
|
+
log: {
|
|
216
|
+
envelope,
|
|
217
|
+
copyLog: copyLog({
|
|
218
|
+
command: commandLine(KEY, params),
|
|
219
|
+
source: receipt.source,
|
|
220
|
+
detail: '改了 ' + receipt.affectedRows + ' 笔,写进去 '
|
|
221
|
+
+ (receipt.writtenFields.map((f) => fieldLabelOf(f)).join('、') || '没改到任何一项'),
|
|
222
|
+
actionAt: receipt.actionAt,
|
|
223
|
+
version: DOC_VERSION,
|
|
224
|
+
}),
|
|
225
|
+
},
|
|
226
|
+
}),
|
|
227
|
+
].join('');
|
|
228
|
+
return pageShell({
|
|
229
|
+
docTitle: DOC_TITLE + '·写库回执',
|
|
230
|
+
title: WAKE + ' · 回执',
|
|
231
|
+
subtitle: receipt.summary,
|
|
232
|
+
slot: 'receipt',
|
|
233
|
+
page: 'receipt',
|
|
234
|
+
shape: envelope.shape,
|
|
235
|
+
key: KEY,
|
|
236
|
+
content,
|
|
237
|
+
});
|
|
238
|
+
}
|
|
239
|
+
export const SCENE = {
|
|
240
|
+
id: 'update',
|
|
241
|
+
wakeWord: WAKE,
|
|
242
|
+
key: KEY,
|
|
243
|
+
kind: '',
|
|
244
|
+
op: '',
|
|
245
|
+
family: '批量与修正族',
|
|
246
|
+
collect: collectOf,
|
|
247
|
+
receipt: receiptOf,
|
|
248
|
+
};
|
|
249
|
+
//# sourceMappingURL=scene-update.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scene-update.js","sourceRoot":"","sources":["../../src/record/scene-update.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AACH,OAAO,EAAE,iBAAiB,EAAE,eAAe,EAAE,gBAAgB,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAExG,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAErF,OAAO,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAC;AACpF,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,cAAc,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AACpF,OAAO,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AACnD,OAAO,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AACnD,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAC;AAC1F,OAAO,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AACnD,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,WAAW,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAC7G,OAAO,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAC;AACnF,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AAEnE,OAAO,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AACnD,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AACxD,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAKtD,uBAAuB;AACvB,MAAM,IAAI,GAAG,KAAK,CAAC;AACnB,6BAA6B;AAC7B,MAAM,GAAG,GAAG,oBAAoB,CAAC;AAEjC,mCAAmC;AACnC,SAAS,MAAM,CAAC,CAAU;IACxB,IAAI,OAAO,CAAC,KAAK,QAAQ;QAAE,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC;IAC3C,OAAO,OAAO,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;AAChD,CAAC;AAED,+CAA+C;AAC/C,SAAS,IAAI,CAAC,MAA+B;IAC3C,MAAM,GAAG,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC;IACzB,MAAM,CAAC,GAAG,OAAO,GAAG,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;IACzF,OAAO,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;AACjD,CAAC;AAED,mDAAmD;AACnD,SAAS,cAAc,CAAC,KAA4B;IAClD,OAAO,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,IAAI,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;AACpF,CAAC;AAED,gDAAgD;AAChD,SAAS,OAAO,CAAC,GAAmB,EAAE,MAA+B;IACnE,IAAI,GAAG,KAAK,IAAI,EAAE,CAAC;QACjB,OAAO,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,QAAQ,EAAE,GAAG,CAAC,QAAQ,EAAE,OAAO,EAAE,GAAG,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,CAAC;IAClH,CAAC;IACD,MAAM,GAAG,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC;IAC7B,MAAM,CAAC,GAAG,OAAO,GAAG,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;IACzF,OAAO;QACL,MAAM,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI;QACrC,QAAQ,EAAE,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;QACpC,OAAO,EAAE,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;QAClC,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QAChC,IAAI,EAAE,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;KAC7B,CAAC;AACJ,CAAC;AAED,2CAA2C;AAC3C,SAAS,cAAc,CAAC,MAA+B,EAAE,OAA+B;IACtF,MAAM,MAAM,GAA4B,EAAE,GAAG,MAAM,EAAE,CAAC;IACtD,KAAK,MAAM,CAAC,IAAI,OAAO;QAAE,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,GAAG,GAAG,CAAC,CAAC,KAAK,GAAG,GAAG,CAAC;IAC9D,OAAO,WAAW,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;AAClC,CAAC;AAED;6DAC6D;AAC7D,SAAS,WAAW,CAAC,KAA6B,EAAE,OAAe;IACjE,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IAClC,OAAO,gBAAgB,CAAC;QACtB,KAAK,EAAE,iBAAiB;QACxB,WAAW,EAAE,UAAU,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC;KAC5C,CAAC,CAAC;AACL,CAAC;AAED,gDAAgD;AAChD,SAAS,QAAQ,CAAC,KAMjB;IACC,IAAI,KAAK,CAAC,EAAE,KAAK,IAAI,EAAE,CAAC;QACtB,OAAO,0CAA0C,CAAC;IACpD,CAAC;IACD,IAAI,KAAK,CAAC,OAAO,EAAE,CAAC;QAClB,OAAO,OAAO,GAAG,KAAK,CAAC,EAAE,GAAG,wBAAwB;cAChD,eAAe,GAAG,WAAW,CAAC,GAAG,EAAE,EAAE,EAAE,EAAE,SAAS,EAAE,EAAE,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC;IAChF,CAAC;IACD,IAAI,KAAK,CAAC,GAAG,KAAK,IAAI,EAAE,CAAC;QACvB,OAAO,OAAO,GAAG,KAAK,CAAC,EAAE,GAAG,qBAAqB;cAC7C,8BAA8B,CAAC;IACrC,CAAC;IACD,OAAO,qCAAqC;UACxC,WAAW,CAAC,GAAG,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;AACrC,CAAC;AAED,mDAAmD;AACnD,SAAS,SAAS,CAAC,KAAmB;IACpC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,GAAG,KAAK,CAAC;IACzC,MAAM,OAAO,GAAG,YAAY,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC;IAC5D,MAAM,OAAO,GAAG,cAAc,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IACjD,0CAA0C;IAC1C,MAAM,QAAQ,GAAG,OAAO,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC9F,MAAM,QAAQ,GAAyB;QACrC,OAAO,EAAE,WAAW,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,SAAS,EAAE,GAAG,EAAE,UAAU,CAAC,GAAG,CAAC;QAC9E,IAAI,EAAE,EAAE,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE;KAC7B,CAAC;IACF,MAAM,EAAE,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC;IACxB,MAAM,KAAK,GAAG,EAAE,KAAK,IAAI;QACvB,CAAC,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,GAAG,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE;QACrD,CAAC,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC;IACpB,MAAM,GAAG,GAAG,KAAK,CAAC,GAAG,CAAC;IACtB,wEAAwE;IACxE,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC;IAC9B,MAAM,IAAI,GAAG,EAAE,KAAK,IAAI,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,KAAK,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,WAAW,CAAC;IACtG,MAAM,MAAM,GAAa,EAAE,CAAC;IAC5B,IAAI,EAAE,KAAK,IAAI,EAAE,CAAC;QAChB,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,EAAE,IAAI,EAAE,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAC/D,CAAC;SAAM,IAAI,OAAO,IAAI,GAAG,KAAK,IAAI,EAAE,CAAC;QACnC,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,GAAG,EAAE,iBAAiB,CAAC,CAAC,CAAC;QACnD,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC;YACpB,KAAK,EAAE,UAAU;YACjB,IAAI,EAAE,OAAO,GAAG,EAAE,GAAG,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,UAAU,CAAC,GAAG,sBAAsB;YAC5E,IAAI,EAAE,mCAAmC;SAC1C,CAAC,CAAC,CAAC;IACN,CAAC;SAAM,IAAI,GAAG,KAAK,IAAI,EAAE,CAAC;QACxB,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC;YACpB,KAAK,EAAE,UAAU;YACjB,IAAI,EAAE,OAAO,GAAG,EAAE,GAAG,aAAa,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,GAAG,GAAG,CAAC;YACzE,IAAI,EAAE,iBAAiB;SACxB,CAAC,CAAC,CAAC;IACN,CAAC;SAAM,CAAC;QACN,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,GAAG,EAAE,gBAAgB,GAAG,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;QAC3D,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC;YACpB,IAAI,EAAE,WAAW,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,cAAc,CAAC,KAAK,CAAC,EAAE,CAAC;YACjE,OAAO,EAAE,mBAAmB;SAC7B,CAAC,CAAC,CAAC;IACN,CAAC;IACD,MAAM,OAAO,GAAG;QACd,SAAS,CAAC;YACR,IAAI,EAAE,EAAE;YACR,MAAM,EAAE,QAAQ;YAChB,KAAK,EAAE,IAAI,KAAK,YAAY,CAAC,CAAC,CAAC,oBAAoB,CAAC,CAAC,CAAC,WAAW;YACjE,IAAI,EAAE,EAAE;SACT,CAAC;QACF,OAAO,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,mBAAmB,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,KAAK,EAAE,UAAU,EAAE,CAAC;QAC7E,kBAAkB,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC;QAC3D,UAAU,CAAC,OAAO,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;QAChC,mBAAmB,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,KAAK,EAAE,EAAE,KAAK,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC;QACvE,WAAW,CAAC,OAAO,EAAE,cAAc,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QACrD,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC;QACf,cAAc,CAAC,QAAQ,CAAC,EAAE,EAAE,EAAE,GAAG,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,EAAE,gBAAgB,CAAC;QACjF,QAAQ,CAAC;YACP,IAAI,EAAE,EAAE,QAAQ,EAAE;YAClB,GAAG,EAAE;gBACH,QAAQ;gBACR,OAAO,EAAE,OAAO,CAAC;oBACf,OAAO,EAAE,WAAW,CAAC,GAAG,EAAE,MAAM,CAAC;oBACjC,MAAM,EAAE,KAAK,CAAC,MAAM;oBACpB,MAAM,EAAE,UAAU;oBAClB,QAAQ,EAAE,KAAK,CAAC,QAAQ;oBACxB,OAAO,EAAE,WAAW;iBACrB,CAAC;aACH;SACF,CAAC;KACH,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACX,OAAO,SAAS,CAAC;QACf,QAAQ,EAAE,SAAS,GAAG,OAAO;QAC7B,KAAK,EAAE,IAAI,GAAG,KAAK,GAAG,CAAC,EAAE,KAAK,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC;QACtD,QAAQ;QACR,IAAI,EAAE,SAAS;QACf,IAAI,EAAE,SAAS;QACf,KAAK,EAAE,QAAQ,CAAC,KAAK;QACrB,GAAG,EAAE,GAAG;QACR,OAAO;KACR,CAAC,CAAC;AACL,CAAC;AAED;oEACoE;AACpE,SAAS,SAAS,CAAC,KAAmB;IACpC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,KAAK,CAAC;IAClC,MAAM,QAAQ,GAAyB;QACrC,OAAO,EAAE,WAAW,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,SAAS,EAAE,GAAG,EAAE,UAAU,CAAC,GAAG,CAAC;QAC9E,IAAI,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE;KAC7C,CAAC;IACF,MAAM,OAAO,GAAG;QACd,SAAS,CAAC;YACR,IAAI,EAAE,EAAE;YACR,MAAM,EAAE,IAAI;YACZ,KAAK,EAAE,MAAM;YACb,IAAI,EAAE,iBAAiB;SACxB,CAAC;QACF,aAAa,CAAC;YACZ,GAAG,YAAY,CAAC,KAAK,CAAC,KAAK,CAAC;YAC5B,iBAAiB,CAAC,OAAO,EAAE,KAAK,CAAC,aAAa,CAAC;YAC/C,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,OAAO,CAAC,YAAY,GAAG,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE;YAC1E;gBACE,KAAK,EAAE,OAAO;gBACd,KAAK,EAAE,OAAO,CAAC,aAAa,CAAC,MAAM,GAAG,IAAI;gBAC1C,MAAM,EAAE,OAAO,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,SAAS;aACjF;SACF,CAAC;QACF,iBAAiB,CAAC,4BAA4B,CAAC;QAC/C,eAAe,CAAC;YACd,OAAO,EAAE,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC;YAClE,IAAI,EAAE,KAAK,CAAC,MAAM;YAClB,OAAO,EAAE,SAAS;SACnB,CAAC;QACF,mBAAmB,CAAC,OAAO,CAAC;QAC5B,OAAO,CAAC,QAAQ,KAAK,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,QAAQ,CAAC;QAC3D,QAAQ,CAAC;YACP,IAAI,EAAE,EAAE,QAAQ,EAAE;YAClB,GAAG,EAAE;gBACH,QAAQ;gBACR,OAAO,EAAE,OAAO,CAAC;oBACf,OAAO,EAAE,WAAW,CAAC,GAAG,EAAE,MAAM,CAAC;oBACjC,MAAM,EAAE,OAAO,CAAC,MAAM;oBACtB,MAAM,EAAE,KAAK,GAAG,OAAO,CAAC,YAAY,GAAG,SAAS;0BAC5C,CAAC,OAAO,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,SAAS,CAAC;oBAC9E,QAAQ,EAAE,OAAO,CAAC,QAAQ;oBAC1B,OAAO,EAAE,WAAW;iBACrB,CAAC;aACH;SACF,CAAC;KACH,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACX,OAAO,SAAS,CAAC;QACf,QAAQ,EAAE,SAAS,GAAG,OAAO;QAC7B,KAAK,EAAE,IAAI,GAAG,OAAO;QACrB,QAAQ,EAAE,OAAO,CAAC,OAAO;QACzB,IAAI,EAAE,SAAS;QACf,IAAI,EAAE,SAAS;QACf,KAAK,EAAE,QAAQ,CAAC,KAAK;QACrB,GAAG,EAAE,GAAG;QACR,OAAO;KACR,CAAC,CAAC;AACL,CAAC;AAED,MAAM,CAAC,MAAM,KAAK,GAAU;IAC1B,EAAE,EAAE,QAAQ;IACZ,QAAQ,EAAE,IAAI;IACd,GAAG,EAAE,GAAG;IACR,IAAI,EAAE,EAAE;IACR,EAAE,EAAE,EAAE;IACN,MAAM,EAAE,QAAQ;IAChB,OAAO,EAAE,SAAS;IAClB,OAAO,EAAE,SAAS;CACnB,CAAC"}
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
/** 写入域场景件的公共契约与落点表(**唯一定义地**)。
|
|
2
|
+
*
|
|
3
|
+
* 本件回答两件事:
|
|
4
|
+
* ① 一件场景件长什么样——`Scene`(id/唤醒词/命令全名/认的 kind/认的 op/待哪一族窗口来填/两张页的装配函数);
|
|
5
|
+
* ② 一条命令该落哪一件——`sceneFor`,判定只有四条(见该函数)。
|
|
6
|
+
*
|
|
7
|
+
* `SCENES` 是 16 行的落点表:13 条 `bill.record.add`(含无 kind 的通用词「记一笔」)+
|
|
8
|
+
* `bill.record.update` 的改记录/撤销/恢复三支,一条词一行、一件。这张表与
|
|
9
|
+
* `docs/skills/skill-bill/t407-场景落点清单.md` 是同一件事的两面:清单给人看,这张表给分派看。
|
|
10
|
+
*
|
|
11
|
+
* 拆件的用意:拆件前 16 条词共用 `collect.ts`/`receipt.ts` 两个件里的装配体,同一时刻只允许一个执行者在写,
|
|
12
|
+
* 15 张页只能串行;拆成一场景一件之后,三族窗口各改各那一件,零文件重叠。
|
|
13
|
+
* 本票**只搬不改行为**:16 件现在都指同一对通用装配体(`./collectBody.ts`/`./receiptBody.ts`),
|
|
14
|
+
* 逐条真跑的产物与拆件前逐字节同量级(读数见 `t407-拆件与三个缺口块-证据.md` 第六节)。
|
|
15
|
+
*
|
|
16
|
+
* 谁在用(两个调用点,指名):
|
|
17
|
+
* ① `src/record/collect.ts`——采集页分派:`sceneFor` 取件,叫它的 `collect`;
|
|
18
|
+
* ② `src/record/receipt.ts`——回执页分派:同一件,叫它的 `receipt`。
|
|
19
|
+
*/
|
|
20
|
+
import type { BillRow } from '../fetch/db.js';
|
|
21
|
+
import type { SummaryFacts } from '../shared/summaryRow.js';
|
|
22
|
+
import type { BillReceipt } from '../shared/writeParts.js';
|
|
23
|
+
import type { RecordSlot } from './slots.js';
|
|
24
|
+
/** 采集页入参:时刻与来源由调用方给(共用位不取时钟、不取库文件名);`recent`=近期记录(预填/重复检测/候选三处共用)。 */
|
|
25
|
+
export interface CollectInput {
|
|
26
|
+
readonly key: string;
|
|
27
|
+
readonly params: Record<string, unknown>;
|
|
28
|
+
readonly slots: readonly RecordSlot[];
|
|
29
|
+
readonly missing: readonly RecordSlot[];
|
|
30
|
+
readonly source: string;
|
|
31
|
+
readonly actionAt: string;
|
|
32
|
+
/** 本页执行那天(`YYYY-MM-DD`):缺省时间的取值、重复检测的比对面都用它。 */
|
|
33
|
+
readonly today: string;
|
|
34
|
+
/** 近期记录(按时间倒序,最近在先);取数由处理体给,页面不碰库。 */
|
|
35
|
+
readonly recent: readonly BillRow[];
|
|
36
|
+
}
|
|
37
|
+
/** 回执页入参:回执事实 + 本次写入的明细行 + 一句写入去向的说明(`receiptStatusCard` 要它)
|
|
38
|
+
* + 摘要行的六个事实 + 近期记录(重复检测用;取数由处理体给,页面不碰库)。 */
|
|
39
|
+
export interface ReceiptInput {
|
|
40
|
+
readonly key: string;
|
|
41
|
+
readonly params: Record<string, unknown>;
|
|
42
|
+
readonly receipt: BillReceipt;
|
|
43
|
+
readonly writtenDetail: string;
|
|
44
|
+
/** 明细表的行(本次写入的字段与值);写成字面量类型(不是 interface)的理由见 `receiptBody.ts`。 */
|
|
45
|
+
readonly detail: readonly {
|
|
46
|
+
readonly k: string;
|
|
47
|
+
readonly v: string;
|
|
48
|
+
}[];
|
|
49
|
+
readonly facts: SummaryFacts;
|
|
50
|
+
readonly recent: readonly BillRow[];
|
|
51
|
+
}
|
|
52
|
+
/** 一件场景件:一条唤醒词的落点。 */
|
|
53
|
+
export interface Scene {
|
|
54
|
+
/** 件的名字(与文件名 `scene-<id>.ts` 对得上)。 */
|
|
55
|
+
readonly id: string;
|
|
56
|
+
/** 这一件服务的唤醒词(一条词一件)。 */
|
|
57
|
+
readonly wakeWord: string;
|
|
58
|
+
/** 命令全名(`bill.record.add` 或 `bill.record.update`)。 */
|
|
59
|
+
readonly key: string;
|
|
60
|
+
/** 认的 `kind` 值(空串=这一件不按 kind 认,靠命令名落)。 */
|
|
61
|
+
readonly kind: string;
|
|
62
|
+
/** 认的 `op` 值(空串=这一件不按 op 认)。 */
|
|
63
|
+
readonly op: string;
|
|
64
|
+
/** 待哪一族窗口来填这一件的页(三族:基础收支族/特殊收支族/批量与修正族)。 */
|
|
65
|
+
readonly family: string;
|
|
66
|
+
/** 这一件的过程型采集页(缺项那一支)。 */
|
|
67
|
+
readonly collect: (input: CollectInput) => string;
|
|
68
|
+
/** 这一件的结果型回执页(写库成功那一支)。 */
|
|
69
|
+
readonly receipt: (input: ReceiptInput) => string;
|
|
70
|
+
}
|
|
71
|
+
/** 16 行的落点表(**唯一定义地**)。顺序与 `t407-场景落点清单.md` 一致:先 13 条录入词,后 3 条修正词。 */
|
|
72
|
+
export declare const SCENES: readonly Scene[];
|
|
73
|
+
/** 取件(判定只有四条,见件头;认不得的 kind 落「记一笔」,不猜、不抛——命令本身已由注册表拦过)。 */
|
|
74
|
+
export declare function sceneFor(input: {
|
|
75
|
+
readonly key: string;
|
|
76
|
+
readonly kind?: string;
|
|
77
|
+
readonly op?: string;
|
|
78
|
+
}): Scene;
|
|
79
|
+
//# sourceMappingURL=scene.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scene.d.ts","sourceRoot":"","sources":["../../src/record/scene.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AACH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAC5D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAkB7C,sEAAsE;AACtE,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACzC,QAAQ,CAAC,KAAK,EAAE,SAAS,UAAU,EAAE,CAAC;IACtC,QAAQ,CAAC,OAAO,EAAE,SAAS,UAAU,EAAE,CAAC;IACxC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,gDAAgD;IAChD,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,sCAAsC;IACtC,QAAQ,CAAC,MAAM,EAAE,SAAS,OAAO,EAAE,CAAC;CACrC;AAED;8CAC8C;AAC9C,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACzC,QAAQ,CAAC,OAAO,EAAE,WAAW,CAAC;IAC9B,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,mEAAmE;IACnE,QAAQ,CAAC,MAAM,EAAE,SAAS;QAAE,QAAQ,CAAC,CAAC,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,CAAC,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IACvE,QAAQ,CAAC,KAAK,EAAE,YAAY,CAAC;IAC7B,QAAQ,CAAC,MAAM,EAAE,SAAS,OAAO,EAAE,CAAC;CACrC;AAED,sBAAsB;AACtB,MAAM,WAAW,KAAK;IACpB,sCAAsC;IACtC,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,wBAAwB;IACxB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,sDAAsD;IACtD,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,0CAA0C;IAC1C,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,gCAAgC;IAChC,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,4CAA4C;IAC5C,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,yBAAyB;IACzB,QAAQ,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,YAAY,KAAK,MAAM,CAAC;IAClD,2BAA2B;IAC3B,QAAQ,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,YAAY,KAAK,MAAM,CAAC;CACnD;AAED,sEAAsE;AACtE,eAAO,MAAM,MAAM,EAAE,SAAS,KAAK,EAIlC,CAAC;AAKF,0DAA0D;AAC1D,wBAAgB,QAAQ,CAAC,KAAK,EAAE;IAAE,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,KAAK,CAS7G"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { SCENE as sceneBorrow } from './scene-borrow.js';
|
|
2
|
+
import { SCENE as sceneBatch } from './scene-batch.js';
|
|
3
|
+
import { SCENE as sceneCollect } from './scene-collect.js';
|
|
4
|
+
import { SCENE as sceneExpense } from './scene-expense.js';
|
|
5
|
+
import { SCENE as sceneIncome } from './scene-income.js';
|
|
6
|
+
import { SCENE as sceneInstallment } from './scene-installment.js';
|
|
7
|
+
import { SCENE as sceneLend } from './scene-lend.js';
|
|
8
|
+
import { SCENE as scenePhoto } from './scene-photo.js';
|
|
9
|
+
import { SCENE as scenePlain } from './scene-plain.js';
|
|
10
|
+
import { SCENE as sceneRefund } from './scene-refund.js';
|
|
11
|
+
import { SCENE as sceneReimburse } from './scene-reimburse.js';
|
|
12
|
+
import { SCENE as sceneReimburseDone } from './scene-reimburse-done.js';
|
|
13
|
+
import { SCENE as sceneRepay } from './scene-repay.js';
|
|
14
|
+
import { SCENE as sceneRestore } from './scene-restore.js';
|
|
15
|
+
import { SCENE as sceneUndo } from './scene-undo.js';
|
|
16
|
+
import { SCENE as sceneUpdate } from './scene-update.js';
|
|
17
|
+
/** 16 行的落点表(**唯一定义地**)。顺序与 `t407-场景落点清单.md` 一致:先 13 条录入词,后 3 条修正词。 */
|
|
18
|
+
export const SCENES = [
|
|
19
|
+
sceneExpense, sceneIncome, scenePhoto, sceneBatch, sceneRefund, sceneReimburse, sceneReimburseDone,
|
|
20
|
+
sceneLend, sceneBorrow, sceneCollect, sceneRepay, sceneInstallment, scenePlain,
|
|
21
|
+
sceneUpdate, sceneUndo, sceneRestore,
|
|
22
|
+
];
|
|
23
|
+
const BY_KIND = new Map(SCENES.filter((s) => s.kind !== '').map((s) => [s.kind, s]));
|
|
24
|
+
const BY_OP = new Map(SCENES.filter((s) => s.op !== '').map((s) => [s.op, s]));
|
|
25
|
+
/** 取件(判定只有四条,见件头;认不得的 kind 落「记一笔」,不猜、不抛——命令本身已由注册表拦过)。 */
|
|
26
|
+
export function sceneFor(input) {
|
|
27
|
+
const kind = typeof input.kind === 'string' ? input.kind : '';
|
|
28
|
+
const op = typeof input.op === 'string' ? input.op : '';
|
|
29
|
+
const byKind = BY_KIND.get(kind);
|
|
30
|
+
if (kind !== '' && byKind !== undefined)
|
|
31
|
+
return byKind;
|
|
32
|
+
const byOp = BY_OP.get(op);
|
|
33
|
+
if (byOp !== undefined)
|
|
34
|
+
return byOp;
|
|
35
|
+
if (input.key === 'bill.record.update')
|
|
36
|
+
return sceneUpdate;
|
|
37
|
+
return scenePlain;
|
|
38
|
+
}
|
|
39
|
+
//# sourceMappingURL=scene.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scene.js","sourceRoot":"","sources":["../../src/record/scene.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/** 一个槽位:参数名/中文名/怎么给/是否必需。
|
|
2
|
+
* 中文名的**唯一定义地**是 `../shared/userWording.js` 的 `fieldLabelOf`(库列名与用户说法只在那里对照一次):
|
|
3
|
+
* 本表只写参数名与怎么给,中文名由它派生——两处各写一份中文名就会走散。 */
|
|
4
|
+
export interface RecordSlot {
|
|
5
|
+
readonly name: string;
|
|
6
|
+
readonly label: string;
|
|
7
|
+
readonly hint: string;
|
|
8
|
+
readonly required: boolean;
|
|
9
|
+
}
|
|
10
|
+
/** 两条写命令的槽位表。提示句都是**用户说法**:`缺省=…` 这类口径词不上屏(本轮整改)。 */
|
|
11
|
+
export declare const RECORD_SLOTS: Record<string, readonly RecordSlot[]>;
|
|
12
|
+
/** 一个值算不算「给了」:`undefined`/`null`/空白串都不算。数字 `0` 视同没给(金额 0 本仓不记,裁定第 3 条)。 */
|
|
13
|
+
export declare function isGiven(v: unknown): boolean;
|
|
14
|
+
/** 必需槽位里哪些没给(**只探针,不做真值校验**)。金额栏另判数字 `0` 与 `"0"` 串:它们视同没给。 */
|
|
15
|
+
export declare function missingSlots(params: Record<string, unknown>, slots: readonly RecordSlot[]): RecordSlot[];
|
|
16
|
+
//# sourceMappingURL=slots.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"slots.d.ts","sourceRoot":"","sources":["../../src/record/slots.ts"],"names":[],"mappings":"AAoBA;;0CAE0C;AAC1C,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;CAC5B;AAOD,qDAAqD;AACrD,eAAO,MAAM,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,SAAS,UAAU,EAAE,CAqB9D,CAAC;AAEF,2EAA2E;AAC3E,wBAAgB,OAAO,CAAC,CAAC,EAAE,OAAO,GAAG,OAAO,CAI3C;AAED,8DAA8D;AAC9D,wBAAgB,YAAY,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,KAAK,EAAE,SAAS,UAAU,EAAE,GAAG,UAAU,EAAE,CAWxG"}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
/** 写入域两条写命令的槽位表与缺项探针(**唯一定义地**,本票从 `collect.ts` 原样搬来)。
|
|
2
|
+
*
|
|
3
|
+
* 谁在用(两个调用点,指名):
|
|
4
|
+
* ① `src/record/write.ts`——两条写命令的处理体:拿 `missingSlots` 探「必需槽位在不在」,
|
|
5
|
+
* 拿 `RECORD_SLOTS` 派生「记一笔写进库的列全集」;
|
|
6
|
+
* ② `src/record/collect.ts`(经它转出给三套测试)与 `src/record/collectBody.ts`——采集页按槽位表出表单。
|
|
7
|
+
* 第二个消费者:`src/query/`(随兄弟图 #403 的查询域一起到位,同一套采集页要同一张槽位表)。
|
|
8
|
+
*
|
|
9
|
+
* 「一条命令要哪些槽位、哪个必需」与「表单怎么摆」原本同住一件;本票按场景拆件时把前者单独搬到这里,
|
|
10
|
+
* 理由:场景件只管自己那张页怎么摆,槽位表是两条命令共有的**事实**,搬进场景件就会各抄一份。
|
|
11
|
+
*
|
|
12
|
+
* 必需性照 `src/policy/category.ts` 的 `validateRecord`:分类与金额没有缺省值(必需),
|
|
13
|
+
* 时间/账户/账本/币种/备注都有缺省值(可缺)。七槽里的「名目」没有库列:它落在三级分类的最后一段
|
|
14
|
+
* (如 `餐饮/外卖/午餐`)或备注里,提示里写明。
|
|
15
|
+
* `missingSlots` 只做「在不在」的探针;方向不符那一半住 `../shared/blockedSlots.ts` 的 `blockedItems`,
|
|
16
|
+
* **只服务录入路径**(`bill.record.add` 采集页传 `kind`;`bill.record.update` 那一支不判方向)。
|
|
17
|
+
* 真值校验仍走 `src/policy` 的 `validateAddInput`/`validateUpdateInput`(阻断项清空后才走到那一步)。
|
|
18
|
+
*/
|
|
19
|
+
import { fieldLabelOf } from '../shared/userWording.js';
|
|
20
|
+
/** 一条槽位(中文名走映射件,不在这里另写一份对照)。 */
|
|
21
|
+
function slot(name, hint, required) {
|
|
22
|
+
return { name, label: fieldLabelOf(name), hint, required };
|
|
23
|
+
}
|
|
24
|
+
/** 两条写命令的槽位表。提示句都是**用户说法**:`缺省=…` 这类口径词不上屏(本轮整改)。 */
|
|
25
|
+
export const RECORD_SLOTS = {
|
|
26
|
+
'bill.record.add': [
|
|
27
|
+
slot('category', '三级分类,如 餐饮/外卖/午餐。要选到最细那一级', true),
|
|
28
|
+
slot('amount', '支出记负数、收入记正数,如 -12.5', true),
|
|
29
|
+
slot('time', '不填就记成今天 12:00:00', false),
|
|
30
|
+
slot('account', '不填就记到默认账户', false),
|
|
31
|
+
slot('ledger', '不填就记到默认账本', false),
|
|
32
|
+
slot('currency', '不填就用默认币种', false),
|
|
33
|
+
slot('note', '自由文本;名目写在这里,可带 #标签', false),
|
|
34
|
+
],
|
|
35
|
+
'bill.record.update': [
|
|
36
|
+
slot('id', '要改的那条记录的编号(撤销/恢复同样要它)', true),
|
|
37
|
+
slot('op', '不填=改字段;undo=撤销/restore=恢复', false),
|
|
38
|
+
slot('category', '不改就别给', false),
|
|
39
|
+
slot('amount', '不改就别给', false),
|
|
40
|
+
slot('time', '不改就别给', false),
|
|
41
|
+
slot('account', '不改就别给', false),
|
|
42
|
+
slot('ledger', '不改就别给', false),
|
|
43
|
+
slot('currency', '不改就别给', false),
|
|
44
|
+
slot('note', '不改就别给', false),
|
|
45
|
+
],
|
|
46
|
+
};
|
|
47
|
+
/** 一个值算不算「给了」:`undefined`/`null`/空白串都不算。数字 `0` 视同没给(金额 0 本仓不记,裁定第 3 条)。 */
|
|
48
|
+
export function isGiven(v) {
|
|
49
|
+
if (v === undefined || v === null)
|
|
50
|
+
return false;
|
|
51
|
+
if (typeof v === 'number' && v === 0)
|
|
52
|
+
return false;
|
|
53
|
+
return !(typeof v === 'string' && v.trim() === '');
|
|
54
|
+
}
|
|
55
|
+
/** 必需槽位里哪些没给(**只探针,不做真值校验**)。金额栏另判数字 `0` 与 `"0"` 串:它们视同没给。 */
|
|
56
|
+
export function missingSlots(params, slots) {
|
|
57
|
+
return slots.filter((s) => {
|
|
58
|
+
if (!s.required)
|
|
59
|
+
return false;
|
|
60
|
+
const v = params[s.name];
|
|
61
|
+
if (!isGiven(v))
|
|
62
|
+
return true;
|
|
63
|
+
if (s.name === 'amount') {
|
|
64
|
+
if (typeof v === 'number' && v === 0)
|
|
65
|
+
return true;
|
|
66
|
+
if (typeof v === 'string' && v.trim() !== '' && Number(v.trim()) === 0)
|
|
67
|
+
return true;
|
|
68
|
+
}
|
|
69
|
+
return false;
|
|
70
|
+
});
|
|
71
|
+
}
|
|
72
|
+
//# sourceMappingURL=slots.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"slots.js","sourceRoot":"","sources":["../../src/record/slots.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AACH,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAYxD,gCAAgC;AAChC,SAAS,IAAI,CAAC,IAAY,EAAE,IAAY,EAAE,QAAiB;IACzD,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,YAAY,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;AAC7D,CAAC;AAED,qDAAqD;AACrD,MAAM,CAAC,MAAM,YAAY,GAA0C;IACjE,iBAAiB,EAAE;QACjB,IAAI,CAAC,UAAU,EAAE,0BAA0B,EAAE,IAAI,CAAC;QAClD,IAAI,CAAC,QAAQ,EAAE,qBAAqB,EAAE,IAAI,CAAC;QAC3C,IAAI,CAAC,MAAM,EAAE,kBAAkB,EAAE,KAAK,CAAC;QACvC,IAAI,CAAC,SAAS,EAAE,WAAW,EAAE,KAAK,CAAC;QACnC,IAAI,CAAC,QAAQ,EAAE,WAAW,EAAE,KAAK,CAAC;QAClC,IAAI,CAAC,UAAU,EAAE,UAAU,EAAE,KAAK,CAAC;QACnC,IAAI,CAAC,MAAM,EAAE,oBAAoB,EAAE,KAAK,CAAC;KAC1C;IACD,oBAAoB,EAAE;QACpB,IAAI,CAAC,IAAI,EAAE,uBAAuB,EAAE,IAAI,CAAC;QACzC,IAAI,CAAC,IAAI,EAAE,2BAA2B,EAAE,KAAK,CAAC;QAC9C,IAAI,CAAC,UAAU,EAAE,OAAO,EAAE,KAAK,CAAC;QAChC,IAAI,CAAC,QAAQ,EAAE,OAAO,EAAE,KAAK,CAAC;QAC9B,IAAI,CAAC,MAAM,EAAE,OAAO,EAAE,KAAK,CAAC;QAC5B,IAAI,CAAC,SAAS,EAAE,OAAO,EAAE,KAAK,CAAC;QAC/B,IAAI,CAAC,QAAQ,EAAE,OAAO,EAAE,KAAK,CAAC;QAC9B,IAAI,CAAC,UAAU,EAAE,OAAO,EAAE,KAAK,CAAC;QAChC,IAAI,CAAC,MAAM,EAAE,OAAO,EAAE,KAAK,CAAC;KAC7B;CACF,CAAC;AAEF,2EAA2E;AAC3E,MAAM,UAAU,OAAO,CAAC,CAAU;IAChC,IAAI,CAAC,KAAK,SAAS,IAAI,CAAC,KAAK,IAAI;QAAE,OAAO,KAAK,CAAC;IAChD,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IACnD,OAAO,CAAC,CAAC,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;AACrD,CAAC;AAED,8DAA8D;AAC9D,MAAM,UAAU,YAAY,CAAC,MAA+B,EAAE,KAA4B;IACxF,OAAO,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE;QACxB,IAAI,CAAC,CAAC,CAAC,QAAQ;YAAE,OAAO,KAAK,CAAC;QAC9B,MAAM,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QACzB,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC;YAAE,OAAO,IAAI,CAAC;QAC7B,IAAI,CAAC,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YACxB,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC;gBAAE,OAAO,IAAI,CAAC;YAClD,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,IAAI,MAAM,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC;gBAAE,OAAO,IAAI,CAAC;QACtF,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { BillDb } from '../fetch/index.js';
|
|
2
|
+
import type { WriteOut } from '../shared/commandSpec.js';
|
|
3
|
+
/** `bill.record.add`(记一笔,**录入路径**):有阻断项(缺分类或金额/金额符号与这一型不符)即出采集页,
|
|
4
|
+
* 清空即写库出回执整页。方向判定只在这一支传 `kind`。 */
|
|
5
|
+
export declare function writeRecordAdd(params: Record<string, unknown>, db: BillDb): WriteOut;
|
|
6
|
+
/** `bill.record.update`(改记录):有阻断项(缺 `id`)即出采集页;op 决定改字段/撤销/恢复三支。
|
|
7
|
+
* **这一支不判金额方向**:撤销/恢复本来就不带 `kind`+`amount`,带上也不该被方向判定拦下、改出采集页。 */
|
|
8
|
+
export declare function writeRecordUpdate(params: Record<string, unknown>, db: BillDb): WriteOut;
|
|
9
|
+
//# sourceMappingURL=write.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"write.d.ts","sourceRoot":"","sources":["../../src/record/write.ts"],"names":[],"mappings":"AAqBA,OAAO,KAAK,EAAE,MAAM,EAAW,MAAM,mBAAmB,CAAC;AAIzD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,0BAA0B,CAAC;AAoIzD;oCACoC;AACpC,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,EAAE,EAAE,MAAM,GAAG,QAAQ,CAqBpF;AAED;mEACmE;AACnE,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,EAAE,EAAE,MAAM,GAAG,QAAQ,CA0CvF"}
|