|
|
@@ -43,8 +43,10 @@ import com.wflow.workflow.service.*; |
|
|
|
import lombok.RequiredArgsConstructor; |
|
|
|
import lombok.extern.slf4j.Slf4j; |
|
|
|
import org.assertj.core.util.Lists; |
|
|
|
import org.flowable.bpmn.model.*; |
|
|
|
import org.flowable.engine.*; |
|
|
|
import org.flowable.engine.history.HistoricProcessInstance; |
|
|
|
import org.flowable.engine.runtime.ActivityInstance; |
|
|
|
import org.springframework.beans.BeanUtils; |
|
|
|
import org.springframework.stereotype.Component; |
|
|
|
import javax.servlet.http.HttpServletResponse; |
|
|
@@ -55,6 +57,7 @@ import java.util.stream.Collectors; |
|
|
|
import static cn.hutool.core.collection.CollUtil.isEmpty; |
|
|
|
import static cn.hutool.core.collection.CollUtil.isNotEmpty; |
|
|
|
import static com.ningdatech.pmapi.todocenter.constant.WorkNotice.*; |
|
|
|
import static com.wflow.workflow.task.TriggerServiceTask.runtimeService; |
|
|
|
|
|
|
|
/** |
|
|
|
* @author ZPF |
|
|
@@ -65,8 +68,6 @@ import static com.ningdatech.pmapi.todocenter.constant.WorkNotice.*; |
|
|
|
@Slf4j |
|
|
|
public class TodoCenterManage { |
|
|
|
|
|
|
|
private final TaskService taskService; |
|
|
|
|
|
|
|
private final ProcessTaskService processTaskService; |
|
|
|
private final HistoryService historyService; |
|
|
|
private final IUserInfoService userInfoService; |
|
|
@@ -283,7 +284,7 @@ public class TodoCenterManage { |
|
|
|
processTaskService.handleTask(param, userId); |
|
|
|
WorkNoticeInfo rejectWorkNoticeInfo = getSendWorkNoticeInfo(startUserInfo); |
|
|
|
String rejectMsg = String.format(REJECT_MSG_TEMPLATE, projectName, processDefinitionName); |
|
|
|
zwddClient.sendWorkNotice(rejectWorkNoticeInfo.getReceiverUserId(),rejectWorkNoticeInfo.getBizMsgId(),rejectMsg); |
|
|
|
// zwddClient.sendWorkNotice(rejectWorkNoticeInfo.getReceiverUserId(),rejectWorkNoticeInfo.getBizMsgId(),rejectMsg); |
|
|
|
// 更新项目状态和流程状态 |
|
|
|
updateRejectProjectStatus(userId, declaredProject); |
|
|
|
break; |
|
|
@@ -299,7 +300,7 @@ public class TodoCenterManage { |
|
|
|
// 给项目创建人、流程发起人发送浙政钉工作通知:【项目名称】的【流程名称】被退回,请及时处理。 |
|
|
|
WorkNoticeInfo backWorkNoticeInfo = getSendWorkNoticeInfo(startUserInfo); |
|
|
|
String backMsg = String.format(BACK_MSG_TEMPLATE, projectName, processDefinitionName); |
|
|
|
zwddClient.sendWorkNotice(backWorkNoticeInfo.getReceiverUserId(),backWorkNoticeInfo.getBizMsgId(),backMsg); |
|
|
|
// zwddClient.sendWorkNotice(backWorkNoticeInfo.getReceiverUserId(),backWorkNoticeInfo.getBizMsgId(),backMsg); |
|
|
|
break; |
|
|
|
// 撤回(流程发起人和当前流程审核人的前一个审核人操作) |
|
|
|
case WITHDRAW: |
|
|
@@ -340,51 +341,12 @@ public class TodoCenterManage { |
|
|
|
processTaskService.handleTask(param, userId); |
|
|
|
} |
|
|
|
} |
|
|
|
break; |
|
|
|
default: |
|
|
|
throw new IllegalStateException("Unexpected value: " + param.getAction()); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
/** |
|
|
|
* 审批任务:驳回 |
|
|
|
* |
|
|
|
* @param task 当前任务 |
|
|
|
* @param userId |
|
|
|
* @param param 参数 |
|
|
|
*/ |
|
|
|
//private void doReject(Task task, Long userId, ReqProcessHandlerDTO param) { |
|
|
|
// // 获取当前申报项目 |
|
|
|
// Project declaredProject = projectService.getOne(Wrappers.lambdaQuery(Project.class) |
|
|
|
// .eq(Project::getInstCode, task.getProcessInstanceId()) |
|
|
|
// .eq(Project::getId,param.getProjectId())); |
|
|
|
// String projectName = declaredProject.getProjectName(); |
|
|
|
// |
|
|
|
// Map<String, Object> var = new HashMap<>(16); |
|
|
|
// var.put("approve_" + task.getId(), param.getAction()); |
|
|
|
// // 保存审核意见 |
|
|
|
// if (hasComment(param.getAuditInfo())) { |
|
|
|
// // 执行自定义的保存评论的功能 |
|
|
|
// managementService.executeCommand(new SaveCommentCmd(param.getTaskId(), param.getInstanceId(), |
|
|
|
// String.valueOf(userId), JSONObject.toJSONString(param.getAuditInfo()))); |
|
|
|
// } |
|
|
|
// // 获取bpm对象 |
|
|
|
// BpmnModel bpmnModel = repositoryService.getBpmnModel(task.getProcessDefinitionId()); |
|
|
|
// // 获取根节点即流程发起节点 |
|
|
|
// FlowNode rootNode = (FlowNode) bpmnModel.getFlowElement("root"); |
|
|
|
// // TODO 中止流程并使项目进入对应状态,给项目创建人、 |
|
|
|
// // 流程发起人发送浙政钉工作通知:【项目名称】的【流程名称】被驳回,请及时处理。 |
|
|
|
// String startUserId = getRootUserId(rootNode, task.getProcessInstanceId()); |
|
|
|
// // 获取浙政钉用户ID |
|
|
|
// UserInfo auditUserInfo = userInfoService.getById(Long.valueOf(startUserId)); |
|
|
|
// WorkNoticeInfo sendWorkNoticeInfo = getSendWorkNoticeInfo(auditUserInfo); |
|
|
|
// WflowModels wflowModels = getLastWflowModels(task); |
|
|
|
// String formName = wflowModels.getFormName(); |
|
|
|
// String msg = String.format(REJECT_MSG_TEMPLATE, projectName, formName); |
|
|
|
// zwddClient.sendWorkNotice(sendWorkNoticeInfo.getReceiverUserId(),sendWorkNoticeInfo.getBizMsgId(),msg); |
|
|
|
// // 更新项目状态和流程状态 |
|
|
|
// updateRejectProjectStatus(userId, declaredProject); |
|
|
|
// taskService.complete(param.getTaskId(), var); |
|
|
|
//} |
|
|
|
|
|
|
|
/** |
|
|
|
* 当为驳回操作时,更新项目表中的项目状态 |
|
|
@@ -414,152 +376,6 @@ public class TodoCenterManage { |
|
|
|
projectService.updateById(declaredProject); |
|
|
|
} |
|
|
|
|
|
|
|
/** |
|
|
|
* 获取最新版本的流程配置 |
|
|
|
* |
|
|
|
* @param task 当前任务 |
|
|
|
* @return com.wflow.bean.entity.WflowModels |
|
|
|
* @author CMM |
|
|
|
* @since 2023/02/01 17:30 |
|
|
|
*/ |
|
|
|
//private WflowModels getLastWflowModels(Task task) { |
|
|
|
// WflowModels wflowModels = processModelService.getOne( |
|
|
|
// Wrappers.lambdaQuery(WflowModels.class).eq(WflowModels::getProcessDefId, task.getProcessDefinitionId())); |
|
|
|
// if (ObjectUtil.isNull(wflowModels)) { |
|
|
|
// log.warn("流程{}不存在", wflowModels.getFormId()); |
|
|
|
// throw new BusinessException("不存在该表单"); |
|
|
|
// } |
|
|
|
// return wflowModels; |
|
|
|
//} |
|
|
|
|
|
|
|
/** |
|
|
|
* 审批任务:盖章并通过 |
|
|
|
* |
|
|
|
* @param task 当前任务 |
|
|
|
* @param userId |
|
|
|
* @param param 参数 |
|
|
|
*/ |
|
|
|
//private void doSealPass(Task task, Long userId, ReqProcessHandlerDTO param) { |
|
|
|
// String processInstanceId = task.getProcessInstanceId(); |
|
|
|
// // 获取当前申报项目 |
|
|
|
// Project declaredProject = projectService |
|
|
|
// .getOne(Wrappers.lambdaQuery(Project.class).eq(Project::getInstCode, task.getProcessInstanceId())); |
|
|
|
// String projectName = declaredProject.getProjectName(); |
|
|
|
// |
|
|
|
// Map<String, Object> var = new HashMap<>(16); |
|
|
|
// var.put("approve_" + task.getId(), param.getAction()); |
|
|
|
// // 保存审核意见 |
|
|
|
// if (hasComment(param.getAuditInfo())) { |
|
|
|
// // 执行自定义的保存评论的功能 |
|
|
|
// managementService.executeCommand(new SaveCommentCmd(param.getTaskId(), param.getInstanceId(), |
|
|
|
// String.valueOf(userId), JSONObject.toJSONString(param.getAuditInfo()))); |
|
|
|
// } |
|
|
|
// // TODO 判断项目申报单位级别,区县单位申报有上级主管单位意见栏,市级单位没有 |
|
|
|
// |
|
|
|
// // TODO 市级单位:为大数据局;区县单位:为大数据中心(根据附件区分?) |
|
|
|
// taskService.complete(param.getTaskId(), var); |
|
|
|
//} |
|
|
|
|
|
|
|
/** |
|
|
|
* 审批任务:通过 |
|
|
|
* @param task 当前任务 |
|
|
|
* @param userId |
|
|
|
* @param param 参数 |
|
|
|
*/ |
|
|
|
//private void doPass(Task task, Long userId, ReqProcessHandlerDTO param) { |
|
|
|
// String processInstanceId = task.getProcessInstanceId(); |
|
|
|
// // 获取当前申报项目 |
|
|
|
// Project declaredProject = projectService.getOne(Wrappers.lambdaQuery(Project.class) |
|
|
|
// .eq(Project::getInstCode, task.getProcessInstanceId()) |
|
|
|
// .eq(Project::getId,param.getProjectId())); |
|
|
|
// String projectName = declaredProject.getProjectName(); |
|
|
|
// |
|
|
|
// Map<String, Object> var = new HashMap<>(16); |
|
|
|
// var.put("approve_" + task.getId(), param.getAction()); |
|
|
|
// // 保存审核意见 |
|
|
|
// if (hasComment(param.getAuditInfo())) { |
|
|
|
// // 执行自定义的保存评论的功能 |
|
|
|
// managementService.executeCommand(new SaveCommentCmd(param.getTaskId(), param.getInstanceId(), |
|
|
|
// String.valueOf(userId), JSONObject.toJSONString(param.getAuditInfo()))); |
|
|
|
// } |
|
|
|
// // 如果流程状态是被退回状态,流程通过后,进入下一个审核人,当前通过审核人一定不是最后一个审核人(下一个审核人至多是最后一个),更新流程状态为审核中 |
|
|
|
// if (ProcessStatusEnum.BE_BACKED.getCode().equals(declaredProject.getProcessStatus())) { |
|
|
|
// // 通过该任务,流程到下一审核人处 |
|
|
|
// taskService.complete(param.getTaskId(), var); |
|
|
|
// // 更新流程状态为审核中 |
|
|
|
// declaredProject.setProcessStatus(ProcessStatusEnum.UNDER_REVIEW.getCode()); |
|
|
|
// declaredProject.setUpdateOn(LocalDateTime.now()); |
|
|
|
// declaredProject.setUpdateBy(userId); |
|
|
|
// projectService.updateById(declaredProject); |
|
|
|
// // 获取此时待审核任务 |
|
|
|
// Task currentTask = taskService.createTaskQuery().processInstanceId(processInstanceId).singleResult(); |
|
|
|
// // 获取审核人信息,向审核人发送工作通知 |
|
|
|
// String currentUserId = currentTask.getAssignee(); |
|
|
|
// UserInfo auditUserInfo = userInfoService.getById(Long.valueOf(currentUserId)); |
|
|
|
// // 获取发送浙政钉工作通知必要信息 |
|
|
|
// WorkNoticeInfo sendWorkNoticeInfo = getSendWorkNoticeInfo(auditUserInfo); |
|
|
|
// String msg = String.format(PASS_MSG_TEMPLATE, null, projectName); |
|
|
|
// zwddClient.sendWorkNotice(sendWorkNoticeInfo.getReceiverUserId(),sendWorkNoticeInfo.getBizMsgId(),msg); |
|
|
|
// return; |
|
|
|
// } |
|
|
|
// // 获取bpm对象 |
|
|
|
// BpmnModel bpmnModel = repositoryService.getBpmnModel(task.getProcessDefinitionId()); |
|
|
|
// // 若不是被退回项目,传节点定义key 获取当前节点 |
|
|
|
// FlowNode currentNode = (FlowNode) bpmnModel.getFlowElement(task.getTaskDefinitionKey()); |
|
|
|
// // TODO 若当前流程是预审流程,需要在提交预审申报的时候,调用状态机判断申报后的项目状态, |
|
|
|
// // 若是省级部门联审中,要对接外部接口,获取省级部门联审的结果,更新项目状态(预审申报提交的时候处理) |
|
|
|
// // 需要先通过后才能有下一个节点的信息 |
|
|
|
// taskService.complete(param.getTaskId(), var); |
|
|
|
// // 获取当前项目状态 |
|
|
|
// Integer status = declaredProject.getStatus(); |
|
|
|
// // 若当前登录用户是最后一个审批人,需更新流程状态为审核完成,项目状态到下个状态 |
|
|
|
// // 并向流程发起人发送浙政钉工作通知:【项目名称】已通过【流程名称】,请及时开始下一步操作。 |
|
|
|
// HistoricProcessInstance instance = historyService |
|
|
|
// .createHistoricProcessInstanceQuery() |
|
|
|
// .processInstanceId(processInstanceId) |
|
|
|
// .singleResult(); |
|
|
|
// if (HisProInsEndActId.END.equals(instance.getEndActivityId())) { |
|
|
|
// switch (Objects.requireNonNull(ProjectStatusEnum.getValue(status))) { |
|
|
|
// // 当前项目状态是单位内部审核中 |
|
|
|
// case UNDER_INTERNAL_AUDIT: |
|
|
|
// // 当前项目状态是预审中 |
|
|
|
// case PRE_APPLYING: |
|
|
|
// // 当前项目状态是部门联审中 |
|
|
|
// case DEPARTMENT_JOINT_REVIEW: |
|
|
|
// // 当前项目状态是方案评审中 |
|
|
|
// case SCHEME_UNDER_REVIEW: |
|
|
|
// // 当前项目状态是终验审核中 |
|
|
|
// case FINAL_ACCEPTANCE_IS_UNDER_REVIEW: |
|
|
|
// updatePassProjectStatus(userId, declaredProject); |
|
|
|
// break; |
|
|
|
// default: |
|
|
|
// throw new IllegalStateException("Unexpected value: " + status); |
|
|
|
// } |
|
|
|
// } |
|
|
|
// // 若有下一个审核人(当前节点的用户), |
|
|
|
// // 向其发送浙政钉工作通知:标题:审核任务 内容:【单位名称】的【项目名称】需要您审核。 |
|
|
|
// String nextUserId = getNextUserId(currentNode, processInstanceId); |
|
|
|
// if (Objects.nonNull(nextUserId)) { |
|
|
|
// // 获取浙政钉用户ID |
|
|
|
// UserInfo auditUserInfo = userInfoService.getById(Long.valueOf(nextUserId)); |
|
|
|
// WorkNoticeInfo sendWorkNoticeInfo = getSendWorkNoticeInfo(auditUserInfo); |
|
|
|
// String msg = String.format(PASS_MSG_TEMPLATE, sendWorkNoticeInfo.getOrganizationName(), projectName); |
|
|
|
// zwddClient.sendWorkNotice(sendWorkNoticeInfo.getReceiverUserId(),sendWorkNoticeInfo.getBizMsgId(),msg); |
|
|
|
// } else { |
|
|
|
// // 若没有,向发起人发送浙政钉工作通知:【项目名称】已通过【流程名称】,请及时开始下一步操作。 |
|
|
|
// // TODO 向其发送浙政钉工作通知 获取根节点的孩子节点(即发起人节点),向其发送浙政钉工作通知 |
|
|
|
// // 获取根节点即流程发起节点 |
|
|
|
// FlowNode rootNode = (FlowNode) bpmnModel.getFlowElement("root"); |
|
|
|
// String startUserId = getRootUserId(rootNode, task.getProcessInstanceId()); |
|
|
|
// // 获取浙政钉用户ID |
|
|
|
// UserInfo auditUserInfo = userInfoService.getById(Long.valueOf(startUserId)); |
|
|
|
// WorkNoticeInfo sendWorkNoticeInfo = getSendWorkNoticeInfo(auditUserInfo); |
|
|
|
// WflowModels wflowModels = getLastWflowModels(task); |
|
|
|
// String formName = wflowModels.getFormName(); |
|
|
|
// String msg = String.format(PASS_MSG_TEMPLATE2, projectName, formName); |
|
|
|
// zwddClient.sendWorkNotice(sendWorkNoticeInfo.getReceiverUserId(),sendWorkNoticeInfo.getBizMsgId(),msg); |
|
|
|
// } |
|
|
|
//} |
|
|
|
|
|
|
|
/** |
|
|
|
* 获取发送浙政钉工作通知的信息 |
|
|
@@ -629,28 +445,28 @@ public class TodoCenterManage { |
|
|
|
* @author CMM |
|
|
|
* @since 2023/02/02 |
|
|
|
*/ |
|
|
|
//private String getRootUserId(FlowNode rootNode, String processInstanceId) { |
|
|
|
// String rootUserId = null; |
|
|
|
// // 输出连线 |
|
|
|
// List<SequenceFlow> outgoingFlows = rootNode.getOutgoingFlows(); |
|
|
|
// // 遍历返回下一个节点信息 |
|
|
|
// for (SequenceFlow currentOutgoingFlow : outgoingFlows) { |
|
|
|
// // 类型自己判断 |
|
|
|
// FlowElement targetFlowElement = currentOutgoingFlow.getTargetFlowElement(); |
|
|
|
// // TODO 若要会签需判断候选人 |
|
|
|
// // 发起事件 |
|
|
|
// if (targetFlowElement instanceof StartEvent) { |
|
|
|
// String actId = targetFlowElement.getId(); |
|
|
|
// ActivityInstance activityInstance = runtimeService.createActivityInstanceQuery() |
|
|
|
// .processInstanceId(processInstanceId).activityId(actId).singleResult(); |
|
|
|
// String executionId = activityInstance.getExecutionId(); |
|
|
|
// rootUserId = runtimeService.getVariable(executionId, "initiator", String.class); |
|
|
|
// break; |
|
|
|
// } |
|
|
|
// } |
|
|
|
// return rootUserId; |
|
|
|
// |
|
|
|
//} |
|
|
|
private String getRootUserId(FlowNode rootNode, String processInstanceId) { |
|
|
|
String rootUserId = null; |
|
|
|
// 输出连线 |
|
|
|
List<SequenceFlow> outgoingFlows = rootNode.getOutgoingFlows(); |
|
|
|
// 遍历返回下一个节点信息 |
|
|
|
for (SequenceFlow currentOutgoingFlow : outgoingFlows) { |
|
|
|
// 类型自己判断 |
|
|
|
FlowElement targetFlowElement = currentOutgoingFlow.getTargetFlowElement(); |
|
|
|
// TODO 若要会签需判断候选人 |
|
|
|
// 发起事件 |
|
|
|
if (targetFlowElement instanceof StartEvent) { |
|
|
|
String actId = targetFlowElement.getId(); |
|
|
|
ActivityInstance activityInstance = runtimeService.createActivityInstanceQuery() |
|
|
|
.processInstanceId(processInstanceId).activityId(actId).singleResult(); |
|
|
|
String executionId = activityInstance.getExecutionId(); |
|
|
|
rootUserId = runtimeService.getVariable(executionId, "initiator", String.class); |
|
|
|
break; |
|
|
|
} |
|
|
|
} |
|
|
|
return rootUserId; |
|
|
|
|
|
|
|
} |
|
|
|
/** |
|
|
|
* 获取当前节点的下一个节点的审核用户ID |
|
|
|
* |
|
|
@@ -660,164 +476,33 @@ public class TodoCenterManage { |
|
|
|
* @author CMM |
|
|
|
* @since 2023/02/02 |
|
|
|
*/ |
|
|
|
//private String getNextUserId(FlowNode currentNode, String processInstanceId) { |
|
|
|
// String nextUserId = null; |
|
|
|
// // 输出连线 |
|
|
|
// List<SequenceFlow> outgoingFlows = currentNode.getOutgoingFlows(); |
|
|
|
// // 遍历返回下一个节点信息 |
|
|
|
// for (SequenceFlow currentOutgoingFlow : outgoingFlows) { |
|
|
|
// // 类型自己判断 |
|
|
|
// FlowElement targetFlowElement = currentOutgoingFlow.getTargetFlowElement(); |
|
|
|
// // 如果下个审批节点为结束节点,那么跳过该节点 |
|
|
|
// if (targetFlowElement instanceof EndEvent) { |
|
|
|
// continue; |
|
|
|
// } |
|
|
|
// // TODO 若要会签需判断候选人 |
|
|
|
// // 用户任务 |
|
|
|
// if (targetFlowElement instanceof UserTask) { |
|
|
|
// String actId = targetFlowElement.getId(); |
|
|
|
// ActivityInstance activityInstance = runtimeService.createActivityInstanceQuery() |
|
|
|
// .processInstanceId(processInstanceId).activityId(actId).singleResult(); |
|
|
|
// String executionId = activityInstance.getExecutionId(); |
|
|
|
// nextUserId = runtimeService.getVariable(executionId, "assignee", String.class); |
|
|
|
// break; |
|
|
|
// } |
|
|
|
// } |
|
|
|
// return nextUserId; |
|
|
|
//} |
|
|
|
|
|
|
|
/** |
|
|
|
* 判断处理操作是否含有审核意见 |
|
|
|
* |
|
|
|
* @param comment 审核意见 |
|
|
|
* @return boolean |
|
|
|
* @author CMM |
|
|
|
* @since 2023/02/01 |
|
|
|
*/ |
|
|
|
//private boolean hasComment(ProcessComment comment) { |
|
|
|
// return Objects.nonNull(comment) |
|
|
|
// && (StrUtil.isNotBlank(comment.getText()) || isNotEmpty(comment.getAttachments())); |
|
|
|
//} |
|
|
|
private String getNextUserId(FlowNode currentNode, String processInstanceId) { |
|
|
|
String nextUserId = null; |
|
|
|
// 输出连线 |
|
|
|
List<SequenceFlow> outgoingFlows = currentNode.getOutgoingFlows(); |
|
|
|
// 遍历返回下一个节点信息 |
|
|
|
for (SequenceFlow currentOutgoingFlow : outgoingFlows) { |
|
|
|
// 类型自己判断 |
|
|
|
FlowElement targetFlowElement = currentOutgoingFlow.getTargetFlowElement(); |
|
|
|
// 如果下个审批节点为结束节点,那么跳过该节点 |
|
|
|
if (targetFlowElement instanceof EndEvent) { |
|
|
|
continue; |
|
|
|
} |
|
|
|
// TODO 若要会签需判断候选人 |
|
|
|
// 用户任务 |
|
|
|
if (targetFlowElement instanceof UserTask) { |
|
|
|
String actId = targetFlowElement.getId(); |
|
|
|
ActivityInstance activityInstance = runtimeService.createActivityInstanceQuery() |
|
|
|
.processInstanceId(processInstanceId).activityId(actId).singleResult(); |
|
|
|
String executionId = activityInstance.getExecutionId(); |
|
|
|
nextUserId = runtimeService.getVariable(executionId, "assignee", String.class); |
|
|
|
break; |
|
|
|
} |
|
|
|
} |
|
|
|
return nextUserId; |
|
|
|
} |
|
|
|
|
|
|
|
/** |
|
|
|
* 撤销流程处理 |
|
|
|
* |
|
|
|
* @param handledTaskInstance 已处理的历史任务实例 |
|
|
|
* @param userId 当前登录用户ID |
|
|
|
* @param projectId |
|
|
|
*/ |
|
|
|
//private void doWithDrawProcess(HistoricTaskInstance handledTaskInstance, Long userId, Long projectId) { |
|
|
|
// String processInstanceId = handledTaskInstance.getProcessInstanceId(); |
|
|
|
// // 获取当前流程实例待审核任务信息 |
|
|
|
// Task task = taskService.createTaskQuery().processInstanceId(processInstanceId).singleResult(); |
|
|
|
// // 获取当前流程实例信息 |
|
|
|
// HistoricProcessInstance historicProcessInstance = historyService |
|
|
|
// .createHistoricProcessInstanceQuery() |
|
|
|
// .processInstanceId(processInstanceId) |
|
|
|
// .singleResult(); |
|
|
|
// // 流程发起人ID |
|
|
|
// String startUserId = historicProcessInstance.getStartUserId(); |
|
|
|
// // 获取当前申报项目 |
|
|
|
// Project declaredProject = projectService.getOne(Wrappers.lambdaQuery(Project.class) |
|
|
|
// .eq(Project::getInstCode, processInstanceId) |
|
|
|
// .eq(Project::getId,projectId)); |
|
|
|
// String projectName = declaredProject.getProjectName(); |
|
|
|
// |
|
|
|
// // 获取bpm对象 |
|
|
|
// BpmnModel bpmnModel = repositoryService.getBpmnModel(handledTaskInstance.getProcessDefinitionId()); |
|
|
|
// // 传节点定义key 获取传入节点(撤回操作人在流程配置中所在的节点) |
|
|
|
// FlowNode handledNode = (FlowNode) bpmnModel.getFlowElement(handledTaskInstance.getTaskDefinitionKey()); |
|
|
|
// |
|
|
|
// // 获取当前流程状态 |
|
|
|
// Integer status = declaredProject.getStatus(); |
|
|
|
// |
|
|
|
// // 判断当前登录用户是否是流程发起人 |
|
|
|
// if (startUserId.equals(String.valueOf(userId))) { |
|
|
|
// // TODO 若是流程发起人点击撤回,项目回到上一个状态,并删除当前审核人对应的待办记录 |
|
|
|
// // 若是流程发起人点击撤回,项目回到上一个状态,需调用状态机更新项目状态,流程状态更新为审核通过 |
|
|
|
// switch (Objects.requireNonNull(ProjectStatusEnum.getValue(status))) { |
|
|
|
// // 当前项目状态是单位内部审核中 |
|
|
|
// case UNDER_INTERNAL_AUDIT: |
|
|
|
// // 当前项目状态是预审中 |
|
|
|
// case PRE_APPLYING: |
|
|
|
// // 当前项目状态是部门联审中 |
|
|
|
// case DEPARTMENT_JOINT_REVIEW: |
|
|
|
// // 当前项目状态是方案评审中 |
|
|
|
// case SCHEME_UNDER_REVIEW: |
|
|
|
// // 当前项目状态是终验审核中 |
|
|
|
// case FINAL_ACCEPTANCE_IS_UNDER_REVIEW: |
|
|
|
// updateWithdrawProjectStatus(userId, declaredProject); |
|
|
|
// break; |
|
|
|
// default: |
|
|
|
// throw new IllegalStateException("Unexpected value: " + status); |
|
|
|
// } |
|
|
|
// List<Execution> executions = runtimeService.createExecutionQuery() |
|
|
|
// .processInstanceId(handledTaskInstance.getProcessInstanceId()).onlyChildExecutions().list(); |
|
|
|
// // 强制流程指向撤回 |
|
|
|
// runtimeService.createChangeActivityStateBuilder() |
|
|
|
// .processInstanceId(task.getProcessInstanceId()) |
|
|
|
// .moveActivityIdTo(task.getTaskDefinitionKey(), HisProInsEndActId.WITHDRAW) |
|
|
|
// .moveExecutionsToSingleActivityId(executions.stream() |
|
|
|
// .map(Execution::getId) |
|
|
|
// .collect(Collectors.toList()), HisProInsEndActId.WITHDRAW) |
|
|
|
// .changeState(); |
|
|
|
// } else { |
|
|
|
// // 获取当前流程待审核节点 |
|
|
|
// FlowNode currentNode = (FlowNode) bpmnModel.getFlowElement(task.getTaskDefinitionKey()); |
|
|
|
// SequenceFlow sequenceFlow = currentNode.getIncomingFlows().get(0); |
|
|
|
// // 获取上一个节点的activityId |
|
|
|
// String sourceRef = sequenceFlow.getSourceRef(); |
|
|
|
// |
|
|
|
// HistoricActivityInstance lastInstance = historyService.createHistoricActivityInstanceQuery() |
|
|
|
// .processInstanceId(task.getProcessInstanceId()) |
|
|
|
// .activityId(sourceRef) |
|
|
|
// .activityType("userTask") |
|
|
|
// .finished() |
|
|
|
// .singleResult(); |
|
|
|
// // 获取前一个审核节点审核人信息 |
|
|
|
// String beforeUserId = lastInstance.getAssignee(); |
|
|
|
// // 获取当前审核节点审核人信息 |
|
|
|
// String currentUserId = task.getAssignee(); |
|
|
|
// //HashSet<String> userSet = new HashSet<>(); |
|
|
|
// //userSet.add(beforeUserId); |
|
|
|
// //userSet.add(currentUserId); |
|
|
|
// //Map<Long, UserInfoVO> userMap = userInfoService.getUserMapByIds(userSet); |
|
|
|
// //UserInfoVO beforeUserInfoVO = userMap.get(Long.valueOf(beforeUserId)); |
|
|
|
// //UserInfoVO currentUserInfoVO = userMap.get(Long.valueOf(currentUserId)); |
|
|
|
// //String beforeUserOrgCode = beforeUserInfoVO.getOrganizationCode(); |
|
|
|
// //String currentUserOrgCode = currentUserInfoVO.getOrganizationCode(); |
|
|
|
// //Boolean orgFlag = currentUserOrgCode.equals(beforeUserOrgCode) ? true : false; |
|
|
|
// |
|
|
|
// // TODO 判断前一个审核人的部门和当前登录用户的部门是否是同一个,如果是同一个才可以撤回,否则抛出异常 |
|
|
|
// Boolean orgFlag = true; |
|
|
|
// if (orgFlag) { |
|
|
|
// // 注意:是前一个审核人,说明此时仍在一个审核流程中,项目状态不需要改变,流程状态也不要改变,仍为审核中 |
|
|
|
// // 在审核记录中移除前一个审核人提交过的审核意见 |
|
|
|
// Comment comment = taskService.getProcessInstanceComments(processInstanceId).stream() |
|
|
|
// .filter(c -> c.getTaskId().equals(handledTaskInstance.getId())) |
|
|
|
// .findFirst() |
|
|
|
// .get(); |
|
|
|
// taskService.deleteComment(comment.getId()); |
|
|
|
// // 我已处理中去掉自己之前处理的记录 |
|
|
|
// String taskInstanceId = handledTaskInstance.getId(); |
|
|
|
// historyService.deleteHistoricTaskInstance(taskInstanceId); |
|
|
|
// |
|
|
|
// List<Execution> executions = runtimeService.createExecutionQuery() |
|
|
|
// .processInstanceId(handledTaskInstance.getProcessInstanceId()).onlyChildExecutions().list(); |
|
|
|
// // 强制流程指向前一个审核人节点 |
|
|
|
// runtimeService.createChangeActivityStateBuilder() |
|
|
|
// .processInstanceId(task.getProcessInstanceId()) |
|
|
|
// .moveActivityIdsToSingleActivityId(executions.stream() |
|
|
|
// .map(Execution::getActivityId) |
|
|
|
// .collect(Collectors.toList()), handledNode.getId()) |
|
|
|
// .changeState(); |
|
|
|
// } else { |
|
|
|
// throw new BizException("下一个审核人和您不是同一个部门,无法撤回!"); |
|
|
|
// } |
|
|
|
// |
|
|
|
// } |
|
|
|
//} |
|
|
|
/** |
|
|
|
* 当为撤回操作时,更新项目表中的项目状态为前一个状态 |
|
|
|
* |
|
|
|
* @param userId |
|
|
@@ -846,55 +531,6 @@ public class TodoCenterManage { |
|
|
|
} |
|
|
|
|
|
|
|
/** |
|
|
|
* 退回流程处理 |
|
|
|
* |
|
|
|
* @param task 当前任务 |
|
|
|
* @param userId 当前登录用户ID |
|
|
|
* @param param 参数 |
|
|
|
*/ |
|
|
|
//private void doBackTask(Task task, Long userId, ReqProcessHandlerDTO param) { |
|
|
|
// // 获取当前申报项目 |
|
|
|
// Project declaredProject = projectService.getOne(Wrappers.lambdaQuery(Project.class) |
|
|
|
// .eq(Project::getInstCode, task.getProcessInstanceId()) |
|
|
|
// .eq(Project::getId,param.getProjectId())); |
|
|
|
// String projectName = declaredProject.getProjectName(); |
|
|
|
// // 保存审核意见 |
|
|
|
// if (hasComment(param.getAuditInfo())) { |
|
|
|
// // 执行自定义的保存评论的功能 |
|
|
|
// managementService.executeCommand(new SaveCommentCmd(param.getTaskId(), param.getInstanceId(), |
|
|
|
// String.valueOf(userId), JSONObject.toJSONString(param.getAuditInfo()))); |
|
|
|
// } |
|
|
|
// // 获取bpm对象 |
|
|
|
// BpmnModel bpmnModel = repositoryService.getBpmnModel(task.getProcessDefinitionId()); |
|
|
|
// // 传节点定义key 获取根节点即流程发起节点 |
|
|
|
// FlowNode rootNode = (FlowNode) bpmnModel.getFlowElement("root"); |
|
|
|
// |
|
|
|
// // 流程变成【被退回】状态,待我处理中,为流程发起人增加一条待办记录, |
|
|
|
// // 执行自定义回退逻辑,回退到流程发起人 |
|
|
|
// // 注意:因为审核人有执行退回的权限,且是退回到流程发起人,说明是在同一个流程实例中,所以项目状态不需要更新 |
|
|
|
// managementService.executeCommand(new BackToHisApprovalNodeCmd(runtimeService, bpmnModel, param.getTaskId(), rootNode.getId())); |
|
|
|
// runtimeService.setVariables(param.getInstanceId(), |
|
|
|
// Maps.newHashMap("approve_" + param.getTaskId(), param.getAction())); |
|
|
|
// log.info("用户[{}] 退回流程[{}] [{} -> {}]", userId, param.getInstanceId(), |
|
|
|
// task.getTaskDefinitionKey(), |
|
|
|
// param.getTargetNode()); |
|
|
|
// // 更新申报项目表中的流程状态为被退回 |
|
|
|
// declaredProject.setProcessStatus(ProcessStatusEnum.BE_BACKED.getCode()); |
|
|
|
// declaredProject.setUpdateOn(LocalDateTime.now()); |
|
|
|
// declaredProject.setUpdateBy(userId); |
|
|
|
// projectService.updateById(declaredProject); |
|
|
|
// // TODO 给项目创建人、流程发起人发送浙政钉工作通知:【项目名称】的【流程名称】被退回,请及时处理。 |
|
|
|
// String startUserId = getRootUserId(rootNode, task.getProcessInstanceId()); |
|
|
|
// UserInfo auditUserInfo = userInfoService.getById(Long.valueOf(startUserId)); |
|
|
|
// WorkNoticeInfo sendWorkNoticeInfo = getSendWorkNoticeInfo(auditUserInfo); |
|
|
|
// WflowModels wflowModels = getLastWflowModels(task); |
|
|
|
// String formName = wflowModels.getFormName(); |
|
|
|
// String msg = String.format(BACK_MSG_TEMPLATE, projectName, formName); |
|
|
|
// zwddClient.sendWorkNotice(sendWorkNoticeInfo.getReceiverUserId(),sendWorkNoticeInfo.getBizMsgId(),msg); |
|
|
|
// |
|
|
|
//} |
|
|
|
|
|
|
|
/** |
|
|
|
* 查询流程表单数据及审批的进度步骤 |
|
|
|
* @param instanceId 流程实例ID |
|
|
|
* @return 流程进度及表单详情 |
|
|
|