wupengfei
2025-04-07 1ea740c51e84a80e6eb069846ba4a58438f9795c
feat: init
7个文件已修改
12个文件已添加
1490 ■■■■■ 已修改文件
package.json 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
pnpm-lock.yaml 271 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/components/Layout/ChunkCellV2.vue 40 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/components/commonView/BatchInfoView.vue 78 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/components/commonView/DeclareEnterpriseTableView.vue 145 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/components/commonView/DetailView.vue 63 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/components/commonView/FourStreamsMaterialFileTable.vue 179 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/components/commonView/MateriaDetailDialog.vue 46 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/components/commonView/MaterialInfoView.vue 42 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/components/commonView/SettlementMaterialInfoView.vue 51 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/components/commonView/types.ts 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/constants/dic.ts 43 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/constants/enterpriseMaterial.ts 111 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/constants/index.ts 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/hooks/dic.ts 131 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/hooks/index.ts 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/MaterialReview/MaterialReviewAudit.vue 121 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/MaterialReview/MaterialReviewDetail.vue 88 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/Reward/RewardDeclareDetail.vue 62 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
package.json
@@ -19,7 +19,7 @@
  "dependencies": {
    "@bole-12333/chat-kit": "latest",
    "@bole-12333/customer-chat": "latest",
    "@bole-core/components": "^1.2.28",
    "@bole-core/components": "latest",
    "@bole-core/core": "latest",
    "@bole-core/pretty-layout": "latest",
    "@bole-core/sass-utils": "latest",
pnpm-lock.yaml
@@ -1,5 +1,9 @@
lockfileVersion: '6.0'
settings:
  autoInstallPeers: true
  excludeLinksFromLockfile: false
overrides:
  vue: 3.5.11
@@ -16,8 +20,8 @@
    specifier: latest
    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: ^1.2.28
    version: 1.2.28(@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.8.4)(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)
    specifier: latest
    version: 1.3.6(@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.8.4)(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.8.4)(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)
@@ -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)
@@ -2123,9 +2127,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
@@ -2144,7 +2148,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)
@@ -2160,8 +2164,8 @@
      vue: 3.5.11(typescript@4.8.4)
    dev: false
  /@bole-core/components@1.2.28(@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.8.4)(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-Gh7gBf8vl+L2/Ph55NqRcVy2CaWRVGYZhyUo0H9Ela61B9hV2ALz5B95Km+jbvMdhl4rr5b/gVh6a/3DhGTv7A==}
  /@bole-core/components@1.3.6(@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.8.4)(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-m4f6vSX23a6X0i/QFvVW1iHh69RPa2haPA+vA3XVPa8LwYFBUu4RnbI3TC+IAFm5hb16Rb8BtJpqNcLeGB3IyA==}
    peerDependencies:
      '@bole-core/core': '*'
      '@bole-core/sass-utils': '*'
@@ -2177,7 +2181,7 @@
      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.8.4)(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)
@@ -2210,7 +2214,7 @@
      jszip: '*'
      lodash: '*'
      senior-request: '*'
      vue: '*'
      vue: 3.5.11
      vue-router: '*'
      xlsx: '*'
      xlsx-style: '*'
@@ -2243,7 +2247,7 @@
      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.8.4)(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)
@@ -2280,7 +2284,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)
@@ -2928,7 +2932,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
@@ -3288,7 +3292,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)
@@ -4042,7 +4046,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
@@ -4055,7 +4059,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:
@@ -4081,7 +4085,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
@@ -4093,60 +4097,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.0.0(react-native@0.76.5)(react@19.0.0):
    resolution: {integrity: sha512-xu1MPvn1i1iKMex4pdnuDXPggHOCoFEFPuV0ICOWxRoYGy+zLmRsmMLoX6VjLgwrFCEfzw+uYubCcbmDiC93QA==}
    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.0
      tuikit-logger: 0.0.4-beta.1
    transitivePeerDependencies:
      - react
      - react-native
    dev: false
  /@tencentcloud/call-uikit-vue2.6@4.0.4(react-native@0.76.5)(react@19.0.0)(vue@3.5.11):
    resolution: {integrity: sha512-QZKJAhNbPPkM3MgN5Aj+KENHhy+dH6J8pZoMBIBlapfJGFnX4QF9uT2kJwZvuBOQH+67JbO55y8TG6j+NDr2ng==}
    dependencies:
      '@tencentcloud/call-engine-js': 3.0.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
      '@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.4(react-native@0.76.5)(react@19.0.0):
    resolution: {integrity: sha512-suCHF5/IIsLgioqIFra7enpjfjKTQoNMDdp4CVJ7ogvecyueR/pzrcCu2o3pR5FpMrvCxIpczWSeQbPx5rnSKQ==}
    dependencies:
      '@tencentcloud/call-engine-js': 3.0.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.4.0
    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.4.0
      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.4(react-native@0.76.5)(react@19.0.0):
    resolution: {integrity: sha512-U7WC1HTr5rYnP2xFmpbOVCqa5ErWUMyDPNRNxSdbdrh4nML27VYqR4FWkGEFnm1+ZL2wVe3eE6W5XpmIlUgwoA==}
    dependencies:
      '@tencentcloud/call-engine-js': 3.0.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.4.0
    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.3
      tim-profanity-filter-plugin: 1.1.0
      tim-upload-plugin: 1.4.2
    transitivePeerDependencies:
      - react
      - react-native
    dev: false
  /@tencentcloud/chat-uikit-engine@2.4.2:
    resolution: {integrity: sha512-L5rr1mO98S1Uz5IndJ2QdGv++5zbSUTnGSz4x3rKx5lWXlcJzSo1RY9DxYcWTKQKos9bG2d4JIIeg4DlfGb+Pg==}
    dependencies:
      '@tencentcloud/chat': 3.5.3
      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):
