浏览代码

代码迁移

yuwandanmian 2 年之前
当前提交
42e5d1c8d7
共有 100 个文件被更改,包括 8525 次插入0 次删除
  1. 14 0
      .editorconfig
  2. 9 0
      .env.development
  3. 9 0
      .env.production
  4. 11 0
      .env.staging
  5. 16 0
      .gitignore
  6. 14 0
      .prettierrc
  7. 5 0
      .travis.yml
  8. 21 0
      LICENSE
  9. 0 0
      README-zh.md
  10. 27 0
      README.md
  11. 14 0
      babel.config.js
  12. 35 0
      build/index.js
  13. 18 0
      jest.config.js
  14. 10 0
      jsconfig.json
  15. 57 0
      mock/index.js
  16. 81 0
      mock/mock-server.js
  17. 29 0
      mock/table.js
  18. 84 0
      mock/user.js
  19. 25 0
      mock/utils.js
  20. 61 0
      package.json
  21. 8 0
      postcss.config.js
  22. 二进制
      public/favicon.ico
  23. 22 0
      public/index.html
  24. 160 0
      src/App.vue
  25. 14 0
      src/api/request.js
  26. 9 0
      src/api/table.js
  27. 39 0
      src/api/user.js
  28. 二进制
      src/assets/404_images/404.png
  29. 二进制
      src/assets/404_images/404_cloud.png
  30. 二进制
      src/assets/images/b1.png
  31. 二进制
      src/assets/images/b2.png
  32. 二进制
      src/assets/images/b3.png
  33. 二进制
      src/assets/images/loginbj.jpg
  34. 二进制
      src/assets/images/logo.png
  35. 二进制
      src/assets/images/方形未选中.png
  36. 二进制
      src/assets/images/选中.png
  37. 152 0
      src/axios/index.js
  38. 151 0
      src/axios/index2.js
  39. 151 0
      src/axios/index3.js
  40. 77 0
      src/components/Breadcrumb/index.vue
  41. 39 0
      src/components/Hamburger/index.vue
  42. 62 0
      src/components/SvgIcon/index.vue
  43. 38 0
      src/components/Title/index.vue
  44. 319 0
      src/components/m-cont-reight/index.vue
  45. 80 0
      src/components/m-menu/index.vue
  46. 144 0
      src/components/m-pagination/index.vue
  47. 85 0
      src/httpFile/index.js
  48. 9 0
      src/icons/index.js
  49. 0 0
      src/icons/svg/dashboard.svg
  50. 1 0
      src/icons/svg/example.svg
  51. 1 0
      src/icons/svg/eye-open.svg
  52. 1 0
      src/icons/svg/eye.svg
  53. 0 0
      src/icons/svg/form.svg
  54. 1 0
      src/icons/svg/link.svg
  55. 1 0
      src/icons/svg/nested.svg
  56. 1 0
      src/icons/svg/password.svg
  57. 1 0
      src/icons/svg/table.svg
  58. 1 0
      src/icons/svg/tree.svg
  59. 1 0
      src/icons/svg/user.svg
  60. 22 0
      src/icons/svgo.yml
  61. 47 0
      src/layout/components/AppMain.vue
  62. 142 0
      src/layout/components/Navbar.vue
  63. 26 0
      src/layout/components/Sidebar/FixiOSBug.js
  64. 41 0
      src/layout/components/Sidebar/Item.vue
  65. 43 0
      src/layout/components/Sidebar/Link.vue
  66. 82 0
      src/layout/components/Sidebar/Logo.vue
  67. 107 0
      src/layout/components/Sidebar/SidebarItem.vue
  68. 64 0
      src/layout/components/Sidebar/index.vue
  69. 3 0
      src/layout/components/index.js
  70. 93 0
      src/layout/index.vue
  71. 45 0
      src/layout/mixin/ResizeHandler.js
  72. 49 0
      src/main.js
  73. 92 0
      src/menu/menu.js
  74. 151 0
      src/mixins/index.js
  75. 64 0
      src/permission.js
  76. 266 0
      src/router/index.js
  77. 15 0
      src/settings.js
  78. 9 0
      src/store/getters.js
  79. 19 0
      src/store/index.js
  80. 48 0
      src/store/modules/app.js
  81. 31 0
      src/store/modules/settings.js
  82. 121 0
      src/store/modules/user.js
  83. 49 0
      src/styles/element-ui.scss
  84. 65 0
      src/styles/index.scss
  85. 28 0
      src/styles/mixin.scss
  86. 227 0
      src/styles/sidebar.scss
  87. 48 0
      src/styles/transition.scss
  88. 25 0
      src/styles/variables.scss
  89. 15 0
      src/utils/auth.js
  90. 10 0
      src/utils/get-page-title.js
  91. 109 0
      src/utils/index.js
  92. 86 0
      src/utils/request.js
  93. 20 0
      src/utils/validate.js
  94. 228 0
      src/views/404.vue
  95. 1469 0
      src/views/SettlementList/SetDetails.vue
  96. 286 0
      src/views/SettlementList/StatementList.vue
  97. 455 0
      src/views/SettlementList/StatementListquery.vue
  98. 325 0
      src/views/SettlementList/defectStatementList.vue
  99. 801 0
      src/views/SettlementList/index.vue
  100. 591 0
      src/views/allcase/caseIndex.vue

+ 14 - 0
.editorconfig

@@ -0,0 +1,14 @@
+# http://editorconfig.org
+root = true
+
+[*]
+charset = utf-8
+indent_style = space
+indent_size = 2
+end_of_line = lf
+insert_final_newline = true
+trim_trailing_whitespace = true
+
+[*.md]
+insert_final_newline = false
+trim_trailing_whitespace = false

+ 9 - 0
.env.development

@@ -0,0 +1,9 @@
+# just a flag
+ENV = 'development'
+
+# base api
+VUE_APP_BASE_API = '/api'
+# base bazb
+VUE_APP_BASE_API2 = '/bazb'
+# base bass
+VUE_APP_BASE_API3 = '/bass'

+ 9 - 0
.env.production

@@ -0,0 +1,9 @@
+# just a flag
+ENV = 'production'
+
+# base api
+VUE_APP_BASE_API = '/api'
+# base bazb
+VUE_APP_BASE_API2 = '/bazb'
+# base bass
+VUE_APP_BASE_API3 = '/bass'

+ 11 - 0
.env.staging

@@ -0,0 +1,11 @@
+NODE_ENV = production
+
+# just a flag
+ENV = 'staging'
+
+# base api
+VUE_APP_BASE_API = '/api'
+# base bazb
+VUE_APP_BASE_API2 = '/bazb'
+# base bass
+VUE_APP_BASE_API3 = '/bass'

+ 16 - 0
.gitignore

@@ -0,0 +1,16 @@
+node_modules/
+dist/
+npm-debug.log*
+yarn-debug.log*
+yarn-error.log*
+package-lock.json
+tests/**/coverage/
+
+# Editor directories and files
+.idea
+.vscode
+*.suo
+*.ntvs*
+*.njsproj
+*.sln
+.DS_Store

+ 14 - 0
.prettierrc

@@ -0,0 +1,14 @@
+{
+  "singleQuote": true,
+  "semi": true,
+  "bracketSpacing": true,
+  "trailingComma": "all",
+  "htmlWhitespaceSensitivity": "ignore",
+  "printWidth": 180,
+  "tabWidth": 2,
+  "useTabs": false,
+  "proseWrap": "preserve",
+  "arrowParens": "avoid",
+  "endOfLine": "auto",
+  "ignorePath": ".prettierignore"
+}

+ 5 - 0
.travis.yml

@@ -0,0 +1,5 @@
+language: node_js
+node_js: 10
+script: npm run test
+notifications:
+  email: false

+ 21 - 0
LICENSE

@@ -0,0 +1,21 @@
+MIT License
+
+Copyright (c) 2017-present PanJiaChen
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.

+ 0 - 0
README-zh.md


+ 27 - 0
README.md

@@ -0,0 +1,27 @@
+## 后端接口分模块服务前端配置说明
+```javascript
+<!-- 
+  模块名称:基础
+  前缀:/api
+  注册:$axios
+  使用方式:this.$axios......
+ -->
+VUE_APP_BASE_API = '/api'
+
+<!-- 
+  模块名称:病案指标
+  前缀:/bazb
+  注册:$axios2
+  使用方式:this.$axios2......
+ -->
+VUE_APP_BASE_API2 = '/bazb'
+
+<!-- 
+  模块名称:病案搜索
+  前缀:/bass
+  注册:$axios3
+  使用方式:this.$axios3......
+ -->
+VUE_APP_BASE_API3 = '/bass'
+
+```

+ 14 - 0
babel.config.js

@@ -0,0 +1,14 @@
+module.exports = {
+  presets: [
+    // https://github.com/vuejs/vue-cli/tree/master/packages/@vue/babel-preset-app
+    '@vue/cli-plugin-babel/preset',
+  ],
+  env: {
+    development: {
+      // babel-plugin-dynamic-import-node plugin only does one thing by converting all import() to require().
+      // This plugin can significantly increase the speed of hot updates, when you have a large number of pages.
+      // https://panjiachen.github.io/vue-element-admin-site/guide/advanced/lazy-loading.html
+      plugins: ['dynamic-import-node'],
+    },
+  },
+};

+ 35 - 0
build/index.js

@@ -0,0 +1,35 @@
+const { run } = require('runjs')
+const chalk = require('chalk')
+const config = require('../vue.config.js')
+const rawArgv = process.argv.slice(2)
+const args = rawArgv.join(' ')
+
+if (process.env.npm_config_preview || rawArgv.includes('--preview')) {
+  const report = rawArgv.includes('--report')
+
+  run(`vue-cli-service build ${args}`)
+
+  const port = 9526
+  const publicPath = config.publicPath
+
+  var connect = require('connect')
+  var serveStatic = require('serve-static')
+  const app = connect()
+
+  app.use(
+    publicPath,
+    serveStatic('./dist', {
+      index: ['index.html', '/']
+    })
+  )
+
+  app.listen(port, function () {
+    console.log(chalk.green(`> Preview at  http://localhost:${port}${publicPath}`))
+    if (report) {
+      console.log(chalk.green(`> Report at  http://localhost:${port}${publicPath}report.html`))
+    }
+
+  })
+} else {
+  run(`vue-cli-service build ${args}`)
+}

+ 18 - 0
jest.config.js

@@ -0,0 +1,18 @@
+module.exports = {
+  moduleFileExtensions: ['js', 'jsx', 'json', 'vue'],
+  transform: {
+    '^.+\\.vue$': 'vue-jest',
+    '.+\\.(css|styl|less|sass|scss|svg|png|jpg|ttf|woff|woff2)$': 'jest-transform-stub',
+    '^.+\\.jsx?$': 'babel-jest',
+  },
+  moduleNameMapper: {
+    '^@/(.*)$': '<rootDir>/src/$1',
+  },
+  snapshotSerializers: ['jest-serializer-vue'],
+  testMatch: ['**/tests/unit/**/*.spec.(js|jsx|ts|tsx)|**/__tests__/*.(js|jsx|ts|tsx)'],
+  collectCoverageFrom: ['src/utils/**/*.{js,vue}', '!src/utils/auth.js', '!src/utils/request.js', 'src/components/**/*.{js,vue}'],
+  coverageDirectory: '<rootDir>/tests/unit/coverage',
+  // 'collectCoverage': true,
+  coverageReporters: ['lcov', 'text-summary'],
+  testURL: 'http://localhost/',
+};

+ 10 - 0
jsconfig.json

@@ -0,0 +1,10 @@
+{
+  "compilerOptions": {
+    "baseUrl": "./",
+    "paths": {
+        "@/*": ["src/*"]
+    },
+    "jsx": "preserve"
+  },
+  "exclude": ["node_modules", "dist"]
+}

+ 57 - 0
mock/index.js

@@ -0,0 +1,57 @@
+const Mock = require('mockjs')
+const { param2Obj } = require('./utils')
+
+// const user = require('./user')
+const table = require('./table')
+
+const mocks = [
+  // ...user,
+  ...table
+]
+
+// for front mock
+// please use it cautiously, it will redefine XMLHttpRequest,
+// which will cause many of your third-party libraries to be invalidated(like progress event).
+function mockXHR() {
+  // mock patch
+  // https://github.com/nuysoft/Mock/issues/300
+  Mock.XHR.prototype.proxy_send = Mock.XHR.prototype.send
+  Mock.XHR.prototype.send = function() {
+    if (this.custom.xhr) {
+      this.custom.xhr.withCredentials = this.withCredentials || false
+
+      if (this.responseType) {
+        this.custom.xhr.responseType = this.responseType
+      }
+    }
+    this.proxy_send(...arguments)
+  }
+
+  function XHR2ExpressReqWrap(respond) {
+    return function(options) {
+      let result = null
+      if (respond instanceof Function) {
+        const { body, type, url } = options
+        // https://expressjs.com/en/4x/api.html#req
+        result = respond({
+          method: type,
+          body: JSON.parse(body),
+          query: param2Obj(url)
+        })
+      } else {
+        result = respond
+      }
+      return Mock.mock(result)
+    }
+  }
+
+  for (const i of mocks) {
+    Mock.mock(new RegExp(i.url), i.type || 'get', XHR2ExpressReqWrap(i.response))
+  }
+}
+
+module.exports = {
+  mocks,
+  mockXHR
+}
+

+ 81 - 0
mock/mock-server.js

@@ -0,0 +1,81 @@
+const chokidar = require('chokidar')
+const bodyParser = require('body-parser')
+const chalk = require('chalk')
+const path = require('path')
+const Mock = require('mockjs')
+
+const mockDir = path.join(process.cwd(), 'mock')
+
+function registerRoutes(app) {
+  let mockLastIndex
+  const { mocks } = require('./index.js')
+  const mocksForServer = mocks.map(route => {
+    return responseFake(route.url, route.type, route.response)
+  })
+  for (const mock of mocksForServer) {
+    app[mock.type](mock.url, mock.response)
+    mockLastIndex = app._router.stack.length
+  }
+  const mockRoutesLength = Object.keys(mocksForServer).length
+  return {
+    mockRoutesLength: mockRoutesLength,
+    mockStartIndex: mockLastIndex - mockRoutesLength
+  }
+}
+
+function unregisterRoutes() {
+  Object.keys(require.cache).forEach(i => {
+    if (i.includes(mockDir)) {
+      delete require.cache[require.resolve(i)]
+    }
+  })
+}
+
+// for mock server
+const responseFake = (url, type, respond) => {
+  return {
+    url: new RegExp(`${process.env.VUE_APP_BASE_API}${url}`),
+    type: type || 'get',
+    response(req, res) {
+      console.log('request invoke:' + req.path)
+      res.json(Mock.mock(respond instanceof Function ? respond(req, res) : respond))
+    }
+  }
+}
+
+module.exports = app => {
+  // parse app.body
+  // https://expressjs.com/en/4x/api.html#req.body
+  // app.use(bodyParser.json())
+  // app.use(bodyParser.urlencoded({
+  //   extended: true
+  // }))
+
+  const mockRoutes = registerRoutes(app)
+  var mockRoutesLength = mockRoutes.mockRoutesLength
+  var mockStartIndex = mockRoutes.mockStartIndex
+
+  // watch files, hot reload mock server
+  chokidar.watch(mockDir, {
+    ignored: /mock-server/,
+    ignoreInitial: true
+  }).on('all', (event, path) => {
+    if (event === 'change' || event === 'add') {
+      try {
+        // remove mock routes stack
+        app._router.stack.splice(mockStartIndex, mockRoutesLength)
+
+        // clear routes cache
+        unregisterRoutes()
+
+        const mockRoutes = registerRoutes(app)
+        mockRoutesLength = mockRoutes.mockRoutesLength
+        mockStartIndex = mockRoutes.mockStartIndex
+
+        console.log(chalk.magentaBright(`\n > Mock Server hot reload success! changed  ${path}`))
+      } catch (error) {
+        console.log(chalk.redBright(error))
+      }
+    }
+  })
+}

+ 29 - 0
mock/table.js

@@ -0,0 +1,29 @@
+const Mock = require('mockjs')
+
+const data = Mock.mock({
+  'items|30': [{
+    id: '@id',
+    title: '@sentence(10, 20)',
+    'status|1': ['published', 'draft', 'deleted'],
+    author: 'name',
+    display_time: '@datetime',
+    pageviews: '@integer(300, 5000)'
+  }]
+})
+
+module.exports = [
+  {
+    url: '/vue-admin-template/table/list',
+    type: 'get',
+    response: config => {
+      const items = data.items
+      return {
+        code: 20000,
+        data: {
+          total: items.length,
+          items: items
+        }
+      }
+    }
+  }
+]

+ 84 - 0
mock/user.js

@@ -0,0 +1,84 @@
+
+const tokens = {
+  admin: {
+    token: 'admin-token'
+  },
+  editor: {
+    token: 'editor-token'
+  }
+}
+
+const users = {
+  'admin-token': {
+    roles: ['admin'],
+    introduction: 'I am a super administrator',
+    avatar: 'https://wpimg.wallstcn.com/f778738c-e4f8-4870-b634-56703b4acafe.gif',
+    name: 'Super Admin'
+  },
+  'editor-token': {
+    roles: ['editor'],
+    introduction: 'I am an editor',
+    avatar: 'https://wpimg.wallstcn.com/f778738c-e4f8-4870-b634-56703b4acafe.gif',
+    name: 'Normal Editor'
+  }
+}
+
+module.exports = [
+  // user login
+  {
+    url: '/login',
+    type: 'post',
+    response: config => {
+      const { username } = config.body
+      const token = tokens[username]
+
+      // mock error
+      if (!token) {
+        return {
+          code: 60204,
+          message: 'Account and password are incorrect.'
+        }
+      }
+
+      return {
+        code: 200,
+        data: token
+      }
+    }
+  },
+
+  // get user info
+  {
+    url: '/vue-admin-template/user/info\.*',
+    type: 'get',
+    response: config => {
+      const { token } = config.query
+      const info = users[token]
+
+      // mock error
+      if (!info) {
+        return {
+          code: 50008,
+          message: 'Login failed, unable to get user details.'
+        }
+      }
+
+      return {
+        code: 20000,
+        data: info
+      }
+    }
+  },
+
+  // user logout
+  {
+    url: '/vue-admin-template/user/logout',
+    type: 'post',
+    response: _ => {
+      return {
+        code: 20000,
+        data: 'success'
+      }
+    }
+  }
+]

+ 25 - 0
mock/utils.js

@@ -0,0 +1,25 @@
+/**
+ * @param {string} url
+ * @returns {Object}
+ */
+function param2Obj(url) {
+  const search = decodeURIComponent(url.split('?')[1]).replace(/\+/g, ' ')
+  if (!search) {
+    return {}
+  }
+  const obj = {}
+  const searchArr = search.split('&')
+  searchArr.forEach(v => {
+    const index = v.indexOf('=')
+    if (index !== -1) {
+      const name = v.substring(0, index)
+      const val = v.substring(index + 1, v.length)
+      obj[name] = val
+    }
+  })
+  return obj
+}
+
+module.exports = {
+  param2Obj
+}

+ 61 - 0
package.json

@@ -0,0 +1,61 @@
+{
+  "name": "vue-admin-template",
+  "version": "4.4.0",
+  "description": "A vue admin template with Element UI & axios & iconfont & permission control & lint",
+  "author": "Pan <panfree23@gmail.com>",
+  "scripts": {
+    "dev": "vue-cli-service serve",
+    "build:prod": "vue-cli-service build",
+    "build:stage": "vue-cli-service build",
+    "preview": "node build/index.js --preview",
+    "svgo": "svgo -f src/icons/svg --config=src/icons/svgo.yml",
+    "lint": "vue-cli-service lint",
+    "test:unit": "jest --clearCache && vue-cli-service test:unit",
+    "test:ci": "npm run lint && npm run test:unit"
+  },
+  "dependencies": {
+    "axios": "0.18.1",
+    "core-js": "^3.24.1",
+    "echarts": "^5.3.3",
+    "el-table-infinite-scroll": "^1.0.11",
+    "element-ui": "2.13.2",
+    "js-cookie": "2.2.0",
+    "normalize.css": "7.0.0",
+    "nprogress": "0.2.0",
+    "path-to-regexp": "2.4.0",
+    "vue": "2.6.10",
+    "vue-router": "3.0.6",
+    "vuex": "3.1.0"
+  },
+  "devDependencies": {
+    "@vue/cli-plugin-babel": "4.4.4",
+    "@vue/cli-plugin-unit-jest": "4.4.4",
+    "@vue/cli-service": "4.4.4",
+    "@vue/test-utils": "1.0.0-beta.29",
+    "autoprefixer": "9.5.1",
+    "babel-jest": "23.6.0",
+    "babel-plugin-dynamic-import-node": "2.3.3",
+    "chalk": "2.4.2",
+    "connect": "3.6.6",
+    "html-webpack-plugin": "3.2.0",
+    "mockjs": "1.0.1-beta3",
+    "prettier": "^2.2.1",
+    "runjs": "4.3.2",
+    "sass": "1.26.8",
+    "sass-loader": "8.0.2",
+    "script-ext-html-webpack-plugin": "2.1.3",
+    "serve-static": "1.13.2",
+    "svg-sprite-loader": "4.1.3",
+    "svgo": "1.2.2",
+    "vue-template-compiler": "2.6.10"
+  },
+  "browserslist": [
+    "> 1%",
+    "last 2 versions"
+  ],
+  "engines": {
+    "node": ">=8.9",
+    "npm": ">= 3.0.0"
+  },
+  "license": "MIT"
+}

+ 8 - 0
postcss.config.js

@@ -0,0 +1,8 @@
+// https://github.com/michael-ciniawsky/postcss-load-config
+
+module.exports = {
+  plugins: {
+    // to edit target browsers: use "browserslist" field in package.json
+    autoprefixer: {},
+  },
+};

二进制
public/favicon.ico


+ 22 - 0
public/index.html

@@ -0,0 +1,22 @@
+<!DOCTYPE html>
+<html>
+  <head>
+    <meta charset="utf-8">
+    <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
+    <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no">
+    <link rel="icon" href="<%= BASE_URL %>favicon.ico">
+    <title>病案数据治理与服务平台</title>
+    <style>
+      html,body{
+        /* min-width:1600px!important; */
+      }
+    </style>
+  </head>
+  <body>
+    <noscript>
+      <strong>We're sorry but <%= webpackConfig.name %> doesn't work properly without JavaScript enabled. Please enable it to continue.</strong>
+    </noscript>
+    <div id="app"></div>
+    <!-- built files will be auto injected -->
+  </body>
+</html>

+ 160 - 0
src/App.vue

@@ -0,0 +1,160 @@
+<template>
+  <div id="app">
+    <router-view />
+  </div>
+</template>
+
+<script>
+export default {
+  name: 'App',
+};
+</script>
+
+<style>
+* {
+  font-size: 14px;
+  margin: 0;
+  padding: 0;
+}
+.btn1 {
+  background: #185da6;
+  color: #fff;
+}
+.btn2 {
+  background: #f1f6ff;
+  color: #13171e;
+  border: 0;
+}
+.eInput {
+  /* width:350px; */
+  border: none !important;
+}
+
+/* 三种方法选择自己喜欢的一个即可 */
+/* .el-input--prefix .el-input__inner{
+  border: none;
+} */
+/* .el-input--small .el-input__inner {
+    border: none;
+} */
+/* .textMsg {
+  position: absolute;
+  top: 80px;
+  cursor: pointer;
+  left: 3px;
+} */
+
+/* 重写input */
+.row-bg {
+  width: 100%;
+}
+.flexTable .el-input__inner {
+  border-top: none !important;
+  border-left: none !important;
+  border-right: none !important;
+  margin-bottom: 2px;
+  border-radius: 0px !important;
+}
+.tableReach .el-input__inner {
+  border-top: none !important;
+  border-left: none !important;
+  border-right: none !important;
+  border-radius: 0px !important;
+  border-bottom: 1px solid #f5f5f5 !important;
+}
+.tableReaches .el-input__inner {
+  border-top: none !important;
+  border-left: none !important;
+  border-right: none !important;
+  height: 30px !important;
+  line-height: 30px !important;
+  border-bottom: 0.5px solid #f5f5f5 !important;
+  border-radius: 0px !important;
+}
+.tableReachCCC .el-input__inner {
+  border-top: none !important;
+  border-left: none !important;
+  border-right: none !important;
+  border-radius: 0px !important;
+  border-bottom: 0.5px solid #f5f5f5 !important;
+}
+#hh .el-input__inner {
+  border-top: 0px !important;
+  border-left: 0px !important;
+  border-right: 0px !important;
+  border-radius: 0px !important;
+  border-bottom: 1px solid #ccc !important;
+}
+.flexView {
+  display: flex;
+  width: 100%;
+  align-items: center;
+  justify-content: center;
+}
+.tabright .el-input__inner {
+  border-top: none !important;
+  border-left: none !important;
+  border-right: 0.5px !important;
+  border-bottom: none !important;
+}
+.tableReachInput .flexView div {
+  width: 33%;
+}
+.refachInput {
+  display: flex;
+}
+.tablex td {
+  border-top: none !important;
+  border-left: none !important;
+  border-right: none !important;
+}
+.tablexs span {
+  font-size: 12px !important;
+}
+.refachInput span {
+  height: 40px;
+  line-height: 40px;
+  font-weight: bold;
+  text-align: left;
+  display: inline-block;
+}
+.tred td {
+  border-top: none !important;
+  border-left: none !important;
+  border-right: none !important;
+}
+.refachInput .el-input__inner {
+  border-top: none !important;
+  border-left: none !important;
+  border-right: none !important;
+  margin-bottom: 2px;
+  border-radius: 0px !important;
+}
+
+.msgBoxDetail span {
+  margin-left: 10px;
+}
+
+/* 质控下拉append */
+.zkSelect {
+  display: inline-block;
+}
+.zkSelect .el-input-group__append {
+  border-left: 0;
+  width: 62px !important;
+}
+.tableBox .el-table .el-table__header tr th:first-child {
+  /* border-radius: 10px 0px 0px 10px; */
+  border-radius: 0 !important;
+}
+.flextab {
+  display: flex;
+  align-items: center;
+  justify-content: space-between;
+  margin: 10px 0px;
+}
+.dashboard-container{
+  padding: 0;
+  margin: 16px !important;
+}
+</style>

+ 14 - 0
src/api/request.js

@@ -0,0 +1,14 @@
+import request from '@/utils/request';
+
+export default {
+	//...其他的请求
+  // 获取权限菜单列表
+  getRoleMenu(){
+    return request({
+      url: `/user/menus`,
+      method: 'post',
+    })
+  },
+   // ...其他的请求
+  //
+}

+ 9 - 0
src/api/table.js

@@ -0,0 +1,9 @@
+import request from '@/utils/request';
+
+export function getList(params) {
+  return request({
+    url: '/vue-admin-template/table/list',
+    method: 'get',
+    params,
+  });
+}

+ 39 - 0
src/api/user.js

@@ -0,0 +1,39 @@
+import request from '@/utils/request';
+import axios from '@/axios/index'
+import store from '@/store';
+import { getToken } from '@/utils/auth';
+export function login(data) {
+   let login = {
+     name :data.username,
+     password:data.password
+   }
+   store.state.login = login
+  //  axios.post('/login',login).then(res=>{
+  //     // console.log(res)
+  //     store.getters.token = res.data.token
+  //     // config.headers['X-Token'] = getToken();
+  //     commit('SET_TOKEN',res.data.token);
+  //     setToken(res.data.token);
+  //     return res;
+  //  })
+  return request({
+    url: '/login',
+    method: 'post',
+    params:login,
+  });
+}
+
+export function getInfo(token) {
+  return request({
+    url: '/vue-admin-template/user/info',
+    method: 'get',
+    params: { token },
+  });
+}
+
+export function logout() {
+  return request({
+    url: '/vue-admin-template/user/logout',
+    method: 'post',
+  });
+}

二进制
src/assets/404_images/404.png


二进制
src/assets/404_images/404_cloud.png


二进制
src/assets/images/b1.png


二进制
src/assets/images/b2.png


二进制
src/assets/images/b3.png


二进制
src/assets/images/loginbj.jpg


二进制
src/assets/images/logo.png


二进制
src/assets/images/方形未选中.png


二进制
src/assets/images/选中.png


+ 152 - 0
src/axios/index.js

@@ -0,0 +1,152 @@
+import store from '@/store';
+import axios from 'axios';
+import { Message, Loading } from 'element-ui';
+import { getToken, setToken, removeToken } from '@/utils/auth';
+import router from '@/router'
+// 公共数据
+let loadingInstance = null; // 声明loading
+let loadingCount = 0; // 声明接口并发计数器
+
+// 记录和显示错误
+function errorLog(error) {
+  // 添加到日志
+  store.dispatch('vxadmin/log/push', {
+    message: '数据请求异常',
+    type: 'danger',
+    meta: {
+      error,
+    },
+  });
+  // 打印到控制台
+
+  if (process.env.NODE_ENV === 'development') {
+    console.log(error);
+  }
+  // 显示提示
+  Message({
+    message: error.message,
+    type: 'error',
+    duration: 5 * 1000,
+  });
+}
+// 创建一个 axios 实例
+// baseUrl = '/api
+const service = axios.create({
+  baseURL: process.env.VUE_APP_BASE_API,
+  timeout: 50000
+});
+
+// 请求拦截器
+service.interceptors.request.use(
+  config => {
+    if (loadingCount == 0) {
+      loadingInstance = Loading.service({
+        lock: false,
+        customClass: 'z-index999',
+        text: '加载中,请稍后...',
+        spinner: 'ui-icon-loading',
+        background: 'rgba(0, 0, 0, 0.7)',
+      });
+    }
+    if (store.getters.token) {
+      config.headers['token'] = getToken();
+    }
+    loadingCount++;
+    // 在请求发送之前做一些处理
+    let jsonStr = config.data;
+    let data = jsonStr;
+    config.data = data;
+    return config;
+  },
+  error => {
+    // 发送失败
+    Promise.reject(error);
+  },
+);
+
+// 响应拦截器
+service.interceptors.response.use(
+  response => {
+    loadingCount--;
+    if (loadingInstance && loadingCount == 0) {
+      loadingInstance.close();
+    }
+    const dataAxios = response.data;
+    const { code } = dataAxios;
+    // 根据 code 进行判断}
+    if (code === 200) {
+      // 如果没有 code 代表这不是项目后端开发的接口 比如可能是 VXAdmin 请求最新版本
+      return dataAxios;
+    } else {
+      if (code == 4001) {
+        Message({
+          message: `${dataAxios.msg}`,
+          type: 'error',
+          duration: 5 * 1000,
+        });
+        setToken('');
+        // 清除缓存的权限菜单
+        sessionStorage.removeItem("route");
+        //跳转登录页面
+        router.push({path:`/login?redirect=${router.currentRoute.fullPath}`})
+        return
+      }
+      Message({
+        message: `${dataAxios.msg}`,
+        type: 'error',
+        duration: 5 * 1000,
+      });
+      return Promise.reject(dataAxios.data);
+      //   //  发送的接口为response.config.url,进行报错处理
+    }
+  },
+  error => {
+    loadingCount--;
+    if (loadingInstance && loadingCount == 0) {
+      loadingInstance.close();
+    }
+    if (error && error.response) {
+      switch (error.response.status) {
+        case 400:
+          error.message = '请求错误';
+          break;
+        case 401:
+          error.message = '未授权,请登录';
+          break;
+        case 403:
+          error.message = '拒绝访问';
+          break;
+        case 404:
+          error.message = `请求地址出错: ${error.response.config.url}`;
+          break;
+        case 408:
+          error.message = '请求超时';
+          break;
+        case 500:
+          error.message = '服务器内部错误';
+          break;
+        case 501:
+          error.message = '服务未实现';
+          break;
+        case 502:
+          error.message = '网关错误';
+          break;
+        case 503:
+          error.message = '服务不可用';
+          break;
+        case 504:
+          error.message = '网关超时';
+          break;
+        case 505:
+          error.message = 'HTTP版本不受支持';
+          break;
+        default:
+          break;
+      }
+    }
+    errorLog(error);
+    return Promise.reject(error);
+  },
+);
+
+export default service;

+ 151 - 0
src/axios/index2.js

@@ -0,0 +1,151 @@
+import store from '@/store';
+import axios from 'axios';
+import { Message, Loading } from 'element-ui';
+import { getToken, setToken, removeToken } from '@/utils/auth';
+import router from '@/router'
+// 公共数据
+let loadingInstance = null; // 声明loading
+let loadingCount = 0; // 声明接口并发计数器
+
+// 记录和显示错误
+function errorLog(error) {
+  // 添加到日志
+  store.dispatch('vxadmin/log/push', {
+    message: '数据请求异常',
+    type: 'danger',
+    meta: {
+      error,
+    },
+  });
+  // 打印到控制台
+
+  if (process.env.NODE_ENV === 'development') {
+    console.log(error);
+  }
+  // 显示提示
+  Message({
+    message: error.message,
+    type: 'error',
+    duration: 5 * 1000,
+  });
+}
+// 创建一个 axios 实例
+const service2 = axios.create({
+  baseURL: process.env.VUE_APP_BASE_API2,
+  timeout: 50000
+});
+
+// 请求拦截器
+service2.interceptors.request.use(
+  config => {
+    if (loadingCount == 0) {
+      loadingInstance = Loading.service({
+        lock: false,
+        customClass: 'z-index999',
+        text: '加载中,请稍后...',
+        spinner: 'ui-icon-loading',
+        background: 'rgba(0, 0, 0, 0.7)',
+      });
+    }
+    if (store.getters.token) {
+      config.headers['token'] = getToken();
+    }
+    loadingCount++;
+    // 在请求发送之前做一些处理
+    let jsonStr = config.data;
+    let data = jsonStr;
+    config.data = data;
+    return config;
+  },
+  error => {
+    // 发送失败
+    Promise.reject(error);
+  },
+);
+
+// 响应拦截器
+service2.interceptors.response.use(
+  response => {
+    loadingCount--;
+    if (loadingInstance && loadingCount == 0) {
+      loadingInstance.close();
+    }
+    const dataAxios = response.data;
+    const { code } = dataAxios;
+    // 根据 code 进行判断}
+    if (code === 200) {
+      // 如果没有 code 代表这不是项目后端开发的接口 比如可能是 VXAdmin 请求最新版本
+      return dataAxios;
+    } else {
+      if (code == 4001) {
+        Message({
+          message: `${dataAxios.msg}`,
+          type: 'error',
+          duration: 5 * 1000,
+        });
+        setToken('');
+        // 清除缓存的权限菜单
+        sessionStorage.removeItem("route");
+        //跳转登录页面
+        router.push({path:`/login?redirect=${router.currentRoute.fullPath}`})
+        return
+      }
+      Message({
+        message: `${dataAxios.msg}`,
+        type: 'error',
+        duration: 5 * 1000,
+      });
+      return Promise.reject(dataAxios.data);
+      //   //  发送的接口为response.config.url,进行报错处理
+    }
+  },
+  error => {
+    loadingCount--;
+    if (loadingInstance && loadingCount == 0) {
+      loadingInstance.close();
+    }
+    if (error && error.response) {
+      switch (error.response.status) {
+        case 400:
+          error.message = '请求错误';
+          break;
+        case 401:
+          error.message = '未授权,请登录';
+          break;
+        case 403:
+          error.message = '拒绝访问';
+          break;
+        case 404:
+          error.message = `请求地址出错: ${error.response.config.url}`;
+          break;
+        case 408:
+          error.message = '请求超时';
+          break;
+        case 500:
+          error.message = '服务器内部错误';
+          break;
+        case 501:
+          error.message = '服务未实现';
+          break;
+        case 502:
+          error.message = '网关错误';
+          break;
+        case 503:
+          error.message = '服务不可用';
+          break;
+        case 504:
+          error.message = '网关超时';
+          break;
+        case 505:
+          error.message = 'HTTP版本不受支持';
+          break;
+        default:
+          break;
+      }
+    }
+    errorLog(error);
+    return Promise.reject(error);
+  },
+);
+
+export default service2;

