Browse Source

Merge branch 'sit' into v3.0

snow 10 months ago
parent
commit
33c89f496c
65 changed files with 2486 additions and 645 deletions
  1. 8 7
      .env.development
  2. 2 2
      .env.v3_sit
  3. 4 1
      .gitignore
  4. BIN
      dist-zip/build.zip
  5. 2 1
      package.json
  6. 496 305
      pnpm-lock.yaml
  7. 19 7
      src/components/PageContent/src/hooks/use-request.ts
  8. 3 2
      src/components/ReconciliationForm/src/cpns/batch-mode.vue
  9. 3 0
      src/components/ReconciliationForm/src/cpns/purchase-modal.vue
  10. 2 0
      src/components/ReconciliationForm/src/cpns/purchase-table.vue
  11. 2 1
      src/components/ReconciliationForm/src/cpns/single-mode.vue
  12. 22 12
      src/components/ReconciliationForm/src/index.vue
  13. 1 0
      src/layout/components/help-modal.vue
  14. 1 1
      src/layout/components/navbar.vue
  15. 1 0
      src/layout/index.vue
  16. 1 0
      src/utils/details/_purchase/index.ts
  17. 222 4
      src/utils/details/_purchase/porder.ts
  18. 11 3
      src/utils/status.ts
  19. 18 0
      src/views/InvoiceSaleSettings/_component/execl-files-upload/index.vue
  20. 18 0
      src/views/InvoiceSaleSettings/_component/procure-import/index.vue
  21. 10 4
      src/views/InvoiceSaleSettings/commodityCost/config/configs.ts
  22. 1 1
      src/views/InvoiceSaleSettings/commodityCost/index.vue
  23. 215 0
      src/views/InvoiceSaleSettings/consultingChildCost/config/configs.ts
  24. 147 0
      src/views/InvoiceSaleSettings/consultingChildCost/config/content.config.ts
  25. 40 0
      src/views/InvoiceSaleSettings/consultingChildCost/config/modal.config.ts
  26. 45 0
      src/views/InvoiceSaleSettings/consultingChildCost/config/search.config.ts
  27. 34 0
      src/views/InvoiceSaleSettings/consultingChildCost/detail.vue
  28. 192 0
      src/views/InvoiceSaleSettings/consultingChildCost/index.vue
  29. 10 5
      src/views/InvoiceSaleSettings/consultingCost/config/configs.ts
  30. 1 1
      src/views/InvoiceSaleSettings/consultingCost/config/content.config.ts
  31. 9 9
      src/views/InvoiceSaleSettings/consultingCost/index.vue
  32. 1 1
      src/views/InvoiceSales/capitalClaim/config/configs.ts
  33. 2 4
      src/views/InvoiceSales/capitalClaim/index.vue
  34. 20 6
      src/views/purchase/porder/components/purchase-modal.vue
  35. 5 0
      src/views/purchase/porder/config/content.config.ts
  36. 1 5
      src/views/purchase/porder/index.vue
  37. 32 62
      src/views/purchase/purchPay/component/choose-modal.vue
  38. 5 0
      src/views/purchase/purchPay/config/_details.ts
  39. 22 2
      src/views/purchase/purchPayRelive/component/choose-modal.vue
  40. 5 0
      src/views/purchase/purchPayRelive/config/_details.ts
  41. 16 0
      src/views/purchase/ticketReturn/components/choose-modal.vue
  42. 5 0
      src/views/purchase/ticketReturn/config/_details.ts
  43. 30 63
      src/views/purchase/ticketReturnRelive/components/choose-modal.vue
  44. 5 0
      src/views/purchase/ticketReturnRelive/config/_details.ts
  45. 34 65
      src/views/supply/purchPay/component/choose-modal.vue
  46. 5 0
      src/views/supply/purchPay/config/_details.ts
  47. 27 55
      src/views/supply/purchPayRelive/component/choose-modal.vue
  48. 5 0
      src/views/supply/purchPayRelive/config/_details.ts
  49. 19 3
      src/views/supply/ticketReturn/components/choose-modal.vue
  50. 5 0
      src/views/supply/ticketReturn/config/_details.ts
  51. 18 1
      src/views/supply/ticketReturnRelive/components/choose-modal.vue
  52. 5 0
      src/views/supply/ticketReturnRelive/config/_details.ts
  53. 22 0
      src/views/supplyInvoiceSaleSettings/_component/execl-files-upload/index.vue
  54. 21 0
      src/views/supplyInvoiceSaleSettings/_component/procure-import/index.vue
  55. 216 0
      src/views/supplyInvoiceSaleSettings/supplyConsultingChildCost/config/configs.ts
  56. 140 0
      src/views/supplyInvoiceSaleSettings/supplyConsultingChildCost/config/content.config.ts
  57. 40 0
      src/views/supplyInvoiceSaleSettings/supplyConsultingChildCost/config/modal.config.ts
  58. 33 0
      src/views/supplyInvoiceSaleSettings/supplyConsultingChildCost/config/search.config.ts
  59. 34 0
      src/views/supplyInvoiceSaleSettings/supplyConsultingChildCost/detail.vue
  60. 140 0
      src/views/supplyInvoiceSaleSettings/supplyConsultingChildCost/index.vue
  61. 10 4
      src/views/supplyInvoiceSaleSettings/supplyConsultingCost/config/configs.ts
  62. 1 1
      src/views/supplyInvoiceSaleSettings/supplyConsultingCost/config/content.config.ts
  63. 10 4
      src/views/supplyInvoiceSaleSettings/supplyModifyRecord/config/configs.ts
  64. 1 1
      src/views/system/menuOperator/components/edit-dialog.vue
  65. 11 2
      vite.config.ts

+ 8 - 7
.env.development

@@ -16,18 +16,16 @@ VITE_APP_ID = "ww6076e6fd4268ee31"
 # 微信开发环境基础重定向url
 REDIRECT_BASE_URL = "http://cxinv.api.caixiao365.com"
 # 开发环境后端用户地址
-VITE_PROXY_USER_REAL1 = "http://user.api.caixiao365.com"
+VITE_PROXY_USER_REAL1 = "http://user.test241.wanyuhengtong.com"
 # 开发环境后端用户地址
-VITE_PROXY_USER_REAL = "http://cxinv.api.caixiao365.com"
+VITE_PROXY_USER_REAL = "http://stockinv.test241.wanyuhengtong.com"
 # 开发环境后端业务地址
-VITE_PROXY_DOMAIN_REAL = "http://cxinv.api.caixiao365.com"
+VITE_PROXY_DOMAIN_REAL = "http://stockinv.test241.wanyuhengtong.com"
 
 VITE_IS_PROD = true
 
-# 跳转采销地址
-VITE_PURCHASE_URL = 'http://pin.caixiao365.com/'
-# 跳转工单地址
-VITE_GD_URL = 'http://bug.caixiao365.com/'
+# 跳转结算地址
+VITE_PURCHASE_URL = 'http://webstock3.test241.wanyuhengtong.com/'
 
 # 报表地址
 VITE_DASHBOARD_URL = 'http://web.report.caixiao365.com/'
@@ -35,3 +33,6 @@ VITE_DASHBOARD_URL = 'http://web.report.caixiao365.com/'
 # token密钥
 VITE_SECRET_KEY = 'key123'
 
+
+# 跳转工单地址
+VITE_GD_URL = 'http//bugweb.test241.wanyuhengtong.com/'

+ 2 - 2
.env.v3_sit

@@ -25,7 +25,7 @@ VITE_PROXY_DOMAIN_REAL = "http://stockinv.test241.wanyuhengtong.com"
 VITE_IS_PROD = true
 
 # 跳转结算地址
-VITE_PURCHASE_URL = 'http://pin.caixiao365.com/'
+VITE_PURCHASE_URL = 'http://webstock3.test241.wanyuhengtong.com/'
 
 # 报表地址
 VITE_DASHBOARD_URL = 'http://web.report.caixiao365.com/'
@@ -35,4 +35,4 @@ VITE_SECRET_KEY = 'key123'
 
 
 # 跳转工单地址
-VITE_GD_URL = 'http://bug.caixiao365.com/'
+VITE_GD_URL = 'http//bugweb.test241.wanyuhengtong.com/'

+ 4 - 1
.gitignore

@@ -1,6 +1,9 @@
 node_modules
 .DS_Store
