hn-hlw-app/pages/record/order-refund.vue
2026-07-27 11:26:39 +08:00

389 lines
9.2 KiB
Vue
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<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>