refactor(credit): 简化被执行人列表组件实现
- 将表格行键从 rowKey 改为 id - 移除历史被执行人相关功能和导入按钮 - 统一编辑功能,移除区分来源的逻辑 - 移除历史被执行人相关的导入和编辑弹窗组件 - 简化数据获取逻辑,移除客户端合并和排序逻辑 - 移除来源标识字段和相关判断逻辑 - 统一删除操作,简化批量删除的实现
This commit is contained in:
@@ -3,7 +3,7 @@
|
|||||||
<a-card :bordered="false" :body-style="{ padding: '16px' }">
|
<a-card :bordered="false" :body-style="{ padding: '16px' }">
|
||||||
<ele-pro-table
|
<ele-pro-table
|
||||||
ref="tableRef"
|
ref="tableRef"
|
||||||
row-key="rowKey"
|
row-key="id"
|
||||||
:columns="columns"
|
:columns="columns"
|
||||||
:datasource="datasource"
|
:datasource="datasource"
|
||||||
:customRow="customRow"
|
:customRow="customRow"
|
||||||
@@ -26,7 +26,7 @@
|
|||||||
<template #icon>
|
<template #icon>
|
||||||
<CloudUploadOutlined />
|
<CloudUploadOutlined />
|
||||||
</template>
|
</template>
|
||||||
<span class="text-red-500">导入历史被执行人</span>
|
<span class="text-red-500">导入被执行人</span>
|
||||||
</a-button>
|
</a-button>
|
||||||
</a-space>
|
</a-space>
|
||||||
</template>
|
</template>
|
||||||
@@ -63,12 +63,7 @@
|
|||||||
</template>
|
</template>
|
||||||
<template v-if="column.key === 'action'">
|
<template v-if="column.key === 'action'">
|
||||||
<a-space>
|
<a-space>
|
||||||
<a
|
<a @click="openEdit(record)">修改</a>
|
||||||
@click="
|
|
||||||
record.__source === 'B' ? openEdit2(record) : openEdit(record)
|
|
||||||
"
|
|
||||||
>修改</a
|
|
||||||
>
|
|
||||||
<a-divider type="vertical" />
|
<a-divider type="vertical" />
|
||||||
<a-popconfirm
|
<a-popconfirm
|
||||||
title="确定要删除此记录吗?"
|
title="确定要删除此记录吗?"
|
||||||
@@ -90,25 +85,13 @@
|
|||||||
/>
|
/>
|
||||||
<!-- 导入弹窗 -->
|
<!-- 导入弹窗 -->
|
||||||
<CreditJudgmentDebtorImport v-model:visible="showImport" @done="reload" />
|
<CreditJudgmentDebtorImport v-model:visible="showImport" @done="reload" />
|
||||||
<!-- 历史被执行人导入弹窗 -->
|
|
||||||
<CreditJudgmentDebtorHistoryImport
|
|
||||||
v-model:visible="showImport2"
|
|
||||||
@done="reload"
|
|
||||||
/>
|
|
||||||
<!-- 编辑弹窗 -->
|
|
||||||
<CreditJudgmentDebtorHistoryEdit
|
|
||||||
v-model:visible="showEdit2"
|
|
||||||
:data="current"
|
|
||||||
@done="reload"
|
|
||||||
/>
|
|
||||||
</a-page-header>
|
</a-page-header>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script lang="ts" setup>
|
<script lang="ts" setup>
|
||||||
import { createVNode, ref } from 'vue';
|
import { createVNode, ref } from 'vue';
|
||||||
import { message, Modal } from 'ant-design-vue';
|
import { message, Modal } from 'ant-design-vue';
|
||||||
import { CloudUploadOutlined } from '@ant-design/icons-vue';
|
import { ExclamationCircleOutlined,CloudUploadOutlined } from '@ant-design/icons-vue';
|
||||||
import { ExclamationCircleOutlined } from '@ant-design/icons-vue';
|
|
||||||
import type { EleProTable } from 'ele-admin-pro';
|
import type { EleProTable } from 'ele-admin-pro';
|
||||||
import { toDateString } from 'ele-admin-pro';
|
import { toDateString } from 'ele-admin-pro';
|
||||||
import type {
|
import type {
|
||||||
@@ -119,49 +102,29 @@
|
|||||||
import { exportCreditData } from '../utils/export';
|
import { exportCreditData } from '../utils/export';
|
||||||
import { getPageTitle } from '@/utils/common';
|
import { getPageTitle } from '@/utils/common';
|
||||||
import CreditJudgmentDebtorEdit from './components/creditJudgmentDebtorEdit.vue';
|
import CreditJudgmentDebtorEdit from './components/creditJudgmentDebtorEdit.vue';
|
||||||
import CreditJudgmentDebtorHistoryEdit from '@/views/credit/creditJudgmentDebtorHistory/components/creditJudgmentDebtorHistoryEdit.vue';
|
|
||||||
import CreditJudgmentDebtorImport from './components/credit-judgment-debtor-import.vue';
|
import CreditJudgmentDebtorImport from './components/credit-judgment-debtor-import.vue';
|
||||||
import CreditJudgmentDebtorHistoryImport from './components/credit-judgment-debtor-history-import.vue';
|
|
||||||
import {
|
import {
|
||||||
|
pageCreditJudgmentDebtor,
|
||||||
listCreditJudgmentDebtor,
|
listCreditJudgmentDebtor,
|
||||||
removeCreditJudgmentDebtor,
|
removeCreditJudgmentDebtor,
|
||||||
removeBatchCreditJudgmentDebtor
|
removeBatchCreditJudgmentDebtor
|
||||||
} from '@/api/credit/creditJudgmentDebtor';
|
} from '@/api/credit/creditJudgmentDebtor';
|
||||||
import {
|
|
||||||
listCreditJudgmentDebtorHistory,
|
|
||||||
removeCreditJudgmentDebtorHistory,
|
|
||||||
removeBatchCreditJudgmentDebtorHistory
|
|
||||||
} from '@/api/credit/creditJudgmentDebtorHistory';
|
|
||||||
import type {
|
import type {
|
||||||
CreditJudgmentDebtor,
|
CreditJudgmentDebtor,
|
||||||
CreditJudgmentDebtorParam
|
CreditJudgmentDebtorParam
|
||||||
} from '@/api/credit/creditJudgmentDebtor/model';
|
} from '@/api/credit/creditJudgmentDebtor/model';
|
||||||
import type { CreditJudgmentDebtorHistory } from '@/api/credit/creditJudgmentDebtorHistory/model';
|
|
||||||
|
|
||||||
// 表格实例
|
// 表格实例
|
||||||
const tableRef = ref<InstanceType<typeof EleProTable> | null>(null);
|
const tableRef = ref<InstanceType<typeof EleProTable> | null>(null);
|
||||||
|
|
||||||
type CreditJudgmentDebtorTableRecord =
|
|
||||||
| (CreditJudgmentDebtor & { rowKey: string; __source: 'A' })
|
|
||||||
| (CreditJudgmentDebtorHistory & {
|
|
||||||
rowKey: string;
|
|
||||||
__source: 'B';
|
|
||||||
// For red提示 + dblclick open history edit
|
|
||||||
historyId: number;
|
|
||||||
});
|
|
||||||
|
|
||||||
// 表格选中数据
|
// 表格选中数据
|
||||||
const selection = ref<CreditJudgmentDebtorTableRecord[]>([]);
|
const selection = ref<CreditJudgmentDebtor[]>([]);
|
||||||
// 当前编辑数据
|
// 当前编辑数据
|
||||||
const current = ref<CreditJudgmentDebtorTableRecord | null>(null);
|
const current = ref<CreditJudgmentDebtor | null>(null);
|
||||||
// 是否显示编辑弹窗
|
// 是否显示编辑弹窗
|
||||||
const showEdit = ref(false);
|
const showEdit = ref(false);
|
||||||
// 是否显示编辑弹窗2
|
|
||||||
const showEdit2 = ref(false);
|
|
||||||
// 是否显示导入弹窗
|
// 是否显示导入弹窗
|
||||||
const showImport = ref(false);
|
const showImport = ref(false);
|
||||||
// 是否显示历史被执行人导入弹窗
|
|
||||||
const showImport2 = ref(false);
|
|
||||||
// 是否显示批量移动弹窗
|
// 是否显示批量移动弹窗
|
||||||
const showMove = ref(false);
|
const showMove = ref(false);
|
||||||
// 加载状态
|
// 加载状态
|
||||||
@@ -169,63 +132,6 @@
|
|||||||
// 搜索关键词
|
// 搜索关键词
|
||||||
const searchText = ref('');
|
const searchText = ref('');
|
||||||
|
|
||||||
const normalizeCaseNumber = (caseNumber?: string) =>
|
|
||||||
(caseNumber ?? '').trim();
|
|
||||||
|
|
||||||
const mergeByCaseNumber = (
|
|
||||||
aList: CreditJudgmentDebtor[],
|
|
||||||
bList: CreditJudgmentDebtorHistory[]
|
|
||||||
): CreditJudgmentDebtorTableRecord[] => {
|
|
||||||
const map = new Map<string, CreditJudgmentDebtorTableRecord>();
|
|
||||||
|
|
||||||
aList.forEach((a, idx) => {
|
|
||||||
const key = normalizeCaseNumber(a.caseNumber) || `__A__${a.id ?? idx}`;
|
|
||||||
map.set(key, {
|
|
||||||
...(a as any),
|
|
||||||
rowKey: `A-${a.id ?? key}`,
|
|
||||||
__source: 'A'
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
// B overrides A when caseNumber duplicates
|
|
||||||
bList.forEach((b, idx) => {
|
|
||||||
const key = normalizeCaseNumber(b.caseNumber) || `__B__${b.id ?? idx}`;
|
|
||||||
map.set(key, {
|
|
||||||
...(b as any),
|
|
||||||
rowKey: `B-${b.id ?? key}`,
|
|
||||||
__source: 'B',
|
|
||||||
historyId: b.id as number
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
return Array.from(map.values());
|
|
||||||
};
|
|
||||||
|
|
||||||
const sortList = (
|
|
||||||
list: CreditJudgmentDebtorTableRecord[],
|
|
||||||
orders?: Record<string, any>
|
|
||||||
) => {
|
|
||||||
const sortField = orders?.sort;
|
|
||||||
const sortOrder: string | undefined = orders?.order;
|
|
||||||
if (!sortField || !sortOrder) {
|
|
||||||
return list;
|
|
||||||
}
|
|
||||||
const desc = String(sortOrder).toLowerCase().startsWith('desc');
|
|
||||||
return [...list].sort((a: any, b: any) => {
|
|
||||||
const av = a?.[sortField];
|
|
||||||
const bv = b?.[sortField];
|
|
||||||
if (av == null && bv == null) return 0;
|
|
||||||
if (av == null) return desc ? 1 : -1;
|
|
||||||
if (bv == null) return desc ? -1 : 1;
|
|
||||||
if (typeof av === 'number' && typeof bv === 'number') {
|
|
||||||
return desc ? bv - av : av - bv;
|
|
||||||
}
|
|
||||||
const as = String(av);
|
|
||||||
const bs = String(bv);
|
|
||||||
return desc ? bs.localeCompare(as) : as.localeCompare(bs);
|
|
||||||
});
|
|
||||||
};
|
|
||||||
|
|
||||||
// 表格数据源
|
// 表格数据源
|
||||||
const datasource: DatasourceFunction = ({
|
const datasource: DatasourceFunction = ({
|
||||||
page,
|
page,
|
||||||
@@ -241,20 +147,11 @@
|
|||||||
if (!params.keywords && searchText.value) {
|
if (!params.keywords && searchText.value) {
|
||||||
params.keywords = searchText.value;
|
params.keywords = searchText.value;
|
||||||
}
|
}
|
||||||
|
return pageCreditJudgmentDebtor({
|
||||||
// Client-side merge A+B by caseNumber, with B override.
|
...params,
|
||||||
return Promise.all([
|
...(orders as any),
|
||||||
listCreditJudgmentDebtor(params),
|
page,
|
||||||
listCreditJudgmentDebtorHistory(params as any)
|
limit
|
||||||
]).then(([aList, bList]) => {
|
|
||||||
const merged = sortList(mergeByCaseNumber(aList, bList), orders as any);
|
|
||||||
const currentPage = page ?? 1;
|
|
||||||
const pageSize = limit ?? 20;
|
|
||||||
const start = (currentPage - 1) * pageSize;
|
|
||||||
return {
|
|
||||||
list: merged.slice(start, start + pageSize),
|
|
||||||
count: merged.length
|
|
||||||
};
|
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -318,7 +215,7 @@
|
|||||||
align: 'center',
|
align: 'center',
|
||||||
ellipsis: true,
|
ellipsis: true,
|
||||||
customRender: ({ text }) => toDateString(text, 'yyyy-MM-dd HH:mm:ss')
|
customRender: ({ text }) => toDateString(text, 'yyyy-MM-dd HH:mm:ss')
|
||||||
},
|
}
|
||||||
// {
|
// {
|
||||||
// title: '操作',
|
// title: '操作',
|
||||||
// key: 'action',
|
// key: 'action',
|
||||||
@@ -340,7 +237,7 @@
|
|||||||
};
|
};
|
||||||
|
|
||||||
/* 打开编辑弹窗 */
|
/* 打开编辑弹窗 */
|
||||||
const openEdit = (row?: CreditJudgmentDebtorTableRecord) => {
|
const openEdit = (row?: CreditJudgmentDebtor) => {
|
||||||
current.value = row ?? null;
|
current.value = row ?? null;
|
||||||
showEdit.value = true;
|
showEdit.value = true;
|
||||||
};
|
};
|
||||||
@@ -355,17 +252,6 @@
|
|||||||
showImport.value = true;
|
showImport.value = true;
|
||||||
};
|
};
|
||||||
|
|
||||||
/* 打开历史被执行人导入弹窗 */
|
|
||||||
const openImport2 = () => {
|
|
||||||
showImport2.value = true;
|
|
||||||
};
|
|
||||||
|
|
||||||
/* 打开编辑弹窗 */
|
|
||||||
const openEdit2 = (row?: CreditJudgmentDebtorTableRecord) => {
|
|
||||||
current.value = row ?? null;
|
|
||||||
showEdit2.value = true;
|
|
||||||
};
|
|
||||||
|
|
||||||
/* 导出 */
|
/* 导出 */
|
||||||
const exportData = () => {
|
const exportData = () => {
|
||||||
exportCreditData<CreditJudgmentDebtor>({
|
exportCreditData<CreditJudgmentDebtor>({
|
||||||
@@ -389,23 +275,14 @@
|
|||||||
}
|
}
|
||||||
],
|
],
|
||||||
fetchData: () =>
|
fetchData: () =>
|
||||||
Promise.all([
|
listCreditJudgmentDebtor({ keywords: searchText.value || undefined })
|
||||||
listCreditJudgmentDebtor({ keywords: searchText.value || undefined }),
|
|
||||||
listCreditJudgmentDebtorHistory({
|
|
||||||
keywords: searchText.value || undefined
|
|
||||||
} as any)
|
|
||||||
]).then(([aList, bList]) => mergeByCaseNumber(aList, bList) as any)
|
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
/* 删除单个 */
|
/* 删除单个 */
|
||||||
const remove = (row: CreditJudgmentDebtorTableRecord) => {
|
const remove = (row: CreditJudgmentDebtor) => {
|
||||||
const hide = message.loading('请求中..', 0);
|
const hide = message.loading('请求中..', 0);
|
||||||
const isHistory = (row as any).__source === 'B';
|
removeCreditJudgmentDebtor(row.id)
|
||||||
const removeFn = isHistory
|
|
||||||
? removeCreditJudgmentDebtorHistory
|
|
||||||
: removeCreditJudgmentDebtor;
|
|
||||||
removeFn((row as any).id)
|
|
||||||
.then((msg) => {
|
.then((msg) => {
|
||||||
hide();
|
hide();
|
||||||
message.success(msg);
|
message.success(msg);
|
||||||
@@ -430,23 +307,8 @@
|
|||||||
maskClosable: true,
|
maskClosable: true,
|
||||||
onOk: () => {
|
onOk: () => {
|
||||||
const hide = message.loading('请求中..', 0);
|
const hide = message.loading('请求中..', 0);
|
||||||
const aIds: (number | undefined)[] = [];
|
const ids = selection.value.map((d) => d.id);
|
||||||
const bIds: (number | undefined)[] = [];
|
return removeBatchCreditJudgmentDebtor(ids)
|
||||||
selection.value.forEach((d: any) => {
|
|
||||||
if (d.__source === 'B') {
|
|
||||||
bIds.push(d.id);
|
|
||||||
} else {
|
|
||||||
aIds.push(d.id);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
return Promise.all([
|
|
||||||
aIds.length
|
|
||||||
? removeBatchCreditJudgmentDebtor(aIds)
|
|
||||||
: Promise.resolve(''),
|
|
||||||
bIds.length
|
|
||||||
? removeBatchCreditJudgmentDebtorHistory(bIds)
|
|
||||||
: Promise.resolve('')
|
|
||||||
])
|
|
||||||
.then(() => {
|
.then(() => {
|
||||||
hide();
|
hide();
|
||||||
message.success('删除成功');
|
message.success('删除成功');
|
||||||
@@ -466,7 +328,7 @@
|
|||||||
};
|
};
|
||||||
|
|
||||||
/* 自定义行属性 */
|
/* 自定义行属性 */
|
||||||
const customRow = (record: CreditJudgmentDebtorTableRecord) => {
|
const customRow = (record: CreditJudgmentDebtor) => {
|
||||||
return {
|
return {
|
||||||
// 行点击事件
|
// 行点击事件
|
||||||
onClick: () => {
|
onClick: () => {
|
||||||
@@ -474,11 +336,7 @@
|
|||||||
},
|
},
|
||||||
// 行双击事件
|
// 行双击事件
|
||||||
onDblclick: () => {
|
onDblclick: () => {
|
||||||
if ((record as any).__source !== 'B') {
|
|
||||||
openEdit(record);
|
openEdit(record);
|
||||||
} else {
|
|
||||||
openEdit2(record);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|||||||
Reference in New Issue
Block a user