From 5d3529a43c2f80c6eff5235c646a446737dcb13c Mon Sep 17 00:00:00 2001
From: wupengfei <834520024@qq.com>
Date: 星期三, 30 七月 2025 14:07:55 +0800
Subject: [PATCH] feat: 页面

---
 src/services/api/FlexTask.ts                                      |   63 +
 src/views/EmploymentManage/EmploymentSignList.vue                 |  163 ++
 src/views/FlexJobManage/constants/columns.ts                      |   80 +
 src/views/EmploymentManage/constants/columns.ts                   |  154 ++
 src/hooks/useEvent.ts                                             |    2 
 src/views/FlexJobManage/components/StaffInfoDialog.vue            |  199 +++
 src/views/EmploymentManage/EmploymentManage.vue                   |  249 ++++
 src/hooks/index.ts                                                |    1 
 pnpm-lock.yaml                                                    |  289 ++-
 src/services/api/FlexEnterpriseWoker.ts                           |   54 
 src/views/EmploymentManage/AddOrEditEmployment.vue                |   19 
 src/services/api/FlexEnterprise.ts                                |  108 +
 src/services/api/User.ts                                          |   11 
 src/views/EmploymentManage/components/AddOrEditEmploymentView.vue |  201 +++
 src/router/index.ts                                               |  108 +
 src/views/EmploymentManage/EmploymentManageDetail.vue             |   10 
 src/views/FlexJobManage/components/BatchImportDialog.vue          |  109 +
 src/hooks/dic.ts                                                  |   54 
 src/services/api/Common.ts                                        |   15 
 src/services/api/FlexWorker.ts                                    |  336 +++++
 src/services/api/typings.d.ts                                     |  758 ++++++++++++
 config/config.ts                                                  |   10 
 src/constants/enum.ts                                             |   24 
 src/views/EmploymentManage/EmploymentManageArrange.vue            |  237 +++
 src/views/EmploymentManage/constants/index.ts                     |    1 
 src/views/FlexJobManage/FlexJobManage.vue                         |  350 +++++
 src/utils/common/file.ts                                          |   13 
 src/services/api/index.ts                                         |    8 
 src/views/FlexJobManage/constants/index.ts                        |    1 
 src/services/api/UserResume.ts                                    |   46 
 package.json                                                      |    4 
 31 files changed, 3,519 insertions(+), 158 deletions(-)

diff --git a/config/config.ts b/config/config.ts
index 8a42988..4a5b1e7 100644
--- a/config/config.ts
+++ b/config/config.ts
@@ -4,20 +4,20 @@
   /**
    * @description 缃戦〉title
    */
-  title: '涔愰亣淇濅簯鏈嶅姟',
+  title: '鐏靛伐浼佷笟瀹㈡埛绔�',
 
   errorLog: 'production',
 
