lanjianrong 3 gadi atpakaļ
vecāks
revīzija
89aea1eb4c
30 mainītis faili ar 417 papildinājumiem un 451 dzēšanām
  1. 0 6
      .eslintrc.js
  2. 6 8
      config/config.ts
  3. 5 5
      config/routes.ts
  4. 19 210
      pnpm-lock.yaml
  5. 0 3
      src/components/Flow/index.ts
  6. 0 116
      src/components/Flow/src/components/Drawer/index.tsx
  7. 0 30
      src/components/Flow/src/enum/index.ts
  8. 16 22
      src/pages/Institutions/Company/Detail/components/Role.tsx
  9. 5 8
      src/pages/Institutions/Company/Detail/components/Staff.tsx
  10. 6 3
      src/pages/Institutions/Company/Detail/index.tsx
  11. 2 3
      src/pages/Institutions/Staff/components/StaffDetail.tsx
  12. 5 8
      src/pages/Institutions/Staff/index.tsx
  13. 3 3
      src/pages/Project/Created/index.tsx
  14. 2 2
      src/pages/Project/Management/List/components/TreeNodeSelect.tsx
  15. 229 0
      src/pages/Project/Verification/Detail/Flow/components/Drawer/index.tsx
  16. 0 0
      src/pages/Project/Verification/Detail/Flow/components/Edge/index.less
  17. 0 0
      src/pages/Project/Verification/Detail/Flow/components/Edge/index.tsx
  18. 0 0
      src/pages/Project/Verification/Detail/Flow/components/Graph/FloatingEdge.tsx
  19. 0 0
      src/pages/Project/Verification/Detail/Flow/components/Graph/index.tsx
  20. 0 0
      src/pages/Project/Verification/Detail/Flow/components/Node/index.tsx
  21. 0 0
      src/pages/Project/Verification/Detail/Flow/components/Toolbar/index.tsx
  22. 0 0
      src/pages/Project/Verification/Detail/Flow/context/index.tsx
  23. 0 0
      src/pages/Project/Verification/Detail/Flow/context/reducer.ts
  24. 30 0
      src/pages/Project/Verification/Detail/Flow/enum/index.ts
  25. 0 0
      src/pages/Project/Verification/Detail/Flow/index.less
  26. 0 0
      src/pages/Project/Verification/Detail/Flow/index.tsx
  27. 57 0
      src/components/Flow/src/utils.ts
  28. 1 1
      src/pages/Project/Verification/Detail.tsx
  29. 29 21
      src/pages/Schema/Base/components/Designable/index.tsx
  30. 2 2
      src/services/api/institution.ts

+ 0 - 6
.eslintrc.js

@@ -25,12 +25,6 @@ module.exports = {
       }
     ],
     'react-hooks/exhaustive-deps': 0,
-    'no-unused-expressions': [
-      'error',
-      {
-        allowShortCircuit: true
-      }
-    ],
     '@typescript-eslint/no-unused-expressions': 0
   }
 }

+ 6 - 8
config/config.ts

@@ -53,14 +53,12 @@ export default defineConfig({
     config.plugin('windicss').use(WindiCSSPlugin)
   },
   extraBabelPlugins: [
-    // [
-    //   'import',
-    //   {
-    //     libraryName: '@icon-park/react',
-    //     libraryDirectory: 'es/icons',
-    //     camel2DashComponentName: false
-    //   }
-    // ]
+    ['babel-plugin-import', { libraryName: 'antd', libraryDirectory: 'es', style: true }, 'antd'],
+    [
+      'babel-plugin-import',
+      { libraryName: '@formily/antd', libraryDirectory: 'esm', style: true },
+      '@formily/antd'
+    ]
   ],
   // Fast Refresh 热更新
   fastRefresh: {},

+ 5 - 5
config/routes.ts

@@ -59,11 +59,11 @@
           }
         ]
       },
