feat:【antd】【crm】调整操作日志和团队成员的标签顺序,优化表单字段的规则和属性

This commit is contained in:
YunaiV
2025-09-30 19:42:20 +08:00
parent 0f6868febf
commit 9e6d8ff3e9
16 changed files with 168 additions and 95 deletions

View File

@@ -98,7 +98,6 @@ export function useFormSchema(): VbenFormSchema[] {
fieldName: 'dealTime',
label: '预计成交日期',
component: 'DatePicker',
rules: 'required',
componentProps: {
showTime: false,
format: 'YYYY-MM-DD HH:mm:ss',
@@ -123,6 +122,7 @@ export function useFormSchema(): VbenFormSchema[] {
componentProps: {
min: 0,
precision: 2,
disabled: true,
placeholder: '请输入产品总金额',
},
rules: z.number().min(0).optional().default(0),

View File

@@ -165,7 +165,10 @@ onMounted(() => {
:biz-type="BizTypeEnum.CRM_BUSINESS"
/>
</Tabs.TabPane>
<Tabs.TabPane tab="团队成员" key="6" :force-render="true">
<Tabs.TabPane tab="操作日志" key="6" :force-render="true">
<OperateLog :log-list="logList" />
</Tabs.TabPane>
<Tabs.TabPane tab="团队成员" key="7" :force-render="true">
<PermissionList
ref="permissionListRef"
:biz-id="businessId"
@@ -174,9 +177,6 @@ onMounted(() => {
@quit-team="handleBack"
/>
</Tabs.TabPane>
<Tabs.TabPane tab="操作日志" key="7" :force-render="true">
<OperateLog :log-list="logList" />
</Tabs.TabPane>
</Tabs>
</Card>
</Page>

View File

@@ -29,7 +29,7 @@ export function useFormSchema(): VbenFormSchema[] {
rules: 'required',
componentProps: {
placeholder: '请输入联系人姓名',
},
},
},
{
fieldName: 'ownerUserId',
@@ -66,7 +66,7 @@ export function useFormSchema(): VbenFormSchema[] {
component: 'Input',
componentProps: {
placeholder: '请输入手机号',
},
},
},
{
fieldName: 'telephone',
@@ -74,7 +74,7 @@ export function useFormSchema(): VbenFormSchema[] {
component: 'Input',
componentProps: {
placeholder: '请输入电话',
},
},
},
{
fieldName: 'email',
@@ -82,7 +82,7 @@ export function useFormSchema(): VbenFormSchema[] {
component: 'Input',
componentProps: {
placeholder: '请输入邮箱',
},
},
},
{
fieldName: 'wechat',
@@ -90,7 +90,7 @@ export function useFormSchema(): VbenFormSchema[] {
component: 'Input',
componentProps: {
placeholder: '请输入微信',
},
},
},
{
fieldName: 'qq',
@@ -98,7 +98,7 @@ export function useFormSchema(): VbenFormSchema[] {
component: 'Input',
componentProps: {
placeholder: '请输入QQ',
},
},
},
{
fieldName: 'post',
@@ -106,7 +106,7 @@ export function useFormSchema(): VbenFormSchema[] {
component: 'Input',
componentProps: {
placeholder: '请输入职位',
},
},
},
{
fieldName: 'master',
@@ -115,7 +115,7 @@ export function useFormSchema(): VbenFormSchema[] {
componentProps: {
options: getDictOptions(DICT_TYPE.INFRA_BOOLEAN_STRING, 'boolean'),
placeholder: '请选择是否关键决策人',
buttonStyle: 'solid',
buttonStyle: 'solid',
optionType: 'button',
},
defaultValue: false,
@@ -127,7 +127,7 @@ export function useFormSchema(): VbenFormSchema[] {
componentProps: {
options: getDictOptions(DICT_TYPE.SYSTEM_USER_SEX, 'number'),
placeholder: '请选择性别',
},
},
},
{
fieldName: 'parentId',
@@ -158,7 +158,7 @@ export function useFormSchema(): VbenFormSchema[] {
component: 'Input',
componentProps: {
placeholder: '请输入详细地址',
},
},
},
{
fieldName: 'contactNextTime',
@@ -169,7 +169,7 @@ export function useFormSchema(): VbenFormSchema[] {
format: 'YYYY-MM-DD HH:mm:ss',
valueFormat: 'x',
placeholder: '请选择下次联系时间',
},
},
},
{
fieldName: 'remark',
@@ -177,7 +177,7 @@ export function useFormSchema(): VbenFormSchema[] {
component: 'Textarea',
componentProps: {
placeholder: '请输入备注',
},
},
},
];
}
@@ -196,7 +196,7 @@ export function useGridFormSchema(): VbenFormSchema[] {
value: 'id',
},
placeholder: '请选择客户',
},
},
},
{
fieldName: 'name',
@@ -205,7 +205,7 @@ export function useGridFormSchema(): VbenFormSchema[] {
componentProps: {
placeholder: '请输入联系人姓名',
allowClear: true,
},
},
},
{
fieldName: 'mobile',
@@ -214,7 +214,7 @@ export function useGridFormSchema(): VbenFormSchema[] {
componentProps: {
placeholder: '请输入手机号',
allowClear: true,
},
},
},
{
fieldName: 'telephone',
@@ -223,7 +223,7 @@ export function useGridFormSchema(): VbenFormSchema[] {
componentProps: {
placeholder: '请输入电话',
allowClear: true,
},
},
},
{
fieldName: 'wechat',
@@ -232,7 +232,7 @@ export function useGridFormSchema(): VbenFormSchema[] {
componentProps: {
placeholder: '请输入微信',
allowClear: true,
},
},
},
{
fieldName: 'email',
@@ -241,7 +241,7 @@ export function useGridFormSchema(): VbenFormSchema[] {
componentProps: {
placeholder: '请输入电子邮箱',
allowClear: true,
},
},
},
];
}