@@ -4162,11 +4182,11 @@
      '@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/call-uikit-vue': 4.0.4(react-native@0.76.5)(react@19.0.0)
      '@tencentcloud/call-uikit-vue2': 4.0.4(react-native@0.76.5)(react@19.0.0)
      '@tencentcloud/call-uikit-vue2.6': 4.0.4(react-native@0.76.5)(react@19.0.0)(vue@3.5.11)
      '@tencentcloud/chat-uikit-engine': 2.4.2
      '@tencentcloud/tui-core': 2.4.0
      '@tencentcloud/tui-customer-service-plugin': 2.2.6(@tencentcloud/tui-core@2.4.0)(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)
@@ -4191,15 +4211,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.3:
    resolution: {integrity: sha512-1iC9CW+8sMcUtZXjB+97N65uyqRAV73InfKCzXtU/igxPqT8nfzfkrcjhi7JfywaKR3jGC1j8tDpsFNlLepFqQ==}
    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'
@@ -4208,26 +4232,20 @@
      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.3
      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):
  /@tencentcloud/tui-core@2.4.0:
    resolution: {integrity: sha512-OFXHoi8CQlPtWvNRLApg0wonWbW79uoTgAqqffqWO1icx3xDYd2RZDHMzpBexOsE3CHpWokrfXrqiXkpOmYWew==}
    dependencies:
      '@tencentcloud/chat': 3.5.2(react-native@0.76.5)(react@19.0.0)
      '@tencentcloud/chat': 3.5.3
      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):
@@ -4235,19 +4253,19 @@
    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.4.0
      '@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
@@ -5048,7 +5066,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
@@ -5114,7 +5132,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)
@@ -5130,7 +5148,7 @@
    engines: {node: ^18.0.0 || >=20.0.0}
    peerDependencies:
      vite: ^5.0.0
      vue: ^3.2.25
      vue: 3.5.11
    dependencies:
      vite: 5.4.8(@types/node@18.7.18)(sass@1.55.0)(terser@5.34.1)
      vue: 3.5.11(typescript@4.8.4)
@@ -5278,7 +5296,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
@@ -5406,7 +5424,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
@@ -5447,7 +5465,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
@@ -5473,7 +5491,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
@@ -5571,7 +5589,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)
@@ -7966,7 +7984,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==}
@@ -8001,7 +8018,6 @@
    engines: {node: '>= 4'}
    dependencies:
      domelementtype: 2.3.0
    dev: true
  /domutils@1.7.0:
    resolution: {integrity: sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==}
@@ -8023,7 +8039,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==}
@@ -8097,7 +8112,7 @@
  /element-plus@2.8.4(vue@3.5.11):
    resolution: {integrity: sha512-ZlVAdUOoJliv4kW3ntWnnSHMT+u/Os7mXJjk2xzOlqNeHaI2/ozlF+R58ZCEak8ZnDi6+5A2viWEYRsq64IuiA==}
    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)
@@ -9026,6 +9041,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:
@@ -9998,7 +10017,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==}
@@ -10902,7 +10920,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==}
@@ -12209,7 +12226,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==}
@@ -13033,7 +13049,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==}
@@ -13073,7 +13088,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
@@ -13314,7 +13329,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:
@@ -13325,7 +13340,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==}
@@ -13358,7 +13372,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
@@ -13401,7 +13415,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
@@ -13588,7 +13602,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==}
@@ -13618,7 +13631,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==}
@@ -13678,7 +13690,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'
@@ -13701,10 +13713,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:
@@ -13739,7 +13775,6 @@
      nanoid: 3.3.4
      picocolors: 1.0.0
      source-map-js: 1.0.2
    dev: true
  /postcss@8.4.47:
    resolution: {integrity: sha512-56rxCq7G/XfB4EkXq9Egn5GCqugWvDFjafDOThIdMBsI15iqPqR5r15TfSr1YPYeEI19YeaXMCbY6u88Y76GLQ==}
@@ -14800,6 +14835,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'}
@@ -14983,7 +15022,7 @@
      file-saver: '*'
      lodash: '*'
      semver: '*'
      vue: '*'
      vue: 3.5.11
      xlsx: '*'
      xlsx-style: '*'
    dependencies:
@@ -15011,7 +15050,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
@@ -15342,7 +15381,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==}
@@ -15899,7 +15937,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
@@ -16006,7 +16044,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
@@ -16362,6 +16400,12 @@
      trtc-sdk-v5: 5.6.2
    dev: false
  /trtc-cloud-js-sdk@2.9.0:
    resolution: {integrity: sha512-m2gufzg1yqnyPUanLJJXgyPzenRSyH1stK16EDrDINQo1FCPeCmY0kDARF1NiLZJLKm9lUP5DQsrUUKn4LYkPg==}
    dependencies:
      trtc-sdk-v5: 5.9.1
    dev: false
  /trtc-js-sdk@4.15.19:
    resolution: {integrity: sha512-FFVvaji65d7+aq5o4hE+5lamvL1CEolNTPavaN7sRzh8Bb5UdDieBL9jV+lfxCnYpJ5lMi1YJt+EynDPX20Asw==}
    dependencies:
@@ -16370,6 +16414,12 @@
  /trtc-sdk-v5@5.6.2:
    resolution: {integrity: sha512-Ylt9LePeHyet2+hABcDxKSMTRMY6IVukw72yvRXgpRi2iR/sDLFSKtj+i3EeQ/BJZZWSTuyFXbolHpVJMPxgPg==}
    dependencies:
      webrtc-adapter: 8.2.3
    dev: false
  /trtc-sdk-v5@5.9.1:
    resolution: {integrity: sha512-Vzu1UIzIQtQ3zUQHruha1Zh13aXsDsi/edMdwWdpO8URmRraqftsgKxjR8x2GPHd6p4cDreR/wY50xrWu9ZPlw==}
    dependencies:
      webrtc-adapter: 8.2.3
    dev: false
@@ -16450,15 +16500,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.3
      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:
@@ -16851,7 +16902,7 @@
    peerDependencies:
      '@babel/parser': ^7.15.8
      '@nuxt/kit': ^3.2.2
      vue: 2 || 3
      vue: 3.5.11
    peerDependenciesMeta:
      '@babel/parser':
        optional: true
