diff --git a/apps/web-antd/src/api/ai/knowledge/document/index.ts b/apps/web-antd/src/api/ai/knowledge/document/index.ts index de941a00f..6c29804e4 100644 --- a/apps/web-antd/src/api/ai/knowledge/document/index.ts +++ b/apps/web-antd/src/api/ai/knowledge/document/index.ts @@ -23,10 +23,8 @@ export function getKnowledgeDocumentPage(params: PageParam) { } // 查询知识库文档详情 -export function getKnowledge(id: number) { - return requestClient.get( - `/ai/knowledge/document/get?id=${id}`, - ); +export function getKnowledgeDocument(id: number) { + return requestClient.get(`/ai/knowledge/document/get?id=${id}`); } // 新增知识库文档(单个) export function createKnowledge(data: any) { @@ -38,7 +36,7 @@ export function createKnowledgeDocumentList(data: any) { } // 修改知识库文档 -export function updateKnowledge(data: any) { +export function updateKnowledgeDocument(data: any) { return requestClient.put('/ai/knowledge/document/update', data); } diff --git a/apps/web-antd/src/api/ai/knowledge/segment/index.ts b/apps/web-antd/src/api/ai/knowledge/segment/index.ts index 37d0e8b9f..359479e2f 100644 --- a/apps/web-antd/src/api/ai/knowledge/segment/index.ts +++ b/apps/web-antd/src/api/ai/knowledge/segment/index.ts @@ -26,7 +26,7 @@ export function getKnowledgeSegmentPage(params: PageParam) { } // 查询知识库分段详情 -export function getKnowledge(id: number) { +export function getKnowledgeSegment(id: number) { return requestClient.get( `/ai/knowledge/segment/get?id=${id}`, ); diff --git a/apps/web-antd/src/api/basic/productunit/index.ts b/apps/web-antd/src/api/basic/productunit/index.ts new file mode 100644 index 000000000..75641793f --- /dev/null +++ b/apps/web-antd/src/api/basic/productunit/index.ts @@ -0,0 +1,57 @@ +import type { PageParam, PageResult } from '@vben/request'; + +import { requestClient } from '#/api/request'; + +export namespace ProductUnitApi { + /** 产品单位信息 */ + export interface ProductUnit { + id: number; // 编号 + groupId?: number; // 分组编号 + name?: string; // 单位名称 + basic?: number; // 基础单位 + number?: number; // 单位数量/相对于基础单位 + usageType: number; // 用途 + } +} + +/** 查询产品单位分页 */ +export function getProductUnitPage(params: PageParam) { + return requestClient.get>( + '/basic/product-unit/page', + { params }, + ); +} + +/** 查询产品单位详情 */ +export function getProductUnit(id: number) { + return requestClient.get( + `/basic/product-unit/get?id=${id}`, + ); +} + +/** 新增产品单位 */ +export function createProductUnit(data: ProductUnitApi.ProductUnit) { + return requestClient.post('/basic/product-unit/create', data); +} + +/** 修改产品单位 */ +export function updateProductUnit(data: ProductUnitApi.ProductUnit) { + return requestClient.put('/basic/product-unit/update', data); +} + +/** 删除产品单位 */ +export function deleteProductUnit(id: number) { + return requestClient.delete(`/basic/product-unit/delete?id=${id}`); +} + +/** 批量删除产品单位 */ +export function deleteProductUnitListByIds(ids: number[]) { + return requestClient.delete( + `/basic/product-unit/delete-list?ids=${ids.join(',')}`, + ); +} + +/** 导出产品单位 */ +export function exportProductUnit(params: any) { + return requestClient.download('/basic/product-unit/export-excel', params); +} diff --git a/apps/web-antd/src/api/basic/productunitgroup/index.ts b/apps/web-antd/src/api/basic/productunitgroup/index.ts new file mode 100644 index 000000000..92b978bf7 --- /dev/null +++ b/apps/web-antd/src/api/basic/productunitgroup/index.ts @@ -0,0 +1,61 @@ +import type { PageParam, PageResult } from '@vben/request'; + +import { requestClient } from '#/api/request'; + +export namespace ProductUnitGroupApi { + /** 产品单位组信息 */ + export interface ProductUnitGroup { + id: number; // 编号 + name?: string; // 产品单位组名称 + status?: number; // 开启状态 + } +} + +/** 查询产品单位组分页 */ +export function getProductUnitGroupPage(params: PageParam) { + return requestClient.get>( + '/basic/product-unit-group/page', + { params }, + ); +} + +/** 查询产品单位组详情 */ +export function getProductUnitGroup(id: number) { + return requestClient.get( + `/basic/product-unit-group/get?id=${id}`, + ); +} + +/** 新增产品单位组 */ +export function createProductUnitGroup( + data: ProductUnitGroupApi.ProductUnitGroup, +) { + return requestClient.post('/basic/product-unit-group/create', data); +} + +/** 修改产品单位组 */ +export function updateProductUnitGroup( + data: ProductUnitGroupApi.ProductUnitGroup, +) { + return requestClient.put('/basic/product-unit-group/update', data); +} + +/** 删除产品单位组 */ +export function deleteProductUnitGroup(id: number) { + return requestClient.delete(`/basic/product-unit-group/delete?id=${id}`); +} + +/** 批量删除产品单位组 */ +export function deleteProductUnitGroupListByIds(ids: number[]) { + return requestClient.delete( + `/basic/product-unit-group/delete-list?ids=${ids.join(',')}`, + ); +} + +/** 导出产品单位组 */ +export function exportProductUnitGroup(params: any) { + return requestClient.download( + '/basic/product-unit-group/export-excel', + params, + ); +} diff --git a/apps/web-antd/src/router/routes/modules/ai.ts b/apps/web-antd/src/router/routes/modules/ai.ts index 8cfcd83db..9e1feb92c 100644 --- a/apps/web-antd/src/router/routes/modules/ai.ts +++ b/apps/web-antd/src/router/routes/modules/ai.ts @@ -21,30 +21,30 @@ const routes: RouteRecordRaw[] = [ activePath: '/ai/knowledge', }, }, - // { - // path: 'knowledge/document/create', - // component: () => import('#/views/ai/knowledge/document/form/index.vue'), - // name: 'AiKnowledgeDocumentCreate', - // meta: { - // noCache: true, - // hidden: true, - // canTo: true, - // title: '创建文档', - // activePath: '/ai/knowledge', - // }, - // }, - // { - // path: 'knowledge/document/update', - // component: () => import('#/views/ai/knowledge/document/form/index.vue'), - // name: 'AiKnowledgeDocumentUpdate', - // meta: { - // noCache: true, - // hidden: true, - // canTo: true, - // title: '修改文档', - // activePath: '/ai/knowledge', - // }, - // }, + { + path: 'knowledge/document/create', + component: () => import('#/views/ai/knowledge/document/form/index.vue'), + name: 'AiKnowledgeDocumentCreate', + meta: { + noCache: true, + hidden: true, + canTo: true, + title: '创建文档', + activePath: '/ai/knowledge', + }, + }, + { + path: 'knowledge/document/update', + component: () => import('#/views/ai/knowledge/document/form/index.vue'), + name: 'AiKnowledgeDocumentUpdate', + meta: { + noCache: true, + hidden: true, + canTo: true, + title: '修改文档', + activePath: '/ai/knowledge', + }, + }, { path: 'knowledge/retrieval', component: () => @@ -58,18 +58,18 @@ const routes: RouteRecordRaw[] = [ activePath: '/ai/knowledge', }, }, - // { - // path: 'knowledge/segment', - // component: () => import('#/views/ai/knowledge/segment/index.vue'), - // name: 'AiKnowledgeSegment', - // meta: { - // noCache: true, - // hidden: true, - // canTo: true, - // title: '知识库分段', - // activePath: '/ai/knowledge', - // }, - // }, + { + path: 'knowledge/segment', + component: () => import('#/views/ai/knowledge/segment/index.vue'), + name: 'AiKnowledgeSegment', + meta: { + noCache: true, + hidden: true, + canTo: true, + title: '知识库分段', + activePath: '/ai/knowledge', + }, + }, { path: 'console/workflow/create', component: () => import('#/views/ai/workflow/form/index.vue'), diff --git a/apps/web-antd/src/utils/index.ts b/apps/web-antd/src/utils/index.ts index b33984b78..9e82ab96e 100644 --- a/apps/web-antd/src/utils/index.ts +++ b/apps/web-antd/src/utils/index.ts @@ -6,3 +6,4 @@ export * from './formatTime'; export * from './formCreate'; export * from './rangePickerProps'; export * from './routerHelper'; +export * from './upload'; diff --git a/apps/web-antd/src/utils/upload.ts b/apps/web-antd/src/utils/upload.ts new file mode 100644 index 000000000..3c5759569 --- /dev/null +++ b/apps/web-antd/src/utils/upload.ts @@ -0,0 +1,67 @@ +/** + * 根据支持的文件类型生成 accept 属性值 + * + * @param supportedFileTypes 支持的文件类型数组,如 ['PDF', 'DOC', 'DOCX'] + * @returns 用于文件上传组件 accept 属性的字符串 + */ +export const generateAcceptedFileTypes = ( + supportedFileTypes: string[], +): string => { + const allowedExtensions = supportedFileTypes.map((ext) => ext.toLowerCase()); + const mimeTypes: string[] = []; + + // 添加常见的 MIME 类型映射 + if (allowedExtensions.includes('txt')) { + mimeTypes.push('text/plain'); + } + if (allowedExtensions.includes('pdf')) { + mimeTypes.push('application/pdf'); + } + if (allowedExtensions.includes('html') || allowedExtensions.includes('htm')) { + mimeTypes.push('text/html'); + } + if (allowedExtensions.includes('csv')) { + mimeTypes.push('text/csv'); + } + if (allowedExtensions.includes('xlsx') || allowedExtensions.includes('xls')) { + mimeTypes.push( + 'application/vnd.ms-excel', + 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', + ); + } + if (allowedExtensions.includes('docx') || allowedExtensions.includes('doc')) { + mimeTypes.push( + 'application/msword', + 'application/vnd.openxmlformats-officedocument.wordprocessingml.document', + ); + } + if (allowedExtensions.includes('pptx') || allowedExtensions.includes('ppt')) { + mimeTypes.push( + 'application/vnd.ms-powerpoint', + 'application/vnd.openxmlformats-officedocument.presentationml.presentation', + ); + } + if (allowedExtensions.includes('xml')) { + mimeTypes.push('application/xml', 'text/xml'); + } + if ( + allowedExtensions.includes('md') || + allowedExtensions.includes('markdown') + ) { + mimeTypes.push('text/markdown'); + } + if (allowedExtensions.includes('epub')) { + mimeTypes.push('application/epub+zip'); + } + if (allowedExtensions.includes('eml')) { + mimeTypes.push('message/rfc822'); + } + if (allowedExtensions.includes('msg')) { + mimeTypes.push('application/vnd.ms-outlook'); + } + + // 添加文件扩展名 + const extensions = allowedExtensions.map((ext) => `.${ext}`); + + return [...mimeTypes, ...extensions].join(','); +}; diff --git a/apps/web-antd/src/views/ai/knowledge/document/data.ts b/apps/web-antd/src/views/ai/knowledge/document/data.ts index c135cbab3..d1839e013 100644 --- a/apps/web-antd/src/views/ai/knowledge/document/data.ts +++ b/apps/web-antd/src/views/ai/knowledge/document/data.ts @@ -31,7 +31,7 @@ export function useFormSchema(): VbenFormSchema[] { label: '知识库描述', component: 'Textarea', componentProps: { - row: 3, + rows: 3, placeholder: '请输入知识库描述', }, }, diff --git a/apps/web-antd/src/views/ai/knowledge/document/form/ProcessStep.vue b/apps/web-antd/src/views/ai/knowledge/document/form/ProcessStep.vue new file mode 100644 index 000000000..c48d4e7d6 --- /dev/null +++ b/apps/web-antd/src/views/ai/knowledge/document/form/ProcessStep.vue @@ -0,0 +1,158 @@ + + + diff --git a/apps/web-antd/src/views/ai/knowledge/document/form/SplitStep.vue b/apps/web-antd/src/views/ai/knowledge/document/form/SplitStep.vue new file mode 100644 index 000000000..bcf87c4aa --- /dev/null +++ b/apps/web-antd/src/views/ai/knowledge/document/form/SplitStep.vue @@ -0,0 +1,285 @@ + + + diff --git a/apps/web-antd/src/views/ai/knowledge/document/form/UploadStep.vue b/apps/web-antd/src/views/ai/knowledge/document/form/UploadStep.vue new file mode 100644 index 000000000..aa2507353 --- /dev/null +++ b/apps/web-antd/src/views/ai/knowledge/document/form/UploadStep.vue @@ -0,0 +1,264 @@ + + + diff --git a/apps/web-antd/src/views/ai/knowledge/document/form/index.vue b/apps/web-antd/src/views/ai/knowledge/document/form/index.vue index 0ada1d8a6..296669933 100644 --- a/apps/web-antd/src/views/ai/knowledge/document/form/index.vue +++ b/apps/web-antd/src/views/ai/knowledge/document/form/index.vue @@ -1 +1,197 @@ - + + + diff --git a/apps/web-antd/src/views/ai/knowledge/document/index.vue b/apps/web-antd/src/views/ai/knowledge/document/index.vue index 01b39881b..4c4db45ea 100644 --- a/apps/web-antd/src/views/ai/knowledge/document/index.vue +++ b/apps/web-antd/src/views/ai/knowledge/document/index.vue @@ -8,7 +8,7 @@ import { useRoute, useRouter } from 'vue-router'; import { useAccess } from '@vben/access'; import { confirm, Page } from '@vben/common-ui'; -import { message } from 'ant-design-vue'; +import { message, Switch } from 'ant-design-vue'; import { ACTION_ICON, TableAction, useVbenVxeGrid } from '#/adapter/vxe-table'; import { @@ -151,7 +151,9 @@ onMounted(() => {