View File

@@ -11,7 +11,7 @@ import { DictTag } from '#/components/dict-tag';
export function useDetailSchema(): DescriptionItemSchema[] {
return [
{
field: 'name',
field: 'customerName',
label: '客户名称',
},
{
@@ -24,7 +24,7 @@ export function useDetailSchema(): DescriptionItemSchema[] {
},
{
field: 'createTime',
label: '下次联系时间',
label: '创建时间',
content: (data) => formatDateTime(data?.createTime) as string,
},
];
@@ -64,10 +64,11 @@ export function useDetailBaseSchema(): DescriptionItemSchema[] {
{
field: 'areaName',
label: '地址',
},
{
field: 'detailAddress',
label: '详细地址',
content: (data) => {
const areaName = data?.areaName ?? '';
const detailAddress = data?.detailAddress ?? '';
return [areaName, detailAddress].filter(Boolean).join(' ');
},
},
{
field: 'post',

View File

@@ -134,7 +134,10 @@ onMounted(() => {
<Tabs.TabPane tab="详细资料" key="2" :force-render="true">
<Info :contact="contact" />
</Tabs.TabPane>
<Tabs.TabPane tab="团队成员" key="3" :force-render="true">
<Tabs.TabPane tab="操作日志" key="3" :force-render="true">
<OperateLog :log-list="logList" />
</Tabs.TabPane>
<Tabs.TabPane tab="团队成员" key="4" :force-render="true">
<PermissionList
ref="permissionListRef"
:biz-id="contactId"
@@ -143,7 +146,7 @@ onMounted(() => {
@quit-team="handleBack"
/>
</Tabs.TabPane>
<Tabs.TabPane tab="商机" key="4" :force-render="true">
<Tabs.TabPane tab="商机" key="5" :force-render="true">
<BusinessDetailsList
:biz-id="contactId"
:biz-type="BizTypeEnum.CRM_CONTACT"
@@ -151,9 +154,6 @@ onMounted(() => {
:customer-id="contact.customerId"
/>
</Tabs.TabPane>
<Tabs.TabPane tab="操作日志" key="5" :force-render="true">
<OperateLog :log-list="logList" />
</Tabs.TabPane>
</Tabs>
</Card>
</Page>

View File

@@ -130,10 +130,10 @@ onMounted(() => {
</Card>
<Card class="mt-4 min-h-[60%]">
<Tabs>
<Tabs.TabPane tab="合同跟进" key="1" :force-render="true">
<Tabs.TabPane tab="跟进记录" key="1" :force-render="true">
<FollowUp :biz-id="contractId" :biz-type="BizTypeEnum.CRM_CONTRACT" />
</Tabs.TabPane>
<Tabs.TabPane tab="详细资料" key="2" :force-render="true">
<Tabs.TabPane tab="基本信息" key="2" :force-render="true">
<ContractDetailsInfo :contract="contract" />
</Tabs.TabPane>
<Tabs.TabPane tab="产品" key="3" :force-render="true">

View File

@@ -53,6 +53,10 @@ export function useDetailSchema(): DescriptionItemSchema[] {
label: '成交状态',
content: (data) => (data.dealStatus ? '已成交' : '未成交'),
},
{
field: 'ownerUserName',
label: '负责人',
},
{
field: 'createTime',
label: '创建时间',
@@ -92,10 +96,11 @@ export function useDetailBaseSchema(): DescriptionItemSchema[] {
{
field: 'areaName',
label: '地址',
},
{
field: 'detailAddress',
label: '详细地址',
content: (data) => {
const areaName = data?.areaName ?? '';
const detailAddress = data?.detailAddress ?? '';
return [areaName, detailAddress].filter(Boolean).join(' ');
},
},
{
field: 'qq',
@@ -114,12 +119,6 @@ export function useDetailBaseSchema(): DescriptionItemSchema[] {
value: data?.industryId,
}),
},
{
field: 'level',
label: '客户级别',
content: (data) =>
h(DictTag, { type: DICT_TYPE.CRM_CUSTOMER_LEVEL, value: data?.level }),
},
{
field: 'contactNextTime',
label: '下次联系时间',

View File

@@ -279,7 +279,7 @@ onMounted(() => {
<Tabs.TabPane tab="跟进记录" key="1" :force-render="true">
<FollowUp :biz-id="customerId" :biz-type="BizTypeEnum.CRM_CUSTOMER" />
</Tabs.TabPane>
<Tabs.TabPane tab="详细资料" key="2" :force-render="true">
<Tabs.TabPane tab="基本信息" key="2" :force-render="true">
<Info :customer="customer" />
</Tabs.TabPane>
<Tabs.TabPane tab="联系人" key="3" :force-render="true">

View File

@@ -22,7 +22,7 @@ export function useDetailSchema(): DescriptionItemSchema[] {
},
{
field: 'price',
label: '产品价格',
label: '产品价格(元)',
content: (data) => erpPriceInputFormatter(data.price),
},
{

View File

@@ -64,6 +64,7 @@ export function useFormSchema(): VbenFormSchema[] {
placeholder: '请选择客户',
},
},
// TODO @AI这里的合同名称不对
{
fieldName: 'contractId',
label: '合同名称',
@@ -121,14 +122,12 @@ export function useFormSchema(): VbenFormSchema[] {
},
},
{
fieldName: 'returnTime',
label: '回款日期',
component: 'DatePicker',
fieldName: 'returnType',
label: '回款方式',
component: 'Select',
componentProps: {
placeholder: '请选择回款日期',
showTime: false,
valueFormat: 'x',
format: 'YYYY-MM-DD',
options: getDictOptions(DICT_TYPE.CRM_RECEIVABLE_RETURN_TYPE, 'number'),
placeholder: '请选择回款方式',
},
},
{
@@ -143,13 +142,15 @@ export function useFormSchema(): VbenFormSchema[] {
},
},
{
fieldName: 'returnType',
label: '回款方式',
component: 'Select',
fieldName: 'returnTime',
label: '回款日期',
component: 'DatePicker',
rules: 'required',
componentProps: {
options: getDictOptions(DICT_TYPE.CRM_RECEIVABLE_RETURN_TYPE, 'number'),
placeholder: '请选择回款方式',
placeholder: '请选择回款日期',
showTime: false,
valueFormat: 'x',
format: 'YYYY-MM-DD',
},
},
{
@@ -160,6 +161,7 @@ export function useFormSchema(): VbenFormSchema[] {
placeholder: '请输入备注',
rows: 4,
},
formItemClass: 'md:col-span-2',
},
];
}

View File

@@ -16,8 +16,9 @@ export function useDetailSchema(): DescriptionItemSchema[] {
},
{
field: 'totalPrice',
label: '合同金额',
content: (data) => erpPriceInputFormatter(data.totalPrice),
label: '合同金额(元)',
content: (data) =>
erpPriceInputFormatter(data?.contract?.totalPrice ?? data.totalPrice),
},
{
field: 'returnTime',
@@ -26,7 +27,7 @@ export function useDetailSchema(): DescriptionItemSchema[] {
},
{
field: 'price',
label: '回款金额',
label: '回款金额(元)',
content: (data) => erpPriceInputFormatter(data.price),
},
{
@@ -77,3 +78,27 @@ export function useDetailBaseSchema(): DescriptionItemSchema[] {
},
];
}
/** 系统信息字段 */
export function useDetailSystemSchema(): DescriptionItemSchema[] {
return [
{
field: 'ownerUserName',
label: '负责人',
},
{
field: 'creatorName',
label: '创建人',
},
{
field: 'createTime',
label: '创建时间',
content: (data) => formatDateTime(data?.createTime) as string,
},
{
field: 'updateTime',
label: '更新时间',
content: (data) => formatDateTime(data?.updateTime) as string,
},
];
}

View File

@@ -114,7 +114,10 @@ onMounted(() => {
<Tabs.TabPane tab="详细资料" key="1" :force-render="true">
<Info :receivable="receivable" />
</Tabs.TabPane>
<Tabs.TabPane tab="团队成员" key="2" :force-render="true">
<Tabs.TabPane tab="操作日志" key="2" :force-render="true">
<OperateLog :log-list="logList" />
</Tabs.TabPane>
<Tabs.TabPane tab="团队成员" key="3" :force-render="true">
<PermissionList
ref="permissionListRef"
:biz-id="receivableId"
@@ -123,9 +126,6 @@ onMounted(() => {
@quit-team="handleBack"
/>
</Tabs.TabPane>
<Tabs.TabPane tab="操作日志" key="3" :force-render="true">
<OperateLog :log-list="logList" />
</Tabs.TabPane>
</Tabs>
</Card>
</Page>

View File

@@ -4,9 +4,8 @@ import type { CrmReceivableApi } from '#/api/crm/receivable';
import { Divider } from 'ant-design-vue';
import { useDescription } from '#/components/description';
import { useFollowUpDetailSchema } from '#/views/crm/followup/data';
import { useDetailBaseSchema } from '../data';
import { useDetailBaseSchema, useDetailSystemSchema } from '../data';
defineProps<{
receivable: CrmReceivableApi.Receivable; // 收款信息
@@ -29,7 +28,7 @@ const [SystemDescriptions] = useDescription({
column: 3,
class: 'mx-4',
},
schema: useFollowUpDetailSchema(),
schema: useDetailSystemSchema(),
});
</script>

View File

@@ -15,23 +15,24 @@ export function useDetailSchema(): DescriptionItemSchema[] {
label: '客户名称',
},
{
field: 'totalPrice',
label: '合同金额',
content: (data) => erpPriceInputFormatter(data.totalPrice),
},
{
field: 'returnTime',
label: '回款日期',
content: (data) => formatDateTime(data?.returnTime) as string,
field: 'contractNo',
label: '合同编号',
},
{
field: 'price',
label: '回款金额',
label: '计划回款金额',
content: (data) => erpPriceInputFormatter(data.price),
},
{
field: 'ownerUserName',
label: '负责人',
field: 'returnTime',
label: '计划回款日期',
content: (data) => formatDateTime(data?.returnTime) as string,
},
{
field: 'receivable',
label: '实际回款金额',
content: (data) =>
erpPriceInputFormatter(data?.receivable?.price ?? 0),
},
];
}
@@ -40,40 +41,87 @@ export function useDetailSchema(): DescriptionItemSchema[] {
export function useDetailBaseSchema(): DescriptionItemSchema[] {
return [
{
field: 'no',
label: '回款编号',
field: 'period',
label: '期数',
},
{
field: 'customerName',
label: '客户名称',
},
{
field: 'contract',
field: 'contractNo',
label: '合同编号',
content: (data) => data?.contract?.no,
},
{
field: 'returnTime',
label: '回款日期',
label: '计划回款日期',
content: (data) => formatDateTime(data?.returnTime) as string,
},
{
field: 'price',
label: '回款金额',
label: '计划回款金额',
content: (data) => erpPriceInputFormatter(data.price),
},
{
field: 'returnType',
label: '回款方式',
label: '计划回款方式',
content: (data) =>
h(DictTag, {
type: DICT_TYPE.CRM_RECEIVABLE_RETURN_TYPE,
value: data?.returnType,
}),
},
{
field: 'remindDays',
label: '提前几天提醒',
},
{
field: 'receivable',
label: '实际回款金额',
content: (data) =>
erpPriceInputFormatter(data?.receivable?.price ?? 0),
},
{
field: 'receivableRemain',
label: '未回款金额',
content: (data) => {
const paid = data?.receivable?.price ?? 0;
return erpPriceInputFormatter(Math.max(data.price - paid, 0));
},
},
{
field: 'receivable.returnTime',
label: '实际回款日期',
content: (data) =>
formatDateTime(data?.receivable?.returnTime) as string,
},
{
field: 'remark',
label: '备注',
},
];
}
/** 系统信息字段 */
export function useDetailSystemSchema(): DescriptionItemSchema[] {
return [
{
field: 'ownerUserName',
label: '负责人',
},
{
field: 'creatorName',
label: '创建人',
},
{
field: 'createTime',
label: '创建时间',
content: (data) => formatDateTime(data?.createTime) as string,
},
{
field: 'updateTime',
label: '更新时间',
content: (data) => formatDateTime(data?.updateTime) as string,
},
];
}

View File

@@ -121,7 +121,10 @@ onMounted(() => {
<Tabs.TabPane tab="详细资料" key="1" :force-render="true">
<ReceivablePlanDetailsInfo :receivable-plan="receivablePlan" />
</Tabs.TabPane>
<Tabs.TabPane tab="团队成员" key="2" :force-render="true">
<Tabs.TabPane tab="操作日志" key="2" :force-render="true">
<OperateLog :log-list="logList" />
</Tabs.TabPane>
<Tabs.TabPane tab="团队成员" key="3" :force-render="true">
<PermissionList
ref="permissionListRef"
:biz-id="receivablePlanId"
@@ -130,9 +133,6 @@ onMounted(() => {
@quit-team="handleBack"
/>
</Tabs.TabPane>
<Tabs.TabPane tab="操作日志" key="3" :force-render="true">
<OperateLog :log-list="logList" />
</Tabs.TabPane>
</Tabs>
</Card>
</Page>

View File

@@ -4,9 +4,8 @@ import type { CrmReceivablePlanApi } from '#/api/crm/receivable/plan';
import { Divider } from 'ant-design-vue';
import { useDescription } from '#/components/description';
import { useFollowUpDetailSchema } from '#/views/crm/followup/data';
import { useDetailBaseSchema } from '../data';
import { useDetailBaseSchema, useDetailSystemSchema } from '../data';
defineProps<{
receivablePlan: CrmReceivablePlanApi.Plan; // 收款计划信息
@@ -29,7 +28,7 @@ const [SystemDescriptions] = useDescription({
column: 3,
class: 'mx-4',
},
schema: useFollowUpDetailSchema(),
schema: useDetailSystemSchema(),
});
</script>