@xtalpi/agentic-lab-skills 0.0.10 → 0.0.11
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 +1 -1
- package/package.json +14 -14
- package/skills/lab-flow-designer/SKILL.md +612 -612
- package/skills/lab-flow-designer/embedded-template/SKILL.md +103 -103
- package/skills/lab-flow-designer/embedded-template/pools//345/205/245/345/217/243/346/261/240.md +21 -21
- package/skills/lab-flow-designer/embedded-template/pools//345/207/272/345/217/243/346/261/240.md +21 -21
- package/skills/lab-flow-designer/embedded-template/scripts//347/244/272/344/276/213/346/225/260/346/215/256/344/270/216/346/240/241/351/252/214/351/227/250/346/216/247.js +142 -142
- package/skills/lab-flow-designer/embedded-template/valves//347/244/272/344/276/213/346/225/260/346/215/256/344/270/216/346/240/241/351/252/214/351/227/250/346/216/247.md +114 -114
- package/skills/lab-flow-designer/references/agentic-lab-processer.md +122 -122
- package/skills/lab-flow-designer/references/agentic-lab-sdk.md +534 -361
- package/skills/lab-flow-designer/references/rhea-api/README.md +7 -7
- package/skills/lab-flow-designer/references/rhea-api/execute_process_batch.md +58 -58
- package/skills/lab-flow-designer/references/skill-package-layout.md +268 -268
- package/skills/lab-flow-designer/references//344/270/232/345/212/241/346/265/201/347/250/213/346/226/207/346/241/243/346/240/207/345/207/206.md +216 -216
- package/skills/lab-flow-designer/templates//344/270/232/345/212/241/346/265/201/347/250/213/346/226/207/346/241/243/346/250/241/346/235/277.md +192 -192
- package/skills/lab-flow-designer/templates//344/270/232/345/212/241/346/265/201/347/250/213/346/226/207/346/241/243/347/244/272/344/276/213.md +207 -207
- package/skills/lab-flow-designer/testing/test-processer.mjs +1240 -1240
- package/skills/lab-nocobase-flow-generator/SKILL.md +164 -164
- package/skills/lab-nocobase-flow-generator/examples/setting/350/241/250/350/216/267/345/217/226/345/244/226/351/203/250/346/234/215/345/212/241.js +70 -70
- package/skills/lab-nocobase-flow-generator/examples//346/237/245/350/257/242/345/214/226/345/255/246/345/223/201/344/277/241/346/201/257.js +30 -30
- package/skills/lab-nocobase-flow-generator/references/doc-standard.md +84 -84
- package/skills/lab-nocobase-flow-generator/references/runtime-api.md +224 -224
- package/skills/lab-nocobase-flow-generator/templates//350/204/232/346/234/254/351/200/273/350/276/221/346/226/207/346/241/243/346/250/241/346/235/277.md +121 -121
- package/skills/lab-nocobase-flow-generator/templates//350/204/232/346/234/254/351/200/273/350/276/221/346/226/207/346/241/243/347/244/272/344/276/213.md +67 -67
- package/skills/lab-orbit-component-builder/SKILL.md +353 -353
- package/skills/lab-orbit-component-builder/examples/xnb-component-template/.env.local.example +27 -27
- package/skills/lab-orbit-component-builder/examples/xnb-component-template/.eslintignore +7 -7
- package/skills/lab-orbit-component-builder/examples/xnb-component-template/.eslintrc.cjs +88 -88
- package/skills/lab-orbit-component-builder/examples/xnb-component-template/.nvmrc +1 -1
- package/skills/lab-orbit-component-builder/examples/xnb-component-template/AgenticAppAPI.md +268 -268
- package/skills/lab-orbit-component-builder/examples/xnb-component-template/Jenkinsfile +106 -106
- package/skills/lab-orbit-component-builder/examples/xnb-component-template/OrbitAPI.md +453 -453
- package/skills/lab-orbit-component-builder/examples/xnb-component-template/README.md +176 -176
- package/skills/lab-orbit-component-builder/examples/xnb-component-template/dev/public/index.html +12 -12
- package/skills/lab-orbit-component-builder/examples/xnb-component-template/dev/src/App.vue +151 -151
- package/skills/lab-orbit-component-builder/examples/xnb-component-template/dev/src/components/DevOpenerLauncher.vue +143 -143
- package/skills/lab-orbit-component-builder/examples/xnb-component-template/dev/src/global.d.ts +77 -77
- package/skills/lab-orbit-component-builder/examples/xnb-component-template/dev/src/main.ts +308 -308
- package/skills/lab-orbit-component-builder/examples/xnb-component-template/dev/src/mockXNBBitable.ts +119 -119
- package/skills/lab-orbit-component-builder/examples/xnb-component-template/dev/src/shims-vue.d.ts +6 -6
- package/skills/lab-orbit-component-builder/examples/xnb-component-template/dev/src/utils/devOpenerHost.ts +75 -75
- package/skills/lab-orbit-component-builder/examples/xnb-component-template/index.html +13 -13
- package/skills/lab-orbit-component-builder/examples/xnb-component-template/package.json +60 -60
- package/skills/lab-orbit-component-builder/examples/xnb-component-template/src/api/agenticlabTickets.ts +110 -110
- package/skills/lab-orbit-component-builder/examples/xnb-component-template/src/entries/bitable.ts +4 -4
- package/skills/lab-orbit-component-builder/examples/xnb-component-template/src/entries/custom-page.ts +4 -4
- package/skills/lab-orbit-component-builder/examples/xnb-component-template/src/index.ts +1 -1
- package/skills/lab-orbit-component-builder/examples/xnb-component-template/src/styles/orbit-quasar-host.scss +19 -19
- package/skills/lab-orbit-component-builder/examples/xnb-component-template/src/types/context.ts +15 -15
- package/skills/lab-orbit-component-builder/examples/xnb-component-template/src/types/xnb-context.ts +70 -70
- package/skills/lab-orbit-component-builder/examples/xnb-component-template/src/use/useBitablePage.ts +189 -189
- package/skills/lab-orbit-component-builder/examples/xnb-component-template/src/use/useSuperCellDemo.ts +257 -257
- package/skills/lab-orbit-component-builder/examples/xnb-component-template/src/use/useSuperTableBitableLifecycle.ts +555 -555
- package/skills/lab-orbit-component-builder/examples/xnb-component-template/src/utils/openerInitParams.ts +158 -158
- package/skills/lab-orbit-component-builder/examples/xnb-component-template/src/utils/openerTicketIds.ts +32 -32
- package/skills/lab-orbit-component-builder/examples/xnb-component-template/src/utils/orbitHttpClient.ts +110 -110
- package/skills/lab-orbit-component-builder/examples/xnb-component-template/src/utils/request.ts +92 -92
- package/skills/lab-orbit-component-builder/examples/xnb-component-template/src/views/bitable.vue +67 -67
- package/skills/lab-orbit-component-builder/examples/xnb-component-template/src/views/custom-page.vue +140 -140
- package/skills/lab-orbit-component-builder/examples/xnb-component-template/tsconfig.json +45 -45
- package/skills/lab-orbit-component-builder/examples/xnb-component-template/vite.config.ts +170 -170
- package/skills/lab-orbit-component-builder/examples/xnb-component-template/vite.dev.config.ts +58 -58
- package/skills/lab-orbit-component-builder/references/flow-document-human-ui.md +65 -65
- package/skills/lab-orbit-component-builder/references/orbit-vue-conventions.md +133 -133
- package/skills/lab-orbit-component-builder/references/pool-schema-to-columns.md +67 -67
- package/skills/lab-orbit-component-builder/references/vue-template-checklist.md +179 -179
- package/skills/lab-orbit-component-builder/references/xnb-context-vue-props.md +49 -49
- package/skills/lab-orbit-component-builder/references/xnbitable-vue-parity.md +32 -32
|
@@ -1,65 +1,65 @@
|
|
|
1
|
-
# 流程文档 → Orbit Vue 人工处理页
|
|
2
|
-
|
|
3
|
-
## 识别目标章节
|
|
4
|
-
|
|
5
|
-
在流程说明 Markdown 中,每个门控下通常存在:
|
|
6
|
-
|
|
7
|
-
- **`#### 人工处理`**(或文档约定的同级标题)
|
|
8
|
-
- **`##### 界面形态与数据绑定`**:条目化描述界面类型与按钮
|
|
9
|
-
|
|
10
|
-
示例(节选,语义对齐即可):
|
|
11
|
-
|
|
12
|
-
1. **界面类型**:超级表格
|
|
13
|
-
2. **刷新按钮**:重新获取所有数据
|
|
14
|
-
3. **检查按钮**:检查所有规则是否验证通过
|
|
15
|
-
4. **提交按钮**:检查所有数据通过后调用 AgenticLab App 接口提交
|
|
16
|
-
|
|
17
|
-
当 **界面类型** 为「超级表格」时,生成物应对齐模板中的 **`bitable.vue` + `useBitablePage` + `useSuperTableBitableLifecycle`** 能力(刷新 / 检查 / 提交);若为「自定义多区页面」等,则以 **`custom-page.vue`** 为骨架扩展,**不强行**挂载 XNBBitable。
|
|
18
|
-
|
|
19
|
-
## 样式主题与按钮(默认)
|
|
20
|
-
|
|
21
|
-
除非流程文档或用户在任务中**明确描述**了不同 UI,否则:
|
|
22
|
-
|
|
23
|
-
| 参照 | 用途 |
|
|
24
|
-
|------|------|
|
|
25
|
-
| `examples/xnb-component-template/src/views/bitable.vue` | 页面结构、工具栏、`q-btn` 属性分工 |
|
|
26
|
-
| `examples/xnb-component-template/src/styles/orbit-quasar-host.scss` | Cell 内 Quasar 主题(主色、`q-btn` 全局);**新增/调整主题只改此文件** |
|
|
27
|
-
|
|
28
|
-
| 文档按钮语义 | `q-btn` 约定 |
|
|
29
|
-
|--------------|--------------|
|
|
30
|
-
| 刷新、检查等(拉数、本地校验,不改持久化数据) | `dense outline`,**不用** `color="primary"` |
|
|
31
|
-
| 提交等(校验通过后写回 / `execution/complete`) | `color="primary" dense unelevated`,**不用** `outline` |
|
|
32
|
-
|
|
33
|
-
详见主技能 **SKILL.md** 规则 2、规则 6。
|
|
34
|
-
|
|
35
|
-
## 人工处理配置项表
|
|
36
|
-
|
|
37
|
-
流程文档常见表格列:**配置项 | 类别 | 默认值/占位 | 说明**。
|
|
38
|
-
|
|
39
|
-
| 文档配置项 | 落地建议 |
|
|
40
|
-
|------------|----------|
|
|
41
|
-
| **AppBaseUrl** | 本地/CI:`VITE_AGENTICLAB_API_URL`(见模板 `.env.local.example`);Orbit 内 HTTP 走 `orbitRequestJson` / `window.xnb.http.client.request`,基址以宿主代理为准 |
|
|
42
|
-
| **数据查询上限** | 列表请求 `limit` 默认值(如 `9000`);与 **lab-flow-designer** 列表类约定一致时注意网关上限 |
|
|
43
|
-
| **语言类型** | 影响 UI 文案语言(中/英);未给定时与团队默认一致 |
|
|
44
|
-
|
|
45
|
-
门控级 **脚本配置项**(如 StationBaseURL)属于 **后置/工站脚本**,不默认写进 Vue 页;若文档明确要求页面内调用,再在 `AgenticAppAPI` 之外单独增加 `src/api/*` 与环境变量。
|
|
46
|
-
|
|
47
|
-
## 一门控一页:多组件命名
|
|
48
|
-
|
|
49
|
-
- **一个门控**对应文档中 **一块**「人工处理」描述 → **一个独立入口组件**(`vite.config.ts` 中 `COMPONENT_MAP` 的一个 key);视图文件须为 **`src/views/<业务语义>.vue`**,**不要**把模板里的 `bitable.vue` / `custom-page.vue` 复制到用户目录当交付物(模板内文件仅作阅读参考,见 **`references/vue-template-checklist.md`**)。
|
|
50
|
-
- **多个门控**各自有人工处理 → **同一工程**下多个 `src/views/<id>.vue`,**禁止**把无关联门控硬塞进同一视图(除非文档明确要求合并)。
|
|
51
|
-
|
|
52
|
-
### 命名规则(须有业务意义)
|
|
53
|
-
|
|
54
|
-
| 来源 | 建议 |
|
|
55
|
-
|------|------|
|
|
56
|
-
| 门控 YAML `name` / `valve_id` | `views` 文件名:`process-execute-manual`;`distBaseName`:`FragmentProcessExecuteManual`(示例) |
|
|
57
|
-
| 流程名称 + 门控简称 | 避免仅用 `bitable`、`gate1` |
|
|
58
|
-
| `registrarName` | 与宿主/Book 约定一致;与 `distBaseName` 可同可异,见模板 README「命名约定」 |
|
|
59
|
-
|
|
60
|
-
生成后应在业务 README 或 Skill 输出中写明:**文档门控标题 ↔ 组件 id ↔ `registrarName` ↔ UMD 文件名**。
|
|
61
|
-
|
|
62
|
-
## 与数据池的衔接
|
|
63
|
-
|
|
64
|
-
- 人工处理页的 **主表格数据源** 通常对应门控 **primary 输入池** 的只读列表(或工单 `ticket/list` 映射后的行)。
|
|
65
|
-
- 列定义优先来自 **`pools/<池名>.md` 的 Schema 表**(见 **`pool-schema-to-columns.md`**),并与接口返回字段做映射。
|
|
1
|
+
# 流程文档 → Orbit Vue 人工处理页
|
|
2
|
+
|
|
3
|
+
## 识别目标章节
|
|
4
|
+
|
|
5
|
+
在流程说明 Markdown 中,每个门控下通常存在:
|
|
6
|
+
|
|
7
|
+
- **`#### 人工处理`**(或文档约定的同级标题)
|
|
8
|
+
- **`##### 界面形态与数据绑定`**:条目化描述界面类型与按钮
|
|
9
|
+
|
|
10
|
+
示例(节选,语义对齐即可):
|
|
11
|
+
|
|
12
|
+
1. **界面类型**:超级表格
|
|
13
|
+
2. **刷新按钮**:重新获取所有数据
|
|
14
|
+
3. **检查按钮**:检查所有规则是否验证通过
|
|
15
|
+
4. **提交按钮**:检查所有数据通过后调用 AgenticLab App 接口提交
|
|
16
|
+
|
|
17
|
+
当 **界面类型** 为「超级表格」时,生成物应对齐模板中的 **`bitable.vue` + `useBitablePage` + `useSuperTableBitableLifecycle`** 能力(刷新 / 检查 / 提交);若为「自定义多区页面」等,则以 **`custom-page.vue`** 为骨架扩展,**不强行**挂载 XNBBitable。
|
|
18
|
+
|
|
19
|
+
## 样式主题与按钮(默认)
|
|
20
|
+
|
|
21
|
+
除非流程文档或用户在任务中**明确描述**了不同 UI,否则:
|
|
22
|
+
|
|
23
|
+
| 参照 | 用途 |
|
|
24
|
+
|------|------|
|
|
25
|
+
| `examples/xnb-component-template/src/views/bitable.vue` | 页面结构、工具栏、`q-btn` 属性分工 |
|
|
26
|
+
| `examples/xnb-component-template/src/styles/orbit-quasar-host.scss` | Cell 内 Quasar 主题(主色、`q-btn` 全局);**新增/调整主题只改此文件** |
|
|
27
|
+
|
|
28
|
+
| 文档按钮语义 | `q-btn` 约定 |
|
|
29
|
+
|--------------|--------------|
|
|
30
|
+
| 刷新、检查等(拉数、本地校验,不改持久化数据) | `dense outline`,**不用** `color="primary"` |
|
|
31
|
+
| 提交等(校验通过后写回 / `execution/complete`) | `color="primary" dense unelevated`,**不用** `outline` |
|
|
32
|
+
|
|
33
|
+
详见主技能 **SKILL.md** 规则 2、规则 6。
|
|
34
|
+
|
|
35
|
+
## 人工处理配置项表
|
|
36
|
+
|
|
37
|
+
流程文档常见表格列:**配置项 | 类别 | 默认值/占位 | 说明**。
|
|
38
|
+
|
|
39
|
+
| 文档配置项 | 落地建议 |
|
|
40
|
+
|------------|----------|
|
|
41
|
+
| **AppBaseUrl** | 本地/CI:`VITE_AGENTICLAB_API_URL`(见模板 `.env.local.example`);Orbit 内 HTTP 走 `orbitRequestJson` / `window.xnb.http.client.request`,基址以宿主代理为准 |
|
|
42
|
+
| **数据查询上限** | 列表请求 `limit` 默认值(如 `9000`);与 **lab-flow-designer** 列表类约定一致时注意网关上限 |
|
|
43
|
+
| **语言类型** | 影响 UI 文案语言(中/英);未给定时与团队默认一致 |
|
|
44
|
+
|
|
45
|
+
门控级 **脚本配置项**(如 StationBaseURL)属于 **后置/工站脚本**,不默认写进 Vue 页;若文档明确要求页面内调用,再在 `AgenticAppAPI` 之外单独增加 `src/api/*` 与环境变量。
|
|
46
|
+
|
|
47
|
+
## 一门控一页:多组件命名
|
|
48
|
+
|
|
49
|
+
- **一个门控**对应文档中 **一块**「人工处理」描述 → **一个独立入口组件**(`vite.config.ts` 中 `COMPONENT_MAP` 的一个 key);视图文件须为 **`src/views/<业务语义>.vue`**,**不要**把模板里的 `bitable.vue` / `custom-page.vue` 复制到用户目录当交付物(模板内文件仅作阅读参考,见 **`references/vue-template-checklist.md`**)。
|
|
50
|
+
- **多个门控**各自有人工处理 → **同一工程**下多个 `src/views/<id>.vue`,**禁止**把无关联门控硬塞进同一视图(除非文档明确要求合并)。
|
|
51
|
+
|
|
52
|
+
### 命名规则(须有业务意义)
|
|
53
|
+
|
|
54
|
+
| 来源 | 建议 |
|
|
55
|
+
|------|------|
|
|
56
|
+
| 门控 YAML `name` / `valve_id` | `views` 文件名:`process-execute-manual`;`distBaseName`:`FragmentProcessExecuteManual`(示例) |
|
|
57
|
+
| 流程名称 + 门控简称 | 避免仅用 `bitable`、`gate1` |
|
|
58
|
+
| `registrarName` | 与宿主/Book 约定一致;与 `distBaseName` 可同可异,见模板 README「命名约定」 |
|
|
59
|
+
|
|
60
|
+
生成后应在业务 README 或 Skill 输出中写明:**文档门控标题 ↔ 组件 id ↔ `registrarName` ↔ UMD 文件名**。
|
|
61
|
+
|
|
62
|
+
## 与数据池的衔接
|
|
63
|
+
|
|
64
|
+
- 人工处理页的 **主表格数据源** 通常对应门控 **primary 输入池** 的只读列表(或工单 `ticket/list` 映射后的行)。
|
|
65
|
+
- 列定义优先来自 **`pools/<池名>.md` 的 Schema 表**(见 **`pool-schema-to-columns.md`**),并与接口返回字段做映射。
|
|
@@ -1,133 +1,133 @@
|
|
|
1
|
-
# Orbit Vue 组件编码约定
|
|
2
|
-
|
|
3
|
-
本文档定义本技能生成/修改 Orbit Vue 组件时**必须遵循**的编码模式与约定。
|
|
4
|
-
|
|
5
|
-
---
|
|
6
|
-
|
|
7
|
-
## 1. 技术栈约束
|
|
8
|
-
|
|
9
|
-
- **框架**:Vue 3.2(Composition API,`<script setup lang="ts">`)
|
|
10
|
-
- **UI 组件库**:Quasar 2.x
|
|
11
|
-
- **语言**:TypeScript 5.x(strict)
|
|
12
|
-
- **构建工具**:Vite 5
|
|
13
|
-
- **禁止使用**:`any`、`enum`、Pinia、Vuex、vue-router、Tailwind、fetch、axios
|
|
14
|
-
|
|
15
|
-
## 2. 命名约定
|
|
16
|
-
|
|
17
|
-
| 类别 | 规则 | 示例 |
|
|
18
|
-
|------|------|------|
|
|
19
|
-
| 组件 `.vue` 文件 | PascalCase 或 kebab-case(与门控 id 对齐) | `WeighingConfirm.vue`、`sample-prep.vue` |
|
|
20
|
-
| Composable 文件 | camelCase + 功能后缀 | `useSuperTableBitableLifecycle.ts` |
|
|
21
|
-
| 类型 / 接口 | PascalCase,**无 `I` 前缀** | `WeighingRow`、`SamplePrepConfig` |
|
|
22
|
-
| 常量 | UPPER_SNAKE_CASE | `SUB_TABLE_NAME`、`LIST_COLS` |
|
|
23
|
-
| 联合类型 | `type XxxKind = 'a' | 'b'` | `type DosingMethod = 'liquid' | 'neo'` |
|
|
24
|
-
| 私有函数 | `_` 前缀,不 export | `_mapTicketToRow`、`_buildSubmitPayload` |
|
|
25
|
-
| CSS 类名 | kebab-case | `.weighing-toolbar`、`.row-count` |
|
|
26
|
-
|
|
27
|
-
## 3. Singleton Composable 模式
|
|
28
|
-
|
|
29
|
-
状态 `ref` 定义在函数**外部**(模块级单例),`computed` / 方法在函数**内部**。此模式与 `useSuperTableBitableLifecycle.ts` 一致。
|
|
30
|
-
|
|
31
|
-
```typescript
|
|
32
|
-
import { ref, computed } from 'vue'
|
|
33
|
-
|
|
34
|
-
// 模块级单例状态
|
|
35
|
-
const items = ref<RowType[]>([])
|
|
36
|
-
const loading = ref(false)
|
|
37
|
-
|
|
38
|
-
export function useXxxLifecycle() {
|
|
39
|
-
const validItems = computed(() => items.value.filter(r => r.valid))
|
|
40
|
-
|
|
41
|
-
async function refreshTable(): Promise<void> {
|
|
42
|
-
loading.value = true
|
|
43
|
-
try {
|
|
44
|
-
// ...
|
|
45
|
-
} finally {
|
|
46
|
-
loading.value = false
|
|
47
|
-
}
|
|
48
|
-
}
|
|
49
|
-
|
|
50
|
-
return { items, loading, validItems, refreshTable }
|
|
51
|
-
}
|
|
52
|
-
```
|
|
53
|
-
|
|
54
|
-
**规则**:
|
|
55
|
-
- `loading` 在请求前设 `true`,在 `finally` 中设 `false`
|
|
56
|
-
- 私有函数以 `_` 前缀命名,不放入 `return`
|
|
57
|
-
|
|
58
|
-
## 4. TypeScript 纪律
|
|
59
|
-
|
|
60
|
-
- **禁止 `any`**:使用 `unknown` + 类型断言(`as XxxType`)
|
|
61
|
-
- **禁止 `enum`**:使用联合类型 `type Status = 'pending' | 'completed'`
|
|
62
|
-
- **接口名无 `I` 前缀**:`interface WeighingRow`(不是 `IWeighingRow`)
|
|
63
|
-
- **新增字段标为可选**:`newField?: string`,不删除已有字段
|
|
64
|
-
- **字段值安全转换**:从 API / 行数据取出的值先 `String()` 再做字符串操作
|
|
65
|
-
|
|
66
|
-
```typescript
|
|
67
|
-
// ✅ 正确
|
|
68
|
-
fields[field] = raw == null ? '' : String(raw)
|
|
69
|
-
|
|
70
|
-
// ❌ 错误:raw 可能是 number / null
|
|
71
|
-
fields[field] = raw.trim()
|
|
72
|
-
```
|
|
73
|
-
|
|
74
|
-
## 5. 组件编写规则
|
|
75
|
-
|
|
76
|
-
### 基本结构(最上层入口组件)
|
|
77
|
-
|
|
78
|
-
```vue
|
|
79
|
-
<template>
|
|
80
|
-
<div class="orbit-quasar-host component-name">
|
|
81
|
-
<!-- 内容 -->
|
|
82
|
-
</div>
|
|
83
|
-
</template>
|
|
84
|
-
|
|
85
|
-
<script setup lang="ts">
|
|
86
|
-
import type { XnbSuperCellContext } from '@/types/xnb-context'
|
|
87
|
-
|
|
88
|
-
// 仅最上层入口组件打印版本,子组件不需要
|
|
89
|
-
console.info(`[OrbitComponent] v${__APP_VERSION__} (skill: ${__APP_SKILL__})`)
|
|
90
|
-
|
|
91
|
-
const props = defineProps<{ xnbContext: XnbSuperCellContext }>()
|
|
92
|
-
// ...
|
|
93
|
-
</script>
|
|
94
|
-
|
|
95
|
-
<style scoped lang="scss">
|
|
96
|
-
@import '@/styles/orbit-quasar-host.scss';
|
|
97
|
-
.component-name { /* ... */ }
|
|
98
|
-
</style>
|
|
99
|
-
```
|
|
100
|
-
|
|
101
|
-
### Props
|
|
102
|
-
|
|
103
|
-
```typescript
|
|
104
|
-
defineProps<{
|
|
105
|
-
xnbContext: XnbSuperCellContext
|
|
106
|
-
title?: string
|
|
107
|
-
variant?: 'primary' | 'outline'
|
|
108
|
-
}>()
|
|
109
|
-
|
|
110
|
-
defineEmits<{ (e: 'submit', payload: unknown): void }>()
|
|
111
|
-
```
|
|
112
|
-
|
|
113
|
-
### 组件大小限制
|
|
114
|
-
|
|
115
|
-
- 单个 `.vue` 文件**不超过 600 行**
|
|
116
|
-
- 超过时按功能区块拆分为子组件,原组件保持入口职责
|
|
117
|
-
- 拆分后子组件通过 props / emits 通信,不共享模块级 ref
|
|
118
|
-
|
|
119
|
-
## 6. 样式约定
|
|
120
|
-
|
|
121
|
-
- **页面入口**(`src/views/<id>.vue`):根节点带 `orbit-quasar-host`,`<style scoped lang="scss">` 首行 `@import '@/styles/orbit-quasar-host.scss'`
|
|
122
|
-
- **子组件**:`<style scoped>` **纯 CSS**,禁止 `lang="scss"`;样式变量用 CSS 自定义属性 `var(--c-xxx)`
|
|
123
|
-
- 主题调整**优先改** `src/styles/orbit-quasar-host.scss`,不在业务 SFC 散落主题变量
|
|
124
|
-
- 使用 `:deep()` 穿透 Quasar 组件内部样式
|
|
125
|
-
|
|
126
|
-
## 7. 增量开发原则
|
|
127
|
-
|
|
128
|
-
- **增量优先**:优先修改现有文件,新增字段加到现有 interface,新函数加到现有 composable
|
|
129
|
-
- **向后兼容**:新增字段标为可选(`?`),需移除时先标记 `@deprecated`
|
|
130
|
-
- **Composable 扩展**:新增函数添加到现有 composable 的 `return {}` 中,不新建重复功能的 composable
|
|
131
|
-
- **不重新生成**:只修改需要变更的部分,不重新生成未涉及的代码段
|
|
132
|
-
- **参数兼容**:修改函数签名时用可选参数扩展,不破坏现有调用
|
|
133
|
-
- **依赖管控**:不添加新 npm 依赖,除非向用户说明原因并获得同意
|
|
1
|
+
# Orbit Vue 组件编码约定
|
|
2
|
+
|
|
3
|
+
本文档定义本技能生成/修改 Orbit Vue 组件时**必须遵循**的编码模式与约定。
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## 1. 技术栈约束
|
|
8
|
+
|
|
9
|
+
- **框架**:Vue 3.2(Composition API,`<script setup lang="ts">`)
|
|
10
|
+
- **UI 组件库**:Quasar 2.x
|
|
11
|
+
- **语言**:TypeScript 5.x(strict)
|
|
12
|
+
- **构建工具**:Vite 5
|
|
13
|
+
- **禁止使用**:`any`、`enum`、Pinia、Vuex、vue-router、Tailwind、fetch、axios
|
|
14
|
+
|
|
15
|
+
## 2. 命名约定
|
|
16
|
+
|
|
17
|
+
| 类别 | 规则 | 示例 |
|
|
18
|
+
|------|------|------|
|
|
19
|
+
| 组件 `.vue` 文件 | PascalCase 或 kebab-case(与门控 id 对齐) | `WeighingConfirm.vue`、`sample-prep.vue` |
|
|
20
|
+
| Composable 文件 | camelCase + 功能后缀 | `useSuperTableBitableLifecycle.ts` |
|
|
21
|
+
| 类型 / 接口 | PascalCase,**无 `I` 前缀** | `WeighingRow`、`SamplePrepConfig` |
|
|
22
|
+
| 常量 | UPPER_SNAKE_CASE | `SUB_TABLE_NAME`、`LIST_COLS` |
|
|
23
|
+
| 联合类型 | `type XxxKind = 'a' | 'b'` | `type DosingMethod = 'liquid' | 'neo'` |
|
|
24
|
+
| 私有函数 | `_` 前缀,不 export | `_mapTicketToRow`、`_buildSubmitPayload` |
|
|
25
|
+
| CSS 类名 | kebab-case | `.weighing-toolbar`、`.row-count` |
|
|
26
|
+
|
|
27
|
+
## 3. Singleton Composable 模式
|
|
28
|
+
|
|
29
|
+
状态 `ref` 定义在函数**外部**(模块级单例),`computed` / 方法在函数**内部**。此模式与 `useSuperTableBitableLifecycle.ts` 一致。
|
|
30
|
+
|
|
31
|
+
```typescript
|
|
32
|
+
import { ref, computed } from 'vue'
|
|
33
|
+
|
|
34
|
+
// 模块级单例状态
|
|
35
|
+
const items = ref<RowType[]>([])
|
|
36
|
+
const loading = ref(false)
|
|
37
|
+
|
|
38
|
+
export function useXxxLifecycle() {
|
|
39
|
+
const validItems = computed(() => items.value.filter(r => r.valid))
|
|
40
|
+
|
|
41
|
+
async function refreshTable(): Promise<void> {
|
|
42
|
+
loading.value = true
|
|
43
|
+
try {
|
|
44
|
+
// ...
|
|
45
|
+
} finally {
|
|
46
|
+
loading.value = false
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
return { items, loading, validItems, refreshTable }
|
|
51
|
+
}
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
**规则**:
|
|
55
|
+
- `loading` 在请求前设 `true`,在 `finally` 中设 `false`
|
|
56
|
+
- 私有函数以 `_` 前缀命名,不放入 `return`
|
|
57
|
+
|
|
58
|
+
## 4. TypeScript 纪律
|
|
59
|
+
|
|
60
|
+
- **禁止 `any`**:使用 `unknown` + 类型断言(`as XxxType`)
|
|
61
|
+
- **禁止 `enum`**:使用联合类型 `type Status = 'pending' | 'completed'`
|
|
62
|
+
- **接口名无 `I` 前缀**:`interface WeighingRow`(不是 `IWeighingRow`)
|
|
63
|
+
- **新增字段标为可选**:`newField?: string`,不删除已有字段
|
|
64
|
+
- **字段值安全转换**:从 API / 行数据取出的值先 `String()` 再做字符串操作
|
|
65
|
+
|
|
66
|
+
```typescript
|
|
67
|
+
// ✅ 正确
|
|
68
|
+
fields[field] = raw == null ? '' : String(raw)
|
|
69
|
+
|
|
70
|
+
// ❌ 错误:raw 可能是 number / null
|
|
71
|
+
fields[field] = raw.trim()
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
## 5. 组件编写规则
|
|
75
|
+
|
|
76
|
+
### 基本结构(最上层入口组件)
|
|
77
|
+
|
|
78
|
+
```vue
|
|
79
|
+
<template>
|
|
80
|
+
<div class="orbit-quasar-host component-name">
|
|
81
|
+
<!-- 内容 -->
|
|
82
|
+
</div>
|
|
83
|
+
</template>
|
|
84
|
+
|
|
85
|
+
<script setup lang="ts">
|
|
86
|
+
import type { XnbSuperCellContext } from '@/types/xnb-context'
|
|
87
|
+
|
|
88
|
+
// 仅最上层入口组件打印版本,子组件不需要
|
|
89
|
+
console.info(`[OrbitComponent] v${__APP_VERSION__} (skill: ${__APP_SKILL__})`)
|
|
90
|
+
|
|
91
|
+
const props = defineProps<{ xnbContext: XnbSuperCellContext }>()
|
|
92
|
+
// ...
|
|
93
|
+
</script>
|
|
94
|
+
|
|
95
|
+
<style scoped lang="scss">
|
|
96
|
+
@import '@/styles/orbit-quasar-host.scss';
|
|
97
|
+
.component-name { /* ... */ }
|
|
98
|
+
</style>
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
### Props
|
|
102
|
+
|
|
103
|
+
```typescript
|
|
104
|
+
defineProps<{
|
|
105
|
+
xnbContext: XnbSuperCellContext
|
|
106
|
+
title?: string
|
|
107
|
+
variant?: 'primary' | 'outline'
|
|
108
|
+
}>()
|
|
109
|
+
|
|
110
|
+
defineEmits<{ (e: 'submit', payload: unknown): void }>()
|
|
111
|
+
```
|
|
112
|
+
|
|
113
|
+
### 组件大小限制
|
|
114
|
+
|
|
115
|
+
- 单个 `.vue` 文件**不超过 600 行**
|
|
116
|
+
- 超过时按功能区块拆分为子组件,原组件保持入口职责
|
|
117
|
+
- 拆分后子组件通过 props / emits 通信,不共享模块级 ref
|
|
118
|
+
|
|
119
|
+
## 6. 样式约定
|
|
120
|
+
|
|
121
|
+
- **页面入口**(`src/views/<id>.vue`):根节点带 `orbit-quasar-host`,`<style scoped lang="scss">` 首行 `@import '@/styles/orbit-quasar-host.scss'`
|
|
122
|
+
- **子组件**:`<style scoped>` **纯 CSS**,禁止 `lang="scss"`;样式变量用 CSS 自定义属性 `var(--c-xxx)`
|
|
123
|
+
- 主题调整**优先改** `src/styles/orbit-quasar-host.scss`,不在业务 SFC 散落主题变量
|
|
124
|
+
- 使用 `:deep()` 穿透 Quasar 组件内部样式
|
|
125
|
+
|
|
126
|
+
## 7. 增量开发原则
|
|
127
|
+
|
|
128
|
+
- **增量优先**:优先修改现有文件,新增字段加到现有 interface,新函数加到现有 composable
|
|
129
|
+
- **向后兼容**:新增字段标为可选(`?`),需移除时先标记 `@deprecated`
|
|
130
|
+
- **Composable 扩展**:新增函数添加到现有 composable 的 `return {}` 中,不新建重复功能的 composable
|
|
131
|
+
- **不重新生成**:只修改需要变更的部分,不重新生成未涉及的代码段
|
|
132
|
+
- **参数兼容**:修改函数签名时用可选参数扩展,不破坏现有调用
|
|
133
|
+
- **依赖管控**:不添加新 npm 依赖,除非向用户说明原因并获得同意
|
|
@@ -1,67 +1,67 @@
|
|
|
1
|
-
# 池 Schema → XNBBitable 列(默认展示策略)
|
|
2
|
-
|
|
3
|
-
## 数据来源
|
|
4
|
-
|
|
5
|
-
流程包或业务文档中的 **`pools/<池名>.md`** 常见「Schema」表:**字段 | 字段标题 | 字段描述 | 字段类型 | …**。
|
|
6
|
-
|
|
7
|
-
人工处理超级表格的 **默认列集**应来自门控 **primary 输入池** 的该表(或流程正文中等价表格)。
|
|
8
|
-
|
|
9
|
-
## 字段类型映射(仅表格友好子集)
|
|
10
|
-
|
|
11
|
-
XNBBitable / Luckysheet 列通过 **`data_columns`** 描述(模板见 `useSuperTableBitableLifecycle.ts` 中 `dv` / `ct`)。
|
|
12
|
-
|
|
13
|
-
| 池 Schema「字段类型」 | 是否默认生成列 | `dv` / `ct` 建议 |
|
|
14
|
-
|----------------------|----------------|------------------|
|
|
15
|
-
| **text** | 是 | `dv: { type: 'text_length' }`,只读列可加 `readonly: true` |
|
|
16
|
-
| **int** / **number** | 是 | `dv: { type: 'number' }`,`ct: { fa: '0', t: 'n' }`(与模板数量列一致) |
|
|
17
|
-
| **json** | **默认否** | 数组/对象在单格展示与校验复杂;若业务必须展示,可改为 **只读字符串列**(`JSON.stringify` 摘要)或拆多列(需文档明确要求) |
|
|
18
|
-
| **bool** | 视产品支持而定 | 若不确定渲染形态,可映射为 **text**(`true`/`false`)或单独与产品确认 |
|
|
19
|
-
|
|
20
|
-
**原则**:首版交付以 **string / number** 类列为主,与「仅展示 XNBBitable 支持的类型」一致;**json** 型池字段不默认展开为多列,避免 `field` 与 `items` 展平规则不一致导致空格。
|
|
21
|
-
|
|
22
|
-
## 列头与数据键
|
|
23
|
-
|
|
24
|
-
- **`data_columns[].field`**:展示列头,建议使用 Schema 的 **「字段标题」**(或中英一致时用语义化标题)。
|
|
25
|
-
- **`items` 每行 `fields` 的键**:必须与 **`field`** 一致(见 **OrbitAPI.md** §8.4.1 / **orbit-write-js-cell** 反模式表)。
|
|
26
|
-
- 池内「字段」常为 **snake_case**(如 `source_barcode`),若接口返回 snake_case,列 `field` 可直接用该键或统一映射层;**同一表内保持一种约定**。
|
|
27
|
-
|
|
28
|
-
## 接口映射
|
|
29
|
-
|
|
30
|
-
当行数据来自 **AgenticLab `ticket/list`** 的 `detail` 对象时:
|
|
31
|
-
|
|
32
|
-
- 在 composable 中编写 **`mapTicketToRow`**,把 `detail` 中需要的键映射到上表 **`field`** 键。
|
|
33
|
-
- 未在 Schema 出现的字段默认 **不展示**(除非文档列在「界面额外列」)。
|
|
34
|
-
|
|
35
|
-
## 可编辑字段策略(readonly vs 可人工录入)
|
|
36
|
-
|
|
37
|
-
池 Schema 或流程文档中标记为「可人工录入」(或 `editable: true` / `manual_input: true` 等等效标注)的字段:
|
|
38
|
-
|
|
39
|
-
- 在 `data_columns` 中设 **`readonly: false`**,用户可在表格中直接编辑
|
|
40
|
-
- 在提交(`submitRows`)时,**仅**这些字段的修改值会被映射回 ticket `detail` 并提交
|
|
41
|
-
|
|
42
|
-
**未标记为可人工录入**的字段默认 **`readonly: true`**,用户无法在表格中编辑。
|
|
43
|
-
|
|
44
|
-
### 与提交参数的对齐
|
|
45
|
-
|
|
46
|
-
可编辑字段必须与 ticket schema 中的可写路径一一对应(如 `detail.process_params['@requested_amount_mg']`)。
|
|
47
|
-
|
|
48
|
-
`mergeEditedRowIntoAgenticTicket`(或等效合并函数)中,应**只回写可编辑字段**对应的 detail 路径,不可把 readonly 的展示列值回写覆盖原始数据。
|
|
49
|
-
|
|
50
|
-
### 自定义渲染与编辑
|
|
51
|
-
|
|
52
|
-
若池字段类型为 **json** 但用户明确要求展示:
|
|
53
|
-
- 渲染前:将 JSON 拆解为 string 摘要(如 `JSON.stringify` 或提取特定子字段)
|
|
54
|
-
- 提交时:将编辑后的 string 重新组装为原始 JSON 结构再写回 detail
|
|
55
|
-
|
|
56
|
-
此类自定义逻辑仅在用户**明确描述**时实现,默认不展开 json 字段。
|
|
57
|
-
|
|
58
|
-
## 校验(检查按钮)
|
|
59
|
-
|
|
60
|
-
校验规则**默认**从池 Schema / 流程文档的字段约束生成,除非用户明确描述更多自定义校验规则:
|
|
61
|
-
|
|
62
|
-
- **number** 列:按文档约束校验(范围、必填等);模板示例为「数量为正」,业务应替换为实际规则。
|
|
63
|
-
- **text** 列:非空、格式(条码、位置路径)等按文档实现。
|
|
64
|
-
- **必填**:Schema 中标记 `required` 或「必填」的字段,校验时检查非空/非零。
|
|
65
|
-
- **互斥/依赖**:文档描述了字段间约束关系时,在 `checkRows` 中实现对应逻辑。
|
|
66
|
-
|
|
67
|
-
`checkRows` 在 `submitRows` 之前**必须**执行,校验不通过时阻止提交。
|
|
1
|
+
# 池 Schema → XNBBitable 列(默认展示策略)
|
|
2
|
+
|
|
3
|
+
## 数据来源
|
|
4
|
+
|
|
5
|
+
流程包或业务文档中的 **`pools/<池名>.md`** 常见「Schema」表:**字段 | 字段标题 | 字段描述 | 字段类型 | …**。
|
|
6
|
+
|
|
7
|
+
人工处理超级表格的 **默认列集**应来自门控 **primary 输入池** 的该表(或流程正文中等价表格)。
|
|
8
|
+
|
|
9
|
+
## 字段类型映射(仅表格友好子集)
|
|
10
|
+
|
|
11
|
+
XNBBitable / Luckysheet 列通过 **`data_columns`** 描述(模板见 `useSuperTableBitableLifecycle.ts` 中 `dv` / `ct`)。
|
|
12
|
+
|
|
13
|
+
| 池 Schema「字段类型」 | 是否默认生成列 | `dv` / `ct` 建议 |
|
|
14
|
+
|----------------------|----------------|------------------|
|
|
15
|
+
| **text** | 是 | `dv: { type: 'text_length' }`,只读列可加 `readonly: true` |
|
|
16
|
+
| **int** / **number** | 是 | `dv: { type: 'number' }`,`ct: { fa: '0', t: 'n' }`(与模板数量列一致) |
|
|
17
|
+
| **json** | **默认否** | 数组/对象在单格展示与校验复杂;若业务必须展示,可改为 **只读字符串列**(`JSON.stringify` 摘要)或拆多列(需文档明确要求) |
|
|
18
|
+
| **bool** | 视产品支持而定 | 若不确定渲染形态,可映射为 **text**(`true`/`false`)或单独与产品确认 |
|
|
19
|
+
|
|
20
|
+
**原则**:首版交付以 **string / number** 类列为主,与「仅展示 XNBBitable 支持的类型」一致;**json** 型池字段不默认展开为多列,避免 `field` 与 `items` 展平规则不一致导致空格。
|
|
21
|
+
|
|
22
|
+
## 列头与数据键
|
|
23
|
+
|
|
24
|
+
- **`data_columns[].field`**:展示列头,建议使用 Schema 的 **「字段标题」**(或中英一致时用语义化标题)。
|
|
25
|
+
- **`items` 每行 `fields` 的键**:必须与 **`field`** 一致(见 **OrbitAPI.md** §8.4.1 / **orbit-write-js-cell** 反模式表)。
|
|
26
|
+
- 池内「字段」常为 **snake_case**(如 `source_barcode`),若接口返回 snake_case,列 `field` 可直接用该键或统一映射层;**同一表内保持一种约定**。
|
|
27
|
+
|
|
28
|
+
## 接口映射
|
|
29
|
+
|
|
30
|
+
当行数据来自 **AgenticLab `ticket/list`** 的 `detail` 对象时:
|
|
31
|
+
|
|
32
|
+
- 在 composable 中编写 **`mapTicketToRow`**,把 `detail` 中需要的键映射到上表 **`field`** 键。
|
|
33
|
+
- 未在 Schema 出现的字段默认 **不展示**(除非文档列在「界面额外列」)。
|
|
34
|
+
|
|
35
|
+
## 可编辑字段策略(readonly vs 可人工录入)
|
|
36
|
+
|
|
37
|
+
池 Schema 或流程文档中标记为「可人工录入」(或 `editable: true` / `manual_input: true` 等等效标注)的字段:
|
|
38
|
+
|
|
39
|
+
- 在 `data_columns` 中设 **`readonly: false`**,用户可在表格中直接编辑
|
|
40
|
+
- 在提交(`submitRows`)时,**仅**这些字段的修改值会被映射回 ticket `detail` 并提交
|
|
41
|
+
|
|
42
|
+
**未标记为可人工录入**的字段默认 **`readonly: true`**,用户无法在表格中编辑。
|
|
43
|
+
|
|
44
|
+
### 与提交参数的对齐
|
|
45
|
+
|
|
46
|
+
可编辑字段必须与 ticket schema 中的可写路径一一对应(如 `detail.process_params['@requested_amount_mg']`)。
|
|
47
|
+
|
|
48
|
+
`mergeEditedRowIntoAgenticTicket`(或等效合并函数)中,应**只回写可编辑字段**对应的 detail 路径,不可把 readonly 的展示列值回写覆盖原始数据。
|
|
49
|
+
|
|
50
|
+
### 自定义渲染与编辑
|
|
51
|
+
|
|
52
|
+
若池字段类型为 **json** 但用户明确要求展示:
|
|
53
|
+
- 渲染前:将 JSON 拆解为 string 摘要(如 `JSON.stringify` 或提取特定子字段)
|
|
54
|
+
- 提交时:将编辑后的 string 重新组装为原始 JSON 结构再写回 detail
|
|
55
|
+
|
|
56
|
+
此类自定义逻辑仅在用户**明确描述**时实现,默认不展开 json 字段。
|
|
57
|
+
|
|
58
|
+
## 校验(检查按钮)
|
|
59
|
+
|
|
60
|
+
校验规则**默认**从池 Schema / 流程文档的字段约束生成,除非用户明确描述更多自定义校验规则:
|
|
61
|
+
|
|
62
|
+
- **number** 列:按文档约束校验(范围、必填等);模板示例为「数量为正」,业务应替换为实际规则。
|
|
63
|
+
- **text** 列:非空、格式(条码、位置路径)等按文档实现。
|
|
64
|
+
- **必填**:Schema 中标记 `required` 或「必填」的字段,校验时检查非空/非零。
|
|
65
|
+
- **互斥/依赖**:文档描述了字段间约束关系时,在 `checkRows` 中实现对应逻辑。
|
|
66
|
+
|
|
67
|
+
`checkRows` 在 `submitRows` 之前**必须**执行,校验不通过时阻止提交。
|