From 040fb4acaad48e5d1d259dfbc2a9bd330173b2fa Mon Sep 17 00:00:00 2001 From: dzq Date: Mon, 24 Nov 2025 17:11:11 +0800 Subject: [PATCH] =?UTF-8?q?feat(=E7=94=A8=E6=88=B7=E6=A8=A1=E5=9D=97):=20?= =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E5=80=9F=E5=91=97=E7=9B=B8=E5=85=B3=E5=AD=97?= =?UTF-8?q?=E6=AE=B5=E5=8F=8A=E9=87=91=E9=A2=9D=E6=98=BE=E7=A4=BA=E5=8A=9F?= =?UTF-8?q?=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 在用户DTO中新增借呗相关字段(余额、已使用、额度) 添加货币单位转换工具函数用于分转元显示 在用户列表和详情页展示借呗信息 修改用户详情接口增加企业ID参数 --- src/api/ab98/user.ts | 19 +++++++++- src/utils/currency.ts | 68 ++++++++++++++++++++++++++++++++++ src/views/user/ab98/detail.vue | 9 ++++- src/views/user/ab98/index.vue | 8 +++- 4 files changed, 100 insertions(+), 4 deletions(-) create mode 100644 src/utils/currency.ts diff --git a/src/api/ab98/user.ts b/src/api/ab98/user.ts index 7ceb5a1..378b902 100644 --- a/src/api/ab98/user.ts +++ b/src/api/ab98/user.ts @@ -25,6 +25,12 @@ export interface Ab98UserDTO { address?: string; /** 是否已注册(0未注册 1已注册) */ registered?: boolean; + /** 剩余借呗(单位:分) */ + balance?: number; + /** 已使用借呗 (单位:分) */ + useBalance?: number; + /** 借呗额度 (单位:分) */ + balanceLimit?: number; } export interface Ab98UserDetailDTO { /** 主键ID */ @@ -52,9 +58,18 @@ export interface Ab98UserDetailDTO { /** 是否已注册(0未注册 1已注册) */ registered?: boolean; createTime?: string; + /** 剩余借呗(单位:分) */ + balance?: number; + /** 已使用借呗(单位:分) */ + useBalance?: number; + /** 借呗额度(单位:分) */ + balanceLimit?: number; + } export interface Ab98UserQuery extends BasePageQuery { + /** 企业ID(导出列:企业ID) */ + corpid: string; /** 真实姓名 */ name?: string; /** 手机号码 */ @@ -106,8 +121,8 @@ export const deleteAb98UserApi = (ids: number[]) => { return http.request>("delete", `/ab98/users/${ids.join(',')}`); }; -export const getAb98UserDetailApi = (id: number) => { - return http.request>("get", `/ab98/users/detail/${id}`); +export const getAb98UserDetailApi = (id: number, corpid: string) => { + return http.request>("get", `/ab98/users/detail/${id}`, { params: { corpid } }); }; export const bindQyUserApi = (data: BindQyUserCommand) => { diff --git a/src/utils/currency.ts b/src/utils/currency.ts new file mode 100644 index 0000000..a97a62b --- /dev/null +++ b/src/utils/currency.ts @@ -0,0 +1,68 @@ +/** + * 货币单位转换工具函数 + * 将分转换为元,处理借呗金额显示 + */ + +/** + * 将分转换为元 + * @param amount 分的金额 + * @param precision 精度,保留小数位数,默认2位 + * @returns 元的金额(字符串格式) + */ +export function fenToYuan(amount: number | string | null | undefined, precision: number = 2): string { + // 处理空值、null、undefined + if (amount === null || amount === undefined || amount === '') { + return '0'; + } + + // 转换为数字 + const numAmount = typeof amount === 'string' ? parseFloat(amount) : amount; + + // 如果转换后不是有效数字,返回0 + if (isNaN(numAmount)) { + return '0'; + } + + // 将分转换为元(除以100) + const yuanAmount = numAmount / 100; + + // 按指定精度格式化 + return yuanAmount.toFixed(precision); +} + +/** + * 将分转换为元(数字格式) + * @param amount 分的金额 + * @param precision 精度,保留小数位数,默认2位 + * @returns 元的金额(数字格式) + */ +export function fenToYuanNumber(amount: number | string | null | undefined, precision: number = 2): number { + // 处理空值、null、undefined + if (amount === null || amount === undefined || amount === '') { + return 0; + } + + // 转换为数字 + const numAmount = typeof amount === 'string' ? parseFloat(amount) : amount; + + // 如果转换后不是有效数字,返回0 + if (isNaN(numAmount)) { + return 0; + } + + // 将分转换为元(除以100) + const yuanAmount = numAmount / 100; + + // 按指定精度格式化并返回数字 + return parseFloat(yuanAmount.toFixed(precision)); +} + +/** + * 格式化金额显示,自动添加元单位 + * @param amount 分的金额 + * @param precision 精度,保留小数位数,默认2位 + * @returns 格式化的金额字符串,包含元单位 + */ +export function formatFenToYuan(amount: number | string | null | undefined, precision: number = 2): string { + return `${fenToYuan(amount, precision)}元`; +} \ No newline at end of file diff --git a/src/views/user/ab98/detail.vue b/src/views/user/ab98/detail.vue index b4bf671..b9e73f7 100644 --- a/src/views/user/ab98/detail.vue +++ b/src/views/user/ab98/detail.vue @@ -6,12 +6,15 @@ import { getOrderListApi, type OrderDTO } from "@/api/shop/order"; import { Ab98UserTagDTO, addAb98UserTagApi, deleteAb98UserTagConfirmApi, getAb98UserTagListApi } from "@/api/ab98/tag"; import { ElMessage, ElMessageBox } from "element-plus"; import { PureTableBar } from "@/components/RePureTableBar"; +import { useWxStore } from "@/store/modules/wx"; +import { formatFenToYuan } from "@/utils/currency"; defineOptions({ name: "Ab98UserDetail" }); const route = useRoute(); +const wxStore = useWxStore(); const userInfo = ref({}); const loading = ref(false); const tags = ref([]); @@ -64,7 +67,7 @@ async function fetchUserDetail() { try { loading.value = true; const userId = route.query.id; - const { data } = await getAb98UserDetailApi(Number(userId)); + const { data } = await getAb98UserDetailApi(Number(userId), wxStore.corpid); userInfo.value = data; await fetchUserTags(); } finally { @@ -166,6 +169,10 @@ onMounted(() => { {{ userInfo.ab98UserId }} {{ userInfo.openid }} {{ userInfo.createTime }} + {{ formatFenToYuan(userInfo.balanceLimit) + }} + {{ formatFenToYuan(userInfo.balance) }} + {{ formatFenToYuan(userInfo.useBalance) }}
diff --git a/src/views/user/ab98/index.vue b/src/views/user/ab98/index.vue index 6296419..90c8b98 100644 --- a/src/views/user/ab98/index.vue +++ b/src/views/user/ab98/index.vue @@ -4,6 +4,7 @@ import { useRenderIcon } from "@/components/ReIcon/src/hooks"; import { getAb98UserListApi, type Ab98UserDTO, Ab98UserQuery } from "@/api/ab98/user"; import { type PaginationProps } from "@pureadmin/table"; import { CommonUtils } from "@/utils/common"; +import { useWxStore } from "@/store/modules/wx"; import Search from "@iconify-icons/ep/search"; import Refresh from "@iconify-icons/ep/refresh"; @@ -11,6 +12,7 @@ import View from "@iconify-icons/ep/view"; import { useRouter } from "vue-router"; import { useMultiTagsStoreHook } from "@/store/modules/multiTags"; import { getAb98UserTagNamesApi } from "@/api/ab98/tag"; +import { formatFenToYuan } from "@/utils/currency"; defineOptions({ name: "Ab98User" @@ -18,8 +20,10 @@ defineOptions({ const router = useRouter(); const formRef = ref(); +const wxStore = useWxStore(); const tagOptions = ref([]); const searchFormParams = reactive({ + corpid: wxStore.corpid || "", name: undefined, tel: undefined, idnum: undefined, @@ -154,6 +158,7 @@ onMounted(() => {
姓名:{{ item.name }}
性别:{{ item.sex === '男' ? '男' : item.sex === '女' ? '女' : '' }}
电话:{{ item.tel }}
+
剩余借呗:{{ formatFenToYuan(item.balance) }}
身份证号:{{ item.idnum }}
@@ -209,7 +214,8 @@ onMounted(() => { .name, .gender, - .tel { + .tel, + .balance { font-size: 14px; color: #606266; margin-bottom: 6px;