-  loginFormTitle: '涔愰亣淇濅簯鏈嶅姟',
+  loginFormTitle: '鐏靛伐浼佷笟瀹㈡埛绔�',
 });
 
 type AppType = 'one' | 'rz' | 'jx';
 
 const AppSettingMap = {
   one: {
-    title: '涔愰亣淇濅簯鏈嶅姟',
-    loginFormTitle: '涔愰亣淇濅簯鏈嶅姟',
-    MenuTitle: '涔愰亣淇濅簯鏈嶅姟',
+    title: '鐏靛伐浼佷笟瀹㈡埛绔�',
+    loginFormTitle: '鐏靛伐浼佷笟瀹㈡埛绔�',
+    MenuTitle: '鐏靛伐浼佷笟瀹㈡埛绔�',
   },
   rz: {
     title: '鑱氬崈淇濈悊璧旂鐞嗗伐鍏�',
diff --git a/package.json b/package.json
index a009c7f..d522be6 100644
--- a/package.json
+++ b/package.json
@@ -4,11 +4,7 @@
   "version": "1.0.0",
   "scripts": {
     "dev": "cross-env vite",
-    "dev:jx": "cross-env VITE_AppType=jx vite",
     "build": "cross-env NODE_OPTIONS=--max_old_space_size=16000 vite build",
-    "build:rz": "cross-env NODE_OPTIONS=--max_old_space_size=16000 VITE_AppType=rz vite build --mode rz",
-    "build:jx": "cross-env NODE_OPTIONS=--max_old_space_size=16000 VITE_AppType=jx vite build --mode jx",
-    "build:all": "run-p build build:jx",
     "build:staging": "cross-env vite build --mode staging",
     "build:staging:jenkins": "cross-env NODE_OPTIONS=--max_old_space_size=16000 vite build --mode staging",
     "preview": "vite preview",
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index 613b3ae..16613f6 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -1,5 +1,9 @@
 lockfileVersion: '6.0'
 
+settings:
+  autoInstallPeers: true
+  excludeLinksFromLockfile: false
+
 overrides:
   vue: 3.5.11
 
@@ -17,13 +21,13 @@
     version: 1.0.3(@bole-12333/chat-kit@1.0.1)(@tiptap/core@2.1.13)(@tiptap/extension-document@2.1.13)(@tiptap/extension-image@2.1.13)(@tiptap/extension-mention@2.1.13)(@tiptap/extension-paragraph@2.1.13)(@tiptap/extension-placeholder@2.1.13)(@tiptap/extension-text@2.1.13)(@tiptap/pm@2.1.13)(@tiptap/suggestion@2.1.13)(dayjs@1.11.6)(vue@3.5.11)
   '@bole-core/components':
     specifier: latest
-    version: 1.3.2(@bole-core/core@1.0.2)(@bole-core/sass-utils@0.0.1)(@element-plus/icons-vue@2.3.1)(@tanstack/vue-query@4.37.1)(@videojs-player/vue@1.0.0)(@vueuse/core@11.1.0)(@vueuse/shared@11.1.0)(dayjs@1.11.6)(element-plus@2.9.1)(lodash@4.17.21)(mitt@3.0.0)(senin-help@1.0.5)(senin-vue@1.0.4)(video.js@7.20.3)(vue-component-type-helpers@2.1.6)(vue@3.5.11)
+    version: 1.3.10(@bole-core/core@1.0.7)(@bole-core/sass-utils@0.0.1)(@element-plus/icons-vue@2.3.1)(@tanstack/vue-query@4.37.1)(@videojs-player/vue@1.0.0)(@vueuse/core@11.1.0)(@vueuse/shared@11.1.0)(dayjs@1.11.6)(element-plus@2.9.1)(lodash@4.17.21)(mitt@3.0.0)(senin-help@1.0.5)(senin-vue@1.0.4)(video.js@7.20.3)(vue-component-type-helpers@2.1.6)(vue@3.5.11)
   '@bole-core/core':
     specifier: latest
-    version: 1.0.2(@ywwlmm/openapi@0.0.3)(ali-oss@6.21.0)(axios@1.7.7)(dayjs@1.11.6)(element-plus@2.9.1)(file-saver@2.0.5)(jszip@3.10.1)(lodash@4.17.21)(senior-request@1.0.1)(vue-router@4.4.5)(vue@3.5.11)(xlsx-style@0.8.13)(xlsx@0.18.5)
+    version: 1.0.7(@ywwlmm/openapi@0.0.3)(ali-oss@6.21.0)(axios@1.7.7)(dayjs@1.11.6)(element-plus@2.9.1)(file-saver@2.0.5)(jszip@3.10.1)(lodash@4.17.21)(senior-request@1.0.1)(vue-router@4.4.5)(vue@3.5.11)(xlsx-style@0.8.13)(xlsx@0.18.5)
   '@bole-core/pretty-layout':
     specifier: latest
-    version: 1.2.0(@bole-core/core@1.0.2)(@bole-core/sass-utils@0.0.1)(@element-plus/icons-vue@2.3.1)(@vueuse/core@11.1.0)(element-plus@2.9.1)(fuse.js@6.6.2)(lottie-web@5.10.2)(path-browserify@1.0.1)(path-to-regexp@6.2.1)(pinia@2.2.4)(vue-router@4.4.5)(vue@3.5.11)
+    version: 1.2.0(@bole-core/core@1.0.7)(@bole-core/sass-utils@0.0.1)(@element-plus/icons-vue@2.3.1)(@vueuse/core@11.1.0)(element-plus@2.9.1)(fuse.js@6.6.2)(lottie-web@5.10.2)(path-browserify@1.0.1)(path-to-regexp@6.2.1)(pinia@2.2.4)(vue-router@4.4.5)(vue@3.5.11)
   '@bole-core/sass-utils':
     specifier: latest
     version: 0.0.1(element-plus@2.9.1)
@@ -44,13 +48,13 @@
     version: 4.37.1(vue@3.5.11)
   '@tencentcloud/call-uikit-vue':
     specifier: ^3.1.5
-    version: 3.1.5(react-native@0.76.5)(react@19.0.0)
+    version: 3.1.5
   '@tencentcloud/chat-uikit-vue':
     specifier: ^2.0.0
     version: 2.0.0(@tiptap/core@2.1.13)(@tiptap/extension-document@2.1.13)(@tiptap/extension-image@2.1.13)(@tiptap/extension-mention@2.1.13)(@tiptap/extension-paragraph@2.1.13)(@tiptap/extension-placeholder@2.1.13)(@tiptap/extension-text@2.1.13)(@tiptap/pm@2.1.13)(@tiptap/suggestion@2.1.13)(react-native@0.76.5)(react@19.0.0)(vue@3.5.11)
   '@tencentcloud/tui-core':
     specifier: ^2.0.0
-    version: 2.0.0(react-native@0.76.5)(react@19.0.0)
+    version: 2.0.0
   '@videojs-player/vue':
     specifier: ^1.0.0
     version: 1.0.0(@types/video.js@7.3.49)(video.js@7.20.3)(vue@3.5.11)
@@ -2117,9 +2121,9 @@
     peerDependencies:
       '@tencentcloud/chat-uikit-engine': '*'
       lodash: '*'
-      vue: '*'
+      vue: 3.5.11
     dependencies:
-      '@tencentcloud/chat-uikit-engine': 2.4.0(react-native@0.76.5)(react@19.0.0)
+      '@tencentcloud/chat-uikit-engine': 2.4.0
       lodash: 4.17.21
       vue: 3.5.11(typescript@4.8.4)
     dev: false
@@ -2138,7 +2142,7 @@
       '@tiptap/pm': ^2.0.0-beta.220
       '@tiptap/suggestion': ^2.0.0-beta.220
       dayjs: '*'
-      vue: '*'
+      vue: 3.5.11
     dependencies:
       '@bole-12333/chat-kit': 1.0.1(@tencentcloud/chat-uikit-engine@2.4.0)(lodash@4.17.21)(vue@3.5.11)
       '@tiptap/core': 2.1.13(@tiptap/pm@2.1.13)
@@ -2154,8 +2158,8 @@
       vue: 3.5.11(typescript@4.8.4)
     dev: false
 
-  /@bole-core/components@1.3.2(@bole-core/core@1.0.2)(@bole-core/sass-utils@0.0.1)(@element-plus/icons-vue@2.3.1)(@tanstack/vue-query@4.37.1)(@videojs-player/vue@1.0.0)(@vueuse/core@11.1.0)(@vueuse/shared@11.1.0)(dayjs@1.11.6)(element-plus@2.9.1)(lodash@4.17.21)(mitt@3.0.0)(senin-help@1.0.5)(senin-vue@1.0.4)(video.js@7.20.3)(vue-component-type-helpers@2.1.6)(vue@3.5.11):
-    resolution: {integrity: sha512-sMCgoaKtJi3nPP3MrMx5cs0IjI0Tbes3YJF1AHN3TItR549aYc+vb+mkU34MjWh7EzqTE40htPxJueAGT6tMWg==}
+  /@bole-core/components@1.3.10(@bole-core/core@1.0.7)(@bole-core/sass-utils@0.0.1)(@element-plus/icons-vue@2.3.1)(@tanstack/vue-query@4.37.1)(@videojs-player/vue@1.0.0)(@vueuse/core@11.1.0)(@vueuse/shared@11.1.0)(dayjs@1.11.6)(element-plus@2.9.1)(lodash@4.17.21)(mitt@3.0.0)(senin-help@1.0.5)(senin-vue@1.0.4)(video.js@7.20.3)(vue-component-type-helpers@2.1.6)(vue@3.5.11):
+    resolution: {integrity: sha512-SRE33nhD4i8MQVvBGbCGH++RfozRM74ctmkhCOCeCoZnlKSqI/i9UlYVrg1Yre5P9TLjh7vEXmSI4TlALrTNXQ==}
     peerDependencies:
       '@bole-core/core': '*'
       '@bole-core/sass-utils': '*'
@@ -2171,10 +2175,10 @@
       senin-help: '*'
       senin-vue: '*'
       video.js: '*'
-      vue: '*'
+      vue: 3.5.11
       vue-component-type-helpers: ^2.1.6
     dependencies:
-      '@bole-core/core': 1.0.2(@ywwlmm/openapi@0.0.3)(ali-oss@6.21.0)(axios@1.7.7)(dayjs@1.11.6)(element-plus@2.9.1)(file-saver@2.0.5)(jszip@3.10.1)(lodash@4.17.21)(senior-request@1.0.1)(vue-router@4.4.5)(vue@3.5.11)(xlsx-style@0.8.13)(xlsx@0.18.5)
+      '@bole-core/core': 1.0.7(@ywwlmm/openapi@0.0.3)(ali-oss@6.21.0)(axios@1.7.7)(dayjs@1.11.6)(element-plus@2.9.1)(file-saver@2.0.5)(jszip@3.10.1)(lodash@4.17.21)(senior-request@1.0.1)(vue-router@4.4.5)(vue@3.5.11)(xlsx-style@0.8.13)(xlsx@0.18.5)
       '@bole-core/sass-utils': 0.0.1(element-plus@2.9.1)
       '@element-plus/icons-vue': 2.3.1(vue@3.5.11)
       '@tanstack/vue-query': 4.37.1(vue@3.5.11)
@@ -2192,8 +2196,8 @@
       vue-component-type-helpers: 2.1.6
     dev: false
 
-  /@bole-core/core@1.0.2(@ywwlmm/openapi@0.0.3)(ali-oss@6.21.0)(axios@1.7.7)(dayjs@1.11.6)(element-plus@2.9.1)(file-saver@2.0.5)(jszip@3.10.1)(lodash@4.17.21)(senior-request@1.0.1)(vue-router@4.4.5)(vue@3.5.11)(xlsx-style@0.8.13)(xlsx@0.18.5):
-    resolution: {integrity: sha512-v5XqgmuaFe1l5tBe9CHytW8UhqI8rh2m8R2J7F2F46XZy5wh7vGfiHshuaooTbfK6ex9A06jcepIWwDOklLs+A==}
+  /@bole-core/core@1.0.7(@ywwlmm/openapi@0.0.3)(ali-oss@6.21.0)(axios@1.7.7)(dayjs@1.11.6)(element-plus@2.9.1)(file-saver@2.0.5)(jszip@3.10.1)(lodash@4.17.21)(senior-request@1.0.1)(vue-router@4.4.5)(vue@3.5.11)(xlsx-style@0.8.13)(xlsx@0.18.5):
+    resolution: {integrity: sha512-VICs9m+qAaMvORNcaKSP1Gkr4thhxvwooh2hd7fBmkIYqDitOYmcssBsPno7jjp+5fuZYQ3LwHQ9Vl/whbTpCw==}
     peerDependencies:
       '@ywwlmm/openapi': '*'
       ali-oss: '*'
@@ -2204,7 +2208,7 @@
       jszip: '*'
       lodash: '*'
       senior-request: '*'
-      vue: '*'
+      vue: 3.5.11
       vue-router: '*'
       xlsx: '*'
       xlsx-style: '*'
@@ -2224,7 +2228,7 @@
       xlsx-style: 0.8.13(patch_hash=6ixwdxwh5a3amidwu6vee22jpi)
     dev: false
 
-  /@bole-core/pretty-layout@1.2.0(@bole-core/core@1.0.2)(@bole-core/sass-utils@0.0.1)(@element-plus/icons-vue@2.3.1)(@vueuse/core@11.1.0)(element-plus@2.9.1)(fuse.js@6.6.2)(lottie-web@5.10.2)(path-browserify@1.0.1)(path-to-regexp@6.2.1)(pinia@2.2.4)(vue-router@4.4.5)(vue@3.5.11):
+  /@bole-core/pretty-layout@1.2.0(@bole-core/core@1.0.7)(@bole-core/sass-utils@0.0.1)(@element-plus/icons-vue@2.3.1)(@vueuse/core@11.1.0)(element-plus@2.9.1)(fuse.js@6.6.2)(lottie-web@5.10.2)(path-browserify@1.0.1)(path-to-regexp@6.2.1)(pinia@2.2.4)(vue-router@4.4.5)(vue@3.5.11):
     resolution: {integrity: sha512-LvneMdMfGj6dpFR7voQd2F+v02P4zYHGP3BAWKcrTj8BMeWXRt08Sz7qBrhq1F8lidjqi7TCttQbx2cEV1qBEA==}
     peerDependencies:
       '@bole-core/core': '*'
@@ -2237,10 +2241,10 @@
       path-browserify: '*'
       path-to-regexp: '*'
       pinia: '*'
-      vue: '*'
+      vue: 3.5.11
       vue-router: '*'
     dependencies:
-      '@bole-core/core': 1.0.2(@ywwlmm/openapi@0.0.3)(ali-oss@6.21.0)(axios@1.7.7)(dayjs@1.11.6)(element-plus@2.9.1)(file-saver@2.0.5)(jszip@3.10.1)(lodash@4.17.21)(senior-request@1.0.1)(vue-router@4.4.5)(vue@3.5.11)(xlsx-style@0.8.13)(xlsx@0.18.5)
+      '@bole-core/core': 1.0.7(@ywwlmm/openapi@0.0.3)(ali-oss@6.21.0)(axios@1.7.7)(dayjs@1.11.6)(element-plus@2.9.1)(file-saver@2.0.5)(jszip@3.10.1)(lodash@4.17.21)(senior-request@1.0.1)(vue-router@4.4.5)(vue@3.5.11)(xlsx-style@0.8.13)(xlsx@0.18.5)
       '@bole-core/sass-utils': 0.0.1(element-plus@2.9.1)
       '@element-plus/icons-vue': 2.3.1(vue@3.5.11)
       '@vueuse/core': 11.1.0(vue@3.5.11)
@@ -2274,7 +2278,7 @@
     resolution: {integrity: sha512-33Cfr0zjbc3Dd8d5b1IgzXRAgXH0c2Gv19VI4snS25V/x9Z41eg769tC+Us1x+vqgQQhgD5YUjLnkpkrQfeMSw==}
     peerDependencies:
       qrcode: ^1.5.0
-      vue: ^3.0.0
+      vue: 3.5.11
     dependencies:
       qrcode: 1.5.4
       vue: 3.5.11(typescript@4.8.4)
@@ -2922,7 +2926,7 @@
   /@element-plus/icons-vue@2.3.1(vue@3.5.11):
     resolution: {integrity: sha512-XxVUZv48RZAd87ucGS48jPf6pKu0yV5UCg9f4FFwtrYxXOwWuVJo6wOvSLKEoMQKjv8GsX/mhP6UsC1lRwbUWg==}
     peerDependencies:
-      vue: ^3.2.0
+      vue: 3.5.11
     dependencies:
       vue: 3.5.11(typescript@4.8.4)
     dev: false
@@ -3300,7 +3304,7 @@
   /@iconify/vue@4.0.0(vue@3.5.11):
     resolution: {integrity: sha512-73z81Yf2HISfehu3qvN9GqL1OnUO7wEMKkiFwVGJ2pqAdGCR8FrVylhRhka+6U+gFLlng0ynnT20svk3jJYwow==}
     peerDependencies:
-      vue: '>=3'
+      vue: 3.5.11
     dependencies:
       '@iconify/types': 2.0.0
       vue: 3.5.11(typescript@4.8.4)
@@ -4203,7 +4207,7 @@
     dependencies:
       '@babel/core': 7.25.7
       postcss: 7.0.39
-      postcss-syntax: 0.36.2(postcss-html@0.36.0)(postcss-jsx@0.36.4)(postcss-less@3.1.4)(postcss-markdown@0.36.0)(postcss-scss@2.1.1)(postcss@7.0.39)
+      postcss-syntax: 0.36.2(postcss-html@0.36.0)(postcss-less@3.1.4)(postcss-scss@2.1.1)(postcss@7.0.39)
     transitivePeerDependencies:
       - supports-color
     dev: false
@@ -4216,7 +4220,7 @@
       postcss-syntax: '>=0.36.2'
     dependencies:
       postcss: 7.0.39
-      postcss-syntax: 0.36.2(postcss-html@0.36.0)(postcss-jsx@0.36.4)(postcss-less@3.1.4)(postcss-markdown@0.36.0)(postcss-scss@2.1.1)(postcss@7.0.39)
+      postcss-syntax: 0.36.2(postcss-html@0.36.0)(postcss-less@3.1.4)(postcss-scss@2.1.1)(postcss@7.0.39)
       remark: 13.0.0
       unist-util-find-all-after: 3.0.2
     transitivePeerDependencies:
@@ -4242,7 +4246,7 @@
     resolution: {integrity: sha512-QzCQ94g2oZQcEfI4nfqa6Qr3aFXtXiEH17Jho+QFl73c7epqsWNcyP3ovF1fgJz5jEOE5OYtwgkoaRKIRaSigg==}
     peerDependencies:
       '@vue/composition-api': ^1.1.2
-      vue: ^2.5.0 || ^3.0.0
+      vue: 3.5.11
     peerDependenciesMeta:
       '@vue/composition-api':
         optional: true
@@ -4254,60 +4258,76 @@
       vue-demi: 0.13.11(vue@3.5.11)
     dev: false
 
-  /@tencentcloud/call-uikit-vue2.6@3.3.9(react-native@0.76.5)(react@19.0.0)(vue@3.5.11):
-    resolution: {integrity: sha512-EWXc+wqGXlWSmkR/ucKdwPpe+tOXwtYDL2wUD3C/XW4pmKldtxRIIWIzDzo9upPTeojZMfIIoOC/che7wwE9KQ==}
+  /@tencentcloud/call-engine-js@3.2.0(react-native@0.76.5)(react@19.0.0):
+    resolution: {integrity: sha512-IcDgkD2IICHkQh9WkeWsfwL9gecok89wIEFJPTVVFhC7fTLe4obOCI42TV4n+1sREm8BdGkAYvOurGf6CpXCng==}
     dependencies:
       '@tencentcloud/chat': 3.5.2(react-native@0.76.5)(react@19.0.0)
-      '@tencentcloud/tui-core': 2.4.0(react-native@0.76.5)(react@19.0.0)
+      core-js: 3.38.1
+      eventemitter3: 4.0.7
+      rtc-detect: 0.0.5
+      trtc-cloud-js-sdk: 2.9.3
+      tuikit-logger: 0.0.4-beta.1
+    transitivePeerDependencies:
+      - react
+      - react-native
+    dev: false
+
+  /@tencentcloud/call-uikit-vue2.6@4.0.8(react-native@0.76.5)(react@19.0.0)(vue@3.5.11):
+    resolution: {integrity: sha512-lRxCQ+V684FahkBWEhHhq1mOXgLJPkt/XEfNayYqQmzP8X01FlxLr+xJshnBbi6Hs6B/R1ak0d5vk8EsniQr1g==}
+    dependencies:
+      '@tencentcloud/call-engine-js': 3.2.0(react-native@0.76.5)(react@19.0.0)
+      '@tencentcloud/chat': 3.5.2(react-native@0.76.5)(react@19.0.0)
+      '@tencentcloud/tui-core': 2.5.1
       '@vue/composition-api': 1.7.2(vue@3.5.11)
-      tuicall-engine-webrtc: 3.1.6(react-native@0.76.5)(react@19.0.0)
     transitivePeerDependencies:
       - react
       - react-native
       - vue
     dev: false
 
-  /@tencentcloud/call-uikit-vue2@3.3.9(react-native@0.76.5)(react@19.0.0):
-    resolution: {integrity: sha512-xAa1eQGoYj6PKoaSLxNXHPXTO5A/ld8A5Oy9Ps3qjEQWaOIkei8cqJfRX5tUJiQSeNJAxME/GrqLueIARshnTg==}
+  /@tencentcloud/call-uikit-vue2@4.0.8(react-native@0.76.5)(react@19.0.0):
+    resolution: {integrity: sha512-vwWv/Wd7349EhI1JTCPpL4ZgHFrxAyuU5v8U2aqzElQO3Uv2HHAowr7DkbFfzbAm0oDvcXWBqwBcb7rDvM1h7w==}
     dependencies:
+      '@tencentcloud/call-engine-js': 3.2.0(react-native@0.76.5)(react@19.0.0)
       '@tencentcloud/chat': 3.5.2(react-native@0.76.5)(react@19.0.0)
-      '@tencentcloud/tui-core': 2.4.0(react-native@0.76.5)(react@19.0.0)
-      tuicall-engine-webrtc: 3.1.6(react-native@0.76.5)(react@19.0.0)
+      '@tencentcloud/tui-core': 2.5.1
     transitivePeerDependencies:
       - react
       - react-native
     dev: false
 
-  /@tencentcloud/call-uikit-vue@3.1.5(react-native@0.76.5)(react@19.0.0):
+  /@tencentcloud/call-uikit-vue@3.1.5:
     resolution: {integrity: sha512-xblFYyol6rXMYKv5NAy45K/VwGIKPCheqUevjoE3Jt7dVqYQMdlXkbWcjcoY1lVmr2545Ej2QN0Xo+PGAHkD1g==}
     dependencies:
-      '@tencentcloud/tui-core': 2.4.0(react-native@0.76.5)(react@19.0.0)
-      tuicall-engine-webrtc: 3.1.6(react-native@0.76.5)(react@19.0.0)
-    transitivePeerDependencies:
-      - react
-      - react-native
+      '@tencentcloud/tui-core': 2.5.1
+      tuicall-engine-webrtc: 3.1.7
     dev: false
 
-  /@tencentcloud/call-uikit-vue@3.3.9(react-native@0.76.5)(react@19.0.0):
-    resolution: {integrity: sha512-fFwQSAU+PVqantxbabRZa268BBBcv+hIX265Ag3ogYcrKq/hEo8XyH7nkjZL8wkQ2hFvnkwUgMMLXVeAgyMsng==}
+  /@tencentcloud/call-uikit-vue@4.0.8(react-native@0.76.5)(react@19.0.0):
+    resolution: {integrity: sha512-eRq0yfhojCJYpywJ2WhRf0UI+oNM5EPOc3F6wskkvHasoySp0NdxwlusX3LAq0WevnxCJl3xZD6fPMnzpndqjQ==}
     dependencies:
+      '@tencentcloud/call-engine-js': 3.2.0(react-native@0.76.5)(react@19.0.0)
       '@tencentcloud/chat': 3.5.2(react-native@0.76.5)(react@19.0.0)
-      '@tencentcloud/tui-core': 2.4.0(react-native@0.76.5)(react@19.0.0)
-      tuicall-engine-webrtc: 3.1.6(react-native@0.76.5)(react@19.0.0)
+      '@tencentcloud/tui-core': 2.5.1
     transitivePeerDependencies:
       - react
       - react-native
     dev: false
 
-  /@tencentcloud/chat-uikit-engine@2.4.0(react-native@0.76.5)(react@19.0.0):
+  /@tencentcloud/chat-uikit-engine@2.4.0:
     resolution: {integrity: sha512-zE+bygEROaqgeMXXO+X2+2x8JH55mnb9c1sYQVQ507FlFT0maHxEQPOq8/EZBWowUDDlYoWbHh1EBAXEAI3dgA==}
     dependencies:
-      '@tencentcloud/chat': 3.5.2(react-native@0.76.5)(react@19.0.0)
+      '@tencentcloud/chat': 3.5.7
       tim-profanity-filter-plugin: 1.1.0
       tim-upload-plugin: 1.4.2
-    transitivePeerDependencies:
-      - react
-      - react-native
+    dev: false
+
+  /@tencentcloud/chat-uikit-engine@2.5.1:
+    resolution: {integrity: sha512-++6jXbEtc0HxVD4Zdbse1gp1pbMQfco9/NgQBenLwA38FI+v2kmtt5ccc/xHEMxqAqc671E8dB/zYZQTc1074g==}
+    dependencies:
+      '@tencentcloud/chat': 3.5.7
+      tim-profanity-filter-plugin: 1.1.0
+      tim-upload-plugin: 1.4.2
     dev: false
 
   /@tencentcloud/chat-uikit-vue@2.0.0(@tiptap/core@2.1.13)(@tiptap/extension-document@2.1.13)(@tiptap/extension-image@2.1.13)(@tiptap/extension-mention@2.1.13)(@tiptap/extension-paragraph@2.1.13)(@tiptap/extension-placeholder@2.1.13)(@tiptap/extension-text@2.1.13)(@tiptap/pm@2.1.13)(@tiptap/suggestion@2.1.13)(react-native@0.76.5)(react@19.0.0)(vue@3.5.11):
@@ -4323,12 +4343,12 @@
       '@tiptap/pm': ^2.0.0-beta.220
       '@tiptap/suggestion': ^2.0.0-beta.220
     dependencies:
-      '@tencentcloud/call-uikit-vue': 3.3.9(react-native@0.76.5)(react@19.0.0)
-      '@tencentcloud/call-uikit-vue2': 3.3.9(react-native@0.76.5)(react@19.0.0)
-      '@tencentcloud/call-uikit-vue2.6': 3.3.9(react-native@0.76.5)(react@19.0.0)(vue@3.5.11)
-      '@tencentcloud/chat-uikit-engine': 2.4.0(react-native@0.76.5)(react@19.0.0)
-      '@tencentcloud/tui-core': 2.4.0(react-native@0.76.5)(react@19.0.0)
-      '@tencentcloud/tui-customer-service-plugin': 2.2.6(@tencentcloud/tui-core@2.4.0)(vue@3.5.11)
+      '@tencentcloud/call-uikit-vue': 4.0.8(react-native@0.76.5)(react@19.0.0)
+      '@tencentcloud/call-uikit-vue2': 4.0.8(react-native@0.76.5)(react@19.0.0)
+      '@tencentcloud/call-uikit-vue2.6': 4.0.8(react-native@0.76.5)(react@19.0.0)(vue@3.5.11)
+      '@tencentcloud/chat-uikit-engine': 2.5.1
+      '@tencentcloud/tui-core': 2.5.1
+      '@tencentcloud/tui-customer-service-plugin': 2.2.6(@tencentcloud/tui-core@2.5.1)(vue@3.5.11)
       '@tiptap/core': 2.1.13(@tiptap/pm@2.1.13)
       '@tiptap/extension-document': 2.1.13(@tiptap/core@2.1.13)
       '@tiptap/extension-image': 2.1.13(@tiptap/core@2.1.13)
@@ -4352,15 +4372,19 @@
   /@tencentcloud/chat@3.5.2(react-native@0.76.5)(react@19.0.0):
     resolution: {integrity: sha512-UuGswGE3jaPgAFHA5kMDASI4Vq5p3lzeK9YisN5kkl9dcxh7BKbxTp5qtD8Fy7tj4VcWbytCb6ytCufmThbDXA==}
     dependencies:
-      '@tencentcloud/react-native-push': 1.1.0(react-native@0.76.5)(react@19.0.0)
-      '@tencentcloud/uni-app-push': 1.1.0
+      '@tencentcloud/react-native-push': 1.2.0(react-native@0.76.5)(react@19.0.0)
+      '@tencentcloud/uni-app-push': 1.2.0
     transitivePeerDependencies:
       - react
       - react-native
     dev: false
 
-  /@tencentcloud/react-native-push@1.1.0(react-native@0.76.5)(react@19.0.0):
-    resolution: {integrity: sha512-6TvPhNnKrBvd6j9dUwFLpkmV9WkdkaQstNvzdK1nIWQgWCTJGFnyiNDEn8zwN2VZkG+MzjYwNqMcVkMMU9Ao2g==}
+  /@tencentcloud/chat@3.5.7:
+    resolution: {integrity: sha512-uxACmaFPqV8jXcORBwVSHc0qgKvnHzRg9kC8kHAqCGbsnsm8525JwFzU6ByckGCNqNWUx/5W70EISYAboLuTvQ==}
+    dev: false
+
+  /@tencentcloud/react-native-push@1.2.0(react-native@0.76.5)(react@19.0.0):
+    resolution: {integrity: sha512-/GI4J1LNnbCz1LxJ6WHtYhymoVg8ot5gASJ9o/YczgghynnZf7b9rfe2d8Z43YjhPog9Rx1Jfdqb3WVa8T7w0A==}
     peerDependencies:
       react: '*'
       react-native: '>= 0.75'
@@ -4369,46 +4393,40 @@
       react-native: 0.76.5(@babel/core@7.25.7)(@babel/preset-env@7.25.8)(react@19.0.0)
     dev: false
 
-  /@tencentcloud/tui-core@2.0.0(react-native@0.76.5)(react@19.0.0):
+  /@tencentcloud/tui-core@2.0.0:
     resolution: {integrity: sha512-KBwDFWFV+IGtAZ82uCjRi891nMQcAen0wZHdPUUTSNHaWGjYiwOAHD7yw4gC1c5DYqVYMa3tVA7bSBd/hKVZKg==}
     dependencies:
-      '@tencentcloud/chat': 3.5.2(react-native@0.76.5)(react@19.0.0)
+      '@tencentcloud/chat': 3.5.7
       tim-profanity-filter-plugin: 0.9.0
       tim-upload-plugin: 1.3.0
-    transitivePeerDependencies:
-      - react
-      - react-native
     dev: false
 
-  /@tencentcloud/tui-core@2.4.0(react-native@0.76.5)(react@19.0.0):
-    resolution: {integrity: sha512-OFXHoi8CQlPtWvNRLApg0wonWbW79uoTgAqqffqWO1icx3xDYd2RZDHMzpBexOsE3CHpWokrfXrqiXkpOmYWew==}
+  /@tencentcloud/tui-core@2.5.1:
+    resolution: {integrity: sha512-aXZG0INkV9WvFUHgmVQRibCs10r2u/oVb8qAEjW3maytBiLWOJQiK7dzshK9fnfadJAWQ027cpR8lCKz5r5Tlw==}
     dependencies:
-      '@tencentcloud/chat': 3.5.2(react-native@0.76.5)(react@19.0.0)
+      '@tencentcloud/chat': 3.5.7
       tim-profanity-filter-plugin: 1.1.0
       tim-upload-plugin: 1.4.2
-    transitivePeerDependencies:
-      - react
-      - react-native
     dev: false
 
-  /@tencentcloud/tui-customer-service-plugin@2.2.6(@tencentcloud/tui-core@2.4.0)(vue@3.5.11):
+  /@tencentcloud/tui-customer-service-plugin@2.2.6(@tencentcloud/tui-core@2.5.1)(vue@3.5.11):
     resolution: {integrity: sha512-Xc+Eii7qvptMqW3oONhl0UYKTJhotq0ZKdIVKy5fADMR1745aWwOxql5F0AOikuMR4iXEFQtxy7XvyfYp+o6UQ==}
     peerDependencies:
       '@tencentcloud/tui-core': latest
       '@vue/composition-api': ^1.0.0-rc.1
-      vue: ^2.0.0 || >=3.0.0
+      vue: 3.5.11
     peerDependenciesMeta:
       '@vue/composition-api':
         optional: true
     dependencies:
-      '@tencentcloud/tui-core': 2.4.0(react-native@0.76.5)(react@19.0.0)
+      '@tencentcloud/tui-core': 2.5.1
       '@tencentcloud/universal-api': 2.4.0
       marked: 4.0.0
       vue: 3.5.11(typescript@4.8.4)
     dev: false
 
-  /@tencentcloud/uni-app-push@1.1.0:
-    resolution: {integrity: sha512-9z8zgAxExwuxzuxq1sFK3jmRJOKG/BNL8i9v+a3jVK/R7XL7ROE5EPWh4gRYABb9DC48NK9hwx2RFqPTlbR/xg==}
+  /@tencentcloud/uni-app-push@1.2.0:
+    resolution: {integrity: sha512-l+hTZ4IkfgTqVLkDMWaJyAdTSM6HArPZ1PYi/V7j21XwsIJh21bEBGQ6UwojuRlOIbQDuZ32o+ZkjcVn2Gj8HA==}
     engines: {HBuilderX: ^3.6.8}
     dev: false
 
@@ -5209,7 +5227,7 @@
     peerDependencies:
       '@types/video.js': 7.x
       video.js: 7.x
-      vue: 3.x
+      vue: 3.5.11
     dependencies:
       '@types/video.js': 7.3.49
       video.js: 7.20.3
@@ -5275,7 +5293,7 @@
     engines: {node: ^18.0.0 || >=20.0.0}
     peerDependencies:
       vite: ^5.0.0
-      vue: ^3.0.0
+      vue: 3.5.11
     dependencies:
       '@babel/core': 7.25.7
       '@babel/plugin-transform-typescript': 7.24.7(@babel/core@7.25.7)
@@ -5291,7 +5309,7 @@
     engines: {node: ^18.0.0 || >=20.0.0}
     peerDependencies:
       vite: ^5.0.0
-      vue: ^3.2.25
+      vue: 3.5.11
     dependencies:
       vite: 6.0.6(@types/node@18.7.18)(sass@1.83.0)(terser@5.34.1)
       vue: 3.5.11(typescript@4.8.4)
@@ -5439,7 +5457,7 @@
   /@vue/composition-api@1.7.2(vue@3.5.11):
     resolution: {integrity: sha512-M8jm9J/laYrYT02665HkZ5l2fWTK4dcVg3BsDHm/pfz+MjDYwX+9FUaZyGwEyXEDonQYRCo0H7aLgdklcIELjw==}
     peerDependencies:
-      vue: '>= 2.5 < 2.7'
+      vue: 3.5.11
     dependencies:
       vue: 3.5.11(typescript@4.8.4)
     dev: false
@@ -5567,7 +5585,7 @@
     resolution: {integrity: sha512-B/Mdj9TK1peFyWaPof+Zf/mP9XuGAngaJZBwPaXBvU3aCTZlx3ltlrFFFyMV4iGBwsjSCeUCgZrtkEj9dS2Y3Q==}
     peerDependencies:
       '@vue/composition-api': ^1.1.0
-      vue: ^2.6.0 || ^3.2.0
+      vue: 3.5.11
     peerDependenciesMeta:
       '@vue/composition-api':
         optional: true
@@ -5608,7 +5626,7 @@
     resolution: {integrity: sha512-cAZqXexLX6xo+H1N1Mv+wBSSqG4wB+BdjIuHQ50jwlelXCDxSi8gj0K/9nDS+aUZtWh6YMwS6UGCKg58jMVglA==}
     peerDependencies:
       '@vue/composition-api': ^1.4.1
-      vue: ^2.0.0 || >=3.0.0-rc.0
+      vue: 3.5.11
     peerDependenciesMeta:
       '@vue/composition-api':
         optional: true
@@ -5634,7 +5652,7 @@
     resolution: {integrity: sha512-wt+T30c4K6dGRMVqPddexEVLa28YwxW5OFIPmzUHICjphfAuBFTTdDoyqREZNDOFJZ44ARH1WWQNCUK8koJ+Ag==}
     peerDependencies:
       '@vue/composition-api': ^1.1.0
-      vue: ^2.6.0 || ^3.2.0
+      vue: 3.5.11
     peerDependenciesMeta:
       '@vue/composition-api':
         optional: true
@@ -5732,7 +5750,7 @@
     resolution: {integrity: sha512-Xkrdo590AhLHvzyR+U246t6T89nIWHz1weAgMuo8jEA2HS5RiUnsA4U6+iUGaQ2E5c8mYQaeNqzHQXUp9Okbiw==}
     peerDependencies:
       '@wangeditor-next/editor': '>=5.1.0'
-      vue: ^3.0.5
+      vue: 3.5.11
     dependencies:
       '@wangeditor-next/editor': 5.3.14
       vue: 3.5.11(typescript@4.8.4)
@@ -8063,6 +8081,7 @@
     resolution: {integrity: sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==}
     engines: {node: '>=0.10'}
     hasBin: true
+    requiresBuild: true
     dev: true
     optional: true
 
@@ -8145,7 +8164,6 @@
       domelementtype: 2.3.0
       domhandler: 5.0.3
       entities: 4.5.0
-    dev: true
 
   /dom-walk@0.1.2:
     resolution: {integrity: sha512-6QvTW9mrGeIegrFXdtQi9pk7O/nSK6lSdXW2eqUspN5LWD7UTji2Fqw5V2YLjBpHEoU9Xl/eUWNpDeZvoyOv2w==}
@@ -8180,7 +8198,6 @@
     engines: {node: '>= 4'}
     dependencies:
       domelementtype: 2.3.0
-    dev: true
 
   /domutils@1.7.0:
     resolution: {integrity: sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==}
@@ -8202,7 +8219,6 @@
       dom-serializer: 2.0.0
       domelementtype: 2.3.0
       domhandler: 5.0.3
-    dev: true
 
   /dot-case@3.0.4:
     resolution: {integrity: sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==}
@@ -8269,7 +8285,7 @@
   /element-plus@2.9.1(vue@3.5.11):
     resolution: {integrity: sha512-9Agqf/jt4Ugk7EZ6C5LME71sgkvauPCsnvJN12Xid2XVobjufxMGpRE4L7pS4luJMOmFAH3J0NgYEGZT5r+NDg==}
     peerDependencies:
-      vue: ^3.2.0
+      vue: 3.5.11
     dependencies:
       '@ctrl/tinycolor': 3.4.1
       '@element-plus/icons-vue': 2.3.1(vue@3.5.11)
@@ -9200,6 +9216,10 @@
   /event-target-shim@5.0.1:
     resolution: {integrity: sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==}
     engines: {node: '>=6'}
+    dev: false
+
+  /eventemitter3@4.0.7:
+    resolution: {integrity: sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==}
     dev: false
 
   /execa@5.1.1:
@@ -10172,7 +10192,6 @@
       domhandler: 5.0.3
       domutils: 3.0.1
       entities: 4.5.0
-    dev: true
 
   /http-errors@2.0.0:
     resolution: {integrity: sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==}
@@ -11076,7 +11095,6 @@
 
   /js-tokens@8.0.0:
     resolution: {integrity: sha512-PC7MzqInq9OqKyTXfIvQNcjMkODJYC8A17kAaQgeW79yfhqTWSOfjHYQ2mDDcwJ96Iibtwkfh0C7R/OvqPlgVA==}
-    dev: true
 
   /js-tokens@9.0.0:
     resolution: {integrity: sha512-WriZw1luRMlmV3LGJaR6QOJjWwgLUTf89OwT2lUOyjX2dJGBwgmIkbcz+7WFZjrZM635JOIR517++e/67CP9dQ==}
@@ -12383,7 +12401,6 @@
     resolution: {integrity: sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==}
     engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1}
     hasBin: true
-    dev: true
 
   /nanoid@3.3.7:
     resolution: {integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==}
@@ -12458,6 +12475,7 @@
 
   /node-addon-api@7.1.1:
     resolution: {integrity: sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==}
+    requiresBuild: true
     dev: true
     optional: true
 
@@ -13212,7 +13230,6 @@
 
   /picocolors@1.0.0:
     resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==}
-    dev: true
 
   /picocolors@1.1.0:
     resolution: {integrity: sha512-TQ92mBOW0l3LeMeyLV6mzy/kWr8lkd/hp3mTg7wYK7zJhuBStmGMBG0BdeDZS/dZx1IukaX6Bk11zcln25o1Aw==}
@@ -13256,7 +13273,7 @@
     peerDependencies:
       '@vue/composition-api': ^1.4.0
       typescript: '>=4.4.4'
-      vue: ^2.6.14 || ^3.3.0
+      vue: 3.5.11
     peerDependenciesMeta:
       '@vue/composition-api':
         optional: true
@@ -13497,7 +13514,7 @@
     dependencies:
       htmlparser2: 3.10.1
       postcss: 7.0.39
-      postcss-syntax: 0.36.2(postcss-html@0.36.0)(postcss-jsx@0.36.4)(postcss-less@3.1.4)(postcss-markdown@0.36.0)(postcss-scss@2.1.1)(postcss@7.0.39)
+      postcss-syntax: 0.36.2(postcss-html@0.36.0)(postcss-less@3.1.4)(postcss-scss@2.1.1)(postcss@7.0.39)
     dev: false
 
   /postcss-html@1.5.0:
@@ -13508,7 +13525,6 @@
       js-tokens: 8.0.0
       postcss: 8.4.18
       postcss-safe-parser: 6.0.0(postcss@8.4.18)
-    dev: true
 
   /postcss-image-set-function@7.0.0(postcss@8.4.18):
     resolution: {integrity: sha512-QL7W7QNlZuzOwBTeXEmbVckNt1FSmhQtbMRvGGqqU4Nf4xk6KUEQhAoWuMzwbSv5jxiRiSZ5Tv7eiDB9U87znA==}
@@ -13541,7 +13557,7 @@
     dependencies:
       '@babel/core': 7.25.7
       postcss: 7.0.39
-      postcss-syntax: 0.36.2(postcss-html@0.36.0)(postcss-jsx@0.36.4)(postcss-less@3.1.4)(postcss-markdown@0.36.0)(postcss-scss@2.1.1)(postcss@7.0.39)
+      postcss-syntax: 0.36.2(postcss-html@1.5.0)(postcss-scss@4.0.5)(postcss@8.4.18)
     transitivePeerDependencies:
       - supports-color
     dev: false
@@ -13584,7 +13600,7 @@
       postcss-syntax: '>=0.36.0'
     dependencies:
       postcss: 7.0.39
-      postcss-syntax: 0.36.2(postcss-html@0.36.0)(postcss-jsx@0.36.4)(postcss-less@3.1.4)(postcss-markdown@0.36.0)(postcss-scss@2.1.1)(postcss@7.0.39)
+      postcss-syntax: 0.36.2(postcss-html@1.5.0)(postcss-scss@4.0.5)(postcss@8.4.18)
       remark: 10.0.1
       unist-util-find-all-after: 1.0.5
     dev: false
@@ -13771,7 +13787,6 @@
       postcss: ^8.3.3
     dependencies:
       postcss: 8.4.18
-    dev: true
 
   /postcss-sass@0.3.5:
     resolution: {integrity: sha512-B5z2Kob4xBxFjcufFnhQ2HqJQ2y/Zs/ic5EZbCywCkxKd756Q40cIQ/veRDwSrw1BF6+4wUgmpm0sBASqVi65A==}
@@ -13801,7 +13816,6 @@
       postcss: ^8.3.3
     dependencies:
       postcss: 8.4.18
-    dev: true
 
   /postcss-selector-not@8.0.0(postcss@8.4.18):
     resolution: {integrity: sha512-g/juh7A83GWc3+kWL8BiS3YUIJb3XNqIVKz1kGvgN3OhoGCsPncy1qo/+q61tjy5r87OxBhSY1+hcH3yOhEW+g==}
@@ -13861,7 +13875,7 @@
       postcss: 8.4.18
     dev: true
 
-  /postcss-syntax@0.36.2(postcss-html@0.36.0)(postcss-jsx@0.36.4)(postcss-less@3.1.4)(postcss-markdown@0.36.0)(postcss-scss@2.1.1)(postcss@7.0.39):
+  /postcss-syntax@0.36.2(postcss-html@0.36.0)(postcss-less@3.1.4)(postcss-scss@2.1.1)(postcss@7.0.39):
     resolution: {integrity: sha512-nBRg/i7E3SOHWxF3PpF5WnJM/jQ1YpY9000OaVXlAQj6Zp/kIqJxEDWIZ67tAd7NLuk7zqN4yqe9nc0oNAOs1w==}
     peerDependencies:
       postcss: '>=5.0.0'
@@ -13884,10 +13898,34 @@
     dependencies:
       postcss: 7.0.39
       postcss-html: 0.36.0(postcss-syntax@0.36.2)(postcss@7.0.39)
-      postcss-jsx: 0.36.4(postcss-syntax@0.36.2)(postcss@7.0.39)
       postcss-less: 3.1.4
-      postcss-markdown: 0.36.0(postcss-syntax@0.36.2)(postcss@7.0.39)
       postcss-scss: 2.1.1
+    dev: false
+
+  /postcss-syntax@0.36.2(postcss-html@1.5.0)(postcss-scss@4.0.5)(postcss@8.4.18):
+    resolution: {integrity: sha512-nBRg/i7E3SOHWxF3PpF5WnJM/jQ1YpY9000OaVXlAQj6Zp/kIqJxEDWIZ67tAd7NLuk7zqN4yqe9nc0oNAOs1w==}
+    peerDependencies:
+      postcss: '>=5.0.0'
+      postcss-html: '*'
+      postcss-jsx: '*'
+      postcss-less: '*'
+      postcss-markdown: '*'
+      postcss-scss: '*'
+    peerDependenciesMeta:
+      postcss-html:
+        optional: true
+      postcss-jsx:
+        optional: true
+      postcss-less:
+        optional: true
+      postcss-markdown:
+        optional: true
+      postcss-scss:
+        optional: true
+    dependencies:
+      postcss: 8.4.18
+      postcss-html: 1.5.0
+      postcss-scss: 4.0.5(postcss@8.4.18)
     dev: false
 
   /postcss-value-parser@3.3.1:
@@ -13922,7 +13960,6 @@
       nanoid: 3.3.4
       picocolors: 1.0.0
       source-map-js: 1.0.2
-    dev: true
 
   /postcss@8.4.49:
     resolution: {integrity: sha512-OCVPnIObs4N29kxTjzLfUryOkvZEq+pf8jTF0lg8E7uETuWHA+v7j3c/xJmiqpX450191LlmZfUKkXxkTry7nA==}
@@ -14988,6 +15025,10 @@
     resolution: {integrity: sha512-53e/4a4lT96K004mqDnLDE+upNSpBLRMfFgYCeIw3Gvuw9F17nxLP5v8MOVLly4/Epomxkx4SXrOFJJMxD2pIw==}
     dev: false
 
+  /rtc-detect@0.0.5:
+    resolution: {integrity: sha512-VANIELbaoIkZRj4gyiCCbTM+/ASy0eNgF35jCs+rrGxzYvD7YIBajEbGGZeh+5ZCNAX8/rT8IVRdpuallf174Q==}
+    dev: false
+
   /run-applescript@7.0.0:
     resolution: {integrity: sha512-9by4Ij99JUr/MCFBUkDKLWK3G9HVXmabKz9U5MlIAIuvuzkiOicRYs8XJLxX+xahD+mLiiCYDqF9dKAgtzKP1A==}
     engines: {node: '>=18'}
@@ -15173,7 +15214,7 @@
       file-saver: '*'
       lodash: '*'
       semver: '*'
-      vue: '*'
+      vue: 3.5.11
       xlsx: '*'
       xlsx-style: '*'
     dependencies:
@@ -15201,7 +15242,7 @@
       mitt: '*'
       semver: '*'
       senin-help: '*'
-      vue: '*'
+      vue: 3.5.11
     dependencies:
       '@tanstack/vue-query': 4.37.1(vue@3.5.11)
       axios: 1.7.7
@@ -15532,7 +15573,6 @@
   /source-map-js@1.0.2:
     resolution: {integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==}
     engines: {node: '>=0.10.0'}
-    dev: true
 
   /source-map-js@1.2.1:
     resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==}