-# dist
+dist
+./dist/**
+
+/dist/assets
 
 
 dist-ssr

BIN
dist-zip/build.zip


+ 2 - 1
package.json

@@ -5,7 +5,7 @@
   "scripts": {
     "dev": "cross-env --max_old_space_size=4096 vite",
     "serve": "pnpm dev",
-    "build": "rimraf dist && cross-env vite build --mode development",
+    "build": "rimraf dist && rimraf dist-zip && cross-env vite build --mode development",
     "build:staging": "rimraf dist && cross-env vite build --mode staging",
     "build:prod": "rimraf dist && cross-env vite build --mode production",
     "report": "rimraf dist && cross-env vite build",
@@ -149,6 +149,7 @@
     "vite-plugin-optimize-persist": "^0.1.2",
     "vite-plugin-package-config": "^0.1.1",
     "vite-plugin-remove-console": "^1.0.4",
+    "vite-plugin-zip-pack": "^1.2.2",
     "vite-svg-loader": "^3.3.0",
     "vue-eslint-parser": "^8.2.0"
   },

+ 496 - 305
pnpm-lock.yaml

@@ -105,6 +105,7 @@ specifiers:
   vite-plugin-optimize-persist: ^0.1.2
   vite-plugin-package-config: ^0.1.1
   vite-plugin-remove-console: ^1.0.4
+  vite-plugin-zip-pack: ^1.2.2
   vite-svg-loader: ^3.3.0
   vue: ^3.2.37
   vue-eslint-parser: ^8.2.0
@@ -239,6 +240,7 @@ devDependencies:
   vite-plugin-optimize-persist: 0.1.2_pkkqgkwmjllbcfn4stitutuwe4
   vite-plugin-package-config: 0.1.1_vite@2.9.15
   vite-plugin-remove-console: 1.3.0
+  vite-plugin-zip-pack: registry.npmmirror.com/vite-plugin-zip-pack/1.2.2_vite@2.9.15
   vite-svg-loader: 3.6.0
   vue-eslint-parser: 8.3.0_eslint@8.36.0
 
@@ -349,7 +351,7 @@ packages:
       '@babel/core': 7.21.3
       '@babel/helper-validator-option': 7.21.0
       browserslist: 4.21.5
-      lru-cache: 5.1.1
+      lru-cache: registry.npmmirror.com/lru-cache/5.1.1
       semver: 6.3.0
     dev: true
 
@@ -636,7 +638,7 @@ packages:
     engines: {node: '>=v12'}
     dependencies:
       '@commitlint/types': 13.2.0
-      lodash: 4.17.21
+      lodash: registry.npmmirror.com/lodash/4.17.21
     dev: true
 
   /@commitlint/execute-rule/13.2.0:
@@ -680,7 +682,7 @@ packages:
       '@endemolshinegroup/cosmiconfig-typescript-loader': 3.0.2_prdn7pc7mycjsinmi5fnyv4we4
       chalk: 4.1.2
       cosmiconfig: 7.1.0
-      lodash: 4.17.21
+      lodash: registry.npmmirror.com/lodash/4.17.21
       resolve-from: 5.0.0
       typescript: 4.9.5
     dev: true
@@ -714,7 +716,7 @@ packages:
     engines: {node: '>=v12'}
     dependencies:
       import-fresh: 3.3.0
-      lodash: 4.17.21
+      lodash: registry.npmmirror.com/lodash/4.17.21
       resolve-from: 5.0.0
       resolve-global: 1.0.0
     dev: true
@@ -786,15 +788,6 @@ packages:
       - typescript
     dev: true
 
-  /@esbuild/linux-loong64/0.14.54:
-    resolution: {integrity: sha512-bZBrLAIX1kpWelV0XemxBZllyRmM6vgFQQG2GdNb+r3Fkp0FOh1NJSvekXDs7jq70k4euu1cryLMfU+mTXlEpw==}
-    engines: {node: '>=12'}
-    cpu: [loong64]
-    os: [linux]
-    requiresBuild: true
-    dev: true
-    optional: true
-
   /@eslint-community/eslint-utils/4.4.0_eslint@8.36.0:
     resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==}
     engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
@@ -821,7 +814,7 @@ packages:
       ignore: 5.2.4
       import-fresh: 3.3.0
       js-yaml: 4.1.0
-      minimatch: 3.1.2
+      minimatch: registry.npmmirror.com/minimatch/3.1.2
       strip-json-comments: 3.1.1
     transitivePeerDependencies:
       - supports-color
@@ -853,7 +846,7 @@ packages:
     dependencies:
       '@humanwhocodes/object-schema': 1.2.1
       debug: 4.3.4
-      minimatch: 3.1.2
+      minimatch: registry.npmmirror.com/minimatch/3.1.2
     transitivePeerDependencies:
       - supports-color
     dev: true
@@ -1095,10 +1088,6 @@ packages:
       nanopop: 2.2.0
     dev: false
 
-  /@sxzz/popperjs-es/2.11.7:
-    resolution: {integrity: sha512-Ccy0NlLkzr0Ex2FKvh2X+OyERHXJ88XJ1MXtsI9y9fGexlaXaVTPzBCRBwIxFkORuOb+uBqeu+RqnpgYTEZRUQ==}
-    dev: false
-
   /@transloadit/prettier-bytes/0.0.7:
     resolution: {integrity: sha512-VeJbUb0wEKbcwaSlj5n+LscBl9IPgLPkHVGBkh00cztv6X4L/TJXK58LzFuBKX7/GAfiGhIwH67YTLTlzvIzBA==}
     dev: false
@@ -2048,7 +2037,7 @@ packages:
       dayjs: 1.11.7
       dom-align: 1.12.4
       dom-scroll-into-view: 2.0.1
-      lodash: 4.17.21
+      lodash: registry.npmmirror.com/lodash/4.17.21
       lodash-es: 4.17.21
       resize-observer-polyfill: 1.5.1
       scroll-into-view-if-needed: 2.2.31
@@ -2301,7 +2290,7 @@ packages:
       normalize-path: 3.0.0
       readdirp: 3.6.0
     optionalDependencies:
-      fsevents: 2.3.2
+      fsevents: registry.npmmirror.com/fsevents/2.3.2
     dev: true
 
   /clean-stack/2.2.0:
@@ -2469,7 +2458,7 @@ packages:
     dependencies:
       is-text-path: 1.0.1
       JSONStream: 1.3.5
-      lodash: 4.17.21
+      lodash: registry.npmmirror.com/lodash/4.17.21
       meow: 8.1.2
       split2: 3.2.2
       through2: 4.0.2
@@ -2905,7 +2894,7 @@ packages:
       '@ctrl/tinycolor': 3.6.0
       '@element-plus/icons-vue': 2.1.0_vue@3.2.47
       '@floating-ui/dom': 1.2.5
-      '@popperjs/core': /@sxzz/popperjs-es/2.11.7
+      '@popperjs/core': registry.npmmirror.com/@sxzz/popperjs-es/2.11.7
       '@types/lodash': 4.14.191
       '@types/lodash-es': 4.17.7
       '@vueuse/core': 9.13.0_vue@3.2.47
@@ -2935,12 +2924,6 @@ packages:
     resolution: {integrity: sha512-ucAnuBEhUK4boH2HjVYG5Q2mQyPorvv0u/ocS+zhdw0S8AlHYY+GOFhP1Gio5z4icpP2ivFSvhtFjQi8+T9ppw==}
     dev: false
 
-  /end-of-stream/1.4.4:
-    resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==}
-    dependencies:
-      once: 1.4.0
-    dev: true
-
   /enquirer/2.3.6:
     resolution: {integrity: sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==}
     engines: {node: '>=8.6'}
@@ -2988,213 +2971,33 @@ packages:
       ext: 1.7.0
     dev: false
 
-  /esbuild-android-64/0.14.54:
-    resolution: {integrity: sha512-Tz2++Aqqz0rJ7kYBfz+iqyE3QMycD4vk7LBRyWaAVFgFtQ/O8EJOnVmTOiDWYZ/uYzB4kvP+bqejYdVKzE5lAQ==}
-    engines: {node: '>=12'}
-    cpu: [x64]
-    os: [android]
-    requiresBuild: true
-    dev: true
-    optional: true
-
-  /esbuild-android-arm64/0.14.54:
-    resolution: {integrity: sha512-F9E+/QDi9sSkLaClO8SOV6etqPd+5DgJje1F9lOWoNncDdOBL2YF59IhsWATSt0TLZbYCf3pNlTHvVV5VfHdvg==}
-    engines: {node: '>=12'}
-    cpu: [arm64]
-    os: [android]
-    requiresBuild: true
-    dev: true
-    optional: true
-
-  /esbuild-darwin-64/0.14.54:
-    resolution: {integrity: sha512-jtdKWV3nBviOd5v4hOpkVmpxsBy90CGzebpbO9beiqUYVMBtSc0AL9zGftFuBon7PNDcdvNCEuQqw2x0wP9yug==}
-    engines: {node: '>=12'}
-    cpu: [x64]
-    os: [darwin]
-    requiresBuild: true
-    dev: true
-    optional: true
-
-  /esbuild-darwin-arm64/0.14.54:
-    resolution: {integrity: sha512-OPafJHD2oUPyvJMrsCvDGkRrVCar5aVyHfWGQzY1dWnzErjrDuSETxwA2HSsyg2jORLY8yBfzc1MIpUkXlctmw==}
-    engines: {node: '>=12'}
-    cpu: [arm64]
-    os: [darwin]
-    requiresBuild: true
-    dev: true
-    optional: true
-
-  /esbuild-freebsd-64/0.14.54:
-    resolution: {integrity: sha512-OKwd4gmwHqOTp4mOGZKe/XUlbDJ4Q9TjX0hMPIDBUWWu/kwhBAudJdBoxnjNf9ocIB6GN6CPowYpR/hRCbSYAg==}
-    engines: {node: '>=12'}
-    cpu: [x64]
-    os: [freebsd]
-    requiresBuild: true
-    dev: true
-    optional: true
-
-  /esbuild-freebsd-arm64/0.14.54:
-    resolution: {integrity: sha512-sFwueGr7OvIFiQT6WeG0jRLjkjdqWWSrfbVwZp8iMP+8UHEHRBvlaxL6IuKNDwAozNUmbb8nIMXa7oAOARGs1Q==}
-    engines: {node: '>=12'}
-    cpu: [arm64]
-    os: [freebsd]
-    requiresBuild: true
-    dev: true
-    optional: true
-
-  /esbuild-linux-32/0.14.54:
-    resolution: {integrity: sha512-1ZuY+JDI//WmklKlBgJnglpUL1owm2OX+8E1syCD6UAxcMM/XoWd76OHSjl/0MR0LisSAXDqgjT3uJqT67O3qw==}
-    engines: {node: '>=12'}
-    cpu: [ia32]
-    os: [linux]
-    requiresBuild: true
-    dev: true
-    optional: true
-
-  /esbuild-linux-64/0.14.54:
-    resolution: {integrity: sha512-EgjAgH5HwTbtNsTqQOXWApBaPVdDn7XcK+/PtJwZLT1UmpLoznPd8c5CxqsH2dQK3j05YsB3L17T8vE7cp4cCg==}
-    engines: {node: '>=12'}
-    cpu: [x64]
-    os: [linux]
-    requiresBuild: true
-    dev: true
-    optional: true
-
-  /esbuild-linux-arm/0.14.54:
-    resolution: {integrity: sha512-qqz/SjemQhVMTnvcLGoLOdFpCYbz4v4fUo+TfsWG+1aOu70/80RV6bgNpR2JCrppV2moUQkww+6bWxXRL9YMGw==}
-    engines: {node: '>=12'}
-    cpu: [arm]
-    os: [linux]
-    requiresBuild: true
-    dev: true
-    optional: true
-
-  /esbuild-linux-arm64/0.14.54:
-    resolution: {integrity: sha512-WL71L+0Rwv+Gv/HTmxTEmpv0UgmxYa5ftZILVi2QmZBgX3q7+tDeOQNqGtdXSdsL8TQi1vIaVFHUPDe0O0kdig==}
-    engines: {node: '>=12'}
-    cpu: [arm64]
-    os: [linux]
-    requiresBuild: true
-    dev: true
-    optional: true
-
-  /esbuild-linux-mips64le/0.14.54:
-    resolution: {integrity: sha512-qTHGQB8D1etd0u1+sB6p0ikLKRVuCWhYQhAHRPkO+OF3I/iSlTKNNS0Lh2Oc0g0UFGguaFZZiPJdJey3AGpAlw==}
-    engines: {node: '>=12'}
-    cpu: [mips64el]
-    os: [linux]
-    requiresBuild: true
-    dev: true
-    optional: true
-
-  /esbuild-linux-ppc64le/0.14.54:
-    resolution: {integrity: sha512-j3OMlzHiqwZBDPRCDFKcx595XVfOfOnv68Ax3U4UKZ3MTYQB5Yz3X1mn5GnodEVYzhtZgxEBidLWeIs8FDSfrQ==}
-    engines: {node: '>=12'}
-    cpu: [ppc64]
-    os: [linux]
-    requiresBuild: true
-    dev: true
-    optional: true
-
-  /esbuild-linux-riscv64/0.14.54:
-    resolution: {integrity: sha512-y7Vt7Wl9dkOGZjxQZnDAqqn+XOqFD7IMWiewY5SPlNlzMX39ocPQlOaoxvT4FllA5viyV26/QzHtvTjVNOxHZg==}
-    engines: {node: '>=12'}
-    cpu: [riscv64]
-    os: [linux]
-    requiresBuild: true
-    dev: true
-    optional: true
-
-  /esbuild-linux-s390x/0.14.54:
-    resolution: {integrity: sha512-zaHpW9dziAsi7lRcyV4r8dhfG1qBidQWUXweUjnw+lliChJqQr+6XD71K41oEIC3Mx1KStovEmlzm+MkGZHnHA==}
-    engines: {node: '>=12'}
-    cpu: [s390x]
-    os: [linux]
-    requiresBuild: true
-    dev: true
-    optional: true
-
-  /esbuild-netbsd-64/0.14.54:
-    resolution: {integrity: sha512-PR01lmIMnfJTgeU9VJTDY9ZerDWVFIUzAtJuDHwwceppW7cQWjBBqP48NdeRtoP04/AtO9a7w3viI+PIDr6d+w==}
-    engines: {node: '>=12'}
-    cpu: [x64]
-    os: [netbsd]
-    requiresBuild: true
-    dev: true
-    optional: true
-
-  /esbuild-openbsd-64/0.14.54:
-    resolution: {integrity: sha512-Qyk7ikT2o7Wu76UsvvDS5q0amJvmRzDyVlL0qf5VLsLchjCa1+IAvd8kTBgUxD7VBUUVgItLkk609ZHUc1oCaw==}
-    engines: {node: '>=12'}
-    cpu: [x64]
-    os: [openbsd]
-    requiresBuild: true
-    dev: true
-    optional: true
-
-  /esbuild-sunos-64/0.14.54:
-    resolution: {integrity: sha512-28GZ24KmMSeKi5ueWzMcco6EBHStL3B6ubM7M51RmPwXQGLe0teBGJocmWhgwccA1GeFXqxzILIxXpHbl9Q/Kw==}
-    engines: {node: '>=12'}
-    cpu: [x64]
-    os: [sunos]
-    requiresBuild: true
-    dev: true
-    optional: true
-
-  /esbuild-windows-32/0.14.54:
-    resolution: {integrity: sha512-T+rdZW19ql9MjS7pixmZYVObd9G7kcaZo+sETqNH4RCkuuYSuv9AGHUVnPoP9hhuE1WM1ZimHz1CIBHBboLU7w==}
-    engines: {node: '>=12'}
-    cpu: [ia32]
-    os: [win32]
-    requiresBuild: true
-    dev: true
-    optional: true
-
-  /esbuild-windows-64/0.14.54:
-    resolution: {integrity: sha512-AoHTRBUuYwXtZhjXZbA1pGfTo8cJo3vZIcWGLiUcTNgHpJJMC1rVA44ZereBHMJtotyN71S8Qw0npiCIkW96cQ==}
-    engines: {node: '>=12'}
-    cpu: [x64]
-    os: [win32]
-    requiresBuild: true
-    dev: true
-    optional: true
-
-  /esbuild-windows-arm64/0.14.54:
-    resolution: {integrity: sha512-M0kuUvXhot1zOISQGXwWn6YtS+Y/1RT9WrVIOywZnJHo3jCDyewAc79aKNQWFCQm+xNHVTq9h8dZKvygoXQQRg==}
-    engines: {node: '>=12'}
-    cpu: [arm64]
-    os: [win32]
-    requiresBuild: true
-    dev: true
-    optional: true
-
   /esbuild/0.14.54:
     resolution: {integrity: sha512-Cy9llcy8DvET5uznocPyqL3BFRrFXSVqbgpMJ9Wz8oVjZlh/zUSNbPRbov0VX7VxN2JH1Oa0uNxZ7eLRb62pJA==}
     engines: {node: '>=12'}
     hasBin: true
     requiresBuild: true
     optionalDependencies:
-      '@esbuild/linux-loong64': 0.14.54
-      esbuild-android-64: 0.14.54
-      esbuild-android-arm64: 0.14.54
-      esbuild-darwin-64: 0.14.54
-      esbuild-darwin-arm64: 0.14.54
-      esbuild-freebsd-64: 0.14.54
-      esbuild-freebsd-arm64: 0.14.54
-      esbuild-linux-32: 0.14.54
-      esbuild-linux-64: 0.14.54
-      esbuild-linux-arm: 0.14.54
-      esbuild-linux-arm64: 0.14.54
-      esbuild-linux-mips64le: 0.14.54
-      esbuild-linux-ppc64le: 0.14.54
-      esbuild-linux-riscv64: 0.14.54
-      esbuild-linux-s390x: 0.14.54
-      esbuild-netbsd-64: 0.14.54
-      esbuild-openbsd-64: 0.14.54
-      esbuild-sunos-64: 0.14.54
-      esbuild-windows-32: 0.14.54
-      esbuild-windows-64: 0.14.54
-      esbuild-windows-arm64: 0.14.54
+      '@esbuild/linux-loong64': registry.npmmirror.com/@esbuild/linux-loong64/0.14.54
+      esbuild-android-64: registry.npmmirror.com/esbuild-android-64/0.14.54
+      esbuild-android-arm64: registry.npmmirror.com/esbuild-android-arm64/0.14.54
+      esbuild-darwin-64: registry.npmmirror.com/esbuild-darwin-64/0.14.54
+      esbuild-darwin-arm64: registry.npmmirror.com/esbuild-darwin-arm64/0.14.54
+      esbuild-freebsd-64: registry.npmmirror.com/esbuild-freebsd-64/0.14.54
+      esbuild-freebsd-arm64: registry.npmmirror.com/esbuild-freebsd-arm64/0.14.54
+      esbuild-linux-32: registry.npmmirror.com/esbuild-linux-32/0.14.54
+      esbuild-linux-64: registry.npmmirror.com/esbuild-linux-64/0.14.54
+      esbuild-linux-arm: registry.npmmirror.com/esbuild-linux-arm/0.14.54
+      esbuild-linux-arm64: registry.npmmirror.com/esbuild-linux-arm64/0.14.54
+      esbuild-linux-mips64le: registry.npmmirror.com/esbuild-linux-mips64le/0.14.54
+      esbuild-linux-ppc64le: registry.npmmirror.com/esbuild-linux-ppc64le/0.14.54
+      esbuild-linux-riscv64: registry.npmmirror.com/esbuild-linux-riscv64/0.14.54
+      esbuild-linux-s390x: registry.npmmirror.com/esbuild-linux-s390x/0.14.54
+      esbuild-netbsd-64: registry.npmmirror.com/esbuild-netbsd-64/0.14.54
+      esbuild-openbsd-64: registry.npmmirror.com/esbuild-openbsd-64/0.14.54
+      esbuild-sunos-64: registry.npmmirror.com/esbuild-sunos-64/0.14.54
+      esbuild-windows-32: registry.npmmirror.com/esbuild-windows-32/0.14.54
+      esbuild-windows-64: registry.npmmirror.com/esbuild-windows-64/0.14.54
+      esbuild-windows-arm64: registry.npmmirror.com/esbuild-windows-arm64/0.14.54
     dev: true
 
   /escalade/3.1.1:
@@ -3596,14 +3399,6 @@ packages:
     resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==}
     dev: true
 
-  /fsevents/2.3.2:
-    resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==}
-    engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0}
-    os: [darwin]
-    requiresBuild: true
-    dev: true
-    optional: true
-
   /function-bind/1.1.1:
     resolution: {integrity: sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==}
 
@@ -3657,7 +3452,7 @@ packages:
     hasBin: true
     dependencies:
       dargs: 7.0.0
-      lodash: 4.17.21
+      lodash: registry.npmmirror.com/lodash/4.17.21
       meow: 8.1.2
       split2: 3.2.2
       through2: 4.0.2
@@ -3682,9 +3477,9 @@ packages:
     dependencies:
       fs.realpath: 1.0.0
       inflight: 1.0.6
-      inherits: 2.0.4
-      minimatch: 3.1.2
-      once: 1.4.0
+      inherits: registry.npmmirror.com/inherits/2.0.4
+      minimatch: registry.npmmirror.com/minimatch/3.1.2
+      once: registry.npmmirror.com/once/1.4.0
       path-is-absolute: 1.0.1
     dev: true
 
@@ -3794,7 +3589,7 @@ packages:
     resolution: {integrity: sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==}
     engines: {node: '>=10'}
     dependencies:
-      lru-cache: 6.0.0
+      lru-cache: registry.npmmirror.com/lru-cache/6.0.0
     dev: true
 
   /html-tags/3.2.0:
@@ -3880,16 +3675,8 @@ packages:
   /inflight/1.0.6:
     resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==}
     dependencies:
-      once: 1.4.0
-      wrappy: 1.0.2
-    dev: true
-
-  /inherits/2.0.3:
-    resolution: {integrity: sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==}
-    dev: false
-
-  /inherits/2.0.4:
-    resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==}
+      once: registry.npmmirror.com/once/1.4.0
+      wrappy: registry.npmmirror.com/wrappy/1.0.2
     dev: true
 
   /ini/1.3.8:
@@ -4082,7 +3869,7 @@ packages:
   /jsonfile/4.0.0:
     resolution: {integrity: sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==}
     optionalDependencies:
-      graceful-fs: 4.2.11
+      graceful-fs: registry.npmmirror.com/graceful-fs/4.2.11
     dev: false
 
   /jsonfile/6.1.0:
@@ -4090,7 +3877,7 @@ packages:
     dependencies:
       universalify: 2.0.0
     optionalDependencies:
-      graceful-fs: 4.2.11
+      graceful-fs: registry.npmmirror.com/graceful-fs/4.2.11
     dev: true
 
   /jsonparse/1.3.1:
@@ -4280,12 +4067,6 @@ packages:
       js-tokens: 4.0.0
     dev: false
 
-  /lru-cache/5.1.1:
-    resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==}
-    dependencies:
-      yallist: 3.1.1
-    dev: true
-
   /lru-cache/6.0.0:
     resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==}
     engines: {node: '>=10'}
@@ -4476,7 +4257,7 @@ packages:
       array-differ: 3.0.0
       array-union: 2.1.0
       arrify: 2.0.1
-      minimatch: 3.1.2
+      minimatch: registry.npmmirror.com/minimatch/3.1.2
     dev: true
 
   /namespace-emitter/2.0.1:
@@ -4580,12 +4361,6 @@ packages:
       undici: 5.21.0
     dev: true
 
-  /once/1.4.0:
-    resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==}
-    dependencies:
-      wrappy: 1.0.2
-    dev: true
-
   /onetime/5.1.2:
     resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==}
     engines: {node: '>=6'}
@@ -5071,7 +4846,7 @@ packages:
     engines: {node: '>=4'}
     dependencies:
       cssesc: 3.0.0
-      util-deprecate: 1.0.2
+      util-deprecate: registry.npmmirror.com/util-deprecate/1.0.2
     dev: true
 
   /postcss-sorting/7.0.1_postcss@8.4.21:
@@ -5170,8 +4945,8 @@ packages:
   /pump/3.0.0:
     resolution: {integrity: sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==}
     dependencies:
-      end-of-stream: 1.4.4
-      once: 1.4.0
+      end-of-stream: registry.npmmirror.com/end-of-stream/1.4.4
+      once: registry.npmmirror.com/once/1.4.0
     dev: true
 
   /punycode/2.3.0:
@@ -5236,15 +5011,6 @@ packages:
       type-fest: 0.6.0
     dev: true
 
-  /readable-stream/3.6.2:
-    resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==}
-    engines: {node: '>= 6'}
-    dependencies:
-      inherits: 2.0.4
-      string_decoder: 1.3.0
-      util-deprecate: 1.0.2
-    dev: true
-
   /readdirp/3.6.0:
     resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==}
     engines: {node: '>=8.10.0'}
@@ -5366,7 +5132,7 @@ packages:
     engines: {node: '>=10.0.0'}
     hasBin: true
     optionalDependencies:
-      fsevents: 2.3.2
+      fsevents: registry.npmmirror.com/fsevents/2.3.2
     dev: true
 
   /rollup/2.79.1:
@@ -5374,7 +5140,7 @@ packages:
     engines: {node: '>=10.0.0'}
     hasBin: true
     optionalDependencies:
-      fsevents: 2.3.2
+      fsevents: registry.npmmirror.com/fsevents/2.3.2
     dev: true
 
   /run-parallel/1.2.0:
@@ -5389,10 +5155,6 @@ packages:
       tslib: 2.5.0
     dev: true
 
-  /safe-buffer/5.2.1:
-    resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==}
-    dev: true
-
   /sass/1.60.0:
     resolution: {integrity: sha512-updbwW6fNb5gGm8qMXzVO7V4sWf7LMXnMly/JEyfbfERbVH46Fn6q02BX7/eHTdKpE7d+oTkMMQpFWNUMfFbgQ==}
     engines: {node: '>=12.0.0'}
@@ -5428,7 +5190,7 @@ packages:
     engines: {node: '>=10'}
     hasBin: true
     dependencies:
-      lru-cache: 6.0.0
+      lru-cache: registry.npmmirror.com/lru-cache/6.0.0
     dev: true
 
   /semver/7.3.8:
@@ -5591,7 +5353,7 @@ packages:
   /split2/3.2.2:
     resolution: {integrity: sha512-9NThjpgZnifTkJpzTZ7Eue85S49QwpNhZTq6GRJwObb6jnLFNGB7Qm73V5HewTROPyxD0C29xqmaI68bQtV+hg==}
     dependencies:
-      readable-stream: 3.6.2
+      readable-stream: registry.npmmirror.com/readable-stream/3.6.2
     dev: true
 
   /ssf/0.11.2:
@@ -5636,12 +5398,6 @@ packages:
       is-fullwidth-code-point: 3.0.0
       strip-ansi: 6.0.1
 
-  /string_decoder/1.3.0:
-    resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==}
-    dependencies:
-      safe-buffer: 5.2.1
-    dev: true
-
   /stringify-object/3.3.0:
     resolution: {integrity: sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw==}
     engines: {node: '>=4'}
@@ -5875,7 +5631,7 @@ packages:
   /through2/4.0.2:
     resolution: {integrity: sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw==}
     dependencies:
-      readable-stream: 3.6.2
+      readable-stream: registry.npmmirror.com/readable-stream/3.6.2
     dev: true
 
   /tiny-warning/1.0.3:
@@ -6118,14 +5874,10 @@ packages:
       punycode: 2.3.0
     dev: true
 
-  /util-deprecate/1.0.2:
-    resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==}
-    dev: true
-
   /util/0.10.4:
     resolution: {integrity: sha512-0Pm9hTQ3se5ll1XihRic3FDIku70C+iHUdT/W926rSgHV5QgXsYbKZN8MSC3tJtSkhuROzvsQjAaFENRXr+19A==}
     dependencies:
-      inherits: 2.0.3
+      inherits: registry.npmmirror.com/inherits/2.0.3
     dev: false
 
   /uuid/8.3.2:
@@ -6210,7 +5962,7 @@ packages:
       rollup: 2.77.3
       sass: 1.60.0
     optionalDependencies:
-      fsevents: 2.3.2
+      fsevents: registry.npmmirror.com/fsevents/2.3.2
     dev: true
 
   /vue-demi/0.13.11_vue@3.2.47:
@@ -6441,10 +6193,6 @@ packages:
       strip-ansi: 6.0.1
     dev: true
 
-  /wrappy/1.0.2:
-    resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==}
-    dev: true
-
   /write-file-atomic/4.0.2:
     resolution: {integrity: sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==}
     engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0}
@@ -6577,3 +6325,446 @@ packages:
     dependencies:
       tslib: 2.3.0
     dev: false
+
+  registry.npmmirror.com/@esbuild/linux-loong64/0.14.54:
+    resolution: {integrity: sha512-bZBrLAIX1kpWelV0XemxBZllyRmM6vgFQQG2GdNb+r3Fkp0FOh1NJSvekXDs7jq70k4euu1cryLMfU+mTXlEpw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@esbuild/linux-loong64/-/linux-loong64-0.14.54.tgz}
+    name: '@esbuild/linux-loong64'
+    version: 0.14.54
+    engines: {node: '>=12'}
+    cpu: [loong64]
+    os: [linux]
+    requiresBuild: true
+    dev: true
+    optional: true
+
+  registry.npmmirror.com/@sxzz/popperjs-es/2.11.7:
+    resolution: {integrity: sha512-Ccy0NlLkzr0Ex2FKvh2X+OyERHXJ88XJ1MXtsI9y9fGexlaXaVTPzBCRBwIxFkORuOb+uBqeu+RqnpgYTEZRUQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@sxzz/popperjs-es/-/popperjs-es-2.11.7.tgz}
+    name: '@sxzz/popperjs-es'
+    version: 2.11.7
+    dev: false
+
+  registry.npmmirror.com/core-util-is/1.0.3:
+    resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/core-util-is/-/core-util-is-1.0.3.tgz}
+    name: core-util-is
+    version: 1.0.3
+    dev: true
+
+  registry.npmmirror.com/end-of-stream/1.4.4:
+    resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/end-of-stream/-/end-of-stream-1.4.4.tgz}
+    name: end-of-stream
+    version: 1.4.4
+    dependencies:
+      once: registry.npmmirror.com/once/1.4.0
+    dev: true
+
+  registry.npmmirror.com/esbuild-android-64/0.14.54:
+    resolution: {integrity: sha512-Tz2++Aqqz0rJ7kYBfz+iqyE3QMycD4vk7LBRyWaAVFgFtQ/O8EJOnVmTOiDWYZ/uYzB4kvP+bqejYdVKzE5lAQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/esbuild-android-64/-/esbuild-android-64-0.14.54.tgz}
+    name: esbuild-android-64
+    version: 0.14.54
+    engines: {node: '>=12'}
+    cpu: [x64]
+    os: [android]
+    requiresBuild: true
+    dev: true
+    optional: true
+
+  registry.npmmirror.com/esbuild-android-arm64/0.14.54:
+    resolution: {integrity: sha512-F9E+/QDi9sSkLaClO8SOV6etqPd+5DgJje1F9lOWoNncDdOBL2YF59IhsWATSt0TLZbYCf3pNlTHvVV5VfHdvg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/esbuild-android-arm64/-/esbuild-android-arm64-0.14.54.tgz}
+    name: esbuild-android-arm64
+    version: 0.14.54
+    engines: {node: '>=12'}
+    cpu: [arm64]
+    os: [android]
+    requiresBuild: true
+    dev: true
+    optional: true
+
+  registry.npmmirror.com/esbuild-darwin-64/0.14.54:
+    resolution: {integrity: sha512-jtdKWV3nBviOd5v4hOpkVmpxsBy90CGzebpbO9beiqUYVMBtSc0AL9zGftFuBon7PNDcdvNCEuQqw2x0wP9yug==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/esbuild-darwin-64/-/esbuild-darwin-64-0.14.54.tgz}
+    name: esbuild-darwin-64
+    version: 0.14.54
+    engines: {node: '>=12'}
+    cpu: [x64]
+    os: [darwin]
+    requiresBuild: true
+    dev: true
+    optional: true
+
+  registry.npmmirror.com/esbuild-darwin-arm64/0.14.54:
+    resolution: {integrity: sha512-OPafJHD2oUPyvJMrsCvDGkRrVCar5aVyHfWGQzY1dWnzErjrDuSETxwA2HSsyg2jORLY8yBfzc1MIpUkXlctmw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.14.54.tgz}
+    name: esbuild-darwin-arm64
+    version: 0.14.54
+    engines: {node: '>=12'}
+    cpu: [arm64]
+    os: [darwin]
+    requiresBuild: true
+    dev: true
+    optional: true
+
+  registry.npmmirror.com/esbuild-freebsd-64/0.14.54:
+    resolution: {integrity: sha512-OKwd4gmwHqOTp4mOGZKe/XUlbDJ4Q9TjX0hMPIDBUWWu/kwhBAudJdBoxnjNf9ocIB6GN6CPowYpR/hRCbSYAg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/esbuild-freebsd-64/-/esbuild-freebsd-64-0.14.54.tgz}
+    name: esbuild-freebsd-64
+    version: 0.14.54
+    engines: {node: '>=12'}
+    cpu: [x64]
+    os: [freebsd]
+    requiresBuild: true
+    dev: true
+    optional: true
+
+  registry.npmmirror.com/esbuild-freebsd-arm64/0.14.54:
+    resolution: {integrity: sha512-sFwueGr7OvIFiQT6WeG0jRLjkjdqWWSrfbVwZp8iMP+8UHEHRBvlaxL6IuKNDwAozNUmbb8nIMXa7oAOARGs1Q==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.14.54.tgz}
+    name: esbuild-freebsd-arm64
+    version: 0.14.54
+    engines: {node: '>=12'}
+    cpu: [arm64]
+    os: [freebsd]
+    requiresBuild: true
+    dev: true
+    optional: true
+
+  registry.npmmirror.com/esbuild-linux-32/0.14.54:
+    resolution: {integrity: sha512-1ZuY+JDI//WmklKlBgJnglpUL1owm2OX+8E1syCD6UAxcMM/XoWd76OHSjl/0MR0LisSAXDqgjT3uJqT67O3qw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/esbuild-linux-32/-/esbuild-linux-32-0.14.54.tgz}
+    name: esbuild-linux-32
+    version: 0.14.54
+    engines: {node: '>=12'}
+    cpu: [ia32]
+    os: [linux]
+    requiresBuild: true
+    dev: true
+    optional: true
+
+  registry.npmmirror.com/esbuild-linux-64/0.14.54:
+    resolution: {integrity: sha512-EgjAgH5HwTbtNsTqQOXWApBaPVdDn7XcK+/PtJwZLT1UmpLoznPd8c5CxqsH2dQK3j05YsB3L17T8vE7cp4cCg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/esbuild-linux-64/-/esbuild-linux-64-0.14.54.tgz}
+    name: esbuild-linux-64
+    version: 0.14.54
+    engines: {node: '>=12'}
+    cpu: [x64]
+    os: [linux]
+    requiresBuild: true
+    dev: true
+    optional: true
+
+  registry.npmmirror.com/esbuild-linux-arm/0.14.54:
+    resolution: {integrity: sha512-qqz/SjemQhVMTnvcLGoLOdFpCYbz4v4fUo+TfsWG+1aOu70/80RV6bgNpR2JCrppV2moUQkww+6bWxXRL9YMGw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/esbuild-linux-arm/-/esbuild-linux-arm-0.14.54.tgz}
+    name: esbuild-linux-arm
+    version: 0.14.54
+    engines: {node: '>=12'}
+    cpu: [arm]
+    os: [linux]
+    requiresBuild: true
+    dev: true
+    optional: true
+
+  registry.npmmirror.com/esbuild-linux-arm64/0.14.54:
+    resolution: {integrity: sha512-WL71L+0Rwv+Gv/HTmxTEmpv0UgmxYa5ftZILVi2QmZBgX3q7+tDeOQNqGtdXSdsL8TQi1vIaVFHUPDe0O0kdig==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/esbuild-linux-arm64/-/esbuild-linux-arm64-0.14.54.tgz}
+    name: esbuild-linux-arm64
+    version: 0.14.54
+    engines: {node: '>=12'}
+    cpu: [arm64]
+    os: [linux]
+    requiresBuild: true
+    dev: true
+    optional: true
+
+  registry.npmmirror.com/esbuild-linux-mips64le/0.14.54:
+    resolution: {integrity: sha512-qTHGQB8D1etd0u1+sB6p0ikLKRVuCWhYQhAHRPkO+OF3I/iSlTKNNS0Lh2Oc0g0UFGguaFZZiPJdJey3AGpAlw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.14.54.tgz}
+    name: esbuild-linux-mips64le
+    version: 0.14.54
+    engines: {node: '>=12'}
+    cpu: [mips64el]
+    os: [linux]
+    requiresBuild: true
+    dev: true
+    optional: true
+
+  registry.npmmirror.com/esbuild-linux-ppc64le/0.14.54:
+    resolution: {integrity: sha512-j3OMlzHiqwZBDPRCDFKcx595XVfOfOnv68Ax3U4UKZ3MTYQB5Yz3X1mn5GnodEVYzhtZgxEBidLWeIs8FDSfrQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.14.54.tgz}
+    name: esbuild-linux-ppc64le
+    version: 0.14.54
+    engines: {node: '>=12'}
+    cpu: [ppc64]
+    os: [linux]
+    requiresBuild: true
+    dev: true
+    optional: true
+
+  registry.npmmirror.com/esbuild-linux-riscv64/0.14.54:
+    resolution: {integrity: sha512-y7Vt7Wl9dkOGZjxQZnDAqqn+XOqFD7IMWiewY5SPlNlzMX39ocPQlOaoxvT4FllA5viyV26/QzHtvTjVNOxHZg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.14.54.tgz}
+    name: esbuild-linux-riscv64
+    version: 0.14.54
+    engines: {node: '>=12'}
+    cpu: [riscv64]
+    os: [linux]
+    requiresBuild: true
+    dev: true
+    optional: true
+
+  registry.npmmirror.com/esbuild-linux-s390x/0.14.54:
+    resolution: {integrity: sha512-zaHpW9dziAsi7lRcyV4r8dhfG1qBidQWUXweUjnw+lliChJqQr+6XD71K41oEIC3Mx1KStovEmlzm+MkGZHnHA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/esbuild-linux-s390x/-/esbuild-linux-s390x-0.14.54.tgz}
+    name: esbuild-linux-s390x
+    version: 0.14.54
+    engines: {node: '>=12'}
+    cpu: [s390x]
+    os: [linux]
+    requiresBuild: true
+    dev: true
+    optional: true
+
+  registry.npmmirror.com/esbuild-netbsd-64/0.14.54:
+    resolution: {integrity: sha512-PR01lmIMnfJTgeU9VJTDY9ZerDWVFIUzAtJuDHwwceppW7cQWjBBqP48NdeRtoP04/AtO9a7w3viI+PIDr6d+w==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/esbuild-netbsd-64/-/esbuild-netbsd-64-0.14.54.tgz}
+    name: esbuild-netbsd-64
+    version: 0.14.54
+    engines: {node: '>=12'}
+    cpu: [x64]
+    os: [netbsd]
+    requiresBuild: true
+    dev: true
+    optional: true
+
+  registry.npmmirror.com/esbuild-openbsd-64/0.14.54:
+    resolution: {integrity: sha512-Qyk7ikT2o7Wu76UsvvDS5q0amJvmRzDyVlL0qf5VLsLchjCa1+IAvd8kTBgUxD7VBUUVgItLkk609ZHUc1oCaw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/esbuild-openbsd-64/-/esbuild-openbsd-64-0.14.54.tgz}
+    name: esbuild-openbsd-64
+    version: 0.14.54
+    engines: {node: '>=12'}
+    cpu: [x64]
+    os: [openbsd]
+    requiresBuild: true
+    dev: true
+    optional: true
+
+  registry.npmmirror.com/esbuild-sunos-64/0.14.54:
+    resolution: {integrity: sha512-28GZ24KmMSeKi5ueWzMcco6EBHStL3B6ubM7M51RmPwXQGLe0teBGJocmWhgwccA1GeFXqxzILIxXpHbl9Q/Kw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/esbuild-sunos-64/-/esbuild-sunos-64-0.14.54.tgz}
+    name: esbuild-sunos-64
+    version: 0.14.54
+    engines: {node: '>=12'}
+    cpu: [x64]
+    os: [sunos]
+    requiresBuild: true
+    dev: true
+    optional: true
+
+  registry.npmmirror.com/esbuild-windows-32/0.14.54:
+    resolution: {integrity: sha512-T+rdZW19ql9MjS7pixmZYVObd9G7kcaZo+sETqNH4RCkuuYSuv9AGHUVnPoP9hhuE1WM1ZimHz1CIBHBboLU7w==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/esbuild-windows-32/-/esbuild-windows-32-0.14.54.tgz}
+    name: esbuild-windows-32
+    version: 0.14.54
+    engines: {node: '>=12'}
+    cpu: [ia32]
+    os: [win32]
+    requiresBuild: true
+    dev: true
+    optional: true
+
+  registry.npmmirror.com/esbuild-windows-64/0.14.54:
+    resolution: {integrity: sha512-AoHTRBUuYwXtZhjXZbA1pGfTo8cJo3vZIcWGLiUcTNgHpJJMC1rVA44ZereBHMJtotyN71S8Qw0npiCIkW96cQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/esbuild-windows-64/-/esbuild-windows-64-0.14.54.tgz}
+    name: esbuild-windows-64
+    version: 0.14.54
+    engines: {node: '>=12'}
+    cpu: [x64]
+    os: [win32]
+    requiresBuild: true
+    dev: true
+    optional: true
+
+  registry.npmmirror.com/esbuild-windows-arm64/0.14.54:
+    resolution: {integrity: sha512-M0kuUvXhot1zOISQGXwWn6YtS+Y/1RT9WrVIOywZnJHo3jCDyewAc79aKNQWFCQm+xNHVTq9h8dZKvygoXQQRg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/esbuild-windows-arm64/-/esbuild-windows-arm64-0.14.54.tgz}
+    name: esbuild-windows-arm64
+    version: 0.14.54
+    engines: {node: '>=12'}
+    cpu: [arm64]
+    os: [win32]
+    requiresBuild: true
+    dev: true
+    optional: true
+
+  registry.npmmirror.com/fsevents/2.3.2:
+    resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/fsevents/-/fsevents-2.3.2.tgz}
+    name: fsevents
+    version: 2.3.2
+    engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0}
+    os: [darwin]
+    requiresBuild: true
+    dev: true
+    optional: true
+
+  registry.npmmirror.com/graceful-fs/4.2.11:
+    resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/graceful-fs/-/graceful-fs-4.2.11.tgz}
+    name: graceful-fs
+    version: 4.2.11
+    optional: true
+
+  registry.npmmirror.com/immediate/3.0.6:
+    resolution: {integrity: sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/immediate/-/immediate-3.0.6.tgz}
+    name: immediate
+    version: 3.0.6
+    dev: true
+
+  registry.npmmirror.com/inherits/2.0.3:
+    resolution: {integrity: sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/inherits/-/inherits-2.0.3.tgz}
+    name: inherits
+    version: 2.0.3
+    dev: false
+
+  registry.npmmirror.com/inherits/2.0.4:
+    resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/inherits/-/inherits-2.0.4.tgz}
+    name: inherits
+    version: 2.0.4
+    dev: true
+
+  registry.npmmirror.com/isarray/1.0.0:
+    resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/isarray/-/isarray-1.0.0.tgz}
+    name: isarray
+    version: 1.0.0
+    dev: true
+
+  registry.npmmirror.com/jszip/3.10.1:
+    resolution: {integrity: sha512-xXDvecyTpGLrqFrvkrUSoxxfJI5AH7U8zxxtVclpsUtMCq4JQ290LY8AW5c7Ggnr/Y/oK+bQMbqK2qmtk3pN4g==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/jszip/-/jszip-3.10.1.tgz}
+    name: jszip
+    version: 3.10.1
+    dependencies:
+      lie: registry.npmmirror.com/lie/3.3.0
+      pako: registry.npmmirror.com/pako/1.0.11
+      readable-stream: registry.npmmirror.com/readable-stream/2.3.8
+      setimmediate: registry.npmmirror.com/setimmediate/1.0.5
+    dev: true
+
+  registry.npmmirror.com/lie/3.3.0:
+    resolution: {integrity: sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/lie/-/lie-3.3.0.tgz}
+    name: lie
+    version: 3.3.0
+    dependencies:
+      immediate: registry.npmmirror.com/immediate/3.0.6
+    dev: true
+
+  registry.npmmirror.com/lodash/4.17.21:
+    resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/lodash/-/lodash-4.17.21.tgz}
+    name: lodash
+    version: 4.17.21
+
+  registry.npmmirror.com/lru-cache/5.1.1:
+    resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/lru-cache/-/lru-cache-5.1.1.tgz}
+    name: lru-cache
+    version: 5.1.1
+    dependencies:
+      yallist: 3.1.1
+    dev: true
+
+  registry.npmmirror.com/lru-cache/6.0.0:
+    resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/lru-cache/-/lru-cache-6.0.0.tgz}
+    name: lru-cache
+    version: 6.0.0
+    engines: {node: '>=10'}
+    dependencies:
+      yallist: 4.0.0
+    dev: true
+
+  registry.npmmirror.com/minimatch/3.1.2:
+    resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/minimatch/-/minimatch-3.1.2.tgz}
+    name: minimatch
+    version: 3.1.2
+    dependencies:
+      brace-expansion: 1.1.11
+    dev: true
+
+  registry.npmmirror.com/once/1.4.0:
+    resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/once/-/once-1.4.0.tgz}
+    name: once
+    version: 1.4.0
+    dependencies:
+      wrappy: registry.npmmirror.com/wrappy/1.0.2
+    dev: true
+
+  registry.npmmirror.com/pako/1.0.11:
+    resolution: {integrity: sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/pako/-/pako-1.0.11.tgz}
+    name: pako
+    version: 1.0.11
+    dev: true
+
+  registry.npmmirror.com/process-nextick-args/2.0.1:
+    resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz}
+    name: process-nextick-args
+    version: 2.0.1
+    dev: true
+
+  registry.npmmirror.com/readable-stream/2.3.8:
+    resolution: {integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/readable-stream/-/readable-stream-2.3.8.tgz}
+    name: readable-stream
+    version: 2.3.8
+    dependencies:
+      core-util-is: registry.npmmirror.com/core-util-is/1.0.3
+      inherits: registry.npmmirror.com/inherits/2.0.4
+      isarray: registry.npmmirror.com/isarray/1.0.0
+      process-nextick-args: registry.npmmirror.com/process-nextick-args/2.0.1
+      safe-buffer: registry.npmmirror.com/safe-buffer/5.1.2
+      string_decoder: registry.npmmirror.com/string_decoder/1.1.1
+      util-deprecate: registry.npmmirror.com/util-deprecate/1.0.2
+    dev: true
+
+  registry.npmmirror.com/readable-stream/3.6.2:
+    resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/readable-stream/-/readable-stream-3.6.2.tgz}
+    name: readable-stream
+    version: 3.6.2
+    engines: {node: '>= 6'}
+    dependencies:
+      inherits: registry.npmmirror.com/inherits/2.0.4
+      string_decoder: registry.npmmirror.com/string_decoder/1.3.0
+      util-deprecate: registry.npmmirror.com/util-deprecate/1.0.2
+    dev: true
+
+  registry.npmmirror.com/safe-buffer/5.1.2:
+    resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/safe-buffer/-/safe-buffer-5.1.2.tgz}
+    name: safe-buffer
+    version: 5.1.2
+    dev: true
+
+  registry.npmmirror.com/safe-buffer/5.2.1:
+    resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/safe-buffer/-/safe-buffer-5.2.1.tgz}
+    name: safe-buffer
+    version: 5.2.1
+    dev: true
+
+  registry.npmmirror.com/setimmediate/1.0.5:
+    resolution: {integrity: sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/setimmediate/-/setimmediate-1.0.5.tgz}
+    name: setimmediate
+    version: 1.0.5
+    dev: true
+
+  registry.npmmirror.com/string_decoder/1.1.1:
+    resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/string_decoder/-/string_decoder-1.1.1.tgz}
+    name: string_decoder
+    version: 1.1.1
+    dependencies:
+      safe-buffer: registry.npmmirror.com/safe-buffer/5.1.2
+    dev: true
+
+  registry.npmmirror.com/string_decoder/1.3.0:
+    resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/string_decoder/-/string_decoder-1.3.0.tgz}
+    name: string_decoder
+    version: 1.3.0
+    dependencies:
+      safe-buffer: registry.npmmirror.com/safe-buffer/5.2.1
+    dev: true
+
+  registry.npmmirror.com/util-deprecate/1.0.2:
+    resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/util-deprecate/-/util-deprecate-1.0.2.tgz}
+    name: util-deprecate
+    version: 1.0.2
+    dev: true
+
+  registry.npmmirror.com/vite-plugin-zip-pack/1.2.2_vite@2.9.15:
+    resolution: {integrity: sha512-7TZP3NxiiZY6zTqekzaFzZ/VTEyN1xmfwStyuEy4i1E5NE5BMd6VAFvxmQ5sHUS6qZtZlgNASU3iTPkYzWTuhw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/vite-plugin-zip-pack/-/vite-plugin-zip-pack-1.2.2.tgz}
+    id: registry.npmmirror.com/vite-plugin-zip-pack/1.2.2
+    name: vite-plugin-zip-pack
+    version: 1.2.2
+    peerDependencies:
+      vite: '>=2.x'
+    dependencies:
+      jszip: registry.npmmirror.com/jszip/3.10.1
+      vite: 2.9.15_sass@1.60.0
+    dev: true
+
+  registry.npmmirror.com/wrappy/1.0.2:
+    resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/wrappy/-/wrappy-1.0.2.tgz}
+    name: wrappy
+    version: 1.0.2
+    dev: true

+ 19 - 7
src/components/PageContent/src/hooks/use-request.ts

@@ -10,6 +10,7 @@ import { useNav } from "/@/layout/hooks/nav";
 import { useParams } from "./use-params";
 import { useUserInfo } from "/@/hooks/core/useUser";
 import { httpSupplierList } from "/@/api/supplierManage/supplierAccoutManage";
+import { httpCompanyList } from "/@/api/InvoiceSales/invoiceApply";
 
 export function useRequeset(props: PageContentProps) {
   const { contentConfig } = props;
@@ -32,7 +33,7 @@ export function useRequeset(props: PageContentProps) {
 
   async function onSearch() {
     const { contentConfig } = props;
-    const { apis, isTree, mockData, listNoRelation, transformCompany } = contentConfig;
+    const { apis, isTree, mockData, listNoRelation, transformCompany, transformField, transformFieldCompany, notDeleteCompanyrProp } = contentConfig;
     const hasCompanyFilter = !notNeedCompanyFilter;
     const vm = getCurrentInstance();
 
@@ -46,9 +47,9 @@ export function useRequeset(props: PageContentProps) {
 
 
     let transCompany = ""
-    if (transformCompany) {
+    if (transformCompany || transformField) {
       const { data } = await httpSupplierList({ name: currentCompany.value?.companyName })
-      const item = currentCompany.value?.companyName ? data.list[0] || {} : {};
+      const item = currentCompany.value?.companyName ? data.list.find(item => item.name === currentCompany.value?.companyName) || {} : {};
       transCompany = item.code;
     }
 
@@ -60,11 +61,22 @@ export function useRequeset(props: PageContentProps) {
         : {}
     });
 
-    const { code, data, message } = await apis.httpList({
-      ...params,
-      ...(listNoRelation ? { noRela: true } : {})
-    });
 
+    if (transformFieldCompany && params['companyNo']) {
+      const { data } = await httpCompanyList({ size: 1000 })
+      const name = (data.list.find(({ companyNo }) => companyNo === params['companyNo']) || {}).company_name
+      const { data: rdata } = await httpSupplierList({ name })
+      const item = name ? rdata.list.find(item => item.name === name) || {} : {};
+      params['supplierNo'] = item.code;
+      delete params['companyNo']
+    }
+
+    if (transformField) {
+      params[transformField] = transCompany;
+      !notDeleteCompanyrProp && delete params[companyProp];
+    }
+
+    const { code, data, message } = await apis.httpList({ ...params, ...(listNoRelation ? { noRela: true } : {}) });
 
 
     responseHandle({

+ 3 - 2
src/components/ReconciliationForm/src/cpns/batch-mode.vue

@@ -18,6 +18,7 @@ const props = defineProps<{
   supplierNo?: string;
   companyNo?: string;
   type: string;
+  isComon: string;
 }>();
 
 const sourceText = ref("");
@@ -59,8 +60,8 @@ function handleEnter() {
   run(
     httpBatch(
       searchType.value == "2"
-        ? { size: 100, cgdNoArr, companyNo: props.companyNo, supplierNo: props.supplierNo, is_comon:"0" }
-        : { size: 100, qrdNoArr: cgdNoArr, companyNo: props.companyNo, supplierNo: props.supplierNo, is_comon:"0" }
+        ? { size: 100, cgdNoArr, companyNo: props.companyNo, supplierNo: props.supplierNo,    is_comon: props.isComon,}
+        : { size: 100, qrdNoArr: cgdNoArr, companyNo: props.companyNo, supplierNo: props.supplierNo,     is_comon: props.isComon, }
     )
   );
   sourceText.value = "";

+ 3 - 0
src/components/ReconciliationForm/src/cpns/purchase-modal.vue

@@ -6,6 +6,7 @@ import BatchMode from "./batch-mode.vue";
 defineProps<{
   supplierNo?: string;
   companyNo?: string;
+  isComon?: string;
 }>();
 
 const emit = defineEmits(["pushOrder"]);
@@ -44,6 +45,7 @@ defineExpose({
       <single-mode
         :company-no="companyNo"
         :supplier-no="supplierNo"
+        :isComon="isComon"
         @selection="handlePushOrder"
       />
     </template>
@@ -53,6 +55,7 @@ defineExpose({
         :company-no="companyNo"
         :supplier-no="supplierNo"
         :type="isBatch"
+        :isComon="isComon"
         @selection="handlePushOrder"
       />
     </template>

+ 2 - 0
src/components/ReconciliationForm/src/cpns/purchase-table.vue

@@ -24,6 +24,7 @@ const props = defineProps<{
   purchaseOrders: any;
   readonly: boolean;
   isPurchPay?: boolean;
+  isComon?:string;
   totalCommonPrice?: number
   totalCommonCount?: number
   edit?: boolean;
@@ -366,6 +367,7 @@ defineExpose({
 
     <PurchaseModal
       ref="PurchaseModalRef"
+      :isComon="isComon"
       :companyNo="companyNo"
       :supplierNo="supplierNo"
       @pushOrder="orders => emit('push', orders)"

+ 2 - 1
src/components/ReconciliationForm/src/cpns/single-mode.vue

@@ -16,6 +16,7 @@ const emit = defineEmits(["selection"]);
 const props = defineProps<{
   supplierNo?: string;
   companyNo?: string;
+  isComon?:string;
 }>();
 
 const tableRef = ref<InstanceType<typeof ElTable>>(null);
@@ -65,7 +66,7 @@ async function handleSearch() {
     ...restParams,
     start: timer[0],
     end: timer[1],
-    is_comon: "0",
+    is_comon: props.isComon,
     status: "0",
     supplierNo,
     companyNo,

+ 22 - 12
src/components/ReconciliationForm/src/index.vue

@@ -23,6 +23,8 @@ const orderArr = ref([]);
 const totalCommonPrice = shallowRef("0.00");
 const totalCommonCount = shallowRef(0);
 
+const isComon = ref("0");
+
 const props = defineProps<{
   id?: string;
   isPurch?: boolean;
@@ -140,18 +142,9 @@ const handleEditPurchaseOrders = (item, index) => {
 }
 
 function handleBatchSelection(ids,isSelection = true) { 
-  purchaseOrders.value.forEach(item => { 
-    item.isSelection = isSelection ? ids.includes(item.id) : !ids.includes(item.id);
-  })
-
-  const total = purchaseOrders.value.reduce((prev, current) => { 
-    return addition(prev,current.isSelection ? current.inv_fee : 0)
-  },0)
-
-  totalCommonCount.value = purchaseOrders.value.reduce((prev, current) => { 
-    return addition(prev,current.isSelection ? 1 : 0)
-  },0)
-
+  purchaseOrders.value.forEach(item => item.isSelection = isSelection ? ids.includes(item.id) : !ids.includes(item.id))
+  const total = purchaseOrders.value.reduce((prev, current) => addition(prev,current.isSelection ? current.inv_fee : 0), 0)
+  totalCommonCount.value = purchaseOrders.value.reduce((prev, current) => addition(prev,current.isSelection ? 1 : 0), 0)
   totalCommonPrice.value = Number(total).toFixed(2)
 }
 
@@ -161,6 +154,12 @@ watch(
   { immediate: true }
 );
 
+
+watch(() =>  isComon.value,() => {
+  purchaseOrders.value  = [];
+  formData.value.cids = [];
+})
+
 watch(
   () => currentCompany.value,
   ({ companyNo }) => {
@@ -255,6 +254,15 @@ defineExpose({
             :getLabel="getLabel"
           />
         </ElFormItem>
+
+        
+
+        <ElFormItem label="业务类型" :required="true">
+          <ElSelect v-model="isComon">
+            <ElOption label="采购订单" value="0" />
+            <ElOption label="源头订单" value="2" />
+          </ElSelect>
+        </ElFormItem>
       </div>
 
       <ElFormItem
@@ -270,6 +278,7 @@ defineExpose({
           :totalCommonPrice="totalCommonPrice"
           :totalCommonCount="totalCommonCount"
           :purchaseOrders="purchaseOrders"
+          :isComon="isComon"
           @delete="handleDeletePurchaseOrders"
           @push="uniquePurchaseOrders"
           @edit="handleEditPurchaseOrders"
@@ -298,6 +307,7 @@ defineExpose({
       :totalCommonCount="totalCommonCount"
       :readonly="readonly"
       :isPurchPay="isPurchPay"
+      :isComon="isComon"
       :purchaseOrders="purchaseOrders"
       @delete="handleDeletePurchaseOrders"
       @push="uniquePurchaseOrders"

+ 1 - 0
src/layout/components/help-modal.vue

@@ -230,6 +230,7 @@ defineExpose({
     append-to-body
   >
     <ElRow>
+      <h1>测试是否正常更新</h1>
       <ElCol :span="24">
         <h2>
           1.发票查验必填字段说明(适用于销售开票、销售退票、对账发票上传业务)。

+ 1 - 1
src/layout/components/navbar.vue

@@ -173,7 +173,6 @@ async function onSwitchAccountMode() {
     />
 
     <mixNav v-if="pureApp.layout === 'mix'" />
-
     <div v-if="pureApp.layout === 'vertical'" class="vertical-header-right">
       <!-- 公司名称筛选 -->
       <Super v-if="isSuperUser" ref="SuperCompanyRef" />
@@ -410,3 +409,4 @@ async function onSwitchAccountMode() {
   cursor: pointer;
 }
 </style>
+./nav../components/sidebar/mixNav.vue../components/sidebar/hamBurger.vue../components/sidebar/breadCrumb.vue../components/system-notify.vue../components/help-modal.vue

+ 1 - 0
src/layout/index.vue

@@ -278,3 +278,4 @@ const layoutHeader = defineComponent({
   margin-top: 12px;
 }
 </style>
+./hooks/navbar.vue

+ 1 - 0
src/utils/details/_purchase/index.ts

@@ -7,5 +7,6 @@ export { ticketReturnReliveColumns, sendTicketReturnReliveColumns } from "./tick
 export {
   purchaseOrderColumns,
   purchaseOrderNotIncludeProduceColumns,
+  purchaseOrderNotIncludeProduceChildColumns,
   purchaseOrderProduceColumns
 } from "./porder";

+ 222 - 4
src/utils/details/_purchase/porder.ts

@@ -3,7 +3,7 @@
  */
 
 import { h } from "vue";
