提交 0092d20a 编写于 作者: xinxu.wang's avatar xinxu.wang

Merge branch 'dev-patients-20190513_tmp' into 'dev-patients-20190513'

Dev patients 20190513 tmp



See merge request !26
文件已删除
...@@ -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
} }
} }
...@@ -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,6 +24,7 @@ ...@@ -23,6 +24,7 @@
"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-infinite-scroll": "^2.0.2",
...@@ -53,6 +55,7 @@ ...@@ -53,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">
...@@ -16,6 +16,11 @@ ...@@ -16,6 +16,11 @@
</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
if( process.env.BUILD_ENV != 'development'){
vm.getToken() 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')) {
console.log('域名',window.location.host)
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返回登录页面 window.location.href = getLoginUrl('?from=work&type=logout') // 没有token返回登录页面
return return;
} else {
this.$router.push('/login')
return;
}
} }
} }
}else { }else {
if(!localStorage.getItem('storageToken')) { if(!localStorage.getItem('storageToken')) {
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返回登录页面 window.location.href = getLoginUrl('?from=work&type=logout') // 没有token返回登录页面
return 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/QXD770CK3tiboWl8vcquPCBAgQIAAAQIdC0jKdUzlRgIECBAgQIDA8wLHlpo+29g0YXdIusXlk3EmnKN+Ao/Nz4Vxnsu+PPvkieBiMjUm6C59UTjDbLpLw+u4EcXZYcMKBwECBAgQIECgEwF/a+hEyT0ECBAgQIBA0gJx9tvu554Nz3t7tjEDLr5/6vimC2a6pfvVaCbrbt0/dQIhbjoRE3TxvDo8w06i7gSNFwQIECBAgMACgfhMuRvCZ29f8Lm3BAgQIECAAIEkBWLirXGGJFxcdvrwMrPf8iblqly+yn2PX+48/e+mbOuMuripREzYOQgQIECAAIHkBU6LSbmJwLApeQoABAgQIECAQHICcQlqXHLanAEXf7Z79ls7nG6SM4vVUeXyVe57HIs8/c9TNrYdd4KNM+muWnVuSNJZ9hpNHAQIECBAIDGBayxfTWzEhUuAAAECBFIWiEm3r809dSIRF5eg5k2upOwp9t4FHpx7Jotn84iz6a4OCbpjibqXeDZdE8ZPAgQIECBQX4ERM+XqO7giI0CAAAECSQs0N2JoJuHaLUPNm5RLubzYe/8VW86uNUn3oyMX9N6QkgQIECBAgEBZBa6VlCvr0OgXAQIECBAg0JVAcylqMwk3GWbFdXIslxxZro6Uy4t9uW9H++vd2sVlrnEWXUzQeSZde1dXCBAgQIBAhQQk5So0WLpKgAABAgQItAgcS8I91diI4aHwXLhOk3AtVTRedpscUf55gZTtioz9rBWnh+TcmsZy1x899wJLXZ//SnpFgAABAgSqJCApV6XR0lcCBAgQIJC6QJwFF5ehfmV26qQkXJ4ESZ6ycTxSLi/23n8j+2kXl7q+ZuT8cJpF1/uIKEmAAAECBIYuICk3dHINEiBAgAABAh0LxI0ZHm5szPBUds/sE23L5Ulw5CkbO5RyebG3/Uoue2FQdmvOeOGxZa7nHkvSLdsRNxAgQIAAAQJFCUjKFSWvXQIECBAgQOBUgeaS1HueeaKxS2rcHbWTI0+CI0/Z2LeUy4u9k2/n4vcMwy4uc407usYZdJa5Lj4OPiVAgAABAgUKSMoViK9pAgQIECBAIAjsnp89sSS13Q6py0HlSXDkKRv7lXJ5sS/3zWx/vQi7Hz2+xFWCrv24uEKAAAECBIYoICk3RGxNESBAgAABAscF7gnPhIvPh7vnmakszoYrIkHRHIwi2459qHL7Ve57Xvuqx/4/h9lzjefQ2Sii+UeBnwQIECBAYNgCknLDFtceAQIECBBIUSAuS40JuGYybj68bz2KTHAU2XY0qHL7Ve57Xvs6xX5sBl14Bp0EXesfS14TIECAAIFBC0jKDVpY/QQIECBAIFWBJw/NN5JwMREXN2tY6igywVFk29Gkyu1Xue957esYe3wGXXP2XPzpIECAAAECBAYqICk3UF6VEyBAgACBxASaibjb9k9mk2Hn1E6PIhMcRbYdfarcfpX7nte+7rHHBN1rV6/NXnveRdmlK1d1+qvsPgIECBAgQKBzAUm5zq3cSYAAAQIECCwmMBk2avjn/Y+feD7cYvcs91mRCY4i244uVW6/yn3Pa59S7DEp91MhOReTdGeHZJ2DAAECBAgQ6IuApFxfGFVCgAABAgQSE4iJuNsaibhvFb5RQ6TPkyDJUzZv21Uvn7JdqrHH58/F5JzlrfG310GAAAECBHIJXOt/deXyU5gAAQIECKQj8OShg41nxH1u+tFGIi6dyEVKgEBT4O7Zp7J4XnDGi0JyLsyeO29tduGZL2xe9pMAAQIECBDoQuC0o0ePToT7N3VRxq0ECBAgQIBAIgLNRNzEMs+Iq/KsoSr3PX4Ni+x/kW2L/bRcfwr1c+zirLmYoDN7LteQKEyAAAEC6QmYKZfemIuYAAECBAgsLXDwyHfD8+G+1Vieun2ZXVOXrslVAgRSELgrzJyL55ozXthIzr15zSWePZfCwIuRAAECBHILmCmXm1AFBAgQIECgHgL3zE5lt81MZl8NP7s9+jnrptu24/152s9TNm/bVS+fsl3KsXfyvY0bQ/x0mD139apz4+0OAgQIECBA4FQBM+VONfEJAQIECBBIRyBu2BCfEfeVkIibDzPkHAQIEOiHwC37n8jieenKs7M3X3BJYwZdP+pVBwECBAgQqJOAmXJ1Gk2xECBAgACBDgSeOrFhwyMnNmxIedZPyrHHr0ue+POUzdt20eVTjr0Xe0tbo5qDAAECBAicJHCtpNxJHt4QIECAAIH6CkyEpan3zH5r0eWpKScYUo49ftvzxJ+nbN62iy6fcux57X8q7Nh63dr1dm2NkA4CBAgQSFnA8tWUR1/sBAgQIFB/gbg89bawc2pMyFmeWv/xFiGBKgjcHJa1xvM1I6uzN6+5ONvouXNVGDZ9JECAAIEBCJw+gDpVSYAAAQIECBQoEHdP/WrYPfVzTz6axaScgwABAmUUuGt2JuzaOhM2gxjJXnt8Y4gy9lOfCBAgQIDAoAQsXx2UrHoJECBAgMCQBZqbNsQlqt3Oikt5KV7KscevaJ7485TN23bR5VOOPa99O7v43Lm4rDXu2uogQIAAAQIJCHimXAKDLEQCBAgQqLFAv2bFtftHcqd0VS5f5b7H8Smy/0W2LfbTOv31XPS+IsduubabybkfO/f87OwVFvYsOoA+JECAAIE6CEjK1WEUxUCAAAEC6QkcmxX3SNi04disuOX+kbucUMrlU449fi/yxJ+nbN62iy6fcux57Tu1Oysk5H4+PHMuPndOci6qOwgQIECgZgKScjUbUOEQIECAQM0F4oYNE/t3Z9vnnjop0k7/kXtSoZY3KZdPOfb4FcgTf56yedsuunzKsee179ZOci6KOwgQIECghgKScjUcVCERIECAQM0Enjp0MCTiJrPPTT/S9llx3f4jdyFRyuVTjj1+D/LEn6ds3raLLp9y7Hnte7WTnIvyDgIECBCokYCkXI0GUygECBAgUDOBh+eezD4//WhjiepyofX6j9xmvSmXTzn2OP554s9TNm/bRZdPOfa89nntVq54QVjW+gONpa2WtcbRcBAgQIBARQUk5So6cLpNgAABAjUVaG7c8A9TX8ueOjzfcZR5/5GbcvmUY49fsDzx5ymbt+2iy6cce177ftnFmXO/dvFlYbfWC2OXHAQIECBAoGoCknJVGzH9JUCAAIF6CnSyRHWpyPv1j9yl2ljqWpXbr3Lf45gU2f8i2xZ7fXdfXerPmsXGPe7WOr52veTccnCuEyBAgEDZBCTlyjYi+kOAAAECaQlsD0tUJ2Z2Z7eHZ8blSXDkKRvFUy6fcux5xz5lu5RjL+v3Jibnfu2Sy7IfG1kdu+ggQIAAAQJlF5CUK/sI6R8BAgQI1FPgWCLu5F1U8/wjP0/ZKJxy+ZRjzzv2KdulHHvZvzdXrxppzJzbGH46CBAgQIBAiQUk5Uo8OLpGgAABAjUTiM+Luz3Mivt82EX1qcMHT4kuzz/y85SNHUm5fMqx5x37lO1Sjr0q35vXhBlz8ZlzF575wthlBwECBAgQKJvAtaeXrUf6Q4AAAQIE6iZw7Hlxx5Jx8yEx5yBAgACBwQvcNTuTxfO1513YWNZqp9bBm2uBAAECBLoTkJTrzsvdBAgQIECgY4GYjIu7qMbnxTkIECBAoBiBm/fvy+4MybmfX/MDjWWtxfRCqwQIECBA4FSB044ePToRPt506iWfECBAgAABAr0ITM7PhiWqO7pOxuVZDpenbIwx5fIpx5537FO2Szn2Kn9vbAYRR89BgAABAiUR8Ey5kgyEbhAgQIBADQTiTqpxZtz2uad6iibPP/LzlI2dTbl8yrHnHfuU7VKOvQ7fm7gZxNsu3pBtWHl2DMdBgAABAgSKEJCUK0JdmwQIECBQL4GYjPtUSMY93GMyrqmR5x/5ecrG9lMun3Lsecc+ZbuUY6/T9+anG8+b25B53lwcVQcBAgQIDFnARg9DBtccAQIECNRIoJmMiz+PHafVKDqhECBAoP4CXwzPm7sjPG/uLWtHG8+cq3/EIiRAgACBMgl4plyZRkNfCBAgQKASAqcm4451u8iZM0W2HaOvcvtV7nvR9inbpRx73u9dWe0uDUtZ45LWjWFpq4MAAQIECAxBwPLVISBrggABAgRqItAuGdcMr8h/aBbZdoy/yu1Xue9F26dsl3Lseb93ZbezpDWOsIMAAQIEhiBg+eoQkDVBgAABAhUXeOrQweyDk18JGzg0l6lWPCDdJ0CAAIG2Apa0tqVxgQABAgT6LHB6n+tTHQECBAgQqI1ATMbFDRxu37+7NjEJhAABAgSWFzh45HvZX+zd2XjenF1al/dyBwECBAj0JuCZcr25KUWAAAECNRY4eORwIxn3helHuoqyyCVZRbYdkarcfpX7XrR9ynYpx573e1dFu/HjG0HYpTWOvoMAAQIE+iRg+WqfIFVDgAABAjUQiMm4mIj7/PSObP7Id2sQkRAIECBAoB8CW6Ymsy/M7Mveuf5/shFEP0DVQYAAAQINActXfREIECBAgEAQuH3msewfph7OZg4f5EGAAAECBE4RmD78nez6Hduy14ycH5Jzl2dmzZ1C5AMCBAgQ6FJAUq5LMLcTIECAQL0E4uYNH997b/b4/GzuJZj1khENAQIECCwmcOfsTPaLD842EnM/PrJ6sVt8RoAAAQIEOhKQlOuIyU0ECBAgUDeBuInDx/fel/3L7DfrFpp4CBAgQGDAAnEjiHftfLixlPWdo5dnF575wgG3qHoCBAgQqKOAjR7qOKpiIkCAAIG2AvPhuXHxmXGfDruqLjyq+PDxZgxV7nuMocj+F9l20bHnbT9lu5Rj9705LRKcOM5acXr2lrXrsl9Y8wMnPvOCAAECBAh0IGCjhw6Q3EKAAAECNRGIz437VEjGeW5cTQZUGAQIECiBQJw19xd7d2V3zu7PzJorwYDoAgECBCokYKZchQZLVwkQIECgN4HH55/JPhaWqn49PD9uqaPKM1+q3Pc4JkX2v8i2i449b/sp26Ucu+/NyTPlokfzMGuuKeEnAQIECHQgYKZcB0huIUCAAIGKCsSlqnFm3BfCclUHAQIECBAYtIBZc4MWVj8BAgTqJfB99QpHNAQIECBA4JhA3MDhbQ/+dwk5XwgCBAgQGLrAtrnZ7N9vvze7I+zU6iBAgAABAu0E7L7aTsbnBAgQIFBJgbir6gcn/8eyS1UrGZxOEyBAgEBlBJo7tP7YyOrsnesvz84OG0I4CBAgQIBAq4CZcq0aXhMgQIBApQU+NfVQ9usP/XcJuUqPos4TIECgXgJ3htlyv/jgV7I4e85BgAABAgRaBfzvmlYNrwkQIECgkgLb56azvwkbOUzO+wdPJQdQpwkQIFBzgThr7u07Hsh+fs33Z29ZO2rWXM3HW3gECBDoVEBSrlMp9xEgQIBA6QSObeTwUPbFExs5tN8Rr3Sd1yECBAgQSE7gU9Pfyu6fezZ75+jl2WUrz04ufgETIECAwMkClq+e7OEdAQIECFREIM6O+88Pf6ElIVeRjusmAQIECCQtsHP+YPYftt+X/UNI0DkIECBAIG0BM+XSHn/REyBAoHICcXbcB3f/j+zesLuqgwABAgQIVFXgz/fuauzO+p4NV1rOWtVB1G8CBAjkFDBTLieg4gQIECAwPIF/CYm4X3/wsxJywyPXEgECBAgMUGBbWMr6Cw/eE5a0eibqAJlVTYAAgdIKmClX2qHRMQIECBBoCpgd15TwkwABAgTqJnBsE4gHG5tA/PrFl9YtPPEQIECAwBICknJL4LhEgAABAsULxGfHvXfnl7L5I98tvjN6QIAAAQIEBiQQN4HYFmbMvefSK7MLz3zhgFpRLQECBAiUScDy1TKNhr4QIECAwAmBODvu43vvzX5/x/8nIXdCxQsCBAgQqLNA3ATiLWETiDtm99c5TLERIECAwHEBSTlfBQIECBAoncDj88/YWbV0o6JDBAgQIDAMgbic9bd2Ppz9WdgIwkGAAAEC9RawfLXe4ys6AgQIVE7g01MPZfF0ECBAgACBlAUsZ0159MVOgEAqAmbKpTLS4iRAgEDJBZ46dDB75/bPS8iVfJx0jwABAgSGJ9Bczmp31uGZa4kAAQLDFJCUG6a2tggQIEBgUYEvzTyW/Zftn8v2hGWrDgIECBAgQOB5geburB+devz5D70iQIAAgVoIWL5ai2EUBAECBKop0NjMYc+92R37H6tmAHpNgAABAgSGJBCTco+EjSB+a/3LsrNX+GfckNg1Q4AAgYEKmCk3UF6VEyBAgEA7gbiZwzsf/ryEXDsgnxMgQIAAgQUCd4ZdWd/y8H3ZoyE55yBAgACB6gtIylV/DEVAgACBygl8cfobYbnq57OZw/5RUbnB02ECBAgQKFRg3+FD2dt2PJh9YWa60H5onAABAgTyC5j3nN9QDQQIECDQoUBcrvpXu7+c3Tv7zQ5LuI0AAQIECBBYKBCfM/eeyUeyR587mP36xS9deNl7AgQIEKiIgKRcRQZKNwkQIFB1gbhc9b07bzc7ruoDqf8ECBAgUBqBf5j+VljKeiD7ww1XeM5caUZFRwgQINC5gOWrnVu5kwABAgR6FLBctUc4xQgQIECAwDIC2+ae9Zy5ZYxcJkCAQFkFJOXKOjL6RYAAgRoINJer/s3ee2sQjRAIECBAgEA5BTxnrpzjolcECBBYTsDy1eWEXCdAgACBngTictW/mvxytif8dBAgQIAAAQKDFWg+Z+6Jw9/J/v3adYNtTO0ECBAg0BcBSbm+MKqEAAECBFoF/mV2b/bXYUOH+SPfbf3YawIECBAgQGDAAh+d2hOeM3cw+631L/OcuQFbq54AAQJ5BSxfzSuoPAECBAicJPDpqQez9+38koTcSSreECBAgACB4QncObs/e9uOB7N9h74zvEa1RIAAAQJdC0jKdU2mAAECBAgsJhCfH/e+sLvqZ6YeWuyyzwgQIECAAIEhCuwMs+XGt9/fmDU3xGY1RYAAAQJdCEjKdYHlVgIECBBYXCA+P+73d9ya3RuWrToIECBAgACBcgjE58zFGXNfmJkuR4f0ggABAgROEvBMuZM4vCFAgACBbgViIu6vd99tuWq3cO4nQIAAAQJDELABxBCQNUGAAIEeBSTleoRTjAABAgSy7IvT38j+du+/oCBAgAABAgRKLhA3gHji0KHGBhAl76ruESBAIBkBy1eTGWqBEiBAoL8CcXachFx/TdVGgAABAgQGKfCF/U82njN3ICxrdRAgQIBA8QKScsWPgR4QIECgUgJxQ4f/sv1z2R37H6tUv3WWAAECBAgQyLK4AcSv7XgozJqzM6vvAwECBIoWkJQregS0T4AAgQoJNDd02BM2dnAQIECAAAEC1RSIibm3bN9mZ9ZqDp9eEyBQIwFJuRoNplAIECAwSIGYkPuDHbdkEnKDVFY3AQIECBAYjkBcwvq2MGPujtn9w2lQKwQIECBwioCk3CkkPiBAgACBhQJfmtmV/VZYsjp/5LsLL3lPgAABAgQIVFQgJubeufPr2ednpisagW4TIECg2gKSctUeP70nQIDAwAU+M/Vg9qHJLw+8HQ0QIECAAAECxQi8Z/LR7L+F3VkdBAgQIDBcAUm54XprjQABApUSiDusxqScgwABAgQIEKi3QEzK/cHuR+odpOgIECBQMoHTS9Yf3SFAgACBEgjEHVbft/P27OtzlrOUYDh0gQABAgQIDEXgC/ufbLTz9ktemp29wj8Vh4KuEQIEkhYwUy7p4Rc8AQIEThWICbnf33GrhNypND4hQIAAAQK1F4iJuV8LG0DE5805CBAgQGCwApJyg/VVOwECBCol8Pj8042EnB1WKzVsOkuAAAECBPoqsHP+oMRcX0VVRoAAgcUFJOUWd/EpAQIEkhOICbn37Lglk5BLbugFTIAAAQIEThFoJuYeDQk6BwECBAgMRkBSbjCuaiVAgEClBJoJufkj361Uv3WWAAECBAgQGJxATMy9LSxllZgbnLGaCRBIW0BSLu3xFz0BAgSyO2Z2NWbIScj5MhAgQIAAAQILBeKz5STmFqp4T4AAgf4ISMr1x1EtBAgQqKRATMh9aPLuTEKuksOn0wQIECBAYCgCEnNDYdYIAQIJCkjKJTjoQiZAgEAUaCbkaBAgQIAAAQIElhOIibnx7duyz888udytrhMgQIBAhwKSch1CuY0AAQJ1EpCQq9NoioUAAQIECAxP4A8mH5WYGx63lggQqLnA6TWPT3gECBAgsEDgQ7vvzu7Yv2vBp94SIECAAAECBDoTiIm5eLxu9QWdFXAXAQIECCwqYKbcoiw+JECAQD0FJOTqOa6iIkCAAAECwxYwY27Y4tojQKCOApJydRxVMREgQGARAQm5RVB8RIAAAQIECPQsIDHXM52CBAgQaAhIyvkiECBAIAEBCbkEBlmIBAgQIECgAAGJuQLQNUmAQG0EJOVqM5QCIUCAwOICEnKLu/iUAAECBAgQ6I9ATMx9ZGpPfypTCwECBBISkJRLaLCFSoBAegIScumNuYgJECBAgEARAv9tam/2+7uPbQBRRPvaJECAQBUFJOWqOGr6TIAAgQ4EJOQ6QHILAQIECBAg0DeBL+x/UmKub5oqIkAgBQFJuRRGWYwECCQnICGX3JALmAABAgQIlEJAYq4Uw6ATBAhUREBSriIDpZsECBDoVEBCrlMp9xEgQIAAAQKDEJCYG4SqOgkQqKPA6XUMSkwECBBIVeBDu+/K7tj/WKrhi5sAAQIECBAoiUBMzMXjXesvK0mPdIMAAfwq7ToAAEAASURBVALlEzBTrnxjokcECBDoSSAm5O7cv6unsgoRIECAAAECBPotEBNz79+7u9/Vqo8AAQK1EZCUq81QCoQAgZQFJORSHn2xEyBAgACB8gr8v9NT2ednjs2aK28v9YwAAQLFCFi+Woy7VgkQINA3gZunv26GXN80VUSAQKcCZ604PVu/cuTE7fH9S1e++MT7+OLsFS845bPWG462vunw9UNzT5+4s1n+wZbPDh75bvbY/NyJe7wgQKB4gT+YfLTRidetvqD4zugBAQIESiQgKVeiwdAVAgQIdCtwx8yu7O/2frXbYu4nQIBAW4GXrzqvcS0m2GJS7ayWxNoFZ7woW3PmyrZlh3HhquP966StmKDbdTxBN33ouWz68HyjWDOJF68dPPK9TqpyDwECOQViYi4m0l8vMZdTUnECBOokIClXp9EUCwECSQnEhNyHJ+9KKmbBEiCQX6CZdHtFSG4dS7idc1LiLX8L5akhxnfVqpcc69Cq9v3aNf/tRnKu+fOBMPPOjLv2Xq4Q6FXgDyZ3NopKzPUqqBwBAnUTkJSr24iKhwCBJAQk5JIYZkES6Fkgzmi7IMxoa028xZlvMUnlOFXg0uPLbpsJvP+95ZZjM+yey+Lsuvh63+HnstYltC23ekmAQAcCEnMdILmFAIFkBCTlkhlqgRIgUBeBPfNPmyFXl8EUB4GcAitDkm39ynPCc9vC+aIXn0jE5axW8RaBNWfGJbsven7G3fFrMUG367m5sDz22yFh90zjp6WwLXBeElhCQGJuCRyXCBBISkBSLqnhFiwBAlUXiAm59+y4peph6D8BAj0IxNlvzQRcXIK65oyVjSRcD1Up0geBZrLuR0eef3C9RF0fYFWRjEBMzF105pnZK1edk0zMAiVAgMBCgdOOHj06ET7ctPCC9wQIECBQLoFmQm7+yOElO3Y0O23J68tdrHL5Kvc9jkue/ucpm7ftqpcvo12cAReXm75i1epjibjjs+CitaNaAnEziWOz6Z7OHggz6p4My1/jUcbvXTeyefqfpyy7ev03/uwVK7K/vPzl2WUrz+rm6+deAgQI1EXgWkm5ugylOAgQqLVATMS96+F/zGYOH1w2zpT/sSP2Zb8ebW9g15Zm2Qv9sIuz4F4eEnDHknAvbixHXbZhN1RSIM6mixtJxARdXPY6fTxJ120w/fjeddtm6/152s9TNvYh5fJ1jF1irvU3y2sCBBITkJRLbMCFS4BABQViQu49O27O9sw/01Hv6/gX9o4CDzeJvVOpU+9jd6pJp5/0YheXocYlqDER99IXnWMZaqfYNbzvWJLumUairpskXS/fu1a+IssX2XY0qHL7Ve77UvYSc62/nV4TIJCQgKRcQoMtVAIEKirwru3/2HFCLoZY17+wdzJ8Yu9EafF72C3u0smnndhdEJ7/9qpzLzwxG84uqJ3IpnlPXO4aZ9LdPftkYyZdO4VOvnftysbPiyxfZNtFx563/TrbxcTcZ676oezsFR57Hr8nDgIEkhCQlEtimAVJgEBlBT60+67szv27uup/nf/CvhyE2JcTan+dXXub5a4sZhefCffqkeeTcBecuXK5alwncIrAgSPfy+5+5skTSbrW3V0X+96dUsESHxRZvsi2I0mV269y3zux3xCeLfeBy6+UmFvid9clAgRqJSApV6vhFAwBArUS6CUhFwHq/hf2pQZZ7EvpLH2N3dI+S11t2sWlqHFJ6qtHLmpszrBUGdcI9CLQnEF39zNPZfsOf6eXKk6UaX5vT3zQ5Ys85fOUjd1MuXwKsUvMdfnL6HYCBKosIClX5dHTdwIE6itwx8yu7MOTd/UUYAp/YW8HI/Z2Mst/zm55o4V3HJsNd1F2ZUjGvfrcizJLUhcKeT9IgbjM9eb9U42ZdNM9JOiK/J0vsu04JlVuv8p978b+mlUvbuzKOsjfIXUTIECgBAKSciUYBF0gQIDASQL3zu7N3r/ztpM+6+ZNKn9hX8xE7IupdPYZu86czg/PhosJuFeF2XBxZpyDQBkEeknQFfk7X2Tbcbyq3H6V+96t/evOuyB71/oNZfgV0wcCBAgMSkBSblCy6iVAgEAvAnvmnw47rd6SxR1Xez1S+gv7QiOxLxTp/D279lajYafUf33eJY1EnGfDtXdypRwCd4UNIuLy1viz9Rl0C3tX5O98kW1Hhyq3X+W+92IvMbfwN9d7AgRqJiApV7MBFQ4BAhUWiIm4//Tgp0NC7ru5okjtL+ytWGJv1ejuNbuTvSTiTvbwrpoCt8xMNZJzd88+dUoARf7OF9l2hKhy+1Xue6/2b794ffZv11x0ynfYBwQIEKiBwLX2m67BKAqBAIHqC8SE3B/uuDl7rjFD7rTqByQCAhUUkIir4KDp8pICP7V6bRbP6UPPNZ4/F5N0vTx/bslGXCQwYIH3790ddmNdkb1+9QUDbkn1BAgQGL7AaUePHp0IzW4aftNaJECAAIGmwPt3/nN2X3iWXDxS/L/gTYe88adsl3Lseb43MRH3k+etszS19ZfQ61oLPDD3TBaTczfvfyJXnHn+zMlTNnY65fIpx/4Xl788e2XYAMJBgACBGglYvlqjwRQKAQIVFfi7vfdkt0x//UTvU/4Ld0TIE3+esnnbLrp8yrF3ax83a3hV2KzhZy/YkHlGXNRzpCiwL8yeuyUk5m7ucfZcnj9z8pSNY5Vy+ZRjP2vF6dkHLr8yu2zlWSn+yoqZAIF6CkjK1XNcRUWAQFUE7pjZmd04eddJ3U35L9wRIk/8ecrmbbvo8inH3on9yhUvaMyG+8nV6+yaGsEcBFoEYmIuzpx7MMyi6/TI82dOnrKxfymXTz32uIz1pqteGZazegpTp7+r7iNAoNQCknKlHh6dI0Cg1gJxp9Xf3v6Pp8SY8l+4I0ae+POUzdt20eVTjn0p+x8ZuSgk49ZmP7n6knibgwCBJQR2zc9ln57e05hBt8RtjUt5/szJUzY2nnJ5sWeNmXIfuPwKibnlfkldJ0CgCgKSclUYJX0kQKB+AjOHDmTvCgm5Yxs7nBxfyn/hjhJ54s9TNm/bRZdPOfaF9nF56s+uubSRjLM8Neo4CHQncODI97LPhORcTNAdDK8XO/L8mZOnbOxLyuXFfuzbeE14tlxcyuogQIBAxQUk5So+gLpPgEAFBZo7rcaZcosdKf+FO3rkiT9P2bxtF10+5dib9teed0mYEWd5avRwEOiHQEzO3fXMk9nHpx47ZdfWPH/m5Ckb40q5vNif/2a/7rzzs99ev+H5D7wiQIBA9QSutRi/eoOmxwQIVFzg7/bck7VLyFU8NN0nMHSBY7PiNmTXhmTcWeG5cQ4CBPonEJ/b9drVaxtnfO7cYsm5/rWmJgLdCXx+/1PZRWeemf3HtRd3V9DdBAgQKJGApFyJBkNXCBCov8BNU9uyO/fvqn+gIiQwYIFrz1sXEnGXhE0bzh9wS6onQCAKLEzO7Tt8CAyBwgU+MvXN7KIzXpi9frX/FhQ+GDpAgEBPAqcdPXp0IpTc1FNphQgQIECgY4F7Z/dkf7bztmXvT3lpSsTJE3+esnnbLrp8CrHHWXFxeeob1mwwKy5+4RwEChS4a/ap7GNhWeuu+QNd9yKFP6+WQskTf56ysU9VLr9U3z9+xVWNDSCWcneNAAECJRTwTLkSDoouESBQQ4G4XPU9O25edGOHheEu9ZfOhfcu9j7l8mJf7BvR2Wdltrty1epGIi7uouogQKBcAjfPPNFIzk0f/k7HHSvznzedBFFk/4tsO9oU2f5SbZ+9YkX28Suubixn7WQM3UOAAIGSCEjKlWQgdIMAgRoLLLexw8LQl/pL58J7F3ufcnmxL/aN6OyzstmtDM+Hi0m4f7v2BzM7qHY2hu4iUKRAN8m5sv15061bkf0vsu3oVGT7y7V92cqzwo6sV2TxWYgOAgQIVERAUq4iA6WbBAhUWODDu+/s6jlyy/2lczmKlMuLfblvR/vrZbGzRLX9GLlCoAoCMTn3l3sfyQ6GnVvbHWX586Zd/5b7vMj+F9l2dCmy/U7avmbVi0Ni7srlhtB1AgQIlEVAUq4sI6EfBAjUU+Dm6e3ZJ/Z+tavgOvlL51IVplxe7Et9M5a+VrTdupUj2Rsu2NB4ZtzSPXWVAIGyCxwICblPT+8J595Fk3NF/3lT5far3Pf4vc3T/07Lvu6887PfXr+h7L8m+keAAIEocK25vb4IBAgQGJBAfI5ctwm5AXVFtQRKK3Bl2D01LlGNPx0ECNRDIC4fvG7tS7M3r7kk+8s9j2S37H+iHoGJohICn9//VPbKVefYkbUSo6WTBAjYfdV3gAABAgMQiM+R+08PfrqjjR0WNt/p/wleWK75PuXyYm9+C7r/OWy7sfPWhWTcFZ4X1/1QKUGgcgI75+eyD+x9NHtg7plG34f9581CsCq3X+W+x3HI0/9uy/5lWMb6yrCc1UGAAIESC1i+WuLB0TUCBCos8Ic7vph9Y266pwi6/UvnwkZSLi/2hd+Gzt8Pwy5u3nDt6nVhmeplknGdD407CdRG4K7Zpxoz5/YdPpQrpmH8ebVUB4tsv8i2o0mR7XfbdtyRNT5fLm4A4SBAgEBJBSxfLenA6BYBAhUW2Dq1reeEXIXD1nUCbQViMu4NazaE87LsrPDaQYBAmgKvGTk/u3rVuY1nzX2qzfPm0pQR9SAEDhw5kv3XyV12ZB0ErjoJEOibgOWrfaNUEQECBLKQjNuX/T9hlly3/ze31S5P2VhPyuXF3vpN6u71IOwk47obA3cTSElg36HvZH80uT0saZ3tOuxB/HnVTSeKbL/ItqNRke332vZPjLwk+6MNl3czxO4lQIDAsAQsXx2WtHYIEKi/QHyO3P/14Kcaz5Hr9S+OUSlP2dTLp2xXptjPP2Nl43lxcamqgwABAksJ3NlY0vpoNn34O0vddtK1Mv15d1LHOnyTp/95ysbuVbl8nr7/h7U/kP3HtRd3OEJuI0CAwNAELF8dGrWGCBCovcCf7fznnjZ2qD2MAJMRkIxLZqgFSqBvAj8WlrRuDEtaPza1u7GstW8Vq4hAi8BHpr6ZXXTGC+3I2mLiJQEC5RA4vRzd0AsCBAhUW+DYc+T2VTsIvSfQo0BMxv3i2isbmzj0WIViBAgkLHD2itOzX734suw1I6uzvwy7tO6aP5CwhtAHJfC+vZNh04eV2cts/DAoYvUSINCDgGfK9YCmCAECBFoFms+Ra/0szxKLPGVjH1IuL/bWb2F3r3uxO5aMuyIk40a7a8zdBAgQWEIgzpqLZ7ujlz+vWuuqcvkq9z2OQZ7+5ynbbPvCM87M/ubKV2SrQiLYQYAAgRIIeKZcCQZBFwgQqLBA63PkWsPI8xfHPGVjH1IuL/bWb2F3r7uxixs4/OLaKxq7qXbXirsJECDQmcDOMFsubgSx2Ky5bv68Wqy1Kpevct/jWOTpf56yrW1fs+rF2Qcvv2Kxr4bPCBAgMGyBa79v2C1qjwABAnUSuHH3nZ4jV6cBFcuSAs1k3Aevep2E3JJSLhIgkFdgw8qzsw9f8SPZdWvX561KeQInCdw/9+3sxvCMOQcBAgTKIGDebhlGQR8IEKikwC3T27P7ZvdUsu86TaAbgZiMe8Oay7LXh/Os8NpBgACBYQnEpNxrwmYQv73zwa52aB1W/7RTTYGYlIvPl9s08pJqBqDXBAjURsBMudoMpUAIEBimwJ75p7NP7L1nmE1qi0AhAmPnrcvizLi4XFVCrpAh0CiB5AUas+au/JHszWsuTt4CQP8E/uvuXdkj8wf7V6GaCBAg0IOApFwPaIoQIJC2QHyO3Icn70wbQfS1F4jJuA+84meyX1v/w5JxtR9tARIov0Bzh9bf2/CK8GeSxT7lH7Hy9/DAkSPZf53clc0d+V75O6uHBAjUVkBSrrZDKzACBAYlsHVqW7Y3zJRzEKijwBWrzs/+5Ip/00jGXXDmWXUMUUwECFRY4MfCUtYbr/jh7OpVIxWOQtfLIvDo/Hx2w57Hy9Id/SBAIEEB/5spwUEXMgECvQvEZ8jFZ8k5CNRNYHTlOdlbLt6YXRmScg4CBAiUWeDCM1+Y3XD5NdmWqd3Zx6Ymy9xVfauAwOf2P9V4vtwvrbmoAr3VRQIE6iYgKVe3ERUPAQIDE2gsWw27rToI1Eng/DNWhufFXZmNrR6tU1hiIUAgAYHxsAnExlXnZu/a+VB20BLEBEZ8cCHesPfx7JWrXpy9bKUZ4oNTVjMBAosJWL66mIrPCBAgsIjAjSEh91x4npyDQB0E4o6qvxA2b/jjK39KQq4OAyoGAokKbAzLWONy1ktXnp2ogLD7JfArO7Z7vly/MNVDgEDHApJyHVO5kQCBlAXunNmZxaWrDgJ1EBg7bzQ8N+5/acyQs6NqHUZUDATSFojLWWNi7rXnXZg2hOhzCcSNH35z5yO56lCYAAEC3QpIynUr5n4CBJITmDl0IPu7vfckF7eA6ycQN3HYfPlY9qthR9XzbeJQvwEWEYHEBf7z+h/M/u/RH0xcQfh5BO6f+3Z249Q381ShLAECBLoS8Ey5rrjcTIBAigI3Tlq2muK41ylmz42r02iKhQCBpQR+evWF2YawlPX6Hfd7ztxSUK61FYhJufh8uXg6CBAgMGgBM+UGLax+AgQqLRB3Wv3G3L5Kx6DzaQt4blza4y96AikKxKSc58ylOPL9i/k3d+7wfLn+caqJAIElBCTllsBxiQCBtAXistWbpraljSD6ygr88Mja7AOveJ3nxlV2BHWcAIE8AvE5czdcfo0NIPIgJlzW8+USHnyhExiygKTckME1R4BAdQTev+uf7bZaneHS0+MCcalqfG7cb254jefG+VYQIJC0wNkrTrcBRNLfgHzBe75cPj+lCRDoTMAz5TpzchcBAokJbA0z5PbOP51Y1MKtssDKFS/IXr/mssbMuCrHoe8ECBDot0DcACIeN+/3OIp+29a9Ps+Xq/sIi49A8QKScsWPgR4QIFAygT0hGReTcg4CVRH44ZHvz8Yv3mhmXFUGTD8JEOibwIEj38t2zh/Ijv2ca9TbfB/f7Dv0nWz68Hf61p6K0hOIz5e76aprslVh5qWDAAEC/RbwJ0u/RdVHgEDlBT6x9yuVj0EAaQjEpaq/sv5HsitXXZBGwKIkQCBJgWbCbdfx5Nv9c7ONJFx87yAwaIHm8+U+ePkVg25K/QQIJCggKZfgoAuZAIH2ArdMP5ztaOy2elr7m1whUAKBX1h7Zfa6NS/LzgrLVh0ECBCoi0Cc2bbzubksJty2zT3TmAV3MMyGaz2OZv4b3erh9eAF4vPl/n56X/ZLay4cfGNaIEAgKQFJuaSGW7AECCwlEHdbtWx1KSHXyiBwxarzs18d/RFLVcswGPpAgEAugTgDLibelkrA5WpAYQJ9FHjf3sezV656cfaylSv7WKuqCBBIXUBSLvVvgPgJEDghcOPkHXZbPaHhRdkE4kYOcXbc68PsOAcBAgSqKBCTcA+EJNy2sPy0mYyrYhz6nK7AO3Y+kv3tla8Iz5dbkS6CyAkQ6KuApFxfOVVGgEBVBZ5ftlrVCPS7zgJmx9V5dMVGoN4Cd80+1UjAxWRc8xlwlp/We8zrHN2+w4ey9+2ZzH5n/aV1DlNsBAgMUUBSbojYmiJAoJwC80cOW7ZazqHRqyBwXdhV1ew4XwUCBKoiEJ8JFxNxMQkXfzoI1E3gc/tnGstY37D6/LqFJh4CBAoQkJQrAF2TBAiUS+DG3ZatlmtE9CYKrFs50nh23Gj46SBAgECZBXbOz2U373+ikYhrzoYrc3/1jUBegfh8uR8Kz5e76Mwz81alPAECiQtIyiX+BRA+gdQF7pvdk90fTgeBMgm8bs1l2fjF15SpS/pCgACBkwSaibi7nnkqmz78nZOueUOg7gIHjhzJ3rErPF/uilfUPVTxESAwYAFJuQEDq54AgfIKxGWrn9jzlfJ2UM+SE4ibObxjw2uyK1ddkFzsAiZAoPwC+w49l33myb3ZXc88mcVnazkIpCzw6Px89uGpb2b/x9ofSJlB7AQI5BSQlMsJqDgBAtUV2Dp1f7b/8IHqBqDntRKImzn8xoYfz84KiTkHAQIEyiIQd0yNSbiYjNsVlqk+f5z2/EuvCCQqcOPUt7JNIy/JXrZyZaICwiZAIK+ApFxeQeUJEKikwJ75p7Nbp7dXsu86XT+B68JS1deteVn9AhMRAQKVFYgbNdw8M5XdEp4V5yBAoL3AO3aGZaxXviJbtWJF+5tcIUCAQBsBSbk2MD4mQKDeAjdO3lHvAEVXCYHzzzgrzI77scxmDpUYLp0kUHuB5qy4j0895jlxtR9tAfZLIC7lft+eyex31l/aryrVQ4BAQgKScgkNtlAJEDgmcMv0w9neMFPOQaBIgU3njWbXXfJKy1WLHARtEyDQEIjPiouJuLtmn8oOhuWqDgIEuhP43P6ZbNO5LwlLWc/trqC7CRBIXkBSLvmvAAACaQnEzR22Tm1LK2jRlkogbuYQl6uOrV5fqn7pDAEC6QnEJaqfnt6T3R2ScQ4CBPIJ/N7uXdnWq66xjDUfo9IEkhOQlEtuyAVMIG2BG3ffkT0XEnMOAkUIrFs5kv3K6KssVy0CX5sECJwQuCU8K+6L4VlxD4aknIMAgf4IHDhyJIuJuT/e4Bmx/RFVC4E0BCTl0hhnURIgEAS+Mbcvu392DwsChQj8q5Hvz35l/assVy1EX6MECESBmIz7+NSuxvPijmZ2T/WtINBvgS/NPpP9/fS+7JfWXNjvqtVHgEBNBSTlajqwwiJA4FSBOEvOQaAIAburFqGuTQIEmgKtybjmZ34SIDAYgQ9PfbPxbLmLzjxzMA2olQCBWglIytVqOAVDgEA7ga1T92f7Dx9od9nnBAYiYHfVgbCqlACBDgXumn0y++CeHXZS7dDLbQT6IdBYxjr5WPbBy3+wH9WpgwCBmgtIytV8gIVHgECWzRw6kN0yvR0FgaEKXLHq/Ow3Nvy45apDVdcYAQJRIG7gEJepemac7wOBYgTum/u2ZazF0GuVQOUEJOUqN2Q6TIBAtwKf2PsVmzt0i+b+XAKvW/Oyxg6ruSpRmAABAl0KTB96LvvA3h12U+3Sze0EBiFgGesgVNVJoH4CknL1G1MRESDQImBzhxYMLwcusHLFCxqbOfxw2NTBQYAAgWEJHDjyvcbMuJumbWY0LHPtEFhOwDLW5YRcJ0AgCkjK+R4QIFBrgThLzkFgGALrVo5kbx19dTYafjoIECAwLIG4iUOcHXcwJOYcBAiUS8Ay1nKNh94QKKOApFwZR0WfCBDoi8At0w9ne+ef7ktdKiGwlMC/CjPj3rr+VeH5cWcsdZtrBAgQ6JvArvm5RjLOc+P6RqoiAgMRsIx1IKwqJVAbAUm52gylQAgQaBWYP3I42zq1rfUjrwkMROBnGs+Pe+VA6lYpAQIEFgrEpao3TT8elqs+tvCS9wQIlFDAMtYSDoouESiRgKRciQZDVwgQ6J/A1qn7be7QP041LSIQnx933cWvzDatXr/IVR8RIECg/wIPzD2d/cnuh7Ppw8+Fyk/rfwNqJEBgIAJxGesnp/dl/9uaCwdSv0oJEKiugKRcdcdOzwkQaCMwc+hAduv09jZXfUwgv0BMyP3O5T8Znh93bv7K1ECAAIFlBOLsuL+Z2hlmyNnIYRkqlwmUVuDDU9/KxkbOzS4688zS9lHHCBAYvsD3Db9JLRIgQGCwAh+Z/NJgG1B70gJxQ4c/v+pnJeSS/hYInsDwBOLsuLc+/GUJueGRa4nAQATiMtZ3T1p2PhBclRKosICZchUePF0nQOBUgW/MPZHtmNsXLljWc6qOT/IKbDpvffbvLrnGhg55IZUnQKAjgb+Z2hVmyO3q6F43ESBQfoH75uYsYy3/MOkhgaEKSMoNlVtjBAgMWuAju+8YdBPqT1Tg59e+PIungwABAoMWmD70XPa7u7Zlj4UdVh0ECNRLIC5jfcPq87NVK1bUKzDRECDQk4Dlqz2xKUSAQBkF7pp5NNt/+EAZu6ZPFRaIz4976+irJOQqPIa6TqBKArfMTGW/vP3LEnJVGjR9JdCFQGM31t2WsXZB5lYCtRYwU67Wwys4AukIzB85nH1i71fSCVikQxGwocNQmDVCgEAQiJs5fHDPN7Jb90/xIECg5gK3zz6TxXNT2PjBQYBA2gJmyqU9/qInUBuBW6cfzp4LiTkHgX4JxA0d/uiKn7ahQ79A1UOAQFuBuFz1N3Z8VUKurZALBOon8O4wW24ubP7gIEAgbQFJubTHX/QEaiEwc+hAdktIyjkI9EsgJuR+5/KfzM4/86x+VakeAgQILCoQd1e1XHVRGh8SqLVAXMYany/nIEAgbQHLV9Mef9ETqIXAZ6fuN0uuFiNZjiDiDqtvXf+qcnRGLwgQqLXAZ6Yfz/5q745axyg4AgTaC/z99L6whHUk+6FVL25/kysECNRawEy5Wg+v4AjUXyDOkrtr/6P1D1SEQxH4mTUvk5AbirRGCBD4491fk5DzNSBAIPu93bspECCQsICkXMKDL3QCdRD4yOSX6hCGGEog8Mthh9XrLn5lCXqiCwQI1Fkgbujw1u13e35cnQdZbAS6EHji8CHLWLvwciuBuglIytVtRMVDICGBb8w9ke2Y25dQxEIdhEDcYTUm5DatfukgqlcnAQIETgjsmp/L3rHjnuyx8NNBgACBpkB8ttwThw413/pJgEBCApJyCQ22UAnUTSA+S85BII9ATMj9zuX/WkIuD6KyBAh0JCAh1xGTmwgkK/DuyceSjV3gBFIWkJRLefTFTqDCAvfNPm6WXIXHrwxdbybk1q08twzd0QcCBGos8GDYYTXOkDsYlq46CBAgsJjAfXNz2T/NzCx2yWcECNRYQFKuxoMrNAJ1Fvjknq/UOTyxDVhg3cqR7M+v+l8zCbkBQ6ueAIHslplvhYTcVyXkfBcIEFhW4L17H8/mjhxZ9j43ECBQHwFJufqMpUgIJCNw18yj2f7DB5KJV6D9FYgJubhkdeWKM/pbsdoIECCwQCAm5P508msLPvWWAAECiwscCAm5+Hw5BwEC6QhIyqUz1iIlUBuBrZ4lV5uxHHYgP7jqAgm5YaNrj0CiAhJyiQ68sAnkFPj76X3ZI/PzOWtRnACBqghIylVlpPSTAIGGgFlyvgi9CvzEeesl5HrFU44Aga4EJOS64nIzAQILBGz6sADEWwI1FpCUq/HgCo1A3QTmjxzOPrHXs+TqNq7DiCcm5N66/tXDaEobBAgkLiAhl/gXQPgE+iDwaJgp98kwY85BgED9BSTl6j/GIiRQG4Fbpx/OnguJOQeBbgQk5LrRci8BAnkEJOTy6ClLgECrQHy2nE0fWkW8JlBPAUm5eo6rqAjUTiDOkrslJOUcBLoRePPal5sh1w2YewkQ6FlAQq5nOgUJEFhEIG768N49jy9yxUcECNRJQFKuTqMpFgI1FjBLrsaDO6DQfnn0VdnPr33FgGpXLQECBJ4X2DU/Z5fV5zm8IkCgTwKf2z+T3Tv37T7VphoCBMooIClXxlHRJwIEThIwS+4kDm86EIgJuU2rX9rBnW4hQIBAPoGYkHvHjnvyVaI0AQIE2gjEZawOAgTqKyApV9+xFRmB2giYJVeboRxKIBJyQ2HWCAECQWD60HONhNzBI9/jQYAAgYEI3Dc3l/3TzMxA6lYpAQLFC0jKFT8GekCAwBICZsktgePSKQIScqeQ+IAAgQEJHAiJuM277s8k5AYErFoCBE4IvHfv4zZ9OKHhBYF6CUjK1Ws8RUOgdgJmydVuSAcW0C+PvtqS1YHpqpgAgYUCccnqY2HpqoMAAQKDFoibPnxyet+gm1E/AQIFCEjKFYCuSQIEOhMwS64zJ3dlWUzI/YRnyPkqECAwJIE/3f2QhNyQrDVDgMAxgQ9PTWVPHDqEgwCBmglIytVsQIVDoE4CZsnVaTQHF4uE3OBs1UyAwKkCN01PZrfu9+D1U2V8QoDAoAU2T+4edBPqJ0BgyAKSckMG1xwBAp0JmCXXmVPqd0nIpf4NED+B4Qo8OPd09td7vzHcRrVGgACB4wJx04d7w+kgQKA+ApJy9RlLkRColYBZcrUazoEEIyE3EFaVEiDQRiDutPrunfe1uepjAgQIDEfg3bsfG05DWiFAYCgCknJDYdYIAQLdCJgl141WmvdKyKU57qImUKTAu3fdZ6fVIgdA2wQINASeOHw4bPowTYMAgZoISMrVZCCFQaBOArdOfy177sjhOoUklj4KSMj1EVNVBAh0JPBXe79uY4eOpNxEgMAwBD409a1sLuzI6iBAoPoCknLVH0MREKidwF0zj9YuJgH1R0BCrj+OaiFAoHOBu2ens63Tj3dewJ0ECBAYsMCBkJD75PS+AbeiegIEhiEgKTcMZW0QINCxQEzI7T98oOP73ZiOgIRcOmMtUgJlEYjPkfvT3Q+VpTv6QYAAgRMCH56ayp44dOjEey8IEKimgKRcNcdNrwnUVuCzUx6iXdvBzRGYhFwOPEUJEOhZ4E8mH/IcuZ71FCRAYNACf7p3z6CbUD8BAgMWkJQbMLDqCRDoXMAsuc6tUrpTQi6l0RYrgfII/O3UzuyhuafL0yE9IUCAwAKB22dns3vn5hZ86i0BAlUSkJSr0mjpK4GaC5glV/MB7iE8Cbke0BQhQCC3wK75b2cxKecgQIBA2QXipg8OAgSqKyApV92x03MCtRK4f/Zxz5Kr1YjmD+Ynzntp9hOrX5q/IjUQIECgS4E/DctWHQQIEKiCwH1hptzE7DNV6Ko+EiCwiICk3CIoPiJAYPgCt05/bfiNarG0AjEh98vrX13a/ukYAQL1FYgz5B6btxysviMsMgL1E3jvnj31C0pEBBIRkJRLZKCFSaDMAjvmnsh2zNnWvcxjNMy+ScgNU1tbBAi0Cli22qrhNQECVRF44vDh7J9mZqrSXf0kQKBFQFKuBcNLAgSKEbh1+uFiGtZq6QR+3Ay50o2JDhFIScCy1ZRGW6wE6iUQd2KdO3KkXkGJhkACApJyCQyyEAmUWWDm0IEsPk/OQeCSledm/+6SHwJBgACBQgRump60bLUQeY0SINAPgQMhIffJaStP+mGpDgLDFJCUG6a2tggQOEXAjqunkCT5QUzI/fbl/yZbueKMJOMXNAECxQpMH3rObqvFDoHWCRDog8Anp6fNluuDoyoIDFNAUm6Y2toiQOAkgThL7u79j570mTfpCfz/7N1djJ3nfRj4tzvUDOdwjnbIGXHIsYeSSEqUk42+nASwRGWzwIpSCyxg2d5e1IndXtQJ4hZIsRdJgO7dbtOLvVjEvVjsInYWWGwRxcEW2EaW4d6sv3KzreQki1aUZMuiTHKUORbtGQ45Yw6w55VMakjOx/l4P56P3wEInTnnfZ/n///9T5P23+d5Hw25/GouYwKhCfwvF/5jcXXrRmhhiYcAAQJDCVgtNxSXiwkEIaApF0QZBEEgT4Hv9M7nmbisbwl0Ju4pfvuBT1ghd0vEGwIEmhb4q9UfF3955d2mpzUfAQIEahH43y5eLC5tbNQytkEJEKheQFOuelMjEiAwgMD61mbhgIcBoBK+pGzI/fMzzxb397euehEgQKAtgf/pB3/d1tTmJUCAQC0C/2u/MedFgEAcAppycdRJlASSE3jlvR8W1/qNOa98BTTk8q29zAmEIlAe7vDu5rVQwhEHAQIEKhH4t70Vq+UqkTQIgfoFNOXqNzYDAQI7CDjgYQeUjD76rf6WVSvkMiq4VAkEKHB162cOdwiwLkIiQKAaAavlqnE0CoG6BTTl6hY2PgECdwm8cuWHRW9z7a7PfZCHQNmQ+7X5k3kkK0sCBIIVKFfJOdwh2PIIjACBMQWslhsT0O0EGhLQlGsI2jQECHwo8I3lv/nwD++yEnhm7qSGXFYVlyyBMAWWN64V/6bflPMiQIBAygJWy6VcXbmlIqApl0ol5UEgEoG313vFa6uXI4lWmFUKlA25337wE1UOaSwCBAiMJPB/XHzdKrmR5NxEgEBMAlbLxVQtseYqoCmXa+XlTaAlASeutgTf8rQn+iesfu7Ex1uOwvQECBAoinKV3L/r/QgFAQIEshCwWi6LMksyYgFNuYiLJ3QCsQms909b/W7v9djCFu+YAmVD7r8/818XnYnJMUdyOwECBMYXKFfJeREgQCAXgXK13MWNjVzSlSeB6AQ05aIrmYAJxCvgWXLx1m7UyDsT9xS/3T/YQUNuVEH3ESBQpYBVclVqGosAgVgErJaLpVLizFFAUy7HqsuZQEsC31mxOqEl+tam/ednni3u76+U8yJAgEAIAlbJhVAFMRAg0LTAv+31rJZrGt18BAYU0JQbEMplBAiMJ1A25Hqba+MN4u6oBH6rv0JOQy6qkgmWQNICVsklXV7JESCwj4DVcvsA+ZpASwKaci3Bm5ZAbgLf6Z3PLeWs8/3U4i8VvzZ/MmsDyRMgEJaAVXJh1UM0BAg0K2C1XLPeZiMwqICm3KBSriNAYGSBt9d7xWurl0e+341xCTwzd7L49OKjcQUtWgIEkha4uvWz4i+vLCedo+QIECCwn4DVcvsJ+Z5A8wKacs2bm5FAdgLfWP7/sss514TLk1Z/+8FP5Jq+vAkQCFTg/1p+q7i6dSPQ6IRFgACBZgSslmvG2SwEhhHQlBtGy7UECAwtsL61WXy354CHoeEivGF+8lBRHuzgRYAAgdAE/k2/KedFgAABAkVRNua8CBAIR0BTLpxaiIRAkgJOXE2yrHcl1Zm4p/hnp3+96ExM3vWdDwgQINCmwDdWfmSVXJsFMDcBAkEJ/J/Ly8Xq1lZQMQmGQM4CB3JOXu4ECNQv8I3lv6l/EjO0LvBbDz7lpNXWqyAAAgR2Evg37/5gp499RoBAYgLHJqeK41NTu2Y1M3GgeLhzaMfvz69f3bNRtdbf/n5+/dqO98b24Vq/Ifev+425Lywuxha6eAkkKaApl2RZJUUgDIFXrvyw6G2uhRGMKGoT+FT/UIePzy7VNr6BCRAgMKrA99d/Wnx/fXXU291HgEBLAk90731/5uOTB2812o5te19++eTPr2kpxOLSxkZxaXPj1vT/fvWnt97/h9UP/ufOar+Z9/r6+q3PQ3nzf6+saMqFUgxxZC+gKZf9TwAAgfoEbF2tzzaUkcuTVsumnBcBAgRCFCgPePAiQCAsgZsr2m423O78O6xod4+mXJW3fWXefk3Cm0278/0mXblarfxv2bS7+ffuM1X/zaXNzaJszP038/PVD25EAgSGEtCUG4rLxQQIDCqwsrFWlCvlvNIVKE9a/c0Tv5xugjIjQCBqgatbPyv+Xe9HUecgeAIxCzzR/c+Lmw23J/vvy+2jD+2yfTTmPAeN/eM/X9l387933nezSVeusrv481V4dTbs/vW772rK3VkEfxNoQUBTrgV0UxLIQeA7vfM5pJltju8f7HDqv3SwQ7a/AIkTCF+gPODBiwCB+gXKxlvZbCv/lc23O7eZ1h9BGjM83Om8n8idTbvyUIbymXflM+0u9rfLlo26m9tjx8m8HOff9xuAH+92xxnGvQQIjCmgKTcmoNsJENhZwNbVnV1S+bQ8afW+qZlU0pEHAQIJCnyj906CWUmJQLsCdzbgytVwXvUKdCcm+o2ze9//t32m8pl2r11bf79JVzbXRllVV25h1ZTbruo9geYFNOWaNzcjgeQFHPCQdom/8MAnio91F9JOUnYECEQt4ICHqMsn+IAEHu833W6ugCsbcOUWVK8wBG4+0+7XZw/fCuhmo+5mk26/FXX/ttcr/rsTJ4qy8edFgEA7Av6najvuZiWQtMB3VmxdTbXA5cEOvzZ/KtX05EWAQCIC3/AsuUQqKY2mBcomXLkFtWzAWQXXtP748+3UqCsbdK/9fKtq+b48ZGL7q1wt9w8W/H+2bjfxnkCTAppyTWqbi0AGAisbq8Wr7x/w8HcyyDavFB3skFe9ZUsgZoFvrLwTc/hiJ9CYwOn+c+DK5lvZiHtmdq6xeU3UnEC5PbX8d7PxVm5z/X/7zbmyQVf+K1fL3fyuuajMRIDATQFNuZsS/kuAQCUC3+29Xsk4BglLwMEOYdVDNAQI7C7wl1eWi6tbN3a/wDcEMhcom2/PzB55vxl3fOpg5hr5pV8eKFH+u9mIK5t0XgQItCegKdeevZkJJClg62qSZS0c7JBmXWVFIEWB7763nGJaciIwskB5OMMT3dnimcNlM85quJEhE73x5qmviaYnLQLBC2jKBV8iARKIR8ABD/HUaphIf2Pplx3sMAyYawkQaFWgXCnnRSB3gbIR98zh+eLvzi28f1BD7h7yJ0CAQKgCmnKhVkZcBCIUsEouwqLtE/LHZ5eK5xce2ecqXxMgQCAMAVtXw6iDKNoRONQ/GfXvzS9oxLXDb1YCBAiMJKApNxKbmwgQuFNgfWvz5wc83PmNv2MVmJ88VPzWg5+INXxxEyCQoYCtqxkWPfOUy0bcr5XPiLM1NfNfgvQJEIhVQFMu1sqJm0BgAlbJBVaQMcN5/2CH079edCYmxxzJ7QQIEGhOwNbV5qzN1K7A4/3TUv9ef2tq2Yyb6TfmvAgQIEAgTgH/EzzOuomaQHAC/275b4KLSUCjC5TPkbu/c3j0AdxJgACBhgVsXW0Y3HSNC5Sr4v7u/LHi7x9dLI45NbVxfxMSIECgDgFNuTpUjUkgM4EL672it7mWWdbppvvM3Mni1+ZPpZugzAgQSFLgr1Z/nGRekiJQror7u3PH+g25BRgECBAgkJiAplxiBZUOgTYEvmGVXBvstcx5or867jdP/HItYxuUAAECdQp4nlydusZuQ+D5/vbU/3bhI/3TU2famN6cBAgQINCAgKZcA8imIJC6wCtXfph6ilnkVz5H7gsPPOU5cllUW5IE0hL4/vpPi3c3r6WVlGyyFCi3qP79fiOubMZ5VlyWPwFJEyCQmYCmXGYFly6BqgXKAx6u9U9e9Ypf4DeWfqX/HLkj8SciAwIEshOwdTW7kieX8LHJg8U/WrzfwQ3JVVZCBAgQ2FtAU25vH98SILCPgFVy+wBF8vUzc6eKZzxHLpJqCZMAgTsFvntl+c6P/E0gCoGbzTjPi4uiXIIkQIBA5QKacpWTGpBAPgIrG6vFq7auRl/w8jlyv+E5ctHXUQIEchb4a4c85Fz+KHPXjIuybIImQIBA5QKacpWTGpBAPgJWycVfa8+Ri7+GMiCQu8BfWiWX+08gqvwX3t+m+oCTVKOqmmAJECBQn4CmXH22RiaQvMB3e+eTzzH1BD1HLvUKy49A+gKeJ5d+jVPI8INm3P39ZtyxFNKRAwECBAhUJKApVxGkYQjkJnBhvVdcWP9xbmknla/nyCVVTskQyFbgr1Z72eYu8fAFytNUy5NU/9HiA+EHK0ICBAgQaFxAU65xchMSSEPgO73X00gk0yzmJw95jlymtZc2gZQErm79rPj++mpKKcklIYHP/LwZN9NvzHkRIECAAIGdBPxviJ1UfEaAwL4Cr7z31r7XuCBcgd89/etFZ2Iy3ABFRoAAgQEEbF0dAMkljQs83p0t/uCBM8WxqYONz21CAgQIEIhLQFMurnqJlkAQAuUBD73NtSBiEcTwAi8sPlrc3zky/I3uIECAQGACb67/NLCIhJOzQPncuH964lTxzOx8zgxyJ0CAAIEhBDTlhsByKQECHwhYJRfvL+GR7kLxqcXH4k1A5AQIENgmYKXcNgxvWxX4h4v3958d99HCVtVWy2ByAgQIRCegKRddyQRMoH2BcqWcV3wCnYl7in/W37bqRYAAgVQE/nrVgUOp1DLWPMqtqv906VRxujMTawriJkCAAIEWBTTlWsQ3NYEYBb6zcr64trUZY+jZx/yFB5/2HLnsfwUACKQj8H1bV9MpZoSZlKeq/qOfr46LMHwhEyBAgEAgAppygRRCGARiEbBKLpZK3R7nM3Onio/PLt3+ob8IECAQscBfrfYijl7oMQs4yCHm6omdAAECYQloyoVVD9EQCFpgvb9C7lVbV4Ou0U7BzU8eKn7jxC/v9JXPCBAgEK3A99dXo41d4HEKfLA67oHiM/1nx3kRIECAAIEqBDTlqlA0BoFMBBzwEGehf7f/HLnOxGScwYuaAAECuwh8/5qTV3eh8XENAqf6z4z7gwce8ey4GmwNSYAAgZwFNOVyrr7cCQwpYOvqkGABXP7C4qPF/Z0jAUQiBAIECFQr8MEz5f5OtYMajcAOAv9w8YGi/OdFgAABAgSqFtCUq1rUeAQSFVjZWLV1NbLanugcLj61+FhkUQuXAAEC+wt4ntz+Rq4YX6Dcrvo/nv4vivIZcl4ECBAgQKAOAU25OlSNSSBBAavk4ipqZ+Ke4gsPPBVX0KIlQIDAgAJOXh0QymUjCzzWb8SVDbmZfmPOiwABAgQI1CXgf8vUJWtcAokJfLd3PrGM0k7nhf4KOdtW066x7AjkLLC8eS3n9OVes0B5kMM/WTpd8yyGJ0CAAAECRaEp51dAgMC+AuXW1QvrP973OheEIfBId6F4fuFjYQQjCgIECNQgYKVcDaiGLMrtqn/w4CPF2dl5GgQIECBAoBEBTblGmE1CIG4BW1fjqV95yupv2bYaT8FESoDASAKaciOxuWkPAaer7oHjKwIECBCoTUBTrjZaAxNIR8DW1XhqWW5bnZ+aiSdgkRIgQGBIgatbPyuubt0Y8i6XE9hdwPPjdrfxDQECBAjUK6ApV6+v0QlEL2DrajwlLLetPmfbajwFEykBAiMJvLn+05HucxOBnQSenztW/H5/y6oXAQIECBBoQ0BTrg11cxKISMDW1TiKVW5b/d3T/1UcwYqSAAECYwjYujoGnltvEygPcygPdfAiQIAAAQJtCWjKtSVvXgKRCNi6Gkeh/vGDTxdlY86LAAECqQvYupp6hZvJ7/cfeKR4fv5YM5OZhQABAgQI7CKgKbcLjI8JECgKW1fj+BU8ObtUfLz/z4sAAQI5CPzVai+HNOVYk0B5wurvP/gxJ6zW5GtYAgQIEBhOQFNuOC9XE8hKwNbV8Mtdro77Qn+VnBcBAgRyEbBSLpdKV59n2ZD7n888UZzuOBCpel0jEiBAgMAoAv/ZKDe5hwCBPARsXQ2/zp9d+hXbVsMvkwgJEKhQwDPlKsTMaCgNuYyKLVUCBAhEJKApF1GxhEqgSYHexmpxYf3HTU5priEFytNWn5k/NeRdLidAgEC8Ale3fhZv8CJvTUBDrjV6ExMgQIDAPgKacvsA+ZpArgKvrV7KNfUo8n5/2+oDtq1GUSxBEiBQmcCb6z+tbCwD5SGgIZdHnWVJgACBWAU05WKtnLgJ1CzwypW3ap7B8OMIvLD4WDE/5Zk44xi6lwCB+AQ8Ty6+mrUZsYZcm/rmJkCAAIFBBDTlBlFyDYHMBNa3NotXr/wws6zjSbfctvrcwsfiCVikBAgQqEjA8+QqgsxgGA25DIosRQIECCQgoCmXQBGlQKBqgVffe6vqIY1XocAXbFutUNNQBAgQIJCagIZcahWVDwECBNIV0JRLt7YyIzCygK2rI9PVfqNtq7UTm4AAgYAF/mq1F3B0QgtF4H84/UvF6Y5HPIRSD3EQIECAwO4CmnK72/iGQLYCtq6GWfoTncNF2ZTzIkCAAAECBHYW+L0HPlY83p3d+UufEiBAgACBwAQ05QIriHAItC1glVzbFdh9fttWd7fxDQECeQh4plwedR41yy8unS6enz826u3uI0CAAAECjQtoyjVObkICYQu8+p4DHkKsUHmww4nOkRBDExMBAgQaE3D6amPU0U303Nyx4jMLS9HFLWACBAgQyFtAUy7v+suewF0CVsrdRdL6B/OTh2xbbb0KAiBAgACBUAUe629X/f0HnUoean3ERYAAAQK7C2jK7W7jGwLZCby2eqm4trWZXd6hJ/zZE79adCYmQw9TfAQIEKhVwCEPtfJGO/jC5MGiPNjBiwABAgQIxCigKRdj1cRMoCYBq+Rqgh1j2Cdnl4qP9/95ESBAgAABArcLHJo48H5Dbqb/Xy8CBAgQIBCjgKZcjFUTM4GaBF59762aRjbsKALl6rjfWPqVUW51DwECBAgQSF7gnyw9VJzuzCSfpwQJECBAIF0BTbl0ayszAkMJ9DZWi97m2lD3uLhegRcWHyvmp/w/NupVNjoBArEIOHk1lko1E+enFz7qpNVmqM1CgAABAjUKaMrViGtoAjEJvHLFqash1etE53BRnrjqRYAAAQIfCDh51S/hpsCp/uq4cpWcFwECBAgQiF1AUy72CoqfQEUCnidXEWRFw3zWttWKJA1DgAABAikJvP8cuVMOdkippnIhQIBAzgKacjlXX+4Efi6w3j9x9Xz/5FWvMATKFXIf6x4LIxhRECBAgACBgAR+78GPFcemDgYUkVAIECBAgMDoAppyo9u5k0AyAg54CKeU0/3DHcpnyXkRIECAwO0Cb67/9PYP/JWdwNOz88XZ2fuyy1vCBAgQIJCugKZcurWVGYGBBV6zSm5gq7ovLLetlqeuehEgQIDA7QJXt352+wf+ykpgYfJg8XsP/kJWOUuWAAECBNIX0JRLv8YyJLCvgOfJ7UvUyAWPdBeKZ+ZPNzKXSQgQIECAQEwC5bbVmYkDMYUsVgIECBAgsK+Apty+RC4gkLbAhfVeca3/TDmv9gU+u/Sr7QchAgIECBAgEJjAc3PHi8e7hwOLSjgECBAgQGB8AU258Q2NQCBqAavkwijfuf7hDic6R8IIRhQECBAgQCAQgfK01S+eeCiQaIRBgAABAgSqFdCUq9bTaASiE3j1yg+jizm1gD843OHx1NKSDwECBAgQGFvAttWxCQ1AgAABAgELaMoFXByhEahboLexWpTbV73aFXC4Q7v+ZidAIA6B7zt9NY5CVRjlY91Zp61W6GkoAgQIEAhPQFMuvJqIiEBjAk5dbYx614kc7rArjS8IECBwm8DVrRu3/e2P9AV+7wGnraZfZRkSIEAgbwFNubzrL/vMBTTl2v8BvLBo22r7VRABAQIECIQm8PnFB4tjUwdDC0s8BAgQIECgUgFNuUo5DUYgLgGHPLRbr7Nzp4pHusfaDcLsBAgQIEAgMIHycIdPLywFFpVwCBAgQIBA9QKactWbGpFAFALls+SubW1GEWuKQZaHO3z2xK+mmJqcCBAgQIDAWAJfXHqomOk35rwIECBAgEDqAppyqVdYfgR2EbBKbheYhj5+buFjRaffmPMiQIAAAQIEPhRYmDxYPD9//MMPvCNAgAABAgkLaMolXFypEdhL4NUrP9zra9/VKDA/OVN4llyNwIYmQIAAgWgFvnjioWhjFzgBAgQIEBhWQFNuWDHXE0hAYL2/bbXcvurVjsA/OPEr7UxsVgIECBAgELDAY93Z4uzsfQFHKDQCBAgQIFCtgKZctZ5GIxCFwGurF6OIM8UgH+kuFB+fPZFianIiQIAAAQJjCZQnrnoRIECAAIGcBDTlcqq2XAn8XODV92xdbevH8I8fONvW1OYlQIAAAQLBCpSr5B7vHg42PoERIECAAIE6BDTl6lA1JoHABayUa6dAZ+dOFfNTM+1MblYCBAgQIBCwgFVyARdHaAQIECBQm4CmXG20BiYQpkBvY7Xoba6FGVzCUU33T1r97IlfTThDqREgQIAAgdEETnVmrJIbjc5dBAgQIBC5gKZc5AUUPoFhBV5x6uqwZJVc/9zCx4pOvzHnRYAAAQIECNwu8OmjS7d/4C8CBAgQIJCJgKZcJoWWJoGbArau3pRo7r/zkzPFC4uPNzehmQgQIECAQCQCC5MHi+fnj0cSrTAJECBAgEC1Appy1XoajUDwAq+tXgo+xtQC/OTiY6mlJB8CBAgQIFCJgGfJVcJoEAIECBCIVEBTLtLCCZvAKAIX1nvUwo0lAABAAElEQVTFta3NUW51z4gCj3QXimfmT494t9sIECBAgEC6AocmDhRnD9+XboIyI0CAAAEC+whoyu0D5GsCKQlYJdd8NW1bbd7cjAQIECAQh8BnFpaKmX5jzosAAQIECOQqoCmXa+XlnaXAK1feyjLvtpJ+cnapeKR7rK3pzUuAAIGkBH6peySpfCRTFM/NeZac3wEBAgQI5C2gKZd3/WWfmcB5z5NrtOKfXfrVRuczGQECBAgQiEWgbMgdmzoYS7jiJECAAAECtQhoytXCalAC4QnYutpsTc7OnSrmp2aandRsBAgQIEAgEoHn5q0kj6RUwiRAgACBGgU05WrENTSBkAReW70YUjhJxzI9MVl89oRVckkXWXIECBAgMLLAwuTB4vHu4ZHvdyMBAgQIEEhFQFMulUrKg8A+AlbK7QNU4dfPLfxC0ek35rwIECBAgACBuwXKAx68CBAgQIAAgaLQlPMrIJCJgOfJNVPocpXcuX5TzosAAQIECBDYWeC5eQc87CzjUwIECBDITUBTLreKyzdLAavkmit7ebiDVXLNeZuJAIF8BE527s0n2YQzPdc/4GFm4kDCGUqNAAECBAgMLqApN7iVKwlEK+B5cs2Ubm5ypjg7f7qZycxCgACBzARmJu7JLOM00z17+L40E5MVAQIECBAYQUBTbgQ0txCITcBKuWYq9sLi481MZBYCBAgQIBChQHnAw9OzmnIRlk7IBAgQIFCTgKZcTbCGJRCSgOfJ1V+Npc4Rq+TqZzYDAQIECEQs8LRVchFXT+gECBAgUIeAplwdqsYkEJCAVXLNFKN8lpwXAQIECNQncMhzyOrDbWjk5/rPk/MiQIAAAQIEPhTQlPvQwjsCSQp4nlz9ZX2ke6wo/3kRIECAQH0CDnqoz7aJkcutq6c73SamMgcBAgQIEIhGQFMumlIJlMBoAlbKjeY2zF2f9Cy5YbhcS4AAAQIZCti6mmHRpUyAAAEC+wpoyu1L5AICcQt4nly99bNKrl5foxMgQIBAGgK2rqZRR1kQIECAQLUCmnLVehqNQFACVsnVXw6r5Oo3NgMBAgRKgVOde0FEKmDraqSFEzYBAgQI1C6gKVc7sQkItCfgeXL12p+dO+1ZcvUSG50AAQK3BA5N3HPrvTdxCdi6Gle9REuAAAECzQloyjVnbSYCjQtYKVcvuVVy9foanQABAgTSELB1NY06yoIAAQIEqhfQlKve1IgEghG4sN4LJpbUAilXyc1PzaSWlnwIECAQtIATWIMuz47BHZo44NTVHWV8SIAAAQIEikJTzq+AQKICZUPu2tZmotm1n5ZVcu3XQAQECOQnUDZ4vOISeHr2vrgCFi0BAgQIEGhQQFOuQWxTEWhSwPPk6tO2Sq4+WyMTIECAQFoCj3cPp5WQbAgQIECAQIUCmnIVYhqKQEgC51cvhRROUrFYJZdUOSVDgEBEAravRlSsn4fqkIf4aiZiAgQIEGhOQFOuOWszEWhU4ML6SqPz5TKZVXK5VFqeBAiEKDDjBNYQy7JrTKc6M8WMLce7+viCAAECBAhoyvkNEEhQoLexWvQ21xLMrP2UrJJrvwYiIEAgXwHPlIur9o/ZuhpXwURLgAABAo0LaMo1Tm5CAvULvGbrai3IVsnVwmpQAgQIDCxg++rAVEFc6HlyQZRBEAQIECAQsICmXMDFERqBUQUuXLN1dVS7ve6zSm4vHd8RIECAAIHbBayUu93DXwQIECBA4E4BTbk7RfxNIAEBK+WqL6JVctWbGpEAAQLDCpzq3DvsLa5vScDz5FqCNy0BAgQIRCWgKRdVuQRLYDCBd9Z7g13oqoEFrJIbmMqFBAgQqE3gkIMearOtemCr5KoWNR4BAgQIpCigKZdiVeWUtcBrqxezzr+O5K2Sq0PVmAQIEBhN4Ojk9Gg3uqtRgdPT3UbnMxkBAgQIEIhRQFMuxqqJmcAeAucd8rCHzmhfWSU3mpu7CBAgUIfAwpSmXB2uVY9ppVzVosYjQIAAgRQFNOVSrKqcsha4YOtqpfW3Sq5SToMRIEBgbIGFyc7YYxigXoFDEweKY1MH653E6AQIECBAIAEBTbkEiigFAtsFbF/drjH+e6vkxjc0AgECBKoUsFKuSs16xjrdsXW1HlmjEiBAgEBqAppyqVVUPlkL9DZWi2tbm1kbVJm8VXJVahqLAAEC1QiUq7C8whZ4rDsbdoCiI0CAAAECgQhoygVSCGEQqELgNc+Tq4Lx1hjnFn7h1ntvCBAgQCAMgZOde8MIRBS7ChxzGMeuNr4gQIAAAQLbBTTltmt4TyBygQvXViLPIJzwH+keK050joQTkEgIECBA4H0Bz5QL/4dwqjMTfpAiJECAAAECAQhoygVQBCEQqErAIQ9VSRaFZ8lVZ2kkAgQIVCngmXJVatYzlmfK1eNqVAIECBBIT0BTLr2ayihjgfO2r1ZS/TP9VXLlSjkvAgQIEAhT4KjtkWEWph+VVXLBlkZgBAgQIBCggKZcgEUREoFRBJy6Oorazvd8cvGJnb/wKQECBAgEIWC1XBBl2DGImYl7dvzchwQIECBAgMDdAppyd5v4hECUArauVlM2q+SqcTQKAQIE6hRw2EOduuON7eTV8fzcTYAAAQJ5CWjK5VVv2SYsoClXTXHPzp2uZiCjECBAgEBtAlZj1UY79sBOXh2b0AAECBAgkJGAplxGxZZq2gIXrvXSTrCB7OYmZ4qz8w81MJMpCBAgQGAcgV/qOh17HL867z02dbDO4Y1NgAABAgSSEtCUS6qckslZ4J11Tblx6+/E1XEF3U+AAIFmBKyUa8Z5lFkWHMIxCpt7CBAgQCBTAU25TAsv7bQEHPIwfj2tkhvf0AgECBBoSsAz5ZqSHn4eK+WGN3MHAQIECOQroCmXb+1lnpDA+dVLCWXTTipn5z1Lrh15sxIgQGA0gaNWZI0GV+NdC5O2rtbIa2gCBAgQSFBAUy7BokopPwGHPIxX8+mJyeLcwi+ON4i7CRAgQKBRgYWp6UbnM9n+AsfUZH8kVxAgQIAAgW0CmnLbMLwlEKvAhfWVWEMPIu5zC79QdPqNOS8CBAgQiEfg0e5cPMGKlAABAgQIECCwg4Cm3A4oPiIQk8D61mbR21yLKeTgYj0758TV4IoiIAIECOwjYPvqPkAtfP1Yd7aFWU1JgAABAgTiFdCUi7d2IifwvoBVcuP9EJ6eO13MT82MN4i7CRAgQKBxAdtXGyc3IQECBAgQIFCxgKZcxaCGI9C0gEMexhP/5OIT4w3gbgIECBBoRcD21VbYTUqAAAECBAhUKKApVyGmoQi0IeCQh9HVz3SPWSU3Op87CRAg0LqALaytl+C2AB7vHr7tb38QIECAAAECewtoyu3t41sCwQvYvjp6iaySG93OnQQIEAhBwBbWEKogBgIECBAgQGBUAU25UeXcRyAQAYc8jFaIpc6R4pH+SjkvAgQIEIhX4NHukXiDFzkBAgQIECCQvYCmXPY/AQAxC7y2ejHm8FuN/dzRX2h1fpMTIECAwPgCC5Od8QcxQmUChyYOVDaWgQgQIECAQA4CmnI5VFmOyQp4ntxopZ2bnCnOzj802s3uIkCAAIFgBGxfDaYU7wdyutMNKyDRECBAgACBwAU05QIvkPAI7CWgKbeXzu7fnZ0/vfuXviFAgACBaARsX42mVAIlQIAAAQIEdhDQlNsBxUcEYhG4cK0XS6jBxDk9MVmcW/jFYOIRCAECBAiMJ3DS6qzxAN1NgAABAgQItCagKdcavYkJjC/wzrqm3LCKT86eKDr9xpwXAQIECKQh4LlyadRRFgQIECBAIEcBTbkcqy7nJARsXR2tjJ9cfGK0G91FgAABAkEKWCkXZFkERYAAAQIECAwgoCk3AJJLCIQooCk3fFXOdI8V81Mzw9/oDgIECBAIVuDR7lywsQmMAAECBAgQILCXgKbcXjq+IxCwwIVrKwFHF2ZoVsmFWRdRESBAYByBU54pNw6fewkQIECAAIEWBTTlWsQ3NYFxBKyUG05vbnKmeKS/Us6LAAECBNISODRxT3F0cjqtpGRDgAABAgQIZCGgKZdFmSWZooCm3HBV/eTi48Pd4GoCBAgQiEbgVOfeaGIVKAECBAgQIEDgpoCm3E0J/yUQkUBvY7W4trUZUcTthjrdP231ycP3txuE2QkQIECgNgGHPdRGa2ACBAgQIECgRgFNuRpxDU2gLoGVzdW6hk5y3LPzp4tOvzHnRYAAAQJpCjjsIc26yooAAQIECKQuoCmXeoXll6TA+dVLSeZVV1Lnjv5iXUMblwABAgQCEHDYQwBFEAIBAgQIECAwtICm3NBkbiDQvsBKf/uq12ACT8yeKOanZga72FUECBAgEKWAwx6iLJugCRAgQIBA9gKactn/BADEKHDhWi/GsFuJ+dyCVXKtwJuUAAECDQs47KFhcNMRIECAAAECYwtoyo1NaAACzQu8s64pN4j63ORM8Uj32CCXuoYAAQIEIhdw2EP7BVzbutF+ECIgQIAAAQIRCWjKRVQsoRIoBS5oyA38Qzi38AsDX+tCAgQIEIhbwGEP7dfvzXWP12i/CiIgQIAAgZgENOViqpZYCfQFek5eHeh3MN0/bfXs/EMDXesiAgQIEIhfwGEP8ddQBgQIECBAIDcBTbncKi7f6AWslBushE/2D3jo9BtzXgQIECCQh0B52IMtrHnUWpYECBAgQCAVAU25VCopj2wENOUGK7UDHgZzchUBAgRSEjg5fW9K6ciFAAECBAgQSFxAUy7xAksvPYEL6yvpJVVxRmf6hzuc6BypeFTDESBAgEDoAp4r126FXl19r90AzE6AAAECBCIT0JSLrGDCJdDbXIOwj8DZOc+S24fI1wQIEEhSwHPlkiyrpAgQIECAQLICmnLJllZiKQq8tnoxxbQqzak84OFpBzxUamowAgQIxCJwsnNvcWjiQCzhipMAAQIECBDIXEBTLvMfgPTjEuhtWCW3X8WcuLqfkO8JECCQtkDZmPNqR+B7q1famdisBAgQIEAgUgFNuUgLJ+w8BXqbq3kmPkTWzx79xSGudikBAgQIpCbwaNczRVOrqXwIECBAgECqAppyqVZWXkkKOHl177KWBzzMT83sfZFvCRAgQCBpAYc9tFfeyxvX2pvczAQIECBAIEIBTbkIiybkfAVWrJTbs/gOeNiTx5cECBDIQsBKufbKvLx5vb3JzUyAAAECBCIU0JSLsGhCzlfgnfVevsnvk/nc5IwDHvYx8jUBAgRyETjZ6eaSanB5rm3dCC4mAREgQIAAgVAFNOVCrYy4CNwhYOvqHSB3/OmAhztA/EmAAIGMBWxhba/4b657/m17+mYmQIAAgdgENOViq5h4sxVwyMPepX967qG9L/AtAQIECGQjYAtre6W2Uq49ezMTIECAQHwCmnLx1UzEmQpYKbd74Z+YPeGAh915fEOAAIHsBDTl2iv5G1bKtYdvZgIECBCITkBTLrqSCThXgZUN20F2q/2Ts/fv9pXPCRAgQCBDgUMT9xSeK9dO4S9vOOyhHXmzEiBAgECMAppyMVZNzFkK2L66c9mnJyYd8LAzjU8JECCQtYDnyrVTfiewtuNuVgIECBCIU0BTLs66iTpDgfOrlzLMev+UHfCwv5ErCBAgkKOALaztVN321XbczUqAAAECcQpoysVZN1FnJtCzdXXXij979Bd3/c4XBAgQIJCvgKZcO7W/unWjcNhDO/ZmJUCAAIH4BDTl4quZiDMUWNn0PLmdyn6me8wBDzvB+IwAAQIECs+Va+9H8KbDHtrDNzMBAgQIRCWgKRdVuQSbq4CTV3eu/Nm5h3b+wqcECBAgQKAv4Lly7fwMHPbQjrtZCRAgQCA+AU25+Gom4gwFrm1tZpj13imXBzw8cdipq3sr+ZYAAQJ5C9jC2k7937hmhX878mYlQIAAgdgENOViq5h4sxR4bfVilnnvlfSTs/cXnX5jzosAAQIECOwmoCm3m0y9n7+5vlbvBEYnQIAAAQKJCGjKJVJIaaQt4KCHu+v77IIDHu5W8QkBAgQIbBfwXLntGs29dwJrc9ZmIkCAAIG4BTTl4q6f6DMR6G36/3HeXuq5yZniROfI9o+8J0CAAAECOwp4rtyOLLV+WJ7A6rlytRIbnAABAgQSEdCUS6SQ0khXwCEPd9f2nFVyd6P4hAABAgR2FLCFdUeW2j9803Plajc2AQECBAjEL6ApF38NZZC4wPrWRuIZDp/e0/NOXR1ezR0ECBDIU+ATswt5Jt5y1rawtlwA0xMgQIBAFAKaclGUSZA5C5xfvZRz+nfl/sTsCQc83KXiAwIECBDYS+CXuh55sJdPHd99b/VKHcMakwABAgQIJCWgKZdUOSWTooCVcrdX1Sq52z38RYAAAQL7C9jCur9R1VdYKVe1qPEIECBAIEUBTbkUqyqnpAQ8U+7Dck5PTBZPzt7/4QfeESBAgACBAQSesoV1AKVqL3HYQ7WeRiNAgACBNAU05dKsq6wSEuhtrCaUzXipnPUsufEA3U2AAIFMBU527i0OTRzINPv20v7e6nvtTW5mAgQIECAQgYCmXARFEmLeAr3NtbwBtmX/9JwDHrZxeEuAAAECQwg82p0b4mqXViHwhhNYq2A0BgECBAgkLKApl3BxpRa/gFVyH9ZwqXOkONH/50WAAAECBEYRcArrKGrj3WOl3Hh+7iZAgACB9AU05dKvsQwjFljZtHX1ZvnOWiV3k8J/CRAgQGAEAYc9jIA25i1vrq8Va1s3xhzF7QQIECBAIF0BTbl0ayuzBAQc8vBhEZ9wwMOHGN4RIECAwNACC1PTxclOd+j73DCegNVy4/m5mwABAgTSFtCUS7u+sotc4NrWZuQZVBP+E7MnivmpmWoGMwoBAgQIZCvguXLNl/5Vhz00j25GAgQIEIhGQFMumlIJNEeB11Yv5pj2XTk/aZXcXSY+IECAAIHhBTxXbnizce+wUm5cQfcTIECAQMoCmnIpV1duBBIQmJ6YLJ44fH8CmUiBAAECBNoWKJ8rd2jiQNthZDW/58plVW7JEiBAgMCQAppyQ4K5nECTAudXLzU5XZBzlavkOv3GnBcBAgQIEKhCwBbWKhSHG8NqueG8XE2AAAEC+QhoyuVTa5kSiFLgicMnooxb0AQIECAQpoAtrM3XxXPlmjc3IwECBAjEIaApF0edRJmhwHnPkyvmJmcKz5PL8McvZQIECNQoUG5h9WpW4Dvv/W2zE5qNAAECBAhEIqApF0mhhJmfwLqTV4snPUsuvx++jAkQIFCzwMLUdHGy0615FsNvF1jevF5c3ri+/SPvCRAgQIAAgb6AppyfAYFABS6srwQaWXNhPT33UHOTmYkAAQIEshHwXLnmS/2dK1bLNa9uRgIECBAIXUBTLvQKiS9bgWuZr5Qrt66e6NhilO3/AZA4AQIEahR4du4jNY5u6J0EHPawk4rPCBAgQCB3AU253H8B8g9WIPeVcucWfjHY2giMAAECBOIWONm5tzg0cSDuJCKL3kq5yAomXAIECBBoREBTrhFmkxAYXiD3Z8o9MXv/8GjuIECAAAECAwo4hXVAqAov05irENNQBAgQIJCEgKZcEmWURIoC76z3UkxroJyW+ttW56dmBrrWRQQIECBAYBSBpw4vjHKbe8YQ+LZTWMfQcysBAgQIpCigKZdiVeUUvUDuq+Senns4+hpKgAABAgTCFni067mlTVfIc+WaFjcfAQIECIQuoCkXeoXEl6XAO5mfvGrrapY/e0kTIECgUYFDE/cUn5g92uicuU+2vHm9eGN9NXcG+RMgQIAAgVsCmnK3KLwhQCAEgbIhZ+tqCJUQAwECBNIXsFqu+Rp/vXep+UnNSIAAAQIEAhXQlAu0MMLKW+C11YvZAlgll23pJU6AAIHGBZ6a9Vy5ptG/47lyTZObjwABAgQCFtCUC7g4QiOQo8ATh526mmPd5UyAAIE2BBampouTnW4bU2c75wdbWNeyzV/iBAgQIEBgu4Cm3HYN7wkEInA+05Vy5Sq5zsRkIFUQBgECBAjkIPDs3EdySDOoHG1hDaocgiFAgACBFgU05VrENzUBArcL2Lp6u4e/CBAgQKB+Ac+Vq9/4zhm+bQvrnST+JkCAAIFMBTTlMi28tMMWuLDeCzvAmqKzdbUmWMMSIECAwK4Cpzr3Fkcnp3f93hfVC9jCWr2pEQkQIEAgTgFNuTjrJurEBa5tbSae4d3p2bp6t4lPCBAgQKAZgacOH21mIrPcErCF9RaFNwQIECCQsYCmXMbFl3qYAr2N1TADqzkqW1drBjY8AQIECOwq4Llyu9LU9oUtrLXRGpgAAQIEIhLQlIuoWELNQ6C3mWlTzqmrefzAZUmAAIEABWxhbb4otrA2b25GAgQIEAhPQFMuvJqIKHOBdVtXM/8FSJ8AAQIE2hCwhbV59T9fvtD8pGYkQIAAAQIBCWjKBVQMoRAoBS6sr2QHYetqdiWXMAECBIITcApr8yX59pW/bX5SMxIgQIAAgYAENOUCKoZQCOQq4NTVXCsvbwIECIQj8NTsQnFo4kA4AWUQydWtG4XGXAaFliIBAgQI7CqgKbcrjS8ItCNwfvViOxO3NKtTV1uCNy0BAgQI3CVQNua8mhX4+sqlZic0GwECBAgQCEhAUy6gYgiFQI4Ctq7mWHU5EyBAIEyBTxw+GmZgCUf1nSsrxVp/xZwXAQIECBDIUUBTLseqyzlogQvrvaDjqzo4W1erFjUeAQIECIwqYAvrqHLj3We13Hh+7iZAgACBeAU05eKtncgTFbiW0emrtq4m+iOWFgECBCIWsIW1+eJ91SmszaObkQABAgSCENCUC6IMgiDwgcB6Rg25MmNbV/3yCRAgQCA0AVtYm6/I8ub14o31teYnNiMBAgQIEGhZQFOu5QKYnsB2gXfWV7b/mfx7W1eTL7EECRAgEJ2ALaztlOzPrZZrB96sBAgQINCqgKZcq/wmJ5CvgK2r+dZe5gQIEAhdwBbW5iv07St/68CH5tnNSIAAAQItC2jKtVwA0xPYLpDTIQ+2rm6vvPcECBAgEJKALazNV+Nq/wTWb7/3t81PbEYCBAgQINCigKZci/imJnCnwPrWxp0fJfv3me7xZHOTGAECBAjELWALazv1+/N3L7QzsVkJECBAgEBLAppyLcGblsBOArmcvLrUOVLMT83sROAzAgQIECAQhIAtrM2X4c3+YQ+vrr7X/MRmJECAAAECLQloyrUEb1oCOwlcyOSgh6fnHt4pfZ8RIECAAIFgBD65cH8wseQUyNdXLueUrlwJECBAIHMBTbnMfwDSJ9CGgOfJtaFuTgIECBAYRuBU597i6OT0MLe4tgKBr/cuOfChAkdDECBAgEAcAppycdRJlJkI9DbWks/U1tXkSyxBAgQIJCPw1OGjyeQSUyJ/vuzZcjHVS6wECBAgMLqAptzodu4kULlAb3O18jFDG9ABD6FVRDwECBAgsJvAs3Mf2e0rn9co8PLKpRpHNzQBAgQIEAhHQFMunFqIhEAWAk/PPZRFnpIkQIAAgfgFbGFtp4bLm9cLjbl27M1KgAABAs0KaMo16202ArsKnF+9uOt3qXwxNzlTnOjMpZKOPAgQIEAgA4Fz81bLtVHm8tlyXgQIECBAIHUBTbnUKyw/AgEJPHHYSXYBlUMoBAgQIDCAgC2sAyDVcMn3Vq8Ub6yn/6zdGugMSYAAAQIRCWjKRVQsoaYtsL61mXaC/ewe6R5PPkcJEiBAgEBaAgtT08XJTjetpCLJxoEPkRRKmAQIECAwsoCm3Mh0biRQrcCF9ZVqBwxstOmJyeKJWSvlAiuLcAgQIEBgAAGr5QZAquGScgvr5Y3rNYxsSAIECBAgEIaAplwYdRAFgeQFNOSSL7EECRAgkKzAU7MLyeYWemKeLRd6hcRHgAABAuMIaMqNo+deAhUKXEt8+6qtqxX+WAxFgAABAo0KlFtYPzF7tNE5TfaBwFeXLxRrWzdwECBAgACBJAU05ZIsq6RiFEh9+6pDHmL8VYqZAAECBG4KWC13U6LZ/17tN+S+vuIk1mbVzUaAAAECTQloyjUlbR4CGQuc6R4rOv1nynkRIECAAIFYBT5x+GhxaOJArOFHHXe5Ws6LAAECBAikKKApl2JV5RSlQG9jLcq4Bwn6idkHBrnMNQQIECBAIFiBmYl7Cqvl2inP8ub14mWr5drBNysBAgQI1CqgKVcrr8EJDC7Q21wd/OLIrnTIQ2QFEy4BAgQI7ChQrpbzakfgf7/4g3YmNisBAgQIEKhRQFOuRlxDEyBQFEudI8X81AwKAgQIECAQvUC5Uu7o5HT0ecSYQLla7tXV92IMXcwECBAgQGBXAU25XWl8QaA5gfWET1490z3eHKSZCBAgQIBAzQJPWS1Xs/Duw1stt7uNbwgQIEAgTgFNuTjrJurEBN5ZX0ksow/TeXL2/g//8I4AAQIECEQu8OzcRyLPIN7wv7d6xWq5eMsncgIECBDYQUBTbgcUHxEgUI3AdP/EVSvlqrE0CgECBAiEIXCqc29xstMNI5gMo7BaLsOiS5kAAQIJC2jKJVxcqcUjkOr2VQc8xPMbFCkBAgQIDC5gtdzgVlVf+cFquStVD2s8AgQIECDQioCmXCvsJiVwu8CFRLevPuJ5crcX2l8ECBAgkITAs/O2sLZZyJdXLrU5vbkJECBAgEBlAppylVEaiACBOwWeOOx5cnea+JsAAQIE4heYmbin+MTs0fgTiTSDr/cuF5c3rkcavbAJECBAgMCHAppyH1p4R4BAhQJLnSNFp/9MOS8CBAgQIJCiwDmr5Vot659c/EGr85ucAAECBAhUIaApV4WiMQiMKXB+9eKYI4R3u+fJhVcTEREgQIBAdQJP9VfKHZo4UN2ARhpKwGq5obhcTIAAAQKBCmjKBVoYYRGIXUBTLvYKip8AAQIE9hOwWm4/oXq/t1quXl+jEyBAgED9Appy9RubgUB2AtP9basnOnPZ5S1hAgQIEMhLwCms7dbbarl2/c1OgAABAuMLaMqNb2gEAmML9DbWxh4jpAGskgupGmIhQIAAgboETnW6xcn+P6/2BKyWa8/ezAQIECAwvoCm3PiGRiAwtkBvc3XsMUIa4Ez3eEjhiIUAAQIECNQm8MJRJ43XhjvAwFbLDYDkEgIECBAIVkBTLtjSCIxAvAJPHH4g3uBFToAAAQIEhhB46vDCEFe7tA6Bf/nWf6xjWGMSIECAAIHaBTTlaic2AYG8BJY6R4pO/5lyXgQIECBAIAeBmf4JrM/OLeaQarA5fm/1SvFq/58XAQIECBCITUBTLraKiTc5gQvrvaRyemL2gaTykQwBAgQIENhPwCms+wnV/71ny9VvbAYCBAgQqF5AU656UyMSGErg2tbGUNeHfrFDHkKvkPgIECBAoGqBR7tHiqOT01UPa7whBKyWGwLLpQQIECAQjICmXDClEAiB+AWm+9tWlzpz8SciAwIECBAgMKTAuXlbWIckq/xyq+UqJzUgAQIECNQsoClXM7DhCeQkYJVcTtWWKwECBAhsFzg395Htf3rfgoDVci2gm5IAAQIExhLQlBuLz80Exhd4bfXi+IMEMsKZ7vFAIhEGAQIECBBoVmBharr4xOzRZic1210C//IHTmK9C8UHBAgQIBCsgKZcsKURGIH4BDTl4quZiAkQIECgOgEHPlRnOepIy5vXi5dXLo96u/sIECBAgECjAppyjXKbjEC6AkudI8X8VDfdBGVGgAABAgT2EXiqv1LOgQ/7IDXwtWfLNYBsCgIECBCoREBTrhJGgxAgcKbrAdd+BQQIECBAwIEP7f8GytVyX12+0H4gIiBAgAABAvsIaMrtA+RrAnULnE/kmXK2rtb9SzE+AQIECMQg4MCHMKr0JxffKta2boQRjCgIECBAgMAuAppyu8D4mACB4QScvDqcl6sJECBAIE0BBz6EUder/Yac1XJh1EIUBAgQILC7gKbc7ja+IUBgQAGr5AaEchkBAgQIZCHgwIcwyvzV5XeKyxvXwwhGFAQIECBAYAcBTbkdUHxEgMBwAppyw3m5mgABAgTSFnDgQxj1LVfLOfQhjFqIggABAgR2FtCU29nFpwQaE+htrDU2V10T2bpal6xxCRAgQCBWAQc+hFG5r/cuWy0XRilEQYAAAQI7CGjK7YDiIwJNCvQ2V5ucrvK5picmi6XOXOXjGpAAAQIECMQs4MCHcKr3L9/6j+EEIxICBAgQILBNQFNuG4a3BAgML2Dr6vBm7iBAgACB9AUc+BBOjb+3eqV4tf/PiwABAgQIhCagKRdaRcRDIDIBTbnICiZcAgQIEGhMwIEPjVHvO9G/uvD6vte4gAABAgQINC2gKde0uPkIJCbgeXKJFVQ6BAgQIFCZgAMfKqMce6A319eKl1cujz2OAQgQIECAQJUCmnJVahqLwJACF9Z7Q94R1uVzkzPF/FQ3rKBEQ4AAAQIEAhJw4EM4xShPYl3rn8jqRYAAAQIEQhHQlAulEuLIUuDa1kbUedu6GnX5BE+AAAECDQi8sPBAA7OYYhCB5c3rxVeXLwxyqWsIECBAgEAjAppyjTCbhECaAppyadZVVgQIECBQncDMxIHi2bnF6gY00lgCX11+p7i8cX2sMdxMgAABAgSqEtCUq0rSOAQyFNCUy7DoUiZAgACBoQUc+DA0WW03XO1vX/2Ti2/VNr6BCRAgQIDAMAKacsNouZYAgVsCnid3i8IbAgQIECCwp8Cj3SPFyY5nsO6J1OCXL/cuF6+uXmlwRlMRIECAAIGdBTTldnbxKYFGBGI+6MEquUZ+IiYhQIAAgUQEXjh6fyKZpJHGV6yWS6OQsiBAgEDkAppykRdQ+HELrEd80MMThx+IG1/0BAgQIECgQYGnDi8Uh/rPl/MKQ+B7/ZVyL69cDiMYURAgQIBAtgKactmWXuIExhOwUm48P3cTIECAQF4C5YEPni0XVs3L1XJr/WfMeREgQIAAgbYENOXakjcvgYgFljpHis7EZMQZCJ0AAQIECDQvYAtr8+Z7zbi8eb0oT2P1IkCAAAECbQloyrUlb14CEQuc6S5GHL3QCRAgQIBAOwILU9NFeeiDVzgC5UmslzeuhxOQSAgQIEAgKwFNuazKLVkC1QjYulqNo1EIECBAID+BFxYc+BBa1b904Y3QQhIPAQIECGQioCmXSaGlGaZArKevasqF+XsSFQECBAiEL/DU7NHi6OR0+IFmFOF3rqwUr/YPfvAiQIAAAQJNC2jKNS1uPgLbBK5FePqq58ltK6C3BAgQIEBgBIFPWS03glq9t/zhD/5TvRMYnQABAgQI7CCgKbcDio8IENhdwPPkdrfxDQECBAgQGETg2fmPFIf6p7F6hSPg0IdwaiESAgQI5CSgKZdTteVKoAIBW1crQDQEAQIECGQtMNNvyJXbWL3CEvhK/9CHta0bYQUlGgIECBBIWkBTLunySo5A9QKactWbGpEAAQIE8hP43OKp/JIOPOOr/Ybcv3rboQ+Bl0l4BAgQSEpAUy6pckqGQL0Cc5MzRWdist5JjE6AAAECBDIQWJiaLh7tHs4g07hSfLl32aEPcZVMtAQIEIhaQFMu6vIJnkCzAlbJNettNgIECBBIW8CBD2HWt9zG6kWAAAECBJoQ0JRrQtkcBHYROL96aZdvwvxYUy7MuoiKAAECBOIUKJ8rtzA5HWfwCUf9vdUrxcsrlxPOUGoECBAgEIqAplwolRAHgQgENOUiKJIQCRAgQCAqgRcWTkQVby7BfunCGw59yKXY8iRAgECLAppyLeKbmkBMAuXz5OanujGFLFYCBAgQIBC8wLn5jxSH+qexeoUlUB768Ce2sYZVFNEQIEAgQQFNuQSLKiUCdQhYJVeHqjEJECBAIHeBmX5DrtzG6hWewFeX3yneWF8LLzARESBAgEAyAppyyZRSIgTqFdCUq9fX6AQIECCQr8DnFk/lm3zgmZfbWL0IECBAgEBdAppydckal0BiAic6c4llJB0CBAgQIBCGwMLUtNVyYZTirigc+nAXiQ8IECBAoEIBTbkKMQ1FIFWB6YnJYklTLtXyyosAAQIEAhBw4EMARdglBIc+7ALjYwIECBAYW0BTbmxCAxBIX8DW1fRrLEMCBAgQaFfgse6RYmFyut0gzL6jgEMfdmTxIQECBAhUIKApVwGiIQiMInBhvTfKba3coynXCrtJCRAgQCAzgd/0bLlgK+7Qh2BLIzACBAhELaApF3X5BB+zwLWtjWjC9zy5aEolUAIECBCIWODc/GJxqH8aq1eYAn/41n8KMzBRESBAgEC0Appy0ZZO4ASaE7BSrjlrMxEgQIBA3gKfWrg/b4CAs39zfa0oV8x5ESBAgACBqgQ05aqSNA6BRAU05BItrLQIECBAIEiBFzTlgqzLzaC+cvGtYm3rxs0//ZcAAQIECIwloCk3Fp+bCaQvoCmXfo1lSIAAAQLhCMz0t68+O7cYTkAiuU2gPPThS2+/cdtn/iBAgAABAqMKaMqNKuc+ApkILHXmMslUmgQIECBAIAyBzznwIYxC7BLFy73l4tXVK7t862MCBAgQIDC4gKbc4FauJJClgJVyWZZd0gQIECDQosDC1HTx1OzRFiMw9X4CX7rw5n6X+J4AAQIECOwroCm3L5ELCOQrMDc5U3QmJvMFkDkBAgQIEGhJ4IWFEy3NbNpBBN7oH/rwZw59GITKNQQIECCwh4Cm3B44viKQu4BVcrn/AuRPgAABAm0JPNY9UpzsdNua3rwDCHzl4g+LyxvXB7jSJQQIECBAYGcBTbmdXXxKgEBfQFPOz4AAAQIECLQn8Kmj97c3uZn3FXj/0AfbWPd1cgEBAgQI7C6gKbe7jW8IZC9wwiEP2f8GABAgQIBAewLn5heLhcnp9gIw874C376y4tCHfZVcQIAAAQK7CWjK7SbjcwKZC0z3nyXn5NXMfwTSJ0CAAIHWBTxbrvUS7BvAv/jBa/te4wICBAgQILCTgKbcTio+I0BAQ85vgAABAgQIBCBwbv4jxaGJAwFEIoTdBJY3rxdfufjWbl/7nAABAgQI7CqgKbcrjS8I1CtwYb1X7wRjju55cmMCup0AAQIECFQgMNNvyH1qwbPlKqCsdYg/cehDrb4GJ0CAQKoCmnKpVlZewQusb20EHeOZ7mLQ8QmOAAECBAjkInBuzv9OjqHWf/iWbawx1EmMBAgQCElAUy6kaoiFQEACnicXUDGEQoAAAQJZCyxMTRfPaswF/xt4dfVK8a3+wQ9eBAgQIEBgUAFNuUGlXEcgI4G5yZmi0z/owYsAAQIECBAIQ+Bzi6fCCEQUewp86e03i7WtG3te40sCBAgQIHBTQFPupoT/EiBwS8DW1VsU3hAgQIAAgSAEytVyT80eDSIWQewu4NCH3W18Q4AAAQJ3C2jK3W3iEwLZC9i6mv1PAAABAgQIBCjwwsKJAKMS0p0CX13+UfHG+tqdH/ubAAECBAjcJaApdxeJDwgQ0JTzGyBAgAABAuEJPNY9UjzaPRxeYCK6S+BLF9686zMfECBAgACBOwU05e4U8TcBAsWZ7nEKBAgQIECAQIACv+nZcgFW5e6QykMfvrZy+e4vfEKAAAECBLYJaMptw/CWAIGieFhDzs+AAAECBAgEK1CulluYnA42PoF9KFCulnPow4ce3hEgQIDA3QKacneb+IRA1gK2rmZdfskTIECAQAQCVstFUKR+iFf7p7B+6e034ghWlAQIECDQioCmXCvsJiUQrsCJ6blwgxMZAQIECBAgUJybX+yvljtIIgKBl3vLRbmV1YsAAQIECOwkoCm3k4rPCGQs4HlyGRdf6gQIECAQjcDnPFsumlo59CGaUgmUAAECjQtoyjVObkIC4QpMT0wWc1PdcAMUGQECBAgQIPC+wFOHjxaHJg7QiEDgjfW14s+W34kgUiESIECAQNMCmnJNi5uPQMACnicXcHGERoAAAQIEtgnM9Btyn1o4se0Tb0MW+MrFHzr0IeQCiY0AAQItCWjKtQRvWgIhCti6GmJVxESAAAECBHYW+NTC/VbL7UwT3KfloQ9/+IPXgotLQAQIECDQroCmXLv+ZicQlICVckGVQzAECBAgQGBPAavl9uQJ7stvX1lx6ENwVREQAQIE2hXQlGvX3+wEghJw8mpQ5RAMAQIECBDYV+C5ucV9r3FBOAL/wmq5cIohEgIECAQgoCkXQBGEQCAEAYc8hFAFMRAgQIAAgeEEFqami3Mac8OhtXj18ub1ony+nBcBAgQIECgFNOX8DggQeF/A1lU/BAIECBAgEKfA5xZPxhl4plG/uPyj4vLG9UyzlzYBAgQIbBfQlNuu4T2BjAUc8pBx8aVOgAABAlELWC0XV/nKQx/+6MKbcQUtWgIECBCoRUBTrhZWgxKIT8BKufhqJmICBAgQIHBTwGq5mxJx/PfbV3rFK6tX4ghWlAQIECBQm4CmXG20BiYQl4BDHuKql2gJECBAgMB2AavltmvE8f4Pf3A+jkBFSYAAAQK1CWjK1UZrYALxCDjkIZ5aiZQAAQIECOwmcG7eSay72YT4+WWHPoRYFjERIECgUQFNuUa5TUYgTAFbV8Osi6gIECBAgMAwAo91DxeP9v95xSPg0Id4aiVSAgQI1CGgKVeHqjEJRCbgkIfICiZcAgQIECCwi8DnFk/t8o2PQxQoD3348sUfhhiamAgQIECgAQFNuQaQTUEgdAEr5UKvkPgIECBAgMBgAlbLDeYU0lUv95Yd+hBSQcRCgACBBgU05RrENhWBUAUc8hBqZcRFgAABAgSGF7Babniztu/40oU32w7B/AQIECDQgoCmXAvopiRQCsxNdoOAcMhDEGUQBAECBAgQqEzAarnKKBsb6I31q8WfLf+osflMRIAAAQJhCGjKhVEHUWQoMD8VRlPO1tUMf3xSJkCAAIHkBayWi6/E5bPl1vrPmPMiQIAAgXwENOXyqbVMCewo4JCHHVl8SIAAAQIEohawWi6+8jn0Ib6aiZgAAQLjCmjKjSvofgKRC8wHso02ckbhEyBAgACB4AQ+tXAiuJgEtLfAV/tbWF9fX9v7It8SIECAQDICmnLJlFIiBEYTsH11NDd3ESBAgACB0AWenj1aLEweDD1M8d0h4NCHO0D8SYAAgYQFNOUSLq7UCAwioCk3iJJrCBAgQIBAnAKeLRdf3V5d/UnxrSu9+AIXMQECBAgMLaApNzSZGwikI/Bw93g6yciEAAECBAgQuEvg3Pyi1XJ3qYT/wZfefjP8IEVIgAABAmMLaMqNTWgAAvEKWCUXb+1EToAAAQIEBhWwWm5QqXCuu7x5vfhK/zRWLwIECBBIW0BTLu36yo7AngIOediTx5cECBAgQCAJAavl4izji/1DH9a2bsQZvKgJECBAYCABTbmBmFxEIE0BK+XSrKusCBAgQIDAnQJWy90pEv7fV/sNuT+yjTX8QomQAAECYwhoyo2B51YCsQuc8Uy52EsofgIECBAgMJCA1XIDMQV30cu95eLyxvXg4hIQAQIECFQjoClXjaNRCEQnMDc5E13MAiZAgAABAgRGF7BabnS7Nu/8F2+91ub05iZAgACBGgU05WrENTSBkAVsXQ25OmIjQIAAAQLVC1gtV71pEyO+uvqT4pXVK01MZQ4CBAgQaFhAU65hcNMRuCnw0c78zbet/FdTrhV2kxIgQIAAgVYFrJZrlX/kyb904c2R73UjAQIECIQroCkXbm1ElrhAZ2Ky1Qw15VrlNzkBAgQIEGhFwGq5VtjHnvSN9avF11aWxx7HAAQIECAQloCmXFj1EA2BxgROTM81NpeJCBAgQIAAgXAErJYLpxbDRPKViz8c5nLXEiBAgEAEAppyERRJiATqEJib6tYxrDEJECBAgACBwAWslgu8QLuEd3nzevFljblddHxMgACBOAU05eKsm6gJjCXwcPf4WPe7mQABAgQIEIhb4HOLJ+NOINPoX1y+WKxt3cg0e2kTIEAgPQFNufRqKiMC+wrMT1olty+SCwgQIECAQMICz80vFguTBxPOMM3UrvYbci8u/yjN5GRFgACBDAU05TIsupQJOOTBb4AAAQIECBCwWi7O34DVcnHWTdQECBDYSUBTbicVnxFIXEBTLvECS48AAQIECAwgYLXcAEgBXlKulvujt78fYGRCIkCAAIFhBTTlhhVzPYEKBeZa2kaqKVdhEQ1FgAABAgQiFrBaLs7ifa23XFzeuB5n8KImQIAAgVsCmnK3KLwh0LzA3NRM45NOT0wWnf4/LwIECBAgQICA1XLx/ga+fPHteIMXOQECBAi8L6Ap54dAIDMBq+QyK7h0CRAgQIDAPgK/c+LMPlf4OkQBq+VCrIqYCBAgMJyAptxwXq4mEL2Aplz0JZQAAQIECBCoVODp2fuKR7uHKx3TYM0IWC3XjLNZCBAgUJeAplxdssYlEKjAfEvPsQuUQ1gECBAgQIBAX+Dziyc5RChgtVyERRMyAQIEtgloym3D8JZADgJWyuVQZTkSIECAAIHhBB7rr5SzWm44s1CutloulEqIgwABAsMLaMoNb+YOAlELnOkejzp+wRMgQIAAAQL1CFgtV49r3aNaLVe3sPEJECBQn4CmXH22Riawr8DD3cV9r6nygrnJ5k97rTJ+YxEgQIAAAQL1CVgtV59t3SNbLVe3sPEJECBQj4CmXD2uRiUQpMDcVDfIuARFgAABAgQIhCFgtVwYdRg2inK13NrWjWFvcz0BAgQItCygKddyAUxPoEkBW1eb1DYXAQIECBCIT8BqufhqdjPiF5d/dPOt/xIgQIBAJAKacpEUSpgEqhDoTExVMYwxCBAgQIAAgYQFrJaLs7gvLl+0Wi7O0omaAIGMBTTlMi6+1PMTcPJqfjWXMQECBAgQGFagXC331Ox9w97m+pYFrva3r1ot13IRTE+AAIEhBTTlhgRzOYEqBeYmm33Gm6ZcldUzFgECBAgQSFfgd5YeTje5hDOzWi7h4kqNAIEkBTTlkiyrpGIRmG/w4IXpicmi0//nRYAAAQIECBDYT+DY1HRxbu74fpf5PjCBcrXcSyvLgUUlHAIECBDYTUBTbjcZnxNITMAqucQKKh0CBAgQIFCzwOcWT9Y8g+HrEPgzBz7UwWpMAgQI1CKgKVcLq0EJhCegKRdeTUREgAABAgRCFrBaLuTq7B7b5c2N4mtWy+0O5BsCBAgEJKApF1AxhEKgToH5hp9fV2cuxiZAgAABAgSaEbBarhnnqmf58sUfVj2k8QgQIECgBgFNuRpQDUlgUIEmD3qwUm7QqriOAAECBAgQuClQrpb71MKJm3/6byQCVstFUihhEiCQvYCmXPY/AQBtCsw1eNDD/ORMm6mamwABAgQIEIhUoFwtd2jiQKTR5xv2Sz0HPuRbfZkTIBCLgKZcLJUSJ4ExBZpsAI4ZqtsJECBAgACBgARm+g25T1stF1BFBgvl1dWfFK/0/3kRIECAQLgCmnLh1kZkBCoTeLh7vLKxDESAAAECBAjkJ1BuYbVaLr66e7ZcfDUTMQECeQloyuVVb9lmKtCZmMw0c2kTIECAAAECVQhYLVeFYvNjlKvlXl+/2vzEZiRAgACBgQQ05QZichGB+gSaWMXmkIf66mdkAgQIECCQi0C5Wm5h8mAu6SaT558t/yiZXCRCgACB1AQ05VKrqHwI7CCgKbcDio8IECBAgACBoQTK1XLloQ9ecQl8rX/gw+WN63EFLVoCBAhkIqApl0mhpZm3QGdiKm8A2RMgQIAAAQKVCDw3v2i1XCWSzQ7y5YtvNzuh2QgQIEBgIAFNuYGYXEQgboEzDnqIu4CiJ0CAAAECAQlYLRdQMQYMpVwtt7Z1Y8CrXUaAAAECTQloyjUlbR4CuwgsdeZ3+aaaj6cd8lANpFEIECBAgACB9wXK1XKnOjM0IhN40bPlIquYcAkQyEFAUy6HKssxaIG6m2aeJxd0+QVHgAABAgSiFPji0sNRxp1z0C8uX7RaLucfgNwJEAhSQFMuyLIIikB1Appy1VkaiQABAgQIEPhA4LHu4aL85xWPwNX+9tWXVt6NJ2CREiBAIAMBTbkMiizFvAU6tq/m/QOQPQECBAgQqEng84sP1jSyYesSsIW1LlnjEiBAYDQBTbnR3NxFoDKBM93FysbaaaC6x99pTp8RIECAAAEC6QuUK+Wenr0v/UQTyvDy5kZ/tdxyQhlJhQABAnELaMrFXT/RE9hXwEq5fYlcQIAAAQIECIwo8DueLTeiXHu3ffni2+1NbmYCBAgQuE1AU+42Dn8QSE/AM+XSq6mMCBAgQIBAKALHpg4W5+aOhxKOOAYQKFfLvbL6kwGudAkBAgQI1C2gKVe3sPEJ7CMwN9nd54rRv56bnBn9ZncSIECAAAECBAYQ+PziyeLQxIEBrnRJKAJ/bLVcKKUQBwECmQtoymX+A5B++wJzUzU25Wocu305ERAgQIAAAQIhCJSr5T69sBRCKGIYUODV/kq519evDni1ywgQIECgLgFNubpkjUsgAAFbVwMoghAIECBAgEAGAp9eOGG1XGR1dhJrZAUTLgECSQpoyiVZVkkR+EDAIQ9+CQQIECBAgEATAjP97atWyzUhXd0cX+u9W1zauF7dgEYiQIAAgaEFNOWGJnMDgeoFHu7W84DkM93F6oM1IgECBAgQIEBgB4Hy2XILkwd3+MZHoQq8+O7FUEMTFwECBLIQ0JTLosySJECAAAECBAgQIFC/QNmY84pH4Gsr7xZrWzfiCVikBAgQSExAUy6xgkqHwHaBMzWtwNs+h/cECBAgQIAAgZsCz80fL051nP5+0yP0/5YNuZf6jTkvAgQIEGhHQFOuHXezErhNYKkzf9vfVfwxPTFZxTDGIECAAAECBAgMJfDFpYeHut7F7Qo48KFdf7MTIJC3gKZc3vWXfSACdTTQnLwaSHGFQYAAAQIEMhN4rHu4KP95xSFweXOjv1puOY5gRUmAAIHEBDTlEiuodAjcFOhMTN18678ECBAgQIAAgUYFfmfpoUbnM9l4Ag58GM/P3QQIEBhVQFNuVDn3EahQoI7tq1bKVVggQxEgQIAAAQJDCZzudItzc/WcLj9UIC4eSOCN9avFK6s/GehaFxEgQIBAdQKactVZGonAyAKdGp7/NjfZHTkeNxIgQIAAAQIExhVwEuu4gs3e/+LyxWYnNBsBAgQIFJpyfgQEEhWYm3LyWaKllRYBAgQIEIhC4NjUweJziw9GEasgi+JbV3rFpY3rKAgQIECgQQFNuQaxTUVgN4GHu4u7fTXy5/NWyo1s50YCBAgQIECgGoFPL5woDk0cqGYwo9Qu8OWLb9c+hwkIECBA4EMBTbkPLbwjkJTA3JTtq0kVVDIECBAgQCBCgZl+Q8421ngK960rPy7Wtm7EE7BICRAgELmAplzkBRR+OgLTFT5Xbm7S1tV0fhkyIUCAAAECcQt8emGpWJg8GHcSmURfNuQ8Wy6TYkuTAIEgBDTlgiiDIAgURZWnpVol5xdFgAABAgQIhCRgtVxI1dg7lpdWlve+wLcECBAgUJmAplxllAYiEI5AlQ2+cLISCQECBAgQIBCrwHPzx4vHuodjDT+ruC9vbhQac1mVXLIECLQooCnXIr6pCWwXmKvwYIbOxNT2ob0nQIAAAQIECLQu8HknsbZeg0EDeKn37qCXuo4AAQIExhDQlBsDz60EqhSocsuplXJVVsZYBAgQIECAQBUC5Uq5p2fvq2IoY9Qs8OrqT4pX+v+8CBAgQKBeAU25en2NTqAVgSoPjWglAZMSIECAAAECSQr8ztLDSeaVYlK2sKZYVTkRIBCagKZcaBURT7YCZ7qLleU+X+FW2MqCMhABAgQIECCQvcCxqYPFc3PHs3eIAeBr/S2slzauxxCqGAkQIBCtPcXQRwAAQABJREFUgKZctKUTOIHdBarcCrv7LL4hQIAAAQIECAwvUD5b7tDEgeFvdEfjAmVjzosAAQIE6hPQlKvP1sgEhhKo6qCHucmZoeZ1MQECBAgQIECgSYFytdxnFpaanNJcIwq8uHyxWNu6MeLdbiNAgACB/QQ05fYT8j2BhgSqWt1W1TgNpW0aAgQIECBAIEOBT/ebclbLhV/4siH3zfd64QcqQgIECEQqoCkXaeGETWA3gapW3O02vs8JECBAgAABAuMKzPS3r1otN65iM/d/+eLbzUxkFgIECGQooCmXYdGlHK7Aw93xH3w8P9UNN0GRESBAgAABAgR+LmC1XBw/hcubG8Urqz+JI1hREiBAIDIBTbnICiZcAvsJTE9M7neJ7wkQIECAAAECrQuUq+W+uPRQ63EIYH+B8tlyXgQIECBQvYCmXPWmRiQwssBSZ37ke2/euNSZu/nWfwkQIECAAAECQQs8P3+8WJg8GHSMgiuKb13pFZc2rqMgQIAAgYoFNOUqBjUcgXEEqljl1pmYGicE9xIgQIAAAQIEGhX4/OKDjc5nstEEXnzXarnR5NxFgACB3QU05Xa38Q2BxgWqOKTBSrnGy2ZCAgQIECBAYAwBq+XGwGvw1q+tvFuUp7F6ESBAgEB1Appy1VkaicDYAg5pGJvQAAQIECBAgECEAlbLhV+0siH3zfd+HH6gIiRAgEBEAppyERVLqOkLTI+59bSK01vTV5YhAQIECBAgEJqA1XKhVWTneP744ts7f+FTAgQIEBhJQFNuJDY3EahHwNbTelyNSoAAAQIECIQvYLVc+DW6vLlRvLL6k/ADFSEBAgQiEdCUi6RQwsxHYJzDHjT18vmdyJQAAQIECKQmYLVcHBX9i/6z5bwIECBAoBoBTblqHI1CoDKBcRprTl6trAwGIkCAAAECBFoQsFquBfQhp/xa793i0sbGkHe5nAABAgR2EtCU20nFZwQiFRhnlV2kKQubAAECBAgQSEjAark4ivlSbzmOQEVJgACBwAU05QIvkPDyE3i4uzhy0uOssht5UjcSIECAAAECBCoUsFquQsyahnpx+WJNIxuWAAECeQloyuVVb9kSIECAAAECBAgQCFrAarmgy/N+cGtbW8VLni0XfqFESIBA8AKacsGXSIC5CZwZY6XcOPfm5ixfAgQIECBAIFwBq+XCrc3NyF7qP1vOiwABAgTGE9CUG8/P3QQqF5iemKp8TAMSIECAAAECBGISOHv4vuLQxIGYQs4u1ldWf1K8vn41u7wlTIAAgSoFNOWq1DQWgQoERn0u3NzkTAWzG4IAAQIECBAg0L7ATL8h95mFpfYDEcGeAn/q2XJ7+viSAAEC+wloyu0n5HsCLQiMcorq3FS3hUhNSYAAAQIECBCoR+DT/aac1XL12FY16reu9Iq1rRtVDWccAgQIZCegKZddySUcg8Coq+ViyE2MBAgQIECAAIFBBKyWG0Sp3WvKAx+++d6P2w3C7AQIEIhYQFMu4uIJPV2BucnhV7055CHd34PMCBAgQIBArgLPzR3PNfVo8v7ji29HE6tACRAgEJqAplxoFREPgb6Arah+BgQIECBAgACBojg2dbDQmAv7l3B5c6MoD33wIkCAAIHhBTTlhjdzB4HaBZY680PPMcrquqEncQMBAgQIECBAoGGBzy8+2PCMphtW4C9W3h32FtcTIECAQF9AU87PgECAAp2JyaGjmpty+urQaG4gQIAAAQIEghewWi74EhVf673rwIfwyyRCAgQCFNCUC7AoQiLwcHcRAgECBAgQIECAwM8Fnps/xiJwAavlAi+Q8AgQCFJAUy7IsgiKQFFMD7lazkEPfjUECBAgQIBAqgKPdw8Xj3VnU00vibxeXL6YRB6SIECAQJMCmnJNapuLwBACS525Ia52KQECBAgQIEAgbYFPLyylnWDk2TnwIfICCp8AgVYENOVaYTcpgf0Fhjm4YdhVdfvP7goCBAgQIECAQFgCZ2fvKxYmD4YVlGhuE7CF9TYOfxAgQGBfAU25fYlcQKAdgbmp7sATW1U3MJULCRAgQIAAgYgFnMQadvEc+BB2fURHgEB4Appy4dVERATeF/CMOD8EAgQIECBAgMDtAmcP31ccmjhw+4f+CkrAarmgyiEYAgQCF9CUC7xAwstXYHpiauDkh9nqOvCgLiRAgAABAgQIBCYw02/IPe8k1sCqcns4Dny43cNfBAgQ2EtAU24vHd8RaFFgmC2p80NsdW0xJVMTIECAAAECBMYW+MxRBz6MjVjjAA58qBHX0AQIJCegKZdcSSWUksBHncCaUjnlQoAAAQIECFQgcGzqYPHc3LEKRjJEXQK2sNYla1wCBFIT0JRLraLySUpgfnKwwx6GWVWXFJBkCBAgQIAAgSwFnp8/nmXesSTtwIdYKiVOAgTaFtCUa7sC5iewh8Cgzbbpick9RvEVAQIECBAgQCAtgce7s8WpzkxaSSWWjdVyiRVUOgQI1CKgKVcLq0EJVCMwaFOumtmMQoAAAQIECBCIR8Cz5cKulQMfwq6P6AgQCENAUy6MOoiCwI4Cg56qutSZ3/F+HxIgQIAAAQIEUhUoT2E91D+N1StMAQc+hFkXUREgEJaAplxY9RANgdsEBl0p17F99TY3fxAgQIAAAQJ5CHxm4aN5JBpplrawRlo4YRMg0JiAplxj1CYiMJrAw10PMh5Nzl0ECBAgQIBA6gLPz/m/J4Vc429d6RVrWzdCDlFsBAgQaFVAU65VfpMT2F9gvy2sc5Mecry/oisIECBAgACBFAWOTR0snp71GI9Qa7u2tVV8870fhxqeuAgQINC6gKZc6yUQAIG9Bfbbwjo31d17AN8SIECAAAECBBIW+MzCUsLZxZ/an757Mf4kZECAAIGaBDTlaoI1LIGqBPZrylU1j3EIECBAgAABAjEKPN6dLRYmD8YYehYxv7F+tXi9/8+LAAECBO4W0JS728QnBIIS2O9k1c7EVFDxCoYAAQIECBAg0LSAAx+aFh9uvpd67w53g6sJECCQiYCmXCaFlma8AuXJqns9N85KunhrK3ICBAgQIECgGoHn5x34UI1kPaO8tLJcz8BGJUCAQOQCmnKRF1D4eQjst1ouDwVZEiBAgAABAgR2FpiZOFA8N3ds5y992rpAeeDDSytWy7VeCAEQIBCcgKZccCUREIG7BayGu9vEJwQIECBAgACB7QJWy23XCO/9N6/0wgtKRAQIEGhZQFOu5QKYnsAgAg93d9+SoWE3iKBrCBAgQIAAgdQFHPgQdoW/deXHxaWNjbCDFB0BAgQaFtCUaxjcdARGEdhr++p0/5lzXgQIECBAgAABAkXhwIewfwXf7DfmvAgQIEDgQwFNuQ8tvCMQrEB52MNHO3PBxicwAgQIECBAgEAIArawhlCF3WP40+WLu3/pGwIECGQooCmXYdGlHKfA0rSmXJyVEzUBAgQIECDQlIADH5qSHm2ey5sbxevrV0e72V0ECBBIUEBTLsGiSilNgd2eHXemu5hmwrIiQIAAAQIECIwgYLXcCGgN3vKny5canM1UBAgQCFtAUy7s+oiOwC0BzbdbFN4QIECAAAECBHYVcODDrjRBfOEU1iDKIAgCBAIR0JQLpBDCILCfQLlSzqEO+yn5ngABAgQIECBQFM/PH8MQqMDa1lbxFyvvBhqdsAgQINCsgKZcs95mIzCWwG5bWMca1M0ECBAgQIAAgcQEnp87nlhGaaXjFNa06ikbAgRGF9CUG93OnQQaF7hzC+vDXf8XzsaLYEICBAgQIEAgeIFjUweLp2fng48z1wC/deXHxdrWjVzTlzcBAgRuCWjK3aLwhkD4Appw4ddIhAQIECBAgEAYAmdn7wsjEFHsKPAXK3+74+c+JECAQE4CmnI5VVuu0QvcuVIu+oQkQIAAAQIECBCoSaB8rtyhiQM1jW7YcQX+oue5cuMaup8AgfgFNOXir6EMMhOwWi6zgkuXAAECBAgQGFngrC2sI9vVfeMb61eL1/v/vAgQIJCzgKZcztWXe5QCj88+cCvuucnurffeECBAgAABAgQI3C7wmYWl2z/wV1ACVssFVQ7BECDQgoCmXAvopiQwjsD2LazzU5py41i6lwABAgQIEEhb4HRnpliYPJh2khFn9833fhxx9EInQIDA+AKacuMbGoFAowJLnbliemKy0TlNRoAAAQIECBCIVeAzCx+NNfTk4768uVH8h9WfJJ+nBAkQILCbgKbcbjI+JxCwwPYtrAGHKTQCBAgQIECAQOsCTmFtvQR7BvCSU1j39PElAQJpC2jKpV1f2SUqsH0La6IpSosAAQIECBAgUInAsamDxWPd2UrGMkj1At+80qt+UCMSIEAgEgFNuUgKJUwC2wUeP/zA+3/axrpdxXsCBAgQIECAwM4Cz88d3/kLn7YusLa1VfzFyrutxyEAAgQItCGgKdeGujkJjCnQ6T9TrtzCWj5fzosAAQIECBAgQGBvgbOH5/e+wLetCnzzigMfWi2AyQkQaE1AU641ehMTGE/Ac+XG83M3AQIECBAgkI/AzMSB4ulZjblQK/6tflNubetGqOGJiwABArUJaMrVRmtgAvUKlFtYOxNT9U5idAIECBAgQIBAIgLPz9vCGnIp/5/3rJYLuT5iI0CgHgFNuXpcjUqgdoFyC6vtq7Uzm4AAAQIECBBIROBsf6Xcof6KOa8wBV7q/f/t3c1uHEe2IGACFCw3RbbVmB5YXg2Nlr1tqmc5vrj0bmY18htQbyC/Af0G8huU3kBa3H2p9y2TW8uL4qYlYHBtSqR4m4IIzAmZJRVLVWT9ZFZFZH4BHNdfZuSJL6rUraOMTNeVy3NmZEWAQJ0CinJ16uqbAAECBAgQIECAAIFsBFJhTstT4KejVyvPT0/zTE5WBAgQqElAUa4mWN0SIECAAAECBAgQIJCXwDd/+u95JSSbCwJu+HCBwwsCBFogoCjXgkk2RAIECBAgQIAAAQIEVlYsYc37W/AflrDmPUGyI0CgcgFFucpJdUiAAAECBAgQIECAQK4C/+fPt3JNrfV5/XLy2hLW1n8LABBol4CiXLvm22gJECBAgAABAgQItFrgf/83RbmcvwCWsOY8O3IjQKBqAUW5qkX1R4AAAQIECBAgQIBAtgK319ZXPv/k02zza3tilrC2/Rtg/ATaJaAo1675NloCBAgQIECAAAECrRf4tz+5C2uuX4K0hPVZhEaAAIE2CCjKtWGWjZEAAQIECBAgQIAAgfcClrC+p8jyibPlspwWSREgUIOAolwNqLokQIAAAQIECBAgQCBfAUtY852blNnff/s17wRlR4AAgYoEFOUqgtQNAQIECBAgQIAAAQLlCFjCmu9cvXhzaglrvtMjMwIEKhRQlKsQU1cECBAgQIAAAQIECJQhYAlr3vNkCWve8yM7AgSqEVCUq8ZRLwQIECBAgAABAgQIFCRgCWvek2UJa97zIzsCBKoRUJSrxlEvBAgQIECAAAECBAgUJmAJa74TZglrvnMjMwIEqhNQlKvOUk8ECBAgQIAAAQIECBQk8M3NPxeUbftStYS1fXNuxATaJqAo17YZN14CBAgQIECAAAECBN4JbG3cXLmxeo1GpgKWsGY6MdIiQKAyAUW5yih1RIAAAQIECBAgQIBAaQL/5my5bKfMEtZsp0ZiBAhUJKAoVxGkbggQIECAAAECBAgQKE/gmz9ZwprzrFnCmvPsyI0AgXkFFOXmFbQ/AQIECBAgQIAAAQLFCqTrylnCmu/0PT16lW9yMiNAgMCcAopycwLanQABAgQIECBAgACBsgXSteW0PAV+OXm98vz0NM/kZEWAAIE5BRTl5gS0OwECBAgQIECAAAECZQu4rlze8/f3w1/zTlB2BAgQmFFAUW5GOLsRIECAAAECBAgQINAMAdeVy3seXVcu7/mRHQECswsoys1uZ08CBAgQIECAAAECBBogsL56beWvlrBmO5OWsGY7NRIjQGBOAUW5OQHtToAAAQIECBAgQIBA+QKWsOY9h5aw5j0/siNAYDYBRbnZ3OxFgAABAgQIECBAgECDBNJdWLV8Bf7jP/9fvsnJjAABAjMKKMrNCGc3AgQIECBAgAABAgSaI3Dr+qcrf1lbb86AGjaSZ3EX1uOztw0bleEQINB2AUW5tn8DjJ8AAQIECBAgQIAAgXcCd1xXLutvwpPffss6P8kRIEBgWgFFuWnFbE+AAAECBAgQIECAQCMFLGHNe1pdVy7v+ZEdAQLTCyjKTW9mDwIECBAgQIAAAQIEGiiwFWfK3Yg7sWp5CqSinCWsec6NrAgQmE1AUW42N3sRIECAAAECBAgQINBAAXdhzXtSnx69yjtB2REgQGAKAUW5KbBsSoAAAQIECBAgQIBAswXS2XJavgJPfvs13+RkRoAAgSkFFOWmBLM5AQIECBAgQIAAAQLNFfjmT39u7uAaMDLXlWvAJBoCAQLvBRTl3lN4QoAAAQIECBAgQIBA2wXW45pyf1lbbztDtuM/PjtbsYQ12+mRGAECUwooyk0JZnMCBAgQIECAAAECBJot4Lpyec+vs+Xynh/ZESAwscBhKsp1J97chgQIECBAgAABAgQIEGi4wDc3LWHNeYpdVy7n2ZEbAQJTCOw5U24KLZsSIECAAAECBAgQINB8gduxfPVGLGPV8hR48eZ05fnpaZ7JyYoAAQJTCCjKTYFlUwIECBAgQIAAAQIE2iFgCWve82wJa97zIzsCBCYTUJSbzMlWBAgQIECAAAECBAi0SGBr42aLRlveUJ8c/lpe0jImQIDAkICi3BCIlwQIECBAgAABAgQIEFCUy/s78NPRq5Xjs7d5Jyk7AgQIXCGQinK9K7bxMQECBAgQIECAAAECBFolcOv6pyt/iWvLafkKPI3CnEaAAIFCBfZT3opyhc6etAkQIECAAAECBAgQqFfgjiWs9QLP2bu7sM4JaHcCBJYpcJgObvnqMqfAsQkQIECAAAECBAgQyFbAEtZsp+ZdYm72kPf8yI4AgasFFOWuNrIFAQIECBAgQIAAAQItFPjm5p9bOOpyhnx8drby7OR1OQnLlAABAkMCqSi3N/SelwQIECBAgAABAgQIECAQAn+1hDXr74G7sGY9PZIjQGC8QDd9lIpy79axphcaAQIECBAgQIAAAQIECHwQcF25DxY5Pvv74W85piUnAgQITCRg+epETDYiQIAAAQIECBAgQKCNAq4rl/esp+Wrx2dv805SdgQIEBgj0C/KvbsV65htvE2AAAECBAgQIECAAIFWCijK5T/tT35ztlz+syRDAgSGBN5dSq5flLOEdUjHSwIECBAgQIAAAQIECCSB/+WGD1l/EZ4evcw6P8kRIEBghMC7Oly/KDfic28RIECAAAECBAgQIECAgOvK5f0d+Pvhr3knKDsCBAiMEegX5bpjPvc2AQIECBAgQIAAAQIEWi1gCWve0398draSri2nESBAoCCBbsq1X5QrKG+pEiBAgAABAgQIECBAYHECt9fWV26sXlvcAR1paoGnR6+m3scOBAgQWLZAvyjXW3Yijk+AAAECBAgQIECAAIFcBZwtl+vM/J7XE0tY854g2REgMChw0H+hKNeX8EiAAAECBAgQIECAAIExAq4rNwYmk7d/ijPljs/eZpKNNAgQIHCpQK//ab8o5+6rfRGPBAgQIECAAAECBAgQGBJwptwQSIYvLWHNcFKkRIDAKIH3Nbh+UW5v1FbeI0CAAAECBAgQIECAAIGVFdeVy/9boCiX/xzJkACBdwLva3D9olx69yUcAgQIECBAgAABAgQIEBgtkApzWr4CT377Nd/kZEaAAIEPAh+dKZc+el+p+7CdZwQIECBAgAABAgQIECCQBFxXLu/vwYs3pyvPT0/zTlJ2BAgQGKi/DZ4p975SR4gAAQIECBAgQIAAAQIELgq4rtxFjxxfWcKa46zIiQCBIYH39bfBopwz5YaUvCRAgAABAgQIECBAgEBfQFGuL5Hv49MjV2XKd3ZkRoDAucD7+ttgUe59pQ4TAQIECBAgQIAAAQIECHwsoDD3sUlO7zhTLqfZkAsBAiMEDgbfGyzKva/UDW7gOQECBAgQIECAAAECBAj8LrC18RmKjAXSdeWenbzOOEOpESDQcoHe4PgV5QY1PCdAgAABAgQIECBAgMAlAu7AeglOJh85Wy6TiZAGAQKjBC6cEDdYlLN8dRSX9wgQIECAAAECBAgQIHAu4A6s+X8VFOXynyMZEmixwIXa22BRLpk8aTGMoRMgQIAAAQIECBAgQOBSgfXVayvOlruUaOkfutnD0qdAAgQIjBfoDn40XJTrDX7oOQECBAgQIECAAAECBAhcFLj9hxsX3/AqK4HjszPXlctqRiRDgMCAQG/g+Yqi3KCG5wQIECBAgAABAgQIELhCwB1YrwDK4GNLWDOYBCkQIDBKoDf45nBRrjv4oecECBAgQIAAAQIECBAgcFHgq7X1i294lZ2Aolx2UyIhAgRGXDJuuCjXo0SAAAECBAgQIECAAAEC4wXSNeVuxLXltHwFXFcu37mRGYEWC/SGx64oNyziNQECBAgQIECAAAECBK4QcLbcFUBL/th15ZY8AQ5PgMAogd7wm8NFufS5O7AOK3lNgAABAgQIECBAgACBAYGtjc8GXnmao4AlrDnOipwItFqgOzz6UUW5veGNvCZAgAABAgQIECBAgACBDwJpCauWt4CiXN7zIzsCLRT4qN42qijXayGMIRMgQIAAAQIECBAgQGBigTsbNyfe1obLEXBdueW4OyoBAiMFXsa7h8OfjCrKfVS5G97JawIECBAgQIAAAQIECLRZYD1u9PD5J5+2mSD7sbuuXPZTJEECbRIYWWsbVZTrtknFWAkQIECAAAECBAgQIDCLgJs9zKK22H0sYV2st6MRIDBWoDvqk1FFubTd/qiNvUeAAAECBAgQIECAAAECvwvcXruBInMBRbnMJ0h6BNojMPGZcolk5MbtsTJSAgQIECBAgAABAgQIXC7gunKX++Tw6c8nr3NIQw4ECBAYWWcbd6bcyI0ZEiBAgAABAgQIECBAgMDvAltu9pD9V+HFm9OV56en2ecpQQIEGi1wEKPrjRrhuKJcd9TG3iNAgAABAgQIECBAgACBDwK319Y/vPAsSwFLWLOcFkkRaJPA2BPfxhXlxu7QJjVjJUCAAAECBAgQIECAwGUCt//gunKX+eTw2dOjlzmkIQcCBNorMLbGNq4ol6ietNfLyAkQIECAAAECBAgQIHC1gDPlrjZa9hbP/utk2Sk4PgEC7Rbojhv+ZUW5sTuN68z7BAgQIECAAAECBAgQaJPAV5avZj/dz+JmD0dnb7PPU4IECDRWoDtuZJcV5caeXjeuM+8TIECAAAECBAgQIECgTQLOlCtjtp+dOFuujJmSJYHGCVy6CvWyoly3cRQGRIAAAQIECBAgQIAAgQoF1levrXz+yacV9qirOgTc7KEOVX0SIDCBwKUnvF1WlDuMzvcnOIBNCBAgQIAAAQIECBAg0FoBS1jzn/p/HL3KP0kZEiDQRIHuZYO6rCiX9rt058s69hkBAgQIECBAgAABAgTaIHB7zR1Yc5/nnxTlcp8i+RFoqkD3soEpyl2m4zMCBAgQIECAAAECBAhcIXBn4+YVW/g4B4Gf44YPGgECBBYokFafplWoY5ui3FgaHxAgQIAAAQIECBAgQOBqgVuuKXc1UgZbuNlDBpMgBQLtEuheNdyrinKuK3eVoM8JECBAgAABAgQIEGi1wK3rn67ciBs+aHkLuNlD3vMjOwINFOheNaarinJp/ys7ueogPidAgAABAgQIECBAgECTBdzsIf/Z/fm/LF/Nf5ZkSKBRAt2rRqMod5WQzwkQIECAAAECBAgQIHCFgJs9XAGUwcdp+erR2dsMMpECAQItEHgSY7z0enLJYJKi3KMWYBkiAQIECBAgQIAAAQIEZha4/Yf1mfe14+IEXFducdaORKDlAt1Jxj9JUS71kyp8GgECBAgQIECAAAECBAiMEPgiriun5S/gunL5z5EMCTREYKIT3CYtyk3UWUPgDIMAAQIECBAgQIAAAQJTCWxt3JxqexsvR+DnE9eVW468oxJolcDLGO3eJCOetCjXnaQz2xAgQIAAAQIECBAgQKCtAp9/4my53Of+57iunEaAAIGaBSY+sW3Solyq8B3UnLTuCRAgQIAAAQIECBAgUKyAO7DmP3Uv3py62UP+0yRDAqULdCcdwKRFudTfxJ1OenDbESBAgAABAgQIECBAoCkC7sBaxky62UMZ8yRLAgULVH6mXLKYuNOC4aROgAABAgQIECBAgACBmQRur7kD60xwC97JzR4WDO5wBNolsB/DPZx0yNOcKZeKculidRoBAgQIECBAgAABAgQIDAl84ZpyQyJ5vvzH0as8E5MVAQJNEOhMM4hpinKp3+40nduWAAECBAgQIECAAAECbRFwplwZM/389LSMRGVJgECJAt1pkp62KGcJ6zS6tiVAgAABAgQIECBAoFUCCnP5T7ebPeQ/RzIkUKhAukHq3jS5K8pNo2VbAgQIECBAgAABAgQIXCKwvnrtkk99lIuAmz3kMhPyINAogalPZJu2KHcYXI8bRWYwBAgQIECAAAECBAgQqEhga+OzinrSTZ0CbvZQp66+CbRWoDPtyKctyqX+p678TZuU7QkQIECAAAECBAgQIFCiwC03eyhi2n4+eV1EnpIkQKAYgamXrqaRKcoVM78SJUCAAAECBAgQIEAgd4Evrn+ae4ryC4GfT044ECBAoEqBmU5gm6UoZwlrldOmLwIECBAgQIAAAQIEGiOwtXGzMWNp8kDc7KHJs2tsBJYi0JnlqLMU5dJxZqoAzpKgfQgQIECAAAECBAgQIFCSwA03eyhiutzsoYhpkiSBEgRmWrqaBqYoV8L0ypEAAQIECBAgQIAAgWIEvlpbLybXNifqunJtnn1jJ1CpwMwnrs1alLOEtdL50xkBAgQIECBAgAABAk0RuPXJ9aYMpdHjcKZco6fX4AgsUqAz68FmLcql481cCZw1WfsRIECAAAECBAgQIEAgd4FbbvaQ+xS9y++fb06LyFOSBAhkLbAf2e3NmuE8RblOHPTlrAe2HwECBAgQIECAAAECBJoocMfNHoqY1p+OXhWRpyQJEMhaoDNPdvMU5dJxnS03j759CRAgQIAAAQIECBBonMC6Gz0UM6euK1fMVEmUQK4Cc9XF5i3KdXJVkRcBAgQIECBAgAABAgSWIXDbjR6WwT7TMZ9bwjqTm50IEHgn8Dj+25vHYt6iXDcOnm79qhEgQIAAAQIECBAgQIDAucANZ8sV8V1ws4cipkmSBHIVmOssuTSoeYtyqY9O+o9GgAABAgQIECBAgAABAr8LfOVsuSK+CpavFjFNkiSQo0C6x0Jn3sQU5eYVtD8BAgQIECBAgAABAgSGBG59cn3oHS9zFLB8NcdZkROBIgTmPksujbKKolwv+knraDUCBAgQIECAAAECBAgQCIFb1z/lUICA5asFTJIUCeQp8KCKtKooyqU8KqkQVjEgfRAgQIAAAQIECBAgQGDZAm72sOwZmPz4lrBObmVLAgTeCezHf/eqsKiqKNeJZNJ6Wo0AAQIECBAgQIAAAQKtF9hwo4divgOWsBYzVRIlkItAJWfJpcFUVZRLfVWWVOpMI0CAAAECBAgQIECAQKkCzpQrZ+YsYS1nrmRKIAOBdEJaZatFqyzKdTLAkQIBAgQIECBAgAABAgSWLrDuTLmlz8GkCVi+OqmU7QgQCIFUkDusSqLKolwvknLDh6pmRj8ECBAgQIAAAQIECBQt4Gy5MqbP8tUy5kmWBDIRqHSVaJVFueRTaXKZgEuDAAECBAgQIECAAAECUws4W25qsqXsYPnqUtgdlECJAk8i6b0qE6+6KNeN5A6qTFBfBAgQIECAAAECBAgQKFHg9tqNEtNuZc6WsLZy2g2awLQCnWl3uGr7qoty6Xi7Vx3U5wQIECBAgAABAgQIEGi6gDPlypnh47OzcpKVKQECyxBIJ6B1qj5wHUW5R5FkuhuFRoAAAQIECBAgQIAAgdYKuKZcOVP/9OhVOcnKlACBZQh06jhoHUW5w0i0lmTrANAnAQIECBAgQIAAAQIE6hDYcAfWOlhr6fP56Wkt/eqUAIFGCKQTz2q5h0IdRbkkXkuyjZhKgyBAgAABAgQIECBAoBUCtz75tBXjbMIg//lGUa4J82gMBGoSSCtC0wlolbe6inK9yPRh5dnqkAABAgQIECBAgAABAoUI3LquKFfIVK08O3ldSqryJEBg8QK7dR2yrqJcytfZcnXNmn4JECBAgAABAgQIEChC4IYlrEXMkxs9FDFNkiSwDIHHcdBeXQeusyi3F0k/qStx/RIgQIAAAQIECBAgQCB3ga/W1nNPUX7nAm724KtAgMAIgVpPOKuzKJfGsjtiQN4iQIAAAQIECBAgQIAAAQJZCRydvc0qH8kQILB0gXSiWbfOLOouyqXknS1X5wzqmwABAgQIECBAgACBbAW2Nj7LNjeJXRR4dnJy8Q2vCBBou8Bu3QB1F+VS/p26B6F/AgQIECBAgAABAgQIECAwj8DzU3dgncfPvgQaJlD7WXLJa1FFuYOGTY7hECBAgAABAgQIECBA4EqBW5+4A+uVSJls8M83inKZTIU0COQg0FlEEosoyqVx7C5iMI5BgAABAgQIECBAgACBnAS+uK4ol9N8XJbLs5PXl33sMwIE2iOQTizrLGK4iyrKpcE4W24RM+oYBAgQIECAAAECBAgQIDC1wPHZ2dT72IEAgUYK7C5qVIsqyqXxLGxQi8JzHAIECBAgQIAAAQIECFwmsLVx87KPfZaZwM/OlstsRqRDYOECCztLLo1skUW5ThzP2XJJXSNAgAABAgQIECBAgACB7AScLZfdlEiIwKIFdhd5wEUW5dK4Fjq4RUI6FgECBAgQIECAAAECBEYJfO5mD6NYsnzPmXJZToukCCxKYKFnyaVBLboo14lj7qcDawQIECBAgAABAgQIEGiDgJs9lDPLzpQrZ65kSqAGgZ0a+ry0y0UX5VIy9y/NyIcECBAgQIAAAQIECBAgQGAJAs6UWwK6QxLIQ+BJpNFddCrLKMqlQabBagQIECBAgAABAgQIEGi8wO21G40fY1MGeOQOrE2ZSuMgMK3A7rQ7VLH9MopyKe/dKpLXBwECBAgQIECAAAECBHIXWF+9lnuK8jsXeObuq74LBNoosJSz5BL0sopy3Ti2s+XSDGgECBAgQIAAAQIECBAgkIWAa8plMQ2SILBogaVdZm1ZRbkEvLNoZccjQIAAAQIECBAgQIDAogVur60v+pCON4eA68rNgWdXAuUJPIyU95aV9jKLcr0YdBq8RoAAAQIECBAgQIAAgcYKbFi+WtTcOluuqOmSLIF5BF7GzrvzdDDvvsssyqXc0ymCCUEjQIAAAQIECBAgQIAAAQJLF3h+err0HCRAgMBCBB7EUXoLOdKYgyy7KHcYeSUEjQABAgQIECBAgAABAo0UsHy1rGl9/kZRrqwZky2BmQTSCWJLr0ctuyiX5HYjDtITjQABAgQIECBAgAABAk0TcPfVsmb06OxtWQnLlgCBWQTux07pRLGlthyKcgkgYWgECBAgQIAAAQIECBAgQGCpAj+fnCz1+A5OgEDtAvtxhE7tR5ngALkU5R5Frk8myNcmBAgQIECAAAECBAgQKE7g808+LS5nCRMgQKChAtmcGJZLUS7NczYoDf3SGRYBAgQIECBAgAABAksS+OK6otyS6Kc+7E9Hr6bexw4ECBQj8DAy7eaSbU5Fub1A+TEXGHkQIECAAAECBAgQIECAAAECBAg0RiDd3CGrE8JyKsqlWd6NSEgaAQIECBAgQIAAAQIECBBYisDzU3dgXQq8gxKoV2A3uj+s9xDT9Z5bUS7hZFW1nI7T1gQIECBAgAABAgQIEPhY4PbajY/f9E62As/fKMplOzkSIzCbQLq5w4PZdq1vr9yKcmmknQg3fUgSGgECBAgQIECAAAECjRBYX73WiHEYBAECBAoVyPIEsByLcml+dwqdZGkTIECAAAECBAgQIECAQOECT93sofAZlD6BCwLp/gXdC+9k8iLXolwvfH7IxEgaBAgQIECAAAECBAgQIECAAAEC5Qmk+xbs5pp2rkW55JXQ0ppfjQABAgQIECBAgAABAkUL3F5bLzr/tiV/dPa2bUM2XgJNFdiJgaX7F2TZci7KJbAs1/xmOZOSIkCAAAECBAgQIEAgW4EN15TLdm5GJfbzycmot71HgEBZAul+BY9yTjn3olw38NLaX40AAQIECBAgQIAAAQIECBAgQIDAJAJp2erOJBsuc5vci3LJZjfiID3RCBAgQIAAAQIECBAgQIBA3QLHlq/WTax/AnUL7MYBenUfZN7+SyjKpbW/O/MO1P4ECBAgQIAAAQIECBBYlsC65avLop/puM8sX53JzU4EMhFIy1YfZJLLpWmUUJRLA+hGWMaaJDQCBAgQIECAAAECBIoTcKOH4qZMwgQIlClQxLLVPm0pRbmU726EZaxJQiNAgAABAgQIECBAgACBWgXcgbVWXp0TqEtgNzru1dV51f2WVJSzjLXq2dcfAQIECBAgQIAAAQIECIwUsIR1JIs3CeQsUMyy1T5iSUW5lHM3wjLWJKERIECAAAECBAgQIECAAAECBAgkgbRs9W5pFKUV5ZLv/Yj90qDlS4AAAQIECBAgQIAAAQIECBAgUIvATvSaVlgW1UosyiXgnaKUJUuAAAECBAgQIECAQOsF3OyhrK/A06NXZSUsWwLtFXgcQ39U4vBLLcrtBfb3JYLLmQABAgQIECBAgACBdgqsr15r58CNmgABAvUJpBuC7tTXfb09l1qUSyoPItJF/DQCBAgQIECAAAECBAgQIECAAIH2CezEkItbttqfppKLcmkMdyPSxfw0AgQIECBAgAABAgQIECBQmcDz09PK+tIRAQK1CPwQvXZr6XlBnZZelEvV0FSY0wgQIECAAAECBAgQIECAQGUC/3yjKFcZpo4IVC+QVk7uVt/tYnssvSiXtLoRP6YnGgECBAgQIECAAAECBAgQIECAQKMF0orJRpyg1YSiXPqm3Y/YT080AgQIECBAgAABAgQIECBAgACBxgqkgtxhE0bXlKJcmos0Ka4v14RvpTEQIECAAAECBAgQaKDA7bUbDRxVc4fkmnLNnVsjK1qg+OvIDeo3qSjXi4GlwpxGgAABAgQIECBAgACB7ATWV69ll5OExgu8cE258Tg+IbAcgUZcR26QrklFuTSubkSqmmoECBAgQIAAAQIECBAgQIAAAQLNEGjMdeQGp6NpRbk0tt2Ix+mJRoAAAQIECBAgQIAAAQIECBAgULzAdoygEdeRG5yJJhbl0vh2Ig7SE40AAQIECBAgQIAAAQIECBAgQKBYgXuR+V6x2V+SeFOLcql6mq4v58YPl0y+jwgQIECAAAECBAgQIEBgvMDTo1fjP/QJAQKLEHgYB+ks4kDLOEZTi3LJMlVR7y8D1TEJECBAgAABAgQIECBAgAABAgTmEtiPvXfm6iHznZtclEv0nYgf0xONAAECBAgQIECAAAECBAgQIECgCIG08nG7iEznSLLpRblEk86WezyHkV0JECBAgAABAgQIECBAgAABAgQWJ7Adhzpc3OGWc6Q2FOWS7E5EOu1RI0CAAAECBAgQIECAAAECBAgQyFegsTd2GCZvS1EuVVfvRqTTHzUCBAgQIECAAAECBAgQIHClwPPT0yu3sQEBApUK/Bi9dSrtMePO2lKUS1PQi9iOUJgLBI0AAQIECBAgQIAAAQIELhd4/kZR7nIhnxKoVCDdaTVdgqw1rU1FuTSpexGtmuDWfJMNlAABAgQIECBAgAABAgQIEChVIF1yrHX1mrYV5dKXsxPxfXqiESBAgAABAgQIECBAgAABAgQILFXgII6+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>
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
}) })
......
...@@ -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;
......
/*重置单选按钮样式*/
.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) {
...@@ -81,7 +78,6 @@ service.interceptors.response.use( ...@@ -81,7 +78,6 @@ service.interceptors.response.use(
}else{ }else{
tryHideFullScreenLoading() tryHideFullScreenLoading()
} }
const res = response.data const res = response.data
/* /*
baseUrl时,返回000000为成功 baseUrl时,返回000000为成功
...@@ -96,7 +92,6 @@ service.interceptors.response.use( ...@@ -96,7 +92,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
......
...@@ -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,7 +449,22 @@ export const ssoLogin = (href, paramMap) => { ...@@ -443,7 +449,22 @@ 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,19 +3,51 @@ ...@@ -3,19 +3,51 @@
<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>
</div>
</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> </el-table>
</div> </div>
</el-col> </el-col>
...@@ -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;
...@@ -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 {
if(window.location.host.indexOf("work.yunqueyi") != -1&&window.location.host.indexOf("test2-work.yunqueyi") == -1) {
window.location.href = getLoginUrl('?from=work&type=logout') 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>
Markdown 格式
0% or
您添加了 0 到此讨论。请谨慎行事。
先完成此消息的编辑!
想要评论请 注册