无关风月
2025-06-26 69b10ab2a3e171e6f30091ee54d8957cf4987809
保洁巡检本周代码
27个文件已添加
47个文件已修改
2599 ■■■■■ 已修改文件
ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/OssController.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/ReportController.java 531 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/TAppealController.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/TEarlyWarningController.java 133 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/TLeaveController.java 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/TLocationController.java 61 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/TTaskController.java 50 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/TTemplateController.java 50 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysRoleController.java 18 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysUserController.java 30 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/web/controller/task/TaskUtil.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/web/util/AmapApiClient.java 34 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-applet/src/main/java/com/ruoyi/web/controller/api/TIndexController.java 499 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-applet/src/main/java/com/ruoyi/web/controller/api/TUserController.java 23 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-applet/src/main/java/com/ruoyi/web/controller/system/SysLoginController.java 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-applet/src/main/java/com/ruoyi/web/controller/tool/AmapApiClient.java 61 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/src/main/java/com/ruoyi/common/core/domain/model/LoginUserApplet.java 14 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-framework/src/main/java/com/ruoyi/framework/config/SecurityConfig.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/SysLoginService.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/UserDetailsServiceImpl.java 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/applet/dto/DataReportDTO.java 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/applet/dto/IndexDTO.java 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/applet/query/DataReportQuery.java 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/applet/vo/DataReportVO.java 27 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/applet/vo/IndexVO.java 30 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/applet/vo/LeaveUserListVO.java 13 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/applet/vo/TaskFinishListVO.java 28 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/applet/vo/TaskTodayVO.java 31 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/applet/vo/UnqualifiedVO.java 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysRoleMapper.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysUserMapper.java 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/mapper/TEarlyWarningMapper.java 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/mapper/TTaskMapper.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/model/TCleaner.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/model/TInspector.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/model/TLeave.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/model/TTask.java 12 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/model/TTemplate.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/model/TTemplateDetail.java 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/query/CleanerListQuery.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/query/InspectorQuery.java 28 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/query/PatrolInspectorQuery.java 28 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/query/SysUserQuery.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/query/TaskDetailsQuery.java 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/query/TaskProgressQuery.java 28 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/query/TaskWarningQuery.java 33 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/service/ISysRoleService.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/service/ISysUserService.java 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/service/TEarlyWarningService.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/service/TTaskCleanService.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysRoleServiceImpl.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysUserServiceImpl.java 24 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TCleanerServiceImpl.java 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TEarlyWarningServiceImpl.java 68 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TLocationServiceImpl.java 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TTaskCleanServiceImpl.java 47 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/vo/system/DeptNoLimitChildVO.java 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/vo/system/DeptNoLimitParentVO.java 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/vo/system/DeptNoLimitVO.java 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/vo/system/InspectorVO.java 35 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/vo/system/LocationTypeListByProjectVO.java 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/vo/system/PatrolInspectorVO.java 46 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/vo/system/ProgressListVO.java 47 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/vo/system/ProjectDeptDetailsChildVO.java 39 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/vo/system/ProjectDeptDetailsVO.java 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/vo/system/TaskDetailsVO.java 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/vo/system/TaskWarningVO.java 30 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/resources/mapper/system/SysRoleMapper.xml 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/resources/mapper/system/SysUserMapper.xml 29 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/resources/mapper/system/TCleanerMapper.xml 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/resources/mapper/system/TEarlyWarningMapper.xml 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/resources/mapper/system/TLocationMapper.xml 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/resources/mapper/system/TTaskMapper.xml 73 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/resources/mapper/system/TTemplateMapper.xml 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/OssController.java
@@ -36,7 +36,7 @@
 * @author xiaochen
 * @since 2025-05-28
 */