-      // {
-      //   path: '/project/verification',
-      //   name: 'verification',
-      //   component: './Project/Verification'
-      // },
+      {
+        path: '/project/verification',
+        name: 'verification',
+        component: './Project/Verification'
+      },
       {
         path: '/project/created',
         name: 'created',

+ 19 - 210
pnpm-lock.yaml

@@ -53,8 +53,6 @@ specifiers:
   eslint-plugin-react: ^7.28.0
   eslint-plugin-typescript: ^0.14.0
   express: ^4.17.1
-  form-render: 1.7.3
-  fr-generator: ^2.7.3
   gh-pages: ^3.0.0
   jsdom-global: ^3.0.2
   lint-staged: ^10.0.0
@@ -100,11 +98,8 @@ dependencies:
   '@umijs/route-utils': registry.npmmirror.com/@umijs/route-utils/1.0.37
   ahooks: registry.npmmirror.com/ahooks/3.1.9_react@17.0.2
   antd: registry.npmmirror.com/antd/4.18.7_react-dom@17.0.2+react@17.0.2
-  babel-plugin-import: registry.npmmirror.com/babel-plugin-import/1.13.3
   classnames: registry.npmmirror.com/classnames/2.3.1
   dayjs: registry.npmmirror.com/dayjs/1.10.7
-  form-render: registry.npmmirror.com/form-render/1.7.3_57ac49da97db5dccedfb24f1f58a1993
-  fr-generator: registry.npmmirror.com/fr-generator/2.7.6_b8fdba992ce7d797017dc07106486496
   lodash: registry.npmmirror.com/lodash/4.17.21
   moment: registry.npmmirror.com/moment/2.29.1
   omit.js: registry.npmmirror.com/omit.js/2.0.2
@@ -134,6 +129,7 @@ devDependencies:
   '@umijs/preset-react': registry.npmmirror.com/@umijs/preset-react/1.8.30_b32eece633a2bcd2d55385ae5355dbbc
   '@umijs/yorkie': registry.npmmirror.com/@umijs/yorkie/2.0.5
   babel-eslint: registry.npmmirror.com/babel-eslint/10.1.0_eslint@6.8.0
+  babel-plugin-import: registry.npmmirror.com/babel-plugin-import/1.13.3
   browserslist: registry.npmmirror.com/browserslist/4.19.1
   carlo: registry.npmmirror.com/carlo/0.9.46
   cross-env: registry.npmmirror.com/cross-env/7.0.3
@@ -323,6 +319,7 @@ packages:
     resolution: {integrity: sha1-EdCRMSI5648yyPJa6csAL/6NPCQ=, registry: https://registry.npm.taobao.org/, tarball: https://registry.nlark.com/component-indexof/download/component-indexof-0.0.3.tgz}
     name: component-indexof
     version: 0.0.3
+    dev: true
 
   registry.nlark.com/concat-map/0.0.1:
     resolution: {integrity: sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=, registry: https://registry.npm.taobao.org/, tarball: https://registry.nlark.com/concat-map/download/concat-map-0.0.1.tgz}
@@ -4897,24 +4894,6 @@ packages:
     name: '@qixian.cs/path-to-regexp'
     version: 6.1.0
 
-  registry.npmmirror.com/@react-dnd/asap/4.0.0:
-    resolution: {integrity: sha512-0XhqJSc6pPoNnf8DhdsPHtUhRzZALVzYMTzRwV4VI6DJNJ/5xxfL9OQUwb8IH5/2x7lSf7nAZrnzUD+16VyOVQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@react-dnd/asap/-/asap-4.0.0.tgz}
-    name: '@react-dnd/asap'
-    version: 4.0.0
-    dev: false
-
-  registry.npmmirror.com/@react-dnd/invariant/2.0.0:
-    resolution: {integrity: sha512-xL4RCQBCBDJ+GRwKTFhGUW8GXa4yoDfJrPbLblc3U09ciS+9ZJXJ3Qrcs/x2IODOdIE5kQxvMmE2UKyqUictUw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@react-dnd/invariant/-/invariant-2.0.0.tgz}
-    name: '@react-dnd/invariant'
-    version: 2.0.0
-    dev: false
-
-  registry.npmmirror.com/@react-dnd/shallowequal/2.0.0:
-    resolution: {integrity: sha512-Pc/AFTdwZwEKJxFJvlxrSmGe/di+aAOBn60sremrpLo6VI/6cmiUYNNwlI5KNYttg7uypzA3ILPMPgxB2GYZEg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@react-dnd/shallowequal/-/shallowequal-2.0.0.tgz}
-    name: '@react-dnd/shallowequal'
-    version: 2.0.0
-    dev: false
-
   registry.npmmirror.com/@sindresorhus/is/0.14.0:
     resolution: {integrity: sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@sindresorhus/is/-/is-0.14.0.tgz}
     name: '@sindresorhus/is'
@@ -6574,6 +6553,7 @@ packages:
     version: 1.1.0
     dependencies:
       object-assign: registry.npmmirror.com/object-assign/4.1.1
+    dev: true
 
   registry.npmmirror.com/address/1.1.2:
     resolution: {integrity: sha512-aT6camzM4xEA54YVJYSqxz1kv4IHnQZRtThJJHhUMRExaU5spC7jX5ugSwTaTgJliIgs4VhZOk7htClvQ/LmRA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/address/-/address-1.1.2.tgz}
@@ -7096,12 +7076,6 @@ packages:
     version: 1.0.1
     dev: true
 
-  registry.npmmirror.com/async-validator/3.5.2:
-    resolution: {integrity: sha512-8eLCg00W9pIRZSB781UUX/H6Oskmm8xloZfr09lz5bikRpBVDlJ3hRVuxxP1SxcwsEYfJ4IU8Q19Y8/893r3rQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/async-validator/-/async-validator-3.5.2.tgz}
-    name: async-validator
-    version: 3.5.2
-    dev: false
-
   registry.npmmirror.com/async-validator/4.0.7:
     resolution: {integrity: sha512-Pj2IR7u8hmUEDOwB++su6baaRi+QvsgajuFB9j95foM1N2gy5HM4z60hfusIO0fBPG5uLAEl6yCJr1jNSVugEQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/async-validator/-/async-validator-4.0.7.tgz}
     name: async-validator
@@ -7254,7 +7228,7 @@ packages:
     dependencies:
       '@babel/helper-module-imports': registry.npmmirror.com/@babel/helper-module-imports/7.16.7
       '@babel/runtime': registry.npmmirror.com/@babel/runtime/7.17.2
-    dev: false
+    dev: true
 
   registry.npmmirror.com/babel-plugin-istanbul/5.2.0:
     resolution: {integrity: sha512-5LphC0USA8t4i1zCtjbbNb6jJj/9+X6P37Qfirc/70EQ34xKlMW+a1RHGwxGI+SwWpNwZ27HqvzAobeqaXwiZw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/babel-plugin-istanbul/-/babel-plugin-istanbul-5.2.0.tgz}
@@ -7423,6 +7397,7 @@ packages:
     dependencies:
       core-js: registry.npmmirror.com/core-js/2.6.12
       regenerator-runtime: registry.npmmirror.com/regenerator-runtime/0.11.1
+    dev: true
 
   registry.npmmirror.com/babel-types/6.26.0:
     resolution: {integrity: sha512-zhe3V/26rCWsEZK8kZN+HaQj5yQ1CilTObixFzKW1UWjqG7618Twz6YEsCnjfg5gBcJh02DrpCkS9h98ZqDY+g==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/babel-types/-/babel-types-6.26.0.tgz}
@@ -8316,6 +8291,7 @@ packages:
     name: clone
     version: 2.1.2
     engines: {node: '>=0.8'}
+    dev: true
 
   registry.npmmirror.com/cloneable-readable/1.1.3:
     resolution: {integrity: sha512-2EF8zTQOxYq70Y4XKtorQupqF0m49MBz2/yf5Bj+MHjvpG3Hy7sImifnqD6UA+TKYxeSV+u6qqQPawN5UvnpKQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/cloneable-readable/-/cloneable-readable-1.1.3.tgz}
@@ -8387,24 +8363,7 @@ packages:
     resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/color-name/-/color-name-1.1.4.tgz}
     name: color-name
     version: 1.1.4
-
-  registry.npmmirror.com/color-string/1.9.0:
-    resolution: {integrity: sha512-9Mrz2AQLefkH1UvASKj6v6hj/7eWgjnT/cVsR8CumieLoT+g900exWeNogqtweI8dxloXN9BDQTYro1oWu/5CQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/color-string/-/color-string-1.9.0.tgz}
-    name: color-string
-    version: 1.9.0
-    dependencies:
-      color-name: registry.npmmirror.com/color-name/1.1.4
-      simple-swizzle: registry.npmmirror.com/simple-swizzle/0.2.2
-    dev: false
-
-  registry.npmmirror.com/color/3.2.1:
-    resolution: {integrity: sha512-aBl7dZI9ENN6fUGC7mWpMTPNHmWUSNan9tuWN6ahh5ZLNk9baLJOnSMlrQkHcrfFgz2/RigjUVAjdx36VcemKA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/color/-/color-3.2.1.tgz}
-    name: color
-    version: 3.2.1
-    dependencies:
-      color-convert: registry.npmmirror.com/color-convert/1.9.3
-      color-string: registry.npmmirror.com/color-string/1.9.0
-    dev: false
+    dev: true
 
   registry.npmmirror.com/colorette/2.0.16:
     resolution: {integrity: sha512-hUewv7oMjCp+wkBv5Rm0v87eJhq4woh5rSR+42YSQJKecCqgIqNkZ6lAlQms/BwHPJA5NKMRlpxPRv0n8HQW6g==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/colorette/-/colorette-2.0.16.tgz}
@@ -8444,6 +8403,7 @@ packages:
     version: 1.2.6
     dependencies:
       component-indexof: registry.nlark.com/component-indexof/0.0.3
+    dev: true
 
   registry.npmmirror.com/component-emitter/1.3.0:
     resolution: {integrity: sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/component-emitter/-/component-emitter-1.3.0.tgz}
@@ -8588,13 +8548,6 @@ packages:
     version: 0.1.1
     engines: {node: '>=0.10.0'}
 
-  registry.npmmirror.com/copy-text-to-clipboard/2.2.0:
-    resolution: {integrity: sha512-WRvoIdnTs1rgPMkgA2pUOa/M4Enh2uzCwdKsOMYNAJiz/4ZvEJgmbF4OmninPmlFdAWisfeh0tH+Cpf7ni3RqQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/copy-text-to-clipboard/-/copy-text-to-clipboard-2.2.0.tgz}
-    name: copy-text-to-clipboard
-    version: 2.2.0
-    engines: {node: '>=6'}
-    dev: false
-
   registry.npmmirror.com/copy-to-clipboard/3.3.1:
     resolution: {integrity: sha512-i13qo6kIHTTpCm8/Wup+0b1mVWETvu2kIMzKoK8FpkLkFxlt0znUAHcMzox+T8sPlqtZXq3CulEjQHsYiGFJUw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/copy-to-clipboard/-/copy-to-clipboard-3.3.1.tgz}
     name: copy-to-clipboard
@@ -8629,6 +8582,7 @@ packages:
     version: 2.6.12
     deprecated: core-js@<3.4 is no longer maintained and not recommended for usage due to the number of issues. Because of the V8 engine whims, feature detection in old core-js versions could cause a slowdown up to 100x even if nothing is polyfilled. Please, upgrade your dependencies to the actual version of core-js.
     requiresBuild: true
+    dev: true
 
   registry.npmmirror.com/core-js/3.21.1:
     resolution: {integrity: sha512-FRq5b/VMrWlrmCzwRrpDYNxyHP9BcAZC+xHJaqTgIE5091ZV1NTmyh0sGOg5XqpnHvR0svdy0sv1gWA1zmhxig==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/core-js/-/core-js-3.21.1.tgz}
@@ -8740,6 +8694,7 @@ packages:
     dependencies:
       loose-envify: registry.npmmirror.com/loose-envify/1.4.0
       object-assign: registry.npmmirror.com/object-assign/4.1.1
+    dev: true
 
   registry.npmmirror.com/crequire/1.8.1:
     resolution: {integrity: sha1-rIHyBHhrXyARlOsWmM9EGxCktX0=, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/crequire/download/crequire-1.8.1.tgz}
@@ -8828,6 +8783,7 @@ packages:
     dependencies:
       babel-runtime: registry.npmmirror.com/babel-runtime/6.26.0
       component-classes: registry.npmmirror.com/component-classes/1.2.6
+    dev: true
 
   registry.npmmirror.com/css-blank-pseudo/0.1.4:
     resolution: {integrity: sha512-LHz35Hr83dnFeipc7oqFDmsjHdljj3TQtxGGiNWSOsTLIAubSm4TEz8qCaKFpk7idaQ1GfWscF4E6mgpBysA1w==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/css-blank-pseudo/-/css-blank-pseudo-0.1.4.tgz}
@@ -9314,16 +9270,6 @@ packages:
     dependencies:
       path-type: registry.npmmirror.com/path-type/4.0.0
 
-  registry.npmmirror.com/dnd-core/14.0.1:
-    resolution: {integrity: sha512-+PVS2VPTgKFPYWo3vAFEA8WPbTf7/xo43TifH9G8S1KqnrQu0o77A3unrF5yOugy4mIz7K5wAVFHUcha7wsz6A==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/dnd-core/-/dnd-core-14.0.1.tgz}
-    name: dnd-core
-    version: 14.0.1
-    dependencies:
-      '@react-dnd/asap': registry.npmmirror.com/@react-dnd/asap/4.0.0
-      '@react-dnd/invariant': registry.npmmirror.com/@react-dnd/invariant/2.0.0
-      redux: registry.npmmirror.com/redux/4.1.2
-    dev: false
-
   registry.npmmirror.com/doctrine/2.1.0:
     resolution: {integrity: sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/doctrine/-/doctrine-2.1.0.tgz}
     name: doctrine
@@ -11135,56 +11081,6 @@ packages:
       mime-types: registry.npmmirror.com/mime-types/2.1.34
     dev: true
 
-  registry.npmmirror.com/form-render/1.7.3_57ac49da97db5dccedfb24f1f58a1993:
-    resolution: {integrity: sha512-aRwPUDl0Ch2DCS0aCaV81mTSP7HbbIHEQNsaE+2DZu+hduvO0OkV6xMn8GWsNkcKM/6N77afDSaPw8cwjqxfDA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/form-render/-/form-render-1.7.3.tgz}
-    id: registry.npmmirror.com/form-render/1.7.3
-    name: form-render
-    version: 1.7.3
-    peerDependencies:
-      antd: 4.x
-      react: '>=16.8.0'
-      react-dom: '>=16.8.0'
-    dependencies:
-      '@ant-design/icons': registry.npmmirror.com/@ant-design/icons/4.7.0_react-dom@17.0.2+react@17.0.2
-      antd: registry.npmmirror.com/antd/4.18.7_react-dom@17.0.2+react@17.0.2
-      async-validator: registry.npmmirror.com/async-validator/3.5.2
-      color: registry.npmmirror.com/color/3.2.1
-      lodash-es: registry.npmmirror.com/lodash-es/4.17.21
-      moment: registry.npmmirror.com/moment/2.29.1
-      nanoid: registry.npmmirror.com/nanoid/3.3.1
-      rc-color-picker: registry.npmmirror.com/rc-color-picker/1.2.6_react-dom@17.0.2+react@17.0.2
-      react: registry.npmmirror.com/react/17.0.2
-      react-dom: registry.npmmirror.com/react-dom/17.0.2_react@17.0.2
-      virtualizedtableforantd4: registry.npmmirror.com/virtualizedtableforantd4/1.1.4_57ac49da97db5dccedfb24f1f58a1993
-    dev: false
-
-  registry.npmmirror.com/fr-generator/2.7.6_b8fdba992ce7d797017dc07106486496:
-    resolution: {integrity: sha512-1p3Rg0Y9Loo2Hu2ORR4R9Bwb7a+ab/IJbZTg2cyAdAuAXJr65GOgRUUZmjse4k6jZXKpwXLjKbcr9YL6Nrp1iw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/fr-generator/-/fr-generator-2.7.6.tgz}
-    id: registry.npmmirror.com/fr-generator/2.7.6
-    name: fr-generator
-    version: 2.7.6
-    peerDependencies:
-      react: '>=16.14.0'
-      react-dom: '>=16.14.0'
-    dependencies:
-      antd: registry.npmmirror.com/antd/4.18.7_react-dom@17.0.2+react@17.0.2
-      clone: registry.npmmirror.com/clone/2.1.2
-      copy-text-to-clipboard: registry.npmmirror.com/copy-text-to-clipboard/2.2.0
-      form-render: registry.npmmirror.com/form-render/1.7.3_57ac49da97db5dccedfb24f1f58a1993
-      moment: registry.npmmirror.com/moment/2.29.1
-      nanoid: registry.npmmirror.com/nanoid/3.3.1
-      rc-color-picker: registry.npmmirror.com/rc-color-picker/1.2.6_react-dom@17.0.2+react@17.0.2
-      react: registry.npmmirror.com/react/17.0.2
-      react-dnd: registry.npmmirror.com/react-dnd/14.0.5_a0c521d4794c7ad97f5f4c1c4a7d5818
-      react-dnd-html5-backend: registry.npmmirror.com/react-dnd-html5-backend/14.1.0
-      react-dom: registry.npmmirror.com/react-dom/17.0.2_react@17.0.2
-      react-sortable-hoc: registry.npmmirror.com/react-sortable-hoc/2.0.0_react-dom@17.0.2+react@17.0.2
-    transitivePeerDependencies:
-      - '@types/hoist-non-react-statics'
-      - '@types/node'
-      - '@types/react'
-    dev: false
-
   registry.npmmirror.com/fragment-cache/0.2.1:
     resolution: {integrity: sha512-GMBAbW9antB8iZRHLoGw0b3HANt57diZYFO/HL1JGIC1MjKrdmhxvrJbupnVvpys0zsz7yBApXdQyfepKly2kA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/fragment-cache/-/fragment-cache-0.2.1.tgz}
     name: fragment-cache
@@ -12354,12 +12250,6 @@ packages:
     name: is-arrayish
     version: 0.2.1
 
-  registry.npmmirror.com/is-arrayish/0.3.2:
-    resolution: {integrity: sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/is-arrayish/-/is-arrayish-0.3.2.tgz}
-    name: is-arrayish
-    version: 0.3.2
-    dev: false
-
   registry.npmmirror.com/is-bigint/1.0.4:
     resolution: {integrity: sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/is-bigint/-/is-bigint-1.0.4.tgz}
     name: is-bigint
@@ -14779,6 +14669,7 @@ packages:
     version: 3.3.1
     engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1}
     hasBin: true
+    dev: true
 
   registry.npmmirror.com/nanomatch/1.2.13:
     resolution: {integrity: sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/nanomatch/-/nanomatch-1.2.13.tgz}
@@ -15681,6 +15572,7 @@ packages:
     resolution: {integrity: sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/performance-now/-/performance-now-2.1.0.tgz}
     name: performance-now
     version: 2.1.0
+    dev: true
 
   registry.npmmirror.com/picocolors/0.2.1:
     resolution: {integrity: sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/picocolors/-/picocolors-0.2.1.tgz}
@@ -16764,6 +16656,7 @@ packages:
     version: 3.4.1
     dependencies:
       performance-now: registry.npmmirror.com/performance-now/2.1.0
+    dev: true
 
   registry.npmmirror.com/railroad-diagrams/1.0.0:
     resolution: {integrity: sha512-cz93DjNeLY0idrCNOH6PviZGRN9GJhsdm9hpn1YCS879fj4W+x5IFJhhkRZcwVgMmFF7R82UA/7Oh+R8lLZg6A==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/railroad-diagrams/-/railroad-diagrams-1.0.0.tgz}
@@ -16837,6 +16730,7 @@ packages:
       dom-align: registry.npmmirror.com/dom-align/1.12.2
       prop-types: registry.npmmirror.com/prop-types/15.8.1
       rc-util: registry.npmmirror.com/rc-util/4.21.1
+    dev: true
 
   registry.npmmirror.com/rc-align/4.0.11_react-dom@17.0.2+react@17.0.2:
     resolution: {integrity: sha512-n9mQfIYQbbNTbefyQnRHZPWuTEwG1rY4a9yKlIWHSTbgwI+XUMGRYd0uJ5pE2UbrNX0WvnMBA1zJ3Lrecpra/A==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/rc-align/-/rc-align-4.0.11.tgz}
@@ -16868,6 +16762,7 @@ packages:
       raf: registry.npmmirror.com/raf/3.4.1
       rc-util: registry.npmmirror.com/rc-util/4.21.1
       react-lifecycles-compat: registry.npmmirror.com/react-lifecycles-compat/3.0.4
+    dev: true
 
   registry.npmmirror.com/rc-cascader/3.2.6_react-dom@17.0.2+react@17.0.2:
     resolution: {integrity: sha512-3CmlJP7jPVlP5jT+O3PrP8E9yxees48Na7Hiir84ktcw11pUUU5YawAhuRoSc09SGVvRcP70a9gCu94Hqp3ZwA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/rc-cascader/-/rc-cascader-3.2.6.tgz}
@@ -16940,24 +16835,6 @@ packages:
       react-dom: registry.npmmirror.com/react-dom/17.0.2_react@17.0.2
       shallowequal: registry.npmmirror.com/shallowequal/1.1.0
 
-  registry.npmmirror.com/rc-color-picker/1.2.6_react-dom@17.0.2+react@17.0.2:
-    resolution: {integrity: sha512-AaC9Pg7qCHSy5M4eVbqDIaNb2FC4SEw82GOHB2C4R/+vF2FVa/r5XA+Igg5+zLPmAvBLhz9tL4MAfkRA8yWNJw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/rc-color-picker/-/rc-color-picker-1.2.6.tgz}
-    id: registry.npmmirror.com/rc-color-picker/1.2.6
-    name: rc-color-picker
-    version: 1.2.6
-    peerDependencies:
-      react: 16.x
-      react-dom: 16.x
-    dependencies:
-      classnames: registry.npmmirror.com/classnames/2.3.1
-      prop-types: registry.npmmirror.com/prop-types/15.8.1
-      rc-trigger: registry.npmmirror.com/rc-trigger/1.11.5
-      rc-util: registry.npmmirror.com/rc-util/4.21.1
-      react: registry.npmmirror.com/react/17.0.2
-      react-dom: registry.npmmirror.com/react-dom/17.0.2_react@17.0.2
-      tinycolor2: registry.npmmirror.com/tinycolor2/1.4.2
-    dev: false
-
   registry.npmmirror.com/rc-dialog/8.6.0_react-dom@17.0.2+react@17.0.2:
     resolution: {integrity: sha512-GSbkfqjqxpZC5/zc+8H332+q5l/DKUhpQr0vdX2uDsxo5K0PhvaMEVjyoJUTkZ3+JstEADQji1PVLVb/2bJeOQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/rc-dialog/-/rc-dialog-8.6.0.tgz}
     id: registry.npmmirror.com/rc-dialog/8.6.0
@@ -17452,19 +17329,6 @@ packages:
       react: registry.npmmirror.com/react/17.0.2
       react-dom: registry.npmmirror.com/react-dom/17.0.2_react@17.0.2
 
-  registry.npmmirror.com/rc-trigger/1.11.5:
-    resolution: {integrity: sha512-MBuUPw1nFzA4K7jQOwb7uvFaZFjXGd00EofUYiZ+l/fgKVq8wnLC0lkv36kwqM7vfKyftRo2sh7cWVpdPuNnnw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/rc-trigger/-/rc-trigger-1.11.5.tgz}
-    name: rc-trigger
-    version: 1.11.5
-    dependencies:
-      babel-runtime: registry.npmmirror.com/babel-runtime/6.26.0
-      create-react-class: registry.npmmirror.com/create-react-class/15.7.0
-      prop-types: registry.npmmirror.com/prop-types/15.8.1
-      rc-align: registry.npmmirror.com/rc-align/2.4.5
-      rc-animate: registry.npmmirror.com/rc-animate/2.11.1
-      rc-util: registry.npmmirror.com/rc-util/4.21.1
-    dev: false
-
   registry.npmmirror.com/rc-trigger/2.6.5:
     resolution: {integrity: sha512-m6Cts9hLeZWsTvWnuMm7oElhf+03GOjOLfTuU0QmdB9ZrW7jR2IpI5rpNM7i9MvAAlMAmTx5Zr7g3uu/aMvZAw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/rc-trigger/-/rc-trigger-2.6.5.tgz}
     name: rc-trigger
@@ -17522,6 +17386,7 @@ packages:
       react-is: registry.npmmirror.com/react-is/16.13.1
       react-lifecycles-compat: registry.npmmirror.com/react-lifecycles-compat/3.0.4
       shallowequal: registry.npmmirror.com/shallowequal/1.1.0
+    dev: true
 
   registry.npmmirror.com/rc-util/5.18.1_react-dom@17.0.2+react@17.0.2:
     resolution: {integrity: sha512-24xaSrMZUEKh1+suDOtJWfPe9E6YrwryViZcoPO0miJTKzP4qhUlV5AAlKQ82AJilz/AOHfi3l6HoX8qa1ye8w==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/rc-util/-/rc-util-5.18.1.tgz}
@@ -17641,41 +17506,6 @@ packages:
       text-table: registry.npmmirror.com/text-table/0.2.0
     dev: false
 
-  registry.npmmirror.com/react-dnd-html5-backend/14.1.0:
-    resolution: {integrity: sha512-6ONeqEC3XKVf4eVmMTe0oPds+c5B9Foyj8p/ZKLb7kL2qh9COYxiBHv3szd6gztqi/efkmriywLUVlPotqoJyw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/react-dnd-html5-backend/-/react-dnd-html5-backend-14.1.0.tgz}
-    name: react-dnd-html5-backend
-    version: 14.1.0
-    dependencies:
-      dnd-core: registry.npmmirror.com/dnd-core/14.0.1
-    dev: false
-
-  registry.npmmirror.com/react-dnd/14.0.5_a0c521d4794c7ad97f5f4c1c4a7d5818:
-    resolution: {integrity: sha512-9i1jSgbyVw0ELlEVt/NkCUkxy1hmhJOkePoCH713u75vzHGyXhPDm28oLfc2NMSBjZRM1Y+wRjHXJT3sPrTy+A==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/react-dnd/-/react-dnd-14.0.5.tgz}
-    id: registry.npmmirror.com/react-dnd/14.0.5
-    name: react-dnd
-    version: 14.0.5
-    peerDependencies:
-      '@types/hoist-non-react-statics': '>= 3.3.1'
-      '@types/node': '>= 12'
-      '@types/react': '>= 16'
-      react: '>= 16.14'
-    peerDependenciesMeta:
-      '@types/hoist-non-react-statics':
-        optional: true
-      '@types/node':
-        optional: true
-      '@types/react':
-        optional: true
-    dependencies:
-      '@react-dnd/invariant': registry.npmmirror.com/@react-dnd/invariant/2.0.0
-      '@react-dnd/shallowequal': registry.npmmirror.com/@react-dnd/shallowequal/2.0.0
-      '@types/react': registry.npmmirror.com/@types/react/17.0.39
-      dnd-core: registry.npmmirror.com/dnd-core/14.0.1
-      fast-deep-equal: registry.npmmirror.com/fast-deep-equal/3.1.3
-      hoist-non-react-statics: registry.npmmirror.com/hoist-non-react-statics/3.3.2
-      react: registry.npmmirror.com/react/17.0.2
-    dev: false
-
   registry.npmmirror.com/react-dom/16.14.0_react@16.14.0:
     resolution: {integrity: sha512-1gCeQXDLoIqMgqD3IO2Ah9bnf0w9kzhwN5q4FGnHZ67hBm9yePzB5JJAIQCc8x3pFnNlwFq4RidZggNAAkzWWw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/react-dom/-/react-dom-16.14.0.tgz}
     id: registry.npmmirror.com/react-dom/16.14.0
@@ -17825,6 +17655,7 @@ packages:
     resolution: {integrity: sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/react-lifecycles-compat/-/react-lifecycles-compat-3.0.4.tgz}
     name: react-lifecycles-compat
     version: 3.0.4
+    dev: true
 
   registry.npmmirror.com/react-native-swipeout/2.3.6:
     resolution: {integrity: sha512-t9suUCspzck4vp2pWggWe0frS/QOtX6yYCawHnEes75A7dZCEE74bxX2A1bQzGH9cUMjq6xsdfC94RbiDKIkJg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/react-native-swipeout/-/react-native-swipeout-2.3.6.tgz}
@@ -18244,6 +18075,7 @@ packages:
     resolution: {integrity: sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz}
     name: regenerator-runtime
     version: 0.11.1
+    dev: true
 
   registry.npmmirror.com/regenerator-runtime/0.13.5:
     resolution: {integrity: sha512-ZS5w8CpKFinUzOwW3c83oPeVXoNsrLsaCoLtJvAClH135j/R77RuymhiSErhm2lKcwSCIpmvIWSbDkIfAqKQlA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/regenerator-runtime/-/regenerator-runtime-0.13.5.tgz}
@@ -19251,14 +19083,6 @@ packages:
     name: signal-exit
     version: 3.0.7
 
-  registry.npmmirror.com/simple-swizzle/0.2.2:
-    resolution: {integrity: sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/simple-swizzle/-/simple-swizzle-0.2.2.tgz}
-    name: simple-swizzle
-    version: 0.2.2
-    dependencies:
-      is-arrayish: registry.npmmirror.com/is-arrayish/0.3.2
-    dev: false
-
   registry.npmmirror.com/sisteransi/1.0.5:
     resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/sisteransi/-/sisteransi-1.0.5.tgz}
     name: sisteransi