@@ -17342,7 +17393,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
@@ -17357,7 +17408,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
@@ -17369,7 +17420,7 @@
    peerDependencies:
      '@vue/runtime-core': ^3.0.0
      echarts: ^5.5.1
      vue: ^2.7.0 || ^3.1.1
      vue: 3.5.11
    peerDependenciesMeta:
      '@vue/runtime-core':
        optional: true
@@ -17402,7 +17453,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)
@@ -17424,7 +17475,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
@@ -17888,7 +17939,3 @@
  /zwitch@1.0.5:
    resolution: {integrity: sha512-V50KMwwzqJV0NpZIZFwfOD5/lyny3WlSzRiXgA0G7VUnRlqttta1L6UQIHzd6EuBY/cHGfwTIck7w1yH6Q5zUw==}
    dev: false
settings:
  autoInstallPeers: true
  excludeLinksFromLockfile: false
src/components/Layout/ChunkCellV2.vue
New file
@@ -0,0 +1,40 @@
<template>
  <div class="chunk-cell-v2">
    <div class="chunk-cell-v2-title">{{ props.title }}</div>
    <div class="chunk-cell-v2-content"><slot></slot></div>
  </div>
</template>
<script setup lang="ts">
defineOptions({
  name: 'ChunkCellV2',
});
type Props = {
  title?: string;
};
const props = withDefaults(defineProps<Props>(), {
  title: '',
});
</script>
<style lang="scss" scoped>
@use '@/style/common.scss' as *;
.chunk-cell-v2 {
  .chunk-cell-v2-title {
    height: 48px;
    font-size: 16px;
    color: getCssVar('text-color', 'primary');
    line-height: 48px;
  }
  margin-bottom: 24px;
  border-bottom: 1px solid getCssVar('border-color', 'lighter');
  &:last-child {
    margin-bottom: 0;
    border-bottom: none;
  }
}
</style>
src/components/commonView/BatchInfoView.vue
New file
@@ -0,0 +1,78 @@
<template>
  <ProFormCol>
    <ProFormColItem :span="12">
      <ProFormItemV2 label="申报批次号:" prop="applyNo">
        <ProFormText placeholder="请输入申报批次号" v-model.trim="form.categoryName" />
      </ProFormItemV2>
    </ProFormColItem>
    <ProFormColItem :span="12">
      <ProFormItemV2 label="申请奖励金月份:" prop="applyDate">
        <ProFormDatePicker
          v-model="form.categoryName"
          format="YYYY-MM"
          placeholder="请选择月份"
          type="month"
        />
      </ProFormItemV2>
    </ProFormColItem>
    <ProFormColItem :span="12">
      <ProFormItemV2 label="申报园区:" prop="applyParkId">
        <ProFormSelect
          v-model="form.categoryName"
          :valueEnum="[]"
          enumLabelKey="name"
          enum-value-key="userId"
          placeholder="请选择申报园区"
        >
        </ProFormSelect>
      </ProFormItemV2>
    </ProFormColItem>
    <ProFormColItem :span="12">
      <ProFormItemV2 label="园区类型:">
        <ProFormSelect
          v-model="form.categoryName"
          :valueEnum="parkTypeList"
          enumLabelKey="name"
          enum-value-key="id"
        >
        </ProFormSelect>
      </ProFormItemV2>
    </ProFormColItem>
  </ProFormCol>
</template>
<script setup lang="ts">
import {
  ProFormItemV2,
  ProFormCol,
  ProFormColItem,
  ProFormText,
  ProFormDatePicker,
  ProFormSelect,
  ProFormMixinsItemContainer,
} from '@bole-core/components';
import { useAllSearchSettingList } from '@/hooks';
import { SearchType } from '@/constants';
defineOptions({
  name: 'BatchInfoView',
});
type Props = {
  form: {
    categoryName: string;
  };
};
const props = withDefaults(defineProps<Props>(), {});
const { allSearchSettingList: parkTypeList } = useAllSearchSettingList({
  searchType: SearchType.Park,
  enabled: true,
  status: true,
});
</script>
<style lang="scss" scoped>
@use '@/style/common.scss' as *;
</style>
src/components/commonView/DeclareEnterpriseTableView.vue
New file
@@ -0,0 +1,145 @@
<template>
  <ProTableQueryFilterBar @on-reset="reset">
    <template #query>
      <QueryFilterItem>
        <SearchInput
          v-model="extraParamState.title"
          style="width: 250px"
          placeholder="企业名/信用代码"
          @on-click-search="getList"
        >
        </SearchInput>
      </QueryFilterItem>
    </template>
  </ProTableQueryFilterBar>
  <ProTableV2
    v-bind="proTableProps"
    :columns="column"
    :operationBtns="operationBtns"
    :autoHeight="false"
    :tableProps="{
      maxHeight: '400px',
    }"
  >
  </ProTableV2>
  <MateriaDetailDialog v-bind="dialogProps"></MateriaDetailDialog>
