Files
plus-ui/src/components/Process/approvalRecord.vue
2024-03-08 18:22:28 +08:00

197 lines
7.7 KiB
Vue
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<template>
<div class="container">
<el-dialog v-model="visible" draggable title="审批记录" :width="props.width" :height="props.height" :close-on-click-modal="false">
<el-tabs v-model="tabActiveName" class="demo-tabs">
<el-tab-pane label="流程图" name="bpmn">
<!-- <div v-loading="loading">-->
<!-- <div style="width: 100%; height: 300px; overflow: auto; position: relative">-->
<!-- <div-->
<!-- v-for="(graphic, index) in graphicInfoVos"-->
<!-- :key="index"-->
<!-- :style="{-->
<!-- position: 'absolute',-->
<!-- left: `${graphic.x}px`,-->
<!-- top: `${graphic.y}px`,-->
<!-- width: `${graphic.width}px`,-->
<!-- height: `${graphic.height}px`,-->
<!-- cursor: 'pointer',-->
<!-- zIndex: 99-->
<!-- }"-->
<!-- @mouseover="handleMouseOver(graphic)"-->
<!-- @mouseleave="handleMouseLeave()"-->
<!-- ></div>-->
<!-- &lt;!&ndash; 弹出的 div 元素 &ndash;&gt;-->
<!-- <div-->
<!-- v-show="popupVisible"-->
<!-- class="triangle"-->
<!-- :style="{-->
<!-- position: 'absolute',-->
<!-- left: `${graphicX}px`,-->
<!-- top: `${graphicY}px`,-->
<!-- backgroundColor: '#fff',-->
<!-- padding: '10px',-->
<!-- zIndex: 100-->
<!-- }"-->
<!-- >-->
<!-- <p>审批人员: {{ nodeInfo.nickName }}</p>-->
<!-- <p>节点状态{{ nodeInfo.status }}</p>-->
<!-- <p>开始时间{{ nodeInfo.startTime }}</p>-->
<!-- <p>结束时间{{ nodeInfo.endTime }}</p>-->
<!-- <p>审批耗时{{ nodeInfo.runDuration }}</p>-->
<!-- </div>-->
<!-- <el-image :src="src" />-->
<!-- </div>-->
<!-- </div>-->
<BpmnView ref="bpmnViewRef"></BpmnView>
</el-tab-pane>
<el-tab-pane label="审批信息" name="info">
<div>
<el-table :data="historyList" style="width: 100%" border fit max-height="570">
<el-table-column type="index" label="序号" align="center" width="50"></el-table-column>
<el-table-column prop="name" label="任务名称" sortable align="center"></el-table-column>
<el-table-column prop="nickName" label="办理人" sortable align="center"></el-table-column>
<el-table-column label="状态" sortable align="center">
<template #default="scope">
<el-tag type="success">{{ scope.row.statusName }}</el-tag>
</template>
</el-table-column>
<el-table-column prop="comment" label="审批意见" sortable align="center"></el-table-column>
<el-table-column prop="attachmentList" label="附件" sortable align="center">
<template #default="scope">
<el-popover v-if="scope.row.attachmentList && scope.row.attachmentList.length > 0" placement="right" :width="310" trigger="click">
<template #reference>
<el-button style="margin-right: 16px">附件</el-button>
</template>
<el-table border :data="scope.row.attachmentList">
<el-table-column prop="name" width="202" :show-overflow-tooltip="true" label="附件名称"></el-table-column>
<el-table-column prop="name" width="80" align="center" :show-overflow-tooltip="true" label="操作">
<template #default="tool">
<el-button type="text" @click="handleDownload(tool.row.contentId)">下载</el-button>
</template>
</el-table-column>
</el-table>
</el-popover>
</template>
</el-table-column>
<el-table-column prop="startTime" label="开始时间" sortable align="center"></el-table-column>
<el-table-column prop="endTime" label="结束时间" sortable align="center"></el-table-column>
<el-table-column prop="runDuration" label="运行时长" sortable align="center"></el-table-column>
</el-table>
</div>
</el-tab-pane>
</el-tabs>
</el-dialog>
</div>
</template>
<script lang="ts" setup>
import BpmnView from '@/components/BpmnView/index.vue';
import processApi from '@/api/workflow/processInstance';
import { propTypes } from '@/utils/propTypes';
type NodeInfo = {
nickName?: string;
status?: string;
startTime?: string;
endTime?: string;
runDuration?: string;
};
const { proxy } = getCurrentInstance() as ComponentInternalInstance;
const props = defineProps({
width: propTypes.string.def('70%'),
height: propTypes.string.def('100%')
});
const loading = ref(false);
const src = ref('');
const visible = ref(false);
const historyList = ref<Array<any>>([]);
const deleteReason = ref<string>('');
const graphicInfoVos = ref<Array<any>>([]);
const nodeListInfo = ref<Array<any>>([]);
const popupVisible = ref(false);
const nodeInfo = ref<NodeInfo>({});
const graphicX = ref<number | string>(0);
const graphicY = ref<number | string>(0);
const tabActiveName = ref('bpmn');
const bpmnViewRef = ref<BpmnView>();
//初始化查询审批记录
const init = async (instanceId: string) => {
visible.value = true;
loading.value = true;
historyList.value = [];
graphicInfoVos.value = [];
processApi.getHistoryImage(instanceId).then((res) => {
src.value = 'data:image/png;base64,' + res.data;
});
processApi.getHistoryRecord(instanceId).then((resp) => {
historyList.value = resp.data.historyRecordList;
graphicInfoVos.value = resp.data.graphicInfoVos;
nodeListInfo.value = resp.data.nodeListInfo;
deleteReason.value = resp.data.deleteReason;
loading.value = false;
});
await nextTick(() => {
bpmnViewRef.value.init(instanceId);
});
};
//悬浮事件
const handleMouseOver = async (graphic: any) => {
graphicX.value = graphic.x + graphic.width + 10;
graphicY.value = graphic.y - graphic.height + -10;
nodeInfo.value = {};
if (nodeListInfo.value && nodeListInfo.value.length > 0) {
let info = nodeListInfo.value.find((e: any) => e.taskDefinitionKey == graphic.nodeId);
if (info) {
nodeInfo.value = {
nickName: info.nickName,
status: info.status,
startTime: info.startTime,
endTime: info.endTime,
runDuration: info.runDuration
};
popupVisible.value = true;
}
}
};
//关闭
const handleMouseLeave = async () => {
popupVisible.value = false;
};
/** 下载按钮操作 */
const handleDownload = (ossId: string) => {
proxy?.$download.oss(ossId);
};
/**
* 对外暴露子组件方法
*/
defineExpose({
init
});
</script>
<style lang="scss" scoped>
.triangle {
box-shadow: 0 1px 4px rgba(0, 0, 0, 0.3);
border-radius: 6px;
}
.triangle::after {
content: ' ';
position: absolute;
top: 8em;
right: 215px;
border: 15px solid;
border-color: transparent #fff transparent transparent;
}
.container {
:deep(.el-dialog .el-dialog__body) {
max-height: calc(100vh - 300px) !important;
min-height: calc(100vh - 300px) !important;
}
}
</style>