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