@@ -16089,7 +16129,7 @@
       postcss-sass: 0.4.4
       postcss-scss: 2.1.1
       postcss-selector-parser: 6.1.1
-      postcss-syntax: 0.36.2(postcss-html@0.36.0)(postcss-jsx@0.36.4)(postcss-less@3.1.4)(postcss-markdown@0.36.0)(postcss-scss@2.1.1)(postcss@7.0.39)
+      postcss-syntax: 0.36.2(postcss-html@0.36.0)(postcss-less@3.1.4)(postcss-scss@2.1.1)(postcss@7.0.39)
       postcss-value-parser: 4.2.0
       resolve-from: 5.0.0
       slash: 3.0.0
@@ -16196,7 +16236,7 @@
       postcss-sass: 0.3.5
       postcss-scss: 2.1.1
       postcss-selector-parser: 3.1.2
-      postcss-syntax: 0.36.2(postcss-html@0.36.0)(postcss-jsx@0.36.4)(postcss-less@3.1.4)(postcss-markdown@0.36.0)(postcss-scss@2.1.1)(postcss@7.0.39)
+      postcss-syntax: 0.36.2(postcss-html@1.5.0)(postcss-scss@4.0.5)(postcss@8.4.18)
       postcss-value-parser: 3.3.1
       resolve-from: 4.0.0
       signal-exit: 3.0.7
@@ -16552,8 +16592,20 @@
       trtc-sdk-v5: 5.6.2
     dev: false
 
+  /trtc-cloud-js-sdk@2.9.3:
+    resolution: {integrity: sha512-4pZmNNoD1RjmhCIEA1HVRe/NIWDO8+w9hBpy8fJYa2B07la4Xc7QzCHnVZb7JgNoa6f3MVfUuOrtyrMsUMnt/Q==}
+    dependencies:
+      trtc-sdk-v5: 5.11.1
+    dev: false
+
   /trtc-js-sdk@4.15.19:
     resolution: {integrity: sha512-FFVvaji65d7+aq5o4hE+5lamvL1CEolNTPavaN7sRzh8Bb5UdDieBL9jV+lfxCnYpJ5lMi1YJt+EynDPX20Asw==}
+    dependencies:
+      webrtc-adapter: 8.2.3
+    dev: false
+
+  /trtc-sdk-v5@5.11.1:
+    resolution: {integrity: sha512-7EPZx3UUrvBAU9HynXsIcgI91wYWTYKbEkYUp186EDwgVEzc+v4uDL0427AY1PBI8tgf2ednO4qFk/C8crTSPQ==}
     dependencies:
       webrtc-adapter: 8.2.3
     dev: false
@@ -16636,15 +16688,16 @@
       tslib: 1.14.1
       typescript: 4.8.4
 
-  /tuicall-engine-webrtc@3.1.6(react-native@0.76.5)(react@19.0.0):
-    resolution: {integrity: sha512-NdRwZTHbqp4LnDEoRfQDa7Z1oH4g156j27awgy2PYO4dBtm7EjAJLFKZeaZZzErU67uW4EuSBRMeCeFx91JKpQ==}
+  /tuicall-engine-webrtc@3.1.7:
+    resolution: {integrity: sha512-MRye9/x/8Gy5aRAfEACLtGhK5RcBLAev7cgCGi7OLNt0Uj28mEJkt1tHs4p7xTQiQj6vcB+7OVTdsxuSq7EmOA==}
     dependencies:
-      '@tencentcloud/chat': 3.5.2(react-native@0.76.5)(react@19.0.0)
+      '@tencentcloud/chat': 3.5.7
       rtc-ai-denoiser: 1.1.7
       trtc-cloud-js-sdk: 2.5.0
-    transitivePeerDependencies:
-      - react
-      - react-native
+    dev: false
+
+  /tuikit-logger@0.0.4-beta.1:
+    resolution: {integrity: sha512-Ky83B1p88xakmfZ2f92cU0YxfolyxnQBv14tQpvnuHcMTnVR2Rjy8tityDGwF+pnxrAhJ7H7OPB/4rFdWVncIw==}
     dev: false
 
   /type-check@0.4.0:
@@ -17037,7 +17090,7 @@
     peerDependencies:
       '@babel/parser': ^7.15.8
       '@nuxt/kit': ^3.2.2
-      vue: 2 || 3
+      vue: 3.5.11
     peerDependenciesMeta:
       '@babel/parser':
         optional: true
@@ -17537,7 +17590,7 @@
     requiresBuild: true
     peerDependencies:
       '@vue/composition-api': ^1.0.0-rc.1
-      vue: ^3.0.0-0 || ^2.6.0
+      vue: 3.5.11
     peerDependenciesMeta:
       '@vue/composition-api':
         optional: true
@@ -17552,7 +17605,7 @@
     requiresBuild: true
     peerDependencies:
       '@vue/composition-api': ^1.0.0-rc.1
-      vue: ^3.0.0-0 || ^2.6.0
+      vue: 3.5.11
     peerDependenciesMeta:
       '@vue/composition-api':
         optional: true
@@ -17580,7 +17633,7 @@
   /vue-router@4.4.5(vue@3.5.11):
     resolution: {integrity: sha512-4fKZygS8cH1yCyuabAXGUAsyi1b2/o/OKgu/RUb+znIYOxPRxdkytJEx+0wGcpBE1pX6vUgh5jwWOKRGvuA/7Q==}
     peerDependencies:
-      vue: ^3.2.0
+      vue: 3.5.11
     dependencies:
       '@vue/devtools-api': 6.6.4
       vue: 3.5.11(typescript@4.8.4)
@@ -17602,7 +17655,7 @@
     resolution: {integrity: sha512-3Wy6QcZl0VusCCHX3vYrWSILFlrOB2EQDoySnuYmASM5cUp1FivJGfkS5lp1CutDgyRb41g32r/1QCmiBj5i1Q==}
     engines: {node: '>=14.0.0'}
     peerDependencies:
-      vue: ^2.0.0 || ^3.0.0
+      vue: 3.5.11
     peerDependenciesMeta:
       vue:
         optional: true
@@ -18060,7 +18113,3 @@
   /zwitch@1.0.5:
     resolution: {integrity: sha512-V50KMwwzqJV0NpZIZFwfOD5/lyny3WlSzRiXgA0G7VUnRlqttta1L6UQIHzd6EuBY/cHGfwTIck7w1yH6Q5zUw==}
     dev: false
-
-settings:
-  autoInstallPeers: true
-  excludeLinksFromLockfile: false
diff --git a/src/constants/enum.ts b/src/constants/enum.ts
index f654351..9ea0c7c 100644
--- a/src/constants/enum.ts
+++ b/src/constants/enum.ts
@@ -1,3 +1,6 @@
+export const TempFolderPath =
+  'https://parkmanagement.oss-cn-hangzhou.aliyuncs.com/FlexJob/AdminBClient';
+
 export enum AreaType {
   /**
    * 鐪�
@@ -16,3 +19,24 @@
    */
   Town,
 }
+
+export enum Gender {
+  /**
+   * 鐢�
+   */
+  Male = 1,
+  /**
+   * 濂�
+   */
+  Female = 2,
+}
+
+export const GenderText = {
+  [Gender.Male]: '鐢�',
+  [Gender.Female]: '濂�',
+};
+
+export enum FlexEnterpriseSettingStatus {
+  NotSetting = -10,
+  IsSetting = 10,
+}
diff --git a/src/hooks/dic.ts b/src/hooks/dic.ts
new file mode 100644
index 0000000..e256f01
--- /dev/null
+++ b/src/hooks/dic.ts
@@ -0,0 +1,54 @@
+import * as searchSettingServices from '@/services/api/SearchSetting';
+import { useQuery } from '@tanstack/vue-query';
+import { useQueryClient } from '@tanstack/vue-query';
+
+type UseSearchSettingTypeOptions = {
+  searchType: number;
+  belongType?: number;
+  onSuccess?: (data: API.GetTypeSearchSettingList[]) => any;
+};
+
+export function useSearchSettingType({
+  searchType,
+  belongType = null,
+  onSuccess,
+}: UseSearchSettingTypeOptions) {
+  const { data, refetch } = useQuery({
+    queryKey: ['searchSettingServices/getTypeSearchSettingList', { searchType, belongType }],
+    queryFn: async () => {
+      return await searchSettingServices.getTypeSearchSettingList(
+        {
+          searchType: searchType,
+          belongType: belongType,
+        },
+        { showLoading: false }
+      );
+    },
+    placeholderData: () => [] as API.GetTypeSearchSettingList[],
+    onSuccess(data) {
+      onSuccess?.(data);
+    },
+  });
+
+  const queryClient = useQueryClient();
+
+  async function ensureSearchSettingType() {
+    return await queryClient.ensureQueryData({
+      queryKey: [
+        'searchSettingServices/getTypeSearchSettingList',
+        { searchType: searchType, belongType: belongType },
+      ],
+    });
+  }
+
+  function getSearchSettingTypeNameById(id: string) {
+    return data.value.find((x) => x.id === id)?.name ?? '';
+  }
+
+  return {
+    searchSettingTypeList: data,
+    ensureSearchSettingType,
+    refetchSearchSettingType: refetch,
+    getSearchSettingTypeNameById,
+  };
+}
diff --git a/src/hooks/index.ts b/src/hooks/index.ts
index cbe1cbd..bc2b519 100644
--- a/src/hooks/index.ts
+++ b/src/hooks/index.ts
@@ -6,3 +6,4 @@
 export * from './useEvent';
 export * from './useUser';
 export * from './help';
+export * from './dic';
diff --git a/src/hooks/useEvent.ts b/src/hooks/useEvent.ts
index ba5d79a..85b58e5 100644
--- a/src/hooks/useEvent.ts
+++ b/src/hooks/useEvent.ts
@@ -3,6 +3,8 @@
 
 export type GlobalEvent = {
   'home:add': any;
+  'employment:add': any;
+  'employment:edit': any;
 };
 
 export type GlobalEventListener<T extends keyof GlobalEvent> = (payload: GlobalEvent[T]) => any;
diff --git a/src/router/index.ts b/src/router/index.ts
index b2cd8b4..6a84aa0 100644
--- a/src/router/index.ts
+++ b/src/router/index.ts
@@ -96,6 +96,114 @@
     },
   },
   {
+    path: '/FlexJobManage',
+    redirect: 'noRedirect',
+    component: Layout,
+    hidden: false,
+    alwaysShow: true,
+    meta: {
+      rank: 10010,
+      title: '鐏靛伐绠$悊',
+      rootMenu: true,
+      icon: 'home',
+    },
+    children: [
+      {
+        path: '/FlexJobManageList',
+        name: 'FlexJobManageList',
+        hidden: false,
+        alwaysShow: true,
+        component: () => import('@/views/FlexJobManage/FlexJobManage.vue'),
+        meta: {
+          rank: 10011,
+          title: '鐏靛伐绠$悊',
+          // rootMenu: true,
+          icon: 'home',
+        },
+      },
+    ],
+  },
+  {
+    path: '/EmploymentManage',
+    redirect: 'noRedirect',
+    component: Layout,
+    hidden: false,
+    alwaysShow: true,
+    meta: {
+      rank: 10020,
+      title: '鐢ㄤ汉绠$悊',
+      rootMenu: true,
+      icon: 'home',
+    },
+    children: [
+      {
+        path: '/EmploymentManageList',
+        name: 'EmploymentManageList',
+        hidden: false,
+        alwaysShow: true,
+        component: () => import('@/views/EmploymentManage/EmploymentManage.vue'),
+        meta: {
+          rank: 10021,
+          title: '鐢ㄤ汉绠$悊',
+          // rootMenu: true,
+          icon: 'home',
+        },
+      },
+      {
+        path: '/AddOrEditEmployment',
+        name: 'AddOrEditEmployment',
+        hidden: true,
+        alwaysShow: false,
+        component: () => import('@/views/EmploymentManage/AddOrEditEmployment.vue'),
+        meta: {
+          rank: 10022,
+          title: '鍙戝竷缂栬緫浜哄憳',
+          // rootMenu: true,
+          icon: 'home',
+        },
+      },
+      {
+        path: '/EmploymentManageDetail',
+        name: 'EmploymentManageDetail',
+        hidden: true,
+        alwaysShow: false,
+        component: () => import('@/views/EmploymentManage/EmploymentManageDetail.vue'),
+        meta: {
+          rank: 10023,
+          title: '浜哄憳绠$悊璇︽儏',
+          // rootMenu: true,
+          icon: 'home',
+        },
+      },
+      {
+        path: '/EmploymentSignList',
+        name: 'EmploymentSignList',
+        hidden: true,
+        alwaysShow: false,
+        component: () => import('@/views/EmploymentManage/EmploymentSignList.vue'),
+        meta: {
+          rank: 10024,
+          title: '鎶ュ悕鍒楄〃',
+          // rootMenu: true,
+          icon: 'home',
+        },
+      },
+      {
+        path: '/EmploymentManageArrange',
+        name: 'EmploymentManageArrange',
+        hidden: false,
+        alwaysShow: true,
+        component: () => import('@/views/EmploymentManage/EmploymentManageArrange.vue'),
+        meta: {
+          rank: 10025,
+          title: '浜哄憳瀹夋帓',
+          // rootMenu: true,
+          icon: 'home',
+        },
+      },
+    ],
+  },
+  {
     path: '/Login',
     name: 'Login',
     hidden: true,
diff --git a/src/services/api/Common.ts b/src/services/api/Common.ts
index 93aa15e..33f7365 100644
--- a/src/services/api/Common.ts
+++ b/src/services/api/Common.ts
@@ -17,6 +17,21 @@
   });
 }
 
+/** 绗笁鏂规墜鏈哄彿楠岃瘉 鍙戦�侀獙璇佺爜 POST /api/Common/SendPhoneCertificationVerificationCode */
+export async function sendPhoneCertificationVerificationCode(
+  body: API.SendPhoneCertificationVerificationCodeInput,
+  options?: API.RequestConfig
+) {
+  return request<number>('/api/Common/SendPhoneCertificationVerificationCode', {
+    method: 'POST',
+    headers: {
+      'Content-Type': 'application/json',
+    },
+    data: body,
+    ...(options || {}),
+  });
+}
+
 /** 鍙戦�侀獙璇佺爜 POST /api/Common/SendVerificationCode */
 export async function sendVerificationCode(
   body: API.SendPhoneVerificationCodeByBusinessTypeInput,
diff --git a/src/services/api/FlexEnterprise.ts b/src/services/api/FlexEnterprise.ts
new file mode 100644
index 0000000..47751e0
--- /dev/null
+++ b/src/services/api/FlexEnterprise.ts
@@ -0,0 +1,108 @@
+/* eslint-disable */
+// @ts-ignore
+import { request } from '@/utils/request';
+
+/** 鏂板鎴栦慨鏀逛紒涓氱鐞� POST /api/FlexEnterprise/CreateOrEditFlexEnterprise */
+export async function createOrEditFlexEnterprise(
+  body: API.CreateOrEditFlexEnterpriseInput,
+  options?: API.RequestConfig
+) {
+  return request<string>('/api/FlexEnterprise/CreateOrEditFlexEnterprise', {
+    method: 'POST',
+    headers: {
+      'Content-Type': 'application/json',
+    },
+    data: body,
+    ...(options || {}),
+  });
+}
+
+/** 鏂板鎴栦慨鏀归摱琛岃缃� POST /api/FlexEnterprise/CreateOrEditFlexEnterpriseBankSetting */
+export async function createOrEditFlexEnterpriseBankSetting(
+  body: API.CreateOrEditFlexEnterpriseBankInput,
+  options?: API.RequestConfig
+) {
+  return request<string>('/api/FlexEnterprise/CreateOrEditFlexEnterpriseBankSetting', {
+    method: 'POST',
+    headers: {
+      'Content-Type': 'application/json',
+    },
+    data: body,
+    ...(options || {}),
+  });
+}
+
+/** 鏂板鎴栦慨鏀规秷鎭缃� POST /api/FlexEnterprise/CreateOrEditFlexEnterpriseMessageSetting */
+export async function createOrEditFlexEnterpriseMessageSetting(
+  body: API.CreateOrEditFlexEnterpriseMessageSettingInput,
+  options?: API.RequestConfig
+) {
+  return request<string>('/api/FlexEnterprise/CreateOrEditFlexEnterpriseMessageSetting', {
+    method: 'POST',
+    headers: {
+      'Content-Type': 'application/json',
+    },
+    data: body,
+    ...(options || {}),
+  });
+}
+
+/** 鏂板鎴栦慨鏀圭數瀛愮璁剧疆 POST /api/FlexEnterprise/CreateOrEditFlexEnterpriseSignSetting */
+export async function createOrEditFlexEnterpriseSignSetting(
+  body: API.CreateOrEditFlexEnterpriseSignSettingInput,
+  options?: API.RequestConfig
+) {
+  return request<string>('/api/FlexEnterprise/CreateOrEditFlexEnterpriseSignSetting', {
+    method: 'POST',
+    headers: {
+      'Content-Type': 'application/json',
+    },
+    data: body,
+    ...(options || {}),
+  });
+}
+
+/** 鍒犻櫎浼佷笟绠$悊 DELETE /api/FlexEnterprise/DeleteFlexEnterprise */
+export async function deleteFlexEnterprise(
+  // 鍙犲姞鐢熸垚鐨凱aram绫诲瀷 (闈瀊ody鍙傛暟swagger榛樿娌℃湁鐢熸垚瀵硅薄)
+  params: API.APIdeleteFlexEnterpriseParams,
+  options?: API.RequestConfig
+) {
+  return request<number>('/api/FlexEnterprise/DeleteFlexEnterprise', {
+    method: 'DELETE',
+    params: {
+      ...params,
+    },
+    ...(options || {}),
+  });
+}
+
+/** 鑾峰彇浼佷笟绠$悊鍒楄〃 POST /api/FlexEnterprise/GetFlexEnterpriseList */
+export async function getFlexEnterpriseList(
+  body: API.GetFlexEnterpriseInput,
+  options?: API.RequestConfig
+) {
+  return request<API.FlexEnterpriseDtoPageOutput>('/api/FlexEnterprise/GetFlexEnterpriseList', {
+    method: 'POST',
+    headers: {
+      'Content-Type': 'application/json',
+    },
+    data: body,
+    ...(options || {}),
+  });
+}
+
+/** 璁剧疆浼佷笟鐘舵�� POST /api/FlexEnterprise/SetFlexEnterpriseStatus */
+export async function setFlexEnterpriseStatus(
+  body: API.SetFlexEnterpriseStatusInput,
+  options?: API.RequestConfig
+) {
+  return request<number>('/api/FlexEnterprise/SetFlexEnterpriseStatus', {
+    method: 'POST',
+    headers: {
+      'Content-Type': 'application/json',
+    },
+    data: body,
+    ...(options || {}),
+  });
+}
diff --git a/src/services/api/FlexEnterpriseWoker.ts b/src/services/api/FlexEnterpriseWoker.ts
new file mode 100644
index 0000000..9bafeb5
--- /dev/null
+++ b/src/services/api/FlexEnterpriseWoker.ts
@@ -0,0 +1,54 @@
+/* eslint-disable */
+// @ts-ignore
+import { request } from '@/utils/request';
+
+/** C绔汉鍛樼鐞嗗垪琛� POST /api/FlexEnterpriseWoker/GetUserClientList */
+export async function getUserClientList(
+  body: API.GetUserClientForBackInput,
+  options?: API.RequestConfig
+) {
+  return request<API.GetUserClientForBackOutputPageOutput>(
+    '/api/FlexEnterpriseWoker/GetUserClientList',
+    {
+      method: 'POST',
+      headers: {
+        'Content-Type': 'application/json',
+      },
+      data: body,
+      ...(options || {}),
+    }
+  );
+}
+
+/** C绔汉鍛樼鐞�--绛剧害璇︽儏 POST /api/FlexEnterpriseWoker/GetUserClientSignList */
+export async function getUserClientSignList(
+  body: API.GetUserClientSignListInput,
+  options?: API.RequestConfig
+) {
+  return request<API.UserClientSignListOutputPageOutput>(
+    '/api/FlexEnterpriseWoker/GetUserClientSignList',
+    {
+      method: 'POST',
+      headers: {
+        'Content-Type': 'application/json',
+      },
+      data: body,
+      ...(options || {}),
+    }
+  );
+}
+
+/** C绔汉鍛樼鐞�--鑾峰彇浜哄憳璇︽儏 GET /api/FlexEnterpriseWoker/GetUserDetailForBack */
+export async function getUserDetailForBack(
+  // 鍙犲姞鐢熸垚鐨凱aram绫诲瀷 (闈瀊ody鍙傛暟swagger榛樿娌℃湁鐢熸垚瀵硅薄)
+  params: API.APIgetUserDetailForBackParams,
+  options?: API.RequestConfig
+) {
+  return request<API.GetUserDetailForBackOutput>('/api/FlexEnterpriseWoker/GetUserDetailForBack', {
+    method: 'GET',
+    params: {
+      ...params,
+    },
+    ...(options || {}),
+  });
+}
diff --git a/src/services/api/FlexTask.ts b/src/services/api/FlexTask.ts
new file mode 100644
index 0000000..e26d387
--- /dev/null
+++ b/src/services/api/FlexTask.ts
@@ -0,0 +1,63 @@
+/* eslint-disable */
+// @ts-ignore
+import { request } from '@/utils/request';
+
+/** 鑾峰彇浠诲姟璇︽儏 GET /api/FlexTask/GetFlexTaskDetail */
+export async function getFlexTaskDetail(
+  // 鍙犲姞鐢熸垚鐨凱aram绫诲瀷 (闈瀊ody鍙傛暟swagger榛樿娌℃湁鐢熸垚瀵硅薄)
+  params: API.APIgetFlexTaskDetailParams,
+  options?: API.RequestConfig
+) {
+  return request<API.GetFlexTaskDetailForBackOutput>('/api/FlexTask/GetFlexTaskDetail', {
+    method: 'GET',
+    params: {
+      ...params,
+    },
+    ...(options || {}),
+  });
+}
+
+/** 鑾峰彇杩愯惀绔换鍔$鐞嗗垪琛� POST /api/FlexTask/GetFlexTaskList */
+export async function getFlexTaskList(
+  body: API.GetFlexTaskForBackInput,
+  options?: API.RequestConfig
+) {
+  return request<API.FlexTaskListOutputPageOutput>('/api/FlexTask/GetFlexTaskList', {
+    method: 'POST',
+    headers: {
+      'Content-Type': 'application/json',
+    },
+    data: body,
+    ...(options || {}),
+  });
+}
+
+/** 鑾峰彇鎶ュ悕璇︽儏 POST /api/FlexTask/GetFlexTaskWorkerList */
+export async function getFlexTaskWorkerList(
+  body: API.GetFlexTaskWorkerListInput,
+  options?: API.RequestConfig
+) {
+  return request<API.GetWorkerListForBackOutputPageOutput>('/api/FlexTask/GetFlexTaskWorkerList', {
+    method: 'POST',
+    headers: {
+      'Content-Type': 'application/json',
+    },
+    data: body,
+    ...(options || {}),
+  });
+}
+
+/** 璁剧疆浠诲姟鎺ㄨ崘鐘舵�� POST /api/FlexTask/SetFlexTaskReRecommendStatus */
+export async function setFlexTaskReRecommendStatus(
+  body: API.SetRecommendInput,
+  options?: API.RequestConfig
+) {
+  return request<number>('/api/FlexTask/SetFlexTaskReRecommendStatus', {
+    method: 'POST',
+    headers: {
+      'Content-Type': 'application/json',
+    },
+    data: body,
+    ...(options || {}),
+  });
+}
diff --git a/src/services/api/FlexWorker.ts b/src/services/api/FlexWorker.ts
index 8124d65..8c2cc4c 100644
--- a/src/services/api/FlexWorker.ts
+++ b/src/services/api/FlexWorker.ts
@@ -14,6 +14,66 @@
   });
 }
 
