LogicFlow icon indicating copy to clipboard operation
LogicFlow copied to clipboard

[Bug report]在使用bpmn中关于xml互相转换的一些bug

Open shaohua007 opened this issue 3 years ago • 1 comments

问题描述
开发环境: Edge浏览器 , 对接后端flowable最新的流程引擎,采用bpmn2.0规范 1、 文件 packages\extension\src\bpmn-adapter\index.ts 中toXmlJson跟toNormalJson方法没有考虑Array的情况,Object.entries无法正确解析数组,,导致本来的对象数组例如 { "bpmn2:extensionElements": { "flowable:taskListener": [ { "event": "create", "flowable:field": { "name": "taskType", "stringValue": "Execute" } }, { "event": "end", "flowable:field": { "name": "taskType", "stringValue": "Execute" } } ] } } 变成了下面的形式: { "bpmn2:extensionElements": { "flowable:taskListener": { 0: { "-event": "create", "flowable:field": { "-name": "taskType", "-stringValue": "Execute" } }, 1: { "-event": "end", "flowable:field": { "-name": "taskType", "-stringValue": "Execute" } } } } } 造成的后果就是生成bpmn的xml总是少了元素

2、 文件 packages\extension\src\bpmn-adapter\index.ts toXmlJson方法没有处理xml中的 #text节点(文本节点) image 这是做了处理后的

3、issue https://github.com/didi/LogicFlow/issues/325 并不能保证 incomming在outgoing之前,因为各浏览器差异,对象并不会按照先后顺序处理,所以需要在 packages\extension\src\bpmn-adapter\json2xml.ts 中修改,如下只是个人临时修改没来得及重构 image

先写这么多,还有些bug容我想想~

shaohua007 avatar Aug 04 '22 10:08 shaohua007

目前BPMN支持不完善,如果遇到欢迎提测,我们将在v1.2.0中修复。

towersxu avatar Aug 04 '22 11:08 towersxu

这些问题在最新的版本中都得到了修复,新的使用方式可以查阅文档的相关部分

wumail avatar May 17 '23 07:05 wumail

v1.2.22 仍然无法保证incoming和outgoing在其他元素之前。大家有遇到类似这类情况? 我的解决方案如下:

// 使用方法,基于BpmnAdapter自定义适配器
const xmlStr = lfJson2Xml(json, { attrSorts: ['bpmn:incoming', 'bpmn:outgoing'] });

// https://github.com/didi/LogicFlow/blob/bf4a8b92aa550aabc0ba65add9df6913678d9f3b/packages/extension/src/bpmn-adapter/json2xml.ts
/**
 * xmlJson 转换为 xmlStr
 * @param {Object} o xmlJson对象
 * @param {Object} opts 选项
 * @param {Object} opts.attrSorts 属性排序
 * @returns {string} xml字符串
 */
function lfJson2Xml(o, opts = {}) {
  let xmlStr = '';
  for (const m in o) {
    // 所有调用toXml方法都需要添加额外参数opts
    xmlStr += toXml(o[m], m, 0, opts);
  }
  return xmlStr;
}

// #L63 之后插入以下代码
// 保证incoming在outgoing之前,并且都在在其他元素之前
keys.sort((a, b) => {
  const aIndex = opts.attrSorts.indexOf(a);
  const bIndex = opts.attrSorts.indexOf(b);
  if (aIndex === -1 && bIndex !== -1) {
    return 1;
  }
  if (aIndex !== -1 && bIndex === -1) {
    return -1;
  }
  return aIndex - bIndex;
})

youtiao66 avatar Mar 15 '24 07:03 youtiao66