@Api(tags = "任务申诉")
@Api(tags = "文件上传")
@RestController
@RequestMapping("/oss")
public class OssController {
ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/ReportController.java
New file
@@ -0,0 +1,531 @@
package com.ruoyi.web.controller.api;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
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.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.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.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 java.math.BigDecimal;
import java.math.RoundingMode;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
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("/report")
public class ReportController {
    @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 TDictDataService dictDataService;
    @Resource
    private TokenService tokenService;
    @Resource
    private TTemplateService templateService;
    @Resource
    private TTemplateDetailService templateDetailService;
    @Resource
    private TLeaveService leaveService;
    @Resource
    private TInspectorService inspectorService;
    @ApiOperation(value = "任务进度分页列表查询")
    @PostMapping(value = "/taskProgress")
    public R<PageInfo<ProgressListVO>> taskProgress(@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()) {
                return R.ok(new PageInfo<>());
            }
            // 用户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()) {
                return R.ok(new PageInfo<>());
            }
            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()) {
                    return R.ok(new PageInfo<>());
                } 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()) {
                return R.ok(new PageInfo<>());
            }
            if (!query.getPatrolInspectorIds().isEmpty()) {
                // 取交集
                patrolInspectorIds = patrolInspectorIds.stream().filter(query.getPatrolInspectorIds()::contains).collect(Collectors.toList());
            }
            query.setPatrolInspectorIds(patrolInspectorIds);
        }
        PageInfo<ProgressListVO> progressListVOPageInfo = taskCleanerService.taskProgress(query);
        List<ProgressListVO> records = progressListVOPageInfo.getRecords();
        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);
        }
        progressListVOPageInfo.setRecords(records);
        return R.ok(progressListVOPageInfo);
    }
    @ApiOperation(value = "任务报表")
    @PostMapping(value = "/taskDetails")
    public R<List<ProjectDeptDetailsVO>> taskDetails(@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()) {
                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);
            }
        }
        return R.ok(res);
    }
    @ApiOperation(value = "巡检人员报表")
    @PostMapping(value = "/patrolInspectorList")
    public R<List<PatrolInspectorVO>> patrolInspectorList(@RequestBody PatrolInspectorQuery query) {
        List<SysUser> sysUsers = sysUserService.selectAllList();
        LambdaQueryWrapper<TLeave> tLeaveLambdaQueryWrapper = new LambdaQueryWrapper<>();
        if (StringUtils.hasLength(query.getStartTime())){
            tLeaveLambdaQueryWrapper.ge(TLeave::getCreateTime, query.getStartTime());
            tLeaveLambdaQueryWrapper.le(TLeave::getCreateTime, query.getEndTime());
        }
        tLeaveLambdaQueryWrapper.eq(TLeave::getAuditStatus,2);
        List<TLeave> leaves = leaveService.list(tLeaveLambdaQueryWrapper);
        if (StringUtils.hasLength(query.getDeptName())){
            List<String> projectIds = projectDeptService.lambdaQuery().like(TProjectDept::getProjectName, query.getDeptName()).list()
                    .stream().map(TProjectDept::getId).collect(Collectors.toList());
            List<String> deptIds = deptService.lambdaQuery().like(TDept::getDeptName, query.getDeptName()).list()
                    .stream().map(TDept::getId).collect(Collectors.toList());
            projectIds.addAll(deptIds);
            if (projectIds.isEmpty()){
                return R.ok(new ArrayList<>());
            }
            if (StringUtils.hasLength(query.getPhonenumber())){
                List<Long> patrolInspectorIds = sysUsers.stream().filter(sysUser ->
                        sysUser.getPhonenumber().equals(query.getPhonenumber())
                                && projectIds.contains(sysUser.getDeptId())
                ).map(SysUser::getUserId).collect(Collectors.toList());
                if (patrolInspectorIds.isEmpty()){
                    return R.ok(new ArrayList<>());
                }
                query.setPatrolInspectorIds(patrolInspectorIds);
            }
        }
        if (StringUtils.hasLength(query.getPhonenumber())){
            List<Long> patrolInspectorIds = sysUsers.stream().filter(sysUser ->
                    sysUser.getPhonenumber().equals(query.getPhonenumber())
            ).map(SysUser::getUserId).collect(Collectors.toList());
            if (!query.getPatrolInspectorIds().isEmpty()){
                // 取交集
                patrolInspectorIds = patrolInspectorIds.stream().filter(query.getPatrolInspectorIds()::contains).collect(Collectors.toList());
            }
            query.setPatrolInspectorIds(patrolInspectorIds);
            if (patrolInspectorIds.isEmpty()){
                return R.ok(new ArrayList<>());
            }
        }
        List<PatrolInspectorVO> res = new ArrayList<>();
        LambdaQueryWrapper<TTask> tTaskLambdaQueryWrapper = new LambdaQueryWrapper<>();
        if (StringUtils.hasLength(query.getStartTime())){
            tTaskLambdaQueryWrapper.ge(TTask::getCreateTime, query.getStartTime());
            tTaskLambdaQueryWrapper.le(TTask::getCreateTime, query.getEndTime());
        }
        if(query.getPatrolInspectorIds()!=null){
            tTaskLambdaQueryWrapper.in(TTask::getPatrolInspector, query.getPatrolInspectorIds());
            sysUsers = sysUsers.stream().filter(sysUser -> query.getPatrolInspectorIds().contains(sysUser.getUserId())).collect(Collectors.toList());
        }
        List<TTask> tasks = taskCleanerService.list(tTaskLambdaQueryWrapper);
        for (SysUser sysUser : sysUsers) {
            PatrolInspectorVO patrolInspectorVO = new PatrolInspectorVO();
            patrolInspectorVO.setNickName(sysUser.getNickName());
            patrolInspectorVO.setPhonenumber(sysUser.getPhonenumber());
            if (sysUser.getDeptType() == 1){
                TProjectDept tProjectDept = projectDeptService.getById(sysUser.getDeptId());
                if (tProjectDept!=null&&!tProjectDept.getParentId().equals("0")){
                    TProjectDept tProjectDept1 = projectDeptService.getById(tProjectDept.getParentId());
                    if (tProjectDept1!=null)
                    patrolInspectorVO.setDeptName(tProjectDept1.getProjectName()+">"+tProjectDept.getProjectName());
                }else{
                    patrolInspectorVO.setDeptName(tProjectDept.getProjectName());
                }
            }else{
                TDept tDept = deptService.getById(sysUser.getDeptId());
                if (tDept!=null)
                patrolInspectorVO.setDeptName(tDept.getDeptName());
            }
            // 查询巡检员任务ids
            List<String> taskIds = tasks.stream().filter(e->e.getPatrolInspector().equals(sysUser.getUserId()+"")).map(TTask::getId).collect(Collectors.toList());
            List<TTaskDetail> list = taskDetailService.lambdaQuery()
                    .eq(TTaskDetail::getAuditStatus, 1)
                    .isNotNull(TTaskDetail::getClearStatus).orderByDesc(BaseModel::getCreateTime)
                    .in(!taskIds.isEmpty(), TTaskDetail::getTaskId,taskIds).groupBy(TTaskDetail::getTaskId).list();
            // 查询clearStatus为1的数量
            List<TTaskDetail> clearStatus1 = list.stream().filter(e -> e.getClearStatus().equals(1)).collect(Collectors.toList());
            List<TTaskDetail> clearStatus2 = list.stream().filter(e -> e.getClearStatus().equals(2)).collect(Collectors.toList());
            List<TTask> taskList = tasks.stream().filter(e -> e.getPatrolInspector().equals(sysUser.getUserId() + "")).collect(Collectors.toList());
            patrolInspectorVO.setTotal(taskList.size());
            patrolInspectorVO.setNum1(clearStatus1.size());
            patrolInspectorVO.setNum2(clearStatus2.size());
            patrolInspectorVO.setNum3(clearStatus1.size()+clearStatus2.size()!=0?
                    (new BigDecimal(clearStatus1.size()).add(new BigDecimal(clearStatus2.size())))
                            .divide(new BigDecimal(clearStatus1.size()), 2, RoundingMode.HALF_DOWN)
                            .multiply(new BigDecimal(100)):BigDecimal.ZERO);
            // 未执行
            List<TTask> status1 = taskList.stream().filter(e -> e.getStatus() == 1).collect(Collectors.toList());
            List<TTask> status2 = taskList.stream().filter(e -> e.getStatus() == 3).collect(Collectors.toList());
            List<TTask> status3 = taskList.stream().filter(e -> e.getStatus() == 2).collect(Collectors.toList());
            List<TTask> status4 = taskList.stream().filter(e -> e.getStatus() == 4).collect(Collectors.toList());
            List<TTask> status5 = taskList.stream().filter(e -> e.getStatus() == 5).collect(Collectors.toList());
            List<TTask> status6 = taskList.stream().filter(e -> e.getStatus() == 6).collect(Collectors.toList());
            patrolInspectorVO.setNum4(status1.size());
            patrolInspectorVO.setNum5(status2.size());
            patrolInspectorVO.setNum6(status3.size());
            patrolInspectorVO.setNum7(status4.size());
            patrolInspectorVO.setNum8(status5.size());
            patrolInspectorVO.setNum9(!status5.isEmpty()?new BigDecimal(status5.size())
                    .divide(new BigDecimal(status4.size()).add(new BigDecimal(status5.size())),2,RoundingMode.HALF_DOWN)
                    .multiply(new BigDecimal(100)):BigDecimal.ZERO);
            patrolInspectorVO.setNum10(status6.size());
            patrolInspectorVO.setNum11(!status6.isEmpty()?new BigDecimal(status6.size()).divide(new BigDecimal(taskList.size()),2,RoundingMode.HALF_DOWN):BigDecimal.ZERO);
            List<TLeave> collect1 = leaves.stream().filter(e -> e.getLeavePerson().equals(sysUser.getUserId()+"")).collect(Collectors.toList());
            patrolInspectorVO.setNum12(collect1.size());
            res.add(patrolInspectorVO);
        }
        return R.ok(res);
    }
    @ApiOperation(value = "随机督察报表")
    @PostMapping(value = "/inspectorList")
    public R<List<InspectorVO>> inspectorList(@RequestBody InspectorQuery query) {
        List<SysUser> sysUsers = sysUserService.selectAllList();
        if (StringUtils.hasLength(query.getDeptName())){
            List<String> projectIds = projectDeptService.lambdaQuery().like(TProjectDept::getProjectName, query.getDeptName()).list()
                    .stream().map(TProjectDept::getId).collect(Collectors.toList());
            List<String> deptIds = deptService.lambdaQuery().like(TDept::getDeptName, query.getDeptName()).list()
                    .stream().map(TDept::getId).collect(Collectors.toList());
            projectIds.addAll(deptIds);
            if (projectIds.isEmpty()){
                return R.ok(new ArrayList<>());
            }
            if (StringUtils.hasLength(query.getPhonenumber())){
                List<Long> patrolInspectorIds = sysUsers.stream().filter(sysUser ->
                        sysUser.getPhonenumber().equals(query.getPhonenumber())
                                && projectIds.contains(sysUser.getDeptId())
                ).map(SysUser::getUserId).collect(Collectors.toList());
                if (patrolInspectorIds.isEmpty()){
                    return R.ok(new ArrayList<>());
                }
                query.setPatrolInspectorIds(patrolInspectorIds);
            }
        }
        if (StringUtils.hasLength(query.getPhonenumber())){
            List<Long> patrolInspectorIds = sysUsers.stream().filter(sysUser ->
                    sysUser.getPhonenumber().equals(query.getPhonenumber())
            ).map(SysUser::getUserId).collect(Collectors.toList());
            if (!query.getPatrolInspectorIds().isEmpty()){
                // 取交集
                patrolInspectorIds = patrolInspectorIds.stream().filter(query.getPatrolInspectorIds()::contains).collect(Collectors.toList());
            }
            query.setPatrolInspectorIds(patrolInspectorIds);
            if (patrolInspectorIds.isEmpty()){
                return R.ok(new ArrayList<>());
            }
        }
        LambdaQueryWrapper<TInspector> tTaskLambdaQueryWrapper = new LambdaQueryWrapper<>();
        tTaskLambdaQueryWrapper.eq(TInspector::getAuditStatus,1);
        tTaskLambdaQueryWrapper.isNotNull(TInspector::getClearStatus);
        if (StringUtils.hasLength(query.getStartTime())){
            tTaskLambdaQueryWrapper.ge(TInspector::getCreateTime, query.getStartTime());
            tTaskLambdaQueryWrapper.le(TInspector::getCreateTime, query.getEndTime());
        }
        if(query.getPatrolInspectorIds()!=null){
            tTaskLambdaQueryWrapper.in(TInspector::getCommitPerson, query.getPatrolInspectorIds());
            sysUsers = sysUsers.stream().filter(sysUser -> query.getPatrolInspectorIds().contains(sysUser.getUserId())).collect(Collectors.toList());
        }
        List<InspectorVO> res = new ArrayList<>();
        List<TInspector> inspectors = inspectorService.list(tTaskLambdaQueryWrapper);
        for (SysUser sysUser : sysUsers) {
            InspectorVO inspectorVO = new InspectorVO();
            inspectorVO.setNickName(sysUser.getNickName());
            inspectorVO.setPhonenumber(sysUser.getPhonenumber());
            if (sysUser.getDeptType() == 1){
                TProjectDept tProjectDept = projectDeptService.getById(sysUser.getDeptId());
                if (tProjectDept!=null&&!tProjectDept.getParentId().equals("0")){
                    TProjectDept tProjectDept1 = projectDeptService.getById(tProjectDept.getParentId());
                    if (tProjectDept1!=null)
                        inspectorVO.setDeptName(tProjectDept1.getProjectName()+">"+tProjectDept.getProjectName());
                }else{
                    inspectorVO.setDeptName(tProjectDept.getProjectName());
                }
            }else{
                TDept tDept = deptService.getById(sysUser.getDeptId());
                if (tDept!=null)
                    inspectorVO.setDeptName(tDept.getDeptName());
            }
            inspectorVO.setTotal(inspectors.size());
            List<TInspector> status1 = inspectors.stream().filter(e -> e.getClearStatus() == 1).collect(Collectors.toList());
            List<TInspector> status2 = inspectors.stream().filter(e -> e.getClearStatus() == 2).collect(Collectors.toList());
            List<TInspector> status4 = inspectors.stream().filter(e -> e.getStatus() == 1).collect(Collectors.toList());
            List<TInspector> status5 = inspectors.stream().filter(e -> e.getStatus() == 2).collect(Collectors.toList());
            List<TInspector> status6 = inspectors.stream().filter(e -> e.getStatus() == 3).collect(Collectors.toList());
            inspectorVO.setNum1(status1.size());
            inspectorVO.setNum2(status2.size());
            inspectorVO.setNum3(!status1.isEmpty()?new BigDecimal(status1.size()).divide(new BigDecimal(status2.size()+status1.size()),2,RoundingMode.HALF_DOWN).multiply(new BigDecimal(100)):BigDecimal.ZERO);
            inspectorVO.setNum4(status4.size());
            inspectorVO.setNum5(status5.size());
            inspectorVO.setNum6(status6.size());
            inspectorVO.setNum7(!status6.isEmpty()?new BigDecimal(status6.size()).divide(new BigDecimal(status5.size()+status6.size()),2,RoundingMode.HALF_DOWN).multiply(new BigDecimal(100)):new BigDecimal(0));
            res.add(inspectorVO);
        }
        return R.ok(res);
    }
}
ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/TAppealController.java
@@ -48,11 +48,12 @@
    private TLocationTypeService locationTypeService;
    @Resource
    private TLocationService locationService;
    @Resource
    private TProjectDeptService projectDeptService;
    @Resource
    private TTaskDetailService tTaskDetailService;
    @Resource
    private TProjectDeptService projectDeptService;
    @Resource
    private TDeptService deptService;
    @Resource
    private ISysUserService sysUserService;
ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/TEarlyWarningController.java
@@ -1,9 +1,27 @@
package com.ruoyi.web.controller.api;
import com.ruoyi.common.annotation.Log;
import com.ruoyi.common.basic.PageInfo;
import com.ruoyi.common.core.domain.R;
import com.ruoyi.common.core.domain.entity.SysUser;
import com.ruoyi.common.enums.BusinessType;
import com.ruoyi.framework.web.service.TokenService;
import com.ruoyi.system.model.*;
import com.ruoyi.system.query.TaskListQuery;
import com.ruoyi.system.query.TaskWarningQuery;
import com.ruoyi.system.service.*;
import com.ruoyi.system.vo.system.TaskListVO;
import com.ruoyi.system.vo.system.TaskWarningVO;
import io.swagger.annotations.Api;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import io.swagger.annotations.ApiOperation;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
/**
 * <p>
@@ -17,6 +35,117 @@
@RestController
@RequestMapping("/t-early-warning")
public class TEarlyWarningController {
    @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 TDictDataService dictDataService;
    @Resource
    private TokenService tokenService;
    @Resource
    private TEarlyWarningService earlyWarningService;
    @ApiOperation(value = "任务预警分页列表")
    @PostMapping(value = "/pageList")
    public R<PageInfo<TaskWarningVO>> pageList(@RequestBody TaskWarningQuery query) {
        List<SysUser> sysUsers = sysUserService.selectAllList();
        List<TLocation> locationList = locationService.list();
        List<TTask> taskList = taskCleanerService.list();
        if (StringUtils.hasLength(query.getDeptName())){
            List<String> projectIds = projectDeptService.lambdaQuery().like(TProjectDept::getProjectName, query.getDeptName()).list()
                    .stream().map(TProjectDept::getId).collect(Collectors.toList());
            List<String> deptIds = deptService.lambdaQuery().like(TDept::getDeptName, query.getDeptName()).list()
                    .stream().map(TDept::getId).collect(Collectors.toList());
            projectIds.addAll(deptIds);
            if (projectIds.isEmpty()){
                return R.ok(new PageInfo<>());
            }
            if (StringUtils.hasLength(query.getPhonenumber())){
                List<Long> patrolInspectorIds = sysUsers.stream().filter(sysUser ->
                        sysUser.getPhonenumber().equals(query.getPhonenumber())
                                && projectIds.contains(sysUser.getDeptId())
                ).map(SysUser::getUserId).collect(Collectors.toList());
                if (patrolInspectorIds.isEmpty()){
                    return R.ok(new PageInfo<>());
                }
                query.setPatrolInspectorIds(patrolInspectorIds);
            }
        }
        if (StringUtils.hasLength(query.getPhonenumber())){
            List<Long> patrolInspectorIds = sysUsers.stream().filter(sysUser ->
                    sysUser.getPhonenumber().equals(query.getPhonenumber())
            ).map(SysUser::getUserId).collect(Collectors.toList());
            if (!query.getPatrolInspectorIds().isEmpty()){
                // 取交集
                patrolInspectorIds = patrolInspectorIds.stream().filter(query.getPatrolInspectorIds()::contains).collect(Collectors.toList());
            }
            query.setPatrolInspectorIds(patrolInspectorIds);
            if (patrolInspectorIds.isEmpty()){
                return R.ok(new PageInfo<>());
            }
        }
        if (StringUtils.hasLength(query.getLocationType())){
            List<String> collect = locationList.stream().filter(
                    e -> e.getLocationType().equals(query.getLocationType())
                    ).map(TLocation::getId)
                    .collect(Collectors.toList());
            if (collect.isEmpty()){
                return R.ok(new PageInfo<>());
            }
            query.setLocationIds(collect);
        }
        if (StringUtils.hasLength(query.getLocationName())){
            List<String> collect = locationList.stream().filter(e -> e.getLocationName().contains(query.getLocationName())).map(TLocation::getId)
                    .collect(Collectors.toList());
            if (collect.isEmpty()){
                query.setLocationIds(collect);
                return R.ok(new PageInfo<>());
            }else{
                collect = collect.stream().filter(query.getLocationIds()::contains).collect(Collectors.toList());
                if (collect.isEmpty()){
                    return R.ok(new PageInfo<>());
                }
                query.setLocationIds(collect);
            }
        }
        if (query.getPatrolInspectorIds()!=null && !query.getPatrolInspectorIds().isEmpty()){
            taskList = taskList.stream().filter(task -> query.getPatrolInspectorIds().contains(Long.valueOf(task.getPatrolInspector()))).collect(Collectors.toList());
            if (taskList.isEmpty()){
                return R.ok(new PageInfo<>());
            }
        }
        if (query.getLocationIds()!=null && !query.getLocationIds().isEmpty()){
            taskList = taskList.stream().filter(task -> query.getLocationIds().contains(task.getLocationId())).collect(Collectors.toList());
            if (taskList.isEmpty()){
                return R.ok(new PageInfo<>());
            }
        }
        query.setTaskIds(taskList.stream().map(TTask::getId).collect(Collectors.toList()));
        return R.ok(earlyWarningService.pageList(query));
    }
    @Log(title = "预警删除", businessType = BusinessType.DELETE)
    @ApiOperation(value = "预警删除")
    @DeleteMapping(value = "/delete")
    public R<Boolean> edit(@RequestParam String id) {
        earlyWarningService.removeById(id);
        return R.ok();
    }
}
ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/TLeaveController.java
@@ -58,15 +58,22 @@
            leaveDetailVO.setPhone(sysUser.getPhonenumber());
            if (sysUser.getDeptType() == 1){
                TProjectDept tProjectDept = projectDeptService.getById(sysUser.getDeptId());
                if (!tProjectDept.getParentId().equals("0")){
                    TProjectDept tProjectDept1 = projectDeptService.getById(tProjectDept.getParentId());
                    leaveDetailVO.setDeptName(tProjectDept1.getProjectName()+">"+tProjectDept.getProjectName());
                }else{
                    leaveDetailVO.setDeptName(tProjectDept.getProjectName());
                if(tProjectDept!=null){
                    if (!tProjectDept.getParentId().equals("0")){
                        TProjectDept tProjectDept1 = projectDeptService.getById(tProjectDept.getParentId());
                        if (tProjectDept1!=null){
                            leaveDetailVO.setDeptName(tProjectDept1.getProjectName()+">"+tProjectDept.getProjectName());
                        }
                    }else{
                        leaveDetailVO.setDeptName(tProjectDept.getProjectName());
                    }
                }
            }else{
                TDept tDept = deptService.getById(sysUser.getDeptId());
                leaveDetailVO.setDeptName(tDept.getDeptName());
                if (tDept!=null){
                    leaveDetailVO.setDeptName(tDept.getDeptName());
                }
            }
        }
        List<TLeaveAudit> list = leaveAuditService.lambdaQuery().eq(TLeaveAudit::getLeaveId, id)
ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/TLocationController.java
@@ -20,8 +20,8 @@
import com.ruoyi.system.query.LocationListTaskQuery;
import com.ruoyi.system.service.*;
import com.ruoyi.system.utils.CustomerImportFailedData;
import com.ruoyi.system.vo.system.LocationListTaskVO;
import com.ruoyi.system.vo.system.LocationListVO;
import com.ruoyi.system.vo.system.*;
import com.sun.org.apache.bcel.internal.generic.NEW;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiOperation;
@@ -182,6 +182,63 @@
    public R<List<TCleaner>> listCleaner(@RequestParam String id) {
        return R.ok(cleanerService.lambdaQuery().eq(TCleaner::getProjectId,id).list());
    }
    @ApiOperation(value = "根据保洁员id查询点位列表 不分页")
    @GetMapping(value = "/listLocation")
    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() {
        List<TProjectDept> parent = projectDeptService.lambdaQuery().eq(TProjectDept::getParentId, "0").list();
        List<TProjectDept> child = projectDeptService.lambdaQuery().ne(TProjectDept::getParentId, "0").list();
        List<TDept> depts = deptService.list();
        List<DeptNoLimitVO> res = new ArrayList<>();
        DeptNoLimitVO deptNoLimitVO1 = new DeptNoLimitVO();
        deptNoLimitVO1.setDeptName("项目部");
        DeptNoLimitVO deptNoLimitVO2 = new DeptNoLimitVO();
        deptNoLimitVO2.setDeptName("公司");
        res.add(deptNoLimitVO1);
        res.add(deptNoLimitVO2);
        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);
            }else {
                List<DeptNoLimitParentVO> deptNoLimitVOS = new ArrayList<>();
                for (TDept tDept : depts) {
                    DeptNoLimitParentVO deptNoLimitVO = new DeptNoLimitParentVO();
                    deptNoLimitVO.setDeptName(tDept.getDeptName());
                    deptNoLimitVO.setDeptId(tDept.getId());
                    deptNoLimitVOS.add(deptNoLimitVO);
                }
                re.setDeptChild(deptNoLimitVOS);
            }
        }
        return R.ok(res);
    }
    @ApiOperation(value = "根据部门/项目部id查询巡检员列表 不分页")
    @GetMapping(value = "/listUsers")
    public R<List<SysUser>> listUsers(@RequestParam String id) {
            List<SysUser> res = sysUserService.selectUserByDeptId(id);
        return R.ok(res);
    }
    @Log(title = "新增点位", businessType = BusinessType.INSERT)
    @ApiOperation(value = "新增点位")
    @PostMapping(value = "/add")
ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/TTaskController.java
@@ -38,6 +38,7 @@
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
import javax.validation.Valid;
import java.time.format.DateTimeFormatter;
import java.util.*;
import java.util.stream.Collectors;
@@ -77,6 +78,8 @@
    private TDictDataService dictDataService;
    @Resource
    private TokenService tokenService;
    @Resource
    private TCleanerService cleanerService;
    @ApiOperation(value = "任务记录分页列表")
    @PostMapping(value = "/pageList")
@@ -94,7 +97,7 @@
            }
            if (StringUtils.hasLength(query.getPhonenumber())){
                List<Long> patrolInspectorIds = sysUsers.stream().filter(sysUser ->
                        sysUser.getPhonenumber().equals(query.getPhonenumber())
                        sysUser.getPhonenumber().contains(query.getPhonenumber())
                                && projectIds.contains(sysUser.getDeptId())
                ).map(SysUser::getUserId).collect(Collectors.toList());
                if (patrolInspectorIds.isEmpty()){
@@ -105,8 +108,9 @@
        }
        if (StringUtils.hasLength(query.getPhonenumber())){
            List<Long> patrolInspectorIds = sysUsers.stream().filter(sysUser ->
                    sysUser.getPhonenumber().equals(query.getPhonenumber())
                    sysUser.getPhonenumber().contains(query.getPhonenumber())
            ).map(SysUser::getUserId).collect(Collectors.toList());
            query.setPatrolInspectorIds(patrolInspectorIds);
            if (!query.getPatrolInspectorIds().isEmpty()){
                // 取交集
                patrolInspectorIds = patrolInspectorIds.stream().filter(query.getPatrolInspectorIds()::contains).collect(Collectors.toList());
@@ -124,7 +128,7 @@
                return R.ok(new PageInfo<>());
            }
        }
        if (query.getLocationType()!=null){
        if (StringUtils.hasLength(query.getLocationType())){
            List<String> collect = locationList.stream().filter(e -> e.getLocationType().equals(query.getLocationType())).map(TLocation::getId)
                    .collect(Collectors.toList());
            if (collect.isEmpty()){
@@ -135,8 +139,8 @@
        if (StringUtils.hasLength(query.getLocationName())){
            List<String> collect = locationList.stream().filter(e -> e.getLocationName().contains(query.getLocationName())).map(TLocation::getId)
                    .collect(Collectors.toList());
            query.setLocationIds(collect);
            if (collect.isEmpty()){
                query.setLocationIds(collect);
                return R.ok(new PageInfo<>());
            }else{
                collect = collect.stream().filter(query.getLocationIds()::contains).collect(Collectors.toList());
@@ -153,6 +157,12 @@
    @ApiOperation(value = "新增任务")
    @PostMapping(value = "/add")
    public R<Boolean> add(@RequestBody TTaskDTO dto) {
        dto.setTaskType(2);
        String implementTime1 = dto.getImplementTime1();
        // 转化为LocalDateTime类型
        dto.setImplementTime(LocalDateTime.parse(implementTime1, DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
        TCleaner byId = cleanerService.getById(dto.getCleanerId());
        dto.setProjectId(byId.getProjectId());
        taskCleanerService.save(dto);
        return R.ok();
    }
@@ -240,6 +250,38 @@
        taskDetailVO.setRecords(list);
        return R.ok(taskDetailVO);
    }
    @ApiOperation(value = "详情任务-根据任务编号")
    @GetMapping(value = "/detailByTaskCode")
    public R<TaskDetailVO> detailByTaskCode(@RequestParam String taskCode) {
        TTask task = taskCleanerService.lambdaQuery().eq(TTask::getTaskCode, taskCode)
                .last("limit 1").one();
        TaskDetailVO taskDetailVO = new TaskDetailVO();
        if (task!=null){
            String id = task.getId();
            List<TTaskDetail> list = taskDetailService.lambdaQuery().eq(TTaskDetail::getTaskId, id)
                    .orderByDesc(BaseModel::getCreateTime).list();
            TTask byId = taskCleanerService.getById(id);
            BeanUtils.copyProperties(byId, taskDetailVO);
            TLocation byId1 = locationService.getById(byId.getLocationId());
            TLocationType byId2 = locationTypeService.getById(byId1.getLocationType());
            taskDetailVO.setLocationAddress(byId1.getLocationAddress());
            taskDetailVO.setLocationIcon(byId2.getLocationIcon());
            taskDetailVO.setLocationName(byId2.getLocationName());
            TTaskDetail tTaskDetail = list.stream().filter(e -> e.getHandleType() == 1).findFirst().orElse(null);
            if (tTaskDetail!=null &&  tTaskDetail.getUnqualified()!=null){
                TDictData byId3 = dictDataService.getById(tTaskDetail.getUnqualified());
                if (byId3!=null){
                    tTaskDetail.setUnqualifiedName(byId3.getDataContent());
                }
            }
            taskDetailVO.setTaskDetail(tTaskDetail);
            taskDetailVO.setRecords(list);
        }else{
            return R.fail("任务不存在");
        }
        return R.ok(taskDetailVO);
    }
    @ApiOperation(value = "详情任务-操作记录-详情")
    @GetMapping(value = "/detailRecord")
    public R<TaskRecordDetailVO> detailRecord(@RequestParam String id) {
ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/TTemplateController.java
@@ -103,6 +103,10 @@
        templateService.updateById(dto);
        templateDetailService.remove(new LambdaQueryWrapper<TTemplateDetail>()
                .eq(TTemplateDetail::getTemplateId,  dto.getId()));
        for (TTemplateDetail tTemplateDetail : dto.getList()) {
            tTemplateDetail.setTemplateId(dto.getId());
            tTemplateDetail.setId(null);
        }
        templateDetailService.saveBatch(dto.getList());
        // 先删除定时任务
@@ -140,29 +144,43 @@
                .list();
        BeanUtils.copyProperties(byId,templateDetailVO);
        List<String> collect = tLocationTypeService.list().stream().map(TLocationType::getId).collect(Collectors.toList());
        JSONArray res = new JSONArray();
        for (String s : collect) {
            JSONObject jsonObject = new JSONObject();
            jsonObject.put("id",s);
            jsonObject.put("value","");
            res.add(jsonObject);
        }
        for (TTemplateDetail tTemplateDetail : list) {
            JSONArray res = new JSONArray();
            for (String s : collect) {
                JSONObject jsonObject = new JSONObject();
                jsonObject.put("id",s);
                jsonObject.put("value","");
                res.add(jsonObject);
            }
            JSONArray temp = new JSONArray();
            String num4 = tTemplateDetail.getNum4();
            JSONArray num5Array = JSONArray.parseArray(num4);
            for (Object o : num5Array) {
                JSONObject jsonObject1 = (JSONObject) o;
                String string = jsonObject1.getString("id");
                // 如果res中有这个id,则设置num
                for (Object re : res) {
                    JSONObject jsonObject2 = (JSONObject) re;
            for (Object re : res) {
                JSONObject jsonObject2 = (JSONObject) re;
                int i = 0;
                for (Object o : num5Array) {
                    JSONObject jsonObject1 = (JSONObject) o;
                    String string = jsonObject1.getString("id");
                    // 如果res中有这个id,则设置num
                    if (jsonObject2.getString("id").equals(string)) {
                        jsonObject2.put("num", jsonObject1.getString("num"));
                        JSONObject jsonObject = new JSONObject();
                        jsonObject.put("id",string);
                        jsonObject.put("value", jsonObject1.getString("value"));
                        temp.add(jsonObject);
                        break;
                    }
                    i++;
                    if (i==num5Array.size()){
                        JSONObject jsonObject = new JSONObject();
                        jsonObject.put("id",string);
                        jsonObject.put("value", "");
                        temp.add(jsonObject);
                    }
                }
            }
            tTemplateDetail.setNum4(res.toJSONString());
            tTemplateDetail.setNum4(temp.toJSONString());
        }
        if (byId.getRoleId()!=null){
            SysRole sysRole = sysRoleService.selectRoleById(byId.getRoleId());
ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysRoleController.java
@@ -9,8 +9,9 @@
import com.ruoyi.common.basic.PageInfo;
import com.ruoyi.common.core.domain.entity.SysMenu;
import com.ruoyi.system.dto.SysRoleDTO;
import com.ruoyi.system.model.TTemplate;
import com.ruoyi.system.query.SysRoleQuery;
import com.ruoyi.system.service.ISysMenuService;
import com.ruoyi.system.service.*;
import com.ruoyi.system.vo.system.RoleInfoVO;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
@@ -31,9 +32,6 @@
import com.ruoyi.framework.web.service.SysPermissionService;
import com.ruoyi.framework.web.service.TokenService;
import com.ruoyi.system.domain.SysUserRole;
import com.ruoyi.system.service.ISysDeptService;
import com.ruoyi.system.service.ISysRoleService;
import com.ruoyi.system.service.ISysUserService;
/**
 * 角色信息
@@ -61,6 +59,8 @@
    private ISysDeptService deptService;
    @Autowired
    private ISysMenuService menuService;
    @Autowired
    private TTemplateService templateService;
    @PreAuthorize("@ss.hasPermi('system:role')")
    @ApiOperation(value = "角色列表")
@@ -79,6 +79,16 @@
        List<SysRole> list = roleService.selectRoleList(new SysRole());
        return AjaxResult.success(list);
    }
    @ApiOperation(value = "角色列表不分页根据模板id")
    @GetMapping("/listNotPageByTemplateId")
    public AjaxResult listNotPageByTemplateId(@RequestParam String templateId)
    {
        TTemplate byId = templateService.getById(templateId);
        SysRole sysRole = roleService.selectRoleById(byId.getRoleId());
        List<SysRole> sysRoles = new ArrayList<>();
        sysRoles.add(sysRole);
        return AjaxResult.success(sysRoles);
    }
    @PreAuthorize("@ss.hasPermi('system:role:count')")
    @ApiOperation(value = "角色数量统计")
    @PostMapping("/roleCount")
ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysUserController.java
@@ -4,6 +4,7 @@
import com.ruoyi.common.basic.PageInfo;
import com.ruoyi.common.core.controller.BaseController;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.core.domain.R;
import com.ruoyi.common.core.domain.entity.SysDept;
import com.ruoyi.common.core.domain.entity.SysRole;
import com.ruoyi.common.core.domain.entity.SysUser;
@@ -12,6 +13,8 @@
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.framework.web.service.TokenService;
import com.ruoyi.system.dto.SysUserUpdateStatusDTO;
import com.ruoyi.system.model.TDept;
import com.ruoyi.system.model.TProjectDept;
import com.ruoyi.system.query.SysUserQuery;
import com.ruoyi.system.service.*;
import com.ruoyi.system.vo.system.SysUserVO;
@@ -23,6 +26,7 @@
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import java.time.LocalDateTime;
import java.util.*;
import java.util.stream.Collectors;
@@ -47,15 +51,37 @@
    private ISysDeptService deptService;
    @Autowired
    private TokenService tokenService;
    @Resource
    private TProjectDeptService projectDeptService;
    @Resource
    private TDeptService tdeptService;
    /**
     * 获取用户列表
     */
    @ApiOperation(value = "获取用户列表")
    @PostMapping("/list")
    @PreAuthorize("@ss.hasPermi('system:user')")
    public AjaxResult list(@RequestBody SysUserQuery query)
    public AjaxResult<PageInfo<SysUserVO>> list(@RequestBody SysUserQuery query)
    {
        List<SysUser> sysUsers = userService.selectAllList();
        if (org.springframework.util.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 = tdeptService.lambdaQuery().like(TDept::getDeptName, query.getDeptName()).list()
                    .stream().map(TDept::getId).collect(Collectors.toList());
            projectIds.addAll(deptIds);
            if (projectIds.isEmpty()){
                return AjaxResult.success(new PageInfo<>());
            }
                List<Long> patrolInspectorIds = sysUsers.stream().filter(sysUser ->
                         projectIds.contains(sysUser.getDeptId())
                ).map(SysUser::getUserId).collect(Collectors.toList());
                if (patrolInspectorIds.isEmpty()){
                    return AjaxResult.success(new PageInfo<>());
                }
                query.setPatrolInspectorIds(patrolInspectorIds);
        }
        PageInfo<SysUserVO> list = userService.pageList(query);
        return AjaxResult.success(list);
    }
