xuhy
2025-02-26 2257a0849b158429b89bc22de8b567e39b8672fd
审批流
9个文件已修改
545 ■■■■■ 已修改文件
ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/TContractController.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-applet/src/main/java/com/ruoyi/web/controller/api/StateProcessController.java 14 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/bo/ProcessTaskListBO.java 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/model/StateProcessInstanceAction.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/service/StateProcessTemplateService.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/service/impl/StateProcessTemplateServiceImpl.java 508 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/vo/ProcessDetailVO.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/resources/mapper/system/StateTaskCenterMapper.xml 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/resources/mapper/system/TContractMapper.xml 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/TContractController.java
@@ -179,7 +179,6 @@
    @ApiOperation(value = "获取合同分页列表")
    @PostMapping(value = "/contractList")
    @PreAuthorize("@ss.hasPermi('system:contract:list')")
    public R<PageInfo<TContract>> contractList(@RequestBody TContractQuery query) {
        return R.ok(contractService.contractList(query));
    }
ruoyi-applet/src/main/java/com/ruoyi/web/controller/api/StateProcessController.java
@@ -156,21 +156,21 @@
    @ApiOperation("待办列表")
    @PostMapping("/wait/task/page")
    public AjaxResult<PageInfo<ProcessTaskListVO>> waitTaskPage(@RequestBody ProcessTaskListBO processTemplatePageBO) {
        return AjaxResult.success(processTemplateService.waitTaskPage(processTemplatePageBO));
        return AjaxResult.success(processTemplateService.waitTaskPageApplet(processTemplatePageBO));
    }
    //已办
    @ApiOperation("已办列表")
    @PostMapping("/deal/task/page")
    public AjaxResult<PageInfo<ProcessTaskListVO>> dealTaskPage(@RequestBody ProcessTaskListBO processTemplatePageBO) {
        return AjaxResult.success(processTemplateService.dealTaskPage(processTemplatePageBO));
        return AjaxResult.success(processTemplateService.dealTaskPageApplet(processTemplatePageBO));
    }
    //待办和已办列表
    @ApiOperation("待办和已办列表")
    @PostMapping("/dealAndWait/task/page")
    public AjaxResult<PageInfo<ProcessTaskListVO>> dealAndWaitTaskPage(@RequestBody ProcessTaskListBO processTemplatePageBO) {
        return AjaxResult.success(processTemplateService.dealAndWaitTaskPage(processTemplatePageBO));
    //我发起的
    @ApiOperation("我发起的列表")
    @PostMapping("/initiate/task/page")
    public AjaxResult<PageInfo<ProcessTaskListVO>> initiateTaskPage(@RequestBody ProcessTaskListBO processTemplatePageBO) {
        return AjaxResult.success(processTemplateService.initiateTaskPage(processTemplatePageBO));
    }
    //抄送
ruoyi-system/src/main/java/com/ruoyi/system/bo/ProcessTaskListBO.java
@@ -42,4 +42,11 @@
    @ApiModelProperty(value = "前端忽略")
    private List<String> instanceIds;
    @ApiModelProperty(value = "时间筛选 1=1天 2=7天 3=30天")
    private Integer timeType;
    @ApiModelProperty(value = "排序  1=最早到达 2=最新到达")
    private Integer sortBy=2;
}
ruoyi-system/src/main/java/com/ruoyi/system/model/StateProcessInstanceAction.java
@@ -43,4 +43,7 @@
    @TableField("remark")
    private String remark;
    @TableField(exist = false)
    private String nickName;
}
ruoyi-system/src/main/java/com/ruoyi/system/service/StateProcessTemplateService.java
@@ -27,9 +27,11 @@
    //待办
    PageInfo<ProcessTaskListVO> waitTaskPage(ProcessTaskListBO processTaskListBO);
    PageInfo<ProcessTaskListVO> waitTaskPageApplet(ProcessTaskListBO processTaskListBO);
    //已办
    PageInfo<ProcessTaskListVO> dealTaskPage(ProcessTaskListBO processTaskListBO);
    PageInfo<ProcessTaskListVO> dealTaskPageApplet(ProcessTaskListBO processTaskListBO);
    //抄送
    PageInfo<ProcessTaskListVO> copyTaskPage(ProcessTaskListBO processTaskListBO);