</template>
<script setup lang="ts">
import {
  ProTableQueryFilterBar,
  QueryFilterItem,
  ProTableV2,
  SearchInput,
  useFormDialog,
  useTable,
  defineOperationBtns,
  defineColumns,
} from '@bole-core/components';
import MateriaDetailDialog from './MateriaDetailDialog.vue';
import { FourStreamsMaterialFileTableItem } from './types';
import { OrderInputType } from '@bole-core/core';
import * as informationServices from '@/services/api/Information';
defineOptions({
  name: 'DeclareEnterpriseTableView',
});
type Props = {};
const props = withDefaults(defineProps<Props>(), {});
const column = defineColumns([
  {
    id: '1',
    enCode: 'accDateTime',
    name: '交易时间',
  },
  {
    id: '2',
    enCode: 'income',
    name: '收入',
  },
  {
    id: '3',
    enCode: 'outcome',
    name: '支出',
  },
  {
    id: '4',
    enCode: 'acctBalance',
    name: '账户余额',
  },
  {
    id: '5',
    enCode: 'counterpartyAcctNoAndName',
    name: '对方账号/户名',
  },
  {
    id: '6',
    enCode: 'purpose',
    name: '用途',
  },
]);
const operationBtns = defineOperationBtns([
  {
    data: {
      enCode: 'detailBtn',
      name: '详情',
    },
    emits: {
      onClick: (role) => openDialog(role),
    },
  },
]);
const {
  getDataSource: getList,
  proTableProps,
  paginationState,
  extraParamState,
  reset,
} = useTable(
  async ({ pageIndex, pageSize }, extraParamState) => {
    try {
      let params: API.GetInformationForManageInput = {
        pageModel: {
          rows: pageSize,
          page: pageIndex,
          orderInput: extraParamState.orderInput,
        },
        title: extraParamState.title,
      };
      let res = await informationServices.getInformationForManage(params);
      return res;
    } catch (error) {}
  },
  {
    defaultExtraParams: {
      orderInput: [{ property: 'creationTime', order: OrderInputType.Desc }],
      title: '',
    },
  }
);
const { dialogProps, handleEdit, editForm } = useFormDialog({
  defaultFormParams: {
    list: [] as FourStreamsMaterialFileTableItem[],
  },
});
function openDialog(row?: API.IncentivePaymentsManageListOutput) {
  handleEdit({
    list: [],
  });
}
defineExpose({
  getList,
});
</script>
<style lang="scss" scoped>
@use '@/style/common.scss' as *;
</style>
src/components/commonView/DetailView.vue
New file
@@ -0,0 +1,63 @@
<template>
  <ProForm :model="form" label-width="160px" label-position="left" is-read>
    <ChunkCellV2 title="材料审核">
      <BatchInfoView :form="form"></BatchInfoView>
    </ChunkCellV2>
    <ChunkCellV2 title="汇总材料">
      <MaterialInfoView :form="form"></MaterialInfoView>
    </ChunkCellV2>
    <ChunkCellV2 title="汇算材料">
      <SettlementMaterialInfoView :form="form"></SettlementMaterialInfoView>
    </ChunkCellV2>
    <ChunkCellV2 title="申报企业名单" class="chunk-cell-table">
      <slot name="table"> </slot>
    </ChunkCellV2>
    <ChunkCell v-if="hasForm">
      <slot name="form"></slot>
    </ChunkCell>
  </ProForm>
</template>
<script setup lang="ts">
import { ProForm, UploadUserFile, ChunkCell } from '@bole-core/components';
import ChunkCellV2 from '@/components/Layout/ChunkCellV2.vue';
import BatchInfoView from './BatchInfoView.vue';
import MaterialInfoView from './MaterialInfoView.vue';
import SettlementMaterialInfoView from './SettlementMaterialInfoView.vue';
import DeclareEnterpriseTableView from './DeclareEnterpriseTableView.vue';
defineOptions({
  name: 'DetailView',
});
type Props = {
  hasForm?: boolean;
  form?: {
    categoryName: string;
    amount: number;
    url: UploadUserFile[];
  };
};
const props = withDefaults(defineProps<Props>(), {
  hasForm: false,
});
</script>
<style lang="scss" scoped>
@use '@/style/common.scss' as *;
.page-form-layout {
  .el-form {
    padding-bottom: 22px;
  }
  .chunk-cell-table {
    :deep() {
      .chunk-cell-v2-content {
        margin-bottom: 30px;
      }
    }
  }
}
</style>
src/components/commonView/FourStreamsMaterialFileTable.vue
New file
@@ -0,0 +1,179 @@
<template>
  <div>
    <ProTableV2
      :tableData="list"
      :columns="columns"
      :autoHeight="false"
      :operationBtns="operationBtns"
      :operationColumnWidth="240"
      :showTableColumnSetting="false"
    >
      <template #fileBusinessType="{ row }">
        {{ AllEnterpriseMaterialFileBusinessTypeEnumText[row.fileBusinessType] }}
      </template>
      <template #operationBtn-uploadBtn="{ data, row }">
        <BlFileUpload
          v-model:file-url="row.fileList"
          multiple
          :limit="1"
          ref="uploadRef"
          :showTip="false"
          :show-file-list="false"
          class="pro-table-operation-btn upload-style-btn"
        >
          <el-button text type="primary" class="pro-table-operation-btn">上传</el-button>
        </BlFileUpload>
      </template>
    </ProTableV2>
  </div>
