diff --git a/apps/web-antd/src/views/crm/business/modules/detail.vue b/apps/web-antd/src/views/crm/business/modules/detail.vue
index aebfd6e3..7bbd08ee 100644
--- a/apps/web-antd/src/views/crm/business/modules/detail.vue
+++ b/apps/web-antd/src/views/crm/business/modules/detail.vue
@@ -20,7 +20,7 @@ import {
BusinessForm,
UpStatusForm,
} from '#/views/crm/business';
-import { ContactDetailsList } from '#/views/crm/contact';
+import { ContactDetailsList } from '#/views/crm/contact/components';
import { ContractDetailsList } from '#/views/crm/contract';
import { FollowUp } from '#/views/crm/followup';
import { PermissionList, TransferForm } from '#/views/crm/permission';
diff --git a/apps/web-antd/src/views/crm/contact/components/data.ts b/apps/web-antd/src/views/crm/contact/components/data.ts
new file mode 100644
index 00000000..b2e63f76
--- /dev/null
+++ b/apps/web-antd/src/views/crm/contact/components/data.ts
@@ -0,0 +1,62 @@
+import type { VxeTableGridOptions } from '#/adapter/vxe-table';
+
+import { DICT_TYPE } from '@vben/constants';
+
+/** 联系人明细列表列配置 */
+export function useDetailListColumns(): VxeTableGridOptions['columns'] {
+ return [
+ {
+ type: 'checkbox',
+ width: 50,
+ fixed: 'left',
+ },
+ {
+ field: 'name',
+ title: '姓名',
+ fixed: 'left',
+ slots: { default: 'name' },
+ },
+ {
+ field: 'customerName',
+ title: '客户名称',
+ fixed: 'left',
+ slots: { default: 'customerName' },
+ },
+ {
+ field: 'sex',
+ title: '性别',
+ cellRender: {
+ name: 'CellDict',
+ props: { type: DICT_TYPE.SYSTEM_USER_SEX },
+ },
+ },
+ {
+ field: 'mobile',
+ title: '手机',
+ },
+ {
+ field: 'telephone',
+ title: '电话',
+ },
+ {
+ field: 'email',
+ title: '邮箱',
+ },
+ {
+ field: 'post',
+ title: '职位',
+ },
+ {
+ field: 'detailAddress',
+ title: '地址',
+ },
+ {
+ field: 'master',
+ title: '关键决策人',
+ cellRender: {
+ name: 'CellDict',
+ props: { type: DICT_TYPE.INFRA_BOOLEAN_STRING },
+ },
+ },
+ ];
+}
diff --git a/apps/web-antd/src/views/crm/contact/components/detail-list-modal.vue b/apps/web-antd/src/views/crm/contact/components/detail-list-modal.vue
new file mode 100644
index 00000000..4214096a
--- /dev/null
+++ b/apps/web-antd/src/views/crm/contact/components/detail-list-modal.vue
@@ -0,0 +1,148 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/apps/web-antd/src/views/crm/contact/components/detail-list.vue b/apps/web-antd/src/views/crm/contact/components/detail-list.vue
new file mode 100644
index 00000000..193e0bc5
--- /dev/null
+++ b/apps/web-antd/src/views/crm/contact/components/detail-list.vue
@@ -0,0 +1,210 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/apps/web-antd/src/views/crm/contact/components/index.ts b/apps/web-antd/src/views/crm/contact/components/index.ts
new file mode 100644
index 00000000..d16cd533
--- /dev/null
+++ b/apps/web-antd/src/views/crm/contact/components/index.ts
@@ -0,0 +1 @@
+export { default as ContactDetailsList } from './detail-list.vue';
diff --git a/apps/web-antd/src/views/crm/contact/index.ts b/apps/web-antd/src/views/crm/contact/index.ts
deleted file mode 100644
index 1886e21c..00000000
--- a/apps/web-antd/src/views/crm/contact/index.ts
+++ /dev/null
@@ -1,5 +0,0 @@
-import { defineAsyncComponent } from 'vue';
-
-export const ContactDetailsList = defineAsyncComponent(
- () => import('./components/detail-list.vue'),
-);
diff --git a/apps/web-antd/src/views/crm/customer/modules/detail.vue b/apps/web-antd/src/views/crm/customer/modules/detail.vue
index 6c7ccbf8..d674e2e9 100644
--- a/apps/web-antd/src/views/crm/customer/modules/detail.vue
+++ b/apps/web-antd/src/views/crm/customer/modules/detail.vue
@@ -23,7 +23,7 @@ import { useDescription } from '#/components/description';
import { AsyncOperateLog } from '#/components/operate-log';
import { ACTION_ICON, TableAction } from '#/components/table-action';
import { BusinessDetailsList } from '#/views/crm/business';
-import { ContactDetailsList } from '#/views/crm/contact';
+import { ContactDetailsList } from '#/views/crm/contact/components';
import { ContractDetailsList } from '#/views/crm/contract';
import {
CustomerDetailsInfo,