|
@@ -0,0 +1,229 @@
|
|
|
+<template>
|
|
|
+ <window-size class="package-item">
|
|
|
+ <van-card
|
|
|
+ :title="detail.name || detail.packageName"
|
|
|
+ :thumb="detail.thumbPath"
|
|
|
+ @click="showDesc"
|
|
|
+ >
|
|
|
+ <template #desc>
|
|
|
+ <div class="van-card__desc van-ellipsis">
|
|
|
+ {{ detail.description }}
|
|
|
+ </div>
|
|
|
+ <div v-if="from === '1'" class="p-time">
|
|
|
+ 购买时间:{{ detail.purchaseTime }}
|
|
|
+ </div>
|
|
|
+ </template>
|
|
|
+ <template #price>
|
|
|
+ <span v-if="from === '0'">
|
|
|
+ ¥ {{ detail.price?.toFixed(2) }}
|
|
|
+ </span>
|
|
|
+ <span v-else>
|
|
|
+ ¥ {{ detail.purchasePrice?.toFixed(2) }}
|
|
|
+ <span class="real-pay">
|
|
|
+ 实付金额:
|
|
|
+ <span>
|
|
|
+ ¥ {{ detail.cashpayAmt?.toFixed(2) }}
|
|
|
+ </span>
|
|
|
+ </span>
|
|
|
+ <span v-if="detail.state === 'REFUND'" class="refund-mark">
|
|
|
+ 已退款
|
|
|
+ </span>
|
|
|
+ <span v-else-if="detail.state === 'NOT_USED'" class="refund-btn">
|
|
|
+ <button @click.prevent.stop="beforeRefund">退款</button>
|
|
|
+ </span>
|
|
|
+ </span>
|
|
|
+ </template>
|
|
|
+ </van-card>
|
|
|
+ <van-tag style="margin-top: 12px">套餐详情</van-tag>
|
|
|
+ <div class="item-wrapper">
|
|
|
+ <div v-for="item in detail.items">
|
|
|
+ <div class="item-box">
|
|
|
+ <div class="item-name">{{ item.hisName }}</div>
|
|
|
+ <div v-if="from === '0'" class="item-price-quantity">
|
|
|
+ <div class="price">¥ {{ item.price?.toFixed(2) }}</div>
|
|
|
+ <div class="quantity">x{{ item.quantity }}</div>
|
|
|
+ </div>
|
|
|
+ <div v-else class="item-price-quantity">
|
|
|
+ <div class="used">已用数量:{{ item.usedQuantity }}</div>
|
|
|
+ <div class="usable">可用数量:{{ item.usableQuantity }}</div>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ <div v-if="from === '0'" class="buy-box">
|
|
|
+ <van-button block type="success" @click="toCashier">购买</van-button>
|
|
|
+ </div>
|
|
|
+ </window-size>
|
|
|
+</template>
|
|
|
+
|
|
|
+<script setup>
|
|
|
+import router from "@/router";
|
|
|
+import {onMounted, ref} from "vue";
|
|
|
+import {getPackageDetail, getPurchasedPackageItems, refund} from "@/api/package-mall";
|
|
|
+import store from "@/store";
|
|
|
+import {showConfirmDialog, showDialog} from "vant";
|
|
|
+
|
|
|
+const routeParams = router.currentRoute.value.params
|
|
|
+const from = ref('0')
|
|
|
+const detail = ref({})
|
|
|
+
|
|
|
+onMounted(() => {
|
|
|
+ from.value = routeParams.from
|
|
|
+ const id = routeParams.id
|
|
|
+ if (from.value === '0') {
|
|
|
+ getPackageDetail(id).then(res => {
|
|
|
+ detail.value = res;
|
|
|
+ })
|
|
|
+ } else {
|
|
|
+ getPurchasedPackageItems(id).then(res => {
|
|
|
+ detail.value = res;
|
|
|
+ })
|
|
|
+ }
|
|
|
+})
|
|
|
+
|
|
|
+function showDesc() {
|
|
|
+ showDialog({
|
|
|
+ title: '套餐描述',
|
|
|
+ message: detail.value.description
|
|
|
+ })
|
|
|
+}
|
|
|
+
|
|
|
+function toCashier() {
|
|
|
+ const createOrderRequest = {
|
|
|
+ body: `医院套餐(${detail.value.name})`,
|
|
|
+ orderType: 10,
|
|
|
+ wxmallPackageId: detail.value.id,
|
|
|
+ totalFee: detail.value.price,
|
|
|
+ patientId: routeParams.patientId,
|
|
|
+ fundpayAmt: 0,
|
|
|
+ acctpayAmt: 0,
|
|
|
+ cashpayAmt: detail.value.price,
|
|
|
+ couponAmt: 0,
|
|
|
+ }
|
|
|
+ store.dispatch({
|
|
|
+ type: 'storeCreateOrderRequest',
|
|
|
+ createOrderRequest,
|
|
|
+ }).then(() => {
|
|
|
+ router.push('/cashier')
|
|
|
+ })
|
|
|
+}
|
|
|
+
|
|
|
+function beforeRefund() {
|
|
|
+ showConfirmDialog({
|
|
|
+ title: '提示',
|
|
|
+ message: '退款无法返还已使用的代金券,是否确认退款?',
|
|
|
+ }).then(() => {
|
|
|
+ refund(detail.value.id, detail.value.wxTradeNo).then(res => {
|
|
|
+ detail.value.state = 'REFUND'
|
|
|
+ detail.value.items = res
|
|
|
+ showDialog({
|
|
|
+ title: '退款成功',
|
|
|
+ message: '已为您退款,请留意到账信息。',
|
|
|
+ })
|
|
|
+ })
|
|
|
+ }).catch(() => {
|
|
|
+ })
|
|
|
+}
|
|
|
+</script>
|
|
|
+
|
|
|
+<style lang="scss">
|
|
|
+.package-item {
|
|
|
+ .item-wrapper {
|
|
|
+ margin-top: 4px;
|
|
|
+ height: calc(100vh - 230px);
|
|
|
+ overflow-y: auto;
|
|
|
+
|
|
|
+ .item-box {
|
|
|
+ background: #f4f4f4;
|
|
|
+ margin: 8px 12px;
|
|
|
+ padding: 4px 12px;
|
|
|
+ border-radius: 4px;
|
|
|
+
|
|
|
+ .item-name {
|
|
|
+ font-size: 14px;
|
|
|
+ font-weight: bold;
|
|
|
+ color: #454545;
|
|
|
+ }
|
|
|
+
|
|
|
+ .item-price-quantity {
|
|
|
+ display: flex;
|
|
|
+ align-items: center;
|
|
|
+ font-size: 12px;
|
|
|
+ margin-top: 8px;
|
|
|
+
|
|
|
+ .price {
|
|
|
+ color: orangered;
|
|
|
+ width: 90%;
|
|
|
+ }
|
|
|
+
|
|
|
+ .quantity {
|
|
|
+ width: 10%;
|
|
|
+ text-align: right;
|
|
|
+ }
|
|
|
+
|
|
|
+ .used, .usable {
|
|
|
+ width: auto;
|
|
|
+ }
|
|
|
+
|
|
|
+ .usable {
|
|
|
+ color: orangered;
|
|
|
+ margin-left: 24px;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ .real-pay {
|
|
|
+ border: 1px solid gray;
|
|
|
+ padding: 2px;
|
|
|
+ margin-left: 12px;
|
|
|
+ font-weight: normal;
|
|
|
+
|
|
|
+ > span {
|
|
|
+ margin-left: -6px;
|
|
|
+ color: orangered;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ .refund-mark {
|
|
|
+ display: block;
|
|
|
+ position: absolute;
|
|
|
+ bottom: 0;
|
|
|
+ right: 0;
|
|
|
+ padding: 2px 6px;
|
|
|
+ background-color: #acacac;
|
|
|
+ color: white;
|
|
|
+ border-radius: 4px;
|
|
|
+ font-style: italic;
|
|
|
+ font-size: 12px;
|
|
|
+ }
|
|
|
+
|
|
|
+ .refund-btn {
|
|
|
+ display: block;
|
|
|
+ position: absolute;
|
|
|
+ right: 8px;
|
|
|
+ bottom: 0;
|
|
|
+
|
|
|
+ > button {
|
|
|
+ padding: 1px 8px;
|
|
|
+ border: none;
|
|
|
+ background-color: #004e45;
|
|
|
+ color: #fff;
|
|
|
+ border-radius: 2px;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ .buy-box {
|
|
|
+ height: 44px;
|
|
|
+ position: absolute;
|
|
|
+ bottom: 0;
|
|
|
+ left: 0;
|
|
|
+ right: 0;
|
|
|
+ }
|
|
|
+
|
|
|
+ .p-time {
|
|
|
+ margin: 2px 0;
|
|
|
+ color: #6e6e6e;
|
|
|
+ }
|
|
|
+}
|
|
|
+</style>
|