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

409 lines
12 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" :class="{ 'elder-mode': elderMode }">
<template v-if="order">
<view v-if="order.text" class="info" :class="{ 'info--elder': elderMode }">
<view class="name" :class="{ 'name--elder': elderMode }" :style="{ color: order.color }">{{ order.text }}</view>
<view v-if="order.subText" style="margin-top: 10rpx;" :class="{ 'sub-text--elder': elderMode }">{{ order.subText
}}</view>
</view>
<view class="info" :class="{ 'info--elder': elderMode }">
<view class="info-row" :class="{ 'info-row--elder': elderMode }">
<text class="name" :class="{ 'name--elder': elderMode }">{{ order.doctorName }}</text>
<text :class="{ 'title-text--elder': elderMode }">{{ order.doctorTitle }}</text>
</view>
<view class="info-row" :class="{ 'info-row--elder': elderMode }">
<text :class="{ 'hospital-text--elder': elderMode }">震元堂中医院</text>
<text v-if="order.deptName" :class="{ 'dept-text--elder': elderMode }"> | {{ order.deptName }}</text>
</view>
</view>
<disease-summary :order="order" :elderMode="elderMode" />
<view v-if="diagnosis" class="order-form" :class="{ 'order-form--elder': elderMode }">
<view class="order-form-row" :class="{ 'order-form-row--elder': elderMode }" @click="viewSumarry()">
<text class="order-form-label" :class="{ 'order-form-label--elder': elderMode }">病历概要</text>
<text style="color:$theme-brown-primary" :class="{ 'link-text--elder': elderMode }">点击查看</text>
</view>
</view>
<view class="order-form" :class="{ 'order-form--elder': elderMode }">
<view class="order-form-row" :class="{ 'order-form-row--elder': elderMode }">
<text class="order-form-label" :class="{ 'order-form-label--elder': elderMode }">订单编号</text>
<text :class="{ 'form-text--elder': elderMode }">{{ order.orderId }}</text>
</view>
<view class="order-form-row" :class="{ 'order-form-row--elder': elderMode }">
<text class="order-form-label" :class="{ 'order-form-label--elder': elderMode }">下单时间</text>
<text :class="{ 'form-text--elder': elderMode }">{{
order.createTime
? dayjs(order.createTime).format("YYYY-MM-DD HH:mm")
: ""
}}</text>
</view>
<view v-if="order.settlement && order.settlement.total_fee" class="order-form-row"
:class="{ 'order-form-row--elder': elderMode }">
<text class="order-form-label" :class="{ 'order-form-label--elder': elderMode }">互联网诊查费</text>
<text :class="{ 'form-text--elder': elderMode }">{{ order.settlement.total_fee }}</text>
</view>
<view v-if="order.settlement" class="order-form-row" :class="{ 'order-form-row--elder': elderMode }">
<text class="order-form-label" :class="{ 'order-form-label--elder': elderMode }">支付方式</text>
<text :class="{ 'form-text--elder': elderMode }">支付宝医保支付</text>
</view>
<view v-if="order.settlement && order.settlement.chage_date" class="order-form-row"
:class="{ 'order-form-row--elder': elderMode }">
<text class="order-form-label" :class="{ 'order-form-label--elder': elderMode }">支付时间</text>
<text :class="{ 'form-text--elder': elderMode }">
{{
order.settlement && order.settlement.chage_date
? dayjs(order.settlement.chage_date).format(
"YYYY-MM-DDHH: mm: ss"
)
: ""
}}
</text>
</view>
<view v-if="order.drugStoreName" class="order-form-row" :class="{ 'order-form-row--elder': elderMode }">
<text class="order-form-label" :class="{ 'order-form-label--elder': elderMode }">来源</text>
<text :class="{ 'form-text--elder': elderMode }"> {{ order.drugStoreName }} </text>
</view>
<view class="order-form-row" :class="{ 'order-form-row--elder': elderMode }">
<text class="order-form-label" :class="{ 'order-form-label--elder': elderMode }">终端</text>
<text :class="{ 'form-text--elder': elderMode }"> 支付宝小程序 </text>
</view>
</view>
</template>
<empty-data v-else :text="msg" />
<template #footer>
<view v-if="order && order.showFooter" class="footer" :class="{ 'footer--elder': elderMode }">
<view v-if="order.canPay" class="footer__btn primary" :class="{ 'footer__btn--elder': elderMode }"
@click="toPay()">支付</view>
<view v-if="order.canCancel" class="footer__btn inactive" :class="{ 'footer__btn--elder': elderMode }"
@click="cancelOrder()">取消</view>
<view v-if="order.enterRoom" class="footer__btn primary" :class="{ 'footer__btn--elder': elderMode }"
@click="enterRoom()">{{ order.enterRoomText }}</view>
</view>
</template>
</full-page>
</template>
<script setup>
import { ref, onMounted } from "vue";
import { onLoad, onUnload } from "@dcloudio/uni-app";
import dayjs from "dayjs";
import useYbPay from "@/hooks/useYbPay";
import {
getPatientOrder,
getOrderDiagnosis,
cancelConsultOrder,
} from "@/utils/api";
import { useIMStore } from "@/store/tim";
import { toast, confirm, loading, hideLoading } from "@/utils/widget";
import { getOrderStatus } from "@/utils";
import diseaseSummary from "@/pages/consult/components/disease-summary.vue";
import emptyData from "@/components/empty.vue";
import fullPage from "@/components/full-page.vue";
const order = ref(null);
const msg = ref("");
const pay = useYbPay(null, reload);
const diagnosis = ref(null)
const timer = ref(null)
// 适老化模式状态
const elderMode = ref(false);
onMounted(() => {
// 从本地存储读取适老化模式状态
const savedElderMode = uni.getStorageSync('elderMode')||false;
if (savedElderMode !== null && savedElderMode !== undefined) {
elderMode.value = !!savedElderMode
}
});
onLoad((e) => {
if (e.orderId) {
getOrderDetail(e.orderId);
}
});
onUnload(() => {
timer.value && clearInterval(timer.value)
})
function reload() {
if (order.value && order.value.orderId) {
getOrderDetail(order.value.orderId)
}
}
async function getOrderDetail(orderId) {
const { success, data, message } = await getPatientOrder({ orderId });
if (success) {
order.value = {
...data,
...getOrderStatus(data),
};
if (order.value.hasPassDiagnostic) {
getDiagnosis()
}
} else {
order.value = null;
toast(message);
msg.value = message || "获取订单失败";
}
console.log("order", order.value);
}
function toPay() {
pay(order.value);
}
async function cancelOrder() {
const item = order.value;
await confirm("确定取消订单吗?");
const { success, message } = await cancelConsultOrder({
orderId: item.orderId,
});
if (success) {
toast("取消成功");
getOrderDetail(item.orderId);
} else {
toast(message || "取消失败");
}
}
async function enterRoom() {
const { doctorCode, orderId } = order.value;
if (!doctorCode) {
toast("进入视频间错误,医生视频账号不存在 ");
return;
}
if (!orderId) {
toast("进入视频间错误,用户视频账号不存在 ");
return;
}
loading("正在进入视频间, 请稍后等待");
const imStore = useIMStore();
try {
const res = await imStore.login(orderId);
if (!res) {
hideLoading()
toast("IM 登录失败");
return;
}
await new Promise((resolve) => {
if (imStore.isSDKReady) {
resolve();
} else {
timer.value = setInterval(() => {
if (imStore.isSDKReady) {
clearInterval(timer.value);
timer.value = null
resolve();
}
}, 500);
}
});
const conversationID = `C2C${doctorCode}`;
uni.navigateTo({
url: `/pages/chat/index?conversationID=${conversationID}&orderId=${orderId}`,
});
} catch (e) {
hideLoading()
toast(`进入会话失败: ${e.message || "未知错误"}`);
}
}
async function getDiagnosis() {
const { data } = await getOrderDiagnosis({ orderId: order.value.orderId, status: 'PASS' });
diagnosis.value = data || null;
}
function viewSumarry() {
if (diagnosis.value) {
uni.setStorageSync('order-diagnosis', JSON.stringify(diagnosis.value));
uni.navigateTo({
url: '/pages/record/order-diagnosis'
})
}
}
</script>
<style lang="scss" scoped>
.order-form {
margin-top: 20rpx;
background: #fff;
// 适老化模式:表单区域整体变大
@at-root &--elder {
margin: 30rpx 20rpx 20rpx 20rpx;
border-radius: 16rpx;
box-shadow: 0 4rpx 12rpx rgba(0, 0, 0, 0.1);
}
}
.order-form-row {
display: flex;
padding: 24rpx 30rpx;
font-size: 28rpx;
color: #333;
@at-root &+& {
border-top: 1px solid #e5e5e5;
}
// 适老化模式:行内边距增加,字体放大,元素各占一行
@at-root &--elder {
flex-direction: column;
align-items: flex-start;
gap: 12rpx;
padding: 36rpx 40rpx;
font-size: 39rpx; // 28 * 1.4
font-weight: 500;
}
}
.order-form-label {
color: #666;
// 适老化模式:标签字体放大,加粗
@at-root &--elder {
font-size: 39rpx; // 28 * 1.4
font-weight: bold;
}
}
.info {
padding: 24rpx 30rpx;
margin-bottom: 20rpx;
background-color: #fff;
line-height: 40rpx;
color: #666;
font-size: 28rpx;
// 适老化模式:信息区域内边距增加,字体和行高放大
@at-root &--elder {
padding: 36rpx 40rpx;
margin: 30rpx 20rpx 20rpx 20rpx;
border-radius: 16rpx;
box-shadow: 0 4rpx 12rpx rgba(0, 0, 0, 0.1);
font-size: 39rpx; // 28 * 1.4
line-height: 56rpx; // 40 * 1.4
font-weight: 500;
}
}
.info-row {
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
// 适老化模式:元素各占一行,允许换行
@at-root &--elder {
white-space: normal;
overflow: visible;
text-overflow: unset;
display: flex;
flex-direction: column;
align-items: flex-start;
gap: 12rpx;
margin-bottom: 16rpx;
}
}
text {
white-space: nowrap;
}
.name {
margin-right: 12rpx;
font-size: 32rpx;
font-weight: bold;
color: #333;
// 适老化模式:名称字体放大
@at-root &--elder {
margin-right: 20rpx;
font-size: 45rpx; // 32 * 1.4
font-weight: bold;
}
}
.footer {
display: flex;
justify-content: flex-end;
padding: 24rpx 30rpx;
background: white;
// 适老化模式:底部区域内边距增加,按钮各占一行
@at-root &--elder {
flex-direction: column;
align-items: stretch;
gap: 16rpx;
padding: 36rpx 40rpx;
}
}
.footer__btn {
padding: 8rpx 20rpx;
font-size: 28rpx;
border-radius: 20rpx;
border: 1px solid;
color: #333;
@at-root &+& {
margin-left: 20rpx;
}
&.primary {
color: $theme-brown-primary;
}
&.inactive {
color: #666;
}
// 适老化模式:按钮变大,字体放大
@at-root &--elder {
padding: 16rpx 32rpx;
font-size: 39rpx; // 28 * 1.4
border-radius: 28rpx;
font-weight: bold;
text-align: center;
@at-root &+& {
margin-left: 0;
}
}
}
// 适老化模式额外样式类
.sub-text--elder {
font-size: 39rpx !important; // 28 * 1.4
font-weight: 500;
margin-top: 14rpx !important; // 10 * 1.4
}
.title-text--elder {
font-size: 39rpx !important; // 28 * 1.4
font-weight: 500;
}
.hospital-text--elder {
font-size: 39rpx !important; // 28 * 1.4
font-weight: 500;
}
.dept-text--elder {
font-size: 39rpx !important; // 28 * 1.4
font-weight: 500;
}
.link-text--elder {
font-size: 39rpx !important; // 28 * 1.4
font-weight: bold;
}
.form-text--elder {
font-size: 39rpx !important; // 28 * 1.4
font-weight: 500;
}
</style>