+ 151 - 0
src/axios/index3.js

@@ -0,0 +1,151 @@
+import store from '@/store';
+import axios from 'axios';
+import { Message, Loading } from 'element-ui';
+import { getToken, setToken, removeToken } from '@/utils/auth';
+import router from '@/router'
+// 公共数据
+let loadingInstance = null; // 声明loading
+let loadingCount = 0; // 声明接口并发计数器
+
+// 记录和显示错误
+function errorLog(error) {
+  // 添加到日志
+  store.dispatch('vxadmin/log/push', {
+    message: '数据请求异常',
+    type: 'danger',
+    meta: {
+      error,
+    },
+  });
+  // 打印到控制台
+
+  if (process.env.NODE_ENV === 'development') {
+    console.log(error);
+  }
+  // 显示提示
+  Message({
+    message: error.message,
+    type: 'error',
+    duration: 5 * 1000,
+  });
+}
+// 创建一个 axios 实例
+const service3 = axios.create({
+  baseURL: process.env.VUE_APP_BASE_API3,
+  timeout: 50000
+});
+
+// 请求拦截器
+service3.interceptors.request.use(
+  config => {
+    if (loadingCount == 0) {
+      loadingInstance = Loading.service({
+        lock: false,
+        customClass: 'z-index999',
+        text: '加载中,请稍后...',
+        spinner: 'ui-icon-loading',
+        background: 'rgba(0, 0, 0, 0.7)',
+      });
+    }
+    if (store.getters.token) {
+      config.headers['token'] = getToken();
+    }
+    loadingCount++;
+    // 在请求发送之前做一些处理
+    let jsonStr = config.data;
+    let data = jsonStr;
+    config.data = data;
+    return config;
+  },
+  error => {
+    // 发送失败
+    Promise.reject(error);
+  },
+);
+
+// 响应拦截器
+service3.interceptors.response.use(
+  response => {
+    loadingCount--;
+    if (loadingInstance && loadingCount == 0) {
+      loadingInstance.close();
+    }
+    const dataAxios = response.data;
+    const { code } = dataAxios;
+    // 根据 code 进行判断}
+    if (code === 200) {
+      // 如果没有 code 代表这不是项目后端开发的接口 比如可能是 VXAdmin 请求最新版本
+      return dataAxios;
+    } else {
+      if (code == 4001) {
+        Message({
+          message: `${dataAxios.msg}`,
+          type: 'error',
+          duration: 5 * 1000,
+        });
+        setToken('');
+        // 清除缓存的权限菜单
+        sessionStorage.removeItem("route");
+        //跳转登录页面
+        router.push({path:`/login?redirect=${router.currentRoute.fullPath}`})
+        return
+      }
+      Message({
+        message: `${dataAxios.msg}`,
+        type: 'error',
+        duration: 5 * 1000,
+      });
+      return Promise.reject(dataAxios.data);
+      //   //  发送的接口为response.config.url,进行报错处理
+    }
+  },
+  error => {
+    loadingCount--;
+    if (loadingInstance && loadingCount == 0) {
+      loadingInstance.close();
+    }
+    if (error && error.response) {
+      switch (error.response.status) {
+        case 400:
+          error.message = '请求错误';
+          break;
+        case 401:
+          error.message = '未授权,请登录';
+          break;
+        case 403:
+          error.message = '拒绝访问';
+          break;
+        case 404:
+          error.message = `请求地址出错: ${error.response.config.url}`;
+          break;
+        case 408:
+          error.message = '请求超时';
+          break;
+        case 500:
+          error.message = '服务器内部错误';
+          break;
+        case 501:
+          error.message = '服务未实现';
+          break;
+        case 502:
+          error.message = '网关错误';
+          break;
+        case 503:
+          error.message = '服务不可用';
+          break;
+        case 504:
+          error.message = '网关超时';
+          break;
+        case 505:
+          error.message = 'HTTP版本不受支持';
+          break;
+        default:
+          break;
+      }
+    }
+    errorLog(error);
+    return Promise.reject(error);
+  },
+);
+
+export default service3;

+ 77 - 0
src/components/Breadcrumb/index.vue

@@ -0,0 +1,77 @@
+<template>
+  <el-breadcrumb class="app-breadcrumb" separator="/">
+    <transition-group name="breadcrumb">
+      <el-breadcrumb-item v-for="(item, index) in levelList" :key="item.path">
+        <span v-if="item.redirect === 'noRedirect' || index == levelList.length - 1" class="no-redirect">{{ item.meta.title }}</span>
+        <a v-else @click.prevent="handleLink(item)">{{ item.meta.title }}</a>
+      </el-breadcrumb-item>
+    </transition-group>
+  </el-breadcrumb>
+</template>
+
+<script>
+import pathToRegexp from 'path-to-regexp';
+
+export default {
+  data() {
+    return {
+      levelList: null,
+    };
+  },
+  watch: {
+    $route() {
+      this.getBreadcrumb();
+    },
+  },
+  created() {
+    this.getBreadcrumb();
+  },
+  methods: {
+    getBreadcrumb() {
+      // only show routes with meta.title
+      let matched = this.$route.matched.filter(item => item.meta && item.meta.title);
+      // const first = matched[0];
+      // if (!this.isDashboard(first)) {
+      //   matched = [{ path: '/dashboard', meta: { title: '首页' } }].concat(matched);
+      // }
+
+      this.levelList = matched.filter(item => item.meta && item.meta.title && item.meta.breadcrumb !== false);
+    },
+    isDashboard(route) {
+      const name = route && route.name;
+      if (!name) {
+        return false;
+      }
+      return name.trim().toLocaleLowerCase() === '首页'.toLocaleLowerCase();
+    },
+    pathCompile(path) {
+      // To solve this problem https://github.com/PanJiaChen/vue-element-admin/issues/561
+      const { params } = this.$route;
+      var toPath = pathToRegexp.compile(path);
+      return toPath(params);
+    },
+    handleLink(item) {
+      const { redirect, path } = item;
+      if (redirect) {
+        this.$router.push(redirect);
+        return;
+      }
+      this.$router.push(this.pathCompile(path));
+    },
+  },
+};
+</script>
+
+<style lang="scss" scoped>
+.app-breadcrumb.el-breadcrumb {
+  display: inline-block;
+  font-size: 14px;
+  line-height: 50px;
+  margin-left: 8px;
+
+  .no-redirect {
+    color: #97a8be;
+    cursor: text;
+  }
+}
+</style>

+ 39 - 0
src/components/Hamburger/index.vue

@@ -0,0 +1,39 @@
+<template>
+  <div style="padding: 0 15px" @click="toggleClick">
+    <svg :class="{ 'is-active': isActive }" class="hamburger" viewBox="0 0 1024 1024" xmlns="http://www.w3.org/2000/svg" width="64" height="64">
+      <path
+        d="M408 442h480c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8H408c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8zm-8 204c0 4.4 3.6 8 8 8h480c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8H408c-4.4 0-8 3.6-8 8v56zm504-486H120c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8h784c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8zm0 632H120c-4.4 0-8 3.6-8 8v56c0 4.4 3.6 8 8 8h784c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8zM142.4 642.1L298.7 519a8.84 8.84 0 0 0 0-13.9L142.4 381.9c-5.8-4.6-14.4-.5-14.4 6.9v246.3a8.9 8.9 0 0 0 14.4 7z"
+      />
+    </svg>
+  </div>
+</template>
+
+<script>
+export default {
+  name: 'Hamburger',
+  props: {
+    isActive: {
+      type: Boolean,
+      default: false,
+    },
+  },
+  methods: {
+    toggleClick() {
+      this.$emit('toggleClick');
+    },
+  },
+};
+</script>
+
+<style scoped>
+.hamburger {
+  display: inline-block;
+  vertical-align: middle;
+  width: 20px;
+  height: 20px;
+}
+
+.hamburger.is-active {
+  transform: rotate(180deg);
+}
+</style>

+ 62 - 0
src/components/SvgIcon/index.vue

@@ -0,0 +1,62 @@
+<template>
+  <div v-if="isExternal" :style="styleExternalIcon" class="svg-external-icon svg-icon" v-on="$listeners" />
+  <svg v-else :class="svgClass" aria-hidden="true" v-on="$listeners">
+    <use :xlink:href="iconName" />
+  </svg>
+</template>
+
+<script>
+// doc: https://panjiachen.github.io/vue-element-admin-site/feature/component/svg-icon.html#usage
+import { isExternal } from '@/utils/validate';
+
+export default {
+  name: 'SvgIcon',
+  props: {
+    iconClass: {
+      type: String,
+      required: true,
+    },
+    className: {
+      type: String,
+      default: '',
+    },
+  },
+  computed: {
+    isExternal() {
+      return isExternal(this.iconClass);
+    },
+    iconName() {
+      return `#icon-${this.iconClass}`;
+    },
+    svgClass() {
+      if (this.className) {
+        return 'svg-icon ' + this.className;
+      } else {
+        return 'svg-icon';
+      }
+    },
+    styleExternalIcon() {
+      return {
+        mask: `url(${this.iconClass}) no-repeat 50% 50%`,
+        '-webkit-mask': `url(${this.iconClass}) no-repeat 50% 50%`,
+      };
+    },
+  },
+};
+</script>
+
+<style scoped>
+.svg-icon {
+  width: 1em;
+  height: 1em;
+  vertical-align: -0.15em;
+  fill: currentColor;
+  overflow: hidden;
+}
+
+.svg-external-icon {
+  background-color: currentColor;
+  mask-size: cover !important;
+  display: inline-block;
+}
+</style>

+ 38 - 0
src/components/Title/index.vue

@@ -0,0 +1,38 @@
+<template>
+  <div class="h-title">
+    <span class="blue"></span>
+    <span class="text">{{ title }}</span>
+  </div>
+</template>
+<script>
+export default {
+  props: {
+    title: {
+      type: String,
+      default: '标题',
+    },
+  },
+  data() {
+    return {};
+  },
+};
+</script>
+<style lang="scss" scoped>
+.h-title {
+  display: flex;
+  margin: 0 0 15px 0;
+  .blue {
+    display: block;
+    width: 6px;
+    height: 17px;
+    background: linear-gradient(180deg, #185da6 0%, #3195ff 100%);
+    border-radius: 3px;
+  }
+  .text {
+    font-size: 16px;
+    font-weight: 600;
+    color: #13171e;
+    margin: 0 0 0 14px;
+  }
+}
+</style>

+ 319 - 0
src/components/m-cont-reight/index.vue

@@ -0,0 +1,319 @@
+<template>
+  <div id="MyDiv" v-if="errorList.length!=0">
+    <div class="cont-reight">
+      <div class="cont-reight-top">
+        <div class="cont-reight-btn">{{ titleName }}</div>
+      </div>
+      <!-- 评分 -->
+      <!-- <div class="storeBox">
+          <div class="text">{{ score }}</div>
+          <div class="spa">
+            <div class="spaview" v-if="score > 90">优</div>
+            <div class="spaview" v-else-if="score >= 70 && score == 90">良</div>
+            <div class="spaview" v-else>差</div>
+          </div>
+        </div> -->
+
+      <!-- end -->
+      <!-- 强制 -->
+      <!-- <div class="flexNox">
+          <div class="Yradio">
+            <div class="Yradiobox"></div>
+            强制
+          </div>
+          <div class="Rradio">
+            <div class="Rradiobox"></div>
+            建议
+          </div>
+        </div> -->
+
+      <!-- end -->
+      <div v-for="(item,index) in errorList" :key="index" class="errorcase">
+        <span class="errorcase-zi">{{ index+1}}.</span>
+        <span class="errorcase-zi1">{{ item.notice }}</span>
+      </div>
+    </div>
+  </div>
+</template>
+  <script>
+// import OtherComponent from '@/components/OtherComponent'
+export default {
+  name: 'm-cont-reight',
+  components: {
+    // OtherComponent
+  },
+  directives: {},
+  filters: {
+  },
+  extends: {},
+  mixins: {},
+  props: {
+    titleName: {
+      type: null,
+      default: false,
+    },
+    errorList: {
+      type: null,
+      default: false,
+    },
+  },
+  data() {
+    return {
+      // errorList: [],
+      score: 0,
+    };
+  },
+  computed: {},
+  watch: {},
+  beforeCreate() {
+    // 生命周期钩子:组件实例刚被创建,组件属性计算之前,如 data 属性等
+  },
+  created() {
+    // 生命周期钩子:组件实例创建完成,属性已绑定,但 DOM 还未生成,el 属性还不存在
+    // 初始化渲染页面
+  },
+  beforeMount() {
+    // 生命周期钩子:模板编译/挂载之前
+  },
+  mounted() {
+    // 生命周期钩子:模板编译、挂载之后(此时不保证已在 document 中)
+  },
+  beforeUpate() {
+    // 生命周期钩子:组件更新之前
+  },
+  updated() {
+    // 生命周期钩子:组件更新之后
+  },
+  activated() {
+    // 生命周期钩子:keep-alive 组件激活时调用
+  },
+  deactivated() {
+    // 生命周期钩子:keep-alive 组件停用时调用
+  },
+  beforeDestroy() {
+    // 生命周期钩子:实例销毁前调用
+  },
+  destroyed() {
+    // 生命周期钩子:实例销毁后调用
+  },
+  errorCaptured(err, vm, info) {
+    // 生命周期钩子:当捕获一个来自子孙组件的错误时被调用。此钩子会收到三个参数:错误对象、发生错误的组件实例以及一个包含错误来源信息的字符串。
+    console.log(err, vm, info);
+  },
+  methods: {
+    /**
+     * 跳转对应病例首页
+     */
+    getBlankIndex(item) {
+      let eleClass = document.querySelectorAll('.choose-twinkle');
+      console.log(eleClass);
+      // const tb = this.$refs.tables.value;
+      console.log(item.error_field);
+      // this.$refs[item.error_field]
+      console.log(this.$refs[item.error_field]);
+      for (let item = 0; item < eleClass.length; item++) {
+        console.log(eleClass[item]);
+        eleClass[item].className = 'table-label';
+      }
+      // return;
+      // document
+      // this.$refs[item.error_field].classList.value + ' choose-twinkle';
+      this.$refs[item.error_field].className = 'choose-twinkle';
+      this.$refs[item.error_field].scrollIntoView({ block: 'start', behavior: 'smooth' });
+      //   .getElementById("agentTitle")
+      //   .scrollIntoView({ block: "start", behavior: "smooth" });
+      // 跳转到指定位置并且平滑滚动
+      // this.$el.querySelector('.table-labelon1').scrollIntoView({ behavior: 'smooth' });
+      // this.$el.querySelector('.table-labelon1').style.color = 'red';
+    },
+  },
+};
+</script>
+  <style lang='scss' scoped>
+#MyDiv {
+  margin: 0;
+  padding: 0;
+}
+
+.choose-twinkle {
+  // background: red;
+  font-size: 20px;
+  color: red;
+  font-weight: 600;
+  background: yellow;
+}
+.el-menu-vertical-demo {
+  width: 200px;
+}
+.flexNox {
+  width: 200px;
+  display: flex;
+  margin: 0 auto;
+  justify-content: center;
+  align-items: center;
+  .Yradiobox {
+    width: 10px;
+    background: red;
+    margin-right: 5px;
+    height: 10px;
+    border-radius: 50%;
+  }
+  .Rradiobox {
+    width: 10px;
+    background: #fa6400;
+    height: 10px;
+    margin-right: 5px;
+    border-radius: 50%;
+  }
+  .Yradio {
+    width: 80px;
+    display: flex;
+    align-items: center;
+    text-align: center;
+  }
+  .Rradio {
+    width: 80px;
+    display: flex;
+    align-items: center;
+    text-align: center;
+  }
+}
+.cont-reight-btn {
+  margin-top: 20px;
+  width: 100%;
+  height: 43px;
+  background: #d3e3ff;
+  border-radius: 8px;
+  font-size: 14px;
+  font-weight: bold;
+  color: #333333;
+  text-align: center;
+  line-height: 43px;
+}
+.cont-reight-bottom {
+  width: 100%;
+  margin: 24px 7px;
+  display: flex;
+}
+.cont-reight-bottom-title {
+  width: 60px;
+  height: 70px;
+  background: #ffdfdf;
+  border-right: 3px solid #ff0000;
+  text-align: center;
+  line-height: 88px;
+  font-size: 24px;
+  font-weight: bold;
+  color: #da1515;
+  position: relative;
+}
+.cont-reight-bottom-title-zi {
+  // height: 10px;
+  position: absolute;
+  top: 23px;
+  left: 15px;
+  font-size: 18px;
+  color: #da1515;
+  line-height: 0px;
+}
+.cont-reight-bottom-title-null {
+  width: 60px;
+  height: 70px;
+  background: #fffbec;
+  border-right: 3px solid #fa6400;
+  text-align: center;
+  line-height: 88px;
+  font-size: 24px;
+  font-weight: bold;
+  color: #ff5700;
+  position: relative;
+}
+.cont-reight-bottom-title-null-zi {
+  position: absolute;
+  top: 23px;
+  left: 15px;
+  font-size: 18px;
+  color: #ff5700;
+  line-height: 0px;
+}
+.cont-reight-bottom-conter {
+  margin-left: 8px;
+  height: 70px;
+  display: flex;
+  justify-content: space-around;
+  flex-direction: column;
+  p {
+    font-size: 8px;
+    color: #333333;
+  }
+}
+.cont-reight-top-cont {
+  margin: 8px 0 0 20px;
+  p {
+    font-size: 12px;
+    font-weight: bold;
+    color: #333333;
+    padding: 3px 0;
+  }
+}
+
+//
+.storeBox {
+  width: 200px;
+  height: 80px;
+  line-height: 80px;
+  font-size: 30px;
+  text-align: center;
+  align-items: center;
+  position: relative;
+  margin: 30px auto;
+  border: 1px solid #ccc;
+  .text {
+    font-size: 30px;
+  }
+  .spa::before {
+    content: '';
+    width: 0;
+    height: 0;
+    border: 30px solid transparent;
+    border-right: 30px solid red;
+    -webkit-transform: rotate(135deg);
+    transform: rotate(135deg);
+    color: #fff;
+    position: absolute;
+    right: -30px;
+    top: -30px;
+    cursor: pointer;
+  }
+  .flexTable {
+    display: flex;
+    align-items: center;
+  }
+
+  .spaview {
+    position: absolute;
+    right: 5px;
+    top: -1px;
+    font-size: 13px;
+    text-align: right;
+    height: 30px;
+    line-height: 30px;
+    width: 100px;
+    color: #fff;
+  }
+}
+.errorcase{
+  padding: 10px 5px;
+  // overflow: scroll;
+}
+.errorcase-zi{
+  padding-right:5px;
+  font-size: 16px;
+  // color:#ff0000;
+}
+.errorcase-zi1{
+  // color:#ff0000;
+
+}
+</style>
+  

+ 80 - 0
src/components/m-menu/index.vue

@@ -0,0 +1,80 @@
+<template>
+  <div id="Mydiv">
+    <el-row class="tac">
+      <el-col :span="60">
+        <el-menu class="el-menu-vertical-demo" :default-active="activeIndex" @select="handleOpen">
+          <el-menu-item index="/homePage">
+            <span slot="title">住院病案</span>
+          </el-menu-item>
+          <el-menu-item index="/dischargerecord">
+            <span slot="title">出院记录</span>
+          </el-menu-item>
+          <el-menu-item index="/hospitalized">
+            <span slot="title">入院记录</span>
+          </el-menu-item>
+          <el-menu-item index="/courseOfDisease">
+            <span slot="title">病程记录</span>
+          </el-menu-item>
+          <el-menu-item index="/operation">
+            <span slot="title">手术记录</span>
+          </el-menu-item>
+          <el-menu-item index="/groupConsultation">
+            <span slot="title">会诊记录</span>
+          </el-menu-item>
+          <el-submenu index="3">
+            <template slot="title">
+              <span>报告单</span>
+            </template>
+            <el-menu-item index="/imgsText">病历图文报告单</el-menu-item>
+            <el-menu-item index="/ultrasonic">超声诊断报告</el-menu-item>
+            <el-menu-item index="/image">影像诊断报告单</el-menu-item>
+            <el-menu-item index="/electrocardiogram">心电图诊断报告</el-menu-item>
+            <el-menu-item index="/inspectionReport">检验报告单</el-menu-item>
+          </el-submenu>
+          <el-submenu index="2">
+            <template slot="title">
+              <span>医嘱单</span>
+            </template>
+            <el-menu-item index="/medicalAdvice">长期医嘱</el-menu-item>
+            <el-menu-item index="/medicalTemporary">临时医嘱</el-menu-item>
+          </el-submenu>
+        </el-menu>
+      </el-col>
+    </el-row>
+  </div>
+</template>
+<script>
+// import store from '@/store';
+export default {
+    data() {
+    return {
+        activeIndex:''
+    };
+  },
+  mounted() {
+    // this.valData = this.storageGet('getData');
+    this.activeIndex = this.storageGet('activeIndex')||'/homePage';
+    // 生命周期钩子:模板编译、挂载之后(此时不保证已在 document 中)
+  },
+  methods: {
+    handleOpen(key) {
+      console.log(key);
+      this.storageSet('activeIndex', key);
+      this.goreplace(key)
+    },
+  },
+};
+</script>
+
+<style scoped>
+    #Mydiv{
+      padding: 0 0 0 2px;
+    }
+.el-menu-vertical-demo {
+  width: 200px;
+}
+.el-submenu__title {
+  /* padding-left: 20px !important; */
+  padding: 0 0 0 20px;
+}
+</style>

+ 144 - 0
src/components/m-pagination/index.vue

