소스 검색

feat: 执行者第一版

lanjianrong 2 년 전
부모
커밋
563a1bcfe4

+ 2 - 2
package.json

@@ -43,8 +43,8 @@
     "@formily/reactive": "^2.1.10",
     "@formily/reactive-react": "^2.1.10",
     "@formily/shared": "^2.1.10",
-    "@umijs/max": "4.0.11",
-    "@umijs/plugins": "4.0.11",
+    "@umijs/max": "4.0.12",
+    "@umijs/plugins": "4.0.12",
     "ahooks": "^3.0.0",
     "antd": "4.20.7",
     "array-move": "^4.0.0",

+ 107 - 113
pnpm-lock.yaml

@@ -20,8 +20,8 @@ specifiers:
   '@types/lodash': ^4.14.144
   '@types/react': ^18.0.0
   '@types/react-dom': ^18.0.0
-  '@umijs/max': 4.0.11
-  '@umijs/plugins': 4.0.11
+  '@umijs/max': 4.0.12
+  '@umijs/plugins': 4.0.12
   '@unocss/cli': ^0.44.3
   ahooks: ^3.0.0
   antd: 4.20.7
@@ -66,8 +66,8 @@ dependencies:
   '@formily/reactive': 2.1.10
   '@formily/reactive-react': 2.1.10_xo7fjoqjibrnuea75o3qm7uusm
   '@formily/shared': 2.1.10
-  '@umijs/max': 4.0.11_zydoiptit3dcuzymmvs734hkw4
-  '@umijs/plugins': 4.0.11_xo7fjoqjibrnuea75o3qm7uusm
+  '@umijs/max': 4.0.12_zydoiptit3dcuzymmvs734hkw4
+  '@umijs/plugins': 4.0.12_xo7fjoqjibrnuea75o3qm7uusm
   ahooks: 3.5.0_react@18.1.0
   antd: 4.20.7_ef5jwxihqo6n7gxfmzogljlgcm
   array-move: 4.0.0
@@ -153,7 +153,7 @@ packages:
     dependencies:
       '@ant-design/icons': 4.7.0_ef5jwxihqo6n7gxfmzogljlgcm
       '@ant-design/pro-utils': 1.41.0_y2ytas7iogu6k5fpudkqrkmoha
-      '@babel/runtime': 7.18.3
+      '@babel/runtime': 7.18.9
       antd: 4.20.7_ef5jwxihqo6n7gxfmzogljlgcm
       classnames: 2.3.1
       omit.js: 2.0.2
@@ -172,7 +172,7 @@ packages:
       '@ant-design/icons': 4.7.0_ef5jwxihqo6n7gxfmzogljlgcm
       '@ant-design/pro-provider': 1.6.4_y2ytas7iogu6k5fpudkqrkmoha
       '@ant-design/pro-utils': 1.41.0_y2ytas7iogu6k5fpudkqrkmoha
-      '@babel/runtime': 7.18.3
+      '@babel/runtime': 7.18.9
       '@chenshuai2144/sketch-color': 1.0.8_react@18.1.0
       antd: 4.20.7_ef5jwxihqo6n7gxfmzogljlgcm
       classnames: 2.3.1
@@ -249,7 +249,7 @@ packages:
       '@ant-design/icons': 4.7.0_ef5jwxihqo6n7gxfmzogljlgcm
       '@ant-design/pro-provider': 1.9.3_ef5jwxihqo6n7gxfmzogljlgcm
       '@ant-design/pro-utils': 1.43.2_ef5jwxihqo6n7gxfmzogljlgcm
-      '@babel/runtime': 7.18.3
+      '@babel/runtime': 7.18.9
       '@emotion/css': 11.9.0
       '@umijs/route-utils': 2.1.1
       '@umijs/ssr-darkreader': 4.9.45
@@ -278,7 +278,7 @@ packages:
       antd: '>=4.18.0'
       react: '>=16.9.0'
     dependencies:
-      '@babel/runtime': 7.18.3
+      '@babel/runtime': 7.18.9
       antd: 4.20.7_ef5jwxihqo6n7gxfmzogljlgcm
       rc-util: 5.21.5_ef5jwxihqo6n7gxfmzogljlgcm
       react: 18.1.0
@@ -292,7 +292,7 @@ packages:
     peerDependencies:
       react: '>=16.9.0'
     dependencies:
-      '@babel/runtime': 7.18.3
+      '@babel/runtime': 7.18.9
       antd: 4.20.7_ef5jwxihqo6n7gxfmzogljlgcm
       rc-util: 5.21.5_ef5jwxihqo6n7gxfmzogljlgcm
       react: 18.1.0
@@ -338,7 +338,7 @@ packages:
     dependencies:
       '@ant-design/icons': 4.7.0_ef5jwxihqo6n7gxfmzogljlgcm
       '@ant-design/pro-provider': 1.6.4_y2ytas7iogu6k5fpudkqrkmoha
-      '@babel/runtime': 7.18.3
+      '@babel/runtime': 7.18.9
       antd: 4.20.7_ef5jwxihqo6n7gxfmzogljlgcm
       classnames: 2.3.1
       moment: 2.29.3
@@ -357,7 +357,7 @@ packages:
     dependencies:
       '@ant-design/icons': 4.7.0_ef5jwxihqo6n7gxfmzogljlgcm
       '@ant-design/pro-provider': 1.9.3_ef5jwxihqo6n7gxfmzogljlgcm
-      '@babel/runtime': 7.18.3
+      '@babel/runtime': 7.18.9
       antd: 4.20.7_ef5jwxihqo6n7gxfmzogljlgcm
       classnames: 2.3.1
       moment: 2.29.3
@@ -493,7 +493,7 @@ packages:
     resolution: {integrity: sha512-LVtS6TqjJHFc+nYeITRo6VLXve70xmq7wPhWTqDJusJEgGmkAACWwMiTNrvfoQo6hEhFwAIixNkvB0jPXDL8Wg==}
     engines: {node: '>=6.9.0'}
     dependencies:
-      '@babel/types': 7.18.4
+      '@babel/types': 7.18.10
 
   /@babel/helper-module-imports/7.18.6:
     resolution: {integrity: sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA==}
@@ -540,7 +540,6 @@ packages:
   /@babel/helper-string-parser/7.18.10:
     resolution: {integrity: sha512-XtIfWmeNY3i4t7t4D2t02q50HvqHybPqW2ki1kosnvWCwuCMeo81Jf0gwr85jy/neUdg5XDdeFE/80DXiO+njw==}
     engines: {node: '>=6.9.0'}
-    dev: false
 
   /@babel/helper-validator-identifier/7.18.6:
     resolution: {integrity: sha512-MmetCkz9ej86nJQV+sFCxoGGrUbU3q02kgLciwkrt9QqEB7cP39oKEY0PakknEO0Gu20SskMRi+AYZ3b1TpN9g==}
@@ -697,14 +696,6 @@ packages:
       '@babel/helper-string-parser': 7.18.10
       '@babel/helper-validator-identifier': 7.18.6
       to-fast-properties: 2.0.0
-    dev: false
-
-  /@babel/types/7.18.4:
-    resolution: {integrity: sha512-ThN1mBcMq5pG/Vm2IcBmPPfyPXbd8S02rS+OBIDENdufvqC7Z/jHPCv9IcP01277aKtDI8g/2XysBN4hA8niiw==}
-    engines: {node: '>=6.9.0'}
-    dependencies:
-      '@babel/helper-validator-identifier': 7.18.6
-      to-fast-properties: 2.0.0
 
   /@bloomberg/record-tuple-polyfill/0.0.4:
     resolution: {integrity: sha512-h0OYmPR3A5Dfbetra/GzxBAzQk8sH7LhRkRUTdagX6nrtlUgJGYCTv4bBK33jsTQw9HDd8PE2x1Ma+iRKEDUsw==}
@@ -1072,9 +1063,9 @@ packages:
     peerDependencies:
       '@babel/core': ^7.0.0
     dependencies:
