From 27ed1e7f2dd9db7ed30053205d925b6456b7dd71 Mon Sep 17 00:00:00 2001
From: gaoluyang <2820782392@qq.com>
Date: 星期一, 20 七月 2026 13:41:18 +0800
Subject: [PATCH] 银川 1.商机管理详情页面新增合同逻辑修改 2.商机状态枚举值修改
---
src/views/crm/business/data.ts | 1
src/views/crm/business/detail/index.vue | 3 +
src/views/crm/contract/components/detail-list.vue | 12 +++
src/views/crm/business/detail/modules/status-form.vue | 6 -
src/api/crm/business/index.ts | 4 -
src/views/crm/business/detail/data.ts | 28 --------
src/views/crm/contract/data.ts | 14 ++++
src/views/crm/contract/modules/form.vue | 4 +
src/api/crm/business/status/index.ts | 25 --------
src/views/crm/business/index.vue | 21 ++++++
src/views/crm/business/status/data.ts | 7 +-
src/views/crm/business/status/modules/form.vue | 20 +-----
12 files changed, 62 insertions(+), 83 deletions(-)
diff --git a/src/api/crm/business/index.ts b/src/api/crm/business/index.ts
index 7da62ae..f30b5d3 100644
--- a/src/api/crm/business/index.ts
+++ b/src/api/crm/business/index.ts
@@ -21,7 +21,6 @@
statusTypeName?: string;
statusId: number;
statusName?: string;
- endStatus: number;
endRemark: string;
dealTime: Date;
totalProductPrice: number;
@@ -52,8 +51,7 @@
/** 鍟嗘満鏇存柊鐘舵�佽姹� */
export interface BusinessUpdateStatusReqVO {
id: number;
- statusId: number | undefined;
- endStatus: number | undefined;
+ statusId: number;
}
}
diff --git a/src/api/crm/business/status/index.ts b/src/api/crm/business/status/index.ts
index 0f6a812..b650079 100644
--- a/src/api/crm/business/status/index.ts
+++ b/src/api/crm/business/status/index.ts
@@ -19,32 +19,9 @@
id?: number;
name: string;
percent?: number;
- endStatus?: number;
- key?: string;
+ sort?: number;
}
}
-
-/** 榛樿鍟嗘満鐘舵�� */
-export const DEFAULT_STATUSES = [
- {
- endStatus: 1,
- key: '缁撴潫',
- name: '璧㈠崟',
- percent: 100,
- },
- {
- endStatus: 2,
- key: '缁撴潫',
- name: '杈撳崟',
- percent: 0,
- },
- {
- endStatus: 3,
- key: '缁撴潫',
- name: '鏃犳晥',
- percent: 0,
- },
-] satisfies CrmBusinessStatusApi.BusinessStatusType[];
/** 鏌ヨ鍟嗘満鐘舵�佺粍鍒楄〃 */
export function getBusinessStatusPage(params: PageParam) {
diff --git a/src/views/crm/business/data.ts b/src/views/crm/business/data.ts
index 5dd221d..2b07d09 100644
--- a/src/views/crm/business/data.ts
+++ b/src/views/crm/business/data.ts
@@ -265,6 +265,7 @@
title: '鍟嗘満闃舵',
fixed: 'right',
width: 120,
+ slots: { default: 'statusName' },
},
{
title: '鎿嶄綔',
diff --git a/src/views/crm/business/detail/data.ts b/src/views/crm/business/detail/data.ts
index 1cb1c49..78272d2 100644
--- a/src/views/crm/business/detail/data.ts
+++ b/src/views/crm/business/detail/data.ts
@@ -7,7 +7,6 @@
import { erpPriceInputFormatter, formatDateTime } from '@vben/utils';
import {
- DEFAULT_STATUSES,
getBusinessStatusSimpleList,
} from '#/api/crm/business/status';
@@ -95,24 +94,6 @@
},
{
fieldName: 'statusId',
- label: '鍟嗘満鐘舵��',
- component: 'Input',
- dependencies: {
- triggerFields: [''],
- show: () => false,
- },
- },
- {
- fieldName: 'endStatus',
- label: '鍟嗘満鐘舵��',
- component: 'Input',
- dependencies: {
- triggerFields: [''],
- show: () => false,
- },
- },
- {
- fieldName: 'status',
label: '鍟嗘満闃舵',
component: 'Select',
dependencies: {
@@ -121,17 +102,12 @@
const statusList = await getBusinessStatusSimpleList(
formData.value?.statusTypeId ?? 0,
);
- const statusOptions = statusList.map((item) => ({
+ const options = statusList.map((item) => ({
label: `${item.name}(璧㈠崟鐜囷細${item.percent}%)`,
value: item.id,
}));
- const options = DEFAULT_STATUSES.map((item) => ({
- label: `${item.name}(璧㈠崟鐜囷細${item.percent}%)`,
- value: item.endStatus,
- }));
- statusOptions.push(...options);
return {
- options: statusOptions,
+ options,
};
},
},
diff --git a/src/views/crm/business/detail/index.vue b/src/views/crm/business/detail/index.vue
index 92e5f44..258d021 100644
--- a/src/views/crm/business/detail/index.vue
+++ b/src/views/crm/business/detail/index.vue
@@ -160,6 +160,9 @@
<ContractDetailsList
:biz-id="businessId"
:biz-type="BizTypeEnum.CRM_BUSINESS"
+ :customer-id="business.customerId"
+ :customer-name="business.customerName"
+ :business-name="business.name"
/>
</Tabs.TabPane>
<Tabs.TabPane tab="鎿嶄綔鏃ュ織" key="6" :force-render="true">
diff --git a/src/views/crm/business/detail/modules/status-form.vue b/src/views/crm/business/detail/modules/status-form.vue
index fefb07e..483110f 100644
--- a/src/views/crm/business/detail/modules/status-form.vue
+++ b/src/views/crm/business/detail/modules/status-form.vue
@@ -40,13 +40,12 @@
// 鎻愪氦琛ㄥ崟
const data = (await formApi.getValues()) as CrmBusinessApi.Business;
try {
- if (!data.status) {
+ if (!data.statusId) {
return;
}
await updateBusinessStatus({
id: data.id,
- statusId: data.status > 0 ? data.status : undefined,
- endStatus: data.status < 0 ? -data.status : undefined,
+ statusId: data.statusId,
});
// 鍏抽棴骞舵彁绀�
await modalApi.close();
@@ -65,7 +64,6 @@
if (!data || !data.id) {
return;
}
- data.status = data.endStatus === null ? data.statusId : -data.endStatus;
formData.value = data;
modalApi.lock();
try {
diff --git a/src/views/crm/business/index.vue b/src/views/crm/business/index.vue
index 445bd7a..7125acc 100644
--- a/src/views/crm/business/index.vue
+++ b/src/views/crm/business/index.vue
@@ -8,7 +8,7 @@
import { Page, useVbenModal } from '@vben/common-ui';
import { downloadFileFromBlobPart } from '@vben/utils';
-import { Button, message, Tabs } from 'ant-design-vue';
+import { Button, message, Tabs, Tag } from 'ant-design-vue';
import { ACTION_ICON, TableAction, useVbenVxeGrid } from '#/adapter/vxe-table';
import {
@@ -23,6 +23,22 @@
const { push } = useRouter();
const sceneType = ref('1');
+
+const STATUS_COLORS: Record<string, string> = {
+ 鎷滆: 'default',
+ 鍒濇鎺ヨЕ: 'processing',
+ 闇�姹傜‘璁�: 'cyan',
+ 鏂规鎶ヤ环: 'orange',
+ 鍟嗗姟璋堝垽: 'volcano',
+ 鍚堝悓绛捐: 'success',
+ 璧㈠崟: 'success',
+ 杈撳崟: 'error',
+ 鏃犳晥: 'default',
+};
+
+function getStatusColor(name: string): string {
+ return STATUS_COLORS[name] || 'blue';
+}
const [FormModal, formModalApi] = useVbenModal({
connectedComponent: Form,
@@ -157,6 +173,9 @@
{{ row.customerName }}
</Button>
</template>
+ <template #statusName="{ row }">
+ <Tag v-if="row.statusName" :color="getStatusColor(row.statusName)">{{ row.statusName }}</Tag>
+ </template>
<template #actions="{ row }">
<TableAction
:actions="[
diff --git a/src/views/crm/business/status/data.ts b/src/views/crm/business/status/data.ts
index 1c92d63..6a6920f 100644
--- a/src/views/crm/business/status/data.ts
+++ b/src/views/crm/business/status/data.ts
@@ -85,10 +85,9 @@
export function useFormColumns(): VxeTableGridOptions['columns'] {
return [
{
- field: 'endStatus',
- title: '闃舵',
- minWidth: 100,
- slots: { default: 'endStatus' },
+ type: 'seq',
+ title: '搴忓彿',
+ width: 60,
},
{
field: 'name',
diff --git a/src/views/crm/business/status/modules/form.vue b/src/views/crm/business/status/modules/form.vue
index 480e078..8d54b03 100644
--- a/src/views/crm/business/status/modules/form.vue
+++ b/src/views/crm/business/status/modules/form.vue
@@ -11,7 +11,6 @@
import { TableAction, useVbenVxeGrid } from '#/adapter/vxe-table';
import {
createBusinessStatus,
- DEFAULT_STATUSES,
getBusinessStatus,
updateBusinessStatus,
} from '#/api/crm/business/status';
@@ -53,7 +52,6 @@
try {
if (formData.value?.statuses && formData.value.statuses.length > 0) {
data.statuses = formData.value.statuses;
- data.statuses.splice(-3, 3);
}
await (formData.value?.id
? updateBusinessStatus(data)
@@ -94,8 +92,7 @@
// 璁剧疆鍒� values
await formApi.setValues(formData.value as any);
await gridApi.grid.reloadData(
- (formData.value!.statuses =
- formData.value?.statuses?.concat(DEFAULT_STATUSES)) as any,
+ (formData.value!.statuses) as any,
);
} finally {
modalApi.unlock();
@@ -105,7 +102,7 @@
/** 娣诲姞鐘舵�� */
async function handleAddStatus() {
- formData.value!.statuses!.splice(-3, 0, {
+ formData.value!.statuses!.push({
name: '',
percent: undefined,
});
@@ -128,7 +125,7 @@
mode: 'cell',
},
columns: useFormColumns(),
- data: formData.value?.statuses?.concat(DEFAULT_STATUSES),
+ data: formData.value?.statuses,
border: true,
showOverflow: true,
autoResize: true,
@@ -152,29 +149,20 @@
<Form class="mx-4">
<template #statuses>
<Grid class="w-full">
- <template #endStatus="{ row, rowIndex }">
- <span>
- {{ row.endStatus ? '缁撴潫' : `闃舵${rowIndex + 1}` }}
- </span>
- </template>
<template #name="{ row }">
<Input
- v-if="!row.endStatus"
v-model:value="row.name"
placeholder="璇疯緭鍏ョ姸鎬佸悕"
/>
- <span v-else>{{ row.name }}</span>
</template>
<template #percent="{ row }">
<InputNumber
- v-if="!row.endStatus"
v-model:value="row.percent"
:min="0"
:max="100"
:precision="2"
placeholder="璇疯緭鍏ヨ耽鍗曠巼"
/>
- <span v-else>{{ row.percent }}</span>
</template>
<template #actions="{ row, rowIndex }">
<TableAction
@@ -182,14 +170,12 @@
{
label: $t('ui.actionTitle.create'),
type: 'link',
- ifShow: () => !row.endStatus,
onClick: handleAddStatus,
},
{
label: $t('common.delete'),
type: 'link',
danger: true,
- ifShow: () => !row.endStatus,
popConfirm: {
title: $t('ui.actionMessage.deleteConfirm', [row.name]),
confirm: deleteStatusArea.bind(null, row, rowIndex),
diff --git a/src/views/crm/contract/components/detail-list.vue b/src/views/crm/contract/components/detail-list.vue
index 69770c8..146efbf 100644
--- a/src/views/crm/contract/components/detail-list.vue
+++ b/src/views/crm/contract/components/detail-list.vue
@@ -24,6 +24,9 @@
const props = defineProps<{
bizId: number; // 涓氬姟缂栧彿
bizType: number; // 涓氬姟绫诲瀷
+ customerId?: number; // 瀹㈡埛缂栧彿锛堝晢鏈�/鑱旂郴浜鸿鎯呬紶鍏ワ級
+ customerName?: string; // 瀹㈡埛鍚嶇О锛堝晢鏈�/鑱旂郴浜鸿鎯呬紶鍏ワ級
+ businessName?: string; // 鍟嗘満鍚嶇О锛堝晢鏈鸿鎯呬紶鍏ワ級
}>();
const { push } = useRouter();
@@ -52,7 +55,12 @@
? {
customerId: props.bizId,
}
- : { businessId: props.bizId },
+ : {
+ businessId: props.bizId,
+ customerId: props.customerId,
+ customerName: props.customerName,
+ businessName: props.businessName,
+ },
)
.open();
}
@@ -77,7 +85,7 @@
customerId: props.bizId,
...formValues,
});
- } else if (props.bizType === BizTypeEnum.CRM_CONTACT) {
+ } else if (props.bizType === BizTypeEnum.CRM_BUSINESS) {
return await getContractPageByBusiness({
pageNo: page.currentPage,
pageSize: page.pageSize,
diff --git a/src/views/crm/contract/data.ts b/src/views/crm/contract/data.ts
index de4629d..5ea024f 100644
--- a/src/views/crm/contract/data.ts
+++ b/src/views/crm/contract/data.ts
@@ -66,6 +66,10 @@
componentProps: {
placeholder: '璇烽�夋嫨瀹㈡埛',
},
+ dependencies: {
+ triggerFields: ['customerId'],
+ disabled: (values) => !!values.customerId,
+ },
},
{
fieldName: 'orderDate',
@@ -88,9 +92,15 @@
placeholder: '璇烽�夋嫨鍟嗘満',
},
dependencies: {
- triggerFields: ['customerId'],
- disabled: (values) => !values.customerId,
+ triggerFields: ['customerId', 'businessId'],
+ disabled: (values) => !!values.businessId || !values.customerId,
async componentProps(values) {
+ if (values.businessId && values.businessName) {
+ return {
+ options: [{ label: values.businessName, value: values.businessId }],
+ placeholder: '璇烽�夋嫨鍟嗘満',
+ };
+ }
if (!values.customerId) {
return {
options: [],
diff --git a/src/views/crm/contract/modules/form.vue b/src/views/crm/contract/modules/form.vue
index fb37519..274cbef 100644
--- a/src/views/crm/contract/modules/form.vue
+++ b/src/views/crm/contract/modules/form.vue
@@ -90,6 +90,10 @@
// 鍔犺浇鏁版嵁
const data = modalApi.getData<CrmContractApi.Contract>();
if (!data || !data.id) {
+ // 鏂板鏃讹紝鍥炴樉浠庡晢鏈�/瀹㈡埛璇︽儏浼犲叆鐨勬暟鎹�
+ if (data) {
+ await formApi.setValues(data);
+ }
return;
}
modalApi.lock();
--
Gitblit v1.9.3