xiangpei
2025-02-26 44e8e5f551af469f7ffd65918120e769d36eecda
business/src/main/java/com/ycl/service/impl/ProjectProcessServiceImpl.java
@@ -1,7 +1,6 @@
package com.ycl.service.impl;
import com.alibaba.fastjson2.JSON;
import com.alibaba.fastjson2.JSONArray;
import com.alibaba.fastjson2.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
@@ -11,20 +10,15 @@
import com.ycl.common.constant.ProcessConstants;
import com.ycl.common.constant.ProcessOverTimeConstants;
import com.ycl.common.core.domain.entity.SysDept;
import com.ycl.common.core.domain.entity.SysDictData;
import com.ycl.common.core.domain.entity.SysRole;
import com.ycl.common.core.domain.entity.SysUser;
import com.ycl.common.enums.business.HandlerTypeEnum;
import com.ycl.common.enums.business.ProcessLogEventTypeEnum;
import com.ycl.common.enums.business.SuperviseTypeEnum;
import com.ycl.common.enums.business.TaskStatusEnum;
import com.ycl.common.enums.business.*;
import com.ycl.common.utils.SecurityUtils;
import com.ycl.constant.TaskTypeConstant;
import com.ycl.domain.entity.*;
import com.ycl.domain.form.*;
import com.ycl.domain.json.DelegateData;
import com.ycl.domain.json.HangupData;
import com.ycl.domain.json.JumpData;
import com.ycl.domain.json.SuperviseData;
import com.ycl.domain.json.*;
import com.ycl.domain.vo.CustomerTaskVO;
import com.ycl.domain.vo.IndexCustomerTaskVO;
import com.ycl.domain.vo.ProjectProcessDetailVO;
@@ -38,6 +32,7 @@
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 lombok.Synchronized;
@@ -93,6 +88,8 @@
    private final ApplicationEventPublisher publisher;
    private final ISysDeptService deptService;
    private final ProcessLogService processLogService;
    private final ISysDictTypeService dictTypeService;
    private final ProcessConfigInfoService processConfigInfoService;
    /**
     * 分页查询
@@ -143,22 +140,22 @@
            }
        }
        ProjectInfo project = new LambdaQueryChainWrapper<>(projectInfoMapper)
                .select(ProjectInfo::getCreateBy)
                .select(ProjectInfo::getProjectOwnerUnit)
                .eq(ProjectInfo::getId, form.getProjectId())
                .one();
        if (Objects.isNull(project)) {
            throw new RuntimeException("项目不存在");
        }
        SysUser user = sysUserService.selectUserById(project.getCreateBy());
        if (Objects.isNull(user)) {
        SysDept dept = deptService.selectDeptById(project.getProjectOwnerUnit());
        if (Objects.isNull(dept)) {
            throw new RuntimeException("项目业主单位不存在");
        }
        String processInsId = this.startPro(form.getProjectId(), form.getProcessDefId(), user.getDeptId());
        String processInsId = this.startPro(form.getProjectId(), form.getProcessDefId(), dept.getDeptId());
        new LambdaUpdateChainWrapper<>(baseMapper)
                .eq(ProjectProcess::getProjectId, form.getProjectId())
                .set(ProjectProcess::getProcessDefId, form.getProcessDefId())
                .set(ProjectProcess::getProcessInsId, processInsId)
                .set(ProjectProcess::getDataLaunch, project.getCreateBy())
                .set(ProjectProcess::getDataLaunch, project.getProjectOwnerUnit())
                .update();
        return Result.ok("流程变更成功");
@@ -167,23 +164,20 @@
    @Override
    @Transactional(rollbackFor = Exception.class)
    public Result startProcess(Long projectId, String processDefId) {
        ProjectInfo project = new LambdaQueryChainWrapper<>(projectInfoMapper)
                .select(ProjectInfo::getCreateBy)
                .eq(ProjectInfo::getId, projectId)
                .one();
        ProjectInfo project = projectInfoMapper.selectById(projectId);
        if (Objects.isNull(project)) {
            throw new RuntimeException("项目不存在");
        }
        SysUser user = sysUserService.selectUserById(project.getCreateBy());
        if (Objects.isNull(user)) {
        SysDept dept = deptService.selectDeptById(project.getProjectOwnerUnit());
        if (Objects.isNull(dept)) {
            throw new RuntimeException("项目业主单位不存在");
        }
        String processInsId = this.startPro(projectId, processDefId, user.getDeptId());
        String processInsId = this.startPro(projectId, processDefId, dept.getDeptId());
        ProjectProcess entity = new ProjectProcess();
        entity.setProjectId(projectId);
        entity.setProcessDefId(processDefId);
        entity.setProcessInsId(processInsId);
        entity.setDataLaunch(project.getCreateBy());
        entity.setDataLaunch(project.getProjectOwnerUnit());
        baseMapper.insert(entity);
        return Result.ok("流程启动成功");
@@ -209,8 +203,6 @@
        SysUser sysUser = SecurityUtils.getLoginUser().getUser();
        identityService.setAuthenticatedUserId(sysUser.getUserId().toString());
        variables.put(ProcessConstants.PROCESS_INITIATOR, sysUser.getUserId());
        //测试容缺
        variables.put("miss", true);
        // 将该项目的申请人(业主方)作为流程中某些环节的处理人
        variables.put(ProcessConstants.DATA_LAUNCH, "dept:" + createBy);
        ProcessInstance processInstance = runtimeService.startProcessInstanceById(processDefId, projectId + "", variables);
@@ -312,9 +304,15 @@
                .active()
                .includeProcessVariables()
                .orderByTaskCreateTime().desc();
        List<String> insIds = baseMapper.getNormalInsIds();
        if (CollectionUtils.isEmpty(insIds)) {
            result.data(new ArrayList<>()).total(0L);
            return;
        } else {
            taskQuery.processInstanceIdIn(insIds);
        }
        if (StringUtils.isNotBlank(taskName)) {
            taskQuery.processDefinitionNameLike(taskName);
            taskQuery.taskNameLike(taskName);
        }
        if (!SecurityUtils.getLoginUser().getUser().isAdmin()) {
            taskQuery
@@ -413,13 +411,48 @@
            if (processLogService.taskIsHangup(task.getId(), task.getProcessInstanceId())) {
                taskVO.setTaskStatus(TaskStatusEnum.HANGUP);
            }
            // 计算办理时间
            ProcessCoding processCoding = processCodingService.getByTaskId(task.getId());
            if (processCoding != null) {
                if (StringUtils.isNotBlank(processCoding.getOvertime())) {
                    Long overtime = getTime(processCoding.getOvertime());
                    long durationTime = 0l;
                    if (Objects.nonNull(processCoding.getStartTaskTime())) {
                        durationTime = ((new Date()).getTime() - processCoding.getStartTaskTime().getTime()) / 1000;
                    } else {
                        taskVO.setRemainingTime("未设置办理时间");
                    }
                    if (overtime > durationTime) {
                        taskVO.setRemainingTime((overtime - durationTime) / 3600 + "小时");
                    } else {
                        taskVO.setRemainingTime("已超时");
                    }
                } else {
                    taskVO.setRemainingTime("-");
                }
            }
            this.distinctVo(taskVO);
            vos.add(taskVO);
        }
        if (vos.size() < pageSize) {
            result.total(vos.size());
        }
        result.put("taskList", vos);
    }
    private Long getTime(String timeStr) {
        Long time = null;
        if (StringUtils.isNotBlank(timeStr)) {
            String[] timeArr = timeStr.split("-");
            // 解析天数和小时数
            int days = Integer.parseInt(timeArr[0]);
            int hours = 0;
            if (timeArr.length > 1) {
                hours = Integer.parseInt(timeArr[1]);
            }
            time = (days * 24L + hours) * 3600L;
//            //分-秒
//            time= (days * 60L) + hours;
        }
        return time;
    }
    @Override
@@ -613,7 +646,7 @@
        jsonData.setAfterHandlerIds(afterHandlerIds);
        jsonData.setAfterHandlerType(form.getPeopleType());
        // 发布转办事件
        publisher.publishEvent(new TaskLogEvent(this, null,SecurityUtils.getUserId(), form.getProjectId(), form.getProcessInsId(), task.getId(), task.getName(),ProcessLogEventTypeEnum.DELEGATE, jsonData));
        publisher.publishEvent(new TaskLogEvent(this, null, SecurityUtils.getUserId(), form.getProjectId(), form.getProcessInsId(), task.getId(), task.getName(), ProcessLogEventTypeEnum.DELEGATE, jsonData));
        return Result.ok("转办成功");
    }
@@ -624,7 +657,7 @@
        Task task = taskService.createTaskQuery().taskId(form.getTaskId()).processInstanceId(form.getProcessInsId()).singleResult();
        if (Objects.nonNull(task)) {
            // 添加跳过日志
            publisher.publishEvent(new TaskLogEvent(this, null,SecurityUtils.getUserId(), form.getProjectId(), form.getProcessInsId(), form.getTaskId(), task.getName(),ProcessLogEventTypeEnum.JUMP, new JumpData(form.getDesc())));
            publisher.publishEvent(new TaskLogEvent(this, null, SecurityUtils.getUserId(), form.getProjectId(), form.getProcessInsId(), form.getTaskId(), task.getName(), ProcessLogEventTypeEnum.JUMP, new JumpData(form.getDesc())));
            // 查出该任务绑定的表单
            Map<String, Object> data = new HashMap<>(1);
@@ -668,7 +701,7 @@
        }
        dataList.add(jsonData);
        //添加督办日志
        publisher.publishEvent(new TaskLogEvent(this, processLog.getId(), processLog.getUserId(), form.getProjectId(), form.getProcessInsId(), form.getTaskId(), task.getName(),ProcessLogEventTypeEnum.SUPERVISE, dataList));
        publisher.publishEvent(new TaskLogEvent(this, processLog.getId(), processLog.getUserId(), form.getProjectId(), form.getProcessInsId(), form.getTaskId(), task.getName(), ProcessLogEventTypeEnum.SUPERVISE, dataList));
        return Result.ok("操作成功");
    }
@@ -698,7 +731,7 @@
                task.getName(),
                ProcessLogEventTypeEnum.HANGUP,
                new HangupData(form.getReason())
                ));
        ));
        return Result.ok("操作成功");
    }
@@ -731,6 +764,51 @@
        return Result.ok("操作成功");
    }
    @Override
    public Result taskTeamwork(TaskTeamWorkForm form) {
        Task task = taskService.createTaskQuery().taskId(form.getTaskId()).singleResult();
        if (Objects.isNull(task)) {
            return Result.error("任务不存在");
        }
        ProjectProcess projectProcess = new LambdaQueryChainWrapper<>(projectProcessMapper)
                .eq(ProjectProcess::getProcessInsId, task.getProcessInstanceId())
                .eq(ProjectProcess::getProcessDefId, task.getProcessDefinitionId())
                .one();
        if (Objects.isNull(projectProcess)) {
            return Result.error("项目流程未绑定");
        }
        // 1. 保存发起人填写的表单数据,但不直接完成该任务。提交后任务处理人必须等到协同人处理完之后才能完成任务
        Map<String, Object> processVariables = new HashMap<>();
        //查出字典中需要注入的字段信息
        List<String> dictList = dictTypeService.selectDictDataByType("flow_variables").stream().map(SysDictData::getDictValue).collect(Collectors.toList());
        Map<String, Object> newV = new HashMap<>(2);
        if (!org.springframework.util.CollectionUtils.isEmpty(form.getVariables())) {
            for (String key : form.getVariables().keySet()) {
                newV.put(task.getTaskDefinitionKey() + "&" + key, form.getVariables().get(key));
                //字典里有就放入流程变量中
                if (org.apache.commons.collections4.CollectionUtils.isNotEmpty(dictList) && dictList.contains(key)) {
                    processVariables.put(key, form.getVariables().get(key));
                }
            }
        }
        if (!processVariables.isEmpty()) {
            taskService.setVariables(form.getTaskId(), processVariables);
        }
        // 2. 保存日志
        publisher.publishEvent(new TaskLogEvent(this,
                null,
                SecurityUtils.getUserId(),
                form.getProjectId(),
                form.getProcessInsId(),
                form.getTaskId(),
                task.getName(),
                ProcessLogEventTypeEnum.TEAM_WORK,
                new TeamWorkData(form.getHandlerType(), form.getHandlerIds(), TeamWorkStatusEnum.NOT_FINISHED)
        ));
        return Result.ok("操作成功");
    }
    /**
     * 查询待办任务
     *
@@ -750,7 +828,7 @@
                .desc();
        if (StringUtils.isNotBlank(taskName)) {
            taskQuery.processDefinitionNameLike(taskName);
            taskQuery.taskNameLike(taskName);
        }
        result.total(taskQuery.count());
        List<Task> taskList = taskQuery.listPage(pageSize * (pageNum - 1), pageSize);
@@ -842,7 +920,7 @@
                        SysUser sysUser = sysUserService.selectUserById(Long.parseLong(userTask.getAssignee()));
                        if (Objects.nonNull(sysUser)) {
                            handlerIds.add(sysUser.getUserId());
                            handlerNames.add(sysUser.getNickName());
                            handlerNames.add(this.getUserShowName(sysUser));
                            if (Objects.nonNull(sysUser.getDept())) {
                                handlerUnitIds.add(sysUser.getDept().getDeptId());
                                handlerUnitNames.add(sysUser.getDept().getDeptName());
@@ -890,7 +968,7 @@
                    SysUser handlerUser = sysUserService.selectUserById(handlerUserId);
                    if (Objects.nonNull(handlerUser)) {
                        handlerIds.add(handlerUserId);
                        handlerNames.add(handlerUser.getNickName());
                        handlerNames.add(this.getUserShowName(handlerUser));
                        vo.setActualHandlerUserId(historicTasks.get(0).getAssignee());
                        vo.setActualHandlerUserName(handlerUser.getNickName());
                    }
@@ -924,6 +1002,9 @@
     */
    private List<CustomerTaskVO> getFinishedProcessTaskInfo(List<UserTask> userTasks, String processInsId, String processDefId) {
        HistoricProcessInstance hisProcess = historyService.createHistoricProcessInstanceQuery().processInstanceId(processInsId).singleResult();
        if (Objects.isNull(hisProcess)) {
            return new ArrayList<>();
        }
        List<CustomerTaskVO> vos = userTasks.stream().map(userTask -> {
            CustomerTaskVO vo = new CustomerTaskVO();
            vo.setProcessInsId(hisProcess.getId());
@@ -1020,7 +1101,7 @@
                SysUser sysUser = sysUserService.selectUserById(Long.parseLong(identityLink.getUserId()));
                if (Objects.nonNull(sysUser)) {
                    taskVO.getHandlerId().add(sysUser.getUserId());
                    taskVO.getHandlerName().add(sysUser.getNickName());
                    taskVO.getHandlerName().add(this.getUserShowName(sysUser));
                    if (Objects.nonNull(sysUser.getDept())) {
                        taskVO.getHandlerUnitId().add(sysUser.getDept().getDeptId());
                        taskVO.getHandlerUnitName().add(sysUser.getDept().getDeptName());
@@ -1208,9 +1289,9 @@
                SysUser handlerUser = sysUserService.selectUserById(handlerUserId);
                if (Objects.nonNull(handlerUser)) {
                    vo.getHandlerId().add(handlerUserId);
                    vo.getHandlerName().add(handlerUser.getNickName());
                    vo.getHandlerName().add(this.getUserShowName(handlerUser));
                    vo.setActualHandlerUserId(hisTask.getAssignee());
                    vo.setActualHandlerUserName(handlerUser.getNickName());
                    vo.setActualHandlerUserName(this.getUserShowName(handlerUser));
                }
                vo.setTaskDefinitionKey(hisTask.getTaskDefinitionKey());
                this.setPromoterAndHandler(vo, hisTask.getIdentityLinks());
@@ -1221,6 +1302,16 @@
        }).collect(Collectors.toList());
        result.data(vos);
        return vos;
    }
    /**
     * 用户名称后面跟电话号码
     *
     * @param user
     * @return
     */
    private String getUserShowName(SysUser user) {
        return user.getNickName() + (StringUtils.isNotBlank(user.getPhonenumber()) ? "(" + user.getPhonenumber() + ")" : "");
    }
    /**
@@ -1797,7 +1888,7 @@
                return user.getUserId() + "";
            }).collect(Collectors.joining("、")));
            taskVO.setPromoterName(userList.stream().map(user -> {
                return user.getNickName();
                return this.getUserShowName(user);
            }).collect(Collectors.joining("、")));
            taskVO.setPromoterUnitId(userList.stream().filter(user -> Objects.nonNull(user.getDept())).map(user -> {
                return user.getDept().getDeptId() + "";