Bläddra i källkod

bom编辑 权限

Renxy 2 år sedan
förälder
incheckning
c3d27efc8d

+ 1 - 0
config/config.js

@@ -141,6 +141,7 @@ export default {
   proxy: {
     '/api': {
       // target: 'http://192.168.20.152:8888/',
+      // target: 'http://120.55.44.4:8896/',
       target: 'http://47.96.12.136:8896/',
       // target: 'http://oraysmart.com:8889/',
       // target: 'http://oraysmart.com:8888/api',

+ 1 - 0
src/components/Flow/config-toolbar.ts

@@ -218,6 +218,7 @@ namespace NSToolbarConfig {
                   flow_id: item.flow_id || 0,
                   node_type: item.name == 'custom-circle' ? 1 : 0,
                   count: 0,
+                  role_list: item.role_list,
                   // count: item.count,
                 };
               });

+ 34 - 7
src/components/Flow/index.tsx

@@ -47,7 +47,11 @@ import './index.less';
 import { TYPE } from './node/auditNode/mapServe';
 
 export interface IProps {
-  meta: { flowId: string; type: 'edit' };
+  meta: {
+    flowId: string;
+    type: 'edit';
+    editMode?: number; // 1. 管理员编辑   2. 普通编辑
+  };
   flowDetail: any;
   onSelectNode?: Function;
   parentRef?: any;
@@ -190,13 +194,12 @@ export const Demo: React.FC<IProps> = props => {
       },
       snapline: false,
     };
-    return isEdit
-      ? defaultOption
-      : {
+    if (isEdit) {
+      // 非管理员编辑
+      if (meta.editMode == 2) {
+        return {
           ...defaultOption,
           grid: false,
-          resizing: false,
-          panning: false,
           selecting: {
             enabled: true,
             showNodeSelectionBox: true,
@@ -210,6 +213,30 @@ export const Demo: React.FC<IProps> = props => {
             dangling: false,
           },
         };
+      } else {
+        // 管理员编辑
+        return defaultOption;
+      }
+    } else {
+      return {
+        ...defaultOption,
+        grid: false,
+        resizing: false,
+        panning: false,
+        selecting: {
+          enabled: true,
+          showNodeSelectionBox: true,
+        },
+        interacting: false,
+        mousewheel: false,
+        connecting: {
+          highlight: false,
+          allowBlank: false,
+          allowPort: false,
+          dangling: false,
+        },
+      };
+    }
   };
   useEffect(() => {
     if (graphRef.current) {
@@ -238,7 +265,7 @@ export const Demo: React.FC<IProps> = props => {
         }}
         showOfficial={false}
         defaultActiveKey={['custom']}
-        position={{ width: 162, top: 40, bottom: 0, left: isEdit ? 0 : -999 }}
+        position={{ width: 162, top: 40, bottom: 0, left: isEdit && meta.editMode == 1 ? 0 : -999 }}
       />
       {isEdit && (
         <CanvasToolbar

+ 74 - 58
src/components/Flow/node/circle/mapServe.tsx

@@ -1,10 +1,11 @@
 import React, { useState, useEffect } from 'react';
-import { FlowchartFormWrapper } from '@antv/xflow';
+import { FlowchartFormWrapper, MODELS, useXFlowApp } from '@antv/xflow';
 import { Position, Size, ColorPicker, InputNumberFiled, InputFiled, SelectField } from '../fields';
 import { PREFIX } from '../constants';
 import { connect } from 'dva';
 import { UnityAction } from '@/utils/utils';
 import { Button } from 'antd';
+import { IProps } from '@/components/Flow/index';
 
 export interface IConfig {
   label?: string;
@@ -28,6 +29,8 @@ const Component = (props: any) => {
   const [nodeConfig, setNodeConfig] = useState<IConfig>({
     ...config,
   });
+  const app = useXFlowApp();
+  const [meta, setMeta] = useState<IProps['meta']>(null);
   const onNodeConfigChange = (key: string, value: number | string | object) => {
     if (key) {
       setNodeConfig({
@@ -57,6 +60,12 @@ const Component = (props: any) => {
     });
   }, [config]);
 
+  useEffect(() => {
+    MODELS.GRAPH_META.useValue(app.modelService).then((meta: IProps['meta']) => {
+      setMeta(meta);
+    });
+  }, []);
+
   return (
     <div className={`${PREFIX}-panel-body`}>
       <div className={`${PREFIX}-panel-group`}>
@@ -64,6 +73,7 @@ const Component = (props: any) => {
         <InputFiled
           label="标题"
           value={nodeConfig.label}
+          disabled={meta?.editMode == 2}
           onChange={value => {
             onNodeConfigChange('label', value);
           }}
@@ -74,6 +84,7 @@ const Component = (props: any) => {
         <SelectField
           label="审批流程"
           value={nodeConfig.flow_id}
+          disabled={meta?.editMode == 2}
           onChange={value => {
             let audit = auditList.find(item => item.list.id == value);
 
@@ -92,64 +103,69 @@ const Component = (props: any) => {
           })}
         />
       </div>
-      <div className={`${PREFIX}-panel-group`}>
-        <h5>样式</h5>
-        <Position
-          x={nodeConfig.x}
-          y={nodeConfig.y}
-          onChange={(key, value) => {
-            onNodeConfigChange(key, value);
-          }}
-        />
-        <Size
-          width={nodeConfig.width}
-          height={nodeConfig.height}
-          onChange={(key, value) => {
-            onNodeConfigChange(key, value);
-          }}
-        />
-        <ColorPicker
-          label="填充"
-          value={nodeConfig.fill}
-          onChange={(value: string) => {
-            onNodeConfigChange('fill', value);
-          }}
-        />
-        <ColorPicker
-          label="边框"
-          value={nodeConfig.stroke}
-          onChange={(value: string) => {
-            onNodeConfigChange('stroke', value);
-          }}
-        />
-        <InputNumberFiled
-          label="消息数量"
-          value={nodeConfig.count}
-          onChange={value => {
-            onNodeConfigChange('count', value);
-          }}
-        />
-      </div>
 
-      <div className={`${PREFIX}-node-text-style`}>
-        <InputNumberFiled
-          label="字号"
-          value={nodeConfig.fontSize}
-          width={68}
-          onChange={value => {
-            onNodeConfigChange('fontSize', value);
-          }}
-        />
-        <ColorPicker
-          value={nodeConfig.fontFill}
-          onChange={(value: string) => {
-            onNodeConfigChange('fontFill', value);
-          }}
-        />
-      </div>
-      <Button style={{ marginTop: 20 }} type="primary" onClick={onSave}>
-        保存
-      </Button>
+      {meta?.editMode != 2 && (
+        <>
+          <div className={`${PREFIX}-panel-group`}>
+            <h5>样式</h5>
+            <Position
+              x={nodeConfig.x}
+              y={nodeConfig.y}
+              onChange={(key, value) => {
+                onNodeConfigChange(key, value);
+              }}
+            />
+            <Size
+              width={nodeConfig.width}
+              height={nodeConfig.height}
+              onChange={(key, value) => {
+                onNodeConfigChange(key, value);
+              }}
+            />
+            <ColorPicker
+              label="填充"
+              value={nodeConfig.fill}
+              onChange={(value: string) => {
+                onNodeConfigChange('fill', value);
+              }}
+            />
+            <ColorPicker
+              label="边框"
+              value={nodeConfig.stroke}
+              onChange={(value: string) => {
+                onNodeConfigChange('stroke', value);
+              }}
+            />
+            <InputNumberFiled
+              label="消息数量"
+              value={nodeConfig.count}
+              onChange={value => {
+                onNodeConfigChange('count', value);
+              }}
+            />
+          </div>
+
+          <div className={`${PREFIX}-node-text-style`}>
+            <InputNumberFiled
+              label="字号"
+              value={nodeConfig.fontSize}
+              width={68}
+              onChange={value => {
+                onNodeConfigChange('fontSize', value);
+              }}
+            />
+            <ColorPicker
+              value={nodeConfig.fontFill}
+              onChange={(value: string) => {
+                onNodeConfigChange('fontFill', value);
+              }}
+            />
+          </div>
+          <Button style={{ marginTop: 20 }} type="primary" onClick={onSave}>
+            保存
+          </Button>
+        </>
+      )}
     </div>
   );
 };

+ 4 - 2
src/components/Flow/node/fields/input.tsx

@@ -5,11 +5,12 @@ import { FormItemHeight } from '../constants';
 interface IProps {
   label?: string;
   value?: string;
+  disabled?: boolean;
   onChange?: (value: string) => void;
 }
 
-const InputFiled: React.FC<IProps> = (props) => {
-  const { label = '标签', value, onChange } = props;
+const InputFiled: React.FC<IProps> = props => {
+  const { label = '标签', value, onChange, disabled } = props;
   return (
     <div className="group">
       <label>{label}</label>
@@ -18,6 +19,7 @@ const InputFiled: React.FC<IProps> = (props) => {
         style={{
           height: FormItemHeight,
         }}
+        disabled={disabled}
         onChange={(e: React.ChangeEvent<HTMLInputElement>) => {
           onChange?.(e.target.value);
         }}

+ 6 - 2
src/components/Flow/node/fields/radio.tsx

@@ -10,11 +10,12 @@ interface IProps {
     value: string | number;
   }[];
   width?: number | string;
+  disabled?: boolean;
   onChange?: (value: string | number) => void;
 }
 
 const SelectField: React.FC<IProps> = props => {
-  const { label = '', value, onChange, options = [], width } = props;
+  const { label = '', value, onChange, options = [], width, disabled } = props;
   return (
     <div className="group">
       <label>{label}</label>
@@ -24,12 +25,15 @@ const SelectField: React.FC<IProps> = props => {
           width,
           height: FormItemHeight,
         }}
+        disabled={disabled}
         onChange={e => {
           onChange?.(e.target.value);
         }}
       >
         {options.map(item => (
-          <Radio key={`${item.value}-${item.label}`} value={item.value}>{item.label}</Radio>
+          <Radio key={`${item.value}-${item.label}`} value={item.value}>
+            {item.label}
+          </Radio>
         ))}
       </Radio.Group>
     </div>

+ 5 - 3
src/components/Flow/node/fields/select.tsx

@@ -10,11 +10,12 @@ interface IProps {
     value: string | number;
   }[];
   width?: number | string;
+  disabled?: boolean;
   onChange?: (value: string | number) => void;
 }
 
-const SelectField: React.FC<IProps> = (props) => {
-  const { label = '箭头', value, onChange, options = [], width } = props;
+const SelectField: React.FC<IProps> = props => {
+  const { label = '箭头', value, onChange, options = [], width, disabled } = props;
   return (
     <div className="group">
       <label>{label}</label>
@@ -25,7 +26,8 @@ const SelectField: React.FC<IProps> = (props) => {
           width,
           height: FormItemHeight,
         }}
-        getPopupContainer={(trigger) => trigger.parentNode}
+        disabled={disabled}
+        getPopupContainer={trigger => trigger.parentNode}
         optionFilterProp="children"
         onChange={(v: string) => {
           onChange?.(v);

+ 65 - 49
src/components/Flow/node/rect/mapServe.tsx

@@ -1,5 +1,5 @@
 import React, { useState, useEffect } from 'react';
-import { FlowchartFormWrapper } from '@antv/xflow';
+import { FlowchartFormWrapper, MODELS, useXFlowApp } from '@antv/xflow';
 import { Button, message, Select } from 'antd';
 import LuckyExcel from 'luckyexcel';
 import {
@@ -14,6 +14,7 @@ import {
 import { PREFIX } from '../constants';
 import { UnityAction } from '@/utils/utils';
 import { connect } from 'dva';
+import { IProps } from '@/components/Flow/index';
 
 interface ExcelInfo {
   file_name?: string;
@@ -55,6 +56,9 @@ const Component = (props: any) => {
     ...defaultConfig,
     ...config,
   });
+
+  const app = useXFlowApp();
+  const [meta, setMeta] = useState<IProps['meta']>(null);
   const onNodeConfigChange = (key: string, value: number | string | object) => {
     if (key) {
       setNodeConfig({
@@ -122,6 +126,12 @@ const Component = (props: any) => {
     });
   }, [config]);
 
+  useEffect(() => {
+    MODELS.GRAPH_META.useValue(app.modelService).then((meta: IProps['meta']) => {
+      setMeta(meta);
+    });
+  }, []);
+
   const updataFileName = (name: string) => {
     var idx = name?.lastIndexOf('/');
     let str = name.substring(idx + 1, name.length);
@@ -158,6 +168,7 @@ const Component = (props: any) => {
         <InputFiled
           label="标题"
           value={nodeConfig.label}
+          disabled={meta?.editMode == 2}
           onChange={value => {
             onNodeConfigChange('label', value);
           }}
@@ -171,6 +182,7 @@ const Component = (props: any) => {
           onChange={value => {
             onNodeConfigChange('muti_version', value);
           }}
+          disabled={meta?.editMode == 2}
           options={[
             { label: '是', value: 1 },
             { label: '否', value: 0 },
@@ -218,65 +230,69 @@ const Component = (props: any) => {
             onChange={(v: number[]) => {
               onNodeConfigChange('role_list', v.join(','));
             }}
+            disabled={meta?.editMode == 2}
             options={options}
           />
         </div>
       </div>
-      <div className={`${PREFIX}-panel-group`}>
-        <h5>样式</h5>
-        <Position
-          x={nodeConfig.x}
-          y={nodeConfig.y}
-          onChange={(key, value) => {
-            onNodeConfigChange(key, value);
-          }}
-        />
-        <Size
-          width={nodeConfig.width}
-          height={nodeConfig.height}
-          onChange={(key, value) => {
-            onNodeConfigChange(key, value);
-          }}
-        />
-        <ColorPicker
-          label="填充"
-          value={nodeConfig.fill}
-          onChange={(value: string) => {
-            onNodeConfigChange('fill', value);
-          }}
-        />
-        <ColorPicker
-          label="边框"
-          value={nodeConfig.stroke}
-          onChange={(value: string) => {
-            onNodeConfigChange('stroke', value);
-          }}
-        />
-        <InputNumberFiled
-          label="消息数量"
-          value={nodeConfig.count}
-          onChange={value => {
-            onNodeConfigChange('count', value);
-          }}
-        />
-        <div style={{ display: 'flex' }}>
-          <InputNumberFiled
-            label="字号"
-            value={nodeConfig.fontSize}
-            width={68}
-            onChange={value => {
-              onNodeConfigChange('fontSize', value);
+      {meta?.editMode != 2 && (
+        <div className={`${PREFIX}-panel-group`}>
+          <h5>样式</h5>
+          <Position
+            x={nodeConfig.x}
+            y={nodeConfig.y}
+            onChange={(key, value) => {
+              onNodeConfigChange(key, value);
+            }}
+          />
+          <Size
+            width={nodeConfig.width}
+            height={nodeConfig.height}
+            onChange={(key, value) => {
+              onNodeConfigChange(key, value);
             }}
-            style={{ marginRight: 10 }}
           />
           <ColorPicker
-            value={nodeConfig.fontFill}
+            label="填充"
+            value={nodeConfig.fill}
             onChange={(value: string) => {
-              onNodeConfigChange('fontFill', value);
+              onNodeConfigChange('fill', value);
             }}
           />
+          <ColorPicker
+            label="边框"
+            value={nodeConfig.stroke}
+            onChange={(value: string) => {
+              onNodeConfigChange('stroke', value);
+            }}
+          />
+          <InputNumberFiled
+            label="消息数量"
+            value={nodeConfig.count}
+            onChange={value => {
+              onNodeConfigChange('count', value);
+            }}
+          />
+          <div style={{ display: 'flex' }}>
+            <InputNumberFiled
+              label="字号"
+              value={nodeConfig.fontSize}
+              width={68}
+              onChange={value => {
+                onNodeConfigChange('fontSize', value);
+              }}
+              style={{ marginRight: 10 }}
+            />
+            <ColorPicker
+              value={nodeConfig.fontFill}
+              onChange={(value: string) => {
+                onNodeConfigChange('fontFill', value);
+              }}
+            />
+          </div>
         </div>
-      </div>
+      )}
+
       <Button type="primary" onClick={onSave}>
         保存
       </Button>

+ 6 - 3
src/pages/PurchaseAdmin/PurchaseList/Flow/Flow.js

@@ -5,7 +5,10 @@ import { UnityAction } from '@/utils/utils';
 import { Button } from 'antd';
 import router from 'umi/router';
 
-@connect(({ xflow }) => ({ flowDetail: xflow.flowDetail }))
+@connect(({ xflow, user }) => ({
+  flowDetail: xflow.flowDetail,
+  permission: user.currentUser.Permission,
+}))
 class FlowPage extends React.PureComponent {
   onUpdate(node) {
     const { dispatch, flowDetail } = this.props;
@@ -61,7 +64,7 @@ class FlowPage extends React.PureComponent {
     UnityAction.off('NODE_SAVE');
   }
   render() {
-    const { flowDetail } = this.props;
+    const { flowDetail, permission } = this.props;
     return (
       <div>
         {/* <Form></Form> */}
@@ -69,7 +72,7 @@ class FlowPage extends React.PureComponent {
           返回
         </Button>
         <Flow
-          meta={{ type: 'edit', flowId: 1 }}
+          meta={{ type: 'edit', editMode: permission['func-01-point-bom-flow'] ? 1 : 2, flowId: 1 }}
           flowDetail={flowDetail}
           // onUpdate={node => this.onUpdate(node)}
         />

+ 95 - 57
src/pages/PurchaseAdmin/PurchaseList/Flow/FlowDetail.json

@@ -5,8 +5,6 @@
       "id": "41561012",
       "renderKey": "custom-rect",
       "name": "custom-rect",
-      "flow_id": 0,
-      "node_type": 0,
       "label": "BOM-1",
       "width": 120,
       "height": 50,
@@ -22,14 +20,16 @@
       "parentKey": "1",
       "x": -580,
       "y": -150,
-      "zIndex": 10
+      "zIndex": 10,
+      "flow_id": 0,
+      "node_type": 0,
+      "count": 0,
+      "role_list": "139"
     },
     {
       "id": "975bf288",
       "renderKey": "custom-circle",
       "name": "custom-circle",
-      "flow_id": 5,
-      "node_type": 1,
       "label": "方案总审",
       "width": 90,
       "height": 90,
@@ -45,14 +45,16 @@
       "parentKey": "1",
       "x": -290,
       "y": -170,
-      "zIndex": 10
+      "zIndex": 10,
+      "flow_id": 5,
+      "node_type": 1,
+      "count": 0,
+      "role_list": ""
     },
     {
       "id": "5764f3ce",
       "renderKey": "custom-rect",
       "name": "custom-rect",
-      "flow_id": 0,
-      "node_type": 0,
       "label": "投标清单",
       "width": 120,
       "height": 50,
@@ -68,14 +70,16 @@
       "parentKey": "1",
       "x": -138,
       "y": -150,
-      "zIndex": 10
+      "zIndex": 10,
+      "flow_id": 0,
+      "node_type": 0,
+      "count": 0,
+      "role_list": "139"
     },
     {
       "id": "5359e23c",
       "renderKey": "custom-circle",
       "name": "custom-circle",
-      "flow_id": 9,
-      "node_type": 1,
       "label": "三级审批2",
       "width": 90,
       "height": 90,
@@ -91,14 +95,16 @@
       "parentKey": "1",
       "x": -369,
       "y": 6,
-      "zIndex": 10
+      "zIndex": 10,
+      "flow_id": 9,
+      "node_type": 1,
+      "count": 0,
+      "role_list": ""
     },
     {
       "id": "c28a18d3",
       "renderKey": "custom-rect",
       "name": "custom-rect",
-      "flow_id": 0,
-      "node_type": 0,
       "label": "采购执行",
       "width": 120,
       "height": 50,
@@ -114,14 +120,16 @@
       "parentKey": "1",
       "x": -162,
       "y": 26,
-      "zIndex": 10
+      "zIndex": 10,
+      "flow_id": 0,
+      "node_type": 0,
+      "count": 0,
+      "role_list": "147"
     },
     {
       "id": "5216c5dc",
       "renderKey": "custom-rect",
       "name": "custom-rect",
-      "flow_id": 0,
-      "node_type": 0,
       "label": "采购合同",
       "width": 120,
       "height": 50,
@@ -137,14 +145,16 @@
       "parentKey": "1",
       "x": -580,
       "y": 26,
-      "zIndex": 10
+      "zIndex": 10,
+      "flow_id": 0,
+      "node_type": 0,
+      "count": 0,
+      "role_list": "147"
     },
     {
       "id": "8c1f18d0",
       "renderKey": "custom-rect",
       "name": "custom-rect",
-      "flow_id": 0,
-      "node_type": 0,
       "label": "预算",
       "width": 120,
       "height": 50,
@@ -160,14 +170,16 @@
       "parentKey": "1",
       "x": -305,
       "y": -304,
-      "zIndex": 10
+      "zIndex": 10,
+      "flow_id": 0,
+      "node_type": 0,
+      "count": 0,
+      "role_list": "148"
     },
     {
       "id": "1aed14d1",
       "renderKey": "custom-rect",
       "name": "custom-rect",
-      "flow_id": 0,
-      "node_type": 0,
       "label": "初版PSR",
       "width": 120,
       "height": 50,
@@ -183,14 +195,16 @@
       "parentKey": "1",
       "x": -138,
       "y": -304,
-      "zIndex": 10
+      "zIndex": 10,
+      "flow_id": 0,
+      "node_type": 0,
+      "count": 0,
+      "role_list": ""
     },
     {
       "id": "4651130e",
       "renderKey": "custom-circle",
       "name": "custom-circle",
-      "flow_id": 2,
-      "node_type": 1,
       "label": "PSR审批",
       "width": 90,
       "height": 90,
@@ -206,14 +220,16 @@
       "parentKey": "1",
       "x": 356,
       "y": -324,
-      "zIndex": 10
+      "zIndex": 10,
+      "flow_id": 2,
+      "node_type": 1,
+      "count": 0,
+      "role_list": ""
     },
     {
       "id": "a48131e0",
       "renderKey": "custom-rect",
       "name": "custom-rect",
-      "flow_id": 0,
-      "node_type": 0,
       "label": "合同清单",
       "width": 120,
       "height": 50,
@@ -229,14 +245,16 @@
       "parentKey": "1",
       "x": 446,
       "y": -150,
-      "zIndex": 10
+      "zIndex": 10,
+      "flow_id": 0,
+      "node_type": 0,
+      "count": 0,
+      "role_list": "139"
     },
     {
       "id": "b57b57c8",
       "renderKey": "custom-rect",
       "name": "custom-rect",
-      "flow_id": 0,
-      "node_type": 0,
       "label": "终版PSR",
       "width": 120,
       "height": 50,
@@ -252,14 +270,16 @@
       "parentKey": "1",
       "x": 621,
       "y": -150,
-      "zIndex": 10
+      "zIndex": 10,
+      "flow_id": 0,
+      "node_type": 0,
+      "count": 0,
+      "role_list": ""
     },
     {
       "id": "3631eae9",
       "renderKey": "custom-rect",
       "name": "custom-rect",
-      "flow_id": 0,
-      "node_type": 0,
       "label": "采购清单",
       "width": 120,
       "height": 50,
@@ -275,14 +295,16 @@
       "parentKey": "1",
       "x": 446,
       "y": 26,
-      "zIndex": 10
+      "zIndex": 10,
+      "flow_id": 0,
+      "node_type": 0,
+      "count": 0,
+      "role_list": "139"
     },
     {
       "id": "3fb8d302",
       "renderKey": "custom-circle",
       "name": "custom-circle",
-      "flow_id": 7,
-      "node_type": 1,
       "label": "事业部",
       "width": 90,
       "height": 90,
@@ -298,14 +320,16 @@
       "parentKey": "1",
       "x": 308,
       "y": -170,
-      "zIndex": 10
+      "zIndex": 10,
+      "flow_id": 7,
+      "node_type": 1,
+      "count": 0,
+      "role_list": ""
     },
     {
       "id": "399bddb7",
       "renderKey": "custom-circle",
       "name": "custom-circle",
-      "flow_id": 8,
-      "node_type": 1,
       "label": "三级审批1",
       "width": 90,
       "height": 90,
@@ -321,14 +345,16 @@
       "parentKey": "1",
       "x": 42,
       "y": 6,
-      "zIndex": 10
+      "zIndex": 10,
+      "flow_id": 8,
+      "node_type": 1,
+      "count": 0,
+      "role_list": ""
     },
     {
       "id": "2427bf29",
       "renderKey": "custom-circle",
       "name": "custom-circle",
-      "flow_id": 3,
-      "node_type": 1,
       "label": "工艺分部经理",
       "width": 90,
       "height": 90,
@@ -344,14 +370,16 @@
       "parentKey": "1",
       "x": -425,
       "y": -224,
-      "zIndex": 10
+      "zIndex": 10,
+      "flow_id": 3,
+      "node_type": 1,
+      "count": 0,
+      "role_list": ""
     },
     {
       "id": "be25fe75",
       "renderKey": "custom-circle",
       "name": "custom-circle",
-      "flow_id": 4,
-      "node_type": 1,
       "label": "电气分部经理",
       "width": 90,
       "height": 90,
@@ -367,14 +395,16 @@
       "parentKey": "1",
       "x": -425,
       "y": -115,
-      "zIndex": 10
+      "zIndex": 10,
+      "flow_id": 4,
+      "node_type": 1,
+      "count": 0,
+      "role_list": ""
     },
     {
       "id": "node-186a9d31-0bd3-4b36-b61f-6b5380c824db",
       "renderKey": "custom-circle",
       "name": "custom-circle",
-      "flow_id": 3,
-      "node_type": 1,
       "label": "工艺分部经理",
       "width": 90,
       "height": 90,
@@ -390,14 +420,16 @@
       "parentKey": "1",
       "x": 27,
       "y": -224,
-      "zIndex": 10
+      "zIndex": 10,
+      "flow_id": 3,
+      "node_type": 1,
+      "count": 0,
+      "role_list": ""
     },
     {
       "id": "node-c5171e2d-1cd8-4019-83dc-9f2ed0cab6e8",
       "renderKey": "custom-circle",
       "name": "custom-circle",
-      "flow_id": 4,
-      "node_type": 1,
       "label": "电气分部经理",
       "width": 90,
       "height": 90,
@@ -413,14 +445,16 @@
       "parentKey": "1",
       "x": 27,
       "y": -115,
-      "zIndex": 10
+      "zIndex": 10,
+      "flow_id": 4,
+      "node_type": 1,
+      "count": 0,
+      "role_list": ""
     },
     {
       "id": "node-2b3fc359-de49-4f9d-adb5-4eb70b6ba862",
       "renderKey": "custom-circle",
       "name": "custom-circle",
-      "flow_id": 5,
-      "node_type": 1,
       "label": "方案总审",
       "width": 90,
       "height": 90,
@@ -436,7 +470,11 @@
       "parentKey": "1",
       "x": 173,
       "y": -170,
-      "zIndex": 10
+      "zIndex": 10,
+      "flow_id": 5,
+      "node_type": 1,
+      "count": 0,
+      "role_list": ""
     }
   ],
   "edges": [