@@ -21270,21 +21094,6 @@ packages:
       replace-ext: registry.npmmirror.com/replace-ext/1.0.1
     dev: true
 
-  registry.npmmirror.com/virtualizedtableforantd4/1.1.4_57ac49da97db5dccedfb24f1f58a1993:
-    resolution: {integrity: sha512-hVj3c0g9aI6EdAaWblA7U9xYSSVwP2CwXkfH/q6mfzh9dq6d+qpOaX3SRLFRA9tFuvfJJHQ2/PkNi4XYkl1dpQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/virtualizedtableforantd4/-/virtualizedtableforantd4-1.1.4.tgz}
-    id: registry.npmmirror.com/virtualizedtableforantd4/1.1.4
-    name: virtualizedtableforantd4
-    version: 1.1.4
-    peerDependencies:
-      antd: ^4.0.0
-      react: ^16.8.0 || ^17.0.0
-      react-dom: ^16.8.0 || ^17.0.0
-    dependencies:
-      antd: registry.npmmirror.com/antd/4.18.7_react-dom@17.0.2+react@17.0.2
-      react: registry.npmmirror.com/react/17.0.2
-      react-dom: registry.npmmirror.com/react-dom/17.0.2_react@17.0.2
-    dev: false
-
   registry.npmmirror.com/vm-browserify/1.1.2:
     resolution: {integrity: sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/vm-browserify/-/vm-browserify-1.1.2.tgz}
     name: vm-browserify

