From 252b530526b8c1ef999147b0d185dd4532762e25 Mon Sep 17 00:00:00 2001 From: YunaiV Date: Sun, 28 Sep 2025 23:00:40 +0800 Subject: [PATCH] =?UTF-8?q?feat=EF=BC=9A=E3=80=90antd=E3=80=91=E3=80=90crm?= =?UTF-8?q?=E3=80=91=E5=95=86=E6=9C=BA=E7=8A=B6=E6=80=81=E7=9A=84=E4=BB=A3?= =?UTF-8?q?=E7=A0=81=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/views/crm/business/status/data.ts | 33 +++++++++++ .../src/views/crm/business/status/index.vue | 12 ++-- .../crm/business/status/modules/form.vue | 55 ++++++------------- 3 files changed, 56 insertions(+), 44 deletions(-) diff --git a/apps/web-antd/src/views/crm/business/status/data.ts b/apps/web-antd/src/views/crm/business/status/data.ts index 419dc511..86f20d81 100644 --- a/apps/web-antd/src/views/crm/business/status/data.ts +++ b/apps/web-antd/src/views/crm/business/status/data.ts @@ -21,6 +21,9 @@ export function useFormSchema(): VbenFormSchema[] { label: '状态组名', component: 'Input', rules: 'required', + componentProps: { + placeholder: '请输入状态组名', + }, }, { fieldName: 'deptIds', @@ -77,3 +80,33 @@ export function useGridColumns(): VxeTableGridOptions['columns'] { }, ]; } + +/** 商机状态阶段列表列配置 */ +export function useFormColumns(): VxeTableGridOptions['columns'] { + return [ + { + field: 'defaultStatus', + title: '阶段', + minWidth: 100, + slots: { default: 'defaultStatus' }, + }, + { + field: 'name', + title: '阶段名称', + minWidth: 100, + slots: { default: 'name' }, + }, + { + field: 'percent', + title: '赢单率(%)', + minWidth: 100, + slots: { default: 'percent' }, + }, + { + title: '操作', + width: 130, + fixed: 'right', + slots: { default: 'actions' }, + }, + ]; +} diff --git a/apps/web-antd/src/views/crm/business/status/index.vue b/apps/web-antd/src/views/crm/business/status/index.vue index 7b219f6d..670dc958 100644 --- a/apps/web-antd/src/views/crm/business/status/index.vue +++ b/apps/web-antd/src/views/crm/business/status/index.vue @@ -31,12 +31,16 @@ function handleCreate() { formModalApi.setData(null).open(); } +/** 编辑商机状态 */ +function handleEdit(row: CrmBusinessStatusApi.BusinessStatus) { + formModalApi.setData(row).open(); +} + /** 删除商机状态 */ async function handleDelete(row: CrmBusinessStatusApi.BusinessStatus) { const hideLoading = message.loading({ content: $t('ui.actionMessage.deleting', [row.name]), duration: 0, - key: 'action_process_msg', }); try { await deleteBusinessStatus(row.id as number); @@ -47,11 +51,6 @@ async function handleDelete(row: CrmBusinessStatusApi.BusinessStatus) { } } -/** 编辑商机状态 */ -function handleEdit(row: CrmBusinessStatusApi.BusinessStatus) { - formModalApi.setData(row).open(); -} - const [Grid, gridApi] = useVbenVxeGrid({ gridOptions: { columns: useGridColumns(), @@ -70,6 +69,7 @@ const [Grid, gridApi] = useVbenVxeGrid({ }, rowConfig: { keyField: 'id', + isHover: true, }, toolbarConfig: { refresh: true, diff --git a/apps/web-antd/src/views/crm/business/status/modules/form.vue b/apps/web-antd/src/views/crm/business/status/modules/form.vue index 933af133..601cb6bf 100644 --- a/apps/web-antd/src/views/crm/business/status/modules/form.vue +++ b/apps/web-antd/src/views/crm/business/status/modules/form.vue @@ -17,7 +17,7 @@ import { } from '#/api/crm/business/status'; import { $t } from '#/locales'; -import { useFormSchema } from '../data'; +import { useFormColumns, useFormSchema } from '../data'; const emit = defineEmits(['success']); const formData = ref(); @@ -72,7 +72,6 @@ const [Modal, modalApi] = useVbenModal({ } // 加载数据 const data = modalApi.getData(); - modalApi.lock(); try { if (!data || !data.id) { @@ -82,20 +81,19 @@ const [Modal, modalApi] = useVbenModal({ deptIds: [], statuses: [], }; - addStatus(); + await handleAddStatus(); } else { formData.value = await getBusinessStatus(data.id); if ( !formData.value?.statuses?.length || formData.value?.statuses?.length === 0 ) { - addStatus(); + await handleAddStatus(); } } // 设置到 values - await formApi.setValues(formData.value as any); - gridApi.grid.reloadData( + await gridApi.grid.reloadData( (formData.value!.statuses = formData.value?.statuses?.concat(DEFAULT_STATUSES)) as any, ); @@ -106,20 +104,20 @@ const [Modal, modalApi] = useVbenModal({ }); /** 添加状态 */ -async function addStatus() { +async function handleAddStatus() { formData.value!.statuses!.unshift({ name: '', percent: undefined, } as any); await nextTick(); - gridApi.grid.reloadData(formData.value!.statuses as any); + await gridApi.grid.reloadData(formData.value!.statuses as any); } /** 删除状态 */ async function deleteStatusArea(row: any, rowIndex: number) { - gridApi.grid.remove(row); + await gridApi.grid.remove(row); formData.value!.statuses!.splice(rowIndex, 1); - gridApi.grid.reloadData(formData.value!.statuses as any); + await gridApi.grid.reloadData(formData.value!.statuses as any); } /** 表格配置 */ @@ -129,32 +127,7 @@ const [Grid, gridApi] = useVbenVxeGrid({ trigger: 'click', mode: 'cell', }, - columns: [ - { - field: 'defaultStatus', - title: '阶段', - minWidth: 100, - slots: { default: 'defaultStatus' }, - }, - { - field: 'name', - title: '阶段名称', - minWidth: 100, - slots: { default: 'name' }, - }, - { - field: 'percent', - title: '赢单率(%)', - minWidth: 100, - slots: { default: 'percent' }, - }, - { - title: '操作', - width: 130, - fixed: 'right', - slots: { default: 'actions' }, - }, - ], + columns: useFormColumns(), data: formData.value?.statuses?.concat(DEFAULT_STATUSES), border: true, showOverflow: true, @@ -162,6 +135,7 @@ const [Grid, gridApi] = useVbenVxeGrid({ keepSource: true, rowConfig: { keyField: 'row_id', + isHover: true, }, pagerConfig: { enabled: false, @@ -184,7 +158,11 @@ const [Grid, gridApi] = useVbenVxeGrid({ @@ -204,7 +183,7 @@ const [Grid, gridApi] = useVbenVxeGrid({ label: $t('ui.actionTitle.create'), type: 'link', ifShow: () => !row.endStatus, - onClick: addStatus, + onClick: handleAddStatus, }, { label: $t('common.delete'),