@@ -43,4 +45,6 @@
    PageInfo<ProcessTaskListVO> dealAndWaitTaskPage(ProcessTaskListBO processTemplatePageBO);
    ProcessDetailVO detail(String taskId);
    PageInfo<ProcessTaskListVO> initiateTaskPage(ProcessTaskListBO processTemplatePageBO);
}
ruoyi-system/src/main/java/com/ruoyi/system/service/impl/StateProcessTemplateServiceImpl.java
@@ -1,6 +1,7 @@
package com.ruoyi.system.service.impl;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.IdUtil;
import cn.hutool.core.util.NumberUtil;
import cn.hutool.core.util.ObjectUtil;
@@ -400,6 +401,145 @@
        }
        return pageInfo;
    }
    /**
     * 待办
     * @param processTaskListBO
     * @return
     */
    @Override
    public PageInfo<ProcessTaskListVO> waitTaskPageApplet(ProcessTaskListBO processTaskListBO) {
        String startTime = null;
        String endTime = null;
        if(Objects.nonNull(processTaskListBO.getTimeType())){
            switch (processTaskListBO.getTimeType()){
                case 1:
                    startTime = DateUtil.format(DateUtil.offsetDay(new Date(), -1), "yyyy-MM-dd") + " 00:00:00";
                    endTime = DateUtil.format(DateUtil.offsetDay(new Date(), -1), "yyyy-MM-dd") + " 23:59:59";
                    break;
                case 2:
                    startTime = DateUtil.format(DateUtil.offsetDay(new Date(), -7), "yyyy-MM-dd") + " 00:00:00";
                    endTime = DateUtil.format(DateUtil.offsetDay(new Date(), -1), "yyyy-MM-dd") + " 23:59:59";
                    break;
                case 3:
                    startTime = DateUtil.format(DateUtil.offsetDay(new Date(), -30), "yyyy-MM-dd") + " 00:00:00";
                    endTime = DateUtil.format(DateUtil.offsetDay(new Date(), -1), "yyyy-MM-dd") + " 23:59:59";
                    break;
            }
        }
        //获取当前登录用户信息
        Long userId = SecurityUtils.getLoginUser().getUserId();
        //或签时查询其他审批人是否通过(不能省略),比如 同一任务需要A,B审核,A通过了,B不用在审核了,在历史表查询A的审核记录
        LambdaQueryWrapper<FlwHisInstance> lambdaQueryWrapper = new LambdaQueryWrapper<>();
        lambdaQueryWrapper.orderByDesc(FlowEntity::getCreateTime);
        //待审核
        lambdaQueryWrapper.eq(FlwHisInstance::getInstanceState, 0);
        List<Long> flwHisInstances = flwHisInstanceMapper.selectList(lambdaQueryWrapper).stream()
                .map(FlwHisInstance::getId).collect(Collectors.toList());
        if (ObjectUtil.isEmpty(flwHisInstances)) {
            return new PageInfo<>();
        }
        //查询任务参与者
        LambdaQueryWrapper<FlwTaskActor> query = new LambdaQueryWrapper<>();
        query.and(qy -> qy.eq(FlwTaskActor::getActorId, userId)
                //0指定用户
                .eq(FlwTaskActor::getActorType, 0)
                .or().in(FlwTaskActor::getActorId, userId)
                //1指定角色
                .eq(FlwTaskActor::getActorType, 1));
        if (ObjectUtil.isNotNull(processTaskListBO) && ObjectUtil.isNotNull(flwHisInstances)) {
            // 添加条件
            query = query.in(FlwTaskActor::getInstanceId, flwHisInstances);
        }
        List<FlwTaskActor> flwTaskActorPage = flwTaskActorMapper.selectList(query);
        if (ObjectUtil.isEmpty(flwTaskActorPage)) {
            return new PageInfo<>();
        }
        //查询任务信息
        List<FlwTask> flwTasks = flwTaskMapper.selectList(Wrappers.<FlwTask>lambdaQuery()
                .orderByDesc(FlwTask::getCreateTime)
                .in(FlwTask::getId, flwTaskActorPage.stream()
                        .map(FlwTaskActor::getTaskId).collect(Collectors.toList())));
        if (ObjectUtil.isNull(flwTasks)) {
            return new PageInfo<>();
        }
        List<String> instanceIds = flwTasks.stream().map(FlwTask::getInstanceId)
                .map(String::valueOf).collect(Collectors.toList());
        //分页查询任务中心任务
        LambdaQueryWrapper<StateTaskCenter> stateTaskQuery = new LambdaQueryWrapper<>();
        if (ObjectUtil.isNotEmpty(processTaskListBO.getName())) {
            stateTaskQuery.like(StateTaskCenter::getName, processTaskListBO.getName());
        }
        if (ObjectUtil.isNotEmpty(processTaskListBO.getModuleName())) {
            stateTaskQuery.like(StateTaskCenter::getModuleName, processTaskListBO.getModuleName());
        }
        if (ObjectUtil.isNotEmpty(processTaskListBO.getCreateBy())) {
            stateTaskQuery.like(StateTaskCenter::getCreateBy, processTaskListBO.getCreateBy());
        }
        if (ObjectUtil.isNotEmpty(startTime) && ObjectUtil.isNotEmpty(endTime)) {
            stateTaskQuery.between(StateTaskCenter::getCreateTime, startTime, endTime);
        }
        if (processTaskListBO.getSortBy() == 1) {
            stateTaskQuery.orderByAsc(BaseModel::getCreateTime);
        }
        if (processTaskListBO.getSortBy() == 2) {
            stateTaskQuery.orderByDesc(BaseModel::getCreateTime);
        }
        stateTaskQuery.in(StateTaskCenter::getFlowId, instanceIds);
        PageInfo pageInfo = new PageInfo(processTaskListBO.getPageNum(), processTaskListBO.getPageSize());
        PageInfo<StateTaskCenter> taskCenters = stateTaskCenterService.page(pageInfo,stateTaskQuery);
        //转换类
        List<ProcessTaskListVO> processTaskListVOS = BeanUtil.copyToList(taskCenters.getRecords(), ProcessTaskListVO.class);
        // 查询合同信息
        for (ProcessTaskListVO processTaskListVO : processTaskListVOS) {
            // 查询合同信息
            TContract contract = contractService.getById(JSONObject.parseObject(processTaskListVO.getVariable()).getString("projectId"));
            processTaskListVO.setContract(contract);
        }
        pageInfo.setRecords(processTaskListVOS);
        List<String> updateUserId = processTaskListVOS.stream().map(ProcessTaskListVO::getCreateBy).collect(Collectors.toList());
        Map<Long, SysUser> sysUserMap;
        if (!CollectionUtils.isEmpty(updateUserId)) {
            //根据用户id查询更新人信息
            List<SysUser> sysUsers = sysUserService.selectUserByUserNameList(updateUserId);
            if (!CollectionUtils.isEmpty(sysUsers)) {
                sysUserMap = sysUsers.stream().collect(Collectors.toMap(SysUser::getUserId, Function.identity()));
            } else {
                sysUserMap = new HashMap<>();
            }
        } else {
            sysUserMap = new HashMap<>();
        }
        Map<Long, List<FlwTask>> flwHisTaskMap = flwTasks.stream().collect(Collectors.groupingBy(FlwTask::getInstanceId));
        for (ProcessTaskListVO processTaskListVO : processTaskListVOS) {
            List<FlwTask> flwTask = flwHisTaskMap.get(NumberUtil.parseLong(processTaskListVO.getFlowId()));
            if (!CollectionUtils.isEmpty(flwTask) && ObjectUtil.isNotEmpty(flwTask.get(0))) {
                //待审核
                processTaskListVO.setStatus("0");
                processTaskListVO.setNodeName(flwTask.get(0).getTaskName());
                processTaskListVO.setTaskId(flwTask.get(0).getId().toString());
                processTaskListVO.setVariable(flwTask.get(0).getVariable());
            }
            SysUser sysUser = sysUserMap.get(processTaskListVO.getCreateBy());
            if (Objects.nonNull(sysUser)) {
                processTaskListVO.setCreateBy(sysUser.getNickName());
            }
        }
        return pageInfo;
    }
    @Override
    public PageInfo<ProcessTaskListVO> dealTaskPage(ProcessTaskListBO processTaskListBO) {
@@ -447,6 +587,141 @@
        }
        stateTaskQuery.in(StateTaskCenter::getFlowId, instanceId);
        stateTaskQuery.orderByDesc(BaseModel::getCreateTime);
        PageInfo pageInfo = new PageInfo<>(processTaskListBO.getPageNum(), processTaskListBO.getPageSize());
        PageInfo<StateTaskCenter> taskCenters = stateTaskCenterService.page(pageInfo,stateTaskQuery);
        //转换类
        List<ProcessTaskListVO> processTaskListVOS = BeanUtil.copyToList(taskCenters.getRecords(), ProcessTaskListVO.class);
        // 查询合同信息
        for (ProcessTaskListVO processTaskListVO : processTaskListVOS) {
            // 查询合同信息
            TContract contract = contractService.getById(JSONObject.parseObject(processTaskListVO.getVariable()).getString("projectId"));
            processTaskListVO.setContract(contract);
        }
        pageInfo.setRecords(processTaskListVOS);
        if (ObjectUtil.isEmpty(processTaskListVOS)) {
            return pageInfo;
        }
        Map<Long, List<FlwHisTask>> flwHisTaskMap = flwHisTaskList.stream().collect(Collectors.groupingBy(FlwHisTask::getInstanceId));
        //查询原因
        List<String> taskIds = flwHisTaskList.stream().map(FlowEntity::getId).map(String::valueOf).collect(Collectors.toList());
        List<StateProcessInstanceAction> actions = stateProcessInstanceActionService.list(
                Wrappers.<StateProcessInstanceAction>lambdaQuery().in(StateProcessInstanceAction::getNodeId, taskIds));
        Map<String, StateProcessInstanceAction> actionMap = actions.stream().collect(Collectors.toMap(StateProcessInstanceAction::getNodeId, Function.identity()));
        List<String> updateUserId = processTaskListVOS.stream().map(ProcessTaskListVO::getCreateBy).collect(Collectors.toList());
        Map<Long, SysUser> sysUserMap;
        if (!CollectionUtils.isEmpty(updateUserId)) {
            List<SysUser> sysUsers = sysUserService.selectUserByUserNameList(updateUserId);
            if (!CollectionUtils.isEmpty(sysUsers)) {
                sysUserMap = sysUsers.stream().collect(Collectors.toMap(SysUser::getUserId, Function.identity()));
            } else {
                sysUserMap = new HashMap<>();
            }
        } else {
            sysUserMap = new HashMap<>();
        }
        for (ProcessTaskListVO processTaskListVO : processTaskListVOS) {
            List<FlwHisTask> flwHisTasks = flwHisTaskMap.get(NumberUtil.parseLong(processTaskListVO.getFlowId()));
            if (ObjectUtil.isNotEmpty(flwHisTaskMap)) {
                //当某个用户在同一个模块审批流的多个节点都存在时,多次审核后,已审核列表页报错
                for (FlwHisTask flwHisTask : flwHisTasks) {
                    if (flwHisTask.getInstanceId().toString().equals(processTaskListVO.getFlowId())) {
                        //10等于发起人与审批人一致自动审核完成
                        processTaskListVO.setStatus(flwHisTask.getTaskState() == 10 ? "2" : flwHisTask.getTaskState().toString());
                        processTaskListVO.setNodeName(flwHisTask.getTaskName());
                        processTaskListVO.setTaskId(flwHisTask.getId().toString());
                        processTaskListVO.setVariable(flwHisTask.getVariable());
                    }
                }
            }
            StateProcessInstanceAction action = actionMap.get(processTaskListVO.getTaskId());
            if (ObjectUtil.isNotEmpty(action)) {
                processTaskListVO.setReason(action.getRemark());
            }
            SysUser sysUser = sysUserMap.get(processTaskListVO.getCreateBy());
            if (Objects.nonNull(sysUser)) {
                processTaskListVO.setCreateBy(sysUser.getNickName());
            }
        }
        return pageInfo;
    }
    @Override
    public PageInfo<ProcessTaskListVO> dealTaskPageApplet(ProcessTaskListBO processTaskListBO) {
        String startTime = null;
        String endTime = null;
        if(Objects.nonNull(processTaskListBO.getTimeType())){
            switch (processTaskListBO.getTimeType()){
                case 1:
                    startTime = DateUtil.format(DateUtil.offsetDay(new Date(), -1), "yyyy-MM-dd") + " 00:00:00";
                    endTime = DateUtil.format(DateUtil.offsetDay(new Date(), -1), "yyyy-MM-dd") + " 23:59:59";
                    break;
                case 2:
                    startTime = DateUtil.format(DateUtil.offsetDay(new Date(), -7), "yyyy-MM-dd") + " 00:00:00";
                    endTime = DateUtil.format(DateUtil.offsetDay(new Date(), -1), "yyyy-MM-dd") + " 23:59:59";
                    break;
                case 3:
                    startTime = DateUtil.format(DateUtil.offsetDay(new Date(), -30), "yyyy-MM-dd") + " 00:00:00";
                    endTime = DateUtil.format(DateUtil.offsetDay(new Date(), -1), "yyyy-MM-dd") + " 23:59:59";
                    break;
            }
        }
        //获取当前登录用户信息
        Long userId = SecurityUtils.getLoginUser().getUserId();
        LambdaQueryWrapper<FlwHisTaskActor> query = Wrappers.<FlwHisTaskActor>lambdaQuery()
                .and(qy -> qy.eq(FlwTaskActor::getActorId, userId)
                        //0指定用户
                        .eq(FlwTaskActor::getActorType, 0)
                        //指定角色
                        .or().in(FlwTaskActor::getActorId, userId)
                        .eq(FlwTaskActor::getActorType, 1));
        List<FlwHisTaskActor> flwHisTaskActors = flwHisTaskActorMapper.selectList(query);
        List<Long> hisTaskIds = flwHisTaskActors.stream().map(FlwTaskActor::getTaskId).collect(Collectors.toList());
        if (hisTaskIds.isEmpty()) {
            return new PageInfo<>();
        }
        List<FlwHisTask> flwHisTaskList = flwHisTaskMapper.selectList(
                Wrappers.<FlwHisTask>lambdaQuery()
                        .notIn(FlwHisTask::getTaskType, TaskType.cc.getValue(), TaskType.major.getValue())
                        .orderByDesc(FlwHisTask::getCreateTime)
                        .in(FlwHisTask::getId, hisTaskIds));
        if (ObjectUtil.isEmpty(flwHisTaskList)) {
            new PageInfo<>();
        }
        List<String> instanceId = flwHisTaskList.stream().map(FlwTask::getInstanceId)
                .map(String::valueOf).collect(Collectors.toList());
        //分页查询任务中心任务
        LambdaQueryWrapper<StateTaskCenter> stateTaskQuery = new LambdaQueryWrapper<>();
        if (ObjectUtil.isNotEmpty(processTaskListBO.getName())) {
            stateTaskQuery.like(StateTaskCenter::getName, processTaskListBO.getName());
        }
        if (ObjectUtil.isNotEmpty(processTaskListBO.getModuleName())) {
            stateTaskQuery.like(StateTaskCenter::getModuleName, processTaskListBO.getModuleName());
        }
        if (ObjectUtil.isNotEmpty(processTaskListBO.getCreateBy())) {
            stateTaskQuery.like(StateTaskCenter::getCreateBy, processTaskListBO.getCreateBy());
        }
        if (ObjectUtil.isEmpty(instanceId)) {
            return new PageInfo<>();
        }
        if (ObjectUtil.isNotEmpty(startTime) && ObjectUtil.isNotEmpty(endTime)) {
            stateTaskQuery.between(StateTaskCenter::getCreateTime, startTime, endTime);
        }
        if (processTaskListBO.getSortBy() == 1) {
            stateTaskQuery.orderByAsc(BaseModel::getCreateTime);
        }
        if (processTaskListBO.getSortBy() == 2) {
            stateTaskQuery.orderByDesc(BaseModel::getCreateTime);
        }
        stateTaskQuery.in(StateTaskCenter::getFlowId, instanceId);
        PageInfo pageInfo = new PageInfo<>(processTaskListBO.getPageNum(), processTaskListBO.getPageSize());
        PageInfo<StateTaskCenter> taskCenters = stateTaskCenterService.page(pageInfo,stateTaskQuery);
        //转换类
@@ -759,21 +1034,250 @@
        return processTaskListVOS;
    }
