1. 程式人生 > >vue專案中使用bpmn-流程圖json屬性轉xml(七篇更新完成)

vue專案中使用bpmn-流程圖json屬性轉xml(七篇更新完成)

內容概述

本系列“vue專案中使用bpmn-xxxx”分為七篇,均為自己使用過程中用到的例項,手工原創,目前陸續更新中。主要包括vue專案中bpmn使用例項、應用技巧、基本知識點總結和需要注意事項,具有一定的參考價值,需要的朋友可以參考一下。如果轉載或通過爬蟲直接爬的,格式特別醜,請來原創看:我是作者原文

前情提要

上一節我們討論了將xml中的節點屬性,轉成前端常用的json格式。這一篇,我們來討論更改了json後,如何寫入到xml中去。首先,我們通過一張圖看看流程圖xml和json結構的對應關係。一定要仔細看,這張圖理解了,這篇文章就理解一半了。

思路分析

xlm中,屬性包裹在<bpmn:extensionElements>中,下一層分別是<camunda:inputOutput>和<camunda:inputParameter>,inputParameter的下一層,會有三種格式。上一節我們讀取屬性也是按照這個順序,層層遍歷拿到的屬性值。

所以,我們本次的出發點,是根據json各欄位的屬性型別,從裡向外為<bpmn:extensionElements>新增內容。步驟如下:

1.elementRegistry.get 和節點id找到節點例項element,因為寫入xml的時候需要知道為哪個節點寫屬性

2.bpmnFactory.create ,顧名思義,作用為建立標籤。通過該方法建立<bpmn:extensionElements>元素,並通過對this.form的遍歷,不斷為其新增子元素。

3.通過modeling.updateProperties(element, {extensionElements});更新business中的節點xml。引數1 步驟1中提到的節點例項element,引數2是步驟2生成的<bpmn:extensionElements>

程式碼實現

程式碼核心主要集中在生成<bpmn:extensionElements>,併為其新增子元素。

上張圖片中的this.form,屬性值分為三種資料型別

1.單一值:字串(string),數字(Number)或布林(boolean),對應生成一個<camunda:inputParameter>,且沒有子元素

2.Object:

  2.1 陣列,對應生成一個<camunda:inputParameter>,且有子元素<camunda:list>,<camunda:list>包含多個<camunda:value>

  2.2 物件,對應生成一個<camunda:inputParameter>,且有子元素<camunda:map>,<camunda:list>包含多<camunda:entry>

核心如下:

for (const nodeKey in this.form) {
     let inputParameter = null;
     // 1、屬性值為單個值,即布林、字串、數字
      if (
      (typeof this.form[nodeKey] === 'string' && this.form[nodeKey] !== '') ||
        typeof this.form[nodeKey] === 'boolean' ||
        typeof this.form[nodeKey] === 'number'
       ) {
          inputParameter = bpmnFactory.create('camunda:InputParameter', {
             name: nodeKey,
             // 布林值和數字影響生成xml,都要轉成字串
              value: typeof this.form[nodeKey] === 'string' ? this.form[nodeKey] : JSON.stringify(this.form[nodeKey])
             }
         );
        //  2.屬性值為陣列或物件
       } else if (typeof this.form[nodeKey] === 'object') {
         // 2.1 屬性值為陣列,對應案例中 '愛吃'欄位,checkbox多選
           if (this.form[nodeKey] instanceof Array) {
                if (this.form[nodeKey].length) {
                inputParameter = bpmnFactory.create('camunda:InputParameter', {name: nodeKey});
                  const list = bpmnFactory.create('camunda:List');
                  list.items = [];
                  this.form[nodeKey].forEach((item) => {
                    const itemValue = bpmnFactory.create('camunda:Value', {value: item});
                    list.items.push(itemValue);
                  });
                  inputParameter.definition = list;
                }
          } else {
             // 2.2 此時屬性值是物件,對應案例中 '詳細資訊'
             if (JSON.stringify(this.form[nodeKey]) === '{}') continue;
             inputParameter = bpmnFactory.create('camunda:InputParameter', {name: nodeKey});
                const map = bpmnFactory.create('camunda:Map');
                map.entries = [];
                for (const mapKey in this.form[nodeKey]) {
                  if (this.form[nodeKey][mapKey] !== '') {
                    const itemValue = bpmnFactory.create('camunda:Entry', {
                      key: mapKey,
                      value: this.form[nodeKey][mapKey]
                    });
                    map.entries.push(itemValue);
                  }
                  inputParameter.definition = map;
                }
              }
            }
     inputParameter !== null && inputOutput.inputParameters.push(inputParameter);
}
modeling.updateProperties(element, {extensionElements});

成果驗證

此時,我們修改一下表單屬性,通過控制檯看一下最新的xml:

可以看到,xml已經被更新,且值和頁面中表單項的值完全一致。完成!七篇文章的整個專案原始碼是個資料夾,我太笨了,不知道怎樣傳到部落格裡。所以,想要獲取bpmn完整原始碼的小夥伴, 可以公眾號聯絡我,掃下面二維碼或公眾號搜“Lemoncool”,即可獲取~

後續

直到現在,本系列“vue專案中使用bpmn-xxxx”七篇文章已經更新完成。都是總結自己開發中遇到的疑惑和知識點,不是很系統。還有很多小的知識點,不太成體系的,就沒有納入文章內,如果需要的話,後面可能會在公眾號更新。

也歡迎使用bpmn的小夥伴,通過部落格或公眾號與我交流,大家一起爬坑,共同進步!