|
|
- <template>
- <view class="service-container">
- <view class="select-address">
- <view class="normal-bolb-text">
- 选择区域
- </view>
- <view class="select-address-value">
- <picker mode="multiSelector" @columnchange="columnchange" @change="bindMultiPickerColumnChange" :value="multiIndex"
- :range="multiArray">
- <view v-if="!isSelected" class="unselected">
- <img src="/static/images/details/add.svg" style="width: 20px;height: 20px;" alt="">
- <text class="unselected-text">点击选择区域</text>
- </view>
- <view v-else class="selected">
- <view class="selected-text">
- <text>{{multiArray[0][multiIndex[0]]}}</text>
- <text style="margin-left: 10px;">{{district}}</text>
- </view>
- <img src="/static/images/details/edit.svg" style="width: 18px;height: 18px;" alt="">
- </view>
- </picker>
- </view>
- </view>
- <view class="detailed-address">
- <view class="normal-bolb-text">
- 详细地址
- </view>
- <view class="detailed-address-value">
- <input type="text" placeholder="需具体xx区xx街道xx小区xx室" v-model="detailedAddress">
- </view>
- </view>
- <view class="pet-info">
- <view class="normal-bolb-text">
- 是否需要增加宠物数量
- </view>
- <view class="pet-info-tips">
- <view class="pet-info-tips-text">
- <img src="/static/images/details/tips.svg" style="width: 12px;height: 12px;" alt="">
- <text style="margin-left: 5px;">专业喂养套餐最多可服务3只猫或2只小型犬(不含遛狗)</text>
- </view>
- <view class="pet-info-tips-text">
- <img src="/static/images/details/tips.svg" style="width: 12px;height: 12px;" alt="">
- <text style="margin-left: 5px;">专业遛狗套餐最多可服务1只中型犬或2只小型犬(含喂养)</text>
- </view>
- </view>
- <view class="pet-info-number">
- <view v-for="(pet,index) in petPrices" class="pet-info-for" :key="index">
- <view class="normal-text">
- {{pet.petTypeName}}
- </view>
- <view class="pet-price-number">
- <view class="pet-price">
- <text style="font-size: 16px;">{{pet.price}}元</text>/只
- </view>
- <uni-number-box class="pet-number" @change="e=>changeNumber(e,index)" :value="pet.quantity"
- :min="0" :max="999" background="#fff">
- </uni-number-box>
- </view>
- <view v-if="index+1<petPrices.length" class="line" style="background-color: #FFE8C6;"></view>
- </view>
- </view>
- </view>
-
- <view class="content-container">
- <view class="normal-bolb-text">
- 服务频率
- </view>
- <view class="line" style="background-color: #EFEFEF;"></view>
- <view class="service-frequency-value">
- <uni-data-checkbox selectedColor="#FFB13F" v-model="selectedFrequency" :localdata="frequency"
- @change="changeFrequency"></uni-data-checkbox>
- </view>
- </view>
- <view class="content-container">
- <view class="content-header">
- <view class="normal-bolb-text">
- 预约日期 <text style="color: #999;font-size: 14px;margin-left: 5px;font-weight: normal;">(可选择多日)</text>
- </view>
- <text style="color: #A94F20;font-size: 14px;">总共选择{{selectedDate.length}}天</text>
- </view>
-
- <view class="line" style="background-color: #EFEFEF;"></view>
- <uni-calendar class="uni-calendar--hook" :selected="selectedDate" :startDate="startDate" :endDate="endDate"
- @change="change" :showMonth="false" />
- </view>
-
- <view class="content-container">
- <view class="normal-bolb-text">
- 选择预约时间
- </view>
- <view class="line" style="background-color: #EFEFEF;"></view>
- <view>
- <view v-if="selectedFrequency == 'twice_a_day'" style="color: #999;font-size: 14px;margin-bottom:14px;">
- 第一次服务时间
- </view>
- <view class="time-select">
- <view v-for="(item,index) in timeList"
- :class="['base-time',item.value == serviceTimeFirst?'time-selected':'time-unselected']"
- :key="index" @click="selectedTime(item.value)">
- <view style="font-size:14px;width: 100%;text-align: center;">{{item.value}}</view>
- <!-- <view style="font-size:12px;"
- :class="[item.value == serviceTimeFirst?'selected-color':'unselected-color']">
- {{item.status}}
- </view> -->
- </view>
- </view>
- </view>
-
- <view v-if="selectedFrequency == 'twice_a_day'">
- <view style="color: #999;font-size: 14px;margin:14px 0;">
- 第二次服务时间
- </view>
- <view class="time-select">
- <view v-for="item in timeList"
- :class="['base-time', item.value == serviceTimeFirst? 'time-disable': item.value == serviceTimeSecond? 'time-selected':'time-unselected']"
- @click="selectedSecondTime(item.value)" :key="item.value">
- <view style="font-size:14px;width: 100%;text-align: center;">{{item.value}}</view>
- <!-- <view style="font-size:12px;"
- :class="[item.value == serviceTimeFirst? 'disabled-color' : item.value == serviceTimeSecond?'selected-color':'unselected-color']">
- {{item.status}}
- </view> -->
- </view>
- </view>
- </view>
-
- </view>
-
- <view class="payment">
- <view class="total-price">
- <text class="total-price-text">应付价格:</text>
- <text class="total-price-value">¥{{totalPrice}}元</text>
- </view>
- <button class="payment-btn" @click="goNext">下一步</button>
- </view>
- <Kefu></Kefu>
-
- </view>
- </template>
-
- <script>
- import Kefu from '../common/kefu.vue'
- import {
- getDictList,
- getCity
- } from '@/api/system/user.js'
- export default {
- data() {
- return {
- multiArray: [],
- isSelected: false,
- cityList:[],
- multiIndex: [0, 0],
- district: '',
- detailedAddress: '',
- petPrices: [{
- type: 'cat',
- petTypeName: '猫',
- price: 10,
- quantity: 0
- },
- {
- type: 'small_dog',
- petTypeName: '小/中型犬',
- price: 10,
- quantity: 0
- },
- {
- type: 'large_dog',
- petTypeName: '大型犬',
- price: 20,
- quantity: 0
- }
- ],
- frequency: [{
- text: '一天一次',
- value: 'once_a_day'
-
- }, {
- text: '一天两次',
- value: 'twice_a_day'
- }],
- selectedFrequency: 'once_a_day',
- basePrice: 0,
- currentPrice: 0,
- totalPrice: 0,
- selectedDate: [],
- startDate: '',
- endDate: '',
- serviceTimeFirst: '',
- serviceTimeSecond: '',
- timeList: [{
- value: '08:00',
- status: '空闲',
-
- },
- {
- value: '09:00',
- status: '空闲',
- },
- {
- value: '10:00',
- status: '空闲',
- }, {
- value: '11:00',
- status: '空闲',
- },
- {
- value: '12:00',
- status: '空闲',
- },
- {
- value: '13:00',
- status: '空闲',
- },
- {
- value: '14:00',
- status: '空闲',
- },
- {
- value: '15:00',
- status: '空闲',
- },
- {
- value: '16:00',
- status: '空闲',
-
- }, {
- value: '17:00',
- status: '空闲',
- },
- {
- value: '18:00',
- status: '空闲',
- },
- {
- value: '19:00',
- status: '空闲',
- },
- {
- value: '20:00',
- status: '空闲',
- }
- ]
- };
- },
- components: {
- Kefu
- },
- onLoad: function(option) {
- uni.setLocale('zh')
- this.basePrice = option.price;
- this.currentPrice = option.price;
- console.log(option.price); //打印出上个页面传递的参数。
- },
- mounted() {
- this.getCalendarDate();
- this.getCityList()
- },
- methods: {
- getCityList() {
- getCity().then(res => {
- if (res.code == 200) {
- console.log('city', JSON.parse(res.msg));
- this.cityList = JSON.parse(res.msg)
- const cityLabels = this.cityList.map(item =>item.city)
- this.multiArray[0] = cityLabels
- this.multiArray[1] = this.cityList[0].region.map(e=> e.region)
-
- } else {
- this.$modal.showToast('获取城市失败,请联系系统管理员!');
- }
-
-
- })
- },
- columnchange(e){
- console.log(e)
- // 当滚动切换一级分类时,为当前的一级分类添加它的子类
- if (e.detail.column == 0) {
- const currentCity = this.cityList[e.detail.value]
- // #ifdef H5
- // 在小程序中直接赋值无效 H5 可直接赋值
- this.multiArray[1] = currentCity.region.map(e=>e.region)
- // #endif
- // #ifdef MP-WEIXIN
- // 在 H5 环境下 $set 会导致一级分类无法滚动, 小程序正常运行
- this.$set(this.multiArray, 1, currentCity.region.map(e=>e.region))
- // #endif
- this.multiIndex=[e.detail.value,0]
- }
- },
- bindMultiPickerColumnChange(e) {
- console.log('值为:' + e.detail.value)
- this.multiIndex = e.detail.value
- this.district = this.multiArray[1][this.multiIndex[1]]
- this.isSelected = true
- this.$forceUpdate()
- },
- changeNumber(e, i) {
- const outerObj = this.petPrices[i];
- outerObj.quantity = e;
- console.log(this.petPrices);
- this.getTotalPrice()
- },
- changeFrequency() {
- if (this.selectedFrequency === 'twice_a_day') {
- this.currentPrice = this.basePrice * 2 - 20;
- } else {
- this.currentPrice = this.basePrice;
- }
- this.getTotalPrice()
- },
- selectedTime(value) {
- this.serviceTimeFirst = value;
- this.serviceTimeSecond = '';
- },
- selectedSecondTime(value) {
- if (value != this.serviceTimeFirst) {
- this.serviceTimeSecond = value;
- }
- },
- getTotalPrice() {
- let currentPetPrice = 0
- for (let i = 0; i < this.petPrices.length; i++) {
- currentPetPrice += this.petPrices[i].quantity * this.petPrices[i].price;
- }
- let oneDayPrice = +currentPetPrice + +this.currentPrice
- this.totalPrice = oneDayPrice * this.selectedDate.length;
- },
- pdDate() {
- let currentDate = new Date();
- let year = currentDate.getFullYear();
- let month = currentDate.getMonth() + 1 < 10 ? '0' + (currentDate.getMonth() + 1) : currentDate.getMonth() +
- 1; // 月份从 0 开始,所以需要加 1
- let day = currentDate.getDate() + 1 < 10 ? '0' + (currentDate.getDate() + 1) : currentDate.getDate() + 1;
- let hour = currentDate.getHours();
-
- // 将日期格式化为字符串
- let nextDate = year + '-' + month + '-' + day;
- let currentTime = hour + ':00'
- // 将当前日期加一天
- if (this.selectedDate.find(item => item.date == nextDate)) {
- if ((this.serviceTimeFirst && currentTime > this.serviceTimeFirst) || (this.serviceTimeSecond &&
- currentTime > this.serviceTimeSecond)) {
- return false
- }
- }
- return true
- },
- goNext() {
- // 选择地址
- if (!this.isSelected) {
- this.$modal.showToast('请选择地址');
- return;
- }
- //详细地址
- if (!this.detailedAddress) {
- this.$modal.showToast('请填写详细地址');
- return;
- }
- //预定日期
- if (this.selectedDate.length < 1) {
- this.$modal.showToast('请至少选择一个预约日期');
- return;
- }
-
- //服务频次
- if (!((this.selectedFrequency == 'once_a_day' && this.serviceTimeFirst) ||
- (this.selectedFrequency == 'twice_a_day' && this.serviceTimeFirst && this.serviceTimeSecond))) {
- this.$modal.showToast('请选择预约时间');
- return;
- }
- if (!this.pdDate()) {
- this.$modal.showToast('首单可以服务的时间需距离当前时间24h以上,请重新选择时间');
- return;
- }
-
- this.$globalData.submitData.totalPrice = this.totalPrice;
- this.$globalData.submitData.address.province = this.multiArray[0][this.multiIndex[0]];
- this.$globalData.submitData.address.city = this.multiArray[0][this.multiIndex[0]];
- this.$globalData.submitData.address.district = this.district;
- this.$globalData.submitData.address.detailAddress = this.detailedAddress;
- this.$globalData.submitData.service.serviceFrequency = this.selectedFrequency;
- this.$globalData.submitData.service.serviceDate = this.selectedDate.map(item => item.date);
- this.$globalData.submitData.service.serviceTimeFirst = this.serviceTimeFirst;
- this.$globalData.submitData.service.serviceTimeSecond = this.serviceTimeSecond;
- this.$globalData.submitData.service.pet = this.petPrices.map(item => {
- if (item.quantity > 0) {
- return {
- type: item.type,
- quantity: item.quantity
- }
- }
- });
- this.setItemPrices()
- uni.navigateTo({
- url: "/pages/details/augmentedProduct"
- });
- },
- setItemPrices() {
- let itemPrices = [{
- itemType: '基础服务费',
- price: this.basePrice,
- quantity: this.selectedDate.length,
- unit: '次'
- }];
-
- for (let i = 0; i < this.petPrices.length; i++) {
- if (this.petPrices[i].quantity > 0) {
- let itemPrice = {
- itemType: '额外宠物' + '-' + this.petPrices[i].petTypeName,
- price: this.petPrices[i].price,
- quantity: this.petPrices[i].quantity * this.selectedDate.length,
- unit: '只'
- }
- itemPrices.push(itemPrice)
- }
- }
- this.$globalData.servicePrices = itemPrices
- },
- change(e) {
- console.log('change 返回:', e)
- // 选中日期
- const selectedValue = this.selectedDate.find(item => item.date === e.fulldate)
- if (selectedValue) {
- // 存在则移除
- this.selectedDate = this.selectedDate.filter(item => item.date !== e.fulldate);
- } else {
- this.selectedDate.push({
- date: e.fulldate,
- info: '预定'
- })
- }
- this.getTotalPrice();
- console.log(this.selectedDate)
- },
- getCalendarDate() {
- let tomorrow = new Date()
- tomorrow.setDate(tomorrow.getDate() + 2);
- this.startDate = this.formatDate(tomorrow);
-
- // 获取三个月后的日期
- let threeMonthsLater = new Date();
- threeMonthsLater.setMonth(threeMonthsLater.getMonth() + 3);
- this.endDate = this.formatDate(threeMonthsLater);
- },
- formatDate(date) {
- let year = date.getFullYear();
- let month = (date.getMonth() + 1).toString().padStart(2, '0');
- let day = date.getDate().toString().padStart(2, '0');
- return year + '-' + month + '-' + day;
- }
- },
- }
- </script>
-
- <style lang="scss">
- .service-container {
- background-color: #f5f5f7;
-
- .normal-bolb-text {
- font-size: 16px;
- font-weight: bold;
- line-height: 16px;
- color: #333;
- }
-
- .content-header {
- display: flex;
- justify-content: space-between;
- align-items: center;
- }
-
- .normal-text {
- font-size: 16px;
- color: #333;
- }
-
- .line {
- height: 1px;
- width: 100%;
- margin: 16px 0;
- }
-
- .select-address {
- background-color: #ffffff;
- width: 100%;
- padding: 14px 20px;
-
- .select-address-value {
- margin-top: 15px;
-
- .unselected {
- height: 60px;
- border-radius: 4px;
- border: 1px dashed #FFB13F;
- background: #FFFDF7;
- display: flex;
- justify-content: center;
- align-items: center;
-
- .unselected-text {
- color: #A94F20;
- font-size: 16px;
- margin-left: 10px;
- }
- }
-
- .selected {
- display: flex;
- justify-content: space-between;
- align-items: flex-end;
- padding-top: 14px;
- border-top: 1px solid #efefef;
-
- .selected-text {
- font-size: 16px;
- color: #333;
- }
- }
- }
- }
-
-
- .detailed-address {
- margin-top: 10px;
- background-color: #ffffff;
- padding: 14px 20px;
-
- .detailed-address-value {
- margin-top: 14px;
- border: 1px solid #efefef;
- border-radius: 4px;
- padding: 10px;
- }
- }
-
- .pet-info {
- margin-top: 10px;
- background-color: #ffffff;
- padding: 14px 20px;
-
- .pet-info-tips {
- display: flex;
- align-items: center;
- flex-wrap: wrap;
- background-color: #FFF1E3;
- width: 100%;
- height: 46px;
- padding: 6px 10px;
- margin: 14px 0;
- border-radius: 4px;
-
- .pet-info-tips-text {
- display: flex;
- align-items: center;
- color: #A94F20;
- font-size: 12px;
- line-height: 18px;
- width: 100%;
- }
- }
-
- .pet-info-number {
- padding: 16px;
- background-color: #FFFCF2;
- border: 1px solid #FFE8C6;
- border-radius: 4px;
-
- .pet-info-for {
- display: flex;
- justify-content: space-between;
- align-items: center;
- flex-wrap: wrap;
-
- .pet-price-number {
- display: flex;
- align-items: center;
-
- .pet-price {
- font-size: 14px;
- color: #FF530A;
- line-height: 16px;
- margin-right: 12px;
- }
-
- .pet-number {
- border: 1px solid #FFE8C6;
- border-radius: 4px;
- }
- }
-
- }
-
- }
- }
-
- .content-container {
- margin-top: 10px;
- background-color: #ffffff;
- padding: 14px 20px;
- }
-
- .time-select {
- display: flex;
- flex-wrap: wrap;
- justify-content: flex-start;
-
- .base-time {
- width: 25%;
- height: 60px;
- padding: 12px;
- display: flex;
- align-items: center;
- justify-content: center;
- flex-wrap: wrap;
- box-sizing: border-box;
- margin: -0.5px;
- }
-
- .time-unselected {
- border: 1px solid #FFE8C6;
- background-color: #FFFCF2;
- color: #333;
- }
-
- .time-selected {
- background-color: #FFBF60;
- border: 1px solid #FFB13F;
- color: #fff
- }
-
- .time-disable {
- background-color: #eee;
- border: 1px solid #FFE8C6;
- color: #999;
- }
-
- .unselected-color {
- color: #6ECD41;
- }
-
- .selected-color {
- color: #A94F20;
- }
-
- .disabled-color {
- color: #A1A1A1
- }
- }
-
-
- .payment {
- height: 56px;
- width: 100%;
- margin-top: 10px;
- padding: 10px 20px;
- background-color: #ffffff;
- display: flex;
- justify-content: space-between;
- align-items: center;
-
- .total-price-text {
- color: #333;
- font-size: 16px;
- font-weight: blob;
- line-height: 16px;
- }
-
- .total-price-value {
- color: #FF530A;
- font-size: 22px;
- font-weight: blob;
- line-height: 16px;
- }
-
- .payment-btn {
- width: 140px;
- height: 38px;
- border-radius: 6px;
- background: #FFB13F;
- color: #fff;
- font-size: 16px;
- margin: 0;
- display: flex;
- align-items: center;
- justify-content: center;
- }
- }
- }
- </style>
|