</template>
<script setup lang="ts">
import { FourStreamsMaterialFileTableProps, FourStreamsMaterialFileTableItem } from './types';
import {
  ProTableV2,
  defineColumns,
  defineOperationBtns,
  BlFileUpload,
  bolePreview,
} from '@bole-core/components';
import { AllEnterpriseMaterialFileBusinessTypeEnumText } from '@/constants';
import { downloadFileByUrl } from '@/utils';
import { Message, isFileCanPreview } from '@bole-core/core';
defineOptions({
  name: 'FourStreamsMaterialFileTable',
});
const props = withDefaults(defineProps<FourStreamsMaterialFileTableProps>(), {
  showUploadBtn: true,
  showCheckBtn: true,
  showDownloadBtn: true,
  showDeleteBtn: true,
});
const list = defineModel<FourStreamsMaterialFileTableItem[]>('list');
const columns = defineColumns([
  {
    id: '1',
    enCode: 'fileBusinessType',
    name: '材料名称',
  },
]);
const operationBtns = defineOperationBtns([
  {
    data: {
      enCode: 'uploadBtn',
      name: '上传',
    },
    extraProps: {
      hide: (row: FourStreamsMaterialFileTableItem) => {
        if (!props.showUploadBtn) return true;
        let fileList = row?.fileList?.filter?.((item) => item.status === 'success');
        return fileList?.length > 0;
      },
    },
  },
  {
    data: {
      enCode: 'detailBtn',
      name: '查看',
    },
    emits: {
      onClick: (row) => handlePreview(row),
    },
    extraProps: {
      hide: (row: FourStreamsMaterialFileTableItem) => {
        if (!props.showCheckBtn) return true;
        let fileList = row?.fileList?.filter?.((item) => item.status === 'success');
        if (!fileList?.length) {
          return true;
        } else {
          if (fileList.length > 1) {
            return false;
          } else {
            return !isFileCanPreview(fileList[0].path);
          }
        }
      },
    },
  },
  {
    data: {
      enCode: 'downloadBtn',
      name: '下载',
    },
    emits: {
      onClick: (row) => handleBatchDownload(row),
    },
    extraProps: {
      hide: (row: FourStreamsMaterialFileTableItem) => {
        return (
          !props.showDownloadBtn ||
          !row?.fileList?.filter?.((item) => item.status === 'success')?.length
        );
      },
    },
  },
  {
    data: {
      enCode: 'delBtn',
      name: '删除',
    },
    props: {
      type: 'danger',
    },
    emits: {
      onClick: (row) => handleDelete(row),
    },
    extraProps: {
      hide: (row: FourStreamsMaterialFileTableItem) => {
        if (!props.showDeleteBtn) return true;
        let fileList = row?.fileList?.filter?.((item) => item.status === 'success');
        return !fileList?.length;
      },
    },
  },
]);
async function handleDelete(row: FourStreamsMaterialFileTableItem) {
  try {
    await Message.deleteMessage();
    row.fileList = [];
  } catch (error) {}
}
async function handlePreview(row: FourStreamsMaterialFileTableItem) {
  if (row.fileList.length > 1) {
    // currentEnterpriseMaterialFileTableItem.value = row;
    // await nextTick();
    // dialogState.dialogVisible = true;
  } else {
    bolePreview({
      fileUrl: row.fileList[0].url,
    });
  }
}
function handleBatchDownload(row: FourStreamsMaterialFileTableItem) {
  const successFileList = row.fileList.filter((item) => item.status === 'success');
  if (successFileList.length === 0) {
    Message.errorMessage('没有可下载的文件');
    return;
  }
  if (successFileList.length === 1) {
    downloadFileByUrl(successFileList[0].url);
  } else {
    // downloadWithZip(
    //   successFileList.map((item) => ({ data: item.url })),
    //   `${AllEnterpriseMaterialFileBusinessTypeEnumText[row.fileBusinessType]}材料文件`
    // );
  }
}
</script>
<style lang="scss" scoped>
@use '@/style/common.scss' as *;
</style>
src/components/commonView/MateriaDetailDialog.vue
New file
@@ -0,0 +1,46 @@
<template>
  <ProDialog title="材料详情" v-model="visible" destroy-on-close draggable width="800px">
    <FourStreamsMaterialFileTable v-model:list="form.list" v-bind="props" />
    <template #footer>
      <span class="dialog-footer">
        <el-button type="primary" @click="handleConfirm">确 定</el-button>
      </span>
    </template>
  </ProDialog>
</template>
<script setup lang="ts">
import { ProDialog } from '@bole-core/components';
import FourStreamsMaterialFileTable from './FourStreamsMaterialFileTable.vue';
import { FourStreamsMaterialFileTableProps, FourStreamsMaterialFileTableItem } from './types';
defineOptions({
  name: 'MateriaDetailDialog',
});
type Props = FourStreamsMaterialFileTableProps & {};
const props = withDefaults(defineProps<Props>(), {
  showUploadBtn: true,
  showCheckBtn: true,
  showDownloadBtn: true,
  showDeleteBtn: true,
});
const visible = defineModel({ type: Boolean });
type Form = {
  list: FourStreamsMaterialFileTableItem[];
};
const form = defineModel<Form>('form');
const emit = defineEmits<{
  (e: 'onConfirm'): void;
  (e: 'onCancel'): void;
}>();
function handleConfirm() {
  emit('onConfirm');
}
</script>
src/components/commonView/MaterialInfoView.vue
New file
@@ -0,0 +1,42 @@
<template>
  <ProFormCol>
    <ProFormColItem :span="12">
      <ProFormItemV2 label="企业缴税明细汇总表:" prop="link">
        <ProFormUpload v-model:file-url="form.url"></ProFormUpload>
      </ProFormItemV2>
    </ProFormColItem>
  </ProFormCol>
  <ProFormCol>
    <ProFormColItem :span="12">
      <ProFormItemV2 label="企业营收汇总表:" prop="link">
        <ProFormUpload v-model:file-url="form.url"></ProFormUpload>
      </ProFormItemV2>
    </ProFormColItem>
  </ProFormCol>
</template>
<script setup lang="ts">
import {
  ProFormCol,
  ProFormColItem,
  ProFormItemV2,
  ProFormUpload,
  UploadUserFile,
} from '@bole-core/components';
defineOptions({
  name: 'MaterialInfoView',
});
type Props = {
  form: {
    url: UploadUserFile[];
  };
};
const props = withDefaults(defineProps<Props>(), {});
</script>
<style lang="scss" scoped>
@use '@/style/common.scss' as *;
</style>
src/components/commonView/SettlementMaterialInfoView.vue
New file
@@ -0,0 +1,51 @@
<template>
  <ProFormCol>
    <ProFormColItem :span="12">
      <ProFormItemV2 label="本次申报奖励金总额:" prop="link">
        <ProFormInputNumber v-model="form.amount" unit="元" />
      </ProFormItemV2>
    </ProFormColItem>
  </ProFormCol>
  <ProFormCol>
    <ProFormColItem :span="12">
      <ProFormItemV2 label="奖励金分配明细表:" prop="link">
        <ProFormUpload v-model:file-url="form.url"></ProFormUpload>
      </ProFormItemV2>
    </ProFormColItem>
  </ProFormCol>
  <ProFormCol>
    <ProFormColItem :span="12">
      <ProFormItemV2 label="奖励金汇总表:" prop="link">
        <ProFormUpload v-model:file-url="form.url"></ProFormUpload>
      </ProFormItemV2>
    </ProFormColItem>
  </ProFormCol>
