Browse Source

新增删除合同预览的功能

ai_dev
zhouhaibin 1 month ago
parent
commit
9b7a142311
  1. 4
      src/api/documentReview/DocumentTasks/index.ts
  2. 60
      src/views/contractReview/ContractualTasks/index.vue
  3. 24
      src/views/documentReview/DocumentTasks/DocumentTasksTable.vue
  4. 90
      src/views/documentReview/DocumentTasks/ResultDetailDrawer.vue

4
src/api/documentReview/DocumentTasks/index.ts

@ -92,3 +92,7 @@ export function uploadDocument(
params, params,
); );
} }
export function DocumentTasksDeleteFile(ossId: string) {
return defHttp.deleteWithMsg<void>({ url: '/productManagement/DocumentTasks/ossRemoveById/' + ossId });
}

60
src/views/contractReview/ContractualTasks/index.vue

@ -90,6 +90,13 @@
</BasicTable> </BasicTable>
<ContractualTasksModal @register="registerModal" @reload="reload" /> <ContractualTasksModal @register="registerModal" @reload="reload" />
<DocsDrawer @register="registerDrawer" /> <DocsDrawer @register="registerDrawer" />
<ResultDetailDrawer
:visible="resultDetailDrawerVisible"
:taskResultDetail="taskResultDetail"
:taskInfo="currentTaskInfo"
@update:visible="resultDetailDrawerVisible = $event"
@close="handleResultDetailDrawerClose"
/>
</PageWrapper> </PageWrapper>
</template> </template>
@ -113,10 +120,19 @@
import { import {
DocumentTaskResultsInfoByTaskId, DocumentTaskResultsInfoByTaskId,
DocumentTaskResultDownload, DocumentTaskResultDownload,
getDetailResultsByTaskId,
} from '@/api/documentReview/DocumentTaskResults'; } from '@/api/documentReview/DocumentTaskResults';
import { onMounted, ref } from 'vue';
import ResultDetailDrawer from '@/views/documentReview/DocumentTasks/ResultDetailDrawer.vue';
import { DocumentTasksPermissionsVO } from '@/api/taskPermissions/DocumentTasksPermissions/model';
import { DocumentTaskResultDetailVO } from '@/api/documentReview/DocumentTaskResults/model';
const [registerDrawer, { openDrawer }] = useDrawer(); const [registerDrawer, { openDrawer }] = useDrawer();
const documentData = ref<DocumentTasksPermissionsVO>();
const resultDetailDrawerVisible = ref(false);
const childTableData = ref([]);
const taskResultDetail = ref<DocumentTaskResultDetailVO[]>([]);
const currentTaskInfo = ref<Recordable>({});
defineOptions({ name: 'ContractualTasks' }); defineOptions({ name: 'ContractualTasks' });
const [registerTable, { reload, multipleRemove, selected, getForm }] = useTable({ const [registerTable, { reload, multipleRemove, selected, getForm }] = useTable({
@ -147,18 +163,52 @@
}); });
const [registerModal, { openModal }] = useModal(); const [registerModal, { openModal }] = useModal();
const handleResultDetailDrawerClose = () => {
resultDetailDrawerVisible.value = false;
};
async function handleDetail(record: Recordable) { async function handleDetail(record: Recordable) {
try { try {
let res = await DocumentTaskResultsInfoByTaskId(record.id); let res = await DocumentTaskResultsInfoByTaskId(record.id);
console.info("resresres",res,res.result,!res,!res.result)
if (!res || !res.result) {
try {
const detailRes = await getDetailResultsByTaskId(record.id);
if (detailRes && detailRes.length > 0) {
taskResultDetail.value = detailRes;
currentTaskInfo.value = record;
resultDetailDrawerVisible.value = true;
return;
}
} catch (detailEx) {
console.error('获取详细结果失败', detailEx);
}
}
if (record.taskName == 'schemEvaluation') {
const updatedHtmlText = res.result?.replace(
/文件名称:\S+/g,
`文件名称:${record.documentName}`,
);
openDrawer(true, { value: updatedHtmlText, type: 'markdown' });
} else if (record.taskName == 'checkDocumentError') {
openDrawer(true, { value: res.result, type: 'markdown' }); openDrawer(true, { value: res.result, type: 'markdown' });
} else {
console.log('res', res); openDrawer(true, { value: res.result, type: 'markdown' });
}
} catch (ex) { } catch (ex) {
try {
const detailRes = await getDetailResultsByTaskId(record.id);
if (detailRes && detailRes.length > 0) {
taskResultDetail.value = detailRes;
currentTaskInfo.value = record;
resultDetailDrawerVisible.value = true;
return;
}
} catch (detailEx) {
console.error('获取详细结果也失败', detailEx);
openDrawer(true, { value: '加载失败,请刷新页面', type: 'markdown' }); openDrawer(true, { value: '加载失败,请刷新页面', type: 'markdown' });
} }
//record.id }
} }
async function handleStop(record: Recordable) { async function handleStop(record: Recordable) {

24
src/views/documentReview/DocumentTasks/DocumentTasksTable.vue

@ -32,6 +32,24 @@
}, },
onClick: handleDownload.bind(null, record), onClick: handleDownload.bind(null, record),
}, },
{
label: '删文件',
icon: IconEnum.DOWNLOAD,
type: 'primary',
color: 'error',
ghost: true,
ifShow: () => {
if (record.progress.includes('100%')) {
if(record.delFile=='Y'){
return false;
}
return true;
} else {
return false;
}
},
onClick: handleDeleteFile.bind(null, record),
},
]" ]"
/> />
</template> </template>
@ -119,7 +137,7 @@
<script setup lang="ts"> <script setup lang="ts">
import { BasicTable, useTable, TableAction } from '@/components/Table'; import { BasicTable, useTable, TableAction } from '@/components/Table';
import { DocumentTasksList, DocumentTasksStop } from '@/api/documentReview/DocumentTasks'; import { DocumentTasksList, DocumentTasksStop, DocumentTasksDeleteFile } from '@/api/documentReview/DocumentTasks';
import { getTasksPermissionsByUserId } from '@/api/taskPermissions/DocumentTasksPermissions'; import { getTasksPermissionsByUserId } from '@/api/taskPermissions/DocumentTasksPermissions';
import { import {
DocumentTaskResultsInfoByTaskId, DocumentTaskResultsInfoByTaskId,
@ -275,6 +293,10 @@
console.log('expanded, record', expanded, record); console.log('expanded, record', expanded, record);
} }
} }
async function handleDeleteFile(record: Recordable) {
await DocumentTasksDeleteFile(record.childrenTasks[0].ossId);
await reload();
}
// getchildTableData // getchildTableData
function getchildTableData() { function getchildTableData() {
console.log('childTableData', childTableData.value); console.log('childTableData', childTableData.value);

90
src/views/documentReview/DocumentTasks/ResultDetailDrawer.vue

@ -266,6 +266,12 @@
{ field: 'comparedText', title: '第二段原文', type: 'markdown' }, { field: 'comparedText', title: '第二段原文', type: 'markdown' },
{ field: 'modificationDisplay', title: '相似情况', type: 'markdown' }, { field: 'modificationDisplay', title: '相似情况', type: 'markdown' },
], ],
"allCheckRepeatText": [
{ field: 'originalText', title: '第一段原文', type: 'markdown' },
{ field: 'comparedText', title: '第二段原文', type: 'markdown' },
{ field: 'modificationDisplay', title: '相似情况', type: 'markdown' },
],
"checkDocumentError": [ "checkDocumentError": [
{ field: 'originalText', title: '原文', type: 'markdown' }, { field: 'originalText', title: '原文', type: 'markdown' },
{ field: 'modifiedContent', title: '修改建议', type: 'markdown' }, { field: 'modifiedContent', title: '修改建议', type: 'markdown' },
@ -651,9 +657,10 @@
const handlePageSelect = async (page: number) => { const handlePageSelect = async (page: number) => {
currentPage.value = page; currentPage.value = page;
await renderPage(page, highlightText.value!); // 使**
await renderPage(page, highlightText.value);
showPageSelectModal.value = false; showPageSelectModal.value = false;
// message.success(`${page}`); message.success(`已定位到第${page}`);
}; };
const handlePageModalClose = () => { const handlePageModalClose = () => {
@ -662,38 +669,74 @@
const locateByText = async (text: string) => { const locateByText = async (text: string) => {
if (!pdfDoc || !text) return; if (!pdfDoc || !text) return;
// Markdown**
const cleanText = text.replace(/\*\*/g, '');
const numPages = pdfDoc.numPages; const numPages = pdfDoc.numPages;
const foundPages: number[] = []; const foundPages: number[] = [];
//
for (let i = 1; i <= numPages; i++) { for (let i = 1; i <= numPages; i++) {
const page = await pdfDoc.getPage(i); const page = await pdfDoc.getPage(i);
const content = await page.getTextContent(); const content = await page.getTextContent();
const pageText = content.items.map((item: any) => item.str).join(''); const pageText = content.items.map((item: any) => item.str).join('');
if (pageText.replace(/\s/g, '').includes(text.replace(/\s/g, ''))) {
//
//
const normalizeText = (text: string) => {
return text
.replace(/[\r\n\t\f\v]/g, '') //
.replace(/[^\u4e00-\u9fa5a-zA-Z0-9]/g, '') //
.toLowerCase(); //
};
const normalizedPageText = normalizeText(pageText);
const normalizedSearchText = normalizeText(cleanText);
if (normalizedPageText.includes(normalizedSearchText)) {
foundPages.push(i); foundPages.push(i);
} }
} }
if (foundPages.length === 0) { if (foundPages.length === 0) {
message.warning('未在PDF中找到该文本'); message.warning('未在PDF中找到该文本');
return; return;
} }
highlightText.value = text; //
// **
highlightText.value = cleanText;
//
if (foundPages.length === 1) { if (foundPages.length === 1) {
currentPage.value = foundPages[0]; currentPage.value = foundPages[0];
await renderPage(foundPages[0], text); await renderPage(foundPages[0], cleanText);
// message.success(`${foundPages[0]}`); message.success(`已定位到第${foundPages[0]}`);
return; return;
} }
//
matchedPages.value = foundPages; matchedPages.value = foundPages;
showPageSelectModal.value = true; showPageSelectModal.value = true;
}; };
// //
async function highlightTextOnPage(page, ctx, viewport, targetText) { async function highlightTextOnPage(page, ctx, viewport, targetText) {
if (!targetText) return;
// **
const cleanTargetText = targetText.replace(/\*\*/g, '');
const textContent = await page.getTextContent(); const textContent = await page.getTextContent();
const items = textContent.items as any[]; const items = textContent.items as any[];
const allText = items.map(i => i.str).join('').replace(/\s/g, '');
const target = targetText.replace(/\s/g, ''); //
const startIdx = allText.indexOf(target); const pageTextWithSpaces = items.map(i => i.str).join('');
const pageText = pageTextWithSpaces.replace(/\s/g, '');
const target = cleanTargetText.replace(/\s/g, '');
//
const startIdx = pageText.indexOf(target);
if (startIdx === -1) return; if (startIdx === -1) return;
// item // item
@ -701,33 +744,42 @@
let highlightItems: any[] = []; let highlightItems: any[] = [];
let highlightStarted = false; let highlightStarted = false;
let highlightLength = 0; let highlightLength = 0;
for (let item of items) { for (let item of items) {
if (!highlightStarted && charCount + item.str.length > startIdx) { const itemTextNoSpace = item.str.replace(/\s/g, '');
if (!highlightStarted && charCount + itemTextNoSpace.length > startIdx) {
highlightStarted = true; highlightStarted = true;
} }
if (highlightStarted && highlightLength < targetText.length) {
if (highlightStarted && highlightLength < target.length) {
highlightItems.push(item); highlightItems.push(item);
highlightLength += item.str.length; highlightLength += itemTextNoSpace.length;
if (highlightLength >= targetText.length) break; if (highlightLength >= target.length) break;
} }
charCount += item.str.length;
charCount += itemTextNoSpace.length;
} }
// //
ctx.save(); ctx.save();
ctx.globalAlpha = 0.4; ctx.globalAlpha = 0.4;
ctx.fillStyle = '#ffd54f'; ctx.fillStyle = '#ffd54f';
for (let item of highlightItems) { for (let item of highlightItems) {
const [a, b, c, d, e, f] = item.transform; const transform = item.transform;
// const x = transform[4]; // e
const x = e; const y = transform[5]; // f
const y = f;
// viewport // viewport
const pt = viewport.convertToViewportPoint(x, y); const pt = viewport.convertToViewportPoint(x, y);
// pdf.jsy线 // pdf.jsy线
const height = item.height || item.fontSize || 10; const height = item.height || item.fontSize || 10;
ctx.fillRect(pt[0], pt[1] - height, item.width, height); const width = item.width || (item.str.length * (item.fontSize || 10) * 0.6);
ctx.fillRect(pt[0], pt[1] - height, width, height + 2); // 便
} }
ctx.restore(); ctx.restore();
} }
</script> </script>

Loading…
Cancel
Save