389 lines
9.2 KiB
Vue
389 lines
9.2 KiB
Vue
<template> <full-page mainStyle="background:#f0f0f0">
|
||
<template v-if="item">
|
||
<view v-if="refundInfo" :class="{ 'refund-info--elder': elderMode }" class="refund-info">
|
||
<view :class="{ 'refund-title--elder': elderMode }" class="refund-title">{{ refundInfo.title }}</view>
|
||
<view v-if="refundInfo.subTitle" :class="{ 'refund-subtitle--elder': elderMode }" class="refund-subtitle">{{ refundInfo.subTitle }}</view>
|
||
<view v-if="refundInfo.time" :class="{ 'refund-subtitle--elder': elderMode }" class="refund-subtitle">{{ refundInfo.time }}</view>
|
||
</view>
|
||
<view :class="{ 'order-head--elder': elderMode }" class="order-head">订单信息</view>
|
||
<view :class="{ 'card--elder': elderMode }" class="card">
|
||
<view :class="{ 'card_head--elder': elderMode }" class="card_head info-row">
|
||
<view :class="{ 'doctor-info--elder': elderMode }" class="doctor-info">
|
||
<text :class="{ 'doctor-name--elder': elderMode }">{{ item.doctorName }}</text>
|
||
<text :class="{ 'dept--elder': elderMode }" class="dept">{{ item.deptName }}</text>
|
||
</view>
|
||
<view :class="{ 'uni-primary--elder': elderMode }" class="uni-primary">{{ item.preOrderId ? "在线续方" : "在线复诊" }}</view>
|
||
</view>
|
||
<view :class="{ 'card_body--elder': elderMode }" class="card_body">
|
||
<view :class="{ 'info-text--elder': elderMode }">
|
||
<text :class="{ 'label--elder': elderMode }" class="label">线下确诊疾病:</text>
|
||
<text :class="{ 'content--elder': elderMode }">{{ item.diseases.join("、") }}</text>
|
||
</view>
|
||
<view :class="{ 'desc--elder': elderMode }" class="desc">
|
||
<text :class="{ 'label--elder': elderMode }" class="label">病情描述:</text>
|
||
<text :class="{ 'content--elder': elderMode }">{{ item.description }}</text>
|
||
</view> <view :class="{ 'info-text--elder': elderMode }">
|
||
<text :class="{ 'label--elder': elderMode }" class="label">问诊人:</text>
|
||
<text :class="{ 'content--elder': elderMode }">{{ item.name }} {{ item.sex }}
|
||
{{ item.age ? item.age + "岁" : "" }}</text>
|
||
</view> <view :class="{ 'date-text--elder': elderMode, 'date-line--elder': elderMode }" class="date-line">
|
||
{{ item.createTime ? dayjs(item.createTime).format("YYYY-MM-DD HH:mm") : "" }}
|
||
</view>
|
||
</view>
|
||
<view :class="{ 'card_footer--elder': elderMode }" class="card_footer info-row">
|
||
<view :class="{ 'fee-label--elder': elderMode }">退费金额</view>
|
||
<view :class="{ 'fee--elder': elderMode }" class="fee">¥{{ item.settlement.total_fee }}</view>
|
||
</view>
|
||
</view>
|
||
<view :class="{ 'order-head--elder': elderMode }" class="order-head order-head--gap">退费申请</view>
|
||
<view v-if="refundInfo" :class="{ 'card--elder': elderMode }" class="card">
|
||
<view :class="{ 'card_body--elder': elderMode }" class="card_body">
|
||
<view :class="{ 'info-row--elder': elderMode }" class="info-row">
|
||
<view :class="{ 'label--elder': elderMode }" class="label">申请时间</view>
|
||
<view :class="{ 'content--elder': elderMode }">{{ refundInfo.date }}</view>
|
||
</view>
|
||
<view :class="{ 'info-row--elder': elderMode }" class="info-row">
|
||
<view :class="{ 'label--elder': elderMode }" class="label">退费原因</view>
|
||
<view :class="{ 'content--elder': elderMode }">{{ refundInfo.reason }}</view>
|
||
</view>
|
||
</view>
|
||
</view>
|
||
<view v-if="!refundInfo" :class="{ 'reason-container--elder': elderMode }" class="reason-container">
|
||
<textarea v-model="reason" placeholder="请输入退费原因" :maxlength="200" :class="{ 'reason-textarea--elder': elderMode }" class="reason-textarea"></textarea>
|
||
</view>
|
||
</template>
|
||
<empty-data v-else />
|
||
<template #footer>
|
||
<footer-button v-if="!refundInfo && item" text="提交退费申请" @onClick="applyRefund" />
|
||
</template>
|
||
</full-page>
|
||
</template>
|
||
<script setup>
|
||
import {
|
||
ref,
|
||
computed,
|
||
onMounted,
|
||
onUnmounted
|
||
} from "vue";
|
||
import {
|
||
onLoad
|
||
} from "@dcloudio/uni-app";
|
||
import dayjs from "dayjs";
|
||
import { applyRefundOrder } from "@/utils/api";
|
||
import {
|
||
toast,
|
||
confirm,
|
||
loading,
|
||
hideLoading
|
||
} from "@/utils/widget";
|
||
|
||
import emptyData from "@/components/empty.vue";
|
||
import fullPage from "@/components/full-page.vue";
|
||
import footerButton from "@/components/footer-button.vue";
|
||
|
||
// 大字版状态管理
|
||
const elderMode = ref(false);
|
||
|
||
// 处理长辈模式变化
|
||
const handleElderModeChange = () => {
|
||
try {
|
||
const storedElderMode = uni.getStorageSync('elderMode');
|
||
elderMode.value = storedElderMode === 'true' || storedElderMode === true;
|
||
|
||
// 同步到全局数据
|
||
const app = getApp();
|
||
if (app && app.globalData) {
|
||
app.globalData.elderMode = elderMode.value;
|
||
}
|
||
} catch (error) {
|
||
console.error('获取长辈模式状态失败:', error);
|
||
elderMode.value = false;
|
||
}
|
||
};
|
||
|
||
onMounted(() => {
|
||
handleElderModeChange();
|
||
// 监听长辈模式变化事件
|
||
uni.$on('elderModeChanged', handleElderModeChange);
|
||
});
|
||
|
||
onUnmounted(() => {
|
||
// 移除事件监听
|
||
uni.$off('elderModeChanged', handleElderModeChange);
|
||
});
|
||
|
||
const item = ref(null)
|
||
const reason = ref('')
|
||
|
||
const refundInfo = computed(() => {
|
||
if (item.value && item.value.refundInfo) {
|
||
const { status, reason, updateTime, rejectReason, createTime } = item.value.refundInfo;
|
||
const date = dayjs(createTime).format('YYYY-MM-DD HH:mm');
|
||
if (status === 'INIT') {
|
||
return { title: '您已成功发起退费申请,请耐心等待处理', subTitle: '医生如同意您的申请,系统将退款给您。', date, reason }
|
||
}
|
||
if (status === 'PASS') {
|
||
return { title: '您的退费申请已通过', time: `${dayjs(updateTime).format('YYYY-MM-DD HH:mm')}`, date, reason }
|
||
}
|
||
if (status === 'REJECT') {
|
||
return { title: '您的退费申请已被拒绝', subTitle: `拒绝原因:${rejectReason || ''}`, time: `${dayjs(updateTime).format('YYYY-MM-DD HH:mm')}`, date, reason }
|
||
}
|
||
}
|
||
return null
|
||
})
|
||
|
||
onLoad((e) => {
|
||
const order = uni.getStorageSync('refund-order')
|
||
try {
|
||
item.value = order
|
||
} catch (e) { }
|
||
// uni.removeStorageSync('refund-order')
|
||
});
|
||
|
||
async function applyRefund() {
|
||
if (reason.value.trim() === '') {
|
||
toast('请输入退费原因')
|
||
return
|
||
}
|
||
confirm('确定提交退费申请吗?').then(async () => {
|
||
loading('正在提交申请')
|
||
try {
|
||
const { success, message, data } = await applyRefundOrder({
|
||
id: item.value._id,
|
||
orderId: item.value.orderId,
|
||
reason: reason.value.trim(),
|
||
})
|
||
hideLoading()
|
||
if (success) {
|
||
item.value.refundInfo = data;
|
||
toast('退费申请已提交')
|
||
} else {
|
||
toast(message)
|
||
}
|
||
} catch (e) {
|
||
hideLoading()
|
||
toast(e.message)
|
||
}
|
||
})
|
||
}
|
||
</script>
|
||
<style lang="scss" scoped>
|
||
.refund-info {
|
||
padding: 30rpx;
|
||
margin-bottom: 30rpx;
|
||
font-weight: 600;
|
||
font-size: 32rpx;
|
||
line-height: 50rpx;
|
||
background-color: white;
|
||
|
||
&--elder {
|
||
padding: 40rpx;
|
||
margin-bottom: 40rpx;
|
||
}
|
||
}
|
||
|
||
.refund-title {
|
||
&--elder {
|
||
font-size: 40rpx;
|
||
line-height: 64rpx;
|
||
}
|
||
}
|
||
|
||
.refund-subtitle {
|
||
color: #666;
|
||
font-size: 28rpx;
|
||
line-height: 44rpx;
|
||
font-weight: normal;
|
||
|
||
&--elder {
|
||
font-size: 36rpx;
|
||
line-height: 56rpx;
|
||
}
|
||
}
|
||
|
||
.order-head {
|
||
padding: 30rpx;
|
||
font-weight: bold;
|
||
font-size: 30rpx;
|
||
background: #fff;
|
||
margin-bottom: 1px;
|
||
|
||
&--elder {
|
||
padding: 40rpx;
|
||
font-size: 38rpx;
|
||
}
|
||
}
|
||
|
||
.order-head--gap {
|
||
margin-top: 20rpx;
|
||
}
|
||
|
||
.reason-container {
|
||
padding: 24rpx 30rpx;
|
||
background-color: #fff;
|
||
|
||
&--elder {
|
||
padding: 32rpx 40rpx;
|
||
}
|
||
}
|
||
|
||
.reason-textarea {
|
||
width: 650rpx;
|
||
height: 400rpx;
|
||
padding: 0 20rpx;
|
||
font-size: 28rpx;
|
||
line-height: 44rpx;
|
||
color: #333;
|
||
|
||
&--elder {
|
||
font-size: 36rpx;
|
||
line-height: 56rpx;
|
||
height: 500rpx;
|
||
padding: 0 24rpx;
|
||
}
|
||
}
|
||
|
||
.card {
|
||
background: white;
|
||
|
||
&--elder {
|
||
margin-top: 28rpx;
|
||
}
|
||
|
||
.info-row {
|
||
display: flex;
|
||
align-items: center;
|
||
justify-content: space-between;
|
||
|
||
&--elder {
|
||
margin: 8rpx 0;
|
||
}
|
||
}
|
||
|
||
&_head {
|
||
padding: 24rpx 30rpx 0;
|
||
font-size: 28rpx;
|
||
color: #333;
|
||
|
||
&--elder {
|
||
padding: 32rpx 40rpx 0;
|
||
font-size: 36rpx;
|
||
}
|
||
}
|
||
|
||
&_footer {
|
||
padding: 24rpx 30rpx;
|
||
font-size: 28rpx;
|
||
color: #666;
|
||
border-top: 1px solid #f0f0f0;
|
||
|
||
&--elder {
|
||
padding: 32rpx 40rpx;
|
||
font-size: 36rpx;
|
||
}
|
||
}
|
||
|
||
.doctor-info {
|
||
font-weight: bold;
|
||
max-width: 400rpx;
|
||
white-space: nowrap;
|
||
text-overflow: ellipsis;
|
||
overflow: hidden;
|
||
line-height: 48rpx;
|
||
font-size: 30rpx;
|
||
|
||
&--elder {
|
||
max-width: 500rpx;
|
||
line-height: 60rpx;
|
||
font-size: 38rpx;
|
||
}
|
||
}
|
||
|
||
.doctor-name--elder {
|
||
font-size: 38rpx;
|
||
}
|
||
|
||
.dept {
|
||
margin-left: 10rpx;
|
||
color: #666;
|
||
font-weight: normal;
|
||
font-size: 28rpx;
|
||
|
||
&--elder {
|
||
font-size: 36rpx;
|
||
margin-left: 14rpx;
|
||
}
|
||
}
|
||
|
||
.uni-primary {
|
||
&--elder {
|
||
font-size: 36rpx;
|
||
}
|
||
}
|
||
|
||
&_body {
|
||
padding: 24rpx 30rpx;
|
||
font-size: 28rpx;
|
||
line-height: 48rpx;
|
||
color: #333;
|
||
|
||
&--elder {
|
||
padding: 32rpx 40rpx;
|
||
font-size: 36rpx;
|
||
line-height: 60rpx;
|
||
}
|
||
|
||
.label {
|
||
color: #666;
|
||
flex-shrink: 0;
|
||
margin-right: 20rpx;
|
||
|
||
&--elder {
|
||
font-size: 36rpx;
|
||
margin-right: 24rpx;
|
||
}
|
||
}
|
||
|
||
.content--elder {
|
||
font-size: 36rpx;
|
||
}
|
||
|
||
.info-text--elder {
|
||
font-size: 36rpx;
|
||
}
|
||
|
||
.date-text--elder {
|
||
font-size: 36rpx;
|
||
}
|
||
}
|
||
.date-line {
|
||
margin-top: 16rpx;
|
||
color: #999;
|
||
font-size: 26rpx;
|
||
text-align: left;
|
||
|
||
&--elder {
|
||
margin-top: 20rpx;
|
||
font-size: 34rpx;
|
||
}
|
||
}
|
||
|
||
.desc {
|
||
&--elder {
|
||
margin: 8rpx 0;
|
||
}
|
||
}
|
||
}
|
||
|
||
.fee {
|
||
color: red;
|
||
|
||
&--elder {
|
||
font-size: 36rpx;
|
||
}
|
||
}
|
||
|
||
.fee-label--elder {
|
||
font-size: 36rpx;
|
||
}
|
||
</style> |