tool.ts 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176
  1. import { BaseEdgeModel, BaseNodeModel } from '@logicflow/core';
  2. /**
  3. * 节点样式处理方法
  4. * @param _this
  5. * @param {*} style
  6. * @returns
  7. */
  8. export const nodeStyleHandle = (_this: BaseNodeModel, style: {
  9. [x: string]: any;
  10. r?: number;
  11. fill?: string;
  12. stroke?: string;
  13. strokeWidth?: number;
  14. }): {
  15. [x: string]: any;
  16. r?: number;
  17. fill?: string;
  18. stroke?: string;
  19. strokeWidth?: number;
  20. } => {
  21. if (_this.properties.state === 'active') {
  22. style.stroke = '#00ff00'
  23. } else if (_this.properties.state === 'history') {
  24. style.stroke = '#ff0000'
  25. }
  26. return style
  27. }
  28. /**
  29. * 边样式处理方法
  30. * @param _this
  31. * @param {*} style
  32. * @returns
  33. */
  34. export const edgeStyleHandle = (_this: BaseEdgeModel, style: {
  35. [x: string]: any;
  36. r?: number;
  37. fill?: string;
  38. stroke?: string;
  39. strokeWidth?: number;
  40. }): {
  41. [x: string]: any;
  42. r?: number;
  43. fill?: string;
  44. stroke?: string;
  45. strokeWidth?: number;
  46. } => {
  47. if (_this.properties.state === 'active') {
  48. style.stroke = '#00ff00'
  49. } else if (_this.properties.state === 'history') {
  50. style.stroke = '#ff0000'
  51. }
  52. return style
  53. }
  54. /**
  55. * 将获取到的数据转换成logic flow需要的数据
  56. * @param {*} data(...processInfo,nodes,edges)
  57. * @returns
  58. */
  59. export const resDataToLogicFlow = (data: any): any => {
  60. return JSON.parse(data.externalData)
  61. }
  62. /**
  63. * 将LogicFlow的数据转成提交的格式
  64. * @param {*} data(...processInfo,nodes,edges)
  65. * @returns
  66. */
  67. export const logicFlowJsonToSubmit = (data: any): object => {
  68. let returnData = {}
  69. // data的数据由流程定义文件信息+logicFlow数据构成
  70. // 先构建成流程对象
  71. const processObj = <any>{
  72. name: data.name, // 流程定义名称
  73. code: data.code, // 流程定义code
  74. description: data.description, // 流程定义描述
  75. id: data.id, // 流程id
  76. steps: [] // 所有步骤
  77. }
  78. // /**
  79. // * 获取开始节点
  80. // * @returns
  81. // */
  82. const getStartNode = () => {
  83. return data.nodes.filter((node: any) => {
  84. // 是开始节点,且非子流程中的开始节点
  85. return node.type === 'hotline:start'
  86. })
  87. }
  88. // 获取结束节点
  89. const getEndNode = () => {
  90. return data.nodes.filter((node: any) => {
  91. return node.type === 'hotline:end'
  92. })
  93. }
  94. // /**
  95. // * 构建节点属性
  96. // * @param {}} node
  97. // * @returns
  98. // */
  99. const buildNode = (node: any) => {
  100. return {
  101. name: (node.text instanceof String || node.text === undefined) ? node.text : node.text.value,
  102. ...node.properties,
  103. handlerTypeItems: formatArrayHandlerTypeItems(node),
  104. code: node.id,
  105. nextSteps: node.nextSteps
  106. }
  107. }
  108. /**
  109. * 处理数组类型
  110. * @param {} node
  111. */
  112. const formatArrayHandlerTypeItems = (node: any) => {
  113. const nodeName = node.type.replace('hotline:', '')
  114. let data: string[] = []
  115. if (['start', 'task','end'].includes(nodeName)) {
  116. if (node.properties.handlerTypeItems && Object.prototype.toString.call(node.properties.handlerTypeItems) === '[object String]') {
  117. data = JSON.parse(node.properties.handlerTypeItems)
  118. }
  119. }
  120. return data;
  121. }
  122. const startNode = getStartNode();
  123. const endNode = getEndNode();
  124. if (!startNode[0]) {
  125. // 开始节点不存在
  126. return { error: '开始节点不存在' }
  127. }
  128. if(startNode.length > 1){
  129. // 开始节点存在多个
  130. return { error: '开始节点存在多个' }
  131. }
  132. if (!endNode[0]) {
  133. // 结束节点不存在
  134. return { error: '结束节点不存在' }
  135. }
  136. if(endNode.length > 1){
  137. // 结束节点存在多个
  138. return { error: '结束节点存在多个' }
  139. }
  140. for (let node of data.nodes) {
  141. node.nextSteps = [];
  142. const edges = data.edges.filter((v: any) => v.sourceNodeId === node.id);// 找到当前节点的边
  143. for (let edge of edges) {
  144. if (edge.sourceNodeId === node.id) {
  145. node.nextSteps.push({
  146. code: edge.targetNodeId
  147. })
  148. }
  149. }
  150. processObj.steps.push(buildNode(node))
  151. }
  152. for (let i of processObj.steps) {//普通节点字段非空校验
  153. if(!['start','end'].includes(i.code)){
  154. if (!i.stepType && String(i.stepType) !== '0') {
  155. return { error: `请选择${i.name}的节点类型` };
  156. }
  157. }
  158. if (!i.businessType && String(i.businessType) !== '0') {
  159. return { error: `请选择${i.name}的业务类型` };
  160. }
  161. if (!i.executeMode && String(i.executeMode) !== '0') {
  162. return { error: `请选择${i.name}的执行者模式` };
  163. }
  164. if (!i.handlerType && String(i.handlerType) !== '0') {
  165. return { error: `请选择${i.name}的办理者类型` };
  166. }
  167. }
  168. returnData = {
  169. ...processObj
  170. }
  171. return returnData;
  172. }