无关风月
1 天以前 165e73d176191ae75b57c70e049c0cfd552bbdfa
ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/ReportController.java
@@ -3,6 +3,7 @@
import cn.afterturn.easypoi.excel.ExcelExportUtil;
import cn.afterturn.easypoi.excel.entity.ExportParams;
import cn.afterturn.easypoi.excel.entity.params.ExcelExportEntity;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.ruoyi.common.annotation.Log;
import com.ruoyi.common.basic.PageInfo;
@@ -16,12 +17,14 @@
import com.ruoyi.system.model.*;
import com.ruoyi.system.query.*;
import com.ruoyi.system.service.*;
import com.ruoyi.system.utils.ExcelPoiUtils;
import com.ruoyi.system.vo.system.*;
import com.ruoyi.web.util.OssUploadUtil;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.models.auth.In;
import org.apache.poi.ss.usermodel.Workbook;
import org.springframework.util.CollectionUtils;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
@@ -36,8 +39,7 @@
import java.net.URLEncoder;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.List;
import java.util.*;
import java.util.stream.Collectors;
/**
@@ -70,6 +72,8 @@
    private TTaskDetailService tTaskDetailService;
    @Resource
    private TDeptService deptService;
    @Resource
    private TTemplateCountService templateCountService;
    @Resource
    private ISysUserService sysUserService;
    @Resource
@@ -164,45 +168,54 @@
                }
            }
            TTemplate tTemplate = templates.stream().filter(e -> e.getId().equals(record.getTemplateId())).findFirst().orElse(null);
            // todo 应生成计划数
            record.setNum1(1);
            LocalDateTime createTime = tTemplate.getCreateTime();
            // 转化为yyyy-MM-dd字符串
            StringBuilder stringBuilder = new StringBuilder();
            stringBuilder.append(createTime.format(DateTimeFormatter.ofPattern("yyyy-MM-dd"))).append(" 至 ");
            List<TTemplateDetail> tTemplateDetail = templateDetails.stream().filter(e -> e.getTemplateId().equals(record.getTemplateId())).collect(Collectors.toList());
            int temp = 0;
            if (!tTemplateDetail.isEmpty()) {
                for (TTemplateDetail templateDetail : tTemplateDetail) {
                    Integer cycle = templateDetail.getCycle();
                    Integer cycleType = templateDetail.getCycleType();
                    switch (cycleType) {
                        case 1:
                            temp = cycle;
                            break;
                        case 2:
                            temp = cycle * 7;
            if(Objects.nonNull(tTemplate)){
                TTemplateCount templateCount = templateCountService.lambdaQuery().eq(TTemplateCount::getUserId, record.getUserId())
                        .eq(TTemplateCount::getTemplateId, tTemplate.getId())
                        .orderByDesc(TTemplateCount::getCreateTime).last("limit 1").one();
                if (templateCount!=null){
                    record.setNum1(templateCount.getTaskCount());
                }
                // todo 应生成计划数
                LocalDateTime createTime = tTemplate.getCreateTime();
                // 转化为yyyy-MM-dd字符串
                StringBuilder stringBuilder = new StringBuilder();
                stringBuilder.append(createTime.format(DateTimeFormatter.ofPattern("yyyy-MM-dd"))).append(" 至 ");
                List<TTemplateDetail> tTemplateDetail = templateDetails.stream().filter(e -> e.getTemplateId().equals(record.getTemplateId())).collect(Collectors.toList());
                int temp = 0;
                if (!tTemplateDetail.isEmpty()) {
                    for (TTemplateDetail templateDetail : tTemplateDetail) {
                        Integer cycle = templateDetail.getCycle();
                        Integer cycleType = templateDetail.getCycleType();
                        switch (cycleType) {
                            case 1:
                                temp = cycle;
                                break;
                            case 2:
                                temp = cycle * 7;
                            break;
                        case 3:
                            temp = cycle * 30;
                            break;
                        case 4:
                            temp = cycle * 90;
                            break;
                        case 5:
                            temp = cycle * 365;
                            break;
                                break;
                            case 3:
                                temp = cycle * 30;
                                break;
                            case 4:
                                temp = cycle * 90;
                                break;
                            case 5:
                                temp = cycle * 365;
                                break;
                        }
                    }
                    LocalDateTime localDateTime = tTemplate.getCreateTime().plusDays(temp-1);
                    stringBuilder.append(localDateTime.format(DateTimeFormatter.ofPattern("yyyy-MM-dd")));
                    record.setTemplateDate(stringBuilder.toString());
                }
                LocalDateTime localDateTime = tTemplate.getCreateTime().plusDays(temp);
                stringBuilder.append(localDateTime.format(DateTimeFormatter.ofPattern("yyyy-MM-dd")));
                record.setTemplateDate(stringBuilder.toString());
                if (record.getNum2() != 0) {
                    record.setNum4(new BigDecimal((double) record.getNum2() / (double) record.getNum1() * 100).setScale(2, RoundingMode.HALF_DOWN));
                } else {
                    record.setNum4(new BigDecimal(0));
                }
            }
            if (record.getNum1() != 0) {
                record.setNum4(new BigDecimal((double) record.getNum2() / (double) record.getNum1() * 100).setScale(2, RoundingMode.HALF_DOWN));
            } else {
                record.setNum4(new BigDecimal(0));
            }
            String templateId = record.getTemplateId();
            Long count = leaveService.lambdaQuery()
@@ -215,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();
@@ -372,6 +385,9 @@
        }
        List<ProjectDeptDetailsVO> res = new ArrayList<>();
        List<TTask> tasks = taskCleanerService.list(tTaskLambdaQueryWrapper);
        if(CollectionUtils.isEmpty(tasks)){
            return R.ok(res);
        }
        List<TTaskDetail> taskDetails = taskDetailService.lambdaQuery().orderByDesc(BaseModel::getCreateTime).list();
        List<String> collect = tasks.stream().map(TTask::getProjectId).distinct().collect(Collectors.toList());
        List<TProjectDept> projectDepts = projectDeptService.list();
@@ -413,7 +429,10 @@
                for (LocationTypeListByProjectVO locationTypeListByProjectVO : locationTypeListByProjectVOS) {
                    LocationTypeListByProjectVO temp = new LocationTypeListByProjectVO();
                    BeanUtils.copyProperties(locationTypeListByProjectVO, temp);
                    List<String> locationIds = locations.stream().filter(e -> e.getLocationType().equals(locationTypeListByProjectVO.getId())).map(TLocation::getId).collect(Collectors.toList());
                    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 {
@@ -421,71 +440,71 @@
                                && 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);
                projectDeptDetailsChildVO.setCleanerCount(0);
            }
        }
        return R.ok(res);
    }
    @ApiOperation(value = "任务报表导出")
    @PostMapping(value = "/taskDetailsExport")
    public void taskDetailsExport(@RequestBody TaskDetailsQuery query) {
    public void taskDetailsExport(@RequestBody TaskDetailsQuery query,HttpServletResponse response) throws IOException {
        List<TLocationType> locationTypeList = locationTypeService.list();
        List<TLocation> locations = locationService.list();
        LambdaQueryWrapper<TTask> tTaskLambdaQueryWrapper = new LambdaQueryWrapper<>();
@@ -536,7 +555,10 @@
                for (LocationTypeListByProjectVO locationTypeListByProjectVO : locationTypeListByProjectVOS) {
                    LocationTypeListByProjectVO temp = new LocationTypeListByProjectVO();
                    BeanUtils.copyProperties(locationTypeListByProjectVO, temp);
                    List<String> locationIds = locations.stream().filter(e -> e.getLocationType().equals(locationTypeListByProjectVO.getId())).map(TLocation::getId).collect(Collectors.toList());
                    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 {
@@ -544,6 +566,793 @@
                                && locationIds.contains(e.getLocationId())).collect(Collectors.toList());
                        Integer count = taskList.size();
                        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;
                        }
                    }
                    // 任务状态: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);
            }
        }
        Set<String> allTypeNames = new LinkedHashSet<>();
        for (ProjectDeptDetailsVO row : res) {
            for (ProjectDeptDetailsChildVO lt : row.getProjectChild()) {
                for (LocationTypeListByProjectVO locationTypeListByProjectVO : lt.getLocationTypeList()) {
                    allTypeNames.add(locationTypeListByProjectVO.getLocationTypeName());
                }
            }
        }
        List<ExcelExportEntity> entityList = new ArrayList<>();
        ExcelExportEntity excelExportEntity = new ExcelExportEntity("项目", "projectName", 15);
        excelExportEntity.setMergeVertical(true);
        entityList.add(excelExportEntity);
        entityList.add(new ExcelExportEntity("片区名称", "areaName",15));
        entityList.add(new ExcelExportEntity("巡检保洁员数", "inspectorCount",15));
        // 动态添加作业类型分类
        List<String> list = new ArrayList<>(allTypeNames);
        Collections.reverse(list);
        for (String typeName : list) {
            ExcelExportEntity excelExportEntity1 = new ExcelExportEntity(typeName, typeName, 15);
            excelExportEntity1.setGroupName("作业类型分类");
            entityList.add(excelExportEntity1);
        }
        ExcelExportEntity excelExportEntity8 = new ExcelExportEntity("整改完成任务", "total", 15);
        excelExportEntity8.setGroupName("任务情况汇总");
        entityList.add(excelExportEntity8);
        ExcelExportEntity excelExportEntity7 = new ExcelExportEntity("超时未执行任务", "total", 15);
        excelExportEntity7.setGroupName("任务情况汇总");
        entityList.add(excelExportEntity7);
        ExcelExportEntity excelExportEntity6 = new ExcelExportEntity("审核通过任务", "total", 15);
        excelExportEntity6.setGroupName("任务情况汇总");
        entityList.add(excelExportEntity6);
        ExcelExportEntity excelExportEntity5 = new ExcelExportEntity("待整改任务", "total", 15);
        excelExportEntity5.setGroupName("任务情况汇总");
        entityList.add(excelExportEntity5);
        ExcelExportEntity excelExportEntity4 = new ExcelExportEntity("未执行任务", "total", 15);
        excelExportEntity4.setGroupName("任务情况汇总");
        entityList.add(excelExportEntity4);
        ExcelExportEntity excelExportEntity3 = new ExcelExportEntity("清洁不合格", "total", 15);
        excelExportEntity3.setGroupName("任务情况汇总");
        entityList.add(excelExportEntity3);
        ExcelExportEntity excelExportEntity2 = new ExcelExportEntity("清洁合格", "total", 15);
        excelExportEntity2.setGroupName("任务情况汇总");
        entityList.add(excelExportEntity2);
        ExcelExportEntity excelExportEntity1 = new ExcelExportEntity("总数", "total", 15);
        excelExportEntity1.setGroupName("任务情况汇总");
        entityList.add(excelExportEntity1);
        List<Map<String, Object>> mapList = new ArrayList<>();
        for (ProjectDeptDetailsVO projectDeptDetailsVO : res) {
            List<ProjectDeptDetailsChildVO> projectChild = projectDeptDetailsVO.getProjectChild();
            for (ProjectDeptDetailsChildVO row : projectChild) {
                Map<String, Object> map = new HashMap<>();
                map.put("projectName", projectDeptDetailsVO.getProjectName());
                map.put("areaName", row.getProjectChildName());
                map.put("inspectorCount", row.getCleanerCount());
                // 动态作业类型
                for (LocationTypeListByProjectVO lt : row.getLocationTypeList()) {
                    map.put(lt.getLocationTypeName(), lt.getLocationNum());
                }
                // 没有的类型补0
                for (String typeName : allTypeNames) {
                    map.putIfAbsent(typeName, 0);
                }
                map.put("total", row.getTotal());
                map.put("num1", row.getNum1());
                map.put("num2", row.getNum2());
                map.put("num3", row.getNum3());
                map.put("num4", row.getNum4());
                map.put("num5", row.getNum5());
                map.put("num6", row.getNum6());
                map.put("num7", row.getNum7());
                mapList.add(map);
            }
        }
        ExportParams params = new ExportParams("任务报表", "数据表");
        Workbook workbook = ExcelExportUtil.exportExcel(params, entityList, mapList);
        response.setHeader("content-type", "application/vnd.ms-excel");
        response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode("任务情况汇总.xlsx", "UTF-8"));
        workbook.write(response.getOutputStream());
        workbook.close();
    }
    @ApiOperation(value = "巡检人员报表")
    @PostMapping(value = "/patrolInspectorList")
    public R<List<PatrolInspectorVO>> patrolInspectorList(@RequestBody PatrolInspectorQuery query) {
        List<SysUser> sysUsers = sysUserService.selectAllList();
        LambdaQueryWrapper<TLeave> tLeaveLambdaQueryWrapper = new LambdaQueryWrapper<>();
        if (StringUtils.hasLength(query.getStartTime())){
            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);
        if (StringUtils.hasLength(query.getDeptName())){
            List<String> projectIds = projectDeptService.lambdaQuery().like(TProjectDept::getProjectName, query.getDeptName()).list()
                    .stream().map(TProjectDept::getId).collect(Collectors.toList());
            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 ArrayList<>());
            }
            query.setDeptIds(projectIds);
            if (StringUtils.hasLength(query.getPhonenumber())){
                List<Long> patrolInspectorIds = sysUsers.stream().filter(sysUser ->
                        sysUser.getPhonenumber().contains(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()){
                    return R.ok(new ArrayList<>());
                }
                query.setPatrolInspectorIds(patrolInspectorIds);
            }
        }
        if (StringUtils.hasLength(query.getPhonenumber())){
            List<Long> patrolInspectorIds = sysUsers.stream().filter(sysUser ->
                    sysUser.getPhonenumber().contains(query.getPhonenumber())
            ).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 (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());
            }
            query.setPatrolInspectorIds(patrolInspectorIds);
            if (patrolInspectorIds.isEmpty()){
                return R.ok(new ArrayList<>());
            }
        }
        List<PatrolInspectorVO> res = new ArrayList<>();
        LambdaQueryWrapper<TTask> tTaskLambdaQueryWrapper = new LambdaQueryWrapper<>();
        if (StringUtils.hasLength(query.getStartTime())){
            tTaskLambdaQueryWrapper.ge(TTask::getImplementTime, query.getStartTime()+" :00:00:00");
            tTaskLambdaQueryWrapper.le(TTask::getImplementTime, query.getEndTime()+" :23:59:59");
        }
        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();
            patrolInspectorVO.setNickName(sysUser.getNickName());
            patrolInspectorVO.setPhonenumber(sysUser.getPhonenumber());
            if (sysUser.getDeptType() == 1){
                TProjectDept tProjectDept = projectDeptService.getById(sysUser.getDeptId());
                if (tProjectDept!=null&&!tProjectDept.getParentId().equals("0")){
                    TProjectDept tProjectDept1 = projectDeptService.getById(tProjectDept.getParentId());
                    if (tProjectDept1!=null)
                    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());
            }
            // 查询巡检员任务ids
            List<String> taskIds = tasks.stream().filter(e->e.getPatrolInspector().equals(sysUser.getUserId()+"")).map(TTask::getId).collect(Collectors.toList());
            if (taskIds.isEmpty()){
                taskIds.add("-1");
            }
            // 完成的任务
            List<String> taskIdsFinish = tasks.stream().filter(e->
                    (e.getStatus()==5 || e.getStatus()==6)
                    &&
                    e.getPatrolInspector().equals(sysUser.getUserId()+"")).map(TTask::getId).collect(Collectors.toList());
            if (taskIdsFinish.isEmpty()){
                taskIdsFinish.add("-1");
            }
            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).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());
            List<TTask> taskList = tasks.stream().filter(e -> e.getPatrolInspector().equals(sysUser.getUserId() + "")).collect(Collectors.toList());
            patrolInspectorVO.setTotal(taskList.size());
            patrolInspectorVO.setNum1(clearStatus1.size());
            patrolInspectorVO.setNum2(clearStatus2.size());
            patrolInspectorVO.setNum3(!clearStatus1.isEmpty() ?
                    (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());
            List<TTask> status2 = taskList.stream().filter(e -> e.getStatus() == 3).collect(Collectors.toList());
            List<TTask> status3 = taskList.stream().filter(e -> e.getStatus() == 2).collect(Collectors.toList());
            List<TTask> status4 = taskList.stream().filter(e -> e.getStatus() == 4).collect(Collectors.toList());
            List<TTask> status5 = taskList.stream().filter(e -> e.getStatus() == 5).collect(Collectors.toList());
            List<TTask> status6 = taskList.stream().filter(e -> e.getStatus() == 6).collect(Collectors.toList());
            patrolInspectorVO.setNum4(status1.size());
            patrolInspectorVO.setNum5(status2.size());
            patrolInspectorVO.setNum6(status3.size());
            patrolInspectorVO.setNum7(status4.size());
            patrolInspectorVO.setNum8(status5.size());
            patrolInspectorVO.setNum9(!status5.isEmpty()||!status4.isEmpty()?new BigDecimal(status5.size())
                    .divide(new BigDecimal(status4.size()).add(new BigDecimal(status5.size())),2,RoundingMode.HALF_DOWN)
                    .multiply(new BigDecimal(100)):BigDecimal.ZERO);
            patrolInspectorVO.setNum10(status6.size());
            patrolInspectorVO.setNum11(!taskList.isEmpty()?new BigDecimal(status6.size()).divide(new BigDecimal(taskList.size()),2,RoundingMode.HALF_DOWN):BigDecimal.ZERO);
            List<TLeave> collect1 = leaves.stream().filter(e -> e.getLeavePerson().equals(sysUser.getUserId()+"")).collect(Collectors.toList());
            patrolInspectorVO.setNum12(collect1.size());
            res.add(patrolInspectorVO);
        }
        return R.ok(res);
    }
    @ApiOperation(value = "巡检人员报表导出")
    @PostMapping(value = "/patrolInspectorListExport")
    @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()+" :00:00:00");
            tLeaveLambdaQueryWrapper.le(TLeave::getCreateTime, query.getEndTime()+" :23:59:59");
        }
        tLeaveLambdaQueryWrapper.eq(TLeave::getAuditStatus,2);
        List<TLeave> leaves = leaveService.list(tLeaveLambdaQueryWrapper);
        if (StringUtils.hasLength(query.getDeptName())){
            List<String> projectIds = projectDeptService.lambdaQuery().like(TProjectDept::getProjectName, query.getDeptName()).list()
                    .stream().map(TProjectDept::getId).collect(Collectors.toList());
            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");
            }
            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()){
                    patrolInspectorIds.add(0L);
                }
                query.setPatrolInspectorIds(patrolInspectorIds);
            }
        }
        if (StringUtils.hasLength(query.getPhonenumber())){
            List<Long> patrolInspectorIds = sysUsers.stream().filter(sysUser ->
                    sysUser.getPhonenumber().equals(query.getPhonenumber())
            ).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 (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());
            }
            query.setPatrolInspectorIds(patrolInspectorIds);
            if (patrolInspectorIds.isEmpty()){
                patrolInspectorIds.add(0L);
            }
        }
        List<PatrolInspectorVO> res = new ArrayList<>();
        LambdaQueryWrapper<TTask> tTaskLambdaQueryWrapper = new LambdaQueryWrapper<>();
        if (StringUtils.hasLength(query.getStartTime())){
            tTaskLambdaQueryWrapper.ge(TTask::getImplementTime, query.getStartTime()+" :00:00:00");
            tTaskLambdaQueryWrapper.le(TTask::getImplementTime, query.getEndTime()+" :23:59:59");
        }
        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();
            patrolInspectorVO.setNickName(sysUser.getNickName());
            patrolInspectorVO.setPhonenumber(sysUser.getPhonenumber());
            if (sysUser.getDeptType() == 1){
                TProjectDept tProjectDept = projectDeptService.getById(sysUser.getDeptId());
                if (tProjectDept!=null&&!tProjectDept.getParentId().equals("0")){
                    TProjectDept tProjectDept1 = projectDeptService.getById(tProjectDept.getParentId());
                    if (tProjectDept1!=null)
                        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());
            }
            // 查询巡检员任务ids
            List<String> taskIds = tasks.stream().filter(e->e.getPatrolInspector().equals(sysUser.getUserId()+"")).map(TTask::getId).collect(Collectors.toList());
            if (taskIds.isEmpty()){
                taskIds.add("-1");
            }
            // 完成的任务
            List<String> taskIdsFinish = tasks.stream().filter(e->
                    (e.getStatus()==5 || e.getStatus()==6)
                            &&
                            e.getPatrolInspector().equals(sysUser.getUserId()+"")).map(TTask::getId).collect(Collectors.toList());
            if (taskIdsFinish.isEmpty()){
                taskIdsFinish.add("-1");
            }
            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).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());
            List<TTask> taskList = tasks.stream().filter(e -> e.getPatrolInspector().equals(sysUser.getUserId() + "")).collect(Collectors.toList());
            patrolInspectorVO.setTotal(taskList.size());
            patrolInspectorVO.setNum1(clearStatus1.size());
            patrolInspectorVO.setNum2(clearStatus2.size());
            patrolInspectorVO.setNum3(!clearStatus1.isEmpty() ?
                    (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());
            List<TTask> status2 = taskList.stream().filter(e -> e.getStatus() == 3).collect(Collectors.toList());
            List<TTask> status3 = taskList.stream().filter(e -> e.getStatus() == 2).collect(Collectors.toList());
            List<TTask> status4 = taskList.stream().filter(e -> e.getStatus() == 4).collect(Collectors.toList());
            List<TTask> status5 = taskList.stream().filter(e -> e.getStatus() == 5).collect(Collectors.toList());
            List<TTask> status6 = taskList.stream().filter(e -> e.getStatus() == 6).collect(Collectors.toList());
            patrolInspectorVO.setNum4(status1.size());
            patrolInspectorVO.setNum5(status2.size());
            patrolInspectorVO.setNum6(status3.size());
            patrolInspectorVO.setNum7(status4.size());
            patrolInspectorVO.setNum8(status5.size());
            patrolInspectorVO.setNum9(!status5.isEmpty()||!status4.isEmpty()?new BigDecimal(status5.size())
                    .divide(new BigDecimal(status4.size()).add(new BigDecimal(status5.size())),2,RoundingMode.HALF_DOWN)
                    .multiply(new BigDecimal(100)):BigDecimal.ZERO);
            patrolInspectorVO.setNum10(status6.size());
            patrolInspectorVO.setNum11(!taskList.isEmpty()?new BigDecimal(status6.size()).divide(new BigDecimal(taskList.size()),2,RoundingMode.HALF_DOWN):BigDecimal.ZERO);
            List<TLeave> collect1 = leaves.stream().filter(e -> e.getLeavePerson().equals(sysUser.getUserId()+"")).collect(Collectors.toList());
            patrolInspectorVO.setNum12(collect1.size());
            res.add(patrolInspectorVO);
        }
        //1.获取excel模板
        Workbook workbook = ExcelExportUtil.exportExcel(new ExportParams(), PatrolInspectorVO.class, res);
        HttpServletResponse response = WebUtils.response();
        response.setContentType("application/vnd.ms-excel");
        response.setCharacterEncoding("utf-8");
        ServletOutputStream outputStream = null;
        try {
            String fileName = URLEncoder.encode("巡检人员列表.xls", "utf-8");
            response.setHeader("Content-dispodition", "attachment;filename=" + fileName);
            outputStream = response.getOutputStream();
            workbook.write(outputStream);
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                outputStream.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
    @ApiOperation(value = "随机督察报表")
    @PostMapping(value = "/inspectorList")
    public R<List<InspectorVO>> inspectorList(@RequestBody InspectorQuery query) {
        List<SysUser> sysUsers = sysUserService.selectAllList();
        List<TTask> listAll = taskCleanerService.list();
        List<String> listAllTaskIds = listAll.stream().map(TTask::getId).collect(Collectors.toList());
        if (StringUtils.hasLength(query.getDeptName())){
            List<String> projectIds = projectDeptService.lambdaQuery().like(TProjectDept::getProjectName, query.getDeptName()).list()
                    .stream().map(TProjectDept::getId).collect(Collectors.toList());
            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 ArrayList<>());
            }
            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.getPhonenumber())){
            List<Long> patrolInspectorIds = sysUsers.stream().filter(sysUser ->
                    sysUser.getPhonenumber().equals(query.getPhonenumber())
            ).map(SysUser::getUserId).collect(Collectors.toList());
            if (!query.getPatrolInspectorIds().isEmpty()){
                // 取交集
                patrolInspectorIds = patrolInspectorIds.stream().filter(query.getPatrolInspectorIds()::contains).collect(Collectors.toList());
            }
            query.setPatrolInspectorIds(patrolInspectorIds);
            if (patrolInspectorIds.isEmpty()){
                return R.ok(new ArrayList<>());
            }
        }
        LambdaQueryWrapper<TInspector> tTaskLambdaQueryWrapper = new LambdaQueryWrapper<>();
        tTaskLambdaQueryWrapper.eq(TInspector::getAuditStatus,1);
        tTaskLambdaQueryWrapper.isNotNull(TInspector::getClearStatus);
        if (StringUtils.hasLength(query.getStartTime())){
            tTaskLambdaQueryWrapper.ge(TInspector::getCreateTime, query.getStartTime());
            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());
            inspectorVO.setPhonenumber(sysUser.getPhonenumber());
            if (sysUser.getDeptType() == 1){
                TProjectDept tProjectDept = projectDeptService.getById(sysUser.getDeptId());
                if (tProjectDept!=null&&!tProjectDept.getParentId().equals("0")){
                    TProjectDept tProjectDept1 = projectDeptService.getById(tProjectDept.getParentId());
                    if (tProjectDept1!=null)
                        inspectorVO.setDeptName(tProjectDept1.getProjectName()+">"+tProjectDept.getProjectName());
                }else{
                    inspectorVO.setDeptName(tProjectDept.getProjectName());
                }
            }else{
                TDept tDept = deptService.getById(sysUser.getDeptId());
                if (tDept!=null)
                    inspectorVO.setDeptName(tDept.getDeptName());
            }
            List<TInspector> collect = inspectors.stream().filter(e -> listAllTaskIds.contains(e.getTaskId())).collect(Collectors.toList());
            inspectorVO.setTotal(collect.size());
            List<TInspector> status1 = collect.stream().filter(e -> e.getClearStatus() == 1).collect(Collectors.toList());
            List<TInspector> status2 = collect.stream().filter(e -> e.getClearStatus() == 2).collect(Collectors.toList());
            List<TInspector> status4 = collect.stream().filter(e -> e.getStatus() == 1).collect(Collectors.toList());
            List<TInspector> status5 = collect.stream().filter(e -> e.getStatus() == 2).collect(Collectors.toList());
            List<TInspector> status6 = collect.stream().filter(e -> e.getStatus() == 3).collect(Collectors.toList());
            inspectorVO.setNum1(status1.size());
            inspectorVO.setNum2(status2.size());
            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()||!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);
        }
        return R.ok(res);
    }
    @ApiOperation(value = "随机督察报表导出")
    @PostMapping(value = "/inspectorListExport")
    @Log(title = "随机督察报表导出", businessType = BusinessType.OTHER)
    public void inspectorListExport(@RequestBody InspectorQuery query) {
        List<SysUser> sysUsers = sysUserService.selectAllList();
        if (StringUtils.hasLength(query.getDeptName())){
            List<String> projectIds = projectDeptService.lambdaQuery().like(TProjectDept::getProjectName, query.getDeptName()).list()
                    .stream().map(TProjectDept::getId).collect(Collectors.toList());
            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");
            }
            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.getPhonenumber())){
            List<Long> patrolInspectorIds = sysUsers.stream().filter(sysUser ->
                    sysUser.getPhonenumber().equals(query.getPhonenumber())
            ).map(SysUser::getUserId).collect(Collectors.toList());
            if (!query.getPatrolInspectorIds().isEmpty()){
                // 取交集
                patrolInspectorIds = patrolInspectorIds.stream().filter(query.getPatrolInspectorIds()::contains).collect(Collectors.toList());
            }
            query.setPatrolInspectorIds(patrolInspectorIds);
            if (patrolInspectorIds.isEmpty()){
                patrolInspectorIds.add(0L);
            }
        }
        LambdaQueryWrapper<TInspector> tTaskLambdaQueryWrapper = new LambdaQueryWrapper<>();
        tTaskLambdaQueryWrapper.eq(TInspector::getAuditStatus,1);
        tTaskLambdaQueryWrapper.isNotNull(TInspector::getClearStatus);
        if (StringUtils.hasLength(query.getStartTime())){
            tTaskLambdaQueryWrapper.ge(TInspector::getCreateTime, query.getStartTime());
            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());
            inspectorVO.setPhonenumber(sysUser.getPhonenumber());
            if (sysUser.getDeptType() == 1){
                TProjectDept tProjectDept = projectDeptService.getById(sysUser.getDeptId());
                if (tProjectDept!=null&&!tProjectDept.getParentId().equals("0")){
                    TProjectDept tProjectDept1 = projectDeptService.getById(tProjectDept.getParentId());
                    if (tProjectDept1!=null)
                        inspectorVO.setDeptName(tProjectDept1.getProjectName()+">"+tProjectDept.getProjectName());
                }else{
                    inspectorVO.setDeptName(tProjectDept.getProjectName());
                }
            }else{
                TDept tDept = deptService.getById(sysUser.getDeptId());
                if (tDept!=null)
                    inspectorVO.setDeptName(tDept.getDeptName());
            }
            inspectorVO.setTotal(inspectors.size());
            List<TInspector> status1 = inspectors.stream().filter(e -> e.getClearStatus() == 1).collect(Collectors.toList());
            List<TInspector> status2 = inspectors.stream().filter(e -> e.getClearStatus() == 2).collect(Collectors.toList());
            List<TInspector> status4 = inspectors.stream().filter(e -> e.getStatus() == 1).collect(Collectors.toList());
            List<TInspector> status5 = inspectors.stream().filter(e -> e.getStatus() == 2).collect(Collectors.toList());
            List<TInspector> status6 = inspectors.stream().filter(e -> e.getStatus() == 3).collect(Collectors.toList());
            inspectorVO.setNum1(status1.size());
            inspectorVO.setNum2(status2.size());
            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()||!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模板
        Workbook workbook = ExcelExportUtil.exportExcel(new ExportParams(), InspectorVO.class, res);
        HttpServletResponse response = WebUtils.response();
        response.setContentType("application/vnd.ms-excel");
        response.setCharacterEncoding("utf-8");
        ServletOutputStream outputStream = null;
        try {
            String fileName = URLEncoder.encode("随机督察列表.xls", "utf-8");
            response.setHeader("Content-dispodition", "attachment;filename=" + fileName);
            outputStream = response.getOutputStream();
            workbook.write(outputStream);
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                outputStream.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
    @ApiOperation(value = "任务报表导出模板")
    @PostMapping(value = "/exportExcel")
    public void exportExcel(@RequestBody TaskDetailsQuery query,HttpServletResponse response) throws Exception{
        List<TLocationType> locationTypeList = locationTypeService.list();
        List<TLocation> locations = locationService.list();
        LambdaQueryWrapper<TTask> tTaskLambdaQueryWrapper = new LambdaQueryWrapper<>();
        if (StringUtils.hasLength(query.getStartTime()) && StringUtils.hasLength(query.getEndTime())) {
            tTaskLambdaQueryWrapper.ge(TTask::getImplementTime, query.getStartTime());
            tTaskLambdaQueryWrapper.le(TTask::getImplementTime, query.getEndTime());
        }
        List<ProjectDeptDetailsVO> res = new ArrayList<>();
        List<TTask> tasks = taskCleanerService.list(tTaskLambdaQueryWrapper);
        List<TTaskDetail> taskDetails = taskDetailService.lambdaQuery().orderByDesc(BaseModel::getCreateTime).list();
        List<String> collect = tasks.stream().map(TTask::getProjectId).distinct().collect(Collectors.toList());
        List<TProjectDept> projectDepts = projectDeptService.list();
        List<String> strings = new ArrayList<>();
        // 片区ids 反查项目部
        List<TProjectDept> list1 = projectDeptService.lambdaQuery().in(TProjectDept::getId, collect).list();
        for (TProjectDept tProjectDept : list1) {
            TProjectDept tProjectDept1 = projectDepts.stream().filter(e -> e.getId().equals(tProjectDept.getParentId())).findFirst().orElse(null);
            if (tProjectDept1 != null && !strings.contains(tProjectDept1.getId())) {
                ProjectDeptDetailsVO projectDeptDetailsVO = new ProjectDeptDetailsVO();
                projectDeptDetailsVO.setProjectName(tProjectDept1.getProjectName());
                List<TProjectDept> collect1 = list1.stream().filter(e -> e.getParentId().equals(tProjectDept1.getId())).collect(Collectors.toList());
                List<ProjectDeptDetailsChildVO> projectDeptDetailsChildVOS = new ArrayList<>();
                for (TProjectDept projectDept : collect1) {
                    ProjectDeptDetailsChildVO projectDeptDetailsChildVO = new ProjectDeptDetailsChildVO();
                    projectDeptDetailsChildVO.setProjectChildName(projectDept.getProjectName());
                    projectDeptDetailsChildVO.setProjectId(projectDept.getId());
                    projectDeptDetailsChildVOS.add(projectDeptDetailsChildVO);
                }
                projectDeptDetailsVO.setProjectChild(projectDeptDetailsChildVOS);
                res.add(projectDeptDetailsVO);
                strings.add(tProjectDept1.getId());
            }
        }
        List<LocationTypeListByProjectVO> locationTypeListByProjectVOS = new ArrayList<>();
        for (TLocationType tLocationType : locationTypeList) {
            LocationTypeListByProjectVO locationTypeListByProjectVO = new LocationTypeListByProjectVO();
            locationTypeListByProjectVO.setLocationTypeName(tLocationType.getLocationName());
            locationTypeListByProjectVO.setLocationNum(0);
            locationTypeListByProjectVO.setId(tLocationType.getId());
            locationTypeListByProjectVOS.add(locationTypeListByProjectVO);
        }
        for (ProjectDeptDetailsVO re : res) {
            List<ProjectDeptDetailsChildVO> projectChild = re.getProjectChild();
            for (ProjectDeptDetailsChildVO projectDeptDetailsChildVO : projectChild) {
                int cleanerCount = cleanerService.lambdaQuery().eq(TCleaner::getProjectId, projectDeptDetailsChildVO.getProjectId()).list().size();
                projectDeptDetailsChildVO.setCleanerCount(cleanerCount);
                for (LocationTypeListByProjectVO locationTypeListByProjectVO : locationTypeListByProjectVOS) {
                    List<String> locationIds = locations.stream().filter(e -> 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;
@@ -596,481 +1405,98 @@
                        projectDeptDetailsChildVO.setNum6(num6);
                        projectDeptDetailsChildVO.setNum7(num7);
                    }
                    locationTypeListByProjectVOS1.add(temp);
                }
                projectDeptDetailsChildVO.setLocationTypeList(locationTypeListByProjectVOS1);
                projectDeptDetailsChildVO.setCleanerCount(0);
            }
        }
        //1.获取excel模板
        Workbook workbook = ExcelExportUtil.exportExcel(new ExportParams(), ProjectDeptDetailsVO.class, res);
        HttpServletResponse response = WebUtils.response();
        response.setContentType("application/vnd.ms-excel");
        response.setCharacterEncoding("utf-8");
        ServletOutputStream outputStream = null;
        try {
            String fileName = URLEncoder.encode("任务记录列表.xls", "utf-8");
            response.setHeader("Content-dispodition", "attachment;filename=" + fileName);
            outputStream = response.getOutputStream();
            workbook.write(outputStream);
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                outputStream.close();
            } catch (IOException e) {
                e.printStackTrace();
                projectDeptDetailsChildVO.setLocationTypeList(locationTypeListByProjectVOS);
            }
        }
        Set<String> allTypeNames = new LinkedHashSet<>();
        for (ProjectDeptDetailsVO row : res) {
            for (ProjectDeptDetailsChildVO lt : row.getProjectChild()) {
                for (LocationTypeListByProjectVO locationTypeListByProjectVO : lt.getLocationTypeList()) {
                    allTypeNames.add(locationTypeListByProjectVO.getLocationTypeName());
                }
            }
        }
        List<ExcelExportEntity> entityList = new ArrayList<>();
        ExcelExportEntity excelExportEntity = new ExcelExportEntity("项目", "projectName", 15);
        excelExportEntity.setMergeVertical(true);
        entityList.add(excelExportEntity);
        entityList.add(new ExcelExportEntity("片区名称", "areaName",15));
        entityList.add(new ExcelExportEntity("巡检保洁员数", "inspectorCount",15));
        // 动态添加作业类型分类
        List<String> list = new ArrayList<>(allTypeNames);
        Collections.reverse(list);
        for (String typeName : list) {
            ExcelExportEntity excelExportEntity1 = new ExcelExportEntity(typeName, typeName, 15);
            excelExportEntity1.setGroupName("作业类型分类");
            entityList.add(excelExportEntity1);
        }
        ExcelExportEntity excelExportEntity8 = new ExcelExportEntity("整改完成任务", "total", 15);
        excelExportEntity8.setGroupName("任务情况汇总");
        entityList.add(excelExportEntity8);
        ExcelExportEntity excelExportEntity7 = new ExcelExportEntity("超时未执行任务", "total", 15);
        excelExportEntity7.setGroupName("任务情况汇总");
        entityList.add(excelExportEntity7);
        ExcelExportEntity excelExportEntity6 = new ExcelExportEntity("审核通过任务", "total", 15);
        excelExportEntity6.setGroupName("任务情况汇总");
        entityList.add(excelExportEntity6);
        ExcelExportEntity excelExportEntity5 = new ExcelExportEntity("待整改任务", "total", 15);
        excelExportEntity5.setGroupName("任务情况汇总");
        entityList.add(excelExportEntity5);
        ExcelExportEntity excelExportEntity4 = new ExcelExportEntity("未执行任务", "total", 15);
        excelExportEntity4.setGroupName("任务情况汇总");
        entityList.add(excelExportEntity4);
        ExcelExportEntity excelExportEntity3 = new ExcelExportEntity("清洁不合格", "total", 15);
        excelExportEntity3.setGroupName("任务情况汇总");
        entityList.add(excelExportEntity3);
        ExcelExportEntity excelExportEntity2 = new ExcelExportEntity("清洁合格", "total", 15);
        excelExportEntity2.setGroupName("任务情况汇总");
        entityList.add(excelExportEntity2);
        ExcelExportEntity excelExportEntity1 = new ExcelExportEntity("总数", "total", 15);
        excelExportEntity1.setGroupName("任务情况汇总");
        entityList.add(excelExportEntity1);
        List<Map<String, Object>> mapList = new ArrayList<>();
        for (ProjectDeptDetailsVO projectDeptDetailsVO : res) {
            List<ProjectDeptDetailsChildVO> projectChild = projectDeptDetailsVO.getProjectChild();
            for (ProjectDeptDetailsChildVO row : projectChild) {
                Map<String, Object> map = new HashMap<>();
                map.put("projectName", projectDeptDetailsVO.getProjectName());
                map.put("areaName", row.getProjectChildName());
                map.put("inspectorCount", row.getCleanerCount());
                // 动态作业类型
                for (LocationTypeListByProjectVO lt : row.getLocationTypeList()) {
                    map.put(lt.getLocationTypeName(), lt.getLocationNum());
                }
                // 没有的类型补0
                for (String typeName : allTypeNames) {
                    map.putIfAbsent(typeName, 0);
                }
                map.put("total", row.getTotal());
                map.put("num1", row.getNum1());
                map.put("num2", row.getNum2());
                map.put("num3", row.getNum3());
                map.put("num4", row.getNum4());
                map.put("num5", row.getNum5());
                map.put("num6", row.getNum6());
                map.put("num7", row.getNum7());
                mapList.add(map);
            }
        }
        ExportParams params = new ExportParams("任务报表", "数据表");
        Workbook workbook = ExcelExportUtil.exportExcel(params, entityList, mapList);
        response.setHeader("content-type", "application/vnd.ms-excel");
        response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode("任务情况汇总.xlsx", "UTF-8"));
        workbook.write(response.getOutputStream());
        workbook.close();
    }
    @ApiOperation(value = "巡检人员报表")
    @PostMapping(value = "/patrolInspectorList")
    public R<List<PatrolInspectorVO>> patrolInspectorList(@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.eq(TLeave::getAuditStatus,2);
        List<TLeave> leaves = leaveService.list(tLeaveLambdaQueryWrapper);
        if (StringUtils.hasLength(query.getDeptName())){
            List<String> projectIds = projectDeptService.lambdaQuery().like(TProjectDept::getProjectName, query.getDeptName()).list()
                    .stream().map(TProjectDept::getId).collect(Collectors.toList());
            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 ArrayList<>());
            }
            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.getPhonenumber())){
            List<Long> patrolInspectorIds = sysUsers.stream().filter(sysUser ->
                    sysUser.getPhonenumber().equals(query.getPhonenumber())
            ).map(SysUser::getUserId).collect(Collectors.toList());
            if (!query.getPatrolInspectorIds().isEmpty()){
                // 取交集
                patrolInspectorIds = patrolInspectorIds.stream().filter(query.getPatrolInspectorIds()::contains).collect(Collectors.toList());
            }
            query.setPatrolInspectorIds(patrolInspectorIds);
            if (patrolInspectorIds.isEmpty()){
                return R.ok(new ArrayList<>());
            }
        }
        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());
        }
        if(query.getPatrolInspectorIds()!=null){
            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);
        for (SysUser sysUser : sysUsers) {
            PatrolInspectorVO patrolInspectorVO = new PatrolInspectorVO();
            patrolInspectorVO.setNickName(sysUser.getNickName());
            patrolInspectorVO.setPhonenumber(sysUser.getPhonenumber());
            if (sysUser.getDeptType() == 1){
                TProjectDept tProjectDept = projectDeptService.getById(sysUser.getDeptId());
                if (tProjectDept!=null&&!tProjectDept.getParentId().equals("0")){
                    TProjectDept tProjectDept1 = projectDeptService.getById(tProjectDept.getParentId());
                    if (tProjectDept1!=null)
                    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());
            }
            // 查询巡检员任务ids
            List<String> taskIds = tasks.stream().filter(e->e.getPatrolInspector().equals(sysUser.getUserId()+"")).map(TTask::getId).collect(Collectors.toList());
            List<TTaskDetail> list = taskDetailService.lambdaQuery()
                    .eq(TTaskDetail::getAuditStatus, 1)
                    .isNotNull(TTaskDetail::getClearStatus).orderByDesc(BaseModel::getCreateTime)
                    .in(!taskIds.isEmpty(), TTaskDetail::getTaskId,taskIds).groupBy(TTaskDetail::getTaskId).list();
            // 查询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());
            List<TTask> taskList = tasks.stream().filter(e -> e.getPatrolInspector().equals(sysUser.getUserId() + "")).collect(Collectors.toList());
            patrolInspectorVO.setTotal(taskList.size());
            patrolInspectorVO.setNum1(clearStatus1.size());
            patrolInspectorVO.setNum2(clearStatus2.size());
            patrolInspectorVO.setNum3(clearStatus1.size()+clearStatus2.size()!=0?
                    (new BigDecimal(clearStatus1.size()).add(new BigDecimal(clearStatus2.size())))
                            .divide(new BigDecimal(clearStatus1.size()), 2, RoundingMode.HALF_DOWN)
                            .multiply(new BigDecimal(100)):BigDecimal.ZERO);
            // 未执行
            List<TTask> status1 = taskList.stream().filter(e -> e.getStatus() == 1).collect(Collectors.toList());
            List<TTask> status2 = taskList.stream().filter(e -> e.getStatus() == 3).collect(Collectors.toList());
            List<TTask> status3 = taskList.stream().filter(e -> e.getStatus() == 2).collect(Collectors.toList());
            List<TTask> status4 = taskList.stream().filter(e -> e.getStatus() == 4).collect(Collectors.toList());
            List<TTask> status5 = taskList.stream().filter(e -> e.getStatus() == 5).collect(Collectors.toList());
            List<TTask> status6 = taskList.stream().filter(e -> e.getStatus() == 6).collect(Collectors.toList());
            patrolInspectorVO.setNum4(status1.size());
            patrolInspectorVO.setNum5(status2.size());
            patrolInspectorVO.setNum6(status3.size());
            patrolInspectorVO.setNum7(status4.size());
            patrolInspectorVO.setNum8(status5.size());
            patrolInspectorVO.setNum9(!status5.isEmpty()?new BigDecimal(status5.size())
                    .divide(new BigDecimal(status4.size()).add(new BigDecimal(status5.size())),2,RoundingMode.HALF_DOWN)
                    .multiply(new BigDecimal(100)):BigDecimal.ZERO);
            patrolInspectorVO.setNum10(status6.size());
            patrolInspectorVO.setNum11(!status6.isEmpty()?new BigDecimal(status6.size()).divide(new BigDecimal(taskList.size()),2,RoundingMode.HALF_DOWN):BigDecimal.ZERO);
            List<TLeave> collect1 = leaves.stream().filter(e -> e.getLeavePerson().equals(sysUser.getUserId()+"")).collect(Collectors.toList());
            patrolInspectorVO.setNum12(collect1.size());
            res.add(patrolInspectorVO);
        }
        return R.ok(res);
    }
    @ApiOperation(value = "巡检人员报表导出")
    @PostMapping(value = "/patrolInspectorListExport")
    @Log(title = "巡检人员报表导出", businessType = BusinessType.EXPORT)
    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.eq(TLeave::getAuditStatus,2);
        List<TLeave> leaves = leaveService.list(tLeaveLambdaQueryWrapper);
        if (StringUtils.hasLength(query.getDeptName())){
            List<String> projectIds = projectDeptService.lambdaQuery().like(TProjectDept::getProjectName, query.getDeptName()).list()
                    .stream().map(TProjectDept::getId).collect(Collectors.toList());
            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("0");
            }
            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.getPhonenumber())){
            List<Long> patrolInspectorIds = sysUsers.stream().filter(sysUser ->
                    sysUser.getPhonenumber().equals(query.getPhonenumber())
            ).map(SysUser::getUserId).collect(Collectors.toList());
            if (!query.getPatrolInspectorIds().isEmpty()){
                // 取交集
                patrolInspectorIds = patrolInspectorIds.stream().filter(query.getPatrolInspectorIds()::contains).collect(Collectors.toList());
            }
            query.setPatrolInspectorIds(patrolInspectorIds);
            if (patrolInspectorIds.isEmpty()){
                patrolInspectorIds.add(0L);
            }
        }
        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());
        }
        if(query.getPatrolInspectorIds()!=null){
            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);
        for (SysUser sysUser : sysUsers) {
            PatrolInspectorVO patrolInspectorVO = new PatrolInspectorVO();
            patrolInspectorVO.setNickName(sysUser.getNickName());
            patrolInspectorVO.setPhonenumber(sysUser.getPhonenumber());
            if (sysUser.getDeptType() == 1){
                TProjectDept tProjectDept = projectDeptService.getById(sysUser.getDeptId());
                if (tProjectDept!=null&&!tProjectDept.getParentId().equals("0")){
                    TProjectDept tProjectDept1 = projectDeptService.getById(tProjectDept.getParentId());
                    if (tProjectDept1!=null)
                    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());
            }
            // 查询巡检员任务ids
            List<String> taskIds = tasks.stream().filter(e->e.getPatrolInspector().equals(sysUser.getUserId()+"")).map(TTask::getId).collect(Collectors.toList());
            List<TTaskDetail> list = taskDetailService.lambdaQuery()
                    .eq(TTaskDetail::getAuditStatus, 1)
                    .isNotNull(TTaskDetail::getClearStatus).orderByDesc(BaseModel::getCreateTime)
                    .in(!taskIds.isEmpty(), TTaskDetail::getTaskId,taskIds).groupBy(TTaskDetail::getTaskId).list();
            // 查询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());
            List<TTask> taskList = tasks.stream().filter(e -> e.getPatrolInspector().equals(sysUser.getUserId() + "")).collect(Collectors.toList());
            patrolInspectorVO.setTotal(taskList.size());
            patrolInspectorVO.setNum1(clearStatus1.size());
            patrolInspectorVO.setNum2(clearStatus2.size());
            patrolInspectorVO.setNum3(clearStatus1.size()+clearStatus2.size()!=0?
                    (new BigDecimal(clearStatus1.size()).add(new BigDecimal(clearStatus2.size())))
                            .divide(new BigDecimal(clearStatus1.size()), 2, RoundingMode.HALF_DOWN)
                            .multiply(new BigDecimal(100)):BigDecimal.ZERO);
            // 未执行
            List<TTask> status1 = taskList.stream().filter(e -> e.getStatus() == 1).collect(Collectors.toList());
            List<TTask> status2 = taskList.stream().filter(e -> e.getStatus() == 3).collect(Collectors.toList());
            List<TTask> status3 = taskList.stream().filter(e -> e.getStatus() == 2).collect(Collectors.toList());
            List<TTask> status4 = taskList.stream().filter(e -> e.getStatus() == 4).collect(Collectors.toList());
            List<TTask> status5 = taskList.stream().filter(e -> e.getStatus() == 5).collect(Collectors.toList());
            List<TTask> status6 = taskList.stream().filter(e -> e.getStatus() == 6).collect(Collectors.toList());
            patrolInspectorVO.setNum4(status1.size());
            patrolInspectorVO.setNum5(status2.size());
            patrolInspectorVO.setNum6(status3.size());
            patrolInspectorVO.setNum7(status4.size());
            patrolInspectorVO.setNum8(status5.size());
            patrolInspectorVO.setNum9(!status5.isEmpty()?new BigDecimal(status5.size())
                    .divide(new BigDecimal(status4.size()).add(new BigDecimal(status5.size())),2,RoundingMode.HALF_DOWN)
                    .multiply(new BigDecimal(100)):BigDecimal.ZERO);
            patrolInspectorVO.setNum10(status6.size());
            patrolInspectorVO.setNum11(!status6.isEmpty()?new BigDecimal(status6.size()).divide(new BigDecimal(taskList.size()),2,RoundingMode.HALF_DOWN):BigDecimal.ZERO);
            List<TLeave> collect1 = leaves.stream().filter(e -> e.getLeavePerson().equals(sysUser.getUserId()+"")).collect(Collectors.toList());
            patrolInspectorVO.setNum12(collect1.size());
            res.add(patrolInspectorVO);
        }
        //1.获取excel模板
        Workbook workbook = ExcelExportUtil.exportExcel(new ExportParams(), PatrolInspectorVO.class, res);
        HttpServletResponse response = WebUtils.response();
        response.setContentType("application/vnd.ms-excel");
        response.setCharacterEncoding("utf-8");
        ServletOutputStream outputStream = null;
        try {
            String fileName = URLEncoder.encode("巡检人员列表.xls", "utf-8");
            response.setHeader("Content-dispodition", "attachment;filename=" + fileName);
            outputStream = response.getOutputStream();
            workbook.write(outputStream);
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                outputStream.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
    @ApiOperation(value = "随机督察报表")
    @PostMapping(value = "/inspectorList")
    public R<List<InspectorVO>> inspectorList(@RequestBody InspectorQuery query) {
        List<SysUser> sysUsers = sysUserService.selectAllList();
        if (StringUtils.hasLength(query.getDeptName())){
            List<String> projectIds = projectDeptService.lambdaQuery().like(TProjectDept::getProjectName, query.getDeptName()).list()
                    .stream().map(TProjectDept::getId).collect(Collectors.toList());
            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 ArrayList<>());
            }
            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.getPhonenumber())){
            List<Long> patrolInspectorIds = sysUsers.stream().filter(sysUser ->
                    sysUser.getPhonenumber().equals(query.getPhonenumber())
            ).map(SysUser::getUserId).collect(Collectors.toList());
            if (!query.getPatrolInspectorIds().isEmpty()){
                // 取交集
                patrolInspectorIds = patrolInspectorIds.stream().filter(query.getPatrolInspectorIds()::contains).collect(Collectors.toList());
            }
            query.setPatrolInspectorIds(patrolInspectorIds);
            if (patrolInspectorIds.isEmpty()){
                return R.ok(new ArrayList<>());
            }
        }
        LambdaQueryWrapper<TInspector> tTaskLambdaQueryWrapper = new LambdaQueryWrapper<>();
        tTaskLambdaQueryWrapper.eq(TInspector::getAuditStatus,1);
        tTaskLambdaQueryWrapper.isNotNull(TInspector::getClearStatus);
        if (StringUtils.hasLength(query.getStartTime())){
            tTaskLambdaQueryWrapper.ge(TInspector::getCreateTime, query.getStartTime());
            tTaskLambdaQueryWrapper.le(TInspector::getCreateTime, query.getEndTime());
        }
        if(query.getPatrolInspectorIds()!=null){
            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);
        for (SysUser sysUser : sysUsers) {
            InspectorVO inspectorVO = new InspectorVO();
            inspectorVO.setNickName(sysUser.getNickName());
            inspectorVO.setPhonenumber(sysUser.getPhonenumber());
            if (sysUser.getDeptType() == 1){
                TProjectDept tProjectDept = projectDeptService.getById(sysUser.getDeptId());
                if (tProjectDept!=null&&!tProjectDept.getParentId().equals("0")){
                    TProjectDept tProjectDept1 = projectDeptService.getById(tProjectDept.getParentId());
                    if (tProjectDept1!=null)
                        inspectorVO.setDeptName(tProjectDept1.getProjectName()+">"+tProjectDept.getProjectName());
                }else{
                    inspectorVO.setDeptName(tProjectDept.getProjectName());
                }
            }else{
                TDept tDept = deptService.getById(sysUser.getDeptId());
                if (tDept!=null)
                    inspectorVO.setDeptName(tDept.getDeptName());
            }
            inspectorVO.setTotal(inspectors.size());
            List<TInspector> status1 = inspectors.stream().filter(e -> e.getClearStatus() == 1).collect(Collectors.toList());
            List<TInspector> status2 = inspectors.stream().filter(e -> e.getClearStatus() == 2).collect(Collectors.toList());
            List<TInspector> status4 = inspectors.stream().filter(e -> e.getStatus() == 1).collect(Collectors.toList());
            List<TInspector> status5 = inspectors.stream().filter(e -> e.getStatus() == 2).collect(Collectors.toList());
            List<TInspector> status6 = inspectors.stream().filter(e -> e.getStatus() == 3).collect(Collectors.toList());
            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.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));
            res.add(inspectorVO);
        }
        return R.ok(res);
    }
    @ApiOperation(value = "随机督察报表导出")
    @PostMapping(value = "/inspectorListExport")
    @Log(title = "随机督察报表导出", businessType = BusinessType.EXPORT)
    public void inspectorListExport(@RequestBody InspectorQuery query) {
        List<SysUser> sysUsers = sysUserService.selectAllList();
        if (StringUtils.hasLength(query.getDeptName())){
            List<String> projectIds = projectDeptService.lambdaQuery().like(TProjectDept::getProjectName, query.getDeptName()).list()
                    .stream().map(TProjectDept::getId).collect(Collectors.toList());
            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");
            }
            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.getPhonenumber())){
            List<Long> patrolInspectorIds = sysUsers.stream().filter(sysUser ->
                    sysUser.getPhonenumber().equals(query.getPhonenumber())
            ).map(SysUser::getUserId).collect(Collectors.toList());
            if (!query.getPatrolInspectorIds().isEmpty()){
                // 取交集
                patrolInspectorIds = patrolInspectorIds.stream().filter(query.getPatrolInspectorIds()::contains).collect(Collectors.toList());
            }
            query.setPatrolInspectorIds(patrolInspectorIds);
            if (patrolInspectorIds.isEmpty()){
                patrolInspectorIds.add(0L);
            }
        }
        LambdaQueryWrapper<TInspector> tTaskLambdaQueryWrapper = new LambdaQueryWrapper<>();
        tTaskLambdaQueryWrapper.eq(TInspector::getAuditStatus,1);
        tTaskLambdaQueryWrapper.isNotNull(TInspector::getClearStatus);
        if (StringUtils.hasLength(query.getStartTime())){
            tTaskLambdaQueryWrapper.ge(TInspector::getCreateTime, query.getStartTime());
            tTaskLambdaQueryWrapper.le(TInspector::getCreateTime, query.getEndTime());
        }
        if(query.getPatrolInspectorIds()!=null){
            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);
        for (SysUser sysUser : sysUsers) {
            InspectorVO inspectorVO = new InspectorVO();
            inspectorVO.setNickName(sysUser.getNickName());
            inspectorVO.setPhonenumber(sysUser.getPhonenumber());
            if (sysUser.getDeptType() == 1){
                TProjectDept tProjectDept = projectDeptService.getById(sysUser.getDeptId());
                if (tProjectDept!=null&&!tProjectDept.getParentId().equals("0")){
                    TProjectDept tProjectDept1 = projectDeptService.getById(tProjectDept.getParentId());
                    if (tProjectDept1!=null)
                        inspectorVO.setDeptName(tProjectDept1.getProjectName()+">"+tProjectDept.getProjectName());
                }else{
                    inspectorVO.setDeptName(tProjectDept.getProjectName());
                }
            }else{
                TDept tDept = deptService.getById(sysUser.getDeptId());
                if (tDept!=null)
                    inspectorVO.setDeptName(tDept.getDeptName());
            }
            inspectorVO.setTotal(inspectors.size());
            List<TInspector> status1 = inspectors.stream().filter(e -> e.getClearStatus() == 1).collect(Collectors.toList());
            List<TInspector> status2 = inspectors.stream().filter(e -> e.getClearStatus() == 2).collect(Collectors.toList());
            List<TInspector> status4 = inspectors.stream().filter(e -> e.getStatus() == 1).collect(Collectors.toList());
            List<TInspector> status5 = inspectors.stream().filter(e -> e.getStatus() == 2).collect(Collectors.toList());
            List<TInspector> status6 = inspectors.stream().filter(e -> e.getStatus() == 3).collect(Collectors.toList());
            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.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));
            res.add(inspectorVO);
        }
        //1.获取excel模板
        Workbook workbook = ExcelExportUtil.exportExcel(new ExportParams(), InspectorVO.class, res);
        HttpServletResponse response = WebUtils.response();
        response.setContentType("application/vnd.ms-excel");
        response.setCharacterEncoding("utf-8");
        ServletOutputStream outputStream = null;
        try {
            String fileName = URLEncoder.encode("随机督察列表.xls", "utf-8");
            response.setHeader("Content-dispodition", "attachment;filename=" + fileName);
            outputStream = response.getOutputStream();
            workbook.write(outputStream);
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                outputStream.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}