dsh-erpbot 0.1.0 → 0.1.1
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/README.md +50 -29
- package/bot-identity.js +246 -0
- package/client.js +2438 -627
- package/cordis.patch.yml +128 -0
- package/docs/README.md +39 -0
- package/docs/acceptance.md +136 -0
- package/docs/architecture.md +161 -0
- package/docs/bot-agents-spec.md +205 -0
- package/docs/bot-collaboration-spec.md +161 -0
- package/docs/data-contract.md +262 -0
- package/docs/mcp-inventory-analysis.md +58 -0
- package/docs/requirements.md +234 -0
- package/index.js +270 -15
- package/package.json +6 -2
- package/scripts/check-bot-identity.mjs +71 -0
- package/scripts/lint-factories.mjs +315 -0
- package/scripts/lint-scopes.mjs +179 -0
- package/scripts/scaffold-bots.mjs +76 -0
- package/scripts/test-manifest.mjs +72 -0
- package/scripts/verify.mjs +159 -0
- package/spec/README.md +299 -0
- package/spec/base-content-spec.md +129 -0
- package/spec/cai-content-spec.md +257 -0
- package/spec/shui-content-spec.md +252 -0
- package/spec/spec-CORE.md +155 -0
- package/spec/tui-content-spec.md +259 -0
- package/spec/zi-content-spec.md +256 -0
- package/src/assistant/index.js +389 -4
- package/src/bot-data.js +25 -13
- package/src/bundle.json +1 -0
- package/src/cards/index.js +18 -4
- package/src/dashboard/index.js +65 -25
- package/src/entry.js +7 -7
- package/src/i18n/index.js +80 -60
- package/src/mount.js +19 -2
- package/src/nav.js +7 -5
- package/src/pages-data.js +29 -262
- package/src/shell/index.js +57 -33
- package/src/styles.js +396 -78
- package/src/workbench/index.js +1297 -85
package/src/pages-data.js
CHANGED
|
@@ -13,30 +13,30 @@
|
|
|
13
13
|
titleKey: 'ov.blocks',
|
|
14
14
|
items: [
|
|
15
15
|
{
|
|
16
|
-
key: 'nav.
|
|
17
|
-
page: '
|
|
16
|
+
key: 'nav.finance', value: '1,284', subKey: 'focus.finance.sub', timeKey: 'focus.time.past', pct: 67,
|
|
17
|
+
page: 'finance', icon: 'doc', unitKey: 'blocks.unit.vouchers',
|
|
18
18
|
period: '2026-11',
|
|
19
19
|
chart: { type: 'bars', data: [58, 72, 64, 80, 70, 86] },
|
|
20
20
|
cells: [
|
|
21
|
-
{ k: '
|
|
22
|
-
{ k: '
|
|
23
|
-
{ k: '
|
|
21
|
+
{ k: 'finance.diff', v: '0.00' },
|
|
22
|
+
{ k: 'finance.pending', v: '37' },
|
|
23
|
+
{ k: 'finance.reportsDone', v: '2/3' },
|
|
24
24
|
],
|
|
25
25
|
},
|
|
26
26
|
{
|
|
27
|
-
key: 'nav.
|
|
28
|
-
page: '
|
|
27
|
+
key: 'nav.funds', value: '¥8,450,000.00', subKey: 'focus.funds.sub', timeKey: 'focus.time.now', pct: 82,
|
|
28
|
+
page: 'funds', icon: 'wallet',
|
|
29
29
|
period: '2026-11',
|
|
30
30
|
chart: { type: 'line', data: [52, 61, 58, 70, 66, 78] },
|
|
31
31
|
cells: [
|
|
32
32
|
{ k: 'focus.cash', v: '¥7,100,000.00' },
|
|
33
|
-
{ k: '
|
|
34
|
-
{ k: '
|
|
33
|
+
{ k: 'funds.unreconciled', v: '3' },
|
|
34
|
+
{ k: 'funds.plan', v: '¥2,480,000.00' },
|
|
35
35
|
],
|
|
36
36
|
},
|
|
37
37
|
{
|
|
38
|
-
key: 'nav.
|
|
39
|
-
page: '
|
|
38
|
+
key: 'nav.forecast', value: '64%', subKey: 'focus.forecast.sub', timeKey: 'focus.time.future', pct: 64,
|
|
39
|
+
page: 'forecast', icon: 'chart',
|
|
40
40
|
period: '2026-11',
|
|
41
41
|
chart: {
|
|
42
42
|
type: 'donut',
|
|
@@ -51,19 +51,19 @@
|
|
|
51
51
|
},
|
|
52
52
|
cells: [
|
|
53
53
|
{ k: 'focus.budget', v: '64%' },
|
|
54
|
-
{ k: '
|
|
55
|
-
{ k: '
|
|
54
|
+
{ k: 'forecast.revenue', v: '¥2,480,000.00' },
|
|
55
|
+
{ k: 'forecast.variance', v: '+0.5%' },
|
|
56
56
|
],
|
|
57
57
|
},
|
|
58
58
|
{
|
|
59
|
-
key: 'nav.
|
|
60
|
-
page: '
|
|
59
|
+
key: 'nav.tax', value: '¥86,400.00', subKey: 'focus.tax.sub', pct: 72,
|
|
60
|
+
page: 'tax', icon: 'list',
|
|
61
61
|
period: '2026-10',
|
|
62
62
|
chart: { type: 'bars', data: [62, 70, 66, 78, 72, 84] },
|
|
63
63
|
cells: [
|
|
64
|
-
{ k: '
|
|
65
|
-
{ k: '
|
|
66
|
-
{ k: '
|
|
64
|
+
{ k: 'tax.output', v: '¥150,800.00' },
|
|
65
|
+
{ k: 'tax.input', v: '¥64,400.00' },
|
|
66
|
+
{ k: 'tax.filing', v: '2/3' },
|
|
67
67
|
],
|
|
68
68
|
},
|
|
69
69
|
],
|
|
@@ -193,245 +193,12 @@
|
|
|
193
193
|
}
|
|
194
194
|
},
|
|
195
195
|
],
|
|
196
|
-
sections: [
|
|
197
|
-
{
|
|
198
|
-
icon: 'swap',
|
|
199
|
-
label: { zh: 'MCP 通道与服务', en: 'MCP channels and services' },
|
|
200
|
-
kind: 'table',
|
|
201
|
-
pill: { zh: '6 条 · 48 工具', en: '6 channels · 48 tools' },
|
|
202
|
-
summary: [{ label: { zh: '已连接', en: 'Linked' }, value: { zh: '5', en: '5' }, tone: 'ok' }, { label: { zh: '部分授权', en: 'Partial auth' }, value: { zh: '1', en: '1' }, tone: 'warn' }, { label: { zh: '启用 / 注册工具', en: 'Tools enabled / registered' }, value: { zh: '39 / 48', en: '39 / 48' } }],
|
|
203
|
-
data: {
|
|
204
|
-
columns: [{ label: { zh: '通道', en: 'Channel' } }, { label: { zh: '类型', en: 'Type' } }, { label: { zh: '协议与鉴权', en: 'Protocol and auth' } }, { label: { zh: '工具(启用 / 注册)', en: 'Tools (enabled / registered)' }, align: 'right' }, { label: { zh: '可用率', en: 'Uptime' }, align: 'right' }, { label: { zh: 'P95', en: 'P95' }, align: 'right' }, { label: { zh: '最近调用', en: 'Last call' }, align: 'right' }, { label: { zh: '状态', en: 'Status' } }],
|
|
205
|
-
rows: [
|
|
206
|
-
[{ zh: '用友 U8', en: 'Yonyou U8' }, { zh: 'ERP 适配', en: 'ERP adapter' }, { zh: 'MCP over stdio · 服务账号 + 密钥', en: 'MCP over stdio · service account and key' }, { zh: '14 / 18', en: '14 / 18' }, { zh: '100.0%', en: '100.0%', tone: 'ok' }, '2.1s', '23:12', { zh: '已连接', en: 'Linked', tone: 'ok' }],
|
|
207
|
-
[{ zh: '金蝶云星空', en: 'Kingdee Cloud' }, { zh: 'ERP 适配', en: 'ERP adapter' }, { zh: 'MCP over HTTP · OAuth2', en: 'MCP over HTTP · OAuth2' }, { zh: '9 / 12', en: '9 / 12' }, { zh: '100.0%', en: '100.0%', tone: 'ok' }, '1.9s', '18:55', { zh: '已连接', en: 'Linked', tone: 'ok' }],
|
|
208
|
-
[{ zh: '数电发票', en: 'E-invoice' }, { zh: '票税平台', en: 'Tax platform' }, { zh: 'MCP over HTTPS · 服务账号 + 证书', en: 'MCP over HTTPS · service account and certificate' }, { zh: '6 / 6', en: '6 / 6' }, { zh: '100.0%', en: '100.0%', tone: 'ok' }, '1.6s', '23:05', { zh: '已连接', en: 'Linked', tone: 'ok' }],
|
|
209
|
-
[{ zh: '电子税务局', en: 'E-tax bureau' }, { zh: '票税平台', en: 'Tax platform' }, { zh: 'MCP over HTTPS · 证书 + 身份快照', en: 'MCP over HTTPS · certificate and identity snapshot' }, { zh: '4 / 4', en: '4 / 4' }, { zh: '100.0%', en: '100.0%', tone: 'ok' }, '2.6s', '22:40', { zh: '已连接', en: 'Linked', tone: 'ok' }],
|
|
210
|
-
[{ zh: '影像 OCR', en: 'Imaging OCR' }, { zh: '文档识别', en: 'Document reading' }, { zh: 'MCP over HTTP · 服务账号', en: 'MCP over HTTP · service account' }, { zh: '3 / 3', en: '3 / 3' }, { zh: '99.9%', en: '99.9%', tone: 'warn' }, '5.0s', '18:40', { zh: '已连接', en: 'Linked', tone: 'ok' }],
|
|
211
|
-
[{ zh: '银行直连', en: 'Bank link' }, { zh: '银行直连', en: 'Bank link' }, { zh: 'MCP over HTTPS · 证书 + 双人授权', en: 'MCP over HTTPS · certificate and dual approval' }, { zh: '3 / 5', en: '3 / 5' }, { zh: '99.7%', en: '99.7%', tone: 'warn' }, '2.4s', '21:30', { zh: '部分授权', en: 'Partial auth', tone: 'warn' }],
|
|
212
|
-
],
|
|
213
|
-
total: [{ zh: '合计', en: 'Total' }, { zh: '4 类', en: '4 types' }, '—', { zh: '39 / 48', en: '39 / 48' }, { zh: '99.6%', en: '99.6%' }, '—', { zh: '最近 23:12', en: 'Last 23:12' }, { zh: '5 已连接 / 1 部分授权', en: '5 linked / 1 partial' }]
|
|
214
|
-
},
|
|
215
|
-
alt: {
|
|
216
|
-
kind: 'table',
|
|
217
|
-
label: { zh: '可联通资产', en: 'Connected assets' },
|
|
218
|
-
data: {
|
|
219
|
-
columns: [{ label: { zh: '资产类型', en: 'Asset type' } }, { label: { zh: '资产', en: 'Asset' } }, { label: { zh: '所属通道', en: 'Channel' } }, { label: { zh: '取数内容', en: 'Data scope' } }, { label: { zh: '状态', en: 'Status' } }],
|
|
220
|
-
rows: [
|
|
221
|
-
[{ zh: '账套', en: 'Ledger' }, { zh: 'U8 2026 年度账', en: 'U8 FY2026 ledger' }, { zh: '用友 U8', en: 'Yonyou U8' }, { zh: '凭证 / 账簿 / 报表', en: 'Vouchers, ledgers, reports' }, { zh: '已联通', en: 'Linked', tone: 'ok' }],
|
|
222
|
-
[{ zh: '账套', en: 'Ledger' }, { zh: '金蝶 2026 账套', en: 'Kingdee FY2026 ledger' }, { zh: '金蝶云星空', en: 'Kingdee Cloud' }, { zh: '采购 / 库存 / 应收', en: 'Purchasing, stock, AR' }, { zh: '已联通', en: 'Linked', tone: 'ok' }],
|
|
223
|
-
[{ zh: '账户', en: 'Account' }, { zh: '工行 4821', en: 'ICBC 4821' }, { zh: '银行直连', en: 'Bank link' }, { zh: '余额与流水', en: 'Balances and statements' }, { zh: '已联通', en: 'Linked', tone: 'ok' }],
|
|
224
|
-
[{ zh: '账户', en: 'Account' }, { zh: '工行 7356', en: 'ICBC 7356' }, { zh: '银行直连', en: 'Bank link' }, { zh: '余额与流水', en: 'Balances and statements' }, { zh: '已联通', en: 'Linked', tone: 'ok' }],
|
|
225
|
-
[{ zh: '账户', en: 'Account' }, { zh: '招行 2093', en: 'CMB 2093' }, { zh: '银行直连', en: 'Bank link' }, { zh: '余额与流水', en: 'Balances and statements' }, { zh: '已联通', en: 'Linked', tone: 'ok' }],
|
|
226
|
-
[{ zh: '发票', en: 'Invoice' }, { zh: '数电销项', en: 'E-invoice output' }, { zh: '数电发票', en: 'E-invoice' }, { zh: '销项票面', en: 'Output invoice face' }, { zh: '已联通', en: 'Linked', tone: 'ok' }],
|
|
227
|
-
[{ zh: '发票', en: 'Invoice' }, { zh: '数电进项', en: 'E-invoice input' }, { zh: '数电发票', en: 'E-invoice' }, { zh: '进项与勾选', en: 'Input and selection' }, { zh: '已联通', en: 'Linked', tone: 'ok' }],
|
|
228
|
-
[{ zh: '费控', en: 'Expense control' }, { zh: '费控系统', en: 'Expense system' }, { zh: '费控(文件)', en: 'Expense files' }, { zh: '报销单与预算', en: 'Claims and budget' }, { zh: '已联通', en: 'Linked', tone: 'ok' }]
|
|
229
|
-
]
|
|
230
|
-
}
|
|
231
|
-
},
|
|
232
|
-
foot: {
|
|
233
|
-
zh: '通道 6 = U8 1 + 金蝶 1 + 数电发票 1 + 电子税务局 1 + 影像 OCR 1 + 银行直连 1;已连接 5 + 部分授权 1(建行 2 户待授权);工具 48 = 18+12+6+4+3+5,启用 39 / 策略禁用 7 / 待授权 2(48 = 39 + 7 + 2);越权拦截 3 均留回执;alt 8 项资产 = 账套 2 + 账户 3 + 发票 2 + 费控 1(未联通 3 账户 = 建行 2 户 + 中行 1 户);可用率 / P95 取近 30 天:可用率 = (720 − 2.9) ÷ 720 = 717.1 ÷ 720 = 99.5972% → 99.6%,6 行不可用分钟 110 + 30 + 8 + 8 + 9 + 9 = 174 分钟 = 2.9h(去重前窗口,平台按去重后 2.9h 计);配置 CFG-2026-11-08(生效 11-08);口径 C-2026-11-01',
|
|
234
|
-
en: '6 channels = U8 1 + Kingdee 1 + e-invoice 1 + e-tax bureau 1 + imaging OCR 1 + bank link 1; 5 linked plus 1 partial (2 CCB accounts pending auth); tools 48 = 18+12+6+4+3+5 with 39 enabled, 7 policy-disabled and 2 pending auth (48 = 39 + 7 + 2); the 3 blocked calls each leave a receipt; 8 assets = 2 ledgers + 3 accounts + 2 invoice sets + 1 expense system (3 accounts not linked = 2 CCB + 1 BOC); uptime and P95 over 30 days: uptime = (720 - 2.9) / 720 = 717.1 / 720 = 99.5972% to 99.6%, and the six down-minute figures 110 + 30 + 8 + 8 + 9 + 9 sum to 174 minutes = 2.9h as the pre-dedup window while the platform counts 2.9h after dedup; config CFG-2026-11-08 effective Nov 8; caliber C-2026-11-01'
|
|
235
|
-
}
|
|
236
|
-
},
|
|
237
|
-
{
|
|
238
|
-
icon: 'spark',
|
|
239
|
-
label: { zh: '技能与场景', en: 'Skills and scenarios' },
|
|
240
|
-
kind: 'table',
|
|
241
|
-
pill: { zh: 'S3 · 12 技能 / 5 场景', en: 'S3 · 12 skills / 5 scenarios' },
|
|
242
|
-
summary: [{ label: { zh: '已启用', en: 'Enabled' }, value: { zh: '9', en: '9' }, tone: 'ok' }, { label: { zh: '待升级', en: 'To upgrade' }, value: { zh: '3', en: '3' }, tone: 'warn' }, { label: { zh: '调用 7 天', en: 'Calls 7 days' }, value: { zh: '1,284', en: '1,284' } }],
|
|
243
|
-
data: {
|
|
244
|
-
columns: [{ label: { zh: '技能', en: 'Skill' } }, { label: { zh: '版本', en: 'Version' } }, { label: { zh: '启用范围', en: 'Scope' } }, { label: { zh: '依赖通道', en: 'Channels' } }, { label: { zh: '状态', en: 'Status' } }, { label: { zh: '近 7 天调用', en: 'Calls 7 days' }, align: 'right' }],
|
|
245
|
-
rows: [
|
|
246
|
-
[{ zh: '凭证识别录入', en: 'Voucher capture' }, 'v3.2', { zh: '财', en: 'Books' }, { zh: 'U8 + 影像 OCR', en: 'U8 and OCR' }, { zh: '启用', en: 'Enabled', tone: 'ok' }, '186'],
|
|
247
|
-
[{ zh: '智能对账', en: 'Smart reconciliation' }, 'v2.4', { zh: '资', en: 'Cash' }, { zh: '银行直连 + U8', en: 'Bank link and U8' }, { zh: '启用', en: 'Enabled', tone: 'ok' }, '142'],
|
|
248
|
-
[{ zh: '账龄分析', en: 'AR aging' }, 'v2.0', { zh: '财 + 总览', en: 'Books and overview' }, { zh: 'U8', en: 'U8' }, { zh: '启用', en: 'Enabled', tone: 'ok' }, '98'],
|
|
249
|
-
[{ zh: '现金流预测', en: 'Cash forecast' }, 'v2.1', { zh: '资 + 推', en: 'Cash and plan' }, { zh: 'U8 + 银行直连', en: 'U8 and bank link' }, { zh: '灰度', en: 'Gray', tone: 'warn' }, '36'],
|
|
250
|
-
[{ zh: '月末关账助手', en: 'Month-end close' }, 'v3.0', { zh: '财', en: 'Books' }, { zh: 'U8', en: 'U8' }, { zh: '启用', en: 'Enabled', tone: 'ok' }, '12'],
|
|
251
|
-
[{ zh: '税务申报助手', en: 'Tax filing' }, 'v1.6', { zh: '税', en: 'Tax' }, { zh: '电子税务局 + 数电', en: 'Tax bureau and e-invoice' }, { zh: '灰度', en: 'Gray', tone: 'warn' }, '8'],
|
|
252
|
-
[{ zh: '发票查验', en: 'Invoice checks' }, 'v1.2', { zh: '税', en: 'Tax' }, { zh: '数电发票', en: 'E-invoice' }, { zh: '启用', en: 'Enabled', tone: 'ok' }, '62'],
|
|
253
|
-
[{ zh: '旧银企 RPA', en: 'Legacy bank RPA' }, 'v0.9', { zh: '—', en: '—' }, { zh: '银行直连', en: 'Bank link' }, { zh: '停用', en: 'Off', tone: 'off' }, '0']
|
|
254
|
-
],
|
|
255
|
-
total: [{ zh: '合计', en: 'Total' }, { zh: 'S3 生效', en: 'S3 active' }, '—', '—', { zh: '9 启用 / 2 灰度 / 1 停用', en: '9 on / 2 gray / 1 off' }, '1,284']
|
|
256
|
-
},
|
|
257
|
-
alt: {
|
|
258
|
-
kind: 'list',
|
|
259
|
-
label: { zh: '场景与运行', en: 'Scenarios and runs' },
|
|
260
|
-
data: {
|
|
261
|
-
rows: [
|
|
262
|
-
{ name: { zh: '月末关账助手', en: 'Month-end close' }, desc: { zh: '运行中 · 每月 · 最近 11-11 09:00 · 技能 月末关账助手 v3.0', en: 'Running · monthly · last Nov 11 09:00 · skill v3.0' }, badge: { zh: '运行中', en: 'Running' }, tone: 'ok', meta: { zh: '财', en: 'Books' } },
|
|
263
|
-
{ name: { zh: '资金日报', en: 'Daily cash brief' }, desc: { zh: '运行中 · 每日 4 次(08:00 / 12:00 / 16:00 / 20:00)· 最近 11-11 20:00 · 技能 管报生成 v1.4', en: 'Running · 4 times daily (08:00, 12:00, 16:00, 20:00) · last Nov 11 20:00 · skill v1.4' }, badge: { zh: '运行中', en: 'Running' }, tone: 'ok', meta: { zh: '资 · 总览', en: 'Cash, overview' } },
|
|
264
|
-
{ name: { zh: '应收催收', en: 'AR collection' }, desc: { zh: '运行中 · 每周一 · 11-09 · 技能 账龄分析 v2.0', en: 'Running · weekly on Monday · Nov 9 · skill v2.0' }, badge: { zh: '运行中', en: 'Running' }, tone: 'ok', meta: { zh: '财', en: 'Books' } },
|
|
265
|
-
{ name: { zh: '预算偏差预警', en: 'Budget variance alert' }, desc: { zh: '待配置 · 触发未设 · 技能 差异归因 v1.1', en: 'To configure · trigger missing · skill v1.1' }, badge: { zh: '待配置', en: 'To configure' }, tone: 'warn', meta: { zh: '推', en: 'Plan' } },
|
|
266
|
-
{ name: { zh: '税务申报助手', en: 'Tax filing agent' }, desc: { zh: '停用 · 11-05 起 · 技能 税务申报助手 v1.6(灰度)· 停用只停触发,按需调用仍入回执', en: 'Off · since Nov 5 · skill v1.6 (gray); off stops triggers only, on-demand calls still leave receipts' }, badge: { zh: '停用', en: 'Off' }, tone: 'off', meta: { zh: '税', en: 'Tax' } }
|
|
267
|
-
]
|
|
268
|
-
}
|
|
269
|
-
},
|
|
270
|
-
foot: {
|
|
271
|
-
zh: '12 技能另 4 项(预算编制 v2.2、管报生成 v1.4、差异归因 v1.1、主数据匹配 v1.0,均启用)合计调用 740,全量 1,284;策略包 = 步骤 / 工具选择 / 口径选择 / 降级 / 复核触发;待升级 3 为版本维度,与灰度 2 不互算;技能会改变助手执行方案,必须可版本、可回滚、可审计;场景侧 5 = 运行中 3 + 待配置 1 + 停用 1;场景 = 技能 + 触发 + 适用页面 / 角色;近 7 天 30 次 = 资金日报 4 × 7 + 应收催收 11-09 + 月末关账 11-11;全量运行记录属本页,推页只展示产出本页结果的运行(R-1111-06)',
|
|
272
|
-
en: 'The other 4 skills (budget v2.2, management report v1.4, variance v1.1, master data match v1.0, all enabled) account for 740 calls, 1,284 in total; a policy pack holds steps, tool choice, caliber choice, fallback and review triggers; 3 pending upgrades is a version measure and does not combine with 2 gray; skill changes alter the agent plan and must be versioned, rollbackable and auditable; on the scenario side: 5 = 3 running + 1 to configure + 1 off; a scenario is a skill plus a trigger plus pages and roles; 30 runs in 7 days = 4 x 7 daily briefs + one collection run on Nov 9 + one close run on Nov 11; the full run log lives here, while the planning page shows only runs that produced its results (R-1111-06)'
|
|
273
|
-
}
|
|
274
|
-
},
|
|
275
|
-
{
|
|
276
|
-
icon: 'doc',
|
|
277
|
-
label: { zh: '数据源', en: 'Sources' },
|
|
278
|
-
kind: 'table',
|
|
279
|
-
pill: { zh: '12 源', en: '12 sources' },
|
|
280
|
-
summary: [{ label: { zh: '已接入', en: 'Connected' }, value: { zh: '12', en: '12' }, tone: 'ok' }, { label: { zh: '权威 / 参考', en: 'Primary and reference' }, value: { zh: '9 / 3', en: '9 / 3' } }, { label: { zh: '待处理接入', en: 'Pending auth or manual' }, value: { zh: '建行 2 户 · 中行 1 户', en: 'CCB 2, BOC 1' }, tone: 'warn' }],
|
|
281
|
-
data: {
|
|
282
|
-
columns: [{ label: { zh: '数据源', en: 'Source' } }, { label: { zh: '类型', en: 'Type' } }, { label: { zh: '接入方式', en: 'Ingest' } }, { label: { zh: '最近批次', en: 'Last batch' } }, { label: { zh: '水位', en: 'Watermark' } }, { label: { zh: '状态', en: 'Status' } }],
|
|
283
|
-
rows: [
|
|
284
|
-
[{ zh: '用友 U8', en: 'Yonyou U8' }, { zh: '核算', en: 'Books' }, { zh: '只读接口 · 增量', en: 'Read-only API, incremental' }, 'B-20261111-109', '2026-11-11 23:10', { zh: '已接入', en: 'Connected', tone: 'ok' }],
|
|
285
|
-
[{ zh: '金蝶云星空', en: 'Kingdee Cloud' }, { zh: '核算', en: 'Books' }, { zh: '只读接口 · 增量', en: 'Read-only API, incremental' }, 'B-20261111-108', '2026-11-11 23:10', { zh: '已接入', en: 'Connected', tone: 'ok' }],
|
|
286
|
-
[{ zh: '工行', en: 'ICBC' }, { zh: '银行', en: 'Bank' }, { zh: '银企直连', en: 'Direct bank link' }, 'B-20261111-107', '2026-11-11 23:10', { zh: '已接入', en: 'Connected', tone: 'ok' }],
|
|
287
|
-
[{ zh: '招行', en: 'CMB' }, { zh: '银行', en: 'Bank' }, { zh: '银企直连', en: 'Direct bank link' }, 'B-20261111-107', '2026-11-11 23:10', { zh: '已接入', en: 'Connected', tone: 'ok' }],
|
|
288
|
-
[{ zh: '建行 2 户', en: 'CCB, 2 accounts' }, { zh: '银行', en: 'Bank' }, { zh: '银企待授权', en: 'Bank link pending auth' }, 'B-20261110-101', '2026-11-10', { zh: '待授权', en: 'Auth pending', tone: 'warn' }],
|
|
289
|
-
[{ zh: '中行 1 户', en: 'BOC, 1 account' }, { zh: '银行', en: 'Bank' }, { zh: '手工导入', en: 'Manual import' }, 'B-20261110-102', '2026-11-10', { zh: '手工接入', en: 'Manual access', tone: 'warn' }],
|
|
290
|
-
[{ zh: '票税平台 2 源', en: 'Tax platform, 2 sources' }, { zh: '票税', en: 'Tax' }, { zh: '平台接口', en: 'Platform API' }, 'B-20261111-109', '2026-11-11 23:10', { zh: '已接入', en: 'Connected', tone: 'ok' }],
|
|
291
|
-
[{ zh: '业务文件 4 源', en: 'Business files, 4 sources' }, { zh: '业务', en: 'Business' }, { zh: '文件与接口', en: 'Files and API' }, 'B-20261111-106', '2026-11-11 23:10', { zh: '已接入', en: 'Connected', tone: 'ok' }]
|
|
292
|
-
],
|
|
293
|
-
total: [{ zh: '合计', en: 'Total' }, { zh: '12 源', en: '12 sources' }, { zh: '权威 9 / 参考 3', en: '9 primary, 3 reference' }, { zh: '最近 B-20261111-109', en: 'Last B-20261111-109' }, { zh: '2026-11-11 23:10', en: '2026-11-11 23:10' }, { zh: '建行 2 户待授权 · 中行 1 户手工', en: 'CCB 2 pending auth, BOC 1 manual' }]
|
|
294
|
-
},
|
|
295
|
-
foot: { zh: '12 源 = 1+1+1+1+1+1+2+4;权威 9 / 参考 3;建行 2 户待授权、中行 1 户手工导入(已接入 · 手工非自动);业务文件 4 源中影像 OCR 近 24h 1 批超时(见『质量与对账』),接入状态仍为已接入', en: '12 sources = 1+1+1+1+1+1+2+4; 9 primary, 3 reference; CCB 2 accounts pending auth, BOC 1 manual import (connected, manual not automatic); imaging OCR in business files had 1 timeout in 24h (see Quality and recon), access status stays connected' }
|
|
296
|
-
},
|
|
297
|
-
{
|
|
298
|
-
icon: 'pulse',
|
|
299
|
-
label: { zh: '蒸馏批次', en: 'Pipelines' },
|
|
300
|
-
kind: 'chart',
|
|
301
|
-
pill: { zh: '868 批 / 7 天', en: '868 batches / 7 days' },
|
|
302
|
-
summary: [{ label: { zh: '近 7 天批次', en: 'Batches, 7 days' }, value: { zh: '868', en: '868' }, tone: 'ok' }, { label: { zh: '成功', en: 'Succeeded' }, value: { zh: '861', en: '861' }, tone: 'ok' }, { label: { zh: '失败', en: 'Failed' }, value: { zh: '7', en: '7' }, tone: 'warn' }],
|
|
303
|
-
data: {
|
|
304
|
-
mode: 'line',
|
|
305
|
-
series: [120, 126, 122, 128, 124, 122, 126],
|
|
306
|
-
labels: [{ zh: '11-05', en: 'Nov 5' }, { zh: '11-06', en: 'Nov 6' }, { zh: '11-07', en: 'Nov 7' }, { zh: '11-08', en: 'Nov 8' }, { zh: '11-09', en: 'Nov 9' }, { zh: '11-10', en: 'Nov 10' }, { zh: '11-11', en: 'Nov 11' }],
|
|
307
|
-
caption: { zh: '每日批次;滑动 24h 124 批(成功 123 / 失败 1);日历日 11-11 126 批;全量批次 11-09 02:00', en: 'Daily batches; rolling 24h 124 (123 succeeded, 1 failed); calendar day Nov 11 126; full batch at 02:00 on Nov 9' }
|
|
308
|
-
},
|
|
309
|
-
alt: {
|
|
310
|
-
kind: 'table',
|
|
311
|
-
label: { zh: '逐日明细', en: 'Daily detail' },
|
|
312
|
-
data: {
|
|
313
|
-
columns: [{ label: { zh: '日期', en: 'Date' } }, { label: { zh: '批次', en: 'Batches' }, align: 'right' }, { label: { zh: '成功', en: 'Succeeded' }, align: 'right' }, { label: { zh: '失败', en: 'Failed' }, align: 'right' }, { label: { zh: '成功率', en: 'Pass rate' }, align: 'right' }, { label: { zh: '回放', en: 'Replay' } }],
|
|
314
|
-
rows: [
|
|
315
|
-
['2026-11-05', '120', '120', '0', '100.0%', { zh: '未回放', en: 'Not replayed' }],
|
|
316
|
-
['2026-11-06', '126', '125', '1', '99.2%', { zh: '未回放', en: 'Not replayed' }],
|
|
317
|
-
['2026-11-07', '122', '120', '2', '98.4%', { zh: '已回放', en: 'Replayed' }],
|
|
318
|
-
['2026-11-08', '128', '127', '1', '99.2%', { zh: '未回放', en: 'Not replayed' }],
|
|
319
|
-
['2026-11-09', '124', '123', '1', '99.2%', { zh: '未回放', en: 'Not replayed' }],
|
|
320
|
-
['2026-11-10', '122', '121', '1', '99.2%', { zh: '未回放', en: 'Not replayed' }],
|
|
321
|
-
['2026-11-11', '126', '125', '1', '99.2%', { zh: '未回放', en: 'Not replayed' }]
|
|
322
|
-
],
|
|
323
|
-
total: [{ zh: '合计', en: 'Total' }, '868', '861', '7', '99.2%', { zh: '已回放 1 批', en: '1 replayed' }]
|
|
324
|
-
}
|
|
325
|
-
},
|
|
326
|
-
foot: { zh: '近 7 天 868 批 = 成功 861 + 失败 7(99.2%);日均 124 批;滑动 24h 124 批(成功 123 / 失败 1,影像 OCR 超时),日历日 11-11 126 批;全量批次 11-09 02:00;批次只增不改,回放不覆盖原批次;同步延迟 4 分钟 / SLA 15 分钟(B-20261111-109 完成 23:14 − 水位 23:10,余量 11 分钟,最慢源=银行流水)', en: '7 days: 868 batches = 861 succeeded + 7 failed (99.2%); 124 per day on average; rolling 24h 124 (123 succeeded, 1 imaging OCR timeout), calendar day Nov 11 126; full batch at 02:00 on Nov 9; batches are append-only and replay never overwrites; sync lag 4 minutes against a 15-minute SLA (batch B-20261111-109 done 23:14 minus watermark 23:10, 11 minutes headroom, slowest source is bank statements)' }
|
|
327
|
-
},
|
|
328
|
-
{
|
|
329
|
-
icon: 'users',
|
|
330
|
-
label: { zh: '主数据映射', en: 'Master data' },
|
|
331
|
-
kind: 'table',
|
|
332
|
-
pill: { zh: '7 项待复核', en: '7 to review' },
|
|
333
|
-
summary: [{ label: { zh: '实体条数', en: 'Entities' }, value: { zh: '500', en: '500' } }, { label: { zh: '待复核', en: 'To review' }, value: { zh: '7', en: '7' }, tone: 'warn' }, { label: { zh: '未映射', en: 'Unmapped' }, value: { zh: '3', en: '3' }, tone: 'warn' }],
|
|
334
|
-
data: {
|
|
335
|
-
columns: [{ label: { zh: '实体', en: 'Entity' } }, { label: { zh: '条数', en: 'Records' }, align: 'right' }, { label: { zh: '待复核', en: 'To review' }, align: 'right' }, { label: { zh: '原因', en: 'Reason' } }, { label: { zh: '状态', en: 'Status' } }],
|
|
336
|
-
rows: [
|
|
337
|
-
[{ zh: '客商', en: 'Partners' }, '386', '3', { zh: '未映射 2 · 新维度 1', en: '2 unmapped · 1 new' }, { zh: '待复核', en: 'To review', tone: 'warn' }],
|
|
338
|
-
[{ zh: '科目', en: 'Accounts' }, '86', '1', { zh: '生效日冲突 1', en: '1 date conflict' }, { zh: '待复核', en: 'To review', tone: 'warn' }],
|
|
339
|
-
[{ zh: '成本中心', en: 'Cost centres' }, '12', '1', { zh: '生效日冲突 1', en: '1 date conflict' }, { zh: '待复核', en: 'To review', tone: 'warn' }],
|
|
340
|
-
[{ zh: '利润中心', en: 'Profit centres' }, '6', '1', { zh: '新维度 1', en: '1 new dimension' }, { zh: '待复核', en: 'To review', tone: 'warn' }],
|
|
341
|
-
[{ zh: '业务条线', en: 'Business lines' }, '4', '0', { zh: '—', en: 'None' }, { zh: '正常', en: 'Clear', tone: 'ok' }],
|
|
342
|
-
[{ zh: '银行账户', en: 'Bank accounts' }, '6', '1', { zh: '未映射 1', en: '1 unmapped' }, { zh: '待复核', en: 'To review', tone: 'warn' }]
|
|
343
|
-
],
|
|
344
|
-
total: [{ zh: '合计', en: 'Total' }, '500', '7', { zh: '未映射 3 · 生效日冲突 2 · 新维度 2', en: '3 unmapped · 2 conflicts · 2 new' }, { zh: '1 ok / 5 warn', en: '1 ok / 5 warn' }]
|
|
345
|
-
},
|
|
346
|
-
foot: { zh: '待复核 7 = 未映射 3 + 生效日冲突 2 + 新维度 2;来源=ERP 蒸馏镜像,本页只做映射与复核,不新增、不改写;科目 86 与财页全量 86 科目同数,银行账户 6 与资页 6 账户同数', en: '7 to review = 3 unmapped + 2 date conflicts + 2 new dimensions; source is the ERP mirror, this page only maps and reviews, never creates or rewrites; 86 accounts match the books page and 6 bank accounts match the funds page' }
|
|
347
|
-
},
|
|
348
|
-
{
|
|
349
|
-
icon: 'grid',
|
|
350
|
-
label: { zh: '指标与口径', en: 'Metrics and caliber' },
|
|
351
|
-
kind: 'bars',
|
|
352
|
-
pill: { zh: '86 指标', en: '86 metrics' },
|
|
353
|
-
summary: [{ label: { zh: '可用指标', en: 'Usable' }, value: { zh: '86', en: '86' }, tone: 'ok' }, { label: { zh: '口径版本', en: 'Caliber' }, value: { zh: 'C-2026-11-01', en: 'C-2026-11-01' } }, { label: { zh: '六域', en: 'Domains' }, value: { zh: '6', en: '6' }, tone: 'ok' }],
|
|
354
|
-
data: { items: [{ label: { zh: '财', en: 'Finance' }, valueText: '22 项', pct: 25.6 }, { label: { zh: '资', en: 'Funds' }, valueText: '16 项', pct: 18.6 }, { label: { zh: '推', en: 'Forecast' }, valueText: '18 项', pct: 20.9 }, { label: { zh: '税', en: 'Tax' }, valueText: '14 项', pct: 16.3 }, { label: { zh: '数', en: 'Data' }, valueText: '10 项', pct: 11.6 }, { label: { zh: '总览', en: 'Overview' }, valueText: '6 项', pct: 7 }] },
|
|
355
|
-
alt: {
|
|
356
|
-
kind: 'list',
|
|
357
|
-
label: { zh: '六域清单', en: 'Six domains' },
|
|
358
|
-
data: {
|
|
359
|
-
rows: [
|
|
360
|
-
{ name: { zh: '财 · 22 项', en: 'Finance, 22' }, desc: { zh: '已发布 · 口径 C-2026-11-01 · 血缘 3 层', en: 'Published · caliber C-2026-11-01 · 3 lineage levels' }, badge: { zh: '生效', en: 'Active' }, tone: 'ok', meta: { zh: '22 项', en: '22' } },
|
|
361
|
-
{ name: { zh: '资 · 16 项', en: 'Funds, 16' }, desc: { zh: '已发布 · 口径 C-2026-11-01 · 血缘 3 层', en: 'Published · caliber C-2026-11-01 · 3 lineage levels' }, badge: { zh: '生效', en: 'Active' }, tone: 'ok', meta: { zh: '16 项', en: '16' } },
|
|
362
|
-
{ name: { zh: '推 · 18 项', en: 'Forecast, 18' }, desc: { zh: '已发布 + 灰度 · 随假设 A3 重算', en: 'Published plus preview · recomputed with assumption A3' }, badge: { zh: '生效', en: 'Active' }, tone: 'ok', meta: { zh: '18 项', en: '18' } },
|
|
363
|
-
{ name: { zh: '税 · 14 项', en: 'Tax, 14' }, desc: { zh: '已发布 · 口径 C-2026-11-01 · 预计口径单列', en: 'Published · caliber C-2026-11-01 · estimate basis kept apart' }, badge: { zh: '生效', en: 'Active' }, tone: 'ok', meta: { zh: '14 项', en: '14' } },
|
|
364
|
-
{ name: { zh: '数 · 10 项', en: 'Data, 10' }, desc: { zh: '10 项可用 · 口径 C-2026-11-01 · 血缘 3 层', en: '10 usable · caliber C-2026-11-01 · 3 lineage levels' }, badge: { zh: '生效', en: 'Active' }, tone: 'ok', meta: { zh: '10 项', en: '10' } },
|
|
365
|
-
{ name: { zh: '总览 · 6 项', en: 'Overview, 6' }, desc: { zh: '已发布 · 引用四页口径 · 血缘 3 层', en: 'Published · reuses four page calibers · 3 lineage levels' }, badge: { zh: '生效', en: 'Active' }, tone: 'ok', meta: { zh: '6 项', en: '6' } }
|
|
366
|
-
]
|
|
367
|
-
}
|
|
368
|
-
},
|
|
369
|
-
foot: {
|
|
370
|
-
zh: '指标 86 = 财 22 + 资 16 + 推 18 + 税 14 + 数 10 + 总览 6(六域可用口径);总 102 = 已发布 78 + 灰度 8 + 停用 4 + 草稿 12(四态只在 KPI 2 弹层,不按域拆);口径版本 C-2026-11-01(11-01 发布并生效),版本链 C-2026-10-01(已作废,保留引用)→ C-2026-11-01 →(计划)C-2026-12-01;决策表与费用标准随版本发布、带生效日',
|
|
371
|
-
en: '86 metrics = finance 22 + funds 16 + forecast 18 + tax 14 + data 10 + overview 6 on a usable basis; 102 total = 78 published + 8 preview + 4 retired + 12 draft, shown only in the KPI 2 modal, never split by domain; caliber C-2026-11-01 released and effective on Nov 1; chain C-2026-10-01 superseded but kept, C-2026-11-01 effective, C-2026-12-01 planned for Dec 1; decision tables ship with effective dates'
|
|
372
|
-
}
|
|
373
|
-
},
|
|
374
|
-
{
|
|
375
|
-
icon: 'eye',
|
|
376
|
-
label: { zh: '质量与对账', en: 'Quality and recon' },
|
|
377
|
-
kind: 'checks',
|
|
378
|
-
pill: { zh: '3 待处理', en: '3 open' },
|
|
379
|
-
summary: [{ label: { zh: '规则', en: 'Rules' }, value: { zh: '28', en: '28' } }, { label: { zh: '近 24h 命中', en: 'Hits in 24h' }, value: { zh: '11', en: '11' }, tone: 'warn' }, { label: { zh: '待处理', en: 'Open' }, value: { zh: '3', en: '3' }, tone: 'warn' }],
|
|
380
|
-
data: {
|
|
381
|
-
items: [
|
|
382
|
-
{ name: { zh: '凭证借贷平衡', en: 'Voucher debit-credit balance' }, desc: { zh: '1,284 张 · 借贷差 ¥0.00 · 2026-11 期间', en: '1,284 vouchers · gap ¥0.00 · Nov 2026' }, state: 'ok', meta: { zh: '通过', en: 'Passed' } },
|
|
383
|
-
{ name: { zh: '科目余额六栏平衡', en: 'Six-column trial balance' }, desc: { zh: '借 = 贷 = ¥29,915,200.00 · 试算差 ¥0.00', en: 'Debits equal credits at ¥29,915,200.00 · gap ¥0.00' }, state: 'ok', meta: { zh: '通过', en: 'Passed' } },
|
|
384
|
-
{ name: { zh: '银行余额对账', en: 'Bank balance reconciliation' }, desc: { zh: '10-31 同期 · 银行侧 ¥8,550,000.00 vs 账面 ¥8,450,000.00 · 未达 3 笔 ¥100,000.00(62,000 + 35,000 + 3,000)· 调节后 ¥0.00', en: 'Oct 31 basis · bank side ¥8,550,000.00 vs books ¥8,450,000.00 · 3 unreconciled items ¥100,000.00 (62,000 + 35,000 + 3,000) · nil after adjusting' }, state: 'warn', meta: { zh: '差异待核', en: 'Gap open' } },
|
|
385
|
-
{ name: { zh: '销项票面 vs 申报', en: 'Output invoices vs filing' }, desc: { zh: '4 张 · 销项 ¥150,800.00 · 票面与申报一致', en: '4 invoices · output VAT ¥150,800.00 · invoice and filing agree' }, state: 'ok', meta: { zh: '通过', en: 'Passed' } },
|
|
386
|
-
{ name: { zh: '主数据唯一性', en: 'Master data uniqueness' }, desc: { zh: '客商 386 · 重复 0 · 主键去重校验', en: '386 partners · 0 duplicates · key uniqueness check' }, state: 'ok', meta: { zh: '通过', en: 'Passed' } },
|
|
387
|
-
{ name: { zh: '批次完整性', en: 'Batch completeness' }, desc: { zh: 'B-109 分区 124/124 · 全量校验 11-09 通过', en: 'B-109 partitions 124 of 124 · full check passed Nov 9' }, state: 'ok', meta: { zh: '通过', en: 'Passed' } },
|
|
388
|
-
{ name: { zh: '影像 OCR 识别率', en: 'Imaging OCR recognition' }, desc: { zh: '98.7% · 阈值 99% · 准确性规则 · 低于阈值 0.3 个百分点', en: '98.7% · threshold 99% · accuracy rule · 0.3 points below' }, state: 'warn', meta: { zh: '待处理', en: 'Open' } },
|
|
389
|
-
{ name: { zh: '接入及时性', en: 'Ingest timeliness' }, desc: { zh: '建行 2 户 + 中行 1 户 T-1 未更新 · 涉及建行、中行 2 行 / 3 源', en: 'CCB 2 accounts plus BOC 1 not refreshed for T-1 · 2 rows and 3 sources' }, state: 'warn', meta: { zh: '待处理', en: 'Open' } }
|
|
390
|
-
]
|
|
391
|
-
},
|
|
392
|
-
foot: { zh: '规则 28 = 完整性 8 + 一致性 7 + 准确性 6 + 及时性 4 + 唯一性 3;近 24h 命中 11 = 已处置 8 + 待处理 3;待处理 3 = 影像 1 + 及时性 1 + 在途差异 1,规则类为准确性 1(影像 OCR)+ 一致性 1(银行未达)+ 及时性 1(T-1 未更新)', en: '28 rules = 8 completeness + 7 consistency + 6 accuracy + 4 timeliness + 3 uniqueness; 11 hits in 24h = 8 handled + 3 open; 3 open = imaging 1 + timeliness 1 + in-transit gap 1, by rule class accuracy 1 (imaging OCR) + consistency 1 (bank gap) + timeliness 1 (T-1)' }
|
|
393
|
-
},
|
|
394
|
-
{
|
|
395
|
-
icon: 'bell',
|
|
396
|
-
label: { zh: '回执与审计', en: 'Receipts and audit' },
|
|
397
|
-
kind: 'table',
|
|
398
|
-
pill: { zh: '1,284 次 / 7 天', en: '1,284 calls / 7 days' },
|
|
399
|
-
summary: [{ label: { zh: '近 7 天调用', en: 'Calls 7 days' }, value: { zh: '1,284', en: '1,284' } }, { label: { zh: '失败', en: 'Failures' }, value: { zh: '12', en: '12' }, tone: 'warn' }, { label: { zh: '审计断链', en: 'Chain breaks' }, value: { zh: '0', en: '0' }, tone: 'ok' }],
|
|
400
|
-
data: {
|
|
401
|
-
columns: [{ label: { zh: '时间', en: 'Time' }, align: 'right' }, { label: { zh: '场景或技能', en: 'Scenario or skill' } }, { label: { zh: '通道工具', en: 'Channel and tool' } }, { label: { zh: '结果', en: 'Result' } }, { label: { zh: '耗时', en: 'Latency' }, align: 'right' }, { label: { zh: '回执号', en: 'Receipt' } }],
|
|
402
|
-
rows: [
|
|
403
|
-
['11-11 23:12', { zh: '月末关账助手 · 场景触发', en: 'Month-end close · trigger' }, { zh: 'U8 · 凭证检索', en: 'U8 · voucher search' }, { zh: '成功', en: 'Success', tone: 'ok' }, '820ms', 'RC-1111-2312-183'],
|
|
404
|
-
['11-11 23:05', { zh: '发票查验 v1.2 · 按需', en: 'Invoice checks v1.2 · on demand' }, { zh: '数电发票 · 查验', en: 'E-invoice · verify' }, { zh: '成功', en: 'Success', tone: 'ok' }, '640ms', 'RC-1111-2305-179'],
|
|
405
|
-
['11-11 22:40', { zh: '税务申报助手(灰度)· 按需', en: 'Tax filing (gray) · on demand' }, { zh: '电子税务局 · 申报预检', en: 'Tax bureau · pre-check' }, { zh: '成功', en: 'Success', tone: 'ok' }, '1.2s', 'RC-1111-2240-168'],
|
|
406
|
-
['11-11 21:30', { zh: '智能对账 · 按需', en: 'Smart reconciliation · on demand' }, { zh: '银行直连 · 流水拉取', en: 'Bank link · statements' }, { zh: '成功', en: 'Success', tone: 'ok' }, '2.1s', 'RC-1111-2130-151'],
|
|
407
|
-
['11-11 20:15', { zh: '未知调用方 · 按需', en: 'Unknown caller · on demand' }, { zh: '银行直连 · 付款接口', en: 'Bank link · payment API' }, { zh: '拦截', en: 'Blocked', tone: 'warn' }, '0ms', 'RC-1111-2015-142'],
|
|
408
|
-
['11-11 18:40', { zh: '凭证识别录入 v3.2 · 按需', en: 'Voucher capture v3.2 · on demand' }, { zh: '影像 OCR · 识别', en: 'OCR · reading' }, { zh: '失败(超时)', en: 'Failed (timeout)', tone: 'warn' }, '5.0s', 'RC-1111-1840-121'],
|
|
409
|
-
['11-11 17:20', { zh: '账龄分析 v2.0 · 按需', en: 'AR aging v2.0 · on demand' }, { zh: 'U8 · 凭证检索', en: 'U8 · voucher search' }, { zh: '成功', en: 'Success', tone: 'ok' }, '900ms', 'RC-1111-1720-112'],
|
|
410
|
-
['11-11 06:30', { zh: '滚动预测 R-1111-06 · 场景触发', en: 'Rolling forecast R-1111-06 · trigger' }, { zh: 'U8 + 银行直连 · 现金流预测 v2.1', en: 'U8 and bank link · cash forecast v2.1' }, { zh: '成功', en: 'Success', tone: 'ok' }, '1.8s', 'RC-1111-0630-012']
|
|
411
|
-
]
|
|
412
|
-
},
|
|
413
|
-
alt: {
|
|
414
|
-
kind: 'list',
|
|
415
|
-
label: { zh: '导出与回执', en: 'Exports and receipts' },
|
|
416
|
-
data: {
|
|
417
|
-
rows: [
|
|
418
|
-
{ name: { zh: '资产负债表', en: 'Balance sheet' }, desc: { zh: '2026-10 期次 · 水印五件齐全 · 导出人 王静 · 11-11 09:20', en: 'Oct 2026 · all five watermarks · exported by Wang Jing · Nov 11 09:20' }, badge: { zh: '已导出', en: 'Exported' }, tone: 'ok', meta: { zh: '业务单号 EX-0912', en: 'Export No. EX-0912' } },
|
|
419
|
-
{ name: { zh: '利润表', en: 'Income statement' }, desc: { zh: '2026-10 期次 · 水印五件齐全 · 导出人 王静 · 11-11 09:20', en: 'Oct 2026 · all five watermarks · exported by Wang Jing · Nov 11 09:20' }, badge: { zh: '已导出', en: 'Exported' }, tone: 'ok', meta: { zh: '业务单号 EX-0913', en: 'Export No. EX-0913' } },
|
|
420
|
-
{ name: { zh: '现金流量表', en: 'Cash-flow statement' }, desc: { zh: '2026-10 期次 · 底稿待复核 · 水印标待复核 · 导出人 王静', en: 'Oct 2026 · workpaper pending review · watermark marked draft · exported by Wang Jing' }, badge: { zh: '待复核版', en: 'Draft version' }, tone: 'warn', meta: { zh: '业务单号 EX-0914', en: 'Export No. EX-0914' } },
|
|
421
|
-
{ name: { zh: '资金日报', en: 'Daily cash brief' }, desc: { zh: '2026-11-10 · 水印五件齐全 · 导出人 陈可 · 11-11 08:10', en: 'Nov 10 2026 · all five watermarks · exported by Chen Ke · Nov 11 08:10' }, badge: { zh: '已导出', en: 'Exported' }, tone: 'ok', meta: { zh: '业务单号 EX-0915', en: 'Export No. EX-0915' } },
|
|
422
|
-
{ name: { zh: '税务申报表', en: 'Tax return' }, desc: { zh: '2026-10 期次 · 待报送草稿 · 水印五件齐全 · 导出人 李珂', en: 'Oct 2026 · draft before filing · all five watermarks · exported by Li Ke' }, badge: { zh: '草稿导出', en: 'Draft export' }, tone: 'warn', meta: { zh: '业务单号 EX-0916', en: 'Export No. EX-0916' } }
|
|
423
|
-
]
|
|
424
|
-
}
|
|
425
|
-
},
|
|
426
|
-
foot: {
|
|
427
|
-
zh: '近 7 天 1,284 = 成功 1,269 + 失败 12 + 越权拦截 3,审计断链 0;失败 12 = 超时 9 + 鉴权 2 + 限流 1;RC 号 = RC-{MMDD}-{HHMM}-{三位当日流水},当日 183 条;拦截不算失败;R-1111-06 属运行编号、RC 属回执编号,不同域;导出侧 5 = 财报导出 3 + 资金日报 1 + 税务申报表 1,失败 0,最近 11-11 09:20;水印五件 = 口径版本 + 数据时点 + 血缘短链 + 导出人 + 导出时间;业务单号 EX-… 为导出凭据号,RC-… 在审计链,两套编号不互称;导出发起 / 审批 / 下载不在本页,本页只读',
|
|
428
|
-
en: '7-day calls 1,284 = 1,269 succeeded + 12 failed + 3 blocked, with 0 chain breaks; 12 failures = 9 timeouts + 2 auth + 1 rate limit; RC numbers follow RC-{MMDD}-{HHMM}-{daily serial} with 183 that day; a blocked call is not a failure; R-1111-06 is a run number and RC is a receipt number, different domains; exports: 5 = 3 statement exports + 1 daily cash brief + 1 tax return with 0 failures, latest at 09:20 on Nov 11; five watermarks = caliber version + data time + lineage link + exporter + export time; EX- numbers are export references and RC- numbers live in the audit chain, the two are never interchanged; export initiation, approval and download happen outside this page, which stays read only'
|
|
429
|
-
}
|
|
430
|
-
},
|
|
431
|
-
],
|
|
432
196
|
},
|
|
433
|
-
|
|
434
|
-
|
|
197
|
+
team: {
|
|
198
|
+
title: { zh: '团队模式', en: 'Team mode' },
|
|
199
|
+
},
|
|
200
|
+
finance: {
|
|
201
|
+
botId: 'finance',
|
|
435
202
|
title: { zh: '财 · 过去', en: 'Books · Past' },
|
|
436
203
|
kpis: [
|
|
437
204
|
{
|
|
@@ -672,8 +439,8 @@
|
|
|
672
439
|
},
|
|
673
440
|
],
|
|
674
441
|
},
|
|
675
|
-
|
|
676
|
-
botId: '
|
|
442
|
+
funds: {
|
|
443
|
+
botId: 'funds',
|
|
677
444
|
title: { zh: '资 · 现在', en: 'Funds · Now' },
|
|
678
445
|
kpis: [
|
|
679
446
|
{
|
|
@@ -863,8 +630,8 @@
|
|
|
863
630
|
},
|
|
864
631
|
],
|
|
865
632
|
},
|
|
866
|
-
|
|
867
|
-
botId: '
|
|
633
|
+
forecast: {
|
|
634
|
+
botId: 'forecast',
|
|
868
635
|
title: { zh: '推 · 未来', en: 'Forecast · Future' },
|
|
869
636
|
kpis: [
|
|
870
637
|
{
|
|
@@ -1118,8 +885,8 @@
|
|
|
1118
885
|
},
|
|
1119
886
|
],
|
|
1120
887
|
},
|
|
1121
|
-
|
|
1122
|
-
botId: '
|
|
888
|
+
tax: {
|
|
889
|
+
botId: 'tax',
|
|
1123
890
|
title: { zh: '税 · 税务', en: 'Tax · Filing' },
|
|
1124
891
|
kpis: [
|
|
1125
892
|
{
|
package/src/shell/index.js
CHANGED
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
* ===================================================================== */
|
|
6
6
|
|
|
7
7
|
function createShell(deps) {
|
|
8
|
-
const { React, h, readLang, subscribeLang, useHostTheme, Rail, CardView, KpiCard, TodoPage, readHashPage, writeHashPage, SectionShell, BotShell, MetricDetailModal, PAGES, ICONS } = deps
|
|
8
|
+
const { React, h, readLang, subscribeLang, useHostTheme, Rail, CardView, KpiCard, TodoPage, readHashPage, writeHashPage, SectionShell, BotShell, BaseShell, TeamShell, MetricDetailModal, PAGES, ICONS } = deps
|
|
9
9
|
|
|
10
10
|
|
|
11
11
|
|
|
@@ -35,36 +35,51 @@
|
|
|
35
35
|
const cfg = PAGES[page] || PAGES.overview
|
|
36
36
|
const revision = activeLang + ':' + theme
|
|
37
37
|
const [openMetric, setOpenMetric] = React.useState(null)
|
|
38
|
-
const body =
|
|
39
|
-
? (
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
?
|
|
44
|
-
|
|
45
|
-
h(
|
|
46
|
-
|
|
47
|
-
h(
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
38
|
+
const body = page === 'team'
|
|
39
|
+
? h(TeamShell, { key: page, kit: props })
|
|
40
|
+
: page === 'base'
|
|
41
|
+
? h(BaseShell, { key: page, cfg, onOpen: setOpenMetric })
|
|
42
|
+
: cfg.sections
|
|
43
|
+
? (cfg.botId
|
|
44
|
+
? h(BotShell, { key: page, cfg, page, onOpen: setOpenMetric, kit: props })
|
|
45
|
+
: h(SectionShell, { key: page, cfg, pageId: page, onOpen: setOpenMetric }))
|
|
46
|
+
: cfg.todo
|
|
47
|
+
? h(TodoPage)
|
|
48
|
+
: [
|
|
49
|
+
h('div', { className: 't1-stats', key: 'kpis' },
|
|
50
|
+
cfg.kpis.map((card, i) => h(KpiCard, { key: i, card, onOpen: setOpenMetric }))),
|
|
51
|
+
h('div', { className: 't1-row2', key: 'core' },
|
|
52
|
+
cfg.core.map((card, i) => h(CardView, { key: i, card, theme, revision, onNav: go }))),
|
|
53
|
+
h('div', { className: 't1-row3', key: 'sub' },
|
|
54
|
+
cfg.sub.map((card, i) => h(CardView, { key: i, card, theme, revision }))),
|
|
55
|
+
]
|
|
52
56
|
|
|
53
57
|
return h('div', { className: 'erp-app', 'data-theme': theme },
|
|
54
58
|
h('div', { className: 'erp-board' },
|
|
55
59
|
h(Rail, { lang: activeLang, page, onNav: go }),
|
|
56
60
|
h('div', {
|
|
57
61
|
className: 't1-main',
|
|
58
|
-
'data-shell': cfg.sections ? 'true' : 'false',
|
|
62
|
+
'data-shell': page === 'team' ? 'team' : (page === 'base' || cfg.sections) ? 'true' : 'false',
|
|
59
63
|
}, body)),
|
|
60
64
|
h(MetricDetailModal, { metric: openMetric, onClose: () => setOpenMetric(null), onGo: go }))
|
|
61
65
|
}
|
|
62
66
|
|
|
63
67
|
|
|
64
68
|
/**
|
|
65
|
-
* Left-nav row glyph: the erpBot mark
|
|
66
|
-
*
|
|
67
|
-
*
|
|
69
|
+
* Left-nav row glyph: the erpBot mark.
|
|
70
|
+
*
|
|
71
|
+
* Two layers only — a gradient disc and a thin bright rim. The earlier
|
|
72
|
+
* version stacked four (ring + cut-out seam + face + letter B), which is
|
|
73
|
+
* more information than the 18px box the host allocates can carry: at
|
|
74
|
+
* `sidebar.panellist` size the seam collapsed and the letter smeared, so
|
|
75
|
+
* the mark read as a small muddy blob next to the host's crisp line icons.
|
|
76
|
+
* Dropping to two layers means every pixel carries the brand colour
|
|
77
|
+
* instead of fighting three other edges.
|
|
78
|
+
*
|
|
79
|
+
* It stays a filled disc rather than a line icon on purpose: the sidebar
|
|
80
|
+
* lists "插件 / 更多" as thin outlines, and a solid disc is what marks this
|
|
81
|
+
* row as an app rather than another menu entry. The rim is what keeps that
|
|
82
|
+
* disc from looking like a flat dot.
|
|
68
83
|
* @param props - `{size, active}`.
|
|
69
84
|
* @returns the inline `<svg>`.
|
|
70
85
|
*/
|
|
@@ -78,21 +93,30 @@
|
|
|
78
93
|
style: { display: 'block', flex: 'none' },
|
|
79
94
|
},
|
|
80
95
|
h('defs', { key: 'd' },
|
|
81
|
-
h('linearGradient', {
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
h('stop', { key: '
|
|
85
|
-
|
|
86
|
-
|
|
96
|
+
h('linearGradient', {
|
|
97
|
+
id: 'erp-nav-face', x1: 3, y1: 21, x2: 21, y2: 3, gradientUnits: 'userSpaceOnUse',
|
|
98
|
+
},
|
|
99
|
+
h('stop', { key: 'f0', stopColor: '#3a2bb4' }),
|
|
100
|
+
h('stop', { key: 'f1', offset: '.52', stopColor: '#6d4cf5' }),
|
|
101
|
+
h('stop', { key: 'f2', offset: '1', stopColor: '#a98bfb' }))),
|
|
102
|
+
h('circle', { key: 'face', cx: 12, cy: 12, r: 11, fill: 'url(#erp-nav-face)' }),
|
|
103
|
+
/* Rim sits on the disc's own edge so the bounding box stays 24/24;
|
|
104
|
+
.62 alpha is the point where it still reads against the disc's
|
|
105
|
+
light end (#a98bfb) instead of dissolving into it. */
|
|
106
|
+
h('circle', {
|
|
107
|
+
key: 'rim', cx: 12, cy: 12, r: 11, fill: 'none',
|
|
108
|
+
stroke: 'rgba(255,255,255,.62)', strokeWidth: 1.2,
|
|
109
|
+
}),
|
|
110
|
+
/* One glyph, no seam, no mask: a "B" spelled as two counters would
|
|
111
|
+
smear at 18px, so the mark is a single thick stem plus a bowl —
|
|
112
|
+
the smallest shape that still reads as an initial rather than as a
|
|
113
|
+
status dot. */
|
|
114
|
+
h('path', {
|
|
87
115
|
key: 'b',
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
fontSize: 13,
|
|
93
|
-
fontWeight: 800,
|
|
94
|
-
fill: '#fff',
|
|
95
|
-
}, 'B'))
|
|
116
|
+
d: 'M9.6 7.1v9.8M9.6 7.1h2.9a2.5 2.5 0 0 1 0 5H9.6M9.6 12.1h3.3a2.45 2.45 0 0 1 0 4.8H9.6',
|
|
117
|
+
fill: 'none', stroke: '#fff', strokeWidth: 1.85,
|
|
118
|
+
strokeLinecap: 'round', strokeLinejoin: 'round',
|
|
119
|
+
}))
|
|
96
120
|
}
|
|
97
121
|
|
|
98
122
|
|