diff --git a/src/api/doctor/disease.js b/src/api/doctor/disease.js index 720fbdd681f56e43759883a9de7967eaeb3274fb..716361be0e86c9ce8f53cb38081b76a0d233dde9 100644 --- a/src/api/doctor/disease.js +++ b/src/api/doctor/disease.js @@ -48,4 +48,9 @@ export function delDiagnose(params) { // 报卡信息主键查询 export function fetchCurrencyByUuid(params) { return fetchBase({ url: `/chronic-admin/v1/chronic-visit-record-crs/record-uuid`, body: params, loading: true }) +} + +// 删除随访 +export function deleteVisitRecord(params) { + return fetchBase({ url: `/chronic-admin/v1/chronic-visit-record/delete`, body:params, loading: true }) } \ No newline at end of file diff --git a/src/api/doctor/highVisitApi.js b/src/api/doctor/highVisitApi.js new file mode 100644 index 0000000000000000000000000000000000000000..df54f7b381cae47452dbadae5cbc2aaf05578c7d --- /dev/null +++ b/src/api/doctor/highVisitApi.js @@ -0,0 +1,50 @@ + +import {fetchBase} from '@/api/doctor/doctorFetch' + +// 保存主要慢病随访 +export function saveHighMajorVisit(params) { + return fetchBase({ url: `/chronic-admin/v1/chronic-high-visit-major/save`,body: params}) +} +// 修改主要慢病随访 +export function updateHighMajorVisit(params) { + return fetchBase({ url: `/chronic-admin/v1/chronic-high-visit-major/update`,body: params}) +} + +//查询主要慢病随访 +export function getHighMajorVisitId(id) { + return fetchBase({ url: `/chronic-admin/v1/chronic-high-visit-major/record`,body:{"id":id},loading: true}) +} +//删除主要慢病随访 +export function deleteHighMajorVisit(params) { + return fetchBase({ url: `/chronic-admin/v1/chronic-high-visit-major/delete`,body: params}) +} + +// 保存专病随访 +export function saveHighSpecificVisit(params) { + return fetchBase({ url: `/chronic-admin/v1/chronic-high-visit-specific/save`,body: params}) +} + +// 修改专病随访 +export function updateHighSpecificVisit(params) { + return fetchBase({ url: `/chronic-admin/v1/chronic-high-visit-specific/update`,body: params}) +} + +//查询专病随访 +export function getHighSpecificVisitId(id) { + return fetchBase({ url: `/chronic-admin/v1/chronic-high-visit-specific/record`,body:{"id":id},loading: true}) +} + +//删除专病随访 +export function deleteHighSpecificVisit(params) { + return fetchBase({ url: `/chronic-admin/v1/chronic-high-visit-specific/delete`,body: params}) +} + +//查询最近一次专病高危随访 +export function getLastHighSpecificVisit(params) { + return fetchBase({ url: `/chronic-admin/v1/chronic-high-visit-specific/last-info`, body: params, loading: true}) +} + +//删除高危随访 +export function delHighVisit(params) { + return fetchBase({ url: `/chronic-admin/v1/chronic-high-visit-collect/delete`,body: params}) +} \ No newline at end of file diff --git a/src/doctor/patientDetail/PatientDetail.vue b/src/doctor/patientDetail/PatientDetail.vue index 53c2f88738665b235afba83b2ceedc199b2a63cc..c4a09b0f0f00663ebba3d03ca8e492232468e317 100644 --- a/src/doctor/patientDetail/PatientDetail.vue +++ b/src/doctor/patientDetail/PatientDetail.vue @@ -137,6 +137,8 @@ export default { addOptions: [ { name: '新增主要慢病高危筛查', value: 1, path: '/doctor/screening/firstForm' }, { name: '新增专病高危筛查', value: 2, path: '/doctor/screening/secondForm' }, + { name: '新增主要慢病高危随访', value: 8, path: '/doctor/screening/highVisit/firstForm' }, + { name: '新增专病高危随访', value: 9, path: '/doctor/screening/highVisit/secondForm' }, { name: '新增慢病诊断', value: 3, path: '/doctor/diagnose/form' }, { name: '新增通用随访', value: 4, path: '/doctor/followUp/generalFU/add' }, { name: '新增死亡记录', value: 5, path: '/doctor/deathRecord/add' }, diff --git a/src/doctor/patientDetail/components/disease/Visit.vue b/src/doctor/patientDetail/components/disease/Visit.vue index 85be043ebd76658fd0315ee1718c713b45454fba..43dff7ec306c6b7d63e3ffd5311a693d6ad2b230 100644 --- a/src/doctor/patientDetail/components/disease/Visit.vue +++ b/src/doctor/patientDetail/components/disease/Visit.vue @@ -50,13 +50,13 @@ </div> <div class='divider'></div> <div class='bt-group'> - <van-button round size='small' class='doc-btn-primary' @click='toDetail(item)'>详情 + <van-button round size='small' class='doc-btn-primary' @click.stop='toDetail(item)'>详情 </van-button> <!-- <van-button round size="small" class="doc-btn-primary" v-if="item.allowUpdate == 1">转诊</van-button>--> <van-button round size='small' class='doc-btn-primary' @click.stop='editBtn(item)' v-if='!(item.allowUpdate !==1 || item.serveType == 5)'>修改 </van-button> - <van-button round size='small' class='doc-btn-red' @click='delBtn(item)' + <van-button round size='small' class='doc-btn-red' @click.stop='delBtn(item)' v-if='!(item.allowUpdate !==1 || item.serveType == 5)'>删除 </van-button> </div> @@ -72,9 +72,10 @@ </template> <script> -import { delDiagnose, getVisitManageList } from '@/api/doctor/disease.js' +import { delDiagnose, deleteVisitRecord, getVisitManageList } from '@/api/doctor/disease.js' import { useStore } from '@/doctor/store' import { showConfirmDialog } from 'vant' +import { delHighVisit } from '@/api/doctor/highVisitApi' export default { inject: ['residentInfo'], @@ -189,9 +190,19 @@ export default { }) } }, - delBtn() { + delBtn(record) { + showConfirmDialog({ + message: '确定要删除吗?' + }).then(() => { + deleteVisitRecord({ id: record.id }).then(res => { + setTimeout(() => { + this.$message.info('删除成功') + }, 600) + this.list = this.list.filter(e => e.id !== record.id) + }) + }).catch((err) => { console.warn('delBtn', err) }) - } + }, }, watch: { diseaseType() { diff --git a/src/doctor/patientDetail/components/screening/Visit.vue b/src/doctor/patientDetail/components/screening/Visit.vue index d83c9fd2c72433471dba5f31f2d1626927452753..bfe6bacddb0df08be8d9de605449dc7b66438b6d 100644 --- a/src/doctor/patientDetail/components/screening/Visit.vue +++ b/src/doctor/patientDetail/components/screening/Visit.vue @@ -1,7 +1,7 @@ <template> - <div class="h-full visit-list" ref='list'> + <div class='h-full visit-list' ref='list'> <van-pull-refresh v-model='loadingRefresh' @refresh='onRefresh' - :disabled='isRefreshDisable' style="min-height: 100%"> + :disabled='isRefreshDisable' style='min-height: 100%'> <van-list v-model:loading='loading' :finished='finished' @@ -9,43 +9,46 @@ :immediate-check='false' @load='onMore' > - <div class="flex flex-col"> - <div v-for='item in list' :key="item.id" - :class="['mb-3', {'first-card': item.serveType == 1}, + <div class='flex flex-col'> + <div v-for='item in list' :key='item.id' + :class="['mb-3', {'first-card': item.serveType == 1}, {'second-card': item.serveType == 2}, {'general-card': item.serveType == 3}]"> - <div class="title px-4 py-1">{{item.serveTypeName}}</div> - <div class="py-3 px-4 doc-list-card" @click="toDetail(item)"> - <div class="flex flex-col" style="row-gap: .04rem;line-height: 1.5;" - @click="toDetail(item)"> + <div class='title px-4 py-1'>{{ item.serveTypeName }}</div> + <div class='py-3 px-4 doc-list-card'> + <div class='flex flex-col' style='row-gap: .04rem;line-height: 1.5;' + @click='toDetail(item)'> <div> - <span class="label">随访日期</span> + <span class='label'>随访日期</span> <span>{{ item.visitDate }}</span> </div> <div> - <span class="label">随访类型</span> + <span class='label'>随访类型</span> <span>{{ item.visitTypeName || '-' }}</span> </div> <div> - <span class="label">随访方式</span> + <span class='label'>随访方式</span> <span>{{ item.visitWayName || '-' }}</span> </div> - <div class="text-ellipsis"> - <span class="label">随访医生</span> + <div class='text-ellipsis'> + <span class='label'>随访医生</span> <span>{{ item.visitDoctorName || '-' }}</span> </div> - <div class="text-ellipsis"> - <span class="label">随访机构</span> + <div class='text-ellipsis'> + <span class='label'>随访机构</span> <span>{{ item.visitUnitName || '-' }}</span> </div> </div> - <div class="divider my-3" v-if="item.serveType == 3"></div> - <div class="bt-group" v-if="item.serveType == 3"> - <van-button round size="small" class="doc-btn-primary" @click="toDetail(item)">详情</van-button> - <!-- <van-button round size="small" class="doc-btn-primary" @click='editBtn(item)' - v-if="!(item.allowUpdate !==1 || item.serveType == 3)">修改</van-button> - <van-button round size="small" class="doc-btn-red" @click="delBtn(item)" - v-if="!(item.allowUpdate !==1 || item.serveType == 3)">删除</van-button> --> + <div class='divider my-3'></div> + <div class='bt-group'> + <van-button round size='small' class='doc-btn-primary' @click='toDetail(item)'>详情 + </van-button> + <van-button round size='small' class='doc-btn-primary' @click='editBtn(item)' + v-if='!(item.allowUpdate !==1 || item.serveType == 3)'>修改 + </van-button> + <van-button round size='small' class='doc-btn-red' @click='delBtn(item)' + v-if='!(item.allowUpdate !==1 || item.serveType == 3)'>删除 + </van-button> </div> </div> </div> @@ -62,6 +65,9 @@ <script> import { getHighVisitList } from '@/api/doctor/visit.js' import { useStore } from '@/doctor/store' +import { delHighVisit } from '@/api/doctor/highVisitApi' +import { showConfirmDialog } from 'vant' +import { deleteSecondScreening } from '@/api/doctor/screening' export default { inject: ['residentInfo'], @@ -131,6 +137,24 @@ export default { this.$message.info('暂时无法查看 详情信息') return } + //主要慢病 + if (record.serveType == 1) { + this.$router.push({ + path: '/doctor/screening/highVisit/firstDetail', + query: { + id: record.relationId + } + }) + } + //专病高危 + if (record.serveType == 2) { + this.$router.push({ + path: '/doctor/screening/highVisit/secondDetail', + query: { + id: record.relationId + } + }) + } if (record.serveType == 3) { this.$router.push({ path: '/doctor/screening/highVisit/GeneralFUDetail', @@ -139,19 +163,44 @@ export default { } }) } - // this.$router.push({ - // path: '/doctor/patient-detail', - // query: { - // residentInfoId: record.residentInfoId - // } - // }) }, - editBtn() { - + editBtn(record) { + if (!record) return + if (record.id == null) { + this.$message.info('暂时无法修改') + return + } + //主要慢病 + if (record.serveType == 1) { + this.$router.push({ + path: '/doctor/screening/highVisit/firstForm', + query: { + id: record.relationId + } + }) + } + //专病高危 + if (record.serveType == 2) { + this.$router.push({ + path: '/doctor/screening/highVisit/secondForm', + query: { + id: record.relationId + } + }) + } + }, + delBtn(record) { + showConfirmDialog({ + message: '确定要删除吗?' + }).then(() => { + delHighVisit({ id: record.id }).then(res => { + setTimeout(() => { + this.$message.info('删除成功') + }, 600) + this.list = this.list.filter(e => e.id !== record.id) + }) + }).catch((err) => { console.warn('delBtn', err) }) }, - delBtn() { - - } }, watch: { 'store.refreshMark'() { @@ -161,6 +210,6 @@ export default { } </script> -<style lang="less" scoped> +<style lang='less' scoped> </style> diff --git a/src/doctor/screening/highVisit/detail/FirstDetail.vue b/src/doctor/screening/highVisit/detail/FirstDetail.vue new file mode 100644 index 0000000000000000000000000000000000000000..ba4000fa8cc8d66dcb87f1cb63ebb33a1f2ad72c --- /dev/null +++ b/src/doctor/screening/highVisit/detail/FirstDetail.vue @@ -0,0 +1,273 @@ +<template> + <div class="flex flex-col" style="height: 100vh"> + <div class="p-3 text-black text-center shrink-0 doc-nav-bar" > + <span @click="onBack" class="text-12 back-bt"> + <doc-icon type="doc-left2" /> + </span> + <span>主要慢病随访详情</span> + </div> + <div class="px-4 py-3 flex shrink-0 base-info"> + <div class="flex w-full"> + <div class="grow flex flex-col justify-between"> + <div class="flex justify-between"> + <span class="name">{{ collapseList[0].info.residentName }}</span> + </div> + <div class='lh-22'> + <div class='mt-3'>随访日期:<span class='color-26'>{{ info.visitDate || '-' }}</span></div> + <span>慢病高危评估结果:</span> + <span :class="{'text-red': info.screenResult !== 1, 'color-26': info.screenResult === 1 }">{{ info.screenResultName }}</span> + </div> + </div> + </div> + </div> + <div class="p-3 grow cont-box"> + <div class="p-3 h-full cont-inner"> + <div class="flex justify-between collapse-head mt-2"> + <span class="text-16 font-semibold">全部内容</span> + <span @click="toggleAll"> + <span v-if="!collapseAll">展开全部</span> + <span v-else>展开收起</span> + <span :class="['ml-2 icon-down', { 'icon-down-expanded': collapseAll }]"> + <doc-icon type="doc-down" /> + </span> + </span> + </div> + + <van-collapse :model-value="activeCollapse" ref="collapse" class="doc-collapse" + @change="collapseChange"> + <van-collapse-item v-for="collapse in collapseList" :key="collapse.name" + :title="collapse.title" :name="collapse.name"> + <template #right-icon> + <doc-icon type="doc-down" /> + </template> + <div class="list"> + <div v-for="item in collapse.columns" :key="item.key" > + <div v-if="item.key == 'pressure'" class="pt-3"> + <table class="w-full"> + <tr> + <td style="width: 7.1em">血压值(mmHg)</td> + <td>收缩压(高压)</td> + <td></td> + <td>舒张压(低压)</td> + </tr> + <tr> + <td> + 第1次测量 + </td> + <td> + {{ info.pressureOneSbp || '-' }} + </td> + <td>/</td> + <td> + {{ info.pressureOneDbp || '-' }} + </td> + </tr> + <tr> + <td> + 第2次测量 + </td> + <td class="flex"> + {{ info.pressureTwoSbp || '-' }} + </td> + <td>/</td> + <td> + {{ info.pressureTwoDbp || '-' }} + </td> + </tr> + </table> + </div> + <div v-else class="flex justify-between py-1 border-bottom item"> + <span class="shrink-0 mr-2 label">{{ item.title }}</span> + <span v-if="item.key === 'idCard'">{{ $idCardHide(collapse.info.idCard) || '-' }}</span> + + <span class="text-end" v-else> + <span>{{ collapse.info[item.key] || '-' }}</span> + <span v-if="item.unit" class="ml-1">{{ item.unit }}</span> + </span> + </div> + </div> + </div> + </van-collapse-item> + </van-collapse> + </div> + </div> + </div> +</template> + +<script> +import { showNotify } from 'vant' +import { useStore } from '@/doctor/store' +import { getHighMajorVisitId } from '@/api/doctor/highVisitApi' + +export default { + data() { + return { + store: useStore(), + activeCollapse: [], + collapseList: [ + { title: '居民信息', name: '1', columns: [ + { title: '姓名', key: 'residentName' }, + { title: '证件号码', key: 'idCard'}, + { title: '性别', key: 'genderName' }, + { title: '出生日期', key: 'dataBirth' }, + { title: '年龄', key: 'currentAge' }, + { title: '民族', key: 'nationalName' }, + { title: '本人电话', key: 'telephone' }, + { title: '现住址', key: 'presentCodeName' }, + { title: '详细地址', key: 'nowAddress' }, + { title: '户籍地址', key: 'registeredCodeName' }, + { title: '详细地址', key: 'permanentAddress' } + ], info: {} }, + { title: '随访信息', name: '2', columns: [ + { title: '年龄', key: 'currentAge', unit: '岁' }, + { title: '既往史', key: 'medicalHistoryName' }, + { title: '身高', key: 'height', unit: 'cm' }, + { title: '体重', key: 'weight', unit: 'kg' }, + { title: 'BMI', key: 'bmi', unit: 'kg/m²' }, + { title: '腰围', key: 'waistline', unit: 'cm' }, + { title: '是否吸烟', key: 'isSmokingName' }, + { title: '家族史', key: 'familyHistoryName' }, + { title: '血压值', key: 'pressure' }, + { title: '空腹血糖', key: 'fastingGlucose', unit: 'mmol/L' }, + { title: '低密度脂蛋白胆固醇', key: 'ldlCholesterin', unit: 'mmol/L' }, + { title: '血清总胆固醇', key: 'serumCholesterin', unit: 'mmol/L' }, + { title: '高密度脂蛋白胆固醇', key: 'hdlCholesterin', unit: 'mmol/L' }, + { title: '运动', key: 'exerciseIntensityName' }, + { title: '慢病高危评估结果', key: 'screenResultName' } + ], info: {} }, + { title: '机构', name: '3', columns: [ + { title: '随访机构', key: 'visitUnitName' }, + { title: '随访科室', key: 'visitOfficeName' }, + { title: '随访医生', key: 'visitDoctorName' }, + { title: '随访日期', key: 'visitDate' } + ], info: {} } + ], + // 全部展开、收起 + collapseAll: false, + info: {} + } + }, + computed: { + id() { + return this.$route.query.id + } + }, + created() { + document.title = '随访详情' + if (!this.id) { + showNotify({ type: 'warning', message: '未获取到查询信息'}) + return + } + this.init() + }, + methods: { + init() { + + getHighMajorVisitId(this.id).then(res => { + this.info = res.data || {} + this.collapseList[0].info = this.info?.residentsRecord + this.collapseList[1].info = this.info + this.collapseList[2].info = this.info + }) + }, + onBack() { + this.$router.back() + }, + // 折叠面板切换 + collapseChange(val) { + // console.log(val, this.activeCollapse) + if (val && val.length <= 2) { + this.activeCollapse = val.slice(val.length - 1) + } else { + if (this.activeCollapse.length > val.length) { + this.activeCollapse = val + } + if (this.activeCollapse.length < val.length) { + this.activeCollapse = val.slice(val.length - 1) + } + } + if (val && val.length === this.collapseList.length) { + this.collapseAll = true + } else { + this.collapseAll = false + } + }, + // 全部展开、收起 + toggleAll() { + if (this.collapseAll) { + this.activeCollapse = [] + } else { + this.activeCollapse = this.collapseList.map(e => e.name) + } + this.collapseAll = !this.collapseAll + } + } +} +</script> + +<style lang="less" scoped> +@import url('../../../utils/common.less'); + +.base-info { + background: linear-gradient(to bottom, #F0F6FF , #fff 50%); + color: #8c8c8c; + .name { + font-weight: 600; + color: #000; + font-size: 18px; + } +} + +.cont-box { + background-color: #f9f9f9; + .cont-inner { + background: linear-gradient(to bottom, #F0F6FF , #fff .6rem); + border-top-left-radius: .08rem; + border-top-right-radius: .08rem; + } +} + +.collapse-head { + .icon-down { + vertical-align: middle; + font-size: .12rem; + .svg-icon { + transition: all .2s; + } + } + .icon-down-expanded { + .svg-icon { + transform: rotate(-180deg); + } + } +} + + +table { + text-align: left; + // border-bottom: 1px solid var(--van-cell-border-color); + >tr { + >td { + padding-left: 14px; + padding-bottom: 12px; + &:first-child { + text-align: right; + padding-left: 0; + } + } + } +} +.list { + color: #262626; + .label { + min-width: 5em; + } +} + +.lh-22 { + line-height: 22px; +} +.color-26 { + color: #262626; +} +</style> diff --git a/src/doctor/screening/detail/GeneralFUDetail.vue b/src/doctor/screening/highVisit/detail/GeneralFUDetail.vue similarity index 100% rename from src/doctor/screening/detail/GeneralFUDetail.vue rename to src/doctor/screening/highVisit/detail/GeneralFUDetail.vue diff --git a/src/doctor/screening/highVisit/detail/SecondDetail.vue b/src/doctor/screening/highVisit/detail/SecondDetail.vue new file mode 100644 index 0000000000000000000000000000000000000000..b51171b2170ab89fd99ef53d01037e077a5de011 --- /dev/null +++ b/src/doctor/screening/highVisit/detail/SecondDetail.vue @@ -0,0 +1,1032 @@ +<template> + <div class='flex flex-col' style='height: 100vh'> + <div class='p-3 text-black text-center shrink-0 doc-nav-bar'> + <span @click='onBack' class='text-12 back-bt'> + <doc-icon type='doc-left2' /> + </span> + <span>专病随访详情</span> + </div> + <div class='px-4 py-3 flex shrink-0 base-info'> + <div class='flex w-full'> + <div class='grow flex flex-col justify-between'> + <div class='flex justify-between'> + <span class='name'>{{ residentInfo.residentName }}</span> + + </div> + <div class='top-label mt-3'> + <span>报告日期:<span class='color-b'>{{ info.screenDate || '-' }}</span></span> + </div> + <div class='top-label'> + <span>慢病高危评估结果:</span> + </div> + <div class='top-label color-b'> + <span v-if='info.specialScreenResult && info.specialScreenResult !=9'>您存在<span + class='color-red'>{{ info.specialScreenResultName }}</span>风险,请及时前往医院诊断确认。</span> + <span v-if='info.specialScreenResult ==9'>您并未存在高危风险。</span> + </div> + <div v-if='info.specialScreenResult && info.specialScreenResult !=9' + class='flex items-center flex-wrap gap-x-2.5 gap-y-1 mt-2'> + <div v-for='(item, index) in highRiskList' :key='index' class='tag tag-red' + @click='toShowHighRisk(item)'> + <span>{{ item.name }}:</span><span class='color-red'>{{ item.num || 0 }}项</span> + </div> + </div> + </div> + </div> + <van-popup v-model:show='showRiskHighItem' position='bottom'> + <div class='p-4' style='height: 100%'> + <div class='flex justify-between items-center mb-4 pop-title'> + <div></div> + <div>存在以下风险元素</div> + <div @click='showRiskHighItem = false' style='font-weight: 400'>取消</div> + </div> +<!-- <div class=''></div>--> + <div style='height: 80%;overflow: auto'> + <div class='pt-3 pb-3 bg-white h-full'> + <div v-for='(item, index) in riskHighItemList' :key='item.id'> + <div class='detail-content flex'> + + <div>{{index+1}}、</div> + <div>{{item.name}}</div> + </div> + </div> + </div> + </div> + </div> + </van-popup> + + </div> + <div class='p-3 grow cont-box'> + <div class='p-3 h-full cont-inner'> + <div class='flex justify-between collapse-head mt-2'> + <span class='text-16 font-semibold'>全部内容</span> + <span @click='toggleAll'> + <span v-if='!collapseAll'>展开全部</span> + <span v-else>展开收起</span> + <span :class="['ml-2 icon-down', { 'icon-down-expanded': collapseAll }]"> + <doc-icon type='doc-down' /> + </span> + </span> + </div> + + <van-collapse :model-value='activeCollapse' ref='collapse' class='doc-collapse' + @change='collapseChange'> + <van-collapse-item key='1' title='居民信息' name='1'> + <template #right-icon> + <doc-icon type='doc-down' /> + </template> + <div class='list'> + <div v-for='item in columnsBase' :key='item.key'> + <div class='flex justify-between py-1 border-bottom item'> + <span class='shrink-0 mr-2 label'>{{ item.title }}</span> + <span + v-if="item.key === 'idCard'">{{ $idCardHide(residentInfo.idCard) || '-' + }}</span> + <span class='text-end' v-else> + <span>{{ residentInfo[item.key] || '-' }}</span> + <span v-if='item.unit' class='ml-1'>{{ item.unit }}</span> + </span> + </div> + </div> + </div> + </van-collapse-item> + <van-collapse-item key='2' title='随访病种' name='2'> + <template #right-icon> + <doc-icon type='doc-down' /> + </template> + <div class='list'> + <div class='flex justify-between py-1 border-bottom item'> + <span class='shrink-0 mr-2 label'>随访病种</span> + <span class='text-end'> + <span>{{ info.diseaseArraysName || '-' }}</span> + </span> + </div> + </div> + </van-collapse-item> + + <van-collapse-item key='3' title='病史' name='3' v-if='medicalHistoryShow'> + <template #right-icon> + <doc-icon type='doc-down' /> + </template> + <div class='list'> + <div class='flex justify-between py-1 border-bottom item'> + <span class='shrink-0 mr-2 label'>病史</span> + <span class='text-end'> + <span>{{ info.medicalHistoryName || '-' }}</span> + </span> + </div> + </div> + </van-collapse-item> + <van-collapse-item key='4' title='家族史' name='4' v-if='familyHistoryShow'> + <template #right-icon> + <doc-icon type='doc-down' /> + </template> + <div class='list'> + <div class='flex justify-between py-1 border-bottom item'> + <span class='shrink-0 mr-2 label'>家族史</span> + <span class='text-end'> + <span>{{ info.familyHistoryName || '-' }}</span> + </span> + </div> + <div> + <div class='flex items-center' v-for='item in info.diseaseRelativeList'> + <template v-if='item.relativeAgeList.filter(e => e.age).length'> + <div class='mt-2'>{{ item.diseaseTypeName }}:</div> + <div class='mt-2'> + <span v-for='item1 in item.relativeAgeList'> + <span v-if='item1.age'>{{ item1.relativeTypeName }}:</span> + <span v-if='item1.age'>{{ item1.age || '-' }} 岁;</span> + </span> + </div> + </template> + </div> + </div> + </div> + </van-collapse-item> + <van-collapse-item key='5' title='身高' name='5' v-if='highShow'> + <template #right-icon> + <doc-icon type='doc-down' /> + </template> + <div class='list'> + <div class='flex justify-between py-1 border-bottom item'> + <span class='shrink-0 mr-2 label'>身高</span> + <span class='text-end'> + <span>{{ info.height || '-' }} cm</span> + </span> + </div> + </div> + </van-collapse-item> + <van-collapse-item key='6' title='体重' name='6' v-if='highShow'> + <template #right-icon> + <doc-icon type='doc-down' /> + </template> + <div class='list'> + <div class='flex justify-between py-1 border-bottom item'> + <span class='shrink-0 mr-2 label'>体重</span> + <span class='text-end'> + <span>{{ info.weight || '-' }} kg</span> + </span> + </div> + </div> + </van-collapse-item> + <van-collapse-item key='7' title='BMI(体质指数)' name='7' v-if='highShow'> + <template #right-icon> + <doc-icon type='doc-down' /> + </template> + <div class='list'> + <div class='flex justify-between py-1 border-bottom item'> + <span class='shrink-0 mr-2 label'>BMI(体质指数)</span> + <span class='text-end'> + <span>{{ info.bmi || '-' }} kg/m²</span> + </span> + </div> + </div> + </van-collapse-item> + <van-collapse-item key='8' title='腰围' name='8' v-if='waistShow'> + <template #right-icon> + <doc-icon type='doc-down' /> + </template> + <div class='list'> + <div class='flex justify-between py-1 border-bottom item'> + <span class='shrink-0 mr-2 label'>腰围</span> + <span class='text-end'> + <span>{{ info.waistline || '-' }} cm</span> + </span> + </div> + </div> + </van-collapse-item> + <van-collapse-item key='9' title='锻炼频率' name='9' v-if='exerciseShow'> + <template #right-icon> + <doc-icon type='doc-down' /> + </template> + <div class='list'> + <div class='flex justify-between py-1 border-bottom item'> + <span class='shrink-0 mr-2 label'>锻炼频率</span> + <span class='text-end'> + <span>{{ info.exerciseFrequencyName || '-' }}</span> + <span + v-if='info.exerciseFrequency == 2 && info.isExerciseFiveName'>({{ info.isExerciseFiveName }})</span> + </span> + </div> + <div class='flex justify-between py-1 border-bottom item' + v-if='[1,2,3].includes(info.exerciseFrequency) && exerciseShow'> + <span class='shrink-0 mr-2 label'>每次锻炼时间</span> + <span class='text-end'> + <span>{{ info.everyExercise || '-' }} 分钟</span> + </span> + </div> + <div class='flex justify-between py-1 border-bottom item' + v-if='[1,2,3].includes(info.exerciseFrequency) && exerciseShow'> + <span class='shrink-0 mr-2 label'>可达到中等及以上运动强度</span> + <span class='text-end'> + <span>{{ info.mediumStrengthName }}</span> + </span> + </div> + </div> + </van-collapse-item> + <van-collapse-item key='10' title='女性病史' name='10' v-if='womanMHShow'> + <template #right-icon> + <doc-icon type='doc-down' /> + </template> + <div class='list'> + <div class='flex justify-between py-1 border-bottom item'> + <span class='shrink-0 mr-2 label'>女性病史</span> + <span class='text-end'> + <span>{{ info.femaleMedicalHistoryName || '-' }}</span> + </span> + </div> + </div> + </van-collapse-item> + <van-collapse-item key='11' title='用药史' name='11' v-if='medicationHShow'> + <template #right-icon> + <doc-icon type='doc-down' /> + </template> + <div class='list'> + <div class='flex justify-between py-1 border-bottom item'> + <span class='shrink-0 mr-2 label'>用药史</span> + <span class='text-end'> + <span>{{ info.medicineHistoryName || '-' }}</span> + </span> + </div> + </div> + </van-collapse-item> + <van-collapse-item key='12' title='高密度脂蛋白胆固醇' name='12' v-if='triglycerideShow'> + <template #right-icon> + <doc-icon type='doc-down' /> + </template> + <div class='list'> + <div class='flex justify-between py-1 border-bottom item'> + <span class='shrink-0 mr-2 label'>高密度脂蛋白胆固醇</span> + <span class='text-end'> + <span>{{ info.hdlCholesterin || '-' }} mmol/L</span> + </span> + </div> + </div> + </van-collapse-item> + <van-collapse-item key='13' title='甘油三酯' name='13' v-if='triglycerideShow'> + <template #right-icon> + <doc-icon type='doc-down' /> + </template> + <div class='list'> + <div class='flex justify-between py-1 border-bottom item'> + <span class='shrink-0 mr-2 label'>甘油三酯</span> + <span class='text-end'> + <span>{{ info.triglyceride || '-' }} mmol/L</span> + </span> + </div> + </div> + </van-collapse-item> + <van-collapse-item key='14' title='总胆固醇' name='14' v-if='triglycerideShow'> + <template #right-icon> + <doc-icon type='doc-down' /> + </template> + <div class='list'> + <div class='flex justify-between py-1 border-bottom item'> + <span class='shrink-0 mr-2 label'>总胆固醇</span> + <span class='text-end'> + <span>{{ info.serumCholesterin || '-' }} mmol/L</span> + </span> + </div> + </div> + </van-collapse-item> + <van-collapse-item key='15' title='有害物质接触或婴幼儿时期病史' name='15' v-if='babyMHShow'> + <template #right-icon> + <doc-icon type='doc-down' /> + </template> + <div class='list'> + <div class='flex justify-between py-1 border-bottom item'> + <span> + <span>{{ info.touchHarmfulName || '-' }}</span> + </span> + </div> + </div> + </van-collapse-item> + <van-collapse-item key='16' title='血压(左侧右侧)值(SBP/DBP)' name='16' v-if='bloodPressureShow'> + <template #right-icon> + <doc-icon type='doc-down' /> + </template> + <div class='list'> + <div class='flex justify-between py-1 border-bottom item'> + <div> + <div>第一次:{{ info.pressureOneSbp }}-{{ info.pressureOneDbp }} mmHg;</div> + <div class='mt-2'>第二次:{{ info.pressureTwoSbp }}-{{ info.pressureTwoDbp }} mmHg</div> + </div> + + </div> + </div> + </van-collapse-item> + <van-collapse-item key='17' title='饮食习惯' name='17' v-if='eatHabitShow'> + <template #right-icon> + <doc-icon type='doc-down' /> + </template> + <div class='list'> + <div class='flex justify-between py-1 border-bottom item'> + <span class='shrink-0 mr-2 label'>饮食习惯</span> + <span class='text-end'> + <span>{{ info.dietaryHabitName || '-' }}</span> + </span> + </div> + </div> + </van-collapse-item> + <van-collapse-item key='18' title='饮酒情况' name='18' v-if='drinkShow'> + <template #right-icon> + <doc-icon type='doc-down' /> + </template> + <div class='list'> + <div class='flex justify-between py-1 border-bottom item'> + <span class='shrink-0 mr-2 label'>饮酒频率</span> + <span class='text-end'> + <span>{{ info.drinkFrequencyName || '-' }}</span> + </span> + </div> + <div v-if='[2,3,4].includes(info.drinkFrequency)'> + <div class='flex justify-between py-1 border-bottom item'> + <span class='shrink-0 mr-2 label'>饮酒种类</span> + <span class='text-end'> + <span>{{ $addrJoin(info.drinkKindName, info.drinkKindOther) || '-' }}</span> + </span> + </div> + <div class='flex justify-between py-1 border-bottom item'> + <div class='shrink-0 mr-2 label'>日饮酒量</div> + <div class='text-end'> + <div v-for='item in (info.drinkKindCapacityList || [])' :key='item.drinkKind' + > + <span>{{ item.drinkKindName }}:</span> <span>{{ item.drinkCapacity || '-' }} mL</span> + </div> + <div> + <span>平均: </span><span>{{ info.dayDrink || '-' }} mL</span> + </div> + </div> + </div> + + <div class='flex justify-between py-1 border-bottom item'> + <span class='shrink-0 mr-2 label'>开始饮酒年龄</span> + <span class='text-end'> + <span>{{ info.startDrinkAge || '-' }} 岁</span> + </span> + </div> + <div class='flex justify-between py-1 border-bottom item'> + <span class='shrink-0 mr-2 label'>是否戒酒</span> + <span class='text-end'> + <span>{{ info.giveDrinkName || '-' }}</span> + </span> + </div> + <div class='flex justify-between py-1 border-bottom item' v-if='info.giveDrink == 1'> + <span class='shrink-0 mr-2 label'>戒酒年龄</span> + <span class='text-end'> + <span>{{ info.giveDrinkStart || '-' }} 岁</span> + </span> + </div> + </div> + </div> + </van-collapse-item> + <van-collapse-item key='19' title='吸烟情况' name='19' v-if='smokeShow'> + <template #right-icon> + <doc-icon type='doc-down' /> + </template> + <div class='list'> + <div class='flex justify-between py-1 border-bottom item'> + <span class='shrink-0 mr-2 label'>吸烟情况</span> + <span class='text-end'> + <span>{{ info.isSmokingName || '-' }}</span> + </span> + </div> + <div class='flex justify-between py-1 border-bottom item' + v-if='info.isSmoking == 3 && smokeShow'> + <span class='shrink-0 mr-2 label'>日吸烟量</span> + <span class='text-end'> + <span>{{ info.daySmoking || '-' }} 支</span> + </span> + </div> + <div class='flex justify-between py-1 border-bottom item' + v-if='info.isSmoking == 3 && smokeShow'> + <span class='shrink-0 mr-2 label'>开始吸烟年龄</span> + <span class='text-end'> + <span>{{ info.startSmoking || '-' }} 岁</span> + </span> + </div> + <div class='flex justify-between py-1 border-bottom item' + v-if='info.isSmoking == 2 && smokeShow'> + <span class='shrink-0 mr-2 label'>戒烟年龄</span> + <span class='text-end'> + <span>{{ info.giveSmokingAge || '-' }} 岁</span> + </span> + </div> + <div class='flex justify-between py-1 border-bottom item' + v-if='smokeShow && info?.diseaseArrays?.includes(1)'> + <span class='shrink-0 mr-2 label'>经常吸入二手烟</span> + <span class='text-end'> + <span>{{ info.secondSmokingName || '-' }} </span> + </span> + </div> + </div> + </van-collapse-item> + <van-collapse-item key='20' title='黑棘皮病' name='20' v-if='blackSpinySkinShow'> + <template #right-icon> + <doc-icon type='doc-down' /> + </template> + <div class='list'> + <div class='flex justify-between py-1 border-bottom item'> + <span class='shrink-0 mr-2 label'>黑棘皮病</span> + <span class='text-end'> + <span>{{ info.blackSpinySkinName || '-' }}</span> + </span> + </div> + </div> + </van-collapse-item> + <van-collapse-item key='21' title='长期精神紧张' name='21' v-if='mentalTensionShow'> + <template #right-icon> + <doc-icon type='doc-down' /> + </template> + <div class='list'> + <div class='flex justify-between py-1 border-bottom item'> + <span class='shrink-0 mr-2 label'>长期精神紧张</span> + <span class='text-end'> + <span>{{ info.mentalTensionName || '-' }}</span> + </span> + </div> + </div> + </van-collapse-item> + <van-collapse-item key='22' title='皮肤或肌腱黄色瘤' name='22' v-if='xanthomaShow'> + <template #right-icon> + <doc-icon type='doc-down' /> + </template> + <div class='list'> + <div class='flex justify-between py-1 border-bottom item'> + <span class='shrink-0 mr-2 label'>皮肤或肌腱黄色瘤</span> + <span class='text-end'> + <span>{{ info.xanthomaName || '-' }}</span> + </span> + </div> + </div> + </van-collapse-item> + <van-collapse-item key='23' title='跟腱增厚' name='23' v-if='tendoIncrassationShow'> + <template #right-icon> + <doc-icon type='doc-down' /> + </template> + <div class='list'> + <div class='flex justify-between py-1 border-bottom item'> + <span class='shrink-0 mr-2 label'>跟腱增厚</span> + <span class='text-end'> + <span>{{ info.tendoIncrassationName || '-' }}</span> + </span> + </div> + </div> + </van-collapse-item> + <van-collapse-item key='24' title='中国糖尿病风险评分' name='24' v-if='riskScoreShow'> + <template #right-icon> + <doc-icon type='doc-down' /> + </template> + <div class='list'> + <div class='flex justify-between py-1 border-bottom item'> + <span class='shrink-0 mr-2 label'>中国糖尿病风险评分</span> + <span class='text-end'> + <span>{{ info.riskScoreName || '-' }}</span> + </span> + </div> + </div> + </van-collapse-item> + <van-collapse-item key='25' title='知情同意书' name='25'> + <template #right-icon> + <doc-icon type='doc-down' /> + </template> + <div> + <image-preview :img-list='info.informedConsentUrl'></image-preview> + </div> + </van-collapse-item> + + <van-collapse-item key='26' title='随访机构' name='26'> + <template #right-icon> + <doc-icon type='doc-down' /> + </template> + <div class='list'> + <div v-for='item in columnsOrg' :key='item.key'> + <div class='flex justify-between py-1 border-bottom item'> + <span class='shrink-0 mr-2 label'>{{ item.title }}</span> + <span class='text-end'> + <span>{{ info[item.key] || '-' }}</span> + </span> + </div> + </div> + </div> + </van-collapse-item> + </van-collapse> + </div> + </div> + </div> +</template> + +<script> +import { showNotify } from 'vant' +import { useStore } from '@/doctor/store' +import { fetchDataHandle } from '@/utils/common' +import ImagePreview from '@/doctor/components/imagePreview/imagePreview' +import { getHighSpecificVisitId } from '@/api/doctor/highVisitApi' + +export default { + components: { ImagePreview }, + data() { + return { + store: useStore(), + activeCollapse: [], + collapseList: [ + { title: '居民信息', name: '1' }, + { title: '随访病种', name: '2' }, + { title: '病史', name: '3' }, + { title: '家族史', name: '4' }, + { title: '身高', name: '5' }, + { title: '体重', name: '6' }, + { title: 'BMI', name: '7' }, + { title: '腰围', name: '8' }, + { title: '锻炼频率', name: '9' }, + { title: '女性病史', name: '10' }, + { title: '用药史', name: '11' }, + { title: '高密度脂蛋白胆固醇', name: '12' }, + { title: '甘油三酯', name: '13' }, + { title: '总胆固醇', name: '14' }, + { title: '有害物质接触或婴幼儿时期病史', name: '15' }, + { title: '现测血压(左侧右侧)值(SBP/DBP)', name: '16' }, + { title: '饮食习惯', name: '17' }, + { title: '饮酒情况', name: '18' }, + { title: '吸烟情况', name: '19' }, + { title: '黑棘皮病', name: '20' }, + { title: '长期精神紧张', name: '21' }, + { title: '皮肤或肌腱黄色瘤', name: '22' }, + { title: '跟腱增厚', name: '23' }, + { title: '中国糖尿病风险评分', name: '24' }, + { title: '知情同意书', name: '25' }, + { title: '随访机构', name: '26' } + ], + // 全部展开、收起 + collapseAll: false, + showRiskHighItem: false, + riskHighItemList: [], + info: {}, + columnsBase: [ + { title: '姓名', key: 'residentName' }, + { title: '证件号码', key: 'idCard' }, + { title: '性别', key: 'genderName' }, + { title: '出生日期', key: 'dataBirth' }, + { title: '年龄', key: 'currentAge' }, + { title: '民族', key: 'nationalName' }, + { title: '本人电话', key: 'telephone' }, + { title: '现住址', key: 'presentCodeName' }, + { title: '详细地址', key: 'nowAddress' }, + { title: '户籍地址', key: 'registeredCodeName' }, + { title: '详细地址', key: 'permanentAddress' } + ], + columnsOrg: [ + { title: '随访单位', key: 'visitUnitName' }, + { title: '随访科室', key: 'visitOfficeName' }, + { title: '随访医生', key: 'visitDoctorName' } + ], + highRiskList: [] + } + }, + computed: { + id() { + return this.$route.query.id + }, + residentInfo() { + return this.info.residentsRecord || {} + }, + //判断病史显示隐藏 + medicalHistoryShow() { + let res = false + const { diseaseArrays = [] } = this.info + if (diseaseArrays.includes(1) || diseaseArrays.includes(2) || diseaseArrays.includes(3) || diseaseArrays.includes(4) + || diseaseArrays.includes(5) || diseaseArrays.includes(6) || diseaseArrays.includes(7)) { + res = true + } + return res + }, + //判断家族史显示隐藏 + familyHistoryShow() { + let res = false + const { diseaseArrays = [] } = this.info + if (diseaseArrays.includes(1) || diseaseArrays.includes(2) || diseaseArrays.includes(3) || diseaseArrays.includes(4) + || diseaseArrays.includes(5) || diseaseArrays.includes(6) || diseaseArrays.includes(7)) { + res = true + } + return res + }, + //判断身高、体重、BMI显示隐藏 + highShow() { + let res = false + const { diseaseArrays = [] } = this.info + if (diseaseArrays.includes(1) || diseaseArrays.includes(2) || diseaseArrays.includes(4) + || diseaseArrays.includes(6) || diseaseArrays.includes(7)) { + res = true + } + return res + }, + //判断腰围显示隐藏 + waistShow() { + let res = false + const { diseaseArrays = [] } = this.info + if (diseaseArrays.includes(1) || diseaseArrays.includes(2)) { + res = true + } + return res + }, + //判断锻炼频率显示隐藏 + exerciseShow() { + let res = false + const { diseaseArrays = [] } = this.info + if (diseaseArrays.includes(1) || diseaseArrays.includes(2) || diseaseArrays.includes(4)) { + res = true + } + return res + }, + //判断女性病史显示隐藏 + womanMHShow() { + let res = false + const { diseaseArrays = [] } = this.info + if (diseaseArrays.includes(2)) { + res = true + } + return res + }, + //判断用药史显示隐藏 + medicationHShow() { + let res = false + const { diseaseArrays = [] } = this.info + if (diseaseArrays.includes(2) || diseaseArrays.includes(4) || diseaseArrays.includes(6)) { + res = true + } + return res + }, + //判断高密度脂蛋白胆固醇、甘油三酯、总胆固醇显示隐藏 + triglycerideShow() { + let res = false + const { diseaseArrays = [] } = this.info + if (diseaseArrays.includes(2)) { + res = true + } + return res + }, + //判断有害物质接触或婴幼儿时期病史显示隐藏 + babyMHShow() { + let res = false + const { diseaseArrays = [] } = this.info + if (diseaseArrays.includes(5)) { + res = true + } + return res + }, + //判断血压显示隐藏 + bloodPressureShow() { + let res = false + const { diseaseArrays = [] } = this.info + if (diseaseArrays.includes(1)) { + res = true + } + return res + }, + //判断饮食习惯显示隐藏 + eatHabitShow() { + let res = false + const { diseaseArrays = [] } = this.info + if (diseaseArrays.includes(1)) { + res = true + } + return res + }, + //判断饮酒情况显示隐藏 + drinkShow() { + let res = false + const { diseaseArrays = [] } = this.info + if (diseaseArrays.includes(1)) { + res = true + } + return res + }, + //判断吸烟情况显示隐藏 + smokeShow() { + let res = false + const { diseaseArrays = [] } = this.info + if (diseaseArrays.includes(1) || diseaseArrays.includes(3) || diseaseArrays.includes(4) || diseaseArrays.includes(5) || diseaseArrays.includes(7)) { + res = true + } + return res + }, + //判断黑棘皮病显示隐藏 + blackSpinySkinShow() { + let res = false + const { diseaseArrays = [] } = this.info + if (diseaseArrays.includes(2)) { + res = true + } + return res + }, + //判断长期精神紧张显示隐藏 + mentalTensionShow() { + let res = false + const { diseaseArrays = [] } = this.info + if (diseaseArrays.includes(1)) { + res = true + } + return res + }, + //判断皮肤或肌腱黄色瘤显示隐藏 + xanthomaShow() { + let res = false + const { diseaseArrays = [] } = this.info + if (diseaseArrays.includes(7)) { + res = true + } + return res + }, + //判断跟腱增厚显示隐藏 + tendoIncrassationShow() { + let res = false + const { diseaseArrays = [] } = this.info + if (diseaseArrays.includes(7)) { + res = true + } + return res + }, + //判断中国糖尿病风险评分显示隐藏 + riskScoreShow() { + let res = false + const { diseaseArrays = [] } = this.info + if (diseaseArrays.includes(2)) { + res = true + } + return res + } + }, + created() { + document.title = '随访详情' + if (!this.id) { + showNotify({ type: 'warning', message: '未获取到查询信息' }) + return + } + this.init() + }, + methods: { + init() { + getHighSpecificVisitId(this.id).then(res => { + let result = res.data || {} + this.info = result + this.highRiskListHandle(result) + }) + }, + highRiskListHandle(result) { + this.highRiskList = [] + let obj = fetchDataHandle(result, { + diseaseArrays: 'strToArrNum', + hypertensionHighItem: 'strToArrNum', + diabetesHighItem: 'strToArrNum', + coronaryHighItem: 'strToArrNum', + strokeHighItem: 'strToArrNum', + pulmonaryHighItem: 'strToArrNum', + nephrosisHighItem: 'strToArrNum', + dyslipemiaHighItem: 'strToArrNum' + }) + const { + hypertensionHighItem = [], + diabetesHighItem = [], + coronaryHighItem = [], + strokeHighItem = [], + pulmonaryHighItem = [], + nephrosisHighItem = [], + dyslipemiaHighItem = [] + } = obj + let list = [] + let o = { name: '', num: 0 } + if (hypertensionHighItem.length) { + o = { + id: 1, + name: '高血压风险因素', + num: hypertensionHighItem.length, + highItem: hypertensionHighItem, + dict: `CP00141` + } + list.push(o) + } + if (diabetesHighItem.length) { + o = { + id: 2, + name: '糖尿病风险因素', + num: diabetesHighItem.length, + highItem: diabetesHighItem, + dict: `CP00142` + } + list.push(o) + } + if (coronaryHighItem.length) { + o = { + id: 3, + name: '冠心病风险因素', + num: coronaryHighItem.length, + highItem: coronaryHighItem, + dict: `CP00143` + } + list.push(o) + } + if (strokeHighItem.length) { + o = { id: 4, name: '脑卒中风险因素', num: strokeHighItem.length, highItem: strokeHighItem, dict: `CP00144` } + list.push(o) + } + if (pulmonaryHighItem.length) { + o = { + id: 5, + name: '慢阻肺风险因素', + num: pulmonaryHighItem.length, + highItem: pulmonaryHighItem, + dict: `CP00145` + } + list.push(o) + } + if (nephrosisHighItem.length) { + o = { + id: 6, + name: '慢性肾脏病风险因素', + num: nephrosisHighItem.length, + highItem: nephrosisHighItem, + dict: `CP00146` + } + list.push(o) + } + if (dyslipemiaHighItem.length) { + o = { + id: 7, + name: '血脂异常风险因素', + num: dyslipemiaHighItem.length, + highItem: dyslipemiaHighItem, + dict: `CP00147` + } + list.push(o) + } + this.highRiskList = list + }, + onBack() { + this.$router.back() + }, + // 折叠面板切换 + collapseChange(val) { + if (val && val.length <= 2) { + this.activeCollapse = val.slice(val.length - 1) + } else { + if (this.activeCollapse.length > val.length) { + this.activeCollapse = val + } + if (this.activeCollapse.length < val.length) { + this.activeCollapse = val.slice(val.length - 1) + } + } + if (val && val.length === this.collapseList.length) { + this.collapseAll = true + } else { + this.collapseAll = false + } + }, + // 全部展开、收起 + toggleAll() { + if (this.collapseAll) { + this.activeCollapse = [] + } else { + this.activeCollapse = this.collapseList.map(e => e.name) + } + this.collapseAll = !this.collapseAll + }, + toShowHighRisk(val) { + let res = [] + let dictInfo = this.store.getDict(val.dict) + let highItemList = val.highItem || [] + highItemList.forEach(item => { + let infoList = dictInfo.filter(e => e.value == item) + if (infoList && infoList.length) { + res.push(infoList[0]) + } + }) + this.riskHighItemList = res + this.showRiskHighItem = true + } + } +} +</script> + +<style lang='less' scoped> +@import url('../../../utils/common.less'); + +.base-info { + background: linear-gradient(to bottom, #F0F6FF, #fff 50%); + color: #8c8c8c; + + .name { + font-weight: 600; + color: #000; + font-size: 18px; + } + + .top-label { + font-size: 13px; + line-height: 22px; + } + + .color-b { + color: #262626; + } + + .color-red { + color: #F5222D; + } + + .tag { + border-radius: 2px; + padding: 3px 8px; + font-size: 12px; + line-height: 18px; + } + + .tag-red { + border: 1px solid #EFF2F7; + color: #262626; + background-color: #EFF2F7; + } +} + +.cont-box { + background-color: #f9f9f9; + + .cont-inner { + background: linear-gradient(to bottom, #F0F6FF, #fff .6rem); + border-top-left-radius: .08rem; + border-top-right-radius: .08rem; + } +} + +.collapse-head { + .icon-down { + vertical-align: middle; + font-size: .12rem; + + .svg-icon { + transition: all .2s; + } + } + + .icon-down-expanded { + .svg-icon { + transform: rotate(-180deg); + } + } +} + + +table { + text-align: left; + // border-bottom: 1px solid var(--van-cell-border-color); + > tr { + > td { + padding-left: 14px; + padding-bottom: 12px; + + &:first-child { + text-align: right; + padding-left: 0; + } + } + } +} + +.list { + color: #262626; + + .label { + min-width: 5em; + } +} + +.gap-y-1 { + row-gap: 4px; +} + +.pop-title { + color: #262626; + font-size: 16px; + line-height: 24px; + font-weight: bold; +} + +.de-driver { + border: 1px solid #D7D8DA; +} + +.bg-white { + background: #FFFFFF; + padding: 12px 16px; + border-radius: 8px; +} +.detail-content { + color: #F5222D; + font-size: 16px; + line-height: 1.5; +} +:deep(.van-popup) { + height: 50% !important; + background: #F5F5F5; +} +</style> diff --git a/src/doctor/screening/highVisit/first/DoctorInfo.vue b/src/doctor/screening/highVisit/first/DoctorInfo.vue new file mode 100644 index 0000000000000000000000000000000000000000..1d148a0f0b65e1b19c9d2c09c0810790d0e29070 --- /dev/null +++ b/src/doctor/screening/highVisit/first/DoctorInfo.vue @@ -0,0 +1,164 @@ +<template> + <div class="doctor-info"> + <div class="doc-form-label" required>随访单位</div> + <van-field is-link + v-model='form.visitUnitName' + readonly + placeholder='请选择' + name="visitUnitId" + @click="showUnit = true" + :rules="[{ required: true, message: '请选择' }]" + /> + <DocUnit v-model:show="showUnit" + v-model:value="form.visitUnitId" + :valueName="form?.visitUnitName" + @change="unitChange" + /> + + <div class="doc-form-label" required>随访科室</div> + <van-field is-link + v-model='form.visitOfficeName' + readonly + placeholder='请选择' + name="visitOfficeId" + @click="showOffice = true" + :rules="[{ required: true, message: '请选择' }]" + /> + <DocOffice v-model:show="showOffice" + v-model:value="form.visitOfficeId" + :unitId="form.visitUnitId" + @change="officeChange" + /> + + <div class="doc-form-label" required>随访医生</div> + <van-field is-link + v-model='form.visitDoctorName' + readonly + placeholder='请选择' + name="visitDoctorId" + @click="showDoctor = true" + :rules="[{ required: true, message: '请选择' }]" + /> + <DocOfficeDoctor v-model:show="showDoctor" + :allowClear="false" + v-model:value="form.visitDoctorId" + :unitId="form.visitUnitId" + :officeId="form.visitOfficeId" + @change="(option) => { form.visitDoctorName = option.staffName }" + /> + </div> +</template> + +<script> +import { useStore } from '@/doctor/store' +import dayjs from 'dayjs' +import DocUnit from '@/doctor/components/docUnit/DocUnit.vue' +import DocOffice from '@/doctor/components/docOffice/DocOffice.vue' +import DocOfficeDoctor from '@/doctor/components/docOfficeDoctor/DocOfficeDoctor.vue' + +const defaultForm = (info = {}) => { + const form = { + createDate: undefined, + // 随访单位 + visitUnitId: undefined, + visitUnitName: undefined, + // 随访科室 + visitOfficeId: undefined, + visitOfficeName: undefined, + // 随访医生 + visitDoctorId: undefined, + visitDoctorName: undefined, + // 录入单位 + createUnitId: undefined, + createUnitName: undefined, + // 录入科室 + createOfficeId: undefined, + createOfficeName: undefined, + // 录入医生 + createDoctorId: undefined, + createDoctorName: undefined + } + Reflect.ownKeys(form).forEach(key => { + if (info[key] != undefined) { + form[key] = info[key] + } + }) + return form +} +export default { + components: { + DocUnit, + DocOffice, + DocOfficeDoctor + }, + props: { + info: { default: () => ({}) } + }, + data() { + return { + form: {}, + store: useStore(), + showUnit: false, + showOffice: false, + showDoctor: false + } + }, + computed: { + authInfo() { + return this.store.authInfo + } + }, + methods: { + initForm() { + this.form.createDate = dayjs().format('YYYY-MM-DD') + // 随访单位 + this.form.visitUnitId = this.authInfo.unitId + this.form.visitUnitName = this.authInfo.unitName + // 随访科室 + this.form.visitOfficeId = this.authInfo.officeId + this.form.visitOfficeName = this.authInfo.officeName + // 随访医生 + this.form.visitDoctorId = this.authInfo.relationId + this.form.visitDoctorName = this.authInfo.nickName + // 录入单位 + this.form.createUnitId = this.authInfo.unitId + this.form.createUnitName = this.authInfo.unitName + // 录入科室 + this.form.createOfficeId = this.authInfo.officeId + this.form.createOfficeName = this.authInfo.officeName + // 录入医生 + this.form.createDoctorId = this.authInfo.relationId + this.form.createDoctorName = this.authInfo.nickName + }, + unitChange(option = {}) { + this.form.visitUnitName = option.unitName + this.form.visitDoctorId = undefined + this.form.visitDoctorName = undefined + this.form.visitOfficeId = undefined + this.form.visitOfficeName = undefined + }, + + officeChange(option = {}) { + this.form.visitOfficeName = option.officeName + this.form.visitDoctorId = undefined + this.form.visitDoctorName = undefined + }, + submit() { + return this.form + } + }, + watch: { + info: { + handler(info) { + this.form = defaultForm(info) + if (!this.info.id) { + this.initForm() + } + }, + immediate: true + } + } +} +</script> + +<style lang="less" scoped></style> diff --git a/src/doctor/screening/highVisit/first/FirstForm.vue b/src/doctor/screening/highVisit/first/FirstForm.vue new file mode 100644 index 0000000000000000000000000000000000000000..93e68ffb4da36cf9cd780c5f4b0ae180a561ae0e --- /dev/null +++ b/src/doctor/screening/highVisit/first/FirstForm.vue @@ -0,0 +1,153 @@ +<template> + <div class="h-full flex flex-col screening-first"> + <DocNavBar :title="`${id ? '修改' : '新增'}主要慢病高危随访`" class="shrink-0" + :backFunc="onBack" :hideBack="step == 3"></DocNavBar> + <div class="p-4 overflow-y-auto grow" ref="all"> + <archiveCommon :info="baseInfo" v-if="step == 1" ref="archiveCommon"></archiveCommon> + <FormCont :resident-info="baseInfo" :info="screenInfo" v-else-if="step == 2" ref="FormCont"/> + <Result v-else-if="step == 3" :info="resultInfo"/> + </div> + <div class="shrink-0" v-if="step !== 3"> + <div class='bottom-small-line'></div> + <div class='px-5 py-2 grow flex justify-between'> + <template v-if='step == 1'> + <van-button type='primary' block round + @click='toNext(2)'>下一步</van-button> + </template> + <template v-else> + <van-button type='primary' block round + @click='toNext(3)'>提交</van-button> + </template> + </div> + </div> + </div> +</template> + +<script> +import DocNavBar from '@/doctor/components/docNavBar/DocNavBar.vue' +import archiveCommon from '@/doctor/components/archiveCommon/archiveCommon.vue' +import FormCont from './FormCont.vue' +import Result from './Result.vue' +import { getChronicResidentsId } from '@/api/doctor/generalFU' +import { fetchDataHandle } from '@/utils/common.js' +import { useStore } from '@/doctor/store' +import { getHighMajorVisitId, saveHighMajorVisit, updateHighMajorVisit } from '@/api/doctor/highVisitApi' + +export default { + components: { + DocNavBar, + archiveCommon, + FormCont, + Result + }, + data() { + return { + store: useStore(), + step: 1, + // 患者基础信息 + baseInfo: {}, + // 随访信息 + screenInfo: {}, + // 结果 + resultInfo: {} + } + }, + computed: { + id() { + return this.$route.query.id + }, + residentInfoId() { + return this.$route.query.residentInfoId + }, + idCard() { + return this.$route.query.idCard + }, + }, + // 路由守卫 + beforeRouteLeave(to, from) { + // showConfirmDialog({ + // message: '已填写的表单不会保存,确定要离开吗?'}) + // .then(() => { + // next() + // }) + // .catch(() => { + // next(false) + // }) + if (this.step === 2) { + this.onBack() + return false + } + return true + }, + created() { + this.init() + }, + methods: { + async init() { + if (this.id) { + const res = await getHighMajorVisitId(this.id) + const result = res.data || {} + this.screenInfo = fetchDataHandle(result, { + medicalHistory: 'strToArrNum', + familyHistory: 'strToArrNum', + highItem: 'strToArrNum' + }) + this.baseInfo = this.screenInfo.residentsRecord + console.log(this.screenInfo) + } else { + if (this.residentInfoId) { + let res = await getChronicResidentsId(this.residentInfoId) + this.baseInfo = res.data || {} + this.screenInfo.currentAge = this.baseInfo.currentAge + this.screenInfo.residentInfoId = this.residentInfoId + } else if (this.idCard) { + // 新建用户 + this.baseInfo.idCard = this.idCard + } + } + }, + toNext(val) { + if (val == 2) { + // 基础信息 + this.$refs.archiveCommon.onSubmit().then(res => { + this.baseInfo = res + this.step = val + this.$refs.all.scrollTo(0, 0) + }) + } else if (val == 3) { + // 随访信息 + this.$refs.FormCont.submit().then(res => { + if (!res) return + console.log('FormCont.submit', res) + const query = fetchDataHandle(res, { + familyHistory: 'arrToStr', + medicalHistory: 'arrToStr', + highItem: 'arrToStr' + }) + query.residentsRecord = this.baseInfo + const func = query.id ? updateHighMajorVisit : saveHighMajorVisit + func(query).then(res => { + this.resultInfo = query + this.store.onRefreshMark() + this.step = val + }) + }) + } else { + this.step = val + this.$refs.all.scrollTo(0, 0) + } + }, + onBack() { + if (this.step == 1) { + this.$router.back() + } else { + this.step-- + } + } + } +} +</script> + +<style lang="less" scoped> + +</style> diff --git a/src/doctor/screening/highVisit/first/FormCont.vue b/src/doctor/screening/highVisit/first/FormCont.vue new file mode 100644 index 0000000000000000000000000000000000000000..3194cf26ce188f4d9b3b7203d8cb0235b64f5193 --- /dev/null +++ b/src/doctor/screening/highVisit/first/FormCont.vue @@ -0,0 +1,696 @@ +<template> + <div class="screening-first-cont"> + <van-form ref='form' class="doc-form" > + <div class='font-semibold'>筛查信息</div> + <div class='doc-form-label' required>既往史</div> + <van-field is-link + v-model='form.medicalHistoryName' + readonly + placeholder='请选择' + name="medicalHistory" + :rules='rules.medicalHistory' + @click="showMedical = true" + /> + <van-popup v-model:show="showMedical" position="bottom"> + <div class="pt-4 pb-4 popup-checkbox"> + <div class="flex justify-between pb-2"> + <button class="van-picker__cancel van-haptics-feedback" @click="showMedical = false">取消</button> + <span class="text-16" >既往史(可多选)</span> + <button class="van-picker__confirm van-haptics-feedback" @click="medicalConfirm">确认</button> + </div> + <div class="bottom-small-line"></div> + <!-- <van-checkbox-group v-model="form.medicalHistory" class="px-4 pb-4 pt-2"> + <van-checkbox v-for="(item, index) in store.getDict('CP00118')" :key="index" + @click="medicalChange" + :name="item.value" + class="mb-3">{{ item.name }}</van-checkbox> + </van-checkbox-group> --> + <CheckBtn v-model:value="form.medicalHistory" + :options="medicalHistoryArray" + multiple round column-1 + class="py-3 px-4" + @change="medicalChange" /> + </div> + </van-popup> + + <div class="flex tip-box"> + <div class='doc-form-label shrink-0' required>家族史</div> + <span class="grow text-end text-ellipsis">若一级家属(如父母)有家族病史,则请选择</span> + </div> + <van-field is-link + v-model='form.familyHistoryName' + name="familyHistory" + readonly + placeholder='请选择' + :rules='rules.familyHistory' + @click="showFamily = true" + /> + <van-popup v-model:show="showFamily" position="bottom"> + <div class="pt-4 pb-4 popup-checkbox"> + <div class="flex justify-between pb-2"> + <button class="van-picker__cancel van-haptics-feedback" @click="showFamily = false">取消</button> + <span class="text-16" >家族史(可多选)</span> + <button class="van-picker__confirm van-haptics-feedback" @click="familyConfirm">确认</button> + </div> + <div class="bottom-small-line"></div> + <!-- <van-checkbox-group v-model="form.familyHistory" class="p-4"> + <van-checkbox v-for="(item, index) in store.getDict('CP00167').filter(e => e.value != 7)" :key="index" + @click="familyChange" + :name="item.value" + class="mb-3">{{ item.name }}</van-checkbox> + </van-checkbox-group> --> + <CheckBtn v-model:value="form.familyHistory" + :options="familyHistoryArray" + multiple round column-1 + class="py-3 px-4" + @change="familyChange" /> + </div> + </van-popup> + + <div class='doc-form-label'>年龄</div> + <van-field :modelValue="form.currentAge" + name="currentAge" + type="digit" + placeholder="请输入年龄" + readonly + maxlength="10" + > + <template #extra> + <span class="ml-1">岁</span> + </template> + </van-field> + + <div class='doc-form-label' required>身高</div> + <van-field required + v-model="form.height" + name="height" + type="number" + placeholder="输入值10~300,1位小数" + maxlength="10" + :rules="rules.height" + > + <template #extra> + <span class="ml-1">cm</span> + </template> + </van-field> + + <div class='doc-form-label' required>体重</div> + <van-field required + v-model="form.weight" + name="weight" + type="number" + placeholder="输入值20~500,2位小数" + maxlength="10" + :rules="rules.weight" + > + <template #extra> + <span class="ml-1">kg</span> + </template> + </van-field> + + <div class='doc-form-label'>BMI</div> + <van-field v-model="form.bmi" + name="bmi" + type="number" + placeholder="请输入" + maxlength="10" + readonly + > + <template #extra> + <span class="ml-1">kg/m²</span> + </template> + </van-field> + + <div class='doc-form-label'>腰围</div> + <van-field v-model="form.waistline" + name="waistline" + type="number" + placeholder="输入值10~150,1位小数" + maxlength="10" + :rules="rules.waistline" + > + <template #extra> + <span class="ml-1">cm</span> + </template> + </van-field> + + <div class='doc-form-label' required>是否吸烟</div> + <van-field + name="isSmoking" + class="no-back" + style="padding: 0" + :rules="rules.isSmoking"> + <template #input> + <van-radio-group v-model="form.isSmoking" + direction="horizontal" + shape="dot" + class="w-full doc-radio-group"> + <van-radio v-for="item in store.getDict('CP00120')" + :key="item.value" :name="item.value" + label-position="left">{{item.name}}</van-radio> + </van-radio-group> + </template> + </van-field> + + <div class="flex items-center justify-between tip-box"> + <div class='doc-form-label shrink-0' >现测血压(mmHg)</div> + <BloodPressurePanel :pressureObj="pressureObj"/> + </div> + <div class="sub-text my-3" >第一次</div> + <table class="w-full mb-2"> + <tr class="sub-text" > + <td>收缩压(高压)</td> + <td style="width: 1em"></td> + <td>舒张压(低压)</td> + </tr> + <tr> + <td class="flex items-center"> + <van-field v-model="form.pressureOneSbp" + name="pressureOneSbp" + label="" + type="number" + placeholder="60~300,整数" + maxlength="10" + :rules="rules.pressureDbp" + error-message-align="left" + input-align="left" + class="table-field" + /> + </td> + <td class="text-center"> + <span class="divide">/</span> + </td> + <td> + <van-field v-model="form.pressureOneDbp" + name="pressureOneDbp" + label="" + type="number" + placeholder="30~300,整数" + maxlength="10" + :rules="rules.pressureSbp" + error-message-align="left" + input-align="left" + class="table-field" + /> + </td> + </tr> + </table> + <BloodPressureBt :pressureObj="pressureObj" @getValue="setPressureOne">第一次测量</BloodPressureBt> + <div class="sub-text my-3" >第二次</div> + <table class="w-full mb-2"> + <tr class="sub-text" > + <td>收缩压(高压)</td> + <td style="width: 1em"></td> + <td>舒张压(低压)</td> + </tr> + <tr> + <td> + <van-field v-model="form.pressureTwoSbp" + name="pressureTwoSbp" + label="" + type="number" + placeholder="60~300,整数" + maxlength="10" + :rules="rules.pressureDbp" + error-message-align="left" + input-align="left" + class="table-field" + /> + </td> + + <td class="text-center"> + <span class="divide">/</span> + </td> + <td> + <van-field v-model="form.pressureTwoDbp" + name="pressureTwoDbp" + label="" + type="number" + placeholder="30~300,整数" + maxlength="10" + :rules="rules.pressureSbp" + error-message-align="left" + input-align="left" + class="table-field" + /> + </td> + </tr> + </table> + <BloodPressureBt :pressureObj="pressureObj" @getValue="setPressureTwo">第二次测量</BloodPressureBt> + + <div class='doc-form-label'>空腹血糖</div> + <van-field v-model="form.fastingGlucose" + name="fastingGlucose" + type="number" + placeholder="输入值0~50,2位小数" + maxlength="10" + :rules="rules.fastingGlucose" + > + <template #extra> + <span class="ml-1">mmol/L</span> + </template> + </van-field> + + <div class='doc-form-label'>低密度脂蛋白胆固醇</div> + <van-field v-model="form.ldlCholesterin" + name="ldlCholesterin" + type="number" + placeholder="输入值0~50,2位小数" + maxlength="10" + :rules="rules.ldlCholesterin" + > + <template #extra> + <span class="ml-1">mmol/L</span> + </template> + </van-field> + + <div class='doc-form-label'>血清总胆固醇</div> + <van-field v-model="form.serumCholesterin" + name="serumCholesterin" + type="number" + placeholder="输入值0~50,1位小数" + maxlength="10" + :rules="rules.serumCholesterin" + > + <template #extra> + <span class="ml-1">mmol/L</span> + </template> + </van-field> + + <div class='doc-form-label'>高密度脂蛋白胆固醇</div> + <van-field v-model="form.hdlCholesterin" + name="hdlCholesterin" + type="number" + placeholder="输入值0~50,1位小数" + maxlength="10" + :rules="rules.hdlCholesterin" + > + <template #extra> + <span class="ml-1">mmol/L</span> + </template> + </van-field> + + <div class="flex tip-box"> + <div class='doc-form-label shrink-0' required>运动</div> + <span class="grow text-end text-ellipsis">每周保持150分钟内中等或75分钟内的高强度身体活动</span> + </div> + <van-field + name="exerciseIntensity" + class="no-back" + style="padding: 0" + :rules="rules.exerciseIntensity"> + <template #input> + <van-radio-group v-model="form.exerciseIntensity" + direction="horizontal" + shape="dot" + class="w-full doc-radio-group"> + <van-radio v-for="item in store.getDict('CP00120')" + :key="item.value" :name="item.value" + label-position="left">{{item.name}}</van-radio> + </van-radio-group> + </template> + </van-field> + + <div class='doc-form-label' required>高危评估结果</div> + <van-field + name="visitResult" + class="no-back" + style="padding: 0" + :rules="rules.visitResult"> + <template #input> + <van-radio-group v-model="form.visitResult" + direction="horizontal" + shape="dot" + class="w-full doc-radio-group"> + <van-radio v-for="item in store.getDict('CP00119')" + :key="item.value" :name="item.value" + label-position="left">{{item.name}}</van-radio> + </van-radio-group> + </template> + </van-field> + + <DoctorInfo :info="info" ref="DoctorInfo"/> + + <div class='doc-form-label' required>随访日期</div> + <van-field + v-model="form.visitDate" + is-link + readonly + name="visitDate" + placeholder="请选择" + @click="showvisitDate = true" + :rules="rules.visitDate" + /> + <van-popup v-model:show="showvisitDate" position="bottom"> + <van-date-picker v-model="form._visitDate" + :min-date="visitDateRange.min" + :max-date="visitDateRange.max" + @confirm="visitDateConfirm" @cancel="showvisitDate = false" /> + </van-popup> + </van-form> + </div> +</template> + +<script> +import { useStore } from '@/doctor/store' +import { checkboxReject } from '@/utils/common.js' +import dayjs from 'dayjs' +import DoctorInfo from './DoctorInfo.vue' +import CheckBtn from '@/doctor/components/checkBtn/CheckBtn.vue' +import { BloodPressurePanel, BloodPressureBt } from '@/doctor/components/bloodPressure/index.js' + +const defaultForm = (info = {}) => { + const form = { + id: undefined, + residentInfoId: undefined, + // 年龄 + currentAge: undefined, + // 既往史 + medicalHistory: [], + medicalHistoryName: undefined, + // 身高 + height: undefined, + // 体重 + weight: undefined, + bmi: undefined, + // 腰围 + waistline: undefined, + // 是否吸烟 + isSmoking: undefined, + // 家族史 + familyHistory: [], + familyHistoryName: undefined, + // 空腹血糖 + fastingGlucose: undefined, + // 血清总胆固醇 + serumCholesterin: undefined, + // 低密度脂蛋白胆固醇 + ldlCholesterin: undefined, + // 高密度脂蛋白胆固醇 + hdlCholesterin: undefined, + // 运动 + exerciseIntensity: undefined, + // 筛查日期 + visitDate: undefined, + _visitDate: undefined, + // 血压第一次 + pressureOneDbp: undefined, + pressureOneSbp: undefined, + // 血压第二次 + pressureTwoDbp: undefined, + pressureTwoSbp: undefined, + // 高危评估结果(1:一般人群(小于3个指标);2:高危人群(大于等于3个指标)) + visitResult: 1, + // 高危项目 CP00113 + highItem: undefined, + gender: undefined + } + Reflect.ownKeys(form).forEach(key => { + if (info[key] != undefined) { + form[key] = info[key] + } + }) + return form +} +export default { + components: { + CheckBtn, + DoctorInfo, + BloodPressurePanel, + BloodPressureBt + }, + props: { + info: { default: () => ({}) }, + residentInfo: { default: () => ({}) }, + }, + inject: ['pressureObj'], + data() { + return { + form: defaultForm(), + rules: { + medicalHistory: [{ required: true, message: '请选择' }], + familyHistory: [{ required: true, message: '请选择' }], + exerciseIntensity: [{ required: true, message: '请选择' }], + isSmoking: [{ required: true, message: '请选择' }], + visitResult: [{ required: true, message: '请选择' }], + visitDate: [{ required: true, message: '请选择' }], + height: [{ required: true, message: '请输入' }, + { pattern: /^([1-9]\d{1}(?:\.\d{1})?|[1-2]\d{2}(?:\.\d{1})?|300)$/, message: '输入值在10~300内,1位小数' }], + weight: [{ required: true, message: '请输入' }, + { pattern: /^([2-9]\d{1}(?:\.\d{1,2})?|[1-4]\d{2}(?:\.\d{1,2})?|500)$/, message: '输入值在20~500内,2位小数' }], + waistline: [{ + pattern: /^([1-9]\d{1}(?:\.\d{1})?|[1][0-4]\d(?:\.\d{1})?|150)$/, message: '输入值在10~150内,1位小数', validateEmpty: false }], + fastingGlucose: [{ + pattern: /^(?:0(?:\.\d{1,2})?|[1-4]\d{0,1}(?:\.\d{1,2})?|[1-9]{0,1}(?:\.\d{1,2})?|50)$/, message: '输入值0~50,2位小数', validateEmpty: false }], + serumCholesterin: [{ + pattern: /^(?:0(?:\.\d{1})?|[1-4]\d{0,1}(?:\.\d{1})?|[1-9]{0,1}(?:\.\d{1})?|50)$$/, message: '输入值0~50,1位小数', validateEmpty: false }], + ldlCholesterin: [{ + pattern: /^(?:0(?:\.\d{1,2})?|[1-4]\d{0,1}(?:\.\d{1,2})?|[1-9]{0,1}(?:\.\d{1,2})?|50)$/, message: '输入值0~50,2位小数', validateEmpty: false }], + hdlCholesterin: [{ + pattern: /^(?:0(?:\.\d{1})?|[1-4]\d{0,1}(?:\.\d{1})?|[1-9]{0,1}(?:\.\d{1})?|50)$$/, message: '输入值0~50,1位小数', validateEmpty: false }], + pressureDbp: [{ pattern: /^([6-9]\d{1}|[1-2]\d{2}|300)$/, message: '60~300,整数', validateEmpty: false }], + pressureSbp: [{ pattern: /^([3-9]\d{1}|[1-2]\d{2}|300)$/, message: '30~300,整数', validateEmpty: false }], + }, + // 既往史 + showMedical: false, + // 家族史 + showFamily: false, + // 筛查日期 + showvisitDate: false, + // 筛查日期可选范围 + visitDateRange: { + min: undefined, + max: undefined + }, + store: useStore() + } + }, + computed: { + // BMI + bmi() { + const { height, weight } = this.form + return height && weight ? (weight / (height / 100 * height / 100)).toFixed(2) : undefined + }, + // 既往史 + medicalHistoryArray() { + const result = [] + this.store.getDict('CP00118').forEach(e => { + if (e.value == 9) { + result.unshift(e) + return + } + result.push(e) + }) + return result + }, + // 家族史 + familyHistoryArray() { + const result = [] + this.store.getDict('CP00167').forEach(e => { + if (e.value == 9) { + result.unshift(e) + return + } + result.push(e) + }) + return result + }, + // 筛查高危项目 + highItem() { + const {currentAge, waistline, familyHistory = [], isSmoking, gender, + pressureOneSbp, pressureOneDbp, pressureTwoSbp, pressureTwoDbp, + fastingGlucose, ldlCholesterin, serumCholesterin} = this.form + let list = [] + if (currentAge >= 50) { + list.push(1) + } + let bmi = parseFloat(this.bmi) + if ((bmi >= 24)|| + (gender == 2 && waistline >=80) || + (gender == 1 && waistline >=85) ){ + list.push(2) + } + if (isSmoking == 1) { + list.push(3) + } + if (familyHistory && familyHistory.length && (familyHistory.includes(1) || familyHistory.includes(2) || + familyHistory.includes(3) || familyHistory.includes(4) || familyHistory.includes(5) || familyHistory.includes(6))) { + list.push(4) + } + if ((pressureOneSbp >= 130 || pressureTwoSbp >= 130) || + (pressureOneDbp >= 85 || pressureTwoDbp >= 85) + ) { + list.push(5) + } + if (fastingGlucose >= 6.1) { + list.push(6) + } + // if (ldlCholesterin >= 3.4) { + // list.push(7) + // } + if (serumCholesterin >= 5.2) { + list.push(7) + } + list = Array.from(new Set(list)) + return list + } + }, + created() { + this.init() + }, + methods: { + init() { + const date = dayjs() + this.form.visitDate = date.format('YYYY-MM-DD') + this.form._visitDate = [date.year(), date.month() + 1, date.date()] + this.visitDateRange.max = new Date(date.year(), date.month(), date.date()) + this.visitDateRange.min = new Date(date.year() - 20, date.month(), date.date()) + }, + async submit() { + try { + await this.$refs.form.validate() + const result = { + ...this.form, + ...this.$refs.DoctorInfo.submit() + } + return result + } catch (err) { + console.warn(err) + this.$message.info('表单校验不通过') + const array = err || [] + if (array.length) { + this.$refs.form.scrollToField(array[0].name) + } + } + + }, + // 既往史 + medicalConfirm() { + this.form.medicalHistoryName = this.store.getDict('CP00118').map(e => { + return this.form.medicalHistory.includes(e.value) ? e.name : '' + }).filter(e => e).join('、') + this.showMedical = false + }, + medicalChange(val) { + this.form.medicalHistory = checkboxReject(this.form.medicalHistory, [9]) + }, + // 家族史 + familyConfirm() { + this.form.familyHistoryName = this.store.getDict('CP00167').map(e => { + return this.form.familyHistory.includes(e.value) ? e.name : '' + }).filter(e => e).join('、') + this.showFamily = false + }, + familyChange() { + this.form.familyHistory = checkboxReject(this.form.familyHistory, [9]) + }, + // 筛查日期 + visitDateConfirm({ selectedValues }) { + this.form.visitDate = selectedValues.join('-') + this.showvisitDate = false + }, + // resultHandle() { + // const {currentAge, waistline, familyHistory = [], isSmoking, gender, + // pressureOneSbp, pressureOneDbp, pressureTwoSbp, pressureTwoDbp, + // fastingGlucose, ldlCholesterin, serumCholesterin} = this.form + // let list = [] + // if (currentAge >= 50) { + // list.push(1) + // } + // let bmi = parseFloat(this.bmi) + // if ((bmi >= 24)|| + // (gender == 2 && waistline >=80) || + // (gender == 1 && waistline >=85) ){ + // list.push(2) + // } + // if (isSmoking == 1) { + // list.push(3) + // } + // if (familyHistory && familyHistory.length && (familyHistory.includes(1) || familyHistory.includes(2) || + // familyHistory.includes(3) || familyHistory.includes(4) || familyHistory.includes(5) || familyHistory.includes(6))) { + // list.push(4) + // } + // if ((pressureOneSbp >= 130 || pressureTwoSbp >= 130) || + // (pressureOneDbp >= 85 || pressureTwoDbp >= 85) + // ) { + // list.push(5) + // } + // if (fastingGlucose >= 6.1) { + // list.push(6) + // } + // // if (ldlCholesterin >= 3.4) { + // // list.push(7) + // // } + // if (serumCholesterin >= 5.2) { + // list.push(7) + // } + // list = Array.from(new Set(list)) + // this.form.highItem = list + // if (list.length >= 3){ + // this.form.visitResult = 2 + // }else { + // this.form.visitResult = 1 + // } + // }, + setPressureOne(val) { + if (!val) return + this.form.pressureOneSbp = val.systolicPressure + this.form.pressureOneDbp = val.diastolicPressure + }, + setPressureTwo(val) { + if (!val) return + this.form.pressureTwoSbp = val.systolicPressure + this.form.pressureTwoDbp = val.diastolicPressure + } + }, + watch: { + info: { + handler(info) { + this.form = defaultForm(info) + }, + immediate: true + }, + bmi: { + handler() { + this.form.bmi = this.bmi + }, + immediate: true + }, + highItem: { + handler(val) { + this.form.highItem = val + if (val.length >= 3){ + this.form.visitResult = 2 + }else { + this.form.visitResult = 1 + } + }, + immediate: true + } + } +} +</script> + +<style lang="less" scoped> +table { + text-align: left; + >tr { + >td { + padding-bottom: 4px; + } + &:last-child { + >td { + padding-bottom: 0; + } + } + } + .divide { + transform: translateY(2px); + padding: 0 2px; + .sub-text() + } +} +.sub-text { + color: #595959; +} +</style> diff --git a/src/doctor/screening/highVisit/first/Result.vue b/src/doctor/screening/highVisit/first/Result.vue new file mode 100644 index 0000000000000000000000000000000000000000..7a831cb9fe6f28a485b1bb66e2d80ca0c118ba9a --- /dev/null +++ b/src/doctor/screening/highVisit/first/Result.vue @@ -0,0 +1,60 @@ +<template> + <div class="screening-first-result text-center pt-3 px-3"> + <doc-icon type="doc-check-circle" style="font-size: .46rem;"/> + <div class="mt-3">随访完成</div> + <div class="text-start mt-5"> + <span style="color: #595959;">通过随访,您的慢病高危评估结果为:</span> + <span v-if="info.screenResult == 2" class="text-red">高危人群</span> + <span v-else>一般人群</span> + </div> + <div style="margin-top: .48rem"> + <van-button type='primary' block round plain + @click='toScreen'>专病高危随访</van-button> + <div class="pt-3"></div> + <van-button type='primary' block round plain + @click='toDetail'>查看居民详情</van-button> + <div class="text-16 pt-5" style="color: #8c8c8c;" + @click="toWorkbench">返回工作台</div> + </div> + </div> +</template> + +<script> +export default { + props: { + info: { default: () => ({}) } + }, + computed: { + residentInfoId() { + return this.info.residentInfoId + } + }, + methods: { + toScreen() { + this.$router.replace({ + path: '/doctor/screening/secondForm', + query: { + residentInfoId: this.residentInfoId + } + }) + }, + toDetail() { + this.$router.replace({ + path: '/doctor/patient-detail', + query: { + residentInfoId: this.residentInfoId + } + }) + }, + toWorkbench() { + this.$router.replace({ + path: '/doctor/workbench' + }) + } + } +} +</script> + +<style lang="less" scoped> + +</style> diff --git a/src/doctor/screening/highVisit/second/BaseInfo.vue b/src/doctor/screening/highVisit/second/BaseInfo.vue new file mode 100644 index 0000000000000000000000000000000000000000..b215c474f1dd444ad0419c25f1d31081b4e4f71c --- /dev/null +++ b/src/doctor/screening/highVisit/second/BaseInfo.vue @@ -0,0 +1,217 @@ +<template> + <div> + <van-form ref='form'> + <archive-common :info='info' ref='archive'></archive-common> + <div class='flex justify-between items-center mt-5 mb-20'> + <div class='title'>筛查信息</div> + <div> + <van-button plain size='small' type='primary' @click='toLast'>引入上一次筛查数据</van-button> + </div> + </div> + + <div class='label-title mt-5'>筛查病种</div> + <van-field + v-model='form.diseaseArraysName' + readonly + is-link + placeholder='请选择' + class='input-back mt-2 form-input' + :rules='rules.diseaseArraysName' + @click='showGroupsArrays= true' + > + <template #input> + <span class='text-end' v-if='form.diseaseArraysName'>{{ form.diseaseArraysName }}</span> + <span class='text-end' v-if='!form.diseaseArraysName' style='color: #dfdfe1'>请选择</span> + </template> + </van-field> + <van-popup v-model:show='showGroupsArrays' position='bottom'> + <div class='p-4'> + <div class='flex justify-between items-center mb-4 pop-title'> + <div class='greyColor' @click='showGroupsArrays = false' style='font-weight: 400'>取消</div> + <div>筛查病种(可多选)</div> + <div class='blueColor' @click='groupsArraysConfirm'>确定</div> + </div> + <CheckBtn multiple + column-1 + :options='groupArrList' + v-model:value='checkGroupsArrays' + :fieldNames="{text: 'name', value: 'value'}" /> + </div> + </van-popup> + </van-form> + </div> +</template> + +<script> +import ArchiveCommon from '@/doctor/components/archiveCommon/archiveCommon' +import { useStore } from '@/doctor/store' +import CheckBtn from '@/doctor/components/checkBtn/CheckBtn' + +export default { + name: 'BaseInfo', + props: { + info: Object + }, + components: { CheckBtn, ArchiveCommon }, + data() { + return { + store: useStore(), + form: { + diseaseArrays: [], + diseaseArraysName: undefined + }, + rules: { + diseaseArraysName: [{ required: true, message: '请选择' }] + }, + showGroupsArrays: false, + //筛查病种组件双向绑定变量 + checkGroupsArrays: [] + } + }, + computed: { + //筛查病种 + groupArrList() { + let res = [] + res = this.store.getDict('CP00117') + return res + } + }, + watch: { + 'info': { + handler() { + this.init() + }, + immediate: true + } + }, + methods: { + init() { + if (!this.info.id) { + //是否是引用上一次复筛数据 + if (this.info.flag && this.info.flag == 'lastInfo') { + this.setDis(this.info.diseaseArrays) + } else {//新增时 + this.setDis([1,2,3,4,5,6,7]) + } + } else { + this.setDis(this.info.diseaseArrays) + } + }, + setDis(diseaseArrays) { + if (diseaseArrays) { + this.form.diseaseArrays = diseaseArrays + this.checkGroupsArrays = this.form.diseaseArrays + let res = [] + this.groupArrList.forEach(item => { + let list = this.form.diseaseArrays.filter(i => i == item.value) + if (list && list.length) { + res.push(item.name) + } + }) + this.form.diseaseArraysName = res.join() + } + }, + groupsArraysConfirm() { + let res = [] + this.groupArrList.forEach(item => { + let selected = this.checkGroupsArrays.filter(i => i == item.value) + if (selected && selected.length) { + res.push(item.name) + } + }) + if (this.checkGroupsArrays && this.checkGroupsArrays.length) { + this.form.diseaseArrays = this.checkGroupsArrays + this.form.diseaseArraysName = res.join() + } else { + this.form.diseaseArrays = [] + this.form.diseaseArraysName = '' + } + this.showGroupsArrays = false + }, + toLast() { + this.$emit('getLast', true) + }, + async onSubmit() { + let baseInfo = {} + try { + baseInfo = await this.$refs.archive.onSubmit() + } catch (e) { + } + return new Promise((resolve, reject) => { + this.$refs.form.validate().then(() => { + let par = { + residentsRecord: { + // ...this.info, + ...baseInfo, + id: this.info.personId + }, + diseaseArrays: this.form.diseaseArrays + } + resolve(par) + }).catch((e) => { + console.warn('baseInfo error', e) + }) + }) + } + } +} +</script> + +<style scoped lang='less'> +.title { + font-weight: bold; +} +.mb-20 { + margin-bottom: 20px; +} + +.label-title { + font-size: 13px; + color: #595959; + font-weight: 500; + + &::after { + content: "*"; + color: red; + font-weight: bold; + margin-left: 4px; + } +} + +.no-req-label { + font-size: 13px; + color: #595959; + font-weight: 500; +} + +.form-input { + padding: 8px 12px; + border-radius: 8px; +} + +.input-back { + background: #FAFAFA; +} + +.pop-title { + color: #262626; + font-size: 16px; + line-height: 24px; + font-weight: bold; +} + +:deep(.van-popup) { + min-height: 30% !important; +} +:deep(.van-cell-group--inset) { + overflow: visible; +} + +:deep(.van-cell) { + overflow: visible; +} + +:deep(.van-cell:after) { + border-bottom: 0px; +} +</style> \ No newline at end of file diff --git a/src/doctor/screening/highVisit/second/CommonBottom.vue b/src/doctor/screening/highVisit/second/CommonBottom.vue new file mode 100644 index 0000000000000000000000000000000000000000..cd9c55e401ec40bd93d3dc22ad3e2df36f20ff37 --- /dev/null +++ b/src/doctor/screening/highVisit/second/CommonBottom.vue @@ -0,0 +1,250 @@ +<template> + <div> + <van-form ref='form'> + + <div :class="['label-title', 'mt-5']">随访单位</div> + <van-field + v-model='form.visitUnitName' + is-link + readonly + placeholder='随访单位' + class='input-back mt-2 form-input' + :rules='rules.visitUnitName' + @click='show1 = true' + /> + <DocUnit v-model:show='show1' v-model:value='form.visitUnitId' @change='changeUnit' /> + + <div class='label-title mt-5'>随访科室</div> + <van-field + v-model='form.visitOfficeName' + is-link + readonly + placeholder='随访科室' + class='input-back mt-2 form-input' + :rules='rules.visitOfficeName' + @click='show2 = true' + /> + <DocOffice v-model:show='show2' v-model:value='form.visitOfficeId' @change='changeOffice' + :unitId='form.visitUnitId' /> + + <div class='label-title mt-5'>随访医生</div> + <van-field + v-model='form.visitDoctorName' + is-link + readonly + placeholder='随访医生' + class='input-back mt-2 form-input' + :rules='rules.visitDoctorName' + @click='show3 = true' + /> + + <DocOfficeDoctor v-model:show='show3' v-model:value='form.visitDoctorId' @change='changeDoctor' + :unitId='form.visitUnitId' :officeId='form.visitOfficeId' /> + </van-form> + </div> +</template> + +<script> +import dayjs from 'dayjs' +import { useStore } from '@/doctor/store' +import DocUnit from '@/doctor/components/docUnit/DocUnit' +import DocOffice from '@/doctor/components/docOffice/DocOffice' +import DocOfficeDoctor from '@/doctor/components/docOfficeDoctor/DocOfficeDoctor' +import CheckBtn from '@/doctor/components/checkBtn/CheckBtn' +import DocImageUpload from '@/doctor/components/docImageUpload/DocImageUpload' + + +export default { + name: 'CommonBottom', + components: { DocImageUpload, CheckBtn, DocOfficeDoctor, DocOffice, DocUnit }, + props: { + info: { + default: () => { + return {} + } + }, + }, + data() { + return { + store: useStore(), + show1: false, + show2: false, + show3: false, + form: { + }, + rules: { + } + } + }, + watch: { + 'info': { + handler() { + this.form = this.setForm(this.info) + }, + immediate: true + }, + }, + computed: { + authInfo() { + return this.store.$state.authInfo + }, + }, + methods: { + setForm(info) { + const form = { + visitDate: new dayjs().format("YYYY-MM-DD"), + createDate: new dayjs().format("YYYY-MM-DD"), + // 随访单位 + visitUnitId: this.authInfo.unitId, + visitUnitName: this.authInfo.unitName, + // 随访科室 + visitOfficeId: this.authInfo.officeId, + visitOfficeName: this.authInfo.officeName, + // 随访医生 + visitDoctorId: this.authInfo.relationId, + visitDoctorName: this.authInfo.nickName, + // 录入单位 + createUnitId: this.authInfo.unitId, + createUnitName: this.authInfo.unitName, + // 录入科室 + createOfficeId: this.authInfo.officeId, + createOfficeName: this.authInfo.officeName, + // 录入医生 + createDoctorId: this.authInfo.relationId, + createDoctorName: this.authInfo.nickName, + } + Reflect.ownKeys(form).forEach(key => { + if (info[key] != undefined) { + form[key] = info[key] + } + }) + return form + }, + changeUnit(val) { + this.form.visitUnitName = val.unitName + this.form.visitUnitId = val.id + this.form.visitOfficeId = undefined + this.form.visitOfficeName = undefined + this.form.visitDoctorId = undefined + this.form.visitDoctorName = undefined + this.show1 = false + }, + changeOffice(val) { + this.form.visitOfficeId = val.id + this.form.visitOfficeName = val.officeName + this.form.visitDoctorId = undefined + this.form.visitDoctorName = undefined + this.show2 = false + }, + changeDoctor(val) { + this.form.visitDoctorId = val.id + this.form.visitDoctorName = val.staffName + this.show3 = false + }, + onSubmit() { + return new Promise((resolve, reject) => { + this.$refs.form.validate().then(() => { + let par = { + ...this.form, + } + resolve(par) + }).catch((e) => { + console.warn('error', e) + }) + }) + } + } +} +</script> + +<style scoped lang='less'> +.title { + font-weight: bold; + margin-bottom: 20px; +} + +.label-title { + font-size: 13px; + color: #595959; + font-weight: 500; + + &::after { + content: "*"; + color: red; + font-weight: bold; + margin-left: 4px; + } +} + +.push-lab { + line-height: 20px; + color: #8C8C8C; + font-size: 12px +} + +.no-req-label { + font-size: 13px; + color: #595959; + font-weight: 500; +} + +.form-input { + padding: 8px 12px; + border-radius: 8px; +} + +.input-back { + background: #FAFAFA; +} + +.tel-back { + background: #F5F5F5; + padding: 8px; + border-radius: 0px 0px 8px 8px; +} + +.tel { + background: #FFFFFF; + padding: 8px; + border-radius: 8px; +} + +.tel-label { + color: #607FF0; + font-weight: bold; +} + +.p-12-0 { + padding: 12px 0px; +} + +.vx-cb { + position: absolute; + right: 10px; + top: 23px; +} + +.ms-cb { + position: absolute; + right: 10px; + top: 97px; +} + +:deep(.van-cell-group--inset) { + overflow: visible; +} + +:deep(.van-cell) { + overflow: visible; +} + +/*:deep(.van-field__error-message) { + position: absolute; + margin-top: 3px; +}*/ + +:deep(.van-cell:after) { + border-bottom: 0px; +} + +</style> \ No newline at end of file diff --git a/src/doctor/screening/highVisit/second/DiseaseSelect.vue b/src/doctor/screening/highVisit/second/DiseaseSelect.vue new file mode 100644 index 0000000000000000000000000000000000000000..c34f2d38f27b1bf23670fda9bc0921a4c14fa5e3 --- /dev/null +++ b/src/doctor/screening/highVisit/second/DiseaseSelect.vue @@ -0,0 +1,122 @@ +<template> + <div class='disease-select'> + <div class='label-title mb-4'>请选择慢病类型</div> + <div v-for="(item, index) in store.getDict('CP00117')" :key='index' + :class="['flex justify-between items-center text-16 mb-3 disease-checked', + { 'disease-checked-active': isSelect(item)}, + ]" + @click='onSelect(item)'> + <span>{{ item.name }}</span> + </div> + <div class='warn-error' v-if='showWarn'>请选择</div> + </div> +</template> + +<script> +import { useStore } from '@/doctor/store/index.js' + +export default { + props: { + infoValue: String + }, + data() { + return { + store: useStore(), + // 选中的疾病类型 + innerValue: [], + //显示校验 + showWarn: false + } + }, + watch: { + infoValue: { + handler(value) { + if (value) { + this.innerValue = value.split(',') + } + }, + immediate: true + } + }, + created() { + this.init() + }, + methods: { + init() { + if (!(this.innerValue && this.innerValue.length)) { + this.innerValue = this.store.getDict('CP00117').map(e => e.value) + } + }, + // 是否选中 + isSelect(item) { + return this.innerValue.includes(item.value) + }, + onSelect(val) { + if (this.innerValue.includes(val.value)) { + this.innerValue = this.innerValue.filter(e => e !== val.value) + } else { + this.innerValue.push(val.value) + } + if (this.innerValue && this.innerValue.length) { + this.showWarn = false + } else { + this.showWarn = true + } + + }, + onSubmit() { + return new Promise((resolve, reject) => { + if (!(this.innerValue && this.innerValue.length)) { + this.showWarn = true + return + } + resolve(this.innerValue) + }) + } + } +} +</script> + +<style lang='less' scoped> +.label-title { + font-size: 14px; + color: #262626; + font-weight: 500; + + &::after { + content: "*"; + color: red; + font-weight: bold; + margin-left: 4px; + } +} + +.no-req-label { + font-size: 13px; + color: #595959; + font-weight: 500; +} + +.disease-checked { + border: 1px solid #BFBFBF; + border-radius: 40px; + color: #595959; + background-color: #fff; + padding: 10px 16px; + line-height: 22.4px; +} + +.disease-checked-active { + color: var(--van-primary-color); + border-color: var(--van-primary-color); +} + +.disease-checked-disabled { + border-color: #EFF2F7; + background-color: #EFF2F7; +} + +.warn-error { + color: #FF4D4F; +} +</style> diff --git a/src/doctor/screening/highVisit/second/FormCont.vue b/src/doctor/screening/highVisit/second/FormCont.vue new file mode 100644 index 0000000000000000000000000000000000000000..b2008da56c689d832ccb3720d75d1cbddccddce5 --- /dev/null +++ b/src/doctor/screening/highVisit/second/FormCont.vue @@ -0,0 +1,2669 @@ +<template> + <div class='screening-first-cont'> + <van-form ref='form'> + <div class='title'>随访信息</div> + <div v-if='ageShow'> + <div class='no-req-label mt-5'>年龄</div> + <van-field + v-model='form.currentAge' + readonly + placeholder='年龄' + class='input-back mt-2 form-input' + /> + </div> + <div v-if='sexShow'> + <div class='no-req-label mt-5'>性别</div> + <van-field + v-model='form.genderName' + readonly + placeholder='性别' + class='input-back mt-2 form-input' + /> + </div> + + <div v-if='medicalHistoryShow'> + <div class='label-title mt-5'>病史</div> + <van-field + v-model='form.medicalHistoryName' + readonly + is-link + placeholder='请选择' + class='input-back mt-2 form-input' + :rules='rules.medicalHistoryName' + @click='showMedicalHistory= true' + > + <template #input> + <span class='text-end' v-if='form.medicalHistoryName'>{{ form.medicalHistoryName }}</span> + <span class='text-end' v-if='!form.medicalHistoryName' style='color: #dfdfe1'>请选择</span> + </template> + </van-field> + <van-popup v-model:show='showMedicalHistory' position='bottom'> + <div class='p-4' style='height: 100%'> + <div class='flex justify-between items-center mb-4 pop-title'> + <div class='greyColor' @click='showMedicalHistory = false' style='font-weight: 400'>取消</div> + <div>病史(可多选)</div> + <div class='blueColor' @click='medicalHistoryConfirm'>确定</div> + </div> + <div style='height: 80%;overflow: auto'> + <CheckBtn multiple + column-1 + :options='medicalHistoryList' + v-model:value='form.medicalHistory' + :fieldNames="{text: 'name', value: 'value'}" + @change='e => form.medicalHistory = checkboxReject(form.medicalHistory, [99])' + /> + </div> + </div> + </van-popup> + </div> + + <div v-if='familyHistoryShow'> + <div class='label-title mt-5'>家族史(可多选)</div> + <van-field class='checkbox-his'> + <template #input> + <van-checkbox-group v-model='form.familyHistory' class='w-full'> + <div v-for='(item, index) in familyHistoryInfoList' :key='item.value'> + <div + @click='toggle(index)' + class='form-input input-back mt-2 flex justify-between' + :style="{borderRadius: form.familyHistory.includes(item.value) && [1, 3, 5, 7].includes(item.value) ? '8px 8px 0px 0px ': '8px'}" + > + <div>{{ item.name }}</div> + <div> + <van-checkbox + :name='item.value' + :ref='el => checkboxRefs[index] = el' + @click.stop='toggle(index)' + /> + </div> + </div> + <div v-for='(item2, index2) in familyHistoryList'> + <div + v-if='form.familyHistory.includes(item.value) && item2.diseaseType == item.value' + class='relation-bis'> + <div class='top-title'>以下亲人若存在{{ item2.diseaseTypeName }}病史,请填写发病年龄</div> + <div class='flex flex-wrap justify-between gap-x-2.5 gap-y-2.5'> + <div v-for='(item1,index1) in item2.relativeAgeList' :key='index1' + style='width: 48%;'> + <div> + <van-field + colon + label-width='42px' + v-model='item1.age' + :label='item1.relativeTypeName' + placeholder='请输入' + style='padding: 8px;border-radius: 4px' + > + <template #extra> + <span class='mr-2'>岁</span> + </template> + </van-field> + </div> + </div> + </div> + </div> + </div> + </div> + + + </van-checkbox-group> + </template> + </van-field> + </div> + + <div v-if='highShow'> + <div class='label-title mt-5'>身高</div> + <van-field + v-model='form.height' + clear-icon + placeholder='请输入10~300之间数字,允许1位小数' + class='input-back mt-2 form-input' + :rules='rules.height' + > + <template #extra> + <span class='mr-2'>cm</span> + </template> + </van-field> + </div> + <div v-if='highShow'> + <div class='label-title mt-5'>体重</div> + <van-field + v-model='form.weight' + clear-icon + placeholder='请输入20~500之间数字,允许2位小数' + class='input-back mt-2 form-input' + :rules='rules.weight' + > + <template #extra> + <span class='mr-2'>kg</span> + </template> + </van-field> + </div> + <div v-if='highShow'> + <div class='no-req-label mt-5'>BMI</div> + <van-field + v-model='form.bmi' + readonly + placeholder='请输入' + class='input-back mt-2 form-input' + > + <template #extra> + <span class='mr-2'>kg/m²</span> + </template> + </van-field> + </div> + <div v-if='waistShow'> + <div class='label-title mt-5'>腰围</div> + <van-field + v-model='form.waistline' + clear-icon + placeholder='请输入10~150之间数字,允许1位小数' + class='input-back mt-2 form-input' + :rules='rules.waistline' + > + <template #extra> + <span class='mr-2'>cm</span> + </template> + </van-field> + </div> + + <div v-if='exerciseShow'> + <div class='label-title mt-5'>锻炼频率</div> + <van-field + v-model='form.exerciseFrequencyName' + readonly + is-link + placeholder='请选择' + class='input-back mt-2 form-input' + @click='showExerciseFrequency = true' + :rules='rules.exerciseFrequencyName' + > + <template #input> + <span class='text-end' v-if='form.exerciseFrequencyName'>{{ form.exerciseFrequencyName }}</span> + <span class='text-end' v-if='!form.exerciseFrequencyName' style='color: #dfdfe1'>请选择</span> + </template> + </van-field> + <van-popup v-model:show='showExerciseFrequency' position='bottom'> + <div class='p-4' style='height: 100%'> + <div class='flex justify-between items-center mb-4 pop-title'> + <div class='greyColor' @click='showExerciseFrequency = false' style='font-weight: 400'> + 取消 + </div> + <div>锻炼频率(仅单选)</div> + <div></div> + </div> + <div style='height: 80%;overflow: auto'> + <CheckBtn clearable + column-1 + :options='exerciseFrequencyList' + v-model:value='form.exerciseFrequency' + :fieldNames="{text: 'name', value: 'value'}" + @change='exerciseFrequencyConfirm' + /> + </div> + </div> + </van-popup> + + <div v-if='[1, 2, 3, 5, 6].includes(form.exerciseFrequency)'> + <div class='no-req-label mt-5'>每次锻炼时间</div> + <van-field + v-model='form.everyExercise' + clear-icon + placeholder='请输入' + class='input-back mt-2 form-input' + > + <template #extra> + <span class='mr-2'>分钟</span> + </template> + </van-field> + + <div class='no-req-label mt-5'>可达到中等及以上运动强度</div> + <van-field + class='no-back form-input mt-2' + style='padding: 0' + > + <template #input> + <van-radio-group v-model='form.mediumStrength' + direction='horizontal' + shape="dot" + class='w-full doc-radio-group'> + <van-radio v-for="item in store.getDict('CP00120')" + :key='item.value' :name='item.value' + label-position='left'>{{ item.name }} + </van-radio> + </van-radio-group> + </template> + </van-field> + </div> + </div> + + <div v-if='womanMHShow'> + <div class='no-req-label mt-5'>女性病史</div> + <van-field + v-model='form.femaleMedicalHistoryName' + readonly + is-link + placeholder='请选择' + class='input-back mt-2 form-input' + @click='showFemaleMedicalHistory= true' + > + <template #input> + <span class='text-end' v-if='form.femaleMedicalHistoryName'>{{ form.femaleMedicalHistoryName + }}</span> + <span class='text-end' v-if='!form.femaleMedicalHistoryName' style='color: #dfdfe1'>请选择</span> + </template> + </van-field> + <van-popup v-model:show='showFemaleMedicalHistory' position='bottom'> + <div class='p-4' style='height: 100%'> + <div class='flex justify-between items-center mb-4 pop-title'> + <div class='greyColor' @click='showFemaleMedicalHistory = false' style='font-weight: 400'> + 取消 + </div> + <div>女性病史(可多选)</div> + <div class='blueColor' @click='femaleMedicalHistoryConfirm'>确定</div> + </div> + <div style='height: 80%;overflow: auto'> + <CheckBtn multiple + column-1 + :options="store.getDict('CP00127')" + v-model:value='form.femaleMedicalHistory' + :fieldNames="{text: 'name', value: 'value'}" + /> + </div> + </div> + </van-popup> + </div> + <div v-if='medicationHShow'> + <div class='no-req-label mt-5'>用药史</div> + <van-field + v-model='form.medicineHistoryName' + readonly + is-link + placeholder='请选择' + class='input-back mt-2 form-input' + @click='showMedicineHistory= true' + > + <template #input> + <span class='text-end' v-if='form.medicineHistoryName'>{{ form.medicineHistoryName }}</span> + <span class='text-end' v-if='!form.medicineHistoryName' style='color: #dfdfe1'>请选择</span> + </template> + </van-field> + <van-popup v-model:show='showMedicineHistory' position='bottom'> + <div class='p-4' style='height: 100%'> + <div class='flex justify-between items-center mb-4 pop-title'> + <div class='greyColor' @click='showMedicineHistory = false' style='font-weight: 400'>取消 + </div> + <div>用药史(可多选)</div> + <div class='blueColor' @click='medicineHistoryConfirm'>确定</div> + </div> + <div style='height: 80%;overflow: auto'> + <CheckBtn multiple + column-1 + :options='medicineHistoryList' + v-model:value='form.medicineHistory' + :fieldNames="{text: 'name', value: 'value'}" + /> + </div> + </div> + </van-popup> + </div> + + <div v-if='triglycerideShow'> + <div class='no-req-label mt-5'>高密度脂蛋白胆固醇</div> + <van-field + v-model='form.hdlCholesterin' + clear-icon + placeholder='请输入' + class='input-back mt-2 form-input' + > + <template #extra> + <span class='mr-2'>mmol/L</span> + </template> + </van-field> + </div> + <div v-if='triglycerideShow'> + <div class='no-req-label mt-5'>甘油三酯</div> + <van-field + v-model='form.triglyceride' + clear-icon + placeholder='请输入' + class='input-back mt-2 form-input' + > + <template #extra> + <span class='mr-2'>mmol/L</span> + </template> + </van-field> + </div> + <div v-if='triglycerideShow'> + <div class='no-req-label mt-5'>总胆固醇</div> + <van-field + v-model='form.serumCholesterin' + clear-icon + placeholder='请输入' + class='input-back mt-2 form-input' + > + <template #extra> + <span class='mr-2'>mmol/L</span> + </template> + </van-field> + </div> + + <div v-if='babyMHShow'> + <div class='no-req-label mt-5'>有害物质接触或婴幼儿时期病史</div> + <van-field + v-model='form.touchHarmfulName' + readonly + is-link + placeholder='请选择' + class='input-back mt-2 form-input' + @click='showTouchHarmful= true' + > + <template #input> + <span class='text-end' v-if='form.touchHarmfulName'>{{ form.touchHarmfulName }}</span> + <span class='text-end' v-if='!form.touchHarmfulName' style='color: #dfdfe1'>请选择</span> + </template> + </van-field> + <van-popup v-model:show='showTouchHarmful' position='bottom'> + <div class='p-4' style='height: 100%'> + <div class='flex justify-between items-center mb-4 pop-title'> + <div class='greyColor' @click='showTouchHarmful = false' style='font-weight: 400'>取消</div> + <div>可多选</div> + <div class='blueColor' @click='touchHarmfulConfirm'>确定</div> + </div> + <div style='height: 80%;overflow: auto'> + <CheckBtn multiple + column-1 + :options="store.getDict('CP00130')" + v-model:value='form.touchHarmful' + :fieldNames="{text: 'name', value: 'value'}" + /> + </div> + </div> + </van-popup> + </div> + + <div v-if='bloodPressureShow'> + <div class='flex items-center justify-between tip-box mt-5'> + <div class='doc-form-label shrink-0'>现测血压(mmHg)</div> + <BloodPressurePanel :pressureObj='pressureObj' /> + </div> + <div class='sub-text my-3'>第一次</div> + <table class='w-full mb-2'> + <tr class='sub-text'> + <td>收缩压(高压)</td> + <td style='width: 1em'></td> + <td>舒张压(低压)</td> + </tr> + <tr> + <td class='flex items-center'> + <van-field v-model='form.pressureOneSbp' + name='pressureOneSbp' + label='' + type='number' + placeholder='60~300,整数' + maxlength='10' + :rules='rules.pressureDbp' + error-message-align='left' + input-align='left' + class='input-back form-input' + /> + </td> + <td class='text-center'> + <span class='divide'>/</span> + </td> + <td> + <van-field v-model='form.pressureOneDbp' + name='pressureOneDbp' + label='' + type='number' + placeholder='30~300,整数' + maxlength='10' + :rules='rules.pressureSbp' + error-message-align='left' + input-align='left' + class='input-back form-input' + /> + </td> + </tr> + </table> + <BloodPressureBt :pressureObj='pressureObj' @getValue='setPressureOne'>第一次测量</BloodPressureBt> + <div class='sub-text my-3'>第二次</div> + <table class='w-full mb-2'> + <tr class='sub-text'> + <td>收缩压(高压)</td> + <td style='width: 1em'></td> + <td>舒张压(低压)</td> + </tr> + <tr> + <td> + <van-field v-model='form.pressureTwoSbp' + name='pressureTwoSbp' + label='' + type='number' + placeholder='60~300,整数' + maxlength='10' + :rules='rules.pressureDbp' + error-message-align='left' + input-align='left' + class='input-back form-input' + /> + </td> + + <td class='text-center'> + <span class='divide'>/</span> + </td> + <td> + <van-field v-model='form.pressureTwoDbp' + name='pressureTwoDbp' + label='' + type='number' + placeholder='30~300,整数' + maxlength='10' + :rules='rules.pressureSbp' + error-message-align='left' + input-align='left' + class='input-back form-input' + /> + </td> + </tr> + </table> + <BloodPressureBt :pressureObj='pressureObj' @getValue='setPressureTwo'>第二次测量</BloodPressureBt> + </div> + + <div v-if='eatHabitShow'> + <div class='label-title mt-5'>饮食习惯</div> + <van-field + v-model='form.dietaryHabitName' + readonly + is-link + placeholder='请选择' + class='input-back mt-2 form-input' + @click='showDietaryHabit= true' + :rules='rules.dietaryHabitName' + > + <template #input> + <span class='text-end' v-if='form.dietaryHabitName'>{{ form.dietaryHabitName }}</span> + <span class='text-end' v-if='!form.dietaryHabitName' style='color: #dfdfe1'>请选择</span> + </template> + </van-field> + <van-popup v-model:show='showDietaryHabit' position='bottom'> + <div class='p-4' style='height: 100%'> + <div class='flex justify-between items-center mb-4 pop-title'> + <div class='greyColor' @click='showDietaryHabit = false' style='font-weight: 400'>取消</div> + <div>饮食习惯(可多选)</div> + <div class='blueColor' @click='dietaryHabitConfirm'>确定</div> + </div> + <div style='height: 80%;overflow: auto'> + <CheckBtn multiple + column-1 + :options="store.getDict('CP00131')" + v-model:value='form.dietaryHabit' + :fieldNames="{text: 'name', value: 'value'}" + /> + </div> + </div> + </van-popup> + </div> + + <div v-if='drinkShow'> + <div class='label-title mt-5'>饮酒情况</div> + <div class='bg-fa mt-2'> + <div class='label-title lh-24'>饮酒频率</div> + <van-field + class='form-input mt-2' + style='padding: 0;background: #FAFAFA' + :rules='rules.drinkFrequency' + > + <template #input> + <van-radio-group v-model='form.drinkFrequency' + direction='horizontal' + shape="dot" + class='w-full doc-radio-group-now' + @change='drinkFrequencyChange' + > + <van-radio v-for="item in store.getDict('CP00132')" + :key='item.value' :name='item.value' + label-position='left'>{{ item.name }} + </van-radio> + </van-radio-group> + </template> + </van-field> + </div> + + <div class='bg-f5 mt-2' v-if='[2,3,4].includes(form.drinkFrequency)'> + <div class='label-title lh-24'>饮酒种类</div> + <van-field + class='form-input mt-2' + style='padding: 0;background: #F5F5F5' + :rules='rules.drinkKind' + > + <template #input> + <div class='flex justify-between gap-x-2.5 w-full' style='background: #F5F5F5'> + <div v-for="(item, index) in store.getDict('CP00133')" :key='item.value' class='bg-ff'> + <div + @click='toggleDrink(item)' + :class="['form-input', 'flex', 'justify-between', this.form.drinkKind.includes(item.value) ? 'active-drinkKind' : '' ]" + > + <div>{{ item.name }}</div> + </div> + </div> + + </div> + </template> + </van-field> + <div class='mt-2' v-if='form?.drinkKind?.includes(99)'> + <van-field + v-model='form.drinkKindOther' + clear-icon + placeholder='请输入饮酒种类名称' + class=' mt-2 form-input' + > + </van-field> + </div> + </div> + + <div class='bg-f5 mt-2' v-if='[2,3,4].includes(form.drinkFrequency)'> + <div class='no-req-label lh-24'>请输入日酒饮量</div> + <div class='flex flex-wrap justify-between gap-x-2.5 gap-y-2.5 mt-2' + v-if='drinkKindCapacityList.length'> + <div v-for='(item,index) in drinkKindCapacityList' :key='index' + style='width: 48%;'> + <div> + <van-field + colon + label-width='42px' + v-model='item.drinkCapacity' + :label='item.drinkKindName' + placeholder='请输入' + style='padding: 8px;border-radius: 4px' + > + <template #extra> + <span class='mr-2'>mL</span> + </template> + </van-field> + </div> + </div> + </div> + <div class='mt-2'> + <van-field + colon + label-width='40%' + v-model='form.dayDrink' + label='平均日饮酒量' + placeholder='请输入' + style='padding: 8px;border-radius: 4px' + > + <template #extra> + <span class='mr-2'>mL</span> + </template> + </van-field> + </div> + </div> + + <div class='bg-f5 mt-2' v-if='[2,3,4].includes(form.drinkFrequency)'> + <div class='no-req-label lh-24'>请输入开始饮酒年龄</div> + <van-field + colon + v-model='form.startDrinkAge' + placeholder='请输入' + class='mt-2' + style='padding: 8px;border-radius: 4px' + :rules='rules.startDrinkAge' + > + <template #extra> + <span class='mr-2'>岁</span> + </template> + </van-field> + </div> + + <div class='bg-f5 mt-2' v-if='[2,3,4].includes(form.drinkFrequency)'> + <div class='label-title lh-24'>是否戒酒</div> + <van-field + class='form-input mt-2' + style='padding: 0;background: #F5F5F5' + :rules='rules.giveDrink' + > + <template #input> + <van-radio-group v-model='form.giveDrink' + direction='horizontal' + shape="dot" + class='w-full doc-radio-group-now' + style='background: #F5F5F5' + > + <van-radio v-for="item in store.getDict('CP00120')" + :key='item.value' :name='item.value' + label-position='left'>{{ item.name }} + </van-radio> + </van-radio-group> + </template> + </van-field> + </div> + + <div class='bg-f5 mt-2' v-if='[2,3,4].includes(form.drinkFrequency) && form.giveDrink == 1'> + <div class='no-req-label lh-24'>请输入开始戒酒年龄</div> + <van-field + colon + v-model='form.giveDrinkStart' + placeholder='请输入' + class='mt-2' + style='padding: 8px;border-radius: 4px' + :rules='rules.giveDrinkStart' + > + <template #extra> + <span class='mr-2'>岁</span> + </template> + </van-field> + </div> + </div> + + <div v-if='smokeShow'> + <div class='label-title mt-5'>吸烟情况</div> + + <div class='bg-fa mt-2'> + <div class='label-title lh-24'>吸烟情况</div> + <van-field + class='form-input mt-2' + style='padding: 0;background: #FAFAFA' + :rules='rules.isSmoking' + > + <template #input> + <van-radio-group v-model='form.isSmoking' + direction='horizontal' + shape="dot" + class='w-full doc-radio-group-now' + > + <van-radio v-for="item in store.getDict('CP00162')" + :key='item.value' :name='item.value' + label-position='left'>{{ item.name }} + </van-radio> + </van-radio-group> + </template> + </van-field> + </div> + <div class='bg-f5 mt-2' v-if='form.isSmoking === 3'> + <div class='label-title lh-24'>日吸烟量</div> + <van-field + colon + v-model='form.daySmoking' + placeholder='请输入' + class='mt-2' + style='padding: 8px;border-radius: 4px' + :rules='rules.daySmoking' + > + </van-field> + </div> + <div class='bg-f5 mt-2' v-if='form.isSmoking === 3'> + <div class='label-title lh-24'>开始吸烟年龄</div> + <van-field + colon + v-model='form.startSmoking' + placeholder='请输入' + class='mt-2' + style='padding: 8px;border-radius: 4px' + :rules='rules.startSmoking' + > + <template #extra> + <span class='mr-2'>岁</span> + </template> + </van-field> + </div> + + <div class='bg-f5 mt-2' v-if='form.isSmoking === 2'> + <div class='label-title lh-24'>戒烟年龄</div> + <van-field + colon + v-model='form.giveSmokingAge' + placeholder='请输入' + class='mt-2' + style='padding: 8px;border-radius: 4px' + :rules='rules.giveSmokingAge' + > + <template #extra> + <span class='mr-2'>岁</span> + </template> + </van-field> + </div> + + <div class='bg-f5 mt-2' v-if='form.diseaseArrays?.includes(1)'> + <div class='label-title lh-24'>经常吸入二手烟(家中有吸烟者,且经常吸入二手烟)</div> + <van-field + class='form-input mt-2' + style='padding: 0;background: #F5F5F5' + :rules='rules.secondSmoking' + > + <template #input> + <van-radio-group v-model='form.secondSmoking' + direction='horizontal' + shape="dot" + class='w-full doc-radio-group-now' + style='background: #F5F5F5' + > + <van-radio v-for="item in store.getDict('CP00120')" + :key='item.value' :name='item.value' + label-position='left'>{{ item.name }} + </van-radio> + </van-radio-group> + </template> + </van-field> + </div> + </div> + + <div v-if='blackSpinySkinShow'> + <div class='no-req-label mt-5'>黑棘皮病</div> + <van-field + class='no-back form-input mt-2' + style='padding: 0' + > + <template #input> + <van-radio-group v-model='form.blackSpinySkin' + direction='horizontal' + shape="dot" + class='w-full doc-radio-group'> + <van-radio v-for="item in store.getDict('CP00134')" + :key='item.value' :name='item.value' + label-position='left'>{{ item.name }} + </van-radio> + </van-radio-group> + </template> + </van-field> + </div> + + <div v-if='mentalTensionShow'> + <div class='no-req-label mt-5'>长期精神紧张</div> + <van-field + class='no-back form-input mt-2' + style='padding: 0' + > + <template #input> + <van-radio-group v-model='form.mentalTension' + direction='horizontal' + shape="dot" + class='w-full doc-radio-group'> + <van-radio v-for="item in store.getDict('CP00135')" + :key='item.value' :name='item.value' + label-position='left'>{{ item.name }} + </van-radio> + </van-radio-group> + </template> + </van-field> + </div> + + <div v-if='xanthomaShow'> + <div class='no-req-label mt-5'>皮肤或肌腱黄色瘤</div> + <van-field + class='no-back form-input mt-2' + style='padding: 0' + > + <template #input> + <van-radio-group v-model='form.xanthoma' + direction='horizontal' + shape="dot" + class='w-full doc-radio-group'> + <van-radio v-for="item in store.getDict('CP00135')" + :key='item.value' :name='item.value' + label-position='left'>{{ item.name }} + </van-radio> + </van-radio-group> + </template> + </van-field> + </div> + + <div v-if='tendoIncrassationShow'> + <div class='no-req-label mt-5'>跟腱增厚</div> + <van-field + class='no-back form-input mt-2' + style='padding: 0' + > + <template #input> + <van-radio-group v-model='form.tendoIncrassation' + direction='horizontal' + shape="dot" + class='w-full doc-radio-group'> + <van-radio v-for="item in store.getDict('CP00120')" + :key='item.value' :name='item.value' + label-position='left'>{{ item.name }} + </van-radio> + </van-radio-group> + </template> + </van-field> + </div> + + <div v-if='riskScoreShow'> + <div class='no-req-label mt-5'>中国糖尿病风险评分</div> + <van-field + class='no-back form-input mt-2' + style='padding: 0' + > + <template #input> + <van-radio-group v-model='riskScoreInfo' + direction='horizontal' + shape="dot" + class='w-full doc-radio-group'> + <van-radio v-for="item in store.getDict('CP00136')" + :key='item.value' :name='item.value' + label-position='left'>{{ item.name }} + </van-radio> + </van-radio-group> + </template> + </van-field> + </div> + + <div> + <div class='no-req-label mt-5'>知情同意书</div> + <DocImageUpload + description='支持上传jpg、png、jpeg文件,大小请在10M以内' + lengthMessage='抱歉,最多可上传6个文件。' + :imageData='[]' + @change='(ids, option) => form.informedConsent = ids' + :maxLength='6' + class='mt-2' + /> + </div> + + <div> + <div class='label-title lh-24'>专病高危评估结果</div> + <van-field + class='form-input mt-2' + style='padding: 0' + > + <template #input> + <div class='flex gap-x-2.5 gap-y-2.5 w-full flex-wrap' style='background: #FFFFFF'> + <div v-for="(item, index) in store.getDict('CP00137')" :key='item.value' class='bg-ff'> + <div + @click='toggleResult(item)' + :class="['form-input', 'bg-fa', this.specialScreenResultSelect.includes(item.value) ? 'active-drinkKind' : '' ]" + > + <div>{{ item.name }}</div> + </div> + </div> + + </div> + </template> + </van-field> + </div> + </van-form> + </div> +</template> + +<script> + +import { useStore } from '@/doctor/store' +import { checkboxReject, fetchDataHandle } from '@/utils/common' +import CheckBtn from '@/doctor/components/checkBtn/CheckBtn' +import BloodPressureBt from '@/doctor/components/bloodPressure/BloodPressureBt' +import BloodPressurePanel from '@/doctor/components/bloodPressure/BloodPressurePanel' +import DocImageUpload from '@/doctor/components/docImageUpload/DocImageUpload' + +const defaultForm = (info = {}) => { + const form = { + id: undefined, + residentInfoId: undefined, + diseaseArrays: [], + currentAge: undefined, + gender: undefined, + genderName: undefined, + medicalHistory: [], + medicalHistoryName: undefined, + familyHistory: [], + relativeType: undefined, + height: undefined, + weight: undefined, + bmi: undefined, + waistline: undefined, + exerciseFrequency: undefined, + exerciseFrequencyName: undefined, + everyExercise: undefined, + femaleMedicalHistory: undefined, + femaleMedicalHistoryName: undefined, + hdlCholesterin: undefined, + triglyceride: undefined, + serumCholesterin: undefined, + touchHarmful: [], + touchHarmfulName: undefined, + pressureOneSbp: undefined, + pressureOneDbp: undefined, + pressureTwoSbp: undefined, + pressureTwoDbp: undefined, + dietaryHabit: [], + dietaryHabitName: undefined, + drinkFrequency: undefined, + startDrinkAge: undefined, + drinkKind: [], + drinkKindOther: undefined, + dayDrink: undefined, + giveDrink: undefined, + giveDrinkStart: undefined, + // 吸烟情况 + isSmoking: undefined, + daySmoking: undefined, + startSmoking: undefined, + secondSmoking: undefined, + // 戒烟年龄 + giveSmokingAge: undefined, + blackSpinySkin: undefined, + mentalTension: undefined, + xanthoma: undefined, + tendoIncrassation: undefined, + riskScore: undefined, + specialScreenResult: [], + hypertensionHighItem: [], + diabetesHighItem: [], + coronaryHighItem: [], + strokeHighItem: [], + pulmonaryHighItem: [], + nephrosisHighItem: [], + dyslipemiaHighItem: [], + // 日饮酒量 + drinkKindCapacityList: [], + diseaseRelativeList: [], + mediumStrength: undefined, + medicineHistory: [], + medicineHistoryName: undefined, + informedConsent: undefined, + isExerciseFive: undefined + } + Reflect.ownKeys(form).forEach(key => { + if (info[key] != undefined) { + form[key] = info[key] + } + }) + return form +} +export default { + components: { DocImageUpload, BloodPressurePanel, BloodPressureBt, CheckBtn }, + props: { + info: Object, + diseaseArraysInfo: Array + }, + inject: ['pressureObj'], + data() { + return { + store: useStore(), + //病史弹窗 + showMedicalHistory: false, + //女性病史 + showFemaleMedicalHistory: false, + //用药史 + showMedicineHistory: false, + //有害物质接触或婴幼儿时期病史 + showTouchHarmful: false, + //饮食习惯 + showDietaryHabit: false, + //锻炼频率 + showExerciseFrequency: false, + + checkboxRefs: [], + checkboxDrinkRefs: [], + form: {}, + formRight: { + hypertensionHighItemSelect: [], + diabetesHighItemSelect: [], + coronaryHighItemSelect: [], + strokeHighItemSelect: [], + pulmonaryHighItemSelect: [], + nephrosisHighItemSelect: [], + dyslipemiaHighItemSelect: [] + }, + specialScreenResultSelect: [], + riskScoreInfo: undefined, + // 饮酒种类及饮用量关系 + drinkKindCapacityList: [], + familyHistoryList: [], + imageData: [], + rules: { + diseaseArrays: [{ required: true, message: '请选择' }], + medicalHistoryName: [{ required: true, message: '请选择' }], + familyHistory: [{ required: true, message: '请选择' }], + height: [ + { required: true, message: '请输入' }, + { + validator: (value, rule) => { + let res = true + const regex = /^\d+(\.\d{1})?$/ + if (value && !(Number(value) >= 10 && Number(value) <= 300 && regex.test(Number(value)))) { + res = false + } + return res + }, + message: `请输入10到300之间的数字,允许一位小数` + } + ], + weight: [ + { required: true, message: '请输入' }, + { + validator: (value, rule) => { + let res = true + const regex = /^\d+(\.\d{1,2})?$/ + if (value && !(Number(value) >= 20 && Number(value) <= 500 && regex.test(Number(value)))) { + res = false + } + return res + }, + message: `请输入20~500之间数字,允许2位小数` + } + ], + waistline: [ + { required: true, message: '请输入' }, + { + validator: (value, rule) => { + let res = true + const regex = /^\d+(\.\d{1})?$/ + if (value && !(Number(value) >= 10 && Number(value) <= 150 && regex.test(Number(value)))) { + res = false + } + return res + }, + message: `请输入10~150之间数字,允许1位小数` + } + ], + hdlCholesterin: [{ + validator: (value, rule) => { + const regex = /^\d+(\.\d{1,2})?$/ + let res = true + if (value && !regex.test(value)) { + res = false + } + return res + }, + message: `请输入正确的数字` + }], + triglyceride: [{ + validator: (value, rule) => { + const regex = /^\d+(\.\d{1,2})?$/ + let res = true + if (value && !regex.test(value)) { + res = false + } + return res + }, + message: `请输入正确的数字` + }], + serumCholesterin: [{ + validator: (value, rule) => { + const regex = /^\d+(\.\d{1,2})?$/ + let res = true + if (value && !regex.test(value)) { + res = false + } + return res + }, + message: `请输入正确的数字` + }], + exerciseFrequencyName: [{ required: true, message: '请选择' }], + dietaryHabitName: [{ required: true, message: '请选择' }], + drinkFrequency: [{ required: true, message: '请选择' }], + isSmoking: [{ required: true, message: '请选择' }], + specialScreenResult: [{ required: true, message: '请选择' }], + secondSmoking: [{ required: true, message: '请选择' }], + drinkKind: [{ required: true, message: '请选择' }], + startDrinkAge: [{ required: true, message: '请输入' }], + giveDrink: [{ required: true, message: '请选择' }], + giveDrinkStart: [{ required: true, message: '请输入' }], + giveSmokingAge: [{ required: true, message: '请输入' }], + startSmoking: [{ required: true, message: '请输入' }], + daySmoking: [{ required: true, message: '请输入' }], + everyExercise: [{ required: true, message: '请输入' }], + mediumStrength: [{ required: true, message: '请选择' }] + } + } + }, + computed: { + //判断年龄显示隐藏 + ageShow() { + let res = false + const { diseaseArrays = [] } = this.form + if (diseaseArrays.includes(1) || diseaseArrays.includes(2) || diseaseArrays.includes(3) + || diseaseArrays.includes(5) || diseaseArrays.includes(6)) { + res = true + } + return res + }, + //判断性别显示隐藏 + sexShow() { + let res = false + const { diseaseArrays = [] } = this.form + if (diseaseArrays.includes(3)) { + res = true + } + return res + }, + //判断病史显示隐藏 + medicalHistoryShow() { + let res = false + const { diseaseArrays = [] } = this.form + if (diseaseArrays.includes(1) || diseaseArrays.includes(2) || diseaseArrays.includes(3) || diseaseArrays.includes(4) + || diseaseArrays.includes(5) || diseaseArrays.includes(6) || diseaseArrays.includes(7)) { + res = true + } + return res + }, + //判断家族史显示隐藏 + familyHistoryShow() { + let res = false + const { diseaseArrays = [] } = this.form + if (diseaseArrays.includes(1) || diseaseArrays.includes(2) || diseaseArrays.includes(3) || diseaseArrays.includes(4) + || diseaseArrays.includes(5) || diseaseArrays.includes(6) || diseaseArrays.includes(7)) { + res = true + } + return res + }, + //判断身高、体重、BMI显示隐藏 + highShow() { + let res = false + const { diseaseArrays = [] } = this.form + if (diseaseArrays.includes(1) || diseaseArrays.includes(2) || diseaseArrays.includes(4) + || diseaseArrays.includes(6) || diseaseArrays.includes(7)) { + res = true + } + return res + }, + //判断腰围显示隐藏 + waistShow() { + let res = false + const { diseaseArrays = [] } = this.form + if (diseaseArrays.includes(1) || diseaseArrays.includes(2)) { + res = true + } + return res + }, + //判断锻炼频率显示隐藏 + exerciseShow() { + let res = false + const { diseaseArrays = [] } = this.form + if (diseaseArrays.includes(1) || diseaseArrays.includes(2) || diseaseArrays.includes(4)) { + res = true + } + return res + }, + //判断女性病史显示隐藏 + womanMHShow() { + let res = false + const { diseaseArrays = [] } = this.form + if (diseaseArrays.includes(2)) { + res = true + } + return res + }, + //判断用药史显示隐藏 + medicationHShow() { + let res = false + const { diseaseArrays = [] } = this.form + if (diseaseArrays.includes(2) || diseaseArrays.includes(4) || diseaseArrays.includes(6)) { + res = true + } + return res + }, + //判断高密度脂蛋白胆固醇、甘油三酯、总胆固醇显示隐藏 + triglycerideShow() { + let res = false + const { diseaseArrays = [] } = this.form + if (diseaseArrays.includes(2)) { + res = true + } + return res + }, + //判断有害物质接触或婴幼儿时期病史显示隐藏 + babyMHShow() { + let res = false + const { diseaseArrays = [] } = this.form + if (diseaseArrays.includes(5)) { + res = true + } + return res + }, + //判断血压显示隐藏 + bloodPressureShow() { + let res = false + const { diseaseArrays = [] } = this.form + if (diseaseArrays.includes(1)) { + res = true + } + return res + }, + //判断饮食习惯显示隐藏 + eatHabitShow() { + let res = false + const { diseaseArrays = [] } = this.form + if (diseaseArrays.includes(1)) { + res = true + } + return res + }, + //判断饮酒情况显示隐藏 + drinkShow() { + let res = false + const { diseaseArrays = [] } = this.form + if (diseaseArrays.includes(1)) { + res = true + } + return res + }, + //判断吸烟情况显示隐藏 + smokeShow() { + let res = false + const { diseaseArrays = [] } = this.form + if (diseaseArrays.includes(1) || diseaseArrays.includes(3) || diseaseArrays.includes(4) || diseaseArrays.includes(5) || diseaseArrays.includes(7)) { + res = true + } + return res + }, + //判断黑棘皮病显示隐藏 + blackSpinySkinShow() { + let res = false + const { diseaseArrays = [] } = this.form + if (diseaseArrays.includes(2)) { + res = true + } + return res + }, + //判断长期精神紧张显示隐藏 + mentalTensionShow() { + let res = false + const { diseaseArrays = [] } = this.form + if (diseaseArrays.includes(1)) { + res = true + } + return res + }, + //判断皮肤或肌腱黄色瘤显示隐藏 + xanthomaShow() { + let res = false + const { diseaseArrays = [] } = this.form + if (diseaseArrays.includes(7)) { + res = true + } + return res + }, + //判断跟腱增厚显示隐藏 + tendoIncrassationShow() { + let res = false + const { diseaseArrays = [] } = this.form + if (diseaseArrays.includes(7)) { + res = true + } + return res + }, + //判断中国糖尿病风险评分显示隐藏 + riskScoreShow() { + let res = false + const { diseaseArrays = [] } = this.form + if (diseaseArrays.includes(2)) { + res = true + } + return res + }, + //生成病史选择项 + medicalHistoryList() { + //默认为无 + let result = [] + let res = [99] + let list = this.store.getDict('CP00125') + const { diseaseArrays = [] } = this.form + if (diseaseArrays.includes(1)) { + let arr = [1, 2, 7] + res = [ + ...res, + ...arr + ] + } + if (diseaseArrays.includes(2)) { + let arr = [3, 5, 18, 19] + res = [ + ...res, + ...arr + ] + } + if (diseaseArrays.includes(3)) { + let arr = [1, 2, 7] + res = [ + ...res, + ...arr + ] + } + if (diseaseArrays.includes(4)) { + let arr = [2, 7, 16, 17] + res = [ + ...res, + ...arr + ] + } + if (diseaseArrays.includes(5)) { + let arr = [8, 9, 10, 11] + res = [ + ...res, + ...arr + ] + } + if (diseaseArrays.includes(6)) { + let arr = [1, 2, 3, 5, 12, 13, 14, 15] + res = [ + ...res, + ...arr + ] + } + if (diseaseArrays.includes(7)) { + let arr = [1, 2, 3, 5] + res = [ + ...res, + ...arr + ] + } + res = Array.from(new Set(res)) + list.forEach(item1 => { + res.forEach(item2 => { + if (item1.value == item2) { + result.push(item1) + } + }) + }) + return result + }, + //生成家族史选择项 + familyHistoryInfoList() { + //默认为无 + let result = [] + let res = [9] + let list = this.store.getDict('CP00149') + const { diseaseArrays = [] } = this.form + if (diseaseArrays.includes(1)) { + let arr = [2] + res = [ + ...res, + ...arr + ] + } + if (diseaseArrays.includes(2)) { + let arr = [1] + res = [ + ...res, + ...arr + ] + } + if (diseaseArrays.includes(3)) { + let arr = [3] + res = [ + ...res, + ...arr + ] + } + if (diseaseArrays.includes(4)) { + let arr = [4] + res = [ + ...res, + ...arr + ] + } + if (diseaseArrays.includes(5)) { + let arr = [5] + res = [ + ...res, + ...arr + ] + } + if (diseaseArrays.includes(6)) { + let arr = [6] + res = [ + ...res, + ...arr + ] + } + if (diseaseArrays.includes(7)) { + let arr = [7] + res = [ + ...res, + ...arr + ] + } + res = Array.from(new Set(res)) + list.forEach(item1 => { + res.forEach(item2 => { + if (item1.value == item2) { + result.push(item1) + } + }) + }) + return result + }, + //生成用药史选择项 + medicineHistoryList() { + //默认为无 + let result = [] + let res = [] + let list = this.store.getDict('CP00129') + const { diseaseArrays = [] } = this.form + if (diseaseArrays.includes(2)) { + let arr = [1, 2, 3, 4] + res = [ + ...res, + ...arr + ] + } + if (diseaseArrays.includes(4)) { + let arr = [1] + res = [ + ...res, + ...arr + ] + } + if (diseaseArrays.includes(6)) { + let arr = [5] + res = [ + ...res, + ...arr + ] + } + res = Array.from(new Set(res)) + list.forEach(item1 => { + res.forEach(item2 => { + if (item1.value == item2) { + result.push(item1) + } + }) + }) + return result + }, + //锻炼频率单选list (pc端两个字典,移动端则合为一个字典提交时在分开为两个字段) + exerciseFrequencyList() { + let res = [] + let listOne = this.store.getDict(`CP00126`) + // let listTwo = this.store.getDict(`CP00163`) + let listTwo = [ + { value: 5, name: '每周5次及以上' }, + { value: 6, name: '每周不到5次' } + ] + return res = [...listOne, ...listTwo] + + } + }, + watch: { + 'info': { + handler() { + this.initForm() + }, + immediate: true + }, + diseaseArraysInfo: { + handler() { + this.form.diseaseArrays = this.diseaseArraysInfo + } + }, + 'form': { + handler(now, old) { + if (Object.keys(old).length === 0) return + this.formChangeHandle() + }, + deep: true + }, + 'form.height': { + handler() { + this.calculateBMI() + } + }, + 'form.weight': { + handler() { + this.calculateBMI() + } + }, + //右侧高危选项变化监测 + 'formRight': { + handler(now, old) { + if (Object.keys(old).length === 0) return + this.changeFormRightHandle() + }, + deep: true + }, + // 计算日均饮酒量 + drinkKindCapacityList: { + handler(val) { + if (!val) { + this.form.dayDrink = 0 + return + } + let num = 0 + val.forEach(e => { + if (e.drinkKind == 2) { // 啤酒 + num = num + e.drinkCapacity * 0.1 + } else if (e.drinkKind == 3) { // 红酒 + num = num + e.drinkCapacity * 0.25 + } else if (e.drinkKind == 4) { // 黄酒 + num = num + e.drinkCapacity * 0.2 + } else { + num = num + e.drinkCapacity + } + + }) + this.form.dayDrink = Math.round(num * 100) / 100 + }, + deep: true + }, + //家族史 + 'form.familyHistory': { + handler() { + //非空校验 + this.familyHistoryReq() + } + }, + 'familyHistoryList': { + handler(now, old) { + if (old.length == 0) return + if (this.form.diseaseArrays?.includes(3)) { + this.coronaryHigh() + } + //非空校验 + this.familyHistoryReq() + }, + deep: true + }, + //病种变更监听 + 'form.diseaseArrays': { + handler(val = []) { + const option = this.store.getDict('CP00117') + this.cleanFormRight() + this.cleanMedicalHistory() + this.cleanFamilyHistory() + this.cleanMedicineHistory() + this.changeFamilyHis() + }, + immediate: true + } + }, + methods: { + checkboxReject, + //初始化表单 + initForm() { + this.form = defaultForm(this.info) + if (this.info.isExerciseFive == 1) { + this.form.exerciseFrequency = 5 + } + if (this.info.isExerciseFive == 2) { + this.form.exerciseFrequency = 6 + } + if (!this.info.id) { + //是否是引用上一次复筛数据 + if (this.info.flag && this.info.flag == 'lastInfo') { + this.setUpdateInfo() + } else {//新增时 + this.form.diseaseArrays = [1, 2, 3, 4, 5, 6, 7] + } + } else { + this.setUpdateInfo() + } + }, + //修改时 或者引用上一次复筛数据时赋值 + setUpdateInfo() { + this.formRight.hypertensionHighItemSelect = this.form.hypertensionHighItem || [] + this.formRight.diabetesHighItemSelect = this.form.diabetesHighItem || [] + this.formRight.coronaryHighItemSelect = this.form.coronaryHighItem || [] + this.formRight.strokeHighItemSelect = this.form.strokeHighItem || [] + this.formRight.pulmonaryHighItemSelect = this.form.pulmonaryHighItem || [] + this.formRight.nephrosisHighItemSelect = this.form.nephrosisHighItem || [] + this.formRight.dyslipemiaHighItemSelect = this.form.dyslipemiaHighItem || [] + this.drinkKindCapacityList = this.form.drinkKindCapacityList || [] + this.familyHistoryList = this.form.diseaseRelativeList || [] + + //修改时若中国糖尿病风险评分、专病高危评估结果存在时 以用户选择的结果为主展示 + //利用setTimeout改变值的赋值顺序让这两个值在watch事件结束后再被赋值 + setTimeout(() => { + this.riskScoreInfo = this.form.riskScore + this.specialScreenResultSelect = this.form.specialScreenResult || [9] + }, 0) + + this.imageData = this.info.informedConsentUrl + }, + //表单触发事件 + formChangeHandle() { + //高血压 + if (this.form.diseaseArrays?.includes(1)) { + this.hypertensionHigh() + } + //糖尿病 + if (this.form.diseaseArrays?.includes(2)) { + this.diabetesHigh() + //糖尿病风险 + this.diabetesHighCompute() + } + //冠心病 + if (this.form.diseaseArrays?.includes(3)) { + this.coronaryHigh() + } + //脑卒中 + if (this.form.diseaseArrays?.includes(4)) { + this.strokeHigh() + } + //慢阻肺 + if (this.form.diseaseArrays?.includes(5)) { + this.pulmonaryHigh() + } + //慢性肾病 + if (this.form.diseaseArrays?.includes(6)) { + this.nephrosisHigh() + } + //血脂异常 + if (this.form.diseaseArrays?.includes(7)) { + this.dyslipemiaHigh() + } + }, + //右侧高危选项触发事件 + changeFormRightHandle() { + let list = [] + const { + hypertensionHighItemSelect = [], + diabetesHighItemSelect = [], + coronaryHighItemSelect = [], + strokeHighItemSelect = [], + pulmonaryHighItemSelect = [], + nephrosisHighItemSelect = [], + dyslipemiaHighItemSelect = [] + } = this.formRight + //高血压高危选项 + if (hypertensionHighItemSelect.length >= 3) { + list.push(1) + } + //糖尿病高危选项 + if (diabetesHighItemSelect.length >= 1) { + list.push(2) + } + //冠心病高危选项 + if (coronaryHighItemSelect.length >= 3) { + list.push(3) + } + //脑卒中高危选项 + if (strokeHighItemSelect.length >= 3) { + list.push(4) + } + //慢阻肺高危选项 + if (pulmonaryHighItemSelect.length >= 1) { + list.push(5) + } + //慢性肾脏病高危选项 + if (nephrosisHighItemSelect.length >= 2) { + list.push(6) + } + //血脂异常高危选项 + if (dyslipemiaHighItemSelect.length >= 1) { + list.push(7) + } + //不满足高危病种时默认为无 + if (!list.length) { + list = [9] + } + list = Array.from(new Set(list)) + this.specialScreenResultSelect = list + // this.form.specialScreenResult = this.specialScreenResultSelect + }, + //清洗右侧高危选项表单 + cleanFormRight() { + if (!this.form.diseaseArrays?.includes(1)) { + this.formRight.hypertensionHighItemSelect = [] + } + if (!this.form.diseaseArrays?.includes(2)) { + this.formRight.diabetesHighItemSelect = [] + } + if (!this.form.diseaseArrays?.includes(3)) { + this.formRight.coronaryHighItemSelect = [] + } + if (!this.form.diseaseArrays?.includes(4)) { + this.formRight.strokeHighItemSelect = [] + } + if (!this.form.diseaseArrays?.includes(5)) { + this.formRight.pulmonaryHighItemSelect = [] + } + if (!this.form.diseaseArrays?.includes(6)) { + this.formRight.nephrosisHighItemSelect = [] + } + if (!this.form.diseaseArrays?.includes(7)) { + this.formRight.dyslipemiaHighItemSelect = [] + } + }, + //清洗病史的选择数据(去掉不存在的病种对应的选项选择) + cleanMedicalHistory() { + if (!this.form.diseaseArrays.length) { + this.form.medicalHistory = [] + } else { + if (this.form.medicalHistory && this.form.medicalHistory.length) { + let res = [] + this.medicalHistoryList.forEach(item => { + res.push(item.value) + }) + let list = this.form.medicalHistory.filter(item => { + return res.includes(item) + } + ) || [] + this.form.medicalHistory = list + } + } + + }, + //清洗家族史的选择数据 + cleanFamilyHistory() { + if (!this.form.diseaseArrays.length) { + this.form.familyHistory = [] + } else { + if (this.form.familyHistory && this.form.familyHistory.length) { + let res = [] + this.familyHistoryInfoList.forEach(item => { + res.push(item.value) + }) + let list = this.form.familyHistory.filter(item => { + return res.includes(item) + } + ) || [] + this.form.familyHistory = list + } + } + }, + //清洗用药史的选择数据 + cleanMedicineHistory() { + if (!this.form.diseaseArrays.length) { + this.form.medicineHistory = [] + } else { + if (this.form.medicineHistory && this.form.medicineHistory.length) { + let res = [] + this.medicineHistoryList.forEach(item => { + res.push(item.value) + }) + let list = this.form.medicineHistory.filter(item => { + return res.includes(item) + } + ) || [] + this.form.medicineHistory = list + } + } + }, + changeFamilyHis() { + this.form.familyHistory = this.checkboxReject(this.form.familyHistory, [9]) + let temp = [] + this.form.familyHistory.forEach((item, index) => { + if (item == 1 || item == 3 || item == 5 || item == 7) { + let name = this.store.getDictValue(this.store.getDict('CP00149'), item) + let base = this.familyHistoryList.filter(item1 => item1.diseaseType == item) || [] + let obj = { + id_: index + 1, + diseaseTypeName: `${name}`, + diseaseType: item, + selectRelativeType: [], + checkRequired: false, + relativeAgeList: [ + { + relativeTypeName: '父亲', + relativeType: 1, + gender: 1, + age: undefined, + inputRequired: false + }, + { + relativeTypeName: '母亲', + relativeType: 2, + gender: 2, + age: undefined, + inputRequired: false + }, + { + relativeTypeName: '兄弟', + relativeType: 3, + gender: 1, + age: undefined, + inputRequired: false + }, + { + relativeTypeName: '姐妹', + relativeType: 4, + gender: 2, + age: undefined, + inputRequired: false + }, + { + relativeTypeName: '儿子', + relativeType: 5, + gender: 1, + age: undefined, + inputRequired: false + }, + { relativeTypeName: '女儿', relativeType: 6, gender: 2, age: undefined, inputRequired: false } + ] + } + if (base.length) { + obj = base[0] + } + temp.push(obj) + } + }) + this.familyHistoryList = temp + }, + calculateBMI() { + if (this.form.weight && this.form.height) { + let res = this.form.weight / (this.form.height * this.form.height / 100 / 100) + this.form.bmi = parseFloat(res.toFixed(1)) + } else { + this.form.bmi = null + } + }, + hypertensionHigh() { + const { + currentAge, + height = 0, + weight = 0, + waistline, + familyHistory = [], + isSmoking, + medicalHistory = [], + dietaryHabit = [], + pressureOneSbp, + pressureOneDbp, + pressureTwoSbp, + pressureTwoDbp, + dayDrink, + secondSmoking, + gender, + exerciseFrequency, + everyExercise, + mentalTension + } = this.form + let list = [] + if (((pressureOneSbp >= 120) || (pressureTwoSbp >= 120)) || + ((pressureOneDbp >= 80) || (pressureTwoDbp >= 80)) + ) { + list.push(1) + } + if (currentAge >= 45) { + list.push(2) + } + let res = weight / (height * height / 100 / 100) + let bmi = parseFloat(res.toFixed(1)) + if ((bmi >= 24) || + (gender == 2 && waistline >= 85) || + (gender == 1 && waistline >= 90)) { + list.push(3) + } + if (familyHistory.includes(2)) { + list.push(4) + } + if (dietaryHabit.includes(4)) { + list.push(5) + } + if (dayDrink >= 100) { + list.push(6) + } + if (isSmoking == 3 || secondSmoking == 1) { + list.push(7) + } + if (exerciseFrequency == 3 || exerciseFrequency == 4 || everyExercise < 30) { + list.push(8) + } + if (mentalTension == 2) { + list.push(9) + } + if (medicalHistory.includes(7)) { + list.push(10) + } + if (medicalHistory.includes(2)) { + list.push(11) + } + this.formRight.hypertensionHighItemSelect = Array.from(new Set(list)) + }, + diabetesHigh() { + let list = [] + const { + currentAge, + medicalHistory = [], + height = 0, + weight = 0, + waistline, + gender, + exerciseFrequency, + everyExercise, + familyHistory = [], + femaleMedicalHistory = [], + blackSpinySkin, + medicineHistory = [], + hdlCholesterin, + triglyceride + } = this.form + if (currentAge >= 40) { + list.push(1) + } + if (medicalHistory.includes(19)) { + list.push(2) + } + let res = weight / (height * height / 100 / 100) + let bmi = parseFloat(res.toFixed(1)) + if ((bmi >= 24) || + (gender == 2 && waistline >= 85) || + (gender == 1 && waistline >= 90)) { + list.push(3) + } + if (exerciseFrequency == 3 || exerciseFrequency == 4 || everyExercise < 30) { + list.push(4) + } + if (familyHistory.includes(1)) { + list.push(5) + } + if (femaleMedicalHistory.includes(1)) { + list.push(6) + } + if (femaleMedicalHistory.includes(3)) { + list.push(7) + } + if (blackSpinySkin == 2) { + list.push(8) + } + if (medicalHistory.includes(1) || medicineHistory.includes(1)) { + list.push(9) + } + if ((hdlCholesterin != null && hdlCholesterin < 0.9) || (triglyceride != null && triglyceride > 2.22) || medicineHistory.includes(2)) { + list.push(10) + } + if (medicalHistory.includes(3) || medicalHistory.includes(5)) { + list.push(11) + } + if (medicineHistory.includes(3)) { + list.push(12) + } + if (medicineHistory.includes(4)) { + list.push(13) + } + let socre = this.diabetesHighScore() + if (socre >= 25) { + list.push(14) + } + this.formRight.diabetesHighItemSelect = Array.from(new Set(list)) + }, + //冠心病高危选择 + coronaryHigh() { + let list = [] + const { currentAge, gender, isSmoking, medicalHistory = [], familyHistory = [] } = this.form + if (gender == 1) { + list.push(2) + if (currentAge >= 45) { + list.push(1) + } + } + if (gender == 2 && currentAge >= 55) { + list.push(1) + } + if (isSmoking == 3) { + list.push(3) + } + if (medicalHistory.includes(1)) { + list.push(4) + } + if (medicalHistory.includes(2)) { + list.push(5) + } + if (medicalHistory.includes(7)) { + list.push(6) + } + if (familyHistory.includes(3)) { + let obj = this.familyHistoryList.filter(item => item.diseaseType == 3)[0] || {} + let objList = obj.selectRelativeType || [] + let listArry = obj?.relativeAgeList || [] + let flag = 0 + listArry.forEach(item => { + if (item.gender == 1 && item.age && item.age < 55) { + flag++ + } + if (item.gender == 2 && item.age && item.age < 65) { + flag++ + } + }) + if (flag > 0 && objList.length) { + list.push(7) + } + } + this.formRight.coronaryHighItemSelect = Array.from(new Set(list)) + }, + strokeHigh() { + let list = [] + const { + medicalHistory = [], + medicineHistory = [], + isSmoking, + familyHistory = [], + exerciseFrequency, + everyExercise, + height = 0, + weight = 0 + } = this.form + if (medicalHistory.includes(1) || medicineHistory.includes(1)) { + list.push(1) + } + if (medicalHistory.includes(16) || medicalHistory.includes(17)) { + list.push(2) + } + if (isSmoking == 3) { + list.push(3) + } + if (medicalHistory.includes(7)) { + list.push(4) + } + if (medicalHistory.includes(2)) { + list.push(5) + } + if (exerciseFrequency == 3 || exerciseFrequency == 4 || everyExercise < 30) { + list.push(6) + } + let res = weight / (height * height / 100 / 100) + let bmi = parseFloat(res.toFixed(1)) + if (bmi >= 26) { + list.push(7) + } + if (familyHistory.includes(4)) { + list.push(8) + } + this.formRight.strokeHighItemSelect = Array.from(new Set(list)) + }, + pulmonaryHigh() { + let list = [] + const { + currentAge, + isSmoking, + secondSmoking, + medicalHistory = [], + familyHistory = [], + touchHarmful = [] + } = this.form + if (currentAge >= 35) { + list.push(1) + } + if (isSmoking == 3) { + list.push(2) + } + if (touchHarmful.includes(1)) { + list.push(3) + } + if (medicalHistory.includes(8)) { + list.push(4) + } + if (medicalHistory.includes(11)) { + list.push(5) + } + if (medicalHistory.includes(9)) { + list.push(6) + } + if (medicalHistory.includes(10)) { + list.push(7) + } + if (familyHistory.includes(5)) { + list.push(8) + } + if (touchHarmful.includes(4)) { + list.push(9) + } + if (touchHarmful.includes(2)) { + list.push(10) + } + if (touchHarmful.includes(3)) { + list.push(11) + } + if (touchHarmful.includes(5)) { + list.push(12) + } + if (touchHarmful.includes(6)) { + list.push(13) + } + if (touchHarmful.includes(7)) { + list.push(14) + } + this.formRight.pulmonaryHighItemSelect = Array.from(new Set(list)) + }, + nephrosisHigh() { + let list = [] + const { + currentAge, + familyHistory = [], + medicalHistory = [], + height = 0, + weight = 0, + medicineHistory = [] + } = this.form + if (currentAge > 65) { + list.push(1) + } + if (familyHistory.includes(6)) { + list.push(2) + } + if (medicalHistory.includes(2)) { + list.push(3) + } + if (medicalHistory.includes(1)) { + list.push(4) + } + if (medicalHistory.includes(3) || medicalHistory.includes(5)) { + list.push(5) + } + if (medicalHistory.includes(12)) { + list.push(6) + } + let res = weight / (height * height / 100 / 100) + let bmi = parseFloat(res.toFixed(1)) + if (bmi >= 28) { + list.push(7) + } + if (medicalHistory.includes(14) || medicalHistory.includes(15)) { + list.push(8) + } + if (medicineHistory.includes(5)) { + list.push(9) + } + if (medicalHistory.includes(13)) { + list.push(10) + } + this.formRight.nephrosisHighItemSelect = Array.from(new Set(list)) + }, + dyslipemiaHigh() { + let list = [] + const { + currentAge, + gender, + medicalHistory = [], + height = 0, + weight = 0, + isSmoking, + familyHistory = [], + xanthoma, + tendoIncrassation + } = this.form + if (medicalHistory.includes(3) || medicalHistory.includes(5)) { + list.push(1) + } + let res = weight / (height * height / 100 / 100) + let bmi = parseFloat(res.toFixed(1)) + if (medicalHistory.includes(1) || medicalHistory.includes(2) || bmi >= 28 || isSmoking == 3) { + list.push(2) + } + if (familyHistory.includes(3) || familyHistory.includes(4) || familyHistory.includes(7)) { + list.push(3) + } + if (xanthoma == 2) { + list.push(4) + } + if (tendoIncrassation == 1) { + list.push(5) + } + this.formRight.dyslipemiaHighItemSelect = Array.from(new Set(list)) + }, + + diabetesHighCompute() { + let score = this.diabetesHighScore() + if (score < 25) { + this.riskScoreInfo = 2 + } + if (score >= 25) { + this.riskScoreInfo = 1 + } + }, + + //糖尿病风险评分 + diabetesHighScore() { + let total = 0 + const { + currentAge, + height = 0, + weight = 0, + waistline, + gender, + familyHistory = [], + pressureOneSbp, + pressureTwoSbp + } = this.form + //年龄分数 + if (currentAge >= 20 && currentAge <= 24) { + total += 0 + } + if (currentAge >= 25 && currentAge <= 34) { + total += 4 + } + if (currentAge >= 35 && currentAge <= 39) { + total += 8 + } + if (currentAge >= 40 && currentAge <= 44) { + total += 11 + } + if (currentAge >= 45 && currentAge <= 49) { + total += 12 + } + if (currentAge >= 50 && currentAge <= 54) { + total += 13 + } + if (currentAge >= 55 && currentAge <= 59) { + total += 15 + } + if (currentAge >= 60 && currentAge <= 64) { + total += 16 + } + if (currentAge >= 65 && currentAge <= 74) { + total += 18 + } + //体质分数 + let res1 = weight / (height * height / 100 / 100) + let bmi = parseFloat(res1.toFixed(1)) + if (bmi < 22) { + total += 0 + } + if (bmi >= 22 && bmi <= 23.9) { + total += 1 + } + if (bmi >= 24 && bmi <= 29.9) { + total += 3 + } + if (bmi >= 30) { + total += 5 + } + //腰围分数 以及性别分数 + //男性 + if (gender == 1) { + total += 2 + if (waistline < 75) { + total += 0 + } + if (waistline >= 75 && waistline <= 79.9) { + total += 3 + } + if (waistline >= 80 && waistline <= 84.9) { + total += 5 + } + if (waistline >= 85 && waistline <= 89.9) { + total += 7 + } + if (waistline >= 90 && waistline <= 94.9) { + total += 8 + } + if (waistline >= 95) { + total += 10 + } + } + //女性 + if (gender == 2) { + total += 0 + if (waistline < 70) { + total += 0 + } + if (waistline >= 70 && waistline <= 74.9) { + total += 3 + } + if (waistline >= 75 && waistline <= 79.9) { + total += 5 + } + if (waistline >= 80 && waistline <= 84.9) { + total += 7 + } + if (waistline >= 85 && waistline <= 89.9) { + total += 8 + } + if (waistline >= 90) { + total += 10 + } + } + //糖尿病家族史 + if (familyHistory.includes(1)) { + total += 6 + } + //收缩压分数(取两次测试结果的最大值) + let pressureSbp = pressureTwoSbp || 0 + let res = Number(pressureOneSbp || 0) - Number(pressureTwoSbp || 0) + if (res > 0) { + pressureSbp = pressureOneSbp + } + if (pressureSbp < 110) { + total += 0 + } + if (pressureSbp >= 110 && pressureSbp <= 119) { + total += 1 + } + if (pressureSbp >= 120 && pressureSbp <= 129) { + total += 3 + } + if (pressureSbp >= 130 && pressureSbp <= 139) { + total += 6 + } + if (pressureSbp >= 140 && pressureSbp <= 149) { + total += 7 + } + if (pressureSbp >= 150 && pressureSbp <= 159) { + total += 8 + } + if (pressureSbp >= 160) { + total += 10 + } + return total + + }, + //家族史 非空校验 + familyHistoryReq() { + let flag = 0 + // this.familyHistoryList.forEach(item => { + // let list = item.selectRelativeType || [] + // if (!item.selectRelativeType.length) { + // item.checkRequired = true + // flag++ + // } else { + // item.checkRequired = false + // } + // item.relativeAgeList.forEach(item1 => { + // if (list.includes(item1.relativeType) && !item1.age) { + // item1.inputRequired = true + // flag++ + // } else { + // item1.inputRequired = false + // } + // if (!list.includes(item1.relativeType)) { + // item1.age = undefined + // } + // }) + // }) + return flag + }, + // 饮酒种类变化 + drinkKindChange(val = [], option) { + // console.log(val, option) + this.drinkKindCapacityList = val.map(e => { + const item = this.drinkKindCapacityList.find(i => i.drinkKind == e) || {} + return { + drinkKind: e, + drinkKindName: this.store.getDictValue('CP00133', e), + drinkCapacity: item.drinkCapacity || 0 + } + }) + }, + drinkFrequencyChange() { + const val = this.form.drinkFrequency + if (!val || val == 1) { + this.drinkKindCapacityList = [] + } + }, + + //锻炼频率弹窗确认选择 + exerciseFrequencyConfirm() { + this.exerciseFrequencyList.forEach(item => { + if (item.value == this.form.exerciseFrequency) { + this.form.exerciseFrequencyName = item.name + } + }) + this.showExerciseFrequency = false + }, + //病史弹窗确认选择 + medicalHistoryConfirm() { + let res = [] + this.medicalHistoryList.forEach(item => { + let selected = this.form.medicalHistory.filter(i => i == item.value) + if (selected && selected.length) { + res.push(item.name) + } + }) + this.form.medicalHistoryName = res.join() + this.showMedicalHistory = false + }, + //女性病史弹窗确认选择 + femaleMedicalHistoryConfirm() { + let res = [] + this.store.getDict('CP00127').forEach(item => { + let selected = this.form.femaleMedicalHistory.filter(i => i == item.value) + if (selected && selected.length) { + res.push(item.name) + } + }) + this.form.femaleMedicalHistoryName = res.join() + this.showFemaleMedicalHistory = false + }, + //用药史弹窗确认选择 + medicineHistoryConfirm() { + let res = [] + this.medicineHistoryList.forEach(item => { + let selected = this.form.medicineHistory.filter(i => i == item.value) + if (selected && selected.length) { + res.push(item.name) + } + }) + this.form.medicineHistoryName = res.join() + this.showMedicineHistory = false + }, + //有害物质接触或婴幼儿时期病史弹窗确认选择 + touchHarmfulConfirm() { + let res = [] + this.store.getDict('CP00130').forEach(item => { + let selected = this.form.touchHarmful.filter(i => i == item.value) + if (selected && selected.length) { + res.push(item.name) + } + }) + this.form.touchHarmfulName = res.join() + this.showTouchHarmful = false + }, + //饮食习惯弹窗确认选择 + dietaryHabitConfirm() { + let res = [] + this.store.getDict('CP00131').forEach(item => { + let selected = this.form.dietaryHabit.filter(i => i == item.value) + if (selected && selected.length) { + res.push(item.name) + } + }) + this.form.dietaryHabitName = res.join() + this.showDietaryHabit = false + }, + //血压仪器测量 + setPressureOne(val) { + if (!val) return + this.form.pressureOneSbp = val.systolicPressure + this.form.pressureOneDbp = val.diastolicPressure + }, + setPressureTwo(val) { + if (!val) return + this.form.pressureTwoSbp = val.systolicPressure + this.form.pressureTwoDbp = val.diastolicPressure + }, + + //家族史多选 + toggle(index) { + this.checkboxRefs[index].toggle() + this.changeFamilyHis() + }, + //饮酒种类 + toggleDrink(val) { + if (this.form.drinkKind.includes(val.value)) { + this.form.drinkKind = this.form.drinkKind.filter(e => e !== val.value) + } else { + this.form.drinkKind.push(val.value) + } + this.drinkKindChange(this.form.drinkKind) + }, + //专病高危评估结果 + toggleResult(val) { + if (this.specialScreenResultSelect.includes(val.value)) { + this.specialScreenResultSelect = this.specialScreenResultSelect.filter(e => e !== val.value) + } else { + this.specialScreenResultSelect.push(val.value) + } + this.specialScreenResultSelect = this.checkboxReject(this.specialScreenResultSelect, [9]) + // this.form.specialScreenResult = this.specialScreenResultSelect + }, + //提交 + onSubmit() { + return new Promise((resolve, reject) => { + this.$refs.form.validate().then(() => { + + if (!this.specialScreenResultSelect.length) { + this.$message.info('请选择专病高危评估结果') + return + } + let exerciseFrequencyInfo = '' + let isExerciseFiveInfo = '' + const { exerciseFrequency } = this.form + if (exerciseFrequency == 5) { + exerciseFrequencyInfo = 1 + isExerciseFiveInfo = 1 + } else if (exerciseFrequency == 6) { + exerciseFrequencyInfo = 1 + isExerciseFiveInfo = 2 + } else { + exerciseFrequencyInfo = exerciseFrequency + } + let res = { + ...this.form, + + exerciseFrequency: exerciseFrequencyInfo, + isExerciseFive: isExerciseFiveInfo, + + hypertensionHighItem: this.formRight.hypertensionHighItemSelect, + diabetesHighItem: this.formRight.diabetesHighItemSelect, + coronaryHighItem: this.formRight.coronaryHighItemSelect, + strokeHighItem: this.formRight.strokeHighItemSelect, + pulmonaryHighItem: this.formRight.pulmonaryHighItemSelect, + nephrosisHighItem: this.formRight.nephrosisHighItemSelect, + dyslipemiaHighItem: this.formRight.dyslipemiaHighItemSelect, + specialScreenResult: this.specialScreenResultSelect, + drinkKindCapacityList: this.drinkKindCapacityList, + diseaseRelativeList: this.familyHistoryList, + riskScore: this.riskScoreInfo + } + resolve( + fetchDataHandle(res, { + diseaseArrays: 'arrToStr', + medicalHistory: 'arrToStr', + familyHistory: 'arrToStr', + relativeType: 'arrToStr', + femaleMedicalHistory: 'arrToStr', + medicineHistory: 'arrToStr', + touchHarmful: 'arrToStr', + dietaryHabit: 'arrToStr', + drinkKind: 'arrToStr', + specialScreenResult: 'arrToStr', + highItem: 'arrToStr', + hypertensionHighItem: 'arrToStr', + diabetesHighItem: 'arrToStr', + coronaryHighItem: 'arrToStr', + strokeHighItem: 'arrToStr', + pulmonaryHighItem: 'arrToStr', + nephrosisHighItem: 'arrToStr', + dyslipemiaHighItem: 'arrToStr' + }) + ) + }).catch((e) => { + console.warn('FormCont error', e) + }) + }) + } + + } + +} +</script> + +<style lang='less' scoped> +.title { + font-weight: bold; + margin-bottom: 20px; +} + +.label-title { + font-size: 13px; + color: #595959; + font-weight: 500; + + &::after { + content: "*"; + color: red; + font-weight: bold; + margin-left: 4px; + } +} + +.no-req-label { + font-size: 13px; + color: #595959; + font-weight: 500; +} + +.form-input { + padding: 8px 12px; + border-radius: 8px; +} + +.input-back { + background: #FAFAFA; +} + +.pop-title { + color: #262626; + font-size: 16px; + line-height: 24px; + font-weight: bold; +} + +.checkbox-his { + padding: 0px !important; + margin-top: 4px; +} + +.relation-bis { + background: #F5F5F5; + padding: 8px 12px; + border-radius: 0px 0px 8px 8px; + + .top-title { + color: #8C8C8C; + font-size: 12px; + line-height: 24px; + margin-bottom: 4px; + } +} + +.bg-fa { + background: #FAFAFA; + border-radius: 8px; + padding: 8px; +} + +.bg-ff { + background: #FFFFFF; + border-radius: 8px; +} + +.bg-f5 { + background: #F5F5F5; + border-radius: 8px; + padding: 8px; +} + +.doc-radio-group-now { + column-gap: 10px; + row-gap: 10px; + background-color: #FAFAFA; + + .van-radio { + background-color: #FFFFFF; + width: 48%; + padding: 8px 12px; + border-radius: 8px; + justify-content: space-between; + margin-right: 0; + flex-grow: 1; + } +} + +.active-drinkKind { + //border: 1px solid var(--van-primary-color); + background-color: #F0F6FF; + color: var(--van-primary-color); +} + +.lh-24 { + line-height: 24px; +} + +:deep(.van-popup) { + height: 50% !important; +} + +:deep(.van-cell-group--inset) { + overflow: visible; +} + +:deep(.van-cell) { + overflow: visible; +} + +:deep(.van-cell:after) { + border-bottom: 0px; +} +</style> diff --git a/src/doctor/screening/highVisit/second/Result.vue b/src/doctor/screening/highVisit/second/Result.vue new file mode 100644 index 0000000000000000000000000000000000000000..91f7d448d60e9a2c01c67e4b31f7acd776964b70 --- /dev/null +++ b/src/doctor/screening/highVisit/second/Result.vue @@ -0,0 +1,52 @@ +<template> + <div class="screening-first-result text-center pt-3 px-3"> + <doc-icon type="doc-check-circle" style="font-size: .46rem;"/> + <div class="mt-3">随访完成</div> + <div class="text-start mt-5"> + <span style="color: #595959;">通过随访,您的慢病高危评估结果为:</span> + <div class="text-red mt-2" style='line-height: 24px'>{{specialScreenResultList.join("、")}}</div> + </div> + <div style="margin-top: .48rem"> + <van-button type='primary' block round plain + @click='toDetail'>查看居民详情</van-button> + <div class="text-16 pt-5" style="color: #8c8c8c;" + @click="toWorkbench">返回工作台</div> + </div> + </div> +</template> + +<script> +export default { + props: { + residentInfoId: String, + specialScreenResultList: Array, + }, + methods: { + toScreen() { + this.$router.replace({ + path: '/doctor/screening/secondForm', + query: { + residentInfoId: this.residentInfoId + } + }) + }, + toDetail() { + this.$router.replace({ + path: '/doctor/patient-detail', + query: { + residentInfoId: this.residentInfoId + } + }) + }, + toWorkbench() { + this.$router.replace({ + path: '/doctor/workbench' + }) + } + } +} +</script> + +<style lang="less" scoped> + +</style> diff --git a/src/doctor/screening/highVisit/second/SecondForm.vue b/src/doctor/screening/highVisit/second/SecondForm.vue new file mode 100644 index 0000000000000000000000000000000000000000..8447f9691c957ef745ce7299f7a8aa10d1ce8ff5 --- /dev/null +++ b/src/doctor/screening/highVisit/second/SecondForm.vue @@ -0,0 +1,245 @@ +<template> + <div class='h-full flex flex-col screening-second'> + <DocNavBar :title="`${id ? '修改' : '新增'}专病高危随访`" class='shrink-0' :backFunc='onBack'></DocNavBar> + <div class='p-4 overflow-y-auto grow' ref='all'> + <BaseInfo :info='info' + v-show='step ==1' + @getLast='getLastData' + ref='baseInfo' + ></BaseInfo> + <form-cont :info='info' + :disease-arrays-info='diseaseArraysInfo' + v-show='step == 2' + ref='formInfo' + ></form-cont> + <common-bottom + v-if='step == 3' + ref='commonBottom' + ></common-bottom> + <result :residentInfoId='residentInfoId' + :specialScreenResultList='specialScreenResultList' + v-show='step == 4' + ></result> + </div> + <div class='bottom-small-line'></div> + <div class='pt-2 pb-2'> + <div class='px-5 grow flex flex-col justify-end' v-if='step == 1'> + <van-button type='primary' block round + @click='toNext(2)'>下一步 + </van-button> + </div> + + <div class='px-5 flex align-center justify-around' v-if='step == 2'> + <van-button type='primary' round plain style='width: 44%' + @click='toNext(1)'>上一步 + </van-button> + <van-button type='primary' round style='width: 44%' + @click='toNext(3)'>下一步 + </van-button> + </div> + <div class='px-5 grow flex flex-col justify-end' v-if='step == 3'> + <van-button type='primary' block round + @click='onsubmit'>提交 + </van-button> + </div> + </div> + </div> +</template> + +<script> +import DocNavBar from '@/doctor/components/docNavBar/DocNavBar.vue' +import ArchiveCommon from '@/doctor/components/archiveCommon/archiveCommon' +import { getChronicResidentsId } from '@/api/doctor/generalFU' +import FormCont from '@/doctor/screening/highVisit/second/FormCont' +import Result from '@/doctor/screening/highVisit/second/Result' +import DiseaseSelect from '@/doctor/screening/highVisit/second/DiseaseSelect' +import BaseInfo from '@/doctor/screening/highVisit/second/BaseInfo' +import { fetchDataHandle } from '@/utils/common' +import { showToast } from 'vant' +import CommonBottom from '@/doctor/screening/highVisit/second/CommonBottom' +import { useStore } from '@/doctor/store' +import { + getHighSpecificVisitId, + getLastHighSpecificVisit, + saveHighSpecificVisit, + updateHighSpecificVisit +} from '@/api/doctor/highVisitApi' + +export default { + components: { + CommonBottom, + BaseInfo, + DiseaseSelect, + Result, + FormCont, + ArchiveCommon, + DocNavBar + }, + data() { + return { + store: useStore(), + step: 1, + info: {}, + residentInfo: {}, + diseaseArraysInfo: [], + specialScreenResultList: [], + } + }, + computed: { + id() { + return this.$route.query.id + }, + residentInfoId() { + return this.$route.query.residentInfoId + } + }, + created() { + this.init() + }, + methods: { + async init() { + this.info = {} + if (this.id) { + const res = await getHighSpecificVisitId(this.id) + let result = res.data || {} + const { residentsRecord = {} } = result + const { id, ...others } = residentsRecord + let obj = this.dataHandle(result) + this.info = { + ...others, + personId: id, + ...obj + } + this.residentInfo = { + ...others, + personId: id, + } + } else { + const res = await getChronicResidentsId(this.residentInfoId) + const { + id, + createDate, + createDoctorId, + createDoctorName, + createOfficeId, + createOfficeName, + createUnitId, + createUnitName, + updated, + ...others + } = res.data + this.residentInfo = { + personId: id, + ...others + } + this.info = { + personId: id, + ...others + } + } + }, + //获取上一次随访数据 + getLastData() { + let par = { + residentInfoId: this.residentInfoId + } + getLastHighSpecificVisit(par).then(res => { + let result = res.data || {} + if (Object.keys(result).length === 0) { + showToast('暂无上一次随访数据') + return + } + let obj = this.dataHandle(result) + this.info = { + ...obj, + ...this.residentInfo, + flag: 'lastInfo', + id: null + } + }) + }, + //数据处理 + dataHandle(result) { + let obj = fetchDataHandle(result, { + diseaseArrays: 'strToArrNum', + medicalHistory: 'strToArrNum', + familyHistory: 'strToArrNum', + relativeType: 'strToArrNum', + femaleMedicalHistory: 'strToArrNum', + medicineHistory: 'strToArrNum', + touchHarmful: 'strToArrNum', + dietaryHabit: 'strToArrNum', + drinkKind: 'strToArrNum', + specialScreenResult: 'strToArrNum', + highItem: 'strToArrNum', + hypertensionHighItem: 'strToArrNum', + diabetesHighItem: 'strToArrNum', + coronaryHighItem: 'strToArrNum', + strokeHighItem: 'strToArrNum', + pulmonaryHighItem: 'strToArrNum', + nephrosisHighItem: 'strToArrNum', + dyslipemiaHighItem: 'strToArrNum', + }) + return obj + }, + async toNext(val) { + this.$refs.all.scrollTo(0, 0) + if (val == 2) { + let obj = await this.$refs.baseInfo.onSubmit() + this.diseaseArraysInfo = obj.diseaseArrays || [] + } + if (val == 3) { + await this.$refs.formInfo.onSubmit() + } + this.step = val + }, + //提交所有表单 + async onsubmit() { + let baseInfo = await this.$refs.baseInfo.onSubmit() + let formInfo = await this.$refs.formInfo.onSubmit() + let commonBottom = await this.$refs.commonBottom.onSubmit() + let params = { + ...formInfo, + ...commonBottom, + ...baseInfo, + diseaseArrays: baseInfo.diseaseArrays ? baseInfo.diseaseArrays.join() : '', + source: 2 + } + if (formInfo.specialScreenResult) { + let list = formInfo.specialScreenResult.split(",") + list.forEach(item => { + let res = this.store.getDict(`CP00137`).filter(e => e.value == item) + if (res && res.length) { + this.specialScreenResultList.push(res[0].name) + } + }) + } + if (!params.id) { + saveHighSpecificVisit(params).then(res => { + this.$message.success('新增成功') + this.store.onRefreshMark() + this.toNext(4) + }) + } else { + updateHighSpecificVisit(params).then(res => { + this.$message.success('修改成功') + this.store.onRefreshMark() + this.toNext(4) + }) + } + + }, + onBack() { + if (this.step == 1) { + this.$router.back() + } else { + this.step-- + } + } + } +} +</script> + +<style lang='less' scoped> + +</style> diff --git a/src/doctor/screening/second/CommonBottom.vue b/src/doctor/screening/second/CommonBottom.vue index 6e72e74d0b820821fcb44b33270d0baa8ac87416..63314f9826ce2953c0ee679c7e24a9fa8d8e5d2f 100644 --- a/src/doctor/screening/second/CommonBottom.vue +++ b/src/doctor/screening/second/CommonBottom.vue @@ -2,24 +2,24 @@ <div> <van-form ref='form'> - <div :class="['label-title', 'mt-5']">随访单位</div> + <div :class="['label-title', 'mt-5']">筛查单位</div> <van-field v-model='form.screenUnitName' is-link readonly - placeholder='随访单位' + placeholder='筛查单位' class='input-back mt-2 form-input' :rules='rules.screenUnitName' @click='show1 = true' /> <DocUnit v-model:show='show1' v-model:value='form.screenUnitId' @change='changeUnit' /> - <div class='label-title mt-5'>随访科室</div> + <div class='label-title mt-5'>筛查科室</div> <van-field v-model='form.screenOfficeName' is-link readonly - placeholder='随访科室' + placeholder='筛查科室' class='input-back mt-2 form-input' :rules='rules.screenOfficeName' @click='show2 = true' @@ -27,12 +27,12 @@ <DocOffice v-model:show='show2' v-model:value='form.screenOfficeId' @change='changeOffice' :unitId='form.screenUnitId' /> - <div class='label-title mt-5'>随访医生</div> + <div class='label-title mt-5'>筛查医生</div> <van-field v-model='form.screenDoctorName' is-link readonly - placeholder='随访医生' + placeholder='筛查医生' class='input-back mt-2 form-input' :rules='rules.screenDoctorName' @click='show3 = true' @@ -94,13 +94,13 @@ export default { const form = { screenDate: new dayjs().format("YYYY-MM-DD"), createDate: new dayjs().format("YYYY-MM-DD"), - // 随访单位 + // 筛查单位 screenUnitId: this.authInfo.unitId, screenUnitName: this.authInfo.unitName, - // 随访科室 + // 筛查科室 screenOfficeId: this.authInfo.officeId, screenOfficeName: this.authInfo.officeName, - // 随访医生 + // 筛查医生 screenDoctorId: this.authInfo.relationId, screenDoctorName: this.authInfo.nickName, // 录入单位 diff --git a/src/doctor/screening/second/SecondForm.vue b/src/doctor/screening/second/SecondForm.vue index d48350872657bd7fb9432632a392f5709560a6ab..3c96ea06db0965b8b4bc0af2f16dc11e50eb90f1 100644 --- a/src/doctor/screening/second/SecondForm.vue +++ b/src/doctor/screening/second/SecondForm.vue @@ -212,11 +212,13 @@ export default { if (!params.id) { saveSecondScreening(params).then(res => { this.$message.success('新增成功') + this.store.onRefreshMark() this.toNext(4) }) } else { updateSecondScreening(params).then(res => { this.$message.success('修改成功') + this.store.onRefreshMark() this.toNext(4) }) } diff --git a/src/router/index.js b/src/router/index.js index 144d37392f66b6b67625550d687a2d8d4a197bf0..5686876dd130d050f2d4093f8c90f8d5bec3eeab 100644 --- a/src/router/index.js +++ b/src/router/index.js @@ -85,10 +85,31 @@ const routes = [ name: 'screening-secondDetail', component: () => import(/* webpackChunkName: "doctor" */ '@/doctor/screening/detail/SecondDetail.vue') }, + + { + path: 'screening/highVisit/firstForm', + name: 'screening-highVisit-first-form', + component: () => import(/* webpackChunkName: "doctor" */ '@/doctor/screening/highVisit/first/FirstForm.vue') + }, + { + path: 'screening/highVisit/firstDetail', + name: 'screening-highVisit-firstDetail', + component: () => import(/* webpackChunkName: "doctor" */ '@/doctor/screening/highVisit/detail/FirstDetail.vue') + }, + { + path: 'screening/highVisit/secondForm', + name: 'screening-highVisit-second-form', + component: () => import(/* webpackChunkName: "doctor" */ '@/doctor/screening/highVisit/second/SecondForm.vue') + }, + { + path: 'screening/highVisit/secondDetail', + name: 'screening-highVisit-secondDetail', + component: () => import(/* webpackChunkName: "doctor" */ '@/doctor/screening/highVisit/detail/SecondDetail.vue') + }, { path: 'screening/highVisit/GeneralFUDetail', name: 'screening-highVisit-GeneralFUDetail', - component: () => import(/* webpackChunkName: "doctor" */ '@/doctor/screening/detail/GeneralFUDetail') + component: () => import(/* webpackChunkName: "doctor" */ '@/doctor/screening/highVisit/detail/GeneralFUDetail') }, { path: 'followUp/detail',