-import { ElTag } from "element-plus";
+import { ElTable, ElTableColumn, ElTag } from "element-plus";
 import { createTooltip } from "/@/utils/tootip";
 import { DescriptionColumns } from "/@/components/BasicDescriptions";
 
@@ -11,7 +11,8 @@ import {
   cg_order_type_options,
   cg_order_source_options,
   send_status_list,
-  sendStatusOptions
+  sendStatusOptions,
+  orderTypeCgOptions
 } from "/@/utils/status";
 
 export const PURCHASE_STATUS = [
@@ -153,6 +154,7 @@ export const purchaseOrderNotIncludeProduceColumns: DescriptionColumns = [
   {
     label: "对账状态",
     field: "status",
+    span: 8,
     render(type) {
       return h(ElTag, null, {
         default: () => PURCHASE_STATUS.find(c => c.value == type)?.label
@@ -162,6 +164,7 @@ export const purchaseOrderNotIncludeProduceColumns: DescriptionColumns = [
   {
     label: "订单来源",
     field: "cgdSource",
+    span: 8,
     render(type) {
       return h(ElTag, null, {
         default: () => cg_order_source_options.find(c => c.value == type)?.label
@@ -171,7 +174,7 @@ export const purchaseOrderNotIncludeProduceColumns: DescriptionColumns = [
   {
     label: "商品类型",
     field: "cgdType",
-    span: 4,
+    span: 8,
     render(type) {
       return h(ElTag, null, {
         default: () => cg_order_type_options.find(c => c.value == type)?.label
@@ -191,7 +194,201 @@ export const purchaseOrderNotIncludeProduceColumns: DescriptionColumns = [
   {
     label: "销售单发货状态",
     field: "qrdSend",
-    span: 4,
+    span: 8,
+    render(data) {
+      return h(ElTag, null, {
+        default: () => send_status_list.find(c => c.value == data)?.label
+      });
+    }
+  },
+  {
+    label: "商品数量",
+    field: "goodNum"
+  },
+  {
+    label: "已发货数量",
+    field: "sendNum"
+  },
+  {
+    label: "未发货数量",
+    field: "wsendNum"
+  },
+  {
+    label: "退货数量",
+    field: "thNum"
+  },
+  {
+    label: "备库编码",
+    field: "bkCode"
+  },
+  {
+    label: "备库人员",
+    field: "bkCreater"
+  },
+  // {
+  //   label: "发货方式",
+  //   field: "sendType",
+  //   render(sendType) {
+  //     return h(ElTag, null, {
+  //       default: () => cgd_send_type.find(c => c.value == sendType + "")?.label
+  //     });
+  //   }
+  // },
+  {
+    label: "支付方式",
+    field: "pay_type",
+    span: 6
+  },
+  {
+    label: "核算码",
+    field: "fundCode",
+    span: 6
+  },
+  {
+    label: "分类",
+    span: 12,
+    field: "cat",
+    render(_, { firstCat, secCat, thirdCat }) {
+      return h(ElTag, null, {
+        default: () => firstCat + "_" + secCat + "_" + thirdCat
+      });
+    }
+  },
+  {
+    label: "品牌",
+    span: 12,
+    field: "goodBrand"
+  },
+  {
+    label: "单位",
+    field: "goodUnit"
+  },
+
+  {
+    label: "税率",
+    field: "tax"
+  },
+  {
+    label: "单价",
+    field: "goodPrice"
+  },
+
+  {
+    label: "总价",
+    field: "totalPrice"
+  },
+  {
+    label: "工艺描述",
+    span: 24,
+    field: "goodDesc"
+  },
+  {
+    label: "备注",
+    span: 24,
+    field: "remark"
+  }
+];
+
+
+export const purchaseOrderNotIncludeProduceChildColumns: DescriptionColumns = [
+  {
+    label: "采购单编码",
+    field: "sequenceNo",
+    span: 6
+  },
+  {
+    label: "销售订单编码",
+    field: "qrdCode",
+    span: 6
+  },
+  {
+    label: "采购员",
+    field: "ownerName",
+    span: 6,
+    labelWidth: "80",
+    render: (ownerName, { department }) =>
+      createTooltip(ownerName, "部门: " + department, 260)
+  },
+  {
+    label: "采购时间",
+    span: 6,
+    field: "createdTime"
+  },
+  {
+    label: "买入方公司",
+    field: "companyName",
+    span: 12,
+    render: (companyName, { companyNo }) =>
+      createTooltip(companyName, "业务企业公司编码 : " + companyNo, 300)
+  },
+  {
+    label: "卖出方公司",
+    span: 12,
+    field: "supplierName",
+    render: (supplierName, { supplierNo }) =>
+      createTooltip(supplierName, "供应商编码 : " + supplierNo, 300)
+  },
+  {
+    label: "商品名称",
+    field: "goodName",
+    span: 24,
+    render: (goodName, { goodNo }) =>
+      createTooltip(goodName, "商品编码 : " + goodNo, 260)
+  },
+  {
+    label: "对账状态",
+    field: "status",
+    span: 8,
+    render(type) {
+      return h(ElTag, null, {
+        default: () => PURCHASE_STATUS.find(c => c.value == type)?.label
+      });
+    }
+  },
+  {
+    label: "订单来源",
+    field: "cgdSource",
+    span: 8,
+    render(type) {
+      return h(ElTag, null, {
+        default: () => cg_order_source_options.find(c => c.value == type)?.label
+      });
+    }
+  },
+  {
+    label: "商品类型",
+    field: "cgdType",
+    span: 8,
+    render(type) {
+      return h(ElTag, null, {
+        default: () => cg_order_type_options.find(c => c.value == type)?.label
+      });
+    }
+  },
+  {
+    label: "业务类型",
+    field: "is_comon",
+    span: 8,
+    render(data) {
+      return h(ElTag, null, {
+        default: () => orderTypeCgOptions.find(c => c.value == data)?.label
+      });
+    }
+  },
+  {
+    label: "入库状态",
+    field: "sendStatus",
+    span: 8,
+    render(type) {
+      return h(ElTag, null, {
+        default: () => sendStatusOptions.find(c => c.value == type)?.label
+      });
+    }
+  },
+  {
+    label: "销售单发货状态",
+    field: "qrdSend",
+    span: 8,
     render(data) {
       return h(ElTag, null, {
         default: () => send_status_list.find(c => c.value == data)?.label
@@ -283,6 +480,27 @@ export const purchaseOrderNotIncludeProduceColumns: DescriptionColumns = [
     label: "备注",
     span: 24,
     field: "remark"
+  },
+  {
+    label: "子商品信息",
+    span: 24,
+    render(_,context){
+      return h(ElTable, {
+        data: context.child,
+        border: true,
+        size: "small",
+        style: { width: "100%" }
+      },[
+        h(ElTableColumn, {
+          label: "子商品编码",
+          prop: "spuCode"
+        }),
+        h(ElTableColumn, {
+          label: "子商品名称",
+          prop: "good_name"
+        })
+      ]);
+    }
   }
 ];
 

+ 11 - 3
src/utils/status.ts

@@ -50,7 +50,8 @@ const cg_order_source_options = [
   { value: "7", label: "报备转单" },
   { value: "8", label: "支付渠道" },
   { value: "9", label: "采销录单" },
-  { value: "10", label: "结算录单" }
+  { value: "10", label: "结算录单" },
+  // { value: "11", label: "竞价转单" }
 ];
 
 const xs_order_source_options = [
@@ -64,7 +65,8 @@ const xs_order_source_options = [
   { value: "7", label: "报备转单" },
   { value: "8", label: "支付渠道" },
   { value: "9", label: "采销录单" },
-  { value: "10", label: "结算录单" }
+  { value: "10", label: "结算录单" },
+  // { value: "11", label: "竞价转单" }
 ];
 
 export const inv_type_ls_cg = [
@@ -306,7 +308,13 @@ export const orderTypeOptions = [
 
 export const orderTypeCgOptions = [
   { value: '0', label: '采购订单' },
-  { value: '1', label: '通用订单' }
+  { value: '1', label: '通用订单' },
+  { value: '2', label: '源头订单' }
+]
+
+export const orderTypeCgOptions_2 = [
+  { value: '0', label: '采购订单' },
+  { value: '2', label: '源头订单' }
 ]
 
 

+ 18 - 0
src/views/InvoiceSaleSettings/_component/execl-files-upload/index.vue

@@ -14,6 +14,9 @@ import {
 } from "./columns-config";
 import { useRenderIcon } from "/@/components/ReIcon/src/hooks";
 
+import { useCompany } from "/@/hooks/core/useCompany";
+
+const company = useCompany();
 const visible = ref(false);
 const loading = ref(false);
 const tableData = ref([]);
@@ -92,6 +95,21 @@ const Uploadsuccess = ({ results, header }) => {
       tableData.value.push(model);
     }
 
+
+    const names = [... new Set(tableData.value.map(({ value3 }) => value3))]
+    if (names.length !== 1) {
+      ElMessage.error('上传的买入方公司必须一致')
+      tableData.value = []
+      return
+    } else {
+      if (names[0] !== company.currentCompany.value.companyName) {
+        ElMessage.error('上传的买入方公司与当前选择公司必须一致')
+        tableData.value = []
+        loading.value = false;
+        return
+      }
+    }
+
     loading.value = false;
   } catch (err) {
     return err;

+ 18 - 0
src/views/InvoiceSaleSettings/_component/procure-import/index.vue

@@ -13,6 +13,10 @@ import {
   requireHeaders
 } from "./columns-config";
 import { useRenderIcon } from "/@/components/ReIcon/src/hooks";
+import { useCompany } from "/@/hooks/core/useCompany";
+
+
+const company = useCompany()
 
 const visible = ref(false);
 const loading = ref(false);
@@ -71,6 +75,20 @@ const Uploadsuccess = ({ results, header }) => {
       tableData.value.push(model);
     }
 
+    const names = [... new Set(tableData.value.map(({ value3 }) => value3))]
+    if (names.length !== 1) {
+      ElMessage.error('上传的买入方公司必须一致')
+      tableData.value = []
+      return
+    } else {
+      if (names[0] !== company.currentCompany.value.companyName) {
+        ElMessage.error('上传的买入方公司与当前选择公司必须一致')
+        tableData.value = []
+        loading.value = false;
+        return
+      }
+    }
+
     loading.value = false;
   } catch (err) {
     return err;

+ 10 - 4
src/views/InvoiceSaleSettings/commodityCost/config/configs.ts

@@ -117,16 +117,22 @@ export const good_detail_columns = [
   {
     field: "companyName",
     label: "业务公司名称",
-    render: (companyName, { companyNo }) =>
+    render: (_, { companyNo, companyName }) =>
       createTooltip(companyName, "业务公司编码 : " + companyNo, 270),
-    span: 12
+    span: 8
   },
   {
     field: "supplierName",
     label: "供应商名称",
-    render: (supplierName, { supplierNo }) =>
+    render: (_, { supplierNo, supplierName }) =>
       createTooltip(supplierName, "供应商编码 : " + supplierNo, 270),
-    span: 12
+    span: 8
+  },
+  {
+    label: "源头供应商",
+    render: (_, { cgd_supplierNo, cgd_supplierName }) =>
+      createTooltip(cgd_supplierName, "供应商编码 : " + cgd_supplierNo, 270),
+    span: 8
   },
 
   {

+ 1 - 1
src/views/InvoiceSaleSettings/commodityCost/index.vue

@@ -142,7 +142,7 @@ async function handleExportPage() {
     onStart: () => (_loading.value = true),
     onSuccess: () => (_loading.value = false),
     onFail: () => (_loading.value = false),
-    params: { isZx: 0, ...params, companyNo: currentCompany.value.companyNo },
+    params: { isZx: 0, ...params, companyNo: currentCompany.value.companyNo , isChild: 0},
     admin: false
   });
 }

+ 215 - 0
src/views/InvoiceSaleSettings/consultingChildCost/config/configs.ts

@@ -0,0 +1,215 @@
+import { h } from "vue";
+import { ElImage, ElTag } from "element-plus";
+import { createTooltip } from "/@/utils/tootip";
+
+export const good_type = [
+  {
+    value: "0",
+    label: "待采购设置税务类目"
+  },
+  {
+    value: "1",
+    label: "待财务设置税务类目"
+  },
+  {
+    value: "2",
+    label: "税务类目设置完成"
+  }
+];
+
+export const stock_type = [
+  {
+    value: "0",
+    label: "非库存商品"
+  },
+  {
+    value: "1",
+    label: "库存商品"
+  }
+];
+
+//类目新增校验规则
+export const cost_rules = {
+  cat_code: [{ required: true, trigger: "change", message: "请选择类目" }],
+  inv_tag: [{ required: true, trigger: "change", message: "请选择税率标识" }],
+  is_discount: [
+    { required: true, trigger: "change", message: "请选择是否包含优惠政策" }
+  ],
+  inv_good_name: [
+    { required: true, trigger: "change", message: "请选择商品名称" }
+  ],
+  tax: [{ required: true, trigger: "change", message: "请选择税率" }],
+  addTax: [
+    { required: true, trigger: "change", message: "请选择增值税管理内容" }
+  ]
+};
+
+export const good_detail_columns = [
+  {
+    field: "spuCode",
+    span: 6,
+    label: "商品编码"
+  },
+  {
+    field: "good_name",
+    span: 18,
+    label: "商品名称"
+  },
+  {
+    field: "is_stock",
+    label: "商品类型",
+    span: 6,
+    render(stock, { isZx, is_stock }) {
+      return h(ElTag, null, {
+        default: () => Number(isZx) == 1 ? "反馈商品" : stock_type.find(({ value }) => value === String(is_stock))?.label || "--"
+      });
+    }
+  },
+  {
+    field: "good_img",
+    label: "商品图",
+    span: 18,
+    render(imgSrc) {
+      return imgSrc.split(",").map(src =>
+        h(ElImage, {
+          src,
+          previewSrcList: [src],
+          style: {
+            height: "20px",
+            marginRight: "5px"
+          }
+        })
+      );
+    }
+  },
+  {
+    field: "cgd_inv_good_name",
+    span: 24,
+    label: "采购开票商品名称"
+  },
+  {
+    field: "cgd_inv_cat_name",
+    label: "采购类目名称",
+    span: 12
+  },
+  {
+    field: "cgd_inv_cat_code",
+    label: "采购类目编码"
+  },
+  {
+    field: "cgd_inv_tax",
+    label: "采购类目税率额"
+  },
+  {
+    field: "inv_good_name",
+    span: 24,
+    label: "财务开票商品名称"
+  },
+  {
+    field: "inv_cat_name",
+    label: "财务类目名称",
+    span: 12
+  },
+  {
+    field: "inv_cat_code",
+    label: "财务类目编码"
+  },
+  {
+    field: "inv_tax",
+    label: "财务类目税率额"
+  },
+  {
+    field: "companyName",
+    label: "业务公司名称",
+    render: (_, { companyNo, companyName }) =>
+      createTooltip(companyName, "业务公司编码 : " + companyNo, 270),
+    span: 8
+  },
+  {
+    field: "supplierName",
+    label: "供应商名称",
+    render: (_, { supplierNo, supplierName }) =>
+      createTooltip(supplierName, "供应商编码 : " + supplierNo, 270),
+    span: 8
+  },
+  {
+    label: "源头供应商",
+    render: (_, { cgd_supplierNo, cgd_supplierName }) =>
+      createTooltip(cgd_supplierName, "供应商编码 : " + cgd_supplierNo, 270),
+    span: 8
+  },
+  {
+    field: "cat_name",
+    span: 12,
+    label: "分类名称"
+  },
+  {
+    field: "unit_name",
+    label: "单位名称"
+  },
+  {
+    field: "status",
+    label: "状态",
+    render(status) {
+      return h(
+        ElTag,
+        {
+          type: status === "2" ? "success" : ""
+        },
+        {
+          default: () => good_type.find(s => s.value === String(status))?.label
+        }
+      );
+    }
+  },
+  {
+    field: "creater",
+    label: "创建人",
+    span: 12,
+  },
+  {
+    field: "addtime",
+    label: "申请时间",
+    span: 12,
+  },
+  {
+    field: "after_sales",
+    span: 24,
+    label: "售后说明"
+  },
+  {
+    field: "craft_desc",
+    span: 24,
+    label: "工艺说明"
+  }
+];
+
+export const inv_tag = [
+  {
+    value: "0",
+    label: "非零税率"
+  },
+  {
+    value: "1",
+    label: "免税"
+  },
+  {
+    value: "2",
+    label: "不征税"
+  },
+  {
+    value: "3",
+    label: "零税率"
+  }
+];
+
+export const add_tax = [
+  {
+    value: "免税",
+    label: "免税"
+  },
+  {
+    value: "不征税",
+    label: "不征税"
+  }
+];

+ 147 - 0
src/views/InvoiceSaleSettings/consultingChildCost/config/content.config.ts

@@ -0,0 +1,147 @@
+import { ContentConfig } from "/@/components/PageContent";
+import { httpList } from "/@/api/InvoiceSaleSettings/consultingCost";
+
+import { h } from "vue";
+import dayjs from "dayjs";
+import { ElImage, ElTag } from "element-plus";
+import { good_type } from "./configs";
+import { renderIconLabelLeft } from "/@/utils/columnRenderHelper";
+
+function renderGoodImage(imgSrc: string) {
+  const imgs = imgSrc.split(",");
+  return h(ElImage, {
+    src: imgs[0],
+    previewTeleported: true,
+    previewSrcList: [imgs[0]],
+    style: {
+      height: "20px",
+      width: "20px"
+    }
+  });
+}
+
+const columns = [
+  {
+    type: "selection",
+    width: 40,
+    align: "center"
+  },
+  {
+    label: "商品编码",
+    prop: "spuCode",
+    width: 150
+  },
+  {
+    label: "卖出方公司",
+    prop: "cgd_supplierName",
+    width: 175,
+    ...renderIconLabelLeft("cgd_supplierNo", "cgd_supplierName", "卖出方公司编码:")
+  },
+  {
+    label: "买入方公司",
+    prop: "supplierName",
+    width: 195,
+    ...renderIconLabelLeft("supplierNo", "supplierName", "买入方公司编码:")
+  },
+  {
+    label: "商品名称",
+    prop: "good_name",
+    minWidth: 195
+  },
+  {
+    label: "主图",
+    prop: "good_img",
+    width: 55,
+    cellRenderer: ({ row }) => renderGoodImage(row.good_img)
+  },
+  {
+    label: "采购类目编码",
+    width: 155,
+    prop: "cgd_inv_cat_code"
+  },
+  {
+    label: "采购类目名称",
+    width: 120,
+    prop: "cgd_inv_cat_name"
+  },
+  {
+    label: "采购开票商品名称",
+    prop: "cgd_inv_good_name",
+    width: 165
+  },
+  {
+    label: "财务类目编码",
+    width: 155,
+    prop: "inv_cat_code"
+  },
+  {
+    label: "财务类目名称",
+    width: 120,
+    prop: "inv_cat_name"
+  },
+  {
+    label: "财务开票商品名称",
+    prop: "inv_good_name",
+    width: 165
+  },
+  {
+    label: "状态",
+    prop: "status",
+    width: 150,
+    cellRenderer: ({ row }) => {
+      return h(
+        ElTag,
+        {
+          type: row.status === "2" ? "success" : ""
+        },
+        {
+          default: () =>
+            good_type.find(t => t.value === String(row.status))?.label
+        }
+      );
+    }
+  },
+  {
+    label: "增值税管理内容",
+    prop: "addTax",
+    width: "140px"
+  },
+  {
+    label: "创建时间",
+    prop: "createTime",
+    width: 140,
+    formatter: ({ addtime }) => dayjs(addtime).format("YYYY-MM-DD HH:mm:ss")
+  },
+  {
+    label: "创建人",
+    width: 80,
+    prop: "creater"
+  },
+  {
+    label: "操作",
+    fixed: "right",
+    width: 80,
+    slot: "operation"
+  }
+];
+
+const contentConfig: ContentConfig = {
+  title: "销售成本类目设置",
+  superUserNoPerview: true,
+  columns,
+  transformField: 'origin_supplierNo',
+  apis: {
+    httpList: (params = {}) => {
+      const { supplierNo, origin_supplierNo, ...rest } = params
+      return httpList({
+        ...rest,
+        isChild: 1,
+        supplierNo: origin_supplierNo,
+        cgd_supplierNo: supplierNo,
+        noRela: true
+      })
+    }
+  }
+};
+
+export default contentConfig;

+ 40 - 0
src/views/InvoiceSaleSettings/consultingChildCost/config/modal.config.ts

@@ -0,0 +1,40 @@
+import { ModalConfig } from "../../../../components/PageModal/src/types";
+
+const modalConfig: ModalConfig = {
+  title: "客户",
+  itemStyle: {},
+  formItems: [
+    {
+      field: "companyNo",
+      type: "input",
+      label: "客户编码",
+      labelWidth: "120px"
+    },
+    {
+      field: "companyName",
+      type: "input",
+      labelWidth: "120px",
+      label: "客户名称"
+    },
+    {
+      field: "parent",
+      type: "input",
+      labelWidth: "120px",
+      label: "归属集团"
+    },
+    {
+      field: "contactor",
+      type: "input",
+      labelWidth: "120px",
+      label: "联系人"
+    },
+    {
+      field: "createTime",
+      type: "input",
+      labelWidth: "120px",
+      label: "创建时间"
+    }
+  ]
+};
+
+export default modalConfig;

+ 45 - 0
src/views/InvoiceSaleSettings/consultingChildCost/config/search.config.ts

@@ -0,0 +1,45 @@
+import { good_type } from "./configs";
+import { FormConfig } from "/@/components/PageSearch";
+
+const searchFormConfig: FormConfig = {
+  formItems: [
+    {
+      field: "group",
+      type_field: "group_type",
+      type: "input_group",
+      otherOptions: {
+        inputGroupOptions: [
+          { value: "spuCode", label: "商品编码" },
+          { value: "good_name", label: "商品名称" },
+          // { value: "supplierNo", label: "卖方公司编码" },
+          // { value: "supplierName", label: "卖方公司名称" },
+          { value: "creater", label: "创建人" }
+        ]
+      }
+    },
+    {
+      field: "timer",
+      type: "date_picker",
+      trigger: 'change',
+      otherOptions: {
+        type: "daterange",
+        startProp: "start",
+        endProp: "end",
+        startPlaceholder: "开始日期",
+        endPlaceholder: "结束日期"
+      }
+    },
+    {
+      field: "supplierNo",
+      type: "supplier-query"
+    },
+    {
+      field: "status",
+      type: "select",
+      placeholder: "状态",
+      options: good_type
+    }
+  ]
+};
+
+export default searchFormConfig;

+ 34 - 0
src/views/InvoiceSaleSettings/consultingChildCost/detail.vue

@@ -0,0 +1,34 @@
+<script setup lang="ts">
+import { computed, onMounted, ref } from "vue";
+import BasicSettings from "../basic-settings.vue";
+import { good_detail_columns } from "./config/configs";
+import { useResponseHandle } from "/@/hooks";
+import { useRoute } from "vue-router";
+
+import {
+  type IGoodDetail,
+  httpDetail
+} from "/@/api/InvoiceSaleSettings/commodityCost";
+
+const { query } = useRoute();
+const spuCode = computed(() => query.id);
+const goodDetail = ref<IGoodDetail | null>(null);
+const responseHandle = useResponseHandle();
+
+//请求商品详情
+async function requesetGoodDetail() {
+  const { code, message, data } = await httpDetail({ spuCode: spuCode.value });
+  responseHandle({
+    code,
+    message,
+    handler: () => (goodDetail.value = data)
+  });
+}
+
+onMounted(() => requesetGoodDetail());
+</script>
+
+<template>
+  <BasicSettings title="咨询成交子商品类目设置" back-route="/InvoiceSaleSettings/consultingChildCost" :detail="goodDetail"
+    :columns="good_detail_columns" @refresh="requesetGoodDetail()" pageName="consultingChildCostDetail" />
+</template>

+ 192 - 0
src/views/InvoiceSaleSettings/consultingChildCost/index.vue

@@ -0,0 +1,192 @@
+<script setup lang="ts">
+import { ref } from "vue";
+import { useRouter } from "vue-router";
+import { PageSearch, usePageSearch } from "/@/components/PageSearch";
+import { PageContent } from "/@/components/PageContent";
+import searchFormConfig from "./config/search.config";
+import contentConfig from "./config/content.config";
+import PagePower from "/@/components/PagePower/PagePower.vue";
+import { usePermission } from "/@/hooks/core/usePermission";
+import { useRenderIcon } from "/@/components/ReIcon/src/hooks";
+import ExeclUploadModal from "./../_component/execl-files-upload/index.vue";
+import ProcureImport from "./../_component/procure-import/index.vue";
+import { template, procureTemplate } from "./../_config/xls-template";
+import { utils, writeFile } from "xlsx";
+import { ElMessage } from "element-plus";
+import { useUserInfo } from "/@/hooks/core/useUser";
+import { httpSupplierList } from "/@/api/supplierManage/supplierAccoutManage";
+
+import { httpRequsetExport } from "/@/utils/export";
+
+import dayjs from "dayjs"
+import { useCompany } from "/@/hooks/core/useCompany";
+
+const execlUploadModalRef = ref<InstanceType<typeof ExeclUploadModal>>(null);
+const procureUploadModalRef = ref<InstanceType<typeof ProcureImport>>(null);
+
+const { permissions, hasPermissionWithCode } = usePermission("consultingChildCost");
+const selects = ref([]);
+
+const { pageContentRef, handleResetClick, handleSearchClick } = usePageSearch(
+  undefined,
+  undefined,
+  searchFormConfig
+);
+const { push } = useRouter();
+const { isSuperUser } = useUserInfo();
+
+const { currentCompany } = useCompany()
+
+function toDetail(spuCode) {
+  push({
+    path: "/InvoiceSaleSettings/consultingChildCostDetail",
+    query: { id: spuCode }
+  });
+}
+
+const mapTag = {
+  "1": "免税",
+  "2": "不征税",
+  "3": "零税率"
+};
+
+const mapDiscount = {
+  "1": "是",
+  "0": "否"
+};
+
+function onDownloadTemplate(isProcure = false) {
+  if (selects.value.length === 0) {
+    ElMessage.warning("请选择至少一个商品");
+    return;
+  }
+
+  const judieTemplate = isProcure ? procureTemplate : template
+  const judieFilename = isProcure ? "批量设置采购类目模板" : "批量设置财务类目模板"
+
+  const data: any[] = [];
+  selects.value.forEach((item) => {
+    const _template = { ...judieTemplate }; 
+
+    if (isProcure) { // 采购
+      _template["商品编码"] = item.spuCode;
+      _template["商品名称"] = item.good_name;
+      _template["买入方公司编码"] = item.supplierNo;
+      _template["买入方公司名称"] = item.supplierName;
+      _template["卖出方公司编码"] = item.cgd_supplierNo;
+      _template["卖出方公司名称"] = item.cgd_supplierName;
+      _template["开票商品名称"] = item.cgd_inv_good_name;
+    } else {  // 财务
+      _template["商品编码"] = item.spuCode;
+      _template["商品名称"] = item.good_name;
+      _template["买入方公司编码"] = item.supplierNo;
+      _template["买入方公司名称"] = item.supplierName;
+      _template["卖出方公司编码"] = item.cgd_supplierNo;
+      _template["卖出方公司名称"] = item.cgd_supplierName;
+      _template["采购类目编码"] = item.cgd_inv_cat_code;
+      _template['采购类目名称'] = item.cgd_inv_cat_name;
+      _template["采购开票商品名称"] = item.cgd_inv_good_name;
+      _template['采购税率'] = item.cgd_inv_tax ? (((item.cgd_inv_tax.split("%"))[0]) / 100).toFixed(2) : "";
+      _template['财务类目编码'] = item.inv_cat_code;
+      _template['财务类目名称'] = item.inv_cat_name;
+      _template['财务开票商品名称'] = item.inv_good_name;
+      _template['财务税率'] = item.inv_tax ? (((item.inv_tax.split("%"))[0]) / 100).toFixed(2) : ""
+
+      _template['税率标识'] = item.inv_tag && item.inv_tag !== "0" ? mapTag[item.inv_tag] : "";
+      _template["是否有优惠政策"] = Number(item.status) >= 2 ? mapDiscount[item.is_discount] : "";
+      _template["增值税管理内容"] = item.addTax;
+    }
+
+    data.push(_template);
+  });
+
+  //创建数据表
+  const workBook = utils.book_new();
+  const workSheet = utils.json_to_sheet(data);
+  utils.book_append_sheet(workBook, workSheet, "sheet");
+
+  //导出模板
+  writeFile(workBook, `${judieFilename}.xlsx`, {
+    bookType: "xlsx"
+  });
+}
+
+const _loading = ref(false);
+async function handleExportPage() {
+  const params = pageContentRef.value.getBasicParams();
+  if (!params.start || !params.end) {
+    ElMessage.warning('请选择导出的时间区间')
+    return
+  }
+
+  const start = dayjs(params.start);
+  const end = dayjs(params.end);
+  const diffDay = start.diff(end, 'days')
+  const startDays = start.daysInMonth();
+  const endDays = end.daysInMonth();
+
+  // const supplierNo 
+  const { data } = await httpSupplierList({ name: currentCompany.value?.companyName })
+  const item = currentCompany.value?.companyName ? data.list.find(item => item.name === currentCompany.value?.companyName) || {} : {};
+  const transCompany = item.code;
+
+  if (Math.abs(diffDay) > (startDays + endDays)) {
+    ElMessage.warning('导出的时间区间不能超过两个月')
+    return
+  }
+
+  await httpRequsetExport({
+    url: "/admin/good/export",
+    name: "咨询成交类目",
+    onStart: () => (_loading.value = true),
+    onSuccess: () => (_loading.value = false),
+    onFail: () => (_loading.value = false),
+    params: { isZx: 1, ...params, supplierNo: transCompany, isChild: 1, noRela: true },
+    admin: false
+  });
+}
+</script>
+
+<template>
+  <div class="main role">
+    <PagePower :is-show="hasPermissionWithCode('001')">
+      <div w-full>
+        <PageSearch :form-config="searchFormConfig" @search-btn-click="handleSearchClick"
+          @reset-btn-click="handleResetClick" />
+
+        <PageContent ref="pageContentRef" :powers="permissions" :content-config="contentConfig"
+          @preview-btn-click="({ spuCode }) => toDetail(spuCode)" @selection-change="nodes => (selects = nodes)">
+          <template #header>
+            <ElButton size="small" v-if="hasPermissionWithCode('041')" :icon="useRenderIcon('arrow-down-line')"
+              @click="() => onDownloadTemplate(true)">下载采购设置类目模板</ElButton>
+
+            <ElButton size="small" type="primary" v-if="hasPermissionWithCode('042') && !isSuperUser"
+              :icon="useRenderIcon('arrow-up-line')" @click="() => procureUploadModalRef.onDisplay()">批量导入采购设置类目结果
+            </ElButton>
+
+            <ElButton size="small" v-if="hasPermissionWithCode('036')" :icon="useRenderIcon('arrow-down-line')"
+              @click="() => onDownloadTemplate()">下载财务设置类目模板</ElButton>
+
+            <ElButton size="small" type="primary" :icon="useRenderIcon('arrow-up-line') "
+              v-if="hasPermissionWithCode('037') && !isSuperUser" @click="() => execlUploadModalRef.onDisplay()">
+              批量导入财务设置类目结果</ElButton>
+
+            <ElButton type="primary" @click="handleExportPage" size="small" v-if="hasPermissionWithCode('048')"
+              :loading="_loading">导出
+            </ElButton>
+          </template>
+        </PageContent>
+
+        <ExeclUploadModal ref="execlUploadModalRef" @on-success="() => pageContentRef.onSearch()" />
+
+        <ProcureImport ref="procureUploadModalRef" @on-success="() => pageContentRef.onSearch()" />
+      </div>
+    </PagePower>
+  </div>
+</template>
+
+<style scoped lang="scss">
+:deep(.el-dropdown-menu__item i) {
+  margin: 0;
+}
+</style>

+ 10 - 5
src/views/InvoiceSaleSettings/consultingCost/config/configs.ts

@@ -121,18 +121,23 @@ export const good_detail_columns = [
   {
     field: "companyName",
     label: "业务公司名称",
-    render: (companyName, { companyNo }) =>
+    render: (_, { companyNo, companyName }) =>
       createTooltip(companyName, "业务公司编码 : " + companyNo, 270),
-    span: 12
+    span: 8
   },
   {
     field: "supplierName",
     label: "供应商名称",
-    render: (supplierName, { supplierNo }) =>
+    render: (_, { supplierNo, supplierName }) =>
       createTooltip(supplierName, "供应商编码 : " + supplierNo, 270),
-    span: 12
+    span: 8
+  },
+  {
+    label: "源头供应商",
+    render: (_, { cgd_supplierNo, cgd_supplierName }) =>
+      createTooltip(cgd_supplierName, "供应商编码 : " + cgd_supplierNo, 270),
+    span: 8
   },
-
   {
     field: "cat_name",
     span: 12,

+ 1 - 1
src/views/InvoiceSaleSettings/consultingCost/config/content.config.ts

@@ -130,7 +130,7 @@ const contentConfig: ContentConfig = {
   superUserNoPerview: true,
   columns,
   apis: {
-    httpList
+    httpList: (params = {}) => httpList({ ...params, isChild: 0 })
   }
 };
 

+ 9 - 9
src/views/InvoiceSaleSettings/consultingCost/index.vue

@@ -70,18 +70,18 @@ function onDownloadTemplate(isProcure = false) {
     if (isProcure) { // 采购
       _template["商品编码"] = item.spuCode;
       _template["商品名称"] = item.good_name;
-      _template["买入方公司编码"] = item.companyNo;
-      _template["买入方公司名称"] = item.companyName;
-      _template["卖出方公司编码"] = item.supplierNo;
-      _template["卖出方公司名称"] = item.supplierName;
+      _template["买入方公司编码"] = item.supplierNo;
+      _template["买入方公司名称"] = item.supplierName;
+      _template["卖出方公司编码"] = item.cgd_supplierNo;
+      _template["卖出方公司名称"] = item.cgd_supplierName;
       _template["开票商品名称"] = item.cgd_inv_good_name;
     } else {  // 财务
       _template["商品编码"] = item.spuCode;
       _template["商品名称"] = item.good_name;
-      _template["买入方公司编码"] = item.companyNo;
-      _template["买入方公司名称"] = item.companyName;
-      _template["卖出方公司编码"] = item.supplierNo;
-      _template["卖出方公司名称"] = item.supplierName;
+      _template["买入方公司编码"] = item.supplierNo;
+      _template["买入方公司名称"] = item.supplierName;
+      _template["卖出方公司编码"] = item.cgd_supplierNo;
+      _template["卖出方公司名称"] = item.cgd_supplierName;
       _template["采购类目编码"] = item.cgd_inv_cat_code;
       _template['采购类目名称'] = item.cgd_inv_cat_name;
       _template["采购开票商品名称"] = item.cgd_inv_good_name;
@@ -135,7 +135,7 @@ async function handleExportPage() {
     onStart: () => (_loading.value = true),
     onSuccess: () => (_loading.value = false),
     onFail: () => (_loading.value = false),
-    params: { isZx: 1, ...params,companyNo:currentCompany.value.companyNo },
+    params: { isZx: 1, ...params, companyNo: currentCompany.value.companyNo, isChild: 0 },
     admin: false
   });
 }

+ 1 - 1
src/views/InvoiceSales/capitalClaim/config/configs.ts

@@ -239,7 +239,7 @@ export const sale_columns = [
   },
   {
     label: "销售订单主编码",
-    prop: "cxCode",
+    field: "cxCode",
     width: 160,
     align: "left"
   },

+ 2 - 4
src/views/InvoiceSales/capitalClaim/index.vue

@@ -279,12 +279,10 @@ async function onDownloadOpenInv() {
                     link
                   />
                   <el-popconfirm
-                    v-if="
-                      hasPermissionWithCode('009') && String(row.status) === '1'
-                    "
+                    v-if="hasPermissionWithCode('009') && String(row.status) === '1'"
                     placement="top"
                     title="是否确认撤销资金认领?"
-                    :on-confirm="() => handleWithDraw({ logNo: row.logNo })"
+                    @confirm="() => handleWithDraw({ logNo: row.logNo })"
                   >
                     <template #reference>
                       <el-button

+ 20 - 6
src/views/purchase/porder/components/purchase-modal.vue

@@ -1,15 +1,28 @@
 <script setup lang="ts">
-import { ref } from "vue";
+import { ref, computed } from "vue";
 import BasicDescriptions from "/@/components/BasicDescriptions";
-import { purchaseOrderNotIncludeProduceColumns } from "/@/utils/details/_purchase";
+import { purchaseOrderNotIncludeProduceColumns, purchaseOrderNotIncludeProduceChildColumns } from "/@/utils/details/_purchase";
+import { httpInfo } from "/@/api/purchase/porder";
+import QueryString from 'qs';
 
 const visible = ref(false);
+const loading = ref(false);
+const child = ref([]);
+
+const columns = computed(() => {
+  return child.value.length === 0 ? purchaseOrderNotIncludeProduceColumns : purchaseOrderNotIncludeProduceChildColumns
+})
 const data = ref<Record<string, string>>({});
 
+
 defineExpose({
-  onDisplay: _data => {
+  onDisplay: async _data => {
     visible.value = true;
     data.value = _data;
+    loading.value = true;
+    const result = await httpInfo({ sequenceNo: _data.sequenceNo })
+    loading.value = false;
+    child.value = result.data.child
   }
 });
 </script>
@@ -23,9 +36,10 @@ defineExpose({
     :close-on-click-modal="false"
     @close="data = {}"
   >
-    <BasicDescriptions
-      :columns="purchaseOrderNotIncludeProduceColumns"
-      :data="data"
+    <BasicDescriptions 
+      v-loading="loading" 
+      :columns="columns" 
+      :data="{...data, child }" 
     />
   </ElDialog>
 </template>

+ 5 - 0
src/views/purchase/porder/config/content.config.ts

@@ -29,6 +29,11 @@ const columns = [
     prop: "cxCode",
     width: "150px"
   },
+  {
+    label: "原采购单号",
+    prop: "mainCode",
+    width: "150px"
+  },
   {
     label: "销售订单编码",
     prop: "qrdCode",

+ 1 - 5
src/views/purchase/porder/index.vue

@@ -47,7 +47,6 @@ async function handleExport() {
   const data: any[] = [];
   selectlist.value.forEach(item => {
     const _template = { ...judieTemplate };
-
     _template["采购单编码"] = item.sequenceNo;
     _template["采购主单编码"] = item.cxCode;
     _template["销售订单编码"] = item.qrdCode;
@@ -92,7 +91,6 @@ async function handleExport() {
     _template["买入方公司编号"] = item.companyNo;
     _template["买入方公司名称"] = item.companyName;
     _template["创建时间"] = item.addtime;
-
     data.push(_template);
   });
   //创建数据表
@@ -101,9 +99,7 @@ async function handleExport() {
   utils.book_append_sheet(workBook, workSheet, "sheet");
 
   //导出模板
-  writeFile(workBook, `${judieFilename}.xlsx`, {
-    bookType: "xlsx"
-  });
+  writeFile(workBook, `${judieFilename}.xlsx`, { bookType: "xlsx" });
 }
 
 onMounted(() => {nextTick(()  =>  contentRef.value.onSearchPro({ size:15, page:1, total: "2" }))})

+ 32 - 62
src/views/purchase/purchPay/component/choose-modal.vue

@@ -8,6 +8,8 @@ import { useCompany } from "/@/hooks/core/useCompany";
 import { payStatusOptions, tagOptions } from "/@/utils/status";
 import { SupplierQuery, DateRange } from "/@/components/BasicForm";
 
+import { orderTypeCgOptions } from "/@/utils/status";
+
 const emit = defineEmits(["choose"]);
 
 const visible = ref(false);
@@ -24,6 +26,7 @@ const pagination = reactive({
 });
 
 const formData = ref<Record<string, any>>({
+  is_comon: '0',
   pay_status: "0",
   supplierNo: "",
   currentValue: "",
@@ -92,6 +95,7 @@ function handleSizeChange() {
 function handleSearch(_isReset?: boolean) {
   if (_isReset) {
     formData.value = {
+      is_comon: '0',
       pay_status: "0",
       supplierNo: "",
       currentValue: "",
@@ -110,24 +114,13 @@ defineExpose({
 </script>
 
 <template>
-  <el-dialog
-    top="10vh"
-    :close-on-click-modal="false"
-    v-model="visible"
-    title="订单对账"
-    center
-    width="1040px"
-    @open="() => requestPaymentList()"
-  >
+  <el-dialog top="10vh" :close-on-click-modal="false" v-model="visible" title="订单对账" center width="1040px"
+    @open="() => requestPaymentList()">
     <el-form size="small">
       <el-row :gutter="8">
         <el-col :span="8">
           <el-form-item>
-            <el-input
-              clearable
-              v-model="formData.currentValue"
-              placeholder="请输入"
-            >
+            <el-input clearable v-model="formData.currentValue" placeholder="请输入">
               <template #prepend>
                 <el-select v-model="currentKey" style="width: 130px">
                   <el-option label="对账编码" value="payNo" />
@@ -142,19 +135,12 @@ defineExpose({
         </el-col>
 
         <el-col :span="8">
-          <supplier-query
-            v-model="formData.supplierNo"
-            placeholder="卖出方公司"
-          />
+          <supplier-query v-model="formData.supplierNo" placeholder="卖出方公司" />
         </el-col>
 
         <el-col :span="6">
           <el-form-item>
-            <el-select
-              w-80
-              v-model="formData.pay_status"
-              placeholder="付款状态"
-            >
+            <el-select w-80 v-model="formData.pay_status" placeholder="付款状态">
               <el-option value="0" label="未付款或部分付款" />
               <el-option value="1" label="未付款" />
               <el-option value="2" label="部分付款" />
@@ -165,50 +151,40 @@ defineExpose({
         <el-col :span="6">
           <el-form-item>
             <el-select w-80 v-model="formData.tag_id" placeholder="标签状态">
-              <el-option
-                v-for="tag in tagOptions"
-                :key="tag.value"
-                :value="tag.value"
-                :label="tag.label"
-              />
+              <el-option v-for="tag in tagOptions" :key="tag.value" :value="tag.value" :label="tag.label" />
             </el-select>
           </el-form-item>
         </el-col>
 
-        <el-col :span="12">
+        <el-col :span="6">
+          <el-select v-model="formData.is_comon" style="width: 155px" placeholder="业务类型">
+            <el-option v-for="option in orderTypeCgOptions" :label="option.label" :value="option.value" />
+          </el-select>
+        </el-col>
+
+        <el-col :span="6">
           <el-form-item>
-            <el-button type="primary" @click="() => handleSearch()"
-              >搜索</el-button
-            >
+            <el-button type="primary" @click="() => handleSearch()">搜索</el-button>
             <el-button @click="() => handleSearch(true)">重置</el-button>
           </el-form-item>
         </el-col>
       </el-row>
     </el-form>
 
-    <el-table
-      border
-      ref="tableRef"
-      :data="paymentList"
-      size="small"
-      row-key="id"
-      @selection-change="handleSelectionChange"
-      mb-2
-      v-loading="loading"
-      max-height="520px"
-    >
+    <el-table border ref="tableRef" :data="paymentList" size="small" row-key="id"
+      @selection-change="handleSelectionChange" mb-2 v-loading="loading" max-height="520px">
       <el-table-column type="selection" align="center" width="40" />
-      <el-table-column
-        v-for="(col, index) in columns"
-        :key="index"
-        v-bind="col"
-        show-overflow-tooltip
-      >
+      <el-table-column v-for="(col, index) in columns" :key="index" v-bind="col" show-overflow-tooltip>
         <template #="{ row }">
           <el-tag v-if="col.prop === 'pay_status'" size="small">{{
-            payStatusOptions.find(p => p.value === String(row.pay_status))
-              ?.label
-          }}</el-tag>
+    payStatusOptions.find(p => p.value === String(row.pay_status))
+      ?.label
+  }}</el-tag>
+
+
+          <el-tag v-else-if="col.prop === 'is_comon'">{{
+    orderTypeCgOptions.find(p => p.value === row.is_comon)?.label
+  }}</el-tag>
 
           <span v-else>{{ row[col.prop] }}</span>
         </template>
@@ -216,15 +192,9 @@ defineExpose({
     </el-table>
 
     <div flex>
-      <el-pagination
-        v-model:current-page="pagination.page"
-        v-model:page-size="pagination.size"
-        :total="pagination.total"
-        :page-sizes="[15, 50, 100]"
-        layout="sizes, prev, pager, next"
-        @current-change="requestPaymentList"
-        @size-change="handleSizeChange"
-      />
+      <el-pagination v-model:current-page="pagination.page" v-model:page-size="pagination.size"
+        :total="pagination.total" :page-sizes="[15, 50, 100]" layout="sizes, prev, pager, next"
+        @current-change="requestPaymentList" @size-change="handleSizeChange" />
 
       <div w-full flex justify-end mt-2>
         <el-button type="primary" size="small" @click="handleConfirm">

+ 5 - 0
src/views/purchase/purchPay/config/_details.ts

@@ -5,6 +5,11 @@ export const columns = [
     minWidth: 160,
     align: "left"
   },
+  {
+    label: "业务类型",
+    prop: "is_comon",
+    minWidth: 100
+  },
   {
     label: "供应商编码",
     prop: "supplierNo",

+ 22 - 2
src/views/purchase/purchPayRelive/component/choose-modal.vue

@@ -8,6 +8,9 @@ import { httpList } from "/@/api/purchase/orderPay";
 import { useCompany } from "/@/hooks/core/useCompany";
 import { SupplierQuery, DateRange } from "/@/components/BasicForm";
 
+
+import { orderTypeCgOptions } from "/@/utils/status";
+
 const emit = defineEmits(["choose"]);
 
 const visible = ref(false);
@@ -22,6 +25,7 @@ const pagination = reactive({
 });
 
 const formData = ref<Record<string, any>>({
+  "is_comon": '0',
   pay_status: "",
   currentValue: "",
   supplierNo: "",
@@ -43,7 +47,6 @@ async function requestPaymentList() {
 
   const { code, message, data } = await httpList({
     status: "4",
-    "is_comon":"0",
     [currentKey.value]: currentValue,
     companyNo: currentCompany.value.companyNo,
     startTime: timer[0],
@@ -147,7 +150,19 @@ defineExpose({
         </el-col>
 
         <el-col :span="24">
-          <div w-full flex justify-end>
+          <div w-full flex justify-between>
+
+          <el-col :span="8">
+            <el-select v-model="formData.is_comon" style="width: 155px" placeholder="业务类型">
+               <el-option 
+                v-for="option in orderTypeCgOptions" 
+                :label="option.label" 
+                :value="option.value" 
+              />
+            </el-select>
+          </el-col>
+
+
             <el-form-item>
               <el-button
                 size="small"
@@ -187,6 +202,11 @@ defineExpose({
             payStatusOptions.find(p => p.value === row.pay_status)?.label
           }}</el-tag>
 
+
+        <el-tag v-if="col.prop === 'is_comon'">{{
+            orderTypeCgOptions.find(p => p.value === row.is_comon)?.label
+          }}</el-tag>
+
           <span v-else>{{ row[col.prop] }}</span>
         </template>
       </el-table-column>

+ 5 - 0
src/views/purchase/purchPayRelive/config/_details.ts

@@ -11,6 +11,11 @@ export const columns = [
     minWidth: 160,
     align: "left"
   },
+  {
+    label: "业务类型",
+    prop: "is_comon",
+    width: 100
+  },
   {
     label: "卖方公司编码",
     prop: "supplierNo",

+ 16 - 0
src/views/purchase/ticketReturn/components/choose-modal.vue

@@ -8,6 +8,7 @@ import { useCompany } from "/@/hooks/core/useCompany";
 import { payStatusOptions, tagOptions } from "/@/utils/status";
 import { SupplierQuery, DateRange } from "/@/components/BasicForm";
 import { invStatusOptions } from "../../orderRecordQuery/config/_options";
+import { orderTypeCgOptions_2 } from "/@/utils/status";
 
 const emit = defineEmits(["choose"]);
 
@@ -94,6 +95,7 @@ function handleSizeChange() {
 function handleSearch(_isReset?: boolean) {
   if (_isReset) {
     formData.value = {
+      is_comon: '0',
       inv_status: "0",
       supplierNo: "",
       currentValue: "",
@@ -175,6 +177,16 @@ defineExpose({
           </el-form-item>
         </el-col>
 
+        <el-col :span="6">
+            <el-select v-model="formData.is_comon" style="width: 155px" placeholder="业务类型">
+               <el-option 
+                v-for="option in orderTypeCgOptions_2" 
+                :label="option.label" 
+                :value="option.value" 
+              />
+            </el-select>
+        </el-col>
+
         <el-col :span="12">
           <el-form-item>
             <el-button type="primary" @click="() => handleSearch()"
@@ -210,6 +222,10 @@ defineExpose({
               ?.label
           }}</el-tag>
 
+<el-tag v-else-if="col.prop === 'is_comon'">{{
+    orderTypeCgOptions_2.find(p => p.value === row.is_comon)?.label
+  }}</el-tag>
+
           <span v-else>{{ row[col.prop] }}</span>
         </template>
       </el-table-column>

+ 5 - 0
src/views/purchase/ticketReturn/config/_details.ts

@@ -5,6 +5,11 @@ export const columns = [
     minWidth: 160,
     align: "left"
   },
+  {
+    label: "业务类型",
+    prop: "is_comon",
+    width: 100
+  },
   {
     label: "供应商编码",
     prop: "supplierNo",

+ 30 - 63
src/views/purchase/ticketReturnRelive/components/choose-modal.vue

@@ -7,6 +7,7 @@ import { checkTypeOptions, payStatusOptions } from "/@/utils/status";
 import { httpList } from "/@/api/purchase/ticketReturn";
 import { useCompany } from "/@/hooks/core/useCompany";
 import { SupplierQuery, DateRange } from "/@/components/BasicForm";
+import { orderTypeCgOptions_2 } from "/@/utils/status"
 
 const emit = defineEmits(["choose"]);
 
@@ -22,6 +23,7 @@ const pagination = reactive({
 });
 
 const formData = ref<Record<string, any>>({
+  is_comon: '0',
   apply_name: "",
   currentValue: "",
   supplierNo: "",
@@ -46,7 +48,6 @@ async function requestPaymentList() {
 
   const { code, message, data } = await httpList({
     status: "4",
-    "is_comon": "0",
     [currentKey.value]: currentValue,
     companyNo: currentCompany.value.companyNo,
     open_start: openTimer[0],
@@ -96,6 +97,7 @@ function handleSizeChange() {
 function handleSearch(_isReset?: boolean) {
   if (_isReset) {
     formData.value = {
+      is_comon: '0',
       apply_name: "",
       currentValue: "",
       supplierNo: "",
@@ -115,14 +117,8 @@ defineExpose({
 </script>
 
 <template>
-  <el-dialog
-    :close-on-click-modal="false"
-    v-model="visible"
-    title="采购回票"
-    center
-    width="1040px"
-    @open="() => requestPaymentList()"
-  >
+  <el-dialog :close-on-click-modal="false" v-model="visible" title="采购回票" center width="1040px"
+    @open="() => requestPaymentList()">
     <el-form size="small">
       <el-row :gutter="10">
         <el-col :span="8">
@@ -134,18 +130,11 @@ defineExpose({
         </el-col>
 
         <el-col :span="8">
-          <supplier-query
-            v-model="formData.supplierNo"
-            placeholder="卖出方公司名称"
-          />
+          <supplier-query v-model="formData.supplierNo" placeholder="卖出方公司名称" />
         </el-col>
         <el-col :span="8">
           <el-form-item>
-            <el-input
-              clearable
-              v-model="formData.currentValue"
-              placeholder="关键字"
-            >
+            <el-input clearable v-model="formData.currentValue" placeholder="关键字">
               <template #prepend>
                 <el-select v-model="currentKey" style="width: 140px">
                   <el-option label="对账回票申请编码" value="hpNo" />
@@ -156,17 +145,8 @@ defineExpose({
           </el-form-item>
         </el-col>
         <el-col :span="6">
-          <el-select
-            style="width: 100%"
-            v-model="formData.checkApi"
-            placeholder="发票查验方式"
-          >
-            <el-option
-              v-for="opt in checkTypeOptions"
-              :key="opt.value"
-              :value="opt.value"
-              :label="opt.label"
-            />
+          <el-select style="width: 100%" v-model="formData.checkApi" placeholder="发票查验方式">
+            <el-option v-for="opt in checkTypeOptions" :key="opt.value" :value="opt.value" :label="opt.label" />
           </el-select>
         </el-col>
 
@@ -176,43 +156,36 @@ defineExpose({
           </el-form-item>
         </el-col>
 
+        <el-col :span="6">
+          <el-select v-model="formData.is_comon" style="width: 155px" placeholder="业务类型">
+            <el-option v-for="option in orderTypeCgOptions_2" :label="option.label" :value="option.value" />
+          </el-select>
+        </el-col>
+
         <el-col :span="4">
           <el-form-item>
-            <el-button type="primary" @click="() => handleSearch()"
-              >搜索</el-button
-            >
+            <el-button type="primary" @click="() => handleSearch()">搜索</el-button>
             <el-button @click="() => handleSearch(true)">重置</el-button>
           </el-form-item>
         </el-col>
       </el-row>
     </el-form>
-    <el-table
-      border
-      ref="tableRef"
-      :data="paymentList"
-      size="small"
-      row-key="id"
-      @selection-change="handleSelectionChange"
-      mb-2
-      max-height="520px"
-      v-loading="loading"
-    >
+    <el-table border ref="tableRef" :data="paymentList" size="small" row-key="id"
+      @selection-change="handleSelectionChange" mb-2 max-height="520px" v-loading="loading">
       <el-table-column type="selection" width="40" align="center" />
-      <el-table-column
-        v-for="(col, index) in columns"
-        :key="index"
-        v-bind="col"
-        show-overflow-tooltip
-      >
+      <el-table-column v-for="(col, index) in columns" :key="index" v-bind="col" show-overflow-tooltip>
         <template #="{ row }">
           <el-tag v-if="col.prop === 'pay_status'" size="small">{{
-            payStatusOptions.find(p => p.value === String(row.pay_status))
-              ?.label
-          }}</el-tag>
+    payStatusOptions.find(p => p.value === String(row.pay_status))
+      ?.label
+  }}</el-tag>
 
           <el-tag v-else-if="col.prop === 'checkApi'" size="small">{{
-            checkTypeOptions.find(p => p.value === String(row.checkApi))?.label
-          }}</el-tag>
+    checkTypeOptions.find(p => p.value === String(row.checkApi))?.label
+  }}</el-tag>
+          <el-tag v-else-if="col.prop === 'is_comon'">{{
+    orderTypeCgOptions_2.find(p => p.value === row.is_comon)?.label
+  }}</el-tag>
 
           <span v-else>{{ row[col.prop] }}</span>
         </template>
@@ -220,15 +193,9 @@ defineExpose({
     </el-table>
 
     <div flex>
-      <el-pagination
-        v-model:current-page="pagination.page"
-        v-model:page-size="pagination.size"
-        :total="pagination.total"
-        @current-change="requestPaymentList"
-        :page-sizes="[15, 50, 100]"
-        @size-change="handleSizeChange"
-        layout="sizes, prev, pager, next"
-      />
+      <el-pagination v-model:current-page="pagination.page" v-model:page-size="pagination.size"
+        :total="pagination.total" @current-change="requestPaymentList" :page-sizes="[15, 50, 100]"
+        @size-change="handleSizeChange" layout="sizes, prev, pager, next" />
 
       <div w-full flex justify-end mt-2>
         <el-button type="primary" @click="handleConfirm">保存</el-button>

+ 5 - 0
src/views/purchase/ticketReturnRelive/config/_details.ts

@@ -11,6 +11,11 @@ export const columns = [
     minWidth: 160,
     align: "left"
   },
+  {
+    label: "业务类型",
+    prop: "is_comon",
+    width: 100
+  },
   {
     label: "卖方公司编码",
     prop: "supplierNo",

+ 34 - 65
src/views/supply/purchPay/component/choose-modal.vue

@@ -7,6 +7,8 @@ import { httpList } from "/@/api/purchase/orderRecord";
 import { useCompany } from "/@/hooks/core/useCompany";
 import { payStatusOptions, tagOptions } from "/@/utils/status";
 import { BusinessQuery, DateRange } from "/@/components/BasicForm";
+import { orderTypeCgOptions_2 } from "/@/utils/status";
+
 
 const emit = defineEmits(["choose"]);
 
@@ -24,6 +26,7 @@ const pagination = reactive({
 });
 
 const formData = ref<Record<string, any>>({
+  is_comon: '0',
   pay_status: "0",
   companyNo: "",
   currentValue: "",
@@ -44,7 +47,6 @@ async function requestPaymentList() {
   const { currentValue, timer, ...otherParams } = formData.value;
 
   const { code, message, data } = await httpList({
-    is_comon: "0",
     pay_status: "0",
     status: "2",
     [currentKey.value]: currentValue,
@@ -94,6 +96,7 @@ function handleSizeChange() {
 function handleSearch(_isReset?: boolean) {
   if (_isReset) {
     formData.value = {
+      is_comon: '0',
       pay_status: "0",
       companyNo: "",
       currentValue: "",
@@ -112,23 +115,13 @@ defineExpose({
 </script>
 
 <template>
-  <el-dialog
-    @open="() => requestPaymentList()"
-    :close-on-click-modal="false"
-    v-model="visible"
-    title="订单对账"
-    width="1040px"
-    center
-  >
+  <el-dialog @open="() => requestPaymentList()" :close-on-click-modal="false" v-model="visible" title="订单对账"
+    width="1040px" center>
     <el-form size="small">
       <el-row :gutter="8">
         <el-col :span="8">
           <el-form-item>
-            <el-input
-              clearable
-              v-model="formData.currentValue"
-              placeholder="请输入"
-            >
+            <el-input clearable v-model="formData.currentValue" placeholder="请输入">
               <template #prepend>
                 <el-select v-model="currentKey" style="width: 130px">
                   <el-option label="对账编码" value="payNo" />
@@ -143,19 +136,12 @@ defineExpose({
         </el-col>
 
         <el-col :span="8">
-          <business-query
-            v-model="formData.companyNo"
-            placeholder="买入方公司"
-          />
+          <business-query v-model="formData.companyNo" placeholder="买入方公司" />
         </el-col>
 
         <el-col :span="6">
           <el-form-item>
-            <el-select
-              w-80
-              v-model="formData.pay_status"
-              placeholder="付款状态"
-            >
+            <el-select w-80 v-model="formData.pay_status" placeholder="付款状态">
               <el-option value="0" label="未付款或部分付款" />
               <el-option value="1" label="未付款" />
               <el-option value="2" label="部分付款" />
@@ -166,50 +152,41 @@ defineExpose({
         <el-col :span="6">
           <el-form-item>
             <el-select w-80 v-model="formData.tag_id" placeholder="标签状态">
-              <el-option
-                v-for="tag in tagOptions"
-                :key="tag.value"
-                :value="tag.value"
-                :label="tag.label"
-              />
+              <el-option v-for="tag in tagOptions" :key="tag.value" :value="tag.value" :label="tag.label" />
             </el-select>
           </el-form-item>
         </el-col>
 
-        <el-col :span="12">
+        <el-col :span="6">
+          <el-select v-model="formData.is_comon" style="width: 155px" placeholder="业务类型">
+            <el-option v-for="option in orderTypeCgOptions_2" :label="option.label" :value="option.value" />
+          </el-select>
+        </el-col>
+
+        <el-col :span="6">
           <el-form-item>
-            <el-button type="primary" @click="() => handleSearch()"
-              >搜索</el-button
-            >
+            <el-button type="primary" @click="() => handleSearch()">搜索</el-button>
             <el-button @click="() => handleSearch(true)">重置</el-button>
           </el-form-item>
         </el-col>
       </el-row>
     </el-form>
 
-    <el-table
-      border
-      ref="tableRef"
-      :data="paymentList"
-      size="small"
-      row-key="id"
-      @selection-change="handleSelectionChange"
-      mb-2
-      v-loading="loading"
-      max-height="520px"
-    >
+    <el-table border ref="tableRef" :data="paymentList" size="small" row-key="id"
+      @selection-change="handleSelectionChange" mb-2 v-loading="loading" max-height="520px">
       <el-table-column type="selection" align="center" width="40" />
-      <el-table-column
-        v-for="(col, index) in columns"
-        :key="index"
-        v-bind="col"
-        show-overflow-tooltip
-      >
+      <el-table-column v-for="(col, index) in columns" :key="index" v-bind="col" show-overflow-tooltip>
         <template #="{ row }">
           <el-tag v-if="col.prop === 'pay_status'">{{
-            payStatusOptions.find(p => p.value === String(row.pay_status))
-              ?.label
-          }}</el-tag>
+    payStatusOptions.find(p => p.value === String(row.pay_status))
+      ?.label
+  }}</el-tag>
+
+
+          <el-tag v-else-if="col.prop === 'is_comon'">{{
+    orderTypeCgOptions_2.find(p => p.value === row.is_comon)?.label
+            }}</el-tag>
+
 
           <span v-else>{{ row[col.prop] }}</span>
         </template>
@@ -217,20 +194,12 @@ defineExpose({
     </el-table>
 
     <div flex>
-      <el-pagination
-        v-model:current-page="pagination.page"
-        v-model:page-size="pagination.size"
-        :total="pagination.total"
-        :page-sizes="[15, 50, 100]"
-        layout="sizes, prev, pager, next"
-        @current-change="requestPaymentList"
-        @size-change="handleSizeChange"
-      />
+      <el-pagination v-model:current-page="pagination.page" v-model:page-size="pagination.size"
+        :total="pagination.total" :page-sizes="[15, 50, 100]" layout="sizes, prev, pager, next"
+        @current-change="requestPaymentList" @size-change="handleSizeChange" />
 
       <div w-full flex justify-end mt-2>
-        <el-button type="primary" size="small" @click="handleConfirm"
-          >保存</el-button
-        >
+        <el-button type="primary" size="small" @click="handleConfirm">保存</el-button>
       </div>
     </div>
   </el-dialog>

+ 5 - 0
src/views/supply/purchPay/config/_details.ts

@@ -5,6 +5,11 @@ export const columns = [
     minWidth: 160,
     align: "left"
   },
+  {
+    label: "业务类型",
+    prop: "is_comon",
+    minWidth: 100
+  },
   {
     label: "供应商编码",
     prop: "supplierNo",

+ 27 - 55
src/views/supply/purchPayRelive/component/choose-modal.vue

@@ -7,6 +7,7 @@ import { payStatusOptions } from "/@/utils/status";
 import { httpList } from "/@/api/purchase/orderPay";
 import { useCompany } from "/@/hooks/core/useCompany";
 import { BusinessQuery, DateRange } from "/@/components/BasicForm";
+import { orderTypeCgOptions_2 } from "/@/utils/status";
 
 const emit = defineEmits(["choose"]);
 
@@ -22,6 +23,7 @@ const pagination = reactive({
 });
 
 const formData = ref<Record<string, any>>({
+  is_comon: "0",
   pay_status: "",
   currentValue: "",
   companyNo: "",
@@ -43,7 +45,6 @@ async function requestPaymentList() {
 
   const { code, message, data } = await httpList({
     status: "4",
-    "is_comon":"0",
     [currentKey.value]: currentValue,
     supplierNo: currentCompany.value.companyNo,
     startTime: timer[0],
@@ -91,6 +92,7 @@ function handleSizeChange() {
 function handleSearch(_isReset?: boolean) {
   if (_isReset) {
     formData.value = {
+      is_comon: "0",
       pay_status: "",
       currentValue: "",
       companyNo: "",
@@ -108,23 +110,13 @@ defineExpose({
 </script>
 
 <template>
-  <el-dialog
-    :close-on-click-modal="false"
-    v-model="visible"
-    title="采购付款"
-    center
-    width="1040px"
-    @open="() => requestPaymentList()"
-  >
+  <el-dialog :close-on-click-modal="false" v-model="visible" title="采购付款" center width="1040px"
+    @open="() => requestPaymentList()">
     <el-form size="small">
       <el-row :gutter="10">
         <el-col :span="8">
           <el-form-item>
-            <el-input
-              clearable
-              v-model="formData.currentValue"
-              placeholder="对账编码"
-            >
+            <el-input clearable v-model="formData.currentValue" placeholder="对账编码">
               <template #prepend>
                 <el-select v-model="currentKey" style="width: 135px">
                   <el-option label="对账付款编码" value="dzNo" />
@@ -140,52 +132,38 @@ defineExpose({
         </el-col>
 
         <el-col :span="8">
-          <BusinessQuery
-            v-model="formData.companyNo"
-            placeholder="买入方公司"
-          />
+          <BusinessQuery v-model="formData.companyNo" placeholder="买入方公司" />
+        </el-col>
+
+        <el-col :span="6">
+          <el-select v-model="formData.is_comon" style="width: 155px" placeholder="业务类型">
+            <el-option v-for="option in orderTypeCgOptions_2" :label="option.label" :value="option.value" />
+          </el-select>
         </el-col>
 
         <el-col :span="24">
           <div w-full flex justify-end>
             <el-form-item>
-              <el-button
-                size="small"
-                type="primary"
-                @click="() => handleSearch()"
-                >搜索</el-button
-              >
-              <el-button size="small" @click="() => handleSearch(true)"
-                >重置</el-button
-              >
+              <el-button size="small" type="primary" @click="() => handleSearch()">搜索</el-button>
+              <el-button size="small" @click="() => handleSearch(true)">重置</el-button>
             </el-form-item>
           </div>
         </el-col>
       </el-row>
     </el-form>
 
-    <el-table
-      border
-      ref="tableRef"
-      :data="paymentList"
-      size="small"
-      row-key="id"
-      @selection-change="handleSelectionChange"
-      mb-2
-      v-loading="loading"
-      max-height="520px"
-    >
+    <el-table border ref="tableRef" :data="paymentList" size="small" row-key="id"
+      @selection-change="handleSelectionChange" mb-2 v-loading="loading" max-height="520px">
       <el-table-column type="selection" align="center" width="40" />
-      <el-table-column
-        v-for="(col, index) in columns"
-        :key="index"
-        v-bind="col"
-        show-overflow-tooltip
-      >
+      <el-table-column v-for="(col, index) in columns" :key="index" v-bind="col" show-overflow-tooltip>
         <template #="{ row }">
           <el-tag v-if="col.prop === 'pay_status'">{{
-            payStatusOptions.find(p => p.value === row.pay_status)?.label
-          }}</el-tag>
+    payStatusOptions.find(p => p.value === row.pay_status)?.label
+  }}</el-tag>
+
+          <el-tag v-else-if="col.prop === 'is_comon'">{{
+    orderTypeCgOptions_2.find(p => p.value === row.is_comon)?.label
+  }}</el-tag>
 
           <span v-else>{{ row[col.prop] }}</span>
         </template>
@@ -193,15 +171,9 @@ defineExpose({
     </el-table>
 
     <div flex>
-      <el-pagination
-        v-model:current-page="pagination.page"
-        v-model:page-size="pagination.size"
-        :total="pagination.total"
-        :page-sizes="[15, 50, 100]"
-        layout="sizes, prev, pager, next"
-        @current-change="requestPaymentList"
-        @size-change="handleSizeChange"
-      />
+      <el-pagination v-model:current-page="pagination.page" v-model:page-size="pagination.size"
+        :total="pagination.total" :page-sizes="[15, 50, 100]" layout="sizes, prev, pager, next"
+        @current-change="requestPaymentList" @size-change="handleSizeChange" />
 
       <div w-full flex justify-end mt-2>
         <el-button type="primary" @click="handleConfirm">保存</el-button>

+ 5 - 0
src/views/supply/purchPayRelive/config/_details.ts

@@ -11,6 +11,11 @@ export const columns = [
     minWidth: 160,
     align: "left"
   },
+  {
+    label: "业务类型",
+    prop: "is_comon",
+    minWidth: 100
+  },
   {
     label: "卖方公司编码",
     prop: "supplierNo",

+ 19 - 3
src/views/supply/ticketReturn/components/choose-modal.vue

@@ -8,6 +8,7 @@ import { useCompany } from "/@/hooks/core/useCompany";
 import { tagOptions } from "/@/utils/status";
 import { BusinessQuery, DateRange } from "/@/components/BasicForm";
 import { invStatusOptions } from "../../orderRecordQuery/config/_options";
+import { orderTypeCgOptions_2 } from "/@/utils/status";
 
 const emit = defineEmits(["choose"]);
 
@@ -25,7 +26,7 @@ const pagination = reactive({
 });
 
 const formData = ref<Record<string, any>>({
-  is_comon: "0",
+  is_comon: '0',
   inv_status: "0",
   companyNo: "",
   currentValue: "",
@@ -46,7 +47,6 @@ async function requestPaymentList() {
   const { currentValue, timer, ...otherParams } = formData.value;
 
   const { code, message, data } = await httpList({
-    is_comon: "0",
     inv_status: "0",
     status: "2",
     [currentKey.value]: currentValue,
@@ -95,6 +95,7 @@ function handleSizeChange() {
 function handleSearch(_isReset?: boolean) {
   if (_isReset) {
     formData.value = {
+      is_comon: '0',
       inv_status: "0",
       companyNo: "",
       currentValue: "",
@@ -177,7 +178,17 @@ defineExpose({
           </el-form-item>
         </el-col>
 
-        <el-col :span="12">
+        <el-col :span="6">
+            <el-select v-model="formData.is_comon" style="width: 155px" placeholder="业务类型">
+               <el-option 
+                v-for="option in orderTypeCgOptions_2" 
+                :label="option.label" 
+                :value="option.value" 
+              />
+            </el-select>
+        </el-col>
+
+        <el-col :span="6">
           <el-form-item>
             <el-button type="primary" @click="() => handleSearch()"
               >搜索</el-button
@@ -212,6 +223,11 @@ defineExpose({
               ?.label
           }}</el-tag>
 
+          
+<el-tag v-else-if="col.prop === 'is_comon'">{{
+    orderTypeCgOptions_2.find(p => p.value === row.is_comon)?.label
+  }}</el-tag>
+
           <span v-else>{{ row[col.prop] }}</span>
         </template>
       </el-table-column>

+ 5 - 0
src/views/supply/ticketReturn/config/_details.ts

@@ -5,6 +5,11 @@ export const columns = [
     minWidth: 160,
     align: "left"
   },
+  {
+    label: "业务类型",
+    prop: "is_comon",
+    width: 100
+  },
   {
     label: "供应商编码",
     prop: "supplierNo",

+ 18 - 1
src/views/supply/ticketReturnRelive/components/choose-modal.vue

@@ -7,6 +7,7 @@ import { checkTypeOptions, payStatusOptions } from "/@/utils/status";
 import { httpList } from "/@/api/purchase/ticketReturn";
 import { useCompany } from "/@/hooks/core/useCompany";
 import { BusinessQuery, DateRange } from "/@/components/BasicForm";
+import { orderTypeCgOptions_2 } from "/@/utils/status";
 
 const emit = defineEmits(["choose"]);
 
@@ -22,6 +23,7 @@ const pagination = reactive({
 });
 
 const formData = ref<Record<string, any>>({
+  is_comon: '0',
   apply_name: "",
   currentValue: "",
   checkApi: "",
@@ -46,7 +48,6 @@ async function requestPaymentList() {
 
   const { code, message, data } = await httpList({
     status: "4",
-    is_comon: "0",
     [currentKey.value]: currentValue,
     supplierNo: currentCompany.value.companyNo,
     open_start: openTimer[0],
@@ -96,6 +97,7 @@ function handleSizeChange() {
 function handleSearch(_isReset?: boolean) {
   if (_isReset) {
     formData.value = {
+      is_comon: '0',
       companyNo: "",
       apply_name: "",
       currentValue: "",
@@ -178,6 +180,16 @@ defineExpose({
           </el-form-item>
         </el-col>
 
+        <el-col :span="6">
+            <el-select v-model="formData.is_comon" style="width: 155px" placeholder="业务类型">
+               <el-option 
+                v-for="option in orderTypeCgOptions_2" 
+                :label="option.label" 
+                :value="option.value" 
+              />
+            </el-select>
+        </el-col>
+
         <el-col :span="4">
           <el-form-item>
             <el-button type="primary" @click="() => handleSearch()"
@@ -216,6 +228,11 @@ defineExpose({
             checkTypeOptions.find(p => p.value === String(row.checkApi))?.label
           }}</el-tag>
 
+          
+<el-tag v-else-if="col.prop === 'is_comon'">{{
+    orderTypeCgOptions_2.find(p => p.value === row.is_comon)?.label
+  }}</el-tag>
+
           <span v-else>{{ row[col.prop] }}</span>
         </template>
       </el-table-column>

+ 5 - 0
src/views/supply/ticketReturnRelive/config/_details.ts

@@ -11,6 +11,11 @@ export const columns = [
     minWidth: 160,
     align: "left"
   },
+  {
+    label: "业务类型",
+    prop: "is_comon",
+    width: 100
+  },
   {
     label: "卖方公司编码",
     prop: "supplierNo",

+ 22 - 0
src/views/supplyInvoiceSaleSettings/_component/execl-files-upload/index.vue

@@ -13,6 +13,10 @@ import {
   requireHeaders
 } from "./columns-config";
 import { useRenderIcon } from "/@/components/ReIcon/src/hooks";
+import { useCompany } from "/@/hooks/core/useCompany";
+
+const company = useCompany();
+
 
 const visible = ref(false);
 const loading = ref(false);
@@ -92,6 +96,24 @@ const Uploadsuccess = ({ results, header }) => {
       tableData.value.push(model);
     }
 
+
+    const names = [... new Set(tableData.value.map(({ value5 }) => value5))]
+
+    console.log(names)
+    if (names.length !== 1) {
+      ElMessage.error('上传的卖出方公司必须一致')
+      tableData.value = []
+      return
+    } else {
+      if (names[0] !== company.currentCompany.value.companyName) {
+        ElMessage.error('上传的卖出方公司与当前选择公司必须一致')
+        tableData.value = []
+        loading.value = false;
+        return
+      }
+    }
+
+
     loading.value = false;
   } catch (err) {
     return err;

+ 21 - 0
src/views/supplyInvoiceSaleSettings/_component/procure-import/index.vue

@@ -14,6 +14,11 @@ import {
 } from "./columns-config";
 import { useRenderIcon } from "/@/components/ReIcon/src/hooks";
 
+
+import { useCompany } from "/@/hooks/core/useCompany";
+
+const company = useCompany();
+
 const visible = ref(false);
 const loading = ref(false);
 const tableData = ref([]);
@@ -41,6 +46,8 @@ const Uploadsuccess = ({ results, header }) => {
     return;
   }
 
+  // const companyNames = 
+
   let headok = true;
   if (header.length !== initheaders.length) {
     headok = false;
@@ -71,6 +78,20 @@ const Uploadsuccess = ({ results, header }) => {
       tableData.value.push(model);
     }
 
+
+    const names = [... new Set(tableData.value.map(({ value5 }) => value5))]
+    if (names.length !== 1) {
+      ElMessage.error('上传的卖出方公司必须一致')
+      tableData.value = []
+      return
+    } else {
+      if (names[0] !== company.currentCompany.value.companyName) {
+        ElMessage.error('上传的卖出方公司与当前选择公司必须一致')
+        tableData.value = []
+        loading.value = false;
+        return
+      }
+    }
     loading.value = false;
   } catch (err) {
     return err;

+ 216 - 0
src/views/supplyInvoiceSaleSettings/supplyConsultingChildCost/config/configs.ts

@@ -0,0 +1,216 @@
+import { h } from "vue";
+import { ElImage, ElTag } from "element-plus";
+import { createTooltip } from "/@/utils/tootip";
+
+export const good_type = [
+  {
+    value: "0",
+    label: "待采购设置税务类目"
+  },
+  {
+    value: "1",
+    label: "待财务设置税务类目"
+  },
+  {
+    value: "2",
+    label: "税务类目设置完成"
+  }
+];
+
+export const stock_type = [
+  {
+    value: "0",
+    label: "非库存"
+  },
+  {
+    value: "1",
+    label: "库存"
+  }
+];
+
+//类目新增校验规则
+export const cost_rules = {
+  cat_code: [{ required: true, trigger: "change", message: "请选择类目" }],
+  inv_tag: [{ required: true, trigger: "change", message: "请选择税率标识" }],
+  is_discount: [
+    { required: true, trigger: "change", message: "请选择是否包含优惠政策" }
+  ],
+  inv_good_name: [
+    { required: true, trigger: "change", message: "请选择商品名称" }
+  ],
+  tax: [{ required: true, trigger: "change", message: "请选择税率" }],
+  addTax: [
+    { required: true, trigger: "change", message: "请选择增值税管理内容" }
+  ]
+};
+
+export const good_detail_columns = [
+  {
+    field: "spuCode",
+    span: 6,
+    label: "商品编码"
+  },
+  {
+    field: "good_name",
+    span: 18,
+    label: "商品名称"
+  },
+  {
+    field: "is_stock",
+    label: "商品类型",
+    span: 6,
+    render(stock) {
+      return h(ElTag, null, {
+        default: () => stock_type.find(s => s.value === String(stock))?.label
+      });
+    }
+  },
+  {
+    field: "good_img",
+    label: "商品图",
+    span: 18,
+    render(imgSrc) {
+      return imgSrc.split(",").map(src =>
+        h(ElImage, {
+          src,
+          previewSrcList: [src],
+          style: {
+            height: "20px",
+            marginRight: "5px"
+          }
+        })
+      );
+    }
+  },
+  {
+    field: "cgd_inv_good_name",
+    span: 24,
+    label: "采购开票商品名称"
+  },
+  {
+    field: "cgd_inv_cat_name",
+    label: "采购类目名称",
+    span: 12
+  },
+  {
+    field: "cgd_inv_cat_code",
+    label: "采购类目编码"
+  },
+  {
+    field: "cgd_inv_tax",
+    label: "采购类目税率额"
+  },
+  {
+    field: "inv_good_name",
+    span: 24,
+    label: "财务开票商品名称"
+  },
+  {
+    field: "inv_cat_name",
+    label: "财务类目名称",
+    span: 12
+  },
+  {
+    field: "inv_cat_code",
+    label: "财务类目编码"
+  },
+  {
+    field: "inv_tax",
+    label: "财务类目税率额"
+  },
+  {
+    field: "companyName",
+    label: "业务公司名称",
+    render: (_, { companyNo, companyName }) =>
+      createTooltip(companyName, "业务公司编码 : " + companyNo, 270),
+    span: 8
+  },
+  {
+    field: "supplierName",
+    label: "供应商名称",
+    render: (_, { supplierNo, supplierName }) =>
+      createTooltip(supplierName, "供应商编码 : " + supplierNo, 270),
+    span: 8
+  },
+  {
+    label: "源头供应商",
+    render: (_, { cgd_supplierNo, cgd_supplierName }) =>
+      createTooltip(cgd_supplierName, "供应商编码 : " + cgd_supplierNo, 270),
+    span: 8
+  },
+
+  {
+    field: "cat_name",
+    span: 12,
+    label: "分类名称"
+  },
+  {
+    field: "unit_name",
+    label: "单位名称"
+  },
+  {
+    field: "status",
+    label: "状态",
+    render(status) {
+      return h(
+        ElTag,
+        {
+          type: status === "2" ? "success" : ""
+        },
+        {
+          default: () => good_type.find(s => s.value === String(status))?.label
+        }
+      );
+    }
+  },
+  {
+    field: "creater",
+    label: "创建人",
+    span: 12,
+  },
+  {
+    field: "addtime",
+    label: "申请时间",
+    span: 12,
+  },
+  {
+    field: "after_sales",
+    span: 24,
+    label: "售后说明"
+  },
+  {
+    field: "craft_desc",
+    span: 24,
+    label: "工艺说明"
+  }
+];
+
+export const inv_tag = [
+  {
+    value: "0",
+    label: "非零税率"
+  },
+  {
+    value: "1",
+    label: "免税"
+  },
+  {
+    value: "2",
+    label: "不征税"
+  },
+  {
+    value: "3",
+    label: "零税率"
+  }
+];
+
+export const add_tax = [
+  {
+    value: "免税",
+    label: "免税"
+  },
+  {
+    value: "不征税",
+    label: "不征税"
+  }
+];

+ 140 - 0
src/views/supplyInvoiceSaleSettings/supplyConsultingChildCost/config/content.config.ts

@@ -0,0 +1,140 @@
+import { ContentConfig } from "/@/components/PageContent";
+import { httpList } from "/@/api/InvoiceSaleSettings/consultingCost";
+
+import { h } from "vue";
+import dayjs from "dayjs";
+import { ElImage, ElTag } from "element-plus";
+import { good_type } from "./configs";
+import { renderIconLabelLeft } from "/@/utils/columnRenderHelper";
+
+function renderGoodImage(imgSrc: string) {
+  const imgs = imgSrc.split(",");
+  return h(ElImage, {
+    src: imgs[0],
+    previewTeleported: true,
+    previewSrcList: [imgs[0]],
+    style: {
+      height: "20px",
+      width: "20px"
+    }
+  });
+}
+
+const columns = [
+  {
+    type: "selection",
+    width: 40,
+    align: "center"
+  },
+  {
+    label: "商品编码",
+    prop: "spuCode",
+    width: 150
+  },
+  {
+    label: "卖出方公司",
+    prop: "cgd_supplierName",
+    width: 175,
+    ...renderIconLabelLeft("cgd_supplierNo", "cgd_supplierName", "卖出方公司编码:")
+  },
+  {
+    label: "买入方公司",
+    prop: "supplierName",
+    width: 195,
+    ...renderIconLabelLeft("supplierNo", "supplierName", "买入方公司编码:")
+  },
+  {
+    label: "商品名称",
+    prop: "good_name",
+    minWidth: 195
+  },
+  {
+    label: "主图",
+    prop: "good_img",
+    width: 55,
+    cellRenderer: ({ row }) => renderGoodImage(row.good_img)
+  },
+  {
+    label: "采购类目名称",
+    width: 120,
+    prop: "cgd_inv_cat_name"
+  },
+  {
+    label: "采购开票商品名称",
+    prop: "cgd_inv_good_name",
+    width: 165
+  },
+  {
+    label: "财务类目名称",
+    width: 120,
+    prop: "inv_cat_name"
+  },
+  {
+    label: "财务开票商品名称",
+    prop: "inv_good_name",
+    width: 165
+  },
+  {
+    label: "状态",
+    prop: "status",
+    width: 150,
+    cellRenderer: ({ row }) => {
+      return h(
+        ElTag,
+        {
+          type: row.status === "2" ? "success" : ""
+        },
+        {
+          default: () =>
+            good_type.find(t => t.value === String(row.status))?.label
+        }
+      );
+    }
+  },
+  {
+    label: "增值税管理内容",
+    prop: "addTax",
+    width: "140px"
+  },
+  {
+    label: "创建时间",
+    prop: "createTime",
+    width: 140,
+    formatter: ({ addtime }) => dayjs(addtime).format("YYYY-MM-DD HH:mm:ss")
+  },
+  {
+    label: "创建人",
+    width: 80,
+    prop: "creater"
+  },
+  {
+    label: "操作",
+    fixed: "right",
+    width: 80,
+    slot: "operation"
+  }
+];
+
+const contentConfig: ContentConfig = {
+  title: "销售成本类目设置",
+  superUserNoPerview: true,
+  // transformField: 'origin_cgd_supplierNo',
+  // transformFieldCompany: 'supplierNo',
+  companyProp: "supplierNo",
+  notDeleteCompanyrProp: true,
+  columns,
+  apis: {
+    httpList: (params = {}) => {
+      const { companyNo, supplierNo, ...rest } = params;
+      return httpList({
+        ...rest,
+        isChild: 1,
+        supplierNo: companyNo,
+        cgd_supplierNo: supplierNo,
+        noRela: true
+      })
+    }
+  }
+};
+
+export default contentConfig;

+ 40 - 0
src/views/supplyInvoiceSaleSettings/supplyConsultingChildCost/config/modal.config.ts

@@ -0,0 +1,40 @@
+import { ModalConfig } from "../../../../components/PageModal/src/types";
+
+const modalConfig: ModalConfig = {
+  title: "客户",
+  itemStyle: {},
+  formItems: [
+    {
+      field: "companyNo",
+      type: "input",
+      label: "客户编码",
+      labelWidth: "120px"
+    },
+    {
+      field: "companyName",
+      type: "input",
+      labelWidth: "120px",
+      label: "客户名称"
+    },
+    {
+      field: "parent",
+      type: "input",
+      labelWidth: "120px",
+      label: "归属集团"
+    },
+    {
+      field: "contactor",
+      type: "input",
+      labelWidth: "120px",
+      label: "联系人"
+    },
+    {
+      field: "createTime",
+      type: "input",
+      labelWidth: "120px",
+      label: "创建时间"
+    }
+  ]
+};
+
+export default modalConfig;

+ 33 - 0
src/views/supplyInvoiceSaleSettings/supplyConsultingChildCost/config/search.config.ts

@@ -0,0 +1,33 @@
+import { good_type } from "./configs";
+import { FormConfig } from "/@/components/PageSearch";
+
+const searchFormConfig: FormConfig = {
+  formItems: [
+    {
+      field: "group",
+      type_field: "group_type",
+      type: "input_group",
+      otherOptions: {
+        inputGroupOptions: [
+          { value: "spuCode", label: "商品编码" },
+          { value: "good_name", label: "商品名称" },
+          // { value: "companyNo", label: "买方公司编码" },
+          { value: "creater", label: "创建人" }
+        ]
+      }
+    },
+    {
+      field: "companyNo",
+      type: "supplier-query",
+      placeholder: '买入方公司'
+    },
+    {
+      field: "status",
+      type: "select",
+      placeholder: "状态",
+      options: good_type
+    }
+  ]
+};
+
+export default searchFormConfig;

+ 34 - 0
src/views/supplyInvoiceSaleSettings/supplyConsultingChildCost/detail.vue

@@ -0,0 +1,34 @@
+<script setup lang="ts">
+import { computed, onMounted, ref } from "vue";
+import BasicSettings from "../basic-settings.vue";
+import { good_detail_columns } from "./config/configs";
+import { useResponseHandle } from "/@/hooks";
+import { useRoute } from "vue-router";
+
+import {
+  type IGoodDetail,
+  httpDetail
+} from "/@/api/InvoiceSaleSettings/commodityCost";
+
+const { query } = useRoute();
+const spuCode = computed(() => query.id);
+const goodDetail = ref<IGoodDetail | null>(null);
+const responseHandle = useResponseHandle();
+
+//请求商品详情
+async function requesetGoodDetail() {
+  const { code, message, data } = await httpDetail({ spuCode: spuCode.value });
+  responseHandle({
+    code,
+    message,
+    handler: () => (goodDetail.value = data)
+  });
+}
+
+onMounted(() => requesetGoodDetail());
+</script>
+
+<template>
+  <BasicSettings title="咨询成交类目设置" back-route="/supplyInvoiceSaleSettings/supplyConsultingChildCost" :detail="goodDetail"
+    :columns="good_detail_columns" @refresh="requesetGoodDetail()" pageName="supplyConsultingChildCostDetail" />
+</template>

+ 140 - 0
src/views/supplyInvoiceSaleSettings/supplyConsultingChildCost/index.vue

@@ -0,0 +1,140 @@
+<script setup lang="ts">
+import { ref } from "vue";
+import { useRouter } from "vue-router";
+import { PageSearch, usePageSearch } from "/@/components/PageSearch";
+import { PageContent } from "/@/components/PageContent";
+import searchFormConfig from "./config/search.config";
+import contentConfig from "./config/content.config";
+import PagePower from "/@/components/PagePower/PagePower.vue";
+import { usePermission } from "/@/hooks/core/usePermission";
+import { useRenderIcon } from "/@/components/ReIcon/src/hooks";
+import ExeclUploadModal from "./../_component/execl-files-upload/index.vue";
+import ProcureImport from "./../_component/procure-import/index.vue";
+import { template, procureTemplate } from "./../_config/xls-template";
+import { utils, writeFile } from "xlsx";
+import { ElMessage } from "element-plus";
+import { useUserInfo } from "/@/hooks/core/useUser";
+
+const execlUploadModalRef = ref<InstanceType<typeof ExeclUploadModal>>(null);
+const procureUploadModalRef = ref<InstanceType<typeof ProcureImport>>(null);
+
+const { permissions, hasPermissionWithCode } = usePermission("supplyConsultingChildCost");
+const selects = ref([]);
+
+const { pageContentRef, handleResetClick, handleSearchClick } = usePageSearch(
+  undefined,
+  undefined,
+  searchFormConfig
+);
+const { push } = useRouter();
+const { isSuperUser } = useUserInfo();
+
+function toDetail(spuCode) {
+  push({
+    path: "/supplyInvoiceSaleSettings/supplyConsultingChildCostDetail",
+    query: { id: spuCode }
+  });
+}
+
+const mapTag = {
+  "1": "免税",
+  "2": "不征税",
+  "3": "零税率"
+};
+
+const mapDiscount = {
+  "1": "是",
+  "0": "否"
+};
+
+function onDownloadTemplate(isProcure = false) {
+  if (selects.value.length === 0) {
+    ElMessage.warning("请选择至少一个商品");
+    return;
+  }
+
+  const judieTemplate = isProcure ? procureTemplate : template
+  const judieFilename = isProcure ? "批量设置采购类目模板" : "批量设置财务类目模板"
+
+  const data: any[] = [];
+  selects.value.forEach((item) => {
+    const _template = { ...judieTemplate };
+
+    if (isProcure) { // 采购
+      _template["商品编码"] = item.spuCode;
+      _template["商品名称"] = item.good_name;
+      _template["买入方公司编码"] = item.supplierNo;
+      _template["买入方公司名称"] = item.supplierName;
+      _template["卖出方公司编码"] = item.cgd_supplierNo;
+      _template["卖出方公司名称"] = item.cgd_supplierName;
+      _template["开票商品名称"] = item.cgd_inv_good_name;
+    } else {  // 财务
+      _template["商品编码"] = item.spuCode;
+      _template["商品名称"] = item.good_name;
+      _template["买入方公司编码"] = item.supplierNo;
+      _template["买入方公司名称"] = item.supplierName;
+      _template["卖出方公司编码"] = item.cgd_supplierNo;
+      _template["卖出方公司名称"] = item.cgd_supplierName;
+      _template["采购类目编码"] = item.cgd_inv_cat_code;
+      _template['采购类目名称'] = item.cgd_inv_cat_name;
+      _template["采购开票商品名称"] = item.cgd_inv_good_name;
+      _template['采购税率'] = item.cgd_inv_tax ? (((item.cgd_inv_tax.split("%"))[0]) / 100).toFixed(2) : "";
+      _template['财务类目编码'] = item.inv_cat_code;
+      _template['财务类目名称'] = item.inv_cat_name;
+      _template['财务开票商品名称'] = item.inv_good_name;
+      _template['财务税率'] = item.inv_tax ? (((item.inv_tax.split("%"))[0]) / 100).toFixed(2) : ""
+
+      _template['税率标识'] = item.inv_tag && item.inv_tag !== "0" ? mapTag[item.inv_tag] : "";
+      _template["是否有优惠政策"] = Number(item.status) >= 2 ? mapDiscount[item.is_discount] : "";
+      _template["增值税管理内容"] = item.addTax;
+    }
+
+    data.push(_template);
+  });
+
+  //创建数据表
+  const workBook = utils.book_new();
+  const workSheet = utils.json_to_sheet(data);
+  utils.book_append_sheet(workBook, workSheet, "sheet");
+
+  //导出模板
+  writeFile(workBook, `${judieFilename}.xlsx`, {
+    bookType: "xlsx"
+  });
+}
+</script>
+
+<template>
+  <div class="main role">
+    <PagePower :is-show="hasPermissionWithCode('001')">
+      <div w-full>
+        <PageSearch :form-config="searchFormConfig" @search-btn-click="handleSearchClick"
+          @reset-btn-click="handleResetClick" />
+        <PageContent ref="pageContentRef" :powers="permissions" :content-config="contentConfig"
+          @preview-btn-click="({ spuCode }) => toDetail(spuCode)" @selection-change="nodes => (selects = nodes)">
+          <template #header>
+            <ElButton size="small" v-if="hasPermissionWithCode('041')" :icon="useRenderIcon('arrow-down-line')"
+              @click="() => onDownloadTemplate(true)">下载采购设置类目模板</ElButton>
+            <ElButton size="small" type="primary" v-if="hasPermissionWithCode('042') && !isSuperUser"
+              :icon="useRenderIcon('arrow-up-line')" @click="() => procureUploadModalRef.onDisplay()">批量导入采购设置类目结果
+            </ElButton>
+            <ElButton size="small" v-if="hasPermissionWithCode('036')" :icon="useRenderIcon('arrow-down-line')"
+              @click="() => onDownloadTemplate()">下载财务设置类目模板</ElButton>
+            <ElButton size="small" type="primary" :icon="useRenderIcon('arrow-up-line')"
+              v-if="hasPermissionWithCode('037') && !isSuperUser" @click="() => execlUploadModalRef.onDisplay()">
+              批量导入财务设置类目结果</ElButton>
+          </template>
+        </PageContent>
+
+        <ExeclUploadModal ref="execlUploadModalRef" @on-success="() => pageContentRef.onSearch()" />
+        <ProcureImport ref="procureUploadModalRef" @on-success="() => pageContentRef.onSearch()" />
+      </div>
+    </PagePower>
+  </div>
+</template>
+
+<style scoped lang="scss">
+:deep(.el-dropdown-menu__item i) {
+  margin: 0;
+}
+</style>

+ 10 - 4
src/views/supplyInvoiceSaleSettings/supplyConsultingCost/config/configs.ts

@@ -121,16 +121,22 @@ export const good_detail_columns = [
   {
     field: "companyName",
     label: "业务公司名称",
-    render: (companyName, { companyNo }) =>
+    render: (_, { companyNo, companyName }) =>
       createTooltip(companyName, "业务公司编码 : " + companyNo, 270),
-    span: 12
+    span: 8
   },
   {
     field: "supplierName",
     label: "供应商名称",
-    render: (supplierName, { supplierNo }) =>
+    render: (_, { supplierNo, supplierName }) =>
       createTooltip(supplierName, "供应商编码 : " + supplierNo, 270),
-    span: 12
+    span: 8
+  },
+  {
+    label: "源头供应商",
+    render: (_, { cgd_supplierNo, cgd_supplierName }) =>
+      createTooltip(cgd_supplierName, "供应商编码 : " + cgd_supplierNo, 270),
+    span: 8
   },
 
   {

+ 1 - 1
src/views/supplyInvoiceSaleSettings/supplyConsultingCost/config/content.config.ts

@@ -121,7 +121,7 @@ const contentConfig: ContentConfig = {
   companyProp: "supplierNo",
   columns,
   apis: {
-    httpList
+    httpList: (params = {}) => httpList({ ...params, isChild: 0 })
   }
 };
 

+ 10 - 4
src/views/supplyInvoiceSaleSettings/supplyModifyRecord/config/configs.ts

@@ -81,16 +81,22 @@ export const good_detail_columns = [
   {
     field: "companyName",
     label: "业务公司名称",
-    render: (companyName, { companyNo }) =>
+    render: (_, { companyNo, companyName }) =>
       createTooltip(companyName, "业务公司编码 : " + companyNo, 270),
-    span: 12
+    span: 8
   },
   {
     field: "supplierName",
     label: "供应商名称",
-    render: (supplierName, { supplierNo }) =>
+    render: (_, { supplierNo, supplierName }) =>
       createTooltip(supplierName, "供应商编码 : " + supplierNo, 270),
-    span: 12
+    span: 8
+  },
+  {
+    label: "源头供应商",
+    render: (_, { cgd_supplierNo, cgd_supplierName }) =>
+      createTooltip(cgd_supplierName, "供应商编码 : " + cgd_supplierNo, 270),
+    span: 8
   },
 
   {

+ 1 - 1
src/views/system/menuOperator/components/edit-dialog.vue

@@ -40,7 +40,7 @@ const ruleForm = ref({ ...initform });
 const rules = reactive<FormRules>({
   menu_name: [
     { required: true, message: "请输入菜单名称", trigger: "blur" },
-    { min: 1, max: 10, message: "长度在 1 到 10 个字符", trigger: "blur" }
+    // { min: 1, max: 10, message: "长度在 1 到 10 个字符", trigger: "blur" }
   ],
   menu_type: [
     {

+ 11 - 2
vite.config.ts

@@ -5,6 +5,8 @@ import { warpperEnv, regExps } from "./build";
 import { getPluginsList } from "./build/plugins";
 import { UserConfigExport, ConfigEnv, loadEnv } from "vite";
 
+import zipPack from "vite-plugin-zip-pack";
+
 import { createHash } from "crypto"
 
 // 当前执行node命令时文件夹的地址(工作目录)
@@ -62,7 +64,13 @@ export default ({ command, mode }: ConfigEnv): UserConfigExport => {
             }
           : null
     },
-    plugins: getPluginsList(command, VITE_LEGACY),
+    plugins: [...getPluginsList(command, VITE_LEGACY),
+      zipPack({
+      inDir:'dist',
+      outFileName:'build.zip',
+      pathPrefix:''
+    })
+  ],
     optimizeDeps: {
       include: ["pinia", "lodash-es", "@vueuse/core"],
       exclude: ["@pureadmin/theme/dist/browser-utils"]
@@ -82,7 +90,8 @@ export default ({ command, mode }: ConfigEnv): UserConfigExport => {
               return 'assets/[name].[hash].js'
             }
           }
-        }
+        },
+        
       }
     },
     define: {