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

661 lines
23 KiB

<template>
<view class="body-background" :style="{
backgroundImage:'url('+staticImage.wallpaperBgImage+')'
}"></view>
<HeaderNav title="预约服务" :is-back="true"></HeaderNav>
<view class="app-wallpaper">
<view class="addr-container">
<view class="addr-content-container">
<view class="addr-content">
<view class="addr-content-main row" :style="{
backgroundImage:'url('+staticImage.addrBg+')'
}" @click="navTo('/pages/Addr/index?type=select')">
<view class="main-img">
<image mode="widthFix" class="img" :src="staticImage.addrAvatar"/>
</view>
<view class="main-content">
<image mode="heightFix" class="img" :src="staticImage.addrFw"/>
<view class="main-content-text" style="max-width:300rpx;">
<u-text :text="address.info || '请输入具体地址'" color="#131313" size="30"></u-text>
</view>
</view>
<view class="main-select-btn ">
<view class="main-select-btn-gun"></view>
<view class="main-select-btn-content row">
<view class="content-img col-12">
<image mode="widthFix" class="img" :src="staticImage.addrBook"/>
</view>
<view class="content-text col-12">
选择地址
</view>
</view>
</view>
</view>
</view>
</view>
<view class="addr-background-container">
<view class="addr-background-content"></view>
</view>
</view>
<view class="order-container">
<view class="order-content-container">
<view class="order-content">
<view class="order-content-main row">
<view class="order-item row">
<view class="item-title">
服务日期
</view>
<view class="item-content row col">
<view class="item-content-tag" v-for="(item,index) in timeList" v-if="timeList.length !== 0">
<view class="tag-text" style="margin-bottom:10rpx ;">
{{ item.date }} {{(item.time)?'/'+item.time:''}}
</view>
<view class="tag-close" @click="delTime(index)">
<image mode="heightFix" class="img" :src="staticImage.tagClose"/>
</view>
</view>
<view class="" v-else @click="showCalendar">
<u-text text="请选择服务日期" size="28" color="#636363"></u-text>
</view>
</view>
<view class="item-icon" @click="showCalendar">
<u-icon name="arrow-right"></u-icon>
</view>
</view>
<view class="order-item row">
<view class="item-title">
增值服务
</view>
<view class="item-content row col">
<view class="item-content-tag" v-for="(item,index) in addServiceChecked" v-if="addServiceChecked.length !== 0">
<view class="tag-text">
{{item.name}}
</view>
<view class="tag-close" @click="delAddService(index)">
<image mode="heightFix" class="img" :src="staticImage.tagClose"/>
</view>
</view>
<view v-else>
<u-text text="请选择增值服务" size="28" color="#636363" @click="showAddServicePopup"></u-text>
</view>
</view>
<view class="item-icon" @click="showAddServicePopup">
<u-icon name="arrow-right"></u-icon>
</view>
</view>
<view class="order-item row" @click="navTo('/pages/UserCoupons/index?type=select')">
<view class="item-title">
选择优惠
</view>
<view class="item-content row col">
<view class="item-content-text" v-if="coupons.title">
{{coupons.title}}
</view>
<view class="item-content-text" v-else>
<u-text text="请选择优惠券" size="28" color="#636363"></u-text>
</view>
</view>
<view class="item-icon">
<u-icon name="arrow-right"></u-icon>
</view>
</view>
</view>
</view>
</view>
<view class="order-background-container">
<view class="order-background-content"></view>
</view>
</view>
<view class="order-container">
<view class="order-content-container">
<view class="order-content">
<view class="order-content-main row">
<view class="order-content-main-title-img">
<image mode="heightFix" class="img" :src="staticImage.selectPet"/>
</view>
<view class="order-item pet-page-item row">
<PetPage class="pet-page" :showCancel="true" type="lists" @change="selectPet" @del="delPet"></PetPage>
</view>
</view>
</view>
</view>
<view class="order-background-container">
<view class="order-background-content"></view>
</view>
</view>
<view class="order-container">
<view class="order-content-container">
<view class="order-content">
<view class="order-content-main row">
<view class="order-content-main-title-img col-12">
<image mode="heightFix" class="img" :src="staticImage.selectService"/>
</view>
<view class="order-item pet-page-item row">
<view class="order-item-container row" >
<view class="order-item-col col-4" @click="radioChange(item)" v-for="(item,index) in basicServiceList">
<view class="order-item-content-group">
<view class="count-group-content">
<image mode="heightFix" class="img" :src="item.logo||staticImage.groupImg"/>
<view class="group-title">{{item.name}}</view>
<view class="group-desc">{{parseFloat(item.price)}}/次</view>
<view class="group-checkbox">
<u-checkbox
:customStyle="{marginBottom: '8px'}"
:key="index"
:name="item"
:checked="item.id === this.basicServiceChecked"
@change="radioChange"
shape="circle"
size="32"
icon-size="30"
custom-style="justify-content:center;"
active-color="#4DC3B8"
>
</u-checkbox>
</view>
</view>
<view class="count-group-background">
<view class="count-background"></view>
</view>
</view>
</view>
</view>
</view>
</view>
</view>
</view>
<view class="order-background-container">
<view class="order-background-content"></view>
</view>
</view>
</view>
<view class="footer-menu row">
<view class="row col">
<view class="foot-menu-main-title row">
<view class="main-title">费用共计</view>
<view class="main-price">¥{{price.all_price}}</view>
<view class="main-title">元</view>
</view>
<view class="foot-menu-checkbox-group row col">
<view class="foot-menu-checkbox">
<u-checkbox
shape="circle"
size="26"
custom-style="margin-top:0;margin-bottom:0;"
icon-size="24"
active-color="#4DC3B8"
:checked="readInfo"
@change="readInfo = !readInfo"
></u-checkbox>
</view>
<view class="foot-menu-title">
<text>阅读并同意</text><text class="foot-menu-url" @click="showAgreement">《上门喂养协议》</text>
</view>
</view>
</view>
<view class="">
<MzButton
title="立即下单"
button-color="#4DC3B8"
font-color="#FFFFFF"
button-width="200rpx"
@click="readInfo ? orderPay() :$u.toast('请先同意协议')"
>
</MzButton>
</view>
</view>
<uv-calendar ref="calendar" mode="multiple" title="选择服务日期" color="#4DC3B8" round="40rpx">
<template #footer>
<MzButton button-color="#4DC3B8" button-width="90%" font-color="#fff" class="row" style="justify-content: center" @click="timeSelect">确定</MzButton>
</template>
</uv-calendar>
<uv-popup ref="agreement" mode="bottom" round="20rpx" closeable safeAreaInsetTop safeAreaInsetBottom custom-style="position:relative;">
<view class="title row" style="position:absolute;justify-content: center;width:100%;top:20rpx;left:0;">
<view class="value col" style="position: relative;text-align: center;">
<!-- <u-text text="协议内容" size="38" color="#191919"></u-text>-->
<view class="" style="position: relative;display:inline-block;">
<view style="color:#191919;font-size:38rpx;display:inline-block;position: relative;z-index: 2;">协议内容</view>
<view class="background" style="width:100%;height:50%;position: absolute;bottom:0;left:0;background-color:rgba(227, 191, 119, 0.6);display:inline-block;z-index:1;"></view>
</view>
</view>
</view>
<view style="padding:30rpx;max-height:700rpx;overflow: auto;">
<u-parse :content="feedPolicy"></u-parse>
</view>
</uv-popup>
<uv-popup ref="addServicePopup" mode="bottom" round="20" closeable safeAreaInsetTop safeAreaInsetBottom custom-style="position:relative;">
<view class="title row" style="position:absolute;justify-content: center;width:100%;top:20rpx;left:0;">
<view class="value col" style="position: relative;text-align: center;">
<!-- <u-text text="协议内容" size="38" color="#191919"></u-text>-->
<view class="" style="position: relative;display:inline-block;">
<view style="color:#191919;font-size:38rpx;display:inline-block;position: relative;z-index: 2;">增值服务</view>
<view class="background" style="width:100%;height:50%;position: absolute;bottom:0;left:0;background-color:rgba(227, 191, 119, 0.6);display:inline-block;z-index:1;"></view>
</view>
</view>
</view>
<view class="pop-service-container">
<u-cell-group custom-style="max-height:700rpx;overflow:auto;">
<u-cell
size="large"
:title="item.name"
:label="item.info"
isLink
right-icon=""
v-for="(item,index) in addServiceList"
@click="selectAddService(index)"
>
<template #value>
<view class="">
<view class="" style="display:flex;align-items: center">
<view class="">
<u-text :text="parseFloat(item.price)+'元'" size="32" style="white-space: nowrap;" line-height="32"></u-text>
</view>
<view class="">
<u-checkbox-group @change="addServiceChange">
<u-checkbox
:name="index"
:customStyle="{marginBottom: '0',marginTop: '0',marginLeft:'15rpx'}"
size="32"
:checked="item.checked"
activeColor="#4DC3B8"
iconSize="30"
>
</u-checkbox>
</u-checkbox-group>
</view>
</view>
</view>
</template>
</u-cell>
</u-cell-group>
<view class="row" style="padding-top:30rpx;">
<view class="col-6" style="padding:0 30rpx;">
<MzButton title="取消" @click="$refs.addServicePopup.close()"></MzButton>
</view>
<view class="col-6" style="padding:0 30rpx;">
<MzButton title="确认" @click="addServiceConfirm" button-color="#4DC3B8" font-color="#fff"></MzButton>
</view>
</view>
</view>
</uv-popup>
<uv-popup ref="doDatePopup" mode="bottom" round="20" closeable safeAreaInsetTop safeAreaInsetBottom custom-style="position:relative;">
<view class="title row" style="position:absolute;justify-content: center;width:100%;top:20rpx;left:0;">
<view class="value col" style="position: relative;text-align: center;">
<!-- <u-text text="协议内容" size="38" color="#191919"></u-text>-->
<view class="" style="position: relative;display:inline-block;">
<view style="color:#191919;font-size:38rpx;display:inline-block;position: relative;z-index: 2;">上门时间</view>
<view class="background" style="width:100%;height:50%;position: absolute;bottom:0;left:0;background-color:rgba(227, 191, 119, 0.6);display:inline-block;z-index:1;"></view>
</view>
</view>
</view>
<view class="pop-service-container">
<uv-vtabs
:chain="false"
:list="timeListTemp"
height="700rpx"
hdHeight="100rpx"
keyName="date"
:barScrollable="false"
barItemActiveLineStyle="background:#4DC3B8;color:#4DC3B8;"
barItemActiveStyle="color:#4DC3B8;"
@change="changeVTab"
>
<uv-vtabs-item v-if="timeListTemp.length>0">
<view class="item"
v-for="(item,index) in timeListTemp[vTabCurrent].time"
:key="index">
<view class="item-title" style="padding:30rpx;" @click="doTimeSelect(item,index)"
:style="{color:(item.checked)?'#4DC3B8':'#636363'}">
<text class="text">{{item.label}} ({{ item.value }})</text>
</view>
</view>
</uv-vtabs-item>
<uv-gap bg-color="#fff" height="600"></uv-gap>
</uv-vtabs>
<view class="row" style="padding-top:30rpx;">
<view class="col-6" style="padding:0 30rpx;">
<MzButton title="取消" @click="$refs.doDatePopup.close()"></MzButton>
</view>
<view class="col-6" style="padding:0 30rpx;">
<MzButton title="确认" @click="doDatePopupConfirm" button-color="#4DC3B8" font-color="#fff"></MzButton>
</view>
</view>
</view>
</uv-popup>
<!-- <RightNav></RightNav> -->
</template>
<script>
import {
imghost
} from '@/config/host.js'
import HeaderNav from '@/components/HeaderNav/Index.vue';
import FooterNav from '@/components/FooterNav/Index.vue';
import RightNav from '@/components/RightNav/Index.vue';
import MzButton from '../../components/MzButton/Index.vue';
import PetPage from '../../components/PetPage/Index.vue';
import api from '@/utils/functions.js';
import {cardDetail} from "@/api/card";
import {getAddressList} from "@/api/address";
import image from "@/config/image";
import {createOrderPrice, getOrderPrice, getStoreService} from "@/api/order";
import pet from "@/pages/Pet/index.vue";
import {getConfig} from "@/api/other";
export default {
computed: {
api() {
return api
}
},
components: {
HeaderNav,
FooterNav,
RightNav,
MzButton,
PetPage
},
data() {
return {
readInfo:false,
price:{
all_price:0,
price:0,
quan_reduce:0,
},
radioValue1:[],
list: ['未付款', '待评价', '已付款'],
curNow: 0,
id:'',
title: 'Hello',
loading: true,
timeList:[],
timeListTemp:[],
staticImage: image.OrderPage,
isTop: false,
pagePadding: 100,
orderCardList:[
{
title:'成都市武侯区丰德国际4栋...',
tags:['刷毛','洗澡'],
do_time:'2023/05/03 15—17时',
create_time:'2023/03/03 15:23:22',
},
{
title:'成都市武侯区丰德国际4栋...',
tags:['刷毛','洗澡'],
do_time:'2023/05/03 15—17时',
create_time:'2023/03/03 15:23:22',
},
],
couponsList: [{
price: '57',
title: '57元抵扣券',
cause: '满0.01使用',
coupons_number:10,
time: '满0.01元使用仅限线上预约下单使用',
is_timeout: false,
}],
address:{},
addServiceList:[],
basicServiceList:[],
pages:{
page:1,
limit:10
},
addServiceChecked:[],
coupons:{},
doTimeList:[
{
label:'上午',
value:'09:00-12:00'
},{
label:'下午',
value:'13:30-17:00'
},{
label:'晚上',
value:'07:00-19:30'
},
],
vTabCurrent:0,
petChecked:[],
basicServiceChecked:'',
feedPolicy:'',
}
},
onLoad(options) {
this.id = options.id;
},
updated() {
},
onShow(){
this.getDefaultAddress();
this.getUserCoupons();
},
methods: {
addServiceChange(e){
this.addServiceList[e].checked = !this.addServiceList[e].checked;
},
orderPay(){
if(
this.address
&&this.timeList.length>0
&&this.petChecked.length>0
&&this.basicServiceChecked!==''
){
console.log(this.basicServiceChecked)
createOrderPrice({
address_id: this.address.id,
do_date: this.timeList.map(res => [res.date,res.time]),
services: this.addServiceList.map(res => res.id).join(','),
basic_service:this.basicServiceChecked,
pet_ids: this.petChecked.map(res => res.id).join(','),
store_id:this.addServiceList[0].store_id,
user_coupon_id:this.coupons.id || 0
}).then(res => {
console.log(res)
this.price = res.data;
});
}
},
checkOrderData(){
if(
this.address
&&this.timeList.length>0
&&this.petChecked.length>0
&&this.basicServiceChecked!==''
){
console.log(this.basicServiceChecked)
getOrderPrice({
address_id: this.address.id,
do_date: this.timeList.map(res => [res.date,res.time]),
services: this.addServiceList.map(res => res.id).join(','),
basic_service:this.basicServiceChecked,
pet_ids: this.petChecked.map(res => res.id).join(','),
store_id:this.addServiceList[0].store_id,
user_coupon_id:this.coupons.id || 0
}).then(res => {
console.log(res)
this.price = res.data;
});
}
},
selectPet(petList){
this.petChecked = petList;
this.checkOrderData();
},
delPet(index){
this.petChecked.splice(index,1);
this.checkOrderData();
},
doDatePopupConfirm(){
this.timeListTemp.forEach(item => {
if(item.time === ""){
api.error(item.date+'未指定上门时间')
return false;
}
});
this.timeListTemp.forEach(item => {
item.time.forEach(row => {
if(row.checked){
this.timeList.push({date:item.date,time:row.value,label:row.label});
}
});
});
console.log(this.timeList)
// this.timeList = this.timeListTemp;
this.$refs.doDatePopup.close()
},
doTimeSelect(item,index){
console.log(this.timeListTemp[this.vTabCurrent].time[index])
this.timeListTemp[this.vTabCurrent].time[index].checked = !item.checked
this.checkOrderData();
},
changeVTab(index){
console.log(index)
this.vTabCurrent = index
},
getUserCoupons(){
let cacheCoupons = uni.getStorageSync('userCoupons');
if (cacheCoupons) {
console.log(cacheCoupons)
this.coupons = cacheCoupons;
uni.removeStorage({key:'userCoupons'});
}
},
showAddServicePopup(){
this.$refs.addServicePopup.open();
},
selectAddService(index){
this.addServiceList[index].checked = !this.addServiceList[index].checked;
},
addServiceConfirm(){
let list = [];
this.addServiceList.map(item => {
if(item.checked){
list.push(item);
}
})
this.addServiceChecked = list;
this.$refs.addServicePopup.close();
},
delAddService(index){
this.addServiceChecked.splice(index,1);
},
getStoreServiceList(){
getStoreService({address_id: this.address.id}).then(res => {
this.addServiceList = res.data.add_service.map(item => {
item.checked = false;
return item;
});
console.log(this.addServiceList)
this.basicServiceList = res.data.basic_service;
});
},
getDefaultAddress() {
let cacheAddress = uni.getStorageSync('address');
if (cacheAddress) {
console.log('hasCacheAddress')
console.log(cacheAddress)
this.address = cacheAddress;
} else {
getAddressList(this.pages).then(res => {
res.data.forEach(item => {
if (item.is_default === 1) {
this.address = item;
}
});
})
}
if(this.address.id){
this.getStoreServiceList();
}
},
delTime(index){
this.timeList.splice(index,1);
},
timeSelect(e){
let selected = this.$refs.calendar.selected;
this.timeListTemp = selected.map(item => {
return {
date:item,
time:[{
label:'上午',
value:'09:00-12:00',
checked:false,
},{
label:'下午',
value:'13:30-17:00',
checked:false,
},{
label:'晚上',
value:'07:00-19:30',
checked:false,
},]
}
});
// this.timeListTemp = this.timeList;
this.$refs.calendar.confirm();
this.$refs.doDatePopup.open();
},
showAgreement(){
getConfig('FeedPolicy').then(res => {
this.feedPolicy = res.data.FeedPolicy;
})
this.$refs.agreement.open();
},
navTo(url){
uni.navigateTo({
url:url
})
},
sectionChange(index) {
this.curNow = index;
},
radioChange(n) {
this.basicServiceChecked = n.id
this.radioValue1 = n.id
console.log('radioChange', n);
this.checkOrderData();
},
groupChange(n) {
console.log('radioChange', n);
},
confirm(){},
showCalendar(){
this.$refs.calendar.open();
},
},
onPageScroll(res) {
if(res.scrollTop <= 20){
uni.$emit('isTop', true);
}else{
uni.$emit('isTop', false);
}
},
created() {
this.pagePadding = (api.navHeight().navPaddingTop +
api.navHeight().navHeight + (api.navHeight().headerPadding * 2))
},
mounted() {
},
}
</script>
<style lang="scss">
@import './components/index.scss';
</style>