无关风月
2025-06-30 7c1bbfb67b710ab6f2f9a931415b98f303ff384b
保洁巡检本周代码
4个文件已添加
12个文件已修改
850 ■■■■■ 已修改文件
ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/ReportController.java 539 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/TLocationController.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/TProjectDeptController.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/TTaskController.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/WorkbenchesController.java 122 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-applet/src/main/java/com/ruoyi/web/controller/api/TTaskDetailController.java 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/dto/TaskDetailDto.java 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/dto/WorkBenchesDTO.java 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/mapper/TTaskMapper.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/service/TTaskCleanService.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TTaskCleanServiceImpl.java 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/vo/system/InspectorVO.java 21 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/vo/system/PatrolInspectorVO.java 33 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/vo/system/ProgressListVO.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/vo/system/WorkBenchesVO.java 50 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/resources/mapper/system/TTaskMapper.xml 24 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/ReportController.java
@@ -1,11 +1,16 @@
package com.ruoyi.web.controller.api;
import cn.afterturn.easypoi.excel.ExcelExportUtil;
import cn.afterturn.easypoi.excel.entity.ExportParams;
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.*;
@@ -16,14 +21,19 @@
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;
@@ -204,6 +214,151 @@
        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();
            // 转化为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);
        }
        //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 = "任务报表")
    @PostMapping(value = "/taskDetails")
@@ -328,6 +483,148 @@
        }
        return R.ok(res);
    }
    @ApiOperation(value = "任务报表导出")
    @PostMapping(value = "/taskDetailsExport")
    public void taskDetailsExport(@RequestBody TaskDetailsQuery query) {
        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) {
            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();
                    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);
                    } else {
                        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);
                        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);
                }
                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();
            }
        }
    }
    @ApiOperation(value = "巡检人员报表")
    @PostMapping(value = "/patrolInspectorList")
@@ -446,6 +743,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")
@@ -533,5 +966,111 @@
        }
        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();
            }
        }
    }
}
ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/TLocationController.java
@@ -13,6 +13,7 @@
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.dto.LocationDTO;
import com.ruoyi.system.importExcel.TLocationImportExcel;
import com.ruoyi.system.model.*;
@@ -72,6 +73,8 @@
    private TDeptService deptService;
    @Resource
    private ISysUserService sysUserService;
    @Resource
    private TokenService tokenService;
    @ApiOperation(value = "点位管理分页列表")
    @PostMapping(value = "/pageList")