@@ -0,0 +1,144 @@
+<template>
+  <!-- 分页控制 -->
+  <div class="table-pagination" style="margin:15px 0px;">
+    <div class="total-current">
+      <div class="page-total">共{{ paginationData.total }}条记录</div>
+      <div class="page-current">第{{ paginationData.currentPage }}/{{ Math.ceil(paginationData.total / paginationData.pageSize) }}页</div>
+    </div>
+    <el-pagination
+      background
+      layout="prev, pager, next, slot"
+      :total="paginationData.total"
+      :page-size="paginationData.pageSize"
+      :current-page.sync="paginationData.currentPage"
+      @current-change="currentPageChange"
+    >
+      <div class="jump-input">
+        <span>第</span>
+        <el-input size="small" class="jump-input-area" v-model.number="inputPage"></el-input>
+        <span>页</span>
+      </div>
+      <div class="jump-btn pointer" @click="jumpPage" v-if="jumpFlag">跳转</div>
+      <div class="no-jump-btn" v-else>跳转</div>
+    </el-pagination>
+  </div>
+</template>
+
+<script>
+export default {
+  data() {
+    return {
+      paginationData: {
+        total: 100,
+        currentPage: 1,
+        pageSize: 20,
+      },
+      inputPage: 1,
+    };
+  },
+  props: {
+    data: {
+      type: Object,
+      default: null,
+    },
+  },
+  computed: {
+    jumpFlag() {
+      return this.paginationData.total > this.paginationData.pageSize;
+    },
+  },
+  methods: {
+    currentPageChange(current) {
+      this.paginationData.currentPage = current;
+      this.$emit('pageChangeEvent', this.paginationData);
+    },
+    jumpPage() {
+      // 判断是否是数字
+      let reg = /^[0-9]+.?[0-9]*$/;
+      if (!reg.test(this.inputPage)) {
+        this.inputPage = '';
+        this.$message({
+          type: 'error',
+          message: '请输入正整数!',
+        });
+        return false;
+      }
+      // 判断范围
+      if (this.inputPage < 1) {
+        this.inputPage = 1;
+      }
+      if (this.inputPage > Math.ceil(this.paginationData.total / this.paginationData.pageSize)) {
+        this.inputPage = Math.ceil(this.paginationData.total / this.paginationData.pageSize);
+      }
+      // 设置跳转
+      this.currentPageChange(this.inputPage);
+    },
+  },
+  created() {
+    this.paginationData = this.data;
+  },
+};
+</script>
+
+<style lang="scss">
+.table-pagination {
+  display: flex;
+  justify-content: flex-end;
+  align-items: center;
+  margin-bottom: 52px;
+  padding-right: 40px;
+  .total-current {
+    display: flex;
+    color: #666666;
+    font-size: 14px;
+    margin-right: 57px;
+    .page-current {
+      margin-left: 18px;
+    }
+  }
+  .jump-input {
+    display: inline-block;
+    span {
+      color: #666666;
+      text-align: center;
+      font-size: 14px;
+      font-weight: 400;
+    }
+    .jump-input-area {
+      width: 60px;
+      .el-input__inner {
+        height: 28px;
+      }
+    }
+  }
+  .jump-btn {
+    display: inline-block;
+    width: 60px;
+    height: 28px;
+    line-height: 28px;
+    margin-left: 20px;
+    text-align: center;
+    font-size: 14px;
+    font-weight: 400;
+    color: #fff;
+    background: linear-gradient(60deg, #5ebfff, #008fee);
+    border-radius: 2px;
+  }
+  .no-jump-btn {
+    display: inline-block;
+    width: 60px;
+    height: 28px;
+    line-height: 28px;
+    margin-left: 20px;
+    text-align: center;
+    font-size: 14px;
+    font-weight: 400;
+    color: #fff;
+    background: #ccc;
+    border-radius: 2px;
+  }
+  .el-pagination.is-background .el-pager li:not(.disabled).active {
+    background: linear-gradient(60deg, #5ebfff, #008fee);
+  }
+}
+</style>

+ 85 - 0
src/httpFile/index.js

@@ -0,0 +1,85 @@
+// 下载文件流, 传入参数为 接口 请求参数
+import axios from 'axios'
+import { Message, Loading } from 'element-ui';
+import { getToken } from '@/utils/auth';
+import store from '@/store';
+// 下载文件流, 传入参数为 接口 请求参数
+export function downloadFile (url, data = {}, type = 'xls', name) {
+  let loadingInstance = Loading.service({
+    lock: false,
+    customClass: 'z-index999',
+    text: '加载中,请稍后...',
+    spinner: 'ui-icon-loading',
+    background: 'rgba(0, 0, 0, 0.7)'
+  })
+  axios.defaults.baseURL = process.env.VUE_APP_API
+  return new Promise((resolve, reject) => {
+    const formData = new FormData()
+    if(data.field){
+      data.field=JSON.stringify(data.field)
+     }
+    Object.keys(data).forEach(key => {
+      if (data.hasOwnProperty(key)) {
+        formData.append(key, data[key])
+      }
+    })
+    let config = {
+      headers: {
+        'Content-Type': 'multipart/form-data'
+      },
+      responseType: 'blob'
+    }
+    if (store.getters.token) {
+      config.headers['token'] = getToken();
+    }
+    axios.post(url, formData, config).then(res => {
+      loadingInstance.close()
+      if (res) {
+        const content = res.data
+        const blob = new Blob([content])
+        // 如果返回格式为json, 即为报错, 抛出报错信息
+        if (content.type === 'application/json') {
+
+          var reader = new FileReader()
+          reader.readAsText(blob)
+          console.error("1",res);
+          reader.onload = e => {
+
+            const { jsonError } = JSON.parse(e.target.result)
+            var errormsg=JSON.parse(e.target.result);
+
+            // const error = new Error(`${jsonError[0]._exceptionMessage}`)
+            console.error("2",errormsg);
+
+            Message({
+              message: errormsg.msg,
+              type: 'error',
+              duration: 10 * 1000
+            })
+            throw error
+          }
+        } else {
+          // 如果不为json, 进入下载流程
+          // const fileName = `${res.name}.${type}`
+          const fileName = `${name}.${type}`
+          if ('download' in document.createElement('a')) {
+            // 非IE下载
+            const elink = document.createElement('a')
+            elink.download = fileName
+            elink.style.display = 'none'
+            elink.href = URL.createObjectURL(blob)
+            elink.click()
+            URL.revokeObjectURL(elink.href)
+          } else {
+            // IE下载
+            navigator.msSaveBlob(blob, fileName)
+          }
+          resolve(res)
+        }
+      }
+    }).catch(err => {
+      loadingInstance.close()
+      reject(err)
+    })
+  })
+}

+ 9 - 0
src/icons/index.js

@@ -0,0 +1,9 @@
+import Vue from 'vue';
+import SvgIcon from '@/components/SvgIcon'; // svg component
+
+// register globally
+Vue.component('svg-icon', SvgIcon);
+
+const req = require.context('./svg', false, /\.svg$/);
+const requireAll = requireContext => requireContext.keys().map(requireContext);
+requireAll(req);

文件差异内容过多而无法显示
+ 0 - 0
src/icons/svg/dashboard.svg


+ 1 - 0
src/icons/svg/example.svg

@@ -0,0 +1 @@
+<svg width="128" height="128" xmlns="http://www.w3.org/2000/svg"><path d="M96.258 57.462h31.421C124.794 27.323 100.426 2.956 70.287.07v31.422a32.856 32.856 0 0 1 25.971 25.97zm-38.796-25.97V.07C27.323 2.956 2.956 27.323.07 57.462h31.422a32.856 32.856 0 0 1 25.97-25.97zm12.825 64.766v31.421c30.46-2.885 54.507-27.253 57.713-57.712H96.579c-2.886 13.466-13.146 23.726-26.292 26.291zM31.492 70.287H.07c2.886 30.46 27.253 54.507 57.713 57.713V96.579c-13.466-2.886-23.726-13.146-26.291-26.292z"/></svg>

+ 1 - 0
src/icons/svg/eye-open.svg

@@ -0,0 +1 @@
+<svg class="icon" viewBox="0 0 1024 1024" xmlns="http://www.w3.org/2000/svg" width="128" height="128"><defs><style/></defs><path d="M512 128q69.675 0 135.51 21.163t115.498 54.997 93.483 74.837 73.685 82.006 51.67 74.837 32.17 54.827L1024 512q-2.347 4.992-6.315 13.483T998.87 560.17t-31.658 51.669-44.331 59.99-56.832 64.34-69.504 60.16-82.347 51.5-94.848 34.687T512 896q-69.675 0-135.51-21.163t-115.498-54.826-93.483-74.326-73.685-81.493-51.67-74.496-32.17-54.997L0 513.707q2.347-4.992 6.315-13.483t18.816-34.816 31.658-51.84 44.331-60.33 56.832-64.683 69.504-60.331 82.347-51.84 94.848-34.816T512 128.085zm0 85.333q-46.677 0-91.648 12.331t-81.152 31.83-70.656 47.146-59.648 54.485-48.853 57.686-37.675 52.821-26.325 43.99q12.33 21.674 26.325 43.52t37.675 52.351 48.853 57.003 59.648 53.845T339.2 767.02t81.152 31.488T512 810.667t91.648-12.331 81.152-31.659 70.656-46.848 59.648-54.186 48.853-57.344 37.675-52.651T927.957 512q-12.33-21.675-26.325-43.648t-37.675-52.65-48.853-57.345-59.648-54.186-70.656-46.848-81.152-31.659T512 213.334zm0 128q70.656 0 120.661 50.006T682.667 512 632.66 632.661 512 682.667 391.339 632.66 341.333 512t50.006-120.661T512 341.333zm0 85.334q-35.328 0-60.33 25.002T426.666 512t25.002 60.33T512 597.334t60.33-25.002T597.334 512t-25.002-60.33T512 426.666z"/></svg>

+ 1 - 0
src/icons/svg/eye.svg

@@ -0,0 +1 @@
+<svg width="128" height="64" xmlns="http://www.w3.org/2000/svg"><path d="M127.072 7.994c1.37-2.208.914-5.152-.914-6.87-2.056-1.717-4.797-1.226-6.396.982-.229.245-25.586 32.382-55.74 32.382-29.24 0-55.74-32.382-55.968-32.627-1.6-1.963-4.57-2.208-6.397-.49C-.17 3.086-.399 6.275 1.2 8.238c.457.736 5.94 7.36 14.62 14.72L4.17 35.96c-1.828 1.963-1.6 5.152.228 6.87.457.98 1.6 1.471 2.742 1.471s2.284-.49 3.198-1.472l12.564-13.983c5.94 4.416 13.021 8.587 20.788 11.53l-4.797 17.418c-.685 2.699.686 5.397 3.198 6.133h1.37c2.057 0 3.884-1.472 4.341-3.68L52.6 42.83c3.655.736 7.538 1.227 11.422 1.227 3.883 0 7.767-.49 11.422-1.227l4.797 17.173c.457 2.208 2.513 3.68 4.34 3.68.457 0 .914 0 1.143-.246 2.513-.736 3.883-3.434 3.198-6.133l-4.797-17.172c7.767-2.944 14.848-7.114 20.788-11.53l12.336 13.738c.913.981 2.056 1.472 3.198 1.472s2.284-.49 3.198-1.472c1.828-1.963 1.828-4.906.228-6.87l-11.65-13.001c9.366-7.36 14.849-14.474 14.849-14.474z"/></svg>

文件差异内容过多而无法显示
+ 0 - 0
src/icons/svg/form.svg


+ 1 - 0
src/icons/svg/link.svg

@@ -0,0 +1 @@
+<svg width="128" height="128" xmlns="http://www.w3.org/2000/svg"><path d="M115.625 127.937H.063V12.375h57.781v12.374H12.438v90.813h90.813V70.156h12.374z"/><path d="M116.426 2.821l8.753 8.753-56.734 56.734-8.753-8.745z"/><path d="M127.893 37.982h-12.375V12.375H88.706V0h39.187z"/></svg>

+ 1 - 0
src/icons/svg/nested.svg

@@ -0,0 +1 @@
+<svg width="128" height="128" xmlns="http://www.w3.org/2000/svg"><path d="M.002 9.2c0 5.044 3.58 9.133 7.998 9.133 4.417 0 7.997-4.089 7.997-9.133 0-5.043-3.58-9.132-7.997-9.132S.002 4.157.002 9.2zM31.997.066h95.981V18.33H31.997V.066zm0 45.669c0 5.044 3.58 9.132 7.998 9.132 4.417 0 7.997-4.088 7.997-9.132 0-3.263-1.524-6.278-3.998-7.91-2.475-1.63-5.524-1.63-7.998 0-2.475 1.632-4 4.647-4 7.91zM63.992 36.6h63.986v18.265H63.992V36.6zm-31.995 82.2c0 5.043 3.58 9.132 7.998 9.132 4.417 0 7.997-4.089 7.997-9.132 0-5.044-3.58-9.133-7.997-9.133s-7.998 4.089-7.998 9.133zm31.995-9.131h63.986v18.265H63.992V109.67zm0-27.404c0 5.044 3.58 9.133 7.998 9.133 4.417 0 7.997-4.089 7.997-9.133 0-3.263-1.524-6.277-3.998-7.909-2.475-1.631-5.524-1.631-7.998 0-2.475 1.632-4 4.646-4 7.91zm31.995-9.13h31.991V91.4H95.987V73.135z"/></svg>

+ 1 - 0
src/icons/svg/password.svg

@@ -0,0 +1 @@
+<svg width="128" height="128" xmlns="http://www.w3.org/2000/svg"><path d="M108.8 44.322H89.6v-5.36c0-9.04-3.308-24.163-25.6-24.163-23.145 0-25.6 16.881-25.6 24.162v5.361H19.2v-5.36C19.2 15.281 36.798 0 64 0c27.202 0 44.8 15.281 44.8 38.961v5.361zm-32 39.356c0-5.44-5.763-9.832-12.8-9.832-7.037 0-12.8 4.392-12.8 9.832 0 3.682 2.567 6.808 6.407 8.477v11.205c0 2.718 2.875 4.962 6.4 4.962 3.524 0 6.4-2.244 6.4-4.962V92.155c3.833-1.669 6.393-4.795 6.393-8.477zM128 64v49.201c0 8.158-8.645 14.799-19.2 14.799H19.2C8.651 128 0 121.359 0 113.201V64c0-8.153 8.645-14.799 19.2-14.799h89.6c10.555 0 19.2 6.646 19.2 14.799z"/></svg>

+ 1 - 0
src/icons/svg/table.svg

@@ -0,0 +1 @@
+<svg width="128" height="128" xmlns="http://www.w3.org/2000/svg"><path d="M.006.064h127.988v31.104H.006V.064zm0 38.016h38.396v41.472H.006V38.08zm0 48.384h38.396v41.472H.006V86.464zM44.802 38.08h38.396v41.472H44.802V38.08zm0 48.384h38.396v41.472H44.802V86.464zM89.598 38.08h38.396v41.472H89.598zm0 48.384h38.396v41.472H89.598z"/><path d="M.006.064h127.988v31.104H.006V.064zm0 38.016h38.396v41.472H.006V38.08zm0 48.384h38.396v41.472H.006V86.464zM44.802 38.08h38.396v41.472H44.802V38.08zm0 48.384h38.396v41.472H44.802V86.464zM89.598 38.08h38.396v41.472H89.598zm0 48.384h38.396v41.472H89.598z"/></svg>

+ 1 - 0
src/icons/svg/tree.svg

@@ -0,0 +1 @@
+<svg width="128" height="128" xmlns="http://www.w3.org/2000/svg"><path d="M126.713 90.023c.858.985 1.287 2.134 1.287 3.447v29.553c0 1.423-.429 2.6-1.287 3.53-.858.93-1.907 1.395-3.146 1.395H97.824c-1.145 0-2.146-.465-3.004-1.395-.858-.93-1.287-2.107-1.287-3.53V93.47c0-.875.19-1.696.572-2.462.382-.766.906-1.368 1.573-1.806a3.84 3.84 0 0 1 2.146-.657h9.725V69.007a3.84 3.84 0 0 0-.43-1.806 3.569 3.569 0 0 0-1.143-1.313 2.714 2.714 0 0 0-1.573-.492h-36.47v23.149h9.725c1.144 0 2.145.492 3.004 1.478.858.985 1.287 2.134 1.287 3.447v29.553c0 .876-.191 1.696-.573 2.463-.38.766-.905 1.368-1.573 1.806a3.84 3.84 0 0 1-2.145.656H51.915a3.84 3.84 0 0 1-2.145-.656c-.668-.438-1.216-1.04-1.645-1.806a4.96 4.96 0 0 1-.644-2.463V93.47c0-1.313.43-2.462 1.288-3.447.858-.986 1.907-1.478 3.146-1.478h9.582v-23.15h-37.9c-.953 0-1.74.356-2.359 1.068-.62.711-.93 1.56-.93 2.544v19.538h9.726c1.239 0 2.264.492 3.074 1.478.81.985 1.216 2.134 1.216 3.447v29.553c0 1.423-.405 2.6-1.216 3.53-.81.93-1.835 1.395-3.074 1.395H4.29c-.476 0-.93-.082-1.358-.246a4.1 4.1 0 0 1-1.144-.657 4.658 4.658 0 0 1-.93-1.067 5.186 5.186 0 0 1-.643-1.395 5.566 5.566 0 0 1-.215-1.56V93.47c0-.437.048-.875.143-1.313a3.95 3.95 0 0 1 .429-1.15c.19-.328.429-.656.715-.984.286-.329.572-.602.858-.821.286-.22.62-.383 1.001-.493.382-.11.763-.164 1.144-.164h9.726V61.619c0-.985.31-1.833.93-2.544.619-.712 1.358-1.068 2.216-1.068h44.335V39.62h-9.582c-1.24 0-2.288-.492-3.146-1.477a5.09 5.09 0 0 1-1.287-3.448V5.14c0-1.423.429-2.627 1.287-3.612.858-.985 1.907-1.477 3.146-1.477h25.743c.763 0 1.478.246 2.145.739a5.17 5.17 0 0 1 1.573 1.888c.382.766.573 1.587.573 2.462v29.553c0 1.313-.43 2.463-1.287 3.448-.859.985-1.86 1.477-3.004 1.477h-9.725v18.389h42.762c.954 0 1.74.355 2.36 1.067.62.711.93 1.56.93 2.545v26.925h9.582c1.239 0 2.288.492 3.146 1.478z"/></svg>

+ 1 - 0
src/icons/svg/user.svg

@@ -0,0 +1 @@
+<svg width="130" height="130" xmlns="http://www.w3.org/2000/svg"><path d="M63.444 64.996c20.633 0 37.359-14.308 37.359-31.953 0-17.649-16.726-31.952-37.359-31.952-20.631 0-37.36 14.303-37.358 31.952 0 17.645 16.727 31.953 37.359 31.953zM80.57 75.65H49.434c-26.652 0-48.26 18.477-48.26 41.27v2.664c0 9.316 21.608 9.325 48.26 9.325H80.57c26.649 0 48.256-.344 48.256-9.325v-2.663c0-22.794-21.605-41.271-48.256-41.271z" stroke="#979797"/></svg>

+ 22 - 0
src/icons/svgo.yml

@@ -0,0 +1,22 @@
+# replace default config
+
+# multipass: true
+# full: true
+
+plugins:
+
+  # - name
+  #
+  # or:
+  # - name: false
+  # - name: true
+  #
+  # or:
+  # - name:
+  #     param1: 1
+  #     param2: 2
+
+- removeAttrs:
+    attrs:
+      - 'fill'
+      - 'fill-rule'

+ 47 - 0
src/layout/components/AppMain.vue

@@ -0,0 +1,47 @@
+<template>
+  <section class="app-main">
+      <keep-alive>
+          <router-view v-if="$route.meta.keepAlive" :key="key"/>
+      </keep-alive>
+      <router-view v-if="!$route.meta.keepAlive" :key="key"></router-view>
+  </section>
+</template>
+
+<script>
+export default {
+  name: 'AppMain',
+  // data() {
+  //   return {
+  //   pages:["Dashboard"]
+  //   }
+  // },
+  computed: {
+    key() {
+      return this.$route.path;
+    },
+  },
+};
+</script>
+
+<style scoped>
+.app-main {
+  /*50 = navbar  */
+  min-height: calc(100vh - 50px);
+  width: 100%;
+  position: relative;
+  /* overflow: hidden; */
+  background: #f4f4f4;
+}
+.fixed-header + .app-main {
+  padding-top: 50px;
+}
+</style>
+
+<style lang="scss">
+// fix css style bug in open el-dialog
+.el-popup-parent--hidden {
+  .fixed-header {
+    padding-right: 15px;
+  }
+}
+</style>

+ 142 - 0
src/layout/components/Navbar.vue

@@ -0,0 +1,142 @@
+<template>
+  <div class="navbar">
+    <hamburger :is-active="sidebar.opened" class="hamburger-container" @toggleClick="toggleSideBar" />
+
+    <breadcrumb class="breadcrumb-container" />
+
+    <div class="right-menu">
+      <el-dropdown class="avatar-container" trigger="click">
+        <div class="avatar-wrapper">
+          <!-- <img :src="avatar + '?imageView2/1/w/80/h/80'" class="user-avatar" /> -->
+          <el-button type="primary" icon="el-icon-setting">设置</el-button>
+          <i class="el-icon-caret-bottom" />
+        </div>
+        <el-dropdown-menu slot="dropdown" class="user-dropdown">
+          <router-link to="/">
+            <el-dropdown-item>Home</el-dropdown-item>
+          </router-link>
+          <!-- <a target="_blank" href="https://github.com/PanJiaChen/vue-admin-template/">
+            <el-dropdown-item>Github</el-dropdown-item>
+          </a>
+          <a target="_blank" href="https://panjiachen.github.io/vue-element-admin-site/#/">
+            <el-dropdown-item>Docs</el-dropdown-item>
+          </a> -->
+          <el-dropdown-item divided @click.native="logout">
+            <span style="display: block">退出登陆</span>
+          </el-dropdown-item>
+        </el-dropdown-menu>
+      </el-dropdown>
+    </div>
+  </div>
+</template>
+
+<script>
+import { getToken, setToken, removeToken } from '@/utils/auth';
+import { mapGetters } from 'vuex';
+import Breadcrumb from '@/components/Breadcrumb';
+import Hamburger from '@/components/Hamburger';
+
+export default {
+  components: {
+    Breadcrumb,
+    Hamburger,
+  },
+  computed: {
+    ...mapGetters(['sidebar', 'avatar']),
+  },
+  methods: {
+    toggleSideBar() {
+      this.$store.dispatch('app/toggleSideBar');
+    },
+    logout() {
+    //  this.$store.dispatch('user/logout');
+    // debugger
+    setToken('');
+    // 清除缓存的权限菜单
+    sessionStorage.removeItem("route")
+    this.$router.push(`/login?redirect=${this.$route.fullPath}`);
+    },
+  },
+};
+</script>
+
+<style lang="scss" scoped>
+.navbar {
+  // width: 1200px;
+  height: 50px;
+  overflow: hidden;
+  position: relative;
+  background: #fff;
+  box-shadow: 0 1px 4px rgba(0, 21, 41, 0.08);
+
+  .hamburger-container {
+    line-height: 46px;
+    height: 100%;
+    float: left;
+    cursor: pointer;
+    transition: background 0.3s;
+    -webkit-tap-highlight-color: transparent;
+
+    &:hover {
+      background: rgba(0, 0, 0, 0.025);
+    }
+  }
+
+  .breadcrumb-container {
+    float: left;
+  }
+
+  .right-menu {
+    float: right;
+    height: 100%;
+    line-height: 50px;
+
+    &:focus {
+      outline: none;
+    }
+
+    .right-menu-item {
+      display: inline-block;
+      padding: 0 8px;
+      height: 100%;
+      font-size: 18px;
+      color: #5a5e66;
+      vertical-align: text-bottom;
+
+      &.hover-effect {
+        cursor: pointer;
+        transition: background 0.3s;
+
+        &:hover {
+          background: rgba(0, 0, 0, 0.025);
+        }
+      }
+    }
+
+    .avatar-container {
+      margin-right: 30px;
+
+      .avatar-wrapper {
+        margin-top: 5px;
+        position: relative;
+
+        .user-avatar {
+          cursor: pointer;
+          width: 40px;
+          height: 40px;
+          border-radius: 10px;
+          background: red;
+        }
+
+        .el-icon-caret-bottom {
+          cursor: pointer;
+          position: absolute;
+          right: -20px;
+          top: 25px;
+          font-size: 12px;
+        }
+      }
+    }
+  }
+}
+</style>

+ 26 - 0
src/layout/components/Sidebar/FixiOSBug.js

@@ -0,0 +1,26 @@
+export default {
+  computed: {
+    device() {
+      return this.$store.state.app.device;
+    },
+  },
+  mounted() {
+    // In order to fix the click on menu on the ios device will trigger the mouseleave bug
+    // https://github.com/PanJiaChen/vue-element-admin/issues/1135
+    this.fixBugIniOS();
+  },
+  methods: {
+    fixBugIniOS() {
+      const $subMenu = this.$refs.subMenu;
+      if ($subMenu) {
+        const handleMouseleave = $subMenu.handleMouseleave;
+        $subMenu.handleMouseleave = e => {
+          if (this.device === 'mobile') {
+            return;
+          }
+          handleMouseleave(e);
+        };
+      }
+    },
+  },
+};

+ 41 - 0
src/layout/components/Sidebar/Item.vue

@@ -0,0 +1,41 @@
+<script>
+export default {
+  name: 'MenuItem',
+  functional: true,
+  props: {
+    icon: {
+      type: String,
+      default: '',
+    },
+    title: {
+      type: String,
+      default: '',
+    },
+  },
+  render(h, context) {
+    const { icon, title } = context.props;
+    const vnodes = [];
+
+    if (icon) {
+      if (icon.includes('el-icon')) {
+        vnodes.push(<i class={[icon, 'sub-el-icon']} />);
+      } else {
+        vnodes.push(<svg-icon icon-class={icon} />);
+      }
+    }
+
+    if (title) {
+      vnodes.push(<span slot="title">{title}</span>);
+    }
+    return vnodes;
+  },
+};
+</script>
+
+<style scoped>
+.sub-el-icon {
+  color: currentColor;
+  width: 1em;
+  height: 1em;
+}
+</style>

+ 43 - 0
src/layout/components/Sidebar/Link.vue

@@ -0,0 +1,43 @@
+<template>
+  <component :is="type" v-bind="linkProps(to)">
+    <slot />
+  </component>
+</template>
+
+<script>
+import { isExternal } from '@/utils/validate';
+
+export default {
+  props: {
+    to: {
+      type: String,
+      required: true,
+    },
+  },
+  computed: {
+    isExternal() {
+      return isExternal(this.to);
+    },
+    type() {
+      if (this.isExternal) {
+        return 'a';
+      }
+      return 'router-link';
+    },
+  },
+  methods: {
+    linkProps(to) {
+      if (this.isExternal) {
+        return {
+          href: to,
+          target: '_blank',
+          rel: 'noopener',
+        };
+      }
+      return {
+        to: to,
+      };
+    },
+  },
+};
+</script>

+ 82 - 0
src/layout/components/Sidebar/Logo.vue

@@ -0,0 +1,82 @@
+<template>
+  <div class="sidebar-logo-container" :class="{ collapse: collapse }">
+    <transition name="sidebarLogoFade">
+      <router-link v-if="collapse" key="collapse" class="sidebar-logo-link" to="/">
+        <img v-if="logo" :src="logo" class="sidebar-logo" />
+        <h1 v-else class="sidebar-title">{{ title }}</h1>
+      </router-link>
+      <router-link v-else key="expand" class="sidebar-logo-link" to="/">
+        <img v-if="logo" :src="logo" class="sidebar-logo" />
+        <h1 class="sidebar-title">{{ title }}</h1>
+      </router-link>
+    </transition>
+  </div>
+</template>
+
+<script>
+export default {
+  name: 'SidebarLogo',
+  props: {
+    collapse: {
+      type: Boolean,
+      required: true,
+    },
+  },
+  data() {
+    return {
+      title: 'Vue Admin Template',
+      logo: 'https://wpimg.wallstcn.com/69a1c46c-eb1c-4b46-8bd4-e9e686ef5251.png',
+    };
+  },
+};
+</script>
+
+<style lang="scss" scoped>
+.sidebarLogoFade-enter-active {
+  transition: opacity 1.5s;
+}
+
+.sidebarLogoFade-enter,
+.sidebarLogoFade-leave-to {
+  opacity: 0;
+}
+
+.sidebar-logo-container {
+  position: relative;
+  width: 100%;
+  height: 50px;
+  line-height: 50px;
+  background: #2b2f3a;
+  text-align: center;
+  overflow: hidden;
+
+  & .sidebar-logo-link {
+    height: 100%;
+    width: 100%;
+
+    & .sidebar-logo {
+      width: 32px;
+      height: 32px;
+      vertical-align: middle;
+      margin-right: 12px;
+    }
+
+    & .sidebar-title {
+      display: inline-block;
+      margin: 0;
+      color: #fff;
+      font-weight: 600;
+      line-height: 50px;
+      font-size: 14px;
+      font-family: Avenir, Helvetica Neue, Arial, Helvetica, sans-serif;
+      vertical-align: middle;
+    }
+  }
+
+  &.collapse {
+    .sidebar-logo {
+      margin-right: 0px;
+    }
+  }
+}
+</style>

+ 107 - 0
src/layout/components/Sidebar/SidebarItem.vue

@@ -0,0 +1,107 @@
+<template>
+  <div v-if="!item.hidden">
+    <template v-if="hasOneShowingChild(item.children, item) && (!onlyOneChild.children || onlyOneChild.noShowingChildren) && !item.alwaysShow">
+      <app-link v-if="onlyOneChild.meta" :to="resolvePath(onlyOneChild.path)">
+        <el-menu-item :index="resolvePath(onlyOneChild.path)" :class="{ 'submenu-title-noDropdown': !isNest }">
+          <item :icon="onlyOneChild.meta.icon || (item.meta && item.meta.icon)" :title="onlyOneChild.meta.title" />
+        </el-menu-item>
+      </app-link>
+    </template>
+
+    <el-submenu v-else ref="subMenu" :index="resolvePath(item.path)" popper-append-to-body>
+      <template slot="title">
+        <item v-if="item.meta" :icon="item.meta && item.meta.icon" :title="item.meta.title" />
+      </template>
+      <sidebar-item v-for="child in item.children" :key="child.path" :is-nest="true" :item="child" :base-path="resolvePath(child.path)" class="nest-menu" />
+    </el-submenu>
+  </div>
+</template>
+
+<script>
+import path from 'path';
+import { isExternal } from '@/utils/validate';
+import Item from './Item';
+import AppLink from './Link';
+import FixiOSBug from './FixiOSBug';
+
+export default {
+  name: 'SidebarItem',
+  components: { Item, AppLink },
+  mixins: [FixiOSBug],
+  props: {
+    // route object
+    item: {
+      // type: Object,  // 添加动态路由 需要注释掉,不然会报错
+      required: true,
+    },
+    isNest: {
+      type: Boolean,
+      default: false,
+    },
+    basePath: {
+      type: String,
+      default: '',
+    },
+  },
+  data() {
+    // To fix https://github.com/PanJiaChen/vue-admin-template/issues/237
+    // TODO: refactor with render function
+    this.onlyOneChild = null;
+    return {};
+  },
+  methods: {
+    hasOneShowingChild(children = [], parent) {
+      const showingChildren = children.filter(item => {
+        // console.log(item.path)
+        if (item.path == '/courseOfDisease' ||
+            item.path == '/dischargerecord' ||
+            item.path == '/hospitalized' ||
+            item.path == '/operation' ||
+            item.path == '/groupConsultation' ||
+            item.path == '/ultrasonic' ||
+            item.path == '/image' ||
+            item.path == '/electrocardiogram' ||
+            item.path == '/inspectionReport' ||
+            item.path == '/medicalAdvice' ||
+            item.path == '/medicalTemporary' ||
+            item.path == '/imgsText'
+            ) {
+          console.log('_______');
+          return false;
+        }
+        if (item.hidden) {
+          return false;
+        } else {
+          // Temp set(will be used if only has one showing child)
+          this.onlyOneChild = item;
+          return true;
+        }
+      });
+
+      // When there is only one child router, the child router is displayed by default
+      if (showingChildren.length === 1) {
+        return true;
+      }
+
+      // Show parent if there are no child router to display
+      if (showingChildren.length === 0) {
+        this.onlyOneChild = { ...parent, path: '', noShowingChildren: true };
+        return true;
+      }
+
+      return false;
+    },
+    resolvePath(routePath) {
+      if (isExternal(routePath)) {
+        return routePath;
+      }
+      if (isExternal(this.basePath)) {
+        return this.basePath;
+      }
+      return path.resolve(this.basePath, routePath);
+    },
+  },
+};
+</script>
+<style scoped>
+</style>

+ 64 - 0
src/layout/components/Sidebar/index.vue

@@ -0,0 +1,64 @@
+<template>
+  <div :class="{ 'has-logo': showLogo }">
+    <logo v-if="showLogo" :collapse="isCollapse" />
+    <el-scrollbar wrap-class="scrollbar-wrapper">
+      <el-menu
+        :default-active="activeMenu"
+        :collapse="isCollapse"
+        background-color="#185da6"
+        :text-color="variables.menuText"
+        :unique-opened="false"
+        :active-text-color="variables.menuActiveText"
+        :collapse-transition="false"
+        mode="vertical"
+        router
+      >
+        <sidebar-item v-for="route in routes" :key="route.path" :item="route" :base-path="route.path" />
+        <el-menu-item index="/searchSystem">
+          <i class="el-icon-search"></i>
+          <span slot="title">医院大数据自助查询</span>
+        </el-menu-item>
+      </el-menu>
+    </el-scrollbar>
+  </div>
+</template>
+
+<script>
+import { mapGetters } from 'vuex';
+import Logo from './Logo';
+import SidebarItem from './SidebarItem';
+import variables from '@/styles/variables.scss';
+
+export default {
+  components: { SidebarItem, Logo },
+  computed: {
+    ...mapGetters(['sidebar']),
+    routes() {
+      //修改的代码
+      let menuRouter = this.$store.state.user.menu,
+      routeMenu = [...this.$router.options.routes,...menuRouter]
+      return routeMenu
+      //源码中的代码
+      // return this.$router.options.routes;
+    },
+    activeMenu() {
+      const route = this.$route;
+      const { meta, path } = route;
+      // if set path, the sidebar will highlight the path you set
+      if (meta.activeMenu) {
+        return meta.activeMenu;
+      }
+      return path;
+    },
+    showLogo() {
+      return this.$store.state.settings.sidebarLogo;
+    },
+    variables() {
+      return variables;
+    },
+    isCollapse() {
+      return !this.sidebar.opened;
+    },
+  },
+};
+</script>

+ 3 - 0
src/layout/components/index.js

@@ -0,0 +1,3 @@
+export { default as Navbar } from './Navbar';
+export { default as Sidebar } from './Sidebar';
+export { default as AppMain } from './AppMain';

+ 93 - 0
src/layout/index.vue

@@ -0,0 +1,93 @@
+<template>
+  <div :class="classObj" class="app-wrapper">
+    <div v-if="device === 'mobile' && sidebar.opened" class="drawer-bg" @click="handleClickOutside" />
+    <sidebar class="sidebar-container" />
+    <div class="main-container">
+      <div :class="{ 'fixed-header': fixedHeader }">
+        <navbar />
+      </div>
+      <app-main />
+    </div>
+  </div>
+</template>
+
+<script>
+import { Navbar, Sidebar, AppMain } from './components';
+import ResizeMixin from './mixin/ResizeHandler';
+
+export default {
+  name: 'Layout',
+  components: {
+    Navbar,
+    Sidebar,
+    AppMain,
+  },
+  mixins: [ResizeMixin],
+  computed: {
+    sidebar() {
+      return this.$store.state.app.sidebar;
+    },
+    device() {
+      return this.$store.state.app.device;
+    },
+    fixedHeader() {
+      return this.$store.state.settings.fixedHeader;
+    },
+    classObj() {
+      return {
+        hideSidebar: !this.sidebar.opened,
+        openSidebar: this.sidebar.opened,
+        withoutAnimation: this.sidebar.withoutAnimation,
+        mobile: this.device === 'mobile',
+      };
+    },
+  },
+  methods: {
+    handleClickOutside() {
+      this.$store.dispatch('app/closeSideBar', { withoutAnimation: false });
+    },
+  },
+};
+</script>
+
+<style lang="scss" scoped>
+@import '~@/styles/mixin.scss';
+@import '~@/styles/variables.scss';
+
+.app-wrapper {
+  @include clearfix;
+  position: relative;
+  height: 100%;
+  width: 100%;
+  &.mobile.openSidebar {
+    position: fixed;
+    top: 0;
+  }
+}
+.drawer-bg {
+  // background: #000;
+  opacity: 0.3;
+  width: 100%;
+  top: 0;
+  height: 100%;
+  position: absolute;
+  z-index: 999;
+}
+
+.fixed-header {
+  position: fixed;
+  top: 0;
+  right: 0;
+  z-index: 9;
+  width: calc(100% - #{$sideBarWidth});
+  transition: width 0.28s;
+}
+
+.hideSidebar .fixed-header {
+  width: calc(100% - 54px);
+}
+
+.mobile .fixed-header {
+  width: 100%;
+}
+</style>

+ 45 - 0
src/layout/mixin/ResizeHandler.js

@@ -0,0 +1,45 @@
+import store from '@/store';
+
+const { body } = document;
+const WIDTH = 992; // refer to Bootstrap's responsive design
+
+export default {
+  watch: {
+    $route() {
+      if (this.device === 'mobile' && this.sidebar.opened) {
+        store.dispatch('app/closeSideBar', { withoutAnimation: false });
+      }
+    },
+  },
+  beforeMount() {
+    window.addEventListener('resize', this.$_resizeHandler);
+  },
+  beforeDestroy() {
+    window.removeEventListener('resize', this.$_resizeHandler);
+  },
+  mounted() {
+    const isMobile = this.$_isMobile();
+    if (isMobile) {
+      store.dispatch('app/toggleDevice', 'mobile');
+      store.dispatch('app/closeSideBar', { withoutAnimation: true });
+    }
+  },
+  methods: {
+    // use $_ for mixins properties
+    // https://vuejs.org/v2/style-guide/index.html#Private-property-names-essential
+    $_isMobile() {
+      const rect = body.getBoundingClientRect();
+      return rect.width - 1 < WIDTH;
+    },
+    $_resizeHandler() {
+      if (!document.hidden) {
+        const isMobile = this.$_isMobile();
+        store.dispatch('app/toggleDevice', isMobile ? 'mobile' : 'desktop');
+
+        if (isMobile) {
+          store.dispatch('app/closeSideBar', { withoutAnimation: true });
+        }
+      }
+    },
+  },
+};

+ 49 - 0
src/main.js

@@ -0,0 +1,49 @@
+import Vue from 'vue';
+
+import 'normalize.css/normalize.css'; // A modern alternative to CSS resets
+
+import ElementUI from 'element-ui';
+import 'element-ui/lib/theme-chalk/index.css';
+import locale from 'element-ui/lib/locale/lang/zh-CN';
+import '@/styles/index.scss'; // global css
+
+import App from './App';
+import store from './store';
+import router from './router';
+import '@/icons'; // icon
+import '@/permission'; // permission control
+// baseUrl = '/api
+import axios from '@/axios/index';
+// baseUrl = '/bazb
+import axios2 from '@/axios/index2';
+// baseUrl = '/bass
+import axios3 from '@/axios/index3';
+import '@/mixins';
+/**
+ * If you don't want to use mock-server
+ * you want to use MockJs for mock api
+ * you can execute: mockXHR()
+ *
+ * Currently MockJs will be used in the production environment,
+ * please remove it before going online ! ! !
+ */
+if (process.env.NODE_ENV === 'production') {
+  const { mockXHR } = require('../mock');
+  mockXHR();
+}
+Vue.prototype.$axios = axios;
+Vue.prototype.$axios2 = axios2;
+Vue.prototype.$axios3 = axios3;
+// set ElementUI lang to EN
+Vue.use(ElementUI, { locale });
+// 如果想要中文版 element-ui,按如下方式声明
+// Vue.use(ElementUI)
+
+Vue.config.productionTip = false;
+
+new Vue({
+  el: '#app',
+  router,
+  store,
+  render: h => h(App),
+});

+ 92 - 0
src/menu/menu.js

@@ -0,0 +1,92 @@
+import Layout from '@/layout'//引入admin的layout布局
+import router from '../router'//引入router
+import request from '../api/request.js'//自定义封装的请求
+import store from '../store'//Vuex
+
+export default {
+  // 获取路由菜单
+  getMenu() {
+    return new Promise((resolve, reject) => {
+      return request.getRoleMenu().then(res => {
+      	//声明一个空数组,用来装处理好的菜单信息
+        const result = []
+        // 获取到路由菜单,进行数据处理
+        this.parseRoute(res.data,result)
+        // 添加菜单
+        this.addMenu(result)
+        //缓存用户菜单,我这里使用的是sessionStorage,用localStorage也可以
+        sessionStorage.setItem("route", JSON.stringify(res.data))
+        // 输出成功
+        resolve()
+      }).catch(err =>{
+        reject()
+      })
+    })
+  },
+  // 对路由菜单数据处理
+  parseRoute(fullList, resultList) {
+    return new Promise((resolve, reject) => {
+      let result = []
+      fullList.forEach( (ele,index) => {
+        let routerObject = null
+        const childrenList = []
+        routerObject = {
+          path: ele['path'],
+          component: Layout,
+          redirect: ele['redirect']?ele['redirect']:'noRedirect',
+          alwaysShow: ele['alwaysShow'],  // 是否始终为根元素
+          meta: {
+            title: ele.meta['title'],
+            icon: ele.meta['icon']
+          },
+          children: childrenList,
+        }
+        const itemResult = ele.children;
+        for (let j = 0; j < itemResult.length; j++) {
+          childrenList.push({
+            path: itemResult[j]['path'],
+            name: itemResult[j]['name'],
+            hidden: itemResult[j]['hidden'],
+            component: resolve => require([`@/views/${itemResult[j].component}`], resolve),
+            meta: {
+              title: itemResult[j].meta['title'],
+              icon: itemResult[j].meta['icon'],
+              keepAlive: itemResult[j].meta['keepAlive'] == 0 ? false : true,
+            },
+            
+          })
+
+        }
+        //插入组装好的数据
+        resultList.push(routerObject);
+        //插入最终完整的数据列表
+        result.push(routerObject);
+      });
+      //输出已经组装好并且能用的数据
+      resolve(result)
+    })
+  },
+  // 添加菜单
+  addMenu(data) {
+    return new Promise((resolve, reject) => {
+      // 在处理完的菜单列表数据后面插入404页面,404必须存在菜单列表的最后一项,否则会对所有页面进行拦截,并跳转404页面
+      data.push({
+        path: '*',
+        redirect: '/404',
+        hidden: true
+      })
+      // 打印菜单列表
+      // console.log(data)
+      // 将可用的路由权限列表存入Vuex
+      store.dispatch('user/modifyMenu', data)
+      // 添加菜单
+      router.addRoutes(data)
+      // 将路由元注入路由对象,必须添加
+      router.options.routes.push(data)
+      // console.log(data)
+      //输出成功
+      resolve()
+    })
+  },
+  //
+}

+ 151 - 0
src/mixins/index.js

@@ -0,0 +1,151 @@
+import Vue from 'vue';
+
+Vue.mixin({
+  methods: {
+    // 金额
+    Money(value) {
+      return value.toFixed(2);
+    },
+    // 起购金额判断
+    getMeyer(Max, Nin, amount) {
+      if (Number(amount) >= Number(Max)) {
+        // 大于剩余本金
+        return 'F';
+      }
+      if (Number(amount) <= Number(Nin)) {
+        // 小于起购金额
+        return 'T';
+      }
+    },
+    // 新对象用旧对象相同属性赋值
+    getNewObj(newObj, oldObj) {
+      let oldObjCopy = { ...oldObj };
+      let newObjCopy = { ...newObj };
+      Object.keys(newObjCopy).forEach(key => {
+        newObjCopy[key] = oldObjCopy[key] || '';
+      });
+      return newObjCopy;
+    },
+    // 返回时间
+    getNumTime(data) {
+      return new Date(data).toJSON().slice(0, 10);
+    },
+
+    gotimeNumber(val, val2) {
+      if (new Date(val).getTime() > new Date(val2).getTime()) {
+        return true;
+      } else {
+        return false;
+      }
+    },
+
+    bankcard(value) {
+      // let a=[\u4E00-\u9FA5]
+      if (!value) return '';
+      if (value[0] == '零') {
+        return value;
+      }
+      var data = value.substring(0, 4) + ' ****** ' + value.substring(value.length - 4);
+      return data;
+    },
+    goTime(val) {
+      return val.slice(0, 4) + '-' + val.slice(4, 6) + '-' + val.slice(6, 8);
+    },
+    // 日期时间
+    goDateTime(val) {
+      return val.slice(0, 4) + '-' + val.slice(4, 6) + '-' + val.slice(6, 8) + ' ' + val.slice(8, 10) + ':' + val.slice(10, 12) + ':' + val.slice(12, 14);
+    },
+    getTimefilter(val) {
+      return val.slice(0, 4) + '-' + val.slice(4, 6);
+    },
+    amountFile(val) {
+      console.log(val);
+      let numval = Number(val);
+      return String(numval.toFixed(2));
+    },
+    goTimeTwe(val) {
+      return val.slice(0, 4) + val.slice(5, 7) + val.slice(8, 10);
+    },
+    goto(id) {
+      this.$router.push(id);
+    },
+    storageSet(key, value) {
+      sessionStorage.setItem(key, JSON.stringify(value));
+    },
+    // 取出
+    storageGet(key) {
+      return JSON.parse(sessionStorage.getItem(key));
+    },
+    // 删除
+    storageRemove(key) {
+      sessionStorage.removeItem(key);
+    },
+    // 返回上个路由
+    goBack() {
+      // this.$router.back()
+      this.$router.go(-1);
+    },
+    // 跳转并删除当前页面
+    goreplace(id) {
+      this.$router.replace(id);
+      // this.$router.replace(id)
+    },
+    goBackward(val) {
+      this.$router.go(val);
+    },
+    //   // 相当于定义全局方法
+    //   $field: function (key) {
+    //     return $locale.FIELDS[key]
+    //   },
+    //   $msg: function (key) {
+    //     return $locale.MESSAGES[key]
+    //   },
+    // 重新获得验证码图片
+    switchCode(verifyid) {
+      document.getElementById(verifyid).setAttribute('src', 'eweb-common.GenTokenImg.do?timestrap=' + Date.now());
+    },
+    // 起止时间计算
+    timesCalculation(time) {
+      // 获取当前时间对象, 作为截止时间
+      const endDateObj = new Date();
+      // 将时间戳转换为年月日
+      const endYear = endDateObj.getFullYear();
+      var endMonth = endDateObj.getMonth() + 1;
+      if (endMonth < 10) {
+        endMonth = '0' + endMonth;
+      }
+      var endDay = endDateObj.getDate();
+      if (endDay < 10) {
+        endDay = '0' + endDay;
+      }
+      const endDate = endYear.toString() + endMonth.toString() + endDay.toString();
+      const endDate2 = endYear.toString() + '-' + endMonth.toString() + '-' + endDay.toString();
+      // 获取传入的天数, 转换为时间戳
+      const timeStamp = Number(time) * 24 * 60 * 60 * 1000;
+      // 获取结束时间戳
+      const endStamp = endDateObj.getTime();
+      // 计算出起始日期时间戳
+      const startStamp = endStamp - timeStamp;
+      // 将起始时间戳转化为时间对象
+      const startDateObj = new Date(startStamp);
+      // 将时间戳转换为年月日
+      const startYear = startDateObj.getFullYear();
+      var startMonth = startDateObj.getMonth() + 1;
+      if (startMonth < 10) {
+        startMonth = '0' + startMonth;
+      }
+      var startDay = startDateObj.getDate();
+      if (startDay < 10) {
+        startDay = '0' + startDay;
+      }
+      const startDate = startYear.toString() + startMonth.toString() + startDay.toString();
+      const startDate2 = startYear.toString() + '-' + startMonth.toString() + '-' + startDay.toString();
+      // 返回起始时间和结束时间, 格式为yyyy-mm-dd
+      if (Number(time) === 1) {
+        return [endDate, endDate, endDate2, endDate2];
+      } else {
+        return [startDate, endDate, startDate2, endDate2];
+      }
+    },
+  },
+});

+ 64 - 0
src/permission.js

@@ -0,0 +1,64 @@
+import router from './router';
+import store from './store';
+import { Message } from 'element-ui';
+import NProgress from 'nprogress'; // progress bar
+import 'nprogress/nprogress.css'; // progress bar style
+import { getToken } from '@/utils/auth'; // get token from cookie
+import getPageTitle from '@/utils/get-page-title';
+
+NProgress.configure({ showSpinner: false }); // NProgress Configuration
+
+const whiteList = ['/login']; // no redirect whitelist
+
+router.beforeEach(async (to, from, next) => {
+  // start progress bar
+  NProgress.start();
+
+  // set page title
+  document.title = getPageTitle(to.meta.title);
+
+  // determine whether the user has logged in
+  const hasToken = getToken();
+
+  if (hasToken) {
+    if (to.path === '/login') {
+      // if is logged in, redirect to the home page
+      next({ path: '/' });
+      NProgress.done();
+    } else {
+      const hasGetUserInfo = store.getters.name;
+      if (hasGetUserInfo) {
+        next();
+      } else {
+        try {
+          // get user info
+          // await store.dispatch('user/getInfo');
+
+          next();
+        } catch (error) {
+          // remove token and go to login page to re-login
+          // await store.dispatch('user/resetToken');
+          Message.error(error || 'Has Error');
+          next(`/login?redirect=${to.path}`);
+          NProgress.done();
+        }
+      }
+    }
+  } else {
+    /* has no token*/
+
+    if (whiteList.indexOf(to.path) !== -1) {
+      // in the free login whitelist, go directly
+      next();
+    } else {
+      // other pages that do not have permission to access are redirected to the login page.
+      next(`/login?redirect=${to.path}`);
+      NProgress.done();
+    }
+  }
+});
+
+router.afterEach(() => {
+  // finish progress bar
+  NProgress.done();
+});

+ 266 - 0
src/router/index.js

@@ -0,0 +1,266 @@
+import Vue from 'vue';
+import Router from 'vue-router';
+import store from '../store'
+import menu from '../menu/menu.js'
+import { getToken } from '@/utils/auth'; // get token from cookie
+Vue.use(Router);
+
+/* Layout */
+import Layout from '@/layout';
+
+/**
+ * Note: sub-menu only appear when route children.length >= 1
+ * Detail see: https://panjiachen.github.io/vue-element-admin-site/guide/essentials/router-and-nav.html
+ *
+ * hidden: true                   if set true, item will not show in the sidebar(default is false)
+ * alwaysShow: true               if set true, will always show the root menu
+ *                                if not set alwaysShow, when item has more than one children route,
+ *                                it will becomes nested mode, otherwise not show the root menu
+ * redirect: noRedirect           if set noRedirect will no redirect in the breadcrumb
+ * name:'router-name'             the name is used by <keep-alive> (must set!!!)
+ * meta : {
+    roles: ['admin','editor']    control the page roles (you can set multiple roles)
+    title: 'title'               the name show in sidebar and breadcrumb (recommend set)
+    icon: 'svg-name'/'el-icon-x' the icon show in the sidebar
+    breadcrumb: false            if set false, the item will hidden in breadcrumb(default is true)
+    activeMenu: '/example/list'  if set path, the sidebar will highlight the path you set
+  }
+ */
+
+/**
+ * constantRoutes
+ * a base page that does not have permission requirements
+ * all roles can be accessed
+ */
+export const constantRoutes = [
+  {
+    path: '/login',
+    component: () => import('@/views/login/index'),
+    hidden: true,
+  },
+
+  {
+    path: '/404',
+    component: () => import('@/views/404'),
+    hidden: true,
+  },
+  {
+    path: '/',
+    component: Layout,
+    redirect: '/dashboard',
+    children: [
+      {
+        path: 'dashboard',
+        name: 'Dashboard',
+        component: () => import('@/views/dashboard/index'),
+        meta: { title: '首页', icon: 'dashboard' },
+      },
+      //全病历质控
+      {
+        path: '/caseNumber',
+        name: 'caseNumber',
+        component: () => import('@/views/allcase/caseNumber'),
+        hidden: true, //不在导航栏展示
+        meta: { title: '病案数量' },
+      },
+      {
+        path: '/defectNumber',
+        name: 'defectNumber',
+        component: () => import('@/views/allcase/defectNumber'),
+        hidden: true,//不在导航栏展示
+        meta: { title: '缺陷病案'},
+      },
+      {
+        path: '/homePage',
+        name: 'homePage',
+        component: () => import('@/views/allcase/homePage'),
+        hidden: true,//不在导航栏展示
+        meta: { title: '出院记录'},
+      },
+      {
+        path: '/caseViews',
+        name: 'caseViews',
+        component: () => import('@/views/allcase/caseViews'),
+        hidden: true,//不在导航栏展示
+        meta: { title: '出院记录'},
+      },
+      //首页数据质控
+      {
+        path: '/defectList',
+        name: 'defectList',
+        component: () => import('@/views/data/medicalRecords/defectList'),
+        hidden: true,//不在导航栏展示
+        meta: { title: '质量分析缺陷病案', keepAlive:true }
+      },
+      {
+        path: '/medicalRecords',
+        name: 'medicalRecords',
+        component: () => import('@/views/data/medicalRecords'),
+        hidden: true, //不在导航栏展示
+        meta: { title: '质量分析病案数量',keepAlive:true }
+      },
+      {
+        path: '/errorList',
+        name: 'errorList',
+        component: () => import('@/views/data/medicalRecords/errorList'),
+        hidden: true, //不在导航栏展示
+        meta: { title: '病案数' }
+      },
+      {
+        path: '/department',
+        name: 'department',
+        component: () => import('@/views/data/medicalRecords/department'),
+        hidden: true, //不在导航栏展示
+        meta: { title: '总缺陷'}
+      },
+      {
+        path: '/TotalRankingList',
+        name: 'TotalRankingList',
+        component: () => import('@/views/data/frontHome/TotalRankingList'),
+        hidden: true, //不在导航栏展示
+        meta: { title: '总排名' },
+      },
+      {
+        path: '/codeList',
+        name: 'codeList',
+        component: () => import('@/views/data/medicalRecords/codeList'),
+        hidden: true, //不在导航栏展示
+        meta: { title: '编码员' }
+      },
+      {
+        path: '/details',
+        name: 'details',
+        component: () => import('@/views/data/query/details'),
+        hidden: true, //不在导航栏展示
+        meta: { title: '病案首页质控详情' }
+      },
+      {
+        path: '/ChargeDetails',
+        name: 'ChargeDetails',
+        hidden: true, //不在导航栏展示
+        component: () => import('@/views/data/query/ChargeDetails'),
+        meta: { title: '费用明细' }
+      },
+      {
+        path: '/StatementList',
+        name: 'StatementList',
+        component: () => import('@/views/SettlementList/StatementList'),
+        hidden: true,//不在导航栏展示
+        meta: { title: '结算清单数量'}
+      },
+      // 医保结算清单
+      {
+        path: '/SetDetails',
+        name: 'SetDetails',
+        component: () => import('@/views/SettlementList/SetDetails'),
+        hidden: true,//不在导航栏展示
+        meta: { title: '医保结算单病案数量' }
+      },
+      {
+        path: '/StatementListquery',
+        name: 'StatementListquery',
+        component: () => import('@/views/SettlementList/StatementListquery'),
+        hidden: true,//不在导航栏展示
+        meta: { title: '医保结算单病案数量'}
+      },
+      {
+        path: '/defectStatementList',
+        name: 'defectStatementList',
+        hidden: true,//不在导航栏展示
+        component: () => import('@/views/SettlementList/defectStatementList'),
+        meta: { title: '缺陷结算清单数量'}
+      },
+      {
+        path: '/caseIndex',
+        name: 'caseIndex',
+        component: () => import('@/views/allcase/caseIndex'),
+        hidden: true,
+        meta: { title: '病案指标', keepAlive:true},
+      },
+      {
+        path: '/caseIndexList',
+        name: 'caseIndexList',
+        component: () => import('@/views/allcase/caseIndexList'),
+        hidden: true,
+        meta: { title: '指标列表', keepAlive:true },
+      },
+      {
+        path: '/searchSystem',
+        name: 'SearchSystem',
+        component: () => import('@/views/searchSystem/index'),
+        hidden: true,
+        meta: { title: '医院大数据自助查询系统', keepAlive:true,  icon: 'dashboard' },
+      },
+    ],
+  },
+];
+
+const createRouter = () =>
+  new Router({
+    // mode: 'history', // require service support
+    scrollBehavior: () => ({ y: 0 }),
+    routes: constantRoutes,
+  });
+
+const router = createRouter();
+
+const whiteList = ['/login','/404']; // 添加路由白名单
+//路由判断
+router.beforeEach(async (to, from, next) => {
+  const hasToken = getToken();
+  if(hasToken){
+    if (!store.state.user.menu.length) { 
+      // 判断当前用户是否已拉取完权限菜单信息
+      // 如果本地不存在权限菜单,则获取权限菜单,生成菜单列表
+      if(!sessionStorage.getItem("route")){
+      //获取路由菜单
+        menu.getMenu().then(response =>{
+          //保险起见,组装一次数据
+            menu.parseRoute(JSON.parse(sessionStorage.getItem("route")),[]).then(res =>{
+              //添加路由并进行跳转
+              menu.addMenu(res).then(e =>{
+                next({ ...to, replace: true }) // hack方法 确保addRoutes已完成
+              })
+            })
+        }).catch(err =>{//失败则直接跳转登录页面
+          next(`/login?redirect=${to.path}`);
+        })
+      }else{//从缓存中读取用户权限列表,并添加菜单到侧边栏和路由元
+        menu.parseRoute(JSON.parse(sessionStorage.getItem("route")),[]).then(res =>{
+          menu.addMenu(res).then(e =>{
+            next({ ...to, replace: true }) // hack方法 确保addRoutes已完成
+          })
+        })
+      }
+    }else{
+      // 有路由表直接放行
+      next();
+    }
+  }else{
+    if (whiteList.indexOf(to.path) !== -1) {
+      // 在白名单内直接放行
+      next();
+    } else {
+      console.log('1')
+      // 其他没有访问权限的页面将被重定向到登录页面。
+      next(`/login?redirect=${to.path}`);
+    }
+  }
+
+  if(to.path == from.path ){
+    // 让 列表页 即不缓存,刷新
+    to.meta.keepAlive = false; 
+  }
+  next()
+
+})
+  
+
+// Detail see: https://github.com/vuejs/vue-router/issues/1234#issuecomment-357941465
+export function resetRouter() {
+  const newRouter = createRouter();
+  router.matcher = newRouter.matcher; // reset router
+}
+
+export default router;
+

+ 15 - 0
src/settings.js

@@ -0,0 +1,15 @@
+module.exports = {
+  title: '病案数据治理与服务平台',
+
+  /**
+   * @type {boolean} true | false
+   * @description Whether fix the header
+   */
+  fixedHeader: false,
+
+  /**
+   * @type {boolean} true | false
+   * @description Whether show the logo in sidebar
+   */
+  sidebarLogo: false,
+};

+ 9 - 0
src/store/getters.js

@@ -0,0 +1,9 @@
+const getters = {
+  sidebar: state => state.app.sidebar,
+  device: state => state.app.device,
+  token: state => state.user.token,
+  avatar: state => state.user.avatar,
+  name: state => state.user.name,
+  menu: state => state.user.menu,
+};
+export default getters;

+ 19 - 0
src/store/index.js

@@ -0,0 +1,19 @@
+import Vue from 'vue';
+import Vuex from 'vuex';
+import getters from './getters';
+import app from './modules/app';
+import settings from './modules/settings';
+import user from './modules/user';
+
+Vue.use(Vuex);
+
+const store = new Vuex.Store({
+  modules: {
+    app,
+    settings,
+    user,
+  },
+  getters,
+});
+
+export default store;

+ 48 - 0
src/store/modules/app.js

@@ -0,0 +1,48 @@
+import Cookies from 'js-cookie';
+
+const state = {
+  sidebar: {
+    opened: Cookies.get('sidebarStatus') ? !!+Cookies.get('sidebarStatus') : true,
+    withoutAnimation: false,
+  },
+  device: 'desktop',
+};
+
+const mutations = {
+  TOGGLE_SIDEBAR: state => {
+    state.sidebar.opened = !state.sidebar.opened;
+    state.sidebar.withoutAnimation = false;
+    if (state.sidebar.opened) {
+      Cookies.set('sidebarStatus', 1);
+    } else {
+      Cookies.set('sidebarStatus', 0);
+    }
+  },
+  CLOSE_SIDEBAR: (state, withoutAnimation) => {
+    Cookies.set('sidebarStatus', 0);
+    state.sidebar.opened = false;
+    state.sidebar.withoutAnimation = withoutAnimation;
+  },
+  TOGGLE_DEVICE: (state, device) => {
+    state.device = device;
+  },
+};
+
+const actions = {
+  toggleSideBar({ commit }) {
+    commit('TOGGLE_SIDEBAR');
+  },
+  closeSideBar({ commit }, { withoutAnimation }) {
+    commit('CLOSE_SIDEBAR', withoutAnimation);
+  },
+  toggleDevice({ commit }, device) {
+    commit('TOGGLE_DEVICE', device);
+  },
+};
+
+export default {
+  namespaced: true,
+  state,
+  mutations,
+  actions,
+};

+ 31 - 0
src/store/modules/settings.js

@@ -0,0 +1,31 @@
+import defaultSettings from '@/settings';
+
+const { showSettings, fixedHeader, sidebarLogo } = defaultSettings;
+
+const state = {
+  showSettings: showSettings,
+  fixedHeader: fixedHeader,
+  sidebarLogo: sidebarLogo,
+};
+
+const mutations = {
+  CHANGE_SETTING: (state, { key, value }) => {
+    // eslint-disable-next-line no-prototype-builtins
+    if (state.hasOwnProperty(key)) {
+      state[key] = value;
+    }
+  },
+};
+
+const actions = {
+  changeSetting({ commit }, data) {
+    commit('CHANGE_SETTING', data);
+  },
+};
+
+export default {
+  namespaced: true,
+  state,
+  mutations,
+  actions,
+};

+ 121 - 0
src/store/modules/user.js

@@ -0,0 +1,121 @@
+import request from "../../api/request.js"
+import menu from "../../menu/menu.js"
+import { login, logout, getInfo } from '@/api/user';
+import { getToken, setToken, removeToken } from '@/utils/auth';
+import router, { constantRoutes, resetRouter } from '@/router';
+
+const getDefaultState = () => {
+  return {
+    token: getToken(),
+    name: '',
+    avatar: '',
+    menu: [],//添加一个数组用来装菜单列表
+    ifchange: false
+  };
+};
+
+const state = getDefaultState();
+
+const mutations = {
+  RESET_STATE: state => {
+    Object.assign(state, getDefaultState());
+  },
+  SET_TOKEN: (state, token) => {
+    state.token = token;
+  },
+  SET_NAME: (state, name) => {
+    state.name = name;
+  },
+  SET_AVATAR: (state, avatar) => {
+    state.avatar = avatar;
+  },
+  SET_MENU: (state,menu) =>{
+    state.menu = menu;
+    state.ifchange = true
+  }
+};
+
+const actions = {
+  // user login
+  login({ commit }, userInfo) {
+    const { username, password } = userInfo;
+    return new Promise((resolve, reject) => {
+      login({ username: username.trim(), password: password })
+        .then(response => {
+          const { data } = response;
+          commit('SET_TOKEN', data.token);
+          setToken(data.token);
+          // menu.getMenu();  //获取权限菜单
+          resolve();
+        })
+        .catch(error => {
+          reject(error);
+        });
+    });
+  },
+   modifyMenu({ commit },menu){
+    return new Promise(resolve => {
+      commit('SET_MENU',menu)
+      resolve()
+    })
+  },
+  // get user info
+  getInfo({ commit, state }) {
+    return new Promise((resolve, reject) => {
+      getInfo(state.token)
+        .then(response => {
+          const { data } = response;
+
+          if (!data) {
+            return reject('Verification failed, please Login again.');
+          }
+
+          const { name, avatar } = data;
+
+          commit('SET_NAME', name);
+          commit('SET_AVATAR', avatar);
+          resolve(data);
+        })
+        .catch(error => {
+          reject(error);
+        });
+    });
+  },
+
+  // user logout
+  logout({ commit, state }) {
+    return new Promise((resolve, reject) => {
+      logout(state.token)
+        .then(() => {
+          // 清除缓存的权限菜单
+          sessionStorage.removeItem("route")
+
+          removeToken(); // must remove  token  first
+          resetRouter();
+          commit('RESET_STATE');
+          resolve();
+        })
+        .catch(error => {
+          reject(error);
+        });
+    });
+  },
+
+  // remove token
+  resetToken({ commit }) {
+    return new Promise(resolve => {
+      // 清除缓存的权限菜单
+      sessionStorage.removeItem("route")
+      removeToken(); // must remove  token  first
+      commit('RESET_STATE');
+      resolve();
+    });
+  },
+};
+
+export default {
+  namespaced: true,
+  state,
+  mutations,
+  actions,
+};

+ 49 - 0
src/styles/element-ui.scss

@@ -0,0 +1,49 @@
+// cover some element-ui styles
+
+.el-breadcrumb__inner,
+.el-breadcrumb__inner a {
+  font-weight: 400 !important;
+}
+
+.el-upload {
+  input[type="file"] {
+    display: none !important;
+  }
+}
+
+.el-upload__input {
+  display: none;
+}
+
+
+// to fixed https://github.com/ElemeFE/element/issues/2461
+.el-dialog {
+  transform: none;
+  left: 0;
+  position: relative;
+  margin: 0 auto;
+}
+
+// refine element ui upload
+.upload-container {
+  .el-upload {
+    width: 100%;
+
+    .el-upload-dragger {
+      width: 100%;
+      height: 200px;
+    }
+  }
+}
+
+// dropdown
+.el-dropdown-menu {
+  a {
+    display: block
+  }
+}
+
+// to fix el-date-picker css style
+.el-range-separator {
+  box-sizing: content-box;
+}

+ 65 - 0
src/styles/index.scss

@@ -0,0 +1,65 @@
+@import './variables.scss';
+@import './mixin.scss';
+@import './transition.scss';
+@import './element-ui.scss';
+@import './sidebar.scss';
+
+body {
+  height: 100%;
+  -moz-osx-font-smoothing: grayscale;
+  -webkit-font-smoothing: antialiased;
+  text-rendering: optimizeLegibility;
+  font-family: Helvetica Neue, Helvetica, PingFang SC, Hiragino Sans GB, Microsoft YaHei, Arial, sans-serif;
+}
+
+label {
+  font-weight: 700;
+}
+
+html {
+  height: 100%;
+  box-sizing: border-box;
+}
+
+#app {
+  height: 100%;
+}
+
+*,
+*:before,
+*:after {
+  box-sizing: inherit;
+}
+
+a:focus,
+a:active {
+  outline: none;
+}
+
+a,
+a:focus,
+a:hover {
+  cursor: pointer;
+  color: inherit;
+  text-decoration: none;
+}
+
+div:focus {
+  outline: none;
+}
+
+.clearfix {
+  &:after {
+    visibility: hidden;
+    display: block;
+    font-size: 0;
+    content: " ";
+    clear: both;
+    height: 0;
+  }
+}
+
+// main-container global css
+.app-container {
+  padding: 20px;
+}

+ 28 - 0
src/styles/mixin.scss

@@ -0,0 +1,28 @@
+@mixin clearfix {
+  &:after {
+    content: "";
+    display: table;
+    clear: both;
+  }
+}
+
+@mixin scrollBar {
+  &::-webkit-scrollbar-track-piece {
+    background: #d3dce6;
+  }
+
+  &::-webkit-scrollbar {
+    width: 6px;
+  }
+
+  &::-webkit-scrollbar-thumb {
+    background: #99a9bf;
+    border-radius: 20px;
+  }
+}
+
+@mixin relative {
+  position: relative;
+  width: 100%;
+  height: 100%;
+}

+ 227 - 0
src/styles/sidebar.scss

@@ -0,0 +1,227 @@
+#app {
+  .main-container {
+    background: #f4f4f4;
+    min-height: 100%;
+    transition: margin-left .28s;
+    margin-left: $sideBarWidth;
+    position: relative;
+  }
+
+  .sidebar-container {
+    transition: width 0.28s;
+    width: $sideBarWidth  !important;
+    background-color: #185da6;
+    height: 100%;
+    position: fixed;
+    font-size: 0px;
+    top: 0;
+    bottom: 0;
+    left: 0;
+    z-index: 1001;
+    overflow: hidden;
+
+    // reset element-ui css
+    .horizontal-collapse-transition {
+      transition: 0s width ease-in-out, 0s padding-left ease-in-out, 0s padding-right ease-in-out;
+    }
+
+    .scrollbar-wrapper {
+      overflow-x: hidden !important;
+    }
+
+    .el-scrollbar__bar.is-vertical {
+      right: 0px;
+    }
+
+    .el-scrollbar {
+      height: 100%;
+    }
+
+    &.has-logo {
+      .el-scrollbar {
+        height: calc(100% - 50px);
+      }
+    }
+
+    .is-horizontal {
+      display: none;
+    }
+
+    a {
+      display: inline-block;
+      width: 100%;
+      overflow: hidden;
+    }
+
+    .svg-icon {
+      margin-right: 16px;
+    }
+
+    .sub-el-icon {
+      margin-right: 12px;
+      margin-left: -2px;
+    }
+
+    .el-menu {
+      border: none;
+      height: 100%;
+      width: 100% !important;
+    }
+
+    // menu hover
+    .submenu-title-noDropdown,
+    .el-submenu__title {
+      &:hover {
+        background-color: #004589 !important;
+      }
+    }
+
+    .is-active>.el-submenu__title {
+      color: $subMenuActiveText  !important;
+    }
+
+    & .nest-menu .el-submenu>.el-submenu__title,
+    & .el-submenu .el-menu-item {
+      min-width: $sideBarWidth  !important;
+      background-color: #185da6 !important;
+
+      &:hover {
+        background-color: #004589 !important;
+      }
+    }
+  }
+
+  .hideSidebar {
+    .sidebar-container {
+      width: 54px !important;
+    }
+
+    .main-container {
+      margin-left: 54px;
+    }
+
+    .submenu-title-noDropdown {
+      padding: 0 !important;
+      position: relative;
+
+      .el-tooltip {
+        padding: 0 !important;
+
+        .svg-icon {
+          margin-left: 20px;
+        }
+
+        .sub-el-icon {
+          margin-left: 19px;
+        }
+      }
+    }
+
+    .el-submenu {
+      overflow: hidden;
+
+      &>.el-submenu__title {
+        padding: 0 !important;
+
+        .svg-icon {
+          margin-left: 20px;
+        }
+
+        .sub-el-icon {
+          margin-left: 19px;
+        }
+
+        .el-submenu__icon-arrow {
+          display: none;
+        }
+      }
+    }
+
+    .el-menu--collapse {
+      .el-submenu {
+        &>.el-submenu__title {
+          &>span {
+            height: 0;
+            width: 0;
+            overflow: hidden;
+            visibility: hidden;
+            display: inline-block;
+          }
+        }
+      }
+    }
+  }
+
+  .el-menu--collapse .el-menu .el-submenu {
+    min-width: $sideBarWidth  !important;
+  }
+
+  // mobile responsive
+  .mobile {
+    .main-container {
+      margin-left: 0px;
+    }
+
+    .sidebar-container {
+      transition: transform .28s;
+      width: $sideBarWidth  !important;
+    }
+
+    &.hideSidebar {
+      .sidebar-container {
+        pointer-events: none;
+        transition-duration: 0.3s;
+        transform: translate3d(-$sideBarWidth, 0, 0);
+      }
+    }
+  }
+
+  .withoutAnimation {
+
+    .main-container,
+    .sidebar-container {
+      transition: none;
+    }
+  }
+}
+
+// when menu collapsed
+.el-menu--vertical {
+  &>.el-menu {
+    .svg-icon {
+      margin-right: 16px;
+    }
+
+    .sub-el-icon {
+      margin-right: 12px;
+      margin-left: -2px;
+    }
+  }
+
+  .nest-menu .el-submenu>.el-submenu__title,
+  .el-menu-item {
+    &:hover {
+      // you can use $subMenuHover
+      background-color: $menuHover  !important;
+    }
+  }
+
+  // the scroll bar appears when the subMenu is too long
+  >.el-menu--popup {
+    max-height: 100vh;
+    overflow-y: auto;
+
+    &::-webkit-scrollbar-track-piece {
+      background: #d3dce6;
+    }
+
+    &::-webkit-scrollbar {
+      width: 6px;
+    }
+
+    &::-webkit-scrollbar-thumb {
+      background: #99a9bf;
+      border-radius: 20px;
+    }
+  }
+}

+ 48 - 0
src/styles/transition.scss

@@ -0,0 +1,48 @@
+// global transition css
+
+/* fade */
+.fade-enter-active,
+.fade-leave-active {
+  transition: opacity 0.28s;
+}
+
+.fade-enter,
+.fade-leave-active {
+  opacity: 0;
+}
+
+/* fade-transform */
+.fade-transform-leave-active,
+.fade-transform-enter-active {
+  transition: all .5s;
+}
+
+.fade-transform-enter {
+  opacity: 0;
+  transform: translateX(-30px);
+}
+
+.fade-transform-leave-to {
+  opacity: 0;
+  transform: translateX(30px);
+}
+
+/* breadcrumb transition */
+.breadcrumb-enter-active,
+.breadcrumb-leave-active {
+  transition: all .5s;
+}
+
+.breadcrumb-enter,
+.breadcrumb-leave-active {
+  opacity: 0;
+  transform: translateX(20px);
+}
+
+.breadcrumb-move {
+  transition: all .5s;
+}
+
+.breadcrumb-leave-active {
+  position: absolute;
+}

+ 25 - 0
src/styles/variables.scss

@@ -0,0 +1,25 @@
+// sidebar
+$menuText:#bfcbd9;
+$menuActiveText:#409EFF;
+$subMenuActiveText:#f4f4f5; //https://github.com/ElemeFE/element/issues/12951
+
+$menuBg:#304156;
+$menuHover:#263445;
+
+$subMenuBg:#1f2d3d;
+$subMenuHover:#001528;
+
+$sideBarWidth: 210px;
+
+// the :export directive is the magic sauce for webpack
+// https://www.bluematador.com/blog/how-to-share-variables-between-js-and-sass
+:export {
+  menuText: $menuText;
+  menuActiveText: $menuActiveText;
+  subMenuActiveText: $subMenuActiveText;
+  menuBg: $menuBg;
+  menuHover: $menuHover;
+  subMenuBg: $subMenuBg;
+  subMenuHover: $subMenuHover;
+  sideBarWidth: $sideBarWidth;
+}

+ 15 - 0
src/utils/auth.js

@@ -0,0 +1,15 @@
+import Cookies from 'js-cookie';
+
+const TokenKey = 'vue_admin_template_token';
+
+export function getToken() {
+  return Cookies.get(TokenKey);
+}
+
+export function setToken(token) {
+  return Cookies.set(TokenKey, token);
+}
+
+export function removeToken() {
+  return Cookies.remove(TokenKey);
+}

+ 10 - 0
src/utils/get-page-title.js

@@ -0,0 +1,10 @@
+import defaultSettings from '@/settings';
+
+const title = defaultSettings.title || '病案数据治理与服务平台';
+
+export default function getPageTitle(pageTitle) {
+  if (pageTitle) {
+    return `${pageTitle} - ${title}`;
+  }
+  return `${title}`;
+}

+ 109 - 0
src/utils/index.js

@@ -0,0 +1,109 @@
+/**
+ * Created by PanJiaChen on 16/11/18.
+ */
+
+/**
+ * Parse the time to string
+ * @param {(Object|string|number)} time
+ * @param {string} cFormat
+ * @returns {string | null}
+ */
+export function parseTime(time, cFormat) {
+  if (arguments.length === 0 || !time) {
+    return null;
+  }
+  const format = cFormat || '{y}-{m}-{d} {h}:{i}:{s}';
+  let date;
+  if (typeof time === 'object') {
+    date = time;
+  } else {
+    if (typeof time === 'string') {
+      if (/^[0-9]+$/.test(time)) {
+        // support "1548221490638"
+        time = parseInt(time);
+      } else {
+        // support safari
+        // https://stackoverflow.com/questions/4310953/invalid-date-in-safari
+        time = time.replace(new RegExp(/-/gm), '/');
+      }
+    }
+
+    if (typeof time === 'number' && time.toString().length === 10) {
+      time = time * 1000;
+    }
+    date = new Date(time);
+  }
+  const formatObj = {
+    y: date.getFullYear(),
+    m: date.getMonth() + 1,
+    d: date.getDate(),
+    h: date.getHours(),
+    i: date.getMinutes(),
+    s: date.getSeconds(),
+    a: date.getDay(),
+  };
+  const time_str = format.replace(/{([ymdhisa])+}/g, (result, key) => {
+    const value = formatObj[key];
+    // Note: getDay() returns 0 on Sunday
+    if (key === 'a') {
+      return ['日', '一', '二', '三', '四', '五', '六'][value];
+    }
+    return value.toString().padStart(2, '0');
+  });
+  return time_str;
+}
+
+/**
+ * @param {number} time
+ * @param {string} option
+ * @returns {string}
+ */
+export function formatTime(time, option) {
+  if (('' + time).length === 10) {
+    time = parseInt(time) * 1000;
+  } else {
+    time = +time;
+  }
+  const d = new Date(time);
+  const now = Date.now();
+
+  const diff = (now - d) / 1000;
+
+  if (diff < 30) {
+    return '刚刚';
+  } else if (diff < 3600) {
+    // less 1 hour
+    return Math.ceil(diff / 60) + '分钟前';
+  } else if (diff < 3600 * 24) {
+    return Math.ceil(diff / 3600) + '小时前';
+  } else if (diff < 3600 * 24 * 2) {
+    return '1天前';
+  }
+  if (option) {
+    return parseTime(time, option);
+  } else {
+    return d.getMonth() + 1 + '月' + d.getDate() + '日' + d.getHours() + '时' + d.getMinutes() + '分';
+  }
+}
+
+/**
+ * @param {string} url
+ * @returns {Object}
+ */
+export function param2Obj(url) {
+  const search = decodeURIComponent(url.split('?')[1]).replace(/\+/g, ' ');
+  if (!search) {
+    return {};
+  }
+  const obj = {};
+  const searchArr = search.split('&');
+  searchArr.forEach(v => {
+    const index = v.indexOf('=');
+    if (index !== -1) {
+      const name = v.substring(0, index);
+      const val = v.substring(index + 1, v.length);
+      obj[name] = val;
+    }
+  });
+  return obj;
+}

+ 86 - 0
src/utils/request.js

@@ -0,0 +1,86 @@
+import axios from 'axios';
+import { MessageBox, Message } from 'element-ui';
+import store from '@/store';
+import { getToken } from '@/utils/auth';
+
+// create an axios instance
+const service = axios.create({
+  baseURL: process.env.VUE_APP_BASE_API, // url = base url + request url
+  // withCredentials: true, // send cookies when cross-domain requests
+  timeout: 5000, // request timeout
+});
+console.log(service)
+// request interceptor
+service.interceptors.request.use(
+  config => {
+    config.data = store.state.login
+    store.state.login = ''
+    // do something before request is sent
+    if (store.getters.token) {
+      // let each request carry token
+      // ['X-Token'] is a custom headers key
+      // please modify it according to the actual situation
+      config.headers['token'] = getToken();
+    }
+    return config;
+  },
+  error => {
+    // do something with request error
+    console.log(error); // for debug
+    return Promise.reject(error);
+  },
+);
+
+// response interceptor
+service.interceptors.response.use(
+  /**
+   * If you want to get http information such as headers or status
+   * Please return  response => response
+   */
+
+  /**
+   * Determine the request status by custom code
+   * Here is just an example
+   * You can also judge the status by HTTP Status Code
+   */
+  response => {
+    const res = response.data;
+    console.log(res)
+    // if the custom code is not 20000, it is judged as an error.
+    if (res.code !== 200) {
+      Message({
+        message: res.msg || 'Error2',
+        type: 'error',
+        duration: 5 * 1000,
+      });
+
+      // 50008: Illegal token; 50012: Other clients logged in; 50014: Token expired;
+      if (res.code === 50008 || res.code === 50012 || res.code === 50014) {
+        // to re-login
+        MessageBox.confirm('You have been logged out, you can cancel to stay on this page, or log in again', 'Confirm logout', {
+          confirmButtonText: 'Re-Login',
+          cancelButtonText: 'Cancel',
+          type: 'warning',
+        }).then(() => {
+          store.dispatch('user/resetToken').then(() => {
+            location.reload();
+          });
+        });
+      }
+      return Promise.reject(new Error(res.msg || 'Error1'));
+    } else {
+      return res;
+    }
+  },
+  error => {
+    console.log('err' + error); // for debug
+    Message({
+      message: error.msg,
+      type: 'error',
+      duration: 5 * 1000,
+    });
+    return Promise.reject(error);
+  },
+);
+
+export default service;

+ 20 - 0
src/utils/validate.js

@@ -0,0 +1,20 @@
+/**
+ * Created by PanJiaChen on 16/11/18.
+ */
+
+/**
+ * @param {string} path
+ * @returns {Boolean}
+ */
+export function isExternal(path) {
+  return /^(https?:|mailto:|tel:)/.test(path);
+}
+
+/**
+ * @param {string} str
+ * @returns {Boolean}
+ */
+export function validUsername(str) {
+  const valid_map = ['admin', 'editor'];
+  return valid_map.indexOf(str.trim()) >= 0;
+}

+ 228 - 0
src/views/404.vue

@@ -0,0 +1,228 @@
+<template>
+  <div class="wscn-http404-container">
+    <div class="wscn-http404">
+      <div class="pic-404">
+        <img class="pic-404__parent" src="@/assets/404_images/404.png" alt="404" />
+        <img class="pic-404__child left" src="@/assets/404_images/404_cloud.png" alt="404" />
+        <img class="pic-404__child mid" src="@/assets/404_images/404_cloud.png" alt="404" />
+        <img class="pic-404__child right" src="@/assets/404_images/404_cloud.png" alt="404" />
+      </div>
+      <div class="bullshit">
+        <div class="bullshit__oops">OOPS!</div>
+        <div class="bullshit__info">
+          All rights reserved
+          <a style="color: #20a0ff" href="https://wallstreetcn.com" target="_blank">wallstreetcn</a>
+        </div>
+        <div class="bullshit__headline">{{ message }}</div>
+        <div class="bullshit__info">Please check that the URL you entered is correct, or click the button below to return to the homepage.</div>
+        <a href="" class="bullshit__return-home">Back to home</a>
+      </div>
+    </div>
+  </div>
+</template>
+
+<script>
+export default {
+  name: 'Page404',
+  computed: {
+    message() {
+      return 'The webmaster said that you can not enter this page...';
+    },
+  },
+};
+</script>
+
+<style lang="scss" scoped>
+.wscn-http404-container {
+  transform: translate(-50%, -50%);
+  position: absolute;
+  top: 40%;
+  left: 50%;
+}
+.wscn-http404 {
+  position: relative;
+  width: 1200px;
+  padding: 0 50px;
+  overflow: hidden;
+  .pic-404 {
+    position: relative;
+    float: left;
+    width: 600px;
+    overflow: hidden;
+    &__parent {
+      width: 100%;
+    }
+    &__child {
+      position: absolute;
+      &.left {
+        width: 80px;
+        top: 17px;
+        left: 220px;
+        opacity: 0;
+        animation-name: cloudLeft;
+        animation-duration: 2s;
+        animation-timing-function: linear;
+        animation-fill-mode: forwards;
+        animation-delay: 1s;
+      }
+      &.mid {
+        width: 46px;
+        top: 10px;
+        left: 420px;
+        opacity: 0;
+        animation-name: cloudMid;
+        animation-duration: 2s;
+        animation-timing-function: linear;
+        animation-fill-mode: forwards;
+        animation-delay: 1.2s;
+      }
+      &.right {
+        width: 62px;
+        top: 100px;
+        left: 500px;
+        opacity: 0;
+        animation-name: cloudRight;
+        animation-duration: 2s;
+        animation-timing-function: linear;
+        animation-fill-mode: forwards;
+        animation-delay: 1s;
+      }
+      @keyframes cloudLeft {
+        0% {
+          top: 17px;
+          left: 220px;
+          opacity: 0;
+        }
+        20% {
+          top: 33px;
+          left: 188px;
+          opacity: 1;
+        }
+        80% {
+          top: 81px;
+          left: 92px;
+          opacity: 1;
+        }
+        100% {
+          top: 97px;
+          left: 60px;
+          opacity: 0;
+        }
+      }
+      @keyframes cloudMid {
+        0% {
+          top: 10px;
+          left: 420px;
+          opacity: 0;
+        }
+        20% {
+          top: 40px;
+          left: 360px;
+          opacity: 1;
+        }
+        70% {
+          top: 130px;
+          left: 180px;
+          opacity: 1;
+        }
+        100% {
+          top: 160px;
+          left: 120px;
+          opacity: 0;
+        }
+      }
+      @keyframes cloudRight {
+        0% {
+          top: 100px;
+          left: 500px;
+          opacity: 0;
+        }
+        20% {
+          top: 120px;
+          left: 460px;
+          opacity: 1;
+        }
+        80% {
+          top: 180px;
+          left: 340px;
+          opacity: 1;
+        }
+        100% {
+          top: 200px;
+          left: 300px;
+          opacity: 0;
+        }
+      }
+    }
+  }
+  .bullshit {
+    position: relative;
+    float: left;
+    width: 300px;
+    padding: 30px 0;
+    overflow: hidden;
+    &__oops {
+      font-size: 32px;
+      font-weight: bold;
+      line-height: 40px;
+      color: #1482f0;
+      opacity: 0;
+      margin-bottom: 20px;
+      animation-name: slideUp;
+      animation-duration: 0.5s;
+      animation-fill-mode: forwards;
+    }
+    &__headline {
+      font-size: 20px;
+      line-height: 24px;
+      color: #222;
+      font-weight: bold;
+      opacity: 0;
+      margin-bottom: 10px;
+      animation-name: slideUp;
+      animation-duration: 0.5s;
+      animation-delay: 0.1s;
+      animation-fill-mode: forwards;
+    }
+    &__info {
+      font-size: 13px;
+      line-height: 21px;
+      color: grey;
+      opacity: 0;
+      margin-bottom: 30px;
+      animation-name: slideUp;
+      animation-duration: 0.5s;
+      animation-delay: 0.2s;
+      animation-fill-mode: forwards;
+    }
+    &__return-home {
+      display: block;
+      float: left;
+      width: 110px;
+      height: 36px;
+      background: #1482f0;
+      border-radius: 100px;
+      text-align: center;
+      color: #ffffff;
+      opacity: 0;
+      font-size: 14px;
+      line-height: 36px;
+      cursor: pointer;
+      animation-name: slideUp;
+      animation-duration: 0.5s;
+      animation-delay: 0.3s;
+      animation-fill-mode: forwards;
+    }
+    @keyframes slideUp {
+      0% {
+        transform: translateY(60px);
+        opacity: 0;
+      }
+      100% {
+        transform: translateY(0);
+        opacity: 1;
+      }
+    }
+  }
+}
+</style>

+ 1469 - 0
src/views/SettlementList/SetDetails.vue

@@ -0,0 +1,1469 @@
+<template>
+  <div id="MyDiv">
+    <div class="header">
+      <el-button type="success" v-if="!ifFile" @click="funEdit">编辑</el-button>
+      <el-button type="warning" v-if="ifFile" @click="funNext">保存</el-button>
+      <el-button @click="getback">返回</el-button>
+    </div>
+    <div class="cont_container">
+      <div class="cont-left">
+        <div class="cont-title">
+        </div>
+        <div class="cont-title-description">山东省烟台市医疗保障基金结算清单</div>
+        <div class="cont-edit-dev">
+          <div class="flexTable HeadBoxWidth">
+            <span ref="YLJG">定点医疗机构名称</span>
+            <span v-if="!ifFile"></span>
+            <!-- <el-input v-else v-model="data.AAA27" placeholder="请输入内容"></el-input> -->
+          </div>
+           <div class="flexTable HeadBoxWidth">
+            <span ref="YLJGDM">定点医疗机构代码</span>
+            <span v-if="!ifFile"></span>
+            <!-- <el-input v-else v-model="data.AAA27" placeholder="请输入内容"></el-input> -->
+          </div >
+            <div class="flexTable HeadBoxWidth">
+            <span ref="QDLSH">清单流水号</span>
+            <span v-if="!ifFile"></span>
+            <!-- <el-input v-else v-model="data.AAA27" placeholder="请输入内容"></el-input> -->
+          </div>
+         
+         
+        </div>
+          <div class="cont-edit-dev">
+               <div class="flexTable HeadBoxWidth">
+            <span ref="YBBH">医保编号</span>
+            <span v-if="!ifFile"></span>
+            <!-- <el-input v-else v-model="data.AAA27" placeholder="请输入内容"></el-input> -->
+          </div>
+          <div class="flexTable HeadBoxWidth">
+            <span ref="AAA28">病案号</span>
+            <span v-if="!ifFile">{{ data.AAA28 }}</span>
+            <!-- <el-input v-else v-model="data.AAA28" placeholder="请输入内容"></el-input> -->
+          </div>
+          <div class="flexTable HeadBoxWidth">
+            <span ref="YBJSDJ">医保结算等级</span>
+            <span v-if="!ifFile"></span>
+            <!-- <el-input v-else v-model="data.AAA28" placeholder="请输入内容"></el-input> -->
+          </div>
+          </div>
+          <div class="cont-edit-dev">
+             <div class="flexTable HeadBoxWidth">
+            <span ref="SBSJ">申报时间</span>
+            <span v-if="!ifFile">{{ data.AAA28 }}</span>
+            <!-- <el-input v-else v-model="data.AAA28" placeholder="请输入内容"></el-input> -->
+          </div>
+          </div>
+ <div class="TableHead">一.基本信息</div>
+        <div class="table" >
+         
+          <table ref="tables">
+            <tr>
+              <td class="table-label table-label1" ref="AAA01">姓名</td>
+              <td class="table-value" v-if="!ifFile">{{ data.AAA01 }}</td>
+              <td class="table-value" v-else>
+                <el-input v-model="data.AAA01" class="width100" placeholder="请输入内容"></el-input>
+              </td>
+              <td class="table-label table-label2" ref="AAA02C">性别</td>
+              <td class="table-value" v-if="!ifFile">{{ data.AAA02C }}</td>
+              <td class="table-value" v-else>
+                <el-input v-model="data.AAA02C" class="width100" placeholder="请输入内容"></el-input>
+              </td>
+              <td class="table-label table-label3" ref="AAA03">出生日期</td>
+              <td class="table-value" v-if="!ifFile">{{ data.AAA03 }}</td>
+              <td class="table-value" v-else>
+                <el-input v-model="data.AAA03" class="width100" placeholder="请输入内容"></el-input>
+              </td>
+              <td class="table-label table-label4" ref="AAA04">年龄</td>
+              <td class="table-value" v-if="!ifFile">{{ data.AAA04 }}</td>
+              <td class="table-value" v-else>
+                <el-input v-model="data.AAA04" class="width100" placeholder="请输入内容"></el-input>
+              </td>
+            </tr>
+            <tr>
+              <td class="table-label table-label5" ref="AAA05C">国籍</td>
+              <td class="table-value" v-if="!ifFile">{{ data.AAA05C }}</td>
+              <td class="table-value" v-else>
+                <el-input v-model="data.AAA05C" class="width100" placeholder="请输入内容"></el-input>
+              </td>
+              <td class="table-label table-label6" ref="AAA40">年龄(年龄不足一周岁的年龄)</td>
+              <td class="table-value" v-if="!ifFile">{{ data.AAA40 }}(天)</td>
+              <td class="table-value" v-else>
+                <el-input v-model="data.AAA40" class="width100" placeholder="请输入内容"></el-input>
+              </td>
+              
+              <td class="table-label table-label7" ref="AAA06C">民族</td>
+              <td class="table-value" v-if="!ifFile">{{ data.AAA06C }}</td>
+              <td class="table-value" v-else>
+                <el-input v-model="data.AAA06C" class="width100" placeholder="请输入内容"></el-input>
+              </td>
+              <td class="table-label table-label8" ref="ZJLB">患者证件类别</td>
+              <td class="table-value" v-if="!ifFile">{{ data.ZJLB }}</td>
+              <td class="table-value" v-else>
+                <!-- <el-input v-model="data.ZJLB" class="width100" placeholder="请输入内容"></el-input> -->
+              </td>
+            </tr>
+            <tr>
+              <td class="table-label table-label9" ref="AAA07">患者证件号码</td>
+              <td class="table-value" v-if="!ifFile">{{ data.AAA07 }}</td>
+              <td class="table-value" v-else>
+                <el-input v-model="data.AAA07" class="width100" placeholder="请输入内容"></el-input>
+              </td>
+              <td class="table-label table-label10" ref="AAA18C">职业</td>
+              <td class="table-value" v-if="!ifFile">{{ data.AAA18C }}</td>
+              <td class="table-value" v-else>
+                <el-input v-model="data.AAA18C" class="width100" placeholder="请输入内容"></el-input>
+              </td>
+            
+              <td class="table-label table-label12" ref="AAA15">现住址</td>
+              <td class="table-value" v-if="!ifFile">{{ data.AAA15 }}</td>
+              <td class="table-value" v-else>
+                <el-input v-model="data.AAA15" class="width100" placeholder="请输入内容"></el-input>
+              </td>
+              <td class="table-label table-label13" ref="AAA19">工作单位及地址</td>
+              <td class="table-value" v-if="!ifFile">{{ data.AAA19 }}</td>
+              <td class="table-value" v-else>
+                <el-input v-model="data.AAA19" class="width100" placeholder="请输入内容"></el-input>
+              </td>
+            </tr>
+            <tr>
+              
+              <td class="table-label table-label14" ref="AAA20">单位电话</td>
+              <td class="table-value"  v-if="!ifFile">{{ data.AAA20 }}</td>
+              <td class="table-value"  v-else>
+                <el-input v-model="data.AAA20" class="width100" placeholder="请输入内容"></el-input>
+              </td>
+              <td class="table-label table-label15" ref="AAA21C">邮编</td>
+              <td class="table-value" v-if="!ifFile">{{ data.AAA21C }}</td>
+              <td class="table-value" v-else>
+                <el-input v-model="data.AAA21C" class="width100" placeholder="请输入内容"></el-input>
+              </td>
+              <td class="table-label table-label16" ref="AAA22">联系人姓名</td>
+              <td class="table-value" v-if="!ifFile">{{ data.AAA22 }}</td>
+              <td class="table-value" v-else>
+                <el-input v-model="data.AAA22" class="width100" placeholder="请输入内容"></el-input>
+              </td>
+              <td class="table-label table-label17" ref="GX">关系</td>
+              <td class="table-value" v-if="!ifFile">{{ data.GX }}</td>
+              <td class="table-value" v-else>
+                <!-- <el-input v-model="data.AAA16C" class="width100" placeholder="请输入内容"></el-input> -->
+              </td>
+            </tr>
+            <tr>
+              <td class="table-label table-label18" ref="AAA24">地址</td>
+              <td class="table-value" v-if="!ifFile">{{ data.AAA24 }}</td>
+              <td class="table-value" v-else>
+                <el-input v-model="data.AAA24" class="width100" placeholder="请输入内容"></el-input>
+              </td>
+              <td class="table-label table-label19" ref="AAA25">电话</td>
+              <td class="table-value" v-if="!ifFile">{{ data.AAA25 }}</td>
+              <td class="table-value" v-else>
+                <el-input v-model="data.AAA25" class="width100" placeholder="请输入内容"></el-input>
+              </td>
+                <td class="table-label table-label20" ref="YBLX">医保类型</td>
+              <td class="table-value" v-if="!ifFile">{{ data.YBLX }}</td>
+              <td class="table-value" v-else>
+                <!-- <el-input v-model="data.AAA19" class="width100" placeholder="请输入内容"></el-input> -->
+              </td>
+               <td class="table-label table-label21" ref="TSRYLX">特殊人员类型</td>
+              <td class="table-value" v-if="!ifFile">{{ data.TSRYLX }}</td>
+              <td class="table-value" v-else>
+                <!-- <el-input v-model="data.AAA20" class="width100" placeholder="请输入内容"></el-input> -->
+              </td>
+            </tr>
+            <tr>
+              <td class="table-label table-label22" ref="CBD">参保地</td>
+              <td class="table-value" v-if="!ifFile">{{ data.CBD }}</td>
+              <td class="table-value" v-else>
+                <!-- <el-input v-model="data.CBD" class="width100" placeholder="请输入内容"></el-input> -->
+              </td>
+              <td class="table-label table-label23" ref="XSRRYLX">新生儿入院类型</td>
+              <td class="table-value" v-if="!ifFile">{{ data.XSRRYLX }}</td>
+              <td class="table-value" v-else>
+                <!-- <el-input v-model="data.AAA22" class="width100" placeholder="请输入内容"></el-input> -->
+              </td>
+              <td class="table-label table-label24" ref="AEN01">新生儿出生体重</td>
+              <td class="table-value" v-if="!ifFile">{{ data.AEN01 }}(克)</td>
+              <td class="table-value" v-else>
+                <el-input v-model="data.AEN01" class="width100" placeholder="请输入内容"></el-input>
+              </td>
+              <td class="table-label table-label25" ref="AAA42">新生儿入院体重</td>
+              <td class="table-value" v-if="!ifFile">{{ data.AAA42 }}(克)</td>
+              <td class="table-value" v-else>
+                <el-input v-model="data.AAA42" class="width100" placeholder="请输入内容"></el-input>
+              </td>
+            </tr>
+          </table>
+        </div>
+         <div class="TableHead">二.门诊慢特病诊疗信息</div>
+        <div class="table">
+          <table ref="tables" style="width:100%;">
+            <tr>
+              <td class="table-labelon" colspan="12" ref="ZDKB">诊断科别</td>
+              <td class="table-labelon" v-if="!ifFile" colspan="12" ref="JZRQ">就诊日期{{ data.AAA23C }}</td>
+              <td class="table-labelon" v-else colspan="12" ref="JZRQ">
+                就诊日期 
+                <!-- <el-input  v-model="data.AAA23C" class="width200 eInput" placeholder="请输入内容"></el-input> -->
+              </td>
+            </tr>
+            <tr>
+              <td class="table-labelon table-label30" colspan="6">病种名称</td>
+              <td class="table-labelon table-label31" colspan="6"> 病种代码</td>
+              <td class="table-labelon table-label32" colspan="6">手术及操作名称</td>
+              <td class="table-labelon table-label33" colspan="6">手术及操作编码</td>
+            </tr>
+            <tr v-for="(item, index) in data.main_operation" :key="index">
+              <td class="table-valueon" colspan="6">
+                <p class="FA6400"></p>
+              </td>
+              <td class="table-valueon FA6400" colspan="6"></td>
+              <td class="table-valueon" colspan="6"></td>
+              <td class="table-valueon" colspan="6"></td>
+            </tr>
+          </table>
+          </div>
+          <div class="TableHead">三.住院诊疗信息</div>
+
+
+          <!--  -->
+          <div class="table">
+          <table>
+            <tr>
+              <td class="table-value" colspan="24">
+                <div class="flexTable">
+              <span style="padding-right:10px;">住院医疗类型:1.住院 2.日间手术</span> 
+              <div v-if="!ifFile">{{ data.AEM03C }}</div>
+              <div v-if="ifFile">
+                 <!-- <el-input v-model="data.AEM03C" placeholder="请输入内容"></el-input> -->
+              </div></div>
+
+              </td>
+            </tr>
+            <tr>
+              <td class="table-value" colspan="24" ref="AAB06C">
+                <div class="flexTable">
+              <span style="padding-right:10px;">入院途径(1.急诊 2.门诊 3.其他医疗结构转入 4.其他)</span> 
+              <div v-if="!ifFile">{{ data.AAB06C }}</div>
+              <div v-if="ifFile"> <el-input v-model="data.AAB06C" placeholder="请输入内容"></el-input></div></div>
+              </td>
+           </tr>
+            <tr>
+              <td class="table-value" colspan="24">
+                <div class="flexTable">
+              <span style="padding-right:10px;">治疗类别(1.西医 2.中医(2.1 中医 2.2 民族医)) 3.中西医:</span> 
+              <div v-if="!ifFile">{{ data.ZLLB }}</div>
+              <div v-if="ifFile"> 
+                <!-- <el-input v-model="data.AEM03C" placeholder="请输入内容"></el-input> -->
+                </div></div>
+              </td>
+            </tr>
+            <tr>
+              <td class="table-value" colspan="4" ref="AAB01">
+                <div class="flexTable">
+              <span style="padding-right:10px;">入院时间:</span> 
+              <div v-if="!ifFile">{{ data.AAB01 }}</div>
+              <div v-if="ifFile"> <el-input v-model="data.AAB01" placeholder="请输入内容"></el-input></div></div>
+              </td>
+              <td class="table-value" colspan="7" ref="AAB02C">
+                <div class="flexTable">
+              <span style="padding-right:10px;">入院科别:</span> 
+              <div v-if="!ifFile">{{ data.AAB02C }}</div>
+              <div v-if="ifFile"> <el-input v-model="data.AAB02C" placeholder="请输入内容"></el-input></div></div>
+              </td>
+              <td class="table-value" colspan="8" ref="ZKKB">
+                <div class="flexTable">
+              <span style="padding-right:10px;">转科科别:</span> 
+              <div v-if="!ifFile">{{ data.ZKKB }}</div>
+              <div v-if="ifFile"> <el-input v-model="data.ZKKB" placeholder="请输入内容"></el-input></div></div>
+              </td>
+            </tr>
+            <tr>
+              <td class="table-value" colspan="4" ref="CYSJ">
+              <div class="flexTable">
+              <span style="padding-right:10px;">出院时间:</span> 
+              <div v-if="!ifFile">{{ data.CYSJ }}</div>
+              <div v-if="ifFile"> <el-input v-model="data.CYSJ" placeholder="请输入内容"></el-input></div></div>
+              </td>
+              <td class="table-value" colspan="6" ref="AAC02C">
+              <div class="flexTable">
+              <span style="padding-right:10px;">出院科别:</span> 
+              <div v-if="!ifFile">{{ data.AAC02C }}</div>
+              <div v-if="ifFile"> <el-input v-model="data.AAC02C" placeholder="请输入内容"></el-input></div></div>
+              </td>
+              <td class="table-value" colspan="8" ref="AAC04">
+              <div class="flexTable">
+              <span style="padding-right:10px;">实际住院:</span> 
+              <div v-if="!ifFile">{{ data.AAC04 }}</div>
+              <div v-if="ifFile"> <el-input v-model="data.AAC04" placeholder="请输入内容"></el-input></div></div>
+              </td>
+            </tr>
+            <tr>
+              <td class="table-value" colspan="8" ref="XYZD">
+              <div class="flexTable">
+              <span style="padding-right:10px;">门(急)诊诊断(西医诊断):</span> 
+              <div v-if="!ifFile">{{ data.XYZD }}</div>
+              <!-- <div v-if="ifFile"> <el-input v-model="data.XYZD" placeholder="请输入内容"></el-input></div> -->
+              </div>
+              </td>
+              <td class="table-value" colspan="9" ref="JBDM">
+              <div class="flexTable">
+              <span style="padding-right:10px;">疾病代码:</span> 
+              <div v-if="!ifFile">{{ data.JBDM }}</div>
+              <!-- <div v-if="ifFile"> <el-input v-model="data.AEM03C" placeholder="请输入内容"></el-input></div> -->
+              </div>
+              </td>
+            </tr>
+            <tr>
+              <td class="table-value" colspan="9" ref="ZYZD">
+              <div class="flexTable">
+              <span style="padding-right:10px;">门(急)诊诊断(中医诊断):</span> 
+              <div v-if="!ifFile">{{ data.ZYZD }}</div>
+              <!-- <div v-if="ifFile"> <el-input v-model="data.ZYZD" placeholder="请输入内容"></el-input></div> -->
+              </div>
+              </td>
+              <td class="table-value" colspan="9" ref="JBDM">
+              <div class="flexTable">
+              <span style="padding-right:10px;">疾病代码:</span> 
+              <div v-if="!ifFile">{{ data.JBDM }}</div>
+              <!-- <div v-if="ifFile"> <el-input v-model="data.AEM03C" placeholder="请输入内容"></el-input></div> -->
+              </div>
+              </td>
+            </tr>
+            <tr>
+              <td class="table-value" colspan="1" ref="ABF01N">
+              <div class="flexTable">
+              <span style="padding-right:10px;">出院西医诊断:</span> 
+             </div>
+              </td>
+              <td class="table-value" colspan="1" ref="ABF01N">
+              <div class="flexTable">
+              <span style="padding-right:10px;">疾病代码:</span> 
+             </div>
+              </td>
+              <td class="table-value" colspan="8" ref="ABF01N">
+              <div class="flexTable">
+              <span style="padding-right:10px;">入院病情::</span> 
+             </div>
+              </td>
+              <td class="table-value" colspan="1" ref="ABF01N">
+              <div class="flexTable">
+              <span style="padding-right:10px;">出院中医诊断:</span> 
+             </div>
+              </td>
+              <td class="table-value" colspan="1" ref="ABF01N">
+              <div class="flexTable">
+              <span style="padding-right:10px;">疾病代码:</span> 
+             </div>
+              </td>
+              <td class="table-value" colspan="6" ref="ABF01N">
+              <div class="flexTable">
+              <span style="padding-right:10px;">入院病情::</span> 
+             </div>
+              </td>
+            </tr>
+            <tr v-for="(item, index) in data.main_operation" :key="index">
+              <td class="table-valueon"  colspan="1" >
+                <p class="FA6400">主要诊断{{ item.FRIST_ASSISTANT_NAME }}</p>
+              </td>
+              <td class="table-valueon FA6400"  colspan="1" >{{ data.ABF01C }}</td>
+              <td class="table-valueon"  colspan="8" >{{ data.ABC03C }}</td>
+              <td class="table-valueon"  colspan="1" >主病{{ data.ABC01N }}</td>
+              <td class="table-valueon"  colspan="1" >{{ data.ABC01N }}</td>
+              <td class="table-valueon"  colspan="6" >{{ data.ABC01N }}</td> 
+            </tr>
+            <!-- <tr v-for="(item, index) in data.main_operation" :key="index">
+              <td class="table-valueon"  colspan="1" >
+                <p class="FA6400">主要诊断{{ item.FRIST_ASSISTANT_NAME }}</p>
+              </td>
+              <td class="table-valueon FA6400"  colspan="1" >{{ data.ABF01C }}</td>
+              <td class="table-valueon"  colspan="8" >{{ data.ABC03C }}</td>
+              <td class="table-valueon"  colspan="1" >主病{{ data.ABC01N }}</td>
+              <td class="table-valueon"  colspan="1" >{{ data.ABC01N }}</td>
+              <td class="table-valueon"  colspan="6" >{{ data.ABC01N }}</td> 
+            </tr> -->
+            <tr>
+              <td class="table-value" colspan="24">
+                <div class="flexTable">
+              <span style="padding-right:10px;">诊断代码计数</span> 
+              <div v-if="!ifFile">{{ data.ZDDMJS }}</div>
+              <!-- <div v-if="ifFile"> <el-input v-model="data.ZDDMJS" placeholder="请输入内容"></el-input></div> -->
+              </div>
+              </td>
+            </tr>
+              <tr>
+             <td class="table-value" colspan="8" ref="AEG02C">主要手术及操作名称:{{ data.AEG02C }}</td>
+            <td class="table-value" colspan="1" ref="AEG02C">主要手术及操作代码:{{ data.AEG02C }}</td>
+            <td class="table-value" colspan="1"  ref="AEG02C">麻醉方式:{{ data.AEG02C }}</td>
+            <td class="table-value" colspan="1" ref="AEG02C">术者医师姓名:{{ data.AEG02C }}</td>
+            <td class="table-value" colspan="1" ref="AEG02C">术者医师代码:{{ data.AEG02C }}</td>
+            <td class="table-value" colspan="1"  ref="AEG02C">麻醉医师姓名:{{ data.AEG02C }}</td>
+            <td class="table-value" colspan="1"  ref="AEG02C">麻醉医师代码:{{ data.AEG02C }}</td>
+            </tr>
+            <tr v-for="(item, index) in data.main_operation" :key="index">
+              <td class="table-valueon"  colspan="8" >
+                <p class="FA6400">{{ item.ICD9_NAME }}</p>
+              </td>
+              <td class="table-valueon FA6400"  colspan="1" >{{ data.ICD9_ID1 }}</td>
+              <td class="table-valueon"  colspan="1" >{{ data.HOCUS_WAY_ID }}</td>
+              <td class="table-valueon"  colspan="1" >{{ data.OPE_MAN_NAME }}</td>
+              <td class="table-valueon"  colspan="1" >{{ data.OPE_MAN_NAME }}</td>
+              <td class="table-valueon"  colspan="1" >{{ data.HOCUS_MAN_NAME }}</td> 
+              <td class="table-valueon"  colspan="1" >{{ data.HOCUS_MAN_NAME }}</td> 
+            </tr>
+               <tr>
+                <!-- {{ data.AEG02C }} -->
+              <td class="table-value" colspan="8" ref="SJCZQZSJ">
+              <div class="flexTable">
+              <span style="padding-right:10px;">手术操作起止时间:</span> 
+              <div v-if="!ifFile">{{ data.SJCZQZSJ }}</div>
+              <!-- <div v-if="ifFile"> <el-input v-model="data.AEM03C" placeholder="请输入内容"></el-input></div> -->
+              </div>
+              </td>
+
+              <td class="table-value" colspan="8" ref="MZSJ">
+              <div class="flexTable">
+              <span style="padding-right:10px;">麻醉起止时间:</span> 
+              <div v-if="!ifFile">{{ data.MZSJ }}</div>
+              <!-- <div v-if="ifFile"> <el-input v-model="data.AEM03C" placeholder="请输入内容"></el-input></div> -->
+              </div>
+              </td>
+            </tr>
+               <tr>
+                <!-- {{ data.AEG02C }} -->
+              <td class="table-value" colspan="24">
+                <div class="flexTable">
+              <span style="padding-right:10px;">手术及操作代码计数:</span> 
+              <div v-if="!ifFile">{{ data.SJCZDMJS }}</div>
+              <!-- <div v-if="ifFile"> <el-input v-model="data.AEM03C" placeholder="请输入内容"></el-input></div> -->
+              </div>
+              </td>
+            </tr>
+               <tr>
+                <!-- {{ data.AEG02C }} -->
+              <td class="table-value" colspan="24">
+                <div class="flexTable">
+              <span style="padding-right:10px;">呼吸机使用天数:</span> 
+              <div v-if="!ifFile">{{ data.AEL01 }}</div>
+              <div v-if="ifFile"> <el-input v-model="data.AEL01" placeholder="请输入内容"></el-input></div></div>
+              </td>
+            </tr>
+            <tr>
+              <td class="table-value" colspan="4">
+                <div class="flexTable">
+              <span style="padding-right:10px;">颅脑损伤患者昏迷时间:</span> 
+             </div>
+              </td>
+              <td class="table-value" colspan="7" ref="AEJ01">
+                <div class="flexTable">
+              <span style="padding-right:10px;">入院前</span> 
+              <div v-if="!ifFile">{{ data.AEJ01 }}</div>
+              <div v-if="ifFile">  
+                <el-input class="width150" v-model="data.AEJ01"></el-input>
+                天
+                <el-input class="width150" v-model="data.AEJ02"></el-input>
+                小时
+                <el-input class="width150" v-model="data.AEJ03"></el-input>
+                分</div></div>
+              </td>
+              <td class="table-value" colspan="6" ref="AEJ04">
+                <div class="flexTable">
+              <span style="padding-right:10px;">入院后:</span> 
+              <div v-if="!ifFile">{{ data.AEJ04 }}</div>
+              <div v-if="ifFile"> 
+                <el-input class="width150" v-model="data.AEJ04"></el-input>
+                天
+                <el-input class="width150" v-model="data.AEJ05"></el-input>
+                小时
+                <el-input class="width150" v-model="data.AEJ06"></el-input>
+                分</div></div>
+              </td>
+          
+              <td class="table-value" colspan="5" style="border-left: 0" v-if="!ifFile"></td>
+              <!-- <td class="table-value" colspan="5" style="border-left: 0" v-if="ifFile"></td> -->
+            </tr>
+                <tr>
+              <td class="table-labelon table-label30" colspan="2">重症监护病房类型 </br>(CCU,NICU,ECU,SICU,PICU,RICU,ICU(综合),其他)</td>
+              <td class="table-labelon table-label31" colspan="8">进重症监护室时间(年_月_日_时_分)</td>
+              <td class="table-labelon table-label32" colspan="2">出重症监护室时间(年_月_日_时_分)</td>
+              <td class="table-labelon table-label33" colspan="4">合计(_时_分)</td>
+            </tr>
+            <tr v-for="(item, index) in data.main_operation" :key="index">
+              <td class="table-valueon" colspan="2">
+                <p class="FA6400">{{ item.FRIST_ASSISTANT_NAME }}</p>
+              </td>
+              <td class="table-valueon FA6400" colspan="8">{{ data.ABF01C }}</td>
+              <td class="table-valueon" colspan="2">{{ data.ABC03C }}</td>
+              <td class="table-valueon" colspan="4">{{ data.ABC01N }}</td>
+            </tr>
+              <tr>
+              <td class="table-labelon table-label30" colspan="3">输血品种</td>
+              <td class="table-labelon table-label31" colspan="7">输血量</td>
+              <td class="table-labelon table-label32" colspan="6">输血计量单位</td>
+            </tr>
+             <tr v-for="(item, index) in data.main_operation" :key="index">
+              <td class="table-valueon" colspan="3">
+                <p class="FA6400">{{ item.FRIST_ASSISTANT_NAME }}</p>
+              </td>
+              <td class="table-valueon FA6400" colspan="7">{{ data.ABF01C }}</td>
+              <td class="table-valueon" colspan="6">{{ data.ABC03C }}</td>
+            </tr>
+                        <tr>
+              <td class="table-value" colspan="5" ref="TJHLTS">
+              <div class="flexTable">
+              <span style="padding-right:10px;">特级护理天数:</span> 
+              <div v-if="!ifFile">{{ data.TJHLTS }}</div>
+              <!-- <div v-if="ifFile"> <el-input v-model="data.AEG02C" placeholder="请输入内容"></el-input></div> -->
+              </div>
+              </td>
+
+              <td class="table-value" colspan="5" ref="YJHLTS">
+              <div class="flexTable">
+              <span style="padding-right:10px;">一级护理天数:</span> 
+              <div v-if="!ifFile">{{ data.YJHLTS }}</div>
+              <!-- <div v-if="ifFile"> <el-input v-model="data.AEG02C" placeholder="请输入内容"></el-input></div> -->
+              </div>
+              </td>
+              <td class="table-value" colspan="2" ref="RJHLTS">
+              <div class="flexTable">
+              <span style="padding-right:10px;">二级护理天数:</span> 
+              <div v-if="!ifFile">{{ data.RJHLTS }}</div>
+              <!-- <div v-if="ifFile"> <el-input v-model="data.AEG02C" placeholder="请输入内容"></el-input></div> -->
+              </div>
+              </td>
+              <td class="table-value" colspan="5" ref="SJHLTS">
+              <div class="flexTable">
+              <span style="padding-right:10px;">三级护理天数:</span> 
+              <div v-if="!ifFile">{{ data.SJHLTS }}</div>
+              <!-- <div v-if="ifFile"> <el-input v-model="data.AEG02C" placeholder="请输入内容"></el-input></div> -->
+              </div>
+              </td>
+            </tr>
+              <tr>
+                <td class="table-value" colspan="24" ref="AEM01C">
+              <div class="flexTable">
+              <span style="padding-right:10px;">离院方式:</span> 
+              <div v-if="!ifFile">{{ data.AEM01C }}</div>
+              <div v-if="ifFile"> <el-input v-model="data.AEM01C" placeholder="请输入内容"></el-input></div></div>
+              </td>
+            </tr>
+             <tr>
+              <td class="table-value" colspan="24" ref="AEM03C">
+              <div class="flexTable">
+              <span style="padding-right:10px;">是否有出院31天内再住院计划:</span> 
+              <div v-if="!ifFile">{{ data.AEM03C }}</div>
+              <div v-if="ifFile"> <el-input v-model="data.AEM03C" placeholder="请输入内容"></el-input></div></div>
+              </td>
+            </tr>
+            <tr>
+              <td class="table-value" colspan="10" ref="AEE03">
+              <div class="flexTable">
+              <span style="padding-right:10px;">主诊医师姓名:</span> 
+              <div v-if="!ifFile">{{ data.AEE03 }}</div>
+              <div v-if="ifFile"> <el-input v-model="data.AEE03" placeholder="请输入内容"></el-input></div>
+              </div>
+              </td>
+              <td class="table-value" colspan="10" ref="ZZYSDM">
+              <div class="flexTable">
+              <span style="padding-right:10px;">主诊医师代码:</span> 
+              <div v-if="!ifFile">{{ data.ZZYSDM }}</div>
+              <!-- <div v-if="ifFile"> <el-input v-model="data.AEM03C" placeholder="请输入内容"></el-input></div> -->
+              </div>
+              </td>
+            </tr>
+            <tr>
+              <td class="table-value" colspan="10" ref="AEE10">
+              <div class="flexTable">
+              <span style="padding-right:10px;">责任护士姓名:</span> 
+              <div v-if="!ifFile">{{ data.AEE10 }}</div>
+              <div v-if="ifFile"> <el-input v-model="data.AEE10" placeholder="请输入内容"></el-input></div></div>
+              </td>
+              <td class="table-value" colspan="10" ref="ZRHSDM">
+              <div class="flexTable">
+              <span style="padding-right:10px;">责任护士代码:</span> 
+              <div v-if="!ifFile">{{ data.ZRHSDM }}</div>
+              <!-- <div v-if="ifFile"> <el-input v-model="data.AEM03C" placeholder="请输入内容"></el-input></div> -->
+              </div>
+              </td>
+            </tr>
+          </table>
+        </div>
+
+        <div class="TableHead">四.医疗收费信息</div>
+        <!--  -->
+          <!--  -->
+          <div class="table">
+          <table>
+            <tr>
+              <td class="table-value" colspan="1">
+              <div v-if="!ifFile" class="flexTable"> <span class="flexBlockText" style="padding-right:10px;width:150px;">
+                业务流水号:</span> {{ data.AEM03C }}</div>
+              <div v-if="ifFile" class="flexTable"><span  class="flexBlockText">业务流水号:</span> 
+               <!-- <el-input style="width:200px;" v-model="data.AEM03C" placeholder="请输入内容"></el-input> -->
+               </div>
+              <div v-if="!ifFile" class="flexTable"> <span  class="flexBlockText">票据代码:</span> {{ data.AEM03C }}</div>
+              <div v-if="ifFile" class="flexTable">  <span  class="flexBlockText">票据代码:</span>
+              <!-- <el-input style="width:200px;" v-model="data.AEM03C" placeholder="请输入内容"></el-input> -->
+              </div>
+              <div v-if="!ifFile" class="flexTable"> <span  class="flexBlockText">票据号码:</span> {{ data.AEM03C }}</div>
+              <div v-if="ifFile" class="flexTable">  <span  class="flexBlockText">票据号码:</span>
+              <!-- <el-input style="width:200px;" v-model="data.AEM03C" placeholder="请输入内容"></el-input> -->
+              </div>
+              </td>
+              <td class="table-value" colspan="6">
+                <div class="flexTable">
+              <span style="padding-right:10px;">结算期间</span> 
+              <div v-if="!ifFile">{{ data.JSQJ }}</div>
+              <!-- <div v-if="ifFile"> <el-input v-model="data.AEM03C" placeholder="请输入内容"></el-input></div> -->
+              </div>
+              </td>
+            </tr>
+            <tr>
+              <td class="table-value" colspan="1" ref="XMMC">
+              <div class="flexTable">
+              <span style="padding-right:10px;">项目名称:</span> 
+             </div>
+              </td>
+              <td class="table-value" colspan="1" ref="JE">
+              <div class="flexTable">
+              <span style="padding-right:10px;">金额:</span> 
+             </div>
+              </td>
+              <td class="table-value" colspan="1" ref="JL">
+              <div class="flexTable">
+              <span style="padding-right:10px;">甲类:</span> 
+             </div>
+              </td>
+              <td class="table-value" colspan="1" ref="YL">
+              <div class="flexTable">
+              <span style="padding-right:10px;">乙类:</span> 
+             </div>
+              </td>
+              <td class="table-value" colspan="1" ref="ZF">
+              <div class="flexTable">
+              <span style="padding-right:10px;">自费:</span> 
+             </div>
+              </td>
+              <td class="table-value" colspan="1" ref="D34">
+              <div class="flexTable">
+              <span style="padding-right:10px;">其他:</span> 
+             </div>
+              </td>
+            </tr>
+            <tr v-for="(item, index) in data.main_operation" :key="index">
+              <td class="table-valueon"  colspan="1" >
+                <p class="FA6400">床位费:</p>
+              </td>
+              <td class="table-valueon FA6400"  colspan="1" ></td>
+              <td class="table-valueon"  colspan="1" ></td>
+              <td class="table-valueon"  colspan="1" ></td>
+              <td class="table-valueon"  colspan="1" ></td>
+              <td class="table-valueon"  colspan="1" ></td> 
+            </tr>
+            <tr v-for="(item, index) in data.main_operation" :key="index">
+              <td class="table-valueon"  colspan="1" >
+                <p class="FA6400">诊查费:</p>
+              </td>
+              <td class="table-valueon FA6400"  colspan="1" ></td>
+              <td class="table-valueon"  colspan="1" ></td>
+              <td class="table-valueon"  colspan="1" ></td>
+              <td class="table-valueon"  colspan="1" ></td>
+              <td class="table-valueon"  colspan="1" ></td> 
+            </tr>
+            <tr v-for="(item, index) in data.main_operation" :key="index">
+              <td class="table-valueon"  colspan="1" >
+                <p class="FA6400">检查费:</p>
+              </td>
+              <td class="table-valueon FA6400"  colspan="1" ></td>
+              <td class="table-valueon"  colspan="1" ></td>
+              <td class="table-valueon"  colspan="1" ></td>
+              <td class="table-valueon"  colspan="1" ></td>
+              <td class="table-valueon"  colspan="1" ></td> 
+            </tr>
+            <tr v-for="(item, index) in data.main_operation" :key="index">
+              <td class="table-valueon"  colspan="1" >
+                <p class="FA6400">化验费:</p>
+              </td>
+              <td class="table-valueon FA6400"  colspan="1" ></td>
+              <td class="table-valueon"  colspan="1" ></td>
+              <td class="table-valueon"  colspan="1" ></td>
+              <td class="table-valueon"  colspan="1" ></td>
+              <td class="table-valueon"  colspan="1" ></td> 
+            </tr>
+
+            <tr v-for="(item, index) in data.main_operation" :key="index">
+              <td class="table-valueon"  colspan="1" >
+                <p class="FA6400">治疗费:</p>
+              </td>
+              <td class="table-valueon FA6400"  colspan="1" >{{data.D19X01}}</td>
+              <td class="table-valueon"  colspan="1" ></td>
+              <td class="table-valueon"  colspan="1" ></td>
+              <td class="table-valueon"  colspan="1" ></td>
+              <td class="table-valueon"  colspan="1" ></td> 
+            </tr>
+
+            <tr v-for="(item, index) in data.main_operation" :key="index">
+              <td class="table-valueon"  colspan="1" >
+                <p class="FA6400">手术费:</p>
+              </td>
+              <td class="table-valueon FA6400"  colspan="1" >{{data.D20X02}}</td>
+              <td class="table-valueon"  colspan="1" ></td>
+              <td class="table-valueon"  colspan="1" ></td>
+              <td class="table-valueon"  colspan="1" ></td>
+              <td class="table-valueon"  colspan="1" ></td> 
+            </tr>
+            <tr v-for="(item, index) in data.main_operation" :key="index">
+              <td class="table-valueon"  colspan="1" >
+                <p class="FA6400">护理费:</p>
+              </td>
+              <td class="table-valueon FA6400"  colspan="1" >{{data.D13}}</td>
+              <td class="table-valueon"  colspan="1" ></td>
+              <td class="table-valueon"  colspan="1" ></td>
+              <td class="table-valueon"  colspan="1" ></td>
+              <td class="table-valueon"  colspan="1" ></td> 
+            </tr>
+            <tr v-for="(item, index) in data.main_operation" :key="index">
+              <td class="table-valueon"  colspan="1" >
+                <p class="FA6400">卫生材料费:</p>
+              </td>
+              <td class="table-valueon FA6400"  colspan="1" ></td>
+              <td class="table-valueon"  colspan="1" ></td>
+              <td class="table-valueon"  colspan="1" ></td>
+              <td class="table-valueon"  colspan="1" ></td>
+              <td class="table-valueon"  colspan="1" ></td> 
+            </tr>
+            <tr v-for="(item, index) in data.main_operation" :key="index">
+              <td class="table-valueon"  colspan="1" >
+                <p class="FA6400">西药费:</p>
+              </td>
+              <td class="table-valueon FA6400"  colspan="1" >{{data.D23}}</td>
+              <td class="table-valueon"  colspan="1" ></td>
+              <td class="table-valueon"  colspan="1" ></td>
+              <td class="table-valueon"  colspan="1" ></td>
+              <td class="table-valueon"  colspan="1" ></td> 
+            </tr>
+            <tr v-for="(item, index) in data.main_operation" :key="index">
+              <td class="table-valueon"  colspan="1" >
+                <p class="FA6400">中药饮片费:</p>
+              </td>
+              <td class="table-valueon FA6400"  colspan="1" ></td>
+              <td class="table-valueon"  colspan="1" ></td>
+              <td class="table-valueon"  colspan="1" ></td>
+              <td class="table-valueon"  colspan="1" ></td>
+              <td class="table-valueon"  colspan="1" ></td> 
+            </tr>
+            <tr v-for="(item, index) in data.main_operation" :key="index">
+              <td class="table-valueon"  colspan="1" >
+                <p class="FA6400">中成药费:</p>
+              </td>
+              <td class="table-valueon FA6400"  colspan="1" >{{data.D24}}</td>
+              <td class="table-valueon"  colspan="1" ></td>
+              <td class="table-valueon"  colspan="1" ></td>
+              <td class="table-valueon"  colspan="1" ></td>
+              <td class="table-valueon"  colspan="1" ></td> 
+            </tr>
+            <tr v-for="(item, index) in data.main_operation" :key="index">
+              <td class="table-valueon"  colspan="1" >
+                <p class="FA6400">一般诊疗费:</p>
+              </td>
+              <td class="table-valueon FA6400"  colspan="1" ></td>
+              <td class="table-valueon"  colspan="1" ></td>
+              <td class="table-valueon"  colspan="1" ></td>
+              <td class="table-valueon"  colspan="1" ></td>
+              <td class="table-valueon"  colspan="1" ></td> 
+            </tr>
+            <tr v-for="(item, index) in data.main_operation" :key="index">
+              <td class="table-valueon"  colspan="1" >
+                <p class="FA6400">挂号费:</p>
+              </td>
+              <td class="table-valueon FA6400"  colspan="1" ></td>
+              <td class="table-valueon"  colspan="1" ></td>
+              <td class="table-valueon"  colspan="1" ></td>
+              <td class="table-valueon"  colspan="1" ></td>
+              <td class="table-valueon"  colspan="1" ></td> 
+            </tr>
+            <tr v-for="(item, index) in data.main_operation" :key="index">
+              <td class="table-valueon"  colspan="1" >
+                <p class="FA6400">其他费:</p>
+              </td>
+              <td class="table-valueon FA6400"  colspan="1" >{{data.D34}}</td>
+              <td class="table-valueon"  colspan="1" ></td>
+              <td class="table-valueon"  colspan="1" ></td>
+              <td class="table-valueon"  colspan="1" ></td>
+              <td class="table-valueon"  colspan="1" ></td> 
+            </tr>
+            <tr v-for="(item, index) in data.main_operation" :key="index">
+              <td class="table-valueon"  colspan="1" >
+                <p class="FA6400">XX(按病种收费名称+代码):</p>
+              </td>
+              <td class="table-valueon FA6400"  colspan="1" ></td>
+              <td class="table-valueon"  colspan="1" ></td>
+              <td class="table-valueon"  colspan="1" ></td>
+              <td class="table-valueon"  colspan="1" ></td>
+              <td class="table-valueon"  colspan="1" ></td> 
+            </tr>
+            <tr v-for="(item, index) in data.main_operation" :key="index">
+              <td class="table-valueon"  colspan="1" >
+                <p class="FA6400">金额合计:</p>
+              </td>
+              <td class="table-valueon FA6400"  colspan="1" ></td>
+              <td class="table-valueon"  colspan="1" ></td>
+              <td class="table-valueon"  colspan="1" ></td>
+              <td class="table-valueon"  colspan="1" ></td>
+              <td class="table-valueon"  colspan="1" ></td> 
+            </tr>
+            <tr>
+              <td class="table-value" colspan="24" ref="YBZFFS">
+              <div class="flexTable">
+              <span style="padding-right:10px;">医保支付方式:</span> 
+              <div v-if="!ifFile">{{ data.YBZFFS }}</div>
+              <!-- <div v-if="ifFile"> <el-input v-model="data.YBZFFS" placeholder="请输入内容"></el-input></div> -->
+              </div>
+              </td>
+            </tr>
+            <tr>
+              <td class="table-value" colspan="3" ref="TCJJ">
+               <div style="width:100%;text-align:left;height:40px;line-height:40px;font-weight: bold;">医保统筹基金支付</div>
+
+              <div class="flexTable">
+                <div style="margin-right:25px;font-weight: bold;">补充医疗保险支付</div>
+                <div>
+                  <div class="flexTable">
+                    <span style="padding-right:10px;">职工大额补助:</span> 
+              <div v-if="!ifFile">{{ data.ZGDeBZ }}</div>
+              <!-- <div v-if="ifFile"> <el-input v-model="data.AEM03C" placeholder="请输入内容"></el-input></div> -->
+                  </div>
+                  <div class="flexTable">
+                    <span style="padding-right:10px;">居民大病保险:</span> 
+              <div v-if="!ifFile">{{ data.JMDBBX }}</div>
+              <!-- <div v-if="ifFile"> <el-input v-model="data.AEM03C" placeholder="请输入内容"></el-input></div> -->
+                  </div>
+                  <div class="flexTable">
+                    <span style="padding-right:10px;">公务员医疗补助:</span> 
+              <div v-if="!ifFile">{{ data.GWYYLBZ }}</div>
+              <!-- <div v-if="ifFile"> <el-input v-model="data.AEM03C" placeholder="请输入内容"></el-input></div> -->
+                  </div>
+                </div>
+            </div>
+              </td>
+              <td class="table-value" colspan="5" ref="ADA0101">
+              <div class="flexTable">
+                <div style="margin-right:25px;font-weight: bold;">个人负担</div>
+                <div>
+                  <div class="flexTable" style="border-bottom:1px solid #f5f5f5;">
+                    <span style="padding-right:10px;">个人自付:</span> 
+              <div v-if="!ifFile">{{ data.GRZF }}</div>
+              <!-- <div v-if="ifFile"> <el-input v-model="data.AEM03C" placeholder="请输入内容"></el-input></div> -->
+                  </div>
+                  <div class="flexTable">
+                    <span style="padding-right:10px;">个人自费:</span> 
+              <div v-if="!ifFile">{{ data.ADA0101 }}</div>
+              <!-- <div v-if="ifFile"> <el-input v-model="data.AEM03C" placeholder="请输入内容"></el-input></div> -->
+                  </div>
+                </div>
+            </div>
+              </td>
+            </tr>
+            <tr>
+              <td class="table-value" colspan="3" ref="SYBX">
+               <div style="width:100%;text-align:left;height:40px;line-height:40px;font-weight: bold;">医保统筹基金支付</div>
+
+              <div class="flexTable">
+                <div style="margin-right:25px;font-weight: bold;">医疗救助支付</div>
+                <div>
+                  <div class="flexTable">
+                    <span style="padding-right:10px;">企业补充:</span> 
+              <div v-if="!ifFile">{{ data.QYBC }}</div>
+              <!-- <div v-if="ifFile"> <el-input v-model="data.AEM03C" placeholder="请输入内容"></el-input></div> -->
+                  </div>
+                  <div class="flexTable">
+                    <span style="padding-right:10px;">商业保险:</span> 
+              <div v-if="!ifFile">{{ data.SYBX }}</div>
+              <!-- <div v-if="ifFile"> <el-input v-model="data.AEM03C" placeholder="请输入内容"></el-input></div> -->
+                  </div>
+                  <div class="flexTable">
+                    <span style="padding-right:10px;">....:</span> 
+              <div v-if="!ifFile">{{ data.WZ }}</div>
+              <!-- <div v-if="ifFile"> <el-input v-model="data.AEM03C" placeholder="请输入内容"></el-input></div> -->
+                  </div>
+                </div>
+            </div>
+              </td>
+              <td class="table-value" colspan="5" ref="GRZF">
+              <div class="flexTable">
+                <div style="margin-right:25px;font-weight: bold;">个人支付</div>
+                <div>
+                  <div class="flexTable" style="border-bottom:1px solid #f5f5f5;">
+                    <span style="padding-right:10px;">个人账户支付:</span> 
+              <div v-if="!ifFile">{{ data.GRZHZF }}</div>
+              <!-- <div v-if="ifFile"> <el-input v-model="data.AEM03C" placeholder="请输入内容"></el-input></div> -->
+                  </div>
+                  <div class="flexTable">
+                    <span style="padding-right:10px;">个人现金支付:</span> 
+              <div v-if="!ifFile">{{ data.GRXJZF }}</div>
+              <!-- <div v-if="ifFile"> <el-input v-model="data.AEM03C" placeholder="请输入内容"></el-input></div> -->
+                  </div>
+                </div>
+            </div>
+              </td>
+            </tr>
+            <tr>
+              <td class="table-value" colspan="2" ref="BM">
+              <div class="flexTable">
+              <span style="padding-right:10px;">定点医疗机构填报部门:</span> 
+              <div v-if="!ifFile">{{ data.BM }}</div>
+              <!-- <div v-if="ifFile"> <el-input v-model="data.AEM03C" placeholder="请输入内容"></el-input></div>--></div> 
+              </td>
+              <td class="table-value" colspan="2" ref="JG">
+              <div class="flexTable">
+              <span style="padding-right:10px;">医保经办机构:</span> 
+              <div v-if="!ifFile">{{ data.JG }}</div>
+              <!-- <div v-if="ifFile"> <el-input v-model="data.AEM03C" placeholder="请输入内容"></el-input></div> --></div>
+              </td>
+              <td class="table-value" colspan="5" ref="DM">
+              <div class="flexTable">
+              <span style="padding-right:10px;">代码:</span> 
+              <div v-if="!ifFile">{{ data.DM }}</div>
+              <!-- <div v-if="ifFile"> <el-input v-model="data.AEM03C" placeholder="请输入内容"></el-input></div> --></div>
+              </td>
+            </tr>
+            <tr>
+              <td class="table-value" colspan="2" ref="TYBR">
+              <div class="flexTable">
+              <span style="padding-right:10px;">定点医疗机构填报人:</span> 
+              <div v-if="!ifFile">{{ data.TYBR }}</div>
+              <!-- <div v-if="ifFile"> <el-input v-model="data.AEM03C" placeholder="请输入内容"></el-input></div> --></div>
+              </td>
+              <td class="table-value" colspan="2" ref="JBR">
+              <div class="flexTable">
+              <span style="padding-right:10px;">医保机构经办人:</span> 
+              <div v-if="!ifFile">{{ data.JBR }}</div>
+              <!-- <div v-if="ifFile"> <el-input v-model="data.AEM03C" placeholder="请输入内容"></el-input></div> --></div>
+              </td>
+              <td class="table-value" colspan="5" ref="DM">
+              <div class="flexTable">
+              <span style="padding-right:10px;">代码:</span> 
+              <div v-if="!ifFile">{{ data.AEM03C }}</div>
+              <!-- <div v-if="ifFile"> <el-input v-model="data.AEM03C" placeholder="请输入内容"></el-input></div> --></div>
+              </td>
+            </tr>
+          </table>
+        </div>
+        <!--  -->
+      </div>
+      <div class="cont-reight">
+        <div class="cont-reight-top">
+          <div class="cont-reight-btn">结算单</div>
+        </div>
+        <!-- 评分 -->
+        <div class="storeBox">
+          <div class="text">{{ score }}</div>
+          <div class="spa">
+            <div class="spaview" v-if="score > 90">优</div>
+            <div class="spaview" v-else-if="score >= 70 && score == 90">良</div>
+            <div class="spaview" v-else>差</div>
+          </div>
+        </div>
+
+        <!-- end -->
+        <!-- 强制 -->
+        <div class="flexNox">
+          <div class="Yradio">
+            <div class="Yradiobox"></div>
+            强制
+          </div>
+          <div class="Rradio">
+            <div class="Rradiobox"></div>
+            建议
+          </div>
+        </div>
+
+        <!-- end -->
+        <div class="cont-reight-bottom" @click="getBlankIndex(item)" v-for="(item, index) in errorList" :key="index">
+        <div v-if="item.category ==0 || item.category == 1" class="cont-reight-bottom-title">
+            <div class="cont-reight-bottom-title-zi">{{item.category==0?'A类':'B类'}}</div>
+            -{{ item.down }}
+          </div>
+          <div v-else class="cont-reight-bottom-title-null">
+            <div class="cont-reight-bottom-title-null-zi">{{item.category==2?'C类':'D类'}}</div>
+            -{{ item.down }}
+          </div>
+          <div class="cont-reight-bottom-conter">
+            <p>原病案:疾病编码:{{ item.error_field }}</p>
+            <p>提示:{{ item.desc }}</p>
+            <p>{{ item.error_name }}</p>
+          </div>
+        </div>
+      </div>
+    </div>
+  </div>
+</template>
+<script>
+// import OtherComponent from '@/components/OtherComponent'
+export default {
+  components: {
+    // OtherComponent
+  },
+  directives: {},
+  filters: {},
+  extends: {},
+  mixins: {},
+  props: {},
+  data() {
+    return {
+      data: '',
+      errorList: [],
+      valData: '',
+      score: 0,
+      source:1,
+      ifFile: false,
+    };
+  },
+  computed: {},
+  watch: {},
+  beforeCreate() {
+    // 生命周期钩子:组件实例刚被创建,组件属性计算之前,如 data 属性等
+  },
+  created() {
+    // 生命周期钩子:组件实例创建完成,属性已绑定,但 DOM 还未生成,el 属性还不存在
+    // 初始化渲染页面
+  },
+  beforeMount() {
+    // 生命周期钩子:模板编译/挂载之前
+  },
+  mounted() {
+    // this.valData = this.storageGet('getData');
+    this.valData = this.storageGet('getData');
+    console.log(this.valData);
+    this.funQuery();
+    // 生命周期钩子:模板编译、挂载之后(此时不保证已在 document 中)
+  },
+  beforeUpate() {
+    // 生命周期钩子:组件更新之前
+  },
+  updated() {
+    // 生命周期钩子:组件更新之后
+  },
+  activated() {
+    // 生命周期钩子:keep-alive 组件激活时调用
+  },
+  deactivated() {
+    // 生命周期钩子:keep-alive 组件停用时调用
+  },
+  beforeDestroy() {
+    // 生命周期钩子:实例销毁前调用
+  },
+  destroyed() {
+    // 生命周期钩子:实例销毁后调用
+  },
+  errorCaptured(err, vm, info) {
+    // 生命周期钩子:当捕获一个来自子孙组件的错误时被调用。此钩子会收到三个参数:错误对象、发生错误的组件实例以及一个包含错误来源信息的字符串。
+    console.log(err, vm, info);
+  },
+  methods: {
+    funNext() {
+      this.data.source=1;
+      this.$axios.post('/medicalRecordEdit', this.data).then(res => {
+        console.log(res);
+        this.$message('修改成功');
+        this.funQuery();
+        this.ifFile = false;
+      });
+    },
+    funEdit() {
+      this.ifFile = true;
+    },
+    getback() {
+      this.$router.go(-1);
+    },
+    /**
+     * 跳转对应病例首页
+     */
+    getBlankIndex(item) {
+      let eleClass = document.querySelectorAll('.choose-twinkle');
+      console.log(eleClass);
+      // const tb = this.$refs.tables.value;
+      console.log(item.error_field);
+      // this.$refs[item.error_field]
+      console.log(this.$refs[item.error_field]);
+      for (let item = 0; item < eleClass.length; item++) {
+        console.log(eleClass[item]);
+        eleClass[item].className = 'table-label';
+      }
+      // return;
+      // document
+      // this.$refs[item.error_field].classList.value + ' choose-twinkle';
+      this.$refs[item.error_field].className = 'choose-twinkle';
+      this.$refs[item.error_field].scrollIntoView({ block: 'start', behavior: 'smooth' });
+      //   .getElementById("agentTitle")
+      //   .scrollIntoView({ block: "start", behavior: "smooth" });
+      // 跳转到指定位置并且平滑滚动
+      // this.$el.querySelector('.table-labelon1').scrollIntoView({ behavior: 'smooth' });
+      // this.$el.querySelector('.table-labelon1').style.color = 'red';
+    },
+
+    funQuery() {
+      let pramse = {
+        id: this.valData,
+      };
+      this.$axios.post('/medical_record', pramse).then(res => {
+        console.log(res);
+        this.data = res.data;
+        this.errorList = res.data.error;
+        this.score = res.data.score;
+      });
+    },
+  },
+};
+</script>
+<style lang="scss" scoped>
+#MyDiv {
+  margin: 0;
+  padding: 0;
+}
+.HeadBoxWidth{
+  width: 300px;
+  text-align: left;
+}
+.flexBlockText{
+  width: 120px;
+  text-align: left;
+  display: inline-block;
+  padding-right: 10px;;
+}
+.flexTable{
+    display: flex;
+    align-items: center;
+  }
+  
+.header {
+  height: 60px;
+  margin: 5px 20px;
+  text-align: right;
+}
+.cont_container {
+  //   margin-top: 60px;
+  display: flex;
+  justify-content: center;
+  //   flex-direction: column;
+  //   align-items: center;
+}
+.TableHead{
+  height: 40px;
+  text-align: center;
+  border: 1px solid #ccc;
+  line-height: 40px;
+  background: cornflowerblue;
+  width:100%;
+  font-weight: bold;
+}
+.cont-left {
+  flex: 1;
+  min-height: 650px;
+  margin: 0 15px;
+  background: #ffffff;
+  border: 1px solid #e2e2e2;
+  padding: 10px;
+}
+.cont-reight {
+  width: 420px;
+  min-height: 650px;
+  background: #ffffff;
+  border: 1px solid #e2e2e2;
+  margin: 0 15px 0 0;
+}
+.cont-title {
+  display: flex;
+  justify-content: space-between;
+  width: 90%;
+  margin: 0 auto;
+  text-align: left;
+  padding:15px 0px;
+  span {
+    padding: 5px;
+  }
+}
+.cont-title-description {
+  margin: 20px;
+  font-size: 24px;
+  font-weight: bold;
+  width: 90%;
+  margin: 0 auto;
+
+  color: #2c3240;
+  //   width: 1200px;
+  text-align: center;
+}
+.cont-edit {
+  margin: 20px;
+  font-weight: bold;
+  color: #2c3240;
+  span {
+    padding: 0 10px;
+    font-size: 14px;
+  }
+}
+.cont-edit-dev {
+  margin: 20px;
+  font-weight: bold;
+  color: #2c3240;
+  display: flex;
+  justify-content: space-between;
+  align-items: center;
+  div {
+    display: flex;
+    // min-width: 300px;
+    align-items: center;
+  }
+  span {
+    white-space: nowrap;
+    padding: 0 10px;
+    font-size: 12px;
+  }
+}
+table {
+  min-width: 1000px;
+  table-layout: fixed;
+  empty-cells: show;
+  border-collapse: collapse;
+  margin: 0 auto;
+  margin-bottom: 30px;
+  td {
+    border: 1px solid #dddddd;
+    // padding-left: 16px;
+    text-align: center;
+    font-size: 12px;
+    box-sizing: border-box;
+  }
+  .table-label {
+    width: 150px;
+    height: 40px;
+    color: #666666;
+    background-color: #f9f9f9;
+  }
+  .table-value {
+    width: 210px;
+    height: 40px;
+    color: #333333;
+    // padding-right: 16px;
+    padding-left:15px;
+    text-align: left;
+  }
+}
+.table-labelon {
+  width: 300px;
+  height: 40px;
+  color: #666666;
+  background-color: #f9f9f9;
+}
+.table-valueon {
+  width: 300px;
+  height: 40px;
+  font-size: 12px;
+  color: #333333;
+  text-align: center;
+  margin: 0;
+  padding: 0;
+}
+.FA6400 {
+  color: #fa6400;
+  font-size: 12px;
+}
+.table-value-p {
+  width: 100%;
+  padding: 5px;
+  display: flex;
+  justify-content: space-around;
+  span {
+    min-width: 200px;
+    font-size: 12px;
+  }
+}
+.cont-reight-top-title {
+  margin-top: 18px;
+  font-size: 22px;
+  font-weight: bold;
+  color: #333333;
+  width: 100%;
+  text-align: center;
+}
+.cont-reight-top-cont {
+  margin: 8px 0 0 20px;
+  p {
+    font-size: 12px;
+    font-weight: bold;
+    color: #333333;
+    padding: 3px 0;
+  }
+}
+.cont-reight-btn {
+  margin-top: 20px;
+  width: 100%;
+  height: 43px;
+  background: #d3e3ff;
+  // border-radius: 8px;
+  font-size: 14px;
+  font-weight: bold;
+  color: #333333;
+  text-align: center;
+  line-height: 43px;
+}
+.cont-reight-bottom {
+  width: 100%;
+  margin: 24px 7px;
+  display: flex;
+}
+
+.cont-reight-bottom-title {
+  width: 60px;
+  height: 70px;
+  background: #ffdfdf;
+  border-right: 3px solid #ff0000;
+  text-align: center;
+  line-height: 88px;
+  font-size: 24px;
+  font-weight: bold;
+  color: #da1515;
+  position: relative;
+}
+
+.cont-reight-bottom-title-zi {
+  // height: 10px;
+  position: absolute;
+  top: 23px;
+  left:15px;
+  font-size:18px ;
+  color: #da1515;
+  line-height: 0px;
+
+}
+.cont-reight-bottom-title-null {
+  width: 60px;
+  height: 70px;
+  background: #FA6400;
+  border-right: 3px solid #FA6400;
+  text-align: center;
+  line-height: 60px;
+  font-size: 24px;
+  font-weight: bold;
+  color: #FF5700;
+  position: relative;
+}
+.cont-reight-bottom-title-null-zi{
+  position: absolute;
+  top: 23px;
+  left:15px;
+  font-size:18px ;
+  color: #FF5700;
+  line-height: 0px;
+}
+.cont-reight-bottom-conter {
+  margin-left: 8px;
+  height: 70px;
+  display: flex;
+  justify-content: space-around;
+  flex-direction: column;
+  p {
+    font-size: 8px;
+    color: #333333;
+  }
+}
+
+//
+.storeBox {
+  width: 300px;
+  height: 80px;
+  line-height: 80px;
+  font-size: 30px;
+  text-align: center;
+  align-items: center;
+  position: relative;
+  margin: 30px auto;
+  border: 1px solid #ccc;
+  .text {
+    font-size: 30px;
+  }
+  .spa::before {
+    content: '';
+    width: 0;
+    height: 0;
+    border: 30px solid transparent;
+    border-right: 30px solid red;
+    -webkit-transform: rotate(135deg);
+    transform: rotate(135deg);
+    color: #fff;
+    position: absolute;
+    right: -30px;
+    top: -30px;
+    cursor: pointer;
+  }
+
+  .spaview {
+    position: absolute;
+    right: 5px;
+    top: -1px;
+    font-size: 13px;
+    text-align: right;
+    height: 30px;
+    line-height: 30px;
+    width: 100px;
+    color: #fff;
+  }
+}
+.flexNox {
+  width: 300px;
+  display: flex;
+  margin: 0 auto;
+  justify-content: center;
+  align-items: center;
+  .Yradiobox {
+    width: 10px;
+    background: red;
+    margin-right: 5px;
+    height: 10px;
+    border-radius: 50%;
+  }
+  .Rradiobox {
+    width: 10px;
+    background: #fa6400;
+    height: 10px;
+    margin-right: 5px;
+    border-radius: 50%;
+  }
+  .Yradio {
+    width: 80px;
+    display: flex;
+    align-items: center;
+    text-align: center;
+  }
+  .Rradio {
+    width: 80px;
+    display: flex;
+    align-items: center;
+    text-align: center;
+  }
+}
+.width150 {
+  width: 70px !important;
+}
+.width1000 {
+  width: 150px !important;
+}
+.width200 {
+  width: 200px !important;
+}
+.width100 {
+  // width: 1000px;
+  width: 100%;
+  height: 100%;
+  border-top: 0;
+}
+.width170 {
+  width: 170px;
+}
+.choose-twinkle {
+  // background: red;
+  font-size: 20px;
+  color: red;
+  font-weight: 600;
+  background: yellow;
+}
+</style>

