提交 2ffff3e0 authored 作者: liuluyu's avatar liuluyu

更新计划流程

上级 1ccf9919
......@@ -100,7 +100,7 @@
</template>
<script lang="ts" name="project-plan-stPlanManList" setup>
import { reactive, ref, toRaw, unref } from 'vue';
import { nextTick, reactive, ref, toRaw, unref } from 'vue';
import { batchDelete, deleteOne, getExportUrl, getImportUrl, handlePlan, list } from './StPlanMan.api';
import { columns, searchFormSchema } from './StPlanMan.data';
import StPlanManModal from './components/StPlanManModal.vue';
......@@ -110,16 +110,18 @@
import { BasicTable, TableAction } from '/@/components/Table';
import { useListPage } from '/@/hooks/system/useListPage';
import { downloadFile } from '/@/utils/common/renderUtils';
import { useUserStoreWithOut } from '/@/store/modules/user';
import { message } from 'ant-design-vue';
import { definitionStartByDeployId } from '/@/components/Process/api/definition';
import { useRoute } from 'vue-router';
// 引入待办任务组件
import TodoIndex from '../../flowable/task/todo/components/TodoIndex.vue';
import { flowTaskInfo } from '/@/components/Process/api/process';
import { todoList } from '/@/components/Process/api/todo';
const refTodoIndex = ref();
const isShowDrawer = ref(false);
const startUser = ref<string>('');
const taskName = ref<string>('');
const showUpBtn = ref(false);
const taskCache = new Map<string, any>();
const checkedKeys = ref<Array<string | number>>([]);
//注册model
......@@ -226,52 +228,105 @@
});
}
const user = useUserStoreWithOut();
const url = ref(
`${
import.meta.env.VITE_APP_JFLOW_CORE_ADDR
}/#/WF/MyFlow?FlowNo=095&RouteFrom=MyFlow&visible=false&No=087&Name=计划审核流程&IsBatchStart=0&Icon=icon-plane&FK_FlowSort=101&FK_FlowSortText=流程基础&DomainExt=&MobileColorType=0&IsStartInMobile=1&Idx=3&WorkModel=0&SortIdx=0&FlowMark=&Btns=流程列表&Token=${
user.getJflowToken
}`
);
const formData = ref<any>({}); // 填写的表单数据
//const refStPlanManFlow = ref()
function handleFLow(record: Recordable) {
formData.value.dataId = record.id;
formData.value.dataName = 'id';
definitionStartByDeployId(record.deployId, formData).then((res) => {
console.log("计划启动----------- res",res);
handleSuccess();
});
async function findTodoTaskByProcInsId(procInsId: string) {
// 启动流程后,待办任务可能存在短暂延迟,做一个轻量重试
for (let i = 0; i < 3; i++) {
const ret = await todoList({ pageNum: 1, pageSize: 10, procInsId });
const records = ret?.records || [];
const hit = records.find((r) => r?.procInsId === procInsId) || records[0];
if (hit) return hit;
await new Promise((resolve) => setTimeout(resolve, 300));
}
return undefined;
}
//console.log("----------- record",record);
//window.open(url.value+"&kjzlid="+record.id, '_blank');
// refStPlanManFlow.value.iniPage(record);
function pickStartResult(res: any) {
// defHttp 返回形态在不同后端/拦截器下可能是 data/result/直接对象,这里做一次兜底
const base = res?.data ?? res?.result ?? res;
return base || {};
}
// 待办任务
// 待办任务:点击后若流程未启动则先启动,再在抽屉中完成流程操作
async function handleTodo(record: Recordable) {
isShowDrawer.value = true;
console.log('record', record);
if (record.taskId || record.procInsId || record.deployId) {
refTodoIndex.value?.iniData?.(record);
const dataId = record.id || record.dataId || record.businessId;
if (!dataId) {
message.error('未找到业务数据标识');
return;
}
// 优先使用本地缓存(用于刚启动后列表未回写 taskId/procInsId 的场景)
const cached = taskCache.get(String(dataId));
if (cached && !record.taskId) {
record = Object.assign({}, record, cached);
}
// 流程未启动时,先启动流程
const needStartFlow =
!record.taskId &&
!record.procInsId &&
(record['bpmStatus'] == null || record['bpmStatus'] == '' || record['bpmStatus'] == '1');
if (needStartFlow && record.deployId) {
try {
const formData = { dataId, dataName: 'id' };
const startResRaw = await definitionStartByDeployId(record.deployId, formData);
const startRes = pickStartResult(startResRaw);
let payload: any = Object.assign({}, record, startRes);
// 若启动接口未返回 taskId,则尝试通过 procInsId 从待办列表反查
if (!payload.taskId && payload.procInsId) {
const todoRow = await findTodoTaskByProcInsId(payload.procInsId);
if (todoRow?.taskId) {
payload = Object.assign({}, record, startRes, todoRow);
}
}
if (!payload.taskId) {
message.error('流程已启动,但未获取到待办任务');
return;
}
taskCache.set(String(dataId), payload);
startUser.value = payload.startUserName || payload.startUser || '';
taskName.value = payload.taskName || payload.currentTaskName || '';
isShowDrawer.value = true;
await nextTick();
refTodoIndex.value?.iniData?.(payload);
} catch (e) {
console.error('启动流程或获取任务失败:', e);
message.error('操作失败,请重试');
}
return;
}
// 流程已启动:优先使用 record.taskId,否则尝试用 procInsId 从待办列表反查
try {
const dataId = record.id || record.dataId || record.businessId;
if (!dataId) {
throw new Error('未找到业务数据标识 (id)');
let payload: any = { ...record };
if (!payload.taskId && payload.procInsId) {
const todoRow = await findTodoTaskByProcInsId(payload.procInsId);
if (todoRow?.taskId) {
payload = Object.assign({}, record, todoRow);
}
}
const info = await flowTaskInfo({ dataId });
console.log('获取到的流程任务信息:', info);
if (info && (info.taskId || info.procInsId || info.deployId)) {
const payload = Object.assign({}, record, info);
refTodoIndex.value?.iniData?.(payload);
} else {
throw new Error('未能从后端获取任务信息');
if (!payload.taskId) {
message.error('未获取到待办任务(缺少 taskId),请确认列表是否返回 procInsId 或从【待办任务】菜单进入处理');
return;
}
taskCache.set(String(dataId), payload);
startUser.value = payload.startUserName || payload.startUser || '';
taskName.value = payload.taskName || payload.currentTaskName || '';
isShowDrawer.value = true;
await nextTick();
refTodoIndex.value?.iniData?.(payload);
} catch (e) {
console.error('获取流程任务信息失败:', e);
message.error('获取任务信息失败');
}
}
async function handleSubmit(record) {
......@@ -307,23 +362,8 @@
return [
{
label: '修改',
// disabled: record['planFlag'] != '0' && record['planFlag'] != '2',
onClick: handleEdit.bind(null, record),
},
{
label: '下一步',
onClick: handleFLow.bind(null, record),
ifShow: () => {
if (record['bpmStatus'] == null || record['bpmStatus'] == '' || record['bpmStatus'] == '1') return true;
else return false;
},
//onClick: handleFLow.bind(null, record),
// disabled: record['planFlag'] != '0' && record['planFlag'] != '2',
// popConfirm: {
// title: '是否确认提交',
// confirm: handleSubmit.bind(null, record),
// },
},
{
label: '待办',
onClick: handleTodo.bind(null, record),
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论