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.

558 lines
18 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 wj = ref(""); //
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({}); // 体检须知
let losePrice = ref(0); // 剩余金额
let popupTip = ref(null); // 剩余额度提示弹窗
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: "",
},
wj: {
type: String,
default: "",
},
});
const mountedAction = async () => {
selectIds.value = $props.itemIds ? $props.itemIds.split(",") : [];
wj.value = $props.wj || "";
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) {
if (losePrice.value > 0 && groupId.value.length>0) {
popupTip.value.open("center"); // 弹剩余额度提醒
return;
}
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,
duo_xuan_yi: $store.getDuoXuanYi(),
wj: wj.value,
});
if (!!$store.yytjInfo.doctor_name) {
$store.setYytjInfo({
doctor_name: $store.yytjInfo.doctor_name,
doctor_date: $store.yytjInfo.doctor_date,
doctor_id:$store.yytjInfo.doctor_id
});
} else {
$store.setYytjInfo({});
}
uni.setStorageSync("yytjInfoS", {});
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,
duo_xuan_yi: $store.getDuoXuanYi(),
wj: wj.value,
};
const response = await $api("BuyInfo", obj);
$response(response, () => {
uni.hideLoading();
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;
}
if(groupInfo.value.items?.length){
groupInfo.value.itemscount=0;
let itemscount=0
groupInfo.value.items.forEach((v,i)=>{
if(v.keshi_name!="材料费")
itemscount=itemscount+v.children.length
})
groupInfo.value.itemscount=itemscount
}
}
losePrice.value = response.data.lose_price;
comboInfo.value = response.data.combo_info;
itemsInfo.value = response.data.items_info;
if(itemsInfo.value.items?.length){
itemsInfo.value.itemscount=0;
let itemscount=0
itemsInfo.value.items.forEach((v,i)=>{
if(v.keshi_name!="材料费")
itemscount=itemscount+v.children.length
})
itemsInfo.value.itemscount=itemscount
}
totalPrice.value = response.data.true_price;
tabIndex.value = 0;
});
};
const addCombo = () => {
// 增加项目
let itemIds = $props.itemIds ? $props.itemIds : "";
let query = "?comboId=" + comboId.value + "&itemIds=" + itemIds;
if (groupId.value) {
query += "&groupId=" + groupId.value;
}
if($props.wj){
query +="&wj="+$props.wj
}
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();
}
};
const toreadme=()=>{
GetReadmeDetails();
popupTip.value.close()
}
onShow(() => {
if (!!config_ref.value) {
mountedAction();
}
});
</script>
<template>
<uni-popup ref="popupTip">
<view
class="mb-70rpx bg-#fff text-center box-border pt-80rpx pb-50rpx px-65rpx w-90vw rounded-15rpx"
>
<view
class="w-full text-center text-##090909 text-26rpx line-height-[50rpx]"
>您还剩余
{{ losePrice }}
元体检额度尚未使用确认提交后剩余体检额度将无法使用!</view
>
<view class="mt-50rpx between">
<button
type="primary"
@click="toreadme()"
class="w-196rpx h-68rpx center text-#fff text-24rpx !bg-#239EA3 rounded-8rpx"
>
我想好了
</button>
<button
@click="popupTip.close()"
class="w-196rpx h-68rpx center text-#239EA3 text-24rpx !bg-#D9F3F2 rounded-8rpx"
>
我再想想
</button>
</view>
</view>
</uni-popup>
<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?.tags[0]?.text }}</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.itemscount }}项)</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 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="itemsInfo.items?.length">
<!-- 自选 -->
<view class="text-#2E2E2E text-30rpx center mb-20rpx">自选项目({{ itemsInfo.itemscount }}项)</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 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>
<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-30rpx 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" style="line-height: 50rpx;"></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>