+ 286 - 0
src/views/SettlementList/StatementList.vue

@@ -0,0 +1,286 @@
+<template>
+  <div class="dashboard-container">
+    <div class="tableBox">
+      <div class="block">
+        <div class="blockCon">
+          <div class="selectDns"></div>
+          <el-input v-model="formData.recordNum" class="width150" placeholder="病案号"></el-input>
+          <span class="kong"></span>
+          <el-date-picker v-model="formData.startTime" type="date" format="yyyy 年 MM 月 dd 日" value-format="yyyyMMdd" placeholder="开始日期"></el-date-picker>
+
+          <el-date-picker
+            v-model="formData.endTime"
+            type="date"
+            style="margin-left: 10px"
+            format="yyyy 年 MM 月 dd 日"
+            value-format="yyyyMMdd"
+            placeholder="结束日期"
+          ></el-date-picker>
+          <span class="kong"></span>
+          <!-- <el-input class="ins" placeholder="请输入内容"></el-input> -->
+          <el-button class="sc" @click="funQuery">查询</el-button>
+          <!-- <el-button class="btn1" @click="reset">重置条件</el-button> -->
+
+          <el-button class="btn1" @click="goto('/SettlementList/StatementListquery')">更多查询条件</el-button>
+          <el-button class="sc" type="primary">导出Excel表格</el-button>
+        </div>
+      </div>
+      <Title :title="'医保结算单病案数量'" />
+      <el-table :data="tableData" style="width: 100%" border>
+        <el-table-column type="index" label="序号"></el-table-column>
+        <el-table-column prop="AAA30" label="住院号"></el-table-column>
+        <el-table-column prop="AAA28" label="病案号">
+          <template slot-scope="scope">
+            <span class="blue" @click="funGoto(scope.row.MED_REC_ID)">
+              <template>
+                <div>
+                  {{ scope.row.AAA28 }}
+                </div>
+              </template>
+            </span>
+          </template>
+        </el-table-column>
+        <el-table-column prop="AAA01" label="患者姓名"></el-table-column>
+        <el-table-column prop="AAA02C" label="性别"></el-table-column>
+        <el-table-column prop="AAA04" label="年龄"></el-table-column>
+        <el-table-column prop="AAA29" label="住院次数"></el-table-column>
+          <el-table-column prop="AAA26C" label="医保类型"></el-table-column>
+        <el-table-column prop="AAC11N" label="出院科室"></el-table-column>
+        <el-table-column prop="ADA01" label="总费用"></el-table-column>
+        <el-table-column prop="ICD9_NAME" label="主诊断"></el-table-column>
+        <el-table-column prop="AAC04" label="实际住院(天)"></el-table-column>
+        <el-table-column prop="ATTEND_GRP_NAME" label="主诊组"></el-table-column>
+        <!-- <el-table-column prop="address" label="责任医生"> </el-table-column> -->
+        <el-table-column prop="AEM01C" label="离院方式"></el-table-column>
+        <el-table-column prop="AAB06C" label="入院途径"></el-table-column>
+      </el-table>
+      <!-- 分页控制 -->
+      <mPagination v-if="tableData && tableData.length !== 0" :data="paginationData" @pageChangeEvent="pageHasChanged"></mPagination>
+    </div>
+  </div>
+</template>
+
+<script>
+import Title from '@/components/Title';
+import { mapGetters } from 'vuex';
+import mPagination from '@/components/m-pagination';
+
+export default {
+  name: 'Dashboard',
+  components: {
+    Title,
+    mPagination,
+  },
+  computed: {
+    ...mapGetters(['name']),
+  },
+  data() {
+    return {
+      formData: {
+        rangeDate: [],
+        recordNum: '',
+      },
+      tableData: [],
+      // 分页数据
+      paginationData: {
+        total: 10,
+        currentPage: 1,
+        pageSize: 10,
+      },
+    };
+  },
+  mounted() {
+    this.funQuery();
+  },
+  methods: {
+    funGoto(val) {
+      this.storageSet('getData', val);
+      this.goto('SetDetails');
+    },
+    funDel() {
+      this.formData1.seniorList.pop();
+    },
+    funAdd() {
+      this.formData1.seniorList.push({
+        key: '',
+        value: '',
+        type: '1',
+      });
+    },
+    pageHasChanged() {
+      this.funQuery();
+    },
+    funQuery() {
+      //查询
+      let pramse = {
+        source:1,
+        AAC01: this.formData.rangeDate, //出院时间
+        AAA28: this.formData.recordNum,
+        page: this.paginationData.currentPage, //页码
+        limit: this.paginationData.pageSize, //条数
+      };
+      this.$axios.post('/qualityList', pramse).then(res => {
+        console.log(res);
+        this.paginationData.total = res.data.count;
+        this.tableData = res.data.list;
+      });
+    },
+    reset() {
+      // 重置数据
+      if (this.choice == 0) {
+        Object.assign(this.$data.formData, this.$options.data().formData);
+      } else {
+        Object.assign(this.$data.formData, this.$options.data().formData);
+      }
+    },
+  },
+};
+</script>
+<style scoped>
+::v-deep.el-pagination.is-background .btn-next,
+::v-deep.el-pagination.is-background .btn-prev,
+::v-deep.el-pagination.is-background .el-pager li {
+  margin: 0 5px;
+  background-color: #fff;
+  color: #606266;
+  min-width: 30px;
+  border-radius: 2px;
+  border: 1px solid #dfe3f3;
+  line-height: 27px;
+}
+::v-deep.el-pagination.is-background .el-pager li:not(.disabled).active {
+  background: #7e8bab;
+}
+::v-deep.el-table .el-table__row td {
+  color: #7e8bab;
+  border-bottom: 1px solid #f4f4f4;
+}
+::v-deep.el-table .el-table__header tr th:first-child {
+  border-radius: 10px 0px 0px 10px;
+}
+::v-deep.el-table .el-table__header tr th:last-child {
+  border-radius: 0px 10px 10px 0px;
+}
+::v-deep.el-table .el-table__header tr th {
+  background: #f1f6ff;
+  color: #13171e;
+  border-bottom: 0px;
+}
+</style>
+<style lang="scss" scoped>
+.tableBox {
+  background: #fff;
+  padding: 19px;
+  border-radius: 5px;
+  font-size: 12px;
+}
+.block {
+  background: #fff;
+  border-radius: 5px;
+  margin-bottom: 16px;
+  padding: 20px 30px;
+  margin-bottom: 20px;
+  .fBtn {
+    display: flex;
+    align-items: center;
+    justify-content: center;
+    .btn1 {
+      background: #185da6;
+      color: #fff;
+    }
+    .btn2 {
+      color: #185da6;
+      background: #d5e4ff;
+    }
+  }
+  .bnh {
+    margin-bottom: 20px;
+  }
+  .barBtn {
+    display: flex;
+    align-items: center;
+    justify-content: center;
+  }
+  .selects {
+    width: 100%;
+  }
+  .rowsa {
+    margin-bottom: 20px;
+  }
+}
+.tableBox {
+  background: #fff;
+  padding: 19px;
+  border-radius: 5px;
+}
+.dashboard {
+  &-container {
+    margin: 30px;
+  }
+  &-text {
+    font-size: 30px;
+    line-height: 46px;
+  }
+}
+.pind {
+  padding: 0 20px;
+}
+.pind10 {
+  padding: 0 5px;
+}
+.width150 {
+  width: 200px;
+}
+.width300 {
+  width: 295px;
+}
+.width500 {
+  width: 645px;
+}
+.width90 {
+  width: 90px;
+}
+.blue {
+  color: #185da6;
+}
+.block {
+  background: #fff;
+  display: flex;
+  align-items: center;
+  border-radius: 5px;
+  height: 75px;
+  margin-bottom: 16px;
+  padding-left: 34px;
+  margin-bottom: 20px;
+  margin-bottom: 20px;
+  .blockCon {
+    display: flex;
+    align-items: center;
+    .selectDns {
+      span {
+        margin-right: 5px;
+      }
+    }
+    .demonstration {
+      margin-left: 10px;
+    }
+    .pickers {
+      margin-left: 5px;
+    }
+    .lsxd {
+      margin-left: 20px;
+    }
+    .ins {
+      width: 150px;
+      margin: 0 10px;
+    }
+  }
+  .sc {
+    background: #185da6;
+    color: #fff;
+  }
+}
+.kong {
+  padding: 0 10px;
+}
+</style>

