@leadal/flowstream-ui-plus 0.0.1 → 0.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.
@@ -28,7 +28,7 @@ pnpm link --global @leadal/flowstream-ui-plus
28
28
 
29
29
  ## 3. 公共组件清单
30
30
 
31
- 只公开以下 5 个主组件和 1 个子组件:
31
+ 公开以下流程组件:
32
32
 
33
33
  | 按需导出名 | 全局标签 | 说明 |
34
34
  | --- | --- | --- |
@@ -45,15 +45,12 @@ pnpm link --global @leadal/flowstream-ui-plus
45
45
 
46
46
  ```ts
47
47
  import { createApp } from 'vue'
48
- import ElementPlus from 'element-plus'
49
- import 'element-plus/dist/index.css'
50
48
  import FlowstreamUIPlus from '@leadal/flowstream-ui-plus'
51
49
  import '@leadal/flowstream-ui-plus/style.css'
52
50
  import App from './App.vue'
53
51
 
54
52
  const app = createApp(App)
55
53
 
56
- app.use(ElementPlus)
57
54
  app.use(FlowstreamUIPlus, {
58
55
  baseURL: import.meta.env.VITE_FLOWSTREAM_ORIGIN,
59
56
  timeout: 60_000,
@@ -63,6 +60,8 @@ app.use(FlowstreamUIPlus, {
63
60
  app.mount('#app')
64
61
  ```
65
62
 
63
+ 流程组件使用的 Element Plus 控件及样式由组件库统一注册和携带,业务项目无需额外执行 `app.use(ElementPlus)`。
64
+
66
65
  `baseURL` 是接口前缀。传入地址时组件库会按原值使用(仅移除末尾 `/`):
67
66
 
68
67
  - 留空:生产构建不添加前缀;测试/开发源码模式默认添加 `/api`。
@@ -172,12 +171,15 @@ const diagramRef = ref<InstanceType<typeof FlowDiagram>>()
172
171
 
173
172
  ## 8. ui-flow-buttons 与 ui-flow-button
174
173
 
175
- `FlowButtons` 根据 `workId` 请求当前可用操作。发送、保存、启动和跳转等需要业务页面参与的动作通过 `execute-action` 交给宿主处理,其中发送动作名为 `taskSend`。
174
+ `FlowButtons` 根据当前工作项请求可用操作。可直接传 `workId`;如果业务详情只有流程实例,则传 `processInstanceId + dealUserId`,组件会自行查询该用户在该实例中的待办。发送和跳转默认在组件内部打开完整弹窗;保存、启动等业务表单相关动作通过 `execute-action` 交给宿主处理。任务拾取在传入 `dealUserId` 后由组件完成;前/后加签内置机构人员单选弹窗,`taskId` 可显式传入或由待办自动解析。
176
175
 
177
176
  ```vue
178
177
  <ui-flow-buttons
179
- :work-id="task.workId"
180
178
  :process-instance-id="task.processInstanceId"
179
+ :process-definition-id="task.processDefinitionId"
180
+ :deal-user-id="loginUser.id"
181
+ :deal-user-name="loginUser.name"
182
+ force-single-assignee
181
183
  :before-action="validateBeforeAction"
182
184
  :after-action="reloadAfterAction"
183
185
  @after-action="handleAfterAction"
@@ -186,7 +188,7 @@ const diagramRef = ref<InstanceType<typeof FlowDiagram>>()
186
188
  />
187
189
  ```
188
190
 
189
- 内部操作(如办毕、退回、撤回、收回、挂起、恢复和终止)成功后会触发 `after-action(action, result)`;也兼容 `afterAction` 函数型 prop。宿主可在该事件中提示成功并刷新列表。
191
+ 流程操作成功后会触发 `after-action(action, result, context)`;也兼容 `afterAction` 函数型 prop。`context` 包含当前待办字段,发送和跳转完成后还包含实际请求数据 `requestData`,宿主可据此同步业务状态并刷新列表。加签人员树只允许选择 `ntype=user` 的机构人员,部门节点仅用于展开。
190
192
 
191
193
  单按钮子组件可按需使用:
192
194
 
@@ -196,7 +198,7 @@ const diagramRef = ref<InstanceType<typeof FlowDiagram>>()
196
198
 
