diff --git a/package.json b/package.json index 4cec957..79fd394 100644 --- a/package.json +++ b/package.json @@ -1,67 +1,73 @@ { - "name": "demo", - "version": "0.1.0", - "private": true, - "scripts": { - "serve": "vue-cli-service serve", - "build": "vue-cli-service build", - "lint": "vue-cli-service lint" - }, - "browser": { - "crypto": false - }, - "dependencies": { - "axios": "^1.3.3", - "crypto-js": "^4.1.1", - "element-ui": "^2.15.13", - "exceljs": "^4.3.0", - "file-saver": "^2.0.5", - "moment": "^2.29.4", - "sortablejs": "^1.15.0", - "vue": "^2.6.14", - "vue-contextmenujs": "^1.4.9", - "vue-json-excel": "^0.3.0", - "vue-meta": "^2.4.0", - "vue-print-nb": "^1.7.5", - "vue-router": "^3.5.1", - "vuex": "^3.6.2", - "xlsx": "^0.18.5" - }, - "devDependencies": { - "@babel/core": "^7.12.16", - "@babel/eslint-parser": "^7.12.16", - "@vue/cli-plugin-babel": "~5.0.0", - "@vue/cli-plugin-eslint": "~5.0.0", - "@vue/cli-plugin-router": "~5.0.0", - "@vue/cli-plugin-vuex": "~5.0.0", - "@vue/cli-service": "~5.0.0", - "eslint": "^7.32.0", - "eslint-config-prettier": "^8.3.0", - "eslint-plugin-prettier": "^4.0.0", - "eslint-plugin-vue": "^8.0.3", - "prettier": "^2.4.1", - "sass": "^1.32.7", - "sass-loader": "^12.0.0", - "vue-template-compiler": "^2.6.14" - }, - "eslintConfig": { - "root": true, - "env": { - "node": true + "name": "demo", + "version": "0.1.0", + "private": true, + "scripts": { + "serve": "vue-cli-service serve", + "build": "vue-cli-service build", + "lint": "vue-cli-service lint" }, - "extends": [ - "plugin:vue/essential", - "eslint:recommended", - "plugin:prettier/recommended" - ], - "parserOptions": { - "parser": "@babel/eslint-parser" + "browser": { + "crypto": false }, - "rules": {} - }, - "browserslist": [ - "> 1%", - "last 2 versions", - "not dead" - ] -} + "dependencies": { + "axios": "^1.3.3", + "crypto-js": "^4.1.1", + "echarts": "^5.4.3", + "element-ui": "^2.15.13", + "exceljs": "^4.3.0", + "file-saver": "^2.0.5", + "file-saver": "^2.0.5", + "html2canvas": "^1.4.1", + "moment": "^2.29.4", + "node-polyfill-webpack-plugin": "^2.0.1", + "sortablejs": "^1.15.0", + "vue": "^2.6.14", + "vue-contextmenujs": "^1.4.9", + "vue-json-excel": "^0.3.0", + "vue-meta": "^2.4.0", + "vue-print-nb": "^1.7.5", + "vue-router": "^3.5.1", + "vuex": "^3.6.2", + "xlsx": "^0.18.5", + "xlsx-style": "^0.8.13", + "print-js": "^1.6.0" + }, + "devDependencies": { + "@babel/core": "^7.12.16", + "@babel/eslint-parser": "^7.12.16", + "@vue/cli-plugin-babel": "~5.0.0", + "@vue/cli-plugin-eslint": "~5.0.0", + "@vue/cli-plugin-router": "~5.0.0", + "@vue/cli-plugin-vuex": "~5.0.0", + "@vue/cli-service": "~5.0.0", + "eslint": "^7.32.0", + "eslint-config-prettier": "^8.3.0", + "eslint-plugin-prettier": "^4.0.0", + "eslint-plugin-vue": "^8.0.3", + "prettier": "^2.4.1", + "sass": "^1.32.7", + "sass-loader": "^12.0.0", + "vue-template-compiler": "^2.6.14" + }, + "eslintConfig": { + "root": true, + "env": { + "node": true + }, + "extends": [ + "plugin:vue/essential", + "eslint:recommended", + "plugin:prettier/recommended" + ], + "parserOptions": { + "parser": "@babel/eslint-parser" + }, + "rules": {} + }, + "browserslist": [ + "> 1%", + "last 2 versions", + "not dead" + ] +} \ No newline at end of file diff --git a/src/components/workload/chartsBlock.vue b/src/components/workload/chartsBlock.vue new file mode 100644 index 0000000..370287a --- /dev/null +++ b/src/components/workload/chartsBlock.vue @@ -0,0 +1,79 @@ + + + diff --git a/src/utlis/Export2Excel.js b/src/utlis/Export2Excel.js new file mode 100644 index 0000000..cf15f8d --- /dev/null +++ b/src/utlis/Export2Excel.js @@ -0,0 +1,184 @@ +/* eslint-disable */ +import { saveAs } from 'file-saver' +import * as XLSX from 'xlsx' +import * as XLSXStyle from "xlsx-style"; + + +function datenum(v, date1904) { + if (date1904) v += 1462; + var epoch = Date.parse(v); + return (epoch - new Date(Date.UTC(1899, 11, 30))) / (24 * 60 * 60 * 1000); +} + +function sheet_from_array_of_arrays(data, opts) { + var ws = {}; + var range = { + s: { + c: 10000000, + r: 10000000 + }, + e: { + c: 0, + r: 0 + } + }; + for (var R = 0; R != data.length; ++R) { + for (var C = 0; C != data[R].length; ++C) { + if (range.s.r > R) range.s.r = R; + if (range.s.c > C) range.s.c = C; + if (range.e.r < R) range.e.r = R; + if (range.e.c < C) range.e.c = C; + var cell = { + v: data[R][C] + }; + if (cell.v == null) continue; + var cell_ref = XLSX.utils.encode_cell({ + c: C, + r: R + }); + + if (typeof cell.v === 'number') cell.t = 'n'; + else if (typeof cell.v === 'boolean') cell.t = 'b'; + else if (cell.v instanceof Date) { + cell.t = 'n'; + cell.z = XLSX.SSF._table[14]; + cell.v = datenum(cell.v); + } else cell.t = 's'; + ws[cell_ref] = cell; + } + } + if (range.s.c < 10000000) ws['!ref'] = XLSX.utils.encode_range(range); + return ws; +} + +function Workbook() { + if (!(this instanceof Workbook)) return new Workbook(); + this.SheetNames = []; + this.Sheets = {}; +} + +function s2ab(s) { + var buf = new ArrayBuffer(s.length); + var view = new Uint8Array(buf); + for (var i = 0; i != s.length; ++i) view[i] = s.charCodeAt(i) & 0xFF; + return buf; +} + + +export function export_json_to_excel({ + multiHeader = [], // 第一行表头 + multiHeader2 = [], // 第二行表头 + data, + filename, //文件名 + merges = [], // 合并 + bookType = 'xlsx' +} = {}) { + /* original data */ + filename = filename || '列表'; + data = [...data] + data.unshift(multiHeader2) + data.unshift(multiHeader) + console.log('data:', data) + var ws_name = "SheetJS"; + var wb = new Workbook(), + ws = sheet_from_array_of_arrays(data); + + if (merges.length > 0) { + if (!ws['!merges']) ws['!merges'] = []; + merges.forEach(item => { + ws['!merges'].push(XLSX.utils.decode_range(item)) + }) + } + + /* add worksheet to workbook */ + wb.SheetNames.push(ws_name); + wb.Sheets[ws_name] = ws; + + var wbout = XLSXStyle.write(wb, { + bookType: bookType, + bookSST: false, + type: 'binary' + }); + + saveAs(new Blob([s2ab(wbout)], { + type: "application/octet-stream" + }), `${filename}.${bookType}`); +} + +// 根据dom导出表格 +export function exportToExcel(idSelector, fileName, titleNum = 1) { + // 设置导出的内容是否只做解析,不进行格式转换 false:要解析, true:不解析 + const xlsxParam = { raw: true } + let table = document.querySelector(idSelector).cloneNode(true); + + // 因为element-ui的表格的fixed属性导致多出一个table,会下载重复内容,这里删除掉 + if (table.querySelector('.el-table__fixed-right')) + table.removeChild(table.querySelector('.el-table__fixed-right')); + if (table.querySelector('.el-table__fixed')) + table.removeChild(table.querySelector('.el-table__fixed')); + + const wb = XLSX.utils.table_to_book(table, xlsxParam) + let range = XLSX.utils.decode_range(wb.Sheets['Sheet1']['!ref']); + let cWidth = []; + for (let C = range.s.c; C < range.e.c; ++C) { //SHEET列 + let len = 100; //默认列宽 + let len_max = 400; //最大列宽 + for (let R = range.s.r; R <= range.e.r; ++R) { //SHEET行 + let cell = { c: C, r: R }; //二维 列行确定一个单元格 + let cell_ref = XLSX.utils.encode_cell(cell); //单元格 A1、A2 + if (wb.Sheets['Sheet1'][cell_ref]) { + // if (R == 0){ + if (R < titleNum) { + wb.Sheets['Sheet1'][cell_ref].s = { //设置第一行单元格的样式 style + alignment: { + horizontal: 'center', + vertical: 'center', + }, + }; + } else { + wb.Sheets['Sheet1'][cell_ref].s = { + alignment: { + horizontal: 'center', + vertical: 'center', + }, + }; + } + //动态自适应:计算列宽 + let va = JSON.parse(JSON.stringify(wb.Sheets['Sheet1'][cell_ref].v)); + var card1 = JSON.parse(JSON.stringify(va)).match(/[\u4e00-\u9fa5]/g); //匹配中文 + var card11 = ""; + if (card1) { + card11 = card1.join("") + } + var card2 = JSON.parse(JSON.stringify(va)).replace(/([^\u0000-\u00FF])/g, ""); //剔除中文 + let st = 0; + if (card11) { + // st += card11.length * 16 //中文字节码长度 + st += card11.length * 20 //中文字节码长度 + } + if (card2) { + // st += card2.length * 8 //非中文字节码长度 + st += card2.length * 10 //非中文字节码长度 + } + if (st > len) { + len = st; + } + } + } + if (len > len_max) { //最大宽度 + len = len_max; + } + + cWidth.push({ 'wpx': len }); //列宽 + } + wb.Sheets['Sheet1']['!cols'] = cWidth + const wbout = XLSXStyle.write(wb, { bookType: 'xlsx', bookSST: false, type: 'binary' }) + try { + saveAs(new Blob([s2ab(wbout)], { type: '' }), `${fileName}.xlsx`) + } catch (e) { + if (typeof console !== 'undefined') { + console.log(e, wbout) + } + } + return wbout +} \ No newline at end of file diff --git a/src/views/fee-settings/DiagnosisTemplate.vue b/src/views/fee-settings/DiagnosisTemplate.vue index 2ea5e39..e3c1f37 100644 --- a/src/views/fee-settings/DiagnosisTemplate.vue +++ b/src/views/fee-settings/DiagnosisTemplate.vue @@ -1,422 +1,788 @@ diff --git a/src/views/fee-settings/ItemTemplate.vue b/src/views/fee-settings/ItemTemplate.vue index 31fe915..8404981 100644 --- a/src/views/fee-settings/ItemTemplate.vue +++ b/src/views/fee-settings/ItemTemplate.vue @@ -1,616 +1,788 @@ + \ No newline at end of file diff --git a/src/views/workload/deskwork.vue b/src/views/workload/deskwork.vue index 6fd4ce5..e5e940e 100644 --- a/src/views/workload/deskwork.vue +++ b/src/views/workload/deskwork.vue @@ -1,102 +1,509 @@ \ No newline at end of file diff --git a/src/views/workload/directordoctor.vue b/src/views/workload/directordoctor.vue index 16fe1a6..1a06e8d 100644 --- a/src/views/workload/directordoctor.vue +++ b/src/views/workload/directordoctor.vue @@ -1,91 +1,336 @@ \ No newline at end of file diff --git a/src/views/workload/doctorstaionworkload.vue b/src/views/workload/doctorstaionworkload.vue index 53c308a..0aeedf1 100644 --- a/src/views/workload/doctorstaionworkload.vue +++ b/src/views/workload/doctorstaionworkload.vue @@ -1,101 +1,509 @@ \ No newline at end of file diff --git a/src/views/workload/registrar.vue b/src/views/workload/registrar.vue index b842997..b79298f 100644 --- a/src/views/workload/registrar.vue +++ b/src/views/workload/registrar.vue @@ -1,99 +1,338 @@ \ No newline at end of file diff --git a/vue.config.js b/vue.config.js index 0e56182..211844c 100644 --- a/vue.config.js +++ b/vue.config.js @@ -1,30 +1,45 @@ const { defineConfig } = require("@vue/cli-service"); +const NodePolyfillPlugin = require("node-polyfill-webpack-plugin") module.exports = defineConfig({ - transpileDependencies: true, - lintOnSave: false, - devServer: { - port: "8080", - proxy: { - "/api": { - target: "http://192.168.1.108:44358", - changeorigin: true, // 在本会创建一个虚拟服务满,然后发送清求的数,并同时接收济求的数,这样服务端和服务减进行数据的交互就不会有域问题 - rewite: (path) => path.replace(/^\/api/, ""), - // pathRewrite: { - // "^/api": '' - // } - }, + transpileDependencies: true, + lintOnSave: false, + configureWebpack: { + plugins: [ + new NodePolyfillPlugin() + ], + resolve: { + fallback: { + fs: false, + crypto: false + } + }, + externals: { + './cptable': 'var cptable', + }, }, - }, - // pages: { - // index: { - // entry: 'src/main.js', - // template: 'src/App.vue', - // filname: 'index.html' - // }, - // about: { - // entry: 'src/main.js', - // template: 'src/App.vue', - // filname: 'about.html' - // }, - // } -}); + devServer: { + port: "8080", + proxy: { + "/api": { + target: "http://192.168.1.108:44358", + changeorigin: true, // 在本会创建一个虚拟服务满,然后发送清求的数,并同时接收济求的数,这样服务端和服务减进行数据的交互就不会有域问题 + rewite: (path) => path.replace(/^\/api/, ""), + // pathRewrite: { + // "^/api": '' + // } + }, + }, + } + // pages: { + // index: { + // entry: 'src/main.js', + // template: 'src/App.vue', + // filname: 'index.html' + // }, + // about: { + // entry: 'src/main.js', + // template: 'src/App.vue', + // filname: 'about.html' + // }, + // } +}); \ No newline at end of file