You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

608 lines
19 KiB
Vue

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

<script setup>
import DraggableButton from "@/pages/components/goHome.vue";
/**
* name
* usersa0ChunLuyu
* date2024年9月11日 19:24:50
*/
import { ref } from "vue";
import { $api, $response, $image } from "@/api";
import { onShow } from "@dcloudio/uni-app";
import { useStore } from "@/store";
const $store = useStore();
// groupId
let comboInfo = ref({}); // 套餐详情
let selectIds = ref([]); // 选中自选ID
let itemsInfo = ref({}); // 自选项目详情
let comboId = ref(""); // 套餐id
let personId = ref(""); // 患者id
let groupId = ref(""); // 团检id
let tabIndex = ref(-1); // 标签索引
let totalPrice = ref(0); // 总折扣价格
let groupInfo = ref({}); // 团检信息
let status = ref(0); // 1个检套餐 2个检自选 3团检套餐 4团检自选
let buyText = ref("立即购买"); // 购买按钮文字
let notice = ref({}); // 体检须知
const GetReadmeDetails = async () => {
const response = await $api("GetReadme");
$response(response, () => {
notice.value = response.data || false;
if (tabIndex.value == 0) {
let num = 5;
buyText.value = "0" + num;
tabIndex.value = 1;
let timer = setInterval(() => {
num--;
buyText.value = "0" + num;
if (num == 0) {
buyText.value = "立即购买";
clearInterval(timer);
}
}, 1000);
return;
}
uni.hideLoading();
});
};
const $props = defineProps({
comboId: {
type: String,
default: "",
},
personId: {
type: String,
default: "",
},
groupId: {
type: String,
default: "",
},
itemIds: {
type: String,
default: "",
},
});
const mountedAction = async () => {
selectIds.value = $props.itemIds?.split(",") || [];
console.log($store.user);
comboId.value = $props.comboId || "";
personId.value = $store.getUser().person_id || "";
groupId.value = $props.groupId || "";
// 团检空项目 - 套餐列表 - 套餐详情 - 自选 - 弹剩余额度提醒 - 团检详情
//
// 自选 - 弹推荐套餐/剩余额度提醒 - 团检详情
// 团检有项目 - 团检详情 - 自选 - 团检详情
// comboId && person_id
// 个检 - 套餐列表 - 套餐详情 - 自选 - 个检详情
//
// 自选 - 弹推荐套餐 - 个检详情
if (groupId.value) {
if (comboId.value) {
// 团检套餐
status.value = 3;
} else {
// 团检自选
status.value = 4;
}
} else {
if (comboId.value) {
// 个检套餐
status.value = 1;
} else {
// 个检自选
status.value = 2;
}
}
console.log(status.value, "1个检套餐 2个检自选 3团检套餐 4团检自选");
uni.showLoading({
title: "加载中",
});
getBuyInfo(); // 获取购买信息
};
const buy = () => {
if (tabIndex.value == 0) {
GetReadmeDetails();
}
if (tabIndex.value == 1 && buyText.value == "立即购买") {
$store.setBuyInfo({
combo_id: comboId.value,
person_id: personId.value,
group_id: groupId.value,
item_ids: selectIds.value,
hospital: $store.save_info.hospital,
});
$store.setYytjInfo({});
uni.navigateTo({
url: "/pages/main/tjyy/tjyy",
});
}
};
const getBuyInfo = async () => {
// 获取购买信息
let obj = {
item_ids: selectIds.value,
combo_id: comboId.value,
hospital: $store.save_info.hospital,
person_id: personId.value,
group_id: groupId.value,
};
const response = await $api("BuyInfo", obj);
$response(response, () => {
if (groupId.value && response.data.group_info.length) {
// 团检
groupInfo.value = response.data.group_info[0];
if (response.data.group_info[0].items?.length) {
status.value = 3;
}
}
comboInfo.value = response.data.combo_info;
itemsInfo.value = response.data.items_info;
totalPrice.value = response.data.true_price;
tabIndex.value = 0;
uni.hideLoading();
});
};
const addCombo = () => {
// 增加项目
let itemIds = $props.itemIds ? $props.itemIds : "";
let query = "?comboId=" + comboId.value + "&itemIds=" + itemIds;
if (groupId.value) {
query += "&groupId=" + groupId.value;
}
uni.navigateTo({
url: "/pages/main/tj/tjzx?" + query,
});
};
const config_ref = ref(null);
const configRef = (e) => {
if (!config_ref.value) {
config_ref.value = e;
mountedAction();
}
};
onShow(() => {
if (!!config_ref.value) {
mountedAction();
}
});
</script>
<template>
<DraggableButton />
<view>
<view v-if="!!$store.config">
<view :ref="configRef"></view>
</view>
</view>
<view class="px-30rpx box-border comboInfo">
<view
class="pt-35rpx rounded-15rpx px-10rpx bg-#fff pb-30rpx box-border b-0 b-t-1 b-solid b-#E1ECEE"
>
<view class="flex w-full" v-if="status == 1">
<!-- 1个检套餐 显示套餐信息 -->
<image
v-if="comboInfo.img"
:src="$image(comboInfo.img)"
class="w-190rpx h-190rpx mr-37rpx"
mode="widthFix"
/>
<view class="flex flex-col grow">
<text>{{ comboInfo.combo_name }}</text>
<view class="mt-13rpx mb-18rpx">
<uni-tag
v-for="(val, i) in comboInfo.tags"
:key="i"
size="small"
:inverted="true"
:text="val.text"
class="mr-8rpx"
:custom-style="
'background-color:' +
val.color +
';border-color:' +
val.color +
'; color:' +
val.text_color +
';'
"
/>
</view>
<view v-if="comboInfo.tags2?.length">
<text
v-for="(val, i) in comboInfo.tags2"
:key="i"
class="text-#8B8B8B text-20rpx line-height-[1] px-5rpx b-0 b-solid b-#8B8B8B"
:class="i == comboInfo.tags2?.length - 1 ? 'b-r-0' : 'b-r-2'"
>{{ val }}</text
>
</view>
<view class="mt-20rpx w-full flex items-end">
<text class="text-18rpx text-#EC3D15">¥</text>
<text class="text-38rpx text-#EC3D15 mx-10rpx -mb-8rpx">{{
comboInfo.price
}}</text>
<text class="text-18rpx text-#878787 line-through">{{
comboInfo.original_price
}}</text>
<text class="text-18rpx text-#878787 ml-auto mr-55rpx"
>已售{{ comboInfo.sale_count }}</text
>
</view>
</view>
</view>
<view
v-if="status == 1"
class="mt-25rpx pt-25rpx b-0 b-t-1 b-solid b-#E1ECEE bettween flex-col text-24rpx"
>
<!-- 1个检套餐显示 -->
<view>
<text class="text-#8B8B8B">适用人群:</text>
<text class="text-#0E0E0E">{{ comboInfo.crowd_name }}</text>
</view>
<view>
<text class="text-#8B8B8B">适用院区:</text>
<text class="text-#0E0E0E">{{ comboInfo.hospital_name }}</text>
</view>
</view>
<view v-if="status != 1" class="px-15rpx pt-10rpx">
<!-- 2个检自选 和 3团检套餐 4团检自选 都要显示头像和名字 -->
<view class="flex items-center">
<image
src="@/static/assets/userm.png"
class="w-70rpx h-70rpx mr-35rpx"
/>
<view class="flex items-center grow">
<text class="text-#707070 text-24rpx">您好,</text>
<text class="text-#0E0E0E text-32rpx">{{
groupId ? groupInfo.name : $store.getUser().name
}}</text>
</view>
</view>
<view v-if="status != 2" class="text-24rpx mt-40rpx">
<!-- 3团检套餐 4团检自选 都要显示单位部门等信息 -->
<view class="pb-30rpx">
<text class="text-#8B8B8B">单位名称:</text>
<text>{{ groupInfo.group_name }}</text>
</view>
<view class="pb-30rpx">
<text class="text-#8B8B8B">部门名称:</text>
<text>{{ groupInfo.bumen_name }}</text>
</view>
<view
class="pb-30rpx"
v-if="groupInfo.combo_name || comboInfo?.combo_name"
>
<text class="text-#8B8B8B">套餐名称:</text>
<text>{{ groupInfo.combo_name || comboInfo?.combo_name }}</text>
</view>
<view>
<text class="text-#8B8B8B">体检额度:</text>
<text>{{ groupInfo.tongshou_xiane }}</text>
</view>
</view>
</view>
</view>
<view class="pb-300rpx">
<view class="flex items-center justify-around px-30rpx mt-30rpx">
<text
v-if="status == 1 || status == 3"
@click="tabIndex = 0"
:class="tabIndex == 0 ? 'active' : ''"
class="text-30rpx text-#2E2E2E"
>套餐内容</text
>
<text
v-else
@click="tabIndex = 0"
:class="tabIndex == 0 ? 'active' : ''"
class="text-30rpx text-#2E2E2E"
>自选内容</text
>
<text
@click="GetReadmeDetails"
:class="tabIndex == 1 ? 'active' : ''"
class="text-30rpx text-#2E2E2E"
>体检须知</text
>
</view>
<view
v-if="tabIndex == 0"
class="mt-20rpx bg-#fff py-40rpx px-14rpx box-border flex-col flex"
>
<!-- 套餐内容 -->
<view v-if="comboInfo?.items?.length" class="mb-20rpx">
<!-- 套餐项目 -->
<view class="text-#2E2E2E text-30rpx center mb-20rpx"
>套餐项目({{ comboInfo?.items?.length }}项)</view
>
<view
class="flex h-67rpx bg-#239ea3 text-#fff text-26rpx rounded-10rpx"
>
<view
class="min-w-155rpx max-w-155rpx center b-0 b-r-4 b-solid b-#fff"
>检查项目</view
>
<view class="grow center">检查指标意义</view>
</view>
<view v-for="(val, index) in comboInfo?.items" :key="index">
<view v-if="val.keshi_name != '材料费'">
<view
class="flex h-55rpx bg-#9f9f9f text-#fff text-24rpx rounded-10rpx mt-10rpx"
>
<view
class="min-w-155rpx max-w-155rpx center b-0 b-r-4 b-solid b-#fff"
></view>
<view class="grow center"
>{{ val.keshi_name }}{{ val.children.length }}</view
>
</view>
<view
class="flex bg-#efefef text-#000 text-24rpx rounded-10rpx mt-10rpx"
v-for="(v, i) in val.children"
:key="i"
>
<view
class="min-w-155rpx break-all max-w-155rpx center b-0 b-r-4 b-solid b-#fff p-10rpx box-border text-center"
>
{{ v.name }}
</view>
<view class="grow center p-10rpx box-border">{{
v.desc || "-"
}}</view>
</view>
</view>
</view>
</view>
<!-- 团检内自带的项目 -->
<view v-if="groupInfo?.items?.length" class="mb-20rpx">
<!-- 套餐 -->
<view class="text-#2E2E2E text-30rpx center mb-20rpx"
>套餐项目({{ groupInfo?.items?.length }}项)</view
>
<view
class="flex h-67rpx bg-#239ea3 text-#fff text-26rpx rounded-10rpx"
>
<view
class="min-w-155rpx max-w-155rpx center b-0 b-r-4 b-solid b-#fff"
>检查项目</view
>
<view class="grow center">检查指标意义</view>
</view>
<view v-for="(val, index) in groupInfo?.items" :key="index">
<view
class="flex h-55rpx bg-#9f9f9f text-#fff text-24rpx rounded-10rpx mt-10rpx"
>
<view
class="min-w-155rpx max-w-155rpx center b-0 b-r-4 b-solid b-#fff"
></view>
<view class="grow center"
>{{ val.keshi_name }}{{ val.children.length }}</view
>
</view>
<view
class="flex bg-#efefef text-#000 text-24rpx rounded-10rpx mt-10rpx"
v-for="(v, i) in val.children"
:key="i"
>
<view
class="min-w-155rpx break-all max-w-155rpx center b-0 b-r-4 b-solid b-#fff p-10rpx box-border text-center"
>
{{ v.name }}
</view>
<view class="grow center p-10rpx box-border">{{
v.desc || "-"
}}</view>
</view>
</view>
</view>
<view v-if="itemsInfo.items?.length">
<!-- 自选 -->
<view class="text-#2E2E2E text-30rpx center mb-20rpx"
>自选项目({{ itemsInfo.items?.length }}项)</view
>
<view
class="flex h-67rpx bg-#239ea3 text-#fff text-26rpx rounded-10rpx"
>
<view
class="min-w-155rpx max-w-155rpx center b-0 b-r-4 b-solid b-#fff"
>检查项目</view
>
<view class="grow center">检查指标意义</view>
</view>
<view v-for="(val, index) in itemsInfo.items" :key="index">
<view
class="flex h-55rpx bg-#9f9f9f text-#fff text-24rpx rounded-10rpx mt-10rpx"
>
<view
class="min-w-155rpx max-w-155rpx center b-0 b-r-4 b-solid b-#fff"
></view>
<view class="grow center"
>{{ val.keshi_name }}{{ val.children.length }}</view
>
</view>
<view
class="flex bg-#efefef text-#000 text-24rpx rounded-10rpx mt-10rpx"
v-for="(v, i) in val.children"
:key="i"
>
<view
class="min-w-155rpx break-all max-w-155rpx center b-0 b-r-4 b-solid b-#fff p-10rpx box-border text-center"
>
{{ v.name }}
</view>
<view class="grow center p-10rpx box-border">{{
v.desc || "-"
}}</view>
</view>
</view>
</view>
</view>
<view v-if="tabIndex == 1">
<!-- 体检须知 -->
<view
style="box-shadow: 0rpx 0rpx 10rpx 0rpx rgba(0, 0, 0, 0.04)"
class="rounded-15rpx mt-20rpx bg-#fff py-40rpx px-14rpx box-border flex-col flex"
>
<view class="text-#2E2E2E text-30rpx font-500 text-center">
体检须知
</view>
<view class="text-30rpx text-#2E2E2E">
<image
class="w-5rpx h-26rpx"
src="@/static/assets/slices/tjcol2x.png"
></image>
体检须知
</view>
<view
class="flex flex-justify-around text-#111111 text-28rpx pt-24rpx pb-50rpx"
>
<view class="flex flex-col flex-items-center">
<image
class="w-80rpx h-80rpx"
src="@/static/assets/slices/xgtc.png"
></image>
选购套餐
</view>
<view class="pt-25rpx">
<image
class="w-30rpx h-30rpx"
src="@/static/assets/slices/lt.png"
></image>
</view>
<view class="flex flex-col flex-items-center">
<image
class="w-80rpx h-80rpx"
src="@/static/assets/slices/yytj.png"
></image>
预约体检
</view>
<view class="pt-25rpx">
<image
class="w-30rpx h-30rpx"
src="@/static/assets/slices/lt.png"
></image>
</view>
<view class="flex flex-col flex-items-center">
<image
class="w-80rpx h-80rpx"
src="@/static/assets/slices/qwty.png"
></image>
前往体检
</view>
<view class="pt-25rpx">
<image
class="w-30rpx h-30rpx"
src="@/static/assets/slices/lt.png"
></image>
</view>
<view class="flex flex-col flex-items-center">
<image
class="w-80rpx h-80rpx"
src="@/static/assets/slices/lqbg.png"
></image>
领取报告
</view>
</view>
<view class="pb-40rpx text-30rpx text-#2E2E2E">
<image
class="w-5rpx h-26rpx"
src="@/static/assets/slices/tjcol2x.png"
></image>
体检注意事项
</view>
<view v-html="notice.content" class="text-28rpx"></view>
</view>
</view>
</view>
<view
class="fixed bottom-0 left-0 w-full bg-#fff p-30rpx box-border between"
>
<view class="grow">
<view class="flex items-end" v-if="comboId != 0">
<text class="text-18rpx text-#878787">套餐价格</text>
<text class="text-21rpx text-#ED6907 mx-20rpx ml-56rpx"
>¥ {{ comboInfo.price }}</text
>
</view>
<view class="flex items-end">
<text class="text-18rpx text-#878787">自选项目价格</text>
<text class="text-21rpx text-#ED6907 mx-20rpx"
>¥ {{ itemsInfo.price || 0 }}</text
>
</view>
<view class="flex items-end">
<text class="text-18rpx text-#ED6907">合计费用</text>
<text class="text-24rpx text-#ED6907 ml-20rpx mr-5rpx">¥</text>
<text class="text-36rpx text-#ED6907 mr-20rpx font-bold">{{
totalPrice
}}</text>
</view>
</view>
<view class="flex">
<button
@click="addCombo()"
class="bg-#ED6907 text-30rpx text-#fff rounded-l-full px-34rpx w-200rpx h-full"
>
增加项目
</button>
<button
@click="buy()"
class="bg-#239EA3 text-30rpx text-#fff rounded-r-full px-34rpx w-200rpx h-full"
>
{{ buyText }}
</button>
</view>
</view>
</view>
</template>
<style scoped lang="scss">
.comboInfo {
position: relative;
z-index: 1;
&::after {
content: "";
width: 100%;
height: 50rpx;
background-color: #239ea3;
position: absolute;
left: 0;
top: 0;
z-index: -1;
}
.active {
color: #239ea3;
font-weight: bold;
position: relative;
&::after {
content: "";
width: 26rpx;
height: 3rpx;
background-color: #239ea3;
position: absolute;
left: 50%;
bottom: -10rpx;
transform: translateX(-50%);
}
}
}
</style>