diff --git a/apps/web-antd/package.json b/apps/web-antd/package.json index 217712b36..a0b085836 100644 --- a/apps/web-antd/package.json +++ b/apps/web-antd/package.json @@ -44,6 +44,7 @@ "@vben/types": "workspace:*", "@vben/utils": "workspace:*", "@videojs-player/vue": "^1.0.0", + "@vueuse/components": "catalog:", "@vueuse/core": "catalog:", "@vueuse/integrations": "catalog:", "ant-design-vue": "catalog:", diff --git a/apps/web-antd/src/api/mall/promotion/reward/rewardActivity.ts b/apps/web-antd/src/api/mall/promotion/reward/rewardActivity.ts index 2faf443b8..e59cad300 100644 --- a/apps/web-antd/src/api/mall/promotion/reward/rewardActivity.ts +++ b/apps/web-antd/src/api/mall/promotion/reward/rewardActivity.ts @@ -18,6 +18,7 @@ export namespace MallRewardActivityApi { export interface RewardActivity { id?: number; // 活动编号 name?: string; // 活动名称 + status?: number; // 活动状态 startTime?: Date; // 开始时间 endTime?: Date; // 结束时间 startAndEndTime?: Date[]; // 开始和结束时间(仅前端使用) diff --git a/apps/web-antd/src/components/card-title/CardTitle.vue b/apps/web-antd/src/components/card-title/CardTitle.vue new file mode 100644 index 000000000..b59ed966c --- /dev/null +++ b/apps/web-antd/src/components/card-title/CardTitle.vue @@ -0,0 +1,36 @@ + + + + + diff --git a/apps/web-antd/src/components/card-title/index.ts b/apps/web-antd/src/components/card-title/index.ts new file mode 100644 index 000000000..4ebdb4494 --- /dev/null +++ b/apps/web-antd/src/components/card-title/index.ts @@ -0,0 +1 @@ +export { default as CardTitle } from './CardTitle.vue'; diff --git a/apps/web-antd/src/components/description/description.vue b/apps/web-antd/src/components/description/description.vue index 3d341596e..d591e5722 100644 --- a/apps/web-antd/src/components/description/description.vue +++ b/apps/web-antd/src/components/description/description.vue @@ -133,9 +133,7 @@ export default defineComponent({ > {() => { if (item.slot) { - // TODO @xingyu:这里要 inline 掉么? - const slotContent = getSlot(slots, item.slot, data); - return slotContent; + return getSlot(slots, item.slot, data); } if (!contentMinWidth) { return getContent(); diff --git a/apps/web-antd/src/plugins/form-create/index.ts b/apps/web-antd/src/plugins/form-create/index.ts index d7b59b5b7..e13f1c1f7 100644 --- a/apps/web-antd/src/plugins/form-create/index.ts +++ b/apps/web-antd/src/plugins/form-create/index.ts @@ -96,7 +96,7 @@ export function setupFormCreate(app: App) { components.forEach((component) => { app.component(component.name as string, component); }); - // TODO @xingyu:这里为啥 app.component('AMessage', message); 看官方是没有的; + // TODO @xingyu:这里为啥 app.component('AMessage', message); 看官方是没有的; 需要额外引入 app.component('AMessage', message); formCreate.use(install); app.use(formCreate); diff --git a/apps/web-antd/src/store/mall/kefu.ts b/apps/web-antd/src/store/mall/kefu.ts new file mode 100644 index 000000000..85f4023e7 --- /dev/null +++ b/apps/web-antd/src/store/mall/kefu.ts @@ -0,0 +1,102 @@ +import type { MallKefuConversationApi } from '#/api/mall/promotion/kefu/conversation'; +import type { MallKefuMessageApi } from '#/api/mall/promotion/kefu/message'; + +import { isEmpty } from '@vben/utils'; + +import { acceptHMRUpdate, defineStore } from 'pinia'; + +import * as KeFuConversationApi from '#/api/mall/promotion/kefu/conversation'; + +interface MallKefuInfoVO { + conversationList: MallKefuConversationApi.Conversation[]; // 会话列表 + conversationMessageList: Map; // 会话消息 +} + +export const useMallKefuStore = defineStore('mall-kefu', { + state: (): MallKefuInfoVO => ({ + conversationList: [], + conversationMessageList: new Map(), // key 会话,value 会话消息列表 + }), + getters: { + getConversationList(): MallKefuConversationApi.Conversation[] { + return this.conversationList; + }, + getConversationMessageList(): ( + conversationId: number, + ) => MallKefuMessageApi.Message[] | undefined { + return (conversationId: number) => + this.conversationMessageList.get(conversationId); + }, + }, + actions: { + // ======================= 会话消息相关 ======================= + /** 缓存历史消息 */ + saveMessageList( + conversationId: number, + messageList: MallKefuMessageApi.Message[], + ) { + this.conversationMessageList.set(conversationId, messageList); + }, + + // ======================= 会话相关 ======================= + /** 加载会话缓存列表 */ + async setConversationList() { + // TODO @jave:idea linter 告警,修复下; + // TODO @jave:不使用 KeFuConversationApi.,直接用 getConversationList + this.conversationList = await KeFuConversationApi.getConversationList(); + this.conversationSort(); + }, + /** 更新会话缓存已读 */ + async updateConversationStatus(conversationId: number) { + if (isEmpty(this.conversationList)) { + return; + } + const conversation = this.conversationList.find( + (item) => item.id === conversationId, + ); + conversation && (conversation.adminUnreadMessageCount = 0); + }, + /** 更新会话缓存 */ + async updateConversation(conversationId: number) { + if (isEmpty(this.conversationList)) { + return; + } + + const conversation = + await KeFuConversationApi.getConversation(conversationId); + this.deleteConversation(conversationId); + conversation && this.conversationList.push(conversation); + this.conversationSort(); + }, + /** 删除会话缓存 */ + deleteConversation(conversationId: number) { + const index = this.conversationList.findIndex( + (item) => item.id === conversationId, + ); + // 存在则删除 + if (index !== -1) { + this.conversationList.splice(index, 1); + } + }, + conversationSort() { + // 按置顶属性和最后消息时间排序 + this.conversationList.sort((a, b) => { + // 按照置顶排序,置顶的会在前面 + if (a.adminPinned !== b.adminPinned) { + return a.adminPinned ? -1 : 1; + } + // 按照最后消息时间排序,最近的会在前面 + return ( + (b.lastMessageTime as unknown as number) - + (a.lastMessageTime as unknown as number) + ); + }); + }, + }, +}); + +// 解决热更新问题 +const hot = import.meta.hot; +if (hot) { + hot.accept(acceptHMRUpdate(useMallKefuStore, hot)); +} diff --git a/apps/web-antd/src/views/bpm/model/definition/index.vue b/apps/web-antd/src/views/bpm/model/definition/index.vue index 759086bbb..d1c8bb7fb 100644 --- a/apps/web-antd/src/views/bpm/model/definition/index.vue +++ b/apps/web-antd/src/views/bpm/model/definition/index.vue @@ -32,15 +32,18 @@ function handleRefresh() { } /** 查看表单详情 */ -function handleFormDetail(row: BpmProcessDefinitionApi.ProcessDefinition) { +async function handleFormDetail( + row: BpmProcessDefinitionApi.ProcessDefinition, +) { if (row.formType === BpmModelFormType.NORMAL) { const data = { id: row.formId, }; formCreateDetailModalApi.setData(data).open(); } else { - // TODO 待实现 jason 这里要改么? - console.warn('业务表单待实现', row); + await router.push({ + path: row.formCustomCreatePath, + }); } } diff --git a/apps/web-antd/src/views/bpm/model/form/index.vue b/apps/web-antd/src/views/bpm/model/form/index.vue index 713bd440b..0a706750f 100644 --- a/apps/web-antd/src/views/bpm/model/form/index.vue +++ b/apps/web-antd/src/views/bpm/model/form/index.vue @@ -309,8 +309,6 @@ async function handleSave() { } } catch (error: any) { console.error('保存失败:', error); - // TODO @jason:这个提示,还要么??? - // message.warning(error.msg || '请完善所有步骤的必填信息'); } } diff --git a/apps/web-antd/src/views/bpm/model/form/modules/bpm-model-editor.vue b/apps/web-antd/src/views/bpm/model/form/modules/bpm-model-editor.vue index 781ab2a92..782c8974d 100644 --- a/apps/web-antd/src/views/bpm/model/form/modules/bpm-model-editor.vue +++ b/apps/web-antd/src/views/bpm/model/form/modules/bpm-model-editor.vue @@ -121,11 +121,9 @@ onBeforeUnmount(() => { /> - diff --git a/apps/web-antd/src/views/bpm/model/modules/category-draggable-model.vue b/apps/web-antd/src/views/bpm/model/modules/category-draggable-model.vue index e285077d2..1188b4ea7 100644 --- a/apps/web-antd/src/views/bpm/model/modules/category-draggable-model.vue +++ b/apps/web-antd/src/views/bpm/model/modules/category-draggable-model.vue @@ -238,15 +238,16 @@ async function handleDeleteCategory() { } /** 处理表单详情点击 */ -function handleFormDetail(row: any) { +async function handleFormDetail(row: any) { if (row.formType === BpmModelFormType.NORMAL) { const data = { id: row.formId, }; formCreateDetailModalApi.setData(data).open(); } else { - // TODO 待实现 jason:是不是已经 ok 啦? - console.warn('业务表单待实现', row); + await router.push({ + path: row.formCustomCreatePath, + }); } } @@ -547,7 +548,7 @@ function handleRenameSuccess() { - diff --git a/apps/web-antd/src/views/bpm/processInstance/create/modules/form.vue b/apps/web-antd/src/views/bpm/processInstance/create/modules/form.vue index d94df581a..4973fc4b5 100644 --- a/apps/web-antd/src/views/bpm/processInstance/create/modules/form.vue +++ b/apps/web-antd/src/views/bpm/processInstance/create/modules/form.vue @@ -24,6 +24,7 @@ import { } from '#/api/bpm/processInstance'; import { decodeFields, setConfAndFields2 } from '#/components/form-create'; import { router } from '#/router'; +import ProcessInstanceBpmnViewer from '#/views/bpm/processInstance/detail/modules/bpm-viewer.vue'; import ProcessInstanceSimpleViewer from '#/views/bpm/processInstance/detail/modules/simple-bpm-viewer.vue'; import ProcessInstanceTimeline from '#/views/bpm/processInstance/detail/modules/time-line.vue'; @@ -51,7 +52,6 @@ const props = defineProps({ const emit = defineEmits(['cancel']); const { closeCurrentTab } = useTabs(); -const isFormReady = ref(false); // 表单就绪状态变量:表单就绪后再渲染 form-create const getTitle = computed(() => { return `流程表单 - ${props.selectProcessDefinition.name}`; }); @@ -122,21 +122,32 @@ async function initProcessInfo(row: any, formVariables?: any) { // 注意:需要从 formVariables 中,移除不在 row.formFields 的值。 // 原因是:后端返回的 formVariables 里面,会有一些非表单的信息。例如说,某个流程节点的审批人。 // 这样,就可能导致一个流程被审批不通过后,重新发起时,会直接后端报错!!! - const formApi = formCreate.create(decodeFields(row.formFields)); - const allowedFields = formApi.fields(); - for (const key in formVariables) { - if (!allowedFields.includes(key)) { - delete formVariables[key]; + + // 解析表单字段列表(不创建实例,避免重复渲染) + const decodedFields = decodeFields(row.formFields); + const allowedFields = new Set( + decodedFields.map((field: any) => field.field).filter(Boolean), + ); + + // 过滤掉不允许的字段 + if (formVariables) { + for (const key in formVariables) { + if (!allowedFields.has(key)) { + delete formVariables[key]; + } } } + setConfAndFields2(detailForm, row.formConf, row.formFields, formVariables); - // 设置表单就绪状态 - // TODO @jason:这个变量是必须的,有没可能简化掉? - isFormReady.value = true; + // 在配置中禁用 form-create 自带的提交和重置按钮 + detailForm.value.option = { + ...detailForm.value.option, + submitBtn: false, + resetBtn: false, + }; await nextTick(); - fApi.value?.btn.show(false); // 隐藏提交按钮 // 获取流程审批信息,当再次发起时,流程审批节点要根据原始表单参数预测出来 await getApprovalDetail({ @@ -153,30 +164,32 @@ async function initProcessInfo(row: any, formVariables?: any) { } // 情况二:业务表单 } else if (row.formCustomCreatePath) { + // 这里暂时无需加载流程图,因为跳出到另外个 Tab; await router.push({ path: row.formCustomCreatePath, }); - // 这里暂时无需加载流程图,因为跳出到另外个 Tab; + // 返回选择流程 + emit('cancel'); } } /** 预测流程节点会因为输入的参数值而产生新的预测结果值,所以需重新预测一次 */ watch( - detailForm.value, + () => detailForm.value.value, (newValue) => { - if (newValue && Object.keys(newValue.value).length > 0) { + if (newValue && Object.keys(newValue).length > 0) { // 记录之前的节点审批人 tempStartUserSelectAssignees.value = startUserSelectAssignees.value; startUserSelectAssignees.value = {}; // 加载最新的审批详情 getApprovalDetail({ id: props.selectProcessDefinition.id, - processVariablesStr: JSON.stringify(newValue.value), // 解决 GET 无法传递对象的问题,后端 String 再转 JSON + processVariablesStr: JSON.stringify(newValue), // 解决 GET 无法传递对象的问题,后端 String 再转 JSON }); } }, { - immediate: true, + deep: true, }, ); @@ -283,7 +296,6 @@ defineExpose({ initProcessInfo }); class="flex-1 overflow-auto" > -
+
+ +
diff --git a/apps/web-antd/src/views/bpm/processInstance/detail/index.vue b/apps/web-antd/src/views/bpm/processInstance/detail/index.vue index 578f9aaaf..391fa1142 100644 --- a/apps/web-antd/src/views/bpm/processInstance/detail/index.vue +++ b/apps/web-antd/src/views/bpm/processInstance/detail/index.vue @@ -183,14 +183,11 @@ function setFieldPermission(field: string, permission: string) { } } -// TODO @jason:这个还要么? -/** - * 操作成功后刷新 - */ -// const refresh = () => { -// // 重新获取详情 -// getDetail(); -// }; +/** 操作成功后刷新 */ +const refresh = () => { + // 重新获取详情 + getDetail(); +}; /** 监听 Tab 切换,当切换到 "record" 标签时刷新任务列表 */ watch( @@ -369,7 +366,7 @@ onMounted(async () => { :normal-form="detailForm" :normal-form-api="fApi" :writable-fields="writableFields" - @success="getDetail" + @success="refresh" />
diff --git a/apps/web-antd/src/views/bpm/processInstance/detail/modules/bpm-viewer.vue b/apps/web-antd/src/views/bpm/processInstance/detail/modules/bpm-viewer.vue index 585f731a4..0055df174 100644 --- a/apps/web-antd/src/views/bpm/processInstance/detail/modules/bpm-viewer.vue +++ b/apps/web-antd/src/views/bpm/processInstance/detail/modules/bpm-viewer.vue @@ -1,10 +1,59 @@ diff --git a/apps/web-antd/src/views/bpm/processInstance/detail/modules/operation-button.vue b/apps/web-antd/src/views/bpm/processInstance/detail/modules/operation-button.vue index 313c70c21..1c5b186de 100644 --- a/apps/web-antd/src/views/bpm/processInstance/detail/modules/operation-button.vue +++ b/apps/web-antd/src/views/bpm/processInstance/detail/modules/operation-button.vue @@ -268,9 +268,6 @@ async function openPopover(type: string) { Object.keys(popOverVisible.value).forEach((item) => { if (popOverVisible.value[item]) popOverVisible.value[item] = item === type; }); - // TODO @jason:下面这 2 行,要删除么? - // await nextTick() - // formRef.value.resetFields() } /** 关闭气泡卡 */ @@ -710,9 +707,6 @@ defineExpose({ loadTodoTask }); diff --git a/apps/web-antd/src/views/iot/device/device/modules/detail/DeviceDetailsInfo.vue b/apps/web-antd/src/views/iot/device/device/modules/detail/DeviceDetailsInfo.vue index d4b6b06cb..5ba870c61 100644 --- a/apps/web-antd/src/views/iot/device/device/modules/detail/DeviceDetailsInfo.vue +++ b/apps/web-antd/src/views/iot/device/device/modules/detail/DeviceDetailsInfo.vue @@ -106,7 +106,7 @@ function handleAuthInfoDialogClose() { diff --git a/apps/web-antd/src/views/iot/device/group/data.ts b/apps/web-antd/src/views/iot/device/group/data.ts index 0bc313e52..ca6a10a88 100644 --- a/apps/web-antd/src/views/iot/device/group/data.ts +++ b/apps/web-antd/src/views/iot/device/group/data.ts @@ -1,12 +1,13 @@ import type { VbenFormSchema } from '#/adapter/form'; import type { VxeTableGridOptions } from '#/adapter/vxe-table'; -import { DICT_TYPE } from '@vben/constants'; +import { CommonStatusEnum, DICT_TYPE } from '@vben/constants'; +import { getDictOptions } from '@vben/hooks'; import { z } from '#/adapter/form'; -import { getSimpleDeviceGroupList } from '#/api/iot/device/group'; +import { getRangePickerDefaultProps } from '#/utils'; -/** 新增/修改设备分组的表单 */ +/** 新增/修改的表单 */ export function useFormSchema(): VbenFormSchema[] { return [ { @@ -30,16 +31,15 @@ export function useFormSchema(): VbenFormSchema[] { .max(64, '分组名称长度不能超过 64 个字符'), }, { - fieldName: 'parentId', - label: '父级分组', - component: 'ApiTreeSelect', + fieldName: 'status', + label: '分组状态', + component: 'RadioGroup', componentProps: { - api: getSimpleDeviceGroupList, - labelField: 'name', - valueField: 'id', - placeholder: '请选择父级分组', - allowClear: true, + options: getDictOptions(DICT_TYPE.COMMON_STATUS, 'number'), + buttonStyle: 'solid', + optionType: 'button', }, + rules: z.number().default(CommonStatusEnum.ENABLE), }, { fieldName: 'description', @@ -65,6 +65,15 @@ export function useGridFormSchema(): VbenFormSchema[] { allowClear: true, }, }, + { + fieldName: 'createTime', + label: '创建时间', + component: 'RangePicker', + componentProps: { + ...getRangePickerDefaultProps(), + allowClear: true, + }, + }, ]; } @@ -72,14 +81,13 @@ export function useGridFormSchema(): VbenFormSchema[] { export function useGridColumns(): VxeTableGridOptions['columns'] { return [ { - field: 'name', - title: '分组名称', - minWidth: 200, - treeNode: true, + field: 'id', + title: 'ID', + minWidth: 100, }, { - field: 'description', - title: '分组描述', + field: 'name', + title: '分组名称', minWidth: 200, }, { @@ -92,9 +100,9 @@ export function useGridColumns(): VxeTableGridOptions['columns'] { }, }, { - field: 'deviceCount', - title: '设备数量', - minWidth: 100, + field: 'description', + title: '分组描述', + minWidth: 200, }, { field: 'createTime', @@ -102,6 +110,11 @@ export function useGridColumns(): VxeTableGridOptions['columns'] { minWidth: 180, formatter: 'formatDateTime', }, + { + field: 'deviceCount', + title: '设备数量', + minWidth: 100, + }, { title: '操作', width: 200, diff --git a/apps/web-antd/src/views/iot/device/group/index.vue b/apps/web-antd/src/views/iot/device/group/index.vue index f6a0992f8..ebf33e9be 100644 --- a/apps/web-antd/src/views/iot/device/group/index.vue +++ b/apps/web-antd/src/views/iot/device/group/index.vue @@ -3,7 +3,6 @@ import type { VxeTableGridOptions } from '#/adapter/vxe-table'; import type { IotDeviceGroupApi } from '#/api/iot/device/group'; import { Page, useVbenModal } from '@vben/common-ui'; -import { handleTree } from '@vben/utils'; import { message } from 'ant-design-vue'; @@ -62,24 +61,14 @@ const [Grid, gridApi] = useVbenVxeGrid({ columns: useGridColumns(), height: 'auto', keepSource: true, - treeConfig: { - transform: true, - rowField: 'id', - parentField: 'parentId', - }, proxyConfig: { ajax: { query: async ({ page }, formValues) => { - const data = await getDeviceGroupPage({ + return await getDeviceGroupPage({ pageNo: page.currentPage, pageSize: page.pageSize, ...formValues, }); - // 转换为树形结构 - return { - ...data, - list: handleTree(data.list, 'id', 'parentId'), - }; }, }, }, diff --git a/apps/web-antd/src/views/iot/device/group/modules/device-group-form.vue b/apps/web-antd/src/views/iot/device/group/modules/device-group-form.vue index fe010aba1..26dfe29d0 100644 --- a/apps/web-antd/src/views/iot/device/group/modules/device-group-form.vue +++ b/apps/web-antd/src/views/iot/device/group/modules/device-group-form.vue @@ -39,8 +39,10 @@ const [Form, formApi] = useVbenForm({ }, schema: useFormSchema(), showCollapseButton: false, + showDefaultActions: false, }); +// TODO @haohao:参考别的 form;1)文件的命名可以简化;2)代码可以在简化下; const [Modal, modalApi] = useVbenModal({ async onConfirm() { const { valid } = await formApi.validate(); @@ -70,9 +72,13 @@ const [Modal, modalApi] = useVbenModal({ async onOpenChange(isOpen: boolean) { if (!isOpen) { formData.value = undefined; + await formApi.resetForm(); return; } + // 重置表单 + await formApi.resetForm(); + const data = modalApi.getData(); // 如果没有数据或没有 id,表示是新增 if (!data || !data.id) { diff --git a/apps/web-antd/src/views/iot/product/category/data.ts b/apps/web-antd/src/views/iot/product/category/data.ts index 2604b0406..da109b8bc 100644 --- a/apps/web-antd/src/views/iot/product/category/data.ts +++ b/apps/web-antd/src/views/iot/product/category/data.ts @@ -1,12 +1,13 @@ import type { VbenFormSchema } from '#/adapter/form'; import type { VxeTableGridOptions } from '#/adapter/vxe-table'; -import { DICT_TYPE } from '@vben/constants'; +import { CommonStatusEnum, DICT_TYPE } from '@vben/constants'; +import { getDictOptions } from '@vben/hooks'; import { z } from '#/adapter/form'; -import { getSimpleProductCategoryList } from '#/api/iot/product/category'; +import { getRangePickerDefaultProps } from '#/utils'; -/** 新增/修改产品分类的表单 */ +/** 新增/修改的表单 */ export function useFormSchema(): VbenFormSchema[] { return [ { @@ -19,51 +20,37 @@ export function useFormSchema(): VbenFormSchema[] { }, { fieldName: 'name', - label: '分类名称', + label: '分类名字', component: 'Input', componentProps: { - placeholder: '请输入分类名称', + placeholder: '请输入分类名字', }, rules: z .string() - .min(1, '分类名称不能为空') - .max(64, '分类名称长度不能超过 64 个字符'), - }, - { - fieldName: 'parentId', - label: '父级分类', - component: 'ApiTreeSelect', - componentProps: { - api: getSimpleProductCategoryList, - labelField: 'name', - valueField: 'id', - placeholder: '请选择父级分类', - allowClear: true, - }, + .min(1, '分类名字不能为空') + .max(64, '分类名字长度不能超过 64 个字符'), }, { fieldName: 'sort', - label: '排序', + label: '分类排序', component: 'InputNumber', componentProps: { - placeholder: '请输入排序', + placeholder: '请输入分类排序', class: 'w-full', min: 0, }, - rules: 'required', + rules: z.number().min(0, '分类排序不能为空'), }, { fieldName: 'status', - label: '状态', + label: '分类状态', component: 'RadioGroup', - defaultValue: 1, componentProps: { - options: [ - { label: '开启', value: 1 }, - { label: '关闭', value: 0 }, - ], + options: getDictOptions(DICT_TYPE.COMMON_STATUS, 'number'), + buttonStyle: 'solid', + optionType: 'button', }, - rules: 'required', + rules: z.number().default(CommonStatusEnum.ENABLE), }, { fieldName: 'description', @@ -82,10 +69,10 @@ export function useGridFormSchema(): VbenFormSchema[] { return [ { fieldName: 'name', - label: '分类名称', + label: '分类名字', component: 'Input', componentProps: { - placeholder: '请输入分类名称', + placeholder: '请输入分类名字', allowClear: true, }, }, @@ -94,9 +81,8 @@ export function useGridFormSchema(): VbenFormSchema[] { label: '创建时间', component: 'RangePicker', componentProps: { - placeholder: ['开始日期', '结束日期'], + ...getRangePickerDefaultProps(), allowClear: true, - class: 'w-full', }, }, ]; @@ -114,7 +100,6 @@ export function useGridColumns(): VxeTableGridOptions['columns'] { field: 'name', title: '名字', minWidth: 200, - treeNode: true, }, { field: 'sort', diff --git a/apps/web-antd/src/views/iot/product/category/index.vue b/apps/web-antd/src/views/iot/product/category/index.vue index 7344bd5de..3ccc4e830 100644 --- a/apps/web-antd/src/views/iot/product/category/index.vue +++ b/apps/web-antd/src/views/iot/product/category/index.vue @@ -3,7 +3,6 @@ import type { VxeTableGridOptions } from '#/adapter/vxe-table'; import type { IotProductCategoryApi } from '#/api/iot/product/category'; import { Page, useVbenModal } from '@vben/common-ui'; -import { handleTree } from '@vben/utils'; import { message } from 'ant-design-vue'; @@ -70,16 +69,11 @@ const [Grid, gridApi] = useVbenVxeGrid({ proxyConfig: { ajax: { query: async ({ page }, formValues) => { - const data = await getProductCategoryPage({ + return await getProductCategoryPage({ pageNo: page.currentPage, pageSize: page.pageSize, ...formValues, }); - // 转换为树形结构 - return { - ...data, - list: handleTree(data.list, 'id', 'parentId'), - }; }, }, }, @@ -91,16 +85,6 @@ const [Grid, gridApi] = useVbenVxeGrid({ refresh: true, search: true, }, - treeConfig: { - parentField: 'parentId', - rowField: 'id', - transform: true, - expandAll: true, - reserve: true, - trigger: 'default', - iconOpen: '', - iconClose: '', - }, } as VxeTableGridOptions, }); @@ -121,8 +105,6 @@ const [Grid, gridApi] = useVbenVxeGrid({ ]" /> - -