优化更新

This commit is contained in:
gyq
2025-11-11 11:04:26 +08:00
parent 2432c53a73
commit 636fa4e033
32 changed files with 2280 additions and 704 deletions

View File

@@ -387,10 +387,10 @@ export default {
conName: v.conName,
purchasePrice: v.price,
unitName: v.conUnit,
inOutNumber,
inOutNumber: v.number,
subTotal: this.xiaoji(v),
imgUrls: v.imgUrls,
number: v.number,
number: inOutNumber,
};
});
if (this.type == "in") {

View File

@@ -37,7 +37,11 @@
</el-table-column>
<el-table-column label="会员" prop="memberLevelName">
<template #default="scope">
{{ scope.row.memberLevelName.length > 0 ? scope.row.memberLevelName : '否' }}
<span v-if="scope.row.isVip == 1">
<template v-if="scope.row.memberLevelName.length > 0"> {{ scope.row.memberLevelName }}</template>
<template v-else></template>
</span>
<span v-else></span>
</template>
</el-table-column>
<el-table-column label="分销员" prop="distributionShops">

View File

@@ -217,6 +217,7 @@ async function getTableData() {
if (tabIndex.value == 0) {
res = await distributionUserInviteUser({
id: rowInfo.value.id,
shopId: rowInfo.value.shopId,
page: tableData.page,
size: tableData.size,
shopUserId: querForm.value.userId,
@@ -225,6 +226,7 @@ async function getTableData() {
} else {
res = await distributionFlowGet({
id: rowInfo.value.id,
shopId: rowInfo.value.shopId,
parentId: rowInfo.value.id,
shopUserId: querForm.value.userId,
distributionLevelId: querForm.value.distributionLevelId,

View File

@@ -96,7 +96,7 @@
</template>
</el-table-column>
<el-table-column label="关联订单号" prop="orderNo" min-width="200"></el-table-column>
<el-table-column label="收益(元)" prop="rewardAmount" min-width="120">
<el-table-column label="收益(元)" prop="rewardAmount" min-width="120">
<template #default="scope">
<span v-if="scope.row.status == 'refund'">-</span>
{{ multiplyAndFormat(scope.row.rewardAmount || 0) }}

View File

@@ -27,6 +27,7 @@
</div>
</template>
</el-table-column>
<el-table-column label="分销员等级" prop="distributionLevelName" width="100"></el-table-column>
<el-table-column label="总收益(元)" prop="totalIncome" width="100">
<template #default="scope">
{{ multiplyAndFormat(scope.row.totalIncome || 0) }}

View File

@@ -69,6 +69,7 @@ async function submitHandle() {
confirmLoading.value = true
let data = {}
data.id = rowInfo.value.id
data.shopId = rowInfo.value.shopId
if (type.value == 1) {
data.isAssignLevel = 1
data.distributionLevelId = form.value.distributionLevelId

View File

@@ -48,7 +48,15 @@
</el-table-column>
<el-table-column label="变动金额(元)" prop="changeAmount"></el-table-column>
<el-table-column label="变动后金额(元)" prop="amount"></el-table-column>
<el-table-column label="变动原因" prop="remark"></el-table-column>
<el-table-column label="变动原因" prop="remark">
<template #default="scope">
<div class="column" v-if="scope.row.type == 'manual_recharge' || scope.row.type == 'manual_sub'">
<span>{{ scope.row.remark }}</span>
<span class="info">操作员{{ scope.row.opAccount }}</span>
</div>
<span v-else>{{ scope.row.remark }}</span>
</template>
</el-table-column>
<el-table-column label="关联订单" prop="orderNo"></el-table-column>
<el-table-column label="创建时间" prop="createTime"></el-table-column>
</el-table>
@@ -77,7 +85,7 @@ const info = ref({
const statusList = ref([
{
value: 'manual_recharge',
label: '充值'
label: '手动充值'
},
{
value: 'self_recharge',
@@ -194,4 +202,14 @@ defineExpose({
}
}
}
.column {
display: flex;
flex-direction: column;
.info {
font-size: 14px;
color: #999;
}
}
</style>

View File

@@ -63,7 +63,7 @@
<div class="title_row">
分销员等级
</div>
<el-form-item label="条件升级" style="margin-top: 14px;" prop="upgradeType">
<el-form-item label="升级条件" style="margin-top: 14px;" prop="upgradeType">
<el-radio-group v-model="form.upgradeType" @change="upgradeTypeChange">
<el-radio label="不自动升级" value="not_upgrade"></el-radio>
<el-radio label="邀请有效人数" value="invite"></el-radio>
@@ -163,7 +163,7 @@
<el-form-item style="margin-top: 24px;">
<el-button type="primary" @click="addLevelHandle">添加等级</el-button>
</el-form-item>
<div class="title_row mt14">未开通页面营销</div>
<div class="title_row mt14">未开通页面</div>
<el-form-item :label-width="0" style="margin-top: 14px;">
<WangEditor v-model="form.notActivatedPage" />
</el-form-item>

View File

@@ -3,6 +3,9 @@
<div class="gyq_content">
<HeaderCard name="分销" intro="用户成为业务员,可促进消费" icon="xffx" showSwitch v-model:isOpen="form.isEnable">
</HeaderCard>
<div class="tips">
<el-alert title="请记得前往《分销明细》充值余额,余额不足时用户收益将无法正常入账" type="primary" show-icon :closable="false" />
</div>
<div class="row mt14">
<tabHeader v-model="tabActiveIndex" :list="tabList" />
</div>
@@ -111,4 +114,8 @@ onMounted(() => {
margin-top: 14px;
}
}
.tips {
margin-top: 14px;
}
</style>

View File

@@ -8,10 +8,10 @@
<div class="preview">
<div class="info">
<div class="top">
<div class="title">{{ form.title || '请输入模块标题' }}</div>
<div class="title">{{ form.title || defaultTitle }}</div>
<div class="content">{{ form.content || '请输入模块内容' }}</div>
</div>
<div class="btm">{{ form.note || '请输入模块提示语' }}</div>
<div class="btm">{{ form.note || defaultNote }}</div>
</div>
<div class="img_wrap">
<el-image :src="form.qrCode" style="width: 100%;height: 100%;"></el-image>
@@ -32,7 +32,7 @@
<single-image-upload style="width: 120px; height: 120px" v-model="form.qrCode"></single-image-upload>
</el-form-item>
<el-form-item label="模块标题" prop="title">
<el-input placeholder="请输入模块标题" :maxlength="20" v-model.trim="form.title"></el-input>
<el-input :placeholder="defaultTitle" :maxlength="20" v-model.trim="form.title"></el-input>
</el-form-item>
<el-form-item label="模块内容">
<div class="textarea">
@@ -42,7 +42,7 @@
</div>
</el-form-item>
<el-form-item label="模块提示语">
<el-input placeholder="请输模块提示语" :maxlength="20" v-model.trim="form.note"></el-input>
<el-input :placeholder="defaultNote" :maxlength="20" v-model.trim="form.note"></el-input>
</el-form-item>
<el-form-item>
<el-button type="primary" :loading="loading" @click="submitHandle">保存</el-button>
@@ -59,13 +59,14 @@ import { ref, reactive, onMounted } from 'vue'
import { ElNotification } from 'element-plus'
import { drainageConfigGet, drainageConfigPost } from '@/api/coupon/index'
const defaultTitle = ref('扫码进群,优惠多多')
const defaultNote = ref('长按识别,微信内扫一扫加好友')
const form = ref({
id: '',
useType: ['dine-in'],
qrCode: '',
title: '',
title: defaultTitle.value,
content: '',
note: '长按识别,微信内扫一扫加好友',
isEnable: '',
@@ -129,6 +130,14 @@ function submitHandle() {
let data = { ...form.value }
if (data.title == '') {
data.title = defaultTitle.value
}
if (data.note == '') {
data.note = defaultNote.value
}
await drainageConfigPost(data);
ElNotification({
title: '注意',
@@ -151,6 +160,13 @@ async function drainageConfigGetAjax() {
res.useType = []
}
form.value = res
if (form.value.title == '') {
form.value.title = defaultTitle.value
}
if (form.value.note == '') {
form.value.note = defaultNote.value
}
} catch (error) {
console.log(error);
}

View File

@@ -137,7 +137,7 @@ const statusList = ref([
},
{
value: 2,
label: '发送成',
label: '发送成',
type: 'success'
},
{

View File

@@ -28,8 +28,8 @@
</template>
</el-table-column>
<el-table-column label="变动原因" prop="reason"></el-table-column>
<el-table-column label="变动前余额" prop="balance"></el-table-column>
<el-table-column label="变动金额" prop="expense"></el-table-column>
<el-table-column label="变动后余额" prop="balance"></el-table-column>
<el-table-column label="创建时间" prop="createTime"></el-table-column>
</el-table>
</div>

View File

@@ -70,7 +70,7 @@
<el-radio-button :label="1">可选套餐</el-radio-button>
</el-radio-group>
</div>
<div v-if="ruleForm.groupType == '0'">
<div v-if="ruleForm.groupType == 0">
<el-table border :data="item.goods" v-for="(item, index) in ruleForm.proGroupVo" :key="index">
<el-table-column label="名称" prop="proName"></el-table-column>
<el-table-column label="规格" prop="skuName"></el-table-column>
@@ -95,7 +95,7 @@
</el-table-column>
</el-table>
</div>
<div v-if="ruleForm.groupType == '1'">
<div v-if="ruleForm.groupType == 1">
<div class="group_wrap" v-for="(item, index) in ruleForm.proGroupVo" :key="index">
<el-form inline :model="item">
<el-form-item label="规格组名">
@@ -382,7 +382,7 @@ const ruleForm = reactive<RuleForm>({
// 规格id
specId: "",
// 套餐类型
groupType: "0",
groupType: 0,
// 套餐入参
proGroupVo: [
{
@@ -569,7 +569,7 @@ function selectShopRes(res: Array<any>) {
return item;
});
if (ruleForm.groupType == "0") {
if (ruleForm.groupType == 0) {
let obj = {
title: "",
count: newres.length,
@@ -726,7 +726,7 @@ function cartesian(arr) {
// 套餐类型切换
function typeChange() {
// ruleForm.typeEnum = 'normal'
if (ruleForm.groupType == "0") {
if (ruleForm.groupType == 0) {
ruleForm.proGroupVo = [];
ruleForm.proGroupVo[0] = {
title: "",
@@ -783,7 +783,7 @@ const submitForm = async (formEl: FormInstance | undefined) => {
// 标题和几选几是否填写
if (ruleForm.type == "package") {
if (ruleForm.groupType == "1") {
if (ruleForm.groupType == 1) {
let selectTitle = false;
ruleForm.proGroupVo.forEach((item: any) => {
if (item.number == "" || item.title == "") {

View File

@@ -3,25 +3,14 @@
<div>
<el-form ref="form" :model="form" :rules="rules" label-width="160px" label-position="left">
<el-form-item label="门店名称" prop="shopName">
<el-input
v-model.trim="form.shopName"
placeholder="请输入门店名称"
style="width: 500px"
></el-input>
<el-input v-model.trim="form.shopName" placeholder="请输入门店名称" style="width: 500px"></el-input>
</el-form-item>
<el-form-item label="连锁店扩展店名">
<el-input
v-model.trim="form.chainName"
placeholder="请输入连锁店扩展店名"
style="width: 500px"
></el-input>
<el-input v-model.trim="form.chainName" placeholder="请输入连锁店扩展店名" style="width: 500px"></el-input>
</el-form-item>
<el-form-item label="门店logo">
<div class="img_box">
<single-image-upload
style="width: 80px; height: 80px"
v-model="form.logo"
></single-image-upload>
<single-image-upload style="width: 80px; height: 80px" v-model="form.logo"></single-image-upload>
</div>
</el-form-item>
<!-- <el-form-item label="门店照片">
@@ -38,37 +27,21 @@
<el-form-item label="门店收款码">
<div class="img_box">
<canvas ref="canvas" id="QRCode_header" style="width: 80px; height: 80px"></canvas>
<el-button
size="small"
plain
v-if="form.paymentQrcode"
@click="downloadCanvas(form.paymentQrcode)"
>
<el-button size="small" plain v-if="form.paymentQrcode" @click="downloadCanvas(form.paymentQrcode)">
下载
</el-button>
</div>
</el-form-item>
<el-form-item label="微信二维码">
<div class="img_box">
<single-image-upload
style="width: 80px; height: 80px"
v-model="form.shopQrcode"
></single-image-upload>
<single-image-upload style="width: 80px; height: 80px" v-model="form.shopQrcode"></single-image-upload>
</div>
</el-form-item>
<el-form-item label="店铺小程序码">
<div class="img_box">
<el-image
:src="form.smallQrcode || img_download_error"
fit="contain"
style="width: 80px; height: 80px"
></el-image>
<el-button
size="small"
plain
v-if="form.shopQrcode"
@click="downloadImgHandle(form.smallQrcode)"
>
<el-image :src="form.smallQrcode || img_download_error" fit="contain"
style="width: 80px; height: 80px"></el-image>
<el-button size="small" plain v-if="form.shopQrcode" @click="downloadImgHandle(form.smallQrcode)">
下载
</el-button>
</div>
@@ -92,11 +65,7 @@
</el-radio-group>
</el-form-item> -->
<el-form-item label="联系电话" prop="phone">
<el-input
v-model.trim="form.phone"
placeholder="请输入联系电话"
style="width: 500px"
></el-input>
<el-input v-model.trim="form.phone" placeholder="请输入联系电话" style="width: 500px"></el-input>
</el-form-item>
<!-- <el-form-item label="外卖起送金额">
<el-input-number v-model="form.takeaway_money" placeholder="0.00" controls-position="right"
@@ -122,83 +91,43 @@
<div style="color: #999">准确的定位便于用户导航到店铺</div>
</el-form-item>
<el-form-item label="门店详细地址">
<el-input
type="textarea"
v-model.trim="form.address"
placeholder="请输入门店详细地址"
style="width: 500px"
></el-input>
<el-input type="textarea" v-model.trim="form.address" placeholder="请输入门店详细地址" style="width: 500px"></el-input>
</el-form-item>
<el-form-item label="营业时间">
<div class="u-flex gap-2" style="width: 50%">
<el-select v-model="form.businessStartDay" placeholder="周几开始">
<el-option
:value="item.label"
:label="item.label"
v-for="item in weeks"
:key="item.value"
></el-option>
<el-option :value="item.label" :label="item.label" v-for="item in weeks" :key="item.value"></el-option>
</el-select>
<el-select v-model="form.businessEndDay" placeholder="周几结束">
<el-option
:value="item.label"
:label="item.label"
v-for="item in weeks"
:key="item.value"
></el-option>
<el-option :value="item.label" :label="item.label" v-for="item in weeks" :key="item.value"></el-option>
</el-select>
<el-time-picker
placeholder="起始时间"
v-model="startTime"
:picker-options="{
selectableRange: '00:00:00 - 23:59:59',
format: 'HH:mm',
}"
format="HH:mm"
value-format="HH:mm"
></el-time-picker>
<el-time-picker
placeholder="结束时间"
v-model="endTime"
:picker-options="{
selectableRange: '00:00:00 - 23:59:59',
}"
format="HH:mm"
value-format="HH:mm"
></el-time-picker>
<el-time-picker placeholder="起始时间" v-model="startTime" :picker-options="{
selectableRange: '00:00:00 - 23:59:59',
format: 'HH:mm',
}" format="HH:mm" value-format="HH:mm"></el-time-picker>
<el-time-picker placeholder="结束时间" v-model="endTime" :picker-options="{
selectableRange: '00:00:00 - 23:59:59',
}" format="HH:mm" value-format="HH:mm"></el-time-picker>
</div>
</el-form-item>
<el-form-item label="桌位费/位/元">
<el-input-number :disabled="!!form.isTableFee" v-model="form.tableFee" :min="0" />
<!-- <el-checkbox v-model="form.isTableFee" :label="1">免餐位费</el-checkbox> -->
<el-switch
class="u-m-l-10"
v-model.trim="form.isTableFee"
:active-value="1"
:inactive-value="0"
active-text="免餐位费"
></el-switch>
<el-switch class="u-m-l-10" v-model.trim="form.isTableFee" :active-value="1" :inactive-value="0"
active-text="免餐位费"></el-switch>
</el-form-item>
<!-- <el-form-item label="是否开启8折活动">
<el-switch v-model.trim="form.isOpenYhq" active-value="true" inactive-value="false"></el-switch>
<div style="color: #999;">是否允许用户在小程序端支付订单</div>
</el-form-item> -->
<el-form-item label="是否启用商品会员价">
<el-switch
v-model.trim="form.isMemberPrice"
:active-value="1"
::inactive-value="0"
></el-switch>
<!-- <div style="color: #999;">是否允许用户在小程序端支付订单</div> -->
<!-- <el-form-item label="是否启用商品会员价">
<el-switch v-model.trim="form.isMemberPrice" :active-value="1" ::inactive-value="0"></el-switch>
<div style="color: #999;">是否允许用户在小程序端支付订单</div>
</el-form-item>
<el-form-item label="是否开启会员余额支付">
<el-switch
v-model.trim="form.isAccountPay"
:active-value="1"
:inactive-value="0"
></el-switch>
<!-- <div style="color: #999;">是否允许用户在小程序端支付订单</div> -->
</el-form-item>
<el-switch v-model.trim="form.isAccountPay" :active-value="1" :inactive-value="0"></el-switch>
<div style="color: #999;">是否允许用户在小程序端支付订单</div>
</el-form-item> -->
<!-- <el-form-item label="结算类型">
<el-radio-group v-model="form.settleType">
<el-radio :label="0">今日</el-radio>
@@ -219,20 +148,11 @@
</el-time-picker>
</el-form-item> -->
<el-form-item label="店铺简介">
<el-input
type="textarea"
v-model.trim="form.detail"
placeholder="请输入店铺简介"
style="width: 500px"
></el-input>
<el-input type="textarea" v-model.trim="form.detail" placeholder="请输入店铺简介" style="width: 500px"></el-input>
</el-form-item>
<el-form-item label="台桌预订短信">
<el-input
type="textarea"
v-model.trim="form.bookingSms"
placeholder="请输入台桌预订短信"
style="width: 500px"
></el-input>
<el-input type="textarea" v-model.trim="form.bookingSms" placeholder="请输入台桌预订短信"
style="width: 500px"></el-input>
</el-form-item>
<el-form-item label="状态">
<el-radio-group v-model="form.status">
@@ -249,24 +169,11 @@
</el-form>
</div>
<ChooseAddress ref="refChooseAddress" @choose="chooseAddressConfirm"></ChooseAddress>
<el-dialog
v-model="showUpload"
:close-on-click-modal="false"
append-to-body
width="500px"
@close="showUpload = false"
>
<el-upload
:before-remove="handleBeforeRemove"
:on-success="handleSuccess"
:on-error="handleError"
:file-list="fileList"
:headers="headers"
:action="qiNiuUploadApi"
:limit="1"
list-type="picture"
class="upload-demo"
>
<el-dialog v-model="showUpload" :close-on-click-modal="false" append-to-body width="500px"
@close="showUpload = false">
<el-upload :before-remove="handleBeforeRemove" :on-success="handleSuccess" :on-error="handleError"
:file-list="fileList" :headers="headers" :action="qiNiuUploadApi" :limit="1" list-type="picture"
class="upload-demo">
<el-button size="small" type="primary">点击上传</el-button>
<template #tip>
<div style="display: block" class="el-upload__tip">请勿上传违法文件且文件不超过15M</div>
@@ -465,7 +372,6 @@ export default {
...this.form,
eatModel: this.form.eatModel.join(","),
});
this.formLoading = false;
ElMessage.success({
title: "成功",
message: "提交成功",
@@ -473,7 +379,8 @@ export default {
setTimeout(() => {
// location.reload();
}, 1000);
} catch (error) {}
} catch (error) { }
this.formLoading = false;
}
});
},
@@ -487,7 +394,7 @@ export default {
handleBeforeRemove(file, fileList) {
for (let i = 0; i < this.files.length; i++) {
if (this.files[i].uid === file.uid) {
crudQiNiu.del([this.files[i].id]).then((res) => {});
crudQiNiu.del([this.files[i].id]).then((res) => { });
return true;
}
}

View File

@@ -30,10 +30,7 @@
<div class="isSeatFee img u-line-1 u-flex u-col-center u-row-center" v-if="isSeatFee">
<span>{{ item.name }}</span>
</div>
<div
class="isSeatFee img u-line-1 u-flex u-col-center u-row-center"
v-else-if="item.is_temporary"
>
<div class="isSeatFee img u-line-1 u-flex u-col-center u-row-center" v-else-if="item.is_temporary">
<span>临时菜</span>
</div>
<img v-else :src="item.coverImg" class="" alt="" />
@@ -62,7 +59,9 @@
<div class="note" v-if="item.remark">备注:{{ item.remark }}</div>
<div class="note flex" v-else>
<span>备注:</span>
<el-icon v-if="!isOld" @click="editNote" color="#999"><EditPen /></el-icon>
<el-icon v-if="!isOld" @click="editNote" color="#999">
<EditPen />
</el-icon>
</div>
</div>
<div class="note" v-if="placeNum != 0 && item.note">备注:{{ item.remark || "" }}</div>
@@ -75,17 +74,13 @@
<div class="" v-else>X{{ item.number }}</div>
<div class="absolute" v-if="canChangeNumber">
<div class="order-input-number">
<el-icon color="#d8d8d8" size="22" @click="changeOrderNumber(-1)"><Remove /></el-icon>
<el-icon color="#d8d8d8" size="22" @click="changeOrderNumber(-1)">
<Remove />
</el-icon>
<div style="width: 60px; margin: 0 4px" class="number-box">
<el-input
:min="0"
type="number"
@input="cartGoodsNumberInput"
@change="cartGoodsNumberChange"
v-model="number"
placeholder="0"
></el-input>
<el-input :min="0" type="number" @input="cartGoodsNumberInput" @change="cartGoodsNumberChange"
v-model="number" placeholder="0"></el-input>
</div>
<el-icon color="#22bf64" size="22" @click="changeOrderNumber(1)">
<CirclePlusFilled />
@@ -93,7 +88,6 @@
</div>
</div>
</div>
<div class="color-333 total-price">
<template v-if="item.is_gift || item.status == 'return'">
<div>0</div>
@@ -103,28 +97,32 @@
</div>
</template>
<!-- 单品改价 -->
<template
v-else-if="
item.discount_sale_amount * 1 > 0 &&
discount_before_price != allPrice &&
!item.is_temporary
"
>
<template v-else-if="
item.discount_sale_amount * 1 > 0 &&
discount_before_price != allPrice &&
!item.is_temporary
">
<div>¥{{ to2(allPrice) }}</div>
<div class="free-price">
<span>¥{{ to2(discount_before_price) }}</span>
</div>
</template>
<template v-else>
<div>
<div v-if="item.isLimitDiscount || item.is_time_discount">
<div>
¥{{ to2(item.limitDiscountPrice) }}
</div>
<div class="free-price">
<span>¥{{ to2(item.salePrice) }}</span>
</div>
</div>
<div v-else>
<div v-if="useVipPrice && vipAllPrice * 1 != allPrice * 1">
¥{{ to2(vipAllPrice) }}
</div>
<div
:class="{
'free-price': useVipPrice && vipAllPrice != allPrice,
}"
>
<div :class="{
'free-price': useVipPrice && vipAllPrice != allPrice,
}">
<span>¥{{ to2(allPrice) }}</span>
</div>
</div>
@@ -349,7 +347,7 @@ onMounted(() => {
flex-direction: column;
gap: 2px;
> span {
>span {
display: block;
width: 18px;
height: 18px;
@@ -367,6 +365,7 @@ onMounted(() => {
.pack {
background: #35ac6a;
.number {
background: #f56c6c;
color: #fff;
@@ -379,8 +378,10 @@ onMounted(() => {
border-radius: 50%;
}
}
.tui {
position: relative;
.number {
background: #f56c6c;
color: #fff;
@@ -393,6 +394,7 @@ onMounted(() => {
border-radius: 50%;
}
}
.da {
background: #35ac6a;
}

View File

@@ -1,58 +1,34 @@
<template>
<div class="goods-item">
<el-image
v-if="item.coverImg"
class="goods-image"
:src="item.coverImg + '?x-oss-process=image/resize,m_lfit,w_100,h_100'"
fit="cover"
></el-image>
<el-image v-if="item.coverImg" class="goods-image"
:src="item.coverImg + '?x-oss-process=image/resize,m_lfit,w_100,h_100'" fit="cover"></el-image>
<div class="info" @click="itemClick">
<div class="name u-flex u-flex-wrap">
<span class="weight" v-if="item.type == 'weight'">称重</span>
<span class="u-line-3">{{ item.name }}</span>
</div>
<div class="">{{ item.lowPrice }}</div>
<div class="" v-if="item.isLimitDiscount">
<span class="o_price">{{ item.lowPrice }}</span>
<span>{{ item.limitDiscountPrice }}</span>
</div>
<div v-else>{{ item.lowPrice }}</div>
</div>
<div
class="status"
v-if="
item.isSoldStock ||
!item.isSale ||
!item.isSaleTime ||
(item.isStock && item.stockNumber * 1 <= 0)
"
>
<svg-icon
@click="ElMessage.error('该商品已下架')"
v-if="!item.isSale"
iconClass="yi-xiajia"
color="#fff"
size="60"
></svg-icon>
<svg-icon
@click="
ElMessage.error('该商品不在可售时间内') ||
isProductAvailable(item.days, item.startTime, item.endTime)
"
v-else-if="!item.isSaleTime"
iconClass="no-sale"
color="#fff"
size="60"
></svg-icon>
<svg-icon
@click="ElMessage.error('该商品已售罄')"
v-else-if="item.isSoldStock"
iconClass="shouqing"
color="#fff"
size="60"
></svg-icon>
<svg-icon
@click="ElMessage.error('库存不足')"
v-else-if="item.isStock && item.stockNumber * 1 <= 0"
iconClass="stock_null"
color="#fff"
size="60"
></svg-icon>
<div class="status" v-if="
item.isSoldStock ||
!item.isSale ||
!item.isSaleTime ||
(item.isStock && item.stockNumber * 1 <= 0)
">
<svg-icon @click="ElMessage.error('该商品已下架')" v-if="!item.isSale" iconClass="yi-xiajia" color="#fff"
size="60"></svg-icon>
<svg-icon @click="
ElMessage.error('该商品不在可售时间内') ||
isProductAvailable(item.days, item.startTime, item.endTime)
" v-else-if="!item.isSaleTime" iconClass="no-sale" color="#fff" size="60"></svg-icon>
<svg-icon @click="ElMessage.error('该商品已售罄')" v-else-if="item.isSoldStock" iconClass="shouqing" color="#fff"
size="60"></svg-icon>
<svg-icon @click="ElMessage.error('库存不足')" v-else-if="item.isStock && item.stockNumber * 1 <= 0"
iconClass="stock_null" color="#fff" size="60"></svg-icon>
</div>
</div>
</template>
@@ -105,10 +81,12 @@ function isProductAvailable(sellDaysStr, startTimeStr, endTimeStr) {
position: relative;
overflow: hidden;
cursor: pointer;
.goods-image {
width: 100%;
height: 100%;
}
.info {
position: absolute;
box-sizing: border-box;
@@ -122,6 +100,7 @@ function isProductAvailable(sellDaysStr, startTimeStr, endTimeStr) {
background-color: rgba(46, 46, 46, 0.38);
z-index: 1;
}
.status {
position: absolute;
box-sizing: border-box;
@@ -134,9 +113,11 @@ function isProductAvailable(sellDaysStr, startTimeStr, endTimeStr) {
background-color: rgba($color: #000000, $alpha: 0.5);
}
}
:deep(.svg-icon) {
margin-right: 0;
}
.weight {
height: 15px;
background: linear-gradient(124deg, rgb(115, 201, 105) 6%, rgb(39, 146, 27) 93%);
@@ -147,4 +128,10 @@ function isProductAvailable(sellDaysStr, startTimeStr, endTimeStr) {
padding: 0px 2px;
margin-right: 2px;
}
.o_price {
font-size: 10px;
text-decoration: line-through;
opacity: .8;
}
</style>

View File

@@ -42,22 +42,11 @@
<span class="u-font-14">部分抵扣</span>
</el-radio> -->
</el-radio-group>
<el-input-number
class="u-m-l-10"
v-if="score.sel != -1"
v-model="usePointsNumber"
step-strictly
:step="pointsRes.equivalentPoints"
placeholder="请输入积分抵扣数量"
:min="pointsRes.minDeductionPoints"
:max="pointsRes.maxUsablePoints"
@change="pointsToMoney"
></el-input-number>
<el-input-number class="u-m-l-10" v-if="score.sel != -1" v-model="usePointsNumber" step-strictly
:step="pointsRes.equivalentPoints" placeholder="请输入积分抵扣数量" :min="pointsRes.minDeductionPoints"
:max="pointsRes.maxUsablePoints" @change="pointsToMoney"></el-input-number>
</div>
<p
class="u-font-14 color-666 u-m-t-10"
v-if="pointsRes.unusableReason && !pointsRes.usable"
>
<p class="u-font-14 color-666 u-m-t-10" v-if="pointsRes.unusableReason && !pointsRes.usable">
<span class="color-red">*</span>
<span>{{ pointsRes.unusableReason }}</span>
</p>
@@ -70,7 +59,9 @@
<span class="u-font-14 font-bold u-m-r-20">团购代金券</span>
<div class="u-flex my-select">
<span class="u-m-r-10">代金券名称</span>
<el-icon><ArrowDown /></el-icon>
<el-icon>
<ArrowDown />
</el-icon>
</div>
<svg-icon iconClass="scan" size="30" class="u-m-l-10 cur-pointer"></svg-icon>
</div>
@@ -78,7 +69,9 @@
<span class="u-font-14 font-bold u-m-r-20">优惠券</span>
<div class="u-flex my-select" @click="openCoupon">
<span class="u-m-r-10">选择优惠券</span>
<el-icon><ArrowDown /></el-icon>
<el-icon>
<ArrowDown />
</el-icon>
</div>
</div>
<div class="u-m-t-20" v-if="quansSelArr.length > 0">
@@ -121,16 +114,13 @@
<div class="u-m-t-30">
<p class="u-font-16 font-bold u-m-r-20 font-bold u-flex">选择支付方式</p>
<div class="u-m-t-20">
<el-button
v-for="(item, index) in payTypes.list"
:key="index"
size="large"
:type="index == payTypes.sel ? 'primary' : ''"
:disabled="canUsePayType(item)"
@click="changePayType(index)"
>
{{ item.payName }}
</el-button>
<div>
<el-button v-for="(item, index) in payTypes.list" :key="index" size="large"
:type="index == payTypes.sel ? 'primary' : ''" :disabled="canUsePayType(item)"
@click="changePayType(index)">
{{ item.payName }}
</el-button>
</div>
</div>
<div class="u-m-t-20">
<el-button type="primary" size="large" @click="nowPayClick()">立即支付</el-button>
@@ -206,26 +196,17 @@
</div>
</div>
<!-- 扫码 -->
<scanPay
ref="refScanPay"
:order="orderInfo"
@confirm="refScanPayConfirm"
@paysuccess="paysuccess"
></scanPay>
<scanPay ref="refScanPay" :order="orderInfo" @confirm="refScanPayConfirm" @paysuccess="paysuccess"></scanPay>
<!-- 打折 -->
<discount ref="refDiscount" @confirm="discountConfirm"></discount>
<!-- 优惠券 -->
<popup-coupon ref="refCoupon" :user="user" @confirm="refCouponConfirm"></popup-coupon>
<!-- 挂账 -->
<chooseGuaZahng
ref="refGuaZhang"
:payMoney="currentpayMoney"
@confirm="refGuaZhangConfirm"
></chooseGuaZahng>
<chooseGuaZahng ref="refGuaZhang" :payMoney="currentpayMoney" @confirm="refGuaZhangConfirm"></chooseGuaZahng>
</div>
</template>
<script setup>
<script setup>
import * as UTILS from "@/utils/coupon-utils.js";
import * as quanUtil from "../quan_util.js";
@@ -237,7 +218,7 @@ const shopUser = useUserStore();
const carts = useCartsStore();
import popupCoupon from "./popup-coupon.vue";
import PointsApi from "@/api/account/points";
import limitTimeDiscountApi from '@/api/market/limitTimeDiscount.js'
import payTypeApi from "@/api/account/payType";
import payApi from "@/api/order/pay";
import scanPay from "./scan-pay.vue";
@@ -357,7 +338,7 @@ function discountShow(e) {
const props = defineProps({
table: {
type: Object,
default: () => {},
default: () => { },
},
user: {
type: Object,
@@ -371,7 +352,7 @@ const props = defineProps({
},
orderInfo: {
type: Object,
default: () => {},
default: () => { },
},
});
@@ -488,6 +469,26 @@ function changePayType(i) {
refScanPayOpen(payType);
}
// 根据用户id获取新客立减金额返回null代表不可用
const newCustomerDiscount = ref(null)
async function getConsumeDiscountAjax() {
try {
if (props.user.id) {
newCustomerDiscount.value = await limitTimeDiscountApi.getConsumeDiscount({
shopId: localStorage.getItem("shopId"),
shopUserId: props.user.id,
orderId: props.orderInfo.id
})
console.log('根据用户id获取新客立减金额返回null代表不可用', newCustomerDiscount.value);
if (newCustomerDiscount.value !== null) {
carts.newUserDiscount = newCustomerDiscount.value.amount
}
}
} catch (error) {
console.log(error);
}
}
function returnPayParams() {
console.log("carts.orderCostSummary", carts.orderCostSummary);
return {
@@ -511,6 +512,9 @@ function returnPayParams() {
couponList: carts.coupons.map((v) => v.id),
userId: props.user.userId || "",
allPack: carts.dinnerType == "take-out" ? 1 : 0,
limitRate: carts.limitDiscountRes,
newCustomerDiscountId: newCustomerDiscount.value !== null ? newCustomerDiscount.value.id : '', // 新客立减Id
newCustomerDiscountAmount: newCustomerDiscount.value !== null ? newCustomerDiscount.value.amount : 0, // 新客立减金额
},
};
}
@@ -550,7 +554,7 @@ function nowPayClick(payType) {
.then(() => {
payOrder("cash");
})
.catch(() => {});
.catch(() => { });
return;
}
if (payType == "member-account") {
@@ -680,9 +684,25 @@ watch(
}
}
);
// 获取当前店铺可用的限时折扣
async function getlimitTimeDiscount() {
try {
const res = await limitTimeDiscountApi.getLimitTimeDiscount({
shopId: localStorage.getItem("shopId")
})
console.log('获取当前店铺可用的限时折扣===', res);
} catch (error) {
console.log(error);
}
}
onMounted(() => {
carts.payParamsInit();
getPaytype();
getlimitTimeDiscount()
getConsumeDiscountAjax()
});
defineExpose({
nowPayClick,
@@ -696,6 +716,7 @@ defineExpose({
line-height: 1;
cursor: pointer;
}
.vip {
padding: 2px 5px;
background: #f7793d;
@@ -704,27 +725,33 @@ defineExpose({
margin-left: 10px;
font-size: 10px;
}
.order-box {
display: flex;
padding: 20px 20px;
background-color: #f7f7fa;
min-height: 100%;
.left,
.right {
flex: 1;
}
.left {
padding-right: 20px;
}
.right {
border-left: 1px solid #ebebeb;
padding-left: 20px;
.order-info {
font-size: 14px;
.title {
}
.value {
}
.title {}
.value {}
.price {
color: #fa5555;
font-size: 20px;
@@ -732,6 +759,7 @@ defineExpose({
}
}
}
.my-select {
border: 1px solid #d9d9d9;
border-radius: 4px;

View File

@@ -1,9 +1,5 @@
<template>
<div
class="box"
v-loading="!carts.isLinkFinshed"
element-loading-text="购物车连接初始化中请稍等"
>
<div class="box" v-loading="!carts.isLinkFinshed" element-loading-text="购物车连接初始化中,请稍等……">
<div class="content">
<div class="top">
<div class="left u-flex u-col-center">
@@ -13,12 +9,7 @@
<el-button type="primary" v-if="!user.id">选择用户</el-button>
<div v-else class="flex cur-pointer">
<img
v-if="user.headImg && user.headImg != 'null'"
class="headimg"
:src="user.headImg"
alt=""
/>
<img v-if="user.headImg && user.headImg != 'null'" class="headimg" :src="user.headImg" alt="" />
<div v-else class="headimg flex flex-x-y-center">
<i class="el-icon-user"></i>
</div>
@@ -34,19 +25,11 @@
</div>
</div>
<el-popover placement="right" width="333" trigger="click" ref="refTable">
<el-input
placeholder="请输入内容"
prefix-icon="search"
v-model="tableSearchText"
@input="tablesearchInput"
></el-input>
<el-input placeholder="请输入内容" prefix-icon="search" v-model="tableSearchText"
@input="tablesearchInput"></el-input>
<div style="max-height: 398px; overflow-y: scroll" class="u-m-t-12">
<div
class="u-flex u-row-between u-p-t-8 table-item u-p-b-8 u-p-r-30"
v-for="(item, index) in tableList"
:key="index"
@click="tableClick(item, index)"
>
<div class="u-flex u-row-between u-p-t-8 table-item u-p-b-8 u-p-r-30" v-for="(item, index) in tableList"
:key="index" @click="tableClick(item, index)">
<span>{{ item.name }}</span>
<span :style="{ color: returnTableColor(item.status) }">
{{ returnTableLabel(item.status) }}
@@ -64,14 +47,11 @@
</div>
</div>
<div class="right">
<el-input
placeholder="请输入商品名称"
v-model="goods.query.name"
clearable
@change="getGoods"
>
<el-input placeholder="请输入商品名称" v-model="goods.query.name" clearable @change="getGoods">
<template #suffix>
<el-icon class="el-input__icon"><search /></el-icon>
<el-icon class="el-input__icon">
<search />
</el-icon>
</template>
</el-input>
</div>
@@ -81,83 +61,51 @@
<div class="diners">
<!-- 就餐类型 -->
<el-button-group v-model="diners.sel" style="width: 100%; display: flex">
<el-button
:class="{ active: index == diners.sel }"
v-for="(item, index) in diners.list"
:disabled="dinerDisabled(item, index)"
@click="changeDinersSel(index)"
:key="index"
>
<el-button :class="{ active: index == diners.sel }" v-for="(item, index) in diners.list"
:disabled="dinerDisabled(item, index)" @click="changeDinersSel(index)" :key="index">
{{ item.label }}
</el-button>
</el-button-group>
</div>
<div class="u-flex u-font-14 clear u-m-t-10 perpoles">
<div
@click="showDinerNumber"
class="u-flex u-p-r-14 u-m-r-14"
style="border-right: 1px solid #ebebeb; line-height: 1"
>
<div @click="showDinerNumber" class="u-flex u-p-r-14 u-m-r-14"
style="border-right: 1px solid #ebebeb; line-height: 1">
<span>就餐人数{{ perpole || "-" }} </span>
<el-icon><ArrowRight /></el-icon>
<el-icon>
<ArrowRight />
</el-icon>
</div>
<el-button link type="primary" :disabled="carts.isEmpty" @click="clearCarts">
清空
</el-button>
</div>
<!-- 购物车 -->
<cartsList
@editNote="showNote(true)"
@createOrder="createOrder"
@hideOrder="hideOrder"
@clearOldOrder="clearOldOrder"
:showOrder="showOrder"
:goodsList="carts.goods"
:dinerType="diners.sel"
:perpole="perpole"
:remark="remark"
:table="table"
ref="refCart"
></cartsList>
<cartsList @editNote="showNote(true)" @createOrder="createOrder" @hideOrder="hideOrder"
@clearOldOrder="clearOldOrder" :showOrder="showOrder" :goodsList="carts.goods" :dinerType="diners.sel"
:perpole="perpole" :remark="remark" :table="table" ref="refCart"></cartsList>
</div>
<div class="center">
<!-- 购物车控制操作按钮 -->
<Controls
@noteClick="showNote"
@packClick="showPack"
@changePriceClick="showChangePrice"
@return="refReturnCartShow"
@rottable="rottableShow"
@changeCartNumberShow="refChangeNumberShow"
/>
<Controls @noteClick="showNote" @packClick="showPack" @changePriceClick="showChangePrice"
@return="refReturnCartShow" @rottable="rottableShow" @changeCartNumberShow="refChangeNumberShow" />
</div>
<div class="right">
<template v-if="!showOrder">
<div class="flex categoty u-col-center">
<div
class="show_more_btn"
:class="{ showAll: category.showAll }"
@click="toggleShowAll"
>
<div class="show_more_btn" :class="{ showAll: category.showAll }" @click="toggleShowAll">
<div class="flex">
<div class="flex showmore">
<el-icon color="#fff"><ArrowDown /></el-icon>
<el-icon color="#fff">
<ArrowDown />
</el-icon>
</div>
<span>{{ category.showAll ? "收起" : "展开" }}</span>
</div>
</div>
<div class="flex categorys" :class="{ 'flex-wrap': category.showAll }">
<div
v-for="(item, index) in category.list"
:key="index"
@click="changeCategoryId(item)"
>
<el-tag
size="large"
:type="goods.query.categoryId === item.id ? 'primary' : 'info'"
effect="dark"
>
<div v-for="(item, index) in category.list" :key="index" @click="changeCategoryId(item)">
<el-tag size="large" :type="goods.query.categoryId === item.id ? 'primary' : 'info'" effect="dark">
{{ item.name }}
</el-tag>
</div>
@@ -166,29 +114,19 @@
<div v-if="carts.goods.length <= 0" class="no-goods">未找到相关商品</div>
<div class="goods-list">
<div class="lingshicai" @click="showaddLingShiCai">
<el-icon size="26"><Plus /></el-icon>
<el-icon size="26">
<Plus />
</el-icon>
<div class="u-m-t-10">临时菜</div>
</div>
<GoodsItem
:item="item"
@itemClick="goodsClick(item)"
v-for="item in carts.goods"
:key="item.id"
></GoodsItem>
<GoodsItem :item="item" @itemClick="goodsClick(item)" v-for="item in carts.goods" :key="item.id">
</GoodsItem>
</div>
</template>
<!-- 订单信息展示 -->
<Order
ref="refOrder"
:orderInfo="carts.oldOrder"
@chooseUser="showChooseUser"
@paysuccess="refresh"
:table="table"
:perpole="perpole"
v-else
:user="user"
></Order>
<Order ref="refOrder" :orderInfo="carts.oldOrder" @chooseUser="showChooseUser" @paysuccess="refresh"
:table="table" :perpole="perpole" v-else :user="user"></Order>
</div>
</div>
</div>
@@ -203,11 +141,7 @@
<!-- 临时菜 -->
<addLingShiCai ref="refAddLingShiCai" @confirm="addLingShiCaiConfirm"></addLingShiCai>
<!-- 改价 -->
<changePrice
ref="refChangePrice"
:useVipPrice="carts.useVipPrice"
@confirm="changePriceConfirm"
></changePrice>
<changePrice ref="refChangePrice" :useVipPrice="carts.useVipPrice" @confirm="changePriceConfirm"></changePrice>
<!-- 称重商品 -->
<change-weight ref="refChangeWeight" @confirm="changeWeightConfirm"></change-weight>
<!-- 可选套餐 -->
@@ -421,6 +355,7 @@ async function createOrder(key) {
placeNum: carts.oldOrder.placeNum * 1 + 1,
waitCall: false,
vipPrice: user.value.id && user.value.isVip,
limitRate: carts.limitDiscountRes
});
clearTimeout(loadingTimer);
loading.close();
@@ -553,7 +488,7 @@ async function getTableDetail(params) {
const res = await tableApi.get(params);
return res;
}
function tablesearchInput() {}
function tablesearchInput() { }
//返回桌台状态颜色
function returnTableColor(key) {
const item = $status[key];
@@ -773,11 +708,15 @@ function clearCarts() {
});
}
function addCarts(item, isWeight = false) {
console.log('index.addCarts===', item);
if (isWeight) {
carts.add({ pack_number: diners.sel ? 1 : 0, ...item });
carts.add({ pack_number: diners.sel ? 1 : 0, ...item, is_time_discount: item.isLimitDiscount ? 1 : 0 });
return;
}
carts.add({ pack_number: diners.sel ? item.number : 0, ...item });
carts.add({ pack_number: diners.sel ? item.number : 0, ...item, is_time_discount: item.isLimitDiscount ? 1 : 0 });
}
watch(
@@ -804,11 +743,11 @@ onMounted(async () => {
// 获取历史订单数据
const res = id
? await orderApi.getHistoryList({
orderId: id,
})
orderId: id,
})
: await orderApi.getHistoryList({
tableCode,
});
tableCode,
});
const noPayStatus = {
cancelled: "订单已取消",
done: "订单已关闭",
@@ -893,20 +832,24 @@ watch(
<style lang="scss" scoped>
$pl: 30px;
.box {
padding: 20px 20px 10px 20px;
height: 100%;
.content {
background-color: #fff;
height: 100%;
box-sizing: border-box;
padding: 20px 20px 20px 0;
.top {
display: flex;
justify-content: space-between;
padding-bottom: 20px;
border-bottom: 1px solid #ebebeb;
margin-left: $pl;
.left {
flex: 1;
@@ -917,39 +860,48 @@ $pl: 30px;
white-space: nowrap;
}
}
.right {
flex: 1;
}
}
.diancan {
padding-top: 10px;
display: flex;
height: 100%;
max-height: calc(100vh - 256px);
.left {
width: 350px;
padding-right: 14px;
box-sizing: border-box;
display: flex;
flex-direction: column;
.diners {
padding-left: $pl;
}
.perpoles {
padding-left: $pl;
}
}
.right {
flex: 1;
overflow-x: hidden;
overflow-y: scroll;
&::-webkit-scrollbar {
width: 4px;
}
}
.center {
overflow-x: hidden;
overflow-y: scroll;
&::-webkit-scrollbar {
width: 4px;
}
@@ -964,18 +916,22 @@ $pl: 30px;
background: rgba(24, 144, 255, 0.1) !important;
z-index: 10;
}
:deep(.diners .el-button-group) {
width: 100%;
display: flex;
}
:deep(.diners .el-button-group .el-button) {
flex: 1;
}
:deep(.categorys .el-tag--plain.el-tag--info) {
border: 1px solid #dcdfe6;
color: #000;
font-weight: 600;
}
:deep(.categorys .el-tag) {
min-width: 80px;
height: 38px;
@@ -991,6 +947,7 @@ $pl: 30px;
margin: 0 10px 10px 0;
cursor: pointer;
}
.categoty {
position: sticky;
top: 0;
@@ -1036,20 +993,24 @@ $pl: 30px;
}
}
}
.goods-list {
display: flex;
flex-wrap: wrap;
gap: 15px;
flex: 1;
}
:deep(.carts) {
padding-left: $pl;
}
:deep(.left) {
.bottom {
padding-left: $pl;
}
}
.lingshicai {
width: 100px;
height: 100px;
@@ -1064,11 +1025,13 @@ $pl: 30px;
border: 1px solid #dddfe6;
color: #999;
}
:deep(.el-tag--dark.el-tag--info) {
background-color: #fff;
color: #000;
border: 1px solid #dcdfe6;
}
.table-item {
cursor: pointer;
transition: 0.2s ease-in-out;
@@ -1077,12 +1040,15 @@ $pl: 30px;
background: #f4f9ff;
}
}
.no-goods {
color: #999;
}
.choose-user {
margin-right: 10px;
}
.headimg {
width: 34px;
height: 34px;
@@ -1090,6 +1056,7 @@ $pl: 30px;
border-radius: 2px;
margin-right: 6px;
}
.vip {
padding: 2px 5px;
background: #f7793d;

View File

@@ -1,35 +1,14 @@
<template>
<el-dialog
:title="form.id ? '编辑台桌' : '添加台桌'"
v-model="dialogVisible"
@open="tbShopAreaGet"
@close="reset"
>
<el-form
ref="refForm"
:model="form"
:rules="rules"
label-width="120px"
label-position="left"
>
<el-dialog :title="form.id ? '编辑台桌' : '添加台桌'" v-model="dialogVisible" @open="tbShopAreaGet" @close="reset">
<el-form ref="refForm" :model="form" :rules="rules" label-width="120px" label-position="left">
<el-form-item label="选择区域" prop="areaId">
<el-select v-model="form.areaId" placeholder="请选择区域">
<el-option
:label="item.name"
:value="item.id"
v-for="item in areaList"
:key="item.id"
></el-option>
<el-option :label="item.name" :value="item.id" v-for="item in areaList" :key="item.id"></el-option>
</el-select>
</el-form-item>
<el-form-item label="台桌状态" prop="status" v-if="form.id">
<el-select v-model="form.status" placeholder="请选择台桌状态">
<el-option
:label="item.label"
:value="item.value"
v-for="item in statusList"
:key="item.value"
></el-option>
<el-option :label="item.label" :value="item.value" v-for="item in statusList" :key="item.value"></el-option>
</el-select>
</el-form-item>
<el-form-item label="台桌标识" prop="sign" v-if="!form.id">
@@ -41,29 +20,18 @@
<div class="u-flex u-m-l-30">
<div class="u-flex">
<div class="u-m-r-4">起始</div>
<el-input
v-model="form.start"
style="width: 57px"
placeholder="请输入起始值"
></el-input>
<el-input v-model="form.start" style="width: 57px" placeholder="请输入起始值"></el-input>
</div>
<div
style="
<div style="
background-color: #d9d9d9;
height: 1px;
width: 32px;
border-radius: 1px;
"
class="u-m-l-16 u-m-r-16"
></div>
" class="u-m-l-16 u-m-r-16"></div>
<div class="u-flex">
<span class="u-m-r-4">结束</span>
<el-input
v-model="form.end"
style="width: 57px"
placeholder="请输入结束值"
></el-input>
<el-input v-model="form.end" style="width: 57px" placeholder="请输入结束值"></el-input>
</div>
</div>
</div>
@@ -72,31 +40,19 @@
<el-input v-model="form.name" placeholder="请输入台桌名称"></el-input>
</el-form-item>
<el-form-item label="客座数">
<el-input-number
v-model="form.maxCapacity"
:min="0"
controls-position="right"
></el-input-number>
<el-input-number v-model="form.maxCapacity" :min="0" controls-position="right"></el-input-number>
</el-form-item>
<el-form-item label="清台管理">
<!-- <el-form-item label="清台管理">
<el-radio-group v-model="form.autoClear">
<el-radio-button :value="0">手动清台</el-radio-button>
<el-radio-button :value="1">自动清台</el-radio-button>
</el-radio-group>
</el-form-item>
</el-form-item> -->
<el-form-item v-if="form.id" label="网络预定开关">
<el-switch
v-model="form.isPredate"
:active-value="1"
:inactive-value="2"
></el-switch>
<el-switch v-model="form.isPredate" :active-value="1" :inactive-value="2"></el-switch>
</el-form-item>
<el-form-item v-if="form.id" label="网络预定台桌支付金额">
<el-input-number
v-model="form.predateAmount"
:min="0"
controls-position="right"
></el-input-number>
<el-input-number v-model="form.predateAmount" :min="0" controls-position="right"></el-input-number>
</el-form-item>
</el-form>
<template #footer>

View File

@@ -0,0 +1,113 @@
<!-- 统一清台设置 -->
<template>
<el-dialog title="清台设置" width="600px" v-model="visible">
<el-form ref="formRef" :model="form" :rules="rules" label-position="right" label-width="120">
<el-form-item label="清台方式">
<el-radio-group v-model="form.autoClear">
<el-radio label="手动清台" :value="0"></el-radio>
<el-radio label="自动清台" :value="1"></el-radio>
</el-radio-group>
</el-form-item>
<el-form-item label="自动清台时间" prop="autoClearTime" v-if="form.autoClear === 1">
<div class="column">
<div>
<el-input v-model="form.autoClearTime" style="width: 220px;" placeholder="请输入"
@input="e => form.autoClearTime = filterNumberInput(e, 0)">
<template #append>分钟后自动清台</template>
</el-input>
</div>
<div class="tips">输入0时默认支付后既自动清台</div>
</div>
</el-form-item>
</el-form>
<template #footer>
<div class="dialog-footer">
<el-button @click="visible = false"> </el-button>
<el-button type="primary" @click="submitHandle" :loading="confirmLoading"> </el-button>
</div>
</template>
</el-dialog>
</template>
<script setup>
import { ref } from 'vue'
import tableApi from "@/api/account/table";
import { filterNumberInput } from '@/utils'
const visible = ref(false)
const formRef = ref(null)
const form = ref({
autoClear: 1, // 自动清台 0手动 1自动
autoClearTime: 0, // 自动清台时间 单位分钟 默认10
})
const rules = ref({
autoClearTime: [
{
validator: (rule, value, callback) => {
if (form.value.autoClearTime === '') {
callback(new Error('请输入自动清台时间'))
} else {
callback()
}
},
trigger: 'blur'
}
]
})
// 提交配置
const confirmLoading = ref(false)
function submitHandle() {
formRef.value.validate(async vaild => {
try {
if (vaild) {
confirmLoading.value = true
await tableApi.shopTabBatch(form.value)
visible.value = false
ElNotification({
title: '注意',
message: '设置成功',
type: 'success'
})
}
} catch (error) {
console.log(error);
}
setTimeout(() => {
confirmLoading.value = false
}, 500);
})
}
// 获取清台配置信息
async function tableCurrentStateAjax() {
try {
const res = await tableApi.tableCurrentState()
form.value.autoClear = res.autoClear
form.value.autoClearTime = res.autoClearTime || 0
} catch (error) {
console.log(error);
}
}
function show() {
visible.value = true
tableCurrentStateAjax()
}
defineExpose({
show
})
</script>
<style scoped lang="scss">
.column {
display: flex;
flex-direction: column;
.tips {
color: #999;
}
}
</style>

View File

@@ -2,12 +2,7 @@
<div class="app-container">
<el-tabs v-model="tableArea.tabsSel" type="card" @tab-click="tabClick">
<el-tab-pane label="全部" name="" />
<el-tab-pane
v-for="item in tableArea.tabs"
:key="item.id"
:label="item.name"
:name="`${item.id}`"
>
<el-tab-pane v-for="item in tableArea.tabs" :key="item.id" :label="item.name" :name="`${item.id}`">
<template #label>
<div class="">
<span>
@@ -31,6 +26,7 @@
<div class="">
<el-button icon="plus" @click="addEaraShow()">添加区域</el-button>
<el-button type="primary" icon="plus" @click="addTableShow()">添加台桌</el-button>
<el-button type="danger" icon="Setting" @click="clearTabDialogRef.show()">清台设置</el-button>
<el-button type="primary" icon="download" @click="showDownloadTableCode">
下载桌台码
</el-button>
@@ -41,12 +37,9 @@
<div class="u-flex u-p-b-15 u-font-14 u-m-t-16">
<div v-for="(item, key) in status" :key="key" class="state u-m-r-24">
<span
class="dot"
:style="{
backgroundColor: status[key] ? status[key].type : '',
}"
/>
<span class="dot" :style="{
backgroundColor: status[key] ? status[key].type : '',
}" />
{{ item.label }}
</div>
</div>
@@ -54,14 +47,9 @@
<!-- 列表 -->
<div class="head-container">
<div v-loading="loading" class="table_list">
<div
v-for="item in tableList"
:key="item.id"
class="item"
:style="{
'background-color': status[item.status] ? status[item.status].type : '',
}"
>
<div v-for="item in tableList" :key="item.id" class="item" :style="{
'background-color': status[item.status] ? status[item.status].type : '',
}">
<div class="new-top flex u-row-between">
<div class="u-flex u-flex-1 u-p-r-10">
<span class="name u-line-1" style="max-width: 50px">
@@ -80,10 +68,7 @@
<el-dropdown-item command="edit">
<span>编辑</span>
</el-dropdown-item>
<el-dropdown-item
command="bindTableCode"
v-if="envName !== 'production'"
>
<el-dropdown-item command="bindTableCode" v-if="envName !== 'production'">
<span>绑定桌码</span>
</el-dropdown-item>
<el-dropdown-item command="del">
@@ -102,20 +87,14 @@
item.bookingInfo.bookingPerson
}}{{ item.bookingInfo.gender == 1 ? "先生" : "女士" }}
</span>
<div
class="state"
style="
<div class="state" style="
font-size: 12px;
color: #666;
display: flex;
align-items: center;
"
>
<img
style="width: 16px; height: 16px; filter: contrast(0.5)"
src="@/assets/images/perpole.png"
alt=""
/>
">
<img style="width: 16px; height: 16px; filter: contrast(0.5)" src="@/assets/images/perpole.png"
alt="" />
{{ item.bookingInfo.bookingTime.substring(11, 19) }}
</div>
@@ -128,71 +107,47 @@
</div>
<div v-else class="u-font-18 font-600 total-price">
<span
v-if="item.status == 'using'"
class="cur-pointer"
@click="diancanShow(item, 'isAddGoods')"
>
<span v-if="item.status == 'using'" class="cur-pointer" @click="diancanShow(item, 'isAddGoods')">
¥{{ item.totalAmount || 0 }}{{ item.productNum }}
</span>
<!-- <span v-else class="color-fff">|</span> -->
</div>
<div class="row btn-group" style="margin-top: 10px">
<template v-if="item.status == 'subscribe'">
<el-button
type="success"
:disabled="!item.tableId || item.status === 'closed'"
@click="markStatus(item, -1)"
>
<el-button type="success" :disabled="!item.tableId || item.status === 'closed'"
@click="markStatus(item, -1)">
取消预约
</el-button>
</template>
<template
v-if="
item.status == 'subscribe' &&
item.bookingInfo &&
item.bookingInfo.status == 20
"
>
<el-button
type="success"
:disabled="!item.tableId || item.status === 'closed'"
@click="markStatus(item, 10)"
>
<template v-if="
item.status == 'subscribe' &&
item.bookingInfo &&
item.bookingInfo.status == 20
">
<el-button type="success" :disabled="!item.tableId || item.status === 'closed'"
@click="markStatus(item, 10)">
到店
</el-button>
</template>
<template
v-if="
item.status == 'idle' ||
(item.status == 'subscribe' &&
item.bookingInfo &&
item.bookingInfo.status == 10)
"
>
<el-button
type="primary"
:disabled="!item.tableCode || item.status === 'closed'"
@click="diancanShow(item)"
>
<template v-if="
item.status == 'idle' ||
(item.status == 'subscribe' &&
item.bookingInfo &&
item.bookingInfo.status == 10)
">
<el-button type="primary" :disabled="!item.tableCode || item.status === 'closed'"
@click="diancanShow(item)">
点餐
</el-button>
</template>
<template
v-else-if="item.status != 'idle' && item.status != 'subscribe'"
>
<template v-else-if="item.status != 'idle' && item.status != 'subscribe'">
<template v-if="item.status == 'using'">
<el-button
:disabled="!item.tableId || item.status === 'closed'"
@click="diancanShow(item, 'isAddGoods')"
>
<el-button :disabled="!item.tableId || item.status === 'closed'"
@click="diancanShow(item, 'isAddGoods')">
加菜
</el-button>
<el-button
type="danger"
:disabled="!item.tableId || item.status === 'closed'"
@click="diancanShow(item, 'isPayOrder')"
>
<el-button type="danger" :disabled="!item.tableId || item.status === 'closed'"
@click="diancanShow(item, 'isPayOrder')">
结账
</el-button>
</template>
@@ -200,13 +155,10 @@
<el-button type="info" disabled>已关台</el-button>
</template>
<template v-else-if="item.status == 'cleaning'">
<el-button
type="info"
:style="{
backgroundColor: status[item.status].type,
borderColor: status[item.status].type,
}"
>
<el-button type="info" :style="{
backgroundColor: status[item.status].type,
borderColor: status[item.status].type,
}">
清理中
</el-button>
</template>
@@ -216,26 +168,17 @@
</template>
</div>
</div>
<div
class="u-flex u-col-bottom bottom u-row-between color-666"
:class="{ 'opacity-0': item.status == 'closed' }"
>
<div class="u-flex u-col-bottom bottom u-row-between color-666"
:class="{ 'opacity-0': item.status == 'closed' }">
<div class="u-flex u-col-center">
<img
style="width: 16px; height: 16px; filter: contrast(0.5)"
src="@/assets/images/perpole.png"
alt=""
/>
<img style="width: 16px; height: 16px; filter: contrast(0.5)" src="@/assets/images/perpole.png"
alt="" />
<span class="u-m-t-4 u-font-12 u-m-l-2">
{{ item.useNum || 0 }}/{{ item.maxCapacity }}
</span>
</div>
<div v-if="item.status == 'using'" class="u-flex">
<img
style="width: 16px; height: 16px; filter: contrast(0.5)"
src="@/assets/images/shalou.png"
alt=""
/>
<img style="width: 16px; height: 16px; filter: contrast(0.5)" src="@/assets/images/shalou.png" alt="" />
<span class="u-m-t-4 u-font-12">
{{ formatTime(item.durationTime) }}
</span>
@@ -256,6 +199,8 @@
<downloadTableCode ref="refDownloadTableCode" />
<!-- 绑定桌码 -->
<bindCode ref="refBindCode" @refresh="tableInit" />
<!-- 清台设置 -->
<clearTabDialog ref="clearTabDialogRef" />
</div>
</template>
@@ -270,6 +215,9 @@ import addEara from "./components/addEara.vue";
import addTable from "./components/addTable.vue";
import bindCode from "./components/bind-table-code.vue";
import downloadTableCode from "./components/downloadTableCode.vue";
import clearTabDialog from "./components/clearTabDialog.vue";
const clearTabDialogRef = ref(null)
const envName = import.meta.env.VITE_APP_NAME;
@@ -298,7 +246,7 @@ function formatTime(milliseconds) {
return `${days ? days + "天" : ""} ${hours ? hours + "时" : ""} ${minutes + "分"}`;
}
function downloadTableCpde() {}
function downloadTableCpde() { }
function downloadShopCpde() {
try {
const link = document.createElement("a");
@@ -341,7 +289,7 @@ function tableComman(command, item) {
ElMessage.success("删除成功");
tableInit();
})
.catch(() => {});
.catch(() => { });
return;
}
}
@@ -417,7 +365,7 @@ function init() {
areainit();
tableInit();
}
onMounted(() => {});
onMounted(() => { });
</script>
<style lang="scss" scoped>