dzx 1 рік тому
батько
коміт
5d9b3638f9

+ 6 - 0
src/main/java/com/xjrsoft/module/workflow/controller/WorkflowExecuteController.java

@@ -234,6 +234,12 @@ public class WorkflowExecuteController {
         return R.ok(workflowExecuteService.withdraw(dto));
     }
 
+    @PostMapping("/my-task/new-withdraw")
+    @ApiOperation(value = "我的流程 撤回(回到草稿箱)")
+    public R newWithdraw(@Valid @RequestBody WithdrawDto dto) {
+        return R.ok(workflowExecuteService.newWithdraw(dto));
+    }
+
 
     @PostMapping("/draft")
     @ApiOperation(value = "保存草稿")

+ 8 - 0
src/main/java/com/xjrsoft/module/workflow/service/IWorkflowExecuteService.java

@@ -279,6 +279,14 @@ public interface IWorkflowExecuteService {
      */
     boolean withdraw(WithdrawDto dto);
 
+    /**
+     * 撤回(回到草稿箱中)
+     *
+     * @param dto
+     * @return
+     */
+    boolean newWithdraw(WithdrawDto dto);
+
 
 
     /**

+ 108 - 0
src/main/java/com/xjrsoft/module/workflow/service/impl/WorkflowExecuteServiceImpl.java

@@ -3708,6 +3708,114 @@ public class WorkflowExecuteServiceImpl implements IWorkflowExecuteService {
         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
     public boolean saveDraft(SaveDraftDto dto) {