@ -0,0 +1,3 @@ |
|||||
|
> 1% |
||||
|
last 2 versions |
||||
|
not dead |
@ -0,0 +1,8 @@ |
|||||
|
[*.{js,jsx,ts,tsx,vue}] |
||||
|
indent_style = space |
||||
|
indent_size = 2 |
||||
|
end_of_line = lf |
||||
|
trim_trailing_whitespace = true |
||||
|
insert_final_newline = true |
||||
|
max_line_length = 140 |
||||
|
root = true |
@ -0,0 +1,3 @@ |
|||||
|
VUE_APP_MODE=production |
||||
|
VUE_APP_PREVIEW=false |
||||
|
VUE_APP_URL=https://www.tall.wiki/ |
@ -0,0 +1,11 @@ |
|||||
|
VUE_APP_MODE=development |
||||
|
VUE_APP_NODE_ENV=development |
||||
|
VUE_APP_SCENE=flat-car |
||||
|
VUE_APP_BASE_URL=https://www.tall.wiki/ |
||||
|
VUE_APP_BASE_URL=https://www.tall.wiki |
||||
|
VUE_APP_API_URL=https://www.tall.wiki |
||||
|
VUE_APP_PROXY_URL= |
||||
|
VUE_APP_PUBLIC_PATH=/qc |
||||
|
VUE_APP_MSG_URL=wss://www.tall.wiki/websocket/message/v4.0/ws |
||||
|
VUE_APP_TITLE=智慧平车 |
||||
|
VUE_APP_DESCRIPTION=智慧平车 |
@ -0,0 +1,3 @@ |
|||||
|
VUE_APP_BASE_URL=http://127.0.0.1:3000 |
||||
|
VUE_APP_API_URL=http://127.0.0.1:3000 |
||||
|
VUE_APP_PROXY_URL= |
@ -0,0 +1,10 @@ |
|||||
|
VUE_APP_MODE=production |
||||
|
VUE_APP_NODE_ENV=production |
||||
|
VUE_APP_SCENE=flat-car |
||||
|
VUE_APP_BASE_URL=https://www.tall.wiki/ |
||||
|
VUE_APP_API_URL=https://www.tall.wiki |
||||
|
VUE_APP_PROXY_URL= |
||||
|
VUE_APP_PUBLIC_PATH=/qc |
||||
|
VUE_APP_MSG_URL=wss://www.tall.wiki/websocket/message/v4.0/ws |
||||
|
VUE_APP_TITLE=智慧平车 |
||||
|
VUE_APP_DESCRIPTION=智慧平车 |
@ -0,0 +1,47 @@ |
|||||
|
/* |
||||
|
* Copyright (c) 2019. |
||||
|
* author: wally |
||||
|
* email: 18603454788@163.com |
||||
|
*/ |
||||
|
|
||||
|
module.exports = { |
||||
|
root: true, |
||||
|
env: { browser: true, node: true }, |
||||
|
extends: ['plugin:vue/recommended', 'plugin:vue/essential'], |
||||
|
|
||||
|
rules: { |
||||
|
'vue/html-self-closing': 'off', |
||||
|
'no-console': process.env.NODE_ENV === 'production' ? 'error' : 'off', |
||||
|
'no-debugger': process.env.NODE_ENV === 'production' ? 'error' : 'off', |
||||
|
'no-param-reassign': ['error', { props: true, ignorePropertyModificationsFor: ['state'] }], |
||||
|
'max-len': ['error', { code: 140, tabWidth: 2 }], |
||||
|
'object-curly-newline': ['error', { multiline: true }], |
||||
|
'arrow-parens': ['error', 'as-needed'], |
||||
|
'linebreak-style': 'off', |
||||
|
'vue/attributes-order': 'off', |
||||
|
'no-param-reassign': 'off', |
||||
|
'vue/singleline-html-element-content-newline': 'off', |
||||
|
'vue/max-attributes-per-line': 'off', |
||||
|
'vue/multiline-html-element-content-newline': 'off', |
||||
|
'vue/html-indent': 'off', |
||||
|
}, |
||||
|
|
||||
|
parserOptions: { parser: 'babel-eslint' }, |
||||
|
|
||||
|
overrides: [ |
||||
|
{ |
||||
|
files: ['**/__tests__/*.{j,t}s?(x)'], |
||||
|
env: { jest: true }, |
||||
|
}, |
||||
|
], |
||||
|
|
||||
|
globals: { |
||||
|
Vue: true, |
||||
|
VueRouter: true, |
||||
|
Vuex: true, |
||||
|
axios: true, |
||||
|
_: true, |
||||
|
Vuetify: true, |
||||
|
vuetify: true, |
||||
|
}, |
||||
|
}; |
@ -0,0 +1,23 @@ |
|||||
|
.DS_Store |
||||
|
node_modules |
||||
|
/dist |
||||
|
|
||||
|
|
||||
|
# local env files |
||||
|
.env.local |
||||
|
.env.*.local |
||||
|
|
||||
|
# Log files |
||||
|
npm-debug.log* |
||||
|
yarn-debug.log* |
||||
|
yarn-error.log* |
||||
|
pnpm-debug.log* |
||||
|
|
||||
|
# Editor directories and files |
||||
|
.idea |
||||
|
.vscode |
||||
|
*.suo |
||||
|
*.ntvs* |
||||
|
*.njsproj |
||||
|
*.sln |
||||
|
*.sw? |
@ -0,0 +1,13 @@ |
|||||
|
{ |
||||
|
"printWidth": 140, |
||||
|
"singleQuote": true, |
||||
|
"semi": true, |
||||
|
"trailingComma": "all", |
||||
|
"arrowParens": "avoid", |
||||
|
"tabWidth": 2, |
||||
|
"useTabs": false, |
||||
|
"bracketSpacing": true, |
||||
|
"jsxBracketSameLine": false, |
||||
|
"proseWrap": "always", |
||||
|
"endOfLine": "lf" |
||||
|
} |
@ -0,0 +1,24 @@ |
|||||
|
# 中医药大学课题数据库 |
||||
|
|
||||
|
## Project setup |
||||
|
``` |
||||
|
yarn install |
||||
|
``` |
||||
|
|
||||
|
### Compiles and hot-reloads for development |
||||
|
``` |
||||
|
yarn serve |
||||
|
``` |
||||
|
|
||||
|
### Compiles and minifies for production |
||||
|
``` |
||||
|
yarn build |
||||
|
``` |
||||
|
|
||||
|
### Lints and fixes files |
||||
|
``` |
||||
|
yarn lint |
||||
|
``` |
||||
|
|
||||
|
### Customize configuration |
||||
|
See [Configuration Reference](https://cli.vuejs.org/config/). |
@ -0,0 +1,13 @@ |
|||||
|
module.exports = { |
||||
|
presets: ["@vue/cli-plugin-babel/preset"], |
||||
|
plugins: [ |
||||
|
[ |
||||
|
"import", |
||||
|
{ |
||||
|
libraryName: "ant-design-vue", |
||||
|
libraryDirectory: "es", |
||||
|
style: true |
||||
|
} |
||||
|
] |
||||
|
] |
||||
|
}; |
@ -0,0 +1 @@ |
|||||
|
module.exports = {extends: ['./node_modules/vue-cli-plugin-commitlint/lib/lint']}; |
@ -0,0 +1,53 @@ |
|||||
|
{ |
||||
|
"name": "wisdom-mobile", |
||||
|
"version": "0.1.0", |
||||
|
"private": true, |
||||
|
"scripts": { |
||||
|
"serve": "vue-cli-service serve", |
||||
|
"serve-mock": "vue-cli-service serve --mode mock", |
||||
|
"build": "vue-cli-service build", |
||||
|
"lint": "vue-cli-service lint" |
||||
|
}, |
||||
|
"dependencies": { |
||||
|
"ant-design-vue": "^1.2.4", |
||||
|
"compression-webpack-plugin": "^6.1.1", |
||||
|
"core-js": "^3.6.5", |
||||
|
"echarts": "^4.9.0", |
||||
|
"echarts-gl": "^1.1.1", |
||||
|
"moment": "^2.29.1", |
||||
|
"register-service-worker": "^1.7.1", |
||||
|
"stylus": "^0.54.8", |
||||
|
"vue": "^2.6.11", |
||||
|
"vue-dompurify-html": "^2.3.0", |
||||
|
"vue-quill-editor": "^3.0.6", |
||||
|
"vue-router": "^3.2.0", |
||||
|
"vuex": "^3.4.0" |
||||
|
}, |
||||
|
"devDependencies": { |
||||
|
"@vue/cli-plugin-babel": "~4.5.0", |
||||
|
"@vue/cli-plugin-eslint": "~4.5.0", |
||||
|
"@vue/cli-plugin-pwa": "~4.5.0", |
||||
|
"@vue/cli-plugin-router": "~4.5.0", |
||||
|
"@vue/cli-plugin-vuex": "~4.5.0", |
||||
|
"@vue/cli-service": "~4.5.0", |
||||
|
"@vue/eslint-config-prettier": "^6.0.0", |
||||
|
"axios": "^0.18.0", |
||||
|
"babel-eslint": "^10.1.0", |
||||
|
"babel-plugin-import": "^1.11.0", |
||||
|
"css-loader": "^5.0.1", |
||||
|
"eslint": "^6.7.2", |
||||
|
"eslint-plugin-prettier": "^3.1.3", |
||||
|
"eslint-plugin-vue": "^6.2.2", |
||||
|
"less": "^2.7.3", |
||||
|
"less-loader": "^4.1.0", |
||||
|
"prettier": "^1.19.1", |
||||
|
"sass": "^1.26.5", |
||||
|
"sass-loader": "^8.0.2", |
||||
|
"stylus": "^0.54.5", |
||||
|
"stylus-loader": "^3.0.2", |
||||
|
"svg-sprite-loader": "^5.0.0", |
||||
|
"vue-cli-plugin-ant-design": "^1.0.1", |
||||
|
"vue-cli-plugin-axios": "^0.0.4", |
||||
|
"vue-template-compiler": "^2.6.11" |
||||
|
} |
||||
|
} |
After Width: | Height: | Size: 1.1 KiB |
After Width: | Height: | Size: 1.4 KiB |
After Width: | Height: | Size: 9.2 KiB |
After Width: | Height: | Size: 29 KiB |
After Width: | Height: | Size: 6.3 KiB |
After Width: | Height: | Size: 22 KiB |
After Width: | Height: | Size: 3.3 KiB |
After Width: | Height: | Size: 84 KiB |
After Width: | Height: | Size: 4.6 KiB |
After Width: | Height: | Size: 1.5 KiB |
After Width: | Height: | Size: 1.8 KiB |
After Width: | Height: | Size: 4.6 KiB |
After Width: | Height: | Size: 84 KiB |
After Width: | Height: | Size: 84 KiB |
After Width: | Height: | Size: 84 KiB |
After Width: | Height: | Size: 4.2 KiB |
After Width: | Height: | Size: 215 B |
@ -0,0 +1,19 @@ |
|||||
|
<!DOCTYPE html> |
||||
|
<html lang="en"> |
||||
|
<head> |
||||
|
<meta charset="utf-8"> |
||||
|
<meta http-equiv="X-UA-Compatible" content="IE=edge"> |
||||
|
<meta name="viewport" content="width=device-width,initial-scale=1.0"> |
||||
|
<link rel="icon" href="./favicon.ico"> |
||||
|
<meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0"> |
||||
|
<title><%= htmlWebpackPlugin.options.title %></title> |
||||
|
</head> |
||||
|
<body> |
||||
|
<noscript> |
||||
|
<strong>We're sorry but <%= htmlWebpackPlugin.options.title %> doesn't work properly without JavaScript enabled. Please enable it to continue.</strong> |
||||
|
</noscript> |
||||
|
<div id="app"></div> |
||||
|
<!-- built files will be auto injected --> |
||||
|
<script src="./sdk.js"></script> |
||||
|
</body> |
||||
|
</html> |
@ -0,0 +1,2 @@ |
|||||
|
User-agent: * |
||||
|
Disallow: |
@ -0,0 +1,99 @@ |
|||||
|
/* |
||||
|
* @Author: aBin |
||||
|
* @email: binbin0314@126.com |
||||
|
* @Date: 2021-04-19 10:23:19 |
||||
|
* @LastEditors: aBin |
||||
|
* @LastEditTime: 2021-06-09 09:50:31 |
||||
|
*/ |
||||
|
/** |
||||
|
* ccsens tall sdk.js |
||||
|
* v1.0.0 |
||||
|
* 父组件调用 TallPlugin.init()即可 |
||||
|
* 监听message消息, 如果是created消息 就把tall的参数传递过来 |
||||
|
*/ |
||||
|
|
||||
|
(function(window) { |
||||
|
// 单例局部变量
|
||||
|
var _instance = null; |
||||
|
// 对外暴露TallPlugin类
|
||||
|
window.TallPlugin = function(config) { |
||||
|
this.config = config; |
||||
|
this.props = null; |
||||
|
this.parent = '*'; |
||||
|
}; |
||||
|
|
||||
|
// 初始化并保证是单例
|
||||
|
TallPlugin.init = function(callback, config) { |
||||
|
if (!_instance) { |
||||
|
_instance = new TallPlugin(config); |
||||
|
_instance.config = config; |
||||
|
_instance.parent = window.parent.origin; |
||||
|
// DOM加载完成
|
||||
|
window.addEventListener('DOMContentLoaded', _instance.mounted, false); |
||||
|
// window onload
|
||||
|
window.addEventListener('load', _instance.loaded, false); |
||||
|
// destroy
|
||||
|
window.addEventListener('unload', _instance.destroy, false); |
||||
|
// error
|
||||
|
window.addEventListener('error', _instance.error, false); |
||||
|
_instance.onMessage(callback); |
||||
|
} |
||||
|
return _instance; |
||||
|
}; |
||||
|
|
||||
|
TallPlugin.prototype.onMessage = function(callback) { |
||||
|
var _this = this; |
||||
|
window.addEventListener( |
||||
|
'message', |
||||
|
function(event) { |
||||
|
try { |
||||
|
if (_this.parent === event.origin) { |
||||
|
// 是父窗体传来的消息
|
||||
|
console.log('event.data:', event.data); |
||||
|
var data = JSON.parse(event.data); |
||||
|
_this.props = data || null; |
||||
|
callback && typeof callback === 'function' && callback.call(_this, data); |
||||
|
} else { |
||||
|
_this.props = null; |
||||
|
} |
||||
|
} catch (e) { |
||||
|
// console.error(`TallPlugin warn: ${e}`)
|
||||
|
_this.props = null; |
||||
|
} |
||||
|
}, |
||||
|
false, |
||||
|
); |
||||
|
return this; |
||||
|
}; |
||||
|
|
||||
|
// DOMContentLoaded DOM加载完成触发
|
||||
|
TallPlugin.prototype.mounted = function(callback) { |
||||
|
var _this = this; |
||||
|
window.postMessage('created', _this.parent); |
||||
|
callback && typeof callback === 'function' && callback.call(this); |
||||
|
return this; |
||||
|
}; |
||||
|
// load window onload触发
|
||||
|
TallPlugin.prototype.loaded = function(callback) { |
||||
|
var _this = this; |
||||
|
window.postMessage('loaded', _this.parent); |
||||
|
callback && typeof callback === 'function' && callback.call(this); |
||||
|
return this; |
||||
|
}; |
||||
|
|
||||
|
// 子窗体销毁触发
|
||||
|
TallPlugin.prototype.destroy = function(callback) { |
||||
|
var _this = this; |
||||
|
window.postMessage('destroy', _this.parent); |
||||
|
callback && typeof callback === 'function' && callback.call(this); |
||||
|
return this; |
||||
|
}; |
||||
|
|
||||
|
// error触发
|
||||
|
TallPlugin.prototype.error = function(callback) { |
||||
|
var _this = this; |
||||
|
window.postMessage('error', _this.parent); |
||||
|
callback && typeof callback === 'function' && callback.call(this); |
||||
|
return this; |
||||
|
}; |
||||
|
})(window); |
@ -0,0 +1,15 @@ |
|||||
|
{ |
||||
|
"$shared": { |
||||
|
"version": "v1", |
||||
|
"identifier": "wally", |
||||
|
"credential": "111111" |
||||
|
}, |
||||
|
"dev": { |
||||
|
"name": "dev", |
||||
|
"url": "http://192.168.31.13/gateway" |
||||
|
}, |
||||
|
"local": { |
||||
|
"version": "v2", |
||||
|
"url": "http://192.168.31.13/gateway" |
||||
|
} |
||||
|
} |
@ -0,0 +1,55 @@ |
|||||
|
# @tall = {{url}}/tall/v1.0 |
||||
|
@tall = https://test.tall.wiki/gateway/tall/v1.0 |
||||
|
@tcm = https://test.tall.wiki/gateway/tcm |
||||
|
@type = content-type: application/json;charset=utf-8 |
||||
|
|
||||
|
### login |
||||
|
|
||||
|
# @name login |
||||
|
POST {{tall}}/users/signin |
||||
|
{{type}} |
||||
|
|
||||
|
{ |
||||
|
"client": 1, |
||||
|
"type": 3, |
||||
|
"data": { |
||||
|
"identifier": "song", |
||||
|
"credential": "999999" |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
### send code |
||||
|
|
||||
|
GET {{tall}}/users/smscode?phone=16603418748 |
||||
|
|
||||
|
|
||||
|
### phone login |
||||
|
# @name phonelogin |
||||
|
POST {{tall}}/users/signin |
||||
|
{{type}} |
||||
|
|
||||
|
{ |
||||
|
"client": 1, |
||||
|
"type": 1, |
||||
|
"data": { |
||||
|
"identifier": "16603418748", |
||||
|
"credential": "1111" |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
### 根据团队id查看研发团队相关信息 |
||||
|
|
||||
|
POST {{tcm}}/patient/selSearchCriteriaList |
||||
|
{{type}} |
||||
|
Authorization: Bearer {{login.response.body.$.data.token}} |
||||
|
|
||||
|
# { |
||||
|
# "param": { |
||||
|
# "company": "", |
||||
|
# "researchDirection": "", |
||||
|
# "teamId": 0, |
||||
|
# "teamIntroduce": "", |
||||
|
# "teamLeaderName": "", |
||||
|
# "teamName": "" |
||||
|
# } |
||||
|
# } |
@ -0,0 +1,78 @@ |
|||||
|
<template> |
||||
|
<a-config-provider :locale="zh_CN"> |
||||
|
<!-- <div v-if="anyringToken && ptProps.userId" class="d-flex flex-column flex-wrap" id="app"> --> |
||||
|
<div class="d-flex flex-column flex-wrap" id="app"> |
||||
|
<btn-con class="btn-box fill-width" /> |
||||
|
<Title></Title> |
||||
|
<router-view style="margin-top: 48px; padding-bottom: 50px" class="flex-1 bg fill-width"></router-view> |
||||
|
</div> |
||||
|
</a-config-provider> |
||||
|
</template> |
||||
|
|
||||
|
<script> |
||||
|
import { mapState, mapActions, mapMutations } from 'vuex'; |
||||
|
import zh_CN from 'ant-design-vue/lib/locale-provider/zh_CN'; |
||||
|
import BtnCon from 'components/BtnCon/BtnCon.vue'; |
||||
|
import Title from 'components/Title/Title.vue'; |
||||
|
export default { |
||||
|
name: 'App', |
||||
|
components: { Title,BtnCon }, |
||||
|
data() { |
||||
|
return { zh_CN }; |
||||
|
}, |
||||
|
|
||||
|
computed: mapState('home', ['anyringToken', 'ptProps']), |
||||
|
|
||||
|
// created() { |
||||
|
// 测试数据 |
||||
|
async created() { |
||||
|
const userId = '1217647686598135808'; |
||||
|
const params = { userId }; |
||||
|
await this.getUserId(params); |
||||
|
await this.getToken(); |
||||
|
|
||||
|
// 正式 |
||||
|
// this.getProps(); |
||||
|
}, |
||||
|
|
||||
|
methods: { |
||||
|
...mapActions('home', ['getUserId']), |
||||
|
...mapMutations('home', ['setPtProps', 'getToken']), |
||||
|
|
||||
|
async getProps() { |
||||
|
var query = window.location.search.substring(1); |
||||
|
var vars = query.split('&'); |
||||
|
const obj = {}; |
||||
|
for (var i = 0; i < vars.length; i++) { |
||||
|
var pair = vars[i].split('='); |
||||
|
obj[pair[0]] = pair[1]; |
||||
|
} |
||||
|
this.setPtProps(obj); |
||||
|
if (obj && obj.userId) { |
||||
|
const params = { userId: obj.userId }; |
||||
|
await this.getUserId(params); |
||||
|
await this.getToken(); |
||||
|
} |
||||
|
}, |
||||
|
}, |
||||
|
}; |
||||
|
</script> |
||||
|
|
||||
|
<style> |
||||
|
html, |
||||
|
body, |
||||
|
#app { |
||||
|
min-height: 100%; |
||||
|
} |
||||
|
|
||||
|
#app { |
||||
|
background: transparent; |
||||
|
} |
||||
|
body::-webkit-scrollbar { |
||||
|
width: 0; |
||||
|
} |
||||
|
</style> |
||||
|
|
||||
|
<style lang="stylus"> |
||||
|
@import './common/portrait.styl'; |
||||
|
</style> |
After Width: | Height: | Size: 3.8 KiB |
After Width: | Height: | Size: 388 B |
After Width: | Height: | Size: 3.0 KiB |
@ -0,0 +1,486 @@ |
|||||
|
// padding |
||||
|
.pa-3 { |
||||
|
padding: 12px; |
||||
|
} |
||||
|
|
||||
|
.pl-1{ |
||||
|
padding-left: 4px; |
||||
|
} |
||||
|
|
||||
|
.pl-2{ |
||||
|
padding-left: 8px; |
||||
|
} |
||||
|
|
||||
|
.pl-3{ |
||||
|
padding-left: 12px; |
||||
|
} |
||||
|
|
||||
|
.pl-4{ |
||||
|
padding-left: 16px; |
||||
|
} |
||||
|
|
||||
|
.pl-5{ |
||||
|
padding-left: 20px; |
||||
|
} |
||||
|
|
||||
|
|
||||
|
.pr-1{ |
||||
|
padding-right: 4px; |
||||
|
} |
||||
|
|
||||
|
.pr-2{ |
||||
|
padding-right: 8px; |
||||
|
} |
||||
|
|
||||
|
.pr-3{ |
||||
|
padding-right: 12px; |
||||
|
} |
||||
|
|
||||
|
.pr-4{ |
||||
|
padding-right: 16px; |
||||
|
} |
||||
|
|
||||
|
.pr-5{ |
||||
|
padding-right: 20px; |
||||
|
} |
||||
|
|
||||
|
.px-1{ |
||||
|
padding-left: 4px; |
||||
|
padding-right: 4px; |
||||
|
} |
||||
|
|
||||
|
.px-2{ |
||||
|
padding-left: 8px; |
||||
|
padding-right: 8px; |
||||
|
} |
||||
|
|
||||
|
.px-3{ |
||||
|
padding-left: 12px; |
||||
|
padding-right: 12px; |
||||
|
} |
||||
|
|
||||
|
.px-10{ |
||||
|
padding-left: 30px; |
||||
|
padding-right: 30px; |
||||
|
} |
||||
|
|
||||
|
.py-1{ |
||||
|
padding-top: 4px; |
||||
|
padding-bottom: 4px; |
||||
|
} |
||||
|
|
||||
|
.py-2{ |
||||
|
padding-top: 8px; |
||||
|
padding-bottom: 8px; |
||||
|
} |
||||
|
|
||||
|
.py-3{ |
||||
|
padding-top: 12px; |
||||
|
padding-bottom: 12px; |
||||
|
} |
||||
|
|
||||
|
.pt-3 { |
||||
|
padding-top: 12px; |
||||
|
} |
||||
|
|
||||
|
.pb-3 { |
||||
|
padding-bottom: 12px; |
||||
|
} |
||||
|
|
||||
|
.pb-4 { |
||||
|
padding-bottom: 16px; |
||||
|
} |
||||
|
|
||||
|
.pb-5 { |
||||
|
padding-bottom: 20px; |
||||
|
} |
||||
|
|
||||
|
.pb-10 { |
||||
|
padding-bottom: 40px; |
||||
|
} |
||||
|
|
||||
|
// margin |
||||
|
.ma-2 { |
||||
|
margin: 8px; |
||||
|
} |
||||
|
|
||||
|
.ma-3 { |
||||
|
margin: 12px; |
||||
|
} |
||||
|
|
||||
|
.mx-2{ |
||||
|
margin-left: 8px; |
||||
|
margin-right: 8px; |
||||
|
} |
||||
|
|
||||
|
.mx-3{ |
||||
|
margin-left: 12px; |
||||
|
margin-right: 12px; |
||||
|
} |
||||
|
|
||||
|
.my-0{ |
||||
|
margin-top: 0px; |
||||
|
margin-bottom: 0px; |
||||
|
} |
||||
|
|
||||
|
.my-1{ |
||||
|
margin-top: 4px; |
||||
|
margin-bottom: 4px; |
||||
|
} |
||||
|
|
||||
|
.my-2{ |
||||
|
margin-top: 8px; |
||||
|
margin-bottom: 8px; |
||||
|
} |
||||
|
|
||||
|
.my-3{ |
||||
|
margin-top: 12px; |
||||
|
margin-bottom: 12px; |
||||
|
} |
||||
|
|
||||
|
.my-4{ |
||||
|
margin-top: 16px; |
||||
|
margin-bottom: 16px; |
||||
|
} |
||||
|
|
||||
|
.mt-1{ |
||||
|
margin-top: 4px; |
||||
|
} |
||||
|
|
||||
|
.mt-2{ |
||||
|
margin-top: 8px; |
||||
|
} |
||||
|
|
||||
|
.mt-3{ |
||||
|
margin-top: 12px; |
||||
|
} |
||||
|
|
||||
|
.mt-4{ |
||||
|
margin-top: 16px; |
||||
|
} |
||||
|
|
||||
|
.mb-0{ |
||||
|
margin-bottom: 0px; |
||||
|
} |
||||
|
|
||||
|
.mb-1{ |
||||
|
margin-bottom: 4px; |
||||
|
} |
||||
|
|
||||
|
.mb-2{ |
||||
|
margin-bottom: 8px; |
||||
|
} |
||||
|
|
||||
|
.mb-3{ |
||||
|
margin-bottom: 12px; |
||||
|
} |
||||
|
|
||||
|
.mb-4{ |
||||
|
margin-bottom: 16px; |
||||
|
} |
||||
|
|
||||
|
.mb-10{ |
||||
|
margin-bottom: 40px; |
||||
|
} |
||||
|
|
||||
|
.ml-1{ |
||||
|
margin-left: 4px; |
||||
|
} |
||||
|
|
||||
|
.ml-2{ |
||||
|
margin-left: 8px; |
||||
|
} |
||||
|
|
||||
|
.ml-3{ |
||||
|
margin-left: 12px; |
||||
|
} |
||||
|
|
||||
|
.ml-4{ |
||||
|
margin-left: 16px; |
||||
|
} |
||||
|
|
||||
|
.ml-5{ |
||||
|
margin-left: 20px; |
||||
|
} |
||||
|
|
||||
|
.ml-6{ |
||||
|
margin-left: 24px; |
||||
|
} |
||||
|
|
||||
|
.ml-7{ |
||||
|
margin-left: 28px; |
||||
|
} |
||||
|
|
||||
|
.ml-8{ |
||||
|
margin-left: 32px; |
||||
|
} |
||||
|
|
||||
|
.ml-9{ |
||||
|
margin-left: 36px; |
||||
|
} |
||||
|
|
||||
|
.ml-10{ |
||||
|
margin-left: 40px; |
||||
|
} |
||||
|
|
||||
|
.mr-1{ |
||||
|
margin-right: 4px; |
||||
|
} |
||||
|
|
||||
|
.mr-2{ |
||||
|
margin-right: 8px; |
||||
|
} |
||||
|
|
||||
|
.mr-3{ |
||||
|
margin-right: 12px; |
||||
|
} |
||||
|
|
||||
|
.mr-4{ |
||||
|
margin-right: 16px; |
||||
|
} |
||||
|
|
||||
|
.mr-5{ |
||||
|
margin-right: 20px; |
||||
|
} |
||||
|
|
||||
|
.mr-6{ |
||||
|
margin-right: 24px; |
||||
|
} |
||||
|
|
||||
|
// background |
||||
|
.white { |
||||
|
background: white; |
||||
|
} |
||||
|
|
||||
|
.green{ |
||||
|
background: #4CAF50; |
||||
|
} |
||||
|
|
||||
|
.blue{ |
||||
|
background: #1890ff; |
||||
|
} |
||||
|
|
||||
|
.gray{ |
||||
|
background: #CCCCCC; |
||||
|
} |
||||
|
|
||||
|
.white--text{ |
||||
|
color: #fff; |
||||
|
width: 100px; |
||||
|
margin: 0 auto |
||||
|
} |
||||
|
.bot-right-btn{ |
||||
|
position: fixed; |
||||
|
height: 40px; |
||||
|
right: 6px; |
||||
|
bottom: 20px; |
||||
|
} |
||||
|
.bot-right-tips { |
||||
|
position: fixed; |
||||
|
height: 40px; |
||||
|
font-size: 14px; |
||||
|
right: 18px; |
||||
|
top: 0; |
||||
|
} |
||||
|
// flex |
||||
|
.d-flex{ |
||||
|
display: flex; |
||||
|
} |
||||
|
|
||||
|
.flex-wrap{ |
||||
|
flex-wrap: wrap; |
||||
|
} |
||||
|
|
||||
|
.flex-nowrap{ |
||||
|
flex-wrap: nowrap; |
||||
|
} |
||||
|
|
||||
|
.flex-column{ |
||||
|
flex-direction: column; |
||||
|
} |
||||
|
|
||||
|
.flex-column-reverse{ |
||||
|
flex-direction: column-reverse; |
||||
|
} |
||||
|
|
||||
|
.flex-row{ |
||||
|
flex-direction: row; |
||||
|
} |
||||
|
|
||||
|
.flex-row-reverse{ |
||||
|
flex-direction: row-reverse; |
||||
|
} |
||||
|
|
||||
|
.justify-center{ |
||||
|
justify-content: center; |
||||
|
} |
||||
|
|
||||
|
.justify-space-between{ |
||||
|
justify-content: space-between; |
||||
|
} |
||||
|
|
||||
|
.align-center{ |
||||
|
align-items: center; |
||||
|
} |
||||
|
|
||||
|
.align-left{ |
||||
|
align-items: start; |
||||
|
} |
||||
|
|
||||
|
.flex-1{ |
||||
|
display: flex; |
||||
|
flex: 1; |
||||
|
} |
||||
|
|
||||
|
.flex-2{ |
||||
|
display: flex; |
||||
|
flex: 2; |
||||
|
} |
||||
|
// other |
||||
|
.pointer{ |
||||
|
cursor:pointer; |
||||
|
} |
||||
|
|
||||
|
.pointerEdit { |
||||
|
font-size: 16px; |
||||
|
margin-right: 20px; |
||||
|
} |
||||
|
|
||||
|
.fill-height{ |
||||
|
height:100%; |
||||
|
} |
||||
|
|
||||
|
// font |
||||
|
.font-bold{ |
||||
|
font-weight: bold; |
||||
|
} |
||||
|
|
||||
|
.font-bold-24{ |
||||
|
font-size: 24px; |
||||
|
font-weight: bold; |
||||
|
} |
||||
|
|
||||
|
.font-24{ |
||||
|
font-size: 24px; |
||||
|
} |
||||
|
|
||||
|
.font-bold-18{ |
||||
|
font-size: 18px; |
||||
|
font-weight: bold; |
||||
|
} |
||||
|
|
||||
|
.font-18{ |
||||
|
font-size: 18px; |
||||
|
} |
||||
|
|
||||
|
.font-bold-16{ |
||||
|
font-size: 16px; |
||||
|
font-weight: bold; |
||||
|
} |
||||
|
|
||||
|
.font-16{ |
||||
|
font-size: 16px; |
||||
|
} |
||||
|
|
||||
|
.font-bold-14{ |
||||
|
font-size: 14px; |
||||
|
font-weight: bold; |
||||
|
} |
||||
|
|
||||
|
.font-14{ |
||||
|
font-size: 14px; |
||||
|
} |
||||
|
|
||||
|
.font-12{ |
||||
|
font-size: 12px; |
||||
|
} |
||||
|
|
||||
|
.icon-size{ |
||||
|
font-size: 20px; |
||||
|
} |
||||
|
|
||||
|
h2{ |
||||
|
font-size: 24px; |
||||
|
font-weight: bold; |
||||
|
color: rgba(0,0,0,.85) |
||||
|
} |
||||
|
|
||||
|
.textColor{ |
||||
|
color: rgba(0,0,0,.65) |
||||
|
} |
||||
|
|
||||
|
.text-white{ |
||||
|
color: #fff |
||||
|
} |
||||
|
|
||||
|
.text-red{ |
||||
|
color: #EB3527 |
||||
|
} |
||||
|
|
||||
|
.gray-text{ |
||||
|
color: #bbb |
||||
|
} |
||||
|
|
||||
|
.baseColor{ |
||||
|
color: #1890ff |
||||
|
} |
||||
|
|
||||
|
.bg{ |
||||
|
background: #F5F5F5 |
||||
|
} |
||||
|
|
||||
|
.fill-width{ |
||||
|
width:100%; |
||||
|
} |
||||
|
|
||||
|
.fill-height{ |
||||
|
height:100%; |
||||
|
} |
||||
|
|
||||
|
// .ant-form-item-label { |
||||
|
// text-align: left; |
||||
|
// } |
||||
|
|
||||
|
// .ant-form-item-control { |
||||
|
// width:100% |
||||
|
// } |
||||
|
.ant-form-item-children(:only-child) { |
||||
|
display: flex; |
||||
|
flex-wrap: nowrap; |
||||
|
} |
||||
|
.ant-card-head-title { |
||||
|
font-weight: 600 !important; |
||||
|
font-size: 18px !important; |
||||
|
} |
||||
|
.ant-card-bordered { |
||||
|
border-radius: 10px; |
||||
|
} |
||||
|
|
||||
|
// .ant-spin-nested-loading > div > .ant-spin .ant-spin-dot { |
||||
|
// position: fixed; |
||||
|
// top: 50%; |
||||
|
// left: 50%; |
||||
|
// margin: -10px; |
||||
|
// } |
||||
|
|
||||
|
.ant-list-bordered { |
||||
|
border: none; |
||||
|
border-radius: 4px |
||||
|
} |
||||
|
|
||||
|
.ant-collapse { |
||||
|
background-color: none; |
||||
|
border: none |
||||
|
} |
||||
|
|
||||
|
.w-screen{ |
||||
|
width: 100vw; |
||||
|
} |
||||
|
|
||||
|
.h-screen{ |
||||
|
height: 100vh; |
||||
|
} |
||||
|
|
||||
|
.text-center{ |
||||
|
text-align: center; |
||||
|
} |
@ -0,0 +1,47 @@ |
|||||
|
<!-- |
||||
|
* @Author: your name |
||||
|
* @Date: 2021-07-28 17:06:37 |
||||
|
* @LastEditTime: 2021-07-29 10:24:56 |
||||
|
* @LastEditors: Please set LastEditors |
||||
|
* @Description: In User Settings Edit |
||||
|
* @FilePath: \wisdomcar_mobile\src\components\BtnCon\BtnCon.vue |
||||
|
--> |
||||
|
<template> |
||||
|
<div class="d-flex flex-wrap" style="margin-top:44px"> |
||||
|
<a-button type="primary" @click="jump('/')" class="mx-2 my-2">首页</a-button> |
||||
|
<a-button type="primary" @click="jump('/establish')" class="mx-2 my-2">创建病例</a-button> |
||||
|
<a-button type="primary" @click="jump('/choice')" class="mx-2 my-2">选择平车</a-button> |
||||
|
<a-button type="primary" @click="jump('/groupNotes')" class="mx-2 my-2">团注</a-button> |
||||
|
<a-button type="primary" @click="jump('/currency')" class="mx-2 my-2">通用界面</a-button> |
||||
|
<a-button type="primary" @click="jump('/video')" class="mx-2 my-2">视频谈话</a-button> |
||||
|
<a-button type="primary" @click="jump('/patient')" class="mx-2 my-2">患者表格</a-button> |
||||
|
<a-button type="primary" @click="jump('/information')" class="mx-2 my-2">到场信息</a-button> |
||||
|
<a-button type="primary" @click="jump('/assess')" class="mx-2 my-2">入院评估</a-button> |
||||
|
<a-button type="primary" @click="jump('/medicalSkill')" class="mx-2 my-2">医技结论</a-button> |
||||
|
<a-button type="primary" @click="jump('/treatmentPlan')" class="mx-2 my-2">治疗方案</a-button> |
||||
|
<a-button type="primary" @click="jump('/control')" class="mx-2 my-2">质控</a-button> |
||||
|
<a-button type="primary" @click="jump('/patientList')" class="mx-2 my-2">急救绿色通道列表</a-button> |
||||
|
<a-button type="primary" @click="jump('/report')" class="mx-2 my-2">1月质控报告</a-button> |
||||
|
<a-button type="primary" @click="jump('/vein')" class="mx-2 my-2">静脉溶栓插件</a-button> |
||||
|
<a-button type="primary" @click="jump('/therapy')" class="mx-2 my-2">介入治疗插件</a-button> |
||||
|
<a-button type="primary" @click="jump('/treatment')" class="mx-2 my-2">知情谈话</a-button> |
||||
|
<a-button type="primary" @click="jump('/diagnosis')" class="mx-2 my-2">会诊</a-button> |
||||
|
<a-button type="primary" @click="jump('/infoReport')" class="mx-2 my-2">信息直报</a-button> |
||||
|
</div> |
||||
|
</template> |
||||
|
|
||||
|
<script> |
||||
|
export default { |
||||
|
name: 'BtnCon', |
||||
|
data() { |
||||
|
return {}; |
||||
|
}, |
||||
|
methods: { |
||||
|
jump(url) { |
||||
|
this.$router.push(url); |
||||
|
}, |
||||
|
}, |
||||
|
}; |
||||
|
</script> |
||||
|
|
||||
|
<style lang="stylus" scoped></style> |
@ -0,0 +1,154 @@ |
|||||
|
<!-- |
||||
|
* @Author: aBin |
||||
|
* @email: binbin0314@126.com |
||||
|
* @Date: 2021-06-02 09:37:50 |
||||
|
* @LastEditors: aBin |
||||
|
* @LastEditTime: 2021-06-11 15:29:01 |
||||
|
--> |
||||
|
<template> |
||||
|
<div class="mt-1"> |
||||
|
<a-card class="fill-width"> |
||||
|
<div slot="title" style="color: rgba(76, 115, 177, 0.9)">详情</div> |
||||
|
<a-upload |
||||
|
name="files" |
||||
|
:headers="headers" |
||||
|
:default-file-list="fileList" |
||||
|
:multiple="true" |
||||
|
:action="action" |
||||
|
list-type="picture-card" |
||||
|
@change="handleChange" |
||||
|
> |
||||
|
<div> |
||||
|
<a-icon type="plus" /> |
||||
|
<div class="ant-upload-text">添加图片</div> |
||||
|
</div> |
||||
|
</a-upload> |
||||
|
<a-textarea v-model="value" placeholder="描述..." :auto-size="{ minRows: 3, maxRows: 10 }" /> |
||||
|
<a-button class="mt-2 mb-4" style="height: 40px" type="primary" block @click="setData"> 提交 </a-button> |
||||
|
<div style="color: rgba(76, 115, 177, 0.9)">历史记录</div> |
||||
|
<a-list item-layout="horizontal" :data-source="oldData"> |
||||
|
<a-list-item slot="renderItem" slot-scope="item, index"> |
||||
|
<a-upload |
||||
|
class="fill-width" |
||||
|
style="overflow: hidden" |
||||
|
v-if="item.type === 0" |
||||
|
list-type="picture" |
||||
|
:default-file-list="getFileList(item, index)" |
||||
|
> |
||||
|
</a-upload> |
||||
|
<span v-else-if="item.type === 1">{{ item.comment }}</span> |
||||
|
</a-list-item> |
||||
|
</a-list> |
||||
|
</a-card> |
||||
|
</div> |
||||
|
</template> |
||||
|
|
||||
|
<script> |
||||
|
import { mapState } from 'vuex'; |
||||
|
import { upload, otherUpload, otherQuery } from 'config/api'; |
||||
|
export default { |
||||
|
name: 'Content', |
||||
|
props: { |
||||
|
time: { |
||||
|
type: Number, |
||||
|
default: Date.parse(new Date()), |
||||
|
}, |
||||
|
}, |
||||
|
data() { |
||||
|
return { |
||||
|
fileList: [], |
||||
|
value: '', |
||||
|
action: upload, |
||||
|
oldData: [], |
||||
|
}; |
||||
|
}, |
||||
|
computed: { |
||||
|
...mapState('home', ['ptProps']), |
||||
|
// 上传附加请求头 |
||||
|
headers() { |
||||
|
const token = sessionStorage.getItem('anyringToken'); |
||||
|
return { Authorization: `Bearer ${token}` }; |
||||
|
}, |
||||
|
}, |
||||
|
created() { |
||||
|
this.getData(); |
||||
|
}, |
||||
|
methods: { |
||||
|
handleChange(info) { |
||||
|
const status = info.file.status; |
||||
|
if (status === 'done') { |
||||
|
const file = info.file; |
||||
|
const obj = { |
||||
|
uid: file.uid, |
||||
|
name: file.response.data[0].name, |
||||
|
status: status, |
||||
|
url: file.response.data[0].visitUrl, |
||||
|
}; |
||||
|
this.fileList.push(obj); |
||||
|
} |
||||
|
}, |
||||
|
// 提交 |
||||
|
async setData() { |
||||
|
try { |
||||
|
const { value, fileList } = this; |
||||
|
let pictures = []; |
||||
|
if (fileList.length) { |
||||
|
pictures = fileList.map(item => { |
||||
|
return item.url; |
||||
|
}); |
||||
|
} |
||||
|
const params = { |
||||
|
param: { |
||||
|
id: this.ptProps.id, |
||||
|
pictures, |
||||
|
records: value, |
||||
|
startTime: this.time, |
||||
|
}, |
||||
|
}; |
||||
|
const res = await otherUpload(params); |
||||
|
const { code } = res.data; |
||||
|
if (code === 200) { |
||||
|
this.$message.success('提交成功'); |
||||
|
} else { |
||||
|
this.$message.error('提交失败'); |
||||
|
} |
||||
|
} catch (error) { |
||||
|
console.error(error); |
||||
|
} |
||||
|
}, |
||||
|
// 获取已经提交过的数据 |
||||
|
async getData() { |
||||
|
try { |
||||
|
const params = { param: { id: this.ptProps.id } }; |
||||
|
const res = await otherQuery(params); |
||||
|
const { code, msg, data } = res.data; |
||||
|
if (code === 200) { |
||||
|
this.oldData = data; |
||||
|
} else { |
||||
|
} |
||||
|
} catch (error) {} |
||||
|
}, |
||||
|
// 获取上传过的图片的数组 |
||||
|
getFileList(item, index) { |
||||
|
const name = item.comment.split('/')[item.comment.split('/').length - 1]; |
||||
|
let obj = { |
||||
|
uid: index, |
||||
|
name: name.length > 20 ? name.substring(name.length - 20, name.length) : name, |
||||
|
status: 'done', |
||||
|
url: item.comment, |
||||
|
}; |
||||
|
return [obj]; |
||||
|
}, |
||||
|
}, |
||||
|
}; |
||||
|
</script> |
||||
|
|
||||
|
<style lang="stylus" scoped> |
||||
|
/deep/ .ant-list-item { |
||||
|
justify-content: left; |
||||
|
} |
||||
|
|
||||
|
/deep/ .ant-upload-list-item-card-actions.picture { |
||||
|
display: none; |
||||
|
} |
||||
|
</style> |
@ -0,0 +1,186 @@ |
|||||
|
<template> |
||||
|
<div class="num-box"> |
||||
|
<div class="num-key d-flex flex-column"> |
||||
|
<div class="num-title d-flex flex-row justify-space-between"> |
||||
|
<span class="gray-text" @click="$emit('closeNumModel')">取消</span> |
||||
|
<div> |
||||
|
{{ title }} |
||||
|
<span class="px-2 baseColor" style="border-bottom: 1px solid #333">{{ num === '0' ? numValue : num }}</span> |
||||
|
{{ unit }} |
||||
|
</div> |
||||
|
<div style="width: 24px"></div> |
||||
|
</div> |
||||
|
<div class="flex-1 fill-width key-box"> |
||||
|
<a-button |
||||
|
:class="item === '确定' ? 'num-btn-btn' : 'num-btn'" |
||||
|
:disabled="(disable && item === '.') || (future && item === '未评')" |
||||
|
v-for="item in btnList" |
||||
|
:key="item" |
||||
|
@click="entering(item)" |
||||
|
> |
||||
|
<img v-if="item === 'img'" style="width: 28px" src="./photo/del.png" /> |
||||
|
<span v-else>{{ item }}</span> |
||||
|
</a-button> |
||||
|
</div> |
||||
|
</div> |
||||
|
</div> |
||||
|
</template> |
||||
|
|
||||
|
<script> |
||||
|
export default { |
||||
|
props: { |
||||
|
title: { |
||||
|
type: String, |
||||
|
default: '', |
||||
|
}, |
||||
|
type: { |
||||
|
type: String, |
||||
|
default: '', |
||||
|
}, |
||||
|
unit: { |
||||
|
type: String, |
||||
|
default: '', |
||||
|
}, |
||||
|
numValue: { |
||||
|
type: String, |
||||
|
default: '0', |
||||
|
}, |
||||
|
}, |
||||
|
data() { |
||||
|
return { |
||||
|
num: '0', |
||||
|
btnList: ['1', '2', '3', 'img', '4', '5', '6', '确定', '7', '8', '9', '.', '0', '未评'], |
||||
|
disable: false, |
||||
|
future: false, |
||||
|
}; |
||||
|
}, |
||||
|
methods: { |
||||
|
submit() { |
||||
|
this.$emit('changeValue', this.num, this.type); |
||||
|
}, |
||||
|
|
||||
|
entering(e) { |
||||
|
console.log('e: ', e); |
||||
|
let num = this.num; |
||||
|
/** |
||||
|
* 判断是否为删除按钮 |
||||
|
* 1. 先判断字符串是否存在 |
||||
|
* 2. 如果字符串存在,再判断字符串当前是否为 未评 ,如果是 未评 ,则直接给num 赋值为 0 |
||||
|
* 3. 如果字符串不是 未评 ,且倒数第二位是否为 . ,如果是则一次删除两位,否则一次删除一位 |
||||
|
* 4. 如果删除了 . ,回复 . 按钮的点击状态 |
||||
|
* 5. 如果num不存在时,给num赋值为0 |
||||
|
*/ |
||||
|
if (e === 'img') { |
||||
|
if (num.length) { |
||||
|
console.log('num[num.length-1]', num[num.length - 1]); |
||||
|
if (num === '未评') { |
||||
|
num = 0; |
||||
|
this.future = false; |
||||
|
} else if (num[num.length - 1] === '.') { |
||||
|
num = num.slice(0, num.length - 1); |
||||
|
this.disable = false; |
||||
|
} else { |
||||
|
num = num.slice(0, num.length - 1); |
||||
|
} |
||||
|
if (!num) { |
||||
|
num = 0; |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
/** |
||||
|
* 判断是否为 . |
||||
|
* 如果是则拼到字符串中,并且修改 . 按钮的点击状态为不可用 |
||||
|
*/ |
||||
|
if (e === '.') { |
||||
|
if (num !== '未评') { |
||||
|
num += e; |
||||
|
this.disable = true; |
||||
|
} |
||||
|
} |
||||
|
/** |
||||
|
* 判断是否为 未评 |
||||
|
* 如果是则覆盖原来字符串,且删除时需要直接删掉 两个字,并且重新赋值为0 |
||||
|
* 当点击过一次 未评 后,不可再点,除非删除掉 未评 |
||||
|
*/ |
||||
|
if (e === '未评') { |
||||
|
num = e; |
||||
|
this.future = true; |
||||
|
this.disable = false; |
||||
|
} |
||||
|
|
||||
|
if (e === '确定') { |
||||
|
this.future = true; |
||||
|
this.disable = false; |
||||
|
this.submit(); |
||||
|
} |
||||
|
/** |
||||
|
* 数字输入框 |
||||
|
* 首先 e 为 img 确定 未评 时,不需要处理, |
||||
|
* 当 num = 0时,所点的数值直接覆盖num |
||||
|
* 当 num = 0时, . 不能覆盖,只能拼接 |
||||
|
* 当 num = 未评 时,直接覆盖num |
||||
|
*/ |
||||
|
// 必须是数值,且不能为NaN |
||||
|
if (typeof (e - 0) === 'number' && !isNaN(e - 0)) { |
||||
|
if ((num === 0 || num === '0' || num === '未评') && e !== '.') { |
||||
|
this.future = false; |
||||
|
num = e; |
||||
|
} else { |
||||
|
num += e; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
this.num = num; |
||||
|
}, |
||||
|
}, |
||||
|
}; |
||||
|
</script> |
||||
|
<style scoped> |
||||
|
.num-box { |
||||
|
height: 100vh; |
||||
|
width: 100vw; |
||||
|
background: rgba(0, 0, 0, 0.35); |
||||
|
position: fixed; |
||||
|
top: 0; |
||||
|
left: 0; |
||||
|
} |
||||
|
.num-key { |
||||
|
height: 300px; |
||||
|
width: 100%; |
||||
|
position: absolute; |
||||
|
bottom: 0; |
||||
|
background: #fff; |
||||
|
border-radius: 8px 8px 0 0; |
||||
|
} |
||||
|
.num-title { |
||||
|
height: 56px; |
||||
|
width: 100%; |
||||
|
padding: 16px; |
||||
|
border-bottom: 1px solid #ccc; |
||||
|
} |
||||
|
.key-box { |
||||
|
background: #f7f7f7; |
||||
|
display: grid; |
||||
|
grid-template-rows: 1fr 1fr 1fr 1fr; |
||||
|
grid-template-columns: 1fr 1fr 1fr 1fr; |
||||
|
grid-column-start: 4; |
||||
|
grid-gap: 8px 8px; |
||||
|
padding: 8px; |
||||
|
} |
||||
|
.num-btn { |
||||
|
background: #fff; |
||||
|
grid-row: span 1 / span 1; |
||||
|
height: 100%; |
||||
|
display: flex; |
||||
|
align-items: center; |
||||
|
justify-content: center; |
||||
|
font-size: 20px; |
||||
|
} |
||||
|
.num-btn-btn { |
||||
|
background: #4b8aff; |
||||
|
color: #fff; |
||||
|
grid-row: span 3 / span 3; |
||||
|
height: 100%; |
||||
|
font-size: 20px; |
||||
|
} |
||||
|
</style> |
After Width: | Height: | Size: 483 B |
@ -0,0 +1,80 @@ |
|||||
|
<template> |
||||
|
<div> |
||||
|
<div class="w-screen h-screen box"></div> |
||||
|
<div class="d-flex flex-column fill-width white absolute"> |
||||
|
<div class="d-flex flex-row justify-space-between pa-3"> |
||||
|
<span class="gray-text" @click="$emit('closeModel')">取消</span> |
||||
|
<span class="font-bold">洼田饮水试验</span> |
||||
|
<span class="baseColor" @click="submit">确定</span> |
||||
|
</div> |
||||
|
<a-divider class="my-0" /> |
||||
|
<div class="d-flex flex-column"> |
||||
|
<div |
||||
|
class="py-2 fill-width text-center" |
||||
|
:class="current === index ? 'blue text-white' : ''" |
||||
|
v-for="(list, index) in lists" |
||||
|
:key="index" |
||||
|
@click="changeItem(index)" |
||||
|
> |
||||
|
{{ list }} |
||||
|
</div> |
||||
|
</div> |
||||
|
</div> |
||||
|
</div> |
||||
|
</template> |
||||
|
|
||||
|
<script> |
||||
|
export default { |
||||
|
props: { |
||||
|
lists: { |
||||
|
type: Array, |
||||
|
default: () => [], |
||||
|
}, |
||||
|
currentValue: { |
||||
|
type: String, |
||||
|
default: '', |
||||
|
}, |
||||
|
}, |
||||
|
|
||||
|
data() { |
||||
|
return { current: 5 }; |
||||
|
}, |
||||
|
|
||||
|
mounted() { |
||||
|
const i = this.lists.findIndex(item => item === this.currentValue); |
||||
|
if (i) { |
||||
|
this.current = i; |
||||
|
} |
||||
|
}, |
||||
|
|
||||
|
methods: { |
||||
|
changeItem(index) { |
||||
|
this.current = index; |
||||
|
}, |
||||
|
|
||||
|
submit() { |
||||
|
this.$emit('closeModel', this.current); |
||||
|
}, |
||||
|
}, |
||||
|
}; |
||||
|
</script> |
||||
|
|
||||
|
<style scoped> |
||||
|
.box { |
||||
|
/* display: none; */ |
||||
|
position: fixed; |
||||
|
top: 0; |
||||
|
left: 0; |
||||
|
background: #000; |
||||
|
opacity: 50%; |
||||
|
} |
||||
|
|
||||
|
.absolute { |
||||
|
position: fixed; |
||||
|
bottom: 0; |
||||
|
z-index: 99; |
||||
|
background: #fff; |
||||
|
opacity: 100%; |
||||
|
border-radius: 5px 5px 0 0; |
||||
|
} |
||||
|
</style> |
@ -0,0 +1,302 @@ |
|||||
|
<template> |
||||
|
<div class="select-box"> |
||||
|
<div class="select-key d-flex flex-column" :style="{ height: showIpt ? '344px' : '300px' }"> |
||||
|
<div class="title-box d-flex justify-space-between"> |
||||
|
<div class="gray-text" @click="$emit('closeTimeSelect')">取消</div> |
||||
|
<div>{{ title }}</div> |
||||
|
<div class="baseColor" @click="chooseTime">确定</div> |
||||
|
</div> |
||||
|
<div v-if="showIpt" class="ipt-box d-flex justify-center align-center"> |
||||
|
<div class="ipt-bg"> |
||||
|
<input class="ml-2 ipt" placeholder="请输入姓名" v-model="value" /> |
||||
|
</div> |
||||
|
</div> |
||||
|
<div class="d-flex flex-1 items-center overflow-hidden"> |
||||
|
<template v-for="(item, itemIndex) in list"> |
||||
|
<div class="time-box d-flex flex-row" :key="itemIndex"> |
||||
|
<div class="time-div"> |
||||
|
<div class="time-time"> |
||||
|
<div class="time-content" v-for="(time, index) in item.time" :key="index"> |
||||
|
{{ time }} |
||||
|
</div> |
||||
|
</div> |
||||
|
</div> |
||||
|
</div> |
||||
|
<div class="d-flex align-center" :key="item.unit">{{ item.unit }}</div> |
||||
|
</template> |
||||
|
</div> |
||||
|
</div> |
||||
|
</div> |
||||
|
</template> |
||||
|
<script> |
||||
|
export default { |
||||
|
name: 'TimeSelect', |
||||
|
props: { |
||||
|
title: { |
||||
|
// 时间选择器的title |
||||
|
type: String, |
||||
|
default: '时间', |
||||
|
}, |
||||
|
showIpt: { |
||||
|
// 是否显示输入框 |
||||
|
type: Boolean, |
||||
|
default: false, |
||||
|
}, |
||||
|
iptTitle: { |
||||
|
// 输入框的标题提示 |
||||
|
type: String, |
||||
|
default: '姓名', |
||||
|
}, |
||||
|
iptValue: { |
||||
|
// 输入框默认的值 |
||||
|
type: String, |
||||
|
default: '', |
||||
|
}, |
||||
|
timeValue: { |
||||
|
// 已选择的时间 时间戳 数值 |
||||
|
// 默认当前时间 |
||||
|
type: Number, |
||||
|
default: new Date().valueOf(), |
||||
|
}, |
||||
|
firstIndex: { |
||||
|
// 数组的第一层索引 |
||||
|
type: Number, |
||||
|
default: 0, |
||||
|
}, |
||||
|
secondIndex: { |
||||
|
// 数组的第二层索引 |
||||
|
type: Number, |
||||
|
default: 0, |
||||
|
}, |
||||
|
}, |
||||
|
data() { |
||||
|
return { |
||||
|
list: [ |
||||
|
{ |
||||
|
time: [], |
||||
|
scrollTop: 0, |
||||
|
unit: '年', |
||||
|
}, |
||||
|
{ |
||||
|
time: [], |
||||
|
scrollTop: 0, |
||||
|
unit: '月', |
||||
|
}, |
||||
|
{ |
||||
|
time: [], |
||||
|
scrollTop: 0, |
||||
|
unit: '日', |
||||
|
}, |
||||
|
{ |
||||
|
time: [], |
||||
|
scrollTop: 0, |
||||
|
unit: '时', |
||||
|
}, |
||||
|
{ |
||||
|
time: [], |
||||
|
scrollTop: 0, |
||||
|
unit: '分', |
||||
|
}, |
||||
|
], |
||||
|
selectTime: '', |
||||
|
value: '', |
||||
|
}; |
||||
|
}, |
||||
|
mounted() { |
||||
|
this.setTimeData(); |
||||
|
setTimeout(() => { |
||||
|
this.setScroll(); |
||||
|
}, 10); |
||||
|
}, |
||||
|
created() { |
||||
|
this.value = this.iptValue; |
||||
|
}, |
||||
|
methods: { |
||||
|
/** |
||||
|
* 获取当前 年 月 日 时 分 |
||||
|
* 然后获取需要滚动的距离 |
||||
|
* 然后将所有值存储到 this.list 中 |
||||
|
*/ |
||||
|
setTimeData() { |
||||
|
// list: [ 年,月,日,时,分 ] |
||||
|
var nowMonth = new Date(this.timeValue).getMonth(); |
||||
|
var nowDay = new Date(this.timeValue).getDate() - 1; |
||||
|
var nowHour = new Date(this.timeValue).getHours(); |
||||
|
var nowMin = new Date(this.timeValue).getMinutes(); |
||||
|
|
||||
|
/* 生成年数组 */ |
||||
|
var my = new Date(); |
||||
|
var endYear = my.getFullYear(); // 获取当前年份 |
||||
|
for (var i = endYear; i > 2018; i--) { |
||||
|
this.list[0].time.push(i); |
||||
|
} |
||||
|
/* 生成月数组 */ |
||||
|
for (var i = 1; i < 13; i++) { |
||||
|
this.list[1].time.push(i); |
||||
|
if (nowMonth === i) { |
||||
|
this.list[1].scrollTop = i * 26; |
||||
|
} |
||||
|
} |
||||
|
/* 生成日数组 */ |
||||
|
for (var i = 1; i < 32; i++) { |
||||
|
this.list[2].time.push(i); |
||||
|
if (nowDay === i) { |
||||
|
this.list[2].scrollTop = i * 26; |
||||
|
} |
||||
|
} |
||||
|
/* 生成小时数组 */ |
||||
|
for (let i = 0; i < 24; i++) { |
||||
|
this.list[3].time.push(i); |
||||
|
if (nowHour === i) { |
||||
|
this.list[3].scrollTop = i * 26; |
||||
|
} |
||||
|
} |
||||
|
/* 生成分钟数组 */ |
||||
|
for (let i = 0; i < 60; i++) { |
||||
|
this.list[4].time.push(i); |
||||
|
if (nowMin === i) { |
||||
|
this.list[4].scrollTop = i * 26; |
||||
|
} |
||||
|
} |
||||
|
}, |
||||
|
/** |
||||
|
* list渲染到界面上之后 |
||||
|
* 将 list 每一项中的 scrollTop 赋值给对应的div的 scrollTop |
||||
|
*/ |
||||
|
setScroll() { |
||||
|
// list: [ 年,月,日,时,分 ] |
||||
|
let dom = document.querySelectorAll('.time-time'); |
||||
|
dom[1].scrollTop = this.list[1].scrollTop; |
||||
|
dom[2].scrollTop = this.list[2].scrollTop; |
||||
|
dom[3].scrollTop = this.list[3].scrollTop; |
||||
|
dom[4].scrollTop = this.list[4].scrollTop; |
||||
|
console.log(dom[1].scrollTop); |
||||
|
}, |
||||
|
/** |
||||
|
* 点击确定是,获取到每个时间字段的滚动距离 |
||||
|
* 然后判断当前滚动位置,最中间的 字段值 (四舍五入) |
||||
|
* 然后判断是否小于10 以及 判断月份的最大天数 |
||||
|
* 最后返回 一个 date 类型的数据 |
||||
|
* 使用moment 转换成时间戳 |
||||
|
*/ |
||||
|
async chooseTime() { |
||||
|
// list: [ 年,月,日,时,分 ] |
||||
|
let dom = document.querySelectorAll('.time-time'); |
||||
|
var year = 2021 - Math.round(dom[0].scrollTop / 26); |
||||
|
let month = Math.round(dom[1].scrollTop / 26) + 1; |
||||
|
let day = Math.round(dom[2].scrollTop / 26) + 1; |
||||
|
let hour = Math.round(dom[3].scrollTop / 26); |
||||
|
let min = Math.round(dom[4].scrollTop / 26); |
||||
|
if (month === 2) { |
||||
|
if ((year % 4 === 0 && year % 100 !== 0) || (year % 400 === 0 && year % 4000 !== 0)) { |
||||
|
if (day > 29) { |
||||
|
day = 29; |
||||
|
} |
||||
|
} else { |
||||
|
if (day > 28) { |
||||
|
day = 28; |
||||
|
} |
||||
|
} |
||||
|
} else { |
||||
|
if (month === 2 || month === 4 || month === 6 || month === 9 || month === 11) { |
||||
|
if (day > 30) { |
||||
|
day = 30; |
||||
|
} |
||||
|
} else { |
||||
|
if (day > 31) { |
||||
|
day = 31; |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
if (month < 10) { |
||||
|
month = '0' + month; |
||||
|
} |
||||
|
if (day < 10) { |
||||
|
day = '0' + day; |
||||
|
} |
||||
|
if (hour < 10) { |
||||
|
hour = '0' + hour; |
||||
|
} |
||||
|
if (min < 10) { |
||||
|
min = '0' + min; |
||||
|
} |
||||
|
this.selectTime = `${year}-${month}-${day} ${hour}:${min}:00`; |
||||
|
this.$emit('chooseTime', this.$moment(this.selectTime).valueOf(), this.firstIndex, this.secondIndex, this.value); |
||||
|
}, |
||||
|
}, |
||||
|
}; |
||||
|
</script> |
||||
|
<style scoped> |
||||
|
.ipt { |
||||
|
width: 64%; |
||||
|
margin: 10px 18%; |
||||
|
padding: 6px 0 6px 10px; |
||||
|
border: 1px solid #333; |
||||
|
font-size: 14px; |
||||
|
} |
||||
|
.ipt-box { |
||||
|
padding: 0.5rem; |
||||
|
height: 44px; |
||||
|
position: relative; |
||||
|
} |
||||
|
.ipt-bg { |
||||
|
width: 100%; |
||||
|
background: #fff; |
||||
|
position: absolute; |
||||
|
top: 0; |
||||
|
z-index: 99; |
||||
|
} |
||||
|
.title-box { |
||||
|
padding: 0.5rem; |
||||
|
border-bottom: 2px solid rgba(229, 231, 235, 1); |
||||
|
height: 44px; |
||||
|
} |
||||
|
.time-box { |
||||
|
height: 100%; |
||||
|
width: 16.66%; |
||||
|
text-align: center; |
||||
|
overflow-x: hidden; |
||||
|
position: relative; |
||||
|
} |
||||
|
.select-box { |
||||
|
height: 100vh; |
||||
|
width: 100vw; |
||||
|
background: rgba(0, 0, 0, 0.35); |
||||
|
position: fixed; |
||||
|
top: 0; |
||||
|
left: 0; |
||||
|
z-index: 10; |
||||
|
} |
||||
|
.select-key { |
||||
|
height: 300px; |
||||
|
width: 100%; |
||||
|
position: absolute; |
||||
|
bottom: 0; |
||||
|
background: #fff; |
||||
|
border-radius: 8px 8px 0 0; |
||||
|
} |
||||
|
.overflow-hidden { |
||||
|
overflow: hidden; |
||||
|
padding: 0 16px; |
||||
|
} |
||||
|
.time-div { |
||||
|
height: 100%; |
||||
|
width: 100%; |
||||
|
margin: 0 auto; |
||||
|
position: absolute; |
||||
|
right: -8px; |
||||
|
} |
||||
|
.time-time { |
||||
|
height: 100%; |
||||
|
width: 100%; |
||||
|
margin: 0 auto; |
||||
|
overflow-y: scroll; |
||||
|
padding: 116px 16px 116px 0; |
||||
|
} |
||||
|
.time-content { |
||||
|
height: 26px; |
||||
|
line-height: 26px; |
||||
|
font-size: 16px; |
||||
|
width: 100%; |
||||
|
} |
||||
|
</style> |
@ -0,0 +1,124 @@ |
|||||
|
<template> |
||||
|
<div class="d-flex flex-column"> |
||||
|
<div class="title d-flex flex-row"> |
||||
|
<div class="iconleft"> |
||||
|
<img @click="backPage" src="../../../public/img/icons/Chevron left-Outlined_好压看图.png" /> |
||||
|
</div> |
||||
|
<div class="titles">{{ title }}</div> |
||||
|
<div v-if="list && list.length" class="iconright"> |
||||
|
<div v-for="(item, index) in list" :key="index"> |
||||
|
<a-icon v-if="item.type === 1" :type="item.icon" @click="openPage(item.path)" /> |
||||
|
<img v-if="item.type === 2" :src="item.icon" @click="openPage(item.path)" /> |
||||
|
<span v-if="item.type === 3" @click="changeYan" class="font-14" :class="valueType === 1 ? 'baseColor' : 'gray-text'"> |
||||
|
{{ |
||||
|
item.icon |
||||
|
}} |
||||
|
</span> |
||||
|
<a-icon v-if="item.type === 4" :type="item.icon" @click="show = true" /> |
||||
|
</div> |
||||
|
</div> |
||||
|
</div> |
||||
|
<div class="divide"></div> |
||||
|
<time-select @chooseTime="chooseTime" v-if="show" title="开始静脉溶栓" :show="show" @closeTimeSelect="show = false" :show-ipt="true" /> |
||||
|
</div> |
||||
|
</template> |
||||
|
<script> |
||||
|
import { mapState, mapMutations } from 'vuex'; |
||||
|
import TimeSelect from 'components/TimeSelect/TimeSelect.vue'; |
||||
|
import { addArriveWorker } from 'config/api'; |
||||
|
|
||||
|
export default { |
||||
|
components: { TimeSelect }, |
||||
|
data() { |
||||
|
return { show: false }; |
||||
|
}, |
||||
|
computed: mapState('home', ['title', 'list', 'valueType', 'ptProps', 'addNum']), |
||||
|
methods: { |
||||
|
...mapMutations('home', ['setValueType', 'setAddNum']), |
||||
|
openPage(path) { |
||||
|
this.$router.push(path); |
||||
|
}, |
||||
|
backPage() { |
||||
|
window.history.go(-1); |
||||
|
}, |
||||
|
changeYan() { |
||||
|
if (this.valueType === 1) { |
||||
|
this.setValueType(0); |
||||
|
} else { |
||||
|
this.setValueType(1); |
||||
|
} |
||||
|
}, |
||||
|
// 时间选择 |
||||
|
chooseTime(time, firstIndex, secondIndex, name) { |
||||
|
console.log(time, firstIndex, secondIndex, name); |
||||
|
const info = { |
||||
|
name, |
||||
|
time, |
||||
|
}; |
||||
|
this.addDoc(info); |
||||
|
this.show = false; |
||||
|
}, |
||||
|
async addDoc(info) { |
||||
|
try { |
||||
|
const { projectId } = this.ptProps; |
||||
|
let num = this.addNum; |
||||
|
const params = { |
||||
|
param: { |
||||
|
projectId, |
||||
|
workerInfoList: [info], |
||||
|
}, |
||||
|
}; |
||||
|
const res = await addArriveWorker(params); |
||||
|
const { code, data, msg } = res.data; |
||||
|
if (code === 200) { |
||||
|
this.$message.success('添加成功'); |
||||
|
this.setAddNum(num + 1); |
||||
|
} |
||||
|
} catch (error) {} |
||||
|
}, |
||||
|
}, |
||||
|
}; |
||||
|
</script> |
||||
|
<style lang="stylus" scoped> |
||||
|
.title { |
||||
|
height: 48px; |
||||
|
padding: auto 10px; |
||||
|
background: #F5F5F5; |
||||
|
position: fixed; |
||||
|
top: 0; |
||||
|
width: 100%; |
||||
|
line-height: 48px; |
||||
|
z-index: 99; |
||||
|
} |
||||
|
|
||||
|
.titles { |
||||
|
display: flex; |
||||
|
justify-content: center; |
||||
|
flex: 1; |
||||
|
} |
||||
|
|
||||
|
.iconleft { |
||||
|
position: absolute; |
||||
|
left: 10px; |
||||
|
height: 100%; |
||||
|
} |
||||
|
|
||||
|
.iconleft img { |
||||
|
height: 25px; |
||||
|
width: 25px; |
||||
|
} |
||||
|
|
||||
|
.divide { |
||||
|
width: 100%; |
||||
|
height: 1px; |
||||
|
background: #ddd; |
||||
|
} |
||||
|
|
||||
|
.iconright { |
||||
|
position: absolute; |
||||
|
right: 10px; |
||||
|
font-size: 18px; |
||||
|
height: 100%; |
||||
|
text-align: center; |
||||
|
} |
||||
|
</style> |
@ -0,0 +1,20 @@ |
|||||
|
/* |
||||
|
* @Author: aBin |
||||
|
* @email: binbin0314@126.com |
||||
|
* @Date: 2021-05-31 17:25:39 |
||||
|
* @LastEditors: aBin |
||||
|
* @LastEditTime: 2021-06-02 15:27:56 |
||||
|
*/ |
||||
|
/* |
||||
|
* Copyright (c) 2020. |
||||
|
* author: wally |
||||
|
* email: 18603454788@163.com |
||||
|
*/ |
||||
|
import axios from 'axios'; |
||||
|
let { proxyUrl } = require('@/config/setting'); |
||||
|
|
||||
|
const tall = `${proxyUrl}/gateway/tall/v1.0`; |
||||
|
const users = `${tall}/users`; |
||||
|
|
||||
|
// 查找用户详细信息
|
||||
|
export const getUserId = params => axios.get(`${users}/userId`, params); |
@ -0,0 +1,110 @@ |
|||||
|
import axios from 'axios'; |
||||
|
let { proxyUrl } = require('@/config/setting'); |
||||
|
console.log('proxyUrl: ', proxyUrl); |
||||
|
|
||||
|
const wisdomcar = `${proxyUrl}/gateway/wisdomcar`; |
||||
|
const qcp = `${proxyUrl}/gateway/qcp/v3.0`; |
||||
|
const filedeal = `${proxyUrl}/filedeal`; |
||||
|
const car = `${qcp}/car`; // 平车相关接口
|
||||
|
// const project = `${wisdomcar}/project`; // 页面相关接口
|
||||
|
const otherRecords = `${wisdomcar}/otherRecords`; // 通用界面
|
||||
|
const patientAndFamily = `${wisdomcar}/patientAndFamily`; // 患者相关接口
|
||||
|
const step = `${wisdomcar}/step`; // 首页节点相关接口
|
||||
|
const worker = `${qcp}/worker`; // 人员相关接口
|
||||
|
const statistics = `${qcp}/statistical`; // 统计相关接口
|
||||
|
const project = `${qcp}/project`; // 项目相关接口
|
||||
|
const patient = `${qcp}/patient`; // 患者相关接口
|
||||
|
|
||||
|
// 上传文件
|
||||
|
export const upload = `${filedeal}/file/upload/multiple`; |
||||
|
|
||||
|
// 查询到场人员
|
||||
|
export const queryArriveWorker = params => axios.post(`${worker}/queryArriveWorker`, params); |
||||
|
|
||||
|
// 添加到场人员
|
||||
|
export const addArriveWorker = params => axios.post(`${worker}/addArriveWorker`, params); |
||||
|
|
||||
|
// 查询所有平车
|
||||
|
export const queryAllCar = params => axios.post(`${car}/query`, params); |
||||
|
|
||||
|
// 查询空闲平车
|
||||
|
export const carFree = params => axios.post(`${car}/free`, params); |
||||
|
|
||||
|
// 绑定平车
|
||||
|
export const bindingCar = params => axios.post(`${car}/bind`, params); |
||||
|
|
||||
|
// 查询绑定的平车
|
||||
|
export const queryBindingCar = params => axios.post(`${car}/queryBind`, params); |
||||
|
|
||||
|
// 创建病例
|
||||
|
// export const createCase = params => axios.post(`${car}/createCase`, params);
|
||||
|
|
||||
|
// 查询体重和团注剂量
|
||||
|
export const getWeight = params => axios.post(`${project}/weight`, params); |
||||
|
|
||||
|
// 点击开始
|
||||
|
export const setProStart = params => axios.post(`${project}/start`, params); |
||||
|
|
||||
|
// 选择历史患者切换项目
|
||||
|
export const switchProject = params => axios.post(`${project}/switchProject`, params); |
||||
|
|
||||
|
// 上传身份证图像识别
|
||||
|
export const identifyWords = `${project}/identifyWords`; |
||||
|
|
||||
|
// 获取开始时间
|
||||
|
export const getStartTime = params => axios.post(`${project}/getStartTime`, params); |
||||
|
|
||||
|
// 结束绑定平车
|
||||
|
export const endCar = params => axios.post(`${project}/end`, params); |
||||
|
|
||||
|
// 上传通用内容的图片和记录
|
||||
|
export const otherUpload = params => axios.post(`${otherRecords}/upload`, params); |
||||
|
|
||||
|
// 查询通用内容的图片和记录
|
||||
|
export const otherQuery = params => axios.post(`${otherRecords}/queryList`, params); |
||||
|
|
||||
|
// 查询医生的历史患者
|
||||
|
export const findOldPatient = params => axios.post(`${patientAndFamily}/findOldPatient`, params); |
||||
|
|
||||
|
// 查询患者信息(用于回显)
|
||||
|
export const queryPatientInfo = params => axios.post(`${patientAndFamily}/queryPatientInfo`, params); |
||||
|
|
||||
|
// 修改患者信息
|
||||
|
export const updatePatientInfo = params => axios.post(`${patientAndFamily}/updatePatientInfo`, params); |
||||
|
|
||||
|
// 查询首页节点进度
|
||||
|
export const findStepIsOver = params => axios.post(`${statistics}/step`, params); |
||||
|
|
||||
|
// 查询急救时长分析
|
||||
|
export const getPointTime = params => axios.post(`${statistics}/getPointTime`, params); |
||||
|
|
||||
|
// 质控表格
|
||||
|
export const getControl = params => axios.post(`${proxyUrl}/controlTable`, params); |
||||
|
|
||||
|
// 时间轴列表
|
||||
|
export const getTimeLine = params => axios.post(`${proxyUrl}/timeLine`, params); |
||||
|
|
||||
|
// 统计每天质控报告echarts数据图
|
||||
|
export const everyday = params => axios.post(`${statistics}/queryQuality/everyday`, params); |
||||
|
|
||||
|
// 查询质控报告(月和周)
|
||||
|
export const queryQuality = params => axios.post(`${statistics}/queryQuality`, params); |
||||
|
|
||||
|
// 查询医院成员和急救期间是否值班
|
||||
|
export const queryAllDoctor = params => axios.post(`${worker}/queryAllDoctor`, params); |
||||
|
// 正式接口
|
||||
|
|
||||
|
// 患者列表
|
||||
|
export const getPatientList = params => axios.post(`${patient}/query`, params); |
||||
|
|
||||
|
// 批量提交急救信息
|
||||
|
export const aidRecord = params => axios.post(`${patient}/aidRecord`, params); |
||||
|
|
||||
|
// 批量查询急救信息
|
||||
|
export const queryAidRecord = params => axios.post(`${patient}/queryAidRecord`, params); |
||||
|
|
||||
|
// 根据项目id查询患者信息
|
||||
|
export const queryByProject = params => axios.post(`${patient}/queryByProject`, params); |
||||
|
|
||||
|
// 创建病例
|
||||
|
export const createCase = params => axios.post(`${project}/createCase`, params); |
@ -0,0 +1,30 @@ |
|||||
|
const title = process.env.VUE_APP_TITLE; |
||||
|
const description = process.env.VUE_APP_DESCRIPTION; |
||||
|
const baseUrl = process.env.VUE_APP_BASE_URL; |
||||
|
const apiUrl = process.env.VUE_APP_API_URL; |
||||
|
const proxyUrl = process.env.VUE_APP_PROXY_URL; |
||||
|
const publicPath = process.env.VUE_APP_PUBLIC_PATH; |
||||
|
// const msgUrl = process.env.VUE_APP_MSG_URL;
|
||||
|
|
||||
|
module.exports = { |
||||
|
// 首页标题
|
||||
|
title, |
||||
|
|
||||
|
// 首页描述信息
|
||||
|
description, |
||||
|
|
||||
|
// 基础地址
|
||||
|
baseUrl, |
||||
|
|
||||
|
// api基础地址
|
||||
|
apiUrl, |
||||
|
|
||||
|
// 消息系统地址
|
||||
|
// msgUrl,
|
||||
|
|
||||
|
// api代理地址
|
||||
|
proxyUrl, |
||||
|
|
||||
|
// 生成文件目录 publicPath
|
||||
|
publicPath, |
||||
|
}; |
@ -0,0 +1,19 @@ |
|||||
|
/* |
||||
|
* Copyright (c) 2019. |
||||
|
* author: wally |
||||
|
* email: 18603454788@163.com |
||||
|
*/ |
||||
|
|
||||
|
// 用户登录client
|
||||
|
export const SIGN_IN_CLIENTS = { mp: 0, h5: 1, android: 2, ios: 3 }; |
||||
|
|
||||
|
// 用户登录类型
|
||||
|
export const SIGN_IN_TYPES = { |
||||
|
mp: 0, |
||||
|
phone: 1, |
||||
|
email: 2, |
||||
|
username: 3, |
||||
|
wx: 4, |
||||
|
wx_web: 5, |
||||
|
wb: 6, |
||||
|
}; |
@ -0,0 +1,33 @@ |
|||||
|
/* |
||||
|
* @Author: wally |
||||
|
* @email: 18603454788@163.com |
||||
|
* @Date: 2021-01-29 11:16:27 |
||||
|
* @LastEditors: Please set LastEditors |
||||
|
* @LastEditTime: 2021-07-29 09:51:17 |
||||
|
*/ |
||||
|
// @ts-ignore
|
||||
|
import Vue from 'vue'; |
||||
|
import './plugins/axios'; |
||||
|
import App from './App.vue'; |
||||
|
import './registerServiceWorker'; |
||||
|
import router from './router'; |
||||
|
import store from './store'; |
||||
|
import './plugins/ant-design-vue.js'; |
||||
|
import 'common/portrait.styl'; |
||||
|
import echarts from 'echarts'; |
||||
|
import 'echarts-gl'; |
||||
|
// import 'echarts/map/js/province/shanxi.js'; //对应的省份
|
||||
|
import './plugins/vue-quill-editor.js'; |
||||
|
// import VueDOMPurifyHTML from 'vue-dompurify-html';
|
||||
|
|
||||
|
// Vue.use(VueDOMPurifyHTML);
|
||||
|
Vue.prototype.$echarts = echarts; |
||||
|
import moment from 'moment'; //导入文件
|
||||
|
Vue.prototype.$moment = moment; //赋值使用
|
||||
|
Vue.config.productionTip = false; |
||||
|
|
||||
|
window.vm = new Vue({ |
||||
|
router, |
||||
|
store, |
||||
|
render: h => h(App), |
||||
|
}).$mount('#app'); |
@ -0,0 +1,95 @@ |
|||||
|
/* |
||||
|
* @Author: wally |
||||
|
* @email: 18603454788@163.com |
||||
|
* @Date: 2021-01-29 11:16:27 |
||||
|
* @LastEditors: aBin |
||||
|
* @LastEditTime: 2021-06-02 10:10:30 |
||||
|
*/ |
||||
|
import Vue from 'vue'; |
||||
|
import { |
||||
|
Pagination, |
||||
|
Button, |
||||
|
Input, |
||||
|
InputNumber, |
||||
|
message, |
||||
|
notification, |
||||
|
Modal, |
||||
|
Tag, |
||||
|
Table, |
||||
|
Tabs, |
||||
|
Icon, |
||||
|
Empty, |
||||
|
Form, |
||||
|
Select, |
||||
|
Upload, |
||||
|
Badge, |
||||
|
Popconfirm, |
||||
|
DatePicker, |
||||
|
Switch, |
||||
|
Radio, |
||||
|
Dropdown, |
||||
|
Menu, |
||||
|
Row, |
||||
|
Col, |
||||
|
Timeline, |
||||
|
Checkbox, |
||||
|
BackTop, |
||||
|
Progress, |
||||
|
Carousel, |
||||
|
Spin, |
||||
|
Card, |
||||
|
List, |
||||
|
Collapse, |
||||
|
Cascader, |
||||
|
TimePicker, |
||||
|
Divider, |
||||
|
} from 'ant-design-vue'; |
||||
|
import { ConfigProvider } from 'ant-design-vue'; |
||||
|
Vue.component(ConfigProvider.name, ConfigProvider); |
||||
|
Vue.use(Pagination); |
||||
|
Vue.use(Button); |
||||
|
Vue.use(Input); |
||||
|
Vue.use(Modal); |
||||
|
Vue.use(Tag); |
||||
|
Vue.use(Table); |
||||
|
Vue.use(Tabs); |
||||
|
Vue.use(Icon); |
||||
|
Vue.use(Empty); |
||||
|
Vue.use(Form); |
||||
|
Vue.use(Select); |
||||
|
Vue.use(Upload); |
||||
|
Vue.use(Badge); |
||||
|
Vue.use(Popconfirm); |
||||
|
Vue.use(DatePicker); |
||||
|
Vue.use(Switch); |
||||
|
Vue.use(Radio); |
||||
|
Vue.use(Dropdown); |
||||
|
Vue.use(Menu); |
||||
|
Vue.use(Row); |
||||
|
Vue.use(Col); |
||||
|
Vue.use(Timeline); |
||||
|
Vue.use(Checkbox); |
||||
|
Vue.use(BackTop); |
||||
|
Vue.use(Progress); |
||||
|
Vue.use(Carousel); |
||||
|
Vue.use(Spin); |
||||
|
Vue.use(Card); |
||||
|
Vue.use(List); |
||||
|
Vue.use(Collapse); |
||||
|
Vue.use(Cascader); |
||||
|
Vue.use(InputNumber); |
||||
|
Vue.use(TimePicker); |
||||
|
Vue.use(Divider); |
||||
|
|
||||
|
Vue.prototype.$message = message; |
||||
|
Vue.prototype.$notification = notification; |
||||
|
Vue.prototype.$info = Modal.info; |
||||
|
Vue.prototype.$success = Modal.success; |
||||
|
Vue.prototype.$error = Modal.error; |
||||
|
Vue.prototype.$warning = Modal.warning; |
||||
|
Vue.prototype.$confirm = Modal.confirm; |
||||
|
|
||||
|
message.config({ |
||||
|
duration: 3, |
||||
|
maxCount: 3, |
||||
|
}); |
@ -0,0 +1,84 @@ |
|||||
|
/* |
||||
|
* @Author: wally |
||||
|
* @email: 18603454788@163.com |
||||
|
* @Date: 2021-04-19 10:23:19 |
||||
|
* @LastEditors: wally |
||||
|
* @LastEditTime: 2021-05-06 11:42:20 |
||||
|
*/ |
||||
|
'use strict'; |
||||
|
|
||||
|
import Vue from 'vue'; |
||||
|
import axios from 'axios'; |
||||
|
import router from '../router/index'; |
||||
|
import store from '../store/index'; |
||||
|
|
||||
|
// Full config: https://github.com/axios/axios#request-config
|
||||
|
// axios.defaults.baseURL = process.env.baseURL || process.env.apiUrl || '';
|
||||
|
// axios.defaults.headers.common['Authorization'] = AUTH_TOKEN;
|
||||
|
// axios.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded';
|
||||
|
let config = { |
||||
|
// baseURL: process.env.baseURL || process.env.apiUrl || ""
|
||||
|
timeout: 60 * 1000, // Timeout
|
||||
|
// withCredentials: true, // Check cross-site Access-Control
|
||||
|
}; |
||||
|
|
||||
|
const _axios = axios.create(config); |
||||
|
axios.interceptors.request.use( |
||||
|
function(config) { |
||||
|
let token = store.state.anyringToken || sessionStorage.getItem('anyringToken'); |
||||
|
|
||||
|
if (token) { |
||||
|
config.headers.Authorization = `Bearer ${token}`; |
||||
|
} |
||||
|
return config; |
||||
|
}, |
||||
|
function(error) { |
||||
|
// Do something with request error
|
||||
|
return Promise.reject(error); |
||||
|
}, |
||||
|
); |
||||
|
|
||||
|
// Add a response interceptor
|
||||
|
axios.interceptors.response.use( |
||||
|
function(response) { |
||||
|
if (response.data && response.data.code >= 400 && response.data.code < 500) { |
||||
|
store.commit('user/sign', ''); |
||||
|
router.replace({ |
||||
|
path: '/user/login', |
||||
|
query: { redirect: router.currentRoute.fullPath }, |
||||
|
}); |
||||
|
} |
||||
|
// Do something with response data
|
||||
|
return response; |
||||
|
}, |
||||
|
function(error) { |
||||
|
// Do something with response error
|
||||
|
return Promise.reject(error); |
||||
|
}, |
||||
|
); |
||||
|
|
||||
|
Plugin.install = function(Vue) { |
||||
|
Vue.axios = _axios; |
||||
|
window.axios = _axios; |
||||
|
Object.defineProperties(Vue.prototype, { |
||||
|
axios: { |
||||
|
get() { |
||||
|
return _axios; |
||||
|
}, |
||||
|
}, |
||||
|
$axios: { |
||||
|
get() { |
||||
|
return _axios; |
||||
|
}, |
||||
|
}, |
||||
|
$http: { |
||||
|
get() { |
||||
|
return _axios; |
||||
|
}, |
||||
|
}, |
||||
|
}); |
||||
|
}; |
||||
|
|
||||
|
Vue.use(Plugin); |
||||
|
|
||||
|
export default Plugin; |
@ -0,0 +1,3 @@ |
|||||
|
import 'quill/dist/quill.core.css'; |
||||
|
import 'quill/dist/quill.snow.css'; |
||||
|
import 'quill/dist/quill.bubble.css'; |
@ -0,0 +1,34 @@ |
|||||
|
/* eslint-disable no-console */ |
||||
|
|
||||
|
import { register } from "register-service-worker"; |
||||
|
|
||||
|
if (process.env.NODE_ENV === "production") { |
||||
|
register(`${process.env.BASE_URL}service-worker.js`, { |
||||
|
ready() { |
||||
|
console.log( |
||||
|
"App is being served from cache by a service worker.\n" + |
||||
|
"For more details, visit https://goo.gl/AFskqB" |
||||
|
); |
||||
|
}, |
||||
|
registered() { |
||||
|
console.log("Service worker has been registered."); |
||||
|
}, |
||||
|
cached() { |
||||
|
console.log("Content has been cached for offline use."); |
||||
|
}, |
||||
|
updatefound() { |
||||
|
console.log("New content is downloading."); |
||||
|
}, |
||||
|
updated() { |
||||
|
console.log("New content is available; please refresh."); |
||||
|
}, |
||||
|
offline() { |
||||
|
console.log( |
||||
|
"No internet connection found. App is running in offline mode." |
||||
|
); |
||||
|
}, |
||||
|
error(error) { |
||||
|
console.error("Error during service worker registration:", error); |
||||
|
} |
||||
|
}); |
||||
|
} |
@ -0,0 +1,202 @@ |
|||||
|
import Vue from 'vue'; |
||||
|
import VueRouter from 'vue-router'; |
||||
|
import Home from 'views/Index/Index.vue'; |
||||
|
|
||||
|
Vue.use(VueRouter); |
||||
|
|
||||
|
const routes = [ |
||||
|
// 首页数据统计
|
||||
|
{ |
||||
|
path: '/', |
||||
|
name: 'Home', |
||||
|
component: Home, |
||||
|
}, |
||||
|
// 选择平车界面
|
||||
|
{ |
||||
|
path: '/choice', |
||||
|
name: 'Choice', |
||||
|
component: () => import('@/views/Choice/Choice.vue'), |
||||
|
}, |
||||
|
// 患者表格
|
||||
|
{ |
||||
|
path: '/patient', |
||||
|
name: 'Patient', |
||||
|
component: () => import('@/views/Choice/Patient.vue'), |
||||
|
}, |
||||
|
// 通用界面
|
||||
|
{ |
||||
|
path: '/currency', |
||||
|
name: 'Currency', |
||||
|
component: () => import('@/views/Currency/Currency.vue'), |
||||
|
}, |
||||
|
// 创建病例界面
|
||||
|
{ |
||||
|
path: '/establish', |
||||
|
name: 'Establish', |
||||
|
component: () => import('@/views/Establish/Establish.vue'), |
||||
|
}, |
||||
|
// 创建病例界面
|
||||
|
{ |
||||
|
path: '/assessment', |
||||
|
name: 'Assessment', |
||||
|
component: () => import('@/views/Establish/Assessment.vue'), |
||||
|
}, |
||||
|
// 团注界面
|
||||
|
{ |
||||
|
path: '/groupNotes', |
||||
|
name: 'GroupNotes', |
||||
|
component: () => import('@/views/GroupNotes/GroupNotes.vue'), |
||||
|
}, |
||||
|
// 视频谈话界面
|
||||
|
{ |
||||
|
path: '/video', |
||||
|
name: 'Video', |
||||
|
component: () => import('@/views/Video/Video.vue'), |
||||
|
}, |
||||
|
// 到场插件
|
||||
|
{ |
||||
|
path: '/information', |
||||
|
name: 'Information', |
||||
|
component: () => import('@/views/Information/Information.vue'), |
||||
|
}, |
||||
|
// 省季度数据分析报告
|
||||
|
{ |
||||
|
path: '/provinceQuarter', |
||||
|
name: 'Quarter', |
||||
|
component: () => import('@/views/Quarter/Province/Quarter.vue'), |
||||
|
}, |
||||
|
// 省年度数据分析报告
|
||||
|
{ |
||||
|
path: '/provinceYear', |
||||
|
name: 'Year', |
||||
|
component: () => import('@/views/Quarter/Province/Year.vue'), |
||||
|
}, |
||||
|
// 省数据分析报告详情
|
||||
|
{ |
||||
|
path: '/provinceDetails', |
||||
|
name: 'ProvinceDetails', |
||||
|
component: () => import('@/views/Quarter/Province/Details.vue'), |
||||
|
}, |
||||
|
// 院值班表
|
||||
|
{ |
||||
|
path: '/courtyardBeOnDuty', |
||||
|
name: 'BeOnDuty', |
||||
|
component: () => import('@/views/Quarter/Courtyard/BeOnDuty.vue'), |
||||
|
}, |
||||
|
// 院急救数据详情
|
||||
|
{ |
||||
|
path: '/courtyardDetails', |
||||
|
name: 'Details', |
||||
|
component: () => import('@/views/Quarter/Courtyard/Details.vue'), |
||||
|
}, |
||||
|
// 院中心领导急救数据详情
|
||||
|
{ |
||||
|
path: '/detailsCore', |
||||
|
name: 'DetailsCore', |
||||
|
component: () => import('@/views/Quarter/Courtyard/DetailsCore.vue'), |
||||
|
}, |
||||
|
// 院信息科
|
||||
|
{ |
||||
|
path: '/courtyardInfor', |
||||
|
name: 'Infor', |
||||
|
component: () => import('@/views/Quarter/Courtyard/Infor.vue'), |
||||
|
}, |
||||
|
// 院运维界面
|
||||
|
{ |
||||
|
path: '/courtyardOperation', |
||||
|
name: 'Operation', |
||||
|
component: () => import('@/views/Quarter/Courtyard/Operation.vue'), |
||||
|
}, |
||||
|
// 院质控数据分析报告
|
||||
|
{ |
||||
|
path: '/courtyardQualityControl', |
||||
|
name: 'QualityControl', |
||||
|
component: () => import('@/views/Quarter/Courtyard/QualityControl.vue'), |
||||
|
}, |
||||
|
// 院中心领导质控数据分析报告
|
||||
|
{ |
||||
|
path: '/controlCore', |
||||
|
name: 'ControlCore', |
||||
|
component: () => import('@/views/Quarter/Courtyard/ControlCore.vue'), |
||||
|
}, |
||||
|
// 评估插件
|
||||
|
{ |
||||
|
path: '/assess', |
||||
|
name: 'assess', |
||||
|
component: () => import('@/views/Assess/Assess.vue'), |
||||
|
}, |
||||
|
// 医技插件
|
||||
|
{ |
||||
|
path: '/medicalSkill', |
||||
|
name: 'MedicalSkill', |
||||
|
component: () => import('@/views/MedicalSkill/MedicalSkill.vue'), |
||||
|
}, |
||||
|
// 治疗方案
|
||||
|
{ |
||||
|
path: '/treatmentPlan', |
||||
|
name: 'treatmentPlan', |
||||
|
component: () => import('@/views/TreatmentPlan/TreatmentPlan.vue'), |
||||
|
}, |
||||
|
// 质控界面
|
||||
|
{ |
||||
|
path: '/control', |
||||
|
name: 'Control', |
||||
|
component: () => import('@/views/Control/Control.vue'), |
||||
|
// 1月质控报告详情界面
|
||||
|
}, |
||||
|
{ |
||||
|
path: '/report', |
||||
|
name: 'Report', |
||||
|
component: () => import('@/views/Report/Report.vue'), |
||||
|
}, |
||||
|
// 患者列表
|
||||
|
{ |
||||
|
path: '/patientList', |
||||
|
name: 'PatientList', |
||||
|
component: () => import('@/views/PatientList/PatientList.vue'), |
||||
|
}, |
||||
|
// 静脉溶栓插件
|
||||
|
{ |
||||
|
path: '/vein', |
||||
|
name: 'Vein', |
||||
|
component: () => import('@/views/Vein/Vein.vue'), |
||||
|
}, |
||||
|
// 添加患者列表
|
||||
|
{ |
||||
|
path: '/addPatient', |
||||
|
name: 'AddPatient', |
||||
|
component: () => import('@/views/AddPatient/AddPatient.vue'), |
||||
|
}, |
||||
|
// 介入治疗插件
|
||||
|
{ |
||||
|
path: '/therapy', |
||||
|
name: 'Therapy', |
||||
|
component: () => import('@/views/Therapy/Therapy.vue'), |
||||
|
}, |
||||
|
// 知情谈话
|
||||
|
{ |
||||
|
path: '/treatment', |
||||
|
name: 'Treatment', |
||||
|
component: () => import('@/views/Treatment/Treatment.vue'), |
||||
|
}, |
||||
|
// 会诊界面
|
||||
|
{ |
||||
|
path: '/diagnosis', |
||||
|
name: 'Diagnosis', |
||||
|
component: () => import('@/views/Diagnosis/Diagnosis.vue'), |
||||
|
}, |
||||
|
// 信息直报
|
||||
|
{ |
||||
|
path: '/infoReport', |
||||
|
name: 'InfoReport', |
||||
|
component: () => import('@/views/InfoReport/InfoReport.vue'), |
||||
|
}, |
||||
|
]; |
||||
|
|
||||
|
const router = new VueRouter({ |
||||
|
mode: 'history', |
||||
|
base: process.env.BASE_URL, |
||||
|
routes, |
||||
|
}); |
||||
|
|
||||
|
export default router; |
@ -0,0 +1,7 @@ |
|||||
|
import Vue from 'vue'; |
||||
|
import Vuex from 'vuex'; |
||||
|
import home from './modules/home/index'; |
||||
|
// import messages from './modules/messages/index';
|
||||
|
|
||||
|
Vue.use(Vuex); |
||||
|
export default new Vuex.Store({ modules: { home } }); |
@ -0,0 +1,85 @@ |
|||||
|
/* |
||||
|
* @Author: wally |
||||
|
* @email: 18603454788@163.com |
||||
|
* @Date: 2021-04-19 10:23:19 |
||||
|
* @LastEditors: Please set LastEditors |
||||
|
* @LastEditTime: 2021-07-29 11:48:40 |
||||
|
*/ |
||||
|
import axios from 'axios'; |
||||
|
import { message } from 'ant-design-vue'; |
||||
|
import { getUserId } from 'config/api-user'; |
||||
|
import { setProStart, getStartTime } from 'config/api'; |
||||
|
|
||||
|
const actions = { |
||||
|
/** |
||||
|
* 通过userId获取token |
||||
|
* @param {any} commit |
||||
|
* @param {object} params 提交的参数 |
||||
|
*/ |
||||
|
async getUserId({ commit }, params) { |
||||
|
try { |
||||
|
const res = await getUserId({ params }); |
||||
|
const { code, msg, data } = res.data; |
||||
|
if (code === 200) { |
||||
|
commit('sign', data.token); |
||||
|
commit('setUser', data); |
||||
|
return data; |
||||
|
} else { |
||||
|
throw msg; |
||||
|
} |
||||
|
} catch (error) { |
||||
|
throw error || '获取个人信息失败'; |
||||
|
} |
||||
|
}, |
||||
|
|
||||
|
/** |
||||
|
* 点击开始 |
||||
|
* @param {any} commit |
||||
|
* @param {object} params 提交的参数 |
||||
|
*/ |
||||
|
async setStart({ rootState }, startTime) { |
||||
|
try { |
||||
|
console.log('rootState1:', rootState.home); |
||||
|
const params = { |
||||
|
param: { |
||||
|
startTime, |
||||
|
taskSubId: rootState.home.ptProps.id, |
||||
|
}, |
||||
|
}; |
||||
|
console.log('rootState2:', rootState.home); |
||||
|
const res = await setProStart(params); |
||||
|
const { code, msg, data } = res.data; |
||||
|
if (code === 200) { |
||||
|
message.success('成功'); |
||||
|
} else { |
||||
|
message.error('请求失败,请重新尝试'); |
||||
|
} |
||||
|
} catch (error) { |
||||
|
message.error('请求失败,请重新尝试'); |
||||
|
} |
||||
|
}, |
||||
|
|
||||
|
/** |
||||
|
* 根据任务Id获取已经填写的时间 |
||||
|
* @param {any} commit |
||||
|
* @param {object} params 提交的参数 |
||||
|
*/ |
||||
|
async getStart({ rootState }) { |
||||
|
try { |
||||
|
const params = { param: { taskSubId: rootState.home.ptProps.id } }; |
||||
|
const res = await getStartTime(params); |
||||
|
const { code, msg, data } = res.data; |
||||
|
if (code === 200) { |
||||
|
if (data && data.startTime) { |
||||
|
return data.startTime; |
||||
|
} |
||||
|
} else { |
||||
|
return false; |
||||
|
} |
||||
|
} catch (error) { |
||||
|
return false; |
||||
|
} |
||||
|
}, |
||||
|
}; |
||||
|
|
||||
|
export default actions; |
@ -0,0 +1,26 @@ |
|||||
|
/* |
||||
|
* @Author: your name |
||||
|
* @Date: 2021-07-28 12:00:41 |
||||
|
* @LastEditTime: 2021-07-29 10:07:25 |
||||
|
* @LastEditors: your name |
||||
|
* @Description: In User Settings Edit |
||||
|
* @FilePath: \wisdomcar_mobile\src\store\modules\home\getters.js |
||||
|
*/ |
||||
|
const getters = { |
||||
|
// 获取用户的id
|
||||
|
userId({ user }) { |
||||
|
try { |
||||
|
if (!user) return ''; |
||||
|
return user.id; |
||||
|
} catch (error) { |
||||
|
console.warn("user's getters 获取userId失败", error); |
||||
|
return ''; |
||||
|
} |
||||
|
}, |
||||
|
}; |
||||
|
// 域定制导航展示形式
|
||||
|
// 0 -> 无特殊导航文字
|
||||
|
// 1 -> 横向定制导航
|
||||
|
// 2 -> 纵向定制导航
|
||||
|
|
||||
|
export default getters; |
@ -0,0 +1,6 @@ |
|||||
|
import mutations from './mutations'; |
||||
|
import actions from './actions'; |
||||
|
import getters from './getters'; |
||||
|
import state from './state'; |
||||
|
|
||||
|
export default { namespaced: true, state, getters, mutations, actions }; |
@ -0,0 +1,91 @@ |
|||||
|
/* |
||||
|
* @Author: aBin |
||||
|
* @email: binbin0314@126.com |
||||
|
* @Date: 2021-05-31 17:25:39 |
||||
|
* @LastEditors: Please set LastEditors |
||||
|
* @LastEditTime: 2021-07-29 11:48:32 |
||||
|
*/ |
||||
|
const mutations = { |
||||
|
/** |
||||
|
* 设置token |
||||
|
* @param { object } state |
||||
|
* @param { string } token |
||||
|
*/ |
||||
|
sign(state, token) { |
||||
|
state.anyringToken = token; |
||||
|
sessionStorage.setItem('anyringToken', token); |
||||
|
}, |
||||
|
/** |
||||
|
* 设置token |
||||
|
* @param { object } state |
||||
|
* @param { string } token |
||||
|
*/ |
||||
|
getToken(state, token) { |
||||
|
state.anyringToken = sessionStorage.getItem('anyringToken'); |
||||
|
}, |
||||
|
/** |
||||
|
* 设置user用户信息 |
||||
|
* @param {object} state |
||||
|
* @param {object} user {id, account, phone} |
||||
|
*/ |
||||
|
setUser(state, user) { |
||||
|
if (!user) return; |
||||
|
state.user = { ...user }; |
||||
|
sessionStorage.setItem('user', JSON.stringify(user)); |
||||
|
}, |
||||
|
/** |
||||
|
* 设置user用户信息 |
||||
|
* @param {object} state |
||||
|
* @param {Array} data |
||||
|
*/ |
||||
|
setControlGroups(state, data) { |
||||
|
state.controlGroups = data; |
||||
|
}, |
||||
|
/** |
||||
|
* 设置Pt传过来的参数 |
||||
|
* @param {object} state |
||||
|
* @param {string} data |
||||
|
*/ |
||||
|
setPtProps(state, data) { |
||||
|
state.ptProps = { ...data }; |
||||
|
console.log('setPtProps.ptProps', state.ptProps); |
||||
|
}, |
||||
|
|
||||
|
/** |
||||
|
* 设置标题 |
||||
|
*/ |
||||
|
setTitle(state, data) { |
||||
|
state.title = data; |
||||
|
}, |
||||
|
|
||||
|
/** |
||||
|
* 设置标题图标 |
||||
|
* 格式 [{ icon: 'plus-circle', path: '/addPatient', type: 1 }] |
||||
|
* icon 图标类型 || 图片路径 |
||||
|
* type 1 图标 2 图片 3 文字 |
||||
|
* path 跳转路径 |
||||
|
*/ |
||||
|
setTitleIcon(state, data) { |
||||
|
state.list = data; |
||||
|
}, |
||||
|
|
||||
|
/** |
||||
|
* 设置正式演示 |
||||
|
* @param {object} state |
||||
|
* @param {number} data 0正式 1演示 |
||||
|
*/ |
||||
|
setValueType(state, data) { |
||||
|
state.valueType = data; |
||||
|
}, |
||||
|
|
||||
|
/** |
||||
|
* 增加了一个到场医生后,值加一,到场信息界面监听到值变化后重新查询 |
||||
|
* @param {object} state |
||||
|
* @param {number} data |
||||
|
*/ |
||||
|
setAddNum(state, data) { |
||||
|
state.addNum = data; |
||||
|
}, |
||||
|
}; |
||||
|
|
||||
|
export default mutations; |
@ -0,0 +1,24 @@ |
|||||
|
/* |
||||
|
* @Author: wally |
||||
|
* @email: 18603454788@163.com |
||||
|
* @Date: 2021-04-19 10:23:19 |
||||
|
* @LastEditors: Please set LastEditors |
||||
|
* @LastEditTime: 2021-07-29 18:45:35 |
||||
|
*/ |
||||
|
const state = { |
||||
|
anyringToken: '', |
||||
|
user: { id: '', phone: '', account: '', wxInfo: { nickname: '' } }, |
||||
|
ptProps: { |
||||
|
userId: '', |
||||
|
// taskId: '',
|
||||
|
// projectId: '',
|
||||
|
id: '1400657516546887680', |
||||
|
projectId: '1420652719055839232', |
||||
|
}, // 接受PT传过来的 pluginId,projectId,roleId,taskId(id),userId
|
||||
|
title: '智慧平车', |
||||
|
list: [], |
||||
|
valueType: 0, |
||||
|
addNum: 0, |
||||
|
}; |
||||
|
|
||||
|
export default state; |
@ -0,0 +1,283 @@ |
|||||
|
<template> |
||||
|
<div class="d-flex flex-column pb-10"> |
||||
|
<div :key="indexa" class="tow mb-3" v-for="(index, indexa) in data"> |
||||
|
<a-list :data-source="index" class="white" item-layout="horizontal"> |
||||
|
<a-list-item class="mx-3" slot="renderItem" slot-scope="item" v-if="item.show"> |
||||
|
<div class="d-flex flex-nowrap align-center" style="width: 100%"> |
||||
|
<div class="mr-3"> |
||||
|
{{ item.title }} |
||||
|
<span class="text-red" v-if="item.required">*</span> |
||||
|
</div> |
||||
|
<div class="flex-1 flex-row-reverse"> |
||||
|
<a-input @change="onChange($event, item.name)" placeholder="请输入" style="width: 150px" v-if="item.type === 'text'" /> |
||||
|
<a-input |
||||
|
@change="onChange($event, item.name)" |
||||
|
placeholder="请输入" |
||||
|
style="width: 150px" |
||||
|
type="number" |
||||
|
v-if="item.type === 'heath'" |
||||
|
/> |
||||
|
<div type="number" v-else-if="item.type === 'heaths'">自动生成</div> |
||||
|
<a-radio-group @change="onChange($event, item.name)" class="d-flex flex-nowrap" v-else-if="item.type === 'gender'"> |
||||
|
<a-radio :style="radioStyle" :value="0" class="flex-1">女</a-radio> |
||||
|
<a-radio :style="radioStyle" :value="1" class="flex-1">男</a-radio> |
||||
|
</a-radio-group> |
||||
|
<a-radio-group @change="onChange($event, item.name)" class="d-flex flex-nowrap" v-else-if="item.type === 'timeType'"> |
||||
|
<a-radio :style="radioStyle" :value="0">已知</a-radio> |
||||
|
<a-radio :style="radioStyle" :value="1">未知</a-radio> |
||||
|
<a-radio :style="radioStyle" :value="2">醒后卒中</a-radio> |
||||
|
</a-radio-group> |
||||
|
<!-- 发病时间 --> |
||||
|
<a-date-picker |
||||
|
@change="onTimeChange($event, item.name)" |
||||
|
format="YYYY-MM-DD HH:mm" |
||||
|
placeholder="请选择发病时间" |
||||
|
show-time |
||||
|
style="width: 150px" |
||||
|
v-else-if="item.type === 'time'" |
||||
|
/> |
||||
|
<!-- 最后看起来正常时间 --> |
||||
|
<a-date-picker |
||||
|
@change="onTimeChange($event, item.name)" |
||||
|
format="YYYY-MM-DD HH:mm" |
||||
|
placeholder="请选择最后正常时间" |
||||
|
show-time |
||||
|
style="width: 150px" |
||||
|
v-else-if="item.type === 'lastNormalTime'" |
||||
|
/> |
||||
|
<a-radio-group @change="onChange($event, item.name)" class="d-flex flex-nowrap" v-else-if="item.type === 'radio'"> |
||||
|
<a-radio :style="radioStyle" :value="0" class="flex-1">否</a-radio> |
||||
|
<a-radio :style="radioStyle" :value="1" class="flex-1">是</a-radio> |
||||
|
</a-radio-group> |
||||
|
<a-date-picker |
||||
|
@change="onTimeChange($event, item.name)" |
||||
|
format="YYYY-MM-DD HH:mm" |
||||
|
placeholder="请选择到院时间" |
||||
|
show-time |
||||
|
style="width: 150px" |
||||
|
v-else-if="item.type === 'arriveTime'" |
||||
|
/> |
||||
|
<a-date-picker |
||||
|
@change="onTimeChange($event, item.name)" |
||||
|
format="YYYY-MM-DD HH:mm" |
||||
|
placeholder="请选择住院时间" |
||||
|
show-time |
||||
|
style="width: 150px" |
||||
|
v-else-if="item.type === 'inspect'" |
||||
|
/> |
||||
|
<a-select |
||||
|
@change="handleSelectChange($event, item.name)" |
||||
|
placeholder="请选择" |
||||
|
style="width: 150px" |
||||
|
v-else-if="item.type === 'select'" |
||||
|
> |
||||
|
<a-select-option :key="listIndex" :value="list.id" v-for="(list, listIndex) in item.lists">{{ |
||||
|
list.value |
||||
|
}}</a-select-option> |
||||
|
</a-select> |
||||
|
<!-- 入院途径 --> |
||||
|
<div v-else-if="item.type === 'pathway'" style="width: 150px"> |
||||
|
<a-select @change="handleSelectChange($event, item.name)" placeholder="请选择" style="width: 150px"> |
||||
|
<a-select-option :key="listIndex" :value="list.id" v-for="(list, listIndex) in item.lists">{{ |
||||
|
list.value |
||||
|
}}</a-select-option> |
||||
|
</a-select> |
||||
|
<a-input |
||||
|
@change="onPathwayChange($event, item.name)" |
||||
|
placeholder="请输入其他入院途径" |
||||
|
class="mt-3" |
||||
|
style="width: 150px" |
||||
|
v-if="showOther" |
||||
|
/> |
||||
|
</div> |
||||
|
<a-cascader |
||||
|
v-else-if="item.type === 'inHospitalType'" |
||||
|
style="width: 150px" |
||||
|
:options="item.lists" |
||||
|
placeholder="请选择" |
||||
|
change-on-select |
||||
|
@change="handleSelectChange($event, item.name)" |
||||
|
/> |
||||
|
<a-upload |
||||
|
:headers="headers" |
||||
|
:multiple="true" |
||||
|
@change="handleChange" |
||||
|
action="https://www.mocky.io/v2/5cc8019d300000980a055e76" |
||||
|
name="file" |
||||
|
v-else-if="item.type === 'photo'" |
||||
|
> |
||||
|
<a-button class="uploads"> |
||||
|
<a-icon type="camera" /> |
||||
|
</a-button> |
||||
|
</a-upload> |
||||
|
</div> |
||||
|
</div> |
||||
|
</a-list-item> |
||||
|
</a-list> |
||||
|
</div> |
||||
|
<img @click="openChoice" class="yan" src="../../assets/fixed.png" /> |
||||
|
<a-button :loading="loading" @click="submit" class="mx-3 mb-10" type="primary">完成创建患者</a-button> |
||||
|
</div> |
||||
|
</template> |
||||
|
|
||||
|
<script> |
||||
|
import { mapState, mapGetters, mapMutations } from 'vuex'; |
||||
|
import { data } from './config'; |
||||
|
import { createCase } from 'config/api'; |
||||
|
|
||||
|
export default { |
||||
|
data() { |
||||
|
return { |
||||
|
data, |
||||
|
loading: false, |
||||
|
current: 0, |
||||
|
radioStyle: { |
||||
|
display: 'block', |
||||
|
height: '30px', |
||||
|
lineHeight: '30px', |
||||
|
}, |
||||
|
headers: { authorization: 'authorization-text' }, |
||||
|
options: {}, |
||||
|
showOther: false, |
||||
|
}; |
||||
|
}, |
||||
|
|
||||
|
computed: { |
||||
|
...mapState('home', ['valueType']), |
||||
|
...mapGetters('home', ['userId']), |
||||
|
}, |
||||
|
|
||||
|
created() { |
||||
|
this.setTitle('基本信息'); |
||||
|
const item = [{ icon: '(演)', path: '', type: 3 }]; |
||||
|
this.setTitleIcon(item); |
||||
|
}, |
||||
|
|
||||
|
methods: { |
||||
|
...mapMutations('home', ['setTitle', 'setTitleIcon']), |
||||
|
onChange(e, name) { |
||||
|
this.options[name] = e.target.value; |
||||
|
if (name === 'timeType') { |
||||
|
if (e.target.value === 0) { |
||||
|
this.data[3][1].show = true; |
||||
|
this.data[3][2].show = false; |
||||
|
} else if (e.target.value === 1) { |
||||
|
this.data[3][1].show = false; |
||||
|
this.data[3][2].show = false; |
||||
|
} else { |
||||
|
this.data[3][1].show = false; |
||||
|
this.data[3][2].show = true; |
||||
|
} |
||||
|
} |
||||
|
if (name === 'hospitalStroke') { |
||||
|
if (e.target.value === 0) { |
||||
|
this.data[3][4].show = true; |
||||
|
} else { |
||||
|
this.data[3][4].show = false; |
||||
|
} |
||||
|
} |
||||
|
}, |
||||
|
onTimeChange(time, name) { |
||||
|
const chooseTime = this.$moment(time).format('x'); |
||||
|
this.options[name] = chooseTime; |
||||
|
}, |
||||
|
handleSelectChange(value, name) { |
||||
|
console.log('value, name: ', value, name); |
||||
|
console.log('name', name === 'pathway' && value === '其他'); |
||||
|
if (name === 'inHospitalType') { |
||||
|
this.showOther = false; |
||||
|
this.options[name] = value[value.length - 1]; |
||||
|
} else if (name === 'pathway' && value === '其他') { |
||||
|
this.showOther = true; |
||||
|
} else { |
||||
|
this.showOther = false; |
||||
|
this.options[name] = value; |
||||
|
} |
||||
|
}, |
||||
|
onPathwayChange(e, name) { |
||||
|
console.log('e, name: ', e.target.value, name); |
||||
|
this.options['pathway'] = e.target.value; |
||||
|
}, |
||||
|
handleChange(info) { |
||||
|
if (info.file.status !== 'uploading') { |
||||
|
console.log(info.file, info.fileList); |
||||
|
} |
||||
|
if (info.file.status === 'done') { |
||||
|
this.$message.success(`${info.file.name} file uploaded successfully`); |
||||
|
} else if (info.file.status === 'error') { |
||||
|
this.$message.error(`${info.file.name} file upload failed.`); |
||||
|
} |
||||
|
}, |
||||
|
|
||||
|
// 完成患者创建 |
||||
|
async submit() { |
||||
|
try { |
||||
|
this.loading = true; |
||||
|
const param = this.options; |
||||
|
const params = { param }; |
||||
|
params.param.valueType = this.valueType; |
||||
|
const res = await createCase(params); |
||||
|
this.loading = false; |
||||
|
const { code, data, msg } = res.data; |
||||
|
if (code === 200) { |
||||
|
this.$message.success('创建成功'); |
||||
|
location.href = `http://www.tall.wiki/tall/v3.0.0/#/?u=${this.userId}&p=${data.projectId}`; |
||||
|
} else { |
||||
|
this.$message.error(msg || '创建失败'); |
||||
|
} |
||||
|
} catch (error) { |
||||
|
this.loading = false; |
||||
|
console.log('error: ', error); |
||||
|
} |
||||
|
}, |
||||
|
|
||||
|
// 跳转绑定平车 |
||||
|
openChoice() { |
||||
|
this.$router.push('/choice'); |
||||
|
this.setTitleIcon([]); |
||||
|
}, |
||||
|
}, |
||||
|
}; |
||||
|
</script> |
||||
|
|
||||
|
<style scoped> |
||||
|
.ant-list-item >>> input { |
||||
|
outline: none; |
||||
|
border: none; |
||||
|
text-align: right; |
||||
|
} |
||||
|
|
||||
|
.ant-calendar-picker >>> input { |
||||
|
padding-right: 34px; |
||||
|
} |
||||
|
|
||||
|
.ant-select >>> .ant-select-selection { |
||||
|
border: none; |
||||
|
} |
||||
|
|
||||
|
.ant-select >>> .ant-select-selection__placeholder, |
||||
|
.ant-select-search__field__placeholder { |
||||
|
text-align: right; |
||||
|
} |
||||
|
|
||||
|
.ant-select >>> .ant-select-selection-selected-value { |
||||
|
width: 100%; |
||||
|
text-align: right; |
||||
|
padding-right: 11px; |
||||
|
} |
||||
|
|
||||
|
.ant-cascader-picker >>> .ant-cascader-input.ant-input { |
||||
|
padding-right: 35px; |
||||
|
} |
||||
|
|
||||
|
.ant-cascader-picker >>> .ant-cascader-picker-label { |
||||
|
text-align: right; |
||||
|
padding-right: 35px; |
||||
|
} |
||||
|
|
||||
|
.yan { |
||||
|
position: fixed; |
||||
|
right: 0; |
||||
|
top: 50%; |
||||
|
} |
||||
|
</style> |
@ -0,0 +1,117 @@ |
|||||
|
export const data = [ |
||||
|
[{ title: '身份信息', name: 'idcardInfo', type: 'photo', show: true }], |
||||
|
[ |
||||
|
{ title: '姓名', name: 'name', type: 'text', required: true, show: true }, |
||||
|
{ title: '性别', name: 'gender', type: 'gender', required: true, show: true }, |
||||
|
{ title: '年龄', name: 'age', type: 'heath', required: true, show: true }, |
||||
|
{ |
||||
|
title: '民族', |
||||
|
name: 'nation', |
||||
|
type: 'select', |
||||
|
show: true, |
||||
|
lists: [ |
||||
|
{ id: '汉族', value: '汉族' }, |
||||
|
{ id: '蒙古族', value: '蒙古族' }, |
||||
|
{ id: '回族', value: '回族' }, |
||||
|
{ id: '藏族', value: '藏族' }, |
||||
|
{ id: '维吾尔族', value: '维吾尔族' }, |
||||
|
{ id: '苗族', value: '苗族' }, |
||||
|
{ id: '彝族', value: '彝族' }, |
||||
|
{ id: '壮族', value: '壮族' }, |
||||
|
{ id: '布依族', value: '布依族' }, |
||||
|
{ id: '朝鲜族', value: '朝鲜族' }, |
||||
|
{ id: '满族', value: '满族' }, |
||||
|
{ id: '侗族', value: '侗族' }, |
||||
|
{ id: '瑶族', value: '瑶族' }, |
||||
|
{ id: '白族', value: '白族' }, |
||||
|
{ id: '土家族', value: '土家族' }, |
||||
|
{ id: '哈尼族', value: '哈尼族' }, |
||||
|
{ id: '哈萨克族', value: '哈萨克族' }, |
||||
|
{ id: '傣族', value: '傣族' }, |
||||
|
{ id: '黎族', value: '黎族' }, |
||||
|
{ id: '傈僳族', value: '傈僳族' }, |
||||
|
{ id: '佤族', value: '佤族' }, |
||||
|
{ id: '畲族', value: '畲族' }, |
||||
|
{ id: '高山族', value: '高山族' }, |
||||
|
{ id: '拉祜族', value: '拉祜族' }, |
||||
|
{ id: '水族', value: '水族' }, |
||||
|
{ id: '东乡族', value: '东乡族' }, |
||||
|
{ id: '纳西族', value: '纳西族' }, |
||||
|
{ id: '景颇族', value: '景颇族' }, |
||||
|
{ id: '柯尔克孜族', value: '柯尔克孜族' }, |
||||
|
{ id: '土族', value: '土族' }, |
||||
|
{ id: '达斡尔族', value: '达斡尔族' }, |
||||
|
{ id: '仫佬族', value: '仫佬族' }, |
||||
|
{ id: '羌族', value: '羌族' }, |
||||
|
{ id: '布朗族', value: '布朗族' }, |
||||
|
{ id: '撒拉族', value: '撒拉族' }, |
||||
|
{ id: '毛南族', value: '毛南族' }, |
||||
|
{ id: '仡佬族', value: '仡佬族' }, |
||||
|
{ id: '锡伯族', value: '锡伯族' }, |
||||
|
{ id: '阿昌族', value: '阿昌族' }, |
||||
|
{ id: '普米族', value: '普米族' }, |
||||
|
{ id: '塔吉克族', value: '塔吉克族' }, |
||||
|
{ id: '怒族', value: '怒族' }, |
||||
|
{ id: '乌孜别克族', value: '乌孜别克族' }, |
||||
|
{ id: '俄罗斯族', value: '俄罗斯族' }, |
||||
|
{ id: '鄂温克族', value: '鄂温克族' }, |
||||
|
{ id: '德昂族', value: '德昂族' }, |
||||
|
{ id: '保安族', value: '保安族' }, |
||||
|
{ id: '裕固族', value: '裕固族' }, |
||||
|
{ id: '京族', value: '京族' }, |
||||
|
{ id: '塔塔尔族', value: '塔塔尔族' }, |
||||
|
{ id: '独龙族', value: '独龙族' }, |
||||
|
{ id: '鄂伦春族', value: '鄂伦春族' }, |
||||
|
{ id: '赫哲族', value: '赫哲族' }, |
||||
|
{ id: '门巴族', value: '门巴族' }, |
||||
|
{ id: '珞巴族', value: '珞巴族' }, |
||||
|
{ id: '基诺族', value: '基诺族' }, |
||||
|
], |
||||
|
}, // 民族
|
||||
|
{ title: '证件号', name: 'idcard', type: 'text', show: true }, |
||||
|
{ title: '住院号', name: 'medicalRecordNum', type: 'text', show: true }, |
||||
|
], |
||||
|
[ |
||||
|
{ title: '联系电话', name: 'phone', type: 'heath', show: true }, |
||||
|
{ title: '亲属电话', name: 'kinsfolkPhone', type: 'heath', show: true }, |
||||
|
], |
||||
|
[ |
||||
|
{ title: '发病时间类型', name: 'timeType', type: 'timeType', show: true }, |
||||
|
{ title: '发病时间', name: 'time', type: 'time', show: true }, |
||||
|
{ title: '最后正常时间', name: 'lastNormalTime', type: 'lastNormalTime', show: false }, |
||||
|
{ title: '是否在院内卒中', name: 'hospitalStroke', type: 'radio', show: true }, |
||||
|
{ title: '到院时间', name: 'arriveHospitalTime', type: 'arriveTime', show: true }, |
||||
|
{ title: '住院时间', name: 'hospitalizedTime', type: 'inspect', show: true }, |
||||
|
{ |
||||
|
title: '入院途径', |
||||
|
name: 'pathway', |
||||
|
type: 'pathway', |
||||
|
lists: [ |
||||
|
{ id: '急诊', value: '急诊' }, |
||||
|
{ id: '门诊', value: '门诊' }, |
||||
|
{ id: '其他医疗机构转入', value: '其他医疗机构转入' }, |
||||
|
{ id: '其他', value: '其他' }, |
||||
|
], |
||||
|
show: true, |
||||
|
}, |
||||
|
{ |
||||
|
title: '来院方式', |
||||
|
name: 'inHospitalType', |
||||
|
type: 'inHospitalType', |
||||
|
lists: [ |
||||
|
{ value: 1, label: '本院急救车' }, |
||||
|
{ value: 2, label: '当地120' }, |
||||
|
{ |
||||
|
value: 7, |
||||
|
label: '外院转院', |
||||
|
children: [ |
||||
|
{ value: 3, label: '网络协作医院' }, |
||||
|
{ value: 4, label: '非网络协作医院' }, |
||||
|
], |
||||
|
}, |
||||
|
{ value: 5, label: '自行来院' }, |
||||
|
], |
||||
|
show: true, |
||||
|
}, |
||||
|
], |
||||
|
]; |
@ -0,0 +1,307 @@ |
|||||
|
<template> |
||||
|
<div class="d-flex flex-column pb-10"> |
||||
|
<div class="tow mb-3" v-for="(index, indexa) in information" :key="indexa"> |
||||
|
<a-list item-layout="horizontal" class="white" :data-source="index"> |
||||
|
<a-list-item class="mx-3" slot="renderItem" slot-scope="item"> |
||||
|
<div class="d-flex flex-nowrap align-center" style="width: 100%"> |
||||
|
<div class="mr-3">{{ item.title }}</div> |
||||
|
<div class="flex-1 flex-row-reverse"> |
||||
|
<span |
||||
|
v-if="item.type === 'heath'" |
||||
|
class="pr-3" |
||||
|
@click=" |
||||
|
openNumKey( |
||||
|
item.title.split(' ')[0], |
||||
|
item.title.split(' ')[1], |
||||
|
record[`${item.name}`] && record[`${item.name}`].length ? record[`${item.name}`][0] : '', |
||||
|
item.name, |
||||
|
) |
||||
|
" |
||||
|
> |
||||
|
{{ item.value || (record[`${item.name}`] && record[`${item.name}`].length ? record[`${item.name}`][0] : '') }} |
||||
|
</span> |
||||
|
|
||||
|
<div v-else-if="item.type === 'heaths'" type="number" class="pr-3"> |
||||
|
{{ weight && height ? (weight / (height * height)).toFixed(2) : 0 }} |
||||
|
</div> |
||||
|
<div v-else-if="item.type === 'radio'"> |
||||
|
<a-radio-group |
||||
|
:default-value="record[`${item.name}`] && record[`${item.name}`].length ? record[`${item.name}`][0] : ''" |
||||
|
:key="record[`${item.name}`] && record[`${item.name}`].length ? record[`${item.name}`][0] : ''" |
||||
|
@change="onChange($event, item.name)" |
||||
|
class="d-flex flex-nowrap" |
||||
|
> |
||||
|
<a-radio :style="radioStyle" value="0" class="flex-1"> 否 </a-radio> |
||||
|
<a-radio :style="radioStyle" value="1" class="flex-1"> 是 </a-radio> |
||||
|
</a-radio-group> |
||||
|
<div v-if="show" class="mt-3"> |
||||
|
洼田饮水试验 |
||||
|
<a-input |
||||
|
@click="showModel = true" |
||||
|
style="width: 50px; border-bottom: 1px solid #666; border-radius: 0" |
||||
|
type="text" |
||||
|
:value="currentValue" |
||||
|
/> |
||||
|
级 |
||||
|
</div> |
||||
|
</div> |
||||
|
<a-checkbox-group |
||||
|
v-else-if="item.type === 'radios'" |
||||
|
v-model="checkedList" |
||||
|
:options="plainOptions" |
||||
|
@change="onCheckChange($event, item.name)" |
||||
|
/> |
||||
|
</div> |
||||
|
</div> |
||||
|
</a-list-item> |
||||
|
</a-list> |
||||
|
</div> |
||||
|
<test-model v-if="showModel" :lists="lists" :current-value="currentValue" @closeModel="closeModel"></test-model> |
||||
|
<num-key |
||||
|
v-if="showNumModel" |
||||
|
:title="title" |
||||
|
:unit="unit" |
||||
|
:num-value="numValue" |
||||
|
:type="type" |
||||
|
@closeNumModel="closeNumModel" |
||||
|
@changeValue="changeValue" |
||||
|
/> |
||||
|
</div> |
||||
|
</template> |
||||
|
|
||||
|
<script> |
||||
|
import { mapState, mapMutations } from 'vuex'; |
||||
|
import { information } from './config'; |
||||
|
import { queryAidRecord, aidRecord } from 'config/api'; |
||||
|
import TestModel from '@/components/TestModel/TestModel.vue'; |
||||
|
import NumKey from '../../components/NumKey/NumKey.vue'; |
||||
|
|
||||
|
export default { |
||||
|
components: { TestModel, NumKey }, |
||||
|
data() { |
||||
|
return { |
||||
|
information, |
||||
|
current: 0, |
||||
|
radioStyle: { |
||||
|
display: 'block', |
||||
|
height: '30px', |
||||
|
lineHeight: '30px', |
||||
|
}, |
||||
|
plainOptions: ['糖尿病', '高血压'], |
||||
|
checkedList: [], |
||||
|
show: false, |
||||
|
record: {}, |
||||
|
headers: { authorization: 'authorization-text' }, |
||||
|
options: { |
||||
|
answer: '', |
||||
|
questionCode: '', |
||||
|
}, |
||||
|
height: 0, |
||||
|
weight: 0, |
||||
|
info: { |
||||
|
RYPGheight: 0, |
||||
|
RYPGweight: 0, |
||||
|
RYPGsystolicPressure: 0, |
||||
|
RYPGdiastolicPressure: 0, |
||||
|
RYPGpulse: 0, |
||||
|
RYPGbloodGlucose: 0, |
||||
|
RYPGmRSScore: 0, |
||||
|
RYPGNIHSSScore: 0, |
||||
|
RYPGswallowingFunction: 0, |
||||
|
RYPGmedicalHistory: 0, |
||||
|
}, |
||||
|
lists: ['1', '2', '3', '4', '5', '未评'], |
||||
|
showModel: false, |
||||
|
currentValue: '', |
||||
|
numValue: '0', |
||||
|
title: '', |
||||
|
unit: '', |
||||
|
type: '', |
||||
|
showNumModel: false, |
||||
|
}; |
||||
|
}, |
||||
|
|
||||
|
computed: mapState('home', ['ptProps']), |
||||
|
|
||||
|
created() { |
||||
|
this.setTitle('入院评估'); |
||||
|
this.getQuery(); |
||||
|
}, |
||||
|
|
||||
|
methods: { |
||||
|
...mapMutations('home', ['setTitle']), |
||||
|
|
||||
|
// 点击弹出数字键盘 |
||||
|
openNumKey(title, unit, value, name) { |
||||
|
this.title = title; |
||||
|
this.unit = unit; |
||||
|
this.type = name; |
||||
|
this.numValue = value; |
||||
|
this.showNumModel = true; |
||||
|
}, |
||||
|
|
||||
|
// 关闭数字键盘 |
||||
|
closeNumModel() { |
||||
|
this.showNumModel = false; |
||||
|
}, |
||||
|
|
||||
|
// 数字键盘修改值 |
||||
|
changeValue(value, name) { |
||||
|
this.showNumModel = false; |
||||
|
if (name === 'RYPG-height') { |
||||
|
this.height = value / 100 - 0; |
||||
|
} |
||||
|
if (name === 'RYPG-weight') { |
||||
|
this.weight = value - 0; |
||||
|
} |
||||
|
// 赋值 |
||||
|
for (var i = 0; i < this.information.length; i++) { |
||||
|
const item = this.information[i]; |
||||
|
for (var j = 0; j < item.length; j++) { |
||||
|
if (item[j].name === name) { |
||||
|
item[j].value = value; |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
this.options = {}; |
||||
|
this.options.answer = [value]; |
||||
|
this.options.questionCode = name; |
||||
|
this.submit(this.options); |
||||
|
}, |
||||
|
|
||||
|
onChange(e, name) { |
||||
|
if (name === 'RYPG-swallowingFunction') { |
||||
|
if (e.target.value === '0') { |
||||
|
this.show = false; |
||||
|
} else { |
||||
|
this.show = true; |
||||
|
} |
||||
|
} |
||||
|
this.options = {}; |
||||
|
this.options.answer = [e.target.value]; |
||||
|
this.options.questionCode = name; |
||||
|
this.submit(this.options); |
||||
|
}, |
||||
|
|
||||
|
onCheckChange(value, name) { |
||||
|
this.options = {}; |
||||
|
this.options.answer = value; |
||||
|
this.options.questionCode = name; |
||||
|
this.submit(this.options); |
||||
|
}, |
||||
|
|
||||
|
// 弹框关闭 |
||||
|
closeModel(i) { |
||||
|
this.showModel = false; |
||||
|
if (i) { |
||||
|
this.currentValue = this.lists[i]; |
||||
|
this.options = {}; |
||||
|
this.options.answer = [this.lists[i]]; |
||||
|
this.options.questionCode = 'RYPG-test'; |
||||
|
this.submit(this.options); |
||||
|
} |
||||
|
}, |
||||
|
|
||||
|
/** |
||||
|
* 批量查询急救信息 |
||||
|
* @param { Array } codeList code列表 |
||||
|
* @param { String } projectId 项目id |
||||
|
*/ |
||||
|
async getQuery() { |
||||
|
try { |
||||
|
const params = { |
||||
|
param: { |
||||
|
codeList: [ |
||||
|
'RYPG-height', |
||||
|
'RYPG-weight', |
||||
|
'RYPG-weight', |
||||
|
'RYPG-systolicPressure', |
||||
|
'RYPG-diastolicPressure', |
||||
|
'RYPG-pulse', |
||||
|
'RYPG-bloodGlucose', |
||||
|
'RYPG-mRSScore', |
||||
|
'RYPG-NIHSSScore', |
||||
|
'RYPG-swallowingFunction', |
||||
|
'RYPG-medicalHistory', |
||||
|
'RYPG-test', |
||||
|
], |
||||
|
projectId: this.ptProps.projectId, |
||||
|
}, |
||||
|
}; |
||||
|
const res = await queryAidRecord(params); |
||||
|
const { code, data, msg } = res.data; |
||||
|
if (code === 200) { |
||||
|
this.record = data.record; |
||||
|
// 赋值BMI |
||||
|
if (this.record['RYPG-height']) { |
||||
|
this.height = this.record['RYPG-height'] / 100 - 0; |
||||
|
} |
||||
|
if (this.record['RYPG-weight']) { |
||||
|
this.weight = this.record['RYPG-weight'] - 0; |
||||
|
} |
||||
|
if (this.record['RYPG-medicalHistory']) { |
||||
|
this.checkedList = this.record['RYPG-medicalHistory']; |
||||
|
} |
||||
|
if (this.record['RYPG-test'] && this.record['RYPG-swallowingFunction'] && this.record['RYPG-swallowingFunction'] === '1') { |
||||
|
this.show = true; |
||||
|
this.currentValue = this.record['RYPG-test']; |
||||
|
} |
||||
|
// 赋值单选 |
||||
|
} else { |
||||
|
this.$message.error(msg || '查询失败'); |
||||
|
} |
||||
|
} catch (error) { |
||||
|
console.log('error: ', error); |
||||
|
} |
||||
|
}, |
||||
|
|
||||
|
/** |
||||
|
* 提交信息 |
||||
|
* @param { Array } codeAndAnswerList code和答案 |
||||
|
* @param { String } projectId 项目id |
||||
|
* @param { Number } userType 提交人类型(0平车 1人) |
||||
|
*/ |
||||
|
async submit(options) { |
||||
|
try { |
||||
|
const params = { |
||||
|
param: { |
||||
|
codeAndAnswerList: [options], |
||||
|
projectId: this.ptProps.projectId, |
||||
|
userType: 0, |
||||
|
}, |
||||
|
}; |
||||
|
const res = await aidRecord(params); |
||||
|
const { code, data, msg } = res.data; |
||||
|
if (code === 200) { |
||||
|
} else { |
||||
|
this.$message.error(msg || '提交失败'); |
||||
|
} |
||||
|
} catch (error) { |
||||
|
console.log('error: ', error); |
||||
|
} |
||||
|
}, |
||||
|
}, |
||||
|
}; |
||||
|
</script> |
||||
|
|
||||
|
<style scoped> |
||||
|
.ant-list-item >>> input { |
||||
|
outline: none; |
||||
|
border: none; |
||||
|
text-align: right; |
||||
|
} |
||||
|
|
||||
|
.ant-calendar-picker >>> input { |
||||
|
padding-right: 34px; |
||||
|
} |
||||
|
|
||||
|
.ant-select >>> .ant-select-selection { |
||||
|
border: none; |
||||
|
} |
||||
|
|
||||
|
.ant-select >>> .ant-select-selection__placeholder, |
||||
|
.ant-select-search__field__placeholder { |
||||
|
text-align: right; |
||||
|
} |
||||
|
</style> |
@ -0,0 +1,19 @@ |
|||||
|
export const information = [ |
||||
|
[ |
||||
|
{ title: '身高 cm', name: 'RYPG-height', type: 'heath', value: '' }, |
||||
|
{ title: '体重 kg', name: 'RYPG-weight', type: 'heath', value: '' }, |
||||
|
{ title: 'BMI(系统自动计算)', name: 'RYPG-bmi', type: 'heaths', value: '' }, |
||||
|
], |
||||
|
[ |
||||
|
{ title: '收缩压 mmHg', name: 'RYPG-systolicPressure', type: 'heath', value: '' }, |
||||
|
{ title: '舒张压 mmHg', name: 'RYPG-diastolicPressure', type: 'heath', value: '' }, |
||||
|
{ title: '脉搏 次/分', name: 'RYPG-pulse', type: 'heath', value: '' }, |
||||
|
{ title: '快速血糖 mmol/L', name: 'RYPG-bloodGlucose', type: 'heath', value: '' }, |
||||
|
], |
||||
|
[ |
||||
|
{ title: '本次入院mRS评分', name: 'RYPG-mRSScore', type: 'heath', value: '' }, |
||||
|
{ title: '本次入院NIHSS评分', name: 'RYPG-NIHSSScore', type: 'heath', value: '' }, |
||||
|
{ title: '吞咽功能', name: 'RYPG-swallowingFunction', type: 'radio', value: null }, |
||||
|
], |
||||
|
[{ title: '既往病史', name: 'RYPG-medicalHistory', type: 'radios' }], |
||||
|
]; |
@ -0,0 +1,296 @@ |
|||||
|
<!-- |
||||
|
* @Author: aBin |
||||
|
* @email: binbin0314@126.com |
||||
|
* @Date: 2021-06-01 16:07:17 |
||||
|
* @LastEditors: Please set LastEditors |
||||
|
* @LastEditTime: 2021-07-29 23:57:56 |
||||
|
--> |
||||
|
<template> |
||||
|
<div class="d-flex flex-wrap flex-column"> |
||||
|
<div v-if="showInfo"> |
||||
|
<a-card class="fill-width" style="position: relative"> |
||||
|
<div slot="title" class="d-flex align-center"> |
||||
|
<span> 选择平车 </span> |
||||
|
<div class="flex-1 justify-center"> |
||||
|
<a-button type="primary" v-if="everCar && everCar.carSerial" @click="showInfo = false">查看平车信息</a-button> |
||||
|
</div> |
||||
|
<a-icon type="undo" class="title-icon" @click="getCar" /> |
||||
|
</div> |
||||
|
<a-spin tip="正在重新获取平车数据..." :spinning="spinning"> |
||||
|
<a-radio-group class="d-flex flex-column" v-if="list.length" @change="choiceCar"> |
||||
|
<div v-for="item in list" :key="item.id" class="radio-box d-flex"> |
||||
|
<a-radio :key="item.id" class="radio-item" :value="item.id"> |
||||
|
{{ item.serial }} |
||||
|
</a-radio> |
||||
|
<div class="radio-name" v-if="item.patientName">已绑定</div> |
||||
|
</div> |
||||
|
</a-radio-group> |
||||
|
<a-empty v-else description="暂时没有平车数据" /> |
||||
|
</a-spin> |
||||
|
</a-card> |
||||
|
<a-card class="fill-width mt-1"> |
||||
|
<div slot="title" class="d-flex align-center"> |
||||
|
<span class="flex-1"> 选择时间 </span> |
||||
|
</div> |
||||
|
<div class="d-flex align-center"> |
||||
|
<div class="flex-1">开始时间:</div> |
||||
|
<a-date-picker |
||||
|
class="mr-2" |
||||
|
:default-value="$moment(startTime)" |
||||
|
format="YYYY-MM-DD HH:mm" |
||||
|
:show-time="{ format: 'HH:mm' }" |
||||
|
placeholder="开始时间" |
||||
|
@change="changeStart" |
||||
|
/> |
||||
|
</div> |
||||
|
<div class="d-flex align-center mt-2"> |
||||
|
<div class="flex-1">结束时间:</div> |
||||
|
<a-date-picker |
||||
|
class="mr-2" |
||||
|
format="YYYY-MM-DD HH:mm" |
||||
|
:show-time="{ format: 'HH:mm' }" |
||||
|
placeholder="结束时间" |
||||
|
@change="changeEnd" |
||||
|
/> |
||||
|
</div> |
||||
|
</a-card> |
||||
|
<a-button v-if="carInfo !== null" class="mt-2 mb-4" style="height: 40px" type="primary" block @click="suspend"> 提交 </a-button> |
||||
|
<a-modal v-model="visible" title="提示" @ok="submitCar"> |
||||
|
<p v-if="carInfo"> |
||||
|
此平车已绑定病人 |
||||
|
<!-- <span class="name-box" @click="changePro(carInfo.projectId)">{{ carInfo.name }}(点击查看详情)</span> --> |
||||
|
<br /> |
||||
|
确定换绑吗? |
||||
|
</p> |
||||
|
</a-modal> |
||||
|
</div> |
||||
|
<div v-else> |
||||
|
<a-card style="padding: 0 12px"> |
||||
|
<div class="align-center d-flex flex-row flex-nowrap justify-space-between"> |
||||
|
<div class="title-box">患者:{{ everCar.name }}</div> |
||||
|
<div class="title-box" v-if="everCar && everCar.startTime">{{ $moment(+everCar.startTime).format('MM-DD HH:mm') }}</div> |
||||
|
<div class="car-box" @click="showInfo = true">卒中专用平车{{ everCar.carNumber }}</div> |
||||
|
</div> |
||||
|
</a-card> |
||||
|
<a-card class="mt-1 fill-width"> |
||||
|
<!-- <process :list="infoList" class="my-4" /> --> |
||||
|
<img class="fill-width" src="https://www.tall.wiki/staticrec/photos/step.png" /> |
||||
|
</a-card> |
||||
|
<a-card class="mt-1"> |
||||
|
<data-table :list="infoList" /> |
||||
|
</a-card> |
||||
|
<a-card class="mt-1"> |
||||
|
<!-- <analysis /> --> |
||||
|
<img class="fill-width" src="https://www.tall.wiki/staticrec/photos/step-echart.png" /> |
||||
|
</a-card> |
||||
|
</div> |
||||
|
</div> |
||||
|
</template> |
||||
|
|
||||
|
<script> |
||||
|
import { mapState, mapMutations } from 'vuex'; |
||||
|
import { bindingCar, queryBindingCar, queryAllCar, switchProject, findStepIsOver, endCar } from 'config/api'; |
||||
|
// import Analysis from './../Index/components/Analysis.vue'; |
||||
|
import DataTable from './../Index/components/DataTable.vue'; |
||||
|
// import Process from './../Index/components/Process.vue'; |
||||
|
export default { |
||||
|
name: 'Choice', |
||||
|
components: { DataTable }, |
||||
|
data() { |
||||
|
return { |
||||
|
spinning: false, |
||||
|
list: [], |
||||
|
startTime: Date.parse(new Date()), |
||||
|
endTime: 0, |
||||
|
id: 0, |
||||
|
carInfo: null, |
||||
|
oldChoiceCar: [], |
||||
|
visible: false, |
||||
|
infoList: [], |
||||
|
everCar: null, |
||||
|
showInfo: true, |
||||
|
}; |
||||
|
}, |
||||
|
computed: mapState('home', ['ptProps']), |
||||
|
created() { |
||||
|
this.getChoice(); |
||||
|
this.getCar(); |
||||
|
this.setTitle('选择平车'); |
||||
|
}, |
||||
|
methods: { |
||||
|
...mapMutations('home', ['setTitle']), |
||||
|
|
||||
|
choiceCar(e) { |
||||
|
let { list } = this; |
||||
|
// this.id = e.target.value; |
||||
|
const index = list.findIndex(item => item.id === e.target.value); |
||||
|
this.carInfo = list[index]; |
||||
|
}, |
||||
|
async getCar() { |
||||
|
try { |
||||
|
const that = this; |
||||
|
that.spinning = true; |
||||
|
const params = { param: {} }; |
||||
|
const res = await queryAllCar(params); |
||||
|
const { code, msg, data } = res.data; |
||||
|
if (code === 200) { |
||||
|
this.list = [...data]; |
||||
|
that.spinning = false; |
||||
|
} else { |
||||
|
that.spinning = false; |
||||
|
} |
||||
|
} catch (error) { |
||||
|
that.spinning = false; |
||||
|
} |
||||
|
}, |
||||
|
suspend() { |
||||
|
const { carInfo } = this; |
||||
|
if (!carInfo) { |
||||
|
this.$message.warning('没有选择平车'); |
||||
|
return; |
||||
|
} else if (carInfo.patientName) { |
||||
|
this.visible = true; |
||||
|
} else { |
||||
|
this.submitCar(); |
||||
|
} |
||||
|
}, |
||||
|
async submitCar() { |
||||
|
try { |
||||
|
// if (carInfo && carInfo.name) { |
||||
|
// const isEnd = await this.endCarData(); |
||||
|
// if (!isEnd) { |
||||
|
// this.$message.warning('解除绑定平车失败'); |
||||
|
// return; |
||||
|
// } |
||||
|
// } |
||||
|
const { projectId } = this.ptProps; |
||||
|
const { carInfo, startTime, endTime } = this; |
||||
|
const params = { |
||||
|
param: { |
||||
|
carId: carInfo.id, |
||||
|
startTime, |
||||
|
projectId, |
||||
|
// taskSubId: id, |
||||
|
endTime, |
||||
|
}, |
||||
|
}; |
||||
|
|
||||
|
const res = await bindingCar(params); |
||||
|
const { code } = res.data; |
||||
|
if (code === 200) { |
||||
|
this.$message.success('选择成功'); |
||||
|
this.getChoice(); |
||||
|
} else { |
||||
|
this.$message.warning(msg); |
||||
|
} |
||||
|
} catch (error) { |
||||
|
this.$message.warning('选择失败'); |
||||
|
} |
||||
|
}, |
||||
|
|
||||
|
async endCarData() { |
||||
|
try { |
||||
|
const { patientCarId } = this.carInfo; |
||||
|
const params = { param: { id: patientCarId } }; |
||||
|
const res = await endCar(params); |
||||
|
const { code, data } = res.data; |
||||
|
if (code === 200) { |
||||
|
return true; |
||||
|
} else { |
||||
|
return false; |
||||
|
} |
||||
|
} catch (error) { |
||||
|
return false; |
||||
|
} |
||||
|
}, |
||||
|
|
||||
|
changeStart(e) { |
||||
|
this.startTime = e._i; |
||||
|
}, |
||||
|
changeEnd(e) { |
||||
|
this.endTime = e._i; |
||||
|
}, |
||||
|
async getChoice() { |
||||
|
try { |
||||
|
// const params = { param: { taskSubId: '1400297464451436544' } }; |
||||
|
const params = { param: { projectId: this.ptProps.projectId } }; |
||||
|
const res = await queryBindingCar(params); |
||||
|
const { code, data } = res.data; |
||||
|
if (code === 200) { |
||||
|
this.everCar = data; |
||||
|
this.getList(data); |
||||
|
this.showInfo = false; |
||||
|
} |
||||
|
} catch (error) {} |
||||
|
}, |
||||
|
async changePro(projectId) { |
||||
|
try { |
||||
|
const params = { param: { projectId } }; |
||||
|
await switchProject(params); |
||||
|
} catch (error) {} |
||||
|
}, |
||||
|
async getList() { |
||||
|
try { |
||||
|
const { projectId } = this.ptProps; |
||||
|
const params = { param: { projectId } }; |
||||
|
const res = await findStepIsOver(params); |
||||
|
const { code, data } = res.data; |
||||
|
if (code === 200) { |
||||
|
this.infoList = data; |
||||
|
} |
||||
|
} catch (error) {} |
||||
|
}, |
||||
|
}, |
||||
|
}; |
||||
|
</script> |
||||
|
|
||||
|
<style lang="stylus" scoped> |
||||
|
/deep/.ant-spin-spinning { |
||||
|
background: rgba(0, 0, 0, 0.15); |
||||
|
} |
||||
|
|
||||
|
// /deep/ .ant-radio { |
||||
|
// margin: 12px 0; |
||||
|
// } |
||||
|
.name-box { |
||||
|
color: green; |
||||
|
} |
||||
|
|
||||
|
.radio-box { |
||||
|
background-color: rgb(239, 247, 250); |
||||
|
margin-bottom: 10px; |
||||
|
border: 1px dashed rgba(24, 144, 255, 0.2); |
||||
|
border-radius: 5px; |
||||
|
padding-left: 10px; |
||||
|
} |
||||
|
|
||||
|
.radio-name { |
||||
|
height: 40px; |
||||
|
line-height: 40px; |
||||
|
width: 40%; |
||||
|
text-align: center; |
||||
|
color: green; |
||||
|
} |
||||
|
|
||||
|
.radio-item { |
||||
|
display: 'block'; |
||||
|
height: 40px; |
||||
|
line-height: 40px; |
||||
|
width: 60%; |
||||
|
} |
||||
|
|
||||
|
.title-icon { |
||||
|
color: rgba(24, 144, 255, 0.5); |
||||
|
font-size: 20px; |
||||
|
} |
||||
|
|
||||
|
.car-box { |
||||
|
background-color: #49cc90; |
||||
|
color: #fff; |
||||
|
padding: 0 8px; |
||||
|
font-weight: 500; |
||||
|
height: 32px; |
||||
|
line-height: 32px; |
||||
|
border-radius: 10px; |
||||
|
} |
||||
|
</style> |
@ -0,0 +1,106 @@ |
|||||
|
<!-- |
||||
|
* @Author: aBin |
||||
|
* @email: binbin0314@126.com |
||||
|
* @Date: 2021-06-03 18:26:42 |
||||
|
* @LastEditors: aBin |
||||
|
* @LastEditTime: 2021-06-11 16:15:23 |
||||
|
--> |
||||
|
<template> |
||||
|
<div class="d-flex flex-column"> |
||||
|
<div class="flex-1" v-if="list && list.length"> |
||||
|
<a-table |
||||
|
:columns="columns" |
||||
|
:pagination="false" |
||||
|
:data-source="list" |
||||
|
:row-key="record => record.id" |
||||
|
bordered |
||||
|
class="white pa-3 fill-width" |
||||
|
> |
||||
|
<template slot="id" slot-scope="text, record, index"> |
||||
|
<span>{{ index + 1 }}</span> |
||||
|
</template> |
||||
|
<template slot="sex" slot-scope="text, record"> |
||||
|
<span v-if="record.sex === 0">女</span> |
||||
|
<span v-else>男</span> |
||||
|
</template> |
||||
|
<template slot="edit" slot-scope="text, record"> |
||||
|
<span style="color: #1890ff; font-weight: 600" @click="changePro(record.projectId)">查看</span> |
||||
|
</template> |
||||
|
</a-table> |
||||
|
</div> |
||||
|
<a-empty v-else /> |
||||
|
</div> |
||||
|
</template> |
||||
|
|
||||
|
<script> |
||||
|
import { mapMutations } from 'vuex'; |
||||
|
import { findOldPatient, switchProject } from 'config/api'; |
||||
|
const columns = [ |
||||
|
{ |
||||
|
title: '序号', |
||||
|
align: 'center', |
||||
|
dataIndex: 'id', |
||||
|
key: 'id', |
||||
|
scopedSlots: { customRender: 'id' }, |
||||
|
}, |
||||
|
{ |
||||
|
title: '姓名', |
||||
|
align: 'center', |
||||
|
dataIndex: 'name', |
||||
|
key: 'name', |
||||
|
}, |
||||
|
{ |
||||
|
title: '年龄', |
||||
|
align: 'center', |
||||
|
dataIndex: 'age', |
||||
|
key: 'age', |
||||
|
}, |
||||
|
{ |
||||
|
title: '性别', |
||||
|
align: 'center', |
||||
|
dataIndex: 'sex', |
||||
|
key: 'sex', |
||||
|
scopedSlots: { customRender: 'sex' }, |
||||
|
}, |
||||
|
{ |
||||
|
title: '操作', |
||||
|
align: 'center', |
||||
|
dataIndex: 'edit', |
||||
|
key: 'edit', |
||||
|
scopedSlots: { customRender: 'edit' }, |
||||
|
}, |
||||
|
]; |
||||
|
export default { |
||||
|
name: 'Patient', |
||||
|
data() { |
||||
|
return { |
||||
|
columns, |
||||
|
list: [], |
||||
|
}; |
||||
|
}, |
||||
|
created() { |
||||
|
this.getData(); |
||||
|
this.setTitle('患者表格'); |
||||
|
}, |
||||
|
methods: { |
||||
|
...mapMutations('home', ['setTitle']), |
||||
|
|
||||
|
async getData() { |
||||
|
try { |
||||
|
const params = { param: {} }; |
||||
|
const res = await findOldPatient(params); |
||||
|
const { code, data } = res.data; |
||||
|
if (code === 200) { |
||||
|
this.list = data; |
||||
|
} |
||||
|
} catch (error) {} |
||||
|
}, |
||||
|
async changePro(projectId) { |
||||
|
try { |
||||
|
const params = { param: { projectId } }; |
||||
|
await switchProject(params); |
||||
|
} catch (error) {} |
||||
|
}, |
||||
|
}, |
||||
|
}; |
||||
|
</script> |
@ -0,0 +1,244 @@ |
|||||
|
<template> |
||||
|
<div class="d-flex flex-column"> |
||||
|
<div class="tips d-flex justify-space-between align-center px-2"> |
||||
|
<div class="d-flex">时间单位:min</div> |
||||
|
<div class="d-flex flex-row align-center"> |
||||
|
<div class="yuanquan bg-green mr-1"></div> |
||||
|
标准范围事件 |
||||
|
</div> |
||||
|
<div class="d-flex flex-row align-center"> |
||||
|
<div class="yuanquan bg-red mr-1"></div> |
||||
|
超出参考时间 |
||||
|
</div> |
||||
|
</div> |
||||
|
<Table :table-list="tableList" /> |
||||
|
<TimeLine :line-list="lineList" /> |
||||
|
</div> |
||||
|
</template> |
||||
|
<script> |
||||
|
import { mapMutations, mapState } from 'vuex'; |
||||
|
import { getControl, queryByProject, queryAidRecord } from 'config/api'; |
||||
|
import Table from './components/Table.vue'; |
||||
|
import TimeLine from './components/TimeLine.vue'; |
||||
|
export default { |
||||
|
name: 'Control', |
||||
|
components: { Table, TimeLine }, |
||||
|
data() { |
||||
|
return { |
||||
|
tableList: [ |
||||
|
{ |
||||
|
time: 35, |
||||
|
scope: 'ONT', |
||||
|
beyond: '发病-溶栓', |
||||
|
}, |
||||
|
{ |
||||
|
time: 40, |
||||
|
scope: 'DNT', |
||||
|
beyond: '到院-溶栓', |
||||
|
}, |
||||
|
{ |
||||
|
time: 55, |
||||
|
scope: 'OPT', |
||||
|
beyond: '发病-穿刺', |
||||
|
}, |
||||
|
{ |
||||
|
time: 50, |
||||
|
scope: 'DPT', |
||||
|
beyond: '到院-穿刺', |
||||
|
}, |
||||
|
{ |
||||
|
time: 48, |
||||
|
scope: 'DRT', |
||||
|
beyond: '到院-再通', |
||||
|
}, |
||||
|
], |
||||
|
lineList: [ |
||||
|
{ |
||||
|
codeT: '就诊时间', |
||||
|
valueT: 0, |
||||
|
codeB: 'CT完成时间', |
||||
|
valueB: 0, |
||||
|
}, |
||||
|
{ |
||||
|
codeT: 'CT完成时间', |
||||
|
valueT: 0, |
||||
|
codeB: '溶栓开始知情', |
||||
|
valueB: 0, |
||||
|
}, |
||||
|
{ |
||||
|
codeT: '就诊时间', |
||||
|
valueT: 0, |
||||
|
codeB: 'CT完成时间', |
||||
|
valueB: 0, |
||||
|
}, |
||||
|
{ |
||||
|
codeT: '溶栓开始知情', |
||||
|
valueT: 0, |
||||
|
codeB: '溶栓签署知情', |
||||
|
valueB: 0, |
||||
|
}, |
||||
|
{ |
||||
|
codeT: '就诊时间', |
||||
|
valueT: 0, |
||||
|
codeB: '溶栓签署知情', |
||||
|
valueB: 0, |
||||
|
}, |
||||
|
{ |
||||
|
codeT: '第一次医疗接触时间', |
||||
|
valueT: 0, |
||||
|
codeB: '溶栓开始时间', |
||||
|
valueB: 0, |
||||
|
}, |
||||
|
{ |
||||
|
codeT: '就诊时间', |
||||
|
valueT: 0, |
||||
|
codeB: '溶栓开始时间', |
||||
|
valueB: 0, |
||||
|
}, |
||||
|
{ |
||||
|
codeT: '最后正常时间', |
||||
|
valueT: 0, |
||||
|
codeB: '溶栓开始时间', |
||||
|
valueB: 0, |
||||
|
}, |
||||
|
{ |
||||
|
codeT: '血管内治疗开始知情', |
||||
|
valueT: 0, |
||||
|
codeB: '血管内治疗签署知情', |
||||
|
valueB: 0, |
||||
|
}, |
||||
|
{ |
||||
|
codeT: '血管内治疗签署知情', |
||||
|
valueT: 0, |
||||
|
codeB: '穿刺时间', |
||||
|
valueB: 0, |
||||
|
}, |
||||
|
{ |
||||
|
codeT: '穿刺时间', |
||||
|
valueT: 0, |
||||
|
codeB: '造影完成', |
||||
|
valueB: 0, |
||||
|
}, |
||||
|
{ |
||||
|
codeT: '穿刺时间', |
||||
|
valueT: 0, |
||||
|
codeB: '血管再通时间', |
||||
|
valueB: 0, |
||||
|
}, |
||||
|
{ |
||||
|
codeT: '发病时间', |
||||
|
valueT: 0, |
||||
|
codeB: '到达医院大门时间', |
||||
|
valueB: 0, |
||||
|
}, |
||||
|
{ |
||||
|
codeT: '到达医院大门时间', |
||||
|
valueT: 0, |
||||
|
codeB: '穿刺时间', |
||||
|
valueB: 0, |
||||
|
}, |
||||
|
], |
||||
|
}; |
||||
|
}, |
||||
|
computed: { ...mapState('home', ['ptProps']) }, |
||||
|
async created() { |
||||
|
this.setTitle('质控'); |
||||
|
// this.getControlData(); |
||||
|
await this.getLineData(); |
||||
|
await this.getRecord(); |
||||
|
}, |
||||
|
methods: { |
||||
|
...mapMutations('home', ['setTitle']), |
||||
|
async getControlData() { |
||||
|
try { |
||||
|
const params = { param: {} }; |
||||
|
const res = await getControl(params); |
||||
|
const { code, msg, data } = res.data; |
||||
|
if (code === 200) { |
||||
|
this.tableList = data; |
||||
|
} else { |
||||
|
console.log(msg); |
||||
|
} |
||||
|
} catch (error) { |
||||
|
console.log(error); |
||||
|
} |
||||
|
}, |
||||
|
// 根据code查询时间信息 |
||||
|
async getRecord() { |
||||
|
try { |
||||
|
const { projectId } = this.ptProps; |
||||
|
const { lineList } = this; |
||||
|
const params = { |
||||
|
param: { |
||||
|
codeList: ['YJJL-CTendTime', 'ZQTH-THSJ', 'ZQTH-ZQSJ', 'JMRSSJ', 'JRZL-CCSJ', 'JRZL-ZCKT'], |
||||
|
projectId, |
||||
|
}, |
||||
|
}; |
||||
|
const res = await queryAidRecord(params); |
||||
|
const { code, msg, data } = res.data; |
||||
|
if (code === 200) { |
||||
|
lineList[0].valueB = data.record['YJJL-CTendTime'][0]; |
||||
|
lineList[1].valueT = data.record['YJJL-CTendTime'][0]; |
||||
|
lineList[1].valueB = data.record['ZQTH-THSJ'][0]; |
||||
|
lineList[2].valueB = data.record['YJJL-CTendTime'][0]; |
||||
|
lineList[3].valueT = data.record['ZQTH-THSJ'][0]; |
||||
|
lineList[3].valueB = data.record['ZQTH-ZQSJ'][0]; |
||||
|
lineList[4].valueB = data.record['ZQTH-ZQSJ'][0]; |
||||
|
lineList[5].valueB = data.record['JMRSSJ'][0]; |
||||
|
lineList[6].valueB = data.record['ZQTH-ZQSJ'][0]; |
||||
|
lineList[7].valueB = data.record['ZQTH-ZQSJ'][0]; |
||||
|
lineList[9].valueB = data.record['JRZL-CCSJ'][0]; |
||||
|
lineList[10].valueT = data.record['JRZL-CCSJ'][0]; |
||||
|
lineList[11].valueT = data.record['JRZL-CCSJ'][0]; |
||||
|
lineList[11].valueB = data.record['JRZL-ZCKT'][0]; |
||||
|
lineList[13].valueB = data.record['JRZL-CCSJ'][0]; |
||||
|
|
||||
|
this.lineList = [...lineList]; |
||||
|
} else { |
||||
|
this.$message.error(msg || '查询失败'); |
||||
|
} |
||||
|
} catch (error) {} |
||||
|
}, |
||||
|
// 根据项目id查询信息 |
||||
|
async getLineData() { |
||||
|
try { |
||||
|
const { projectId } = this.ptProps; |
||||
|
const { lineList } = this; |
||||
|
const params = { param: { projectId } }; |
||||
|
const res = await queryByProject(params); |
||||
|
const { code, msg, data } = res.data; |
||||
|
if (code === 200) { |
||||
|
this.lineList[0].valueT = data.arriveHospitalTime; |
||||
|
this.lineList[2].valueT = data.arriveHospitalTime; |
||||
|
this.lineList[4].valueT = data.arriveHospitalTime; |
||||
|
this.lineList[6].valueT = data.arriveHospitalTime; |
||||
|
this.lineList[12].valueT = data.lastNormalTime; |
||||
|
this.lineList[12].valueB = data.time; |
||||
|
this.lineList[13].valueT = data.time; |
||||
|
this.lineList = [...lineList]; |
||||
|
} else { |
||||
|
this.$message.error(msg || '查询失败'); |
||||
|
} |
||||
|
} catch (error) {} |
||||
|
}, |
||||
|
}, |
||||
|
}; |
||||
|
</script> |
||||
|
<style lang="scss" scoped> |
||||
|
.tips { |
||||
|
height: 40px; |
||||
|
width: 100%; |
||||
|
color: rgba(0, 0, 0, 0.85); |
||||
|
} |
||||
|
.yuanquan { |
||||
|
height: 16px; |
||||
|
width: 16px; |
||||
|
border-radius: 50%; |
||||
|
} |
||||
|
.bg-red { |
||||
|
background-color: rgba(255, 0, 0, 0.85); |
||||
|
} |
||||
|
.bg-green { |
||||
|
background-color: #7ed321; |
||||
|
} |
||||
|
</style> |
@ -0,0 +1,38 @@ |
|||||
|
<template> |
||||
|
<div class="bg-white"> |
||||
|
<a-list item-layout="horizontal" :data-source="tableList"> |
||||
|
<a-list-item slot="renderItem" slot-scope="item, index" :class="index % 2 === 1 ? 'bg-green' : ''"> |
||||
|
<div class="d-flex justify-space-between align-center fill-width" style="padding: 0 20px"> |
||||
|
<div>{{ item.time }}</div> |
||||
|
<div>{{ item.scope }}</div> |
||||
|
<div>{{ item.beyond }}</div> |
||||
|
</div> |
||||
|
</a-list-item> |
||||
|
</a-list> |
||||
|
</div> |
||||
|
</template> |
||||
|
<script> |
||||
|
export default { |
||||
|
name: 'Table', |
||||
|
props: { |
||||
|
tableList: { |
||||
|
default: () => [], |
||||
|
type: Array, |
||||
|
}, |
||||
|
}, |
||||
|
data() { |
||||
|
return {}; |
||||
|
}, |
||||
|
}; |
||||
|
</script> |
||||
|
<style scoped lang="scss"> |
||||
|
.bg-white { |
||||
|
background-color: white; |
||||
|
} |
||||
|
.bg-green { |
||||
|
background-color: rgba(126, 211, 33, 0.15); |
||||
|
} |
||||
|
.ant-list-item { |
||||
|
padding: 8px 0; |
||||
|
} |
||||
|
</style> |
@ -0,0 +1,79 @@ |
|||||
|
<template> |
||||
|
<div class="bg-white mt-2" style="padding-top: 4px"> |
||||
|
<div v-for="(item, index) in lineList" :key="index" class="d-flex flex-row"> |
||||
|
<div style="width: 40px d-flex flex-row"> |
||||
|
<div class="yuanquan"></div> |
||||
|
<div class="line"></div> |
||||
|
</div> |
||||
|
<div class="mt-1 ml-2 flex-1" style="padding-right: 10px"> |
||||
|
<a-card size="small" class="fill-width"> |
||||
|
<div class="d-flex flex-column"> |
||||
|
<div class="flex-1 flex-column"> |
||||
|
<div class="title-code">{{ item.codeT }}</div> |
||||
|
<div class="title-value d-flex align-center"> |
||||
|
<div class="flex-1"> |
||||
|
{{ item.valueT ? $moment(+item.valueT).format('YYYY-MM-DD HH:mm') : '...' }} |
||||
|
</div> |
||||
|
<div class="align-center">时长:</div> |
||||
|
<div class="align-center" style="font-size: 24px; font-weight: 600"> |
||||
|
{{ item.valueT && item.valueB ? ((item.valueB - item.valueT) / 1000 / 60).toFixed(0) : 0 }} |
||||
|
</div> |
||||
|
</div> |
||||
|
</div> |
||||
|
<div class="flex-1 flex-column"> |
||||
|
<div class="title-code">{{ item.codeB }}</div> |
||||
|
<div class="title-value d-flex align-center"> |
||||
|
<div class="flex-1"> |
||||
|
{{ item.valueB ? $moment(+item.valueB).format('YYYY-MM-DD HH:mm') : '...' }} |
||||
|
</div> |
||||
|
<div class="align-center">参考:</div> |
||||
|
<div class="align-center">-min</div> |
||||
|
</div> |
||||
|
</div> |
||||
|
</div> |
||||
|
</a-card> |
||||
|
</div> |
||||
|
</div> |
||||
|
</div> |
||||
|
</template> |
||||
|
<script> |
||||
|
export default { |
||||
|
name: 'TimeLine', |
||||
|
props: { |
||||
|
lineList: { |
||||
|
default: () => [], |
||||
|
type: Array, |
||||
|
}, |
||||
|
}, |
||||
|
data() { |
||||
|
return {}; |
||||
|
}, |
||||
|
}; |
||||
|
</script> |
||||
|
<style scoped lang="scss"> |
||||
|
.bg-white { |
||||
|
background-color: white; |
||||
|
} |
||||
|
.yuanquan { |
||||
|
margin-left: 12px; |
||||
|
height: 16px; |
||||
|
width: 16px; |
||||
|
border-radius: 50%; |
||||
|
background: #7ed321; |
||||
|
margin-top: 4px; |
||||
|
} |
||||
|
.line { |
||||
|
width: 20px; |
||||
|
height: 82%; |
||||
|
border-right: 1px solid #7ed321; |
||||
|
margin-bottom: 2px; |
||||
|
} |
||||
|
.title-code { |
||||
|
font-size: 16px; |
||||
|
font-weight: bold; |
||||
|
} |
||||
|
.title-value { |
||||
|
font-size: 14px; |
||||
|
margin-bottom: 4px; |
||||
|
} |
||||
|
</style> |
@ -0,0 +1,58 @@ |
|||||
|
<!-- |
||||
|
* @Author: aBin |
||||
|
* @email: binbin0314@126.com |
||||
|
* @Date: 2021-06-01 16:07:56 |
||||
|
* @LastEditors: aBin |
||||
|
* @LastEditTime: 2021-06-10 14:23:36 |
||||
|
--> |
||||
|
<template> |
||||
|
<div class="d-flex flex-wrap flex-column"> |
||||
|
<a-card class="fill-width"> |
||||
|
<div class="d-flex flex-nowrap"> |
||||
|
<div class="flex-1"> |
||||
|
<a-date-picker |
||||
|
:value="$moment(time)" |
||||
|
:show-time="{ format: 'HH:mm' }" |
||||
|
format="YYYY-MM-DD HH:mm" |
||||
|
placeholder="选择时间" |
||||
|
style="width: 100%" |
||||
|
@change="onChange" |
||||
|
@ok="onChange" |
||||
|
/> |
||||
|
</div> |
||||
|
<!-- <a-button v-if="isShow" style="width: 100px" type="primary" block @click="start"> 开始 </a-button> --> |
||||
|
</div> |
||||
|
</a-card> |
||||
|
<Content :time="time" /> |
||||
|
</div> |
||||
|
</template> |
||||
|
|
||||
|
<script> |
||||
|
import { mapActions, mapMutations } from 'vuex'; |
||||
|
import Content from 'components/Content/Content.vue'; |
||||
|
export default { |
||||
|
name: 'Currency', |
||||
|
components: { Content }, |
||||
|
data() { |
||||
|
return { time: Date.parse(new Date()), isShow: false }; |
||||
|
}, |
||||
|
async created() { |
||||
|
const start = await this.getStart(); |
||||
|
if (start) { |
||||
|
this.time = +start; |
||||
|
} |
||||
|
this.setTitle('通用界面'); |
||||
|
}, |
||||
|
methods: { |
||||
|
...mapActions('home', ['getStart']), |
||||
|
...mapMutations('home', ['setTitle']), |
||||
|
onChange(e) { |
||||
|
let str = this.$moment(e._d).format('YYYY-MM-DD HH:mm'); |
||||
|
str += ':00'; |
||||
|
this.time = new Date(str).valueOf(); |
||||
|
}, |
||||
|
}, |
||||
|
}; |
||||
|
</script> |
||||
|
|
||||
|
<style lang="stylus" scoped></style> |
@ -0,0 +1,156 @@ |
|||||
|
<template> |
||||
|
<div class="d-flex flex-column"> |
||||
|
<div class="bg-white title d-flex align-center pl-4" style="height: 44px">山西医科大学第一医院</div> |
||||
|
<a-collapse default-active-key="1" @change="changeActivekey"> |
||||
|
<a-collapse-panel key="1" header="神经内科"> |
||||
|
<div class="d-flex flex-wrap"> |
||||
|
<div class="duty-box" v-for="(item, index) in list1" :key="index"> |
||||
|
<img class="duty-img" src="./png/duty.png" /> |
||||
|
<div v-if="item.onDutyStatus" class="duty-isDuty">值班</div> |
||||
|
<div class="duty-name">{{ item.name }}</div> |
||||
|
<a class="duty-tel" :href="'tel:' + item.phone"> |
||||
|
<img class="tel-img" src="./png/tel.png" /> |
||||
|
呼叫 |
||||
|
</a> |
||||
|
</div> |
||||
|
</div> |
||||
|
</a-collapse-panel> |
||||
|
<a-collapse-panel key="2" header="急诊科"> |
||||
|
<div class="d-flex flex-wrap"> |
||||
|
<div class="duty-box" v-for="(item, index) in list2" :key="index"> |
||||
|
<img class="duty-img" src="./png/duty.png" /> |
||||
|
<div v-if="item.onDutyStatus" class="duty-isDuty">值班</div> |
||||
|
<div class="duty-name">{{ item.name }}</div> |
||||
|
<a class="duty-tel" :href="'tel:' + item.phone"> |
||||
|
<img class="tel-img" src="./png/tel.png" /> |
||||
|
呼叫 |
||||
|
</a> |
||||
|
</div> |
||||
|
</div> |
||||
|
</a-collapse-panel> |
||||
|
</a-collapse> |
||||
|
</div> |
||||
|
</template> |
||||
|
<script> |
||||
|
import { mapMutations } from 'vuex'; |
||||
|
import { queryAllDoctor } from 'config/api'; |
||||
|
export default { |
||||
|
name: 'Diagnosis', |
||||
|
data() { |
||||
|
return { |
||||
|
list: [ |
||||
|
{ |
||||
|
name: '传小控', |
||||
|
isDuty: true, |
||||
|
tel: 1234657890, |
||||
|
}, |
||||
|
{ |
||||
|
name: '传小控', |
||||
|
isDuty: true, |
||||
|
tel: 1234657890, |
||||
|
}, |
||||
|
{ |
||||
|
name: '传小控', |
||||
|
isDuty: false, |
||||
|
tel: 1234657890, |
||||
|
}, |
||||
|
{ |
||||
|
name: '传小控', |
||||
|
isDuty: false, |
||||
|
tel: 1234657890, |
||||
|
}, |
||||
|
], |
||||
|
list1: [], |
||||
|
list2: [], |
||||
|
}; |
||||
|
}, |
||||
|
created() { |
||||
|
this.getDoctor(); |
||||
|
this.setTitle('会诊'); |
||||
|
}, |
||||
|
methods: { |
||||
|
...mapMutations('home', ['setTitle']), |
||||
|
|
||||
|
changeActivekey(key) { |
||||
|
console.log('key: ', key); |
||||
|
}, |
||||
|
async getDoctor() { |
||||
|
try { |
||||
|
const params = { param: {} }; |
||||
|
const res = await queryAllDoctor(params); |
||||
|
// console.log('res: ', res); |
||||
|
// console.log('res.data: ', res.data); |
||||
|
const { code, msg, data } = res.data; |
||||
|
if (code === 200) { |
||||
|
console.log(data); |
||||
|
this.list1 = data['1']; |
||||
|
this.list2 = data['2']; |
||||
|
} else { |
||||
|
console.log(msg); |
||||
|
} |
||||
|
} catch (error) { |
||||
|
console.log(error); |
||||
|
} |
||||
|
}, |
||||
|
}, |
||||
|
}; |
||||
|
</script> |
||||
|
<style lang="scss" scoped> |
||||
|
.bg-white { |
||||
|
background-color: #fff; |
||||
|
} |
||||
|
.title { |
||||
|
border-bottom: 1px solid #ddd; |
||||
|
} |
||||
|
.duty-box { |
||||
|
height: 140px; |
||||
|
width: 30%; |
||||
|
margin: 5px 1.65%; |
||||
|
position: relative; |
||||
|
border-radius: 5px; |
||||
|
border: 1px solid #ccc; |
||||
|
box-shadow: 1px 0 0 -1px #ccc; |
||||
|
} |
||||
|
.duty-img { |
||||
|
position: absolute; |
||||
|
top: 30px; |
||||
|
height: 50px; |
||||
|
width: 50px; |
||||
|
margin-left: 50%; |
||||
|
left: -25px; |
||||
|
} |
||||
|
.duty-isDuty { |
||||
|
background-color: #4b8aff; |
||||
|
position: absolute; |
||||
|
font-size: 12px; |
||||
|
padding: 1px 4px; |
||||
|
color: #fff; |
||||
|
border-radius: 0 5px 0 8px; |
||||
|
right: 0; |
||||
|
top: 0; |
||||
|
} |
||||
|
.duty-name { |
||||
|
width: 60px; |
||||
|
position: absolute; |
||||
|
margin-left: 50%; |
||||
|
left: -30px; |
||||
|
top: 64%; |
||||
|
font-weight: bold; |
||||
|
text-align: center; |
||||
|
} |
||||
|
.duty-tel { |
||||
|
position: absolute; |
||||
|
bottom: 0; |
||||
|
width: 101%; |
||||
|
border-radius: 0 0 5px 5px; |
||||
|
height: 26px; |
||||
|
line-height: 26px; |
||||
|
text-align: center; |
||||
|
color: #fff; |
||||
|
background-color: #4b8aff; |
||||
|
} |
||||
|
.tel-img { |
||||
|
height: 16px; |
||||
|
margin: -4px 4px 0 0; |
||||
|
} |
||||
|
</style> |
After Width: | Height: | Size: 2.6 KiB |
After Width: | Height: | Size: 4.6 KiB |
@ -0,0 +1,51 @@ |
|||||
|
<!-- |
||||
|
* @Author: aBin |
||||
|
* @email: binbin0314@126.com |
||||
|
* @Date: 2021-06-01 19:54:26 |
||||
|
* @LastEditors: aBin |
||||
|
* @LastEditTime: 2021-06-01 20:48:29 |
||||
|
--> |
||||
|
<template> |
||||
|
<div class="d-flex flex-column"> |
||||
|
<a-card title="流行病学史" class="fill-width mt-1"> |
||||
|
<a-list item-layout="horizontal"> |
||||
|
<a-list-item class="d-flex flex-nowrap"> |
||||
|
<div>发病前14天内有无---</div> |
||||
|
<a-switch /> |
||||
|
</a-list-item> |
||||
|
<a-list-item class="d-flex flex-nowrap"> |
||||
|
<div>发病前14天内有无---</div> |
||||
|
<a-switch /> |
||||
|
</a-list-item> |
||||
|
<a-list-item class="d-flex flex-nowrap"> |
||||
|
<div>发病前14天内有无---</div> |
||||
|
<a-switch /> |
||||
|
</a-list-item> |
||||
|
<a-list-item class="d-flex flex-nowrap"> |
||||
|
<div>有聚集性发病</div> |
||||
|
<a-switch /> |
||||
|
</a-list-item> |
||||
|
</a-list> |
||||
|
</a-card> |
||||
|
<a-card title="临床症状" class="fill-width mt-1"> |
||||
|
<a-list item-layout="horizontal"> |
||||
|
<a-list-item class="d-flex flex-nowrap"> |
||||
|
<div>发热/呼吸道症状</div> |
||||
|
<a-switch /> |
||||
|
</a-list-item> |
||||
|
</a-list> |
||||
|
</a-card> |
||||
|
<a-button class="mt-2 mb-4" style="height: 40px" type="primary" block> 提交 </a-button> |
||||
|
</div> |
||||
|
</template> |
||||
|
|
||||
|
<script> |
||||
|
export default { |
||||
|
name: 'Assessment', |
||||
|
data() { |
||||
|
return {}; |
||||
|
}, |
||||
|
}; |
||||
|
</script> |
||||
|
|
||||
|
<style lang="stylus" scoped></style> |
@ -0,0 +1,331 @@ |
|||||
|
<!-- |
||||
|
* @Author: aBin |
||||
|
* @email: binbin0314@126.com |
||||
|
* @Date: 2021-06-01 16:06:14 |
||||
|
* @LastEditors: aBin |
||||
|
* @LastEditTime: 2021-06-10 14:32:31 |
||||
|
--> |
||||
|
<template> |
||||
|
<div class="d-flex flex-wrap flex-column"> |
||||
|
<a-spin :spinning="spinning" tip="正在努力创建病例..."> |
||||
|
<a-card class="fill-width"> |
||||
|
<div slot="title" style="color: rgba(76, 115, 177, 0.9)">基本信息填写</div> |
||||
|
<a-list item-layout="horizontal" :data-source="list"> |
||||
|
<a-list-item slot="renderItem" slot-scope="item" class="d-flex flex-nowrap"> |
||||
|
<div> |
||||
|
{{ item.title }} |
||||
|
<span v-if="item.isTrue" style="color: red">*</span> |
||||
|
</div> |
||||
|
<div v-if="item.type === 'card'"> |
||||
|
<a-upload |
||||
|
name="part" |
||||
|
style="width: 60%" |
||||
|
:headers="headers" |
||||
|
:multiple="false" |
||||
|
:action="action" |
||||
|
:default-file-list="fileList" |
||||
|
list-type="picture-card" |
||||
|
@change="handleChange" |
||||
|
> |
||||
|
<div v-if="fileList.length < 1 && !isUpload"> |
||||
|
<a-icon type="plus" /> |
||||
|
<div class="ant-upload-text">上传身份证</div> |
||||
|
</div> |
||||
|
</a-upload> |
||||
|
</div> |
||||
|
<a-input v-model="item.value" v-else-if="item.type === 'ipt'" style="width: 60%" /> |
||||
|
<a-input-number v-model="item.value" v-else-if="item.type === 'iptNum'" style="width: 60%" /> |
||||
|
<a-radio-group v-model="patientSex" v-else-if="item.type === 'radio'" class="d-flex flex-nowrap" style="width: 60%"> |
||||
|
<a-radio :style="radioStyle" :value="0" class="flex-1"> 女 </a-radio> |
||||
|
<a-radio :style="radioStyle" :value="1" class="flex-1"> 男 </a-radio> |
||||
|
</a-radio-group> |
||||
|
</a-list-item> |
||||
|
</a-list> |
||||
|
</a-card> |
||||
|
<a-card class="fill-width mt-1"> |
||||
|
<a-list item-layout="horizontal"> |
||||
|
<a-list-item @click="jump('/assessment')" class="d-flex flex-nowrap"> |
||||
|
<div>新冠肺炎评估</div> |
||||
|
<a-icon type="right" /> |
||||
|
</a-list-item> |
||||
|
<!-- <a-list-item class="d-flex flex-nowrap"> |
||||
|
<div>病案号</div> |
||||
|
<span style="color: #999">001</span> |
||||
|
</a-list-item> --> |
||||
|
</a-list> |
||||
|
</a-card> |
||||
|
<a-button class="mt-2 mb-4" style="height: 40px" type="primary" block @click="setCase"> |
||||
|
<span v-if="!patientId"> 创建病例 </span> |
||||
|
<span v-else> 修改信息 </span> |
||||
|
</a-button> |
||||
|
</a-spin> |
||||
|
<a-modal title="提示" :visible="visible" @ok="handleOk" @cancel="handleCancel"> |
||||
|
<p>是否跳转到该病例的项目详情页?</p> |
||||
|
</a-modal> |
||||
|
</div> |
||||
|
<!-- action="https://www.mocky.io/v2/5cc8019d300000980a055e76" |
||||
|
:headers="headers" |
||||
|
@change="handleChange" --> |
||||
|
</template> |
||||
|
|
||||
|
<script> |
||||
|
import { mapState, mapMutations } from 'vuex'; |
||||
|
import { createCase, identifyWords, queryPatientInfo, updatePatientInfo, switchProject } from 'config/api'; |
||||
|
|
||||
|
const list = [ |
||||
|
{ |
||||
|
title: '身份信息', |
||||
|
isTrue: true, |
||||
|
type: 'card', |
||||
|
}, |
||||
|
{ |
||||
|
title: '姓名', |
||||
|
isTrue: true, |
||||
|
type: 'ipt', |
||||
|
value: '', |
||||
|
name: 'name', |
||||
|
}, |
||||
|
{ |
||||
|
title: '性别', |
||||
|
isTrue: true, |
||||
|
type: 'radio', |
||||
|
}, |
||||
|
{ |
||||
|
title: '年龄', |
||||
|
isTrue: true, |
||||
|
type: 'iptNum', |
||||
|
value: '', |
||||
|
name: 'age', |
||||
|
}, |
||||
|
{ |
||||
|
title: '身份证号', |
||||
|
isTrue: false, |
||||
|
type: 'ipt', |
||||
|
value: '', |
||||
|
name: 'idCard', |
||||
|
}, |
||||
|
{ |
||||
|
title: '联系电话', |
||||
|
isTrue: false, |
||||
|
type: 'iptNum', |
||||
|
value: '', |
||||
|
name: 'phone', |
||||
|
}, |
||||
|
{ |
||||
|
title: '亲属姓名', |
||||
|
isTrue: false, |
||||
|
type: 'ipt', |
||||
|
value: '', |
||||
|
name: 'familyName', |
||||
|
}, |
||||
|
{ |
||||
|
title: '亲属电话', |
||||
|
isTrue: false, |
||||
|
type: 'iptNum', |
||||
|
value: '', |
||||
|
name: 'familyPhone', |
||||
|
}, |
||||
|
]; |
||||
|
export default { |
||||
|
name: 'Establish', |
||||
|
data() { |
||||
|
return { |
||||
|
list, |
||||
|
formLayout: 'horizontal', |
||||
|
form: this.$form.createForm(this, { name: 'Establish' }), |
||||
|
action: identifyWords, |
||||
|
radioStyle: { |
||||
|
display: 'block', |
||||
|
height: '30px', |
||||
|
lineHeight: '30px', |
||||
|
}, |
||||
|
patientSex: 0, |
||||
|
fileList: [], |
||||
|
isUpload: false, |
||||
|
patientId: '', |
||||
|
visible: false, |
||||
|
projectId: '', |
||||
|
spinning: false, |
||||
|
}; |
||||
|
}, |
||||
|
computed: { |
||||
|
...mapState('home', ['ptProps']), |
||||
|
// 上传附加请求头 |
||||
|
headers() { |
||||
|
const token = sessionStorage.getItem('anyringToken'); |
||||
|
return { Authorization: `Bearer ${token}` }; |
||||
|
}, |
||||
|
}, |
||||
|
created() { |
||||
|
// this.getPatientInfo(); |
||||
|
this.setTitle('创建病例'); |
||||
|
}, |
||||
|
methods: { |
||||
|
...mapMutations('home', ['setTitle']), |
||||
|
|
||||
|
jump(url) { |
||||
|
this.$router.push(url); |
||||
|
}, |
||||
|
// 上传图片 |
||||
|
handleChange(info) { |
||||
|
const status = info.file.status; |
||||
|
if (status === 'uploading') { |
||||
|
this.isUpload = true; |
||||
|
} |
||||
|
if (status === 'done') { |
||||
|
// console.log(info); |
||||
|
const file = info.file; |
||||
|
const obj = { |
||||
|
uid: file.uid, |
||||
|
name: file.response.data.name, |
||||
|
status: status, |
||||
|
url: file.thumbUrl, |
||||
|
}; |
||||
|
for (let i = 0; i < this.list.length; i++) { |
||||
|
if (list[i].name === 'idCard') { |
||||
|
list[i].value = file.response.data.idCardNo; |
||||
|
} else if (list[i].name === 'name') { |
||||
|
list[i].value = file.response.data.name; |
||||
|
} else if (list[i].name === 'age') { |
||||
|
list[i].value = file.response.data.age; |
||||
|
} |
||||
|
} |
||||
|
this.patientSex = file.response.data.sex; |
||||
|
this.fileList.push(obj); |
||||
|
} else if (status === 'removed') { |
||||
|
this.fileList = []; |
||||
|
this.isUpload = false; |
||||
|
} |
||||
|
}, |
||||
|
// 创建病例 |
||||
|
async setCase() { |
||||
|
this.spinning = true; |
||||
|
console.log(this.patientId); |
||||
|
if (this.patientId) { |
||||
|
await this.updatePatientInfo(); |
||||
|
this.spinning = false; |
||||
|
} else { |
||||
|
await this.addPatientInfo(); |
||||
|
this.spinning = false; |
||||
|
} |
||||
|
}, |
||||
|
async addPatientInfo() { |
||||
|
try { |
||||
|
const { patientSex } = this; |
||||
|
const params = { |
||||
|
param: { |
||||
|
familyName: this.getValue('familyName'), |
||||
|
familyPhone: this.getValue('familyPhone'), |
||||
|
patientAge: this.getValue('age'), |
||||
|
patientIdCard: this.getValue('idCard'), |
||||
|
patientName: this.getValue('name'), |
||||
|
patientPhone: this.getValue('phone'), |
||||
|
patientSex: patientSex, |
||||
|
}, |
||||
|
}; |
||||
|
const res = await createCase(params); |
||||
|
const { code, data } = res.data; |
||||
|
if (code === 200) { |
||||
|
this.$message.success('创建成功'); |
||||
|
this.projectId = data.projectId; |
||||
|
this.visible = true; |
||||
|
} else { |
||||
|
this.$message.error('创建失败'); |
||||
|
} |
||||
|
} catch (error) {} |
||||
|
}, |
||||
|
// 获取对应字段的值 |
||||
|
getValue(str) { |
||||
|
const { list } = this; |
||||
|
return list.find(item => { |
||||
|
if (item.name && item.name === str) { |
||||
|
return item; |
||||
|
} |
||||
|
}).value; |
||||
|
}, |
||||
|
async getPatientInfo() { |
||||
|
try { |
||||
|
const parmas = { param: { projectId: this.ptProps.projectId } }; |
||||
|
const res = await queryPatientInfo(parmas); |
||||
|
const { code, msg, data } = res.data; |
||||
|
const { list } = this; |
||||
|
if (code === 200) { |
||||
|
console.log(data); |
||||
|
for (let i = 0; i < list.length; i++) { |
||||
|
for (let key in data) { |
||||
|
if (list[i].name === key) { |
||||
|
list[i].value = data[key]; |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
this.patientSex = data.sex; |
||||
|
this.patientId = data.id; |
||||
|
this.list = [...list]; |
||||
|
} else { |
||||
|
console.error(msg); |
||||
|
} |
||||
|
} catch (error) { |
||||
|
console.error(error); |
||||
|
} |
||||
|
}, |
||||
|
async updatePatientInfo() { |
||||
|
try { |
||||
|
const { patientSex } = this; |
||||
|
const params = { |
||||
|
param: { |
||||
|
id: this.patientId, |
||||
|
familyName: this.getValue('familyName'), |
||||
|
familyPhone: this.getValue('familyPhone'), |
||||
|
age: this.getValue('age'), |
||||
|
idCard: this.getValue('idCard'), |
||||
|
name: this.getValue('name'), |
||||
|
phone: this.getValue('phone'), |
||||
|
sex: patientSex, |
||||
|
}, |
||||
|
}; |
||||
|
const res = await updatePatientInfo(params); |
||||
|
const { code, msg } = res.data; |
||||
|
if (code === 200) { |
||||
|
this.$message.success('修改成功'); |
||||
|
} else { |
||||
|
this.$message.warning(msg); |
||||
|
} |
||||
|
} catch (error) { |
||||
|
console.error(error); |
||||
|
} |
||||
|
}, |
||||
|
async handleOk() { |
||||
|
const { projectId } = this; |
||||
|
const params = { param: { projectId } }; |
||||
|
const res = await switchProject(params); |
||||
|
const { code } = res.data; |
||||
|
if (code === 200) { |
||||
|
this.visible = false; |
||||
|
} |
||||
|
}, |
||||
|
handleCancel() { |
||||
|
this.visible = false; |
||||
|
}, |
||||
|
}, |
||||
|
}; |
||||
|
</script> |
||||
|
|
||||
|
<style lang="stylus" scoped> |
||||
|
/deep/ .ant-card-body { |
||||
|
padding: 12px; |
||||
|
} |
||||
|
|
||||
|
.card-btn { |
||||
|
color: #1890ff; |
||||
|
border: 1px solid rgba(24, 144, 255, 0.5); |
||||
|
} |
||||
|
|
||||
|
/deep/ .ant-input-number-handler-wrap { |
||||
|
display: none; |
||||
|
} |
||||
|
|
||||
|
/deep/ .ant-upload.ant-upload-select-picture-card { |
||||
|
height: 90px; |
||||
|
width: 90px; |
||||
|
} |
||||
|
</style> |
@ -0,0 +1,120 @@ |
|||||
|
<!-- |
||||
|
* @Author: aBin |
||||
|
* @email: binbin0314@126.com |
||||
|
* @Date: 2021-06-01 16:09:48 |
||||
|
* @LastEditors: aBin |
||||
|
* @LastEditTime: 2021-06-11 14:14:33 |
||||
|
--> |
||||
|
<template> |
||||
|
<div class="d-flex flex-wrap flex-column"> |
||||
|
<a-card class="fill-width"> |
||||
|
<a-list item-layout="horizontal"> |
||||
|
<a-list-item class="d-flex flex-nowrap"> |
||||
|
<div>患者体重(kg):</div> |
||||
|
<span v-if="weight !== -1">{{ weight }}</span> |
||||
|
<span v-else class="color-c">暂无数据</span> |
||||
|
</a-list-item> |
||||
|
<a-list-item class="d-flex flex-nowrap"> |
||||
|
<div>溶栓剂量(mg) :</div> |
||||
|
<span v-if="medicine !== -1">{{ medicine }}</span> |
||||
|
<span v-else class="color-c">暂无数据</span> |
||||
|
</a-list-item> |
||||
|
<a-list-item class="d-flex flex-nowrap"> |
||||
|
<div>团注剂量(mg) :</div> |
||||
|
<span v-if="dose !== -1">{{ dose }}</span> |
||||
|
<span v-else class="color-c">暂无数据</span> |
||||
|
</a-list-item> |
||||
|
<a-list-item class="d-flex flex-nowrap"> |
||||
|
<div>维持剂量(mg) :</div> |
||||
|
<span v-if="maintain !== -1">{{ maintain }}</span> |
||||
|
<span v-else class="color-c">暂无数据</span> |
||||
|
</a-list-item> |
||||
|
</a-list> |
||||
|
<div class="d-flex mt-4"> |
||||
|
<div class="flex-1"> |
||||
|
<a-date-picker |
||||
|
:value="$moment(time)" |
||||
|
:show-time="{ format: 'HH:mm' }" |
||||
|
format="YYYY-MM-DD HH:mm" |
||||
|
placeholder="选择时间" |
||||
|
style="width: 100%" |
||||
|
@change="onChange" |
||||
|
@ok="onChange" |
||||
|
/> |
||||
|
</div> |
||||
|
<!-- <a-button v-if="isShow" style="width: 100px" type="primary" block @click="start"> 开始 </a-button> --> |
||||
|
</div> |
||||
|
</a-card> |
||||
|
<Content :time="time" /> |
||||
|
</div> |
||||
|
</template> |
||||
|
|
||||
|
<script> |
||||
|
import { mapState, mapActions, mapMutations } from 'vuex'; |
||||
|
import { getWeight } from 'config/api'; |
||||
|
import Content from 'components/Content/Content.vue'; |
||||
|
export default { |
||||
|
name: 'GroupNotes', |
||||
|
components: { Content }, |
||||
|
data() { |
||||
|
return { |
||||
|
weight: -1, // 体重 |
||||
|
medicine: -1, // 溶栓剂量 |
||||
|
dose: -1, // 团注剂量 |
||||
|
maintain: -1, // 维持剂量 |
||||
|
time: Date.parse(new Date()), |
||||
|
isShow: false, |
||||
|
}; |
||||
|
}, |
||||
|
computed: mapState('home', ['ptProps']), |
||||
|
async created() { |
||||
|
const start = await this.getStart(); |
||||
|
if (start) { |
||||
|
this.time = +start; |
||||
|
} |
||||
|
this.getData(); |
||||
|
this.setTitle('团注'); |
||||
|
}, |
||||
|
methods: { |
||||
|
...mapActions('home', ['getStart']), |
||||
|
...mapMutations('home', ['setTitle']), |
||||
|
|
||||
|
async getData() { |
||||
|
try { |
||||
|
const parmas = { param: { projectId: this.ptProps.projectId } }; |
||||
|
const res = await getWeight(parmas); |
||||
|
const { code, msg, data } = res.data; |
||||
|
if (code === 200) { |
||||
|
console.log(data); |
||||
|
if (data && data.length) { |
||||
|
for (let i = 0; i < data.length; i++) { |
||||
|
if (data[i].type === 1) { |
||||
|
this.weight = data[i].value; |
||||
|
} else if (data[i].type === 8) { |
||||
|
this.medicine = data[i].value; |
||||
|
} else if (data[i].type === 9) { |
||||
|
this.dose = data[i].value; |
||||
|
} else if (data[i].type === 10) { |
||||
|
this.maintain = data[i].value; |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
} else { |
||||
|
console.log(msg); |
||||
|
} |
||||
|
} catch (error) {} |
||||
|
}, |
||||
|
onChange(e) { |
||||
|
let str = this.$moment(e._d).format('YYYY-MM-DD HH:mm'); |
||||
|
str += ':00'; |
||||
|
this.time = new Date(str).valueOf(); |
||||
|
}, |
||||
|
}, |
||||
|
}; |
||||
|
</script> |
||||
|
|
||||
|
<style lang="stylus" scoped> |
||||
|
.color-c { |
||||
|
color: #ccc; |
||||
|
} |
||||
|
</style> |
@ -0,0 +1,82 @@ |
|||||
|
<!-- |
||||
|
* @Author: wally |
||||
|
* @email: 18603454788@163.com |
||||
|
* @Date: 2021-02-22 09:20:03 |
||||
|
* @LastEditors: aBin |
||||
|
* @LastEditTime: 2021-06-11 14:12:54 |
||||
|
--> |
||||
|
<template> |
||||
|
<div class="d-flex flex-wrap flex-column"> |
||||
|
<a-card style="padding: 0 12px"> |
||||
|
<div class="align-center d-flex flex-row flex-nowrap justify-space-between"> |
||||
|
<div class="title-box">患者:{{ carInfo.name }}</div> |
||||
|
<div class="title-box" v-if="carInfo && carInfo.startTime">{{ $moment(+carInfo.startTime).format('MM-DD HH:mm') }}</div> |
||||
|
<div class="car-box">卒中专用平车{{ carInfo.carNumber }}</div> |
||||
|
</div> |
||||
|
</a-card> |
||||
|
<a-card class="mt-1"> |
||||
|
<process :list="list" class="my-4" /> |
||||
|
</a-card> |
||||
|
<a-card class="mt-1"> |
||||
|
<data-table :list="list" /> |
||||
|
</a-card> |
||||
|
<a-card class="mt-1"> |
||||
|
<analysis /> |
||||
|
</a-card> |
||||
|
</div> |
||||
|
</template> |
||||
|
|
||||
|
<script> |
||||
|
import { findStepIsOver } from 'config/api'; |
||||
|
import Analysis from './components/Analysis.vue'; |
||||
|
import DataTable from './components/DataTable.vue'; |
||||
|
import Process from './components/Process.vue'; |
||||
|
export default { |
||||
|
name: 'Index', |
||||
|
components: { Analysis, Process, DataTable }, |
||||
|
data() { |
||||
|
return { |
||||
|
list: [], |
||||
|
carInfo: null, |
||||
|
}; |
||||
|
}, |
||||
|
async created() { |
||||
|
this.carInfo = this.$route.query.carInfo[0]; |
||||
|
await this.getList(); |
||||
|
}, |
||||
|
methods: { |
||||
|
async getList() { |
||||
|
try { |
||||
|
const { projectId } = this.ptProps; |
||||
|
const params = { param: { projectId: projectId } }; |
||||
|
const res = await findStepIsOver(params); |
||||
|
const { code, data } = res.data; |
||||
|
if (code === 200) { |
||||
|
this.list = data; |
||||
|
} |
||||
|
} catch (error) {} |
||||
|
}, |
||||
|
}, |
||||
|
}; |
||||
|
</script> |
||||
|
|
||||
|
<style lang="stylus" scoped> |
||||
|
/deep/ .ant-card-body { |
||||
|
padding: 12px 2px; |
||||
|
} |
||||
|
|
||||
|
.car-box { |
||||
|
background-color: #49cc90; |
||||
|
color: #fff; |
||||
|
padding: 0 8px; |
||||
|
font-weight: 500; |
||||
|
height: 32px; |
||||
|
line-height: 32px; |
||||
|
border-radius: 10px; |
||||
|
} |
||||
|
|
||||
|
.title-box { |
||||
|
font-weight: 700; |
||||
|
color: rgba(0, 0, 0, 0.75); |
||||
|
} |
||||
|
</style> |
@ -0,0 +1,138 @@ |
|||||
|
<!-- |
||||
|
* @Author: aBin |
||||
|
* @email: binbin0314@126.com |
||||
|
* @Date: 2021-06-02 18:23:18 |
||||
|
* @LastEditors: aBin |
||||
|
* @LastEditTime: 2021-06-04 09:50:02 |
||||
|
--> |
||||
|
<template> |
||||
|
<div :style="{ width: 'width' }"> |
||||
|
<div id="Analysis" style="width: 100%; height: 300px"></div> |
||||
|
</div> |
||||
|
</template> |
||||
|
|
||||
|
<script> |
||||
|
import { getPointTime } from 'config/api'; |
||||
|
export default { |
||||
|
name: 'Analysis', |
||||
|
data() { |
||||
|
return { |
||||
|
width: '', |
||||
|
height: '', |
||||
|
list: { |
||||
|
pointTimeCurrentList: [], |
||||
|
pointTimeHospital: [], |
||||
|
pointTimeInternation: [], |
||||
|
}, |
||||
|
}; |
||||
|
}, |
||||
|
computed: { |
||||
|
option() { |
||||
|
return { |
||||
|
tooltip: { trigger: 'axis' }, |
||||
|
legend: { |
||||
|
x: 'center', |
||||
|
y: 'bottom', |
||||
|
data: ['我院标准', '国际标准', '当前数据'], |
||||
|
textStyle: { |
||||
|
fontWeight: 'normal', |
||||
|
color: '#666', //标题颜色 |
||||
|
}, |
||||
|
}, |
||||
|
grid: { |
||||
|
left: '3%', |
||||
|
// right: '4%', |
||||
|
top: '10%', |
||||
|
bottom: '10%', |
||||
|
containLabel: true, |
||||
|
}, |
||||
|
xAxis: { |
||||
|
type: 'category', |
||||
|
boundaryGap: false, |
||||
|
data: ['呼叫', '分诊', '一线', '采血', '心电', 'CT', '二线', '谈话', '签字', '团注', '介入', '置鞘', '病房'], |
||||
|
axisLabel: { |
||||
|
textStyle: { |
||||
|
fontWeight: 'normal', |
||||
|
color: '#666', //标题颜色 |
||||
|
}, |
||||
|
formatter: function(value) { |
||||
|
return value.split('').join('\n'); |
||||
|
}, |
||||
|
}, |
||||
|
}, |
||||
|
yAxis: { |
||||
|
type: 'value', |
||||
|
name: '秒', |
||||
|
axisLabel: { |
||||
|
textStyle: { |
||||
|
fontWeight: 'normal', |
||||
|
color: '#666', //标题颜色 |
||||
|
}, |
||||
|
}, |
||||
|
nameTextStyle: { color: '#666' }, |
||||
|
splitLine: { |
||||
|
show: true, |
||||
|
lineStyle: { |
||||
|
type: 'dashed', |
||||
|
color: '#666', |
||||
|
}, |
||||
|
}, |
||||
|
}, |
||||
|
series: [ |
||||
|
{ |
||||
|
name: '我院标准', |
||||
|
type: 'line', |
||||
|
connectNulls: true, |
||||
|
symbolSize: 6, |
||||
|
data: this.list.pointTimeHospital, |
||||
|
color: 'rgb(18, 131, 227)', |
||||
|
}, |
||||
|
{ |
||||
|
name: '国际标准', |
||||
|
type: 'line', |
||||
|
connectNulls: true, |
||||
|
symbolSize: 6, |
||||
|
data: this.list.pointTimeInternation, |
||||
|
color: 'rgb(30, 231, 231)', |
||||
|
}, |
||||
|
{ |
||||
|
name: '当前数据', |
||||
|
type: 'line', |
||||
|
connectNulls: true, |
||||
|
symbolSize: 6, |
||||
|
data: this.list.pointTimeCurrentList, |
||||
|
color: 'rgb(227, 18, 187)', |
||||
|
}, |
||||
|
], |
||||
|
}; |
||||
|
}, |
||||
|
}, |
||||
|
mounted() { |
||||
|
let wh = window.innerWidth; |
||||
|
let hg = window.innerHeight; |
||||
|
this.width = wh + 'px'; |
||||
|
this.height = hg + 'px'; |
||||
|
console.log(this.height); |
||||
|
this.drawLine(); |
||||
|
}, |
||||
|
methods: { |
||||
|
async drawLine() { |
||||
|
// 基于准备好的dom,初始化echarts实例 |
||||
|
await this.getData(); |
||||
|
var myChart = this.$echarts.init(document.getElementById('Analysis')); |
||||
|
// 绘制图表 |
||||
|
myChart.setOption(this.option); |
||||
|
}, |
||||
|
async getData() { |
||||
|
try { |
||||
|
const params = { param: { id: 0 } }; |
||||
|
const res = await getPointTime(params); |
||||
|
const { code, data } = res.data; |
||||
|
if (code === 200) { |
||||
|
this.list = { ...data }; |
||||
|
} |
||||
|
} catch (error) {} |
||||
|
}, |
||||
|
}, |
||||
|
}; |
||||
|
</script> |
@ -0,0 +1,101 @@ |
|||||
|
<!-- |
||||
|
* @Author: aBin |
||||
|
* @email: binbin0314@126.com |
||||
|
* @Date: 2021-06-02 18:22:38 |
||||
|
* @LastEditors: aBin |
||||
|
* @LastEditTime: 2021-06-03 19:26:50 |
||||
|
--> |
||||
|
<template> |
||||
|
<div> |
||||
|
<div style="width: 100%" v-if="list.length > 0"> |
||||
|
<a-table :columns="columns" :pagination="false" :data-source="list" :row-key="record => record.id" bordered class="white pa-3"> |
||||
|
<template slot="id" slot-scope="text, record, index"> |
||||
|
<span>{{ index + 1 }}</span> |
||||
|
</template> |
||||
|
<template slot="startTime" slot-scope="text, record"> |
||||
|
<span v-if="record.startTime">{{ $moment(+record.startTime).format('MM-DD HH:mm') }}</span> |
||||
|
</template> |
||||
|
<template slot="type" slot-scope="text, record"> |
||||
|
<span v-if="record.type === 0">平车</span> |
||||
|
<span v-else-if="record.type === 1">{{ record.memberName }}</span> |
||||
|
</template> |
||||
|
</a-table> |
||||
|
</div> |
||||
|
<a-empty v-else /> |
||||
|
<div v-if="list.length > 0" class="fill-width"> |
||||
|
<a-button class="btn my-4"> 数据导出 </a-button> |
||||
|
</div> |
||||
|
</div> |
||||
|
</template> |
||||
|
|
||||
|
<script> |
||||
|
const columns = [ |
||||
|
{ |
||||
|
title: '序号', |
||||
|
align: 'center', |
||||
|
dataIndex: 'id', |
||||
|
key: 'id', |
||||
|
scopedSlots: { customRender: 'id' }, |
||||
|
}, |
||||
|
{ |
||||
|
title: '流程', |
||||
|
align: 'center', |
||||
|
dataIndex: 'stepName', |
||||
|
key: 'stepName', |
||||
|
}, |
||||
|
{ |
||||
|
title: '开始时间', |
||||
|
align: 'center', |
||||
|
dataIndex: 'startTime', |
||||
|
key: 'startTime', |
||||
|
scopedSlots: { customRender: 'startTime' }, |
||||
|
}, |
||||
|
// { |
||||
|
// title: '质控', |
||||
|
// align: 'center', |
||||
|
// dataIndex: 'control', |
||||
|
// key: 'control', |
||||
|
// scopedSlots: { customRender: 'control' }, |
||||
|
// }, |
||||
|
{ |
||||
|
title: '操作者', |
||||
|
align: 'center', |
||||
|
dataIndex: 'type', |
||||
|
key: 'type', |
||||
|
scopedSlots: { customRender: 'type' }, |
||||
|
}, |
||||
|
]; |
||||
|
export default { |
||||
|
name: 'Table', |
||||
|
props: { |
||||
|
list: { |
||||
|
type: Array, |
||||
|
default: () => [], |
||||
|
}, |
||||
|
}, |
||||
|
data() { |
||||
|
return { columns }; |
||||
|
}, |
||||
|
}; |
||||
|
</script> |
||||
|
|
||||
|
<style lang="stylus" scoped> |
||||
|
.btn { |
||||
|
background-color: rgba(0, 128, 0, 0.75); |
||||
|
color: #fff; |
||||
|
float: right; |
||||
|
} |
||||
|
|
||||
|
/deep/ .ant-table-thead > tr > th { |
||||
|
padding: 16px 4px; |
||||
|
} |
||||
|
|
||||
|
/deep/ .ant-table-thead > tr > th { |
||||
|
font-weight: 700; |
||||
|
} |
||||
|
|
||||
|
/deep/ .ant-table { |
||||
|
font-weight: 500; |
||||
|
color: rgba(0, 0, 0, 0.85); |
||||
|
} |
||||
|
</style> |
@ -0,0 +1,110 @@ |
|||||
|
<!-- |
||||
|
* @Author: aBin |
||||
|
* @email: binbin0314@126.com |
||||
|
* @Date: 2021-06-02 18:21:47 |
||||
|
* @LastEditors: aBin |
||||
|
* @LastEditTime: 2021-06-11 15:14:39 |
||||
|
--> |
||||
|
<template> |
||||
|
<div style="margin: 0 10px"> |
||||
|
<div class="fill-width d-flex flex-row flex-nowrap"> |
||||
|
<div v-for="(item, index) in list" :key="item.stepId" class="flex-1 justify-center"> |
||||
|
<div v-if="(index + 1) % 2 === 0" class="d-flex flex-column"> |
||||
|
<div style="text-align: center; font-weight: 600">{{ item.stepName }}</div> |
||||
|
<div class="circle" :class="{ 'bd-green': item.startTime }"> |
||||
|
{{ index + 1 }} |
||||
|
</div> |
||||
|
<div class="line" :class="{ 'br-green': item.startTime }"></div> |
||||
|
<div class="circle-small" :class="{ 'bg-green': item.startTime }"></div> |
||||
|
</div> |
||||
|
</div> |
||||
|
</div> |
||||
|
<div style="margin: 0 15px"> |
||||
|
<a-progress :percent="100" :show-info="false" stroke-color="#ccc" :stroke-width="2" /> |
||||
|
</div> |
||||
|
<div class="fill-width d-flex flex-row flex-nowrap"> |
||||
|
<div v-for="(item, index) in list" :key="item.id" class="flex-1 justify-center"> |
||||
|
<div v-if="(index + 1) % 2 === 1" class="d-flex flex-column"> |
||||
|
<div class="circle-small-bottom" :class="{ 'bg-green': item.startTime }"></div> |
||||
|
<div class="line" :class="{ 'br-green': item.startTime }"></div> |
||||
|
<div class="circle" :class="{ 'bd-green': item.startTime }"> |
||||
|
{{ index + 1 }} |
||||
|
</div> |
||||
|
<div style="text-align: center; font-weight: 600">{{ item.stepName }}</div> |
||||
|
</div> |
||||
|
</div> |
||||
|
</div> |
||||
|
</div> |
||||
|
</template> |
||||
|
|
||||
|
<script> |
||||
|
export default { |
||||
|
name: 'Process', |
||||
|
props: { |
||||
|
list: { |
||||
|
type: Array, |
||||
|
default: () => [], |
||||
|
}, |
||||
|
}, |
||||
|
data() { |
||||
|
return {}; |
||||
|
}, |
||||
|
}; |
||||
|
</script> |
||||
|
|
||||
|
<style lang="stylus" scoped> |
||||
|
.circle { |
||||
|
height: 30px; |
||||
|
width: 30px; |
||||
|
font-weight: 700; |
||||
|
text-align: center; |
||||
|
line-height: 30px; |
||||
|
border-radius: 50%; |
||||
|
border: 1px solid #666; |
||||
|
} |
||||
|
|
||||
|
.line { |
||||
|
border-right: 2px solid #999; |
||||
|
height: 30px; |
||||
|
width: 50%; |
||||
|
} |
||||
|
|
||||
|
.br-green { |
||||
|
border-right: 2px solid green; |
||||
|
} |
||||
|
|
||||
|
.circle-small { |
||||
|
width: 10px; |
||||
|
height: 10px; |
||||
|
border-radius: 50%; |
||||
|
border: 2px solid #ccc; |
||||
|
margin-bottom: -18px; |
||||
|
z-index: 1; |
||||
|
margin-left: 32%; |
||||
|
background-color: #fff; |
||||
|
} |
||||
|
|
||||
|
.bg-green { |
||||
|
border: 2px solid green !important; |
||||
|
} |
||||
|
|
||||
|
.bd-green { |
||||
|
border: 2px solid green !important; |
||||
|
color: green !important; |
||||
|
} |
||||
|
|
||||
|
.br-red { |
||||
|
border: 2px solid red !important; |
||||
|
} |
||||
|
|
||||
|
.circle-small-bottom { |
||||
|
width: 10px; |
||||
|
height: 10px; |
||||
|
border-radius: 50%; |
||||
|
border: 2px solid #ccc; |
||||
|
margin-top: -13px; |
||||
|
z-index: 1; |
||||
|
margin-left: 32%; |
||||
|
background-color: #fff; |
||||
|
} |
||||
|
</style> |
@ -0,0 +1,26 @@ |
|||||
|
<template> |
||||
|
<div class="d-flex flex-column fill-width"> |
||||
|
<img class="fill-width" src="https://www.tall.wiki/staticrec/photos/info01.jpg" /> |
||||
|
<img class="fill-width" src="https://www.tall.wiki/staticrec/photos/info02.jpg" /> |
||||
|
<img class="fill-width" src="https://www.tall.wiki/staticrec/photos/info03.jpg" /> |
||||
|
</div> |
||||
|
</template> |
||||
|
|
||||
|
<script> |
||||
|
import { mapMutations } from 'vuex'; |
||||
|
|
||||
|
export default { |
||||
|
name: 'InfoReport', |
||||
|
data() { |
||||
|
return {}; |
||||
|
}, |
||||
|
|
||||
|
created() { |
||||
|
this.setTitle('信息直报'); |
||||
|
}, |
||||
|
|
||||
|
methods: mapMutations('home', ['setTitle']), |
||||
|
}; |
||||
|
</script> |
||||
|
|
||||
|
<style lang="stylus" scoped></style> |
@ -0,0 +1,102 @@ |
|||||
|
<template> |
||||
|
<div class="d-flex flex-column" style="padding: 0 16px"> |
||||
|
<div class="d-flex" v-for="(timeAxio, timeIndex) in timeAxios" :key="timeIndex"> |
||||
|
<div> |
||||
|
<div class="circle"></div> |
||||
|
<div class="faaxis" v-if="timeIndex !== timeAxios.length - 1"> |
||||
|
<div class="axis"></div> |
||||
|
</div> |
||||
|
</div> |
||||
|
<div class="flex-1 d-flex flex-column"> |
||||
|
<div> |
||||
|
<div class="time" style="">{{ $moment(+timeAxio.time).format('MM-DD HH:mm') }}</div> |
||||
|
<div class="present">{{ timeAxio.name ? timeAxio.name : user.wxInfo.nickname + '记录' }}</div> |
||||
|
</div> |
||||
|
</div> |
||||
|
</div> |
||||
|
</div> |
||||
|
</template> |
||||
|
<script> |
||||
|
import { queryArriveWorker } from 'config/api'; |
||||
|
import { mapMutations } from 'vuex'; |
||||
|
import { mapState } from 'vuex'; |
||||
|
export default { |
||||
|
data() { |
||||
|
return { |
||||
|
index: 0, |
||||
|
timeAxios: [], |
||||
|
}; |
||||
|
}, |
||||
|
computed: mapState('home', ['ptProps', 'user', 'addNum']), |
||||
|
watch: { |
||||
|
addNum(val) { |
||||
|
this.getMembers(); |
||||
|
}, |
||||
|
}, |
||||
|
created() { |
||||
|
this.setTitle('到场信息'); |
||||
|
const item = [{ icon: 'plus-circle', type: 4 }]; |
||||
|
this.setTitleIcon(item); |
||||
|
this.getMembers(); |
||||
|
}, |
||||
|
methods: { |
||||
|
...mapMutations('home', ['setTitle', 'setTitleIcon']), |
||||
|
|
||||
|
//查询人员 |
||||
|
async getMembers() { |
||||
|
try { |
||||
|
const params = { param: { projectId: this.ptProps.projectId } }; |
||||
|
const res = await queryArriveWorker(params); |
||||
|
const { code, msg, data } = res.data; |
||||
|
if (code === 200) { |
||||
|
this.timeAxios = data.reverse(); |
||||
|
} else { |
||||
|
console.log(msg); |
||||
|
} |
||||
|
} catch (error) { |
||||
|
console.log(error); |
||||
|
} |
||||
|
}, |
||||
|
}, |
||||
|
}; |
||||
|
</script> |
||||
|
<style scoped lang="stylus"> |
||||
|
.circle { |
||||
|
height: 20px; |
||||
|
width: 20px; |
||||
|
background: #68D33A; |
||||
|
border: 2px solid #68D33A; |
||||
|
border-radius: 50%; |
||||
|
margin: 10px; |
||||
|
} |
||||
|
|
||||
|
.faaxis { |
||||
|
height: 60px; |
||||
|
width: 20px; |
||||
|
display: flex; |
||||
|
justify-content: center; |
||||
|
margin: 0 10px; |
||||
|
} |
||||
|
|
||||
|
.axis { |
||||
|
height: 60px; |
||||
|
width: 2px; |
||||
|
background: #68D33A; |
||||
|
} |
||||
|
|
||||
|
.time { |
||||
|
height: 20px; |
||||
|
margin: 10px auto; |
||||
|
} |
||||
|
|
||||
|
.present { |
||||
|
height: 60px; |
||||
|
width: 100%; |
||||
|
background: #FFFFFF; |
||||
|
border-radius: 5px; |
||||
|
padding: 10px; |
||||
|
display: flex; |
||||
|
align-items: center; |
||||
|
font-weight: bold; |
||||
|
} |
||||
|
</style> |
@ -0,0 +1,345 @@ |
|||||
|
<template> |
||||
|
<div class="d-flex flex-column pb-10"> |
||||
|
<div class="tow mb-3" v-for="(index, indexa) in data" :key="indexa"> |
||||
|
<a-list item-layout="horizontal" class="white" :data-source="index"> |
||||
|
<a-list-item class="mx-3" slot="renderItem" slot-scope="item, itemIndex"> |
||||
|
<div class="d-flex flex-nowrap align-center" style="width: 100%"> |
||||
|
<div class="mr-3">{{ item.title }}</div> |
||||
|
<div class="flex-1 flex-row-reverse"> |
||||
|
<div @click="openTimeSelect(item.title, indexa, itemIndex)" v-if="item.type === 'inspect'"> |
||||
|
<span class="mr-3" v-if="item.value || item.codeA">{{ |
||||
|
item.value || $moment(+item.codeA).format('YYYY-MM-DD HH:mm') |
||||
|
}}</span> |
||||
|
<span class="mr-3 gray-text" v-else>请选择时间</span> |
||||
|
<a-icon type="calendar" /> |
||||
|
</div> |
||||
|
<!-- <a-upload |
||||
|
v-else-if="item.type === 'photo'" |
||||
|
name="file" |
||||
|
:multiple="true" |
||||
|
action="https://www.mocky.io/v2/5cc8019d300000980a055e76" |
||||
|
:headers="headers" |
||||
|
@change="handleChange($event, item.name)" |
||||
|
> |
||||
|
<a-button class="uploads"> <a-icon type="camera" /> </a-button> |
||||
|
</a-upload> --> |
||||
|
<div v-else-if="item.type === 'CTreportPhoto'"> |
||||
|
<div> |
||||
|
<a-upload |
||||
|
name="files" |
||||
|
style="width: 60%" |
||||
|
:headers="headers" |
||||
|
:multiple="false" |
||||
|
:action="action" |
||||
|
@change="handleChange($event, item.name)" |
||||
|
:show-upload-list="false" |
||||
|
list-type="picture-card" |
||||
|
> |
||||
|
<div v-if="fileList.length < 1"> |
||||
|
<a-icon type="plus" /> |
||||
|
<div class="ant-upload-text">上传图片</div> |
||||
|
</div> |
||||
|
</a-upload> |
||||
|
</div> |
||||
|
<a-list-item v-for="fileItem in fileList" :key="fileItem.id"> |
||||
|
<div class="d-flex justify-space-between fill-width align-center"> |
||||
|
<img @click="lookImg(fileItem.url)" :src="fileItem.url" class="mr-3" style="width: 80px; height: 80px" /> |
||||
|
<a-popconfirm placement="left" ok-text="确定" cancel-text="再想想" @confirm="confirm(fileItem.code)"> |
||||
|
<template slot="title"> 确定删除此图片吗? </template> |
||||
|
<a-icon type="delete" class="text-red" /> |
||||
|
</a-popconfirm> |
||||
|
</div> |
||||
|
</a-list-item> |
||||
|
</div> |
||||
|
<div v-else-if="item.type === 'NMRreportPhoto'"> |
||||
|
<div> |
||||
|
<a-upload |
||||
|
name="files" |
||||
|
style="width: 60%" |
||||
|
:headers="headers" |
||||
|
:multiple="false" |
||||
|
:action="action" |
||||
|
@change="handleChangeHc($event, item.name)" |
||||
|
:show-upload-list="false" |
||||
|
list-type="picture-card" |
||||
|
> |
||||
|
<div v-if="fileListHc.length < 1"> |
||||
|
<a-icon type="plus" /> |
||||
|
<div class="ant-upload-text">上传图片</div> |
||||
|
</div> |
||||
|
</a-upload> |
||||
|
</div> |
||||
|
<a-list-item v-for="fileItem in fileListHc" :key="fileItem.id"> |
||||
|
<div class="d-flex justify-space-between fill-width align-center"> |
||||
|
<img @click="lookImg(fileItem.url)" :src="fileItem.url" class="mr-3" style="width: 80px; height: 80px" /> |
||||
|
<a-popconfirm placement="left" ok-text="确定" cancel-text="再想想" @confirm="confirmHc(fileItem.code)"> |
||||
|
<template slot="title"> 确定删除此图片吗? </template> |
||||
|
<a-icon type="delete" class="text-red" /> |
||||
|
</a-popconfirm> |
||||
|
</div> |
||||
|
</a-list-item> |
||||
|
</div> |
||||
|
</div> |
||||
|
</div> |
||||
|
</a-list-item> |
||||
|
</a-list> |
||||
|
</div> |
||||
|
<time-select |
||||
|
:first-index="firstIndex" |
||||
|
:second-index="secondIndex" |
||||
|
@chooseTime="chooseTime" |
||||
|
v-if="show" |
||||
|
:title="title" |
||||
|
:show="show" |
||||
|
@closeTimeSelect="closeTimeSelect" |
||||
|
/> |
||||
|
</div> |
||||
|
</template> |
||||
|
|
||||
|
<script> |
||||
|
import { mapState, mapMutations } from 'vuex'; |
||||
|
import { data } from './config'; |
||||
|
import { upload, queryAidRecord, aidRecord } from 'config/api'; |
||||
|
import TimeSelect from 'components/TimeSelect/TimeSelect.vue'; |
||||
|
|
||||
|
export default { |
||||
|
components: { TimeSelect }, |
||||
|
data() { |
||||
|
return { |
||||
|
data, |
||||
|
current: 0, |
||||
|
radioStyle: { |
||||
|
display: 'block', |
||||
|
height: '30px', |
||||
|
lineHeight: '30px', |
||||
|
}, |
||||
|
record: {}, |
||||
|
headers: { authorization: 'authorization-text' }, |
||||
|
options: { |
||||
|
answer: '', |
||||
|
questionCode: '', |
||||
|
}, |
||||
|
show: false, |
||||
|
title: '', |
||||
|
firstIndex: 0, |
||||
|
secondIndex: 0, |
||||
|
action: upload, |
||||
|
fileList: [], |
||||
|
fileListHc: [], |
||||
|
}; |
||||
|
}, |
||||
|
|
||||
|
computed: mapState('home', ['ptProps']), |
||||
|
|
||||
|
created() { |
||||
|
this.setTitle('医技结论'); |
||||
|
this.setTitleIcon('', ''); |
||||
|
this.getQuery(); |
||||
|
}, |
||||
|
|
||||
|
methods: { |
||||
|
...mapMutations('home', ['setTitle', 'setTitleIcon']), |
||||
|
|
||||
|
// 打开时间选择框 |
||||
|
openTimeSelect(title, firstIndex, secondIndex) { |
||||
|
this.show = true; |
||||
|
this.title = title; |
||||
|
this.firstIndex = firstIndex; |
||||
|
this.secondIndex = secondIndex; |
||||
|
}, |
||||
|
|
||||
|
// 关闭时间选择框 |
||||
|
closeTimeSelect() { |
||||
|
this.show = false; |
||||
|
}, |
||||
|
|
||||
|
// 时间选择 |
||||
|
chooseTime(time, firstIndex, secondIndex) { |
||||
|
// 赋值 |
||||
|
this.data[firstIndex][secondIndex].value = this.$moment(time).format('YYYY-MM-DD HH:mm'); |
||||
|
// 调接口 |
||||
|
this.options = {}; |
||||
|
this.options.answer = [time]; |
||||
|
this.options.questionCode = this.data[firstIndex][secondIndex].name; |
||||
|
this.submit(this.options); |
||||
|
this.closeTimeSelect(); |
||||
|
}, |
||||
|
|
||||
|
// 上传文件 |
||||
|
lookImg(url) { |
||||
|
window.open(url); |
||||
|
}, |
||||
|
confirm(code) { |
||||
|
this.fileList = []; |
||||
|
this.options = { answer: [], questionCode: code }; |
||||
|
this.submit(this.options); |
||||
|
}, |
||||
|
confirmHc(code) { |
||||
|
this.fileListHc = []; |
||||
|
this.options = { answer: [], questionCode: code }; |
||||
|
this.submit(this.options); |
||||
|
}, |
||||
|
handleChange(info, code) { |
||||
|
const status = info.file.status; |
||||
|
if (status === 'done') { |
||||
|
const file = info.file; |
||||
|
// 调接口 |
||||
|
|
||||
|
const obj = { |
||||
|
uid: file.response.data[0].id, |
||||
|
name: file.response.data[0].name, |
||||
|
status: status, |
||||
|
url: file.response.data[0].visitUrl, |
||||
|
thumbUrl: file.response.data[0].visitUrl, |
||||
|
code, |
||||
|
}; |
||||
|
this.fileList.push(obj); |
||||
|
this.options = {}; |
||||
|
this.options.answer = [file.response.data[0].visitUrl]; |
||||
|
this.options.questionCode = code; |
||||
|
this.submit(this.options); |
||||
|
} |
||||
|
}, |
||||
|
handleChangeHc(info, code) { |
||||
|
const status = info.file.status; |
||||
|
if (status === 'done') { |
||||
|
const file = info.file; |
||||
|
// 调接口 |
||||
|
|
||||
|
const obj = { |
||||
|
uid: file.response.data[0].id, |
||||
|
name: file.response.data[0].name, |
||||
|
status: status, |
||||
|
url: file.response.data[0].visitUrl, |
||||
|
thumbUrl: file.response.data[0].visitUrl, |
||||
|
code, |
||||
|
}; |
||||
|
this.fileListHc.push(obj); |
||||
|
this.options = {}; |
||||
|
this.options.answer = [file.response.data[0].visitUrl]; |
||||
|
this.options.questionCode = code; |
||||
|
this.submit(this.options); |
||||
|
} |
||||
|
}, |
||||
|
|
||||
|
/** |
||||
|
* 批量查询急救信息 |
||||
|
* @param { Array } codeList code列表 |
||||
|
* @param { String } projectId 项目id |
||||
|
*/ |
||||
|
async getQuery() { |
||||
|
try { |
||||
|
console.log('this.ptProps: ', this.ptProps); |
||||
|
const params = { |
||||
|
param: { |
||||
|
codeList: [ |
||||
|
'YJJL-ECGstartTime', |
||||
|
'CT-START', |
||||
|
'YJJL-CTendTime', |
||||
|
'YJJL-CTreportPhoto', |
||||
|
'YJJL-NMRstartTime', |
||||
|
'YJJL-NMRendTime', |
||||
|
'YJJL-NMRreportPhoto', |
||||
|
'YJJL-bloodroutineReportTime', |
||||
|
'YJJL-coagulationReportTime', |
||||
|
'YJJL-biochemicalReportTime', |
||||
|
], |
||||
|
projectId: this.ptProps.projectId, |
||||
|
}, |
||||
|
}; |
||||
|
const res = await queryAidRecord(params); |
||||
|
const { code, data, msg } = res.data; |
||||
|
if (code === 200) { |
||||
|
this.record = data.record; |
||||
|
this.data[0][0].codeA = data.record['YJJL-ECGstartTime'] ? data.record['YJJL-ECGstartTime'][0] : null; |
||||
|
this.data[1][0].codeA = data.record['CT-START'] ? data.record['CT-START'][0] : null; |
||||
|
this.data[1][1].codeA = data.record['YJJL-CTendTime'] ? data.record['YJJL-CTendTime'][0] : null; |
||||
|
this.data[2][0].codeA = data.record['YJJL-NMRstartTime'] ? data.record['YJJL-NMRstartTime'][0] : null; |
||||
|
this.data[2][1].codeA = data.record['YJJL-NMRendTime'] ? data.record['YJJL-NMRendTime'][0] : null; |
||||
|
this.data[3][0].codeA = data.record['YJJL-bloodroutineReportTime'] ? data.record['YJJL-bloodroutineReportTime'][0] : null; |
||||
|
this.data[3][1].codeA = data.record['YJJL-coagulationReportTime'] ? data.record['YJJL-coagulationReportTime'][0] : null; |
||||
|
this.data[3][2].codeA = data.record['YJJL-biochemicalReportTime'] ? data.record['YJJL-biochemicalReportTime'][0] : null; |
||||
|
if (this.record['YJJL-CTreportPhoto'] && this.record['YJJL-CTreportPhoto'].length) { |
||||
|
const obj = { |
||||
|
uid: this.record['YJJL-CTreportPhoto'][0], |
||||
|
name: this.record['YJJL-CTreportPhoto'][0], |
||||
|
status: 'done', |
||||
|
url: this.record['YJJL-CTreportPhoto'][0], |
||||
|
thumbUrl: this.record['YJJL-CTreportPhoto'][0], |
||||
|
code: 'YJJL-CTreportPhoto', |
||||
|
}; |
||||
|
this.fileList.push(obj); |
||||
|
} |
||||
|
if (this.record['YJJL-NMRreportPhoto'] && this.record['YJJL-NMRreportPhoto'].length) { |
||||
|
const obj = { |
||||
|
uid: this.record['YJJL-NMRreportPhoto'][0], |
||||
|
name: this.record['YJJL-NMRreportPhoto'][0], |
||||
|
status: 'done', |
||||
|
url: this.record['YJJL-NMRreportPhoto'][0], |
||||
|
thumbUrl: this.record['YJJL-NMRreportPhoto'][0], |
||||
|
code: 'YJJL-NMRreportPhoto', |
||||
|
}; |
||||
|
this.fileListHc.push(obj); |
||||
|
} |
||||
|
} else { |
||||
|
this.$message.error(msg || '查询失败'); |
||||
|
} |
||||
|
} catch (error) { |
||||
|
console.log('error: ', error); |
||||
|
} |
||||
|
}, |
||||
|
|
||||
|
/** |
||||
|
* 提交信息 |
||||
|
* @param { Array } codeAndAnswerList code和答案 |
||||
|
* @param { String } projectId 项目id |
||||
|
* @param { Number } userType 提交人类型(0平车 1人) |
||||
|
*/ |
||||
|
async submit(options) { |
||||
|
try { |
||||
|
const params = { |
||||
|
param: { |
||||
|
codeAndAnswerList: [options], |
||||
|
projectId: this.ptProps.projectId, |
||||
|
userType: 0, |
||||
|
}, |
||||
|
}; |
||||
|
const res = await aidRecord(params); |
||||
|
const { code, data, msg } = res.data; |
||||
|
if (code === 200) { |
||||
|
console.log('data: ', data); |
||||
|
} else { |
||||
|
this.$message.error(msg || '提交失败'); |
||||
|
} |
||||
|
} catch (error) { |
||||
|
console.log('error: ', error); |
||||
|
} |
||||
|
}, |
||||
|
}, |
||||
|
}; |
||||
|
</script> |
||||
|
|
||||
|
<style scoped> |
||||
|
.ant-list-item >>> input { |
||||
|
outline: none; |
||||
|
border: none; |
||||
|
text-align: right; |
||||
|
} |
||||
|
|
||||
|
.ant-calendar-picker >>> input { |
||||
|
padding-right: 34px; |
||||
|
} |
||||
|
|
||||
|
.ant-select >>> .ant-select-selection { |
||||
|
border: none; |
||||
|
} |
||||
|
|
||||
|
.ant-select >>> .ant-select-selection__placeholder, |
||||
|
.ant-select-search__field__placeholder { |
||||
|
text-align: right; |
||||
|
} |
||||
|
|
||||
|
.ant-time-picker >>> input { |
||||
|
padding-right: 34px; |
||||
|
} |
||||
|
</style> |
@ -0,0 +1,18 @@ |
|||||
|
export const data = [ |
||||
|
[{ title: '心电开始时间', name: 'YJJL-ECGstartTime', codeA: null, type: 'inspect', value: null }], |
||||
|
[ |
||||
|
{ title: 'CT开始时间', name: 'CT-START', codeA: null, type: 'inspect', value: null }, |
||||
|
{ title: 'CT结束时间', name: 'YJJL-CTendTime', codeA: null, type: 'inspect', value: null }, |
||||
|
{ title: 'CT报告拍照', name: 'YJJL-CTreportPhoto', codeA: null, type: 'CTreportPhoto' }, |
||||
|
], |
||||
|
[ |
||||
|
{ title: '核磁开始时间', name: 'YJJL-NMRstartTime', codeA: null, type: 'inspect', value: null }, |
||||
|
{ title: '核磁结束时间', name: 'YJJL-NMRendTime', codeA: null, type: 'inspect', value: null }, |
||||
|
{ title: '核磁报告拍照', name: 'YJJL-NMRreportPhoto', codeA: null, type: 'NMRreportPhoto' }, |
||||
|
], |
||||
|
[ |
||||
|
{ title: '血常规报告时间', name: 'YJJL-bloodroutineReportTime', codeA: null, type: 'inspect', value: null }, |
||||
|
{ title: '凝血报告时间', name: 'YJJL-coagulationReportTime', codeA: null, type: 'inspect', value: null }, |
||||
|
{ title: '生化报告时间', name: 'YJJL-biochemicalReportTime', codeA: null, type: 'inspect', value: null }, |
||||
|
], |
||||
|
]; |
@ -0,0 +1,134 @@ |
|||||
|
<template> |
||||
|
<div class="d-flex flex-column pt-3"> |
||||
|
<div class="tips d-flex justify-space-between align-center px-2"> |
||||
|
<a-input placeholder="请输入患者" style="width: 160px" @change="patientChange"> |
||||
|
<a-icon slot="prefix" type="search" /> |
||||
|
</a-input> |
||||
|
<div class="ml-3 flex-1 d-flex flex-row-reverse align-center"> |
||||
|
<a-select :default-value="types[type].value" style="width: 120px" @change="handleChange"> |
||||
|
<a-select-option v-for="typeItem in types" :key="typeItem.id" :value="typeItem.id">{{ typeItem.value }}</a-select-option> |
||||
|
</a-select> |
||||
|
<span class="mr-2">类型</span> |
||||
|
</div> |
||||
|
</div> |
||||
|
<List class="list" :spinning="spinning" :lists="lists" :to-end="toEnd" :type="type" @getControlData="getControlData" /> |
||||
|
</div> |
||||
|
</template> |
||||
|
|
||||
|
<script> |
||||
|
import { mapMutations } from 'vuex'; |
||||
|
import { getPatientList } from 'config/api'; |
||||
|
import List from './components/List.vue'; |
||||
|
export default { |
||||
|
name: 'Control', |
||||
|
components: { List }, |
||||
|
data() { |
||||
|
return { |
||||
|
types: [ |
||||
|
{ |
||||
|
id: 0, |
||||
|
value: '急救患者', |
||||
|
}, |
||||
|
{ |
||||
|
id: 1, |
||||
|
value: '平车患者', |
||||
|
}, |
||||
|
{ |
||||
|
id: 2, |
||||
|
value: '转归患者', |
||||
|
}, |
||||
|
], |
||||
|
lists: [], |
||||
|
type: 0, |
||||
|
patientName: '', |
||||
|
toEnd: false, |
||||
|
spinning: false, |
||||
|
}; |
||||
|
}, |
||||
|
|
||||
|
created() { |
||||
|
this.setTitle('急救绿色通道列表'); |
||||
|
this.getControlData(); |
||||
|
const item = [{ icon: 'plus-circle', path: '/addPatient', type: 1 }]; |
||||
|
this.setTitleIcon(item); |
||||
|
}, |
||||
|
|
||||
|
methods: { |
||||
|
...mapMutations('home', ['setTitle', 'setTitleIcon']), |
||||
|
|
||||
|
patientChange(e) { |
||||
|
this.patientName = e.target.value; |
||||
|
this.lists = []; |
||||
|
this.getControlData(); |
||||
|
}, |
||||
|
|
||||
|
handleChange(value) { |
||||
|
this.type = value; |
||||
|
this.lists = []; |
||||
|
this.getControlData(); |
||||
|
}, |
||||
|
|
||||
|
/** |
||||
|
* 患者列表查询 |
||||
|
* @param {number} page 第几页 |
||||
|
* @param {number} pageSize 每页多少条 |
||||
|
* @param {number} patientName 患者名称 不传查询全部 |
||||
|
* @param {number} type 患者类型 0急救患者 1平车患者 2转归患者 |
||||
|
*/ |
||||
|
async getControlData(options) { |
||||
|
try { |
||||
|
this.spinning = true; |
||||
|
const params = { |
||||
|
param: { |
||||
|
pageSize: 10, |
||||
|
patientName: this.patientName, |
||||
|
type: this.type, |
||||
|
}, |
||||
|
}; |
||||
|
params.param.page = options && options.page ? options.page : 1; |
||||
|
const res = await getPatientList(params); |
||||
|
this.spinning = false; |
||||
|
const { code, msg, data } = res.data; |
||||
|
if (code === 200) { |
||||
|
if (data.list && data.list.length) { |
||||
|
this.lists = this.lists.concat(data.list); |
||||
|
} else { |
||||
|
this.toEnd = true; |
||||
|
} |
||||
|
} else { |
||||
|
console.log(msg); |
||||
|
} |
||||
|
} catch (error) { |
||||
|
this.spinning = false; |
||||
|
console.log(error); |
||||
|
} |
||||
|
}, |
||||
|
}, |
||||
|
}; |
||||
|
</script> |
||||
|
|
||||
|
<style lang="scss" scoped> |
||||
|
.tips { |
||||
|
height: 54px; |
||||
|
width: 100%; |
||||
|
color: rgba(0, 0, 0, 0.85); |
||||
|
position: fixed; |
||||
|
top: 48px; |
||||
|
z-index: 99; |
||||
|
background: #f5f5f5; |
||||
|
} |
||||
|
.yuanquan { |
||||
|
height: 16px; |
||||
|
width: 16px; |
||||
|
border-radius: 50%; |
||||
|
} |
||||
|
.bg-red { |
||||
|
background-color: rgba(255, 0, 0, 0.85); |
||||
|
} |
||||
|
.bg-green { |
||||
|
background-color: #7ed321; |
||||
|
} |
||||
|
.list { |
||||
|
margin-top: 40px; |
||||
|
} |
||||
|
</style> |
@ -0,0 +1,140 @@ |
|||||
|
<!-- |
||||
|
* @Author: your name |
||||
|
* @Date: 2021-07-28 14:16:38 |
||||
|
* @LastEditTime: 2021-07-29 14:16:49 |
||||
|
* @LastEditors: Please set LastEditors |
||||
|
* @Description: In User Settings Edit |
||||
|
* @FilePath: \wisdomcar_mobile\src\views\PatientList\components\List.vue |
||||
|
--> |
||||
|
<template> |
||||
|
<div class="mt-2" style="padding-top: 4px"> |
||||
|
<div class="d-flex flex-column white px-3 mb-2 pt-3"> |
||||
|
<div class="font-bold-16 ml-1">{{ type === 0 ? '急救患者' : type === 1 ? '平车患者' : '转归患者' }}</div> |
||||
|
<div class="d-flex flex-column mt-3 mb-2" v-if="lists && lists.length"> |
||||
|
<div v-for="(patient, index) in lists" :key="index"> |
||||
|
<div class="card d-flex flex-column"> |
||||
|
<div class="text-white px-3 py-1" :class="patient.carId ? 'blue' : 'gray'"> |
||||
|
<img class="mr-2 pingche" src="@/assets/pingche.png" /> |
||||
|
<span>{{ patient.carId || '未绑定' }}</span> |
||||
|
</div> |
||||
|
<div class="d-flex flex-column"> |
||||
|
<div class="pa-3 card-main"> |
||||
|
<div class="d-flex flex-nowrap mb-2"> |
||||
|
<!-- 姓名 --> |
||||
|
<span class="font-bold mr-3">{{ patient.name || '无名氏' }}</span> |
||||
|
<!-- 性别 --> |
||||
|
<span class="font-bold mr-3" v-if="patient.gender">{{ patient.gender === 0 ? '男' : '女' }}</span> |
||||
|
<span class="font-bold mr-3" v-else>--</span> |
||||
|
<!-- 年龄 --> |
||||
|
<span class="font-bold mr-3">{{ patient.age || '--' }}岁</span> |
||||
|
<!-- 脑卒中 --> |
||||
|
<a-tag color="blue" class="mr-3"> 脑卒中 </a-tag> |
||||
|
<!-- 待接诊 --> |
||||
|
<a-tag color="orange" v-if="!patient.greenwayTime"> 待接诊 </a-tag> |
||||
|
</div> |
||||
|
<img class="yan" v-if="patient.demonstrate === 1" src="@/assets/yan.png" /> |
||||
|
<!-- 发病时间 --> |
||||
|
<div class="mb-2" v-if="type !== 2"> |
||||
|
<span class="font-bold">发病时间:</span> |
||||
|
<span v-if="patient.morbidityTime">{{ $moment(+patient.morbidityTime).format('YYYY-MM-DD HH:mm:ss') }}</span> |
||||
|
</div> |
||||
|
<div class="mb-2" v-else> |
||||
|
<span class="font-bold">转归时间:</span> |
||||
|
<span v-if="patient.transformationTime">{{ $moment(+patient.transformationTime).format('YYYY-MM-DD HH:mm:ss') }}</span> |
||||
|
</div> |
||||
|
<!-- 启动绿道 --> |
||||
|
<div v-if="type !== 2"> |
||||
|
<span class="font-bold" style="color: #6fc8bf">启动绿道:</span> |
||||
|
<span v-if="patient.greenwayTime">{{ $moment(+patient.greenwayTime).format('YYYY-MM-DD HH:mm:ss') }}</span> |
||||
|
</div> |
||||
|
<div v-else> |
||||
|
<span class="font-bold" style="color: #6fc8bf">转归去向:</span> |
||||
|
<span>{{ patient.transformation || '--' }}</span> |
||||
|
</div> |
||||
|
</div> |
||||
|
<a-divider class="my-0" v-if="patient.doctorList && patient.doctorList.length" /> |
||||
|
<div class="d-flex flex-wrap font-12 pa-3" v-if="patient.doctorList && patient.doctorList.length"> |
||||
|
<div v-for="doctor in patient.doctorList" :key="doctor.id"> |
||||
|
<span class="font-bold ml-2">{{ doctor.post }}:</span>{{ doctor.name }} |
||||
|
</div> |
||||
|
</div> |
||||
|
</div> |
||||
|
</div> |
||||
|
</div> |
||||
|
</div> |
||||
|
</div> |
||||
|
<div class="d-flex justify-center"> |
||||
|
<a-spin :spinning="spinning" /> |
||||
|
</div> |
||||
|
<a-divider v-if="toEnd">无更多数据</a-divider> |
||||
|
</div> |
||||
|
</template> |
||||
|
|
||||
|
<script> |
||||
|
export default { |
||||
|
name: 'TimeLine', |
||||
|
props: { |
||||
|
lists: { |
||||
|
type: Array, |
||||
|
default: () => [], |
||||
|
}, |
||||
|
type: { |
||||
|
type: Number, |
||||
|
default: 0, |
||||
|
}, |
||||
|
toEnd: { |
||||
|
type: Boolean, |
||||
|
default: false, |
||||
|
}, |
||||
|
spinning: { |
||||
|
type: Boolean, |
||||
|
default: false, |
||||
|
}, |
||||
|
}, |
||||
|
|
||||
|
data() { |
||||
|
return { page: 1 }; |
||||
|
}, |
||||
|
|
||||
|
created() { |
||||
|
const that = this; |
||||
|
window.onscroll = function() { |
||||
|
var scrollTop = document.documentElement.scrollTop || document.body.scrollTop; |
||||
|
var windowHeight = document.documentElement.clientHeight || document.body.clientHeight; |
||||
|
var scrollHeight = document.documentElement.scrollHeight || document.body.scrollHeight; |
||||
|
|
||||
|
if (scrollTop + windowHeight == scrollHeight) { |
||||
|
if (that.toEnd) return; |
||||
|
//写后台加载数据的函数 |
||||
|
const nextPage = (that.page += 1); |
||||
|
const options = { page: nextPage }; |
||||
|
that.$emit('getControlData', options); |
||||
|
} |
||||
|
}; |
||||
|
}, |
||||
|
}; |
||||
|
</script> |
||||
|
|
||||
|
<style scoped lang="scss"> |
||||
|
.pingche { |
||||
|
position: relative; |
||||
|
top: -2px; |
||||
|
} |
||||
|
|
||||
|
.card { |
||||
|
margin-bottom: 12px; |
||||
|
border-radius: 8px; |
||||
|
box-shadow: -2px 2px 8px #ccc; |
||||
|
overflow: hidden; |
||||
|
} |
||||
|
|
||||
|
.card-main { |
||||
|
position: relative; |
||||
|
} |
||||
|
|
||||
|
.yan { |
||||
|
position: absolute; |
||||
|
right: 24px; |
||||
|
bottom: 12px; |
||||
|
} |
||||
|
</style> |
@ -0,0 +1,22 @@ |
|||||
|
<!-- |
||||
|
* @Author: aBin |
||||
|
* @email: binbin0314@126.com |
||||
|
* @Date: 2021-06-01 16:16:21 |
||||
|
* @LastEditors: aBin |
||||
|
* @LastEditTime: 2021-06-01 16:16:34 |
||||
|
--> |
||||
|
<template> |
||||
|
<div class="d-flex flex-wrap">值班表</div> |
||||
|
</template> |
||||
|
|
||||
|
<script> |
||||
|
export default { |
||||
|
name: 'BeOnDuty', |
||||
|
data() { |
||||
|
return {}; |
||||
|
}, |
||||
|
method: {}, |
||||
|
}; |
||||
|
</script> |
||||
|
|
||||
|
<style lang="stylus" scoped></style> |
@ -0,0 +1,10 @@ |
|||||
|
<!-- |
||||
|
* @Author: aBin |
||||
|
* @email: binbin0314@126.com |
||||
|
* @Date: 2021-06-02 10:58:01 |
||||
|
* @LastEditors: aBin |
||||
|
* @LastEditTime: 2021-06-02 10:58:27 |
||||
|
--> |
||||
|
<template> |
||||
|
<div>院中心领导质控数据分析报告</div> |
||||
|
</template> |
@ -0,0 +1,22 @@ |
|||||
|
<!-- |
||||
|
* @Author: aBin |
||||
|
* @email: binbin0314@126.com |
||||
|
* @Date: 2021-06-01 16:13:14 |
||||
|
* @LastEditors: aBin |
||||
|
* @LastEditTime: 2021-06-01 16:15:55 |
||||
|
--> |
||||
|
<template> |
||||
|
<div class="d-flex flex-wrap">急救数据详情</div> |
||||
|
</template> |
||||
|
|
||||
|
<script> |
||||
|
export default { |
||||
|
name: 'Details', |
||||
|
data() { |
||||
|
return {}; |
||||
|
}, |
||||
|
method: {}, |
||||
|
}; |
||||
|
</script> |
||||
|
|
||||
|
<style lang="stylus" scoped></style> |
@ -0,0 +1,10 @@ |
|||||
|
<!-- |
||||
|
* @Author: aBin |
||||
|
* @email: binbin0314@126.com |
||||
|
* @Date: 2021-06-02 10:56:44 |
||||
|
* @LastEditors: aBin |
||||
|
* @LastEditTime: 2021-06-02 10:58:37 |
||||
|
--> |
||||
|
<template> |
||||
|
<div>院中心领导急救数据详情</div> |
||||
|
</template> |
@ -0,0 +1,22 @@ |
|||||
|
<!-- |
||||
|
* @Author: aBin |
||||
|
* @email: binbin0314@126.com |
||||
|
* @Date: 2021-06-01 16:17:55 |
||||
|
* @LastEditors: aBin |
||||
|
* @LastEditTime: 2021-06-01 16:18:09 |
||||
|
--> |
||||
|
<template> |
||||
|
<div class="d-flex flex-wrap">信息科</div> |
||||
|
</template> |
||||
|
|
||||
|
<script> |
||||
|
export default { |
||||
|
name: 'Infor', |
||||
|
data() { |
||||
|
return {}; |
||||
|
}, |
||||
|
method: {}, |
||||
|
}; |
||||
|
</script> |
||||
|
|
||||
|
<style lang="stylus" scoped></style> |
@ -0,0 +1,22 @@ |
|||||
|
<!-- |
||||
|
* @Author: aBin |
||||
|
* @email: binbin0314@126.com |
||||
|
* @Date: 2021-06-01 16:18:33 |
||||
|
* @LastEditors: aBin |
||||
|
* @LastEditTime: 2021-06-01 16:39:58 |
||||
|
--> |
||||
|
<template> |
||||
|
<div class="d-flex flex-wrap">运维界面</div> |
||||
|
</template> |
||||
|
|
||||
|
<script> |
||||
|
export default { |
||||
|
name: 'Operation', |
||||
|
data() { |
||||
|
return {}; |
||||
|
}, |
||||
|
method: {}, |
||||
|
}; |
||||
|
</script> |
||||
|
|
||||
|
<style lang="stylus" scoped></style> |
@ -0,0 +1,22 @@ |
|||||
|
<!-- |
||||
|
* @Author: aBin |
||||
|
* @email: binbin0314@126.com |
||||
|
* @Date: 2021-06-01 16:15:02 |
||||
|
* @LastEditors: aBin |
||||
|
* @LastEditTime: 2021-06-01 16:15:16 |
||||
|
--> |
||||
|
<template> |
||||
|
<div class="d-flex flex-wrap">质控数据分析报告</div> |
||||
|
</template> |
||||
|
|
||||
|
<script> |
||||
|
export default { |
||||
|
name: 'QualityControl', |
||||
|
data() { |
||||
|
return {}; |
||||
|
}, |
||||
|
method: {}, |
||||
|
}; |
||||
|
</script> |
||||
|
|
||||
|
<style lang="stylus" scoped></style> |
@ -0,0 +1,22 @@ |
|||||
|
<!-- |
||||
|
* @Author: aBin |
||||
|
* @email: binbin0314@126.com |
||||
|
* @Date: 2021-06-01 16:13:14 |
||||
|
* @LastEditors: aBin |
||||
|
* @LastEditTime: 2021-06-01 16:37:37 |
||||
|
--> |
||||
|
<template> |
||||
|
<div class="d-flex flex-wrap">省数据分析报告详情</div> |
||||
|
</template> |
||||
|
|
||||
|
<script> |
||||
|
export default { |
||||
|
name: 'ProvinceDetails', |
||||
|
data() { |
||||
|
return {}; |
||||
|
}, |
||||
|
method: {}, |
||||
|
}; |
||||
|
</script> |
||||
|
|
||||
|
<style lang="stylus" scoped></style> |
@ -0,0 +1,22 @@ |
|||||
|
<!-- |
||||
|
* @Author: aBin |
||||
|
* @email: binbin0314@126.com |
||||
|
* @Date: 2021-06-01 16:11:02 |
||||
|
* @LastEditors: aBin |
||||
|
* @LastEditTime: 2021-06-01 16:12:24 |
||||
|
--> |
||||
|
<template> |
||||
|
<div class="d-flex flex-wrap">省季度数据分析报告</div> |
||||
|
</template> |
||||
|
|
||||
|
<script> |
||||
|
export default { |
||||
|
name: 'Quarter', |
||||
|
data() { |
||||
|
return {}; |
||||
|
}, |
||||
|
method: {}, |
||||
|
}; |
||||
|
</script> |
||||
|
|
||||
|
<style lang="stylus" scoped></style> |
@ -0,0 +1,22 @@ |
|||||
|
<!-- |
||||
|
* @Author: aBin |
||||
|
* @email: binbin0314@126.com |
||||
|
* @Date: 2021-06-01 16:12:50 |
||||
|
* @LastEditors: aBin |
||||
|
* @LastEditTime: 2021-06-01 16:15:24 |
||||
|
--> |
||||
|
<template> |
||||
|
<div class="d-flex flex-wrap">省年度数据分析报告</div> |
||||
|
</template> |
||||
|
|
||||
|
<script> |
||||
|
export default { |
||||
|
name: 'Year', |
||||
|
data() { |
||||
|
return {}; |
||||
|
}, |
||||
|
method: {}, |
||||
|
}; |
||||
|
</script> |
||||
|
|
||||
|
<style lang="stylus" scoped></style> |