+ 455 - 0
src/views/SettlementList/StatementListquery.vue

@@ -0,0 +1,455 @@
+<template>
+  <div class="dashboard-container">
+    <div class="block">
+      <div class="barBtn">
+        <el-radio-group v-model="choice" class="bnts" size="medium">
+          <el-radio-button label="0">普通检索</el-radio-button>
+          <el-radio-button label="1">高级检索</el-radio-button>
+        </el-radio-group>
+      </div>
+      <div class="bnh">
+        <el-input v-if="choice == 0" style="width: 303px" placeholder="全站搜索病案号" suffix-icon="el-icon-search" v-model="inputOn"></el-input>
+      </div>
+      <div class="inputs" v-if="choice == 0">
+        <el-row :gutter="20" class="rowsa">
+          <el-col :span="4">
+            <div class="grid-content bg-purple">
+              <el-input class="inpus" v-model="formData0.recordNum" placeholder="病案号"></el-input>
+            </div>
+          </el-col>
+          <el-col :span="5">
+            <div class="grid-content bg-purple">
+              <el-select v-model="formData0.Department" class="selects" placeholder="出院科室">
+                <el-option v-for="(item, index) in departmentList" :label="item.name" :value="item.id" :key="index"></el-option>
+              </el-select>
+            </div>
+          </el-col>
+          <el-col :span="5">
+            <div class="grid-content bg-purple">
+              <el-select v-model="formData0.problem" class="selects" placeholder="问题属性">
+                <el-option v-for="(item, index) in levelList" :label="item.name" :value="item.id" :key="index"></el-option>
+              </el-select>
+            </div>
+          </el-col>
+          <el-col :span="5">
+            <div class="grid-content bg-purple">
+              <el-select v-model="formData0.payment" class="selects" placeholder="医疗付款方式">
+                <el-option v-for="(item, index) in payList" :label="item.name" :value="item.id" :key="index"></el-option>
+              </el-select>
+            </div>
+          </el-col>
+          <el-col :span="5">
+            <div class="grid-content bg-purple">
+              <el-select v-model="formData0.medicalRecord" class="selects" placeholder="全部病案">
+                <el-option label="已质控" value="1"></el-option>
+                <el-option label="未质控" value="0"></el-option>
+              </el-select>
+            </div>
+          </el-col>
+        </el-row>
+        <el-row :gutter="20" class="rowsa">
+          <el-col :span="4">
+            <div class="grid-content bg-purple">
+              <el-select v-model="formData0.state" class="selects" placeholder="编辑状态">
+                <!-- statusList -->
+                <el-option v-for="(item, index) in statusList" :label="item.name" :value="item.id" :key="index"></el-option>
+              </el-select>
+            </div>
+          </el-col>
+          <el-col :span="10">
+            <div class="grid-content bg-purple">
+              <el-date-picker
+                style="width: 100%"
+                v-model="formData0.rangeDate"
+                size="large"
+                type="daterange"
+                range-separator="-"
+                start-placeholder="开始日期"
+                end-placeholder="结束日期"
+                format="yyyy 年 MM 月 dd 日"
+                value-format="yyyyMMdd"
+              >
+              </el-date-picker>
+              <!-- <el-date-picker v-model="formData0.startTime" type="date" format="yyyy 年 MM 月 dd 日" value-format="yyyyMMdd" placeholder="开始日期"></el-date-picker>
+              <el-date-picker
+                v-model="formData0.endTime"
+                type="date"
+                style="margin-left: 10px"
+                format="yyyy 年 MM 月 dd 日"
+                value-format="yyyyMMdd"
+                placeholder="结束日期"
+              ></el-date-picker> -->
+            </div>
+          </el-col>
+          <el-col :span="5">
+            <div class="grid-content bg-purple">
+              <el-select v-model="formData0.Coder" class="selects" placeholder="编码员">
+                <el-option v-for="(item, index) in coderList" :label="item.name" :value="item.id" :key="index"></el-option>
+              </el-select>
+            </div>
+          </el-col>
+          <el-col :span="5">
+            <div class="grid-content bg-purple">
+              <!-- <el-select
+                v-model="formData0.Coder"
+                class="selects"
+                placeholder="住院医师"
+              >
+                <el-option label="出院科室" value="i出院科室"> </el-option>
+              </el-select> -->
+            </div>
+          </el-col>
+        </el-row>
+        <!-- <div class="fBtn">
+          <el-button class="btn1" @click="reset">重置条件</el-button>
+          <el-button class="btn2" @click="funQuery">检索</el-button>
+        </div> -->
+      </div>
+      <div class="barBtn" v-else>
+        <el-form ref="form" :model="formData1" label-width="100px">
+          <el-form-item v-for="(item, index) in formData1.seniorList" :key="index">
+            <el-select class="width150" v-model="item.key" placeholder="请选择入院病情">
+              <!-- fieldList -->
+              <el-option v-for="(item, index) in fieldList" :label="item.name" :value="item.id" :key="index"></el-option>
+            </el-select>
+            <span class="pind10"></span>
+
+            <el-input class="width150" v-model="item.value" placeholder=""></el-input>
+            <span class="pind10"></span>
+
+            <el-select class="width90" v-model="item.type" placeholder="">
+              <el-option label="精确" value="1"></el-option>
+              <el-option label="模糊" value="0"></el-option>
+            </el-select>
+            <span class="pind10"></span>
+            <span v-if="index == 0">
+              <el-button :disabled="formData1.seniorList.length == 1" type="primary" icon="el-icon-minus" @click="funDel"></el-button>
+              <el-button type="primary" icon="el-icon-plus" @click="funAdd"></el-button>
+            </span>
+          </el-form-item>
+          <el-form-item label="患者年龄">
+            <el-input class="width300" v-model="formData1.ageday" :min="28" :max="365" type="number" placeholder="<28天" @blur="funBlur">
+              <template slot="append">天</template>
+            </el-input>
+            <span class="pind">或</span>
+            <el-input class="width300" v-model="formData1.ageyear" :min="1" :max="150" type="number" placeholder="1-150岁" @blur="funBlur">
+              <template slot="append">岁</template>
+            </el-input>
+          </el-form-item>
+          <el-form-item label="时间范围">
+            <el-date-picker
+              class="width500"
+              v-model="formData1.rangeDate"
+              size="large"
+              type="daterange"
+              range-separator="-"
+              start-placeholder="开始日期"
+              end-placeholder="结束日期"
+              format="yyyy 年 MM 月 dd 日"
+              value-format="yyyyMMdd"
+            ></el-date-picker>
+          </el-form-item>
+        </el-form>
+      </div>
+      <div class="fBtn">
+        <el-button class="btn1" @click="reset">重置条件</el-button>
+        <el-button class="btn2" @click="funQuery">检索</el-button>
+      </div>
+    </div>
+    <div class="tableBox">
+      <Title :title="'病案列表'" />
+      <el-table :data="tableData" style="width: 100%">
+        <el-table-column type="index" label="序号"></el-table-column>
+        <el-table-column prop="AAA28" label="病案号">
+          <template slot-scope="scope">
+            <span class="blue" @click="funGoto(scope.row.MED_REC_ID)">{{ scope.row.AAA28 }}</span>
+          </template>
+        </el-table-column>
+        <el-table-column prop="AAA01" label="患者姓名"></el-table-column>
+        <el-table-column prop="AAA02C" label="性别"></el-table-column>
+        <el-table-column prop="AAA04" label="年龄"></el-table-column>
+        <el-table-column prop="AAA29" label="住院次数"></el-table-column>
+        <el-table-column prop="AAC11N" label="出院科室"></el-table-column>
+        <el-table-column prop="AAC01" label="出院日期"></el-table-column>
+        <el-table-column prop="ADA01" label="总费用"></el-table-column>
+        <el-table-column prop="F_D" label="药品费用"></el-table-column>
+        <el-table-column prop="J" label="材料费用"></el-table-column>
+        <el-table-column prop="ABC01N" label="主诊断"></el-table-column>
+        <el-table-column prop="ICD9_NAME" label="主手术"></el-table-column>
+        <!-- <el-table-column prop="address" label="业务操作人"> </el-table-column> -->
+        <el-table-column prop="AAC04" label="实际住院(天)"></el-table-column>
+        <el-table-column prop="ATTEND_GRP_NAME" label="主诊组"></el-table-column>
+        <el-table-column prop="AEM01C" label="离院方式"></el-table-column>
+        <el-table-column prop="AAB06C" label="入院途径"></el-table-column>
+      </el-table>
+      <!-- 分页控制 -->
+      <mPagination v-if="tableData && tableData.length !== 0" :data="paginationData" @pageChangeEvent="pageHasChanged"></mPagination>
+    </div>
+  </div>
+</template>
+
+<script>
+import Title from '@/components/Title';
+import { mapGetters } from 'vuex';
+import mPagination from '@/components/m-pagination';
+
+export default {
+  name: 'Dashboard',
+  components: {
+    Title,
+    mPagination,
+  },
+  computed: {
+    ...mapGetters(['name']),
+  },
+  data() {
+    return {
+      choice: '0',
+      formData0: {
+        recordNum: '', //病案号
+        Department: '', //出院科室
+        problem: 'all', //问题属性
+        payment: '', //医疗付款方式
+        state: '', //编辑状态
+        rangeDate: [], //时间
+        Coder: '', //住院医师
+        medicalRecord: '', //全部病案
+      },
+      formData1: {
+        ageday: '',
+        ageyear: '',
+        rangeDate: [],
+        seniorList: [
+          {
+            key: '',
+            value: '',
+            type: '0',
+          },
+          {
+            key: '',
+            value: '',
+            type: '0',
+          },
+        ],
+      },
+      inputOn: '', //全站搜索病案号
+      value: '',
+      value1: '',
+      tableData: [],
+      payList: [], //支付方式
+      departmentList: [], //出院科室
+      levelList: [], //问题属性
+      coderList: [], //编码元
+      statusList: [], //编辑状态
+      fieldList: [], //主要诊断名字
+      // 分页数据
+      paginationData: {
+        total: 10,
+        currentPage: 1,
+        pageSize: 10,
+      },
+    };
+  },
+  mounted() {
+    this.selectInfo();
+    this.funQuery();
+  },
+  methods: {
+    funGoto(val) {
+      this.storageSet('getData', val);
+      this.goto('SetDetails');
+    },
+    funBlur() {
+      if (this.formData1.ageday > 356) {
+        this.formData1.ageday = 356;
+      }
+      if (this.formData1.ageyear > 150) {
+        this.formData1.ageyear = 150;
+      }
+    },
+    funDel() {
+      this.formData1.seniorList.pop();
+    },
+    funAdd() {
+      this.formData1.seniorList.push({
+        key: '',
+        value: '',
+        type: '0',
+      });
+    },
+    pageHasChanged() {
+      this.funQuery();
+    },
+    selectInfo() {
+      // let pramse = {};
+      this.$axios.post('/selectInfo').then(res => {
+        this.payList = res.data.pay;
+        console.log(this.payList);
+        //支付方式 pay
+        this.departmentList = res.data.department;
+        //出院科室 department
+        this.levelList = res.data.level;
+        //问题属性 level
+        this.coderList = res.data.coder;
+        //编码元  coder
+        this.statusList = res.data.status;
+        this.fieldList = res.data.field;
+      });
+    },
+    funQuery() {
+      //查询
+      if (this.choice == 0) {
+        let pramse = {
+           source:1,
+          level: this.formData0.problem || null, //问题属性
+          AAA28: this.formData0.recordNum || null, //病案号
+          AAC11N: this.formData0.Department || null, //出院科室
+          AAA26C: this.formData0.payment || null, //付款方式
+          status: this.formData0.state || null, //编辑状态
+          AAC01: this.formData0.rangeDate, //出院时间
+          coder_id: this.formData0.Coder || null, //编码员ID
+          ORG_STATE: this.formData0.medicalRecord || null, //全部病案
+          page: this.paginationData.currentPage, //页码
+          limit: this.paginationData.pageSize, //条数
+        };
+        this.$axios.post('/qualityList', pramse).then(res => {
+          console.log(res);
+          this.paginationData.total = res.data.count;
+          this.tableData = res.data.list;
+        });
+      } else {
+        let pramse = {
+          source:1,
+          AAA04: this.formData1.ageyear || null, //年龄
+          AAA40: this.formData1.ageday || null, //不足一周岁年龄
+          AAC01: this.formData1.rangeDate, //出院时间
+          field: this.formData1.seniorList || null, //字段条件
+          page: this.paginationData.currentPage, //页码
+          limit: this.paginationData.pageSize, //条数
+        };
+        this.$axios.post('/qualityList', pramse).then(res => {
+          console.log(res);
+          this.paginationData.total = res.data.count;
+          this.tableData = res.data.list;
+        });
+      }
+    },
+    reset() {
+      // 重置数据
+      if (this.choice == 0) {
+        Object.assign(this.$data.formData0, this.$options.data().formData0);
+      } else {
+        Object.assign(this.$data.formData1, this.$options.data().formData1);
+      }
+    },
+  },
+};
+</script>
+<style scoped>
+::v-deep.el-pagination.is-background .btn-next,
+::v-deep.el-pagination.is-background .btn-prev,
+::v-deep.el-pagination.is-background .el-pager li {
+  margin: 0 5px;
+  background-color: #fff;
+  color: #606266;
+  min-width: 30px;
+  border-radius: 2px;
+  border: 1px solid #dfe3f3;
+  line-height: 27px;
+}
+::v-deep.el-pagination.is-background .el-pager li:not(.disabled).active {
+  background: #7e8bab;
+}
+::v-deep.el-table .el-table__row td {
+  color: #7e8bab;
+  border-bottom: 1px solid #f4f4f4;
+}
+::v-deep.el-table .el-table__header tr th:first-child {
+  border-radius: 10px 0px 0px 10px;
+}
+::v-deep.el-table .el-table__header tr th:last-child {
+  border-radius: 0px 10px 10px 0px;
+}
+::v-deep.el-table .el-table__header tr th {
+  background: #f1f6ff;
+  color: #13171e;
+  border-bottom: 0px;
+}
+</style>
+<style lang="scss" scoped>
+.tableBox {
+  background: #fff;
+  padding: 19px;
+  border-radius: 5px;
+  font-size: 12px;
+}
+.block {
+  background: #fff;
+  border-radius: 5px;
+  margin-bottom: 16px;
+  padding: 20px 30px;
+  margin-bottom: 20px;
+  .fBtn {
+    display: flex;
+    align-items: center;
+    justify-content: center;
+    .btn1 {
+      background: #185da6;
+      color: #fff;
+    }
+    .btn2 {
+      color: #185da6;
+      background: #d5e4ff;
+    }
+  }
+  .bnh {
+    margin-bottom: 20px;
+  }
+  .barBtn {
+    display: flex;
+    align-items: center;
+    justify-content: center;
+  }
+  .selects {
+    width: 100%;
+  }
+  .rowsa {
+    margin-bottom: 20px;
+  }
+}
+.tableBox {
+  background: #fff;
+  padding: 19px;
+  border-radius: 5px;
+}
+.dashboard {
+  &-container {
+    margin: 30px;
+  }
+  &-text {
+    font-size: 30px;
+    line-height: 46px;
+  }
+}
+.pind {
+  padding: 0 20px;
+}
+.pind10 {
+  padding: 0 5px;
+}
+.width150 {
+  width: 200px;
+}
+.width300 {
+  width: 295px;
+}
+.width500 {
+  width: 645px;
+}
+.width90 {
+  width: 90px;
+}
+.blue {
+  color: #185da6;
+}
+</style>

