xuhy
2025-07-03 fbff8d87d3e4c7a99725bfc25d8e616bdb373d46
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;
@@ -37,9 +38,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.Objects;
import java.util.*;
import java.util.stream.Collectors;
/**
@@ -72,6 +71,8 @@
    private TTaskDetailService tTaskDetailService;
    @Resource
    private TDeptService deptService;
    @Resource
    private TTemplateCountService templateCountService;
    @Resource
    private ISysUserService sysUserService;
    @Resource
@@ -168,6 +169,12 @@
            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字符串
@@ -488,7 +495,7 @@
    }
    @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<>();
@@ -532,13 +539,11 @@
            locationTypeListByProjectVOS.add(locationTypeListByProjectVO);
        }
        for (ProjectDeptDetailsVO re : res) {
            for (ProjectDeptDetailsChildVO projectDeptDetailsChildVO : re.getProjectChild()) {
            List<ProjectDeptDetailsChildVO> projectChild = re.getProjectChild();
            for (ProjectDeptDetailsChildVO projectDeptDetailsChildVO : projectChild) {
                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();
                    BeanUtils.copyProperties(locationTypeListByProjectVO, temp);
                    List<String> locationIds = locations.stream().filter(e -> e.getLocationType().equals(locationTypeListByProjectVO.getId())).map(TLocation::getId).collect(Collectors.toList());
                    if (locationIds.isEmpty()) {
                        locationTypeListByProjectVO.setLocationNum(0);
@@ -546,7 +551,7 @@
                        List<TTask> taskList = tasks.stream().filter(e -> e.getProjectId().equals(projectDeptDetailsChildVO.getProjectId())
                                && locationIds.contains(e.getLocationId())).collect(Collectors.toList());
                        Integer count = taskList.size();
                        temp.setLocationNum(count);
                        locationTypeListByProjectVO.setLocationNum(count);
                        int total = taskList.size();
                        int num1 = 0;
                        int num2 = 0;
@@ -599,34 +604,96 @@
                        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 = "巡检人员报表")
@@ -1079,10 +1146,6 @@
    @ApiOperation(value = "任务报表导出模板")
    @PostMapping(value = "/exportExcel")
    public void exportExcel(@RequestBody TaskDetailsQuery query,HttpServletResponse response) throws Exception{
        // 动态标头名称字段
        final String headerName = "locationTypeName";
        // 动态标头值字段
        final String headerValue = "locationNum";
        List<TLocationType> locationTypeList = locationTypeService.list();
        List<TLocation> locations = locationService.list();
        LambdaQueryWrapper<TTask> tTaskLambdaQueryWrapper = new LambdaQueryWrapper<>();
@@ -1131,7 +1194,6 @@
                int cleanerCount = cleanerService.lambdaQuery().eq(TCleaner::getProjectId, projectDeptDetailsChildVO.getProjectId()).list().size();
                projectDeptDetailsChildVO.setCleanerCount(cleanerCount);
                for (LocationTypeListByProjectVO locationTypeListByProjectVO : locationTypeListByProjectVOS) {
                    List<TaskSummaryVO> taskSummaryVOS = new ArrayList<>();
                    List<String> locationIds = locations.stream().filter(e -> e.getLocationType().equals(locationTypeListByProjectVO.getId())).map(TLocation::getId).collect(Collectors.toList());
                    if (locationIds.isEmpty()) {
                        locationTypeListByProjectVO.setLocationNum(0);
@@ -1148,7 +1210,6 @@
                        int num5 = 0;
                        int num6 = 0;
                        int num7 = 0;
                        TaskSummaryVO taskSummaryVO = new TaskSummaryVO();
                        for (TTask tTask : taskList) {
                            TTaskDetail tTaskDetail = taskDetails.stream().filter(e -> e.getTaskId().equals(tTask.getId()) && e.getClearStatus() != null).findFirst().orElse(null);
                            if (tTaskDetail!=null){
@@ -1184,29 +1245,106 @@
                                    break;
                            }
                        }
                        taskSummaryVO.setTotal(total);
                        taskSummaryVO.setNum1(num1);
                        taskSummaryVO.setNum2(num2);
                        taskSummaryVO.setNum3(num3);
                        taskSummaryVO.setNum4(num4);
                        taskSummaryVO.setNum5(num5);
                        taskSummaryVO.setNum6(num6);
                        taskSummaryVO.setNum7(num7);
                        taskSummaryVOS.add(taskSummaryVO);
                        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.setTaskSummaryVOS(taskSummaryVOS);
                }
                projectDeptDetailsChildVO.setLocationTypeList(locationTypeListByProjectVOS);
            }
        }
        try {
            String time = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy_MM_dd_HH_mm_ss"));
            ExcelPoiUtils.exportExcel(response,  "任务报表_"+time, "任务报表导出模板",
                    "sheet", res, headerName, headerValue);
        } catch (Exception e) {
            System.out.println("导出错误,"+e.getMessage());
            throw new RuntimeException(e.getMessage());
        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();
    }
}