ruoyi-admin/src/main/java/com/ruoyi/web/controller/task/TaskUtil.java
@@ -258,9 +258,12 @@
                task.setLocationId(tLocation.getId());
                task.setImplementTime(LocalDateTime.now().plusDays(1));
                task.setTaskType(1);
                task.setTemplateId(detail.getId());
                tasks.add(task);
            }
            taskCleanService.saveBatch(tasks);
            template.setTaskCount(tasks.size());
            templateService.updateById(template);
            templateDetailService.updateById(detail);
        });
ruoyi-admin/src/main/java/com/ruoyi/web/util/AmapApiClient.java
@@ -1,11 +1,18 @@
package com.ruoyi.web.util;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;
import org.springframework.stereotype.Component;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
@Component
public class AmapApiClient {
    private static final String KEY = "e700a58329a38b2d8980790d9b1b5b06";
    private static final OkHttpClient client = new OkHttpClient();
@@ -24,4 +31,31 @@
            return response.body().string();
        }
    }
    public static Map<String, String> getDistance(String origins, String destination, Integer type) throws IOException {
        String url = "https://restapi.amap.com/v3/distance?key=" + KEY + "&origins=" + origins + "&destination=" + destination +
                "&type=" + type;
        Request request = new Request.Builder()
                .url(url)
                .build();
        try (Response response = client.newCall(request).execute()) {
            JSONObject jsonObject = JSON.parseObject(response.body().string());
            String status = jsonObject.getString("status");
//        gdInterfaceService.saveData("https://restapi.amap.com/v3/distance", "查询两点间的距离");
            if(status.equals("1")){
                JSONArray results = jsonObject.getJSONArray("results");
                JSONObject jsonObject1 = results.getJSONObject(0);
                Map<String, String> map = new HashMap<>();
                map.put("distance", jsonObject1.getString("distance"));//距离(米)
                map.put("duration", jsonObject1.getString("duration"));//预计时间(秒)
                return map;
            }else{
                System.err.println(jsonObject);
            }
        }
        return null;
    }
}
ruoyi-applet/src/main/java/com/ruoyi/web/controller/api/TIndexController.java
New file
@@ -0,0 +1,499 @@
package com.ruoyi.web.controller.api;
import cn.hutool.core.util.RandomUtil;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
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.SysRole;
import com.ruoyi.common.core.domain.entity.SysUser;
import com.ruoyi.common.enums.BusinessType;
import com.ruoyi.common.utils.bean.BeanUtils;
import com.ruoyi.framework.web.service.TokenService;
import com.ruoyi.system.applet.dto.*;
import com.ruoyi.system.applet.query.*;
import com.ruoyi.system.applet.vo.*;
import com.ruoyi.system.model.*;
import com.ruoyi.system.service.*;
import com.ruoyi.system.vo.system.*;
import com.ruoyi.web.controller.tool.AmapApiClient;
import com.sun.org.apache.bcel.internal.generic.IF_ACMPEQ;
import com.sun.org.apache.bcel.internal.generic.NEW;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import java.io.IOException;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.text.SimpleDateFormat;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.util.*;
import java.util.stream.Collectors;
/**
 * <p>
 * 任务记录 前端控制器
 * </p>
 *
 * @author xiaochen
 * @since 2025-05-28
 */