+ 325 - 0
src/views/SettlementList/defectStatementList.vue

@@ -0,0 +1,325 @@
+<template>
+  <div class="dashboard-container">
+    <div class="tableBox">
+      <div class="block">
+        <div class="blockCon">
+          <div class="selectDns"></div>
+          <el-select v-model="formData.Department" class="selects" placeholder="全部">
+            <el-option v-for="(item, index) in departmentList" :label="item.name" :value="item.id" :key="index"></el-option>
+          </el-select>
+          <span class="kong"></span>
+          <el-select v-model="formData.problem" class="selects" placeholder="全部">
+            <el-option v-for="(item, index) in levelList" :label="item.name" :value="item.id" :key="index"></el-option>
+          </el-select>
+          <span class="kong"></span>
+          <!-- <span class="demonstration">反馈关键词</span> -->
+          <!-- <el-input class="ins" placeholder="请输入内容"></el-input> -->
+          <el-button class="sc" @click="funQuery">查询</el-button>
+          <span class="kong"></span>
+          <el-button class="btn1" @click="reset">重置条件</el-button>
+          <span class="kong"></span>
+          <el-button class="sc" type="primary">导出Excel表格</el-button>
+        </div>
+      </div>
+      <Title :title="'缺陷结算单数量列表'" />
+      <el-table :data="tableData" style="width: 100%">
+        <el-table-column type="index" label="序号"></el-table-column>
+        <el-table-column prop="AAA28" label="病案号">
+          <template slot-scope="scope">
+            <span class="blue" @click="funGoto(scope.row.MED_REC_ID)">{{ scope.row.AAA28 }}</span>
+          </template>
+        </el-table-column>
+        <el-table-column prop="AAA01" label="患者姓名"></el-table-column>
+        <el-table-column prop="AAC11N" label="出院科室"></el-table-column>
+        <el-table-column prop="AAC03" label="出院病房"></el-table-column>
+        <el-table-column prop="AAC01" label="出院时间"></el-table-column>
+        <el-table-column prop="AEE04" label="住院医师"></el-table-column>
+        <el-table-column prop="error_field" label="缺陷项"></el-table-column>
+        <!-- <el-table-column prop="AAA01" label="取值"></el-table-column> -->
+        <el-table-column prop="level" label="缺陷级别"></el-table-column>
+        <el-table-column prop="desc" label="修订建议"></el-table-column>
+      </el-table>
+      <!-- 分页控制 -->
+      <mPagination v-if="tableData && tableData.length !== 0" :data="paginationData" @pageChangeEvent="pageHasChanged"></mPagination>
+    </div>
+  </div>
+</template>
+
+<script>
+import Title from '@/components/Title';
+import { mapGetters } from 'vuex';
+import mPagination from '@/components/m-pagination';
+
+export default {
+  name: 'Dashboard',
+  components: {
+    Title,
+    mPagination,
+  },
+  computed: {
+    ...mapGetters(['name']),
+  },
+  data() {
+    return {
+      formData: {
+        problem: 'all',
+        Department: '',
+        endTime:'',
+        startTime:''
+      },
+      error_rule: '',
+      hospital_name: '',
+      error_type: '',
+      coder_name: '',
+      department_name: '',
+      tableData: [],
+      // 分页数据
+      paginationData: {
+        total: 10,
+        currentPage: 1,
+        pageSize: 10,
+      },
+      levelList: [], //问题属性
+      departmentList: [],
+    };
+  },
+  mounted() {
+    this.formData.endTime = this.storageGet('endTime');
+    this.formData.startTime = this.storageGet('startTime');
+    this.error_rule = this.$route.query.error_rule;
+    this.hospital_name = this.$route.query.hospital_name;
+    this.error_type = this.$route.query.error_type;
+    this.coder_name = this.$route.query.coder_name;
+    this.department_name = this.$route.query.department_name;
+    this.selectInfo();
+    this.funQuery();
+  },
+  methods: {
+    funGoto(val) {
+      this.storageSet('getData', val);
+      this.goto('SetDetails');
+    },
+    selectInfo() {
+      // let pramse = {};
+      this.$axios.post('/selectInfo').then(res => {
+        this.payList = res.data.pay;
+        console.log(this.payList);
+        //支付方式 pay
+        this.departmentList = res.data.department;
+        //出院科室 department
+        this.levelList = res.data.level;
+      });
+    },
+    pageHasChanged() {
+      this.funQuery();
+    },
+    // selectInfo() {
+    //   let pramse = {};
+    //   this.$axios
+    //     .post("/selectInfo")
+    //     .then((res) => {
+    //       this.payList = res.data.pay;
+    //       console.log(this.payList);
+    //       //支付方式 pay
+    //       this.departmentList = res.data.department;
+    //       //出院科室 department
+    //       this.levelList = res.data.level;
+    //       //问题属性 level
+    //       this.coderList = res.data.coder;
+    //       //编码元  coder
+    //       this.statusList = res.data.status;
+    //       this.fieldList = res.data.field;
+    //     });
+    // },
+    funQuery() {
+      //查询
+      let pramse = {
+        AAC01: this.formData.startTime, //出院时间
+        AAA28: this.formData.endTime,
+        source: 1,
+        // AAC11C: this.formData.Department, //科室ID
+        level: this.formData.level, //错误等级
+        page: this.paginationData.currentPage, //页码
+        limit: this.paginationData.pageSize, //条数
+      };
+      if (this.error_rule) {
+        pramse.error_rule = this.error_rule;
+      }
+      if (this.hospital_name) {
+        pramse.hospital_name = this.hospital_name;
+      }
+
+      if (this.error_type) {
+        pramse.error_type = this.error_type;
+      }
+      if (this.coder_name) {
+        pramse.coder_name = this.coder_name;
+      }
+      if (this.department_name) {
+        pramse.department_name = this.department_name;
+      }
+      this.$axios.post('/errorDataList', pramse).then(res => {
+        console.log(res);
+        this.paginationData.total = res.data.count;
+        this.tableData = res.data.list;
+      });
+    },
+    reset() {
+      // 重置数据
+      if (this.choice == 0) {
+        Object.assign(this.$data.formData, this.$options.data().formData);
+      } else {
+        Object.assign(this.$data.formData, this.$options.data().formData);
+      }
+    },
+  },
+};
+</script>
+<style scoped>
+::v-deep.el-pagination.is-background .btn-next,
+::v-deep.el-pagination.is-background .btn-prev,
+::v-deep.el-pagination.is-background .el-pager li {
+  margin: 0 5px;
+  background-color: #fff;
+  color: #606266;
+  min-width: 30px;
+  border-radius: 2px;
+  border: 1px solid #dfe3f3;
+  line-height: 27px;
+}
+::v-deep.el-pagination.is-background .el-pager li:not(.disabled).active {
+  background: #7e8bab;
+}
+::v-deep.el-table .el-table__row td {
+  color: #7e8bab;
+  border-bottom: 1px solid #f4f4f4;
+}
+::v-deep.el-table .el-table__header tr th:first-child {
+  border-radius: 10px 0px 0px 10px;
+}
+::v-deep.el-table .el-table__header tr th:last-child {
+  border-radius: 0px 10px 10px 0px;
+}
+::v-deep.el-table .el-table__header tr th {
+  background: #f1f6ff;
+  color: #13171e;
+  border-bottom: 0px;
+}
+</style>
+<style lang="scss" scoped>
+.tableBox {
+  background: #fff;
+  padding: 19px;
+  border-radius: 5px;
+  font-size: 12px;
+}
+.block {
+  background: #fff;
+  border-radius: 5px;
+  margin-bottom: 16px;
+  padding: 20px 30px;
+  margin-bottom: 20px;
+  .fBtn {
+    display: flex;
+    align-items: center;
+    justify-content: center;
+    .btn1 {
+      background: #185da6;
+      color: #fff;
+    }
+    .btn2 {
+      color: #185da6;
+      background: #d5e4ff;
+    }
+  }
+  .bnh {
+    margin-bottom: 20px;
+  }
+  .barBtn {
+    display: flex;
+    align-items: center;
+    justify-content: center;
+  }
+  .selects {
+    width: 100%;
+  }
+  .rowsa {
+    margin-bottom: 20px;
+  }
+}
+.tableBox {
+  background: #fff;
+  padding: 19px;
+  border-radius: 5px;
+}
+.dashboard {
+  &-container {
+    margin: 30px;
+  }
+  &-text {
+    font-size: 30px;
+    line-height: 46px;
+  }
+}
+.pind {
+  padding: 0 20px;
+}
+.pind10 {
+  padding: 0 5px;
+}
+.width150 {
+  width: 200px;
+}
+.width300 {
+  width: 295px;
+}
+.width500 {
+  width: 645px;
+}
+.width90 {
+  width: 90px;
+}
+.blue {
+  color: #185da6;
+}
+.block {
+  background: #fff;
+  display: flex;
+  align-items: center;
+  border-radius: 5px;
+  height: 75px;
+  margin-bottom: 16px;
+  padding-left: 34px;
+  margin-bottom: 20px;
+  margin-bottom: 20px;
+  .blockCon {
+    display: flex;
+    align-items: center;
+    .selectDns {
+      span {
+        margin-right: 5px;
+      }
+    }
+    .demonstration {
+      margin-left: 10px;
+    }
+    .pickers {
+      margin-left: 5px;
+    }
+    .lsxd {
+      margin-left: 20px;
+    }
+    .ins {
+      width: 150px;
+      margin: 0 10px;
+    }
+  }
+  .sc {
+    background: #185da6;
+    color: #fff;
+  }
+}
+.kong {
+  padding: 0 10px;
+}
+</style>

