Commit d252294c authored by gengchunlei's avatar gengchunlei

医生端 v1.2 1、工作台 慢特病季度随访

            2、个人详情慢特病随访
            3、慢特病表单及详情
parent da4f6ce2
import {fetchBase} from '@/api/doctor/doctorFetch'
// 主键查询
export function fetchSlowSpecialById(params) {
return fetchBase({ url: `/chronic-admin/v1/chronic-visit-special-diseases/record`, body: params, loading: true })
}
// 新增慢特病随访
export function addSlowSpecial(params) {
return fetchBase({ url: `/chronic-admin/v1/chronic-visit-special-diseases/save`, body: params, loading: true })
}
//修改慢特病随访
export function updateSlowSpecial(params) {
return fetchBase({ url: `/chronic-admin/v1/chronic-visit-special-diseases/update`, body: params, loading: true })
}
// 列表查询
export function fetchSlowSpecialList(params) {
return fetchBase({ url: `/chronic-admin/v1/chronic-visit-special-diseases/record-list`, body: params, loading: true })
}
//删除慢特病随访
export function delSlowSpecialById(params) {
return fetchBase({ url: `/chronic-admin/v1/chronic-visit-special-diseases/delete`, body: params, loading: true })
}
// 慢特病季度随访分页查询
export function fetchSlowSeasonList(params) {
return fetchBase({ url: `/chronic-admin/v1/chronic-special-pending-visit/page`, body: params, loading: true })
}
//慢特病季度随访修改
export function updateSlowSeason(params) {
return fetchBase({ url: `/chronic-admin/v1/chronic-special-pending-visit/update`, body: params, loading: true })
}
\ No newline at end of file
......@@ -66,7 +66,7 @@ export default {
if (!token) {
token = sessionStorage.getItem('token')
if (process.env.NODE_ENV !== 'production') {
token = 'd0aa6147-b760-42b5-8871-91db55687b99'
token = 'c7bd708b-d0a2-467d-a506-91544d5186fc'
}
}
if (token) {
......
<!--通用随访详情-->
<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='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.medicalDirectoryCode || '-' }}</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.visitWayName || '-' }}</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.isConditionStableName || '-' }}</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.isMedicationName || '-' }}</span>
</span>
</div>
<div class='flex justify-between py-1 border-bottom item' v-if='info.isMedication == 1'>
<span class='shrink-0 mr-2 label'>是否有县域外购药情况</span>
<span class='text-end'>
<span>{{ info.isPurchaseMedicineAbroadName || '-' }}</span>
</span>
</div>
<div class='flex justify-between py-1 border-bottom item'
v-if=' info.isMedication == 1 && info.isPurchaseMedicineAbroad == 1'>
<span class='shrink-0 mr-2 label'>购药途径</span>
<span class='text-end'>
<span>{{ info.waysPurchasingMedicineName || '-' }}</span>
</span>
</div>
<div class=' py-1 border-bottom item'
v-if=' info.isMedication == 1 && info.isPurchaseMedicineAbroad == 1'>
<div class='shrink-0 mr-2 label'>药物名称</div>
<div class='flex flex-wrap items-center gap-x-2.5 gap-y-2.5 mt-2'>
<div style='background: #FAFAFA;padding: 5px' v-for='item in info.drugList'>
{{ item.diseaseName || '-' }}
</div>
</div>
</div>
</div>
</van-collapse-item>
<van-collapse-item key='3' title='随访机构' name='3'>
<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 { fetchCurrencyById, messageResend } from '@/api/doctor/generalFU'
import { fetchSlowSpecialById } from '@/api/doctor/slowSpecial'
export default {
name: 'SlowSpecialFUDetail',
data() {
return {
activeCollapse: [],
detailInfo: {
publicizeType: [],
visitWayRules: []
},
collapseList: [
{ title: '居民信息', name: '1' },
{ title: '随访信息', name: '2' },
{ title: '随访机构', name: '3' }
],
// 全部展开、收起
collapseAll: false,
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' }
],
// 控制音频同一时间只播放一个
activeMediaUrl: '',
hideActiveMediaUrl: ''
}
},
computed: {
id() {
return this.$route.query.id
},
residentInfo() {
return this.info.residentsRecord || {}
}
},
created() {
document.title = '慢特病随访详情'
this.load()
},
methods: {
async load() {
if (!this.id) {
this.$message.info('未获取到信息')
return
}
let par = {
id: this.id
}
fetchSlowSpecialById(par).then(res => {
let result = res.data || {}
this.info = result
if (result.drugName) {
let list = []
result.drugName.split(',').forEach(item => {
let obj = { diseaseName: item }
list.push(obj)
})
this.info.drugList = list
}
}).finally(() => {
})
},
//重新发送
toReSend() {
let par = {
id: this.id
}
messageResend(par).then(() => {
this.load()
})
},
// 折叠面板切换
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
},
onBack() {
this.$router.back()
}
}
}
</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;
}
}
.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 {
.label {
min-width: 5em;
}
}
.card {
background-color: #F8FAFC;
padding: 4px 10px;
border-radius: 4px;
color: #4D5665;
}
</style>
<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>
<template>
<div class='slow-special-cont'>
<van-form ref='form' class='doc-form'>
<div class='font-semibold'>随访信息</div>
<div class='doc-form-label'>医保目录代码</div>
<van-field :modelValue='form.medicalDirectoryCode'
name='currentAge'
type='digit'
placeholder='请输入医保目录代码'
readonly
>
</van-field>
<div class='label-title mt-5'>随访方式</div>
<van-field
v-model='form.visitWayName'
readonly
is-link
placeholder='请选择'
class='input-back mt-2 form-input'
@click='showVisitWay = true'
:rules='rules.visitWayName'
>
<template #input>
<span class='text-end' v-if='form.visitWayName'>{{ form.visitWayName }}</span>
<span class='text-end' v-if='!form.visitWayName' style='color: #dfdfe1'>请选择</span>
</template>
</van-field>
<van-popup v-model:show='showVisitWay' position='bottom' class='min-h'>
<div class='p-4' style='height: 100%'>
<div class='flex justify-between items-center mb-4 pop-title'>
<div class='greyColor' @click='showVisitWay = false' style='font-weight: 400'>
取消
</div>
<div>随访方式(仅单选)</div>
<div></div>
</div>
<div style='height: 80%;overflow: auto'>
<CheckBtn clearable
column-2
:options="store.getDict('CP00197')"
v-model:value='form.visitWay'
:fieldNames="{text: 'name', value: 'value'}"
@change='visitWayConfirm'
/>
</div>
</div>
</van-popup>
<div class='label-title mt-5'>病情是否稳定</div>
<van-field
v-model='form.isConditionStableName'
readonly
is-link
placeholder='请选择'
class='input-back mt-2 form-input'
@click='showIsConditionStable = true'
:rules='rules.isConditionStableName'
>
<template #input>
<span class='text-end' v-if='form.isConditionStableName'>{{ form.isConditionStableName }}</span>
<span class='text-end' v-if='!form.isConditionStableName' style='color: #dfdfe1'>请选择</span>
</template>
</van-field>
<van-popup v-model:show='showIsConditionStable' position='bottom' class='min-h'>
<div class='p-4' style='height: 100%'>
<div class='flex justify-between items-center mb-4 pop-title'>
<div class='greyColor' @click='showIsConditionStable = false' style='font-weight: 400'>
取消
</div>
<div>病情是否稳定(仅单选)</div>
<div></div>
</div>
<div style='height: 80%;overflow: auto'>
<CheckBtn clearable
column-2
:options="store.getDict('CP00120')"
v-model:value='form.isConditionStable'
:fieldNames="{text: 'name', value: 'value'}"
@change='isConditionStableConfirm'
/>
</div>
</div>
</van-popup>
<div class='label-title mt-5'>当前是否用药</div>
<van-field
v-model='form.isMedicationName'
readonly
is-link
placeholder='请选择'
class='input-back mt-2 form-input'
@click='showIsMedication = true'
:rules='rules.isMedicationName'
>
<template #input>
<span class='text-end' v-if='form.isMedicationName'>{{ form.isMedicationName }}</span>
<span class='text-end' v-if='!form.isMedicationName' style='color: #dfdfe1'>请选择</span>
</template>
</van-field>
<van-popup v-model:show='showIsMedication' position='bottom' class='min-h'>
<div class='p-4' style='height: 100%'>
<div class='flex justify-between items-center mb-4 pop-title'>
<div class='greyColor' @click='showIsMedication = false' style='font-weight: 400'>
取消
</div>
<div>当前是否用药(仅单选)</div>
<div></div>
</div>
<div style='height: 80%;overflow: auto'>
<CheckBtn clearable
column-2
:options="store.getDict('CP00120')"
v-model:value='form.isMedication'
:fieldNames="{text: 'name', value: 'value'}"
@change='isMedicationConfirm'
/>
</div>
</div>
</van-popup>
<div v-if='form.isMedication == 1'>
<div class='no-req-label mt-5'>是否有县域外购药情况</div>
<van-field
v-model='form.isPurchaseMedicineAbroadName'
readonly
is-link
placeholder='请选择'
class='input-back mt-2 form-input'
@click='showIsPurchaseMedicineAbroad = true'
:rules='rules.isPurchaseMedicineAbroadName'
>
<template #input>
<span class='text-end'
v-if='form.isPurchaseMedicineAbroadName'>{{ form.isPurchaseMedicineAbroadName }}</span>
<span class='text-end' v-if='!form.isPurchaseMedicineAbroadName'
style='color: #dfdfe1'>请选择</span>
</template>
</van-field>
<van-popup v-model:show='showIsPurchaseMedicineAbroad' position='bottom' class='min-h'>
<div class='p-4' style='height: 100%'>
<div class='flex justify-between items-center mb-4 pop-title'>
<div class='greyColor' @click='showIsPurchaseMedicineAbroad = false'
style='font-weight: 400'>
取消
</div>
<div>是否有县域外购药情况(仅单选)</div>
<div></div>
</div>
<div style='height: 80%;overflow: auto'>
<CheckBtn clearable
column-2
:options="store.getDict('CP00120')"
v-model:value='form.isPurchaseMedicineAbroad'
:fieldNames="{text: 'name', value: 'value'}"
@change='isPurchaseMedicineAbroadConfirm'
/>
</div>
</div>
</van-popup>
</div>
<div v-if=' form.isMedication == 1 && form.isPurchaseMedicineAbroad == 1'>
<div class='no-req-label mt-5'>购药途径</div>
<van-field
v-model='form.waysPurchasingMedicineName'
readonly
is-link
placeholder='请选择'
class='input-back mt-2 form-input'
@click='showWaysPurchasingMedicine = true'
:rules='rules.waysPurchasingMedicineName'
>
<template #input>
<span class='text-end' v-if='form.waysPurchasingMedicineName'>{{ form.waysPurchasingMedicineName
}}</span>
<span class='text-end' v-if='!form.waysPurchasingMedicineName' style='color: #dfdfe1'>请选择</span>
</template>
</van-field>
<van-popup v-model:show='showWaysPurchasingMedicine' position='bottom' class='min-h'>
<div class='p-4' style='height: 100%'>
<div class='flex justify-between items-center mb-4 pop-title'>
<div class='greyColor' @click='showWaysPurchasingMedicine = false' style='font-weight: 400'>
取消
</div>
<div>购药途径(仅单选)</div>
<div></div>
</div>
<div style='height: 80%;overflow: auto'>
<CheckBtn clearable
column-3
:options="store.getDict('CP00198')"
v-model:value='form.waysPurchasingMedicine'
:fieldNames="{text: 'name', value: 'value'}"
@change='waysPurchasingMedicineConfirm'
/>
</div>
</div>
</van-popup>
</div>
<div v-if=' form.isMedication == 1 && form.isPurchaseMedicineAbroad == 1' class='health mt-2'>
<div class='health-cell mt-2'>
<div class='no-req-label mb-2'>药品列表</div>
<div v-for='(item, index) in form.drugList' :key='item._id'
:style="{marginTop: index == 0 ? '0': '.16rem'}">
<div class='text-driver' v-if='index'></div>
<div class='mt-4'></div>
<van-field
v-model='item.diseaseName'
placeholder='请输入'
label='药品名称:'
class='input-back form-input'
style='flex: 1'
:rules='rules.diseaseName'
/>
<div class='mt-2 text-center'>
<van-button type='primary' plain class='btn-br' @click='plusDiagnosis'>增加</van-button>
<van-button plain class='btn-br'
@click='onDel(item, index)'
v-if='form?.drugList?.length > 1'
style='margin-left: .16rem'
>删除
</van-button>
</div>
</div>
</div>
</div>
<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>
<DoctorInfo :info='info' ref='DoctorInfo' />
</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,
medicalDirectoryCode: undefined,
visitWay: undefined,
visitWayName: undefined,
isConditionStable: undefined,
isConditionStableName: undefined,
isMedication: undefined,
isMedicationName: undefined,
isPurchaseMedicineAbroad: undefined,
isPurchaseMedicineAbroadName: undefined,
waysPurchasingMedicine: undefined,
waysPurchasingMedicineName: undefined,
drugList: [],
drugName: 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: {
visitWayName: [{ required: true, message: '请选择' }],
isConditionStableName: [{ required: true, message: '请选择' }],
isMedicationName: [{ required: true, message: '请选择' }],
},
// 随访方式
showVisitWay: false,
//病情是否稳定
showIsConditionStable: false,
//当前是否用药
showIsMedication: false,
//是否有县域外购药情况
showIsPurchaseMedicineAbroad: false,
//购药途径
showWaysPurchasingMedicine: false,
// 随访日期
showVisitDate: false,
// 随访日期可选范围
visitDateRange: {
min: undefined,
max: undefined
},
store: useStore()
}
},
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()
let drugName = ''
let list = []
if (this.form.isMedication == 1 && this.form.isPurchaseMedicineAbroad == 1) {
this.form.drugList.forEach(item => {
list.push(item.diseaseName)
})
drugName = list.join()
}
const result = {
...this.form,
drugName,
...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)
}
}
},
//随访方式
visitWayConfirm() {
this.store.getDict('CP00197').forEach(item => {
if (item.value == this.form.visitWay) {
this.form.visitWayName = item.name
}
})
this.showVisitWay = false
},
//病情是否稳定
isConditionStableConfirm() {
this.store.getDict('CP00120').forEach(item => {
if (item.value == this.form.isConditionStable) {
this.form.isConditionStableName = item.name
}
})
this.showIsConditionStable = false
},
//当前是否用药
isMedicationConfirm() {
this.store.getDict('CP00120').forEach(item => {
if (item.value == this.form.isMedication) {
this.form.isMedicationName = item.name
}
})
this.showIsMedication = false
},
//是否有县域外购药情况
isPurchaseMedicineAbroadConfirm() {
this.store.getDict('CP00120').forEach(item => {
if (item.value == this.form.isPurchaseMedicineAbroad) {
this.form.isPurchaseMedicineAbroadName = item.name
}
})
this.showIsPurchaseMedicineAbroad = false
},
//购药途径
waysPurchasingMedicineConfirm() {
this.store.getDict('CP00198').forEach(item => {
if (item.value == this.form.waysPurchasingMedicine) {
this.form.waysPurchasingMedicineName = item.name
}
})
this.showWaysPurchasingMedicine = false
},
// 筛查日期
visitDateConfirm({ selectedValues }) {
this.form.visitDate = selectedValues.join('-')
this.showVisitDate = false
},
plusDiagnosis() {
if (this.form.drugList) {
this.form.drugList.push({})
} else {
this.form.drugList = []
this.form.drugList.push({})
}
},
onDel(index) {
this.form.drugList.splice(index, 1)
},
},
watch: {
info: {
handler(info) {
this.form = defaultForm(info)
this.form.medicalDirectoryCode = this.info.medicalInsuranceCode
if (this.form.drugName) {
let list = []
this.form.drugName.split(",").forEach(item => {
let obj = {diseaseName: item}
list.push(obj)
})
this.form.drugList = list
}
if (!this.form.drugList.length) {
this.form.drugList = [{
diseaseName: null,
}]
}
},
immediate: true
}
}
}
</script>
<style lang='less' scoped>
.min-h {
min-height: 25%;
}
.health {
padding: 1px 8px 8px 8px;
background: #FAFAFA;
border-radius: 8px;
.health-cell {
padding: 8px;
background: #FFFFFF;
border-radius: 8px;
}
}
.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;
}
.text-driver {
border: 1px solid #EEEEEE;
margin-bottom: 8px;
margin-top: 8px;
}
.btn-br {
border-radius: 38px;
width: 112px;
padding: 4px 8px;
height: 26px;
font-size: 13px;
}
.form-input {
padding: 8px 12px;
border-radius: 8px;
}
.input-back {
background: #FAFAFA;
}
</style>
<template>
<div class="h-full flex flex-col screening-first">
<DocNavBar :title="`${id ? '修改' : '新增'}慢特病随访`" class="shrink-0"
:backFunc="onBack" ></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="slowSpecialInfo" v-else-if="step == 2" ref="FormCont"/>
</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 { getChronicResidentsId } from '@/api/doctor/generalFU'
import { fetchDataHandle } from '@/utils/common.js'
import { useStore } from '@/doctor/store'
import { addSlowSpecial, fetchSlowSpecialById, updateSlowSpecial } from '@/api/doctor/slowSpecial'
export default {
components: {
DocNavBar,
archiveCommon,
FormCont,
},
data() {
return {
store: useStore(),
step: 1,
// 患者基础信息
baseInfo: {},
// 慢特病信息
slowSpecialInfo: {},
// 结果
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 fetchSlowSpecialById({id: this.id})
const result = res.data || {}
this.slowSpecialInfo = result
this.baseInfo = this.slowSpecialInfo.residentsRecord
} else {
if (this.residentInfoId) {
debugger
let res = await getChronicResidentsId(this.residentInfoId)
this.baseInfo = res.data || {}
this.slowSpecialInfo.residentInfoId = this.residentInfoId
this.slowSpecialInfo.medicalInsuranceCode = res.data.medicalInsuranceCode
} 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, {
})
query.residentsRecord = this.baseInfo
const func = query.id ? updateSlowSpecial : addSlowSpecial
func(query).then(res => {
this.resultInfo = query
this.store.onRefreshMark()
this.$router.replace({
path: '/doctor/patient-detail',
query: {
residentInfoId: this.residentInfoId
}
})
})
})
} 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>
......@@ -31,6 +31,11 @@
<span class='label'>联系电话</span>
<span>{{ $phoneHide(residentInfo.telephone) || '-' }}</span>
</div>
<div>
<span class='label-slow'>医保是否办理慢特病</span>
<span v-if="residentInfo.chronicDiseases == 1"></span>
<span v-else>-</span>
</div>
<!-- <div>
<span class="label">人群分类</span>
<span>{{ residentInfo.chronicCrowdName || '-' }}</span>
......@@ -70,8 +75,10 @@
<GeneralList v-else-if="activeTabItem.id === 'CURRENCY'" />
<ReferralList v-else-if="activeTabItem.id === 'REFERRAL'" />
<ConsultationList v-else-if="activeTabItem.id === 'CONSULTATION'" />
<SlowSpecialVisitList v-else-if="activeTabItem.id === 'SLOWSPECIALVISIT'"></SlowSpecialVisitList>
<DiseaseList v-else :key='activeTabItem.value' :diseaseName='activeTabItem.name'
:diseaseType='activeTabItem.value' />
</div>
<van-popup
v-model:show='addVisible'
......@@ -107,13 +114,14 @@ import GeneralList from './components/generalFU/List.vue'
import ReferralList from './components/referral/List.vue'
import ConsultationList from './components/consultation/List.vue'
import DiseaseList from './components/disease/Index.vue'
import { deleteFirstScreening } from '@/api/doctor/screening'
import { saveResidentsDeath } from '@/api/doctor/death'
import SlowSpecialVisitList from '@/doctor/patientDetail/components/slowSpecialVisit/List'
export default {
name: 'PatientDetail',
components: {
SlowSpecialVisitList,
DocNavBar,
ChronicTag,
ScreeningList,
......@@ -144,7 +152,8 @@ export default {
{ name: '新增通用随访', value: 4, path: '/doctor/followUp/generalFU/add' },
{ name: '新增死亡记录', value: 5, path: '/doctor/deathRecord/add' },
// { name: '新增死亡记录详情', value: 6, path: '/doctor/deathRecord/detail' },
{ name: '新增专病随访', value: 7, path: '/doctor/followUp/separateFU/add' }
{ name: '新增专病随访', value: 7, path: '/doctor/followUp/separateFU/add' },
{ name: '新增慢特病随访', value: 8, path: '/doctor/followUp/slowSpecialFU/add' }
]
}
},
......@@ -173,7 +182,9 @@ export default {
const result = [
{ name: '筛查管理', id: 'SCREENING' },
...this.diagnoseList,
{ name: '通用随访', id: 'CURRENCY' }
{ name: '通用随访', id: 'CURRENCY' },
{ name: '慢特病随访', id: 'SLOWSPECIALVISIT' },
// { name: '转诊记录', id: 'REFERRAL' },
// { name: '会诊记录', id: 'CONSULTATION' }
]
......@@ -367,4 +378,10 @@ export default {
bottom: 22px;
}
}
.label-slow {
display: inline-block;
color: #8C8C8C;
min-width: 150px;
}
</style>
<template>
<!-- 慢特病随访-->
<div class="h-full overflow-y-auto general-list" ref='list'>
<van-pull-refresh v-model='loadingRefresh' @refresh='onRefresh'
:disabled='isRefreshDisable' style="min-height: 100%">
<van-list
v-model:loading='loading'
:finished='finished'
:finished-text="list.length ? '没有更多了' : ''"
:immediate-check='false'
@load='onMore'
>
<div class="flex flex-col">
<div v-for='item in list' :key="item.id" @click="toDetail(item)"
class="flex flex-col py-3 px-4 mb-3 doc-list-card" style="row-gap: .04rem;line-height: 1.5;">
<div>
<span class="label">随访日期</span>
<span>{{ item.visitDate }}</span>
</div>
<div class="flex">
<span class="label shrink-0">医保目录代码</span>
<span class="grow text-wrap">{{ item.medicalDirectoryCode || '-' }}</span>
</div>
<div>
<span class="label">随访方式</span>
<span>{{ item.visitWayName || '-' }}</span>
</div>
<div>
<span class="label">是否县城外购药</span>
<span>{{ item.isPurchaseMedicineAbroadName || '-' }}</span>
</div>
<div>
<span class="label">随访医生</span>
<span>{{ item.visitDoctorName || '-' }}</span>
</div>
<div>
<span class="label">随访科室</span>
<span>{{ item.visitOfficeName || '-' }}</span>
</div>
<div class="text-ellipsis">
<span class="label">随访单位</span>
<span>{{ item.visitUnitName || '-' }}</span>
</div>
<div class="divider"></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">修改</van-button>
<van-button round size="small" class="doc-btn-red" @click="delBtn(item)"
v-if="item.allowDelete ==1">删除</van-button>
</div>
</div>
</div>
</van-list>
<div class='text-center shrink-0 empty' v-if='!list.length'>
<img src='@/assets/image/doctor/empty.png' alt='' style='width: 1.2rem;'>
<p>暂无数据</p>
</div>
</van-pull-refresh>
</div>
</template>
<script>
import { delSlowSpecialById, fetchSlowSpecialList } from '@/api/doctor/slowSpecial'
import { useStore } from '@/doctor/store'
import { showConfirmDialog } from 'vant'
export default {
name: 'SlowSpecialVisitList',
inject: ['residentInfo'],
data() {
return {
store: useStore(),
list: [],
loading: false,
finished: false,
loadingRefresh: false,
isRefreshDisable: false
}
},
computed: {
residentInfoId() {
return this.residentInfo().residentInfoId
}
},
created() {
this.load()
},
mounted() {
const list = this.$refs.list
list.addEventListener('scroll', () => {
if (list.scrollTop > 0) {
this.isRefreshDisable = true
} else {
this.isRefreshDisable = false
}
})
},
methods: {
load(loading = true) {
const query = {
residentInfoId: this.residentInfoId
}
fetchSlowSpecialList(query, loading).then(res => {
this.list = res.data || []
this.finished = true
}).finally(() => {
this.loading = false
this.loadingRefresh = false
})
},
onMore() {
this.load(false)
},
onRefresh() {
this.load(false)
},
toDetail(record) {
if (!record) return
if (record.id == null) {
this.$message.info('暂时无法查看 详情信息')
return
}
this.$router.push({
path: '/doctor/followUp/slowSpecialFU/detail',
query: {
id: record.id,
}
})
},
editBtn(record) {
this.$router.push({
path: '/doctor/followUp/slowSpecialFU/add',
query: { residentInfoId: this.residentInfoId, id:record.id }
})
},
delBtn(record) {
showConfirmDialog({
message: '确定要删除吗?'
}).then(() => {
delSlowSpecialById({ id: record.id }).then(res => {
setTimeout(() => {
this.$message.info('删除成功')
}, 600)
this.list = this.list.filter(e => e.id !== record.id)
})
}).catch((err) => { console.warn('delSlowSpecialBtn', err) })
},
},
watch: {
'store.refreshMark'() {
this.onRefresh()
}
}
}
</script>
<style lang="less" scoped>
</style>
......@@ -51,6 +51,7 @@ import TableVisit from './tables/Visit.vue'
import TableReceive from './tables/Receive.vue'
import TableFirstScreen from './tables/FirstScreen.vue'
import TableHighRisk from './tables/HighRisk.vue'
import TableSlowSeason from '@/doctor/workbench/tables/SlowSeason'
export default {
name: 'Workbench',
......@@ -60,7 +61,8 @@ export default {
TableVisit,
TableReceive,
TableFirstScreen,
TableHighRisk
TableHighRisk,
TableSlowSeason,
},
data() {
return {
......@@ -70,7 +72,8 @@ export default {
{ key: 'receive', component: 'TableReceive', name: '待接诊居民' },
// { key: 'screenRecord', component: 'TableScreenRecord', name: '当年待筛查记录' },
{ key: 'firstScreen', component: 'TableFirstScreen', name: '初筛高危待筛查' },
{ key: 'highRisk', component: 'TableHighRisk', name: '慢病高危待诊断' }
{ key: 'highRisk', component: 'TableHighRisk', name: '慢病高危待诊断' },
{ key: 'slowSeason', component: 'TableSlowSeason', name: '慢特病季度待随访' },
],
tabActive:{},
configName: '慢病APP个性化配置',
......
<template>
<div class="h-full flex flex-col work">
<div class="shrink-0 flex px-2 pb-2 pt-3 items-center">
<van-tabs shrink type="card" class="grow doc-tab-round" line>
<van-tab title="全部" title-style="padding: 0 .2rem"></van-tab>
</van-tabs>
<doc-icon type="doc-menu" style="font-size:.2rem;color:#03053D"
@click='openSearch' />
</div>
<div class='grow pt-1 relative min-h-0'>
<div class='h-full px-2 pb-3 overflow-y-auto' ref='list'>
<van-pull-refresh v-model='loadingRefresh' @refresh='onRefresh'
:disabled='isRefreshDisable' style="min-height: 100%">
<van-list
v-model:loading='loading'
:finished='finished'
:finished-text="list.length ? '没有更多了' : ''"
:immediate-check='false'
@load='onMore'
>
<div class="flex flex-col gap-y-2.5">
<div class="py-3 px-4 doc-list-card" v-for='item in list' :key="item.id">
<div class="mb-4" @click="toDetail(item)">
<span class="name mr-2">{{ item.residentName }}</span>
<span class="tag mr-2">{{ item.currentAge }}</span>
<span class="tag mr-2">{{ item.genderName }}</span>
</div>
<div class="flex flex-col gap-y-2.5" @click="toDetail(item)">
<div>
<span class="label">身份证号</span>
<span>{{ $idCardHide(item.idCard) || '-' }}</span>
</div>
<div>
<span class="label">是否逾期</span>
<span>{{ item.isOverdueName }}</span>
</div>
<div>
<span class="label">逾期天数</span>
<span>{{ item.overdueDay }}</span>
</div>
<div>
<span class="label">随访季度</span>
<span>{{ item.visitQuarter }}</span>
</div>
<div>
<span class="label">计划随访日期</span>
<span>{{ item.planVisitDate }}</span>
</div>
</div>
<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="toSlowSeason(item)">随访</van-button>
<van-button round size="small" class="doc-btn-primary" @click="onIgnore(item)">忽略</van-button>
</div>
</div>
</div>
</van-list>
<div class='text-center shrink-0 empty' v-if='!list.length'>
<img src='@/assets/image/doctor/empty.png' alt='' style='width: 1.2rem;'>
<p>暂无数据</p>
</div>
</van-pull-refresh>
</div>
<van-popup v-model:show="searchVisible" position="top" :style="{ height: '80%' }"
style="position: absolute;transition: none"
:overlay-style="{ position: 'absolute' }"
transition="viewer-fade"
:teleport="$refs.list">
<div class="h-full flex flex-col workbench-search-box">
<div class="px-4 py-3 grow overflow-y-auto" style="">
<div class="mb-3">身份证号</div>
<van-field v-model="form.idCard" placeholder="请输入身份证号" maxlength="20"
clearable
class="doc-input">
<template #right-icon>
<IdCardScan />
</template>
</van-field>
<div class="my-3">居民姓名</div>
<van-field v-model="form.residentName" placeholder="输入居民姓名" maxlength="100" clearable
class="doc-input"/>
<div class="my-3">计划随访日期</div>
<div class="flex items-center">
<van-field v-model="form.startPlanVisitDate" placeholder="开始日期" readonly
class="doc-input"
@click="() => { dateShow = true, dateMark = 1 }"/>
<span class="px-2">~</span>
<van-field v-model="form.endPlanVisitDate" placeholder="结束日期" readonly
class="doc-input"
@click="() => { dateShow = true, dateMark = 2 }"/>
</div>
<van-popup v-model:show="dateShow" position="bottom" :teleport="$refs.list">
<van-date-picker @confirm="onDateConfirm" @cancel="dateShow = false"/>
</van-popup>
<div class="my-3">是否逾期</div>
<CheckBtn :options="isNotList" v-model:value="form.isOverdue" column-3
class="check-btn-workbench"/>
</div>
<div class="text-16 flex shrink-0 text-center bt-group">
<div class="grow py-3" @click="reset">重置</div>
<div class="grow py-3 submit-btn" @click="search">确定</div>
</div>
</div>
</van-popup>
</div>
</div>
</template>
<script>
import { useStore } from '@/doctor/store'
import CheckBtn from '@/doctor/components/checkBtn/CheckBtn.vue'
import IdCardScan from '@/doctor/components/idCardScan/IdCardScan.vue'
import { fetchSlowSeasonList, updateSlowSeason } from '@/api/doctor/slowSpecial'
const DefaultForm = {
// 数据来源,[DC00051]
isOverdue: undefined,
// 服务类型
serviceType: undefined,
// 服务日期-截止日期
startPlanVisitDate: undefined,
// 服务日期-开始日期
endPlanVisitDate: undefined,
// 姓名
residentName: undefined,
// 身份证号
idCard: undefined
}
export default {
name: 'TableSlowSeason',
props: {
searchType: { default: 1 }
},
components: {
CheckBtn,
IdCardScan
},
data() {
return {
store: useStore(),
list: [],
pagination: {
total: 0,
pageIndex: 1,
pageSize: 8
},
loading: false,
finished: false,
loadingRefresh: false,
isRefreshDisable: false,
// 搜索弹出框
searchVisible: false,
// 时间选择
dateShow: false,
// 判断对哪一个日期赋值
dateMark: 0,
form: { ...DefaultForm }
}
},
computed: {
isNotList() {
let list = []
this.store.getDict('CP00120').forEach(item => list.push(item))
list.unshift({name: '全部', value: ''})
return list
}
},
created() {
this.load()
},
mounted() {
const list = this.$refs.list
list.addEventListener('scroll', () => {
if (list.scrollTop > 0) {
this.isRefreshDisable = true
} else {
this.isRefreshDisable = false
}
})
},
methods: {
load(loading = true) {
const query = {
pageIndex: this.pagination.pageIndex,
pageSize: this.pagination.pageSize,
searchType: this.searchType,
...this.form
}
fetchSlowSeasonList(query, loading).then(res => {
if (this.pagination.pageIndex === 1) {
this.list = []
}
this.list = this.list.concat(res.data.dataList || [])
this.pagination.total = res.data.total || 0
this.finished = this.list.length >= this.pagination.total
}).finally(() => {
this.loading = false
this.loadingRefresh = false
})
},
search() {
this.pagination.pageIndex = 1
this.load()
this.searchVisible = false
},
reset() {
this.form = { ...DefaultForm }
this.search()
},
onMore() {
this.pagination.pageIndex++
this.load(false)
},
onRefresh() {
this.pagination.pageIndex = 1
this.load(false)
},
openSearch() {
this.searchVisible = !this.searchVisible
},
onDateConfirm({ selectedValues }) {
const result = selectedValues.join('-')
if (this.dateMark === 1) {
this.form.startPlanVisitDate = result
} else if (this.dateMark === 2) {
this.form.endPlanVisitDate = result
}
this.dateShow = false
this.dateMark = 0
},
toDetail(record) {
if (!record) return
if (record.residentInfoId == null) {
this.$message.info('暂时无法查看 详情信息')
return
}
this.$router.push({
path: '/doctor/patient-detail',
query: {
residentInfoId: record.residentInfoId
}
})
},
toSlowSeason(record) {
if (record.residentInfoId == null) {
this.$message.info('暂时无法进行随访')
return
}
this.$router.push({
path: '/doctor/followUp/slowSpecialFU/add',
query: {
residentInfoId: record.residentInfoId
}
})
},
onIgnore(record) {
let params={
id: record.id,
status: '0',
}
updateSlowSeason(params).then(() => {
this.list = this.list.filter(e => e.id !== record.id)
setTimeout(() => {
this.$message.info('操作成功')
}, 800);
})
}
},
watch: {
searchType() {
this.onRefresh()
},
'store.refreshMark'() {
this.onRefresh()
}
}
}
</script>
<style lang="less" scoped>
</style>
......@@ -147,6 +147,17 @@ const routes = [
name: 'followUp-separateFU-add',
component: () => import(/* webpackChunkName: "doctor" */ '@/doctor/followUp/separateFU/form/Index')
},
//慢特病随访
{
path: 'followUp/slowSpecialFU/detail',
name: 'followUp-slowSpecialFU-detail',
component: () => import(/* webpackChunkName: "doctor" */ '@/doctor/followUp/slowSpecialFU/detail/Detail')
},
{
path: 'followUp/slowSpecialFU/add',
name: 'followUp-slowSpecialFU-add',
component: () => import(/* webpackChunkName: "doctor" */ '@/doctor/followUp/slowSpecialFU/form/Index')
},
]
},
{
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment