!723 fix: 流程再次发起,预测节点查询

Merge pull request !723 from SamllNorth_Lee/feature/bpm
This commit is contained in:
芋道源码 2025-03-06 01:29:05 +00:00 committed by Gitee
commit 202d4b6795
No known key found for this signature in database
GPG Key ID: 173E9B9CA92EEF8F
5 changed files with 58 additions and 34 deletions

View File

@ -93,6 +93,11 @@ export const getApprovalDetail = async (params: any) => {
return await request.get({ url: '/bpm/process-instance/get-approval-detail', params })
}
// 获取下一个执行的流程节点
export const getNextApprovalNodes = async (params: any) => {
return await request.get({ url: '/bpm/process-instance/get-next-approval-nodes', params })
}
// 获取表单字段权限
export const getFormFieldsPermission = async (params: any) => {
return await request.get({ url: '/bpm/process-instance/get-form-fields-permission', params })

View File

@ -162,6 +162,10 @@ export enum CandidateStrategy {
*
*/
USER = 30,
/**
*
*/
APPROVE_USER_SELECT = 34,
/**
*
*/
@ -542,6 +546,7 @@ export const CANDIDATE_STRATEGY: DictDataVO[] = [
{ label: '连续多级部门负责人', value: CandidateStrategy.MULTI_LEVEL_DEPT_LEADER },
{ label: '指定岗位', value: CandidateStrategy.MULTI_LEVEL_DEPT_LEADER },
{ label: '发起人自选', value: CandidateStrategy.START_USER_SELECT },
{ label: '审批人自选', value: CandidateStrategy.APPROVE_USER_SELECT },
{ label: '发起人本人', value: CandidateStrategy.START_USER },
{ label: '发起人部门负责人', value: CandidateStrategy.START_USER_DEPT_LEADER },
{ label: '发起人连续部门负责人', value: CandidateStrategy.START_USER_MULTI_LEVEL_DEPT_LEADER },

View File

@ -117,6 +117,7 @@ const activityNodes = ref<ProcessInstanceApi.ApprovalNodeInfo[]>([]) // 审批
/** 设置表单信息、获取流程图数据 **/
const initProcessInfo = async (row: any, formVariables?: any) => {
//
startUserSelectTasks.value = []
startUserSelectAssignees.value = {}
@ -138,9 +139,12 @@ const initProcessInfo = async (row: any, formVariables?: any) => {
await nextTick()
fApi.value?.btn.show(false) //
//
await getApprovalDetail(row)
// ,
await getApprovalDetail({
id: row.id,
processVariablesStr: JSON.stringify(formVariables)
})
// }
//
const processDefinitionDetail = await DefinitionApi.getProcessDefinition(row.id)
if (processDefinitionDetail) {

View File

@ -44,7 +44,11 @@
:rows="4"
/>
</el-form-item>
<el-form-item label="下一个节点的审批人" prop="nextAssignees" v-if="nextAssigneesVisible">
<el-form-item
label="下一个节点的审批人"
prop="nextAssignees"
v-if="nextAssigneesActivityNode.length > 0"
>
<div class="ml-10px -mt-15px -mb-35px">
<ProcessInstanceTimeline
:activity-nodes="nextAssigneesActivityNode"
@ -522,6 +526,7 @@ import { BpmModelFormType, BpmProcessInstanceStatus } from '@/utils/constants'
import type { FormInstance, FormRules } from 'element-plus'
import SignDialog from './SignDialog.vue'
import ProcessInstanceTimeline from '../detail/ProcessInstanceTimeline.vue'
import { isEmpty } from '@/utils/is'
defineOptions({ name: 'ProcessInstanceBtnContainer' })
@ -565,7 +570,6 @@ const reasonRequire = ref()
const approveFormRef = ref<FormInstance>()
const signRef = ref()
const approveSignFormRef = ref()
const nextAssigneesVisible = ref(false) //
const nextAssigneesActivityNode = ref<ProcessInstanceApi.ApprovalNodeInfo[]>([]) //
const approveReasonForm = reactive({
reason: '',
@ -711,36 +715,30 @@ const closePopover = (type: string, formRef: FormInstance | undefined) => {
formRef.resetFields()
}
popOverVisible.value[type] = false
nextAssigneesVisible.value = false
nextAssigneesActivityNode.value = []
}
/** 流程通过时,根据表单变量查询新的流程节点,判断下一个节点类型是否为自选审批人 */
const initNextAssigneesFormField = async () => {
// ,
const variables = getUpdatedProcessInstanceVariables()
const data = await ProcessInstanceApi.getApprovalDetail({
const data = await ProcessInstanceApi.getNextApprovalNodes({
processInstanceId: props.processInstance.id,
taskId: runningTask.value.id,
processVariablesStr: JSON.stringify(variables)
})
const activityId = data.todoTask?.taskDefinitionKey
if (data.activityNodes && data.activityNodes.length > 0) {
//
const currentNodeIndex = data.activityNodes.findIndex((node: any) => node.id === activityId)
const nextNode = data.activityNodes[currentNodeIndex + 1]
//
if (
nextNode.candidateStrategy === CandidateStrategy.START_USER_SELECT &&
!nextNode.tasks &&
nextNode.candidateUsers?.length === 0
) {
//
// TODO @ nextNode
// TODO @
nextAssigneesActivityNode.value = [nextNode]
nextAssigneesVisible.value = true
}
// TODO @
if (data && data.length > 0) {
data.forEach((node: any) => {
//
if (
(isEmpty(node.tasks) &&
isEmpty(node.candidateUsers) &&
CandidateStrategy.START_USER_SELECT === node.candidateStrategy) ||
CandidateStrategy.APPROVE_USER_SELECT === node.candidateStrategy
) {
nextAssigneesActivityNode.value.push(node)
}
})
}
}
@ -748,6 +746,20 @@ const initNextAssigneesFormField = async () => {
const selectNextAssigneesConfirm = (id: string, userList: any[]) => {
approveReasonForm.nextAssignees[id] = userList?.map((item: any) => item.id)
}
/** 审批通过时,校验每个自选审批人的节点是否都已配置了审批人 */
const validateNextAssignees = () => {
//
if (Object.keys(nextAssigneesActivityNode.value).length > 0) {
//
for (const item of nextAssigneesActivityNode.value) {
if (isEmpty(approveReasonForm.nextAssignees[item.id])) {
message.warning('下一个节点的审批人不能为空!')
return false
}
}
}
return true
}
/** 处理审批通过和不通过的操作 */
const handleAudit = async (pass: boolean, formRef: FormInstance | undefined) => {
@ -764,11 +776,8 @@ const handleAudit = async (pass: boolean, formRef: FormInstance | undefined) =>
}
if (pass) {
//
if (nextAssigneesVisible.value && Object.keys(approveReasonForm.nextAssignees).length === 0) {
message.warning('下一个节点的审批人不能为空!')
return
}
const nextAssigneesValid = validateNextAssignees()
if (!nextAssigneesValid) return
const variables = getUpdatedProcessInstanceVariables()
//
const data = {
@ -791,7 +800,7 @@ const handleAudit = async (pass: boolean, formRef: FormInstance | undefined) =>
}
await TaskApi.approveTask(data)
popOverVisible.value.approve = false
nextAssigneesVisible.value = false
nextAssigneesActivityNode.value = []
message.success('审批通过成功')
} else {
//

View File

@ -43,7 +43,8 @@
v-if="
isEmpty(activity.tasks) &&
isEmpty(activity.candidateUsers) &&
CandidateStrategy.START_USER_SELECT === activity.candidateStrategy
(CandidateStrategy.START_USER_SELECT === activity.candidateStrategy ||
CandidateStrategy.APPROVE_USER_SELECT === activity.candidateStrategy)
"
>
<!-- && activity.nodeType === NodeType.USER_TASK_NODE -->
@ -252,7 +253,7 @@ const nodeTypeSvgMap = {
//
[NodeType.PARALLEL_BRANCH_NODE]: { color: '#14bb83', svg: parallelSvg },
//
[NodeType.CHILD_PROCESS_NODE]: { color: '#14bb83', svg: childProcessSvg },
[NodeType.CHILD_PROCESS_NODE]: { color: '#14bb83', svg: childProcessSvg }
}
// -101 icon