+/** 娣诲姞鑱旂郴璁板綍 GET /api/FlexWorker/AddUserResumeContractRecord */
+export async function addUserResumeContractRecord(
+  // 鍙犲姞鐢熸垚鐨凱aram绫诲瀷 (闈瀊ody鍙傛暟swagger榛樿娌℃湁鐢熸垚瀵硅薄)
+  params: API.APIaddUserResumeContractRecordParams,
+  options?: API.RequestConfig
+) {
+  return request<number>('/api/FlexWorker/AddUserResumeContractRecord', {
+    method: 'GET',
+    params: {
+      ...params,
+    },
+    ...(options || {}),
+  });
+}
+
+/** 鍙栨秷浜哄憳鏀惰棌 DELETE /api/FlexWorker/CancelUserResumeCollect */
+export async function cancelUserResumeCollect(
+  // 鍙犲姞鐢熸垚鐨凱aram绫诲瀷 (闈瀊ody鍙傛暟swagger榛樿娌℃湁鐢熸垚瀵硅薄)
+  params: API.APIcancelUserResumeCollectParams,
+  options?: API.RequestConfig
+) {
+  return request<number>('/api/FlexWorker/CancelUserResumeCollect', {
+    method: 'DELETE',
+    params: {
+      ...params,
+    },
+    ...(options || {}),
+  });
+}
+
+/** 鏀惰棌浜哄憳绠�鍘� POST /api/FlexWorker/CollectFlexWorkerResume */
+export async function collectFlexWorkerResume(
+  body: API.CollectFlexWorkerResumeInput,
+  options?: API.RequestConfig
+) {
+  return request<number>('/api/FlexWorker/CollectFlexWorkerResume', {
+    method: 'POST',
+    headers: {
+      'Content-Type': 'application/json',
+    },
+    data: body,
+    ...(options || {}),
+  });
+}
+
+/** 鏀惰棌鍚嶇墖 GET /api/FlexWorker/CollectVisitingCard */
+export async function collectVisitingCard(
+  // 鍙犲姞鐢熸垚鐨凱aram绫诲瀷 (闈瀊ody鍙傛暟swagger榛樿娌℃湁鐢熸垚瀵硅薄)
+  params: API.APIcollectVisitingCardParams,
+  options?: API.RequestConfig
+) {
+  return request<number>('/api/FlexWorker/CollectVisitingCard', {
+    method: 'GET',
+    params: {
+      ...params,
+    },
+    ...(options || {}),
+  });
+}
+
 /** 浠诲姟鍒犻櫎 DELETE /api/FlexWorker/DeleteFlexTask */
 export async function deleteFlexTask(
   // 鍙犲姞鐢熸垚鐨凱aram绫诲瀷 (闈瀊ody鍙傛暟swagger榛樿娌℃湁鐢熸垚瀵硅薄)
@@ -25,6 +85,79 @@
     params: {
       ...params,
     },
+    ...(options || {}),
+  });
+}
+
+/** 鍒犻櫎鍚嶇墖鏀惰棌 DELETE /api/FlexWorker/DeleteMyCardCollect */
+export async function deleteMyCardCollect(
+  // 鍙犲姞鐢熸垚鐨凱aram绫诲瀷 (闈瀊ody鍙傛暟swagger榛樿娌℃湁鐢熸垚瀵硅薄)
+  params: API.APIdeleteMyCardCollectParams,
+  options?: API.RequestConfig
+) {
+  return request<number>('/api/FlexWorker/DeleteMyCardCollect', {
+    method: 'DELETE',
+    params: {
+      ...params,
+    },
+    ...(options || {}),
+  });
+}
+
+/** 缂栬緫B绔悕鐗� POST /api/FlexWorker/EditVisitingCard */
+export async function editVisitingCard(
+  body: API.MyVisitingCardOutput,
+  options?: API.RequestConfig
+) {
+  return request<number>('/api/FlexWorker/EditVisitingCard', {
+    method: 'POST',
+    headers: {
+      'Content-Type': 'application/json',
+    },
+    data: body,
+    ...(options || {}),
+  });
+}
+
+/** 鑾峰彇鐪佸競鍖哄垪琛� POST /api/FlexWorker/GetAreaList */
+export async function getAreaList(body: API.GetAreaListInput, options?: API.RequestConfig) {
+  return request<API.AreaDto[]>('/api/FlexWorker/GetAreaList', {
+    method: 'POST',
+    headers: {
+      'Content-Type': 'application/json',
+    },
+    data: body,
+    ...(options || {}),
+  });
+}
+
+/** 鑾峰彇璧勬牸璇佷功鍒楄〃 GET /api/FlexWorker/GetCertificationList */
+export async function getCertificationList(options?: API.RequestConfig) {
+  return request<API.GetSearchSettingListOutput[]>('/api/FlexWorker/GetCertificationList', {
+    method: 'GET',
+    ...(options || {}),
+  });
+}
+
+/** 鑾峰彇浼佷笟绂忓埄鍒楄〃 GET /api/FlexWorker/GetEnterpriseWelfareList */
+export async function getEnterpriseWelfareList(options?: API.RequestConfig) {
+  return request<API.GetSearchSettingListOutput[]>('/api/FlexWorker/GetEnterpriseWelfareList', {
+    method: 'GET',
+    ...(options || {}),
+  });
+}
+
+/** 鑾峰彇绛剧害浜哄憳鍒楄〃 POST /api/FlexWorker/GetFlexSignWorkerList */
+export async function getFlexSignWorkerList(
+  body: API.GetFlexSignWorkerListInput,
+  options?: API.RequestConfig
+) {
+  return request<API.GetNewestWorkerListOutputPageOutput>('/api/FlexWorker/GetFlexSignWorkerList', {
+    method: 'POST',
+    headers: {
+      'Content-Type': 'application/json',
+    },
+    data: body,
     ...(options || {}),
   });
 }
@@ -89,6 +222,209 @@
   });
 }
 
+/** 搴旇仒绠$悊-浠诲姟璇︽儏-鑾峰彇浜哄憳鎶ュ悕鍒楄〃 POST /api/FlexWorker/GetFlexTaskWorkerApplyList */
+export async function getFlexTaskWorkerApplyList(
+  body: API.GetFlexTaskWorkerApplyListInput,
+  options?: API.RequestConfig
+) {
+  return request<API.GetNewestWorkerListOutputPageOutput>(
+    '/api/FlexWorker/GetFlexTaskWorkerApplyList',
+    {
+      method: 'POST',
+      headers: {
+        'Content-Type': 'application/json',
+      },
+      data: body,
+      ...(options || {}),
+    }
+  );
+}
+
+/** 浠诲姟绠$悊-寰呭畨鎺�/宸插畨鎺� 浜哄憳鍒楄〃 POST /api/FlexWorker/GetFlexTaskWorkerArrangeList */
+export async function getFlexTaskWorkerArrangeList(
+  body: API.GetFlexTaskWorkerArrangeListInput,
+  options?: API.RequestConfig
+) {
+  return request<API.GetNewestWorkerListOutputPageOutput>(
+    '/api/FlexWorker/GetFlexTaskWorkerArrangeList',
+    {
+      method: 'POST',
+      headers: {
+        'Content-Type': 'application/json',
+      },
+      data: body,
+      ...(options || {}),
+    }
+  );
+}
+
+/** 楠屾敹绠$悊-浠诲姟璇︽儏-鑾峰彇鍗曚釜浜哄憳鎻愪氦楠屾敹鍐呭鍒楄〃 POST /api/FlexWorker/GetFlexTaskWorkerCheckContentDto */
+export async function getFlexTaskWorkerCheckContentDto(
+  body: API.GetFlexTaskWorkerCheckContentDtoInput,
+  options?: API.RequestConfig
+) {
+  return request<API.GetTaskWorkerCheckContentOutput>(
+    '/api/FlexWorker/GetFlexTaskWorkerCheckContentDto',
+    {
+      method: 'POST',
+      headers: {
+        'Content-Type': 'application/json',
+      },
+      data: body,
+      ...(options || {}),
+    }
+  );
+}
+
+/** 鑾峰彇楠屾敹绠$悊 寰呴獙鏀�/宸查獙鏀�-浜哄憳鍒楄〃 POST /api/FlexWorker/GetFlexTaskWorkerCheckList */
+export async function getFlexTaskWorkerCheckList(
+  body: API.GetFlexTaskWorkerCheckListInput,
+  options?: API.RequestConfig
+) {
+  return request<API.GetNewestWorkerListOutputPageOutput>(
+    '/api/FlexWorker/GetFlexTaskWorkerCheckList',
+    {
+      method: 'POST',
+      headers: {
+        'Content-Type': 'application/json',
+      },
+      data: body,
+      ...(options || {}),
+    }
+  );
+}
+
+/** 鎴戠殑鍚嶇墖澶� POST /api/FlexWorker/GetMyCollectVisitingCardList */
+export async function getMyCollectVisitingCardList(
+  body: API.GetCollectVisitingCardListInput,
+  options?: API.RequestConfig
+) {
+  return request<API.GetCollectVisitingCardOutputPageOutput>(
+    '/api/FlexWorker/GetMyCollectVisitingCardList',
+    {
+      method: 'POST',
+      headers: {
+        'Content-Type': 'application/json',
+      },
+      data: body,
+      ...(options || {}),
+    }
+  );
+}
+
+/** 鑾峰彇鎴戠殑鍚嶇墖 GET /api/FlexWorker/GetMyVisitingCard */
+export async function getMyVisitingCard(options?: API.RequestConfig) {
+  return request<API.MyVisitingCardOutput>('/api/FlexWorker/GetMyVisitingCard', {
+    method: 'GET',
+    ...(options || {}),
+  });
+}
+
+/** 鑾峰彇鐏靛伐鍒楄〃 POST /api/FlexWorker/GetNewesWorkertList */
+export async function getNewesWorkertList(
+  body: API.GetNewestWorkerListInput,
+  options?: API.RequestConfig
+) {
+  return request<API.GetNewestWorkerListOutputPageOutput>('/api/FlexWorker/GetNewesWorkertList', {
+    method: 'POST',
+    headers: {
+      'Content-Type': 'application/json',
+    },
+    data: body,
+    ...(options || {}),
+  });
+}
+
+/** 鑾峰彇鑱旂郴璁板綍 POST /api/FlexWorker/GetUserContractRecordList */
+export async function getUserContractRecordList(body: API.PageInput, options?: API.RequestConfig) {
+  return request<API.GetNewestWorkerListOutputPageOutput>(
+    '/api/FlexWorker/GetUserContractRecordList',
+    {
+      method: 'POST',
+      headers: {
+        'Content-Type': 'application/json',
+      },
+      data: body,
+      ...(options || {}),
+    }
+  );
+}
+
+/** 鑾峰彇绠�鍘嗘敹钘忓垪琛� POST /api/FlexWorker/GetWorkerResumeCollectList */
+export async function getWorkerResumeCollectList(body: API.PageInput, options?: API.RequestConfig) {
+  return request<API.GetNewestWorkerListOutputPageOutput>(
+    '/api/FlexWorker/GetWorkerResumeCollectList',
+    {
+      method: 'POST',
+      headers: {
+        'Content-Type': 'application/json',
+      },
+      data: body,
+      ...(options || {}),
+    }
+  );
+}
+
+/** 浼佷笟瑙g害 GET /api/FlexWorker/StopEnterpriseUserContract */
+export async function stopEnterpriseUserContract(
+  // 鍙犲姞鐢熸垚鐨凱aram绫诲瀷 (闈瀊ody鍙傛暟swagger榛樿娌℃湁鐢熸垚瀵硅薄)
+  params: API.APIstopEnterpriseUserContractParams,
+  options?: API.RequestConfig
+) {
+  return request<number>('/api/FlexWorker/StopEnterpriseUserContract', {
+    method: 'GET',
+    params: {
+      ...params,
+    },
+    ...(options || {}),
+  });
+}
+
+/** 浠诲姟浜哄憳瀹夋帓/鍙栨秷瀹夋帓 POST /api/FlexWorker/TaskWorkerArrange */
+export async function taskWorkerArrange(
+  body: API.TaskWorkerArrangeInput,
+  options?: API.RequestConfig
+) {
+  return request<number>('/api/FlexWorker/TaskWorkerArrange', {
+    method: 'POST',
+    headers: {
+      'Content-Type': 'application/json',
+    },
+    data: body,
+    ...(options || {}),
+  });
+}
+
+/** 楠屾敹绠$悊-楠屾敹璇︽儏-瀵逛汉鍛樿繘琛岄獙鏀跺鏍� POST /api/FlexWorker/TaskWorkerCheckAcceptStatus */
+export async function taskWorkerCheckAcceptStatus(
+  body: API.TaskWorkerCheckAcceptStatusInput,
+  options?: API.RequestConfig
+) {
+  return request<number>('/api/FlexWorker/TaskWorkerCheckAcceptStatus', {
+    method: 'POST',
+    headers: {
+      'Content-Type': 'application/json',
+    },
+    data: body,
+    ...(options || {}),
+  });
+}
+
+/** 浠诲姟浜哄憳褰曠敤/璋㈢粷 POST /api/FlexWorker/TaskWorkerHireRefuse */
+export async function taskWorkerHireRefuse(
+  body: API.TaskWorkerHireRefuseInput,
+  options?: API.RequestConfig
+) {
+  return request<number>('/api/FlexWorker/TaskWorkerHireRefuse', {
+    method: 'POST',
+    headers: {
+      'Content-Type': 'application/json',
+    },
+    data: body,
+    ...(options || {}),
+  });
+}
+
 /** 鏇存柊鎷涜仒浠诲姟鍙戝竷鐘舵�� POST /api/FlexWorker/UpdateFlexTaskReleaseStatus */
 export async function updateFlexTaskReleaseStatus(
   body: API.UpdateTaskReleaseStatusInput,
diff --git a/src/services/api/User.ts b/src/services/api/User.ts
new file mode 100644
index 0000000..603e2e7
--- /dev/null
+++ b/src/services/api/User.ts
@@ -0,0 +1,11 @@
+/* eslint-disable */
+// @ts-ignore
+import { request } from '@/utils/request';
+
+/** 鑾峰彇涓汉淇℃伅璇︽儏 GET /api/User/GetUserInfo */
+export async function getUserInfo(options?: API.RequestConfig) {
+  return request<API.UserDto>('/api/User/GetUserInfo', {
+    method: 'GET',
+    ...(options || {}),
+  });
+}
diff --git a/src/services/api/UserResume.ts b/src/services/api/UserResume.ts
index b10d921..3ec42a4 100644
--- a/src/services/api/UserResume.ts
+++ b/src/services/api/UserResume.ts
@@ -2,7 +2,15 @@
 // @ts-ignore
 import { request } from '@/utils/request';
 
-/** 姝ゅ鍚庣娌℃湁鎻愪緵娉ㄩ噴 GET /api/UserResume/GetUserResume */
+/** 鏍规嵁鐢ㄦ埛鑾峰彇鏈熷緟鐨勫伐浣� GET /api/UserResume/GetResumeExpectationJob */
+export async function getResumeExpectationJob(options?: API.RequestConfig) {
+  return request<API.UserResumeExpectationJobOutput>('/api/UserResume/GetResumeExpectationJob', {
+    method: 'GET',
+    ...(options || {}),
+  });
+}
+
+/** 鏍规嵁鐢ㄦ埛鑾峰彇绠�鍘� GET /api/UserResume/GetUserResume */
 export async function getUserResume(options?: API.RequestConfig) {
   return request<API.MyResumeOutput>('/api/UserResume/GetUserResume', {
     method: 'GET',
@@ -10,7 +18,15 @@
   });
 }
 
-/** 姝ゅ鍚庣娌℃湁鎻愪緵娉ㄩ噴 GET /api/UserResume/GetUserResumeCertificateDetailById */
+/** 鏍规嵁鐢ㄦ埛鑾峰彇绠�鍘嗗熀纭�淇℃伅 GET /api/UserResume/GetUserResumeBaseInfo */
+export async function getUserResumeBaseInfo(options?: API.RequestConfig) {
+  return request<API.UserResumeBaseInfoOutput>('/api/UserResume/GetUserResumeBaseInfo', {
+    method: 'GET',
+    ...(options || {}),
+  });
+}
+
+/** 鏍规嵁璁よ瘉id鑾峰彇璁よ瘉璇︽儏 GET /api/UserResume/GetUserResumeCertificateDetailById */
 export async function getUserResumeCertificateDetailById(
   // 鍙犲姞鐢熸垚鐨凱aram绫诲瀷 (闈瀊ody鍙傛暟swagger榛樿娌℃湁鐢熸垚瀵硅薄)
   params: API.APIgetUserResumeCertificateDetailByIdParams,
@@ -28,7 +44,7 @@
   );
 }
 
-/** 姝ゅ鍚庣娌℃湁鎻愪緵娉ㄩ噴 GET /api/UserResume/GetUserResumeCertificateList */
+/** 鏍规嵁鐢ㄦ埛ID鑾峰彇鐢ㄦ埛璁よ瘉淇℃伅 GET /api/UserResume/GetUserResumeCertificateList */
 export async function getUserResumeCertificateList(options?: API.RequestConfig) {
   return request<API.UserResumeCertificateListOutput[]>(
     '/api/UserResume/GetUserResumeCertificateList',
@@ -39,7 +55,7 @@
   );
 }
 
-/** 姝ゅ鍚庣娌℃湁鎻愪緵娉ㄩ噴 GET /api/UserResume/GetUserResumeDetailInfo */
+/** 鑾峰彇鐢ㄦ埛绠�鍘嗚鎯� GET /api/UserResume/GetUserResumeDetailInfo */
 export async function getUserResumeDetailInfo(options?: API.RequestConfig) {
   return request<API.UserResumeDetailInfoOutput>('/api/UserResume/GetUserResumeDetailInfo', {
     method: 'GET',
@@ -47,7 +63,7 @@
   });
 }
 
-/** 姝ゅ鍚庣娌℃湁鎻愪緵娉ㄩ噴 GET /api/UserResume/GetUserResumeWorkExperience */
+/** 鏍规嵁鐢ㄦ埛id鑾峰彇鐢ㄦ埛宸ヤ綔缁忓巻 GET /api/UserResume/GetUserResumeWorkExperience */
 export async function getUserResumeWorkExperience(options?: API.RequestConfig) {
   return request<API.UserResumeWorkExperienceOutput>(
     '/api/UserResume/GetUserResumeWorkExperience',
@@ -58,12 +74,12 @@
   );
 }
 