@Api(tags = "首页")
@RestController
@RequestMapping("/t-index")
public class TIndexController {
    @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;
    @Autowired
    private AmapApiClient amapApiClient;
    @Resource
    private TSystemBulletinService systemBulletinService;
    @ApiOperation(value = "首页-系统公告")
    @PostMapping(value = "/systemBulletin")
    public R<TSystemBulletin> systemBulletin() {
        TSystemBulletin systemBulletin = systemBulletinService.lambdaQuery().eq(TSystemBulletin::getStatus, 1).last("limit 1").one();
        return R.ok(systemBulletin);
    }
    @ApiOperation(value = "首页-数据概览-更多")
    @PostMapping(value = "/dataReport")
    public R<DataReportVO> dataReport(@RequestBody DataReportDTO dto) {
        DataReportQuery dataReportQuery = new DataReportQuery();
        dataReportQuery.setStartTime(dto.getStartTime());
        dataReportQuery.setEndTime(dto.getEndTime());
        DataReportVO res = new DataReportVO();
        List<TDictData> dataList = dictDataService.list();
        List<TProjectDept> projectDepts = projectDeptService.list();
        List<TTaskDetail> taskDetails = taskDetailService.lambdaQuery()
                .isNotNull(TTaskDetail::getClearStatus)
                .eq(TTaskDetail::getAuditStatus,1)
                .groupBy(TTaskDetail::getTaskId)
                .orderByDesc(BaseModel::getCreateTime)
                .list();
        List<String> userDeptIds = new ArrayList<>();
        LambdaQueryWrapper<TTask> tTaskLambdaQueryWrapper = new LambdaQueryWrapper<>();
        if (StringUtils.hasLength(dto.getProjectId())) {
            TProjectDept projectDept = projectDeptService.getById(dto.getProjectId());
            if (!projectDept.getParentId().equals("0")) {
                tTaskLambdaQueryWrapper.eq(TTask::getProjectId, projectDept.getId());
                userDeptIds.add(projectDept.getId());
            } else {
                List<TProjectDept> list = projectDeptService.lambdaQuery().eq(TProjectDept::getParentId, projectDept.getId()).list();
                List<String> deptIds = list.stream().map(TProjectDept::getId).collect(Collectors.toList());
                if (!deptIds.isEmpty()) {
                    userDeptIds.addAll(deptIds);
                    tTaskLambdaQueryWrapper.in(TTask::getProjectId, deptIds);
                } else {
                    tTaskLambdaQueryWrapper.eq(TTask::getProjectId, "-1");
                    userDeptIds.add("-1");
                }
            }
        } else {
            // 根据当前登录人查询部门
            Long userId = tokenService.getLoginUser().getUserId();
            SysUser sysUser = sysUserService.selectUserById(userId);
            if (sysUser.getDeptType() == 1) {
                TProjectDept projectDept = projectDeptService.getById(sysUser.getDeptId());
                if (projectDept != null) {
                    if (!"0".equals(projectDept.getParentId())) {
                        tTaskLambdaQueryWrapper.eq(TTask::getProjectId, projectDept.getId());
                        userDeptIds.add(projectDept.getId());
                    } else {
                        TProjectDept parent = projectDeptService.getById(projectDept.getParentId());
                        List<TProjectDept> list = projectDeptService.lambdaQuery().eq(TProjectDept::getParentId, parent.getId()).list();
                        List<String> deptIds = list.stream().map(TProjectDept::getId).collect(Collectors.toList());
                        if (!deptIds.isEmpty()) {
                            tTaskLambdaQueryWrapper.in(TTask::getProjectId, deptIds);
                            userDeptIds.addAll(deptIds);
                        } else {
                            tTaskLambdaQueryWrapper.eq(TTask::getProjectId, "-1");
                            userDeptIds.add("-1");
                        }
                    }
                }
            }
        }
        dataReportQuery.setProjectIds(userDeptIds);
        if (StringUtils.hasLength(dto.getStartTime())) {
            tTaskLambdaQueryWrapper.ge(TTask::getImplementTime, dto.getStartTime());
            tTaskLambdaQueryWrapper.le(TTask::getImplementTime, dto.getEndTime());
        } else {
            // 获取今天凌晨00:00:00 和今天23:59:59 类型为LocalDateTime
            LocalDateTime startOfToday = LocalDateTime.of(LocalDate.now(), LocalTime.MIN);
            LocalDateTime endOfToday = LocalDateTime.of(LocalDate.now(), LocalTime.MAX);
            tTaskLambdaQueryWrapper.ge(TTask::getImplementTime, startOfToday);
            tTaskLambdaQueryWrapper.le(TTask::getImplementTime, endOfToday);
        }
        tTaskLambdaQueryWrapper.ne(TTask::getStatus, 1);
        List<TTask> tasks = taskCleanerService.list(tTaskLambdaQueryWrapper);
        HashMap<String, Integer> taskMap = new HashMap<>();
        HashMap<String, Integer> statusMap = new HashMap<>();
        HashMap<String, Integer> clearMap = new HashMap<>();
        HashMap<String, Integer> unqualifiedMap = new HashMap<>();
        for (TTask task : tasks) {
            TProjectDept tProjectDept = projectDepts.stream().filter(e -> e.getId().equals(task.getProjectId())).findFirst().orElse(null);
            if (tProjectDept == null) continue;
            taskMap.put(tProjectDept.getProjectName(), taskMap.getOrDefault(tProjectDept.getProjectName(), 0) + 1);
            StringBuilder temp = new StringBuilder();
            switch (task.getStatus()) {
                case 1:
                    temp.append("未执行");
                    break;
                case 2:
                    temp.append("超时");
                    break;
                case 3:
                    temp.append("待确认");
                    break;
                case 4:
                    temp.append("已驳回");
                    break;
                case 5:
                    temp.append("已完成");
                    break;
                case 6:
                    temp.append("已完成");
                    break;
            }
            statusMap.put(temp.toString(), statusMap.getOrDefault(task.getStatus()+"", 0) + 1);
            TTaskDetail tTaskDetail = taskDetails.stream().filter(e -> e.getTaskId().equals(task.getId())).findFirst().orElse(null);
            StringBuilder temp1 = new StringBuilder();
            if (tTaskDetail!=null){
                switch (tTaskDetail.getClearStatus()) {
                    case 1:
                        temp1.append("合格");
                        break;
                    case 2:
                        temp1.append("不合格");
                        TDictData tDictData = dataList.stream().filter(e -> e.getId().equals(tTaskDetail.getUnqualified())).findFirst().orElse(null);
                        if (tDictData != null){
                            unqualifiedMap.put(tTaskDetail.getUnqualifiedName(), unqualifiedMap.getOrDefault(tDictData.getDataContent(), 0) + 1);
                        }
                        break;
                }
                clearMap.put(temp1.toString(), clearMap.getOrDefault(temp1.toString(), 0) + 1);
            }
        }
        PageInfo<TaskFinishListVO> taskFinishListVOPageInfo = sysUserService.pageListReport(dataReportQuery);
        for (TaskFinishListVO record : taskFinishListVOPageInfo.getRecords()) {
            int pass=0;
            int unPass=0;
            List<TTask> userTaskList = tasks.stream().filter(e -> e.getPatrolInspector().equals(record.getUserId() + "")).collect(Collectors.toList());
            for (TTask tTask : userTaskList) {
                TTaskDetail tTaskDetail = taskDetails.stream().filter(e -> e.getTaskId().equals(tTask.getId())).findFirst().orElse(null);
                if (tTaskDetail!=null){
                    switch (tTaskDetail.getClearStatus()){
                        case 1:
                            pass++;
                            break;
                            case 2:
                            unPass++;
                            break;
                    }
                }
            }
            record.setTotal(userTaskList.size());
            record.setRate(pass+unPass!=0?new BigDecimal(pass).divide(new BigDecimal(pass+unPass),2,RoundingMode.HALF_DOWN).multiply(new BigDecimal(100)):BigDecimal.ZERO);
            List<TTask> status1 = userTaskList.stream().filter(e -> e.getStatus() == 5 || e.getStatus() == 6).collect(Collectors.toList());
            List<TTask> status2 = userTaskList.stream().filter(e -> e.getStatus() != 5 && e.getStatus() != 6).collect(Collectors.toList());
            record.setFinish(!status1.isEmpty()?new BigDecimal(status1.size()).divide(new BigDecimal(status1.size()+status2.size()),2,RoundingMode.HALF_DOWN).multiply(new BigDecimal(100)):BigDecimal.ZERO);
        }
//        PageInfo<TaskFinishListVO> taskFinishListVOPageInfo = new PageInfo<>();
//        Page<TTask> page = new Page<>(dto.getPageNum(), dto.getPageSize());
//        Page<TTask> tasksPage = taskCleanerService.page(page, tTaskLambdaQueryWrapper);
        res.setTaskMap(taskMap);
        res.setStatusMap(statusMap);
        res.setClearMap(clearMap);
        res.setUnqualifiedMap(unqualifiedMap);
        res.setTaskFinishList(taskFinishListVOPageInfo);
        return R.ok(res);
    }
    @ApiOperation(value = "根据当前登陆人查询项目部/片区不分页列表")
    @PostMapping(value = "/list")
    public R<List<ProjectDeptListNoLimitVO>> list() {
        List<TProjectDept> list = projectDeptService.list(new LambdaQueryWrapper<TProjectDept>()
                .eq(TProjectDept::getParentId, "0")
                .eq(TProjectDept::getStatus, 1));
        List<ProjectDeptListNoLimitVO> projectDeptListNoLimitVOS = new ArrayList<>();
        for (TProjectDept tProjectDept : list) {
            ProjectDeptListNoLimitVO projectDeptListNoLimitVO = new ProjectDeptListNoLimitVO();
            BeanUtils.copyProperties(tProjectDept, projectDeptListNoLimitVO);
            List<TProjectDept> list1 = projectDeptService.list(new LambdaQueryWrapper<TProjectDept>()
                    .eq(TProjectDept::getParentId, tProjectDept.getId())
                    .eq(TProjectDept::getStatus, 1));
            List<ProjectDeptListNoLimitVO> projectDeptListNoLimitVOS1 = new ArrayList<>();
            for (TProjectDept projectDept : list1) {
                ProjectDeptListNoLimitVO projectDeptListNoLimitVO1 = new ProjectDeptListNoLimitVO();
                BeanUtils.copyProperties(projectDept, projectDeptListNoLimitVO1);
                projectDeptListNoLimitVOS1.add(projectDeptListNoLimitVO1);
            }
            projectDeptListNoLimitVO.setChildren(projectDeptListNoLimitVOS1);
            projectDeptListNoLimitVOS.add(projectDeptListNoLimitVO);
        }
        return R.ok(projectDeptListNoLimitVOS);
    }
    @ApiOperation(value = "首页")
    @PostMapping(value = "/index")
    public R<IndexVO> index(@RequestBody IndexDTO dto) throws IOException {
        if (!StringUtils.hasLength(dto.getLon()) || !StringUtils.hasLength(dto.getLat())) {
            return R.fail("请上传经纬度");
        }
        IndexVO res = new IndexVO();
        Long userId = tokenService.getLoginUser().getUserId();
        List<TLocation> locationList = locationService.list();
        List<TLocationType> locationTypeList = locationTypeService.list();
        List<TTask> taskAll = taskCleanerService.lambdaQuery().eq(TTask::getPatrolInspector, userId).list();
        // 获取今天凌晨00:00:00 和今天23:59:59 类型为LocalDateTime
        LocalDateTime startOfToday = LocalDateTime.of(LocalDate.now(), LocalTime.MIN);
        LocalDateTime endOfToday = LocalDateTime.of(LocalDate.now(), LocalTime.MAX);
        List<TTask> taskToday = taskCleanerService.lambdaQuery()
                .between(TTask::getImplementTime, startOfToday, endOfToday)
                .eq(TTask::getPatrolInspector, userId).list();
        List<SysUser> sysUsers = sysUserService.selectAllList();
        SysUser sysUser = sysUserService.selectUserById(userId);
        Long userRole = sysUserService.getUserRole(userId);
        SysRole sysRole = roleService.selectRoleById(userRole);
        List<SysUser> users = new ArrayList<>();
        if (!sysRole.getRoleName().equals("现场管理员")) {
            if (sysUser.getDeptType() == 1) {
                TProjectDept projectDept = projectDeptService.getById(sysUser.getDeptId());
                if (projectDept != null) {
                    if (!"0".equals(projectDept.getParentId())) {
                        // 查询片区下的所有人员
                        users = sysUsers.stream().filter(e -> e.getDeptId()
                                .equals(projectDept.getId())
                                && e.getStatus().equals("0")
                                && e.getDeptType() == 1).collect(Collectors.toList());
                    } else {
                        TProjectDept parent = projectDeptService.getById(projectDept.getParentId());
                        users = sysUsers.stream().filter(e -> e.getDeptId()
                                .equals(parent.getId())
                                && e.getStatus().equals("0")
                                && e.getDeptType() == 1).collect(Collectors.toList());
                        List<TProjectDept> list = projectDeptService.lambdaQuery().eq(TProjectDept::getParentId, parent.getId()).list();
                        List<String> deptIds = list.stream().map(TProjectDept::getId).collect(Collectors.toList());
                        if (!deptIds.isEmpty()) {
                            List<SysUser> collect = sysUsers.stream().filter(e -> deptIds
                                    .contains(e.getDeptId())
                                    && e.getStatus().equals("0")
                                    && e.getDeptType() == 1).collect(Collectors.toList());
                            users.addAll(collect);
                        }
                    }
                }
            } else {
                TDept dept = deptService.getById(sysUser.getDeptId());
                if (dept != null) {
                    if (!dept.getDeptName().equals("公司")) {
                        users = sysUsers.stream().filter(e -> e.getDeptId()
                                .equals(sysUser.getDeptId())
                                && e.getStatus().equals("0")
                                && e.getDeptType() == 1).collect(Collectors.toList());
                    }
                }
            }
        }
        List<TaskTodayVO> pendingTask = new ArrayList<>();
        res.setTotalUserCount(users.size());
        if (!users.isEmpty()) {
            List<TTask> tasks = taskCleanerService.lambdaQuery().in(TTask::getPatrolInspector, users).list();
            List<String> taskIds = tasks.stream().map(TTask::getId).collect(Collectors.toList());
            if (!tasks.isEmpty()) {
                List<TTask> status1 = tasks.stream().filter(e -> e.getStatus() == 5 || e.getStatus() == 6).collect(Collectors.toList());
                List<TTask> status2 = tasks.stream().filter(e -> e.getStatus() != 5 && e.getStatus() != 6).collect(Collectors.toList());
                res.setMiddle(!status1.isEmpty() ? new BigDecimal(status1.size())
                        .divide(new BigDecimal(status1.size() + status2.size()), 2, RoundingMode.HALF_DOWN)
                        .multiply(new BigDecimal(100))
                        : new BigDecimal(0));
                List<TTaskDetail> taskDetails = taskDetailService.lambdaQuery()
                        .eq(TTaskDetail::getAuditStatus, 1).in(TTaskDetail::getTaskId, taskIds)
                        .isNotNull(TTaskDetail::getClearStatus)
                        .groupBy(TTaskDetail::getTaskId)
                        .orderByDesc(TTaskDetail::getCreateTime).list();
                List<TTaskDetail> status3 = taskDetails.stream().filter(e -> e.getClearStatus() == 1).collect(Collectors.toList());
                List<TTaskDetail> status4 = taskDetails.stream().filter(e -> e.getClearStatus() == 2).collect(Collectors.toList());
                if (status3.size() + status4.size() != 0) {
                    BigDecimal divide = new BigDecimal(status3.size() + status4.size())
                            .divide(new BigDecimal(status3.size()), 2, BigDecimal.ROUND_DOWN).multiply(new BigDecimal(100));
                    res.setRate(divide);
                } else {
                    res.setRate(new BigDecimal(0));
                }
            } else {
                res.setMiddle(new BigDecimal(0));
                res.setRate(new BigDecimal(0));
            }
        } else {
            res.setRate(new BigDecimal(0));
            res.setMiddle(new BigDecimal(0));
            res.setPendingTask(new ArrayList<>());
        }
        List<LeaveUserListVO> leaveList = new ArrayList<>();
        List<TLeave> list = leaveService.lambdaQuery().eq(TLeave::getAuditId, userId).eq(TLeave::getAuditStatus, 1).list();
        for (TLeave tLeave : list) {
            LeaveUserListVO leaveUserListVO = new LeaveUserListVO();
            BeanUtils.copyProperties(tLeave, leaveUserListVO);
            SysUser user = sysUsers.stream()
                    .filter(e -> e.getUserId().equals(Long.valueOf(tLeave.getLeavePerson()))).findFirst()
                    .orElse(null);
            if (user == null)
                continue;
            leaveUserListVO.setLeavePersonName(user.getNickName());
            leaveUserListVO.setCreateTime1(tLeave.getCreateTime());
            leaveUserListVO.setStartTime1(tLeave.getStartTime());
            leaveUserListVO.setEndTime1(tLeave.getEndTime());
        }
        List<TTask> taskList = taskAll.stream().filter(e -> e.getPatrolInspector().equals(userId + "") && e.getStatus() == 4).collect(Collectors.toList());
        List<String> taskIds = taskList.stream().map(TTask::getId).collect(Collectors.toList());
        for (TTask tTask : taskList) {
            List<TTaskDetail> taskDetailsStatus1 = taskDetailService.lambdaQuery()
                    .eq(TTaskDetail::getAuditStatus, 1).in(TTaskDetail::getTaskId, taskIds)
                    .eq(TTaskDetail::getClearStatus, 2)
                    .groupBy(TTaskDetail::getTaskId)
                    .orderByDesc(TTaskDetail::getCreateTime).list();
            TaskTodayVO taskTodayVO = new TaskTodayVO();
            BeanUtils.copyProperties(tTask, taskTodayVO);
            TLocation tLocation = locationList.stream().filter(e -> e.getId().equals(tTask.getLocationId())).findFirst().orElse(null);
            if (tLocation != null) {
                taskTodayVO.setLocationAddress(tLocation.getLocationAddress());
                taskTodayVO.setLocationLon(tLocation.getLocationLon());
                taskTodayVO.setLocationLat(tLocation.getLocationLat());
                taskTodayVO.setLocationName(tLocation.getLocationName());
                // todo
                Map<String, String> distance = amapApiClient.getDistance(dto.getLon() + "," + dto.getLat(), tLocation.getLocationLon() + "," + tLocation.getLocationLat(), 1);
                if (distance != null) {
                    taskTodayVO.setDistance(new BigDecimal(distance.get("distance")).divide(new BigDecimal(1000)).setScale(2, BigDecimal.ROUND_HALF_EVEN));
                } else {
                    taskTodayVO.setDistance(new BigDecimal("0"));
                }
                TLocationType tLocationType = locationTypeList.stream().filter(e -> e.getId().equals(tLocation.getLocationType())).findFirst().orElse(null);
                if (tLocationType != null) {
                    taskTodayVO.setLocationTypeName(tLocationType.getLocationName());
                    taskTodayVO.setLocationTypeIcon(tLocationType.getLocationIcon());
                }
            }
            TTaskDetail tTaskDetail = taskDetailsStatus1.stream().filter(e -> e.getTaskId().equals(tTask.getId())).findFirst().orElse(null);
            if (tTaskDetail != null) {
                String unqualified = tTaskDetail.getUnqualified();
                TDictData dictData = dictDataService.lambdaQuery().eq(TDictData::getId, unqualified).one();
                if (dictData != null) {
                    taskTodayVO.setRemark(dictData.getDataContent());
                }
            }
            pendingTask.add(taskTodayVO);
        }
        res.setPendingTask(pendingTask);
        res.setLeaveList(leaveList);
        List<TaskTodayVO> todayTask = new ArrayList<>();
        for (TTask tTask : taskToday) {
            TaskTodayVO taskTodayVO = new TaskTodayVO();
            List<TTaskDetail> taskDetailsStatus1 = taskDetailService.lambdaQuery()
                    .eq(TTaskDetail::getAuditStatus, 1).in(TTaskDetail::getTaskId, taskIds)
                    .eq(TTaskDetail::getClearStatus, 2)
                    .groupBy(TTaskDetail::getTaskId)
                    .orderByDesc(TTaskDetail::getCreateTime).list();
            BeanUtils.copyProperties(tTask, taskTodayVO);
            TLocation tLocation = locationList.stream().filter(e -> e.getId().equals(tTask.getLocationId())).findFirst().orElse(null);
            if (tLocation != null) {
                taskTodayVO.setLocationAddress(tLocation.getLocationAddress());
                taskTodayVO.setLocationLon(tLocation.getLocationLon());
                taskTodayVO.setLocationLat(tLocation.getLocationLat());
                taskTodayVO.setLocationName(tLocation.getLocationName());
                Map<String, String> distance = amapApiClient.getDistance(dto.getLon() + "," + dto.getLat(), tLocation.getLocationLon() + "," + tLocation.getLocationLat(), 1);
                if (distance != null) {
                    taskTodayVO.setDistance(new BigDecimal(distance.get("distance")).divide(new BigDecimal(1000)).setScale(2, BigDecimal.ROUND_HALF_EVEN));
                } else {
                    taskTodayVO.setDistance(new BigDecimal("0"));
                }
                TLocationType tLocationType = locationTypeList.stream().filter(e -> e.getId().equals(tLocation.getLocationType())).findFirst().orElse(null);
                if (tLocationType != null) {
                    taskTodayVO.setLocationTypeName(tLocationType.getLocationName());
                    taskTodayVO.setLocationTypeIcon(tLocationType.getLocationIcon());
                }
            }
            TTaskDetail tTaskDetail = taskDetailsStatus1.stream().filter(e -> e.getTaskId().equals(tTask.getId())).findFirst().orElse(null);
            if (tTaskDetail != null) {
                String unqualified = tTaskDetail.getUnqualified();
                TDictData dictData = dictDataService.lambdaQuery().eq(TDictData::getId, unqualified).one();
                if (dictData != null) {
                    taskTodayVO.setRemark(dictData.getDataContent());
                }
            }
            todayTask.add(taskTodayVO);
        }
        res.setTodayTask(todayTask);
        List<TaskTodayVO> tomorrowTask = new ArrayList<>(todayTask);
        Collections.shuffle(tomorrowTask);
        res.setTomorrowTask(tomorrowTask);
        return R.ok(res);
    }
}
ruoyi-applet/src/main/java/com/ruoyi/web/controller/api/TUserController.java
@@ -150,11 +150,26 @@
        List<TTask> finishTask = taskCleanerService.lambdaQuery().eq(TTask::getPatrolInspector, userId)
                .ge(TTask::getImplementTime, startOfMonth)
                .le(TTask::getImplementTime, endOfMonth).list();
        List<String> taskIds = finishTask.stream().map(TTask::getId).collect(Collectors.toList());
        List<TTaskDetail> taskDetails = taskDetailService.lambdaQuery()
                .eq(TTaskDetail::getAuditStatus,1).in(TTaskDetail::getTaskId, taskIds)
                .isNotNull(TTaskDetail::getClearStatus)
                .groupBy(TTaskDetail::getTaskId)
                .orderByDesc(TTaskDetail::getCreateTime).list();
        int size = (int) finishTask.stream().filter(e -> e.getStatus() == 5 || e.getStatus() == 6).count();
        userIndexVO.setFinishCount(size);
        BigDecimal divide = new BigDecimal(size).divide(new BigDecimal(finishTask.size()), 2, BigDecimal.ROUND_DOWN);
        userIndexVO.setRate(divide);
