|
|
@@ -1,5 +1,7 @@
|
|
|
import axios from 'axios'
|
|
|
|
|
|
+// ==================== Axios 实例 ====================
|
|
|
+
|
|
|
const api = axios.create({
|
|
|
baseURL: '/api/v1',
|
|
|
timeout: 30000,
|
|
|
@@ -8,14 +10,13 @@ const api = axios.create({
|
|
|
}
|
|
|
})
|
|
|
|
|
|
-// 请求拦截器
|
|
|
+// 请求拦截器 - 自动附加 Token
|
|
|
api.interceptors.request.use(
|
|
|
config => {
|
|
|
- // 可以在这里添加 token
|
|
|
- // const token = localStorage.getItem('token')
|
|
|
- // if (token) {
|
|
|
- // config.headers.Authorization = `Bearer ${token}`
|
|
|
- // }
|
|
|
+ const token = localStorage.getItem('accessToken')
|
|
|
+ if (token) {
|
|
|
+ config.headers.Authorization = `Bearer ${token}`
|
|
|
+ }
|
|
|
return config
|
|
|
},
|
|
|
error => Promise.reject(error)
|
|
|
@@ -28,769 +29,300 @@ api.interceptors.response.use(
|
|
|
if (data.code === 200) {
|
|
|
return data.data
|
|
|
}
|
|
|
- return Promise.reject(new Error(data.msg || '请求失败'))
|
|
|
+ return Promise.reject(new Error(data.message || '请求失败'))
|
|
|
},
|
|
|
error => {
|
|
|
- console.error('API Error:', error)
|
|
|
- return Promise.reject(error)
|
|
|
+ if (error.response?.status === 401) {
|
|
|
+ localStorage.removeItem('accessToken')
|
|
|
+ localStorage.removeItem('refreshToken')
|
|
|
+ localStorage.removeItem('username')
|
|
|
+ window.location.href = '/login'
|
|
|
+ }
|
|
|
+ const msg = error.response?.data?.message || error.message || '网络错误'
|
|
|
+ return Promise.reject(new Error(msg))
|
|
|
}
|
|
|
)
|
|
|
|
|
|
-// ==================== 模板 API ====================
|
|
|
-
|
|
|
-export const templateApi = {
|
|
|
- // 获取模板列表
|
|
|
- list(page = 1, size = 20) {
|
|
|
- return api.get('/templates', { params: { page, size } })
|
|
|
- },
|
|
|
-
|
|
|
- // 获取首页统计数据
|
|
|
- getStats() {
|
|
|
- return api.get('/templates/stats')
|
|
|
- },
|
|
|
-
|
|
|
- // 搜索模板
|
|
|
- search(keyword) {
|
|
|
- return api.get('/templates/search', { params: { keyword } })
|
|
|
- },
|
|
|
-
|
|
|
- // 获取可访问的模板
|
|
|
- listAccessible() {
|
|
|
- return api.get('/templates/accessible')
|
|
|
- },
|
|
|
-
|
|
|
- // 获取模板详情
|
|
|
- getById(id) {
|
|
|
- return api.get(`/templates/${id}`)
|
|
|
- },
|
|
|
-
|
|
|
- // 创建模板
|
|
|
- create(data) {
|
|
|
- return api.post('/templates', data)
|
|
|
- },
|
|
|
-
|
|
|
- // 更新模板
|
|
|
- update(id, data) {
|
|
|
- return api.put(`/templates/${id}`, data)
|
|
|
- },
|
|
|
-
|
|
|
- // 删除模板
|
|
|
- delete(id) {
|
|
|
- return api.delete(`/templates/${id}`)
|
|
|
- },
|
|
|
-
|
|
|
- // 发布模板
|
|
|
- publish(id) {
|
|
|
- return api.post(`/templates/${id}/publish`)
|
|
|
- },
|
|
|
-
|
|
|
- // 归档模板
|
|
|
- archive(id) {
|
|
|
- return api.post(`/templates/${id}/archive`)
|
|
|
- },
|
|
|
-
|
|
|
- // 复制模板
|
|
|
- duplicate(id, newName) {
|
|
|
- return api.post(`/templates/${id}/duplicate`, null, { params: { newName } })
|
|
|
- }
|
|
|
-}
|
|
|
-
|
|
|
-// ==================== 来源文件 API ====================
|
|
|
-
|
|
|
-export const sourceFileApi = {
|
|
|
- // 获取模板的来源文件列表
|
|
|
- list(templateId) {
|
|
|
- return api.get(`/templates/${templateId}/source-files`)
|
|
|
- },
|
|
|
-
|
|
|
- // 添加来源文件定义
|
|
|
- add(templateId, data) {
|
|
|
- return api.post(`/templates/${templateId}/source-files`, data)
|
|
|
- },
|
|
|
-
|
|
|
- // 更新来源文件定义
|
|
|
- update(id, data) {
|
|
|
- return api.put(`/templates/source-files/${id}`, data)
|
|
|
- },
|
|
|
-
|
|
|
- // 删除来源文件定义
|
|
|
- delete(id, force = false) {
|
|
|
- return api.delete(`/templates/source-files/${id}`, { params: { force } })
|
|
|
- }
|
|
|
-}
|
|
|
-
|
|
|
-// ==================== 变量 API ====================
|
|
|
-
|
|
|
-export const variableApi = {
|
|
|
- // 获取模板的变量列表
|
|
|
- list(templateId, params = {}) {
|
|
|
- return api.get(`/templates/${templateId}/variables`, { params })
|
|
|
- },
|
|
|
-
|
|
|
- // 获取变量按类别分组
|
|
|
- listGrouped(templateId) {
|
|
|
- return api.get(`/templates/${templateId}/variables/grouped`)
|
|
|
- },
|
|
|
+// ==================== 认证 API ====================
|
|
|
|
|
|
- // 添加变量
|
|
|
- add(templateId, data) {
|
|
|
- return api.post(`/templates/${templateId}/variables`, data)
|
|
|
+export const authApi = {
|
|
|
+ login(data) {
|
|
|
+ return api.post('/auth/login', { username: data.usernameOrEmail || data.username, password: data.password })
|
|
|
},
|
|
|
|
|
|
- // 获取变量详情
|
|
|
- getById(id) {
|
|
|
- return api.get(`/templates/variables/${id}`)
|
|
|
+ logout() {
|
|
|
+ return api.post('/auth/logout')
|
|
|
},
|
|
|
|
|
|
- // 更新变量
|
|
|
- update(id, data) {
|
|
|
- return api.put(`/templates/variables/${id}`, data)
|
|
|
+ refreshToken(refreshToken) {
|
|
|
+ return api.post('/auth/refresh', { refreshToken })
|
|
|
},
|
|
|
|
|
|
- // 删除变量
|
|
|
- delete(id, force = false) {
|
|
|
- return api.delete(`/templates/variables/${id}`, { params: { force } })
|
|
|
+ getCurrentUser() {
|
|
|
+ return api.get('/auth/me')
|
|
|
},
|
|
|
|
|
|
- // 预览提取结果
|
|
|
- preview(id, documentId) {
|
|
|
- return api.post(`/templates/variables/${id}/preview`, null, { params: { documentId } })
|
|
|
+ getPermissions() {
|
|
|
+ return api.get('/auth/permissions')
|
|
|
},
|
|
|
|
|
|
- // 重排序变量
|
|
|
- reorder(templateId, orderedIds) {
|
|
|
- return api.post(`/templates/${templateId}/variables/reorder`, { orderedIds })
|
|
|
+ changePassword(data) {
|
|
|
+ return api.put('/auth/password', data)
|
|
|
}
|
|
|
}
|
|
|
|
|
|
-// ==================== 生成任务 API ====================
|
|
|
+// ==================== 项目 API ====================
|
|
|
|
|
|
-export const generationApi = {
|
|
|
- // 获取生成任务列表
|
|
|
+export const projectApi = {
|
|
|
list(params = {}) {
|
|
|
- return api.get('/generations', { params })
|
|
|
+ return api.get('/projects', { params })
|
|
|
},
|
|
|
|
|
|
- // 获取生成任务详情
|
|
|
getById(id) {
|
|
|
- return api.get(`/generations/${id}`)
|
|
|
+ return api.get(`/projects/${id}`)
|
|
|
},
|
|
|
|
|
|
- // 创建生成任务
|
|
|
create(data) {
|
|
|
- return api.post('/generations', data)
|
|
|
+ return api.post('/projects', data)
|
|
|
},
|
|
|
|
|
|
- // 执行变量提取
|
|
|
- execute(id) {
|
|
|
- return api.post(`/generations/${id}/execute`)
|
|
|
+ update(id, data) {
|
|
|
+ return api.put(`/projects/${id}`, data)
|
|
|
},
|
|
|
|
|
|
- // 获取执行进度
|
|
|
- getProgress(id) {
|
|
|
- return api.get(`/generations/${id}/progress`)
|
|
|
+ delete(id) {
|
|
|
+ return api.delete(`/projects/${id}`)
|
|
|
},
|
|
|
|
|
|
- // 修改变量值
|
|
|
- updateVariableValue(id, variableName, data) {
|
|
|
- return api.put(`/generations/${id}/variables/${variableName}`, data)
|
|
|
+ copy(id) {
|
|
|
+ return api.post(`/projects/${id}/copy`)
|
|
|
},
|
|
|
|
|
|
- // 确认并生成文档
|
|
|
- confirm(id) {
|
|
|
- return api.post(`/generations/${id}/confirm`)
|
|
|
+ archive(id) {
|
|
|
+ return api.post(`/projects/${id}/archive`)
|
|
|
},
|
|
|
|
|
|
- // 下载生成文档
|
|
|
- getDownloadUrl(id) {
|
|
|
- return `/api/v1/generations/${id}/download`
|
|
|
+ export(id) {
|
|
|
+ return api.get(`/projects/${id}/export`, { responseType: 'blob' })
|
|
|
}
|
|
|
}
|
|
|
|
|
|
-// ==================== 认证 API ====================
|
|
|
-// 注意:认证接口不在 /api/v1 下,使用独立的 axios 实例
|
|
|
+// ==================== 要素 API ====================
|
|
|
|
|
|
-const authInstance = axios.create({
|
|
|
- baseURL: '/auth',
|
|
|
- timeout: 30000,
|
|
|
- headers: {
|
|
|
- 'Content-Type': 'application/json'
|
|
|
- }
|
|
|
-})
|
|
|
-
|
|
|
-// 认证 API 响应拦截器
|
|
|
-authInstance.interceptors.response.use(
|
|
|
- response => {
|
|
|
- const { data } = response
|
|
|
- if (data.code === 200) {
|
|
|
- return data.data
|
|
|
- }
|
|
|
- return Promise.reject(new Error(data.msg || '请求失败'))
|
|
|
+export const elementApi = {
|
|
|
+ list(projectId) {
|
|
|
+ return api.get(`/projects/${projectId}/elements`)
|
|
|
},
|
|
|
- error => {
|
|
|
- console.error('Auth API Error:', error)
|
|
|
- return Promise.reject(error)
|
|
|
- }
|
|
|
-)
|
|
|
|
|
|
-export const authApi = {
|
|
|
- // 用户登录
|
|
|
- login(data) {
|
|
|
- return authInstance.post('/login', data)
|
|
|
+ add(projectId, data) {
|
|
|
+ return api.post(`/projects/${projectId}/elements`, data)
|
|
|
},
|
|
|
|
|
|
- // 用户注册
|
|
|
- register(data) {
|
|
|
- return authInstance.post('/register', data)
|
|
|
+ update(projectId, elementId, data) {
|
|
|
+ return api.put(`/projects/${projectId}/elements/${elementId}`, data)
|
|
|
},
|
|
|
|
|
|
- // 用户登出
|
|
|
- logout() {
|
|
|
- const token = localStorage.getItem('accessToken')
|
|
|
- return authInstance.post('/logout', null, {
|
|
|
- headers: { Authorization: `Bearer ${token}` }
|
|
|
- })
|
|
|
- },
|
|
|
+ delete(projectId, elementId) {
|
|
|
+ return api.delete(`/projects/${projectId}/elements/${elementId}`)
|
|
|
+ }
|
|
|
+}
|
|
|
|
|
|
- // 刷新 Token
|
|
|
- refreshToken(refreshToken) {
|
|
|
- return authInstance.post('/refresh', { refreshToken })
|
|
|
+// ==================== 要素值 API ====================
|
|
|
+
|
|
|
+export const valueApi = {
|
|
|
+ list(projectId) {
|
|
|
+ return api.get(`/projects/${projectId}/values`)
|
|
|
},
|
|
|
|
|
|
- // 获取当前用户信息
|
|
|
- getCurrentUser() {
|
|
|
- const token = localStorage.getItem('accessToken')
|
|
|
- return authInstance.get('/me', {
|
|
|
- headers: { Authorization: `Bearer ${token}` }
|
|
|
- })
|
|
|
+ getByKey(projectId, elementKey) {
|
|
|
+ return api.get(`/projects/${projectId}/values/${elementKey}`)
|
|
|
},
|
|
|
|
|
|
- // 更新用户资料
|
|
|
- updateProfile(data) {
|
|
|
- const token = localStorage.getItem('accessToken')
|
|
|
- return authInstance.put('/profile', data, {
|
|
|
- headers: { Authorization: `Bearer ${token}` }
|
|
|
- })
|
|
|
+ update(projectId, elementKey, data) {
|
|
|
+ return api.put(`/projects/${projectId}/values/${elementKey}`, data)
|
|
|
},
|
|
|
|
|
|
- // 修改密码
|
|
|
- changePassword(data) {
|
|
|
- const token = localStorage.getItem('accessToken')
|
|
|
- return authInstance.put('/password', data, {
|
|
|
- headers: { Authorization: `Bearer ${token}` }
|
|
|
- })
|
|
|
+ batchUpdate(projectId, values) {
|
|
|
+ return api.put(`/projects/${projectId}/values`, values)
|
|
|
}
|
|
|
}
|
|
|
|
|
|
-// ==================== 任务中心 API ====================
|
|
|
+// ==================== 附件 API ====================
|
|
|
|
|
|
-export const taskCenterApi = {
|
|
|
- // 获取任务列表
|
|
|
- list(params = {}) {
|
|
|
- return api.get('/tasks/list', { params })
|
|
|
- },
|
|
|
-
|
|
|
- // 获取任务详情
|
|
|
- getById(taskId) {
|
|
|
- return api.get(`/tasks/${taskId}/detail`)
|
|
|
- },
|
|
|
-
|
|
|
- // 根据文档ID获取任务详情
|
|
|
- getByDocumentId(documentId) {
|
|
|
- return api.get(`/tasks/by-document/${documentId}`)
|
|
|
+export const attachmentApi = {
|
|
|
+ list(projectId) {
|
|
|
+ return api.get(`/projects/${projectId}/attachments`)
|
|
|
},
|
|
|
|
|
|
- // 获取任务统计
|
|
|
- getStatistics() {
|
|
|
- return api.get('/tasks/statistics')
|
|
|
+ getById(attachmentId) {
|
|
|
+ return api.get(`/attachments/${attachmentId}`)
|
|
|
},
|
|
|
|
|
|
- // 删除任务
|
|
|
- delete(taskId) {
|
|
|
- return api.delete(`/tasks/${taskId}`)
|
|
|
- }
|
|
|
-}
|
|
|
-
|
|
|
-// ==================== 解析 API ====================
|
|
|
-
|
|
|
-export const parseApi = {
|
|
|
- // 上传文件并解析
|
|
|
- upload(file, templateId = null) {
|
|
|
+ upload(projectId, file, displayName = null) {
|
|
|
const formData = new FormData()
|
|
|
formData.append('file', file)
|
|
|
- if (templateId) {
|
|
|
- formData.append('templateId', templateId)
|
|
|
+ if (displayName) {
|
|
|
+ formData.append('displayName', displayName)
|
|
|
}
|
|
|
- return api.post('/parse/upload', formData, {
|
|
|
- headers: {
|
|
|
- 'Content-Type': 'multipart/form-data'
|
|
|
- }
|
|
|
+ return api.post(`/projects/${projectId}/attachments/upload`, formData, {
|
|
|
+ headers: { 'Content-Type': 'multipart/form-data' }
|
|
|
})
|
|
|
},
|
|
|
|
|
|
- // 启动文档解析
|
|
|
- startParse(documentId) {
|
|
|
- return api.post(`/parse/start/${documentId}`)
|
|
|
+ delete(attachmentId) {
|
|
|
+ return api.delete(`/attachments/${attachmentId}`)
|
|
|
},
|
|
|
|
|
|
- // 获取解析状态
|
|
|
- getStatus(documentId) {
|
|
|
- return api.get(`/parse/status/${documentId}`)
|
|
|
- }
|
|
|
-}
|
|
|
-
|
|
|
-// ==================== 文档 API ====================
|
|
|
-
|
|
|
-export const documentApi = {
|
|
|
- // 获取文档基本信息
|
|
|
- getById(documentId) {
|
|
|
- return api.get(`/documents/${documentId}`)
|
|
|
- },
|
|
|
-
|
|
|
- // 获取文档列表
|
|
|
- list(params = {}) {
|
|
|
- return api.get('/documents', { params })
|
|
|
- },
|
|
|
-
|
|
|
- // 获取文档纯文本内容
|
|
|
- getText(documentId) {
|
|
|
- return api.get(`/documents/${documentId}/text`)
|
|
|
+ parse(attachmentId) {
|
|
|
+ return api.post(`/attachments/${attachmentId}/parse`)
|
|
|
},
|
|
|
|
|
|
- // 获取文档结构化元素
|
|
|
- getElements(documentId) {
|
|
|
- return api.get(`/documents/${documentId}/elements`)
|
|
|
+ sort(projectId, orderedIds) {
|
|
|
+ return api.put(`/projects/${projectId}/attachments/sort`, orderedIds)
|
|
|
},
|
|
|
|
|
|
- // 获取结构化文档(用于编辑器)
|
|
|
- getStructured(documentId) {
|
|
|
- return api.get(`/documents/${documentId}/structured`)
|
|
|
- },
|
|
|
-
|
|
|
- // 获取文档目录
|
|
|
- getToc(documentId) {
|
|
|
- return api.get(`/documents/${documentId}/toc`)
|
|
|
- },
|
|
|
-
|
|
|
- // 获取文档解析状态
|
|
|
- getParseStatus(documentId) {
|
|
|
- return api.get(`/documents/${documentId}/parse-status`)
|
|
|
- },
|
|
|
-
|
|
|
- // 更新文档
|
|
|
- update(documentId, data) {
|
|
|
- return api.put(`/documents/${documentId}`, data)
|
|
|
- },
|
|
|
-
|
|
|
- // 删除文档
|
|
|
- delete(documentId) {
|
|
|
- return api.delete(`/documents/${documentId}`)
|
|
|
- },
|
|
|
-
|
|
|
- // 批量删除文档
|
|
|
- batchDelete(documentIds) {
|
|
|
- return api.post('/documents/batch-delete', { documentIds })
|
|
|
- },
|
|
|
-
|
|
|
- // 获取文档图片列表
|
|
|
- getImages(documentId) {
|
|
|
- return api.get(`/documents/${documentId}/images`)
|
|
|
- },
|
|
|
-
|
|
|
- // 获取文档表格列表
|
|
|
- getTables(documentId) {
|
|
|
- return api.get(`/documents/${documentId}/tables`)
|
|
|
- },
|
|
|
-
|
|
|
- // ==================== 块操作 ====================
|
|
|
-
|
|
|
- // 更新块元素
|
|
|
- updateBlockElements(documentId, blockId, elements) {
|
|
|
- return api.put(`/documents/${documentId}/blocks/${blockId}/elements`, { elements })
|
|
|
- },
|
|
|
-
|
|
|
- // 创建新块
|
|
|
- createBlock(documentId, data) {
|
|
|
- return api.post(`/documents/${documentId}/blocks`, data)
|
|
|
- },
|
|
|
+ getDocContent(attachmentId) {
|
|
|
+ return api.get(`/attachments/${attachmentId}/doc-content`)
|
|
|
+ }
|
|
|
+}
|
|
|
|
|
|
- // 删除块
|
|
|
- deleteBlock(documentId, blockId) {
|
|
|
- return api.delete(`/documents/${documentId}/blocks/${blockId}`)
|
|
|
- },
|
|
|
+// ==================== 实体 API ====================
|
|
|
|
|
|
- // 批量保存块
|
|
|
- saveBlocksBatch(documentId, blocks) {
|
|
|
- return api.post(`/documents/${documentId}/blocks/batch`, { blocks })
|
|
|
+export const entityApi = {
|
|
|
+ listByAttachment(attachmentId) {
|
|
|
+ return api.get(`/attachments/${attachmentId}/entities`)
|
|
|
},
|
|
|
|
|
|
- // ==================== 实体标记操作 ====================
|
|
|
-
|
|
|
- /**
|
|
|
- * 标记实体(将文本转为实体)
|
|
|
- * @param {string} documentId - 文档ID
|
|
|
- * @param {string} blockId - 块ID
|
|
|
- * @param {object} data - 标记数据
|
|
|
- * @param {number} data.elementIndex - 要标记的元素在 elements 数组中的索引
|
|
|
- * @param {number} data.startOffset - 在该元素文本中的起始位置
|
|
|
- * @param {number} data.endOffset - 在该元素文本中的结束位置
|
|
|
- * @param {string} data.entityType - 实体类型
|
|
|
- */
|
|
|
- markEntity(documentId, blockId, data) {
|
|
|
- return api.post(`/documents/${documentId}/blocks/${blockId}/mark-entity`, data)
|
|
|
+ listByProject(projectId) {
|
|
|
+ return api.get(`/projects/${projectId}/entities`)
|
|
|
},
|
|
|
|
|
|
- /**
|
|
|
- * 取消实体标记(将实体还原为文本)
|
|
|
- * @param {string} documentId - 文档ID
|
|
|
- * @param {string} blockId - 块ID
|
|
|
- * @param {string} entityId - 实体ID
|
|
|
- */
|
|
|
- unmarkEntity(documentId, blockId, entityId) {
|
|
|
- return api.delete(`/documents/${documentId}/blocks/${blockId}/entities/${entityId}`)
|
|
|
+ getById(entityId) {
|
|
|
+ return api.get(`/entities/${entityId}`)
|
|
|
},
|
|
|
|
|
|
- /**
|
|
|
- * 更新实体类型
|
|
|
- * @param {string} documentId - 文档ID
|
|
|
- * @param {string} blockId - 块ID
|
|
|
- * @param {string} entityId - 实体ID
|
|
|
- * @param {string} entityType - 新的实体类型
|
|
|
- */
|
|
|
- updateEntity(documentId, blockId, entityId, entityType) {
|
|
|
- return api.put(`/documents/${documentId}/blocks/${blockId}/entities/${entityId}`, { entityType })
|
|
|
+ update(entityId, data) {
|
|
|
+ return api.put(`/entities/${entityId}`, data)
|
|
|
},
|
|
|
|
|
|
- /**
|
|
|
- * 确认实体
|
|
|
- * @param {string} documentId - 文档ID
|
|
|
- * @param {string} blockId - 块ID
|
|
|
- * @param {string} entityId - 实体ID
|
|
|
- */
|
|
|
- confirmEntity(documentId, blockId, entityId) {
|
|
|
- return api.post(`/documents/${documentId}/blocks/${blockId}/entities/${entityId}/confirm`)
|
|
|
+ merge(targetId, sourceIds) {
|
|
|
+ return api.post(`/entities/${targetId}/merge`, sourceIds)
|
|
|
}
|
|
|
}
|
|
|
|
|
|
-// ==================== 项目 API ====================
|
|
|
-
|
|
|
-export const projectApi = {
|
|
|
- // 创建项目
|
|
|
- create(data) {
|
|
|
- return api.post('/extract/projects', data)
|
|
|
- },
|
|
|
+// ==================== 规则 API ====================
|
|
|
|
|
|
- // 获取项目详情
|
|
|
- getById(id, includeDocuments = true) {
|
|
|
- return api.get(`/extract/projects/${id}`, { params: { includeDocuments } })
|
|
|
+export const ruleApi = {
|
|
|
+ list(projectId) {
|
|
|
+ return api.get(`/projects/${projectId}/rules`)
|
|
|
},
|
|
|
|
|
|
- // 分页查询项目列表
|
|
|
- list(params = {}) {
|
|
|
- return api.get('/extract/projects', { params })
|
|
|
+ getById(ruleId) {
|
|
|
+ return api.get(`/rules/${ruleId}`)
|
|
|
},
|
|
|
|
|
|
- // 按状态查询项目列表
|
|
|
- listByStatus(status) {
|
|
|
- return api.get(`/extract/projects/by-status/${status}`)
|
|
|
+ create(projectId, data) {
|
|
|
+ return api.post(`/projects/${projectId}/rules`, data)
|
|
|
},
|
|
|
|
|
|
- // 更新项目
|
|
|
- update(id, data) {
|
|
|
- return api.put(`/extract/projects/${id}`, data)
|
|
|
+ update(ruleId, data) {
|
|
|
+ return api.put(`/rules/${ruleId}`, data)
|
|
|
},
|
|
|
|
|
|
- // 删除项目
|
|
|
- delete(id) {
|
|
|
- return api.delete(`/extract/projects/${id}`)
|
|
|
+ delete(ruleId) {
|
|
|
+ return api.delete(`/rules/${ruleId}`)
|
|
|
},
|
|
|
|
|
|
- // 归档项目
|
|
|
- archive(id) {
|
|
|
- return api.post(`/extract/projects/${id}/archive`)
|
|
|
+ execute(ruleId) {
|
|
|
+ return api.post(`/rules/${ruleId}/execute`)
|
|
|
},
|
|
|
|
|
|
- // 获取用户项目统计
|
|
|
- getStatistics() {
|
|
|
- return api.get('/extract/projects/statistics')
|
|
|
+ batchExecute(projectId) {
|
|
|
+ return api.post(`/projects/${projectId}/rules/execute`)
|
|
|
}
|
|
|
}
|
|
|
|
|
|
-// ==================== 来源文档 API(项目子资源) ====================
|
|
|
-
|
|
|
-export const sourceDocumentApi = {
|
|
|
- /**
|
|
|
- * 添加来源文档到项目
|
|
|
- * @param {string} projectId - 项目ID
|
|
|
- * @param {object} data - 文档数据
|
|
|
- * @param {string} data.documentId - 关联的 Document ID
|
|
|
- * @param {string} data.alias - 文档别名,如'可研批复'
|
|
|
- * @param {string} data.docType - 文档类型: pdf/docx/xlsx
|
|
|
- * @param {number} data.displayOrder - 显示顺序
|
|
|
- * @param {object} data.metadata - 元数据
|
|
|
- */
|
|
|
- add(projectId, data) {
|
|
|
- return api.post(`/extract/projects/${projectId}/documents`, data)
|
|
|
+// ==================== 文件 API ====================
|
|
|
+
|
|
|
+export const fileApi = {
|
|
|
+ upload(file) {
|
|
|
+ const formData = new FormData()
|
|
|
+ formData.append('file', file)
|
|
|
+ return api.post('/files/upload', formData, {
|
|
|
+ headers: { 'Content-Type': 'multipart/form-data' }
|
|
|
+ })
|
|
|
},
|
|
|
|
|
|
- /**
|
|
|
- * 批量添加来源文档
|
|
|
- * @param {string} projectId - 项目ID
|
|
|
- * @param {Array} documents - 文档数组
|
|
|
- */
|
|
|
- batchAdd(projectId, documents) {
|
|
|
- return api.post(`/extract/projects/${projectId}/documents/batch`, { documents })
|
|
|
+ getDownloadUrl(fileKey) {
|
|
|
+ return `/api/v1/files/${fileKey}`
|
|
|
},
|
|
|
|
|
|
- /**
|
|
|
- * 获取项目的来源文档列表
|
|
|
- * @param {string} projectId - 项目ID
|
|
|
- */
|
|
|
- list(projectId) {
|
|
|
- return api.get(`/extract/projects/${projectId}/documents`)
|
|
|
- },
|
|
|
-
|
|
|
- /**
|
|
|
- * 获取来源文档详情
|
|
|
- * @param {string} projectId - 项目ID
|
|
|
- * @param {string} id - 来源文档ID
|
|
|
- */
|
|
|
- getById(projectId, id) {
|
|
|
- return api.get(`/extract/projects/${projectId}/documents/${id}`)
|
|
|
- },
|
|
|
-
|
|
|
- /**
|
|
|
- * 更新来源文档
|
|
|
- * @param {string} projectId - 项目ID
|
|
|
- * @param {string} id - 来源文档ID
|
|
|
- * @param {object} data - 更新数据
|
|
|
- */
|
|
|
- update(projectId, id, data) {
|
|
|
- return api.put(`/extract/projects/${projectId}/documents/${id}`, data)
|
|
|
- },
|
|
|
-
|
|
|
- /**
|
|
|
- * 移除来源文档
|
|
|
- * @param {string} projectId - 项目ID
|
|
|
- * @param {string} id - 来源文档ID
|
|
|
- * @param {boolean} force - 是否强制删除
|
|
|
- */
|
|
|
- remove(projectId, id, force = false) {
|
|
|
- return api.delete(`/extract/projects/${projectId}/documents/${id}`, { params: { force } })
|
|
|
- },
|
|
|
-
|
|
|
- /**
|
|
|
- * 调整来源文档顺序
|
|
|
- * @param {string} projectId - 项目ID
|
|
|
- * @param {Array<string>} orderedIds - 排序后的文档ID数组
|
|
|
- */
|
|
|
- reorder(projectId, orderedIds) {
|
|
|
- return api.post(`/extract/projects/${projectId}/documents/reorder`, { orderedIds })
|
|
|
- }
|
|
|
-}
|
|
|
+ getPreviewUrl(fileKey) {
|
|
|
+ return `/api/v1/files/${fileKey}/preview`
|
|
|
+ },
|
|
|
|
|
|
-// ==================== 知识图谱 API ====================
|
|
|
-// 注意:graph-service 的路径已更新为 /api/v1/graph/*
|
|
|
-
|
|
|
-export const knowledgeGraphApi = {
|
|
|
- /**
|
|
|
- * 获取文档图谱
|
|
|
- * @param {string} documentId - 文档ID
|
|
|
- */
|
|
|
- getDocumentGraph(documentId) {
|
|
|
- return api.get(`/graph/documents/${documentId}`)
|
|
|
- },
|
|
|
-
|
|
|
- /**
|
|
|
- * 获取文档实体列表(按类型分组)
|
|
|
- * @param {string} documentId - 文档ID
|
|
|
- * @param {string} type - 可选,筛选实体类型
|
|
|
- */
|
|
|
- getDocumentEntities(documentId, type = null) {
|
|
|
- const params = type ? { type } : {}
|
|
|
- return api.get(`/graph/documents/${documentId}/entities`, { params })
|
|
|
- },
|
|
|
-
|
|
|
- /**
|
|
|
- * 获取实体详情
|
|
|
- * @param {string} entityId - 实体ID
|
|
|
- */
|
|
|
- getEntityDetail(entityId) {
|
|
|
- return api.get(`/graph/entities/${entityId}`)
|
|
|
- },
|
|
|
-
|
|
|
- /**
|
|
|
- * 获取用户的全局知识图谱
|
|
|
- * @param {string} userId - 用户ID
|
|
|
- * @param {number} limit - 限制返回数量
|
|
|
- */
|
|
|
- getUserGraph(userId, limit = 100) {
|
|
|
- return api.get(`/graph/users/${userId}`, { params: { limit } })
|
|
|
- },
|
|
|
-
|
|
|
- /**
|
|
|
- * 搜索实体
|
|
|
- * @param {string} keyword - 关键词
|
|
|
- * @param {string} documentId - 可选,限定文档
|
|
|
- * @param {number} limit - 限制返回数量
|
|
|
- */
|
|
|
- searchEntities(keyword, documentId = null, limit = 20) {
|
|
|
- const params = { keyword, limit }
|
|
|
- if (documentId) params.documentId = documentId
|
|
|
- return api.get('/graph/search', { params })
|
|
|
+ delete(fileKey) {
|
|
|
+ return api.delete(`/files/${fileKey}`)
|
|
|
}
|
|
|
}
|
|
|
|
|
|
-// ==================== 图谱模板 API ====================
|
|
|
-// graph-service 的模板、项目、附件等接口路径
|
|
|
+// ==================== 任务 API ====================
|
|
|
|
|
|
-export const graphTemplateApi = {
|
|
|
- /**
|
|
|
- * 获取图谱模板列表
|
|
|
- */
|
|
|
+export const taskApi = {
|
|
|
list(params = {}) {
|
|
|
- return api.get('/graph/templates', { params })
|
|
|
- },
|
|
|
-
|
|
|
- /**
|
|
|
- * 获取图谱模板详情
|
|
|
- */
|
|
|
- getById(id) {
|
|
|
- return api.get(`/graph/templates/${id}`)
|
|
|
- },
|
|
|
-
|
|
|
- /**
|
|
|
- * 创建图谱模板
|
|
|
- */
|
|
|
- create(data) {
|
|
|
- return api.post('/graph/templates', data)
|
|
|
+ return api.get('/tasks', { params })
|
|
|
},
|
|
|
|
|
|
- /**
|
|
|
- * 更新图谱模板
|
|
|
- */
|
|
|
- update(id, data) {
|
|
|
- return api.put(`/graph/templates/${id}`, data)
|
|
|
+ getById(taskId) {
|
|
|
+ return api.get(`/tasks/${taskId}`)
|
|
|
},
|
|
|
|
|
|
- /**
|
|
|
- * 删除图谱模板
|
|
|
- */
|
|
|
- delete(id) {
|
|
|
- return api.delete(`/graph/templates/${id}`)
|
|
|
+ cancel(taskId) {
|
|
|
+ return api.post(`/tasks/${taskId}/cancel`)
|
|
|
}
|
|
|
}
|
|
|
|
|
|
-// ==================== 图谱项目 API ====================
|
|
|
+// ==================== 用户管理 API ====================
|
|
|
|
|
|
-export const graphProjectApi = {
|
|
|
- /**
|
|
|
- * 获取图谱项目列表
|
|
|
- */
|
|
|
+export const userApi = {
|
|
|
list(params = {}) {
|
|
|
- return api.get('/graph/projects', { params })
|
|
|
+ return api.get('/users', { params })
|
|
|
},
|
|
|
|
|
|
- /**
|
|
|
- * 获取图谱项目详情
|
|
|
- */
|
|
|
getById(id) {
|
|
|
- return api.get(`/graph/projects/${id}`)
|
|
|
+ return api.get(`/users/${id}`)
|
|
|
},
|
|
|
|
|
|
- /**
|
|
|
- * 创建图谱项目
|
|
|
- */
|
|
|
create(data) {
|
|
|
- return api.post('/graph/projects', data)
|
|
|
+ return api.post('/users', data)
|
|
|
},
|
|
|
|
|
|
- /**
|
|
|
- * 更新图谱项目
|
|
|
- */
|
|
|
update(id, data) {
|
|
|
- return api.put(`/graph/projects/${id}`, data)
|
|
|
+ return api.put(`/users/${id}`, data)
|
|
|
},
|
|
|
|
|
|
- /**
|
|
|
- * 删除图谱项目
|
|
|
- */
|
|
|
delete(id) {
|
|
|
- return api.delete(`/graph/projects/${id}`)
|
|
|
- },
|
|
|
-
|
|
|
- /**
|
|
|
- * 归档图谱项目
|
|
|
- */
|
|
|
- archive(id) {
|
|
|
- return api.post(`/graph/projects/${id}/archive`)
|
|
|
+ return api.delete(`/users/${id}`)
|
|
|
}
|
|
|
}
|
|
|
|
|
|
-// ==================== 图谱报告 API ====================
|
|
|
-
|
|
|
-export const graphReportApi = {
|
|
|
- /**
|
|
|
- * 获取报告列表
|
|
|
- */
|
|
|
- list(params = {}) {
|
|
|
- return api.get('/graph/reports', { params })
|
|
|
- },
|
|
|
-
|
|
|
- /**
|
|
|
- * 获取报告详情
|
|
|
- */
|
|
|
- getById(id) {
|
|
|
- return api.get(`/graph/reports/${id}`)
|
|
|
- },
|
|
|
-
|
|
|
- /**
|
|
|
- * 创建报告
|
|
|
- */
|
|
|
- create(data) {
|
|
|
- return api.post('/graph/reports', data)
|
|
|
- },
|
|
|
-
|
|
|
- /**
|
|
|
- * 更新报告
|
|
|
- */
|
|
|
- update(id, data) {
|
|
|
- return api.put(`/graph/reports/${id}`, data)
|
|
|
- },
|
|
|
+// ==================== AI API ====================
|
|
|
|
|
|
- /**
|
|
|
- * 删除报告
|
|
|
- */
|
|
|
- delete(id) {
|
|
|
- return api.delete(`/graph/reports/${id}`)
|
|
|
+export const aiApi = {
|
|
|
+ extractEntities(data) {
|
|
|
+ return api.post('/ai/ner', data)
|
|
|
},
|
|
|
|
|
|
- /**
|
|
|
- * 上传报告附件
|
|
|
- */
|
|
|
- uploadAttachment(reportId, file, displayName = null) {
|
|
|
- const formData = new FormData()
|
|
|
- formData.append('file', file)
|
|
|
- if (displayName) {
|
|
|
- formData.append('displayName', displayName)
|
|
|
- }
|
|
|
- return api.post(`/graph/reports/${reportId}/attachments/upload`, formData, {
|
|
|
- headers: { 'Content-Type': 'multipart/form-data' }
|
|
|
- })
|
|
|
+ chat(data) {
|
|
|
+ return api.post('/ai/chat', data)
|
|
|
},
|
|
|
|
|
|
- /**
|
|
|
- * 获取报告附件列表
|
|
|
- */
|
|
|
- getAttachments(reportId) {
|
|
|
- return api.get(`/graph/reports/${reportId}/attachments`)
|
|
|
+ suggest(data) {
|
|
|
+ return api.post('/ai/suggest', data)
|
|
|
},
|
|
|
|
|
|
- /**
|
|
|
- * 删除附件
|
|
|
- */
|
|
|
- deleteAttachment(attachmentId) {
|
|
|
- return api.delete(`/graph/attachments/${attachmentId}`)
|
|
|
+ optimize(data) {
|
|
|
+ return api.post('/ai/optimize', data)
|
|
|
}
|
|
|
}
|
|
|
|