diff --git a/src/api/account/table.ts b/src/api/account/table.ts index 7e3b3ca..58d620c 100644 --- a/src/api/account/table.ts +++ b/src/api/account/table.ts @@ -3,11 +3,10 @@ import { Account_BaseUrl } from "@/api/config"; const baseURL = Account_BaseUrl + "/admin/shopTable"; const API = { // 批量生成桌码 - fasetAdd(num: number) { + downloadTableCode(num: number) { return request({ - url: `${baseURL}/code`, + url: `${baseURL}/code?num=` + num, method: "post", - data: { num }, }); }, getList(data: getListRequest) { @@ -17,6 +16,14 @@ const API = { params: data }); }, + // 获取台桌详情 + get(id: string | number) { + return request({ + url: `${baseURL}/detail`, + method: "get", + params: { id } + }); + }, edit(data: editRequest) { return request({ url: `${baseURL}`, diff --git a/src/api/order/order.ts b/src/api/order/order.ts index def0a27..91db4b8 100644 --- a/src/api/order/order.ts +++ b/src/api/order/order.ts @@ -2,11 +2,11 @@ import request from "@/utils/request"; import { Order_BaseUrl } from "@/api/config"; const baseURL = Order_BaseUrl + "/admin/order"; const OrderApi = { - getList(params: getListRequest) { + getList(data: getListRequest) { return request({ url: `${baseURL}`, - method: "get", - params: params, + method: "post", + data }); }, add(data: addRequest) { @@ -16,11 +16,76 @@ const OrderApi = { data }); }, + // 历史订单(多次下单使用) + getHistoryList(params: getHistoryListRequest) { + return request({ + url: `${baseURL}/historyOrder`, + method: "get", + params: params, + }); + }, + // 订单全额退款 只传订单id + refundOrder(data: refundOrderRequest) { + return request({ + url: `${baseURL}/refundOrder`, + method: "post", + params: data, + }); + }, + edit() { }, delete() { }, }; export default OrderApi; + +export interface refundOrderRequest { + /** + * 现金退款,是否 + */ + cash?: boolean; + /** + * 自定义退款金额,退款金额 默认为 退单数量*单价 的和 + * 整单退款 为订单orderAmount + * 如果自定义退款金额 则金额不进行校验 直接退款 + */ + modify?: boolean; + orderId: number; + /** + * 退单总金额 + */ + refundAmount: number; + /** + * 退单明细 + * id: orderDetailId + * num: 退单数量 + * returnAmount: 退单金额 + */ + refundDetails?: RefundDetail[]; + refundReason?: string; + [property: string]: any; +} + +/** +* 订单详情 实体类。 +*/ +export interface RefundDetail { + id?: number; + /** + * 退单数量 + */ + num?: number; + /** + * 退单金额 + */ + returnAmount?: number; + [property: string]: any; +} +export interface getHistoryListRequest { + orderId?: number; + [property: string]: any; +} + // 订单状态 export type statusType = | "unpaid" diff --git a/src/store/modules/carts.ts b/src/store/modules/carts.ts index d756524..a7be29c 100644 --- a/src/store/modules/carts.ts +++ b/src/store/modules/carts.ts @@ -27,12 +27,24 @@ export const useCartsStore = defineStore("carts", () => { const isEmpty = computed(() => { return list.value.length === 0 && giftList.value.length === 0 }) + //当前购物车选中数据 const selCart = computed(() => { if (isSelGift.value) { return giftList.value[selListIndex.value] || defaultCart } return list.value[selListIndex.value] || defaultCart }) + //当前购物车选中对应商品数据 + const selGoods = computed(() => { + return goodsMap[selCart.value.product_id] + }) + //当前选中购物车数据是否是可选套餐商品 + const isCanSelectGroup = computed(() => { + if (!selGoods.value) { + return false + } + return selGoods.value.type == 'package' && selGoods.value.groupType == 1 + }) //赠菜总价 const giftMoney = computed(() => { return giftList.value.reduce((acc: number, cur: any) => { @@ -96,18 +108,30 @@ export const useCartsStore = defineStore("carts", () => { } } + const basic_msg = { + number: 1, + is_pack: 0, + is_gift: 0, + is_temporary: 0, + discount_sale_amount: 0, + discount_sale_note: "", + is_print: 0, + is_wait_call: 0, + product_name: "", + remark: "", + sku_id: '', + } + //当前购物车直接添加 + function cartsPush(data: any) { + sendMessage('add', { + ...basic_msg, + ...data + }); + } + function add(data: any) { const msg = { - number: 1, - is_pack: 0, - is_gift: 0, - is_temporary: 0, - discount_sale_amount: 0, - discount_sale_note: "", - is_print: 0, - is_wait_call: 0, - product_name: "", - remark: "", + ...basic_msg, ...data } const hasCart = list.value.find((cartItem) => { @@ -116,10 +140,21 @@ export const useCartsStore = defineStore("carts", () => { if (hasCart) { update({ ...hasCart, ...msg, number: hasCart.number * 1 + msg.number * 1 }) } else { + console.log(msg); sendMessage('add', msg); } } + // 换桌 + function changeTable(newVal: string | number) { + if (table_code.value) { + sendMessage('rottable', { + new_table_code: newVal, + id: list.value[0].id + }); + } + } + function del(data: any) { sendMessage('del', data); } @@ -183,27 +218,40 @@ export const useCartsStore = defineStore("carts", () => { return ElMessage.error(msg.message || '操作失败') } if (msg && msg.data) { - const tableCode = Array.isArray(msg.data) ? msg.data[0].table_code : msg.data.table_code - table_code.value = table_code.value ? table_code.value : tableCode - console.log(table_code.value) + if (Array.isArray(msg.data) && msg.data.length) { + table_code.value = msg.data[0].table_code + } + if (msg.data.table_code) { + table_code.value = table_code.value ? table_code.value : msg.data.table_code + } } // 初始化 if (msg.operate_type === "manage_init") { // 设置单价 - list.value = msg.data.filter((v: { is_gift: any; }) => !v.is_gift).map((v: Record) => { + list.value = msg.data.filter((v: Record) => { const skuData = getProductDetails({ product_id: v.product_id, sku_id: v.sku_id }) - return { - ...skuData, - ...v, + if (skuData) { + (Object.keys(skuData) as (keyof typeof skuData)[]).forEach((key) => { + v[key] = skuData[key]; + }); + } else { + del({ id: v.id }) + return false } - }); - giftList.value = msg.data.filter((v: { is_gift: any; }) => v.is_gift).map((v: Record) => { + return !v.is_gift + }) + giftList.value = msg.data.filter((v: Record) => { const skuData = getProductDetails({ product_id: v.product_id, sku_id: v.sku_id }) - return { - ...skuData, - ...v, + if (skuData) { + (Object.keys(skuData) as (keyof typeof skuData)[]).forEach((key) => { + v[key] = skuData[key]; + }); + } else { + del({ id: v.id }) + return false } - }); + return v.is_gift + }) console.log(giftList.value) } //广播 @@ -211,6 +259,9 @@ export const useCartsStore = defineStore("carts", () => { msg.operate_type = 'manage_' + msg.operate_type } if (msg.operate_type === "manage_add") { + if (list.value.find(v => v.id == msg.data.id)) { + return ElMessage.warning(msg.message || '该商品已存在') + } const skuData = getProductDetails({ product_id: msg.data.product_id, sku_id: msg.data.sku_id }) list.value.push({ ...skuData, ...msg.data }) return ElMessage.success(msg.message || '添加成功') @@ -283,6 +334,9 @@ export const useCartsStore = defineStore("carts", () => { WebSocketManager.sendMessage(msg); } return { + isCanSelectGroup, + selGoods, + cartsPush, table_code, updateTag, list, @@ -293,7 +347,8 @@ export const useCartsStore = defineStore("carts", () => { changeNumber, isEmpty, selCart, totalNumber, changeSelCart, payMoney, - clear, yiyouhui, giftList + clear, yiyouhui, giftList, + changeTable }; }); diff --git a/src/utils/index.ts b/src/utils/index.ts index 67fce78..244d644 100644 --- a/src/utils/index.ts +++ b/src/utils/index.ts @@ -56,3 +56,63 @@ export function formatGrowthRate(growthRate: number) { .replace(/\.?0+$/, ""); return formattedRate + "%"; } +/** + * Parse the time to string + * @param {(Object|string|number)} time + * @param {string} cFormat + * @returns {string} + */ +export function parseTime(time: string | number | Date | null, cFormat: string | undefined) { + if (arguments.length === 0) { + return null; + } + const format = cFormat || "{y}-{m}-{d} {h}:{i}:{s}"; + let date; + if (typeof time === "undefined" || time === null || time === "null") { + return ""; + } else if (typeof time === "object") { + date = time; + } else { + if (typeof time === "string" && /^[0-9]+$/.test(time)) { + time = parseInt(time); + } + if (typeof time === "number" && time.toString().length === 10) { + time = time * 1000; + } + date = new Date(time); + } + const formatObj = { + y: date.getFullYear(), + m: date.getMonth() + 1, + d: date.getDate(), + h: date.getHours(), + i: date.getMinutes(), + s: date.getSeconds(), + a: date.getDay() + }; + const time_str = format.replace(/{(y|m|d|h|i|s|a)+}/g, (result, key: keyof typeof formatObj): string => { + let value = formatObj[key]; + // Note: getDay() returns 0 on Sunday + if (key === "a") { + return ["日", "一", "二", "三", "四", "五", "六"][value]; + } + if (result.length > 0 && value < 10) { + value = Number("0" + value.toString()); + } + return value.toString() || "0"; + }); + return time_str; +} + +// 下载文件 +export function downloadFile(obj: BlobPart, name: string, suffix: string) { + const url = window.URL.createObjectURL(new Blob([obj])); + const link = document.createElement("a"); + link.style.display = "none"; + link.href = url; + const fileName = parseTime(new Date(), undefined) + "-" + name + "." + suffix; + link.setAttribute("download", fileName); + document.body.appendChild(link); + link.click(); + document.body.removeChild(link); +} \ No newline at end of file diff --git a/src/utils/websocket.ts b/src/utils/websocket.ts index 97a9ba9..7609822 100644 --- a/src/utils/websocket.ts +++ b/src/utils/websocket.ts @@ -20,7 +20,7 @@ export interface ApifoxModel { type: string; [property: string]: any; } -export type msgType = 'add' | 'reduce' | 'remove' | 'edit' | 'init' | 'cleanup' | 'del' +export type msgType = 'add' | 'reduce' | 'remove' | 'edit' | 'init' | 'cleanup' | 'del' | 'rottable' class WebSocketManager { private client: WebSocket | null = null; private connected: boolean = false; diff --git a/src/views/shop/config/components/safe.vue b/src/views/shop/config/components/safe.vue index d14ad67..61297d6 100644 --- a/src/views/shop/config/components/safe.vue +++ b/src/views/shop/config/components/safe.vue @@ -13,7 +13,7 @@ 重置 - {{ form.phone | phoneFilter }} + {{ phoneFilter(form.phone) }} ¥{{ carts.payMoney }} -
- 微信/支付宝 - 现金 - 更多支付 +
+ 微信/支付宝 + 现金 + 更多支付 +
+
+ 仅下单 + 去结账
@@ -47,6 +51,8 @@ import cartsItem from "./item.vue"; import { useCartsStore } from "@/store/modules/carts"; +let isXianFuKuan = ref(true); + const props = defineProps({ goodsList: { type: Array, diff --git a/src/views/tool/Instead/components/control.vue b/src/views/tool/Instead/components/control.vue index e1a4c16..0cc9475 100644 --- a/src/views/tool/Instead/components/control.vue +++ b/src/views/tool/Instead/components/control.vue @@ -1,18 +1,18 @@ \ No newline at end of file diff --git a/src/views/tool/table/index.vue b/src/views/tool/table/index.vue index f1c28a6..9f72151 100644 --- a/src/views/tool/table/index.vue +++ b/src/views/tool/table/index.vue @@ -27,7 +27,9 @@
添加区域 添加台桌 - 下载桌台码 + + 下载桌台码 + 下载店铺码
@@ -218,6 +220,8 @@ + + @@ -228,6 +232,13 @@ import shopAreaApi from "@/api/account/shopArea"; import tableApi from "@/api/account/table"; import addEara from "./components/addEara.vue"; import addTable from "./components/addTable.vue"; +import downloadTableCode from "./components/downloadTableCode.vue"; + +//桌台二维码 +const refDownloadTableCode = ref(); +function showDownloadTableCode() { + refDownloadTableCode.value.show(); +} let loading = ref(false); //工具方法