@yugu-ui/flow-ui 0.0.0-stage → 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 +343 -2
- package/dist/adapter/wflow.d.ts +260 -0
- package/dist/base-ui/base-card-item.d.ts +26 -0
- package/dist/base-ui/base-card.d.ts +60 -0
- package/dist/base-ui/base-drawer.d.ts +56 -0
- package/dist/base-ui/base-modal.d.ts +43 -0
- package/dist/base-ui/yg-confirm.d.ts +79 -0
- package/dist/composables/form.d.ts +19 -0
- package/dist/config/FlowConfig.d.ts +34 -0
- package/dist/config/FlowConfigField.d.ts +12 -0
- package/dist/config/FlowConfigFlow/components/FlowIcon.d.ts +11 -0
- package/dist/config/FlowConfigFlow/components/FlowNodeCard.d.ts +7 -0
- package/dist/config/FlowConfigFlow/components/NodeConfigDrawer/index.d.ts +19 -0
- package/dist/config/FlowConfigFlow/components/NodeConfigDrawer/modules/ApproverConfig.d.ts +7 -0
- package/dist/config/FlowConfigFlow/components/NodeConfigDrawer/modules/CcConfig.d.ts +6 -0
- package/dist/config/FlowConfigFlow/components/NodeConfigDrawer/modules/ConditionConfig.d.ts +8 -0
- package/dist/config/FlowConfigFlow/components/NodeConfigDrawer/modules/StartConfig.d.ts +7 -0
- package/dist/config/FlowConfigFlow/composables/useNodeDrawer.d.ts +9 -0
- package/dist/config/FlowConfigFlow/index.d.ts +18 -0
- package/dist/config/FlowConfigMore.d.ts +12 -0
- package/dist/config/useFcCssVars.d.ts +2 -0
- package/dist/file-preview/file-preview-modal.d.ts +24 -0
- package/dist/file-preview/index.d.ts +21 -0
- package/dist/flow-list/index.d.ts +21 -0
- package/dist/flow-list/modules/FlowListGroup.d.ts +21 -0
- package/dist/flow-list/modules/FlowListItem.d.ts +21 -0
- package/dist/flow-list/types/index.d.ts +20 -0
- package/dist/index.d.ts +18 -0
- package/dist/index.js +6913 -0
- package/dist/person-selector/api/index.d.ts +4 -0
- package/dist/person-selector/composables/useOverflowTags.d.ts +13 -0
- package/dist/person-selector/composables/usePersonData.d.ts +40 -0
- package/dist/person-selector/composables/useSelection.d.ts +42 -0
- package/dist/person-selector/constants/index.d.ts +5 -0
- package/dist/person-selector/index.d.ts +21 -0
- package/dist/person-selector/types/index.d.ts +35 -0
- package/dist/person-selector/utils/index.d.ts +5 -0
- package/dist/provider/index.d.ts +25 -0
- package/dist/provider/key.d.ts +4 -0
- package/dist/provider/types.d.ts +68 -0
- package/dist/style.css +2430 -0
- package/dist/timeline/ApprovalModal.d.ts +47 -0
- package/dist/timeline/FlowAvatar.d.ts +11 -0
- package/dist/timeline/FlowLayout.d.ts +42 -0
- package/dist/timeline/FlowNode.d.ts +103 -0
- package/dist/timeline/flowUserKey.d.ts +18 -0
- package/dist/timeline/types.d.ts +9 -0
- package/dist/utils/common.d.ts +4 -0
- package/package.json +56 -4
package/README.md
CHANGED
|
@@ -1,3 +1,344 @@
|
|
|
1
|
-
#
|
|
1
|
+
# @yugu-ui/flow-ui
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
ygmops 工作流 UI 组件库(Vue 3 + naive-ui),提供流程列表、流程设计器、审批时间线三大能力:
|
|
4
|
+
|
|
5
|
+
| 组件 | 用途 |
|
|
6
|
+
| --- | --- |
|
|
7
|
+
| `FlowList` | 流程分组卡片列表(浏览 / 发起 / 设计入口) |
|
|
8
|
+
| `FlowConfig` / `FlowConfigField` / `FlowConfigMore` | 流程设计器(字段配置 / 流程画布 / 更多设置 三页签) |
|
|
9
|
+
| `FlowLayout` / `FlowNode` / `ApprovalModal` | 审批时间线(审批详情 `display` 模式 / 发起流程 `form` 模式) |
|
|
10
|
+
| `PersonSelector` | 人员 / 部门 / 角色选择器 |
|
|
11
|
+
| `createFlowUI` / `useFlowUI` | 全局注入协议(请求能力、人员选择接口、能力组件) |
|
|
12
|
+
|
|
13
|
+
ESM-only,附带完整 TypeScript 类型(`dist/index.d.ts`)。
|
|
14
|
+
|
|
15
|
+
## 环境要求
|
|
16
|
+
|
|
17
|
+
- Node.js >= 20.19.0
|
|
18
|
+
- Vue >= 3.3.0
|
|
19
|
+
- naive-ui >= 2.40.0
|
|
20
|
+
|
|
21
|
+
## 安装
|
|
22
|
+
|
|
23
|
+
```bash
|
|
24
|
+
pnpm add @yugu-ui/flow-ui
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
`dayjs` 为普通依赖,随本包自动安装。以下 peer 依赖需宿主工程自行提供(通常已有):
|
|
28
|
+
|
|
29
|
+
| 包 | 版本要求 | 说明 |
|
|
30
|
+
| --- | --- | --- |
|
|
31
|
+
| `vue` | >= 3.3.0 | |
|
|
32
|
+
| `naive-ui` | >= 2.40.0 | 组件均基于其主题体系与基础组件 |
|
|
33
|
+
| `@antv/x6` | >= 3.1.0 | 仅流程画布用到(`FlowConfig`) |
|
|
34
|
+
| `@antv/x6-vue-shape` | >= 3.0.0 | 仅流程画布用到(`FlowConfig`) |
|
|
35
|
+
|
|
36
|
+
```bash
|
|
37
|
+
pnpm add vue naive-ui @antv/x6 @antv/x6-vue-shape
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
### 文件预览(可选)
|
|
41
|
+
|
|
42
|
+
流程节点附件预览支持图片、视频与 office 文档。图片 / 视频开箱即用;**pdf / docx / excel / pptx** 依赖 `@vue-office/*` 按需动态加载:
|
|
43
|
+
|
|
44
|
+
```bash
|
|
45
|
+
# 按需安装需要的格式即可
|
|
46
|
+
pnpm add @vue-office/pdf @vue-office/docx @vue-office/excel @vue-office/pptx
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
未安装时文档类预览自动降级为「不支持预览该文件,请下载后查看」并保留下载按钮,不影响其他功能。
|
|
50
|
+
|
|
51
|
+
> 生产部署提示:文档类预览的文件 URL 若属于 `https://download.yugu8.com` 域,会被改写为 `/download-proxy/...` 同域路径以规避跨域。dev 环境由 vite proxy 转发,**生产环境需在 nginx 配置同名 `/download-proxy` 反向代理**。
|
|
52
|
+
|
|
53
|
+
## 快速开始
|
|
54
|
+
|
|
55
|
+
### 1. 引入样式(一次即可)
|
|
56
|
+
|
|
57
|
+
```ts
|
|
58
|
+
// main.ts
|
|
59
|
+
import '@yugu-ui/flow-ui/style.css';
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
`style.css` 包含 UnoCSS 工具类产物与全部组件样式,一次引入即完整,无需额外配置。
|
|
63
|
+
|
|
64
|
+
> **引入顺序要求**:包样式中含通用工具类(如 `.hidden` 等 UnoCSS 产物)。请确保 `import '@yugu-ui/flow-ui/style.css'` 位于宿主自身的 UnoCSS 入口(`import 'uno.css'`)与全局样式**之前**——第三方库样式先注入、宿主规则后注入,否则同名类会以同优先级「后到覆盖」宿主规则(例如宿主页面的 `hidden xl:block` 响应式显隐可能失效)。
|
|
65
|
+
|
|
66
|
+
### 2. 注入 createFlowUI
|
|
67
|
+
|
|
68
|
+
包内组件的请求能力、人员选择接口均从注入协议获取。在 `NConfigProvider` **之内**(应用根组件)完成安装:
|
|
69
|
+
|
|
70
|
+
```ts
|
|
71
|
+
// main.ts
|
|
72
|
+
import { createFlowUI } from '@yugu-ui/flow-ui';
|
|
73
|
+
import { request } from '@/service'; // 宿主的请求封装
|
|
74
|
+
import { getAuthorization } from '@/service/request/helpers';
|
|
75
|
+
import FileUpload from '@/components/custom/file-upload.vue'; // 附件上传组件(能力注入)
|
|
76
|
+
|
|
77
|
+
const app = createApp(App);
|
|
78
|
+
|
|
79
|
+
app.use(
|
|
80
|
+
createFlowUI({
|
|
81
|
+
/** 必填:请求函数(平面函数式),约定签名 (config) => Promise<{ data, error }> */
|
|
82
|
+
request,
|
|
83
|
+
/** 返回完整 Authorization 头值(含 scheme 前缀),缺省返回空串 */
|
|
84
|
+
getToken: () => getAuthorization() ?? '',
|
|
85
|
+
/** 接口 baseURL,缺省空串(走相对路径) */
|
|
86
|
+
baseURL: import.meta.env.VITE_SERVICE_BASE_URL,
|
|
87
|
+
/** 人员选择接口,缺省 GET /system/person-selector */
|
|
88
|
+
// personSelectorApi: '/system/person-selector',
|
|
89
|
+
/** 能力组件注入:包内附件上传场景动态消费 */
|
|
90
|
+
components: { FileUpload }
|
|
91
|
+
})
|
|
92
|
+
);
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
所有配置项均可通过 `useFlowUI()` 在 setup 上下文中读取;未注入时组件发出一次 DEV 告警并降级运行(请求走 error 分支),不会抛错阻断渲染。
|
|
96
|
+
|
|
97
|
+
### 3. 使用 FlowList
|
|
98
|
+
|
|
99
|
+
`FlowList` 数据完全由外部传入(分组接口为宿主自有),典型接入:
|
|
100
|
+
|
|
101
|
+
```vue
|
|
102
|
+
<script setup lang="ts">
|
|
103
|
+
import { ref } from 'vue';
|
|
104
|
+
import { useRouter } from 'vue-router';
|
|
105
|
+
import { FlowList } from '@yugu-ui/flow-ui';
|
|
106
|
+
import type { FlowGroup, FlowItem } from '@yugu-ui/flow-ui';
|
|
107
|
+
import { fetchGetWflowCenter } from '@/service/api'; // 宿主分组列表接口
|
|
108
|
+
|
|
109
|
+
const router = useRouter();
|
|
110
|
+
const groups = ref<FlowGroup[]>([]);
|
|
111
|
+
|
|
112
|
+
/** 后端返回结构映射为 FlowGroup[] */
|
|
113
|
+
async function fetchCenter() {
|
|
114
|
+
const { data, error } = await fetchGetWflowCenter();
|
|
115
|
+
if (!error && data) {
|
|
116
|
+
groups.value = data.map(group => ({
|
|
117
|
+
id: String(group.id),
|
|
118
|
+
title: group.name ?? '',
|
|
119
|
+
items: (group.flows ?? []).map(flow => ({
|
|
120
|
+
id: String(flow.id),
|
|
121
|
+
code: flow.code || '',
|
|
122
|
+
name: flow.name ?? '',
|
|
123
|
+
icon: flow.icon || '' // 图标图片 URL,为空时卡片兜底默认图标
|
|
124
|
+
}))
|
|
125
|
+
}));
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
fetchCenter();
|
|
129
|
+
|
|
130
|
+
function handleItemClick(item: FlowItem) {
|
|
131
|
+
// 点击流程卡片:跳转发起流程页等
|
|
132
|
+
console.log('item-click', item);
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
function handleDesign(item: FlowItem) {
|
|
136
|
+
// 点击设计按钮:跳转设计页
|
|
137
|
+
router.push({ path: '/business-config/flow-design', query: { id: item.id, name: item.name } });
|
|
138
|
+
}
|
|
139
|
+
</script>
|
|
140
|
+
|
|
141
|
+
<template>
|
|
142
|
+
<FlowList :groups="groups" @item-click="handleItemClick" @design="handleDesign" />
|
|
143
|
+
</template>
|
|
144
|
+
```
|
|
145
|
+
|
|
146
|
+
## 主题要求(重要)
|
|
147
|
+
|
|
148
|
+
所有组件的配色变量(`--fc-*` / `--fl-*`)在运行时从 naive-ui `useThemeVars()` 读取,经组件根节点 `:style` 注入。因此:
|
|
149
|
+
|
|
150
|
+
1. **组件必须渲染在 `<n-config-provider>` 作用域之内**,否则拿不到主题变量(静态 CSS 中变量只有使用、没有定义);
|
|
151
|
+
2. 变量跟随宿主主题自动切换,**暗黑模式无需任何额外处理**;
|
|
152
|
+
3. 宿主无需手动定义任何 `--fc-*` / `--fl-*` 变量。
|
|
153
|
+
|
|
154
|
+
## 全局提示依赖 window.\$message
|
|
155
|
+
|
|
156
|
+
组件内部的轻提示(提交成功、校验告警等)统一调用 `window.$message`(naive-ui Message API)。宿主需在应用初始化时挂载,例如在 `NMessageProvider` 作用域内:
|
|
157
|
+
|
|
158
|
+
```ts
|
|
159
|
+
// app-provider.vue
|
|
160
|
+
import { useMessage } from 'naive-ui';
|
|
161
|
+
window.$message = useMessage();
|
|
162
|
+
```
|
|
163
|
+
|
|
164
|
+
未挂载时提示静默跳过(内部均为可选链调用),功能不受影响。
|
|
165
|
+
|
|
166
|
+
## 组件 API
|
|
167
|
+
|
|
168
|
+
### FlowList — 流程列表
|
|
169
|
+
|
|
170
|
+
```ts
|
|
171
|
+
interface Props {
|
|
172
|
+
/** 分组数据(必填) */
|
|
173
|
+
groups: FlowGroup[];
|
|
174
|
+
/** 是否展示卡片右下角「设计」操作,默认 true */
|
|
175
|
+
showActions?: boolean;
|
|
176
|
+
/** 卡片是否可点击(item-click 生效),默认 false */
|
|
177
|
+
clickable?: boolean;
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
interface Emits {
|
|
181
|
+
/** 点击流程卡片(clickable=true 时) */
|
|
182
|
+
itemClick: [item: FlowItem];
|
|
183
|
+
/** 点击「设计」按钮 */
|
|
184
|
+
design: [item: FlowItem];
|
|
185
|
+
}
|
|
186
|
+
```
|
|
187
|
+
|
|
188
|
+
```ts
|
|
189
|
+
// 数据类型
|
|
190
|
+
interface FlowItem {
|
|
191
|
+
id: string; // 唯一标识
|
|
192
|
+
code?: string; // 流程编码
|
|
193
|
+
name: string; // 流程名称
|
|
194
|
+
icon?: string; // 图标图片 URL
|
|
195
|
+
}
|
|
196
|
+
interface FlowGroup {
|
|
197
|
+
id: string; // 唯一标识
|
|
198
|
+
title: string; // 分组标题
|
|
199
|
+
items: FlowItem[]; // 组内流程项
|
|
200
|
+
}
|
|
201
|
+
```
|
|
202
|
+
|
|
203
|
+
### FlowLayout — 审批时间线
|
|
204
|
+
|
|
205
|
+
页面级组件,底部自带确认 / 关闭操作区。
|
|
206
|
+
|
|
207
|
+
```ts
|
|
208
|
+
interface Props {
|
|
209
|
+
/** 页面加载状态(控制内容区 loading 遮罩) */
|
|
210
|
+
loading?: boolean;
|
|
211
|
+
/** 流程 ID:display 模式传流程实例 ID(仅作标识);form 模式作为提交数据 flow_id */
|
|
212
|
+
flowId?: string | number;
|
|
213
|
+
/** display=审批详情(同意/驳回);form=发起流程(自选审批人为选择器、底部提交)。默认 display */
|
|
214
|
+
mode?: 'display' | 'form';
|
|
215
|
+
/** form 模式提交前置校验钩子:返回 false 阻止提交(页面注入表单必填校验) */
|
|
216
|
+
beforeSubmit?: () => Promise<boolean> | boolean;
|
|
217
|
+
/** form 模式提交数据获取钩子:校验全部通过后调用,返回页面表单数据 */
|
|
218
|
+
getFormData?: () => Record<string, unknown>;
|
|
219
|
+
/** display 模式原始数据:直接传待办详情接口返回数据,组件内部映射为审批时间线 */
|
|
220
|
+
timelineData?: Pick<WflowTodoDetail, 'nodes' | 'finished' | 'status' | 'undo_id' | 'undo_finished'>;
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
interface Emits {
|
|
224
|
+
/** 审批同意/驳回接口调用成功:通知页面刷新详情 */
|
|
225
|
+
success: [];
|
|
226
|
+
/** 点击关闭按钮:display=关闭详情页,form=取消发起 */
|
|
227
|
+
close: [];
|
|
228
|
+
/** form 模式流程提交成功 */
|
|
229
|
+
submitted: [];
|
|
230
|
+
}
|
|
231
|
+
```
|
|
232
|
+
|
|
233
|
+
**`submitted` / `close` 回调关页签说明**:组件已与路由和页签机制解耦,提交成功(`submitted`)与关闭(`close`)时只通知消费页,**当前页签的关闭 / 跳转由宿主自行处理**:
|
|
234
|
+
|
|
235
|
+
```vue
|
|
236
|
+
<template>
|
|
237
|
+
<FlowLayout
|
|
238
|
+
mode="form"
|
|
239
|
+
:flow-id="flowId"
|
|
240
|
+
:before-submit="validateForm"
|
|
241
|
+
:get-form-data="getFormData"
|
|
242
|
+
@submitted="handleSubmitted"
|
|
243
|
+
@close="handleClose"
|
|
244
|
+
/>
|
|
245
|
+
</template>
|
|
246
|
+
|
|
247
|
+
<script setup lang="ts">
|
|
248
|
+
// 组件内部已 toast「流程提交成功」,页面只需收尾:
|
|
249
|
+
function handleSubmitted() {
|
|
250
|
+
router.back();
|
|
251
|
+
// 或接入宿主页签机制,如 tabStore.removeTab(route.fullPath)
|
|
252
|
+
}
|
|
253
|
+
function handleClose() {
|
|
254
|
+
router.back();
|
|
255
|
+
}
|
|
256
|
+
</script>
|
|
257
|
+
```
|
|
258
|
+
|
|
259
|
+
`display` 模式接入示例(审批详情页):
|
|
260
|
+
|
|
261
|
+
```vue
|
|
262
|
+
<FlowLayout
|
|
263
|
+
:loading="loading"
|
|
264
|
+
:flow-id="instanceId"
|
|
265
|
+
:timeline-data="detail ?? undefined"
|
|
266
|
+
@success="getDetail"
|
|
267
|
+
/>
|
|
268
|
+
```
|
|
269
|
+
|
|
270
|
+
### FlowConfig — 流程设计器
|
|
271
|
+
|
|
272
|
+
```ts
|
|
273
|
+
interface Props {
|
|
274
|
+
flowName?: string;
|
|
275
|
+
/** 初始页签:'form' | 'flow' | 'more' */
|
|
276
|
+
activeTab?: 'form' | 'flow' | 'more';
|
|
277
|
+
/** 回显数据:此前保存打印的 { fields, flow, more } 结构,flow 为嵌套子节点链(链首 start 节点) */
|
|
278
|
+
data?: Record<string, any> | null;
|
|
279
|
+
/** 父组件保存落库中(保存按钮联动 loading,publish 后由父组件回传状态) */
|
|
280
|
+
publishing?: boolean;
|
|
281
|
+
/** 外部流程标识:1=隐藏内置配置项,0=展示全部(缺省默认) */
|
|
282
|
+
isExternal?: 0 | 1;
|
|
283
|
+
}
|
|
284
|
+
|
|
285
|
+
interface Emits {
|
|
286
|
+
formChange: [data: any];
|
|
287
|
+
flowChange: [data: any];
|
|
288
|
+
moreChange: [data: any];
|
|
289
|
+
/** 保存:携带完整 { fields, flow, more },父组件负责落库并将结果回传 publishing */
|
|
290
|
+
publish: [data: { fields: unknown[]; flow: Record<string, unknown>; more: Record<string, unknown> }];
|
|
291
|
+
}
|
|
292
|
+
```
|
|
293
|
+
|
|
294
|
+
## 其他导出
|
|
295
|
+
|
|
296
|
+
- **接口层**(wflow 协议内置实现):`fetchGetWflowConfigDetail`、`fetchGetWflowFlowNodes`、`fetchLaunchWflowFlow`、`fetchWflowUndoApprove`、`fetchWflowUndoReject`,配套 `WflowConfigDetail`、`WflowFlowLaunchParams`、`WflowTodoDetail` 等类型;
|
|
297
|
+
- **人员选择器**:`PersonSelector` 组件及 `SelectedItem`、`PersonSelectorData` 等类型;
|
|
298
|
+
- **注入协议**:`createFlowUI`、`useFlowUI`、`FLOW_UI_KEY` 及 `FlowUIOptions`、`FlowUIRequest` 等类型;
|
|
299
|
+
- **审批时间线类型**:`FlowNodeItem`、`FlowNodeStatus`、`UploadResource` 等。
|
|
300
|
+
|
|
301
|
+
## Tree-shaking
|
|
302
|
+
|
|
303
|
+
纯 ESM 产物,`sideEffects` 仅声明 CSS。各组件按需引入即可裁剪:
|
|
304
|
+
|
|
305
|
+
- 仅使用 `FlowList` 时,包代码约 **7.8 kB**(gzip 后约 2 kB),`@antv/x6`(流程画布引擎)整体摇除,naive-ui 仅保留列表用到的少量组件;
|
|
306
|
+
- 全量引入(含设计器)时包代码约 260 kB(gzip 后约 68 kB)。
|
|
307
|
+
|
|
308
|
+
> 注:默认 tree-shaking 配置下 external 依赖(如 `@antv/x6`)可能残留 bare import 语句(模块副作用保守保留,属标准行为,不影响运行);如需严格摇除,可在消费方构建配置中启用 `treeshake: { moduleSideEffects: 'no-external' }`。
|
|
309
|
+
|
|
310
|
+
## 维护与版本约定
|
|
311
|
+
|
|
312
|
+
### 版本策略(SemVer)
|
|
313
|
+
|
|
314
|
+
| 变更类型 | 版本号 | 示例 |
|
|
315
|
+
| --- | --- | --- |
|
|
316
|
+
| Bug 修复、样式微调、类型修正 | patch(0.1.x) | 修复条件分支节点回显丢失 |
|
|
317
|
+
| 组件增强、新增 Props / Emits / 导出、可选依赖能力 | minor(0.x.0) | FlowList 新增 `loading` prop;新增 `FlowStep` 组件 |
|
|
318
|
+
| 破坏性变更:删除/改名导出、Props 语义变化、注入协议结构变化、样式类名契约变化 | major(x.0.0) | `createFlowUI` 协议字段调整;`submitted` 事件语义变化 |
|
|
319
|
+
|
|
320
|
+
- minor 及以下升级宿主可直接跟进;**major 升级前必读本 CHANGELOG 的「迁移必读」**;
|
|
321
|
+
- 当前处于 0.x 阶段:minor 亦可能包含破坏性变更(SemVer 惯例),0.x 期间每次升级均需浏览 CHANGELOG。
|
|
322
|
+
|
|
323
|
+
### 发版流程
|
|
324
|
+
|
|
325
|
+
1. 包目录(`packages/flow-ui`)修改代码 → `pnpm build` 产出 dist;
|
|
326
|
+
2. 按「版本策略」更新 `package.json` version,并在 `CHANGELOG.md` 顶部追加对应版本条目(含迁移必读,若有);
|
|
327
|
+
3. `npm pack --dry-run` 核对发布内容(应只含 dist 与 manifest);
|
|
328
|
+
4. 发布:`pnpm publish`(publishConfig 已定稿公共 npm——`registry.npmjs.org` + `access: public`,沿 `@yugu-ui/ui` 惯例;登录 `npm login` 与发布均在用户终端执行,首次发布需账号拥有 `@yugu-ui` scope,即用户现有组织);
|
|
329
|
+
5. 宿主工程验证:安装新版本后跑流程设置 / 发起流程 / 待办详情三个冒烟页。
|
|
330
|
+
|
|
331
|
+
### 宿主升级流程(ygmops_pc)
|
|
332
|
+
|
|
333
|
+
1. 查看本包 CHANGELOG,确认无破坏性变更(或按迁移必读调整消费页);
|
|
334
|
+
2. `packages/flow-ui` 内开发期间宿主以 `workspace:*` 直链源码包(dist 需先行 build);
|
|
335
|
+
3. 升级后运行 `pnpm install` 刷新链接,重点回归:B1 列表渲染、B5 表单提交链路、B9 关页签承接(详见包内 IMPLEMENTATION.md 附录 B)。
|
|
336
|
+
|
|
337
|
+
### 跨应用复用路线
|
|
338
|
+
|
|
339
|
+
本包定位为集团内多应用共享的工作流 UI 层,后续按需接入:
|
|
340
|
+
|
|
341
|
+
- **ygmplt**(平台端):预计首先复用 `FlowConfig` 设计器(流程模板管理场景);
|
|
342
|
+
- **ygmtms** / **ygmwms**:复用 `FlowList` + `FlowLayout`(发起与审批场景)。
|
|
343
|
+
|
|
344
|
+
接入步骤:目标应用安装本包 → 按 README「快速开始」完成 style.css 引入与 `createFlowUI` 注入(传各自工程的 request/getToken/FileUpload)→ 在 `<n-config-provider>` 作用域内使用组件。各应用仅需保证注入协议兼容,包内不携带任何宿主专属逻辑。
|
|
@@ -0,0 +1,260 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 工作流(wflow)adapter:包内组件用到的 5 个接口。
|
|
3
|
+
* ⚠️ URL 前缀规则:注入 request 的 baseURL 已包含 `/ygm/api/ygmpc`,
|
|
4
|
+
* 后端文档里的 `/ygmpc/wflow/*` 在此只写 `/wflow/*`;
|
|
5
|
+
* tenant_no / operator 由注入 request(宿主实例)自动填充,无需传递。
|
|
6
|
+
*/
|
|
7
|
+
/** 流程配置详情 */
|
|
8
|
+
export interface WflowConfigDetail {
|
|
9
|
+
id: number;
|
|
10
|
+
code?: string;
|
|
11
|
+
name?: string;
|
|
12
|
+
group_id?: string;
|
|
13
|
+
icon?: string;
|
|
14
|
+
status?: number;
|
|
15
|
+
version?: number;
|
|
16
|
+
created_at?: number | null;
|
|
17
|
+
updated_at?: number | null;
|
|
18
|
+
/** 设计器整份 JSON({ fields, flow, more }),原样回显 */
|
|
19
|
+
config?: Record<string, unknown>;
|
|
20
|
+
/** 外部流程标识:0=非外部展示全部配置项(缺省默认),1=外部默认隐藏内置配置 */
|
|
21
|
+
isExternal?: number;
|
|
22
|
+
}
|
|
23
|
+
/** 获取流程配置详情(GET /wflow/config/{config_id}) */
|
|
24
|
+
export declare function fetchGetWflowConfigDetail(configId: number): Promise<import('..').FlowUIResponse<WflowConfigDetail>>;
|
|
25
|
+
/** 流程节点请求参数:form 为整份表单数据(后端按表单值匹配条件分支);tenant_no/initor_id/initor_name 后端自动取当前登录租户/用户,无需传递 */
|
|
26
|
+
export interface WflowFlowNodesParams {
|
|
27
|
+
flow_id: number;
|
|
28
|
+
form: Record<string, unknown>;
|
|
29
|
+
}
|
|
30
|
+
/** 流程节点(form 发起模式:接口不返回 end 结束节点,前端渲染时自行追加) */
|
|
31
|
+
export interface WflowFlowNode {
|
|
32
|
+
type: 'start' | 'approver' | 'cc';
|
|
33
|
+
name: string;
|
|
34
|
+
/** 节点描述(如"发起人自选") */
|
|
35
|
+
desc?: string;
|
|
36
|
+
/** 审批方式:sequence=依次审批 countersign=会签 orsign=或签(type=approver 时有值) */
|
|
37
|
+
mode?: 'sequence' | 'countersign' | 'orsign';
|
|
38
|
+
/** 发起人自选审批人节点 */
|
|
39
|
+
selfSelect?: boolean;
|
|
40
|
+
/** 节点人员(id 为人员主键,name 为展示名;提交发起时原样回传) */
|
|
41
|
+
users: Array<{
|
|
42
|
+
id: number;
|
|
43
|
+
name: string;
|
|
44
|
+
}>;
|
|
45
|
+
}
|
|
46
|
+
/** 获取流程节点响应:nodes 按执行顺序排列,供发起页时间线渲染 */
|
|
47
|
+
export interface WflowFlowNodesResult {
|
|
48
|
+
flow_id: number;
|
|
49
|
+
flow_name?: string;
|
|
50
|
+
nodes: WflowFlowNode[];
|
|
51
|
+
}
|
|
52
|
+
/** 获取流程节点(POST /wflow/flow/nodes:整份表单数据 + 流程 ID,后端按表单值匹配条件分支得到节点链) */
|
|
53
|
+
export declare function fetchGetWflowFlowNodes(data: WflowFlowNodesParams): Promise<import('..').FlowUIResponse<WflowFlowNodesResult>>;
|
|
54
|
+
/** 发起流程请求参数(tenant_no 后端自动取当前登录租户无需传递) */
|
|
55
|
+
export interface WflowFlowLaunchParams {
|
|
56
|
+
flow_id: number;
|
|
57
|
+
/** 表单业务数据(透传存储,不强约束) */
|
|
58
|
+
form: Record<string, unknown>;
|
|
59
|
+
/** 完整流程节点数组(start/approver/cc,不含 end 结束节点,发起页时间线整份回传) */
|
|
60
|
+
nodes: Array<{
|
|
61
|
+
type: 'start' | 'approver' | 'cc';
|
|
62
|
+
name: string;
|
|
63
|
+
desc?: string;
|
|
64
|
+
/** 审批方式:sequence=依次审批 countersign=会签 orsign=或签(type=approver 时有值) */
|
|
65
|
+
mode?: 'sequence' | 'countersign' | 'orsign';
|
|
66
|
+
/** 发起人自选审批人节点 */
|
|
67
|
+
selfSelect?: boolean;
|
|
68
|
+
/** 节点处理人(id 为人员主键,自选节点为字符串;name 为展示名) */
|
|
69
|
+
users: Array<{
|
|
70
|
+
type?: string;
|
|
71
|
+
id?: number | string;
|
|
72
|
+
name?: string;
|
|
73
|
+
}>;
|
|
74
|
+
}>;
|
|
75
|
+
}
|
|
76
|
+
/** 发起流程结果:创建成功的流程实例与当前待办节点 */
|
|
77
|
+
export interface WflowFlowLaunchResult {
|
|
78
|
+
instance_id: number;
|
|
79
|
+
flow_id: number;
|
|
80
|
+
flow_name?: string;
|
|
81
|
+
/** 流程标题(取自表单 reason 等) */
|
|
82
|
+
title?: string;
|
|
83
|
+
/** 流程状态:1 审批中 */
|
|
84
|
+
status?: number;
|
|
85
|
+
/** 当前待办节点 ID */
|
|
86
|
+
node_id?: string;
|
|
87
|
+
/** 当前待办节点名称 */
|
|
88
|
+
node_name?: string;
|
|
89
|
+
}
|
|
90
|
+
/** 发起流程(POST /wflow/flow/launch:创建流程实例与首个审批节点任务) */
|
|
91
|
+
export declare function fetchLaunchWflowFlow(data: WflowFlowLaunchParams): Promise<import('..').FlowUIResponse<WflowFlowLaunchResult>>;
|
|
92
|
+
/** 待办详情-表单字段定义(渲染只读表单) */
|
|
93
|
+
export interface WflowTodoField {
|
|
94
|
+
/** 字段标签 */
|
|
95
|
+
label: string;
|
|
96
|
+
/** 字段 key */
|
|
97
|
+
key: string;
|
|
98
|
+
/** 是否为条件字段 */
|
|
99
|
+
condition?: boolean;
|
|
100
|
+
/** 条件字段控件类型,如 select */
|
|
101
|
+
conditionType?: string;
|
|
102
|
+
/** 是否在列表展示 */
|
|
103
|
+
list?: boolean;
|
|
104
|
+
/** 选项列表 */
|
|
105
|
+
options?: Array<{
|
|
106
|
+
label: string;
|
|
107
|
+
value: string;
|
|
108
|
+
}>;
|
|
109
|
+
}
|
|
110
|
+
/** 待办详情-流程节点快照(时间线渲染;节点自带任务状态与每人处理结果) */
|
|
111
|
+
export interface WflowTodoNode {
|
|
112
|
+
/** 节点 ID */
|
|
113
|
+
node_id: string;
|
|
114
|
+
/** 节点名称 */
|
|
115
|
+
name: string;
|
|
116
|
+
/** 节点类型:start/approver/cc */
|
|
117
|
+
type: 'start' | 'approver' | 'cc';
|
|
118
|
+
/** 节点描述 */
|
|
119
|
+
desc?: string | null;
|
|
120
|
+
/** 审批方式:sequence=依次审批 countersign=会签 orsign=或签(type=approver 时有值) */
|
|
121
|
+
mode?: 'sequence' | 'countersign' | 'orsign';
|
|
122
|
+
/** 是否发起人自选 */
|
|
123
|
+
selfSelect?: boolean;
|
|
124
|
+
/** 节点处理时间(毫秒时间戳) */
|
|
125
|
+
created_time?: number;
|
|
126
|
+
/** 节点总成员数(start/cc 节点无任务为 0) */
|
|
127
|
+
member_count?: number;
|
|
128
|
+
/** 未完成数 */
|
|
129
|
+
un_complete_num?: number;
|
|
130
|
+
/** 已同意数 */
|
|
131
|
+
agree_num?: number;
|
|
132
|
+
/** 是否会签:0 否 1 是 */
|
|
133
|
+
counter_sign?: number;
|
|
134
|
+
/** 任务状态:1 待处理(start/cc 节点无任务为 0;status=1 的 approver 节点即当前待处理节点) */
|
|
135
|
+
status?: number;
|
|
136
|
+
/** 节点是否已完成:0 否 1 是(start/cc 节点无任务为 0) */
|
|
137
|
+
finished?: number;
|
|
138
|
+
/** 认领时间(毫秒时间戳,未认领为 null) */
|
|
139
|
+
claim_time?: number | null;
|
|
140
|
+
/** 节点处理人列表(只含 id/name 身份信息,具体操作在 records 内) */
|
|
141
|
+
users: Array<{
|
|
142
|
+
/** 人员主键 */
|
|
143
|
+
id?: number;
|
|
144
|
+
/** 姓名 */
|
|
145
|
+
name: string;
|
|
146
|
+
/** 该用户在该节点上的全部审批/抄送处理记录(按处理时间倒序) */
|
|
147
|
+
records?: WflowTodoRecord[];
|
|
148
|
+
}>;
|
|
149
|
+
}
|
|
150
|
+
/** 待办详情-处理记录 */
|
|
151
|
+
export interface WflowTodoRecord {
|
|
152
|
+
/** 记录 ID */
|
|
153
|
+
id: number;
|
|
154
|
+
/** 记录类型 */
|
|
155
|
+
type?: number;
|
|
156
|
+
/** 处理结果 */
|
|
157
|
+
result?: number;
|
|
158
|
+
/** 是否已处理:1 是 */
|
|
159
|
+
finished?: number;
|
|
160
|
+
/** 处理时间(毫秒时间戳) */
|
|
161
|
+
assertion_time?: number;
|
|
162
|
+
/** 审批意见 */
|
|
163
|
+
suggest?: string;
|
|
164
|
+
/** 是否驳回:0 否 1 是 */
|
|
165
|
+
is_reject?: number;
|
|
166
|
+
/** 审批附件(CDN 文件记录:original_filename 原始文件名 / file_name 存储文件名 / url 访问地址) */
|
|
167
|
+
attachments?: Array<{
|
|
168
|
+
id?: number | string;
|
|
169
|
+
file_name?: string;
|
|
170
|
+
original_filename?: string;
|
|
171
|
+
url?: string;
|
|
172
|
+
}>;
|
|
173
|
+
/** 记录操作人 ID(驳回记录上=该次驳回的驳回人,与记录挂载人员 id 比对判定主动/被动驳回:相等=本人主动驳回、不等=本人被驳回) */
|
|
174
|
+
user_id?: number | string;
|
|
175
|
+
/** 记录操作人姓名(被驳回记录展示「被 xxx 驳回」) */
|
|
176
|
+
user_name?: string;
|
|
177
|
+
/** 驳回目标人员(仅 result=3/is_reject=1 驳回记录上返回:该次驳回的真实目标人员,展示「驳回到 name」;其余记录为空对象 {}) */
|
|
178
|
+
rejecters?: {
|
|
179
|
+
undo_id?: number | string;
|
|
180
|
+
reject_undo_id?: number | string;
|
|
181
|
+
id?: string;
|
|
182
|
+
name?: string;
|
|
183
|
+
};
|
|
184
|
+
}
|
|
185
|
+
/** 待办详情数据:实例信息 + 表单 + 节点快照 + 处理记录 */
|
|
186
|
+
export interface WflowTodoDetail {
|
|
187
|
+
/** 流程实例 ID */
|
|
188
|
+
instance_id: number;
|
|
189
|
+
/** 流程配置 ID(字符串) */
|
|
190
|
+
flow_id: string;
|
|
191
|
+
/** 流程名称 */
|
|
192
|
+
flow_name?: string;
|
|
193
|
+
/** 流程标题 */
|
|
194
|
+
title?: string;
|
|
195
|
+
/** 流程图标 */
|
|
196
|
+
icon?: string;
|
|
197
|
+
/** 流程状态 */
|
|
198
|
+
status?: number;
|
|
199
|
+
/** 是否已结束:0 否 1 是 */
|
|
200
|
+
finished?: number;
|
|
201
|
+
/** 发起时间(毫秒时间戳) */
|
|
202
|
+
start_time?: number;
|
|
203
|
+
/** 结束时间(毫秒时间戳,未结束为 null) */
|
|
204
|
+
stop_time?: number | null;
|
|
205
|
+
/** 流程耗时(分钟) */
|
|
206
|
+
duration?: number;
|
|
207
|
+
/** 发起人 ID */
|
|
208
|
+
initor_id?: string;
|
|
209
|
+
/** 发起人姓名 */
|
|
210
|
+
initor_name?: string;
|
|
211
|
+
/** 表单字段定义 */
|
|
212
|
+
fields?: WflowTodoField[];
|
|
213
|
+
/** 表单业务数据 */
|
|
214
|
+
form?: Record<string, unknown>;
|
|
215
|
+
/** 流程节点快照(时间线渲染) */
|
|
216
|
+
nodes?: WflowTodoNode[];
|
|
217
|
+
/** 当前用户能否处理 */
|
|
218
|
+
can_handle?: boolean;
|
|
219
|
+
/** 当前用户是否发起人 */
|
|
220
|
+
is_initor?: boolean;
|
|
221
|
+
/** 当前用户在本实例当前任务上的待办审批记录 ID(同意/驳回接口入参,非处理人时为 null) */
|
|
222
|
+
undo_id?: number | null;
|
|
223
|
+
/** 当前用户本条待办审批记录是否已处理:0 否 1 是 */
|
|
224
|
+
undo_finished?: number;
|
|
225
|
+
}
|
|
226
|
+
/** 审批同意请求参数(意见与附件可为空;tenant_no 后端自动取当前登录租户,无需传递) */
|
|
227
|
+
export interface WflowUndoApproveParams {
|
|
228
|
+
/** 待办审批记录 ID(todo/list 或 todo/{instance_id} 返回的 undo_id) */
|
|
229
|
+
undo_id: number;
|
|
230
|
+
/** 审批意见(同意时可为空,最长 255 字符) */
|
|
231
|
+
suggest?: string;
|
|
232
|
+
/** 审批意见+附件组列表(CDN 文件),可为空,组内字段原样透传 */
|
|
233
|
+
attachments?: Array<Record<string, unknown>>;
|
|
234
|
+
}
|
|
235
|
+
/** 审批驳回请求参数(意见必填;仅传 reject_node_id=整节点重置,同时传 reject_user_id=人级驳回仅该用户重新审批) */
|
|
236
|
+
export interface WflowUndoRejectParams {
|
|
237
|
+
/** 待办审批记录 ID(todo/list 或 todo/{instance_id} 返回的 undo_id) */
|
|
238
|
+
undo_id: number;
|
|
239
|
+
/** 驳回目标节点 ID(发起人 start 节点或历史审批人节点;驳回到发起人=终止流程,驳回到历史节点=该节点起重置重审) */
|
|
240
|
+
reject_node_id: string;
|
|
241
|
+
/** 驳回目标审批人 ID(可选,须为 reject_node_id 节点下的审批人;指定时仅该用户重新审批,同节点其他人保留结果) */
|
|
242
|
+
reject_user_id?: string | null;
|
|
243
|
+
/** 审批意见(驳回时必填,最长 255 字符) */
|
|
244
|
+
suggest: string;
|
|
245
|
+
/** 审批意见+附件组列表(CDN 文件),可为空,组内字段原样透传 */
|
|
246
|
+
attachments?: Array<Record<string, unknown>>;
|
|
247
|
+
}
|
|
248
|
+
/** 审批处理结果:处理后的流程实例/当前任务快照 */
|
|
249
|
+
export interface WflowUndoResult {
|
|
250
|
+
instance_id: number;
|
|
251
|
+
status?: number;
|
|
252
|
+
finished?: number;
|
|
253
|
+
node_id?: string;
|
|
254
|
+
node_name?: string;
|
|
255
|
+
task_id?: number;
|
|
256
|
+
}
|
|
257
|
+
/** 审批同意(POST /wflow/undo/approve:或签任一人同意即过,依次/会签全员同意后推进下一节点,末节点通过后流程完成) */
|
|
258
|
+
export declare function fetchWflowUndoApprove(data: WflowUndoApproveParams): Promise<import('..').FlowUIResponse<WflowUndoResult>>;
|
|
259
|
+
/** 审批驳回(POST /wflow/undo/reject:驳回到发起人=终止流程,驳回到历史审批节点=该节点起重置重审) */
|
|
260
|
+
export declare function fetchWflowUndoReject(data: WflowUndoRejectParams): Promise<import('..').FlowUIResponse<WflowUndoResult>>;
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
type __VLS_Props = {
|
|
2
|
+
title?: string;
|
|
3
|
+
subtitle?: string;
|
|
4
|
+
contentPadding?: number | string;
|
|
5
|
+
};
|
|
6
|
+
declare var __VLS_9: {}, __VLS_11: {}, __VLS_13: {};
|
|
7
|
+
type __VLS_Slots = {} & {
|
|
8
|
+
subtitle?: (props: typeof __VLS_9) => any;
|
|
9
|
+
} & {
|
|
10
|
+
'header-extra'?: (props: typeof __VLS_11) => any;
|
|
11
|
+
} & {
|
|
12
|
+
default?: (props: typeof __VLS_13) => any;
|
|
13
|
+
};
|
|
14
|
+
declare const __VLS_base: import('vue').DefineComponent<__VLS_Props, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {}, string, import('vue').PublicProps, Readonly<__VLS_Props> & Readonly<{}>, {
|
|
15
|
+
title: string;
|
|
16
|
+
subtitle: string;
|
|
17
|
+
contentPadding: number | string;
|
|
18
|
+
}, {}, {}, {}, string, import('vue').ComponentProvideOptions, false, {}, any>;
|
|
19
|
+
declare const __VLS_export: __VLS_WithSlots<typeof __VLS_base, __VLS_Slots>;
|
|
20
|
+
declare const _default: typeof __VLS_export;
|
|
21
|
+
export default _default;
|
|
22
|
+
type __VLS_WithSlots<T, S> = T & {
|
|
23
|
+
new (): {
|
|
24
|
+
$slots: S;
|
|
25
|
+
};
|
|
26
|
+
};
|