//        userIndexVO.setRanking();
        List<TTaskDetail> status1 = taskDetails.stream().filter(e -> e.getClearStatus() == 1).collect(Collectors.toList());
        List<TTaskDetail> status2 = taskDetails.stream().filter(e -> e.getClearStatus() == 2).collect(Collectors.toList());
        if (status1.size()+status2.size()!=0){
            BigDecimal divide = new BigDecimal(status1.size()+status2.size())
                    .divide(new BigDecimal(status1.size()), 2, BigDecimal.ROUND_DOWN).multiply(new BigDecimal(100));
            userIndexVO.setRate(divide);
        }else{
            userIndexVO.setRate(new BigDecimal(0));
        }
        // todo 月排名
        userIndexVO.setRanking(0);
        return R.ok(userIndexVO);
    }
    @ApiOperation(value = "任务记录分页列表")
@@ -267,7 +282,7 @@
    @ApiOperation(value = "上传督察任务")
    @PostMapping(value = "/addInspector")
    public R<Boolean> addInspector(@RequestBody InspectorAddDTO dto) {
        dto.setCommit_person(tokenService.getLoginUser().getUserId()+"");
        dto.setCommitPerson(tokenService.getLoginUser().getUserId()+"");
        if (dto.getClearStatus()==1){
            dto.setStatus(4);
        }else{
ruoyi-applet/src/main/java/com/ruoyi/web/controller/system/SysLoginController.java
@@ -58,7 +58,19 @@
    private MsgUtils msgUtils;
    @Autowired
    private SmsUtil smsUtil;
    @ApiOperation(value = "小程序账号密码登录",notes = "账号密码登录")
    @PostMapping("/loginApplet")
    public AjaxResult loginApplet(@RequestBody LoginBody loginBody)
    {
        AjaxResult ajax = AjaxResult.success();
        // 生成令牌
        LoginUserApplet loginUser = loginService.loginApplet(loginBody.getUsername(), loginBody.getPassword());
        ajax.put(Constants.TOKEN, tokenService.createTokenApplet(loginUser));
        ajax.put("userInfo",loginUser);
        ajax.put("roleName",loginUser.getRoleName());
        ajax.put("deptType",loginUser.getRoleName());
        return ajax;
    }
    /**
     * 账号密码登录
     * 
ruoyi-applet/src/main/java/com/ruoyi/web/controller/tool/AmapApiClient.java
New file
@@ -0,0 +1,61 @@
package com.ruoyi.web.controller.tool;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;
import org.springframework.stereotype.Component;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
@Component
public class AmapApiClient {
    private static final String KEY = "e700a58329a38b2d8980790d9b1b5b06";
    private static final OkHttpClient client = new OkHttpClient();
    public static String getDrivingRoute(double startLat, double startLon, double endLat, double endLon) throws IOException {
        String url = "https://restapi.amap.com/v3/direction/driving?" +
                "origin=" + startLon + "," + startLat +
                "&destination=" + endLon + "," + endLat +
                "&key=" + KEY;
        Request request = new Request.Builder()
                .url(url)
                .build();
        try (Response response = client.newCall(request).execute()) {
            return response.body().string();
        }
    }
    public  Map<String, String> getDistance(String origins, String destination, Integer type) throws IOException {
        String url = "https://restapi.amap.com/v3/distance?key=" + KEY + "&origins=" + origins + "&destination=" + destination +
                "&type=" + type;
        Request request = new Request.Builder()
                .url(url)
                .build();
        try (Response response = client.newCall(request).execute()) {
            JSONObject jsonObject = JSON.parseObject(response.body().string());
            String status = jsonObject.getString("status");
//        gdInterfaceService.saveData("https://restapi.amap.com/v3/distance", "查询两点间的距离");
            if(status.equals("1")){
                JSONArray results = jsonObject.getJSONArray("results");
                JSONObject jsonObject1 = results.getJSONObject(0);
                Map<String, String> map = new HashMap<>();
                map.put("distance", jsonObject1.getString("distance"));//距离(米)
                map.put("duration", jsonObject1.getString("duration"));//预计时间(秒)
                return map;
            }else{
                System.err.println(jsonObject);
            }
        }
        return null;
    }
}
ruoyi-common/src/main/java/com/ruoyi/common/core/domain/model/LoginUserApplet.java
@@ -28,7 +28,7 @@
    /**
     * 部门ID
     */
    private Long deptId;
    private String deptId;
    /**
     * 用户唯一标识
@@ -77,7 +77,7 @@
    /**
     * 用户信息
     */
    private TTenantResp user;
    private SysUser user;
    private Integer deptType;
@@ -85,13 +85,13 @@
    {
    }
    public LoginUserApplet(TTenantResp user, Set<String> permissions)
    public LoginUserApplet(SysUser user, Set<String> permissions)
    {
        this.user = user;
        this.permissions = permissions;
    }
    public LoginUserApplet(Long userId, Long deptId, TTenantResp user, Set<String> permissions)
    public LoginUserApplet(Long userId, String deptId, SysUser user, Set<String> permissions)
    {
        this.userId = userId;
        this.deptId = deptId;
@@ -109,12 +109,12 @@
        this.userId = userId;
    }
    public Long getDeptId()
    public String getDeptId()
    {
        return deptId;
    }
    public void setDeptId(Long deptId)
    public void setDeptId(String deptId)
    {
        this.deptId = deptId;
    }
@@ -139,7 +139,7 @@
    @Override
    public String getUsername()
    {
        return user.getResidentName();
        return user.getUserName();
    }
    /**
ruoyi-framework/src/main/java/com/ruoyi/framework/config/SecurityConfig.java
@@ -112,6 +112,7 @@
                .authorizeRequests()
                // 对于登录login 注册register 验证码captchaImage 允许匿名访问
                .antMatchers("/getPrivacyAgreement/{agreementType}",
                        "/loginApplet",
                        "/applet/queryProtocolConfigByType","/applet/login","/oss/upload",
                        "/login","/applet/queryProtocolConfigByType",
                        "/register","/applet/getCode","/applet/loginCode",
ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/SysLoginService.java
@@ -139,6 +139,7 @@
        // 用户验证
        Authentication authentication = null;
        // 用户验证
        username = username + "_applet";
        SysUser user = userService.selectUserByUserName(username);
        if (StringUtils.isNull(user)){
            log.info("登录用户:{} 不存在.", username);
@@ -262,9 +263,7 @@
            throw new ServiceException("短信验证码错误");
        }
        AsyncManager.me().execute(AsyncFactory.recordLogininfor(username, Constants.LOGIN_SUCCESS, MessageUtils.message("user.login.success")));
        TTenantResp tTenantResp = new TTenantResp();
        BeanUtils.copyProperties(user,tTenantResp);
        LoginUserApplet loginUser = new LoginUserApplet(user.getUserId(), null, tTenantResp, null);
        LoginUserApplet loginUser = new LoginUserApplet(user.getUserId(), null, user, null);
        // 生成token
        return loginUser;
    }
ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/UserDetailsServiceImpl.java
@@ -1,5 +1,6 @@
package com.ruoyi.framework.web.service;
import com.ruoyi.common.core.domain.model.LoginUserApplet;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
@@ -37,6 +38,9 @@
    @Override
    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException
    {
        if(username.contains("applet")){
            username = username.split("_")[0];
        }
        SysUser user = userService.selectUserByUserName(username);
        if (StringUtils.isNull(user))
        {
@@ -55,7 +59,9 @@
        }
        passwordService.validate(user);
        if(username.contains("applet")){
            return createLoginAppletUser(user);
        }
        return createLoginUser(user);
    }
@@ -63,4 +69,9 @@
    {
        return new LoginUser(user.getUserId(), user.getDeptId(), user, permissionService.getMenuPermission(user));
    }
    public UserDetails createLoginAppletUser(SysUser user)
    {
        return new LoginUserApplet(user.getUserId(), user.getDeptId(), user, permissionService.getMenuPermission(user));
    }
}
ruoyi-system/src/main/java/com/ruoyi/system/applet/dto/DataReportDTO.java
New file
@@ -0,0 +1,18 @@
package com.ruoyi.system.applet.dto;
import com.ruoyi.common.core.domain.BasePage;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
@Data
@ApiModel(value = "首页-数据概览-更多DTO")
public class DataReportDTO extends BasePage {
    @ApiModelProperty(value = "开始时间yyyy-MM-dd HH:mm:ss")
    private String startTime;
    @ApiModelProperty(value = "结束时间yyyy-MM-dd HH:mm:ss")
    private String endTime;
    @ApiModelProperty(value = "项目部/片区id")
    private String projectId;
}
ruoyi-system/src/main/java/com/ruoyi/system/applet/dto/IndexDTO.java
New file
@@ -0,0 +1,16 @@
package com.ruoyi.system.applet.dto;
import com.ruoyi.common.core.domain.BasePage;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
@Data
@ApiModel(value = "首页DTO")
public class IndexDTO extends BasePage {
    @ApiModelProperty(value = "经度")
    private String lon;
    @ApiModelProperty(value = "纬度")
    private String lat;
}
ruoyi-system/src/main/java/com/ruoyi/system/applet/query/DataReportQuery.java
New file
@@ -0,0 +1,19 @@
package com.ruoyi.system.applet.query;
import com.ruoyi.common.core.domain.BasePage;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.util.List;
@Data
@ApiModel(value = "申诉任务记录分页列表query")
public class DataReportQuery extends BasePage {
    @ApiModelProperty(value = "片区ids")
    private List<String> projectIds;
    @ApiModelProperty(value = "开始时间yyyy-MM-dd HH:mm:ss")
    private String startTime;
    @ApiModelProperty(value = "结束时间yyyy-MM-dd HH:mm:ss")
    private String endTime;
}
ruoyi-system/src/main/java/com/ruoyi/system/applet/vo/DataReportVO.java
New file
@@ -0,0 +1,27 @@
package com.ruoyi.system.applet.vo;
import com.ruoyi.common.basic.PageInfo;
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 DataReportVO {
    @ApiModelProperty(value = "项目任务分布")
    private Map<String,Integer> taskMap;
    @ApiModelProperty(value = "任务状态统计")
    private Map<String,Integer> statusMap;
    @ApiModelProperty(value = "清洁情况分析")
    private Map<String,Integer> clearMap;
    @ApiModelProperty(value = "不合格原因统计")
    private Map<String,Integer> unqualifiedMap;
    @ApiModelProperty(value = "巡检员任务完成情况")
    private PageInfo<TaskFinishListVO> taskFinishList;
}
ruoyi-system/src/main/java/com/ruoyi/system/applet/vo/IndexVO.java
New file
@@ -0,0 +1,30 @@
package com.ruoyi.system.applet.vo;
import com.ruoyi.system.model.TLeave;
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;
@Data
@ApiModel(value = "首页VO")
public class IndexVO {
    @ApiModelProperty(value = "数据预览-合计人员")
    private Integer totalUserCount;
    @ApiModelProperty(value = "数据预览-平均完成数")
    private BigDecimal middle;
    @ApiModelProperty(value = "数据预览-合格率")
    private BigDecimal rate;
    @ApiModelProperty(value = "审批列表")
    private List<LeaveUserListVO> leaveList;
    @ApiModelProperty(value = "待整改任务")
    private List<TaskTodayVO> pendingTask;
    @ApiModelProperty(value = "今日任务")
    private List<TaskTodayVO> todayTask;
    @ApiModelProperty(value = "明日任务预览")
    private List<TaskTodayVO> tomorrowTask;
}
ruoyi-system/src/main/java/com/ruoyi/system/applet/vo/LeaveUserListVO.java
@@ -1,5 +1,6 @@
package com.ruoyi.system.applet.vo;
import com.baomidou.mybatisplus.annotation.TableField;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.ruoyi.system.model.TLeave;
import io.swagger.annotations.ApiModel;
@@ -12,10 +13,18 @@
@Data
@ApiModel(value = "个人中心-我审批的分页列表返回VO")
public class LeaveUserListVO extends TLeave {
    @ApiModelProperty(value = "请假人")
    @ApiModelProperty(value = "请假人名称")
    private String leavePersonName;
    @ApiModelProperty(value = "申请时间")
    @ApiModelProperty(value = "申请时间-年月日格式")
    @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
    private LocalDateTime createTime1;
    @ApiModelProperty(value = "请假开始日期-年月日格式")
    @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
    private LocalDateTime startTime1;
    @ApiModelProperty(value = "请假结束日期-年月日格式")
    @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
    private LocalDateTime endTime1;
}
ruoyi-system/src/main/java/com/ruoyi/system/applet/vo/TaskFinishListVO.java
New file
@@ -0,0 +1,28 @@
package com.ruoyi.system.applet.vo;
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 TaskFinishListVO {
    @ApiModelProperty(value = "用户id")
    private Long userId;
    @ApiModelProperty(value = "姓名")
    private String nickName;
    @ApiModelProperty(value = "电话")
    private String phonenumber;
    @ApiModelProperty(value = "总计任务数")
    private Integer total;
    @ApiModelProperty(value = "合格率")
    private BigDecimal rate;
    @ApiModelProperty(value = "完成率")
    private BigDecimal finish;
}
ruoyi-system/src/main/java/com/ruoyi/system/applet/vo/TaskTodayVO.java
New file
@@ -0,0 +1,31 @@
package com.ruoyi.system.applet.vo;
import com.ruoyi.system.model.TTask;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.math.BigDecimal;
@Data
@ApiModel(value = "今日任务/待整改列表VO")
public class TaskTodayVO extends TTask {
    @ApiModelProperty(value = "点位名称")
    private String locationName;
    @ApiModelProperty(value = "点位起点地址")
    private String locationAddress;
    @ApiModelProperty(value = "点位经度 起点")
    private String locationLon;
    @ApiModelProperty(value = "点位纬度 起点")
    private String locationLat;
    @ApiModelProperty(value = "点位类型名称")
    private String locationTypeName;
    @ApiModelProperty(value = "点位类型图标")
    private String locationTypeIcon;
    @ApiModelProperty(value = "驳回原因 状态为待整改时有值")
    private String remark;
    @ApiModelProperty(value = "距离 单位km")
    private BigDecimal distance;
}
ruoyi-system/src/main/java/com/ruoyi/system/applet/vo/UnqualifiedVO.java
New file
@@ -0,0 +1,20 @@
package com.ruoyi.system.applet.vo;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.util.List;
import java.util.Map;
@Data
@ApiModel(value = "不合格原因列表VO")
public class UnqualifiedVO {
    @ApiModelProperty(value = "不合格原因名称")
    private String unqualified;
    @ApiModelProperty(value = "数量")
    private Integer count;
}
ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysRoleMapper.java
@@ -129,4 +129,6 @@
    List<SysRole> selectRoleByUserIds(@Param("roleIds")List<String> roleIds);
    List<SysRole> listNotPageByTemplateId(@Param("templateId")String templateId);
}
ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysUserMapper.java
@@ -3,6 +3,8 @@
import java.util.List;
import com.ruoyi.common.basic.PageInfo;
import com.ruoyi.system.applet.query.DataReportQuery;
import com.ruoyi.system.applet.vo.TaskFinishListVO;
import com.ruoyi.system.query.SysUserQuery;
import com.ruoyi.system.vo.system.SysUserVO;
import org.apache.ibatis.annotations.Mapper;
@@ -171,11 +173,15 @@
    List<SysUser> selectAllList();
    List<SysUserVO> pageList(@Param("query")SysUserQuery query);
    List<SysUserVO> pageList(@Param("query")SysUserQuery query,@Param("pageInfo")PageInfo<SysUserVO> pageInfo);
    void updatePassword(@Param("id") Long id,@Param("s") String s);
    long selectIdByPhone(@Param("phonenumber") String phonenumber);
    List<SysUser> selectUserByTempLateId(@Param("templateId")String templateId);
    List<SysUser> selectUserByDeptId(@Param("id")String id);
    List<TaskFinishListVO> pageListReport(@Param("query")DataReportQuery query, @Param("pageInfo")PageInfo<TaskFinishListVO> pageInfo);
}
ruoyi-system/src/main/java/com/ruoyi/system/mapper/TEarlyWarningMapper.java
@@ -1,7 +1,13 @@
package com.ruoyi.system.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.ruoyi.common.basic.PageInfo;
import com.ruoyi.system.model.TEarlyWarning;
import com.ruoyi.system.query.TaskWarningQuery;
import com.ruoyi.system.vo.system.TaskWarningVO;
import org.apache.ibatis.annotations.Param;
import java.util.List;
/**
 * <p>
@@ -13,4 +19,6 @@
 */
public interface TEarlyWarningMapper extends BaseMapper<TEarlyWarning> {
    List<TaskWarningVO> pageList(@Param("query")TaskWarningQuery query, @Param("pageInfo")PageInfo<TaskWarningVO> pageInfo);
}
ruoyi-system/src/main/java/com/ruoyi/system/mapper/TTaskMapper.java
@@ -7,7 +7,9 @@
import com.ruoyi.system.model.TTask;
import com.ruoyi.system.query.LocationListTaskQuery;
import com.ruoyi.system.query.TaskListQuery;
import com.ruoyi.system.query.TaskProgressQuery;
import com.ruoyi.system.vo.system.LocationListTaskVO;
import com.ruoyi.system.vo.system.ProgressListVO;
import com.ruoyi.system.vo.system.TaskListVO;
import org.apache.ibatis.annotations.Param;
@@ -33,4 +35,6 @@
     * @return
     */
    List<TaskListVO> exportList(@Param("query")TaskListQuery query);
    List<ProgressListVO> taskProgress(@Param("query")TaskProgressQuery query, @Param("pageInfo")PageInfo<ProgressListVO> pageInfo);
}
ruoyi-system/src/main/java/com/ruoyi/system/model/TCleaner.java
@@ -29,7 +29,7 @@
    @TableId(value = "id", type = IdType.ASSIGN_ID)
    private String id;
    @ApiModelProperty(value = "保洁员编号")
    @ApiModelProperty(value = "片区级编号")
    @TableField("cleaner_code")
    private String cleanerCode;
ruoyi-system/src/main/java/com/ruoyi/system/model/TInspector.java
@@ -75,8 +75,8 @@
    @TableField("audit_remark")
    private String auditRemark;
    @ApiModelProperty(value = "提交人id")
    @TableField("commitPerson")
    private String commit_person;
    @TableField("commit_person")
    private String commitPerson;
}
ruoyi-system/src/main/java/com/ruoyi/system/model/TLeave.java
@@ -79,6 +79,9 @@
    @ApiModelProperty(value = "审批编号")
    @TableField("code")
    private String code;
    @ApiModelProperty(value = "请假的时候 处于哪个模板id")
    @TableField("template_id")
    private String templateId;
}
ruoyi-system/src/main/java/com/ruoyi/system/model/TTask.java
@@ -57,6 +57,10 @@
    @TableField("implement_time")
    private LocalDateTime implementTime;
    @ApiModelProperty(value = "执行日期前端传递")
    @TableField(exist = false)
    private String implementTime1;
    @ApiModelProperty(value = "任务类型 1日常任务 2自建任务")
    @TableField("task_type")
    private Integer taskType;
