From 48a55a1aadabface50173439cbdda9126ee2ef71 Mon Sep 17 00:00:00 2001
From: 无关风月 <443237572@qq.com>
Date: 星期四, 03 七月 2025 23:12:40 +0800
Subject: [PATCH] Merge remote-tracking branch 'origin/master'

---
 ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/ReportController.java |  830 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 825 insertions(+), 5 deletions(-)

diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/ReportController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/ReportController.java
index 223bc2e..babec9d 100644
--- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/ReportController.java
+++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/ReportController.java
@@ -1,33 +1,44 @@
 package com.ruoyi.web.controller.api;
 
 
+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;
 import com.ruoyi.common.core.domain.BaseModel;
 import com.ruoyi.common.core.domain.R;
 import com.ruoyi.common.core.domain.entity.SysUser;
+import com.ruoyi.common.enums.BusinessType;
+import com.ruoyi.common.utils.WebUtils;
 import com.ruoyi.common.utils.bean.BeanUtils;
 import com.ruoyi.framework.web.service.TokenService;
 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.StringUtils;
 import org.springframework.web.bind.annotation.*;
 import org.springframework.web.multipart.MultipartFile;
 import oshi.driver.mac.net.NetStat;
 
 import javax.annotation.Resource;
+import javax.servlet.ServletOutputStream;
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
 import java.math.BigDecimal;
 import java.math.RoundingMode;
+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;
 
 /**
@@ -61,6 +72,8 @@
     @Resource
     private TDeptService deptService;
     @Resource
+    private TTemplateCountService templateCountService;
+    @Resource
     private ISysUserService sysUserService;
     @Resource
     private TDictDataService dictDataService;
@@ -74,6 +87,8 @@
     private TLeaveService leaveService;
     @Resource
     private TInspectorService inspectorService;
+    @Resource
+    private TCleanerService cleanerService;
 
     @ApiOperation(value = "任务进度分页列表查询")
     @PostMapping(value = "/taskProgress")
@@ -152,6 +167,141 @@
                 }
             }
             TTemplate tTemplate = templates.stream().filter(e -> e.getId().equals(record.getTemplateId())).findFirst().orElse(null);
+            record.setNum1(1);
+            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;
+                        }
+                    }
+                    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));
+            }
+            String templateId = record.getTemplateId();
+            Long count = leaveService.lambdaQuery()
+                    .eq(TLeave::getTemplateId, templateId)
+                    .eq(TLeave::getLeavePerson, record.getUserId())
+                    .eq(TLeave::getAuditStatus, 2).count();
+            record.setNum5(count);
+        }
+        progressListVOPageInfo.setRecords(records);
+        return R.ok(progressListVOPageInfo);
+    }
+    @ApiOperation(value = "任务进度导出")
+    @Log(title = "任务进度导出", businessType = BusinessType.EXPORT)
+    @PostMapping(value = "/taskProgressExport")
+    public void taskProgressExport(@RequestBody TaskProgressQuery 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");
+            }
+            // 用户ids
+            List<Long> collect = sysUsers.stream().filter(e -> e.getDeptType() == 1 && projectIds.contains(e.getDeptId())).map(SysUser::getUserId)
+                    .collect(Collectors.toList());
+            List<Long> collect1 = sysUsers.stream().filter(e -> e.getDeptType() == 2 && deptIds.contains(e.getDeptId())).map(SysUser::getUserId)
+                    .collect(Collectors.toList());
+            collect.addAll(collect1);
+            if (collect.isEmpty()) {
+                collect.add(0L);
+            }
+            query.setPatrolInspectorIds(collect);
+
+            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);
+                } else {
+                    patrolInspectorIds = patrolInspectorIds.stream().filter(query.getPatrolInspectorIds()::contains).collect(Collectors.toList());
+                    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 (patrolInspectorIds.isEmpty()) {
+                patrolInspectorIds.add(0L);
+            }
+            if (!query.getPatrolInspectorIds().isEmpty()) {
+                // 取交集
+                patrolInspectorIds = patrolInspectorIds.stream().filter(query.getPatrolInspectorIds()::contains).collect(Collectors.toList());
+            }
+            query.setPatrolInspectorIds(patrolInspectorIds);
+        }
+        List<ProgressListVO> records = taskCleanerService.taskProgressExport(query);
+        List<TTemplate> templates = templateService.list();
+        List<TTemplateDetail> templateDetails = templateDetailService.list();
+        for (ProgressListVO record : records) {
+            SysUser sysUser1 = sysUsers.stream().filter(sysUser -> sysUser.getUserId().equals(record.getUserId())).findFirst().orElse(null);
+            if (sysUser1 != null) {
+                if (sysUser1.getDeptType() == 1) {
+                    TProjectDept tProjectDept = projectDeptService.getById(sysUser1.getDeptId());
+                    if (tProjectDept != null) {
+                        if (!tProjectDept.getParentId().equals("0")) {
+                            TProjectDept tProjectDept1 = projectDeptService.getById(tProjectDept.getParentId());
+                            if (tProjectDept1 != null) {
+                                record.setDeptName(tProjectDept1.getProjectName() + ">" + tProjectDept.getProjectName());
+                            }
+                        } else {
+                            record.setDeptName(tProjectDept.getProjectName());
+                        }
+                    }
+                } else {
+                    TDept tDept = deptService.getById(sysUser1.getDeptId());
+                    if (tDept != null) {
+                        record.setDeptName(tDept.getDeptName());
+                    }
+                }
+            }
+            TTemplate tTemplate = templates.stream().filter(e -> e.getId().equals(record.getTemplateId())).findFirst().orElse(null);
             // todo 应生成计划数
             record.setNum1(1);
             LocalDateTime createTime = tTemplate.getCreateTime();
@@ -199,8 +349,26 @@
                     .eq(TLeave::getAuditStatus, 2).count();
             record.setNum5(count);
         }
-        progressListVOPageInfo.setRecords(records);
-        return R.ok(progressListVOPageInfo);
+        //1.获取excel模板
+        Workbook workbook = ExcelExportUtil.exportExcel(new ExportParams(), ProgressListVO.class, records);
+        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 = "任务报表")
@@ -250,6 +418,8 @@
         }
         for (ProjectDeptDetailsVO re : res) {
             for (ProjectDeptDetailsChildVO projectDeptDetailsChildVO : re.getProjectChild()) {
+                int cleanerCount = cleanerService.lambdaQuery().eq(TCleaner::getProjectId, projectDeptDetailsChildVO.getProjectId()).list().size();
+                projectDeptDetailsChildVO.setCleanerCount(cleanerCount);
                 List<LocationTypeListByProjectVO> locationTypeListByProjectVOS1 = new ArrayList<>();
                 for (LocationTypeListByProjectVO locationTypeListByProjectVO : locationTypeListByProjectVOS) {
                     LocationTypeListByProjectVO temp = new LocationTypeListByProjectVO();
@@ -317,15 +487,217 @@
                     locationTypeListByProjectVOS1.add(temp);
                 }
                 projectDeptDetailsChildVO.setLocationTypeList(locationTypeListByProjectVOS1);
+
             }
 
         }
         return R.ok(res);
     }
+    @ApiOperation(value = "任务报表导出")
+    @PostMapping(value = "/taskDetailsExport")
+    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<>();
+        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;
+                        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);
+                    }
+                }
+                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<>();
@@ -440,6 +812,142 @@
         }
         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")
@@ -527,5 +1035,317 @@
         }
         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();
+            }
+        }
+    }
+
+
+    @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;
+                        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);
+                    }
+                }
+                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();
+
+    }
+
 }
 

--
Gitblit v1.7.1