feat: add status filter

This commit is contained in:
2025-12-17 16:11:30 +08:00
parent a7eb2364d3
commit fe9601baf4
6 changed files with 173 additions and 21 deletions

View File

@@ -7,8 +7,8 @@ function normalizeItems(items) {
}
export const TenantService = {
async listTenants({ page, limit, name, code, sortField, sortOrder } = {}) {
const query = { page, limit, name, code };
async listTenants({ page, limit, name, code, status, sortField, sortOrder } = {}) {
const query = { page, limit, name, code, status };
if (sortField && sortOrder) {
if (sortOrder === 1) query.asc = sortField;
if (sortOrder === -1) query.desc = sortField;

View File

@@ -15,6 +15,7 @@ const page = ref(1);
const rows = ref(10);
const keyword = ref('');
const status = ref('');
const sortField = ref('id');
const sortOrder = ref(-1);
@@ -65,6 +66,7 @@ async function loadTenants() {
limit: rows.value,
name: keyword.value,
code: keyword.value,
status: status.value,
sortField: sortField.value,
sortOrder: sortOrder.value
});
@@ -89,6 +91,7 @@ function onSearch() {
function onReset() {
keyword.value = '';
status.value = '';
sortField.value = 'id';
sortOrder.value = -1;
page.value = 1;
@@ -127,20 +130,26 @@ function openRenewDialog(item) {
}
const tenantStatusDialogVisible = ref(false);
const tenantStatusLoading = ref(false);
const tenantStatusOptionsLoading = ref(false);
const tenantStatusUpdating = ref(false);
const tenantStatusOptions = ref([]);
const tenantStatusTenant = ref(null);
const tenantStatusValue = ref(null);
async function ensureTenantStatusOptionsLoaded() {
if (tenantStatusOptions.value.length > 0) return;
const list = await TenantService.getTenantStatuses();
tenantStatusOptions.value = (list || [])
.map((kv) => ({
label: kv?.value ?? kv?.key ?? '-',
value: kv?.key ?? ''
}))
.filter((item) => item.value);
tenantStatusOptionsLoading.value = true;
try {
const list = await TenantService.getTenantStatuses();
tenantStatusOptions.value = (list || [])
.map((kv) => ({
label: kv?.value ?? kv?.key ?? '-',
value: kv?.key ?? ''
}))
.filter((item) => item.value);
} finally {
tenantStatusOptionsLoading.value = false;
}
}
async function openTenantStatusDialog(tenant) {
@@ -148,13 +157,10 @@ async function openTenantStatusDialog(tenant) {
tenantStatusValue.value = tenant?.status ?? null;
tenantStatusDialogVisible.value = true;
tenantStatusLoading.value = true;
try {
await ensureTenantStatusOptionsLoaded();
} catch (error) {
toast.add({ severity: 'error', summary: '加载失败', detail: error?.message || '无法加载租户状态列表', life: 4000 });
} finally {
tenantStatusLoading.value = false;
}
}
@@ -162,7 +168,7 @@ async function confirmUpdateTenantStatus() {
const tenantID = tenantStatusTenant.value?.id;
if (!tenantID || !tenantStatusValue.value) return;
tenantStatusLoading.value = true;
tenantStatusUpdating.value = true;
try {
await TenantService.updateTenantStatus({ tenantID, status: tenantStatusValue.value });
toast.add({ severity: 'success', summary: '更新成功', detail: `TenantID: ${tenantID}`, life: 3000 });
@@ -171,7 +177,7 @@ async function confirmUpdateTenantStatus() {
} catch (error) {
toast.add({ severity: 'error', summary: '更新失败', detail: error?.message || '无法更新租户状态', life: 4000 });
} finally {
tenantStatusLoading.value = false;
tenantStatusUpdating.value = false;
}
}
@@ -194,6 +200,7 @@ async function confirmRenew() {
onMounted(() => {
loadTenants();
ensureTenantStatusOptionsLoaded().catch(() => {});
});
</script>
@@ -213,6 +220,9 @@ onMounted(() => {
<InputText v-model="keyword" placeholder="请输入" class="w-full" @keyup.enter="onSearch" />
</IconField>
</SearchField>
<SearchField label="状态">
<Select v-model="status" :options="tenantStatusOptions" optionLabel="label" optionValue="value" placeholder="请选择" :loading="tenantStatusOptionsLoading" class="w-full" />
</SearchField>
</SearchPanel>
<DataTable
@@ -300,12 +310,12 @@ onMounted(() => {
<div class="flex flex-col gap-4">
<div>
<label class="block font-medium mb-2">租户状态</label>
<Select v-model="tenantStatusValue" :options="tenantStatusOptions" optionLabel="label" optionValue="value" placeholder="选择状态" :disabled="tenantStatusLoading" fluid />
<Select v-model="tenantStatusValue" :options="tenantStatusOptions" optionLabel="label" optionValue="value" placeholder="选择状态" :disabled="tenantStatusUpdating" fluid />
</div>
</div>
<template #footer>
<Button label="取消" icon="pi pi-times" text @click="tenantStatusDialogVisible = false" :disabled="tenantStatusLoading" />
<Button label="确认" icon="pi pi-check" @click="confirmUpdateTenantStatus" :loading="tenantStatusLoading" :disabled="!tenantStatusValue" />
<Button label="取消" icon="pi pi-times" text @click="tenantStatusDialogVisible = false" :disabled="tenantStatusUpdating" />
<Button label="确认" icon="pi pi-check" @click="confirmUpdateTenantStatus" :loading="tenantStatusUpdating" :disabled="!tenantStatusValue" />
</template>
</Dialog>
</div>