BPMN使用小結

內部管理系統需要多種流程設計,方便在 Web PC 手動設計業務流程,保證單個業務可以設計多個流程,並且可以進行流程跟蹤的綜合要求。

起初

後端有一套自己的流程引擎,解析相應的 xml,然後部署業務流程。
起初後端是想直接用 activiti-designeer 做流程設計,該方法基本滿足業務需求,但後期發現這樣做太麻煩,於是推薦前端使用 BPMN插件,放在管理系統中使用,生成 xmlsvg 字符串傳給接口,保存改業務流程。

基本用法

  • 安裝依賴包
yarn add bpmn-js
yarn add bpmn-js-properties-panel
yarn add camunda-bpmn-moddle
  • 初始化
let xml; // 我的BPMN 2.0 xml 
let viewer =  new  BpmnJS({
    container: '#canvas',
    height: 400,
});

viewer.importXML(xml, function(err) {

    if (err) {
        console.log('error rendering: ', err)
    } else {
        console.log('rendered:')
    }
});

React 中用法

使用了 ant-design-pro 最初搭建好的後臺項目(非 ts 版本) 搭建的項目:
BPMN React 例子

  • ProcessManage

流程管理:包括看板與表單輸入的流程管理實例

  • processTrace

流程跟蹤:可點擊審批節點,獲取節點id,從而可獲取當前節點詳細信息的實例

遇到的問題

  • 自定義節點信息表單

官網提供了一些 BPMN 實例,可以自定義單個表單(inout、select、checkbox...)

import entryFactory from 'bpmn-js-properties-panel/lib/factory/EntryFactory';

// 編號
const BaseInfoProps = (group, element, bpmnFactory, translate) => {
    group.entries.push(
        entryFactory.textField({
            id: 'id',
            label: translate('編號'),
            modelProperty: 'id',
        })
    );

    group.entries.push(
        entryFactory.textField({
            id: 'name',
            label: translate('名稱'),
            modelProperty: 'name',
            validate: function(element, values) {
                let validationResult = {};

                if (!values.name) {
                    validationResult.name = '請輸入節點名稱';
                }

                if (values.name && values.name.length > 30) {
                    validationResult.name = '名稱最多30個字';
                }

                return validationResult;
            },
        })
    );
}

export default BaseInfoProps;
  • No provider for "e"!

在本地聯調部署都沒有問題,打包到正式環境的時候,進入初始化截斷,開始報以下錯誤:

Error: No provider for "e"! (Resolving: colorPicker -> e)

起初以爲 colorPicker 中的代碼不夠完善,反正這個也不用,就刪了吧,上線要緊,結果錯誤總是驚人的相似,又出現以下錯誤:

Error: No provider for "e"! (Resolving: propertiesPanel -> propertiesProvider -> e)
No provider for "e"! (Resolving: colorPicker -> e)

於是找到了這個網站 BPMN問題網站,裏面有一些解釋,意思就是:定義的函數需要使用 $inject 來註釋服務 annotate your service.

export default function ColorPicker(eventBus, contextPad, commandStack) {
    // ...
}
ColorPicker.$inject = [
    'eventBus',
    'contextPad',
    'commandStack',
];
更形象的解釋就是:`SVG` 就像是我們的顯示器屏幕,`viewBox` 就是截屏工具選中的那個框框,最終的呈現就是把框框中的截屏內容再次在顯示器中全屏顯示!

- `preserveAspectRatio="xMinYMin meet"`

`preserveAspectRatio` 屬性的值爲空格分隔的兩個值組合而成。例如,上面的 `xMidYMid` 和 `meet`.

第1個值表示, `viewBox` 如何與` SVG viewport `對齊; 
其中,第1個值又是由兩部分組成的。前半部分表示x方向對齊,後半部分表示y方向對齊

| -- 值 -- | -- 含義 -- |
| xMin | viewport 和 viewBox左邊對齊 |
| xMid | viewport 和 viewBox x軸中心對齊 |
| xMax | viewport 和 viewBox右邊對齊 |
| YMin | viewport 和 viewBox上邊緣對齊。注意Y是大寫。 |
| YMid | viewport 和 viewBox y軸中心點對齊。注意Y是大寫。 |
| YMax | viewport 和 viewBox下邊緣對齊。注意Y是大寫。 |

第2個值表示,如何維持高寬比(如果有)。

| -- 值 -- | -- 含義 -- |
| meet | 保持縱橫比縮放viewBox適應viewport | 
| slice | 保持縱橫比同時比例小的方向放大填滿viewport | 
| none | 扭曲縱橫比以充分適應viewport,變態 | 

網址

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章