@@ -187,6 +190,7 @@
    public R<List<TLocation>> listLocation(@RequestParam String id) {
        return R.ok(locationService.lambdaQuery().eq(TLocation::getLocationCleaner,id).list());
    }
    @ApiOperation(value = "查询部门 项目部列表 不分页")
    @GetMapping(value = "/listDepts")
    public R<List<DeptNoLimitVO>> listDepts() {
ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/TProjectDeptController.java
@@ -63,7 +63,7 @@
                BeanUtils.copyProperties(projectDept,projectDeptListNoLimitVO1);
                projectDeptListNoLimitVOS1.add(projectDeptListNoLimitVO1);
            }
            projectDeptListNoLimitVO.setChildren(projectDeptListNoLimitVOS1);
            projectDeptListNoLimitVO.setChildrenList(projectDeptListNoLimitVOS1);
            projectDeptListNoLimitVOS.add(projectDeptListNoLimitVO);
        }
        return R.ok(projectDeptListNoLimitVOS);
ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/TTaskController.java
@@ -318,7 +318,7 @@
        return R.ok();
    }
    @Log(title = "任务记录导出", businessType = BusinessType.DELETE)
    @Log(title = "任务记录导出", businessType = BusinessType.EXPORT)
    @ApiOperation(value = "任务记录导出")
    @PostMapping(value = "/exportExcel")
    public void exportExcel(@RequestBody TaskListQuery query) {
ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/WorkbenchesController.java
New file
@@ -0,0 +1,122 @@
package com.ruoyi.web.controller.api;
import com.ruoyi.common.core.domain.R;
import com.ruoyi.common.core.domain.entity.SysUser;
import com.ruoyi.framework.web.service.TokenService;
import com.ruoyi.system.dto.WorkBenchesDTO;
import com.ruoyi.system.model.TDept;
import com.ruoyi.system.model.TProjectDept;
import com.ruoyi.system.service.*;
import com.ruoyi.system.vo.system.DeptNoLimitChildVO;
import com.ruoyi.system.vo.system.DeptNoLimitParentVO;
import com.ruoyi.system.vo.system.DeptNoLimitVO;
import com.ruoyi.system.vo.system.WorkBenchesVO;
import com.ruoyi.web.util.OssUploadUtil;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
/**
 * <p>
 * 任务申诉 前端控制器
 * </p>
 *
 * @author xiaochen
 * @since 2025-05-28
 */
@Api(tags = "工作台")
@RestController
@RequestMapping("/workbenches")
public class WorkbenchesController {
    @Resource
    private TTaskCleanService taskCleanerService;
    @Resource
    private TTaskDetailService taskDetailService;
    @Resource
    private TLocationTypeService locationTypeService;
    @Resource
    private TLocationService locationService;
    @Resource
    private TProjectDeptService projectDeptService;
    @Resource
    private TTaskDetailService tTaskDetailService;
    @Resource
    private TDeptService deptService;
    @Resource
    private ISysUserService sysUserService;
    @Resource
    private ISysRoleService roleService;
    @Resource
    private TDictDataService dictDataService;
    @Resource
    private TLeaveService leaveService;
    @Resource
    private TLeaveAuditService leaveAuditService;
    @Resource
    private TokenService tokenService;
    @Resource
    private TAppealService appealService;
    @Resource
    private TInspectorService inspectorService;
    @Resource
    private TFeedbackService feedbackService;
    @Resource
    private TProblemEscalationService problemEscalationService;
    @PostMapping("/data")
    @ApiOperation(value = "工作台", tags = "工作台")
    public R<WorkBenchesVO> data(@RequestBody WorkBenchesDTO dto) {
        return R.ok();
    }
    @ApiOperation(value = "查询部门 项目部列表 不分页")
    @GetMapping(value = "/listDepts")
    public R<List<DeptNoLimitVO>> listDepts() {
        Long userId = tokenService.getLoginUser().getUserId();
        SysUser sysUser = sysUserService.selectUserById(userId);
        List<TProjectDept> parent = projectDeptService.lambdaQuery().eq(TProjectDept::getParentId, "0").list();
        List<TProjectDept> child = projectDeptService.lambdaQuery().ne(TProjectDept::getParentId, "0").list();
        List<DeptNoLimitVO> res = new ArrayList<>();
        DeptNoLimitVO deptNoLimitVO2 = new DeptNoLimitVO();
        deptNoLimitVO2.setDeptName("公司");
        res.add(deptNoLimitVO2);
        if (sysUser.getDeptType()==1){
            parent = parent.stream().filter(e -> e.getId().equals(sysUser.getDeptId())).collect(Collectors.toList());
        }
        for (DeptNoLimitVO re : res) {
            if (re.getDeptName().equals("项目部")) {
                List<DeptNoLimitParentVO> deptNoLimitVOS = new ArrayList<>();
                for (TProjectDept tProjectDept : parent) {
                    DeptNoLimitParentVO deptNoLimitVO = new DeptNoLimitParentVO();
                    deptNoLimitVO.setDeptName(tProjectDept.getProjectName());
                    deptNoLimitVO.setDeptId(tProjectDept.getId());
                    List<TProjectDept> collect = child.stream().filter(e -> e.getParentId().equals(tProjectDept.getId())).collect(Collectors.toList());
                    List<DeptNoLimitChildVO> deptNoLimitChildVOS = new ArrayList<>();
                    for (TProjectDept projectDept : collect) {
                        DeptNoLimitChildVO deptNoLimitChildVO = new DeptNoLimitChildVO();
                        deptNoLimitChildVO.setDeptName(projectDept.getProjectName());
                        deptNoLimitChildVO.setDeptId(projectDept.getId());
                        deptNoLimitChildVOS.add(deptNoLimitChildVO);
                    }
                    deptNoLimitVO.setDeptChild(deptNoLimitChildVOS);
                    deptNoLimitVOS.add(deptNoLimitVO);
                }
                re.setDeptChild(deptNoLimitVOS);
            }
        }
        return R.ok(res);
    }
}
ruoyi-applet/src/main/java/com/ruoyi/web/controller/api/TTaskDetailController.java
@@ -6,6 +6,7 @@
import com.ruoyi.common.core.domain.R;
import com.ruoyi.common.enums.BusinessType;
import com.ruoyi.system.dto.TTaskAuditBatchDTO;
import com.ruoyi.system.dto.TaskDetailDto;
import com.ruoyi.system.model.TAppeal;
import com.ruoyi.system.model.TTask;
import com.ruoyi.system.model.TTaskDetail;
@@ -48,7 +49,7 @@
    @ApiOperation(value = "上传任务")
    @PostMapping(value = "/uploadTask")
    public R<Boolean> uploadTask(@RequestBody TTaskDetail dto) {
    public R<Boolean> uploadTask(@RequestBody TaskDetailDto dto) {
        taskDetailService.save(dto);
        // 修改任务状态
        taskService.update(Wrappers.<TTask>lambdaUpdate().set(TTask::getStatus, 3).eq(TTask::getId, dto.getTaskId()));
ruoyi-system/src/main/java/com/ruoyi/system/dto/TaskDetailDto.java
New file
@@ -0,0 +1,19 @@
package com.ruoyi.system.dto;
import com.ruoyi.system.model.TCleaner;
import com.ruoyi.system.model.TTaskDetail;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
@Data
@ApiModel(value = "上传任务DTO")
public class TaskDetailDto extends TTaskDetail {
    @ApiModelProperty(value = "经度")
    private String lon;
    @ApiModelProperty(value = "纬度")
    private String lat;
}
ruoyi-system/src/main/java/com/ruoyi/system/dto/WorkBenchesDTO.java
New file
@@ -0,0 +1,17 @@
package com.ruoyi.system.dto;
import com.ruoyi.system.model.TCleaner;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
@Data
@ApiModel(value = "工作台DTO")
public class WorkBenchesDTO {
    @ApiModelProperty("片区/项目部/部门id ,默认公司不传")
    private String id;
    @ApiModelProperty("点位类型id")
    private String locationType;
}
ruoyi-system/src/main/java/com/ruoyi/system/mapper/TTaskMapper.java
@@ -37,4 +37,6 @@
    List<TaskListVO> exportList(@Param("query")TaskListQuery query);
    List<ProgressListVO> taskProgress(@Param("query")TaskProgressQuery query, @Param("pageInfo")PageInfo<ProgressListVO> pageInfo);
    List<ProgressListVO> taskProgressExport(@Param("query")TaskProgressQuery query);
}
ruoyi-system/src/main/java/com/ruoyi/system/service/TTaskCleanService.java
@@ -37,5 +37,6 @@
    PageInfo<ProgressListVO> taskProgress(TaskProgressQuery query);
    List<ProgressListVO> taskProgressExport(TaskProgressQuery query);
}
ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TTaskCleanServiceImpl.java
@@ -120,5 +120,12 @@
        return pageInfo;
    }
    @Override
    public List<ProgressListVO> taskProgressExport(TaskProgressQuery query) {
        List<ProgressListVO> list = this.baseMapper.taskProgressExport(query);
        return list;
    }
}
ruoyi-system/src/main/java/com/ruoyi/system/vo/system/InspectorVO.java
@@ -1,5 +1,6 @@
package com.ruoyi.system.vo.system;
import cn.afterturn.easypoi.excel.annotation.Excel;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
@@ -11,25 +12,45 @@
public class InspectorVO {
    @ApiModelProperty("巡检员名称")
    @Excel(name = "巡检员名称", width = 20,orderNum = "1")
    private String nickName;
    @ApiModelProperty("电话")
    @Excel(name = "电话", width = 20,orderNum = "2")
    private String phonenumber;
    @ApiModelProperty("部门名称")
    @Excel(name = "部门名称", width = 20,orderNum = "3")
    private String deptName;
    @ApiModelProperty("总计督察任务数")
    @Excel(name = "总计督察任务数", width = 20,orderNum = "4")
    private Integer total;
    @ApiModelProperty("合格")
    @Excel(name = "合格", width = 20,orderNum = "5")
    private Integer num1;
    @ApiModelProperty("不合格")
    @Excel(name = "不合格", width = 20,orderNum = "6")
    private Integer num2;
    @ApiModelProperty("合格率")
    @Excel(name = "合格率", width = 20,orderNum = "7")
    private BigDecimal num3;
    @ApiModelProperty("待确认")
    @Excel(name = "待确认", width = 20,orderNum = "8")
    private Integer num4;
    @ApiModelProperty("待整改")
    @Excel(name = "待整改", width = 20,orderNum = "9")
    private Integer num5;
    @ApiModelProperty("整改完成")
    @Excel(name = "整改完成", width = 20,orderNum = "10")
    private Integer num6;
    @ApiModelProperty("整改完成率")
    @Excel(name = "整改完成率", width = 20,orderNum = "11")
    private BigDecimal num7;
}
ruoyi-system/src/main/java/com/ruoyi/system/vo/system/PatrolInspectorVO.java
@@ -1,5 +1,6 @@
package com.ruoyi.system.vo.system;
import cn.afterturn.easypoi.excel.annotation.Excel;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
@@ -12,35 +13,67 @@
public class PatrolInspectorVO {
    @ApiModelProperty("巡检员名称")
    @Excel(name = "巡检员名称", width = 20,orderNum = "1")
    private String nickName;
    @ApiModelProperty("电话")
    @Excel(name = "电话", width = 20,orderNum = "2")
    private String phonenumber;
    @ApiModelProperty("项目名称")
    @Excel(name = "项目名称", width = 20,orderNum = "3")
    private String deptName;
    @ApiModelProperty("总计任务数")
    @Excel(name = "总计任务数", width = 20,orderNum = "4")
    private Integer total;
    @ApiModelProperty("合格")
    @Excel(name = "合格", width = 20,orderNum = "5")
    private Integer num1;
    @ApiModelProperty("不合格")
    @Excel(name = "不合格", width = 20,orderNum = "6")
    private Integer num2;
    @ApiModelProperty("合格率")
    @Excel(name = "合格率", width = 20,orderNum = "7")
    private BigDecimal num3;
    @ApiModelProperty("未执行")
    @Excel(name = "未执行", width = 20,orderNum = "8")
    private Integer num4;
    @ApiModelProperty("待确认")
    @Excel(name = "待确认", width = 20,orderNum = "9")
    private Integer num5;
    @ApiModelProperty("超时")
    @Excel(name = "超时", width = 20,orderNum = "10")
    private Integer num6;
    @ApiModelProperty("待整改")
    @Excel(name = "待整改", width = 20,orderNum = "11")
    private Integer num7;
    @ApiModelProperty("整改完成")
    @Excel(name = "整改完成", width = 20,orderNum = "12")
    private Integer num8;
    @ApiModelProperty("整改完成率")
    @Excel(name = "整改完成率", width = 20,orderNum = "13")
    private BigDecimal num9;
    @ApiModelProperty("完成数")
    @Excel(name = "完成数", width = 20,orderNum = "14")
    private Integer num10;
    @ApiModelProperty("完成率")
    @Excel(name = "完成率", width = 20,orderNum = "15")
    private BigDecimal num11;
    @ApiModelProperty("请假天数")
    @Excel(name = "请假天数", width = 20,orderNum = "16")
    private Integer num12;
}
ruoyi-system/src/main/java/com/ruoyi/system/vo/system/ProgressListVO.java
@@ -37,10 +37,10 @@
    @Excel(name = "已完成任务数", width = 20,orderNum = "9")
    @ApiModelProperty(value = "已完成任务数")
    private Integer num3;
    @Excel(name = "任务进度(%)", width = 20,orderNum = "9")
    @Excel(name = "任务进度(%)", width = 20,orderNum = "10")
    @ApiModelProperty(value = "任务进度(%)")
    private BigDecimal num4;
    @Excel(name = "计划请假天数", width = 20,orderNum = "9")
    @Excel(name = "计划请假天数", width = 20,orderNum = "11")
    @ApiModelProperty(value = "计划请假天数")
    private Long num5;
