cli-calctool 0.3.4 → 1.0.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 +9 -161
- package/cli.mjs +238 -0
- package/package.json +20 -7
- package/{skills/calctool → skill}/skill.json +1 -1
- package/LICENSE +0 -201
- package/install.mjs +0 -442
- package/skills/blueprint/SKILL.md +0 -47
- package/skills/blueprint/install-meta.json +0 -7
- package/skills/blueprint/skill.json +0 -10
- package/skills/calctool/install-meta.json +0 -7
- package/skills/calctool/platform-template/README.md +0 -74
- package/skills/calctool/platform-template/index.html +0 -12
- package/skills/calctool/platform-template/package.json +0 -26
- package/skills/calctool/platform-template/src/App.tsx +0 -233
- package/skills/calctool/platform-template/src/authz.ts +0 -103
- package/skills/calctool/platform-template/src/engine/evaluate.ts +0 -114
- package/skills/calctool/platform-template/src/engine-definition.json +0 -195
- package/skills/calctool/platform-template/src/main.tsx +0 -13
- package/skills/calctool/platform-template/src/pipeline.ts +0 -80
- package/skills/calctool/platform-template/src/store.ts +0 -53
- package/skills/calctool/platform-template/tsconfig.json +0 -15
- package/skills/calctool/platform-template/vite.config.ts +0 -7
- package/skills/calctool/references/declarative-pages.md +0 -69
- package/skills/calctool/references/engine-meta-model.md +0 -123
- package/skills/calctool/references/finance-example.md +0 -132
- package/skills/calctool/references/formula-dsl.md +0 -92
- package/skills/calctool/references/import-ocr.md +0 -72
- package/skills/calctool/templates/ecommerce-ops/README.md +0 -27
- package/skills/calctool/templates/ecommerce-ops/domain-reference.yaml +0 -172
- package/skills/swarm/SKILL.md +0 -120
- package/skills/swarm/install-meta.json +0 -7
- package/skills/swarm/references/ops-heartbeat.md +0 -45
- package/skills/swarm/references/org-chart.md +0 -50
- package/skills/swarm/references/security-guard.md +0 -56
- package/skills/swarm/references/task-lifecycle.md +0 -53
- package/skills/swarm/references/traffic-light.md +0 -52
- package/skills/swarm/skill.json +0 -10
- package/skills/swarm/swarm-runtime.mjs +0 -600
- package/sources.json +0 -25
- package/{skills/calctool → skill}/SKILL.md +5 -5
|
@@ -1,80 +0,0 @@
|
|
|
1
|
-
// calctool 链路编排:整套工具 = 联通节点(非单页孤岛)
|
|
2
|
-
// 定义数据如何在节点间流动:输入 → 校验 → 计算 → 存储 → 输出 → 自动化
|
|
3
|
-
// 节点可增删改,链路随之更新 —— 后期改工具只动这里,不改页面
|
|
4
|
-
|
|
5
|
-
import type { FormulaNode } from './engine/evaluate'
|
|
6
|
-
|
|
7
|
-
export type PipelineNodeKind =
|
|
8
|
-
| 'input' // 数据输入(表单/导入)
|
|
9
|
-
| 'validate' // 校验(必填/类型/范围)
|
|
10
|
-
| 'compute' // 确定性计算(公式引擎)
|
|
11
|
-
| 'store' // 数据存储(持久化)
|
|
12
|
-
| 'output' // 输出(指标卡/报告/导出)
|
|
13
|
-
| 'automate' // 自动化(触发器/定时/通知)
|
|
14
|
-
|
|
15
|
-
export type PipelineNode = {
|
|
16
|
-
id: string
|
|
17
|
-
kind: PipelineNodeKind
|
|
18
|
-
label: string
|
|
19
|
-
inputs: string[] // 上游节点 id
|
|
20
|
-
outputs: string[] // 下游节点 id
|
|
21
|
-
config?: Record<string, unknown>
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
export type Pipeline = {
|
|
25
|
-
engineId: string
|
|
26
|
-
nodes: PipelineNode[]
|
|
27
|
-
// 数据流:input -> validate -> compute -> store -> output (+ automate)
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
/** 默认链路:整套工具的骨架(模块联通,非孤岛) */
|
|
31
|
-
export function defaultPipeline(engineId: string): Pipeline {
|
|
32
|
-
return {
|
|
33
|
-
engineId,
|
|
34
|
-
nodes: [
|
|
35
|
-
{ id: 'input', kind: 'input', label: '录入/导入', inputs: [], outputs: ['validate'] },
|
|
36
|
-
{ id: 'validate', kind: 'validate', label: '数据校验', inputs: ['input'], outputs: ['compute'] },
|
|
37
|
-
{ id: 'compute', kind: 'compute', label: '确定性计算', inputs: ['validate'], outputs: ['store', 'output'] },
|
|
38
|
-
{ id: 'store', kind: 'store', label: '数据存储', inputs: ['compute'], outputs: ['output'] },
|
|
39
|
-
{ id: 'output', kind: 'output', label: '指标卡/报告', inputs: ['compute', 'store'], outputs: [] },
|
|
40
|
-
{ id: 'automate', kind: 'automate', label: '自动化(可选)', inputs: ['store'], outputs: ['output'], config: { enabled: false } },
|
|
41
|
-
],
|
|
42
|
-
}
|
|
43
|
-
}
|
|
44
|
-
|
|
45
|
-
export type FieldDef = {
|
|
46
|
-
key: string
|
|
47
|
-
label: string
|
|
48
|
-
type: 'number' | 'integer' | 'money' | 'percent' | 'text' | 'date' | 'enum'
|
|
49
|
-
unit?: string
|
|
50
|
-
required?: boolean
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
export type FormulaDef = {
|
|
54
|
-
key: string
|
|
55
|
-
label: string
|
|
56
|
-
expression: FormulaNode
|
|
57
|
-
}
|
|
58
|
-
|
|
59
|
-
export type EngineDefinition = {
|
|
60
|
-
engineId: string
|
|
61
|
-
name: string
|
|
62
|
-
semanticVersion: string
|
|
63
|
-
category: string
|
|
64
|
-
decimalPolicy: string
|
|
65
|
-
fields: FieldDef[]
|
|
66
|
-
formulas: FormulaDef[]
|
|
67
|
-
rules: unknown[]
|
|
68
|
-
pipeline: Pipeline
|
|
69
|
-
}
|
|
70
|
-
|
|
71
|
-
/** 在链路中找节点的上下游(改工具时定位影响范围) */
|
|
72
|
-
export function nodeNeighbors(pipeline: Pipeline, nodeId: string) {
|
|
73
|
-
const node = pipeline.nodes.find((n) => n.id === nodeId)
|
|
74
|
-
if (!node) return null
|
|
75
|
-
return {
|
|
76
|
-
node,
|
|
77
|
-
upstream: pipeline.nodes.filter((n) => node.inputs.includes(n.id)),
|
|
78
|
-
downstream: pipeline.nodes.filter((n) => n.inputs.includes(nodeId)),
|
|
79
|
-
}
|
|
80
|
-
}
|
|
@@ -1,53 +0,0 @@
|
|
|
1
|
-
// calctool 存储层:数据持久化
|
|
2
|
-
// 默认 localStorage(零依赖,任何环境可用);Node 全功能模式可换 better-sqlite3
|
|
3
|
-
export type ToolRecord = {
|
|
4
|
-
id: string
|
|
5
|
-
engineId: string
|
|
6
|
-
inputs: Record<string, string | number>
|
|
7
|
-
results: Record<string, string>
|
|
8
|
-
createdAt: string
|
|
9
|
-
updatedAt: string
|
|
10
|
-
}
|
|
11
|
-
|
|
12
|
-
const KEY_PREFIX = 'calctool:record:'
|
|
13
|
-
|
|
14
|
-
export class ToolStore {
|
|
15
|
-
constructor(private readonly engineId: string) {}
|
|
16
|
-
|
|
17
|
-
list(): ToolRecord[] {
|
|
18
|
-
if (typeof localStorage === 'undefined') return []
|
|
19
|
-
const records: ToolRecord[] = []
|
|
20
|
-
for (let i = 0; i < localStorage.length; i++) {
|
|
21
|
-
const key = localStorage.key(i)
|
|
22
|
-
if (key?.startsWith(`${KEY_PREFIX}${this.engineId}:`)) {
|
|
23
|
-
try {
|
|
24
|
-
records.push(JSON.parse(localStorage.getItem(key) ?? 'null'))
|
|
25
|
-
} catch { /* 跳过损坏记录 */ }
|
|
26
|
-
}
|
|
27
|
-
}
|
|
28
|
-
return records.sort((a, b) => b.updatedAt.localeCompare(a.updatedAt))
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
save(inputs: Record<string, string | number>, results: Record<string, string>): ToolRecord {
|
|
32
|
-
const now = new Date().toISOString()
|
|
33
|
-
const record: ToolRecord = {
|
|
34
|
-
id: `${Date.now().toString(36)}-${Math.random().toString(36).slice(2, 8)}`,
|
|
35
|
-
engineId: this.engineId,
|
|
36
|
-
inputs, results, createdAt: now, updatedAt: now,
|
|
37
|
-
}
|
|
38
|
-
if (typeof localStorage !== 'undefined') {
|
|
39
|
-
localStorage.setItem(`${KEY_PREFIX}${this.engineId}:${record.id}`, JSON.stringify(record))
|
|
40
|
-
}
|
|
41
|
-
return record
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
clear(): void {
|
|
45
|
-
if (typeof localStorage === 'undefined') return
|
|
46
|
-
const keys: string[] = []
|
|
47
|
-
for (let i = 0; i < localStorage.length; i++) {
|
|
48
|
-
const key = localStorage.key(i)
|
|
49
|
-
if (key?.startsWith(`${KEY_PREFIX}${this.engineId}:`)) keys.push(key)
|
|
50
|
-
}
|
|
51
|
-
keys.forEach((k) => localStorage.removeItem(k))
|
|
52
|
-
}
|
|
53
|
-
}
|
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"compilerOptions": {
|
|
3
|
-
"target": "ES2022",
|
|
4
|
-
"module": "ESNext",
|
|
5
|
-
"moduleResolution": "bundler",
|
|
6
|
-
"jsx": "react-jsx",
|
|
7
|
-
"strict": true,
|
|
8
|
-
"skipLibCheck": true,
|
|
9
|
-
"resolveJsonModule": true,
|
|
10
|
-
"esModuleInterop": true,
|
|
11
|
-
"noEmit": true,
|
|
12
|
-
"types": ["vite/client"]
|
|
13
|
-
},
|
|
14
|
-
"include": ["src"]
|
|
15
|
-
}
|
|
@@ -1,69 +0,0 @@
|
|
|
1
|
-
# 声明式页面规格系统
|
|
2
|
-
|
|
3
|
-
把"信息型页面"从代码降级为**数据声明**,用通用渲染器渲染几十个页面,避免复制粘贴页面结构。这是生成工具页面的核心机制。
|
|
4
|
-
|
|
5
|
-
## 1. 规格 Schema
|
|
6
|
-
|
|
7
|
-
```ts
|
|
8
|
-
interface ApplicationPageSpec {
|
|
9
|
-
title: string;
|
|
10
|
-
description?: string;
|
|
11
|
-
tabs?: TabSpec[];
|
|
12
|
-
actions?: ActionSpec[]; // 页头操作(default|primary|danger)
|
|
13
|
-
sections?: SectionSpec[]; // 内容分区
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
-
interface SectionSpec {
|
|
17
|
-
layout: 'rows' | 'grid' | 'table' | 'steps';
|
|
18
|
-
rows?: RowSpec[]; // 标签/值/说明/状态/行内操作
|
|
19
|
-
metrics?: MetricSpec[]; // 指标卡
|
|
20
|
-
columns?: ColumnSpec[];
|
|
21
|
-
data?: (string | number)[][]; // 表格数据
|
|
22
|
-
empty?: EmptyStateSpec; // 空状态(标题/说明/操作)
|
|
23
|
-
}
|
|
24
|
-
```
|
|
25
|
-
|
|
26
|
-
## 2. 注册与路由匹配
|
|
27
|
-
|
|
28
|
-
- 规格文件按域拆分(core/settings/management/finance/studio/supplementary),每份是 `Record<string, ApplicationPageSpec>` + 路由映射
|
|
29
|
-
- 支持参数化路由:`/tools/:toolId/runs/:runId`、`/automations/:automationId/edit`
|
|
30
|
-
- 匹配算法:按路径段数**从长到短**排序 → 逐段精确匹配(`:` 前缀为参数位)→ 命中后提取 params → `encodeURIComponent` 回填规格内 `href`
|
|
31
|
-
|
|
32
|
-
## 3. 渲染器
|
|
33
|
-
|
|
34
|
-
`ApplicationPageSpec → 通用构建块组件树`:
|
|
35
|
-
|
|
36
|
-
```
|
|
37
|
-
PageShell(内容 768px)
|
|
38
|
-
→ PageHeader(标题/说明/操作)
|
|
39
|
-
→ SectionCard × N(分区)
|
|
40
|
-
→ 按 layout 分发:
|
|
41
|
-
rows → SettingRow 行
|
|
42
|
-
grid → 网格卡
|
|
43
|
-
table → 表格
|
|
44
|
-
steps → 步骤条
|
|
45
|
-
empty → EmptyState
|
|
46
|
-
```
|
|
47
|
-
|
|
48
|
-
- 无 `href` 的操作自动 `disabled`——保证"未接入"按钮不产生假交互
|
|
49
|
-
- 所有构建块来自共享组件(PageShell/PageHeader/SectionCard/SettingRow/EmptyState/StatGrid/PageList/Toolbar),页面只提供数据
|
|
50
|
-
- 单文件 ≤ 1000 行(审计脚本强制),接近上限必须拆分
|
|
51
|
-
|
|
52
|
-
## 4. 生成工具时的页面映射
|
|
53
|
-
|
|
54
|
-
| 工具模块 | 页面规格 |
|
|
55
|
-
|---|---|
|
|
56
|
-
| 录入表单 | 字段目录 → 自动生成 rows/grid 表单(含必填/类型/单位) |
|
|
57
|
-
| 指标卡 | 公式结果 → metrics 数组(StatGrid) |
|
|
58
|
-
| 专题工具 | 每个专题 → 独立 SectionCard(增值税/盈亏平衡/定价/利润率优化) |
|
|
59
|
-
| 历史记录 | table 布局 + 分页 |
|
|
60
|
-
| 诊断报告 | 指标卡 + 表格 + 诊断结论 + 建议 |
|
|
61
|
-
| 空状态 | 无数据时 EmptyState(不虚构装饰图标) |
|
|
62
|
-
|
|
63
|
-
## 5. 硬约束(从工具项目继承)
|
|
64
|
-
|
|
65
|
-
- 正文内容容器统一 768px(与 Composer 同宽),窄屏等比收窄,禁止按页面类型自由设宽
|
|
66
|
-
- 禁内联 style、禁硬编码颜色、禁阴影
|
|
67
|
-
- 图标统一 Lucide、14px、描边 2
|
|
68
|
-
- 空页面不显示装饰图标,不虚构状态/数据/提示/按钮
|
|
69
|
-
- 能拆成组件的内容禁止堆积在页面文件中
|
|
@@ -1,123 +0,0 @@
|
|
|
1
|
-
# 引擎元模型(Engine Meta-Model)
|
|
2
|
-
|
|
3
|
-
一个可发布、可运行、可验收的"计算工具"= 一份**引擎定义**。本文件规定引擎定义的结构与约束。
|
|
4
|
-
|
|
5
|
-
## 1. 顶级对象
|
|
6
|
-
|
|
7
|
-
```ts
|
|
8
|
-
interface EngineDefinition {
|
|
9
|
-
id: string; // kebab-case 稳定机器标识
|
|
10
|
-
name: string; // 中文显示名,可改
|
|
11
|
-
semanticVersion: string; // 语义版本,发布后不可原地修改
|
|
12
|
-
status: 'draft' | 'review' | 'published' | 'retired';
|
|
13
|
-
compatibilityProfile?: string; // 如 legacy-compatible(复现旧口径)
|
|
14
|
-
decimalPolicy: 'decimal-string' | 'source-compatible-float';
|
|
15
|
-
inputSchema: JsonSchema; // 输入校验
|
|
16
|
-
fields: FieldDefinition[]; // 字段目录
|
|
17
|
-
tables: TableDefinition[]; // 表格定义(如成本结构表)
|
|
18
|
-
dimensions: DimensionDefinition[]; // 维度(公司/部门/周期)
|
|
19
|
-
entities: EntitySchemaDefinition[]; // 实体
|
|
20
|
-
relations: RelationDefinition[]; // 关系
|
|
21
|
-
choiceSources: ChoiceSourceDefinition[];
|
|
22
|
-
interactionRules: InteractionRuleDefinition[];
|
|
23
|
-
formulas: FormulaDefinition[]; // 公式图
|
|
24
|
-
rules: RuleDefinition[]; // 规则包(阈值/评分/分级)
|
|
25
|
-
views: ViewDefinition[]; // 视图
|
|
26
|
-
documents: MarkdownDocumentDefinition[]; // Markdown 说明/报告
|
|
27
|
-
approvalPolicyRefs: string[];
|
|
28
|
-
importProfiles: ImportProfile[]; // 导入映射
|
|
29
|
-
reports: ReportDefinition[]; // 报告模板
|
|
30
|
-
outputs: OutputContract[]; // 输出契约(跨引擎引用用)
|
|
31
|
-
permissions: EnginePermissionPolicy;
|
|
32
|
-
testSuites: EngineTestSuite[]; // 确定性测试
|
|
33
|
-
migrationFrom?: EngineMigration[];
|
|
34
|
-
}
|
|
35
|
-
```
|
|
36
|
-
|
|
37
|
-
**铁律**:
|
|
38
|
-
- `id` 与字段 `key` 是稳定机器标识;中文标签可以改,ID 不改
|
|
39
|
-
- 所有引用用 ID,不用页面标题或表格坐标作主键
|
|
40
|
-
- 发布版本不可原地修改;运行记录绑定精确的 `engineVersionId`
|
|
41
|
-
- 跨引擎只允许引用对方声明的输出契约
|
|
42
|
-
|
|
43
|
-
## 2. 字段类型
|
|
44
|
-
|
|
45
|
-
```text
|
|
46
|
-
number, money, percent, integer, text, richText, boolean,
|
|
47
|
-
date, dateTime, enum, singleSelect, multiSelect, dimensionRef,
|
|
48
|
-
entityRef, file, image, object, repeatGroup, table, reference, derived
|
|
49
|
-
```
|
|
50
|
-
|
|
51
|
-
每个数值字段至少含:
|
|
52
|
-
- `key`(稳定 ID)、`label`(中文标签)、`type`
|
|
53
|
-
- `required` / `defaultValue`
|
|
54
|
-
- `precision` / `rounding`(金额、比例、整数分别定义)
|
|
55
|
-
- `unit`(如 CNY、CNY/person、%)
|
|
56
|
-
- 枚举字段含 `choiceSourceRef`
|
|
57
|
-
|
|
58
|
-
## 3. 公式定义
|
|
59
|
-
|
|
60
|
-
```ts
|
|
61
|
-
interface FormulaDefinition {
|
|
62
|
-
key: string;
|
|
63
|
-
label: string;
|
|
64
|
-
type: 'derived' | 'score' | 'aggregate' | 'lookup';
|
|
65
|
-
expression: FormulaAst; // 编译后的 AST(见 formula-dsl.md)
|
|
66
|
-
source?: string; // 可读字符串(仅编辑用,保存必须 AST)
|
|
67
|
-
outputUnit?: string;
|
|
68
|
-
description?: string;
|
|
69
|
-
}
|
|
70
|
-
```
|
|
71
|
-
|
|
72
|
-
## 4. 规则包(Rule Pack)
|
|
73
|
-
|
|
74
|
-
```ts
|
|
75
|
-
interface RuleDefinition {
|
|
76
|
-
id: string;
|
|
77
|
-
name: string;
|
|
78
|
-
kind: 'threshold' | 'scoring' | 'grading' | 'validation';
|
|
79
|
-
// 阈值:区间 → 级别
|
|
80
|
-
// 评分:指标值 → 0-100 分(可曲线/分段)
|
|
81
|
-
// 分级:总分 → 健康等级(如 优/良/中/差)
|
|
82
|
-
inputs: string[]; // 引用字段/公式 key
|
|
83
|
-
evaluation: RuleAst; // 条件 AST
|
|
84
|
-
}
|
|
85
|
-
```
|
|
86
|
-
|
|
87
|
-
## 5. 导入 Profile
|
|
88
|
-
|
|
89
|
-
```ts
|
|
90
|
-
interface ImportProfile {
|
|
91
|
-
id: string;
|
|
92
|
-
kind: 'excel' | 'ocr' | 'manual';
|
|
93
|
-
sourceFormat: string; // Excel 列 / OCR 字段布局
|
|
94
|
-
mapping: { source: string; targetField: string; transform?: string }[];
|
|
95
|
-
verification: 'draft' | 'auto'; // 自动导入先进草稿
|
|
96
|
-
}
|
|
97
|
-
```
|
|
98
|
-
|
|
99
|
-
## 6. 报告模板
|
|
100
|
-
|
|
101
|
-
```ts
|
|
102
|
-
interface ReportDefinition {
|
|
103
|
-
id: string;
|
|
104
|
-
name: string;
|
|
105
|
-
sections: ReportSection[];
|
|
106
|
-
// 指标卡 / 表格 / 诊断结论 / 历史分位 / 建议
|
|
107
|
-
}
|
|
108
|
-
```
|
|
109
|
-
|
|
110
|
-
## 7. 版本与迁移
|
|
111
|
-
|
|
112
|
-
- `1.x legacy-compatible`:复现原工具结果(保留旧公式、边界、取整)
|
|
113
|
-
- `2.x corrected`:修正数据质量问题(通过显式迁移发布,绝不静默改变旧运行)
|
|
114
|
-
- 任何公式/字段/阈值/导入映射/报告变化 → 新版本
|
|
115
|
-
|
|
116
|
-
## 8. 引擎状态机(能力接入)
|
|
117
|
-
|
|
118
|
-
```text
|
|
119
|
-
planned → not_installed → disconnected → configuring
|
|
120
|
-
→ pending_verification → connected → disabled | unavailable
|
|
121
|
-
```
|
|
122
|
-
|
|
123
|
-
健康状态 `healthy/degraded/failed/unknown` **只在真实连接与探针后出现**;客户端不能提交健康状态。
|
|
@@ -1,132 +0,0 @@
|
|
|
1
|
-
# 范例:经营健康诊断引擎(finance-health-diagnosis)
|
|
2
|
-
|
|
3
|
-
完整走通「50 输入字段 → 归类 → 利润 → 十大指标评分 → 健康度 → 报告」的引擎定义范例。这是 calctool 的 reference implementation:任何新工具都可对照此结构生成。
|
|
4
|
-
|
|
5
|
-
## 1. 引擎身份
|
|
6
|
-
|
|
7
|
-
```yaml
|
|
8
|
-
engineId: finance-health-diagnosis
|
|
9
|
-
name: 经营健康诊断
|
|
10
|
-
category: finance
|
|
11
|
-
ownerType: platform-template
|
|
12
|
-
status: published
|
|
13
|
-
semanticVersion: 1.0.0
|
|
14
|
-
compatibilityProfile: legacy-compatible
|
|
15
|
-
decimalPolicy: decimal-string
|
|
16
|
-
defaultCurrency: CNY
|
|
17
|
-
defaultLocale: zh-CN
|
|
18
|
-
schemaVersion: engine-spec/1
|
|
19
|
-
```
|
|
20
|
-
|
|
21
|
-
版本族:`1.x legacy-compatible`(复现原工具);`2.x corrected`(修正财务口径,显式迁移发布)。
|
|
22
|
-
|
|
23
|
-
## 2. 六层计算链路
|
|
24
|
-
|
|
25
|
-
```
|
|
26
|
-
输入层:利润表 50 个基础字段(货品成本、账单/订单/流量费用、薪酬、仓储…)
|
|
27
|
-
→ 归类层:商品成本 / 账单费用 / 订单费用 / 流量费用 / 薪酬 / 仓储费用
|
|
28
|
-
→ 利润层:GSV / 运营毛利 GP_oper / 管理费用 / 税前净利润 NP / 占比
|
|
29
|
-
→ 诊断层:十大指标 / 动态阈值 / 单项得分 / 健康等级 / 加权健康度
|
|
30
|
-
→ 专题层:增值税 / 盈亏平衡 / 私域复购 / 单品定价 / 利润率优化
|
|
31
|
-
→ 展示层:历史分位 / 诊断重点 / HTML 报告 / 历史记录 / OGSM 执行方案
|
|
32
|
-
```
|
|
33
|
-
|
|
34
|
-
## 3. 十大指标权重(默认)
|
|
35
|
-
|
|
36
|
-
| 指标 | 权重 |
|
|
37
|
-
|---|---:|
|
|
38
|
-
| 定价倍数 | 30% |
|
|
39
|
-
| GSV | 17% |
|
|
40
|
-
| 薪酬效率 | 15% |
|
|
41
|
-
| GSV 人效 | 5% |
|
|
42
|
-
| 毛利人效 | 5% |
|
|
43
|
-
| 净利人效 | 5% |
|
|
44
|
-
| 增值税率 | 10% |
|
|
45
|
-
| 人均办公费用 | 3% |
|
|
46
|
-
| 仓储费用占比 | 5% |
|
|
47
|
-
| 单件发货成本 | 5% |
|
|
48
|
-
|
|
49
|
-
## 4. 通用评分曲线(0-100)
|
|
50
|
-
|
|
51
|
-
高值更优:
|
|
52
|
-
```text
|
|
53
|
-
S_high(A;P,E) = clamp(60 + 30 × (A-P)/(E-P), 0, 100)
|
|
54
|
-
```
|
|
55
|
-
|
|
56
|
-
低值更优(E < P,斜率自然为负):
|
|
57
|
-
```text
|
|
58
|
-
S_low(A;P,E) = clamp(60 + 30 × (A-P)/(E-P), 0, 100)
|
|
59
|
-
```
|
|
60
|
-
|
|
61
|
-
带盈亏点的分段函数(定价倍数、GSV):
|
|
62
|
-
```text
|
|
63
|
-
若 A < B: S_break = clamp(round(30 + 30 × (A-B)/(P-B)), 0, 100)
|
|
64
|
-
否则: S_break = clamp(round(60 + 30 × (A-P)/(E-P)), 0, 100)
|
|
65
|
-
```
|
|
66
|
-
(B=盈亏平衡,P=合格,E=优秀)
|
|
67
|
-
|
|
68
|
-
## 5. 分数等级
|
|
69
|
-
|
|
70
|
-
| 分数 | 等级 |
|
|
71
|
-
|---:|---|
|
|
72
|
-
| 非有限/空 | 需要优化成本结构而非数值 |
|
|
73
|
-
| <60 | 危险 |
|
|
74
|
-
| 60-<70 | 合格 |
|
|
75
|
-
| 70-<80 | 良好 |
|
|
76
|
-
| 80-<90 | 优秀 |
|
|
77
|
-
| >=90 | 卓越 |
|
|
78
|
-
|
|
79
|
-
## 6. 指标定义(当前值公式 + 目标 + 样例)
|
|
80
|
-
|
|
81
|
-
| 指标 | 公式 | 合格/良好/优秀 | 样例分 |
|
|
82
|
-
|---|---|---|---|
|
|
83
|
-
| 定价倍数 | `S / 货品成本` | 动态阈值 | 63 |
|
|
84
|
-
| GSV | `S` | 动态 | 63 |
|
|
85
|
-
| 薪酬效率 | `GP_oper / 薪酬福利` | 2.0 / 2.5 / 3.0 | 71 |
|
|
86
|
-
| GSV 人效 | `S / 正式员工数` | 100k / 120k / 150k | 60 |
|
|
87
|
-
| 毛利人效 | `GP_oper / 正式员工数` | 17k / 20.4k / 25.5k | 61 |
|
|
88
|
-
| 净利人效 | `NP / 正式员工数` | 5k / 6k / 7.5k | 64 |
|
|
89
|
-
| 增值税率 | `C_tax / S` | 综合税率×1.0/0.9/0.8 | 38.4 |
|
|
90
|
-
| 人均办公费用 | `办公费用 / 正式员工数` | 1,600 / 1,200 / 800 | 63.75 |
|
|
91
|
-
| 仓储费用占比 | `仓储费用 / S` | 4.0% / 3.5% / 3.0% | 63 |
|
|
92
|
-
| 单件发货成本 | `仓储费用 / 真实发货单量` | 1.80 / 1.60 / 1.40 | 76.5 |
|
|
93
|
-
|
|
94
|
-
动态定价倍数阈值:
|
|
95
|
-
```text
|
|
96
|
-
c = 货品成本 / S
|
|
97
|
-
n = 当前税前净利率
|
|
98
|
-
盈亏倍数 B = 1 / (c + n)
|
|
99
|
-
合格倍数 P = 1 / (c + n - 5%)
|
|
100
|
-
```
|
|
101
|
-
|
|
102
|
-
## 7. 总健康分
|
|
103
|
-
|
|
104
|
-
- 加权:`总分 = Σ(指标分 × 权重)`,保留 2 位小数
|
|
105
|
-
- 样例:62.2362(健康)
|
|
106
|
-
- 历史百分位:程序按当前版本重算每条历史记录的十大指标,与全站用户样本比较
|
|
107
|
-
|
|
108
|
-
## 8. 引擎定义产物(calctool 生成模板)
|
|
109
|
-
|
|
110
|
-
```
|
|
111
|
-
finance-health-diagnosis/
|
|
112
|
-
├── manifest.yaml # 引擎身份(见 §1)
|
|
113
|
-
├── field-catalog.json # 50 个输入字段 + 10 个派生指标
|
|
114
|
-
├── scope-dimensions.json # 公司 / 周期 维度
|
|
115
|
-
├── formula-graph.json # 六层公式图(§2)
|
|
116
|
-
├── rule-packs.json # 权重 + 评分曲线 + 等级(§3-5)
|
|
117
|
-
├── import-profiles.json # Excel 单元格映射 + OCR 字段映射
|
|
118
|
-
├── report-template.json # 指标卡 + 表格 + 诊断结论 + 建议
|
|
119
|
-
└── tests/ # 样例复算(健康分 62.2362 等)
|
|
120
|
-
```
|
|
121
|
-
|
|
122
|
-
## 9. 导入映射要点
|
|
123
|
-
|
|
124
|
-
- 原工具为 Excel 导入:F 列单元格映射到字段目录,配置表覆盖顺序以算法主文档为准
|
|
125
|
-
- 原生表格确定性解析,不做 OCR;截图/扫描件走 OCR + 人工草稿确认
|
|
126
|
-
- 所有自动导入先进入草稿,人工确认后才写正式数据
|
|
127
|
-
|
|
128
|
-
## 10. 生产注意事项
|
|
129
|
-
|
|
130
|
-
- 增值税模块属于经营估算模型,生产使用前必须由持证财税人员复核
|
|
131
|
-
- 本引擎复现的是当前产品口径,不代表会计准则、税法意见或税务筹划建议
|
|
132
|
-
- 模型(Hermes/MiMo/OCR)只生成候选、草稿和解释,不能替代已发布确定性引擎给出正式财务数字
|
|
@@ -1,92 +0,0 @@
|
|
|
1
|
-
# 公式 DSL 与确定性运行时
|
|
2
|
-
|
|
3
|
-
## 1. 禁止任意 JavaScript
|
|
4
|
-
|
|
5
|
-
禁止存储并执行 `eval(formula)` / `new Function(formula)`。原因:任意代码执行、无法静态分析、无法稳定迁移、难以做单位检查和依赖审计。
|
|
6
|
-
|
|
7
|
-
自然语言或可视化公式统一编译为 **JSON AST**:
|
|
8
|
-
|
|
9
|
-
```json
|
|
10
|
-
{
|
|
11
|
-
"op": "mul",
|
|
12
|
-
"args": [
|
|
13
|
-
{ "ref": "gmv" },
|
|
14
|
-
{ "op": "sub", "args": [{ "lit": "1" }, { "ref": "preRefundRate" }] },
|
|
15
|
-
{ "op": "sub", "args": [{ "lit": "1" }, { "ref": "postRefundRate" }] }
|
|
16
|
-
]
|
|
17
|
-
}
|
|
18
|
-
```
|
|
19
|
-
|
|
20
|
-
可提供接近 Excel 的编辑语法(字符串只用于编辑;保存前必须解析为 AST,执行时不重新解释任意脚本)。
|
|
21
|
-
|
|
22
|
-
## 2. 最小运算符注册表
|
|
23
|
-
|
|
24
|
-
| 类别 | 运算符 |
|
|
25
|
-
|---|---|
|
|
26
|
-
| 算术 | `add sub mul div mod pow abs neg min max` |
|
|
27
|
-
| 比例 | `percentOf percentageChange basisPoints` |
|
|
28
|
-
| 比较 | `eq ne gt gte lt lte between` |
|
|
29
|
-
| 逻辑 | `and or not if case` |
|
|
30
|
-
| 空值 | `coalesce isNull isFinite safeDivide` |
|
|
31
|
-
| 取整 | `round floor ceil truncate` |
|
|
32
|
-
| 聚合 | `sum avg minOf maxOf count countIf sumIf` |
|
|
33
|
-
| 表格 | `rowRef column map filter groupBy lookup` |
|
|
34
|
-
| 文本 | `concat trim upper lower match` |
|
|
35
|
-
| 日期 | `dateAdd dateDiff startOf endOf` |
|
|
36
|
-
| 维度 | `selectedIds containsAny containsAll isDescendantOf memberAttribute` |
|
|
37
|
-
| 财务(二阶段) | `npv irr pmt rate` |
|
|
38
|
-
| 统计(二阶段) | `percentile rank stdev` |
|
|
39
|
-
| 引用 | `ref tableRef engineOutput configRef` |
|
|
40
|
-
|
|
41
|
-
**显式除法**(必选其一):
|
|
42
|
-
- `div`:除数为 0 产生错误值(`DIV_ZERO`)
|
|
43
|
-
- `safeDivide`:除数为 0 使用指定回退值(如兼容旧引擎"除零返回 0")
|
|
44
|
-
|
|
45
|
-
## 3. Decimal、单位与错误值
|
|
46
|
-
|
|
47
|
-
生产运行时不依赖 JS `number` 作为财务真值:
|
|
48
|
-
|
|
49
|
-
- 内部数值用 `decimal.js` 或等价 Decimal 实现
|
|
50
|
-
- JSON 中以**字符串**持久化 Decimal
|
|
51
|
-
- 公式定义精度和取整边界
|
|
52
|
-
- 单位在**编译期推断**:
|
|
53
|
-
- `金额 + 比例` → 类型错误 `UNIT_MISMATCH`
|
|
54
|
-
- `金额 ÷ 人数` → 推导为 `CNY/person`
|
|
55
|
-
- 错误以结构化值传播,不伪装成 0:
|
|
56
|
-
|
|
57
|
-
```ts
|
|
58
|
-
type CalcError =
|
|
59
|
-
| { code: 'DIV_ZERO'; nodeId: string }
|
|
60
|
-
| { code: 'MISSING_INPUT'; fieldId: string }
|
|
61
|
-
| { code: 'UNIT_MISMATCH'; expected: string; actual: string }
|
|
62
|
-
| { code: 'NON_FINITE'; nodeId: string }
|
|
63
|
-
| { code: 'CYCLE'; path: string[] };
|
|
64
|
-
```
|
|
65
|
-
|
|
66
|
-
## 4. 依赖图(发布前必查)
|
|
67
|
-
|
|
68
|
-
1. 从 AST 提取字段和公式依赖
|
|
69
|
-
2. 验证引用存在且符合可见范围
|
|
70
|
-
3. 建立有向图
|
|
71
|
-
4. 检测循环(`CYCLE` 错误)
|
|
72
|
-
5. 标记跨模块/跨引擎引用(必须绑定版本和输出契约)
|
|
73
|
-
|
|
74
|
-
## 5. 编译流程
|
|
75
|
-
|
|
76
|
-
```
|
|
77
|
-
自然语言/Excel 公式
|
|
78
|
-
→ 解析(JSON AST,含 op/args/ref/lit)
|
|
79
|
-
→ 类型检查(单位推断、字段存在、操作数类型)
|
|
80
|
-
→ 依赖提取(字段/公式/表格/维度引用)
|
|
81
|
-
→ 循环检测
|
|
82
|
-
→ 编译为可执行运行时
|
|
83
|
-
→ 测试(样例 → 期望结果,Decimal 精确比对)
|
|
84
|
-
→ 发布(版本化,不可变)
|
|
85
|
-
```
|
|
86
|
-
|
|
87
|
-
## 6. 执行语义
|
|
88
|
-
|
|
89
|
-
- 增量重算:字段变化只重算下游依赖
|
|
90
|
-
- 执行轨迹:记录每个节点的输入/输出/错误,可审计
|
|
91
|
-
- 快照:运行记录绑定引擎版本 + 输入 + 结果,可复现
|
|
92
|
-
- 错误值传播:上游错误 → 下游保持错误(不吞掉)
|
|
@@ -1,72 +0,0 @@
|
|
|
1
|
-
# 导入与 OCR(上传内容自动识别)
|
|
2
|
-
|
|
3
|
-
用户上传内容自动识别的分层管道设计——让工具能"读懂"Excel、图片、PDF 并填入字段。
|
|
4
|
-
|
|
5
|
-
## 1. 分层管道
|
|
6
|
-
|
|
7
|
-
```
|
|
8
|
-
浏览器显式选择文件
|
|
9
|
-
→ 私有对象存储原件区
|
|
10
|
-
→ 确定性预处理(类型/大小/指纹校验)
|
|
11
|
-
→ 原始证据层(OCR / 解析器原始输出)
|
|
12
|
-
→ 语义层(多模态模型:理解内容 → 候选字段)
|
|
13
|
-
→ 映射/校验层(文本模型:候选 → 标准字段,口径解释)
|
|
14
|
-
→ 规则引擎(勾稽校验、冲突判定)
|
|
15
|
-
→ 人工确认(草稿)→ 正式计算
|
|
16
|
-
```
|
|
17
|
-
|
|
18
|
-
## 2. 铁律
|
|
19
|
-
|
|
20
|
-
1. **原始识别必须有确定性证据**:保存 OCR 原始 JSON、坐标、置信度、RequestId、页面图、模型/提示词/规则版本;任何改写都能反查原文框
|
|
21
|
-
2. **原生 Excel/CSV 不做 OCR**:先用确定性解析器读单元格、公式、合并区域、工作表、格式;只有截图、扫描件、无法解析或以图片嵌入的表格才进入 OCR
|
|
22
|
-
3. **PDF 按页编排**:OCR 一次识别一页,多页扫描件走页级任务(受控并发、可重试、页级状态)
|
|
23
|
-
4. **所有对外任务异步化**:即使接口同步返回,产品 API 也返回内部 jobId(排队/限流/重试/取消/复核/审计)
|
|
24
|
-
5. **自动导入先进草稿**:候选字段不直接覆盖正式数据
|
|
25
|
-
|
|
26
|
-
## 3. 腾讯云能力矩阵(财务场景)
|
|
27
|
-
|
|
28
|
-
| 场景 | 接口 | 用途 |
|
|
29
|
-
|---|---|---|
|
|
30
|
-
| 普通清晰页面 | `GeneralBasicOCR` | 非关键文字批量预识别 |
|
|
31
|
-
| 长数字/小字/模糊/倾斜/金额密集/税率 | `GeneralAccurateOCR` | 关键财务字段默认 |
|
|
32
|
-
| 表格 | `RecognizeTableAccurateOCR` | 表格、单元格文字、行列跨度、坐标、置信度,可返回 Base64 Excel |
|
|
33
|
-
|
|
34
|
-
## 4. 导入 Profile(ImportProfile)
|
|
35
|
-
|
|
36
|
-
```ts
|
|
37
|
-
interface ImportProfile {
|
|
38
|
-
id: string;
|
|
39
|
-
kind: 'excel' | 'ocr' | 'manual';
|
|
40
|
-
sourceFormat: string; // Excel 列 / OCR 字段布局
|
|
41
|
-
mapping: {
|
|
42
|
-
source: string; // 源列/字段
|
|
43
|
-
targetField: string; // 目标字段 key
|
|
44
|
-
transform?: string; // 归一化变换
|
|
45
|
-
}[];
|
|
46
|
-
verification: 'draft' | 'auto'; // 默认 draft
|
|
47
|
-
}
|
|
48
|
-
```
|
|
49
|
-
|
|
50
|
-
导入字段至少关联:
|
|
51
|
-
- 页码、工作表、单元格(溯源)
|
|
52
|
-
- `semanticConfidence`:模型对字段语义和映射关系的候选置信
|
|
53
|
-
- 映射规则版本
|
|
54
|
-
- 状态映射(草稿/确认/拒绝)
|
|
55
|
-
|
|
56
|
-
## 5. 人工确认界面
|
|
57
|
-
|
|
58
|
-
- 展示:OCR 证据(原文框/坐标)↔ 候选映射 ↔ 置信度
|
|
59
|
-
- 操作:确认 / 修正 / 拒绝;确认后写入正式字段
|
|
60
|
-
- 审计留痕:谁在何时确认了什么,原始证据完整保留
|
|
61
|
-
|
|
62
|
-
## 6. 前端导入交互
|
|
63
|
-
|
|
64
|
-
- `<input type="file" multiple>` 渐进增强;`webkitdirectory` 支持目录批量
|
|
65
|
-
- 先本地校验(扩展名 + MIME + 大小上限 + 去重指纹),再上传
|
|
66
|
-
- 上传即返回 jobId,状态轮询(queued → processing → review → done/failed)
|
|
67
|
-
|
|
68
|
-
## 7. 失败与边界
|
|
69
|
-
|
|
70
|
-
- 解析失败:保留原始文件 + 错误详情,提示重新上传或人工录入
|
|
71
|
-
- 置信度低于阈值:强制进入人工确认,不自动通过
|
|
72
|
-
- OCR 与 Excel 混用:同一字段多来源时以人工确认为准,记录来源优先级
|
|
@@ -1,27 +0,0 @@
|
|
|
1
|
-
# 电商运营领域模板(ecommerce-ops)
|
|
2
|
-
|
|
3
|
-
情报智能体(research-agent)从互联网收集的电商运营行业参考包,全部可溯源(见 `domain-reference.yaml` 的 sources)。
|
|
4
|
-
|
|
5
|
-
## 内容
|
|
6
|
-
|
|
7
|
-
- **10 个核心指标**:GMV / 转化率 / 客单价 / ROAS / ROI / 复购率 / UV / PV / LTV / CAC
|
|
8
|
-
- **8 组计算口径**:转化率分母、ROI vs ROAS、GMV vs 实收、客单价、复购率、归因、LTV/CAC、漏斗
|
|
9
|
-
- **6 项行业基准**:转化率 2-5%、ROAS ≥4、复购 25-30%、LTV/CAC ≥3 等
|
|
10
|
-
- **1 条漏斗链路**:曝光 → 点击 → 访问 → 加购 → 下单 → 支付
|
|
11
|
-
|
|
12
|
-
## 5 处口径争议(生成工具时做成用户可配置项)
|
|
13
|
-
|
|
14
|
-
| 配置项 | 选项 | 影响 |
|
|
15
|
-
|---|---|---|
|
|
16
|
-
| 转化率分母 | UV 去重访客 / Sessions 会话数 | 结果差异可达 2 倍 |
|
|
17
|
-
| 投产比分子 | 收入(ROAS)/ 利润(ROI) | 「投产比」一词两种语境 |
|
|
18
|
-
| GMV 扣退款 | 是 / 否 | 流水口径 vs 净额口径 |
|
|
19
|
-
| 复购率窗口 | 30 天 / 90 天 / 自然年 | 复盘 vs 品类周期 |
|
|
20
|
-
| 归因窗口 | 7 天点击 / 1 天浏览 / 28 天 / 自定义 | 广告效果评估 |
|
|
21
|
-
|
|
22
|
-
> 最终口径以老板确认为准,本模板只提供行业参考。
|
|
23
|
-
|
|
24
|
-
## 使用方式
|
|
25
|
-
|
|
26
|
-
calctool 的 research 蜂群任务在老板说「电商」等关键词时自动加载此模板,
|
|
27
|
-
作为 fields/formulas 设计的领域知识基础。
|