103 lines
3.6 KiB
Vue
103 lines
3.6 KiB
Vue
|
|
<template>
|
|||
|
|
<BasicModal
|
|||
|
|
v-bind="$attrs"
|
|||
|
|
@register="registerModal"
|
|||
|
|
title="审批实例节点"
|
|||
|
|
width="960px"
|
|||
|
|
:showOkBtn="false"
|
|||
|
|
cancelText="关闭"
|
|||
|
|
destroyOnClose
|
|||
|
|
>
|
|||
|
|
<a-spin :spinning="loading">
|
|||
|
|
<a-descriptions v-if="forecastInfo.processInstanceId" :column="2" size="small" bordered class="ding-forecast-head">
|
|||
|
|
<a-descriptions-item label="MES审批流">{{ forecastInfo.mesFlowName || '-' }}</a-descriptions-item>
|
|||
|
|
<a-descriptions-item label="节点来源">{{ forecastInfo.nodeSource || '-' }}</a-descriptions-item>
|
|||
|
|
<a-descriptions-item label="钉钉模板" :span="2">{{ forecastInfo.templateName || '-' }}</a-descriptions-item>
|
|||
|
|
<a-descriptions-item label="processCode" :span="2">{{ forecastInfo.processCode }}</a-descriptions-item>
|
|||
|
|
<a-descriptions-item label="审批实例ID" :span="2">{{ forecastInfo.processInstanceId || '-' }}</a-descriptions-item>
|
|||
|
|
</a-descriptions>
|
|||
|
|
|
|||
|
|
<a-table
|
|||
|
|
:columns="columns"
|
|||
|
|
:data-source="nodes"
|
|||
|
|
:pagination="false"
|
|||
|
|
size="small"
|
|||
|
|
bordered
|
|||
|
|
row-key="stepNo"
|
|||
|
|
:locale="{ emptyText: '暂无审批节点' }"
|
|||
|
|
/>
|
|||
|
|
</a-spin>
|
|||
|
|
</BasicModal>
|
|||
|
|
</template>
|
|||
|
|
|
|||
|
|
<script lang="ts" setup>
|
|||
|
|
import { ref } from 'vue';
|
|||
|
|
import { BasicModal, useModalInner } from '/@/components/Modal';
|
|||
|
|
import { useMessage } from '/@/hooks/web/useMessage';
|
|||
|
|
import { getDingProcessForecast } from '../MesXslApprovalTrace.api';
|
|||
|
|
|
|||
|
|
defineOptions({ name: 'DingApprovalForecastModal' });
|
|||
|
|
|
|||
|
|
const { createMessage } = useMessage();
|
|||
|
|
|
|||
|
|
const loading = ref(false);
|
|||
|
|
const forecastInfo = ref<Recordable>({});
|
|||
|
|
const nodes = ref<Recordable[]>([]);
|
|||
|
|
|
|||
|
|
const columns = [
|
|||
|
|
{ title: '序号', dataIndex: 'stepNo', width: 70, align: 'center' },
|
|||
|
|
{ title: 'activityId', dataIndex: 'activityId', width: 120, ellipsis: true },
|
|||
|
|
{ title: 'MES节点', dataIndex: 'mesNodeName', width: 120, ellipsis: true },
|
|||
|
|
{ title: '钉钉节点', dataIndex: 'activityName', width: 120, ellipsis: true },
|
|||
|
|
{ title: '节点状态', dataIndex: 'nodeStatusText', width: 90, align: 'center' },
|
|||
|
|
{ title: '审批方式', dataIndex: 'approvalMethodText', width: 100, align: 'center' },
|
|||
|
|
{
|
|||
|
|
title: '审批人',
|
|||
|
|
dataIndex: 'actionerNames',
|
|||
|
|
customRender: ({ record }) => formatActioners(record),
|
|||
|
|
},
|
|||
|
|
];
|
|||
|
|
|
|||
|
|
const [registerModal, { setModalProps }] = useModalInner(async (data) => {
|
|||
|
|
forecastInfo.value = {};
|
|||
|
|
nodes.value = [];
|
|||
|
|
const record = data?.record || {};
|
|||
|
|
const bizTable = record.bizTable || data?.bizTable;
|
|||
|
|
const bizDataId = record.bizDataId;
|
|||
|
|
const processInstanceId = record.externalInstanceId;
|
|||
|
|
if (!processInstanceId && (!bizTable || !bizDataId)) {
|
|||
|
|
createMessage.warning('缺少单据ID或钉钉审批流ID,无法获取审批节点');
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
try {
|
|||
|
|
loading.value = true;
|
|||
|
|
setModalProps({ confirmLoading: false });
|
|||
|
|
const res = await getDingProcessForecast({ bizTable, bizDataId, processInstanceId });
|
|||
|
|
forecastInfo.value = res || {};
|
|||
|
|
nodes.value = res?.nodes || [];
|
|||
|
|
} catch (e: any) {
|
|||
|
|
createMessage.error(e?.message || '获取审批节点失败');
|
|||
|
|
} finally {
|
|||
|
|
loading.value = false;
|
|||
|
|
}
|
|||
|
|
});
|
|||
|
|
|
|||
|
|
function formatActioners(record: Recordable) {
|
|||
|
|
const names = record?.actionerNames;
|
|||
|
|
if (Array.isArray(names) && names.length) {
|
|||
|
|
return names.join('、');
|
|||
|
|
}
|
|||
|
|
const ids = record?.actionerUserIds;
|
|||
|
|
if (Array.isArray(ids) && ids.length) {
|
|||
|
|
return ids.join('、');
|
|||
|
|
}
|
|||
|
|
return '-';
|
|||
|
|
}
|
|||
|
|
</script>
|
|||
|
|
|
|||
|
|
<style lang="less" scoped>
|
|||
|
|
.ding-forecast-head {
|
|||
|
|
margin-bottom: 12px;
|
|||
|
|
}
|
|||
|
|
</style>
|