From b52bec54f02f5b894d5dde30f8f05b76c71771ba Mon Sep 17 00:00:00 2001 From: wupengfei <834520024@qq.com> Date: 星期五, 12 九月 2025 15:48:18 +0800 Subject: [PATCH] feat: 支付宝充值 --- src/utils/storage/auth.ts | 13 +++ src/views/ServiceChargeManage/components/RechargeEnterpriseWalletDialog.vue | 109 +++++++++++++++++++++++++++ src/hooks/useUser.ts | 3 src/store/modules/user.ts | 26 ++++++ src/views/ServiceChargeManage/ServiceChargeManage.vue | 50 ++++++++++++ src/views/ServiceChargeManage/components/AlipayWalletRecharge.vue | 24 ++++++ 6 files changed, 223 insertions(+), 2 deletions(-) diff --git a/src/hooks/useUser.ts b/src/hooks/useUser.ts index 49688e7..5587aef 100644 --- a/src/hooks/useUser.ts +++ b/src/hooks/useUser.ts @@ -5,10 +5,11 @@ export function useUser() { const userStore = useUserStore(); - const { userId, userInfo } = storeToRefs(userStore); + const { userId, userInfo, userDetail } = storeToRefs(userStore); return { user: userInfo, userId: userId, + userDetail: userDetail, }; } diff --git a/src/store/modules/user.ts b/src/store/modules/user.ts index 6315021..271d314 100644 --- a/src/store/modules/user.ts +++ b/src/store/modules/user.ts @@ -8,6 +8,9 @@ setUserInfo, getUserInfo, md5Encrypt, + getUserDetail, + setUserDetail, + removeUserDetail, } from '@/utils'; import { resetRouter, router } from '@/router'; import { useTagsViewStoreHook } from './tagsView'; @@ -20,15 +23,18 @@ export interface UserState { token: string; userInfo: API.LoginCommandCallback; + userDetail?: Nullable<API.GetEnterpriseLoginInfoQueryResult>; } function getDefaultState() { const accessToken = getToken(); const userInfo = getUserInfo(); + const userDetail = getUserDetail(); return { token: accessToken, userInfo: userInfo || {}, + userDetail: userDetail, } as UserState; } @@ -57,6 +63,11 @@ setUserInfo(userInfo); }, + setUserDetail(detail: API.GetEnterpriseLoginInfoQueryResult) { + this.userDetail = detail; + setUserDetail(detail); + }, + // 鐢ㄦ埛鐧诲叆 async loginByUsername(params: API.PasswordLoginCommand) { let res = await authServices.passwordLogin( @@ -74,7 +85,21 @@ if (res) { this.setToken(res.accessToken); this.setUserInfo(res); + this.getCurrentUserInfo(); } + }, + + async getCurrentUserInfo() { + try { + let res = await authServices.getEnterpriseLoginInfo({}, { showLoading: false }); + if (res) { + // res.frontStatus = getUserCertificationFrontStatusAdapter( + // res.userCertificationStatus, + // res.userCertificationAuditStatus + // ); + this.setUserDetail(res); + } + } catch (error) {} }, // 鐧诲嚭 娓呯┖缂撳瓨 @@ -82,6 +107,7 @@ return new Promise(async (resolve) => { removeToken(); removeUserInfo(); + removeUserDetail(); this.resetState(); resetRouter(); myClient.removeQueries(); diff --git a/src/utils/storage/auth.ts b/src/utils/storage/auth.ts index 2ba1a31..7dac977 100644 --- a/src/utils/storage/auth.ts +++ b/src/utils/storage/auth.ts @@ -4,6 +4,7 @@ TOKEN_KEY: 'TOKEN__', REFRESH_TOKEN_KEY: 'REFRESH__TOKEN__', USER_INFO_KEY: 'USER__INFO__', + USER_DETAIL_KEY: 'USER_DETAIL_KEY', }; export function getToken() { @@ -41,3 +42,15 @@ export function removeUserInfo() { return storageLocal.removeItem(StorageKey.USER_INFO_KEY); } + +export function getUserDetail() { + return storageLocal.getItem<API.GetEnterpriseLoginInfoQueryResult>(StorageKey.USER_DETAIL_KEY); +} + +export function setUserDetail(userDetail: API.GetEnterpriseLoginInfoQueryResult) { + return storageLocal.setItem(StorageKey.USER_DETAIL_KEY, userDetail); +} + +export function removeUserDetail() { + return storageLocal.removeItem(StorageKey.USER_DETAIL_KEY); +} diff --git a/src/views/ServiceChargeManage/ServiceChargeManage.vue b/src/views/ServiceChargeManage/ServiceChargeManage.vue index 8cbbe76..6888c19 100644 --- a/src/views/ServiceChargeManage/ServiceChargeManage.vue +++ b/src/views/ServiceChargeManage/ServiceChargeManage.vue @@ -89,6 +89,8 @@ </AppContainer> <UploadStatementDialog v-bind="dialogProps" /> <SettleDetailDialog v-bind="dialogSettleProps" /> + <RechargeEnterpriseWalletDialog v-bind="dialogRechargeProps" /> + <AlipayWalletRecharge v-bind="dialogAlipayWalletProps" /> </LoadingLayout> </template> @@ -117,9 +119,12 @@ } from '@/constants'; import { downloadFileByUrl, setOssFileName } from '@/utils'; import * as taskServices from '@/services/api/task'; +import * as enterpriseWalletServices from '@/services/api/enterpriseWallet'; import { ModelValueType } from 'element-plus'; import UploadStatementDialog from './components/UploadStatementDialog.vue'; import SettleDetailDialog from './components/SettleDetailDialog.vue'; +import RechargeEnterpriseWalletDialog from './components/RechargeEnterpriseWalletDialog.vue'; +import AlipayWalletRecharge from './components/AlipayWalletRecharge.vue'; import { Message } from '@bole-core/core'; defineOptions({ @@ -207,6 +212,8 @@ ]); const router = useRouter(); + +const { userDetail } = useUser(); const eventContext = useGlobalEventContext(); @@ -311,11 +318,52 @@ let params: API.SureTaskSettlementCommand = { taskInfoId: settleEditForm.id, }; - let res = await taskServices.sureTaskSettlement(params); + let res = await taskServices.sureTaskSettlement(params, { + skipErrorHandler: true, + }); if (res) { Message.successMessage('鎿嶄綔鎴愬姛'); getList(paginationState.pageIndex); } + } catch (error) { + if (error?.info?.errorCode == 's510') { + handleRechargeAdd(); + } + } +} + +const { + dialogProps: dialogRechargeProps, + handleAdd: handleRechargeAdd, + editForm: rechargeEditForm, +} = useFormDialog({ + onConfirm: rechargeEnterpriseWallet, + defaultFormParams: { + amount: null as number, + remark: '', + }, +}); + +const { dialogProps: dialogAlipayWalletProps, handleAdd: handleAlipayWalletAdd } = useFormDialog({ + onConfirm: rechargeEnterpriseWallet, + defaultFormParams: { + alipayUrl: '', + }, +}); + +async function rechargeEnterpriseWallet() { + try { + let params: API.RechargeEnterpriseWalletCommand = { + access: EnumEnterpriseWalletAccess.Alipay, + amount: rechargeEditForm.amount, + remark: rechargeEditForm.remark, + }; + let res = await enterpriseWalletServices.rechargeEnterpriseWallet(params); + if (res) { + handleAlipayWalletAdd({ + alipayUrl: res.payUrl, + }); + } } catch (error) {} } diff --git a/src/views/ServiceChargeManage/components/AlipayWalletRecharge.vue b/src/views/ServiceChargeManage/components/AlipayWalletRecharge.vue new file mode 100644 index 0000000..66a0078 --- /dev/null +++ b/src/views/ServiceChargeManage/components/AlipayWalletRecharge.vue @@ -0,0 +1,24 @@ +<template> + <ProDialog title="鏀粯瀹濆厖鍊�" v-model="visible" destroy-on-close draggable> + <iframe v-if="form.alipayUrl" width="100%" height="600px" :src="form.alipayUrl"></iframe> + </ProDialog> +</template> + +<script setup lang="ts"> +import { ProDialog } from '@bole-core/components'; + +defineOptions({ + name: 'AlipayWalletRecharge', +}); + +type Form = { + alipayUrl: string; +}; + +const form = defineModel<Form>('form'); +const visible = defineModel({ type: Boolean }); +</script> + +<style lang="scss" scoped> +@use '@/style/common.scss' as *; +</style> diff --git a/src/views/ServiceChargeManage/components/RechargeEnterpriseWalletDialog.vue b/src/views/ServiceChargeManage/components/RechargeEnterpriseWalletDialog.vue new file mode 100644 index 0000000..cbb1cd7 --- /dev/null +++ b/src/views/ServiceChargeManage/components/RechargeEnterpriseWalletDialog.vue @@ -0,0 +1,109 @@ +<template> + <ProDialog + title="閽卞寘鍏呭��" + v-model="visible" + @close="onDialogClose" + destroy-on-close + draggable + :width="700" + > + <ProForm :model="form" ref="dialogForm" label-width="120px"> + <ProFormItemV2 + label="鍏呭�奸噾棰濓細" + prop="amount" + :check-rules="[{ message: '璇疯緭鍏ュ厖鍊奸噾棰�' }]" + > + <ProFormInputNumber + placeholder="璇疯緭鍏ュ厖鍊奸噾棰�" + v-model.trim="form.amount" + :controls="false" + :min="0" + ></ProFormInputNumber> + </ProFormItemV2> + <ProFormItemV2 label="澶囨敞" prop="remark"> + <ProFormTextArea placeholder="璇疯緭鍏ュ娉�" v-model="form.remark"></ProFormTextArea> + </ProFormItemV2> + </ProForm> + <template #footer> + <span class="dialog-footer"> + <el-button @click="emit('onCancel')">鍙栨秷</el-button> + <el-button type="primary" @click="handleConfirm">纭</el-button> + </span> + </template> + </ProDialog> + <!-- <AlipayWalletRecharge v-bind="dialogAlipayWalletProps" /> --> +</template> + +<script setup lang="ts"> +import { FormInstance } from 'element-plus'; +import { + ProDialog, + ProForm, + ProFormInputNumber, + ProFormItemV2, + ProFormTextArea, + useFormDialog, +} from '@bole-core/components'; +import * as enterpriseWalletServices from '@/services/api/enterpriseWallet'; +import AlipayWalletRecharge from './AlipayWalletRecharge.vue'; + +defineOptions({ + name: 'RechargeEnterpriseWalletDialog', +}); + +type Form = { + title?: string; + amount: number; + remark: string; +}; + +const visible = defineModel({ type: Boolean }); + +const form = defineModel<Form>('form'); + +const emit = defineEmits<{ + (e: 'onConfirm'): void; + (e: 'onCancel'): void; +}>(); + +const dialogForm = ref<FormInstance>(); + +// const { dialogProps: dialogAlipayWalletProps, handleAdd: handleAlipayWalletAdd } = useFormDialog({ +// onConfirm: rechargeEnterpriseWallet, +// defaultFormParams: { +// alipayUrl: '', +// }, +// }); + +// async function rechargeEnterpriseWallet() { +// try { +// let params: API.RechargeEnterpriseWalletCommand = { +// access: EnumEnterpriseWalletAccess.Alipay, +// amount: form.value.amount, +// remark: form.value.remark, +// }; +// let res = await enterpriseWalletServices.rechargeEnterpriseWallet(params); +// if (res) { +// handleAlipayWalletAdd({ +// alipayUrl: res.payUrl, +// }); +// } +// } catch (error) {} +// } + +function onDialogClose() { + if (!dialogForm.value) return; + dialogForm.value.resetFields(); +} + +function handleConfirm() { + if (!dialogForm.value) return; + dialogForm.value.validate((valid) => { + if (valid) { + emit('onConfirm'); + } else { + return; + } + }); +} +</script> -- Gitblit v1.9.1