+ 801 - 0
src/views/SettlementList/index.vue

@@ -0,0 +1,801 @@
+<template>
+  <div style="padding: 30px">
+    <div class="block">
+      <div class="blockCon">
+        <div class="lefts">
+          <!-- <el-button-group> -->
+          <!-- <el-button>按年</el-button> -->
+          <el-dropdown>
+            <el-button :class="formData.year.name ? 'color-btn' : ''">
+              {{ formData.year.name || '按年' }}
+              <i class="el-icon-arrow-down el-icon--right"></i>
+            </el-button>
+            <el-dropdown-menu slot="dropdown">
+              <el-dropdown-item v-for="(item, index) in yearList" :key="index" @click.native="funSeleterYear(item)">{{ item.name }}</el-dropdown-item>
+            </el-dropdown-menu>
+            <!-- <el-dropdown-item @click.native="funSeleterYear({ name: '2009', num: '2009' })">2009</el-dropdown-item> -->
+            <!-- </el-dropdown-menu> -->
+          </el-dropdown>
+
+          <el-dropdown>
+            <el-button :class="formData.quarter.name ? 'color-btn' : ''">
+              {{ formData.quarter.name || '按季' }}
+              <i class="el-icon-arrow-down el-icon--right"></i>
+            </el-button>
+            <el-dropdown-menu slot="dropdown">
+              <el-dropdown-item v-for="(item, index) in quarterList" :key="index" @click.native="funSeleterQuarter(item)">{{ item.name }}</el-dropdown-item>
+            </el-dropdown-menu>
+          </el-dropdown>
+
+          <el-dropdown>
+            <el-button :class="formData.month.name ? 'color-btn' : ''">
+              {{ formData.month.name || '按月' }}
+              <i class="el-icon-arrow-down el-icon--right"></i>
+            </el-button>
+            <!-- <el-dropdown-menu slot="dropdown"> -->
+            <el-dropdown-menu slot="dropdown">
+              <el-dropdown-item v-for="(item, index) in monthList" :key="index" @click.native="funSeleterMonth(item)">{{ item.name }}</el-dropdown-item>
+            </el-dropdown-menu>
+            <!-- <el-dropdown-item @click.native="funSeleterMonth({ name: '2009', num: '2009' })">2009</el-dropdown-item> -->
+            <!-- </el-dropdown-menu> -->
+          </el-dropdown>
+          <!-- <el-button>按季</el-button>
+          <el-button>按月</el-button> -->
+          <!-- </el-button-group> -->
+          <div class="selects">
+            <el-date-picker v-model="formData.startTime" type="date" format="yyyy 年 MM 月 dd 日" value-format="yyyyMMdd" placeholder="开始日期"></el-date-picker>
+
+            <el-date-picker
+              v-model="formData.endTime"
+              type="date"
+              style="margin-left: 10px"
+              format="yyyy 年 MM 月 dd 日"
+              value-format="yyyyMMdd"
+              placeholder="结束日期"
+            ></el-date-picker>
+          </div>
+          <el-button class="btn1" type="primary" @click="funQuery">查询</el-button>
+          <el-button class="btn2" type="primary">查看报告</el-button>
+        </div>
+      </div>
+    </div>
+    <div class="cardBox">
+      <Title :title="'结算清单质量分析'" />
+      <div class="contentBox">
+        <div class="left">
+          <div class="l">
+            <div class="i" @click="goto('StatementList')">
+              <div class="ba">结算清单数量</div>
+              <div class="num">{{ homeData.total }}</div>
+              <!-- <img class="icon" src="@/assets/404_images/404_cloud.png" alt="" /> -->
+            </div>
+            <div class="i" style="background: #af8af1">
+              <div class="ba">缺陷结算清单数量占比</div>
+              <div class="num">{{ homeData.averageError }}</div>
+              <!-- <img class="icon" src="@/assets/404_images/404_cloud.png" alt="" /> -->
+            </div>
+            <div class="i" @click="goto('defectStatementList')" style="background: #38a1f1">
+              <div class="ba">缺陷结算清单数量</div>
+              <div class="num">{{ homeData.errorMedical }}</div>
+              <!-- <img class="icon" src="@/assets/404_images/404_cloud.png" alt="" /> -->
+            </div>
+            <div class="i" style="background: #f6a069">
+              <div class="ba">结算清单平均得分</div>
+              <div class="num">{{ homeData.averageScore }}</div>
+              <!-- <img class="icon" src="@/assets/404_images/404_cloud.png" alt="" /> -->
+            </div>
+          </div>
+          <div class="r">
+            <div class="i">
+              <!-- <img class="icon" src="@/assets/404_images/404_cloud.png" alt="" /> -->
+              <div class="t">优(>90分)</div>
+              <div class="rt">{{ homeData.highest_score }}</div>
+            </div>
+            <div class="i">
+              <!-- <img class="icon" src="@/assets/404_images/404_cloud.png" alt="" /> -->
+              <div class="t">良(70-90分)</div>
+              <div class="rt" style="color: #1da436">
+                {{ homeData.good }}
+              </div>
+            </div>
+            <div class="i">
+              <!-- <img class="icon" src="@/assets/404_images/404_cloud.png" alt="" /> -->
+              <div class="t">差(&lt;70分)</div>
+              <div class="rt" style="color: #ff0000">
+                {{ homeData.minimum_score }}
+              </div>
+            </div>
+          </div>
+        </div>
+        <div class="right">
+          <div id="myChart" style="width: 100%; height: 200px"></div>
+        </div>
+      </div>
+    </div>
+
+    <div class="cardBox">
+      <Title :title="'缺陷问题'" />
+      <el-select v-model="formData.problem" placeholder="请选择" style="margin-right: 20px">
+        <el-option v-for="(item, index) in departmentList" :label="item.name" :value="item.id" :key="index"></el-option>
+      </el-select>
+      <el-select v-model="formData.defectFelg" placeholder="全部" style="margin-right: 20px">
+        <el-option v-for="(item, index) in levelList" :label="item.name" :value="item.id" :key="index"></el-option>
+      </el-select>
+      <el-button class="btn1" type="primary" @click="initCharts1">查询</el-button>
+
+      <div class="tableBox1">
+        <div class="left">
+          <div class="top">
+            <div class="lt">
+              <div class="item">
+                <img class="icon" src="@/assets/404_images/404_cloud.png" alt="" />
+                <div class="con">患者基本信息</div>
+                <div class="baifen">{{ errorDataFelg.base }}%</div>
+              </div>
+              <div class="item">
+                <img class="icon" src="@/assets/404_images/404_cloud.png" alt="" />
+                <div class="con">住院诊疗信息</div>
+                <div class="baifen">{{ errorDataFelg.diagnosis }}%</div>
+              </div>
+              <div class="item">
+                <img class="icon" src="@/assets/404_images/404_cloud.png" alt="" />
+                <div class="con">医疗收费信息</div>
+                <div class="baifen">{{ errorDataFelg.cost }}%</div>
+              </div>
+            </div>
+            <el-button class="btn1" type="primary" icon="el-icon-download">导出execl</el-button>
+          </div>
+          <!-- <el-table :data="errorDataList" style="width: 100%"> -->
+          <el-table height="400px" v-el-table-infinite-scroll="getDataNextPage" :data="errorDataList">
+            <el-table-column type="index" label="序号"></el-table-column>
+            <el-table-column prop="desc" align="center" label="缺陷描述"></el-table-column>
+            <el-table-column prop="field" align="center" label="缺陷字段"></el-table-column>
+            <el-table-column prop="level" align="center" label="缺陷分级">
+              <template slot-scope="scope">
+                <span>{{ scope.row.level == '0' ? '强制' : '建议' }}</span>
+              </template>
+            </el-table-column>
+            <el-table-column prop="count" align="center" label="缺陷数量">
+              <template slot-scope="scope">
+                <span class="blue" @click="GoDefectList(scope.row)">{{ scope.row.count }}</span>
+              </template>
+            </el-table-column>
+          </el-table>
+        </div>
+        <div class="right">
+          <div id="myChart1" style="width: 100%; height: 500px"></div>
+        </div>
+      </div>
+    </div>
+  </div>
+</template>
+<script>
+import Title from '@/components/Title';
+import * as echarts from 'echarts';
+import elTableInfiniteScroll from 'el-table-infinite-scroll';
+export default {
+  components: {
+    Title,
+  },
+  directives: {
+    'el-table-infinite-scroll': elTableInfiniteScroll,
+  },
+  data() {
+    return {
+      value1: '',
+      tableData: [],
+      formData: {
+        problem: 'all',
+        defectFelg: 'all',
+        rangeDate: [],
+        chooseDate: '',
+        startTime: '',
+        endTime: '',
+        year: {
+          name: '',
+        },
+        month: {
+          name: '',
+        },
+        quarter: {
+          name: '',
+        },
+        type: '1',
+      },
+      errorDataList: [],
+      ranking: [],
+      diagnosisRanking: [],
+      errorDataFelg: {},
+      homeData: {},
+      indications: [],
+      hospitalData: [],
+      coderData: [],
+      departmentList: [],
+      levelList: [],
+      quarterList: [],
+      monthList: [],
+      yearList: [],
+      nextListFelg:0,
+      page:2
+    };
+  },
+  mounted() {
+    this.formData.chooseDate = 3;
+    this.initCharts1();
+    this.chooseTime(this.formData.chooseDate);
+    this.funAggregate();
+    this.selectInfo();
+    // this.funQueryCoder();
+  },
+  methods: {
+    getDataNextPage() {
+      if(this.nextListFelg == 0){
+      // this.$message.success('已加载全部数据');
+        return
+      }
+      let type_id = '';
+      if (this.formData.type == '1') {
+        type_id = this.formData.year.id || '';
+      } else if (this.formData.type == '2') {
+        type_id = this.formData.quarter.id;
+      } else {
+        type_id = this.formData.month.id;
+      }
+      let pramse = {
+        type: this.formData.type, //按年/按月/按季
+        type_id: type_id,
+        start_time: this.formData.startTime, //开始时间 时间戳or时间
+        end_time: this.formData.endTime, //结束时间
+        level: this.formData.defectFelg,
+        AAC11C: this.formData.problem,
+        page:this.page
+      }
+      this.$axios.post('/errorData', pramse).then(res => {
+        for (let item in res.data.list) {
+        this.errorDataList.push(res.data.list[item])
+        }
+        console.log(this.errorDataList)
+        this.page = this.page + 1
+        this.nextListFelg = res.data.next
+    })
+      // this.$message.success('加载下一页');
+    },
+    funSeleterYear(val) {
+      this.formData.year = val;
+      this.formData.type = '1';
+      this.formData.month = {
+        name: '',
+      };
+      this.formData.quarter = {
+        name: '',
+      };
+    },
+    funSeleterMonth(val) {
+      this.formData.month = val;
+      this.formData.type = '3';
+      this.formData.year = {
+        name: '',
+      };
+      this.formData.quarter = {
+        name: '',
+      };
+    },
+    funSeleterQuarter(val) {
+      this.formData.type = '2';
+      this.formData.quarter = val;
+      this.formData.year = {
+        name: '',
+      };
+      this.formData.month = {
+        name: '',
+      };
+    },
+    jump(path, query) {
+      this.$router.push(path, query);
+    },
+    /**
+     * 携带缺陷id跳转缺陷列表页面条件查询
+     * @param {缺陷id} base.error_rule
+     */
+    GoDefectList(error) {
+      this.$router.push(`/defectList?error_rule=${error.error_rule}`);
+    },
+    selectInfo() {
+      // let pramse = {};
+      this.$axios.post('/selectInfo').then(res => {
+        this.departmentList = res.data.department;
+        //出院科室 department
+        this.levelList = res.data.level;
+        //问题属性 level
+        this.quarterList = res.data.quarter;
+        // 季度
+        this.monthList = res.data.month;
+        //月
+        this.yearList = res.data.year;
+      });
+    },
+    funGoto() {
+      this.goto('/medicalRecords');
+    },
+ 
+    funQueryHospital() {
+      let pramse = {
+          source:1,
+        startTime: this.formData.startTime, //开始时间 时间戳or时间
+        endTime: this.formData.endTime, //结束时间
+      };
+      this.$axios.post('/ranking_hospital', pramse).then(res => {
+        this.hospitalData = res.data;
+      });
+    },
+       initCharts1() {
+        let type_id = '';
+      if (this.formData.type == '1') {
+        type_id = this.formData.year.id || '';
+      } else if (this.formData.type == '2') {
+        type_id = this.formData.quarter.id;
+      } else {
+        type_id = this.formData.month.id;
+      }
+      let pramse = {
+        type: this.formData.type, //按年/按月/按季
+        type_id: type_id,
+        start_time: this.formData.startTime, //开始时间 时间戳or时间
+        end_time: this.formData.endTime, //结束时间
+        level: this.formData.defectFelg,
+        AAC11C: this.formData.problem,
+        page:1
+      };
+      this.$axios.post('/errorData', pramse).then(res => {
+        this.errorDataList = res.data.list;
+        this.errorDataFelg = res.data.count;
+        this.nextListFelg = res.data.next
+        console.log(this.errorDataFelg);
+        // base,diagnosis,cost
+        let myChartData = [
+          {
+            value: this.errorDataFelg.other,
+            name: '其他' + this.errorDataFelg.other + '%',
+          },
+          {
+            value: this.errorDataFelg.base,
+            name: '患者基本信息' + this.errorDataFelg.base + '%',
+          },
+          {
+            value: this.errorDataFelg.diagnosis,
+            name: '诊疗信息' + this.errorDataFelg.diagnosis + '%',
+          },
+          {
+            value: this.errorDataFelg.cost,
+            name: '费用信息' + this.errorDataFelg.cost + '%',
+          },
+        ];
+        console.log(myChartData);
+        // for (let item in this.errorDataList) {
+        //   myChartData.push({
+        //     value: this.errorDataList[item].count,
+        //     name: this.errorDataList[item].field,
+        //   });
+        // }
+        let myChart = echarts.init(document.getElementById('myChart1'));
+        window.addEventListener('resize', function () {
+          myChart.resize();
+        });
+        myChart.setOption({
+          toolbox: {
+            feature: {
+              saveAsImage: {
+                name: '图表',
+              },
+            },
+          },
+          title: {
+            left: 'center',
+          },
+          legend: {
+            top: '13%',
+            left: 'center',
+          },
+          tooltip: {
+            trigger: 'item',
+          },
+          grid: {
+            left: '3%',
+            right: '3%',
+            bottom: '3%',
+            containLabel: true,
+          },
+          series: [
+            {
+              name: 'Access From',
+              type: 'pie',
+              radius: '50%',
+              data: myChartData,
+              emphasis: {
+                itemStyle: {
+                  shadowBlur: 10,
+                  shadowOffsetX: 0,
+                  shadowColor: 'rgba(0, 0, 0, 0.5)',
+                },
+              },
+            },
+          ],
+        });
+      });
+    },
+    funQueryIndications() {
+      let pramse = {
+        source:1,
+        startTime: this.formData.startTime, //开始时间 时间戳or时间
+        endTime: this.formData.endTime, //结束时间
+      };
+      this.$axios.post('/ranking_indications', pramse).then(res => {
+        this.indications = res.data;
+      });
+    },
+  
+    funAggregate() {
+      let pramse = {
+        source:1,
+        type: this.formData.chooseDate, //按年/按月/按季
+        startTime: this.formData.startTime, //开始时间 时间戳or时间
+        endTime: this.formData.endTime, //结束时间
+      };
+      this.$axios.post('/homeCensus', pramse).then(res => {
+        console.log('平均', res);
+        this.homeData = res.data;
+        // let chartsData = [res.data.before, res.data.last, res.data.new];
+        let year = [res.data.before.year, res.data.last.year, res.data.new.year];
+        //         * 'averageError' => '病案数量',
+        let newData1 = [res.data.before.averageError, res.data.last.averageError, res.data.new.averageError];
+        let newData2 = [res.data.before.averageScore, res.data.last.averageScore, res.data.new.averageScore];
+        let newData3 = [res.data.before.outstanding, res.data.last.outstanding, res.data.new.outstanding];
+        // * 'errorMedical' => ‘平均缺陷’,
+        // * 'averageScore' => '平均得分',
+        // * 'averageError' => '平均缺陷',
+        // * 'highest_score' => '最高得分',
+        // * 'minimum_score' => '最低得分',
+        let myChart = echarts.init(document.getElementById('myChart'));
+        window.addEventListener('resize', function () {
+          myChart.resize();
+        });
+        myChart.setOption({
+          toolbox: {
+            feature: {
+              saveAsImage: {
+                name: '图表',
+              },
+            },
+          },
+          tooltip: {
+            trigger: 'axis',
+            axisPointer: {
+              type: 'cross',
+              crossStyle: {
+                color: '#999',
+              },
+            },
+          },
+          legend: {
+            data: ['结算清单数量', '结算清单缺陷数量', '结算清单平均分'],
+          },
+          grid: {
+            left: '3%',
+            right: '3%',
+            bottom: '3%',
+            containLabel: true,
+          },
+          xAxis: [
+            {
+              type: 'category',
+              data: year,
+              axisPointer: {
+                type: 'shadow',
+              },
+            },
+          ],
+          yAxis: [
+            {
+              type: 'value',
+              name: '数量',
+              // axisLabel: {
+              //   formatter: "value",
+              // },
+            },
+            {
+              type: 'value',
+              name: '得分',
+              // axisLabel: {
+              //   formatter: "value",
+              // },
+            },
+          ],
+          series: [
+            {
+              name: '结算清单数量',
+              barMaxWidth: 30,
+              type: 'bar',
+              tooltip: {
+                valueFormatter: function (value) {
+                  return value;
+                },
+              },
+              data: newData1,
+            },
+            {
+              name: '结算清单缺陷数量',
+              barMaxWidth: 30,
+              type: 'bar',
+              tooltip: {
+                valueFormatter: function (value) {
+                  return value;
+                },
+              },
+              data: newData2,
+            },
+            {
+              name: '结算清单平均分',
+              type: 'line',
+              yAxisIndex: 1,
+              tooltip: {
+                valueFormatter: function (value) {
+                  return value;
+                },
+              },
+              data: newData3,
+            },
+          ],
+        });
+      });
+    },
+    // 选择时间段
+    chooseTime(time) {
+      console.error(time);
+      this.formData.chooseDate = time;
+      this.funAggregate();
+      return;
+      // this.formData.rangeDate = this.timesCalculation(time).slice(0, 2);
+    },
+    funQuery() {
+      //查询
+      // this.initCharts();
+      this.funAggregate();
+      this.funQueryRanking();
+      this.funQueryIndications();
+      this.funQueryHospital();
+    },
+    handleClick() {},
+  },
+};
+</script>
+<style scoped>
+::v-deep.el-pagination.is-background .btn-next,
+::v-deep.el-pagination.is-background .btn-prev,
+::v-deep.el-pagination.is-background .el-pager li {
+  margin: 0 5px;
+  background-color: #fff;
+  color: #606266;
+  min-width: 30px;
+  border-radius: 2px;
+  border: 1px solid #dfe3f3;
+  line-height: 27px;
+}
+::v-deep.el-pagination.is-background .el-pager li:not(.disabled).active {
+  background: #7e8bab;
+}
+::v-deep.el-table .el-table__row td {
+  color: #7e8bab;
+  border-bottom: 1px solid #f4f4f4;
+}
+::v-deep.el-table .el-table__header tr th:first-child {
+  border-radius: 10px 0px 0px 10px;
+}
+::v-deep.el-table .el-table__header tr th:last-child {
+  border-radius: 0px 10px 10px 0px;
+}
+::v-deep.el-table .el-table__header tr th {
+  background: #f1f6ff;
+  color: #13171e;
+  border-bottom: 0px;
+}
+</style>
+<style lang="scss" scoped>
+.ytext {
+  font-size: 16px;
+  color: #e48d53;
+  font-weight: 400;
+  line-height: 40px;
+}
+.block {
+  margin-bottom: 16px;
+  background: #fff;
+  padding: 25px 15px;
+  border-radius: 5px;
+  .blockCon {
+    display: flex;
+    justify-content: space-between;
+    .lefts {
+      display: flex;
+    }
+    .selects {
+      margin: 0 20px;
+      span {
+        margin-right: 10px;
+      }
+    }
+  }
+}
+.cardBox {
+  margin: 0 0 16px 0;
+  background: #fff;
+  padding: 25px 15px;
+  border-radius: 5px;
+  .contentBox {
+    display: flex;
+    .left {
+      display: flex;
+      flex: 1;
+      .l {
+        display: flex;
+        flex: 1;
+        flex-wrap: wrap;
+        .i {
+          width: calc(50% - 20px);
+          margin-right: 20px;
+          height: 86px;
+          background: #30b48e;
+          border-radius: 5px;
+          position: relative;
+          overflow: hidden;
+          display: flex;
+          align-items: center;
+          justify-content: center;
+          text-align: center;
+          .ba {
+            flex: 1;
+            font-size: 17px;
+            text-align: left;
+            padding-left: 10px;
+            font-weight: 400;
+            color: #fff;
+            // margin: 18px 0 0 38px;
+          }
+          .num {
+            font-size: 24px;
+            font-weight: bold;
+            color: #fff;
+            // margin: 15px 0 0 38px;
+            flex: 1;
+            margin-left: 20px;
+          }
+          .icon {
+            width: 50px;
+            position: absolute;
+            top: 18px;
+            right: 25px;
+          }
+        }
+      }
+      .r {
+        margin: 0 9% 0 0;
+        .i {
+          width: 280px;
+          height: 56px;
+          background: #eaf4ff;
+          border-radius: 4px;
+          margin: 0 0 9px 0;
+          display: flex;
+          align-items: center;
+          justify-content: center;
+          // position: relative;
+
+          .icon {
+            width: 22px;
+            margin: 6px 0 0 27px;
+          }
+          .t {
+            flex: 1;
+            font-size: 18px;
+            font-weight: 400;
+            color: #333333;
+            text-align: left;
+            margin-left: 10px;
+            // margin: 5px 0 0 27px;
+          }
+          .rt {
+            margin-left: 10px;
+            flex: 1;
+            // position: absolute;
+            // right: 15px;
+            // top: 10px;
+            font-weight: bold;
+            color: #38a1f2;
+            font-size: 18px;
+            text-align: left;
+          }
+        }
+
+        .i:nth-child(1) {
+          background: #93d2f3;
+        }
+
+        .i:nth-child(2) {
+          background: #f4ce98;
+        }
+
+        .i:nth-child(3) {
+          background: #de868f;
+        }
+      }
+    }
+    .right {
+      width: 521px;
+    }
+  }
+
+  .tableBox1 {
+    display: flex;
+    .left {
+      flex: 1;
+      .top {
+        display: flex;
+        justify-content: space-between;
+        margin: 13px 0;
+        .lt {
+          display: flex;
+          .item {
+            padding: 0 20px 0 0;
+            background: #f1f6ff;
+            border-radius: 4px;
+            display: flex;
+            align-items: center;
+            margin: 0 11px 0 0;
+            .icon {
+              width: 18px;
+              margin: 12px;
+            }
+            .con {
+              font-size: 12px;
+              font-weight: 400;
+              color: #333333;
+            }
+            .baifen {
+              font-size: 16px;
+              font-weight: bold;
+              color: #185da6;
+              margin: 0 0 0 15px;
+            }
+          }
+        }
+      }
+    }
+    .right {
+      width: 521px;
+    }
+  }
+
+  .tableBox2 {
+    .top {
+      display: flex;
+      justify-content: space-between;
+      margin: 13px 0;
+    }
+  }
+}
+.blueju {
+  background: #a0d0f0;
+  color: #000;
+  border: 1px solid #d8d9da;
+}
+.whiteju {
+  border: 2px solid #d8d9da;
+  display: flex;
+  align-items: center;
+  height: 40px;
+}
+.footers {
+  display: flex;
+  justify-content: flex-end;
+  margin-top: 20px;
+}
+</style>

