feat(角色管理): 添加获取全部角色接口并优化角色排序逻辑

- 新增getRoleAllApi接口用于获取所有角色数据
- 在角色列表查询中使用新接口并添加排序逻辑,将base角色置顶,admin角色置底
- 添加空值检查防止角色信息未找到时出错
- 在企业微信余额模块中,将总余额显示拆分为总借呗和已用借呗,并更新相关接口返回类型
This commit is contained in:
dzq 2025-05-29 10:04:10 +08:00
parent 9862f8bff8
commit dd957140e4
5 changed files with 51 additions and 13 deletions

View File

@ -4,6 +4,13 @@ import { UserDTO } from "../system/user";
/** /**
* *
*/ */
export interface QyUserStatsDTO {
/** 用户余额 */
balance?: number;
/** 已使用余额 */
useBalance?: number;
}
export interface QyUserDTO { export interface QyUserDTO {
/** 用户ID导出列用户ID */ /** 用户ID导出列用户ID */
id?: number; id?: number;
@ -131,7 +138,7 @@ export const getQyUserDetailApi = (id: number) => {
}; };
export const getTotalBalanceApi = (corpid: string) => { export const getTotalBalanceApi = (corpid: string) => {
return http.request<ResponseData<number>>("get", `/qywx/users/getTotalBalance`, { return http.request<ResponseData<QyUserStatsDTO>>("get", `/qywx/users/getTotalBalance`, {
params: { corpid } params: { corpid }
}); });
}; };

View File

@ -30,6 +30,16 @@ export function getRoleListApi(params: RoleQuery) {
); );
} }
export function getRoleAllApi(params: RoleQuery) {
return http.request<ResponseData<RoleDTO[]>>(
"get",
"/system/role/all",
{
params
}
);
}
export function getRoleInfoApi(roleId: number) { export function getRoleInfoApi(roleId: number) {
return http.request<ResponseData<RoleDTO>>("get", "/system/role/" + roleId); return http.request<ResponseData<RoleDTO>>("get", "/system/role/" + roleId);
} }

View File

@ -34,13 +34,13 @@ const pagination = ref({
const loading = ref(false); const loading = ref(false);
const dataList = ref<QyUserDTO[]>([]); const dataList = ref<QyUserDTO[]>([]);
const totalBalance = ref(0);
const balanceData = ref([ const balanceData = ref([
{ {
name: '用户总余额', value: name: '用户总借呗', value: '0元',
totalBalance.value.toLocaleString('en-US', { minimumFractionDigits: 2, maximumFractionDigits: 2 }) },
+ '元' {
name: '已用总借呗', value: '0元',
}, },
]); ]);
@ -93,8 +93,10 @@ const handlePaginationChange = () => getList();
const getTotalBalance = async () => { const getTotalBalance = async () => {
try { try {
const { data } = await getTotalBalanceApi(wxStore.corpid); const { data } = await getTotalBalanceApi(wxStore.corpid);
totalBalance.value = data; balanceData.value[0].value = data.balance.toLocaleString('en-US',
balanceData.value[0].value = data.toLocaleString('en-US', { minimumFractionDigits: 2, maximumFractionDigits: 2 })
+ '元';
balanceData.value[1].value = data.useBalance.toLocaleString('en-US',
{ minimumFractionDigits: 2, maximumFractionDigits: 2 }) { minimumFractionDigits: 2, maximumFractionDigits: 2 })
+ '元'; + '元';
} catch (error) { } catch (error) {
@ -156,8 +158,16 @@ getList().then(() => getTotalBalance());
<el-table ref="tableRef" v-loading="loading" :data="dataList" border> <el-table ref="tableRef" v-loading="loading" :data="dataList" border>
<el-table-column label="用户ID" prop="id" width="80" /> <el-table-column label="用户ID" prop="id" width="80" />
<el-table-column label="姓名" prop="name" width="200" /> <el-table-column label="姓名" prop="name" width="200" />
<el-table-column label="余额" prop="balance" width="230"> <el-table-column label="借呗" prop="balance" width="230">
<template #default="{ row }">{{ row.balance.toLocaleString('en-US', { minimumFractionDigits: 0, maximumFractionDigits: 2 }) || 0 }}</template> <template #default="{ row }">{{ row.balance.toLocaleString('en-US', { minimumFractionDigits: 0,
maximumFractionDigits: 2 }) || 0 }}</template>
</el-table-column>
<el-table-column label="已用借呗" prop="balance" width="230">
<template #default="{ row }">{{ row.useBalance.toLocaleString('en-US', {
minimumFractionDigits: 0,
maximumFractionDigits: 2
}) || 0 }}
</template>
</el-table-column> </el-table-column>
<el-table-column label="手机号" prop="mobile" /> <el-table-column label="手机号" prop="mobile" />
<!-- <el-table-column label="所属部门" prop="department" /> --> <!-- <el-table-column label="所属部门" prop="department" /> -->

View File

@ -81,6 +81,9 @@ const rules: FormRules = {
watch(activeTab, async (val) => { watch(activeTab, async (val) => {
console.log("activeTab", val); // key console.log("activeTab", val); // key
opRow.value = dataList.value.find(item => item.roleKey == val); opRow.value = dataList.value.find(item => item.roleKey == val);
if (!opRow.value) {
return;
}
await getRoleInfo("update", opRow.value); await getRoleInfo("update", opRow.value);
Object.assign(formData, opRow.value); Object.assign(formData, opRow.value);
formData.menuIds = opRow.value.selectedMenuList; formData.menuIds = opRow.value.selectedMenuList;
@ -154,6 +157,7 @@ async function handleConfirm() {
try { try {
await formRef.value?.validate(); await formRef.value?.validate();
loading.value = true; loading.value = true;
console.log("opType", opType.value);
if (opType.value === 'add') { if (opType.value === 'add') {
await addRoleApi(formData as AddRoleCommand); await addRoleApi(formData as AddRoleCommand);
} else { } else {

View File

@ -2,6 +2,7 @@ import dayjs from "dayjs";
import { message } from "@/utils/message"; import { message } from "@/utils/message";
import { import {
deleteRoleApi, deleteRoleApi,
getRoleAllApi,
getRoleListApi, getRoleListApi,
RoleDTO, RoleDTO,
RoleQuery RoleQuery
@ -150,10 +151,16 @@ export function useRole() {
async function onSearch() { async function onSearch() {
try { try {
loading.value = true; loading.value = true;
const { data } = await getRoleListApi(toRaw(form)); const { data } = await getRoleAllApi(toRaw(form));
console.log("role list", data); console.log("role list", data);
dataList.value = data.rows; // 重新排序base排第一admin排最后
pagination.total = data.total; dataList.value = data.sort((a, b) => {
if (a.roleKey === 'base') return -1;
if (b.roleKey === 'base') return 1;
if (a.roleKey === 'admin') return 1;
if (b.roleKey === 'admin') return -1;
return 0;
});
} catch (e) { } catch (e) {
console.error(e); console.error(e);
ElMessage.error((e as Error)?.message || "加载失败"); ElMessage.error((e as Error)?.message || "加载失败");
@ -190,7 +197,7 @@ export function useRole() {
form, form,
loading, loading,
columns, columns,
dataList, dataList,
activeTab, activeTab,
pagination, pagination,
onSearch, onSearch,