-      '@babel/helper-module-imports': 7.16.7
+      '@babel/helper-module-imports': 7.18.6
       '@babel/plugin-syntax-jsx': 7.17.12
-      '@babel/runtime': 7.18.3
+      '@babel/runtime': 7.18.9
       '@emotion/hash': 0.8.0
       '@emotion/memoize': 0.7.5
       '@emotion/serialize': 1.0.4
@@ -1935,6 +1926,7 @@ packages:
     resolution: {integrity: sha512-OWPWTUrY/NIrjsAPkAk1wW9LZeIjSvkXRhclsFO8CZcZGCOg2G0YZy4ft+rOyYxy8B7ui5iZzi9OkDebZ7/QSA==}
     dependencies:
       '@types/react': 18.0.14
+    dev: true
 
   /@types/react-redux/7.1.24:
     resolution: {integrity: sha512-7FkurKcS1k0FHZEtdbbgN8Oc6b+stGSfZYjQGicofJ0j4U0qIn/jaSvnP2pLwZKiai3/17xqqxkkrxTgN8UNbQ==}
@@ -2162,32 +2154,32 @@ packages:
       eslint-visitor-keys: 3.3.0
     dev: false
 
-  /@umijs/ast/4.0.11:
-    resolution: {integrity: sha512-bvx+pU+KS5gDmBrW3R10Yi9sH+XMUnWYKJGslmPpFTlTlWM4dwVOlVBJqK0I3h1ECrx9VIvSB31UNqGZBFcYxA==}
+  /@umijs/ast/4.0.12:
+    resolution: {integrity: sha512-MilZ8nOAe3FCpN4Ggx8aGbHvP3EZPWlyaqRKUzsCTDImSntK8tLVueG5oNrVDQ2HXDQ2Imu30aQAgyAClVL0sQ==}
     dependencies:
-      '@umijs/bundler-utils': 4.0.11
+      '@umijs/bundler-utils': 4.0.12
     transitivePeerDependencies:
       - supports-color
     dev: false
 
-  /@umijs/babel-preset-umi/4.0.11:
-    resolution: {integrity: sha512-6ii6VcOW0cDDHoKwVoD8viKBVBcGjdew/DbeSg0lm8UgLB28nWLUfV9swk4DkNmoeNsgzcQA3p0TEGKuJnGgwg==}
+  /@umijs/babel-preset-umi/4.0.12:
+    resolution: {integrity: sha512-pRc7byOydggr5LeMZ2O5FMEKoC6aas68rT+lEP9rxAKFmsjQYIkEV6iBtRNaHBkwaPG6AMsPIE8NWKmOIO8IVA==}
     dependencies:
       '@babel/runtime': 7.18.9
       '@bloomberg/record-tuple-polyfill': 0.0.4
-      '@umijs/bundler-utils': 4.0.11
-      '@umijs/utils': 4.0.11
+      '@umijs/bundler-utils': 4.0.12
+      '@umijs/utils': 4.0.12
       core-js: 3.22.4
     transitivePeerDependencies:
       - supports-color
     dev: false
 
-  /@umijs/bundler-esbuild/4.0.11:
-    resolution: {integrity: sha512-zVfsDoEUQqDQKysQZvLlDbTNyuF6p/Wii2pvyJ1MDKhsks0PJN5TpxE+bpepdOdhTJQfXE12jdmYMpcFYDAkVw==}
+  /@umijs/bundler-esbuild/4.0.12:
+    resolution: {integrity: sha512-Z6HfzvsLUyRxbiu2HPaltFtEIqsiqateAwGZ9695Ib6OyCZZN/1+jFi004ehabOA3roLtxt/E9MLTGF0Ksfxeg==}
     hasBin: true
     dependencies:
-      '@umijs/bundler-utils': 4.0.11
-      '@umijs/utils': 4.0.11
+      '@umijs/bundler-utils': 4.0.12
+      '@umijs/utils': 4.0.12
       enhanced-resolve: 5.9.3
       postcss: 8.4.14
       postcss-flexbugs-fixes: 5.0.2_postcss@8.4.14
@@ -2196,24 +2188,25 @@ packages:
       - supports-color
     dev: false
 
-  /@umijs/bundler-utils/4.0.11:
-    resolution: {integrity: sha512-CLLvm1IhQU/Otpk7TLEdTx2fKi8Ah1pcnTs9Ns9jh/nUnhriNh+vUqrnfmMGIfJHdNKxSYqgCGQfDUr7HQ08TQ==}
+  /@umijs/bundler-utils/4.0.12:
+    resolution: {integrity: sha512-2d7BfxRWFeHj9+fhxweeg3NTz/v6dWxXGfOMzIltGsRiiJpuM+Q8KWVDimbS/B6nsrSP+oxyVeMup2SZgCKpKg==}
     dependencies:
-      '@umijs/utils': 4.0.11
+      '@umijs/utils': 4.0.12
       esbuild: 0.14.49
+      regenerate: 1.4.2
       regenerate-unicode-properties: 10.0.1
       spdy: 4.0.2
     transitivePeerDependencies:
       - supports-color
     dev: false
 
-  /@umijs/bundler-vite/4.0.11:
-    resolution: {integrity: sha512-DXGd9tQdU6X1J9ZHN+lKF0NK/jUyviHaiNh6y9Lqn5t1gyfpXXBOpVizZcWF3LeS3Hxl2N+QBiND7F6TgNlP3Q==}
+  /@umijs/bundler-vite/4.0.12:
+    resolution: {integrity: sha512-m3KHOkUntkbK7PBPAXhv2ny/9RE5adgfxVgCLppuj8tajpZxaeu7P7X/MXGqDWenkzl9YRLr2uAMT35csXSTzg==}
     hasBin: true
     dependencies:
       '@svgr/core': 6.2.1
-      '@umijs/bundler-utils': 4.0.11
-      '@umijs/utils': 4.0.11
+      '@umijs/bundler-utils': 4.0.12
+      '@umijs/utils': 4.0.12
       '@vitejs/plugin-react': 1.2.0
       postcss-preset-env: 7.5.0
       rollup-plugin-visualizer: 5.6.0
@@ -2223,8 +2216,8 @@ packages:
       - supports-color
     dev: false
 
-  /@umijs/bundler-webpack/4.0.11_typescript@4.7.4:
-    resolution: {integrity: sha512-0Qpxajy90u9fAd6Tnk78pNLpuGPZBQ1vlvbPPGBGoatab9qMZfNM/eSn+5viU1omkYop5ObbKAbIrVJ31AmoJQ==}
+  /@umijs/bundler-webpack/4.0.12_typescript@4.7.4:
+    resolution: {integrity: sha512-3ym/G6BPiSK5U5+Hw6Gcv+v4wxK8bzzh3v5ryDlNZh6Y6YpQ1r4lSIHSvt3BW2pCjZ7BQfRZ90fU+cadn/yRcA==}
     hasBin: true
     dependencies:
       '@parcel/css': 1.9.0
@@ -2233,11 +2226,11 @@ packages:
       '@svgr/plugin-jsx': 6.2.1_@svgr+core@6.2.1
       '@svgr/plugin-svgo': 6.2.0_@svgr+core@6.2.1
       '@types/hapi__joi': 17.1.8
-      '@umijs/babel-preset-umi': 4.0.11
-      '@umijs/bundler-utils': 4.0.11
+      '@umijs/babel-preset-umi': 4.0.12
+      '@umijs/bundler-utils': 4.0.12
       '@umijs/case-sensitive-paths-webpack-plugin': 1.0.1
-      '@umijs/mfsu': 4.0.11
-      '@umijs/utils': 4.0.11
+      '@umijs/mfsu': 4.0.12
+      '@umijs/utils': 4.0.12
       cors: 2.8.5
       css-loader: 6.7.1
       es5-imcompatible-versions: 0.1.73
