pull/1/head
LiuJiaNan 2024-01-31 15:38:40 +08:00
parent a643da6979
commit 62798bee5f
20 changed files with 1182 additions and 769 deletions

539
package-lock.json generated
View File

@ -12,6 +12,7 @@
"@icon-park/vue-next": "^1.4.2",
"@vueuse/core": "^9.13.0",
"@vueuse/integrations": "^10.7.1",
"@wangeditor/editor-for-vue": "^5.1.12",
"animate.css": "^4.1.1",
"autofit.js": "^3.0.7",
"axios": "^1.6.3",
@ -24,6 +25,7 @@
"mitt": "^3.0.1",
"nanoid": "^5.0.4",
"normalize.css": "^8.0.1",
"pako": "^2.1.0",
"pinia": "^2.1.7",
"pinia-plugin-persistedstate": "^3.2.1",
"qrcode": "^1.5.3",
@ -1255,6 +1257,12 @@
}
}
},
"node_modules/@transloadit/prettier-bytes": {
"version": "0.0.7",
"resolved": "https://registry.npmmirror.com/@transloadit/prettier-bytes/-/prettier-bytes-0.0.7.tgz",
"integrity": "sha512-VeJbUb0wEKbcwaSlj5n+LscBl9IPgLPkHVGBkh00cztv6X4L/TJXK58LzFuBKX7/GAfiGhIwH67YTLTlzvIzBA==",
"peer": true
},
"node_modules/@types/eslint": {
"version": "8.56.2",
"resolved": "https://registry.npmmirror.com/@types/eslint/-/eslint-8.56.2.tgz",
@ -1271,6 +1279,12 @@
"integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==",
"dev": true
},
"node_modules/@types/event-emitter": {
"version": "0.3.5",
"resolved": "https://registry.npmmirror.com/@types/event-emitter/-/event-emitter-0.3.5.tgz",
"integrity": "sha512-zx2/Gg0Eg7gwEiOIIh5w9TrhKKTeQh7CPCOPNc0el4pLSwzebA8SmnHwZs2dWlLONvyulykSwGSQxQHLhjGLvQ==",
"peer": true
},
"node_modules/@types/json-schema": {
"version": "7.0.15",
"resolved": "https://registry.npmmirror.com/@types/json-schema/-/json-schema-7.0.15.tgz",
@ -1328,6 +1342,85 @@
"integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==",
"dev": true
},
"node_modules/@uppy/companion-client": {
"version": "2.2.2",
"resolved": "https://registry.npmmirror.com/@uppy/companion-client/-/companion-client-2.2.2.tgz",
"integrity": "sha512-5mTp2iq97/mYSisMaBtFRry6PTgZA6SIL7LePteOV5x0/DxKfrZW3DEiQERJmYpHzy7k8johpm2gHnEKto56Og==",
"peer": true,
"dependencies": {
"@uppy/utils": "^4.1.2",
"namespace-emitter": "^2.0.1"
}
},
"node_modules/@uppy/core": {
"version": "2.3.4",
"resolved": "https://registry.npmmirror.com/@uppy/core/-/core-2.3.4.tgz",
"integrity": "sha512-iWAqppC8FD8mMVqewavCz+TNaet6HPXitmGXpGGREGrakZ4FeuWytVdrelydzTdXx6vVKkOmI2FLztGg73sENQ==",
"peer": true,
"dependencies": {
"@transloadit/prettier-bytes": "0.0.7",
"@uppy/store-default": "^2.1.1",
"@uppy/utils": "^4.1.3",
"lodash.throttle": "^4.1.1",
"mime-match": "^1.0.2",
"namespace-emitter": "^2.0.1",
"nanoid": "^3.1.25",
"preact": "^10.5.13"
}
},
"node_modules/@uppy/core/node_modules/nanoid": {
"version": "3.3.7",
"resolved": "https://registry.npmmirror.com/nanoid/-/nanoid-3.3.7.tgz",
"integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==",
"peer": true,
"bin": {
"nanoid": "bin/nanoid.cjs"
},
"engines": {
"node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1"
}
},
"node_modules/@uppy/store-default": {
"version": "2.1.1",
"resolved": "https://registry.npmmirror.com/@uppy/store-default/-/store-default-2.1.1.tgz",
"integrity": "sha512-xnpTxvot2SeAwGwbvmJ899ASk5tYXhmZzD/aCFsXePh/v8rNvR2pKlcQUH7cF/y4baUGq3FHO/daKCok/mpKqQ==",
"peer": true
},
"node_modules/@uppy/utils": {
"version": "4.1.3",
"resolved": "https://registry.npmmirror.com/@uppy/utils/-/utils-4.1.3.tgz",
"integrity": "sha512-nTuMvwWYobnJcytDO3t+D6IkVq/Qs4Xv3vyoEZ+Iaf8gegZP+rEyoaFT2CK5XLRMienPyqRqNbIfRuFaOWSIFw==",
"peer": true,
"dependencies": {
"lodash.throttle": "^4.1.1"
}
},
"node_modules/@uppy/xhr-upload": {
"version": "2.1.3",
"resolved": "https://registry.npmmirror.com/@uppy/xhr-upload/-/xhr-upload-2.1.3.tgz",
"integrity": "sha512-YWOQ6myBVPs+mhNjfdWsQyMRWUlrDLMoaG7nvf/G6Y3GKZf8AyjFDjvvJ49XWQ+DaZOftGkHmF1uh/DBeGivJQ==",
"peer": true,
"dependencies": {
"@uppy/companion-client": "^2.2.2",
"@uppy/utils": "^4.1.2",
"nanoid": "^3.1.25"
},
"peerDependencies": {
"@uppy/core": "^2.3.3"
}
},
"node_modules/@uppy/xhr-upload/node_modules/nanoid": {
"version": "3.3.7",
"resolved": "https://registry.npmmirror.com/nanoid/-/nanoid-3.3.7.tgz",
"integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==",
"peer": true,
"bin": {
"nanoid": "bin/nanoid.cjs"
},
"engines": {
"node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1"
}
},
"node_modules/@vitejs/plugin-basic-ssl": {
"version": "1.1.0",
"resolved": "https://registry.npmmirror.com/@vitejs/plugin-basic-ssl/-/plugin-basic-ssl-1.1.0.tgz",
@ -1654,6 +1747,176 @@
}
}
},
"node_modules/@wangeditor/editor": {
"version": "5.1.23",
"resolved": "https://registry.npmmirror.com/@wangeditor/editor/-/editor-5.1.23.tgz",
"integrity": "sha512-0RxfeVTuK1tktUaPROnCoFfaHVJpRAIE2zdS0mpP+vq1axVQpLjM8+fCvKzqYIkH0Pg+C+44hJpe3VVroSkEuQ==",
"peer": true,
"dependencies": {
"@uppy/core": "^2.1.1",
"@uppy/xhr-upload": "^2.0.3",
"@wangeditor/basic-modules": "^1.1.7",
"@wangeditor/code-highlight": "^1.0.3",
"@wangeditor/core": "^1.1.19",
"@wangeditor/list-module": "^1.0.5",
"@wangeditor/table-module": "^1.1.4",
"@wangeditor/upload-image-module": "^1.0.2",
"@wangeditor/video-module": "^1.1.4",
"dom7": "^3.0.0",
"is-hotkey": "^0.2.0",
"lodash.camelcase": "^4.3.0",
"lodash.clonedeep": "^4.5.0",
"lodash.debounce": "^4.0.8",
"lodash.foreach": "^4.5.0",
"lodash.isequal": "^4.5.0",
"lodash.throttle": "^4.1.1",
"lodash.toarray": "^4.4.0",
"nanoid": "^3.2.0",
"slate": "^0.72.0",
"snabbdom": "^3.1.0"
}
},
"node_modules/@wangeditor/editor-for-vue": {
"version": "5.1.12",
"resolved": "https://registry.npmmirror.com/@wangeditor/editor-for-vue/-/editor-for-vue-5.1.12.tgz",
"integrity": "sha512-0Ds3D8I+xnpNWezAeO7HmPRgTfUxHLMd9JKcIw+QzvSmhC5xUHbpCcLU+KLmeBKTR/zffnS5GQo6qi3GhTMJWQ==",
"peerDependencies": {
"@wangeditor/editor": ">=5.1.0",
"vue": "^3.0.5"
}
},
"node_modules/@wangeditor/editor/node_modules/@wangeditor/basic-modules": {
"version": "1.1.7",
"resolved": "https://registry.npmmirror.com/@wangeditor/basic-modules/-/basic-modules-1.1.7.tgz",
"integrity": "sha512-cY9CPkLJaqF05STqfpZKWG4LpxTMeGSIIF1fHvfm/mz+JXatCagjdkbxdikOuKYlxDdeqvOeBmsUBItufDLXZg==",
"peer": true,
"dependencies": {
"is-url": "^1.2.4"
},
"peerDependencies": {
"@wangeditor/core": "1.x",
"dom7": "^3.0.0",
"lodash.throttle": "^4.1.1",
"nanoid": "^3.2.0",
"slate": "^0.72.0",
"snabbdom": "^3.1.0"
}
},
"node_modules/@wangeditor/editor/node_modules/@wangeditor/code-highlight": {
"version": "1.0.3",
"resolved": "https://registry.npmmirror.com/@wangeditor/code-highlight/-/code-highlight-1.0.3.tgz",
"integrity": "sha512-iazHwO14XpCuIWJNTQTikqUhGKyqj+dUNWJ9288Oym9M2xMVHvnsOmDU2sgUDWVy+pOLojReMPgXCsvvNlOOhw==",
"peer": true,
"dependencies": {
"prismjs": "^1.23.0"
},
"peerDependencies": {
"@wangeditor/core": "1.x",
"dom7": "^3.0.0",
"slate": "^0.72.0",
"snabbdom": "^3.1.0"
}
},
"node_modules/@wangeditor/editor/node_modules/@wangeditor/core": {
"version": "1.1.19",
"resolved": "https://registry.npmmirror.com/@wangeditor/core/-/core-1.1.19.tgz",
"integrity": "sha512-KevkB47+7GhVszyYF2pKGKtCSj/YzmClsD03C3zTt+9SR2XWT5T0e3yQqg8baZpcMvkjs1D8Dv4fk8ok/UaS2Q==",
"peer": true,
"dependencies": {
"@types/event-emitter": "^0.3.3",
"event-emitter": "^0.3.5",
"html-void-elements": "^2.0.0",
"i18next": "^20.4.0",
"scroll-into-view-if-needed": "^2.2.28",
"slate-history": "^0.66.0"
},
"peerDependencies": {
"@uppy/core": "^2.1.1",
"@uppy/xhr-upload": "^2.0.3",
"dom7": "^3.0.0",
"is-hotkey": "^0.2.0",
"lodash.camelcase": "^4.3.0",
"lodash.clonedeep": "^4.5.0",
"lodash.debounce": "^4.0.8",
"lodash.foreach": "^4.5.0",
"lodash.isequal": "^4.5.0",
"lodash.throttle": "^4.1.1",
"lodash.toarray": "^4.4.0",
"nanoid": "^3.2.0",
"slate": "^0.72.0",
"snabbdom": "^3.1.0"
}
},
"node_modules/@wangeditor/editor/node_modules/@wangeditor/list-module": {
"version": "1.0.5",
"resolved": "https://registry.npmmirror.com/@wangeditor/list-module/-/list-module-1.0.5.tgz",
"integrity": "sha512-uDuYTP6DVhcYf7mF1pTlmNn5jOb4QtcVhYwSSAkyg09zqxI1qBqsfUnveeDeDqIuptSJhkh81cyxi+MF8sEPOQ==",
"peer": true,
"peerDependencies": {
"@wangeditor/core": "1.x",
"dom7": "^3.0.0",
"slate": "^0.72.0",
"snabbdom": "^3.1.0"
}
},
"node_modules/@wangeditor/editor/node_modules/@wangeditor/table-module": {
"version": "1.1.4",
"resolved": "https://registry.npmmirror.com/@wangeditor/table-module/-/table-module-1.1.4.tgz",
"integrity": "sha512-5saanU9xuEocxaemGdNi9t8MCDSucnykEC6jtuiT72kt+/Hhh4nERYx1J20OPsTCCdVr7hIyQenFD1iSRkIQ6w==",
"peer": true,
"peerDependencies": {
"@wangeditor/core": "1.x",
"dom7": "^3.0.0",
"lodash.isequal": "^4.5.0",
"lodash.throttle": "^4.1.1",
"nanoid": "^3.2.0",
"slate": "^0.72.0",
"snabbdom": "^3.1.0"
}
},
"node_modules/@wangeditor/editor/node_modules/@wangeditor/upload-image-module": {
"version": "1.0.2",
"resolved": "https://registry.npmmirror.com/@wangeditor/upload-image-module/-/upload-image-module-1.0.2.tgz",
"integrity": "sha512-z81lk/v71OwPDYeQDxj6cVr81aDP90aFuywb8nPD6eQeECtOymrqRODjpO6VGvCVxVck8nUxBHtbxKtjgcwyiA==",
"peer": true,
"peerDependencies": {
"@uppy/core": "^2.0.3",
"@uppy/xhr-upload": "^2.0.3",
"@wangeditor/basic-modules": "1.x",
"@wangeditor/core": "1.x",
"dom7": "^3.0.0",
"lodash.foreach": "^4.5.0",
"slate": "^0.72.0",
"snabbdom": "^3.1.0"
}
},
"node_modules/@wangeditor/editor/node_modules/@wangeditor/video-module": {
"version": "1.1.4",
"resolved": "https://registry.npmmirror.com/@wangeditor/video-module/-/video-module-1.1.4.tgz",
"integrity": "sha512-ZdodDPqKQrgx3IwWu4ZiQmXI8EXZ3hm2/fM6E3t5dB8tCaIGWQZhmqd6P5knfkRAd3z2+YRSRbxOGfoRSp/rLg==",
"peer": true,
"peerDependencies": {
"@uppy/core": "^2.1.4",
"@uppy/xhr-upload": "^2.0.7",
"@wangeditor/core": "1.x",
"dom7": "^3.0.0",
"nanoid": "^3.2.0",
"slate": "^0.72.0",
"snabbdom": "^3.1.0"
}
},
"node_modules/@wangeditor/editor/node_modules/nanoid": {
"version": "3.3.7",
"resolved": "https://registry.npmmirror.com/nanoid/-/nanoid-3.3.7.tgz",
"integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==",
"peer": true,
"bin": {
"nanoid": "bin/nanoid.cjs"
},
"engines": {
"node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1"
}
},
"node_modules/acorn": {
"version": "8.11.3",
"resolved": "https://registry.npmmirror.com/acorn/-/acorn-8.11.3.tgz",
@ -2151,6 +2414,12 @@
"node": ">= 0.8"
}
},
"node_modules/compute-scroll-into-view": {
"version": "1.0.20",
"resolved": "https://registry.npmmirror.com/compute-scroll-into-view/-/compute-scroll-into-view-1.0.20.tgz",
"integrity": "sha512-UCB0ioiyj8CRjtrvaceBLqqhZCVP+1B8+NWQhmdsm0VXOJtobBCf1dBQmebCCo34qZmUwZfIH2MZLqNHazrfjg==",
"peer": true
},
"node_modules/concat-map": {
"version": "0.0.1",
"resolved": "https://registry.npmmirror.com/concat-map/-/concat-map-0.0.1.tgz",
@ -2215,6 +2484,16 @@
"resolved": "https://registry.npmmirror.com/csstype/-/csstype-3.1.3.tgz",
"integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw=="
},
"node_modules/d": {
"version": "1.0.1",
"resolved": "https://registry.npmmirror.com/d/-/d-1.0.1.tgz",
"integrity": "sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==",
"peer": true,
"dependencies": {
"es5-ext": "^0.10.50",
"type": "^1.0.1"
}
},
"node_modules/dayjs": {
"version": "1.11.10",
"resolved": "https://registry.npmmirror.com/dayjs/-/dayjs-1.11.10.tgz",
@ -2303,6 +2582,15 @@
"node": ">=6.0.0"
}
},
"node_modules/dom7": {
"version": "3.0.0",
"resolved": "https://registry.npmmirror.com/dom7/-/dom7-3.0.0.tgz",
"integrity": "sha512-oNlcUdHsC4zb7Msx7JN3K0Nro1dzJ48knvBOnDPKJ2GV9wl1i5vydJZUSyOfrkKFDZEud/jBsTk92S/VGSAe/g==",
"peer": true,
"dependencies": {
"ssr-window": "^3.0.0-alpha.1"
}
},
"node_modules/dommatrix": {
"version": "1.0.3",
"resolved": "https://registry.npmmirror.com/dommatrix/-/dommatrix-1.0.3.tgz",
@ -2460,6 +2748,42 @@
"node": ">= 0.4"
}
},
"node_modules/es5-ext": {
"version": "0.10.62",
"resolved": "https://registry.npmmirror.com/es5-ext/-/es5-ext-0.10.62.tgz",
"integrity": "sha512-BHLqn0klhEpnOKSrzn/Xsz2UIW8j+cGmo9JLzr8BiUapV8hPL9+FliFqjwr9ngW7jWdnxv6eO+/LqyhJVqgrjA==",
"hasInstallScript": true,
"peer": true,
"dependencies": {
"es6-iterator": "^2.0.3",
"es6-symbol": "^3.1.3",
"next-tick": "^1.1.0"
},
"engines": {
"node": ">=0.10"
}
},
"node_modules/es6-iterator": {
"version": "2.0.3",
"resolved": "https://registry.npmmirror.com/es6-iterator/-/es6-iterator-2.0.3.tgz",
"integrity": "sha512-zw4SRzoUkd+cl+ZoE15A9o1oQd920Bb0iOJMQkQhl3jNc03YqVjAhG7scf9C5KWRU/R13Orf588uCC6525o02g==",
"peer": true,
"dependencies": {
"d": "1",
"es5-ext": "^0.10.35",
"es6-symbol": "^3.1.1"
}
},
"node_modules/es6-symbol": {
"version": "3.1.3",
"resolved": "https://registry.npmmirror.com/es6-symbol/-/es6-symbol-3.1.3.tgz",
"integrity": "sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA==",
"peer": true,
"dependencies": {
"d": "^1.0.1",
"ext": "^1.1.2"
}
},
"node_modules/esbuild": {
"version": "0.18.20",
"resolved": "https://registry.npmmirror.com/esbuild/-/esbuild-0.18.20.tgz",
@ -2983,6 +3307,31 @@
"node": ">=0.10.0"
}
},
"node_modules/event-emitter": {
"version": "0.3.5",
"resolved": "https://registry.npmmirror.com/event-emitter/-/event-emitter-0.3.5.tgz",
"integrity": "sha512-D9rRn9y7kLPnJ+hMq7S/nhvoKwwvVJahBi2BPmx3bvbsEdK3W9ii8cBSGjP+72/LnM4n6fo3+dkCX5FeTQruXA==",
"peer": true,
"dependencies": {
"d": "1",
"es5-ext": "~0.10.14"
}
},
"node_modules/ext": {
"version": "1.7.0",
"resolved": "https://registry.npmmirror.com/ext/-/ext-1.7.0.tgz",
"integrity": "sha512-6hxeJYaL110a9b5TEJSj0gojyHQAmA2ch5Os+ySCiA1QGdS697XWY1pzsrSjqA9LDEEgdB/KypIlR59RcLuHYw==",
"peer": true,
"dependencies": {
"type": "^2.7.2"
}
},
"node_modules/ext/node_modules/type": {
"version": "2.7.2",
"resolved": "https://registry.npmmirror.com/type/-/type-2.7.2.tgz",
"integrity": "sha512-dzlvlNlt6AXU7EBSfpAscydQ7gXB+pPGsPnfJnZpiNJBDj7IaJzQlBZYGdEi4R9HmPdBv2XmWJ6YUtoTa7lmCw==",
"peer": true
},
"node_modules/fast-deep-equal": {
"version": "3.1.3",
"resolved": "https://registry.npmmirror.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
@ -3367,6 +3716,12 @@
"node": ">= 0.4"
}
},
"node_modules/html-void-elements": {
"version": "2.0.1",
"resolved": "https://registry.npmmirror.com/html-void-elements/-/html-void-elements-2.0.1.tgz",
"integrity": "sha512-0quDb7s97CfemeJAnW9wC0hw78MtW7NU3hqtCD75g2vFlDLt36llsYD7uB7SUzojLMP24N5IatXf7ylGXiGG9A==",
"peer": true
},
"node_modules/html2canvas": {
"version": "1.4.1",
"resolved": "https://registry.npmmirror.com/html2canvas/-/html2canvas-1.4.1.tgz",
@ -3379,6 +3734,15 @@
"node": ">=8.0.0"
}
},
"node_modules/i18next": {
"version": "20.6.1",
"resolved": "https://registry.npmmirror.com/i18next/-/i18next-20.6.1.tgz",
"integrity": "sha512-yCMYTMEJ9ihCwEQQ3phLo7I/Pwycf8uAx+sRHwwk5U9Aui/IZYgQRyMqXafQOw5QQ7DM1Z+WyEXWIqSuJHhG2A==",
"peer": true,
"dependencies": {
"@babel/runtime": "^7.12.0"
}
},
"node_modules/ignore": {
"version": "5.3.0",
"resolved": "https://registry.npmmirror.com/ignore/-/ignore-5.3.0.tgz",
@ -3388,6 +3752,12 @@
"node": ">= 4"
}
},
"node_modules/immer": {
"version": "9.0.21",
"resolved": "https://registry.npmmirror.com/immer/-/immer-9.0.21.tgz",
"integrity": "sha512-bc4NBHqOqSfRW7POMkHd51LvClaeMXpm8dx0e8oE2GORbq5aRK7Bxl4FyzVLdGtLmvLKL7BTDBG5ACQm4HWjTA==",
"peer": true
},
"node_modules/immutable": {
"version": "4.3.4",
"resolved": "https://registry.npmmirror.com/immutable/-/immutable-4.3.4.tgz",
@ -3550,6 +3920,12 @@
"node": ">=0.10.0"
}
},
"node_modules/is-hotkey": {
"version": "0.2.0",
"resolved": "https://registry.npmmirror.com/is-hotkey/-/is-hotkey-0.2.0.tgz",
"integrity": "sha512-UknnZK4RakDmTgz4PI1wIph5yxSs/mvChWs9ifnlXsKuXgWmOkY/hAE0H/k2MIqH0RlRye0i1oC07MCRSD28Mw==",
"peer": true
},
"node_modules/is-negative-zero": {
"version": "2.0.2",
"resolved": "https://registry.npmmirror.com/is-negative-zero/-/is-negative-zero-2.0.2.tgz",
@ -3589,6 +3965,15 @@
"node": ">=8"
}
},
"node_modules/is-plain-object": {
"version": "5.0.0",
"resolved": "https://registry.npmmirror.com/is-plain-object/-/is-plain-object-5.0.0.tgz",
"integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==",
"peer": true,
"engines": {
"node": ">=0.10.0"
}
},
"node_modules/is-regex": {
"version": "1.1.4",
"resolved": "https://registry.npmmirror.com/is-regex/-/is-regex-1.1.4.tgz",
@ -3647,6 +4032,12 @@
"node": ">= 0.4"
}
},
"node_modules/is-url": {
"version": "1.2.4",
"resolved": "https://registry.npmmirror.com/is-url/-/is-url-1.2.4.tgz",
"integrity": "sha512-ITvGim8FhRiYe4IQ5uHSkj7pVaPDrCTkNd3yq3cV7iZAcJdHTUMPMEHcqSOy9xZ9qFenQCvi+2wjH9a1nXqHww==",
"peer": true
},
"node_modules/is-weakref": {
"version": "1.0.2",
"resolved": "https://registry.npmmirror.com/is-weakref/-/is-weakref-1.0.2.tgz",
@ -3814,12 +4205,54 @@
"lodash-es": "*"
}
},
"node_modules/lodash.camelcase": {
"version": "4.3.0",
"resolved": "https://registry.npmmirror.com/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz",
"integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==",
"peer": true
},
"node_modules/lodash.clonedeep": {
"version": "4.5.0",
"resolved": "https://registry.npmmirror.com/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz",
"integrity": "sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ==",
"peer": true
},
"node_modules/lodash.debounce": {
"version": "4.0.8",
"resolved": "https://registry.npmmirror.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz",
"integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==",
"peer": true
},
"node_modules/lodash.foreach": {
"version": "4.5.0",
"resolved": "https://registry.npmmirror.com/lodash.foreach/-/lodash.foreach-4.5.0.tgz",
"integrity": "sha512-aEXTF4d+m05rVOAUG3z4vZZ4xVexLKZGF0lIxuHZ1Hplpk/3B6Z1+/ICICYRLm7c41Z2xiejbkCkJoTlypoXhQ==",
"peer": true
},
"node_modules/lodash.isequal": {
"version": "4.5.0",
"resolved": "https://registry.npmmirror.com/lodash.isequal/-/lodash.isequal-4.5.0.tgz",
"integrity": "sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==",
"peer": true
},
"node_modules/lodash.merge": {
"version": "4.6.2",
"resolved": "https://registry.npmmirror.com/lodash.merge/-/lodash.merge-4.6.2.tgz",
"integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==",
"dev": true
},
"node_modules/lodash.throttle": {
"version": "4.1.1",
"resolved": "https://registry.npmmirror.com/lodash.throttle/-/lodash.throttle-4.1.1.tgz",
"integrity": "sha512-wIkUCfVKpVsWo3JSZlc+8MB5it+2AN5W8J7YVMST30UrvcQNZ1Okbj+rbVniijTWE6FGYy4XJq/rHkas8qJMLQ==",
"peer": true
},
"node_modules/lodash.toarray": {
"version": "4.4.0",
"resolved": "https://registry.npmmirror.com/lodash.toarray/-/lodash.toarray-4.4.0.tgz",
"integrity": "sha512-QyffEA3i5dma5q2490+SgCvDN0pXLmRGSyAANuVi0HQ01Pkfr9fuoKQW8wm1wGBnJITs/mS7wQvS6VshUEBFCw==",
"peer": true
},
"node_modules/lru-cache": {
"version": "5.1.1",
"resolved": "https://registry.npmmirror.com/lru-cache/-/lru-cache-5.1.1.tgz",
@ -3877,6 +4310,15 @@
"node": ">= 0.6"
}
},
"node_modules/mime-match": {
"version": "1.0.2",
"resolved": "https://registry.npmmirror.com/mime-match/-/mime-match-1.0.2.tgz",
"integrity": "sha512-VXp/ugGDVh3eCLOBCiHZMYWQaTNUHv2IJrut+yXA6+JbLPXHglHwfS/5A5L0ll+jkCY7fIzRJcH6OIunF+c6Cg==",
"peer": true,
"dependencies": {
"wildcard": "^1.1.0"
}
},
"node_modules/mime-types": {
"version": "2.1.35",
"resolved": "https://registry.npmmirror.com/mime-types/-/mime-types-2.1.35.tgz",
@ -3929,6 +4371,12 @@
"integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
"dev": true
},
"node_modules/namespace-emitter": {
"version": "2.0.1",
"resolved": "https://registry.npmmirror.com/namespace-emitter/-/namespace-emitter-2.0.1.tgz",
"integrity": "sha512-N/sMKHniSDJBjfrkbS/tpkPj4RAbvW3mr8UAzvlMHyun93XEm83IAvhWtJVHo+RHn/oO8Job5YN4b+wRjSVp5g==",
"peer": true
},
"node_modules/nanoid": {
"version": "5.0.4",
"resolved": "https://registry.npmmirror.com/nanoid/-/nanoid-5.0.4.tgz",
@ -3946,6 +4394,12 @@
"integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==",
"dev": true
},
"node_modules/next-tick": {
"version": "1.1.0",
"resolved": "https://registry.npmmirror.com/next-tick/-/next-tick-1.1.0.tgz",
"integrity": "sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==",
"peer": true
},
"node_modules/node-releases": {
"version": "2.0.14",
"resolved": "https://registry.npmmirror.com/node-releases/-/node-releases-2.0.14.tgz",
@ -4125,6 +4579,11 @@
"node": ">=6"
}
},
"node_modules/pako": {
"version": "2.1.0",
"resolved": "https://registry.npmmirror.com/pako/-/pako-2.1.0.tgz",
"integrity": "sha512-w+eufiZ1WuJYgPXbV/PO3NCMEc3xqylkKHzp8bxp1uW4qaSNQUkwmLLEc3kKsfz8lpV1F8Ht3U1Cm+9Srog2ug=="
},
"node_modules/parent-module": {
"version": "1.0.1",
"resolved": "https://registry.npmmirror.com/parent-module/-/parent-module-1.0.1.tgz",
@ -4326,6 +4785,12 @@
"node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1"
}
},
"node_modules/preact": {
"version": "10.19.3",
"resolved": "https://registry.npmmirror.com/preact/-/preact-10.19.3.tgz",
"integrity": "sha512-nHHTeFVBTHRGxJXKkKu5hT8C/YWBkPso4/Gad6xuj5dbptt9iF9NZr9pHbPhBrnT2klheu7mHTxTZ/LjwJiEiQ==",
"peer": true
},
"node_modules/prelude-ls": {
"version": "1.2.1",
"resolved": "https://registry.npmmirror.com/prelude-ls/-/prelude-ls-1.2.1.tgz",
@ -4359,6 +4824,15 @@
"node": ">=6.0.0"
}
},
"node_modules/prismjs": {
"version": "1.29.0",
"resolved": "https://registry.npmmirror.com/prismjs/-/prismjs-1.29.0.tgz",
"integrity": "sha512-Kx/1w86q/epKcmte75LNrEoT+lX8pBpavuAbvJWRXar7Hz8jrtF+e3vY751p0R8H9HdArwaCTNDDzHg/ScJK1Q==",
"peer": true,
"engines": {
"node": ">=6"
}
},
"node_modules/proxy-from-env": {
"version": "1.1.0",
"resolved": "https://registry.npmmirror.com/proxy-from-env/-/proxy-from-env-1.1.0.tgz",
@ -4611,6 +5085,15 @@
"node": ">=0.10.0"
}
},
"node_modules/scroll-into-view-if-needed": {
"version": "2.2.31",
"resolved": "https://registry.npmmirror.com/scroll-into-view-if-needed/-/scroll-into-view-if-needed-2.2.31.tgz",
"integrity": "sha512-dGCXy99wZQivjmjIqihaBQNjryrz5rueJY7eHfTdyWEiR4ttYpsajb14rn9s5d4DY4EcY6+4+U/maARBXJedkA==",
"peer": true,
"dependencies": {
"compute-scroll-into-view": "^1.0.20"
}
},
"node_modules/scule": {
"version": "1.2.0",
"resolved": "https://registry.npmmirror.com/scule/-/scule-1.2.0.tgz",
@ -4691,6 +5174,38 @@
"object-inspect": "^1.9.0"
}
},
"node_modules/slate": {
"version": "0.72.8",
"resolved": "https://registry.npmmirror.com/slate/-/slate-0.72.8.tgz",
"integrity": "sha512-/nJwTswQgnRurpK+bGJFH1oM7naD5qDmHd89JyiKNT2oOKD8marW0QSBtuFnwEbL5aGCS8AmrhXQgNOsn4osAw==",
"peer": true,
"dependencies": {
"immer": "^9.0.6",
"is-plain-object": "^5.0.0",
"tiny-warning": "^1.0.3"
}
},
"node_modules/slate-history": {
"version": "0.66.0",
"resolved": "https://registry.npmmirror.com/slate-history/-/slate-history-0.66.0.tgz",
"integrity": "sha512-6MWpxGQZiMvSINlCbMW43E2YBSVMCMCIwQfBzGssjWw4kb0qfvj0pIdblWNRQZD0hR6WHP+dHHgGSeVdMWzfng==",
"peer": true,
"dependencies": {
"is-plain-object": "^5.0.0"
},
"peerDependencies": {
"slate": ">=0.65.3"
}
},
"node_modules/snabbdom": {
"version": "3.6.1",
"resolved": "https://registry.npmmirror.com/snabbdom/-/snabbdom-3.6.1.tgz",
"integrity": "sha512-HHr93dBRkek19QB8OQ5QdGNRPzqLeqcUyAmbxtdE/koLKR6slFtnOlMBgeA9untY9wC7+8cw7oEAFY78K4p+Ug==",
"peer": true,
"engines": {
"node": ">=12.17.0"
}
},
"node_modules/source-map": {
"version": "0.7.4",
"resolved": "https://registry.npmmirror.com/source-map/-/source-map-0.7.4.tgz",
@ -4708,6 +5223,12 @@
"node": ">=0.10.0"
}
},
"node_modules/ssr-window": {
"version": "3.0.0",
"resolved": "https://registry.npmmirror.com/ssr-window/-/ssr-window-3.0.0.tgz",
"integrity": "sha512-q+8UfWDg9Itrg0yWK7oe5p/XRCJpJF9OBtXfOPgSJl+u3Xd5KI328RUEvUqSMVM9CiQUEf1QdBzJMkYGErj9QA==",
"peer": true
},
"node_modules/stackblur-canvas": {
"version": "2.6.0",
"resolved": "https://registry.npmmirror.com/stackblur-canvas/-/stackblur-canvas-2.6.0.tgz",
@ -4856,6 +5377,12 @@
"node": ">=12.22"
}
},
"node_modules/tiny-warning": {
"version": "1.0.3",
"resolved": "https://registry.npmmirror.com/tiny-warning/-/tiny-warning-1.0.3.tgz",
"integrity": "sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA==",
"peer": true
},
"node_modules/to-fast-properties": {
"version": "2.0.0",
"resolved": "https://registry.npmmirror.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz",
@ -4894,6 +5421,12 @@
"resolved": "https://registry.npmmirror.com/tslib/-/tslib-2.3.0.tgz",
"integrity": "sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg=="
},
"node_modules/type": {
"version": "1.2.0",
"resolved": "https://registry.npmmirror.com/type/-/type-1.2.0.tgz",
"integrity": "sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==",
"peer": true
},
"node_modules/type-check": {
"version": "0.4.0",
"resolved": "https://registry.npmmirror.com/type-check/-/type-check-0.4.0.tgz",
@ -5530,6 +6063,12 @@
"node": ">= 0.4"
}
},
"node_modules/wildcard": {
"version": "1.1.2",
"resolved": "https://registry.npmmirror.com/wildcard/-/wildcard-1.1.2.tgz",
"integrity": "sha512-DXukZJxpHA8LuotRwL0pP1+rS6CS7FF2qStDDE1C7DDg2rLud2PXRMuEDYIPhgEezwnlHNL4c+N6MfMTjCGTng==",
"peer": true
},
"node_modules/wrap-ansi": {
"version": "6.2.0",
"resolved": "https://registry.npmmirror.com/wrap-ansi/-/wrap-ansi-6.2.0.tgz",

View File

@ -14,6 +14,7 @@
"@icon-park/vue-next": "^1.4.2",
"@vueuse/core": "^9.13.0",
"@vueuse/integrations": "^10.7.1",
"@wangeditor/editor-for-vue": "^5.1.12",
"animate.css": "^4.1.1",
"autofit.js": "^3.0.7",
"axios": "^1.6.3",

View File

@ -255,14 +255,6 @@ div::-webkit-scrollbar-track {
border-bottom: 1px dashed var(--el-border-color-darker);
}
.w-e-bar-item:has([data-menu-key="group-video"]) {
display: none !important;
}
.w-e-bar-item-menus-container .w-e-bar-item:has([data-menu-key="insertImage"]) {
display: none !important;
}
.vue-auth-box_ {
background: #020f3a !important;
border: 1px solid #223765 !important;

View File

@ -2155,6 +2155,18 @@ export default [
component:
"three_institutional_libraries/safety_production_responsibility_system/index",
},
{
path: "/three_institutional_libraries/safety_production_management_system",
meta: { title: "安全生产管理制度", isSubMenu: false },
component:
"three_institutional_libraries/safety_production_management_system/index",
},
{
path: "/three_institutional_libraries/safety_operating_procedures",
meta: { title: "安全操作规程", isSubMenu: false },
component:
"three_institutional_libraries/safety_operating_procedures/index",
},
],
},
{
@ -2675,54 +2687,6 @@ export default [
},
],
},
{
path: "/stakeholder_management",
redirect: "/stakeholder_management/related_parties_management",
meta: { title: "相关方管理", model: MODEL["5"] },
component: "children",
children: [
{
path: "/stakeholder_management/related_parties_management",
meta: { title: "相关方单位管理", isSubMenu: false },
component: "children",
children: [
{
path: "",
component:
"stakeholder_management/related_parties_management/index",
},
{
path: "/stakeholder_management/related_parties_management/add",
meta: {
title: "新增",
activeMenu: "/stakeholder_management/related_parties_management",
},
component: "stakeholder_management/related_parties_management/add",
},
{
path: "/stakeholder_management/related_parties_management/edit",
meta: {
title: "修改",
activeMenu: "/stakeholder_management/related_parties_management",
},
component: "stakeholder_management/related_parties_management/add",
},
],
},
{
path: "/stakeholder_management/outsourcing_project_management",
meta: { title: "外包工程管理", isSubMenu: false },
component: "children",
children: [
{
path: "",
component:
"stakeholder_management/outsourcing_project_management/index",
},
],
},
],
},
{
path: "/special_operations",
redirect: "/special_operations/personnel_management",

View File

@ -0,0 +1,53 @@
<template>
<div>
<Toolbar :editor="editorRef" :default-config="toolbarConfig" />
<Editor
:style="{ height, 'overflow-y': 'hidden' }"
v-model="modelValue"
@onCreated="fnEditorCreated"
/>
</div>
</template>
<script setup>
import { Editor, Toolbar } from "@wangeditor/editor-for-vue";
import "@wangeditor/editor/dist/css/style.css";
import { shallowRef, onBeforeUnmount } from "vue";
import { useVModel } from "@vueuse/core";
defineOptions({
name: "LayoutEditor",
});
const props = defineProps({
modelValue: {
type: String,
required: true,
default: "",
},
height: {
type: String,
default: "300px",
},
});
const emits = defineEmits(["update:modelValue"]);
const modelValue = useVModel(props, "modelValue", emits);
const editorRef = shallowRef();
const toolbarConfig = {
excludeKeys: [
"group-image",
"group-video",
"insertLink",
"codeBlock",
"emotion",
"todo",
],
};
const fnEditorCreated = (editor) => {
editorRef.value = editor;
};
onBeforeUnmount(() => {
editorRef.value && editorRef.value.destroy();
});
</script>
<style scoped></style>

View File

@ -18,12 +18,12 @@
:clearable="true"
show-checkbox
multiple
collapse-tags
:collapse-tags="collapseTags"
/>
</template>
<script setup>
import { ref } from "vue";
import { nextTick, ref } from "vue";
import { useVModel } from "@vueuse/core";
import { layoutFnGetLevelsAndChildrenNumber } from "@/assets/js/data_dictionary.js";
import { getThreeInstitutionalLibrariesLabel } from "@/request/three_institutional_libraries.js";
@ -54,6 +54,14 @@ const props = defineProps({
}
},
},
pathName: {
type: String,
default: "",
},
collapseTags: {
type: Boolean,
default: false,
},
});
const emits = defineEmits(["update:modelValue", "update:checkList"]);
const modelValue = useVModel(props, "modelValue", emits);
@ -74,7 +82,8 @@ const fnLoad = async (node, resolve) => {
})
);
};
const getCheckedNodes = () => {
const getCheckedNodes = async () => {
await nextTick();
return treeSelectRef.value.getCheckedNodes();
};
defineExpose({
@ -82,8 +91,13 @@ defineExpose({
});
let tree = [];
let id = "";
const idByPathName = {
safety_production_responsibility_system: "5a7c94b2b9514285b433759edd848b4a",
safety_production_management_system: "675ed73a7d7d42a488491f6e0e9c8fd5",
safety_operating_procedures: "ca4e4a7597f8485d8be323bd6876c40b",
};
if (props.type === "regulations") id = "84254cb5b2ae40eb9f451509b2d370ae";
if (props.type === "type") id = "5a7c94b2b9514285b433759edd848b4a";
if (props.type === "type") id = idByPathName[props.pathName];
if (props.type === "industry") id = "f2598ba72e864eadabf0ca4b664d26b9";
if (props.type === "label") {
const resData = await getThreeInstitutionalLibrariesLabel();

View File

@ -1,24 +0,0 @@
import { post, upload } from "@/request/axios.js";
export const getRelatedPartiesManagementList = (params) =>
post("/units/list", params); // 相关方单位管理列表
export const getRelatedPartiesManagementView = (params) =>
post("/units/goEdit", params); // 相关方单位管理查看
export const setRelatedPartiesManagementDelete = (params) =>
post("/units/delete", params); // 相关方单位管理删除
export const setRelatedPartiesManagementDeleteMultiple = (params) =>
post("/units/deleteAll", params); // 相关方单位管理批量删除
export const setRelatedPartiesManagementAdd = (params) =>
upload("/units/add", params); // 相关方单位管理新增
export const setRelatedPartiesManagementEdit = (params) =>
upload("/units/edit", params); // 相关方单位管理编辑
export const getVerifyDeduplicationUser = (params) =>
post("/units/hasName", params); // 相关方单位名称验证
export const getVerifyDeduplicationCode = (params) =>
post("/units/hasCode", params); // 统一社会信用代码验证
export const getOutsourcingProjectManagementList = (params) =>
post("/outsourced/list", params); // 外包工程管理列表
export const setOutsourcingProjectManagementDelete = (params) =>
post("/outsourced/delete", params); // 外包工程管理删除
export const setOutsourcingProjectManagementDeleteMultiple = (params) =>
post("/outsourced/deleteAll", params); // 外包工程管理批量删除

View File

@ -1,6 +1,16 @@
import { post } from "@/request/axios.js";
import { post, upload } from "@/request/axios.js";
export const getThreeInstitutionalLibrariesList = (params) =>
post("/textLibrary/list", params); // 三项制度库列表
export const getThreeInstitutionalLibrariesLabel = (params) =>
post("/labelFactory/tree", params); // 三项制度库标签
export const getThreeInstitutionalLibrariesList = (params) =>
post("/textLibrary/list", params); // 三项制度库列表
export const getThreeInstitutionalLibrariesView = (params) =>
post("/textLibrary/goEdit", params); // 三项制度库查看
export const getThreeInstitutionalLibrariesViewText = (params) =>
post("/textLibrary/getTextInfo", params); // 三项制度库查看富文本
export const setThreeInstitutionalLibrariesDelete = (params) =>
post("/textLibrary/delete", params); // 三项制度库删除
export const setThreeInstitutionalLibrariesSave = (params) =>
upload("/textLibrary/init", params); // 三项制度库保存
export const setThreeInstitutionalLibrariesJoinLocal = (params) =>
post("/textLibrary/copyToOperate", params); // 三项制度库加入本地

View File

@ -131,7 +131,7 @@
<span>姓名:{{ data.info.NAME }}</span>
</div>
<div class="sub_flex">
<span>考试时间:{{ data.info.OPERATTIME }}</span>
<span>考试时间:{{ data.info.EXAMTIMEBEGIN }}</span>
<span>分数:{{ data.info.userSecond?.[0] }}</span>
</div>
<template v-if="data.selectList.length > 0">

View File

@ -16,7 +16,7 @@
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="检查时间:" prop="CHECKTIME">
<el-form-item label="检查时间" prop="CHECKTIME">
<el-date-picker
v-model="form.CHECKTIME"
value-format="YYYY-MM-DD"
@ -26,17 +26,17 @@
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="检查机构:" prop="CHECKAGENT">
<el-form-item label="检查机构" prop="CHECKAGENT">
<el-input v-model="form.CHECKAGENT" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="检查情况:" prop="CHECKOUT">
<el-form-item label="检查情况" prop="CHECKOUT">
<el-input v-model="form.CHECKOUT" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="在岗情况:" prop="ONSITUATION">
<el-form-item label="在岗情况" prop="ONSITUATION">
<el-select v-model="form.ONSITUATION">
<el-option
v-for="item in dutySituationList"
@ -48,7 +48,7 @@
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="备注:" prop="REMARKS">
<el-form-item label="备注" prop="REMARKS">
<el-input
v-model="form.REMARKS"
type="textarea"
@ -60,7 +60,7 @@
<el-divider content-position="left">职业健康检查</el-divider>
</el-col>
<el-col :span="8">
<el-form-item label="上岗时间:" prop="STARTINGTIME">
<el-form-item label="上岗时间" prop="STARTINGTIME">
<el-date-picker
v-model="form.STARTINGTIME"
value-format="YYYY-MM-DD"
@ -70,7 +70,7 @@
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="离岗时间:" prop="OUTTIME">
<el-form-item label="离岗时间" prop="OUTTIME">
<el-date-picker
v-model="form.OUTTIME"
value-format="YYYY-MM-DD"
@ -80,22 +80,22 @@
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="岗位检查情况:" prop="POSTINSPECTION">
<el-form-item label="岗位检查情况" prop="POSTINSPECTION">
<el-input v-model="form.POSTINSPECTION" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="在岗检查情况:" prop="ONINSPECTION">
<el-form-item label="在岗检查情况" prop="ONINSPECTION">
<el-input v-model="form.ONINSPECTION" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="离岗检查情况:" prop="OUTINSPECTION">
<el-form-item label="离岗检查情况" prop="OUTINSPECTION">
<el-input v-model="form.OUTINSPECTION" />
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="备注:" prop="REMARK">
<el-form-item label="备注" prop="REMARK">
<el-input
v-model="form.REMARKS2"
type="textarea"
@ -107,7 +107,7 @@
<el-divider content-position="left">职业病诊疗情况</el-divider>
</el-col>
<el-col :span="8">
<el-form-item label="确认日期:" prop="CONFIRMATIONTIME">
<el-form-item label="确认日期" prop="CONFIRMATIONTIME">
<el-date-picker
v-model="form.CONFIRMATIONTIME"
value-format="YYYY-MM-DD"
@ -117,17 +117,17 @@
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="诊断疾病名称:" prop="DISEASENAME">
<el-form-item label="诊断疾病名称" prop="DISEASENAME">
<el-input v-model="form.DISEASENAME" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="治疗情况:" prop="TREATMENT">
<el-form-item label="治疗情况" prop="TREATMENT">
<el-input v-model="form.TREATMENT" />
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="备注:" prop="REMARK">
<el-form-item label="备注" prop="REMARK">
<el-input
v-model="form.REMARKS3"
type="textarea"
@ -139,7 +139,7 @@
<el-divider content-position="left">职业禁忌证</el-divider>
</el-col>
<el-col :span="8">
<el-form-item label="职业禁忌证:" prop="CONTRAINDICATION">
<el-form-item label="职业禁忌证" prop="CONTRAINDICATION">
<el-select v-model="form.CONTRAINDICATION">
<el-option
v-for="item in contraindicationList"
@ -151,12 +151,12 @@
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="作业性质:" prop="NATURE">
<el-form-item label="作业性质" prop="NATURE">
<el-input v-model="form.NATURE" />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="检查时间:" prop="CHECKTIME2">
<el-form-item label="检查时间" prop="CHECKTIME2">
<el-date-picker
v-model="form.CHECKTIME2"
value-format="YYYY-MM-DD"
@ -166,7 +166,7 @@
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="检查机构:" prop="CHECKAGENT2">
<el-form-item label="检查机构" prop="CHECKAGENT2">
<el-input v-model="form.CHECKAGENT2" />
</el-form-item>
</el-col>

View File

@ -113,7 +113,6 @@
<script setup>
import { layoutFnGetPersonnelManagementJobType } from "@/assets/js/data_dictionary.js";
import { getRelatedPartiesManagementList } from "@/request/stakeholder_management.js";
import useListData from "@/assets/js/useListData.js";
import { ref } from "vue";
import {
@ -127,6 +126,7 @@ import { useUserStore } from "@/pinia/user.js";
import { debounce } from "throttle-debounce";
import useFormValidate from "@/assets/js/useFormValidate.js";
import { ElMessage } from "element-plus";
import { getUnitsListAll } from "@/request/keyprojects.js";
const userStore = useUserStore();
const route = useRoute();
@ -144,11 +144,7 @@ const sexList = [
];
const personnelManagementJobTypeList =
await layoutFnGetPersonnelManagementJobType();
const { list: unitsNameList } = useListData(getRelatedPartiesManagementList, {
otherParams: {
showCount: 99999,
},
});
const { list: unitsNameList } = useListData(getUnitsListAll);
const fnHasCertificate = async (rule, value, callback) => {
if (value) {
const resData = await getVerifyDeduplicationCertificateNum({

View File

@ -1,205 +0,0 @@
<template>
<div>
<el-card>
<el-form
:model="searchForm"
label-width="80px"
@submit.prevent="fnResetPaginationTransfer"
>
<el-row>
<el-col :span="6">
<el-form-item label="关键字" prop="KEYWORDS">
<el-input v-model="searchForm.KEYWORDS" />
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item
label="合同起止时间"
prop="CONTRACTTIME"
label-width="120"
>
<el-date-picker
v-model="searchForm.CONTRACTTIME"
type="daterange"
range-separator="至"
start-placeholder="开始日期"
end-placeholder="结束日期"
format="YYYY-MM-DD"
value-format="YYYY-MM-DD"
/>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label-width="10px">
<el-button type="primary" native-type="submit">搜索</el-button>
<el-button native-type="reset" @click="fnResetPaginationTransfer">
重置
</el-button>
</el-form-item>
</el-col>
</el-row>
</el-form>
</el-card>
<layout-card>
<layout-table
ref="tableRef"
row-key="OUTSOURCED_ID"
:data="list"
v-model:pagination="pagination"
@get-data="fnGetDataTransfer"
>
<el-table-column reserve-selection type="selection" width="55" />
<el-table-column label="序号" width="60">
<template #default="{ $index }">
{{ serialNumber(pagination, $index) }}
</template>
</el-table-column>
<el-table-column
prop="OUTSOURCED_NAME"
label="外包工程名称"
show-overflow-tooltip
/>
<el-table-column label="合同起止时间" width="180">
<template v-slot="{ row }">
<template v-if="row.CONTRACT_STIME && row.CONTRACT_ETIME">
{{ row.CONTRACT_STIME }} - {{ row.CONTRACT_ETIME }}
</template>
</template>
</el-table-column>
<el-table-column
prop="UNITS_NAME"
label="相关方单位名称"
width="250"
show-overflow-tooltip
/>
<el-table-column
prop="UNITS_PIC"
label="相关方单位本项目负责人"
width="160"
show-overflow-tooltip
/>
<el-table-column prop="APPLICANT" label="申请人" width="150" />
<el-table-column prop="STATE" label="状态" width="100" />
<el-table-column label="操作" width="150">
<template v-slot="{ row }">
<el-button
type="primary"
text
link
@click="
router.push({
path: '/stakeholder_management/related_parties_management/edit',
query: { OUTSOURCED_ID: row.OUTSOURCED_ID },
})
"
>
查看
</el-button>
<el-button
v-if="buttonJurisdiction.edit"
type="primary"
text
link
@click="
router.push({
path: '/stakeholder_management/related_parties_management/edit',
query: { OUTSOURCED_ID: row.OUTSOURCED_ID },
})
"
>
编辑
</el-button>
<el-button
v-if="buttonJurisdiction.del"
type="primary"
text
link
@click="fnDelete(row.OUTSOURCED_ID)"
>
删除
</el-button>
</template>
</el-table-column>
<template #button>
<el-button
v-if="buttonJurisdiction.add"
type="primary"
@click="
router.push({
path: '/stakeholder_management/related_parties_management/add',
})
"
>
新增
</el-button>
<el-button
v-if="buttonJurisdiction.del"
type="danger"
@click="fnDeleteAll"
>
批量删除
</el-button>
</template>
</layout-table>
</layout-card>
</div>
</template>
<script setup>
import { serialNumber } from "@/assets/js/utils";
import useButtonJurisdiction from "@/assets/js/useButtonJurisdiction.js";
import { debounce } from "throttle-debounce";
import { ElMessage, ElMessageBox } from "element-plus";
import useListData from "@/assets/js/useListData.js";
import { useRouter } from "vue-router";
import {
getOutsourcingProjectManagementList,
setOutsourcingProjectManagementDelete,
setOutsourcingProjectManagementDeleteMultiple,
} from "@/request/stakeholder_management.js";
const router = useRouter();
const { list, pagination, searchForm, fnResetPagination, fnGetData, tableRef } =
useListData(getOutsourcingProjectManagementList);
const fnGetDataTransfer = () => {
fnGetData({
CONTRACT_STIME: searchForm.value.CONTRACTTIME?.[0],
CONTRACT_ETIME: searchForm.value.CONTRACTTIME?.[1],
});
};
const fnResetPaginationTransfer = () => {
fnResetPagination({
CONTRACT_STIME: searchForm.value.CONTRACTTIME?.[0],
CONTRACT_ETIME: searchForm.value.CONTRACTTIME?.[1],
});
};
const buttonJurisdiction = await useButtonJurisdiction("outsourced");
const fnDelete = debounce(
1000,
async (OUTSOURCED_ID) => {
await ElMessageBox.confirm("确定要删除吗?", { type: "warning" });
await setOutsourcingProjectManagementDelete({ OUTSOURCED_ID });
ElMessage.success("删除成功");
fnResetPaginationTransfer();
},
{ atBegin: true }
);
const fnDeleteAll = debounce(
1000,
async () => {
const selectionData = tableRef.value.getSelectionRows();
if (selectionData.length === 0) {
ElMessage.warning("请选择要删除的数据");
return;
}
const DATA_IDS = selectionData.map((item) => item.OUTSOURCED_ID).join(",");
await ElMessageBox.confirm("确定要删除吗?", { type: "warning" });
await setOutsourcingProjectManagementDeleteMultiple({ DATA_IDS });
ElMessage.success("删除成功");
fnResetPaginationTransfer();
},
{ atBegin: true }
);
</script>
<style scoped></style>

View File

@ -1,260 +0,0 @@
<template>
<layout-card>
<el-form ref="formRef" :model="form" :rules="rules" label-width="170px">
<el-row>
<el-col :span="12">
<el-form-item label="相关方单位名称" prop="UNITS_NAME">
<el-input v-model="form.UNITS_NAME" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="统一社会信用代码" prop="CODE">
<el-input v-model="form.CODE" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="属地" prop="POSSESSION">
<layout-territory
ref="territoryCascaderRef"
v-model="form.POSSESSION"
:level="4"
/>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="企事业单位经营地址" prop="ADDRESS">
<el-input v-model="form.ADDRESS" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="主要负责人" prop="CONTACTS">
<el-input v-model="form.CONTACTS" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="主要负责人电话" prop="CONTACTS_PHONE">
<el-input v-model="form.CONTACTS_PHONE" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="法人手机号" prop="LR_MOBILE">
<el-input v-model="form.LR_MOBILE" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="职工人数(人)" prop="EMPLOYEES">
<el-input-number
:min="0"
v-model="form.EMPLOYEES"
controls-position="right"
/>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="成立时间">
<el-date-picker
v-model="form.CREATE_DATE"
value-format="YYYY-MM-DD"
format="YYYY-MM-DD"
type="date"
/>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="注册资金(万元)">
<el-input-number
:min="0"
v-model="form.REGCAPITAL"
controls-position="right"
/>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="资产总额(万元)">
<el-input-number
:min="0"
v-model="form.TOTALASSETS"
controls-position="right"
/>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="类型" prop="UNITS_TYPE">
<el-select v-model="form.UNITS_TYPE">
<el-option
v-for="item in typeList"
:key="item.ID"
:label="item.NAME"
:value="item.NAME"
/>
</el-select>
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="营业执照" prop="file">
<layout-upload
v-model:file-list="form.file"
accept=".jpg,.jpeg,.png"
list-type="picture-card"
/>
</el-form-item>
</el-col>
</el-row>
</el-form>
<div class="mt-10 tc">
<el-button type="primary" @click="fnSubmit"></el-button>
</div>
</layout-card>
</template>
<script setup>
import LayoutUpload from "@/components/upload/index.vue";
import { ref } from "vue";
import LayoutTerritory from "@/components/territory/index.vue";
import {
getRelatedPartiesManagementView,
getVerifyDeduplicationCode,
getVerifyDeduplicationUser,
setRelatedPartiesManagementAdd,
setRelatedPartiesManagementEdit,
} from "@/request/stakeholder_management.js";
import { useRoute, useRouter } from "vue-router";
import { debounce } from "throttle-debounce";
import useFormValidate from "@/assets/js/useFormValidate.js";
import { ElMessage } from "element-plus";
import { addingPrefixToFile } from "@/assets/js/utils.js";
const route = useRoute();
const router = useRouter();
const { UNITS_ID } = route.query;
const typeList = [
{ ID: "0", NAME: "常驻" },
{ ID: "1", NAME: "临时" },
];
const fnHasUser = async (rule, value, callback) => {
if (value) {
try {
await getVerifyDeduplicationUser({
UNITS_NAME: value,
UNITS_ID,
});
callback();
} catch (err) {
callback(new Error(err.msg));
}
} else {
callback();
}
};
const fnHasCode = async (rule, value, callback) => {
if (value) {
try {
await getVerifyDeduplicationCode({
CODE: value,
UNITS_ID,
});
callback();
} catch (err) {
callback(new Error(err.msg));
}
} else {
callback();
}
};
const rules = {
UNITS_NAME: [
{ required: true, message: "相关方单位名称不能为空", trigger: "blur" },
{ validator: fnHasUser, trigger: "blur" },
],
CODE: [
{ required: true, message: "统一社会信用代码不能为空", trigger: "blur" },
{
pattern: /^[^_IOZSVa-z\W]{2}\d{6}[^_IOZSVa-z\W]{10}$/,
message: "请输入正确的统一社会信用代码",
},
{ validator: fnHasCode, trigger: "blur" },
],
POSSESSION: [{ required: true, message: "属地不能为空", trigger: "change" }],
ADDRESS: [
{ required: true, message: "企事业单位经营地址不能为空", trigger: "blur" },
],
CONTACTS: [
{ required: true, message: "主要负责人不能为空", trigger: "blur" },
],
CONTACTS_PHONE: [
{ required: true, message: "主要负责人电话不能为空", trigger: "blur" },
{ min: 11, max: 11, message: "请输入11位手机号码", trigger: "blur" },
{
pattern:
/^(13[0-9]|14[01456879]|15[0-35-9]|16[2567]|17[0-8]|18[0-9]|19[0-35-9])\d{8}$/,
message: "请输入正确的手机号码",
},
],
LR_MOBILE: [
{ min: 11, max: 11, message: "请输入11位手机号码", trigger: "blur" },
{
pattern:
/^(13[0-9]|14[01456879]|15[0-35-9]|16[2567]|17[0-8]|18[0-9]|19[0-35-9])\d{8}$/,
message: "请输入正确的手机号码",
},
],
UNITS_TYPE: [{ required: true, message: "类型不能为空", trigger: "change" }],
file: [{ required: true, message: "营业执照不能为空", trigger: "change" }],
};
const form = ref({
UNITS_NAME: "",
CODE: "",
POSSESSION: [],
ADDRESS: "",
CONTACTS: "",
CONTACTS_PHONE: "",
LR_MOBILE: "",
EMPLOYEES: "",
CREATE_DATE: "",
REGCAPITAL: "",
TOTALASSETS: "",
UNITS_TYPE: "",
file: [],
});
const formRef = ref(null);
const territoryCascaderRef = ref(null);
const fnGetData = async () => {
if (!UNITS_ID) return;
const resData = await getRelatedPartiesManagementView({ UNITS_ID });
console.log(resData.pd);
form.value = resData.pd;
form.value.file = addingPrefixToFile([{ FILEPATH: resData.pd.FILEPATH }]);
};
fnGetData();
const fnSubmit = debounce(
1000,
async () => {
useFormValidate(formRef);
const formData = new FormData();
Object.keys(form.value).forEach((key) => {
formData.append(key, form.value[key]);
});
formData.delete("file");
for (let i = 0; i < form.value.file.length; i++) {
form.value.file[i].raw && formData.append("file", form.value.file[i].raw);
}
formData.append("PROVINCE", form.value.POSSESSION[0]);
formData.append("CITY", form.value.POSSESSION[1]);
formData.append("COUNTY", form.value.POSSESSION[2]);
formData.append("VILLAGE", form.value.POSSESSION[3]);
formData.append("STREET", form.value.POSSESSION[4]);
formData.append(
"COMPANY_AREA",
territoryCascaderRef.value.getCheckedNodes()
);
!UNITS_ID
? await setRelatedPartiesManagementAdd(formData)
: await setRelatedPartiesManagementEdit(formData);
ElMessage.success("提交成功");
router.back();
},
{ atBegin: true }
);
</script>
<style scoped lang="scss"></style>

View File

@ -1,166 +0,0 @@
<template>
<div>
<el-card>
<el-form
:model="searchForm"
label-width="80px"
@submit.prevent="fnResetPagination"
>
<el-row>
<el-col :span="6">
<el-form-item label="关键字" prop="KEYWORDS">
<el-input v-model="searchForm.KEYWORDS" />
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="类型" prop="UNITS_TYPE">
<el-select v-model="searchForm.UNITS_TYPE">
<el-option
v-for="item in typeList"
:key="item.ID"
:label="item.NAME"
:value="item.NAME"
/>
</el-select>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label-width="10px">
<el-button type="primary" native-type="submit">搜索</el-button>
<el-button native-type="reset" @click="fnResetPagination">
重置
</el-button>
</el-form-item>
</el-col>
</el-row>
</el-form>
</el-card>
<layout-card>
<layout-table
ref="tableRef"
row-key="UNITS_ID"
:data="list"
v-model:pagination="pagination"
@get-data="fnGetData"
>
<el-table-column reserve-selection type="selection" width="55" />
<el-table-column label="序号" width="60">
<template #default="{ $index }">
{{ serialNumber(pagination, $index) }}
</template>
</el-table-column>
<el-table-column
prop="UNITS_NAME"
label="相关方单位名称"
show-overflow-tooltip
/>
<el-table-column prop="CODE" label="统一社会信用代码" width="160" />
<el-table-column
prop="CONTACTS"
label="主要负责人"
width="150"
show-overflow-tooltip
/>
<el-table-column prop="UNITS_TYPE" label="类型" width="100" />
<el-table-column label="操作" width="150">
<template v-slot="{ row }">
<el-button
v-if="buttonJurisdiction.edit"
type="primary"
text
link
@click="
router.push({
path: '/stakeholder_management/related_parties_management/edit',
query: { UNITS_ID: row.UNITS_ID },
})
"
>
编辑
</el-button>
<el-button
v-if="buttonJurisdiction.del"
type="primary"
text
link
@click="fnDelete(row.UNITS_ID)"
>
删除
</el-button>
</template>
</el-table-column>
<template #button>
<el-button
v-if="buttonJurisdiction.add"
type="primary"
@click="
router.push({
path: '/stakeholder_management/related_parties_management/add',
})
"
>
新增
</el-button>
<el-button
v-if="buttonJurisdiction.del"
type="danger"
@click="fnDeleteAll"
>
批量删除
</el-button>
</template>
</layout-table>
</layout-card>
</div>
</template>
<script setup>
import { serialNumber } from "@/assets/js/utils";
import useButtonJurisdiction from "@/assets/js/useButtonJurisdiction.js";
import { debounce } from "throttle-debounce";
import { ElMessage, ElMessageBox } from "element-plus";
import useListData from "@/assets/js/useListData.js";
import { useRouter } from "vue-router";
import {
getRelatedPartiesManagementList,
setRelatedPartiesManagementDelete,
setRelatedPartiesManagementDeleteMultiple,
} from "@/request/stakeholder_management.js";
const router = useRouter();
const typeList = [
{ ID: "0", NAME: "常驻" },
{ ID: "1", NAME: "临时" },
];
const { list, pagination, searchForm, fnResetPagination, fnGetData, tableRef } =
useListData(getRelatedPartiesManagementList);
const buttonJurisdiction = await useButtonJurisdiction("units");
const fnDelete = debounce(
1000,
async (UNITS_ID) => {
await ElMessageBox.confirm("确定要删除吗?", { type: "warning" });
await setRelatedPartiesManagementDelete({ UNITS_ID });
ElMessage.success("删除成功");
fnResetPagination();
},
{ atBegin: true }
);
const fnDeleteAll = debounce(
1000,
async () => {
const selectionData = tableRef.value.getSelectionRows();
if (selectionData.length === 0) {
ElMessage.warning("请选择要删除的数据");
return;
}
const DATA_IDS = selectionData.map((item) => item.UNITS_ID).join(",");
await ElMessageBox.confirm("确定要删除吗?", { type: "warning" });
await setRelatedPartiesManagementDeleteMultiple({ DATA_IDS });
ElMessage.success("删除成功");
fnResetPagination();
},
{ atBegin: true }
);
</script>
<style scoped></style>

View File

@ -0,0 +1,9 @@
<template>
<index-view path-name="safety_operating_procedures" />
</template>
<script setup>
import IndexView from "../safety_production_responsibility_system/index.vue";
</script>
<style scoped lang="scss"></style>

View File

@ -0,0 +1,9 @@
<template>
<index-view path-name="safety_production_management_system" />
</template>
<script setup>
import IndexView from "../safety_production_responsibility_system/index.vue";
</script>
<style scoped lang="scss"></style>

View File

@ -0,0 +1,158 @@
<template>
<el-dialog
v-model="visible"
:title="type === 'add' ? '新增' : '修改'"
:on-close="fnClose"
>
<el-form ref="formRef" :model="form" :rules="rules" label-width="170">
<el-form-item :label="labelName" prop="REMARKS">
<el-input v-model="form.REMARKS" />
</el-form-item>
<el-form-item label="类型" prop="TYPES">
<layout-three-institutional-libraries
ref="typeRef"
v-model="form.TYPES"
type="type"
:path-name="pathName"
/>
</el-form-item>
<el-form-item label="文件" prop="file">
<layout-upload v-model:file-list="form.file" accept=".pdf" />
</el-form-item>
<el-form-item label="文件内容" prop="TEXT_INFO">
<div
class="tr mb-10"
style="flex: 1"
v-if="form.TEXT_INFO && type === 'edit'"
>
<el-button type="primary" @click="fnExport">WORD</el-button>
</div>
<layout-editor v-model="form.TEXT_INFO" />
</el-form-item>
<el-form-item label="标签" prop="labels">
<layout-three-institutional-libraries
ref="labelRef"
v-model="form.labels"
type="label"
/>
</el-form-item>
</el-form>
<template #footer>
<el-button @click="fnClose"></el-button>
<el-button type="primary" @click="fnSubmit"></el-button>
</template>
</el-dialog>
</template>
<script setup>
import { useVModels } from "@vueuse/core";
import { ref } from "vue";
import { debounce } from "throttle-debounce";
import useFormValidate from "@/assets/js/useFormValidate.js";
import { ElMessage } from "element-plus";
import LayoutThreeInstitutionalLibraries from "@/components/three_institutional_libraries/index.vue";
import LayoutUpload from "@/components/upload/index.vue";
import LayoutEditor from "@/components/editor/index.vue";
import { setThreeInstitutionalLibrariesSave } from "@/request/three_institutional_libraries.js";
const props = defineProps({
visible: {
type: Boolean,
required: true,
default: false,
},
form: {
type: Object,
required: true,
default: () => ({}),
},
type: {
type: String,
required: true,
default: "",
},
labelName: {
type: String,
required: true,
default: "",
},
association: {
type: String,
required: true,
default: "",
},
pathName: {
type: String,
required: true,
default: "",
},
});
const emits = defineEmits(["update:visible", "update:form", "get-data"]);
const { visible, form } = useVModels(props, emits);
const rules = {
REMARKS: [
{ required: true, message: `请输入${props.labelName}`, trigger: "blur" },
],
TYPES: [{ required: true, message: "请选择类型", trigger: "change" }],
file: [{ required: true, message: "请上传文件", trigger: "change" }],
};
const formRef = ref(null);
const typeRef = ref(null);
const labelRef = ref(null);
const fnClose = () => {
formRef.value.resetFields();
visible.value = false;
};
const fnSubmit = debounce(
1000,
async () => {
await useFormValidate(formRef);
const formData = new FormData();
Object.keys(form.value).forEach((key) => {
formData.append(key, form.value[key]);
});
formData.delete("file");
formData.delete("TYPES");
formData.delete("CATEGORY_LIST");
formData.delete("labels");
form.value.file?.[0]?.raw &&
formData.append("FILE", form.value.file[0].raw);
formData.append(
"labels",
JSON.stringify(await labelRef.value.getCheckedNodes())
);
const SOURCE_TYPES = await typeRef.value.getCheckedNodes();
const TYPES = [];
for (let i = 0; i < SOURCE_TYPES.length; i++) {
TYPES.push({
CATEGORY: "TYPES",
CATEGORY_ID: SOURCE_TYPES[i].DICTIONARIES_ID,
CATEGORY_NAME: SOURCE_TYPES[i].NAME,
});
}
formData.append("TYPES", JSON.stringify(TYPES));
const CATEGORY_LIST = [
{
CATEGORY: "CATEGORY_LIST",
CATEGORY_ID: "7158f688d0f34054a28a9275139298df",
CATEGORY_NAME: "行业专属类",
},
];
formData.append("CATEGORY_LIST", JSON.stringify(CATEGORY_LIST));
formData.append("ASSOCIATION", props.association);
await setThreeInstitutionalLibrariesSave(formData);
ElMessage.success("操作成功");
fnClose();
emits("get-data");
},
{ atBegin: true }
);
const fnExport = () => {
window.location.href =
import.meta.env[import.meta.env.DEV ? "VITE_PROXY" : "VITE_BASE_URL"] +
"/textLibrary/exportWord?BUS_TEXT_LIBRARY_ID=" +
form.value.BUS_TEXT_LIBRARY_ID;
};
</script>
<style scoped lang="scss"></style>

View File

@ -20,6 +20,7 @@
ref="regulationsRef"
v-model="searchForm.CATEGORY_LIST"
type="regulations"
collapse-tags
/>
</el-form-item>
</el-col>
@ -29,6 +30,8 @@
ref="typeRef"
v-model="searchForm.TYPES"
type="type"
collapse-tags
:path-name="pathName"
/>
</el-form-item>
</el-col>
@ -42,15 +45,17 @@
ref="industryRef"
v-model="searchForm.SPECIFICATION_TYPES"
type="industry"
collapse-tags
/>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="标签" prop="LABELS">
<el-form-item label="标签" prop="labels">
<layout-three-institutional-libraries
ref="labelRef"
v-model="searchForm.LABELS"
v-model="searchForm.labels"
type="label"
collapse-tags
/>
</el-form-item>
</el-col>
@ -94,7 +99,7 @@
{{ serialNumber(pagination, $index) }}
</template>
</el-table-column>
<el-table-column prop="REMARKS" label="安全生产管理制度名称" />
<el-table-column prop="REMARKS" :label="labelName" />
<el-table-column label="类型">
<template v-slot="{ row }">
{{
@ -127,40 +132,177 @@
</template>
</el-table-column>
<el-table-column prop="UPLOAD_TIME" label="上传时间" width="150px" />
<el-table-column label="操作" width="200">
<template v-slot="{ row }">
<el-button
v-if="tabName === 'platform_resource_library'"
type="primary"
text
link
@click="fnJoinLocal(row.BUS_TEXT_LIBRARY_ID)"
>
加入本地
</el-button>
<el-button
type="primary"
text
link
@click="fnView(row.BUS_TEXT_LIBRARY_ID)"
>
查看
</el-button>
<template v-if="tabName === 'self_administered'">
<el-button
v-if="buttonJurisdiction.edit"
type="primary"
text
link
@click="fnAddOrEdit(row.BUS_TEXT_LIBRARY_ID, 'edit')"
>
编辑
</el-button>
<el-button
type="primary"
text
link
@click="useDownloadFile(row.PATH)"
>
导出
</el-button>
<el-button
v-if="buttonJurisdiction.del"
type="primary"
text
link
@click="fnDelete(row.BUS_TEXT_LIBRARY_ID)"
>
删除
</el-button>
</template>
</template>
</el-table-column>
<template #button>
<el-button
v-if="buttonJurisdiction.add && tabName === 'self_administered'"
type="primary"
@click="fnAddOrEdit('', 'add')"
>
新增
</el-button>
</template>
</layout-table>
<add
v-model:visible="data.addOrEditDialog.visible"
v-model:form="data.addOrEditDialog.form"
:type="data.addOrEditDialog.type"
:label-name="labelName"
:association="ASSOCIATION[pathName]"
:path-name="pathName"
@get-data="fnResetPaginationTransfer"
/>
<view-info
v-model:visible="data.viewDialog.visible"
:info="data.viewDialog.info"
:label-name="labelName"
/>
</div>
</template>
<script setup>
import { serialNumber } from "@/assets/js/utils.js";
import { addingPrefixToFile, serialNumber } from "@/assets/js/utils.js";
import useListData from "@/assets/js/useListData.js";
import { getThreeInstitutionalLibrariesList } from "@/request/three_institutional_libraries.js";
import {
getThreeInstitutionalLibrariesList,
getThreeInstitutionalLibrariesView,
getThreeInstitutionalLibrariesViewText,
setThreeInstitutionalLibrariesDelete,
setThreeInstitutionalLibrariesJoinLocal,
} from "@/request/three_institutional_libraries.js";
import LayoutThreeInstitutionalLibraries from "@/components/three_institutional_libraries/index.vue";
import { ref } from "vue";
import { nextTick, reactive, ref } from "vue";
import { getEnterpriseList } from "@/request/enterprise_management.js";
import { throttle } from "throttle-debounce";
import { debounce, throttle } from "throttle-debounce";
import useButtonJurisdiction from "@/assets/js/useButtonJurisdiction.js";
import { ElMessage, ElMessageBox } from "element-plus";
import useDownloadFile from "@/assets/js/useDownloadFile.js";
import Add from "./add.vue";
import ViewInfo from "./view.vue";
const props = defineProps({
tabName: {
type: String,
required: true,
default: "",
},
pathName: {
type: String,
required: true,
default: "",
},
labelName: {
type: String,
required: true,
default: "",
},
});
const regulationsRef = ref(null);
const typeRef = ref(null);
const industryRef = ref(null);
const labelRef = ref(null);
const data = reactive({
addOrEditDialog: {
visible: false,
type: "",
form: {
REMARKS: "",
TYPES: [],
file: [],
TEXT_INFO: "",
labels: [],
},
},
viewDialog: {
visible: false,
info: {},
},
});
const ASSOCIATION = {
safety_production_responsibility_system: "2",
safety_production_management_system: "1",
safety_operating_procedures: "0",
};
const fnGetOtherParams = () => {
const otherParams = { ASSOCIATION: ASSOCIATION[props.pathName] };
if (props.tabName === "self_administered") {
otherParams.ENTERPRISE_SIDE = "0";
} else if (props.tabName === "platform_resource_library") {
otherParams.CORPINFO_ID = "0";
}
return otherParams;
};
const { list, pagination, searchForm, fnGetData, fnResetPagination } =
useListData(getThreeInstitutionalLibrariesList, {
otherParams: { ASSOCIATION: "2", ENTERPRISE_SIDE: "0" },
otherParams: fnGetOtherParams(),
});
const fnGetCheckedNodes = () => {
const buttonJurisdiction = await useButtonJurisdiction("textlibrary");
const fnGetCheckedNodes = async () => {
await nextTick();
const CATEGORY_LIST = await regulationsRef.value.getCheckedNodes();
const TYPES = await typeRef.value.getCheckedNodes();
const SPECIFICATION_TYPES = await industryRef.value.getCheckedNodes();
const labels = await labelRef.value.getCheckedNodes();
return {
CATEGORY_LIST: JSON.stringify(regulationsRef.value.getCheckedNodes()),
TYPES: JSON.stringify(typeRef.value.getCheckedNodes()),
SPECIFICATION_TYPES: JSON.stringify(industryRef.value.getCheckedNodes()),
LABELS: JSON.stringify(labelRef.value.getCheckedNodes()),
CATEGORY_LIST: JSON.stringify(CATEGORY_LIST),
TYPES: JSON.stringify(TYPES),
SPECIFICATION_TYPES: JSON.stringify(SPECIFICATION_TYPES),
labels: JSON.stringify(labels),
};
};
const fnGetDataTransfer = () => {
fnGetData({ ...fnGetCheckedNodes() });
const fnGetDataTransfer = async () => {
fnGetData({ ...(await fnGetCheckedNodes()) });
};
const fnResetPaginationTransfer = () => {
fnResetPagination({ ...fnGetCheckedNodes() });
const fnResetPaginationTransfer = async () => {
fnResetPagination({ ...(await fnGetCheckedNodes()) });
};
const selectLoading = ref(false);
const enterpriseList = ref([]);
@ -172,6 +314,69 @@ const fnRemoteMethod = throttle(500, async (query) => {
selectLoading.value = false;
}
});
const fnDelete = debounce(
1000,
async (BUS_TEXT_LIBRARY_ID) => {
await ElMessageBox.confirm("确定要删除吗?", {
type: "warning",
});
await setThreeInstitutionalLibrariesDelete({ BUS_TEXT_LIBRARY_ID });
ElMessage.success("删除成功");
fnResetPaginationTransfer();
},
{ atBegin: true }
);
const fnView = async (BUS_TEXT_LIBRARY_ID) => {
const resData = await getThreeInstitutionalLibrariesView({
BUS_TEXT_LIBRARY_ID,
});
const { info } = await getThreeInstitutionalLibrariesViewText({
BUS_TEXT_LIBRARY_ID,
});
data.viewDialog.info = resData.data;
data.viewDialog.info.TEXT_INFO = info.TEXT_INFO;
data.viewDialog.visible = true;
};
const fnAddOrEdit = async (BUS_TEXT_LIBRARY_ID, type) => {
data.addOrEditDialog.visible = true;
await nextTick();
data.addOrEditDialog.type = type;
if (type === "edit") {
const resData = await getThreeInstitutionalLibrariesView({
BUS_TEXT_LIBRARY_ID,
});
const { info } = await getThreeInstitutionalLibrariesViewText({
BUS_TEXT_LIBRARY_ID,
});
data.addOrEditDialog.form = resData.data;
data.addOrEditDialog.form.TEXT_INFO = info.TEXT_INFO;
data.addOrEditDialog.form.file = addingPrefixToFile([
{ FILEPATH: resData.data.PATH },
]);
const TYPES = [];
for (let i = 0; i < resData.data.TYPES.length; i++) {
TYPES.push(resData.data.TYPES[i].CATEGORY_ID);
}
data.addOrEditDialog.form.TYPES = TYPES;
const labels = [];
for (let i = 0; i < resData.data.labels.length; i++) {
labels.push(resData.data.labels[i].BUS_LABEL_FACTORY_ID);
}
data.addOrEditDialog.form.labels = labels;
}
};
const fnJoinLocal = debounce(
1000,
async (BUS_TEXT_LIBRARY_ID) => {
await ElMessageBox.confirm("确定要将此条数据添加到本地?", {
type: "warning",
});
await setThreeInstitutionalLibrariesJoinLocal({ BUS_TEXT_LIBRARY_ID });
ElMessage.success("添加成功");
fnResetPaginationTransfer();
},
{ atBegin: true }
);
</script>
<style scoped></style>

View File

@ -0,0 +1,97 @@
<template>
<el-dialog v-model="visible" title="查看">
<el-descriptions :column="1" border>
<el-descriptions-item :label="labelName">
{{ info.REMARKS }}
</el-descriptions-item>
<el-descriptions-item label="规程属性">
{{
info.CATEGORY_LIST.map((item) => item.CATEGORY_NAME)
.filter(Boolean)
.join("、")
}}
</el-descriptions-item>
<el-descriptions-item label="类型">
{{
info.TYPES.map((item) => item.CATEGORY_NAME)
.filter(Boolean)
.join("、")
}}
</el-descriptions-item>
<el-descriptions-item label="国民经济行业类型">
{{
info.SPECIFICATION_TYPES.map((item) => item.CATEGORY_NAME)
.filter(Boolean)
.join("、")
}}
</el-descriptions-item>
<el-descriptions-item label="上传时间">
{{ info.UPLOAD_TIME }}
</el-descriptions-item>
<el-descriptions-item label="上传人">
{{ info.UPLOAD_USER_NAME }}
</el-descriptions-item>
<el-descriptions-item label="标签">
{{
info.labels
.map((item) => item.NAME)
.filter(Boolean)
.join("、")
}}
</el-descriptions-item>
<el-descriptions-item label="文件">
{{ getFileName(info.PATH) }}
<el-button
type="primary"
class="ml-10"
@click="useDownloadFile(info.PATH)"
>
下载
</el-button>
</el-descriptions-item>
<el-descriptions-item label="文件内容">
<div v-html="info.TEXT_INFO" />
<el-button v-if="info.TEXT_INFO" type="primary" @click="fnExport">
导出WORD
</el-button>
</el-descriptions-item>
</el-descriptions>
<template #footer>
<el-button @click="visible = false">关闭</el-button>
</template>
</el-dialog>
</template>
<script setup>
import { useVModel } from "@vueuse/core";
import { getFileName } from "@/assets/js/utils.js";
import useDownloadFile from "@/assets/js/useDownloadFile.js";
const props = defineProps({
visible: {
type: Boolean,
required: true,
default: false,
},
info: {
type: Object,
required: true,
default: () => ({}),
},
labelName: {
type: String,
required: true,
default: "",
},
});
const emits = defineEmits(["update:visible"]);
const visible = useVModel(props, "visible", emits);
const fnExport = () => {
window.location.href =
import.meta.env[import.meta.env.DEV ? "VITE_PROXY" : "VITE_BASE_URL"] +
"/textLibrary/exportWord?BUS_TEXT_LIBRARY_ID=" +
props.info.BUS_TEXT_LIBRARY_ID;
};
</script>
<style scoped lang="scss"></style>

View File

@ -1,14 +1,24 @@
<template>
<layout-card>
<el-tabs v-model="name" @tab-change="fnTabChange">
<el-tab-pane label="安全生产责任制" name="responsibility_system" lazy>
<list-view />
<el-tab-pane :label="labelName[pathName]" name="self_administered" lazy>
<list-view
tab-name="self_administered"
:path-name="pathName"
:label-name="labelName[pathName] + '名称'"
/>
</el-tab-pane>
<el-tab-pane
label="安全生产责任制平台资源库"
:label="labelName[pathName] + '平台资源库'"
name="platform_resource_library"
lazy
></el-tab-pane>
>
<list-view
tab-name="platform_resource_library"
:path-name="pathName"
:label-name="labelName[pathName] + '名称'"
/>
</el-tab-pane>
</el-tabs>
</layout-card>
</template>
@ -18,17 +28,28 @@ import { ref } from "vue";
import { onBeforeRouteUpdate, useRoute, useRouter } from "vue-router";
import ListView from "./components/list.vue";
const props = defineProps({
pathName: {
type: String,
default: "safety_production_responsibility_system",
},
});
const labelName = {
safety_production_responsibility_system: "安全生产责任制",
safety_production_management_system: "安全生产管理制度",
safety_operating_procedures: "安全操作规程",
};
const router = useRouter();
const route = useRoute();
const defaultName = "responsibility_system";
const defaultName = "self_administered";
const name = ref(route.query.name || defaultName);
onBeforeRouteUpdate((to, from, next) => {
onBeforeRouteUpdate(async (to, from, next) => {
name.value = to.query.name || defaultName;
next();
});
const fnTabChange = (name) => {
router.push({
path: "/three_institutional_libraries/safety_production_responsibility_system",
router.replace({
path: `/three_institutional_libraries/${props.pathName}`,
query: {
name,
},