//    @Override
//    public PageInfo<ProcessTaskListVO> dealAndWaitTaskPage(ProcessTaskListBO processTaskListBO) {
//        //获取当前登录用户信息
//        Long userId = SecurityUtils.getLoginUser().getUserId();
//
//        //或签时查询其他审批人是否通过(不能省略),比如 同一任务需要A,B审核,A通过了,B不用在审核了,在历史表查询A的审核记录
//        LambdaQueryWrapper<FlwHisInstance> lambdaQueryWrapper = new LambdaQueryWrapper<>();
//        lambdaQueryWrapper.orderByDesc(FlowEntity::getCreateTime);
//        //待审核,通过,拒绝
//        lambdaQueryWrapper.in(FlwHisInstance::getInstanceState, 0,1,2);
//
//        List<Long> flwHisInstances = flwHisInstanceMapper.selectList(lambdaQueryWrapper).stream()
//                .map(FlwHisInstance::getId).collect(Collectors.toList());
//
//        //查询任务参与者
//        LambdaQueryWrapper<FlwTaskActor> query = new LambdaQueryWrapper<>();
//        query.and(qy -> qy.eq(FlwTaskActor::getActorId, userId)
//                //0指定用户
//                .eq(FlwTaskActor::getActorType, 0)
//                .or().in(FlwTaskActor::getActorId, userId)
//                //1指定角色
//                .eq(FlwTaskActor::getActorType, 1));
//        if (ObjectUtil.isNotNull(processTaskListBO) && ObjectUtil.isNotNull(flwHisInstances)) {
//            // 添加条件
//            query = query.in(FlwTaskActor::getInstanceId, flwHisInstances);
//        }
//        List<FlwTaskActor> flwTaskActorPage = flwTaskActorMapper.selectList(query);
//        List<String> instanceIds = new ArrayList<>();
//        List<FlwTask> flwTasks = new ArrayList<>();
//        if (ObjectUtil.isNotEmpty(flwTaskActorPage)) {
//            //查询任务信息
//            flwTasks = flwTaskMapper.selectList(Wrappers.<FlwTask>lambdaQuery()
//                    .orderByDesc(FlwTask::getCreateTime)
//                    .in(FlwTask::getId, flwTaskActorPage.stream()
//                            .map(FlwTaskActor::getTaskId).collect(Collectors.toList())));
//            if (ObjectUtil.isNotNull(flwTasks)) {
//                instanceIds = flwTasks.stream().map(FlwTask::getInstanceId)
//                        .map(String::valueOf).collect(Collectors.toList());
//            }
//        }
//
//        LambdaQueryWrapper<FlwHisTaskActor> hisQuery= Wrappers.<FlwHisTaskActor>lambdaQuery()
//                .and(qy -> qy.eq(FlwTaskActor::getActorId, userId)
//                        //0指定用户
//                        .eq(FlwTaskActor::getActorType, 0)
//                        //指定角色
//                        .or().in(FlwTaskActor::getActorId, userId)
//                        .eq(FlwTaskActor::getActorType, 1));
//        List<FlwHisTaskActor> flwHisTaskActors = flwHisTaskActorMapper.selectList(hisQuery);
//        List<Long> hisTaskIds = flwHisTaskActors.stream().map(FlwTaskActor::getTaskId).collect(Collectors.toList());
//
//        if (!CollectionUtils.isEmpty(hisTaskIds)) {
//            List<FlwHisTask> flwHisTaskList = flwHisTaskMapper.selectList(
//                    Wrappers.<FlwHisTask>lambdaQuery()
//                            .notIn(FlwHisTask::getTaskType, TaskType.cc.getValue(), TaskType.major.getValue())
//                            .orderByDesc(FlwHisTask::getCreateTime)
//                            .in(FlwHisTask::getId, hisTaskIds));
//            if (ObjectUtil.isNotEmpty(flwHisTaskList)) {
//                instanceIds.addAll(flwHisTaskList.stream().map(FlwHisTask::getInstanceId)
//                        .map(String::valueOf).collect(Collectors.toList()));
//            }
//        }
//
//
//        //分页查询任务中心任务
////        LambdaQueryWrapper<StateTaskCenter> stateTaskQuery = new LambdaQueryWrapper<>();
////        if (ObjectUtil.isNotEmpty(processTaskListBO.getName())) {
////            stateTaskQuery.like(StateTaskCenter::getName, processTaskListBO.getName());
////        }
////        if (ObjectUtil.isNotEmpty(processTaskListBO.getModuleName())) {
////            stateTaskQuery.like(StateTaskCenter::getModuleName, processTaskListBO.getModuleName());
////        }
////        if (ObjectUtil.isNotEmpty(processTaskListBO.getCreateBy())) {
////            stateTaskQuery.like(StateTaskCenter::getCreateBy, processTaskListBO.getCreateBy());
////        }
////        stateTaskQuery.in(StateTaskCenter::getFlowId, instanceIds);
////        stateTaskQuery.orderByDesc(BaseModel::getCreateTime);
//        processTaskListBO.setInstanceIds(instanceIds);
////        PageInfo pageInfo = new PageInfo(processTaskListBO.getPageNum(), processTaskListBO.getPageSize());
////        PageInfo<StateTaskCenter> taskCenters = stateTaskCenterService.page(pageInfo,stateTaskQuery);
////        //转换类
////        List<ProcessTaskListVO> processTaskListVOS = BeanUtil.copyToList(taskCenters.getRecords(), ProcessTaskListVO.class);
////        // 查询合同信息
////        for (ProcessTaskListVO processTaskListVO : processTaskListVOS) {
////            // 查询合同信息
////            TContract contract = contractService.getById(JSONObject.parseObject(processTaskListVO.getVariable()).getString("projectId"));
////            processTaskListVO.setContract(contract);
////        }
////        pageInfo.setRecords(processTaskListVOS);
//
//        PageInfo<ProcessTaskListVO> processTaskListVOS = stateTaskCenterService.pageList(processTaskListBO);
//
//        List<String> updateUserId = processTaskListVOS.getRecords().stream().map(ProcessTaskListVO::getCreateBy).collect(Collectors.toList());
//        Map<Long, SysUser> sysUserMap;
//        if (!CollectionUtils.isEmpty(updateUserId)) {
//            //根据用户id查询更新人信息
//            List<SysUser> sysUsers = sysUserService.selectUserByUserNameList(updateUserId);
//
//            if (!CollectionUtils.isEmpty(sysUsers)) {
//                sysUserMap = sysUsers.stream().collect(Collectors.toMap(SysUser::getUserId, Function.identity()));
//            } else {
//                sysUserMap = new HashMap<>();
//            }
//        } else {
//            sysUserMap = new HashMap<>();
//        }
//
//        Map<Long, List<FlwTask>> flwHisTaskMap = new HashMap<>();
//        if(!CollectionUtils.isEmpty(flwTasks)){
//            flwHisTaskMap = flwTasks.stream().collect(Collectors.groupingBy(FlwTask::getInstanceId));
//        }
//
//        for (ProcessTaskListVO processTaskListVO : processTaskListVOS.getRecords()) {
//            if(!CollectionUtils.isEmpty(flwHisTaskMap)){
//                List<FlwTask> flwTask = flwHisTaskMap.get(NumberUtil.parseLong(processTaskListVO.getFlowId()));
//                if (!CollectionUtils.isEmpty(flwTask) && ObjectUtil.isNotEmpty(flwTask.get(0))) {
//                    //待审核
//                    processTaskListVO.setStatus("0");
//                    processTaskListVO.setNodeName(flwTask.get(0).getTaskName());
//                    processTaskListVO.setTaskId(flwTask.get(0).getId().toString());
//                    processTaskListVO.setVariable(flwTask.get(0).getVariable());
//                }
//            }
//            SysUser sysUser = sysUserMap.get(processTaskListVO.getCreateBy());
//            if (Objects.nonNull(sysUser)) {
//                processTaskListVO.setCreateBy(sysUser.getNickName());
//            }
//        }
//        return processTaskListVOS;
//    }
    @Override
    public ProcessDetailVO detail(String taskId) {
        ProcessDetailVO processDetailVO = new ProcessDetailVO();
        FlwTask flwTask = flwTaskMapper.selectById(Long.valueOf(taskId));
        // 查询合同信息
        TContract contract = contractService.getById(JSONObject.parseObject(flwTask.getVariable()).getString("projectId"));
        TContract contract;
        Long instanceId;
        if(Objects.nonNull(flwTask)){
            instanceId = flwTask.getInstanceId();
            // 查询合同信息
            contract = contractService.getById(JSONObject.parseObject(flwTask.getVariable()).getString("projectId"));
        }else {
            FlwHisTask flwHisTask = flwHisTaskMapper.selectById(Long.valueOf(taskId));
            if(Objects.isNull(flwHisTask)){
                throw new GlobalException("流程不存在");
            }
            instanceId = flwHisTask.getInstanceId();
            contract = contractService.getById(Objects.requireNonNull(JSONObject.parseObject(flwHisTask.getVariable())).getString("projectId"));
        }
        BeanUtil.copyProperties(contract, processDetailVO);
        // 查询历史任务
        List<FlwHisTask> flwHisTasks = flwHisTaskMapper.selectList(Wrappers.<FlwHisTask>lambdaQuery().eq(FlwHisTask::getInstanceId, instanceId));
        processDetailVO.setFlwHisTasks(flwHisTasks);
        List<StateProcessInstanceAction> list = stateProcessInstanceActionService.list(Wrappers.<StateProcessInstanceAction>lambdaQuery().eq(StateProcessInstanceAction::getInstanceId, flwTask.getInstanceId())
                .orderByDesc(StateProcessInstanceAction::getCreateTime));
        for (StateProcessInstanceAction stateProcessInstanceAction : list) {
            SysUser sysUser = sysUserService.selectUserById(Long.valueOf(stateProcessInstanceAction.getAuditorId()));
            if(Objects.nonNull(sysUser)){
                stateProcessInstanceAction.setNickName(sysUser.getNickName());
            }
        }
        processDetailVO.setInstanceActions(list);
        return processDetailVO;
    }
    @Override
    public PageInfo<ProcessTaskListVO> initiateTaskPage(ProcessTaskListBO processTaskListBO) {
        String startTime = null;
        String endTime = null;
        if(Objects.nonNull(processTaskListBO.getTimeType())){
            switch (processTaskListBO.getTimeType()){
                case 1:
                    startTime = DateUtil.format(DateUtil.offsetDay(new Date(), -1), "yyyy-MM-dd") + " 00:00:00";
                    endTime = DateUtil.format(DateUtil.offsetDay(new Date(), -1), "yyyy-MM-dd") + " 23:59:59";
                    break;
                case 2:
                    startTime = DateUtil.format(DateUtil.offsetDay(new Date(), -7), "yyyy-MM-dd") + " 00:00:00";
                    endTime = DateUtil.format(DateUtil.offsetDay(new Date(), -1), "yyyy-MM-dd") + " 23:59:59";
                    break;
                case 3:
                    startTime = DateUtil.format(DateUtil.offsetDay(new Date(), -30), "yyyy-MM-dd") + " 00:00:00";
                    endTime = DateUtil.format(DateUtil.offsetDay(new Date(), -1), "yyyy-MM-dd") + " 23:59:59";
                    break;
            }
        }
        //获取当前登录用户信息
        Long userId = SecurityUtils.getLoginUser().getUserId();
        //分页查询任务中心任务
        LambdaQueryWrapper<FlwHisTask> stateTaskQuery = new LambdaQueryWrapper<>();
        if (ObjectUtil.isNotEmpty(startTime) && ObjectUtil.isNotEmpty(endTime)) {
            stateTaskQuery.between(FlwHisTask::getCreateTime, startTime, endTime);
        }
        if (processTaskListBO.getSortBy() == 1) {
            stateTaskQuery.orderByAsc(FlwHisTask::getCreateTime);
        }
        if (processTaskListBO.getSortBy() == 2) {
            stateTaskQuery.orderByDesc(FlwHisTask::getCreateTime);
        }
        stateTaskQuery.eq(FlwHisTask::getParentTaskId, 0L);
        stateTaskQuery.like(FlwHisTask::getCreateId, userId);
        PageInfo pageInfo = new PageInfo<>(processTaskListBO.getPageNum(), processTaskListBO.getPageSize());
        PageInfo<FlwHisTask> taskCenters = flwHisTaskMapper.selectPage(pageInfo,stateTaskQuery);
        //转换类
        List<ProcessTaskListVO> processTaskListVOS = BeanUtil.copyToList(taskCenters.getRecords(), ProcessTaskListVO.class);
        // 查询合同信息
        for (ProcessTaskListVO processTaskListVO : processTaskListVOS) {
            // 查询合同信息
            TContract contract = contractService.getById(JSONObject.parseObject(processTaskListVO.getVariable()).getString("projectId"));
            processTaskListVO.setContract(contract);
        }
        pageInfo.setRecords(processTaskListVOS);
        if (ObjectUtil.isEmpty(processTaskListVOS)) {
            return pageInfo;
        }
        List<String> updateUserId = processTaskListVOS.stream().map(ProcessTaskListVO::getCreateBy).collect(Collectors.toList());
        Map<Long, SysUser> sysUserMap;
        if (!CollectionUtils.isEmpty(updateUserId)) {
            List<SysUser> sysUsers = sysUserService.selectUserByUserNameList(updateUserId);
            if (!CollectionUtils.isEmpty(sysUsers)) {
                sysUserMap = sysUsers.stream().collect(Collectors.toMap(SysUser::getUserId, Function.identity()));
            } else {
                sysUserMap = new HashMap<>();
            }
        } else {
            sysUserMap = new HashMap<>();
        }
        for (ProcessTaskListVO processTaskListVO : processTaskListVOS) {
            SysUser sysUser = sysUserMap.get(processTaskListVO.getCreateBy());
            if (Objects.nonNull(sysUser)) {
                processTaskListVO.setCreateBy(sysUser.getNickName());
            }
        }
        return pageInfo;
    }
    private FlowCreator currentFlowCreator() {
        LoginUser loginUser = SecurityUtils.getLoginUser();
        if (null == loginUser || null == loginUser.getUser().getUserId()) {
ruoyi-system/src/main/java/com/ruoyi/system/vo/ProcessDetailVO.java
@@ -1,5 +1,6 @@
package com.ruoyi.system.vo;
import com.aizuda.bpm.engine.entity.FlwHisTask;
import com.ruoyi.system.model.StateProcessInstanceAction;
import com.ruoyi.system.model.TContract;
import io.swagger.annotations.ApiModel;
@@ -14,4 +15,7 @@
    @ApiModelProperty(value = "操作记录集合")
    private List<StateProcessInstanceAction> instanceActions;
    @ApiModelProperty(value = "历史任务")
    private List<FlwHisTask> flwHisTasks;
}
ruoyi-system/src/main/resources/mapper/system/StateTaskCenterMapper.xml
@@ -52,7 +52,7 @@
                AND tc.contract_name like concat('%',#{query.contractName},'%')
            </if>
            <if test="query.status != null and query.status !=''">
                AND tc.status like concat('%',#{query.status},'%')
                AND tc.status = #{query.status}
            </if>
            AND tc.disabled = ${@com.ruoyi.common.enums.DisabledEnum@NO.getCode()}
        </where>
ruoyi-system/src/main/resources/mapper/system/TContractMapper.xml
@@ -60,8 +60,8 @@
                and t1.status = #{query.status}
            </if>
            AND t1.disabled = ${@com.ruoyi.common.enums.DisabledEnum@NO.getCode()}
        </where>
        order by t1.create_time desc
    </select>
    <select id="contractAppletList" resultType="com.ruoyi.system.model.TContract">
        select t1.* from t_contract t1