+ 0 - 3
src/components/Flow/index.ts

@@ -1,3 +0,0 @@
-import ApprovalFlow from './src'
-
-export default ApprovalFlow

+ 0 - 116
src/components/Flow/src/components/Drawer/index.tsx

@@ -1,116 +0,0 @@
-import { useState, useEffect, useContext } from 'react'
-import { Button, Drawer, Radio, Tag } from 'antd'
-import { Actions, FlowContext } from '../../context'
-import type { RadioChangeEvent } from 'antd'
-import { ApprovalMethod, ApprovalType } from '../../enum'
-import TreeNodeSelect from '@/pages/Project/Management/List/components/TreeNodeSelect'
-
-const FlowDrawer = () => {
-  const { flowState, dispatch } = useContext(FlowContext)
-  const { drawerConfig } = flowState
-
-  const [state, setState] = useState({
-    approvalType: ApprovalType.TARGET,
-    fetching: false,
-    options: [],
-    staffOptions: []
-  })
-  useEffect(() => {
-    if (drawerConfig.nodeId && drawerConfig.visible) {
-      const defaultStaffIds = flowState.flowData.get(drawerConfig.nodeId)?.approvalAccounts || []
-      setState({ ...state, staffOptions: defaultStaffIds })
-    }
-  }, [drawerConfig])
-
-  const handleCancel = () => dispatch({ type: Actions.CLOSE_MODAL })
-
-  const plainOptions = [
-    { label: '指定账号', value: ApprovalType.TARGET }
-    // { label: '上级', value: ApprovalType.SUPERIOR },
-    // { label: '角色', value: ApprovalType.ROLE },
-    // { label: '发起人自选', value: ApprovalType.INITIATOR },
-    // { label: '连续多级上级', value: ApprovalType.MULTISTAGE }
-  ]
-
-  const approvalTypeChange = (e: RadioChangeEvent) => {
-    const { target } = e
-    if (target?.value) {
-      setState({ ...state, approvalType: target.value })
-    }
-  }
-
-  const staffIds = state.staffOptions.map(i => i.value)
-  const triggerChange = (val, option) => {
-    if (!staffIds.includes(val)) {
-      setState({
-        ...state,
-        staffOptions: [option].map(item => ({ ID: item.value, name: item.label }))
-      })
-    }
-  }
-
-  const handleOnOk = () => {
-    const payload = {
-      id: drawerConfig.nodeId,
-      node: {
-        approvalType: state.approvalType,
-        approvalAccounts: state.staffOptions,
-        approvalMethod: ApprovalMethod.ORDER
-      }
-    }
-    dispatch({
-      type: Actions.SET_FLOW_NODE,
-      payload
-    })
-    handleCancel()
-  }
-
-  return (
-    <Drawer
-      visible={drawerConfig.visible}
-      onClose={handleCancel}
-      destroyOnClose
-      footer={
-        <div className="flex justify-end">
-          <Button onClick={handleCancel}>取消</Button>
-          <Button className="ml-8px" type="primary" onClick={handleOnOk}>
-            确认
-          </Button>
-        </div>
-      }
-      title={<span className="font-medium">设置审批人</span>}
-      width="30%">
-      <div>
-        <Radio.Group
-          options={plainOptions}
-          onChange={approvalTypeChange}
-          value={state.approvalType}
-        />
-        <div className="mt-40px flex flex-col">
-          <div className="text-sm mb-4">
-            <span className="font-medium mr-1 text-14px">添加员工</span>
-            {/* <span className="text-hex-000000 text-opacity-45">不得超过20人</span> */}
-          </div>
-          <TreeNodeSelect onChange={triggerChange} />
-          {/* <Select
-            showSearch
-            disabled={state.staffOptions.length}
-            value={null}
-            onChange={triggerChange}
-            filterOption={false}
-            onSearch={v => debounceFetcher({ search: v })}
-            notFoundContent={state.fetching ? <Spin size="small" /> : null}
-            options={state.options?.filter(item => !staffIds.includes(item.value))}
-          /> */}
-          <div className="mt-4">
-            {state.staffOptions.map(item => (
-              <Tag key={item.ID}>{item.name}</Tag>
-            ))}
-          </div>
-        </div>
-      </div>
-    </Drawer>
-  )
-}
-
-export default FlowDrawer