@@ -2265,24 +2258,24 @@ packages:
     resolution: {integrity: sha512-kDKJ8yTarxwxGJDInG33hOpaQRZ//XpNuuznQ/1Mscypw6kappzFmrBr2dOYave++K7JHouoANF354UpbEQw0Q==}
     dev: false
 
-  /@umijs/core/4.0.11:
-    resolution: {integrity: sha512-BTi/8XnLes/CzmCdI0RiJlNjFngoB/2RfrF++7oHf1TjybqzVHs0tBjQnX4qZR4atA+MSAkYEaSqlHF/oziyCA==}
+  /@umijs/core/4.0.12:
+    resolution: {integrity: sha512-ltnz/sKQrwlVNR3BwRee9keY11K6Jp8qeAuBX6zozKyTboEJy7idPz8b1AK6g9xgF6Prli81nDxnstIxvJDpng==}
     dependencies:
-      '@umijs/bundler-utils': 4.0.11
-      '@umijs/utils': 4.0.11
+      '@umijs/bundler-utils': 4.0.12
+      '@umijs/utils': 4.0.12
     transitivePeerDependencies:
       - supports-color
     dev: false
 
-  /@umijs/lint/4.0.11_nj2vya5w6hsvqod5673wtbqeku:
-    resolution: {integrity: sha512-pafXtyFlpGZeJkd0wDIOZpp16ro7zdppZYlaClAF7OtE0NTSUBYjN9mTL2CXaqQSZrH9GJW1pxFWliTuS/oZ7A==}
+  /@umijs/lint/4.0.12_nj2vya5w6hsvqod5673wtbqeku:
+    resolution: {integrity: sha512-Woxj5Y+ZKa4Yueupa/KMBvP9lmbD5K39OsIzZQPJTOmzIc/XyeO4s5usFR3Pse5dKYxgPld07IYZssfqWuIf+Q==}
     dependencies:
       '@babel/core': 7.18.9
       '@babel/eslint-parser': 7.18.9_bpusarfwcbgnjqmbezm4jkv5ie
       '@stylelint/postcss-css-in-js': 0.38.0_ryeeqdz73dmnun3unz5nxq65vi
       '@typescript-eslint/eslint-plugin': 5.27.1_76cletop5y37porjpw3ddlh5xi
       '@typescript-eslint/parser': 5.27.1_4hx5bygx4rxgd7xwyndf6ymwce
-      '@umijs/babel-preset-umi': 4.0.11
+      '@umijs/babel-preset-umi': 4.0.12
       eslint-plugin-jest: 26.1.5_foyhrlarnkq5u6r672vv7lci3e
       eslint-plugin-react: 7.29.4_eslint@8.15.0
       eslint-plugin-react-hooks: 4.5.0_eslint@8.15.0
@@ -2302,16 +2295,16 @@ packages:
       - typescript
     dev: false
 
-  /@umijs/max/4.0.11_zydoiptit3dcuzymmvs734hkw4:
-    resolution: {integrity: sha512-mLONxObkSWWPMy6E09WsbX6gf4JuFLBSWeHci+IJMUWqxgAaB4x97Zfyd/nNvWYF0mDWf9KTt7Qg/7MEokO08w==}
+  /@umijs/max/4.0.12_zydoiptit3dcuzymmvs734hkw4:
+    resolution: {integrity: sha512-QvYH4YPjzw9eNzHgmIWJpwjOYfYx8GJDlJ3YG5xKMkmXpV0DuEoV3j9N1J6KNJJsqMEIpEkETJ3oPBUD0yqg2A==}
     hasBin: true
     dependencies:
-      '@umijs/lint': 4.0.11_nj2vya5w6hsvqod5673wtbqeku
-      '@umijs/plugins': 4.0.11_xo7fjoqjibrnuea75o3qm7uusm
+      '@umijs/lint': 4.0.12_nj2vya5w6hsvqod5673wtbqeku
+      '@umijs/plugins': 4.0.12_xo7fjoqjibrnuea75o3qm7uusm
       antd: 4.20.7_ef5jwxihqo6n7gxfmzogljlgcm
       eslint: 8.15.0
       stylelint: 14.8.2
-      umi: 4.0.11_zpgjqj37zxn4pot5bjps6ibfya
+      umi: 4.0.12_zpgjqj37zxn4pot5bjps6ibfya
     transitivePeerDependencies:
       - '@babel/core'
       - '@types/react'
@@ -2343,25 +2336,25 @@ packages:
       - webpack-plugin-serve
     dev: false
 
-  /@umijs/mfsu/4.0.11:
-    resolution: {integrity: sha512-a8ImaSi8E/bVdV6mu3ck1f3pd6fwizTdhyoFlTmadwcKOqKzJ2xAH5TV/F2a1hbm1t2arbwofOs+TBCkf40evw==}
+  /@umijs/mfsu/4.0.12:
+    resolution: {integrity: sha512-k2A1psyc3E+miYu7Ehg8iR+IpLrkJweAT3IKY4JX14lDGU/a0W7mncqVPGlJJD49W1d1ppuj3Iom3YWWDkimWg==}
     dependencies:
-      '@umijs/bundler-esbuild': 4.0.11
-      '@umijs/bundler-utils': 4.0.11
-      '@umijs/utils': 4.0.11
+      '@umijs/bundler-esbuild': 4.0.12
+      '@umijs/bundler-utils': 4.0.12
+      '@umijs/utils': 4.0.12
       enhanced-resolve: 5.9.3
       is-equal: 1.6.4
     transitivePeerDependencies:
       - supports-color
     dev: false
 
-  /@umijs/plugins/4.0.11_xo7fjoqjibrnuea75o3qm7uusm:
-    resolution: {integrity: sha512-+Su1Yfh/grdnQJNQYjQvdNJiLcsh0e5XqhtKpFyg2jfdLjMTYR5Ve3DiCMnJQYBHWior+T5+3cQr5KXsXvmh/A==}
+  /@umijs/plugins/4.0.12_xo7fjoqjibrnuea75o3qm7uusm:
+    resolution: {integrity: sha512-Y2kpSsYOvM6xU420GCyexPPEU6GSS4PVAjT84HEK6zkbrAOJU0wE+2VdTHWdicByZ4nA+CQ9Rs1ouPdGPM3QZw==}
     dependencies:
       '@ahooksjs/use-request': 2.8.15_react@18.1.0
       '@ant-design/icons': 4.7.0_ef5jwxihqo6n7gxfmzogljlgcm
       '@ant-design/pro-layout': 7.0.1-beta.29_ef5jwxihqo6n7gxfmzogljlgcm
-      '@umijs/bundler-utils': 4.0.11
+      '@umijs/bundler-utils': 4.0.12
       antd-dayjs-webpack-plugin: 1.0.6_dayjs@1.11.3
       axios: 0.27.2
       babel-plugin-import: 1.13.5
@@ -2390,19 +2383,19 @@ packages:
       - supports-color
     dev: false
 
-  /@umijs/preset-umi/4.0.11_yqoujom3h6hjllkdlibpxicdqe:
-    resolution: {integrity: sha512-xGIU/z23MmweYVLTOxXXxjzAsbhCecinPICFlJAZKuJIOLodLffgempuji91kBPGqoGOlx4jMZvVbmuVnpHyTQ==}
+  /@umijs/preset-umi/4.0.12_yqoujom3h6hjllkdlibpxicdqe:
+    resolution: {integrity: sha512-UPbFc3qrz+aeEHu2HXJHBC+Rv024dVD0Xt8WXDGHnxoBVnZvd+tKtsjK8jkw2UyS1cwp2j+x4CmcCh8BbjUPnQ==}
     dependencies:
       '@types/multer': 1.4.7
-      '@umijs/ast': 4.0.11
-      '@umijs/babel-preset-umi': 4.0.11
-      '@umijs/bundler-utils': 4.0.11
-      '@umijs/bundler-vite': 4.0.11
-      '@umijs/bundler-webpack': 4.0.11_typescript@4.7.4
-      '@umijs/core': 4.0.11
-      '@umijs/renderer-react': 4.0.11_ef5jwxihqo6n7gxfmzogljlgcm
-      '@umijs/server': 4.0.11
-      '@umijs/utils': 4.0.11
+      '@umijs/ast': 4.0.12
+      '@umijs/babel-preset-umi': 4.0.12
+      '@umijs/bundler-utils': 4.0.12
+      '@umijs/bundler-vite': 4.0.12
+      '@umijs/bundler-webpack': 4.0.12_typescript@4.7.4
+      '@umijs/core': 4.0.12
+      '@umijs/renderer-react': 4.0.12_ef5jwxihqo6n7gxfmzogljlgcm
+      '@umijs/server': 4.0.12
+      '@umijs/utils': 4.0.12
       click-to-react-component: 1.0.8_iupzlfzo47c7rghj3avw7kmjhq
       core-js: 3.22.4
       current-script-polyfill: 1.0.0
@@ -2431,8 +2424,8 @@ packages:
       - webpack-plugin-serve
     dev: false
 
-  /@umijs/renderer-react/4.0.11_ef5jwxihqo6n7gxfmzogljlgcm:
-    resolution: {integrity: sha512-4PR0cPe0ZWaOIO0K78UIBYRgXrZn0sBfRYX88wTChVp1HQOPgmrbopLh5R6arWdZvGN7ON0JVLnUIUL9ai6YfA==}
+  /@umijs/renderer-react/4.0.12_ef5jwxihqo6n7gxfmzogljlgcm:
+    resolution: {integrity: sha512-g0yujzndtDK/WxnbexnY7U43y9C4A9kvpkvH4Pnvo/KKBMRhM0UmtfULqXzlNQLYVM4o+5cVkibpCSC0oM6b7w==}
     peerDependencies:
       react: '>=16.8'
       react-dom: '>=16.8'
@@ -2454,10 +2447,10 @@ packages:
       memoize-one: 5.2.1
     dev: false
 
-  /@umijs/server/4.0.11:
-    resolution: {integrity: sha512-RjLKgCpMFip0N7S1P86NzFbIK9dG+lwnR04RdJCCsJhqdw/vhxeOlu5QLkVolD/a692WjvA039GK7CgYJdZEeg==}
+  /@umijs/server/4.0.12:
+    resolution: {integrity: sha512-/uZ+SyviLvsZh6x4/k/e8Z1B4l5WZn4OXtClzCLVcPXysfGDTIWhc6emEeYcyH0xUCDm359kaUJIj6MDKe+qrw==}
     dependencies:
-      '@umijs/bundler-utils': 4.0.11
+      '@umijs/bundler-utils': 4.0.12
       history: 5.3.0
       react: 18.1.0
       react-dom: 18.1.0_react@18.1.0
@@ -2470,8 +2463,8 @@ packages:
     resolution: {integrity: sha512-XlcwzSYQ/SRZpHdwIyMDS4FOGX5kP4U/2g2mykyn/iPQTK4xTiQAyBu6UnnDnn7d5P8s7Atzh1C7H0ETNOypJg==}
     dev: false
 
-  /@umijs/test/4.0.11:
-    resolution: {integrity: sha512-PAn3CDNzbFEVlGr/sxn+ykcSLAVWT9cZxMymmRRbDgUywc2gotSwmt6CayYwZPKEKdfSv8oW9Ix0/+CEeLtDNQ==}
+  /@umijs/test/4.0.12:
+    resolution: {integrity: sha512-/xMtTM4quQONo0rZOY6RczG7/r4ckQdSeMRdNP/rRxGa5O3jxJfVDaqXanyBfMO+XDBkKhIW4SbgzK7pZ6yHEg==}
     dependencies:
       '@jest/types': 27.5.1
       esbuild: 0.14.51
@@ -2492,8 +2485,8 @@ packages:
       react: 18.1.0
     dev: false
 
-  /@umijs/utils/4.0.11:
-    resolution: {integrity: sha512-Rdqf3B9jR6BLDrbRw5qZcDknzRoHIP4lf1ih3x70Jniw521tp2ht1D3rE/334fZJ4DP5OKUVW+vCh/0vSPyjPQ==}
+  /@umijs/utils/4.0.12:
+    resolution: {integrity: sha512-mjVmpE/Jv3L7Q8EjTkz1tdauieS036vW+EXRMScH+s1eRvXNevxu+EDMycPTAfZujEVo5PT8JpnHDYYbUVcAqg==}
     dependencies:
       chokidar: 3.5.3
       pino: 7.11.0
@@ -3845,7 +3838,7 @@ packages:
     peerDependencies:
       redux: 4.x
     dependencies:
-      '@babel/runtime': 7.18.3
+      '@babel/runtime': 7.18.9
       flatten: 1.0.3
       global: 4.4.0
       invariant: 2.2.4
@@ -3860,7 +3853,7 @@ packages:
     peerDependencies:
       dva: ^2.5.0-0
     dependencies:
-      '@babel/runtime': 7.18.3
+      '@babel/runtime': 7.18.9
       immer: 8.0.4
     dev: false
 
@@ -3869,7 +3862,7 @@ packages:
     peerDependencies:
       dva-core: ^1.1.0 | ^1.5.0-0 | ^1.6.0-0
     dependencies:
-      '@babel/runtime': 7.18.3
+      '@babel/runtime': 7.18.9
       dva-core: 2.0.4_redux@4.2.0
     dev: false
 
@@ -5241,7 +5234,7 @@ packages:
   /import-html-entry/1.12.0:
     resolution: {integrity: sha512-wloMEMwupKJ8DWvKsEzJTXhHVieEH8ylu9ebeQg7T9JUsPTo0Zwa1EkuSKgKJvOiA2MxAFkeYYvd/E2pKiFtWQ==}
     dependencies:
-      '@babel/runtime': 7.18.3
+      '@babel/runtime': 7.18.9
     dev: false
 
   /import-lazy/4.0.0:
@@ -7189,7 +7182,7 @@ packages:
   /qiankun/2.7.3:
     resolution: {integrity: sha512-o0hEXgpMxkmlADiiEfQBMFo1cp84LfsEP6xhMT5R7QbGa3uGFR/T8EtyeOlvmhzjAaGExP6+r1bxiF8w4JV71A==}
     dependencies:
-      '@babel/runtime': 7.18.3
+      '@babel/runtime': 7.18.9
       import-html-entry: 1.12.0
       lodash: 4.17.21
       single-spa: 5.9.4
@@ -7446,7 +7439,7 @@ packages:
       react: '>=16.9.0'
       react-dom: '>=16.9.0'
     dependencies:
-      '@babel/runtime': 7.18.3
+      '@babel/runtime': 7.18.9
       classnames: 2.3.1
       rc-util: 5.21.5_ef5jwxihqo6n7gxfmzogljlgcm
       react: 18.1.0
@@ -7474,7 +7467,7 @@ packages:
       react: '>=16.9.0'
       react-dom: '>=16.9.0'
     dependencies:
-      '@babel/runtime': 7.18.3
+      '@babel/runtime': 7.18.9
       classnames: 2.3.1
       rc-resize-observer: 1.2.0_ef5jwxihqo6n7gxfmzogljlgcm
       rc-util: 5.21.5_ef5jwxihqo6n7gxfmzogljlgcm
@@ -7546,7 +7539,7 @@ packages:
       react: '>=16.9.0'
       react-dom: '>=16.9.0'
     dependencies:
-      '@babel/runtime': 7.18.3
+      '@babel/runtime': 7.18.9
       classnames: 2.3.1
       rc-util: 5.21.5_ef5jwxihqo6n7gxfmzogljlgcm
       react: 18.1.0
@@ -7727,7 +7720,7 @@ packages:
       react: '>=16.9.0'
       react-dom: '>=16.9.0'
     dependencies:
-      '@babel/runtime': 7.18.3
+      '@babel/runtime': 7.18.9
       classnames: 2.3.1
       rc-align: 4.0.12_ef5jwxihqo6n7gxfmzogljlgcm
       rc-motion: 2.6.0_ef5jwxihqo6n7gxfmzogljlgcm
@@ -7910,7 +7903,7 @@ packages:
       react-native:
         optional: true
     dependencies:
-      '@babel/runtime': 7.18.3
+      '@babel/runtime': 7.18.9
       '@types/react-redux': 7.1.24
       hoist-non-react-statics: 3.3.2
       loose-envify: 1.4.0
@@ -7941,7 +7934,7 @@ packages:
       redux:
         optional: true
     dependencies:
-      '@babel/runtime': 7.18.3
+      '@babel/runtime': 7.18.9
       '@types/hoist-non-react-statics': 3.3.1
       '@types/react': 18.0.14
       '@types/react-dom': 18.0.5
@@ -7991,7 +7984,7 @@ packages:
       react: ^0.14.0 || ^15.0.0 || ^16.0.0
       react-dom: ^0.14.0 || ^15.0.0 || ^16.0.0
     dependencies:
-      '@babel/runtime': 7.18.3
+      '@babel/runtime': 7.18.9
       invariant: 2.2.4
       prop-types: 15.8.1
       react: 18.1.0
@@ -8017,7 +8010,7 @@ packages:
       prop-types: ^15.6.2
       react: ^0.14.0 || ^15.0.0 || ^16.0.0
     dependencies:
-      '@babel/runtime': 7.18.3
+      '@babel/runtime': 7.18.9
       react: 18.1.0
       resize-observer-polyfill: 1.5.1
     dev: false
@@ -8111,7 +8104,7 @@ packages:
   /redux/4.2.0:
     resolution: {integrity: sha512-oSBmcKKIuIR4ME29/AeNUnl5L+hvBq7OaJWzaptTQJAntaPvxIJqfnjbaEiCzzaIz+XmVILfqAM3Ob0aXLPfjA==}
     dependencies:
-      '@babel/runtime': 7.18.3
+      '@babel/runtime': 7.18.9
     dev: false
 
   /reflect.getprototypeof/1.0.2:
@@ -8928,7 +8921,7 @@ packages:
   /tween-one/1.1.8:
     resolution: {integrity: sha512-b9WD0/ZauKmhpomV5skXkTw6MMOEKLmBsWXV754Vp0WuJALcDP5u7PQSvMMFqVSQ/eg8R8DAxiaNebHZtB57fg==}
     dependencies:
-      '@babel/runtime': 7.18.3
+      '@babel/runtime': 7.18.9
       flubber: 0.4.2
       raf: 3.4.1
       style-utils: 0.3.8
@@ -8975,26 +8968,27 @@ packages:
     resolution: {integrity: sha512-C0WQT0gezHuw6AdY1M2jxUO83Rjf0HP7Sk1DtXj6j1EwkQNZrHAg2XPWlq62oqEhYvONq5pkC2Y9oPljWToLmQ==}
     engines: {node: '>=4.2.0'}
     hasBin: true
+    dev: true
 
   /ufo/0.8.4:
     resolution: {integrity: sha512-/+BmBDe8GvlB2nIflWasLLAInjYG0bC9HRnfEpNi4sw77J2AJNnEVnTDReVrehoh825+Q/evF3THXTAweyam2g==}
     dev: true
 
-  /umi/4.0.11_zpgjqj37zxn4pot5bjps6ibfya:
-    resolution: {integrity: sha512-rmhT5t3cvCplBelcZX/ajwd9wXuPkTGksjYYeUxxesciykLkrtIkMfMTMcgo7DQV1iIdzxIynL17R8S7Vwntjw==}
+  /umi/4.0.12_zpgjqj37zxn4pot5bjps6ibfya:
+    resolution: {integrity: sha512-wp6jTZMl6jvxBm3Ub0zFmSxNk6fbVNrA6K21cdpAQF+3KrgItuJ2TAKN2kquvWvkZmaA1OhQ8mIv3bEd0+VaBQ==}
     engines: {node: '>=14'}
     hasBin: true
     dependencies:
       '@babel/runtime': 7.18.9
-      '@umijs/bundler-utils': 4.0.11
-      '@umijs/bundler-webpack': 4.0.11_typescript@4.7.4
-      '@umijs/core': 4.0.11
-      '@umijs/lint': 4.0.11_nj2vya5w6hsvqod5673wtbqeku
-      '@umijs/preset-umi': 4.0.11_yqoujom3h6hjllkdlibpxicdqe
-      '@umijs/renderer-react': 4.0.11_ef5jwxihqo6n7gxfmzogljlgcm
-      '@umijs/server': 4.0.11
-      '@umijs/test': 4.0.11
-      '@umijs/utils': 4.0.11
+      '@umijs/bundler-utils': 4.0.12
+      '@umijs/bundler-webpack': 4.0.12_typescript@4.7.4
+      '@umijs/core': 4.0.12
+      '@umijs/lint': 4.0.12_nj2vya5w6hsvqod5673wtbqeku
+      '@umijs/preset-umi': 4.0.12_yqoujom3h6hjllkdlibpxicdqe
+      '@umijs/renderer-react': 4.0.12_ef5jwxihqo6n7gxfmzogljlgcm
+      '@umijs/server': 4.0.12
+      '@umijs/test': 4.0.12
+      '@umijs/utils': 4.0.12
       prettier-plugin-organize-imports: 2.3.4_gd3y7r3s3evy6b2vthd7dmacga
       prettier-plugin-packagejson: 2.2.18_prettier@2.7.1
     transitivePeerDependencies:

+ 1 - 1
src/enums/access.ts

@@ -69,7 +69,7 @@ export enum BackstagePermission {
   VIEW_BUSINESS_MANAGEMENT = 'viewBusinessManagement',
   /** 业务设置-查看资料清单 */
   VIEW_INVENTORY_TEMPLATE = 'viewInventoryTemplate',
-  /** 业务设置-查看流程用户 */
+  /** 业务设置-查看步骤执行者 */
   VIEW_PROCESS_USER = 'viewProcessUser',
   /** 表单设置-查看基础数据类型 */
   VIEW_BASE_SCHEMA = 'viewBaseSchema',

+ 22 - 0
src/enums/gc.ts

@@ -0,0 +1,22 @@
+/** 业务类型 */
+export enum BusinessType {
+  /** 预算 */
+  BUDGET = 'ys',
+  /** 决算 */
+  FINAL = 'jues',
+  /** 结算 */
+  SETTLEMENT = 'jies'
+}
+/** 执行者配置方式 */
+export enum ExecutorSetType {
+  /** 预置成员 */
+  PRESET_MEMBER = 'yz',
+  /** 步骤设置 */
+  STEP_SETTING = 'bz'
+}
+
+/** 执行者审批模式 */
+export enum ApprovalType {
+  /** 指定用户 */
+  TARGET = 'user'
+}

+ 1 - 1
src/locales/zh-CN/menu.ts

@@ -31,7 +31,7 @@ export default {
   'menu.business': '业务审批设置',
   'menu.business.viewRuleCode': '编号规则设置',
   'menu.business.viewInventoryTemplate': '审核资料清单模板',
-  'menu.business.viewProcessUser': '流程用户设置',
+  'menu.business.viewProcessUser': '步骤执行者',
   'menu.schema': '表单设置',
   'menu.schema.viewBaseSchema': '基础数据设置',
   'menu.schema.viewBaseSchema.base': '基础数据设置',

+ 119 - 0
src/pages/Business/Process/components/MemberItem.tsx

@@ -0,0 +1,119 @@
+import { queryAccountList } from '@/services/api/institution'
+import { queryInstitutionRoleList } from '@/services/api/project'
+import consts from '@/utils/consts'
+import { useRequest } from '@umijs/max'
+import { Select, TreeSelect } from 'antd'
+import { useState } from 'react'
+
+enum AuditType {
+  ACCOUNT = 'account',
+  INSTITUTION = 'institution',
+  ROLE = 'role'
+}
+
+const auditTypeOptions = [
+  { label: '用户', value: AuditType.ACCOUNT },
+  { label: '单位角色', value: AuditType.INSTITUTION }
+  // { label: '审批角色', value: 'role'}
+]
+
+type MemberItemProps = {
+  value: string[]
+  onChange: (value?: string) => void
+}
+
+type iState = {
+  auditType: AuditType
+  memberOptions: string[]
+  members: string[]
+}
+
+const filterTreeNodes = (mode: AuditType, tree: string[]) =>
+  tree.map(item => {
+    const newItem = { ...item }
+    // 重新拼装id, 根据AuditType加上不同的前缀(后端同步前缀格式)
+    switch (mode) {
+      case AuditType.ACCOUNT:
+        newItem.ID = `a_${newItem.ID}`
+        break
+      case AuditType.INSTITUTION:
+        newItem.ID = `i_${newItem.ID}`
+        break
+      default:
+        newItem.ID = `r_${newItem.ID}`
+        break
+    }
+    if (newItem.children) {
+      newItem.disabled = true
+      newItem.children = filterTreeNodes(newItem.children)
+      return newItem
+    }
+    return newItem
+  })
+
+const MemberItem: React.FC<MemberItemProps> = ({ value, onChange }) => {
+  const [state, setState] = useState<iState>({
+    auditType: AuditType.ACCOUNT,
+    memberOptions: [],
+    members: value
+  })
+  useRequest(
+    () => {
+      let requestFn: Nullable<() => Promise<void>> = null
+      switch (state.auditType) {
+        case AuditType.ACCOUNT:
+          requestFn = () => queryAccountList({ pageSize: consts.MAX_PAGE_SIZE })
+          break
+        case AuditType.INSTITUTION:
+          requestFn = () => queryInstitutionRoleList({ pageSize: consts.MAX_PAGE_SIZE })
+          break
+        default:
+          break
+      }
+      return requestFn?.()
+    },
+    {
+      refreshDeps: [state.auditType],
+      onSuccess(data: { items: any[] }) {
+        setState({ ...state, memberOptions: filterTreeNodes(state.auditType, data.items) })
+      }
+    }
+  )
+  const toggleChange = value => {
+    if (value) {
+      onChange?.(value)
+    }
+    setState({ ...state, members: value })
+  }
+  const toggleAuditType = (value: AuditType) => setState({ ...state, auditType: value, members: [] })
+
+  return (
+    <div className="ant-form-item">
+      <div className="ant-row ant-form-item-row">
+        <div className="ant-col ant-col-5 ant-form-item-label">
+          <label className="ant-form-item-required">成员</label>
+        </div>
+        <div className="ant-col ant-form-item-control">
+          <div className="ant-form-item-control-input">
+            <div className="ant-form-item-control-input-content">
+              <Select
+                defaultValue={state.auditType}
+                options={auditTypeOptions}
+                onChange={toggleAuditType}
+                style={{ width: '100%' }}
+              />
+              <TreeSelect
+                value={state.members}
+                options={state.memberOptions}
+                onChange={toggleChange}
+                style={{ width: '100%', marginTop: '4px' }}
+              />
+            </div>
+          </div>
+        </div>
+      </div>
+    </div>
+  )
+}
+
+export default MemberItem

+ 108 - 0
src/pages/Business/Process/hooks/useScripts.tsx

@@ -0,0 +1,108 @@
+import MemberItem from '../components/MemberItem'
+import consts from '@/utils/consts'
+import { useState } from 'react'
+import { useRequest } from 'ahooks'
+import { addExecutor, queryExecutorList, updateExecutor } from '@/services/api/business'
+import { ApprovalType, ExecutorSetType } from '@/enums/gc'
+import { ExclamationCircleFilled } from '@ant-design/icons'
+import { Form, message, Tooltip } from 'antd'
+import ProForm, { ProFormRadio, ProFormText } from '@ant-design/pro-form'
+
+import type { ModalAction } from '@/components/Modal'
+
+const setTypeOptions = [
+  {
+    label: (
+      <div>
+        <span className="mr-1">预置成员</span>
+        <Tooltip title="审批用户为该角色绑定成员">
+          <ExclamationCircleFilled style={{ color: 'orange' }} />
+        </Tooltip>
+      </div>
+    ),
+    value: ExecutorSetType.PRESET_MEMBER
+  },
+  {
+    label: (
+      <div>
+        <span className="mr-1">步骤设置</span>
+        <Tooltip title="审批用户为该角色动态配置">
+          <ExclamationCircleFilled style={{ color: 'orange' }} />
+        </Tooltip>
+      </div>
+    ),
+    value: ExecutorSetType.STEP_SETTING
+  }
+]
+
+type iState = {
+  list: API.ExecutorItem[]
+  total: number
+}
+const approvalTypeOptions = [{ label: '指定用户', value: ApprovalType.TARGET }]
+export default function useScripts(modal: ModalAction) {
+  const [state, seState] = useState<iState>({
+    list: [],
+    total: 0
+  })
+  const { refresh, loading } = useRequest(queryExecutorList, {
+    onSuccess: (result?: iState) => {
+      seState(result)
+    }
+  })
+
+  const addOrEdit = (mode: 'add' | 'edit', initialValues?: API.ExecutorItem) => {
+    const text = mode === 'add' ? '新增执行者' : '编辑执行者'
+    modal.open({
+      title: text,
+      okText: '确定',
+      cancelText: '取消',
+      type: 'form',
+      initialValues: initialValues ?? {},
+      children: (
+        <ProForm<API.ExecutorItem>
+          submitter={false}
+          layout="horizontal"
+          labelCol={{ span: 5 }}
+          isKeyPressSubmit>
+          <ProFormText
+            label="执行者名称"
+            name="name"
+            rules={[{ required: true, message: '请输入' }]}
+            placeholder="请输入"
+          />
+          <ProFormRadio.Group
+            label="配置方式"
+            name="setType"
+            options={setTypeOptions}
+            rules={[{ required: true, message: '请选择' }]}
+          />
+          <ProFormRadio.Group
+            label="审批模式"
+            name="approvalType"
+            options={approvalTypeOptions}
+            rules={[{ required: true, message: '请选择' }]}
+          />
+          <Form.Item noStyle name="members" rules={[{ required: true, message: '请选择' }]}>
+            <MemberItem />
+          </Form.Item>
+        </ProForm>
+      ),
+      onOk: async (values: API.ExecutorItem) => {
+        let requestFn: Nullable<() => Promise<viod>> = null
+        if (mode === 'add') {
+          requestFn = addExecutor
+        } else {
+          requestFn = updateExecutor
+        }
+        const { code = -1 } = await requestFn?.(values)
+        if (code === consts.RET_CODE.SUCCESS) {
+          refresh()
+          modal.close()
+          message.success(text + '成功')
+        }
+      }
+    })
+  }
+  return { data: state, loading, addOrEdit }
+}

+ 61 - 253
src/pages/Business/Process/index.tsx

@@ -1,252 +1,58 @@
-import { PageContainer } from '@ant-design/pro-layout'
-import { useDispatch, connect } from 'umi'
-import { message } from 'antd'
-import React, { useState, useEffect } from 'react'
 import LeftMenu from './components/LeftMenu'
-import { createForm, onFieldReact } from '@formily/core'
-import { createSchemaField } from '@formily/react'
-import {
-  FormItem,
-  Input,
-  Switch,
-  Select,
-  FormGrid,
-  FormLayout,
-  Form,
-  Radio,
-  Checkbox,
-  NumberPicker,
-  Password,
-  DatePicker,
-  TimePicker,
-  TreeSelect,
-  FormButtonGroup,
-  Submit
-} from '@formily/antd'
-import { schema } from './schema'
-import { queryOrganizationalMembersList } from '@/services/api/institution'
-import { useRequest } from '@umijs/max'
-import consts from '@/utils/consts'
-import { queryApprovalAccountDetail, saveApprovalAccount } from '@/services/api/schema'
-
-export enum LeftMenuEnum {
-  BUDGET = '1'
-}
+import ProTable, { ProColumnType } from '@ant-design/pro-table'
+import useModal from '@/components/Modal'
+import { useState } from 'react'
+import { PageContainer } from '@ant-design/pro-layout'
+import { BusinessType, ApprovalType } from '@/enums/gc'
+import useScripts from './hooks/useScripts'
+import { Button } from 'antd'
 
-export const menuOptions = [{ label: '预算业务审批', value: LeftMenuEnum.BUDGET }]
+export const menuOptions = [{ label: '预算业务审批', value: BusinessType.BUDGET }]
 
 type iProcessProps = {
-  activeKey: LeftMenuEnum
-  approvalAccountDetail: API.ApprovalAccountDetail[]
+  activeKey: BusinessType
 }
 
-let cacheKeys: string[] = []
-
-const Process: React.FC = props => {
-  const { institutionList } = props
-  const dispatch = useDispatch()
+const Process = () => {
   const [state, setState] = useState<iProcessProps>({
-    activeKey: LeftMenuEnum.BUDGET,
-    approvalAccountDetail: null
+    activeKey: BusinessType.BUDGET
   })
+  const [modal, ModalDOM] = useModal()
+  const { data, loading, addOrEdit } = useScripts(modal)
 
-  useRequest(queryApprovalAccountDetail, {
-    onSuccess: (result: API.ApprovalAccountDetail) => {
-      setState({
-        ...state,
-        approvalAccountDetail:
-          result?.reduce((prev, curr) => {
-            const obj = { ...prev }
-            obj[curr.name] = {
-              [`${curr.name}InstitutionID`]: curr.institutionID,
-              [`${curr.name}AccountIDs`]: curr.accountIDs
-            }
-            return obj
-          }, {}) || []
-      })
-    }
-  })
-
-  const renderTreeNodes = data =>
-    data.map(item => {
-      const newItem = { ...item }
-      if (newItem.children) {
-        newItem.disabled = true
-        newItem.children = renderTreeNodes(newItem.children)
-        return newItem
+  const columns: ProColumnType<API.ExecutorItem>[] = [
+    {
+      dataIndex: 'name',
+      title: '执行者名称',
+      width: 120,
+      ellipsis: true
+    },
+    {
+      dataIndex: 'setType',
+      title: '配置方式',
+      width: 80
+    },
+    {
+      dataIndex: 'approvalType',
+      title: '审批模式',
+      width: 80,
+      valueEnum: {
+        [ApprovalType.TARGET]: { text: '指定用户' }
       }
-      return newItem
-    })
-
-  useEffect(() => {
-    if (!institutionList.length) {
-      dispatch({
-        type: 'business/queryInstitution',
-        payload: { pageSize: 214000 }
-      })
-    }
-    // tryApprovalAccountDetail()
-  }, [])
-
-  console.log('2')
-
-  const form = createForm({
-    initialValues: state.approvalAccountDetail,
-    effects() {
-      onFieldReact('receiver.receiverInstitutionID', async field => {
-        if (!field.dataSource?.length) {
-          // 将企事业列表直接赋予当前字段
-          field.dataSource = institutionList?.items?.map(item => ({
-            value: item.ID,
-            label: item.name
-          }))
-          return
-        }
-        // 收件人企事业id
-        const institutionID: undefined | string = field.value
-        institutionID &&
-          form.setFieldState('receiver.receiverAccountIDs', async field => {
-            const { code = -1, data } = await queryOrganizationalMembersList({ institutionID })
-            if (code === consts.RET_CODE.SUCCESS) {
-              if (cacheKeys.some((key: string) => key.startsWith('receiver_'))) {
-                // 说明当前企事业id已变,需要将当前field的value置空
-                field.value = []
-                cacheKeys = cacheKeys
-                  .filter(item => item.startsWith('receiver_'))
-                  .concat(`receiver_${institutionID}`)
-              } else {
-                cacheKeys = cacheKeys.concat(`receiver_${institutionID}`)
-              }
-              field.dataSource = renderTreeNodes(data)
-            }
-          })
-      })
-      onFieldReact('fgLeader.fgLeaderInstitutionID', async field => {
-        if (!field.dataSource?.length) {
-          field.dataSource = institutionList?.items?.map(item => ({
-            value: item.ID,
-            label: item.name
-          }))
-          return
-        }
-        const institutionID: undefined | string = field.value
-        institutionID &&
-          form.setFieldState('fgLeader.fgLeaderAccountIDs', async field => {
-            const { code = -1, data } = await queryOrganizationalMembersList({ institutionID })
-            if (code === consts.RET_CODE.SUCCESS) {
-              if (cacheKeys.some((key: string) => key.startsWith('fgLeader_'))) {
-                // 说明当前企事业id已变,需要将当前field的value置空
-                field.value = []
-                cacheKeys = cacheKeys
-                  .filter(item => item.startsWith('fgLeader_'))
-                  .concat(`fgLeader_${institutionID}`)
-              } else {
-                cacheKeys = cacheKeys.concat(`fgLeader_${institutionID}`)
-              }
-
-              field.dataSource = renderTreeNodes(data)
-            }
-          })
-      })
-      onFieldReact('zxLeader.zxLeaderInstitutionID', async field => {
-        if (!field.dataSource?.length) {
-          field.dataSource = institutionList?.items?.map(item => ({ value: item.ID, label: item.name }))
-          return
-        }
-        const institutionID: undefined | string = field.value
-        institutionID &&
-          form.setFieldState('zxLeader.zxLeaderAccountIDs', async field => {
-            const { code = -1, data } = await queryOrganizationalMembersList({ institutionID })
-            if (code === consts.RET_CODE.SUCCESS) {
-              field.dataSource = renderTreeNodes(data)
-              if (cacheKeys.some((key: string) => key.startsWith('zxLeader_'))) {
-                // 说明当前企事业id已变,需要将当前field的value置空
-                field.value = []
-                cacheKeys = cacheKeys
-                  .filter(item => item.startsWith('zxLeader_'))
-                  .concat(`zxLeader_${institutionID}`)
-              } else {
-                cacheKeys = cacheKeys.concat(`zxLeader_${institutionID}`)
-              }
-            }
-          })
-      })
-      onFieldReact('post.postInstitutionID', async field => {
-        if (!field.dataSource?.length) {
-          field.dataSource = institutionList?.items?.map(item => ({ value: item.ID, label: item.name }))
-          return
-        }
-        const institutionID: undefined | string = field.value
-        institutionID &&
-          form.setFieldState('post.postAccountIDs', async field => {
-            const { code = -1, data } = await queryOrganizationalMembersList({ institutionID })
-            if (code === consts.RET_CODE.SUCCESS) {
-              if (cacheKeys.some((key: string) => key.startsWith('post_'))) {
-                // 说明当前企事业id已变,需要将当前field的value置空
-                field.value = []
-                cacheKeys = cacheKeys.filter(item => item.startsWith('post_')).concat(`post_${institutionID}`)
-              }
-              cacheKeys = cacheKeys.concat(`post_${institutionID}`)
-              field.dataSource = renderTreeNodes(data)
-            }
-          })
-      })
-      onFieldReact('archive.archiveInstitutionID', async field => {
-        if (!field.dataSource?.length) {
-          field.dataSource = institutionList?.items?.map(item => ({ value: item.ID, label: item.name }))
-          return
-        }
-        const institutionID: undefined | string = field.value
-        institutionID &&
-          form.setFieldState('archive.archiveAccountIDs', async field => {
-            const { code = -1, data } = await queryOrganizationalMembersList({ institutionID })
-            if (code === consts.RET_CODE.SUCCESS) {
-              if (cacheKeys.some((key: string) => key.startsWith('archive_'))) {
-                // 说明当前企事业id已变,需要将当前field的value置空
-                field.value = []
-                cacheKeys = cacheKeys
-                  .filter(item => item.startsWith('archive_'))
-                  .concat(`archive_${institutionID}`)
-              } else {
-                cacheKeys = cacheKeys.concat(`archive_${institutionID}`)
-              }
-              field.dataSource = renderTreeNodes(data)
-            }
-          })
-      })
-    }
-  })
-
-  const SchemaField = createSchemaField({
-    components: {
-      FormLayout,
-      FormItem,
-      FormGrid,
-      Input,
-      Switch,
-      Select,
-      Radio,
-      Checkbox,
-      NumberPicker,
-      Password,
-      DatePicker,
-      TimePicker,
-      TreeSelect
+    },
+    {
+      dataIndex: 'members',
+      title: '成员',
+      renderText: (record: { name: string; ID: string }[]) => (
+        <div className="children:mx-1">{record.map(item => item.name)}</div>
+      )
+    },
+    {
+      dataIndex: 'step',
+      title: '步骤',
+      renderText: (record: { name: string; ID: string }) => record.name
     }
-  })
-
-  const onFinish = async (values: Record<string, any>) => {
-    const keys = Object.keys(values)
-    const params = keys.reduce((prev, curr) => {
-      const obj = { ...prev, ...values[curr] }
-      return obj
-    }, {})
-    const { code = -1 } = await saveApprovalAccount(params)
-    if (code === consts.RET_CODE.SUCCESS) {
-      message.success('编辑成功')
-    }
-  }
-
+  ]
   return (
     <PageContainer title={false}>
       <div className="h-full w-full flex flex-row">
@@ -256,24 +62,26 @@ const Process: React.FC = props => {
           value={state.activeKey}
           onChange={key => setState({ ...state, activeKey: key })}
         />
-        <div className="w-6/7 ml-8 bg-white p-6 rounded-20px">
-          <div className="flex flex-row mb-5 w-full text-xl">流程用户设置</div>
-          <div className="max-w-800px">
-            <div className="w-600px">
-              <Form form={form} labelCol={8} wrapperCol={16}>
-                <SchemaField schema={schema} />
-                <FormButtonGroup.Sticky className="ml-100px">
-                  <Submit onSubmit={onFinish}>提交</Submit>
-                </FormButtonGroup.Sticky>
-              </Form>
-            </div>
-          </div>
+        <div className="w-6/7 ml-8 bg-white">
+          <ProTable
+            toolbar={{
+              actions: [
+                <Button key="add_executor" type="primary" onClick={() => addOrEdit('add')}>
+                  新建执行者
+                </Button>
+              ]
+            }}
+            search={false}
+            columns={columns}
+            dataSource={data.list}
+            loading={loading}
+            pagination={{ total: data.total }}
+          />
         </div>
       </div>
+      {ModalDOM}
     </PageContainer>
   )
 }
 
-export default connect(({ business }) => ({
-  institutionList: business.institutionList
-}))(Process)
+export default Process

+ 0 - 1
src/pages/Business/model.ts

@@ -5,7 +5,6 @@ import consts from '@/utils/consts'
 import type { Effect, Reducer } from '@umijs/max'
 
 export interface BusinessModelState {
-  dataID: string
   institutionList: API.InstitutionList[]
 }
 

+ 1 - 0
src/pages/Institutions/Company/Detail/components/Staff.tsx

@@ -15,6 +15,7 @@ import { ModalType } from '@/utils/enum'
 import type { ColumnsStateType } from '@ant-design/pro-table/lib/typing'
 import { BackstagePermission } from '@/enums/access'
 import { UserOutlined } from '@ant-design/icons'
+import classNames from 'classnames'
 
 type ListProps = ConnectProps & {
   accountType: API.AccountType[]

+ 2 - 2
src/pages/Permission/BackRole/components/PermTabs/index.tsx

@@ -257,14 +257,14 @@ const PermTabs: React.FC<PermTabsProps> = ({ currentPermData: { ID } }) => {
                   </div>
                 </div> */}
               <div>
-                <h4 className="pt-3">流程用户配置</h4>
+                <h4 className="pt-3">步骤执行者配置</h4>
                 <div className="my-2">
                   <Checkbox
                     onChange={e =>
                       handleBackOnchange(e.target.checked, BackstagePermission.VIEW_PROCESS_USER)
                     }
                     checked={permission.includes(BackstagePermission.VIEW_PROCESS_USER)}>
-                    查看流程用户
+                    查看信息
                   </Checkbox>
                 </div>
               </div>

+ 2 - 2
src/pages/Project/Approval/index.tsx

@@ -9,7 +9,7 @@ import React, { useEffect, useRef, useState } from 'react'
 import {
   addInstitutionRole,
   delInstitutionRole,
-  getInstitutionRole,
+  queryInstitutionRoleList,
   updateInstitutionRole
 } from '@/services/api/project'
 import consts from '@/utils/consts'
@@ -165,7 +165,7 @@ const Approval: React.FC = props => {
             search={false}
             scroll={{ y: document.body.clientHeight - 315 }}
             request={async params => {
-              const { code = -1, data: { items = [], total = 0 } = {} } = await getInstitutionRole({
+              const { code = -1, data: { items = [], total = 0 } = {} } = await queryInstitutionRoleList({
                 ...params
               })
               return {

+ 1 - 1
src/pages/System/Admin/index.tsx

@@ -13,7 +13,7 @@ const AdminUpdate = () => {
       window.localStorage.removeItem('TOKEN_ID')
       message.info('当前用户密码已修改,请重新登录。')
       history.replace({
-        pathname: consts.loginPath
+        pathname: consts.LOGIN_PATH
       })
     },
     onError: e => {

+ 31 - 0
src/services/api/business.ts

@@ -1,3 +1,4 @@
+import { BusinessType } from '@/enums/gc'
 import { request } from '@umijs/max'
 
 /** 清单模板 列表 */
@@ -70,3 +71,33 @@ export async function updateRuleCode(params: API.RuleCodeUpdateParams) {
     data: params
   })
 }
+
+/** 获取执行者列表 */
+export async function queryExecutorList(params: { bussinessType: BusinessType }) {
+  return request('/executor/list', {
+    method: 'GET',
+    data: params
+  })
+}
+
+/** 新增执行者 */
+export async function addExecutor(params: Omit<API.ExecutorItem, 'ID'>) {
+  return request('/executor/add', {
+    method: 'POST',
+    data: params
+  })
+}
+/** 更新执行者 */
+export async function updateExecutor(params: Omit<API.ExecutorItem>) {
+  return request('/executor/update', {
+    method: 'POST',
+    data: params
+  })
+}
+/** 删除执行者 */
+export async function delExecutor(params: { ID: string }) {
+  return request('/executor/delete', {
+    method: 'POST',
+    data: params
+  })
+}

+ 3 - 4
src/services/api/project.ts

@@ -163,11 +163,10 @@ export async function publishApproval(params: { ID: string }) {
   })
 }
 
-/** 新增单位审批角色 */
-export async function getInstitutionRole(params: API.InstitutionRoleParams) {
+/** 单位审批角色列表 */
+export async function queryInstitutionRoleList(params: { current?: number; pageSize?: number }) {
   return request('/InstitutionRole/list', {
-    method: 'POST',
-    data: params
+    params
   })
 }
 

+ 13 - 3
src/services/api/typings.d.ts

@@ -159,8 +159,6 @@ declare namespace API {
     accountType: number
     /** @name  对应类型ID*/
     dataID?: string
-    /** @name  获得创建人/非创建人 */
-    isCreated?: string
   }
 
   type AccountType = {
@@ -391,7 +389,7 @@ declare namespace API {
     children?: ProfileTemplateItem[]
   }
 
-  type InstitutionRoleParams = {
+  type InstitutionRoleItem = {
     ID: string
     acronym: string
     approvalMember: any[]
@@ -419,4 +417,16 @@ declare namespace API {
     tab: string
     rules: any[]
   }
+
+  type ExecutorItem = {
+    ID?: string
+    name?: string
+    /** 设置方式: yz-预置成员,bz-步骤设置 */
+    setType?: 'yz' | 'bz'
+    /** 审批模式: user-指定用户, xx-会签, yy-或签 */
+    approvalType?: 'user'
+    step?: string
+    members?: string[]
+    businessType?: string
+  }
 }

+ 3 - 2
src/utils/consts.ts

@@ -5,7 +5,8 @@ export default {
   },
   PREFIX_URL: '/api',
   TOKEN_INVALID_CODE: [2],
-  loginPath: '/user/login',
+  LOGIN_PATH: '/user/login',
   TOKEN_WHITE_LIST: ['/api/login'], // 不需要设置token的白名单
-  TOKEN_HEADER: 'Authorization' // token的键值
+  TOKEN_HEADER: 'Authorization', // token的键值
+  MAX_PAGE_SIZE: 21400 // 页数
 }