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