-/** 姝ゅ鍚庣娌℃湁鎻愪緵娉ㄩ噴 POST /api/UserResume/SaveUserResumeBaseInfo */
+/** 淇濆瓨绠�鍘嗙殑鍩虹淇℃伅 POST /api/UserResume/SaveUserResumeBaseInfo */
 export async function saveUserResumeBaseInfo(
   body: API.SaveUserResumeBaseInfoInput,
   options?: API.RequestConfig
 ) {
-  return request<any>('/api/UserResume/SaveUserResumeBaseInfo', {
+  return request<number>('/api/UserResume/SaveUserResumeBaseInfo', {
     method: 'POST',
     headers: {
       'Content-Type': 'application/json',
@@ -73,12 +89,12 @@
   });
 }
 
-/** 姝ゅ鍚庣娌℃湁鎻愪緵娉ㄩ噴 POST /api/UserResume/SaveUserResumeCertificate */
+/** 淇濆瓨鐢ㄦ埛鐨勭畝鍘嗚璇佷俊鎭� POST /api/UserResume/SaveUserResumeCertificate */
 export async function saveUserResumeCertificate(
   body: API.SaveUserResumeCertificateInput,
   options?: API.RequestConfig
 ) {
-  return request<any>('/api/UserResume/SaveUserResumeCertificate', {
+  return request<number>('/api/UserResume/SaveUserResumeCertificate', {
     method: 'POST',
     headers: {
       'Content-Type': 'application/json',
@@ -88,12 +104,12 @@
   });
 }
 
-/** 姝ゅ鍚庣娌℃湁鎻愪緵娉ㄩ噴 POST /api/UserResume/SaveUserResumeDetailInfo */
+/** 淇濆瓨绠�鍘嗚鎯� POST /api/UserResume/SaveUserResumeDetailInfo */
 export async function saveUserResumeDetailInfo(
   body: API.SaveUserResumeDetailInfoInput,
   options?: API.RequestConfig
 ) {
-  return request<any>('/api/UserResume/SaveUserResumeDetailInfo', {
+  return request<number>('/api/UserResume/SaveUserResumeDetailInfo', {
     method: 'POST',
     headers: {
       'Content-Type': 'application/json',
@@ -103,12 +119,12 @@
   });
 }
 
-/** 姝ゅ鍚庣娌℃湁鎻愪緵娉ㄩ噴 POST /api/UserResume/SaveUserResumeExpectationJob */
+/** 淇濆瓨鐢ㄦ埛鏈熸湜鐨勫矖浣嶄俊鎭� POST /api/UserResume/SaveUserResumeExpectationJob */
 export async function saveUserResumeExpectationJob(
   body: API.SaveUserResumeExpectationJobInput,
   options?: API.RequestConfig
 ) {
-  return request<any>('/api/UserResume/SaveUserResumeExpectationJob', {
+  return request<number>('/api/UserResume/SaveUserResumeExpectationJob', {
     method: 'POST',
     headers: {
       'Content-Type': 'application/json',
@@ -118,12 +134,12 @@
   });
 }
 
-/** 姝ゅ鍚庣娌℃湁鎻愪緵娉ㄩ噴 POST /api/UserResume/SaveUserResumeWorkExperience */
+/** 淇濆瓨鐢ㄦ埛宸ヤ綔缁忓巻 POST /api/UserResume/SaveUserResumeWorkExperience */
 export async function saveUserResumeWorkExperience(
   body: API.SaveUserResumeWorkExperienceInput,
   options?: API.RequestConfig
 ) {
-  return request<any>('/api/UserResume/SaveUserResumeWorkExperience', {
+  return request<number>('/api/UserResume/SaveUserResumeWorkExperience', {
     method: 'POST',
     headers: {
       'Content-Type': 'application/json',
diff --git a/src/services/api/index.ts b/src/services/api/index.ts
index 94b7246..ffe8d03 100644
--- a/src/services/api/index.ts
+++ b/src/services/api/index.ts
@@ -8,6 +8,9 @@
 import * as BaseModule from './BaseModule';
 import * as Common from './Common';
 import * as Features from './Features';
+import * as FlexEnterprise from './FlexEnterprise';
+import * as FlexEnterpriseWoker from './FlexEnterpriseWoker';
+import * as FlexTask from './FlexTask';
 import * as FlexWorker from './FlexWorker';
 import * as IdentityRole from './IdentityRole';
 import * as IdentityUser from './IdentityUser';
@@ -17,6 +20,7 @@
 import * as Profile from './Profile';
 import * as SearchSetting from './SearchSetting';
 import * as Tenant from './Tenant';
+import * as User from './User';
 import * as UserResume from './UserResume';
 import * as Version from './Version';
 export default {
@@ -26,6 +30,9 @@
   BaseModule,
   Common,
   Features,
+  FlexEnterprise,
+  FlexEnterpriseWoker,
+  FlexTask,
   FlexWorker,
   IdentityRole,
   IdentityUser,
@@ -35,6 +42,7 @@
   Profile,
   SearchSetting,
   Tenant,
+  User,
   UserResume,
   Version,
 };
diff --git a/src/services/api/typings.d.ts b/src/services/api/typings.d.ts
index cd366cf..b4ce2de 100644
--- a/src/services/api/typings.d.ts
+++ b/src/services/api/typings.d.ts
@@ -42,9 +42,9 @@
     sexType?: GenderTypeEnum;
     /** 璇佷功Id */
     listCertionIds?: string[];
-    provinceId?: string;
-    cityId?: string;
-    areaId?: string;
+    provinceId?: number;
+    cityId?: number;
+    areaId?: number;
     address?: string;
     startDate?: string;
     endDate?: string;
@@ -68,8 +68,20 @@
     isCache?: boolean;
   }
 
+  interface APIaddUserResumeContractRecordParams {
+    flexWorkerId?: string;
+  }
+
   interface APIapiDefinitionParams {
     includeTypes?: boolean;
+  }
+
+  interface APIcancelUserResumeCollectParams {
+    flexWorkerId?: string;
+  }
+
+  interface APIcollectVisitingCardParams {
+    flexVisitingCardId?: string;
   }
 
   interface APIcreateParams {
@@ -83,6 +95,10 @@
   }
 
   interface APIdeleteDefaultConnectionStringParams {
+    id?: string;
+  }
+
+  interface APIdeleteFlexEnterpriseParams {
     id?: string;
   }
 
@@ -100,6 +116,10 @@
 
   interface APIdeleteModuleParams {
     id?: string;
+  }
+
+  interface APIdeleteMyCardCollectParams {
+    visitingCardCollectId?: string;
   }
 
   interface APIdeleteRoleParams {
@@ -164,6 +184,10 @@
     moduleId?: string;
   }
 
+  interface APIgetFlexTaskDetailParams {
+    id?: string;
+  }
+
   interface APIgetFlexTaskDtoParams {
     id?: string;
   }
@@ -218,6 +242,10 @@
     id: string;
   }
 
+  interface APIgetUserDetailForBackParams {
+    userId?: string;
+  }
+
   interface APIgetUserListByPhoneNumberParams {
     phoneNumber?: string;
     clientId?: string;
@@ -270,6 +298,10 @@
   interface APIsetForUserParams {
     userId?: string;
     permissionName?: string;
+  }
+
+  interface APIstopEnterpriseUserContractParams {
+    flexWorkerId?: string;
   }
 
   interface APIupdateDefaultConnectionStringParams {
@@ -355,6 +387,21 @@
     values?: Record<string, any>;
   }
 
+  interface AreaDto {
+    id?: string;
+    areaCode?: number;
+    parentId?: number;
+    areaName?: string;
+    /** 1鐪� 2甯� 3鍖� 4闀� */
+    layer?: number;
+    sort?: number;
+    children?: AreaDto[];
+    /** 绠�鏄撴嫾闊� */
+    simpleSpelling?: string;
+    /** 蹇�熸绱� */
+    quickQuery?: string;
+  }
+
   interface BaseAuthorizeDto {
     moduleType?: number;
     moduleId?: string;
@@ -423,6 +470,8 @@
     verificationCode: string;
   }
 
+  type ChargeTypeEnum = 1 | 2;
+
   interface CheckLoginVerificationCodeInput {
     messageType?: string;
     phoneNumber: string;
@@ -431,6 +480,11 @@
 
   interface ClockDto {
     kind?: string;
+  }
+
+  interface CollectFlexWorkerResumeInput {
+    flexWorkerId?: string;
+    userResumeId?: string;
   }
 
   interface ConditionInfo {
@@ -449,6 +503,69 @@
 
   interface ControllerInterfaceApiDescriptionModel {
     type?: string;
+  }
+
+  interface CreateOrEditFlexEnterpriseBankInput {
+    id?: string;
+    /** 寮�鎴疯 */
+    openBank?: string;
+    /** 寮�鎴锋敮琛� */
+    openBranchBank?: string;
+    /** 閾惰璐︽埛 */
+    bankAccount?: string;
+    verifyStatus?: VerifyStatus;
+    flexEnterpirseId?: string;
+  }
+
+  interface CreateOrEditFlexEnterpriseInput {
+    id?: string;
+    /** 浼佷笟鍚嶇О */
+    enterpriseName?: string;
+    /** 娉曚汉濮撳悕 */
+    legalPersonName?: string;
+    /** 娉曚汉韬唤璇佸彿 */
+    legalPersonIdNumber?: string;
+    /** 璁よ瘉鑱旂郴浜� */
+    contact?: string;
+    /** 璁よ瘉鑱旂郴浜虹數璇� */
+    contactPhone?: string;
+    /** 绀句細缁熶竴淇$敤浠g爜 */
+    societyCreditCode?: string;
+    /** 鐪佷唤code */
+    provinceCode?: number;
+    /** 鐪佷唤鍚嶇О */
+    proviceName?: string;
+    /** 鍩庡競Code */
+    cityCode?: number;
+    /** 鍩庡競鍚嶇О */
+    cityName?: string;
+    status?: FlexEnterpriseStatus;
+    settingStatus?: FlexEnterpriseSettingStatus;
+    certificationStatus?: FlexEnterpriseCertificationStatus;
+    /** 鎵�灞炶涓� */
+    belongIndustryType?: string;
+  }
+
+  interface CreateOrEditFlexEnterpriseMessageSettingInput {
+    id?: string;
+    messageChannel?: MessageChannelEnum;
+    /** 娑堟伅璐圭敤 */
+    messageCost?: number;
+    flexEnterpirseId?: string;
+  }
+
+  interface CreateOrEditFlexEnterpriseSignSettingInput {
+    id?: string;
+    signChannel?: SignChannelEnum;
+    chargeType?: ChargeTypeEnum;
+    /** 瀹炲悕璐圭敤 */
+    realVerifyCost?: number;
+    /** 绛剧害璐圭敤 */
+    signCost?: number;
+    /** 涓�鍙d环 */
+    mergeSignCost?: number;
+    /** 浼佷笟Id */
+    flexEnterpirseId?: string;
   }
 
   interface CreateOrEditSearchInput {
@@ -512,6 +629,20 @@
   interface EnableSearchSettingInput {
     id: string;
     status: boolean;
+  }
+
+  interface EnterpriseSignSettingDto {
+    id?: string;
+    signChannel?: SignChannelEnum;
+    chargeType?: ChargeTypeEnum;
+    /** 瀹炲悕璐圭敤 */
+    realVerifyCost?: number;
+    /** 绛剧害璐圭敤 */
+    signCost?: number;
+    /** 涓�鍙d环 */
+    mergeSignCost?: number;
+    /** 浼佷笟Id */
+    flexEnterpirseId?: string;
   }
 
   interface EntityExtensionDto {
@@ -608,19 +739,122 @@
     key?: string;
   }
 
+  interface FlexEnterpriseBankDto {
+    id?: string;
+    /** 寮�鎴疯 */
+    openBank?: string;
+    /** 寮�鎴锋敮琛� */
+    openBranchBank?: string;
+    /** 閾惰璐︽埛 */
+    bankAccount?: string;
+    verifyStatus?: VerifyStatus;
+    flexEnterpirseId?: string;
+  }
+
+  type FlexEnterpriseCertificationStatus = 10 | -10;
+
+  interface FlexEnterpriseDto {
+    id?: string;
+    /** 浼佷笟鍚嶇О */
+    enterpriseName?: string;
+    /** 娉曚汉濮撳悕 */
+    legalPersonName?: string;
+    /** 娉曚汉韬唤璇佸彿 */
+    legalPersonIdNumber?: string;
+    /** 璁よ瘉鑱旂郴浜� */
+    contact?: string;
+    /** 璁よ瘉鑱旂郴浜虹數璇� */
+    contactPhone?: string;
+    /** 绀句細缁熶竴淇$敤浠g爜 */
+    societyCreditCode?: string;
+    /** 鐪佷唤code */
+    provinceCode?: number;
+    /** 鐪佷唤鍚嶇О */
+    proviceName?: string;
+    /** 鍩庡競Code */
+    cityCode?: number;
+    /** 鍩庡競鍚嶇О */
+    cityName?: string;
+    status?: FlexEnterpriseStatus;
+    settingStatus?: FlexEnterpriseSettingStatus;
+    certificationStatus?: FlexEnterpriseCertificationStatus;
+    /** 鎵�灞炶涓� */
+    belongIndustryType?: string;
+    enterpriseSignSettingDto?: EnterpriseSignSettingDto;
+    flexEnterpriseBankDto?: FlexEnterpriseBankDto;
+    flexEnterpriseMessageSettingDto?: FlexEnterpriseMessageSettingDto;
+  }
+
+  interface FlexEnterpriseDtoPageOutput {
+    pageModel?: Pagination;
+    objectData?: any;
+    data?: FlexEnterpriseDto[];
+  }
+
+  interface FlexEnterpriseMessageSettingDto {
+    id?: string;
+    messageChannel?: MessageChannelEnum;
+    /** 娑堟伅璐圭敤 */
+    messageCost?: number;
+    flexEnterpirseId?: string;
+  }
+
+  type FlexEnterpriseSettingStatus = 10 | -10;
+
+  type FlexEnterpriseStatus = 10 | -10;
+
   interface FlexTaskAideDto {
     id?: string;
     aideType?: FlexTaskAideEnum;
     name?: string;
+    imageUrl?: string;
   }
 
   type FlexTaskAideEnum = 10 | 20;
 
+  type FlexTaskCheckAcceptStatusEnum = 10 | 20 | 30;
+
   type FlexTaskFeeTypeEnum = 10 | 20 | 30 | 40;
+
+  interface FlexTaskListOutput {
+    taskId?: string;
+    /** 浠诲姟鍚嶇О */
+    taskName?: string;
+    releaseStatus?: FlexTaskReleaseStatusEnum;
+    /** 瀹夋帓鐘舵�� */
+    arrangeStatus?: boolean;
+    /** 鍙戝竷鏃ユ湡 */
+    startDate?: string;
+    /** 缁撴潫鏃ユ湡 */
+    endDate?: string;
+    feeType?: FlexTaskFeeTypeEnum;
+    settleType?: FlexTaskSettleTypeEnum;
+    settleStatus?: SettleStatusEnum;
+    /** 鏄惁鎺ㄨ崘 */
+    isRecommend?: boolean;
+    /** 缁撶畻鏂瑰紡 */
+    fee?: number;
+    /** 鎶ュ悕浜烘暟 */
+    applyWorkerCount?: number;
+    /** 鏄惁宸插畬鎴愰獙鏀� */
+    isOverCheck?: boolean;
+    overCheckStatus?: OverCheckStatusEnum;
+    creationTime?: string;
+  }
+
+  interface FlexTaskListOutputPageOutput {
+    pageModel?: Pagination;
+    objectData?: any;
+    data?: FlexTaskListOutput[];
+  }
 
   type FlexTaskReleaseStatusEnum = 10 | 20;
 
   type FlexTaskSettleTypeEnum = 10 | 20 | 30;
+
+  type FlexTaskWorkerHireEnum = 1 | 10 | 20 | 30 | 40;
+
+  type FlexWorkerEleSignEnum = 10 | 20 | 30;
 
   type GenderTypeEnum = 1 | 2;
 
@@ -629,8 +863,89 @@
     phoneNumber: string;
   }
 
+  interface GetAreaListInput {
+    /** 1鐪� 2甯� 3鍖� 4闀� */
+    layer?: number;
+    /** 鐖剁骇缂栫爜 */
+    parentCode?: number;
+  }
+
+  interface GetCollectVisitingCardListInput {
+    pageModel?: Pagination;
+  }
+
+  interface GetCollectVisitingCardOutput {
+    id?: string;
+    enterpriseId?: string;
+    userId?: string;
+    name?: string;
+    headPhoto?: string;
+    phoneNum?: string;
+    weChat?: string;
+    jobName?: string;
+    email?: string;
+    companyName?: string;
+    creationTime?: string;
+  }
+
+  interface GetCollectVisitingCardOutputPageOutput {
+    pageModel?: Pagination;
+    objectData?: any;
+    data?: GetCollectVisitingCardOutput[];
+  }
+
   interface GetFeatureListResultDto {
     groups?: FeatureGroupDto[];
+  }
+
+  interface GetFlexEnterpriseInput {
+    pageModel?: Pagination;
+    /** 浼佷笟鍚嶇О/娉曚汉/鑱旂郴浜� */
+    searchWord?: string;
+    flexEnterpriseSettingStatus?: FlexEnterpriseSettingStatus;
+  }
+
+  interface GetFlexSignWorkerListInput {
+    pageModel?: Pagination;
+    signStatus?: FlexWorkerEleSignEnum;
+  }
+
+  interface GetFlexTaskDetailForBackOutput {
+    /** 浠诲姟Id */
+    taskId?: string;
+    /** 浠诲姟鍚嶇О */
+    taskName?: string;
+    isArrange?: boolean;
+    startDate?: string;
+    endDate?: string;
+    feeType?: FlexTaskFeeTypeEnum;
+    feeTypeName?: string;
+    settleType?: FlexTaskSettleTypeEnum;
+    /** 缁撶畻鏂瑰紡 */
+    settleTypeName?: string;
+    /** 绂忓埄 */
+    taskWeals?: FlexTaskAideDto[];
+    /** 璇佷功 */
+    taskCerts?: FlexTaskAideDto[];
+    /** 鏈嶅姟璐� */
+    fee?: number;
+    provinceId?: number;
+    cityId?: number;
+    areaId?: number;
+    /** 鐪� */
+    provinceName?: string;
+    /** 甯� */
+    cityName?: string;
+    /** 鍖哄煙 */
+    areaName?: string;
+    /** 浠诲姟鍦扮偣 */
+    address?: string;
+    creationDate?: string;
+    /** 鏈�灏忓勾榫� */
+    minAge?: number;
+    /** 鏈�澶у勾榫� */
+    maxAge?: number;
+    sexType?: GenderTypeEnum;
   }
 
   interface GetFlexTaskDtoOutput {
@@ -646,9 +961,9 @@
     taskWeals?: FlexTaskAideDto[];
     taskCerts?: FlexTaskAideDto[];
     fee?: number;
-    provinceId?: string;
-    cityId?: string;
-    areaId?: string;
+    provinceId?: number;
+    cityId?: number;
+    areaId?: number;
     provinceName?: string;
     cityName?: string;
     areaName?: string;
@@ -657,6 +972,19 @@
     minAge?: number;
     maxAge?: number;
     sexType?: GenderTypeEnum;
+  }
+
+  interface GetFlexTaskForBackInput {
+    pageModel?: Pagination;
+    /** 浠诲姟鍚嶇О */
+    taskName?: string;
+    /** 鍙戝竷寮�濮嬫棩鏈� */
+    startBeginDate?: string;
+    /** 鍙戝竷缁撴潫鏃ユ湡 */
+    startEndDate?: string;
+    releaseStatus?: FlexTaskReleaseStatusEnum;
+    /** 鏄惁鎺ㄨ崘 */
+    isRecommend?: boolean;
   }
 
   interface GetFlexTaskListByStatusInput {
@@ -676,6 +1004,8 @@
     taskId?: string;
     taskName?: string;
     isArrange?: boolean;
+    isOverCheck?: boolean;
+    releaseStatus?: FlexTaskReleaseStatusEnum;
     startDate?: string;
     endDate?: string;
     feeType?: FlexTaskFeeTypeEnum;
@@ -688,13 +1018,112 @@
     areaName?: string;
     address?: string;
     applyWorkerCount?: number;
-    creationDate?: string;
+    creationTime?: string;
   }
 
   interface GetFlexTaskListOutputPageOutput {
     pageModel?: Pagination;
     objectData?: any;
     data?: GetFlexTaskListOutput[];
+  }
+
+  interface GetFlexTaskWorkerApplyListInput {
+    pageModel?: Pagination;
+    flexTaskId?: string;
+  }
+
+  interface GetFlexTaskWorkerArrangeListInput {
+    pageModel?: Pagination;
+    flexTaskId?: string;
+    /** 濮撳悕韬唤璇佸彿 */
+    searchKeys?: string;
+    /** 鏄惁宸插畨鎺� */
+    arrangStatus?: boolean;
+  }
+
+  interface GetFlexTaskWorkerCheckContentDtoInput {
+    /** 浠诲姟Id */
+    flexTaskId?: string;
+    /** 鐏靛伐Id */
+    flexWorkerId?: string;
+  }
+
+  interface GetFlexTaskWorkerCheckListInput {
+    pageModel?: Pagination;
+    /** 浠诲姟Id */
+    flexTaskId?: string;
+    checkAcceptStatus?: FlexTaskCheckAcceptStatusEnum;
+  }
+
+  interface GetFlexTaskWorkerListInput {
+    pageModel?: Pagination;
+    flexTaskId?: string;
+  }
+
+  interface GetFlexWorkerRecordOutput {
+    taskId?: string;
+    workTime?: string;
+    cityId?: string;
+    cityName?: string;
+    address?: string;
+    taskName?: string;
+  }
+
+  interface GetNewestWorkerListInput {
+    pageModel?: Pagination;
+    /** 宀椾綅Id */
+    expectationJobId?: string;
+    genderType?: GenderTypeEnum;
+    /** 韬唤 */
+    socialIdentity?: string;
+    minAge?: number;
+    maxAge?: number;
+    /** 璇佷功 */
+    certificateTypeId?: string;
+  }
+
+  interface GetNewestWorkerListOutput {
+    userId?: string;
+    userResumeId?: string;
+    name?: string;
+    idNumber?: string;
+    contactPhone?: string;
+    isRealName?: boolean;
+    age?: number;
+    avatarUrl?: string;
+    genderType?: GenderTypeEnum;
+    educationalLevel?: string;
+    socialIdentity?: string;
+    jobIds?: string[];
+    listExpectationJobName?: string[];
+    certIds?: string[];
+    listCertificateNames?: string[];
+    userResumeLifeCircles?: string[];
+    socialIdentityName?: string;
+    eduLevelName?: string;
+    arrangeCount?: number;
+    workExperience?: string;
+    freeTime?: UserResumeFreeTimeEnum;
+    jobSeekingStatus?: UserResumeJobSeekingStatusEnum;
+    creationTime?: string;
+    lastModificationTime?: string;
+    fristContractTime?: string;
+    lastContractTime?: string;
+    userSignStatus?: FlexWorkerEleSignEnum;
+    enterSignStatus?: FlexWorkerEleSignEnum;
+    hireStatus?: FlexTaskWorkerHireEnum;
+    checkAcceptStatus?: FlexTaskCheckAcceptStatusEnum;
+    arrangeStatus?: boolean;
+    applyTime?: string;
+    height?: string;
+    weight?: string;
+    workRecordList?: GetFlexWorkerRecordOutput[];
+  }
+
+  interface GetNewestWorkerListOutputPageOutput {
+    pageModel?: Pagination;
+    objectData?: any;
+    data?: GetNewestWorkerListOutput[];
   }
 
   interface GetPermissionListResultDto {
@@ -726,10 +1155,39 @@
     parentId?: string;
   }
 
+  interface GetSearchSettingListOutput {
+    id?: string;
+    name?: string;
+    searchType?: number;
+    url?: string;
+    sort?: number;
+  }
+
   interface GetSearchSettingListPageOutput {
     pageModel?: Pagination;
     objectData?: any;
     data?: GetSearchSettingList[];
+  }
+
+  interface GetTaskWorkerCheckContentOutput {
+    /** 浠诲姟Id */
+    flexTaskId?: string;
+    /** 鐏靛伐Id */
+    flexWorkerId?: string;
+    /** 濮撳悕 */
+    name?: string;
+    /** 鑱旂郴鐢佃瘽 */
+    contactPhone?: string;
+    /** 鏄惁瀹炲悕 */
+    isRealName?: boolean;
+    /** 澶村儚 */
+    avatarUrl?: string;
+    /** 鎻愪氦楠屾敹鏃堕棿 */
+    appleCheckTime?: string;
+    /** 楠屾敹鍥剧墖璺緞 */
+    checkImageUrl?: string;
+    checkImageLists?: string[];
+    checkAcceptStatus?: FlexTaskCheckAcceptStatusEnum;
   }
 
   interface GetTypeSearchSettingList {
@@ -741,6 +1199,98 @@
   interface GetTypeSearchSettingListInput {
     searchType: number;
     belongType?: number;
+  }
+
+  interface GetUserClientForBackInput {
+    pageModel?: Pagination;
+    /** 濮撳悕/鎵嬫満/韬唤璇佸彿/瀹㈡埛 */
+    searchKeys?: string;
+    /** 鏈�杩戝綍鐢ㄦ椂闂�--寮�濮� */
+    nearlyHireDateTimeBegin?: string;
+    /** 鏈�杩戝綍鐢ㄦ椂闂�--缁撴潫 */
+    nearlyHireDateTimeEnd?: string;
+    /** 鏈�杩戠绾︽椂闂�--寮�濮� */
+    nearlySignDateTimeBegin?: string;
+    /** 鏈�杩戠绾︽椂闂�--缁撴潫 */
+    nearlySignDateTimeEnd?: string;
+    /** 瀹炲悕鐘舵�� */
+    realVerifyStatus?: boolean;
+  }
+
+  interface GetUserClientForBackOutput {
+    userId?: string;
+    userResumeId?: string;
+    /** 濮撳悕 */
+    name?: string;
+    /** 韬唤璇佸彿 */
+    idNumber?: string;
+    /** 鎵嬫満鍙� */
+    contactPhone?: string;
+    /** 骞撮緞 */
+    age?: number;
+    genderType?: GenderTypeEnum;
+    /** 甯搁┗鐪佷唤Code */
+    residentProvinceCode?: number;
+    /** 甯搁┗鍩庡競code */
+    residentCityCode?: number;
+    /** 甯搁┗鐪佷唤鍚嶇О */
+    residentProvinceName?: string;
+    /** 甯搁┗鍩庡競鍚嶇О */
+    residentCityName?: string;
+    /** 瀹炲悕鐘舵�� */
+    realVerifyStatus?: boolean;
+    /** 瀹炲悕鏃堕棿 */
+    realVerifyTime?: string;
+    nearlyWorkRecord?: NearlyFlexWorkerRecord;
+  }
+
+  interface GetUserClientForBackOutputPageOutput {
+    pageModel?: Pagination;
+    objectData?: any;
+    data?: GetUserClientForBackOutput[];
+  }
+
+  interface GetUserClientSignListInput {
+    pageModel?: Pagination;
+    userId?: string;
+  }
+
+  interface GetUserDetailForBackOutput {
+    userId?: string;
+    userResumeId?: string;
+    /** 濮撳悕 */
+    name?: string;
+    /** 韬唤璇佸彿 */
+    idNumber?: string;
+    /** 鎵嬫満鍙� */
+    contactPhone?: string;
+    /** 骞撮緞 */
+    age?: number;
+    /** 韬唤璇佹闈� */
+    certificateFrontImgUrl?: string;
+    /** 韬唤璇佸弽闈� */
+    certificateBackImgUrl?: string;
+  }
+
+  interface GetWorkerListForBackOutput {
+    userId?: string;
+    /** 濮撳悕 */
+    name?: string;
+    /** 韬唤璇佸彿鐮� */
+    idNumber?: string;
+    /** 鐢佃瘽鍙风爜 */
+    contactPhone?: string;
+    /** 骞撮緞 */
+    age?: number;
+    genderType?: GenderTypeEnum;
+    eduLevelName?: string;
+    hireStatus?: FlexTaskWorkerHireEnum;
+  }
+
+  interface GetWorkerListForBackOutputPageOutput {
+    pageModel?: Pagination;
+    objectData?: any;
+    data?: GetWorkerListForBackOutput[];
   }
 
   interface IanaTimeZone {
@@ -929,6 +1479,8 @@
     resource?: string;
   }
 
+  type MessageChannelEnum = 10 | 20;
+
   interface MethodParameterApiDescriptionModel {
     name?: string;
     typeAsString?: string;
@@ -1026,11 +1578,48 @@
   interface MyResumeOutput {
     resumeBaseInfo?: UserResumeBaseInfoOutput;
     resumeExpectationJob?: UserResumeExpectationJobOutput;
+    resumeCertifiCate?: UserResumeCertificateListOutput;
+    resumeCertifiDetail?: UserResumeCertificateDetailOutput;
+    resumeDetailInfo?: UserResumeDetailInfoOutput;
+    resumeWorkExperience?: UserResumeWorkExperienceOutput;
+    /** 宸ヤ綔璁板綍 */
+    resumeWorkRecordList?: UserResumeWorkerRecordOutput[];
+  }
+
+  interface MyVisitingCardOutput {
+    id?: string;
+    enterpriseId?: string;
+    userId?: string;
+    name?: string;
+    headPhoto?: string;
+    phoneNum?: string;
+    weChat?: string;
+    jobName?: string;
+    email?: string;
+    companyName?: string;
+    provinceId?: string;
+    cityId?: string;
+    areaId?: string;
+    provinceName?: string;
+    cityName?: string;
+    areaName?: string;
+    address?: string;
+    companyDesc?: string;
   }
 
   interface NameValue {
     name?: string;
     value?: string;
+  }
+
+  interface NearlyFlexWorkerRecord {
+    taskId?: string;
+    /** 鏈�杩戝綍鐢ㄦ椂闂� */
+    nearlyHireDateTime?: string;
+    /** 鏈�杩戠绾︽椂闂� */
+    nearlySignDateTime?: string;
+    /** 鎵�灞炲晢鎴� */
+    enterpirseName?: string;
   }
 
   interface ObjectExtensionsDto {
@@ -1052,6 +1641,8 @@
     securityToken?: string;
     requestId?: string;
   }
+
+  type OverCheckStatusEnum = 10 | 20 | -10;
 
   interface PageInput {
     pageModel?: Pagination;
@@ -1208,6 +1799,13 @@
     typeSimple?: string;
   }
 
+  interface RoleDto {
+    /** 瑙掕壊Id */
+    id?: string;
+    /** 瑙掕壊鍚� */
+    name?: string;
+  }
+
   interface SaveUserResumeBaseInfoInput {
     name?: string;
     socialIdentity?: string;
@@ -1216,6 +1814,10 @@
     residentCityCode?: number;
     residentProvinceName?: string;
     residentCityName?: string;
+    /** 鑱旂郴鐢佃瘽 */
+    phoneNumber?: string;
+    /** 澶村儚 */
+    avatarUrl?: string;
   }
 
   interface SaveUserResumeCertificateInput {
@@ -1260,6 +1862,16 @@
     returnUrlHash?: string;
   }
 
+  interface SendPhoneCertificationVerificationCodeInput {
+    /** 濮撳悕 */
+    name: string;
+    /** 璇佷欢鍙风爜 */
+    identity: string;
+    /** 鐢ㄦ埛甯愬彿 */
+    mobile: string;
+    businessType?: VerificationCodeBusinessTypeEnum;
+  }
+
   interface SendPhoneMessageBaseInput {
     messageType?: string;
     phoneNumber: string;
@@ -1276,6 +1888,11 @@
     businessType?: VerificationCodeBusinessTypeEnum;
   }
 
+  interface SetFlexEnterpriseStatusInput {
+    id?: string;
+    status?: FlexEnterpriseStatus;
+  }
+
   interface SetMyModule {
     moduleId?: string;
     sequence?: number;
@@ -1289,10 +1906,18 @@
     preViewData?: string;
   }
 
+  interface SetRecommendInput {
+    id?: string;
+    /** 鏄惁鎺ㄨ崘 */
+    isRecommend?: boolean;
+  }
+
   interface SetRoleUserInput {
     userId?: string[];
     roleId?: string;
   }
+
+  type SettleStatusEnum = 10 | 20 | -10;
 
   interface SetUserRoleInput {
     userId?: string;
@@ -1304,6 +1929,26 @@
   interface SetVersionModuleInput {
     versionId: string;
     modules: ModuleTypeInfo[];
+  }
+
+  type SignChannelEnum = 10 | 20;
+
+  interface TaskWorkerArrangeInput {
+    flexTaskId?: string;
+    flexWorkerId?: string;
+    arrange?: boolean;
+  }
+
+  interface TaskWorkerCheckAcceptStatusInput {
+    flexTaskId?: string;
+    flexWorkerId?: string;
+    checkAcceptStatus?: FlexTaskCheckAcceptStatusEnum;
+  }
+
+  interface TaskWorkerHireRefuseInput {
+    flexTaskId?: string;
+    flexWorkerId?: string;
+    hireStatus?: FlexTaskWorkerHireEnum;
   }
 
   interface TenantDto {
@@ -1382,6 +2027,30 @@
     releaseStatus?: FlexTaskReleaseStatusEnum;
   }
 
+  interface UserClientSignListOutput {
+    /** 鎵�灞炲晢鎴� */
+    enterpirseName?: string;
+    /** 鎶ュ悕鏃堕棿 */
+    applyTime?: string;
+    enterSignStatus?: FlexWorkerEleSignEnum;
+    /** 浼佷笟绛剧害鏃堕棿 */
+    enterSignTime?: string;
+    hireStatus?: FlexTaskWorkerHireEnum;
+    /** 褰曠敤鏃堕棿 */
+    hireDateTime?: string;
+    userSignStatus?: FlexWorkerEleSignEnum;
+    /** 鐏靛伐绛剧害鏃堕棿 */
+    userSignTime?: string;
+    /** 鐢靛瓙鍚堝悓 */
+    contractUrl?: string;
+  }
+
+  interface UserClientSignListOutputPageOutput {
+    pageModel?: Pagination;
+    objectData?: any;
+    data?: UserClientSignListOutput[];
+  }
+
   interface UserData {
     id?: string;
     tenantId?: string;
@@ -1404,46 +2073,102 @@
     items?: UserData[];
   }
 
-  interface UserResumeBaseInfoOutput {
+  interface UserDto {
+    /** 鐢ㄦ埛Id */
+    id?: string;
+    /** 鐧诲綍鐢ㄦ埛鍚嶏紙璐﹀彿锛� */
+    userName?: string;
+    /** 鍚嶇О */
     name?: string;
+    /** 鐢ㄦ埛鎵嬫満鍙� */
     phoneNumber?: string;
+    /** 璐︽埛鏄惁閿佷綇锛堟槸鍚︾鐢級 */
+    isLocked?: boolean;
+    /** 瑙掕壊淇℃伅 */
+    roles?: RoleDto[];
+    /** 澶囨敞 */
+    remark?: string;
+    /** 缁勭粐鏋舵瀯鍏徃id */
+    companyOrgId?: string;
+    /** 缁勭粐鏋舵瀯閮ㄩ棬id */
+    departmentOrgId?: string;
+  }
+
+  interface UserResumeBaseInfoOutput {
+    /** 濮撳悕 */
+    name?: string;
+    /** 鐢佃瘽鍙风爜 */
+    phoneNumber?: string;
+    /** 澶村儚 */
+    avatarUrl?: string;
+    genderType?: GenderTypeEnum;
+    /** 骞撮緞 */
+    age?: number;
+    /** 涓婂矖娆℃暟 */
+    arrangeCount?: number;
+    /** 韬唤璇佸彿鐮� */
+    idNumber?: string;
+    /** 韬唤 */
     socialIdentity?: string;
+    /** 韬唤鍚嶇О */
     socialIdentityName?: string;
+    /** 瀛﹀巻 */
     educationalLevel?: string;
+    /** 瀛﹀巻鍚嶇О */
     educationalLevelName?: string;
+    /** 甯搁┗鐪佷唤Code */
     residentProvinceCode?: number;
+    /** 甯搁┗鍩庡競code */
     residentCityCode?: number;
+    /** 甯搁┗鐪佷唤鍚嶇О */
     residentProvinceName?: string;
+    /** 甯搁┗鍩庡競鍚嶇О */
     residentCityName?: string;
   }
 
   interface UserResumeCertificateDetailOutput {
+    /** 绠�鍘嗚璇佽鎯匢d */
     id?: string;
-    userResumeId?: string;
+    /** 鐢ㄦ埛绠�鍘咺d */
+    userId?: string;
+    /** 璁よ瘉绫诲埆Id */
     certificateTypeId?: string;
+    /** 璁よ瘉璇佷欢鍙烽粯璁よ韩浠借瘉 */
     certificateNo?: string;
+    /** 璇佷欢寮�濮嬫椂闂� */
     beginTime?: string;
+    /** 璇佷欢缁撴潫鏃堕棿 */
     endTime?: string;
+    /** 鏄惁姘镐箙 */
     isPermanent?: boolean;
     certificateUnit?: string;
+    /** 韬唤璇佹闈� */
     certificateFrontImgUrl?: string;
+    /** 韬唤璇佸弽闈� */
     certificateBackImgUrl?: string;
   }
 
   interface UserResumeCertificateListOutput {
     id?: string;
+    /** 璇佷功Id */
     certificateTypeId?: string;
+    /** 璇佷功鍚嶇О */
     certificateTypeName?: string;
+    /** 宸ヤ綔绠�鍘咺d */
     userResumeId?: string;
   }
 
   interface UserResumeDetailInfoOutput {
+    /** 韬珮 */
     height?: string;
+    /** 浣撻噸 */
     weight?: string;
+    /** 涓汉鐢熸椿鐓� */
     lifeCircleImgUrlList?: string[];
   }
 
   interface UserResumeExpectationJobOutput {
+    /** 鏈熸湜宀椾綅鍒楄〃 */
     jobIdList?: IdNameOutput[];
     freeTime?: UserResumeFreeTimeEnum;
     jobSeekingStatus?: UserResumeJobSeekingStatusEnum;
@@ -1453,14 +2178,27 @@
 
   type UserResumeJobSeekingStatusEnum = 1 | 2 | 3;
 
+  interface UserResumeWorkerRecordOutput {
+    /** 宸ヤ綔鏃堕棿 */
+    workTime?: string;
+    /** 宸ヤ綔鍦扮偣 */
+    workAddress?: string;
+    /** 宸ヤ綔鍚嶇О */
+    workName?: string;
+  }
+
   interface UserResumeWorkExperienceOutput {
+    /** 宸ヤ綔骞撮檺 */
     workingSeniority?: string;
+    /** 宸ヤ綔缁忛獙 */
     workExperience?: string;
   }
 
   type UserTypeEnum = 1 | 2;
 
-  type VerificationCodeBusinessTypeEnum = 10 | 11 | 20 | 30 | 40 | 70 | 900 | 910 | 920;
+  type VerificationCodeBusinessTypeEnum = 10 | 11 | 20 | 30 | 40 | 70 | 900 | 910 | 920 | 930;
+
+  type VerifyStatus = 10 | -10;
 
   interface VersionCache {
     name?: string;
diff --git a/src/utils/common/file.ts b/src/utils/common/file.ts
index 25cbd9a..7346b89 100644
--- a/src/utils/common/file.ts
+++ b/src/utils/common/file.ts
@@ -8,12 +8,17 @@
   return _url.startsWith('/') ? _url : '/' + _url;
 }
 
+type ConvertApi2FormUrlOptions = {
+  fileName?: string;
+};
+
 /**
  * 鎶奱pi杩斿洖鐨勮矾寰勮浆鎹负upload鐨勮矾寰�
  */
-export function convertApi2FormUrl(path: string) {
+export function convertApi2FormUrl(path: string, options: ConvertApi2FormUrlOptions = {}) {
+  const { fileName } = options;
   return {
-    name: setOssFileName(path),
+    name: fileName ? fileName : setOssFileName(path),
     path: urlOmitDomain(path),
     url: setOSSLink(path),
     status: 'success',
@@ -21,8 +26,8 @@
   } as UploadUserFile;
 }
 
-export function convertApi2FormUrlOnlyOne(path: string) {
-  return path ? [convertApi2FormUrl(path)] : [];
+export function convertApi2FormUrlOnlyOne(path: string, options: ConvertApi2FormUrlOptions = {}) {
+  return path ? [convertApi2FormUrl(path, options)] : [];
 }
 
 /**
diff --git a/src/views/EmploymentManage/AddOrEditEmployment.vue b/src/views/EmploymentManage/AddOrEditEmployment.vue
new file mode 100644
index 0000000..affb0b6
--- /dev/null
+++ b/src/views/EmploymentManage/AddOrEditEmployment.vue
@@ -0,0 +1,19 @@
+<template>
+  <AddOrEditEmploymentView :isDetail="false"></AddOrEditEmploymentView>
+</template>
+
+<script lang="ts">
+import { setPageTitle } from '@/utils';
+
+export default defineComponent({
+  name: 'AddOrEditEmployment',
+  beforeRouteEnter(to) {
+    to.meta.title = to.params.id ? '缂栬緫' : '鍙戝竷';
+    setPageTitle(to.meta.title as string);
+  },
+});
+</script>
+
+<script setup lang="ts">
+import AddOrEditEmploymentView from './components/AddOrEditEmploymentView.vue';
+</script>
diff --git a/src/views/EmploymentManage/EmploymentManage.vue b/src/views/EmploymentManage/EmploymentManage.vue
new file mode 100644
index 0000000..e663bc0
--- /dev/null
+++ b/src/views/EmploymentManage/EmploymentManage.vue
@@ -0,0 +1,249 @@
+<template>
+  <LoadingLayout :loading="state.loading">
+    <AppContainer>
+      <ProTableQueryFilterBar @on-reset="reset">
+        <template #query>
+          <QueryFilterItem tip-content="褰曠敤鐘舵��">
+            <FieldRadio
+              v-model="extraParamState.flexEnterpriseSettingStatus"
+              :value-enum="[
+                { label: '宸插畨鎺�', value: 1 },
+                { label: '寰呭畨鎺�', value: 0 },
+              ]"
+              buttonStyle
+              showAllBtn
+              @change="getList()"
+            />
+          </QueryFilterItem>
+          <QueryFilterItem tip-content="瀹炲悕鐘舵��">
+            <FieldRadio
+              v-model="extraParamState.flexEnterpriseSettingStatus"
+              :value-enum="[
+                { label: '鍙戝竷涓�', value: 1 },
+                { label: '宸插仠姝�', value: 0 },
+              ]"
+              buttonStyle
+              showAllBtn
+              @change="getList()"
+            />
+          </QueryFilterItem>
+          <QueryFilterItem>
+            <FieldDatePicker
+              v-model="extraParamState.flexEnterpriseSettingStatus"
+              type="daterange"
+              range-separator="~"
+              start-placeholder="璧峰鏃ユ湡"
+              end-placeholder="鎴鏃ユ湡"
+              clearable
+              @change="getList()"
+              tooltipContent="鍙戝竷鏃堕棿"
+            ></FieldDatePicker>
+          </QueryFilterItem>
+          <QueryFilterItem>
+            <SearchInput
+              v-model="extraParamState.searchWord"
+              style="width: 250px"
+              placeholder="浠诲姟鍚嶇О"
+              @on-click-search="getList"
+              @keyup.enter="getList()"
+            >
+            </SearchInput>
+          </QueryFilterItem>
+        </template>
+        <template #btn>
+          <el-button @click="goAddOrEdit()" type="primary">鍙戝竷</el-button>
+        </template>
+      </ProTableQueryFilterBar>
+      <ProTableV2
+        v-bind="proTableProps"
+        :columns="EmploymentManageColumns"
+        :operationBtns="operationBtns"
+      >
+        <template #signNum="{ row }">
+          <el-button type="text" @click="goSignList(row.id)">{{ row.signNum || 0 }}</el-button>
+        </template>
+      </ProTableV2>
+    </AppContainer>
+  </LoadingLayout>
+</template>
+
+<script setup lang="ts">
+import {
+  ProTableQueryFilterBar,
+  ProTableV2,
+  SearchInput,
+  LoadingLayout,
+  AppContainer,
+  QueryFilterItem,
+  useTable,
+  FieldDatePicker,
+  FieldRadio,
+  defineOperationBtns,
+} from '@bole-core/components';
+import * as flexEnterpriseServices from '@/services/api/FlexEnterprise';
+import { EmploymentManageColumns } from './constants';
+import { FlexEnterpriseSettingStatus, Gender } from '@/constants';
+import { OrderInputType } from '@bole-core/core';
+import { useGlobalEventContext } from '@/hooks';
+
+defineOptions({
+  name: 'EmploymentManageList',
+});
+
+const operationBtns = defineOperationBtns([
+  {
+    data: {
+      enCode: 'editBtn',
+      name: '缂栬緫',
+    },
+    emits: {
+      onClick: (role) => goAddOrEdit(role),
+    },
+  },
+  {
+    data: {
+      enCode: 'detailBtn',
+      name: '璇︽儏',
+    },
+    emits: {
+      onClick: (role) => goDetail(role),
+    },
+  },
+  {
+    data: {
+      enCode: 'publishBtn',
+      name: '鍙戝竷',
+    },
+    emits: {
+      onClick: (role) => handlePublish(role),
+    },
+    extraProps: {
+      hide: (row) => false,
+    },
+  },
+  {
+    data: {
+      enCode: 'unPublishBtn',
+      name: '鍋滄鍙戝竷',
+    },
+    emits: {
+      onClick: (role) => handleUnPublish(role),
+    },
+    extraProps: {
+      hide: (row) => false,
+    },
+  },
+  {
+    data: {
+      enCode: 'arrangeBtn',
+      name: '瀹夋帓',
+    },
+    props: { type: 'danger' },
+    emits: {
+      onClick: (role) => handleArrange(role),
+    },
+  },
+]);
+
+const router = useRouter();
+
+const BaseState = {
+  loading: true,
+};
+
+const state = reactive({ ...BaseState });
+
+const eventContext = useGlobalEventContext();
+
+eventContext.addEvent('employment:add', () => {
+  getList();
+});
+
+eventContext.addEvent('employment:edit', () => {
+  getList(paginationState.pageIndex);
+});
+
+onMounted(async () => {
+  await getList();
+  state.loading = false;
+});
+
+const {
+  getDataSource: getList,
+  proTableProps,
+  paginationState,
+  extraParamState,
+  reset,
+} = useTable(
+  async ({ pageIndex, pageSize }, extraParamState) => {
+    try {
+      let params: API.GetFlexEnterpriseInput = {
+        pageModel: {
+          rows: pageSize,
+          page: pageIndex,
+          orderInput: extraParamState.orderInput,
+        },
+        flexEnterpriseSettingStatus: extraParamState.flexEnterpriseSettingStatus,
+        searchWord: extraParamState.searchWord,
+      };
+
+      let res = await flexEnterpriseServices.getFlexEnterpriseList(params, {
+        showLoading: !state.loading,
+      });
+      return res;
+    } catch (error) {
+      console.log('error: ', error);
+    }
+  },
+  {
+    defaultExtraParams: {
+      searchWord: '',
+      orderInput: [{ property: 'id', order: OrderInputType.Desc }],
+      flexEnterpriseSettingStatus: '' as any as FlexEnterpriseSettingStatus,
+    },
+    queryKey: ['flexEnterpriseServices/getFlexEnterpriseList'],
+    columnsRenderProps: {},
+  }
+);
+
+function handlePublish(row) {
+  console.log(row);
+}
+function handleUnPublish(row) {
+  console.log(row);
+}
+
+function handleArrange(row) {
+  router.push({
+    name: 'EmploymentManageArrange',
+    params: {
+      id: row?.id ?? '',
+    },
+  });
+}
+function goAddOrEdit(row?) {
+  router.push({
+    name: 'AddOrEditEmployment',
+    params: {
+      id: row?.id ?? '',
+    },
+  });
+}
+function goDetail(row) {
+  router.push({
+    name: 'EmploymentManageDetail',
+    params: {
+      id: row?.id ?? '',
+    },
+  });
+}
+
+function goSignList(row) {
+  router.push({
+    name: 'EmploymentSignList',
+    params: {
+      id: row?.id ?? '',
+    },
+  });
+}
+</script>
diff --git a/src/views/EmploymentManage/EmploymentManageArrange.vue b/src/views/EmploymentManage/EmploymentManageArrange.vue
new file mode 100644
index 0000000..69b9636
--- /dev/null
+++ b/src/views/EmploymentManage/EmploymentManageArrange.vue
@@ -0,0 +1,237 @@
+<template>
+  <LoadingLayout :loading="state.loading">
+    <AppContainer>
+      <ProTableQueryFilterBar @on-reset="reset">
+        <template #query>
+          <QueryFilterItem tip-content="褰曠敤鐘舵��">
+            <FieldRadio
+              v-model="extraParamState.flexEnterpriseSettingStatus"
+              :value-enum="[
+                { label: '宸插畨鎺�', value: 1 },
+                { label: '寰呭畨鎺�', value: 0 },
+              ]"
+              buttonStyle
+              showAllBtn
+              @change="getList()"
+            />
+          </QueryFilterItem>
+          <QueryFilterItem tip-content="瀹炲悕鐘舵��">
+            <FieldRadio
+              v-model="extraParamState.flexEnterpriseSettingStatus"
+              :value-enum="[
+                { label: '鍙戝竷涓�', value: 1 },
+                { label: '宸插仠姝�', value: 0 },
+              ]"
+              buttonStyle
+              showAllBtn
+              @change="getList()"
+            />
+          </QueryFilterItem>
+          <QueryFilterItem>
+            <FieldDatePicker
+              v-model="extraParamState.flexEnterpriseSettingStatus"
+              type="daterange"
+              range-separator="~"
+              start-placeholder="璧峰鏃ユ湡"
+              end-placeholder="鎴鏃ユ湡"
+              clearable
+              @change="getList()"
+              tooltipContent="鍙戝竷鏃堕棿"
+            ></FieldDatePicker>
+          </QueryFilterItem>
+          <QueryFilterItem>
+            <SearchInput
+              v-model="extraParamState.searchWord"
+              style="width: 250px"
+              placeholder="浠诲姟鍚嶇О"
+              @on-click-search="getList"
+              @keyup.enter="getList()"
+            >
+            </SearchInput>
+          </QueryFilterItem>
+        </template>
+        <template #btn>
+          <el-button @click="goAddOrEdit()" type="primary">鍙戝竷</el-button>
+        </template>
+      </ProTableQueryFilterBar>
+      <ProTableV2
+        v-bind="proTableProps"
+        :columns="EmploymentArrangeColumns"
+        :operationBtns="operationBtns"
+      >
+      </ProTableV2>
+    </AppContainer>
+  </LoadingLayout>
+</template>
+
+<script setup lang="ts">
+import {
+  ProTableQueryFilterBar,
+  ProTableV2,
+  SearchInput,
+  LoadingLayout,
+  AppContainer,
+  QueryFilterItem,
+  useTable,
+  FieldDatePicker,
+  FieldRadio,
+  defineOperationBtns,
+} from '@bole-core/components';
+import * as flexEnterpriseServices from '@/services/api/FlexEnterprise';
+import { EmploymentArrangeColumns } from './constants';
+import { OrderInputType, Message } from '@bole-core/core';
+import { useGlobalEventContext } from '@/hooks';
+import { FlexEnterpriseSettingStatus } from '@/constants';
+
+defineOptions({
+  name: 'EmploymentManageArrange',
+});
+
+const operationBtns = defineOperationBtns([
+  {
+    data: {
+      enCode: 'editBtn',
+      name: '缂栬緫',
+    },
+    emits: {
+      onClick: (role) => goAddOrEdit(role),
+    },
+  },
+  {
+    data: {
+      enCode: 'detailBtn',
+      name: '璇︽儏',
+    },
+    emits: {
+      onClick: (role) => goDetail(role),
+    },
+  },
+  {
+    data: {
+      enCode: 'publishBtn',
+      name: '鍙戝竷',
+    },
+    emits: {
+      onClick: (role) => handlePublish(role),
+    },
+    extraProps: {
+      hide: (row) => false,
+    },
+  },
+  {
+    data: {
+      enCode: 'unPublishBtn',
+      name: '鍋滄鍙戝竷',
+    },
+    emits: {
+      onClick: (role) => handleUnPublish(role),
+    },
+    extraProps: {
+      hide: (row) => false,
+    },
+  },
+  {
+    data: {
+      enCode: 'arrangeBtn',
+      name: '瀹夋帓',
+    },
+    props: { type: 'danger' },
+    emits: {
+      onClick: (role) => handleArrange(role),
+    },
+  },
+]);
+
+const router = useRouter();
+
+const BaseState = {
+  loading: true,
+};
+
+const state = reactive({ ...BaseState });
+
+const eventContext = useGlobalEventContext();
+
+eventContext.addEvent('employment:add', () => {
+  getList();
+});
+
+eventContext.addEvent('employment:edit', () => {
+  getList(paginationState.pageIndex);
+});
+
+onMounted(async () => {
+  await getList();
+  state.loading = false;
+});
+
+const {
+  getDataSource: getList,
+  proTableProps,
+  paginationState,
+  extraParamState,
+  reset,
+} = useTable(
+  async ({ pageIndex, pageSize }, extraParamState) => {
+    try {
+      let params: API.GetFlexEnterpriseInput = {
+        pageModel: {
+          rows: pageSize,
+          page: pageIndex,
+          orderInput: extraParamState.orderInput,
+        },
+        flexEnterpriseSettingStatus: extraParamState.flexEnterpriseSettingStatus,
+        searchWord: extraParamState.searchWord,
+      };
+
+      let res = await flexEnterpriseServices.getFlexEnterpriseList(params, {
+        showLoading: !state.loading,
+      });
+      return res;
+    } catch (error) {
+      console.log('error: ', error);
+    }
+  },
+  {
+    defaultExtraParams: {
+      searchWord: '',
+      orderInput: [{ property: 'id', order: OrderInputType.Desc }],
+      flexEnterpriseSettingStatus: '' as any as FlexEnterpriseSettingStatus,
+    },
+    queryKey: ['flexEnterpriseServices/getFlexEnterpriseList'],
+    columnsRenderProps: {},
+  }
+);
+
+function handlePublish(row) {
+  console.log(row);
+}
+function handleUnPublish(row) {
+  console.log(row);
+}
+
+function handleArrange(row) {
+  router.push({
+    name: 'EmploymentManageArrange',
+    params: {
+      id: row?.id ?? '',
+    },
+  });
+}
+function goAddOrEdit(row?) {
+  router.push({
+    name: 'AddOrEditEmployment',
+    params: {
+      id: row?.id ?? '',
+    },
+  });
+}
+function goDetail(row) {
+  router.push({
+    name: 'EmploymentManageDetail',
+    params: {
+      id: row?.id ?? '',
+    },
+  });
+}
+</script>
diff --git a/src/views/EmploymentManage/EmploymentManageDetail.vue b/src/views/EmploymentManage/EmploymentManageDetail.vue
new file mode 100644
index 0000000..1ebb33e
--- /dev/null
+++ b/src/views/EmploymentManage/EmploymentManageDetail.vue
@@ -0,0 +1,10 @@
+<template>
+  <AddOrEditEmploymentView is-detail></AddOrEditEmploymentView>
+</template>
+
+<script setup lang="ts">
+import AddOrEditEmploymentView from './components/AddOrEditEmploymentView.vue';
+defineOptions({
+  name: 'EmploymentManageDetail',
+});
+</script>
diff --git a/src/views/EmploymentManage/EmploymentSignList.vue b/src/views/EmploymentManage/EmploymentSignList.vue
new file mode 100644
index 0000000..79703e5
--- /dev/null
+++ b/src/views/EmploymentManage/EmploymentSignList.vue
@@ -0,0 +1,163 @@
+<template>
+  <LoadingLayout :loading="state.loading">
+    <AppContainer>
+      <ProTableQueryFilterBar @on-reset="reset">
+        <template #query>
+          <QueryFilterItem tip-content="褰曠敤鐘舵��">
+            <FieldRadio
+              v-model="extraParamState.flexEnterpriseSettingStatus"
+              :value-enum="[
+                { label: '宸插綍鐢�', value: 1 },
+                { label: '寰呭綍鐢�', value: 0 },
+              ]"
+              buttonStyle
+              showAllBtn
+              @change="getList()"
+            />
+          </QueryFilterItem>
+          <QueryFilterItem>
+            <SearchInput
+              v-model="extraParamState.searchWord"
+              style="width: 250px"
+              placeholder="浠诲姟鍚嶇О"
+              @on-click-search="getList"
+              @keyup.enter="getList()"
+            >
+            </SearchInput>
+          </QueryFilterItem>
+        </template>
+      </ProTableQueryFilterBar>
+      <ProTableV2
+        v-bind="proTableProps"
+        :columns="EmploymentSignColumns"
+        :operationBtns="operationBtns"
+      >
+      </ProTableV2>
+    </AppContainer>
+  </LoadingLayout>
+</template>
+
+<script setup lang="ts">
+import {
+  ProTableQueryFilterBar,
+  ProTableV2,
+  SearchInput,
+  LoadingLayout,
+  AppContainer,
+  QueryFilterItem,
+  useTable,
+  FieldDatePicker,
+  FieldRadio,
+  defineOperationBtns,
+} from '@bole-core/components';
+import * as flexEnterpriseServices from '@/services/api/FlexEnterprise';
+import { EmploymentSignColumns } from './constants/columns';
+import { OrderInputType, Message } from '@bole-core/core';
+import { useGlobalEventContext } from '@/hooks';
+import { FlexEnterpriseSettingStatus } from '@/constants';
+import StaffInfoDialog from '@/views/FlexJobManage/components/StaffInfoDialog.vue';
+
+defineOptions({
+  name: 'EmploymentSignList',
+});
+
+const operationBtns = defineOperationBtns([
+  {
+    data: {
+      enCode: 'detailBtn',
+      name: '璇︽儏',
+    },
+    emits: {
+      onClick: (role) => openDialog(role),
+    },
+  },
+  {
+    data: {
+      enCode: 'recruitBtn',
+      name: '褰曠敤',
+    },
+    emits: {
+      onClick: (role) => handleRecruit(role),
+    },
+    extraProps: {
+      hide: (row) => false,
+    },
+  },
+  {
+    data: {
+      enCode: 'refuseBtn',
+      name: '璋㈢粷',
+    },
+    emits: {
+      onClick: (role) => handleRefuse(role),
+    },
+    extraProps: {
+      hide: (row) => false,
+    },
+  },
+]);
+
+const router = useRouter();
+
+const BaseState = {
+  loading: true,
+};
+
+const state = reactive({ ...BaseState });
+
+const eventContext = useGlobalEventContext();
+
+eventContext.addEvent('employment:add', () => {
+  getList();
+});
+
+eventContext.addEvent('employment:edit', () => {
+  getList(paginationState.pageIndex);
+});
+
+onMounted(async () => {
+  await getList();
+  state.loading = false;
+});
+
+const {
+  getDataSource: getList,
+  proTableProps,
+  paginationState,
+  extraParamState,
+  reset,
+} = useTable(
+  async ({ pageIndex, pageSize }, extraParamState) => {
+    try {
+      let params: API.GetFlexEnterpriseInput = {
+        pageModel: {
+          rows: pageSize,
+          page: pageIndex,
+          orderInput: extraParamState.orderInput,
+        },
+        flexEnterpriseSettingStatus: extraParamState.flexEnterpriseSettingStatus,
+        searchWord: extraParamState.searchWord,
+      };
+
+      let res = await flexEnterpriseServices.getFlexEnterpriseList(params, {
+        showLoading: !state.loading,
+      });
+      return res;
+    } catch (error) {
+      console.log('error: ', error);
+    }
+  },
+  {
+    defaultExtraParams: {
+      searchWord: '',
+      orderInput: [{ property: 'id', order: OrderInputType.Desc }],
+      flexEnterpriseSettingStatus: '' as any as FlexEnterpriseSettingStatus,
+    },
+    queryKey: ['flexEnterpriseServices/getFlexEnterpriseList'],
+    columnsRenderProps: {},
+  }
+);
+
+function handleRecruit(row) {}
+function handleRefuse(row) {}
+</script>
diff --git a/src/views/EmploymentManage/components/AddOrEditEmploymentView.vue b/src/views/EmploymentManage/components/AddOrEditEmploymentView.vue
new file mode 100644
index 0000000..df33a45
--- /dev/null
+++ b/src/views/EmploymentManage/components/AddOrEditEmploymentView.vue
@@ -0,0 +1,201 @@
+<template>
+  <LoadingLayout :loading="isLoading && isEdit">
+    <AppContainer>
+      <PageFormLayout title="鍩烘湰淇℃伅">
+        <ProForm :model="form" ref="productFormRef" label-width="110px" :is-read="isDetail">
+          <ProFormCol>
+            <ProFormColItem :span="12">
+              <ProFormItemV2 label="浠诲姟鍚嶇О:" prop="name">
+                <ProFormText v-model.trim="form.name" placeholder="璇疯緭鍏ヤ换鍔″悕绉�" />
+              </ProFormItemV2>
+            </ProFormColItem>
+          </ProFormCol>
+          <ProFormCol>
+            <ProFormItemV2 label="鏈嶅姟璐�:" prop="salaryType">
+              <RadioWithExtra
+                v-model="form.salaryType"
+                :value-enum="[
+                  { label: '鎸夋湀', value: 1 },
+                  { label: '鎸夋棩', value: 2 },
+                ]"
+                :showExtra="true"
+              >
+                <template #extra>
+                  <ProFormInputNumber
+                    :controls="false"
+                    :min="0"
+                    :max="999"
+                    v-model="form.name"
+                    placeholder="璇疯緭鍏�"
+                    :unit="form.salaryType === 1 ? '鍏�/鏈�' : '鍏�/澶�'"
+                  ></ProFormInputNumber>
+                </template>
+              </RadioWithExtra>
+            </ProFormItemV2>
+          </ProFormCol>
+          <ProFormCol>
+            <ProFormColItem :span="12">
+              <ProFormItemV2 label="缁撶畻鏂瑰紡:" prop="salaryType">
+                <ProFormRadio
+                  v-model="form.salaryType"
+                  :value-enum="[{ label: '鏄�', value: 1 }]"
+                ></ProFormRadio>
+              </ProFormItemV2>
+            </ProFormColItem>
+          </ProFormCol>
+          <ProFormCol>
+            <ProFormColItem :span="12">
+              <ProFormItemV2 label="骞撮緞瑕佹眰:" prop="ageRange">
+                <ProFormInputNumber
+                  :controls="false"
+                  :min="0"
+                  v-model="form.ageStart"
+                  placeholder="璇疯緭鍏�"
+                  disabled
+                ></ProFormInputNumber>
+                <div class="form-input-separator">鑷�</div>
+                <ProFormInputNumber
+                  :controls="false"
+                  :min="0"
+                  v-model="form.ageEnd"
+                  placeholder="璇疯緭鍏�"
+                  disabled
+                ></ProFormInputNumber>
+              </ProFormItemV2>
+            </ProFormColItem>
+          </ProFormCol>
+          <ProFormCol>
+            <ProFormColItem :span="12">
+              <ProFormItemV2 label="鎬у埆瑕佹眰:" prop="sexRequirement" required>
+                <RadioWithExtra
+                  v-model="form.sexRequirement"
+                  :value-enum="[
+                    {
+                      label: '涓嶉檺',
+                      value: 1,
+                    },
+                  ]"
+                  :showExtra="true"
+                >
+                  <template #extra>
+                    <div class="form-input-separator">鐢锋��</div>
+                    <ProFormInputNumber
+                      :controls="false"
+                      :min="0"
+                      v-model="form.manNumber"
+                      placeholder="璇疯緭鍏�"
+                      disabled
+                    ></ProFormInputNumber>
+                    <div class="form-input-separator">濂虫��</div>
+                    <ProFormInputNumber
+                      :controls="false"
+                      :min="0"
+                      v-model="form.womanNumber"
+                      placeholder="璇疯緭鍏�"
+                      disabled
+                    ></ProFormInputNumber>
+                  </template>
+                </RadioWithExtra>
+              </ProFormItemV2>
+            </ProFormColItem>
+          </ProFormCol>
+        </ProForm>
+        <template #footer>
+          <el-button @click="handleBack()">鍏抽棴</el-button>
+          <el-button v-if="!isDetail" type="primary" @click="handleConfirm()">淇濆瓨</el-button>
+        </template>
+      </PageFormLayout>
+    </AppContainer>
+  </LoadingLayout>
+</template>
+<script setup lang="ts">
+import {
+  LoadingLayout,
+  ProForm,
+  ProFormCol,
+  ProFormColItem,
+  AppContainer,
+  PageFormLayout,
+  ProFormItemV2,
+  ProFormText,
+  ProFormInputNumber,
+  ProFormRadio,
+} from '@bole-core/components';
+import { FormInstance } from 'element-plus';
+import { Message } from '@bole-core/core';
+import { useQuery } from '@tanstack/vue-query';
+import { useGlobalEventContext, useRouteView } from '@/hooks';
+import * as flexTaskServices from '@/services/api/FlexTask';
+
+defineOptions({
+  name: 'AddOrEditEmploymentView',
+});
+type Props = {
+  isDetail: boolean;
+};
+defineProps<Props>();
+const route = useRoute();
+const id = route.params.id as string;
+const isEdit = !!id;
+
+const eventContext = useGlobalEventContext();
+
+const { closeViewPush } = useRouteView();
+
+const form = reactive({
+  name: '',
+  salaryType: 1,
+  ageStart: 0,
+  ageEnd: 0,
+  sexRequirement: 1,
+  manNumber: 0,
+  womanNumber: 0,
+});
+
+const { isLoading } = useQuery({
+  queryKey: ['flexTaskServices/getFlexTaskDetail', id],
+  queryFn: async () => {
+    return await flexTaskServices.getFlexTaskDetail(
+      { id: id },
+      {
+        showLoading: false,
+      }
+    );
+  },
+  onSuccess(data) {
+    form.name = data.taskName;
+  },
+  enabled: isEdit,
+});
+
+function handleBack() {
+  closeViewPush(route, {
+    name: 'EmploymentManageList',
+  });
+}
+const productFormRef = ref<FormInstance>();
+function handleConfirm() {
+  if (!productFormRef.value) return;
+  productFormRef.value.validate((valid) => {
+    if (valid) {
+      submit();
+    } else {
+      return;
+    }
+  });
+}
+async function submit() {
+  try {
+    let params = {};
+    let res;
+    if (res) {
+      Message.successMessage('鎿嶄綔鎴愬姛');
+      eventContext.emit(isEdit ? 'employment:edit' : 'employment:add');
+      handleBack();
+    }
+  } catch (error) {}
+}
+</script>
+<style lang="scss" scoped>
+@use '@/style/common.scss' as *;
+</style>
diff --git a/src/views/EmploymentManage/constants/columns.ts b/src/views/EmploymentManage/constants/columns.ts
new file mode 100644
index 0000000..0b3bfac
--- /dev/null
+++ b/src/views/EmploymentManage/constants/columns.ts
@@ -0,0 +1,154 @@
+import { defineColumns } from '@bole-core/components';
+
+export const EmploymentManageColumns = defineColumns([
+  {
+    id: '1',
+    enCode: 'name',
+    name: '浠诲姟鍚嶇О',
+    width: 180,
+  },
+  {
+    id: '2',
+    enCode: 'name',
+    name: '浠诲姟鍗曞彿',
+    width: 180,
+  },
+  {
+    id: '3',
+    enCode: 'name',
+    name: '缁撶畻鍛ㄦ湡',
+  },
+  {
+    id: '4',
+    enCode: 'name',
+    name: '鏈嶅姟璐归噾棰�',
+  },
+  {
+    id: '5',
+    enCode: 'name',
+    name: '缁撶畻鏂瑰紡',
+    width: 140,
+  },
+  {
+    id: '6',
+    enCode: 'name',
+    name: '鎬у埆瑕佹眰',
+    width: 140,
+  },
+  {
+    id: '7',
+    enCode: 'signNum',
+    name: '鎶ュ悕浜烘暟',
+    width: 140,
+  },
+  {
+    id: '8',
+    enCode: 'name',
+    name: '浠诲姟鐘舵��',
+    width: 140,
+  },
+  {
+    id: '9',
+    enCode: 'name',
+    name: '鍙戝竷鏃ユ湡',
+    width: 160,
+  },
+  {
+    id: '10',
+    enCode: 'name',
+    name: '缁撴潫鏃ユ湡',
+    width: 160,
+  },
+  {
+    id: '11',
+    enCode: 'name',
+    name: '鍙戝竷鐘舵��',
+    width: 160,
+  },
+]);
+
+export const EmploymentArrangeColumns = defineColumns([
+  {
+    id: '1',
+    enCode: 'name',
+    name: '濮撳悕',
+    width: 180,
+  },
+  {
+    id: '2',
+    enCode: 'name',
+    name: '韬唤璇佸彿',
+    width: 180,
+  },
+  {
+    id: '3',
+    enCode: 'name',
+    name: '鐢佃瘽',
+  },
+  {
+    id: '4',
+    enCode: 'name',
+    name: '骞撮緞',
+  },
+  {
+    id: '5',
+    enCode: 'name',
+    name: '鎬у埆',
+    width: 140,
+  },
+  {
+    id: '6',
+    enCode: 'name',
+    name: '瀛﹀巻',
+    width: 140,
+  },
+  {
+    id: '7',
+    enCode: 'name',
+    name: '鎺掔彮鐘舵��',
+    width: 140,
+  },
+]);
+
+export const EmploymentSignColumns = defineColumns([
+  {
+    id: '1',
+    enCode: 'name',
+    name: '濮撳悕',
+    width: 180,
+  },
+  {
+    id: '2',
+    enCode: 'name',
+    name: '韬唤璇佸彿',
+    width: 180,
+  },
+  {
+    id: '3',
+    enCode: 'name',
+    name: '鐢佃瘽',
+  },
+  {
+    id: '4',
+    enCode: 'name',
+    name: '骞撮緞',
+  },
+  {
+    id: '5',
+    enCode: 'name',
+    name: '鎬у埆',
+    width: 140,
+  },
+  {
+    id: '6',
+    enCode: 'name',
+    name: '瀛﹀巻',
+    width: 140,
+  },
+  {
+    id: '7',
+    enCode: 'name',
+    name: '褰曠敤鐘舵��',
+    width: 140,
+  },
+]);
diff --git a/src/views/EmploymentManage/constants/index.ts b/src/views/EmploymentManage/constants/index.ts
new file mode 100644
index 0000000..a7f066b
--- /dev/null
+++ b/src/views/EmploymentManage/constants/index.ts
@@ -0,0 +1 @@
+export * from './columns';
diff --git a/src/views/FlexJobManage/FlexJobManage.vue b/src/views/FlexJobManage/FlexJobManage.vue
new file mode 100644
index 0000000..79429e4
--- /dev/null
+++ b/src/views/FlexJobManage/FlexJobManage.vue
@@ -0,0 +1,350 @@
+<template>
+  <LoadingLayout :loading="state.loading">
+    <AppContainer>
+      <ProTableQueryFilterBar @on-reset="reset">
+        <template #query>
+          <QueryFilterItem tip-content="褰曠敤鐘舵��">
+            <FieldRadio
+              v-model="extraParamState.flexEnterpriseSettingStatus"
+              :value-enum="[
+                { label: '宸插綍鐢�', value: 1 },
+                { label: '鏈綍鐢�', value: 0 },
+              ]"
+              buttonStyle
+              showAllBtn
+              @change="getList()"
+            />
+          </QueryFilterItem>
+          <QueryFilterItem tip-content="瀹炲悕鐘舵��">
+            <FieldRadio
+              v-model="extraParamState.flexEnterpriseSettingStatus"
+              :value-enum="[
+                { label: '宸插疄鍚�', value: 1 },
+                { label: '鏈疄鍚�', value: 0 },
+              ]"
+              buttonStyle
+              showAllBtn
+              @change="getList()"
+            />
+          </QueryFilterItem>
+          <QueryFilterItem tip-content="鐏靛伐绛剧害鐘舵��">
+            <FieldSelect
+              v-model="extraParamState.flexEnterpriseSettingStatus"
+              :value-enum="[
+                { label: '宸插疄鍚�', value: 1 },
+                { label: '鏈疄鍚�', value: 0 },
+              ]"
+              buttonStyle
+              showAllBtn
+              @change="getList()"
+            />
+          </QueryFilterItem>
+          <QueryFilterItem tip-content="浼佷笟绛剧害鐘舵��">
+            <FieldSelect
+              v-model="extraParamState.flexEnterpriseSettingStatus"
+              :value-enum="[
+                { label: '宸插疄鍚�', value: 1 },
+                { label: '鏈疄鍚�', value: 0 },
+              ]"
+              buttonStyle
+              showAllBtn
+              @change="getList()"
+            />
+          </QueryFilterItem>
+          <QueryFilterItem>
+            <FieldDatePicker
+              v-model="extraParamState.flexEnterpriseSettingStatus"
+              type="daterange"
+              range-separator="~"
+              start-placeholder="璧峰鏃ユ湡"
+              end-placeholder="鎴鏃ユ湡"
+              clearable
+              @change="getList()"
+              tooltipContent="鐧昏鏃堕棿"
+            ></FieldDatePicker>
+          </QueryFilterItem>
+          <QueryFilterItem>
+            <FieldDatePicker
+              v-model="extraParamState.flexEnterpriseSettingStatus"
+              type="daterange"
+              range-separator="~"
+              start-placeholder="璧峰鏃ユ湡"
+              end-placeholder="鎴鏃ユ湡"
+              clearable
+              @change="getList()"
+              tooltipContent="绛剧害鏃堕棿"
+            ></FieldDatePicker>
+          </QueryFilterItem>
+          <QueryFilterItem>
+            <SearchInput
+              v-model="extraParamState.searchWord"
+              style="width: 300px"
+              placeholder="濮撳悕/鎵嬫満/韬唤璇佸彿/瀹㈡埛"
+              @on-click-search="getList"
+              @keyup.enter="getList()"
+            >
+            </SearchInput>
+          </QueryFilterItem>
+        </template>
+        <template #btn>
+          <el-button @click="handleDownloadTemplate()" type="primary" link>妯℃澘涓嬭浇</el-button>
+          <el-button @click="handleBatchImportAdd()" type="primary">鎵归噺瀵煎叆</el-button>
+          <el-button @click="handleBatchUnSign()" type="primary">鎵归噺瑙g害</el-button>
+          <el-button @click="handleSendShotMessage()" type="primary">鐭俊鍙戦��</el-button>
+          <el-button @click="handleBatchSign()" type="primary">鎵归噺绛剧害</el-button>
+        </template>
+      </ProTableQueryFilterBar>
+      <ProTableV2
+        v-bind="proTableProps"
+        :columns="FlexJobManageColumns"
+        :operationBtns="operationBtns"
+        show-column-check
+        ref="proTable"
+      >
+      </ProTableV2>
+    </AppContainer>
+    <StaffInfoDialog v-bind="dialogStaffInfoProps" />
+    <BatchImportDialog
+      v-bind="dialogBatchImportProps"
+      @onDownloadTemplate="handleDownloadTemplate"
+    />
+  </LoadingLayout>
+</template>
+
+<script setup lang="ts">
+import {
+  ProTableQueryFilterBar,
+  OperationBtnType,
+  ProTableV2,
+  SearchInput,
+  LoadingLayout,
+  AppContainer,
+  QueryFilterItem,
+  useTable,
+  FieldDatePicker,
+  FieldRadio,
+  FieldSelect,
+  defineOperationBtns,
+  useFormDialog,
+  UploadUserFile,
+} from '@bole-core/components';
+import * as flexEnterpriseServices from '@/services/api/FlexEnterprise';
+import { FlexJobManageColumns } from './constants';
+import { FlexEnterpriseSettingStatus, Gender } from '@/constants';
+import { OrderInputType, Message } from '@bole-core/core';
+import { convertApi2FormUrlOnlyOne, downloadFileByUrl } from '@/utils';
+import StaffInfoDialog from './components/StaffInfoDialog.vue';
+import BatchImportDialog from './components/BatchImportDialog.vue';
+
+defineOptions({
+  name: 'EnterpriseManageList',
+});
+
+const operationBtns = defineOperationBtns([
+  {
+    data: {
+      enCode: 'editBtn',
+      name: '缂栬緫',
+    },
+    emits: {
+      onClick: (role) => openDialog(role),
+    },
+  },
+  {
+    data: {
+      enCode: 'detailBtn',
+      name: '璇︽儏',
+    },
+    emits: {
+      onClick: (role) => openDialog(role, true),
+    },
+  },
+  {
+    data: {
+      enCode: 'signBtn',
+      name: '绛剧害',
+    },
+    emits: {
+      onClick: (role) => handleSign(role),
+    },
+    extraProps: {
+      hide: (row) => false,
+    },
+  },
+  {
+    data: {
+      enCode: 'unSignBtn',
+      name: '瑙g害',
+    },
+    emits: {
+      onClick: (role) => handleUnSign(role),
+    },
+    extraProps: {
+      hide: (row) => false,
+    },
+  },
+  {
+    data: {
+      enCode: 'delBtn',
+      name: '鍒犻櫎',
+    },
+    props: { type: 'danger' },
+    emits: {
+      onClick: (role) => handleDelete(role),
+    },
+  },
+]);
+
+const router = useRouter();
+
+const BaseState = {
+  loading: true,
+};
+
+const state = reactive({ ...BaseState });
+
+onMounted(async () => {
+  await getList();
+  state.loading = false;
+});
+
+const {
+  getDataSource: getList,
+  proTableProps,
+  paginationState,
+  extraParamState,
+  reset,
+} = useTable(
+  async ({ pageIndex, pageSize }, extraParamState) => {
+    try {
+      let params: API.GetFlexEnterpriseInput = {
+        pageModel: {
+          rows: pageSize,
+          page: pageIndex,
+          orderInput: extraParamState.orderInput,
+        },
+        flexEnterpriseSettingStatus: extraParamState.flexEnterpriseSettingStatus,
+        searchWord: extraParamState.searchWord,
+      };
+
+      let res = await flexEnterpriseServices.getFlexEnterpriseList(params, {
+        showLoading: !state.loading,
+      });
+      return res;
+    } catch (error) {
+      console.log('error: ', error);
+    }
+  },
+  {
+    defaultExtraParams: {
+      searchWord: '',
+      orderInput: [{ property: 'id', order: OrderInputType.Desc }],
+      flexEnterpriseSettingStatus: '' as any as FlexEnterpriseSettingStatus,
+    },
+    queryKey: ['flexEnterpriseServices/getFlexEnterpriseList'],
+    columnsRenderProps: {},
+  }
+);
+
+const proTable = ref<InstanceType<typeof ProTableV2>>();
+
+function getSelectionRows() {
+  if (proTableProps.value.tableData.length) {
+    const res = proTable.value.innerTableRef.getSelectionRows();
+    if (res.length > 0) {
+      return res;
+    } else {
+      Message.errorMessage('鏈�夋嫨鏁版嵁');
+    }
+  } else {
+    Message.errorMessage('鏆傛棤鏁版嵁');
+  }
+}
+
+const {
+  dialogProps: dialogStaffInfoProps,
+  handleEdit: handleStaffInfoEdit,
+  editForm: staffInfoEditForm,
+} = useFormDialog({
+  onConfirm: handleAddOrEdit,
+  defaultFormParams: {
+    id: '',
+    name: '',
+    idNumber: '',
+    phoneNumber: '',
+    genderType: Gender.Male,
+    age: 0,
+    companyId: '',
+    customerId: '',
+    idFrontUrl: [] as UploadUserFile[],
+    idBackUrl: [] as UploadUserFile[],
+    contractUrl: [] as UploadUserFile[],
+    regiterTime: '',
+    realVerifyTime: '',
+    signTime: '',
+    isDetail: false,
+  },
+});
+
+function openDialog(row, isDetail = false) {
+  handleStaffInfoEdit({
+    id: row.id,
+    name: row.name,
+    idNumber: row.idNumber,
+    phoneNumber: row.phoneNumber,
+    genderType: Gender.Male,
+    age: row.age ?? 0,
+    companyId: row.companyId,
+    customerId: row.customerId,
+    idFrontUrl: convertApi2FormUrlOnlyOne(row.idFrontUrl),
+    idBackUrl: convertApi2FormUrlOnlyOne(row.idBackUrl),
+    contractUrl: convertApi2FormUrlOnlyOne(row.contractUrl, {
+      fileName: row.contractUrl ? row.contractUrl.split('/').pop() : '鍚堝悓',
+    }),
+    regiterTime: row.regiterTime,
+    realVerifyTime: row.realVerifyTime,
+    signTime: row.signTime,
+    isDetail: isDetail,
+  });
+}
+
+async function handleAddOrEdit() {}
+
+const {
+  dialogProps: dialogBatchImportProps,
+  handleAdd: handleBatchImportAdd,
+  editForm: batchImportForm,
+} = useFormDialog({
+  onConfirm: handleBatchImport,
+  defaultFormParams: {
+    customerId: '',
+    contractTemplateId: '',
+    templateDataId: '',
+    url: [] as UploadUserFile[],
+    userList: [],
+  },
+});
+
+async function handleBatchImport() {}
+
+function handleDownloadTemplate() {
+  downloadFileByUrl('', '鎵归噺瀵煎叆妯℃澘');
+}
+
+function handleBatchUnSign() {}
+function handleSendShotMessage() {}
+
+function handleSign(row) {}
+function handleBatchSign() {}
+async function handleUnSign(row) {
+  try {
+    await Message.tipMessage('纭畾瑙g害鐢ㄦ埛锛�');
+  } catch (error) {}
+}
+
+async function handleDelete(row) {
+  try {
+    await Message.deleteMessage();
+  } catch (error) {}
+}
+</script>
diff --git a/src/views/FlexJobManage/components/BatchImportDialog.vue b/src/views/FlexJobManage/components/BatchImportDialog.vue
new file mode 100644
index 0000000..6a311dc
--- /dev/null
+++ b/src/views/FlexJobManage/components/BatchImportDialog.vue
@@ -0,0 +1,109 @@
+<template>
+  <ProDialog title="浜哄憳瀵煎叆" v-model="visible" @close="onDialogClose" destroy-on-close draggable>
+    <ProForm :model="form" ref="dialogForm" label-width="100px">
+      <ProFormItemV2
+        label="閫夋嫨鏂囦欢:"
+        prop="userList"
+        :check-rules="[{ message: '璇蜂笂浼犱汉鍛樺悕鍗�', type: 'array' }]"
+      >
+        <div style="display: flex">
+          <ProFormUpload
+            v-model:file-url="form.url"
+            :limit="1"
+            :limitFileSize="10"
+            accept="xlsx,xls"
+            :needUploadOss="false"
+            :on-success="handleImport"
+          ></ProFormUpload>
+          <el-button
+            type="primary"
+            class="el-button-link-clear legalPersonIdImgUrl-btn"
+            link
+            @click="emit('onDownloadTemplate')"
+            >妯℃澘涓嬭浇</el-button
+          >
+        </div>
+      </ProFormItemV2>
+    </ProForm>
+    <template #footer>
+      <span class="dialog-footer">
+        <el-button type="primary" @click="handleConfirm">鎻愪氦</el-button>
+        <el-button type="default" @click="emit('onCancel')">鍙栨秷</el-button>
+      </span>
+    </template>
+  </ProDialog>
+</template>
+
+<script setup lang="ts">
+import {
+  ProDialog,
+  ProForm,
+  ProFormItemV2,
+  ProFormUpload,
+  ProFormSelect,
+  UploadUserFile,
+  XLSXUtils,
+} from '@bole-core/components';
+import { FormInstance, FormRules, useFormItem } from 'element-plus';
+import { useUser } from '@/hooks';
+
+defineOptions({
+  name: 'BatchImportDialog',
+});
+
+type Form = {
+  title?: string;
+  customerId: string;
+  contractTemplateId: string;
+  templateDataId: string;
+  url: UploadUserFile[];
+  userList: any[];
+};
+
+const visible = defineModel({ type: Boolean });
+const form = defineModel<Form>('form');
+
+const emit = defineEmits<{
+  (e: 'onDownloadTemplate'): void;
+  (e: 'onConfirm'): void;
+  (e: 'onCancel'): void;
+}>();
+
+const { user } = useUser();
+
+const dialogForm = ref<FormInstance>();
+
+function onDialogClose() {
+  if (!dialogForm.value) return;
+  dialogForm.value.resetFields();
+}
+
+function handleConfirm() {
+  if (!dialogForm.value) return;
+  dialogForm.value.validate((valid) => {
+    if (valid) {
+      emit('onConfirm');
+    } else {
+      return;
+    }
+  });
+}
+
+const XLSXHeaderMap = {
+  name: '濮撳悕',
+  phone: '鎵嬫満鍙�',
+};
+
+function handleImport(response: UploadUserFile) {
+  XLSXUtils.resloveXLSXFromUploadInput<typeof XLSXHeaderMap>({
+    //@ts-ignore
+    file: response.file,
+    resloveKeyList: Object.keys(XLSXHeaderMap),
+    onSuccess: async (worksheetList) => {
+      const userXLSXList = worksheetList[0];
+      form.value.userList = userXLSXList;
+      dialogForm.value?.validateField?.('userList');
+    },
+  });
+}
+</script>
diff --git a/src/views/FlexJobManage/components/StaffInfoDialog.vue b/src/views/FlexJobManage/components/StaffInfoDialog.vue
new file mode 100644
index 0000000..5df64d5
--- /dev/null
+++ b/src/views/FlexJobManage/components/StaffInfoDialog.vue
@@ -0,0 +1,199 @@
+<template>
+  <ProDialog
+    :title="form.isDetail ? '浜哄憳璇︽儏' : '浜哄憳淇℃伅缂栬緫'"
+    v-model="visible"
+    @close="onDialogClose"
+    destroy-on-close
+    draggable
+    :width="900"
+  >
+    <ProForm :model="form" ref="dialogForm" label-width="120px" :is-read="form.isDetail">
+      <ProFormCol>
+        <ProFormColItem :span="12">
+          <ProFormItemV2 label="濮撳悕锛�" prop="name" :check-rules="[{ message: '璇疯緭鍏ュ鍚�' }]">
+            <ProFormText placeholder="璇疯緭鍏ュ鍚�" v-model.trim="form.name"></ProFormText>
+          </ProFormItemV2>
+        </ProFormColItem>
+        <ProFormColItem :span="12">
+          <ProFormItemV2 v-if="form.isDetail" label="鎶ュ悕鏃堕棿锛�" prop="regiterTime">
+            <div>{{ format(form.regiterTime, 'YYYY-MM-DD HH:mm') }}</div>
+          </ProFormItemV2>
+        </ProFormColItem>
+        <ProFormColItem :span="12">
+          <ProFormItemV2
+            label="韬唤璇佸彿锛�"
+            prop="idNumber"
+            :check-rules="[{ message: '璇疯緭鍏ヨ韩浠借瘉鍙�', type: 'idCard' }]"
+          >
+            <ProFormText placeholder="璇疯緭鍏ヨ韩浠借瘉鍙�" v-model.trim="form.idNumber"></ProFormText>
+          </ProFormItemV2>
+        </ProFormColItem>
+        <ProFormColItem :span="12">
+          <ProFormItemV2 v-if="form.isDetail" label="瀹炲悕鏃堕棿锛�" prop="realVerifyTime">
+            <div>{{ format(form.realVerifyTime, 'YYYY-MM-DD HH:mm') }}</div>
+          </ProFormItemV2>
+        </ProFormColItem>
+        <ProFormColItem :span="12">
+          <ProFormItemV2
+            label="鎵嬫満鍙凤細"
+            prop="phoneNumber"
+            :check-rules="[{ message: '璇疯緭鍏ユ墜鏈哄彿', type: 'phone' }]"
+          >
+            <ProFormText placeholder="璇疯緭鍏ユ墜鏈哄彿" v-model.trim="form.phoneNumber"></ProFormText>
+          </ProFormItemV2>
+        </ProFormColItem>
+        <ProFormColItem :span="12">
+          <ProFormItemV2 v-if="form.isDetail" label="绛剧害鏃堕棿锛�" prop="signTime">
+            <div>{{ format(form.signTime, 'YYYY-MM-DD HH:mm') }}</div>
+          </ProFormItemV2>
+        </ProFormColItem>
+        <ProFormColItem :span="12">
+          <ProFormItemV2 label="鎬у埆锛�" prop="phoneNumber" required>
+            <ProFormRadio
+              v-model="form.genderType"
+              :value-enum="GenderText"
+              :buttonStyle="false"
+            ></ProFormRadio>
+          </ProFormItemV2>
+        </ProFormColItem>
+        <ProFormColItem :span="12">
+          <ProFormItemV2 v-if="form.isDetail" label="鐢靛瓙鍚堝悓锛�" prop="contractUrl">
+            <ProFormUpload
+              v-model:file-url="form.contractUrl"
+              :limit="1"
+              :limitFileSize="10"
+              accept="jpg/jpeg,png,pdf"
+            ></ProFormUpload>
+          </ProFormItemV2>
+        </ProFormColItem>
+        <ProFormColItem :span="12">
+          <ProFormItemV2
+            label="骞撮緞锛�"
+            prop="age"
+            :check-rules="[{ message: '璇疯緭鍏ュ勾榫�', type: 'number' }]"
+          >
+            <ProFormInputNumber
+              v-model="form.age"
+              :controls="false"
+              :min="0"
+              :max="9999"
+              :unit="form.isDetail ? '宀�' : ''"
+            ></ProFormInputNumber>
+          </ProFormItemV2>
+        </ProFormColItem>
+      </ProFormCol>
+      <ProFormItemV2
+        label="韬唤璇佹闈細"
+        prop="idFrontUrl"
+        :check-rules="[{ message: '璇蜂笂浼犺韩浠借瘉姝i潰', type: 'upload' }]"
+      >
+        <ProFormImageUpload v-model:file-url="form.idFrontUrl" :limitFileSize="10" :showTip="false">
+        </ProFormImageUpload>
+      </ProFormItemV2>
+      <ProFormItemV2
+        label="韬唤璇佸弽闈細"
+        prop="idBackUrl"
+        :check-rules="[{ message: '璇蜂笂浼犺韩浠借瘉鍙嶉潰', type: 'upload' }]"
+      >
+        <ProFormImageUpload v-model:file-url="form.idBackUrl" :limitFileSize="10" :showTip="false">
+        </ProFormImageUpload>
+      </ProFormItemV2>
+    </ProForm>
+    <template #footer>
+      <span class="dialog-footer">
+        <el-button v-if="form.isDetail" @click="emit('onCancel')">鍏抽棴</el-button>
+        <template v-else>
+          <el-button type="primary" @click="handleConfirm">鎻愪氦</el-button>
+          <el-button @click="handleReset">閲嶇疆</el-button>
+          <el-button @click="emit('onCancel')">鍙栨秷</el-button>
+        </template>
+      </span>
+    </template>
+  </ProDialog>
+</template>
+
+<script setup lang="ts">
+import { FormInstance } from 'element-plus';
+import {
+  ProDialog,
+  ProForm,
+  ProFormItemV2,
+  ProFormText,
+  UploadUserFile,
+  ProFormCol,
+  ProFormColItem,
+  ProFormImageUpload,
+  ProFormRadio,
+  ProFormUpload,
+  ProFormInputNumber,
+} from '@bole-core/components';
+import { format } from '@/utils';
+import { Gender, GenderText } from '@/constants';
+
+defineOptions({
+  name: 'StaffInfoDialog',
+});
+
+type Form = {
+  title?: string;
+  id: string;
+  name: string;
+  idNumber: string;
+  phoneNumber: string;
+  genderType: Gender;
+  age: number;
+  customerId: string;
+  companyId: string;
+  idFrontUrl: UploadUserFile[];
+  idBackUrl: UploadUserFile[];
+  contractUrl: UploadUserFile[];
+  regiterTime: string;
+  realVerifyTime: string;
+  signTime: string;
+  isDetail: boolean;
+};
+
+const visible = defineModel({ type: Boolean });
+
+const form = defineModel<Form>('form');
+let defaultForm: Form = null;
+
+watch(
+  visible,
+  (visible) => {
+    if (visible) {
+      defaultForm = { ...unref(form) };
+    }
+  },
+  {
+    immediate: true,
+  }
+);
+
+const emit = defineEmits<{
+  (e: 'onConfirm'): void;
+  (e: 'onCancel'): void;
+}>();
+
+const dialogForm = ref<FormInstance>();
+
+function onDialogClose() {
+  if (!dialogForm.value) return;
+  dialogForm.value.resetFields();
+}
+
+function handleConfirm() {
+  if (!dialogForm.value) return;
+  dialogForm.value.validate((valid) => {
+    if (valid) {
+      emit('onConfirm');
+    } else {
+      return;
+    }
+  });
+}
+
+function handleReset() {
+  form.value = { ...defaultForm };
+}
+</script>
diff --git a/src/views/FlexJobManage/constants/columns.ts b/src/views/FlexJobManage/constants/columns.ts
new file mode 100644
index 0000000..cd29086
--- /dev/null
+++ b/src/views/FlexJobManage/constants/columns.ts
@@ -0,0 +1,80 @@
+import { defineColumns } from '@bole-core/components';
+
+export const FlexJobManageColumns = defineColumns([
+  {
+    id: '1',
+    enCode: 'name',
+    name: '濮撳悕',
+    width: 180,
+  },
+  {
+    id: '2',
+    enCode: 'idNumber',
+    name: '韬唤璇佸彿',
+    width: 180,
+  },
+  {
+    id: '3',
+    enCode: 'sex',
+    name: '鎬у埆',
+  },
+  {
+    id: '5',
+    enCode: 'age',
+    name: '骞撮緞',
+  },
+  {
+    id: '6',
+    enCode: 'phoneNumber',
+    name: '鎵嬫満鍙�',
+    width: 140,
+  },
+  {
+    id: '8',
+    enCode: 'regiterStatus',
+    name: '褰曠敤鐘舵��',
+    width: 140,
+  },
+  {
+    id: '9',
+    enCode: 'realVerifyStatus',
+    name: '瀹炲悕鐘舵��',
+    width: 140,
+  },
+  {
+    id: '10',
+    enCode: 'signStatus',
+    name: '鐏靛伐绛剧害鐘舵��',
+    width: 140,
+  },
+  {
+    id: '11',
+    enCode: 'regiterTime',
+    name: '褰曠敤鏃堕棿',
+    width: 160,
+  },
+  {
+    id: '12',
+    enCode: 'realVerifyTime',
+    name: '瀹炲悕鏃堕棿',
+    width: 160,
+  },
+  {
+    id: '13',
+    enCode: 'signTime',
+    name: '绛剧害鏃堕棿',
+    width: 160,
+  },
+  {
+    id: '14',
+    enCode: 'enterSignStatus',
+    name: '浼佷笟绛剧害鐘舵��',
+    width: 160,
+  },
+  {
+    id: '15',
+    enCode: 'enterSignTime',
+    name: '浼佷笟绛剧害鏃堕棿',
+    width: 160,
+  },
+]);
diff --git a/src/views/FlexJobManage/constants/index.ts b/src/views/FlexJobManage/constants/index.ts
new file mode 100644
index 0000000..a7f066b
--- /dev/null
+++ b/src/views/FlexJobManage/constants/index.ts
@@ -0,0 +1 @@
+export * from './columns';

--
Gitblit v1.9.1