优化打印 优化退单
This commit is contained in:
parent
d08a629b0a
commit
64f539623f
|
|
@ -220,3 +220,16 @@ export function queryPayStatus(params) {
|
||||||
params,
|
params,
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 订单转桌
|
||||||
|
* @param {*} data
|
||||||
|
* @returns
|
||||||
|
*/
|
||||||
|
export function mergeOrder(data) {
|
||||||
|
return request({
|
||||||
|
method: "post",
|
||||||
|
url: "/order/admin/order/mergeOrder",
|
||||||
|
data,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
|
||||||
|
|
@ -77,6 +77,9 @@ export default (data) => {
|
||||||
<div style="margin-top: 6px;margin-bottom: 6px;width: 100%">
|
<div style="margin-top: 6px;margin-bottom: 6px;width: 100%">
|
||||||
<hr/>
|
<hr/>
|
||||||
</div>
|
</div>
|
||||||
|
<div style="margin-top: 4px; font-size: 16px;font-weight: bold;">备注:${
|
||||||
|
data.remark
|
||||||
|
}</div>
|
||||||
<div style="margin-top: 4px; font-size: 12px;">
|
<div style="margin-top: 4px; font-size: 12px;">
|
||||||
打印时间:${data.printTime}
|
打印时间:${data.printTime}
|
||||||
</div>
|
</div>
|
||||||
|
|
|
||||||
|
|
@ -68,7 +68,8 @@
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<scanModal ref="scanModalRef" :amount="props.amount" :money="money" :orderId="props.orderId"
|
<scanModal ref="scanModalRef" :amount="props.amount" :money="money" :orderId="props.orderId"
|
||||||
:selecttype="props.selecttype" :payType="payType" :payData="payData" @success="scanCodeSuccess" />
|
:selecttype="props.selecttype" :payType="payType" :payData="payData" @success="scanCodeSuccess"
|
||||||
|
@orderExpired="emit('orderExpired')" />
|
||||||
<!-- 选择挂账人员 -->
|
<!-- 选择挂账人员 -->
|
||||||
<el-dialog title="挂账" top="1vh" v-model="showBuyer" width="90%" @closed="resetBuyerTable">
|
<el-dialog title="挂账" top="1vh" v-model="showBuyer" width="90%" @closed="resetBuyerTable">
|
||||||
<el-form inline>
|
<el-form inline>
|
||||||
|
|
@ -261,7 +262,7 @@ watch(props, () => {
|
||||||
money.value = formatDecimal(props.amount)
|
money.value = formatDecimal(props.amount)
|
||||||
})
|
})
|
||||||
|
|
||||||
const emit = defineEmits(["paySuccess"]);
|
const emit = defineEmits(["paySuccess", 'orderExpired']);
|
||||||
|
|
||||||
const money = ref("0");
|
const money = ref("0");
|
||||||
const discountRateVlaue = ref(0)
|
const discountRateVlaue = ref(0)
|
||||||
|
|
@ -444,6 +445,10 @@ async function confirmOrder() {
|
||||||
emit("paySuccess");
|
emit("paySuccess");
|
||||||
}
|
}
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
|
if (error.code == 701) {
|
||||||
|
// 订单已过期需刷新购物车和订单
|
||||||
|
emit('orderExpired')
|
||||||
|
}
|
||||||
console.log(error);
|
console.log(error);
|
||||||
payLoading.value = false;
|
payLoading.value = false;
|
||||||
scanModalRef.value.loading = false;
|
scanModalRef.value.loading = false;
|
||||||
|
|
|
||||||
|
|
@ -59,17 +59,11 @@ import { useUser } from "@/store/user.js";
|
||||||
import { useGlobal } from '@/store/global.js'
|
import { useGlobal } from '@/store/global.js'
|
||||||
import { formatDecimal } from '@/utils'
|
import { formatDecimal } from '@/utils'
|
||||||
import { microPay, queryOrderStatus, microPayVip, vipPay, queryPayStatus } from '@/api/order.js'
|
import { microPay, queryOrderStatus, microPayVip, vipPay, queryPayStatus } from '@/api/order.js'
|
||||||
|
import { ElMessage } from "element-plus";
|
||||||
|
|
||||||
const store = useUser();
|
const store = useUser();
|
||||||
const global = useGlobal()
|
const global = useGlobal()
|
||||||
import {
|
const emits = defineEmits(["success", 'orderExpired']);
|
||||||
queryMembermember,
|
|
||||||
createMembermember,
|
|
||||||
membermemberScanPay,
|
|
||||||
accountPaymember,
|
|
||||||
} from "@/api/member/index.js";
|
|
||||||
import { ElMessage } from "element-plus";
|
|
||||||
const emits = defineEmits(["success"]);
|
|
||||||
|
|
||||||
const props = defineProps({
|
const props = defineProps({
|
||||||
amount: {
|
amount: {
|
||||||
|
|
@ -181,6 +175,9 @@ async function submitHandle() {
|
||||||
userPayWait.value = true;
|
userPayWait.value = true;
|
||||||
fastOrder.value = error.data
|
fastOrder.value = error.data
|
||||||
autoCheckOrder()
|
autoCheckOrder()
|
||||||
|
} else if (error.code == 701) {
|
||||||
|
// 订单已过期需刷新购物车和订单
|
||||||
|
emits('orderExpired')
|
||||||
} else {
|
} else {
|
||||||
scanCode.value = "";
|
scanCode.value = "";
|
||||||
loading.value = false;
|
loading.value = false;
|
||||||
|
|
|
||||||
|
|
@ -7,7 +7,6 @@ import { useUser } from "@/store/user.js";
|
||||||
import { useSocket } from "@/store/socket.js";
|
import { useSocket } from "@/store/socket.js";
|
||||||
import useStorage from "@/utils/useStorage.js";
|
import useStorage from "@/utils/useStorage.js";
|
||||||
import { formatDecimal } from "@/utils/index.js";
|
import { formatDecimal } from "@/utils/index.js";
|
||||||
import { ElMessage } from "element-plus";
|
|
||||||
|
|
||||||
// 商品store + 购物车store
|
// 商品store + 购物车store
|
||||||
export const useGoods = defineStore("goods", {
|
export const useGoods = defineStore("goods", {
|
||||||
|
|
@ -21,6 +20,7 @@ export const useGoods = defineStore("goods", {
|
||||||
// tableCode: "66666666",
|
// tableCode: "66666666",
|
||||||
// }, // 台桌信息
|
// }, // 台桌信息
|
||||||
tableInfo: {
|
tableInfo: {
|
||||||
|
id: '',
|
||||||
name: "",
|
name: "",
|
||||||
num: "",
|
num: "",
|
||||||
tableCode: "",
|
tableCode: "",
|
||||||
|
|
@ -392,6 +392,8 @@ export const useGoods = defineStore("goods", {
|
||||||
let group_text = "";
|
let group_text = "";
|
||||||
if (val.type == "package" && item.pro_group_info) {
|
if (val.type == "package" && item.pro_group_info) {
|
||||||
group_text = JSON.parse(item.pro_group_info)
|
group_text = JSON.parse(item.pro_group_info)
|
||||||
|
.flat()
|
||||||
|
.map((item) => item.goods)
|
||||||
.flat()
|
.flat()
|
||||||
.map((item) => item.proName)
|
.map((item) => item.proName)
|
||||||
.join("、");
|
.join("、");
|
||||||
|
|
@ -548,8 +550,12 @@ export const useGoods = defineStore("goods", {
|
||||||
|
|
||||||
if (+val.pack_number && !val.is_temporary) {
|
if (+val.pack_number && !val.is_temporary) {
|
||||||
packFeeNumber += +val.pack_number;
|
packFeeNumber += +val.pack_number;
|
||||||
|
if (+val.pack_number > number) {
|
||||||
|
packFee += number * +val.packFee;
|
||||||
|
} else {
|
||||||
packFee += +val.pack_number * +val.packFee;
|
packFee += +val.pack_number * +val.packFee;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (val.is_temporary) {
|
if (val.is_temporary) {
|
||||||
if (val.is_gift) {
|
if (val.is_gift) {
|
||||||
|
|
|
||||||
|
|
@ -120,7 +120,14 @@ export const useSocket = defineStore("socket", {
|
||||||
goodsStore.successClearCart();
|
goodsStore.successClearCart();
|
||||||
break;
|
break;
|
||||||
case "batch":
|
case "batch":
|
||||||
// 打包
|
// 整单打包
|
||||||
|
this.cartInit();
|
||||||
|
break;
|
||||||
|
case "rottable":
|
||||||
|
// 转桌
|
||||||
|
useStorage.set("tableCode", data.data.new_table_code);
|
||||||
|
goodsStore.successClearCart();
|
||||||
|
goodsStore.historyOrderAjax(data.data.new_table_code);
|
||||||
this.cartInit();
|
this.cartInit();
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
|
|
|
||||||
|
|
@ -182,7 +182,7 @@ export function commOrderPrintData(orderInfo) {
|
||||||
skuName: item.skuName,
|
skuName: item.skuName,
|
||||||
salePrice: formatDecimal(item.price),
|
salePrice: formatDecimal(item.price),
|
||||||
totalAmount: formatDecimal(+item.payAmount),
|
totalAmount: formatDecimal(+item.payAmount),
|
||||||
proGroupInfo: item.proGroupInfo,
|
proGroupInfo: item.proGroupInfo.map((item) => item.goods).flat(),
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -414,21 +414,24 @@ function searchHandle() {
|
||||||
|
|
||||||
// 确认选择规格回调
|
// 确认选择规格回调
|
||||||
function skuConfirm(params) {
|
function skuConfirm(params) {
|
||||||
// console.log(params);
|
console.log(params);
|
||||||
let goodsItem = goodsStore.cartList.find(goods => goods.product_id == params.productId && goods.sku_id == params.id)
|
let goodsItem = goodsStore.cartList.find(goods => goods.product_id == params.productId && goods.sku_id == params.id)
|
||||||
if (goodsItem && goodsItem.id) {
|
if (goodsItem && goodsItem.id) {
|
||||||
// 编辑新增
|
// 编辑新增
|
||||||
if (params.type && params.type == 'weight') {
|
if (params.goods_type == 'weight') {
|
||||||
// 称重商品
|
// 称重商品
|
||||||
|
console.log('编辑称重商品');
|
||||||
goodsStore.operateCart({ ...goodsItem, number: params.number }, 'edit')
|
goodsStore.operateCart({ ...goodsItem, number: params.number }, 'edit')
|
||||||
} else if (params.type && params.type == 'package') {
|
} else if (params.goods_type == 'package') {
|
||||||
// 添加
|
// 添加
|
||||||
|
console.log('添加套餐商品');
|
||||||
goodsStore.addCart({ ...params })
|
goodsStore.addCart({ ...params })
|
||||||
} else {
|
} else {
|
||||||
goodsStore.operateCart({ ...goodsItem, number: +goodsItem.number + 1 }, 'edit')
|
goodsStore.operateCart({ ...goodsItem, number: +goodsItem.number + 1 }, 'edit')
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
// 添加
|
// 添加
|
||||||
|
console.log('直接添加');
|
||||||
if (params.type == 'weight') {
|
if (params.type == 'weight') {
|
||||||
goodsStore.addCart({ ...params, number: params.number })
|
goodsStore.addCart({ ...params, number: params.number })
|
||||||
} else {
|
} else {
|
||||||
|
|
@ -522,7 +525,7 @@ function showSkuHandle(item) {
|
||||||
goodsStore.addCart({
|
goodsStore.addCart({
|
||||||
...item.skuList[0], lowPrice: item.skuList[0].salePrice, type: item.type,
|
...item.skuList[0], lowPrice: item.skuList[0].salePrice, type: item.type,
|
||||||
goods_type: 'package',
|
goods_type: 'package',
|
||||||
pro_group_info: item.groupSnap.map((item) => item.goods),
|
pro_group_info: item.groupSnap,
|
||||||
number: item.skuList[0].suitNum
|
number: item.skuList[0].suitNum
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -87,7 +87,7 @@ function show(item, type = 'add') {
|
||||||
setTimeout(() => {
|
setTimeout(() => {
|
||||||
goodsItem.value.groupSnap.map((item, index) => {
|
goodsItem.value.groupSnap.map((item, index) => {
|
||||||
item.goods.map((val, i) => {
|
item.goods.map((val, i) => {
|
||||||
selectGroup[index].map(sg => {
|
selectGroup[index].goods.map(sg => {
|
||||||
if (val.proId == sg.proId) {
|
if (val.proId == sg.proId) {
|
||||||
tabRefs.value[index].toggleRowSelection(val, true)
|
tabRefs.value[index].toggleRowSelection(val, true)
|
||||||
}
|
}
|
||||||
|
|
@ -158,8 +158,9 @@ function confirmHandle() {
|
||||||
|
|
||||||
let goodIds = []
|
let goodIds = []
|
||||||
goodsItem.value.groupSnap.map((item, index) => {
|
goodsItem.value.groupSnap.map((item, index) => {
|
||||||
let selectNum = tabRefs.value[index].getSelectionRows()
|
let obj = { ...item }
|
||||||
goodIds.push(selectNum)
|
obj.goods = tabRefs.value[index].getSelectionRows()
|
||||||
|
goodIds.push(obj)
|
||||||
})
|
})
|
||||||
|
|
||||||
// 将商品数据转为一维数组返回
|
// 将商品数据转为一维数组返回
|
||||||
|
|
|
||||||
|
|
@ -47,7 +47,7 @@
|
||||||
</div>
|
</div>
|
||||||
<div class="pay_wrap">
|
<div class="pay_wrap">
|
||||||
<payCard ref="payCardRef" :orderList="orderList" :amount="cartInfo.totalAmount"
|
<payCard ref="payCardRef" :orderList="orderList" :amount="cartInfo.totalAmount"
|
||||||
:orderId="goodsStore.orderListInfo.id" @paySuccess="paySuccess" />
|
:orderId="goodsStore.orderListInfo.id" @paySuccess="paySuccess" @orderExpired="orderExpiredHnadle" />
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<!-- <el-dialog v-model="showStaffDiscount" title="员工折扣" @close="global.updateData(true)">
|
<!-- <el-dialog v-model="showStaffDiscount" title="员工折扣" @close="global.updateData(true)">
|
||||||
|
|
@ -140,6 +140,14 @@ const orderList = ref([])
|
||||||
const isPrint = ref(true);
|
const isPrint = ref(true);
|
||||||
const discountLoading = ref(false)
|
const discountLoading = ref(false)
|
||||||
|
|
||||||
|
// 支付失败,订单已过期
|
||||||
|
function orderExpiredHnadle() {
|
||||||
|
dialogVisible.value = false
|
||||||
|
useStorage.del('tableCode')
|
||||||
|
socket.cartInit()
|
||||||
|
goodsStore.successClearCart()
|
||||||
|
}
|
||||||
|
|
||||||
// 显示员工折扣
|
// 显示员工折扣
|
||||||
async function showStaffDiscountHandle() {
|
async function showStaffDiscountHandle() {
|
||||||
try {
|
try {
|
||||||
|
|
|
||||||
|
|
@ -3,14 +3,17 @@
|
||||||
<el-dialog title="转桌/并桌" width="700px" v-model="visible" @closed="onClose" top="3vh">
|
<el-dialog title="转桌/并桌" width="700px" v-model="visible" @closed="onClose" top="3vh">
|
||||||
<div class="scroll_y">
|
<div class="scroll_y">
|
||||||
<el-form :model="form" ref="formRef" :rules="rules" label-position="top">
|
<el-form :model="form" ref="formRef" :rules="rules" label-position="top">
|
||||||
|
<el-form-item label="当前台桌" v-if="goodsStore.tableInfo.id">
|
||||||
|
{{ goodsStore.tableInfo.name }}
|
||||||
|
</el-form-item>
|
||||||
<el-form-item label="转入台桌" prop="targetTableId">
|
<el-form-item label="转入台桌" prop="targetTableId">
|
||||||
<el-select v-model="form.targetTableId" style="width: 200px;" placeholder="请选择目标台桌">
|
<el-select v-model="form.targetTableId" style="width: 200px;" placeholder="请选择目标台桌">
|
||||||
<el-option :label="item.name" :value="item.qrcode" v-for="item in tableList"
|
<el-option :label="item.name" :value="item.id" v-for="item in tableList"
|
||||||
:key="item.qrcode"></el-option>
|
:key="item.id"></el-option>
|
||||||
</el-select>
|
</el-select>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
<el-form-item label="转入类型">
|
<el-form-item label="转入类型" prop="cartIds">
|
||||||
<el-radio-group v-model="form.isFull">
|
<el-radio-group v-model="form.isFull" @change="tableChange">
|
||||||
<el-radio :value="false" border>转桌(可将部分商品转入)</el-radio>
|
<el-radio :value="false" border>转桌(可将部分商品转入)</el-radio>
|
||||||
<el-radio :value="true" border>并桌(并台会将全部购物车商品转入)</el-radio>
|
<el-radio :value="true" border>并桌(并台会将全部购物车商品转入)</el-radio>
|
||||||
</el-radio-group>
|
</el-radio-group>
|
||||||
|
|
@ -24,7 +27,7 @@
|
||||||
<el-table-column label="价格" prop="lowPrice"></el-table-column>
|
<el-table-column label="价格" prop="lowPrice"></el-table-column>
|
||||||
</el-table>
|
</el-table>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
<el-form-item label="已下单商品" prop="cartIds" v-if="!form.isFull">
|
<el-form-item label="已下单商品" v-if="!form.isFull && goodsStore.orderList.length">
|
||||||
<div v-for="item in goodsStore.orderList" style="width: 100%;">
|
<div v-for="item in goodsStore.orderList" style="width: 100%;">
|
||||||
<div>{{ `第${item.orderNum}次下单` }}</div>
|
<div>{{ `第${item.orderNum}次下单` }}</div>
|
||||||
<el-table ref="orderTableRefs" :data="item.goods" border stripe>
|
<el-table ref="orderTableRefs" :data="item.goods" border stripe>
|
||||||
|
|
@ -51,30 +54,25 @@
|
||||||
|
|
||||||
<script setup>
|
<script setup>
|
||||||
import { onMounted, ref } from 'vue'
|
import { onMounted, ref } from 'vue'
|
||||||
import { orderSwitcht } from '@/api/product.js'
|
import { mergeOrder } from '@/api/order.js'
|
||||||
import { useGoods } from '@/store/goods.js'
|
import { useGoods } from '@/store/goods.js'
|
||||||
import { useUser } from "@/store/user.js"
|
|
||||||
import { ElMessage } from 'element-plus'
|
|
||||||
import { shopTable } from "@/api/account.js";
|
import { shopTable } from "@/api/account.js";
|
||||||
|
import useStorage from '@/utils/useStorage.js'
|
||||||
|
import { useSocket } from '@/store/socket.js'
|
||||||
|
|
||||||
const emits = defineEmits(['success'])
|
const emits = defineEmits(['success'])
|
||||||
|
|
||||||
const store = useUser()
|
const socket = useSocket()
|
||||||
const goodsStore = useGoods()
|
const goodsStore = useGoods()
|
||||||
const visible = ref(false)
|
const visible = ref(false)
|
||||||
const cartTableRefs = ref(null)
|
const cartTableRefs = ref(null)
|
||||||
const orderTableRefs = ref(null)
|
const orderTableRefs = ref([])
|
||||||
const loading = ref(false)
|
const loading = ref(false)
|
||||||
const formRef = ref(null)
|
const formRef = ref(null)
|
||||||
const resetForm = ref({})
|
const resetForm = ref({})
|
||||||
const form = ref({
|
const form = ref({
|
||||||
shopId: store.userInfo.shopId,
|
|
||||||
masterId: '',
|
|
||||||
orderId: '',
|
|
||||||
cartIds: [],
|
|
||||||
isFull: false,
|
|
||||||
currentTableId: '',
|
|
||||||
targetTableId: '',
|
targetTableId: '',
|
||||||
|
isFull: false,
|
||||||
})
|
})
|
||||||
|
|
||||||
const rules = ref({
|
const rules = ref({
|
||||||
|
|
@ -89,30 +87,40 @@ const rules = ref({
|
||||||
{
|
{
|
||||||
required: true,
|
required: true,
|
||||||
validator: (rule, value, callback) => {
|
validator: (rule, value, callback) => {
|
||||||
|
if (!form.value.isFull) {
|
||||||
let arr = []
|
let arr = []
|
||||||
props.data.map((item, index) => {
|
arr.push(...cartTableRefs.value.getSelectionRows())
|
||||||
arr.push(...tableRefs.value[index].getSelectionRows())
|
|
||||||
|
goodsStore.orderList.map((item, index) => {
|
||||||
|
arr.push(...orderTableRefs.value[index].getSelectionRows())
|
||||||
})
|
})
|
||||||
|
|
||||||
if (!arr.length) {
|
if (!arr.length) {
|
||||||
ElMessage.error('至少选择一个商品')
|
|
||||||
callback(new Error('至少选择一个商品'))
|
callback(new Error('至少选择一个商品'))
|
||||||
} else {
|
} else {
|
||||||
callback()
|
callback()
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
|
callback()
|
||||||
|
}
|
||||||
},
|
},
|
||||||
trigger: 'blur',
|
trigger: 'blur',
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
})
|
})
|
||||||
|
|
||||||
|
// 切换道并桌时清除掉所有验证
|
||||||
|
function tableChange(e) {
|
||||||
|
if (e) formRef.value.clearValidate('cartIds')
|
||||||
|
}
|
||||||
|
|
||||||
const tableList = ref([])
|
const tableList = ref([])
|
||||||
// 获取台桌列表
|
// 获取台桌列表
|
||||||
async function queryShopTableAjax() {
|
async function queryShopTableAjax() {
|
||||||
try {
|
try {
|
||||||
const res = await shopTable({
|
const res = await shopTable({
|
||||||
status: 'using',
|
// status: 'using',
|
||||||
isBind: true
|
// isBind: true
|
||||||
})
|
})
|
||||||
tableList.value = res.records
|
tableList.value = res.records
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
|
|
@ -126,32 +134,66 @@ function confirmHandle() {
|
||||||
try {
|
try {
|
||||||
if (valid) {
|
if (valid) {
|
||||||
loading.value = true
|
loading.value = true
|
||||||
form.value.masterId = props.data[0].info[0].masterId
|
|
||||||
form.value.orderId = props.data[0].info[0].orderId
|
|
||||||
form.value.currentTableId = props.data[0].info[0].tableId
|
|
||||||
|
|
||||||
if (!form.value.isFull) {
|
let targetTable = tableList.value.find(item => item.id == form.value.targetTableId)
|
||||||
let arr = []
|
|
||||||
props.data.map((item, index) => {
|
let sourceOrderId = goodsStore.orderListInfo.id
|
||||||
arr.push(...tableRefs.value[index].getSelectionRows())
|
let targetOrderId = targetTable.orderId
|
||||||
|
let targetTableCode = targetTable.tableCode
|
||||||
|
let detailIds = []
|
||||||
|
|
||||||
|
if (form.value.isFull) {
|
||||||
|
goodsStore.orderList.map((item, index) => {
|
||||||
|
item.goods.map(val => {
|
||||||
|
detailIds.push(val.id)
|
||||||
|
})
|
||||||
|
})
|
||||||
|
} else {
|
||||||
|
goodsStore.orderList.map((item, index) => {
|
||||||
|
detailIds.push(...orderTableRefs.value[index].getSelectionRows().map(item => item.id))
|
||||||
})
|
})
|
||||||
form.value.cartIds = arr.map(item => item.id)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
await orderSwitcht(form.value)
|
|
||||||
loading.value = false
|
|
||||||
|
|
||||||
// 更新台桌信息
|
if (detailIds.length) {
|
||||||
// 在这里做点什么
|
await mergeOrder({
|
||||||
|
sourceOrderId: sourceOrderId, // 来源订单id
|
||||||
|
targetOrderId: targetOrderId, // 目标台桌订单id
|
||||||
|
targetTableCode: targetTableCode, // 目标台桌码
|
||||||
|
detailIds: detailIds // 转台详情
|
||||||
|
})
|
||||||
|
if (!goodsStore.cartList.length) {
|
||||||
|
useStorage.set('tableCode', targetTableCode)
|
||||||
|
|
||||||
|
goodsStore.successClearCart();
|
||||||
|
goodsStore.historyOrderAjax(targetTableCode);
|
||||||
|
socket.cartInit();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (goodsStore.cartList.length) {
|
||||||
|
let table_code = goodsStore.cartList[0].table_code
|
||||||
|
let new_table_code = targetTable.tableCode
|
||||||
|
let cart_id = []
|
||||||
|
|
||||||
|
if (form.value.isFull) {
|
||||||
|
cart_id = goodsStore.cartList.map(item => item.id)
|
||||||
|
} else {
|
||||||
|
cart_id = cartTableRefs.value.getSelectionRows().map(item => item.id)
|
||||||
|
}
|
||||||
|
|
||||||
|
goodsStore.operateCart({
|
||||||
|
table_code: table_code,
|
||||||
|
new_table_code: new_table_code,
|
||||||
|
cart_id: cart_id
|
||||||
|
}, 'rottable')
|
||||||
|
}
|
||||||
visible.value = false
|
visible.value = false
|
||||||
|
|
||||||
emits('success', { isTemporary: true })
|
|
||||||
}
|
}
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
loading.value = false
|
|
||||||
console.log(error);
|
console.log(error);
|
||||||
}
|
}
|
||||||
|
loading.value = false
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -161,9 +203,11 @@ function onClose() {
|
||||||
}
|
}
|
||||||
|
|
||||||
function show() {
|
function show() {
|
||||||
|
if (goodsStore.cartList.length || goodsStore.orderList.length) {
|
||||||
visible.value = true
|
visible.value = true
|
||||||
queryShopTableAjax()
|
queryShopTableAjax()
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
defineExpose({
|
defineExpose({
|
||||||
show
|
show
|
||||||
|
|
|
||||||
|
|
@ -8,9 +8,11 @@
|
||||||
<span>{{ item.createTime }}</span>
|
<span>{{ item.createTime }}</span>
|
||||||
</div>
|
</div>
|
||||||
<div class="dialog_footer_right">
|
<div class="dialog_footer_right">
|
||||||
<span :class="{ active: item.amount > 0 }">
|
<span class="active" v-if="item.amount > 0">
|
||||||
<template v-if="item.amount > 0">+</template>
|
+¥{{ formatDecimal(item.amount) }}
|
||||||
¥{{ formatDecimal(item.amount) }}
|
</span>
|
||||||
|
<span v-else>
|
||||||
|
-¥{{ formatDecimal(+JSON.stringify(item.amount).replace('-', '')) }}
|
||||||
</span>
|
</span>
|
||||||
<span>余额:¥{{ formatDecimal(item.balance) }}</span>
|
<span>余额:¥{{ formatDecimal(item.balance) }}</span>
|
||||||
</div>
|
</div>
|
||||||
|
|
@ -49,18 +51,33 @@
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
</template>
|
</template>
|
||||||
<el-form-item label="退款金额" prop="amount">
|
<el-form-item label="退款金额" prop="amount">
|
||||||
<el-input-number v-model="form.amount" :max="form.max" placeholder="请输入退款金额" />
|
<el-input-number v-model="form.amount" :min="0.01" :max="form.max" placeholder="请输入" />
|
||||||
<div class="tips" v-if="refundItem.giftAmount - refundItem.giftRefundAmount > 0">
|
<div class="tips" v-if="refundItem.giftAmount - refundItem.giftRefundAmount > 0">
|
||||||
注意:一旦退款,优先扣除赠送金额</div>
|
注意:一旦退款,优先扣除赠送金额</div>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
<el-form-item label="退款说明">
|
<el-form-item label="退款说明" prop="remark">
|
||||||
<el-input v-model="form.remark" placeholder="请输入退款说明" />
|
<el-input v-model="form.remark" placeholder="请输入退款说明" />
|
||||||
|
<div class="remark_tag">
|
||||||
|
<div class="item" v-for="(item, index) in remarkTagList" :key="index"
|
||||||
|
@click="addRmarkHandle(item)">
|
||||||
|
{{ item }}
|
||||||
|
</div>
|
||||||
|
<div class="item" @click="form.remark = ''">
|
||||||
|
<el-icon>
|
||||||
|
<CircleClose />
|
||||||
|
</el-icon>
|
||||||
|
清空
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
</el-form>
|
</el-form>
|
||||||
<template #footer>
|
<template #footer>
|
||||||
<div style="padding: 0 20px 20px;">
|
<div style="padding: 0 20px 20px;width: 100%;display: flex;justify-content: space-between;">
|
||||||
|
<el-button type="danger" @click="handleRefund">手动退款</el-button>
|
||||||
|
<div class="btn" style="display: flex;">
|
||||||
<el-button @click="showDialog = false">取消</el-button>
|
<el-button @click="showDialog = false">取消</el-button>
|
||||||
<el-button type="primary" :loading="loading" @click="refundHandle">确定</el-button>
|
<el-button type="primary" :loading="loading" @click="refundHandle">原路返回</el-button>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
</el-dialog>
|
</el-dialog>
|
||||||
|
|
@ -73,15 +90,15 @@
|
||||||
<script setup>
|
<script setup>
|
||||||
import md5 from "js-md5";
|
import md5 from "js-md5";
|
||||||
import { reactive, ref } from 'vue'
|
import { reactive, ref } from 'vue'
|
||||||
import { dayjs, ElMessage } from 'element-plus'
|
import { ElMessage } from 'element-plus'
|
||||||
import { formatDecimal } from '@/utils/index'
|
import { formatDecimal } from '@/utils/index'
|
||||||
import { shopUserChargeFlow } from '@/api/account.js'
|
import { shopUserChargeFlow } from '@/api/account.js'
|
||||||
import { refundVipBefore, refundVip } from '@/api/order.js'
|
import { refundVipBefore, refundVip } from '@/api/order.js'
|
||||||
import { returnFlow, memberqueryMemberAccount } from '@/api/member/index.js'
|
import { staffPermission } from '@/api/user.js'
|
||||||
import { queryPwdInfo, staffPermission } from '@/api/user.js'
|
|
||||||
import takeFoodCode from "@/components/takeFoodCode.vue";
|
import takeFoodCode from "@/components/takeFoodCode.vue";
|
||||||
import { useGlobal } from '@/store/global.js'
|
import { useGlobal } from '@/store/global.js'
|
||||||
import { useUser } from '@/store/user.js'
|
import { useUser } from '@/store/user.js'
|
||||||
|
import { ElMessageBox } from 'element-plus'
|
||||||
|
|
||||||
const userStore = useUser()
|
const userStore = useUser()
|
||||||
const globalStore = useGlobal()
|
const globalStore = useGlobal()
|
||||||
|
|
@ -146,12 +163,34 @@ const rules = reactive({
|
||||||
required: true,
|
required: true,
|
||||||
message: '请输入退款金额'
|
message: '请输入退款金额'
|
||||||
}
|
}
|
||||||
|
],
|
||||||
|
remark: [
|
||||||
|
{
|
||||||
|
trigger: 'blur',
|
||||||
|
required: true,
|
||||||
|
message: '请输入退款原因'
|
||||||
|
}
|
||||||
]
|
]
|
||||||
})
|
})
|
||||||
const loading = ref(false)
|
const loading = ref(false)
|
||||||
const refundItem = ref({})
|
const refundItem = ref({})
|
||||||
const formRef = ref(null)
|
const formRef = ref(null)
|
||||||
const flowItem = ref({})
|
const flowItem = ref({})
|
||||||
|
const cashRefund = ref(false)
|
||||||
|
const remarkTagList = ref([
|
||||||
|
'点错了',
|
||||||
|
'不要了',
|
||||||
|
'没货了'
|
||||||
|
])
|
||||||
|
|
||||||
|
// 添加备注
|
||||||
|
function addRmarkHandle(item) {
|
||||||
|
if (form.remark.length) {
|
||||||
|
form.remark += `,${item}`
|
||||||
|
} else {
|
||||||
|
form.remark = item
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// 显示充值退款
|
// 显示充值退款
|
||||||
async function showRefundHandle(item) {
|
async function showRefundHandle(item) {
|
||||||
|
|
@ -201,6 +240,22 @@ function refundHandle() {
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 显示手动退款
|
||||||
|
function handleRefund() {
|
||||||
|
ElMessageBox.confirm('请线下手动转账给客户或现金,一旦操作完成无法修改订单状态,请慎重操作!', '注意', {
|
||||||
|
confirmButtonText: '已在线下完成退款'
|
||||||
|
}).then(async () => {
|
||||||
|
cashRefund.value = true
|
||||||
|
await userStore.getShopInfo()
|
||||||
|
loading.value = false
|
||||||
|
if (userStore.shopInfo.isMemberInPwd == 1) {
|
||||||
|
takeFoodCodeRef.value.show();
|
||||||
|
} else {
|
||||||
|
passwordSuccess()
|
||||||
|
}
|
||||||
|
}).catch(() => { })
|
||||||
|
}
|
||||||
|
|
||||||
// 得到退款密码
|
// 得到退款密码
|
||||||
async function passwordSuccess(e = '') {
|
async function passwordSuccess(e = '') {
|
||||||
try {
|
try {
|
||||||
|
|
@ -212,7 +267,7 @@ async function passwordSuccess(e = '') {
|
||||||
refAmount: form.amount,
|
refAmount: form.amount,
|
||||||
remark: form.remark,
|
remark: form.remark,
|
||||||
outOfRange: false,
|
outOfRange: false,
|
||||||
cashRefund: true,
|
cashRefund: cashRefund.value,
|
||||||
pwd: e,
|
pwd: e,
|
||||||
})
|
})
|
||||||
ElMessage.success('退款成功')
|
ElMessage.success('退款成功')
|
||||||
|
|
@ -231,6 +286,7 @@ async function passwordSuccess(e = '') {
|
||||||
function show(row) {
|
function show(row) {
|
||||||
userInfo.value = row
|
userInfo.value = row
|
||||||
visableDialog.value = true
|
visableDialog.value = true
|
||||||
|
cashRefund.value = false
|
||||||
memberqueryMemberAccountAjax()
|
memberqueryMemberAccountAjax()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -240,6 +296,30 @@ defineExpose({
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<style scoped lang="scss">
|
<style scoped lang="scss">
|
||||||
|
.remark_tag {
|
||||||
|
display: flex;
|
||||||
|
flex-wrap: wrap;
|
||||||
|
gap: 10px;
|
||||||
|
padding-top: 10px;
|
||||||
|
|
||||||
|
.item {
|
||||||
|
height: 35px;
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: center;
|
||||||
|
gap: 10px;
|
||||||
|
padding: 6px 12px;
|
||||||
|
border: 1px solid #ddd;
|
||||||
|
background-color: #fff;
|
||||||
|
border-radius: 4px;
|
||||||
|
color: #555;
|
||||||
|
|
||||||
|
&:active {
|
||||||
|
background-color: #ddd;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
.box {
|
.box {
|
||||||
|
|
||||||
.box1 {
|
.box1 {
|
||||||
|
|
|
||||||
|
|
@ -33,7 +33,7 @@
|
||||||
{{ formatDecimal(item.payAmount) }}
|
{{ formatDecimal(item.payAmount) }}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="flex" v-for="val in item.proGroupInfo" :key="val.proId">
|
<div class="flex" v-for="val in item.proGroupInfo.map(item => item.goods).flat()" :key="val.proId">
|
||||||
<div class="item">>{{ val.proName }}</div>
|
<div class="item">>{{ val.proName }}</div>
|
||||||
<div class="item">0.00</div>
|
<div class="item">0.00</div>
|
||||||
<div class="item">{{ val.number }}</div>
|
<div class="item">{{ val.number }}</div>
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,5 @@
|
||||||
<template>
|
<template>
|
||||||
<el-drawer v-model="isShow" direction="rtl" size="70%">
|
<el-drawer v-model="isShow" direction="rtl" size="80%">
|
||||||
<template #header>
|
<template #header>
|
||||||
<h4>订单号:{{ item.orderNo }}</h4>
|
<h4>订单号:{{ item.orderNo }}</h4>
|
||||||
</template>
|
</template>
|
||||||
|
|
@ -21,11 +21,11 @@
|
||||||
<el-radio-group v-model="refundType" @change="refundTypeChange">
|
<el-radio-group v-model="refundType" @change="refundTypeChange">
|
||||||
<el-radio-button label="整单退" :value="1" />
|
<el-radio-button label="整单退" :value="1" />
|
||||||
<el-radio-button label="部分退" :value="2" />
|
<el-radio-button label="部分退" :value="2" />
|
||||||
<!-- <el-radio-button label="自定义" :value="3" /> -->
|
<el-radio-button label="自定义" :value="3" />
|
||||||
</el-radio-group>
|
</el-radio-group>
|
||||||
<div class="amount">
|
<div class="amount">
|
||||||
<el-input v-model="refundAmount" style="width: 370px;height: 42px;" placeholder="请输入退款金额"
|
<el-input v-model="refundAmount" style="width: 400px;height: 42px;" :readonly="refundType != 3"
|
||||||
@input="inputChange">
|
placeholder="请输入退款金额" @input="inputChange">
|
||||||
<template #prepend>¥</template>
|
<template #prepend>¥</template>
|
||||||
<template #append>最多可退¥{{ formatDecimal(item.payAmount - item.refundAmount, 2) }}</template>
|
<template #append>最多可退¥{{ formatDecimal(item.payAmount - item.refundAmount, 2) }}</template>
|
||||||
</el-input>
|
</el-input>
|
||||||
|
|
@ -58,7 +58,7 @@
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
<el-table-column label="退款数量" width="170">
|
<el-table-column label="退款数量" width="170">
|
||||||
<template v-slot="scope">
|
<template v-slot="scope">
|
||||||
<el-input-number v-model="scope.row.refund_number" :disabled="refundType == 1" :min="0"
|
<el-input-number v-model="scope.row.refund_number" :disabled="refundType != 2" :min="0"
|
||||||
:max="formatDecimal(scope.row.num - scope.row.refundNum - scope.row.returnNum, 2, true)"
|
:max="formatDecimal(scope.row.num - scope.row.refundNum - scope.row.returnNum, 2, true)"
|
||||||
style="width: 130px;" @change="numberChange">
|
style="width: 130px;" @change="numberChange">
|
||||||
</el-input-number>
|
</el-input-number>
|
||||||
|
|
@ -105,13 +105,20 @@
|
||||||
<div class="item" v-for="(item, index) in remarkTagList" :key="index" @click="addRmarkHandle(item)">
|
<div class="item" v-for="(item, index) in remarkTagList" :key="index" @click="addRmarkHandle(item)">
|
||||||
{{ item }}
|
{{ item }}
|
||||||
</div>
|
</div>
|
||||||
|
<div class="item" @click="remark = ''">
|
||||||
|
<el-icon>
|
||||||
|
<CircleClose />
|
||||||
|
</el-icon>
|
||||||
|
清空
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
<template #footer>
|
<template #footer>
|
||||||
<div class="drawer_footer">
|
<div class="drawer_footer">
|
||||||
<div class="btn">
|
<div class="btn">
|
||||||
<el-button style="width: 100%;" :loading="loading" @click="handleRefund">手动退款</el-button>
|
<el-button type="danger" style="width: 100%;" :loading="loading"
|
||||||
|
@click="handleRefund">手动退款</el-button>
|
||||||
</div>
|
</div>
|
||||||
<div class="btn">
|
<div class="btn">
|
||||||
<el-button type="primary" style="width: 100%;" :loading="loading"
|
<el-button type="primary" style="width: 100%;" :loading="loading"
|
||||||
|
|
@ -128,7 +135,7 @@ import { ref } from 'vue'
|
||||||
import { useGlobal } from '@/store/global.js'
|
import { useGlobal } from '@/store/global.js'
|
||||||
import { formatDecimal, inputFilterFloat } from "@/utils/index.js";
|
import { formatDecimal, inputFilterFloat } from "@/utils/index.js";
|
||||||
import { refundOrder, orderPrint } from '@/api/order.js'
|
import { refundOrder, orderPrint } from '@/api/order.js'
|
||||||
import { ElNotification, ElMessageBox, ElMessage } from 'element-plus'
|
import { ElMessageBox, ElMessage } from 'element-plus'
|
||||||
import { usePrint } from "@/store/print.js";
|
import { usePrint } from "@/store/print.js";
|
||||||
import { useUser } from '@/store/user.js'
|
import { useUser } from '@/store/user.js'
|
||||||
import dayjs from 'dayjs'
|
import dayjs from 'dayjs'
|
||||||
|
|
@ -150,7 +157,8 @@ const remarkTagList = ref([
|
||||||
'等待时间长',
|
'等待时间长',
|
||||||
'支付错误',
|
'支付错误',
|
||||||
'商品不满意',
|
'商品不满意',
|
||||||
'服务态度不满意'
|
'服务态度不满意',
|
||||||
|
'打包费'
|
||||||
])
|
])
|
||||||
const loading = ref(false)
|
const loading = ref(false)
|
||||||
|
|
||||||
|
|
@ -169,30 +177,18 @@ async function refundHandle(cash = false) {
|
||||||
let rows = tableRef.value.getSelectionRows()
|
let rows = tableRef.value.getSelectionRows()
|
||||||
if (refundType.value == 2) {
|
if (refundType.value == 2) {
|
||||||
if (!rows.length) {
|
if (!rows.length) {
|
||||||
ElNotification({
|
ElMessage.error('请选择退款商品')
|
||||||
title: '错误',
|
|
||||||
message: '请选择退款商品',
|
|
||||||
type: 'error',
|
|
||||||
})
|
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!refundAmount.value) {
|
if (!refundAmount.value) {
|
||||||
ElNotification({
|
ElMessage.error('请请输入退款金额')
|
||||||
title: '错误',
|
|
||||||
message: '请请输入退款金额',
|
|
||||||
type: 'error',
|
|
||||||
})
|
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!remark.value) {
|
if (!remark.value) {
|
||||||
ElNotification({
|
ElMessage.error('请请输入退款原因')
|
||||||
title: '错误',
|
|
||||||
message: '请请输入退款原因',
|
|
||||||
type: 'error',
|
|
||||||
})
|
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -208,11 +204,7 @@ async function refundHandle(cash = false) {
|
||||||
}
|
}
|
||||||
|
|
||||||
if (refundAmount.value <= 0) {
|
if (refundAmount.value <= 0) {
|
||||||
ElNotification({
|
ElMessage.error('无可退金额')
|
||||||
title: '错误',
|
|
||||||
message: '无可退金额',
|
|
||||||
type: 'error',
|
|
||||||
})
|
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -227,11 +219,7 @@ async function refundHandle(cash = false) {
|
||||||
|
|
||||||
loading.value = true
|
loading.value = true
|
||||||
await refundOrder(data)
|
await refundOrder(data)
|
||||||
ElNotification({
|
ElMessage.success('退款成功')
|
||||||
title: '提示',
|
|
||||||
message: '退款成功',
|
|
||||||
type: 'success',
|
|
||||||
})
|
|
||||||
await printRefund(rows)
|
await printRefund(rows)
|
||||||
isShow.value = false
|
isShow.value = false
|
||||||
emits('success')
|
emits('success')
|
||||||
|
|
@ -251,7 +239,7 @@ async function printRefund(rows) {
|
||||||
loginAccount: store.userInfo.name,
|
loginAccount: store.userInfo.name,
|
||||||
carts: [],
|
carts: [],
|
||||||
amount: formatDecimal(+refundAmount.value),
|
amount: formatDecimal(+refundAmount.value),
|
||||||
remark: item.value.remark,
|
remark: remark.value,
|
||||||
orderInfo: item.value,
|
orderInfo: item.value,
|
||||||
outNumber: item.value.id,
|
outNumber: item.value.id,
|
||||||
createdAt: item.value.createTime,
|
createdAt: item.value.createTime,
|
||||||
|
|
@ -274,11 +262,7 @@ async function printRefund(rows) {
|
||||||
} else {
|
} else {
|
||||||
// 云打印
|
// 云打印
|
||||||
await orderPrint({ id: item.value.id, type: 2 })
|
await orderPrint({ id: item.value.id, type: 2 })
|
||||||
ElNotification({
|
ElMessage.success('云打印退款单成功')
|
||||||
title: '提示',
|
|
||||||
message: '云打印退款单成功',
|
|
||||||
type: 'success',
|
|
||||||
})
|
|
||||||
}
|
}
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
console.log(error);
|
console.log(error);
|
||||||
|
|
@ -307,7 +291,7 @@ const tabSelectChange = _.debounce(function (val) {
|
||||||
|
|
||||||
// 禁用所有行的选择
|
// 禁用所有行的选择
|
||||||
const selectable = (row, index) => {
|
const selectable = (row, index) => {
|
||||||
return refundType.value != 1;
|
return refundType.value == 2;
|
||||||
};
|
};
|
||||||
|
|
||||||
// 初始化抽屉
|
// 初始化抽屉
|
||||||
|
|
@ -385,6 +369,8 @@ function refundTypeChange(val) {
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case 3:
|
case 3:
|
||||||
|
tableRef.value.clearSelection()
|
||||||
|
refundAmount.value = ''
|
||||||
modify.value = true
|
modify.value = true
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
|
|
@ -466,11 +452,19 @@ defineExpose({
|
||||||
gap: 10px;
|
gap: 10px;
|
||||||
|
|
||||||
.item {
|
.item {
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: center;
|
||||||
|
gap: 10px;
|
||||||
padding: 6px 12px;
|
padding: 6px 12px;
|
||||||
border: 1px solid #ddd;
|
border: 1px solid #ddd;
|
||||||
background-color: #fff;
|
background-color: #fff;
|
||||||
border-radius: 4px;
|
border-radius: 4px;
|
||||||
color: #555;
|
color: #555;
|
||||||
|
|
||||||
|
&:active {
|
||||||
|
background-color: #ddd;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue