You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

301 lines
10 KiB

<template>
<BasicTable @register="registerTable" @expand="tabelexpand">
<template #toolbar v-if="props.showToolbar">
<div >
<a-button
id="how-to-edit"
class="font-bold"
type="link"
@click="openDrawer(true, { value: '', type: 'def' })"
>👉如何新增任务?
</a-button>
<a-button type="primary" @click="handleAdd">新增</a-button>
</div>
</template>
<template #bodyCell="{ column, record }">
<template v-if="column.key === 'action'">
<TableAction
stopButtonPropagation
:actions="[
{
label: record.childrenTasks.length > 1 ? '下载全部' : '下载',
icon: IconEnum.DOWNLOAD,
type: 'primary',
color: 'success',
ghost: true,
ifShow: () => {
if (record.progress.includes('100%')) {
return true;
} else {
return false;
}
},
onClick: handleDownload.bind(null, record),
},
]"
/>
</template>
</template>
<template #expandedRowRender>
<BasicTable @register="registerChildTable">
<template #bodyCell="{ column, record }">
<template v-if="column.key === 'action'">
<TableAction
stopButtonPropagation
:actions="[
{
label: '详情',
icon: IconEnum.EDIT,
type: 'primary',
ghost: true,
ifShow: () => {
if (
record.progressStatus != 'PENDING' &&
record.progressStatus != 'STARTED' &&
record.progressStatus != 'REVOKED'
) {
return true;
} else {
return false;
}
},
onClick: handleDetail.bind(null, record),
},
{
label: '下载',
icon: IconEnum.DOWNLOAD,
type: 'primary',
color: 'success',
ghost: true,
ifShow: () => {
if (
record.progressStatus != 'PENDING' &&
record.progressStatus != 'STARTED' &&
record.progressStatus != 'REVOKED'
) {
return true;
} else {
return false;
}
},
onClick: handleDownload.bind(null, record),
},
{
label: '终止任务',
icon: IconEnum.DELETE,
type: 'primary',
danger: true,
ghost: true,
ifShow: () => {
if (record.progressStatus == 'PENDING') {
return true;
} else {
return false;
}
},
popConfirm: {
placement: 'left',
title: '是否终止当前任务?',
confirm: handleStop.bind(null, record),
},
},
]"
/>
</template>
</template>
</BasicTable>
</template>
</BasicTable>
<DocumentTasksModal @register="registerModal" @reload="reload" />
<DocsDrawer @register="registerDrawer" />
<ResultDetailDrawer @register="registerResultDetailDrawer" />
</template>
<script setup lang="ts">
import { BasicTable, useTable, TableAction } from '@/components/Table';
import { DocumentTasksList, DocumentTasksStop } from '@/api/documentReview/DocumentTasks';
import { getTasksPermissionsByUserId } from '@/api/taskPermissions/DocumentTasksPermissions';
import {
DocumentTaskResultsInfoByTaskId,
DocumentTaskResultDownload,
getDetailResultsByTaskId,
} from '@/api/documentReview/DocumentTaskResults';
import { useModal } from '@/components/Modal';
import DocumentTasksModal from './DocumentTasksModal.vue';
import { formSchemas, columns, childColumns } from './DocumentTasks.data';
import { IconEnum } from '@/enums/appEnum';
import { useDrawer } from '@/components/Drawer';
import DocsDrawer from '@/views/documentReview/DocumentTasks/DocsDrawer.vue';
import ResultDetailDrawer from '@/views/documentReview/DocumentTasks/ResultDetailDrawer.vue';
import { onMounted, ref } from 'vue';
import { DocumentTasksPermissionsVO } from '@/api/taskPermissions/DocumentTasksPermissions/model';
import { DocumentTaskResultDetailVO } from '@/api/documentReview/DocumentTaskResults/model';
let props = defineProps(['useSearchForm', 'showTableSetting', 'showToolbar', 'pagination']);
defineOptions({ name: 'DocumentTasks' });
const documentData = ref<DocumentTasksPermissionsVO>();
const [registerDrawer, { openDrawer }] = useDrawer();
const [registerResultDetailDrawer, { openDrawer: openResultDetailDrawer }] = useDrawer();
const childTableData = ref([]);
const taskResultDetail = ref<DocumentTaskResultDetailVO[]>([]);
const [registerTable, { reload }] = useTable({
api: DocumentTasksList,
showIndexColumn: false,
clickToRowSelect: false,
rowKey: 'id',
title: props.showTableSetting?"方案审核任务列表":'',
expandRowByClick: false,
useSearchForm: props.useSearchForm,
showTableSetting: props.showTableSetting,
beforeFetch: async (record) => {
if (props.pagination == false) {
(record.pageNum = 1), (record.pageSize = 5);
}
},
pagination: props.pagination,
formConfig: {
schemas: formSchemas,
baseColProps: {
xs: 24,
sm: 24,
md: 24,
lg: 6,
},
},
columns: columns,
actionColumn: {
width: 200,
title: '操作',
key: 'action',
fixed: 'right',
},
});
const [registerChildTable, { setProps: setChildProps }] = useTable({
size: 'small', //紧凑型表格
api: getchildTableData,
columns: childColumns,
rowKey: 'id',
useSearchForm: false,
showIndexColumn: false,
showTableSetting: false,
pagination: false,
maxHeight: 50,
actionColumn: {
width: 200,
title: '操作',
key: 'action',
fixed: 'right',
},
});
const [registerModal, { openModal }] = useModal();
onMounted(async () => {
documentData.value = await getTasksPermissionsByUserId();
});
const cleanHtml = (content) => {
// 移除DOCTYPE和html标签
content = content.replace(/<!DOCTYPE[^>]*>/i, '');
content = content.replace(/<html[^>]*>/i, '');
content = content.replace(/<\/html>/i, '');
// 移除head部分
content = content.replace(/<head>[\s\S]*?<\/head>/i, '');
// 移除body标签
content = content.replace(/<body[^>]*>/i, '');
content = content.replace(/<\/body>/i, '');
return content.trim();
};
async function handleDetail(record: Recordable) {
try {
let res = await DocumentTaskResultsInfoByTaskId(record.id);
// 如果原API返回结果为空,则尝试使用新API获取详细结果
if (!res || !res.result) {
try {
const detailRes = await getDetailResultsByTaskId(record.id);
if (detailRes && detailRes.length > 0) {
taskResultDetail.value = detailRes;
openResultDetailDrawer(true, {
taskResultDetail: detailRes,
taskInfo: record
});
return;
}
} catch (detailEx) {
console.error('获取详细结果失败', detailEx);
}
}
// 原有逻辑保留
if (record.taskName == 'schemEvaluation') {
const updatedHtmlText = res.result?.replace(
/文件名称:\S+/g,
`文件名称:${record.documentName}`,
);
openDrawer(true, { value: cleanHtml(updatedHtmlText), type: 'markdown' });
} else if (record.taskName == 'checkDocumentError') {
openDrawer(true, { value: res.result, type: 'markdown' });
} else {
openDrawer(true, { value: res.result, type: 'markdown' });
}
console.log('res', res);
} catch (ex) {
// 如果原API失败,尝试使用新API
try {
const detailRes = await getDetailResultsByTaskId(record.id);
if (detailRes && detailRes.length > 0) {
taskResultDetail.value = detailRes;
openResultDetailDrawer(true, {
taskResultDetail: detailRes,
taskInfo: record,
});
return;
}
} catch (detailEx) {
console.error('获取详细结果也失败', detailEx);
openDrawer(true, { value: '加载失败,请刷新页面', type: 'markdown' });
}
}
}
async function handleStop(record: Recordable) {
await DocumentTasksStop(record.id);
await reload();
}
function handleAdd() {
openModal(true, { update: false });
}
function tabelexpand(expanded, record) {
if (expanded) {
childTableData.value = record.childrenTasks;
// reloadChildTable()
console.log('expanded, record', expanded, record);
}
}
// 修改后的 getchildTableData 函数
function getchildTableData() {
console.log('childTableData', childTableData.value);
const height = 50 * childTableData.value.length;
setChildProps({ maxHeight: height });
// 返回一个 Promise 对象,包含预期的数据结构
return Promise.resolve(childTableData.value);
}
async function handleDownload(record: Recordable) {
if (record.childrenTasks?.length > 1) {
await DocumentTaskResultDownload(record.childrenTasks.map((item) => item.id));
await reload();
} else if (record.childrenTasks?.length == 1) {
await DocumentTaskResultDownload([record.childrenTasks[0].id]);
await reload();
} else {
await DocumentTaskResultDownload([record.id]);
await reload();
}
}
</script>
<style scoped></style>