无关风月
1 天以前 d8ad5605a031477c252e029149a4735a1a20ffbd
保洁巡检本周代码
29个文件已修改
1812 ■■■■■ 已修改文件
ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/DataStatisticsController.java 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/ReportController.java 380 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/TAppealController.java 35 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/TDictDataController.java 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/TInspectorController.java 66 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/TLocationController.java 40 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/TProblemEscalationController.java 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/TTaskController.java 77 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/WorkbenchesController.java 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysRoleController.java 15 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysUserController.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/web/controller/task/TaskUtil.java 726 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-applet/src/main/java/com/ruoyi/web/controller/api/TIndexController.java 125 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-applet/src/main/java/com/ruoyi/web/controller/api/TTaskDetailController.java 57 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-applet/src/main/java/com/ruoyi/web/controller/api/TUserController.java 135 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/applet/vo/TaskListAllVO.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/dto/SysRoleDTO.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/dto/TTaskAuditBatchDTO.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/model/TDictData.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/query/PatrolInspectorQuery.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysRoleServiceImpl.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TAppealServiceImpl.java 33 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TTaskCleanServiceImpl.java 26 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/vo/system/AppealDetailVO.java 4 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/vo/system/RoleInfoVO.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/vo/system/TaskDetailVO.java 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/resources/mapper/system/SysRoleMapper.xml 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/resources/mapper/system/TAppealMapper.xml 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/resources/mapper/system/TTaskMapper.xml 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/DataStatisticsController.java
@@ -619,6 +619,15 @@
                    .eq(TTaskDetail::getClearStatus, 2)
                    .eq(TTaskDetail::getHandleType,1)
                    .orderByDesc(TTaskDetail::getCreateTime));
            taskDetails = new ArrayList<>(taskDetails.stream()
                    .collect(Collectors.groupingBy(
                            TTaskDetail::getTaskId,
                            Collectors.collectingAndThen(
                                    Collectors.toList(),
                                    listAll -> listAll.get(0)
                            )
                    ))
                    .values());
            List<TTaskDetail> taskDetailList = new ArrayList<>();
            for (TTask task : list) {
                TTaskDetail tTaskDetail = taskDetails.stream().filter(taskDetail -> taskDetail.getTaskId().equals(task.getId())).findFirst().orElse(null);
@@ -691,6 +700,15 @@
                    .eq(TTaskDetail::getHandleType,1)
                    .eq(TTaskDetail::getClearStatus, 2)
                    .orderByDesc(TTaskDetail::getCreateTime));
            taskDetails = new ArrayList<>(taskDetails.stream()
                    .collect(Collectors.groupingBy(
                            TTaskDetail::getTaskId,
                            Collectors.collectingAndThen(
                                    Collectors.toList(),
                                    listAll -> listAll.get(0)
                            )
                    ))
                    .values());
            List<TTaskDetail> taskDetailList = new ArrayList<>();
            for (TTask task : list) {
                TTaskDetail tTaskDetail = taskDetails.stream().filter(taskDetail -> taskDetail.getTaskId().equals(task.getId())).findFirst().orElse(null);
ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/ReportController.java
@@ -228,7 +228,7 @@
        return R.ok(progressListVOPageInfo);
    }
    @ApiOperation(value = "任务进度导出")
    @Log(title = "任务进度导出", businessType = BusinessType.EXPORT)
    @Log(title = "任务进度导出", businessType = BusinessType.OTHER)
    @PostMapping(value = "/taskProgressExport")
    public void taskProgressExport(@RequestBody TaskProgressQuery query) {
        List<SysUser> sysUsers = sysUserService.selectAllList();
@@ -440,64 +440,65 @@
                                && locationIds.contains(e.getLocationId())).collect(Collectors.toList());
                        Integer count = taskList.size();
                        temp.setLocationNum(count);
                        int total = taskList.size();
                        int num1 = 0;
                        int num2 = 0;
                        int num3 = 0;
                        int num4 = 0;
                        int num5 = 0;
                        int num6 = 0;
                        int num7 = 0;
                        for (TTask tTask : taskList) {
                            TTaskDetail tTaskDetail = taskDetails.stream().filter(e -> e.getTaskId().equals(tTask.getId()) && e.getClearStatus() != null).findFirst().orElse(null);
                            if (tTaskDetail!=null){
                                switch (tTaskDetail.getClearStatus()) {
                                    case 1:
                                        num1++;
                                        break;
                                    case 2:
                                        num2++;
                                        break;
                                }
                            }
                            // 任务状态:1未执行、2超时、3待确认、4待整改、5整改完成、6已完成
                            switch (tTask.getStatus()) {
                                case 1:
                                    if (tTaskDetail == null) {
                                        num3++;
                                    }
                                    break;
                                case 2:
                                    num6++;
                                    break;
                                case 3:
                                    break;
                                case 4:
                                    num4++;
                                    break;
                                case 5:
                                    num7++;
                                    break;
                                case 6:
                                    num5++;
                                    break;
                            }
                        }
                        projectDeptDetailsChildVO.setTotal(total);
                        projectDeptDetailsChildVO.setNum1(num1);
                        projectDeptDetailsChildVO.setNum2(num2);
                        projectDeptDetailsChildVO.setNum3(num3);
                        projectDeptDetailsChildVO.setNum4(num4);
                        projectDeptDetailsChildVO.setNum5(num5);
                        projectDeptDetailsChildVO.setNum6(num6);
                        projectDeptDetailsChildVO.setNum7(num7);
                    }
                    locationTypeListByProjectVOS1.add(temp);
                }
                List<TTask> taskList = tasks.stream().filter(e -> e.getProjectId().equals(projectDeptDetailsChildVO.getProjectId())
                        ).collect(Collectors.toList());
                int total = taskList.size();
                int num1 = 0;
                int num2 = 0;
                int num3 = 0;
                int num4 = 0;
                int num5 = 0;
                int num6 = 0;
                int num7 = 0;
                for (TTask tTask : taskList) {
                    TTaskDetail tTaskDetail = taskDetails.stream().filter(e -> e.getTaskId().equals(tTask.getId()) && e.getClearStatus() != null).findFirst().orElse(null);
                    if (tTaskDetail!=null&&(tTask.getStatus()==5||tTask.getStatus()==6)){
                        switch (tTaskDetail.getClearStatus()) {
                            case 1:
                                num1++;
                                break;
                            case 2:
                                num2++;
                                break;
                        }
                    }
                    // 任务状态:1未执行、2超时、3待确认、4待整改、5整改完成、6已完成
                    switch (tTask.getStatus()) {
                        case 1:
                            if (tTaskDetail == null) {
                                num3++;
                            }
                            break;
                        case 2:
                            num6++;
                            break;
                        case 3:
                            break;
                        case 4:
                            num4++;
                            break;
                        case 5:
                            num7++;
                            break;
                        case 6:
                            num5++;
                            break;
                    }
                }
                projectDeptDetailsChildVO.setTotal(total);
                projectDeptDetailsChildVO.setNum1(num1);
                projectDeptDetailsChildVO.setNum2(num2);
                projectDeptDetailsChildVO.setNum3(num3);
                projectDeptDetailsChildVO.setNum4(num4);
                projectDeptDetailsChildVO.setNum5(num5);
                projectDeptDetailsChildVO.setNum6(num6);
                projectDeptDetailsChildVO.setNum7(num7);
                projectDeptDetailsChildVO.setLocationTypeList(locationTypeListByProjectVOS1);
            }
        }
        return R.ok(res);
    }
