From a4188f41f3bc981fe8fa92c253a1195b76be04dd Mon Sep 17 00:00:00 2001 From: Bang Hu <hu_bang@hotmail.com> Date: 星期三, 03 九月 2025 16:45:00 +0800 Subject: [PATCH] 交易确认添加积分扣减功能 --- components.d.ts | 1 src/views/tradeManage/confirm/index.vue | 75 +++++++++++++++++++++++++++++++++++++ src/api/pointsApi.ts | 25 ++++++++++++ 3 files changed, 100 insertions(+), 1 deletions(-) diff --git a/components.d.ts b/components.d.ts index 0bbc0c1..6eada8d 100644 --- a/components.d.ts +++ b/components.d.ts @@ -34,6 +34,7 @@ ElOption: typeof import('element-plus/es')['ElOption'] ElPagination: typeof import('element-plus/es')['ElPagination'] ElRadio: typeof import('element-plus/es')['ElRadio'] + ElRadioButton: typeof import('element-plus/es')['ElRadioButton'] ElRadioGroup: typeof import('element-plus/es')['ElRadioGroup'] ElScrollbar: typeof import('element-plus/es')['ElScrollbar'] ElSelect: typeof import('element-plus/es')['ElSelect'] diff --git a/src/api/pointsApi.ts b/src/api/pointsApi.ts index 6d8ec43..2cc74b2 100644 --- a/src/api/pointsApi.ts +++ b/src/api/pointsApi.ts @@ -89,6 +89,31 @@ method: 'get', }) as ApiPromise }, + + // 鑾峰彇鐢ㄦ埛绉垎浣欓 - 浣跨敤宸插瓨鍦ㄧ殑鎺ュ彛 + getUserPoints(userId: number): ApiPromise { + return createAxios({ + url: `${url}total/user/${userId}`, // 淇敼涓哄疄闄呭瓨鍦ㄧ殑璺緞 + method: 'get', + }) as ApiPromise + }, + + // 浣跨敤涓撻棬鐨勭Н鍒嗘墸鍑忔帴鍙� + deductPointsByFlow(userId: string, unitId: string, points: number, orderId: string, remark?: string, dataCategory?: string): ApiPromise { + return createAxios({ + url: `${url}user/deduct`, // 浣跨敤鏂扮殑涓撻棬绉垎鎵e噺鎺ュ彛 + method: 'post', + data: { + userId, + unitId, + points, // 鐩存帴浼犲叆瑕佹墸鍑忕殑绉垎鏁伴噺 + orderId, + remark: remark || `璁㈠崟${orderId}浜ゆ槗鎵e噺绉垎`, + dataCategory: dataCategory || 'resource_transaction', + dataType: 1 // 1琛ㄧず娑堣�� + }, + }) as ApiPromise + }, } export default pointsApi diff --git a/src/views/tradeManage/confirm/index.vue b/src/views/tradeManage/confirm/index.vue index 9c4a6d7..0a0506b 100644 --- a/src/views/tradeManage/confirm/index.vue +++ b/src/views/tradeManage/confirm/index.vue @@ -237,6 +237,7 @@ import { Document, User, Goods, List } from '@element-plus/icons-vue' import { ElMessage, ElMessageBox } from 'element-plus' import orderApi from '@/api/orderApi' +import pointsApi from '@/api/pointsApi' // 鏂板绉垎API瀵煎叆 import { useUserInfo } from '@/stores/modules/userInfo' import createAxios from '@/utils/axios' @@ -401,6 +402,41 @@ return } + // 妫�鏌ヨ鍗曟槸鍚︽秹鍙婄Н鍒嗘墸鍑� + const hasPointsDeduction = detail.items && detail.items.some((item: any) => Number(item.pricePoint || 0) > 0) + + if (hasPointsDeduction) { + // 璁$畻闇�瑕佹墸鍑忕殑绉垎鎬婚 + const totalPointsToDeduct = detail.items.reduce((sum: number, item: any) => { + return sum + (Number(item.pricePoint || 0) * Number(item.quantity || 0)) + }, 0) + + if (totalPointsToDeduct > 0) { + // 鑾峰彇褰撳墠鐢ㄦ埛绉垎浣欓 + try { + const userPointsRes = await pointsApi.getUserPoints(userId) + if (userPointsRes.code !== 200 || !userPointsRes.data) { + ElMessage.error('鑾峰彇绉垎浣欓澶辫触') + return + } + + const currentPoints = userPointsRes.data.balance || 0 + + if (currentPoints < totalPointsToDeduct) { + ElMessage.error(`绉垎浣欓涓嶈冻锛佸綋鍓嶇Н鍒嗭細${currentPoints.toLocaleString()}锛岄渶瑕佺Н鍒嗭細${totalPointsToDeduct.toLocaleString()}`) + return + } + + // 绉垎浣欓鍏呰冻锛岀户缁墽琛� + console.log(`绉垎浣欓妫�鏌ラ�氳繃锛氬綋鍓�${currentPoints}锛岄渶瑕�${totalPointsToDeduct}`) + } catch (error) { + console.error('鑾峰彇绉垎浣欓澶辫触:', error) + ElMessage.error('鑾峰彇绉垎浣欓澶辫触锛岃閲嶈瘯') + return + } + } + } + // 纭鎿嶄綔 await ElMessageBox.confirm('纭畾瑕佺‘璁や氦鏄擄紵', '纭鎿嶄綔', { confirmButtonText: '纭畾', @@ -408,8 +444,45 @@ type: 'warning' }) - // 鏇存柊璁㈠崟鐘舵�佽繘鍏ヤ笅涓�涓姸鎬� + // 濡傛灉娑夊強绉垎鎵e噺锛屽厛杩涜绉垎鎵e噺鍜屾祦姘磋褰� + if (hasPointsDeduction) { + const totalPointsToDeduct = detail.items.reduce((sum: number, item: any) => { + return sum + (Number(item.pricePoint || 0) * Number(item.quantity || 0)) + }, 0) + + if (totalPointsToDeduct > 0) { + try { + // 鑾峰彇鐢ㄦ埛鍗曚綅ID + const unitId = userStore.getUserInfo?.unitId || userStore.getUserInfo?.unitId || '' + + // 鑾峰彇褰撳墠璁㈣喘鐨勪骇鍝佸悕绉颁綔涓哄娉紙浣跨敤浜у搧鍚嶇О锛屼笉鏄浠跺悕绉帮級 + const productNames = detail.productName || '璁㈠崟浜ゆ槗鎵e噺绉垎' + + // 鍏堟墽琛岀Н鍒嗘墸鍑� + const deductRes: any = await pointsApi.deductPointsByFlow( + userId.toString(), + unitId, + totalPointsToDeduct, + orderId, + productNames || '璁㈠崟浜ゆ槗鎵e噺绉垎', // 浣跨敤浜у搧鍚嶇О浣滀负澶囨敞 + '绉垎浜ゆ槗' // 鏁版嵁绫诲埆 + ) + if (!deductRes || deductRes.code !== 200) { + ElMessage.error(deductRes?.msg || deductRes?.message || '绉垎鎵e噺澶辫触锛屼氦鏄撶‘璁ょ粓姝�') + return + } + console.log(`绉垎鎵e噺鎴愬姛锛�${totalPointsToDeduct}`) + } catch (error) { + console.error('绉垎鎵e噺澶辫触:', error) + ElMessage.error('绉垎鎵e噺澶辫触锛屼氦鏄撶‘璁ょ粓姝�') + return + } + } + } + + // 绉垎鎵e噺鎴愬姛鍚庯紝鏇存柊璁㈠崟鐘舵�佽繘鍏ヤ笅涓�涓姸鎬� await orderApi.updateOrderStatusToNext(orderId) + ElMessage.success('浜ゆ槗纭鎴愬姛') router.back() } catch (error) { -- Gitblit v1.8.0