feat:【antd】【crm】商机状态的代码优化

This commit is contained in:
YunaiV
2025-09-28 23:00:40 +08:00
parent 9c564ea3af
commit 252b530526
3 changed files with 56 additions and 44 deletions

View File

@@ -21,6 +21,9 @@ export function useFormSchema(): VbenFormSchema[] {
label: '状态组名', label: '状态组名',
component: 'Input', component: 'Input',
rules: 'required', rules: 'required',
componentProps: {
placeholder: '请输入状态组名',
},
}, },
{ {
fieldName: 'deptIds', 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' },
},
];
}

View File

@@ -31,12 +31,16 @@ function handleCreate() {
formModalApi.setData(null).open(); formModalApi.setData(null).open();
} }
/** 编辑商机状态 */
function handleEdit(row: CrmBusinessStatusApi.BusinessStatus) {
formModalApi.setData(row).open();
}
/** 删除商机状态 */ /** 删除商机状态 */
async function handleDelete(row: CrmBusinessStatusApi.BusinessStatus) { async function handleDelete(row: CrmBusinessStatusApi.BusinessStatus) {
const hideLoading = message.loading({ const hideLoading = message.loading({
content: $t('ui.actionMessage.deleting', [row.name]), content: $t('ui.actionMessage.deleting', [row.name]),
duration: 0, duration: 0,
key: 'action_process_msg',
}); });
try { try {
await deleteBusinessStatus(row.id as number); 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({ const [Grid, gridApi] = useVbenVxeGrid({
gridOptions: { gridOptions: {
columns: useGridColumns(), columns: useGridColumns(),
@@ -70,6 +69,7 @@ const [Grid, gridApi] = useVbenVxeGrid({
}, },
rowConfig: { rowConfig: {
keyField: 'id', keyField: 'id',
isHover: true,
}, },
toolbarConfig: { toolbarConfig: {
refresh: true, refresh: true,

View File

@@ -17,7 +17,7 @@ import {
} from '#/api/crm/business/status'; } from '#/api/crm/business/status';
import { $t } from '#/locales'; import { $t } from '#/locales';
import { useFormSchema } from '../data'; import { useFormColumns, useFormSchema } from '../data';
const emit = defineEmits(['success']); const emit = defineEmits(['success']);
const formData = ref<CrmBusinessStatusApi.BusinessStatus>(); const formData = ref<CrmBusinessStatusApi.BusinessStatus>();
@@ -72,7 +72,6 @@ const [Modal, modalApi] = useVbenModal({
} }
// 加载数据 // 加载数据
const data = modalApi.getData<CrmBusinessStatusApi.BusinessStatus>(); const data = modalApi.getData<CrmBusinessStatusApi.BusinessStatus>();
modalApi.lock(); modalApi.lock();
try { try {
if (!data || !data.id) { if (!data || !data.id) {
@@ -82,20 +81,19 @@ const [Modal, modalApi] = useVbenModal({
deptIds: [], deptIds: [],
statuses: [], statuses: [],
}; };
addStatus(); await handleAddStatus();
} else { } else {
formData.value = await getBusinessStatus(data.id); formData.value = await getBusinessStatus(data.id);
if ( if (
!formData.value?.statuses?.length || !formData.value?.statuses?.length ||
formData.value?.statuses?.length === 0 formData.value?.statuses?.length === 0
) { ) {
addStatus(); await handleAddStatus();
} }
} }
// 设置到 values // 设置到 values
await formApi.setValues(formData.value as any); await formApi.setValues(formData.value as any);
gridApi.grid.reloadData( await gridApi.grid.reloadData(
(formData.value!.statuses = (formData.value!.statuses =
formData.value?.statuses?.concat(DEFAULT_STATUSES)) as any, 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({ formData.value!.statuses!.unshift({
name: '', name: '',
percent: undefined, percent: undefined,
} as any); } as any);
await nextTick(); 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) { async function deleteStatusArea(row: any, rowIndex: number) {
gridApi.grid.remove(row); await gridApi.grid.remove(row);
formData.value!.statuses!.splice(rowIndex, 1); 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', trigger: 'click',
mode: 'cell', mode: 'cell',
}, },
columns: [ columns: useFormColumns(),
{
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' },
},
],
data: formData.value?.statuses?.concat(DEFAULT_STATUSES), data: formData.value?.statuses?.concat(DEFAULT_STATUSES),
border: true, border: true,
showOverflow: true, showOverflow: true,
@@ -162,6 +135,7 @@ const [Grid, gridApi] = useVbenVxeGrid({
keepSource: true, keepSource: true,
rowConfig: { rowConfig: {
keyField: 'row_id', keyField: 'row_id',
isHover: true,
}, },
pagerConfig: { pagerConfig: {
enabled: false, enabled: false,
@@ -184,7 +158,11 @@ const [Grid, gridApi] = useVbenVxeGrid({
</span> </span>
</template> </template>
<template #name="{ row }"> <template #name="{ row }">
<Input v-if="!row.endStatus" v-model:value="row.name" /> <Input
v-if="!row.endStatus"
v-model:value="row.name"
placeholder="请输入状态名"
/>
<span v-else>{{ row.name }}</span> <span v-else>{{ row.name }}</span>
</template> </template>
<template #percent="{ row }"> <template #percent="{ row }">
@@ -194,6 +172,7 @@ const [Grid, gridApi] = useVbenVxeGrid({
:min="0" :min="0"
:max="100" :max="100"
:precision="2" :precision="2"
placeholder="请输入赢单率"
/> />
<span v-else>{{ row.percent }}</span> <span v-else>{{ row.percent }}</span>
</template> </template>
@@ -204,7 +183,7 @@ const [Grid, gridApi] = useVbenVxeGrid({
label: $t('ui.actionTitle.create'), label: $t('ui.actionTitle.create'),
type: 'link', type: 'link',
ifShow: () => !row.endStatus, ifShow: () => !row.endStatus,
onClick: addStatus, onClick: handleAddStatus,
}, },
{ {
label: $t('common.delete'), label: $t('common.delete'),