fix(crm): 统一日期格式化并添加客户公海配置选项
- 将所有日期格式从 formatDateTime 替换为 formatDate 以保持一致性
- 在客户相关模块中添加 autoPoolEnabled 字段用于控制公海流入设置
- 更新 DatePicker 组件的时间显示格式为 YYYY-MM-DD
- 为操作日志组件添加日期格式化参数支持
- 在发票和回款详情页面应用新的日期格式化函数
| | |
| | | ownerUserDeptName?: string; // 负责人的部门名称 |
| | | lockStatus?: boolean; |
| | | dealStatus?: boolean; |
| | | autoPoolEnabled?: boolean; // 是否流入公海,关闭时取消公海可见度 |
| | | mobile: string; // 手机号 |
| | | telephone: string; // 电话 |
| | | qq: string; // QQ |
| | |
| | | |
| | | import { DICT_TYPE } from '@vben/constants'; |
| | | import { getDictLabel, getDictObj } from '@vben/hooks'; |
| | | import { formatDateTime } from '@vben/utils'; |
| | | import { formatDate } from '@vben/utils'; |
| | | |
| | | import { Tag, Timeline } from 'ant-design-vue'; |
| | | |
| | |
| | | |
| | | withDefaults(defineProps<OperateLogProps>(), { |
| | | logList: () => [], |
| | | dateFormat: 'YYYY-MM-DD HH:mm:ss', |
| | | }); |
| | | |
| | | /** 获得 userType 颜色 */ |
| | |
| | | </template> |
| | | <div class="ml-2 flex flex-wrap items-center gap-2 leading-[22px]"> |
| | | <span class="w-[140px] shrink-0 text-[13px] text-gray-400"> |
| | | {{ formatDateTime(log.createTime) }} |
| | | {{ formatDate(log.createTime, dateFormat) }} |
| | | </span> |
| | | <Tag color="success" class="!mr-0">{{ log.userName }}</Tag> |
| | | <span>{{ log.action }}</span> |
| | |
| | | import type { SystemOperateLogApi } from '#/api/system/operate-log'; |
| | | |
| | | export interface OperateLogProps { |
| | | /** 仅控制日期展示,不改变日志原始时间。 */ |
| | | dateFormat?: string; |
| | | logList: SystemOperateLogApi.OperateLog[]; // 操作日志列表 |
| | | } |
| | |
| | | component: 'DatePicker', |
| | | componentProps: { |
| | | showTime: false, |
| | | format: 'YYYY-MM-DD HH:mm:ss', |
| | | format: 'YYYY-MM-DD', |
| | | valueFormat: 'YYYY-MM-DD HH:mm:ss', |
| | | placeholder: '请选择预计成交日期', |
| | | }, |
| | |
| | | { |
| | | field: 'contactNextTime', |
| | | title: '下次联系时间', |
| | | formatter: 'formatDateTime', |
| | | formatter: 'formatDate', |
| | | width: 180, |
| | | }, |
| | | { |
| | |
| | | { |
| | | field: 'contactLastTime', |
| | | title: '最后跟进时间', |
| | | formatter: 'formatDateTime', |
| | | formatter: 'formatDate', |
| | | width: 180, |
| | | }, |
| | | { |
| | | field: 'updateTime', |
| | | title: '更新时间', |
| | | formatter: 'formatDateTime', |
| | | formatter: 'formatDate', |
| | | width: 180, |
| | | }, |
| | | { |
| | | field: 'createTime', |
| | | title: '创建时间', |
| | | formatter: 'formatDateTime', |
| | | formatter: 'formatDate', |
| | | width: 180, |
| | | }, |
| | | { |
| | |
| | | import type { CrmBusinessApi } from '#/api/crm/business'; |
| | | import type { DescriptionItemSchema } from '#/components/description'; |
| | | |
| | | import { erpPriceInputFormatter, formatDateTime } from '@vben/utils'; |
| | | import { erpPriceInputFormatter, formatDate } from '@vben/utils'; |
| | | |
| | | import { |
| | | getBusinessStatusSimpleList, |
| | |
| | | { |
| | | field: 'createTime', |
| | | label: '创建时间', |
| | | render: (val) => formatDateTime(val) as string, |
| | | render: (val) => formatDate(val) as string, |
| | | }, |
| | | ]; |
| | | } |
| | |
| | | { |
| | | field: 'dealTime', |
| | | label: '预计成交日期', |
| | | render: (val) => formatDateTime(val) as string, |
| | | render: (val) => formatDate(val) as string, |
| | | }, |
| | | { |
| | | field: 'contactNextTime', |
| | | label: '下次联系时间', |
| | | render: (val) => formatDateTime(val) as string, |
| | | render: (val) => formatDate(val) as string, |
| | | }, |
| | | { |
| | | field: 'statusTypeName', |
| | |
| | | /> |
| | | </Tabs.TabPane> |
| | | <Tabs.TabPane tab="操作日志" key="6" :force-render="true"> |
| | | <OperateLog :log-list="logList" /> |
| | | <OperateLog :log-list="logList" date-format="YYYY-MM-DD" /> |
| | | </Tabs.TabPane> |
| | | <Tabs.TabPane tab="团队成员" key="7" :force-render="true"> |
| | | <PermissionList |
| | |
| | | { |
| | | field: 'createTime', |
| | | title: '创建时间', |
| | | formatter: 'formatDateTime', |
| | | formatter: 'formatDate', |
| | | }, |
| | | { |
| | | title: '操作', |
| | |
| | | component: 'DatePicker', |
| | | componentProps: { |
| | | showTime: true, |
| | | format: 'YYYY-MM-DD HH:mm:ss', |
| | | format: 'YYYY-MM-DD', |
| | | valueFormat: 'YYYY-MM-DD HH:mm:ss', |
| | | placeholder: '请选择下次联系时间', |
| | | }, |
| | |
| | | component: 'RangePicker', |
| | | componentProps: { |
| | | ...getRangePickerDefaultProps(), |
| | | format: 'YYYY-MM-DD', |
| | | allowClear: true, |
| | | placeholder: ['开始日期', '结束日期'], |
| | | }, |
| | |
| | | { |
| | | field: 'contactNextTime', |
| | | title: '下次联系时间', |
| | | formatter: 'formatDateTime', |
| | | formatter: 'formatDate', |
| | | minWidth: 180, |
| | | }, |
| | | { |
| | |
| | | { |
| | | field: 'contactLastTime', |
| | | title: '最后跟进时间', |
| | | formatter: 'formatDateTime', |
| | | formatter: 'formatDate', |
| | | minWidth: 180, |
| | | }, |
| | | { |
| | |
| | | { |
| | | field: 'updateTime', |
| | | title: '更新时间', |
| | | formatter: 'formatDateTime', |
| | | formatter: 'formatDate', |
| | | minWidth: 180, |
| | | }, |
| | | { |
| | | field: 'createTime', |
| | | title: '创建时间', |
| | | formatter: 'formatDateTime', |
| | | formatter: 'formatDate', |
| | | minWidth: 180, |
| | | }, |
| | | { |
| | |
| | | import { h } from 'vue'; |
| | | |
| | | import { DICT_TYPE } from '@vben/constants'; |
| | | import { formatDateTime } from '@vben/utils'; |
| | | import { formatDate } from '@vben/utils'; |
| | | |
| | | import { DictTag } from '#/components/dict-tag'; |
| | | |
| | |
| | | { |
| | | field: 'createTime', |
| | | label: '创建时间', |
| | | render: (val) => formatDateTime(val) as string, |
| | | render: (val) => formatDate(val) as string, |
| | | }, |
| | | ]; |
| | | } |
| | |
| | | { |
| | | field: 'contactNextTime', |
| | | label: '下次联系时间', |
| | | render: (val) => formatDateTime(val) as string, |
| | | render: (val) => formatDate(val) as string, |
| | | }, |
| | | { |
| | | field: 'remark', |
| | |
| | | /> |
| | | </Tabs.TabPane> |
| | | <Tabs.TabPane tab="操作日志" key="4" :force-render="true"> |
| | | <OperateLog :log-list="logList" /> |
| | | <OperateLog :log-list="logList" date-format="YYYY-MM-DD" /> |
| | | </Tabs.TabPane> |
| | | </Tabs> |
| | | </Card> |
| | |
| | | component: 'DatePicker', |
| | | componentProps: { |
| | | showTime: true, |
| | | format: 'YYYY-MM-DD HH:mm:ss', |
| | | format: 'YYYY-MM-DD', |
| | | valueFormat: 'YYYY-MM-DD HH:mm:ss', |
| | | placeholder: '请选择下次联系时间', |
| | | }, |
| | |
| | | { |
| | | field: 'contactNextTime', |
| | | title: '下次联系时间', |
| | | formatter: 'formatDateTime', |
| | | formatter: 'formatDate', |
| | | minWidth: 180, |
| | | }, |
| | | { |
| | |
| | | { |
| | | field: 'contactLastTime', |
| | | title: '最后跟进时间', |
| | | formatter: 'formatDateTime', |
| | | formatter: 'formatDate', |
| | | minWidth: 180, |
| | | }, |
| | | { |
| | |
| | | { |
| | | field: 'updateTime', |
| | | title: '更新时间', |
| | | formatter: 'formatDateTime', |
| | | formatter: 'formatDate', |
| | | minWidth: 180, |
| | | }, |
| | | { |
| | | field: 'createTime', |
| | | title: '创建时间', |
| | | formatter: 'formatDateTime', |
| | | formatter: 'formatDate', |
| | | minWidth: 180, |
| | | }, |
| | | { |
| | |
| | | import { h } from 'vue'; |
| | | |
| | | import { DICT_TYPE } from '@vben/constants'; |
| | | import { formatDateTime } from '@vben/utils'; |
| | | import { formatDate } from '@vben/utils'; |
| | | |
| | | import { DictTag } from '#/components/dict-tag'; |
| | | |
| | |
| | | { |
| | | field: 'createTime', |
| | | label: '创建时间', |
| | | render: (val) => formatDateTime(val) as string, |
| | | render: (val) => formatDate(val) as string, |
| | | }, |
| | | ]; |
| | | } |
| | |
| | | { |
| | | field: 'contactNextTime', |
| | | label: '下次联系时间', |
| | | render: (val) => formatDateTime(val) as string, |
| | | render: (val) => formatDate(val) as string, |
| | | }, |
| | | { |
| | | field: 'remark', |
| | |
| | | <Info :contact="contact" /> |
| | | </Tabs.TabPane> |
| | | <Tabs.TabPane tab="操作日志" key="3" :force-render="true"> |
| | | <OperateLog :log-list="logList" /> |
| | | <OperateLog :log-list="logList" date-format="YYYY-MM-DD" /> |
| | | </Tabs.TabPane> |
| | | <Tabs.TabPane tab="团队成员" key="4" :force-render="true"> |
| | | <PermissionList |
| | |
| | | /> |
| | | </Tabs.TabPane> |
| | | <Tabs.TabPane tab="操作日志" key="6" :force-render="true"> |
| | | <OperateLog :log-list="logList" /> |
| | | <OperateLog :log-list="logList" date-format="YYYY-MM-DD" /> |
| | | </Tabs.TabPane> |
| | | </Tabs> |
| | | </Card> |
| | |
| | | component: 'DatePicker', |
| | | componentProps: { |
| | | showTime: true, |
| | | format: 'YYYY-MM-DD HH:mm:ss', |
| | | format: 'YYYY-MM-DD', |
| | | valueFormat: 'YYYY-MM-DD HH:mm:ss', |
| | | placeholder: '请选择下次联系时间', |
| | | allowClear: true, |
| | | }, |
| | | }, |
| | | { |
| | | fieldName: 'autoPoolEnabled', |
| | | label: '是否流入公海', |
| | | component: 'Switch', |
| | | defaultValue: true, |
| | | componentProps: { |
| | | checkedChildren: '是', |
| | | unCheckedChildren: '否', |
| | | }, |
| | | help: '关闭后不自动流入公海,并取消普通用户的公海可见度;保留负责人和团队权限,超级管理员仍可查看。', |
| | | }, |
| | | { |
| | | fieldName: 'remark', |
| | |
| | | }, |
| | | }, |
| | | { |
| | | fieldName: 'autoPoolEnabled', |
| | | label: '是否流入公海', |
| | | component: 'Select', |
| | | componentProps: { |
| | | options: [ |
| | | { label: '是', value: true }, |
| | | { label: '否', value: false }, |
| | | ], |
| | | placeholder: '请选择', |
| | | allowClear: true, |
| | | }, |
| | | }, |
| | | { |
| | | fieldName: 'createTime', |
| | | label: '创建时间', |
| | | component: 'RangePicker', |
| | | componentProps: { |
| | | ...getRangePickerDefaultProps(), |
| | | format: 'YYYY-MM-DD', |
| | | placeholder: ['开始日期', '结束日期'], |
| | | allowClear: true, |
| | | }, |
| | |
| | | label: '客户数据', |
| | | component: 'Upload', |
| | | rules: 'required', |
| | | help: '仅允许导入 xls、xlsx 格式文件', |
| | | help: '仅允许导入 xls、xlsx 格式文件。“是否流入公海”列填写是/否;留空时新增默认是,覆盖保留原值。关闭后取消公海可见度。', |
| | | }, |
| | | { |
| | | fieldName: 'updateSupport', |
| | |
| | | { |
| | | field: 'contactNextTime', |
| | | title: '下次联系时间', |
| | | formatter: 'formatDateTime', |
| | | formatter: 'formatDate', |
| | | minWidth: 180, |
| | | }, |
| | | { |
| | |
| | | }, |
| | | }, |
| | | { |
| | | field: 'autoPoolEnabled', |
| | | title: '是否流入公海', |
| | | minWidth: 140, |
| | | cellRender: { |
| | | name: 'CellDict', |
| | | props: { type: DICT_TYPE.INFRA_BOOLEAN_STRING }, |
| | | }, |
| | | }, |
| | | { |
| | | field: 'dealStatus', |
| | | title: '成交状态', |
| | | minWidth: 120, |
| | |
| | | { |
| | | field: 'contactLastTime', |
| | | title: '最后跟进时间', |
| | | formatter: 'formatDateTime', |
| | | formatter: 'formatDate', |
| | | minWidth: 180, |
| | | }, |
| | | { |
| | |
| | | { |
| | | field: 'updateTime', |
| | | title: '更新时间', |
| | | formatter: 'formatDateTime', |
| | | formatter: 'formatDate', |
| | | minWidth: 180, |
| | | }, |
| | | { |
| | | field: 'createTime', |
| | | title: '创建时间', |
| | | formatter: 'formatDateTime', |
| | | formatter: 'formatDate', |
| | | minWidth: 180, |
| | | }, |
| | | { |
| | |
| | | |
| | | import { DICT_TYPE } from '@vben/constants'; |
| | | import { useUserStore } from '@vben/stores'; |
| | | import { formatDateTime } from '@vben/utils'; |
| | | import { formatDate } from '@vben/utils'; |
| | | |
| | | import { getSimpleUserList } from '#/api/system/user'; |
| | | import { DictTag } from '#/components/dict-tag'; |
| | |
| | | h(DictTag, { type: DICT_TYPE.CRM_CUSTOMER_LEVEL, value: val }), |
| | | }, |
| | | { |
| | | field: 'autoPoolEnabled', |
| | | label: '是否流入公海', |
| | | render: (val) => (val === false ? '否' : '是'), |
| | | }, |
| | | { |
| | | field: 'dealStatus', |
| | | label: '成交状态', |
| | | render: (val) => (val ? '已成交' : '未成交'), |
| | |
| | | { |
| | | field: 'createTime', |
| | | label: '创建时间', |
| | | render: (val) => formatDateTime(val) as string, |
| | | render: (val) => formatDate(val) as string, |
| | | }, |
| | | ]; |
| | | } |
| | |
| | | { |
| | | field: 'contactNextTime', |
| | | label: '下次联系时间', |
| | | render: (val) => formatDateTime(val) as string, |
| | | render: (val) => formatDate(val) as string, |
| | | }, |
| | | { |
| | | field: 'remark', |
| | |
| | | <ReceivableDetailsList :customer-id="customerId" /> |
| | | </Tabs.TabPane> |
| | | <Tabs.TabPane tab="操作日志" key="8" :force-render="true"> |
| | | <OperateLog :log-list="logList" /> |
| | | <OperateLog :log-list="logList" date-format="YYYY-MM-DD" /> |
| | | </Tabs.TabPane> |
| | | </Tabs> |
| | | </Card> |
| | |
| | | { |
| | | field: 'createTime', |
| | | title: '创建时间', |
| | | formatter: 'formatDateTime', |
| | | formatter: 'formatDate', |
| | | }, |
| | | { |
| | | title: '操作', |
| | |
| | | title: '下次联系时间', |
| | | field: 'contactNextTime', |
| | | minWidth: 180, |
| | | formatter: 'formatDateTime', |
| | | formatter: 'formatDate', |
| | | }, |
| | | { |
| | | title: '备注', |
| | |
| | | title: '最后跟进时间', |
| | | field: 'contactLastTime', |
| | | minWidth: 180, |
| | | formatter: 'formatDateTime', |
| | | formatter: 'formatDate', |
| | | }, |
| | | { |
| | | title: '最后跟进记录', |
| | |
| | | title: '更新时间', |
| | | field: 'updateTime', |
| | | minWidth: 180, |
| | | formatter: 'formatDateTime', |
| | | formatter: 'formatDate', |
| | | }, |
| | | { |
| | | title: '创建时间', |
| | | field: 'createTime', |
| | | minWidth: 180, |
| | | formatter: 'formatDateTime', |
| | | formatter: 'formatDate', |
| | | }, |
| | | { |
| | | title: '创建人', |
| | |
| | | |
| | | import { DICT_TYPE } from '@vben/constants'; |
| | | import { getDictOptions } from '@vben/hooks'; |
| | | import { formatDateTime } from '@vben/utils'; |
| | | import { formatDate } from '@vben/utils'; |
| | | |
| | | import { getBusinessPageByCustomer } from '#/api/crm/business'; |
| | | import { getContactPageByCustomer } from '#/api/crm/contact'; |
| | |
| | | component: 'DatePicker', |
| | | componentProps: { |
| | | showTime: true, |
| | | format: 'YYYY-MM-DD HH:mm:ss', |
| | | format: 'YYYY-MM-DD', |
| | | valueFormat: 'YYYY-MM-DD HH:mm:ss', |
| | | placeholder: '请选择下次联系时间', |
| | | }, |
| | |
| | | { |
| | | field: 'createTime', |
| | | title: '创建时间', |
| | | formatter: 'formatDateTime', |
| | | formatter: 'formatDate', |
| | | }, |
| | | { field: 'creatorName', title: '跟进人' }, |
| | | { |
| | |
| | | { |
| | | field: 'nextTime', |
| | | title: '下次联系时间', |
| | | formatter: 'formatDateTime', |
| | | formatter: 'formatDate', |
| | | }, |
| | | { |
| | | field: 'contacts', |
| | |
| | | { |
| | | field: 'contactLastTime', |
| | | label: '最后跟进时间', |
| | | render: (val) => formatDateTime(val) as string, |
| | | render: (val) => formatDate(val) as string, |
| | | }, |
| | | { |
| | | field: 'creatorName', |
| | |
| | | { |
| | | field: 'createTime', |
| | | label: '创建时间', |
| | | render: (val) => formatDateTime(val) as string, |
| | | render: (val) => formatDate(val) as string, |
| | | }, |
| | | { |
| | | field: 'updateTime', |
| | | label: '更新时间', |
| | | render: (val) => formatDateTime(val) as string, |
| | | render: (val) => formatDate(val) as string, |
| | | }, |
| | | ]; |
| | | } |
| | |
| | | title: '开票日期', |
| | | field: 'invoiceTime', |
| | | minWidth: 150, |
| | | formatter: 'formatDateTime', |
| | | formatter: 'formatDate', |
| | | }, |
| | | { |
| | | title: '备注', |
| | |
| | | title: '更新时间', |
| | | field: 'updateTime', |
| | | minWidth: 150, |
| | | formatter: 'formatDateTime', |
| | | formatter: 'formatDate', |
| | | }, |
| | | { |
| | | title: '创建时间', |
| | | field: 'createTime', |
| | | minWidth: 150, |
| | | formatter: 'formatDateTime', |
| | | formatter: 'formatDate', |
| | | }, |
| | | { |
| | | title: '创建人', |
| | |
| | | |
| | | import { ContentWrap } from '@vben/common-ui'; |
| | | import { DICT_TYPE } from '@vben/constants'; |
| | | import { erpPriceInputFormatter, formatDateTime } from '@vben/utils'; |
| | | import { erpPriceInputFormatter, formatDate } from '@vben/utils'; |
| | | |
| | | import { Spin } from 'ant-design-vue'; |
| | | |
| | |
| | | { |
| | | label: '开票日期', |
| | | field: 'invoiceTime', |
| | | render: (val) => formatDateTime(val) as string, |
| | | render: (val) => formatDate(val) as string, |
| | | }, |
| | | { |
| | | label: '审批状态', |
| | |
| | | { |
| | | label: '创建时间', |
| | | field: 'createTime', |
| | | render: (val) => formatDateTime(val) as string, |
| | | render: (val) => formatDate(val) as string, |
| | | }, |
| | | { label: '备注', field: 'remark', render: textRender }, |
| | | ] as DescriptionItemSchema[], |
| | |
| | | import { h } from 'vue'; |
| | | |
| | | import { DICT_TYPE } from '@vben/constants'; |
| | | import { erpPriceInputFormatter, formatDateTime } from '@vben/utils'; |
| | | import { erpPriceInputFormatter, formatDate } from '@vben/utils'; |
| | | |
| | | import { DictTag } from '#/components/dict-tag'; |
| | | |
| | |
| | | { |
| | | field: 'invoiceTime', |
| | | label: '开票日期', |
| | | render: (val) => formatDateTime(val) as string, |
| | | render: (val) => formatDate(val) as string, |
| | | }, |
| | | { |
| | | field: 'invoiceType', |
| | |
| | | { |
| | | field: 'invoiceTime', |
| | | label: '开票日期', |
| | | render: (val) => formatDateTime(val) as string, |
| | | render: (val) => formatDate(val) as string, |
| | | }, |
| | | { |
| | | field: 'remark', |
| | |
| | | { |
| | | field: 'createTime', |
| | | label: '创建时间', |
| | | render: (val) => formatDateTime(val) as string, |
| | | render: (val) => formatDate(val) as string, |
| | | }, |
| | | { |
| | | field: 'updateTime', |
| | | label: '更新时间', |
| | | render: (val) => formatDateTime(val) as string, |
| | | render: (val) => formatDate(val) as string, |
| | | }, |
| | | ]; |
| | | } |
| | |
| | | <Info :invoice="invoice" /> |
| | | </Tabs.TabPane> |
| | | <Tabs.TabPane tab="操作日志" key="2" :force-render="true"> |
| | | <OperateLog :log-list="logList" /> |
| | | <OperateLog :log-list="logList" date-format="YYYY-MM-DD" /> |
| | | </Tabs.TabPane> |
| | | <Tabs.TabPane tab="团队成员" key="3" :force-render="true"> |
| | | <PermissionList |
| | |
| | | { |
| | | field: 'createTime', |
| | | title: '加入时间', |
| | | formatter: 'formatDateTime', |
| | | formatter: 'formatDate', |
| | | }, |
| | | ]; |
| | | } |
| | |
| | | { |
| | | field: 'createTime', |
| | | title: '创建时间', |
| | | formatter: 'formatDateTime', |
| | | formatter: 'formatDate', |
| | | }, |
| | | { |
| | | field: 'actions', |
| | |
| | | { |
| | | field: 'updateTime', |
| | | title: '更新时间', |
| | | formatter: 'formatDateTime', |
| | | formatter: 'formatDate', |
| | | minWidth: 180, |
| | | }, |
| | | { |
| | |
| | | { |
| | | field: 'createTime', |
| | | title: '创建时间', |
| | | formatter: 'formatDateTime', |
| | | formatter: 'formatDate', |
| | | minWidth: 180, |
| | | }, |
| | | { |
| | |
| | | <Info :product="product" /> |
| | | </Tabs.TabPane> |
| | | <Tabs.TabPane tab="操作日志" key="2" :force-render="true"> |
| | | <OperateLog :log-list="logList" /> |
| | | <OperateLog :log-list="logList" date-format="YYYY-MM-DD" /> |
| | | </Tabs.TabPane> |
| | | </Tabs> |
| | | </Card> |
| | |
| | | title: '回款日期', |
| | | field: 'returnTime', |
| | | minWidth: 150, |
| | | formatter: 'formatDateTime', |
| | | formatter: 'formatDate', |
| | | }, |
| | | { |
| | | title: '回款金额(元)', |
| | |
| | | title: '回款日期', |
| | | field: 'returnTime', |
| | | minWidth: 150, |
| | | formatter: 'formatDateTime', |
| | | formatter: 'formatDate', |
| | | }, |
| | | { |
| | | title: '回款金额(元)', |
| | |
| | | title: '更新时间', |
| | | field: 'updateTime', |
| | | minWidth: 150, |
| | | formatter: 'formatDateTime', |
| | | formatter: 'formatDate', |
| | | }, |
| | | { |
| | | title: '创建时间', |
| | | field: 'createTime', |
| | | minWidth: 150, |
| | | formatter: 'formatDateTime', |
| | | formatter: 'formatDate', |
| | | }, |
| | | { |
| | | title: '创建人', |
| | |
| | | |
| | | import { ContentWrap } from '@vben/common-ui'; |
| | | import { DICT_TYPE } from '@vben/constants'; |
| | | import { erpPriceInputFormatter, formatDateTime } from '@vben/utils'; |
| | | import { erpPriceInputFormatter, formatDate } from '@vben/utils'; |
| | | |
| | | import { Spin } from 'ant-design-vue'; |
| | | |
| | |
| | | { |
| | | label: '回款日期', |
| | | field: 'returnTime', |
| | | render: (val) => formatDateTime(val) as string, |
| | | render: (val) => formatDate(val) as string, |
| | | }, |
| | | { |
| | | label: '回款金额(元)', |
| | |
| | | { |
| | | label: '创建时间', |
| | | field: 'createTime', |
| | | render: (val) => formatDateTime(val) as string, |
| | | render: (val) => formatDate(val) as string, |
| | | }, |
| | | { label: '备注', field: 'remark', render: textRender }, |
| | | ] as DescriptionItemSchema[], |
| | |
| | | import { h } from 'vue'; |
| | | |
| | | import { DICT_TYPE } from '@vben/constants'; |
| | | import { erpPriceInputFormatter, formatDateTime } from '@vben/utils'; |
| | | import { erpPriceInputFormatter, formatDate } from '@vben/utils'; |
| | | |
| | | import { DictTag } from '#/components/dict-tag'; |
| | | |
| | |
| | | { |
| | | field: 'returnTime', |
| | | label: '回款日期', |
| | | render: (val) => formatDateTime(val) as string, |
| | | render: (val) => formatDate(val) as string, |
| | | }, |
| | | { |
| | | field: 'price', |
| | |
| | | { |
| | | field: 'returnTime', |
| | | label: '回款日期', |
| | | render: (val) => formatDateTime(val) as string, |
| | | render: (val) => formatDate(val) as string, |
| | | }, |
| | | { |
| | | field: 'price', |
| | |
| | | { |
| | | field: 'createTime', |
| | | label: '创建时间', |
| | | render: (val) => formatDateTime(val) as string, |
| | | render: (val) => formatDate(val) as string, |
| | | }, |
| | | { |
| | | field: 'updateTime', |
| | | label: '更新时间', |
| | | render: (val) => formatDateTime(val) as string, |
| | | render: (val) => formatDate(val) as string, |
| | | }, |
| | | ]; |
| | | } |
| | |
| | | <Info :receivable="receivable" /> |
| | | </Tabs.TabPane> |
| | | <Tabs.TabPane tab="操作日志" key="2" :force-render="true"> |
| | | <OperateLog :log-list="logList" /> |
| | | <OperateLog :log-list="logList" date-format="YYYY-MM-DD" /> |
| | | </Tabs.TabPane> |
| | | <Tabs.TabPane tab="团队成员" key="3" :force-render="true"> |
| | | <PermissionList |
| | |
| | | title: '计划回款日期', |
| | | field: 'returnTime', |
| | | minWidth: 150, |
| | | formatter: 'formatDateTime', |
| | | formatter: 'formatDate', |
| | | }, |
| | | { |
| | | title: '提前几天提醒', |
| | |
| | | title: '提醒日期', |
| | | field: 'remindTime', |
| | | minWidth: 150, |
| | | formatter: 'formatDateTime', |
| | | formatter: 'formatDate', |
| | | }, |
| | | { |
| | | title: '负责人', |
| | |
| | | title: '计划回款日期', |
| | | field: 'returnTime', |
| | | minWidth: 180, |
| | | formatter: 'formatDateTime', |
| | | formatter: 'formatDate', |
| | | }, |
| | | { |
| | | title: '提前几天提醒', |
| | |
| | | title: '提醒日期', |
| | | field: 'remindTime', |
| | | minWidth: 180, |
| | | formatter: 'formatDateTime', |
| | | formatter: 'formatDate', |
| | | }, |
| | | { |
| | | title: '回款方式', |
| | |
| | | title: '实际回款日期', |
| | | field: 'receivable.returnTime', |
| | | minWidth: 180, |
| | | formatter: 'formatDateTime', |
| | | formatter: 'formatDate', |
| | | }, |
| | | { |
| | | title: '未回款金额(元)', |
| | |
| | | title: '更新时间', |
| | | field: 'updateTime', |
| | | minWidth: 180, |
| | | formatter: 'formatDateTime', |
| | | formatter: 'formatDate', |
| | | }, |
| | | { |
| | | title: '创建时间', |
| | | field: 'createTime', |
| | | minWidth: 180, |
| | | formatter: 'formatDateTime', |
| | | formatter: 'formatDate', |
| | | }, |
| | | { |
| | | title: '创建人', |
| | |
| | | import { h } from 'vue'; |
| | | |
| | | import { DICT_TYPE } from '@vben/constants'; |
| | | import { erpPriceInputFormatter, formatDateTime } from '@vben/utils'; |
| | | import { erpPriceInputFormatter, formatDate } from '@vben/utils'; |
| | | |
| | | import { DictTag } from '#/components/dict-tag'; |
| | | |
| | |
| | | { |
| | | field: 'returnTime', |
| | | label: '计划回款日期', |
| | | render: (val) => formatDateTime(val) as string, |
| | | render: (val) => formatDate(val) as string, |
| | | }, |
| | | { |
| | | field: 'receivable', |
| | |
| | | { |
| | | field: 'returnTime', |
| | | label: '计划回款日期', |
| | | render: (val) => formatDateTime(val) as string, |
| | | render: (val) => formatDate(val) as string, |
| | | }, |
| | | { |
| | | field: 'price', |
| | |
| | | { |
| | | field: 'receivable.returnTime', |
| | | label: '实际回款日期', |
| | | render: (val) => formatDateTime(val) as string, |
| | | render: (val) => formatDate(val) as string, |
| | | }, |
| | | { |
| | | field: 'remark', |
| | |
| | | { |
| | | field: 'createTime', |
| | | label: '创建时间', |
| | | render: (val) => formatDateTime(val) as string, |
| | | render: (val) => formatDate(val) as string, |
| | | }, |
| | | { |
| | | field: 'updateTime', |
| | | label: '更新时间', |
| | | render: (val) => formatDateTime(val) as string, |
| | | render: (val) => formatDate(val) as string, |
| | | }, |
| | | ]; |
| | | } |
| | |
| | | <ReceivablePlanDetailsInfo :receivable-plan="receivablePlan" /> |
| | | </Tabs.TabPane> |
| | | <Tabs.TabPane tab="操作日志" key="2" :force-render="true"> |
| | | <OperateLog :log-list="logList" /> |
| | | <OperateLog :log-list="logList" date-format="YYYY-MM-DD" /> |
| | | </Tabs.TabPane> |
| | | <Tabs.TabPane tab="团队成员" key="3" :force-render="true"> |
| | | <PermissionList |
| | |
| | | import { ref } from 'vue'; |
| | | |
| | | import { IconifyIcon } from '@vben/icons'; |
| | | import { formatDate } from '@vben/utils'; |
| | | |
| | | import { Modal, Button, Upload, Descriptions, Table, Tag, message, Alert } from 'ant-design-vue'; |
| | | |
| | |
| | | <Tag color="orange">{{ ocrResult.customerName }}</Tag> |
| | | </Descriptions.Item> |
| | | <Descriptions.Item v-if="ocrResult.quotationTime" label="报价日期"> |
| | | {{ ocrResult.quotationTime }} |
| | | {{ formatDate(ocrResult.quotationTime) }} |
| | | </Descriptions.Item> |
| | | <Descriptions.Item v-if="ocrResult.validUntil" label="有效期至"> |
| | | {{ ocrResult.validUntil }} |
| | |
| | | field: 'createTime', |
| | | title: '创建时间', |
| | | minWidth: 160, |
| | | formatter: 'formatDateTime', |
| | | formatter: 'formatDate', |
| | | }, |
| | | { |
| | | field: 'creatorName', |
| | |
| | | component: 'RangePicker', |
| | | componentProps: { |
| | | ...getRangePickerDefaultProps(), |
| | | format: 'YYYY-MM-DD', |
| | | }, |
| | | defaultValue: [ |
| | | formatDateTime(beginOfDay(new Date(Date.now() - 3600 * 1000 * 24 * 7))), |
| | |
| | | field: 'createTime', |
| | | title: '创建时间', |
| | | minWidth: 200, |
| | | formatter: 'formatDateTime', |
| | | formatter: 'formatDate', |
| | | }, |
| | | { |
| | | field: 'orderDate', |
| | | title: '下单日期', |
| | | minWidth: 200, |
| | | formatter: 'formatDateTime', |
| | | formatter: 'formatDate', |
| | | }, |
| | | ]; |
| | | } |
| | |
| | | component: 'RangePicker', |
| | | componentProps: { |
| | | ...getRangePickerDefaultProps(), |
| | | format: 'YYYY-MM-DD', |
| | | }, |
| | | defaultValue: [ |
| | | formatDateTime(beginOfDay(new Date(Date.now() - 3600 * 1000 * 24 * 7))), |
| | |
| | | field: 'dealTime', |
| | | title: '预计成交日期', |
| | | minWidth: 200, |
| | | formatter: 'formatDateTime', |
| | | formatter: 'formatDate', |
| | | }, |
| | | { |
| | | field: 'ownerUserName', |
| | |
| | | field: 'contactLastTime', |
| | | title: '最后跟进时间', |
| | | minWidth: 200, |
| | | formatter: 'formatDateTime', |
| | | formatter: 'formatDate', |
| | | }, |
| | | { |
| | | field: 'updateTime', |
| | | title: '更新时间', |
| | | minWidth: 200, |
| | | formatter: 'formatDateTime', |
| | | formatter: 'formatDate', |
| | | }, |
| | | { |
| | | field: 'createTime', |
| | | title: '创建时间', |
| | | minWidth: 200, |
| | | formatter: 'formatDateTime', |
| | | formatter: 'formatDate', |
| | | }, |
| | | { |
| | | field: 'creatorName', |
| | |
| | | field: 'dealTime', |
| | | title: '预计成交日期', |
| | | minWidth: 200, |
| | | formatter: 'formatDateTime', |
| | | formatter: 'formatDate', |
| | | }, |
| | | { |
| | | field: 'ownerUserName', |
| | |
| | | field: 'contactLastTime', |
| | | title: '最后跟进时间', |
| | | minWidth: 200, |
| | | formatter: 'formatDateTime', |
| | | formatter: 'formatDate', |
| | | }, |
| | | { |
| | | field: 'updateTime', |
| | | title: '更新时间', |
| | | minWidth: 200, |
| | | formatter: 'formatDateTime', |
| | | formatter: 'formatDate', |
| | | }, |
| | | { |
| | | field: 'createTime', |
| | | title: '创建时间', |
| | | minWidth: 200, |
| | | formatter: 'formatDateTime', |
| | | formatter: 'formatDate', |
| | | }, |
| | | { |
| | | field: 'creatorName', |
| | |
| | | component: 'RangePicker', |
| | | componentProps: { |
| | | ...getRangePickerDefaultProps(), |
| | | format: 'YYYY-MM-DD', |
| | | }, |
| | | defaultValue: [ |
| | | formatDateTime(beginOfDay(new Date(Date.now() - 3600 * 1000 * 24 * 7))), |
| | |
| | | component: 'RangePicker', |
| | | componentProps: { |
| | | ...getRangePickerDefaultProps(), |
| | | format: 'YYYY-MM-DD', |
| | | }, |
| | | defaultValue: [ |
| | | formatDateTime(beginOfDay(new Date(Date.now() - 3600 * 1000 * 24 * 7))), |