+ 0 - 30
src/components/Flow/src/enum/index.ts

@@ -1,30 +0,0 @@
-export enum Actions {
-  SET_ELEMENTS = 'set_elements',
-  SET_FLOW_NODE = 'set_flow_node',
-  SET_FLOW_INSTANCE = 'set_flow_instance',
-  REMOVE_FLOW_NODE = 'remove_flow_node',
-  OPEN_MODAL = 'open_modal',
-  CLOSE_MODAL = 'close_modal'
-}
-
-export enum ApprovalType {
-  /** @name 指定成员 */
-  TARGET = '1',
-  /** @name 上级 */
-  SUPERIOR = '2',
-  /** @name 角色 */
-  ROLE = '3',
-  /** @name 发起人自选 */
-  INITIATOR = '4',
-  /** @name 连续多级上级 */
-  MULTISTAGE = '5'
-}
-
-export enum ApprovalMethod {
-  /** @name 顺序 */
-  ORDER = '1',
-  /** @name 会签 */
-  ALL = '2',
-  /** @name 或签 */
-  ONESELF = '3'
-}

+ 16 - 22
src/pages/Institutions/Company/Detail/components/Role.tsx

@@ -1,31 +1,38 @@
 import type { FC } from 'react'
+import { useState } from 'react'
 import { useEffect, useRef } from 'react'
 import { Card, Form, InputNumber, message } from 'antd'
 
 import type { ProFormInstance } from '@ant-design/pro-form'
 import ProForm, { ProFormSelect } from '@ant-design/pro-form'
 import consts from '@/utils/consts'
-import { queryAcountList, saveInstitutionSetting } from '@/services/api/institution'
+import { queryAccountList, saveInstitutionSetting } from '@/services/api/institution'
 import { useRequest } from 'umi'
 
 interface RoleProps {
   dataID: string
   memberTotal: number
   managerID: string
+  initData: () => void
 }
 
