xiangpei
2024-12-06 62036cc09bbe5346868b98fcc373910b55da08b9
bug修改
5个文件已修改
205 ■■■■ 已修改文件
business/src/main/java/com/ycl/service/impl/ProjectProcessServiceImpl.java 29 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
flowable/src/main/java/com/ycl/controller/FlowTaskController.java 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
flowable/src/main/java/com/ycl/service/IFlowTaskService.java 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
flowable/src/main/java/com/ycl/service/common/TaskCommonService.java 72 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
flowable/src/main/java/com/ycl/service/impl/FlowTaskServiceImpl.java 89 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
business/src/main/java/com/ycl/service/impl/ProjectProcessServiceImpl.java
@@ -203,7 +203,7 @@
        taskStatistics.setTodoTaskNum(this.getTodoTaskNum(projectProcess.getProcessInsId()));
        taskStatistics.setRemainingTaskNum(this.getRemainingTaskNum(processDefId, projectProcess.getProcessInsId()));
//        taskStatistics.setCurrentTask(this.getCurrentNodeTaskList(projectProcess.getProcessInstanceId()));
        taskStatistics.setRemainingTaskNum(this.getNotFinishedTaskNum(projectProcess.getProcessInsId()));
        taskStatistics.setRemainingTaskNum(this.getRemainingTaskNum(projectProcess.getProcessDefId(), projectProcess.getProcessInsId()));
        detail.setStatistics(taskStatistics);
        Result result = Result.ok();
@@ -719,6 +719,7 @@
                if (StringUtils.isNotBlank(identityLink.getUserId())) {
                    SysUser sysUser = sysUserService.selectUserById(Long.parseLong(identityLink.getUserId()));
                    if (Objects.nonNull(sysUser)) {
                        taskVO.setHandlerType(HandlerTypeEnum.USER);
                        taskVO.setHandlerId(sysUser.getUserId());
                        if (Objects.nonNull(sysUser.getDept())) {
                            taskVO.setHandlerUnitId(sysUser.getDept().getDeptId());
@@ -729,6 +730,7 @@
                    // 绑定的是角色或者是部门,需要根据id判断
                } else if (StringUtils.isNotBlank(identityLink.getGroupId())) {
                    if (identityLink.getGroupId().startsWith("dept")) {   // 部门的id是加了前缀的如:dept:1
                        taskVO.setHandlerType(HandlerTypeEnum.DEPT);
                        String[] split = identityLink.getGroupId().split(":");
                        if (split.length > 1) {
                            // 部门
@@ -741,6 +743,7 @@
                            }
                        }
                    } else {
                        taskVO.setHandlerType(HandlerTypeEnum.ROLE);
                        SysRole role = sysRoleService.selectRoleById(Long.parseLong(identityLink.getGroupId()));
                        if (Objects.nonNull(role)) {
                            taskVO.setHandlerUnitId(Long.parseLong(identityLink.getGroupId()));
@@ -755,6 +758,7 @@
            for (IdentityLinkInfo identityLink : identityLinkInfos) {
                // 绑定的是用户,查出用户姓名、部门
                if (StringUtils.isNotBlank(identityLink.getUserId())) {
                    taskVO.setHandlerType(HandlerTypeEnum.USER);
                    SysUser sysUser = sysUserService.selectUserById(Long.parseLong(identityLink.getUserId()));
                    if (Objects.nonNull(sysUser)) {
//                        taskVO.setHandlerId(sysUser.getUserId());
@@ -767,6 +771,7 @@
                    // 绑定的是角色,查出角色名称
                } else if (StringUtils.isNotBlank(identityLink.getGroupId())) {
                    if (identityLink.getGroupId().startsWith("dept")) {
                        taskVO.setHandlerType(HandlerTypeEnum.DEPT);
                        String[] split = identityLink.getGroupId().split(":");
                        if (split.length > 1) {
                            // 部门
@@ -776,13 +781,15 @@
                                taskVO.setHandlerUnitName(dept.getDeptName());
                            }
                        }
                    }
                    SysRole role = sysRoleService.selectRoleById(Long.parseLong(identityLink.getGroupId()));
                    if (Objects.nonNull(role)) {
                        taskVO.setHandlerUnitId(Long.parseLong(identityLink.getGroupId()));
                        taskVO.setHandlerUnitName("由拥有角色:【" + role.getRoleName() + "】的人处理");
                    } else {
                        taskVO.setHandlerType(HandlerTypeEnum.ROLE);
                        SysRole role = sysRoleService.selectRoleById(Long.parseLong(identityLink.getGroupId()));
                        if (Objects.nonNull(role)) {
                            taskVO.setHandlerUnitId(Long.parseLong(identityLink.getGroupId()));
                            taskVO.setHandlerUnitName("由拥有角色:【" + role.getRoleName() + "】的人处理");
//                        taskVO.setHandlerName(role.getRoleName());
//                        taskVO.setHandlerId(null);
                        }
                    }
                }
            }
@@ -833,16 +840,6 @@
     */
    private Long getTotalTaskNum(String processDefinitionId) {
        return Long.valueOf(this.getAllUserTaskElement(processDefinitionId).size());
    }
    /**
     * 获取流程剩余未完成的任务数
     *
     * @param processInstanceId
     * @return
     */
    private Long getNotFinishedTaskNum(String processInstanceId) {
        return historyService.createHistoricTaskInstanceQuery().processInstanceId(processInstanceId).processUnfinished().count();
    }
    /**
flowable/src/main/java/com/ycl/controller/FlowTaskController.java
@@ -7,6 +7,7 @@
import com.ycl.domain.dto.FlowTaskDto;
import com.ycl.domain.vo.FlowQueryVo;
import com.ycl.domain.vo.FlowTaskVo;
import com.ycl.domain.vo.FormDetailVO;
import com.ycl.service.IFlowTaskService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
@@ -97,6 +98,12 @@
        return flowTaskService.processVariables(taskId);
    }
    @ApiOperation(value = "查看任务", response = FormDetailVO.class)
    @GetMapping(value = "/detail/{taskId}")
    public AjaxResult detail(@ApiParam(value = "流程任务Id") @PathVariable(value = "taskId") String taskId) {
        return flowTaskService.detail(taskId);
    }
    @ApiOperation(value = "完成提交表单任务/普通提交")
    @Log(title = "完成提交表单任务/普通提交", businessType = BusinessType.INSERT)
flowable/src/main/java/com/ycl/service/IFlowTaskService.java
@@ -223,4 +223,12 @@
     * @return
     */
    AjaxResult completeSubmitForm(String taskId, Map<String, Object> variables);
    /**
     * 查看任务
     *
     * @param taskId
     * @return
     */
    AjaxResult detail(String taskId);
}
flowable/src/main/java/com/ycl/service/common/TaskCommonService.java
@@ -36,7 +36,7 @@
     * @param currentNodeDefId
     * @return
     */
    public List<FormDetailVO> getBeforeNodeDefId(String processDefId, String currentNodeDefId, ISysFormService sysFormService) {
    public List<FormDetailVO> getBeforeNodeDefId(String processDefId, String currentNodeDefId, ISysFormService sysFormService, Boolean needInitCurrentForm) {
        // 获取流程定义
        ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery()
                .processDefinitionId(processDefId)
@@ -75,14 +75,17 @@
            formDetailVO.setBeforeNodeName(currentElement.getName());
            formDetailVO.setCurrent(Boolean.TRUE);
            SysForm sysForm = sysFormService.selectSysFormById(Long.parseLong(currentElement.getFormKey()));
            if (Objects.isNull(sysForm)) {
                throw new RuntimeException("该流程绑定的表单不存在或已被删除");
            }
            Map<String, Object> data = new HashMap<>(1);
            data.put(ProcessConstants.TASK_FORM_KEY, JSONObject.parseObject(sysForm.getFormContent()));
            if (needInitCurrentForm) {
                SysForm sysForm = sysFormService.selectSysFormById(Long.parseLong(currentElement.getFormKey()));
                if (Objects.isNull(sysForm)) {
                    throw new RuntimeException("该流程绑定的表单不存在或已被删除");
                }
                Map<String, Object> data = new HashMap<>(1);
                data.put(ProcessConstants.TASK_FORM_KEY, JSONObject.parseObject(sysForm.getFormContent()));
            formDetailVO.setFormJsonObj(data);
                formDetailVO.setFormJsonObj(data);
            }
            defKeys.add(formDetailVO);
        }
        this.before(currentElement, defKeys);
@@ -96,22 +99,51 @@
     * @param currentElement
     * @param defKeys
     */
    private void before(UserTask currentElement, List<FormDetailVO> defKeys) {
        if (! CollectionUtils.isEmpty(currentElement.getIncomingFlows())) {
            for (SequenceFlow incomingFlow : currentElement.getIncomingFlows()) {
                if (! (incomingFlow.getSourceFlowElement() instanceof UserTask)) {
                    // 不包含开始节点
                    if (! (incomingFlow.getSourceFlowElement() instanceof StartEvent)) {
                        before((UserTask) (incomingFlow.getSourceFlowElement()), defKeys);
    private void before(FlowElement currentElement, List<FormDetailVO> defKeys) {
        if (currentElement instanceof UserTask) {
            UserTask userTask = (UserTask) currentElement;
            if (! CollectionUtils.isEmpty(userTask.getIncomingFlows())) {
                for (SequenceFlow incomingFlow : userTask.getIncomingFlows()) {
                    if (incomingFlow.getSourceFlowElement() instanceof UserTask) {
                        FormDetailVO formDetailVO = new FormDetailVO();
                        formDetailVO.setBeforeNodeDefId(incomingFlow.getSourceFlowElement().getId());
                        formDetailVO.setBeforeNodeName(incomingFlow.getSourceFlowElement().getName());
                        defKeys.add(formDetailVO);
                    } else {
                        before(incomingFlow.getSourceFlowElement(), defKeys);
                    }
                } else {
                    FormDetailVO formDetailVO = new FormDetailVO();
                    formDetailVO.setBeforeNodeDefId(incomingFlow.getSourceFlowElement().getId());
                    formDetailVO.setBeforeNodeName(incomingFlow.getSourceFlowElement().getName());
                    defKeys.add(formDetailVO);
                }
            }
        } else if (currentElement instanceof Gateway ){
            Gateway gateway = (Gateway) currentElement;
            if (! CollectionUtils.isEmpty(gateway.getIncomingFlows())) {
                for (SequenceFlow incomingFlow : gateway.getIncomingFlows()) {
                    if (incomingFlow.getSourceFlowElement() instanceof UserTask) {
                        FormDetailVO formDetailVO = new FormDetailVO();
                        formDetailVO.setBeforeNodeDefId(incomingFlow.getSourceFlowElement().getId());
                        formDetailVO.setBeforeNodeName(incomingFlow.getSourceFlowElement().getName());
                        defKeys.add(formDetailVO);
                    } else {
                        before(incomingFlow.getSourceFlowElement(), defKeys);
                    }
                }
            }
        }
//        if (! CollectionUtils.isEmpty(currentElement.getIncomingFlows())) {
//            for (SequenceFlow incomingFlow : currentElement.getIncomingFlows()) {
//                if (! (incomingFlow.getSourceFlowElement() instanceof UserTask)) {
//                    // 不包含开始节点、并行网关、互斥网关,// TODO 还需要排除其它特殊类型
//                    if (! (incomingFlow.getSourceFlowElement() instanceof StartEvent) && ! (incomingFlow.getSourceFlowElement() instanceof ParallelGateway) && ! (incomingFlow.getSourceFlowElement() instanceof ExclusiveGateway)) {
//                        before((UserTask) (incomingFlow.getSourceFlowElement()), defKeys);
//                    }
//                } else {
//                    FormDetailVO formDetailVO = new FormDetailVO();
//                    formDetailVO.setBeforeNodeDefId(incomingFlow.getSourceFlowElement().getId());
//                    formDetailVO.setBeforeNodeName(incomingFlow.getSourceFlowElement().getName());
//                    defKeys.add(formDetailVO);
//                }
//            }
//        }
    }
}
flowable/src/main/java/com/ycl/service/impl/FlowTaskServiceImpl.java
@@ -7,6 +7,7 @@
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ycl.common.constant.ProcessConstants;
import com.ycl.common.core.domain.AjaxResult;
import com.ycl.common.core.domain.entity.SysDept;
import com.ycl.common.core.domain.entity.SysRole;
import com.ycl.common.core.domain.entity.SysUser;
import com.ycl.common.enums.FlowComment;
@@ -28,6 +29,7 @@
import com.ycl.service.ISysDeployFormService;
import com.ycl.service.ISysFormService;
import com.ycl.service.common.TaskCommonService;
import com.ycl.system.service.ISysDeptService;
import com.ycl.system.service.ISysRoleService;
import com.ycl.system.service.ISysUserService;
import lombok.RequiredArgsConstructor;
@@ -80,6 +82,7 @@
    private final ISysUserService sysUserService;
    private final ISysRoleService sysRoleService;
    private final ISysDeptService sysDeptService;
    private final ISysDeployFormService sysInstanceFormService;
    private final ISysFormService sysFormService;
    private final TaskCommonService taskCommonService;
@@ -831,8 +834,14 @@
                                stringBuilder.append(sysUser.getNickName()).append(",");
                            }
                            if (StringUtils.isNotBlank(identityLink.getGroupId())) {
                                SysRole sysRole = sysRoleService.selectRoleById(Long.parseLong(identityLink.getGroupId()));
                                stringBuilder.append(sysRole.getRoleName()).append(",");
                                if (identityLink.getGroupId().contains("dept")) {
                                    SysDept sysDept = sysDeptService.selectDeptById(Long.parseLong(identityLink.getGroupId().split(":")[1]));
                                    stringBuilder.append(sysDept.getDeptName()).append(",");
                                } else {
                                    SysRole sysRole = sysRoleService.selectRoleById(Long.parseLong(identityLink.getGroupId()));
                                    stringBuilder.append(sysRole.getRoleName()).append(",");
                                }
                            }
                        }
                    }
@@ -853,14 +862,14 @@
            }
            map.put("flowList", hisFlowList);
        }
        // 第一次申请获取初始化表单
        if (StringUtils.isNotBlank(deployId)) {
            SysForm sysForm = sysInstanceFormService.selectSysDeployFormByDeployId(deployId);
            if (Objects.isNull(sysForm)) {
                return AjaxResult.error("请先配置流程表单");
            }
            map.put("formData", JSONObject.parseObject(sysForm.getFormContent()));
        }
//        // 第一次申请获取初始化表单
//        if (StringUtils.isNotBlank(deployId)) {
//            SysForm sysForm = sysInstanceFormService.selectSysDeployFormByDeployId(deployId);
//            if (Objects.isNull(sysForm)) {
//                return AjaxResult.error("请先配置流程表单");
//            }
//            map.put("formData", JSONObject.parseObject(sysForm.getFormContent()));
//        }
        return AjaxResult.success(map);
    }
@@ -1149,10 +1158,46 @@
        } else {
            parameters = taskService.getVariables(taskId);
        }
        List<FormDetailVO> beforeNodes = this.getBeforeNodeForm(parameters, task.getFormKey(), task.getName(), task.getProcessDefinitionId(), task.getTaskDefinitionKey(), Boolean.FALSE);
        return AjaxResult.success(beforeNodes);
    }
    @Override
    public AjaxResult detail(String taskId) {
        Task task = taskService.createTaskQuery().taskId(taskId).singleResult();
        // 流程变量
        Map<String, Object> parameters = new HashMap<>();
        if (Objects.isNull(task)) {
            // 如果为空,可能是任务已经结束
            HistoricTaskInstance hisTask = historyService.createHistoricTaskInstanceQuery().taskId(taskId).includeProcessVariables().singleResult();
            if (Objects.isNull(hisTask)) {
                throw new RuntimeException("该任务不存在");
            }
            parameters = hisTask.getProcessVariables();
            List<FormDetailVO> beforeNodes = this.getBeforeNodeForm(parameters, hisTask.getFormKey(), hisTask.getName(), hisTask.getProcessDefinitionId(), hisTask.getTaskDefinitionKey(), Boolean.TRUE);
            return AjaxResult.success(beforeNodes);
        } else {
            parameters = taskService.getVariables(taskId);
            List<FormDetailVO> beforeNodes = this.getBeforeNodeForm(parameters, task.getFormKey(), task.getName(), task.getProcessDefinitionId(), task.getTaskDefinitionKey(), Boolean.TRUE);
            return AjaxResult.success(beforeNodes);
        }
    }
    /**
     * 获取当前节点和上一节点的表单内容
     *
     * @param parameters 根据任务查找出来的参数
     * @param formKey task自身关联的表单id
     * @param taskName task自身的任务名
     * @param processDefId 流程定义id
     * @param processDefKey 流程实例id
     * @return
     */
    private List<FormDetailVO> getBeforeNodeForm(Map<String, Object> parameters, String formKey, String taskName, String processDefId, String processDefKey, Boolean currentNeedData) {
        if (! parameters.keySet().stream().anyMatch(key -> key.contains(ProcessConstants.TASK_FORM_KEY))) {
            // 如果是空的,使用formId去查
            if (StringUtils.isNotBlank(task.getFormKey())) {
                SysForm sysForm = sysFormService.selectSysFormById(Long.parseLong(task.getFormKey()));
            if (StringUtils.isNotBlank(formKey)) {
                SysForm sysForm = sysFormService.selectSysFormById(Long.parseLong(formKey));
                if (Objects.isNull(sysForm)) {
                    throw new RuntimeException("该流程绑定的表单不存在或已被删除");
                }
@@ -1160,16 +1205,16 @@
                Map<String, Object> data = new HashMap<>(1);
                data.put(ProcessConstants.TASK_FORM_KEY, JSONObject.parseObject(sysForm.getFormContent()));
                formDetailVO.setFormJsonObj(data);
                formDetailVO.setBeforeNodeName(task.getName());
                formDetailVO.setBeforeNodeName(taskName);
                formDetailVO.setCurrent(Boolean.TRUE);
                return AjaxResult.success(Arrays.asList(formDetailVO));
                return Arrays.asList(formDetailVO);
            } else {
                return AjaxResult.success(new ArrayList<>(1));
                return new ArrayList<>(1);
            }
        }
        // 这里只需要查自身以及上一个节点(如果并行的有多个)的表单数据
        List<FormDetailVO> beforeNodes = taskCommonService.getBeforeNodeDefId(task.getProcessDefinitionId(), task.getTaskDefinitionKey(), sysFormService);
        List<String> beforeNodeDefIds = beforeNodes.stream().filter(item -> !item.getCurrent()).map(FormDetailVO::getBeforeNodeDefId).collect(Collectors.toList());
        List<FormDetailVO> beforeNodes = taskCommonService.getBeforeNodeDefId(processDefId, processDefKey, sysFormService, Boolean.TRUE);
        List<String> beforeNodeDefIds = beforeNodes.stream().filter(item -> !item.getCurrent() || currentNeedData).map(FormDetailVO::getBeforeNodeDefId).collect(Collectors.toList());
        Map<String, Object> newP = new HashMap<>();
        if (CollectionUtils.isNotEmpty(beforeNodeDefIds)) {
            for (String key : parameters.keySet()) {
@@ -1177,7 +1222,8 @@
                if (beforeNodeDefIds.stream().anyMatch(defId -> key.startsWith(defId))) {
                    if (key.contains(ProcessConstants.TASK_FORM_KEY)) {
                        newP.put(key, parameters.get(key));
                    } else {
                    }
                    else {
                        newP.put(key.split("&")[1], parameters.get(key));
                    }
                }
@@ -1186,8 +1232,8 @@
        // 拿到目标表单后,再处理每个表单的数据
        for (FormDetailVO formDetailVO : beforeNodes) {
            if (formDetailVO.getCurrent()) {
                continue;  // 跳过当前节点,因为当前节点在获取前置节点时已经设置过了
            if (formDetailVO.getCurrent() && !currentNeedData) {
                continue;  // 跳过当前节点,因为当前节点在获取前置节点时已经设置过了(但表单数据没有给)
            }
            Object form = newP.get(formDetailVO.getBeforeNodeDefId() + "&" + ProcessConstants.TASK_FORM_KEY);
            if (Objects.nonNull(form)) {
@@ -1224,8 +1270,7 @@
                formDetailVO.setFormJsonObj(newP);
            }
        }
        return AjaxResult.success(beforeNodes);
        return beforeNodes;
    }
    /**