zxl
2025-03-20 baf60bc658c1bfb7fc0dd79d2bfc03abcb126488
business/src/main/java/com/ycl/service/impl/ProjectProcessServiceImpl.java
@@ -19,22 +19,21 @@
import com.ycl.domain.entity.*;
import com.ycl.domain.form.*;
import com.ycl.domain.json.*;
import com.ycl.domain.vo.CustomerTaskVO;
import com.ycl.domain.vo.IndexCustomerTaskVO;
import com.ycl.domain.vo.ProjectProcessDetailVO;
import com.ycl.domain.vo.*;
import com.ycl.event.event.TaskLogEvent;
import com.ycl.mapper.ProjectEngineeringMapper;
import com.ycl.mapper.ProjectInfoMapper;
import com.ycl.mapper.ProjectProcessMapper;
import com.ycl.service.*;
import com.ycl.common.base.Result;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ycl.domain.vo.ProjectProcessVO;
import com.ycl.domain.query.ProjectProcessQuery;
import com.ycl.service.common.TaskCommonService;
import com.ycl.system.service.ISysDeptService;
import com.ycl.system.service.ISysDictTypeService;
import com.ycl.system.service.ISysRoleService;
import com.ycl.system.service.ISysUserService;
import com.ycl.utils.TreeUtil;
import lombok.Synchronized;
import org.apache.commons.lang3.StringUtils;
import org.flowable.bpmn.model.*;
@@ -77,6 +76,7 @@
    private final IdentityService identityService;
    private final RepositoryService repositoryService;
    private final ProjectInfoMapper projectInfoMapper;
    private final ProjectEngineeringMapper projectEngineeringMapper;
    private final HistoryService historyService;
    private final ISysUserService sysUserService;
    private final ISysRoleService sysRoleService;