ruoyi-system/src/main/java/com/ruoyi/system/vo/system/WorkBenchesVO.java
New file
@@ -0,0 +1,50 @@
package com.ruoyi.system.vo.system;
import com.baomidou.mybatisplus.annotation.TableField;
import com.ruoyi.system.model.TAppeal;
import com.ruoyi.system.model.TEarlyWarning;
import com.ruoyi.system.model.TTask;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.math.BigDecimal;
import java.util.List;
import java.util.Map;
@Data
@ApiModel(value = "工作台VO")
public class WorkBenchesVO  {
    @ApiModelProperty("总计员工数量")
    private Integer totalUser;
    @ApiModelProperty("总计清洁员数量")
    private Integer totalCleaner;
    @ApiModelProperty("今日请假员工数量")
    private Integer todayLeaveUser;
    @ApiModelProperty("总计点位数")
    private Integer totalLocation;
    @ApiModelProperty("总计任务数量")
    private Integer totalTask;
    @ApiModelProperty("今日任务数")
    private Integer todayTask;
    @ApiModelProperty("待执行任务数")
    private Integer pendingTask;
    @ApiModelProperty("任务数")
    private Map<String,Integer> taskTotalMap;
    @ApiModelProperty("已完成数")
    private Map<String,Integer> taskFinishMap;
    @ApiModelProperty("合格率")
    private Map<String, BigDecimal> taskPassMap;
    @ApiModelProperty("待审核任务")
    private List<TTask> taskAuditList;
    @ApiModelProperty("保洁质量汇总")
    private Map<String, BigDecimal> cleanerQualityMap;
    @ApiModelProperty("不合格问题分析")
    private Map<String, BigDecimal> taskUnPassMap;
    @ApiModelProperty("今日预警")
    private List<TEarlyWarning> earlyWarningList;
}
ruoyi-system/src/main/resources/mapper/system/TTaskMapper.xml
@@ -170,5 +170,29 @@
        group by t1.user_id,t1.template_id
    </select>
    <select id="taskProgressExport" resultType="com.ruoyi.system.vo.system.ProgressListVO">
        select t1.*,t2.nick_name as nickName,t2.phonenumber,t3.template_name as templateName,count(*) as num2,
        SUM(CASE WHEN t1.status = 5 or t1.status=6 THEN 1 ELSE 0 END) AS num3
        from t_task t1
        left join sys_user t2 on t1.user_id = t2.user_id
        left join t_template t3 on t1.template_id = t3.id
        where 1=1
        and t1.`disabled` = ${@com.ruoyi.common.enums.DisabledEnum@NO.getCode()}
        <if test="query.templateIds != null and query.templateIds.size()>0">
            AND t1.template_id IN
            <foreach collection="query.templateIds" separator="," item="id" open="(" close=")">
                #{id}
            </foreach>
        </if>
        <if test="query.patrolInspectorIds != null and query.patrolInspectorIds.size()>0">
            AND t1.user_id IN
            <foreach collection="query.patrolInspectorIds" separator="," item="id" open="(" close=")">
                #{id}
            </foreach>
        </if>
        group by t1.user_id,t1.template_id
    </select>
</mapper>