409 lines
12 KiB
Vue
409 lines
12 KiB
Vue
|
|
<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>
|