@@ -70,6 +74,10 @@
    @ApiModelProperty(value = "任务编号")
    @TableField("task_code")
    private String taskCode;
    @ApiModelProperty(value = "模板id 日常任务存储")
    @TableField("template_id")
    private String templateId;
    @ApiModelProperty(value = "模板id 日常任务存储")
    @TableField("user_id")
    private Long userId;
}
ruoyi-system/src/main/java/com/ruoyi/system/model/TTemplate.java
@@ -40,6 +40,9 @@
    @ApiModelProperty(value = "适用角色id")
    @TableField("role_id")
    private Long roleId;
    @ApiModelProperty(value = "首次生成任务数量")
    @TableField("task_count")
    private Integer taskCount;
}
ruoyi-system/src/main/java/com/ruoyi/system/model/TTemplateDetail.java
@@ -55,8 +55,7 @@
            "\n" +
            "\t}, {\n" +
            "\t\t\"id\": \"18678093453\",\n" +
            "\t\t\"value\": 18\n" +
            "\t}]\n")
            "\t\t\"value\": 18\n" + "}]\n")
    @TableField("num4")
    private String num4;
ruoyi-system/src/main/java/com/ruoyi/system/query/CleanerListQuery.java
@@ -12,9 +12,9 @@
    @ApiModelProperty(value = "保洁员编号")
    private String cleanerCode;
    @ApiModelProperty(value = "保洁员名称")
    private Integer cleanerName;
    private String cleanerName;
    @ApiModelProperty(value = "所属片区id")
    private Integer projectId;
    private String projectId;
ruoyi-system/src/main/java/com/ruoyi/system/query/InspectorQuery.java
New file
@@ -0,0 +1,28 @@
package com.ruoyi.system.query;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.util.List;
@Data
@ApiModel(value = "督察人员报表query")
public class InspectorQuery {
    @ApiModelProperty(value = "部门名称")
    private String deptName;
    @ApiModelProperty(value = "员工名称")
    private String nickName;
    @ApiModelProperty("电话")
    private String phonenumber;
    @ApiModelProperty(value = "用户ids 前端忽略")
    private List<Long> patrolInspectorIds;
    @ApiModelProperty(value = "部门ids 前端忽略")
    private List<Long> deptIds;
    @ApiModelProperty(value = "开始时间 yyyy-MM-dd HH:mm:ss")
    private String startTime;
    @ApiModelProperty(value = "结束时间 yyyy-MM-dd HH:mm:ss")
    private String endTime;
}
ruoyi-system/src/main/java/com/ruoyi/system/query/PatrolInspectorQuery.java
New file
@@ -0,0 +1,28 @@
package com.ruoyi.system.query;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.util.List;
@Data
@ApiModel(value = "巡检人员报表query")
public class PatrolInspectorQuery {
    @ApiModelProperty(value = "部门名称")
    private String deptName;
    @ApiModelProperty(value = "员工名称")
    private String nickName;
    @ApiModelProperty("电话")
    private String phonenumber;
    @ApiModelProperty(value = "用户ids 前端忽略")
    private List<Long> patrolInspectorIds;
    @ApiModelProperty(value = "部门ids 前端忽略")
    private List<Long> deptIds;
    @ApiModelProperty(value = "开始时间 yyyy-MM-dd HH:mm:ss")
    private String startTime;
    @ApiModelProperty(value = "结束时间 yyyy-MM-dd HH:mm:ss")
    private String endTime;
}
ruoyi-system/src/main/java/com/ruoyi/system/query/SysUserQuery.java
@@ -23,5 +23,7 @@
    private String status;
    @ApiModelProperty(value = "引用状态")
    private String templateId;
    @ApiModelProperty(value = "用户ids 前端忽略")
    private List<Long> patrolInspectorIds;
}
ruoyi-system/src/main/java/com/ruoyi/system/query/TaskDetailsQuery.java
New file
@@ -0,0 +1,19 @@
package com.ruoyi.system.query;
import com.ruoyi.common.core.domain.BasePage;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.util.List;
@Data
@ApiModel(value = "任务报表列表query")
public class TaskDetailsQuery {
    @ApiModelProperty(value = "开始时间 yyyy-MM-dd HH:mm:ss")
    private String startTime;
    @ApiModelProperty(value = "结束时间yyyy-MM-dd HH:mm:ss")
    private String endTime;
}
ruoyi-system/src/main/java/com/ruoyi/system/query/TaskProgressQuery.java
New file
@@ -0,0 +1,28 @@
package com.ruoyi.system.query;
import com.ruoyi.common.core.domain.BasePage;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.util.List;
@Data
@ApiModel(value = "任务进度分页列表query")
public class TaskProgressQuery extends BasePage {
    @ApiModelProperty(value = "部门名称")
    private String deptName;
    @ApiModelProperty(value = "员工名称")
    private String nickName;
    @ApiModelProperty("电话")
    private String phonenumber;
    @ApiModelProperty("计划名称")
    private String templateName;
    @ApiModelProperty(value = "用户ids 前端忽略")
    private List<Long> patrolInspectorIds;
    @ApiModelProperty(value = "部门ids 前端忽略")
    private List<Long> deptIds;
    @ApiModelProperty(value = "模板ids 前端忽略")
    private List<String> templateIds;
}
ruoyi-system/src/main/java/com/ruoyi/system/query/TaskWarningQuery.java
New file
@@ -0,0 +1,33 @@
package com.ruoyi.system.query;
import com.ruoyi.common.core.domain.BasePage;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.util.List;
@Data
@ApiModel(value = "任务预警分页列表query")
public class TaskWarningQuery extends BasePage {
    @ApiModelProperty(value = "点位名称")
    private String locationName;
    @ApiModelProperty(value = "点位类型id")
    private String locationType;
    @ApiModelProperty("电话")
    private String phonenumber;
    @ApiModelProperty(value = "部门名称")
    private String deptName;
    @ApiModelProperty(value = "预警类型 1超时预警 2点位不合格预警")
    private String warningType;
    @ApiModelProperty(value = "开始时间 yyyy-MM-dd HH:mm:ss")
    private String startTime;
    @ApiModelProperty(value = "结束时间 yyyy-MM-dd HH:mm:ss")
    private String endTime;
    @ApiModelProperty(value = "用户ids 前端忽略")
    private List<Long> patrolInspectorIds;
    @ApiModelProperty(value = "任务ids 前端忽略")
    private List<String> taskIds;
    @ApiModelProperty(value = "点位ids 前端忽略")
    private List<String> locationIds;
}
ruoyi-system/src/main/java/com/ruoyi/system/service/ISysRoleService.java
@@ -234,4 +234,7 @@
    public int editRole(SysRoleDTO dto);
    List<SysRole> selectRoleByUserIds(List<String> roleIds);
    List<SysRole> listNotPageByTemplateId(String templateId);
}
ruoyi-system/src/main/java/com/ruoyi/system/service/ISysUserService.java
@@ -4,6 +4,8 @@
import com.ruoyi.common.basic.PageInfo;
import com.ruoyi.common.core.domain.entity.SysUser;
import com.ruoyi.system.applet.query.DataReportQuery;
import com.ruoyi.system.applet.vo.TaskFinishListVO;
import com.ruoyi.system.query.SysUserQuery;
import com.ruoyi.system.vo.system.SysUserVO;
@@ -263,4 +265,9 @@
    long selectIdByPhone(String phonenumber);
    List<SysUser> selectUserByTempLateId(String templateId);
    List<SysUser> selectUserByDeptId(String id);
    PageInfo<TaskFinishListVO> pageListReport(DataReportQuery dataReportQuery);
}
ruoyi-system/src/main/java/com/ruoyi/system/service/TEarlyWarningService.java
@@ -1,7 +1,11 @@
package com.ruoyi.system.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.ruoyi.common.basic.PageInfo;
import com.ruoyi.system.model.TEarlyWarning;
import com.ruoyi.system.query.TaskWarningQuery;
import com.ruoyi.system.vo.system.TaskListVO;
import com.ruoyi.system.vo.system.TaskWarningVO;
/**
 * <p>
@@ -13,4 +17,5 @@
 */
public interface TEarlyWarningService extends IService<TEarlyWarning> {
    PageInfo<TaskWarningVO> pageList(TaskWarningQuery query);
}
ruoyi-system/src/main/java/com/ruoyi/system/service/TTaskCleanService.java
@@ -6,6 +6,8 @@
import com.ruoyi.system.applet.vo.TaskUserListVO;
import com.ruoyi.system.model.TTask;
import com.ruoyi.system.query.TaskListQuery;
import com.ruoyi.system.query.TaskProgressQuery;
import com.ruoyi.system.vo.system.ProgressListVO;
import com.ruoyi.system.vo.system.TaskListVO;
import java.util.List;
@@ -32,4 +34,8 @@
     * @return
     */
    List<TaskListVO> exportList(TaskListQuery query);
    PageInfo<ProgressListVO> taskProgress(TaskProgressQuery query);
}
ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysRoleServiceImpl.java
@@ -611,4 +611,9 @@
    public List<SysRole> selectRoleByUserIds(List<String> roleIds) {
        return roleMapper.selectRoleByUserIds(roleIds);
    }
    @Override
    public List<SysRole> listNotPageByTemplateId(String templateId) {
        return roleMapper.listNotPageByTemplateId(templateId);
    }
}
ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysUserServiceImpl.java
@@ -13,6 +13,8 @@
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.common.utils.bean.BeanValidators;
import com.ruoyi.common.utils.spring.SpringUtils;
import com.ruoyi.system.applet.query.DataReportQuery;
import com.ruoyi.system.applet.vo.TaskFinishListVO;
import com.ruoyi.system.domain.SysPost;
import com.ruoyi.system.domain.SysUserPost;
import com.ruoyi.system.domain.SysUserRole;
@@ -662,7 +664,7 @@
        PageInfo<SysUserVO> pageInfo = new PageInfo<>(query.getPageNum(), query.getPageSize());
        List<SysUserVO> list = userMapper.pageList(query);
        List<SysUserVO> list = userMapper.pageList(query,pageInfo);
        if(CollectionUtils.isEmpty(list)){
            return pageInfo;
        }