-const Role: FC<RoleProps> = ({ dataID, memberTotal, managerID }) => {
+const Role: FC<RoleProps> = ({ initData, dataID, memberTotal, managerID }) => {
+  const [list, setList] = useState([])
   const ref = useRef<ProFormInstance>(null)
   const { run: trySave } = useRequest(saveInstitutionSetting, {
     manual: true,
     onSuccess: () => {
+      initData()
       return message.success('设置成功')
     }
   })
-  useEffect(() => {
-    // eslint-disable-next-line no-unused-expressions
-    ref.current?.setFieldsValue({ accountID: managerID, memberTotal })
-  }, [])
+  useRequest(() => queryAccountList({ current: 1, pageSize: 214000, accountType: '1', dataID }), {
+    onSuccess: result => {
+      setList(result.items?.map(item => ({ label: item.name, value: item.ID })))
+      // eslint-disable-next-line no-unused-expressions
+      ref.current?.setFieldsValue({ accountID: managerID, memberTotal })
+    }
+  })
   return (
     <Card>
       <ProForm
@@ -33,32 +40,19 @@ const Role: FC<RoleProps> = ({ dataID, memberTotal, managerID }) => {
         wrapperCol={{ span: 6 }}
         onFinish={async values => {
           await trySave({ ...values, ID: dataID })
-        }}
-      >
+        }}>
         <ProFormSelect
           label="单位管理员:"
           tooltip="管理员可在前台维护单位信息和维护单位下成员"
           name="accountID"
           rules={[{ required: true, message: '请选择单位管理员' }]}
-          request={async () => {
-            const { code, data } = await queryAcountList({
-              current: 1,
-              pageSize: 214000,
-              accountType: '1',
-              dataID
-            })
-            if (code === consts.RET_CODE.SUCCESS) {
-              return data.items?.map(item => ({ label: item.name, value: item.ID }))
-            }
-            return []
-          }}
+          options={list}
         />
         <Form.Item
           label="最大成员数量:"
           tooltip={`已有成员${memberTotal}`}
           name="memberTotal"
-          rules={[{ required: true, message: '请输入成员总数' }]}
-        >
+          rules={[{ required: true, message: '请输入成员总数' }]}>
           <InputNumber style={{ width: '100%' }} />
         </Form.Item>
       </ProForm>

+ 5 - 8
src/pages/Institutions/Company/Detail/components/Staff.tsx

@@ -5,7 +5,7 @@ import consts from '@/utils/consts'
 // import { history } from 'umi'
 import { connect } from 'umi'
 import dayjs from 'dayjs'
-import { queryAcountList } from '@/services/api/institution'
+import { queryAccountList } from '@/services/api/institution'
 import StaffDetail from '@/pages/Institutions/Staff/components/StaffDetail'
 import type { SchemaBaseModelState } from '@/pages/Schema/Base/model'
 import { BaseMenuEnum } from '@/pages/Schema/Base'
@@ -176,8 +176,7 @@ const Staff: React.FC<ListProps> = ({
                 title: record.name,
                 defaultFormData: record
               })
-            }}
-          >
+            }}>
             编辑
           </div>
         </div>
@@ -199,7 +198,7 @@ const Staff: React.FC<ListProps> = ({
         columns={generateColumns(columns, schema)}
         search={false}
         request={async (params, filter, sorter) => {
-          const { code = -1, data: { items = [], total = 0 } = {} } = await queryAcountList({
+          const { code = -1, data: { items = [], total = 0 } = {} } = await queryAccountList({
             ...params,
             ...filter,
             ...sorter
@@ -240,8 +239,7 @@ const Staff: React.FC<ListProps> = ({
                       }
                     }
                   })
-                }}
-              >
+                }}>
                 添加人员
               </Button>
             )
@@ -256,8 +254,7 @@ const Staff: React.FC<ListProps> = ({
           </>
         }
         visible={state.visible}
-        onVisibleChange={visible => setState({ ...state, visible })}
-      >
+        onVisibleChange={visible => setState({ ...state, visible })}>
         <StaffDetail
           onVisibleChange={(visible: boolean) => setState({ ...state, visible })}
           type={state.currentModalType}

+ 6 - 3
src/pages/Institutions/Company/Detail/index.tsx

@@ -25,8 +25,11 @@ const CompanyDetail: React.FC<CompanyDetailProps> = ({ location }) => {
       setCompany(result)
     }
   })
-  useEffect(() => {
+  function initData() {
     dataID && tryQueryCompany({ ID: dataID })
+  }
+  useEffect(() => {
+    initData()
   }, [dataID])
 
   const menuMap: Record<string, string> = {
@@ -52,6 +55,7 @@ const CompanyDetail: React.FC<CompanyDetailProps> = ({ location }) => {
       case TabEnum.ROLE:
         return (
           <Role
+            initData={initData}
             dataID={dataID}
             memberTotal={company?.memberTotal}
             managerID={company?.manager?.ID}
@@ -72,8 +76,7 @@ const CompanyDetail: React.FC<CompanyDetailProps> = ({ location }) => {
           { tab: menuMap[TabEnum.ORGANIZATION], key: TabEnum.ORGANIZATION },
           { tab: menuMap[TabEnum.ROLE], key: TabEnum.ROLE }
         ]}
-        onTabChange={key => setSelectKey(key)}
-      >
+        onTabChange={key => setSelectKey(key)}>
         {renderChildren()}
       </PageContainer>
     )

+ 2 - 3
src/pages/Institutions/Staff/components/StaffDetail.tsx

@@ -10,7 +10,7 @@ import { ModalType } from '@/utils/enum'
 import type { ProFormInstance } from '@ant-design/pro-form'
 import { ModalForm, ProFormText } from '@ant-design/pro-form'
 import { changeAccountPsw } from '@/services/api/user'
-import { createForm, onFieldMount, onFieldReact } from '@formily/core'
+import { createForm, onFieldMount, onFieldReact, onFieldValueChange } from '@formily/core'
 import { createSchemaField } from '@formily/react'
 import { loadOrganizationalStructureList } from '@/utils/schema'
 import {
@@ -191,8 +191,7 @@ const StaffDrawer: React.FC<StaffModalProps> = ({
                 } catch (error) {
                   return false
                 }
-              }}
-            >
+              }}>
               <ProFormText.Password
                 label="新密码"
                 name="newPassword"

+ 5 - 8
src/pages/Institutions/Staff/index.tsx

@@ -7,7 +7,7 @@ import { connect } from 'umi'
 import type { ConnectProps } from 'umi'
 import type { InstitutionsModelState } from '../model'
 // import StaffModal, { ModalType } from './components/StaffModal'
-import { queryAcountList } from '@/services/api/institution'
+import { queryAccountList } from '@/services/api/institution'
 import dayjs from 'dayjs'
 import StaffDetail from './components/StaffDetail'
 import AnimateContent from '@/components/AnimateContent'
@@ -63,8 +63,7 @@ const CompanyList: React.FC<ListProps> = ({ dispatch, accountTypeList }) => {
               title: record.name,
               defaultFormData: record
             })
-          }}
-        >
+          }}>
           {name}
         </div>
       )
@@ -174,8 +173,7 @@ const CompanyList: React.FC<ListProps> = ({ dispatch, accountTypeList }) => {
                 title: record.name,
                 defaultFormData: record
               })
