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,
);
}
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>
<ContractualTasksModal @register="registerModal" @reload="reload" />
<DocsDrawer @register="registerDrawer" />
<ResultDetailDrawer
:visible="resultDetailDrawerVisible"
:taskResultDetail="taskResultDetail"
:taskInfo="currentTaskInfo"
@update:visible="resultDetailDrawerVisible = $event"
@close="handleResultDetailDrawerClose"
/>
</PageWrapper>
</template>
@ -113,10 +120,19 @@
import {
DocumentTaskResultsInfoByTaskId,
DocumentTaskResultDownload,
getDetailResultsByTaskId,
} 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 documentData = ref<DocumentTasksPermissionsVO>();
const resultDetailDrawerVisible = ref(false);
const childTableData = ref([]);
const taskResultDetail = ref<DocumentTaskResultDetailVO[]>([]);
const currentTaskInfo = ref<Recordable>({});
defineOptions({ name: 'ContractualTasks' });
const [registerTable, { reload, multipleRemove, selected, getForm }] = useTable({
@ -147,18 +163,52 @@
});
const [registerModal, { openModal }] = useModal();
const handleResultDetailDrawerClose = () => {
resultDetailDrawerVisible.value = false;
};
async function handleDetail(record: Recordable) {
try {
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' });
console.log('res', res);
} else {
openDrawer(true, { value: res.result, type: 'markdown' });
}
} 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' });
}
//record.id
}
}
async function handleStop(record: Recordable) {

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

@ -32,6 +32,24 @@
},
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>
@ -119,7 +137,7 @@
<script setup lang="ts">
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 {
DocumentTaskResultsInfoByTaskId,
@ -275,6 +293,10 @@
console.log('expanded, record', expanded, record);
}
}
async function handleDeleteFile(record: Recordable) {
await DocumentTasksDeleteFile(record.childrenTasks[0].ossId);
await reload();
}
// getchildTableData
function getchildTableData() {
console.log('childTableData', childTableData.value);

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

@ -266,6 +266,12 @@
{ field: 'comparedText', 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": [
{ field: 'originalText', title: '原文', type: 'markdown' },
{ field: 'modifiedContent', title: '修改建议', type: 'markdown' },
@ -651,9 +657,10 @@
const handlePageSelect = async (page: number) => {
currentPage.value = page;
await renderPage(page, highlightText.value!);
// 使**
await renderPage(page, highlightText.value);
showPageSelectModal.value = false;
// message.success(`${page}`);
message.success(`已定位到第${page}`);
};
const handlePageModalClose = () => {
@ -662,38 +669,74 @@
const locateByText = async (text: string) => {
if (!pdfDoc || !text) return;
// Markdown**
const cleanText = text.replace(/\*\*/g, '');
const numPages = pdfDoc.numPages;
const foundPages: number[] = [];
//
for (let i = 1; i <= numPages; i++) {
const page = await pdfDoc.getPage(i);
const content = await page.getTextContent();
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);
}
}
if (foundPages.length === 0) {
message.warning('未在PDF中找到该文本');
return;
}
highlightText.value = text; //
// **
highlightText.value = cleanText;
//
if (foundPages.length === 1) {
currentPage.value = foundPages[0];
await renderPage(foundPages[0], text);
// message.success(`${foundPages[0]}`);
await renderPage(foundPages[0], cleanText);
message.success(`已定位到第${foundPages[0]}`);
return;
}
//
matchedPages.value = foundPages;
showPageSelectModal.value = true;
};
//
async function highlightTextOnPage(page, ctx, viewport, targetText) {
if (!targetText) return;
// **
const cleanTargetText = targetText.replace(/\*\*/g, '');
const textContent = await page.getTextContent();
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;
// item
@ -701,33 +744,42 @@
let highlightItems: any[] = [];
let highlightStarted = false;
let highlightLength = 0;
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;
}
if (highlightStarted && highlightLength < targetText.length) {
if (highlightStarted && highlightLength < target.length) {
highlightItems.push(item);
highlightLength += item.str.length;
if (highlightLength >= targetText.length) break;
highlightLength += itemTextNoSpace.length;
if (highlightLength >= target.length) break;
}
charCount += item.str.length;
charCount += itemTextNoSpace.length;
}
//
ctx.save();
ctx.globalAlpha = 0.4;
ctx.fillStyle = '#ffd54f';
for (let item of highlightItems) {
const [a, b, c, d, e, f] = item.transform;
//
const x = e;
const y = f;
const transform = item.transform;
const x = transform[4]; // e
const y = transform[5]; // f
// viewport
const pt = viewport.convertToViewportPoint(x, y);
// pdf.jsy线
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();
}
</script>

Loading…
Cancel
Save