Procházet zdrojové kódy

ie整合,暂未修复 绩效核算规则ie页面加载报错,关系图谱兼容

zhengnaiwen_citu před 2 měsíci
rodič
revize
2a1fc94c5a

+ 33 - 23
package-lock.json

@@ -913,6 +913,27 @@
         "@babel/helper-plugin-utils": "^7.27.1"
       }
     },
+    "@babel/polyfill": {
+      "version": "7.12.1",
+      "resolved": "https://registry.npmmirror.com/@babel/polyfill/-/polyfill-7.12.1.tgz",
+      "integrity": "sha512-X0pi0V6gxLi6lFZpGmeNa4zxtwEmCs42isWLNjZZDE0Y8yVfgu0T2OAHlzBbdYlqbW/YXVvoBHpATEM+goCj8g==",
+      "requires": {
+        "core-js": "^2.6.5",
+        "regenerator-runtime": "^0.13.4"
+      },
+      "dependencies": {
+        "core-js": {
+          "version": "2.6.12",
+          "resolved": "https://registry.npmmirror.com/core-js/-/core-js-2.6.12.tgz",
+          "integrity": "sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ=="
+        },
+        "regenerator-runtime": {
+          "version": "0.13.11",
+          "resolved": "https://registry.npmmirror.com/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz",
+          "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg=="
+        }
+      }
+    },
     "@babel/preset-env": {
       "version": "7.28.0",
       "resolved": "https://registry.npmmirror.com/@babel/preset-env/-/preset-env-7.28.0.tgz",
@@ -2881,15 +2902,6 @@
           "resolved": "https://registry.npmmirror.com/ms/-/ms-2.0.0.tgz",
           "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
           "dev": true
-        },
-        "qs": {
-          "version": "6.13.0",
-          "resolved": "https://registry.npmmirror.com/qs/-/qs-6.13.0.tgz",
-          "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==",
-          "dev": true,
-          "requires": {
-            "side-channel": "^1.0.6"
-          }
         }
       }
     },
@@ -3035,6 +3047,7 @@
       "version": "1.0.4",
       "resolved": "https://registry.npmmirror.com/call-bound/-/call-bound-1.0.4.tgz",
       "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==",
+      "dev": true,
       "requires": {
         "call-bind-apply-helpers": "^1.0.2",
         "get-intrinsic": "^1.3.0"
@@ -5134,15 +5147,6 @@
           "resolved": "https://registry.npmmirror.com/ms/-/ms-2.0.0.tgz",
           "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
           "dev": true
-        },
-        "qs": {
-          "version": "6.13.0",
-          "resolved": "https://registry.npmmirror.com/qs/-/qs-6.13.0.tgz",
-          "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==",
-          "dev": true,
-          "requires": {
-            "side-channel": "^1.0.6"
-          }
         }
       }
     },