+ 591 - 0
src/views/allcase/caseIndex.vue

@@ -0,0 +1,591 @@
+<template>
+  <div class="box">
+    <el-row :gutter="16">
+      <!-- 左侧菜单 -->
+      <el-col :span="8">
+        <div class="box_wrapper">
+          <el-input placeholder="输入关键字进行过滤" v-model="filterText"></el-input>
+          <el-tree class="filter-tree" node-key="id" highlight-current :data="menus" :props="defaultProps" :filter-node-method="filterNode" ref="tree" @node-click="handleNodeClick"></el-tree>
+        </div>
+      </el-col>
+      <!-- 右侧列表 -->
+      <el-col :span="16">
+        <div class="box_wrapper">
+          <el-form :inline="true" :model="formInline" class="demo-form-inline">
+            <el-form-item label="查询时间">
+              <el-date-picker v-model="formInline.year" :clearable="false" type="year" :picker-options="pickerOptions" format="yyyy年" value-format="yyyy" placeholder="选择年份"></el-date-picker>
+            </el-form-item>
+            <el-form-item>
+              <el-button type="primary" @click="onSearch">查询</el-button>
+            </el-form-item>
+          </el-form>
+          <el-table :data="tableData" style="width: 100%">
+            <el-table-column prop="name" label="名称" show-overflow-tooltip></el-table-column>
+            <el-table-column prop="time" label="日期" width="200"></el-table-column>
+            <el-table-column prop="" label="数据" width="200">
+              <template slot-scope="scope">
+                <span v-if="ruleId > 100" class="link" @click="toCaseIndexPage(scope.row)">{{ scope.row[judgeNum] }}</span>
+                <span v-else>{{ scope.row.res * 100 + '%' }}</span>
+              </template>
+            </el-table-column>
+            <el-table-column prop="source" label="来源" width="200"></el-table-column>
+          </el-table>
+        </div>
+      </el-col>
+    </el-row>
+  </div>
+</template>
+
+<script>
+export default {
+  data() {
+    return {
+      menus: [
+        {
+          id: 1,
+          name: '一、人力资源配置指标',
+          children: [
+            {
+              id: 11,
+              name: '指标一、住院病案管理人员月均负担出院患者病历数',
+              children: [
+                {
+                  id: 111,
+                  name: '出院患者病历总数',
+                },
+                {
+                  id: 112,
+                  name: '同期住院病案管理人员实际工作总月数',
+                },
+              ],
+            },
+            {
+              id: 12,
+              name: '指标二、门诊病案管理人员月均负担门诊患者病历数',
+              children: [
+                {
+                  id: 121,
+                  name: '门诊患者病历总数',
+                },
+                {
+                  id: 122,
+                  name: '同期门诊病案管理人员实际工作总月数',
+                },
+              ],
+            },
+            {
+              id: 13,
+              name: '指标三、病案编码人员月均负担出院患者病历数',
+              children: [
+                {
+                  id: 131,
+                  name: '出院患者病历总数',
+                },
+                {
+                  id: 132,
+                  name: '同期病案编码人员实际工作总月数',
+                },
+              ],
+            },
+          ],
+        },
+        {
+          id: 2,
+          name: '二、病历书写时效性指标',
+          children: [
+            {
+              id: 21,
+              name: '指标四、入院记录 24 小时内完成率',
+              children: [
+                {
+                  id: 211,
+                  name: '入院记录在患者入院24小时内完成的住院患者病历数',
+                },
+                {
+                  id: 212,
+                  name: '同期入院患者病历总数',
+                },
+              ],
+            },
+            {
+              id: 22,
+              name: '指标五、手术记录24小时内完成率',
+              children: [
+                {
+                  id: 221,
+                  name: '手术记录在术后24小时内完成的住院患者病历数',
+                },
+                {
+                  id: 222,
+                  name: '同期住院患者病历总数',
+                },
+              ],
+            },
+            {
+              id: 23,
+              name: '指标六、出院记录24小时内完成率',
+              children: [
+                {
+                  id: 231,
+                  name: '出院记录在患者出院后24小时内完成的病历数',
+                },
+                {
+                  id: 232,
+                  name: '同期出院患者病历总数',
+                },
+              ],
+            },
+            {
+              id: 24,
+              name: '指标七、病案首页24小时内完成率',
+              children: [
+                {
+                  id: 241,
+                  name: '病案首页在患者出院后24小时内完成的病历数',
+                },
+                {
+                  id: 242,
+                  name: '同期出院患者病历总数',
+                },
+              ],
+            },
+          ],
+        },
+        {
+          id: 3,
+          name: '三、重大检查记录符合率',
+          children: [
+            {
+              id: 31,
+              name: '指标八、CT/MRI检查记录符合率',
+              children: [
+                {
+                  id: 311,
+                  name: 'CT/MRI检查医嘱、报告单、病程记录相对应的住院病历数',
+                },
+                {
+                  id: 312,
+                  name: '同期接受CT,MRI检查的住院病历总数',
+                },
+              ],
+            },
+            {
+              id: 32,
+              name: '指标九、病理检查记录符合率',
+              children: [
+                {
+                  id: 321,
+                  name: '手术记录、病理检查报告单、病程记录相对应的住院患者病历数',
+                },
+                {
+                  id: 322,
+                  name: '同期开展病理检查的住院患者病历总数',
+                },
+              ],
+            },
+            {
+              id: 33,
+              name: '指标十、细菌培养检查记录符合率',
+              children: [
+                {
+                  id: 331,
+                  name: '细菌培养检查的医嘱、报告单、病程记录相对应的住院患者病历数',
+                },
+                {
+                  id: 332,
+                  name: '同期开展细菌培养检查的住院患者病历总数',
+                },
+              ],
+            },
+          ],
+        },
+        {
+          id: 4,
+          name: '四、诊疗行为记录符合率',
+          children: [
+            {
+              id: 41,
+              name: '指标十一、抗菌药物使用记录符合率',
+              children: [
+                {
+                  id: 411,
+                  name: '抗菌药物使用医嘱、病程记录相对应的住院患者病历数',
+                },
+                {
+                  id: 412,
+                  name: '同期使用抗菌药物的住院患者病历总数',
+                },
+              ],
+            },
+            {
+              id: 42,
+              name: '指标十二、恶性肿瘤化学治疗记录符合率',
+              children: [
+                {
+                  id: 421,
+                  name: '恶性肿瘤化学治疗医嘱、病程记录相对应的住院患者病历数',
+                },
+                {
+                  id: 422,
+                  name: '同期接受恶性肿瘤化学治疗的住院患者病历总数',
+                },
+              ],
+            },
+            {
+              id: 43,
+              name: '指标十三、恶性肿瘤放射治疗记录符合率',
+              children: [
+                {
+                  id: 431,
+                  name: '恶性肿瘤放射治疗医嘱(治疗单) 、病程记录相对应的住院患者病历数',
+                },
+                {
+                  id: 432,
+                  name: '同期开展恶性肿瘤放射治疗的住院患者病历总数',
+                },
+              ],
+            },
+            {
+              id: 44,
+              name: '指标十四、手术相关记录完整率',
+              children: [
+                {
+                  id: 441,
+                  name: '手术相关记录完整的住院手术患者病历数',
+                },
+                {
+                  id: 442,
+                  name: '同期住院手术患者病历总数',
+                },
+              ],
+            },
+            {
+              id: 45,
+              name: '指标十五、植入物相关记录符合率',
+              children: [
+                {
+                  id: 451,
+                  name: '植入物相关记录符合的住院患者病历数',
+                },
+                {
+                  id: 452,
+                  name: '同期使用植入物的住院患者病历总数',
+                },
+              ],
+            },
+            {
+              id: 46,
+              name: '指标十六、临床用血相关记录符合率',
+              children: [
+                {
+                  id: 461,
+                  name: '临床用血相关记录符合的住院患者病历数',
+                },
+                {
+                  id: 462,
+                  name: '同期存在临床用血的住院患者病历总数',
+                },
+              ],
+            },
+            {
+              id: 47,
+              name: '指标十七、医师查房记录完整率',
+              children: [
+                {
+                  id: 471,
+                  name: '医师查房记录完整的住院患者病历数',
+                },
+                {
+                  id: 472,
+                  name: '同期住院患者病历总数',
+                },
+              ],
+            },
+            {
+              id: 48,
+              name: '指标十八、患者抢救记录及时完成率',
+              children: [
+                {
+                  id: 481,
+                  name: '抢救记录及时完成的住院患者病历数',
+                },
+                {
+                  id: 482,
+                  name: '同期接受抢救的住院患者病历总数',
+                },
+              ],
+            },
+          ],
+        },
+        {
+          id: 5,
+          name: '五、病历归档质量指标',
+          children: [
+            {
+              id: 51,
+              name: '指标十九、出院患者病历2日归档率',
+              children: [
+                {
+                  id: 511,
+                  name: '2个工作日内完成归档的出院患者病历数',
+                },
+                {
+                  id: 512,
+                  name: '同期出院患者病历总数',
+                },
+              ],
+            },
+            {
+              id: 52,
+              name: '指标二十、出院患者病历归档完整率',
+              children: [
+                {
+                  id: 521,
+                  name: '归档病历内容完整的出院患者病历数',
+                },
+                {
+                  id: 522,
+                  name: '同期出院患者病历总数',
+                },
+              ],
+            },
+            {
+              id: 53,
+              name: '指标二十一、主要诊断填写正确率',
+              children: [
+                {
+                  id: 531,
+                  name: '病案首页中主要诊断填写正确的出院患者病历 数',
+                },
+                {
+                  id: 532,
+                  name: '同期出院患者病历总数',
+                },
+              ],
+            },
+            {
+              id: 54,
+              name: '指标二十二、主要诊断编码正确率',
+              children: [
+                {
+                  id: 541,
+                  name: '病案首页中主要诊断编码正确的出院患者病历数',
+                },
+                {
+                  id: 542,
+                  name: '同期出院患者病历总数',
+                },
+              ],
+            },
+            {
+              id: 55,
+              name: '指标二十三、主要手术填写正确率',
+              children: [
+                {
+                  id: 551,
+                  name: '病案首页中主要手术填写正确的出院患者病历 数',
+                },
+                {
+                  id: 552,
+                  name: '同期出院手术患者病历总数',
+                },
+              ],
+            },
+            {
+              id: 56,
+              name: '指标二十四、主要手术编码正确率',
+              children: [
+                {
+                  id: 561,
+                  name: '病案首页中主要手术编码正确的出院患者病历数',
+                },
+                {
+                  id: 562,
+                  name: '同期出院手术患者病历总数',
+                },
+              ],
+            },
+            {
+              id: 57,
+              name: '指标二十五、不合理复制病历发生率',
+              children: [
+                {
+                  id: 571,
+                  name: '出现不合理复制病历内容的出院患者病历数',
+                },
+                {
+                  id: 572,
+                  name: '同期出院患者病历总数',
+                },
+              ],
+            },
+            {
+              id: 58,
+              name: '指标二十六、知情同意书规范签署率',
+              children: [
+                {
+                  id: 581,
+                  name: '规范签署知情同意书的出院患者病历数',
+                },
+                {
+                  id: 582,
+                  name: '同期存在知情同意书签署的出院患者病历总数',
+                },
+              ],
+            },
+            {
+              id: 59,
+              name: '指标二十七、甲级病历率',
+              children: [
+                {
+                  id: 591,
+                  name: '田级出院患者病历数',
+                },
+                {
+                  id: 592,
+                  name: '同期出院患者病历总数',
+                },
+              ],
+            },
+          ],
+        },
+      ],
+      formInline: {
+        year: '',
+      },
+      tableData: [],
+      filterText: '',
+      defaultProps: {
+        children: 'children',
+        label: 'name'
+      },
+      ruleId: '',
+      ruleName: '',
+      time: new Date(),
+      pickerOptions: {
+        disabledDate(time) {
+           const date = new Date()
+           const year = date.getFullYear();
+           const timeYear = time.getFullYear();
+           return year < timeYear
+        }
+      }
+    };
+  },
+  computed: {
+    // 判断是取分子还是分母
+    judgeNum() {
+      const str = `${this.ruleId}`
+      const length = str.length
+      const lastNum = str[length - 1]
+      if (Number(lastNum) > 1) {
+        // 分母
+        return 'denominator'
+      } else {
+        // 分子
+        return 'numerator'
+      }
+    }
+  },
+  watch: {
+    filterText(val) {
+      this.$refs.tree.filter(val);
+    }
+  },
+  methods: {
+    // 病案指标列表跳转
+    toCaseIndexPage(row) {
+      const { time } = row
+      this.$router.push({ path: '/caseIndexList', query: { time, ruleId: Number(`${this.ruleId}`.slice(0, 2)), type: this.judgeNum} })
+    },
+    // 菜单筛选
+    filterNode(value, data) {
+      if (!value) return true;
+      return data.name.indexOf(value) !== -1;
+    },
+    handleNodeClick(data) {
+      const { id, name } = data
+      this.ruleId = id
+      this.ruleName = name
+      if (id>10 && this.formInline.year) {
+        this.getList()
+      }
+    },
+    // 获取右侧列表数据
+    getList() {
+      const { year } = this.formInline
+      const params = {
+        start_time: `${year}0101`,
+        end_time: `${year}1231`,
+        year,
+        type: Number(`${this.ruleId}`.slice(0, 2))
+      }
+      this.$axios2.post('/get_assessment_indicators', params).then(res => {
+        if (Array.isArray(res.data)) {
+          res.data.map(item => {
+            item.name = this.ruleName
+          })
+          this.tableData = res.data
+        } else {
+          this.tableData = []
+        }
+      })
+    },
+    // 查询
+    onSearch() {
+      const { year } = this.formInline
+      if (!year) {
+        this.$message.error('请选择查询时间')
+        return
+      }
+      if (!this.ruleId) {
+        this.$message.error('请选择查询指标')
+        return
+      }
+      this.getList()
+    },
+  },
+};
+</script>
+
+<style lang="scss" scoped>
+
+.link{
+  font-weight: 600;
+  color: #409eff;
+  cursor: pointer;
+}
+.box {
+  padding: 16px;
+  .box_wrapper {
+    padding: 16px;
+    background: #fff;
+    height: calc(100vh - 82px);
+    border-radius: 5px;
+    overflow-y: scroll;
+  }
+}
+.filter-tree {
+  margin-top: 16px;
+  ::v-deep .el-tree-node__content {
+    height: 36px;
+    line-height: 36px;
+  }
+}
+
+::v-deep.el-table .el-table__header tr th {
+  background: #f1f6ff;
+  color: #13171e;
+  border-bottom: 0px;
+}
+::v-deep.el-table .el-table__row td {
+  color: #7e8bab;
+  border-bottom: 1px solid #f4f4f4;
+}
+::v-deep.el-table .el-table__header tr th:first-child {
+  border-radius: 5px 0px 0px 5px;
+}
+::v-deep.el-table .el-table__header tr th:nth-child(3) {
+  border-radius: 0px 5px 5px 0px;
+}
+</style>

部分文件因为文件数量过多而无法显示