</template>
<script setup lang="ts">
import {
  ProFormCol,
  ProFormColItem,
  ProFormItemV2,
  ProFormUpload,
  UploadUserFile,
  ProFormInputNumber,
} from '@bole-core/components';
defineOptions({
  name: 'SettlementMaterialInfoView',
});
type Props = {
  form: {
    amount: number;
    url: UploadUserFile[];
  };
};
const props = withDefaults(defineProps<Props>(), {});
</script>
<style lang="scss" scoped>
@use '@/style/common.scss' as *;
</style>
src/components/commonView/types.ts
New file
@@ -0,0 +1,14 @@
import { EnterpriseMaterialFileBusinessTypeEnum } from '@/constants';
import { UploadUserFile } from '@bole-core/components';
export type FourStreamsMaterialFileTableProps = {
  showUploadBtn?: boolean;
  showCheckBtn?: boolean;
  showDownloadBtn?: boolean;
  showDeleteBtn?: boolean;
};
export type FourStreamsMaterialFileTableItem = {
  fileBusinessType: EnterpriseMaterialFileBusinessTypeEnum;
  fileList: (API.AddEnterpriseMaterialFileInput & UploadUserFile)[];
};
src/constants/dic.ts
New file
@@ -0,0 +1,43 @@
export enum SearchType {
  Hot = 10,
  Service = 20,
  Work = 30,
  Park = 40,
  Info = 50,
  Policy = 60,
  RegionalManagement = 70,
  ProductType = 80,
  DemandType = 90,
  DemandRange = 100,
  EmployeeBenefits = 110,
  CompanyIndustry = 120,
  HeadHunterPosition = 130,
  ConsultationCategory = 140,
  FAQCategory = 150,
  IndustryCategory = 160,
  FirstPartyIndustry = 170,
  MatingServiceType = 180,
  IndustryBodyType = 190,
}
export const SearchTypeText = {
  [SearchType.Hot]: '热搜词',
  [SearchType.Service]: '服务类型',
  [SearchType.Work]: '工种',
  [SearchType.Park]: '园区类型',
  [SearchType.Info]: '资讯活动类型',
  [SearchType.Policy]: '政策颁布机构',
  [SearchType.RegionalManagement]: '区域管理',
  [SearchType.ProductType]: '产品类型',
  [SearchType.DemandType]: '需求类型',
  [SearchType.DemandRange]: '需求范围',
  [SearchType.EmployeeBenefits]: '员工福利',
  [SearchType.CompanyIndustry]: '公司行业',
  [SearchType.HeadHunterPosition]: '猎头职位',
  [SearchType.ConsultationCategory]: '咨询类别',
  [SearchType.FAQCategory]: '问题分类',
  [SearchType.IndustryCategory]: '行业类别',
  [SearchType.FirstPartyIndustry]: '甲方行业',
  [SearchType.MatingServiceType]: '配套服务类型',
  [SearchType.IndustryBodyType]: '行业机构类型',
};
src/constants/enterpriseMaterial.ts
New file
@@ -0,0 +1,111 @@
export enum EnterpriseMaterialTypeEnum {
  /**
   *  四流合一
   */
  FourStreams = 10,
  /**
   *  完税材料
   */
  Dutiable = 11,
  /**
   *  其它材料
   */
  Other = 20,
}
export const EnterpriseMaterialTypeEnumText = {
  [EnterpriseMaterialTypeEnum.FourStreams]: '四流合一',
  [EnterpriseMaterialTypeEnum.Dutiable]: '完税材料',
  [EnterpriseMaterialTypeEnum.Other]: '其它材料',
};
/**
 * 0-199为四流材料 200-300为完税材料
 */