@@ -7523,7 +7527,8 @@
     "object-inspect": {
       "version": "1.13.4",
       "resolved": "https://registry.npmmirror.com/object-inspect/-/object-inspect-1.13.4.tgz",
-      "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew=="
+      "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==",
+      "dev": true
     },
     "object-keys": {
       "version": "1.1.1",
@@ -8720,11 +8725,12 @@
       "dev": true
     },
     "qs": {
-      "version": "6.14.0",
-      "resolved": "https://registry.npmmirror.com/qs/-/qs-6.14.0.tgz",
-      "integrity": "sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==",
+      "version": "6.13.0",
+      "resolved": "https://registry.npmmirror.com/qs/-/qs-6.13.0.tgz",
+      "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==",
+      "dev": true,
       "requires": {
-        "side-channel": "^1.1.0"
+        "side-channel": "^1.0.6"
       }
     },
     "queue-microtask": {
@@ -9401,6 +9407,7 @@
       "version": "1.1.0",
       "resolved": "https://registry.npmmirror.com/side-channel/-/side-channel-1.1.0.tgz",
       "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==",
+      "dev": true,
       "requires": {
         "es-errors": "^1.3.0",
         "object-inspect": "^1.13.3",
@@ -9413,6 +9420,7 @@
       "version": "1.0.0",
       "resolved": "https://registry.npmmirror.com/side-channel-list/-/side-channel-list-1.0.0.tgz",
       "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==",
+      "dev": true,
       "requires": {
         "es-errors": "^1.3.0",
         "object-inspect": "^1.13.3"
@@ -9422,6 +9430,7 @@
       "version": "1.0.1",
       "resolved": "https://registry.npmmirror.com/side-channel-map/-/side-channel-map-1.0.1.tgz",
       "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==",
+      "dev": true,
       "requires": {
         "call-bound": "^1.0.2",
         "es-errors": "^1.3.0",
@@ -9433,6 +9442,7 @@
       "version": "1.0.2",
       "resolved": "https://registry.npmmirror.com/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz",
       "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==",
+      "dev": true,
       "requires": {
         "call-bound": "^1.0.2",
         "es-errors": "^1.3.0",

+ 1 - 1
package.json

@@ -11,6 +11,7 @@
   "dependencies": {
     "@babel/plugin-transform-runtime": "^7.24.6",
     "@babel/preset-env": "^7.23.9",
+    "@babel/polyfill": "^7.12.1",
     "@mdi/font": "^7.4.47",
     "@wangeditor/editor": "^5.1.23",
     "@wangeditor/editor-for-vue": "^1.0.2",
@@ -23,7 +24,6 @@
     "fs": "0.0.1-security",
     "lodash": "^4.17.21",
     "nprogress": "^0.2.0",
-    "qs": "^6.10.4",
     "regenerator-runtime": "^0.14.1",
     "relation-graph": "^2.2.11",
     "scrolling-element": "^1.0.2",

+ 20 - 12
src/components/TabsTemplate/index.vue

@@ -1,19 +1,19 @@
 <template>
   <el-tabs v-model="activeName" @tab-click="handleClick">
-    <el-tab-pane
-      v-for="item in items"
-      :key="item.name"
-      :label="item.label"
-      :name="item.name"
-    >
-      <component :is="item.component" :ref="item.name" :label="item.label" v-bind="$attrs" @hook:mounted="onComponentMounted" v-on="$listeners"></component>
-    </el-tab-pane>
+      <el-tab-pane
+        v-for="item in items"
+        :key="item.name"
+        :label="item.label"
+        :name="item.name"
+      >
+        <component :is="item.component" :ref="item.name" :label="item.label" v-bind="$attrs" @hook:mounted="onComponentMounted" v-on="$listeners"></component>
+      </el-tab-pane>
   </el-tabs>
 </template>
 
 <script>
 export default {
-  name: 'salaryFixedRules',
+  name: 'TabsTemplate',
   props: {
     importContext: {
       type: Function,
@@ -27,12 +27,15 @@ export default {
       isRender: false
     }
   },
-  created () {
+  mounted () {
+    console.log(11111)
+    // this.$nextTick(() => {
     this.items = this.$route.meta.roles.filter(e => e.hidden === 1).sort((a, b) => a.sort - b.sort).map(e => {
+      const path = `${e.component}/index.vue`
       return {
         name: e.name,
         label: e.label,
-        component: () => this.importContext(`${e.component}/index.vue`)
+        component: () => this.importContext(path)
       }
     })
     if (this.$route.query.name) {
@@ -40,6 +43,7 @@ export default {
     } else {
       this.activeName = this.items[0].name
     }
+    // })
   },
   computed: {
     name () {
@@ -57,6 +61,9 @@ export default {
         if (this.isRender) {
           return
         }
+        if (!this.$refs[this.activeName]) {
+          return
+        }
         this.isRender = true
         this.$refs[this.activeName][0].onInit && this.$refs[this.activeName][0].onInit(this.name)
       })
@@ -64,7 +71,8 @@ export default {
     handleClick () {
       this.$router.push(`${this.$route.path}?name=${this.activeName}`)
       this.$nextTick(() => {
-        this.$refs[this.activeName][0].onInit && this.$refs[this.activeName][0].onInit(this.name)
+        const _ref = this.$refs[this.activeName]
+        _ref && _ref[0] && _ref[0].onInit && _ref[0].onInit(this.name)
       })
     }
   }

+ 1 - 1
src/main.js

@@ -20,7 +20,7 @@ import '@mdi/font/css/materialdesignicons.min.css'
 // 引入公用scss
 import '@/styles/index.scss'
 import '@/styles/orangeTheme.scss'
-
+require('@babel/polyfill')
 promise.polyfill()
 
 // 修改 MessageBox 的默认配置

+ 61 - 14
src/utils/index.js

@@ -53,24 +53,71 @@ export function underscoreToCamel (str) {
   return str.replace(/_(\w)/g, (_, letter) => letter.toUpperCase())
 }
 
-// 文件流下载文件
+/**
+ * 下载文件方法(兼容IE11和现代浏览器)
+ * @param {Blob|ArrayBuffer|String} data - 文件数据(支持Blob、ArrayBuffer或Base64字符串)
+ * @param {String} filename - 下载的文件名
+ * @param {String} [type] - 文件MIME类型,如'application/pdf'
+ */
 export function downloadFile (data, filename, type = 'application/vnd.ms-excel') {
-  const blob = new Blob([data], { type })
-  if (window.navigator.msSaveOrOpenBlob) {
-    // 兼容ie11
-    try {
-      window.navigator.msSaveOrOpenBlob(blob, filename)
-    } catch (e) {
-      console.log(e)
+  // 处理不同类型的数据输入
+  let blob
+  if (data instanceof Blob) {
+    blob = data
+  } else if (data instanceof ArrayBuffer) {
+    blob = new Blob([data], { type: type || 'application/octet-stream' })
+  } else if (typeof data === 'string') {
+    // 处理Base64字符串
+    const byteCharacters = atob(data)
+    const byteNumbers = new Array(byteCharacters.length)
+    for (let i = 0; i < byteCharacters.length; i++) {
+      byteNumbers[i] = byteCharacters.charCodeAt(i)
     }
+    const byteArray = new Uint8Array(byteNumbers)
+    blob = new Blob([byteArray], { type: type || 'application/octet-stream' })
+  } else {
+    console.error('Unsupported data type')
+    return
+  }
+
+  // IE11专用处理
+  if (window.navigator && window.navigator.msSaveOrOpenBlob) {
+    window.navigator.msSaveOrOpenBlob(blob, filename)
     return
   }
-  const objectUrl = URL.createObjectURL(blob)
-  const link = document.createElement('a')
-  link.href = objectUrl
-  link.download = filename
-  link.click()
-  URL.revokeObjectURL(objectUrl)
+
+  // 现代浏览器处理
+  const url = window.URL.createObjectURL(blob)
+  const a = document.createElement('a')
+  a.style.display = 'none'
+  a.href = url
+  a.download = filename
+
+  // 添加到DOM中(某些浏览器需要)
+  document.body.appendChild(a)
+  a.click()
+
+  // 清理
+  setTimeout(() => {
+    document.body.removeChild(a)
+    window.URL.revokeObjectURL(url)
+  }, 100)
+  // const blob = new Blob([data], { type })
+  // if (window.navigator.msSaveOrOpenBlob) {
+  //   // 兼容ie11
+  //   try {
+  //     window.navigator.msSaveOrOpenBlob(blob, filename)
+  //   } catch (e) {
+  //     console.log(e)
+  //   }
+  //   return
+  // }
+  // const objectUrl = URL.createObjectURL(blob)
+  // const link = document.createElement('a')
+  // link.href = objectUrl
+  // link.download = filename
+  // link.click()
+  // URL.revokeObjectURL(objectUrl)
 }
 
 /**

+ 20 - 0
src/utils/qs.js

@@ -0,0 +1,20 @@
+
+const stringify = (obj) => {
+  return Object.keys(obj)
+    .map((key) => `${key}=${encodeURIComponent(obj[key])}`)
+    .join('&')
+}
+
+const parse = (str) => {
+  const obj = {}
+  str.split('&').forEach((item) => {
+    const [key, value] = item.split('=')
+    obj[key] = decodeURIComponent(value)
+  })
+  return obj
+}
+
+export default {
+  stringify,
+  parse
+}

+ 1 - 1
src/utils/request.js

@@ -6,7 +6,7 @@ import {
   instanceWorkflow
 } from '@/api/workflow'
 import route from '@/router'
-import qs from 'qs'
+import qs from '@/utils/qs'
 import Vue from 'vue'
 import store from '@/store'
 // create an axios instance

+ 1 - 1
src/views/humanResources/panorama/dynamic/panoramaDetailsBaseInfo.vue

@@ -32,7 +32,7 @@ import {
   getRosterDetails,
   getOrganizationDetails
 } from '@/api/system'
-import qs from 'qs'
+import qs from '@/utils/qs'
 export default {
   name: 'panoramaDetailsBaseInfo',
   data () {

+ 1 - 1
src/views/humanResources/panorama/index.vue

@@ -67,7 +67,7 @@ import {
   getOrganizationDetails
 } from '@/api/system'
 
-import qs from 'qs'
+import qs from '@/utils/qs'
 import { mapGetters } from 'vuex'
 export default {
   name: 'human-resources-panorama',

+ 1 - 1
src/views/humanResources/panorama/panoramaDetails.vue

@@ -41,7 +41,7 @@ import PanoramaDetailsMenu from './panoramaDetailsMenu.vue'
 import {
   findPath
 } from '@/utils/panorama'
-import qs from 'qs'
+import qs from '@/utils/qs'
 const DEFAULT_COMPONENT = {
   基础信息: 'humanResources/panorama/dynamic/panoramaDetailsBaseInfo'
 }

+ 4 - 1
src/views/salary/solution/index.vue

@@ -1,6 +1,6 @@
 <template>
   <div class="white pa-3">
-    <TabTemplate :import-context="(path) => import(`./${path}`)" @history="onHistory"></TabTemplate>
+    <TabTemplate :import-context="importPath" @history="onHistory"></TabTemplate>
     <el-drawer
       :title="itemData.title"
       :visible.sync="show"
@@ -38,6 +38,9 @@ export default {
     }
   },
   methods: {
+    importPath (path) {
+      return import(`./${path}`)
+    },
     async onHistory ({ performanceSolutionId }) {
       this.show = true
       this.loading = true

+ 3 - 10
src/views/salary/solution/salarySolution/index.vue

@@ -36,12 +36,6 @@ import SalarySolutionHistory from './salarySolutionHistory.vue'
 import SalarySolutionDetails from './salarySolutionDetails.vue'
 export default {
   name: 'salary-solution-list',
-  props: {
-    permission: {
-      type: Array,
-      default: () => []
-    }
-  },
   components: {
     ListTemplate,
     SalarySolutionEdit,
@@ -54,12 +48,11 @@ export default {
       loading: false
     }
   },
-  mounted () {
-    this.$emit('mounted')
-  },
   methods: {
     onInit () {
-      this.$refs.listTemplateRefs.onInit()
+      this.$nextTick(() => {
+        this.$refs.listTemplateRefs.onInit()
+      })
     },
     async onSend (row) {
       this.loading = true

+ 1 - 1
vue.config.js

@@ -66,7 +66,7 @@ module.exports = defineConfig({
     config.devtool = 'source-map'
     // 代码拆分
     config.optimization.splitChunks.chunks = 'all'
-    config.entry = ['core-js/stable', 'regenerator-runtime/runtime', './src/main.js']
+    config.entry.app = ['core-js/stable', 'regenerator-runtime/runtime', './src/main.js']
     // 代码拆分配置
     // config.optimization.splitChunks = {
     //   chunks: 'all',