-            }}
-          >
+            }}>
             编辑
           </div>
           {/* <Popconfirm
@@ -202,7 +200,7 @@ const CompanyList: React.FC<ListProps> = ({ dispatch, accountTypeList }) => {
         scroll={{ y: document.body.clientHeight - 313 }}
         columns={columns}
         request={async (params, filter, sorter) => {
-          const { code = -1, data: { items = [], total = 0 } = {} } = await queryAcountList({
+          const { code = -1, data: { items = [], total = 0 } = {} } = await queryAccountList({
             ...params,
             ...filter,
             ...sorter
@@ -249,8 +247,7 @@ const CompanyList: React.FC<ListProps> = ({ dispatch, accountTypeList }) => {
           </>
         }
         visible={state.visible}
-        onVisibleChange={visible => setState({ ...state, visible })}
-      >
+        onVisibleChange={visible => setState({ ...state, visible })}>
         <StaffDetail
           type={state.currentModalType}
           defaultFormData={state.defaultFormData}

+ 3 - 3
src/pages/Project/Created/index.tsx

@@ -6,7 +6,7 @@ import { ModalForm } from '@ant-design/pro-form'
 import type { ProFormInstance } from '@ant-design/pro-form'
 import type { ProFormColumnsType } from '@ant-design/pro-form'
 import { DeleteOutlined } from '@ant-design/icons'
-import { queryAcountList } from '@/services/api/institution'
+import { queryAccountList } from '@/services/api/institution'
 import consts from '@/utils/consts'
 import { Button, Form, message, Table } from 'antd'
 import { saveCreator } from '@/services/api/user'
@@ -143,7 +143,7 @@ const Created = () => {
           const {
             code = -1,
             data: { items, total }
-          } = await queryAcountList({ ...params, ...filter, ...sort, isCreated: 1 })
+          } = await queryAccountList({ ...params, ...filter, ...sort, isCreated: 1 })
           return {
             success: code === consts.RET_CODE.SUCCESS,
             data: items,
@@ -178,7 +178,7 @@ const Created = () => {
                 const {
                   code = -1,
                   data: { items }
-                } = await queryAcountInstitutionList({
+                } = await queryAcountListByInstitutionID({
                   current: 1,
                   pageSize: 21400,
                   isCreated: '0'

+ 2 - 2
src/pages/Project/Management/List/components/TreeNodeSelect.tsx

@@ -1,12 +1,12 @@
 import React, { useState, useEffect } from 'react'
 import { TreeSelect } from 'antd'
 import { useRequest } from 'umi'
-import { queryAcountInstitutionList } from '@/services/api/institution'
+import { queryAcountListByInstitutionID } from '@/services/api/institution'
 
 const TreeNodeSelect = ({ params, onChange, placeholder = '请选择', ...otherProps }) => {
   const [list, setList] = useState([])
   const { run: tryAcountInstitutionList } = useRequest(
-    () => queryAcountInstitutionList({ ...params, pageSize: 125000 }),
+    () => queryAcountListByInstitutionID({ ...params, pageSize: 125000 }),
     {
       manual: true,
       onSuccess: result => {

+ 229 - 0
src/pages/Project/Verification/Detail/Flow/components/Drawer/index.tsx

@@ -0,0 +1,229 @@
+import { useState, useEffect, useContext, useMemo } from 'react'
+import { Button, Drawer, Radio, Tabs, Tooltip, Row, Col } from 'antd'
+import { Actions, FlowContext } from '../../context'
+import type { RadioChangeEvent } from 'antd'
+import { ApprovalWay, ParticipantMode } from '../../enum'
+import { QuestionCircleFilled } from '@ant-design/icons'
+import { createForm, onFieldMount, onFieldReact, onFieldValueChange } from '@formily/core'
+import { createSchemaField, FormProvider } from '@formily/react'
+import { FormItem, Select } from '@formily/antd'
+import { participantSchema } from '../../utils'
+import { queryAccountList, queryInstitutionList } from '@/services/api/institution'
+import consts from '@/utils/consts'
+import { action } from '@formily/reactive'
+const FlowDrawer = () => {
+  const { flowState, dispatch } = useContext(FlowContext)
+  const { drawerConfig } = flowState
+
+  const [state, setState] = useState({
+    approvalWay: ApprovalWay.ACCOUNT,
+    participantMode: ParticipantMode.ACCOUNT,
+    accounts: []
+  })
+  useEffect(() => {
+    if (drawerConfig.nodeId && drawerConfig.visible) {
+      const defaultStaffIds = flowState.flowData.get(drawerConfig.nodeId)?.approvalAccounts || []
+      setState({ ...state, staffOptions: defaultStaffIds })
+    }
+  }, [drawerConfig])
+
+  const handleCancel = () => dispatch({ type: Actions.CLOSE_MODAL })
+
+  const plainOptions = [{ label: '指定用户', value: ApprovalWay.ACCOUNT }]
+
+  const approvalWayChange = (e: RadioChangeEvent) => {
+    const { target } = e
+    if (target?.value) {
+      setState({ ...state, approvalWay: target.value })
+    }
+  }
+  const handleOnOk = () => {
+    const payload = {
+      id: drawerConfig.nodeId,
+      node: {
+        approvalType: state.approvalType,
+        approvalAccounts: state.staffOptions
+        // approvalMethod: ApprovalMethod.ORDER
+      }
+    }
+    dispatch({
+      type: Actions.SET_FLOW_NODE,
+      payload
+    })
+    handleCancel()
+  }
+
+  // 添加用户-参与者卡片
+  const addParticipantInfo = () => {
+    setState({
+      ...state
+    })
+  }
+
+  const formOptions = useMemo(
+    () => ({
+      instance: createForm({
+        initialValues: {},
+        effects() {
+          onFieldMount('ID', (field, form) => {
+            field.setComponentProps({
+              onSelect: (_, option: { label: string; value: string }) => {
+                option && form.setValuesIn('name', option?.label)
+              }
+            })
+          })
+          onFieldReact('ID', async field => {
+            const dataID = field.query('institutionID').get('value')
+            if (dataID) {
+              const { code = -1, data: { items = [] } = {} } = await queryAccountList({
+                current: 1,
+                pageSize: 214000,
+                dataID
+              })
+              if (code === consts.RET_CODE.SUCCESS) {
+                field.dataSource = items.map(item => ({ label: item.name, value: item.ID }))
+              }
+            }
+          })
+          onFieldValueChange('ID', (_, form) => console.log(form.getValuesIn()))
+        }
+      }),
+      useAsyncDataSource: service => field => {
+        field.loading = true
+        service(field).then(
+          action.bound(data => {
+            field.dataSource = data
+            field.loading = false
+          })
+        )
+      },
+      loadInstitutionList: async () => {
+        const { code = -1, data: { items = [] } = {} } = await queryInstitutionList({
+          current: 1,
+          pageSize: 214000
+        })
+        if (code === consts.RET_CODE.SUCCESS) {
+          return items.map(item => ({ label: item.name, value: item.ID }))
+        }
+        return []
+      }
+    }),
+    []
+  )
+
+  const SchemaField = createSchemaField({
+    components: {
+      FormItem,
+      Select
+    }
+  })
+
+  return (
+    <Drawer
+      visible={drawerConfig.visible}
+      onClose={handleCancel}
+      destroyOnClose
+      footer={
+        <div className="flex justify-end">
+          <Button onClick={handleCancel}>取消</Button>
+          <Button className="ml-8px" type="primary" onClick={handleOnOk}>
+            确认
+          </Button>
+        </div>
+      }
+      title={
+        <div className="flex items-center">
+          <span className="font-medium">设置审批人</span>
+          <span className="ml-2 cursor-pointer">
+            <Tooltip
+              title={
+                <div>
+                  <p>指定用户:选择指定的用户或者角色完成审批。</p>
+                  <p>
+                    会签:指同一个审批节点设置多个人,如ABC三人,三人会同时收到审批,需全部同意之后,审批才可到下一审批节点
+                  </p>
+                  <p>
+                    或签:指同一个审批节点设置多个人,如ABC三人,三人会同时收到审批,只要其中任意一人审批即可到下一审批节点
+                  </p>
+                  <p>依次审批:按照顺序逐个审批</p>
+                  <p>由上一次审批人设置:由上环节审批人设置下环节流程。</p>
+                </div>
+              }>
+              <QuestionCircleFilled style={{ color: '#FEA100' }} />
+            </Tooltip>
+          </span>
+        </div>
+      }
+      width="30%">
+      <Tabs>
+        <Tabs.TabPane tab="设置审批人" key="1">
+          <div>
+            <Radio.Group
+              options={plainOptions}
+              onChange={approvalWayChange}
+              value={state.approvalWay}
+            />
+          </div>
+          <div className="mt-20px">
+            <Button type="primary" size="middle" onClick={() => addParticipantInfo()}>
+              添加用户
+            </Button>
+          </div>
+          <div className="shadow-xl border rounded-md flex flex-col justify-between px-4 py-2 mt-6">
+            <div className="flex flex-row justify-between">
+              <span className="text-base font-medium">参与者</span>
+              <span className="text-primary">删除</span>
+            </div>
+            <div className="my-2">
+              <FormProvider form={formOptions.instance}>
+                <SchemaField
+                  schema={participantSchema}
+                  scope={{
+                    useAsyncDataSource: formOptions.useAsyncDataSource,
+                    loadInstitutionList: formOptions.loadInstitutionList
+                  }}
+                />
+              </FormProvider>
+              {/* <Button onClick={() => console.log(formOptions.instance.getState().values)}>
+                11111
+              </Button> */}
+            </div>
+            <div className="flex flex-row justify-between items-center">
+              <div className="flex flex-row justify-between items-center">
+                <span className="text-md font-midium">配置信息</span>
+                <div className="children:mx-1 flex flex-row ml-1">
+                  <div className="w-30px text-center rounded-lg text-primary border border-hex-0089ff bg-hex-e9f5ff">
+                    跳
+                  </div>
+                  <div className="w-30px text-center rounded-lg text-primary border border-hex-0089ff bg-hex-e9f5ff">
+                    协
+                  </div>
+                  <div className="w-30px text-center rounded-lg text-primary border border-hex-0089ff bg-hex-e9f5ff">
+                    加
+                  </div>
+                  <div className="w-30px text-center rounded-lg text-primary border border-hex-0089ff bg-hex-e9f5ff">
+                    撤
+                  </div>
+                  <div className="w-30px text-center rounded-lg text-primary border border-hex-0089ff bg-hex-e9f5ff">
+                    退
+                  </div>
+                </div>
+              </div>
+              <span className="text-primary font-medium">收叠</span>
+            </div>
+            <Row>
+              <Col span={8} />
+              <Col span={8} />
+              <Col span={8} />
+              <Col span={8} />
+              <Col span={8} />
+              <Col span={8} />
+            </Row>
+          </div>
+        </Tabs.TabPane>
+      </Tabs>
+    </Drawer>
+  )
+}
+
+export default FlowDrawer