@@ -547,73 +548,82 @@
            locationTypeListByProjectVOS.add(locationTypeListByProjectVO);
        }
        for (ProjectDeptDetailsVO re : res) {
            List<ProjectDeptDetailsChildVO> projectChild = re.getProjectChild();
            for (ProjectDeptDetailsChildVO projectDeptDetailsChildVO : projectChild) {
            for (ProjectDeptDetailsChildVO projectDeptDetailsChildVO : re.getProjectChild()) {
                int cleanerCount = cleanerService.lambdaQuery().eq(TCleaner::getProjectId, projectDeptDetailsChildVO.getProjectId()).list().size();
                projectDeptDetailsChildVO.setCleanerCount(cleanerCount);
                List<LocationTypeListByProjectVO> locationTypeListByProjectVOS1 = new ArrayList<>();
                for (LocationTypeListByProjectVO locationTypeListByProjectVO : locationTypeListByProjectVOS) {
                    List<String> locationIds = locations.stream().filter(e -> e.getLocationType().equals(locationTypeListByProjectVO.getId())).map(TLocation::getId).collect(Collectors.toList());
                    LocationTypeListByProjectVO temp = new LocationTypeListByProjectVO();
                    BeanUtils.copyProperties(locationTypeListByProjectVO, temp);
                    List<String> locationIds = locations.stream().filter(e ->
                                    e.getProjectId().equals(projectDeptDetailsChildVO.getProjectId())&&
                                            e.getLocationType().equals(locationTypeListByProjectVO.getId()))
                            .map(TLocation::getId).collect(Collectors.toList());
                    if (locationIds.isEmpty()) {
                        locationTypeListByProjectVO.setLocationNum(0);
                    } else {
                        List<TTask> taskList = tasks.stream().filter(e -> e.getProjectId().equals(projectDeptDetailsChildVO.getProjectId())
                                && locationIds.contains(e.getLocationId())).collect(Collectors.toList());
                        Integer count = taskList.size();
                        locationTypeListByProjectVO.setLocationNum(count);
                        int total = taskList.size();
                        int num1 = 0;
                        int num2 = 0;
                        int num3 = 0;
                        int num4 = 0;
                        int num5 = 0;
                        int num6 = 0;
                        int num7 = 0;
                        for (TTask tTask : taskList) {
                            TTaskDetail tTaskDetail = taskDetails.stream().filter(e -> e.getTaskId().equals(tTask.getId()) && e.getClearStatus() != null).findFirst().orElse(null);
                            if (tTaskDetail!=null){
                                switch (tTaskDetail.getClearStatus()) {
                                    case 1:
                                        num1++;
                                        break;
                                    case 2:
                                        num2++;
                                        break;
                                }
                            }
                            // 任务状态:1未执行、2超时、3待确认、4待整改、5整改完成、6已完成
                            switch (tTask.getStatus()) {
                                case 1:
                                    if (tTaskDetail == null) {
                                        num3++;
                                    }
                                    break;
                                case 2:
                                    num6++;
                                    break;
                                case 3:
                                    break;
                                case 4:
                                    num4++;
                                    break;
                                case 5:
                                    num7++;
                                    break;
                                case 6:
                                    num5++;
                                    break;
                            }
                        temp.setLocationNum(count);
                    }
                    locationTypeListByProjectVOS1.add(temp);
                }
                List<TTask> taskList = tasks.stream().filter(e -> e.getProjectId().equals(projectDeptDetailsChildVO.getProjectId())
                ).collect(Collectors.toList());
                int total = taskList.size();
                int num1 = 0;
                int num2 = 0;
                int num3 = 0;
                int num4 = 0;
                int num5 = 0;
                int num6 = 0;
                int num7 = 0;
                for (TTask tTask : taskList) {
                    TTaskDetail tTaskDetail = taskDetails.stream().filter(e -> e.getTaskId().equals(tTask.getId()) && e.getClearStatus() != null).findFirst().orElse(null);
                    if (tTaskDetail!=null&&(tTask.getStatus()==5||tTask.getStatus()==6)){
                        switch (tTaskDetail.getClearStatus()) {
                            case 1:
                                num1++;
                                break;
                            case 2:
                                num2++;
                                break;
                        }
                        projectDeptDetailsChildVO.setTotal(total);
                        projectDeptDetailsChildVO.setNum1(num1);
                        projectDeptDetailsChildVO.setNum2(num2);
                        projectDeptDetailsChildVO.setNum3(num3);
                        projectDeptDetailsChildVO.setNum4(num4);
                        projectDeptDetailsChildVO.setNum5(num5);
                        projectDeptDetailsChildVO.setNum6(num6);
                        projectDeptDetailsChildVO.setNum7(num7);
                    }
                    // 任务状态:1未执行、2超时、3待确认、4待整改、5整改完成、6已完成
                    switch (tTask.getStatus()) {
                        case 1:
                            if (tTaskDetail == null) {
                                num3++;
                            }
                            break;
                        case 2:
                            num6++;
                            break;
                        case 3:
                            break;
                        case 4:
                            num4++;
                            break;
                        case 5:
                            num7++;
                            break;
                        case 6:
                            num5++;
                            break;
                    }
                }
                projectDeptDetailsChildVO.setLocationTypeList(locationTypeListByProjectVOS);
                projectDeptDetailsChildVO.setTotal(total);
                projectDeptDetailsChildVO.setNum1(num1);
                projectDeptDetailsChildVO.setNum2(num2);
                projectDeptDetailsChildVO.setNum3(num3);
                projectDeptDetailsChildVO.setNum4(num4);
                projectDeptDetailsChildVO.setNum5(num5);
                projectDeptDetailsChildVO.setNum6(num6);
                projectDeptDetailsChildVO.setNum7(num7);
                projectDeptDetailsChildVO.setLocationTypeList(locationTypeListByProjectVOS1);
            }
        }
@@ -724,9 +734,20 @@
            if (projectIds.isEmpty()){
                return R.ok(new ArrayList<>());
            }
            query.setDeptIds(projectIds);
            if (StringUtils.hasLength(query.getPhonenumber())){
                List<Long> patrolInspectorIds = sysUsers.stream().filter(sysUser ->
                        sysUser.getPhonenumber().equals(query.getPhonenumber())
                                && projectIds.contains(sysUser.getDeptId())
                ).map(SysUser::getUserId).collect(Collectors.toList());
                if (patrolInspectorIds.isEmpty()){
                    return R.ok(new ArrayList<>());
                }
                query.setPatrolInspectorIds(patrolInspectorIds);
            }
            if (StringUtils.hasLength(query.getNickName())){
                List<Long> patrolInspectorIds = sysUsers.stream().filter(sysUser ->
                        sysUser.getNickName().contains(query.getNickName())
                                && projectIds.contains(sysUser.getDeptId())
                ).map(SysUser::getUserId).collect(Collectors.toList());
                if (patrolInspectorIds.isEmpty()){
@@ -739,7 +760,33 @@
            List<Long> patrolInspectorIds = sysUsers.stream().filter(sysUser ->
                    sysUser.getPhonenumber().equals(query.getPhonenumber())
            ).map(SysUser::getUserId).collect(Collectors.toList());
            if (!query.getPatrolInspectorIds().isEmpty()){
            if (query.getPatrolInspectorIds()!=null&&!query.getPatrolInspectorIds().isEmpty()){
                // 取交集
                patrolInspectorIds = patrolInspectorIds.stream().filter(query.getPatrolInspectorIds()::contains).collect(Collectors.toList());
            }
            query.setPatrolInspectorIds(patrolInspectorIds);
            if (patrolInspectorIds.isEmpty()){
                return R.ok(new ArrayList<>());
            }
        }
        if (StringUtils.hasLength(query.getNickName())){
            List<Long> patrolInspectorIds = sysUsers.stream().filter(sysUser ->
                    sysUser.getNickName().contains(query.getNickName())
            ).map(SysUser::getUserId).collect(Collectors.toList());
            if (query.getPatrolInspectorIds()!=null&&!query.getPatrolInspectorIds().isEmpty()){
                // 取交集
                patrolInspectorIds = patrolInspectorIds.stream().filter(query.getPatrolInspectorIds()::contains).collect(Collectors.toList());
            }
            query.setPatrolInspectorIds(patrolInspectorIds);
            if (patrolInspectorIds.isEmpty()){
                return R.ok(new ArrayList<>());
            }
        }
        if (query.getDeptIds()!=null&&!query.getDeptIds().isEmpty()){
            List<Long> patrolInspectorIds = sysUsers.stream().filter(sysUser ->
                    query.getDeptIds().contains(sysUser.getDeptId())
            ).map(SysUser::getUserId).collect(Collectors.toList());
            if (query.getPatrolInspectorIds()!=null&&!query.getPatrolInspectorIds().isEmpty()){
                // 取交集
                patrolInspectorIds = patrolInspectorIds.stream().filter(query.getPatrolInspectorIds()::contains).collect(Collectors.toList());
            }
@@ -751,10 +798,10 @@
        List<PatrolInspectorVO> res = new ArrayList<>();
        LambdaQueryWrapper<TTask> tTaskLambdaQueryWrapper = new LambdaQueryWrapper<>();
        if (StringUtils.hasLength(query.getStartTime())){
            tTaskLambdaQueryWrapper.ge(TTask::getCreateTime, query.getStartTime()+" :00:00:00");
            tTaskLambdaQueryWrapper.le(TTask::getCreateTime, query.getEndTime()+" :23:59:59");
            tTaskLambdaQueryWrapper.ge(TTask::getImplementTime, query.getStartTime()+" :00:00:00");
            tTaskLambdaQueryWrapper.le(TTask::getImplementTime, query.getEndTime()+" :23:59:59");
        }
        if(query.getPatrolInspectorIds()!=null){
        if(query.getPatrolInspectorIds()!=null&& !query.getPatrolInspectorIds().isEmpty()){
            tTaskLambdaQueryWrapper.in(TTask::getPatrolInspector, query.getPatrolInspectorIds());
            sysUsers = sysUsers.stream().filter(sysUser -> query.getPatrolInspectorIds().contains(sysUser.getUserId())).collect(Collectors.toList());
        }
@@ -796,8 +843,18 @@
            }
            List<TTaskDetail> list = taskDetailService.lambdaQuery()
                    .eq(TTaskDetail::getAuditStatus, 1)
                    .eq(TTaskDetail::getHandleType,1)
                    .isNotNull(TTaskDetail::getClearStatus).orderByDesc(BaseModel::getCreateTime)
                    .in(!taskIds.isEmpty(), TTaskDetail::getTaskId,taskIdsFinish).groupBy(TTaskDetail::getTaskId).list();
                    .in(!taskIds.isEmpty(), TTaskDetail::getTaskId,taskIdsFinish).list();
            list = new ArrayList<>(list.stream()
                    .collect(Collectors.groupingBy(
                            TTaskDetail::getTaskId,
                            Collectors.collectingAndThen(
                                    Collectors.toList(),
                                    listAll -> listAll.get(0)
                            )
                    ))
                    .values());
            // 查询clearStatus为1的数量
            List<TTaskDetail> clearStatus1 = list.stream().filter(e -> e.getClearStatus().equals(1)).collect(Collectors.toList());
            List<TTaskDetail> clearStatus2 = list.stream().filter(e -> e.getClearStatus().equals(2)).collect(Collectors.toList());
@@ -806,8 +863,8 @@
            patrolInspectorVO.setNum1(clearStatus1.size());
            patrolInspectorVO.setNum2(clearStatus2.size());
            patrolInspectorVO.setNum3(!clearStatus1.isEmpty() ?
                    (new BigDecimal(clearStatus1.size()).add(new BigDecimal(clearStatus2.size())))
                            .divide(new BigDecimal(clearStatus1.size()), 2, RoundingMode.HALF_DOWN)
                    (new BigDecimal(clearStatus1.size()))
                            .divide(new BigDecimal(clearStatus1.size()+clearStatus2.size()), 2, RoundingMode.HALF_DOWN)
                            .multiply(new BigDecimal(100)):BigDecimal.ZERO);
            // 未执行
            List<TTask> status1 = taskList.stream().filter(e -> e.getStatus() == 1).collect(Collectors.toList());
@@ -834,13 +891,13 @@
    }
    @ApiOperation(value = "巡检人员报表导出")
    @PostMapping(value = "/patrolInspectorListExport")
    @Log(title = "巡检人员报表导出", businessType = BusinessType.EXPORT)
    @Log(title = "巡检人员报表导出", businessType = BusinessType.OTHER)
    public void patrolInspectorListExport(@RequestBody PatrolInspectorQuery query) {
        List<SysUser> sysUsers = sysUserService.selectAllList();
        LambdaQueryWrapper<TLeave> tLeaveLambdaQueryWrapper = new LambdaQueryWrapper<>();
        if (StringUtils.hasLength(query.getStartTime())){
            tLeaveLambdaQueryWrapper.ge(TLeave::getCreateTime, query.getStartTime());
            tLeaveLambdaQueryWrapper.le(TLeave::getCreateTime, query.getEndTime());
            tLeaveLambdaQueryWrapper.ge(TLeave::getCreateTime, query.getStartTime()+" :00:00:00");
            tLeaveLambdaQueryWrapper.le(TLeave::getCreateTime, query.getEndTime()+" :23:59:59");
        }
        tLeaveLambdaQueryWrapper.eq(TLeave::getAuditStatus,2);
        List<TLeave> leaves = leaveService.list(tLeaveLambdaQueryWrapper);
@@ -851,11 +908,22 @@
                    .stream().map(TDept::getId).collect(Collectors.toList());
            projectIds.addAll(deptIds);
            if (projectIds.isEmpty()){
                projectIds.add("0");
                projectIds.add("-1");
            }
            query.setDeptIds(projectIds);
            if (StringUtils.hasLength(query.getPhonenumber())){
                List<Long> patrolInspectorIds = sysUsers.stream().filter(sysUser ->
                        sysUser.getPhonenumber().equals(query.getPhonenumber())
                                && projectIds.contains(sysUser.getDeptId())
                ).map(SysUser::getUserId).collect(Collectors.toList());
                if (patrolInspectorIds.isEmpty()){
                    patrolInspectorIds.add(0L);
                }
                query.setPatrolInspectorIds(patrolInspectorIds);
            }
            if (StringUtils.hasLength(query.getNickName())){
                List<Long> patrolInspectorIds = sysUsers.stream().filter(sysUser ->
                        sysUser.getNickName().contains(query.getNickName())
                                && projectIds.contains(sysUser.getDeptId())
                ).map(SysUser::getUserId).collect(Collectors.toList());
                if (patrolInspectorIds.isEmpty()){
@@ -868,7 +936,33 @@
            List<Long> patrolInspectorIds = sysUsers.stream().filter(sysUser ->
                    sysUser.getPhonenumber().equals(query.getPhonenumber())
            ).map(SysUser::getUserId).collect(Collectors.toList());
            if (!query.getPatrolInspectorIds().isEmpty()){
            if (query.getPatrolInspectorIds()!=null&&!query.getPatrolInspectorIds().isEmpty()){
                // 取交集
                patrolInspectorIds = patrolInspectorIds.stream().filter(query.getPatrolInspectorIds()::contains).collect(Collectors.toList());
            }
            query.setPatrolInspectorIds(patrolInspectorIds);
            if (patrolInspectorIds.isEmpty()){
                patrolInspectorIds.add(0L);
            }
        }
        if (StringUtils.hasLength(query.getNickName())){
            List<Long> patrolInspectorIds = sysUsers.stream().filter(sysUser ->
                    sysUser.getNickName().contains(query.getNickName())
            ).map(SysUser::getUserId).collect(Collectors.toList());
            if (query.getPatrolInspectorIds()!=null&&!query.getPatrolInspectorIds().isEmpty()){
                // 取交集
                patrolInspectorIds = patrolInspectorIds.stream().filter(query.getPatrolInspectorIds()::contains).collect(Collectors.toList());
            }
            query.setPatrolInspectorIds(patrolInspectorIds);
            if (patrolInspectorIds.isEmpty()){
                patrolInspectorIds.add(0L);
            }
        }
        if (query.getDeptIds()!=null&&!query.getDeptIds().isEmpty()){
            List<Long> patrolInspectorIds = sysUsers.stream().filter(sysUser ->
                    query.getDeptIds().contains(sysUser.getDeptId())
            ).map(SysUser::getUserId).collect(Collectors.toList());
            if (query.getPatrolInspectorIds()!=null&&!query.getPatrolInspectorIds().isEmpty()){
                // 取交集
                patrolInspectorIds = patrolInspectorIds.stream().filter(query.getPatrolInspectorIds()::contains).collect(Collectors.toList());
            }
@@ -880,16 +974,15 @@
        List<PatrolInspectorVO> res = new ArrayList<>();
        LambdaQueryWrapper<TTask> tTaskLambdaQueryWrapper = new LambdaQueryWrapper<>();
        if (StringUtils.hasLength(query.getStartTime())){
            tTaskLambdaQueryWrapper.ge(TTask::getCreateTime, query.getStartTime());
            tTaskLambdaQueryWrapper.le(TTask::getCreateTime, query.getEndTime());
            tTaskLambdaQueryWrapper.ge(TTask::getImplementTime, query.getStartTime()+" :00:00:00");
            tTaskLambdaQueryWrapper.le(TTask::getImplementTime, query.getEndTime()+" :23:59:59");
        }
        if(query.getPatrolInspectorIds()!=null){
        if(query.getPatrolInspectorIds()!=null&& !query.getPatrolInspectorIds().isEmpty()){
            tTaskLambdaQueryWrapper.in(TTask::getPatrolInspector, query.getPatrolInspectorIds());
            sysUsers = sysUsers.stream().filter(sysUser -> query.getPatrolInspectorIds().contains(sysUser.getUserId())).collect(Collectors.toList());
        }
        List<TTask> tasks = taskCleanerService.list(tTaskLambdaQueryWrapper);
        sysUsers = sysUsers.stream().filter(e -> e.getUserId() != 1).collect(Collectors.toList());
        for (SysUser sysUser : sysUsers) {
            PatrolInspectorVO patrolInspectorVO = new PatrolInspectorVO();
@@ -901,14 +994,14 @@
                if (tProjectDept!=null&&!tProjectDept.getParentId().equals("0")){
                    TProjectDept tProjectDept1 = projectDeptService.getById(tProjectDept.getParentId());
                    if (tProjectDept1!=null)
                    patrolInspectorVO.setDeptName(tProjectDept1.getProjectName()+">"+tProjectDept.getProjectName());
                        patrolInspectorVO.setDeptName(tProjectDept1.getProjectName()+">"+tProjectDept.getProjectName());
                }else{
                    patrolInspectorVO.setDeptName(tProjectDept.getProjectName());
                }
            }else{
                TDept tDept = deptService.getById(sysUser.getDeptId());
                if (tDept!=null)
                patrolInspectorVO.setDeptName(tDept.getDeptName());
                    patrolInspectorVO.setDeptName(tDept.getDeptName());
            }
            // 查询巡检员任务ids
            List<String> taskIds = tasks.stream().filter(e->e.getPatrolInspector().equals(sysUser.getUserId()+"")).map(TTask::getId).collect(Collectors.toList());
@@ -926,8 +1019,18 @@
            }
            List<TTaskDetail> list = taskDetailService.lambdaQuery()
                    .eq(TTaskDetail::getAuditStatus, 1)
                    .eq(TTaskDetail::getHandleType,1)
                    .isNotNull(TTaskDetail::getClearStatus).orderByDesc(BaseModel::getCreateTime)
                    .in(!taskIds.isEmpty(), TTaskDetail::getTaskId,taskIdsFinish).groupBy(TTaskDetail::getTaskId).list();
                    .in(!taskIds.isEmpty(), TTaskDetail::getTaskId,taskIdsFinish).list();
            list = new ArrayList<>(list.stream()
                    .collect(Collectors.groupingBy(
                            TTaskDetail::getTaskId,
                            Collectors.collectingAndThen(
                                    Collectors.toList(),
                                    listAll -> listAll.get(0)
                            )
                    ))
                    .values());
            // 查询clearStatus为1的数量
            List<TTaskDetail> clearStatus1 = list.stream().filter(e -> e.getClearStatus().equals(1)).collect(Collectors.toList());
            List<TTaskDetail> clearStatus2 = list.stream().filter(e -> e.getClearStatus().equals(2)).collect(Collectors.toList());
@@ -936,8 +1039,8 @@
            patrolInspectorVO.setNum1(clearStatus1.size());
            patrolInspectorVO.setNum2(clearStatus2.size());
            patrolInspectorVO.setNum3(!clearStatus1.isEmpty() ?
                    (new BigDecimal(clearStatus1.size()).add(new BigDecimal(clearStatus2.size())))
                            .divide(new BigDecimal(clearStatus1.size()), 2, RoundingMode.HALF_DOWN)
                    (new BigDecimal(clearStatus1.size()))
                            .divide(new BigDecimal(clearStatus1.size()+clearStatus2.size()), 2, RoundingMode.HALF_DOWN)
                            .multiply(new BigDecimal(100)):BigDecimal.ZERO);
            // 未执行
            List<TTask> status1 = taskList.stream().filter(e -> e.getStatus() == 1).collect(Collectors.toList());
@@ -1027,6 +1130,11 @@
            tTaskLambdaQueryWrapper.le(TInspector::getCreateTime, query.getEndTime());
        }
        if(query.getPatrolInspectorIds()!=null){
            if (query.getPatrolInspectorIds().isEmpty()){
                List<Long> patrolInspectorIds = query.getPatrolInspectorIds();
                patrolInspectorIds.add(0L);
                query.setPatrolInspectorIds(patrolInspectorIds);
            }
            tTaskLambdaQueryWrapper.in(TInspector::getCommitPerson, query.getPatrolInspectorIds());
            sysUsers = sysUsers.stream().filter(sysUser -> query.getPatrolInspectorIds().contains(sysUser.getUserId())).collect(Collectors.toList());
        }
@@ -1071,7 +1179,7 @@
    }
    @ApiOperation(value = "随机督察报表导出")
    @PostMapping(value = "/inspectorListExport")
    @Log(title = "随机督察报表导出", businessType = BusinessType.EXPORT)
    @Log(title = "随机督察报表导出", businessType = BusinessType.OTHER)
    public void inspectorListExport(@RequestBody InspectorQuery query) {
        List<SysUser> sysUsers = sysUserService.selectAllList();
        if (StringUtils.hasLength(query.getDeptName())){
@@ -1115,13 +1223,17 @@
            tTaskLambdaQueryWrapper.le(TInspector::getCreateTime, query.getEndTime());
        }
        if(query.getPatrolInspectorIds()!=null){
            if (query.getPatrolInspectorIds().isEmpty()){
                List<Long> patrolInspectorIds = query.getPatrolInspectorIds();
                patrolInspectorIds.add(0L);
                query.setPatrolInspectorIds(patrolInspectorIds);
            }
            tTaskLambdaQueryWrapper.in(TInspector::getCommitPerson, query.getPatrolInspectorIds());
            sysUsers = sysUsers.stream().filter(sysUser -> query.getPatrolInspectorIds().contains(sysUser.getUserId())).collect(Collectors.toList());
        }
        List<InspectorVO> res = new ArrayList<>();
        List<TInspector> inspectors = inspectorService.list(tTaskLambdaQueryWrapper);
        sysUsers = sysUsers.stream().filter(e -> e.getUserId() != 1).collect(Collectors.toList());
        for (SysUser sysUser : sysUsers) {
            InspectorVO inspectorVO = new InspectorVO();
            inspectorVO.setNickName(sysUser.getNickName());
@@ -1149,11 +1261,11 @@
            inspectorVO.setNum1(status1.size());
            inspectorVO.setNum2(status2.size());
            inspectorVO.setNum3(!status1.isEmpty()?new BigDecimal(status1.size()).divide(new BigDecimal(status2.size()+status1.size()),2,RoundingMode.HALF_DOWN).multiply(new BigDecimal(100)):BigDecimal.ZERO);
            inspectorVO.setNum3(!status1.isEmpty()||!status2.isEmpty()?new BigDecimal(status1.size()).divide(new BigDecimal(status2.size()+status1.size()),2,RoundingMode.HALF_DOWN).multiply(new BigDecimal(100)):BigDecimal.ZERO);
            inspectorVO.setNum4(status4.size());
            inspectorVO.setNum5(status5.size());
            inspectorVO.setNum6(status6.size());
            inspectorVO.setNum7(!status6.isEmpty()?new BigDecimal(status6.size()).divide(new BigDecimal(status5.size()+status6.size()),2,RoundingMode.HALF_DOWN).multiply(new BigDecimal(100)):new BigDecimal(0));
            inspectorVO.setNum7(!status6.isEmpty()||!status5.isEmpty()?new BigDecimal(status6.size()).divide(new BigDecimal(status5.size()+status6.size()),2,RoundingMode.HALF_DOWN).multiply(new BigDecimal(100)):new BigDecimal(0));
            res.add(inspectorVO);
        }
        //1.获取excel模板
ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/TAppealController.java
@@ -3,6 +3,7 @@
import com.ruoyi.common.annotation.Log;
import com.ruoyi.common.basic.PageInfo;
import com.ruoyi.common.core.domain.BaseModel;
import com.ruoyi.common.core.domain.R;
import com.ruoyi.common.core.domain.entity.SysUser;
import com.ruoyi.common.enums.BusinessType;
@@ -71,18 +72,28 @@
        List<SysUser> sysUsers = sysUserService.selectAllList();
        List<TLocation> locationList = locationService.list();
        if (StringUtils.hasLength(query.getDeptName())){
            List<String> projectIds = projectDeptService.lambdaQuery().like(TProjectDept::getProjectName, query.getDeptName()).list()
            List<TProjectDept> list = projectDeptService.lambdaQuery().like(TProjectDept::getProjectName, query.getDeptName()).list();
            List<String> listIds = projectDeptService.lambdaQuery().like(TProjectDept::getProjectName, query.getDeptName()).list()
                    .stream().map(TProjectDept::getId).collect(Collectors.toList());
            for (TProjectDept tProjectDept : list) {
                if (tProjectDept.getParentId().equals("0")){
                    List<String> collect = projectDeptService.lambdaQuery().eq(TProjectDept::getParentId, tProjectDept.getId()).list()
                            .stream().map(TProjectDept::getId).collect(Collectors.toList());
                    listIds.addAll(collect);
                }
            }
            List<String> deptIds = deptService.lambdaQuery().like(TDept::getDeptName, query.getDeptName()).list()
                    .stream().map(TDept::getId).collect(Collectors.toList());
            projectIds.addAll(deptIds);
            if (projectIds.isEmpty()){
                return R.ok(new PageInfo<>());
            listIds.addAll(deptIds);
            if (listIds.isEmpty()){
                listIds.add("0");
            }
            query.setPatrolInspectorIds(sysUsers.stream().filter(e->listIds.contains(e.getDeptId())).map(SysUser::getUserId)
                    .collect(Collectors.toList()));
            if (StringUtils.hasLength(query.getPhonenumber())){
                List<Long> patrolInspectorIds = sysUsers.stream().filter(sysUser ->
                        sysUser.getPhonenumber().equals(query.getPhonenumber())
                                && projectIds.contains(sysUser.getDeptId())
                                && listIds.contains(sysUser.getDeptId())
                ).map(SysUser::getUserId).collect(Collectors.toList());
                if (patrolInspectorIds.isEmpty()){
                    return R.ok(new PageInfo<>());
@@ -105,7 +116,11 @@
        }
        if (query.getClearStatus()!=null){
            List<String> collect = tTaskDetailService.lambdaQuery().eq(TTaskDetail::getClearStatus, query.getClearStatus())
                    .list().stream().distinct().map(TTaskDetail::getTaskId).collect(Collectors.toList());
                    .eq(TTaskDetail::getHandleType,1)
                    .groupBy(TTaskDetail::getTaskId)
                    .orderByDesc(BaseModel::getCreateTime)
                    .list().stream().map(TTaskDetail::getTaskId).collect(Collectors.toList());
            query.setTaskIds(collect);
            if (collect.isEmpty()){
                return R.ok(new PageInfo<>());
@@ -126,9 +141,11 @@
                query.setLocationIds(collect);
                return R.ok(new PageInfo<>());
            }else{
                collect = collect.stream().filter(query.getLocationIds()::contains).collect(Collectors.toList());
                if (collect.isEmpty()){
                    return R.ok(new PageInfo<>());
                if (query.getLocationIds()!=null){
                    collect = collect.stream().filter(query.getLocationIds()::contains).collect(Collectors.toList());
                    if (collect.isEmpty()){
                        return R.ok(new PageInfo<>());
                    }
                }
                query.setLocationIds(collect);
            }
ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/TDictDataController.java
@@ -39,7 +39,11 @@
    @ApiOperation(value = "数据字典列表")
    @GetMapping(value = "/list")
    public R<List<TDictData>> pageList(@RequestParam Integer dataType) {
        return R.ok(dictDataService.lambdaQuery().eq(TDictData::getDataType,dataType).list());
        if (dataType==4){
            return R.ok(dictDataService.lambdaQuery().in(TDictData::getDataType,Arrays.asList(4,5)).list());
        }else{
            return R.ok(dictDataService.lambdaQuery().eq(TDictData::getDataType,dataType).list());
        }
    }
    @Log(title = "新增数据字典", businessType = BusinessType.INSERT)
    @ApiOperation(value = "新增数据字典")
ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/TInspectorController.java
@@ -127,9 +127,11 @@
                query.setLocationIds(collect);
                return R.ok(new PageInfo<>());
            }else{
                collect = collect.stream().filter(query.getLocationIds()::contains).collect(Collectors.toList());
                if (collect.isEmpty()){
                    return R.ok(new PageInfo<>());
                if (query.getLocationIds()!=null){
                    collect = collect.stream().filter(query.getLocationIds()::contains).collect(Collectors.toList());
                    if (collect.isEmpty()){
                        return R.ok(new PageInfo<>());
                    }
                }
                query.setLocationIds(collect);
            }
@@ -137,7 +139,7 @@
        return R.ok(inspectorService.pageList(query));
    }
    @Log(title = "督察记录导出", businessType = BusinessType.EXPORT)
    @Log(title = "督察记录导出", businessType = BusinessType.OTHER)
    @ApiOperation(value = "督察记录导出")
    @PostMapping(value = "/exportExcel")
    public void exportExcel(@RequestBody InsepectorListQuery query) {
@@ -258,7 +260,6 @@
    public R<Boolean> audit(@RequestBody TInspectorAuditDTO dto) {
        TTaskAuditDTO tTaskAuditDTO = new TTaskAuditDTO();
        BeanUtils.copyProperties(dto, tTaskAuditDTO);
        dto.setAuditTime(LocalDateTime.now());
        TTask task = taskCleanerService.getById(dto.getTaskId());
        TLocation location = locationService.getById(task.getLocationId());
        TNotice tNotice = new TNotice();
@@ -268,57 +269,26 @@
        tNotice.setStatus(1);
        tNotice.setDataId(task.getId());
        tNotice.setNoticeSetType(noticeSet.getNoticeType());
        if (dto.getAuditStatus()==2){
            tTaskAuditDTO.setHandleType(3);
            // 将任务修改为待整改
            task.setStatus(4);
            taskCleanerService.updateById(task);
            // 增加消息
            tNotice.setNoticeType(1);
            tNotice.setNoticeContent("【"+location.getLocationName()+"】任务不合格,请重新上传!");
        }else{
            tTaskAuditDTO.setHandleType(2);
            // 如果是初次审核就通过 将状态设置为已完成
            List<TTaskDetail> list = tTaskDetailService.lambdaQuery().eq(TTaskDetail::getTaskId, dto.getTaskId()).list();
            if (list.isEmpty()){
                if (dto.getClearStatus()==1){
                    task.setStatus(6);
                    dto.setStatus(4);
                    taskCleanerService.updateById(task);
                }else{
                    dto.setStatus(2);
                    task.setStatus(4);
                    taskCleanerService.updateById(task);
// 增加消息
                    tNotice.setNoticeType(1);
                    tNotice.setNoticeContent("【"+location.getLocationName()+"】任务不合格,请重新上传!");
                }
        if (dto.getAuditStatus()==1){
            if (dto.getClearStatus()==2){
                tTaskAuditDTO.setHandleType(3);
                dto.setStatus(2);
                // 增加消息
                tNotice.setNoticeType(1);
                tNotice.setNoticeContent("【"+location.getLocationName()+"】督察任务不合格,请重新上传!");
                noticeService.save(tNotice);
            }else{
                if (dto.getClearStatus()==1){
                if (dto.getAuditTime()!=null){
                    dto.setStatus(3);
                    task.setStatus(5);
                    taskCleanerService.updateById(task);
                    // 增加消息
                    tNotice.setNoticeType(2);
                    tNotice.setNoticeContent("【"+location.getLocationName()+"】任务已通过");
                }else{
                    dto.setStatus(2);
                    task.setStatus(4);
                    taskCleanerService.updateById(task);
                    // 增加消息
                    tNotice.setNoticeType(1);
                    tNotice.setNoticeContent("【"+location.getLocationName()+"】任务不合格,请重新上传!");
                    dto.setStatus(4);
                }
            }
        }
        noticeService.save(tNotice);
        dto.setAuditTime(LocalDateTime.now());
        dto.setAuditPerson(tokenService.getLoginUser().getUserId()+"");
        inspectorService.updateById(dto);
        tTaskDetailService.save(tTaskAuditDTO);
        return R.ok();
    }
}
ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/TLocationController.java
@@ -5,8 +5,11 @@
import cn.afterturn.easypoi.excel.ExcelImportUtil;
import cn.afterturn.easypoi.excel.entity.ExportParams;
import cn.afterturn.easypoi.excel.entity.ImportParams;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.ruoyi.common.annotation.Log;
import com.ruoyi.common.basic.PageInfo;
import com.ruoyi.common.core.domain.BaseModel;
import com.ruoyi.common.core.domain.R;
import com.ruoyi.common.core.domain.entity.SysUser;
import com.ruoyi.common.core.exception.ServiceException;
@@ -133,10 +136,23 @@
                .eq(query.getStatus() != null, TTask::getStatus, query.getStatus())
                .in(query.getPatrolInspectorIds() != null && query.getPatrolInspectorIds().isEmpty(), TTask::getPatrolInspector, query.getPatrolInspectorIds())
                .in(query.getTaskIds() != null && query.getTaskIds().isEmpty(), TTask::getId, query.getTaskIds()).list();
        List<String> collect = list.stream().map(TTask::getId).collect(Collectors.toList());
        list = list.stream().skip((long) (query.getPageNum() - 1) * query.getPageSize()).limit(query.getPageSize()).collect(Collectors.toList());
        pageInfo.setTotal(list.size());
        List<LocationListTaskVO> res = new ArrayList<>();
        List<TTaskDetail> taskDetails = tTaskDetailService.list(Wrappers.lambdaQuery(TTaskDetail.class)
                        .in(TTaskDetail::getTaskId,collect)
                .eq(TTaskDetail::getClearStatus, 2)
                .eq(TTaskDetail::getHandleType,1)
                .orderByDesc(TTaskDetail::getCreateTime));
        taskDetails = new ArrayList<>(taskDetails.stream()
                .collect(Collectors.groupingBy(
                        TTaskDetail::getTaskId,
                        Collectors.collectingAndThen(
                                Collectors.toList(),
                                listAll -> listAll.get(0)
                        )
                ))
                .values());
        for (TTask tTask : list) {
            LocationListTaskVO temp = new LocationListTaskVO();
            TLocation tLocation = locationList.stream().filter(e -> e.getId().equals(tTask.getLocationId())).findFirst().orElse(null);
@@ -168,18 +184,26 @@
                        .ifPresent(tLocationType -> temp.setLocationTypeName(tLocationType.getLocationName()));
            }
            TTaskDetail one = tTaskDetailService.lambdaQuery().eq(TTaskDetail::getTaskId, tTask.getId())
                    .orderByDesc(TTaskDetail::getCreateTime).last("limit 1").one();
            if (one!=null){
                temp.setClearStatus(one.getClearStatus());
                temp.setPicture(one.getPicture());
            TTaskDetail tTaskDetail = taskDetails.stream().filter(e -> e.getTaskId().equals(tTask.getId())).findFirst().orElse(null);
            if (tTaskDetail!=null){
                temp.setPicture(tTaskDetail.getPicture());
                temp.setClearStatus(tTaskDetail.getClearStatus());
                if (query.getClearStatus()!=null){
                    if (query.getClearStatus().equals(tTaskDetail.getClearStatus())){
                        res.add(temp);
                    }
                }else{
                    res.add(temp);
                }
            }
            temp.setTaskType(tTask.getTaskType());
            temp.setStatus(tTask.getStatus());
            temp.setTaskId(tTask.getId());
            temp.setImplementTime(tTask.getImplementTime());
            res.add(temp);
        }
        res = res.stream().skip((long) (query.getPageNum() - 1) * query.getPageSize()).limit(query.getPageSize()).collect(Collectors.toList());
        pageInfo.setTotal(res.size());
        pageInfo.setRecords(res);
        return R.ok(pageInfo);
    }
ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/TProblemEscalationController.java
@@ -71,10 +71,13 @@
        TProblemEscalation byId = problemEscalationService.getById(id);
        BeanUtils.copyProperties(byId,problemEscalationDetailVO);
        TDictData byId1 = dictDataService.getById(byId.getEscalationType());
        SysUser sysUser = sysUserService.selectUserById(Long.valueOf(byId.getHandleId()));
        if (sysUser!=null){
            problemEscalationDetailVO.setHandleName(sysUser.getUserName());
        if (byId.getHandleId()!=null){
            SysUser sysUser = sysUserService.selectUserById(Long.valueOf(byId.getHandleId()));
            if (sysUser!=null){
                problemEscalationDetailVO.setHandleName(sysUser.getUserName());
            }
        }
        problemEscalationDetailVO.setEscalationTypeName(byId1.getDataContent());
        return R.ok(problemEscalationDetailVO);
    }
ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/TTaskController.java
@@ -92,18 +92,29 @@
        List<SysUser> sysUsers = sysUserService.selectAllList();
        List<TLocation> locationList = locationService.list();
        if (StringUtils.hasLength(query.getDeptName())){
            List<String> projectIds = projectDeptService.lambdaQuery().like(TProjectDept::getProjectName, query.getDeptName()).list()
            List<TProjectDept> list = projectDeptService.lambdaQuery().like(TProjectDept::getProjectName, query.getDeptName()).list();
            List<String> listIds = projectDeptService.lambdaQuery().like(TProjectDept::getProjectName, query.getDeptName()).list()
                    .stream().map(TProjectDept::getId).collect(Collectors.toList());
            for (TProjectDept tProjectDept : list) {
                if (tProjectDept.getParentId().equals("0")){
                        List<String> collect = projectDeptService.lambdaQuery().eq(TProjectDept::getParentId, tProjectDept.getId()).list()
                                .stream().map(TProjectDept::getId).collect(Collectors.toList());
                        listIds.addAll(collect);
                }
            }
            List<String> deptIds = deptService.lambdaQuery().like(TDept::getDeptName, query.getDeptName()).list()
                    .stream().map(TDept::getId).collect(Collectors.toList());
            projectIds.addAll(deptIds);
            if (projectIds.isEmpty()){
            listIds.addAll(deptIds);
            if (listIds.isEmpty()){
                return R.ok(new PageInfo<>());
            }
            List<Long> collect = sysUsers.stream().filter(e -> listIds.contains(e.getDeptId()))
                    .map(SysUser::getUserId).collect(Collectors.toList());
            query.setPatrolInspectorIds( collect);
            if (StringUtils.hasLength(query.getPhonenumber())){
                List<Long> patrolInspectorIds = sysUsers.stream().filter(sysUser ->
                        sysUser.getPhonenumber().contains(query.getPhonenumber())
                                && projectIds.contains(sysUser.getDeptId())
                                && listIds.contains(sysUser.getDeptId())
                ).map(SysUser::getUserId).collect(Collectors.toList());
                if (patrolInspectorIds.isEmpty()){
                    return R.ok(new PageInfo<>());
@@ -208,7 +219,6 @@
            List<TTaskDetail> list = tTaskDetailService.lambdaQuery()
                    .eq(TTaskDetail::getHandleType,1)
                    .eq(TTaskDetail::getTaskId, dto.getTaskId()).list();
            if (one.getClearStatus()==1){
                if (list.size()<2){
                    task.setStatus(6);
                    taskCleanerService.updateById(task);
@@ -220,15 +230,6 @@
                    tNotice.setNoticeType(2);
                    tNotice.setNoticeContent("【"+location.getLocationName()+"】任务已通过");
                }
            }else{
                // 将任务修改为待整改
                task.setStatus(4);
                taskCleanerService.updateById(task);
                // 增加消息
                tNotice.setNoticeType(1);
                tNotice.setNoticeContent("【"+location.getLocationName()+"】任务不合格,请重新上传!");
            }
        }
        noticeService.save(tNotice);
        dto.setAuditPerson(tokenService.getLoginUser().getUserId()+"");
@@ -243,7 +244,7 @@
    @Log(title = "批量审核任务", businessType = BusinessType.UPDATE)
    @ApiOperation(value = "批量审核任务")
    @PostMapping(value = "/auditBatch")
    public R<Boolean> auditBatch(@RequestBody @Validated TTaskAuditBatchDTO dto) {
    public R<Boolean> auditBatch(@RequestBody  TTaskAuditBatchDTO dto) {
        List<TTaskDetail> tTaskDetails = new ArrayList<>();
        for (String s : dto.getTaskIds().split(",")) {
            TTask byId = taskCleanerService.getById(s);
@@ -285,7 +286,8 @@
        TLocationType byId2 = locationTypeService.getById(byId1.getLocationType());
        taskDetailVO.setLocationAddress(byId1.getLocationAddress());
        taskDetailVO.setLocationIcon(byId2.getLocationIcon());
        taskDetailVO.setLocationName(byId2.getLocationName());
        taskDetailVO.setLocationName(byId1.getLocationName());
        taskDetailVO.setLocationTypeName(byId2.getLocationName());
        TTaskDetail tTaskDetail = list.stream().filter(e -> e.getHandleType() == 1).findFirst().orElse(null);
        if (tTaskDetail!=null &&  tTaskDetail.getUnqualified()!=null){
            TDictData byId3 = dictDataService.getById(tTaskDetail.getUnqualified());
@@ -369,43 +371,55 @@
        return R.ok();
    }
    @Log(title = "任务记录导出", businessType = BusinessType.EXPORT)
    @Log(title = "任务记录导出", businessType = BusinessType.OTHER)
    @ApiOperation(value = "任务记录导出")
    @PostMapping(value = "/exportExcel")
    public void exportExcel(@RequestBody TaskListQuery query) {
        List<SysUser> sysUsers = sysUserService.selectAllList();
        List<TLocation> locationList = locationService.list();
        if (StringUtils.hasLength(query.getDeptName())){
            List<String> projectIds = projectDeptService.lambdaQuery().like(TProjectDept::getProjectName, query.getDeptName()).list()
            List<TProjectDept> list = projectDeptService.lambdaQuery().like(TProjectDept::getProjectName, query.getDeptName()).list();
            List<String> listIds = projectDeptService.lambdaQuery().like(TProjectDept::getProjectName, query.getDeptName()).list()
                    .stream().map(TProjectDept::getId).collect(Collectors.toList());
            for (TProjectDept tProjectDept : list) {
                if (tProjectDept.getParentId().equals("0")){
                    List<String> collect = projectDeptService.lambdaQuery().eq(TProjectDept::getParentId, tProjectDept.getId()).list()
                            .stream().map(TProjectDept::getId).collect(Collectors.toList());
                    listIds.addAll(collect);
                }
            }
            List<String> deptIds = deptService.lambdaQuery().like(TDept::getDeptName, query.getDeptName()).list()
                    .stream().map(TDept::getId).collect(Collectors.toList());
            projectIds.addAll(deptIds);
            if (projectIds.isEmpty()){
                projectIds.add("-1");
            listIds.addAll(deptIds);
            if (listIds.isEmpty()){
                listIds.add("0");
            }
            List<Long> collect = sysUsers.stream().filter(e -> listIds.contains(e.getDeptId()))
                    .map(SysUser::getUserId).collect(Collectors.toList());
            query.setPatrolInspectorIds( collect);
            if (StringUtils.hasLength(query.getPhonenumber())){
                List<Long> patrolInspectorIds = sysUsers.stream().filter(sysUser ->
                        sysUser.getPhonenumber().equals(query.getPhonenumber())
                                && projectIds.contains(sysUser.getDeptId())
                        sysUser.getPhonenumber().contains(query.getPhonenumber())
                                && listIds.contains(sysUser.getDeptId())
                ).map(SysUser::getUserId).collect(Collectors.toList());
                if (patrolInspectorIds.isEmpty()){
                    patrolInspectorIds.add(-1L);
                    patrolInspectorIds.add(0L);
                }
                query.setPatrolInspectorIds(patrolInspectorIds);
            }
        }
        if (StringUtils.hasLength(query.getPhonenumber())){
            List<Long> patrolInspectorIds = sysUsers.stream().filter(sysUser ->
                    sysUser.getPhonenumber().equals(query.getPhonenumber())
                    sysUser.getPhonenumber().contains(query.getPhonenumber())
            ).map(SysUser::getUserId).collect(Collectors.toList());
            query.setPatrolInspectorIds(patrolInspectorIds);
            if (!query.getPatrolInspectorIds().isEmpty()){
                // 取交集
                patrolInspectorIds = patrolInspectorIds.stream().filter(query.getPatrolInspectorIds()::contains).collect(Collectors.toList());
            }
            query.setPatrolInspectorIds(patrolInspectorIds);
            if (patrolInspectorIds.isEmpty()){
                patrolInspectorIds.add(-1L);
                patrolInspectorIds.add(0L);
            }
        }
        if (query.getClearStatus()!=null){
@@ -413,26 +427,27 @@
                    .list().stream().distinct().map(TTaskDetail::getTaskId).collect(Collectors.toList());
            query.setTaskIds(collect);
            if (collect.isEmpty()){
                collect.add("-1");
                collect.add("0");
            }
        }
        if (query.getLocationType()!=null){
        if (StringUtils.hasLength(query.getLocationType())){
            List<String> collect = locationList.stream().filter(e -> e.getLocationType().equals(query.getLocationType())).map(TLocation::getId)
                    .collect(Collectors.toList());
            if (collect.isEmpty()){
                collect.add("-1");
                collect.add("0");
            }
            query.setLocationIds(collect);
        }
        if (StringUtils.hasLength(query.getLocationName())){
            List<String> collect = locationList.stream().filter(e -> e.getLocationName().contains(query.getLocationName())).map(TLocation::getId)
                    .collect(Collectors.toList());
            query.setLocationIds(collect);
            if (collect.isEmpty()){
                collect.add("-1");
                collect.add("0");
            }else{
                collect = collect.stream().filter(query.getLocationIds()::contains).collect(Collectors.toList());
                if (collect.isEmpty()){
                    collect.add("-1");
                    collect.add("0");
                }
                query.setLocationIds(collect);
            }
ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/WorkbenchesController.java
@@ -1071,6 +1071,15 @@
                    .eq(TTaskDetail::getClearStatus, 2)
                    .eq(TTaskDetail::getHandleType,1)
                    .orderByDesc(TTaskDetail::getCreateTime));
            taskDetails = new ArrayList<>(taskDetails.stream()
                    .collect(Collectors.groupingBy(
                            TTaskDetail::getTaskId,
                            Collectors.collectingAndThen(
                                    Collectors.toList(),
                                    listAll -> listAll.get(0)
                            )
                    ))
                    .values());
            List<TTaskDetail> taskDetailList = new ArrayList<>();
            for (TTask task : list) {
                TTaskDetail tTaskDetail = taskDetails.stream().filter(taskDetail -> taskDetail.getTaskId().equals(task.getId())).findFirst().orElse(null);
@@ -1144,6 +1153,15 @@
                    .eq(TTaskDetail::getHandleType,1)
                    .eq(TTaskDetail::getClearStatus, 2)
                    .orderByDesc(TTaskDetail::getCreateTime));
            taskDetails = new ArrayList<>(taskDetails.stream()
                    .collect(Collectors.groupingBy(
                            TTaskDetail::getTaskId,
                            Collectors.collectingAndThen(
                                    Collectors.toList(),
                                    listAll -> listAll.get(0)
                            )
                    ))
                    .values());
            List<TTaskDetail> taskDetailList = new ArrayList<>();
            for (TTask task : list) {
                TTaskDetail tTaskDetail = taskDetails.stream().filter(taskDetail -> taskDetail.getTaskId().equals(task.getId())).findFirst().orElse(null);
ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysRoleController.java
@@ -7,8 +7,10 @@
import java.util.stream.Collectors;
import com.ruoyi.common.basic.PageInfo;
import com.ruoyi.common.core.domain.R;
import com.ruoyi.common.core.domain.entity.SysMenu;
import com.ruoyi.system.dto.SysRoleDTO;
import com.ruoyi.system.mapper.SysUserRoleMapper;
import com.ruoyi.system.model.TTemplate;
import com.ruoyi.system.query.SysRoleQuery;
import com.ruoyi.system.service.*;
@@ -47,6 +49,8 @@
    private ISysRoleService roleService;
    @Autowired
    private SysUserRoleMapper sysUserRoleMapper;
    @Autowired
    private TokenService tokenService;
    @Autowired
@@ -62,7 +66,6 @@
    @Autowired
    private TTemplateService templateService;
    @PreAuthorize("@ss.hasPermi('system:role')")
    @ApiOperation(value = "角色列表")
    @PostMapping("/list")
    public AjaxResult list(@RequestBody SysRoleQuery query)
@@ -71,7 +74,6 @@
        return AjaxResult.success(list);
    }
    @PreAuthorize("@ss.hasPermi('system:role')")
    @ApiOperation(value = "角色列表不分页")
    @PostMapping("/listNotPage")
    public AjaxResult list()
@@ -139,7 +141,7 @@
        roleInfoVo.setRoleId(role.getRoleId());
        roleInfoVo.setRoleName(role.getRoleName());
        roleInfoVo.setRemark(role.getRemark());
        roleInfoVo.setRoleType(role.getRoleType());
        // 获取当前角色的菜单列表
        List<SysMenu> menus = menuService.selectListByRoleId(roleId);
        if(menus.size()==0){
@@ -249,6 +251,13 @@
        List<Long> id = new ArrayList<>();
        for (String s : split) {
            id.add(Long.valueOf(s));
            int i = sysUserRoleMapper.countUserRoleByRoleId(Long.valueOf(s));
            if (i > 0) {
                SysRole sysRole = roleService.selectRoleById(Long.valueOf(s));
                return AjaxResult.error("角色"+sysRole.getRoleName()+"下有员工,不可删除");
            }
        }
        return AjaxResult.success(roleService.deleteRoleByIds(id));
    }
ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysUserController.java
@@ -60,7 +60,6 @@
     */
    @ApiOperation(value = "获取用户列表")
    @PostMapping("/list")
    @PreAuthorize("@ss.hasPermi('system:user')")
    public AjaxResult<PageInfo<SysUserVO>> list(@RequestBody SysUserQuery query)
    {
        List<SysUser> sysUsers = userService.selectAllList();
@@ -88,7 +87,6 @@
    @ApiOperation(value = "获取用户列表-不分页")
    @PostMapping("/listNotPage")
    @PreAuthorize("@ss.hasPermi('system:user')")
    public AjaxResult listNotPage()
    {
@@ -176,7 +174,6 @@
    /**
     * 新增用户
     */
    // @PreAuthorize("@ss.hasPermi('system:user:add')")
    @ApiOperation(value = "新增用户管理")
    @Log(title = "用户信息-新增用户", businessType = BusinessType.INSERT)
    @PostMapping("/add")
ruoyi-admin/src/main/java/com/ruoyi/web/controller/task/TaskUtil.java
@@ -1,363 +1,363 @@
package com.ruoyi.web.controller.task;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.ruoyi.common.core.domain.entity.SysUser;
import com.ruoyi.common.core.redis.RedisCache;
import com.ruoyi.common.utils.CodeGenerateUtils;
import com.ruoyi.system.mapper.TCleanerMapper;
import com.ruoyi.system.model.*;
import com.ruoyi.system.service.*;
import javafx.concurrent.Task;
import lombok.extern.slf4j.Slf4j;
import org.apache.poi.ss.formula.functions.T;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import org.springframework.util.CollectionUtils;
import java.math.BigDecimal;
import java.text.SimpleDateFormat;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.util.*;
import java.util.stream.Collectors;
/**
 * @author xiaochen
 * @date 2025/6/11 18:39
 */
@Slf4j
@Component
public class TaskUtil {
    // 项目部权重标识
    private static final String PROJECT_DEPT_WEIGHT = ":PROJECT_DEPT_WEIGHT";
    // 保洁员权重标识
    private static final String CLEANER_WEIGHT = ":CLEANER_WEIGHT";
    // 重复点位标识
    private static final String REPEAT_LOCATION = ":REPEAT_LOCATION";
    @Autowired
    private RedisCache redisCache;
    @Autowired
    private TTemplateService templateService;
    @Autowired
    private TTemplateDetailService templateDetailService;
    @Autowired
    private TProjectDeptService projectDeptService;
    @Autowired
    private TCleanerService cleanerService;
    @Autowired
    private TLocationService locationService;
    @Autowired
    private TLocationTypeService locationTypeService;
    @Autowired
    private ISysUserService sysUserService;
    @Autowired
    private TTaskCleanService taskCleanService;
    @Autowired
    private TTemplateCountService templateCountService;
    // 每一个小时执行一次
//    @Scheduled(cron = "0 0 0 * * ?")
    @Scheduled(fixedRate = 1500000000)
    public void dayOfCreateInspection() {
        try {
            // 查询任务模板
            List<TTemplate> list = templateService.list();
            if (CollectionUtils.isEmpty(list)) {
                return;
            }
            list.forEach(template -> {
                // 创建任务
                createInspection(template);
            });
            // 查询前一天为执行的所有任务,改成已超时状态
            List<TTask> taskCleanList = taskCleanService.list(Wrappers.lambdaQuery(TTask.class)
                    .like(TTask::getImplementTime, LocalDate.now().minusDays(1))
                    .eq(TTask::getStatus, 1));
            if (!CollectionUtils.isEmpty(taskCleanList)) {
                taskCleanList.forEach(task -> {
                    task.setStatus(2);
                });
                taskCleanService.updateBatchById(taskCleanList);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    public void createInspection(TTemplate template) {
        // 查询所有的模板详情
        List<TTemplateDetail> list = templateDetailService.list(Wrappers.lambdaQuery(TTemplateDetail.class)
                .eq(TTemplateDetail::getTemplateId, template.getId()));
        if (CollectionUtils.isEmpty(list)) {
            return;
        }
        // 通过模板id查询员工巡检员
        List<SysUser> sysUsers = sysUserService.selectUserByTempLateId(template.getId());
        // 创建任务
        for (TTemplateDetail detail : list) {
            // 计算周期
            int cycle = detail.getCycle();
            switch (detail.getCycleType()){
                case 2:
                    cycle = cycle * 7;
                    break;
                case 3:
                    cycle = cycle * 30;
                    break;
                case 4:
                    cycle = cycle * 90;
                    break;
                case 5:
                    cycle = cycle * 365;
                    break;
            }
            // 拿到保洁抽查次数
            int num1 = detail.getNum1();
            // 拿到项目部数
            int num2 = detail.getNum2();
            // 拿到每日重复点位
            int num3 = detail.getNum3();
            // 获取点位类型的占比
            String num4 = detail.getNum4();
            // 未绑定员工
            if(CollectionUtils.isEmpty(sysUsers)){
                continue;
            }
            int taskCount = 0;
            for (SysUser sysUser : sysUsers) {
                List<TProjectDept> projectDeptLists = new ArrayList<>();
                if(sysUser.getDeptType() == 1){
                    TProjectDept projectDept = projectDeptService.getById(sysUser.getDeptId());
                    if("0".equals(projectDept.getParentId())){
                        projectDeptLists = projectDeptService.list(Wrappers.lambdaQuery(TProjectDept.class)
                                .eq(TProjectDept::getParentId, projectDept.getId()));
                    }else {
                        projectDeptLists.add(projectDept);
                    }
                }else {
                    projectDeptLists = projectDeptService.list(Wrappers.lambdaQuery(TProjectDept.class)
                            .ne(TProjectDept::getParentId,0));
                }
                List<String> proDeptIds = projectDeptLists.stream().map(TProjectDept::getId).collect(Collectors.toList());
                // 获取项目部在该模板详情中的权重
                List<String> projectDeptIds = redisCache.getCacheList(detail.getId() + PROJECT_DEPT_WEIGHT);
                // 获取项目部列表
                List<TProjectDept> projectDeptList;
                if(CollectionUtils.isEmpty(projectDeptIds)){
                    projectDeptList = projectDeptLists;
                }else {
                    projectDeptList = projectDeptService.list(Wrappers.lambdaQuery(TProjectDept.class)
                            .ne(TProjectDept::getParentId,0)
                            .in(TProjectDept::getId, proDeptIds)
                            .notIn(TProjectDept::getId, projectDeptIds));
                    // 所过所有的项目部都被抽取了,则重新抽取,并且清空项目部权重
                    if(CollectionUtils.isEmpty(projectDeptList)){
                        projectDeptList = projectDeptLists;
                        redisCache.deleteObject(detail.getId() + PROJECT_DEPT_WEIGHT);
                    }
                }
                // 如果可抽取的项目部数不足,先抽取余下项目部后,再清空权重,重新抽取
                List<TProjectDept> projectDepts = randomSelection(projectDeptList, num2);
                if(projectDepts.size() < num2){
                    List<String> proIds = projectDepts.stream().map(TProjectDept::getId).collect(Collectors.toList());
                    List<TProjectDept> projectDeptList1 = projectDeptService.list(Wrappers.lambdaQuery(TProjectDept.class)
                            .notIn(TProjectDept::getId, proIds)
                            .ne(TProjectDept::getParentId,0));
                    redisCache.deleteObject(detail.getId() + PROJECT_DEPT_WEIGHT);
                    List<TProjectDept> projectDepts1 = randomSelection(projectDeptList1, num2 - projectDepts.size());
                    List<String> proIds1 = projectDepts1.stream().map(TProjectDept::getId).collect(Collectors.toList());
                    // 将已抽取的项目部id保存到redis中
                    redisCache.setCacheList(detail.getId() + PROJECT_DEPT_WEIGHT, proIds1);
                    projectDepts.addAll(projectDepts1);
                }else {
                    List<String> proIds = projectDepts.stream().map(TProjectDept::getId).collect(Collectors.toList());
                    // 将已抽取的项目部id保存到redis中
                    redisCache.setCacheList(detail.getId() + PROJECT_DEPT_WEIGHT, proIds);
                }
                List<String> proIds = projectDepts.stream().map(TProjectDept::getId).collect(Collectors.toList());
                // 拿到抽取的项目部下的所有保洁员
//            List<TProjectDept> tProjectDeptList = projectDeptService.list(Wrappers.lambdaQuery(TProjectDept.class)
//                    .in(TProjectDept::getId, proIds));
                // 获取片区id
                List<String> areaIds = projectDepts.stream().map(TProjectDept::getId).collect(Collectors.toList());
                if(CollectionUtils.isEmpty(areaIds)){
                    return;
                }
                // 计算每天需要抽取多少个保洁员
                long count = cleanerService.count(Wrappers.lambdaQuery(TCleaner.class)
                        .in(TCleaner::getProjectId, areaIds));
                int cleanerSums = num1 * Integer.parseInt(count + "");
                // 获取每天需要抽取的保洁员数,向上取整
                if (cleanerSums < cycle){
                    cleanerSums = cycle;
                }
                int dayCleanerCount = cleanerSums / cycle;
                if((cycle == detail.getCurrentValue()) && cleanerSums % cycle != 0){
                    dayCleanerCount++;
                }
                // 获取保洁员权重
                List<String> cleanerIds = redisCache.getCacheList(detail.getId() + CLEANER_WEIGHT);
                // 获取保洁员列表
                List<TCleaner> cleaners;
                if(CollectionUtils.isEmpty(cleanerIds)){
                    cleaners = cleanerService.list(Wrappers.lambdaQuery(TCleaner.class)
                            .in(TCleaner::getProjectId, areaIds));
                }else {
                    cleaners = cleanerService.list(Wrappers.lambdaQuery(TCleaner.class)
                            .in(TCleaner::getProjectId, areaIds)
                            .notIn(TCleaner::getId, cleanerIds));
                    if(CollectionUtils.isEmpty(cleaners)){
                        cleaners = cleanerService.list(Wrappers.lambdaQuery(TCleaner.class)
                                .in(TCleaner::getProjectId, areaIds));
                        redisCache.deleteObject(detail.getId() + CLEANER_WEIGHT);
                    }
                }
                // 抽取保洁员
                List<TCleaner> tCleaners = randomSelection(cleaners, dayCleanerCount);
                if(CollectionUtils.isEmpty(tCleaners)){
                    log.error("没有可抽取的保洁员,模板id为:{}",detail.getId());
                    continue;
                }
                if(tCleaners.size() < dayCleanerCount){
                    List<String> cleanIds = tCleaners.stream().map(TCleaner::getId).collect(Collectors.toList());
                    List<TCleaner> cleaners1 = cleanerService.list(Wrappers.lambdaQuery(TCleaner.class)
                            .in(TCleaner::getProjectId, areaIds)
                            .notIn(TCleaner::getId, cleanIds));
                    redisCache.deleteObject(detail.getId() + CLEANER_WEIGHT);
                    List<TCleaner> tCleaners1 = randomSelection(cleaners1, dayCleanerCount - tCleaners.size());
                    List<String> cleanIds1 = tCleaners1.stream().map(TCleaner::getId).collect(Collectors.toList());
                    // 将已抽取的保洁员id保存到redis中
                    cleanIds1.addAll(cleanIds);
                    redisCache.setCacheList(detail.getId() + CLEANER_WEIGHT, cleanIds1);
                    tCleaners.addAll(tCleaners1);
                }else {
                    List<String> cleanIds = tCleaners.stream().map(TCleaner::getId).collect(Collectors.toList());
                    redisCache.setCacheList(detail.getId() + CLEANER_WEIGHT, cleanIds);
                }
                // 通过保洁员id查询点位
                List<String> cleanersIds = tCleaners.stream().map(TCleaner::getId).collect(Collectors.toList());
                List<TLocation> locationList = locationService.list(Wrappers.lambdaQuery(TLocation.class)
                        .in(TLocation::getLocationCleaner, cleanersIds));
                // 查询点位类型
                JSONArray jsonArray = JSONObject.parseArray(num4);
                List<TLocation> tLocationList = new ArrayList<>();
                for (Object o : jsonArray) {
                    JSONObject jsonObject = JSONObject.parseObject(o.toString());
                    String id = jsonObject.getString("id");
                    BigDecimal value = jsonObject.getBigDecimal("value");
                    List<TLocation> locations = locationList.stream().filter(tLocation -> tLocation.getLocationType().equals(id)).collect(Collectors.toList());
                    if(!CollectionUtils.isEmpty(locations)){
                        BigDecimal bigDecimal = new BigDecimal(locations.size()).multiply(value.divide(new BigDecimal(100), 2, BigDecimal.ROUND_DOWN)).setScale(0, BigDecimal.ROUND_UP);
                        int locationCount = bigDecimal.intValue();
                        if(locationCount > 0){
                            List<TLocation> tLocations = randomSelection(locations, locationCount);
                            tLocationList.addAll(tLocations);
                        }
                    }
                }
                tLocationList = tLocationList.stream().distinct().collect(Collectors.toList());
                // 抽取重复点位
                Integer currentValue = detail.getCurrentValue();
                if(currentValue != cycle){
                    // 周期天数加一
                    detail.setCurrentValue(currentValue + 1);
                    // 获取重复点位
                    Set<TLocation> repeatLocation = redisCache.getCacheSet(detail.getId() + ":" + sysUser.getUserId() + REPEAT_LOCATION);
                    if(!CollectionUtils.isEmpty(repeatLocation)){
                        List<TLocation> locations = randomSelection(new ArrayList<>(tLocationList), num3);
                        tLocationList.addAll(locations);
                    }
                    Set<TLocation> locationSet = new HashSet<>(tLocationList);
                    redisCache.setCacheSet(detail.getId() + ":" + sysUser.getUserId() + REPEAT_LOCATION, locationSet);
                }else {
                    // 设置当前周期为0
                    detail.setCurrentValue(0);
                    // 将重复点位置空
                    redisCache.deleteObject(detail.getId() + ":" + sysUser.getUserId() + REPEAT_LOCATION);
                    // 将项目部权重置空
                    redisCache.deleteObject(detail.getId() + PROJECT_DEPT_WEIGHT);
                    // 将保洁员权重置空
                    redisCache.deleteObject(detail.getId() + CLEANER_WEIGHT);
                }
                // 创建任务
                List<TTask> tasks = new ArrayList<>();
                for (TLocation tLocation : tLocationList) {
                    TTask task = new TTask();
                    // 获取保洁员
                    tCleaners.stream().filter(tCleaner -> tCleaner.getId().equals(tLocation.getLocationCleaner())).findFirst().ifPresent(tCleaner -> {
                        task.setProjectId(tCleaner.getProjectId());
                        task.setCleanerId(tCleaner.getId());
                    });
                    // 获取巡检员
                    task.setPatrolInspector(sysUser.getUserId().toString());
                    task.setPatrolInspectorDept(sysUser.getDeptId());
                    task.setUserId(sysUser.getUserId());
                    task.setStatus(1);
                    task.setLocationId(tLocation.getId());
                    task.setImplementTime(LocalDateTime.now().plusDays(1));
                    task.setTaskType(1);
                    task.setTemplateId(detail.getTemplateId());
                    String nameAndCode = CodeGenerateUtils.generateVolumeSn();
                    task.setTaskName(nameAndCode);
                    task.setTaskCode(nameAndCode);
                    tasks.add(task);
                }
            // 添加应生成任务数量
            TTemplateCount templateCount = new TTemplateCount();
            templateCount.setTemplateId(detail.getTemplateId());
            templateCount.setTaskCount(tLocationList.size()* cycle);
            templateCount.setUserId(sysUser.getUserId());
            templateCountService.save(templateCount);
            taskCleanService.saveBatch(tasks);
            taskCount = taskCount + tasks.size();
            }
            template.setTaskCount(taskCount);
            templateService.updateById(template);
            templateDetailService.updateById(detail);
        }
    }
    /**
     * 从集合中随机抽取数量
     * @param list
     * @param size
     * @return
     * @param <T>
     */
    private static <T> List<T> randomSelection(List<T> list, int size) {
        List<T> selected = new ArrayList<>();
        int length = list.size();
        for (int i = 0; i < size; i++) {
            Collections.shuffle(list);
            // 如果需求的大小超过了集合的长度,则只能取到集合的全部元素
            int subListSize = Math.min(size - selected.size(), length);
            selected.addAll(list.subList(0, subListSize));
        }
        return selected;
    }
}
//package com.ruoyi.web.controller.task;
//
//
//import com.alibaba.fastjson.JSONArray;
//import com.alibaba.fastjson.JSONObject;
//import com.baomidou.mybatisplus.core.toolkit.Wrappers;
//import com.ruoyi.common.core.domain.entity.SysUser;
//import com.ruoyi.common.core.redis.RedisCache;
//import com.ruoyi.common.utils.CodeGenerateUtils;
//import com.ruoyi.system.mapper.TCleanerMapper;
//import com.ruoyi.system.model.*;
//import com.ruoyi.system.service.*;
//import javafx.concurrent.Task;
//import lombok.extern.slf4j.Slf4j;
//import org.apache.poi.ss.formula.functions.T;
//import org.springframework.beans.factory.annotation.Autowired;
//import org.springframework.scheduling.annotation.Scheduled;
//import org.springframework.stereotype.Component;
//import org.springframework.util.CollectionUtils;
//
//import java.math.BigDecimal;
//import java.text.SimpleDateFormat;
//import java.time.LocalDate;
//import java.time.LocalDateTime;
//import java.util.*;
//import java.util.stream.Collectors;
//
///**
// * @author xiaochen
// * @date 2025/6/11 18:39
// */
//@Slf4j
//@Component
//public class TaskUtil {
//
//    // 项目部权重标识
//    private static final String PROJECT_DEPT_WEIGHT = ":PROJECT_DEPT_WEIGHT";
//    // 保洁员权重标识
//    private static final String CLEANER_WEIGHT = ":CLEANER_WEIGHT";
//    // 重复点位标识
//    private static final String REPEAT_LOCATION = ":REPEAT_LOCATION";
//
//    @Autowired
//    private RedisCache redisCache;
//    @Autowired
//    private TTemplateService templateService;
//    @Autowired
//    private TTemplateDetailService templateDetailService;
//    @Autowired
//    private TProjectDeptService projectDeptService;
//    @Autowired
//    private TCleanerService cleanerService;
//    @Autowired
//    private TLocationService locationService;
//    @Autowired
//    private TLocationTypeService locationTypeService;
//    @Autowired
//    private ISysUserService sysUserService;
//    @Autowired
//    private TTaskCleanService taskCleanService;
//    @Autowired
//    private TTemplateCountService templateCountService;
//
//
//    // 每一个小时执行一次
////    @Scheduled(cron = "0 0 0 * * ?")
////    @Scheduled(fixedRate = 1500000000)
//    public void dayOfCreateInspection() {
//        try {
//
//            // 查询任务模板
//            List<TTemplate> list = templateService.list();
//            if (CollectionUtils.isEmpty(list)) {
//                return;
//            }
//            list.forEach(template -> {
//                // 创建任务
//                createInspection(template);
//            });
//
//            // 查询前一天为执行的所有任务,改成已超时状态
//            List<TTask> taskCleanList = taskCleanService.list(Wrappers.lambdaQuery(TTask.class)
//                    .like(TTask::getImplementTime, LocalDate.now().minusDays(1))
//                    .eq(TTask::getStatus, 1));
//            if (!CollectionUtils.isEmpty(taskCleanList)) {
//                taskCleanList.forEach(task -> {
//                    task.setStatus(2);
//                });
//                taskCleanService.updateBatchById(taskCleanList);
//            }
//
//        } catch (Exception e) {
//            e.printStackTrace();
//        }
//    }
//
//    public void createInspection(TTemplate template) {
//        // 查询所有的模板详情
//        List<TTemplateDetail> list = templateDetailService.list(Wrappers.lambdaQuery(TTemplateDetail.class)
//                .eq(TTemplateDetail::getTemplateId, template.getId()));
//        if (CollectionUtils.isEmpty(list)) {
//            return;
//        }
//        // 通过模板id查询员工巡检员
//        List<SysUser> sysUsers = sysUserService.selectUserByTempLateId(template.getId());
//        // 创建任务
//        for (TTemplateDetail detail : list) {
//            // 计算周期
//            int cycle = detail.getCycle();
//            switch (detail.getCycleType()){
//                case 2:
//                    cycle = cycle * 7;
//                    break;
//                case 3:
//                    cycle = cycle * 30;
//                    break;
//                case 4:
//                    cycle = cycle * 90;
//                    break;
//                case 5:
//                    cycle = cycle * 365;
//                    break;
//            }
//
//            // 拿到保洁抽查次数
//            int num1 = detail.getNum1();
//            // 拿到项目部数
//            int num2 = detail.getNum2();
//            // 拿到每日重复点位
//            int num3 = detail.getNum3();
//            // 获取点位类型的占比
//            String num4 = detail.getNum4();
//
//            // 未绑定员工
//            if(CollectionUtils.isEmpty(sysUsers)){
//                continue;
//            }
//
//            int taskCount = 0;
//            for (SysUser sysUser : sysUsers) {
//                List<TProjectDept> projectDeptLists = new ArrayList<>();
//                if(sysUser.getDeptType() == 1){
//                    TProjectDept projectDept = projectDeptService.getById(sysUser.getDeptId());
//                    if("0".equals(projectDept.getParentId())){
//                        projectDeptLists = projectDeptService.list(Wrappers.lambdaQuery(TProjectDept.class)
//                                .eq(TProjectDept::getParentId, projectDept.getId()));
//                    }else {
//                        projectDeptLists.add(projectDept);
//                    }
//                }else {
//                    projectDeptLists = projectDeptService.list(Wrappers.lambdaQuery(TProjectDept.class)
//                            .ne(TProjectDept::getParentId,0));
//                }
//                List<String> proDeptIds = projectDeptLists.stream().map(TProjectDept::getId).collect(Collectors.toList());
//
//                // 获取项目部在该模板详情中的权重
//                List<String> projectDeptIds = redisCache.getCacheList(detail.getId() + PROJECT_DEPT_WEIGHT);
//                // 获取项目部列表
//                List<TProjectDept> projectDeptList;
//                if(CollectionUtils.isEmpty(projectDeptIds)){
//                    projectDeptList = projectDeptLists;
//                }else {
//                    projectDeptList = projectDeptService.list(Wrappers.lambdaQuery(TProjectDept.class)
//                            .ne(TProjectDept::getParentId,0)
//                            .in(TProjectDept::getId, proDeptIds)
//                            .notIn(TProjectDept::getId, projectDeptIds));
//                    // 所过所有的项目部都被抽取了,则重新抽取,并且清空项目部权重
//                    if(CollectionUtils.isEmpty(projectDeptList)){
//                        projectDeptList = projectDeptLists;
//                        redisCache.deleteObject(detail.getId() + PROJECT_DEPT_WEIGHT);
//                    }
//                }
//                // 如果可抽取的项目部数不足,先抽取余下项目部后,再清空权重,重新抽取
//                List<TProjectDept> projectDepts = randomSelection(projectDeptList, num2);
//                if(projectDepts.size() < num2){
//                    List<String> proIds = projectDepts.stream().map(TProjectDept::getId).collect(Collectors.toList());
//                    List<TProjectDept> projectDeptList1 = projectDeptService.list(Wrappers.lambdaQuery(TProjectDept.class)
//                            .notIn(TProjectDept::getId, proIds)
//                            .ne(TProjectDept::getParentId,0));
//                    redisCache.deleteObject(detail.getId() + PROJECT_DEPT_WEIGHT);
//                    List<TProjectDept> projectDepts1 = randomSelection(projectDeptList1, num2 - projectDepts.size());
//                    List<String> proIds1 = projectDepts1.stream().map(TProjectDept::getId).collect(Collectors.toList());
//                    // 将已抽取的项目部id保存到redis中
//                    redisCache.setCacheList(detail.getId() + PROJECT_DEPT_WEIGHT, proIds1);
//                    projectDepts.addAll(projectDepts1);
//                }else {
//                    List<String> proIds = projectDepts.stream().map(TProjectDept::getId).collect(Collectors.toList());
//                    // 将已抽取的项目部id保存到redis中
//                    redisCache.setCacheList(detail.getId() + PROJECT_DEPT_WEIGHT, proIds);
//                }
//                List<String> proIds = projectDepts.stream().map(TProjectDept::getId).collect(Collectors.toList());
//
//                // 拿到抽取的项目部下的所有保洁员
////            List<TProjectDept> tProjectDeptList = projectDeptService.list(Wrappers.lambdaQuery(TProjectDept.class)
////                    .in(TProjectDept::getId, proIds));
//                // 获取片区id
//                List<String> areaIds = projectDepts.stream().map(TProjectDept::getId).collect(Collectors.toList());
//                if(CollectionUtils.isEmpty(areaIds)){
//                    return;
//                }
//
//                // 计算每天需要抽取多少个保洁员
//                long count = cleanerService.count(Wrappers.lambdaQuery(TCleaner.class)
//                        .in(TCleaner::getProjectId, areaIds));
//                int cleanerSums = num1 * Integer.parseInt(count + "");
//                // 获取每天需要抽取的保洁员数,向上取整
//                if (cleanerSums < cycle){
//                    cleanerSums = cycle;
//                }
//                int dayCleanerCount = cleanerSums / cycle;
//
//                if((cycle == detail.getCurrentValue()) && cleanerSums % cycle != 0){
//                    dayCleanerCount++;
//                }
//
//                // 获取保洁员权重
//                List<String> cleanerIds = redisCache.getCacheList(detail.getId() + CLEANER_WEIGHT);
//                // 获取保洁员列表
//                List<TCleaner> cleaners;
//                if(CollectionUtils.isEmpty(cleanerIds)){
//                    cleaners = cleanerService.list(Wrappers.lambdaQuery(TCleaner.class)
//                            .in(TCleaner::getProjectId, areaIds));
//                }else {
//                    cleaners = cleanerService.list(Wrappers.lambdaQuery(TCleaner.class)
//                            .in(TCleaner::getProjectId, areaIds)
//                            .notIn(TCleaner::getId, cleanerIds));
//                    if(CollectionUtils.isEmpty(cleaners)){
//                        cleaners = cleanerService.list(Wrappers.lambdaQuery(TCleaner.class)
//                                .in(TCleaner::getProjectId, areaIds));
//                        redisCache.deleteObject(detail.getId() + CLEANER_WEIGHT);
//                    }
//                }
//
//                // 抽取保洁员
//                List<TCleaner> tCleaners = randomSelection(cleaners, dayCleanerCount);
//                if(CollectionUtils.isEmpty(tCleaners)){
//                    log.error("没有可抽取的保洁员,模板id为:{}",detail.getId());
//                    continue;
//                }
//                if(tCleaners.size() < dayCleanerCount){
//                    List<String> cleanIds = tCleaners.stream().map(TCleaner::getId).collect(Collectors.toList());
//                    List<TCleaner> cleaners1 = cleanerService.list(Wrappers.lambdaQuery(TCleaner.class)
//                            .in(TCleaner::getProjectId, areaIds)
//                            .notIn(TCleaner::getId, cleanIds));
//                    redisCache.deleteObject(detail.getId() + CLEANER_WEIGHT);
//                    List<TCleaner> tCleaners1 = randomSelection(cleaners1, dayCleanerCount - tCleaners.size());
//                    List<String> cleanIds1 = tCleaners1.stream().map(TCleaner::getId).collect(Collectors.toList());
//                    // 将已抽取的保洁员id保存到redis中
//                    cleanIds1.addAll(cleanIds);
//                    redisCache.setCacheList(detail.getId() + CLEANER_WEIGHT, cleanIds1);
//                    tCleaners.addAll(tCleaners1);
//                }else {
//                    List<String> cleanIds = tCleaners.stream().map(TCleaner::getId).collect(Collectors.toList());
//                    redisCache.setCacheList(detail.getId() + CLEANER_WEIGHT, cleanIds);
//                }
//
//                // 通过保洁员id查询点位
//                List<String> cleanersIds = tCleaners.stream().map(TCleaner::getId).collect(Collectors.toList());
//                List<TLocation> locationList = locationService.list(Wrappers.lambdaQuery(TLocation.class)
//                        .in(TLocation::getLocationCleaner, cleanersIds));
//                // 查询点位类型
//                JSONArray jsonArray = JSONObject.parseArray(num4);
//                List<TLocation> tLocationList = new ArrayList<>();
//                for (Object o : jsonArray) {
//                    JSONObject jsonObject = JSONObject.parseObject(o.toString());
//                    String id = jsonObject.getString("id");
//                    BigDecimal value = jsonObject.getBigDecimal("value");
//                    List<TLocation> locations = locationList.stream().filter(tLocation -> tLocation.getLocationType().equals(id)).collect(Collectors.toList());
//                    if(!CollectionUtils.isEmpty(locations)){
//                        BigDecimal bigDecimal = new BigDecimal(locations.size()).multiply(value.divide(new BigDecimal(100), 2, BigDecimal.ROUND_DOWN)).setScale(0, BigDecimal.ROUND_UP);
//                        int locationCount = bigDecimal.intValue();
//                        if(locationCount > 0){
//                            List<TLocation> tLocations = randomSelection(locations, locationCount);
//                            tLocationList.addAll(tLocations);
//                        }
//                    }
//                }
//                tLocationList = tLocationList.stream().distinct().collect(Collectors.toList());
//                // 抽取重复点位
//                Integer currentValue = detail.getCurrentValue();
//                if(currentValue != cycle){
//                    // 周期天数加一
//                    detail.setCurrentValue(currentValue + 1);
//                    // 获取重复点位
//                    Set<TLocation> repeatLocation = redisCache.getCacheSet(detail.getId() + ":" + sysUser.getUserId() + REPEAT_LOCATION);
//                    if(!CollectionUtils.isEmpty(repeatLocation)){
//                        List<TLocation> locations = randomSelection(new ArrayList<>(tLocationList), num3);
//                        tLocationList.addAll(locations);
//                    }
//                    Set<TLocation> locationSet = new HashSet<>(tLocationList);
//                    redisCache.setCacheSet(detail.getId() + ":" + sysUser.getUserId() + REPEAT_LOCATION, locationSet);
//
//                }else {
//                    // 设置当前周期为0
//                    detail.setCurrentValue(0);
//                    // 将重复点位置空
//                    redisCache.deleteObject(detail.getId() + ":" + sysUser.getUserId() + REPEAT_LOCATION);
//                    // 将项目部权重置空
//                    redisCache.deleteObject(detail.getId() + PROJECT_DEPT_WEIGHT);
//                    // 将保洁员权重置空
//                    redisCache.deleteObject(detail.getId() + CLEANER_WEIGHT);
//                }
//
//                // 创建任务
//                List<TTask> tasks = new ArrayList<>();
//                for (TLocation tLocation : tLocationList) {
//                    TTask task = new TTask();
//                    // 获取保洁员
//                    tCleaners.stream().filter(tCleaner -> tCleaner.getId().equals(tLocation.getLocationCleaner())).findFirst().ifPresent(tCleaner -> {
//                        task.setProjectId(tCleaner.getProjectId());
//                        task.setCleanerId(tCleaner.getId());
//                    });
//                    // 获取巡检员
//                    task.setPatrolInspector(sysUser.getUserId().toString());
//                    task.setPatrolInspectorDept(sysUser.getDeptId());
//                    task.setUserId(sysUser.getUserId());
//                    task.setStatus(1);
//                    task.setLocationId(tLocation.getId());
//                    task.setImplementTime(LocalDateTime.now().plusDays(1));
//                    task.setTaskType(1);
//                    task.setTemplateId(detail.getTemplateId());
//                    String nameAndCode = CodeGenerateUtils.generateVolumeSn();
//                    task.setTaskName(nameAndCode);
//                    task.setTaskCode(nameAndCode);
//                    tasks.add(task);
//                }
//
//            // 添加应生成任务数量
//            TTemplateCount templateCount = new TTemplateCount();
//            templateCount.setTemplateId(detail.getTemplateId());
//            templateCount.setTaskCount(tLocationList.size()* cycle);
//            templateCount.setUserId(sysUser.getUserId());
//            templateCountService.save(templateCount);
//
//            taskCleanService.saveBatch(tasks);
//            taskCount = taskCount + tasks.size();
//            }
//            template.setTaskCount(taskCount);
//            templateService.updateById(template);
//            templateDetailService.updateById(detail);
//        }
//    }
//
//    /**
//     * 从集合中随机抽取数量
//     * @param list
//     * @param size
//     * @return
//     * @param <T>
//     */
//    private static <T> List<T> randomSelection(List<T> list, int size) {
//        List<T> selected = new ArrayList<>();
//        int length = list.size();
//        for (int i = 0; i < size; i++) {
//            Collections.shuffle(list);
//            // 如果需求的大小超过了集合的长度,则只能取到集合的全部元素
//            int subListSize = Math.min(size - selected.size(), length);
//            selected.addAll(list.subList(0, subListSize));
//        }
//        return selected;
//    }
//
//}
ruoyi-applet/src/main/java/com/ruoyi/web/controller/api/TIndexController.java
@@ -99,6 +99,7 @@
    @Resource
    private TSystemBulletinService systemBulletinService;
    @ApiOperation(value = "首页-系统公告")
    @PostMapping(value = "/systemBulletin")
    public R<TSystemBulletin> systemBulletin() {
@@ -110,17 +111,28 @@
    @PostMapping(value = "/dataReport")
    public R<DataReportVO> dataReport(@RequestBody DataReportDTO dto) {
        DataReportQuery dataReportQuery = new DataReportQuery();
        dataReportQuery.setStartTime(dto.getStartTime());
        dataReportQuery.setEndTime(dto.getEndTime());
        dataReportQuery.setStartTime(dto.getStartTime()+" 00:00:00");
        dataReportQuery.setEndTime(dto.getEndTime()+" 23:59:59");
        dataReportQuery.setPageNum(dto.getPageNum());
        dataReportQuery.setPageSize(dto.getPageSize());
        DataReportVO res = new DataReportVO();
        List<TDictData> dataList = dictDataService.list();
        List<TProjectDept> projectDepts = projectDeptService.list();
        List<TTaskDetail> taskDetails = taskDetailService.lambdaQuery()
                .isNotNull(TTaskDetail::getClearStatus)
                .eq(TTaskDetail::getHandleType,1)
                .eq(TTaskDetail::getAuditStatus,1)
                .groupBy(TTaskDetail::getTaskId)
                .orderByDesc(BaseModel::getCreateTime)
                .list();
        taskDetails = new ArrayList<>(taskDetails.stream()
                .collect(Collectors.groupingBy(
                        TTaskDetail::getTaskId,
                        Collectors.collectingAndThen(
                                Collectors.toList(),
                                listAll -> listAll.get(0)
                        )
                ))
                .values());
        List<String> userDeptIds = new ArrayList<>();
        LambdaQueryWrapper<TTask> tTaskLambdaQueryWrapper = new LambdaQueryWrapper<>();
        if (StringUtils.hasLength(dto.getProjectId())) {
@@ -151,6 +163,7 @@
                        tTaskLambdaQueryWrapper.eq(TTask::getProjectId, projectDept.getId());
                        userDeptIds.add(projectDept.getId());
                    } else {
                        userDeptIds.add(projectDept.getId());
                        List<TProjectDept> list = projectDeptService.lambdaQuery().eq(TProjectDept::getParentId, projectDept.getId()).list();
                        List<String> deptIds = list.stream().map(TProjectDept::getId).collect(Collectors.toList());
                        if (!deptIds.isEmpty()) {
@@ -167,8 +180,8 @@
        dataReportQuery.setProjectIds(userDeptIds);
        if (StringUtils.hasLength(dto.getStartTime())) {
            tTaskLambdaQueryWrapper.ge(TTask::getImplementTime, dto.getStartTime());
            tTaskLambdaQueryWrapper.le(TTask::getImplementTime, dto.getEndTime());
            tTaskLambdaQueryWrapper.ge(TTask::getImplementTime, dto.getStartTime()+" 00:00:00");
            tTaskLambdaQueryWrapper.le(TTask::getImplementTime, dto.getEndTime()+" 23:59:59");
        } else {
            // 获取今天凌晨00:00:00 和今天23:59:59 类型为LocalDateTime
            LocalDateTime startOfToday = LocalDateTime.of(LocalDate.now(), LocalTime.MIN);
@@ -176,7 +189,7 @@
            tTaskLambdaQueryWrapper.ge(TTask::getImplementTime, startOfToday);
            tTaskLambdaQueryWrapper.le(TTask::getImplementTime, endOfToday);
        }
        tTaskLambdaQueryWrapper.ne(TTask::getStatus, 1);
//        tTaskLambdaQueryWrapper.ne(TTask::getStatus, 1);
        List<TTask> tasks = taskCleanerService.list(tTaskLambdaQueryWrapper);
        HashMap<String, Integer> taskMap = new HashMap<>();
        HashMap<String, Integer> statusMap = new HashMap<>();
@@ -213,13 +226,12 @@
                    break;
                case 5:
                    temp.append("已完成");
                    break;
                case 6:
                    temp.append("已完成");
                    break;
            }
            statusMap.put(temp.toString(), statusMap.getOrDefault(task.getStatus()+"", 0) + 1);
            statusMap.put(temp.toString(), statusMap.getOrDefault(temp.toString(), 0) + 1);
            TTaskDetail tTaskDetail = taskDetails.stream().filter(e -> e.getTaskId().equals(task.getId())).findFirst().orElse(null);
            StringBuilder temp1 = new StringBuilder();
            if (tTaskDetail!=null){
@@ -244,6 +256,10 @@
            int pass=0;
            int unPass=0;
            List<TTask> userTaskList = tasks.stream().filter(e -> e.getPatrolInspector().equals(record.getUserId() + "")).collect(Collectors.toList());
            List<TTask> userTaskListPass = tasks.stream().filter(e ->
                    (e.getStatus()==5||e.getStatus()==6)
                    &&
                    e.getPatrolInspector().equals(record.getUserId() + "")).collect(Collectors.toList());
            for (TTask tTask : userTaskList) {
                TTaskDetail tTaskDetail = taskDetails.stream().filter(e -> e.getTaskId().equals(tTask.getId())).findFirst().orElse(null);
                if (tTaskDetail!=null){
@@ -260,9 +276,7 @@
            }
            record.setTotal(userTaskList.size());
            record.setRate(pass+unPass!=0?new BigDecimal(pass).divide(new BigDecimal(pass+unPass),2,RoundingMode.HALF_DOWN).multiply(new BigDecimal(100)):BigDecimal.ZERO);
            List<TTask> status1 = userTaskList.stream().filter(e -> e.getStatus() == 5 || e.getStatus() == 6).collect(Collectors.toList());
            List<TTask> status2 = userTaskList.stream().filter(e -> e.getStatus() != 5 && e.getStatus() != 6).collect(Collectors.toList());
            record.setFinish(!status1.isEmpty()?new BigDecimal(status1.size()).divide(new BigDecimal(status1.size()+status2.size()),2,RoundingMode.HALF_DOWN).multiply(new BigDecimal(100)):BigDecimal.ZERO);
            record.setFinish(!userTaskList.isEmpty()?new BigDecimal(userTaskListPass.size()).divide(new BigDecimal(userTaskList.size()),2,RoundingMode.HALF_DOWN).multiply(new BigDecimal(100)):BigDecimal.ZERO);
        }
//        PageInfo<TaskFinishListVO> taskFinishListVOPageInfo = new PageInfo<>();
@@ -305,9 +319,6 @@
    @ApiOperation(value = "首页")
    @PostMapping(value = "/index")
    public R<IndexVO> index(@RequestBody IndexDTO dto) throws IOException {
//        if (!StringUtils.hasLength(dto.getLon()) || !StringUtils.hasLength(dto.getLat())) {
//            return R.fail("请上传经纬度");
//        }
        IndexVO res = new IndexVO();
        res.setIsNotice(0);
        Long userId = tokenService.getLoginUserApplet().getUserId();
@@ -315,6 +326,8 @@
        if (count>0){
            res.setIsNotice(1);
        }
        List<TProjectDept> projectListAll = projectDeptService.list();
        List<TLocation> locationList = locationService.list();
        List<TLocationType> locationTypeList = locationTypeService.list();
        List<TTask> taskAll = taskCleanerService.lambdaQuery().eq(TTask::getPatrolInspector, userId).list();
@@ -336,9 +349,10 @@
                TProjectDept projectDept = projectDeptService.getById(sysUser.getDeptId());
                if (projectDept != null) {
                    if ("0".equals(projectDept.getParentId())) {
                        List<String> collect = projectListAll.stream().filter(e -> e.getParentId().equals(projectDept.getId())).map(TProjectDept::getId).collect(Collectors.toList());
                        collect.add(projectDept.getId());
                        // 查询片区下的所有人员
                        users = sysUsers.stream().filter(e -> e.getDeptId()
                                .equals(projectDept.getId())
                        users = sysUsers.stream().filter(e ->collect.contains(e.getDeptId())
                                && e.getStatus().equals("0")
                                && e.getDeptType() == 1).collect(Collectors.toList());
                    } else {
@@ -363,10 +377,7 @@
                TDept dept = deptService.getById(sysUser.getDeptId());
                if (dept != null) {
                    if (!dept.getDeptName().contains("公司")) {
                        users = sysUsers.stream().filter(e -> (e.getDeptId()
                                .equals(sysUser.getDeptId())
                                && e.getStatus().equals("0"))
                                || e.getDeptType() == 1).collect(Collectors.toList());
                        users = sysUsers.stream().filter(e -> e.getDeptType() == 1).collect(Collectors.toList());
                    }
                }
@@ -387,12 +398,21 @@
                        .multiply(new BigDecimal(100))
                        : new BigDecimal(0));
                List<TTaskDetail> taskDetails = taskDetailService.lambdaQuery()
                        .eq(TTaskDetail::getAuditStatus, 1).in(TTaskDetail::getTaskId, taskIds)
                        .eq(TTaskDetail::getAuditStatus, 1)
                        .in(TTaskDetail::getTaskId, taskIds)
                        .isNotNull(TTaskDetail::getClearStatus)
                        .groupBy(TTaskDetail::getTaskId)
                        .eq(TTaskDetail::getHandleType,1)
                        .orderByDesc(TTaskDetail::getCreateTime).list();
                taskDetails = new ArrayList<>(taskDetails.stream()
                        .collect(Collectors.groupingBy(
                                TTaskDetail::getTaskId,
                                Collectors.collectingAndThen(
                                        Collectors.toList(),
                                        listAll -> listAll.get(0)
                                )
                        ))
                        .values());
                List<TTaskDetail> status3 = taskDetails.stream().filter(e -> e.getClearStatus() == 1).collect(Collectors.toList());
                List<TTaskDetail> status4 = taskDetails.stream().filter(e -> e.getClearStatus() == 2).collect(Collectors.toList());
                if (!status3.isEmpty()) {
@@ -432,6 +452,9 @@
        }
        List<TTask> taskList = taskAll.stream().filter(e -> e.getPatrolInspector().equals(userId + "") && e.getStatus() == 4).collect(Collectors.toList());
        List<String> taskIds = taskList.stream().map(TTask::getId).collect(Collectors.toList());
        // 驳回原因
        List<TTaskDetail> tTaskDetails = taskDetailService.list(new LambdaQueryWrapper<TTaskDetail>()
                .eq(TTaskDetail::getHandleType,3).groupBy(TTaskDetail::getTaskId).orderByDesc(TTaskDetail::getCreateTime));
        for (TTask tTask : taskList) {
            List<TTaskDetail> taskDetailsStatus1 = taskDetailService.lambdaQuery()
                    .eq(TTaskDetail::getAuditStatus, 1).in(TTaskDetail::getTaskId, taskIds)
@@ -462,12 +485,45 @@
                    taskTodayVO.setLocationTypeIcon(tLocationType.getLocationIcon());
                }
            }
            TTaskDetail tTaskDetail = taskDetailsStatus1.stream().filter(e -> e.getTaskId().equals(tTask.getId())).findFirst().orElse(null);
            if (tTaskDetail != null) {
                String unqualified = tTaskDetail.getUnqualified();
                TDictData dictData = dictDataService.lambdaQuery().eq(TDictData::getId, unqualified).one();
                if (dictData != null) {
                    taskTodayVO.setRemark(dictData.getDataContent());
            TTaskDetail tTaskDetail = tTaskDetails.stream().filter(e -> e.getTaskId().equals(tTask.getId())).findFirst().orElse(null);
            if (tTaskDetail!=null){
                taskTodayVO.setRemark(tTaskDetail.getAuditRemark());
            }
            // 任务记录ids
            List<String> collect = taskAll.stream().map(TTask::getId).collect(Collectors.toList());
            if (!collect.isEmpty()){
                List<TInspector> list1 = inspectorService.lambdaQuery()
                        .in(TInspector::getTaskId, collect).eq(TInspector::getStatus, 2).list();
                for (TInspector tInspector : list1) {
                    TaskPendingVO taskTodayVOOne = new TaskPendingVO();
                    BeanUtils.copyProperties(tTask, taskTodayVOOne);
                    taskTodayVOOne.setId(tInspector.getId());
                    TLocation tLocationOne = locationList.stream().filter(e -> e.getId().equals(tTask.getLocationId())).findFirst().orElse(null);
                    if (tLocationOne != null) {
                        taskTodayVOOne.setLocationAddress(tLocationOne.getLocationAddress());
                        taskTodayVOOne.setLocationLon(tLocationOne.getLocationLon());
                        taskTodayVOOne.setLocationLat(tLocationOne.getLocationLat());
                        taskTodayVOOne.setLocationName(tLocationOne.getLocationName());
                        if(StringUtils.hasLength(dto.getLon())){
                            Map<String, String> distance = amapApiClient.getDistance(dto.getLon() + "," + dto.getLat(), tLocationOne.getLocationLon() + "," + tLocationOne.getLocationLat(), 1);
                            if (distance != null) {
                                taskTodayVOOne.setDistance(new BigDecimal(distance.get("distance")).divide(new BigDecimal(1000)).setScale(2, BigDecimal.ROUND_HALF_EVEN));
                            } else {
                                taskTodayVOOne.setDistance(new BigDecimal("0"));
                            }
                        }else {
                            taskTodayVOOne.setDistance(new BigDecimal("0"));
                        }
                        TLocationType tLocationType = locationTypeList.stream().filter(e -> e.getId().equals(tLocationOne.getLocationType())).findFirst().orElse(null);
                        if (tLocationType != null) {
                            taskTodayVOOne.setLocationTypeName(tLocationType.getLocationName());
                            taskTodayVOOne.setLocationTypeIcon(tLocationType.getLocationIcon());
                        }
                    }
                    taskTodayVOOne.setStatus(4);
                    taskTodayVOOne.setRemark(tInspector.getAuditRemark());
                    pendingTask.add(taskTodayVOOne);
                }
            }
            pendingTask.add(taskTodayVO);
@@ -511,15 +567,12 @@
                    taskTodayVO.setLocationTypeIcon(tLocationType.getLocationIcon());
                }
            }
            TTaskDetail tTaskDetail = taskDetailsStatus1.stream().filter(e -> e.getTaskId().equals(tTask.getId())).findFirst().orElse(null);
            if (tTaskDetail != null) {
                String unqualified = tTaskDetail.getUnqualified();
                TDictData dictData = dictDataService.lambdaQuery().eq(TDictData::getId, unqualified).one();
                if (dictData != null) {
                    taskTodayVO.setRemark(dictData.getDataContent());
                }
            TTaskDetail tTaskDetail = tTaskDetails.stream().filter(e -> e.getTaskId().equals(tTask.getId())).findFirst().orElse(null);
            if (tTaskDetail!=null){
                taskTodayVO.setRemark(tTaskDetail.getAuditRemark());
            }
            todayTask.add(taskTodayVO);
        }
        // 将todayTask进行排序 优先根据status状态排序,优先展示未执行、超时、待整改、待确认、整改完成、已完成,然后状态一样再根据距离排序
        sortTodayTasks(todayTask);
ruoyi-applet/src/main/java/com/ruoyi/web/controller/api/TTaskDetailController.java
@@ -3,6 +3,7 @@
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.ruoyi.common.annotation.Log;
import com.ruoyi.common.core.domain.R;
@@ -11,14 +12,8 @@
import com.ruoyi.system.applet.dto.AppealDTO;
import com.ruoyi.system.dto.TTaskAuditBatchDTO;
import com.ruoyi.system.dto.TaskDetailDto;
import com.ruoyi.system.model.TAppeal;
import com.ruoyi.system.model.TLocation;
import com.ruoyi.system.model.TTask;
import com.ruoyi.system.model.TTaskDetail;
import com.ruoyi.system.service.TAppealService;
import com.ruoyi.system.service.TLocationService;
import com.ruoyi.system.service.TTaskCleanService;
import com.ruoyi.system.service.TTaskDetailService;
import com.ruoyi.system.model.*;
import com.ruoyi.system.service.*;
import com.ruoyi.web.controller.tool.AmapApiClient;
import com.ruoyi.web.controller.tool.GeoChecker;
import com.ruoyi.web.controller.tool.PathParser;
@@ -37,6 +32,7 @@
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
/**
 * <p>
@@ -59,6 +55,8 @@
    private TAppealService appealService;
    @Autowired
    private TLocationService locationService;
    @Resource
    private TInspectorService inspectorService;
    @ApiOperation(value = "上传任务")
    @PostMapping(value = "/uploadTask")
@@ -69,7 +67,23 @@
        if (task==null)return R.fail("任务不存在");
        TLocation location = locationService.getById(task.getLocationId());
        if (location==null)return R.fail("点位不存在");
//        try {
        TInspector byId = inspectorService.getById(dto.getId());
        if (byId!=null){
            UpdateWrapper<TInspector> tInspectorUpdateWrapper = new UpdateWrapper<>();
            tInspectorUpdateWrapper.set("clear_status", dto.getClearStatus());
            tInspectorUpdateWrapper.set("unqualified", dto.getUnqualified());
            tInspectorUpdateWrapper.set("remark", dto.getRemark());
            tInspectorUpdateWrapper.set("picture", dto.getPicture());
            tInspectorUpdateWrapper.set("audio_url", dto.getAudioUrl());
            tInspectorUpdateWrapper.set("status", 1);
            tInspectorUpdateWrapper.set("audit_time", 1);
            tInspectorUpdateWrapper.set("audit_person", 1);
            tInspectorUpdateWrapper.set("audit_status", 1);
            tInspectorUpdateWrapper.set("audit_remark", 1);
            tInspectorUpdateWrapper.eq("id", dto.getId());
            inspectorService.update(tInspectorUpdateWrapper);
        }else{
            //        try {
//            String routeJson = AmapApiClient.getDrivingRoute(Double.parseDouble(location.getLocationLat()),
//                    Double.parseDouble(location.getLocationLon()),
//                            Double.parseDouble(location.getLocationLatEnd()),
@@ -97,9 +111,11 @@
//        } catch (Exception e) {
//            e.printStackTrace();
//        }
        taskDetailService.save(dto);
        // 修改任务状态
        taskService.update(Wrappers.<TTask>lambdaUpdate().set(TTask::getStatus, 3).eq(TTask::getId, dto.getTaskId()));
            taskDetailService.save(dto);
            // 修改任务状态
            taskService.update(Wrappers.<TTask>lambdaUpdate().set(TTask::getStatus, 3).eq(TTask::getId, dto.getTaskId()));
        }
        return R.ok();
    }
@@ -114,10 +130,27 @@
        }
        dto.setAppealPerson(tokenService.getLoginUserApplet().getUserId()+"");
        appealService.save(dto);
        List<TTaskDetail> taskDetails = taskDetailService.lambdaQuery()
                .eq(TTaskDetail::getTaskId, dto.getTaskId())
                .eq(TTaskDetail::getAuditStatus, 1)
                .eq(TTaskDetail::getHandleType,1)
                .isNotNull(TTaskDetail::getClearStatus)
                .orderByDesc(TTaskDetail::getCreateTime).list();
        // 使用 stream 去重,保留每个 taskId 最新的一条
        taskDetails = new ArrayList<>(taskDetails.stream()
                .collect(Collectors.groupingBy(
                        TTaskDetail::getTaskId,
                        Collectors.collectingAndThen(
                                Collectors.toList(),
                                listAll -> listAll.get(0)
                        )
                ))
                .values());
        // 添加任务详情
        TTaskDetail taskDetail = new TTaskDetail();
        taskDetail.setTaskId(dto.getTaskId());
        taskDetail.setHandleType(4);
        taskDetail.setClearStatus(taskDetail.getClearStatus());
        taskDetail.setAppealId(dto.getId());
        taskDetailService.save(taskDetail);
        return R.ok();
ruoyi-applet/src/main/java/com/ruoyi/web/controller/api/TUserController.java
@@ -239,18 +239,31 @@
        List<TTaskDetail> taskDetails = taskDetailService.lambdaQuery()
                .in(TTaskDetail::getTaskId, taskIds)
                .eq(TTaskDetail::getAuditStatus, 1)
                .eq(TTaskDetail::getHandleType,1)
                .isNotNull(TTaskDetail::getClearStatus)
                .groupBy(TTaskDetail::getTaskId)
                .orderByDesc(TTaskDetail::getCreateTime).list();
        // 使用 stream 去重,保留每个 taskId 最新的一条
        taskDetails = new ArrayList<>(taskDetails.stream()
                .collect(Collectors.groupingBy(
                        TTaskDetail::getTaskId,
                        Collectors.collectingAndThen(
                                Collectors.toList(),
                                listAll -> listAll.get(0)
                        )
                ))
                .values());
        int size = (int) finishTask.stream().filter(e -> e.getStatus() == 5 || e.getStatus() == 6).count();
        List<String> taskIdsStatus = finishTask.stream().map(TTask::getId).collect(Collectors.toList());
        if (taskIdsStatus.isEmpty()){
            taskIdsStatus.add("-1");
        }
        userIndexVO.setFinishCount(size);
        List<TTaskDetail> status1 = taskDetails.stream().filter(e -> e.getClearStatus() == 1).collect(Collectors.toList());
        List<TTaskDetail> status2 = taskDetails.stream().filter(e -> e.getClearStatus() == 2).collect(Collectors.toList());
        List<TTaskDetail> status1 = taskDetails.stream().filter(e -> e.getClearStatus() == 1&&taskIdsStatus.contains(e.getTaskId())).collect(Collectors.toList());
        List<TTaskDetail> status2 = taskDetails.stream().filter(e -> e.getClearStatus() == 2&&taskIdsStatus.contains(e.getTaskId())).collect(Collectors.toList());
        if (!status1.isEmpty()) {
            BigDecimal divide = new BigDecimal(status1.size() + status2.size())
                    .divide(new BigDecimal(status1.size()), 2, BigDecimal.ROUND_DOWN).multiply(new BigDecimal(100));
            BigDecimal divide = new BigDecimal(status1.size())
                    .divide(new BigDecimal(status1.size()+status2.size()), 2, BigDecimal.ROUND_DOWN).multiply(new BigDecimal(100));
            userIndexVO.setRate(divide);
        } else {
            userIndexVO.setRate(new BigDecimal(0));
@@ -267,11 +280,7 @@
        if (taskIdsRank.isEmpty()){
            userIndexVO.setRanking(0);
        }else{
            List<TTaskDetail> taskDetailsRank = taskDetailService.lambdaQuery().in(TTaskDetail::getTaskId)
                    .eq(TTaskDetail::getAuditStatus, 1)
                    .isNotNull(TTaskDetail::getClearStatus)
                    .groupBy(TTaskDetail::getTaskId)
                    .orderByDesc(TTaskDetail::getCreateTime).list();
            for (SysUser user : users) {
                int finishCount = (int) taskRank.stream().filter(e->e.getPatrolInspector().equals(user.getUserId()+"")&&e.getStatus() == 5 || e.getStatus() == 6).count();
                int totalCount = (int) taskRank.stream().filter(e->e.getPatrolInspector().equals(user.getUserId()+"")).count();
@@ -333,19 +342,30 @@
        taskDetailVO.setLocationAddressEnd(byId1.getLocationAddressEnd());
        taskDetailVO.setLocationIcon(byId2.getLocationIcon());
        taskDetailVO.setLocationTypeName(byId2.getLocationName());
        taskDetailVO.setLocationLon(byId1.getLocationLon());
        taskDetailVO.setLocationLat(byId1.getLocationLat());
        taskDetailVO.setLocationLatEnd(byId1.getLocationLatEnd());
        taskDetailVO.setLocationLonEnd(byId1.getLocationLonEnd());
        TTaskDetail tTaskDetail = list.stream().filter(e -> e.getHandleType() == 1).findFirst().orElse(null);
        TTaskDetail tTaskDetailFinish = list.stream().filter(e -> e.getHandleType() == 2).findFirst().orElse(null);
        if (tTaskDetail != null && tTaskDetail.getUnqualified() != null) {
            TDictData byId3 = dictDataService.getById(tTaskDetail.getUnqualified());
            if (byId3 != null) {
                tTaskDetail.setUnqualifiedName(byId3.getDataContent());
            }
        }
        if (tTaskDetailFinish != null) {
            tTaskDetailFinish.setFinishTime(tTaskDetailFinish.getCreateTime());
        if (tTaskDetail != null) {
            tTaskDetail.setFinishTime(tTaskDetail.getCreateTime());
        }
        taskDetailVO.setTaskDetail(tTaskDetail);
        taskDetailVO.setRecords(list);
        if (byId.getStatus()==4){
            TTaskDetail reject = taskDetailService.lambdaQuery().eq(TTaskDetail::getTaskId, id)
                    .eq(TTaskDetail::getHandleType,3)
                    .orderByDesc(BaseModel::getCreateTime).last("limit 1").one();
            if (reject!=null){
                taskDetailVO.setRejectRemark(reject.getAuditRemark());
            }
        }
        return R.ok(taskDetailVO);
    }
@@ -367,6 +387,7 @@
                byId4.setUnqualifiedName(byId3.getDataContent());
            }
        }
        byId4.setFinishTime(byId4.getCreateTime());
        SysUser sysUser = sysUserService.selectUserById(Long.valueOf(byId4.getAuditPerson()));
        if (sysUser != null) {
            byId4.setAuditPersonName(sysUser.getUserName());
@@ -393,8 +414,9 @@
        TLocationType byId2 = locationTypeService.getById(byId1.getLocationType());
        appealDetailVO.setLocationAddress(byId1.getLocationAddress());
        appealDetailVO.setLocationIcon(byId2.getLocationIcon());
        appealDetailVO.setLocationName(byId2.getLocationName());
        appealDetailVO.setLocationName(byId1.getLocationName());
        appealDetailVO.setTaskId(byId.getId());
        appealDetailVO.setLocationTypeName(byId2.getLocationName());
        if (StringUtils.hasLength(appeal.getAuditPerson())) {
            SysUser sysUser = sysUserService.selectUserById(Long.valueOf(appeal.getAuditPerson()));
            if (sysUser != null) {
@@ -420,6 +442,11 @@
    @PostMapping(value = "/listAllTask")
    public R<List<TaskListAllVO>> listAllTask(@RequestBody AppealListDTO appealListDTO) {
        appealListDTO.setUserId(tokenService.getLoginUserApplet().getUserId() + "");
        SysUser sysUser = sysUserService.selectUserById(tokenService.getLoginUserApplet().getUserId());
        if (sysUser.getDeptType()==2){
            // 公司部门查询所有任务
            appealListDTO.setUserId(null);
        }
        List<TaskListAllVO> res = appealService.listAllTask(appealListDTO);
        return R.ok(res);
    }
@@ -516,6 +543,8 @@
        SysRole sysRole = roleService.selectRoleById(userRole);
        List<SysUser> sysUsers = sysUserService.selectAllList();
        SysUser auditPerson = sysUserService.selectUserById(999L);
        List<TProjectDept> paojectList = projectDeptService.lambdaQuery().eq(TProjectDept::getParentId, "0").list();
        //项目部负责人、部门负责人、公司成员提交由最终审批人审批;
        if (user.getDeptType() == 2 || sysRole.getRoleName().contains("项目部负责人") || sysRole.getRoleName().contains("部门负责人")) {
            LeaveAuditVO tLeaveAudit = new LeaveAuditVO();
@@ -525,19 +554,24 @@
            res.setAuditPersonId("999");
        } else if (!sysRole.getRoleName().equals("部门助理")) {
            // 审批人根据当前角色类型来
            if (sysRole.getRoleName().contains("片区负责人") || sysRole.getRoleName().contains("组长/队长")||sysRole.getRoleName().contains("项目部助理")) {
                List<SysUser> collect = sysUsers.stream().filter(e -> e.getDeptType() == 1 &&
                        e.getDeptId().equals(user.getDeptId())).collect(Collectors.toList());
            if (sysRole.getRoleName().contains("片区负责人") || sysRole.getRoleName().contains("组长")|| sysRole.getRoleName().contains("队长")
                    ||sysRole.getRoleName().contains("项目部助理")) {
                TProjectDept userDept = projectDeptService.getById(user.getDeptId());
                List<SysUser> collect = sysUsers.stream().filter(e -> e.getDeptType() == 1).collect(Collectors.toList());
                for (SysUser sysUser : collect) {
                    Long userRole1 = sysUserService.getUserRole(sysUser.getUserId());
                    SysRole sysRole1 = roleService.selectRoleById(userRole1);
                    if (sysRole1 != null && sysRole1.getRoleName().equals("项目部负责人")) {
                        LeaveAuditVO tLeaveAudit = new LeaveAuditVO();
                        tLeaveAudit.setAvatar(sysUser.getAvatar());
                        tLeaveAudit.setNickName(sysUser.getNickName());
                        res.setAuditPerson(tLeaveAudit);
                        res.setAuditPersonId(sysUser.getUserId() + "");
                        break;
                        if (userDept.getParentId().equals(sysUser.getDeptId())){
                            LeaveAuditVO tLeaveAudit = new LeaveAuditVO();
                            tLeaveAudit.setAvatar(sysUser.getAvatar());
                            tLeaveAudit.setNickName(sysUser.getNickName());
                            res.setAuditPerson(tLeaveAudit);
                            res.setAuditPersonId(sysUser.getUserId() + "");
                            break;
                        }
                    }
                }
            }
@@ -613,19 +647,35 @@
            leaveAuditService.save(tLeaveAudit1);
        } else if (!sysRole.getRoleName().equals("部门助理")) {
            // 审批人根据当前角色类型来
            if (sysRole.getRoleName().contains("片区负责人") || sysRole.getRoleName().contains("组长/队长")||sysRole.getRoleName().contains("项目部助理")) {
                List<SysUser> collect = sysUsers.stream().filter(e -> e.getDeptType() == 1 &&
                        e.getDeptId().equals(user.getDeptId())).collect(Collectors.toList());
            if (sysRole.getRoleName().contains("片区负责人") || sysRole.getRoleName().contains("组长")|| sysRole.getRoleName().contains("队长")
                    ||sysRole.getRoleName().contains("项目部助理")) {
                TProjectDept userDept = projectDeptService.getById(user.getDeptId());
                List<SysUser> collect = sysUsers.stream().filter(e -> e.getDeptType() == 1).collect(Collectors.toList());
                for (SysUser sysUser : collect) {
                    Long userRole1 = sysUserService.getUserRole(sysUser.getUserId());
                    SysRole sysRole1 = roleService.selectRoleById(userRole1);
                    if (sysRole1 != null && sysRole1.getRoleName().equals("项目部负责人")) {
                        TLeaveAudit tLeaveAudit1 = new TLeaveAudit();
                        tLeaveAudit1.setLeaveId(leaveDTO.getId());
                        tLeaveAudit1.setAuditStatus(1);
                        tLeaveAudit1.setAuditId(sysUser.getUserId() + "");
                        tLeaveAudit1.setAuditType(1);
                        leaveAuditService.save(tLeaveAudit1);
                        if (userDept.getParentId().equals(sysUser.getDeptId())){
                            LeaveAuditVO tLeaveAudit = new LeaveAuditVO();
                            tLeaveAudit.setAvatar(sysUser.getAvatar());
                            tLeaveAudit.setNickName(sysUser.getNickName());
                            TLeaveAudit tLeaveAudit1 = new TLeaveAudit();
                            tLeaveAudit1.setLeaveId(leaveDTO.getId());
                            tLeaveAudit1.setAuditStatus(1);
                            tLeaveAudit1.setAuditId(sysUser.getUserId() + "");
                            tLeaveAudit1.setAuditType(1);
                            leaveAuditService.save(tLeaveAudit1);
                            TLeaveAudit tLeaveAudit2 = new TLeaveAudit();
                            tLeaveAudit2.setLeaveId(leaveDTO.getId());
                            tLeaveAudit2.setAuditStatus(2);
                            tLeaveAudit2.setAuditId(user.getUserId() + "," + sysUser.getUserId());
                            tLeaveAudit2.setAuditType(2);
                            tLeaveAudit2.setAuditTime(LocalDateTime.now());
                            leaveAuditService.save(tLeaveAudit2);
                            break;
                        }
                    }
                }
            }
@@ -642,16 +692,17 @@
                    tLeaveAudit1.setAuditId(sysUser.getUserId() + "");
                    tLeaveAudit1.setAuditType(1);
                    leaveAuditService.save(tLeaveAudit1);
                    TLeaveAudit tLeaveAudit2 = new TLeaveAudit();
                    tLeaveAudit2.setLeaveId(leaveDTO.getId());
                    tLeaveAudit2.setAuditStatus(2);
                    tLeaveAudit2.setAuditId(user.getUserId() + "," + auditPerson.getUserId());
                    tLeaveAudit2.setAuditType(2);
                    tLeaveAudit2.setAuditTime(LocalDateTime.now());
                    leaveAuditService.save(tLeaveAudit2);
                }
            }
        }
        TLeaveAudit tLeaveAudit2 = new TLeaveAudit();
        tLeaveAudit2.setLeaveId(leaveDTO.getId());
        tLeaveAudit2.setAuditStatus(2);
        tLeaveAudit2.setAuditId(user.getUserId() + "," + auditPerson.getUserId());
        tLeaveAudit2.setAuditType(2);
        tLeaveAudit2.setAuditTime(LocalDateTime.now());
        leaveAuditService.save(tLeaveAudit2);
        // 新增消息
        TNotice tNotice = new TNotice();
        tNotice.setUserId(leaveDTO.getAuditId());
@@ -702,10 +753,10 @@
    public  R<LeaveUserDetailVO> leaveDetail(@RequestParam String id) {
        TLeave leave = leaveService.getById(id);
        LeaveUserDetailVO leaveUserDetailVO = new LeaveUserDetailVO();
        SysUser sysUser = sysUserService.selectUserById(Long.parseLong(leave.getLeavePerson()));
        SysUser sysUser = sysUserService.selectUserById(tokenService.getLoginUserApplet().getUserId());
        Long userRole = sysUserService.getUserRole(sysUser.getUserId());
        SysRole sysRole = roleService.selectRoleById(userRole);
        if (sysRole.getRoleName().contains("片区负责人") || sysRole.getRoleName().equals("组长/队长")||sysRole.getRoleName().contains("项目部助理")) {
        if (sysRole.getRoleName().contains("片区负责人") || sysRole.getRoleName().equals("组长")|| sysRole.getRoleName().equals("队长")||sysRole.getRoleName().contains("项目部助理")) {
            if (sysUser.getDeptType() == 1) {
                TProjectDept tProjectDept = projectDeptService.getById(sysUser.getDeptId());
                if (!tProjectDept.getParentId().equals("0")) {
ruoyi-system/src/main/java/com/ruoyi/system/applet/vo/TaskListAllVO.java
@@ -28,5 +28,7 @@
    private Integer status;
    @ApiModelProperty(value = "距离 单位km")
    private BigDecimal distance;
    @ApiModelProperty(value = "驳回原因")
    private String rejectRemark;
}
ruoyi-system/src/main/java/com/ruoyi/system/dto/SysRoleDTO.java
@@ -19,6 +19,8 @@
    @ApiModelProperty(value = "类型")
    private Integer postType;
    @ApiModelProperty(value = "归属类型")
    private Integer roleType;
    @ApiModelProperty(value = "备注")
    private String remark;
ruoyi-system/src/main/java/com/ruoyi/system/dto/TTaskAuditBatchDTO.java
@@ -13,7 +13,6 @@
public class TTaskAuditBatchDTO{
    @ApiModelProperty(value = "审核状态1通过2驳回")
    @NotBlank(message = "审核状态不能为空")
    private Integer auditStatus;
    @ApiModelProperty(value = "审核备注")
    private String auditRemark;
ruoyi-system/src/main/java/com/ruoyi/system/model/TDictData.java
@@ -38,7 +38,7 @@
    @TableField("data_content")
    private String dataContent;
    @ApiModelProperty(value = "类型1任务类型 2不合格原因 3问题上报类型")
    @ApiModelProperty(value = "类型1任务类型 2不合格原因 3问题上报类型 4邮箱号 5授权码")
    @TableField("data_type")
    private Integer dataType;
ruoyi-system/src/main/java/com/ruoyi/system/query/PatrolInspectorQuery.java
@@ -18,7 +18,7 @@
    @ApiModelProperty(value = "用户ids 前端忽略")
    private List<Long> patrolInspectorIds;
    @ApiModelProperty(value = "部门ids 前端忽略")
    private List<Long> deptIds;
    private List<String> deptIds;
    @ApiModelProperty(value = "开始时间 yyyy-MM-dd HH:mm:ss")
    private String startTime;
    @ApiModelProperty(value = "结束时间 yyyy-MM-dd HH:mm:ss")
ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysRoleServiceImpl.java
@@ -4,6 +4,7 @@
import java.util.stream.Collectors;
import com.ruoyi.common.basic.PageInfo;
import com.ruoyi.common.core.domain.R;
import com.ruoyi.common.core.domain.entity.SysMenu;
import com.ruoyi.system.dto.SysRoleDTO;
import com.ruoyi.system.mapper.*;
@@ -560,6 +561,7 @@
        sysRole.setRoleName(dto.getRoleName());
        sysRole.setPostType(dto.getPostType());
        sysRole.setRemark(dto.getRemark());
        sysRole.setRoleType(dto.getRoleType());
        roleMapper.insertRole(sysRole);
        // 添加角色权限中间表
@@ -590,6 +592,7 @@
        sysRole.setRoleName(dto.getRoleName());
        sysRole.setPostType(dto.getPostType());
        sysRole.setRemark(dto.getRemark());
        sysRole.setRoleType(dto.getRoleType());
        roleMapper.updateRole(sysRole);
        // 删除角色与菜单关联
        roleMenuMapper.deleteRoleMenuByRoleId(dto.getRoleId());
ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TAppealServiceImpl.java
@@ -16,6 +16,7 @@
import com.ruoyi.system.vo.system.InspectorListVO;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;
import java.math.BigDecimal;
import java.math.RoundingMode;
@@ -44,30 +45,37 @@
    private SysUserMapper sysUserMapper;
    @Override
    public PageInfo<AppealListVO> pageList(InsepectorListQuery query) {
        if (StringUtils.hasLength(query.getEndTime())){
            String replace = query.getEndTime().replace(" 00:00:00", " 23:59:59");
            query.setEndTime(replace);
        }
        PageInfo<AppealListVO> pageInfo = new PageInfo<>(query.getPageNum(), query.getPageSize());
        List<AppealListVO> list = this.baseMapper.pageList(query,pageInfo);
        List<TTask> tTasks = taskMapper.selectList(null);
        List<SysUser> sysUsers = sysUserMapper.selectAllList();
        for (AppealListVO taskListVO : list) {
            TTask tTask = tTasks.stream().filter(e -> e.getId().equals(taskListVO.getTaskId())).findFirst().orElse(null);
            if (tTask!=null){
                SysUser sysUser = sysUsers.stream().filter(e -> e.getUserId().equals(Long.valueOf(tTask.getPatrolInspector()))).findFirst().orElse(null);
                SysUser sysUser = sysUsers.stream().filter(e -> e.getUserId().equals(Long.valueOf(taskListVO.getAppealPerson()))).findFirst().orElse(null);
                if (sysUser!=null){
                    if (sysUser.getDeptType()==2){
                        TDept tDept = deptMapper.selectById(tTask.getPatrolInspectorDept());
                        TDept tDept = deptMapper.selectById(sysUser.getDeptId());
                        if (tDept!=null){
                            taskListVO.setDeptName(tDept.getDeptName());
                        }
                    }else{
                        TProjectDept tProjectDept = projectDeptMapper.selectById(tTask.getPatrolInspectorDept());
                        if (tProjectDept!=null){
                            taskListVO.setDeptName(tProjectDept.getProjectName());
                        TProjectDept tProjectDept = projectDeptMapper.selectById(sysUser.getDeptId());
                        if (tProjectDept != null) {
                            if (!tProjectDept.getParentId().equals("0")) {
                                TProjectDept tProjectDept1 = projectDeptMapper.selectById(tProjectDept.getParentId());
                                if (tProjectDept1 != null) {
                                    taskListVO.setDeptName(tProjectDept1.getProjectName() + ">" + tProjectDept.getProjectName());
                                }
                            } else {
                                taskListVO.setDeptName(tProjectDept.getProjectName());
                            }
                        }
                    }
                }
            }
        }
        pageInfo.setRecords(list);
        return pageInfo;
@@ -90,6 +98,8 @@
    @Override
    public List<TaskListAllVO> listAllTask(AppealListDTO query) {
        List<TTaskDetail> tTaskDetails = taskDetailMapper.selectList(new LambdaQueryWrapper<TTaskDetail>()
                .eq(TTaskDetail::getHandleType,3).groupBy(TTaskDetail::getTaskId).orderByDesc(TTaskDetail::getCreateTime));
        PageInfo<AppealListVO> pageInfo = new PageInfo<>(query.getPageNum(), query.getPageSize());
        List<TaskListAllVO> list = this.baseMapper.listAllTask(query,pageInfo);
        for (TaskListAllVO taskListAllVO : list) {
@@ -97,7 +107,12 @@
            if (taskListAllVO.getStatus()==1 || taskListAllVO.getStatus()==2 ){
                taskListAllVO.setStatus(1);
            }else{
                // 查询任务的驳回原因
                taskListAllVO.setStatus(2);
                TTaskDetail tTaskDetail = tTaskDetails.stream().filter(e -> e.getTaskId().equals(taskListAllVO.getId())).findFirst().orElse(null);
                if (tTaskDetail!=null){
                    taskListAllVO.setRejectRemark(tTaskDetail.getAuditRemark());
                }
            }
        }
        return list;
ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TTaskCleanServiceImpl.java
@@ -24,8 +24,10 @@
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
/**
 * <p>
@@ -52,10 +54,24 @@
    public PageInfo<TaskListVO> pageList(TaskListQuery query) {
        PageInfo<TaskListVO> pageInfo = new PageInfo<>(query.getPageNum(), query.getPageSize());
        List<TaskListVO> list = this.baseMapper.pageList(query,pageInfo);
        List<TTaskDetail> tTaskDetails = taskDetailMapper.selectList(new LambdaQueryWrapper<TTaskDetail>()
                .orderByDesc(BaseModel::getCreateTime)
                .in(TTaskDetail::getHandleType,Arrays.asList(1,4)));
        List<String> collect = list.stream().map(TTask::getId).collect(Collectors.toList());
        if (collect.isEmpty()){
            return pageInfo;
        }
        List<TTaskDetail> taskDetails = taskDetailMapper.selectList(Wrappers.lambdaQuery(TTaskDetail.class)
                .in(TTaskDetail::getTaskId, collect)
                .eq(TTaskDetail::getClearStatus, 2)
                .eq(TTaskDetail::getHandleType,1)
                .orderByDesc(TTaskDetail::getCreateTime));
        taskDetails = new ArrayList<>(taskDetails.stream()
                .collect(Collectors.groupingBy(
                        TTaskDetail::getTaskId,
                        Collectors.collectingAndThen(
                                Collectors.toList(),
                                listAll -> listAll.get(0)
                        )
                ))
                .values());
        for (TaskListVO temp : list) {
            SysUser sysUser = sysUserMapper.selectUserById(Long.valueOf(temp.getPatrolInspector()));
@@ -76,7 +92,7 @@
                    }
                }
            }
            TTaskDetail tTaskDetail = tTaskDetails.stream().filter(e -> e.getTaskId().equals(temp.getId())).findFirst().orElse(null);
            TTaskDetail tTaskDetail = taskDetails.stream().filter(e -> e.getTaskId().equals(temp.getId())).findFirst().orElse(null);
            if (tTaskDetail!=null){
                temp.setPicture(tTaskDetail.getPicture());
                temp.setClearStatus(tTaskDetail.getClearStatus());
ruoyi-system/src/main/java/com/ruoyi/system/vo/system/AppealDetailVO.java
@@ -18,8 +18,10 @@
    private String locationAddress;
    @ApiModelProperty("点位类型图标")
    private String locationIcon;
    @ApiModelProperty("点位类型名称")
    @ApiModelProperty("点位名称")
    private String locationName;
    @ApiModelProperty(value = "点位类型名称")
    private String locationTypeName;
    @ApiModelProperty("任务id")
    private String taskId;
    @ApiModelProperty(value = "任务名称")
ruoyi-system/src/main/java/com/ruoyi/system/vo/system/RoleInfoVO.java
@@ -11,6 +11,7 @@
    private String roleName;
    private String remark;
    private Integer roleType;
    @ApiModelProperty("菜单id")
    private List<Long> menus;
ruoyi-system/src/main/java/com/ruoyi/system/vo/system/TaskDetailVO.java
@@ -1,5 +1,6 @@
package com.ruoyi.system.vo.system;
import com.baomidou.mybatisplus.annotation.TableField;
import com.ruoyi.system.model.TTask;
import com.ruoyi.system.model.TTaskDetail;
import com.ruoyi.system.model.TTemplate;
@@ -28,4 +29,14 @@
    private TTaskDetail  taskDetail;
    @ApiModelProperty("操作记录")
    private List<TTaskDetail>  records;
    @ApiModelProperty(value = "点位经度 终点")
    private String locationLonEnd;
    @ApiModelProperty(value = "点位纬度 终点")
    private String locationLatEnd;
    @ApiModelProperty(value = "点位经度 起点")
    private String locationLon;
    @ApiModelProperty(value = "点位纬度 起点")
    private String locationLat;
    @ApiModelProperty(value = "驳回备注")
    private String rejectRemark;
}
ruoyi-system/src/main/resources/mapper/system/SysRoleMapper.xml
@@ -188,6 +188,7 @@
             <if test="createBy != null and createBy != ''">create_by,</if>
             <if test="removeDays != null">removeDays,</if>
             <if test="postType != null">postType,</if>
             <if test="roleType != null">role_type,</if>
             create_time
         )values(
             <if test="roleId != null and roleId != 0">#{roleId},</if>
@@ -202,7 +203,9 @@
             <if test="createBy != null and createBy != ''">#{createBy},</if>
             <if test="removeDays != null">#{removeDays},</if>
             <if test="postType != null">#{postType},</if>
             sysdate()
        <if test="roleType != null">#{roleType},</if>
        sysdate()
         )
    </insert>
    
@@ -220,6 +223,7 @@
             <if test="updateBy != null and updateBy != ''">update_by = #{updateBy},</if>
             <if test="removeDays != null">removeDays = #{removeDays},</if>
             <if test="postType != null">postType = #{postType},</if>
             <if test="roleType != null">role_type = #{roleType},</if>
             update_time = sysdate()
         </set>
         where role_id = #{roleId}
ruoyi-system/src/main/resources/mapper/system/TAppealMapper.xml
@@ -56,8 +56,8 @@
        <if test="query.status != null">
            and t1.status = #{query.status}
        </if>
        <if test="query.startTime != null and startTime != ''">
            and (t5.implement_time between #{startTime} and #{endTime})
        <if test="query.startTime != null and query.startTime != ''">
            and (t5.implement_time between #{query.startTime} and #{query.endTime})
        </if>
        order by t1.create_time desc
    </select>
@@ -148,7 +148,9 @@
        ) AS t2 ON t1.task_id = t2.task_id AND t1.create_time = t2.max_time
        ) t5 on t1.id = t5.task_id
        where 1=1
          and t1.patrol_inspector = #{query.userId}
          <if test="query.userId != null">
            and t1.patrol_inspector = #{query.userId}
        </if>
        and t1.`disabled` = ${@com.ruoyi.common.enums.DisabledEnum@NO.getCode()}
        and t1.status !=3 and t1.status !=5 and t1.status !=6
        AND DATE(t1.implement_time) = CURDATE()
ruoyi-system/src/main/resources/mapper/system/TTaskMapper.xml
@@ -123,6 +123,7 @@
        <if test="query.startTime != null and query.startTime != ''">
            and (t1.implement_time between #{query.startTime} and #{query.endTime})
        </if>
        order by t1.update_time desc
    </select>
    <select id="exportList" resultType="com.ruoyi.system.vo.system.TaskListVO">
        select t1.*,t2.location_name as locationName,t3.location_name as locationTypeName,