From 4f219881c26d5d4ab457b130cbb511a25cd52e2b Mon Sep 17 00:00:00 2001 From: xingyu4j Date: Tue, 3 Jun 2025 20:49:59 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E5=AE=8C=E5=96=84=E9=83=A8=E5=88=86?= =?UTF-8?q?=E8=AF=A6=E6=83=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/web-antd/src/api/crm/permission/index.ts | 4 +- .../src/views/crm/clue/modules/detail.vue | 16 +- .../crm/customer/modules/detail-info.vue | 5 + .../src/views/crm/customer/modules/detail.vue | 210 +++++++++++++++++- .../permission/modules/permission-form.vue | 3 +- .../permission/modules/permission-list.vue | 29 ++- 6 files changed, 247 insertions(+), 20 deletions(-) create mode 100644 apps/web-antd/src/views/crm/customer/modules/detail-info.vue diff --git a/apps/web-antd/src/api/crm/permission/index.ts b/apps/web-antd/src/api/crm/permission/index.ts index 3c97a3dc9..7322ee1e3 100644 --- a/apps/web-antd/src/api/crm/permission/index.ts +++ b/apps/web-antd/src/api/crm/permission/index.ts @@ -1,5 +1,3 @@ -import type { PageResult } from '@vben/request'; - import { requestClient } from '#/api/request'; export namespace CrmPermissionApi { @@ -57,7 +55,7 @@ export enum PermissionLevelEnum { /** 获得数据权限列表(查询团队成员列表) */ export function getPermissionList(params: CrmPermissionApi.PermissionListReq) { - return requestClient.get>( + return requestClient.get( '/crm/permission/list', { params }, ); diff --git a/apps/web-antd/src/views/crm/clue/modules/detail.vue b/apps/web-antd/src/views/crm/clue/modules/detail.vue index 2f7c6ac86..7c9d29b2a 100644 --- a/apps/web-antd/src/views/crm/clue/modules/detail.vue +++ b/apps/web-antd/src/views/crm/clue/modules/detail.vue @@ -5,16 +5,18 @@ import { defineAsyncComponent, onMounted, ref } from 'vue'; import { useRoute, useRouter } from 'vue-router'; import { Page, useVbenModal } from '@vben/common-ui'; +import { useTabs } from '@vben/hooks'; import { ArrowLeft } from '@vben/icons'; import { Button, Card, Modal, Tabs } from 'ant-design-vue'; import { getClue, transformClue } from '#/api/crm/clue'; +import { BizTypeEnum } from '#/api/crm/permission'; import { useDescription } from '#/components/description'; +import { PermissionList, TransferForm } from '#/views/crm/permission'; import { useDetailSchema } from '../data'; import ClueForm from './form.vue'; -import TransferForm from './transfer.vue'; const ClueDetailsInfo = defineAsyncComponent(() => import('./detail-info.vue')); @@ -22,6 +24,7 @@ const loading = ref(false); const route = useRoute(); const router = useRouter(); +const tabs = useTabs(); const clueId = ref(0); @@ -58,6 +61,7 @@ async function loadClueDetail() { /** 返回列表页 */ function handleBack() { + tabs.closeCurrentTab(); router.push('/crm/clue'); } @@ -68,7 +72,7 @@ function handleEdit() { /** 转移线索 */ function handleTransfer() { - transferModalApi.setData({ id: clueId }).open(); + transferModalApi.setData({ bizType: BizTypeEnum.CRM_CLUE }).open(); } /** 转化为客户 */ @@ -141,7 +145,13 @@ onMounted(async () => { -
团队成员
+
操作日志
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 new file mode 100644 index 000000000..c651e23e0 --- /dev/null +++ b/apps/web-antd/src/views/crm/customer/modules/detail-info.vue @@ -0,0 +1,5 @@ + + + diff --git a/apps/web-antd/src/views/crm/customer/modules/detail.vue b/apps/web-antd/src/views/crm/customer/modules/detail.vue index 99ad6b6f9..19c2b2695 100644 --- a/apps/web-antd/src/views/crm/customer/modules/detail.vue +++ b/apps/web-antd/src/views/crm/customer/modules/detail.vue @@ -1,7 +1,209 @@ - + diff --git a/apps/web-antd/src/views/crm/permission/modules/permission-form.vue b/apps/web-antd/src/views/crm/permission/modules/permission-form.vue index af5b31701..e6e8fa462 100644 --- a/apps/web-antd/src/views/crm/permission/modules/permission-form.vue +++ b/apps/web-antd/src/views/crm/permission/modules/permission-form.vue @@ -114,7 +114,8 @@ const [Modal, modalApi] = useVbenModal({ } modalApi.lock(); // 提交表单 - const data = (await formApi.getValues()) as CrmPermissionApi.Permission; + let data = (await formApi.getValues()) as CrmPermissionApi.Permission; + data = Object.assign(data, formData.value); try { await (formData.value?.ids ? updatePermission(data) 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 5079623a6..65b202261 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 @@ -33,6 +33,8 @@ const emits = defineEmits<{ (e: 'quitTeam'): void; }>(); +const gridData = ref([]); + const [FormModal, formModalApi] = useVbenModal({ connectedComponent: Form, destroyOnClose: true, @@ -67,6 +69,14 @@ function handleCreate() { } function handleEdit() { + if (checkedIds.value.length === 0) { + message.error('请先选择团队成员后操作!'); + return; + } + if (checkedIds.value.length > 1) { + message.error('只能选择一个团队成员进行编辑!'); + return; + } formModalApi .setData({ bizType: props.bizType, @@ -112,7 +122,7 @@ async function handleQuit() { .getData() .find( (item) => - item.id === userStore.userInfo?.userId && + item.id === userStore.userInfo?.id && item.level === PermissionLevelEnum.OWNER, ); if (permission) { @@ -122,7 +132,7 @@ async function handleQuit() { const userPermission = gridApi.grid .getData() - .find((item) => item.id === userStore.userInfo?.userId); + .find((item) => item.id === userStore.userInfo?.id); if (!userPermission) { message.warning('你不是团队成员!'); return; @@ -176,6 +186,7 @@ const [Grid, gridApi] = useVbenVxeGrid({ bizId: props.bizId, bizType: props.bizType, }); + gridData.value = res; return res; }, }, @@ -201,19 +212,19 @@ defineExpose({ validateWrite, isPool, }); + watch( - () => gridApi.grid.getData(), + () => gridData.value, (data) => { isPool.value = false; if (data.length > 0) { - isPool.value = gridApi.grid - .getData() - .some((item) => item.level === PermissionLevelEnum.OWNER); + isPool.value = data.some( + (item) => item.level === PermissionLevelEnum.OWNER, + ); validateOwnerUser.value = false; validateWrite.value = false; - const userId = userStore.userInfo?.userId; - gridApi.grid - .getData() + const userId = userStore.userInfo?.id; + gridData.value .filter((item) => item.userId === userId) .forEach((item) => { if (item.level === PermissionLevelEnum.OWNER) {