cashier_app/pageTable/index/index.vue

455 lines
9.9 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="color-333 u-font-28 min-page bg-gray ">
<up-sticky>
<view class="bg-fff u-p-l-30 u-p-b-30 u-relative">
<view class="input-wrapper">
<view class="input-main">
<view class="u-flex u-p-r-30 u-font-28" @click="pageData.statusShow = !pageData.statusShow">
<text class="u-m-r-10 u-line-1 " :class="{'color-main':pageData.query.status!=''}"
style="max-width: 100rpx;">{{pageData.statusName }}</text>
<up-icon name="arrow-down" size="16"></up-icon>
</view>
<uni-easyinput clearable class='jeepay-search' :inputBorder="false"
trim="all"
placeholder="搜索"
v-model="pageData.query.name"
@clear="searchConfirm"
@confirm="searchConfirm">
<template #prefixIcon>
<image src="@/static/iconImg/icon-search.svg" class="input-icon" />
</template>
</uni-easyinput>
<view class="u-m-l-4">
<button class="" type="text" @click="searchConfirm"> <text class="color-333">搜索</text></button>
</view>
</view>
</view>
</view>
</up-sticky>
<view class="list u-p-30">
<view class="my-bg-main table-type u-flex border-r-12 color-fff ">
<view class="item u-p-20" :class="{sel:pageData.area.sel===item.id}" @tap="changeAreaSel(item)"
v-for="(item,index) in pageData.area.list" :key="index">
<view class="box">
<view class='up-line-1'>{{item.name}}</view>
<view class="u-m-t-10">0/12</view>
</view>
</view>
</view>
<view class="u-m-t-30 ">
<template v-if="pageData.tabList.length">
<view class="u-flex u-flex-wrap u-row-between">
<view class="u-m-b-30" v-for="(item,index) in pageData.tabList" :key="index">
<table-item @bind="scanCode" @update="getTable" :areaMap="pageData.areaMap" @more="moreShow(item)" :data="item"></table-item>
</view>
</view>
<my-pagination :page="pageData.query.page" :totalElements="pageData.totalElements" :size="pageData.query.size"
@change="pageChange"></my-pagination>
</template>
<my-img-empty v-if="pageData.hasAjax&&!pageData.tabList.length" tips="未找到相关桌台"></my-img-empty>
</view>
</view>
</view>
<my-action-sheet :active="4" @itemClick="actionSheetClick" ref="refMoreSheet" :list="actionSheet.list"
:title="actionSheet.title">
<template #title>
<view class="color-999 u-p-30 u-text-center border-bottom">桌号{{actionSheet.title}}</view>
</template>
</my-action-sheet>
<up-picker :show="pageData.statusShow" :columns="pageData.statusList" keyName="label" @cancel="pageData.statusShow=false" @confirm="confirmStatus" ></up-picker>
</template>
<script setup>
import { onLoad, onReady, onShow, } from '@dcloudio/uni-app';
import { ref, reactive, computed, watch } from 'vue';
import { $status } from '@/commons/table-status.js'
import go from '@/commons/utils/go.js';
import myActionSheet from '@/components/my-components/my-action-sheet';
import tableItem from './components/table-item'
import { hasPermission } from '@/commons/utils/hasPermission.js'
import { getShopTable, shopTableBind, shopTableClear } from '@/http/api/table.js'
import { getShopArea } from '@/http/api/area.js'
import { printOrder } from '@/http/api/order.js'
import { getHistoryOrder } from '@/http/api/order.js'
const pageData = reactive({
statusShow: false,
hasAjax: false,
areaMap: {},
query: {
page: 1,
size: 10,
status: '',
areaId: '',
name: '',
},
totalElements:0,
statusList: [[{
key: '',
label: '全部'
},...uni.$utils.objToArrary($status)]],
statusName: '全部',
tabList: [],
area: {
list: [],
sel: ''
},
orderInfo: null,
})
const refMoreSheet = ref(null)
const actionSheet = reactive({
list: ['结账', '清台', '增减菜', '换台', '打印订单', '历史订单','绑定码牌'],
title: '',
selTable: ''
})
watch(() => pageData.area.sel, (newval) => {
pageData.query.page = 1
getTable()
})
onShow(opt => {
getData()
})
function getData() {
getTable()
getArea()
}
/**
* 获取桌台列表
*/
async function getTable() {
const res = await getShopTable(pageData.query)
pageData.hasAjax = true
pageData.tabList = res.records
pageData.totalElements = res.totalRow
}
/**
* 获取区域
*/
async function getArea() {
const res = await getShopArea({ name: '', page: 0, size: 300 })
pageData.area.list = res.records
pageData.areaMap = res.records.reduce((prve, cur) => {
prve[cur.id] = cur.name
return prve
}, {})
}
/**
* 类型选择
* @param {Object} e
*/
function confirmStatus(e){
pageData.statusShow = false
pageData.query.status = e.value[0].key
pageData.statusName = e.value[0].label
getTable()
}
/**
* 区域选择确定
* @param {Object} item
*/
function changeAreaSel(item) {
pageData.area.sel = item.id
pageData.query.areaId = item.id
}
/**
* 更多操作打开
* @param {Object} table
*/
function moreShow(table) {
actionSheet.title = table.name
actionSheet.selTable = table
refMoreSheet.value.open()
if( actionSheet.selTable.orderId ){
getHistoryOrder({orderId: actionSheet.selTable.orderId}).then(res=>{
pageData.orderInfo = res
})
}
}
/**
* 更多操作选择
* @param {Object} index
*/
async function actionSheetClick(index) {
console.log(index);
const item = actionSheet.selTable
if (index == 0) {
if (!item.orderId) {
return uni.$utils.showToast('该桌台暂无要结账的订单!')
}
const canJieZhang = await hasPermission('允许收款')
if(!canJieZhang){
return
}
return toPay(item)
}
if (index == 1) {
//清台
return uni.showModal({
title: '提示',
content: '确定要清台:' + item.name + '',
success(res) {
if (res.confirm) {
shopTableClear({
id: item.id,
}).then(res => {
uni.$utils.showToast('清台成功')
pageData.query.page = 1
getTable()
})
}
}
})
}
if (index == 2) {
return uni.$utils.showToast('待开放,请敬请期待!')
}
if (index == 3) {
return uni.$utils.showToast('待开放,请敬请期待!')
}
if (index == 4) {
//打印订单
if (!item.orderId) {
return uni.$utils.showToast('该桌台暂无要打印的订单!')
}
let res = await printOrder( {id: actionSheet.selTable.orderId, type: pageData.orderInfo.status == 'unpaid' ? 1 : 0 } )
return
}
if (index == 6) {
//绑定码牌
scanCode(item)
return
}
uni.$utils.showToast('待开放,请敬请期待!')
}
/**
* 去结账
* @param {Object} item
*/
function toPay(item) {
go.to('PAGES_ORDER_PAY', {
tableId: item.id,
tableName: item.name,
orderId: item.orderId,
discount: 1,
userId: item.userId
})
}
/**
* 绑定码牌
* @param {Object} item
*/
function scanCode(item) {
console.log(item)
if ( item.tableCode != '') {
uni.$utils.showToast('当前桌台已绑定')
return;
}
uni.scanCode({
onlyFromCamera: true,
success: function(res) {
console.log('条码类型:' + res.scanType);
console.log('条码内容:' + res.result);
let params = getQueryString(res.result);
shopTableBind({
"tableCode": params.code,
"id": item.id,
}).then(res => {
uni.$utils.showToast('桌台绑定成功')
setTimeout(()=>{
getTable()
},1500)
})
}
});
}
/**
* 解码
* @param {Object} url
*/
function getQueryString(url) {
let params = {};
// 正则表达式来匹配URL中的查询字符串
let reg = /(?:\?|#|&){1}([^=]*)=([^&]*)/g;
url.replace(reg, (match, key, value) => {
params[key] = value;
});
return params;
}
/**
* 搜索
*/
function searchConfirm() {
pageData.query.page = 1;
getTable()
}
/**
* 页数改变事件
* @param {Object} page
*/
function pageChange(page) {
pageData.query.page = page
getTable()
}
</script>
<style lang="scss" scoped>
.fixed-top {
z-index: 10;
}
.input-wrapper {
display: flex;
justify-content: space-between;
align-items: center;
padding-top: 26rpx;
background-color: $J-bg-ff;
.input-main {
flex: 1;
display: flex;
align-items: center;
height: 64rpx;
image {
padding: 22rpx;
width: 26rpx;
height: 26rpx;
}
input {
flex: 1;
font-size: 27rpx;
}
::v-deep uni-button {
font-size: 28rpx;
color: $my-main-color;
background: rgba(255, 255, 255, 1);
}
::v-deep.uni-easyinput {
.uni-easyinput__content {
background-color: $J-bg-f5 !important;
border-radius: $J-b-r12;
.uni-easyinput__content-input {
padding-left: 0 !important;
.uni-input-input {
border-radius: $J-b-r12 !important;
overflow: hidden !important;
}
}
.uni-input-placeholder {
font-size: 27rpx;
}
.uni-icons {
color: rgba(230, 230, 230, 1) !important;
}
}
}
}
}
.table-type {
flex-wrap: wrap;
padding: 0 10rpx 0 10rpx;
.item {
width: 25%;
margin-bottom: 10rpx;
.box {
position: relative;
padding: 10rpx;
border-radius: 10rpx;
&::after {
position: absolute;
display: block;
content: '';
top: 0;
bottom: 0;
width: 2px;
border-radius: 2px;
right: -20rpx;
background-color: rgba(255, 255, 255, .5);
}
}
&:nth-of-type(4n) {
.box::after {
background-color: transparent;
}
}
&.sel {
.box {
background-color: rgba(255, 255, 255, .6);
}
}
}
}
.search-box {
background-color: #fff;
padding: 16rpx 0;
display: flex;
.search-btn {
padding: 0 30rpx;
box-sizing: border-box;
display: flex;
align-items: center;
// width: 164rpx;
transition: all .3s ease-in-out;
background-color: rgb(247, 247, 247);
border-radius: 100px;
}
}
.status {
position: absolute;
top: 100%;
left: 0;
right: 0;
z-index: 10;
background-color: #fff;
}
.icon-arrow-down-fill {
width: 16rpx;
height: 10rpx;
}
.list {
// margin-top: 52px;
}
</style>