From 070274de1556721fbc2ae1f62ea648e7fc63cbb7 Mon Sep 17 00:00:00 2001 From: xingyu4j Date: Wed, 4 Jun 2025 21:17:36 +0800 Subject: [PATCH] feat: business list --- apps/web-antd/src/views/crm/business/data.ts | 62 +++++- .../crm/business/modules/detail-form.vue | 155 ++++++++++++++ .../crm/business/modules/detail-list.vue | 190 +++++++++++++++++- .../src/views/crm/business/modules/form.vue | 4 +- .../src/views/crm/customer/modules/detail.vue | 18 +- .../web-antd/src/views/crm/followup/index.vue | 11 +- .../permission/modules/permission-list.vue | 1 - 7 files changed, 423 insertions(+), 18 deletions(-) create mode 100644 apps/web-antd/src/views/crm/business/modules/detail-form.vue diff --git a/apps/web-antd/src/views/crm/business/data.ts b/apps/web-antd/src/views/crm/business/data.ts index d781ef036..9505414f8 100644 --- a/apps/web-antd/src/views/crm/business/data.ts +++ b/apps/web-antd/src/views/crm/business/data.ts @@ -56,6 +56,15 @@ export function useFormSchema(): VbenFormSchema[] { }, rules: 'required', }, + { + fieldName: 'contactId', + label: '合同名称', + component: 'Input', + dependencies: { + triggerFields: [''], + show: () => false, + }, + }, { fieldName: 'statusTypeId', label: '商机状态组', @@ -69,7 +78,7 @@ export function useFormSchema(): VbenFormSchema[] { }, dependencies: { triggerFields: ['id'], - disabled: (values) => !values.id, + disabled: (values) => values.id, }, rules: 'required', }, @@ -285,3 +294,54 @@ export function useDetailBaseSchema(): DescriptionItemSchema[] { }, ]; } + +/** 详情列表的字段 */ +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: 'totalPrice', + title: '商机金额(元)', + formatter: 'formatNumber', + }, + { + field: 'dealTime', + title: '预计成交日期', + formatter: 'formatDate', + }, + { + field: 'ownerUserName', + title: '负责人', + }, + { + field: 'ownerUserDeptName', + title: '所属部门', + }, + { + field: 'statusTypeName', + title: '商机状态组', + fixed: 'right', + }, + { + field: 'statusName', + title: '商机阶段', + fixed: 'right', + }, + ]; +} diff --git a/apps/web-antd/src/views/crm/business/modules/detail-form.vue b/apps/web-antd/src/views/crm/business/modules/detail-form.vue new file mode 100644 index 000000000..4fc7fdf72 --- /dev/null +++ b/apps/web-antd/src/views/crm/business/modules/detail-form.vue @@ -0,0 +1,155 @@ + + + diff --git a/apps/web-antd/src/views/crm/business/modules/detail-list.vue b/apps/web-antd/src/views/crm/business/modules/detail-list.vue index b6466c322..e63eb3abd 100644 --- a/apps/web-antd/src/views/crm/business/modules/detail-list.vue +++ b/apps/web-antd/src/views/crm/business/modules/detail-list.vue @@ -1,4 +1,190 @@ - + + diff --git a/apps/web-antd/src/views/crm/business/modules/form.vue b/apps/web-antd/src/views/crm/business/modules/form.vue index dd8dbd61b..8d3b0d553 100644 --- a/apps/web-antd/src/views/crm/business/modules/form.vue +++ b/apps/web-antd/src/views/crm/business/modules/form.vue @@ -64,12 +64,12 @@ const [Modal, modalApi] = useVbenModal({ } // 加载数据 const data = modalApi.getData(); - if (!data || !data.id) { + if (!data) { return; } modalApi.lock(); try { - formData.value = await getBusiness(data.id as number); + formData.value = data.id ? await getBusiness(data.id as number) : data; // 设置到 values await formApi.setValues(formData.value); } finally { 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 8baf235ed..8dd608ed6 100644 --- a/apps/web-antd/src/views/crm/customer/modules/detail.vue +++ b/apps/web-antd/src/views/crm/customer/modules/detail.vue @@ -21,6 +21,14 @@ const CustomerDetailsInfo = defineAsyncComponent( () => import('./detail-info.vue'), ); +const CustomerForm = defineAsyncComponent( + () => import('#/views/crm/customer/modules/form.vue'), +); + +const BusinessList = defineAsyncComponent( + () => import('#/views/crm/business/modules/detail-list.vue'), +); + const FollowUp = defineAsyncComponent( () => import('#/views/crm/followup/index.vue'), ); @@ -37,10 +45,6 @@ const OperateLog = defineAsyncComponent( () => import('#/components/operate-log'), ); -const CustomerForm = defineAsyncComponent( - () => import('#/views/crm/customer/modules/form.vue'), -); - const loading = ref(false); const route = useRoute(); @@ -236,7 +240,11 @@ onMounted(async () => { /> -
商机
+
合同
diff --git a/apps/web-antd/src/views/crm/followup/index.vue b/apps/web-antd/src/views/crm/followup/index.vue index b6b81dda2..6f0e42f36 100644 --- a/apps/web-antd/src/views/crm/followup/index.vue +++ b/apps/web-antd/src/views/crm/followup/index.vue @@ -5,7 +5,7 @@ import type { CrmFollowUpApi } from '#/api/crm/followup'; import { watch } from 'vue'; import { useRouter } from 'vue-router'; -import { Page, useVbenModal } from '@vben/common-ui'; +import { useVbenModal } from '@vben/common-ui'; import { Button, message } from 'ant-design-vue'; @@ -79,7 +79,6 @@ const [Grid, gridApi] = useVbenVxeGrid({ { field: 'createTime', title: '创建时间', - width: 180, formatter: 'formatDateTime', }, { field: 'creatorName', title: '跟进人' }, @@ -95,7 +94,6 @@ const [Grid, gridApi] = useVbenVxeGrid({ { field: 'nextTime', title: '下次联系时间', - width: 180, formatter: 'formatDateTime', }, { @@ -113,11 +111,10 @@ const [Grid, gridApi] = useVbenVxeGrid({ { field: 'actions', title: '操作', - width: 100, slots: { default: 'actions' }, }, ], - height: 'auto', + height: 600, keepSource: true, proxyConfig: { ajax: { @@ -149,7 +146,7 @@ watch( diff --git a/apps/web-antd/src/views/crm/permission/modules/permission-list.vue b/apps/web-antd/src/views/crm/permission/modules/permission-list.vue index 4871f7aa5..c928efc47 100644 --- a/apps/web-antd/src/views/crm/permission/modules/permission-list.vue +++ b/apps/web-antd/src/views/crm/permission/modules/permission-list.vue @@ -102,7 +102,6 @@ function handleDelete() { content: `你要将${checkedRows.value.map((item) => item.nickname).join(',')}移出团队吗?`, }) .then(async () => { - // 更新用户状态 const res = await deletePermissionBatch( checkedRows.value.map((item) => item.id as number), );