commit:升级到vue3,更新最近工作流技术栈,支持sa-token

This commit is contained in:
Jerry
2024-07-05 22:42:33 +08:00
parent bbcc608584
commit 565ecb6371
1751 changed files with 236790 additions and 0 deletions

View File

@@ -0,0 +1,534 @@
<template>
<HandlerFlowTask
ref="handlerFlowTaskRef"
:processInstanceId="dialogParams.processInstanceId"
:processDefinitionId="dialogParams.processDefinitionId"
:flowEntryName="dialogParams.flowEntryName"
:processInstanceInitiator="dialogParams.processInstanceInitiator"
:taskId="dialogParams.taskId"
:taskName="dialogParams.taskName"
:operationList="dialogParams.operationList"
:isRuntime="dialogParams.isRuntime"
:isDraft="dialogParams.isDraft"
@close="handlerClose"
@start="handlerStart"
@submit="handlerOperation"
@draft="handlerDraft"
>
<!-- 在线表单页面 -->
<WorkflowForm
v-if="dialogParams.routerName == null && dialogParams.formId != null"
ref="workflowFormRef"
style="width: 100%"
:style="{ height: mainContextHeight - 188 + 'px' }"
:formId="dialogParams.formId"
:readOnly="isReadOnly"
:flowInfo="getFlowInfo"
/>
<!-- 路由页面 -->
<router-view
ref="routerFlowForm"
style="width: 100%"
:isRuntimeTask="dialogParams.isRuntime"
:isDraft="dialogParams.isDraft"
:readOnly="dialogParams.readOnly"
:processInstanceId="dialogParams.processInstanceId"
:taskId="dialogParams.taskId"
:taskVariableList="dialogParams.variableList"
/>
</HandlerFlowTask>
</template>
<script setup lang="ts">
import { ElMessageBox, ElMessage } from 'element-plus';
import WorkflowForm from '@/pages/online/OnlinePageRender/index.vue';
import { FlowOperationController } from '@/api/flow';
import { ANY_OBJECT } from '@/types/generic';
import { SysFlowTaskOperationType } from '@/common/staticDict/flow';
import { useMessage } from '@/store';
import HandlerFlowTask from '../components/HandlerFlowTask.vue';
import { useFlowAction } from './hook';
import { IProp } from './types';
const props: IProp = defineProps<IProp>();
const mainContextHeight = inject('mainContextHeight', 200);
const workflowFormRef = ref();
const routerFlowForm = ref();
const isStart = ref(false);
// 保存草稿后流程taskId
const draftTaskId = ref<string>();
// 保存草稿后流程实例ID
const draftProcessInstanceId = ref<string>();
// 在线表单页面数据
const formData = ref<ANY_OBJECT>();
// 在线表单页面一对多数据
const oneToManyRelationData = ref<ANY_OBJECT>();
const { handlerFlowTaskRef, preHandlerOperation, submitConsign, handlerClose, dialogParams } =
useFlowAction(props);
const isOnlineForm = computed(() => {
return !!dialogParams.value.formId;
});
const isReadOnly = computed(() => {
return typeof dialogParams.value.readOnly === 'string'
? dialogParams.value.readOnly === 'true'
: dialogParams.value.readOnly;
});
const getFlowInfo = computed(() => {
return {
processInstanceId: dialogParams.value.processInstanceId,
taskId: dialogParams.value.taskId,
processDefinitionKey: dialogParams.value.processDefinitionKey,
processInstanceInitiator: dialogParams.value.processInstanceInitiator,
messageId: dialogParams.value.messageId,
isRuntime: dialogParams.value.isRuntime,
isDraft: dialogParams.value.isDraft,
};
});
const messageStore = useMessage();
/**
* 获得路由组件下的函数
* @param {string} functionName 函数名称
* @returns {function}
*/
const getRouterCompomentFunction = (functionName: string) => {
return routerFlowForm.value && typeof routerFlowForm.value[functionName] === 'function'
? routerFlowForm.value[functionName]
: undefined;
};
/**
* 获取表单数据
*/
const getMasterData = (
operationType: string,
assignee: string | undefined,
): Promise<ANY_OBJECT> => {
return new Promise((resolve, reject) => {
// TODO workflowFormRef.value.getFormData无须判断
if (isOnlineForm.value && workflowFormRef.value.getFormData) {
workflowFormRef.value
.getFormData(false, dialogParams.value.variableList)
.then((formData: ANY_OBJECT | null) => {
console.log('handleerFlowTask.getMasterData 表单数据', formData);
if (formData == null) {
reject();
return;
}
const assigneeArr = assignee && assignee !== '' ? assignee.split(',') : undefined;
if (operationType === SysFlowTaskOperationType.MULTI_SIGN) {
// 会签操作设置多实例处理人集合
if (formData.taskVariableData == null) formData.taskVariableData = {};
formData.taskVariableData.assigneeList = assigneeArr;
} else if (operationType === SysFlowTaskOperationType.SET_ASSIGNEE) {
// 设置下一个任务节点处理人
if (formData.taskVariableData == null) formData.taskVariableData = {};
formData.taskVariableData.appointedAssignee = assigneeArr
? assigneeArr.join(',')
: undefined;
}
resolve(formData);
})
.catch((e: Error) => {
reject(e);
});
} else {
// 获得静态表单页面的getMasterData函数
let funGetMasterData = getRouterCompomentFunction('getMasterData');
return funGetMasterData ? funGetMasterData(dialogParams.value.variableList) : reject();
}
});
};
const preHandlerOperationThen = (
operation: ANY_OBJECT,
copyItemList: Array<ANY_OBJECT>,
res: ANY_OBJECT | null,
) => {
// 加签、减签操作
if (
operation.type === SysFlowTaskOperationType.CO_SIGN ||
operation.type === SysFlowTaskOperationType.SIGN_REDUCTION
) {
submitConsign((res || {}).assignee, operation.type === SysFlowTaskOperationType.CO_SIGN)
.then(() => {
handlerClose();
})
.catch(e => {
console.warn(e);
});
return;
}
// 驳回操作
if (
operation.type === SysFlowTaskOperationType.REJECT ||
operation.type === SysFlowTaskOperationType.REJECT_TO_TASK
) {
FlowOperationController.rejectRuntimeTask({
processInstanceId: dialogParams.value.processInstanceId,
taskId: dialogParams.value.taskId,
targetTaskKey: (res || {}).targetTaskKey,
taskComment: (res || {}).message,
taskVariableData: {
latestApprovalStatus: operation.latestApprovalStatus,
},
})
.then(() => {
handlerClose();
})
.catch(e => {
console.warn(e);
});
return;
}
// 驳回到起点
if (operation.type === SysFlowTaskOperationType.REJECT_TO_START) {
FlowOperationController.rejectToStartUserTask({
processInstanceId: dialogParams.value.processInstanceId,
taskId: dialogParams.value.taskId,
taskComment: (res || {}).message,
taskVariableData: {
latestApprovalStatus: operation.latestApprovalStatus,
},
})
.then(() => {
handlerClose();
})
.catch(e => {
console.warn(e);
});
return;
}
// 撤销操作
if (operation.type === SysFlowTaskOperationType.REVOKE) {
ElMessageBox.confirm('是否撤销此任务?', '', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning',
})
.then(() => {
FlowOperationController.revokeHistoricTask({
processInstanceId: dialogParams.value.processInstanceId,
taskId: dialogParams.value.taskId,
taskComment: '任务处理人撤销任务',
taskVariableData: {
latestApprovalStatus: operation.latestApprovalStatus,
},
})
.then(() => {
handlerClose();
})
.catch(e => {
console.warn(e);
});
})
.catch(e => {
console.warn(e);
});
return;
}
getMasterData(operation.type, (res || {}).assignee).then(formData => {
let params = {
taskId: dialogParams.value.taskId || draftTaskId.value,
processInstanceId: dialogParams.value.processInstanceId || draftProcessInstanceId.value,
masterData: formData.masterData,
slaveData: formData.slaveData,
flowTaskCommentDto: {
taskComment: (res || {}).message,
approvalType: operation.type,
delegateAssignee:
operation.type === SysFlowTaskOperationType.TRANSFER ? (res || {}).assignee : undefined,
},
taskVariableData: {
...formData.taskVariableData,
latestApprovalStatus: operation.latestApprovalStatus,
},
copyData: (copyItemList || []).reduce((retObj, item) => {
retObj[item.type] = item.id;
return retObj;
}, {}),
};
FlowOperationController.submitUserTask(params)
.then(() => {
handlerClose();
messageStore.reloadMessage();
ElMessage.success('提交成功!');
})
.catch(e => {
console.warn(e);
});
});
};
/**
* 流程操作
* @param {Object} operation 流程操作
*/
const handlerOperation = (
operation: ANY_OBJECT,
copyItemList: ANY_OBJECT[],
xml: string | undefined,
) => {
if (isOnlineForm.value) {
preHandlerOperation(operation, isStart.value || dialogParams.value.isDraft, xml, copyItemList)
.then(res => {
preHandlerOperationThen(operation, copyItemList, res);
})
.catch(e => {
console.warn(e);
});
} else {
let funHandlerOperation = getRouterCompomentFunction('handlerOperation');
if (funHandlerOperation) {
funHandlerOperation(operation, copyItemList, xml)
.then(() => {
handlerClose();
})
.catch((e: Error) => {
console.warn(e);
});
} else {
ElMessage.error('当前流程并未实现处理功能,请联系管理员!');
}
}
};
/**
* 启动流程
*/
const handlerStart = (
operation: ANY_OBJECT,
copyItemList: ANY_OBJECT[],
xml: string | undefined,
) => {
// 启动并保存草稿后再次提交
if (draftProcessInstanceId.value != null && draftTaskId.value != null) {
handlerOperation(operation, copyItemList, xml);
return;
}
if (!isOnlineForm.value) {
let funHandlerStart = getRouterCompomentFunction('handlerStart');
if (funHandlerStart != null) {
funHandlerStart(operation, copyItemList, xml)
.then(() => {
handlerClose();
})
.catch((e: Error) => {
console.warn(e);
});
} else {
ElMessage.error('当前流程并未实现启动功能,请联系管理员!');
}
} else {
preHandlerOperation(operation, true, xml)
.then(res => {
getMasterData(operation.type, (res || {}).assignee).then(formData => {
FlowOperationController.startAndTakeUserTask(
{
processDefinitionKey: dialogParams.value.processDefinitionKey,
masterData: formData.masterData || {},
slaveData: formData.slaveData,
taskVariableData: {
...formData.taskVariableData,
latestApprovalStatus: operation.latestApprovalStatus,
},
flowTaskCommentDto: {
approvalType: operation.type,
},
copyData: (copyItemList || []).reduce((retObj, item) => {
retObj[item.type] = item.id;
return retObj;
}, {}),
},
{
// 判断是否是从流程设计里启动
processDefinitionKey: dialogParams.value.isPreview
? undefined
: dialogParams.value.processDefinitionKey,
},
)
.then(() => {
handlerClose();
ElMessage.success('启动成功!');
})
.catch(e => {
console.warn(e);
});
});
})
.catch(e => {
console.warn(e);
});
}
};
/**
* 获得草稿数据
*/
const getDraftData = () => {
return new Promise<ANY_OBJECT>((resolve, reject) => {
workflowFormRef.value
.getFormData(true)
.then((res: ANY_OBJECT) => {
resolve(res);
})
.catch((e: Error) => {
reject(e);
});
});
};
/**
* 保存草稿
*/
const handlerDraft = () => {
if (isOnlineForm.value) {
getDraftData()
.then(formData => {
if (formData == null) {
return;
}
let params = {
processDefinitionKey: dialogParams.value.processDefinitionKey,
processInstanceId: dialogParams.value.processInstanceId || draftProcessInstanceId.value,
masterData: formData.masterData,
slaveData: formData.slaveData,
};
FlowOperationController.startAndSaveDraft(params, {
processDefinitionKey: dialogParams.value.processDefinitionKey,
})
.then(res => {
ElMessage.success('草稿保存成功!');
draftProcessInstanceId.value = res.data.processInstanceId;
draftTaskId.value = res.data.taskId;
})
.catch(e => {
console.warn(e);
});
})
.catch(e => {
console.warn(e);
});
} else {
let funHandlerOperation = getRouterCompomentFunction('handlerDraft');
if (funHandlerOperation) {
funHandlerOperation().catch((e: Error) => {
console.warn(e);
});
} else {
ElMessage.error('当前流程并未实现保存草稿,请联系管理员!');
}
}
};
/**
* 初始化流程表单数据
*/
const initFormData = () => {
if (
dialogParams.value.processInstanceId == null ||
dialogParams.value.processInstanceId === '' ||
dialogParams.value.formId == null
) {
return;
}
if (isOnlineForm.value) {
let params = {
processInstanceId: dialogParams.value.processInstanceId,
taskId: dialogParams.value.taskId,
};
// 判断是展示历史流程的数据还是待办流程的数据
let httpCall = null;
if (dialogParams.value.isDraft) {
// 草稿数据
httpCall = FlowOperationController.viewOnlineDraftData({
processDefinitionKey: dialogParams.value.processDefinitionKey,
processInstanceId: dialogParams.value.processInstanceId,
});
} else if (dialogParams.value.messageId != null) {
// 抄送消息
httpCall = FlowOperationController.viewOnlineCopyBusinessData({
messageId: dialogParams.value.messageId,
});
} else {
httpCall =
dialogParams.value.taskId != null && dialogParams.value.isRuntime
? FlowOperationController.viewUserTask(params)
: FlowOperationController.viewHistoricProcessInstance(params);
}
httpCall
.then(res => {
isStart.value = res.data == null;
// 一对多数据
oneToManyRelationData.value = (res.data || {}).oneToMany;
// 草稿一对多数据,添加唯一主键
if (dialogParams.value.isDraft || dialogParams.value.isDraft === 'true') {
if (oneToManyRelationData.value != null) {
let tempTime = new Date().getTime();
Object.keys(oneToManyRelationData.value).forEach(key => {
const oneToManyRelationDataValue = oneToManyRelationData.value
? oneToManyRelationData.value[key]
: null;
if (Array.isArray(oneToManyRelationDataValue)) {
oneToManyRelationDataValue.forEach(item => {
item.__cascade_add_id__ = tempTime++;
});
}
});
}
}
// 主表数据以及一对一关联数据
if ((res.data || {}).masterAndOneToOne != null) {
formData.value = {
...res.data.masterAndOneToOne,
};
}
})
.catch(e => {
console.warn(e);
});
} else {
let funInitFormData = getRouterCompomentFunction('initFormData');
funInitFormData
? funInitFormData()
: ElMessage.error('当前流程并未实现页面初始化功能,请联系管理员!');
}
};
onMounted(() => {
initFormData();
});
const refreshData = (data: ANY_OBJECT) => {
if (data.path === 'thirdTaskCommit' && data.isSuccess) {
preHandlerOperationThen(data.rowData.operation, data.rowData.copyItemList, data.data);
}
};
defineExpose({
refreshData,
});
</script>
<style scoped>
.task-title {
display: flex;
justify-content: space-between;
padding-bottom: 5px;
margin-bottom: 10px;
border-bottom: 3px solid #409eff;
}
.task-title .text {
height: 28px;
line-height: 28px;
font-weight: 600;
font-size: 16px;
color: #383838;
}
.task-title .el-tag {
margin-left: 10px;
}
</style>