export enum EnterpriseMaterialFileBusinessTypeEnum {
  /**
   * 工资表
   */
  PayRoll = 10,
  /**
   * 银行流水
   */
  BankFlow = 20,
  /**
   * 人员信息表
   */
  Information = 30,
  /**
   * 工资薪金所得
   */
  Salary = 40,
  /**
   * 代发明细
   */
  DistributionDetails = 50,
  /**
   * 发票
   */
  Invoice = 60,
  /**
   * 劳动合同
   */
  LaborContract = 70,
  /**
   * 业务合同
   */
  BussinessContract = 80,
  /**
   * 劳动合同汇总表
   */
  LaborContractSummary = 90,
  /**
   * 离职证明
   */
  LeavingCertificate = 100,
  /**
   * 开票明细表
   */
  InvoicingSchedule = 110,
  /**
   * 所得税证明
   */
  IncomeTaxCertificate = 200,
  /**
   * 增值及附加税证明
   */
  AdditionalTaxCertificate = 210,
  /**
   * 开票明细文件
   */
  BillingDetails = 220,
  /**
   * 其他材料
   */
  Other = 999,
}
export const EnterpriseMaterialFileBusinessTypeEnumText = {
  [EnterpriseMaterialFileBusinessTypeEnum.PayRoll]: '工资表',
  [EnterpriseMaterialFileBusinessTypeEnum.BankFlow]: '银行流水',
  [EnterpriseMaterialFileBusinessTypeEnum.Information]: '人员信息表',
  [EnterpriseMaterialFileBusinessTypeEnum.Salary]: '工资薪金所得',
  [EnterpriseMaterialFileBusinessTypeEnum.DistributionDetails]: '代发明细',
  [EnterpriseMaterialFileBusinessTypeEnum.Invoice]: '发票',
  [EnterpriseMaterialFileBusinessTypeEnum.LaborContract]: '劳动合同',
  [EnterpriseMaterialFileBusinessTypeEnum.BussinessContract]: '业务合同',
  [EnterpriseMaterialFileBusinessTypeEnum.LaborContractSummary]: '劳动合同汇总表',
  [EnterpriseMaterialFileBusinessTypeEnum.LeavingCertificate]: '离职证明',
  [EnterpriseMaterialFileBusinessTypeEnum.InvoicingSchedule]: '开票明细表',
};
export const DutiableFileBusinessTypeEnumText = {
  [EnterpriseMaterialFileBusinessTypeEnum.IncomeTaxCertificate]: '所得税证明',
  [EnterpriseMaterialFileBusinessTypeEnum.AdditionalTaxCertificate]: '增值及附加税证明',
  [EnterpriseMaterialFileBusinessTypeEnum.BillingDetails]: '开票明细文件',
};
export const AllEnterpriseMaterialFileBusinessTypeEnumText = {
  ...EnterpriseMaterialFileBusinessTypeEnumText,
  ...DutiableFileBusinessTypeEnumText,
};
src/constants/index.ts
@@ -9,3 +9,5 @@
export * from './menu';
export * from './role';
export * from './app';
export * from './dic';
export * from './enterpriseMaterial';
src/hooks/dic.ts
New file
@@ -0,0 +1,131 @@
import * as searchSettingServices from '@/services/api/SearchSetting';
import { useQuery } from '@tanstack/vue-query';
import { useQueryClient } from '@tanstack/vue-query';
import { SearchType } from '@/constants';
type UseSearchSettingTypeOptions = {
  searchType: number;
  belongType?: number;
  /**
   * @deprecated
   */
  isSelf?: boolean;
  onSuccess?: (data: API.GetTypeSearchSettingList[]) => any;
};
export function useSearchSettingType({
  searchType,
  belongType = null,
  onSuccess,
  isSelf,
}: UseSearchSettingTypeOptions) {
  const { data, refetch } = useQuery({
    queryKey: [
      'searchSettingServices/getTypeSearchSettingList',
      { searchType, belongType, isSelf },
    ],
    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,
  };
}
type UseAllSearchSettingList = API.GetSearchSettingListInput & {
  enabled?: boolean | Ref<boolean>;
};
export function useAllSearchSettingList(options: UseAllSearchSettingList) {
  const { enabled = true, ...params } = options;
  const { data: allSearchSettingList } = useQuery({
    queryKey: ['searchSettingServices/getSearchSettingDto', params],
    queryFn: async () => {
      return await searchSettingServices.getAllSearchSettingList(params, { showLoading: false });
    },
    initialData: () => [] as API.GetSearchSettingList[],
    enabled,
  });
  return {
    allSearchSettingList,
  };
}
type UseWorkOfTypeOptions = {
  enabled?: boolean | Ref<boolean>;
};
export function useWorkOfType(options: UseWorkOfTypeOptions = {}) {
  const { enabled = true } = options;
  const { allSearchSettingList: industryCategoryList } = useAllSearchSettingList({
    searchType: SearchType.IndustryCategory,
    enabled,
    status: true,
  });
  const { allSearchSettingList: flattenWorkOfTypeList } = useAllSearchSettingList({
    searchType: SearchType.Work,
    enabled,
    status: true,
  });
  const workOfTypeList = computed<API.GetSearchSettingList[]>(() => {
    if (industryCategoryList.value?.length > 0) {
      let list = [];
      industryCategoryList.value.forEach((x) => {
        list.push({
          ...x,
          children: flattenWorkOfTypeList.value.filter((w) => w.parentId === x.id),
        });
      });
      return list;
    }
    return [];
  });
  function getWorkOfTypeNameById(id: string) {
    return flattenWorkOfTypeList.value.find((x) => x.id === id)?.name ?? '';
  }
  const MaxSelectWorkOfTypeLimit = 6;
  return {
    workOfTypeList: workOfTypeList,
    flattenWorkOfTypeList,
    getWorkOfTypeNameById,
    MaxSelectWorkOfTypeLimit,
  };
}
src/hooks/index.ts
@@ -6,3 +6,4 @@
export * from './useEvent';
export * from './useUser';
export * from './help';
export * from './dic';
src/views/MaterialReview/MaterialReviewAudit.vue
@@ -1,11 +1,130 @@
<template>
  <div>MaterialReviewAudit</div>
  <LoadingLayout>
    <AppContainer>
      <PageFormLayout title="材料审核">
        <DetailView :form="state.detail" :has-form="true">
          <template #table>
            <DeclareEnterpriseTableView ref="tableRef"></DeclareEnterpriseTableView>
          </template>
          <template #form>
            <ProForm :model="state.form" ref="formRef" label-width="120px">
              <ProFormCol>
                <ProFormColItem :span="12">
                  <ProFormItemV2
                    label="申报审核:"
                    prop="status"
                    :check-rules="[{ message: '请选择审核状态' }]"
                  >
                    <ProFormRadio v-model="state.form.status" :value-enum="DataRangeEnumText" />
                  </ProFormItemV2>
                </ProFormColItem>
              </ProFormCol>
              <ProFormCol>
                <ProFormColItem>
                  <ProFormItemV2 label="驳回原因:" prop="remark">
                    <ProFormTextArea
                      v-model="state.form.remark"
                      placeholder="请输入"
                      show-word-limit
                      :maxlength="200"
                    ></ProFormTextArea>
                  </ProFormItemV2>
                </ProFormColItem>
              </ProFormCol>
            </ProForm>
          </template>
        </DetailView>
        <template #footer>
          <el-button @click="handleBack">关闭</el-button>
          <el-button type="primary" @click="handleConfirm()">提交</el-button>
        </template>
      </PageFormLayout>
    </AppContainer>
  </LoadingLayout>
</template>
<script setup lang="ts">
import {
  AppContainer,
  ProForm,
  ProFormCol,
  ProFormColItem,
  ProFormItemV2,
  ProFormTextArea,
  ProFormRadio,
  LoadingLayout,
  UploadUserFile,
  PageFormLayout,
} from '@bole-core/components';
import { DataRangeEnum, DataRangeEnumText } from '@/constants';
import DetailView from '@/components/commonView/DetailView.vue';
import DeclareEnterpriseTableView from '@/components/commonView/DeclareEnterpriseTableView.vue';
import { useQuery } from '@tanstack/vue-query';
import * as informationServices from '@/services/api/Information';
import { convertApi2FormUrlOnlyOne } from '@/utils';
import { useRouteView } from '@/hooks';
import { FormInstance } from 'element-plus';
defineOptions({
  name: 'MaterialReviewAudit',
});
const route = useRoute();
const { closeViewPush } = useRouteView();
const id = route.params?.id as string;
const state = reactive({
  detail: {
    categoryName: '',
    amount: 0,
    url: [] as UploadUserFile[],
  },
  form: {
    status: '' as any as DataRangeEnum,
    remark: '',
  },
});
const tableRef = ref<InstanceType<typeof DeclareEnterpriseTableView>>();
const { data: detail, isLoading } = useQuery({
  queryKey: ['informationServices/getInformationShowDetail', id],
  queryFn: async () => {
    return await informationServices.getInformationShowDetail(
      { id: id },
      {
        showLoading: false,
      }
    );
  },
  placeholderData: () => ({} as API.InformationShowDetailDto),
  onSuccess(data) {
    state.detail.categoryName = data.categoryName;
    state.detail.amount = data.attentionCount;
    state.detail.url = convertApi2FormUrlOnlyOne(data.avatarUrl);
    tableRef.value?.getList();
  },
});
function handleBack() {
  closeViewPush(route, {
    name: 'MaterialReviewList',
  });
}
const formRef = ref<FormInstance>();
function handleConfirm() {
  if (!formRef.value) return;
  formRef.value.validate((valid) => {
    if (valid) {
      confirm();
    } else {
      return;
    }
  });
}
function confirm() {}
</script>
<style lang="scss" scoped>
src/views/MaterialReview/MaterialReviewDetail.vue
@@ -1,13 +1,99 @@
<template>
  <div>MaterialReviewDetail</div>
  <LoadingLayout>
    <AppContainer>
      <PageFormLayout>
        <template #title>
          <div class="page-form-layout-title">
            <div>
              申报详情
              <span class="page-form-layout-title-item status">
                {{ `审核状态:${state.detail.categoryName}` }}
              </span>
              <span class="page-form-layout-title-item remark">
                {{ `审核未通过原因:${state.detail.categoryName}` }}
              </span>
            </div>
          </div>
        </template>
        <DetailView :form="state.detail">
          <template #table>
            <DeclareEnterpriseTableView ref="tableRef"></DeclareEnterpriseTableView>
          </template>
        </DetailView>
        <template #footer>
          <el-button @click="handleBack">关闭</el-button>
        </template>
      </PageFormLayout>
    </AppContainer>
  </LoadingLayout>
</template>
<script setup lang="ts">
import { AppContainer, LoadingLayout, UploadUserFile, PageFormLayout } from '@bole-core/components';
import { DataRangeEnum } from '@/constants';
import DetailView from '@/components/commonView/DetailView.vue';
import DeclareEnterpriseTableView from '@/components/commonView/DeclareEnterpriseTableView.vue';
import { useQuery } from '@tanstack/vue-query';
import * as informationServices from '@/services/api/Information';
import { convertApi2FormUrlOnlyOne } from '@/utils';
import { useRouteView } from '@/hooks';
defineOptions({
  name: 'MaterialReviewDetail',
});
const route = useRoute();
const { closeViewPush } = useRouteView();
const id = route.params?.id as string;
const state = reactive({
  detail: {
    categoryName: '',
    amount: 0,
    url: [] as UploadUserFile[],
  },
});
const tableRef = ref<InstanceType<typeof DeclareEnterpriseTableView>>();
const { data: detail, isLoading } = useQuery({
  queryKey: ['informationServices/getInformationShowDetail', id],
  queryFn: async () => {
    return await informationServices.getInformationShowDetail(
      { id: id },
      {
        showLoading: false,
      }
    );
  },
  placeholderData: () => ({} as API.InformationShowDetailDto),
  onSuccess(data) {
    state.detail.categoryName = data.categoryName;
    state.detail.amount = data.attentionCount;
    state.detail.url = convertApi2FormUrlOnlyOne(data.avatarUrl);
    tableRef.value?.getList();
  },
});
function handleBack() {
  closeViewPush(route, {
    name: 'MaterialReviewList',
  });
}
</script>
<style lang="scss" scoped>
@use '@/style/common.scss' as *;
.page-form-layout-title-item {
  margin-left: 16px;
  font-size: 16px;
  &.remark {
    flex: 1;
    min-width: 0;
    @include utils-ellipsis;
  }
}
</style>
src/views/Reward/RewardDeclareDetail.vue
@@ -1,11 +1,71 @@
<template>
  <div>RewardDeclareDetail</div>
  <LoadingLayout>
    <AppContainer>
      <PageFormLayout title="申报详情">
        <DetailView :form="state.detail">
          <template #table>
            <DeclareEnterpriseTableView ref="tableRef"></DeclareEnterpriseTableView>
          </template>
        </DetailView>
        <template #footer>
          <el-button @click="handleBack">关闭</el-button>
        </template>
      </PageFormLayout>
    </AppContainer>
  </LoadingLayout>
</template>
<script setup lang="ts">
import { AppContainer, LoadingLayout, UploadUserFile, PageFormLayout } from '@bole-core/components';
import DetailView from '@/components/commonView/DetailView.vue';
import DeclareEnterpriseTableView from '@/components/commonView/DeclareEnterpriseTableView.vue';
import { useQuery } from '@tanstack/vue-query';
import * as informationServices from '@/services/api/Information';
import { convertApi2FormUrlOnlyOne } from '@/utils';
import { useRouteView } from '@/hooks';
defineOptions({
  name: 'RewardDeclareDetail',
});
const route = useRoute();
const { closeViewPush } = useRouteView();
const id = route.params?.id as string;
const state = reactive({
  detail: {
    categoryName: '',
    amount: 0,
    url: [] as UploadUserFile[],
  },
});
const tableRef = ref<InstanceType<typeof DeclareEnterpriseTableView>>();
const { data: detail, isLoading } = useQuery({
  queryKey: ['informationServices/getInformationShowDetail', id],
  queryFn: async () => {
    return await informationServices.getInformationShowDetail(
      { id: id },
      {
        showLoading: false,
      }
    );
  },
  placeholderData: () => ({} as API.InformationShowDetailDto),
  onSuccess(data) {
    state.detail.categoryName = data.categoryName;
    state.detail.amount = data.attentionCount;
    state.detail.url = convertApi2FormUrlOnlyOne(data.avatarUrl);
    tableRef.value?.getList();
  },
});
function handleBack() {
  closeViewPush(route, {
    name: 'RewardGrant',
  });
}
</script>
<style lang="scss" scoped>