You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

117 lines
5.6 KiB
Vue

<template>
<view class="container">
<view class="card">
<view class="card-header-row">
<text class="item-name">{{ detail.examination_item_name }}</text>
<view class="status-tag" :class="getStatusClass(detail.status)">{{ getStatusText(detail.status) }}</view>
</view>
</view>
<view class="card" v-if="detail">
<view class="card-title">患者信息</view>
<view class="card-row"><text class="card-label">姓名</text><text class="card-value">{{ detail.patient_name }}</text></view>
<view class="card-row"><text class="card-label">性别</text><text class="card-value">{{ getGenderText(detail.patient_gender) }}</text></view>
<view class="card-row"><text class="card-label">年龄</text><text class="card-value">{{ detail.patient_age }}</text></view>
<view class="card-row"><text class="card-label">患者类型</text><text class="card-value">{{ detail.patient_type_name || '-' }}</text></view>
</view>
<view class="card">
<view class="card-title">检查信息</view>
<view class="card-row"><text class="card-label">检查项目</text><text class="card-value">{{ detail.examination_item_name }}</text></view>
<view class="card-row"><text class="card-label">执行科室</text><text class="card-value">{{ detail.examination_department_name || '-' }}</text></view>
<view class="card-row"><text class="card-label">申请科室</text><text class="card-value">{{ detail.apply_department_name || '-' }}</text></view>
<view class="card-row"><text class="card-label">申请医生</text><text class="card-value">{{ detail.apply_doctor_name || '-' }}</text></view>
<view class="card-row"><text class="card-label">申请时间</text><text class="card-value">{{ formatTime(detail.apply_time) }}</text></view>
<view class="card-row" v-if="detail.clinical_diagnosis"><text class="card-label">临床诊断</text><text class="card-value">{{ detail.clinical_diagnosis }}</text></view>
</view>
<view class="card" v-if="detail.exam_item_detail">
<view class="card-title">检查须知</view>
<view class="card-row" v-if="detail.exam_item_detail.fasting_status === 1">
<text class="warning-text">⚠️ 此检查需要空腹</text>
</view>
<view class="tips-content" v-if="detail.exam_item_detail.check_tips">
{{ detail.exam_item_detail.check_tips }}
</view>
<view class="tips-content" v-else>暂无特殊注意事项</view>
</view>
<view class="card" v-if="detail.appointment_info">
<view class="card-title">预约信息</view>
<view class="card-row"><text class="card-label">预约时间</text><text class="card-value highlight">{{ formatTime(detail.appointment_info.appointment_time) }}</text></view>
<view class="card-row"><text class="card-label">检查室</text><text class="card-value">{{ detail.appointment_info.resource_name || '-' }}</text></view>
</view>
<view class="bottom-bar" v-if="detail.status === 0">
<view class="btn-primary" @tap="goSelectPlan">去预约</view>
</view>
<view class="bottom-bar" v-if="detail.status === 1 && detail.appointment_info">
<view class="btn-danger" @tap="handleCancel">取消预约</view>
<view class="btn-warning" @tap="handleReschedule"></view>
</view>
</view>
</template>
<script>
import { getApplicationDetail } from '../../services/application'
import { cancelAppointment } from '../../services/appointment'
import { formatTime, getStatusText, getStatusClass, getGenderText } from '../../utils/format'
export default {
data() {
return { detail: {}, applicationId: '' }
},
onLoad(options) {
this.applicationId = options.id
this.loadDetail()
},
methods: {
formatTime, getStatusText, getStatusClass, getGenderText,
async loadDetail() {
try {
const res = await getApplicationDetail({ application_id: this.applicationId })
this.detail = res.data || {}
} catch (e) {}
},
goSelectPlan() {
uni.navigateTo({ url: `/pages/appointment/select-plan?application_ids=${this.applicationId}` })
},
handleCancel() {
uni.showModal({
title: '取消预约',
content: '确定要取消此预约吗?',
editable: true,
placeholderText: '请输入取消原因(可选)',
success: async (res) => {
if (res.confirm) {
try {
await cancelAppointment({
appointment_id: this.detail.appointment_info.id,
cancel_reason: res.content || '患者主动取消'
})
uni.showToast({ title: '取消成功', icon: 'success' })
setTimeout(() => uni.navigateBack(), 1500)
} catch (e) {}
}
}
})
},
handleReschedule() {
uni.navigateTo({
url: `/pages/reschedule/select-plan?appointment_id=${this.detail.appointment_info.id}&application_id=${this.applicationId}`
})
}
}
}
</script>
<style scoped>
.card-header-row { display: flex; justify-content: space-between; align-items: center; }
.item-name { font-size: 36rpx; font-weight: 700; color: #333; }
.tips-content { font-size: 26rpx; color: #666; line-height: 1.8; padding: 12rpx 0; }
.warning-text { color: #FF9800; font-weight: 500; font-size: 28rpx; }
.highlight { color: #2B7FD2; font-weight: 600; }
.bottom-bar { position: fixed; bottom: 0; left: 0; right: 0; padding: 20rpx 30rpx; padding-bottom: calc(20rpx + env(safe-area-inset-bottom)); background: #FFF; box-shadow: 0 -4rpx 20rpx rgba(0,0,0,0.06); display: flex; gap: 20rpx; }
.bottom-bar .btn-primary, .bottom-bar .btn-warning, .bottom-bar .btn-danger { flex: 1; }
</style>