timarai-dashboard-mcp 1.0.3
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/CHANGELOG.md +105 -0
- package/README.md +266 -0
- package/dist/charts/build.js +130 -0
- package/dist/charts/build.js.map +1 -0
- package/dist/charts/format.js +101 -0
- package/dist/charts/format.js.map +1 -0
- package/dist/charts/specs.js +708 -0
- package/dist/charts/specs.js.map +1 -0
- package/dist/charts/svg.js +371 -0
- package/dist/charts/svg.js.map +1 -0
- package/dist/client.js +284 -0
- package/dist/client.js.map +1 -0
- package/dist/config.js +164 -0
- package/dist/config.js.map +1 -0
- package/dist/date-range.js +190 -0
- package/dist/date-range.js.map +1 -0
- package/dist/format.js +369 -0
- package/dist/format.js.map +1 -0
- package/dist/index.js +63 -0
- package/dist/index.js.map +1 -0
- package/dist/output.js +46 -0
- package/dist/output.js.map +1 -0
- package/dist/registry.js +231 -0
- package/dist/registry.js.map +1 -0
- package/dist/reports/html.js +84 -0
- package/dist/reports/html.js.map +1 -0
- package/dist/reports/templates.js +113 -0
- package/dist/reports/templates.js.map +1 -0
- package/dist/resources.js +265 -0
- package/dist/resources.js.map +1 -0
- package/dist/server.js +588 -0
- package/dist/server.js.map +1 -0
- package/dist/setup.js +344 -0
- package/dist/setup.js.map +1 -0
- package/dist/signature.js +35 -0
- package/dist/signature.js.map +1 -0
- package/docs/CAPABILITIES.md +275 -0
- package/docs/CONTRACT.md +170 -0
- package/docs/DESIGN.md +367 -0
- package/docs/DISTRIBUTION.md +214 -0
- package/docs/VERIFICATION.md +120 -0
- package/package.json +42 -0
package/dist/registry.js
ADDED
|
@@ -0,0 +1,231 @@
|
|
|
1
|
+
export const DASHBOARD_ROUTE_PREFIX = "/api/v2/platform/dashboard/";
|
|
2
|
+
export const ENDPOINTS = [
|
|
3
|
+
{
|
|
4
|
+
id: "filters",
|
|
5
|
+
path: "filters",
|
|
6
|
+
cabin: "common",
|
|
7
|
+
kind: "filters",
|
|
8
|
+
summary: "查询三舱可用筛选项(业务线 / 商户 / 渠道 / 币种 / 账户类型)",
|
|
9
|
+
input: "filters",
|
|
10
|
+
},
|
|
11
|
+
// ---- CEO 舱 ----
|
|
12
|
+
{
|
|
13
|
+
id: "ceo.overview",
|
|
14
|
+
path: "ceo/overview",
|
|
15
|
+
cabin: "ceo",
|
|
16
|
+
kind: "overview",
|
|
17
|
+
summary: "CEO 经营总览:GMV、成功交易笔数、平台收入、毛利、活跃/新增商户、成功率、AUM",
|
|
18
|
+
input: "query",
|
|
19
|
+
},
|
|
20
|
+
{
|
|
21
|
+
id: "ceo.trend",
|
|
22
|
+
path: "ceo/trend",
|
|
23
|
+
cabin: "ceo",
|
|
24
|
+
kind: "trend",
|
|
25
|
+
summary: "CEO 关键指标趋势(默认 GMV 按日)",
|
|
26
|
+
input: "query",
|
|
27
|
+
},
|
|
28
|
+
{
|
|
29
|
+
id: "ceo.business-breakdown",
|
|
30
|
+
path: "ceo/business-breakdown",
|
|
31
|
+
cabin: "ceo",
|
|
32
|
+
kind: "breakdown",
|
|
33
|
+
summary: "CEO 业务维度分解(各业务线 GMV 与占比)",
|
|
34
|
+
input: "query",
|
|
35
|
+
},
|
|
36
|
+
{
|
|
37
|
+
id: "ceo.top-merchants",
|
|
38
|
+
path: "ceo/top-merchants",
|
|
39
|
+
cabin: "ceo",
|
|
40
|
+
kind: "top",
|
|
41
|
+
summary: "CEO GMV TOP 商户排行",
|
|
42
|
+
input: "query",
|
|
43
|
+
},
|
|
44
|
+
// ---- 运营舱 ----
|
|
45
|
+
{
|
|
46
|
+
id: "operation.overview",
|
|
47
|
+
path: "operation/overview",
|
|
48
|
+
cabin: "operation",
|
|
49
|
+
kind: "overview",
|
|
50
|
+
summary: "运营总览:订单总数、成功/失败/异常/处理中/退款订单数、成功率、平均处理耗时(秒)",
|
|
51
|
+
input: "query",
|
|
52
|
+
},
|
|
53
|
+
{
|
|
54
|
+
id: "operation.platform-metrics",
|
|
55
|
+
path: "operation/platform-metrics",
|
|
56
|
+
cabin: "operation",
|
|
57
|
+
kind: "metrics",
|
|
58
|
+
summary: "运营平台指标宽表:商户增长/激活/活跃/沉默/流失、VA 与 U 卡账户、渠道活跃与异常等 21 项",
|
|
59
|
+
input: "query",
|
|
60
|
+
},
|
|
61
|
+
{
|
|
62
|
+
id: "operation.order-trend",
|
|
63
|
+
path: "operation/order-trend",
|
|
64
|
+
cabin: "operation",
|
|
65
|
+
kind: "trend",
|
|
66
|
+
summary: "运营订单趋势(按日订单量与金额)",
|
|
67
|
+
input: "query",
|
|
68
|
+
},
|
|
69
|
+
{
|
|
70
|
+
id: "operation.success-rate-trend",
|
|
71
|
+
path: "operation/success-rate-trend",
|
|
72
|
+
cabin: "operation",
|
|
73
|
+
kind: "trend",
|
|
74
|
+
summary: "运营成功率趋势(按日)",
|
|
75
|
+
input: "query",
|
|
76
|
+
},
|
|
77
|
+
{
|
|
78
|
+
id: "operation.exception-trend",
|
|
79
|
+
path: "operation/exception-trend",
|
|
80
|
+
cabin: "operation",
|
|
81
|
+
kind: "trend",
|
|
82
|
+
summary: "运营异常订单趋势(按日)",
|
|
83
|
+
input: "query",
|
|
84
|
+
},
|
|
85
|
+
{
|
|
86
|
+
id: "operation.business-analysis",
|
|
87
|
+
path: "operation/business-analysis",
|
|
88
|
+
cabin: "operation",
|
|
89
|
+
kind: "breakdown",
|
|
90
|
+
summary: "运营业务线订单与成功率分析",
|
|
91
|
+
input: "query",
|
|
92
|
+
},
|
|
93
|
+
{
|
|
94
|
+
id: "operation.channel-analysis",
|
|
95
|
+
path: "operation/channel-analysis",
|
|
96
|
+
cabin: "operation",
|
|
97
|
+
kind: "breakdown",
|
|
98
|
+
summary: "运营渠道订单、成功率与渠道成本分析",
|
|
99
|
+
input: "query",
|
|
100
|
+
},
|
|
101
|
+
{
|
|
102
|
+
id: "operation.fail-reason-breakdown",
|
|
103
|
+
path: "operation/fail-reason-breakdown",
|
|
104
|
+
cabin: "operation",
|
|
105
|
+
kind: "breakdown",
|
|
106
|
+
summary: "运营失败原因占比(按编码聚合笔数、金额、占比)",
|
|
107
|
+
input: "query",
|
|
108
|
+
},
|
|
109
|
+
{
|
|
110
|
+
id: "operation.top-exception-merchants",
|
|
111
|
+
path: "operation/top-exception-merchants",
|
|
112
|
+
cabin: "operation",
|
|
113
|
+
kind: "top",
|
|
114
|
+
summary: "运营 TOP 异常商户排行",
|
|
115
|
+
input: "query",
|
|
116
|
+
},
|
|
117
|
+
// ---- 财务舱 ----
|
|
118
|
+
{
|
|
119
|
+
id: "finance.overview",
|
|
120
|
+
path: "finance/overview",
|
|
121
|
+
cabin: "finance",
|
|
122
|
+
kind: "overview",
|
|
123
|
+
summary: "财务资金总览:总资产、资金流入/流出、待结算、待对账、对账异常、冻结资金、可用余额",
|
|
124
|
+
input: "query",
|
|
125
|
+
},
|
|
126
|
+
{
|
|
127
|
+
id: "finance.fund-trend",
|
|
128
|
+
path: "finance/fund-trend",
|
|
129
|
+
cabin: "finance",
|
|
130
|
+
kind: "trend",
|
|
131
|
+
summary: "财务资金流趋势(按日流入/流出)",
|
|
132
|
+
input: "query",
|
|
133
|
+
},
|
|
134
|
+
{
|
|
135
|
+
id: "finance.balance-trend",
|
|
136
|
+
path: "finance/balance-trend",
|
|
137
|
+
cabin: "finance",
|
|
138
|
+
kind: "trend",
|
|
139
|
+
summary: "财务账户余额趋势(按日)",
|
|
140
|
+
input: "query",
|
|
141
|
+
},
|
|
142
|
+
{
|
|
143
|
+
id: "finance.settlement-trend",
|
|
144
|
+
path: "finance/settlement-trend",
|
|
145
|
+
cabin: "finance",
|
|
146
|
+
kind: "trend",
|
|
147
|
+
summary: "财务结算趋势(按日)",
|
|
148
|
+
input: "query",
|
|
149
|
+
},
|
|
150
|
+
{
|
|
151
|
+
id: "finance.fund-distribution",
|
|
152
|
+
path: "finance/fund-distribution",
|
|
153
|
+
cabin: "finance",
|
|
154
|
+
kind: "breakdown",
|
|
155
|
+
summary: "财务业务资金分布",
|
|
156
|
+
input: "query",
|
|
157
|
+
},
|
|
158
|
+
{
|
|
159
|
+
id: "finance.balance-distribution",
|
|
160
|
+
path: "finance/balance-distribution",
|
|
161
|
+
cabin: "finance",
|
|
162
|
+
kind: "breakdown",
|
|
163
|
+
summary: "财务账户资金分布",
|
|
164
|
+
input: "query",
|
|
165
|
+
},
|
|
166
|
+
{
|
|
167
|
+
id: "finance.reconciliation-analysis",
|
|
168
|
+
path: "finance/reconciliation-analysis",
|
|
169
|
+
cabin: "finance",
|
|
170
|
+
kind: "breakdown",
|
|
171
|
+
summary: "财务对账结果分析(按对账状态聚合金额与占比)",
|
|
172
|
+
input: "query",
|
|
173
|
+
},
|
|
174
|
+
{
|
|
175
|
+
id: "finance.top-merchant-balances",
|
|
176
|
+
path: "finance/top-merchant-balances",
|
|
177
|
+
cabin: "finance",
|
|
178
|
+
kind: "top",
|
|
179
|
+
summary: "财务 TOP 商户余额排行",
|
|
180
|
+
input: "query",
|
|
181
|
+
},
|
|
182
|
+
{
|
|
183
|
+
id: "finance.top-reconciliation-merchants",
|
|
184
|
+
path: "finance/top-reconciliation-merchants",
|
|
185
|
+
cabin: "finance",
|
|
186
|
+
kind: "top",
|
|
187
|
+
summary: "财务 TOP 对账异常商户排行",
|
|
188
|
+
input: "query",
|
|
189
|
+
},
|
|
190
|
+
];
|
|
191
|
+
const BY_ID = new Map(ENDPOINTS.map((e) => [e.id, e]));
|
|
192
|
+
const BY_PATH = new Map(ENDPOINTS.map((e) => [e.path, e]));
|
|
193
|
+
export function getEndpointById(id) {
|
|
194
|
+
return BY_ID.get(id);
|
|
195
|
+
}
|
|
196
|
+
export function getEndpointByPath(path) {
|
|
197
|
+
return BY_PATH.get(path.replace(/^\/+/, "").replace(/\/+$/, ""));
|
|
198
|
+
}
|
|
199
|
+
/** 工具 subject → endpoint id 映射。 */
|
|
200
|
+
export const SUBJECT_MAP = {
|
|
201
|
+
overview: {
|
|
202
|
+
ceo: "ceo.overview",
|
|
203
|
+
operation: "operation.overview",
|
|
204
|
+
finance: "finance.overview",
|
|
205
|
+
},
|
|
206
|
+
trend: {
|
|
207
|
+
gmv: "ceo.trend",
|
|
208
|
+
order: "operation.order-trend",
|
|
209
|
+
success_rate: "operation.success-rate-trend",
|
|
210
|
+
exception: "operation.exception-trend",
|
|
211
|
+
fund: "finance.fund-trend",
|
|
212
|
+
balance: "finance.balance-trend",
|
|
213
|
+
settlement: "finance.settlement-trend",
|
|
214
|
+
},
|
|
215
|
+
breakdown: {
|
|
216
|
+
business: "ceo.business-breakdown",
|
|
217
|
+
business_analysis: "operation.business-analysis",
|
|
218
|
+
channel: "operation.channel-analysis",
|
|
219
|
+
fail_reason: "operation.fail-reason-breakdown",
|
|
220
|
+
fund_distribution: "finance.fund-distribution",
|
|
221
|
+
balance_distribution: "finance.balance-distribution",
|
|
222
|
+
reconciliation: "finance.reconciliation-analysis",
|
|
223
|
+
},
|
|
224
|
+
top: {
|
|
225
|
+
gmv: "ceo.top-merchants",
|
|
226
|
+
exception: "operation.top-exception-merchants",
|
|
227
|
+
balance: "finance.top-merchant-balances",
|
|
228
|
+
reconciliation: "finance.top-reconciliation-merchants",
|
|
229
|
+
},
|
|
230
|
+
};
|
|
231
|
+
//# sourceMappingURL=registry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry.js","sourceRoot":"","sources":["../src/registry.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 报告 HTML 组装(单文件、自包含、可打印)。
|
|
3
|
+
*
|
|
4
|
+
* 三条硬要求:
|
|
5
|
+
* 1. **单文件**——图表以 SVG 内联,不引任何 CDN,断网也能打开,转发不丢样式;
|
|
6
|
+
* 2. **可打印**——A4 分页、图表不跨页断裂,Ctrl+P 直接出 PDF;
|
|
7
|
+
* 3. **必须声明数据新鲜度**——`isFinal=false` 时顶部挂红条。未封板的数据被当成
|
|
8
|
+
* 对外口径报出去,是经营报告最贵的那类错误。
|
|
9
|
+
*/
|
|
10
|
+
import { esc } from "../charts/format.js";
|
|
11
|
+
const CSS = `
|
|
12
|
+
:root{--ink:#2C2C2A;--muted:#5F5E5A;--line:#E6E4DC;--bg:#FAFAF8;--warn:#A32D2D;--warnbg:#FCEBEB}
|
|
13
|
+
*{box-sizing:border-box}
|
|
14
|
+
body{margin:0;padding:32px;background:var(--bg);color:var(--ink);
|
|
15
|
+
font-family:-apple-system,BlinkMacSystemFont,'Segoe UI','PingFang SC','Microsoft YaHei',sans-serif;
|
|
16
|
+
font-size:14px;line-height:1.7}
|
|
17
|
+
header h1{margin:0 0 6px;font-size:22px;font-weight:500}
|
|
18
|
+
header .sub{color:var(--muted);font-size:13px}
|
|
19
|
+
.meta{margin:14px 0 0;padding:10px 14px;border:1px solid var(--line);border-radius:8px;
|
|
20
|
+
background:#fff;color:var(--muted);font-size:12px}
|
|
21
|
+
.warn{margin:12px 0 0;padding:10px 14px;border-radius:8px;background:var(--warnbg);
|
|
22
|
+
border:1px solid #F09595;color:var(--warn);font-size:13px}
|
|
23
|
+
section{margin-top:28px;break-inside:avoid}
|
|
24
|
+
section h2{margin:0 0 12px;font-size:16px;font-weight:500;padding-left:10px;border-left:3px solid #378ADD}
|
|
25
|
+
.chart{background:#fff;border:1px solid var(--line);border-radius:10px;padding:8px;margin-bottom:14px;
|
|
26
|
+
break-inside:avoid}
|
|
27
|
+
.chart svg{display:block;max-width:100%;height:auto}
|
|
28
|
+
.note{color:var(--muted);font-size:12px;padding:2px 8px 8px}
|
|
29
|
+
.narrative{background:#fff;border:1px solid var(--line);border-radius:10px;padding:18px 20px}
|
|
30
|
+
.narrative p{margin:0 0 10px}
|
|
31
|
+
.narrative p:last-child{margin-bottom:0}
|
|
32
|
+
footer{margin-top:32px;padding-top:14px;border-top:1px solid var(--line);color:var(--muted);font-size:12px}
|
|
33
|
+
@media print{
|
|
34
|
+
@page{size:A4;margin:14mm}
|
|
35
|
+
body{padding:0;background:#fff;font-size:12px}
|
|
36
|
+
section{page-break-inside:avoid}
|
|
37
|
+
.chart{page-break-inside:avoid}
|
|
38
|
+
}
|
|
39
|
+
`;
|
|
40
|
+
export function buildReportHtml(input) {
|
|
41
|
+
const parts = [`<!DOCTYPE html><html lang="zh-CN"><head><meta charset="utf-8">`];
|
|
42
|
+
parts.push(`<meta name="viewport" content="width=device-width,initial-scale=1">`);
|
|
43
|
+
parts.push(`<title>${esc(input.title)}</title><style>${CSS}</style></head><body>`);
|
|
44
|
+
parts.push(`<header><h1>${esc(input.title)}</h1>`);
|
|
45
|
+
if (input.subtitle)
|
|
46
|
+
parts.push(`<div class="sub">${esc(input.subtitle)}</div>`);
|
|
47
|
+
parts.push(`</header>`);
|
|
48
|
+
if (input.metaLine)
|
|
49
|
+
parts.push(`<div class="meta">${esc(input.metaLine)}</div>`);
|
|
50
|
+
if (input.warnUnfinal) {
|
|
51
|
+
parts.push(`<div class="warn">⚠️ 本报告的统计数据<strong>尚未封板</strong>(isFinal=false),` +
|
|
52
|
+
`后续 Finalize 可能修正数值。对外披露或出正式财报前请重新确认。</div>`);
|
|
53
|
+
}
|
|
54
|
+
if (input.narrative?.length) {
|
|
55
|
+
parts.push(`<section><h2>结论</h2><div class="narrative">`);
|
|
56
|
+
for (const p of input.narrative)
|
|
57
|
+
parts.push(`<p>${esc(p)}</p>`);
|
|
58
|
+
parts.push(`</div></section>`);
|
|
59
|
+
}
|
|
60
|
+
for (const block of input.blocks) {
|
|
61
|
+
parts.push(`<section>`);
|
|
62
|
+
if (block.heading)
|
|
63
|
+
parts.push(`<h2>${esc(block.heading)}</h2>`);
|
|
64
|
+
if (block.svg)
|
|
65
|
+
parts.push(`<div class="chart">${block.svg}</div>`);
|
|
66
|
+
if (block.note)
|
|
67
|
+
parts.push(`<div class="note">${esc(block.note)}</div>`);
|
|
68
|
+
parts.push(`</section>`);
|
|
69
|
+
}
|
|
70
|
+
if (input.footer)
|
|
71
|
+
parts.push(`<footer>${esc(input.footer)}</footer>`);
|
|
72
|
+
parts.push(`</body></html>`);
|
|
73
|
+
return parts.join("");
|
|
74
|
+
}
|
|
75
|
+
/** 生成报告尾部固定声明——口径纪律要跟着产物走,不能只在文档里写。 */
|
|
76
|
+
export function reportFooter(chartCount, requestIds) {
|
|
77
|
+
const ids = requestIds.length > 0 ? ` | requestId:${requestIds.slice(0, 3).join(", ")}${requestIds.length > 3 ? " 等" : ""}` : "";
|
|
78
|
+
return [
|
|
79
|
+
`共 ${chartCount} 张图表,数据均来自平台驾驶舱只读接口。`,
|
|
80
|
+
`金额未收敛到单一币种时不可跨币种相加;GMV 为成功订单金额口径,退款单独统计、不冲减。`,
|
|
81
|
+
`生成时间:${new Date().toLocaleString("zh-CN", { timeZone: "Asia/Shanghai" })}${ids}`,
|
|
82
|
+
].join(" | ");
|
|
83
|
+
}
|
|
84
|
+
//# sourceMappingURL=html.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"html.js","sourceRoot":"","sources":["../../src/reports/html.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
export const REPORT_TEMPLATES = [
|
|
2
|
+
{
|
|
3
|
+
id: "cockpit-full",
|
|
4
|
+
title: "平台驾驶舱全量快照",
|
|
5
|
+
description: "三舱 KPI + 全部图表的一页式快照,最接近需求文档里的页面形态。",
|
|
6
|
+
defaultPreset: "last_7d",
|
|
7
|
+
charts: [
|
|
8
|
+
"ceo.kpi",
|
|
9
|
+
"ceo.gmv_trend",
|
|
10
|
+
"ceo.revenue_trend",
|
|
11
|
+
"ceo.profit_trend",
|
|
12
|
+
"ceo.aum_trend",
|
|
13
|
+
"ceo.business_gmv",
|
|
14
|
+
"ceo.business_revenue",
|
|
15
|
+
"ceo.business_profit",
|
|
16
|
+
"ceo.business_share",
|
|
17
|
+
"ceo.top_merchants",
|
|
18
|
+
"ops.kpi",
|
|
19
|
+
"ops.order_trend",
|
|
20
|
+
"ops.success_rate_trend",
|
|
21
|
+
"ops.exception_trend",
|
|
22
|
+
"ops.business_orders",
|
|
23
|
+
"ops.business_success_rate",
|
|
24
|
+
"ops.channel_orders",
|
|
25
|
+
"ops.channel_success_rate",
|
|
26
|
+
"ops.fail_reason",
|
|
27
|
+
"ops.top_exception_merchants",
|
|
28
|
+
"ops.merchant_growth",
|
|
29
|
+
"fin.kpi",
|
|
30
|
+
"fin.fund_trend",
|
|
31
|
+
"fin.balance_trend",
|
|
32
|
+
"fin.settlement_trend",
|
|
33
|
+
"fin.settlement_combo",
|
|
34
|
+
"fin.fund_distribution",
|
|
35
|
+
"fin.balance_distribution",
|
|
36
|
+
"fin.balance_share",
|
|
37
|
+
"fin.reconciliation",
|
|
38
|
+
"fin.top_merchant_balances",
|
|
39
|
+
"fin.top_reconciliation_merchants",
|
|
40
|
+
],
|
|
41
|
+
},
|
|
42
|
+
{
|
|
43
|
+
id: "daily-briefing",
|
|
44
|
+
title: "每日经营日报",
|
|
45
|
+
description: "三舱 KPI + 四条核心趋势,适合每天固定看一眼。",
|
|
46
|
+
defaultPreset: "yesterday",
|
|
47
|
+
charts: [
|
|
48
|
+
"ceo.kpi",
|
|
49
|
+
"ceo.gmv_trend",
|
|
50
|
+
"ops.kpi",
|
|
51
|
+
"ops.order_trend",
|
|
52
|
+
"ops.success_rate_trend",
|
|
53
|
+
"fin.kpi",
|
|
54
|
+
"fin.fund_trend",
|
|
55
|
+
],
|
|
56
|
+
},
|
|
57
|
+
{
|
|
58
|
+
id: "ops-anomaly-triage",
|
|
59
|
+
title: "运营异常归因报告",
|
|
60
|
+
description: "异常量趋势 → 失败原因结构 → 渠道 → 集中商户,按归因顺序排列。",
|
|
61
|
+
cabin: "operation",
|
|
62
|
+
defaultPreset: "last_7d",
|
|
63
|
+
charts: [
|
|
64
|
+
"ops.kpi",
|
|
65
|
+
"ops.exception_trend",
|
|
66
|
+
"ops.fail_reason",
|
|
67
|
+
"ops.channel_success_rate",
|
|
68
|
+
"ops.business_success_rate",
|
|
69
|
+
"ops.top_exception_merchants",
|
|
70
|
+
],
|
|
71
|
+
},
|
|
72
|
+
{
|
|
73
|
+
id: "finance-weekly-review",
|
|
74
|
+
title: "财务周度复盘",
|
|
75
|
+
description: "资金、余额、结算、对账四条线。",
|
|
76
|
+
cabin: "finance",
|
|
77
|
+
defaultPreset: "last_7d",
|
|
78
|
+
charts: [
|
|
79
|
+
"fin.kpi",
|
|
80
|
+
"fin.fund_trend",
|
|
81
|
+
"fin.balance_trend",
|
|
82
|
+
"fin.settlement_trend",
|
|
83
|
+
"fin.fund_distribution",
|
|
84
|
+
"fin.reconciliation",
|
|
85
|
+
"fin.top_merchant_balances",
|
|
86
|
+
"fin.top_reconciliation_merchants",
|
|
87
|
+
],
|
|
88
|
+
},
|
|
89
|
+
{
|
|
90
|
+
id: "ceo-briefing",
|
|
91
|
+
title: "CEO 经营简报",
|
|
92
|
+
description: "需求《高管驾驶舱》全部 8 KPI + 9 图的经营简报。",
|
|
93
|
+
cabin: "ceo",
|
|
94
|
+
defaultPreset: "last_30d",
|
|
95
|
+
charts: [
|
|
96
|
+
"ceo.kpi",
|
|
97
|
+
"ceo.gmv_trend",
|
|
98
|
+
"ceo.revenue_trend",
|
|
99
|
+
"ceo.profit_trend",
|
|
100
|
+
"ceo.aum_trend",
|
|
101
|
+
"ceo.business_gmv",
|
|
102
|
+
"ceo.business_revenue",
|
|
103
|
+
"ceo.business_profit",
|
|
104
|
+
"ceo.business_share",
|
|
105
|
+
"ceo.top_merchants",
|
|
106
|
+
],
|
|
107
|
+
},
|
|
108
|
+
];
|
|
109
|
+
const BY_ID = new Map(REPORT_TEMPLATES.map((t) => [t.id, t]));
|
|
110
|
+
export function getReportTemplate(id) {
|
|
111
|
+
return BY_ID.get(id);
|
|
112
|
+
}
|
|
113
|
+
//# sourceMappingURL=templates.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"templates.js","sourceRoot":"","sources":["../../src/reports/templates.ts"],"names":[],"mappings":"AAsBA,MAAM,CAAC,MAAM,gBAAgB,GAA8B;IACzD;QACE,EAAE,EAAE,cAAc;QAClB,KAAK,EAAE,WAAW;QAClB,WAAW,EAAE,oCAAoC;QACjD,aAAa,EAAE,SAAS;QACxB,MAAM,EAAE;YACN,SAAS;YACT,eAAe;YACf,mBAAmB;YACnB,kBAAkB;YAClB,eAAe;YACf,kBAAkB;YAClB,sBAAsB;YACtB,qBAAqB;YACrB,oBAAoB;YACpB,mBAAmB;YACnB,SAAS;YACT,iBAAiB;YACjB,wBAAwB;YACxB,qBAAqB;YACrB,qBAAqB;YACrB,2BAA2B;YAC3B,oBAAoB;YACpB,0BAA0B;YAC1B,iBAAiB;YACjB,6BAA6B;YAC7B,qBAAqB;YACrB,SAAS;YACT,gBAAgB;YAChB,mBAAmB;YACnB,sBAAsB;YACtB,sBAAsB;YACtB,uBAAuB;YACvB,0BAA0B;YAC1B,mBAAmB;YACnB,oBAAoB;YACpB,2BAA2B;YAC3B,kCAAkC;SACnC;KACF;IACD;QACE,EAAE,EAAE,gBAAgB;QACpB,KAAK,EAAE,QAAQ;QACf,WAAW,EAAE,4BAA4B;QACzC,aAAa,EAAE,WAAW;QAC1B,MAAM,EAAE;YACN,SAAS;YACT,eAAe;YACf,SAAS;YACT,iBAAiB;YACjB,wBAAwB;YACxB,SAAS;YACT,gBAAgB;SACjB;KACF;IACD;QACE,EAAE,EAAE,oBAAoB;QACxB,KAAK,EAAE,UAAU;QACjB,WAAW,EAAE,qCAAqC;QAClD,KAAK,EAAE,WAAW;QAClB,aAAa,EAAE,SAAS;QACxB,MAAM,EAAE;YACN,SAAS;YACT,qBAAqB;YACrB,iBAAiB;YACjB,0BAA0B;YAC1B,2BAA2B;YAC3B,6BAA6B;SAC9B;KACF;IACD;QACE,EAAE,EAAE,uBAAuB;QAC3B,KAAK,EAAE,QAAQ;QACf,WAAW,EAAE,iBAAiB;QAC9B,KAAK,EAAE,SAAS;QAChB,aAAa,EAAE,SAAS;QACxB,MAAM,EAAE;YACN,SAAS;YACT,gBAAgB;YAChB,mBAAmB;YACnB,sBAAsB;YACtB,uBAAuB;YACvB,oBAAoB;YACpB,2BAA2B;YAC3B,kCAAkC;SACnC;KACF;IACD;QACE,EAAE,EAAE,cAAc;QAClB,KAAK,EAAE,UAAU;QACjB,WAAW,EAAE,+BAA+B;QAC5C,KAAK,EAAE,KAAK;QACZ,aAAa,EAAE,UAAU;QACzB,MAAM,EAAE;YACN,SAAS;YACT,eAAe;YACf,mBAAmB;YACnB,kBAAkB;YAClB,eAAe;YACf,kBAAkB;YAClB,sBAAsB;YACtB,qBAAqB;YACrB,oBAAoB;YACpB,mBAAmB;SACpB;KACF;CACO,CAAC;AAEX,MAAM,KAAK,GAAG,IAAI,GAAG,CAAyB,gBAAgB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;AAEtF,MAAM,UAAU,iBAAiB,CAAC,EAAU;IAC1C,OAAO,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;AACvB,CAAC"}
|