|
@@ -3708,6 +3708,114 @@ public class WorkflowExecuteServiceImpl implements IWorkflowExecuteService {
|
|
|
return true;
|
|
return true;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+ @Override
|
|
|
|
|
+ public boolean newWithdraw(WithdrawDto dto) {
|
|
|
|
|
+
|
|
|
|
|
+ HistoricProcessInstance historicProcessInstance = historyService.createHistoricProcessInstanceQuery().processInstanceId(dto.getProcessId()).singleResult();
|
|
|
|
|
+
|
|
|
|
|
+ User user = StpUtil.getTokenSession().get(GlobalConstant.LOGIN_USER_INFO_KEY, new User());
|
|
|
|
|
+
|
|
|
|
|
+ if (historicProcessInstance.getEndTime() != null) {
|
|
|
|
|
+ throw new MyException("流程已经结束 无法撤回!");
|
|
|
|
|
+ }
|
|
|
|
|
+ //如果是简单流程 无多实例 无网关等组件 默认可以根据审批时间
|
|
|
|
|
+
|
|
|
|
|
+ //获取到当前活动的实例
|
|
|
|
|
+// ActivityInstance activityInstance = runtimeService.getActivityInstance(dto.getProcessId());
|
|
|
|
|
+
|
|
|
|
|
+ //获取当前活动的任务信息
|
|
|
|
|
+ List<WorkflowExtra> workflowExtras = workflowExtraMapper.selectList(Wrappers.lambdaQuery(WorkflowExtra.class).in(WorkflowExtra::getProcessId, dto.getProcessId()));
|
|
|
|
|
+ //找到当前流程的 任务开始时间 最大值 为当前审批节点
|
|
|
|
|
+ WorkflowExtra workflowExtra = workflowExtras.stream()
|
|
|
|
|
+ .filter(e -> e.getProcessId().equals(dto.getProcessId()))
|
|
|
|
|
+ .max(Comparator.comparing(WorkflowExtra::getStartTime)).orElse(new WorkflowExtra());
|
|
|
|
|
+ //新增流程发起流程记录
|
|
|
|
|
+ WorkflowRecord record = new WorkflowRecord();
|
|
|
|
|
+ record.setNodeId(workflowExtra.getTaskId());
|
|
|
|
|
+ record.setNodeName(workflowExtra.getTaskName());
|
|
|
|
|
+ record.setNodeType(workflowExtra.getTaskName());
|
|
|
|
|
+ record.setProcessId(dto.getProcessId());
|
|
|
|
|
+ record.setSchemaId(workflowExtra.getSchemaId());
|
|
|
|
|
+ record.setNodeMultiType(WorkflowMultiInstanceType.NONE.getCode());
|
|
|
|
|
+ record.setRecordTime(LocalDateTime.now());
|
|
|
|
|
+ String oldTaskName = workflowExtra.getTaskName();
|
|
|
|
|
+ //如果传入的是开始节点的值 默认是关闭流程 重新发起
|
|
|
|
|
+ if (StrUtil.equals(dto.getActivityId(), historicProcessInstance.getStartActivityId())) {
|
|
|
|
|
+
|
|
|
|
|
+ runtimeService.deleteProcessInstance(historicProcessInstance.getId(), "【发起人:" + user.getName() + "】 将 【流程:" + historicProcessInstance.getProcessDefinitionName() + "】 撤回 到 开始节点!");
|
|
|
|
|
+// //先停止当前活动示例 然后 将流程撤回到开始节点
|
|
|
|
|
+// runtimeService.createProcessInstanceModification(dto.getProcessId())
|
|
|
|
|
+// .cancelActivityInstance(activityInstance.getId())
|
|
|
|
|
+// .setAnnotation("【发起人:" + user.getName() + "】 将 【流程:" + historicProcessInstance.getProcessDefinitionName() + "】 撤回 到 开始节点!")
|
|
|
|
|
+// .startBeforeActivity(historicProcessInstance.getStartActivityId())
|
|
|
|
|
+// .setVariableLocal(WorkflowConstant.TASK_IS_APPOINT_APPROVE,YesOrNoEnum.NO.getCode())
|
|
|
|
|
+// .execute();
|
|
|
|
|
+ record.setMessage("【" + user.getName() + "】 将当前流程从【" + oldTaskName + "】 撤回 到 【开始节点】!");
|
|
|
|
|
+ } else {
|
|
|
|
|
+ runtimeService.deleteProcessInstance(historicProcessInstance.getId(), "【发起人:" + user.getName() + "】 将 【流程:" + historicProcessInstance.getProcessDefinitionName() + "】 撤回 到 开始节点!");
|
|
|
|
|
+ //先停止当前活动示例 然后 将流程撤回到某个节点
|
|
|
|
|
+// runtimeService.createProcessInstanceModification(historicProcessInstance.getId())
|
|
|
|
|
+// .cancelActivityInstance(activityInstance.getId())
|
|
|
|
|
+// .setAnnotation("【发起人:" + user.getName() + "】 将 【流程:" + historicProcessInstance.getProcessDefinitionName() + "】 撤回 到 【任务:" + activityInstance.getActivityName() + "】!")
|
|
|
|
|
+// .startBeforeActivity(dto.getActivityId())
|
|
|
|
|
+// .setVariableLocal(WorkflowConstant.TASK_IS_APPOINT_APPROVE, YesOrNoEnum.NO.getCode())
|
|
|
|
|
+// .execute();
|
|
|
|
|
+
|
|
|
|
|
+ //获取当前活动的任务信息
|
|
|
|
|
+ List<WorkflowExtra> workflowExtrasNew = workflowExtraMapper.selectList(Wrappers.lambdaQuery(WorkflowExtra.class).in(WorkflowExtra::getProcessId, dto.getProcessId()));
|
|
|
|
|
+ //找到当前流程的 任务开始时间 最大值 为当前审批节点
|
|
|
|
|
+ WorkflowExtra workflowExtraNew = workflowExtrasNew.stream()
|
|
|
|
|
+ .filter(e -> e.getProcessId().equals(dto.getProcessId()))
|
|
|
|
|
+ .max(Comparator.comparing(WorkflowExtra::getStartTime)).orElse(new WorkflowExtra());
|
|
|
|
|
+ record.setMessage("【" + user.getName() + "】 将当前流程从【" + oldTaskName + "】撤回 到【" + workflowExtraNew.getTaskName() + "】!");
|
|
|
|
|
+ }
|
|
|
|
|
+ //保存流程撤回信息
|
|
|
|
|
+ workflowRecordMapper.insert(record);
|
|
|
|
|
+
|
|
|
|
|
+ HistoricVariableInstance historicVariableInstance = historyService.createHistoricVariableInstanceQuery().processInstanceId(dto.getProcessId()).variableName(WorkflowConstant.PROCESS_SCHEMA_ID_KEY).singleResult();
|
|
|
|
|
+ //排除xml 查出数据
|
|
|
|
|
+ WorkflowSchema workflowSchema = workflowSchemaMapper.selectOne(Wrappers.lambdaQuery(WorkflowSchema.class).eq(WorkflowSchema::getId, historicVariableInstance.getValue()));
|
|
|
|
|
+
|
|
|
|
|
+ //获取到整个流程模板的配置
|
|
|
|
|
+ WorkflowSchemaConfig workflowSchemaConfig = JSONUtil.toBean(workflowSchema.getJsonContent(), WorkflowSchemaConfig.class);
|
|
|
|
|
+ List<Object> allFormConfigs = workflowSchemaConfig.getChildNodeConfig().stream().filter(x -> x.containsKey("formConfigs")).map(x -> x.get("formConfigs")).collect(Collectors.toList());
|
|
|
|
|
+ List<FormConfig> formConfigs = new ArrayList<>();
|
|
|
|
|
+
|
|
|
|
|
+ for (Object allFormConfig : allFormConfigs) {
|
|
|
|
|
+ List<FormConfig> thisNodeFormConfigs = Convert.toList(FormConfig.class, allFormConfig);
|
|
|
|
|
+ for (FormConfig thisNodeFormConfig : thisNodeFormConfigs) {
|
|
|
|
|
+ if (formConfigs.stream().noneMatch(x -> x.getKey().equals(thisNodeFormConfig.getKey()))) {
|
|
|
|
|
+ formConfigs.add(thisNodeFormConfig);
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ String[] allFormKey = formConfigs.stream().map(FormConfig::getKey).toArray(String[]::new);
|
|
|
|
|
+ List<HistoricVariableInstance> list = historyService.createHistoricVariableInstanceQuery().processInstanceId(dto.getProcessId()).variableNameIn(allFormKey).list();
|
|
|
|
|
+ for (FormConfig formConfig : formConfigs) {
|
|
|
|
|
+
|
|
|
|
|
+ RelationFormInfoVo formInfoVo = new RelationFormInfoVo();
|
|
|
|
|
+ formInfoVo.setFormType(formConfig.getFormType());
|
|
|
|
|
+ formInfoVo.setFormConfig(formConfig);
|
|
|
|
|
+
|
|
|
|
|
+ if (formConfig.getFormType() == FormTemplateType.CUSTOM.getCode() || formConfig.getFormType() == FormTemplateType.SYSTEM.getCode()) {
|
|
|
|
|
+ Optional<HistoricVariableInstance> thisFormData = list.stream().filter(x -> x.getName().equals(formConfig.getKey())).findFirst();
|
|
|
|
|
+
|
|
|
|
|
+ thisFormData.ifPresent(data -> {
|
|
|
|
|
+ Map<String, Object> formData = Convert.toMap(String.class, Object.class, data.getValue());
|
|
|
|
|
+ WorkflowDraft draft = new WorkflowDraft();
|
|
|
|
|
+ draft.setSchemaId(workflowSchema.getId());
|
|
|
|
|
+ draft.setDataId(formData.get("id").toString());
|
|
|
|
|
+ draft.setFormData(JSONUtil.toJsonStr(formData));
|
|
|
|
|
+ draft.setTaskId(workflowExtra.getTaskId());
|
|
|
|
|
+ workflowDraftService.save(draft);
|
|
|
|
|
+ });
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ return true;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
@Override
|
|
@Override
|
|
|
public boolean saveDraft(SaveDraftDto dto) {
|
|
public boolean saveDraft(SaveDraftDto dto) {
|
|
|
|
|
|