hn-hlw-app/pages/record/order-refund.vue

389 lines
9.2 KiB
Vue
Raw Permalink Normal View History

2026-07-27 11:26:39 +08:00
<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>