提交 81f7f83e 编写于 作者: chengxiang.li's avatar chengxiang.li

Merge branch 'dev-patients-20190513' of...

Merge branch 'dev-patients-20190513' of 192.168.110.53:com.pica.cloud.education.frontend/pica.cloud.web-education-admin into dev-patients-20190513
文件已删除
...@@ -6,4 +6,5 @@ dist/ ...@@ -6,4 +6,5 @@ dist/
/yqy/ /yqy/
node_modules/ node_modules/
.DS_Store .DS_Store
.vscode .vscode/
.idea/
{
"editor.fontSize": 15
}
\ No newline at end of file
...@@ -33,9 +33,13 @@ module.exports = { ...@@ -33,9 +33,13 @@ module.exports = {
// } // }
// }, // },
context: [ //代理路径 context: [ //代理路径
'/test' /*'/test'*/
'/registers',
'/mobiles',
'/login'
], ],
proxypath: 'http://localhost:9000', //proxypath: 'http://localhost:9000',
proxypath: 'https://dev-saas.yunqueyi.com/web/',
cssSourceMap: true cssSourceMap: true
} }
} }
\ No newline at end of file
...@@ -17,5 +17,6 @@ ...@@ -17,5 +17,6 @@
<router-view></router-view> <router-view></router-view>
</div> </div>
<script src="https://unpkg.com/qiniu-js@2.2.0/dist/qiniu.min.js"></script> <script src="https://unpkg.com/qiniu-js@2.2.0/dist/qiniu.min.js"></script>
<script src="https://pv.sohu.com/cityjson?ie=utf-8"></script>
</body> </body>
</html> </html>
...@@ -2821,14 +2821,12 @@ ...@@ -2821,14 +2821,12 @@
"balanced-match": { "balanced-match": {
"version": "1.0.0", "version": "1.0.0",
"bundled": true, "bundled": true,
"dev": true, "dev": true
"optional": true
}, },
"brace-expansion": { "brace-expansion": {
"version": "1.1.11", "version": "1.1.11",
"bundled": true, "bundled": true,
"dev": true, "dev": true,
"optional": true,
"requires": { "requires": {
"balanced-match": "^1.0.0", "balanced-match": "^1.0.0",
"concat-map": "0.0.1" "concat-map": "0.0.1"
...@@ -2843,20 +2841,17 @@ ...@@ -2843,20 +2841,17 @@
"code-point-at": { "code-point-at": {
"version": "1.1.0", "version": "1.1.0",
"bundled": true, "bundled": true,
"dev": true, "dev": true
"optional": true
}, },
"concat-map": { "concat-map": {
"version": "0.0.1", "version": "0.0.1",
"bundled": true, "bundled": true,
"dev": true, "dev": true
"optional": true
}, },
"console-control-strings": { "console-control-strings": {
"version": "1.1.0", "version": "1.1.0",
"bundled": true, "bundled": true,
"dev": true, "dev": true
"optional": true
}, },
"core-util-is": { "core-util-is": {
"version": "1.0.2", "version": "1.0.2",
...@@ -2973,8 +2968,7 @@ ...@@ -2973,8 +2968,7 @@
"inherits": { "inherits": {
"version": "2.0.3", "version": "2.0.3",
"bundled": true, "bundled": true,
"dev": true, "dev": true
"optional": true
}, },
"ini": { "ini": {
"version": "1.3.5", "version": "1.3.5",
...@@ -2986,7 +2980,6 @@ ...@@ -2986,7 +2980,6 @@
"version": "1.0.0", "version": "1.0.0",
"bundled": true, "bundled": true,
"dev": true, "dev": true,
"optional": true,
"requires": { "requires": {
"number-is-nan": "^1.0.0" "number-is-nan": "^1.0.0"
} }
...@@ -3001,7 +2994,6 @@ ...@@ -3001,7 +2994,6 @@
"version": "3.0.4", "version": "3.0.4",
"bundled": true, "bundled": true,
"dev": true, "dev": true,
"optional": true,
"requires": { "requires": {
"brace-expansion": "^1.1.7" "brace-expansion": "^1.1.7"
} }
...@@ -3009,14 +3001,12 @@ ...@@ -3009,14 +3001,12 @@
"minimist": { "minimist": {
"version": "0.0.8", "version": "0.0.8",
"bundled": true, "bundled": true,
"dev": true, "dev": true
"optional": true
}, },
"minipass": { "minipass": {
"version": "2.2.4", "version": "2.2.4",
"bundled": true, "bundled": true,
"dev": true, "dev": true,
"optional": true,
"requires": { "requires": {
"safe-buffer": "^5.1.1", "safe-buffer": "^5.1.1",
"yallist": "^3.0.0" "yallist": "^3.0.0"
...@@ -3035,7 +3025,6 @@ ...@@ -3035,7 +3025,6 @@
"version": "0.5.1", "version": "0.5.1",
"bundled": true, "bundled": true,
"dev": true, "dev": true,
"optional": true,
"requires": { "requires": {
"minimist": "0.0.8" "minimist": "0.0.8"
} }
...@@ -3116,8 +3105,7 @@ ...@@ -3116,8 +3105,7 @@
"number-is-nan": { "number-is-nan": {
"version": "1.0.1", "version": "1.0.1",
"bundled": true, "bundled": true,
"dev": true, "dev": true
"optional": true
}, },
"object-assign": { "object-assign": {
"version": "4.1.1", "version": "4.1.1",
...@@ -3129,7 +3117,6 @@ ...@@ -3129,7 +3117,6 @@
"version": "1.4.0", "version": "1.4.0",
"bundled": true, "bundled": true,
"dev": true, "dev": true,
"optional": true,
"requires": { "requires": {
"wrappy": "1" "wrappy": "1"
} }
...@@ -3251,7 +3238,6 @@ ...@@ -3251,7 +3238,6 @@
"version": "1.0.2", "version": "1.0.2",
"bundled": true, "bundled": true,
"dev": true, "dev": true,
"optional": true,
"requires": { "requires": {
"code-point-at": "^1.0.0", "code-point-at": "^1.0.0",
"is-fullwidth-code-point": "^1.0.0", "is-fullwidth-code-point": "^1.0.0",
...@@ -4193,6 +4179,11 @@ ...@@ -4193,6 +4179,11 @@
"resolved": "https://registry.npmjs.org/js-cookie/-/js-cookie-2.2.0.tgz", "resolved": "https://registry.npmjs.org/js-cookie/-/js-cookie-2.2.0.tgz",
"integrity": "sha1-Gywnmm7s44ChIWi5JIUmWzWx7/s=" "integrity": "sha1-Gywnmm7s44ChIWi5JIUmWzWx7/s="
}, },
"js-md5": {
"version": "0.7.3",
"resolved": "https://registry.npmjs.org/js-md5/-/js-md5-0.7.3.tgz",
"integrity": "sha512-ZC41vPSTLKGwIRjqDh8DfXoCrdQIyBgspJVPXHBGu4nZlAEvG3nf+jO9avM9RmLiGakg7vz974ms99nEV0tmTQ=="
},
"js-tokens": { "js-tokens": {
"version": "3.0.2", "version": "3.0.2",
"resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz",
......
...@@ -11,6 +11,7 @@ ...@@ -11,6 +11,7 @@
"build": "node build/build.js", "build": "node build/build.js",
"build:dev": "cross-env BUILD_ENV=dev node build/build.js", "build:dev": "cross-env BUILD_ENV=dev node build/build.js",
"build:test": "cross-env BUILD_ENV=test node build/build.js", "build:test": "cross-env BUILD_ENV=test node build/build.js",
"build:test2": "cross-env BUILD_ENV=test2 node build/build.js",
"build:uat": "cross-env BUILD_ENV=uat node build/build.js", "build:uat": "cross-env BUILD_ENV=uat node build/build.js",
"build:pro": "cross-env BUILD_ENV=pro node build/build.js" "build:pro": "cross-env BUILD_ENV=pro node build/build.js"
}, },
...@@ -23,8 +24,10 @@ ...@@ -23,8 +24,10 @@
"fastclick": "^1.0.6", "fastclick": "^1.0.6",
"iscroll": "^5.2.0", "iscroll": "^5.2.0",
"js-cookie": "^2.2.0", "js-cookie": "^2.2.0",
"js-md5": "^0.7.3",
"showdown": "^1.6.4", "showdown": "^1.6.4",
"vue": "^2.1.0", "vue": "^2.1.0",
"vue-infinite-scroll": "^2.0.2",
"vue-router": "^2.1.1", "vue-router": "^2.1.1",
"vuex": "^2.0.0" "vuex": "^2.0.0"
}, },
...@@ -52,6 +55,7 @@ ...@@ -52,6 +55,7 @@
"json-loader": "^0.5.4", "json-loader": "^0.5.4",
"less": "^2.7.1", "less": "^2.7.1",
"less-loader": "^2.2.3", "less-loader": "^2.2.3",
"lodash": "^4.17.11",
"node-gyp": "^3.4.0", "node-gyp": "^3.4.0",
"node-sass": "^4.9.2", "node-sass": "^4.9.2",
"opn": "^4.0.2", "opn": "^4.0.2",
......
<template> <template>
<div> <div v-if="$route.name!='loginPage'">
<v-header :userName="userName" :portrait="portrait" :idType="idType"></v-header> <v-header :userName="userName" :portrait="portrait" :idType="idType"></v-header>
<v-slidebar :authList="authList" :tokenValue="token" :notCompleteCount="redNum"></v-slidebar> <v-slidebar :authList="authList" :tokenValue="token" :storageIdType="storageIdType" :notCompleteCount="redNum"></v-slidebar>
<el-container> <el-container>
<div class="content" id="body-content"> <div class="content" id="body-content">
<transition name="router-fade" mode="out-in"> <transition name="router-fade" mode="out-in">
...@@ -15,7 +15,12 @@ ...@@ -15,7 +15,12 @@
<v-footer></v-footer> <v-footer></v-footer>
</div> </div>
</el-container> </el-container>
</div> </div>
<div class="login-div" v-else>
<transition name="router-fade" mode="out-in">
<router-view v-if="!$route.meta.keepAlive"></router-view>
</transition>
</div>
</template> </template>
<script> <script>
...@@ -36,6 +41,7 @@ export default { ...@@ -36,6 +41,7 @@ export default {
data() { data() {
return { return {
idType: 0, idType: 0,
storageIdType: 0,
token: '', token: '',
userName: '', userName: '',
portrait: '', portrait: '',
...@@ -50,16 +56,26 @@ export default { ...@@ -50,16 +56,26 @@ export default {
}, },
created() { created() {
vm = this vm = this
console.log('..>>> ', process.env.BUILD_ENV); if(vm.$route.name!='loginPage') {
// 本地开发环境,忽略token vm.getToken()
if( process.env.BUILD_ENV != 'development'){ }
vm.getToken()
}
}, },
mounted() { mounted() {
vm.getRedData() vm.getRedData()
function checkIE(){
return '-ms-scroll-limit' in document.documentElement.style && '-ms-ime-align' in document.documentElement.style
}
if (checkIE()) {
window.addEventListener('hashchange', () => {
let currentPath = window.location.hash.slice(1);
if (this.$route.path !== currentPath) {
this.$router.push(currentPath)
}
}, false)
}
}, },
methods: { methods: {
...mapActions('reservationManage',['getUserName']),
// 解密token // 解密token
getToken() { getToken() {
let href = window.location.href let href = window.location.href
...@@ -74,14 +90,27 @@ export default { ...@@ -74,14 +90,27 @@ export default {
vm.$router.push({ path: 'home' }) vm.$router.push({ path: 'home' })
} else { } else {
if(!localStorage.getItem('storageToken')) { if(!localStorage.getItem('storageToken')) {
window.location.href = getLoginUrl('?from=work&type=logout') // 没有token返回登录页面 console.log('域名',window.location.host)
return if(window.location.host.indexOf("work.yunqueyi") != -1&&window.location.host.indexOf("test2-work.yunqueyi") == -1) {
} window.location.href = getLoginUrl('?from=work&type=logout') // 没有token返回登录页面
return;
} else {
this.$router.push('/login')
return;
}
}
} }
}else { }else {
if(!localStorage.getItem('storageToken')) { if(!localStorage.getItem('storageToken')) {
window.location.href = getLoginUrl('?from=work&type=logout') // 没有token返回登录页面 if(window.location.host.indexOf("work.yunqueyi") != -1&&window.location.host.indexOf("test2-work.yunqueyi") == -1) {
return
window.location.href = getLoginUrl('?from=work&type=logout') // 没有token返回登录页面
return;
} else {
this.$router.push('/login');
return;
}
} }
} }
vm.changeToken(vm.token) vm.changeToken(vm.token)
...@@ -106,9 +135,11 @@ export default { ...@@ -106,9 +135,11 @@ export default {
localStorage.setItem('storageIdType', res.data.idType) localStorage.setItem('storageIdType', res.data.idType)
localStorage.setItem('storageMaster', res.data.masterAdministratorFlag) localStorage.setItem('storageMaster', res.data.masterAdministratorFlag)
vm.idType = res.data.idType vm.idType = res.data.idType
vm.storageIdType = res.data.idType
vm.userName = res.data.name vm.userName = res.data.name
vm.portrait = res.data.imageUrl vm.portrait = res.data.imageUrl
vm.authList = res.data.auth vm.authList = res.data.auth
vm.getUserName(vm.userName);
} else { } else {
vm.$message.info(res.message) vm.$message.info(res.message)
} }
...@@ -127,6 +158,11 @@ export default { ...@@ -127,6 +158,11 @@ export default {
} }
}, },
watch: { watch: {
_token(val) {
if(val!=undefined&&val!=null) {
vm.getUserAuth(val)
}
},
$route:{ $route:{
deep:true, deep:true,
handler:function(newVal){ handler:function(newVal){
...@@ -164,4 +200,7 @@ export default { ...@@ -164,4 +200,7 @@ export default {
overflow-y: scroll; overflow-y: scroll;
} }
} }
.login-div {
height: 100%;
}
</style> </style>
<?xml version="1.0" encoding="UTF-8"?>
<svg width="212px" height="224px" viewBox="0 0 212 224" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<!-- Generator: Sketch 53.2 (72643) - https://sketchapp.com -->
<title>Group 10</title>
<desc>Created with Sketch.</desc>
<defs>
<filter x="-10.0%" y="-9.4%" width="120.0%" height="118.8%" filterUnits="objectBoundingBox" id="filter-1">
<feOffset dx="0" dy="4" in="SourceAlpha" result="shadowOffsetOuter1"></feOffset>
<feGaussianBlur stdDeviation="3" in="shadowOffsetOuter1" result="shadowBlurOuter1"></feGaussianBlur>
<feColorMatrix values="0 0 0 0 0 0 0 0 0 0.260105299 0 0 0 0 0.213419732 0 0 0 0.2 0" type="matrix" in="shadowBlurOuter1" result="shadowMatrixOuter1"></feColorMatrix>
<feMerge>
<feMergeNode in="shadowMatrixOuter1"></feMergeNode>
<feMergeNode in="SourceGraphic"></feMergeNode>
</feMerge>
</filter>
</defs>
<g id="页面-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
<g id="切图" transform="translate(-54.000000, -169.000000)">
<g id="分组-2" transform="translate(60.000000, 171.000000)">
<g id="Group-10" filter="url(#filter-1)" fill="#FFFFFF">
<path d="M0,10.0035975 C0,4.47876315 4.47813403,-1.77082302e-14 9.99619514,-1.77082302e-14 L189.855811,-1.77082302e-14 C195.376557,-1.77082302e-14 199.852006,4.48145016 199.852006,10.0035975 L199.852006,189.996403 C199.852006,195.521237 195.373872,200 189.855811,200 L9.99619514,200 C4.47544901,200 0,195.51855 0,189.996403 L0,10.0035975 Z" id="Rectangle-6"></path>
<polygon id="Triangle" transform="translate(100.121572, 204.892523) rotate(180.000000) translate(-100.121572, -204.892523) " points="100.121572 197.392523 112.121572 212.392523 88.1215716 212.392523"></polygon>
</g>
<image id="erweima_download" x="20" y="17" width="160" height="160" xlink:href="data:image/png;base64,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"></image>
</g>
</g>
</g>
</svg>
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<svg width="24px" height="24px" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<!-- Generator: Sketch 53.2 (72643) - https://sketchapp.com -->
<title>手机</title>
<desc>Created with Sketch.</desc>
<g id="页面-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
<g id="切图" transform="translate(-314.000000, -214.000000)" fill="#B3BEC5" fill-rule="nonzero">
<g id="手机" transform="translate(314.000000, 214.000000)">
<path d="M11.0209906,17.1295455 C11.0209906,17.6455895 11.4393269,18.0639258 11.9553709,18.0639258 C12.4714149,18.0639258 12.8897512,17.6455895 12.8897512,17.1295455 C12.8897512,16.6135015 12.4714149,16.1951652 11.9553709,16.1951652 C11.4393269,16.1951652 11.0209906,16.6135015 11.0209906,17.1295455 L11.0209906,17.1295455 Z" id="Shape"></path>
<path d="M13.1163284,5.7778511 C13.1163284,5.70988813 13.0755242,5.65481406 13.0251707,5.65481406 L10.7652715,5.65481406 C10.714918,5.65481406 10.6741138,5.70988813 10.6741138,5.7778511 L10.6741138,5.86511035 C10.6741138,5.93307333 10.714918,5.98814739 10.7652715,5.98814739 L13.0251707,5.98814739 C13.0755242,5.98814739 13.1163284,5.93307333 13.1163284,5.86511035 L13.1163284,5.7778511 Z" id="Shape"></path>
<path d="M15.4519362,6.45059185 L8.46080884,6.45059185 C8.27841109,6.45059185 8.09472362,6.60771679 8.09472362,6.76286604 L8.09472362,15.2372408 C8.09472362,15.39239 8.27841109,15.4785536 8.46080884,15.4785536 L15.4519362,15.4785536 C15.6343614,15.4785536 15.7506547,15.3923901 15.7506547,15.2372408 L15.7506547,6.76286601 C15.7506272,6.60771679 15.6343339,6.45059185 15.4519362,6.45059185 Z" id="Shape"></path>
<path d="M12.0033646,0.0266345564 C5.38765225,0.0266345564 0.0245765095,5.38973776 0.0245765095,12.0054226 C0.0245765095,18.6211075 5.38765225,23.9842107 12.0033646,23.9842107 C18.6190769,23.9842107 23.9821526,18.6211075 23.9821526,12.0054226 C23.9821526,5.38973776 18.6190769,0.0266345564 12.0033646,0.0266345564 Z M16.4366426,18.1704228 C16.4366426,18.5643054 16.170304,18.881217 15.8166768,18.881217 L8.1970771,18.881217 C7.84344992,18.881217 7.51844329,18.5643054 7.51844329,18.1704228 L7.51844332,5.83251947 C7.51844332,5.43863692 7.84344995,5.10602923 8.19707713,5.10602923 L15.8166768,5.10602923 C16.170304,5.10602923 16.4366426,5.43866435 16.4366426,5.83251947 L16.4366426,18.1704228 Z" id="Shape"></path>
</g>
</g>
</g>
</svg>
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<svg width="18px" height="20px" viewBox="0 0 18 20" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<!-- Generator: Sketch 53.2 (72643) - https://sketchapp.com -->
<title>分组 5</title>
<desc>Created with Sketch.</desc>
<g id="页面-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
<g id="切图" transform="translate(-388.000000, -267.000000)">
<g id="分组-5" transform="translate(387.000000, 267.000000)">
<g id="验证码" transform="translate(1.000000, 0.000000)" fill="#BFBFBF" fill-rule="nonzero">
<path d="M17.2947053,3.1215984 C17.2947053,2.99072927 17.1772627,2.87998002 17.0363437,2.87666334 L16.5463936,2.86997003 C16.5296304,2.86997003 14.5699101,2.83308691 12.533027,2.03440559 C10.4692907,1.22569431 9.12367632,0.286093906 9.11024975,0.276043956 L8.81158841,0.067992008 C8.76799201,0.0344655345 8.71092907,0.0176623377 8.65384615,0.0176623377 C8.59676324,0.0176623377 8.54311688,0.0344255744 8.4961039,0.067992008 L8.2007992,0.272687313 C8.14711289,0.30957043 6.83506494,1.22569431 4.77802198,2.03104895 C2.74447552,2.82971029 0.784775225,2.86661339 0.767992008,2.86661339 L0.274705295,2.87330669 C0.13040959,2.87668332 0.0163436563,2.98741259 0.0163436563,3.11824176 L0.0163436563,11.295984 C0.0163436563,13.1885514 1.18073926,15.3496304 3.21090909,17.2221179 C5.03306693,18.9032767 7.17056943,19.9905495 8.65718282,19.9905495 C10.1470929,19.9905495 12.288012,18.9033367 14.1101499,17.2221179 C16.136963,15.3496703 17.3013986,13.1886114 17.3013986,11.2926474 L17.2947053,3.12157842 L17.2947053,3.1215984 Z M13.3517882,16.41003 C11.5095105,18.1113287 9.62697303,18.8831369 8.65722278,18.8831369 C8.04313686,18.8831369 7.26795205,18.6382018 6.40893107,18.1750849 C5.57672328,17.7254146 4.72777223,17.1046154 3.95256743,16.3798002 C3.13378621,15.6146853 2.44251748,14.7724276 1.95928072,13.9435964 C1.40897103,13.0073526 1.13040959,12.1147652 1.13040959,11.2993007 L1.13040959,3.96383616 L1.23778222,3.95714286 C2.01966034,3.89674326 3.57332667,3.70211788 5.18741259,3.06787213 C6.88203796,2.4033966 8.13366633,1.64505495 8.59338661,1.34977023 L8.65712288,1.30949051 L8.72085914,1.34977023 C9.17724276,1.64507493 10.4255345,2.4000999 12.1268332,3.06787213 C13.7442358,3.70545455 15.2945854,3.89674326 16.0764635,3.95714286 L16.1838362,3.96383616 L16.1872128,11.2993007 C16.1872128,12.8597003 15.1268332,14.7724076 13.3516484,16.40999 L13.3517882,16.41003 Z" id="形状"></path>
<path d="M11.8585015,7.26251748 C11.7108292,7.26251748 11.5699301,7.31956044 11.4625175,7.42693307 L7.47934066,11.4101099 L5.85182817,9.7825974 C5.74781219,9.67858142 5.60689311,9.61818182 5.45922078,9.61818182 C5.31154845,9.61818182 5.17064935,9.67522478 5.06323676,9.7825974 C4.84847153,9.99736264 4.84847153,10.353027 5.06323676,10.5678122 L7.08333666,12.5879121 C7.18735265,12.6919281 7.32827173,12.7523277 7.47594406,12.7523277 C7.62361638,12.7523277 7.76451548,12.6952847 7.86855145,12.5879121 L12.251049,8.21208791 C12.3584216,8.10471528 12.4154645,7.96715285 12.4154645,7.8161039 C12.4154645,7.66843157 12.3584216,7.52753247 12.251049,7.4234965 C12.147033,7.31948052 12.0061139,7.26243756 11.8584416,7.26243756 L11.8585015,7.26251748 Z" id="路径"></path>
</g>
<rect id="矩形-copy-2" fill="#D8D8D8" opacity="0" x="0" y="0" width="20" height="20"></rect>
</g>
</g>
</g>
</svg>
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<svg width="20px" height="20px" viewBox="0 0 20 20" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<!-- Generator: Sketch 53.2 (72643) - https://sketchapp.com -->
<title>不显示</title>
<desc>Created with Sketch.</desc>
<g id="页面-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
<g id="切图" transform="translate(-356.000000, -179.000000)" fill="#666666" fill-rule="nonzero">
<g id="不显示" transform="translate(356.000000, 183.000000)">
<path d="M2.98760777,4.47585816 C4.94765492,6.11926669 7.43127373,7.00805831 9.98980402,6.98167478 C13.9640444,7.0225326 17.6093887,4.78176931 19.3649668,1.21883894 C19.5521654,0.807512254 19.3988241,0.321333583 19.0094289,0.091583043 C18.8181252,-0.001978335 18.5972317,-0.0148501233 18.3963409,0.055857502 C18.19545,0.126565127 18.0313945,0.274927609 17.9410059,0.467636331 C16.5441006,3.58701642 13.4088477,5.56280617 9.98980402,5.4783656 C7.76037056,5.50874238 5.60065046,4.70229859 3.93751811,3.21842997 C3.09832069,2.48280435 2.41273474,1.58885528 1.92008948,0.58786491 C1.68997986,0.235586567 1.25173349,0.0817075981 0.851666507,0.212715594 C0.487789672,0.467392835 0.384104767,0.960502427 0.614641265,1.33997149 C1.22659788,2.50788576 2.0285062,3.56608405 2.98760777,4.47133829 L2.98760777,4.47585816 Z M9.9941569,7.63120872 C9.52265361,7.67647236 9.1570345,8.06269722 9.13799621,8.53562135 L9.13799621,11.0955874 C9.12205241,11.4115164 9.2816591,11.7105094 9.55312518,11.873253 C9.82459126,12.0359967 10.1637225,12.0359967 10.4351886,11.873253 C10.7066547,11.7105094 10.8662614,11.4115164 10.8503176,11.0955874 L10.8503176,8.53562135 C10.8308133,8.06289364 10.465438,7.6769264 9.9941569,7.63120872 L9.9941569,7.63120872 Z M19.1249887,8.44075636 L17.6987795,6.33190961 C17.5749658,6.11437082 17.366006,5.95824866 17.1221706,5.90110218 C16.8783351,5.84395571 16.6216962,5.89095785 16.4139945,6.03080108 C15.9765328,6.33703529 15.8514494,6.92965089 16.1278823,7.38633299 L17.5551794,9.49517974 C17.6792244,9.71246602 17.888172,9.86836726 18.1319051,9.92548974 C18.3756382,9.98261222 18.6321679,9.93580255 18.8399644,9.79628826 C19.2775285,9.49003737 19.4022102,8.89707016 19.1249887,8.44075636 L19.1249887,8.44075636 Z M3.57867083,6.18081183 C3.16908942,5.91883495 2.63140244,5.9820699 2.29388586,6.33190961 L0.867676644,8.44075636 C0.590455144,8.89707016 0.715136858,9.49003736 1.15270091,9.79628826 C1.36049738,9.93580255 1.61702715,9.98261223 1.86076023,9.92548975 C2.10449332,9.86836727 2.31344092,9.71246602 2.43748588,9.49517974 L3.8636951,7.38633299 C3.97786782,6.96217115 3.87074091,6.50907376 3.57867083,6.18081183 L3.57867083,6.18081183 Z" id="Shape"></path>
</g>
</g>
</g>
</svg>
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<svg width="18px" height="18px" viewBox="0 0 18 18" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<!-- Generator: Sketch 53.2 (72643) - https://sketchapp.com -->
<title>Shape</title>
<desc>Created with Sketch.</desc>
<g id="页面-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
<g id="切图" transform="translate(-462.000000, -267.000000)" fill="#FB5B52">
<path d="M471,267 C466.028906,267 462,271.028906 462,276 C462,280.971094 466.028906,285 471,285 C475.971094,285 480,280.971094 480,276 C480,271.028906 475.971094,267 471,267 L471,267 Z M475.236328,279.362695 C475.457812,279.580664 475.461328,279.935742 475.245117,280.158984 L475.245117,280.158984 C475.027148,280.380469 474.67207,280.383984 474.448828,280.167773 L471,276.7875 L467.551172,280.166016 C467.329687,280.383984 466.972852,280.380469 466.754883,280.157227 L466.754883,280.157227 C466.536914,279.935742 466.54043,279.578906 466.763672,279.360937 L470.19668,276 L466.763672,272.637305 C466.542188,272.419336 466.538672,272.064258 466.754883,271.841016 L466.754883,271.841016 C466.972852,271.619531 467.32793,271.616016 467.551172,271.832227 L471,275.2125 L474.448828,271.833984 C474.670313,271.616016 475.027148,271.619531 475.245117,271.842773 L475.245117,271.842773 C475.463086,272.064258 475.45957,272.421094 475.236328,272.639063 L471.80332,276 L475.236328,279.362695 L475.236328,279.362695 Z" id="Shape"></path>
</g>
</g>
</svg>
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<svg width="20px" height="20px" viewBox="0 0 20 20" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<!-- Generator: Sketch 53.2 (72643) - https://sketchapp.com -->
<title>分组 6</title>
<desc>Created with Sketch.</desc>
<g id="页面-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
<g id="切图" transform="translate(-421.000000, -267.000000)">
<g id="分组-6" transform="translate(421.000000, 267.000000)">
<g id="邀请-(2)" transform="translate(0.000000, -0.000000)" fill="#BFBFBF" fill-rule="nonzero">
<path d="M16.5254083,18.8113734 L3.23546192,18.8113734 C2.01561178,18.8113734 1.05257219,17.8483338 1.05257219,16.6284837 L1.05257219,9.56619329 L9.5273206,17.463118 C9.59152325,17.5273206 9.71992851,17.5915232 9.78413116,17.5915232 L9.91253644,17.5915232 C10.0409417,17.5915232 10.169347,17.5273206 10.2977523,17.463118 L18.7725007,9.43778803 L18.7725007,16.564281 C18.7725007,17.8483338 17.7452585,18.8113734 16.5254083,18.8113734 M2.20821969,6.93388507 L2.20821969,9.05257219 L1.2451801,8.15373522 C1.37358538,7.64011411 1.69459858,7.25489827 2.20821969,6.93388507 M5.73936488,1.15564752 L14.1499107,1.15564752 C15.4981661,1.15564752 16.589611,1.99028183 16.589611,3.08172671 L16.589611,10.0798144 L9.91253644,16.3716731 L3.29966457,10.144017 L3.29966457,3.08172671 C3.29966457,1.99028183 4.39110945,1.15564752 5.73936488,1.15564752 M18.5798928,8.08953259 L17.6168532,8.98836954 L17.6168532,6.93388507 C18.0662717,7.19069563 18.4514875,7.57591147 18.5798928,8.08953259 M17.6810558,5.71403493 L17.6810558,3.01752406 C17.6810558,1.34825543 16.0759899,-5.68434189e-14 14.1499107,-5.68434189e-14 L5.73936488,-5.68434189e-14 C3.81328569,-5.68434189e-14 2.20821971,1.34825543 2.20821969,3.01752406 L2.20821969,5.71403493 C1.18097745,6.09925077 0.410545773,6.86968245 0.153735219,7.89692466 C0.025329932,8.02532995 -0.0388726919,8.28214051 0.0253299514,8.41054579 L0.0253299514,16.564281 C0.0253299514,18.4261576 1.50199067,19.9028183 3.36386721,19.9028183 L16.6538136,19.9028183 C18.5156901,19.9028183 19.9923509,18.4261576 19.9923509,16.564281 L19.9923509,8.85996426 C19.8639456,7.44750618 18.9651086,6.22765603 17.6810558,5.71403493" id="形状"></path>
<path d="M7.47283613,7.126493 C7.47283613,6.6128719 7.92225462,6.16345341 8.43587572,6.16345339 C8.82109156,6.16345339 9.20630741,6.42026395 9.33471269,6.80547979 C9.39891534,6.9980877 9.59152325,7.12649298 9.78413116,7.126493 L10.1051444,7.126493 C10.2977523,7.126493 10.4903602,6.99808772 10.5545628,6.80547979 C10.6829681,6.42026395 11.0681839,6.16345339 11.4533998,6.16345339 C11.9670209,6.16345339 12.4164394,6.61287188 12.4164394,7.126493 L12.4164394,7.25489827 C12.4164394,8.53895106 10.3619549,9.75880121 9.97673909,9.82300385 C9.59152325,9.75880121 7.53703878,8.53895106 7.53703878,7.25489827 L7.53703878,7.19069563 C7.47283613,7.25489827 7.47283613,7.19069563 7.47283613,7.126493 M9.91253644,10.9144487 C10.7471707,10.9144487 13.4436816,9.2451801 13.4436816,7.31910091 L13.4436816,7.25489827 L13.4436816,7.19069563 C13.4436816,6.09925075 12.5448447,5.2004138 11.3891972,5.2004138 C10.8113734,5.2004138 10.2977523,5.45722435 9.91253644,5.84244019 C9.5273206,5.45722435 9.01369949,5.2004138 8.43587572,5.2004138 C7.34443085,5.2004138 6.38139125,6.09925075 6.38139127,7.19069563 L6.38139127,7.31910091 C6.38139127,9.2451801 9.07790214,10.9144487 9.91253644,10.9144487" id="形状"></path>
</g>
<rect id="矩形-copy-3" fill="#D8D8D8" opacity="0" x="0" y="0" width="20" height="20"></rect>
</g>
</g>
</g>
</svg>
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<svg width="54px" height="54px" viewBox="0 0 54 54" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<!-- Generator: Sketch 53.2 (72643) - https://sketchapp.com -->
<title>资源 1@5x</title>
<desc>Created with Sketch.</desc>
<defs>
<rect x="4" y="2" width="46" height="46" id="rect-1"></rect>
<filter x="-15.2%" y="-10.9%" width="130.4%" height="130.4%" filterUnits="objectBoundingBox" id="filter-2">
<feOffset dx="0" dy="2" in="SourceAlpha" result="shadowOffsetOuter1"></feOffset>
<feGaussianBlur stdDeviation="2" in="shadowOffsetOuter1" result="shadowBlurOuter1"></feGaussianBlur>
<feColorMatrix values="0 0 0 0 0 0 0 0 0 0.174337636 0 0 0 0 0.143046265 0 0 0 0.25114729 0" type="matrix" in="shadowBlurOuter1"></feColorMatrix>
</filter>
</defs>
<g id="页面-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
<g id="切图" transform="translate(-54.000000, -52.000000)">
<g id="分组-3" transform="translate(54.000000, 52.000000)">
<g id="资源-1@5x">
<use fill="black" fill-opacity="1" filter="url(#filter-2)" xlink:href="#rect-1"></use>
<image x="4" y="2" width="46" height="46" xlink:href="data:image/png;base64,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6jpo4iJAgAABAgQIECBAgAABAgQIJCCwKcQYl7LW8qjjTLmRMFIT4fQcuVp+ZQVFgAABAgQIECBAgAABAgQIJCZQy40f6jhTLmZQJeQS++0ULgECBAgQIECAAAECBAgQIFBbgZjr2Vi36OqWlBsPA2Rjh7p9S8VDgAABAgQIECBAgAABAgQIpCwQN37YEs64OrI2R52Wr8aM6f21GRmBECBAgAABAgQIECBAgAABAgQItAp8LLwZb/2gyq/rMlMuZkq3Vnkg9J0AAQIECBAgQIAAAQIECBAgQGBJgbg68vol76jQxbrMlIsJuTdWyF1XCRAgQIAAAQIECBAgQIAAAQIEehO4JhTb1lvR8pSqw0y5mCGVkCvPd0pPCBAgQIAAAQIECBAgQIAAAQKDFNgSKh8ZZAPDqLvqM+U2BqSJcMYH/jkIECBAgAABAgQIECBAgAABAgTSEKj88+WqnJSLGdGJcF6dxndNlAQIECBAgAABAgQIECBAgAABAi0CPxdeb215X6mXVV6+ujlIS8hV6uumswQIECBAgAABAgQIECBAgACBvglsCTWN9q22IVdU1ZlyY8HptiFbaY4AAQIECBAgQIAAAQIECBAgQKBcAreH7oyVq0ud9aaKM+XistXKTk3sbFjcRYAAAQIECBAgQIAAAQIECBAg0IHApnDP5g7uK90tVZwpFxNydlst3VdJhwgQIECAAAECBAgQIECAAAEChQlcE1reVljrPTRctZlybwoxSsj1MNCKECBAgAABAgQIECBAgAABAgRqLLClarFVKSk3GnArB1y1L4T+EiBAgAABAgQIECBAgAABAgQqKBA3A91cpX5XafnqRICN64QdBAgQIECAAAECBAgQIECAAAECBBYTqMwy1qrMlLs+KEvILfZV8xkBAgQIECBAgAABAgQIECBAgEBTYEvzRdl/ViEpNxIQN5cdUv8IECBAgAABAgQIECBAgAABAgQKF6jMMtYqLF/dGobT5g6Ff6d1gAABAgQIECBAgAABAgQIECBQGYHSL2Mt+0w5u61W5ruuowQIECBAgAABAgQIECBAgACB0ghsKU1P2nSkzEm5uGy19IBtXH1MgAABAgQIECBAgAABAgQIECBQnEDpl7GWOSm3OYzbOcWNnZYJECBAgAABAgQIECBAgAABAgQqLHB96PtoWftf1mfKjQWw28qKpl8ECBAgQIAAAQIECBAgQIAAAQKVELg99HKsjD0t60y5G8qIpU8ECBAgQIAAAQIECBAgQIAAAQKVEtgUehv3LCjdUcak3OagFNf9OggQIECAAAECBAgQIECAAAECBAjkFdgSKoh7F5TqKFtSbjToxPW+DgIECBAgQIAAAQIECBAgQIAAAQL9EIh7FmzuR0X9rKNsz5TbGoJ7Yz8DVBcBAgQIECBAgAABAgQIECBAgACBIHBNOLeVRaJMM+XGAoqEXFm+GfpBgAABAgQIECBAgAABAgQIEKiXwA1lCqdMM+UmA8y6MuHoCwECBAgQIECAAAECBAgQIECAQK0Efi5EE1dqFn6UZabc9UFCQq7wr4MOECBAgAABAgQIECBAgAABAgRqLRBny42UIcIyJOUixOYyYOgDAQIECBAgQIAAAQIECBAgQIBArQXipLA4OazwowxJuc1BIe6C4SBAgAABAgQIECBAgAABAgQIECAwaIGYlBsddCPL1V/0M+UiwO7lOuk6AQIECBAgQIAAAQIECBAgQIAAgT4KfCzUNd7H+rququik3ETo8aaue60AAQIECBAgQIAAAQIECBAgQIAAgXwC14Ti2/JV0XvpIpevjoVuS8j1PnZKEiBAgAABAgQIECBAgAABAgQI9C5wQ+9F85csMim3OX/31UCAAAECBAgQIECAAAECBAgQIECgJ4E4WWysp5J9KFRUUm489N0suT4MoCoIECBAgAABAgQIECBAgAABAgR6FihstlxRz5SbDFTreuZSkAABAgQIECBAgAABAgQIECBAgEB/BN4SqtnSn6o6r6WImXLjoXsScp2PkTsJECBAgAABAgQIECBAgAABAgQGJ7B5cFW3r7mIpFwhgbYncIUAAQIECBAgQIAAAQIECBAgQCBhgTh5bHzY8Q87KRcDNEtu2KOsPQIECBAgQIAAAQIECBAgQIAAgaUENi91cRDXhpmUGwkBFPbwvEHgqZMAAQIECBAgQIAAAQIECBAgQKAWAkOfLTfMpNz1YYjOqcUwCYIAAQIECBAgQIAAAQIECBAgQKBuApuHGdCwknJxllxMyjkIECBAgAABAgQIECBAgAABAgQIlFFgqLPlhpWUGw/SZsmV8eumTwQIECBAgAABAgQIECBAgAABAk2Bzc0Xg/45rKScWXKDHkn1EyBAgAABAgQIECBAgAABAgQI5BUY2my5YSTlxoOGHVfzfiWUJ0CAAAECBAgQIECAAAECBAgQGIbA5mE0Moyk3FACGQaWNggQIECAAAECBAgQIECAAAECBGovMJTZcoNOyo2HYTJLrvbfVQESIECAAAECBAgQIECAAAECBGolsHnQ0Zx29OjRQbYxGSqXlBuksLoJECBAgAABAgQIECBAgAABAgQGIfBzodKtg6g41jnImXJjoX4JuajsIECAAAECBAgQIECAAAECBAgQqJrAQDcuHWRSbnPVpPWXAAECBAgQIECAAAECBAgQIECAwHGBTeHn2KA0BpWU2xg6HDvuIECAAAECBAgQIECAAAECBAgQIFBVgfFBdXxQSbmBTu8bFIZ6CRAgQIAAAQIECBAgQIAAAQIECLQIXBdej7a879vLQSTlYkdjhx0ECBAgQIAAAQIECBAgQIAAAQIEqi4wkMlng0jKjVddWv8JECBAgAABAgQIECBAgAABAgQIHBcYDz9H+q0xiKTcQLKH/Q5cfQQIECBAgAABAgQIECBAgAABAgQ6EDgn3POmDu7r6pZ+J+XGQ+uxow4CBAgQIECAAAECBAgQIECAAAECdRHY3O9ABpGU63cf1UeAAAECBAgQIECAAAECBAgQIECgSIF1ofGxfnagn0m5jaFjm/rZOXURIECAAAECBAgQIECAAAECBAgQKInAeD/70c+knGfJ9XNk1EWAAAECBAgQIECAAAECBAgQIFAmgetCZ0b71aF+JeVGQof6/sC7fgWpHgIECBAgQIAAAQIECBAgQIAAAQJ9EBjvQx2NKvqVlIsJORs89GtU1EOAAAECBAgQIECAAAECBAgQIFBGgfF+dapfSTlLV/s1IuohQIAAAQIECBAgQIAAAQIECBAoq0Dc8KEvq0X7kZTbGDpzdVml9IsAAQIECBAgQIAAAQIECBAgQIBAHwVKk5Qb72NQqiJAgAABAgQIECBAgAABAgQIECBQZoG44cNI3g72Y6bceN5OKE+AAAECBAgQIECAAAECBAgQIECgQgLjefuaNykXp+vZ4CHvKChPgAABAgQIECBAgAABAgQIECBQJYHxvJ3Nm5TL3YG8AShPgAABAgQIECBAgAABAgQIECBAYMgCcX+FuM9Cz0eepFxcO/vGnltWkAABAgQIECBAgAABAgQIECBAgEB1BcbzdD1PUi4uXXUQIECAAAECBAgQIECAAAECBAgQSFEgV24sT1Lu+hS1xUyAAAECBAgQIECAAAECBAgQIEAgCKwL51ivEr0m5UZDg3HtrIMAAQIECBAgQIAAAQIECBAgQIBAqgLjvQbea1Iu1/S8XjurHAECBAgQIECAAAECBAgQIECAAIESCfScI+s1KTdeouB1hQABAgQIECBAgAABAgQIECBAgEARAueERntKzPWSlBsNjVm6WsQwa5MAAQIECBAgQIAAAQIECBAgQKBsAkNLyvXUUNm09IcAAQIECBAgQIAAAQIECBAgQIBAHwR6ypX1MlNuvA+dVQUBAgQIECBAgAABAgQIECBAgACBOgj0tIS126TcaJCydLUOXxcxECBAgAABAgQIECBAgAABAgQI9Eug69ly3Sblum6gX5GphwABAgQIECBAgAABAgQIECBAgEBJBca67Ve3SbmuG+i2Q+4nQIAAAQIECBAgQIAAAQIECBAgUDGBdaG/G7vpczdJuZFQ8Ru7qdy9BAgQIECAAAECBAgQIECAAAECBBIRGO8mzm6ScpaudiPrXgIECBAgQIAAAQIECBAgQIAAgZQExroJtpukXFcVd9MJ9xIgQIAAAQIECBAgQIAAAQIECBCouEDcHHW00xi6ScqZKdepqvsIECBAgAABAgQIECBAgAABAgRSFOg4f9ZpUm5jUDwnRUkxEyBAgAABAgQIECBAgAABAgQIEOhQYKzD+7JOk3IdZ/k6bdh9BAgQIECAAAECBAgQIECAAAECBGom0PEmqZJyNRt54RAgQIAAAQIECBAgQIAAAQIECBQq0NHktk6SciMhjPigOgcBAgQIECBAgAABAgQIECBAgAABAksLjC19+djVTpJyHVXUSWPuIUCAAAECBAgQIECAAAECBAgQIFBzgbFO4uskKdfRlLtOGnMPAQIECBAgQIAAAQIECBAgQIAAgZoLxBWnceXpkkcnSbmxJWtwkQABAgQIECBAgAABAgQIECBAgACBVoFlJ7ktl5QbDbWta63RawIECBAgQIAAAQIECBAgQIAAAQIElhQYW/JquLhcUm7ZCpZrwHUCBAgQIECAAAECBAgQIECAAAECiQmMLRevpNxyQq4TIECAAAECBAgQIECAAAECBAgQ6E4grjwdXaqIpNxSOq4RIECAAAECBAgQIECAAAECBAgQ6E1gbKliSyXlRkNBz5NbSs81AgQIECBAgAABAgQIECBAgAABAosLbFz842OfLpWUW7LgUpW6RoAAAQIECBAgQIAAAQIECBAgQCBxgbGl4l8qKbdkwaUqdY0AAQIECBAgQIAAAQIECBAgQIBA4gJXh/hH2hlIyrWT8TkBAgQIECBAgAABAgQIECBAgACBfAJtV6IulZSL2TwHAQIECBAgQIAAAQIECBAgQIAAAQK9CYy1K9YuKde2QLuKfE6AAAECBAgQIECAAAECBAgQIECAwEkCYye9a3nTLinXdmpdS1kvCRAgQIAAAQIECBAgQIAAAQIECBBoL9A2x9YuKTfWvi5XCBAgQIAAAQIECBAgQIAAAQIECBDoQOCccM/oYve1S8q1zeItVonPCBAgQIAAAQIECBAgQIAAAQIECBBYVGDRPNtiSbmRUHzdolX4kAABAgQIECBAgAABAgQIECBAgACBbgQ6TsotemM3LbmXAAECBAgQIECAAAECBAgQIECAAIGGwNhiDovNlFv0xsUK+4wAAQIECBAgQIAAAQIECBAgQIAAgSUFFp0At1hSbnTJalwkQIAAAQIECBAgQIAAAQIECBAgQKBTgUU3e1gsKbdo9q7TVtxHgAABAgQIECBAgAABAgQIECBAgMBJAqMnvQtvFkvKXb3wJu8JECBAgAABAgQIECBAgAABAgQIEOhZYGxhyYVJObPkFgp5T4AAAQIECBAgQIAAAQIECBAgQCCfwCk5t4VJudF89StNgAABAgQIECBAgAABAgQIECBAgMACgdEF709ZvnpK1m5hAe8JECBAgAABAgQIECBAgAABAgQIEOhK4JTHxS2cKScp15WnmwkQIECAAAECBAgQIECAAAECBAh0JHBS3m1hUm60oyrcRIAAAQIECBAgQIAAAQIECBAgQIBANwIjrTcvTMqdMpWu9WavCRAgQIAAAQIECBAgQIAAAQIECBDoSWCstVRrUm609YLXBAgQIECAAAECBAgQIECAAAECBAj0TWC0tSZJuVYNrwkQIECAAAECBAgQIECAAAECBAgMRmC0tdrWpNxJD5trvclrAgQIECBAgAABAgQIECBAgAABAgRyCZyUe2tNyp30sLlcTShMgAABAgQIECBAgAABAgQIECBAgECrwDmtb1qTcmOtF7wmQIAAAQIECBAgQIAAAQIECBAgQKCvAidmy7Um5fragsoIECBAgAABAgQIECBAgAABAgQIEDhJ4MRK1dak3KaTbvGGAAECBAgQIECAAAECBAgQIECAAIF+Cow1K2tNyjU/85MAAQIECBAgQIAAAQIECBAgQIAAgQEKNJNyYwNsQ9UECBAgQIAAAQIECBAgQIAAAQIECGSZZ8r5FhAgQIAAAQIECBAgQIAAAQIECBAYssApz5Q7kaUbckc0R4AAAQIECBAgQIAAAQIECBAgQCAVgdFmoM3lqyeydM0LfhIgQIAAAQIECBAgQIAAAQIECBAg0FeBdc3aJOWaEn4SIECAAAECBAgQIECAAAECBAgQGJJAMyln+eqQwDVDgAABAgQIECBAgAABAgQIECCQtMBYjL6ZlEtaQvAECBAgQIAAAQIECBAgQIAAAQIEhinQTMqNDrNRbREgQIAAAQIECBAgQIAAAQIECBBIVKCxt0MzKXfiIXOJYgibAAECBAgQIECAAAECBAgQIECAwDAEGo+RayblhtGgNggQIECAAAECBAgQIECAAAECBAgQCAIxKTdKggABAgQIECBAgAABAgQIECBAgACBoQg0lq+eHpoaHUpzGiFAgAABAgQIEKicwGPz384OHvlu3/r90pUvzs5a8YK+1aciAgQIECBAgEAFBRrLV2NSzkGAAAECBAgQIFAjgdZEWkyoPTb/7InoDh753knvj2anZU8ems+ePPzciXs6fRHL5jlay5+14vQsJuxajzVnrMzWnPmiEx8dS+gd++vrwmsnbvKCAAECBAgQIFARAUm5igyUbhIgQIAAAQJpC8TE2fTh+QbC1+b2N35ONz47lkzb3eOMttbEWJHCMVn40NzTJ3Xhoezk9yddDG+afb/gjBedSN5dteoljdtak3bNzxaW954AAQIECBAgUKSA5atF6mubAAECBAgQIHBcIM5mi7Pamsm15vs4621+ieWjzcRUypBxll9zpt/CxF6ryyuOJ+yaSbqrVp3XuNx833qv1wQIECBAgACBAQo0nil32tGjRzeHRn53gA2pmgABAgQIECBAIAh8bW4mO9BIvD17YsnormWSbsvB5U3K5Smfp2yMq0zlm8tnLzw+6+6lK1dla8LrSxcsqV1uPFwnQIAAAQIECHQocJrlqx1KuY0AAQIECBAg0InAseezzYelmDMnZr7FWW/tZrvlTUx10if3LC/QXD770CK3tiboWl8vcquPCBAgQIAAAQIdC0jK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LFXgII6+HXG41CyWcPA2FuUS84OIdFqkRoAAAQIECBAgQIAAAQIECBAgsByBdImxuxGtK8gl7rYW5dLYdyIepycaAQIECBAgQIAAAQIECBAgQIDAQgVSQW47Ym+hR83oYG0uyqVp2InYT080AgQIECBAgAABAgQIECBAgACBhQncjyO1tiCXlNtelEunR25HKMwFgkaAAAECBAgQIECAAAECBAgQWIDAvThGZwHHyfoQbS/KpclJhbm7Eem0SY0AAQIECBAgQIAAAQIECLwT+MfRKxIECFQv8EN02am+2/J6VJT7fc568bAdoTAXCBoBAgQIECBAgAABAgQIECBAoAaBdNPN3Rr6LbJLRbkP05bWMW9HKMx9MPGMAAECBAgQIECAAAECBAgQIFCFQCrI7VTRUVP6UJS7OJMKcxc9vCJAgAABAgQIECBAgAABAgQIzCugIDdCUFHuY5RUmLv/8dveIUCAAAECBAgQIECAAAECBAgQmFLgSWy/M+U+rdhcUW70NHfi7XujP/IuAQIECBAgQIAAAQIECBAgQIDABAL7sc3dCbZr5SaKcuOnvRMfKcyN9/EJAQIECBAgQIAAAQIECBAgQGCcQCrIbUccjtug7e8ryl3+DejExwpzlxv5lAABAgQIECBAgAABAgQIECAwKKAgN6gx5rmi3BiYgbc78VxhbgDEUwIECBAgQIAAAQIECBAgQIDAGAEFuTEww28ryg2LjH7dibcV5kbbeJcAAQIECBAgQIAAAQIECBAgkAQU5Kb4HijKTY7ViU0V5ib3siUBAgQIECBAgAABAgQIECDQHgEFuSnnWlFuOrBObK4wN52ZrQkQIECAAAECBAgQIECAAIFmCyjIzTC/inLTo3Vil1SYezn9rvYgQIAAAQIECBAgQIAAAQIECDRK4HGMZjvCXVannFZFuSnBzjfvxON2hMJcIGgECBAgQIAAAQIECBAgQIBAKwUexqjvRijIzTD9inIzoJ3vsheP2xEKc+cgHggQIECAAAECBAgQIECAAIHWCKSC3E5rRlvDQBXl5kNVmJvPz94ECBAgQIAAAQIEWiPwy8nr1ozVQAkQaLyAglwFU6woNz9iKsxtRezP35UeCBAgQIAAAQIECBBoqsDx2dumDs24CBBol8D3Mdyddg25ntEqylXj2otutiMU5gJBI0CAAAECBAgQIECAAAECBBopkG58+aCRI1vCoBTlqkM/jK62Ix5X16WeCBAgQIAAAQIECBAgQIAAAQJLF3gZGXwX0Vl6Jg1KQFGu2slMhbm7EWlttUaAAAECBAgQIECAAAECBAgQKF0gFeS2Ix6VPpDc8leUq2dGdqLbH+rpWq8ECBAgQIAAAQIECBAgQIAAgYUI7MdRtiL2FnK0lh1EUa6+Cd+NrtNaa40AAQIECBAgQIAAAQIECBAgUJpAKshtR/QitBoEFOVqQB3oshPP70SkUz01AgQIECBAgAABAgRaLPDs5LjFozd0AgQKE0iX5UpnyB0WlndR6SrK1T9d6RTP7YhUYdYIECBAgAABAgQIEGipwOuzty0duWETIFCYwPeR705hOReZrqLcYqatX5h7spjDOQoBAgQIECBAgAABAgQIECBAYCqBtMrvu4gHU+1l45kFFOVmppt6x3TK53bEj1PvaQcCBAgQIECAAAECBAgQIECAQH0CB9H1dsSj+g6h52EBRblhkfpf349DpBtApAq0RoAAAQIECBAgQIAAAQIECBBYpkBa1bcVsbfMJNp4bEW55cx6Jw67HZEq0RoBAgQIECBAgAABAg0XeHH6r4aPsJnD21hdbebAjIrAB4G0mm874vDDW54tSkBRblHSHx8nVaBTJTpVpDUCBAgQIECAAAECBBos8OKNolyJ0/v12o0S05YzgUkE0uq9tIrv/iQb26YeAUW5elwn7TVVorcjXGduUjHbESBAgAABAgQIECBAgAABAvMI7MfO2xGdCG2JAopyS8QfOHSqTH8XkSrVGgECBAgQIECAAAECBAgQIECgDoHH0el2xF4dnetzOgFFuem86tz6UXS+FZEq1hoBAgQIECBAgAABAgQIECBAoEqB76OzuxGHVXaqr9kFFOVmt6tjz150mgpzP9bRuT4JECBAgAABAgQIEFiOwE9H/g68HHlHJUAgBNJNJu9EPKCRl4CiXF7z0c/mfjz5LuJl/w2PBAgQIECAAAECBAgQIECAAIEpBR7H9unkn70p97P5AgQU5RaAPOMhHsV+6Yfj7qwzAtqNAAECBAgQIECAAAECBAi0VCCd5PN9xN2Iw5YaZD9sRbm8p6gX6W1H/BChESBAgAABAgQIECBAgMACBb5aW1vg0RyKQGUC+9HTdsSDynrUUS0CinK1sFbe6W70eCcirQPXCBAgQIAAAQIECBAoTGDvKJ20opUmsLF6rbSU5UvgxyBIq+72UOQvoCiX/xz1M0w/qPTDSj8wjQABAgQIECBAgAABAgQIECDQF0gn8Xwbcb//hsf8BRTl8p+jwQwP40X6gaUfmn9qG5TxnAABAgQIECBAgAABAgQItFPgYQw7ncTTbefwyx21olyZc5d+aJsRjyM0AgQIECBAgAABAgQyFzg+e5t5htIjQKBAgXSyzncROxHpJB6tMAFFucImbCDd9IO7G5F+gOmHqBEgQIAAAQIECBAgkKnALyfHmWYmrcsE1ldXL/vYZwSWKfA4Dr4Z8WiZSTj2fAKKcvP55bB3+gFuRqTTVTUCBAgQIECAAAECBAgQqEjg67UbFfWkGwKVCRxET99GpJN0DivrVUdLEVCUWwp75QdNP8SdiPTDTD9QjQABAgQIECBAgAABAgQIEGiWwI8xnK2IbrOG1d7RKMo1a+7TDzP9QNMPVSNAgAABAgQIECBAIAOBvSMns2QwDVIgULLAfiSfTsK5H+EPlJJncih3RbkhkAa8TD/Q9EO9E5F+uBoBAgQIECBAgAABAgQIECBQnsDLSPmHiK2IboTWMAFFuYZN6MBw9uJ5+uF+H5F+yBoBAgQIECBAgAABAgQITCjw1drahFvajEAtAk+i1/R3+t1aetdpFgKKcllMQ61JPIjeNyMe1noUnRMgQIAAAQIECBAgMFLgJ8tXR7rk/ub66rXcU5RfMwUOYljfRWxH9CK0BgsoyjV4cgeGdhjPdyK+jdiP0AgQIECAAAECBAgQIECAAIF8BNIKtx8i0tlxj/JJSyZ1CijK1ambX9/dSCn9wO9FWNIaCBoBAgQIECBAgAABAgQIEFiywOM4fvq7+m7EYYTWEgFFuZZM9NAwO/F6MyJV4TUCBAgQIECAAAECBGoU2Dvy7+E18tbW9deuKVebrY7fC+zHs28j7kb0IrSWCSjKtWzCB4abqu+7EV9GPIzQCBAgQIAAAQIECBAgQOBcYMM15XwX6hM4iK7vRaSz47oRWksFFOVaOvEDw+7F852IbyOeRGgECBAgQIAAAQIECFQocHz2tsLedEWAQMEC6bTZHyJSMa4TobVcQFGu5V+AgeF34/l2RCrOHURoBAgQIECAAAECBAhUIPDLyXEFvehi0QLrq6uLPqTjNVvgxxjeZsRuRFq5phFYUZTzJRgW6MYbmxH3IhTnAkEjQIAAAQIECBAgQKB9Al+v3WjfoI24DoGH0emXEfcjFOPqEC64T0W5giev5tQ70f9mxL2IgwiNAAECBAgQIECAAIEpBZwlNyWYzQk0R+BhDOXLiJ2IXoRG4CMBRbmPSLwxJNCJ15sR9yIOIjQCBAgQIECAAAECBCYUcD25CaFsRqA5Ag9jKF9G7ET0IjQCYwUU5cbS+GBIoBOvNyPuRRxEaAQIECBAgAABAgQIXCFw5CYPVwjl+/HfNv6Yb3Iyy1HgYST1ZcRORC9CI3ClgKLclUQ2GBLoxOvNiHsRBxEaAQIECBAgQIAAAQJjBCxfHQPjbQLNEXgYQ/kyYieiF6ERmFhAUW5iKhsOCXTi9WbEvYj9CI0AAQIECBAgQIAAAQIECLRB4GUMUjGuDTNd8xgV5WoGbkH3nRjjVsS3EU8iNAIECBAgQIAAAQIEzgX2jtLf3bXSBO5YulralC0q3/SD/iFiM2InohehEZhZQFFuZjo7Dgl04/V2xJ2IhxEaAQIECBAgQIAAAQIECBBogsBBDOJexM2I3YjDCI3A3AKKcnMT6mBIYC9e70R8GfFDhH8aDASNAAECBAgQIECgnQLPTo7bOfDCR72xulr4CKRfkcCT6OfbiM2IToRGoFIBRblKOXU2INCL57sR6V8S7kXsR2gECBAgQIAAAQIEWiXw2t1Xi5zvr9duFJm3pCsRSCeW/BjxZcR2RDdCI1CLgKJcLaw6HRLoxOutiDsRDyPSH3IaAQIECBAgQIAAgUYLvDj9V6PHZ3AEGiawH+NJJ5RsRtyP6EVoBGoVUJSrlVfnQwL9pa2b8X76wy79oacRIECAAAECBAgQaKTAizeKcqVO7BefXC81dXlPJ5BOGEknjtyJSCeSdCIOIzQCCxFQlFsIs4MMCaQ/5DoR6Q+99Idf+kMw/WGoESBAgAABAgQIEGiMwJGlq8XO5RfXFeWKnbzJEt+PzdKJIpsROxF7ERqBhQtcW/gRHZDARYH0h9/O+Vvp8W7E/z1/7YEAAQIECBAgQIBAsQK/uMlDsXMn8UYKHMSoHkU8iOhFaASWLqAot/QpkMCAQCeep9iMSMW5nYi/RmgECBAgQIAAAQIEihM4dqZccXPWT/hvG3/sP/VYtkBakZUKcZ2IboRGICsBy1ezmg7JnAv04jH968VWxJcR30ekf9XQCBAgQIAAAQIECBQj8MvJ62JylSiBBgmkQtzDiO8ibkbsRHQjNALZCThTLrspkdCQQC9epwJdv0i3E8+3I5xBFwgaAQIECBAgQIBAvgLOlMt3bi7L7Ku1tcs+9lmeAv0z4h5Fet2IwzzTlBWBiwKKchc9vMpbYC/Su3+e4mY83o3YiVCgCwSNAAECBAgQIEAgLwHXlMtrPibNZn3VX5MntVrydoOFuEdLzsXhCcwk4E+bmdjslIFAL3J4cB6b8bgdkYp0bhIRCBoBAgQIECBAgMByBV6c/mu5CTj6zAIbq6sz72vH2gXSZY1SAS5FN0IjULSAolzR0yf5c4FePHbOIx7eFee2zx//R3pDI0CAAAECBAgQILBIgRdvFOUW6V3lsb5eu1Fld/qaX+BxdNGNSIW4XoRGoDECinKNmUoDGRDo/8vJ/XhvM2I74u7542fxqBEgQIAAAQIECBCoVeC5M+Vq9dV5owX2Y3TdiPT3uvSoEWisgKJcY6fWwM4FevHYOY94eHdH1+147IciXWBoBAgQIECAAAEC1Qo4U65az0X29reNPy7ycI61stIvwnUDI8VhhEagFQKKcq2YZoMcENiL5ykenL+3FY/bEf1Hy13PYTwQIECAAAECBAjMLvDLyevZd7YngWYLPInhdSPS38vS42GERqCVAopyrZx2gx4QSP9DkKLfbsaT7YitgUdn0wWGRoAAAQIECBAgMLnA8dnbyTe2ZVYCzpSrdDrSWXD9v3N1z59XegCdEShZQFGu5NmTex0Ch9Hpo/Po978ZT1KRLsX2+aNCXUBoBAgQIECAAAECowX2jtL/rdQItEpgsAC3FyPvtmr0BktgBgFFuRnQ7NI6gV6MOMWjiH67GU+2BmLz/LliXUBoBAgQIECAAIE2CzhLrtzZv+N6cpNMXiq+9SJS4S1F/3k81QgQmEZAUW4aLdsS+CBwGE+75/Hh3ZWVm/FiK2LzPNLz9N6/R2gECBAgQIAAAQItEPjl5LgFozTEhgscxPh6EXsRhxHd88f0WiNAoCIBRbmKIHVD4Fyg/z9Y40C2zz/YisebEZvnEQ8KdwlBI0CAAAECBAiULvD89F+lD6G1+f/Pdpwp1y+4pXnunrVmuSEAAABuSURBVE92Kralv8v0ziMeNAIE6hZQlKtbWP8ELgp0z1/2Hy9++uHV9oen7868SwW8ftuMJylGtc140x1kR8l4jwABAgQIECCwIIEXbxTlFkTdxsM8GTPoVFBLhbXBll6n91PrnUd6rhEgkInA/wd3ywC5gzuwNwAAAABJRU5ErkJggg=="></image>
</g>
</g>
</g>
</g>
</svg>
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<svg width="20px" height="20px" viewBox="0 0 20 20" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<!-- Generator: Sketch 53.2 (72643) - https://sketchapp.com -->
<title>矩形</title>
<desc>Created with Sketch.</desc>
<g id="页面-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
<g id="切图" transform="translate(-312.000000, -267.000000)">
<g id="分组" transform="translate(312.000000, 267.000000)">
<g id="手机-4" transform="translate(3.000000, 0.000000)" fill="#BFBFBF" fill-rule="nonzero">
<path d="M2.09150327,1.56163239e-16 C0.906318083,1.56163239e-16 0,0.914285714 0,2.10989011 L0,17.8637363 C0,18.989011 0.906318083,19.9736264 2.09150327,19.9736264 L6.97167756,19.9736264 C7.25054466,19.9736264 7.43016098,19.7734512 7.43016098,19.4921325 C7.43016098,19.2108138 7.32026144,18.9974518 6.97167756,18.9974518 L2.32011275,18.9974518 C1.62294499,18.9974518 0.860188802,18.2857143 0.860188802,17.5824176 L0.860188802,15.7538462 L12.3433801,15.7538462 L12.3433801,17.5824176 C12.3433801,18.2857143 11.6374421,18.9186813 10.9402743,18.9186813 C10.9402743,18.9186813 10.5979133,18.9363149 10.4588734,18.9974518 C10.3198335,19.0585887 10.2176551,19.1700867 10.2176551,19.4514054 C10.2176551,19.7327241 10.5180301,19.9032967 10.7968972,19.9032967 L11.2244009,19.9032967 C12.4095861,19.9032967 13.3159041,18.9186813 13.3159041,17.7934066 L13.3159041,2.10989011 C13.2461874,0.914285714 12.3398693,0 11.1546841,0 L2.09150327,1.56163239e-16 Z M0.862257778,14.9233433 L0.862257778,2.21072948 C0.862257778,1.4842944 1.51035182,0.830502831 2.2304563,0.830502831 L11.0157311,0.830502831 C11.7358355,0.830502831 12.3839296,1.4842944 12.3839296,2.21072948 L12.3839296,14.9233433 L0.862257778,14.9233433 Z" id="Shape"></path>
<path d="M8.22657952,2.12307692 L5.08932462,2.12307692 C4.81045752,2.12307692 4.53159041,2.33406593 4.53159041,2.68571429 C4.53159041,2.96703297 4.74074074,3.24835165 5.08932462,3.24835165 L8.22657952,3.24835165 C8.50544662,3.17802198 8.71459695,2.96703297 8.71459695,2.61538462 C8.71459695,2.33406593 8.50544662,2.12307692 8.22657952,2.12307692 L8.22657952,2.12307692 Z M7.45969499,16.8923077 L5.7167756,16.8923077 C5.4379085,16.8923077 5.22875817,17.0741259 5.22875817,17.3165501 C5.22875817,17.5589743 5.4379085,17.7407925 5.7167756,17.7407925 L7.45969499,17.7407925 C7.73856209,17.7407925 8.01742919,17.5589743 8.01742919,17.255944 C8.01742919,17.0741259 7.80827887,16.8923077 7.45969499,16.8923077 Z" id="Shape"></path>
</g>
<rect id="矩形" fill="#D8D8D8" opacity="0" x="0" y="0" width="20" height="20"></rect>
</g>
</g>
</g>
</svg>
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<svg width="20px" height="20px" viewBox="0 0 20 20" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<!-- Generator: Sketch 53.2 (72643) - https://sketchapp.com -->
<title>Group 9</title>
<desc>Created with Sketch.</desc>
<g id="页面-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
<g id="切图" transform="translate(-320.000000, -179.000000)" fill="#666666" fill-rule="nonzero">
<g id="Group-9" transform="translate(320.000000, 183.000000)">
<g id="Group-12">
<path d="M8.66701834,9.46570652 C7.30791394,8.87476767 6.42857143,7.51241956 6.42857143,5.99606099 C6.42857143,3.91861582 8.07394255,2.22857143 10.0963641,2.22857143 C12.118123,2.22857143 13.7628314,3.91861582 13.7628314,5.99606099 C13.7628314,7.48935192 12.9258988,8.84830772 11.6297466,9.457565 C11.2964314,9.61428931 10.9028146,9.46502805 10.7504041,9.12444103 C10.5979935,8.78453247 10.7437775,8.3815271 11.0764301,8.22480279 C11.9034229,7.83604508 12.4375224,6.96150987 12.4375224,5.99606099 C12.4375224,4.66695743 11.3872151,3.58549185 10.0963641,3.58549185 C8.80485046,3.58549185 7.75388043,4.66695743 7.75388043,5.99606099 C7.75388043,6.96693756 8.31581144,7.83875893 9.18587681,8.21733973 C9.52250529,8.36388714 9.67955441,8.76214328 9.53642104,9.10680106 C9.42907101,9.36461595 9.18388884,9.51998333 8.92611624,9.51998333 C8.83997116,9.51998333 8.7518381,9.50302183 8.66701834,9.46570652 Z" id="Shape"></path>
<path d="M9.99216722,12.0786272 C5.81147998,12.0786272 2.28417006,9.13546677 0.553316517,7.38096867 C0.196808387,7.01934937 0,6.5430703 0,6.03965282 C0,5.53555689 0.196808387,5.05927782 0.553316517,4.69765852 C2.28417006,2.94316041 5.81147998,0 9.99216722,0 C14.1728545,0 17.7001644,2.94316041 19.4303553,4.69765852 C19.7868634,5.05927782 19.9836718,5.53555689 19.9836718,6.03965282 C19.9836718,6.5430703 19.7868634,7.01934937 19.4303553,7.38096867 C19.1083052,7.70798649 18.8233638,7.9909044 18.339626,8.40747896 C18.0593231,8.64833234 17.6411881,8.61169549 17.4059458,8.32470682 C17.1707034,8.03771815 17.2064868,7.60960976 17.4867896,7.36875639 C17.9334188,6.98406945 18.1872154,6.73168224 18.4980004,6.4168767 C18.6013745,6.31171537 18.6583628,6.17805871 18.6583628,6.03965282 C18.6583628,5.90124694 18.6013745,5.76691182 18.4980004,5.66242894 C17.2210652,4.36792686 13.8368886,1.35692043 9.99216722,1.35692043 C6.14744581,1.35692043 2.76260662,4.36792686 1.48633405,5.66242894 C1.38295995,5.76691182 1.325309,5.90124694 1.325309,6.03965282 C1.325309,6.17805871 1.38295995,6.31171537 1.48633405,6.41619825 C2.76260662,7.71137878 6.14744581,10.7217068 9.99216722,10.7217068 C11.9701909,10.7217068 13.7003818,10.1321248 15.6015376,8.81048433 C15.9050333,8.59880475 16.3172044,8.68021998 16.5219647,8.99027629 C16.7280502,9.30033261 16.6491943,9.7216564 16.3463612,9.93265753 C14.2411079,11.3967747 12.221337,12.0786272 9.99216722,12.0786272" id="Shape"></path>
</g>
</g>
</g>
</g>
</svg>
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<svg width="20px" height="20px" viewBox="0 0 20 20" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<!-- Generator: Sketch 53.2 (72643) - https://sketchapp.com -->
<title>矩形 copy</title>
<desc>Created with Sketch.</desc>
<g id="页面-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
<g id="切图" transform="translate(-348.000000, -267.000000)">
<g id="分组-4" transform="translate(348.000000, 267.000000)">
<g id="密码" transform="translate(2.000000, 1.000000)" fill="#BFBFBF" fill-rule="nonzero">
<path d="M14.3399249,7.05417601 L3.67617752,7.05417601 L3.67617752,5.35338327 C3.67617752,3.03430719 5.60720881,1.1465916 7.98159984,1.1465916 C10.3559909,1.1465916 12.2870222,3.0363613 12.2870222,5.35749147 C12.2870222,5.6717684 12.5454736,5.92647649 12.8690632,5.92647649 C13.1905515,5.92647649 13.4511042,5.67382249 13.4511042,5.35749147 C13.4490029,2.40780748 10.9947651,0.0106756959 7.98159984,0.0106756959 C6.5212443,0.0106756959 5.14703922,0.565282021 4.11533479,1.57589799 C3.08152914,2.58445986 2.51419676,3.92578552 2.51419676,5.35338327 L2.51419676,7.05417601 L1.2891791,7.05417601 C0.576861801,7.05417601 0.00532696109,7.61289053 0.00532694056,8.30717549 L0.00532694056,16.934385 C0.00532694056,17.630724 0.578963004,18.2079254 1.2891791,18.2079254 L14.3399249,18.2079254 C15.0522422,18.2079254 15.6384857,17.6327781 15.6384856,16.934385 L15.6384856,8.30717549 C15.6405869,7.61083644 15.0543434,7.05417601 14.3399249,7.05417601 L14.3399249,7.05417601 Z M14.4786061,16.9467096 C14.4786061,17.0165489 14.4197717,17.0740636 14.3483298,17.0740636 L1.29548279,17.0740636 C1.22404093,17.0740636 1.16520647,17.0165489 1.16520647,16.9467096 L1.16520647,8.31744598 C1.16520647,8.24760665 1.22404093,8.19009193 1.29548279,8.19009193 L14.3462286,8.19009193 C14.4176704,8.19009193 14.4765049,8.24760665 14.4765049,8.31744598 L14.4765049,16.9467096 L14.4786061,16.9467096 L14.4786061,16.9467096 Z M7.71684475,9.99769771 C7.05915944,9.99769771 6.52754801,10.5173844 6.52754799,11.1603169 C6.52754799,11.583461 6.76078463,11.9552526 7.10958898,12.1586083 L7.10958898,14.4119532 C7.10958898,14.7241761 7.37014163,14.9809383 7.69162996,14.9809382 C8.01311829,14.9809382 8.27367096,14.7262302 8.27367096,14.4119532 L8.27367096,12.1873657 C8.65189255,11.9942805 8.90824273,11.6060561 8.90824273,11.1603169 C8.90404026,10.5173844 8.37453005,9.99769773 7.71684475,9.99769771 L7.71684475,9.99769771 Z" id="Shape"></path>
</g>
<rect id="矩形-copy" fill="#D8D8D8" opacity="0" x="0" y="0" width="20" height="20"></rect>
</g>
</g>
</g>
</svg>
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<svg width="490px" height="101px" viewBox="0 0 490 101" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<!-- Generator: Sketch 53.2 (72643) - https://sketchapp.com -->
<title>矩形</title>
<desc>Created with Sketch.</desc>
<defs>
<filter x="-6.8%" y="-58.8%" width="113.6%" height="217.6%" filterUnits="objectBoundingBox" id="filter-1">
<feGaussianBlur stdDeviation="10" in="SourceGraphic"></feGaussianBlur>
</filter>
</defs>
<g id="页面-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd" opacity="0.4">
<g id="切图" transform="translate(-287.000000, -29.000000)" fill="#449284">
<rect id="矩形" filter="url(#filter-1)" x="312" y="54" width="440" height="51" rx="3"></rect>
</g>
</g>
</svg>
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<svg width="112px" height="6px" viewBox="0 0 112 6" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<!-- Generator: Sketch 53.2 (72643) - https://sketchapp.com -->
<title>矩形</title>
<desc>Created with Sketch.</desc>
<g id="页面-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd" opacity="0.300000012">
<g id="切图" transform="translate(-123.000000, -66.000000)" fill="#449284">
<rect id="矩形" x="123" y="66" width="112" height="6"></rect>
</g>
</g>
</svg>
\ No newline at end of file
<template>
<div class="custom-textarea" :class="errTips ? 'err-border' : ''">
<textarea v-model="inputContent" :placeholder="placeholderTxt" @input="inputHandler" @blur="inputHandlerBlur" :maxlength="maxlength" :rows="rows"></textarea>
<div class="txt-wrap">{{computedNum}}/{{maxlength}}</div>
</div>
</template>
<script>
export default {
data(){
return{
inputContent: ''
}
},
props: {
maxlength: {
type: Number,
default: 30
},
rows: {
type: Number,
default: 3
},
placeholderTxt: String,
inputContentFrom: String,
errTips: {
type: Boolean,
default: false
}
},
computed: {
computedNum(){
return this.inputContent.length
}
},
mounted(){
console.log('外部内容',this.inputContentFrom)
if(this.inputContentFrom){
this.inputContent = this.inputContentFrom;
}
},
methods: {
inputHandler(){
this.$emit('inputHandler',this.inputContent)
},
inputHandlerBlur(){
this.$emit('inputHandlerBlur',this.inputContent)
}
}
}
</script>
<style scoped lang="scss">
.custom-textarea{
width: 60%;
border: 1px solid #DCDFE6;
padding: 5px 15px;
border-radius: 4px;
&.err-border{
border-color: #F56C6C;
}
textarea{
outline: none;
color: #606266;
resize: none;
width: 100%;
}
::-webkit-input-placeholder {
color: #999;
}
.txt-wrap{
line-height: 20px;
text-align: right;
color: #606266;
}
}
</style>
<template>
<el-dialog title="本次随访详情" :visible.sync="dialogFormVisible" center :close-on-click-modal="false" :close-on-press-escape="false" width="800px">
<!--<el-form ref="statusForm" :model="statusForm" :rules="rules" label-suffix=":" label-width="120px">-->
<!--<el-form-item label="居民" style="margin-bottom:0;">-->
<!--<span>{{statusForm.nickname}}</span>-->
<!--</el-form-item>-->
<!--<el-form-item label="变更状态">-->
<!--<span>{{statusForm.status==1 ? '未完成' : '已完成'}}</span>-->
<!--</el-form-item>-->
<!--<el-form-item label="*变更原因" prop="reason" class="required-item">-->
<!--<custom-textarea-->
<!--:placeholderTxt="placeholderTxt"-->
<!--:inputContentFrom="statusForm.reason"-->
<!--@inputHandler="inputHandler"-->
<!--@inputHandlerBlur="inputHandlerBlur"></custom-textarea>-->
<!--</el-form-item>-->
<!--</el-form>-->
<div slot="footer" class="dialog-footer">
<el-button @click="dialogFormVisible = false">取 消</el-button>
<el-button type="primary" @click="save">确 定</el-button>
</div>
</el-dialog>
</template>
<script>
export default {
data(){
return{
// dialogFormVisible: true
}
},
props: {
dialogFormVisible: {
type: Boolean,
default: false
}
},
computed: {
},
mounted(){
},
methods: {
save(){
this.dialogFormVisible = false;
},
}
}
</script>
<style scoped lang="scss">
</style>
<template>
<div class="form-box">
<el-row>
<el-col
v-for="(item, index) in dataSource"
:span="item.spanNum ? item.spanNum : spanNum"
:class="item.className"
:offset="item.offset"
:key="index" >
<el-form-item
v-if="isParent(item)"
:prop="item.prop"
:label="item.label"
:rules="item.rules"
:label-width="item.labelWidth"
:required="item.required"
:class="item.className"
:error="item.error">
<!-- div文本 -->
<div v-if="item.formType === 'div'" :class="item.className">{{ item.name }}</div>
<!--button-->
<el-button
v-if="item.formType === 'button'"
type="primary"
@click="item.clickFunc ? item.clickFunc($event) : defaultClick($event)"
:icon="item.icon">{{ item.btnText }}
</el-button>
<!-- input -->
<el-input
v-else-if="item.formType === 'input'"
v-model.trim="form[item.model]"
:refs="item.refs"
:type="item.type"
:class="item.className"
:disabled="item.disabled"
:maxlength="item.maxlength"
:minlength="item.minlength"
:placeholder="item.placeholder"
@blur="item.blurFunc ? item.blurFunc($event) : defaultBlur($event)"
@change="item.changeFun ? item.changeFun($event) : defaultFun($event)">
<template
v-for="slot in item.slots || []"
:slot="slot.type">{{ slot.name }}</template>
</el-input>
<!-- label -->
<label
v-else-if="item.formType === 'label'"
:class="item.className"
:disabled="item.disabled">{{ form[item.model]==''?'-':form[item.model] }}{{ item.suffix }}
</label>
<!-- select -->
<el-select
v-else-if="item.formType === 'select'"
v-model="form[item.model]"
:multiple="item.multiple"
:placeholder="item.placeholder"
@change="item.changeFun ? item.changeFun($event) : defaultFun($event)">
<el-option
v-for="(opt, index2) in item.options"
:key="index2"
:label="opt.label"
:value="opt.value"/>
</el-select>
<!-- checkbox -->
<el-checkbox-group
v-else-if="item.formType === 'checkbox'"
v-model="form[item.model]"
@change="item.changeFun ? item.changeFun($event) : defaultFun($event)"
>
<el-checkbox
v-for="(opt, ck) in item.options"
:key="ck"
:label="opt.value"
>
{{ opt.label }}
</el-checkbox>
</el-checkbox-group>
<!-- radios -->
<el-radio-group
v-else-if="item.formType === 'radio'"
v-model="form[item.model]"
@change="item.changeFun ? item.changeFun($event) : defaultFun($event)"
>
<el-radio
v-for="(opt, rad) in item.options"
:key="rad"
:label="opt.value">
{{ opt.label }}
</el-radio>
</el-radio-group>
<!-- switch-->
<el-switch
v-else-if="item.formType === 'switch'"
v-model="form[item.model]"/>
<!-- transfer-->
<el-transfer
v-else-if="item.formType === 'transfer'"
v-model="form[item.model]"
:data="item.data"/>
<!-- 时间 -->
<el-date-picker
v-else-if="item.formType === 'date-picker'"
v-model="form[item.model]"
:disabled="item.disabled"
:editable="false"
:type="item.dateType || dateType"
:placeholder="item.placeholder"
:format="item.format || format"
:value-format="item.valueFormat || valueFormat"
@change="item.changeFun ? item.changeFun($event) : defaultFun($event)"/>
<!-- 图片 -->
<img v-else-if="item.formType === 'img'" :src="item.src||''" :alt="item.alt||''" :width="item.width">
<!--循环遍历-->
<el-row
v-else-if="item.formType === 'list'"
v-for="(itemChild, indexChild) in form[item.model]"
:key="indexChild"
style="width: 800px;margin-bottom: 15px;font-size:18px;color:#606266;">
<el-col :span="24">
<span>{{itemChild.medicinesName}}:</span>
<span>每日{{itemChild.dosageDay}}次,</span>
<span>每次{{itemChild.dosageNum}}</span>
<el-button
type="plain"
icon="el-icon-delete"
class="margin-left-20"
@click="clickDeleteFunc(form[item.model], indexChild)">删除</el-button>
</el-col>
</el-row>
</el-form-item>
</el-col>
</el-row>
</div>
</template>
<script>
import _ from 'lodash'
export default {
props: {
ruleNew: Boolean,//用于关联跨模块交互
dataSource: {
type: Array,
default: () => []
},
form: {
type: Object,
default: () => {}
}
},
watch: {
form(val){
this.form = val
this.$forceUpdate()
},
},
data() {
return {
spanNum: 6,
// valueFormat: 'timestamp',
// valueFormat: 'yyyy-MM-dd',
// format: 'yyyy',
// dateType: 'datetime'
}
},
methods: {
defaultClick(){},
defaultFun() {},
defaultBlur(){},
isParent(item) {
if (!item.linkageRule) {
return true
} else {
let num = 0
item.linkageRule.forEach(t => {
if (this.form[t.name] == null) {
return false
}
if (typeof this.form[t.name] === 'string') {
if (t.value.includes(this.form[t.name])) {
num += 1
}
} else {
const nameVal = this.form[t.name]
const valType = _.isArray(nameVal) ? nameVal : Array.of(nameVal)
const bool = _.intersection(valType, t.value)
if (_.isArray(bool) && bool.length > 0) {
num += 1
}
}
})
if (num !== item.linkageRule.length) {
delete this.form[item.model]
}
return num === item.linkageRule.length
}
},
clickDeleteFunc(list, index) {
list.splice(index, 1);
},
}
}
</script>
<style lang="scss" scoped>
</style>
<style lang="scss">
.form-template .screenSet{
margin: 88px 30px 0px;
overflow: visible !important;
}
.form-box {
padding: 20px 0px;
.sec-title{
font-size: 18px;
float: none;
font-weight: bold;
margin-left: 0;
overflow: hidden;
height: auto;
}
.color-gray{
color: #a7a7a7;
}
.el-form-item.is-required:not(.is-no-asterisk)>.el-form-item__label:before {
content: '*';
color: #F56C6C;
margin-right: 10px;
}
.el-date-editor{
width: 100%;
}
.el-form-item__label,
.el-radio__label {
font-size: 18px;
}
.float-none{
float: none;
.el-form-item__label,
.el-form-item__content{
display: block;
float: none;
}
}
.obj-form-title{
.el-form-item__label,
.el-form-item__content{
display: block;
float: none;
}
.el-form-item__content{
margin-left: 15px;
.el-radio{
margin-top: 5px;
}
}
}
.title-obj{
font-size: 20px;
}
.el-form-item__label{
font-weight: bold;
}
.obj-form-title2{
margin-left: 15px;
.el-checkbox__label{
font-size: 18px;
}
}
.obj-form-title3{
margin-left: 25px;
}
.obj-form-title4{
margin-left: 35px;
}
.radio-block{
.el-radio-group{
.el-radio{
display: block;
}
}
}
.el-checkbox__input.is-checked+.el-checkbox__label {
color: #449284 !important;
}
.margin-left-20{
margin-left: 20px;
}
.margin-left-40{
margin-left: 40px;
}
.margin-left-60{
margin-left: 60px;
}
.margin-left-80{
margin-left: 80px;
}
}
</style>
...@@ -10,7 +10,9 @@ import vueFilters from '@/utils/filter' ...@@ -10,7 +10,9 @@ import vueFilters from '@/utils/filter'
// 引入ElementUI // 引入ElementUI
import ElementUI from 'element-ui' import ElementUI from 'element-ui'
import 'element-ui/lib/theme-chalk/index.css'; import 'element-ui/lib/theme-chalk/index.css';
//引入滚动加载分页
import infiniteScroll from 'vue-infinite-scroll'
Vue.use(infiniteScroll)
// 可调试 // 可调试
// Vue.config.devtools = true; // Vue.config.devtools = true;
// Vue.use(Logger, { prefix: new Date(), isDev: process.env.NODE_ENV === 'development', cLevel: 'debug' }) // Vue.use(Logger, { prefix: new Date(), isDev: process.env.NODE_ENV === 'development', cLevel: 'debug' })
......
const followUp = r => require.ensure([], () => r(require('../views/followup/layout.vue')), 'followUp');
/*计划*/
const planManage = r => require.ensure([], () => r(require('../views/followup/plan-manage/layout.vue')), 'planManage');
const planList = r => require.ensure([], () => r(require('../views/followup/plan-manage/plan-list.vue')), 'planList');
const planDetail = r => require.ensure([], () => r(require('../views/followup/plan-manage/plan-detail.vue')), 'planDetail');
const planModify = r => require.ensure([], () => r(require('../views/followup/plan-manage/plan-modify.vue')), 'planModify');
const residentList = r => require.ensure([], () => r(require('../views/followup/plan-manage/resident-list.vue')), 'residentList');
const residentDetail = r => require.ensure([], () => r(require('../views/followup/plan-manage/resident-detail.vue')), 'residentDetail');
const newPlan = r => require.ensure([], () => r(require('../views/followup/plan-manage/new-plan.vue')), 'newPlan');
/*预约*/
const reservationManage = r => require.ensure([], () => r(require('../views/followup/reservation-manage/layout.vue')), 'reservationManage');
const reservationList = r => require.ensure([], () => r(require('../views/followup/reservation-manage/reservation-list.vue')), 'reservationList');
/*录入*/
const recordManage = r => require.ensure([], () => r(require('../views/followup/record-manage/layout.vue')), 'recordManage');
const recordList = r => require.ensure([], () => r(require('../views/followup/record-manage/record-list.vue')), 'recordList');
const formTemplate = r => require.ensure([], () => r(require('../views/followup/record-manage/form-template.vue')), 'formTemplate');//量表模板
const followRouters = {
path: '/followup',
name: 'followUp',
component: followUp,
redirect: 'followup/plan-manage/planList',
children: [
{
path: 'plan-manage',
component: planManage,
name: 'planManage',
redirect: 'plan-manage/plan-list',
children: [
{
path: 'plan-modify',
component: planModify,
name: 'planModify',
meta: {
title: '修改计划',
keepAlive: false //页面不需要缓存
},
},
{
path: 'plan-detail',
component: planDetail,
name: 'planDetail',
meta: {
title: '查看计划',
keepAlive: false //页面不需要缓存
},
},
{
path: 'plan-list',
component: planList,
name: 'planList',
meta: {
title: '计划列表',
keepAlive: false //页面不需要缓存
},
},
{
path: 'resident-list',
component: residentList,
name: 'residentList',
meta: {
title: '居民列表',
keepAlive: false //页面不需要缓存
},
},
{
path: 'resident-detail',
component: residentDetail,
name: 'residentDetail',
meta: {
title: '居民详情',
keepAlive: false //页面不需要缓存
},
},
{
path: 'new-plan',
component: newPlan,
name: 'newPlan',
meta: {
title: '新建随访计划',
keepAlive: false //页面不需要缓存
},
},
],
meta: {
title: '计划管理',
},
},
{
path: 'reservation-manage',
component: reservationManage,
name: 'reservationManage',
redirect: 'reservation-manage/reservation-list',
children: [
{
path: 'reservation-list',
component: reservationList,
name: 'reservationList',
meta: {
title: '预约列表',
keepAlive: false
},
},
],
meta: {
title: '预约管理',
},
},
{
path: 'record-manage',
component: recordManage,
name: 'recordManage',
redirect: 'record-manage/record-list',
children: [
{
path: 'record-list',
component: recordList,
name: 'recordList',
meta: {
title: '录入列表',
keepAlive: false
},
},
{
path: 'form-template',
component: formTemplate,
name: 'formTemplate',
meta: {
title: '录入量表',
keepAlive: false
},
},
],
meta: {
title: '录入管理',
},
},
],
};
export default followRouters
import App from '../App' import App from '../App'
const login = r => require.ensure([], () => r(require('../views/login')), 'login')
const home = r => require.ensure([], () => r(require('../views/home')), 'home') const home = r => require.ensure([], () => r(require('../views/home')), 'home')
const blank = r => require.ensure([], () => r(require('../views/blank')), 'blank') const blank = r => require.ensure([], () => r(require('../views/blank')), 'blank')
const itemManager = r => require.ensure([], () => r(require('../views/education/item-manager.vue')), 'item-manager') const itemManager = r => require.ensure([], () => r(require('../views/education/item-manager.vue')), 'item-manager')
...@@ -11,10 +13,17 @@ const itemRole = r => require.ensure([], () => r(require('../views/system/item-r ...@@ -11,10 +13,17 @@ const itemRole = r => require.ensure([], () => r(require('../views/system/item-r
import patientsRouters from './patients' import patientsRouters from './patients'
import followRouters from './follow'
export default [{ export default [{
path: '/', path: '/',
component: App, component: App,
children: [ children: [
{
path: '/login',
component: login,
name: 'loginPage',
},
{ {
path: '', path: '',
redirect: '/home' redirect: '/home'
...@@ -46,6 +55,7 @@ export default [{ ...@@ -46,6 +55,7 @@ export default [{
path: '/item-role', path: '/item-role',
component: itemRole component: itemRole
}, },
followRouters,
patientsRouters, patientsRouters,
] ]
}] }]
import planManage from './planManage'
import reservationManage from './reservationManage'
import workbench from './workbench'
import recordManage from './recordManage'
const followModules = {
planManage,
reservationManage,
workbench,
recordManage
}
export default followModules
import {getPlanList,
getPlanDetail,
getNodeTimeList,
getNodeTimeContent,
getResidentList,
getGroupList,
getResidentDetail,
getBasicData,
getFormOptions,
getFollowupTemplate,
createFollowPlan,
getFollowStartTimeList} from '../../utils/followup/followapis'
export default {
namespaced: true,
state: {
residentList: { //居民列表
pageNum: 1, //当前页码
pageSize: 10, //每页数据大小
total: null, //总数
},
groupList: [], //分组列表
residentDetail: {}, //居民详情,
planDetail: {}, // 计划详情页,
nodeTimeList: [], //随访时间节点列表,
nodeContent: {}, //时间节点详情
planOption: [], //随访计划select
timeNodeList: [],
setTimeNodeList: [], //新建计划设置时间节点
planList: {}, //随访计划列表
remarkOption: [], //随访计划备注常量
markOptions: [], //随访 随访时间节点单位 常量
followTypeList: [], //随访 随访方式 常量
remindOptions: [], //随访 提醒医生天数 常量
pushTimeOptions: [], //随访 推送患教提醒天数 常量
planStatusOption: [], //随访计划状态常量
formOptions: [],// 获取量表
templateOptions: [ // 获取随访计划模板
{
id: 0,
name: '自定义模板'
}
],
followStartTimeList: [], //随访时间
residentCrumb: [], //居民面包屑
planModifyCrumb: [], //修改计划面包屑
selectResidentList: [], //修改计划已选居民
},
mutations: {
GET_RESIDENT_LIST(state, payload) {
state.residentList = payload
},
GET_GROUP_LIST(state, payload) {
state.groupList = payload
},
GET_FOLLOW_START_TIME_LIST(state, payload) {
state.followStartTimeList = payload
},
GET_RESIDENT_DETAIL(state, payload) {
state.residentDetail = payload
state.timeNodeList = payload.fPlanDto.fPlanTimeReqList
},
GET_PLAN_DETAIL(state, payload) {
state.planDetail = payload
},
GET_REMARK_OPTION(state, payload) {
state.remarkOption = payload.P211
},
GET_DATE_UNIT(state, payload){
state.markOptions = payload.P017
},
GET_FOLLOW_TYPE_LIST(state, payload){
state.followTypeList = payload.P212
},
GET_REMIND_OPTIONS(state, payload){
state.remindOptions = payload.P213
},
GET_PUSH_TIME_OPTIONS(state, payload){
state.pushTimeOptions = payload.P214
},
GET_PLAN_STATUS_OPTION(state, payload) {
state.planStatusOption = payload.P216
},
GET_NODE_TIME_LIST(state, payload) {
state.nodeTimeList = payload
},
GET_NODE_CONTENT(state, payload) {
state.nodeContent = payload
},
GET_PLAN_OPTION(state, payload) {
state.planOption = payload.fPlanDtoList
},
SET_TIME_NODE_LIST(state, payload) {
state.setTimeNodeList = payload;
},
GET_PLAN_LIST(state, payload) {
state.planList = payload
},
GET_FORM_OPTIONS(state, payload){
state.formOptions = payload
},
GET_FOLLOW_TEMPLATE(state, payload){
state.templateOptions = [
{
id: 0,
name: '自定义模板'
}
]
state.templateOptions = state.templateOptions.concat(payload)
},
SET_RESIDENT_CRUMB(state, payload){
state.residentCrumb = payload
sessionStorage.setItem('residentCrumb', JSON.stringify(state.residentCrumb));
},
SET_PLAN_MODIFY_CRUMB(state, payload) {
state.planModifyCrumb = payload
sessionStorage.setItem('planModifyCrumb', JSON.stringify(state.planModifyCrumb));
},
GET_SELECT_RESIDENT(state, payload) {
state.selectResidentList = payload.fPlanPatientInfoDtoList
}
},
actions: {
setFollowPlan(context, payload) {
createFollowPlan({
...payload
}).then(({data})=> {
// console.log('成功',data)
})
},
getResidentList(context, payload) {
const { pageSize, pageNum } = context.state.residentList;
getResidentList({
pageSize,
pageNum,
...payload
}).then(({data}) => {
context.commit('GET_RESIDENT_LIST', data);
context.dispatch('getSelectResident',{
planId: payload.planId
})
});
},
getGroupList(context, payload) {
getGroupList({}).then(({data}) => {
context.commit('GET_GROUP_LIST', data);
});
},
getFollowStartTimeList(context, payload) {
getFollowStartTimeList(payload).then(({data}) => {
context.commit('GET_FOLLOW_START_TIME_LIST', data);
});
},
getResidentDetail(context, payload) {
getResidentDetail(
payload.planId,
payload.patientId,
payload.fuPlanPatientId
).then(({data}) => {
context.commit('GET_RESIDENT_DETAIL', data);
});
},
getPlanDetail(context, payload) {
getPlanDetail(payload).then(({data}) => {
context.commit('GET_PLAN_DETAIL', data);
context.dispatch('getSelectResident',{
planId: data.id
})
});
},
getRemarkOption(context, payload) {
getBasicData({
numList: 'P211'
}).then(({data}) => {
context.commit('GET_REMARK_OPTION', data);
});
},
getDateUnit(context, payload){
// 随访时间节点单位
getBasicData({
numList: 'P017'
}).then(({data})=>{
context.commit('GET_DATE_UNIT', data);
})
},
getFollowTypeList(context, payload){
// 随访方式
getBasicData({
numList: 'P212'
}).then(({data})=>{
context.commit('GET_FOLLOW_TYPE_LIST', data);
})
},
getRemindOptions(context, payload){
// 提醒医生天数
getBasicData({
numList: 'P213'
}).then(({data})=>{
context.commit('GET_REMIND_OPTIONS', data);
})
},
getPushTimeOptions(context, payload){
// 推送患教提醒天数
getBasicData({
numList: 'P214'
}).then(({data})=>{
context.commit('GET_PUSH_TIME_OPTIONS', data);
})
},
getFormOptions(context, payload){
// 获取量表
getFormOptions().then(({data})=>{
context.commit('GET_FORM_OPTIONS', data);
})
},
getFollowupTemplate(context, payload){
// 获取随访模板
getFollowupTemplate().then(({data})=>{
context.commit('GET_FOLLOW_TEMPLATE', data);
})
},
getPlanStatusOption(context, payload) {
getBasicData({
numList: 'P216'
}).then(({data}) => {
context.commit('GET_PLAN_STATUS_OPTION', data);
});
},
getNodeTimeList(context, payload) {
getNodeTimeList(payload).then(({data}) => {
context.commit('GET_NODE_TIME_LIST', data);
});
},
getNodeTimeContent(context, payload) {
getNodeTimeContent(payload).then(({data}) => {
context.commit('GET_NODE_CONTENT', data);
});
},
getPlanOptions(context, payload) {
getPlanList({
pageNo: -1
}).then(({data}) => {
context.commit('GET_PLAN_OPTION', data);
});
},
/*async changePlan(context, payload) {
changePlan({
...payload
}).then(({data}) => {
return data
});
},*/
getTimeNodeList(context, payload){
context.commit('SET_TIME_NODE_LIST', payload);
},
async getPlanList(context, payload) {
await getPlanList({
...payload
}).then(({data}) => {
context.commit('GET_PLAN_LIST', data);
});
},
setResidentCrumb(context, payload) {
context.commit('SET_RESIDENT_CRUMB', payload);
},
setPlanModifyCrumb(context, payload) {
context.commit('SET_PLAN_MODIFY_CRUMB', payload);
},
getSelectResident(context, payload) {
getResidentList({
needEnd: 1,
...payload
}).then(({data}) => {
context.commit('GET_SELECT_RESIDENT', data);
});
}
},
}
import {getEnteringList, getEnteringInfo, getFormList} from '../../utils/followup/followapis'
export default {
namespaced: true,
state: {
recordList: {}, //录入列表
enteringInfo: {}, //单条信息查看
constantsData: {},//获取常量
formList: {}, //获取量表列表
},
mutations: {
GET_RECORD_LIST(state, payload) {
state.recordList = payload
},
GET_ENTERING_INFO(state, payload) {
state.enteringInfo = payload
},
GET_CONSTANS_DATA(state, payload) {
state.constantsData = payload
},
GET_FORM_LIST(state, payload) {
state.formList = payload
},
},
actions: {
async getRecordList(context, payload) {
await getEnteringList({
...payload
}).then(({data}) => {
context.commit('GET_RECORD_LIST', data);
});
},
async getEnteringInfo(context, payload) {
await getEnteringInfo(payload.patientId, payload.fuPlanPatientTimesId).then(({data}) => {
context.commit('GET_ENTERING_INFO', data);
});
},
async getFormList(context, payload) {
await getFormList(payload).then(({data}) => {
context.commit('GET_FORM_LIST',data)
})
}
},
}
import {getReservationList,
getCheckReservation,
getReservationPatients,
getBasicData} from '../../utils/followup/followapis'
export default {
namespaced: true,
state: {
reservationList: { //居民列表
pageNo: 1, //当前页码
pageSize: 10, //每页数据大小
count: null, //总数
},
checkRevervationData: {},//发送预约校验
constantsData: {},//获取常量
getRevervationNum: null, //查看已预约人数
userName: '',
},
mutations: {
GET_RESERVATION_LIST(state, payload) {
state.reservationList = payload;
},
GET_CHECK_RESERVATION(state, payload) {
state.checkRevervationData = payload
},
GET_CONSTANS_DATA(state, payload) {
state.constantsData = payload
},
GET_REVERVATION_NUM(state, payload) {
state.getRevervationNum = payload
},
GET_USER_NAME(state, payload) {
state.userName = payload
}
},
actions: {
getReservationList(context, payload) {
const { pageNo, pageSize } = context.state.reservationList;
getReservationList({
pageNo,
pageSize,
...payload
}).then(({data}) => {
context.commit('GET_RESERVATION_LIST', data);
});
},
async getCheckReservation(context, payload) {
await getCheckReservation({
...payload
}).then(({data}) => {
context.commit('GET_CHECK_RESERVATION', data)
})
},
async getConstantsData(context, payload) {
await getBasicData({
...payload
}).then(({data}) => {
context.commit('GET_CONSTANS_DATA', data)
})
},
getReservationPatients(context, payload) {
getReservationPatients({
...payload
}).then(({data}) => {
context.commit('GET_REVERVATION_NUM', data)
})
},
getUserName(context, payload) {
context.commit('GET_USER_NAME', payload)
},
// getConstantsData({commit}) {
// return new Promise(async (resolve, reject)=>{
// const res = await followApi.getBasicData({
// ...payload
// });
// if (res === null) return;
// commit('GET_CONSTANS_DATA', res);
// resolve() // 接口请求完成
// })
// }
},
}
import {getTodayAppointsList, getTodayOverview, getTodayPlans} from '@/utils/followup/followapis'
export default {
namespaced: true,
state: {
todayPlansList: [], //今日随访列表
todayAppointsList: [], //今日预约列表
todayOverview: [], //查询今日随访、预约、随访人数count
},
mutations: {
GET_TODAY_PLAN_LIST(state, payload) {
// console.log('返回数据', payload)
state.todayPlansList = payload
},
GET_TODAY_APPOINTS_LIST(state, payload) {
state.todayAppointsList = payload
},
GET_TODAY_OVERVIEW(state, payload) {
state.todayOverview = payload
}
},
actions: {
getTodayPlansList(context, payload) {
getTodayPlans({
...payload
}).then(({data}) => {
context.commit('GET_TODAY_PLAN_LIST', data);
});
},
getTodayAppointsList(context, payload) {
getTodayAppointsList({
...payload
}).then(({data}) => {
context.commit('GET_TODAY_APPOINTS_LIST', data);
});
},
getTodayOverview(context, payload) {
getTodayOverview({
...payload
}).then(({data}) => {
context.commit('GET_TODAY_OVERVIEW', data);
});
}
},
}
import Vue from 'vue' import Vue from 'vue'
import Vuex from 'vuex' import Vuex from 'vuex'
import common from './education/common' import common from './education/common';
//随访
import followModules from './followup/index';
import getters from './getters' import getters from './getters'
...@@ -8,7 +10,8 @@ Vue.use(Vuex) ...@@ -8,7 +10,8 @@ Vue.use(Vuex)
export default new Vuex.Store({ export default new Vuex.Store({
modules: { modules: {
common common,
...followModules
}, },
getters getters
}) })
......
...@@ -26,35 +26,35 @@ body, div, span, header, footer, nav, section, aside, article, ul, dl, dt, dd, l ...@@ -26,35 +26,35 @@ body, div, span, header, footer, nav, section, aside, article, ul, dl, dt, dd, l
} }
} }
/*定义滚动条高宽及背景 高宽分别对应横竖滚动条的尺寸*/ /*定义滚动条高宽及背景 高宽分别对应横竖滚动条的尺寸*/
::-webkit-scrollbar ::-webkit-scrollbar
{ {
width: 0px; width: 0px;
height: 0px; height: 0px;
background-color: #fff;
}
/*定义滚动条轨道 内阴影+圆角*/
::-webkit-scrollbar-track
{
-webkit-box-shadow: inset 0 0 1px rgba(0,0,0,0);
border-radius: 10px;
background-color: #fff; background-color: #fff;
} }
/*定义滑块 内阴影+圆角*/ /*定义滚动条轨道 内阴影+圆角*/
::-webkit-scrollbar-thumb ::-webkit-scrollbar-track
{ {
border-radius: 10px; -webkit-box-shadow: inset 0 0 1px rgba(0,0,0,0);
-webkit-box-shadow: inset 0 0 6px rgba(0,0,0,.3); border-radius: 10px;
background-color: #555; background-color: #fff;
} }
/*定义滑块 内阴影+圆角*/
::-webkit-scrollbar-thumb
{
border-radius: 10px;
-webkit-box-shadow: inset 0 0 6px rgba(0,0,0,.3);
background-color: #555;
}
input[type="button"], input[type="submit"], input[type="search"], input[type="reset"] { input[type="button"], input[type="submit"], input[type="search"], input[type="reset"] {
-webkit-appearance: none; -webkit-appearance: none;
} }
textarea { -webkit-appearance: none;} textarea { -webkit-appearance: none;}
html,body{ html,body{
height: 100%; height: 100%;
...@@ -63,7 +63,9 @@ html,body{ ...@@ -63,7 +63,9 @@ html,body{
font-family: Arial, Helvetica, sans-serif; font-family: Arial, Helvetica, sans-serif;
font-size: 16px; font-size: 16px;
} }
#app {
height: 100%;
}
.clear:after{ .clear:after{
content: ''; content: '';
display: block; display: block;
...@@ -121,7 +123,7 @@ html,body{ ...@@ -121,7 +123,7 @@ html,body{
animation: backOpacity 2s ease-in-out infinite; animation: backOpacity 2s ease-in-out infinite;
} }
// 屏幕适配 // 屏幕适配
@media screen and (min-width:1240px) and (max-width:1900px){ @media screen and (max-width:1900px){
.screenSet{ .screenSet{
// width: 163vh !important; // width: 163vh !important;
// height: 66vh !important; // height: 66vh !important;
...@@ -165,7 +167,7 @@ html,body{ ...@@ -165,7 +167,7 @@ html,body{
background: #fafafa; background: #fafafa;
} }
//下拉框 //下拉框
.el-dropdown-menu .el-popper { .el-dropdown-menu .el-popper {
top: 48px; top: 48px;
} }
...@@ -226,4 +228,4 @@ html,body{ ...@@ -226,4 +228,4 @@ html,body{
} }
.el-breadcrumb__inner.is-link:hover { .el-breadcrumb__inner.is-link:hover {
color: #449284 !important; color: #449284 !important;
} }
\ No newline at end of file
/*重置单选按钮样式*/
.el-radio-button__orig-radio:checked+.el-radio-button__inner {
background-color: #449284;
border-color: #449284;
box-shadow: -1px 0 0 0 #449284;
}
.el-radio-button__inner:hover {
color: #449284;
}
/*重置输入框,选择框样式*/
.el-range-editor.is-active, .el-range-editor.is-active:hover, .el-select .el-input.is-focus .el-input__inner,.el-input__inner:focus{
border-color: #449284;
}
.el-select-dropdown__item.selected {
color: #449284;
}
.el-select .el-input__inner:focus {
border-color: #449284;
}
/*重置文字按钮样式*/
.el-button--text{
color: #606266;
}
.el-button--text:focus, .el-button--text:hover{
color: #449284;
}
/*重置朴素按钮样式——plain*/
.el-button.is-plain:focus, .el-button.is-plain:hover {
color: #449284;
border-color: #449284;
}
/*重置表格选择框*/
.el-checkbox__input.is-checked .el-checkbox__inner, .el-checkbox__input.is-indeterminate .el-checkbox__inner {
border-color: #449284;
background-color: #449284;
}
.el-checkbox__inner {
border-color: #DCDFE6!important;
}
.el-checkbox__input.is-focus,.el-checkbox__inner:hover,.el-checkbox__inner.is-focus {
border-color: #449284!important;
}
/*重置textarea聚焦样式*/
.el-textarea__inner:focus {
border-color: #449284!important;
}
/*.el-form-item .el-form-item__label{*/
/*font-size: 14px;*/
/*}*/
.el-message-box__content{
padding: 20px 15px;
}
$borderBottomStyle: 1px solid #efefef;
$picaGreen: #449284; //主色调
$searchDiv: 160px;
/*列表页布局*/
.f-main-content {
background: #ffffff;
padding: 30px;
.page-title {
font-size: 20px;
padding-bottom: 20px;
border-bottom: $borderBottomStyle;
}
.search-div { //查询模块
display: flex;
flex-direction: row;
justify-content: space-between;
padding: 30px 0 10px 0;
border-bottom: $borderBottomStyle;
.search-btn {
min-width: $searchDiv; // 根据自己页面设置
}
}
/*表格*/
.table-content {
padding: 30px 0 30px 0;
}
.btn-right-class{
margin-right: 10px;
}
}
/*详情页布局*/
.f-detail-content {
background: #ffffff;
padding: 30px;
.header {
padding-bottom: 20px;
border-bottom: $borderBottomStyle;
display: flex;
justify-content: space-between;
}
}
/*提示文字*/
.reminding {
color: #9B9997;
font-size: 12px;
}
/*可点击的文字*/
.click-text {
cursor: pointer;
color: $picaGreen;
}
/*不能修改的类表单样式*/
.content-div {
display: flex;
flex-direction: row;
margin-bottom: 10px;
.c-title {
width: 150px;
text-align: right;
flex-shrink: 0;
margin-right: 20px;
}
.more-content {
flex-direction: column;
}
}
...@@ -17,7 +17,10 @@ export const envConfig = { ...@@ -17,7 +17,10 @@ export const envConfig = {
loginUrl: 'https://dev-saas.yunqueyi.com/pica-login/work_station.html', loginUrl: 'https://dev-saas.yunqueyi.com/pica-login/work_station.html',
innerLoginUrl: 'http://localhost:8090/PICA_SSO_FE/html/pica_index.html', innerLoginUrl: 'http://localhost:8090/PICA_SSO_FE/html/pica_index.html',
yuequeyiIndexUrl: 'https://dev-saas.yunqueyi.com/pica_index.html', yuequeyiIndexUrl: 'https://dev-saas.yunqueyi.com/pica_index.html',
followUpSCSoSo: 'http://sosoapi.yunqueyi.com/sosoapi-web/pass/mock/73',
followUpSC: 'https://dev-sc.yunqueyi.com',
saasDomainUrl: 'https://dev-saas.yunqueyi.com/', saasDomainUrl: 'https://dev-saas.yunqueyi.com/',
workApiUrl: 'https://dev-work.yunqueyi.com/web',
}, },
dev: { dev: {
baseUrl: 'https://dev-sc.yunqueyi.com/', baseUrl: 'https://dev-sc.yunqueyi.com/',
...@@ -28,7 +31,9 @@ export const envConfig = { ...@@ -28,7 +31,9 @@ export const envConfig = {
loginUrl: 'https://dev-saas.yunqueyi.com/pica-login/work_station.html', loginUrl: 'https://dev-saas.yunqueyi.com/pica-login/work_station.html',
innerLoginUrl: 'https://dev-sso.yunqueyi.com/PICA_SSO_FE/html/pica_index.html', innerLoginUrl: 'https://dev-sso.yunqueyi.com/PICA_SSO_FE/html/pica_index.html',
yuequeyiIndexUrl: 'https://dev-saas.yunqueyi.com/pica_index.html', yuequeyiIndexUrl: 'https://dev-saas.yunqueyi.com/pica_index.html',
followUpSC: 'https://dev-sc.yunqueyi.com',
saasDomainUrl: 'https://dev-saas.yunqueyi.com/', saasDomainUrl: 'https://dev-saas.yunqueyi.com/',
workApiUrl: 'https://dev-work.yunqueyi.com/web',
}, },
test: { test: {
baseUrl: 'https://test1-sc.yunqueyi.com/', baseUrl: 'https://test1-sc.yunqueyi.com/',
...@@ -38,8 +43,22 @@ export const envConfig = { ...@@ -38,8 +43,22 @@ export const envConfig = {
qiniuImgUrl: "https://test1-file.yunqueyi.com", qiniuImgUrl: "https://test1-file.yunqueyi.com",
loginUrl: 'https://test1.yunqueyi.com/pica-login/work_station.html', loginUrl: 'https://test1.yunqueyi.com/pica-login/work_station.html',
innerLoginUrl: 'https://test1-sso.yunqueyi.com/PICA_SSO_FE/html/pica_index.html', innerLoginUrl: 'https://test1-sso.yunqueyi.com/PICA_SSO_FE/html/pica_index.html',
followUpSC: 'https://test1-sc.yunqueyi.com',
yuequeyiIndexUrl: 'https://test1.yunqueyi.com/pica_index.html', yuequeyiIndexUrl: 'https://test1.yunqueyi.com/pica_index.html',
saasDomainUrl: 'https://test1.yunqueyi.com/', saasDomainUrl: 'https://test1.yunqueyi.com/',
workApiUrl: 'https://test1-work.yunqueyi.com/web',
},
test2: {
baseUrl: 'https://test2-work.yunqueyi.com/sc/',
qiniuFileUrl: "https://test1-sc.yunqueyi.com/contents/admin/qiniu/token1",
qiniuResourceUrl: "https://test1-videos.yunqueyi.com",
qiniuImgUrl: "https://test1-file.yunqueyi.com",
loginUrl: 'https://test1.yunqueyi.com/pica-login/work_station.html',
innerLoginUrl: 'https://test1-sso.yunqueyi.com/PICA_SSO_FE/html/pica_index.html',
followUpSC: 'https://test2-work.yunqueyi.com/sc',
yuequeyiIndexUrl: 'https://test1.yunqueyi.com/pica_index.html',
saasDomainUrl: 'https://test2-work.yunqueyi.com/web/',
workApiUrl: 'https://test2-work.yunqueyi.com/web',
}, },
uat: { uat: {
baseUrl: 'https://uat-sc.yunqueyi.com/', baseUrl: 'https://uat-sc.yunqueyi.com/',
...@@ -49,8 +68,10 @@ export const envConfig = { ...@@ -49,8 +68,10 @@ export const envConfig = {
qiniuImgUrl: "https://files.yunqueyi.com", qiniuImgUrl: "https://files.yunqueyi.com",
loginUrl: 'https://uat.yunqueyi.com/pica-login/work_station.html', loginUrl: 'https://uat.yunqueyi.com/pica-login/work_station.html',
innerLoginUrl: 'https://uat-sso.yunqueyi.com/PICA_SSO_FE/html/pica_index.html', innerLoginUrl: 'https://uat-sso.yunqueyi.com/PICA_SSO_FE/html/pica_index.html',
followUpSC: 'https://uat-sc.yunqueyi.com',
yuequeyiIndexUrl: 'https://uat.yunqueyi.com/pica_index.html', yuequeyiIndexUrl: 'https://uat.yunqueyi.com/pica_index.html',
saasDomainUrl: 'https://uat.yunqueyi.com/', saasDomainUrl: 'https://uat.yunqueyi.com/',
workApiUrl: 'https://uat-work.yunqueyi.com/web',
}, },
pro: { pro: {
baseUrl: 'https://sc.yunqueyi.com/', baseUrl: 'https://sc.yunqueyi.com/',
...@@ -60,7 +81,9 @@ export const envConfig = { ...@@ -60,7 +81,9 @@ export const envConfig = {
qiniuImgUrl: "https://files.yunqueyi.com", qiniuImgUrl: "https://files.yunqueyi.com",
loginUrl: 'https://yunqueyi.com/pica-login/work_station.html', loginUrl: 'https://yunqueyi.com/pica-login/work_station.html',
innerLoginUrl: 'https://sso.yunqueyi.com/PICA_SSO_FE/html/pica_index.html', innerLoginUrl: 'https://sso.yunqueyi.com/PICA_SSO_FE/html/pica_index.html',
followUpSC: 'https://sc.yunqueyi.com',
yuequeyiIndexUrl: 'https://www.yunqueyi.com/pica_index.html', yuequeyiIndexUrl: 'https://www.yunqueyi.com/pica_index.html',
saasDomainUrl: 'https://www.yunqueyi.com/', saasDomainUrl: 'https://www.yunqueyi.com/',
workApiUrl: 'https://work.yunqueyi.com/web',
} }
} }
...@@ -10,7 +10,6 @@ const service = axios.create({ ...@@ -10,7 +10,6 @@ const service = axios.create({
withCredentials: false withCredentials: false
}) })
/*loading*/
let loadingInstance = () => { let loadingInstance = () => {
return Loading.service({ return Loading.service({
lock: true, lock: true,
...@@ -36,8 +35,6 @@ let tryHideFullScreenLoading = () => { ...@@ -36,8 +35,6 @@ let tryHideFullScreenLoading = () => {
} }
}; };
// request拦截器 // request拦截器
service.interceptors.request.use(config => { service.interceptors.request.use(config => {
if (config.noLoading) { if (config.noLoading) {
...@@ -85,7 +82,6 @@ service.interceptors.response.use( ...@@ -85,7 +82,6 @@ service.interceptors.response.use(
}else{ }else{
tryHideFullScreenLoading() tryHideFullScreenLoading()
} }
const res = response.data const res = response.data
/* /*
baseUrl时,返回000000为成功 baseUrl时,返回000000为成功
...@@ -100,7 +96,6 @@ service.interceptors.response.use( ...@@ -100,7 +96,6 @@ service.interceptors.response.use(
error => { error => {
// logger.error('err' + error) // logger.error('err' + error)
tryHideFullScreenLoading(); tryHideFullScreenLoading();
return Promise.reject(error) return Promise.reject(error)
} }
) )
......
import fetch from '../fetch';
import { getFollowUpApi, getBasicDataApi, getFollowUpSC } from '@/utils/index'
import utils from './followupUtils';
const headers = {
sysCode: 45
} /**/
/*工作台*/
export const getTodayAppointsList = (params) => {
return fetch({
headers,
url: getFollowUpSC(`/followup/overView/todayAppoints`),
method: 'get',
params: params,
description: '获取今日预约列表',
})
};
export const getTodayOverview = (params) => {
return fetch({
headers,
url: getFollowUpSC(`/followup/overView/todayOverview`),
method: 'get',
params: params,
description: '获取今日随访、预约、随访人数',
})
};
export const getTodayPlans = (params) => {
return fetch({
headers,
url: getFollowUpSC(`/followup/overView/todayPlans`),
method: 'get',
params: params,
description: '查询今日随访计划',
})
};
/*计划管理*/
export const createFollowPlan = (data) => {
return fetch({
headers,
url: getFollowUpSC(`/followup/plans`),
method: 'post',
data: data,
description: '新增、修改随访计划',
},)
}
export const getPlanList = (params) => {
return fetch({
headers,
url: getFollowUpSC(`/followup/plans`),
method: 'get',
params: params,
description: '获取计划列表',
})
};
export const getPlanDetail = (planId) => {
return fetch({
headers,
url: getFollowUpSC(`/followup/plans/${planId}`),
method: 'get',
description: '获取计划详情',
})
};
export const getNodeTimeList = (planId) => {
return fetch({
headers,
url: getFollowUpSC(`/followup/plans/${planId}/time`),
method: 'get',
description: '获取随访时间节点列表',
})
};
export const getNodeTimeContent = (planTimeId) => {
return fetch({
headers,
url: getFollowUpSC(`/followup/plans/time/${planTimeId}`),
method: 'get',
description: '获取节点详情',
})
};
export const getResidentList = (params) => {
return fetch({
headers,
url: getFollowUpSC(`/followup/planPatient/`),
method: 'get',
params: params,
description: '获取居民列表',
})
};
export const getGroupList = (params) => {
return fetch({
headers,
url: getFollowUpSC(`/followup/planPatient/group`),
method: 'get',
params: params,
description: '获取分组列表',
})
};
export const getFollowStartTimeList = (planId) => {
return fetch({
headers,
url: getFollowUpSC(`/followup/planPatient/${planId}/times`),
method: 'get',
description: '获取随访开始时间列表(居民相关)',
})
};
export const getResidentDetail = (planId,patientId,fuPlanPatientId ) => {
return fetch({
headers,
url: getFollowUpSC(`/followup/planPatient/${planId}/detail/${patientId}?planPatientsId=${fuPlanPatientId}`),
method: 'get',
description: '获取居民详情',
})
};
export const changePlan = (data) => {
return fetch({
headers,
url: getFollowUpSC(`/followup/planPatient/change`),
method: 'put',
data: data,
description: '变更计划',
})
};
export const finishPlan = (data) => {
return fetch({
headers,
url: getFollowUpSC(`/followup/planPatient/status`),
method: 'put',
data: data,
description: '变更计划',
})
};
export const deletePlan = (planId) => {
return fetch({
headers,
url: getFollowUpSC(`/followup/plans/${planId}`),
method: 'delete',
description: '删除计划',
})
};
export const getVerifyStatus = (params) => {
return fetch({
headers,
url: getFollowUpSC(`/followup/plans/validate/status`),
method: 'get',
params: params,
description: '认证校验',
})
};
/*预约管理*/
export const getReservationList = (data) => {
return fetch({
headers,
url: getFollowUpSC(`/followup/appoint/appointed/list`),
method: 'post',
data: data,
description: '获取预约列表',
})
};
export const getCheckReservation = (data) => {
return fetch({
headers,
url: getFollowUpSC(`/healths/notice/fu/doctor/appoint/pushValid`),
method: 'post',
data: data,
description: '发送预约校验',
})
};
export const getReservationPatients = (data) => {
return fetch({
headers,
url: getFollowUpSC(`/followup/appoint/appointed/count`),
method: 'post',
data: data,
description: '查看预约人数',
})
};
export const changeReservationStatus = (data) => {
return fetch({
headers,
url: getFollowUpSC(`/followup/appoint/status/`),
method: 'post',
data: data,
description: '手动变更预约状态',
})
};
export const sendReservation = (data) => {
return fetch({
headers,
url: getFollowUpSC(`/followup/appoint/`),
method: 'post',
data: data,
description: '发送预约',
})
};
/*录入管理*/
export const getEnteringList = (data) => {
return fetch({
headers,
url: getFollowUpSC(`/followup/entering/list`),
method: 'post',
data: data,
description: '录入列表查看',
})
}
export const changeEnteringStatus = (data) => {
return fetch({
headers,
url: getFollowUpSC(`/followup/entering/status/change`),
method: 'post',
data: data,
description: '变更随访状态',
},)
}
export const getEnteringInfo = (patientId, fuPlanPatientTimesId) => {
return fetch({
headers,
url: getFollowUpSC(`/followup/entering/${patientId}/fuInfo/${fuPlanPatientTimesId}`),
method: 'get',
// params: params,
description: '随访单条信息查看',
},)
}
export const getFormList = (planTimesId) => {
return fetch({
headers,
url: getFollowUpSC(`/followup/entering/scale/${planTimesId}/list`),
method: 'get',
// params: params,
description: '获取量表列表',
},)
}
//获取新建计划居民列表
export const getPlanPatientsList = (data) =>{
return fetch({
headers:{
sysCode: 9
},
url: getFollowUpSC(`/healths/patients/infolist`),
method: 'post',
data: data,
description: '获取新建计划居民列表',
},)
}
// 获取随访计划模板列表
export const getFollowupTemplate = (data) => {
return fetch({
headers,
url: getFollowUpSC(`/followup/plans/templets`),
method: 'get',
data: data,
description: '获取随访计划模板列表',
})
}
// 获取随访量表固定模板
export const getFollowupTableTemplate = (id) => {
return fetch({
headers,
url: getFollowUpSC(`/followup/plans/templets/${id}`),
method: 'get',
data: {},
description: '获取随访量表固定模板',
})
}
// 获取量表列表
export const getFormOptions = (data)=>{
return fetch({
headers,
url: getFollowUpSC(`/followup/entering/scale/list`),
method: 'get',
data: data,
description: '获取量表列表',
})
}
/*常量*/
export const getBasicData = (params) => {
return fetch({
headers,
url: getFollowUpSC(`/basic-data/constants/`),
method: 'get',
params: params,
description: '获取常量',
})
};
// 获取所有漫画列表
export const getAllEducationComtent = (data) => {
return fetch({
headers,
url: getFollowUpSC(`/healths/comtent/workstation/list`),
method: 'post',
data: data,
description: '获取所有漫画列表'
})
}
// 获取所有疾病
export const getAllDiseases = (params) => {
return fetch({
headers,
url: getFollowUpSC(`/healths/patients/diseases/-1`),
method: 'get',
params: params,
description: '获取所有疾病',
})
}
// 获取所有分组
export const getAllLabels = (params) => {
return fetch({
headers,
url: getFollowUpSC(`/healths/labels/`),
method: 'get',
params: params,
description: '获取所有分组',
})
}
// 获取微信和短信病人数接口
export const getPatientNumber = (data) => {
return fetch({
headers: {
sysCode: 9
},
url: getFollowUpSC(`/healths/patientEducation/getSendPatientTypeNum`),
method: 'post',
data: data,
description: '获取微信和短信病人数接口',
})
}
/*
* 量表相关
*/
// 获取域名白名单
export const getDomain = (data) => {
return fetch({
url: getFollowUpSC(`/followup/route/domain?type=1`),
method: 'get',
data: {},
})
}
// 获取展示的模块
export const getScaleModels = (domain,scaleNo) => {
return fetch({
url: `${domain}/scale/${scaleNo}/models`,
method: 'get',
data: {},
})
}
// 获取量表详情
export const getScaleDetail = (domain,planPatientsTimesId,scaleNo) => {
return fetch({
url: `${domain}/scale/${planPatientsTimesId}/${scaleNo}/info?type=2&isLine=2`,
method: 'get',
data: {},
})
}
// 提交量表
export const postScale = ( domain,data ) => {
return fetch({
url: `${domain}/scale/save`,
method: 'post',
data: JSON.stringify(data),
})
}
// 更新量表状态
export const updateScalesStatus = ( data ) => {
return fetch({
url: getFollowUpSC(`/followup/entering/scale/updateScalesStatus`),
method: 'post',
data: data,
})
}
// 检查号码是否符合规范,包括长度,类型
function isCardNo(card){
//身份证号码为15位或者18位,15位时全为数字,18位前17位为数字,最后一位是校验位,可能为数字或字符X
var reg = /(^\d{15}$)|(^\d{17}(\d|X|x)$)/;
if(reg.test(card) === false){
return false;
}
return true;
}
// 取身份证前两位,校验省份
function checkProvince(card,vcity){
var province = card.substr(0,2);
if(vcity[province] == undefined){
return false;
}
return true;
}
// 检查生日是否正确
function checkBirthday(card){
var len = card.length;
//身份证15位时,次序为省(3位)市(3位)年(2位)月(2位)日(2位)校验位(3位),皆为数字
if(len == '15'){
var re_fifteen = /^(\d{6})(\d{2})(\d{2})(\d{2})(\d{3})$/;
var arr_data = card.match(re_fifteen);
var year = arr_data[2];
var month = arr_data[3];
var day = arr_data[4];
var birthday = new Date('19'+year+'/'+month+'/'+day);
return verifyBirthday('19'+year,month,day,birthday);
}
//身份证18位时,次序为省(3位)市(3位)年(4位)月(2位)日(2位)校验位(4位),校验位末尾可能为X
if(len == '18'){
var re_eighteen = /^(\d{6})(\d{4})(\d{2})(\d{2})(\d{3})([0-9]|X|x)$/;
var arr_data = card.match(re_eighteen);
var year = arr_data[2];
var month = arr_data[3];
var day = arr_data[4];
var birthday = new Date(year+'/'+month+'/'+day);
return verifyBirthday(year,month,day,birthday);
}
return false;
}
// 校验日期
function verifyBirthday(year,month,day,birthday) {
var now = new Date();
var now_year = now.getFullYear();
//年月日是否合理
if(birthday.getFullYear() == year && (birthday.getMonth() + 1) == month && birthday.getDate() == day)
{
//判断年份的范围(0岁到100岁之间)
var time = now_year - year;
if(time >= 0 && time <= 100)
{
return true;
}
return false;
}
return false;
}
// 校验位的检测
function checkParity(card){
//15位转18位
card = changeFivteenToEighteen(card);
var len = card.length;
if(len == '18'){
var arrInt = new Array(7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2);
var arrCh = new Array('1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2');
var cardTemp = 0, i, valnum;
for(i = 0; i < 17; i ++) {
cardTemp += card.substr(i, 1) * arrInt[i];
}
valnum = arrCh[cardTemp % 11];
if (valnum == card.substr(17, 1).toLocaleUpperCase())
{
return true;
}
return false;
}
return false;
}
// 15位转18位身份证号
function changeFivteenToEighteen(card){
if(card.length == '15')
{
var arrInt = new Array(7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2);
var arrCh = new Array('1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2');
var cardTemp = 0, i;
card = card.substr(0, 6) + '19' + card.substr(6, card.length - 6);
for(i = 0; i < 17; i ++)
{
cardTemp += card.substr(i, 1) * arrInt[i];
}
card += arrCh[cardTemp % 11];
return card;
}
return card;
}
export const checkCardNum = (rule, value, callback) => {
var vcity={ 11:"北京",12:"天津",13:"河北",14:"山西",15:"内蒙古",
21:"辽宁",22:"吉林",23:"黑龙江",31:"上海",32:"江苏",
33:"浙江",34:"安徽",35:"福建",36:"江西",37:"山东",41:"河南",
42:"湖北",43:"湖南",44:"广东",45:"广西",46:"海南",50:"重庆",
51:"四川",52:"贵州",53:"云南",54:"西藏",61:"陕西",62:"甘肃",
63:"青海",64:"宁夏",65:"新疆",71:"台湾",81:"香港",82:"澳门",91:"国外"
};
//是否为空
if(value === ''){
callback(new Error('请输入正确的身份证'))
}
//校验长度,类型
if(isCardNo(value) === false){
callback(new Error('请输入正确的身份证'))
}
//检查省份
if(checkProvince(value,vcity) === false){
callback(new Error('请输入正确的身份证'))
}
//校验生日
if(checkBirthday(value) === false){
callback(new Error('请输入正确的身份证'))
}
//检验位的检测
if(checkParity(value) === false){
callback(new Error('请输入正确的身份证'))
}
callback()
}
import rangeJson from './rangConfig';
// 这个方法,是用户在选择随访轮次(6个月,12个月)后续操作
let checkNeedRule = (val) => {
const needRule = sessionStorage.getItem('needRule');
if( val!='0' && (!val||val=='') && (!needRule || needRule=='true') ){
return true;
}
return false;
}
// 校验范围通用方法
export const checkRange = (rule, value, callback) => {
let min,max;
let val = parseFloat(value);
let res;
// 处理 诸如 01 这种情况
if(value && value.length>1 && value.indexOf('.')<0){
res = (new RegExp(/^[1-9]\d*$/g)).test(value);
}else{
res = true;
}
rangeJson.forEach((item)=>{
if(item.field == rule.field){
min = item.min;
max = item.max;
}
})
const ruless = ( (val >= min) && (val <= max) && res )
// if(ruless || checkNeedRule(val)){
if( !value || ruless ){
callback()
}else{
callback(new Error(`输入范围${min}~${max}`))
}
}
// 校验手机号
export const checkMobile = (rule, value, callback) => {
const reg = /^1[3|4|5|7|8|9][0-9]{9}$/; //验证规则
const flag = reg.test(value);
if(flag){
callback()
}else{
callback(new Error(`请输入正确的手机号码`))
}
}
// 校验是否是整数
export const checkIsInteger = (rule, value, callback) => {
const val = parseFloat(value);
const num = Number.isInteger(val);
// const val = Number.parseInt(value);
// const num = /^[0-9]*[1-9][0-9]*$/.test(value);
// if(num || checkNeedRule(val)){
if( !value || num ){
callback()
}else{
callback(new Error(`输入整数`))
}
}
// 校验是否是一位小数
export const checkNumberIsToFixed = (rule, value, callback) => {
const isNum = /^(([1-9][0-9]*)|(([0]\.\d{1,1}|[1-9][0-9]*\.\d{1,1})))$/;
const val = Number(value);
// if(isNum.test(val) || checkNeedRule(val)){
if( !value || isNum.test(val) ){
callback()
}else{
callback(new Error(`最多输入1位小数`))
}
}
// 大于0的正整数
export const checkNormalInt = (rule, value, callback) => {
const val = parseFloat(value);
const isInteger = Number.isInteger(val);
// if((isInteger && val > 0) || checkNeedRule(val)){
if( !value || (isInteger && val > 0) ){
callback()
}else{
callback(new Error(`请输入大于0的正整数`))
}
}
// 校验是否是两位小数
export const checkNumberIsToFixedTwo = (rule, value, callback) => {
const isNum = /^(-)?(0|[1-9]\d*)(\s|$|\.\d{1,2}\b)/;
const val = Number(value);
// if(isNum.test(val) || checkNeedRule(val)){
if( !value || isNum.test(val) ){
callback()
}else{
callback(new Error(`最多输入2位小数`))
}
}
// 只获取指定的参数(浅复制);
function getParams(params, arr) {
const res = Object.create(null);
if (!params) return res;
if (Object.prototype.toString.call(params) === '[object FormData]') { // formData类型直接返回
return params;
}
if (arr && arr.length) { // 只对需要处理的处理下
arr.forEach(item => {
if (item) {
res[item] = params[item] || '';
}
});
return res;
} else {
return params;
}
}
export default {
getParams,
};
import dataConverter from './dataConverter';
export default {
DC: dataConverter,
};
import range from './range';
import rangeHype from './rangeHype';
import rangeDiabetes from './rangeDiabetes';
export default [
...range,
...rangeHype,
...rangeDiabetes
]
// 脑卒中字段校验的配置文件
export default [
{
field: 'fastingBloodGlucose',
name: '空腹血糖',
min: 1,
max: 33.3
},
{
field: 'triglyceride',
name: '甘油三酯',
min: 0,
max: 5
},
{
field: 'cholesterol',
name: '胆固醇',
min: 1,
max: 10
},
{
field: 'cLdl',
name: '低密度脂蛋白胆固醇',
min: 0,
max: 5
},
{
field: 'cHdl',
name: '高密度脂蛋白胆固醇',
min: 0,
max: 5
},
{
field: 'stature',
name: '身高',
min: 100,
max: 200
},
{
field: 'weight',
name: '体重',
min: 35,
max: 200
},
{
field: 'waistline',
name: '腰围',
min: 50,
max: 150
},
{
field: 'firstSystolicPressure',
name: '收缩压SBP',
min: 70,
max: 240
},
{
field: 'firstDiastolicPressure',
name: '舒张压DBP',
min: 50,
max: 130
},
{
field: 'firstPulse',
name: '脉搏',
min: 30,
max: 200
},
{
field: 'secondSystolicPressure',
name: '收缩压SBP',
min: 70,
max: 240
},
{
field: 'secondDiastolicPressure',
name: '舒张压DBP',
min: 50,
max: 130
},
{
field: 'secondPulse',
name: '脉搏',
min: 30,
max: 200
},
]
// 高血压字段校验的配置文件
export default [
{
field: 'systolicBloodPressure',
name: '收缩压SBP',
min: 70,
max: 240
},
{
field: 'diastolicBloodPressure',
name: '舒张压DBP',
min: 50,
max: 130
},
{
field: 'bodyHeight',
name: '身高',
min: 100,
max: 250
},
{
field: 'bodyWeight',
name: '体重',
min: 35,
max: 250
},
{
field: 'nextBodyWeight',
name: '体重',
min: 35,
max: 250
},
{
field: 'fastingBloodSugar',
name: '空腹血糖值',
min: 1,
max: 33.3
},
{
field: 'glycosylatedHemoglobinPercent',
name: '糖化血红蛋白值',
min: 3.00,
max: 20.00
},
{
field: 'smokingAmount',
name: '日吸烟量',
min: 0,
max: 99
},
{
field: 'nextSmokingAmount',
name: '日吸烟量',
min: 0,
max: 99
},
{
field: 'alcoholConsumption',
name: '日饮酒量',
min: 0,
max: 99
},
{
field: 'nextAlcoholConsumption',
name: '日饮酒量',
min: 0,
max: 99
},
{
field: 'workoutOfWeek',
name: '运动情况',
min: 0,
max: 99
},
{
field: 'workoutDuration',
name: '运动情况',
min: 0,
max: 99
},
{
field: 'nextWorkoutOfWeek',
name: '运动情况',
min: 0,
max: 99
},
{
field: 'nextWorkoutDuration',
name: '运动情况',
min: 0,
max: 99
},
{
field: 'nextWorkoutDuration',
name: '运动情况',
min: 0,
max: 99
},
{
field: 'stapleFoodGram',
name: '主食摄入量',
min: 0,
max: 999
},
{
field: 'nextStapleFoodGram',
name: '主食摄入量',
min: 0,
max: 999
},
]
// 高血压字段校验的配置文件
export default [
{
field: 'systolicBloodPressure',
name: '收缩压SBP',
min: 70,
max: 240
},
{
field: 'diastolicBloodPressure',
name: '舒张压DBP',
min: 50,
max: 130
},
{
field: 'bodyHeight',
name: '身高',
min: 100,
max: 250
},
{
field: 'bodyWeight',
name: '体重',
min: 35,
max: 250
},
{
field: 'nextBodyWeight',
name: '下次随访体重',
min: 35,
max: 250
},
{
field: 'heartRate',
name: '心率',
min: 30,
max: 200
},
{
field: 'smokingAmount',
name: '本次日吸烟量',
min: 0,
max: 99
},
{
field: 'nextSmokingAmount',
name: '下次随访日吸烟量',
min: 0,
max: 99
},
{
field: 'alcoholConsumption',
name: '本次日饮酒量',
min: 0,
max: 99
},
{
field: 'nextAlcoholConsumption',
name: '下次随访日饮酒量',
min: 0,
max: 99
},
{
field: 'workoutOfWeek',
name: '本次运动情况',
min: 0,
max: 99
},
{
field: 'workoutDuration',
name: '本次运动情况',
min: 0,
max: 99
},
{
field: 'nextWorkoutOfWeek',
name: '下次随访运动情况',
min: 0,
max: 99
},
{
field: 'nextWorkoutDuration',
name: '下次随访运动情况',
min: 0,
max: 99
},
{
field: 'dosageDay',
name: '用法',
min: 0,
max: 5
},
]
...@@ -172,10 +172,24 @@ export function uploadImg() { ...@@ -172,10 +172,24 @@ export function uploadImg() {
return getConfigByEnvType('qiniuImgUrl') return getConfigByEnvType('qiniuImgUrl')
} }
// 获取随访微服务服务器域名地址
export function getFollowUpSC(url) {
return getConfigByEnvType('followUpSC') + url
}
// 获取常量接口域名地址
export function getBasicDataApi(url) {
return getConfigByEnvType('basicDataUrl') + url
}
// 获取saas端域名地址 // 获取saas端域名地址
export function getSaasDomain(url) { export function getSaasDomain(url) {
return getConfigByEnvType('saasDomainUrl') + url return getConfigByEnvType('saasDomainUrl') + url
} }
// 获取saasApi端域名地址
export function getWorkApi(url) {
return getConfigByEnvType('workApiUrl') + url
}
// 获取saas端api域名地址 // 获取saas端api域名地址
export function getSaasApiDomain(url) { export function getSaasApiDomain(url) {
...@@ -187,3 +201,4 @@ function getConfigByEnvType(urlType) { ...@@ -187,3 +201,4 @@ function getConfigByEnvType(urlType) {
return envConfig[process.env.BUILD_ENV][urlType] return envConfig[process.env.BUILD_ENV][urlType]
} }
import fetch from '@/utils/fetch' import fetch from '@/utils/fetch'
import { getBaseUrl } from '@/utils/index' import { getBaseUrl, getWorkApi } from '@/utils/index'
module.exports = { module.exports = {
data: function () { data: function () {
...@@ -153,6 +153,18 @@ module.exports = { ...@@ -153,6 +153,18 @@ module.exports = {
data: para data: para
}) })
}, },
// saas-GET请求
saasGET(api, para) {
// para.token = para.token || this.token || "343BCABC890349ACAF357FA79122F9FE"
return fetch({
headers: {
sysCode: 9,
},
url: getWorkApi(api),
method: 'get',
params: para
})
},
// 通用DELETE请求 // 通用DELETE请求
DELETE(api, para, callback,str) { DELETE(api, para, callback,str) {
...@@ -174,7 +186,34 @@ module.exports = { ...@@ -174,7 +186,34 @@ module.exports = {
data: para data: para
}) })
}, },
// 通用saas-POST请求
saasPOST(api, para, cType) {
// para.token = para.token || this.token || "343BCABC890349ACAF357FA79122F9FE"
let header = {}
if(cType) {
header['Content-Type'] = cType;
}
return fetch({
headers: {
sysCode: 9,
...header
},
url: getWorkApi(api),
method: 'post',
data: para
})
},
// 通用saas-PUT请求
saasPUT(api, para) {
return fetch({
headers: {
sysCode: 9,
},
url: getWorkApi(api),
method: 'put',
data: para
})
},
// 从html参数 // 从html参数
getUrlKey(name) { getUrlKey(name) {
if (decodeURIComponent && location.href) { if (decodeURIComponent && location.href) {
...@@ -183,6 +222,7 @@ module.exports = { ...@@ -183,6 +222,7 @@ module.exports = {
return null return null
} }
}, },
getUrlSearch(url, name) { getUrlSearch(url, name) {
if (typeof name == 'undefined') { if (typeof name == 'undefined') {
name = url name = url
......
// 检查号码是否符合规范,包括长度,类型 // 检查号码是否符合规范,包括长度,类型
function isCardNo(card){ export const isCardNo = (card) =>{
//身份证号码为15位或者18位,15位时全为数字,18位前17位为数字,最后一位是校验位,可能为数字或字符X //身份证号码为15位或者18位,15位时全为数字,18位前17位为数字,最后一位是校验位,可能为数字或字符X
// var reg = /(^\d{15}$)|(^\d{17}(\d|X|x)$)/; // var reg = /(^\d{15}$)|(^\d{17}(\d|X|x)$)/;
let reg = /(^\d{15}$)|(^\d{18}$)|(^\d{17}(\d|X|x)$)/; let reg = /(^\d{15}$)|(^\d{18}$)|(^\d{17}(\d|X|x)$)/;
...@@ -10,7 +10,7 @@ function isCardNo(card){ ...@@ -10,7 +10,7 @@ function isCardNo(card){
} }
// 取身份证前两位,校验省份 // 取身份证前两位,校验省份
function checkProvince(card,vcity){ export const checkProvince = (card,vcity) =>{
var province = card.substr(0,2); var province = card.substr(0,2);
if(vcity[province] == undefined){ if(vcity[province] == undefined){
return false; return false;
...@@ -19,7 +19,7 @@ function checkProvince(card,vcity){ ...@@ -19,7 +19,7 @@ function checkProvince(card,vcity){
} }
// 检查生日是否正确 // 检查生日是否正确
function checkBirthday(card){ export const checkBirthday = (card) =>{
var len = card.length; var len = card.length;
//身份证15位时,次序为省(3位)市(3位)年(2位)月(2位)日(2位)校验位(3位),皆为数字 //身份证15位时,次序为省(3位)市(3位)年(2位)月(2位)日(2位)校验位(3位),皆为数字
if(len == '15'){ if(len == '15'){
...@@ -63,7 +63,7 @@ function verifyBirthday(year,month,day,birthday) { ...@@ -63,7 +63,7 @@ function verifyBirthday(year,month,day,birthday) {
} }
// 校验位的检测 // 校验位的检测
function checkParity(card){ export const checkParity = (card)=>{
//15位转18位 //15位转18位
card = changeFivteenToEighteen(card); card = changeFivteenToEighteen(card);
var len = card.length; var len = card.length;
...@@ -102,36 +102,36 @@ function changeFivteenToEighteen(card){ ...@@ -102,36 +102,36 @@ function changeFivteenToEighteen(card){
return card; return card;
} }
export const checkCardNum = (rule, value, callback) => { // export const checkCardNum = (rule, value, callback) => {
var vcity={ 11:"北京",12:"天津",13:"河北",14:"山西",15:"内蒙古", // var vcity={ 11:"北京",12:"天津",13:"河北",14:"山西",15:"内蒙古",
21:"辽宁",22:"吉林",23:"黑龙江",31:"上海",32:"江苏", // 21:"辽宁",22:"吉林",23:"黑龙江",31:"上海",32:"江苏",
33:"浙江",34:"安徽",35:"福建",36:"江西",37:"山东",41:"河南", // 33:"浙江",34:"安徽",35:"福建",36:"江西",37:"山东",41:"河南",
42:"湖北",43:"湖南",44:"广东",45:"广西",46:"海南",50:"重庆", // 42:"湖北",43:"湖南",44:"广东",45:"广西",46:"海南",50:"重庆",
51:"四川",52:"贵州",53:"云南",54:"西藏",61:"陕西",62:"甘肃", // 51:"四川",52:"贵州",53:"云南",54:"西藏",61:"陕西",62:"甘肃",
63:"青海",64:"宁夏",65:"新疆",71:"台湾",81:"香港",82:"澳门",91:"国外" // 63:"青海",64:"宁夏",65:"新疆",71:"台湾",81:"香港",82:"澳门",91:"国外"
}; // };
//是否为空 // //是否为空
// if(value === ''){ // // if(value === ''){
// callback(new Error('请输入正确的身份证')) // // callback(new Error('请输入正确的身份证'))
// } // // }
if(value) { // if(value) {
//校验长度,类型 // //校验长度,类型
if(isCardNo(value) === false){ // if(isCardNo(value) === false){
callback(new Error('请输入正确的身份证')) // callback(new Error('请输入正确的身份证'))
} // }
//检查省份 // //检查省份
if(checkProvince(value,vcity) === false){ // if(checkProvince(value,vcity) === false){
callback(new Error('请输入正确的身份证')) // callback(new Error('请输入正确的身份证'))
} // }
//校验生日 // //校验生日
if(checkBirthday(value) === false){ // if(checkBirthday(value) === false){
callback(new Error('请输入正确的身份证')) // callback(new Error('请输入正确的身份证'))
} // }
//检验位的检测 // //检验位的检测
if(checkParity(value) === false){ // if(checkParity(value) === false){
callback(new Error('请输入正确的身份证')) // callback(new Error('请输入正确的身份证'))
} // }
}else { // }else {
callback() // callback()
} // }
} // }
...@@ -271,23 +271,29 @@ const detectOS = () => { ...@@ -271,23 +271,29 @@ const detectOS = () => {
// 获取用户浏览器信息 // 获取用户浏览器信息
const getBrowser = () => { const getBrowser = () => {
// let OsObject = "未知"; let OsObject = "未知";
// if (navigator.userAgent.indexOf("MSIE") > 0) { if (navigator.userAgent.indexOf("MSIE") > 0 && navigator.userAgent.indexOf("compatible") > -1) { //<ie11
// return "IE"; return "IE";
// } }
// if (navigator.userAgent.indexOf("Firefox") > 0) { if (navigator.userAgent.indexOf("Trident") > 0 && navigator.userAgent.indexOf("rv:11.0") > -1) { //ie11
// return "Firefox"; return "IE";
// } }
// if (navigator.userAgent.indexOf("Chrome") > 0) { if (navigator.userAgent.indexOf("Firefox") > 0) {
// return "Chrome"; return "Firefox";
// } }
// if (navigator.userAgent.indexOf("Safari") > 0) { if (navigator.userAgent.indexOf("Chrome") > 0) {
// return "Safari"; return "Chrome";
// } }
// if (navigator.userAgent.indexOf("Gecko") > 0) { if (navigator.userAgent.indexOf("Safari") > 0) {
// return "Gecko"; return "Safari";
// } }
return navigator.userAgent; if (navigator.userAgent.indexOf("Gecko") > 0) {
return "Firefox";
}
if (navigator.userAgent.indexOf("360") > 0) {
return "360";
}
return OsObject;
}; };
const GetLocalIPAddress = () => { const GetLocalIPAddress = () => {
...@@ -306,7 +312,7 @@ const GetLocalIPAddress = () => { ...@@ -306,7 +312,7 @@ const GetLocalIPAddress = () => {
// 获取用户终端信息 // 获取用户终端信息
const getTerminalType = () => { const getTerminalType = () => {
let brow = "未知"; let brow = "unknown";
// alert(navigator.userAgent); // alert(navigator.userAgent);
if (navigator.userAgent.indexOf('iPad') > -1) { if (navigator.userAgent.indexOf('iPad') > -1) {
// alert("iPad"); // alert("iPad");
...@@ -315,25 +321,25 @@ const getTerminalType = () => { ...@@ -315,25 +321,25 @@ const getTerminalType = () => {
if (navigator.userAgent.indexOf('Android') > -1 if (navigator.userAgent.indexOf('Android') > -1
|| navigator.userAgent.indexOf('Linux') > -1) { || navigator.userAgent.indexOf('Linux') > -1) {
// alert("Android"); // alert("Android");
return brow = "android手机"; return brow = "android";
} }
if (navigator.userAgent.indexOf('iPhone') > -1 if (navigator.userAgent.indexOf('iPhone') > -1
// || navigator.userAgent.indexOf('Mac') > -1 // || navigator.userAgent.indexOf('Mac') > -1
) { ) {
// alert("iPhone"); // alert("iPhone");
return brow = "iPhone手机"; return brow = "iPhone";
} }
if (navigator.userAgent.indexOf('Trident') > -1) { if (navigator.userAgent.indexOf('Trident') > -1) {
// alert("Trident"); // alert("Trident");
return brow = "电脑"; return brow = "PC";
} }
if (navigator.userAgent.indexOf('Presto') > -1) { if (navigator.userAgent.indexOf('Presto') > -1) {
// alert("Presto"); // alert("Presto");
return brow = "电脑"; return brow = "PC";
} }
if (navigator.userAgent.indexOf('Chrome') > -1) { if (navigator.userAgent.indexOf('Chrome') > -1) {
// alert("Chrome"); // alert("Chrome");
return brow = "电脑"; return brow = "PC";
} }
if (navigator.userAgent.indexOf('AppleWebKit') > -1) { if (navigator.userAgent.indexOf('AppleWebKit') > -1) {
// alert("AppleWebKit"); // alert("AppleWebKit");
...@@ -342,7 +348,7 @@ const getTerminalType = () => { ...@@ -342,7 +348,7 @@ const getTerminalType = () => {
if (navigator.userAgent.indexOf('Gecko') > -1 if (navigator.userAgent.indexOf('Gecko') > -1
&& navigator.userAgent.indexOf('KHTML') == -1) { && navigator.userAgent.indexOf('KHTML') == -1) {
// alert("Gecko"); // alert("Gecko");
return brow = "电脑"; return brow = "PC";
} }
if (navigator.userAgent.indexOf("Mac OS X") > -1) { if (navigator.userAgent.indexOf("Mac OS X") > -1) {
// alert("ios"); // alert("ios");
...@@ -350,7 +356,7 @@ const getTerminalType = () => { ...@@ -350,7 +356,7 @@ const getTerminalType = () => {
} }
if (navigator.userAgent.indexOf('Safari') == -1) { if (navigator.userAgent.indexOf('Safari') == -1) {
// alert("Safari"); // alert("Safari");
return brow = "电脑"; return brow = "PC";
} }
return brow; return brow;
}; };
...@@ -443,8 +449,23 @@ export const ssoLogin = (href, paramMap) => { ...@@ -443,8 +449,23 @@ export const ssoLogin = (href, paramMap) => {
initEnvironment(); initEnvironment();
} }
}; };
export const ssoLogin2 = () => { //单独部署不走saas端登录
console.log("ssoLogin2开始");
//获取用户系统信息
initEnvironment();
};
export const getDeviceInfo = () => { //系统信息,获取验证码时有用到
return {
device_brand: localStorage.getItem('terminalType'),
device_type: 1,
system_level: localStorage.getItem('OS'),
device_ip: localStorage.getItem('ipAddress'),
browser_ver: localStorage.getItem('browser')
}
};
//单点登录--end //单点登录--end
//退出登录,跳转到登录页面 //退出登录,跳转到登录页面
......
<template>
<router-view></router-view>
</template>
<script>
export default {
name: "layout"
}
</script>
<style scoped>
</style>
<template>
<div class="finish-followup" v-if="showThisPage">
<el-dialog
title="选择随访开始时间"
:visible.sync="showAddPatientTime"
v-if="showThisPage"
:before-close="clickClose"
width="35%"
center>
<div class="finish-content">
<el-form
:model="addPatientData"
:rules="rules"
ref="addPatientData"
label-width="140px">
<el-form-item label="已选居民:">
{{addPatientData.patientNames}}
</el-form-item>
<el-form-item label="随访开始时间:" prop="joinTime">
<el-date-picker
v-model="addPatientData.joinTime"
type="date"
placeholder="请选择随访开始时间"
:editable="false"
format="yyyy-MM-dd"
value-format="timestamp"
clearable>
</el-date-picker>
</el-form-item>
</el-form>
</div>
<span slot="footer" class="dialog-footer">
<el-button class="button-while" @click="clickClose" size="small" plain>取 消</el-button>
<el-button class="button-green" @click="addPatient" size="small" type="primary">确 定</el-button>
</span>
</el-dialog>
</div>
</template>
<script>
import { createFollowPlan } from '../../../../utils/followup/followapis'
import { mapState, mapActions} from 'vuex';
export default {
name: "add-patient-time",
props: {
showThisPage: { //是否显示model
type: Boolean,
default: function () {
return false;
}
},
addPatientData: {
type: Object,
default: function () {
return {};
}
},
},
data() {
return {
showAddPatientTime: true,
rules: {
joinTime: [
{ required: true, message: '请选择随访开始时间', trigger: 'change' },
],
}
}
},
mounted() {
//this.getFollowStartTimeList(this.$route.query.planId);// 获取随访时间列表
},
computed: {
...mapState('planManage', {
//followStartTimeList: state => state.followStartTimeList,
})
},
methods: {
...mapActions('planManage', ['getFollowStartTimeList', 'getResidentList']),
clickClose() {
this.$emit('sendJoinTime',null)
this.$emit('closeAddPatientTime',false)
},
addPatient() {
this.$refs['addPatientData'].validate(valid => {
if (valid) {
if(this.$route.name == 'planModify') {
this.$emit('sendJoinTime',this.addPatientData.joinTime)
this.$emit('closeAddPatientTime',false)
} else {
const { id, patientIdList, joinTime } = this.addPatientData;
createFollowPlan({
id,
addPatients: true,
patientIdList,
joinTime
}).then((data) => {
if(data.code == '000000') {
this.$message({
message: '添加成功!',
type: 'success'
});
this.getResidentList({
planId: this.addPatientData.id,
status: this.addPatientData.status
})
this.$emit('closeAddPatientTime',false)
} else {
this.$message({
message: `${data.message}`,
type: 'error'
});
}
}).catch((err) => {
this.$message({
message: `${err.message}`,
type: 'error'
});
});
}
} else {
return false;
}
});
}
}
}
</script>
<style scoped>
.el-input__inner:disabled {
background-color: #ffffff!important;
}
</style>
<style lang="scss" scoped>
@import '../../../../style/followup/followup-common';
@import '../../../../style/followup/element-reset.css';
</style>
<template>
<div class="change-plan">
<el-dialog
title="变更计划"
:visible.sync="showChangePlan"
width="35%"
v-if="showThisPage"
:before-close="clickClose"
center>
<el-form :model="planChangeData" label-width="110px" :rules="rules" ref="planChangeData">
<el-form-item label="分组:" prop="yLabelList">
<el-select
v-model="planChangeData.yLabelList"
multiple
@change="selectGroup"
placeholder="请选择">
<el-option
v-for="(item, index) in realGroup"
:key="index"
:label="item.labelName"
:value="item.labelId">
</el-option>
</el-select>
</el-form-item>
<el-form-item label="随访计划:" prop="planId">
<el-select
v-model="planChangeData.planId"
@change="selectPlan"
size="small">
<el-option
v-for="(item,index) in planOption"
:key="index"
:label="item.name"
:value="item.id">
</el-option>
</el-select>
</el-form-item>
<el-form-item label="随访开始时间:" prop="startDate">
<el-date-picker
v-model="planChangeData.startDate"
type="date"
format="yyyy-MM-dd"
value-format="timestamp"
:editable="false"
placeholder="选择随访开始时间">
</el-date-picker>
</el-form-item>
</el-form>
<span slot="footer" class="dialog-footer">
<el-button class="button-white" @click="clickClose" size="small" plain>取 消</el-button>
<el-button class="button-green" @click="changePlans" size="small" type="primary" >确 定</el-button>
</span>
</el-dialog>
</div>
</template>
<script>
import { mapState, mapActions } from 'vuex';
import { changePlan } from '../../../../utils/followup/followapis'
export default {
name: "change-plan",
props: {
showThisPage: { //是否显示model
type: Boolean,
default: function () {
return false;
}
},
planChangeData: {
type: Object,
default: function () {
return {};
}
},
/*groupOption: {
type: Array,
default: function () {
return [];
}
},*/
/*planOption: {
type: Array,
default: function () {
return [];
}
},*/
},
data() {
return {
showChangePlan: true,
selectedGroup: [],
rules: {
planId: [
{ required: true, message: '请选择随访计划', trigger: 'change' },
],
startDate: [
{ required: true, message: '请选择随访开始时间', trigger: 'change' },
]
},
realGroup: [],
selectPlanName: ''
}
},
mounted() {
this.getPlanOptions();
// 获取随访时间列表
},
computed: {
...mapState('planManage', {
planOption: state => state.planOption,
groupList: state => state.groupList,
nodeTimeList: state => state.nodeTimeList,
})
},
methods: {
...mapActions('planManage', ['getPlanOptions','getResidentList', 'getResidentDetail']),
selectGroup(val) {
const _this = this
_this.selectedGroup = []
val.forEach(function (item, index) {
let nodeItem = _this.groupList.filter(function(item1){
return item1.labelId == item;
});
let pushItem = {
labelId: nodeItem[0].labelId,
label: nodeItem[0].labelName,
}
_this.selectedGroup.push(pushItem)
})
},
selectPlan(val) {
let arr = this.planOption.filter((item=>{return item.id == val}));
this.selectPlanName = arr[0].name
},
clickClose() {
this.$emit('closeChangePlan',false);
},
changePlans() {
const _this = this
this.$refs['planChangeData'].validate(valid => {
if (valid) {
const { planPatientsId, planId, patientId, startDate, planIdOld } = this.planChangeData;
changePlan({
planPatientsId,
planId,
patientId,
yLabelList: this.selectedGroup,
startDate,
oldPlanId: parseInt(planIdOld)
}).then((data) => {
if(data.code == '000000') {
this.$message({
message: '变更计划成功!',
type: 'success'
});
if(this.$route.name == 'residentList') {
this.getResidentList({
planId: this.planChangeData.planIdOld,
status: this.planChangeData.status
});
} else if(this.$route.name == 'residentDetail') {
this.$router.push({path: '/followup/plan-manage/resident-detail', query: {patientId: patientId, planId: planId}});
this.getResidentDetail({
planId,
patientId
})
}
this.clickClose()
} else if(data.code == '200005') {
this.$message({
message: `${this.planChangeData.patientName}用户已经在${this.selectPlanName}计划中。`,
type: 'success'
});
} else {
this.$message({
message: `${data.message}`,
type: 'error'
});
}
}).catch((err) => {
this.$message({
message: `${err.message}`,
type: 'error'
});
});
} else {
return false;
}
});
},
},
watch: {
planChangeData(val) {
const _this = this
let labelList = val.yLabelList;
labelList.forEach(function (item, index) {
let nodeItem = _this.groupList.filter(function(item1){
return item1.labelId == item;
});
let pushItem = {
labelId: nodeItem[0].labelId,
label: nodeItem[0].labelName,
};
const isPush = _this.selectedGroup.filter(function(t){
return t.labelId == pushItem.labelId;
})
if(!isPush.length) {
_this.selectedGroup.push(pushItem)
}
})
},
groupList(val) {
this.realGroup = val.filter((item=>{return item.labelName!=='未分组'}))
}
}
}
</script>
<style scoped>
.el-select {
width: 100%;
}
</style>
<template>
<div class="finish-followup" v-if="showThisPage">
<el-dialog
:title="finishData.title"
:visible.sync="showFinishFollowup"
v-if="showThisPage"
:before-close="clickClose"
width="30%"
center>
<div class="finish-content">
<el-form
:model="finishData"
:rules="rules"
label-width="100px" ref="finishData">
<el-form-item label="居民:">
{{finishData.patientName}}
</el-form-item>
<el-form-item :label="finishData.reasonName" prop="finishReason">
<el-input
type="textarea"
v-model="finishData.changeReason"
placeholder="请输入原因"
maxlength="30"
rows="3"
resize="none"></el-input>
</el-form-item>
</el-form>
</div>
<span slot="footer" class="dialog-footer">
<el-button class="button-white" @click="clickClose" size="small" plain>取 消</el-button>
<el-button class="button-green" @click="finishFollowUp" size="small" type="primary">确 定</el-button>
</span>
</el-dialog>
</div>
</template>
<script>
import { mapActions } from 'vuex';
import { finishPlan } from '../../../../utils/followup/followapis'
export default {
name: "finish-followup",
props: {
showThisPage: { //是否显示model
type: Boolean,
default: function () {
return false;
}
},
finishData: {
type: Object,
default: function () {
return {};
}
}
},
data() {
return {
showFinishFollowup: true,
rules: {
changeReason: [
{ required: true, message: '请输入原因', trigger: 'blur' },
{ min: 1, max: 30, message: '长度在30个字符内', trigger: 'blur' }
],
},
}
},
methods: {
...mapActions('planManage', ['getResidentList','getResidentDetail']),
clickClose() {
this.$emit('closeFinishFollowup',false)
},
finishFollowUp() {
this.$refs['finishData'].validate(valid => {
if (valid) {
const { changeCode, planId, patientIdList, planPatientsIdList,changeReason } = this.finishData;
finishPlan({
changeCode,
planId,
patientIdList,
planPatientsIdList,
changeReason
}).then((data) => {
if(data.code == '000000') {
this.$message({
message: '操作成功!',
type: 'success'
});
if(this.$route.name == 'residentList') {
this.getResidentList({
planId,
status: changeCode
})
} else if(this.$route.name == 'residentDetail') {
this.getResidentDetail({
planId,
patientId: patientIdList[0],
fuPlanPatientId: planPatientsIdList[0]
})
}
this.clickClose()
} else {
this.$message({
message: `${data.message}`,
type: 'error'
});
}
}).catch((err) => {
this.$message({
message: `${err.message}`,
type: 'error'
});
});
} else {
return false;
}
});
}
}
}
</script>
<style scoped>
.el-input__inner:disabled {
background-color: #ffffff!important;
}
</style>
<style lang="scss" scoped>
@import '../../../../style/followup/followup-common';
@import '../../../../style/followup/element-reset.css';
</style>
<template>
<div class="follow-time">
<el-dialog
title="随访开始时间"
:visible.sync="showFollowTime"
v-if="showThisPage"
:before-close="clickClose"
center>
<div class="finish-content">
<el-table
:data="nodeTimeList"
center
style="width: 100%;margin-top: 20px;">
<el-table-column
prop="timeStr"
label="随访计划开始时间"
align="center">
</el-table-column>
<el-table-column
prop="num"
label="人数"
align="center">
</el-table-column>
</el-table>
</div>
</el-dialog>
</div>
</template>
<script>
export default {
name: "follow-time",
props: {
showThisPage: { //是否显示model
type: Boolean,
default: function() {
return false;
}
},
nodeTimeList: {
type: Array,
default: function() {
return []
}
}
},
mounted() {
if(this.planId) {
}
},
data() {
return {
showFollowTime: true,
followUpTimeList: []
}
},
methods: {
clickClose() {
this.$emit('closeFollowTime',false)
},
}
}
</script>
<style scoped>
</style>
<template>
<div class="selected-dialog">
<el-dialog
title="已选居民"
:visible.sync="showSelectedDialog"
:before-close="clickClose"
:close-on-click-modal="false"
:close-on-press-escape="false"
center :lock-scroll="false"
width="65%">
<div class="selected-dialog-content">
<div class="title-div">
<el-button type="primary" size="small" @click="continueAdd">继续添加</el-button>
</div>
<el-table
:data="eachHasSelectedList"
center
style="width: 100%;margin-top: 20px;">
<el-table-column
prop="nickname"
label="姓名"
align="center">
</el-table-column>
<el-table-column
prop="age"
label="年龄"
align="center"
min-width="70px">
</el-table-column>
<el-table-column
prop="id"
label="身份证号"
align="center"
min-width="220">
</el-table-column>
<el-table-column
prop="mobilePhone"
label="手机"
align="center"
min-width="120">
</el-table-column>
<el-table-column
prop="labelId"
label="分组"
align="center"
min-width="200">
</el-table-column>
</el-table>
<el-row type="flex" justify="end" class="margin-top20">
<el-pagination
background
v-if="eachHasSelectedList.length"
@size-change="handleSizeChangePre"
@current-change="handleCurrentChangePre"
layout="total, sizes, prev, pager, next, jumper"
:current-page="paginationSet.pageNum"
:page-sizes="[5,10,50,100]"
:page-count="paginationSet.total"
:page-size="paginationSet.pageSize"
:total="paginationSet.total">
</el-pagination>
</el-row>
</div>
</el-dialog>
</div>
</template>
<script>
export default {
components: {},
name: "select-patient",
data() {
return {
showSelectedDialog: true,
eachHasSelectedList: [], // 由分页pageSize算出一页多少条数
paginationSet: {
pageNum: 1,
pageSize: 5,
total: 0
},
}
},
props: {
hasSelectedList: Array, // 所有已选人数
},
mounted() {
this.eachHasSelectedList = this.getPageList(this.hasSelectedList)
const totalLength = this.hasSelectedList.length
this.paginationSet.total = totalLength
},
methods: {
getPageList(list){
const pageNum = this.paginationSet.pageNum -1;
const pageSize = this.paginationSet.pageSize;
const startIndex = pageNum * pageSize;
const endIndex = this.paginationSet.pageNum * pageSize;
// return list.slice(pageNum,pageSize)
return list.slice(startIndex, endIndex)
},
clickClose() {
this.$emit('closeSelectedDialog',false)
},
continueAdd() {
this.$emit('continueAdd', false)
},
handleSizeChangePre(val) {
this.paginationSet.pageSize = val;
this.paginationSet.pageNum = 1;
this.eachHasSelectedList = this.getPageList(this.hasSelectedList)
},
handleCurrentChangePre(val) {
this.paginationSet.pageNum = val
this.eachHasSelectedList = this.getPageList(this.hasSelectedList)
},
}
}
</script>
<style scoped>
</style>
<style scoped lang="scss">
.margin-top20{
margin-top: 20px;
}
.title-div{
display: flex;
justify-content: flex-end;
}
.selected-dialog-content{
margin-top: -15px;
}
</style>
<template>
<div class="finish-followup" v-if="showThisPage">
<el-dialog
title="恢复随访"
:visible.sync="showFinishFollowup"
v-if="showThisPage"
:before-close="clickClose"
width="30%"
center>
<div class="finish-content">
<el-form
:model="recoverData"
:rules="rules"
label-width="100px">
<el-form-item label="居民:">
{{recoverData.patientName}}
</el-form-item>
<el-form-item label="恢复原因:" prop="finishReason">
<el-input
type="textarea"
v-model="recoverData.finishReason"
placeholder="请输入原因"
maxlength="30"
rows="3"
resize="none"></el-input>
</el-form-item>
</el-form>
</div>
<span slot="footer" class="dialog-footer">
<el-button class="button-green" @click="clickClose" size="small" type="primary">取 消</el-button>
<el-button class="button-white" @click="clickClose" size="small" plain>确 定</el-button>
</span>
</el-dialog>
</div>
</template>
<script>
export default {
name: "recover-followup",
props: {
showThisPage: { //是否显示model
type: Boolean,
default: function () {
return false;
}
},
recoverData: {
type: Object,
default: function () {
return {};
}
}
},
data() {
return {
showFinishFollowup: true,
rules: {
recoverData: [
{ required: true, message: '请输入恢复原因', trigger: 'blur' },
{ min: 1, max: 30, message: '长度在30个字符内', trigger: 'blur' }
],
}
}
},
methods: {
clickClose() {
this.$emit('closeRecoverFollowup',false)
},
}
}
</script>
<style scoped>
.el-input__inner:disabled {
background-color: #ffffff!important;
}
</style>
<style lang="scss" scoped>
@import '../../../../style/followup/followup-common';
@import '../../../../style/followup/element-reset.css';
</style>
<template>
<el-dialog
title="选择患教内容"
:visible.sync="showCartoonDialog"
v-if="isSelectCartoon"
:before-close="clickClose"
center>
<div class="select-content">
<div class="first-section">
<el-select
placeholder="请选择疾病"
v-model="diseaseId"
size="small"
@change="changeDisease"
>
<el-option
v-for="(item,index) in diseaseOptions"
:key="index"
:label="item.value"
:value="item.no">
</el-option>
</el-select>
<el-select
v-if="showSecond"
v-model="typeId"
@change="changeType"
placeholder="请选择类目"
size="small"
style="margin-left:20px;"
>
<el-option
v-for="(item,index) in typeList"
:key="index"
:label="item.value"
:value="item.no">
</el-option>
</el-select>
</div>
<div class="scroll-section">
<el-radio-group v-model="sendObj" size="small">
<el-radio
v-for="(item, index) in cartoonList"
:key="index"
:label="item" class="radio-item">{{item.header_name}}</el-radio>
</el-radio-group>
</div>
</div>
<span slot="footer" class="dialog-footer">
<el-button class="button-green" size="small" @click="clickClose" plain>取 消</el-button>
<el-button class="button-white" size="small" @click="sureSelect" type="primary">确 定</el-button>
</span>
</el-dialog>
</template>
<script>
import { getBasicData, getAllEducationComtent } from '@/utils/followup/followapis'
export default {
components: {},
data() {
return {
sendObj: {},
saasDisease: '', // 高血压标识
showSecond: false,//是否显示分类
showCartoonDialog: true,
cartoonList: [],
patientTypeModels: [],
diseaseId: '',//所选疾病id
typeId: '',//所选分类id
typeList : [ // 分类列表
{
no: '',
value: '全部'
}
],
diseaseOptions: [ //疾病列表
{
no: '',
value: '全部'
}
],
}
},
props: {
isSelectCartoon: Boolean,
activeComentId: String,
},
watch: {
isSelectCartoon(val){
if(val){
getBasicData({
numList: 'P036,P004'
}).then(res=>{
this.diseaseOptions = [ //疾病列表
{
no: '',
value: '全部'
}
];
this.diseaseOptions = this.diseaseOptions.concat(res.data.P004)
this.typeList = this.typeList.concat(res.data.P036)
this.patientTypeModels = [...res.data.P004,...res.data.P036]
})
getAllEducationComtent({}).then(res=>{
this.picapEducationComtentsForHypertension = res.data.picapEducationComtentsForHypertension;
this.picapEducationComtentsForNotHypertension = res.data.picapEducationComtentsForNotHypertension;
this.allList = [...this.picapEducationComtentsForHypertension,...this.picapEducationComtentsForNotHypertension];
this.cartoonList = this.allList
this.articleTable = this.picapEducationComtentsForNotHypertension
})
}else{
this.cartoonList = [];
this.sendObj = {};
}
},
cartoonList(val){
if(this.activeComentId){
for(let i=0;i<val.length;i++){
if(val[i].id == this.activeComentId){
this.sendObj = val[i]
}
}
}
}
},
methods: {
changeDisease(val){
this.saasDisease = val
if(!val){
this.cartoonList = this.allList
this.showSecond = false
}else if(val===1){
this.showSecond = true
this.articleTable = this.picapEducationComtentsForHypertension
this.reduceArticleArray(this.articleTable,val)
this.cartoonList = this.articleTable
}else{
this.showSecond = false
this.articleTable = this.picapEducationComtentsForNotHypertension
this.cartoonList = this.reduceArticleArray(this.articleTable,val)
}
},
changeType(id){
if(!id && this.saasDisease === 1){ // 选中全部时。
this.cartoonList = this.picapEducationComtentsForHypertension
}else{
this.cartoonList = this.reduceArticleArray(this.articleTable,id);
}
},
reduceArticleArray(articleTable,id){
let array = [];
let count = 0;
for(let k = 0; k < this.patientTypeModels.length; k++){
if(this.patientTypeModels[k].no > count){
count = this.patientTypeModels[k].no;
}
}
for(let j = 0; j <= count; j++){
array[j] = [];
}
for(let i = 0; i < articleTable.length; i++){
let coun = this.showSecond ? articleTable[i].education_classify : articleTable[i].type;
if(coun && coun <= count){
array[coun].push(articleTable[i]);
}
}
return array[id]
},
clickClose() {
this.$emit('closeSelectCartoon')
},
sureSelect() {
if(this.sendObj.id){
this.$emit('confirmSelectComent', this.sendObj);
}else{
this.$message({
message: '请选择漫画',
type: 'warning'
});
}
},
},
}
</script>
<style scoped lang="scss">
.select-content{
.first-section{
}
.scroll-section{
margin-top: 20px;
border: 1px solid #DCDFE6;
border-radius: 5px;
height: 300px;
overflow-y: scroll;
padding-left: 10px;
.radio-item{
padding: 10px 0;
display: block;
width: 100%;
border-bottom: 1px solid #DCDFE6;
}
&::-webkit-scrollbar{
width:5px;
}
&::-webkit-scrollbar-thumb {/*滚动条里面小方块*/
border-radius: 10px;
-webkit-box-shadow: inset 0 0 5px rgba(0,0,0,0.2);
background: rgba(0,0,0,0.1);
}
}
}
.el-radio-group{
width: 100%;
}
</style>
<template>
<div class="select-patient-dialog">
<el-dialog
title="选择居民"
:visible.sync="showSelectPatient"
v-if="isShowSelectPatient"
:before-close="clickClose"
:close-on-click-modal="false"
:close-on-press-escape="false"
width="950px"
top="2%"
center>
<div class="finish-content">
<el-form
ref="searchData"
:model="searchData"
:inline="true"
class="select-width"
size="small">
<el-form-item>
<el-select v-model="searchData.sex" @change="changeSex" >
<el-option
v-for="(item,index) in sexOptions"
:key="index"
:label="item.value"
:value="item.no">
</el-option>
</el-select>
</el-form-item>
<el-form-item>
<el-select v-model="searchData.ageRange" @change="changeAge" >
<el-option
v-for="(item,index) in ageOptions"
:key="index"
:label="item.value"
:value="item.value">
</el-option>
</el-select>
</el-form-item>
<el-form-item>
<el-select v-model="searchData.diseaseId" @change="changeDisease" >
<el-option
v-for="(item,index) in diseaseOptions"
:key="index"
:label="item.diseaseName"
:value="item.diseaseId">
</el-option>
</el-select>
</el-form-item>
<el-form-item>
<el-select v-model="searchData.labelId" @change="changeLabel" >
<el-option
v-for="(item,index) in labelOptions"
:key="index"
:label="item.labelName"
:value="item.labelId">
</el-option>
</el-select>
</el-form-item>
<el-form-item style="width:160px;">
<el-input v-model="searchData.searchCondition" placeholder="请输入姓名或手机号" >
<i slot="prefix" class="el-input__icon el-icon-search" @click="searchHandler" style="cursor: pointer"></i>
</el-input>
</el-form-item>
</el-form>
<el-table
:data="patientsData"
ref="multipleTable"
center
style="width: 100%;margin-top: 20px;"
height="280"
:row-key="getRowKeys"
@selection-change="handleSelectionChange">
<el-table-column
type="selection"
align="center"
:reserve-selection="true"
:selectable="checkboxInit">
</el-table-column>
<el-table-column
prop="nickname"
label="姓名"
align="center">
</el-table-column>
<el-table-column
prop="sexStr"
label="性别"
align="center">
</el-table-column>
<el-table-column
prop="age"
label="年龄"
align="center">
</el-table-column>
<el-table-column
prop="mobilePhone"
label="手机"
align="center"
min-width="150px">
</el-table-column>
<el-table-column
prop="showDiseaseNames"
label="基础疾病"
align="center"
width="200"
:show-overflow-tooltip="true">
</el-table-column>
<el-table-column
prop="showLabelName"
label="分组"
align="center"
width="200"
:show-overflow-tooltip="true">
</el-table-column>
</el-table>
<el-row type="flex" justify="end" class="margin-top20">
<el-pagination
background
v-if="patientsData.length"
@size-change="handleSizeChangePre"
@current-change="handleCurrentChangePre"
layout="total, sizes, prev, pager, next, jumper"
:current-page="paginationSet.pageNum"
:page-sizes="[5,10,50,100]"
:page-size="paginationSet.pageSize"
:total="paginationSet.total">
</el-pagination>
</el-row>
</div>
<div slot="footer" class="dialog-footer">
<el-button @click="clickClose" size="small" plain>取 消</el-button>
<el-button type="primary" size="small" @click="sureClick">确 定</el-button>
</div>
</el-dialog>
</div>
</template>
<script>
import { mapState, mapActions } from 'vuex'
import { getBasicData, getPlanPatientsList, getAllDiseases, getAllLabels } from '@/utils/followup/followapis'
export default {
components: {},
name: "select-patient",
data() {
return {
showSelectPatient: true,
allSelects: [],
// eachSelects: [],//仅仅是操作选择的总人员
// totalSelect: [],// 当前所选的人
labelId: '',
diseaseId: '',
age: '',
sex: '',
ageBegin: '',
ageEnd: '',
srvPackageId: '',
searchCondition: '',
patientsData: [],
searchData: {
sex: '性别',
ageRange: '年龄范围',
ageBegin: '',
ageEnd: '',
diseaseId: '基础疾病',
labelId: '分组',
searchCondition: ''
},
paginationSet: {
pageNum: 1,
pageSize: 5,
total: 0
},
sexOptions: [{
no: '',
value: '性别'
}],
ageOptions: [{
no: '',
value: '年龄范围'
}],
diseaseOptions: [{
diseaseId: '',
diseaseName: '基础疾病'
}],
labelOptions: [{
labelId: '',
labelName: '分组'
}],
newSelects: [], //新选中的人
getRowKeys(row) {
// console.log('sshkdhdk',row)
return row.patientId;
},
}
},
props: {
isShowSelectPatient: Boolean, //是否显示model,
patientIdList: Array,// 确定已经选过的居民
oldPatientIdList: Array,// 确定已经选过的居民
},
watch: {
isShowSelectPatient(val){
if(val){
this.getPatientsList()
// 获取常量 性别、年龄
getBasicData({
numList: 'P057,P006'
}).then(res=>{
this.sexOptions = [{
no: '',
value: '性别'
}];
this.sexOptions = this.sexOptions.concat(res.data.P006);//性别
this.ageOptions = [{
no: '',
value: '年龄范围'
}]
this.ageOptions = this.ageOptions.concat(res.data.P057);//年龄段
})
// 获取所有疾病
getAllDiseases().then(res=>{
this.diseaseOptions = [{
diseaseId: '',
diseaseName: '基础疾病'
}]
this.diseaseOptions = this.diseaseOptions.concat(res.data);
})
// 获取所有分组
getAllLabels({type: 1}).then(res=>{
this.labelOptions = [{
labelId: '',
labelName: '分组'
}]
this.labelOptions = this.labelOptions.concat(res.data.labelNameList);
})
}
},
},
methods: {
checkboxInit(row,index){
if(row.disableNum == undefined) {
return 1
} else {
return row.disableNum
}
},
getPatientsList(){
const data = {
pageSize: this.paginationSet.pageSize,
pageNo: this.paginationSet.pageNum,
labelId:this.labelId,
diseaseId: this.diseaseId,
age: this.age,
sex: this.sex,
ageBegin: this.ageBegin,
ageEnd: this.ageEnd,
srvPackageId:this.srvPackageId,
searchCondition:this.searchCondition,
}
getPlanPatientsList(data).then(res=>{
if(res.data.patientList){
this.patientsData = res.data.patientList //接口获取的当页居民
this.getSex()
this.paginationSet.total = res.data.totalRows
// 设置所请求的当页人员是否成为选中状态
// console.log('传入的已选居民',this.patientIdList)
this.patientsData.forEach((item)=>{
item.disableNum = 1;
let diseaseNames = [];
let groupNames = []
//转化分组
if(item.labelModels) {
item.labelModels.forEach(item => {
groupNames.push(item.label)
});
item.showLabelName = groupNames.join('、');
} else {
item.showLabelName = '-';
}
//转化疾病
if(item.patientTypeModels) {
item.patientTypeModels.forEach(item => {
diseaseNames.push(item.name)
})
item.showDiseaseNames = diseaseNames.join('、');
}else {
item.showDiseaseNames = '-';
}
if(this.patientIdList.length > 0){
if(this.patientIdList.includes(item.patientId)){// 如果已经选过居民
this.$nextTick(()=>{
this.$refs.multipleTable.toggleRowSelection(item,true);
})
}
}
if(this.oldPatientIdList!=undefined&&this.oldPatientIdList.length) {
this.patientsData.forEach((item)=>{
if(this.oldPatientIdList.includes(item.patientId)){// 如果已经选过居民
item.disableNum = 0
} else {
item.disableNum = 1
}
})
}
})
// console.log(this.oldPatientIdList)
}else{
this.patientsData = []
}
})
},
getSex(){
this.patientsData.forEach((item,index)=>{
if(item.sex==1){
this.patientsData[index].sexStr = '男'
}else if(item.sex==2){
this.patientsData[index].sexStr = '女'
}else{
this.patientsData[index].sexStr = '未知'
}
})
},
// 对选中的居民进行去重
removeDuplicates(list){
return Array.from(new Set(list))
},
// 选择居民
handleSelectionChange(val) {
const _this = this;
_this.newSelects = [];
val.forEach(item => {
if(item.disableNum == 1) {
_this.newSelects.push(item)
}
})
},
// 切换分页
handleCurrentChangePre(val) {
this.paginationSet.pageNum = val
this.getPatientsList()
},
clickClose(){
this.$emit('closeSelectPatient',false)
},
sureClick(){
if(this.newSelects.length) {
this.$emit('sureSelectPatient',false,this.newSelects)
} else {
this.$message.warning('请先选择!')
}
},
handleSizeChangePre(val) {
// console.log('handleSizeChangePre')
this.paginationSet.pageSize = val
this.getPatientsList()
},
changeSex(val){
this.sex = val;
this.paginationSet.pageNum = 1;
this.getPatientsList()
},
changeAge(val){
if(val=='年龄范围'){
val = null
}
this.age = val;
this.ageBegin = this.ageDate(val).ageBegin;
this.ageEnd = this.ageDate(val).ageEnd;
this.paginationSet.pageNum = 1;
this.getPatientsList()
},
changeDisease(val){
this.diseaseId = val;
this.paginationSet.pageNum = 1;
this.getPatientsList()
},
changeLabel(val){
this.labelId = val;
this.paginationSet.pageNum = 1;
this.getPatientsList()
},
searchHandler() {
const searchCondition = this.searchData.searchCondition;
this.searchCondition = searchCondition;
this.paginationSet.pageNum = 1;
this.getPatientsList()
},
ageDate(val){
let ageObj;
if(!val){
ageObj = {
ageBegin:'',
ageEnd:''
}
}else if(val.indexOf('+') > -1){
ageObj = {
ageBegin: 84,
ageEnd: 200
}
}else {
let ageItem = val.split('-');
ageObj = {
ageBegin:ageItem[0],
ageEnd:ageItem[1]
}
}
return ageObj;
}
},
}
</script>
<style lang="scss">
.select-patient-dialog {
.el-dialog__wrapper {
overflow: hidden;
.el-dialog--center {
height: 580px;
.el-table--scrollable-y,.el-table__body-wrapper {
&::-webkit-scrollbar{
width:5px;
}
&::-webkit-scrollbar-thumb {/*滚动条里面小方块*/
border-radius: 10px;
-webkit-box-shadow: inset 0 0 5px rgba(0,0,0,0.2);
background: rgba(0,0,0,0.1);
}
}
/*.el-dialog__body {
max-height: 80%;
overflow: hidden;
.finish-content {
height: 100%;
.el-table {
.el-table--scrollable-y .el-table__body-wrapper {
height: 80%;
}
}
}
}*/
}
}
.select-width .el-form-item{
width: 130px;
}
.margin-top20{
margin-top: 20px;
}
}
</style>
<template>
<div>
<!--新增时间节点-->
<div v-if="!isStandedTemplate">
<el-button
size="small"
type="primary"
@click="addNewNode()"
>新增时间节点
</el-button>
</div>
<div class="add-time-content">
<div class="time-line-scroll special-control-class">
<el-tabs v-model="activeTab" type="card" @tab-remove="deleteTimeNode" :closable="tabClosable()" :before-leave="checkHasChoseComent">
<!--:before-leave="checkHasChoseComent"-->
<el-tab-pane
v-for="(itemTimeForm, index) in setTimeNodeList"
:key="index"
:label="showTabLabel(itemTimeForm)"
:name="index+''"
>
<div
v-show="index == activeTab"
class="form-div"
>
<el-form :ref="itemTimeForm.formRef" :model="itemTimeForm" :rules="timeFormRules" label-suffix=":" label-width="140px" :inline-message="false" size="small">
<el-form-item label="本次随访时间" required>
<div style="display: flex;">
<el-form-item prop="timeNo">
<el-input
style="width:200px;"
v-model="itemTimeForm.timeNo"
type="text"
size="small"
placeholder="请输入"
:disabled="itemIsDisabled(itemTimeForm)"
@blur="timeNoBlur"
maxlength="2"
clearable />
</el-form-item>
<el-form-item prop="timeUnit" class="ml20">
<el-select style="width:400px;" v-model="itemTimeForm.timeUnit" placeholder="请选择" @change="choseTimeUit" :disabled="itemTimeForm.isDisabled" :popper-append-to-body="false">
<el-option
v-for="(item,index) in markOptions"
:key="index"
:label="item.value"
:value="item.no">
</el-option>
</el-select>
</el-form-item>
</div>
</el-form-item>
<el-form-item label="随访方式" prop="type">
<el-radio-group v-model="itemTimeForm.type" size="small">
<el-radio v-for="(item,index) in followTypeList" :key="index" :label="item.no" :disabled="itemIsDisabled(itemTimeForm)">{{item.value}}</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item label="提醒医生预约居民">
<el-select
v-if="planId || itemTimeForm.remindDay"
v-model="itemTimeForm.remindDay"
multiple
:multiple-limit=3
:disabled="itemIsDisabled(itemTimeForm)"
@change="changeRemindDay"
:popper-append-to-body="false"
placeholder="请选择">
<el-option
v-for="(item_sub,index) in remindOptions"
:key="index"
:label="item_sub.value"
:value="item_sub.no">
</el-option>
</el-select>
</el-form-item>
<el-form-item label="推送患教">
<div style="display: flex">
<el-select
v-model="itemTimeForm.pushDay"
placeholder="选择推送时间"
clearable
@change="changePushDay"
:popper-append-to-body="false"
:disabled="itemIsDisabled(itemTimeForm)"
>
<el-option
v-for="(item_sub,index) in pushTimeOptions"
:key="index"
:label="item_sub.value"
:value="item_sub.no">
</el-option>
</el-select>
<el-button plain class="ml20" @click="goSelectCartoon" v-if="showChoseComtent(itemTimeForm)">选择健康漫画</el-button>
<div class="selected-div ml20" v-if="itemTimeForm.hasSelected">
<h5>{{itemTimeForm.comentMsg.header_name}}</h5>
<el-button type="text" @click="goSelectCartoon" v-if="showRechoseDelete(itemTimeForm)">重选</el-button>
<el-button type="text" @click="deleteClick(index)" v-if="showRechoseDelete(itemTimeForm)">删除</el-button>
</div>
</div>
</el-form-item>
<div class="tips-contnt" v-if="itemTimeForm.hasSelected">
<p class="yellow-font">当前计划中共{{totalNumber}}位居民(微信:{{wechatPatientNum}}位,短信:{{messagePatientNum}}位),本次定时推送任务在发送当日预计需要{{messagePatientNum}}条短信额度(微信推送不消耗额度,建议您让居民关注云鹊健康微信公众号),务必提前确保短信额度的充足。</p>
<p>需要更多额度,请前往「云鹊医App-个人中心-啾啾币中心」兑换短信额度后再进行预约,您也可以联系云鹊医客服购买短信额度,客服电话:400-920-8877</p>
</div>
<el-form-item label="随访登记表">
<el-select
v-if="planId || itemTimeForm.followResourceId"
v-model="itemTimeForm.followResourceId"
multiple
:multiple-limit=3
@change="changeFollowId"
:disabled="itemIsDisabled(itemTimeForm)"
:popper-append-to-body="false"
placeholder="请选择">
<el-option
v-for="(item_sub,index) in formOptions"
:key="index"
:label="item_sub.name"
:value="item_sub.scaleNo">
</el-option>
</el-select>
</el-form-item>
</el-form>
</div>
</el-tab-pane>
</el-tabs>
</div>
</div>
<select-cartoon
:isSelectCartoon="isSelectCartoon"
:activeComentId="activeComentId"
@closeSelectCartoon="closeSelectCartoon"
@confirmSelectComent="confirmSelectComent"
/>
</div>
</template>
<script>
import _ from 'lodash';
import SelectCartoon from '@/views/followup/plan-manage/dialog/select-cartoon';
// import SetTimeForm from '@/views/followup/plan-manage/dialog/set-time-form';
import {getFormOptions, getPatientNumber, getBasicData} from '@/utils/followup/followapis'
import { mapState,mapActions } from 'vuex'
export default {
components: {
SelectCartoon,
// SetTimeForm
},
data() {
const checkDay = (rule, value, callback)=>{
const num = parseFloat(value);
if(num < 0 || num > 100){
return callback(new Error('数字范围0-99'));
}
if(!Number.isInteger(num) || String(value).indexOf('.') > 0){
return callback(new Error('数字必须为整数'));
}
callback();
}
return {
setTimeNodeList: [],
isValied: false,
timeUnit: '',
timeUnitStr: '',
timeFormRules: {
timeNo: [{ required: true, message: '请添加随访时间', trigger: 'change' },{ validator: checkDay, trigger: 'blur' }],
timeUnit: [{ required: true, message: '请添加随访时间', trigger: 'change' }],
type: [{ required: true, message: '请选择随访方式', trigger: 'change' }],
},
isSelectCartoon: false,
activeTab: '0',
activeComentId: '',
markOptions: [],
followTypeList: [],
remindOptions: [],
pushTimeOptions: [],
formOptions: [],
wechatPatientNum: 0,
messagePatientNum: 0,
totalNumber: 0,
activeResourceId: '',
errMsg: '',
timeIsRepeat: false,
hasData: false,
}
},
props: {
resourceId: String,
standedTimeNodeList: Array,
patientIdList: Array,
checkForm: Boolean,
isStandedTemplate: Boolean,
planId: String,
},
created() {
this.getConstData();
},
mounted(){
// console.log(this.resourceId)
if(!this.planId){//新建计划
this.initNewForm();
}
},
watch: {
// 初始化 固定模板或者修改计划 的时间节点
standedTimeNodeList(val){
if(this.isStandedTemplate || this.planId){
// this.activeTab = '0';
this.setTimeNodeList = val;
this.$forceUpdate();
}
},
resourceId(val){
// console.log('props=',val)
// console.log('activeResourceId=',this.activeResourceId)
if(parseFloat(val) >= 0){
if(val!==this.activeResourceId){
this.activeTab = '0';
this.setTimeNodeList = this.standedTimeNodeList;
this.$forceUpdate();
if(this.isStandedTemplate){// 系统固定模板
}else{//自定义模板
this.initNewForm();
}
}
}
},
setTimeNodeList(val){
// this.setTimeNodeList = val;
if(this.setTimeNodeList.length > 0){
this.timeUnit = this.setTimeNodeList[0].timeUnit
// 这里操作时间节点的数据
this.setTimeNodeList.forEach((item,index)=>{
if((index > 0 && !this.isStandedTemplate) || this.isStandedTemplate || !item.change){
item.isDisabled = true;
item.timeUnit = this.timeUnit;
}else{
item.isDisabled = false;
}
if(item.remindList && item.remindList.length > 0){// remindDay 提醒医生预约提前天数
item.remindDay = []
item.remindList.forEach((kkk)=>{
item.remindDay.push(kkk.startDays)
})
}
if(item.pushContentList && item.pushContentList.length > 0){//pushDay 推送患教提前天数
let pushData = item.pushContentList[0]
item.hasSelected = pushData.resourceId ? true : false;
item.pushDay = pushData.startDays
item.comentMsg = {
id: pushData.resourceId,
header_name: pushData.sendContent
}
}
if(item.followupList && item.followupList.length > 0){ //followResourceId 随访量表
item.followResourceId = []
item.followupList.forEach((kkk)=>{
if(this.isStandedTemplate){
this.formOptions = [
{
scaleNo: kkk.resourceId,
name: kkk.sendContent
}
]
}
item.followResourceId.push(kkk.resourceId)
})
}
this.setTimeNodeList[index].formRef = 'form' + index;
});
this.$forceUpdate();
this.choseTimeUit(this.setTimeNodeList[0].timeUnit);
if(!this.hasData){
this.$nextTick(()=>{
this.activeTab = this.setTimeNodeList.length - 1 + '';
this.hasData = true;
})
}
// this.activeTab = this.setTimeNodeList.length - 1 + '';
}
},
patientIdList(val){
// 获取微信和短信用户数量
if(val.length > 0){
getPatientNumber({
patientIdList: val
}).then(res=>{
if(res.code=='000000'){
this.wechatPatientNum = res.data.wechatPatientNum;
this.messagePatientNum = res.data.messagePatientNum;
this.totalNumber = this.wechatPatientNum + this.messagePatientNum
}else{
this.$message({
message: res.message,
type: 'error'
});
}
})
}
},
// 保存
checkForm(val){
if(val){// 触发了 保存 校验
this.saveData();
}
},
markOptions(val){
//设置单位
val.forEach((ob)=>{
if(this.timeUnit == ob.no){
this.timeUnitStr = ob.value
}
})
}
},
methods: {
// 初始化新的表单
initNewForm(){
this.setTimeNodeList.push({
formRef: 'form' + this.setTimeNodeList.length,
type: '',//随访方式
timeNo: '',//随访时间
timeUnit: '',//随访时间单位
remindList: [],//提醒医生预约提前天数
pushContentList: [],//推送患教提前天数 漫画id
followupList: [],//随访量表id
hasSelected: false,
isDisabled: false,
remindDay: [],
pushDay: '',
followResourceId: [],
comentMsg: {},
totalNumber: 0,
wechatPatientNum: 0,
messagePatientNum: 0,
change: true
});
},
// 一次性获取常量接口数据
getConstData(){
// 随访时间节点单位
getBasicData({numList: 'P017'}).then(res=>{
this.markOptions = res.data.P017
})
// 随访方式
getBasicData({numList: 'P212'}).then(res=>{
this.followTypeList = res.data.P212
})
// 提醒医生天数
getBasicData({numList: 'P213'}).then(res=>{
this.remindOptions = res.data.P213
})
// 推送患教提醒天数
getBasicData({numList: 'P214'}).then(res=>{
this.pushTimeOptions = res.data.P214
})
// 获取量表
getFormOptions().then(res=>{
this.formOptions = res.data
})
},
// 保存按钮
saveData(){
if(this.isStandedTemplate){//固定模板
// 固定模板,无法修改
this.$emit('addListenSave',{
status: true,
setTimeNodeList: this.setTimeNodeList
})
}else{
if(!this.checkHasChoseComent('save')){
return;
}
// 如果直接点击保存,需要进行对当前填写的表单进行校验
this.checkStart();
if(this.isValied){
// 保存 校验通过后,排序 + 发送请求
// 新增成功之后
this.setTimeNodeList = this.sortKey(this.setTimeNodeList,'timeNo',this.setTimeNodeList[this.activeTab].timeNo);
this.$nextTick(()=>{
this.activeTab = this.setTimeNodeList.length - 1 + '';
})
this.$emit('addListenSave',{
status: true,
setTimeNodeList: this.setTimeNodeList
})
}else{
this.$message({
message: this.errMsg,
type: 'error'
});
this.$emit('addListenSave',{
status: false,
setTimeNodeList: this.setTimeNodeList,
message: this.errMsg
})
}
}
},
// 新增时间节点
addNewNode() {
if(!this.checkHasChoseComent()){
return;
}
//开始校验
this.checkStart();
if(this.isValied){
// 校验通过后,切换tab并且增加初始化list一个item
let newTabName = ++this.activeTab + '';
this.initNewForm();
this.activeTab = newTabName;
// 新增成功之后
this.setTimeNodeList = this.sortKey(this.setTimeNodeList,'timeNo',this.setTimeNodeList[this.activeTab].timeNo);
this.$nextTick(()=>{
this.activeTab = this.setTimeNodeList.length - 1 + '';
})
}else{
this.$message({
message: this.errMsg,
type: 'error'
});
}
},
// 删除时间节点
deleteTimeNode(index) {
let listLen = this.setTimeNodeList.length;
if(listLen<=1){
this.errMsg = '至少选择一个时间节点';
this.$message({
message: this.errMsg,
type: 'error'
});
return;
}else{
this.$confirm('是否删除该时间节点?', '', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(() => {
this.setTimeNodeList.splice(parseFloat(index), 1);
this.activeTab = this.setTimeNodeList.length -1 + '';
this.$forceUpdate();
})
}
},
// 校验漫画是否选择
checkHasChoseComent(type){
// debugger
let pushData = (this.setTimeNodeList[this.activeTab] && this.setTimeNodeList[this.activeTab].pushContentList) ? this.setTimeNodeList[this.activeTab].pushContentList : [];
const len = pushData.length;
const startDays = len ? pushData[0].startDays : null;
const resourceId = len ? pushData[0].resourceId : null;
// console.log(pushData)
// debugger
if(len && (startDays!=='' && startDays >= 0) && !resourceId){
// 如果选了推送时间,没选漫画
this.errMsg = '请选择推送的患教漫画';
this.$message({
message: this.errMsg,
type: 'error'
});
if(type=='save'){
this.$emit('addListenSave',{
status: false,
setTimeNodeList: this.setTimeNodeList,
message: this.errMsg
})
}
return false;
}else if(len && (!startDays && startDays !== 0) && resourceId){
//如果选了漫画,没选推送时间
this.errMsg = '请选择推送时间';
this.$message({
message: this.errMsg,
type: 'error'
});
if(type=='save'){
this.$emit('addListenSave',{
status: false,
setTimeNodeList: this.setTimeNodeList,
message: this.errMsg
})
}
return false;
}else{
return true;
}
},
// 校验开始
checkStart(){
// 如果选择了患教推送时间,则必须选择漫画,否则过不了校验
let len = this.setTimeNodeList.length;
for(let i=0;i<len;i++){
let isValied = this.valiedForm(this.setTimeNodeList[i].formRef);
if(!isValied){
this.activeTab = i + '';
this.isValied = false;
this.errMsg = '请填写完整表单';
return;
}else{
this.isValied = true
this.timeIsRepeat = false;
}
}
let timeNo = this.setTimeNodeList[this.activeTab].timeNo;
this.checkIsRepeat(timeNo);
},
// 检查是否重复
checkIsRepeat(val,lastIndex){
const inx = lastIndex ? lastIndex : this.activeTab;
for(let i=0;i<this.setTimeNodeList.length;i++){
if(inx!=i && val==this.setTimeNodeList[i].timeNo){
this.isValied = false;
this.errMsg = '时间节点重复';
this.timeIsRepeat = true;
this.$message({
message: this.errMsg,
type: 'error'
});
this.setTimeNodeList[inx].timeNo = '';
// if(lastIndex){
// this.setTimeNodeList[inx].timeNo = '';
// }else{
// this.setTimeNodeList[this.activeTab].timeNo = '';
// }
return;
}
this.isValied = true;
this.errMsg = '';
this.timeIsRepeat = false;
}
},
// 表单验证
valiedForm(form){
let validback;
if(this.$refs[form].validate){
this.$refs[form].validate((valid) => {
validback = valid
});
}else{
this.$refs[form][0].validate((valid) => {
validback = valid
});
}
return validback
},
// 时间失去焦点
timeNoBlur(itemTimeForm){
const lastIndex = this.activeTab;
const timeNo = this.setTimeNodeList[this.activeTab].timeNo;
setTimeout(()=>{
// 这里设置定时器是因为,如果填完时间,直接点击随访方式radio,会立即出发排序和重复事件
this.checkIsRepeat(timeNo,lastIndex);
// // 新增成功之后
// this.setTimeNodeList = this.sortKey(this.setTimeNodeList,'timeNo');
},300)
},
// 是否禁用按钮
itemIsDisabled(item){
let flag;
if(this.isStandedTemplate){
flag = true;
}else{
if(item.change){
flag = false;
}else{
flag = true;
}
}
return flag;
},
// 是否可以删除时间节点
tabClosable(){
let flag;
if(this.isStandedTemplate){//固定模板,不可关闭
flag = false;
}else{
this.setTimeNodeList.forEach((item)=>{
if(item.change){
flag = true;
}else{
flag = false;
}
})
}
return flag;
},
// 是否显示选择添加漫画按钮
showChoseComtent(timeObj){
let flag;
if(this.isStandedTemplate){
flag = false
}else{
if(this.planId && !timeObj.change){
flag = false;
}else{
if(timeObj.comentMsg && timeObj.comentMsg.id){
flag = false;
}else{
flag = true;
}
}
}
return flag
},
// 是否显示删除重选漫画按钮
showRechoseDelete(timeObj){
let flag;
if(this.isStandedTemplate){
flag = false
}else{
if(this.planId && timeObj.change && timeObj.comentMsg.id){
flag = true
}else{
if(timeObj.comentMsg.id){
flag = true
}else{
flag = false
}
}
}
return flag
},
goSelectCartoon() {
const comentMsg = this.setTimeNodeList[this.activeTab].comentMsg;
const activeTabId = (comentMsg && comentMsg.id) ? comentMsg.id : '';
if(comentMsg && activeTabId){
this.activeComentId = String(activeTabId);
}else{
this.activeComentId = '';
}
this.isSelectCartoon = true;
},
//关闭漫画
closeSelectCartoon() {
this.isSelectCartoon = false;
},
// 确认选择漫画
confirmSelectComent(val){
this.isSelectCartoon = false;
// console.log('当前的漫画选择组件的信息',val)
// console.log('当前的tab是',this.activeTab)
// console.log('当前是否固定模板',this.isStandedTemplate)
// console.log('当前的时间list',this.setTimeNodeList)
this.setTimeNodeList[this.activeTab].hasSelected = true;
this.setTimeNodeList[this.activeTab].comentMsg = val;
const comdata = this.setTimeNodeList[this.activeTab];
const obj = {
startDays: comdata.pushDay,
resourceId: comdata.comentMsg.id,
sendContent: comdata.comentMsg.header_name
}
this.setTimeNodeList[this.activeTab].pushContentList[0] = obj
},
deleteClick(index) {
this.setTimeNodeList[index].hasSelected = false;
this.setTimeNodeList[index].comentMsg = {};
// this.setTimeNodeList[index].pushContentList.splice(0,1);
this.setTimeNodeList[index].pushContentList[0].resourceId = null
this.setTimeNodeList[index].pushContentList[0].sendContent = null
this.activeComentId = '';
this.$forceUpdate();
},
// 选择提醒医生预约天数
changeRemindDay(val){
this.setTimeNodeList[this.activeTab].remindList = []
val.forEach((item)=>{
this.setTimeNodeList[this.activeTab].remindList.push({
startDays: item
})
})
this.$forceUpdate();
},
// 选择推送患教提前天数
changePushDay(val){
const comentMsg = this.setTimeNodeList[this.activeTab].comentMsg;
const activeTabId = (comentMsg && comentMsg.id) ? comentMsg.id : '';
let obj
if(comentMsg && activeTabId){
obj = {
startDays: val,
resourceId: this.setTimeNodeList[this.activeTab].comentMsg.id,
sendContent: this.setTimeNodeList[this.activeTab].comentMsg.header_name
}
}else{
obj = {
startDays: val,
resourceId: null,
sendContent: ''
}
}
this.setTimeNodeList[this.activeTab].pushContentList[0] = obj
this.$forceUpdate();
},
// 选择随访量表
changeFollowId(val){
this.setTimeNodeList[this.activeTab].followupList = []
val.forEach((item)=>{
this.formOptions.forEach((item2)=>{
if(item2.scaleNo==item){
this.setTimeNodeList[this.activeTab].followupList.push({
resourceId: item,
sendContent: item2.name
})
}
})
})
this.$forceUpdate();
},
// 对时间节点进行排序
sortKey(array,key,timeNo) {
let newList = array.sort((a,b)=>{
const x = parseFloat(a[key]);
const y = parseFloat(b[key]);
return ((x<y) ? -1 : (x>y) ? 1 : 0)
})
array.forEach((item,index)=>{
if(timeNo == item.timeNo){
this.activeTab = index + '';
}
})
return newList
},
//新建计划,根据第一个时间节点选择单位
choseTimeUit(val){
//设置单位
this.markOptions.forEach((ob)=>{
if(val == ob.no){
this.timeUnitStr = ob.value
}
})
},
// 显示tab文字
showTabLabel(item){
let str;
if(item.timeNo>=0 && item.timeNo!==''){
str = '开始后' + String(item.timeNo) + this.timeUnitStr
}else{
str = '设置时间节点'
}
return str
},
},
}
</script>
<style scoped lang="scss">
.add-time-content{
padding-top: 20px;
.deletelist{
position: absolute;
right: -3px;
top: -3px;
}
.time-line-scroll{
width: 100%;
/*height: 60px;*/
box-sizing: border-box;
/*background-color: #F0F2F5;*/
padding: 10px;
overflow-x: scroll;
overflow-y: auto;
white-space: nowrap;
position: relative;
cursor: pointer;
&::-webkit-scrollbar{
height: 6px;
}
&::-webkit-scrollbar-thumb {/*滚动条里面小方块*/
border-radius: 10px;
-webkit-box-shadow: inset 0 0 5px rgba(0,0,0,0.2);
background: rgba(0,0,0,0.1);
}
span{
display: inline-block;
background-color: #449284;
border-radius: 20px;
height: 28px;
line-height: 28px;
padding: 0 8px;
color: #ffffff;
font-size: 12px;
width: 95px;
}
.blur-btn{
background-color: #fff!important;
color: #606266;
border: 1px solid #DCDFE6!important;
}
}
.form-div{
padding-top: 30px;
.tips-contnt{
margin-top: -10px;
padding-left: 140px;
padding-bottom: 30px;
font-size: 12px;
color: #9B9997;
width: 55%;
p{
line-height: 18px;
&.yellow-font{
color: #e6a23c;
padding-bottom: 10px;
}
}
}
}
}
.ml20{
margin-left: 20px;
}
</style>
<style>
.special-control-class .el-tabs__content{
overflow: visible !important;
}
</style>
<template>
<router-view></router-view>
</template>
<script>
export default {
name: "layout"
}
</script>
<style scoped>
</style>
<template>
<div class="resident-list">
<bread-crumb
:curmbFirst="curmbFirst"
:curmbSecond="curmbSecond"
:curmbThird="curmbThird"
:jumPathThird="jumPathThird">
</bread-crumb>
<div class="new-plan-content f-main-content screenSet">
<div class="header">
<div class="title">
<span :class="{ 'active-class' : activeTab === 'second' }">①基本信息</span>
<i class="el-icon-arrow-right" style="color: #C0C4CC"></i>
<span :class="{ 'active-class' : activeTab === 'first' }">②随访时间节点</span>
</div>
<div class="plan-btns-group" v-if="activeTab === 'first'">
<el-button class="button-white" size="small" plain @click="cancelEdit" >取 消</el-button>
<el-button type="primary" size="small" @click="nextClick('baseInfo')">下一步</el-button>
</div>
<div class="plan-btns-group" v-if="activeTab === 'second'">
<el-button class="button-white" size="small" plain @click="preClick">上一步</el-button>
<el-button type="primary" size="small" @click="saveEdit">保 存</el-button>
</div>
</div>
<div class="edit-plan-content" v-if="activeTab === 'first'">
<el-form ref="baseInfo" :model="baseInfo" :rules="rules" label-suffix=":" label-width="140px" :inline-message="true" size="small">
<el-form-item label="随访计划名称" prop="name">
<el-input v-model="baseInfo.name" maxlength="20" style="width: 30%" clearable></el-input>
</el-form-item>
<el-form-item label="随访居民" required prop="hasSelectedNum">
<div style="display: flex">
<div>
<el-button plain icon="el-icon-plus" :style="noChoice?'border:1px solid red;':''" @click="selectPatientHandler">{{baseInfo.hasSelectedNum ? '继续添加' : '选择居民'}}</el-button><br>
<el-button type="text" class="mt10" @click="seeSelectedHandler" v-if="baseInfo.hasSelectedNum">已选{{baseInfo.hasSelectedNum}}<i class="el-icon-arrow-right"></i></el-button>
</div>
<p class="err-tips" v-if="noChoice">请添加随访居民</p>
</div>
</el-form-item>
<el-form-item label="随访模板" prop="resourceId">
<el-select
v-model="baseInfo.resourceId"
placeholder="请选择随访模板"
clearable>
<el-option
v-for="item in templateOptions"
:key="item.id"
:label="item.name"
:value="item.id">
</el-option>
</el-select>
</el-form-item>
<p class="tips">随访计划创建成功后,模板不可更换,请谨慎选择。</p>
<el-form-item label="随访开始时间" prop="time">
<el-date-picker
v-model="baseInfo.time"
type="date"
ref="beginDate"
placeholder="请选择随访开始时间"
:picker-options="pickerOptions"
value-format="timestamp"
clearable
@blur="handleDateInputConfirm"
style="width:380px;">
</el-date-picker>
</el-form-item>
<el-form-item label="备注">
<el-select
v-model="baseInfo.remarksStatus"
placeholder="请选择随访种类"
clearable>
<el-option
v-for="item in remarkOption"
:key="item.no"
:label="item.value"
:value="item.no">
</el-option>
</el-select>
</el-form-item>
</el-form>
</div>
<div class="edit-plan-content" v-show="activeTab === 'second'">
<set-time-node
:resourceId="resourceId"
:standedTimeNodeList="standedTimeNodeList"
:isStandedTemplate="isStandedTemplate"
:patientIdList="baseInfo.patientIdList"
:checkForm="checkForm"
@addListenSave="addListenSave"
/>
</div>
</div>
<select-patient
:isShowSelectPatient="isShowSelectPatient"
:patientIdList="baseInfo.patientIdList"
@closeSelectPatient="closeSelectPatient"
@sureSelectPatient="sureSelectPatient(arguments)"
/>
<has-selected-patient
v-if="isShowSelectedDialog"
:hasSelectedList="hasSelectedList"
@closeSelectedDialog="closeSelectedDialog"
@continueAdd="continueAdd"
/>
</div>
</template>
<script>
import BreadCrumb from '@/components/breadcrumb'
import SelectPatient from '@/views/followup/plan-manage/dialog/select-patient';
import HasSelectedPatient from '@/views/followup/plan-manage/dialog/has-selected-patient';
import SetTimeNode from '@/views/followup/plan-manage/dialog/set-time-node';
import { createFollowPlan, getFollowupTableTemplate } from '@/utils/followup/followapis'
import { mapState, mapActions } from 'vuex'
export default {
name: "addNewPlan",
components: {
BreadCrumb,
SelectPatient,
HasSelectedPatient,
SetTimeNode,
},
data() {
return {
setTimeNodeList: [],//重写后的setTimeNodeList
isStandedTemplate: false, // 是否是固定的随访模板
standedTimeNodeList: [], // 如果是国定随访模板,获取固定数据后不可更改,只读
checkForm: false,
/*面包屑配置*/
curmbFirst: '随访管理',
curmbSecond: '计划管理',
curmbThird: '新建随访计划',
jumPathThird: '/followUp/plan-manage',
activeTab: 'first',
resourceId: '',//当前选择的随访模板id
noName: false,
noResourceId: false,
noTime: false,
noChoice: false,
baseInfo: {
name: '',//随访计划名称
patientIdList: [],//随访居民列表
resourceId:'',//随访模板ID
time:'',//随访开始时间
remarksStatus: '',
fPlanTimeReqList: [],//时间节点列表
hasSelectedNum: 0,
},
isShowSelectPatient: false,
isShowSelectedDialog: false,
hasSelectedList: [],
rules: {
name: [{ required: true, message: '请输入随访计划名称', trigger: 'blur' }],
hasSelectedNum: [{ required: true, message: '请添加随访居民', trigger: 'change' }],
resourceId: [{ required: true, message: '请选择随访模板', trigger: 'change' }],
time: [{ required: true, message: '请选择随访开始时间', trigger: 'change' }],
},
pickerOptions: {
disabledDate(time) {
return time.getTime() < Date.now() - 8.64e7
}
}
}
},
created() {
// 获取备注
this.getRemarkOption()
// 获取随访计划模板列表
this.getFollowupTemplate()
},
computed: {
...mapState('planManage',{
remarkOption: state => state.remarkOption,
templateOptions: state => state.templateOptions,
})
},
methods: {
...mapActions('planManage', ['getTimeNodeList','getRemarkOption','getFollowupTemplate']),
// 点击保存
saveEdit() {
// 点击保存,先进行校验,表单字段是否通过验证
this.checkForm = true
},
handleDateInputConfirm(e){
if(!this.baseInfo.time){
this.$refs.beginDate.picker.date = new Date();
}
},
// 监听保存校验结果
addListenSave(val){
// console.log('监听保存校验结果',val)
this.checkForm = false
if(val.status){
this.baseInfo.fPlanTimeReqList = val.setTimeNodeList
// this.baseInfo.time = (new Date(this.baseInfo.time).getTime())
// console.log(this.baseInfo.time)
// 提交
createFollowPlan(this.baseInfo).then(res=>{
if(res.code=='000000'){
// 各种校验通过后,提交编辑内容,toast提示
this.$message({
message: '创建成功',
type: 'success'
});
setTimeout(()=>{
this.$router.push({
path: '/followup/plan-manage/plan-list'
})
},2000)
}else{
this.$message({
message: '创建失败,' + res.message,
type: 'error'
});
}
})
}else{
this.$message({
message: val.message,
type: 'error'
});
}
},
selectPatientHandler() {
this.isShowSelectPatient = true;
},
closeSelectPatient(val) {
this.isShowSelectPatient = val;
},
seeSelectedHandler() {
this.isShowSelectedDialog = true;
},
closeSelectedDialog(val) {
this.isShowSelectedDialog = val;
},
sureSelectPatient() {
let getArguments = arguments[0];
this.isShowSelectPatient = getArguments[0];
const selectPatients = getArguments[1]; // 每次选中获取的人
this.hasSelectedList = selectPatients;
// console.log('呵呵呵呵',arguments)
this.baseInfo.patientIdList = [];
selectPatients.forEach((item)=>{
this.baseInfo.patientIdList.push(item.patientId);
})
this.baseInfo.hasSelectedNum = this.hasSelectedList.length;
if(this.baseInfo.hasSelectedNum > 0){
this.noChoice = false;
}
},
continueAdd(val) {
this.isShowSelectedDialog = val;
this.isShowSelectPatient = true;
},
cancelEdit() {
this.$confirm('是否放弃本次创建,放弃后数据不能被保存', '', {
confirmButtonText: '继续创建',
cancelButtonText: '确定放弃',
type: 'warning'
}).then(() => {
// 关闭弹层,继续创建
}).catch(() => {
// 确定放弃,跳出当前编辑页面
this.$router.push({path: '/followup/plan-manage/plan-list'})
});
},
nextClick(formName) {
//为方便调试,不做校验
// this.activeTab = 'second';
this.$refs[formName].validate((valid) => {
//用作校验
if(!this.baseInfo.hasSelectedNum) {
this.noChoice = true
return;
}else {
this.noChoice = false
}
if (valid) {
// console.log('当前选择的随访模板id为',this.baseInfo.resourceId)
this.resourceId = String(this.baseInfo.resourceId)
// console.log( this.baseInfo.resourceId)
if(this.baseInfo.resourceId){
getFollowupTableTemplate(this.baseInfo.resourceId).then(res=>{
this.isStandedTemplate = true
this.standedTimeNodeList = res.data
this.activeTab = 'second';
})
}else{
this.isStandedTemplate = false
this.standedTimeNodeList = [];
this.activeTab = 'second';
}
} else {
return false;
}
});
},
preClick() {
this.activeTab = 'first';
},
},
}
</script>
<style lang="scss" scoped>
@import '../../../style/followup/followup-common';
@import '../../../style/followup/element-reset.css';
.new-plan-content{
.header{
display: flex;
align-items: center;
justify-content: space-between;
padding-bottom: 20px;
border-bottom: $borderBottomStyle;
.title{
.active-class{
color: #9B9997;
}
}
}
.edit-plan-content{
padding: 30px 0;
.add-time-content{
padding-top: 20px;
.time-line-scroll{
width: 100%;
height: 50px;
box-sizing: border-box;
background-color: #F0F2F5;
padding: 8px 10px;
/*display: flex;*/
/*align-items: center;*/
overflow-x: scroll;
overflow-y: hidden;
white-space: nowrap;
position: relative;
cursor: pointer;
&::-webkit-scrollbar{
height: 6px;
}
&::-webkit-scrollbar-thumb {/*滚动条里面小方块*/
border-radius: 10px;
-webkit-box-shadow: inset 0 0 5px rgba(0,0,0,0.2);
background: rgba(0,0,0,0.1);
}
span{
display: inline-block;
background-color: #449284;
border-radius: 20px;
height: 28px;
line-height: 28px;
padding: 0 8px;
color: #ffffff;
font-size: 12px;
width: 95px;
}
}
.form-div{
padding-top: 30px;
}
}
}
.err-tips{
color: #F56C6C;
font-size: 12px;
margin-left: 10px;
}
.tips{
font-size: 12px;
color: #9B9997;
padding-left: 140px;
margin-top: -10px;
padding-bottom: 15px;
}
.el-message-box__content{
padding: 20px 15px;
}
}
.mt10{
margin-top: 10px;
}
.ml20{
margin-left: 20px;
}
</style>
<template>
<div class="plan-detail">
<bread-crumb
:curmbFirst="curmbFirst"
:curmbSecond="curmbSecond"
:curmbThird="curmbThird"
:jumPathThird="jumPathThird">
</bread-crumb>
<div class="f-detail-content screenSet">
<div class="header">
<div class="title"><p>基本信息</p></div>
<div class="h-btn">
<el-button class="button-white" plain @click="changePlan" size="small">修改</el-button>
</div>
</div>
<div class="base-info" >
<div class="resident-info base-content">
<div class="content-div">
<div class="c-title">随访计划名称:</div>
<div class="c-content">{{planDetail.name}}</div>
</div>
</div>
<div class="group-info base-content">
<div class="content-div">
<div class="c-title">随访居民:</div>
<div class="c-content has-operation">{{planDetail.num}}<el-button type="text" @click="goToResidentList">查看居民></el-button></div>
</div>
</div>
<div class="followup-info base-content">
<div class="content-div">
<div class="c-title">随访模板:</div>
<div class="c-content">{{planDetail.resourceName}}</div>
</div>
</div>
<div class="followup-info base-content">
<div class="content-div">
<div class="c-title">随访开始时间:</div>
<div class="c-content has-operation">{{planDetail.timeStr}} <el-button class="btn-text" type="text" @click="goToFollowTime">查看全部></el-button></div>
</div>
</div>
<div class="followup-info base-content">
<div class="content-div">
<div class="c-title">备注:</div>
<div class="c-content">{{planDetail.remarksStatusStr}}</div>
</div>
</div>
</div>
<div class="time-nodes" >
<p class="title">随访时间节点</p>
<div class="node-div">
<el-radio-group v-model="timeNodes" size="small">
<el-radio-button :key="item.id" v-for="item in planDetail.fPlanTimeReqList" :label="item.id">{{item.timeStr}}</el-radio-button>
</el-radio-group>
</div>
<div class="followup-contents" v-if="nodeContent.length">
<div class="content-div">
<div class="c-title">随访方式:</div>
<div class="c-content">{{nodeContent[0].typeStr}}</div>
</div>
<div class="content-div">
<div class="c-title">提醒医生预约居民:</div>
<div class="c-content more-content">
<p v-for="item in nodeContent[0].remindList">{{item.startDaysStr}}</p>
</div>
</div>
<div class="content-div">
<div class="c-title">推送患教:</div>
<div class="c-content more-content" v-for="item in nodeContent[0].pushContentList">
<p>{{item.startDaysStr}} <span class="click-text" @click="goToShort(item.resourceUrl)">{{item.sendContent}}</span></p>
<p class="reminding">推送规则:优先微信推送,如果居民没关注云鹊医公众号,将短信推送,短信推送会消耗您的额度。推送详情请前往云鹊医app患教中心查询</p>
</div>
</div>
<div class="content-div">
<div class="c-title">随访登记表:</div>
<div class="c-content more-content">
<p class="click-text" v-for="item in nodeContent[0].followupList" @click="goToScale(item)">{{item.sendContent}}</p>
</div>
</div>
</div>
</div>
</div>
<follow-time :showThisPage="showFollowTime" :nodeTimeList="nodeTimeList" @closeFollowTime="closeFollowTime"></follow-time>
</div>
</template>
<script>
import BreadCrumb from '@/components/breadcrumb';
//变更计划dialog
import FollowTime from '@/views/followup/plan-manage/dialog/follow-time';
import { mapState, mapActions } from 'vuex'
export default {
name: "plan-detail",
components: {
BreadCrumb,
FollowTime
},
data() {
return {
/*面包屑配置*/
curmbFirst: '随访管理',
curmbSecond: '计划管理',
curmbThird: '计划详情',
jumPathThird: '/followUp/plan-manage',
/*面包屑配置*/
timeNodes: null,//时间节点
showFollowTime: false, //是否展示全部时间
thisNodeContents: {},
nodeContent: [], //节点详情
}
},
created() {
},
mounted() {
this.getPlanDetail(this.$route.query.planId); //获取计划详情
this.getNodeTimeList(this.$route.query.planId); // 获取随访时间列表
},
computed: {
...mapState('planManage', {
residentDetail: state => state.residentDetail,
planDetail: state => state.planDetail,
nodeTimeList: state => state.nodeTimeList,
})
},
methods: {
...mapActions('planManage', ['getResidentDetail',
'getPlanDetail',
'getNodeTimeList',
'getNodeTimeContent',
'setResidentCrumb',
'setPlanModifyCrumb'
]),
goToFollowTime() {
this.showFollowTime = true
},
goToResidentList() {
let residentCrumb = [
{
name: '随访管理',
href: null
},
{
name: '计划管理',
href: `#/followup/plan-manage/plan-list`
},
{
name: '计划详情',
href: `#/followup/plan-manage/plan-detail?planId=${this.$route.query.planId}`
},
{
name: '查看居民',
href: null
}
]
this.setResidentCrumb(residentCrumb);
this.$router.push({path: '/followup/plan-manage/resident-list', query: {planId: this.$route.query.planId, planName: this.planDetail.name}})
},
changePlan() {
let planModifyCrumb = [
{
name: '随访管理',
href: null
},
{
name: '计划管理',
href: `#/followup/plan-manage/plan-list`
},
{
name: '计划详情',
href: `#/followup/plan-manage/plan-detail?planId=${this.$route.query.planId}`
},
{
name: '修改计划',
href: null
}
]
this.setPlanModifyCrumb(planModifyCrumb)
this.$router.push({path: '/followup/plan-manage/plan-modify', query: {planId: this.$route.query.planId}})
},
closeFollowTime(isShow) {
this.showFollowTime = isShow
},
goToShort(url) {
window.open(url)
},
goToScale(val) {
this.$router.push({path: '/followup/record-manage/form-template',
query: {doctorId: val.doctorId, scaleNo: val.resourceId, planPatientsTimesId: val.planPatientsTimesId,planTimesId : val.planTimesId, showBtn: 0}});
}
},
watch: {
planDetail(val) {
if(val.fPlanTimeReqList.length){
this.timeNodes = val.fPlanTimeReqList[0].id
}
},
timeNodes(val) {
this.nodeContent = this.planDetail.fPlanTimeReqList.filter(function(item){
return item.id == val;
});
}
}
}
</script>
<style lang="scss" scoped>
@import '../../../style/followup/followup-common';
@import '../../../style/followup/element-reset.css';
.plan-detail {
.f-detail-content {
.header {
.title {
display: flex;
flex-direction: column;
justify-content: flex-end;
}
}
.base-info {
padding: 10px;
border-bottom: 1px dashed #efefef;
.base-content {
display: flex;
flex-direction: row;
flex-wrap: wrap;
justify-content: space-between;
padding: 10px 0;
.content-div {
.c-title {
width: 115px;
}
}
.has-operation {
button {
height: 19.2px;
padding: 0 0 0 15px;
}
}
}
}
.time-nodes {
padding: 20px 10px;
.title {
color: #666666;
padding-bottom: 20px;
}
.followup-contents {
padding: 25px;
}
.node-div {
width: 100%;
overflow-x: scroll;
overflow-y: hidden;
white-space: nowrap;
&::-webkit-scrollbar{
height: 6px;
}
&::-webkit-scrollbar-thumb {/*滚动条里面小方块*/
border-radius: 10px;
-webkit-box-shadow: inset 0 0 5px rgba(0,0,0,0.2);
background: rgba(0,0,0,0.1);
}
}
}
}
}
</style>
<template>
<div class="plan-list-wrapper">
<bread-crumb :curmbFirst="curmbFirst" :curmbSecond="curmbSecond"></bread-crumb>
<div class="plan-list-content f-main-content screenSet">
<div class="page-title">计划管理</div>
<div class="search-div">
<div class="search-input">
<el-form ref="serchForm" :model="searchData" :inline="true" label-suffix=":" label-width="125px" size="small">
<el-form-item label="随访计划名称">
<el-input v-model="searchData.name" placeholder="请输入关键词" maxlength="20" style="width: 250px" clearable></el-input>
</el-form-item>
<el-form-item label="开始年份">
<el-select v-model="searchData.startYear" placeholder="请选择时间范围" style="width: 250px" :popper-append-to-body="false">
<el-option label="全部" value=""></el-option>
<el-option
v-for="(item,index) in timeRangeList"
:key="item.value"
:label="item.label"
:value="item.label">
</el-option>
</el-select>
</el-form-item>
</el-form>
</div>
<div class="search-btn">
<el-button class="button-green" size="small" type="primary" @click="search(1)">查询</el-button>
<el-button class="button-white" size="small" plain @click="reseat">重置</el-button>
</div>
</div>
<div class="table-content">
<div class="content-group-btn"><el-button type="primary" size="small" @click="addNewPlan">新建随访计划</el-button></div>
<div>
<el-table :data="planList.fPlanDtoList" style="width: 100%;margin-top: 20px;">
<el-table-column
prop="name"
label="随访计划名称"
min-width="180"
align="left"
:show-overflow-tooltip="true">
<template slot-scope="scope">
<el-button class="btn-right-class" type="text" @click="visitDetail(scope.row)">{{scope.row.name}}</el-button>
</template>
</el-table-column>
<el-table-column
prop="startYear"
label="开始年份"
width="150"
align="center">
</el-table-column>
<el-table-column
prop="num"
label="总人数"
width="150"
align="center">
</el-table-column>
<el-table-column
label="操作"
fixed="right"
align="center"
width="250">
<template slot-scope="scope">
<el-button class="btn-right-class" type="text" @click="visitRow(scope.row)">查看居民</el-button>|
<el-button class="btn-right-class" type="text" @click="changeRow(scope.row)"> 修改</el-button>|
<el-button type="text" @click="deleteRow(scope.row)">删除</el-button>
</template>
</el-table-column>
</el-table>
<el-row type="flex" justify="end" class="margin-top20">
<el-pagination
background
v-if="planList.fPlanDtoList"
@size-change="handleSizeChangePre"
@current-change="handleCurrentChangePre"
layout="total, sizes, prev, pager, next, jumper"
:current-page="paginationSet.pageNo"
:page-sizes="paginationSet.pageSizes"
:page-size="paginationSet.pageSize"
:total="paginationSet.total">
</el-pagination>
</el-row>
</div>
</div>
</div>
</div>
</template>
<script>
import BreadCrumb from "@/components/breadcrumb";
import { mapState, mapActions} from 'vuex'
import {deletePlan, getVerifyStatus} from '@/utils/followup/followapis'
import { getSaasDomain } from '@/utils/index'
export default {
components:{
BreadCrumb,
},
data(){
return{
curmbFirst: '随访管理',
curmbSecond: '计划管理',
searchData: {
name: '',
startYear: '',
},
timeRangeList:[
{
label: '2018年',
value: 0
}, {
label: '2019年',
value: 1
},{
label: '2020年',
value: 2
}, {
label: '2021年',
value: 3
},{
label: '2022年',
value: 4
},{
label: '2023年',
value: 5
},{
label: '2024年',
value: 6
},{
label: '2025年',
value: 7
},{
label: '2026年',
value: 8
},{
label: '2027年',
value: 9
},{
label: '2028年',
value: 10
},{
label: '2029年',
value: 11
},{
label: '2030年',
value: 12
}
],
paginationSet: {
pageNo: 1,
pageSize: 10,
total: 0,
pageSizes: [10,20,50,100]
},
}
},
computed: {
...mapState('planManage', {
planList: state => state.planList,
})
},
created() {
this.init();
},
watch: {},
methods: {
...mapActions('planManage', ['getPlanList', 'setResidentCrumb', 'setPlanModifyCrumb']),
init() {
getVerifyStatus().then((res) => {
if(res.code === '000000') {
this.search(1);
}else if(res.code === '200008'){
this.$confirm(`${res.message}`, '提示', {
confirmButtonText: '去认证',
cancelButtonText: '取消',
type: 'warning'
}).then(() => {
//confirmButton操作
window.location.href = getSaasDomain(`/saas/pica_personal_edit.html?ZmxhZz0x`);
}).catch(() => {
//cancelButton操作
this.$router.push({path: '/'})
});
}else {
this.$message.error(res.message);
this.$router.push({path: '/'})
}
})
},
async search(currentPage){
await this.getPlanList({
...this.searchData,
pageNo: currentPage || this.paginationSet.pageNo,
pageSize: this.paginationSet.pageSize,
});
const {pageNo, pageSize, totalRow} = this.planList;
this.paginationSet.total = totalRow;
this.paginationSet = {
...this.paginationSet,
pageNo: pageNo,
pageSize: pageSize,
}
},
reseat(){
this.searchData.name = '';
this.searchData.startYear = '';
this.search(1);
},
addNewPlan(){
this.$router.push({path: '/followup/plan-manage/new-plan'})
},
visitDetail(row){
this.$router.push({path: '/followup/plan-manage/plan-detail', query: {planId:row.id}})
},
visitRow(row){
let residentCrumb = [
{
name: '随访管理',
href: null
},
{
name: '计划管理',
href: `#/followup/plan-manage/plan-list`
},
{
name: '查看居民',
href: null
}
]
this.setResidentCrumb(residentCrumb);
this.$router.push({path: '/followup/plan-manage/resident-list', query: {planId:row.id, planName: row.name}})
},
changeRow(row){
let planModifyCrumb = [
{
name: '随访管理',
href: null
},
{
name: '计划管理',
href: `#/followup/plan-manage/plan-list`
},
{
name: '修改计划',
href: null
}
]
this.setPlanModifyCrumb(planModifyCrumb)
this.$router.push({path: '/followup/plan-manage/plan-modify', query: {planId:row.id}})
},
deleteRow(row){
this.$confirm(`是否确定删除${row.name}, 删除后计划将无法恢复!`, '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
}).then(() => {
deletePlan(row.id).then(({data}) => {
this.search(1);
})
this.$message({
type: 'success',
message: '删除成功!'
});
}).catch(() => {
// this.$message({
// type: 'info',
// message: '已取消删除'
// });
});
},
handleSizeChangePre(pageSize){
this.paginationSet['pageSize'] = pageSize;
this.paginationSet['pageNo'] = 1;
this.search()
},
handleCurrentChangePre(pageNo){
this.paginationSet['pageNo'] = pageNo
this.search()
},
},
filters: {},
}
</script>
<style scoped lang="scss">
@import '../../../style/followup/followup-common';
@import '../../../style/followup/element-reset.css';
.plan-list-wrapper{
.plan-list-content{
.search-input{
max-width: none;
flex: 1;
}
.margin-top20{
margin-top: 20px;
}
.status-span{
color: $picaGreen;
}
}
.content-group-btn{
text-align: right;
}
}
</style>
<template>
<div class="plan-modify">
<div class="bread-crumb">
<el-breadcrumb separator="/" >
<el-breadcrumb-item v-for="item in planModifyCrumb">
<a v-if="item.href" :href="item.href">{{item.name}}</a>
<span v-else >{{item.name}}</span>
</el-breadcrumb-item>
</el-breadcrumb>
</div>
<div class="new-plan-content f-main-content screenSet" id="screenSet">
<div class="header">
<div class="title">
<span>修改计划</span>
</div>
<div class="plan-btns-group">
<el-button class="button-white" plain @click="cancelEdit" size="small">取 消</el-button>
<el-button class="button-green" type="primary" @click="saveModify('baseInfo')" size="small">保 存</el-button>
</div>
</div>
<el-form ref="baseInfo" :model="planDetailData" :rules="rules" label-suffix=":" label-width="140px">
<el-form-item label="随访计划名称" prop="name">
<el-input v-model="planDetailData.name" maxlength="20" style="width: 30%" size="small" clearable></el-input>
</el-form-item>
<el-form-item label="随访居民" required>
<div class="select-patients">
<el-button plain icon="el-icon-plus" size="small" @click="selectPatientHandler">{{planDetailData.patientIdList ? '继续添加' : '选择居民'}}</el-button><br>
<el-button type="text" class="mt10" size="small" @click="seeSelectedHandler" v-if="planDetailData.patientIdList">已选{{hasSelectedList.length}}<i class="el-icon-arrow-right"></i></el-button>
</div>
</el-form-item>
<el-form-item label="随访模板" prop="resourceName">
{{planDetailData.resourceName}}
</el-form-item>
<el-form-item label="随访开始时间" prop="timeStr">
{{planDetailData.timeStr}} <el-button class="btn-text" type="text" @click="goToFollowTime" size="small">查看全部></el-button>
</el-form-item>
<el-form-item label="备注">
<el-select
v-model="planDetailData.remarksStatus"
placeholder="请选择随访种类"
size="small"
:popper-append-to-body="false"
clearable>
<el-option
v-for="item in remarkOption"
:key="item.no"
:label="item.value"
:value="item.no">
</el-option>
</el-select>
</el-form-item>
</el-form>
<div class="edit-plan-content">
<set-time-node
:isStandedTemplate="isStandedTemplate"
:standedTimeNodeList="setTimeNodeList"
:patientIdList="planDetailData.patientIdList"
:checkForm="checkForm"
:planId="planId"
@addListenSave="addListenSave"
/>
</div>
</div>
<select-patient
:isShowSelectPatient="isShowSelectPatient"
:patientIdList="planDetailData.patientIdList"
:oldPatientIdList="selectResidentIdList"
@closeSelectPatient="closeSelectPatient"
@sureSelectPatient="sureSelectPatient(arguments)">
</select-patient>
<has-selected-patient
v-if="isShowSelectedDialog"
:hasSelectedList="hasSelectedList"
@closeSelectedDialog="closeSelectedDialog"
@continueAdd="continueAdd" />
<follow-time :showThisPage="showFollowTime" :nodeTimeList="nodeTimeList" @closeFollowTime="closeFollowTime"></follow-time>
<add-patient-time
:showThisPage="showAddPatientTime"
:addPatientData="addPatientData"
@sendJoinTime="sendJoinTime"
@closeAddPatientTime="closeAddPatientTime"></add-patient-time>
</div>
</template>
<script>
import SelectPatient from '@/views/followup/plan-manage/dialog/select-patient';
import HasSelectedPatient from '@/views/followup/plan-manage/dialog/has-selected-patient';
import SetTimeNode from '@/views/followup/plan-manage/dialog/set-time-node';
import FollowTime from '@/views/followup/plan-manage/dialog/follow-time';
import {createFollowPlan} from '@/utils/followup/followapis'
//添加居民选择随访时间
import addPatientTime from '@/views/followup/plan-manage/dialog/add-patient-time';
import { mapState, mapActions } from 'vuex'
import * as commonUtil from '../../../utils/utils'
export default {
name: "plan-modify",
components: {
SelectPatient,
HasSelectedPatient,
SetTimeNode,
FollowTime,
addPatientTime
},
data() {
return {
setTimeNodeList: [],
planDetailData: {},
planId: '',
isStandedTemplate: false, // 是否是固定的随访模板
standedTimeNodeList: [], // 如果是国定随访模板,获取固定数据后不可更改,只读
checkForm: false,
patientIdList: [], //获取的病人列表
hasSelectedList: [], //已选居民
planModifyCrumb: [], //面包屑
rules: {
name: [{ required: true, message: '请输入随访计划名称', trigger: 'blur' }],
followupTemplate: [{ required: true, message: '请选择随访模板', trigger: 'change' }],
startTime: [{ required: true, message: '请选择随访开始时间', trigger: 'change' }],
},
templateOptions: [
{
value: '0',
label: '随访模板一'
}, {
value: '1',
label: '随访模板二'
}, {
value: '2',
label: '随访模板三'
}
],
isShowSelectPatient: false, //显示居民选择框
isShowSelectedDialog: false, //显示已选居民
nodeListModify: [], //修改node列表
showFollowTime: false, //是否展示全部时间
showAddPatientTime: false,//是否展示添加居民选择时间
addPatientData: {}, //选择时间数据
oldSelect:[],
selectResidentIdList: [], //oldID
newHasSelectedList: [],
initResidentList: [], //重置需要的居民列表
initResidentIdList: [], //重置需要的id
}
},
created() {
this.planId = String(this.$route.query.planId)
this.getPlanDetail(this.$route.query.planId); //获取计划详情
this.getRemarkOption()
this.getNodeTimeList(this.$route.query.planId); // 获取随访时间列表
let planModifyCrumbList = sessionStorage.getItem('planModifyCrumb');
this.planModifyCrumb = JSON.parse(planModifyCrumbList);
},
// 挂载到Dom完成时
mounted: function() {
commonUtil.resizeHeight()
},
computed: {
...mapState('planManage', {
planDetail: state => state.planDetail,
nodeTimeList: state => state.nodeTimeList,
residentList: state => state.residentList,
remarkOption: state => state.remarkOption,
selectResidentList: state => state.selectResidentList
})
},
methods: {
...mapActions('planManage', [
'getPlanDetail',
'getNodeTimeList',
'getResidentList',
'getRemarkOption',
'getTimeNodeList',
'setFollowPlan',
'getSelectResident'
]),
selectPatientHandler() {
this.isShowSelectPatient = true;
},
closeSelectPatient(val) {
this.isShowSelectPatient = val;
},
seeSelectedHandler() {
this.isShowSelectedDialog = true;
},
closeSelectedDialog(val) {
this.isShowSelectedDialog = val;
},
sureSelectPatient() {
let getArguments = arguments[0];
this.isShowSelectPatient = getArguments[0];
const newAddPatientList = getArguments[1]; // 新选中的人
let showNames = [];
const newIds = [];
newAddPatientList.forEach(item => {
showNames.push(item.nickname)
newIds.push(item.patientId)
})
this.newHasSelectedList = JSON.parse(JSON.stringify(this.initResidentList));
this.newHasSelectedList = this.newHasSelectedList.concat(newAddPatientList);
if(this.newHasSelectedList.length > this.hasSelectedList.length) {
this.showAddPatientTime = true;
if(showNames.length>5) {
const le = showNames.length
showNames = showNames.slice(0,5)
showNames = `${showNames.join('、')}${le}人`
} else {
showNames = showNames.join('、')
}
this.addPatientData = {
id: this.$route.query.planId,
addPatients: true,
patientNames: showNames,
}
} else {
this.hasSelectedList = JSON.parse(JSON.stringify(this.newHasSelectedList));
this.planDetailData.patientIdList = JSON.parse(JSON.stringify(this.initResidentIdList));
const _this = this;
newAddPatientList.forEach(item => {
_this.planDetailData.patientIdList.push(item.patientId)
})
}
},
continueAdd(val) {
this.isShowSelectedDialog = val;
this.isShowSelectPatient = true;
},
cancelEdit() {
this.$confirm('是否放弃本次修改?', '', {
confirmButtonText: '继续修改',
cancelButtonText: '确定放弃',
type: 'warning'
}).then(() => {
// 关闭弹层,继续创建
}).catch(() => {
// 确定放弃,跳出当前编辑页面
this.$router.back(-1)
});
},
saveModify(formName) {
this.$refs[formName].validate((valid) => {
if(valid){
// 点击保存,先进行校验,表单字段是否通过验证
this.checkForm = true
}else{
this.$message({
message: '请填写完整表单',
type: 'error'
});
}
});
},
// 监听保存校验结果
addListenSave(val){
// console.log('监听保存校验结果',val)
this.checkForm = false
if(val.status){
this.$confirm('是否确认保存修改内容?', '', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(() => {
// 点击保存,先进行校验,表单字段是否通过验证
// 关闭弹层,继续创建
this.planDetailData.fPlanTimeReqList = val.setTimeNodeList
// this.planDetailData.joinTime = new Date();
// this.planDetailData.joinTime = (new Date(this.planDetailData.joinTime)).getTime()
// console.log(this.planDetailData.joinTime)
// console.log('修改计划前的数据===>>>',this.planDetailData)
createFollowPlan(this.planDetailData).then(res=>{
if(res.code=='000000'){
// 各种校验通过后,提交编辑内容,toast提示
this.$message({
message: '修改成功',
type: 'success'
});
setTimeout(()=>{
this.$router.push({
path: '/followup/plan-manage/plan-list'
})
},2000)
}else{
this.$message({
message: '创建失败,' + res.message,
type: 'error'
});
}
})
})
}else{
this.$message({
message: val.message,
type: 'error'
});
}
},
goToFollowTime() {
this.showFollowTime = true
},
closeFollowTime(isShow) {
this.showFollowTime = isShow
},
closeAddPatientTime(isShow) {
this.showAddPatientTime = isShow
},
sendJoinTime(joinData) {
const _this = this;
if(joinData) {
_this.hasSelectedList = [];
_this.planDetailData.patientIdList = [];
_this.newHasSelectedList.forEach(item => {
_this.hasSelectedList.push(item)
_this.planDetailData.patientIdList.push(item.patientId)
})
this.planDetailData.joinTime = joinData;
} else {
}
},
},
watch: {
planDetail(val) {
this.planDetailData = val;
this.setTimeNodeList = val.fPlanTimeReqList
if(this.planDetailData.resourceId){
this.isStandedTemplate = true
}else{
this.isStandedTemplate = false
}
},
selectResidentList(val) {
const _this = this
_this.planDetailData.patientIdList = []
let people = {}
if(val) {
val.forEach(function (item, index) {
people = {
nickname: item.patientName,
age: item.age,
id: item.idNo,
mobilePhone: item.mobilePhone,
labelId: item.labelName,
patientId: item.patientId
};
_this.hasSelectedList.push(people);
_this.planDetailData.patientIdList.push(item.patientId)
_this.selectResidentIdList.push(item.patientId)
_this.initResidentList.push(people);
_this.initResidentIdList.push(item.patientId);
})
_this.newHasSelectedList = JSON.parse(JSON.stringify(_this.initResidentIdList));
}
}
}
}
</script>
<style lang="scss" scoped>
@import '../../../style/followup/followup-common';
@import '../../../style/followup/element-reset.css';
.bread-crumb {
position: fixed;
left: 255px;
top: 64px;
width: 100%;
background: #fff;
height: 61px;
padding: 20px 20px 30px;
z-index: 99;
border-top: 3px solid #F0F2F5;
.el-breadcrumb__inner {
font-size: 14px;
}
a:hover {
color: #449284;
}
}
.header{
display: flex;
align-items: center;
justify-content: space-between;
padding-bottom: 20px;
border-bottom: $borderBottomStyle;
margin-bottom: 30px;
}
.edit-plan-content{
padding: 30px 0;
.add-time-content{
padding-top: 20px;
.time-line-scroll{
width: 100%;
height: 50px;
box-sizing: border-box;
background-color: #F0F2F5;
padding: 8px 10px;
/*display: flex;*/
/*align-items: center;*/
overflow-x: scroll;
overflow-y: hidden;
white-space: nowrap;
position: relative;
cursor: pointer;
&::-webkit-scrollbar{
height: 6px;
}
&::-webkit-scrollbar-thumb {/*滚动条里面小方块*/
border-radius: 10px;
-webkit-box-shadow: inset 0 0 5px rgba(0,0,0,0.2);
background: rgba(0,0,0,0.1);
}
span{
display: inline-block;
background-color: #449284;
border-radius: 20px;
height: 28px;
line-height: 28px;
padding: 0 8px;
color: #ffffff;
font-size: 12px;
width: 95px;
}
}
.form-div{
padding-top: 30px;
}
}
}
</style>
<template>
<div class="resident-detail">
<div class="bread-crumb">
<el-breadcrumb separator="/">
<el-breadcrumb-item v-for="item in residentCrumb">
<a v-if="item.href" :href="item.href">{{item.name}}</a>
<span v-else >{{item.name}}</span>
</el-breadcrumb-item>
</el-breadcrumb>
</div>
<div class="f-detail-content screenSet">
<div class="header">
<div class="title"><p>基本信息</p></div>
<div class="h-btn">
<el-button class="button-white" plain size="small" @click="changePlan">计划变更</el-button>
<el-button v-if="status==3" class="button-white" plain size="small" @click="finishFollowup">恢复随访</el-button>
<el-button v-else class="button-white" plain size="small" @click="finishFollowup">结束随访</el-button>
</div>
</div>
<div class="base-info">
<div class="resident-info base-content">
<div class="content-div">
<div class="c-title">姓名:</div>
<div class="c-content">{{residentDetail.patientName}}</div>
</div>
<div class="content-div ">
<div class="c-title">性别:</div>
<div class="c-content">{{residentDetail.sexName}}</div>
</div>
<div class="content-div">
<div class="c-title">年龄:</div>
<div class="c-content">{{residentDetail.age}}</div>
</div>
<div class="content-div">
<div class="c-title">身份证号:</div>
<div class="c-content">{{residentDetail.idNo}}</div>
</div>
<div class="content-div">
<div class="c-title">联系方式:</div>
<div class="c-content">{{residentDetail.mobilePhone}}</div>
</div>
</div>
<div class="group-info base-content">
<div class="content-div">
<div class="c-title">分组:</div>
<div class="c-content">{{residentDetail.labelName}}</div>
</div>
</div>
<div class="followup-info base-content">
<div class="content-div">
<div class="c-title">随访模板:</div>
<div class="c-content">{{planDetails.resourceName}}</div>
</div>
<div class="content-div">
<div class="c-title">随访开始时间:</div>
<div class="c-content">{{planDetails.timeStr}}</div>
</div>
<div class="content-div">
<div class="c-title">备注:</div>
<div class="c-content">{{planDetails.remarksStatusStr}}</div>
</div>
<div class="content-div">
<div class="c-title">随访状态:</div>
<div class="c-content">{{planDetails.statusStr}}</div>
</div>
</div>
</div>
<div class="time-nodes">
<p class="title">随访时间节点</p>
<div class="node-div">
<el-radio-group v-model="timeNodes" size="small">
<el-radio-button :key="item.id" v-for="item in timeNodeList" :label="item.id">{{item.timeStr}}</el-radio-button>
</el-radio-group>
</div>
<div class="followup-contents">
<div class="content-div">
<div class="c-title">随访方式:</div>
<div class="c-content">{{nodeContent.typeStr}}</div>
</div>
<div class="content-div">
<div class="c-title">提醒医生预约居民:</div>
<div class="c-content more-content">
<p v-for="item in nodeContent.remindList">{{item.startDaysStr}}</p>
</div>
</div>
<div class="content-div">
<div class="c-title">推送患教:</div>
<div class="c-content more-content" v-for="item in nodeContent.pushContentList">
<p>{{item.startDaysStr}} <span class="click-text" @click="goToShort(item.resourceUrl)" >{{item.sendContent}}</span></p>
<p class="reminding">推送规则:优先微信推送,如果居民没关注云鹊医公众号,将短信推送,短信推送会消耗您的额度。推送详情请前往云鹊医app患教中心查询</p>
</div>
</div>
<div class="content-div">
<div class="c-title">随访登记表:</div>
<div class="c-content more-content">
<p class="click-text" v-for="item in nodeContent.followupList" @click="goToScale(item)" >{{item.sendContent}}</p>
</div>
</div>
</div>
</div>
</div>
<change-plan :showThisPage="showChangePlan" :planChangeData="planChangeData" @closeChangePlan="closeChangePlan"></change-plan>
<finish-followup :showThisPage="showFinishFollowup" :finishData="finishData" @closeFinishFollowup="closeFinishFollowup"></finish-followup>
</div>
</template>
<script>
//变更计划dialog
import ChangePlan from '@/views/followup/plan-manage/dialog/change-plan';
//结束随访dialog
import FinishFollowup from '@/views/followup/plan-manage/dialog/finish-followup';
import { mapState, mapActions } from 'vuex'
export default {
name: "resident-detail",
components: {
ChangePlan,
FinishFollowup,
},
data() {
return {
/*面包屑配置*/
curmbFirst: '随访管理',
curmbSecond: '计划管理',
curmbThird: '查看居民',
jumPathThird: '/followUp/plan-manage',
/*面包屑配置*/
timeNodes: 0,//时间节点
showChangePlan: false,//是否展示变更计划
showFinishFollowup: false, //是否展示结束随访,
planChangeData: {}, //变更信息
finishData: {}, //结束信息
planDetails: {}, //计划详情
status: null,
residentCrumb: [], //面包屑
nodePlanPatientsTimesId: []
}
},
created() {
let residentCrumbList = sessionStorage.getItem('residentCrumb');
this.residentCrumb = JSON.parse(residentCrumbList);
},
mounted() {
this.getResidentDetail({
patientId: this.$route.query.patientId,
planId: this.$route.query.planId,
fuPlanPatientId: this.$route.query.fuPlanPatientId
}); //获取居民详情
this.getGroupList(); //获取分组列表
},
computed: {
...mapState('planManage', {
residentDetail: state => state.residentDetail,
nodeContent: state => state.nodeContent,
timeNodeList: state => state.timeNodeList,
nodeContent: state => state.nodeContent,
groupList: state => state.groupList
})
},
methods: {
...mapActions('planManage', ['getResidentDetail', 'getNodeTimeContent', 'getGroupList']),
changePlan() {
this.planChangeData = {
planPatientsId: this.residentDetail.fPlanDto.planPatientsId,
// planId: this.residentDetail.fPlanDto.id,
patientId: this.residentDetail.patientId,
yLabelList: this.residentDetail.labelIdList||[],
// startDate: this.residentDetail.fPlanDto.timeStr,
planIdOld: this.residentDetail.fPlanDto.id,
patientName: this.residentDetail.patientName,
}
this.showChangePlan = true;
},
closeChangePlan(isShow) {
this.showChangePlan = isShow
},
finishFollowup() {
let patientIdList = [];
let planPatientsIdList = [];
patientIdList.push(this.residentDetail.patientId)
planPatientsIdList.push(this.residentDetail.fPlanDto.planPatientsId)
this.finishData = {
changeCode: this.status,
planId: this.residentDetail.fPlanDto.id,
patientName: this.residentDetail.patientName,
patientIdList: patientIdList,
title: this.status==3?'恢复随访':'结束随访',
reasonName: this.status==3?'恢复原因:':'结束原因:',
planPatientsIdList: planPatientsIdList
}
this.showFinishFollowup = true;
},
closeFinishFollowup(isShow) {
this.showFinishFollowup = isShow
},
goToShort(url) {
window.open(url)
},
goToScale(val) {
this.$router.push({path: '/followup/record-manage/form-template',
query: {doctorId: this.residentDetail.doctorId, scaleNo: val.resourceId, planPatientsTimesId: this.nodePlanPatientsTimesId[0].planPatientsTimesId,planTimesId : val.planTimesId, showBtn: 1}});
}
},
watch: {
timeNodeList(val) {
// console.log('val1',val)
if(val&&val.length) {
this.timeNodes = val[0].id
}
},
timeNodes(val) {
this.getNodeTimeContent(val);
this.nodePlanPatientsTimesId = this.timeNodeList.filter(function(item){
return item.id == val;
});
// console.log(this.nodePlanPatientsTimesId)
},
residentDetail(val) {
this.planDetails = val.fPlanDto
this.status = val.fPlanDto.status
}
}
}
</script>
<style lang="scss" scoped>
@import '../../../style/followup/followup-common';
@import '../../../style/followup/element-reset.css';
.resident-detail {
.bread-crumb {
position: fixed;
left: 255px;
top: 64px;
width: 100%;
background: #fff;
height: 61px;
padding: 20px 20px 30px;
z-index: 99;
border-top: 3px solid #F0F2F5;
.el-breadcrumb__inner {
font-size: 14px;
}
a:hover {
color: #449284;
}
}
.f-detail-content {
.header {
.title {
display: flex;
flex-direction: column;
justify-content: flex-end;
}
}
.base-info {
padding: 10px;
border-bottom: 1px dashed #efefef;
.base-content {
display: flex;
flex-direction: row;
flex-wrap: wrap;
justify-content: space-between;
padding: 10px 0;
.content-div {
.c-title {
width: 115px;
}
}
}
}
.time-nodes {
padding: 20px 10px;
.title {
color: #666666;
padding-bottom: 20px;
}
.followup-contents {
padding: 25px;
}
.node-div {
width: 100%;
overflow-x: scroll;
overflow-y: hidden;
white-space: nowrap;
&::-webkit-scrollbar{
height: 6px;
}
&::-webkit-scrollbar-thumb {/*滚动条里面小方块*/
border-radius: 10px;
-webkit-box-shadow: inset 0 0 5px rgba(0,0,0,0.2);
background: rgba(0,0,0,0.1);
}
}
}
}
}
</style>
<template>
<div class="resident-list">
<div class="bread-crumb">
<el-breadcrumb separator="/" >
<el-breadcrumb-item v-for="item in residentCrumb">
<a v-if="item.href" :href="item.href">{{item.name}}</a>
<span v-else >{{item.name}}</span>
</el-breadcrumb-item>
</el-breadcrumb>
</div>
<div class="resident-content f-main-content screenSet">
<p class="page-title">{{planTitle}}</p>
<div class="search-div">
<div class="search-input">
<el-form :model="searchData" ref="searchData" :inline="true" :label-width="labelWidth">
<el-form-item label="姓名:" prop="patientName">
<el-input v-model="searchData.patientName" size="small" placeholder="请输入姓名" clearable></el-input>
</el-form-item>
<el-form-item label="手机号:" prop="mobile">
<el-input v-model="searchData.mobile" size="small" placeholder="请输入手机号" clearable></el-input>
</el-form-item>
<el-form-item label="分组:" prop="labelId">
<el-select v-model="searchData.labelId" size="small" clearable :popper-append-to-body="false">
<el-option label="全部" value=""></el-option>
<el-option
v-for="item in groupList"
:key="item.labelId"
:label="item.labelName"
:value="item.labelId">
</el-option>
</el-select>
</el-form-item>
<el-form-item label="随访开始时间:" prop="startDate" size="small">
<el-select v-model="searchData.startDate" size="small" clearable :popper-append-to-body="false">
<el-option label="全部" value=""></el-option>
<el-option
v-for="(item, index) in followStartTimeList"
:key="item+index"
:label="item"
:value="item">
</el-option>
</el-select>
</el-form-item>
</el-form>
</div>
<div class="search-btn">
<el-button class="button-green" type="primary" size="small" @click="searchResidentList">查询</el-button>
<el-button class="button-white" plain size="small" @click="resetSearchData('searchData')">重置</el-button>
</div>
</div>
<div class="resident-table table-content">
<div class="btn-div">
<el-radio-group v-model="status" size="small">
<el-radio-button label="1">未开始({{residentList.notCount}})</el-radio-button>
<el-radio-button label="2">进行中({{residentList.handCount}})</el-radio-button>
<el-radio-button label="3">已结束({{residentList.yesCount}})</el-radio-button>
</el-radio-group>
<div class="btn-left">
<el-button class="button-white" plain size="small" v-if="status==3" @click="finishFollowup('all')">恢复随访</el-button>
<el-button class="button-white" plain size="small" v-else @click="finishFollowup('all')">结束随访</el-button>
<el-button class="button-green" type="primary" size="small" @click="selectPatientHandler">添加居民</el-button>
</div>
</div>
<el-table
:data="residentList.fPlanPatientInfoDtoList"
center
@selection-change="handleSelectionChange"
:row-key="getRowKeys"
ref="tableData"
style="width: 100%;margin-top: 20px;">
<el-table-column
type="selection"
align="center"
:reserve-selection="true">
</el-table-column>
<el-table-column
prop="patientName"
label="姓名"
align="center">
<template slot-scope="scope">
<el-button type="text" @click="goPatientDetail(scope.row.patientId, scope.row.fuPlanPatientId)" >{{scope.row.patientName}}</el-button>
</template>
</el-table-column>
<el-table-column
prop="sexName"
label="性别"
align="center">
</el-table-column>
<el-table-column
prop="mobilePhone"
label="手机"
align="center">
</el-table-column>
<el-table-column
width="160"
prop="time"
label="随访开始时间"
align="center">
</el-table-column>
<el-table-column
prop="labelName"
label="分组"
align="center">
</el-table-column>
<el-table-column
width="190"
fixed="right"
label="操作"
align="center">
<template slot-scope="scope">
<el-button class="btn-right-class" type="text" @click="changePlan(scope.row)" >变更计划</el-button>|
<el-button class="btn-right-class" type="text" v-if="status==3" @click="finishFollowup(scope.row)" >恢复随访</el-button>
<el-button class="btn-right-class" type="text" v-else @click="finishFollowup(scope.row)" >结束随访</el-button>
</template>
</el-table-column>
</el-table>
<div class="pagination">
<el-pagination
background
v-if="residentList.fPlanPatientInfoDtoList"
@size-change="handleSizeChangePre"
@current-change="handleCurrentChangePre"
layout="total, sizes, prev, pager, next, jumper"
:current-page="residentList.pageNum"
:page-sizes="[10, 20, 50, 100]"
:page-size="residentList.pageSize"
:total="statusTotal">
</el-pagination>
</div>
</div>
</div>
<change-plan :showThisPage="showChangePlan" :planChangeData="planChangeData" @closeChangePlan="closeChangePlan"></change-plan>
<finish-followup :showThisPage="showFinishFollowup" :finishData="finishData" @closeFinishFollowup="closeFinishFollowup"></finish-followup>
<select-patient
:isShowSelectPatient="isShowSelectPatient"
:patientIdList="initialPatientIdList"
:oldPatientIdList="initialPatientIdList"
@closeSelectPatient="closeSelectPatient"
@sureSelectPatient="sureSelectPatient(arguments)">
</select-patient>
<add-patient-time
:showThisPage="showAddPatientTime"
:addPatientData="addPatientData"
@closeAddPatientTime="closeAddPatientTime"></add-patient-time>
</div>
</template>
<script>
//变更计划dialog
import ChangePlan from '@/views/followup/plan-manage/dialog/change-plan';
//结束随访dialog
import FinishFollowup from '@/views/followup/plan-manage/dialog/finish-followup';
//添加居民
import SelectPatient from '@/views/followup/plan-manage/dialog/select-patient';
//添加居民选择随访时间
import addPatientTime from '@/views/followup/plan-manage/dialog/add-patient-time';
import { mapState, mapActions } from 'vuex'
export default {
name: "residentList",
components: {
ChangePlan,
FinishFollowup,
SelectPatient,
addPatientTime
},
data() {
return {
labelWidth: '110px', //标题长度
searchData: {
labelId: '',
startDate: ''
}, //查询数据
groupOption: [{ // 分组选项
value: '全部',
label: ''
}],
status: 1, //列表筛选条件
showChangePlan: false,//是否展示变更计划
planChangeData: {}, //变更计划数据
showFinishFollowup: false, //是否展示结束随访
finishData: {}, //结束数据
isShowSelectPatient: false, //显示居民选择框
hasSelectedList: [], //已选居民
finishPatientList: [], //结束随访居民(多选)
initialPatientIdList: [], //初始居民
showAddPatientTime: false,//是否展示添加居民选择时间
addPatientData: {}, //选择时间数据
statusTotal: null, //每种状态的总数
planTitle: '', //随访计划名称
residentCrumb: [], //面包屑
getRowKeys(row) {
return row.patientId;
},
}
},
created() {
const vm = this;
},
mounted() {
this.getResidentList({
planId: this.$route.query.planId,
status: this.status
});
this.getPlanStatusOption()
this.getGroupList(); //获取分组列表
this.getFollowStartTimeList(this.$route.query.planId);// 获取随访时间列表
let residentCrumbList = sessionStorage.getItem('residentCrumb');
residentCrumbList = JSON.parse(residentCrumbList);
if(residentCrumbList.length==4&&residentCrumbList[residentCrumbList.length-1].name!='查看居民') {
this.residentCrumb = residentCrumbList.slice(0,2)
this.residentCrumb.push(
{
name: '查看居民',
href: null
}
)
} else if(residentCrumbList.length>4&&residentCrumbList[residentCrumbList.length-1].name!='查看居民') {
this.residentCrumb = residentCrumbList.slice(0,3)
this.residentCrumb.push(
{
name: '查看居民',
href: null
}
)
} else {
this.residentCrumb = residentCrumbList
}
this.setResidentCrumb(this.residentCrumb);
},
computed: {
...mapState('planManage',{
residentList: state => state.residentList,
groupList: state => state.groupList,
planStatusOption: state => state.planStatusOption,
followStartTimeList: state => state.followStartTimeList,
selectResidentList: state => state.selectResidentList
})
},
methods: {
...mapActions('planManage', ['getResidentList', 'getGroupList', 'getPlanStatusOption', 'getFollowStartTimeList', 'setResidentCrumb']),
handleSizeChangePre(pageSize) {
this.getResidentList({
pageSize,
...this.searchData,
status: this.status,
planId: this.$route.query.planId
})
},
handleCurrentChangePre(pageNum) {
this.getResidentList({
pageNum,
...this.searchData,
status: this.status,
planId: this.$route.query.planId
})
},
goPatientDetail(patientId, fuPlanPatientId) { //居民详情页
let residentCrumbs = [];
if(this.residentCrumb.length === 3) {
residentCrumbs = [
{
name: '随访管理',
href: null
},
{
name: '计划管理',
href: `#/followup/plan-manage/plan-list`
},
{
name: '查看居民',
href: `#/followup/plan-manage/resident-list?planId=${this.$route.query.planId}`
},
{
name: '居民详情',
href: null
}
]
} else if(this.residentCrumb.length === 4) {
residentCrumbs = [
{
name: '随访管理',
href: null
},
{
name: '计划管理',
href: `#/followup/plan-manage/plan-list`
},
{
name: '计划详情',
href: `#/followup/plan-manage/plan-detail??planId=${this.$route.query.planId}`
},
{
name: '查看居民',
href: `#/followup/plan-manage/resident-list?planId=${this.$route.query.planId}`
},
{
name: '居民详情',
href: null
}
]
}
this.setResidentCrumb(residentCrumbs);
this.$router.push({path: '/followup/plan-manage/resident-detail', query: {patientId: patientId,
planId: this.$route.query.planId,
fuPlanPatientId: fuPlanPatientId}})
},
searchResidentList() { //查询居民列表
this.getResidentList({
...this.searchData,
status: this.status,
planId: this.$route.query.planId,
pageNum: 1
})
},
resetSearchData(formName) {
this.$refs[formName].resetFields();
this.getResidentList({
planId: this.$route.query.planId,
status: this.status
});
},
changePlan(row) {
this.planChangeData = {
planPatientsId: row.fuPlanPatientId,
// planId: this.$route.query.planId,
patientId: row.patientId,
yLabelList: row.labelIdList||[],
// startDate: row.time,
status: this.status,
planIdOld: this.$route.query.planId,
patientName: row.patientName,
}
this.showChangePlan = true;
},
closeChangePlan(isShow) {
this.showChangePlan = isShow
},
finishFollowup(row) {
if(row=='all') {
if(this.finishPatientList.length<=0) {
this.$message({
message: '请选择居民!',
type: 'warning'
});
return;
}
let patientIds = [];
let patientNames = [];
let planPatientsIdList = [];
this.finishPatientList.forEach(function (item, index) {
patientIds.push(item.patientId)
patientNames.push(item.patientName)
planPatientsIdList.push(item.fuPlanPatientId)
});
// console.log(patientIds)
if(patientNames.length>5) {
const le = patientNames.length
patientNames = patientNames.slice(0,5)
patientNames = `${patientNames.join('、')}${le}人`
} else {
patientNames = patientNames.join('、')
}
this.finishData = {
changeCode: this.status,
planId: this.$route.query.planId,
patientName: patientNames,
patientIdList: patientIds,
title: this.status==3?'恢复随访':'结束随访',
reasonName: this.status==3?'恢复原因:':'结束原因:',
planPatientsIdList:planPatientsIdList
};
} else {
let patientIds = [];
let planPatientsIdList = [];
patientIds.push(row.patientId)
planPatientsIdList.push(row.fuPlanPatientId)
this.finishData = {
changeCode: this.status,
planId: this.$route.query.planId,
patientName: row.patientName,
patientIdList: patientIds,
title: this.status==3?'恢复随访':'结束随访',
reasonName: this.status==3?'恢复原因:':'结束原因:',
planPatientsIdList: planPatientsIdList
};
}
this.showFinishFollowup = true;
},
closeFinishFollowup(isShow) {
this.showFinishFollowup = isShow
},
selectPatientHandler() {
this.isShowSelectPatient = true;
},
closeSelectPatient(val) {
this.isShowSelectPatient = val;
},
closeAddPatientTime(isShow) {
this.showAddPatientTime = isShow
},
sureSelectPatient() {
let getArguments = arguments[0];
this.isShowSelectPatient = getArguments[0];
const selectPatients = getArguments[1]; // 每次选中获取的人
let patientIds = []
let patientNames = []
selectPatients.forEach((item)=>{
patientIds.push(item.patientId)
patientNames.push(item.nickname)
})
if(patientNames.length>5) {
const le = patientNames.length
patientNames = patientNames.slice(0,5)
patientNames = `${patientNames.join('、')}${le}人`
} else {
patientNames = patientNames.join('、')
}
this.addPatientData = {
id: this.$route.query.planId,
addPatients: true,
patientIdList: patientIds,
patientNames: patientNames,
status: this.status
}
this.showAddPatientTime = true
},
handleSelectionChange(val) {
// console.log('已选居民',val)
this.finishPatientList = val;
}
},
watch: {
status(val) {
this.getResidentList({
status: val,
...this.searchData,
planId: this.$route.query.planId
})
this.$refs.tableData.clearSelection();
},
residentList(val) {
if(this.status == 1) {
this.statusTotal = val.notCount
} else if (this.status == 2) {
this.statusTotal = val.handCount
} else if (this.status == 3) {
this.statusTotal = val.yesCount
}
},
selectResidentList(val) {
const _this = this
if(val) {
val.forEach(function (item,index) {
_this.initialPatientIdList.push(item.patientId)
});
}
},
},
beforeRouteEnter(to, from, next) {
next(vm=> {
if(from.name === 'planList') {
vm.curmbSecond = '计划管理'
vm.jumPathThird = '/followUp/plan-manage'
} else if(from.name === 'planDetail') {
vm.curmbSecond = '计划详情'
vm.jumPathThird = `/followUp/plan-manage/plan-detail?planId=${vm.$route.query.planId}`
}
vm.planTitle = vm.$route.query.planName
})
}
}
</script>
<style lang="scss" scoped>
@import '../../../style/followup/followup-common';
@import '../../../style/followup/element-reset.css';
.bread-crumb {
position: fixed;
left: 255px;
top: 64px;
width: 100%;
background: #fff;
height: 61px;
padding: 20px 20px 30px;
z-index: 99;
border-top: 3px solid #F0F2F5;
.el-breadcrumb__inner {
font-size: 14px;
}
a:hover {
color: #449284;
}
}
.btn-left {
float: right;
}
</style>
<template>
<div class="dialog-wrap">
<el-dialog
title="变更随访状态"
:visible.sync="dialogFormVisible"
v-if="isShowChangeDialog"
center
:close-on-click-modal="false"
:close-on-press-escape="false"
:before-close="closeChange"
width="800px">
<el-form ref="statusForm" :model="statusForm" :rules="rules" label-suffix=":" label-width="120px" size="small">
<el-form-item label="居民" style="margin-bottom:0;">
<span>{{statusForm.nickname}}</span>
</el-form-item>
<el-form-item label="变更状态">
<span>{{statusForm.status==1 ? '已完成' : '未完成'}}</span>
</el-form-item>
<el-form-item label="变更原因" prop="reason">
<el-input type="textarea" v-model="statusForm.reason" placeholder="请输入变更原因" maxlength="30" rows="3" style="width:60%;"></el-input>
</el-form-item>
</el-form>
<div slot="footer" class="dialog-footer">
<el-button size="small" plain @click="closeChange">取 消</el-button>
<el-button size="small" type="primary" @click="saveReason('statusForm')">确 定</el-button>
</div>
</el-dialog>
</div>
</template>
<script>
import {changeEnteringStatus} from '@/utils/followup/followapis'
export default {
components: {},
data(){
return{
dialogFormVisible: true,
// statusForm: {
// reason: ''
// },
rules: {
reason: [{ required: true,message: '请输入变更原因', trigger: ['blur']}]
}
}
},
props: {
isShowChangeDialog: {
type: Boolean,
default: false
},
statusForm: {
type: Object,
default: function () {
return {};
}
}
},
computed: {
},
created() {},
methods: {
closeChange(){
this.$refs['statusForm'].resetFields();
this.$emit('closeChangeStatus',false)
},
saveReason(formName){
this.$refs[formName].validate((valid) => {
if (valid) {
//后面更改为接口调用
changeEnteringStatus({
fuPlanPatientTimesId: this.statusForm.fuPlanPatientTimesId,
patientId: this.statusForm.patientId,
status: (this.statusForm.status == 1 ? 2 : 1),
reason: this.statusForm.reason,
}).then(({data}) => {
if(data == 2) {
this.$message.success('随访状态变更成功!');
}else {
this.$message.error('随访状态变更失败!');
}
this.$emit('closeChangeStatus',false);
this.$refs['statusForm'].resetFields();
})
} else {
return false;
}
});
},
}
}
</script>
<style scoped lang="scss">
@import '../../../../style/followup/followup-common';
@import '../../../../style/followup/element-reset.css';
.warn-tips{
font-size: 12px;
color: #e6a23c;
padding-top: 5px;
}
.el-dialog{
min-width: 580px!important;
}
</style>
<template>
<div class="dialog-wrap">
<el-dialog title="用药情况" :visible.sync="showDialog">
<el-form :model="formChosedMedical" ref="choseMed" :rules="rules">
<el-form-item label="药物名称" :label-width="formLabelWidth" prop="medicinesName">
<el-input v-model="formChosedMedical.medicinesName" autocomplete="off" placeholder="请输入药物名称" maxlength="30"></el-input>
</el-form-item>
<el-form-item label="用法" :label-width="formLabelWidth" prop="dosageDay">
<el-input v-model="formChosedMedical.dosageDay" type="number" autocomplete="off" placeholder="请输入每日几次">
<template slot="append">次/日</template>
</el-input>
</el-form-item>
<el-form-item label="用量" :label-width="formLabelWidth" prop="dosageNum">
<el-input v-model="formChosedMedical.dosageNum" autocomplete="off" placeholder="请输入每次用量" maxlength="30">
<template slot="append">每次</template>
</el-input>
</el-form-item>
</el-form>
<div slot="footer" class="dialog-footer">
<el-button @click="closeDialog">取 消</el-button>
<el-button type="primary" @click="confirmSubmit">确 定</el-button>
</div>
</el-dialog>
</div>
</template>
<script>
import { checkIsInteger } from '@/utils/followup/followupUtils/checkField';
export default {
data(){
var checkRange = (rule, value, callback) => {
// let min,max;
let val = Number(value);
if((val >= 0) && (val <= 5)){
callback()
}else{
callback(new Error(`输入范围0~5`))
}
}
return {
showDialog: true,
formLabelWidth: '120px',
formChosedMedical: {
medicinesName: '', // 药物名称
dosageDay: '', // 每日次数
dosageNum: '', // 每次的剂量
},
rules: {
medicinesName: [{ required: true, message: '请输入药物名称', trigger: 'change' }],
dosageDay: [{ required: true, message: '请输入每日几次', trigger: ['change'] },{ validator: checkIsInteger, trigger: 'change' },{validator:checkRange,trigger: 'change'}],
dosageNum: [{ required: true, message: '请输入每次用量', trigger: 'change' }],
},
}
},
watch: {
showDialog(val){
this.$emit('closeDialog',val)
}
},
methods: {
closeDialog(){
this.$emit('closeDialog',false)
},
confirmSubmit(){
this.$refs['choseMed'].validate((valid) => {
if(valid){
this.$emit('closeDialog',false);
this.$emit('setMedication',this.formChosedMedical);
}
});
}
}
}
</script>
<style scoped lang="scss">
</style>
<template>
<el-dialog title="本次随访详情"
:visible.sync="dialogDetail"
v-if="dialogFormVisible"
center
:close-on-click-modal="false"
:close-on-press-escape="false"
width="70%"
:before-close="closeDetail">
<div class="detail-content">
<div class="base-info">
<div class="base-content">
<div class="content-div">
<div class="c-title">姓名:</div>
<div class="c-content">{{enteringInfo.nickname | emptyFileter}}</div>
</div>
<div class="content-div ">
<div class="c-title">性别:</div>
<div class="c-content">{{enteringInfo.sex | emptyFileter}}</div>
</div>
<div class="content-div">
<div class="c-title">年龄:</div>
<div class="c-content" v-if="enteringInfo.age">{{enteringInfo.age | emptyFileter}}</div>
<div class="c-content" v-else>{{enteringInfo.age | emptyFileter}}</div>
</div>
<div class="content-div">
<div class="c-title">身份证号:</div>
<div class="c-content">{{enteringInfo.idNo | emptyFileter}}</div>
</div>
<div class="content-div">
<div class="c-title">联系方式:</div>
<div class="c-content">{{enteringInfo.mobilePhone | emptyFileter}}</div>
</div>
</div>
</div>
<div class="base-info pt10">
<div class="base-content">
<div class="content-div">
<div class="c-title">随访计划名称:</div>
<div class="c-content">{{enteringInfo.name | emptyFileter}}</div>
</div>
</div>
<div class="group-info base-content">
<div class="content-div">
<div class="c-title">随访时间点:</div>
<div class="c-content" v-if="enteringInfo.timeNo">{{enteringInfo.timeNo}}次随访</div>
<div class="c-content" v-else>{{enteringInfo.timeNo | emptyFileter}}</div>
</div>
<div class="content-div">
<div class="c-title">随访方式:</div>
<div class="c-content">{{enteringInfo.fuPlanType | emptyFileter}}</div>
</div>
<div class="content-div" v-if="enteringInfo.executePlanTime">
<div class="c-title">实际随访时间:</div>
<div class="c-content">{{enteringInfo.executePlanTime}}</div>
</div>
<div class="content-div" v-else>
<div class="c-title">计划随访时间:</div>
<div class="c-content">{{enteringInfo.fuPlanTime}}</div>
</div>
<div class="content-div">
<div class="c-title">预约随访时间:</div>
<div class="c-content">{{enteringInfo.appointmentTime | emptyFileter}}</div>
</div>
</div>
<div class="group-info base-content flex-start">
<div class="content-div">
<div class="c-title">随访状态:</div>
<div class="c-content">{{enteringInfo.status | emptyFileter}}</div>
</div>
<div class="content-div">
<p class="tip">备注:{{enteringInfo.remarks | emptyFileter}}</p>
</div>
</div>
</div>
<div class="base-info console-list">
<div class="list-item">
<p class="title">预约日志</p>
</div>
<div class="list-item" v-for="(item, index) in enteringInfo.appointmentLogs" v-if="enteringInfo.appointmentLogs.length>0" :key="index">
<p class="title">{{item.appointmentDate}},{{item.appointmentInfo}}</p>
<p class="status">{{item.appointmentResult}}</p>
<p class="reason" v-if="item.reason">变更原因:{{item.reason}}</p>
</div>
<div class="list-item" v-if="enteringInfo.appointmentLogs.length == 0">
<p class="empty-p">暂无</p>
</div>
</div>
<div class="base-info console-list">
<div class="list-item">
<p class="title">患教资料</p>
</div>
<div class="list-item" v-if="enteringInfo.eduData">
<p class="time">{{enteringInfo.eduData.timeNodeInfo}}</p>
<a class="link-p" :href="enteringInfo.eduData.highDefinitionShortUrl" target="_blank">{{enteringInfo.eduData.headerName}}</a>
</div>
<div class="list-item" v-if="!enteringInfo.eduData">
<p class="empty-p">暂无</p>
</div>
</div>
<div class="base-info console-list">
<div class="list-item">
<p class="title">随访登记表</p>
</div>
<div class="list-item" v-for="(item, index) in enteringInfo.fuTable" :key="index" v-if="enteringInfo.fuTable.length>0">
<p class="link-p" @click="goToScale(item)">{{item.name}}</p>
</div>
<div class="list-item" v-if="enteringInfo.fuTable.length==0">
<p class="empty-p">暂无</p>
</div>
</div>
</div>
</el-dialog>
</template>
<script>
import { mapState, mapActions } from 'vuex';
export default {
data(){
return{
dialogDetail: true,
// eduData: {},
}
},
props: {
dialogFormVisible: {
type: Boolean,
default: false
},
enteringInfo: {
type: Object,
default: {}
}
},
computed: {
// ...mapState('recordManage',{
// enteringInfo: state => state.enteringInfo,
// })
},
created() {
// if(this.dialogFormVisible == true) {
// this.getEnteringInfo({patientId: this.enteringRow.patientId,fuPlanPatientTimesId: this.enteringRow.fuPlanPatientTimesId});
// }
},
mounted(){
},
methods: {
// ...mapActions('recordManage', ['getEnteringInfo']),
closeDetail(){
this.$emit('closeDetail',false)
},
goToScale(val) {
this.$router.push({path: '/followup/record-manage/form-template',
query: {doctorId: this.enteringInfo.doctorId, scaleNo: val.scaleNo, planPatientsTimesId: this.enteringInfo.planPatientsTimesId,planTimesId : val.planTimesId, showBtn: 1}});
}
},
filters: {
emptyFileter: function(value) {
if (!value) {
return '-';
} else {
return value;
}
},
},
}
</script>
<style scoped lang="scss">
@import '../../../../style/followup/followup-common';
@import '../../../../style/followup/element-reset.css';
.detail-content{
max-height: 550px;
overflow-y: scroll;
&::-webkit-scrollbar{
width:5px;
}
&::-webkit-scrollbar-thumb {/*滚动条里面小方块*/
border-radius: 10px;
-webkit-box-shadow: inset 0 0 5px rgba(0,0,0,0.2);
background: rgba(0,0,0,0.1);
}
}
.base-info {
padding: 0 10px;
border-bottom: 1px dashed #efefef;
&.pt10{
padding-top: 10px;
}
.base-content {
display: flex;
flex-direction: row;
flex-wrap: wrap;
justify-content: space-between;
line-height: 35px;
&.dashed-border{
border-bottom: 1px dashed #efefef;
}
&.flex-start{
justify-content: flex-start;
}
.content-div {
.c-title {
width: 115px;
}
.tip{
padding-left: 20px;
color: #999;
}
}
}
&.console-list{
padding: 15px 10px;
.list-item{
display: flex;
line-height: 38px;
color: #666;
.title{
width: 300px;
}
.status{
width: 150px;
}
.reason{
flex: 1;
}
.time{
width: 150px;
}
.link-p{
flex: 1;
text-decoration: underline;
color: $picaGreen;
cursor: pointer;
}
.empty-p{
flex: 1;
color: #999;
}
}
}
}
</style>
<template>
<div class="form-show-scrollY">
<div class="form-template">
<BreadCrumb
:curmbFirst="'随访管理'"
:curmbSecond="breadTxt"
:curmbThird="'录入量表'"
:jumPathThird="jumPathThird"
/>
<div class="resident-content f-main-content screenSet">
<el-row :gutter="24" align="middle" type="flex" class="form-header">
<el-col :span="18">{{titleText}}</el-col>
<el-col :span="6" v-if="showBtn=='1'">
<el-button type="primary" size="small" class="formSubmit" @click="formSubmit(1)">提交</el-button>
<el-button class="button-white formTempSave" size="small" plain @click="formSubmit(2)">暂存</el-button>
</el-col>
</el-row>
<div class="title-box">
<h1>{{titleText}}</h1>
<h2>{{titleSmText}}</h2>
</div>
<!--模板页面除了显示居民基本信息,将病种展示作为组件引入-->
<div class="form-container">
<!--脑卒中-->
<stroke v-if="scaleNo=='SCALE0003'" :showBtn="showBtn" :scaleType="scaleNo" :checkStart="checkStart" @checkEnd="checkEnd" :saveWay="saveWay" />
<!--高血压-->
<hypertension v-if="scaleNo=='SCALE0001'" :showBtn="showBtn" :scaleType="scaleNo" :checkStart="checkStart" @checkEnd="checkEnd" :saveWay="saveWay" ></hypertension>
<!--糖尿病-->
<diabetes v-if="scaleNo=='SCALE0002'" :showBtn="showBtn" :scaleType="scaleNo" :checkStart="checkStart" @checkEnd="checkEnd" :saveWay="saveWay" ></diabetes>
</div>
</div>
</div>
</div>
</template>
<script>
import BreadCrumb from '@/components/breadcrumb'
// 脑卒中
import stroke from './patient-scale/stroke'
import hypertension from './patient-scale/hypertension'
import diabetes from './patient-scale/diabetes'
export default {
data(){
return {
titleText: '',
titleSmText: '',
breadTxt: '录入管理',
jumPathThird: '/followup/record-manage/record-list',
checkStart: false,
showBtn: '1',
// resourceId: '',
saveWay: 1,
scaleNo: ''
}
},
components: {
stroke,
hypertension,
BreadCrumb,
diabetes,
},
methods: {
formSubmit(val){
this.saveWay = val
this.checkStart = true;
},
checkEnd(val){
this.checkStart = false
}
},
created(){
this.scaleNo = this.$route.query.scaleNo;
console.log('scaleNo=>',this.scaleNo)
// 0003 脑卒中、0002 糖尿病、0001 高血压
if(this.scaleNo == 'SCALE0003'){
this.titleText = '心脑血管病危险因素社区、乡镇人群随访表';
this.titleSmText = '(适用于社区、乡镇脑卒中高危人群满6个月、12个月时随访和中危人群满12个月时随访使用)';
}else if(this.scaleNo == 'SCALE0001'){
this.titleText = '高血压患者随访服务记录表';
this.titleSmText = '(本表为高血压患者在接受随访服务时由医生填写)';
}else if(this.scaleNo == 'SCALE0002'){
this.titleText = '2 型糖尿病患者随访服务记录表 ';
this.titleSmText = '(本表为2型糖尿病患者在接受随访服务时由医生填写)';
}
if(this.$route.query.showBtn=='0'){
this.showBtn = String(this.$route.query.showBtn);
}
},
}
</script>
<style lang="scss" scoped>
@import '../../../style/followup/followup-common';
@import '../../../style/followup/element-reset.css';
.form-show-scrollY{
width: 100%; height: 100%; overflow: hidden; overflow-y: scroll;
&::-webkit-scrollbar{
width: 8px; height: 8px;
background: #fff;
}
}
.form-template{
.form-header{
/*position: fixed;*/
/*z-index:100000;*/
line-height: 60px;
height: 60px;
border-bottom: 1px solid #e1e1e1;
}
.patient-base-info{
line-height: 60px;
height: 60px;
border-bottom: 1px dashed #ccc;
[class*=el-col-]{
float: left;
}
}
.title-box{
padding: 20px;
text-align: center;
h1{
font-size: 18px;
font-weight: normal;
}
h2{
font-size: 16px;
font-weight: normal;
margin-top: 15px;
}
}
.formSubmit{
float: right;
margin-left: 10px;
}
.formTempSave{
float: right;
}
.form-container{
padding: 0 10px;
}
}
.title{
font-weight: bold;
}
</style>
<template>
<router-view></router-view>
</template>
<script>
export default {
name: "layout"
}
</script>
<style scoped>
</style>
import { checkRange, checkIsInteger, checkNumberIsToFixed, checkNumberIsToFixedTwo } from '@/utils/followup/followupUtils/checkField';
export default ($this) => {
let hanldeValue = () => {
$this.addComponents.forEach((item,index)=>{
if(item.name == 'diabetesSourseAuxiliary'){
const glycosylatedHemoglobinPercent = item.formObject.glycosylatedHemoglobinPercent
const glycosylatedHemoglobinDate = item.formObject.glycosylatedHemoglobinDate
item.dataSource.forEach((item2,index2)=>{
if((glycosylatedHemoglobinPercent||glycosylatedHemoglobinDate) && item2.refs){
$this.addComponents[index].dataSource[index2].rules[0].required = true;
$this.$refs['form' + index][0].validateField(['glycosylatedHemoglobinPercent','glycosylatedHemoglobinDate']);
}else{
if(item2.refs){
if(item2.refs == 'glycosylatedHemoglobinPercent'){
// $this.addComponents[index].dataSource[index2].rules[0].required = false;
$this.addComponents[index].dataSource[index2].rules = [{ required: false, message: '请输入糖化血红蛋白值', trigger: ['submit','change'] },{ validator: checkRange , trigger: ['submit','change'] },{ validator: checkNumberIsToFixedTwo , trigger: ['submit','change'] }];
}else{
$this.addComponents[index].dataSource[index2].rules[0].required = false;
}
// $this.addComponents[index].dataSource[index2].rules[0].required = false;
$this.$nextTick(()=>{
$this.$refs['form'+index][0].validate((valid) => {
});
$this.$refs['form' + index][0].clearValidate(['fastingBloodSugar','glycosylatedHemoglobinPercent','glycosylatedHemoglobinDate']);
})
}
}
})
}
})
}
return [
{
formType: 'input',
className: 'float-none',
prop: 'fastingBloodSugar',
model: 'fastingBloodSugar',
disabled: false,
label: '空腹血糖值:',
placeholder: '请输入空腹血糖值',
spanNum: 8,
maxlength: 30,
type: 'number',
labmsg: '',
slots: [{name: 'mmol/L', type: 'append'}],
rules: [{ required: true, message: '请输入空腹血糖值', trigger: ['submit','change'] },{ validator: checkRange , trigger: ['submit','change'] },{ validator: checkNumberIsToFixed , trigger: ['submit','change'] }]
},
// {
// formType: 'div',
// name: '其他检查',
// className: 'sec-title',
// },
{
formType: 'input',
className: 'float-none',
prop: 'glycosylatedHemoglobinPercent',
model: 'glycosylatedHemoglobinPercent',
refs: 'glycosylatedHemoglobinPercent',
disabled: false,
label: '糖化血红蛋白值:',
placeholder: '请输入糖化血红蛋白值',
spanNum: 8,
maxlength: 30,
type: 'number',
labmsg: '',
slots: [{name: '%', type: 'append'}],
rules: [{ required: false, message: '请输入糖化血红蛋白值', trigger: ['submit','change'] },{ validator: checkRange , trigger: ['submit','change'] },{ validator: checkNumberIsToFixedTwo , trigger: ['submit','change'] }],
changeFun: hanldeValue,
// blurFunc: hanldeValue
},
{
formType: 'date-picker',
className: 'float-none',
prop: 'glycosylatedHemoglobinDate',
model: 'glycosylatedHemoglobinDate',
refs: 'glycosylatedHemoglobinDate',
placeholder: '请选择',
label: '检查日期:',
format: 'MM 月 dd 日',
valueFormat: 'MM-dd',
dateType: 'date',
type: 'date',
rules: [{required: false, message: '请选择检查日期', trigger: ['submit','change','blur']}],
spanNum: 12,
changeFun: hanldeValue,
},
]
}
import { checkRange, checkIsInteger, checkNumberIsToFixed } from '@/utils/followup/followupUtils/checkField';
export default ($this) => {
return [
{
formType: 'input',
className: 'float-none',
prop: 'name',
model: 'name',
label: '姓名:',
disabled: false,
placeholder: '请输入姓名',
spanNum: 12,
maxlength: 30,
type: 'text',
labmsg: '次',
rules: [{required: true, message: '请输入姓名', trigger: ['submit','change']}],
},
{
formType: 'input',
className: 'float-none',
prop: 'no',
model: 'no',
label: '编号:',
disabled: false,
placeholder: '请输入编号',
spanNum: 12,
maxlength: 30,
type: 'text',
labmsg: '次',
rules: [{required: false, message: '请输入编号', trigger: ['submit','change']}],
},
{
formType: 'date-picker',
className: 'float-none',
prop: 'followupDate',
model: 'followupDate',
placeholder: '请选择',
label: '随访日期:',
format: 'yyyy-MM-dd',
valueFormat: 'yyyy-MM-dd',
dateType: 'date',
type: 'date',
rules: [{required: true, message: '请选择随访日期', trigger: ['submit','change']}],
spanNum: 12,
},
{
formType: 'radio',
className: 'obj-form-title',
prop: 'followupType',
model: 'followupType',
spanNum: 24,
label: '随访方式:',
options: [
{ label: '门诊', value: '门诊' },
{ label: '家庭', value: '家庭' },
{ label: '电话', value: '电话' },
],
rules: [{ required: true, message: '请选择随访方式', trigger: ['submit','change'] }],
changeFun: (e)=>{
}
},
]
}
import { checkRange, checkIsInteger, checkNumberIsToFixed } from '@/utils/followup/followupUtils/checkField';
export default ($this) => {
return [
{
formType: 'input',
className: 'float-none',
prop: 'smokingAmount',
model: 'smokingAmount',
disabled: false,
label: '本次日吸烟量:',
placeholder: '请输入本次日吸烟量',
spanNum: 8,
maxlength: 30,
type: 'number',
labmsg: '',
slots: [{name: '支/日', type: 'append'}],
rules: [{ required: true, message: '请输入日吸烟量', trigger: ['submit','change'] },{ validator: checkRange , trigger: ['submit','change'] },{ validator: checkIsInteger , trigger: ['submit','change'] }]
},
{
formType: 'input',
className: 'float-none',
prop: 'nextSmokingAmount',
model: 'nextSmokingAmount',
disabled: false,
label: '下次随访目标日吸烟量:',
placeholder: '请输入下次随访日吸烟量',
spanNum: 8,
maxlength: 30,
type: 'number',
labmsg: '',
slots: [{name: '支/日', type: 'append'}],
rules: [{ required: true, message: '请输入下次随访日吸烟量', trigger: ['submit','change'] },{ validator: checkRange , trigger: ['submit','change'] },{ validator: checkIsInteger , trigger: ['submit','change'] }]
},
{
formType: 'input',
className: 'float-none',
prop: 'alcoholConsumption',
model: 'alcoholConsumption',
disabled: false,
label: '本次日饮酒量:',
placeholder: '请输入本次日饮酒量',
spanNum: 8,
maxlength: 30,
type: 'number',
labmsg: '',
slots: [{name: '两/日', type: 'append'}],
rules: [{ required: true, message: '请输入本次日饮酒量', trigger: ['submit','change'] },{ validator: checkRange , trigger: ['submit','change'] },{ validator: checkIsInteger , trigger: ['submit','change'] }]
},
{
formType: 'input',
className: 'float-none',
prop: 'nextAlcoholConsumption',
model: 'nextAlcoholConsumption',
disabled: false,
label: '下次随访目标日饮酒量:',
placeholder: '请输入下次随访日饮酒量',
spanNum: 8,
maxlength: 30,
type: 'number',
labmsg: '',
slots: [{name: '两/日', type: 'append'}],
rules: [{ required: true, message: '请输入下次随访日饮酒量', trigger: ['submit','change'] },{ validator: checkRange , trigger: ['submit','change'] },{ validator: checkIsInteger , trigger: ['submit','change'] }]
},
{
formType: 'input',
className: 'float-none',
prop: 'workoutOfWeek',
model: 'workoutOfWeek',
disabled: false,
label: '本次运动情况:',
placeholder: '请输入本次运动情况',
spanNum: 8,
maxlength: 30,
type: 'number',
labmsg: '',
slots: [{name: '次/周', type: 'append'}],
rules: [{ required: true, message: '请输入本次运动情况', trigger: ['submit','change'] },{ validator: checkRange , trigger: ['submit','change'] },{ validator: checkIsInteger , trigger: ['submit','change'] }]
},
{
formType: 'input',
className: 'float-none',
prop: 'workoutDuration',
model: 'workoutDuration',
disabled: false,
placeholder: '请输入本次运动情况',
spanNum: 8,
maxlength: 30,
type: 'number',
labmsg: '',
slots: [{name: '分钟/次', type: 'append'}],
rules: [{ required: true, message: '请输入本次运动情况', trigger: ['submit','change'] },{ validator: checkRange , trigger: ['submit','change'] },{ validator: checkIsInteger , trigger: ['submit','change'] }]
},
{
formType: 'input',
className: 'float-none',
prop: 'nextWorkoutOfWeek',
model: 'nextWorkoutOfWeek',
disabled: false,
label: '下次随访目标运动情况:',
placeholder: '请输入下次随访运动情况',
spanNum: 8,
maxlength: 30,
type: 'number',
labmsg: '',
slots: [{name: '次/周', type: 'append'}],
rules: [{ required: true, message: '请输入下次随访运动情况', trigger: ['submit','change'] },{ validator: checkRange , trigger: ['submit','change'] },{ validator: checkIsInteger , trigger: ['submit','change'] }]
},
{
formType: 'input',
className: 'float-none',
prop: 'nextWorkoutDuration',
model: 'nextWorkoutDuration',
disabled: false,
placeholder: '请输入下次随访运动情况',
spanNum: 8,
maxlength: 30,
type: 'number',
labmsg: '',
slots: [{name: '分钟/次', type: 'append'}],
rules: [{ required: true, message: '请输入下次随访运动情况', trigger: ['submit','change'] },{ validator: checkRange , trigger: ['submit','change'] },{ validator: checkIsInteger , trigger: ['submit','change'] }]
},
{
formType: 'input',
className: 'float-none',
prop: 'stapleFoodGram',
model: 'stapleFoodGram',
disabled: false,
label: '实际主食摄入量:',
placeholder: '请输入每天摄入主食克数',
spanNum: 8,
maxlength: 30,
type: 'number',
labmsg: '',
slots: [{name: '克/天', type: 'append'}],
rules: [{ required: true, message: '请输入每天摄入主食克数', trigger: ['submit','change'] },{ validator: checkRange , trigger: ['submit','change'] },{ validator: checkIsInteger , trigger: ['submit','change'] }]
},
{
formType: 'input',
className: 'float-none',
prop: 'nextStapleFoodGram',
model: 'nextStapleFoodGram',
disabled: false,
label: '目标主食摄入量:',
placeholder: '请输入每天摄入主食克数',
spanNum: 8,
maxlength: 30,
type: 'number',
labmsg: '',
slots: [{name: '克/天', type: 'append'}],
rules: [{ required: true, message: '请输入每天摄入主食克数', trigger: ['submit','change'] },{ validator: checkRange , trigger: ['submit','change'] },{ validator: checkIsInteger , trigger: ['submit','change'] }]
},
{
formType: 'radio',
className: 'obj-form-title',
prop: 'psychologicalAdjustment',
model: 'psychologicalAdjustment',
spanNum: 24,
label: '心理调整:',
options: [
{ label: '良好', value: '良好' },
{ label: '一般', value: '一般' },
{ label: '差', value: '差' },
],
rules: [{ required: true, message: '请选择心理调整', trigger: ['submit','change'] }],
changeFun: (e)=>{
}
},
{
formType: 'radio',
className: 'obj-form-title',
prop: 'followMedicalPractive',
model: 'followMedicalPractive',
spanNum: 24,
label: '遵医行为:',
options: [
{ label: '良好', value: '良好' },
{ label: '一般', value: '一般' },
{ label: '差', value: '差' },
],
rules: [{ required: true, message: '请选择遵医行为情况', trigger: ['submit','change'] }],
changeFun: (e)=>{
}
},
]
}
import { checkRange, checkIsInteger, checkNumberIsToFixed } from '@/utils/followup/followupUtils/checkField';
export default ($this) => {
return [
{
formType: 'list',
className: 'float-none',
// arrList: [
// {
// medicinesName: '吗丁啉',
// dosageDay: 3,
// dosageNum: 1,
// }
// ],
prop: 'arrList',
model: 'arrList',
label: '',
disabled: true,
spanNum: 24,
rules: [{required: false, message: '', trigger: ['submit','change']}],
clickDeleteFunc: () => {
}
},
{
formType: 'button',
className: 'float-none',
prop: 'followUpOrgName',
model: 'followUpOrgName',
icon: 'el-icon-circle-plus',
btnText: '点击添加',
disabled: false,
spanNum: 12,
maxlength: 30,
type: 'text',
labmsg: '次',
clickFunc: () => {
$this.addComponents.forEach((item,index)=>{
if(item.name == 'diabetesSourseMedicationUse'){
if($this.addComponents[index].formObject.arrList.length >= 3) {
$this.$message.warning('最多只可添加3种药物!')
}else {
$this.dialogFormVisible = true;
}
}
})
}
},
{
formType: 'div',
name: '胰岛素',
className: 'sec-title',
},
{
formType: 'input',
className: 'float-none',
prop: 'medicinesName',
model: 'medicinesName',
label: '种类:',
disabled: false,
placeholder: '请输入胰岛素种类',
spanNum: 12,
maxlength: 30,
type: 'text',
labmsg: '次',
rules: [{required: true, message: '请输入胰岛素种类', trigger: ['submit','change']}],
},
{
formType: 'input',
className: 'float-none',
prop: 'dosageDay',
model: 'dosageDay',
label: '用法:',
disabled: false,
placeholder: '请输入胰岛素用法',
spanNum: 12,
maxlength: 30,
type: 'text',
labmsg: '次',
rules: [{required: true, message: '请输入胰岛素用法', trigger: ['submit','change']}],
},
{
formType: 'input',
className: 'float-none',
prop: 'dosageNum',
model: 'dosageNum',
label: '用量:',
disabled: false,
placeholder: '请输入胰岛素用量',
spanNum: 12,
maxlength: 30,
type: 'text',
labmsg: '次',
rules: [{required: true, message: '请输入胰岛素用量', trigger: ['submit','change']}],
},
]
}
import { checkMobile } from '@/utils/followup/followupUtils/checkField';
export default ($this) => {
return [
{
formType: 'radio',
className: 'obj-form-title',
prop: 'medicationObedience',
model: 'medicationObedience',
label: '服药依从性:',
disabled: false,
spanNum: 24,
options: [
{ label: '规律', value: '规律', disabled: false },
{ label: '间断', value: '间断', disabled: false },
{ label: '不服药', value: '不服药', disabled: false },
],
rules: [{ required: true, message: '请选择服药依从性', trigger: ['submit','change'] }],
},
{
formType: 'radio',
className: 'obj-form-title',
prop: 'medicalSideEffects',
model: 'medicalSideEffects',
label: '药物不良反应:',
disabled: false,
spanNum: 24,
options: [
{ label: '无', value: '无', disabled: false },
{ label: '有', value: '有', disabled: false },
],
rules: [{ required: true, message: '请选择有无不良反应', trigger: ['submit','change'] }],
},
{
formType: 'input',
className: 'obj-form-title2',
linkageRule: [{name: 'medicalSideEffects',value: ['有']}],
prop: 'remark',
model: 'remark',
disabled: false,
placeholder: '请输入不良反应',
spanNum: 12,
maxlength: 30,
type: 'text',
labmsg: '',
rules: [{ required: true, message: '请输入不良反应', trigger: ['submit','change'] }]
},
{
formType: 'radio',
className: 'obj-form-title',
prop: 'reactiveHypoglycemia',
model: 'reactiveHypoglycemia',
label: '低血糖反应:',
disabled: false,
spanNum: 24,
options: [
{ label: '无', value: '无', disabled: false },
{ label: '偶尔', value: '偶尔', disabled: false },
{ label: '频繁', value: '频繁', disabled: false },
],
rules: [{ required: true, message: '请选择低血糖反应', trigger: ['submit','change'] }],
},
{
formType: 'radio',
className: 'obj-form-title radio-block',
prop: 'followUpClassification',
model: 'followUpClassification',
spanNum: 24,
label: '此次随访分类:',
options: [
{ label: '控制满意(血压控制满意,无其他异常)', value: '控制满意(血压控制满意,无其他异常)' },
{ label: '控制不满意(血压控制不满意,无其他异常)', value: '控制不满意(血压控制不满意,无其他异常)' },
{ label: '不良反应(存在药物不良反应)', value: '不良反应(存在药物不良反应)' },
{ label: '并发症(出现新的并发症或并发症出现异常)', value: '并发症(出现新的并发症或并发症出现异常)' },
],
rules: [{ required: true, message: '请选择此次随访分类', trigger: ['submit','change'] }],
changeFun: (e)=>{
}
},
]
}
import { checkRange, checkIsInteger, checkNumberIsToFixed } from '@/utils/followup/followupUtils/checkField';
export default ($this) => {
let hanldeValue = () => {
$this.addComponents.forEach((item,index)=>{
if(item.name == 'diabetesSourseReferral'){
const reason = item.formObject.reason
const mechanism = item.formObject.mechanism
const department = item.formObject.department
item.dataSource.forEach((item2,index2)=>{
if((reason||mechanism||department) && item2.rules){
$this.addComponents[index].dataSource[index2].rules[0].required = true;
}else{
$this.addComponents[index].dataSource[index2].rules[0].required = false;
$this.$nextTick(() => {
$this.$refs['form'+index][0].clearValidate(['reason','mechanism','department']);
})
}
})
}
// $this.$refs['form'+index][0].validate((valid) => {});
})
}
return [
{
formType: 'input',
className: 'float-none',
prop: 'reason',
model: 'reason',
label: '原因:',
disabled: false,
placeholder: '请输入原因',
spanNum: 12,
maxlength: 30,
type: 'text',
rules: [{required: false, message: '请输入原因', trigger: ['submit','change','blur']}],
changeFun: hanldeValue,
blurFunc: hanldeValue
},
{
formType: 'input',
className: 'float-none',
prop: 'mechanism',
model: 'mechanism',
label: '机构:',
disabled: false,
placeholder: '请输入机构',
spanNum: 12,
maxlength: 30,
type: 'text',
rules: [{required: false, message: '请输入机构', trigger: ['submit','change','blur']}],
changeFun: hanldeValue,
blurFunc: hanldeValue
},
{
formType: 'input',
className: 'float-none',
prop: 'department',
model: 'department',
label: '科室类别:',
disabled: false,
placeholder: '请输入科室类别',
spanNum: 12,
maxlength: 30,
type: 'text',
rules: [{required: false, message: '请输入科室类别', trigger: ['submit','change','blur']}],
changeFun: hanldeValue,
blurFunc: hanldeValue
},
]
}
import { checkRange, checkIsInteger, checkNumberIsToFixed } from '@/utils/followup/followupUtils/checkField';
export default ($this) => {
return [
{
formType: 'input',
className: 'float-none',
prop: 'systolicBloodPressure',
model: 'systolicBloodPressure',
label: '收缩压SBP:',
disabled: false,
placeholder: '请输入',
spanNum: 8,
type: 'number',
labmsg: '次',
slots: [{name: 'mmHg', type: 'append'}],
rules: [{required: true, message: '请输入收缩压SBP', trigger: ['submit','change']},{ validator: checkRange , trigger: ['submit','change'] },{ validator: checkIsInteger , trigger: ['submit','change'] }],
},
{
formType: 'input',
className: 'float-none',
prop: 'diastolicBloodPressure',
model: 'diastolicBloodPressure',
label: '舒张压DBP:',
disabled: false,
placeholder: '请输入',
spanNum: 8,
type: 'number',
labmsg: '次',
slots: [{name: 'mmHg', type: 'append'}],
rules: [{required: true, message: '请输入舒张压DBP', trigger: ['submit','change']},{ validator: checkRange , trigger: ['submit','change'] },{ validator: checkIsInteger , trigger: ['submit','change'] }],
},
{
formType: 'input',
className: 'float-none',
prop: 'bodyHeight',
model: 'bodyHeight',
label: '身高:',
disabled: false,
placeholder: '请输入',
spanNum: 8,
type: 'number',
labmsg: '次',
slots: [{name: 'cm', type: 'append'}],
rules: [{required: true, message: '请输入身高', trigger: ['submit','change']},{ validator: checkRange , trigger: ['submit','change'] }, {validator: checkIsInteger , trigger: ['submit','change']}],
changeFun: (val)=>{
$this.addComponents.forEach((item,index)=>{
if(item.name == 'diabetesSourseSign'){
$this.addComponents[index].formObject.bodyHeight = val;
}
})
},
blurFunc: (val)=>{
$this.addComponents.forEach((item,index)=>{
if(item.name == 'diabetesSourseSign'){
let bodyWeight = $this.addComponents[index].formObject.bodyWeight
let bodyHeight = $this.addComponents[index].formObject.bodyHeight
if(bodyWeight && bodyHeight){
bodyWeight = parseFloat(bodyWeight);
bodyHeight = parseFloat(bodyHeight);
let bmi = (bodyWeight / Math.pow((bodyHeight/100),2)).toFixed(1);
$this.addComponents[index].formObject.bmi = bmi;
}
}
})
}
},
// 体质指数(BMI)=体重(kg)÷ 身高²(m)
{
formType: 'input',
className: 'float-none',
prop: 'bodyWeight',
model: 'bodyWeight',
label: '体重:',
disabled: false,
placeholder: '请输入(体重可以带1位小数点)',
spanNum: 8,
type: 'number',
labmsg: '次',
slots: [{name: 'kg', type: 'append'}],
rules: [{required: true, message: '请输入体重', trigger: ['submit','change']},{ validator: checkRange , trigger: ['submit','change'] }, {validator: checkNumberIsToFixed , trigger: ['submit','change']}],
changeFun: (val)=>{
$this.addComponents.forEach((item,index)=>{
if(item.name == 'diabetesSourseSign'){
$this.addComponents[index].formObject.bodyWeight = val;
}
})
},
blurFunc: (val)=>{
$this.addComponents.forEach((item,index)=>{
if(item.name == 'diabetesSourseSign'){
let bodyWeight = $this.addComponents[index].formObject.bodyWeight
let bodyHeight = $this.addComponents[index].formObject.bodyHeight
if(bodyWeight && bodyHeight){
bodyWeight = parseFloat(bodyWeight);
bodyHeight = parseFloat(bodyHeight);
let bmi = (bodyWeight / Math.pow((bodyHeight/100),2)).toFixed(1);
$this.addComponents[index].formObject.bmi = bmi;
}
}
})
}
},
{
formType: 'input',
className: 'float-none',
prop: 'bmi',
model: 'bmi',
label: 'BMI(系统自动生成):',
disabled: true,
placeholder: '(这里是自动计算所得)',
spanNum: 8,
type: 'number',
labmsg: '次',
slots: [{name: 'kg/m^2', type: 'append'}],
},
{
formType: 'input',
className: 'float-none',
prop: 'nextBodyWeight',
model: 'nextBodyWeight',
label: '下次随访目标体重:',
disabled: false,
placeholder: '请输入(体重可以带1位小数点)',
spanNum: 8,
type: 'number',
labmsg: '次',
slots: [{name: 'kg', type: 'append'}],
rules: [{required: true, message: '请输入下次随访体重', trigger: ['submit','change']},{ validator: checkRange , trigger: ['submit','change'] }, {validator: checkNumberIsToFixed , trigger: ['submit','change']}],
changeFun: (val)=>{
$this.addComponents.forEach((item,index)=>{
if(item.name == 'diabetesSourseSign'){
$this.addComponents[index].formObject.nextBodyWeight = val;
}
})
},
blurFunc: ()=>{
$this.addComponents.forEach((item,index)=>{
if(item.name == 'diabetesSourseSign'){
let nextBodyWeight = $this.addComponents[index].formObject.nextBodyWeight
let bodyHeight = $this.addComponents[index].formObject.bodyHeight
if(nextBodyWeight && bodyHeight){
nextBodyWeight = parseFloat(nextBodyWeight);
bodyHeight = parseFloat(bodyHeight);
let nextBmi = (nextBodyWeight / Math.pow((bodyHeight/100),2)).toFixed(1);
$this.addComponents[index].formObject.nextBmi = nextBmi;
}
}
})
}
},
{
formType: 'input',
className: 'float-none',
prop: 'nextBmi',
model: 'nextBmi',
label: '下次随访BMI(系统自动生成):',
disabled: true,
placeholder: '(这里是自动计算所得)',
spanNum: 8,
type: 'number',
labmsg: '次',
slots: [{name: 'kg/m^2', type: 'append'}],
},
{
formType: 'radio',
className: 'obj-form-title',
prop: 'dorsalisPedisArteryPulsation',
model: 'dorsalisPedisArteryPulsation',
label: '足背动脉搏动:',
disabled: false,
spanNum: 24,
options: [
{ label: '触及正常', value: '触及正常', disabled: false },
{ label: '双侧减弱', value: '双侧减弱', disabled: false },
{ label: '左侧减弱', value: '左侧减弱', disabled: false },
{ label: '右侧减弱', value: '右侧减弱', disabled: false },
{ label: '双侧消失', value: '双侧消失', disabled: false },
{ label: '左侧消失', value: '左侧消失', disabled: false },
{ label: '右侧消失', value: '右侧消失', disabled: false },
],
rules: [{ required: true, message: '请选择足背动脉搏动情况', trigger: ['submit','change'] }]
},
{
formType: 'input',
className: 'float-none',
prop: 'remark',
model: 'remark',
disabled: false,
label: '其他:',
placeholder: '请输入其他体征',
spanNum: 12,
maxlength: 30,
type: 'text',
labmsg: '',
rules: [{ required: false, message: '请输入其他体征', trigger: ['submit','change'] }]
},
]
}
import { checkRange, checkIsInteger, checkNumberIsToFixed } from '@/utils/followup/followupUtils/checkField';
export default ($this) => {
return [
{
formType: 'date-picker',
className: 'float-none',
prop: 'nextFollowDay',
model: 'nextFollowDay',
placeholder: '请选择',
label: '下次随访日期:',
format: 'yyyy-MM-dd',
valueFormat: 'yyyy-MM-dd',
dateType: 'date',
type: 'date',
rules: [{required: true, message: '请选择下次随访日期', trigger: ['submit','change']}],
spanNum: 12,
},
// {
// formType: 'input',
// className: 'float-none',
// prop: 'doctorSignature',
// model: 'doctorSignature',
// label: '随访医生签名:',
// disabled: false,
// placeholder: '请输入随访人员姓名',
// spanNum: 12,
// maxlength: 30,
// type: 'text',
// labmsg: '次',
// rules: [{required: true, message: '请输入随访医生签名', trigger: ['submit','change']}],
// },
]
}
import { checkMobile } from '@/utils/followup/followupUtils/checkField';
export default ($this) => {
return [
{
formType: 'radio',
className: 'obj-form-title',
prop: 'hasSymptom',
model: 'hasSymptom',
label: '是否有症状:',
disabled: false,
spanNum: 24,
options: [
{ label: '无', value: '无', disabled: false },
{ label: '有', value: '有', disabled: false },
],
rules: [{ required: true, message: '请选择随访期间有无症状', trigger: ['submit','change'] }],
changeFun: (e) => {
if(e == '有') {
$this.addComponents.forEach((item,index)=>{
if(item.name == 'diabetesSourseSymptom'){
$this.addComponents[index].formObject = {
...$this.addComponents[index].formObject,
symptom: []
}
}
})
}
}
},
{
formType: 'checkbox',
className: 'obj-form-title',
prop: 'symptom',
model: 'symptom',
label: '选择的症状:',
linkageRule: [{name: 'hasSymptom', value: ['有']}],
disabled: false,
changeFun: (val) => {
// console.log(val)
},
spanNum: 24,
options: [
{label: '多饮', value: '多饮', disabled: false},
{label: '多食', value: '多食', disabled: false},
{label: '多尿', value: '多尿', disabled: false},
{label: '视力模糊', value: '视力模糊', disabled: false},
{label: '感染', value: '感染', disabled: false},
{label: '手脚麻木', value: '手脚麻木', disabled: false},
{label: '下肢浮肿', value: '下肢浮肿', disabled: false},
{label: '体重明显下降', value: '体重明显下降', disabled: false},
{label: '其他', value: '其他', disabled: false},
],
rules: [{required: true, message: '选择的症状', trigger: ['submit']}]
},
{
formType: 'input',
className: 'obj-form-title2',
linkageRule: [{name: 'symptom',value: ['其他']}],
prop: 'remark',
model: 'remark',
disabled: false,
placeholder: '请输入其他症状',
spanNum: 12,
maxlength: 30,
type: 'text',
labmsg: '',
rules: [{ required: true, message: '请输入其他症状', trigger: ['submit','change'] }]
},
]
}
import { checkRange, checkIsInteger, checkNumberIsToFixed } from '@/utils/followup/followupUtils/checkField';
export default ($this) => {
return [
{
formType: 'input',
className: 'float-none',
prop: 'name',
model: 'name',
label: '姓名:',
disabled: false,
placeholder: '请输入姓名',
spanNum: 12,
maxlength: 30,
type: 'text',
labmsg: '次',
rules: [{required: true, message: '请输入姓名', trigger: ['submit','change']}],
},
{
formType: 'input',
className: 'float-none',
prop: 'no',
model: 'no',
label: '编号:',
disabled: false,
placeholder: '请输入编号',
spanNum: 12,
maxlength: 30,
type: 'text',
labmsg: '次',
rules: [{required: false, message: '请输入编号', trigger: ['submit','change']}],
},
{
formType: 'date-picker',
className: 'float-none',
prop: 'followupDate',
model: 'followupDate',
placeholder: '请选择',
label: '随访日期:',
format: 'yyyy-MM-dd',
valueFormat: 'yyyy-MM-dd',
dateType: 'date',
type: 'date',
rules: [{required: true, message: '请选择随访日期', trigger: ['submit','change']}],
spanNum: 12,
},
{
formType: 'radio',
className: 'obj-form-title',
prop: 'followupType',
model: 'followupType',
spanNum: 24,
label: '随访方式:',
options: [
{ label: '门诊', value: '门诊' },
{ label: '家庭', value: '家庭' },
{ label: '电话', value: '电话' },
],
rules: [{ required: true, message: '请选择随访方式', trigger: ['submit','change'] }],
changeFun: (e)=>{
}
},
]
}
import { checkRange, checkIsInteger, checkNumberIsToFixed } from '@/utils/followup/followupUtils/checkField';
export default ($this) => {
return [
{
formType: 'input',
className: 'float-none',
prop: 'helpCheck',
model: 'helpCheck',
disabled: false,
label: '辅助检查:',
placeholder: '请输入辅助检查',
spanNum: 12,
maxlength: 30,
type: 'text',
labmsg: '',
rules: [{ required: false, message: '请输入辅助检查', trigger: ['submit','change'] }]
},
{
formType: 'radio',
className: 'float-none',
prop: 'medicationObedience',
model: 'medicationObedience',
spanNum: 24,
label: '服药依从性:',
options: [
{ label: '规律', value: '规律' },
{ label: '间断', value: '间断' },
{ label: '不服药', value: '不服药' },
],
rules: [{ required: true, message: '请选择服药依从性', trigger: ['submit','change'] }],
changeFun: (e)=>{
}
},
{
formType: 'radio',
className: 'float-none',
prop: 'medicalSideEffects',
model: 'medicalSideEffects',
spanNum: 24,
label: '药物不良反应:',
options: [
{ label: '无', value: '无' },
{ label: '有', value: '有' },
],
rules: [{ required: true, message: '请选择有无药物不良反应', trigger: ['submit','change'] }],
changeFun: (e)=>{
}
},
{
formType: 'input',
className: 'float-none',
linkageRule: [{name: 'medicalSideEffects',value: ['有']}],
prop: 'adrsMark',
model: 'adrsMark',
disabled: false,
placeholder: '请输入药物不良反应',
spanNum: 12,
maxlength: 30,
type: 'text',
labmsg: '',
rules: [{ required: true, message: '请输入药物不良反应', trigger: ['submit','change'] }]
},
{
formType: 'radio',
className: 'float-none radio-block',
prop: 'followUpClassification',
model: 'followUpClassification',
spanNum: 24,
label: '此次随访分类:',
options: [
{ label: '控制满意(血压控制满意,无其他异常)', value: '控制满意(血压控制满意,无其他异常)' },
{ label: '控制不满意(血压控制不满意,无其他异常)', value: '控制不满意(血压控制不满意,无其他异常)' },
{ label: '不良反应(存在药物不良反应)', value: '不良反应(存在药物不良反应)' },
{ label: '并发症(出现新的并发症或并发症出现异常)', value: '并发症(出现新的并发症或并发症出现异常)' },
],
rules: [{ required: true, message: '请选择此次随访分类', trigger: ['submit','change'] }],
changeFun: (e)=>{
}
},
]
}
import { checkRange, checkIsInteger, checkNumberIsToFixed } from '@/utils/followup/followupUtils/checkField';
export default ($this) => {
return [
{
formType: 'input',
className: 'float-none',
prop: 'smokingAmount',
model: 'smokingAmount',
disabled: false,
label: '本次日吸烟量:',
placeholder: '请输入本次日吸烟量',
spanNum: 8,
maxlength: 30,
type: 'number',
labmsg: '',
slots: [{name: '支/日', type: 'append'}],
rules: [{ required: true, message: '请输入日吸烟量', trigger: ['submit','change','blur'] },{ validator: checkRange , trigger: ['submit','change','blur'] },{ validator: checkIsInteger , trigger: ['submit','change','blur'] }]
},
{
formType: 'input',
className: 'float-none',
prop: 'nextSmokingAmount',
model: 'nextSmokingAmount',
disabled: false,
label: '下次随访日吸烟量:',
placeholder: '请输入下次随访日吸烟量',
spanNum: 8,
maxlength: 30,
type: 'number',
labmsg: '',
slots: [{name: '支/日', type: 'append'}],
rules: [{ required: true, message: '请输入下次随访日吸烟量', trigger: ['submit','change'] },{ validator: checkRange , trigger: ['submit','change'] },{ validator: checkIsInteger , trigger: ['submit','change'] }]
},
{
formType: 'input',
className: 'float-none',
prop: 'alcoholConsumption',
model: 'alcoholConsumption',
disabled: false,
label: '本次日饮酒量:',
placeholder: '请输入本次日饮酒量',
spanNum: 8,
maxlength: 30,
type: 'number',
labmsg: '',
slots: [{name: '两/日', type: 'append'}],
rules: [{ required: true, message: '请输入本次日饮酒量', trigger: ['submit','change'] },{ validator: checkRange , trigger: ['submit','change'] },{ validator: checkIsInteger , trigger: ['submit','change'] }]
},
{
formType: 'input',
className: 'float-none',
prop: 'nextAlcoholConsumption',
model: 'nextAlcoholConsumption',
disabled: false,
label: '下次随访日饮酒量:',
placeholder: '请输入下次随访日饮酒量',
spanNum: 8,
maxlength: 30,
type: 'number',
labmsg: '',
slots: [{name: '两/日', type: 'append'}],
rules: [{ required: true, message: '请输入下次随访日饮酒量', trigger: ['submit','change'] },{ validator: checkRange , trigger: ['submit','change'] },{ validator: checkIsInteger , trigger: ['submit','change'] }]
},
{
formType: 'input',
className: 'float-none',
prop: 'workoutOfWeek',
model: 'workoutOfWeek',
disabled: false,
label: '本次运动情况:',
placeholder: '请输入本次运动情况',
spanNum: 8,
maxlength: 30,
type: 'number',
labmsg: '',
slots: [{name: '次/周', type: 'append'}],
rules: [{ required: true, message: '请输入本次运动情况', trigger: ['submit','change'] },{ validator: checkRange , trigger: ['submit','change'] },{ validator: checkIsInteger , trigger: ['submit','change'] }]
},
{
formType: 'input',
className: 'float-none',
prop: 'workoutDuration',
model: 'workoutDuration',
disabled: false,
placeholder: '请输入本次运动情况',
spanNum: 8,
maxlength: 30,
type: 'number',
labmsg: '',
slots: [{name: '分钟/次', type: 'append'}],
rules: [{ required: true, message: '请输入本次运动情况', trigger: ['submit','change'] },{ validator: checkRange , trigger: ['submit','change'] },{ validator: checkIsInteger , trigger: ['submit','change'] }]
},
{
formType: 'input',
className: 'float-none',
prop: 'nextWorkoutOfWeek',
model: 'nextWorkoutOfWeek',
disabled: false,
label: '下次随访运动情况:',
placeholder: '请输入下次随访运动情况',
spanNum: 8,
maxlength: 30,
type: 'number',
labmsg: '',
slots: [{name: '次/周', type: 'append'}],
rules: [{ required: true, message: '请输入下次随访运动情况', trigger: ['submit','change'] },{ validator: checkRange , trigger: ['submit','change'] },{ validator: checkIsInteger , trigger: ['submit','change'] }]
},
{
formType: 'input',
className: 'float-none',
prop: 'nextWorkoutDuration',
model: 'nextWorkoutDuration',
disabled: false,
placeholder: '请输入下次随访运动情况',
spanNum: 8,
maxlength: 30,
type: 'number',
labmsg: '',
slots: [{name: '分钟/次', type: 'append'}],
rules: [{ required: true, message: '请输入下次随访运动情况', trigger: ['submit','change'] },{ validator: checkRange , trigger: ['submit','change'] },{ validator: checkIsInteger , trigger: ['submit','change'] }]
},
{
formType: 'radio',
className: 'obj-form-title',
prop: 'saltIntake',
model: 'saltIntake',
spanNum: 24,
label: '目前摄盐情况(咸淡):',
options: [
{ label: '轻', value: '轻' },
{ label: '中', value: '中' },
{ label: '重', value: '重' },
],
rules: [{ required: true, message: '请选择目前摄盐情况', trigger: ['submit','change'] }],
changeFun: (e)=>{
}
},
{
formType: 'radio',
className: 'obj-form-title',
prop: 'nextSaltIntake',
model: 'nextSaltIntake',
spanNum: 24,
label: '下次随访摄盐情况(咸淡):',
options: [
{ label: '轻', value: '轻' },
{ label: '中', value: '中' },
{ label: '重', value: '重' },
],
rules: [{ required: true, message: '请选择下次随访摄盐情况', trigger: ['submit','change'] }],
changeFun: (e)=>{
}
},
{
formType: 'radio',
className: 'obj-form-title',
prop: 'psychologicalAdjustment',
model: 'psychologicalAdjustment',
spanNum: 24,
label: '心理调整:',
options: [
{ label: '良好', value: '良好' },
{ label: '一般', value: '一般' },
{ label: '差', value: '差' },
],
rules: [{ required: true, message: '请选择心理调整', trigger: ['submit','change'] }],
changeFun: (e)=>{
}
},
{
formType: 'radio',
className: 'obj-form-title',
prop: 'followMedicalPractive',
model: 'followMedicalPractive',
spanNum: 24,
label: '遵医行为:',
options: [
{ label: '良好', value: '良好' },
{ label: '一般', value: '一般' },
{ label: '差', value: '差' },
],
rules: [{ required: true, message: '请选择心里调整', trigger: ['submit','change'] }],
changeFun: (e)=>{
}
},
]
}
import { checkRange, checkIsInteger, checkNumberIsToFixed } from '@/utils/followup/followupUtils/checkField';
export default ($this) => {
let hanldeValue = () => {
$this.addComponents.forEach((item,index)=>{
if(item.name == 'hypeDataSourceMedicationUse'){
const medicinesName = item.formObject.medicinesName
const dosageDay = item.formObject.dosageDay
const dosageNum = item.formObject.dosageNum
item.dataSource.forEach((item2,index2)=>{
if((medicinesName||dosageDay||dosageNum) && item2.rules && item2.prop!='arrList' && item2.refs){
$this.addComponents[index].dataSource[index2].rules[0].required = true;
}else{
if(item2.refs){
$this.addComponents[index].dataSource[index2].rules[0].required = false;
$this.$nextTick(()=>{
$this.$refs['form' + index][0].clearValidate(['medicinesName','dosageDay','dosageNum']);
})
}
}
})
// $this.$refs['form'+index][0].validate((valid) => {
// });
}
})
}
return [
{
formType: 'list',
className: 'float-none',
arrList: [
],
prop: 'arrList',
model: 'arrList',
label: '',
disabled: true,
spanNum: 12,
rules: [{required: false, message: '', trigger: ['submit','change']}],
clickDeleteFunc: () => {
}
},
{
formType: 'button',
className: 'float-none',
prop: 'followUpOrgName',
model: 'followUpOrgName',
icon: 'el-icon-circle-plus',
btnText: '点击添加',
disabled: false,
spanNum: 12,
maxlength: 30,
type: 'text',
labmsg: '次',
clickFunc: () => {
$this.addComponents.forEach((item,index)=>{
if(item.name == 'hypeDataSourceMedicationUse'){
if($this.addComponents[index].formObject.arrList && $this.addComponents[index].formObject.arrList.length >= 3) {
$this.$message.warning('最多只可添加3种药物!')
}else {
$this.dialogFormVisible = true;
}
}
})
}
},
{
formType: 'div',
name: '其他药物',
className: 'sec-title',
},
{
formType: 'input',
className: 'float-none',
prop: 'medicinesName',
model: 'medicinesName',
refs:'medicinesName',
label: '其他药物名称:',
disabled: false,
placeholder: '请输入其他药物',
spanNum: 12,
maxlength: 30,
type: 'text',
labmsg: '次',
rules: [{required: false, message: '请输入其他药物', trigger: ['submit','change','blur']}],
changeFun: hanldeValue,
blurFunc: hanldeValue
},
{
formType: 'input',
className: 'float-none',
prop: 'dosageDay',
model: 'dosageDay',
refs:'dosageDay',
label: '其他药物用法:',
disabled: false,
placeholder: '请输入其他药物用法每日几次',
spanNum: 12,
maxlength: 30,
type: 'text',
slots: [{name: '次/日', type: 'append'}],
rules: [{required: false, message: '请输入其他药物用法每日几次', trigger: ['submit','change','blur']},{ validator: checkRange , trigger: ['submit','change','blur'] },{ validator: checkIsInteger , trigger: ['submit','change','blur'] }],
changeFun: hanldeValue,
blurFunc: hanldeValue
},
{
formType: 'input',
className: 'float-none',
prop: 'dosageNum',
model: 'dosageNum',
refs:'dosageNum',
label: '其他药物用量:',
disabled: false,
placeholder: '请输入其他药物每次用量',
spanNum: 12,
maxlength: 30,
type: 'text',
slots: [{name: '每次', type: 'append'}],
rules: [{required: false, message: '请输入其他药物每次用量', trigger: ['submit','change','blur']}],
changeFun: hanldeValue,
blurFunc: hanldeValue
},
]
}
export default ($this) => {
return [
{
formType: 'date-picker',
className: 'float-none',
prop: 'nextFollowDay',
model: 'nextFollowDay',
placeholder: '请选择',
label: '下次随访日期:',
format: 'yyyy-MM-dd',
valueFormat: 'yyyy-MM-dd',
dateType: 'date',
type: 'date',
rules: [{required: true, message: '请选择下次随访日期', trigger: ['submit','change']}],
spanNum: 12,
},
// {
// formType: 'input',
// className: 'float-none',
// prop: 'doctorSignature',
// model: 'doctorSignature',
// label: '随访医生签名:',
// disabled: false,
// placeholder: '请输入随访人员姓名',
// spanNum: 12,
// maxlength: 30,
// type: 'text',
// labmsg: '次',
// rules: [{required: true, message: '请输入随访医生签名', trigger: ['submit','change']}],
// },
]
}
import { checkRange, checkIsInteger, checkNumberIsToFixed } from '@/utils/followup/followupUtils/checkField';
export default ($this) => {
let hanldeValue = () => {
$this.addComponents.forEach((item,index)=>{
if(item.name == 'hypeDataSourceReferral'){
const reason = item.formObject.reason
const mechanism = item.formObject.mechanism
const department = item.formObject.department
item.dataSource.forEach((item2,index2)=>{
if((reason||mechanism||department) && item2.rules){
$this.addComponents[index].dataSource[index2].rules[0].required = true;
}else{
$this.addComponents[index].dataSource[index2].rules[0].required = false;
$this.$nextTick(()=>{
$this.$refs['form' + index][0].clearValidate(['reason','mechanism','department']);
})
}
})
// $this.$refs['form'+index][0].validate((valid) => {
// });
}
})
}
return [
{
formType: 'input',
className: 'float-none',
prop: 'reason',
model: 'reason',
refs:'reason',
label: '原因:',
disabled: false,
placeholder: '请输入原因',
spanNum: 12,
maxlength: 30,
type: 'text',
rules: [{required: false, message: '请输入原因', trigger: ['change','submit','blur']}],
changeFun: hanldeValue,
blurFunc: hanldeValue
},
{
formType: 'input',
className: 'float-none',
prop: 'mechanism',
model: 'mechanism',
refs:'mechanism',
label: '机构:',
disabled: false,
placeholder: '请输入机构',
spanNum: 12,
maxlength: 30,
type: 'text',
rules: [{required: false, message: '请输入机构', trigger: ['change','submit','blur']}],
changeFun: hanldeValue,
blurFunc: hanldeValue
},
{
formType: 'input',
className: 'float-none',
prop: 'department',
model: 'department',
refs:'department',
label: '科室类别:',
disabled: false,
placeholder: '请输入科室类别',
spanNum: 12,
maxlength: 30,
type: 'text',
rules: [{required: false, message: '请输入科室类别', trigger: ['change','submit','blur']}],
changeFun: hanldeValue,
blurFunc: hanldeValue
},
]
}
import { checkRange, checkIsInteger, checkNumberIsToFixed } from '@/utils/followup/followupUtils/checkField';
export default ($this) => {
return [
{
formType: 'input',
className: 'float-none',
prop: 'systolicBloodPressure',
model: 'systolicBloodPressure',
label: '收缩压SBP:',
disabled: false,
placeholder: '请输入',
spanNum: 8,
type: 'number',
labmsg: '次',
slots: [{name: 'mmHg', type: 'append'}],
rules: [{required: true, message: '请输入收缩压SBP', trigger: ['submit','change']},{ validator: checkRange , trigger: ['submit','change'] },{ validator: checkIsInteger , trigger: ['submit','change'] }],
},
{
formType: 'input',
className: 'float-none',
prop: 'diastolicBloodPressure',
model: 'diastolicBloodPressure',
label: '舒张压DBP:',
disabled: false,
placeholder: '请输入',
spanNum: 8,
type: 'number',
labmsg: '次',
slots: [{name: 'mmHg', type: 'append'}],
rules: [{required: true, message: '请输入舒张压DBP', trigger: ['submit','change']},{ validator: checkRange , trigger: ['submit','change'] },{ validator: checkIsInteger , trigger: ['submit','change'] }],
},
{
formType: 'input',
className: 'float-none',
prop: 'bodyHeight',
model: 'bodyHeight',
label: '身高:',
disabled: false,
placeholder: '请输入',
spanNum: 8,
type: 'number',
labmsg: '次',
slots: [{name: 'cm', type: 'append'}],
rules: [{required: true, message: '请输入身高', trigger: ['submit','change','blur']},{ validator: checkRange , trigger: ['submit','change','blur'] }, {validator: checkIsInteger , trigger: ['submit','change','blur']}],
changeFun: (val)=>{
$this.addComponents.forEach((item,index)=>{
if(item.name == 'hypeDataSourceSign'){
$this.addComponents[index].formObject.bodyHeight = val;
}
})
},
blurFunc: ()=>{
$this.addComponents.forEach((item,index)=>{
if(item.name == 'hypeDataSourceSign'){
let bodyWeight = $this.addComponents[index].formObject.bodyWeight
let bodyHeight = $this.addComponents[index].formObject.bodyHeight
if(bodyWeight && bodyHeight){
bodyWeight = parseFloat(bodyWeight);
bodyHeight = parseFloat(bodyHeight);
let bmi = (bodyWeight / Math.pow((bodyHeight/100),2)).toFixed(1);
$this.addComponents[index].formObject.bmi = bmi;
}
}
})
}
},
// 体质指数(BMI)=体重(kg)÷ 身高²(m)
{
formType: 'input',
className: 'float-none',
prop: 'bodyWeight',
model: 'bodyWeight',
label: '体重:',
disabled: false,
placeholder: '请输入(体重可以带1位小数点)',
spanNum: 8,
type: 'number',
labmsg: '次',
slots: [{name: 'kg', type: 'append'}],
rules: [{required: true, message: '请输入体重', trigger: ['submit','change']},{ validator: checkRange , trigger: ['submit','change'] }, {validator: checkNumberIsToFixed , trigger: ['submit','change']}],
changeFun: (val)=>{
$this.addComponents.forEach((item,index)=>{
if(item.name == 'hypeDataSourceSign'){
$this.addComponents[index].formObject.bodyWeight = val;
}
})
},
blurFunc: ()=>{
$this.addComponents.forEach((item,index)=>{
if(item.name == 'hypeDataSourceSign'){
let bodyWeight = $this.addComponents[index].formObject.bodyWeight
let bodyHeight = $this.addComponents[index].formObject.bodyHeight
if(bodyWeight && bodyHeight){
bodyWeight = parseFloat(bodyWeight);
bodyHeight = parseFloat(bodyHeight);
let bmi = (bodyWeight / Math.pow((bodyHeight/100),2)).toFixed(1);
$this.addComponents[index].formObject.bmi = bmi;
}
}
})
}
},
{
formType: 'input',
className: 'float-none',
prop: 'bmi',
model: 'bmi',
label: 'BMI(系统自动生成):',
disabled: true,
placeholder: '(这里是自动计算所得)',
spanNum: 8,
type: 'number',
labmsg: '次',
slots: [{name: 'kg/m^2', type: 'append'}],
},
{
formType: 'input',
className: 'float-none',
prop: 'nextBodyWeight',
model: 'nextBodyWeight',
label: '下次随访体重:',
disabled: false,
placeholder: '请输入(体重可以带1位小数点)',
spanNum: 8,
type: 'number',
labmsg: '次',
slots: [{name: 'kg', type: 'append'}],
rules: [{required: true, message: '请输入下次随访体重', trigger: ['submit','change']},{ validator: checkRange , trigger: ['submit','change'] }, {validator: checkNumberIsToFixed , trigger: ['submit','change']}],
changeFun: (val)=>{
$this.addComponents.forEach((item,index)=>{
if(item.name == 'hypeDataSourceSign'){
$this.addComponents[index].formObject.nextBodyWeight = val;
}
})
},
blurFunc: ()=>{
$this.addComponents.forEach((item,index)=>{
if(item.name == 'hypeDataSourceSign'){
let nextBodyWeight = $this.addComponents[index].formObject.nextBodyWeight
let bodyHeight = $this.addComponents[index].formObject.bodyHeight
if(nextBodyWeight && bodyHeight){
nextBodyWeight = parseFloat(nextBodyWeight);
bodyHeight = parseFloat(bodyHeight);
let nextBmi = (nextBodyWeight / Math.pow((bodyHeight/100),2)).toFixed(1);
$this.addComponents[index].formObject.nextBmi = nextBmi;
}
}
})
}
},
{
formType: 'input',
className: 'float-none',
prop: 'nextBmi',
model: 'nextBmi',
label: '下次随访BMI(系统自动生成):',
disabled: true,
placeholder: '(这里是自动计算所得)',
spanNum: 8,
type: 'number',
labmsg: '次',
slots: [{name: 'kg/m^2', type: 'append'}],
},
{
formType: 'input',
className: 'float-none',
prop: 'heartRate',
model: 'heartRate',
label: '心率:',
disabled: false,
placeholder: '请输入',
spanNum: 8,
type: 'number',
labmsg: '次',
slots: [{name: '次/分钟', type: 'append'}],
rules: [{required: true, message: '请输入心率', trigger: ['submit','change']},{ validator: checkRange , trigger: ['submit','change'] },{ validator: checkIsInteger , trigger: ['submit','change'] }],
},
{
formType: 'input',
className: 'float-none',
prop: 'remark',
model: 'remark',
disabled: false,
label: '其他',
placeholder: '请输入其他体征',
spanNum: 12,
maxlength: 30,
type: 'text',
labmsg: '',
rules: [{ required: false, message: '请输入其他体征', trigger: ['submit','change'] }]
},
]
}
import { checkMobile } from '@/utils/followup/followupUtils/checkField';
export default ($this) => {
return [
{
formType: 'radio',
className: 'obj-form-title',
prop: 'hasSymptom',
model: 'hasSymptom',
label: '是否有症状:',
disabled: false,
spanNum: 24,
options: [
{ label: '无', value: '无', disabled: false },
{ label: '有', value: '有', disabled: false },
],
rules: [{ required: true, message: '请选择是否有症状', trigger: ['submit','change'] }],
changeFun: (e) => {
if(e == '有') {
$this.addComponents.forEach((item,index)=>{
if(item.name == 'hypeDataSourceSymptom'){
$this.addComponents[index].formObject = {
...$this.addComponents[index].formObject,
symptom: []
}
}
})
}
}
},
{
formType: 'checkbox',
className: 'float-none obj-form-title2',
linkageRule: [{name: 'hasSymptom', value: ['有']}],
prop: 'symptom',
model: 'symptom',
label: '症状类型:',
disabled: false,
changeFun: (val) => {
},
spanNum: 24,
options: [
// {label: '无症状', value: '无症状', disabled: false},
{label: '头痛头晕', value: '头痛头晕', disabled: false},
{label: '恶心呕吐', value: '恶心呕吐', disabled: false},
{label: '眼花耳鸣', value: '眼花耳鸣', disabled: false},
{label: '呼吸困难', value: '呼吸困难', disabled: false},
{label: '心悸胸闷', value: '心悸胸闷', disabled: false},
{label: '鼻衄出血不止', value: '鼻衄出血不止', disabled: false},
{label: '四肢发麻', value: '四肢发麻', disabled: false},
{label: '下肢水肿', value: '下肢水肿', disabled: false},
{label: '其他', value: '其他', disabled: false},
],
rules: [{required: true, message: '选择的症状', trigger: ['submit']}]
},
{
formType: 'input',
className: 'float-none obj-form-title3',
linkageRule: [{name: 'symptom',value: ['其他']}],
prop: 'remark',
model: 'remark',
disabled: false,
placeholder: '请输入其他症状',
spanNum: 12,
maxlength: 30,
type: 'text',
labmsg: '',
rules: [{ required: true, message: '请输入其他症状', trigger: ['submit','change'] }]
},
]
}
import { checkCardNum } from '@/utils/followup/followupUtils/checkCardNum';
export default ($this) => {
return [
{
formType: 'div',
name: '1.1 人口学信息',
className: 'sec-title',
},
{
formType: 'input',
className: 'float-none margin-left-20',
prop: 'name',
model: 'name',
label: '姓名:',
disabled: false,
placeholder: '请输入姓名',
spanNum: 12,
maxlength: 30,
type: 'text',
labmsg: '次',
rules: [{required: true, message: '请输入姓名', trigger: ['submit','change']}],
},
{
formType: 'input',
className: 'float-none margin-left-20',
prop: 'idNo',
model: 'idNo',
label: '身份证:',
disabled: false,
placeholder: '请输入身份证',
spanNum: 12,
maxlength: 30,
type: 'text',
labmsg: '次',
rules: [{required: true, message: '请输入身份证', trigger: ['submit','change']},{ validator: checkCardNum , trigger: ['submit','change'] }],
},
{
formType: 'radio',
className: 'obj-form-title margin-left-20',
prop: 'inTurn',
model: 'inTurn',
spanNum: 24,
label: '随访轮次(距离建档时间):',
options: [
{ label: '6个月', value: '6个月' },
{ label: '12个月', value: '12个月' },
],
rules: [{ required: true, message: '请选择随访轮次', trigger: ['submit','change'] }],
changeFun: (e)=>{
// console.log(e)
// if(e == '12个月'){
// $this.needRule = false;
// sessionStorage.setItem('needRule',false);
// }else{
// $this.needRule = true;
// sessionStorage.setItem('needRule',true);
// }
$this.addComponents.forEach((item,index)=>{
if(item.name == 'CheckBody'){
item.dataSource.forEach((item2,index2)=>{
if(e == '12个月'){
$this.needRule = false;
}else{
$this.needRule = true;
}
sessionStorage.setItem('needRule',$this.needRule);
if(item2.rules){
$this.addComponents[index].dataSource[index2].rules[0].required = !$this.needRule;
}
})
}
})
}
},
]
}
import { checkMobile } from '@/utils/followup/followupUtils/checkField';
export default ($this) => {
return [
{
formType: 'input',
className: 'float-none',
prop: 'followUpOrgName',
model: 'followUpOrgName',
label: '随访单位名称:',
disabled: false,
placeholder: '请输入随访单位名称',
spanNum: 12,
maxlength: 30,
type: 'text',
labmsg: '次',
rules: [{required: true, message: '请输入随访单位名称', trigger: ['submit','change']}],
},
{
formType: 'input',
className: 'float-none',
prop: 'followUpUser',
model: 'followUpUser',
label: '随访人员姓名:',
disabled: false,
placeholder: '请输入随访人员姓名',
spanNum: 12,
maxlength: 30,
type: 'text',
labmsg: '次',
rules: [{required: true, message: '请输入随访人员姓名', trigger: ['submit','change']}],
},
{
formType: 'input',
className: 'float-none',
prop: 'followUpMobile',
model: 'followUpMobile',
label: '随访人员联系电话:',
disabled: false,
placeholder: '请输入随访人员联系电话',
spanNum: 12,
maxlength: 11,
type: 'tel',
labmsg: '次',
rules: [{required: true, message: '请输入随访人员联系电话', trigger: ['submit','change']},{ validator: checkMobile , trigger: ['submit','change'] }],
},
{
formType: 'date-picker',
className: 'float-none',
prop: 'surveyTime',
model: 'surveyTime',
placeholder: '请选择',
label: '本次调查时间:',
format: 'yyyy-MM-dd',
valueFormat: 'yyyy-MM-dd',
dateType: 'date',
type: 'date',
rules: [{required: true, message: '请选择本次调查时间', trigger: ['submit','change']}],
spanNum: 12,
},
]
}
export default ($this) => {
return [
{
formType: 'div',
name: '1.2 调查时状态',
className: 'sec-title',
},
{
formType: 'radio',
className: 'obj-form-title margin-left-20',
prop: 'investigationState',
model: 'investigationState',
spanNum: 24,
label: '调查时状态:',
options: [
{ label: '接受调查', value: '接受调查' },
{ label: '失访', value: '失访' },
{ label: '死亡', value: '死亡' }
],
rules: [{ required: true, message: '请选择调查时状态', trigger: ['submit','change'] }],
changeFun: (e)=>{
// console.log(e)
if(e == '失访' || e=='死亡'){
$this.showModule = false;
}else{
$this.showModule = true;
}
}
},
{
formType: 'radio',
className: 'obj-form-title2 margin-left-40',
prop: 'investigationWay',
model: 'investigationWay',
label: '调查方式:',
linkageRule: [{ name: 'investigationState', value: ['接受调查'] }],
disabled: false,
placeholder: '150',
spanNum: 24,
options: [
{ label: '面对面', value: '面对面', disabled: false },
{ label: '电话(限中危人群,高危人群6个月随访)', value: '电话(限中危人群,高危人群6个月随访)', disabled: false },
],
rules: [{ required: true, message: '请选择调查方式', trigger: ['submit','change'] }]
},
{
formType: 'radio',
className: 'obj-form-title2 margin-left-40',
prop: 'oneself',
model: 'oneself',
label: '本次调查是否为被调查者本人:',
linkageRule: [{ name: 'investigationState', value: ['接受调查'] }],
disabled: false,
placeholder: '150',
spanNum: 24,
options: [
{ label: '是', value: '是', disabled: false },
{ label: '否', value: '否', disabled: false },
],
rules: [{ required: true, message: '请选择本次调查是否为被调查者本人', trigger: ['submit','change'] }]
},
{
formType: 'radio',
className: 'obj-form-title3 margin-left-60',
prop: 'relationship',
model: 'relationship',
label: '提供信息者与被调查者之间关系:',
linkageRule: [{ name: 'oneself', value: ['否'] }],
disabled: false,
placeholder: '150',
spanNum: 24,
options: [
{ label: '父母', value: '父母', disabled: false },
{ label: '配偶', value: '配偶', disabled: false },
{ label: '子女', value: '子女', disabled: false },
{ label: '兄弟姐妹', value: '兄弟姐妹', disabled: false },
{ label: '其他', value: '其他', disabled: false },
],
rules: [{ required: true, message: '请选择提供信息者与被调查者之间关系', trigger: ['submit','change'] }]
},
{
formType: 'input',
className: 'obj-form-title4 margin-left-80',
linkageRule: [{name: 'relationship',value: ['其他']}],
prop: 'relationshipRemark',
model: 'relationshipRemark',
disabled: false,
placeholder: '请输入其他关系',
spanNum: 12,
maxlength: 30,
type: 'text',
labmsg: '',
rules: [{ required: true, message: '请输入其他关系', trigger: ['submit','change'] }]
},
{
formType: 'radio',
className: 'obj-form-title3 margin-left-60',
prop: 'lossReason',
model: 'lossReason',
spanNum: 24,
label: '失访原因:',
linkageRule: [{ name: 'investigationState', value: ['失访'] }],
options: [
{ label: '失去联系', value: '失去联系' },
{ label: '拒绝参加调查', value: '拒绝参加调查' },
{ label: '其他', value: '其他' }
],
rules: [{ required: true, message: '请选择失访原因', trigger: ['submit','change'] }]
},
{
formType: 'input',
className: 'obj-form-title3 margin-left-60',
linkageRule: [{name: 'lossReason',value: ['其他']}],
prop: 'lossRemark',
model: 'lossRemark',
disabled: false,
placeholder: '请输入其他失访原因',
spanNum: 12,
maxlength: 30,
type: 'text',
labmsg: '',
rules: [{ required: true, message: '请输入其他失访原因', trigger: ['submit','change'] }]
},
{
formType: 'date-picker',
className: 'obj-form-title2 margin-left-40',
prop: 'deadTime',
model: 'deadTime',
placeholder: '选择死亡时间',
label: '死亡时间:',
linkageRule: [{ name: 'investigationState', value: ['死亡'] }],
format: 'yyyy-MM-dd HH:mm',
valueFormat: 'yyyy-MM-dd HH:mm',
dateType: 'datetime',
type: 'date',
spanNum: 12,
rules: [{ required: true, message: '请选择死亡时间', trigger: ['submit','change'] }]
},
{
formType: 'radio',
className: 'obj-form-title2 margin-left-40',
prop: 'causeOfDeath',
model: 'causeOfDeath',
label: '死亡原因:',
linkageRule: [{ name: 'investigationState', value: ['死亡'] }],
disabled: false,
placeholder: '150',
spanNum: 24,
options: [
{ label: '脑卒中', value: '脑卒中', disabled: false },
{ label: '冠心病', value: '冠心病', disabled: false },
{ label: '恶性肿瘤', value: '恶性肿瘤', disabled: false },
{ label: '呼吸系统疾病', value: '呼吸系统疾病', disabled: false },
{ label: '损伤和中毒', value: '损伤和中毒', disabled: false },
{ label: '不祥', value: '不祥', disabled: false },
{ label: '其他', value: '其他', disabled: false },
],
rules: [{ required: true, message: '请选择死亡原因', trigger: ['submit','change'] }]
},
{
formType: 'radio',
className: 'obj-form-title3 margin-left-60',
prop: 'deadStrokeRemark',
model: 'deadStrokeRemark',
label: '脑卒中类型:',
linkageRule: [{ name: 'causeOfDeath', value: ['脑卒中'] }],
disabled: false,
placeholder: '150',
spanNum: 24,
options: [
{ label: '出血性脑卒中', value: '出血性脑卒中', disabled: false },
{ label: '缺血性脑卒中', value: '缺血性脑卒中', disabled: false },
{ label: '不祥', value: '不祥', disabled: false },
],
rules: [{ required: true, message: '请选择脑卒中类型', trigger: ['submit','change'] }]
},
{
formType: 'input',
className: 'obj-form-title3 margin-left-60',
linkageRule: [{name: 'causeOfDeath',value: ['其他']}],
prop: 'deadRemark',
model: 'deadRemark',
disabled: false,
placeholder: '请输入其他死亡原因',
spanNum: 12,
maxlength: 30,
type: 'text',
labmsg: '',
rules: [{ required: true, message: '请输入其他死亡原因', trigger: ['submit','change'] }]
},
]
}
import { checkRange, checkIsInteger, checkNumberIsToFixed } from '@/utils/followup/followupUtils/checkField';
export default ($this) => {
return [
{
formType: 'div',
name: '5.1 一般体征',
className: 'sec-title',
},
{
formType: 'date-picker',
className: 'float-none',
prop: 'inspectTime',
model: 'inspectTime',
placeholder: '请选择',
label: '检查时间:',
format: 'yyyy-MM-dd',
valueFormat: 'yyyy-MM-dd',
dateType: 'date',
type: 'date',
rules: [{required: false, message: '请选择检查时间', trigger: ['submit','change']}],
spanNum: 6,
},
{
formType: 'input',
className: 'float-none',
prop: 'stature',
model: 'stature',
label: '身高:',
disabled: false,
placeholder: '请输入',
spanNum: 6,
type: 'number',
labmsg: '次',
slots: [{name: 'cm', type: 'append'}],
rules: [{required: false, message: '请输入身高', trigger: ['submit','change']},{ validator: checkRange , trigger: ['submit','change'] }, {validator: checkNumberIsToFixed , trigger: ['submit','change']}],
changeFun: (val)=>{
$this.addComponents.forEach((item,index)=>{
if(item.formName == 'stroke_014'){
$this.addComponents[index].formObject.stature = val;
}
})
},
blurFunc: (val)=>{
$this.addComponents.forEach((item,index)=>{
if(item.formName == 'stroke_014'){
let weight = $this.addComponents[index].formObject.weight
let stature = $this.addComponents[index].formObject.stature
if(weight && stature){
weight = parseFloat(weight);
stature = parseFloat(stature);
let bmi = (weight / Math.pow((stature/100),2)).toFixed(1);
$this.addComponents[index].formObject.bmi = bmi;
}
}
})
}
},
// 体质指数(BMI)=体重(kg)÷ 身高²(m)
{
formType: 'input',
className: 'float-none',
prop: 'weight',
model: 'weight',
label: '体重:',
disabled: false,
placeholder: '请输入(体重可以带1位小数点)',
spanNum: 6,
type: 'number',
labmsg: '次',
slots: [{name: 'kg', type: 'append'}],
rules: [{required: false, message: '请输入体重', trigger: ['submit','change']},{ validator: checkRange , trigger: ['submit','change'] }, {validator: checkNumberIsToFixed , trigger: ['submit','change']}],
changeFun: (val)=>{
$this.addComponents.forEach((item,index)=>{
if(item.formName == 'stroke_014'){
$this.addComponents[index].formObject.weight = val;
}
})
},
blurFunc: (val)=>{
$this.addComponents.forEach((item,index)=>{
if(item.formName == 'stroke_014'){
let weight = $this.addComponents[index].formObject.weight
let stature = $this.addComponents[index].formObject.stature
if(weight && stature){
weight = parseFloat(weight);
stature = parseFloat(stature);
let bmi = (weight / Math.pow((stature/100),2)).toFixed(1);
$this.addComponents[index].formObject.bmi = bmi;
}
}
})
}
},
{
formType: 'input',
className: 'float-none',
prop: 'bmi',
model: 'bmi',
label: 'BMI(系统自动生成):',
disabled: true,
placeholder: '(这里是自动计算所得)',
spanNum: 6,
type: 'number',
labmsg: '次',
slots: [{name: 'kg/m^2', type: 'append'}],
},
{
formType: 'input',
className: 'float-none',
prop: 'waistline',
model: 'waistline',
label: '腰围:',
disabled: false,
placeholder: '请输入',
spanNum: 6,
type: 'number',
labmsg: '次',
slots: [{name: 'cm', type: 'append'}],
rules: [{required: false, message: '请输入腰围', trigger: ['submit','change']},{ validator: checkRange , trigger: ['submit','change'] }, {validator: checkNumberIsToFixed , trigger: ['submit','change']}],
},
{
formType: 'div',
name: '5.2 血压(同侧,测量2次)',
className: 'sec-title',
},
{
formType: 'date-picker',
className: 'float-none',
prop: 'measureTime',
model: 'measureTime',
placeholder: '请选择',
label: '测量时间:',
format: 'yyyy-MM-dd',
valueFormat: 'yyyy-MM-dd',
dateType: 'date',
type: 'date',
rules: [{required: false, message: '请选择测量时间', trigger: ['submit','change']}],
spanNum: 6,
},
{
formType: 'div',
name: '第一次',
className: 'third-title',
},
{
formType: 'input',
className: 'float-none',
prop: 'firstSystolicPressure',
model: 'firstSystolicPressure',
label: '收缩压SBP:',
disabled: false,
placeholder: '请输入',
spanNum: 6,
type: 'number',
labmsg: '次',
slots: [{name: 'mmHg', type: 'append'}],
rules: [{required: false, message: '请输入收缩压SBP', trigger: ['submit','change']},{ validator: checkRange , trigger: ['submit','change'] },{ validator: checkIsInteger , trigger: ['submit','change'] }],
},
{
formType: 'input',
className: 'float-none',
prop: 'firstDiastolicPressure',
model: 'firstDiastolicPressure',
label: '舒张压DBP:',
disabled: false,
placeholder: '请输入',
spanNum: 6,
type: 'number',
labmsg: '次',
slots: [{name: 'mmHg', type: 'append'}],
rules: [{required: false, message: '请输入舒张压DBP', trigger: ['submit','change']},{ validator: checkRange , trigger: ['submit','change'] },{ validator: checkIsInteger , trigger: ['submit','change'] }],
},
{
formType: 'input',
className: 'float-none',
prop: 'firstPulse',
model: 'firstPulse',
label: '脉搏:',
disabled: false,
placeholder: '请输入',
spanNum: 6,
type: 'number',
labmsg: '次',
slots: [{name: '次/分', type: 'append'}],
rules: [{required: false, message: '请输入脉搏', trigger: ['submit','change']},{ validator: checkRange , trigger: ['submit','change'] },{ validator: checkIsInteger , trigger: ['submit','change'] }],
},
{
formType: 'div',
name: '第二次',
className: 'third-title',
},
{
formType: 'input',
className: 'float-none',
prop: 'secondSystolicPressure',
model: 'secondSystolicPressure',
label: '收缩压SBP:',
disabled: false,
placeholder: '请输入',
spanNum: 6,
type: 'number',
labmsg: '次',
slots: [{name: 'mmHg', type: 'append'}],
rules: [{required: false, message: '请输入收缩压SBP', trigger: ['submit','change']},{ validator: checkRange , trigger: ['submit','change'] },{ validator: checkIsInteger , trigger: ['submit','change'] }],
},
{
formType: 'input',
className: 'float-none',
prop: 'secondDiastolicPressure',
model: 'secondDiastolicPressure',
label: '舒张压DBP:',
disabled: false,
placeholder: '请输入',
spanNum: 6,
type: 'number',
labmsg: '次',
slots: [{name: 'mmHg', type: 'append'}],
rules: [{required: false, message: '请输入舒张压DBP', trigger: ['submit','change']},{ validator: checkRange , trigger: ['submit','change'] },{ validator: checkIsInteger , trigger: ['submit','change'] }],
},
{
formType: 'input',
className: 'float-none',
prop: 'secondPulse',
model: 'secondPulse',
label: '脉搏:',
disabled: false,
placeholder: '请输入',
spanNum: 6,
type: 'number',
labmsg: '次',
slots: [{name: '次/分', type: 'append'}],
rules: [{required: false, message: '请输入脉搏', trigger: ['submit','change']},{ validator: checkRange , trigger: ['submit','change'] },{ validator: checkIsInteger , trigger: ['submit','change'] }],
},
{
formType: 'div',
name: '5.3 心脏听诊',
className: 'sec-title',
},
{
formType: 'date-picker',
className: 'float-none',
prop: 'inspectTime1',
model: 'inspectTime1',
placeholder: '请选择',
label: '测量时间:',
format: 'yyyy-MM-dd',
valueFormat: 'yyyy-MM-dd',
dateType: 'date',
type: 'date',
rules: [{required: false, message: '请选择测量时间', trigger: ['submit','change']}],
spanNum: 6,
},
{
formType: 'radio',
className: 'float-none',
prop: 'cardiacMurmur',
model: 'cardiacMurmur',
label: '心脏杂音:',
disabled: false,
spanNum: 6,
options: [
{label: '无', value: '无', disabled: false},
{label: '有', value: '有', disabled: false},
],
rules: [{required: false, message: '请选择心脏杂音', trigger: ['submit','change']}]
},
{
formType: 'radio',
className: 'float-none',
prop: 'heartRhythm',
model: 'heartRhythm',
label: '心律',
disabled: false,
spanNum: 6,
options: [
{label: '整齐', value: '整齐', disabled: false},
{label: '不齐', value: '不齐', disabled: false},
],
rules: [{required: false, message: '请选择心律', trigger: ['submit','change']}]
},
]
}
import { checkRange } from '@/utils/followup/followupUtils/checkField';
export default ($this) => {
return [
{
formType: 'div',
name: '6.1 血糖',
className: 'sec-title',
},
{
formType: 'date-picker',
className: 'float-none',
prop: 'inspectTime',
model: 'inspectTime',
placeholder: '请选择',
label: '检查时间:',
format: 'yyyy-MM-dd',
valueFormat: 'yyyy-MM-dd',
dateType: 'date',
type: 'date',
rules: [{required: false, message: '请选择检查时间', trigger: ['submit','change']}],
spanNum: 6,
},
{
formType: 'input',
className: 'float-none',
prop: 'fastingBloodGlucose',
model: 'fastingBloodGlucose',
label: '空腹血糖:',
disabled: false,
placeholder: '请输入',
spanNum: 6,
type: 'number',
labmsg: '次',
slots: [{name: 'mmol/L', type: 'append'}],
rules: [{required: false, message: '请输入空腹血糖', trigger: ['submit','change']},{ validator: checkRange , trigger: ['submit','change'] }],
},
{
formType: 'div',
name: '6.2 血脂',
className: 'sec-title',
},
{
formType: 'date-picker',
className: 'float-none',
prop: 'inspectTime1',
model: 'inspectTime1',
placeholder: '请选择',
label: '检查时间:',
format: 'yyyy-MM-dd',
valueFormat: 'yyyy-MM-dd',
dateType: 'date',
type: 'date',
rules: [{required: false, message: '请选择检查时间', trigger: ['submit','change']}],
spanNum: 6,
},
{
formType: 'input',
className: 'float-none',
prop: 'triglyceride',
model: 'triglyceride',
label: '甘油三酯:',
disabled: false,
placeholder: '请输入',
spanNum: 6,
type: 'number',
labmsg: '次',
slots: [{name: 'mmol/L', type: 'append'}],
rules: [{required: false, message: '请输入甘油三酯', trigger: ['submit','change']},{ validator: checkRange , trigger: ['submit','change'] }],
},
{
formType: 'input',
className: 'float-none',
prop: 'cholesterol',
model: 'cholesterol',
label: '胆固醇:',
disabled: false,
placeholder: '请输入',
spanNum: 6,
type: 'number',
labmsg: '次',
slots: [{name: 'mmol/L', type: 'append'}],
rules: [{required: false, message: '请输入胆固醇', trigger: ['submit','change']},{ validator: checkRange , trigger: ['submit','change'] }],
},
{
formType: 'input',
className: 'float-none',
prop: 'cLdl',
model: 'cLdl',
label: '低密度脂蛋白胆固醇:',
disabled: false,
placeholder: '请输入',
spanNum: 6,
type: 'number',
labmsg: '次',
slots: [{name: 'mmol/L', type: 'append'}],
rules: [{required: false, message: '请输入低密度脂蛋白胆固醇', trigger: ['submit','change']},{ validator: checkRange , trigger: ['submit','change'] }],
},
{
formType: 'input',
className: 'float-none',
prop: 'cHdl',
model: 'cHdl',
label: '高密度脂蛋白胆固醇',
disabled: false,
placeholder: '请输入',
spanNum: 6,
type: 'number',
labmsg: '次',
slots: [{name: 'mmol/L', type: 'append'}],
rules: [{required: false, message: '请输入高密度脂蛋白胆固醇', trigger: ['submit','change']},{ validator: checkRange , trigger: ['submit','change'] }],
},
]
}
export default ($this) => {
return [
{
formType: 'radio',
className: 'obj-form-title',
prop: 'sportState',
model: 'sportState',
label: '运动:',
disabled: false,
placeholder: '150',
spanNum: 24,
options: [
{label: '经常运动(相当于快步走的中等强度运动,且每周≥3次、每次≥30分钟,包含中度、重度体力劳动者)', value: '经常运动(相当于快步走的中等强度运动,且每周≥3次、每次≥30分钟,包含中度、重度体力劳动者)', disabled: false},
{label: '缺乏运动(不符合上述经常运动标准者)', value: '缺乏运动(不符合上述经常运动标准者)', disabled: false},
],
rules: [{required: true, message: '请选择是否运动', trigger: ['submit','change']}]
},
{
formType: 'radio',
className: 'obj-form-title',
prop: 'haveSmoke',
model: 'haveSmoke',
label: '吸烟:',
disabled: false,
placeholder: '150',
spanNum: 24,
options: [
{label: '否', value: '否', disabled: false},
{label: '是', value: '是', disabled: false},
],
rules: [{required: true, message: '请选择是否吸烟', trigger: ['submit','change']}]
},
{
formType: 'radio',
className: 'obj-form-title',
prop: 'drinkWine',
model: 'drinkWine',
label: '饮酒:',
disabled: false,
placeholder: '150',
spanNum: 24,
options: [
{label: '不饮酒', value: '不饮酒', disabled: false},
{label: '少量饮酒', value: '少量饮酒', disabled: false},
{label: '经常大量饮酒(白酒≥3次/周,每次≥2两)', value: '经常大量饮酒(白酒≥3次/周,每次≥2两)', disabled: false},
],
rules: [{required: true, message: '请选择是否饮酒', trigger: ['submit','change']}]
},
{
formType: 'radio',
className: 'obj-form-title',
prop: 'saltInFood',
model: 'saltInFood',
label: '口味:',
disabled: false,
placeholder: '150',
spanNum: 24,
options: [
{label: '偏咸', value: '偏咸', disabled: false},
{label: '偏淡', value: '偏淡', disabled: false},
{label: '适中', value: '适中', disabled: false},
],
rules: [{required: true, message: '请选择口味', trigger: ['submit','change']}]
},
{
formType: 'radio',
className: 'obj-form-title',
prop: 'meatInFood',
model: 'meatInFood',
label: '荤素:',
disabled: false,
placeholder: '150',
spanNum: 24,
options: [
{label: '偏荤', value: '偏荤', disabled: false},
{label: '偏素', value: '偏素', disabled: false},
{label: '均衡', value: '均衡', disabled: false},
],
rules: [{required: true, message: '请选择荤素', trigger: ['submit','change']}]
},
{
formType: 'radio',
className: 'obj-form-title',
prop: 'vegetablesInFood',
model: 'vegetablesInFood',
label: '吃蔬菜(每日食用6两蔬菜):',
disabled: false,
placeholder: '150',
spanNum: 24,
options: [
{label: '≥5天/周', value: '≥5天/周', disabled: false},
{label: '3-4天/周', value: '3-4天/周', disabled: false},
{label: '≤2天/周', value: '≤2天/周', disabled: false},
],
rules: [{required: true, message: '请选择是否吃蔬菜', trigger: ['submit','change']}]
},
{
formType: 'radio',
className: 'obj-form-title',
prop: 'fruitsInFood',
model: 'fruitsInFood',
label: '吃水果(每日食用4两水果):',
disabled: false,
placeholder: '150',
spanNum: 24,
options: [
{label: '≥5天/周', value: '≥5天/周', disabled: false},
{label: '3-4天/周', value: '3-4天/周', disabled: false},
{label: '≤2天/周', value: '≤2天/周', disabled: false},
],
rules: [{required: true, message: '请选择是否吃水果', trigger: ['submit','change']}]
},
]
}
import { checkNormalInt } from '@/utils/followup/followupUtils/checkField';
export default ($this) => {
return [
{
formType: 'div',
name: '3.1 脑血管病',
className: 'sec-title',
},
{
formType: 'radio',
className: 'obj-form-title',
prop: 'diseasedHappened',
model: 'diseasedHappened',
label: '随访期间有无新发脑血管病事件:',
disabled: false,
spanNum: 24,
options: [
{ label: '无', value: '无', disabled: false },
{ label: '有', value: '有', disabled: false },
],
rules: [{ required: true, message: '请选择随访期间有无新发脑血管病事件', trigger: ['submit','change'] }]
},
{
formType: 'input',
className: 'obj-form-title2',
linkageRule: [{name: 'diseasedHappened',value: ['有']}],
prop: 'times',
model: 'times',
label: '发病次数:',
disabled: false,
placeholder: '请输入发病次数',
spanNum: 6,
type: 'number',
labmsg: '次',
slots: [{ name: '次', type: 'append' }],
rules: [{ required: true, message: '请输入发病次数', trigger: ['submit','change'] }, { validator: checkNormalInt , trigger: ['submit','change'] }]
},
{
formType: 'date-picker',
className: 'obj-form-title2',
prop: 'firstTime',
model: 'firstTime',
placeholder: '请选择',
label: '随访期间第一次发病时间:',
linkageRule: [{ name: 'diseasedHappened', value: ['有'] }],
format: 'yyyy',
valueFormat: 'yyyy',
dateType: 'year',
type: 'date',
rules: [{ required: true, message: '请选择随访期间第一次发病时间', trigger: ['submit','change'] }],
spanNum: 12,
},
{
formType: 'radio',
className: 'obj-form-title2',
prop: 'hospitalLevel',
model: 'hospitalLevel',
label: '就诊机构级别:',
linkageRule: [{ name: 'diseasedHappened', value: ['有'] }],
disabled: false,
spanNum: 24,
options: [
{ label: '省级医院', value: '省级医院', disabled: false },
{ label: '地市级医院', value: '地市级医院', disabled: false },
{ label: '县级医院', value: '县级医院', disabled: false },
{ label: '社区或乡镇卫生机构', value: '社区或乡镇卫生机构', disabled: false },
],
rules: [{ required: true, message: '请选择就诊机构级别', trigger: ['submit','change'] }]
},
{
formType: 'radio',
className: 'obj-form-title2',
prop: 'mainDiagnosis',
model: 'mainDiagnosis',
label: '主要诊断:',
linkageRule: [{ name: 'diseasedHappened', value: ['有'] }],
disabled: false,
spanNum: 24,
options: [
{ label: '脑梗死', value: '脑梗死', disabled: false },
{ label: '脑出血', value: '脑出血', disabled: false },
{ label: '蛛网膜下腔出血', value: '蛛网膜下腔出血', disabled: false },
{ label: '短暂性脑缺血发作(TIA)', value: '短暂性脑缺血发作(TIA)', disabled: false },
],
rules: [{ required: true, message: '请选择主要诊断', trigger: ['submit','change'] }]
},
{
formType: 'radio',
className: 'obj-form-title2',
prop: 'beHospitalizedRecureTreat',
model: 'beHospitalizedRecureTreat',
label: '住院期间是否接受康复治疗:',
linkageRule: [{ name: 'diseasedHappened', value: ['有'] }],
disabled: false,
spanNum: 24,
options: [
{ label: '否', value: '否', disabled: false },
{ label: '是', value: '是', disabled: false },
],
rules: [{ required: true, message: '请选择住院期间是否接受康复治疗', trigger: ['submit','change'] }]
},
{
formType: 'div',
name: '(注:两次发病时间应相隔28天以上,如有二次及以上发病者,请单独记录)',
className: 'obj-form-title color-gray',
spanNum: 24,
},
{
formType: 'radio',
className: 'obj-form-title2',
prop: 'leaveHospitalRecureTreat',
model: 'leaveHospitalRecureTreat',
label: '出院后是否接受康复治疗:',
linkageRule: [{ name: 'diseasedHappened', value: ['有'] }],
disabled: false,
spanNum: 24,
options: [
{ label: '否', value: '否', disabled: false },
{ label: '是', value: '是', disabled: false },
],
rules: [{ required: true, message: '请选择出院后是否接受康复治疗', trigger: ['submit','change'] }]
},
]
}
export default ($this) => {
return [
{
formType: 'div',
name: ' MRS评分',
className: 'sec-title',
},
{
formType: 'date-picker',
className: 'obj-form-title sec-title',
prop: 'assessTime',
model: 'assessTime',
placeholder: '请选择',
label: '评估时间:',
format: 'yyyy-MM-dd',
valueFormat: 'yyyy-MM-dd',
dateType: 'date',
type: 'date',
rules: [{ required: false, message: '请选择评估时间', trigger: ['submit','change'] }],
spanNum: 6,
},
{
formType: 'input',
className: 'obj-form-title sec-title',
// linkageRule: [{name: 'type',value: ['其他']}],
prop: 'assessPeople',
model: 'assessPeople',
disabled: false,
label: '评估人:',
placeholder: '请输入评估人',
spanNum: 12,
maxlength: 20,
type: 'text',
labmsg: '',
rules: [{ required: false, message: '请输入评估人', trigger: ['submit','change'] }]
},
{
formType: 'radio',
className: 'obj-form-title radio-block',
prop: 'symptomScore',
model: 'symptomScore',
label: '评分值:',
disabled: false,
spanNum: 24,
options: [
{ label: '0(完全无症状)', value: '0(完全无症状)', disabled: false },
{ label: '1(尽管有症状,但无明显功能障碍,能完成所有日常工作和生活)', value: '1(尽管有症状,但无明显功能障碍,能完成所有日常工作和生活)', disabled: false },
{ label: '2(轻度残疾,不能完成病前所有活动,但不需帮助能照顾自己的日常生活)', value: '2(轻度残疾,不能完成病前所有活动,但不需帮助能照顾自己的日常生活)', disabled: false },
{ label: '3(中度残疾,需部分帮助,但能独立行走)', value: '3(中度残疾,需部分帮助,但能独立行走)', disabled: false },
{ label: '4(重度残疾,不能独立行走,无他人帮助不能满足自身日常生活需求)', value: '4(重度残疾,不能独立行走,无他人帮助不能满足自身日常生活需求)', disabled: false },
{ label: '5(严重残疾,持续卧床、二便失禁,需持续护理和关注,日常生活完全依赖他人)', value: '5(严重残疾,持续卧床、二便失禁,需持续护理和关注,日常生活完全依赖他人)', disabled: false },
],
rules: [{ required: false, message: '请选择评分值', trigger: ['submit','change'] }],
changeFun: (e)=>{
// console.log(e)
}
},
]
}
export default ($this) => {
return [
{
formType: 'div',
name: '3.2 心脏病',
className: 'sec-title',
},
{
formType: 'radio',
className: 'obj-form-title',
prop: 'happenedAgain',
model: 'happenedAgain',
label: '随访期间是否新发心脏病:',
disabled: false,
spanNum: 24,
options: [
{ label: '无', value: '无', disabled: false },
{ label: '有', value: '有', disabled: false },
],
rules: [{ required: true, message: '请选择随访期间是否新发心脏病', trigger: ['submit','change'] }],
changeFun(e){
if(e == '有') {
$this.addComponents.forEach((item,index)=>{
if(item.formName == 'stroke_007'){
$this.addComponents[index].formObject = {
...$this.addComponents[index].formObject,
type: []
}
}
})
}
}
},
{
formType: 'date-picker',
className: 'obj-form-title2',
prop: 'firstDiagnoseTime',
model: 'firstDiagnoseTime',
placeholder: '请选择',
label: '首次确诊时间:',
linkageRule: [{ name: 'happenedAgain', value: ['有'] }],
format: 'yyyy',
valueFormat: 'yyyy',
dateType: 'year',
type: 'date',
rules: [{ required: true, message: '请选择首次确诊时间', trigger: ['submit','change'] }],
spanNum: 6,
},
{
formType: 'checkbox',
className: 'obj-form-title2',
prop: 'type',
model: 'type',
label: '心脏病类型:',
linkageRule: [{ name: 'happenedAgain', value: ['有'] }],
disabled: false,
changeFun: (val)=>{
// console.log(val)
},
spanNum: 24,
options: [
{ label: '冠心病', value: '冠心病', disabled: false },
{ label: '房颤', value: '房颤', disabled: false },
{ label: '瓣膜性心脏病', value: '瓣膜性心脏病', disabled: false },
{ label: '具体不详', value: '具体不详', disabled: false },
{ label: '其他', value: '其他', disabled: false },
],
rules: [{ required: true, message: '请选择心脏病类型', trigger: ['submit'] }]
},
{
formType: 'input',
className: 'obj-form-title4',
linkageRule: [{name: 'type',value: ['其他']}],
prop: 'remark',
model: 'remark',
disabled: false,
placeholder: '请输入其他心脏病类型',
spanNum: 12,
maxlength: 30,
type: 'text',
labmsg: '',
rules: [{ required: true, message: '请输入其他心脏病类型', trigger: ['submit','change'] }]
},
{
formType: 'radio',
className: 'obj-form-title3',
prop: 'coronaryDiseaseType',
model: 'coronaryDiseaseType',
label: '冠心病类型:',
linkageRule: [{ name: 'type', value: ['冠心病'] }],
disabled: false,
spanNum: 24,
options: [
{ label: '心绞痛', value: '心绞痛', disabled: false },
{ label: '心肌梗塞', value: '心肌梗塞', disabled: false },
{ label: '无症状冠脉狭窄', value: '无症状冠脉狭窄', disabled: false },
],
rules: [{ required: true, message: '请选择冠心病类型', trigger: ['submit','change'] }]
},
{
formType: 'radio',
className: 'obj-form-title3',
prop: 'atrialFibrillationType',
model: 'atrialFibrillationType',
label: '房颤类型:',
linkageRule: [{ name: 'type', value: ['房颤'] }],
disabled: false,
spanNum: 24,
options: [
{ label: '阵发型', value: '阵发型', disabled: false },
{ label: '持续性', value: '持续性', disabled: false },
{ label: '未知', value: '未知', disabled: false },
],
rules: [{ required: true, message: '请选择房颤类型', trigger: ['submit','change'] }]
},
{
formType: 'radio',
className: 'obj-form-title2',
prop: 'hospitalLevel',
model: 'hospitalLevel',
label: '就诊机构级别:',
linkageRule: [{ name: 'happenedAgain', value: ['有'] }],
disabled: false,
spanNum: 24,
options: [
{ label: '省级医院', value: '省级医院', disabled: false },
{ label: '地级市医院', value: '地级市医院', disabled: false },
{ label: '县级医院', value: '县级医院', disabled: false },
{ label: '社区或乡镇卫生机构', value: '社区或乡镇卫生机构', disabled: false },
],
rules: [{ required: true, message: '请选择就诊机构级别', trigger: ['submit','change'] }]
},
{
formType: 'radio',
className: 'obj-form-title',
prop: 'atrialFibrillation',
model: 'atrialFibrillation',
label: '是否有房颤(包括既往及本次随访期间新发现的房颤患者):',
disabled: false,
spanNum: 24,
options: [
{ label: '无', value: '无', disabled: false },
{ label: '有', value: '有', disabled: false },
],
rules: [{ required: true, message: '请选择是否有房颤', trigger: ['submit','change'] }],
},
{
formType: 'radio',
className: 'obj-form-title2',
prop: 'takeAntithrombotics',
model: 'takeAntithrombotics',
label: '是否服用抗栓药物:',
linkageRule: [{ name: 'atrialFibrillation', value: ['有'] }],
disabled: false,
spanNum: 24,
options: [
{ label: '否', value: '否', disabled: false },
{ label: '是', value: '是', disabled: false },
],
rules: [{ required: true, message: '请选择是否服用抗栓药物', trigger: ['submit','change'] }],
changeFun(e){
if(e == '是') {
$this.addComponents.forEach((item,index)=>{
if(item.formName == 'stroke_007'){
$this.addComponents[index].formObject = {
...$this.addComponents[index].formObject,
drugVariety: []
}
}
})
}
}
},
{
formType: 'checkbox',
className: 'obj-form-title3',
prop: 'drugVariety',
model: 'drugVariety',
label: '用药品种:',
linkageRule: [{ name: 'takeAntithrombotics', value: ['是'] }],
disabled: false,
changeFun: (val)=>{
// console.log(val)
},
spanNum: 24,
options: [
{ label: '华法林', value: '华法林', disabled: false },
{ label: '新型抗凝剂', value: '新型抗凝剂', disabled: false },
{ label: '阿司匹林', value: '阿司匹林', disabled: false },
{ label: '氯吡格雷', value: '氯吡格雷', disabled: false },
{ label: '其他', value: '其他', disabled: false },
],
rules: [{ required: true, message: '请选择用药品种', trigger: ['submit'] }]
},
{
formType: 'radio',
className: 'obj-form-title3',
prop: 'medicationSituation',
model: 'medicationSituation',
label: '用药情况:',
linkageRule: [{ name: 'takeAntithrombotics', value: ['是'] }],
disabled: false,
spanNum: 24,
options: [
{ label: '规律', value: '规律', disabled: false },
{ label: '不规律', value: '不规律', disabled: false },
],
rules: [{ required: true, message: '请选择用药情况', trigger: ['submit','change'] }]
},
]
}
export default ($this) => {
return [
{
formType: 'div',
name: '3.3 高血压',
className: 'sec-title',
},
{
formType: 'radio',
className: 'obj-form-title',
prop: 'haveHypertension',
model: 'haveHypertension',
label: '随访期间新发现有高血压:',
disabled: false,
spanNum: 24,
options: [
{ label: '无', value: '无', disabled: false },
{ label: '有', value: '有', disabled: false },
],
rules: [{ required: true, message: '请选择随访期间新发现有高血压', trigger: ['submit','change'] }]
},
{
formType: 'date-picker',
className: 'obj-form-title2',
prop: 'diagnoseTime',
model: 'diagnoseTime',
placeholder: '请选择',
label: '首次确诊时间:',
linkageRule: [{ name: 'haveHypertension', value: ['有'] }],
format: 'yyyy',
valueFormat: 'yyyy',
dateType: 'year',
type: 'date',
rules: [{ required: true, message: '请选择首次确诊时间', trigger: ['submit','change'] }],
spanNum: 6,
},
{
formType: 'radio',
className: 'obj-form-title',
prop: 'takeHypotensorFf',
model: 'takeHypotensorFf',
label: '是否有高血压(包括既往及本次随访期间新发现的高血压患者):',
disabled: false,
spanNum: 24,
options: [
{ label: '无', value: '无', disabled: false },
{ label: '有', value: '有', disabled: false },
],
rules: [{ required: true, message: '请选择是否有高血压', trigger: ['submit','change'] }],
},
{
formType: 'radio',
className: 'obj-form-title2',
prop: 'takeHypotensor',
model: 'takeHypotensor',
label: '是否服降压药:',
linkageRule: [{ name: 'takeHypotensorFf', value: ['有'] }],
disabled: false,
spanNum: 24,
options: [
{ label: '否', value: '否', disabled: false },
{ label: '是', value: '是', disabled: false },
],
rules: [{ required: true, message: '请选择是否服降压药', trigger: ['submit','change'] }],
changeFun(e){
if(e == '是') {
$this.addComponents.forEach((item,index)=>{
if(item.formName == 'stroke_008'){
$this.addComponents[index].formObject = {
...$this.addComponents[index].formObject,
typesOfMedication: []
}
}
})
}
}
},
{
formType: 'checkbox',
className: 'obj-form-title3',
prop: 'typesOfMedication',
model: 'typesOfMedication',
label: '用药种类:',
linkageRule: [{name: 'takeHypotensor', value: ['是']}],
disabled: false,
changeFun: (val) => {
// console.log(val)
},
spanNum: 24,
options: [
{label: '利尿药', value: '利尿药', disabled: false},
{label: '钙拮抗剂', value: '钙拮抗剂', disabled: false},
{label: 'β受体阻滞剂', value: 'β受体阻滞剂', disabled: false},
{label: 'α受体阻滞剂', value: 'α受体阻滞剂', disabled: false},
{label: 'α,β受体阻滞剂', value: 'α,β受体阻滞剂', disabled: false},
{label: 'ACEI', value: 'ACEI', disabled: false},
{label: 'ARB', value: 'ARB', disabled: false},
{label: '其他', value: '其他', disabled: false},
],
rules: [{required: true, message: '请选择用药种类', trigger: ['submit']}]
},
{
formType: 'radio',
className: 'obj-form-title3',
prop: 'medicationSituation',
model: 'medicationSituation',
label: '用药情况:',
linkageRule: [{ name: 'takeHypotensor', value: ['是'] }],
disabled: false,
spanNum: 24,
options: [
{ label: '规律', value: '规律', disabled: false },
{ label: '不规律', value: '不规律', disabled: false },
],
rules: [{ required: true, message: '请选择用药情况', trigger: ['submit','change'] }]
},
{
formType: 'radio',
className: 'obj-form-title2',
prop: 'bloodPressureControl',
model: 'bloodPressureControl',
label: '血压控制情况:',
linkageRule: [{ name: 'takeHypotensorFf', value: ['有'] }],
disabled: false,
spanNum: 24,
options: [
{ label: '达标', value: '达标', disabled: false },
{ label: '不达标', value: '不达标', disabled: false },
{ label: '不清楚', value: '不清楚', disabled: false },
],
rules: [{ required: true, message: '请选择血压控制情况', trigger: ['submit','change'] }]
},
]
}
export default ($this) => {
return [
{
formType: 'div',
name: '3.4 血脂异常',
className: 'sec-title',
},
{
formType: 'radio',
className: 'obj-form-title',
prop: 'haveDyslipidemia',
model: 'haveDyslipidemia',
label: '随访期间是否新发现有血脂异常:',
disabled: false,
spanNum: 24,
options: [
{ label: '否', value: '否', disabled: false },
{ label: '是', value: '是', disabled: false },
],
rules: [{ required: true, message: '请选择随访期间是否新发现有血脂异常', trigger: ['submit','change'] }],
changeFun(e){
if(e == '是') {
$this.addComponents.forEach((item,index)=>{
if(item.formName == 'stroke_009'){
$this.addComponents[index].formObject = {
...$this.addComponents[index].formObject,
dyslipidemia: []
}
}
})
}
}
},
{
formType: 'date-picker',
className: 'obj-form-title2',
prop: 'diagnoseTime',
model: 'diagnoseTime',
placeholder: '确诊时间',
label: '首次确诊时间:',
linkageRule: [{ name: 'haveDyslipidemia', value: ['是'] }],
format: 'yyyy',
valueFormat: 'yyyy',
dateType: 'year',
type: 'date',
spanNum: 6,
rules: [{ required: true, message: '请选择首次确诊时间', trigger: ['submit','change'] }]
},
{
formType: 'checkbox',
className: 'obj-form-title2',
prop: 'dyslipidemia',
model: 'dyslipidemia',
label: '血脂异常类型:',
linkageRule: [{name: 'haveDyslipidemia', value: ['是']}],
disabled: false,
changeFun: (val) => {
// console.log(val)
},
spanNum: 24,
options: [
{label: '高胆固醇', value: '高胆固醇', disabled: false},
{label: '高甘油三酯', value: '高甘油三酯', disabled: false},
{label: '高LDL-C', value: '高LDL-C', disabled: false},
{label: '低HDL-C', value: '低HDL-C', disabled: false},
{label: '不详', value: '不详', disabled: false},
],
rules: [{required: true, message: '请选择血脂异常类型', trigger: ['submit']}]
},
{
formType: 'radio',
className: 'obj-form-title',
prop: 'dyslipidemiaIf',
model: 'dyslipidemiaIf',
label: '是否有血脂异常(包括既往及本次随访期间新发现的血脂异常患者):',
disabled: false,
spanNum: 24,
options: [
{ label: '否', value: '否', disabled: false },
{ label: '是', value: '是', disabled: false },
],
rules: [{ required: true, message: '请选择是否有血脂异常', trigger: ['submit','change'] }],
},
{
formType: 'radio',
className: 'obj-form-title2',
prop: 'takeAntilipemicAgents',
model: 'takeAntilipemicAgents',
label: '是否服用调脂药:',
linkageRule: [{name: 'dyslipidemiaIf', value: ['是']}],
disabled: false,
spanNum: 24,
options: [
{ label: '否', value: '否', disabled: false },
{ label: '是', value: '是', disabled: false },
],
rules: [{ required: true, message: '请选择是否服用调脂药', trigger: ['submit','change'] }],
changeFun(e){
if(e == '是') {
$this.addComponents.forEach((item,index)=>{
if(item.formName == 'stroke_009'){
$this.addComponents[index].formObject = {
...$this.addComponents[index].formObject,
antilipemicAgentsType: []
}
}
})
}
}
},
{
formType: 'checkbox',
className: 'obj-form-title3',
prop: 'antilipemicAgentsType',
model: 'antilipemicAgentsType',
label: '选择的调脂药:',
linkageRule: [{name: 'takeAntilipemicAgents', value: ['是']}],
disabled: false,
changeFun: (val) => {
// console.log(val)
},
spanNum: 24,
options: [
{label: '他汀类', value: '他汀类', disabled: false},
{label: '贝特类', value: '贝特类', disabled: false},
{label: '其他', value: '其他', disabled: false},
],
rules: [{required: true, message: '请选择调脂药', trigger: ['submit']}]
},
]
}
export default ($this) => {
return [
{
formType: 'div',
name: '3.5 糖尿病',
className: 'sec-title',
},
{
formType: 'radio',
className: 'obj-form-title',
prop: 'haveDiabetes',
model: 'haveDiabetes',
label: '随访期间是否新发现有糖尿病:',
disabled: false,
spanNum: 24,
options: [
{ label: '否', value: '否', disabled: false },
{ label: '是', value: '是', disabled: false },
],
rules: [{ required: true, message: '请选择随访期间是否新发现有糖尿病', trigger: ['submit','change'] }]
},
{
formType: 'date-picker',
className: 'obj-form-title2',
prop: 'diagnoseTime',
model: 'diagnoseTime',
placeholder: '确诊时间',
label: '首次确诊时间:',
linkageRule: [{ name: 'haveDiabetes', value: ['是'] }],
format: 'yyyy',
valueFormat: 'yyyy',
dateType: 'year',
type: 'date',
spanNum: 6,
rules: [{ required: true, message: '请选择首次确诊时间', trigger: ['submit','change'] }]
},
{
formType: 'radio',
className: 'obj-form-title',
prop: 'strokeMedicalIf',
model: 'strokeMedicalIf',
label: '是否为糖尿病患者(包括既往及本次随访期间新发现的糖尿病患者):',
disabled: false,
spanNum: 24,
options: [
{ label: '否', value: '否', disabled: false },
{ label: '是', value: '是', disabled: false },
],
rules: [{ required: true, message: '请选择是否有血脂异常', trigger: ['submit','change'] }],
},
{
formType: 'radio',
className: 'obj-form-title2',
prop: 'takeHypoglycemicDrugs',
model: 'takeHypoglycemicDrugs',
label: '是否服用降糖药:',
linkageRule: [{ name: 'strokeMedicalIf', value: ['是'] }],
disabled: false,
spanNum: 24,
options: [
{ label: '否', value: '否', disabled: false },
{ label: '是', value: '是', disabled: false },
],
rules: [{ required: true, message: '请选择是否服用降糖药', trigger: ['submit','change'] }],
changeFun(e){
if(e == '是') {
$this.addComponents.forEach((item,index)=>{
if(item.formName == 'stroke_010'){
$this.addComponents[index].formObject = {
...$this.addComponents[index].formObject,
hypoglycemicDrugsType: []
}
}
})
}
}
},
{
formType: 'checkbox',
className: 'obj-form-title3',
prop: 'hypoglycemicDrugsType',
model: 'hypoglycemicDrugsType',
label: '选择的降糖药:',
linkageRule: [{name: 'takeHypoglycemicDrugs', value: ['是']}],
disabled: false,
changeFun: (val) => {
// console.log(val)
},
spanNum: 24,
options: [
{label: '服降糖药', value: '服降糖药', disabled: false},
{label: '胰岛素', value: '胰岛素', disabled: false},
{label: '其他', value: '其他', disabled: false},
],
rules: [{required: true, message: '请选择降糖药', trigger: ['submit']}]
},
// {
// formType: 'input',
// className: 'obj-form-title3',
// linkageRule: [{name: 'hypoglycemicDrugsType',value: ['其他']}],
// prop: 'remark',
// model: 'remark',
// label: '其他降糖药:',
// disabled: false,
// placeholder: '请输入其他降糖药',
// spanNum: 12,
// maxlength: 30,
// type: 'text',
// labmsg: '',
// rules: [{ required: true, message: '请输入其他降糖药', trigger: ['submit','change'] }]
// },
{
formType: 'radio',
className: 'obj-form-title2',
prop: 'bloodSugarControl',
model: 'bloodSugarControl',
label: '血糖控制情况:',
linkageRule: [{ name: 'strokeMedicalIf', value: ['是'] }],
disabled: false,
spanNum: 24,
options: [
{ label: '基本达标', value: '基本达标', disabled: false },
{ label: '未达标', value: '未达标', disabled: false },
{ label: '不清楚', value: '不清楚', disabled: false },
],
rules: [{ required: true, message: '请选择血糖控制情况', trigger: ['submit','change'] }]
},
]
}
export default ($this) => {
return [
{
formType: 'div',
name: '4.1 颈动脉',
className: 'sec-title',
},
{
formType: 'radio',
className: 'obj-form-title',
prop: 'stenting',
model: 'stenting',
label: '支架术(CAS):',
disabled: false,
spanNum: 24,
options: [
{label: '否', value: '否', disabled: false},
{label: '是', value: '是', disabled: false},
],
rules: [{required: true, message: '请选择是否使用支架术', trigger: ['submit','change']}],
changeFun(e){
if(e == '是') {
$this.addComponents.forEach((item,index)=>{
if(item.formName == 'stroke_011'){
$this.addComponents[index].formObject = {
...$this.addComponents[index].formObject,
stentingPosition: []
}
}
})
}
}
},
{
formType: 'checkbox',
className: 'obj-form-title2',
prop: 'stentingPosition',
model: 'stentingPosition',
label: '支架术位置:',
linkageRule: [{name: 'stenting', value: ['是']}],
disabled: false,
changeFun: (val) => {
// console.log(val)
},
spanNum: 24,
options: [
{label: '左侧', value: '左侧', disabled: false},
{label: '右侧', value: '右侧', disabled: false},
],
rules: [{required: true, message: '请选择支架术位置', trigger: ['submit']}]
},
{
formType: 'date-picker',
className: 'obj-form-title3',
prop: 'leftStentingOperativeTime',
model: 'leftStentingOperativeTime',
placeholder: '请选择',
label: '支架左侧手术时间:',
linkageRule: [{name: 'stentingPosition', value: ['左侧']}],
format: 'yyyy',
valueFormat: 'yyyy',
dateType: 'year',
type: 'date',
rules: [{required: true, message: '请选择支架左侧手术时间', trigger: ['submit','change']}],
spanNum: 12,
},
{
formType: 'date-picker',
className: 'obj-form-title3',
prop: 'rightStentingOperativeTime',
model: 'rightStentingOperativeTime',
placeholder: '请选择',
label: '支架右侧手术时间:',
linkageRule: [{name: 'stentingPosition', value: ['右侧']}],
format: 'yyyy',
valueFormat: 'yyyy',
dateType: 'year',
type: 'date',
rules: [{required: true, message: '请选择支架右侧手术时间', trigger: ['submit','change']}],
spanNum: 12,
},
{
formType: 'radio',
className: 'obj-form-title',
prop: 'endometriodenudation',
model: 'endometriodenudation',
label: '内膜剥脱术(CEA):',
disabled: false,
spanNum: 24,
options: [
{label: '否', value: '否', disabled: false},
{label: '是', value: '是', disabled: false},
],
rules: [{required: true, message: '请选择是否使用内膜剥脱术', trigger: ['submit','change']}],
changeFun(e){
if(e == '是') {
$this.addComponents.forEach((item,index)=>{
if(item.formName == 'stroke_011'){
$this.addComponents[index].formObject = {
...$this.addComponents[index].formObject,
endarterectomyPosition: []
}
}
})
}
}
},
{
formType: 'checkbox',
className: 'obj-form-title2',
prop: 'endarterectomyPosition',
model: 'endarterectomyPosition',
label: '内膜剥脱术位置:',
linkageRule: [{name: 'endometriodenudation', value: ['是']}],
disabled: false,
changeFun: (val) => {
// console.log(val)
},
spanNum: 24,
options: [
{label: '左侧', value: '左侧', disabled: false},
{label: '右侧', value: '右侧', disabled: false},
],
rules: [{required: true, message: '请选择内膜剥脱术位置', trigger: ['submit']}]
},
{
formType: 'date-picker',
className: 'obj-form-title3',
prop: 'leftEndarterectomyOperativeTime',
model: 'leftEndarterectomyOperativeTime',
placeholder: '请选择',
label: '左侧内膜剥脱术手术时间:',
linkageRule: [{name: 'endarterectomyPosition', value: ['左侧']}],
format: 'yyyy',
valueFormat: 'yyyy',
dateType: 'year',
type: 'date',
rules: [{required: true, message: '请选择左侧内膜剥脱术手术时间', trigger: ['submit','change']}],
spanNum: 12,
},
{
formType: 'date-picker',
className: 'obj-form-title3',
prop: 'rightEndarterectomyOperativeTime',
model: 'rightEndarterectomyOperativeTime',
placeholder: '请选择',
label: '右侧内膜剥脱术手术时间:',
linkageRule: [{name: 'endarterectomyPosition', value: ['右侧']}],
format: 'yyyy',
valueFormat: 'yyyy',
dateType: 'year',
type: 'date',
rules: [{required: true, message: '请选择右侧内膜剥脱术手术时间', trigger: ['submit','change']}],
spanNum: 12,
},
{
formType: 'radio',
className: 'obj-form-title',
prop: 'ecIcBypass',
model: 'ecIcBypass',
label: '颅内外血管搭桥术:',
disabled: false,
spanNum: 24,
options: [
{label: '否', value: '否', disabled: false},
{label: '是', value: '是', disabled: false},
],
rules: [{required: true, message: '请选择是否使用颅内外血管搭桥术', trigger: ['submit','change']}]
},
{
formType: 'date-picker',
className: 'obj-form-title2',
prop: 'ecIcBypassTime',
model: 'ecIcBypassTime',
placeholder: '请选择',
label: '颅内外血管搭桥术-手术时间:',
linkageRule: [{name: 'ecIcBypass', value: ['是']}],
format: 'yyyy',
valueFormat: 'yyyy',
dateType: 'year',
type: 'date',
rules: [{required: true, message: '请选择颅内外血管搭桥术', trigger: ['submit','change']}],
spanNum: 12,
},
]
}
export default ($this) => {
return [
{
formType: 'div',
name: '4.2 冠状动脉',
className: 'sec-title',
},
{
formType: 'radio',
className: 'obj-form-title',
prop: 'intervention',
model: 'intervention',
label: '介入术(PCI):',
disabled: false,
spanNum: 24,
options: [
{label: '否', value: '否', disabled: false},
{label: '是', value: '是', disabled: false},
],
rules: [{required: true, message: '请选择是否使用介入术', trigger: ['submit','change']}]
},
{
formType: 'date-picker',
className: 'obj-form-title2',
prop: 'interventionOperativeTime',
model: 'interventionOperativeTime',
placeholder: '请选择',
label: '介入术-手术时间:',
linkageRule: [{name: 'intervention', value: ['是']}],
format: 'yyyy',
valueFormat: 'yyyy',
dateType: 'year',
type: 'date',
rules: [{required: true, message: '请选择介入术-手术时间', trigger: ['submit','change']}],
spanNum: 6,
},
{
formType: 'radio',
className: 'obj-form-title',
prop: 'coronaryArteryYpass',
model: 'coronaryArteryYpass',
label: '搭桥术(CABG):',
disabled: false,
spanNum: 24,
options: [
{label: '否', value: '否', disabled: false},
{label: '是', value: '是', disabled: false},
],
rules: [{required: true, message: '请选择是否使用搭桥术', trigger: ['submit','change']}]
},
{
formType: 'date-picker',
className: 'obj-form-title2',
prop: 'cabgOperationTime',
model: 'cabgOperationTime',
placeholder: '请选择',
label: '搭桥术-手术时间:',
linkageRule: [{name: 'coronaryArteryYpass', value: ['是']}],
format: 'yyyy',
valueFormat: 'yyyy',
dateType: 'year',
type: 'date',
rules: [{required: true, message: '请选择搭桥术-手术时间', trigger: ['submit','change']}],
spanNum: 6,
},
]
}
export default ($this) => {
return [
{
formType: 'div',
name: '4.3 出血性卒中外科治疗',
className: 'sec-title',
},
{
formType: 'radio',
className: 'obj-form-title',
prop: 'haveSurgicalIntervention',
model: 'haveSurgicalIntervention',
label: '是否接受过出血性卒中外科干预:',
disabled: false,
spanNum: 24,
options: [
{label: '否', value: '否', disabled: false},
{label: '是', value: '是', disabled: false},
],
rules: [{required: true, message: '请选择是否接受过出血性卒中外科干预', trigger: ['submit','change']}]
},
{
formType: 'input',
className: 'obj-form-title2',
prop: 'treatmentMethod',
model: 'treatmentMethod',
label: '治疗方式:',
linkageRule: [{name: 'haveSurgicalIntervention', value: ['是']}],
disabled: false,
placeholder: '请输入治疗方式',
spanNum: 6,
maxlength: 30,
type: 'text',
labmsg: '次',
// slots: [{name: 'cm', type: 'append'}],
rules: [{required: true, message: '请输入治疗方式', trigger: ['submit','change']}],
},
{
formType: 'date-picker',
className: 'obj-form-title2',
prop: 'treatmentTime',
model: 'treatmentTime',
placeholder: '请选择',
label: '手术时间:',
linkageRule: [{name: 'haveSurgicalIntervention', value: ['是']}],
format: 'yyyy',
valueFormat: 'yyyy',
dateType: 'year',
type: 'date',
rules: [{required: true, message: '请选择手术时间', trigger: ['submit','change']}],
spanNum: 6
},
]
}
<template>
<div class="form-wrap">
<!--渲染不同的模块表单-->
<div v-if="canRender" v-for="(item, index) in addComponents">
<div v-if="item.showModule" class="content-box" >
<div v-if="!item.hideTitle" class="title">{{item.title}}</div>
<el-form
:ref="'form' + index"
:id="'form' + index"
:model="item.formObject"
size="medium"
label-position="left"
class="form"
>
<FormScale
:dataSource="item.dataSource"
:form="item.formObject"
:ruleNew="item.ruleNew"
:class="item.className"
/>
</el-form>
<ChoseMedication
v-if="dialogFormVisible"
@closeDialog="closeDialog"
@setMedication="setMedication"
/>
</div>
</div>
</div>
</template>
<script>
import { getDomain, getScaleModels, getScaleDetail, postScale, updateScalesStatus, submitScale } from '@/utils/followup/followapis'
// 量表 template
import FormScale from '@/components/followup/form/index'
import ChoseMedication from '@/views/followup/record-manage/dialog/chose-medication'
// 量表模块数据模型
// 糖尿病
import diabetesSourseBaseInfo from '../models/diabetes/diabetesSourseBaseInfo'
import diabetesSourseSymptom from '../models/diabetes/diabetesSourseSymptom'
import diabetesSourseSign from '../models/diabetes/diabetesSourseSign'
import diabetesSourseLifeMode from '../models/diabetes/diabetesSourseLifeMode'
import diabetesSourseAuxiliary from '../models/diabetes/diabetesSourseAuxiliary'
import diabetesSourseOther from '../models/diabetes/diabetesSourseOther'
import diabetesSourseMedicationUse from '../models/diabetes/diabetesSourseMedicationUse'
import diabetesSourseReferral from '../models/diabetes/diabetesSourseReferral'
import diabetesSourseSignature from '../models/diabetes/diabetesSourseSignature'
export default {
data(){
return {
domain: '',//通过接口获取白名单域名
needRule: true, //是否动态开启验证
showModule: true, //是否隐藏表单模块
canRender: true,
valid: false,
validList: [],
moduleList: [],//模块列表
planPatientsTimesId: '',
scaleNo: '',
doctorId: '',
planTimesId: '',
addComponents: [],
addComponentsSourceList: [],
formData: {},//整个表单对象
dialogFormVisible: false,//是否显示添加用药情况dialog
medication: [],// 用药情况
type2Obj: {},
}
},
components: {
FormScale,
ChoseMedication,
},
props: {
scaleType: String,//病种类型
checkStart: Boolean,
saveWay: Number,
showBtn: String,
},
watch: {
checkStart(val){
if(val){
this.validList = [];
for(let i=0;i<this.addComponents.length;i++){
let formName = this.addComponents[i].formName;
// 将每个模块的fornName对应后台的表名放到表单对象
this.formData[formName] = this.addComponents[i].formObject;
this.$nextTick(()=>{
// saveWay=1是提交,进行校验,2是暂存,不需要校验,直接发送请求
if(this.saveWay==1){
if(this.$refs['form' + i].length > 0){
this.$refs['form' + i][0].validate((valid) => {
this.validList.push(valid);
});
}
}
})
}
this.$nextTick(()=>{
// saveWay=1是提交,进行校验,2是暂存,不需要校验,直接发送请求
if(this.saveWay==1){
for(let k=0;k<this.validList.length;k++){
if(!this.validList[k]){
this.$emit('checkEnd',false);
this.valid = false;
this.$nextTick(() => {
// 如果表单未完善,跳转到该表单模块
document.querySelector(`#form${k}`).scrollIntoView(true);
})
return;
}else{
this.valid = true;
}
}
if(this.valid){
this.dataSubmit(()=>{
updateScalesStatus({
fuPlanPatientTimesId: this.planPatientsTimesId,
planTimesId: this.planTimesId,
resourceId: this.scaleNo
})
});
}
this.$emit('checkEnd',false);
}else{
this.dataSubmit();
}
})
}
},
showModule(val){
this.addComponents.forEach((item,index)=>{
if(index >= 3){
this.addComponents[index].showModule = val;
}
})
},
},
created(){
this.planPatientsTimesId = this.$route.query.planPatientsTimesId
this.scaleNo = this.$route.query.scaleNo
this.doctorId = this.$route.query.doctorId
this.planTimesId = this.$route.query.planTimesId;
// 获取量表类型
this.initScaleType();
// 获取白名单域名
this.getWhiteDomain();
},
methods: {
// 获取量表类型
initScaleType(){
this.addComponentsSourceList = [
{name: 'diabetesSourseBaseInfo',formObject: {},showModule: true,formName: 'h_s_001',className: 'obj-form-title',dataSource: diabetesSourseBaseInfo(this), hideTitle: true, title: '基本信息'},
{name: 'diabetesSourseSymptom',formObject: {},showModule: true,formName: 'diabetes_001',className: 'obj-form-title',dataSource: diabetesSourseSymptom(this), hideTitle: false, title: '症状'},
{name: 'diabetesSourseSign',formObject: {bmi: 0,nextBmi: 0,},showModule: true,formName: 'diabetes_002',className: 'obj-form-title',dataSource: diabetesSourseSign(this), hideTitle: false, title: '体征'},
{name: 'diabetesSourseLifeMode',formObject: {},showModule: true,formName: 'diabetes_003',className: 'obj-form-title',dataSource: diabetesSourseLifeMode(this), hideTitle: false, title: '生活方式指导'},
{name: 'diabetesSourseAuxiliary',formObject: {glycosylatedHemoglobinPercent:'',glycosylatedHemoglobinDate:''},showModule: true,formName: 'diabetes_004',className: 'obj-form-title',dataSource: diabetesSourseAuxiliary(this), hideTitle: false, title: '辅助检查'},
{name: 'diabetesSourseOther',formObject: {},showModule: true,formName: 'diabetes_005',className: 'obj-form-title',dataSource: diabetesSourseOther(this), hideTitle: true, title: '其他'},
{name: 'diabetesSourseMedicationUse',formObject: {arrList:this.medication},showModule: true,formName: 'h_s_002',className: 'obj-form-title',dataSource: diabetesSourseMedicationUse(this), hideTitle: false, title: '用药情况'},
{name: 'diabetesSourseReferral',formObject: {reason:'',mechanism:'',department:''},showModule: true,formName: 'h_s_003',className: 'obj-form-title',dataSource: diabetesSourseReferral(this), hideTitle: false, title: '转诊'},
{name: 'diabetesSourseSignature',formObject: {},showModule: true,formName: 'h_s_004',className: 'obj-form-title',dataSource: diabetesSourseSignature(this), hideTitle: true, title: '签名'},
]
},
// 获取白名单域名
getWhiteDomain(){
getDomain().then(res=>{
if(res.code=='000000'){
this.domain = res.data;
// 获取量表模块
this.getFormModules();
if(this.showBtn!='0'){
// 获取量表详情
this.getFormDetail();
}
}else{
this.$message({
message: res.message,
type: 'error'
});
}
})
},
// 动态开启验证开关
// setRuleToTrue(index){
// this.addComponents[index].dataSource.forEach((item,k)=>{
// if(item.rules && item.rules.length > 0){
// if(!this.needRule){
// this.addComponents[index].dataSource[k].rules[0].required = true;
// }else{
// this.addComponents[index].dataSource[k].rules[0].required = false;
// }
// }
// })
// },
// 获取展示的模块
getFormModules(){
getScaleModels(this.domain,this.scaleNo).then(res=>{
if(res.code=='000000'){
this.moduleList = res.data;
for(let i=0;i<this.moduleList.length;i++){
for(let j=0;j<this.addComponentsSourceList.length;j++){
if(this.moduleList[i]==this.addComponentsSourceList[j].formName){
this.addComponents.push(this.addComponentsSourceList[j])
}
}
}
}else{
this.$message({
message: res.message,
type: 'error'
});
}
})
},
// 处理获取用药情况详情数据
handleModuleMedicalUseData(obj){
if(obj.medicineType == '1'){
const { dosageDay,dosageNum,medicinesName,medicineType } = obj;
this.medication.push({ dosageDay,dosageNum,medicinesName,medicineType });
}else if(obj.medicineType == '2'){
const { dosageDay,dosageNum,medicinesName,medicineType } = obj;
this.type2Obj = { dosageDay,dosageNum,medicinesName,medicineType }
}
},
// 获取量表详情
getFormDetail(){
getScaleDetail(this.domain,this.planPatientsTimesId,this.scaleNo).then(res=>{
this.formData = res.data
let keysList = Object.keys(this.formData);
if(keysList.length > 0){
this.medication = [];
for(let i=0;i<this.addComponents.length;i++){
let formName = this.addComponents[i].formName;
// let type2Obj = {};
if(this.formData[formName] && formName == 'h_s_002'){
let getDataHS002 = this.formData[formName];
if(Array.isArray(getDataHS002)){
getDataHS002.forEach((item,index)=>{
this.handleModuleMedicalUseData(item);
})
}else {
// 如果是对象,则为一条数据
this.handleModuleMedicalUseData(getDataHS002);
}
this.addComponents[i].formObject = {
arrList: this.medication,
...this.type2Obj
}
}else if(this.formData[formName] && formName == 'diabetes_001'){
this.addComponents[i].formObject = this.formData[formName];
let symptom = this.formData[formName].symptom;
this.addComponents[i].formObject.symptom = JSON.parse(symptom || '[]');
}else{
this.addComponents[i].formObject = this.formData[formName];
}
// 量表字段回显,会触发change校验,所以这里拿到数据渲染页面后,重置验证
if(this.$refs['form' + i].length > 0){
this.$refs['form' + i][0].resetFields();
}
}
this.canRender = true;
this.$forceUpdate();
}
})
},
// 提交量表
dataSubmit(callback){
// if(this.valid){
// console.log(this.formData)
this.formData.doctorId = parseFloat(this.doctorId);
this.formData.saveWay = parseFloat(this.saveWay);
this.formData.planPatientsTimesId = parseFloat(this.planPatientsTimesId);
this.formData.scaleNo = this.scaleNo;
this.formData.isLine = 2;
this.formData.diabetes_001.symptom = JSON.stringify(this.formData.diabetes_001.symptom);
let arrNew = [];
arrNew.push({
medicineType: '2',
medicinesName:this.formData.h_s_002.medicinesName,
dosageDay: this.formData.h_s_002.dosageDay,
dosageNum:this.formData.h_s_002.dosageNum
});
this.medication = [...this.medication,...arrNew];
this.formData.h_s_002 = this.medication
postScale(this.domain,this.formData).then(res=>{
if(res.code=='000000'){
let doMsg = (this.saveWay==1) ? '提交成功' : '保存成功';
this.$message({
message: doMsg,
type: 'success'
});
if(callback){
callback();
}
setTimeout(()=>{
this.$router.push({
path: '/followup/record-manage/record-list'
})
},1000)
}else{
let doMsg = (this.saveWay==1) ? '提交失败' : '保存失败';
this.$message({
message: doMsg,
type: 'error'
});
}
});
// }
// this.$emit('checkEnd',false);
},
closeDialog(val){
this.dialogFormVisible = val;
},
setMedication(val){
this.medication.push({...val,medicineType:'1'});
}
},
}
</script>
<style scoped lang="scss">
.form-wrap{
.content-box{
.title{
line-height: 60px;
height: 60px;
font-weight: bold;
font-size: 18px;
border-bottom: 1px dashed #ccc;
}
}
}
</style>
<template>
<div class="form-wrap">
<!--渲染不同的模块表单-->
<div v-if="canRender" v-for="(item, index) in addComponents">
<div v-if="item.showModule" class="content-box" >
<div v-if="!item.hideTitle" class="title">{{item.title}}</div>
<el-form
:ref="'form' + index"
:id="'form' + index"
:model="item.formObject"
size="medium"
label-position="left"
class="form"
>
<FormScale
:dataSource="item.dataSource"
:form="item.formObject"
:ruleNew="item.ruleNew"
:class="item.className"
/>
</el-form>
<ChoseMedication
v-if="dialogFormVisible"
@closeDialog="closeDialog"
@setMedication="setMedication"
/>
</div>
</div>
</div>
</template>
<script>
import { getDomain, getScaleModels, getScaleDetail, postScale, updateScalesStatus, submitScale } from '@/utils/followup/followapis'
// 量表 template
import FormScale from '@/components/followup/form/index'
import ChoseMedication from '@/views/followup/record-manage/dialog/chose-medication';
// 量表模块数据模型
// 高血压
import hypeDataSourceBaseInfo from '../models/hypertension/hypeDataSourceBaseInfo'
import hypeDataSourceSymptom from '../models/hypertension/hypeDataSourceSymptom'
import hypeDataSourceSign from '../models/hypertension/hypeDataSourceSign'
import hypeDataSourceLifeMode from '../models/hypertension/hypeDataSourceLifeMode'
import hypeDataSourceHelpChecking from '../models/hypertension/hypeDataSourceHelpChecking'
import hypeDataSourceMedicationUse from '../models/hypertension/hypeDataSourceMedicationUse'
import hypeDataSourceReferral from '../models/hypertension/hypeDataSourceReferral'
import hypeDataSourceNextFollowDay from '../models/hypertension/hypeDataSourceNextFollowDay'
export default {
data(){
return {
dialogFormVisible: false,//是否显示添加用药情况dialog
domain: '',//通过接口获取白名单域名
needRule: true, //是否动态开启验证
showModule: true, //是否隐藏表单模块
canRender: true,
valid: false,
validList: [],
moduleList: [],//模块列表
planPatientsTimesId: '',
scaleNo: '',
doctorId: '',
planTimesId: '',
addComponents: [],
addComponentsSourceList: [],
formData: {},//整个表单对象
medication: [],// 用药情况
type3Obj: {}
}
},
components: {
FormScale,
ChoseMedication,
},
props: {
scaleType: String,//病种类型
checkStart: Boolean,
saveWay: Number,
showBtn: String,
},
watch: {
checkStart(val){
if(val){
this.validList = [];
for(let i=0;i<this.addComponents.length;i++){
let formName = this.addComponents[i].formName;
// 将每个模块的fornName对应后台的表名放到表单对象
this.formData[formName] = this.addComponents[i].formObject;
this.$nextTick(()=>{
// saveWay=1是提交,进行校验,2是暂存,不需要校验,直接发送请求
if(this.saveWay==1){
if(this.$refs['form' + i].length > 0){
this.$refs['form' + i][0].validate((valid) => {
this.validList.push(valid);
});
}
}
})
}
this.$nextTick(()=>{
// saveWay=1是提交,进行校验,2是暂存,不需要校验,直接发送请求
if(this.saveWay==1){
for(let k=0;k<this.validList.length;k++){
if(!this.validList[k]){
this.$emit('checkEnd',false);
this.valid = false;
this.$nextTick(() => {
// 如果表单未完善,跳转到该表单模块
document.querySelector(`#form${k}`).scrollIntoView(true);
})
return;
}else{
this.valid = true;
}
}
if(this.valid){
this.dataSubmit(()=>{
updateScalesStatus({
fuPlanPatientTimesId: this.planPatientsTimesId,
planTimesId: this.planTimesId,
resourceId: this.scaleNo
})
});
}
}else{
this.dataSubmit();
}
this.$emit('checkEnd',false);
})
}else{
this.$emit('checkEnd',false);
}
},
showModule(val){
this.addComponents.forEach((item,index)=>{
if(index >= 3){
this.addComponents[index].showModule = val;
}
})
},
},
created(){
this.planPatientsTimesId = this.$route.query.planPatientsTimesId
this.scaleNo = this.$route.query.scaleNo
this.doctorId = this.$route.query.doctorId
this.planTimesId = this.$route.query.planTimesId;
// 获取量表类型
this.initScaleType();
// 获取白名单域名
this.getWhiteDomain();
},
methods: {
// 获取量表类型
initScaleType(){
this.addComponentsSourceList = [
{name: 'hypeDataSourceBaseInfo',formObject: {},showModule: true,formName: 'h_s_001',className: 'obj-form-title',dataSource: hypeDataSourceBaseInfo(this), hideTitle: true, title: '基本信息'},
{name: 'hypeDataSourceSymptom',formObject: {},showModule: true,formName: 'hypertension_001',className: 'obj-form-title',dataSource: hypeDataSourceSymptom(this), hideTitle: false, title: '症状'},
{name: 'hypeDataSourceSign',formObject: {bmi: 0,nextBmi: 0},showModule: true,formName: 'hypertension_002',className: 'obj-form-title',dataSource: hypeDataSourceSign(this), hideTitle: false, title: '体征'},
{name: 'hypeDataSourceLifeMode',formObject: {},showModule: true,formName: 'hypertension_003',className: 'obj-form-title',dataSource: hypeDataSourceLifeMode(this), hideTitle: false, title: '生活方式指导'},
{name: 'hypeDataSourceHelpChecking',formObject: {},showModule: true,formName: 'hypertension_004',className: 'obj-form-title',dataSource: hypeDataSourceHelpChecking(this), hideTitle: false, title: '辅助检查'},
{name: 'hypeDataSourceMedicationUse',formObject: {arrList:this.medication,dosageDay:'',dosageNum:'',medicinesName:'',medicineType:''},showModule: true,formName: 'h_s_002',className: 'obj-form-title',dataSource: hypeDataSourceMedicationUse(this), hideTitle: false, title: '用药情况'},
{name: 'hypeDataSourceReferral',formObject: {reason:'',mechanism:'',department:''},showModule: true,formName: 'h_s_003',className: 'obj-form-title',dataSource: hypeDataSourceReferral(this), hideTitle: false, title: '转诊'},
{name: 'hypeDataSourceNextFollowDay',formObject: {nextFollowDay:''},showModule: true,formName: 'h_s_004',className: 'obj-form-title',dataSource: hypeDataSourceNextFollowDay(this), hideTitle: true, title: '下次随访日期'},
]
},
// 获取白名单域名
getWhiteDomain(){
getDomain().then(res=>{
if(res.code=='000000'){
this.domain = res.data;
// this.setFormData()
// 获取量表模块
this.getFormModules();
}else{
this.$message({
message: res.message,
type: 'error'
});
}
})
},
// 目前先默认写死
setFormData(){
this.addComponents = this.addComponentsSourceList
},
// 获取展示的模块
getFormModules(){
getScaleModels(this.domain,this.scaleNo).then(res=>{
if(res.code=='000000'){
this.moduleList = res.data;
for(let i=0;i<this.moduleList.length;i++){
for(let j=0;j<this.addComponentsSourceList.length;j++){
if(this.moduleList[i]==this.addComponentsSourceList[j].formName){
this.addComponents.push(this.addComponentsSourceList[j])
}
}
}
if(this.showBtn!='0'){
// 获取量表详情
this.getFormDetail();
}
}else{
this.$message({
message: res.message,
type: 'error'
});
}
})
},
// 处理获取用药情况详情数据
handleModuleMedicalUseDetai(obj){
if(obj.medicineType=='1'){
const { dosageDay,dosageNum,medicinesName,medicineType } = obj;
this.medication.push({ dosageDay,dosageNum,medicinesName,medicineType });
}else if(obj.medicineType=='3'){
const { dosageDay,dosageNum,medicinesName,medicineType } = obj;
this.type3Obj = { dosageDay,dosageNum,medicinesName,medicineType }
}
},
// 获取量表详情
getFormDetail(){
getScaleDetail(this.domain,this.planPatientsTimesId,this.scaleNo).then(res=>{
this.formData = res.data
let keysList = Object.keys(this.formData);
if(keysList.length > 0){
for(let i=0;i<this.addComponents.length;i++){
let formName = this.addComponents[i].formName;
if(this.formData[formName] && formName=='h_s_002'){
let h_s_002 = this.formData[formName];
let isArr = Array.isArray(h_s_002);
// 判断是否数组,数组是2条以上数据
if(isArr){
h_s_002.forEach((item,index)=>{
this.handleModuleMedicalUseDetai(item);
})
}else{
// 如果是对象,则为一条数据
this.handleModuleMedicalUseDetai(h_s_002);
}
this.addComponents[i].formObject = {
arrList: this.medication,
...this.type3Obj
}
// console.log(this.addComponents[i].formObject)
}else if(this.formData[formName] && formName=='hypertension_001'){
this.addComponents[i].formObject = this.formData[formName];
let symptom = this.formData[formName].symptom;
this.addComponents[i].formObject.symptom = JSON.parse(symptom || '[]');
}else{
// 判断是否有数据,没有就用初始化
if(this.formData[formName]){
this.addComponents[i].formObject = this.formData[formName];
}else{
this.addComponents[i] = this.addComponentsSourceList[i];
}
}
// 量表字段回显,会触发change校验,所以这里拿到数据渲染页面后,重置验证
if(this.$refs['form' + i].length > 0){
this.$refs['form' + i][0].resetFields();
}
}
}
})
},
// 处理提交用药情况数据
handleModuleMedicalUse(){
let otherMed = [];
for(let i=0;i<this.addComponents.length;i++){
if(this.addComponents[i].name == 'hypeDataSourceMedicationUse'){
const formObject = this.addComponents[i].formObject;
// 有填写其他药物的情况
if(formObject.dosageDay !=='' && formObject.dosageDay >=0 && formObject.medicinesName && formObject.dosageNum){
otherMed.push({
medicinesName: formObject.medicinesName,
dosageDay: formObject.dosageDay,
dosageNum: formObject.dosageNum,
medicineType: '3'
})
}
this.medication = [...this.medication,...otherMed];
this.formData.h_s_002 = this.medication;
this.valid = true;
}
}
let flag = this.valid;
this.$emit('checkEnd',false);
return flag;
},
// 提交量表
dataSubmit(callback){
this.formData.doctorId = parseFloat(this.doctorId);
this.formData.saveWay = parseFloat(this.saveWay);
this.formData.planPatientsTimesId = parseFloat(this.planPatientsTimesId);
this.formData.scaleNo = this.scaleNo;
this.formData.isLine = 2;
// 检测用药情况数据是否填写
if(!this.handleModuleMedicalUse()){
return;
}
this.formData.hypertension_001.symptom = JSON.stringify(this.formData.hypertension_001.symptom);
// console.log(this.formData)
postScale(this.domain,this.formData).then(res=>{
if(res.code=='000000'){
let doMsg = (this.saveWay==1) ? '提交成功' : '保存成功';
this.$message({
message: doMsg,
type: 'success'
});
if(callback){
callback();
}
setTimeout(()=>{
this.$router.push({
path: '/followup/record-manage/record-list'
})
},1000)
}else{
let doMsg = (this.saveWay==1) ? '提交失败' : '保存失败';
this.$message({
message: doMsg,
type: 'error'
});
}
});
},
closeDialog(val){
this.dialogFormVisible = val;
},
setMedication(val){
this.medication.push({...val,medicineType: '1'});
console.log('medication=>',this.medication)
}
},
}
</script>
<style scoped lang="scss">
.form-wrap{
.content-box{
.title{
line-height: 60px;
height: 60px;
font-weight: bold;
font-size: 22px;
border-bottom: 1px dashed #ccc;
}
}
}
</style>
<template>
<div class="form-wrap">
<!--渲染不同的模块表单-->
<div v-if="canRender" v-for="(item, index) in addComponents">
<div v-if="item.showModule" class="content-box" >
<div v-if="!item.hideTitle" class="title">{{item.title}}</div>
<el-form
:ref="'form' + index"
:id="'form' + index"
:model="item.formObject"
size="medium"
label-position="left"
class="form"
>
<FormScale
:dataSource="item.dataSource"
:form="item.formObject"
:ruleNew="item.ruleNew"
:needRule="needRule"
:class="item.className"
/>
</el-form>
</div>
</div>
</div>
</template>
<script>
import { getDomain, getScaleModels, getScaleDetail, postScale, updateScalesStatus, submitScale } from '@/utils/followup/followapis'
// 量表 template
import FormScale from '@/components/followup/form/index'
// 量表模块数据模型
// 脑卒中
import dataSourceBaseInfo0 from '../models/stroke/dataSourceBaseInfo0'
import dataSourceBaseInfo from '../models/stroke/dataSourceBaseInfo'
import dataSourceBaseInfo2 from '../models/stroke/dataSourceBaseInfo2'
import dataSourceMainSickControl from '../models/stroke/dataSourceMainSickControl'
import dataSourceMainSickControl2 from '../models/stroke/dataSourceMainSickControl2'
import dataSourceMainSickControl3 from '../models/stroke/dataSourceMainSickControl3'
import dataSourceMainSickControl4 from '../models/stroke/dataSourceMainSickControl4'
import dataSourceMainSickControl5 from '../models/stroke/dataSourceMainSickControl5'
import dataSourceMainSickControl6 from '../models/stroke/dataSourceMainSickControl6'
import dataSourceLifeStyleGuide from '../models/stroke/dataSourceLifeStyleGuide'
import dataSourceTreatmentSituation from '../models/stroke/dataSourceTreatmentSituation'
import dataSourceTreatmentSituation2 from '../models/stroke/dataSourceTreatmentSituation2'
import dataSourceTreatmentSituation3 from '../models/stroke/dataSourceTreatmentSituation3'
import dataSourceCheckBody from '../models/stroke/dataSourceCheckBody'
import dataSourceCheckLab from '../models/stroke/dataSourceCheckLab'
export default {
data(){
return {
domain: '',//通过接口获取白名单域名
needRule: true, //是否动态开启验证
showModule: true, //是否隐藏表单模块
canRender: true,
valid: false,
validList: [],
moduleList: [],//模块列表
planPatientsTimesId: '',
scaleNo: '',
doctorId: '',
planTimesId: '',
addComponents: [],
addComponentsSourceList: [],
formData: {},//整个表单对象
}
},
components: {
FormScale,
},
props: {
scaleType: String,//病种类型
checkStart: Boolean,
saveWay: Number,
showBtn: String,
},
watch: {
checkStart(val){
if(val){
this.validList = [];
for(let i=0;i<this.addComponents.length;i++){
let formName = this.addComponents[i].formName;
// 将每个模块的fornName对应后台的表名放到表单对象
this.formData[formName] = this.addComponents[i].formObject;
if(formName==='stroke_006'||formName==='stroke_014'||formName==='stroke_015'){
this.setRuleToTrue(i)
}
this.$nextTick(()=>{
// saveWay=1是提交,进行校验,2是暂存,不需要校验,直接发送请求
if(this.saveWay==1){
if(this.$refs['form' + i].length > 0){
this.$refs['form' + i][0].validate((valid) => {
this.validList.push(valid);
});
}
}
})
}
this.$nextTick(()=>{
// saveWay=1是提交,进行校验,2是暂存,不需要校验,直接发送请求
if(this.saveWay==1){
for(let k=0;k<this.validList.length;k++){
if(!this.validList[k]){
this.$emit('checkEnd',false);
this.valid = false;
this.$nextTick(() => {
// 如果表单未完善,跳转到该表单模块
document.querySelector(`#form${k}`).scrollIntoView(true);
})
return;
}else{
this.valid = true;
}
}
if(this.valid){
this.dataSubmit(()=>{
updateScalesStatus({
fuPlanPatientTimesId: this.planPatientsTimesId,
planTimesId: this.planTimesId,
resourceId: this.scaleNo
})
});
}
}else{
this.dataSubmit();
}
this.$emit('checkEnd',false);
})
}
},
showModule(val){
this.addComponents.forEach((item,index)=>{
if(index >= 3){
this.addComponents[index].showModule = val;
}
})
},
needRule(val){
this.addComponents.forEach((item,index)=>{
let formName = item.formName;
if(formName==='stroke_006'||formName==='stroke_014'||formName==='stroke_015'){
this.addComponents[index].ruleNew = val;
this.setRuleToTrue(index);
// if(this.$refs['form' + index].length > 0){
// this.$refs['form' + index][0].resetFields();
// }
}
})
}
},
created(){
this.planPatientsTimesId = this.$route.query.planPatientsTimesId
this.scaleNo = this.$route.query.scaleNo
this.doctorId = this.$route.query.doctorId
this.planTimesId = this.$route.query.planTimesId;
// 获取量表类型
this.initScaleType();
// 获取白名单域名
this.getWhiteDomain();
sessionStorage.setItem('needRule',this.needRule);
},
methods: {
// 获取量表类型
initScaleType(){
this.addComponentsSourceList = [
{name: 'BaseInfo0',formObject: {},showModule: true,formName: 'stroke_001',className: 'obj-form-title',dataSource: dataSourceBaseInfo0(this), hideTitle: true, title: '一、量表脑卒中随访人员信息表'},
{name: 'BaseInfo',formObject: {},showModule: true,formName: 'stroke_002',className: 'obj-form-title',dataSource: dataSourceBaseInfo(this), title: '一、基本信息'},
{name: 'BaseInfo2',formObject: {},showModule: true,formName: 'stroke_003',className: 'obj-form-title',dataSource: dataSourceBaseInfo2(this), hideTitle: true, title: '一、基本信息'},
{name: 'LifeStyleGuide',formObject: {},showModule: true,formName: 'stroke_004',className: 'obj-form-title',dataSource: dataSourceLifeStyleGuide(this), title: '二、随访期间生活方式'},
{name: 'MainSickControl',formObject: {},showModule: true,formName: 'stroke_005',className: 'obj-form-title',dataSource: dataSourceMainSickControl(this), title: '三、随访期间主要病史及控制情况-脑血管病'},
{name: 'MainSickControl2',formObject: {},showModule: true,formName: 'stroke_006',className: 'obj-form-title',dataSource: dataSourceMainSickControl2(this), hideTitle: true,ruleNew:true, title: '三、随访期间主要病史及控制情况-MRS评分(卒中患者12个月随访必填)'},
{name: 'MainSickControl3',formObject: {},showModule: true,formName: 'stroke_007',className: 'obj-form-title',dataSource: dataSourceMainSickControl3(this), hideTitle: true, title: '三、随访期间主要病史及控制情况-心脏病'},
{name: 'MainSickControl4',formObject: {},showModule: true,formName: 'stroke_008',className: 'obj-form-title',dataSource: dataSourceMainSickControl4(this), hideTitle: true, title: '三、随访期间主要病史及控制情况-高血压'},
{name: 'MainSickControl5',formObject: {},showModule: true,formName: 'stroke_009',className: 'obj-form-title',dataSource: dataSourceMainSickControl5(this), hideTitle: true, title: '三、随访期间主要病史及控制情况-血脂异常'},
{name: 'MainSickControl6',formObject: {},showModule: true,formName: 'stroke_010',className: 'obj-form-title',dataSource: dataSourceMainSickControl6(this), hideTitle: true, title: '三、随访期间主要病史及控制情况-糖尿病'},
{name: 'TreatmentSituation',formObject: {},showModule: true,formName: 'stroke_011',className: 'obj-form-title',dataSource: dataSourceTreatmentSituation(this), title: '四、本次随访期间血管病变的外科手术或介入治疗情况'},
{name: 'TreatmentSituation2',formObject: {},showModule: true,formName: 'stroke_012',className: 'obj-form-title',dataSource: dataSourceTreatmentSituation2(this), hideTitle: true, title: '四、本次随访期间血管病变的外科手术或介入治疗情况-冠状动脉'},
{name: 'TreatmentSituation3',formObject: {},showModule: true,formName: 'stroke_013',className: 'obj-form-title',dataSource: dataSourceTreatmentSituation3(this), hideTitle: true, title: '四、本次随访期间血管病变的外科手术或介入治疗情况-出血性卒中外科治疗'},
{name: 'CheckBody',formObject: {bmi: 0,},showModule: true,formName: 'stroke_014',className: 'obj-form-title',dataSource: dataSourceCheckBody(this), ruleNew:true,title: '五、体格检查(高危人群12个月随访必做)'},
{name: 'CheckLab',formObject: {},showModule: true,formName: 'stroke_015',className: 'obj-form-title',dataSource: dataSourceCheckLab(this),ruleNew:true, title: '六、实验室检查(高危人群12个月随访必填)'},
]
},
// 获取白名单域名
getWhiteDomain(){
getDomain().then(res=>{
if(res.code=='000000'){
this.domain = res.data;
// 获取量表模块
this.getFormModules();
if(this.showBtn!='0'){
// 获取量表详情
this.getFormDetail();
}
}else{
this.$message({
message: res.message,
type: 'error'
});
}
})
},
// 动态开启验证开关
setRuleToTrue(index){
this.addComponents[index].dataSource.forEach((item,k)=>{
if(item.rules && item.rules.length > 0){
if(!this.needRule){
this.addComponents[index].dataSource[k].rules[0].required = true;
}else{
this.addComponents[index].dataSource[k].rules[0].required = false;
}
}
})
},
// 获取展示的模块
getFormModules(){
getScaleModels(this.domain,this.scaleNo).then(res=>{
if(res.code=='000000'){
this.moduleList = res.data;
for(let i=0;i<this.moduleList.length;i++){
for(let j=0;j<this.addComponentsSourceList.length;j++){
if(this.moduleList[i]==this.addComponentsSourceList[j].formName){
this.addComponents.push(this.addComponentsSourceList[j])
}
}
}
}else{
this.$message({
message: res.message,
type: 'error'
});
}
})
},
// 获取量表详情
getFormDetail(){
getScaleDetail(this.domain,this.planPatientsTimesId,this.scaleNo).then(res=>{
this.formData = res.data
let keysList = Object.keys(this.formData);
if(keysList.length > 0){
for(let i=0;i<this.addComponents.length;i++){
let formName = this.addComponents[i].formName;
if(this.formData[formName]){
let investigationState = this.formData[formName].investigationState;
let inTurn = this.formData[formName].inTurn;
if( ( investigationState === '失访' || investigationState === '死亡' ) ){
this.showModule = false;
}
if(inTurn == '12个月'){
this.needRule = false;
}
this.addComponents[i].formObject = this.formData[formName];
}
// 量表字段回显,会触发change校验,所以这里拿到数据渲染页面后,重置验证
if(this.$refs['form' + i].length > 0){
this.$refs['form' + i][0].resetFields();
}
}
this.canRender = true;
this.$forceUpdate();
}
})
},
// 提交量表
dataSubmit(callback){
// if(this.valid){
// console.log(this.formData)
this.formData.doctorId = parseFloat(this.doctorId);
this.formData.saveWay = parseFloat(this.saveWay);
this.formData.planPatientsTimesId = parseFloat(this.planPatientsTimesId);
this.formData.scaleNo = this.scaleNo;
this.formData.isLine = 2;
// console.log(JSON.stringify(this.formData))
postScale(this.domain,this.formData).then(res=>{
if(res.code=='000000'){
let doMsg = (this.saveWay==1) ? '提交成功' : '保存成功';
this.$message({
message: doMsg,
type: 'success'
});
if(callback){
callback();
}
setTimeout(()=>{
this.$router.push({
path: '/followup/record-manage/record-list'
})
},1000)
}else{
let doMsg = (this.saveWay==1) ? '提交失败' : '保存失败';
this.$message({
message: doMsg,
type: 'error'
});
}
});
// }
// this.$emit('checkEnd',false);
},
},
}
</script>
<style scoped lang="scss">
.form-wrap{
.content-box{
.title{
line-height: 60px;
height: 60px;
font-weight: bold;
font-size: 22px;
border-bottom: 1px dashed #ccc;
}
}
}
</style>
<template>
<div class="record-list-wrapper">
<bread-crumb :curmbFirst="curmbFirst" :curmbSecond="curmbSecond"></bread-crumb>
<div class="record-list-content f-main-content screenSet">
<div class="page-title">录入管理</div>
<div class="search-div">
<div class="search-input">
<el-form ref="serchForm" :model="searchData" :inline="true" label-suffix=":" label-width="125px" size="small">
<el-form-item label="随访计划名称">
<el-input v-model="searchData.planName" placeholder="请输入关键词" style="width: 250px" clearable></el-input>
</el-form-item>
<el-form-item label="随访时间范围">
<el-date-picker
v-model="timeRangeList"
type="datetimerange"
range-separator="至"
start-placeholder="开始日期"
end-placeholder="结束日期"
value-format="yyyy-MM-dd HH:mm:ss"
clearable
style="width:400px;">
</el-date-picker>
</el-form-item>
<el-form-item label="姓名">
<el-input v-model="searchData.nickname" placeholder="请输入姓名" clearable></el-input>
</el-form-item>
<el-form-item label="手机号">
<el-input v-model="searchData.mobilePhone" placeholder="请输入手机号" maxlength="11" clearable></el-input>
</el-form-item>
</el-form>
</div>
<div class="search-btn">
<el-button class="button-green" size="small" type="primary" @click="search(1)">查询</el-button>
<el-button class="button-white" size="small" plain @click="reseat">重置</el-button>
</div>
</div>
<div class="table-content">
<el-radio-group v-model="activeName" @change="handlerClick" size="small">
<el-radio-button label="">全部({{recordList.count}})</el-radio-button>
<el-radio-button label="2">已完成({{recordList.finishedCount}})</el-radio-button>
<el-radio-button label="1">未完成({{recordList.unfinishedCount}})</el-radio-button>
</el-radio-group>
<el-table :data="recordList.enteringDtos" style="width: 100%;margin-top: 20px;">
<el-table-column prop="nickname" label="姓名" min-width="100" align="center">
<template slot-scope="scope">
<!--<span style="cursor: pointer" @click="visitDetail(scope.row)">{{scope.row.nickname}}</span>-->
<el-button type="text" @click="visitDetail(scope.row)">{{scope.row.nickname}}</el-button>
</template>
</el-table-column>
<el-table-column prop="mobilePhone" label="手机号" min-width="100" align="center"></el-table-column>
<el-table-column prop="name" label="随访计划名称" min-width="150" align="center"></el-table-column>
<el-table-column prop="followupType" label="随访时间" min-width="200" align="center">
<template slot-scope="scope">
<span>{{scope.row.fuPlanInfo}}</span><br/>
<span v-if="scope.row.fuPlanExecuteTime">{{scope.row.fuPlanExecuteTime}}</span>
<span v-if="!scope.row.fuPlanExecuteTime && scope.row.appointmentTime">{{scope.row.appointmentTime}}</span><br/>
<span v-if="!scope.row.fuPlanExecuteTime && !scope.row.appointmentTime">{{scope.row.fuPlanTime}}</span>
</template>
</el-table-column>
<el-table-column prop="status" label="随访状态" min-width="100" align="center">
<template slot-scope="scope">
<span :class="scope.row.status == 1 ? 'status-span': ''">{{ scope.row.status | statusFileter }}</span>
</template>
</el-table-column>
<el-table-column label="操作" fixed="right" align="center" min-width="210">
<template slot-scope="scope">
<el-button class="btn-right-class" type="text" @click="editRow(scope.row)">随访录入</el-button>|
<el-button class="btn-right-class" type="text" @click="changeStatusRow(scope.row)"> 变更随访状态</el-button>
<!--|<el-button type="text" @click="sendRow(scope.row)">发送患教</el-button>-->
</template>
</el-table-column>
</el-table>
<el-row type="flex" justify="end" class="margin-top20">
<el-pagination
background
v-if="hasData"
@size-change="handleSizeChangePre"
@current-change="handleCurrentChangePre"
layout="total, sizes, prev, pager, next, jumper"
:current-page="paginationSet.pageNo"
:page-sizes="paginationSet.pageSizes"
:page-size="paginationSet.pageSize"
:total="paginationSet.total">
</el-pagination>
</el-row>
</div>
</div>
<followup-detail :dialogFormVisible="dialogDetailShow" @closeDetail="closeDetail" :enteringInfo="enteringInfo"></followup-detail>
<change-followup-status :isShowChangeDialog="isShowChangeDialog" :statusForm="statusForm" @closeChangeStatus="closeChangeStatus"></change-followup-status>
<el-dialog title="选择量表"
:visible.sync="selectFormShow"
center
:close-on-click-modal="false"
:close-on-press-escape="false"
width="400px"
:before-close="closeForm">
<div class="list-content">
<p v-for="(item, index) in formList.scalesList" :key="index" @click="goFormView(item)">{{item.sendContent}}</p>
</div>
</el-dialog>
</div>
</template>
<script>
import BreadCrumb from "@/components/breadcrumb";
import followupDetail from "./dialog/followupDetail";
import ChangeFollowupStatus from "./dialog/change-followup-status";
import { getSaasDomain } from '@/utils/index'
import { mapState,mapGetters, mapActions } from 'vuex';
export default {
components:{
BreadCrumb,
followupDetail,
ChangeFollowupStatus
},
data(){
return{
curmbFirst: '随访管理',
curmbSecond: '录入管理',
timeRangeList: [],
searchData: {
planName: '',
beginTime: '',
endTime: '',
nickname: '',
mobilePhone: ''
},
activeName: '',
paginationSet: {
pageNo: 1,
pageSize: 10,
total: 0,
pageSizes: [10,20,50,100]
},
statusForm: {},
enteringRow: {},
dialogDetailShow: false,
isShowChangeDialog: false,
hasData: false,
selectFormShow: false,
ScaleData: {}
}
},
computed: {
...mapState('recordManage',{
recordList: state => state.recordList,
enteringInfo: state => state.enteringInfo,
formList: state => state.formList,
}),
...mapGetters([
'_token',
])
},
created() {
this.search(1);
},
mounted() {},
methods: {
...mapActions('recordManage', ['getRecordList', 'getEnteringInfo', 'getFormList']),
async search(currentPage){
if(this.timeRangeList) {
this.searchData.beginTime = this.timeRangeList[0];
this.searchData.endTime = this.timeRangeList[1];
}else {
this.searchData.beginTime = '';
this.searchData.endTime = '';
}
await this.getRecordList({
...this.searchData,
status: this.activeName,
pageNo: currentPage || this.paginationSet.pageNo,
pageSize: this.paginationSet.pageSize,
});
if(this.recordList.enteringDtos){
if(this.recordList.enteringDtos.length > 0) {
this.hasData = true;
}else {
this.hasData = false;
}
}
const {pageNo, pageSize, count, finishedCount, unfinishedCount} = this.recordList;
if(this.activeName == ''){
this.paginationSet.total = count;
}else if(this.activeName == 2){
this.paginationSet.total = finishedCount;
}else if(this.activeName == 1){
this.paginationSet.total = unfinishedCount;
}
this.paginationSet = {
...this.paginationSet,
pageNo,
pageSize: pageSize,
}
},
reseat(){
this.searchData.planName = '';
this.searchData.nickname = '';
this.searchData.mobilePhone = '';
this.timeRangeList = [];
this.searchData.beginTime = '';
this.searchData.endTime = '';
this.search(1);
},
async visitDetail(row){
await this.getEnteringInfo({patientId:row.patientId,fuPlanPatientTimesId:row.fuPlanPatientTimesId});
this.dialogDetailShow = true;
// this.enteringRow = row;
},
closeDetail(val){
this.dialogDetailShow = val;
},
handlerClick(){
this.search(1);
},
async editRow(row){
await this.getFormList(row.fuPlanTimesId); //获取量表列表
//获取量表列表情况
if(this.formList.scalesList.length > 1){
this.selectFormShow = true
this.ScaleData = {
doctorId: this.formList.doctorId,
planPatientsTimesId: row.fuPlanPatientTimesId
}
}else if(this.formList.scalesList.length === 1){
this.$router.push({path: '/followup/record-manage/form-template',
query: {doctorId: this.formList.doctorId, scaleNo: this.formList.scalesList[0].resourceId, planPatientsTimesId: row.fuPlanPatientTimesId,planTimesId : row.planTimesId, showBtn: 1}})
}else {
this.$message.warning('暂无量表!')
}
// 不区分量表列表长度问题,直接调试量表录入
// this.$router.push({
// name: 'formTemplate',
// params: {
// data: row
// }
// })
},
changeStatusRow(row){
this.statusForm = row;
this.isShowChangeDialog = true;
},
sendRow(row){
let saasUrl = getSaasDomain(`/pica-frontend/patientEduManage/pica_patient_edu_manage.html#/pageTab/message?patientId=${row.patientId}&nickname=${row.nickname}&token=${this._token}`);
// let saasUrl = getSaasDomain(`/pica-frontend/patientEduManage/pica_patient_edu_manage.html#/pageTab/message?patientId=${row.patientId}&nickname=${row.nickname}&token=8143DC2A026B4602BF7B746FB5AEE9A1`);
window.open(saasUrl)
},
handleSizeChangePre(pageSize){
this.paginationSet['pageSize'] = pageSize;
this.paginationSet['pageNo'] = 1;
this.search();
},
handleCurrentChangePre(pageNo){
this.paginationSet['pageNo'] = pageNo;
this.search();
},
closeChangeStatus(val){
this.isShowChangeDialog = val;
this.search();
// let getArguments = arguments[0];
// this.isShowChangeDialog = getArguments[0];
// this.statusForm = getArguments[1];
},
goFormView(item) {
this.selectFormShow = false;
this.$router.push({path: '/followup/record-manage/form-template',
query: {doctorId: this.ScaleData.doctorId, scaleNo: item.resourceId, planPatientsTimesId: this.ScaleData.planPatientsTimesId,planTimesId : item.planTimesId, showBtn: 1}});
},
closeForm() {
this.selectFormShow = false;
},
},
filters: {
statusFileter: function(value) {
if (!value && value != 0) {
return '';
} else {
let hash = {
1: '未完成',
2: '已完成'
};
return hash[value];
}
},
},
}
</script>
<style scoped lang="scss">
@import '../../../style/followup/followup-common';
@import '../../../style/followup/element-reset.css';
.record-list-wrapper{
.record-list-content{
.search-input{
max-width: none;
flex: 1;
}
.margin-top20{
margin-top: 20px;
}
.status-span{
color: $picaGreen;
}
}
.list-content{
p{
cursor: pointer;
line-height: 30px;
text-decoration: underline;
color: $picaGreen;
}
}
}
</style>
<template>
<div class="dialog-wrap">
<el-dialog title="变更预约"
:visible.sync="reservationDialog"
v-if="isChangeReservation"
center
:close-on-click-modal="false"
:close-on-press-escape="false"
:before-close="closeChangeReserve1">
<el-form
ref="reservationForm"
:model="reservationForm"
:rules="rules"
label-suffix=":"
label-width="120px">
<el-form-item label="变更居民">
<span>{{reservationForm.nickname}}</span>
</el-form-item>
<el-form-item label="预约状态" required prop="appointStatus">
<el-radio-group v-model="reservationForm.appointStatus">
<el-radio label="3">已接受</el-radio>
<el-radio label="4">已拒绝</el-radio>
</el-radio-group>
</el-form-item>
<!--appointStatus:3是已接受,4是已拒绝-->
<el-form-item v-if="reservationForm.appointStatus == 3" label="预约时间" required>
<div style="display: flex;">
<el-form-item prop="appointmentDate">
<el-date-picker
type="date"
v-model="reservationForm.appointmentDate"
placeholder="请选择预约日期"
value-format="yyyy-MM-dd"
value="yyyy-MM-dd"
:picker-options="pickerOptions"
@change="changeHandler">
</el-date-picker>
</el-form-item>
<el-form-item prop="appointmentRange">
<el-select v-model="reservationForm.appointmentRange" placeholder="请选择时间段" clearable style="margin-left:20px;">
<el-option
v-for="item in timeRangeOptions"
:key="item.value"
:label="item.label"
:value="item.label">
</el-option>
</el-select>
</el-form-item>
</div>
<p class="warn-tips" v-if="reservationForm.appointmentDate">该日期已经成功预约{{getRevervationNum}}人,请确保能在此时间段完成预约的随访任务</p>
</el-form-item>
<el-form-item label="变更原因" prop="reason">
<el-input type="textarea" v-model="reservationForm.changeReason" placeholder="请输入变更原因" maxlength="30" rows="3" style="width:60%;"></el-input>
</el-form-item>
</el-form>
<div slot="footer" class="dialog-footer">
<el-button @click="closeChangeReserve1" plain>取 消</el-button>
<el-button type="primary" @click="closeChangeReserve('reservationForm')">确 定</el-button>
</div>
</el-dialog>
</div>
</template>
<script>
import { changeReservationStatus } from '@/utils/followup/followapis'
import { mapState, mapActions } from 'vuex'
export default {
components: {},
data(){
return{
reservationDialog: true,
timeRangeOptions: [
{
value: 1,
label: '6:00-7:00'
}, {
value: 2,
label: '7:00-8:00'
}, {
value: 3,
label: '8:00-9:00'
}, {
value: 4,
label: '9:00-10:00'
}, {
value: 5,
label: '10:00-11:00'
}, {
value: 6,
label: '11:00-12:00'
}, {
value: 7,
label: '12:00-13:00'
}, {
value: 8,
label: '13:00-14:00'
}, {
value: 9,
label: '14:00-15:00'
}, {
value: 10,
label: '15:00-16:00'
}, {
value: 11,
label: '16:00-17:00'
}, {
value: 12,
label: '17:00-18:00'
}, {
value: 13,
label: '18:00-19:00'
}, {
value: 14,
label: '19:00-20:00'
}, {
value: 15,
label: '20:00-21:00'
}],
rules: {
appointStatus: [{ required: true, message: '请选择预约状态', trigger: 'change' }],
appointmentDate: [{ required: true, message: '请选择预约日期', trigger: 'change' }],
appointmentRange: [{ required: true, message: '请选择时间段', trigger: 'change' }],
},
pickerOptions: {
disabledDate(time) {
return time.getTime() < Date.now() - 8.64e7
}
}
}
},
props: {
isChangeReservation: {
type: Boolean,
default: false
},
reservationForm: {
type: Object,
default: function () {
return {}
}
}
},
watch: {
reservationForm(val) {
this.reservationForm = val;
}
},
computed: {
...mapState('reservationManage',{
getRevervationNum: state => state.getRevervationNum,
})
},
mounted(){
},
methods: {
...mapActions('reservationManage', ['getReservationPatients']),
closeChangeReserve1(){
if (this.$refs['reservationForm']) {
this.$refs['reservationForm'].resetFields();
}
this.$emit('closeChangeReserve',false)
},
closeChangeReserve(formName){
this.$refs[formName].validate((valid) => {
if (valid) {
changeReservationStatus({
...this.reservationForm
}).then(({data}) => {
this.$message.success('变更成功!');
this.$emit('closeChangeReserve',false);
this.$refs['reservationForm'].resetFields();
})
} else {
return false;
}
});
},
changeHandler(val) {
this.getReservationPatients({makeAnAppointDate: val});
// console.log('日期',this.getRevervationNum)
},
}
}
</script>
<style scoped lang="scss">
@import '../../../../style/followup/followup-common';
@import '../../../../style/followup/element-reset.css';
.warn-tips{
font-size: 12px;
color: #e6a23c;
padding-top: 5px;
}
.el-dialog{
min-width: 580px!important;
}
</style>
<template>
<div class="dialog-wrap">
<el-dialog title=""
:visible.sync="noEnoughDialog"
v-if="isNoEnoughShow"
center
:close-on-click-modal="false"
:close-on-press-escape="false"
:before-close="closeTipsDialog">
<div class="no-enough-content">
<h3>余额不足提醒</h3>
<p class="section">您的短信额度已欠费,请前往「云鹊医App-个人中心-啾啾币中心」兑换短信额度后再进行预约<br/>您也可以联系云鹊医客服购买短信额度,客服电话:400-920-8877</p>
<p class="tip">提示:微信推送不消耗额度,建议您与居民绑定微信,关注云鹊健康微信公众号</p>
</div>
<div slot="footer" class="dialog-footer">
<el-button type="primary" @click="closeTipsDialog">我知道了</el-button>
</div>
</el-dialog>
</div>
</template>
<script>
export default {
components: {},
data(){
return{
noEnoughDialog: true,
}
},
props: {
isNoEnoughShow: {
type: Boolean,
default: false
}
},
computed: {
},
mounted(){
},
methods: {
closeTipsDialog(){
this.$emit('closeTipsDialog',false)
},
}
}
</script>
<style scoped lang="scss">
@import '../../../../style/followup/followup-common';
@import '../../../../style/followup/element-reset.css';
.warn-tips{
font-size: 12px;
color: #e6a23c;
}
.no-enough-content{
text-align: center;
h3{
color: #303133;
font-size: 18px;
padding-bottom: 30px;
}
.section{
line-height: 30px;
padding:20px;
color: #f56c6c;
}
.tip{
font-size: 12px;
padding: 10px 0;
}
}
</style>
<template>
<div class="dialog-wrap">
<el-dialog title="预约随访居民"
:visible.sync="reservationDialog"
v-if="isDialogShow"
center
:close-on-click-modal="false"
:close-on-press-escape="false"
:before-close="closeSendReserve1">
<el-form
ref="reservationForm"
:model="reservationForm"
:rules="rules"
label-suffix=":"
label-width="120px"
:label-position="'left'"
size="small">
<el-form-item label="已选居民">
<span>{{checkData.sendWechatResidentSize + checkData.sendMobileResidentSize}}</span>
<!--<span>{{selectList.length}}</span>-->
<span>(微信发送{{checkData.sendWechatResidentSize}}人;短信发送{{checkData.sendMobileResidentSize}}人)</span>
</el-form-item>
<el-form-item label="预约时间" required>
<div style="display: flex;">
<el-form-item prop="appointmentDate">
<el-date-picker
type="date"
v-model="reservationForm.appointmentDate"
placeholder="请选择预约日期"
value-format="yyyy-MM-dd"
value="yyyy-MM-dd"
:picker-options="pickerOptions" @change="changeHandler">
</el-date-picker>
</el-form-item>
<el-form-item prop="appointmentRange">
<el-select v-model="reservationForm.appointmentRange" placeholder="请选择时间段" clearable style="margin-left:20px;">
<el-option
v-for="item in timeRangeOptions"
:key="item.value"
:label="item.label"
:value="item.label">
</el-option>
</el-select>
</el-form-item>
</div>
<p class="warn-tips" v-if="reservationForm.appointmentDate">该日期已经成功预约{{getRevervationNum}}人,请确保能在此时间段完成预约的随访任务</p>
</el-form-item>
</el-form>
<div class="reservation-content content-list" v-if="reservationForm.appointmentDate && reservationForm.appointmentRange">
<div class="item">
<span class="title">发送内容:</span>
<p>{{userName}}医生邀请您在{{reservationForm.appointmentDate}}{{reservationForm.appointmentRange}}进行随访,请确认是否参加。</p>
</div>
<div class="item">
<span class="title">本次推送:</span>
<p>{{checkData.sendWechatAppointSize + checkData.sendMobileSmsCount}}条(微信不限额推送{{checkData.sendWechatAppointSize}}条;使用短信额度推送{{checkData.sendMobileSmsCount}}条)</p>
</div>
<div class="item">
<span class="title">推送成功后剩余额度:</span>
<p>{{ checkData.sendedAvailableNum}}</p>
</div>
<p>提示:微信推送不消耗额度,建议您与居民绑定微信,关注云鹊健康微信公众号</p>
</div>
<div slot="footer" class="dialog-footer">
<el-button @click="closeSendReserve1" plain>取消发送</el-button>
<el-button type="primary" @click="closeSendReserve('reservationForm')">立即发送</el-button>
</div>
</el-dialog>
<no-enough :isNoEnoughShow="isNoEnoughShow" @closeTipsDialog="closeTipsDialog"></no-enough>
</div>
</template>
<script>
import {sendReservation, getCheckReservation} from '@/utils/followup/followapis'
import NoEnough from './no-enough'
import { mapState, mapActions } from 'vuex'
export default {
components: {NoEnough},
data(){
return{
reservationDialog: true,
sendFlagLast: null,
reservationForm: {
appointmentDate: '',
appointmentRange: '',
},
timeRangeOptions: [
{
value: 1,
label: '6:00-7:00'
}, {
value: 2,
label: '7:00-8:00'
}, {
value: 3,
label: '8:00-9:00'
}, {
value: 4,
label: '9:00-10:00'
}, {
value: 5,
label: '10:00-11:00'
}, {
value: 6,
label: '11:00-12:00'
}, {
value: 7,
label: '12:00-13:00'
}, {
value: 8,
label: '13:00-14:00'
}, {
value: 9,
label: '14:00-15:00'
}, {
value: 10,
label: '15:00-16:00'
}, {
value: 11,
label: '16:00-17:00'
}, {
value: 12,
label: '17:00-18:00'
}, {
value: 13,
label: '18:00-19:00'
}, {
value: 14,
label: '19:00-20:00'
}, {
value: 15,
label: '20:00-21:00'
}],
isNoEnoughShow: false, //余额不足dialog展示
rules: {
appointmentDate: [{ required: true, message: '请选择预约日期', trigger: 'change' }],
appointmentRange: [{ required: true, message: '请选择时间段', trigger: 'change' }],
},
pickerOptions: {
disabledDate(time) {
return time.getTime() < Date.now() - 8.64e7
}
}
}
},
props: {
isDialogShow: {
type: Boolean,
default: false
},
checkData: {},
selectList: { //已选择发送人员list
type: Array,
default: [],
},
validContents: {
type: Array,
default: [],
}
},
watch: {
selectList(val) {
this.selectList = val;
}
},
computed: {
...mapState('reservationManage',{
getRevervationNum: state => state.getRevervationNum,
userName: state => state.userName,
// checkRevervationData: state => state.checkRevervationData,
})
},
mounted(){
},
methods: {
...mapActions('reservationManage', ['getReservationPatients']),
changeHandler(val) {
this.getReservationPatients({makeAnAppointDate: val});
},
closeTipsDialog(val){
this.isNoEnoughShow = val;
},
closeSendReserve1(){
if (this.$refs['reservationForm']) {
this.$refs['reservationForm'].resetFields();
}
this.$emit('closeSendReserve',false)
},
closeSendReserve(formName){
let _self = this;
_self.$refs[formName].validate((valid) => {
if (valid) {
//校验额度是否不够
getCheckReservation({
content: '',
validContents: _self.validContents
}).then(({data}) => {
const sendFlagLast = data.sendFlag;
const inServiceTimeFlag = data.inServiceTimeFlag;
if(sendFlagLast){ //额度还可用
sendReservation({
...this.reservationForm,
patientAppointList: _self.selectList
}).then(({data}) => {
_self.$refs['reservationForm'].resetFields();
_self.$emit('closeSendReserve',false);
})
}else {
if(!inServiceTimeFlag) {
_self.$message.warning('已超过发送时间范围!');
return;
}else {
// 额度不足
_self.isNoEnoughShow = true;
return;
}
}
})
} else {
return false;
}
});
},
}
}
</script>
<style scoped lang="scss">
@import '../../../../style/followup/followup-common';
@import '../../../../style/followup/element-reset.css';
.warn-tips{
font-size: 12px;
color: #e6a23c;
line-height: 15px;
/*padding-top: 5px;*/
}
.el-dialog{
min-width: 580px!important;
}
.reservation-content{
padding: 10px;
border-top: 1px dashed #efefef;
&.content-list{
.item{
display: flex;
line-height: 28px;
padding: 10px 0;
.title{
display: inline-block;
margin-right: 15px;
}
p{
flex: 1;
}
}
}
}
</style>
<template>
<router-view></router-view>
</template>
<script>
export default {
name: "layout"
}
</script>
<style scoped>
</style>
<template>
<div class="resident-list">
<bread-crumb
:curmbFirst="curmbFirst"
:curmbSecond="curmbSecond">
</bread-crumb>
<div class="resident-content f-main-content screenSet">
<p class="page-title">预约管理</p>
<div class="search-div">
<div class="search-input">
<el-form :model="searchData" ref="searchData" :inline="true" :label-width="labelWidth">
<el-form-item label="随访计划名称:" prop="planName">
<el-input v-model="searchData.planName" size="small" placeholder="请输入随访计划名称" clearable></el-input>
</el-form-item>
<el-form-item label="姓名:" prop="nickname">
<el-input v-model="searchData.nickname" size="small" placeholder="请输入姓名" clearable></el-input>
</el-form-item>
<el-form-item label="手机号:" prop="mobilePhone">
<el-input v-model="searchData.mobilePhone" size="small" placeholder="请输入手机号" clearable></el-input>
</el-form-item>
<el-form-item label="随访时间范围:" prop="planTimes" clearable>
<el-date-picker
v-model="searchData.planTimes"
type="daterange"
size="small"
range-separator="至"
start-placeholder="开始日期"
end-placeholder="结束日期"
format="yyyy-MM-dd"
value-format="yyyy-MM-dd"
:editable="false"
style="width: 380px;">
</el-date-picker>
</el-form-item>
<!--<el-form-item label="居民预约状态:" prop="timeStatus">
<el-select v-model="searchData.timeStatus">
<el-option
v-for="item in statusOptions"
:key="item.value"
:label="item.label"
:value="item.value">
</el-option>
</el-select>
</el-form-item>-->
</el-form>
</div>
<div class="search-btn">
<el-button class="button-green" type="primary" size="small" @click="searchReservationList">查询</el-button>
<el-button class="button-white" plain size="small" @click="resetSearchData('searchData')">重置</el-button>
</div>
</div>
<div class="reservation-table table-content">
<el-radio-group v-model="status" size="small">
<el-radio-button label="">全部({{reservationList.count}})</el-radio-button>
<el-radio-button label="1">未发送({{reservationList.unSendCount}})</el-radio-button>
<el-radio-button label="2">待确认({{reservationList.waitAcceptCount}})</el-radio-button>
<el-radio-button label="4">已拒绝({{reservationList.refusedCount }})</el-radio-button>
<el-radio-button label="3">已接受({{reservationList.acceptedCount}})</el-radio-button>
</el-radio-group>
<el-button class="button-green" type="primary" size="small" @click="sendReservation">发送预约</el-button>
<el-table
:data="reservationList.enteringDtos"
center
style="width: 100%;margin-top: 20px;"
@selection-change="handleSelectionChange"
:row-key="getRowKeys"
ref="multipleReservation">
<el-table-column
type="selection"
align="center"
:reserve-selection="true">
</el-table-column>
<el-table-column
prop="nickname"
label="姓名"
align="center">
<template slot-scope="scope">
<el-button type="text" @click="goPatientDetail(scope.row)" >{{scope.row.nickname}}</el-button>
</template>
</el-table-column>
<el-table-column
prop="mobilePhone"
label="手机"
align="center">
</el-table-column>
<el-table-column
prop="name"
label="随访计划名称"
align="center">
</el-table-column>
<el-table-column
width="160"
prop="fuPlanTime"
label="随访计划时间"
align="center">
</el-table-column>
<el-table-column
width="160"
label="随访预约时间"
align="center">
<template slot-scope="scope">
<span v-if="scope.row.status==1" style="color: #49C688;">未发送</span>
<span v-else-if="scope.row.status==2">待确认</span>
<span v-else-if="scope.row.status==4" style="color: #D5172E;">已拒绝</span>
<span v-else>{{scope.row.appointmentTime}}</span>
</template>
</el-table-column>
<el-table-column
width="180"
fixed="right"
label="操作"
align="center">
<template slot-scope="scope">
<el-button class="btn-right-class" type="text" @click="sendReservationRow(scope.row)">发送预约</el-button>|
<el-button class="btn-right-class" type="text" @click="changeReserveClick(scope.row)">变更预约</el-button>
</template>
</el-table-column>
</el-table>
<div class="pagination">
<el-pagination
background
v-if="reservationList.enteringDtos"
@size-change="handleSizeChangePre"
@current-change="handleCurrentChangePre"
layout="total, sizes, prev, pager, next, jumper"
:current-page="reservationList.pageNo"
:page-sizes="[10, 20, 50, 100]"
:page-size="reservationList.pageSize"
:total="statusTotal">
</el-pagination>
</div>
</div>
</div>
<send-reservation :isDialogShow="isDialogShow" :checkData="checkRevervationData" :selectList="selectList" @closeSendReserve="closeSendReserve" :validContents="validContents"></send-reservation>
<no-enough :isNoEnoughShow="isNoEnoughShow" @closeTipsDialog="closeTipsDialog"></no-enough>
<change-reservation :isChangeReservation="isChangeReservation" @closeChangeReserve="closeChangeReserve" :reservationForm="needPara"></change-reservation>
<followup-detail :dialogFormVisible="dialogDetailShow" @closeDetail="closeDetail" :enteringInfo="enteringInfo"></followup-detail>
</div>
</template>
<script>
import { mapState, mapActions } from 'vuex';
//面包屑
import BreadCrumb from '@/components/breadcrumb';
import SendReservation from './dialog/send-reservation';
import NoEnough from './dialog/no-enough';
import ChangeReservation from "./dialog/change-reservation";
import followupDetail from "@/views/followup/record-manage/dialog/followupDetail";
export default {
name: "reservation-list",
components: {
ChangeReservation,
BreadCrumb,
SendReservation,
NoEnough,
followupDetail
},
data() {
return {
/*面包屑配置*/
curmbFirst: '随访管理',
curmbSecond: '预约管理',
/*面包屑配置*/
labelWidth: '125px', //标题长度
searchData: {
planName: '',
planTimes: ''
}, //查询数据
status: '', //列表筛选条件
statusOptions: [
{
value: 1,
label: '未完成'
},
{
value: 2,
label: '已完成'
},
{
value: 3,
label: '已过期'
}
], //居民预约状态\
// hasSmsBalance: true, //短信余额是否充足
isDialogShow: false, //发送预约dialog展示
// checkData: {},
isNoEnoughShow: false, //余额不足dialog展示
isChangeReservation: false, //变更预约状态dialog展示
selectionData: [],
selectList: [],
ids: [],
needPara: {},
dialogDetailShow: false,
validContents: [],
getRowKeys(row) {
return row.fuPlanPatientTimesId;
},
statusTotal: null, //每种状态的总数
}
},
created() {
},
mounted() {
if(this.$route.query.planName && this.$route.query.appointTime && this.$route.query.status) {
this.searchData.planName = this.$route.query.planName;
this.searchData.planTimes = [this.$route.query.appointTime,this.$route.query.appointTime];
this.status = this.$route.query.status
this.getReservationList({
planName: this.$route.query.planName,
beginTime: this.$route.query.appointTime,
endTime: this.$route.query.appointTime,
status: this.status
})
} else {
this.getReservationList({
status: this.status
});
}
},
computed: {
...mapState('reservationManage',{
reservationList: state => state.reservationList,
checkRevervationData: state => state.checkRevervationData,
}),
...mapState('recordManage',{
enteringInfo: state => state.enteringInfo,
})
},
methods: {
...mapActions('reservationManage', ['getReservationList','getCheckReservation']),
...mapActions('recordManage', [ 'getEnteringInfo']),
handleSizeChangePre(pageSize) {
this.getReservationList({
pageSize,
status: this.status,
...this.setSearchData()
})
},
handleCurrentChangePre(pageNo) {
this.getReservationList({
pageNo,
status: this.status,
...this.setSearchData()
})
},
searchReservationList() { //查询预约列表
this.getReservationList({
...this.setSearchData(),
status: this.status,
pageNo: 1
})
},
resetSearchData(formName) {
this.$refs[formName].resetFields();
this.getReservationList({
status: this.status
});
},
async goPatientDetail(row) { //预约详情页
await this.getEnteringInfo({patientId: row.patientId,fuPlanPatientTimesId: row.fuPlanPatientTimesId});
this.dialogDetailShow = true;
},
setSearchData() {
const { planName, mobilePhone, timeStatus, nickname } = this.searchData;
let para = {}
if(this.searchData.planTimes) {
para = {
planName,
mobilePhone,
timeStatus,
nickname,
beginTime: this.searchData.planTimes[0],
endTime: this.searchData.planTimes[1],
status: this.status
}
} else {
para = {
planName,
mobilePhone,
timeStatus,
nickname,
status: this.status
}
}
return para;
},
async initCheck() {
await this.getCheckReservation({
// patientIds: this.ids
content: '',
validContents:this.validContents
})
const { sendFlag, inServiceTimeFlag } = this.checkRevervationData
//判断短信余额是否不足
if(sendFlag){
this.isDialogShow = true;
}else {
if(!inServiceTimeFlag) {
this.$message.warning('已超过发送时间范围!');
return;
}else {
this.isNoEnoughShow = true;
}
}
},
sendReservation() {
// console.log('选择人员长度',this.selectionData.length)
if(this.selectionData.length > 100) {
this.$message.warning('每次最多选择100条单条随访进行预约!');
return;
}else if(this.selectionData.length <= 0){
this.$message.warning('请选择要发送预约的居民!');
return;
}else{
this.selectList = this.selectionData;
// 发送预约校验
this.initCheck();
}
},
sendReservationRow(row){
let newList = [];
newList.push({
planId: row.fuPlanId,
patientId: row.patientId,
planName: row.name,
patientsTimesId: row.fuPlanPatientTimesId,
type: row.fuPlanType,
});
this.selectList = newList;
this.validContents = [{
patientId: row.patientId,
size: 1,
}];
// 发送预约校验
this.initCheck();
},
changeReserveClick(row){
this.needPara = {
nickname: row.nickname,
appointmentDate: '',
appointmentRange: '',
planId: row.fuPlanId,
patientId: row.patientId,
planName: row.name,
patientsTimesId: row.fuPlanPatientTimesId,
type: row.fuPlanType,
changeReason: '',
appointStatus: null
};
this.isChangeReservation = true;
},
closeSendReserve(val){
this.isDialogShow = val;
this.getReservationList({
...this.setSearchData(),
status: this.status,
})
this.$refs.multipleReservation.clearSelection();
},
closeTipsDialog(val){
this.isNoEnoughShow = val;
},
closeChangeReserve(val){
this.isChangeReservation = val;
this.getReservationList({
...this.setSearchData(),
status: this.status,
})
},
handleSelectionChange(val){
for(let i in val){
for(let j in val[i]) {
if(j == 'fuPlanId') {
val[i]['planId'] = val[i][j];
// delete val[i]['fuPlanId'];
}
if(j == 'name') {
val[i]['planName'] = val[i][j];
}
if(j == 'fuPlanPatientTimesId') {
val[i]['patientsTimesId'] = val[i][j];
}
if(j == 'fuPlanType') {
val[i]['type'] = val[i][j];
}
}
}
this.selectionData = val;
//统计选择的居民的patientId
let idsArray = [];
if (val.length > 0) {
for(let i=0; i<val.length; i++){
idsArray.push(val[i].patientId)
}
// this.ids = idsArray.join(",")
this.ids = idsArray;
}
let dedupeArr = Array.from(new Set(this.ids))
let count = 0;
let obj = {};//最终返回的数据
dedupeArr.forEach(i => {
count = 0;
this.ids.forEach(j => {
if(i === j){
count++;
}
})
obj[i] = count;
})
let i=0;
let aaa = [];
for(i in obj ){
aaa.push({patientId: i,size: obj[i]});
}
this.validContents = aaa;
},
closeDetail(val){
this.dialogDetailShow = val;
},
},
watch: {
status(val) {
this.getReservationList({
status: val,
pageNo: 1,
pageSize: 10,
...this.setSearchData()
})
this.$refs.multipleReservation.clearSelection();
},
reservationList(val) {
if(this.status == 1) {
this.statusTotal = val.unSendCount
} else if (this.status == 2) {
this.statusTotal = val.waitAcceptCount
} else if (this.status == 3) {
this.statusTotal = val.acceptedCount
} else if(this.status == 4) {
this.statusTotal = val.refusedCount
} else {
this.statusTotal = val.count
}
},
}
}
</script>
<style lang="scss" scoped>
@import '../../../style/followup/followup-common';
@import '../../../style/followup/element-reset.css';
.reservation-table {
.button-green {
float: right;
}
}
</style>
...@@ -3,22 +3,54 @@ ...@@ -3,22 +3,54 @@
<bread-crumb :curmbFirst="curmbFirst"></bread-crumb> <bread-crumb :curmbFirst="curmbFirst"></bread-crumb>
<div class="message-content"> <div class="message-content">
<el-row> <el-row>
<el-col class="visitor" :span="24" v-if="tableData.length > 0"> <el-col class="visitor screenSet" :span="24">
<div class="visitor-title"> <div class="visitor-title">
<div class="title">今日随访:<span style="color:#449284;">10人</span></div> <div class="title">今日随访:
<span class="visitor-more" @click="lookMore">查看更多</span> <span style="color:#449284;margin-right: 10px">{{todayPlansList.length}}</span>
<span class="type-button" :style="{background:(planBtn?'rgba(68,146,132,0.06)':'#ffffff')}" @click="changeTodayPlansList(0)">未完成</span>
<span class="type-button" :style="{background:(!planBtn?'rgba(68,146,132,0.06)':'#ffffff')}" @click="changeTodayPlansList(1)">已过期</span>
</div>
<span class="visitor-more" @click="lookMore(1)">查看更多</span>
</div> </div>
<div class="visitor-info"> <div class="visitor-info">
<el-table <el-table
:data="tableData" :data="todayPlansList"
style="width: 100%"> style="width: 100%">
<el-table-column prop="date" label="预约时间" min-width="30"></el-table-column> <el-table-column prop="patientName" label="姓名" align="center"></el-table-column>
<el-table-column prop="name" label="姓名" min-width="20"></el-table-column> <el-table-column prop="appointTime" label="预约时间" align="center"></el-table-column>
<el-table-column prop="style" label="随访方式" min-width="30"></el-table-column> <el-table-column prop="fuTypeStr" label="随访方式" align="center"></el-table-column>
<el-table-column prop="content" label="随访内容"></el-table-column> <el-table-column prop="content" label="操作" align="center">
<template slot-scope="scope">
<span class="text-btn" @click="goToScale(scope.row)">随访录入</span> | <span class="text-btn" @click="changeFollowStatus(scope.row)">变更随访状态</span>
</template>
</el-table-column>
</el-table> </el-table>
</div> </div>
</el-col> </el-col>
<el-col class="visitor screenSet" :span="24" style="margin-top: 0;margin-bottom: 0;">
<div class="visitor-title">
<div class="title">今日预约
<span class="type-button" :style="{background:(appointBtn?'rgba(68,146,132,0.06)':'#ffffff')}" @click="changeTodayAppointsList(0)" style="margin-left: 10px;">未完成</span>
<span class="type-button" :style="{background:(!appointBtn?'rgba(68,146,132,0.06)':'#ffffff')}" @click="changeTodayAppointsList(1)" >已过期</span>
</div>
<span class="visitor-more" @click="lookMore(2)">查看更多</span>
</div>
<div class="visitor-info">
<el-table
:data="todayAppointsList"
style="width: 100%">
<el-table-column prop="planName" label="随访计划名称" align="center"></el-table-column>
<el-table-column prop="appointTime" label="随访计划时间" align="center"></el-table-column>
<el-table-column prop="appointedCount" label="已经预约" align="center"></el-table-column>
<el-table-column prop="notAppointedCount" label="未预约" align="center"></el-table-column>
<el-table-column prop="content" label="操作" align="center">
<template slot-scope="scope">
<span class="text-btn" @click="goToReservation(scope.row.planName, scope.row.appointTime)">去预约</span>
</template>
</el-table-column>
</el-table>
</div>
</el-col>
<el-col class="message screenSet" :span="24" id="screenSet"> <el-col class="message screenSet" :span="24" id="screenSet">
<div class="message-title">系统消息 <span>今日消息:{{count}}条</span></div> <div class="message-title">系统消息 <span>今日消息:{{count}}条</span></div>
<div class="message-info" v-if="messageList.length > 0"> <div class="message-info" v-if="messageList.length > 0">
...@@ -39,17 +71,33 @@ ...@@ -39,17 +71,33 @@
</el-col> </el-col>
</el-row> </el-row>
</div> </div>
<change-followup-status :isShowChangeDialog="isShowChangeDialog" :statusForm="statusForm" @closeChangeStatus="closeChangeStatus()"></change-followup-status>
<el-dialog title="选择量表"
:visible.sync="selectFormShow"
center
:close-on-click-modal="false"
:close-on-press-escape="false"
width="400px"
:before-close="closeForm">
<div class="list-content">
<p v-for="(item, index) in formList.scalesList" :key="index" @click="goFormView(item)">{{item.sendContent}}</p>
</div>
</el-dialog>
</div> </div>
</template> </template>
<script> <script>
import BreadCrumb from '../components/breadcrumb.vue' import BreadCrumb from '../components/breadcrumb.vue'
import { setTimeout, setInterval } from 'timers' import { setTimeout, setInterval } from 'timers'
import { mapGetters } from 'vuex'
import ChangeFollowupStatus from "./followup/record-manage/dialog/change-followup-status";
import { mapGetters, mapState, mapActions } from 'vuex'
import * as commonUtil from '../utils/utils' import * as commonUtil from '../utils/utils'
let vm = null let vm = null
export default { export default {
components: { components: {
BreadCrumb BreadCrumb,
ChangeFollowupStatus
}, },
data() { data() {
return { return {
...@@ -58,26 +106,55 @@ export default { ...@@ -58,26 +106,55 @@ export default {
spanSecondNum: 12, spanSecondNum: 12,
tableData: [], tableData: [],
count: 0, count: 0,
messageList:[] messageList:[],
planBtn: true,
appointBtn: true,
isShowChangeDialog: false,
statusForm: {},
selectFormShow: false,
ScaleData: {}
} }
}, },
created() { created() {
vm = this vm = this
vm.getSystemData() vm.getSystemData()
vm.getTodayPlansList({
status:0
});
vm.getTodayAppointsList({
status:0
});
/*vm.getTodayOverview({
status:0
});*/
}, },
computed: { computed: {
...mapGetters([ ...mapGetters([
'_token' '_token'
]) ]),
...mapState('workbench', {
todayPlansList: state => state.todayPlansList,
todayAppointsList: state => state.todayAppointsList,
//todayOverview: state => state.todayOverview,
}),
...mapState('recordManage',{
formList: state => state.formList,
}),
}, },
// 挂载到Dom完成时 // 挂载到Dom完成时
mounted: function() { mounted: function() {
commonUtil.resizeHeight() commonUtil.resizeHeight()
}, },
methods: { methods: {
...mapActions('workbench', ['getTodayPlansList', 'getTodayAppointsList', 'getTodayOverview']),
...mapActions('recordManage', ['getFormList']),
// 查看更多 // 查看更多
lookMore() { lookMore(type) {
if(type==1) {
this.$router.push('/followup/record-manage/record-list');
} else if(type == 2) {
this.$router.push('/followup/reservation-manage/reservation-list');
}
}, },
// 获取系统消息数据 // 获取系统消息数据
getSystemData() { getSystemData() {
...@@ -89,18 +166,104 @@ export default { ...@@ -89,18 +166,104 @@ export default {
vm.$message.info(res.message) vm.$message.info(res.message)
} }
}) })
},
changeTodayPlansList(status) {
if(status == 0) {
vm.planBtn = true
} else {
vm.planBtn = false
}
vm.getTodayPlansList({
status: status
});
},
changeTodayAppointsList(status) {
if(status == 0) {
vm.appointBtn = true
} else {
vm.appointBtn = false
}
vm.getTodayAppointsList({
status: status
});
},
goToReservation(planName, appointTime) {
this.$router.push({path: '/followup/reservation-manage/reservation-list', query: {planName: planName, appointTime:appointTime, status: 1}});
},
closeChangeStatus(val){
this.isShowChangeDialog = val;
let status = null
if(this.planBtn == true) {
status = 0
} else {
status = 1
}
this.getTodayPlansList({
status: status
})
},
goFormView(item) {
this.selectFormShow = false
this.$router.push({path: '/followup/record-manage/form-template',
query: {doctorId: this.ScaleData.doctorId, scaleNo: item.resourceId, planPatientsTimesId: this.ScaleData.planPatientsTimesId,planTimesId : item.planTimesId, showBtn: 1}});
},
closeForm() {
this.selectFormShow = false;
},
async goToScale(row) {
await this.getFormList(row.planTimesId); //获取量表列表
//获取量表列表情况
if(this.formList.scalesList.length > 1){
this.selectFormShow = true
this.ScaleData = {
doctorId: this.formList.doctorId,
planPatientsTimesId: row.planPatientTimesId
}
}else if(this.formList.scalesList.length === 1){
this.$router.push({path: '/followup/record-manage/form-template',
query: {doctorId: this.formList.doctorId, scaleNo: this.formList.scalesList[0].resourceId, planPatientsTimesId: row.planPatientTimesId,planTimesId : row.planTimesId, showBtn: 1}})
}else {
this.$message.warning('暂无量表!')
}
},
changeFollowStatus(row) {
this.statusForm = {
fuPlanPatientTimesId: row.planPatientTimesId,
patientId: row.patientId,
nickname: row.patientName,
status: 1,
}
this.isShowChangeDialog = true
} }
} }
} }
</script> </script>
<style lang="scss"> <style lang="scss">
.home-wrap { .home-wrap {
.list-content{
p{
cursor: pointer;
line-height: 30px;
text-decoration: underline;
color: #449284;
}
}
.message-content { .message-content {
.visitor { .visitor {
padding: 0 25px 30px; padding: 0 25px 30px;
margin-bottom: 20px; margin-bottom: 20px;
background: #fff; background: #fff;
margin-top: 88px;
// min-height: 348px; // min-height: 348px;
@media screen and (min-width:1240px) and (max-width:1900px) {
width: 95%;
height: 300px !important;
}
@media screen and (min-width:1900px) {
width: 96.7%;
height: 380px !important;
}
.visitor-title { .visitor-title {
height: 80px; height: 80px;
line-height: 80px; line-height: 80px;
...@@ -117,16 +280,39 @@ export default { ...@@ -117,16 +280,39 @@ export default {
padding: 5px 14px; padding: 5px 14px;
border-radius: 3px; border-radius: 3px;
background: rgba(68,146,132,0.06); background: rgba(68,146,132,0.06);
cursor: pointer;
}
.type-button {
font-size: 12px;
color: #449284;
border: 1px solid rgba(68,146,132,0.3);
padding: 5px 14px;
border-radius: 3px;
/*background: rgba(68,146,132,0.06);*/
background: #ffffff;
cursor: pointer;
} }
} }
.visitor-info { .visitor-info {
margin-right: 20px; margin-right: 20px;
.text-btn:hover {
cursor: pointer;
color: #449284;
}
} }
} }
.message { .message {
padding: 0 25px 30px; padding: 0 25px 30px;
margin-top: 20px;
background: #fff; background: #fff;
// min-height: 436px; @media screen and (min-width:1240px) and (max-width:1900px) {
width: 95%;
height: 320px !important;
}
@media screen and (min-width:1900px) {
width: 96.7%;
height: 400px !important;
}
.message-title { .message-title {
font-size: 20px; font-size: 20px;
height: 80px; height: 80px;
...@@ -161,7 +347,7 @@ export default { ...@@ -161,7 +347,7 @@ export default {
color: #666; color: #666;
margin-top: 15px; margin-top: 15px;
} }
} }
} }
} }
...@@ -173,6 +359,7 @@ export default { ...@@ -173,6 +359,7 @@ export default {
} }
} }
} }
} }
</style> </style>
......
...@@ -81,7 +81,12 @@ export default { ...@@ -81,7 +81,12 @@ export default {
if(vm.idType == 1) { // 内部 if(vm.idType == 1) { // 内部
window.location.href = getInnerLoginUrl() window.location.href = getInnerLoginUrl()
} else { } else {
window.location.href = getLoginUrl('?from=work&type=logout') if(window.location.host.indexOf("work.yunqueyi") != -1&&window.location.host.indexOf("test2-work.yunqueyi") == -1) {
window.location.href = getLoginUrl('?from=work&type=logout')
} else {
this.$router.push('/login')
}
} }
} }
if(command === 'forward') { if(command === 'forward') {
...@@ -102,7 +107,7 @@ export default { ...@@ -102,7 +107,7 @@ export default {
box-sizing: border-box; box-sizing: border-box;
height: 64px; height: 64px;
width: 100%; width: 100%;
z-index: 99999; z-index: 1000;
font-size: 22px; font-size: 22px;
line-height: 64px; line-height: 64px;
color: #fff; color: #fff;
......
...@@ -35,6 +35,10 @@ import { isNotEmptyUtils } from '../../utils/utils' ...@@ -35,6 +35,10 @@ import { isNotEmptyUtils } from '../../utils/utils'
let vm = null let vm = null
export default { export default {
props: { props: {
storageIdType: {
type: Number,
default: 0
},
tokenValue: { tokenValue: {
type: String type: String
}, },
...@@ -52,7 +56,8 @@ export default { ...@@ -52,7 +56,8 @@ export default {
{ {
title: '数据总览', title: '数据总览',
icon: 'el-icon-menu', icon: 'el-icon-menu',
index: 'home' index: 'home',
},{ },{
title: '教培项目', title: '教培项目',
icon: 'el-icon-message', icon: 'el-icon-message',
...@@ -112,11 +117,16 @@ export default { ...@@ -112,11 +117,16 @@ export default {
}, },
computed: { computed: {
onRoutes() { onRoutes() {
return this.$route.path.replace('/', ''); return this.$route.path;
} }
}, },
created() { created() {
vm = this vm = this;
},
mounted(){
if(vm.storageIdType==2){
vm.setFollowSide()
}
}, },
watch: { watch: {
authList(newVal, oldVal){ authList(newVal, oldVal){
...@@ -129,10 +139,40 @@ export default { ...@@ -129,10 +139,40 @@ export default {
if(!newVal.P003) { // 角色管理 if(!newVal.P003) { // 角色管理
vm.items[2].subs[0].index = 'blank' vm.items[2].subs[0].index = 'blank'
} }
},
storageIdType(val,ov){
if(val==2){
vm.setFollowSide()
} }
}
}, },
methods: { methods: {
setFollowSide(){
const followSider = {
title: '随访管理',
icon: 'el-icon-edit-outline',
index: 'followup',
subs: [
{
title: '计划管理',
icon: 'el-icon-setting',
index: 'followup/plan-manage/plan-list'
},
{
title: '预约管理',
icon: 'el-icon-setting',
index: 'followup/reservation-manage/reservation-list'
},
{
title: '录入管理',
icon: 'el-icon-setting',
index: 'followup/record-manage/record-list'
}
]
}
vm.items.push(followSider);
}
} }
} }
</script> </script>
......
<template>
<div class="login-other">
<div class="left"></div>
<div class="right">
<div class="content">
<p class="title"><img src="../assets/image/logo.svg" alt="">云鹊医工作站</p>
<div class="input-info" v-if="loginFlag">
<div class="title-div">
<p class="title-input">账号登录</p>
<img src="../assets/image/underline.svg" alt="">
</div>
<el-form ref="loginForm" :model="loginData">
<el-form-item label="" prop="mobile">
<el-input v-model="loginData.mobile" placeholder="手机号" maxlength="11" :class="{errColor: loginMobileErr}">
<i slot="prefix" class="el-input__icon my-icon mobile-icon"></i>
</el-input>
<p class="err-text" v-show="loginMobileErr"><img src="../assets/image/err-icon.svg" alt="">{{loginMobileErrText}}</p>
</el-form-item>
<el-form-item label="" prop="password">
<el-input v-model="loginData.password" placeholder="密码" type="password" v-if="!showPSW" :class="{errColor: loginPWDErr}">
<i slot="prefix" class="el-input__icon my-icon password-icon"></i>
<i @click="showPWSBtn" slot="suffix" class="el-input__icon my-icon open-eyes-icon"></i>
</el-input>
<el-input v-model="loginData.password" placeholder="密码" v-else :class="{errColor: loginPWDErr}">
<i slot="prefix" class="el-input__icon my-icon password-icon"></i>
<i @click="hidePWSBtn" slot="suffix" class="el-input__icon my-icon close-eyes-icon"></i>
</el-input>
<p class="err-text" v-show="loginPWDErr"><img src="../assets/image/err-icon.svg" alt="">{{loginPWDErrText}}</p>
</el-form-item>
</el-form>
<div class="button-div">
<div class="forget-password">
<p @click="goToResetPassword">忘记密码?</p>
</div>
<button @click="login">登 录</button>
</div>
</div>
<div class="input-info" v-else>
<div class="title-div">
<p class="title-input">重设密码</p>
<img src="../assets/image/underline.svg" alt="">
</div>
<el-form ref="loginForm" :model="resetPassword" >
<el-form-item label="">
<el-input v-model="resetPassword.mobile" placeholder="手机号" maxlength="11" :class="{errColor: resetMobileErr}">
<i slot="prefix" class="el-input__icon my-icon mobile-icon"></i>
</el-input>
<p class="err-text" v-show="resetMobileErr"><img src="../assets/image/err-icon.svg" alt="">{{resetMobileErrText}}</p>
</el-form-item>
<el-form-item label="">
<el-input v-model="resetPassword.authCode" placeholder="短信验证码" :class="{errColor: resetCodeErr}">
<i slot="prefix" class="el-input__icon my-icon auth-code-icon"></i>
<i v-if="countDown == 0" @click="getAuthCode" slot="suffix" class="el-input__icon get-auth-code">获取验证码</i>
<i v-else slot="suffix" class="el-input__icon get-auth-warning">{{countDown}}s后重发</i>
</el-input>
<p class="err-text" v-show="resetCodeErr"><img src="../assets/image/err-icon.svg" alt="">{{resetCodeErrText}}</p>
</el-form-item>
<el-form-item label="">
<el-input v-model.lazy="resetPassword.password" placeholder="新密码" type="password" v-if="!showPSW" :class="{errColor: resetPWDErr}">
<i slot="prefix" class="el-input__icon my-icon password-icon"></i>
<i @click="showPWSBtn" slot="suffix" class="el-input__icon my-icon open-eyes-icon"></i>
</el-input>
<el-input v-model.lazy="resetPassword.password" placeholder="新密码" v-else :class="{errColor: resetPWDErr}">
<i slot="prefix" class="el-input__icon my-icon password-icon"></i>
<i @click="hidePWSBtn" slot="suffix" class="el-input__icon my-icon close-eyes-icon"></i>
</el-input>
<p class="err-text" v-show="resetPWDErr"><img src="../assets/image/err-icon.svg" alt="">{{resetPWDErrText}}</p>
</el-form-item>
</el-form>
<div class="button-div">
<!--<div class="forget-password">
<p>忘记密码?</p>
</div>-->
<button @click="resetPWD">重设密码</button>
<div class="login-now">
<p @click="goToLogin">立即登录</p>
</div>
</div>
</div>
</div>
<div class="vrcode">
<img v-show="showVRCode" src="../assets/image/VR-code.svg" alt="">
<p slot="reference" @mouseenter="showVR" @mouseleave="closeVR"><img src="../assets/image/VR-mobile.svg" alt="">下载云鹊医app</p>
</div>
</div>
</div>
</template>
<script>
let vm = null
import { ssoLogin2, getDeviceInfo } from '@/utils/utils';
import { mapActions } from 'vuex';
import md5 from 'js-md5';
export default {
name: "login",
data() {
return {
loginFlag: true,
loginData: {},
resetPassword: {},
showVRCode: false,
showPSW: false,
countDown: 0,
timer: null,
loginMobileErr: false,
loginMobileErrText: '',
loginPWDErr: false,
loginPWDErrText: '',
resetMobileErr: '',
resetMobileErrText: '',
resetCodeErr: '',
resetCodeErrText: '',
resetPWDErr: '',
resetPWDErrText: ''
}
},
created() {
ssoLogin2() //初始化登录信息
vm = this
},
methods: {
// 修改token
...mapActions([
'changeToken',
]),
checkPhone(val) {
if(!(/^1[345678]\d{9}$/.test(val))) {
return false;
} else {
return true;
}
},
checkPwdVal(val) {
if(!/(?=.*\d)/.test(val)){
return false
}
if(!/(?=.*[A-Za-z])/.test(val)){
return false
}
if(!/[`~!@#$%^&*()=|{}_+':]/.test(val)){
return false
}
return true
},
checkPassword(val) {
if(val.length < 8 || val.length > 16){
return false;
} else {
return true;
}
},
goToLogin() {
this.loginFlag = true
this.resetMobileErr = false;
this.resetCodeErr = false;
this.resetPWDErr = false
this.resetPassword = {}
},
goToResetPassword() {
this.loginFlag = false;
this.loginMobileErr = false;
this.loginPWDErr = false
this.loginData = {}
},
showVR() {
this.showVRCode = true;
},
closeVR() {
this.showVRCode = false;
},
showPWSBtn() {
this.showPSW = true
},
hidePWSBtn() {
this.showPSW = false
},
getAuthCode() {
if(!this.resetPassword.mobile) {
this.resetMobileErr = true;
this.resetMobileErrText = '请输入手机号';
return;
} else if(!this.checkPhone(this.resetPassword.mobile)) {
this.resetMobileErr = true;
this.resetMobileErrText = '请输入正确的手机号';
return;
} else {
this.resetMobileErr = false;
this.resetMobileErrText = '';
}
let params = {
receiver: this.resetPassword.mobile,
token: localStorage.getItem("token"),
flag: 2, //1表示注册 2表示忘记密码
gaoFlag: 1 ,//1表示saas 2表示高血压项目
deviceInfo: getDeviceInfo()
};
this.saasPOST('/mobiles/sendCaptchaNew',params, 'application/x-www-form-urlencoded;charset=UTF-8').then(data => {
if (data.mobileFlag == 2) {
this.resetMobileErr = true;
this.resetMobileErrText = '该手机号尚未注册!';
return;
} else {
const TIME_COUNT = 60;
if (!this.timer) {
this.countDown = TIME_COUNT;
this.timer = setInterval(() => {
if (this.countDown > 0 && this.countDown <= TIME_COUNT) {
this.countDown--;
} else {
this.countDown = 0;
clearInterval(this.timer);
this.timer = null;
}
}, 1000)
}
}
}).catch( err => {
this.$message({
message: '系统错误!',
type: 'error'
});
})
},
login() {
if(!this.loginData.mobile) {
this.loginMobileErr = true;
this.loginMobileErrText = '请输入手机号';
} else if(!this.checkPhone(this.loginData.mobile)) {
this.loginMobileErr = true;
this.loginMobileErrText = '请输入正确的手机号';
} else {
this.loginMobileErr = false;
this.loginMobileErrText = '';
}
if(!this.loginData.password) {
this.loginPWDErr = true;
this.loginPWDErrText = '请输入密码';
} else {
this.loginPWDErr = false;
this.loginPWDErrText = '';
}
if(!this.loginData.mobile||!this.checkPhone(this.loginData.mobile)||!this.loginData.password) {
return;
}
let params = {
mobile: this.loginData.mobile,
OS: localStorage.getItem("OS"),
browser: localStorage.getItem("browser"),
terminalType: localStorage.getItem("terminalType"),
ipAddress: localStorage.getItem("ipAddress"),
password: md5(this.loginData.password).toUpperCase(),
token: localStorage.getItem("token"),
};
this.saasGET('/registers/saasLogin',params).then(data => {
if (data.mobileFlag == 1) {
/*this.$message({
message: '手机号或密码不正确!',
type: 'error'
});*/
this.loginPWDErr = true;
this.loginPWDErrText = '手机号或密码不正确!';
return;
}
if (data.isExist == 2) {
/*this.$message({
message: '该手机号尚未注册!',
type: 'error'
});*/
this.loginMobileErr = true;
this.loginMobileErrText = '该手机号尚未注册!';
return;
}
localStorage.setItem("token", data.token);
vm.changeToken(data.token)
localStorage.setItem("storageToken", data.token);
localStorage.setItem('doctorId',data.picapDoctor.id);
localStorage.setItem("mobilePhone", params.mobile);
localStorage.setItem("pass", params.password);
sessionStorage.setItem("mobile",params.mobile);
sessionStorage.setItem("pass",params.password);
this.$router.push('/');
}).catch( err => {
this.$message({
message: '系统错误!',
type: 'error'
});
})
},
resetPWD() {
if(!this.resetPassword.mobile) {
this.resetMobileErr = true;
this.resetMobileErrText = '请输入手机号';
} else if(!this.checkPhone(this.resetPassword.mobile)) {
this.resetMobileErr = true;
this.resetMobileErrText = '请输入正确的手机号';
} else {
this.resetMobileErr = false;
this.resetMobileErrText = '';
}
if(!this.resetPassword.authCode) {
this.resetCodeErr = true;
this.resetCodeErrText = '请输入验证码';
} else {
this.resetCodeErr = false;
this.resetCodeErrText = '';
}
if(!this.resetPassword.password) {
this.resetPWDErr = true;
this.resetPWDErrText = '请输入密码';
} else if(!this.checkPassword(this.resetPassword.password)) {
this.resetPWDErr = true;
this.resetPWDErrText = '请输入8-16位的密码';
} else if(!this.checkPwdVal(this.resetPassword.password)) {
this.resetPWDErr = true;
this.resetPWDErrText = '密码须同时包含数字,字母和字符';
} else {
this.resetPWDErr = false;
this.resetPWDErrText = '';
}
if(!this.resetPassword.mobile
||!this.checkPhone(this.resetPassword.mobile)
||!this.resetPassword.authCode
||!this.resetPassword.password
||!this.checkPassword(this.resetPassword.password)
||!this.checkPwdVal(this.resetPassword.password)) {
return;
}
let para = {
mobile: this.resetPassword.mobile,
authCode: this.resetPassword.authCode
}
this.saasGET('/mobiles/checkCaptcha',para).then(data => {
let req = {
mobile: this.resetPassword.mobile,
password: md5(this.resetPassword.password).toUpperCase()
}
this.saasPUT('/login/password',req).then(data => {
this.$message({
message: '重设密码成功,请重新登录!',
type: 'success'
});
setTimeout(function () {
window.location.reload();
}, 2000)
}).catch( err => {
this.$message({
message: '系统错误!',
type: 'error'
});
})
}).catch( err => {
/*this.$message({
message: '验证码已过期或不存在!',
type: 'error'
});*/
this.resetCodeErr = true;
this.resetCodeErrText = '验证码已过期或不存在';
return;
})
}
}
}
</script>
<style lang="scss">
.login-other {
.my-icon {
display: inline-block;
height: 20px;
margin-top: 9px;
}
.mobile-icon {
background: url("../assets/image/mobile.svg") no-repeat;
}
.password-icon {
background: url("../assets/image/password.svg") no-repeat;
}
.auth-code-icon {
background: url("../assets/image/auth-code.svg") no-repeat;
}
.open-eyes-icon {
background: url("../assets/image/open-eyes.svg") no-repeat;
cursor: pointer;
}
.close-eyes-icon {
background: url("../assets/image/close-eyes.svg") no-repeat;
cursor: pointer;
}
.err-text {
color: #FB5B52;
height: 20px;
line-height: 20px;
margin-top: 4px;
img {
width: 14px;
height: 14px;
margin-right: 3px;
vertical-align: middle;
}
}
display: flex;
height: 100%;
flex-direction: row;
.left {
flex-grow: 1;
/*大于1441*/
@media only screen and (min-width: 1441px) {
background: url("../assets/image/bg-big.png") no-repeat;
background-size: cover;
}
/*小于1440*/
@media only screen and (max-width: 1441px) {
background: url("../assets/image/bg-small.png") no-repeat;
background-size: cover;
}
}
.right {
position: relative;
/*大于1441*/
@media only screen and (min-width: 1441px) {
width: 570px;
}
/*小于1440*/
@media only screen and (max-width: 1441px) {
width: 500px;
}
.content {
/*大于1441*/
@media only screen and (min-width: 1441px) {
padding: 140px 50px 20px 50px;
}
/*小于1440*/
@media only screen and (max-width: 1441px) {
padding: 40px 50px 20px 50px;
}
.title {
text-align: center;
font-weight: 500;
font-size: 34px;
color: #333333;
img {
width: 54px;
height: 54px;
vertical-align: middle;
}
}
.input-info {
margin-top: 60px;
.title-div {
position: relative;
margin-bottom: 30px;
.title-input {
font-size: 28px;
}
img {
display: block;
position: absolute;
bottom: 3px;
}
}
.el-form {
.el-form-item {
.el-form-item__content {
position: relative;
.el-input {
.el-input__inner {
border-radius: 0;
border: none;
border-bottom: 1px solid #D9D9D9;
}
.get-auth-code {
color: #666666;
cursor: pointer;
}
.get-auth-warning {
color: #666666;
}
}
.err-text{
position: absolute;
}
.errColor {
.el-input__inner {
border-color: #FB5B52;
}
}
}
}
}
.button-div {
button {
width: 100%;
height: 70px;
background: #449284;
color: #ffffff;
font-size: 24px;
margin-top: 20px;
cursor: pointer;
box-shadow: 0px 10px 8px 0px rgba(59,132,119,0.2);
}
.forget-password {
margin-top: 52px;
color:red;
p {
cursor: pointer;
width: 80px;
float: right;
font-size: 16px;
color: #449284;
}
}
.login-now {
margin-top: 24px;
p {
width: 80px;
margin: 0 auto;
font-size:20px;
color: #449284;
cursor: pointer;
}
}
}
}
}
.vrcode {
position: absolute;
bottom: 20px;
width: 100%;
text-align: center;
p {
text-align: center;
font-size: 20px;
color: #999999;
cursor: pointer;
img {
vertical-align: middle;
margin-right: 4px;
}
}
}
}
}
</style>
...@@ -9,7 +9,10 @@ ...@@ -9,7 +9,10 @@
<div class="f-main-content screenSet"> <div class="f-main-content screenSet">
<div class="header-title"> <div class="header-title">
<span>基本信息</span> <span>基本信息</span>
<p><el-button plain size="small">取消</el-button><el-button type="primary" size="small" @click="saveEdit">保存</el-button></p> <p>
<el-button plain size="small" @click="cancelEdit">取消</el-button>
<el-button type="primary" size="small" @click="saveEdit">保存</el-button>
</p>
</div> </div>
<edit-information <edit-information
:patientInfoObj="patientInfo" :patientInfoObj="patientInfo"
...@@ -24,7 +27,7 @@ ...@@ -24,7 +27,7 @@
import BreadCrumb from '@/components/breadcrumb' import BreadCrumb from '@/components/breadcrumb'
import editInformation from './components/edit-information' import editInformation from './components/edit-information'
import { mapGetters } from 'vuex' import { mapGetters } from 'vuex'
import { getPatientDetail, getRemindPatient, deletePatient,savePatientInfo } from '@/utils/patients/patientsapi' import { getPatientDetail, getRemindPatient, savePatientInfo } from '@/utils/patients/patientsapi'
export default { export default {
name: "basicInfo", name: "basicInfo",
components: { components: {
...@@ -60,17 +63,32 @@ ...@@ -60,17 +63,32 @@
} }
}) })
}, },
cancelEdit() {
this.$router.go(-1);
},
saveEdit() { saveEdit() {
this.checkForm = true; this.checkForm = true;
}, },
addListenSave(val) { addListenSave(val) {
this.checkForm = false; this.checkForm = false;
if(val.status) { if(val.status) {
this.patientInfo = val.patientInfoForm
savePatientInfo(this.patientInfo).then(data => {
if(data.code == '000000'){
this.$message.success('保存备注成功')
setTimeout(() => {
this.$router.go(-1);
},500)
}else {
this.$message.error(data.message);
}
})
// 调用保存接口 // 调用保存接口
}else { }else {
this.$message.error('请正确填写信息'); this.$message.error('请正确填写信息');
} }
}, },
//提醒绑定 //提醒绑定
// remindBind() { // remindBind() {
// let remindMobileWechatPara = { // let remindMobileWechatPara = {
...@@ -88,16 +106,6 @@ ...@@ -88,16 +106,6 @@
// } // }
// }) // })
// }, // },
// //保存备注
// saveRemark() {
// savePatientInfo(this.patientInfo).then(data => {
// if(data.code == '000000'){
// this.$message.success('保存备注成功')
// }else {
// this.$message.error(data.message);
// }
// })
// },
}, },
filters: { filters: {
emptyFilter: function(value) { emptyFilter: function(value) {
......
...@@ -40,6 +40,7 @@ ...@@ -40,6 +40,7 @@
<el-select <el-select
v-model="diseaseIdList" v-model="diseaseIdList"
multiple multiple
@change="changeDiseases"
placeholder="请选择居民疾病诊断"> placeholder="请选择居民疾病诊断">
<el-option <el-option
v-for="item in diseasesList" v-for="item in diseasesList"
...@@ -55,6 +56,7 @@ ...@@ -55,6 +56,7 @@
<el-select <el-select
v-model="labelIdList" v-model="labelIdList"
multiple multiple
@change="changeLabels"
placeholder="请选择居民分组"> placeholder="请选择居民分组">
<el-option <el-option
v-for="(item, index) in labelsList" v-for="(item, index) in labelsList"
...@@ -74,6 +76,7 @@ ...@@ -74,6 +76,7 @@
v-model="patientInfoForm.idNo" v-model="patientInfoForm.idNo"
placeholder="请输入身份证" placeholder="请输入身份证"
clearable clearable
maxlength="18"
:disabled="hasIdNo"> :disabled="hasIdNo">
</el-input> </el-input>
</el-form-item> </el-form-item>
...@@ -86,6 +89,7 @@ ...@@ -86,6 +89,7 @@
placeholder="请选择出生年月" placeholder="请选择出生年月"
value-format="yyyy-MM-dd" value-format="yyyy-MM-dd"
value="yyyy-MM-dd" value="yyyy-MM-dd"
@change="getAge"
style="width:250px" style="width:250px"
clearable> clearable>
</el-date-picker> </el-date-picker>
...@@ -224,12 +228,47 @@ ...@@ -224,12 +228,47 @@
<script> <script>
import { mapGetters } from 'vuex'; import { mapGetters } from 'vuex';
import { checkMobile } from '@/utils/patients/checkValid'; import { checkMobile } from '@/utils/patients/checkValid';
import { checkCardNum } from '@/utils/patients/checkCardNum'; import { isCardNo, checkProvince, checkBirthday, checkParity } from '@/utils/patients/checkCardNum';
import { getDiseasesList, getLabelList, getConstants, getNationsList, getRemindPatient,savePatientInfo } from '@/utils/patients/patientsapi'; import { getDiseasesList, getLabelList, getConstants, getNationsList, getRemindPatient,savePatientInfo } from '@/utils/patients/patientsapi';
export default { export default {
name: "basicInfo", name: "basicInfo",
components: {}, components: {},
data() { data() {
let checkCardNum = (rule, value, callback) =>{
let vcity={ 11:"北京",12:"天津",13:"河北",14:"山西",15:"内蒙古",
21:"辽宁",22:"吉林",23:"黑龙江",31:"上海",32:"江苏",
33:"浙江",34:"安徽",35:"福建",36:"江西",37:"山东",41:"河南",
42:"湖北",43:"湖南",44:"广东",45:"广西",46:"海南",50:"重庆",
51:"四川",52:"贵州",53:"云南",54:"西藏",61:"陕西",62:"甘肃",
63:"青海",64:"宁夏",65:"新疆",71:"台湾",81:"香港",82:"澳门",91:"国外"
};
//是否为空
// if(value === ''){
// callback(new Error('请输入正确的身份证'))
// }
if(value) {
//校验长度,类型
if(isCardNo(value) === false){
callback(new Error('请输入正确的身份证'))
}
//检查省份
if(checkProvince(value,vcity) === false){
callback(new Error('请输入正确的身份证'))
}
//校验生日
if(checkBirthday(value) === false){
callback(new Error('请输入正确的身份证'))
}
//检验位的检测
if(checkParity(value) === false){
callback(new Error('请输入正确的身份证'))
}
this.go(value.length);
callback()
}else {
callback()
}
};
return { return {
diseasesList: [], diseasesList: [],
labelsList: [], labelsList: [],
...@@ -242,6 +281,7 @@ ...@@ -242,6 +281,7 @@
nickname: '', nickname: '',
mobilePhone: '', mobilePhone: '',
diseases: [], diseases: [],
patientDiseases: [],
customLabels: [], customLabels: [],
idNo: '', idNo: '',
birthTime: '', birthTime: '',
...@@ -298,6 +338,27 @@ ...@@ -298,6 +338,27 @@
} }
// this.$refs['patientInfoForm'].clearValidate(); // this.$refs['patientInfoForm'].clearValidate();
this.$forceUpdate(); this.$forceUpdate();
}else {
// 新增
this.patientInfoForm = {
nickname: '',
mobilePhone: '',
diseases: [],
patientDiseases: [],
customLabels: [],
idNo: '',
birthTime: '',
age: '',
sex: null,
permanentResidence: '',
nationality: '',
socialCard: '',
fileLocator: '',
isWechatBind: null,
isRemind: null,
wechatNickname: '',
remark: '',
}
} }
}, },
checkForm(val){ checkForm(val){
...@@ -333,7 +394,6 @@ ...@@ -333,7 +394,6 @@
}); });
getLabelList({ getLabelList({
type: 1, type: 1,
// token: 'FFA85945A8374A4CB63A7616E38060DA',
token: this._token, token: this._token,
}).then((data) => { }).then((data) => {
if(data.code == '000000') { if(data.code == '000000') {
...@@ -353,6 +413,29 @@ ...@@ -353,6 +413,29 @@
} }
}) })
}, },
changeDiseases(val) {
let newDiseaseList = [];
val.forEach((valItem) => {
this.diseasesList.forEach((item2) => {
if(valItem == item2.diseaseId){
newDiseaseList.push({parentDiseaseId: item2.diseaseId});
}
})
});
// this.patientInfoForm.diseases = newDiseaseList;
this.patientInfoForm.patientDiseases = newDiseaseList;
},
changeLabels(val){
let newLabelsList = [];
val.forEach((valItem) => {
this.labelsList.forEach((item2) => {
if(valItem == item2.labelId){
newLabelsList.push(item2);
}
})
});
this.patientInfoForm.customLabels = newLabelsList;
},
//提醒绑定 //提醒绑定
remindBind() { remindBind() {
let remindMobileWechatPara = { let remindMobileWechatPara = {
...@@ -365,6 +448,7 @@ ...@@ -365,6 +448,7 @@
}).then( data => { }).then( data => {
if(data.code == '000000') { if(data.code == '000000') {
this.$message.success(data.data.respMsg); this.$message.success(data.data.respMsg);
this.$router.go(-1);
}else { }else {
this.$message.error(data.message); this.$message.error(data.message);
} }
...@@ -373,67 +457,71 @@ ...@@ -373,67 +457,71 @@
saveInfoData() { saveInfoData() {
this.$refs['patientInfoForm'].validate((valid) => { this.$refs['patientInfoForm'].validate((valid) => {
if (valid) { if (valid) {
console.log('对象',this.patientInfoForm)
this.$emit('addListenSave',{ this.$emit('addListenSave',{
status: true, status: true,
patientInfoForm: this.patientInfoForm patientInfoForm: {
...this.patientInfoForm,
birthTime: this.patientInfoForm.birthTime ? `${this.patientInfoForm.birthTime} 00:00:00` : '',
}
}) })
} else { } else {
this.$emit('addListenSave',{ this.$emit('addListenSave',{
status: false, status: false,
patientInfoForm: this.patientInfoForm, // patientInfoForm: this.patientInfoForm,
patientInfoForm: {
...this.patientInfoForm,
birthTime: this.patientInfoForm.birthTime ? `${this.patientInfoForm.birthTime} 00:00:00` : '',
}
}) })
} }
}); });
}, },
// async validID(rule,value,callback) // 实现自动生成生日,性别,年龄
// { go(val) {
// // 身份证号码为15位或者18位,15位时全为数字,18位前17位为数字,最后一位是校验位,可能为数字或字符X let iden = this.patientInfoForm.idNo;
// let reg = /(^\d{15}$)|(^\d{18}$)|(^\d{17}(\d|X|x)$)/; let sex = null;
// if(value != ''){ let birth = null;
// if (reg.test(value)) { let myDate = new Date();
// await this.go(value.length); let month = myDate.getMonth() + 1;
// callback() let day = myDate.getDate();
// } else { let age = 0;
// callback(new Error('身份证号码不正确'))
// } if(val===18){
// }else { age = myDate.getFullYear() - iden.substring(6, 10) - 1;
// callback(); sex = iden.substring(16,17);
// } birth = iden.substring(6,10)+"-"+iden.substring(10,12)+"-"+iden.substring(12,14);
// }, if (iden.substring(10, 12) < month || iden.substring(10, 12) == month && iden.substring(12, 14) <= day) age++;
//
// // 实现自动生成生日,性别,年龄 }
// go(val) { if(val===15){
// let iden = this.patientInfoForm.idNo; age = myDate.getFullYear() - iden.substring(6, 8) - 1901;
// let sex = null; sex = iden.substring(13,14);
// let birth = null; birth = "19"+iden.substring(6,8)+"-"+iden.substring(8,10)+"-"+iden.substring(10,12);
// let myDate = new Date(); if (iden.substring(8, 10) < month || iden.substring(8, 10) == month && iden.substring(10, 12) <= day) age++;
// let month = myDate.getMonth() + 1; }
// let day = myDate.getDate();
// let age = 0; if(sex%2 === 0)
// sex = 2;
// if(val===18){ else
// age = myDate.getFullYear() - iden.substring(6, 10) - 1; sex = 1;
// sex = iden.substring(16,17); this.patientInfoForm.sex = sex;
// birth = iden.substring(6,10)+"-"+iden.substring(10,12)+"-"+iden.substring(12,14); this.patientInfoForm.age = age;
// if (iden.substring(10, 12) < month || iden.substring(10, 12) == month && iden.substring(12, 14) <= day) age++; this.patientInfoForm.birthTime = birth;
// // this.baseInfo.birthplace = this.area[iden.substring(0,2)];
// } },
// if(val===15){ getAge(val) {
// age = myDate.getFullYear() - iden.substring(6, 8) - 1901; if(val) {
// sex = iden.substring(13,14); // let birthdays = new Date(this.patientInfoForm.birthTime.replace(/-/g, "/"));
// birth = "19"+iden.substring(6,8)+"-"+iden.substring(8,10)+"-"+iden.substring(10,12); let birthdays = new Date(val.replace(/-/g, "/"));
// if (iden.substring(8, 10) < month || iden.substring(8, 10) == month && iden.substring(10, 12) <= day) age++; let d = new Date();
// } let age = d.getFullYear() - birthdays.getFullYear() - (d.getMonth() < birthdays.getMonth() || (d.getMonth() == birthdays.getMonth() && d.getDate() < birthdays.getDate()) ? 1 : 0);
// this.patientInfoForm.age = age;
// if(sex%2 === 0) }else {
// sex = 2; this.patientInfoForm.age = null;
// else }
// sex = 1; },
// this.patientInfoForm.sex = sex;
// this.patientInfoForm.age = age;
// this.patientInfoForm.birthTime = birth;
// // this.baseInfo.birthplace = this.area[iden.substring(0,2)];
// },
}, },
filters: { filters: {
emptyFilter: function(value) { emptyFilter: function(value) {
......
...@@ -28,8 +28,8 @@ ...@@ -28,8 +28,8 @@
<div><p class="title">性别:</p><p class="info">{{patientInfo.sex | sexFileter}}</p></div> <div><p class="title">性别:</p><p class="info">{{patientInfo.sex | sexFileter}}</p></div>
</div> </div>
<div class="item"> <div class="item">
<div><p class="title">民族:</p><p class="info">{{patientInfo.nationality | emptyFilter}}</p></div> <div><p class="title">民族:</p><p class="info">{{nationalityDes}}</p></div>
<div><p class="title">常驻类型:</p><p class="info">{{patientInfo.permanentResidence | emptyFilter}}</p></div> <div><p class="title">常驻类型:</p><p class="info">{{patientInfo.permanentResidence | permanentFilter}}</p></div>
</div> </div>
<div class="item"> <div class="item">
<div><p class="title">健康档案编号:</p><p class="info">{{patientInfo.fileLocator | emptyFilter}}</p></div> <div><p class="title">健康档案编号:</p><p class="info">{{patientInfo.fileLocator | emptyFilter}}</p></div>
...@@ -79,7 +79,12 @@ ...@@ -79,7 +79,12 @@
</div> </div>
</el-tab-pane> </el-tab-pane>
<el-tab-pane label="健康记录" name="second"> <el-tab-pane label="健康记录" name="second">
<div class="health-record-list" v-if="recordList.length"> <div class="health-record-list"
v-show="recordList.length"
v-infinite-scroll="loadMore"
:infinite-scroll-disabled="busy"
infinite-scroll-distance="5"
infinite-scroll-immediate-check="true">
<div class="item" v-for="(item, index) in recordList" :key="index"> <div class="item" v-for="(item, index) in recordList" :key="index">
<div class="record-date">{{item.finishedTime}}</div> <div class="record-date">{{item.finishedTime}}</div>
<div class="record-content"> <div class="record-content">
...@@ -101,7 +106,8 @@ ...@@ -101,7 +106,8 @@
</div> </div>
</div> </div>
</div> </div>
<p style="text-align: center;padding:10px 0;cursor: pointer">点击加载更多</p> <p style="text-align: center;padding:10px 0;cursor: pointer" v-if="hasMore">加载中...</p>
<p style="text-align: center;padding:10px 0;cursor: pointer" v-if="!hasMore">没有更多了</p>
</div> </div>
<div class="no-record-content" v-if="!recordList.length"> <div class="no-record-content" v-if="!recordList.length">
<div> <div>
...@@ -119,7 +125,7 @@ ...@@ -119,7 +125,7 @@
<script> <script>
import BreadCrumb from '@/components/breadcrumb' import BreadCrumb from '@/components/breadcrumb'
import { mapGetters } from 'vuex' import { mapGetters } from 'vuex'
import { getDiseasesList, getPatientDetail, getRemindPatient, deletePatient, savePatientInfo, getHealthRecordList } from '@/utils/patients/patientsapi' import { getDiseasesList, getPatientDetail, getRemindPatient, deletePatient, savePatientInfo, getHealthRecordList, getNationsList } from '@/utils/patients/patientsapi'
export default { export default {
name: "patientDetail", name: "patientDetail",
components: { components: {
...@@ -139,16 +145,21 @@ ...@@ -139,16 +145,21 @@
isWechatBind: 1, isWechatBind: 1,
remark: '', remark: '',
}, },
nationalityDes: '',
showLabelName: '', showLabelName: '',
showDiseaseName: '', showDiseaseName: '',
birthTimeDisplay: '', birthTimeDisplay: '',
recordList: [], recordList: [],
hasMore: true, hasMore: false,
busy: false,
pageNo: 1,
pageSize: 5,
} }
}, },
created() { created() {
this.patientId = this.$route.query.patientId; this.patientId = this.$route.query.patientId;
this.init(); this.init();
this.getRecordList();
}, },
mounted() { mounted() {
}, },
...@@ -195,31 +206,61 @@ ...@@ -195,31 +206,61 @@
} else { } else {
this.showDiseaseName = ''; this.showDiseaseName = '';
} }
// 对民族的处理
if(this.patientInfo.nationality) {
let nationsList = [];
getNationsList().then((data) => {
if(data.code == '000000') {
nationsList = data.data;
nationsList.forEach(item => {
if(String(this.patientInfo.nationality) == item.code ) {
this.nationalityDes = item.name;
}
})
}
})
}else {
this.nationalityDes = '-';
}
} }
} }
}) })
}, },
getRecordList(pageNo, pageSize) { getRecordList() {
let reqPara = { let reqPara = {
doctorId: '101281458',
// patientId: this.patientId, // patientId: this.patientId,
patientId: '99997701', patientId: '99997701',
pageNo: pageNo, pageNo: this.pageNo,
pageSize: pageSize, pageSize: this.pageSize,
} }
getHealthRecordList(reqPara).then((data) => { getHealthRecordList(reqPara).then((data) => {
if(data.code == '000000'){ if(data.code == '000000'){
this.recordList = data.data.healthRecordDtos; // this.recordList = data.data.healthRecordDtos;
// let total = data.data.count; let healthRecordDtos = data.data.healthRecordDtos;
let count = data.data.count;
// if(flag) {
this.recordList = this.recordList.concat(healthRecordDtos);
if(count <= this.pageNo * this.pageSize) {
this.busy = true;
this.hasMore = false;
}else {
this.busy = false;
this.hasMore = true;
}
// }else {
// this.recordList = healthRecordDtos;
// this.busy = false;
// this.hasMore = false;
// }
}else { }else {
this.$message.error(data.message) this.$message.error(data.message)
} }
}) })
}, },
tabChangeHandler(tab) { tabChangeHandler(tab) {
if(tab.name == 'second'){ // if(tab.name == 'second'){
this.getRecordList(1,2); // this.getRecordList(true);
} // }
}, },
deletePatient() { deletePatient() {
// 把写的提示信息需要换行的地方分成数组 confirmText // 把写的提示信息需要换行的地方分成数组 confirmText
...@@ -306,6 +347,15 @@ ...@@ -306,6 +347,15 @@
openScaleDetail(url) { openScaleDetail(url) {
window.open(url) window.open(url)
}, },
loadMore() {
// console.log('触发加载页码',this.pageNo);
this.busy = true; //把busy置位true,这次请求结束前不再执行
setTimeout(() => {
this.pageNo++;
this.getRecordList()
//调用获取数据接口,并且传入一个true,让axios方法指导是否需要拼接数组。
}, 500)
},
}, },
filters: { filters: {
...@@ -327,6 +377,17 @@ ...@@ -327,6 +377,17 @@
return hash[value]; return hash[value];
} }
}, },
permanentFilter: function (value) {
if (!value) {
return '-';
} else {
let hash = {
1: '户籍',
2: '非户籍'
};
return hash[value];
}
}
}, },
} }
</script> </script>
...@@ -387,8 +448,25 @@ ...@@ -387,8 +448,25 @@
} }
} }
.health-record-list{ .health-record-list{
height: 500px; /*height: 300px;*/
overflow-y: scroll; overflow-y: auto;
@media screen and (min-width:1240px) and (max-width:1545px){
height: 300px;
}
@media screen and (min-width:1545px) and (max-width:1600px){
height: 500px;
}
@media screen and (min-width:1600px){
height: 650px;
}
&::-webkit-scrollbar{
width:5px;
}
&::-webkit-scrollbar-thumb {/*滚动条里面小方块*/
border-radius: 10px;
-webkit-box-shadow: inset 0 0 5px rgba(0,0,0,0.2);
background: rgba(0,0,0,0.1);
}
.item{ .item{
width: 100%; width: 100%;
margin-bottom: 15px; margin-bottom: 15px;
......
Markdown 格式
0% or
您添加了 0 到此讨论。请谨慎行事。
先完成此消息的编辑!
想要评论请 注册