197
199
  ## 9. ui-flow-send
198
200
 
199
- `FlowSend` 是完整的发送办理组件,内置下一环节解析、办理人选择、流程变量、审批意见和确认发送弹窗。直接使用时点击组件按钮即可打开;与 `FlowButtons` 配合时可隐藏自身按钮,由 `taskSend` 操作调用实例的 `open()`。
201
+ `FlowSend` 是完整的发送办理组件,内置下一环节解析、办理人选择、流程变量、审批意见和确认发送弹窗。`FlowButtons` 已默认集成该弹窗;只有需要自定义编排时,才单独使用 FlowSend,并给 FlowButtons 设置 `:auto-handle-dialogs="false"`。
200
202
 
201
203
  ```vue
202
204
  <script setup lang="ts">
@@ -227,7 +229,7 @@ function handleAction(action: string) {
227
229
  </template>
228
230
  ```
229
231
 
230
- 推荐通过 `v-model` 控制弹窗,避免宿主依赖组件实例;实例仍公开 `open()`、`close()`、`getNextNode()`、`assembleData()` 和 `send()`。组件请求 `nodeAssistant` 加载下一节点候选人,并在确认时直接提交 `/flowstream/server/task/event/send`。
232
+ 推荐通过 `v-model` 控制弹窗,避免宿主依赖组件实例;实例仍公开 `open()`、`close()`、`getNextNode()`、`assembleData()` 和 `send()`。组件通过 `nodeAssistant` 请求 `POST /flowstream/server/assignment/event/query` 加载下一节点候选人,并在确认时直接提交 `/flowstream/server/task/event/send`。
231
233
 
232
234
  ## 10. ui-flow-jump
233
235
 
@@ -263,3 +265,111 @@ const jumpVisible = ref(false)
263
265
  组件请求只将服务端 `code` 为 `0` 或 `200` 的响应视为成功。建议统一监听 `error` 事件,并在入口通过 `getToken` 配置认证信息。
264
266
 
265
267
  流程图空白时,优先检查父容器高度、流程定义 ID、流程实例 ID 以及 BPMN 下载接口。
