From 91a9c508a0909a83388587bc78c5d378a591150b Mon Sep 17 00:00:00 2001 From: xingyu4j Date: Thu, 5 Jun 2025 20:34:06 +0800 Subject: [PATCH] feat: crm detail --- apps/web-antd/src/api/crm/receivable/index.ts | 17 +- apps/web-antd/src/views/crm/backlog/index.vue | 2 - .../crm/business/modules/detail-info.vue | 2 - .../views/crm/clue/modules/detail-info.vue | 2 - .../views/crm/contact/modules/detail-info.vue | 2 - .../crm/contract/modules/detail-info.vue | 2 - .../crm/customer/modules/detail-info.vue | 2 - .../permission/modules/permission-list.vue | 2 - .../crm/permission/modules/transfer-form.vue | 2 - .../views/crm/product/modules/detail-info.vue | 2 - .../web-antd/src/views/crm/receivable/data.ts | 154 +++++++++++++++++ .../crm/receivable/modules/detail-info.vue | 42 ++++- .../crm/receivable/modules/detail-list.vue | 157 +++++++++++++++++- .../views/crm/receivable/modules/detail.vue | 140 +++++++++++++++- 14 files changed, 500 insertions(+), 28 deletions(-) diff --git a/apps/web-antd/src/api/crm/receivable/index.ts b/apps/web-antd/src/api/crm/receivable/index.ts index 96936c910..8a10c7390 100644 --- a/apps/web-antd/src/api/crm/receivable/index.ts +++ b/apps/web-antd/src/api/crm/receivable/index.ts @@ -34,10 +34,21 @@ export namespace CrmReceivableApi { createTime: Date; // 创建时间 updateTime: Date; // 更新时间 } + + export interface ReceivablePageParam extends PageParam { + no?: string; + planId?: number; + customerId?: number; + contractId?: number; + sceneType?: number; + auditStatus?: number; + } } /** 查询回款列表 */ -export function getReceivablePage(params: PageParam) { +export function getReceivablePage( + params: CrmReceivableApi.ReceivablePageParam, +) { return requestClient.get>( '/crm/receivable/page', { params }, @@ -45,7 +56,9 @@ export function getReceivablePage(params: PageParam) { } /** 查询回款列表,基于指定客户 */ -export function getReceivablePageByCustomer(params: PageParam) { +export function getReceivablePageByCustomer( + params: CrmReceivableApi.ReceivablePageParam, +) { return requestClient.get>( '/crm/receivable/page-by-customer', { params }, diff --git a/apps/web-antd/src/views/crm/backlog/index.vue b/apps/web-antd/src/views/crm/backlog/index.vue index 1173703e7..f1e45938f 100644 --- a/apps/web-antd/src/views/crm/backlog/index.vue +++ b/apps/web-antd/src/views/crm/backlog/index.vue @@ -21,8 +21,6 @@ import CustomerTodayContactList from './modules/customer-today-contact-list.vue' import ReceivableAuditList from './modules/receivable-audit-list.vue'; import ReceivablePlanRemindList from './modules/receivable-plan-remind-list.vue'; -defineOptions({ name: 'CrmBacklog' }); - const leftMenu = ref('customerTodayContact'); const clueFollowCount = ref(0); diff --git a/apps/web-antd/src/views/crm/business/modules/detail-info.vue b/apps/web-antd/src/views/crm/business/modules/detail-info.vue index a583db684..2728d32c3 100644 --- a/apps/web-antd/src/views/crm/business/modules/detail-info.vue +++ b/apps/web-antd/src/views/crm/business/modules/detail-info.vue @@ -8,8 +8,6 @@ import { useFollowUpDetailSchema } from '#/views/crm/followup/data'; import { useDetailBaseSchema } from '../data'; -defineOptions({ name: 'CrmCustomerDetailsInfo' }); - defineProps<{ business: CrmBusinessApi.Business; // 商机信息 }>(); diff --git a/apps/web-antd/src/views/crm/clue/modules/detail-info.vue b/apps/web-antd/src/views/crm/clue/modules/detail-info.vue index 6abc70a99..2e9c68c00 100644 --- a/apps/web-antd/src/views/crm/clue/modules/detail-info.vue +++ b/apps/web-antd/src/views/crm/clue/modules/detail-info.vue @@ -8,8 +8,6 @@ import { useFollowUpDetailSchema } from '#/views/crm/followup/data'; import { useDetailBaseSchema } from '../data'; -defineOptions({ name: 'CrmClueDetailsInfo' }); - defineProps<{ clue: CrmClueApi.Clue; // 线索信息 }>(); diff --git a/apps/web-antd/src/views/crm/contact/modules/detail-info.vue b/apps/web-antd/src/views/crm/contact/modules/detail-info.vue index bf0532c80..9ca08aaa7 100644 --- a/apps/web-antd/src/views/crm/contact/modules/detail-info.vue +++ b/apps/web-antd/src/views/crm/contact/modules/detail-info.vue @@ -8,8 +8,6 @@ import { useFollowUpDetailSchema } from '#/views/crm/followup/data'; import { useDetailBaseSchema } from '../data'; -defineOptions({ name: 'CrmContactDetailsInfo' }); - defineProps<{ contact: CrmContactApi.Contact; // 联系人信息 }>(); diff --git a/apps/web-antd/src/views/crm/contract/modules/detail-info.vue b/apps/web-antd/src/views/crm/contract/modules/detail-info.vue index da17394b4..f3b879888 100644 --- a/apps/web-antd/src/views/crm/contract/modules/detail-info.vue +++ b/apps/web-antd/src/views/crm/contract/modules/detail-info.vue @@ -8,8 +8,6 @@ import { useFollowUpDetailSchema } from '#/views/crm/followup/data'; import { useDetailBaseSchema } from '../data'; -defineOptions({ name: 'CrmContractDetailsInfo' }); - defineProps<{ contract: CrmContractApi.Contract; // 合同信息 }>(); diff --git a/apps/web-antd/src/views/crm/customer/modules/detail-info.vue b/apps/web-antd/src/views/crm/customer/modules/detail-info.vue index 12b2526d2..23fa189dc 100644 --- a/apps/web-antd/src/views/crm/customer/modules/detail-info.vue +++ b/apps/web-antd/src/views/crm/customer/modules/detail-info.vue @@ -8,8 +8,6 @@ import { useFollowUpDetailSchema } from '#/views/crm/followup/data'; import { useDetailBaseSchema } from '../data'; -defineOptions({ name: 'CrmCustomerDetailsInfo' }); - defineProps<{ customer: CrmCustomerApi.Customer; // 客户信息 }>(); 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 c928efc47..68181af94 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 @@ -21,8 +21,6 @@ import { $t } from '#/locales'; import { useGridColumns } from './data'; import Form from './permission-form.vue'; -defineOptions({ name: 'CrmPermissionList' }); - const props = defineProps<{ bizId: number; // 模块数据编号 bizType: number; // 模块类型 diff --git a/apps/web-antd/src/views/crm/permission/modules/transfer-form.vue b/apps/web-antd/src/views/crm/permission/modules/transfer-form.vue index d68a38f0a..9249fc62d 100644 --- a/apps/web-antd/src/views/crm/permission/modules/transfer-form.vue +++ b/apps/web-antd/src/views/crm/permission/modules/transfer-form.vue @@ -18,8 +18,6 @@ import { $t } from '#/locales'; import { useTransferFormSchema } from './data'; -defineOptions({ name: 'CrmTransferForm' }); - const emit = defineEmits(['success']); const bizType = defineModel('bizType'); diff --git a/apps/web-antd/src/views/crm/product/modules/detail-info.vue b/apps/web-antd/src/views/crm/product/modules/detail-info.vue index b04519795..2d902c41f 100644 --- a/apps/web-antd/src/views/crm/product/modules/detail-info.vue +++ b/apps/web-antd/src/views/crm/product/modules/detail-info.vue @@ -5,8 +5,6 @@ import { useDescription } from '#/components/description'; import { useDetailBaseSchema } from '../data'; -defineOptions({ name: 'CrmProductDetailsInfo' }); - defineProps<{ product: CrmProductApi.Product; // 产品信息 }>(); diff --git a/apps/web-antd/src/views/crm/receivable/data.ts b/apps/web-antd/src/views/crm/receivable/data.ts index 1c33d1aec..5db99a20b 100644 --- a/apps/web-antd/src/views/crm/receivable/data.ts +++ b/apps/web-antd/src/views/crm/receivable/data.ts @@ -1,10 +1,17 @@ import type { VbenFormSchema } from '#/adapter/form'; import type { VxeTableGridOptions } from '#/adapter/vxe-table'; +import type { DescriptionItemSchema } from '#/components/description'; + +import { h } from 'vue'; + +import { formatDateTime } from '@vben/utils'; import { getContractSimpleList } from '#/api/crm/contract'; import { getCustomerSimpleList } from '#/api/crm/customer'; import { getReceivablePlanSimpleList } from '#/api/crm/receivable/plan'; import { getSimpleUserList } from '#/api/system/user'; +import { DictTag } from '#/components/dict-tag'; +import { erpPriceInputFormatter } from '#/utils'; import { DICT_TYPE, getDictOptions } from '#/utils/dict'; /** 新增/修改的表单 */ @@ -267,3 +274,150 @@ export function useGridColumns(): VxeTableGridOptions['columns'] { }, ]; } + +/** 详情页的字段 */ +export function useDetailSchema(): DescriptionItemSchema[] { + return [ + { + field: 'customerName', + label: '客户名称', + }, + { + field: 'totalPrice', + label: '合同金额', + content: (data) => erpPriceInputFormatter(data.totalPrice), + }, + { + field: 'returnTime', + label: '回款日期', + content: (data) => formatDateTime(data?.returnTime) as string, + }, + { + field: 'price', + label: '回款金额', + content: (data) => erpPriceInputFormatter(data.price), + }, + { + field: 'ownerUserName', + label: '负责人', + }, + ]; +} + +/** 详情页的基础字段 */ +export function useDetailBaseSchema(): DescriptionItemSchema[] { + return [ + { + field: 'no', + label: '回款编号', + }, + { + field: 'customerName', + label: '客户名称', + }, + { + field: 'contract', + label: '合同编号', + content: (data) => data?.contract?.no, + }, + { + field: 'returnTime', + label: '回款日期', + content: (data) => formatDateTime(data?.returnTime) as string, + }, + { + field: 'price', + label: '回款金额', + content: (data) => erpPriceInputFormatter(data.price), + }, + { + field: 'returnType', + label: '回款方式', + content: (data) => + h(DictTag, { + type: DICT_TYPE.CRM_RECEIVABLE_RETURN_TYPE, + value: data?.returnType, + }), + }, + { + field: 'remark', + label: '备注', + }, + ]; +} + +/** 详情列表的字段 */ +export function useDetailListColumns(): VxeTableGridOptions['columns'] { + return [ + { + title: '回款编号', + field: 'no', + minWidth: 150, + fixed: 'left', + }, + { + title: '客户名称', + field: 'customerName', + minWidth: 150, + }, + { + title: '合同编号', + field: 'contract', + minWidth: 150, + }, + { + title: '回款日期', + field: 'returnTime', + minWidth: 150, + formatter: 'formatDateTime', + }, + { + title: '回款金额(元)', + field: 'price', + minWidth: 150, + formatter: 'formatNumber', + }, + { + title: '回款方式', + field: 'returnType', + minWidth: 150, + cellRender: { + name: 'CellDict', + props: { type: DICT_TYPE.CRM_RECEIVABLE_RETURN_TYPE }, + }, + }, + { + title: '负责人', + field: 'ownerUserName', + minWidth: 150, + }, + { + title: '备注', + field: 'remark', + minWidth: 150, + }, + { + title: '合同金额(元)', + field: 'contract.totalPrice', + minWidth: 150, + formatter: 'formatNumber', + }, + { + title: '回款状态', + field: 'auditStatus', + minWidth: 100, + fixed: 'right', + cellRender: { + name: 'CellDict', + props: { type: DICT_TYPE.CRM_AUDIT_STATUS }, + }, + }, + { + title: '操作', + field: 'actions', + width: 130, + fixed: 'right', + slots: { default: 'actions' }, + }, + ]; +} diff --git a/apps/web-antd/src/views/crm/receivable/modules/detail-info.vue b/apps/web-antd/src/views/crm/receivable/modules/detail-info.vue index bac747f62..b22365cbc 100644 --- a/apps/web-antd/src/views/crm/receivable/modules/detail-info.vue +++ b/apps/web-antd/src/views/crm/receivable/modules/detail-info.vue @@ -1,4 +1,42 @@ - + + diff --git a/apps/web-antd/src/views/crm/receivable/modules/detail-list.vue b/apps/web-antd/src/views/crm/receivable/modules/detail-list.vue index d9444469c..0bcfacd6b 100644 --- a/apps/web-antd/src/views/crm/receivable/modules/detail-list.vue +++ b/apps/web-antd/src/views/crm/receivable/modules/detail-list.vue @@ -1,4 +1,157 @@ - + + diff --git a/apps/web-antd/src/views/crm/receivable/modules/detail.vue b/apps/web-antd/src/views/crm/receivable/modules/detail.vue index 99ad6b6f9..e22269557 100644 --- a/apps/web-antd/src/views/crm/receivable/modules/detail.vue +++ b/apps/web-antd/src/views/crm/receivable/modules/detail.vue @@ -1,7 +1,139 @@ - +