From 9c80a001b653269fa5a4064d940cdc03738aab4b Mon Sep 17 00:00:00 2001 From: zhouhaibin Date: Fri, 24 Jan 2025 13:59:13 +0800 Subject: [PATCH] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E4=BB=BB=E5=8A=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../DocumentTaskResults/index.ts | 95 ++++ .../ModelUserPromptssetting/index.ts | 4 +- .../schemEvaluation/SchemEvaluation/index.ts | 57 +++ .../schemEvaluation/SchemEvaluation/model.ts | 105 ++++ src/api/tenderReview/TenderTask/index.ts | 57 +++ src/api/tenderReview/TenderTask/model.ts | 108 +++++ src/enums/taskEnum.ts | 115 +++++ .../ContractualTasks/ContractualTasks.data.ts | 36 +- .../ContractualTasksModal.vue | 23 +- .../contractReview/ContractualTasks/index.vue | 61 ++- .../DocumentTasks/DocumentTasks.data.ts | 35 +- .../DocumentTasks/DocumentTasksModal.vue | 23 +- .../DocumentTasks/DocumentTasksTable.vue | 286 +++++++++++ .../documentReview/DocumentTasks/index.vue | 235 +-------- .../ModelPrompts/ModelPrompts.data.ts | 114 +++-- .../ModelPrompts/ModelPromptsModal.vue | 4 + .../ModelPromptsHistory.data.ts | 447 ++++++++++-------- .../SchemeEvaluation/SchemEvaluation.data.ts | 150 ++++++ .../SchemeEvaluation/SchemEvaluationModal.vue | 67 +++ .../SchemeEvaluation/index.vue | 195 ++++++++ .../DocumentTasksPermissions.data.ts | 101 +++- .../DocumentTasksPermissionsDetail.data.ts | 63 ++- .../TenderTask/TenderTask.data.ts | 150 ++++++ .../TenderTask/TenderTaskModal.vue | 72 +++ src/views/tenderReview/TenderTask/index.vue | 181 +++++++ .../workbench/components/DynamicInfo.vue | 31 ++ .../workbench/components/ProjectCard.vue | 69 +++ src/views/workbench/components/QuickNav.vue | 53 +++ src/views/workbench/components/SaleRadar.vue | 94 ++++ src/views/workbench/components/TaskCard.vue | 80 ++++ .../workbench/components/TaskShowList.vue | 59 +++ .../workbench/components/WorkbenchHeader.vue | 33 ++ src/views/workbench/components/data.ts | 140 ++++++ src/views/workbench/index.vue | 76 +++ 34 files changed, 2850 insertions(+), 569 deletions(-) create mode 100644 src/api/schemEvaluation/SchemEvaluation/index.ts create mode 100644 src/api/schemEvaluation/SchemEvaluation/model.ts create mode 100644 src/api/tenderReview/TenderTask/index.ts create mode 100644 src/api/tenderReview/TenderTask/model.ts create mode 100644 src/enums/taskEnum.ts create mode 100644 src/views/documentReview/DocumentTasks/DocumentTasksTable.vue create mode 100644 src/views/schemeEvaluation/SchemeEvaluation/SchemEvaluation.data.ts create mode 100644 src/views/schemeEvaluation/SchemeEvaluation/SchemEvaluationModal.vue create mode 100644 src/views/schemeEvaluation/SchemeEvaluation/index.vue create mode 100644 src/views/tenderReview/TenderTask/TenderTask.data.ts create mode 100644 src/views/tenderReview/TenderTask/TenderTaskModal.vue create mode 100644 src/views/tenderReview/TenderTask/index.vue create mode 100644 src/views/workbench/components/DynamicInfo.vue create mode 100644 src/views/workbench/components/ProjectCard.vue create mode 100644 src/views/workbench/components/QuickNav.vue create mode 100644 src/views/workbench/components/SaleRadar.vue create mode 100644 src/views/workbench/components/TaskCard.vue create mode 100644 src/views/workbench/components/TaskShowList.vue create mode 100644 src/views/workbench/components/WorkbenchHeader.vue create mode 100644 src/views/workbench/components/data.ts create mode 100644 src/views/workbench/index.vue diff --git a/src/api/documentReview/DocumentTaskResults/index.ts b/src/api/documentReview/DocumentTaskResults/index.ts index 4fc6a22..270350a 100644 --- a/src/api/documentReview/DocumentTaskResults/index.ts +++ b/src/api/documentReview/DocumentTaskResults/index.ts @@ -1,6 +1,91 @@ import { defHttp } from '@/utils/http/axios'; import { ID, IDS, commonExport } from '@/api/base'; import { DocumentTaskResultsVO, DocumentTaskResultsForm, DocumentTaskResultsQuery } from './model'; +import { message } from 'ant-design-vue'; + +interface DownloadOptions { + filename?: string; + mimeType?: string; +} + +/** + * 通用文件下载函数 + * @param url 下载地址 + * @param onError 错误处理回调 + * @returns Promise 下载是否成功 + */ +export async function useDownload( + url: string, + onError?: (error: any) => void +): Promise { + try { + const response = await defHttp.get( + { + url, + responseType: 'blob', + timeout: 60000, // 设置较长的超时时间 + }, + { + isReturnNativeResponse: true, + // 自定义错误处理 + errorMessageMode: 'none', + } + ); + + // 检查响应类型 + const contentType = response.headers['content-type']; + if (contentType && contentType.includes('application/json')) { + // 如果返回的是JSON(通常是错误信息),转换并抛出 + const reader = new FileReader(); + reader.onload = () => { + const error = JSON.parse(reader.result as string); + message.error(error.message || '下载失败'); + onError?.(error); + }; + reader.readAsText(response.data); + return false; + } + + // 获取文件名 + const contentDisposition = response.headers['content-disposition']; + let fileName = ''; + + if (contentDisposition) { + const matches = contentDisposition.match(/filename[^;=\n]*=((['"]).*?\2|[^;\n]*)/); + if (matches && matches[1]) { + fileName = decodeURIComponent(matches[1].replace(/['"]/g, '')); + } + } + + // 创建Blob对象 + const blob = new Blob([response.data], { + type: contentType || 'application/octet-stream' + }); + + if (window.navigator && window.navigator.msSaveOrOpenBlob) { + // 针对IE的处理 + window.navigator.msSaveOrOpenBlob(blob, fileName); + } else { + // 现代浏览器的处理 + const url = window.URL.createObjectURL(blob); + const link = document.createElement('a'); + link.href = url; + link.download = fileName; + link.style.display = 'none'; + document.body.appendChild(link); + link.click(); + document.body.removeChild(link); + window.URL.revokeObjectURL(url); + } + + return true; + } catch (error: any) { + console.error('下载失败:', error); + message.error(error.message || '下载失败,请稍后重试'); + onError?.(error); + return false; + } +} /** * 查询文档任务结果列表 @@ -62,3 +147,13 @@ export function DocumentTaskResultsUpdate(data: DocumentTaskResultsForm) { export function DocumentTaskResultsRemove(id: ID | IDS) { return defHttp.deleteWithMsg({ url: '/productManagement/DocumentTaskResults/' + id },); } + /** + * 下载文档任务结果 + * @param id id + * @returns + */ + export function DocumentTaskResultDownload(id: ID | IDS) { + return useDownload(`/productManagement/DocumentTaskResults/downloadResult/${id}`); + + // return defHttp.get({ url: '/productManagement/DocumentTaskResults/downloadResult/' + id ,responseType: 'blob',headers: { 'Content-Type': ContentTypeEnum.FORM_URLENCODED }},); + } diff --git a/src/api/modelConfiguration/ModelUserPromptssetting/index.ts b/src/api/modelConfiguration/ModelUserPromptssetting/index.ts index 070358e..930277b 100644 --- a/src/api/modelConfiguration/ModelUserPromptssetting/index.ts +++ b/src/api/modelConfiguration/ModelUserPromptssetting/index.ts @@ -60,6 +60,6 @@ export function ModelUserPromptssettingRemove(id: ID | IDS) { * @param userId userId * @returns */ -export function ModelUserPromptssettingInfoByUserId() { - return defHttp.get({ url: '/productManagement/ModelUserPromptssetting/getInfoByuserId'}); +export function ModelUserPromptssettingInfoByUserId(params:{taskType:string}) { + return defHttp.get({ url: '/productManagement/ModelUserPromptssetting/getInfoByuserId', params }); } \ No newline at end of file diff --git a/src/api/schemEvaluation/SchemEvaluation/index.ts b/src/api/schemEvaluation/SchemEvaluation/index.ts new file mode 100644 index 0000000..a1027aa --- /dev/null +++ b/src/api/schemEvaluation/SchemEvaluation/index.ts @@ -0,0 +1,57 @@ +import { defHttp } from '@/utils/http/axios'; +import { ID, IDS, commonExport } from '@/api/base'; +import { SchemEvaluationVO, SchemEvaluationForm, SchemEvaluationQuery } from './model'; + +/** + * 查询方案评价任务列表 + * @param params + * @returns + */ +export function SchemEvaluationList(params?: SchemEvaluationQuery) { + return defHttp.get({ url: '/productManagement/SchemEvaluation/list', params }); +} + +/** + * 导出方案评价任务列表 + * @param params + * @returns + */ +export function SchemEvaluationExport(params?: SchemEvaluationQuery) { + return commonExport('/productManagement/SchemEvaluation/export', params ?? {}); +} + +/** + * 查询方案评价任务详细 + * @param id id + * @returns + */ +export function SchemEvaluationInfo(id: ID) { + return defHttp.get({ url: '/productManagement/SchemEvaluation/' + id }); +} + +/** + * 新增方案评价任务 + * @param data + * @returns + */ +export function SchemEvaluationAdd(data: SchemEvaluationForm) { + return defHttp.postWithMsg({ url: '/productManagement/SchemEvaluation', data }); +} + +/** + * 更新方案评价任务 + * @param data + * @returns + */ +export function SchemEvaluationUpdate(data: SchemEvaluationForm) { + return defHttp.putWithMsg({ url: '/productManagement/SchemEvaluation', data }); +} + +/** + * 删除方案评价任务 + * @param id id + * @returns + */ +export function SchemEvaluationRemove(id: ID | IDS) { + return defHttp.deleteWithMsg({ url: '/productManagement/SchemEvaluation/' + id },); +} diff --git a/src/api/schemEvaluation/SchemEvaluation/model.ts b/src/api/schemEvaluation/SchemEvaluation/model.ts new file mode 100644 index 0000000..54beb54 --- /dev/null +++ b/src/api/schemEvaluation/SchemEvaluation/model.ts @@ -0,0 +1,105 @@ +import { BaseEntity, PageQuery } from '@/api/base'; + +export interface SchemEvaluationVO { + /** + * 模型所属行业 + */ + taskIndustry: string; + + /** + * 模型所属区域 + */ + taskRegion: string; + + /** + * 任务名称 + */ + taskName: string; + + /** + * 文档名称 + */ + documentName: string; + + /** + * ossid + */ + ossId: string | number; + + /** + * 当前状态 + */ + progressStatus: string; + +} + +export interface SchemEvaluationForm extends BaseEntity { + /** + * 模型所属行业 + */ + taskIndustry?: string; + + /** + * 模型所属区域 + */ + taskRegion?: string; + + /** + * 任务名称 + */ + taskName?: string; + + /** + * 文档名称 + */ + documentName?: string; + + /** + * ossid + */ + ossId?: string | number; + + /** + * 当前状态 + */ + progressStatus?: string; + +} + +export interface SchemEvaluationQuery extends PageQuery { + + /** + * 模型所属行业 + */ + taskIndustry?: string; + + /** + * 模型所属区域 + */ + taskRegion?: string; + + /** + * 任务名称 + */ + taskName?: string; + + /** + * 文档名称 + */ + documentName?: string; + + /** + * ossid + */ + ossId?: string | number; + + /** + * 当前状态 + */ + progressStatus?: string; + + /** + * 日期范围参数 + */ + params?: any; +} diff --git a/src/api/tenderReview/TenderTask/index.ts b/src/api/tenderReview/TenderTask/index.ts new file mode 100644 index 0000000..035de7c --- /dev/null +++ b/src/api/tenderReview/TenderTask/index.ts @@ -0,0 +1,57 @@ +import { defHttp } from '@/utils/http/axios'; +import { ID, IDS, commonExport } from '@/api/base'; +import { TenderTaskVO, TenderTaskForm, TenderTaskQuery } from './model'; + +/** + * 查询招标摘要任务列表 + * @param params + * @returns + */ +export function TenderTaskList(params?: TenderTaskQuery) { + return defHttp.get({ url: '/productManagement/TenderTask/list', params }); +} + +/** + * 导出招标摘要任务列表 + * @param params + * @returns + */ +export function TenderTaskExport(params?: TenderTaskQuery) { + return commonExport('/productManagement/TenderTask/export', params ?? {}); +} + +/** + * 查询招标摘要任务详细 + * @param id id + * @returns + */ +export function TenderTaskInfo(id: ID) { + return defHttp.get({ url: '/productManagement/TenderTask/' + id }); +} + +/** + * 新增招标摘要任务 + * @param data + * @returns + */ +export function TenderTaskAdd(data: TenderTaskForm) { + return defHttp.postWithMsg({ url: '/productManagement/TenderTask', data }); +} + +/** + * 更新招标摘要任务 + * @param data + * @returns + */ +export function TenderTaskUpdate(data: TenderTaskForm) { + return defHttp.putWithMsg({ url: '/productManagement/TenderTask', data }); +} + +/** + * 删除招标摘要任务 + * @param id id + * @returns + */ +export function TenderTaskRemove(id: ID | IDS) { + return defHttp.deleteWithMsg({ url: '/productManagement/TenderTask/' + id },); +} diff --git a/src/api/tenderReview/TenderTask/model.ts b/src/api/tenderReview/TenderTask/model.ts new file mode 100644 index 0000000..ba05040 --- /dev/null +++ b/src/api/tenderReview/TenderTask/model.ts @@ -0,0 +1,108 @@ +import { BaseEntity, PageQuery } from '@/api/base'; + +export interface TenderTaskVO { + /** + * 模型所属行业 + */ + taskIndustry: string; + + /** + * 模型所属区域 + */ + taskRegion: string; + + /** + * 任务名称 + */ + taskName: string; + + /** + * 文档名称 + */ + documentName: string; + + /** + * ossid + */ + ossId: string | number; + + /** + * 当前状态 + + */ + progressStatus: string; + +} + +export interface TenderTaskForm extends BaseEntity { + /** + * 模型所属行业 + */ + taskIndustry?: string; + + /** + * 模型所属区域 + */ + taskRegion?: string; + + /** + * 任务名称 + */ + taskName?: string; + + /** + * 文档名称 + */ + documentName?: string; + + /** + * ossid + */ + ossId?: string | number; + + /** + * 当前状态 + + */ + progressStatus?: string; + +} + +export interface TenderTaskQuery extends PageQuery { + + /** + * 模型所属行业 + */ + taskIndustry?: string; + + /** + * 模型所属区域 + */ + taskRegion?: string; + + /** + * 任务名称 + */ + taskName?: string; + + /** + * 文档名称 + */ + documentName?: string; + + /** + * ossid + */ + ossId?: string | number; + + /** + * 当前状态 + + */ + progressStatus?: string; + + /** + * 日期范围参数 + */ + params?: any; +} diff --git a/src/enums/taskEnum.ts b/src/enums/taskEnum.ts new file mode 100644 index 0000000..0118fe9 --- /dev/null +++ b/src/enums/taskEnum.ts @@ -0,0 +1,115 @@ +// 任务类型枚举 +export const TaskType = { + SCHEME_REVIEW: { + value: 'scheme_review', + label: '方案审核', + icon: 'mdi:file-document-check-outline', + color: '#2F54EB', + path:"/documentReview/DocumentTasks" + }, + CONTRACT_REVIEW: { + value: 'contract_review', + label: '合同审核', + icon: 'fluent-mdl2:document-approval', + color: '#722ED1', + path:"/contractReview/ContractualTasks" + }, + TENDER_REVIEW: { + value: 'tender_review', + label: '招投标审核', + icon: 'heroicons:clipboard-document-check-20-solid', + color: '#13C2C2', + path:"/tenderReview/TenderSummaryTask" + }, + SCHEME_EVALUATION: { // 新增方案评价 + value: 'scheme_evaluation', + label: '方案评价', + icon: 'mdi:file-document-edit-outline', // 使用文档编辑图标 + color: '#FA8C16', // 使用橙色系 + path:"/schemEvaluation/SchemeEvaluation" + }, + PROJECT_DOCUMENT_REVIEW: { // 新增项目文档审核 + value: 'project_document_review', + label: '项目文档审核', + icon: 'mdi:folder-text-outline', // 使用文件夹文档图标 + color: '#1890FF', // 使用蓝色系 + path:"/projectDocumentReview/ProjectDocumentReview" + } +} as const; + +// 方案审核子任务 +export const SchemeTask = { + DOCUMENT_SIMILARITY: { + value: 'checkRepeatText', + label: '文档相似性检查', + icon: 'arcticons:onlyoffice-documents', + color: '#1890FF' + }, + DOCUMENT_ERROR: { + value: 'checkDocumentError', + label: '文档纠错', + icon: 'solar:document-medicine-bold-duotone', + color: '#F5222D' + }, + + PLACE_CHECK: { + value: 'checkPlaceName', + label: '地名检查', + icon: 'solar:map-point-search-bold-duotone', + color: '#52C41A' + }, + COMPANY_CHECK: { + value: 'checkCompanyName', + label: '公司名称检查', + icon: 'mdi:company', + color: '#2F54EB' + }, + TITLE_CHECK: { + value: 'checkTitleName', + label: '文档结构检查', + icon: 'mdi:file-tree-outline', + color: '#722ED1' + } +} as const; + +// 合同审核子任务 +export const ContractTask = { + CONTRACT_REVIEW: { + value: 'contractReview', + label: '合同审核', + icon: 'fluent-mdl2:document-approval', + color: '#722ED1' + } +} as const; + +// 招标审核子任务 +export const TenderTask = { + TENDER_SUMMARY: { + value: 'tenderSummary', + label: '招标摘要', + icon: 'mdi:text-box-outline', + color: '#2B7DE9' + } +} as const; + +// 招标审核子任务 +export const SchemeEvaluation = { + SCHEME_EVALUATION: { + value: 'schemEvaluation', + label: '方案评价', + icon: 'iconoir:doc-star', + color: '#13C2C2' + }, +} as const; +/** + * 从对象中提取指定键的值 + * @param obj 要提取的对象 + * @param key 要提取的键名 + * @returns any[] 提取的值数组 + */ +export const extractValues = >( + obj: T, + key: string +): any[] => { + return Object.values(obj).map(item => item[key]); +}; \ No newline at end of file diff --git a/src/views/contractReview/ContractualTasks/ContractualTasks.data.ts b/src/views/contractReview/ContractualTasks/ContractualTasks.data.ts index e24ff6b..db38d21 100644 --- a/src/views/contractReview/ContractualTasks/ContractualTasks.data.ts +++ b/src/views/contractReview/ContractualTasks/ContractualTasks.data.ts @@ -29,12 +29,7 @@ export const formSchemas: FormSchema[] = [ field: 'taskNameList', component: 'Select', componentProps: { - options: [ - { - label: '合同审核', - value: 'contractReview', - }, - ], + options: getDictOptions('contract_review'), mode: 'multiple', }, }, @@ -58,11 +53,8 @@ export const columns: BasicColumn[] = [ { title: '任务名称', dataIndex: 'taskName', - customRender: ({ value }) => { - if(value === 'contractReview'){ - return '合同审核' - } - }, + customRender: ({ value }) => renderDict(value, 'contract_review'), + }, { title: '文档名称', @@ -78,6 +70,10 @@ export const columns: BasicColumn[] = [ dataIndex: 'taskIndustry', customRender: ({ value }) => renderDict(value, 'model_industry'), }, + { + title: '合同角色', + dataIndex: 'contractPartyRole', + }, { title: '上传时间', dataIndex: 'createTime', @@ -131,18 +127,23 @@ export const modalSchemas: FormSchema[] = [ defaultValue: 'normal', }, }, + { + label: '合同角色', + field: 'contractPartyRole', + required: true, + component: 'Select', + componentProps: { + options: getDictOptions('contract_party_role'), + defaultValue: '甲方', + }, + }, { label: '任务名称', field: 'taskNameList', required: true, component: 'Select', componentProps: { - options: [ - { - label: '合同审核', - value: 'contractReview', - }, - ], + options:getDictOptions('contract_review'), mode: 'multiple', }, }, @@ -157,6 +158,7 @@ export const modalSchemas: FormSchema[] = [ multiple: false, resultField: 'ossId', api: uploadDocument, + beforeUploadPrompt:"严禁在本互联网非涉密平台处理、传输国家秘密。请再次确认您上传的文件资料不涉及国家秘密。" }, }, ]; diff --git a/src/views/contractReview/ContractualTasks/ContractualTasksModal.vue b/src/views/contractReview/ContractualTasks/ContractualTasksModal.vue index 81f62ed..969ff77 100644 --- a/src/views/contractReview/ContractualTasks/ContractualTasksModal.vue +++ b/src/views/contractReview/ContractualTasks/ContractualTasksModal.vue @@ -17,6 +17,7 @@ import { ContractualTasksInfo, ContractualTasksAdd, ContractualTasksUpdate } from '@/api/contractReview/ContractualTasks'; import { modalSchemas } from './ContractualTasks.data'; import { ModelUserPromptssettingInfoByUserId } from '@/api/modelConfiguration/ModelUserPromptssetting/index'; + import { TaskType } from '@/enums/taskEnum'; defineOptions({ name: 'ContractualTasksModal' }); @@ -24,20 +25,20 @@ const isUpdate = ref(false); const title = computed(() => { - return isUpdate.value ? '编辑合同任务' : '新增合同任务'; + return isUpdate.value ? '新增合同任务' : '新增合同任务'; }); const [registerInnerModal, { modalLoading, closeModal }] = useModalInner( async (data: { record?: Recordable; update: boolean }) => { modalLoading(true); - const settings = await ModelUserPromptssettingInfoByUserId(); + const settings = await ModelUserPromptssettingInfoByUserId({taskType:TaskType.CONTRACT_REVIEW.value}); await setFieldsValue(settings); - // const { record, update } = data; - // isUpdate.value = update; - // if (update && record) { - // const ret = await ContractualTasksInfo(record.id); - // await setFieldsValue(ret); - // } + const { record, update } = data; + isUpdate.value = update; + if (update && record) { + // const ret = await ContractualTasksInfo(record.id); + await setFieldsValue(record); + } modalLoading(false); }, ); @@ -54,11 +55,7 @@ modalLoading(true); const data = await validate(); data['ossId'] = data['ossId'][0]; - if (unref(isUpdate)) { - await ContractualTasksUpdate(data); - } else { - await ContractualTasksAdd(data); - } + await ContractualTasksAdd(data); emit('reload'); closeModal(); await resetForm(); diff --git a/src/views/contractReview/ContractualTasks/index.vue b/src/views/contractReview/ContractualTasks/index.vue index 5717530..2bb9c44 100644 --- a/src/views/contractReview/ContractualTasks/index.vue +++ b/src/views/contractReview/ContractualTasks/index.vue @@ -2,7 +2,7 @@