wupengfei
2025-07-30 5d3529a43c2f80c6eff5235c646a446737dcb13c
feat: 页面
18个文件已添加
13个文件已修改
3677 ■■■■■ 已修改文件
config/config.ts 10 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
package.json 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pnpm-lock.yaml 289 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/constants/enum.ts 24 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/hooks/dic.ts 54 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/hooks/index.ts 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/hooks/useEvent.ts 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/router/index.ts 108 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/services/api/Common.ts 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/services/api/FlexEnterprise.ts 108 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/services/api/FlexEnterpriseWoker.ts 54 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/services/api/FlexTask.ts 63 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/services/api/FlexWorker.ts 336 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/services/api/User.ts 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/services/api/UserResume.ts 46 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/services/api/index.ts 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/services/api/typings.d.ts 758 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/utils/common/file.ts 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/EmploymentManage/AddOrEditEmployment.vue 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/EmploymentManage/EmploymentManage.vue 249 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/EmploymentManage/EmploymentManageArrange.vue 237 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/EmploymentManage/EmploymentManageDetail.vue 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/EmploymentManage/EmploymentSignList.vue 163 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/EmploymentManage/components/AddOrEditEmploymentView.vue 201 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/EmploymentManage/constants/columns.ts 154 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/EmploymentManage/constants/index.ts 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/FlexJobManage/FlexJobManage.vue 350 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/FlexJobManage/components/BatchImportDialog.vue 109 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/FlexJobManage/components/StaffInfoDialog.vue 199 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/FlexJobManage/constants/columns.ts 80 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/FlexJobManage/constants/index.ts 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
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: '聚千保理赔管理工具',
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",
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
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,
}
src/hooks/dic.ts
New file
@@ -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,
  };
}
src/hooks/index.ts
@@ -6,3 +6,4 @@
export * from './useEvent';
export * from './useUser';
export * from './help';
export * from './dic';
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;
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,
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,
src/services/api/FlexEnterprise.ts
New file
@@ -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(
  // 叠加生成的Param类型 (非body参数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 || {}),
  });
}
src/services/api/FlexEnterpriseWoker.ts
New file
@@ -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(
  // 叠加生成的Param类型 (非body参数swagger默认没有生成对象)
  params: API.APIgetUserDetailForBackParams,
  options?: API.RequestConfig
) {
  return request<API.GetUserDetailForBackOutput>('/api/FlexEnterpriseWoker/GetUserDetailForBack', {
    method: 'GET',
    params: {
      ...params,
    },
    ...(options || {}),
  });
}
src/services/api/FlexTask.ts
New file
@@ -0,0 +1,63 @@
/* eslint-disable */
// @ts-ignore
import { request } from '@/utils/request';
/** 获取任务详情 GET /api/FlexTask/GetFlexTaskDetail */
export async function getFlexTaskDetail(
  // 叠加生成的Param类型 (非body参数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 || {}),
  });
}
src/services/api/FlexWorker.ts
@@ -14,6 +14,66 @@
  });
}
/** 添加联系记录 GET /api/FlexWorker/AddUserResumeContractRecord */
export async function addUserResumeContractRecord(
  // 叠加生成的Param类型 (非body参数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(
  // 叠加生成的Param类型 (非body参数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(
  // 叠加生成的Param类型 (非body参数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(
  // 叠加生成的Param类型 (非body参数swagger默认没有生成对象)
@@ -25,6 +85,79 @@
    params: {
      ...params,
    },
    ...(options || {}),
  });
}
/** 删除名片收藏 DELETE /api/FlexWorker/DeleteMyCardCollect */
export async function deleteMyCardCollect(
  // 叠加生成的Param类型 (非body参数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 || {}),
    }
  );
}
/** 企业解约 GET /api/FlexWorker/StopEnterpriseUserContract */
export async function stopEnterpriseUserContract(
  // 叠加生成的Param类型 (非body参数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,
src/services/api/User.ts
New file
@@ -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 || {}),
  });
}
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(
  // 叠加生成的Param类型 (非body参数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',
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,
};
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;
    /** 社会统一信用代码 */
    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;
    /** 一口价 */
    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;
    /** 一口价 */
    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;
    /** 社会统一信用代码 */
    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 {
    /** 简历认证详情Id */
    id?: string;
    userResumeId?: string;
    /** 用户简历Id */
    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;
    /** 工作简历Id */
    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;
src/utils/common/file.ts
@@ -8,12 +8,17 @@
  return _url.startsWith('/') ? _url : '/' + _url;
}
type ConvertApi2FormUrlOptions = {
  fileName?: string;
};
/**
 * 把api返回的路径转换为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)] : [];
}
/**
src/views/EmploymentManage/AddOrEditEmployment.vue
New file
@@ -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>
src/views/EmploymentManage/EmploymentManage.vue
New file
@@ -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>
src/views/EmploymentManage/EmploymentManageArrange.vue
New file
@@ -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>
src/views/EmploymentManage/EmploymentManageDetail.vue
New file
@@ -0,0 +1,10 @@
<template>
  <AddOrEditEmploymentView is-detail></AddOrEditEmploymentView>
</template>
<script setup lang="ts">
import AddOrEditEmploymentView from './components/AddOrEditEmploymentView.vue';
defineOptions({
  name: 'EmploymentManageDetail',
});
</script>
src/views/EmploymentManage/EmploymentSignList.vue
New file
@@ -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>
src/views/EmploymentManage/components/AddOrEditEmploymentView.vue
New file
@@ -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>
src/views/EmploymentManage/constants/columns.ts
New file
@@ -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,
  },
]);
src/views/EmploymentManage/constants/index.ts
New file
@@ -0,0 +1 @@
export * from './columns';
src/views/FlexJobManage/FlexJobManage.vue
New file
@@ -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">批量解约</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: '解约',
    },
    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('确定解约用户?');
  } catch (error) {}
}
async function handleDelete(row) {
  try {
    await Message.deleteMessage();
  } catch (error) {}
}
</script>
src/views/FlexJobManage/components/BatchImportDialog.vue
New file
@@ -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>
src/views/FlexJobManage/components/StaffInfoDialog.vue
New file
@@ -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: '请上传身份证正面', 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>
src/views/FlexJobManage/constants/columns.ts
New file
@@ -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,
  },
]);
src/views/FlexJobManage/constants/index.ts
New file
@@ -0,0 +1 @@
export * from './columns';