src/components/Flow/src/components/Edge/index.less → src/pages/Project/Verification/Detail/Flow/components/Edge/index.less


src/components/Flow/src/components/Edge/index.tsx → src/pages/Project/Verification/Detail/Flow/components/Edge/index.tsx


src/components/Flow/src/components/Graph/FloatingEdge.tsx → src/pages/Project/Verification/Detail/Flow/components/Graph/FloatingEdge.tsx


src/components/Flow/src/components/Graph/index.tsx → src/pages/Project/Verification/Detail/Flow/components/Graph/index.tsx


src/components/Flow/src/components/Node/index.tsx → src/pages/Project/Verification/Detail/Flow/components/Node/index.tsx


src/components/Flow/src/components/Toolbar/index.tsx → src/pages/Project/Verification/Detail/Flow/components/Toolbar/index.tsx


src/components/Flow/src/context/index.tsx → src/pages/Project/Verification/Detail/Flow/context/index.tsx


src/components/Flow/src/context/reducer.ts → src/pages/Project/Verification/Detail/Flow/context/reducer.ts


+ 30 - 0
src/pages/Project/Verification/Detail/Flow/enum/index.ts

@@ -0,0 +1,30 @@
+export enum Actions {
+  SET_ELEMENTS = 'set_elements',
+  SET_FLOW_NODE = 'set_flow_node',
+  SET_FLOW_INSTANCE = 'set_flow_instance',
+  REMOVE_FLOW_NODE = 'remove_flow_node',
+  OPEN_MODAL = 'open_modal',
+  CLOSE_MODAL = 'close_modal'
+}
+
+/** 审批方式 */
+export enum ApprovalWay {
+  /** @name 指定用户 */
+  ACCOUNT = 'account',
+  /** @name 会签 */
+  JOINTLYSIGN = 'jointlySign',
+  /** @name 顺序 */
+  ORSIGN = 'orSign',
+  /** @name 依次审批 */
+  ORDERAPPROVAL = 'orderApproval',
+  /** @name 由上一审批人设置 */
+  PREVACCOUNT = 'prevAccount'
+}
+
+/** 参与者模式 */
+export enum ParticipantMode {
+  /** @name 用户模式 */
+  ACCOUNT = 'account',
+  /** @name 角色模式 */
+  ROLE = 'role'
+}

src/components/Flow/src/index.less → src/pages/Project/Verification/Detail/Flow/index.less


src/components/Flow/src/index.tsx → src/pages/Project/Verification/Detail/Flow/index.tsx


+ 57 - 0
src/components/Flow/src/utils.ts

@@ -4,6 +4,7 @@ import { ArrowHeadType, isEdge, isNode, Position } from 'react-flow-renderer'
 import { buildUUID } from '@/utils/uuid'
 
 import type { Edge, Elements, Node, XYPosition } from 'react-flow-renderer'
+import { ParticipantMode } from './enum'
 
 export enum genreateElementEnum {
   ADD = 'add',
@@ -167,3 +168,59 @@ export function getEdgeParams(source: Node, target: Node) {
     targetPos
   }
 }
+
+export const participantSchema = {
+  type: 'object',
+  properties: {
+    participantMode: {
+      type: 'string',
+      title: '',
+      required: true,
+      'x-decorator': 'FormItem',
+      'x-component': 'Select',
+      default: ParticipantMode.ACCOUNT,
+      enum: [
+        { label: '仅用户模式', value: ParticipantMode.ACCOUNT }
+        // { label: '角色模式', value: ParticipantMode.ROLE }
+      ],
+      'x-index': 1
+    },
+    name: {
+      type: 'string',
+      title: '',
+      required: true,
+      'x-decorator': 'FormItem',
+      'x-component': 'Input',
+      'x-display': 'none',
+      'x-index': 4
+    },
+    institutionID: {
+      type: 'string',
+      title: '',
+      required: true,
+      'x-decorator': 'FormItem',
+      'x-component': 'Select',
+      'x-component-props': {
+        placeholder: '请选择单位',
+        showSearch: true,
+        virtual: true,
+        optionFilterProp: 'label'
+      },
+      'x-reactions': ['{{useAsyncDataSource(loadInstitutionList)}}'],
+      'x-index': 3
+    },
+    ID: {
+      type: 'string',
+      title: '',
+      required: true,
+      'x-decorator': 'FormItem',
+      'x-component': 'Select',
+      'x-component-props': {
+        placeholder: '请选择用户',
+        showSearch: true,
+        optionFilterProp: 'label'
+      },
+      'x-index': 4
+    }
+  }
+}

+ 1 - 1
src/pages/Project/Verification/Detail.tsx

@@ -1,4 +1,4 @@
-import ApprovalFlow from '@/components/Flow'
+import ApprovalFlow from '@/pages/Project/Verification/Detail/Flow'
 import type { FC } from 'react'
 type ApprovalDetailProps = {
   id: string

+ 29 - 21
src/pages/Schema/Base/components/Designable/index.tsx

@@ -10,7 +10,8 @@ import {
   ViewportPanel, // 视口布局面板
   ViewPanel, // 视图布局面板
   SettingsPanel, // 右侧配置表单布局面板
-  ComponentTreeWidget // 组件树渲染器
+  ComponentTreeWidget, // 组件树渲染器
+  CompositePanel // 左侧组合布局面板
 } from '@designable/react'
 import { SettingsForm } from '@designable/react-settings-form'
 import { createDesigner, GlobalRegistry, Shortcut, KeyCode } from '@designable/core'
@@ -38,7 +39,8 @@ import { connect, useLocation } from 'umi'
 GlobalRegistry.registerDesignerLocales({
   'zh-CN': {
     sources: {
-      Inputs: '输入控件'
+      Inputs: '输入控件',
+      Layouts: '布局组件'
     }
   }
 })
@@ -86,24 +88,28 @@ const Designable: FC<DesignableProps> = ({ base, title }) => {
               schema: base[columnType]
             }}
           />
-        }
-      >
-        <ResourceWidget
-          title="sources.Inputs"
-          sources={[
-            Input,
-            Password,
-            NumberPicker,
-            Select,
-            TreeSelect,
-            Cascader,
-            Checkbox,
-            Radio,
-            DatePicker,
-            TimePicker
-          ]}
-        />
-        <ResourceWidget title="sources.Layouts" sources={[FormGrid, FormLayout]} />
+        }>
+        <CompositePanel>
+          <CompositePanel.Item title="panels.Component" icon="Component">
+            <ResourceWidget
+              title="sources.Inputs"
+              sources={[
+                Input,
+                Password,
+                NumberPicker,
+                Select,
+                TreeSelect,
+                Cascader,
+                Checkbox,
+                Radio,
+                DatePicker,
+                TimePicker
+              ]}
+            />
+            <ResourceWidget title="sources.Layouts" sources={[FormGrid, FormLayout]} />
+          </CompositePanel.Item>
+        </CompositePanel>
+
         <Workspace id="form">
           <WorkspacePanel>
             <ViewportPanel>
@@ -123,7 +129,9 @@ const Designable: FC<DesignableProps> = ({ base, title }) => {
                       Password,
                       DatePicker,
                       TimePicker,
-                      Switch
+                      Switch,
+                      FormGrid,
+                      FormLayout
                     }}
                   />
                 )}

+ 2 - 2
src/services/api/institution.ts

@@ -32,7 +32,7 @@ export async function addInstitution(params: API.InstitutionAddParams) {
 }
 
 /** 新增企事业单位下账号 */
-export async function queryAcountList(params: API.InstitutionListParams) {
+export async function queryAccountList(params: API.InstitutionListParams) {
   return request('/account/list', {
     method: 'POST',
     data: params
@@ -40,7 +40,7 @@ export async function queryAcountList(params: API.InstitutionListParams) {
 }
 
 /** 单位下帐号列表 */
-export async function queryAcountInstitutionList(params: API.AcountInstitutionListParams) {
+export async function queryAcountListByInstitutionID(params: API.AcountInstitutionListParams) {
   return request('/account/institution', {
     method: 'POST',
     data: params