@@ -102,8 +102,20 @@
        IPage<ProjectProcessVO> page = PageUtil.getPage(query, ProjectProcessVO.class);
        baseMapper.getPage(query, page);
        for (ProjectProcessVO vo : page.getRecords()) {
            List<ProjectEngineeringVO> childList = baseMapper.getEngineeringList(vo.getId());
            childList.stream().forEach(child -> {
                if (StringUtils.isNotBlank(child.getProcessDefId())) {
                    ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery().processDefinitionId(child.getProcessDefId()).singleResult();
                    if (Objects.nonNull(processDefinition)) {
                        child.setSuspended(processDefinition.isSuspended());
                        child.setFlowableProcessName(processDefinition.getName() + "(v" + processDefinition.getVersion() + ")");
                        child.setDeployId(processDefinition.getDeploymentId());
                    }
                }
            });
            vo.setChildren(TreeUtil.treeForProjectEng(childList));
            vo.setStatus(vo.getProjectStatus());
            if (Objects.nonNull(vo.getProcessDefId())) {
            if (StringUtils.isNotBlank(vo.getProcessDefId())) {
                ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery().processDefinitionId(vo.getProcessDefId()).singleResult();
                if (Objects.nonNull(processDefinition)) {
                    vo.setSuspended(processDefinition.isSuspended());
@@ -121,6 +133,7 @@
        // 查询该项目是否已经绑定过流程了,检查绑定的流程是否在运行,在运行就删了
        ProjectProcess pp = new LambdaQueryChainWrapper<>(baseMapper)
                .eq(ProjectProcess::getProjectId, form.getProjectId())
                .eq(ProjectProcess::getProjectType, form.getProjectType())
                .one();
        if (Objects.isNull(pp)) {
            throw new RuntimeException("该项目未绑定流程");
@@ -140,23 +153,36 @@
                }
            }
        }
        ProjectInfo project = new LambdaQueryChainWrapper<>(projectInfoMapper)
                .select(ProjectInfo::getProjectOwnerUnit)
                .eq(ProjectInfo::getId, form.getProjectId())
                .one();
        if (Objects.isNull(project)) {
            throw new RuntimeException("项目不存在");
        Long unitId = null;
        if (ProjectProcessTypeEnum.PROJECT.equals(form.getProjectType())) {
            ProjectInfo project = new LambdaQueryChainWrapper<>(projectInfoMapper)
                    .eq(ProjectInfo::getId, form.getProjectId())
                    .one();
            if (Objects.isNull(project)) {
                throw new RuntimeException("项目不存在");
            }
            unitId = project.getProjectOwnerUnit();
        } else if (ProjectProcessTypeEnum.ENGINEERING.equals(form.getProjectType())) {
            ProjectEngineering projectEngineering = new LambdaQueryChainWrapper<>(projectEngineeringMapper)
                    .eq(ProjectEngineering::getId, form.getProjectId())
                    .one();
            if (Objects.isNull(projectEngineering)) {
                throw new RuntimeException("工程不存在");
            }
            unitId = projectEngineering.getUnit();
        }
        SysDept dept = deptService.selectDeptById(project.getProjectOwnerUnit());
        SysDept dept = deptService.selectDeptById(unitId);
        if (Objects.isNull(dept)) {
            throw new RuntimeException("项目业主单位不存在");
            throw new RuntimeException("业主单位不存在");
        }
        String processInsId = this.startPro(form.getProjectId(), form.getProcessDefId(), dept.getDeptId());
        new LambdaUpdateChainWrapper<>(baseMapper)
                .eq(ProjectProcess::getProjectId, form.getProjectId())
                .eq(ProjectProcess::getProjectType, form.getProjectType())
                .set(ProjectProcess::getProcessDefId, form.getProcessDefId())
                .set(ProjectProcess::getProcessInsId, processInsId)
                .set(ProjectProcess::getDataLaunch, project.getProjectOwnerUnit())
                .set(ProjectProcess::getDataLaunch, unitId)
                .update();
        return Result.ok("流程变更成功");
@@ -164,21 +190,36 @@
    @Override
    @Transactional(rollbackFor = Exception.class)
    public Result startProcess(Long projectId, String processDefId) {
        ProjectInfo project = projectInfoMapper.selectById(projectId);
        if (Objects.isNull(project)) {
            throw new RuntimeException("项目不存在");
    public Result startProcess(ProjectProcessForm form) {
        Long unitId = null;
        if (ProjectProcessTypeEnum.PROJECT.equals(form.getProjectType())) {
            ProjectInfo project = new LambdaQueryChainWrapper<>(projectInfoMapper)
                    .eq(ProjectInfo::getId, form.getProjectId())
                    .one();
            if (Objects.isNull(project)) {
                throw new RuntimeException("项目不存在");
            }
            unitId = project.getProjectOwnerUnit();
        } else if (ProjectProcessTypeEnum.ENGINEERING.equals(form.getProjectType())) {
            ProjectEngineering projectEngineering = new LambdaQueryChainWrapper<>(projectEngineeringMapper)
                    .eq(ProjectEngineering::getId, form.getProjectId())
                    .one();
            if (Objects.isNull(projectEngineering)) {
                throw new RuntimeException("工程不存在");
            }
            unitId = projectEngineering.getUnit();
        }
        SysDept dept = deptService.selectDeptById(project.getProjectOwnerUnit());
        SysDept dept = deptService.selectDeptById(unitId);
        if (Objects.isNull(dept)) {
            throw new RuntimeException("项目业主单位不存在");
            throw new RuntimeException("业主单位不存在");
        }
        String processInsId = this.startPro(projectId, processDefId, dept.getDeptId());
        String processInsId = this.startPro(form.getProjectId(), form.getProcessDefId(), dept.getDeptId());
        ProjectProcess entity = new ProjectProcess();
        entity.setProjectId(projectId);
        entity.setProcessDefId(processDefId);
        entity.setProjectId(form.getProjectId());
        entity.setProcessDefId(form.getProcessDefId());
        entity.setProcessInsId(processInsId);
        entity.setDataLaunch(project.getProjectOwnerUnit());
        entity.setDataLaunch(unitId);
        entity.setProjectType(form.getProjectType());
        baseMapper.insert(entity);
        return Result.ok("流程启动成功");
@@ -191,7 +232,7 @@
     * @param processDefId
     * @return
     */
    private String startPro(Long projectId, String processDefId, Long createBy) {
    private String startPro(String projectId, String processDefId, Long createBy) {
        ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery().processDefinitionId(processDefId)
@@ -206,6 +247,7 @@
        variables.put(ProcessConstants.PROCESS_INITIATOR, sysUser.getUserId());
        // 将该项目的申请人(业主方)作为流程中某些环节的处理人
        variables.put(ProcessConstants.DATA_LAUNCH, "dept:" + createBy);
        variables.put("a", 1);
        ProcessInstance processInstance = runtimeService.startProcessInstanceById(processDefId, projectId + "", variables);
        return processInstance.getId();
    }
@@ -213,39 +255,51 @@
    /**
     * 获取流程详情
     *
     * @param projectId
     * @param form
     * @return
     */
    @Override
    public Result detail(Long projectId, String processDefId) {
        // 项目信息
        ProjectInfo projectInfo = new LambdaQueryChainWrapper<>(projectInfoMapper)
                .select(ProjectInfo::getId, ProjectInfo::getProjectName, ProjectInfo::getProjectCode)
                .eq(ProjectInfo::getId, projectId)
                .one();
    public Result detail(ProjectProcessForm form) {
        if (Objects.isNull(projectInfo)) {
            return Result.error("该项目不存在");
        String projectName = "";
        String projectCode = "";
        if (ProjectProcessTypeEnum.PROJECT.equals(form.getProjectType())) {
            ProjectInfo projectInfo = projectInfoMapper.selectById(form.getProjectId());
            if (Objects.isNull(projectInfo)) {
                throw new RuntimeException("项目不存在");
            }
            projectName = projectInfo.getProjectName();
            projectCode = projectInfo.getProjectCode();
        } else if (ProjectProcessTypeEnum.ENGINEERING.equals(form.getProjectType())) {
            ProjectEngineering projectEngineering = projectEngineeringMapper.selectById(form.getProjectId());
            if (Objects.isNull(projectEngineering)) {
                throw new RuntimeException("工程不存在");
            }
            projectName = projectEngineering.getProjectName();
        }
        ProjectProcess projectProcess = new LambdaQueryChainWrapper<>(baseMapper)
                .eq(ProjectProcess::getProjectId, projectId)
                .eq(ProjectProcess::getProcessDefId, processDefId)
                .eq(ProjectProcess::getProjectId, form.getProjectId())
                .eq(ProjectProcess::getProcessDefId, form.getProcessDefId())
                .eq(ProjectProcess::getProjectType, form.getProjectType())
                .one();
        if (Objects.isNull(projectProcess)) {
            return Result.error("该项目未设置流程");
            return Result.error("未设置流程");
        }
        ProjectProcessDetailVO detail = new ProjectProcessDetailVO();
        detail.setProjectId(projectId);
        detail.setProjectName(projectInfo.getProjectName());
        detail.setProjectCode(projectInfo.getProjectCode());
        detail.setProjectType(form.getProjectType().getValue());
        detail.setProjectId(form.getProjectId());
        detail.setProjectName(projectName);
        detail.setProjectCode(projectCode);
        ProjectProcessDetailVO.TaskStatistics taskStatistics = new ProjectProcessDetailVO.TaskStatistics();
        // 状态统计
        taskStatistics.setTotalTaskNum(this.getTotalTaskNum(processDefId));
        taskStatistics.setTotalTaskNum(this.getTotalTaskNum(form.getProcessDefId()));
        taskStatistics.setTodoTaskNum(this.getTodoTaskNum(projectProcess.getProcessInsId()));
        taskStatistics.setRemainingTaskNum(this.getRemainingTaskNum(processDefId, projectProcess.getProcessInsId(), taskStatistics.getTotalTaskNum()));
        taskStatistics.setRemainingTaskNum(this.getRemainingTaskNum(form.getProcessDefId(), projectProcess.getProcessInsId(), taskStatistics.getTotalTaskNum()));
        taskStatistics.setTimelyFinishedTaskNum(this.getTimelyTaskNum(projectProcess.getProcessInsId()));
        taskStatistics.setOvertimeTaskNum(this.getOvertimeTaskNum(projectProcess.getProcessInsId()));
        taskStatistics.setWillOvertimeTaskNum(this.getWillOvertimeTaskNum(projectProcess.getProcessInsId()));
@@ -345,13 +399,28 @@
            taskVO.setTaskDefinitionKey(task.getTaskDefinitionKey());
            // 流程项目信息
            ProjectInfo project = baseMapper.getProjectInfo(task.getProcessInstanceId());
            if (Objects.nonNull(project)) {
                taskVO.setProjectId(project.getId());
                taskVO.setProjectName(project.getProjectName());
            } else {
                continue;
            ProjectProcess projectProcess = new LambdaQueryChainWrapper<>(baseMapper)
                    .eq(ProjectProcess::getProcessInsId, task.getProcessInstanceId())
                    .one();
            String projectId = "";
            String projectName = "";
            if (Objects.nonNull(projectProcess)) {
                if (projectProcess.getProjectType().equals(ProjectProcessTypeEnum.PROJECT)) {
                    ProjectInfo project = projectInfoMapper.selectById(projectProcess.getProjectId());
                    if (Objects.nonNull(project)) {
                        projectId = projectProcess.getProjectId();
                        projectName = project.getProjectName();
                    }
                } else if (projectProcess.getProjectType().equals(ProjectProcessTypeEnum.ENGINEERING)) {
                    ProjectEngineering engineering = projectEngineeringMapper.selectById(projectProcess.getProjectId());
                    if (Objects.nonNull(engineering)) {
                        projectId = projectProcess.getProjectId();
                        projectName = engineering.getProjectName();
                    }
                }
            }
            taskVO.setProjectId(projectId);
            taskVO.setProjectName(projectName);
            // 流程发起人信息
            this.setPromoterInfo(taskVO);
@@ -835,7 +904,8 @@
     * @param pageNum
     * @param result
     */
    public void getTodoTaskList(Long projectId, String processInsId, String taskName, int pageSize, int pageNum, Result result) {
    public void getTodoTaskList(String projectId, String processInsId, String taskName, int pageSize, int pageNum, Result result) {
        TaskQuery taskQuery = taskService.createTaskQuery()
                .active()
                .processInstanceId(processInsId)
@@ -872,7 +942,7 @@
     * @param result
     * @return
     */
    private List<CustomerTaskVO> getAllUserTask(Long projectId, String processDefinitionId, String processInsId, String taskName, Integer pageNum, Integer pageSize, Result result) {
    private List<CustomerTaskVO> getAllUserTask(String projectId, String processDefinitionId, String processInsId, String taskName, Integer pageNum, Integer pageSize, Result result) {
        int startNum = pageSize * (pageNum - 1);
        int endNum = startNum + pageSize;
        List<UserTask> allUserTaskElement = this.getAllUserTaskElement(processDefinitionId);
@@ -1022,7 +1092,7 @@
     * @param processDefId 流程定义id
     * @return
     */
    private List<CustomerTaskVO> getFinishedProcessTaskInfo(List<UserTask> userTasks, Long projectId, String processInsId, String processDefId) {
    private List<CustomerTaskVO> getFinishedProcessTaskInfo(List<UserTask> userTasks, String projectId, String processInsId, String processDefId) {
        HistoricProcessInstance hisProcess = historyService.createHistoricProcessInstanceQuery().processInstanceId(processInsId).singleResult();
        if (Objects.isNull(hisProcess)) {
            return new ArrayList<>();
@@ -1088,7 +1158,7 @@
     * @param taskVO    任务vo
     * @param projectId 项目id
     */
    private void setRuntimeTaskInfo(Task task, CustomerTaskVO taskVO, Long projectId) {
    private void setRuntimeTaskInfo(Task task, CustomerTaskVO taskVO, String projectId) {
        // 当前流程信息
        taskVO.setTaskId(task.getId());
        taskVO.setCreateTime(task.getCreateTime());
@@ -1146,7 +1216,14 @@
                        taskVO.getHandlerUnitId().add(sysUser.getDept().getDeptId());
                        taskVO.getHandlerUnitName().add(sysUser.getDept().getDeptName());
                        taskVO.getPromoterName().add(this.getUserShowName(sysUser));
                        taskVO.getPromoterUnitName().add(sysUser.getDept().getDeptName());
//                        if (sysUser.getDept().getAncestors())
                        String[] str = sysUser.getDept().getAncestors().split(",");
                        if (str.length >= 4){
                            taskVO.getPromoterUnitName().add(sysUser.getDept().getParentName() +"-"+sysUser.getDept().getDeptName());
                        }else {
                            taskVO.getPromoterUnitName().add(sysUser.getDept().getDeptName());
                        }
                    }
                }
                // 绑定的是角色或者部门
@@ -1161,7 +1238,13 @@
                            taskVO.getHandlerUnitId().add(dept.getDeptId());
                            taskVO.getHandlerUnitName().add(dept.getDeptName());
                            taskVO.getPromoterName().add(this.getDeptLeaderShowName(dept));
                            taskVO.getPromoterUnitName().add(dept.getDeptName());
                            String[] str = dept.getAncestors().split(",");
                            if (str.length >= 4){
                                taskVO.getPromoterUnitName().add(dept.getParentName() +"-"+dept.getDeptName());
                            }else {
                                taskVO.getPromoterUnitName().add(dept.getDeptName());
                            }
                        }
                    }
                } else {
@@ -1231,7 +1314,7 @@
     * @param result
     * @return
     */
    private List<CustomerTaskVO> getTimelyTask(Long projectId, String processDefinitionId, String processInsId, String taskName, Integer pageNum, Integer pageSize, Result result) {
    private List<CustomerTaskVO> getTimelyTask(String projectId, String processDefinitionId, String processInsId, String taskName, Integer pageNum, Integer pageSize, Result result) {
        int startNum = pageSize * (pageNum - 1);
        int endNum = startNum + pageSize;
@@ -1443,7 +1526,7 @@
     * @param result
     * @return
     */
    private List<CustomerTaskVO> getOvertimeTask(Long projectId, String processDefinitionId, String processInsId, String taskName, Integer pageNum, Integer pageSize, Result result) {
    private List<CustomerTaskVO> getOvertimeTask(String projectId, String processDefinitionId, String processInsId, String taskName, Integer pageNum, Integer pageSize, Result result) {
        int startNum = pageSize * (pageNum - 1);
        int endNum = startNum + pageSize;
@@ -1556,7 +1639,7 @@
     * @param result
     * @return
     */
    private List<CustomerTaskVO> getWillOvertimeTask(Long projectId, String processDefinitionId, String processInsId, String taskName, Integer pageNum, Integer pageSize, Result result) {
    private List<CustomerTaskVO> getWillOvertimeTask(String projectId, String processDefinitionId, String processInsId, String taskName, Integer pageNum, Integer pageSize, Result result) {
        int startNum = pageSize * (pageNum - 1);
        int endNum = startNum + pageSize;
@@ -1631,7 +1714,7 @@
     * @param result
     * @return
     */
    private List<CustomerTaskVO> getRemainingTask(Long projectId,
    private List<CustomerTaskVO> getRemainingTask(String projectId,
                                                  String processDefinitionId,
                                                  String processInsId,
                                                  String taskName,
@@ -1759,7 +1842,7 @@
     * @param setType  0 设置责任单位   1 设置办理单位
     * @param vo
     */
    private void varYzReview(CustomerTaskVO vo, Long projectId, String processInsId, HandlerTypeEnum type, Integer setType) {
    private void varYzReview(CustomerTaskVO vo, String projectId, String processInsId, HandlerTypeEnum type, Integer setType) {
        ProjectProcess projectProcess = new LambdaQueryChainWrapper<>(projectProcessMapper)
                .eq(ProjectProcess::getProjectId, projectId)
                .eq(ProjectProcess::getProcessInsId, processInsId)
@@ -1829,7 +1912,7 @@
     * @param projectId
     * @param processInsId
     */
    private void setCandidateInfo(UserTask userTask, CustomerTaskVO vo, Long projectId, String processInsId) {
    private void setCandidateInfo(UserTask userTask, CustomerTaskVO vo, String projectId, String processInsId) {
        if (StringUtils.isNotBlank(userTask.getAssignee())) {
            SysUser sysUser = sysUserService.selectUserById(Long.parseLong(userTask.getAssignee()));
            if (Objects.nonNull(sysUser)) {