hz-zhhq-app/pages/haircut-order/haircut-order.vue

850 lines
21 KiB
Vue
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<template>
<view class="hzIndex">
<hzHeader title="理发预约受理"></hzHeader>
<view class="container hzContent">
<view class="main" :style="{paddingBottom:currentTabIndex == 0?'300upx':'180upx'}">
<!-- <scroll-view scroll-x="true" class="scroll-view">
<view class="time-item-box" :class="chooseDateIndex == index ? 'time-active' : ''" v-for="(item, index) in date" :key="index" @click="switchTab(index)">
<text class="time">{{ item.tiems.substr(5, 10) }}</text>
<text class="week">{{ item.week }}</text>
</view>
</scroll-view> -->
<view class="tab-box">
<view class="tab-item" :class="currentTabIndex == 0 ? 'active_tab' : ''"
@click="currentTabIndex = 0">
理发预约
<view class="tabBottom" v-if="currentTabIndex == 0"></view>
</view>
<view class="tab-item" :class="currentTabIndex == 1 ? 'active_tab' : ''"
@click="currentTabIndex = 1">
预约记录
<view class="tabBottom" v-if="currentTabIndex == 1"></view>
</view>
</view>
<view class="reservation-box" v-if="currentTabIndex == 0 ">
<view class="selectDate">
<scroll-view scroll-x="true" class="scroll-view">
<view class="time-item-box" :class="chooseDateIndex == index ? 'time-active' : ''"
v-for="(item,index) in date" :key="index" @click="switchTab(index)">
<view class="time">{{item.tiems.substr(5,10)}}</view>
<view class="week">{{item.week}}</view>
</view>
</scroll-view>
<!-- <view class="barber">
<view style="font-size: 14px;color:#666">地点:</view>
<view class="barber-box">
<view class="barber-item" v-for="(item, index) in placeArr"
:class="placeArrIndex == index ? 'barberactive' : ''" :key="index"
@click="choosePlace(index)">
{{item}}
</view>
</view>
</view> -->
</view>
<!-- 预约记录列表 -->
<view v-if="timelist.length > 0" class="flex-item">
<view class="order-detail" v-for="(item, index) in timelist" :key="index">
<view class="detail" v-if="item.apply_person_name!=null">
<view class="row-1">
<view class="text_time">{{ item.haircut_time }}</view>
<!-- <view class="text_cph">{{ item.licenseplate }}</view>
<view class="text_loc">{{ item.apply_place }}</view> -->
</view>
<view class="row-2">
<view class="text_name">{{ item.apply_person_name }}</view>
<view class="text_tel">{{ item.apply_person_tel }}</view>
</view>
<view class="flex-btn">
<view v-if="item.countData ==1" @click="cancleHaircut(item)" class="qc-btn">客户未至
</view>
<!-- <view v-if="item.endremind ==0" @click="remindPickUpCar(item)" class="qc-btn">通知取车
</view>
<view v-if="item.endremind > 0" class="qc-btn bg-gray">已通知</view> -->
</view>
</view>
<view class="detail-empty" v-if="item.apply_person_name==''||item.apply_person_name==null">
<view class="no-time">{{ item.haircut_time }}</view>
<view class="no-text">无预约</view>
</view>
</view>
</view>
<content-none v-else :padTop="25"></content-none>
<load-more :loadingType="loadingType" :contentText="contentText"></load-more>
<view class="fixedView">
<view>预约人数 <text style="font-size: 32upx;color: #0DB0A7;">{{orderNum}}</text> 人</view>
<view v-if="chooseDateIndex==0">
<view @click="remindForHairCut()" class="tx-style">
提醒下一位</view>
</view>
</view>
</view>
<!-- <view class="content" >
<view v-if="timelist.length > 0" >
<view class="order-detail" v-for="(item, index) in timelist" :key="index">
<view class="detail" v-if="item.countData==1" >
<view style="color: #00c277;height:25px;margin: 0upx;">{{ item.haircut_time }}</view>
<view style="color: #00c277;height:25px;margin: 0upx;">{{ item.apply_person_name }} {{ item.apply_person_tel }}</view>
<view style="color: #00c277;height:20px;margin: 0upx;">{{areas[item.barber_id]}}</view>
</view>
<view class="detail" v-if="item.countData!=1">
<view style="height:25px;margin: 0upx;">{{ item.haircut_time }}</view>
<view style="height:45px;line-height: 45px;margin: 0upx;">无预约</view>
</view>
<view style="height: 25px;margin: 0px;">
<view style="height: 25px;margin: 0px;" v-if="item.countData ==1" @click="cancleHaircut(item)" class="qc-btn" >客户未至</view>
</view>
</view>
<view class="order-detail" style="height: 120upx;border: none;">
</view>
</view>
<view class="fixedView" >
<view style="float: left;width: 40%;">预约人数 {{orderNum}}人</view>
<view v-if="chooseDateIndex==0" style="float: right;width: 40%;padding-right: 20upx;text-align: right;">
<view @click="remindForHairCut()" style="height: 60upx;line-height: 60upx;margin-top: 20upx;color: #00C277;border:2upx solid #00C277;text-align: center;border-radius: 10upx;" >提醒下一位</view>
</view>
</view>
<view style="height: 110upx;"></view>
</view> -->
<view v-if="currentTabIndex==1">
<view class="search-box">
<view class="form-item searchv">
<picker class="time-data" mode="date" @change="startDateChange">
<view class="">{{ startDate }}</view>
</picker>
<text class="timecenter">至</text>
<picker class="time-data" mode="date" @change="endDateChange">
<view class="">{{ endDate }}</view>
</picker>
<!-- <view class="search" style="height: 60upx;font-size: 26upx;margin-top: 7upx;" @click="searchYjList">搜索</view> -->
<!-- <image style="width: 5vh;height: 5vh;margin-left: 1vh;" @click="search" src="/static/icons/seach.png" mode=""></image>
-->
</view>
<view class="tj-box">
<text style="font-size: 28upx; color: #666666;">时段内预约总数:</text>
<text style="font-size: 32upx;color: #0DB0A7;">{{count}}</text>
</view>
</view>
<view class="list-box" v-if="appointlist.length > 0">
<view class="detail-box" v-for="(item, index) in appointlist" :key="index">
<view class="detail_header">
<image class="blueSign" src="@/static/haircut/leftIcon.png" mode=""></image>
<text class="font-tilte">理发预约</text>
<!-- <text class="slect_icon"></text> -->
<text class="font-result" v-if="item.int_status==0">预约成功</text>
<text class="font-result" v-if="item.int_status==1" style="color: #666666;">已取消</text>
<text class="font-result" v-if="item.int_status==2" style="color: red;">客户未至</text>
</view>
<view class="detail_msg">
<view class="info-item">
<text>预约人员:</text>
<text class="infoSpan">{{ item.userName }}</text>
</view>
<view class="info-item">
<text>预约时间:</text>
<text class="infoSpan">{{ item.timeQ }}</text>
</view>
<view class="info-item">
<text>地  点:</text>
<text class="infoSpan">{{ areas[item.barber_id||1]}}</text>
</view>
<view class="info-item">
<text>申请时间:</text>
<text class="infoSpan">{{ formatDate(item.apply_time) }}</text>
</view>
</view>
</view>
</view>
<content-none :padTop="20" v-else></content-none>
</view>
</view>
</view>
</view>
</template>
<script>
import {
initHaircutForBarber,
getBasicInfoForBarber,
getHaircutList,
remindForHairCut,
cancleHaircut,
getAllHaircutList
} from '@/common/api.js';
import {
callbackRequest,
getStorage,
alertTip,
formatDate,
getNumDate
} from '@/common/util.js';
import contentNone from '@/components/contentNone.vue';
export default {
data() {
return {
userInfo: getStorage('userInfo'),
pos: 0,
timelist: [],
kind: [],
barber: ['李师傅', '杨师傅'],
isActive: -9,
kindActive: 0,
barber1: 0,
barber2: 1,
barberActive: 0,
barberActive1: -1,
part: '',
name: '',
tel: '',
key: true,
date: getNumDate(7),
chooseDateIndex: 0,
fagtime: '',
orderNum: 0,
areas: ['', '会议中心', '科技楼'],
places: [],
choosePlaceId: '', // 当前选择的地点
choosePlaceName: '',
currentTabIndex: 0,
//分页
page: 1,
pageSize: 10,
loadingType: 0, //0-loading前1-loading中2-没有更多了
contentText: {
contentdown: '上拉加载更多',
contentrefresh: '正在加载...',
contentnomore: '没有更多数据了'
},
user: getStorage('userInfo'),
appointlist: [],
date: getNumDate(7), //获取今天起 最近7天时间
formatDate: formatDate,
placeArrIndex: 0,
formatDate: formatDate,
startDate: this.getDay(-7),
endDate: this.getDay(0),
count: 0,
};
},
components: {
contentNone
},
watch: {
currentTabIndex: function(newVal, oldVal) {
if (newVal == 1) {
this.page = 1;
this.loadingType = 0;
this.getList();
} else {
// 初始化
if (this.date[this.chooseDateIndex].weekDay == "1" || this.date[this.chooseDateIndex].weekDay ==
"3" || this
.date[this.chooseDateIndex].weekDay == "5") {
this.places = [{
id: '2',
name: '科技楼'
}];
this.choosePlaceId = '2';
this.choosePlaceName = '科技楼';
} else {
this.places = [{
id: '1',
name: '会议中心'
}];
this.choosePlaceId = '1';
this.choosePlaceName = '会议中心';
}
this.initData();
}
}
},
onLoad() {
if (this.date[this.chooseDateIndex].weekDay == "1" || this.date[this.chooseDateIndex].weekDay == "3" || this
.date[this.chooseDateIndex].weekDay == "5") {
this.places = [{
id: '2',
name: '科技楼'
}];
this.choosePlaceId = '2';
this.choosePlaceName = '科技楼';
} else {
this.places = [{
id: '1',
name: '会议中心'
}];
this.choosePlaceId = '1';
this.choosePlaceName = '会议中心';
}
this.initData();
},
methods: {
initData() {
let params = {
method: initHaircutForBarber,
data: {
userId: this.userInfo.id,
applyDate: this.date[this.chooseDateIndex].tiems,
barbershop: this.choosePlaceId
}
};
callbackRequest(params).then(res => {
res = res.data;
this.timelist = res.returnData[0].remain;
this.orderNum = 0;
for (var i = 0; i < this.timelist.length; i++) {
this.orderNum += this.timelist[i].countData;
}
// this.fagtime = this.timelist[0].apply_time_id;
// this.isActive = this.timelist[0].apply_time_id;
// setTimeout(() => {
// this.checkItem(this.fagtime);
// }, 100);
});
},
remindForHairCut() {
uni.showModal({
title: '确认',
content: '请确认是否发起提醒。',
showCancel: true,
cancelText: '取消',
confirmText: '确认',
success: res => {
if (res.confirm) {
let params = {
method: remindForHairCut,
data: {
userId: this.userInfo.id,
barbershop: this.choosePlaceId
}
};
callbackRequest(params).then(res => {
if (res.data.returnCode == 1) {
alertTip("已成功通知下一位!");
}
});
} else if (res.cancel) {}
}
});
},
cancleHaircut(item) {
uni.showModal({
title: '确认',
content: '请确认是否设置为客户未至!',
showCancel: true,
cancelText: '取消',
confirmText: '确认',
success: res => {
if (res.confirm) {
let params = {
method: cancleHaircut,
data: {
id: item.id,
intStatus: 2
}
};
callbackRequest(params).then(res => {
if (res.data.returnCode == 1) {
alertTip(res.data.returnMsg);
setTimeout(_ => {
this.initData();
}, 1000);
} else {
alertTip(res.data.returnMsg);
}
});
} else if (res.cancel) {}
}
});
},
//切换日期
switchTab: function(i) {
this.chooseDateIndex = i;
this.isActive = '';
if (this.date[this.chooseDateIndex].weekDay == "1" || this.date[this.chooseDateIndex].weekDay == "3" ||
this.date[this.chooseDateIndex].weekDay == "5") {
this.places = [{
id: '2',
name: '科技楼'
}];
this.choosePlaceId = '2';
this.choosePlaceName = '科技楼';
} else {
this.places = [{
id: '1',
name: '会议中心'
}];
this.choosePlaceId = '1';
this.choosePlaceName = '会议中心';
}
this.initData();
},
checkItem: function(id) {
var self = this;
self.isActive = id;
},
handle: function(index) {
this.kindActive = index;
},
check: function(index) {
this.barberActive = index;
},
cancel: function(item) {
if (confirm('是否取消')) {
var self = this;
item.id;
// request.visitorInfoUpdateStatus({
// applyType: "06",
// applyId: item.id,
// status: "3"
// }, function(res) {
// if (res.returnCode == 1) {
// self.checkItem(self.isActive);
// mui.toast("取消成功", {
// duration: "long"
// });
// request.getBasicInfoForBarber({
// applyDate: self.haircutDate
// }, function(res) {
// vm.kind = res.returnData[0].kind;
// vm.timelist = res.returnData[0].remain.slice(0, 2)
// })
// } else mui.toast(res.returnMsg, {
// duration: "long"
// })
// })
}
},
onNavigationBarButtonTap(e) {
const index = e.index;
if (index == 0) {
var url = "/pages/haircut-order/haircut-history";
uni.navigateTo({
url
});
}
},
change: function(id) {
var self = this;
storage.set({
id: id,
openType: 8
});
window.location.href = './haircut.html';
},
getList() {
// let lfDatas = uni.getStorageSync('lfDatas');
// this.appointlist = lfDatas;
let params = {
method: getAllHaircutList,
data: {
pageNum: this.page,
pageSize: this.pageSize,
startDate: this.startDate,
endDate: this.endDate,
userId: this.user.id
}
};
callbackRequest(params).then(res => {
if (res.data.returnCode == 1) {
if (this.page == 1) {
this.appointlist = res.data.returnData.list || [];
this.count = res.data.returnData.count || 0;
} else {
if (res.data.returnData.length > 0) {
this.appointlist = this.appointlist.concat(res.data.returnData.list);
this.loadingType = 0;
} else {
this.loadingType = 2;
}
}
}
});
},
startDateChange: function(e) {
this.startDate = e.target.value;
this.page = 1;
this.loadingType = 0;
this.getList();
},
endDateChange: function(e) {
this.endDate = e.target.value;
this.page = 1;
this.loadingType = 0;
this.getList();
},
getDay(i) {
var date1 = new Date(new Date().getTime() + i * 24 * 60 * 60 * 1000);
var year = date1.getFullYear();
var month = date1.getMonth() + 1;
if (month < 10) {
month = "0" + month;
}
var day = date1.getDate();
if (day < 10) {
day = "0" + day;
}
return year + '-' + month + '-' + day;
},
}
};
</script>
<style lang="scss">
@import url('../../static/css/haircut-order.css');
.main {
.tab-box {
width: 80%;
display: flex;
font-size: 36upx;
color: #555555;
.active_tab {
font-weight: 800;
}
.tab-item {
width: 40%;
.tabBottom {
width: 28%;
height: 6upx;
border-radius: 5px;
background-image: linear-gradient(to right, #64E182, #1CA7B2);
}
}
}
}
.container {
padding: 22upx;
margin-top: 150upx;
background-color: unset;
}
.selectDate {
background-color: #ffffff;
border-radius: 20upx;
// padding-bottom: 24upx;
}
.scroll-view {
margin-top: 20upx;
padding: 26upx 8upx;
white-space: nowrap;
.time-item-box {
margin: 0 8upx;
display: inline-block;
font-weight: 400;
font-size: 28upx;
color: #555;
border-radius: 16upx;
padding: 18upx 20upx;
background-color: #F2F6FA;
border: 1px solid #F2F6FA;
text-align: center;
}
.time-active {
background: #EDFCF7;
color: #0DB0A7;
border: 1px solid #0DB0A7;
}
}
.flex-item {
margin-top: 24upx;
padding: 24upx;
background-color: #ffffff;
padding-top: 0;
border-radius: 20upx;
overflow: hidden;
.detail {
background: #EDFCF7;
padding: 24upx;
display: grid;
.row-1 {
display: flex;
flex-direction: row;
align-items: center;
justify-content: space-between;
.text_time {
font-weight: bold;
font-size: 32upx;
color: #333333;
}
.text_cph {
font-size: 28upx;
color: #555555;
}
.text_loc {
font-size: 28upx;
color: #0DB0A7;
}
}
.row-2 {
display: flex;
flex-direction: row;
align-items: center;
justify-content: start;
font-size: 28upx;
color: #555555;
border-bottom: 1px dashed #B4E1DE;
.text_name {
margin-right: 24upx;
line-height: 70upx;
}
.text_tel {}
}
.flex-btn {
display: flex;
flex-direction: row;
align-items: center;
font-size: 24upx;
color: #0DB0A7;
text-align: center;
justify-self: end;
margin-top: 24upx;
.qc-btn {
width: 92*2upx;
height: 32*2upx;
border-radius: 32upx;
border: 1px solid #0DB0A7;
line-height: 32*2upx;
margin-left: 24upx;
}
}
}
}
.order-detail {
margin-top: 24upx;
border-radius: 6*2upx;
}
.order-detail .bg-gray {
background-color: #cfcfcf;
}
.detail-empty {
display: flex;
flex-direction: row;
align-items: center;
justify-content: space-between;
height: 46*2upx;
background: #F2F6FA;
border-radius: 16upx;
padding: 0 24upx;
.no-time {
font-weight: bold;
font-size: 16*2upx;
color: #333333;
line-height: 46*2upx;
}
.no-text {
font-size: 14px;
color: #CACACA;
line-height: 46*2upx;
}
}
.search-box {
margin-top: 36upx;
padding: 24upx;
background-color: #fff;
border-radius: 20upx;
}
.form-item {
overflow: hidden;
border-bottom: 1px solid #eee;
}
.searchv {
text-align: center;
display: flex;
flex-direction: row;
justify-content: space-between;
align-items: center;
}
.timecenter {
display: inline-block;
font-size: 24upx;
margin-left: 10upx;
margin-right: 10upx;
color: #555555;
line-height: 30upx;
// margin-top: 15upx;
}
.time-data {
width: 300upx;
height: 60upx;
font-size: 28upx;
display: inline-block;
border: 1px solid #0DB0A7;
border-radius: 8upx;
color: #555555;
line-height: 60upx;
}
.tj-box {
margin-top: 28upx;
display: flex;
flex-direction: row;
align-items: center;
}
.list-box {
margin-top: 24upx;
.detail-box {
// margin-top: 10upx;
margin-bottom: 24upx;
background: #ffffff;
border-radius: 20upx;
padding: 24upx;
}
.detail_header {
padding: 15upx 0upx;
border-bottom: 1px solid #eee;
display: flex;
flex-direction: row;
align-items: center;
position: relative;
}
.detail_header .blueSign {
width: 48upx;
height: 48upx;
}
.detail_header .font-tilte {
display: inline-block;
font-weight: bold;
font-size: 18px;
color: #333333;
margin-left: 16upx;
}
.detail_header .font-result {
display: inline-block;
position: absolute;
width: 80*2upx;
height: 28*2upx;
right: 0upx;
background: #C1EFEA;
border-radius: 15px 15px 15px 15px;
font-size: 28upx;
color: #0DB0A7;
text-align: center;
line-height: 28*2upx;
}
.detail_msg {
display: grid;
margin-top: 20upx;
}
.detail_msg .info-item {
font-size: 28upx;
color: #999999;
margin-bottom: 10upx;
font-size: 28upx;
line-height: 50upx;
text {
display: inline-block;
width: 140upx;
}
.infoSpan {
width: auto;
font-size: 28upx;
color: #666;
float: right;
}
}
.detail_msg .info-item:nth-of-type(6) {
padding-bottom: 24upx;
border-bottom: 1px solid #EBEFF7;
}
.detail_msg .info-item:last-child {
padding-bottom: 24upx;
border-bottom: 0px solid #000;
}
.comment-btn {
margin-top: 24upx;
width: 84*2upx;
height: 32*2upx;
border-radius: 16*2upx;
border: 1px solid #0DB0A7;
font-size: 28upx;
color: #0DB0A7;
line-height: 32*2upx;
text-align: center;
min-width: 140upx;
justify-self: end;
}
.bg-ccc {
border-color: #CACACA;
color: #CACACA;
background-color: #fff !important;
}
}
.fixedView {
height: 56*2upx;
line-height: 56*2upx;
padding: 0 24upx;
background-color: white;
width: 100%;
/* border-radius: 10px; */
/* margin-left: 5%; */
font-size: 14*2upx;
/* border: 1px solid #cfcfcf; */
position: fixed;
left: 0;
bottom: 0px;
display: flex;
flex-direction: row;
align-items: center;
justify-content: space-between;
.tx-style {
width: 150*2upx;
height: 40*2upx;
background: linear-gradient(91deg, #5BCE9D 0%, #00ADA6 100%);
border-radius: 22*2upx;
font-size: 16*2upx;
color: #FFFFFF;
line-height: 40*2upx;
text-align: center;
}
}
</style>