From bd59f05d264045a9e40f0964797e30763fcb7183 Mon Sep 17 00:00:00 2001 From: YeMingfei666 <1619116647@qq.com> Date: Tue, 4 Mar 2025 10:34:19 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E4=BB=A3=E5=AE=A2=E4=B8=8B=E5=8D=95?= =?UTF-8?q?=E6=9B=B4=E6=96=B0=EF=BC=8C=E4=BF=AE=E5=A4=8D=E5=BA=97=E9=93=BA?= =?UTF-8?q?=E5=88=97=E8=A1=A8=E7=BC=96=E8=BE=91=E5=B1=95=E7=A4=BA=E9=97=AE?= =?UTF-8?q?=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/api/account/points.ts | 32 ++ src/api/account/shopUser.ts | 20 +- src/api/order/pay.ts | 26 +- src/store/index.ts | 1 + src/store/modules/carts.ts | 113 +++++-- src/store/modules/permission.ts | 4 + src/store/modules/user.ts | 4 + src/utils/websocket.ts | 1 - src/views/login/index.vue | 4 +- src/views/order/index/config/content.ts | 2 + src/views/order/index/index.vue | 13 + src/views/shop/list/components/addShop.vue | 4 +- .../tool/Instead/components/carts/item.vue | 39 ++- .../tool/Instead/components/carts/list.vue | 59 ++-- .../tool/Instead/components/discount.vue | 215 +++++++------ src/views/tool/Instead/components/order.vue | 282 ++++++++++++------ .../tool/Instead/components/popup-coupon.vue | 273 +++++++++++++++++ .../tool/Instead/components/scan-pay.vue | 62 ++-- src/views/tool/Instead/index.vue | 111 ++++--- 19 files changed, 953 insertions(+), 312 deletions(-) create mode 100644 src/api/account/points.ts create mode 100644 src/views/tool/Instead/components/popup-coupon.vue diff --git a/src/api/account/points.ts b/src/api/account/points.ts new file mode 100644 index 0000000..7cc66e0 --- /dev/null +++ b/src/api/account/points.ts @@ -0,0 +1,32 @@ +import request from "@/utils/request"; +import { Account_BaseUrl } from "@/api/config"; +const baseURL = Account_BaseUrl + "/admin/points"; +const Api = { + // 002-获取订单可用积分及抵扣金额(支付页面使用) + + calcOrderUsablePoints(params: any) { + return request({ + url: `${baseURL}/member-points/calc-usable-points`, + method: "get", + params + }); + }, + // 004-根据抵扣金额计算所需积分 + calcMoneyUsablePoints(params: any) { + return request({ + url: `${baseURL}/member-points/calc-used-points`, + method: "get", + params + }); + }, + // 003-根据积分计算可抵扣金额 + calcPointsToMoney(params: any) { + return request({ + url: `${baseURL}/member-points/calc-deduction-amount`, + method: "get", + params + }); + }, +}; + +export default Api; diff --git a/src/api/account/shopUser.ts b/src/api/account/shopUser.ts index 4831704..820ac58 100644 --- a/src/api/account/shopUser.ts +++ b/src/api/account/shopUser.ts @@ -47,10 +47,28 @@ const API = { shopId: shopId } }); + }, + // 获取店铺用户详情 + get(params: getRequest) { + return request({ + url: `${baseURL}/detail`, + method: "get", + params + }); } } export default API; - +export interface getRequest { + /** + * 会员用户id 对应shopUserId + */ + id?: number; + /** + * 用户id 不传递id则按照userId和当前shopId查询 对应userId + */ + userId?: string; + [property: string]: any; +} export interface getSummaryRequest { /** * 0 非vip 1 vip diff --git a/src/api/order/pay.ts b/src/api/order/pay.ts index 660effb..38fa0d9 100644 --- a/src/api/order/pay.ts +++ b/src/api/order/pay.ts @@ -19,6 +19,22 @@ const Api = { data }); }, + //正扫 + scanPay(data: any) { + return request({ + url: `${baseURL}/scanPay`, + method: "post", + data + }); + }, + //会员支付 + vipPay(data: any) { + return request({ + url: `${baseURL}/vipPay`, + method: "post", + data + }); + }, //现金支付 cashPay(data: any) { return request({ @@ -26,7 +42,15 @@ const Api = { method: "post", data }); - } + }, + // 获取店铺订单支付URL + orderPayUrl(params: any) { + return request({ + url: `${baseURL}/shopPayApi/orderPayUrl`, + method: "get", + params + }); + }, }; diff --git a/src/store/index.ts b/src/store/index.ts index 6c0115a..a36e43d 100644 --- a/src/store/index.ts +++ b/src/store/index.ts @@ -14,4 +14,5 @@ export * from "./modules/settings"; export * from "./modules/tags-view"; export * from "./modules/user"; export * from "./modules/dict"; + export { store }; diff --git a/src/store/modules/carts.ts b/src/store/modules/carts.ts index 120aea5..54f9731 100644 --- a/src/store/modules/carts.ts +++ b/src/store/modules/carts.ts @@ -1,9 +1,9 @@ import { store } from "@/store"; import WebSocketManager, { type ApifoxModel, msgType } from "@/utils/websocket"; import orderApi from "@/api/order/order"; -import { useUserStore } from "@/store/modules/user"; +import { useUserStoreHook } from "@/store/modules/user"; -const shopUser = useUserStore(); +const shopUser = useUserStoreHook(); export interface CartsState { id: string | number; [property: string]: any; @@ -78,6 +78,12 @@ export const useCartsStore = defineStore("carts", () => { }) //赠菜总价 const giftMoney = computed(() => { + let oldGiftMoney = 0 + for (let i in oldOrder.value.detailMap) { + oldGiftMoney += oldOrder.value.detailMap[i].reduce((prve: number, cur: any) => { + return prve + cur.number * cur.salePrice + }, 0) + } return giftList.value.reduce((acc: number, cur: any) => { return acc + cur.number * cur.salePrice }, 0) @@ -90,7 +96,13 @@ export const useCartsStore = defineStore("carts", () => { const giftNumber = giftList.value.reduce((acc: number, cur: any) => { return acc + cur.pack_number * 1 }, 0) - return nowCartNumber + giftNumber + let oldNumber = 0 + for (let i in oldOrder.value.detailMap) { + oldNumber += oldOrder.value.detailMap[i].reduce((prve: number, cur: any) => { + return prve + cur.pack_number + }, 0) + } + return nowCartNumber + giftNumber + oldNumber }) //打包费 const packFee = computed(() => { @@ -100,27 +112,73 @@ export const useCartsStore = defineStore("carts", () => { const giftPackFee = giftList.value.reduce((acc: number, cur: any) => { return acc + (cur.packFee || 0) * cur.pack_number }, 0) - return nowPackFee + giftPackFee + let oldPackfee = 0; + for (let i in oldOrder.value.detailMap) { + oldPackfee += oldOrder.value.detailMap[i].reduce((prve: number, cur: any) => { + return prve + (cur.packFee || 0) * cur.pack_number + }, 0) + } + return nowPackFee + giftPackFee + oldPackfee + }) + //会员优惠 + const vipDiscount = computed(() => { + if (!useVipPrice.value) { + return 0 + } + const listTotal = list.value.reduce((acc: number, cur: any) => { + const n = (cur.salePrice * 1 - cur.memberPrice * 1) * cur.number + return acc + (n <= 0 ? 0 : n) + }, 0) + + return listTotal + }) + //单品改价优惠 + const singleDiscount = computed(() => { + const listTotal = list.value.reduce((acc: number, cur: any) => { + if (cur.discount_sale_amount * 1 <= 0) { + return acc + 0 + } + const originPrice = useVipPrice.value ? (cur.memberPrice || cur.salePrice) : cur.salePrice + const n = (originPrice * 1 - cur.discount_sale_amount * 1) * cur.number + return acc + (n <= 0 ? 0 : n) + }, 0) + return listTotal }) // 优惠 const yiyouhui = computed(() => { - const youhui = giftMoney.value + const youhui = giftMoney.value * 1 + vipDiscount.value * 1 + singleDiscount.value * 1 if (youhui > 0) { return '已优惠¥' + youhui.toFixed(2) } return '' }) + //历史订单价格 + const oldOrderMoney = computed(() => { + let total = 0 + for (let i in oldOrder.value.detailMap) { + console.log(oldOrder.value) + total += oldOrder.value.detailMap[i].reduce((prve: number, cur: any) => { + const discount_sale_amount = cur.discount_sale_amount * 1 || 0 + const memberPrice = cur.skuData ? (cur.skuData.memberPrice || cur.skuData.salePrice) : 0 + const price = (discount_sale_amount || cur.salePrice || 0) + return prve + cur.number * (discount_sale_amount || (useVipPrice.value ? memberPrice : price)) + }, 0) + } + return total + }) + //支付总价 const payMoney = computed(() => { const money = list.value.reduce((acc: number, cur: any) => { + const discount_sale_amount = cur.discount_sale_amount * 1 || 0 const memberPrice = cur.skuData ? (cur.skuData.memberPrice || cur.skuData.salePrice) : 0 const price = (cur.discount_sale_amount * 1 || cur.salePrice || 0) - return acc + cur.number * (useVipPrice.value ? memberPrice : price) + return acc + cur.number * (discount_sale_amount || (useVipPrice.value ? memberPrice : price)) }, 0) - return (money + packFee.value).toFixed(2) + return (money + packFee.value + oldOrderMoney.value * 1).toFixed(2) }) //总计数量 const totalNumber = computed(() => { @@ -130,7 +188,14 @@ export const useCartsStore = defineStore("carts", () => { const giftNumber = list.value.reduce((acc: number, cur: any) => { return acc + cur.number * 1 }, 0) - return cartNumber + giftNumber + let oldNumber = 0 + + for (let i in oldOrder.value.detailMap) { + oldNumber += oldOrder.value.detailMap[i].reduce((prve: number, cur: any) => { + return prve + cur.number * 1 + }, 0) + } + return cartNumber + giftNumber + oldNumber }) @@ -238,6 +303,10 @@ export const useCartsStore = defineStore("carts", () => { if (cart.number * 1 < cart.skuData.suitNum * 1) { return sendMessage('del', cart); } + console.log(key, val) + if (key == 'discount_sale_amount' && val * 1 <= 0) { + return ElMessage.error('价格不能为0!') + } sendMessage('edit', { ...cart, [key]: val }); } @@ -245,13 +314,12 @@ export const useCartsStore = defineStore("carts", () => { sendMessage('cleanup', {}); } function dataReset() { - list.value = []; - giftList.value = []; - selListIndex.value = -1 + selListIndex.value = -1; selPlaceNum.value = 1 isOldOrder.value = false - selListIndex.value = -1; isSelGift.value = false + list.value = []; + giftList.value = []; } // 寻找套餐商品sku @@ -304,14 +372,15 @@ export const useCartsStore = defineStore("carts", () => { const newData: { [key: string]: any } = {} for (let i in data) { newData[i] = data[i].map((v: any) => { - const skuData = getProductDetails({ product_id: v.productId, sku_id: v.skuId }) - + console.log(v) return { ...skuData, placeNum: v.placeNum, number: v.num, - id: v.id + id: v.id, + pack_number: v.packNumber, + discount_sale_amount: v.discountSaleAmount * 1 || 0 } }) } @@ -332,7 +401,7 @@ export const useCartsStore = defineStore("carts", () => { ...$oldOrder, detailMap: returnDetailMap($oldOrder.detailMap) } - console.log('initParams', initParams) + console.log('oldOrder.detailMap', oldOrder.value.detailMap) table_code.value = initParams && initParams.table_code ? initParams.table_code : ''; @@ -454,13 +523,7 @@ export const useCartsStore = defineStore("carts", () => { } } if (msg.operate_type === "manage_cleanup") { - list.value = [] - giftList.value = [] - oldOrder.value = { - detailMap: [], - originAmount: 0 - } - table_code.value = '' + dataReset() } console.log(list.value) }); @@ -478,6 +541,8 @@ export const useCartsStore = defineStore("carts", () => { WebSocketManager.sendMessage(msg); } return { + singleDiscount, + vipDiscount, dataReset, useVipPrice, changeUser, @@ -503,6 +568,6 @@ export const useCartsStore = defineStore("carts", () => { }; }); -export function useDictStoreHook() { +export function useCartsStoreHook() { return useCartsStore(store); } diff --git a/src/store/modules/permission.ts b/src/store/modules/permission.ts index 548e0ec..d3a9d6e 100644 --- a/src/store/modules/permission.ts +++ b/src/store/modules/permission.ts @@ -25,6 +25,10 @@ export const usePermissionStore = defineStore("permission", () => { */ function generateRoutes() { return new Promise((resolve, reject) => { + if (isTest) { + isRoutesLoaded.value = true; + resolve(constantRoutes); + } MenuAPI.getRoutes() .then((data) => { if (!isTest) { diff --git a/src/store/modules/user.ts b/src/store/modules/user.ts index d3889da..7f3d75a 100644 --- a/src/store/modules/user.ts +++ b/src/store/modules/user.ts @@ -9,6 +9,8 @@ import UserAPI, { type UserInfo } from "@/api/system/user"; import { setToken, setRefreshToken, getRefreshToken, clearToken } from "@/utils/auth"; export const useUserStore = defineStore("user", () => { + // const isShopAdmin = ref(false) // 0商户 1员工 + const isShopAdmin = useStorage("isShopAdmin", false) // 0商户 1员工 const userInfo = useStorage("userInfo", {} as UserInfo); const promissionList = useStorage("promissionList", [] as string[]); @@ -26,6 +28,7 @@ export const useUserStore = defineStore("user", () => { return new Promise((resolve, reject) => { AuthAPI.login(loginRequest) .then((data) => { + isShopAdmin.value = data.loginType == 0 ? true : false; Object.assign(userInfo.value, { ...data.shopInfo, shopId: data.shopInfo.id }); promissionList.value = data.promissionList; const token = data.tokenInfo.tokenValue; @@ -115,6 +118,7 @@ export const useUserStore = defineStore("user", () => { } return { + isShopAdmin, userInfo, promissionList, getUserInfo, diff --git a/src/utils/websocket.ts b/src/utils/websocket.ts index a4997e6..76f222f 100644 --- a/src/utils/websocket.ts +++ b/src/utils/websocket.ts @@ -74,7 +74,6 @@ class WebSocketManager { }; this.client.onerror = (error) => { console.error("WebSocket 发生错误:", error); - // ElNotification({ // title: "提示", // message: "WebSocket 发生错误", diff --git a/src/views/login/index.vue b/src/views/login/index.vue index 6f33240..fba2194 100644 --- a/src/views/login/index.vue +++ b/src/views/login/index.vue @@ -92,8 +92,8 @@ const state = reactive({ codeUrl: "", cookiePass: "", loginForm: { - username: "admin", - password: "12345", + username: "ymf", + password: "123456", // rememberMe: false, code: "", uuid: "", diff --git a/src/views/order/index/config/content.ts b/src/views/order/index/config/content.ts index 8ef81cb..4d68383 100644 --- a/src/views/order/index/config/content.ts +++ b/src/views/order/index/config/content.ts @@ -58,6 +58,8 @@ const contentConfig: IContentConfig = { label: "订单原金额 不含折扣价格", align: "center", prop: "originAmount", + templet: 'custom', + slotName: 'originAmount', width: 120, hidden: true, }, diff --git a/src/views/order/index/index.vue b/src/views/order/index/index.vue index a012b49..b6cf4b6 100644 --- a/src/views/order/index/index.vue +++ b/src/views/order/index/index.vue @@ -20,6 +20,9 @@ @operat-click="handleOperatClick" @filter-change="handleFilterChange" > + -