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

850 lines
21 KiB
Vue
Raw Normal View History

2025-01-22 10:53:47 +08:00
<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>