268
+
269
+ ## 12. 获取第一个办理节点
270
+
271
+ 已知流程定义 ID 时,查询第一个人工办理节点:
272
+
273
+ ```ts
274
+ import { getFirstHandleNodes } from '@leadal/flowstream-ui-plus'
275
+
276
+ const result = await getFirstHandleNodes({
277
+ processDefinitionId,
278
+ })
279
+ const firstHandleNodes = result.data || []
280
+ ```
281
+
282
+ - 接口为 `POST /flowstream/server/model/event/get/firsthandle`。
283
+ - 返回的是跳过 StartEvent、网关和中间事件后,各分支上第一个 `USER_TASK` 的集合,可能有多个。
284
+ - 纯自动流程返回 `data: []`,不是错误。
285
+ - `flowStartNodeList(args)` 作为兼容别名保留并调用新接口。`startNodes(args)` 仍用于跳转组件查询全部用户任务,不受本次变更影响。
286
+
287
+ ## 13. 命令式流程发起服务
288
+
289
+ 业务项目不再放置 `FlowStart`,提交业务数据后调用默认导出的运行时服务:
290
+
291
+ ```ts
292
+ import flowstream from '@leadal/flowstream-ui-plus'
293
+
294
+ async function submit() {
295
+ const result = await flowstream.getRuntimeService().start({
296
+ processDefinitionId,
297
+ draftUserId: currentUser.id,
298
+ draftUserName: currentUser.name,
299
+ business: { key: businessId, name: businessName },
300
+ variables,
301
+ async onBeforeStart(startArgs) {
302
+ const formData = await openBusinessForm()
303
+ if (!formData) return false
304
+ startArgs.variables = { ...startArgs.variables, ...formData }
305
+ return true
306
+ },
307
+ async onBeforeSend(context) {
308
+ return validateBeforeSend(context)
309
+ },
310
+ onStarted(result) {
311
+ saveFlowRelation(result.processInstanceId)
312
+ },
313
+ onAfterSend({ sendData }) {
314
+ syncNextAssignee(sendData.flowNodeAssignees)
315
+ refreshBusinessList()
316
+ },
317
+ onClose() {
318
+ console.log('发送弹窗已关闭;未发送时流程实例会被撤销')
319
+ },
320
+ onError(error) {
321
+ console.error(error.phase, error.message)
322
+ },
323
+ })
324
+ if (result === false) return
325
+ }
326
+ ```
327
+
328
+ - `onBeforeStart(args)` 在任何流程查询和启动接口之前执行,支持 `boolean | Promise<boolean>`;返回 `false` 时不会创建流程实例,`start()` 返回 `false`。
329
+ - `start()` 通过启动校验后,内部依次完成首办节点解析、`quickStart`、发送弹窗初始化、下一节点和候选办理人查询。
330
+ - `onBeforeSend(context)` 在实例创建成功后、审批人选择弹窗打开前执行,也支持 Promise;返回 `false` 时保留流程实例和当前会话,但不打开弹窗。
331
+ - 条件稍后满足时调用 `await flowstream.getRuntimeService().open()`,组件会重新执行 `onBeforeSend`;决定放弃时调用 `close()` 撤销实例并释放会话。
332
+ - 调用成功后直接打开选择弹窗,业务模板不需要挂载隐藏组件。
333
+ - 候选办理人可以有多个;`singleAssignee` 默认开启,每个下一节点只能选择一人。
334
+ - 用户确认后由内部发送组件调用 `sendTask()`;`onAfterSend` 参数中的 `sendData.flowNodeAssignees` 是实际发送的下一节点和办理人。
335
+ - 用户未发送就关闭弹窗时会撤销刚创建的流程实例并释放会话;只有 `onBeforeSend` 返回 `false`、弹窗尚未打开时,才能调用 `open()` 在条件满足后继续。
336
+ - `processDefinitionId`、`draftUserId`、`draftUserName` 均为必填;快速启动不支持多个首办节点或多个起草人待办。
337
+
338
+ 业务表单弹窗应由接入项目实现,并将用户操作转换为 Promise:确认且校验成功时 `resolve(true)`,取消、关闭或组件卸载时 `resolve(false)`。不要只修改一个响应式布尔变量而不结束 Promise,否则 `start()` 会一直等待。
339
+
340
+ ## 14. 获取应用与流程
341
+
342
+ 业务页面需要「选应用 → 选流程 → 发起」级联场景时,可查询应用列表和流程定义列表。
343
+
344
+ 方式一:函数式调用(`flowApi` 已聚合全部接口,也可直接导入单个函数):
345
+
346
+ ```ts
347
+ import { flowApi } from '@leadal/flowstream-ui-plus'
348
+
349
+ // 获取应用列表
350
+ const apps = (await flowApi.getAppList()).data || []
351
+
352
+ // 获取流程定义列表(可按应用过滤)
353
+ const flows = (await flowApi.getFlowList({ appId })).data || []
354
+ ```
355
+
356
+ 方式二:`runtimeService` 便捷方法(已自动解包 `data`):
357
+
358
+ ```ts
359
+ import flowstream from '@leadal/flowstream-ui-plus'
360
+
361
+ const apps = await flowstream.getRuntimeService().getApps()
362
+ const flows = await flowstream.getRuntimeService().getFlows({ appId })
363
+ ```
364
+
365
+ 典型级联发起示例:
366
+
367
+ ```vue
368
+ <ui-select v-model="appId" :options="apps" label-key="name" value-key="id" @change="loadFlows" />
369
+ <ui-select v-model="processDefinitionId" :options="flows" label-key="name" value-key="id" />
370
+ <ui-button @click="submit">发起流程</ui-button>
371
+ ```
372
+
373
+ - 接口约定(路径待后端确认):`POST /flowstream/server/repository/app/event/list`、`POST /flowstream/server/repository/flowdef/event/list`。
374
+ - `FlowApp`、`FlowDefinition` 类型已从库中导出,字段以后端实际返回为准。
375
+ - 拿到流程定义后,将 `flow.id` 作为 `processDefinitionId` 传给 `runtimeService.start()` 即可完成发起。
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@leadal/flowstream-ui-plus",
3
- "version": "0.0.1",
3
+ "version": "0.0.3",
4
4
  "description": "FlowStream workflow components for Vue 3",
5
5
  "type": "module",
6
6
  "main": "dist/flowstream-ui-plus.umd.cjs",