@@ -709,13 +711,6 @@
                }
            }
        pageInfo.setTotal(list.size());
        if (org.springframework.util.StringUtils.hasLength(query.getDeptName())){
            List<SysUserVO> collect = list.stream().filter(sysUserVO -> sysUserVO.getDeptName().contains(query.getDeptName())).collect(Collectors.toList());
            pageInfo.setTotal(collect.size());
            // 手动分页
            list = collect.stream().skip((long) (query.getPageNum() - 1) * query.getPageSize()).limit(query.getPageSize()).collect(Collectors.toList());
        }
        pageInfo.setRecords(list);
        return pageInfo;
    }
@@ -736,6 +731,19 @@
    }
    @Override
    public List<SysUser> selectUserByDeptId(String id) {
        return userMapper.selectUserByDeptId(id);
    }
    @Override
    public PageInfo<TaskFinishListVO> pageListReport(DataReportQuery query) {
        PageInfo<TaskFinishListVO> pageInfo = new PageInfo<>(query.getPageNum(), query.getPageSize());
        List<TaskFinishListVO> list = userMapper.pageListReport(query,pageInfo);
        pageInfo.setRecords(list);
        return pageInfo;
    }
    @Override
    public SysUser selectByPhone(String phonenumber) {
        return userMapper.selectByPhone(phonenumber);
    }
ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TCleanerServiceImpl.java
@@ -3,11 +3,14 @@
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ruoyi.common.basic.PageInfo;
import com.ruoyi.system.mapper.TCleanerMapper;
import com.ruoyi.system.mapper.TProjectDeptMapper;
import com.ruoyi.system.model.TCleaner;
import com.ruoyi.system.model.TProjectDept;
import com.ruoyi.system.query.CleanerListQuery;
import com.ruoyi.system.service.TCleanerService;
import com.ruoyi.system.vo.system.CleanerListVO;
import com.ruoyi.system.vo.system.DeptListVO;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
@@ -23,10 +26,19 @@
@Service
public class TCleanerServiceImpl extends ServiceImpl<TCleanerMapper, TCleaner> implements TCleanerService {
    @Autowired
    private TProjectDeptMapper projectDeptMapper;
    @Override
    public PageInfo<CleanerListVO> pageList(CleanerListQuery query) {
        PageInfo<CleanerListVO> pageInfo = new PageInfo<>(query.getPageNum(), query.getPageSize());
        List<CleanerListVO> list = this.baseMapper.pageList(query,pageInfo);
        for (CleanerListVO cleanerListVO : list) {
            TProjectDept tProjectDept = projectDeptMapper.selectById(cleanerListVO.getProjectId());
            if (tProjectDept!=null&&!tProjectDept.getParentId().equals("0")){
                TProjectDept tProjectDept1 = projectDeptMapper.selectById(tProjectDept.getParentId());
                cleanerListVO.setProjectName(tProjectDept1.getProjectName()+">"+tProjectDept.getProjectName());
            }
        }
        pageInfo.setRecords(list);
        return pageInfo;
    }
ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TEarlyWarningServiceImpl.java
@@ -1,10 +1,18 @@
package com.ruoyi.system.service.impl;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ruoyi.system.mapper.TEarlyWarningMapper;
import com.ruoyi.system.model.TEarlyWarning;
import com.ruoyi.common.basic.PageInfo;
import com.ruoyi.common.core.domain.entity.SysUser;
import com.ruoyi.system.mapper.*;
import com.ruoyi.system.model.*;
import com.ruoyi.system.query.TaskWarningQuery;
import com.ruoyi.system.service.TEarlyWarningService;
import com.ruoyi.system.vo.system.CleanerListVO;
import com.ruoyi.system.vo.system.TaskWarningVO;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
/**
 * <p>
@@ -17,4 +25,60 @@
@Service
public class TEarlyWarningServiceImpl extends ServiceImpl<TEarlyWarningMapper, TEarlyWarning> implements TEarlyWarningService {
    @Autowired
    private SysUserMapper sysUserMapper;
    @Autowired
    private TProjectDeptMapper projectDeptMapper;
    @Autowired
    private TDeptMapper deptMapper;
    @Autowired
    private TTaskMapper taskMapper;
    @Autowired
    private TLocationMapper locationMapper;
    @Override
    public PageInfo<TaskWarningVO> pageList(TaskWarningQuery query) {
        List<TTask> taskList = taskMapper.selectList(null);
        PageInfo<TaskWarningVO> pageInfo = new PageInfo<>(query.getPageNum(), query.getPageSize());
        List<TaskWarningVO> list = this.baseMapper.pageList(query,pageInfo);
        for (TaskWarningVO taskWarningVO : list) {
            String[] split = taskWarningVO.getTaskId().split(",");
            TTask tTask = taskList.stream().filter(e -> e.getId().equals(split[0])).findFirst().orElse(null);
            StringBuilder taskCode = new StringBuilder();
            for (String s : split) {
                TTask task = taskList.stream().filter(e -> e.getId().equals(s)).findFirst().orElse(null);
                if (task!=null){
                    taskCode.append(task.getTaskCode()).append(",");
                }
            }
            // 去除最后一位
            taskWarningVO.setTaskCode(taskWarningVO.getTaskCode().substring(0, taskWarningVO.getTaskCode().length() - 1));
            if (tTask!=null){
                TLocation tLocation = locationMapper.selectById(tTask.getLocationId());
                if (tLocation!=null){
                    taskWarningVO.setLocationName(tLocation.getLocationName());
                }
                SysUser sysUser = sysUserMapper.selectUserById(Long.valueOf(tTask.getPatrolInspector()));
                if (sysUser!=null){
                    taskWarningVO.setPhonenumber(sysUser.getPhonenumber());
                    taskWarningVO.setPatrolInspectorName(sysUser.getNickName());
                    if (sysUser.getDeptType() == 1){
                        TProjectDept tProjectDept = projectDeptMapper.selectById(sysUser.getDeptId());
                        if (!tProjectDept.getParentId().equals("0")){
                            TProjectDept tProjectDept1 = projectDeptMapper.selectById(tProjectDept.getParentId());
                            taskWarningVO.setDeptName(tProjectDept1.getProjectName()+">"+tProjectDept.getProjectName());
                        }else{
                            taskWarningVO.setDeptName(tProjectDept.getProjectName());
                        }
                    }else{
                        TDept tDept = deptMapper.selectById(sysUser.getDeptId());
                        taskWarningVO.setDeptName(tDept.getDeptName());
                    }
                }
            }
        }
        pageInfo.setRecords(list);
        return pageInfo;
    }
}
ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TLocationServiceImpl.java
@@ -37,13 +37,20 @@
        List<LocationListVO> list = this.baseMapper.pageList(query,pageInfo);
        for (LocationListVO locationListVO : list) {
            TCleaner tCleaner = cleanerMapper.selectById(locationListVO.getLocationCleaner());
            TProjectDept tProjectDept = projectDeptMapper.selectById(tCleaner.getProjectId());
            if (!tProjectDept.getParentId().equals("0")){
                TProjectDept tProjectDept1 = projectDeptMapper.selectById(tProjectDept.getParentId());
                locationListVO.setProjectName(tProjectDept1.getProjectName()+">"+tProjectDept.getProjectName());
            }else{
                locationListVO.setProjectName(tProjectDept.getProjectName());
            if (tCleaner!=null){
                TProjectDept tProjectDept = projectDeptMapper.selectById(tCleaner.getProjectId());
                if (tProjectDept!=null){
                    if (!tProjectDept.getParentId().equals("0")){
                        TProjectDept tProjectDept1 = projectDeptMapper.selectById(tProjectDept.getParentId());
                        if (tProjectDept1!=null)
                        locationListVO.setProjectName(tProjectDept1.getProjectName()+">"+tProjectDept.getProjectName());
                    }else{
                        locationListVO.setProjectName(tProjectDept.getProjectName());
                    }
                }
            }
        }
        pageInfo.setRecords(list);
        return pageInfo;
ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TTaskCleanServiceImpl.java
@@ -4,15 +4,16 @@
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ruoyi.common.basic.PageInfo;
import com.ruoyi.common.core.domain.BaseModel;
import com.ruoyi.common.core.domain.entity.SysUser;
import com.ruoyi.common.utils.DateUtils;
import com.ruoyi.system.applet.query.TaskUserListQuery;
import com.ruoyi.system.applet.vo.TaskUserListVO;
import com.ruoyi.system.mapper.TDeptMapper;
import com.ruoyi.system.mapper.TTaskDetailMapper;
import com.ruoyi.system.mapper.TTaskMapper;
import com.ruoyi.system.mapper.*;
import com.ruoyi.system.model.*;
import com.ruoyi.system.query.TaskListQuery;
import com.ruoyi.system.query.TaskProgressQuery;
import com.ruoyi.system.service.TTaskCleanService;
import com.ruoyi.system.vo.system.ProgressListVO;
import com.ruoyi.system.vo.system.TaskListVO;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@@ -38,6 +39,11 @@
    private TDeptMapper deptMapper;
    @Autowired
    private TTaskDetailMapper taskDetailMapper;
    @Autowired
    private SysUserMapper sysUserMapper;
    @Autowired
    private TProjectDeptMapper projectDeptMapper;
    @Override
    public PageInfo<TaskListVO> pageList(TaskListQuery query) {
        PageInfo<TaskListVO> pageInfo = new PageInfo<>(query.getPageNum(), query.getPageSize());
@@ -47,13 +53,26 @@
                .orderByDesc(BaseModel::getCreateTime)
                .in(TTaskDetail::getHandleType,Arrays.asList(1,4)));
        for (TaskListVO taskListVO : list) {
            TDept tDept = deptMapper.selectById(taskListVO.getPatrolInspectorDept());
            taskListVO.setDeptName(tDept.getDeptName());
            TTaskDetail tTaskDetail = tTaskDetails.stream().filter(e -> e.getTaskId().equals(taskListVO.getId())).findFirst().orElse(null);
        for (TaskListVO temp : list) {
            SysUser sysUser = sysUserMapper.selectUserById(Long.valueOf(temp.getPatrolInspector()));
            if(sysUser!=null){
                if ( sysUser.getDeptType() == 1){
                    TProjectDept tProjectDept = projectDeptMapper.selectById(sysUser.getDeptId());
                    if (!tProjectDept.getParentId().equals("0")){
                        TProjectDept tProjectDept1 = projectDeptMapper.selectById(tProjectDept.getParentId());
                        temp.setDeptName(tProjectDept1.getProjectName()+">"+tProjectDept.getProjectName());
                    }else{
                        temp.setDeptName(tProjectDept.getProjectName());
                    }
                }else{
                    TDept tDept = deptMapper.selectById(sysUser.getDeptId());
                    temp.setDeptName(tDept.getDeptName());
                }
            }
            TTaskDetail tTaskDetail = tTaskDetails.stream().filter(e -> e.getTaskId().equals(temp.getId())).findFirst().orElse(null);
            if (tTaskDetail!=null){
                taskListVO.setPicture(tTaskDetail.getPicture());
                taskListVO.setClearStatus(tTaskDetail.getClearStatus());
                temp.setPicture(tTaskDetail.getPicture());
                temp.setClearStatus(tTaskDetail.getClearStatus());
            }
        }
        pageInfo.setRecords(list);
@@ -92,4 +111,14 @@
        }
        return list;
    }
    @Override
    public PageInfo<ProgressListVO> taskProgress(TaskProgressQuery query) {
        PageInfo<ProgressListVO> pageInfo = new PageInfo<>(query.getPageNum(), query.getPageSize());
        List<ProgressListVO> list = this.baseMapper.taskProgress(query,pageInfo);
        pageInfo.setRecords(list);
        return pageInfo;
    }
}
ruoyi-system/src/main/java/com/ruoyi/system/vo/system/DeptNoLimitChildVO.java
New file
@@ -0,0 +1,17 @@
package com.ruoyi.system.vo.system;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.util.List;
@Data
@ApiModel(value = "部门/项目部下级不分页列表VO")
public class DeptNoLimitChildVO {
    @ApiModelProperty("部门/项目部名称")
    private String deptName;
    @ApiModelProperty("部门/项目部id")
    private String deptId;
}
ruoyi-system/src/main/java/com/ruoyi/system/vo/system/DeptNoLimitParentVO.java
New file
@@ -0,0 +1,19 @@
package com.ruoyi.system.vo.system;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.util.List;
@Data
@ApiModel(value = "片区不分页列表VO")
public class DeptNoLimitParentVO {
    @ApiModelProperty("部门/项目部名称")
    private String deptName;
    @ApiModelProperty("部门/项目部id")
    private String deptId;
    @ApiModelProperty("下级部门/项目部")
    private List<DeptNoLimitChildVO> deptChild;
}
ruoyi-system/src/main/java/com/ruoyi/system/vo/system/DeptNoLimitVO.java
New file
@@ -0,0 +1,20 @@
package com.ruoyi.system.vo.system;
import com.baomidou.mybatisplus.annotation.TableField;
import com.ruoyi.system.model.TAppeal;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.util.List;
@Data
@ApiModel(value = "部门/项目部不分页列表VO")
public class DeptNoLimitVO  {
    @ApiModelProperty("部门/项目部名称")
    private String deptName;
    @ApiModelProperty("部门/项目部id")
    private String deptId;
    @ApiModelProperty("下级部门/项目部")
    private List<DeptNoLimitParentVO> deptChild;
}
ruoyi-system/src/main/java/com/ruoyi/system/vo/system/InspectorVO.java
New file
@@ -0,0 +1,35 @@
package com.ruoyi.system.vo.system;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.math.BigDecimal;
@Data
@ApiModel(value = "随机督察报表VO")
public class InspectorVO {
    @ApiModelProperty("巡检员名称")
    private String nickName;
    @ApiModelProperty("电话")
    private String phonenumber;
    @ApiModelProperty("部门名称")
    private String deptName;
    @ApiModelProperty("总计督察任务数")
    private Integer total;
    @ApiModelProperty("合格")
    private Integer num1;
    @ApiModelProperty("不合格")
    private Integer num2;
    @ApiModelProperty("合格率")
    private BigDecimal num3;
    @ApiModelProperty("待确认")
    private Integer num4;
    @ApiModelProperty("待整改")
    private Integer num5;
    @ApiModelProperty("整改完成")
    private Integer num6;
    @ApiModelProperty("整改完成率")
    private BigDecimal num7;
}
ruoyi-system/src/main/java/com/ruoyi/system/vo/system/LocationTypeListByProjectVO.java
New file
@@ -0,0 +1,19 @@
package com.ruoyi.system.vo.system;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.util.List;
@Data
@ApiModel(value = "作业类型分类VO")
public class LocationTypeListByProjectVO {
    @ApiModelProperty("类型名称")
    private String locationTypeName;
    @ApiModelProperty("数量")
    private Integer locationNum;
    @ApiModelProperty("类型id")
    private String id;
}
ruoyi-system/src/main/java/com/ruoyi/system/vo/system/PatrolInspectorVO.java
New file
@@ -0,0 +1,46 @@
package com.ruoyi.system.vo.system;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.math.BigDecimal;
import java.util.List;
@Data
@ApiModel(value = "巡检人员报表VO")
public class PatrolInspectorVO {
    @ApiModelProperty("巡检员名称")
    private String nickName;
    @ApiModelProperty("电话")
    private String phonenumber;
    @ApiModelProperty("项目名称")
    private String deptName;
    @ApiModelProperty("总计任务数")
    private Integer total;
    @ApiModelProperty("合格")
    private Integer num1;
    @ApiModelProperty("不合格")
    private Integer num2;
    @ApiModelProperty("合格率")
    private BigDecimal num3;
    @ApiModelProperty("未执行")
    private Integer num4;
    @ApiModelProperty("待确认")
    private Integer num5;
    @ApiModelProperty("超时")
    private Integer num6;
    @ApiModelProperty("待整改")
    private Integer num7;
    @ApiModelProperty("整改完成")
    private Integer num8;
    @ApiModelProperty("整改完成率")
    private BigDecimal num9;
    @ApiModelProperty("完成数")
    private Integer num10;
    @ApiModelProperty("完成率")
    private BigDecimal num11;
    @ApiModelProperty("请假天数")
    private Integer num12;
}
ruoyi-system/src/main/java/com/ruoyi/system/vo/system/ProgressListVO.java
New file
@@ -0,0 +1,47 @@
package com.ruoyi.system.vo.system;
import cn.afterturn.easypoi.excel.annotation.Excel;
import com.ruoyi.system.model.TTask;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import io.swagger.models.auth.In;
import lombok.Data;
import java.math.BigDecimal;
@Data
@ApiModel(value = "任务进度列表分页VO")
public class ProgressListVO  extends TTask {
    @Excel(name = "姓名", width = 20,orderNum = "1")
    @ApiModelProperty(value = "姓名")
    private String nickName;
    @Excel(name = "电话", width = 20,orderNum = "2")
    @ApiModelProperty(value = "电话")
    private String phonenumber;
    @Excel(name = "所属部门", width = 20,orderNum = "3")
    @ApiModelProperty(value = "所属部门")
    private String deptName;
    @Excel(name = "计划名称", width = 20,orderNum = "4")
    @ApiModelProperty("计划名称")
    private String templateName;
    @Excel(name = "计划周期", width = 20,orderNum = "5")
    @ApiModelProperty("计划周期")
    private String templateDate;
    @Excel(name = "应生成计划数", width = 20,orderNum = "6")
    @ApiModelProperty(value = "应生成计划数")
    private Integer num1;
    @Excel(name = "已生成任务数", width = 20,orderNum = "7")
    @ApiModelProperty(value = "已生成任务数")
    private Integer num2;
    @Excel(name = "已完成任务数", width = 20,orderNum = "9")
    @ApiModelProperty(value = "已完成任务数")
    private Integer num3;
    @Excel(name = "任务进度(%)", width = 20,orderNum = "9")
    @ApiModelProperty(value = "任务进度(%)")
    private BigDecimal num4;
    @Excel(name = "计划请假天数", width = 20,orderNum = "9")
    @ApiModelProperty(value = "计划请假天数")
    private Long num5;
}
ruoyi-system/src/main/java/com/ruoyi/system/vo/system/ProjectDeptDetailsChildVO.java
New file
@@ -0,0 +1,39 @@
package com.ruoyi.system.vo.system;
import com.ruoyi.system.model.TProjectDept;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import io.swagger.models.auth.In;
import lombok.Data;
import java.util.List;
@Data
@ApiModel(value = "片区VO")
public class ProjectDeptDetailsChildVO  {
    @ApiModelProperty("作业类型分类")
    private List<LocationTypeListByProjectVO> locationTypeList;
    @ApiModelProperty("片区名称")
    private String projectChildName;
    @ApiModelProperty("片区id")
    private String projectId;
    @ApiModelProperty("总数")
    private Integer total;
    @ApiModelProperty("清洁合格")
    private Integer num1;
    @ApiModelProperty("清洁不合格")
    private Integer num2;
    @ApiModelProperty("未执行任务")
    private Integer num3;
    @ApiModelProperty("待整改任务")
    private Integer num4;
    @ApiModelProperty("审核通过任务")
    private Integer num5;
    @ApiModelProperty("超时未执行任务")
    private Integer num6;
    @ApiModelProperty("整改完成任务")
    private Integer num7;
}
ruoyi-system/src/main/java/com/ruoyi/system/vo/system/ProjectDeptDetailsVO.java
New file
@@ -0,0 +1,18 @@
package com.ruoyi.system.vo.system;
import com.ruoyi.system.model.TProjectDept;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.util.List;
@Data
@ApiModel(value = "任务报表VO")
public class ProjectDeptDetailsVO  {
    @ApiModelProperty("片区")
    private List<ProjectDeptDetailsChildVO> projectChild;
    @ApiModelProperty("项目名称")
    private String projectName;
}
ruoyi-system/src/main/java/com/ruoyi/system/vo/system/TaskDetailsVO.java
New file
@@ -0,0 +1,20 @@
package com.ruoyi.system.vo.system;
import cn.afterturn.easypoi.excel.annotation.Excel;
import com.ruoyi.system.model.TProjectDept;
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;
@Data
@ApiModel(value = "任务报表VO")
public class TaskDetailsVO {
    @ApiModelProperty(value = "项目")
    private List<ProjectDeptDetailsVO>  project;
}
ruoyi-system/src/main/java/com/ruoyi/system/vo/system/TaskWarningVO.java
New file
@@ -0,0 +1,30 @@
package com.ruoyi.system.vo.system;
import cn.afterturn.easypoi.excel.annotation.Excel;
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;
@Data
@ApiModel(value = "任务预警列表分页VO")
public class TaskWarningVO extends TEarlyWarning {
    @ApiModelProperty(value = "点位名称")
    private String locationName;
    @ApiModelProperty(value = "部门名称")
    private String deptName;
    @ApiModelProperty("巡查员名称")
    private String patrolInspectorName;
    @ApiModelProperty("巡查员id")
    private String patrolInspector;
    @ApiModelProperty("电话")
    private String phonenumber;
    @ApiModelProperty("关联任务编号 多个逗号拼接")
    private String taskCode;
}
ruoyi-system/src/main/resources/mapper/system/SysRoleMapper.xml
@@ -161,6 +161,18 @@
            #{item}
        </foreach>
    </select>
    <select id="listNotPageByTemplateId" resultType="com.ruoyi.common.core.domain.entity.SysRole">
select * from
    sys_role
where template_id = #{templateId}
and
    del_flag =0
and
    status = 0
    </select>
    <insert id="insertRole" parameterType="SysRole" useGeneratedKeys="true" keyProperty="roleId">
         insert into sys_role(
ruoyi-system/src/main/resources/mapper/system/SysUserMapper.xml
@@ -222,6 +222,8 @@
    </select>
    <select id="selectAllList" resultType="com.ruoyi.common.core.domain.entity.SysUser">
        select * from sys_user
        where del_flag = 0
    </select>
    <select id="pageList" resultType="com.ruoyi.system.vo.system.SysUserVO">
        select u.user_id AS userId, u.deptId AS deptId, u.user_name AS userName, u.nick_name AS nickName, u.email AS email, u.avatar AS avatar,u.disable_remark AS disableRemark,
@@ -234,7 +236,12 @@
        left join sys_role r on r.role_id = ur.role_id
        LEFT JOIN t_template t1 on t1.id = u.templateId
        WHERE u.del_flag = 0
        <if test="query.patrolInspectorIds != null and query.patrolInspectorIds.size()>0">
            AND u.user_id IN
            <foreach collection="query.patrolInspectorIds" separator="," item="id" open="(" close=")">
                #{id}
            </foreach>
        </if>
        <if test="query.nickName != null and query.nickName != ''">
            AND u.nick_name LIKE concat('%',#{query.nickName},'%')
        </if>
@@ -263,6 +270,26 @@
               u.login_date AS loginDate, u.create_by AS createBy, u.create_time AS createTime, u.remark AS remark,u.templateId
        from sys_user u where u.templateId = #{templateId} and u.status = 0 and u.del_flag = 0
    </select>
    <select id="selectUserByDeptId" resultType="com.ruoyi.common.core.domain.entity.SysUser">
    select  * from sys_user
    where deptId = #{id}
    and status = 0
    and del_flag = 0
    </select>
    <select id="pageListReport" resultType="com.ruoyi.system.applet.vo.TaskFinishListVO">
        select t1.*,t1.user_id as userId from
            sys_user t1
        where 1=1
            <if test="query.projectIds != null and query.projectIds.size()>0">
                AND t1.deptId IN
                <foreach collection="query.projectIds" separator="," item="id" open="(" close=")">
                    #{id}
                </foreach>
            </if>
        and t1.status = '0'
        and t1.del_flag = '0'
        and t1.dept_type = 1
    </select>
    <insert id="insertUser" parameterType="SysUser" useGeneratedKeys="true" keyProperty="userId">
         insert into sys_user(
ruoyi-system/src/main/resources/mapper/system/TCleanerMapper.xml
@@ -29,7 +29,7 @@
                and t1.cleaner_name like concat('%', #{query.cleanerName}, '%')
            </if>
            <if test="query.projectId != null and query.projectId != ''">
                 and t1.projectId = #{query.projectId}
                 and t1.project_id = #{query.projectId}
            </if>
            and  t1.disabled  = ${@com.ruoyi.common.enums.DisabledEnum@NO.getCode()}
        </where>
ruoyi-system/src/main/resources/mapper/system/TEarlyWarningMapper.xml
@@ -18,5 +18,18 @@
    <sql id="Base_Column_List">
        id, create_time, update_time, create_by, update_by, disabled, warning_type, task_id
    </sql>
    <select id="pageList" resultType="com.ruoyi.system.vo.system.TaskWarningVO">
        select t1.*  from t_early_warning t1
        where 1=1
        <if test="query.taskIds != null and query.taskIds.size() > 0">
            <foreach collection="query.taskIds" item="taskId" separator=" OR " open="AND (" close=")">
                FIND_IN_SET(#{taskId}, t1.task_id)
            </foreach>
        </if>
        <if test="query.startTime != null and startTime != ''">
            and (t1.create_time between #{startTime} and #{endTime})
        </if>
        and t1.`disabled` = ${@com.ruoyi.common.enums.DisabledEnum@NO.getCode()}
    </select>
</mapper>
ruoyi-system/src/main/resources/mapper/system/TLocationMapper.xml
@@ -26,7 +26,7 @@
        id, create_time, update_time, create_by, update_by, disabled, location_code, location_name, project_id, location_leader, location_cleaner, location_type, location_address, location_lon, location_lat
    </sql>
    <select id="pageList" resultType="com.ruoyi.system.vo.system.LocationListVO">
        select t1.*,t2.name as locationTypeName,t3.cleaner_name as cleanerName from t_location t1
        select t1.*,t2.location_name as locationTypeName,t3.cleaner_name as cleanerName from t_location t1
        left join  t_location_type t2 on t1.location_type = t2.id
        left join  t_cleaner t3 on t1.location_cleaner = t3.id
        where 1=1
ruoyi-system/src/main/resources/mapper/system/TTaskMapper.xml
@@ -4,31 +4,32 @@
    <!-- 通用查询映射结果 -->
    <resultMap id="BaseResultMap" type="com.ruoyi.system.model.TTask">
        <id column="id" property="id" />
        <result column="create_time" property="createTime" />
        <result column="update_time" property="updateTime" />
        <result column="create_by" property="createBy" />
        <result column="update_by" property="updateBy" />
        <result column="disabled" property="disabled" />
        <result column="project_id" property="projectId" />
        <result column="status" property="status" />
        <result column="cleaner_id" property="cleanerId" />
        <result column="location_id" property="locationId" />
        <result column="patrol_inspector" property="patrolInspector" />
        <result column="implement_time" property="implementTime" />
        <result column="task_type" property="taskType" />
        <result column="patrol_inspector_dept" property="patrolInspectorDept" />
        <id column="id" property="id"/>
        <result column="create_time" property="createTime"/>
        <result column="update_time" property="updateTime"/>
        <result column="create_by" property="createBy"/>
        <result column="update_by" property="updateBy"/>
        <result column="disabled" property="disabled"/>
        <result column="project_id" property="projectId"/>
        <result column="status" property="status"/>
        <result column="cleaner_id" property="cleanerId"/>
        <result column="location_id" property="locationId"/>
        <result column="patrol_inspector" property="patrolInspector"/>
        <result column="implement_time" property="implementTime"/>
        <result column="task_type" property="taskType"/>
        <result column="patrol_inspector_dept" property="patrolInspectorDept"/>
    </resultMap>
    <!-- 通用查询结果列 -->
    <sql id="Base_Column_List">
        id, create_time, update_time, create_by, update_by, disabled, project_id, status, cleaner_id, location_id, patrol_inspector, implement_time, task_type, patrol_inspector_dept
        id
        , create_time, update_time, create_by, update_by, disabled, project_id, status, cleaner_id, location_id, patrol_inspector, implement_time, task_type, patrol_inspector_dept
    </sql>
    <select id="pageList" resultType="com.ruoyi.system.vo.system.LocationListTaskVO">
    <select id="pageList" resultType="com.ruoyi.system.vo.system.TaskListVO">
        select t1.*,t2.location_name as locationName,t3.location_name as locationTypeName,
               t4.nick_name as patrolInspectorName,
               t4.phonenumber as phonenumber
               from t_task t1
        t4.nick_name as patrolInspectorName,
        t4.phonenumber as phonenumber
        from t_task t1
        left join t_location t2 on t1.location_id = t2.id
        left join t_location_type t3 on t2.location_type = t3.id
        left join sys_user t4 on t1.patrol_inspector = t4.user_id
@@ -40,13 +41,13 @@
                #{id}
            </foreach>
        </if>
          <if test="query.taskIds != null and query.taskIds.size()>0">
        <if test="query.taskIds != null and query.taskIds.size()>0">
            AND t1.id IN
            <foreach collection="query.taskIds" separator="," item="id" open="(" close=")">
                #{id}
            </foreach>
        </if>
          <if test="query.locationIds != null and query.locationIds.size()>0">
        <if test="query.locationIds != null and query.locationIds.size()>0">
            AND t1.location_id IN
            <foreach collection="query.locationIds" separator="," item="id" open="(" close=")">
                #{id}
@@ -55,13 +56,13 @@
        <if test="query.status != null">
            and t1.status = #{query.status}
        </if>
        <if test="query.startTime != null and startTime != ''">
        <if test="query.startTime != null and query.startTime != ''">
            and (t1.implement_time between #{query.startTime} and #{query.endTime})
        </if>
    </select>
    <select id="pageListUser" resultType="com.ruoyi.system.applet.vo.TaskUserListVO">
        select t1.*,t2.location_name as locationName,t3.location_name as locationTypeName,
               t3.location_icon as locatioTypeIcon,
        t3.location_icon as locatioTypeIcon,
        t5.clear_status as clearStatus,
        t4.nick_name as patrolInspectorName,
        t4.phonenumber as phonenumber,
@@ -103,7 +104,7 @@
        <if test="query.clearStatus != null">
            and t2.status = #{query.clearStatus}
        </if>
          <if test="query.userId != null and query.userId != ''">
        <if test="query.userId != null and query.userId != ''">
            and t1.patrol_inspector = #{query.userId}
        </if>
        <if test="query.startTime != null and startTime != ''">
@@ -145,5 +146,29 @@
            and (t1.implement_time between #{query.startTime} and #{query.endTime})
        </if>
    </select>
    <select id="taskProgress" 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>
ruoyi-system/src/main/resources/mapper/system/TTemplateMapper.xml
@@ -26,6 +26,9 @@
        <if test="query.templateName != null and query.templateName != ''">
            and template_name like concat('%',#{query.templateName},'%')
        </if>
        <if test="query.startTime != null and query.startTime != '' and query.endTime != null and query.endTime != ''">
            and create_time between #{query.startTime} and #{query.endTime}
        </if>
        and disabled = ${@com.ruoyi.common.enums.DisabledEnum@NO.getCode()}
    </select>