无关风月
6 天以前 53d014edd19f57125c355abe71ec5b478500e610
保洁巡检所有代码
37个文件已修改
10个文件已添加
2606 ■■■■ 已修改文件
ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/ReportController.java 87 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/TAppealController.java 398 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/TCleanerController.java 115 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/TInspectorController.java 367 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/TLocationController.java 14 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/TTaskController.java 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/WorkbenchesController.java 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysUserController.java 289 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/web/controller/task/TaskUtil.java 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/web/controller/tool/EmailUtils.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/resources/application.yml 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-applet/src/main/java/com/ruoyi/web/controller/api/TIndexController.java 76 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-applet/src/main/java/com/ruoyi/web/controller/api/TTaskDetailController.java 64 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-applet/src/main/java/com/ruoyi/web/controller/api/TUserController.java 286 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-applet/src/main/resources/application.yml 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/applet/dto/AppealInspectorDTO.java 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/applet/vo/InspectorUserListVO.java 30 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/applet/vo/TaskPendingVO.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/dto/InspectorDetailDto.java 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/dto/TInspectorAuditDTO.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/importExcel/TCleanerImportExcel.java 24 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/importExcel/TSysUserImportExcel.java 31 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/mapper/TAppealMapper.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/mapper/TInspectorDetailMapper.java 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/mapper/TInspectorMapper.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/mapper/TTaskMapper.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/model/TAppeal.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/model/TInspector.java 15 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/model/TInspectorDetail.java 97 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/service/TAppealService.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/service/TInspectorDetailService.java 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/service/TLocationService.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/service/TTaskCleanService.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysUserServiceImpl.java 11 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TAppealServiceImpl.java 45 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TCleanerServiceImpl.java 4 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TEarlyWarningServiceImpl.java 14 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TInspectorDetailServiceImpl.java 23 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TInspectorServiceImpl.java 97 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TLeaveServiceImpl.java 20 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TLocationServiceImpl.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TTaskCleanServiceImpl.java 84 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/vo/system/InspectorDetailVO.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/vo/system/InspectorRecordDetailVO.java 24 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/resources/mapper/system/TAppealMapper.xml 74 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/resources/mapper/system/TInspectorMapper.xml 95 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/resources/mapper/system/TTaskMapper.xml 77 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/ReportController.java
@@ -77,6 +77,8 @@
    @Resource
    private ISysUserService sysUserService;
    @Resource
    private TInspectorDetailService inspectorDetailService;
    @Resource
    private TDictDataService dictDataService;
    @Resource
    private TokenService tokenService;
@@ -838,7 +840,9 @@
                    if (tProjectDept1 != null)
                        patrolInspectorVO.setDeptName(tProjectDept1.getProjectName() + ">" + tProjectDept.getProjectName());
                } else {
                    patrolInspectorVO.setDeptName(tProjectDept.getProjectName());
                    if (tProjectDept != null){
                        patrolInspectorVO.setDeptName(tProjectDept.getProjectName());
                    }
                }
            } else {
                TDept tDept = deptService.getById(sysUser.getDeptId());
@@ -1116,8 +1120,10 @@
    @PostMapping(value = "/inspectorList")
    public R<List<InspectorVO>> inspectorList(@RequestBody InspectorQuery query) {
        List<SysUser> sysUsers = sysUserService.selectAllList();
        List<TInspectorDetail> list2 = inspectorDetailService.list();
        List<TTask> listAll = taskCleanerService.list();
        List<String> listAllTaskIds = listAll.stream().map(TTask::getId).collect(Collectors.toList());
        List<TLocation> locations = locationService.list();
        if (StringUtils.hasLength(query.getDeptName())) {
            List<TProjectDept> list = projectDeptService.lambdaQuery().like(TProjectDept::getProjectName, query.getDeptName()).list();
            List<String> projectIds = list
@@ -1186,7 +1192,6 @@
            query.setPatrolInspectorIds(patrolInspectorIds);
        }
        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());
@@ -1198,16 +1203,22 @@
                patrolInspectorIds.add(0L);
                query.setPatrolInspectorIds(patrolInspectorIds);
            }
            tTaskLambdaQueryWrapper.in(TInspector::getCommitPerson, query.getPatrolInspectorIds());
            List<String> collect = locations.stream().filter(e -> query.getPatrolInspectorIds().contains(Long.valueOf(e.getLocationLeader())))
                    .map(TLocation::getId).collect(Collectors.toList());
            tTaskLambdaQueryWrapper.in(TInspector::getLocationId, collect);
            sysUsers = sysUsers.stream().filter(sysUser -> query.getPatrolInspectorIds().contains(sysUser.getUserId())).collect(Collectors.toList());
        }
        List<InspectorVO> res = new ArrayList<>();
        List<TInspector> inspectors = inspectorService.list(tTaskLambdaQueryWrapper);
        List<String> users = inspectors.stream().map(TInspector::getCommitPerson).collect(Collectors.toList());
        if (users.isEmpty()){
            users.add("0");
        List<String> locationIds = inspectors.stream().map(TInspector::getLocationId).collect(Collectors.toList());
        if (locationIds.isEmpty()){
            locationIds.add("0");
        }
        sysUsers = sysUsers.stream().filter(e -> e.getUserId() != 1&&users.contains(e.getUserId()+"")).collect(Collectors.toList());        for (SysUser sysUser : sysUsers) {
        List<String> userIds = locations.stream().filter(e -> locationIds.contains(e.getId())).map(TLocation::getLocationLeader)
                .collect(Collectors.toList());
        sysUsers = sysUsers.stream().filter(e -> e.getUserId() != 1&&userIds.contains(e.getUserId()+"")).collect(Collectors.toList());
        for (SysUser sysUser : sysUsers) {
            InspectorVO inspectorVO = new InspectorVO();
            inspectorVO.setNickName(sysUser.getNickName());
            inspectorVO.setPhonenumber(sysUser.getPhonenumber());
@@ -1225,22 +1236,25 @@
                if (tDept != null)
                    inspectorVO.setDeptName(tDept.getDeptName());
            }
            List<String> collect1 = listAll.stream().filter(e -> e.getPatrolInspector().equals(sysUser.getUserId() + "")).map(TTask::getId).collect(Collectors.toList());
            List<TInspector> collect = inspectors.stream().filter(e -> collect1.contains(e.getTaskId())).collect(Collectors.toList());
            List<String> collect1 = locations.stream().filter(e -> e.getLocationLeader().equals(sysUser.getUserId() + "")).map(TLocation::getId).collect(Collectors.toList());
            List<TInspector> collect = inspectors.stream().filter(e -> collect1.contains(e.getLocationId())).collect(Collectors.toList());
            List<String> collect3 = collect.stream().map(TInspector::getId).collect(Collectors.toList());
            List<TInspectorDetail> collect2 = list2.stream().filter(e -> collect3.contains(e.getInspectorId()))
                    .collect(Collectors.toList());
            inspectorVO.setTotal(collect.size());
            List<TInspector> status1 = collect.stream().filter(e -> e.getClearStatus() == 1).collect(Collectors.toList());
            List<TInspector> status2 = collect.stream().filter(e -> e.getClearStatus() == 2).collect(Collectors.toList());
            List<TInspector> status4 = collect.stream().filter(e -> e.getStatus() == 1).collect(Collectors.toList());
            List<TInspector> status5 = collect.stream().filter(e -> e.getStatus() == 2).collect(Collectors.toList());
            List<TInspector> status6 = collect.stream().filter(e -> e.getStatus() == 3).collect(Collectors.toList());
            inspectorVO.setNum1(status1.size());
            inspectorVO.setNum2(status2.size());
            inspectorVO.setNum3(!status1.isEmpty() || !status2.isEmpty() ? new BigDecimal(status1.size()).divide(new BigDecimal(status2.size() + status1.size()), 2, RoundingMode.HALF_DOWN).multiply(new BigDecimal(100)) : BigDecimal.ZERO);
            inspectorVO.setNum3(!status1.isEmpty() ? new BigDecimal(status1.size()).divide(new BigDecimal(status2.size() + status1.size()), 2, RoundingMode.HALF_DOWN) : BigDecimal.ZERO);
            inspectorVO.setNum4(status4.size());
            inspectorVO.setNum5(status5.size());
            inspectorVO.setNum6(status6.size());
            inspectorVO.setNum7(!status6.isEmpty() || !status5.isEmpty() ? new BigDecimal(status6.size()).divide(new BigDecimal(status5.size() + status6.size()), 2, RoundingMode.HALF_DOWN).multiply(new BigDecimal(100)) : new BigDecimal(0));
            inspectorVO.setNum7(!status6.isEmpty() ? new BigDecimal(status6.size()).divide(new BigDecimal(status5.size() + status6.size()), 2, RoundingMode.HALF_DOWN) : new BigDecimal(0));
            res.add(inspectorVO);
        }
        return R.ok(res);
@@ -1252,8 +1266,10 @@
    public void inspectorListExport(@RequestBody InspectorQuery query) {
        query.setPatrolInspectorIds(null);
        List<SysUser> sysUsers = sysUserService.selectAllList();
        List<TInspectorDetail> list2 = inspectorDetailService.list();
        List<TTask> listAll = taskCleanerService.list();
        List<String> listAllTaskIds = listAll.stream().map(TTask::getId).collect(Collectors.toList());
        List<TLocation> locations = locationService.list();
        if (StringUtils.hasLength(query.getDeptName())) {
            List<TProjectDept> list = projectDeptService.lambdaQuery().like(TProjectDept::getProjectName, query.getDeptName()).list();
            List<String> projectIds = list
@@ -1295,6 +1311,19 @@
                }
            }
        }
        if (StringUtils.hasLength(query.getNickName())){
            List<Long> patrolInspectorIds = sysUsers.stream().filter(sysUser ->
                    sysUser.getNickName().contains(query.getNickName())
            ).map(SysUser::getUserId).collect(Collectors.toList());
            if (query.getPatrolInspectorIds()!=null&&!query.getPatrolInspectorIds().isEmpty()){
                // 取交集
                patrolInspectorIds = patrolInspectorIds.stream().filter(query.getPatrolInspectorIds()::contains).collect(Collectors.toList());
            }
            if (patrolInspectorIds.isEmpty()){
                patrolInspectorIds.add(-1L);
            }
            query.setPatrolInspectorIds(patrolInspectorIds);
        }
        if (StringUtils.hasLength(query.getPhonenumber())){
            List<Long> patrolInspectorIds = sysUsers.stream().filter(sysUser ->
                    sysUser.getPhonenumber().contains(query.getPhonenumber())
@@ -1307,10 +1336,8 @@
                patrolInspectorIds.add(-1L);
            }
            query.setPatrolInspectorIds(patrolInspectorIds);
        }
        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());
@@ -1322,16 +1349,21 @@
                patrolInspectorIds.add(0L);
                query.setPatrolInspectorIds(patrolInspectorIds);
            }
            tTaskLambdaQueryWrapper.in(TInspector::getCommitPerson, query.getPatrolInspectorIds());
            List<String> collect = locations.stream().filter(e -> query.getPatrolInspectorIds().contains(Long.valueOf(e.getLocationLeader())))
                    .map(TLocation::getId).collect(Collectors.toList());
            tTaskLambdaQueryWrapper.in(TInspector::getLocationId, collect);
            sysUsers = sysUsers.stream().filter(sysUser -> query.getPatrolInspectorIds().contains(sysUser.getUserId())).collect(Collectors.toList());
        }
        List<InspectorVO> res = new ArrayList<>();
        List<TInspector> inspectors = inspectorService.list(tTaskLambdaQueryWrapper);
        List<String> users = inspectors.stream().map(TInspector::getCommitPerson).collect(Collectors.toList());
        if (users.isEmpty()){
            users.add("0");
        List<String> locationIds = inspectors.stream().map(TInspector::getLocationId).collect(Collectors.toList());
        if (locationIds.isEmpty()){
            locationIds.add("0");
        }
        sysUsers = sysUsers.stream().filter(e -> e.getUserId() != 1&&users.contains(e.getUserId()+"")).collect(Collectors.toList());
        List<String> userIds = locations.stream().filter(e -> locationIds.contains(e.getId())).map(TLocation::getLocationLeader)
                .collect(Collectors.toList());
        sysUsers = sysUsers.stream().filter(e -> e.getUserId() != 1&&userIds.contains(e.getUserId()+"")).collect(Collectors.toList());
        for (SysUser sysUser : sysUsers) {
            InspectorVO inspectorVO = new InspectorVO();
            inspectorVO.setNickName(sysUser.getNickName());
@@ -1350,22 +1382,25 @@
                if (tDept != null)
                    inspectorVO.setDeptName(tDept.getDeptName());
            }
            List<String> collect1 = listAll.stream().filter(e -> e.getPatrolInspector().equals(sysUser.getUserId() + "")).map(TTask::getId).collect(Collectors.toList());
            List<TInspector> collect = inspectors.stream().filter(e -> collect1.contains(e.getTaskId())).collect(Collectors.toList());
            List<String> collect1 = locations.stream().filter(e -> e.getLocationLeader().equals(sysUser.getUserId() + "")).map(TLocation::getId).collect(Collectors.toList());
            List<TInspector> collect = inspectors.stream().filter(e -> collect1.contains(e.getLocationId())).collect(Collectors.toList());
            List<String> collect3 = collect.stream().map(TInspector::getId).collect(Collectors.toList());
            List<TInspectorDetail> collect2 = list2.stream().filter(e -> collect3.contains(e.getInspectorId()))
                    .collect(Collectors.toList());
            inspectorVO.setTotal(collect.size());
            List<TInspector> status1 = collect.stream().filter(e -> e.getClearStatus() == 1).collect(Collectors.toList());
            List<TInspector> status2 = collect.stream().filter(e -> e.getClearStatus() == 2).collect(Collectors.toList());
            List<TInspector> status4 = collect.stream().filter(e -> e.getStatus() == 1).collect(Collectors.toList());
            List<TInspector> status5 = collect.stream().filter(e -> e.getStatus() == 2).collect(Collectors.toList());
            List<TInspector> status6 = collect.stream().filter(e -> e.getStatus() == 3).collect(Collectors.toList());
            inspectorVO.setNum1(status1.size());
            inspectorVO.setNum2(status2.size());
            inspectorVO.setNum3(!status1.isEmpty() || !status2.isEmpty() ? new BigDecimal(status1.size()).divide(new BigDecimal(status2.size() + status1.size()), 2, RoundingMode.HALF_DOWN).multiply(new BigDecimal(100)) : BigDecimal.ZERO);
            inspectorVO.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() || !status5.isEmpty() ? new BigDecimal(status6.size()).divide(new BigDecimal(status5.size() + status6.size()), 2, RoundingMode.HALF_DOWN).multiply(new BigDecimal(100)) : new BigDecimal(0));
            inspectorVO.setNum7(!status6.isEmpty() ? new BigDecimal(status6.size()).divide(new BigDecimal(status5.size() + status6.size()), 2, RoundingMode.HALF_DOWN).multiply(new BigDecimal("100")) : new BigDecimal(0));
            res.add(inspectorVO);
        }
        //1.获取excel模板
ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/TAppealController.java
@@ -51,8 +51,6 @@
    private TTaskCleanService taskCleanService;
    @Resource
    private TLocationTypeService locationTypeService;
    @Resource
@@ -72,17 +70,22 @@
    @Resource
    private TAppealService appealService;
    @Resource
    private TInspectorService inspectorService;
    @Resource
    private TInspectorDetailService inspectorDetailService;
    @ApiOperation(value = "申诉记录分页列表")
    @PostMapping(value = "/pageList")
    public R<PageInfo<AppealListVO>> pageList(@RequestBody InsepectorListQuery query) {
        List<SysUser> sysUsers = sysUserService.selectAllList();
        List<TLocation> locationList = locationService.list();
        if (StringUtils.hasLength(query.getDeptName())){
        if (StringUtils.hasLength(query.getDeptName())) {
            List<TProjectDept> list = projectDeptService.lambdaQuery().like(TProjectDept::getProjectName, query.getDeptName()).list();
            List<String> listIds = projectDeptService.lambdaQuery().like(TProjectDept::getProjectName, query.getDeptName()).list()
                    .stream().map(TProjectDept::getId).collect(Collectors.toList());
            for (TProjectDept tProjectDept : list) {
                if (tProjectDept.getParentId().equals("0")){
                if (tProjectDept.getParentId().equals("0")) {
                    List<String> collect = projectDeptService.lambdaQuery().eq(TProjectDept::getParentId, tProjectDept.getId()).list()
                            .stream().map(TProjectDept::getId).collect(Collectors.toList());
                    listIds.addAll(collect);
@@ -91,69 +94,69 @@
            List<String> deptIds = deptService.lambdaQuery().like(TDept::getDeptName, query.getDeptName()).list()
                    .stream().map(TDept::getId).collect(Collectors.toList());
            listIds.addAll(deptIds);
            if (listIds.isEmpty()){
            if (listIds.isEmpty()) {
                listIds.add("0");
            }
            if (listIds.contains("0")){
            if (listIds.contains("0")) {
                query.setPatrolInspectorIds(Collections.singletonList(0L));
            }else{
                query.setPatrolInspectorIds(sysUsers.stream().filter(e->listIds.contains(e.getDeptId())).map(SysUser::getUserId)
            } else {
                query.setPatrolInspectorIds(sysUsers.stream().filter(e -> listIds.contains(e.getDeptId())).map(SysUser::getUserId)
                        .collect(Collectors.toList()));
            }
            if (StringUtils.hasLength(query.getPhonenumber())){
            if (StringUtils.hasLength(query.getPhonenumber())) {
                List<Long> patrolInspectorIds = sysUsers.stream().filter(sysUser ->
                        sysUser.getPhonenumber().contains(query.getPhonenumber())
                                && listIds.contains(sysUser.getDeptId())
                ).map(SysUser::getUserId).collect(Collectors.toList());
                if (patrolInspectorIds.isEmpty()){
                if (patrolInspectorIds.isEmpty()) {
                    return R.ok(new PageInfo<>());
                }
                query.setPatrolInspectorIds(patrolInspectorIds);
            }
        }
        if (StringUtils.hasLength(query.getPhonenumber())){
        if (StringUtils.hasLength(query.getPhonenumber())) {
            List<Long> patrolInspectorIds = sysUsers.stream().filter(sysUser ->
                    sysUser.getPhonenumber().contains(query.getPhonenumber())
            ).map(SysUser::getUserId).collect(Collectors.toList());
            if (!CollectionUtils.isEmpty(query.getPatrolInspectorIds())){
            if (!CollectionUtils.isEmpty(query.getPatrolInspectorIds())) {
                // 取交集
                patrolInspectorIds = patrolInspectorIds.stream().filter(query.getPatrolInspectorIds()::contains).collect(Collectors.toList());
            }
            query.setPatrolInspectorIds(patrolInspectorIds);
            if (patrolInspectorIds.isEmpty()){
            if (patrolInspectorIds.isEmpty()) {
                return R.ok(new PageInfo<>());
            }
        }
        if (query.getClearStatus()!=null){
        if (query.getClearStatus() != null) {
            List<String> collect = tTaskDetailService.lambdaQuery().eq(TTaskDetail::getClearStatus, query.getClearStatus())
                    .eq(TTaskDetail::getHandleType,1)
                    .eq(TTaskDetail::getHandleType, 1)
                    .groupBy(TTaskDetail::getTaskId)
                    .orderByDesc(BaseModel::getCreateTime)
                    .list().stream().map(TTaskDetail::getTaskId).collect(Collectors.toList());
            query.setTaskIds(collect);
            if (collect.isEmpty()){
            if (collect.isEmpty()) {
                return R.ok(new PageInfo<>());
            }
        }
        if (query.getLocationType()!=null){
        if (query.getLocationType() != null) {
            List<String> collect = locationList.stream().filter(e -> e.getLocationType().equals(query.getLocationType())).map(TLocation::getId)
                    .collect(Collectors.toList());
            if (collect.isEmpty()){
            if (collect.isEmpty()) {
                return R.ok(new PageInfo<>());
            }
            query.setLocationIds(collect);
        }
        if (StringUtils.hasLength(query.getLocationName())){
        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()){
            if (collect.isEmpty()) {
                query.setLocationIds(collect);
                return R.ok(new PageInfo<>());
            }else{
                if (query.getLocationIds()!=null){
            } else {
                if (query.getLocationIds() != null) {
                    collect = collect.stream().filter(query.getLocationIds()::contains).collect(Collectors.toList());
                    if (collect.isEmpty()){
                    if (collect.isEmpty()) {
                        return R.ok(new PageInfo<>());
                    }
                }
@@ -162,6 +165,7 @@
        }
        return R.ok(appealService.pageList(query));
    }
    @Log(title = "批量删除申诉记录", businessType = BusinessType.DELETE)
    @ApiOperation(value = "批量删除申诉记录")
    @DeleteMapping(value = "/deleteByIds")
@@ -170,6 +174,7 @@
        appealService.removeBatchByIds(Arrays.asList(split));
        return R.ok();
    }
    @Log(title = "删除申诉记录", businessType = BusinessType.DELETE)
    @ApiOperation(value = "删除申诉记录")
    @DeleteMapping(value = "/deleteById")
@@ -177,30 +182,54 @@
        appealService.removeById(id);
        return R.ok();
    }
    @ApiOperation(value = "详情申诉记录")
    @GetMapping(value = "/detail")
    public R<AppealDetailVO> detail(@RequestParam String id) {
        AppealDetailVO appealDetailVO = new AppealDetailVO();
        TAppeal appeal = appealService.getById(id);
        BeanUtils.copyProperties(appeal,appealDetailVO);
        TTask byId = taskCleanService.getById(appeal.getTaskId());
        TLocation byId1 = locationService.getById(byId.getLocationId());
        TLocationType byId2 = locationTypeService.getById(byId1.getLocationType());
        appealDetailVO.setLocationAddress(byId1.getLocationAddress());
        appealDetailVO.setLocationIcon(byId2.getLocationIcon());
        appealDetailVO.setLocationName(byId1.getLocationName());
        appealDetailVO.setLocationTypeName(byId2.getLocationName());
        appealDetailVO.setTaskId(byId.getId());
        if (appeal.getAuditPerson()!=null){
            SysUser sysUser = sysUserService.selectUserById(Long.valueOf(appeal.getAuditPerson()));
            if (sysUser!=null){
                appealDetailVO.setAuditPersonName(sysUser.getUserName());
        BeanUtils.copyProperties(appeal, appealDetailVO);
        if (appeal.getInspectorId() != null) {
            TInspector inspector = inspectorService.getById(appeal.getInspectorId());
            TLocation location = locationService.getById(inspector.getLocationId());
            TLocationType byId2 = locationTypeService.getById(location.getLocationType());
            appealDetailVO.setLocationAddress(location.getLocationAddress());
            appealDetailVO.setLocationIcon(byId2.getLocationIcon());
            appealDetailVO.setLocationName(location.getLocationName());
            appealDetailVO.setLocationTypeName(byId2.getLocationName());
            appealDetailVO.setTaskId(inspector.getId());
            if (appeal.getAuditPerson() != null) {
                SysUser sysUser = sysUserService.selectUserById(Long.valueOf(appeal.getAuditPerson()));
                if (sysUser != null) {
                    appealDetailVO.setAuditPersonName(sysUser.getUserName());
                }
            }
            appealDetailVO.setTaskName(location.getLocationName());
            return R.ok(appealDetailVO);
        } else {
            TTask byId = taskCleanService.getById(appeal.getTaskId());
            TLocation byId1 = locationService.getById(byId.getLocationId());
            TLocationType byId2 = locationTypeService.getById(byId1.getLocationType());
            appealDetailVO.setLocationAddress(byId1.getLocationAddress());
            appealDetailVO.setLocationIcon(byId2.getLocationIcon());
            appealDetailVO.setLocationName(byId1.getLocationName());
            appealDetailVO.setLocationTypeName(byId2.getLocationName());
            appealDetailVO.setTaskId(byId.getId());
            if (appeal.getAuditPerson() != null) {
                SysUser sysUser = sysUserService.selectUserById(Long.valueOf(appeal.getAuditPerson()));
                if (sysUser != null) {
                    appealDetailVO.setAuditPersonName(sysUser.getUserName());
                }
            }
            appealDetailVO.setTaskName(byId1.getLocationName());
            appealDetailVO.setTaskCode(byId.getTaskCode());
            return R.ok(appealDetailVO);
        }
        appealDetailVO.setTaskName(byId.getTaskName());
        appealDetailVO.setTaskCode(byId.getTaskCode());
        return R.ok(appealDetailVO);
    }
    @Resource
    private TNoticeService noticeService;
    @Resource
@@ -211,114 +240,221 @@
    private TNoticeSetService noticeSetService;
    @Resource
    private TDictDataService dictDataService;
    @Log(title = "审核申诉记录", businessType = BusinessType.UPDATE)
    @ApiOperation(value = "审核申诉记录")
    @PostMapping(value = "/audit")
    public R<Boolean> audit(@RequestBody @Valid TAppealAuditDTO dto) throws Exception {
        List<SysUser> sysUsers = sysUserService.selectAllList();
        TAppeal appeal = appealService.getById(dto.getId());
        SysUser sysUser = sysUsers.stream().filter(e -> e.getUserId().equals(Long.valueOf(appeal.getAppealPerson())))
                .findFirst().orElse(null);
        dto.setStatus(dto.getStatus());
        dto.setAuditPerson(tokenService.getLoginUser().getUserId()+"");
        dto.setAuditTime(LocalDateTime.now());
        TTask task = taskCleanService.getById(appeal.getTaskId());
        TLocation location = locationService.getById(task.getLocationId());
        TNotice tNotice = new TNotice();
        tNotice.setUserId(appeal.getAppealPerson());
        tNotice.setStatus(1);
        tNotice.setDataId(dto.getId());
        dto.setAuditTime(LocalDateTime.now());
        TTaskDetail taskDetail = new TTaskDetail();
        taskDetail.setTaskId(appeal.getTaskId());
        Long count = tTaskDetailService.lambdaQuery().eq(TTaskDetail::getTaskId, appeal.getTaskId())
                .eq(TTaskDetail::getHandleType, 1).count();
        TNoticeSet noticeSet = noticeSetService.lambdaQuery().eq(TNoticeSet::getType, 2).last("limit 1")
                .one();
        // 邮箱
        TDictData email = dictDataService.lambdaQuery().eq(TDictData::getDataType,4).one();
        // 授权码
        TDictData code = dictDataService.lambdaQuery().eq(TDictData::getDataType,5).one();
        if (dto.getStatus()==2){
            taskDetail.setClearStatus(1);
            taskDetail.setAuditTime(LocalDateTime.now());
            taskDetail.setAuditPerson(tokenService.getLoginUser().getUserId()+"");
            taskDetail.setAuditStatus(1);
            taskDetail.setAuditRemark(dto.getAuditRemark());
            taskDetail.setHandleType(5);
            taskDetail.setAppealId(dto.getId());
            // 通过
            TTask byId = taskCleanService.getById(dto.getTaskId());
            if (count>1){
                byId.setStatus(5);
            }else{
                byId.setStatus(6);
        if (appeal.getInspectorId() != null) {
            SysUser sysUser1 = sysUsers.stream().filter(e -> e.getUserId().equals(Long.valueOf(appeal.getAppealPerson())))
                    .findFirst().orElse(null);
            dto.setStatus(dto.getStatus());
            dto.setAuditPerson(tokenService.getLoginUser().getUserId() + "");
            dto.setAuditTime(LocalDateTime.now());
            TInspector inspector = inspectorService.getById(appeal.getInspectorId());
            TLocation location1 = locationService.getById(inspector.getLocationId());
            TNotice tNotice1 = new TNotice();
            tNotice1.setUserId(appeal.getAppealPerson());
            tNotice1.setStatus(1);
            tNotice1.setDataId(dto.getId());
            dto.setAuditTime(LocalDateTime.now());
            TInspectorDetail inspectorDetail = new TInspectorDetail();
            inspectorDetail.setInspectorId(appeal.getInspectorId());
            Long count1 = inspectorDetailService.lambdaQuery().eq(TInspectorDetail::getInspectorId, appeal.getInspectorId())
                    .eq(TInspectorDetail::getHandleType, 1).count();
            TNoticeSet noticeSet1 = noticeSetService.lambdaQuery().eq(TNoticeSet::getType, 2).last("limit 1")
                    .one();
            // 邮箱
            TDictData email1 = dictDataService.lambdaQuery().eq(TDictData::getDataType, 4).one();
            // 授权码
            TDictData code1 = dictDataService.lambdaQuery().eq(TDictData::getDataType, 5).one();
            if (dto.getStatus() == 2) {
                inspectorDetail.setClearStatus(1);
                inspectorDetail.setAuditTime(LocalDateTime.now());
                inspectorDetail.setAuditPerson(tokenService.getLoginUser().getUserId() + "");
                inspectorDetail.setAuditStatus(1);
                inspectorDetail.setAuditRemark(dto.getAuditRemark());
                inspectorDetail.setHandleType(5);
                inspectorDetail.setAppealId(dto.getId());
                // 通过
                TInspector byId = inspectorService.getById(dto.getInspectorId());
                if (count1 > 1) {
                    byId.setStatus(5);
                } else {
                    byId.setStatus(6);
                }
                inspectorService.updateById(byId);
                tNotice1.setNoticeType(5);
                tNotice1.setNoticeContent("【" + location1.getLocationName() + "】任务申诉通过");
                if (sysUser1 != null) {
                    switch (noticeSet1.getNoticeType()) {
                        case 1:
                            msgUtils.sendMsg3(sysUser1.getPhonenumber(), location1.getLocationName(), "通过");
                            break;
                        case 2:
                            if (StringUtils.hasLength(email1.getDataContent()) && StringUtils.hasLength(code1.getDataContent())
                            &&StringUtils.hasLength(sysUser1.getEmail())
                            ) {
                                EmailUtils.sendEmail(sysUser1.getEmail(), email1.getDataContent(), code1.getDataContent(), "【" + location1.getLocationName() + "】任务申诉通过");
                            }
                            break;
                        case 3:
                            if (StringUtils.hasLength(sysUser1.getOpenId())) {
                                Date date = new Date();
            }
                                SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm");
                                String format = simpleDateFormat.format(date);
                                templateMessageSendUtil.wxTemplateAppealResultRequest(sysUser1.getOpenId(),
                                        location1.getLocationName(), "通过", format, dto.getAuditRemark());
                            }
                            break;
                    }
                }
            } else {
                inspectorDetail.setClearStatus(2);
                inspectorDetail.setAuditTime(LocalDateTime.now());
                inspectorDetail.setAuditPerson(tokenService.getLoginUser().getUserId() + "");
                inspectorDetail.setAuditStatus(2);
                inspectorDetail.setAuditRemark(dto.getAuditRemark());
                inspectorDetail.setHandleType(6);
                inspectorDetail.setAppealId(dto.getId());
                tNotice1.setNoticeType(4);
                tNotice1.setNoticeContent("【" + location1.getLocationName() + "】任务申诉驳回");
                if (sysUser1 != null) {
                    switch (noticeSet1.getNoticeType()) {
                        case 1:
                            msgUtils.sendMsg3(sysUser1.getPhonenumber(), location1.getLocationName(), "通过");
                            break;
                        case 2:
                            if (StringUtils.hasLength(email1.getDataContent()) && StringUtils.hasLength(code1.getDataContent())
            taskCleanService.updateById(byId);
            tNotice.setNoticeType(5);
            tNotice.setNoticeContent("【"+location.getLocationName()+"】任务申诉通过");
            if (sysUser!=null){
                switch (noticeSet.getNoticeType()) {
                    case 1:
                        msgUtils.sendMsg3(sysUser.getPhonenumber(),location.getLocationName(),"通过");
                        break;
                    case 2:
                        if (StringUtils.hasLength(email.getDataContent())&&StringUtils.hasLength(code.getDataContent())){
                            EmailUtils.sendEmail(sysUser.getEmail(),email.getDataContent(),code.getDataContent(),"【"+location.getLocationName()+"】任务申诉通过");
                        }
                        break;
                    case 3:
                        if (StringUtils.hasLength(sysUser.getOpenId())){
                            Date date = new Date();
                                    &&StringUtils.hasLength(sysUser1.getEmail())) {
                                EmailUtils.sendEmail(sysUser1.getEmail(), email1.getDataContent(), code1.getDataContent(), "【" + location1.getLocationName() + "】任务申诉驳回");
                            }
                            break;
                        case 3:
                            if (StringUtils.hasLength(sysUser1.getOpenId())) {
                                Date date = new Date();
                            SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm");
                            String format = simpleDateFormat.format(date);
                            templateMessageSendUtil.wxTemplateAppealResultRequest(sysUser.getOpenId(),
                                    location.getLocationName(),"通过",format,dto.getAuditRemark());
                        }
                        break;
                                SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm");
                                String format = simpleDateFormat.format(date);
                                templateMessageSendUtil.wxTemplateAppealResultRequest(sysUser1.getOpenId(),
                                        location1.getLocationName(), "驳回", format, dto.getAuditRemark());
                            }
                            break;
                    }
                }
            }
        }else{
            taskDetail.setClearStatus(2);
            taskDetail.setAuditTime(LocalDateTime.now());
            taskDetail.setAuditPerson(tokenService.getLoginUser().getUserId()+"");
            taskDetail.setAuditStatus(2);
            taskDetail.setAuditRemark(dto.getAuditRemark());
            taskDetail.setHandleType(6);
            taskDetail.setAppealId(dto.getId());
            tNotice.setNoticeType(4);
            tNotice.setNoticeContent("【"+location.getLocationName()+"】任务申诉驳回");
            if (sysUser!=null){
                switch (noticeSet.getNoticeType()) {
                    case 1:
                        msgUtils.sendMsg3(sysUser.getPhonenumber(),location.getLocationName(),"通过");
                        break;
                    case 2:
                        if (StringUtils.hasLength(email.getDataContent())&&StringUtils.hasLength(code.getDataContent())){
                            EmailUtils.sendEmail(sysUser.getEmail(),email.getDataContent(),code.getDataContent(),"【"+location.getLocationName()+"】任务申诉驳回");
                        }
                        break;
                    case 3:
                        if (StringUtils.hasLength(sysUser.getOpenId())){
                            Date date = new Date();
        } else {
            SysUser sysUser = sysUsers.stream().filter(e -> e.getUserId().equals(Long.valueOf(appeal.getAppealPerson())))
                    .findFirst().orElse(null);
            dto.setStatus(dto.getStatus());
            dto.setAuditPerson(tokenService.getLoginUser().getUserId() + "");
            dto.setAuditTime(LocalDateTime.now());
            TTask task = taskCleanService.getById(appeal.getTaskId());
            TLocation location = locationService.getById(task.getLocationId());
            TNotice tNotice = new TNotice();
            tNotice.setUserId(appeal.getAppealPerson());
            tNotice.setStatus(1);
            tNotice.setDataId(dto.getId());
            dto.setAuditTime(LocalDateTime.now());
            TTaskDetail taskDetail = new TTaskDetail();
            taskDetail.setTaskId(appeal.getTaskId());
            Long count = tTaskDetailService.lambdaQuery().eq(TTaskDetail::getTaskId, appeal.getTaskId())
                    .eq(TTaskDetail::getHandleType, 1).count();
            TNoticeSet noticeSet = noticeSetService.lambdaQuery().eq(TNoticeSet::getType, 2).last("limit 1")
                    .one();
            // 邮箱
            TDictData email = dictDataService.lambdaQuery().eq(TDictData::getDataType, 4).one();
            // 授权码
            TDictData code = dictDataService.lambdaQuery().eq(TDictData::getDataType, 5).one();
            if (dto.getStatus() == 2) {
                taskDetail.setClearStatus(1);
                taskDetail.setAuditTime(LocalDateTime.now());
                taskDetail.setAuditPerson(tokenService.getLoginUser().getUserId() + "");
                taskDetail.setAuditStatus(1);
                taskDetail.setAuditRemark(dto.getAuditRemark());
                taskDetail.setHandleType(5);
                taskDetail.setAppealId(dto.getId());
                // 通过
                TTask byId = taskCleanService.getById(dto.getTaskId());
                if (count > 1) {
                    byId.setStatus(5);
                } else {
                    byId.setStatus(6);
                            SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm");
                            String format = simpleDateFormat.format(date);
                            templateMessageSendUtil.wxTemplateAppealResultRequest(sysUser.getOpenId(),
                                    location.getLocationName(),"驳回",format,dto.getAuditRemark());
                        }
                        break;
                }
                taskCleanService.updateById(byId);
                tNotice.setNoticeType(5);
                tNotice.setNoticeContent("【" + location.getLocationName() + "】任务申诉通过");
                if (sysUser != null) {
                    switch (noticeSet.getNoticeType()) {
                        case 1:
                            msgUtils.sendMsg3(sysUser.getPhonenumber(), location.getLocationName(), "通过");
                            break;
                        case 2:
                            if (StringUtils.hasLength(email.getDataContent()) && StringUtils.hasLength(code.getDataContent())
                                    &&StringUtils.hasLength(sysUser.getEmail())) {
                                EmailUtils.sendEmail(sysUser.getEmail(), email.getDataContent(), code.getDataContent(), "【" + location.getLocationName() + "】任务申诉通过");
                            }
                            break;
                        case 3:
                            if (StringUtils.hasLength(sysUser.getOpenId())) {
                                Date date = new Date();
                                SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm");
                                String format = simpleDateFormat.format(date);
                                templateMessageSendUtil.wxTemplateAppealResultRequest(sysUser.getOpenId(),
                                        location.getLocationName(), "通过", format, dto.getAuditRemark());
                            }
                            break;
                    }
                }
            } else {
                taskDetail.setClearStatus(2);
                taskDetail.setAuditTime(LocalDateTime.now());
                taskDetail.setAuditPerson(tokenService.getLoginUser().getUserId() + "");
                taskDetail.setAuditStatus(2);
                taskDetail.setAuditRemark(dto.getAuditRemark());
                taskDetail.setHandleType(6);
                taskDetail.setAppealId(dto.getId());
                tNotice.setNoticeType(4);
                tNotice.setNoticeContent("【" + location.getLocationName() + "】任务申诉驳回");
                if (sysUser != null) {
                    switch (noticeSet.getNoticeType()) {
                        case 1:
                            msgUtils.sendMsg3(sysUser.getPhonenumber(), location.getLocationName(), "通过");
                            break;
                        case 2:
                            if (StringUtils.hasLength(email.getDataContent()) && StringUtils.hasLength(code.getDataContent())
                                    &&StringUtils.hasLength(sysUser.getEmail())) {
                                EmailUtils.sendEmail(sysUser.getEmail(), email.getDataContent(), code.getDataContent(), "【" + location.getLocationName() + "】任务申诉驳回");
                            }
                            break;
                        case 3:
                            if (StringUtils.hasLength(sysUser.getOpenId())) {
                                Date date = new Date();
                                SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm");
                                String format = simpleDateFormat.format(date);
                                templateMessageSendUtil.wxTemplateAppealResultRequest(sysUser.getOpenId(),
                                        location.getLocationName(), "驳回", format, dto.getAuditRemark());
                            }
                            break;
                    }
                }
            }
            noticeService.save(tNotice);
            dto.setAuditPerson(tokenService.getLoginUser().getUserId() + "");
            appealService.updateById(dto);
            tTaskDetailService.save(taskDetail);
        }
        noticeService.save(tNotice);
        dto.setAuditPerson(tokenService.getLoginUser().getUserId()+"");
        appealService.updateById(dto);
        tTaskDetailService.save(taskDetail);
        return R.ok();
    }
}
ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/TCleanerController.java
@@ -1,21 +1,49 @@
package com.ruoyi.web.controller.api;
import cn.afterturn.easypoi.excel.ExcelExportUtil;
import cn.afterturn.easypoi.excel.ExcelImportUtil;
import cn.afterturn.easypoi.excel.entity.ExportParams;
import cn.afterturn.easypoi.excel.entity.ImportParams;
import cn.hutool.json.JSONObject;
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.core.exception.ServiceException;
import com.ruoyi.common.enums.BusinessType;
import com.ruoyi.common.utils.WebUtils;
import com.ruoyi.system.dto.CleanerDTO;
import com.ruoyi.system.importExcel.TCleanerImportExcel;
import com.ruoyi.system.importExcel.TLocationImportExcel;
import com.ruoyi.system.model.TCleaner;
import com.ruoyi.system.model.TLocation;
import com.ruoyi.system.model.TLocationType;
import com.ruoyi.system.model.TProjectDept;
import com.ruoyi.system.query.CleanerListQuery;
import com.ruoyi.system.service.TCleanerService;
import com.ruoyi.system.service.TProjectDeptService;
import com.ruoyi.system.vo.system.CleanerListVO;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.apache.poi.ss.usermodel.Workbook;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.CollectionUtils;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import javax.annotation.Resource;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.InputStream;
import java.net.URLEncoder;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Objects;
/**
 * <p>
@@ -28,9 +56,12 @@
@Api(tags = "保洁员")
@RestController
@RequestMapping("/t-cleaner")
@Slf4j
public class TCleanerController {
    @Resource
    private TCleanerService cleanerService;
    @Resource
    private TProjectDeptService projectDeptService;
    @ApiOperation(value = "保洁员分页列表")
@@ -65,5 +96,89 @@
        cleanerService.removeBatchByIds(Arrays.asList(split));
        return R.ok();
    }
    @Log(title = "保洁员导入", businessType = BusinessType.INSERT)
    @ApiOperation(value = "保洁员导入")
    @Transactional(rollbackFor = Exception.class,propagation = Propagation.REQUIRES_NEW)
    @PostMapping("/importCleaner")
    public R<String> importCleaner(@RequestPart("file") MultipartFile file) {
        ImportParams params = new ImportParams();
//        params.setTitleRows(1); // 标题行数
        params.setHeadRows(1); //表头行数
        InputStream inputStream = null;
//        List<CustomerImportFailedData> failedData = new ArrayList<>();
        List<TCleanerImportExcel> locationExcelList;
        try {
            inputStream = file.getInputStream();
            locationExcelList = ExcelImportUtil.importExcel(inputStream,
                    TCleanerImportExcel.class, params);
        } catch (Exception e) {
            e.printStackTrace();
            log.error("保洁员导入失败:{}", e.getMessage());
            throw new ServiceException("保洁员导入失败!");
        } finally {
            try {
                inputStream.close();
            } catch (IOException e) {
                throw new ServiceException(e.getMessage());
            }
        }
        if (CollectionUtils.isEmpty(locationExcelList)) {
            throw new ServiceException("保洁员数据为空!");
        }
        JSONObject result = new JSONObject();
        List<TProjectDept> projects = projectDeptService.list();
        for (TCleanerImportExcel locationExcel : locationExcelList) {
            System.err.println(locationExcel);
            TCleaner tCleaner = new TCleaner();
            TProjectDept projectDept = projects.stream().filter(e -> e.getProjectName().equals(locationExcel.getProjectName())).findFirst().orElse(null);
            if (projectDept==null){
                result.append("保洁员:[", locationExcel.getCleanerName()+"]未查询到部门");
                continue;
            }else{
                if (projectDept.getParentId().equals("0")){
                    result.append("保洁员:[", locationExcel.getCleanerName()+"]所属片区不能指定为项目部");
                    continue;
                }
            }
            tCleaner.setCleanerCode(locationExcel.getCleanerCode());
            tCleaner.setCleanerName(locationExcel.getCleanerName());
            tCleaner.setProjectId(projectDept.getId());
            tCleaner.setDeptCode(locationExcel.getDeptCode());
            tCleaner.setProjectCode(locationExcel.getProjectCode());
            cleanerService.save(tCleaner);
        }
        if(!result.isEmpty()){
            return R.ok(result.toString());
        }
        return R.ok();
    }
    @ApiOperation(value = "保洁员导入模板下载")
    @GetMapping("/import-cleaner")
    public void importCleaner() {
        List<TCleanerImportExcel> locationImportExcels = new ArrayList<>();
        TCleanerImportExcel tLocationImportExcel = new TCleanerImportExcel();
        locationImportExcels.add(tLocationImportExcel);
        Workbook workbook = ExcelExportUtil.exportExcel(new ExportParams(), TCleanerImportExcel.class, locationImportExcels);
        HttpServletResponse response = WebUtils.response();
        ServletOutputStream outputStream = null;
        try {
            String fileName = URLEncoder.encode("保洁员导入模板.xls", "utf-8");
            response.setHeader("Content-Disposition", "attachment;filename=" + fileName);
            response.setHeader("content-Type", "application/vnd.ms-excel");
            response.setHeader("Pragma", "no-cache");
            response.setHeader("Cache-Control", "no-cache");
            outputStream = response.getOutputStream();
            workbook.write(outputStream);
        } catch (IOException e) {
            e.printStackTrace();
            System.out.println("保洁员导入模板下载失败!");
        } finally {
            try {
                outputStream.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}
ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/TInspectorController.java
@@ -5,6 +5,7 @@
import cn.afterturn.easypoi.excel.entity.ExportParams;
import com.ruoyi.common.annotation.Log;
import com.ruoyi.common.basic.PageInfo;
import com.ruoyi.common.core.domain.BaseModel;
import com.ruoyi.common.core.domain.R;
import com.ruoyi.common.core.domain.entity.SysUser;
import com.ruoyi.common.enums.BusinessType;
@@ -18,8 +19,7 @@
import com.ruoyi.system.query.TaskListQuery;
import com.ruoyi.system.service.*;
import com.ruoyi.system.utils.TemplateMessageSendUtil;
import com.ruoyi.system.vo.system.InspectorListVO;
import com.ruoyi.system.vo.system.TaskListVO;
import com.ruoyi.system.vo.system.*;
import com.ruoyi.web.controller.tool.EmailUtils;
import com.ruoyi.web.controller.tool.MsgUtils;
import io.swagger.annotations.Api;
@@ -54,6 +54,8 @@
    @Resource
    private TLocationService locationService;
    @Resource
    private TLocationTypeService locationTypeService;
    @Resource
    private TProjectDeptService projectDeptService;
    @Resource
@@ -68,7 +70,10 @@
    @Resource
    private TInspectorService inspectorService;
    @Resource
    private TInspectorDetailService inspectorDetailService;
    @Resource
    private TTaskCleanService taskCleanerService;
    @ApiOperation(value = "督察记录分页列表")
    @PostMapping(value = "/pageList")
    public R<PageInfo<InspectorListVO>> pageList(@RequestBody InsepectorListQuery query) {
@@ -76,87 +81,79 @@
        List<TLocation> locationList = locationService.list();
        if (StringUtils.hasLength(query.getDeptName())) {
            List<TProjectDept> list = projectDeptService.lambdaQuery().like(TProjectDept::getProjectName, query.getDeptName()).list();
            List<String> projectIds = list
            List<String> listIds = 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());
            for (TProjectDept projectDept : list) {
                if (projectDept.getParentId().equals("0")){
                    List<TProjectDept> list1 = projectDeptService.lambdaQuery().eq(TProjectDept::getParentId, projectDept.getId()).list();
                    List<String> collect = list1.stream().map(TProjectDept::getId).collect(Collectors.toList());
                    projectIds.addAll(collect);
            for (TProjectDept tProjectDept : list) {
                if (tProjectDept.getParentId().equals("0")) {
                    List<String> collect = projectDeptService.lambdaQuery().eq(TProjectDept::getParentId, tProjectDept.getId()).list()
                            .stream().map(TProjectDept::getId).collect(Collectors.toList());
                    listIds.addAll(collect);
                    listIds.add(tProjectDept.getId());
                }
            }
            projectIds.addAll(deptIds);
            if (projectIds.isEmpty()) {
            List<String> deptIds = deptService.lambdaQuery().like(TDept::getDeptName, query.getDeptName()).list()
                    .stream().map(TDept::getId).collect(Collectors.toList());
            listIds.addAll(deptIds);
            if (listIds.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<>());
            }
            List<Long> collect = sysUsers.stream().filter(e -> listIds.contains(e.getDeptId()))
                    .map(SysUser::getUserId).collect(Collectors.toList());
            query.setPatrolInspectorIds(collect);
            if (StringUtils.hasLength(query.getPhonenumber())) {
                List<Long> patrolInspectorIds = sysUsers.stream().filter(sysUser ->
                        sysUser.getPhonenumber().equals(query.getPhonenumber())
                                && projectIds.contains(sysUser.getDeptId())
                        sysUser.getPhonenumber().contains(query.getPhonenumber())
                                && listIds.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);
                }
                query.setPatrolInspectorIds(patrolInspectorIds);
            }
        }
        if (StringUtils.hasLength(query.getPhonenumber())){
        if (StringUtils.hasLength(query.getPhonenumber())) {
            List<Long> patrolInspectorIds = sysUsers.stream().filter(sysUser ->
                    sysUser.getPhonenumber().contains(query.getPhonenumber())
            ).map(SysUser::getUserId).collect(Collectors.toList());
            if (query.getPatrolInspectorIds()!=null&&!query.getPatrolInspectorIds().isEmpty()){
            query.setPatrolInspectorIds(patrolInspectorIds);
            if (!query.getPatrolInspectorIds().isEmpty()) {
                // 取交集
                patrolInspectorIds = patrolInspectorIds.stream().filter(query.getPatrolInspectorIds()::contains).collect(Collectors.toList());
            }
            if (patrolInspectorIds.isEmpty()){
            query.setPatrolInspectorIds(patrolInspectorIds);
            if (patrolInspectorIds.isEmpty()) {
                return R.ok(new PageInfo<>());
            }
            query.setPatrolInspectorIds(patrolInspectorIds);
        }
        if (query.getLocationType()!=null){
        if (query.getClearStatus() != null) {
            List<String> collect = inspectorDetailService.lambdaQuery().eq(TInspectorDetail::getClearStatus, query.getClearStatus())
                    .list().stream().distinct().map(TInspectorDetail::getInspectorId).collect(Collectors.toList());
            query.setTaskIds(collect);
            if (collect.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()){
            if (collect.isEmpty()) {
                return R.ok(new PageInfo<>());
            }
            query.setLocationIds(collect);
        }
        if (StringUtils.hasLength(query.getLocationName())){
        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);
            query.setLocationIds(collect);
            if (collect.isEmpty()) {
                return R.ok(new PageInfo<>());
            }else{
                if (query.getLocationIds()!=null){
                    collect = collect.stream().filter(query.getLocationIds()::contains).collect(Collectors.toList());
                    if (collect.isEmpty()){
                        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 (StringUtils.hasLength(query.getEndTime())){
            String replace = query.getEndTime().replace(" 00:00:00", " 23:59:59");
            query.setEndTime(replace);
        }
        return R.ok(inspectorService.pageList(query));
    }
@@ -167,68 +164,68 @@
    public void exportExcel(@RequestBody InsepectorListQuery query) {
        List<SysUser> sysUsers = sysUserService.selectAllList();
        List<TLocation> locationList = locationService.list();
        if (StringUtils.hasLength(query.getDeptName())){
        if (StringUtils.hasLength(query.getDeptName())) {
            List<String> projectIds = projectDeptService.lambdaQuery().like(TProjectDept::getProjectName, query.getDeptName()).list()
                    .stream().map(TProjectDept::getId).collect(Collectors.toList());
            List<String> deptIds = deptService.lambdaQuery().like(TDept::getDeptName, query.getDeptName()).list()
                    .stream().map(TDept::getId).collect(Collectors.toList());
            projectIds.addAll(deptIds);
            if (projectIds.isEmpty()){
                projectIds.add("0")    ;
            if (projectIds.isEmpty()) {
                projectIds.add("0");
            }
            if (StringUtils.hasLength(query.getPhonenumber())){
            if (StringUtils.hasLength(query.getPhonenumber())) {
                List<Long> patrolInspectorIds = sysUsers.stream().filter(sysUser ->
                        sysUser.getPhonenumber().equals(query.getPhonenumber())
                                && projectIds.contains(sysUser.getDeptId())
                ).map(SysUser::getUserId).collect(Collectors.toList());
                if (patrolInspectorIds.isEmpty()){
                    patrolInspectorIds.add(0L)    ;
                if (patrolInspectorIds.isEmpty()) {
                    patrolInspectorIds.add(0L);
                }
                query.setPatrolInspectorIds(patrolInspectorIds);
            }
        }
        if (StringUtils.hasLength(query.getPhonenumber())){
        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()){
            if (!query.getPatrolInspectorIds().isEmpty()) {
                // 取交集
                patrolInspectorIds = patrolInspectorIds.stream().filter(query.getPatrolInspectorIds()::contains).collect(Collectors.toList());
            }
            if (patrolInspectorIds.isEmpty()){
            if (patrolInspectorIds.isEmpty()) {
                patrolInspectorIds.add(0L);
            }
            query.setPatrolInspectorIds(patrolInspectorIds);
        }
        if (query.getClearStatus()!=null){
            List<String> collect = tTaskDetailService.lambdaQuery().eq(TTaskDetail::getClearStatus, query.getClearStatus())
                    .list().stream().distinct().map(TTaskDetail::getTaskId).collect(Collectors.toList());
            if (collect.isEmpty()){
        if (query.getClearStatus() != null) {
            List<String> collect = inspectorDetailService.lambdaQuery().eq(TInspectorDetail::getClearStatus, query.getClearStatus())
                    .list().stream().distinct().map(TInspectorDetail::getInspectorId).collect(Collectors.toList());
            if (collect.isEmpty()) {
                collect.add("-1");
            }
            query.setTaskIds(collect);
        }
        if (query.getLocationType()!=null){
        if (query.getLocationType() != null) {
            List<String> collect = locationList.stream().filter(e -> e.getLocationType().equals(query.getLocationType())).map(TLocation::getId)
                    .collect(Collectors.toList());
            if (collect.isEmpty()){
            if (collect.isEmpty()) {
                collect.add("-1");
            }
            query.setLocationIds(collect);
        }
        if (StringUtils.hasLength(query.getLocationName())){
        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()){
            if (collect.isEmpty()) {
                collect.add("-1");
                query.setLocationIds(collect);
            }else{
            } else {
                collect = collect.stream().filter(query.getLocationIds()::contains).collect(Collectors.toList());
                if (collect.isEmpty()){
                if (collect.isEmpty()) {
                    collect.add("-1");
                }
                query.setLocationIds(collect);
@@ -257,6 +254,64 @@
        }
    }
    @ApiOperation(value = "督察详情任务")
    @GetMapping(value = "/detail")
    public R<InspectorDetailVO> detail(@RequestParam String id) {
        TInspector inspector = inspectorService.getById(id);
        List<TInspectorDetail> list = inspectorDetailService.lambdaQuery().eq(TInspectorDetail::getInspectorId, id)
                .orderByDesc(BaseModel::getCreateTime).list();
        InspectorDetailVO taskDetailVO = new InspectorDetailVO();
        BeanUtils.copyProperties(inspector, taskDetailVO);
        TLocation byId1 = locationService.getById(inspector.getLocationId());
        TLocationType byId2 = locationTypeService.getById(byId1.getLocationType());
        taskDetailVO.setLocationAddress(byId1.getLocationAddress());
        taskDetailVO.setLocationIcon(byId2.getLocationIcon());
        taskDetailVO.setLocationName(byId1.getLocationName());
        taskDetailVO.setLocationTypeName(byId2.getLocationName());
        TInspectorDetail 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());
            }
        }
        if (tTaskDetail != null) {
            tTaskDetail.setFinishTime(tTaskDetail.getCreateTime());
        }
        taskDetailVO.setTaskDetail(tTaskDetail);
        taskDetailVO.setRecords(list);
        return R.ok(taskDetailVO);
    }
    @ApiOperation(value = "详情任务-操作记录-详情")
    @GetMapping(value = "/detailRecord")
    public R<InspectorRecordDetailVO> detailRecord(@RequestParam String id) {
        InspectorRecordDetailVO taskDetailVO = new InspectorRecordDetailVO();
        TInspectorDetail byId4 = inspectorDetailService.getById(id);
        TInspector byId = inspectorService.getById(byId4.getInspectorId());
        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());
        if (byId4.getUnqualified() != null) {
            TDictData byId3 = dictDataService.getById(byId4.getUnqualified());
            if (byId3 != null) {
                byId4.setUnqualifiedName(byId3.getDataContent());
            }
        }
        if (byId4.getAuditPerson() != null) {
            SysUser sysUser = sysUserService.selectUserById(Long.valueOf(byId4.getAuditPerson()));
            if (sysUser != null) {
                byId4.setAuditPersonName(sysUser.getUserName());
            }
        }
        taskDetailVO.setTaskDetail(byId4);
        return R.ok(taskDetailVO);
    }
    @Log(title = "批量删除督察任务", businessType = BusinessType.DELETE)
    @ApiOperation(value = "批量删除督察任务")
    @DeleteMapping(value = "/deleteByIds")
@@ -265,6 +320,7 @@
        inspectorService.removeBatchByIds(Arrays.asList(split));
        return R.ok();
    }
    @Log(title = "删除督察任务", businessType = BusinessType.DELETE)
    @ApiOperation(value = "删除督察任务")
    @DeleteMapping(value = "/deleteById")
@@ -272,6 +328,7 @@
        inspectorService.removeById(id);
        return R.ok();
    }
    @Resource
    private TNoticeService noticeService;
    @Resource
@@ -282,79 +339,24 @@
    private MsgUtils msgUtils;
    @Resource
    private TemplateMessageSendUtil templateMessageSendUtil;
    @Log(title = "审核任务", businessType = BusinessType.UPDATE)
    @ApiOperation(value = "审核任务")
    @PostMapping(value = "/audit")
    public R<Boolean> audit(@RequestBody TInspectorAuditDTO dto) throws Exception {
        TTaskAuditDTO tTaskAuditDTO = new TTaskAuditDTO();
        BeanUtils.copyProperties(dto, tTaskAuditDTO);
        TTask task = taskCleanerService.getById(dto.getTaskId());
        TLocation location = locationService.getById(task.getLocationId());
        TNotice tNotice = new TNotice();
        TNoticeSet noticeSet = noticeSetService.lambdaQuery().eq(TNoticeSet::getType, 2).last("limit 1")
                .one();
        tNotice.setUserId(task.getPatrolInspector());
        tNotice.setStatus(1);
        tNotice.setDataId(task.getId());
        tNotice.setNoticeSetType(noticeSet.getNoticeType());
        TInspector byId = inspectorService.getById(dto.getId());
        SysUser sysUser = sysUserService.selectUserById(Long.valueOf(task.getPatrolInspector()));
        // 邮箱
        TDictData email = dictDataService.lambdaQuery().eq(TDictData::getDataType,4).one();
        // 授权码
        TDictData code = dictDataService.lambdaQuery().eq(TDictData::getDataType,5).one();
        if (dto.getAuditStatus()==1){
            if (byId.getClearStatus()==2){
                tTaskAuditDTO.setHandleType(3);
                dto.setStatus(2);
                // 增加消息
                tNotice.setNoticeType(8);
                tNotice.setNoticeContent("【"+location.getLocationName()+"】督察任务不合格,请重新上传!");
                noticeService.save(tNotice);
                switch (noticeSet.getNoticeType()) {
                    case 1:
                        msgUtils.sendMsg5(sysUser.getPhonenumber(), location.getLocationName());
                        break;
                    case 2:
                        if (StringUtils.hasLength(email.getDataContent()) && StringUtils.hasLength(code.getDataContent())) {
                            EmailUtils.sendEmail(sysUser.getEmail(), email.getDataContent(), code.getDataContent(), "【"+location.getLocationName()+"】任务督察不合格,请及时整改!");
                        }
                        break;
                    case 3:
                        if (StringUtils.hasLength(sysUser.getOpenId())){
                            templateMessageSendUtil.wxTemplateProblemRectificationRequest(sysUser.getOpenId(),
                                    location.getLocationName(),dto.getAuditRemark());
                        }
                        break;
                }
            }else{
                if (dto.getAuditTime()!=null){
                    dto.setStatus(3);
                }else{
                    dto.setStatus(4);
                }
            }
        }
        dto.setAuditTime(LocalDateTime.now());
        dto.setAuditPerson(tokenService.getLoginUser().getUserId()+"");
        inspectorService.updateById(dto);
        return R.ok();
//        TInspector byId = inspectorService.getById(dto.getId());
//
//        TTaskAuditDTO tTaskAuditDTO = new TTaskAuditDTO();
//        BeanUtils.copyProperties(dto, tTaskAuditDTO);
//        TLocation location = locationService.getById(byId.getLocationId());
//        TTask task = taskCleanerService.getById(dto.getTaskId());
//        TLocation location = locationService.getById(task.getLocationId());
//        TNotice tNotice = new TNotice();
//        TNoticeSet noticeSet = noticeSetService.lambdaQuery().eq(TNoticeSet::getType, 2).last("limit 1")
//                .one();
//        tNotice.setUserId(location.getLocationLeader());
//        tNotice.setUserId(task.getPatrolInspector());
//        tNotice.setStatus(1);
//        tNotice.setDataId(byId.getId());
//        tNotice.setDataId(task.getId());
//        tNotice.setNoticeSetType(noticeSet.getNoticeType());
//        SysUser sysUser = sysUserService.selectUserById(Long.valueOf(location.getLocationLeader()));
//        TInspector byId = inspectorService.getById(dto.getId());
//        SysUser sysUser = sysUserService.selectUserById(Long.valueOf(task.getPatrolInspector()));
//        // 邮箱
//        TDictData email = dictDataService.lambdaQuery().eq(TDictData::getDataType,4).one();
//        // 授权码
@@ -377,6 +379,10 @@
//                        }
//                        break;
//                    case 3:
//                        if (StringUtils.hasLength(sysUser.getOpenId())){
//                            templateMessageSendUtil.wxTemplateProblemRectificationRequest(sysUser.getOpenId(),
//                                    location.getLocationName(),dto.getAuditRemark());
//                        }
//                        break;
//                }
//            }else{
@@ -388,9 +394,112 @@
//            }
//        }
//        dto.setAuditTime(LocalDateTime.now());
//
//        dto.setAuditPerson(tokenService.getLoginUser().getUserId()+"");
//        inspectorService.updateById(dto);
//        return R.ok();
        SysUser auditPerson = sysUserService.selectUserById(tokenService.getLoginUser().getUserId());
        TInspector byId = inspectorService.getById(dto.getId());
        TTaskAuditDTO tTaskAuditDTO = new TTaskAuditDTO();
        BeanUtils.copyProperties(dto, tTaskAuditDTO);
        TLocation location = locationService.getById(byId.getLocationId());
        TNotice tNotice = new TNotice();
        TNoticeSet noticeSet = noticeSetService.lambdaQuery().eq(TNoticeSet::getType, 2).last("limit 1")
                .one();
        tNotice.setUserId(location.getLocationLeader());
        tNotice.setStatus(1);
        tNotice.setDataId(byId.getId());
        tNotice.setNoticeSetType(noticeSet.getNoticeType());
        SysUser sysUser = sysUserService.selectUserById(Long.valueOf(location.getLocationLeader()));
        // 邮箱
        TDictData email = dictDataService.lambdaQuery().eq(TDictData::getDataType, 4).one();
        // 授权码
        TDictData code = dictDataService.lambdaQuery().eq(TDictData::getDataType, 5).one();
        TInspectorDetail one = inspectorDetailService.lambdaQuery().eq(TInspectorDetail::getInspectorId, byId.getId())
                .eq(TInspectorDetail::getHandleType, 1).orderByDesc(TInspectorDetail::getCreateTime)
                .last("limit 1").one();
        if (dto.getAuditStatus() == 1) {
            TInspectorDetail tInspectorDetail = new TInspectorDetail();
            tInspectorDetail.setInspectorId(byId.getId());
            tInspectorDetail.setClearStatus(byId.getClearStatus());
            tInspectorDetail.setUnqualified(byId.getUnqualified());
            tInspectorDetail.setRemark(byId.getRemark());
            tInspectorDetail.setPicture(byId.getPicture());
            tInspectorDetail.setAudioUrl(byId.getAudioUrl());
            tInspectorDetail.setHandleType(2);
            tInspectorDetail.setAuditPerson(tokenService.getLoginUser().getUserId() + "");
            tInspectorDetail.setAuditTime(LocalDateTime.now());
            tInspectorDetail.setAuditRemark(dto.getAuditRemark());
            tInspectorDetail.setAuditStatus(dto.getAuditStatus());
            inspectorDetailService.save(tInspectorDetail);
            Long count = inspectorDetailService.lambdaQuery().eq(TInspectorDetail::getInspectorId, byId.getId())
                    .eq(TInspectorDetail::getHandleType, 1).count();
            if (count>2){
                dto.setStatus(3);
            }else{
                if (byId.getClearStatus() == 1) {
                    dto.setStatus(4);
                }else{
                    dto.setStatus(3);
                }
            }
        } else {
            TInspectorDetail tInspectorDetail = new TInspectorDetail();
            tInspectorDetail.setInspectorId(byId.getId());
            tInspectorDetail.setClearStatus(dto.getClearStatus());
            tInspectorDetail.setUnqualified(byId.getUnqualified());
            tInspectorDetail.setRemark(dto.getAuditRemark());
            tInspectorDetail.setPicture(byId.getPicture());
            tInspectorDetail.setAudioUrl(byId.getAudioUrl());
            tInspectorDetail.setHandleType(3);
            tInspectorDetail.setAuditPerson(tokenService.getLoginUser().getUserId() + "");
            tInspectorDetail.setAuditTime(LocalDateTime.now());
            tInspectorDetail.setAuditRemark(dto.getAuditRemark());
            tInspectorDetail.setAuditStatus(dto.getAuditStatus());
            inspectorDetailService.save(tInspectorDetail);
            tTaskAuditDTO.setHandleType(3);
            dto.setStatus(2);
            // 增加消息
            tNotice.setNoticeType(8);
            tNotice.setNoticeContent("【" + location.getLocationName() + "】督察任务不合格,请重新上传!");
            noticeService.save(tNotice);
            switch (noticeSet.getNoticeType()) {
                case 1:
                    msgUtils.sendMsg5(sysUser.getPhonenumber(), location.getLocationName());
                    break;
                case 2:
                    if (StringUtils.hasLength(email.getDataContent()) && StringUtils.hasLength(code.getDataContent())
                            &&StringUtils.hasLength(sysUser.getEmail())) {
                        EmailUtils.sendEmail(sysUser.getEmail(), email.getDataContent(), code.getDataContent(), "【" + location.getLocationName() + "】任务督察不合格,请及时整改!");
                    }
                    break;
                case 3:
                    if (StringUtils.hasLength(sysUser.getOpenId())) {
                        templateMessageSendUtil.wxTemplateTaskResultRequest(sysUser.getOpenId(),
                                location.getLocationName(), "驳回", auditPerson.getNickName());
                    }
                    break;
            }
        }
        dto.setAuditTime(LocalDateTime.now());
        dto.setAuditPerson(tokenService.getLoginUser().getUserId() + "");
        inspectorService.updateById(dto);
        one.setAuditPerson(tokenService.getLoginUser().getUserId() + "");
        one.setAuditTime(LocalDateTime.now());
        one.setAuditRemark(dto.getAuditRemark());
        one.setAuditStatus(dto.getAuditStatus());
        inspectorDetailService.updateById(one);
        return R.ok();
    }
}
ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/TLocationController.java
@@ -45,6 +45,8 @@
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.InputStream;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.net.URLEncoder;
import java.util.*;
import java.util.stream.Collectors;
@@ -391,6 +393,9 @@
        for (TLocationImportExcel locationExcel : locationExcelList) {
            System.err.println(locationExcel);
            if (locationExcel.getLocationName()==null){
                continue;
            }
            TLocation location = new TLocation();
            location.setLocationCode(locationExcel.getLocationCode());
            location.setLocationName(locationExcel.getLocationName());
@@ -399,11 +404,11 @@
                location.setLocationType(tLocationType.getId());
            }
            location.setLocationAddress(locationExcel.getLocationAddress());
            String[] addressLonLat = locationExcel.getLocationAddressLonLat().split(",");
            String[] addressLonLat = locationExcel.getLocationAddressLonLat().split("/");
            location.setLocationLon(addressLonLat[0]);
            location.setLocationLat(addressLonLat[1]);
            location.setLocationAddressEnd(locationExcel.getLocationAddressEnd());
            String[] addressEndLonLat = locationExcel.getLocationAddressEndLonLat().split(",");
            String[] addressEndLonLat = locationExcel.getLocationAddressEndLonLat().split("/");
            location.setLocationLonEnd(addressEndLonLat[0]);
            location.setLocationLatEnd(addressEndLonLat[1]);
            TProjectDept projectDept = deptList.stream().filter(dept -> dept.getCode().equals(locationExcel.getDeptCode())).findFirst().orElse(null);
@@ -439,5 +444,10 @@
        return R.ok();
    }
    public static void main(String[] args) {
        BigDecimal divide = new BigDecimal("-23").divide(new BigDecimal("40"),2, RoundingMode.HALF_UP);
        System.err.println(divide);
    }
}
ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/TTaskController.java
@@ -271,7 +271,9 @@
                        msgUtils.sendMsg1(sysUser.getPhonenumber(),location.getLocationName(),"驳回");
                        break;
                    case 2:
                        if (StringUtils.hasLength(email.getDataContent())&&StringUtils.hasLength(code.getDataContent())){
                        if (StringUtils.hasLength(email.getDataContent())&&StringUtils.hasLength(code.getDataContent())
                                &&StringUtils.hasLength(sysUser.getEmail())){
                            EmailUtils.sendEmail(sysUser.getEmail(),email.getDataContent(),code.getDataContent(),"【" + location.getLocationName() + "】任务不合格,请重新上传!");
                        }
                        break;
@@ -339,7 +341,8 @@
                        msgUtils.sendMsg1(sysUser.getPhonenumber(),location.getLocationName(),"通过");
                        break;
                    case 2:
                        if (StringUtils.hasLength(email.getDataContent())&&StringUtils.hasLength(code.getDataContent())){
                        if (StringUtils.hasLength(email.getDataContent())&&StringUtils.hasLength(code.getDataContent())
                                &&StringUtils.hasLength(sysUser.getEmail())){
                            EmailUtils.sendEmail(sysUser.getEmail(),email.getDataContent(),code.getDataContent(),"【" + location.getLocationName() + "】任务已通过");
                        }
                        break;
@@ -477,7 +480,8 @@
                            msgUtils.sendMsg1(sysUser.getPhonenumber(),location.getLocationName(),"驳回");
                            break;
                        case 2:
                            if (StringUtils.hasLength(email.getDataContent())&&StringUtils.hasLength(code.getDataContent())){
                            if (StringUtils.hasLength(email.getDataContent())&&StringUtils.hasLength(code.getDataContent())
                                    &&StringUtils.hasLength(sysUser.getEmail())){
                                EmailUtils.sendEmail(sysUser.getEmail(),email.getDataContent(),code.getDataContent(),"【" + location.getLocationName() + "】任务不合格,请重新上传!");
                            }
                            break;
@@ -539,7 +543,8 @@
                            msgUtils.sendMsg1(sysUser.getPhonenumber(),location.getLocationName(),"通过");
                            break;
                        case 2:
                            if (StringUtils.hasLength(email.getDataContent())&&StringUtils.hasLength(code.getDataContent())){
                            if (StringUtils.hasLength(email.getDataContent())&&StringUtils.hasLength(code.getDataContent())
                                    &&StringUtils.hasLength(sysUser.getEmail())){
                                EmailUtils.sendEmail(sysUser.getEmail(),email.getDataContent(),code.getDataContent(),"【" + location.getLocationName() + "】任务已通过");
                            }
                            break;
ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/WorkbenchesController.java
@@ -606,7 +606,11 @@
            if(tTasks.isEmpty()){
                taskSituationDayVO.setCompleteRate(BigDecimal.ZERO);
            }else {
                taskSituationDayVO.setCompleteRate(new BigDecimal(qualifiedWarnChild).divide(new BigDecimal(taskSituationDayVO.getCompletedNum()), 2, RoundingMode.HALF_DOWN));
                if (taskSituationDayVO.getCompletedNum() != 0){
                    taskSituationDayVO.setCompleteRate(new BigDecimal(qualifiedWarnChild).divide(new BigDecimal(taskSituationDayVO.getCompletedNum()), 2, RoundingMode.HALF_DOWN));
                }else{
                    taskSituationDayVO.setCompleteRate(BigDecimal.ZERO);
                }
            }
            taskSituationDayVOList.add(taskSituationDayVO);
        }
ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysUserController.java
@@ -1,5 +1,10 @@
package com.ruoyi.web.controller.system;
import cn.afterturn.easypoi.excel.ExcelExportUtil;
import cn.afterturn.easypoi.excel.ExcelImportUtil;
import cn.afterturn.easypoi.excel.entity.ExportParams;
import cn.afterturn.easypoi.excel.entity.ImportParams;
import cn.hutool.json.JSONObject;
import com.ruoyi.common.annotation.Log;
import com.ruoyi.common.basic.PageInfo;
import com.ruoyi.common.core.controller.BaseController;
@@ -8,39 +13,54 @@
import com.ruoyi.common.core.domain.entity.SysDept;
import com.ruoyi.common.core.domain.entity.SysRole;
import com.ruoyi.common.core.domain.entity.SysUser;
import com.ruoyi.common.core.exception.ServiceException;
import com.ruoyi.common.enums.BusinessType;
import com.ruoyi.common.utils.SecurityUtils;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.common.utils.WebUtils;
import com.ruoyi.framework.web.service.TokenService;
import com.ruoyi.system.dto.SysUserUpdateStatusDTO;
import com.ruoyi.system.importExcel.TCleanerImportExcel;
import com.ruoyi.system.importExcel.TSysUserImportExcel;
import com.ruoyi.system.model.TCleaner;
import com.ruoyi.system.model.TDept;
import com.ruoyi.system.model.TProjectDept;
import com.ruoyi.system.model.TTemplate;
import com.ruoyi.system.query.SysUserQuery;
import com.ruoyi.system.service.*;
import com.ruoyi.system.vo.system.SysUserVO;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.apache.poi.ss.usermodel.Workbook;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.CollectionUtils;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import javax.annotation.Resource;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.InputStream;
import java.net.URLEncoder;
import java.time.LocalDateTime;
import java.util.*;
import java.util.stream.Collectors;
/**
 * 用户信息
 *
 *
 * @author ruoyi
 */
@Api(tags = "用户信息")
@RestController
@RequestMapping("/system/user")
public class SysUserController extends BaseController
{
public class SysUserController extends BaseController {
    @Autowired
    private ISysUserService userService;
@@ -55,31 +75,33 @@
    private TProjectDeptService projectDeptService;
    @Resource
    private TDeptService tdeptService;
    @Resource
    private TTemplateService templateService;
    /**
     * 获取用户列表
     */
    @ApiOperation(value = "获取用户列表")
    @PostMapping("/list")
    public AjaxResult<PageInfo<SysUserVO>> 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())){
        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()){
            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);
            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);
@@ -88,8 +110,7 @@
    @ApiOperation(value = "获取用户列表-不分页")
    @PostMapping("/listNotPage")
    public AjaxResult listNotPage()
    {
    public AjaxResult listNotPage() {
        List<SysUser> list = userService.selectList();
        return AjaxResult.success(list);
    }
@@ -111,11 +132,10 @@
     */
    @ApiOperation(value = "获取用户详情")
    @GetMapping("/getDetail")
    public AjaxResult getDetail(@RequestParam Long userId)
    {
    public AjaxResult getDetail(@RequestParam Long userId) {
        SysUser sysUser = userService.selectUserById(userId);
        SysUserVO sysUserVO = new SysUserVO();
        BeanUtils.copyProperties(sysUser,sysUserVO);
        BeanUtils.copyProperties(sysUser, sysUserVO);
        return AjaxResult.success(sysUser);
    }
@@ -125,12 +145,11 @@
     */
    @ApiOperation(value = "获取用户详情")
    @GetMapping("/queryDetail")
    public AjaxResult queryDetail()
    {
    public AjaxResult queryDetail() {
        Long userId = tokenService.getLoginUser().getUserId();
        SysUser sysUser = userService.selectUserById(userId);
        SysUserVO sysUserVO = new SysUserVO();
        BeanUtils.copyProperties(sysUser,sysUserVO);
        BeanUtils.copyProperties(sysUser, sysUserVO);
        return AjaxResult.success(sysUser);
    }
@@ -141,17 +160,16 @@
     */
    @ApiOperation(value = "获取用户数量统计")
    @PostMapping("/getUserCount")
    public AjaxResult getUserCount()
    {
        Map<String,Integer> map = new HashMap<>();
    public AjaxResult getUserCount() {
        Map<String, Integer> map = new HashMap<>();
        Integer userCountSum = userService.selectCount(null);
        Integer normalCount = userService.selectCount(0);// 正常
        Integer stopCount = userService.selectCount(1);// 停用
        map.put("all",userCountSum);
        map.put("normal",normalCount);
        map.put("stop",stopCount);
        map.put("all", userCountSum);
        map.put("normal", normalCount);
        map.put("stop", stopCount);
        return AjaxResult.success(map);
    }
@@ -160,8 +178,7 @@
     * 移除黑名单
     */
    @GetMapping("/removeBlackList")
    public AjaxResult removeBlackList(@RequestParam String ids)
    {
    public AjaxResult removeBlackList(@RequestParam String ids) {
        String[] split = ids.split(",");
        List<Long> id = new ArrayList<>();
        for (String s : split) {
@@ -177,21 +194,184 @@
    @ApiOperation(value = "新增用户管理")
    @Log(title = "用户信息-新增用户", businessType = BusinessType.INSERT)
    @PostMapping("/add")
    public AjaxResult add(@Validated @RequestBody SysUser user)
    {
    public AjaxResult add(@Validated @RequestBody SysUser user) {
        user.setUserName(user.getUserName());
        if (!userService.checkUserNameUnique(user))
        {
        if (!userService.checkUserNameUnique(user)) {
            return error("新增用户'" + user.getUserName() + "'失败,登录账号已存在");
        }
        else if (StringUtils.isNotEmpty(user.getPhonenumber()) && !userService.checkPhoneUnique(user))
        {
        } else if (StringUtils.isNotEmpty(user.getPhonenumber()) && !userService.checkPhoneUnique(user)) {
            return error("新增用户'" + user.getUserName() + "'失败,手机号码已存在");
        }
        user.setCreateBy(getUsername());
        user.setPassword(SecurityUtils.encryptPassword("123456"));
        userService.insertUser(user);
        return AjaxResult.success();
    }
    @Log(title = "员工导入", businessType = BusinessType.INSERT)
    @ApiOperation(value = "员工导入")
    @Transactional(rollbackFor = Exception.class, propagation = Propagation.REQUIRES_NEW)
    @PostMapping("/importUser")
    public R<String> importUser(@RequestPart("file") MultipartFile file) {
        List<SysRole> sysRoles = roleService.selectRoleAll();
        ImportParams params = new ImportParams();
//        params.setTitleRows(1); // 标题行数
        params.setHeadRows(1); //表头行数
        InputStream inputStream = null;
//        List<CustomerImportFailedData> failedData = new ArrayList<>();
        List<TSysUserImportExcel> locationExcelList;
        try {
            inputStream = file.getInputStream();
            locationExcelList = ExcelImportUtil.importExcel(inputStream,
                    TSysUserImportExcel.class, params);
        } catch (Exception e) {
            e.printStackTrace();
            throw new ServiceException("员工导入失败!");
        } finally {
            try {
                inputStream.close();
            } catch (IOException e) {
                throw new ServiceException(e.getMessage());
            }
        }
        if (CollectionUtils.isEmpty(locationExcelList)) {
            throw new ServiceException("员工数据为空!");
        }
        JSONObject result = new JSONObject();
        List<TProjectDept> projects = projectDeptService.list();
        List<SysUser> sysUsers = new ArrayList<>();
        for (TSysUserImportExcel locationExcel : locationExcelList) {
            System.err.println(locationExcel);
            SysUser sysUser = new SysUser();
            if (locationExcel.getDeptType() == null) {
                result.append("所属部门", "所属部门请填写1或2");
                continue;
            } else {
                sysUser.setDeptType(locationExcel.getDeptType());
                switch (locationExcel.getDeptType()) {
                    case 1:
                        TProjectDept projectDept = projectDeptService.lambdaQuery().eq(TProjectDept::getProjectName, locationExcel.getDeptName())
                                .last("limit 1").one();
                        if (projectDept==null){
                            result.append("部门名称", "部门名称不存在");
                            continue;
                        }else{
                            sysUser.setDeptId(projectDept.getId());
                        }
                        break;
                    case 2:
                        TDept dept = tdeptService.lambdaQuery().eq(TDept::getDeptName, locationExcel.getDeptName())
                                .last("limit 1").one();
                        if (dept==null){
                            result.append("部门名称", "部门名称不存在");
                            continue;
                        }else{
                            sysUser.setDeptId(dept.getId());
                        }
                        break;
                }
            }
            if (!org.springframework.util.StringUtils.hasLength(locationExcel.getRoleName())){
                result.append("角色名称", "角色名称不能为空");
                continue;
            }else{
                SysRole sysRole = sysRoles.stream().filter(e -> e.getRoleName().equals(locationExcel.getRoleName()) &&
                        e.getDelFlag().equals(0)).findFirst().orElse(null);
                if (sysRole==null){
                    result.append("角色", "角色名称不存在");
                    continue;
                }else{
                    if (sysRole.getStatus()==1){
                        result.append("角色", "角色已禁用");
                        continue;
                    }else{
                        sysRole.setRoleId(sysRole.getRoleId());
                    }
                }
            }
            if (!org.springframework.util.StringUtils.hasLength(locationExcel.getNickName())){
                result.append("员工名称", "员工名称不能为空");
                continue;
            }else{
                sysUser.setNickName(locationExcel.getNickName());
            }
            if (!org.springframework.util.StringUtils.hasLength(locationExcel.getUserName())){
                result.append("登录账号", "登录账号不能为空");
                continue;
            }else{
                sysUser.setUserName(locationExcel.getUserName());
            }
            if (!org.springframework.util.StringUtils.hasLength(locationExcel.getEmail())){
                result.append("邮箱", "邮箱不能为空");
                continue;
            }else{
                sysUser.setEmail(locationExcel.getEmail());
            }
            if (!org.springframework.util.StringUtils.hasLength(locationExcel.getPhonenumber())){
                result.append("联系电话", "联系电话不能为空");
                continue;
            }else{
                sysUser.setPhonenumber(locationExcel.getPhonenumber());
                // 如果手机号小于六位
                if (locationExcel.getPhonenumber().length() < 6){
                    result.append("联系电话", "联系电话格式错误");
                    continue;
                }
                // 截取手机号后六位
                sysUser.setPassword(SecurityUtils.encryptPassword(locationExcel.getPhonenumber().substring(locationExcel.getPhonenumber().length() - 6)));
            }
            sysUser.setStatus("0");
            sysUser.setDelFlag("0");
            if (!org.springframework.util.StringUtils.hasLength(locationExcel.getTemplateName())){
                result.append("模板名称", "模板名称不能为空");
                continue;
            }else{
                TTemplate template = templateService.lambdaQuery().eq(TTemplate::getTemplateName, locationExcel.getTemplateName())
                        .last("limit 1").one();
                if (template==null){
                    result.append("模板名称", "模板名称不存在");
                    continue;
                }else{
                    sysUser.setTemplateId(template.getId());
                }
            }
            sysUser.setCreateBy(getUsername());
            userService.insertUser(sysUser);
        }
        if (!result.isEmpty()) {
            return R.ok(result.toString());
        }
        return R.ok();
    }
    @ApiOperation(value = "员工导入模板下载")
    @GetMapping("/importDownload")
    public void importDownload() {
        List<TSysUserImportExcel> locationImportExcels = new ArrayList<>();
        TSysUserImportExcel tLocationImportExcel = new TSysUserImportExcel();
        locationImportExcels.add(tLocationImportExcel);
        Workbook workbook = ExcelExportUtil.exportExcel(new ExportParams(), TSysUserImportExcel.class, locationImportExcels);
        HttpServletResponse response = WebUtils.response();
        ServletOutputStream outputStream = null;
        try {
            String fileName = URLEncoder.encode("员工导入模板.xls", "utf-8");
            response.setHeader("Content-Disposition", "attachment;filename=" + fileName);
            response.setHeader("content-Type", "application/vnd.ms-excel");
            response.setHeader("Pragma", "no-cache");
            response.setHeader("Cache-Control", "no-cache");
            outputStream = response.getOutputStream();
            workbook.write(outputStream);
        } catch (IOException e) {
            e.printStackTrace();
            System.out.println("员工导入模板下载失败!");
        } finally {
            try {
                outputStream.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
    /**
@@ -201,22 +381,18 @@
    @ApiOperation(value = "修改用户管理")
    @Log(title = "用户信息-修改用户", businessType = BusinessType.UPDATE)
    @PostMapping("/edit")
    public AjaxResult edit(@Validated @RequestBody SysUser user)
    {
    public AjaxResult edit(@Validated @RequestBody SysUser user) {
        user.setUserName(user.getPhonenumber());
//        userService.checkUserAllowed(user);
//        userService.checkUserDataScope(user.getUserId());
        if (!userService.checkUserNameUnique(user))
        {
        if (!userService.checkUserNameUnique(user)) {
            return error("修改用户'" + user.getUserName() + "'失败,登录账号已存在");
        }
        else if (StringUtils.isNotEmpty(user.getPhonenumber()) && !userService.checkPhoneUnique(user))
        {
        } else if (StringUtils.isNotEmpty(user.getPhonenumber()) && !userService.checkPhoneUnique(user)) {
            return error("修改用户'" + user.getUserName() + "'失败,手机号码已存在");
        }
        user.setUpdateBy(getUsername());
        if(StringUtils.isNotEmpty(user.getPassword())){
        if (StringUtils.isNotEmpty(user.getPassword())) {
            user.setPassword(SecurityUtils.encryptPassword(user.getPassword()));
        }
        return AjaxResult.success(userService.updateUser(user));
@@ -229,15 +405,13 @@
    @ApiOperation(value = "批量删除用户")
    @Log(title = "用户信息-批量删除用户", businessType = BusinessType.DELETE)
    @DeleteMapping("/deleteById/{ids}")
    public AjaxResult remove(@PathVariable String ids)
    {
    public AjaxResult remove(@PathVariable String ids) {
        String[] split = ids.split(",");
        List<Long> userIds = new ArrayList<>();
        for (String s : split) {
            userIds.add(Long.valueOf(s));
        }
        if (userIds.contains(getUserId()))
        {
        if (userIds.contains(getUserId())) {
            return error("当前用户不能删除");
        }
        return AjaxResult.success(userService.deleteUserByIds(userIds));
@@ -250,8 +424,7 @@
    @ApiOperation(value = "重置密码")
    @Log(title = "用户信息-重置密码", businessType = BusinessType.UPDATE)
    @PostMapping("/resetPwd")
    public AjaxResult resetPwd(@RequestBody SysUser user)
    {
    public AjaxResult resetPwd(@RequestBody SysUser user) {
        userService.checkUserAllowed(user);
//        userService.checkUserDataScope(user.getUserId());
        user.setPassword(SecurityUtils.encryptPassword(user.getPassword()));
@@ -265,8 +438,7 @@
    @ApiOperation(value = "状态修改/启用禁用")
    @Log(title = "用户信息-状态修改", businessType = BusinessType.UPDATE)
    @PutMapping("/changeStatus")
    public AjaxResult changeStatus(@RequestBody SysUserUpdateStatusDTO dto)
    {
    public AjaxResult changeStatus(@RequestBody SysUserUpdateStatusDTO dto) {
        SysUser loginUser = tokenService.getLoginUser().getUser();
        SysUser user = new SysUser();
        user.setUserId(dto.getUserId());
@@ -275,7 +447,7 @@
        user.setUpdateBy(getUsername());
        user.setDisableRemark(dto.getRemark());
        user.setOperatingTime(LocalDateTime.now());
        user.setOperatingPerson(loginUser.getNickName()+"("+loginUser.getUserName()+")");
        user.setOperatingPerson(loginUser.getNickName() + "(" + loginUser.getUserName() + ")");
        return AjaxResult.success(userService.updateUserStatus(user));
    }
@@ -284,8 +456,7 @@
     */
    // @PreAuthorize("@ss.hasPermi('system:user:query')")
    @GetMapping("/authRole/{userId}")
    public AjaxResult authRole(@PathVariable("userId") Long userId)
    {
    public AjaxResult authRole(@PathVariable("userId") Long userId) {
        AjaxResult ajax = AjaxResult.success();
        SysUser user = userService.selectUserById(userId);
        List<SysRole> roles = roleService.selectRolesByUserId(userId);
@@ -300,8 +471,7 @@
    // @PreAuthorize("@ss.hasPermi('system:user:edit')")
    @Log(title = "用户管理", businessType = BusinessType.GRANT)
    @PutMapping("/authRole")
    public AjaxResult insertAuthRole(Long userId, Long[] roleIds)
    {
    public AjaxResult insertAuthRole(Long userId, Long[] roleIds) {
        userService.checkUserDataScope(userId);
        userService.insertUserAuth(userId, roleIds);
        return AjaxResult.success();
@@ -312,8 +482,7 @@
     */
    // @PreAuthorize("@ss.hasPermi('system:user:list')")
    @GetMapping("/deptTree")
    public AjaxResult deptTree(SysDept dept)
    {
    public AjaxResult deptTree(SysDept dept) {
        return AjaxResult.success(deptService.selectDeptTreeList(dept));
    }
}
ruoyi-admin/src/main/java/com/ruoyi/web/controller/task/TaskUtil.java
@@ -71,14 +71,10 @@
    private TLeaveService leaveService;
    @Resource
    private TNoticeService noticeService;
    // 每一个小时执行一次
//    @Scheduled(cron = "0 0 0 * * ?")
//    @Scheduled(fixedRate = 1500000000)
    // 每天晚上22点执行
    @Scheduled(cron = "0 0 22 * * ?")
    public void dayOfCreateInspection() {
        try {
            // 查询任务模板
            List<TTemplate> list = templateService.list();
            if (CollectionUtils.isEmpty(list)) {
@@ -152,7 +148,8 @@
                                msgUtils.sendMsg2(sysUser.getPhonenumber(),count+"");
                                break;
                            case 2:
                                if (StringUtils.hasLength(email.getDataContent())&&StringUtils.hasLength(code.getDataContent())){
                                if (StringUtils.hasLength(email.getDataContent())&&StringUtils.hasLength(code.getDataContent())
                                        &&StringUtils.hasLength(sysUser.getEmail())){
                                    EmailUtils.sendEmail(sysUser.getEmail(),email.getDataContent(),code.getDataContent(),"今日剩余"+count+"个任务未完成,请尽快处理");
                                }
                                break;
ruoyi-admin/src/main/java/com/ruoyi/web/controller/tool/EmailUtils.java
@@ -26,6 +26,10 @@
public class EmailUtils {
    public static void sendEmail(String userEmail, String sendEmail, String code, String content) throws Exception {
        if (userEmail == null){
            log.error("用户邮箱为空");
            return;
        }
// 发送邮箱
        // 收件人电子邮箱,TODO 换成自己的收件箱
        String to = userEmail;
ruoyi-admin/src/main/resources/application.yml
@@ -1,4 +1,4 @@
# 项目相关配置
spring:
  profiles:
    active: prod
    active: test
ruoyi-applet/src/main/java/com/ruoyi/web/controller/api/TIndexController.java
@@ -66,6 +66,8 @@
    @Resource
    private TTaskDetailService taskDetailService;
    @Resource
    private TInspectorDetailService inspectorDetailService;
    @Resource
@@ -330,6 +332,7 @@
        IndexVO res = new IndexVO();
        res.setIsNotice(0);
        Long userId = tokenService.getLoginUserApplet().getUserId();
        List<TLocation> locations = locationService.lambdaQuery().eq(TLocation::getLocationLeader, userId).list();
        Long count = noticeService.lambdaQuery().eq(TNotice::getUserId, userId).eq(TNotice::getStatus, 1).count();
        if (count>0){
            res.setIsNotice(1);
@@ -340,6 +343,7 @@
        List<TLocationType> locationTypeList = locationTypeService.list();
        dto.setUserId(userId);
        List<TTask> taskAll = taskCleanerService.indexTask(dto);
        List<TInspector> inspectorAll = taskCleanerService.indexInspector(dto);
//        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);
@@ -491,49 +495,57 @@
            if (taskDetailsStatus1!=null){
                taskTodayVO.setRemark(taskDetailsStatus1.getAuditRemark());
            }
            // 任务记录ids
            List<String> collect = taskAll.stream().map(TTask::getId).collect(Collectors.toList());
            if (!collect.isEmpty()){
                List<TInspector> list1 = inspectorService.lambdaQuery()
                        .in(TInspector::getTaskId, collect).eq(TInspector::getStatus, 2).list();
                for (TInspector tInspector : list1) {
                    TaskPendingVO taskTodayVOOne = new TaskPendingVO();
                    BeanUtils.copyProperties(tTask, taskTodayVOOne);
                    taskTodayVOOne.setId(tInspector.getId());
                    TLocation tLocationOne = locationList.stream().filter(e -> e.getId().equals(tTask.getLocationId())).findFirst().orElse(null);
                    if (tLocationOne != null) {
                        taskTodayVOOne.setLocationAddress(tLocationOne.getLocationAddress());
                        taskTodayVOOne.setLocationLon(tLocationOne.getLocationLon());
                        taskTodayVOOne.setLocationLat(tLocationOne.getLocationLat());
                        taskTodayVOOne.setLocationName(tLocationOne.getLocationName());
                        if(StringUtils.hasLength(dto.getLon())){
                            taskTodayVO.setDistance(tTask.getDistance().divide(new BigDecimal(1000),2, RoundingMode.HALF_DOWN));
                        }else {
                            taskTodayVO.setDistance(new BigDecimal("0"));
                        }
                        TLocationType tLocationType = locationTypeList.stream().filter(e -> e.getId().equals(tLocationOne.getLocationType())).findFirst().orElse(null);
                        if (tLocationType != null) {
                            taskTodayVOOne.setLocationTypeName(tLocationType.getLocationName());
                            taskTodayVOOne.setLocationTypeIcon(tLocationType.getLocationIcon());
                        }
                    }
                    taskTodayVOOne.setStatus(4);
                    taskTodayVOOne.setRemark(tInspector.getAuditRemark());
                    pendingTask.add(taskTodayVOOne);
            taskTodayVO.setIsInspector(0);
            pendingTask.add(taskTodayVO);
        }
        // 点位ids
        List<String> collect = locations.stream().map(TLocation::getId).collect(Collectors.toList());
        if (collect.isEmpty()){
            collect.add("-1");
        }
        List<TInspector> list1 = inspectorAll.stream().filter(e->collect.contains(e.getLocationId())).collect(Collectors.toList());
        for (TInspector tInspector : list1) {
            TInspectorDetail taskDetailsStatus1 = inspectorDetailService.lambdaQuery()
                    .eq(TInspectorDetail::getInspectorId, tInspector.getId())
                    .in(TInspectorDetail::getHandleType, Arrays.asList(3,6))
                    .orderByDesc(TInspectorDetail::getCreateTime).last("limit 1").one();
            TaskPendingVO taskTodayVOOne = new TaskPendingVO();
            BeanUtils.copyProperties(tInspector, taskTodayVOOne);
            taskTodayVOOne.setId(tInspector.getId());
            TLocation tLocationOne = locationList.stream().filter(e -> e.getId().equals(tInspector.getLocationId())).findFirst().orElse(null);
            if (tLocationOne != null) {
                taskTodayVOOne.setLocationAddress(tLocationOne.getLocationAddress());
                taskTodayVOOne.setLocationLon(tLocationOne.getLocationLon());
                taskTodayVOOne.setLocationLat(tLocationOne.getLocationLat());
                taskTodayVOOne.setLocationName(tLocationOne.getLocationName());
                if(StringUtils.hasLength(dto.getLon())){
                    taskTodayVOOne.setDistance(tInspector.getDistance().divide(new BigDecimal(1000),2, RoundingMode.HALF_DOWN));
                }else {
                    taskTodayVOOne.setDistance(new BigDecimal("0"));
                }
                TLocationType tLocationType = locationTypeList.stream().filter(e -> e.getId().equals(tLocationOne.getLocationType())).findFirst().orElse(null);
                if (tLocationType != null) {
                    taskTodayVOOne.setLocationTypeName(tLocationType.getLocationName());
                    taskTodayVOOne.setLocationTypeIcon(tLocationType.getLocationIcon());
                }
            }
            pendingTask.add(taskTodayVO);
            taskTodayVOOne.setStatus(4);
            if (taskDetailsStatus1!=null){
                taskTodayVOOne.setRemark(taskDetailsStatus1.getAuditRemark());
            }
            taskTodayVOOne.setIsInspector(1);
            pendingTask.add(taskTodayVOOne);
        }
        // 将pendingTask按照距离 从小到大排序
        pendingTask.sort(Comparator.comparing(TaskPendingVO::getDistance));
        res.setPendingTask(pendingTask);
        res.setLeaveList(leaveList);
        List<TaskTodayVO> todayTask = new ArrayList<>();
        List<String> collect = taskAll.stream().map(TTask::getId).collect(Collectors.toList());
        List<String> tasdids = taskAll.stream().map(TTask::getId).collect(Collectors.toList());
        for (TTask tTask : taskToday) {
            TaskTodayVO taskTodayVO = new TaskTodayVO();
            if(CollectionUtils.isEmpty(collect)){
            if(CollectionUtils.isEmpty(tasdids)){
                break;
            }
            TTaskDetail taskDetailsStatus1 = taskDetailService.lambdaQuery()
ruoyi-applet/src/main/java/com/ruoyi/web/controller/api/TTaskDetailController.java
@@ -8,8 +8,11 @@
import com.ruoyi.common.annotation.Log;
import com.ruoyi.common.core.domain.R;
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.AppealDTO;
import com.ruoyi.system.applet.dto.AppealInspectorDTO;
import com.ruoyi.system.dto.InspectorDetailDto;
import com.ruoyi.system.dto.TTaskAuditBatchDTO;
import com.ruoyi.system.dto.TaskDetailDto;
import com.ruoyi.system.model.*;
@@ -57,6 +60,8 @@
    private TLocationService locationService;
    @Resource
    private TInspectorService inspectorService;
    @Resource
    private TInspectorDetailService inspectorDetailService;
    @ApiOperation(value = "上传任务")
    @PostMapping(value = "/uploadTask")
@@ -64,27 +69,27 @@
        double radius = 50; // 单位:米
        int segments = 4;   // 四段,共 5 个点
        TTask task = taskService.getById(dto.getTaskId());
        if (task==null)return R.fail("任务不存在");
        TLocation location = locationService.getById(task.getLocationId());
        if (location==null)return R.fail("点位不存在");
        TInspector byId = inspectorService.getById(dto.getId());
        TInspector byId = inspectorService.getById(dto.getTaskId());
        if (byId!=null){
            UpdateWrapper<TInspector> tInspectorUpdateWrapper = new UpdateWrapper<>();
            tInspectorUpdateWrapper.set("clear_status", dto.getClearStatus());
            tInspectorUpdateWrapper.set("unqualified", dto.getUnqualified());
            tInspectorUpdateWrapper.set("remark", dto.getRemark());
            tInspectorUpdateWrapper.set("picture", dto.getPicture());
            tInspectorUpdateWrapper.set("audio_url", dto.getAudioUrl());
            tInspectorUpdateWrapper.set("status", 1);
            tInspectorUpdateWrapper.set("audit_time", 1);
            tInspectorUpdateWrapper.set("audit_person", 1);
            tInspectorUpdateWrapper.set("audit_status", 1);
            tInspectorUpdateWrapper.set("audit_remark", 1);
            tInspectorUpdateWrapper.eq("id", dto.getId());
            inspectorService.update(tInspectorUpdateWrapper);
            TLocation location = locationService.getById(byId.getLocationId());
            byId.setClearStatus( dto.getClearStatus());
            byId.setUnqualified(dto.getUnqualified());
            byId.setRemark( dto.getRemark());
            byId.setPicture( dto.getPicture());
            byId.setAudioUrl( dto.getAudioUrl());
            byId.setStatus( 1);
            TInspectorDetail tInspectorDetail = new TInspectorDetail();
            BeanUtils.copyProperties(dto, tInspectorDetail);
            tInspectorDetail.setInspectorId(byId.getId());
            tInspectorDetail.setHandleType(1);
            tInspectorDetail.setInspectorId(byId.getId());
            inspectorDetailService.save(tInspectorDetail);
            inspectorService.updateById(byId);
        }else{
            TLocation location = locationService.getById(task.getLocationId());
            //        try {
//            String routeJson = AmapApiClient.getDrivingRoute(Double.parseDouble(location.getLocationLat()),
//            String routeJson = AmapApiCalient.getDrivingRoute(Double.parseDouble(location.getLocationLat()),
//                    Double.parseDouble(location.getLocationLon()),
//                            Double.parseDouble(location.getLocationLatEnd()),
//                                    Double.parseDouble(location.getLocationLonEnd()));
@@ -111,6 +116,10 @@
//        } catch (Exception e) {
//            e.printStackTrace();
//        }
            dto.setTaskId(task.getId());
            dto.setHandleType(1);
            dto.setAuditStatus(1);
            dto.setAuditTime(LocalDateTime.now());
            taskDetailService.save(dto);
            // 修改任务状态
            taskService.update(Wrappers.<TTask>lambdaUpdate().set(TTask::getStatus, 3).eq(TTask::getId, dto.getTaskId()));
@@ -118,6 +127,7 @@
        return R.ok();
    }
    @Resource
    private TokenService tokenService;
@@ -155,6 +165,24 @@
        taskDetailService.save(taskDetail);
        return R.ok();
    }
    @ApiOperation(value = "督察申诉")
    @PostMapping(value = "/appealInspector")
    public R<Boolean> appealInspector(@RequestBody AppealInspectorDTO dto) {
        List<TAppeal> list = appealService.lambdaQuery().eq(TAppeal::getInspectorId, dto.getInspectorId()).list();
        if (!list.isEmpty()){
            return R.fail("任务只有一次申诉机会");
        }
        dto.setAppealPerson(tokenService.getLoginUserApplet().getUserId()+"");
        appealService.save(dto);
        // 添加督察任务详情
        TInspectorDetail taskDetail = new TInspectorDetail();
        taskDetail.setInspectorId(dto.getTaskId());
        taskDetail.setHandleType(4);
        taskDetail.setClearStatus(taskDetail.getClearStatus());
        taskDetail.setAppealId(dto.getId());
        inspectorDetailService.save(taskDetail);
        return R.ok();
    }
}
ruoyi-applet/src/main/java/com/ruoyi/web/controller/api/TUserController.java
@@ -12,6 +12,7 @@
import com.ruoyi.common.core.domain.entity.SysUser;
import com.ruoyi.common.enums.BusinessType;
import com.ruoyi.common.redis.service.RedisService;
import com.ruoyi.common.utils.CodeGenerateUtils;
import com.ruoyi.common.utils.DateUtils;
import com.ruoyi.common.utils.bean.BeanUtils;
import com.ruoyi.framework.web.service.TokenService;
@@ -124,6 +125,8 @@
    private MsgUtils msgUtils;
    @Resource
    private TemplateMessageSendUtil templateMessageSendUtil;
    @Resource
    private TInspectorDetailService inspectorDetailService;
    @ApiOperation(value = "通过code获得openid,获取用户信息",tags = {"微信小程序登录"})
    @GetMapping("/openIdByJsCode")
    public R<String> openIdByJsCode(@RequestParam String code) {
@@ -377,100 +380,151 @@
    @ApiOperation(value = "详情任务")
    @GetMapping(value = "/detail")
    public R<TaskDetailVO> detail(@RequestParam String id) {
        List<TTaskDetail> list = taskDetailService.lambdaQuery().eq(TTaskDetail::getTaskId, id)
                .orderByDesc(BaseModel::getCreateTime).list();
        TaskDetailVO taskDetailVO = new TaskDetailVO();
        TTask byId = taskCleanerService.getById(id);
        BeanUtils.copyProperties(byId, taskDetailVO);
        TLocation byId1 = locationService.getById(byId.getLocationId());
        TLocationType byId2 = locationTypeService.getById(byId1.getLocationType());
        taskDetailVO.setLocationName(byId1.getLocationName());
        taskDetailVO.setLocationAddress(byId1.getLocationAddress());
        taskDetailVO.setLocationAddressEnd(byId1.getLocationAddressEnd());
        taskDetailVO.setLocationIcon(byId2.getLocationIcon());
        taskDetailVO.setLocationTypeName(byId2.getLocationName());
        taskDetailVO.setLocationLon(byId1.getLocationLon());
        taskDetailVO.setLocationLat(byId1.getLocationLat());
        taskDetailVO.setLocationLatEnd(byId1.getLocationLatEnd());
        taskDetailVO.setLocationLonEnd(byId1.getLocationLonEnd());
        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());
            }
        }
        if (tTaskDetail != null) {
            tTaskDetail.setFinishTime(tTaskDetail.getCreateTime());
        }
        taskDetailVO.setTaskDetail(tTaskDetail);
        taskDetailVO.setRecords(list);
        if (byId.getStatus()==4){
            TTaskDetail reject = taskDetailService.lambdaQuery().eq(TTaskDetail::getTaskId, id)
                    .eq(TTaskDetail::getHandleType,3)
                    .orderByDesc(BaseModel::getCreateTime).last("limit 1").one();
            if (reject!=null){
                taskDetailVO.setRejectRemark(reject.getAuditRemark());
            }
        }
        return R.ok(taskDetailVO);
    }
    @ApiOperation(value = "督察任务-详情任务")
    @GetMapping(value = "/detaiInspectorl")
    public R<InspectorDetailVO> detaiInspectorl(@RequestParam String id) {
        InspectorDetailVO taskDetailVO = new InspectorDetailVO();
        TInspector inspector = inspectorService.getById(id);
        TLocation location = locationService.getById(inspector.getLocationId());
        TLocationType locationType = locationTypeService.getById(location.getLocationType());
        taskDetailVO.setLocationAddress(location.getLocationAddress());
        taskDetailVO.setLocationAddressEnd(location.getLocationAddressEnd());
        taskDetailVO.setLocationIcon(locationType.getLocationIcon());
        taskDetailVO.setLocationName(locationType.getLocationName());
        taskDetailVO.setLocationTypeName(locationType.getLocationName());
        taskDetailVO.setLocationLonEnd(location.getLocationLonEnd());
        taskDetailVO.setLocationLatEnd(location.getLocationLatEnd());
        taskDetailVO.setLocationLon(location.getLocationLon());
        taskDetailVO.setLocationLat(location.getLocationLat());
        taskDetailVO.setLocationName(location.getLocationName());
        taskDetailVO.setId(inspector.getId());
        taskDetailVO.setClearStatus(inspector.getClearStatus());
        taskDetailVO.setUnqualified(inspector.getUnqualified());
        taskDetailVO.setRemark(inspector.getAuditRemark());
        taskDetailVO.setPicture(inspector.getPicture());
        taskDetailVO.setAudioUrl(inspector.getAudioUrl());
        taskDetailVO.setStatus(inspector.getStatus());
        taskDetailVO.setAuditPerson(inspector.getAuditPerson());
        taskDetailVO.setAuditTime(inspector.getAuditTime());
        taskDetailVO.setAuditStatus(inspector.getAuditStatus());
        taskDetailVO.setAuditRemark(inspector.getAuditRemark());
        return R.ok(taskDetailVO);
        if (byId!=null){
            List<TTaskDetail> list = taskDetailService.lambdaQuery().eq(TTaskDetail::getTaskId, id)
                    .orderByDesc(BaseModel::getCreateTime).list();
            TaskDetailVO taskDetailVO = new TaskDetailVO();
            BeanUtils.copyProperties(byId, taskDetailVO);
            TLocation byId1 = locationService.getById(byId.getLocationId());
            TLocationType byId2 = locationTypeService.getById(byId1.getLocationType());
            taskDetailVO.setLocationName(byId1.getLocationName());
            taskDetailVO.setLocationAddress(byId1.getLocationAddress());
            taskDetailVO.setLocationAddressEnd(byId1.getLocationAddressEnd());
            taskDetailVO.setLocationIcon(byId2.getLocationIcon());
            taskDetailVO.setLocationTypeName(byId2.getLocationName());
            taskDetailVO.setLocationLon(byId1.getLocationLon());
            taskDetailVO.setLocationLat(byId1.getLocationLat());
            taskDetailVO.setLocationLatEnd(byId1.getLocationLatEnd());
            taskDetailVO.setLocationLonEnd(byId1.getLocationLonEnd());
            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());
                }
            }
            if (tTaskDetail != null) {
                tTaskDetail.setFinishTime(tTaskDetail.getCreateTime());
            }
            taskDetailVO.setTaskDetail(tTaskDetail);
            taskDetailVO.setRecords(list);
            if (byId.getStatus()==4){
                TTaskDetail reject = taskDetailService.lambdaQuery().eq(TTaskDetail::getTaskId, id)
                        .eq(TTaskDetail::getHandleType,3)
                        .orderByDesc(BaseModel::getCreateTime).last("limit 1").one();
                if (reject!=null){
                    taskDetailVO.setRejectRemark(reject.getAuditRemark());
                }
            }
            return R.ok(taskDetailVO);
        }else{
            List<TInspectorDetail> list = inspectorDetailService.lambdaQuery().eq(TInspectorDetail::getInspectorId, id)
                    .orderByDesc(BaseModel::getCreateTime).list();
            TaskDetailVO taskDetailVO = new TaskDetailVO();
            BeanUtils.copyProperties(inspector, taskDetailVO);
            TLocation byId1 = locationService.getById(inspector.getLocationId());
            TLocationType byId2 = locationTypeService.getById(byId1.getLocationType());
            taskDetailVO.setLocationName(byId1.getLocationName());
            taskDetailVO.setLocationAddress(byId1.getLocationAddress());
            taskDetailVO.setLocationAddressEnd(byId1.getLocationAddressEnd());
            taskDetailVO.setLocationIcon(byId2.getLocationIcon());
            taskDetailVO.setLocationTypeName(byId2.getLocationName());
            taskDetailVO.setLocationLon(byId1.getLocationLon());
            taskDetailVO.setLocationLat(byId1.getLocationLat());
            taskDetailVO.setLocationLatEnd(byId1.getLocationLatEnd());
            taskDetailVO.setLocationLonEnd(byId1.getLocationLonEnd());
            TInspectorDetail inspectorDetail = list.stream().filter(e -> e.getHandleType() == 1).findFirst().orElse(null);
            if (inspectorDetail != null && inspectorDetail.getUnqualified() != null) {
                TTaskDetail temp = new TTaskDetail();
                BeanUtils.copyProperties(inspectorDetail, temp);
                taskDetailVO.setTaskDetail(temp);
                TDictData byId3 = dictDataService.getById(inspectorDetail.getUnqualified());
                if (byId3 != null) {
                    inspectorDetail.setUnqualifiedName(byId3.getDataContent());
                }
            }
            if (inspectorDetail != null) {
                inspectorDetail.setFinishTime(inspectorDetail.getCreateTime());
            }
            List<TTaskDetail> tTaskDetails = new ArrayList<>();
            for (TInspectorDetail tInspectorDetail : list) {
                TTaskDetail tTaskDetail = new TTaskDetail();
                BeanUtils.copyProperties(tInspectorDetail, tTaskDetail);
                tTaskDetails.add(tTaskDetail);
            }
            taskDetailVO.setRecords(tTaskDetails);
            if (inspector.getStatus()==2){
                TInspectorDetail reject = inspectorDetailService.lambdaQuery().eq(TInspectorDetail::getInspectorId, id)
                        .eq(TInspectorDetail::getHandleType,3)
                        .orderByDesc(BaseModel::getCreateTime).last("limit 1").one();
                if (reject!=null){
                    taskDetailVO.setRejectRemark(reject.getAuditRemark());
                }
            }
            return R.ok(taskDetailVO);
        }
    }
    @ApiOperation(value = "详情任务-操作记录-详情")
    @GetMapping(value = "/detailRecord")
    public R<TaskRecordDetailVO> detailRecord(@RequestParam String id) {
        TaskRecordDetailVO taskDetailVO = new TaskRecordDetailVO();
        TTaskDetail byId4 = taskDetailService.getById(id);
        TTask byId = taskCleanerService.getById(byId4.getTaskId());
        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());
        if (byId4.getUnqualified() != null) {
            TDictData byId3 = dictDataService.getById(byId4.getUnqualified());
            if (byId3 != null) {
                byId4.setUnqualifiedName(byId3.getDataContent());
        TTaskDetail taskDetail = taskDetailService.getById(id);
        TInspectorDetail inspectorDetail = inspectorDetailService.getById(id);
        if (taskDetail!=null){
            TTask byId = taskCleanerService.getById(taskDetail.getTaskId());
            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());
            if (taskDetail.getUnqualified() != null) {
                TDictData byId3 = dictDataService.getById(taskDetail.getUnqualified());
                if (byId3 != null) {
                    taskDetail.setUnqualifiedName(byId3.getDataContent());
                }
            }
            taskDetail.setFinishTime(taskDetail.getCreateTime());
            SysUser sysUser = sysUserService.selectUserById(Long.valueOf(taskDetail.getAuditPerson()));
            if (sysUser != null) {
                taskDetail.setAuditPersonName(sysUser.getUserName());
            }
            taskDetailVO.setTaskDetail(taskDetail);
            return R.ok(taskDetailVO);
        }else{
            TInspector byId = inspectorService.getById(inspectorDetail.getInspectorId());
            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());
            if (inspectorDetail.getUnqualified() != null) {
                TDictData byId3 = dictDataService.getById(inspectorDetail.getUnqualified());
                if (byId3 != null) {
                    inspectorDetail.setUnqualifiedName(byId3.getDataContent());
                }
            }
            inspectorDetail.setFinishTime(inspectorDetail.getCreateTime());
            SysUser sysUser = sysUserService.selectUserById(Long.valueOf(inspectorDetail.getAuditPerson()));
            if (sysUser != null) {
                inspectorDetail.setAuditPersonName(sysUser.getUserName());
            }
            TTaskDetail tTaskDetail = new TTaskDetail();
            BeanUtils.copyProperties(inspectorDetail, tTaskDetail);
            taskDetailVO.setTaskDetail(tTaskDetail);
            return R.ok(taskDetailVO);
        }
        byId4.setFinishTime(byId4.getCreateTime());
        SysUser sysUser = sysUserService.selectUserById(Long.valueOf(byId4.getAuditPerson()));
        if (sysUser != null) {
            byId4.setAuditPersonName(sysUser.getUserName());
        }
        taskDetailVO.setTaskDetail(byId4);
        return R.ok(taskDetailVO);
    }
    @ApiOperation(value = "申诉记录分页列表")
@@ -527,7 +581,12 @@
        List<TaskListAllVO> res = appealService.listAllTask(appealListDTO);
        return R.ok(res);
    }
    @ApiOperation(value = "点位列表")
    @PostMapping(value = "/locationList")
    public R<List<TaskListAllVO>> locationList(@RequestBody AppealListDTO appealListDTO) {
        List<TaskListAllVO> locations = appealService.locationList(appealListDTO);
        return R.ok(locations);
    }
    @ApiOperation(value = "不合格原因列表")
    @PostMapping(value = "/unqualifiedList")
    public R<List<TDictData>> unqualifiedList() {
@@ -537,32 +596,14 @@
        );
        return R.ok(list);
    }
    @ApiOperation(value = "点位列表")
    @PostMapping(value = "/locationList")
    public R<List<TLocation>> locationList() {
        List<TLocation> locations = locationService.list();
        return R.ok(locations);
    }
    @ApiOperation(value = "上传督察任务")
    @PostMapping(value = "/addInspector")
    public R<Boolean> addInspector(@RequestBody InspectorAddDTO dto) throws Exception {
        TTask task = taskCleanerService.getById(dto.getTaskId());
        TLocation location = locationService.getById(task.getLocationId());
        SysUser sysUser = sysUserService.selectUserById(Long.valueOf(task.getPatrolInspector()));
        dto.setCommitPerson(tokenService.getLoginUserApplet().getUserId() + "");
        if (dto.getClearStatus() == 1) {
            dto.setStatus(4);
        } else {
            dto.setStatus(1);
        }
        inspectorService.save(dto);
        return R.ok();
//        TLocation location = locationService.getById(dto.getLocationId());
//        SysUser sysUser = sysUserService.selectUserById(Long.valueOf(location.getLocationLeader()));
//        TTask task = taskCleanerService.getById(dto.getTaskId());
//        TLocation location = locationService.getById(task.getLocationId());
//        SysUser sysUser = sysUserService.selectUserById(Long.valueOf(task.getPatrolInspector()));
//        dto.setCommitPerson(tokenService.getLoginUserApplet().getUserId() + "");
//
//        if (dto.getClearStatus() == 1) {
@@ -573,6 +614,32 @@
//        }
//        inspectorService.save(dto);
//        return R.ok();
        TLocation location = locationService.getById(dto.getLocationId());
        SysUser sysUser = sysUserService.selectUserById(Long.valueOf(location.getLocationLeader()));
        dto.setCommitPerson(tokenService.getLoginUserApplet().getUserId() + "");
        if (dto.getClearStatus() == 1) {
            dto.setStatus(4);
        } else {
            dto.setStatus(2);
        }
        String nameAndCode = CodeGenerateUtils.generateVolumeSn();
        dto.setTaskCode(nameAndCode);
        dto.setTaskName(nameAndCode);
        inspectorService.save(dto);
        TInspectorDetail tInspectorDetail = new TInspectorDetail();
        tInspectorDetail.setInspectorId(dto.getId());
        tInspectorDetail.setClearStatus(dto.getClearStatus());
        tInspectorDetail.setUnqualified(dto.getUnqualified());
        tInspectorDetail.setRemark(dto.getRemark());
        tInspectorDetail.setPicture(dto.getPicture());
        tInspectorDetail.setAudioUrl(dto.getAudioUrl());
        tInspectorDetail.setHandleType(1);
        inspectorDetailService.save(tInspectorDetail);
        return R.ok();
    }
    @ApiOperation(value = "上传意见反馈")
@@ -748,6 +815,11 @@
        leaveDTO.setCode(format + RandomUtil.randomNumbers(6));
        leaveDTO.setTemplateId(user.getTemplateId());
        leaveDTO.setLeavePerson(userId + "");
        LocalDateTime endTime1 = leaveDTO.getEndTime();
        endTime1.withHour(23);
        endTime1.withMinute(59);
        endTime1.withSecond(59);
        leaveDTO.setEndTime(endTime1);
        leaveService.save(leaveDTO);
        TNoticeSet noticeSet = noticeSetService.lambdaQuery().eq(TNoticeSet::getType, 2).last("limit 1")
                .one();
ruoyi-applet/src/main/resources/application.yml
@@ -1,4 +1,4 @@
# 项目相关配置
spring:
  profiles:
    active: prod
    active: test
ruoyi-system/src/main/java/com/ruoyi/system/applet/dto/AppealInspectorDTO.java
New file
@@ -0,0 +1,11 @@
package com.ruoyi.system.applet.dto;
import com.ruoyi.system.model.TAppeal;
import io.swagger.annotations.ApiModel;
import lombok.Data;
@Data
@ApiModel(value = "督察任务申诉DTO")
public class AppealInspectorDTO extends TAppeal {
}
ruoyi-system/src/main/java/com/ruoyi/system/applet/vo/InspectorUserListVO.java
New file
@@ -0,0 +1,30 @@
package com.ruoyi.system.applet.vo;
import com.ruoyi.system.model.TInspector;
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 InspectorUserListVO extends TInspector {
    @ApiModelProperty(value = "点位名称")
    private String locationName;
    @ApiModelProperty(value = "点位地址开始")
    private String locationAddress;
    @ApiModelProperty(value = "点位地址结束")
    private String locationAddressEnd;
    @ApiModelProperty(value = "点位类型名称")
    private String locationTypeName;
    @ApiModelProperty(value = "点位类型图标")
    private String locationTypeIcon;
    @ApiModelProperty(value = "清洁情况 1合格2不合格")
    private Integer clearStatus;
    @ApiModelProperty(value = "距离 单位km")
    private BigDecimal distance;
}
ruoyi-system/src/main/java/com/ruoyi/system/applet/vo/TaskPendingVO.java
@@ -27,5 +27,7 @@
    private String remark;
    @ApiModelProperty(value = "距离 单位km")
    private BigDecimal distance;
    @ApiModelProperty(value = "是否为督察任务 0否1是,如果是督察任务 详情接口需要调用督察任务详情接口,上传任务需要调用督察任务上传接口,申诉需要调用督察任务申诉")
    private Integer isInspector;
}
ruoyi-system/src/main/java/com/ruoyi/system/dto/InspectorDetailDto.java
New file
@@ -0,0 +1,19 @@
package com.ruoyi.system.dto;
import com.ruoyi.system.model.TInspector;
import com.ruoyi.system.model.TTaskDetail;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
@Data
@ApiModel(value = "上传督察任务DTO")
public class InspectorDetailDto extends TInspector {
    @ApiModelProperty(value = "经度")
    private String lon;
    @ApiModelProperty(value = "纬度")
    private String lat;
}
ruoyi-system/src/main/java/com/ruoyi/system/dto/TInspectorAuditDTO.java
@@ -1,6 +1,7 @@
package com.ruoyi.system.dto;
import com.ruoyi.system.model.TInspector;
import com.ruoyi.system.model.TInspectorDetail;
import com.ruoyi.system.model.TTaskDetail;
import io.swagger.annotations.ApiModel;
import lombok.Data;
ruoyi-system/src/main/java/com/ruoyi/system/importExcel/TCleanerImportExcel.java
New file
@@ -0,0 +1,24 @@
package com.ruoyi.system.importExcel;
import cn.afterturn.easypoi.excel.annotation.Excel;
import io.swagger.annotations.ApiModel;
import lombok.Data;
import java.io.Serializable;
@Data
@ApiModel(value = "保洁员导入excel")
public class TCleanerImportExcel implements Serializable {
    @Excel(name = "部门级编号",width = 20)
    private String deptCode;
    @Excel(name = "项目级编号",width = 20)
    private String projectCode;
    @Excel(name = "片区级编号",width = 20)
    private String cleanerCode;
    @Excel(name = "保洁员姓名",width = 20)
    private String cleanerName;
    @Excel(name = "所属片区名称",width = 20)
    private String projectName;
}
ruoyi-system/src/main/java/com/ruoyi/system/importExcel/TSysUserImportExcel.java
New file
@@ -0,0 +1,31 @@
package com.ruoyi.system.importExcel;
import cn.afterturn.easypoi.excel.annotation.Excel;
import io.swagger.annotations.ApiModel;
import lombok.Data;
import java.io.Serializable;
@Data
@ApiModel(value = "员工导入excel")
public class TSysUserImportExcel implements Serializable {
    @Excel(name = "编号",width = 20)
    private String code;
    @Excel(name = "员工名称",width = 20)
    private String nickName;
    @Excel(name = "联系电话",width = 20)
    private String phonenumber;
    @Excel(name = "邮箱",width = 20)
    private String email;
    @Excel(name = "所属部门(输入1为项目部 输入2为公司/部门))",width = 20)
    private Integer deptType;
    @Excel(name = "部门名称",width = 20)
    private String deptName;
    @Excel(name = "模板名称",width = 20)
    private String templateName;
    @Excel(name = "角色名称",width = 20)
    private String roleName;
    @Excel(name = "登陆账号",width = 20)
    private String userName;
}
ruoyi-system/src/main/java/com/ruoyi/system/mapper/TAppealMapper.java
@@ -28,4 +28,7 @@
    List<TaskListAllVO> listAllTask(@Param("query")AppealListDTO query, @Param("pageInfo")PageInfo<AppealListVO> pageInfo);
    List<TaskListAllVO> locationList(@Param("query")AppealListDTO query, @Param("pageInfo")PageInfo<AppealListVO> pageInfo);
    List<TaskListAllVO> listAllInspector(@Param("query")AppealListDTO query, @Param("pageInfo")PageInfo<AppealListVO> pageInfo);
}
ruoyi-system/src/main/java/com/ruoyi/system/mapper/TInspectorDetailMapper.java
New file
@@ -0,0 +1,17 @@
package com.ruoyi.system.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.ruoyi.system.model.TInspectorDetail;
import com.ruoyi.system.model.TTaskDetail;
/**
 * <p>
 * 任务操作记录 Mapper 接口
 * </p>
 *
 * @author xiaochen
 * @since 2025-05-28
 */
public interface TInspectorDetailMapper extends BaseMapper<TInspectorDetail> {
}
ruoyi-system/src/main/java/com/ruoyi/system/mapper/TInspectorMapper.java
@@ -2,8 +2,11 @@
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.ruoyi.common.basic.PageInfo;
import com.ruoyi.system.applet.dto.AppealListDTO;
import com.ruoyi.system.applet.vo.TaskListAllVO;
import com.ruoyi.system.model.TInspector;
import com.ruoyi.system.query.InsepectorListQuery;
import com.ruoyi.system.vo.system.AppealListVO;
import com.ruoyi.system.vo.system.InspectorListVO;
import com.ruoyi.system.vo.system.TaskListVO;
import org.apache.ibatis.annotations.Param;
@@ -22,4 +25,6 @@
    List<InspectorListVO> pageList(@Param("query")InsepectorListQuery query, @Param("pageInfo")PageInfo<InspectorListVO> pageInfo);
    List<InspectorListVO> pageListExport(@Param("query")InsepectorListQuery query, @Param("pageInfo")PageInfo<InspectorListVO> pageInfo);
    List<TaskListAllVO> listAllInspector(@Param("query") AppealListDTO query, @Param("pageInfo")PageInfo<AppealListVO> pageInfo);
}
ruoyi-system/src/main/java/com/ruoyi/system/mapper/TTaskMapper.java
@@ -4,7 +4,9 @@
import com.ruoyi.common.basic.PageInfo;
import com.ruoyi.system.applet.dto.IndexDTO;
import com.ruoyi.system.applet.query.TaskUserListQuery;
import com.ruoyi.system.applet.vo.InspectorUserListVO;
import com.ruoyi.system.applet.vo.TaskUserListVO;
import com.ruoyi.system.model.TInspector;
import com.ruoyi.system.model.TTask;
import com.ruoyi.system.query.LocationListTaskQuery;
import com.ruoyi.system.query.PointDetailQuery;
@@ -48,4 +50,8 @@
    List<TTask> indexTask(@Param("query") IndexDTO dto);
    List<TTask> getTaskByIds(@Param("ids") List<String> collect1,@Param("lon")String  lon,@Param("lat")String lat);
    List<InspectorUserListVO> pageListUserInspector(@Param("query")TaskUserListQuery query);
    List<TInspector> indexInspector(@Param("query")IndexDTO dto);
}
ruoyi-system/src/main/java/com/ruoyi/system/model/TAppeal.java
@@ -33,6 +33,9 @@
    @ApiModelProperty(value = "任务id")
    @TableField("task_id")
    private String taskId;
    @ApiModelProperty(value = "督察任务id")
    @TableField("inspector_id")
    private String inspectorId;
    @ApiModelProperty(value = "申诉人id")
    @TableField("appeal_person")
@@ -41,6 +44,9 @@
    @ApiModelProperty(value = "状态 1待审核2通过3驳回4已取消")
    @TableField("status")
    private Integer status;
    @ApiModelProperty(value = "驳回次数")
    @TableField("fail_count")
    private Integer failCount;
    @ApiModelProperty(value = "申诉内容")
    @TableField("appeal_content")
ruoyi-system/src/main/java/com/ruoyi/system/model/TInspector.java
@@ -11,6 +11,7 @@
import lombok.EqualsAndHashCode;
import java.io.Serializable;
import java.math.BigDecimal;
import java.time.LocalDateTime;
/**
@@ -31,10 +32,12 @@
    @TableId(value = "id", type = IdType.ASSIGN_ID)
    private String id;
    @ApiModelProperty(value = "任务id")
    @TableField("task_id")
    private String taskId;
    @ApiModelProperty(value = "督察任务名称")
    @TableField("task_name")
    private String taskName;
    @ApiModelProperty(value = "督察任务编号")
    @TableField("task_code")
    private String taskCode;
    @ApiModelProperty(value = "点位id")
    @TableField("location_id")
    private String locationId;
@@ -77,6 +80,10 @@
    @ApiModelProperty(value = "审核状态1通过2驳回")
    @TableField("audit_status")
    private Integer auditStatus;
    @ApiModelProperty(value = "距离单位米")
    @TableField(exist = false)
    private BigDecimal distance;
    @ApiModelProperty(value = "审核备注")
    @TableField("audit_remark")
ruoyi-system/src/main/java/com/ruoyi/system/model/TInspectorDetail.java
New file
@@ -0,0 +1,97 @@
package com.ruoyi.system.model;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.ruoyi.common.core.domain.BaseModel;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
import javax.validation.constraints.NotBlank;
import java.time.LocalDateTime;
/**
 * <p>
 * 任务操作记录
 * </p>
 *
 * @author xiaochen
 * @since 2025-05-28
 */
@Data
@EqualsAndHashCode(callSuper = false)
@TableName("t_inspector_detail")
@ApiModel(value="TInspectorDetail对象", description="督察任务操作记录")
public class TInspectorDetail extends BaseModel {
    private static final long serialVersionUID = 1L;
    @TableId(value = "id", type = IdType.ASSIGN_ID)
    private String id;
    @ApiModelProperty(value = "任务id")
    @TableField("inspector_id")
    @NotBlank(message = "督察任务id不能为空")
    private String inspectorId;
    @ApiModelProperty(value = "清洁情况 1合格2不合格")
    @TableField("clear_status")
    private Integer clearStatus;
    @ApiModelProperty(value = "不合格原因id")
    @TableField("unqualified")
    private String unqualified;
    @ApiModelProperty(value = "不合格原因名称")
    @TableField(exist = false)
    private String unqualifiedName;
    @ApiModelProperty(value = "申诉记录id handleType=4 5 6 返回")
    @TableField("appeal_id")
    private String appealId;
    @ApiModelProperty(value = "备注")
    @TableField("remark")
    private String remark;
    @ApiModelProperty(value = "图片 多张逗号拼接")
    @TableField("picture")
    private String picture;
    @ApiModelProperty(value = "音频url")
    @TableField("audio_url")
    private String audioUrl;
    @ApiModelProperty(value = "审核人id")
    @TableField("audit_person")
    private String auditPerson;
    @ApiModelProperty(value = "审核人名称")
    @TableField(exist = false)
    private String auditPersonName;
    @ApiModelProperty(value = "审核时间")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
    @TableField("audit_time")
    private LocalDateTime auditTime;
    @ApiModelProperty(value = "完成时间")
    @TableField(exist = false)
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
    private LocalDateTime finishTime;
    @ApiModelProperty(value = "审核状态1通过2驳回")
    @TableField("audit_status")
    @NotBlank(message = "审核状态不能为空")
    private Integer auditStatus;
    @ApiModelProperty(value = "审核备注")
    @TableField("audit_remark")
    private String auditRemark;
    @ApiModelProperty(value = "操作类型1提交申请2审核通过3审核不通过4发起申诉5申诉通过6申诉驳回")
    @TableField("handle_type")
    private Integer handleType;
}
ruoyi-system/src/main/java/com/ruoyi/system/service/TAppealService.java
@@ -6,6 +6,7 @@
import com.ruoyi.system.applet.query.AppealListQuery;
import com.ruoyi.system.applet.vo.TaskListAllVO;
import com.ruoyi.system.model.TAppeal;
import com.ruoyi.system.model.TLocation;
import com.ruoyi.system.query.InsepectorListQuery;
import com.ruoyi.system.vo.system.AppealListVO;
@@ -28,4 +29,6 @@
    List<TaskListAllVO> listAllTask(AppealListDTO appealListDTO);
    List<TaskListAllVO> locationList(AppealListDTO appealListDTO);
}
ruoyi-system/src/main/java/com/ruoyi/system/service/TInspectorDetailService.java
New file
@@ -0,0 +1,17 @@
package com.ruoyi.system.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.ruoyi.system.model.TInspectorDetail;
import com.ruoyi.system.model.TTaskDetail;
/**
 * <p>
 * 任务操作记录 服务类
 * </p>
 *
 * @author xiaochen
 * @since 2025-05-28
 */
public interface TInspectorDetailService extends IService<TInspectorDetail> {
}
ruoyi-system/src/main/java/com/ruoyi/system/service/TLocationService.java
@@ -6,6 +6,8 @@
import com.ruoyi.system.query.LocationListQuery;
import com.ruoyi.system.vo.system.LocationListVO;
import java.util.List;
/**
 * <p>
 * 点位管理 服务类
@@ -18,4 +20,7 @@
    PageInfo<LocationListVO> pageList(LocationListQuery query);
    List<TLocation> locationList();
}
ruoyi-system/src/main/java/com/ruoyi/system/service/TTaskCleanService.java
@@ -5,6 +5,7 @@
import com.ruoyi.system.applet.dto.IndexDTO;
import com.ruoyi.system.applet.query.TaskUserListQuery;
import com.ruoyi.system.applet.vo.TaskUserListVO;
import com.ruoyi.system.model.TInspector;
import com.ruoyi.system.model.TTask;
import com.ruoyi.system.query.PointDetailQuery;
import com.ruoyi.system.query.TaskListQuery;
@@ -53,4 +54,5 @@
    List<TTask> getTaskByIds(List<String> collect1,String lon,String lat);
    List<TInspector> indexInspector(IndexDTO dto);
}
ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysUserServiceImpl.java
@@ -702,7 +702,7 @@
            Integer deptType = sysUserVO.getDeptType();
                if (1==deptType){
                        TProjectDept tProjectDept = projectDeptMapper.selectById(sysUserVO.getDeptId());
                        if (!tProjectDept.getParentId().equals("0")){
                        if (tProjectDept!=null&&!tProjectDept.getParentId().equals("0")){
                            TProjectDept tProjectDept1 = projectDeptMapper.selectById(tProjectDept.getParentId());
                            if (tProjectDept1!=null){
                                sysUserVO.setDeptName(tProjectDept1.getProjectName()+">"+tProjectDept.getProjectName());
@@ -710,14 +710,19 @@
                                sysUserVO.setDeptName(tProjectDept.getProjectName());
                            }
                        }else{
                            sysUserVO.setDeptName(tProjectDept.getProjectName());
                            if (tProjectDept!=null){
                                sysUserVO.setDeptName(tProjectDept.getProjectName());
                            }
                        }
                }else{
                    if (sysUserVO.getUserId()==1){
                        sysUserVO.setDeptName("公司");
                    }else{
                        TDept tDept = deptMapper.selectById(sysUserVO.getDeptId());
                        sysUserVO.setDeptName(tDept.getDeptName());
                        if (tDept!=null){
                            sysUserVO.setDeptName(tDept.getDeptName());
                        }
                    }
                }
ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TAppealServiceImpl.java
@@ -20,7 +20,9 @@
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Comparator;
import java.util.List;
/**
@@ -43,6 +45,10 @@
    private TTaskMapper taskMapper;
    @Autowired
    private SysUserMapper sysUserMapper;
    @Autowired
    private TInspectorDetailMapper inspectorDetailMapper;
    @Autowired
    private TInspectorMapper inspectorMapper;
    @Override
    public PageInfo<AppealListVO> pageList(InsepectorListQuery query) {
        if (StringUtils.hasLength(query.getEndTime())){
@@ -100,8 +106,24 @@
    public List<TaskListAllVO> listAllTask(AppealListDTO query) {
        List<TTaskDetail> tTaskDetails = taskDetailMapper.selectList(new LambdaQueryWrapper<TTaskDetail>()
                .eq(TTaskDetail::getHandleType,3).groupBy(TTaskDetail::getTaskId).orderByDesc(TTaskDetail::getCreateTime));
        List<TInspectorDetail> inspectorDetails = inspectorDetailMapper.selectList(new LambdaQueryWrapper<TInspectorDetail>()
                .eq(TInspectorDetail::getHandleType,3).groupBy(TInspectorDetail::getInspectorId).orderByDesc(TInspectorDetail::getCreateTime));
        PageInfo<AppealListVO> pageInfo = new PageInfo<>(query.getPageNum(), query.getPageSize());
        List<TaskListAllVO> list = this.baseMapper.listAllTask(query,pageInfo);
        List<TaskListAllVO> list1 = inspectorMapper.listAllInspector(query,pageInfo);
        for (TaskListAllVO taskListAllVO : list1) {
            taskListAllVO.setDistance(taskListAllVO.getDistance().divide(new BigDecimal(1000),2, RoundingMode.HALF_DOWN));
            if (taskListAllVO.getStatus()==1 || taskListAllVO.getStatus()==2 ){
                taskListAllVO.setStatus(1);
            }else{
                // 查询任务的驳回原因
                taskListAllVO.setStatus(2);
                TInspectorDetail tTaskDetail = inspectorDetails.stream().filter(e -> e.getInspectorId().equals(taskListAllVO.getId())).findFirst().orElse(null);
                if (tTaskDetail!=null){
                    taskListAllVO.setRejectRemark(tTaskDetail.getAuditRemark());
                }
            }
        }
        for (TaskListAllVO taskListAllVO : list) {
            taskListAllVO.setDistance(taskListAllVO.getDistance().divide(new BigDecimal(1000),2, RoundingMode.HALF_DOWN));
            if (taskListAllVO.getStatus()==1 || taskListAllVO.getStatus()==2 ){
@@ -115,6 +137,29 @@
                }
            }
        }
        if (list1.isEmpty()){
            list1=list;
        } else{
            list1.addAll(list);
        }
        // 根据distance进行排序从小到大
        list1.sort(Comparator.comparing(TaskListAllVO::getDistance));
        return list1;
    }
    public static void main(String[] args) {
        List<Object> objects = new ArrayList<>();
        List<Integer> anotherList = Arrays.asList(1,2);
    }
    @Override
    public List<TaskListAllVO> locationList(AppealListDTO appealListDTO) {
        PageInfo<AppealListVO> pageInfo = new PageInfo<>(appealListDTO.getPageNum(), appealListDTO.getPageSize());
        List<TaskListAllVO> list = this.baseMapper.locationList(appealListDTO,pageInfo);
        for (TaskListAllVO taskListAllVO : list) {
            taskListAllVO.setDistance(taskListAllVO.getDistance().divide(new BigDecimal(1000),2, RoundingMode.HALF_DOWN));
        }
        return list;
    }
}
ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TCleanerServiceImpl.java
@@ -36,7 +36,9 @@
            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());
                if (tProjectDept1!=null){
                    cleanerListVO.setProjectName(tProjectDept1.getProjectName()+">"+tProjectDept.getProjectName());
                }
            }
        }
        pageInfo.setRecords(list);
ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TEarlyWarningServiceImpl.java
@@ -146,15 +146,21 @@
                            taskWarningVO.setPatrolInspectorName(sysUser.getNickName());
                            if (sysUser.getDeptType() == 1){
                                TProjectDept tProjectDept = projectDeptMapper.selectById(sysUser.getDeptId());
                                if (!tProjectDept.getParentId().equals("0")){
                                if (tProjectDept!=null&&!tProjectDept.getParentId().equals("0")){
                                    TProjectDept tProjectDept1 = projectDeptMapper.selectById(tProjectDept.getParentId());
                                    taskWarningVO.setDeptName(tProjectDept1.getProjectName()+">"+tProjectDept.getProjectName());
                                    if (tProjectDept1!=null){
                                        taskWarningVO.setDeptName(tProjectDept1.getProjectName()+">"+tProjectDept.getProjectName());
                                    }
                                }else{
                                    taskWarningVO.setDeptName(tProjectDept.getProjectName());
                                    if (tProjectDept!=null){
                                        taskWarningVO.setDeptName(tProjectDept.getProjectName());
                                    }
                                }
                            }else{
                                TDept tDept = deptMapper.selectById(sysUser.getDeptId());
                                taskWarningVO.setDeptName(tDept.getDeptName());
                                if (tDept!=null){
                                    taskWarningVO.setDeptName(tDept.getDeptName());
                                }
                            }
                        }
                        res.add(taskWarningVO);
ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TInspectorDetailServiceImpl.java
New file
@@ -0,0 +1,23 @@
package com.ruoyi.system.service.impl;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ruoyi.system.mapper.TInspectorDetailMapper;
import com.ruoyi.system.mapper.TTaskDetailMapper;
import com.ruoyi.system.model.TInspectorDetail;
import com.ruoyi.system.model.TTaskDetail;
import com.ruoyi.system.service.TInspectorDetailService;
import com.ruoyi.system.service.TTaskDetailService;
import org.springframework.stereotype.Service;
/**
 * <p>
 * 任务操作记录 服务实现类
 * </p>
 *
 * @author xiaochen
 * @since 2025-05-28
 */
@Service
public class TInspectorDetailServiceImpl extends ServiceImpl<TInspectorDetailMapper, TInspectorDetail> implements TInspectorDetailService {
}
ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TInspectorServiceImpl.java
@@ -38,6 +38,8 @@
    private TTaskMapper taskMapper;
    @Autowired
    private SysUserMapper sysUserMapper;
    @Autowired
    private TLocationMapper locationMapper;
    @Override
    public PageInfo<InspectorListVO> pageList(InsepectorListQuery query) {
        List<SysUser> sysUsers = sysUserMapper.selectAllList();
@@ -46,29 +48,35 @@
        List<TTask> tTasks = taskMapper.selectList(null);
        List<TLocation> locations = locationMapper.selectList(null);
        for (InspectorListVO taskListVO : list) {
            TTask tTask = tTasks.stream().filter(e -> e.getId().equals(taskListVO.getTaskId())).findFirst().orElse(null);
            if (tTask!=null){
                taskListVO.setTaskType(tTask.getTaskType());
                SysUser sysUser = sysUsers.stream().filter(e -> e.getUserId().equals(Long.valueOf(tTask.getPatrolInspector()))).findFirst().orElse(null);
                if (sysUser!=null){
                    if (sysUser.getDeptType()==2){
                        TDept tDept = deptMapper.selectById(tTask.getPatrolInspectorDept());
                        if (tDept!=null){
                            taskListVO.setDeptName(tDept.getDeptName());
                        }
                    }else{
                        TProjectDept tProjectDept = projectDeptMapper.selectById(sysUser.getDeptId());
                        if (tProjectDept != null) {
                            if (!tProjectDept.getParentId().equals("0")) {
                                TProjectDept tProjectDept1 = projectDeptMapper.selectById(tProjectDept.getParentId());
                                if (tProjectDept1 != null) {
                                    taskListVO.setDeptName(tProjectDept1.getProjectName() + ">" + tProjectDept.getProjectName());
                                }
                            } else {
                                taskListVO.setDeptName(tProjectDept.getProjectName());
//            TTask tTask = tTasks.stream().filter(e -> e.getId().equals(taskListVO.getTaskId())).findFirst().orElse(null);
//            if (tTask!=null){
//                taskListVO.setTaskType(tTask.getTaskType());
//
//            }
            TLocation tLocation = locations.stream().filter(e -> e.getId().equals(taskListVO.getLocationId())).findFirst()
                    .orElse(null);
            if (tLocation == null){
                continue;
            }
            SysUser sysUser = sysUsers.stream().filter(e -> e.getUserId().equals(Long.valueOf(tLocation.getLocationLeader()))).findFirst().orElse(null);
            if (sysUser!=null){
                if (sysUser.getDeptType()==2){
                    TDept tDept = deptMapper.selectById(sysUser.getDeptId());
                    if (tDept!=null){
                        taskListVO.setDeptName(tDept.getDeptName());
                    }
                }else{
                    TProjectDept tProjectDept = projectDeptMapper.selectById(sysUser.getDeptId());
                    if (tProjectDept != null) {
                        if (!tProjectDept.getParentId().equals("0")) {
                            TProjectDept tProjectDept1 = projectDeptMapper.selectById(tProjectDept.getParentId());
                            if (tProjectDept1 != null) {
                                taskListVO.setDeptName(tProjectDept1.getProjectName() + ">" + tProjectDept.getProjectName());
                            }
                        } else {
                            taskListVO.setDeptName(tProjectDept.getProjectName());
                        }
                    }
                }
@@ -81,36 +89,33 @@
        List<SysUser> sysUsers = sysUserMapper.selectAllList();
        PageInfo<InspectorListVO> pageInfo = new PageInfo<>(query.getPageNum(), query.getPageSize());
        List<InspectorListVO> list = this.baseMapper.pageListExport(query,pageInfo);
        List<TTaskDetail> tTaskDetails = taskDetailMapper.selectList(new LambdaQueryWrapper<TTaskDetail>()
                .orderByDesc(BaseModel::getCreateTime)
                .in(TTaskDetail::getHandleType, Arrays.asList(1,4)));
        List<TTask> tTasks = taskMapper.selectList(null);
        List<TLocation> locations = locationMapper.selectList(null);
        for (InspectorListVO taskListVO : list) {
            TTask tTask = tTasks.stream().filter(e -> e.getId().equals(taskListVO.getTaskId())).findFirst().orElse(null);
            if (tTask!=null){
                SysUser sysUser = sysUsers.stream().filter(e -> e.getUserId().equals(Long.valueOf(tTask.getPatrolInspector()))).findFirst().orElse(null);
                if (sysUser!=null){
                    if (sysUser.getDeptType()==2){
                        TDept tDept = deptMapper.selectById(tTask.getPatrolInspectorDept());
                        if (tDept!=null){
                            taskListVO.setDeptName(tDept.getDeptName());
                        }
                    }else{
                        TProjectDept tProjectDept = projectDeptMapper.selectById(tTask.getPatrolInspectorDept());
                        if (tProjectDept!=null){
            TLocation tLocation = locations.stream().filter(e -> e.getId().equals(taskListVO.getLocationId())).findFirst()
                    .orElse(null);
            if (tLocation == null){
                continue;
            }
            SysUser sysUser = sysUsers.stream().filter(e -> e.getUserId().equals(Long.valueOf(tLocation.getLocationLeader()))).findFirst().orElse(null);
            if (sysUser!=null){
                if (sysUser.getDeptType()==2){
                    TDept tDept = deptMapper.selectById(sysUser.getDeptId());
                    if (tDept!=null){
                        taskListVO.setDeptName(tDept.getDeptName());
                    }
                }else{
                    TProjectDept tProjectDept = projectDeptMapper.selectById(sysUser.getDeptId());
                    if (tProjectDept != null) {
                        if (!tProjectDept.getParentId().equals("0")) {
                            TProjectDept tProjectDept1 = projectDeptMapper.selectById(tProjectDept.getParentId());
                            if (tProjectDept1 != null) {
                                taskListVO.setDeptName(tProjectDept1.getProjectName() + ">" + tProjectDept.getProjectName());
                            }
                        } else {
                            taskListVO.setDeptName(tProjectDept.getProjectName());
                        }
                    }
                }
                TTaskDetail tTaskDetail = tTaskDetails.stream().filter(e -> e.getTaskId().equals(taskListVO.getId())).findFirst().orElse(null);
                if (tTaskDetail!=null){
                    taskListVO.setPicture(tTaskDetail.getPicture());
                    taskListVO.setClearStatus(tTaskDetail.getClearStatus());
                }
            }
        }
        pageInfo.setRecords(list);
ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TLeaveServiceImpl.java
@@ -45,6 +45,7 @@
    private SysUserMapper sysUserMapper;
    @Override
    public PageInfo<LeaveListVO> pageList(LeaveListQuery query) {
        List<SysUser> sysUsers = sysUserMapper.selectAllList();
        if (StringUtils.hasLength(query.getDeptName())){
            List<String> collect = projectDeptMapper.selectList(new LambdaQueryWrapper<TProjectDept>().like(TProjectDept::getProjectName, query.getDeptName()))
                    .stream().map(TProjectDept::getId).collect(Collectors.toList());
@@ -60,20 +61,31 @@
        PageInfo<LeaveListVO> pageInfo = new PageInfo<>(query.getPageNum(), query.getPageSize());
        List<LeaveListVO> list = this.baseMapper.pageList(query,pageInfo);
        for (LeaveListVO leaveListVO : list) {
            SysUser sysUser = sysUsers.stream().filter(e -> e.getUserId().equals(Long.valueOf(leaveListVO.getAuditId()))).findFirst().orElse(null);
            if (sysUser!=null){
                leaveListVO.setAuditName(sysUser.getNickName());
            }
            String start = leaveListVO.getStartTime().format(DateTimeFormatter.ofPattern("yyyy-MM-dd"));
            String end = leaveListVO.getEndTime().format(DateTimeFormatter.ofPattern("yyyy-MM-dd"));
            leaveListVO.setLeaveTime(start+"至"+end);
            if (leaveListVO.getDeptType() == 1){
                TProjectDept tProjectDept = projectDeptMapper.selectById(leaveListVO.getDeptId());
                if (!"0".equals(tProjectDept.getParentId())){
                if (tProjectDept!=null&&!"0".equals(tProjectDept.getParentId())){
                    TProjectDept tProjectDept1 = projectDeptMapper.selectById(tProjectDept.getParentId());
                    leaveListVO.setDeptName(tProjectDept1.getProjectName()+">"+tProjectDept.getProjectName());
                    if (tProjectDept1!=null){
                        leaveListVO.setDeptName(tProjectDept1.getProjectName()+">"+tProjectDept.getProjectName());
                    }
                }else{
                    leaveListVO.setDeptName(tProjectDept.getProjectName());
                    if (tProjectDept!=null){
                        leaveListVO.setDeptName(tProjectDept.getProjectName());
                    }
                }
            }else{
                TDept tDept = deptMapper.selectById(leaveListVO.getDeptId());
                leaveListVO.setDeptName(tDept.getDeptName());
                if (tDept!=null){
                    leaveListVO.setDeptName(tDept.getDeptName());
                }
            }
        }
        pageInfo.setRecords(list);
ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TLocationServiceImpl.java
@@ -50,4 +50,9 @@
        pageInfo.setRecords(list);
        return pageInfo;
    }
    @Override
    public List<TLocation> locationList() {
        return null;
    }
}
ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TTaskCleanServiceImpl.java
@@ -9,6 +9,7 @@
import com.ruoyi.common.utils.DateUtils;
import com.ruoyi.system.applet.dto.IndexDTO;
import com.ruoyi.system.applet.query.TaskUserListQuery;
import com.ruoyi.system.applet.vo.InspectorUserListVO;
import com.ruoyi.system.applet.vo.TaskUserListVO;
import com.ruoyi.system.mapper.*;
import com.ruoyi.system.model.*;
@@ -19,6 +20,7 @@
import com.ruoyi.system.vo.system.ProgressListVO;
import com.ruoyi.system.vo.system.TLocationTaskListVO;
import com.ruoyi.system.vo.system.TaskListVO;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
@@ -51,6 +53,11 @@
    private SysUserMapper sysUserMapper;
    @Autowired
    private TProjectDeptMapper projectDeptMapper;
    @Autowired
    private TInspectorMapper inspectorMapper;
    @Autowired
    private TInspectorDetailMapper inspectorDetailMapper;
    @Override
    public PageInfo<TaskListVO> pageList(TaskListQuery query) {
@@ -73,17 +80,20 @@
                        )
                ))
                .values());
        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")){
                    if (tProjectDept!=null&&!tProjectDept.getParentId().equals("0")){
                        TProjectDept tProjectDept1 = projectDeptMapper.selectById(tProjectDept.getParentId());
                        temp.setDeptName(tProjectDept1.getProjectName()+">"+tProjectDept.getProjectName());
                        if (tProjectDept1!=null){
                            temp.setDeptName(tProjectDept1.getProjectName()+">"+tProjectDept.getProjectName());
                        }
                    }else{
                        temp.setDeptName(tProjectDept.getProjectName());
                        if (tProjectDept!=null){
                            temp.setDeptName(tProjectDept.getProjectName());
                        }
                    }
                }else{
                    TDept tDept = deptMapper.selectById(sysUser.getDeptId());
@@ -105,8 +115,17 @@
    @Override
    public PageInfo<TaskUserListVO> pageListUser(TaskUserListQuery query) {
        List<TTask> taskList = this.baseMapper.selectList(null);
        List<TInspector> inspectors = inspectorMapper.selectList(null);
        PageInfo<TaskUserListVO> pageInfo = new PageInfo<>(query.getPageNum(), query.getPageSize());
        List<TaskUserListVO> list = this.baseMapper.pageListUser(query);
        // 督察任务
        List<InspectorUserListVO> list1 = this.baseMapper.pageListUserInspector(query);
        for (InspectorUserListVO inspectorUserListVO : list1) {
            TaskUserListVO taskUserListVO = new TaskUserListVO();
            BeanUtils.copyProperties(inspectorUserListVO,taskUserListVO);
            list.add(taskUserListVO);
        }
        List<TTaskDetail> taskDetails = taskDetailMapper.selectList(Wrappers.lambdaQuery(TTaskDetail.class)
                .eq(TTaskDetail::getHandleType,1)
                .orderByDesc(TTaskDetail::getCreateTime));
@@ -119,22 +138,52 @@
                        )
                ))
                .values());
        List<TInspectorDetail> inspectorDetails = inspectorDetailMapper.selectList(Wrappers.lambdaQuery(TInspectorDetail.class)
                .eq(TInspectorDetail::getHandleType,1)
                .orderByDesc(TInspectorDetail::getCreateTime));
        inspectorDetails = new ArrayList<>(inspectorDetails.stream()
                .collect(Collectors.groupingBy(
                        TInspectorDetail::getInspectorId,
                        Collectors.collectingAndThen(
                                Collectors.toList(),
                                listAll -> listAll.get(0)
                        )
                ))
                .values());
        for (TaskUserListVO taskUserListVO : list) {
            TTaskDetail tTaskDetail = taskDetails.stream().filter(e -> e.getTaskId().equals(taskUserListVO.getId()))
                    .findFirst().orElse(null);
            if (tTaskDetail!=null){
                if (tTaskDetail.getClearStatus()==1){
                    taskUserListVO.setStatus(5);
            TTask tTask = taskList.stream().filter(e -> e.getId().equals(taskUserListVO.getId())).findFirst().orElse(null);
            if (tTask!=null){
                TTaskDetail tTaskDetail = taskDetails.stream().filter(e -> e.getTaskId().equals(taskUserListVO.getId()))
                        .findFirst().orElse(null);
                if (tTaskDetail!=null){
                    if (tTaskDetail.getClearStatus()==1){
                        taskUserListVO.setStatus(5);
                }else{
                    taskUserListVO.setStatus(4);
                    }else{
                        taskUserListVO.setStatus(4);
                    }
                }
            }
            if (taskUserListVO.getDistance()!=null){
                taskUserListVO.setDistance(taskUserListVO.getDistance().divide(new BigDecimal("1000"),2, RoundingMode.HALF_DOWN));
                if (taskUserListVO.getDistance()!=null){
                    taskUserListVO.setDistance(taskUserListVO.getDistance().divide(new BigDecimal("1000"),2, RoundingMode.HALF_DOWN));
                }else{
                    taskUserListVO.setDistance(new BigDecimal("0"));
                }
            }else{
                taskUserListVO.setDistance(new BigDecimal("0"));
                TInspectorDetail tTaskDetail = inspectorDetails.stream().filter(e -> e.getInspectorId().equals(taskUserListVO.getId()))
                        .findFirst().orElse(null);
                if (tTaskDetail!=null){
                    if (tTaskDetail.getClearStatus()==1){
                        taskUserListVO.setStatus(5);
                    }else{
                        taskUserListVO.setStatus(4);
                    }
                }
                if (taskUserListVO.getDistance()!=null){
                    taskUserListVO.setDistance(taskUserListVO.getDistance().divide(new BigDecimal("1000"),2, RoundingMode.HALF_DOWN));
                }else{
                    taskUserListVO.setDistance(new BigDecimal("0"));
                }
            }
        }
        List<TaskUserListVO> res = new ArrayList<>();
@@ -243,5 +292,10 @@
        return this.baseMapper.getTaskByIds(collect1,lon,lat);
    }
    @Override
    public List<TInspector> indexInspector(IndexDTO dto) {
        return this.baseMapper.indexInspector(dto);
    }
}
ruoyi-system/src/main/java/com/ruoyi/system/vo/system/InspectorDetailVO.java
@@ -1,6 +1,7 @@
package com.ruoyi.system.vo.system;
import com.ruoyi.system.model.TInspector;
import com.ruoyi.system.model.TInspectorDetail;
import com.ruoyi.system.model.TTask;
import com.ruoyi.system.model.TTaskDetail;
import io.swagger.annotations.ApiModel;
@@ -31,5 +32,9 @@
    private String locationLon;
    @ApiModelProperty(value = "点位纬度 起点")
    private String locationLat;
    @ApiModelProperty(value = "完成情况")
    private TInspectorDetail taskDetail;
    @ApiModelProperty("操作记录")
    private List<TInspectorDetail>  records;
}
ruoyi-system/src/main/java/com/ruoyi/system/vo/system/InspectorRecordDetailVO.java
New file
@@ -0,0 +1,24 @@
package com.ruoyi.system.vo.system;
import com.ruoyi.system.model.TInspector;
import com.ruoyi.system.model.TInspectorDetail;
import com.ruoyi.system.model.TTask;
import com.ruoyi.system.model.TTaskDetail;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
@Data
@ApiModel(value = "督察任务详情-操作记录-详情VO")
public class InspectorRecordDetailVO extends TInspector {
    @ApiModelProperty("位置")
    private String locationAddress;
    @ApiModelProperty("点位类型图标")
    private String locationIcon;
    @ApiModelProperty("点位类型名称")
    private String locationName;
    @ApiModelProperty("完成情况/审核情况")
    private TInspectorDetail taskDetail;
}
ruoyi-system/src/main/resources/mapper/system/TAppealMapper.xml
@@ -156,5 +156,79 @@
        AND DATE(t1.implement_time) = CURDATE()
        order by distance asc
    </select>
    <select id="locationList" resultType="com.ruoyi.system.applet.vo.TaskListAllVO">
        select t1.*,t3.location_name as locationTypeName,
        t3.location_icon as locationTypeIcon,
        t4.nick_name as patrolInspectorName,
        t4.phonenumber as phonenumber,
        ROUND(
        6378.138 * 2 * ASIN(
        SQRT(
        POW(
        SIN(
        (
        #{query.lat} * PI() / 180 - t1.location_lat * PI() / 180
        ) / 2
        ),
        2
        ) + COS(#{query.lat} * PI() / 180) * COS(t1.location_lat * PI() / 180) * POW(
        SIN(
        (
        #{query.lon} * PI() / 180 - t1.location_lon * PI() / 180
        ) / 2
        ),
        2
        )
        )
        ) * 1000
        ) AS distance
        from t_location t1
        left join t_location_type t3 on t1.location_type = t3.id
        left join sys_user t4 on t1.location_leader = t4.user_id
        where 1=1
        and t1.`disabled` = ${@com.ruoyi.common.enums.DisabledEnum@NO.getCode()}
        order by distance asc
    </select>
    <select id="listAllInspector" resultType="com.ruoyi.system.applet.vo.TaskListAllVO">
        select t1.*,t2.location_name as locationName,t3.location_name as locationTypeName,
        t2.location_address as locationAddress,
        t2.location_lon as locationLon,
        t2.location_lat as locationLat,
        t3.location_icon as locationTypeIcon,
        t4.nick_name as patrolInspectorName,
        t4.phonenumber as phonenumber,
        ROUND(
        6378.138 * 2 * ASIN(
        SQRT(
        POW(
        SIN(
        (
        #{query.lat} * PI() / 180 - t2.location_lat * PI() / 180
        ) / 2
        ),
        2
        ) + COS(#{query.lat} * PI() / 180) * COS(t2.location_lat * PI() / 180) * POW(
        SIN(
        (
        #{query.lon} * PI() / 180 - t2.location_lon * PI() / 180
        ) / 2
        ),
        2
        )
        )
        ) * 1000
        ) AS distance
        from t_inspector 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 t2.location_leader = t4.user_id
        where 1=1
        <if test="query.userId != null">
            and t2.location_leader = #{query.userId}
        </if>
        and t1.`disabled` = ${@com.ruoyi.common.enums.DisabledEnum@NO.getCode()}
        and t1.status =2
        order by distance asc
    </select>
</mapper>
ruoyi-system/src/main/resources/mapper/system/TInspectorMapper.xml
@@ -33,37 +33,35 @@
        t4.phonenumber as phonenumber
        from t_inspector t1
        left join t_task t5 on t5.id  = t1.task_id
        left join t_location t2 on t5.location_id = t2.id
        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 t5.patrol_inspector = t4.user_id
        left join sys_user t4 on t2.location_leader = t4.user_id
        where 1=1
        and t1.`disabled` = ${@com.ruoyi.common.enums.DisabledEnum@NO.getCode()}
        <if test="query.patrolInspectorIds != null and query.patrolInspectorIds.size()>0">
            AND t4.user_id IN
            AND t2.location_leader IN
            <foreach collection="query.patrolInspectorIds" separator="," item="id" open="(" close=")">
                #{id}
            </foreach>
        </if>
        <if test="query.taskIds != null and query.taskIds.size()>0">
            AND t1.task_id IN
            <foreach collection="query.taskIds" separator="," item="id" open="(" close=")">
        <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}
            </foreach>
        </if>
        <if test="query.locationIds != null and query.locationIds.size()>0">
            AND t5.location_id IN
            <foreach collection="query.locationIds" separator="," item="id" open="(" close=")">
          <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.status != null">
            and t1.status = #{query.status}
        </if>
          <if test="query.clearStatus != null">
            and t1.clear_status = #{query.clearStatus}
        </if>
        <if test="query.startTime != null and query.startTime != ''">
            and (t1.create_time between #{query.startTime} and #{query.endTime})
        </if>
@@ -75,43 +73,76 @@
        t4.phonenumber as phonenumber
        from t_inspector t1
        left join t_task t5 on t5.id  = t1.task_id
        left join t_location t2 on t5.location_id = t2.id
        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 t5.patrol_inspector = t4.user_id
        left join sys_user t4 on t2.location_leader = t4.user_id
        where 1=1
        and t1.`disabled` = ${@com.ruoyi.common.enums.DisabledEnum@NO.getCode()}
        <if test="query.patrolInspectorIds != null and query.patrolInspectorIds.size()>0">
            AND t4.user_id IN
            AND t2.location_leader IN
            <foreach collection="query.patrolInspectorIds" separator="," item="id" open="(" close=")">
                #{id}
            </foreach>
        </if>
        <if test="query.taskIds != null and query.taskIds.size()>0">
            AND t1.task_id IN
            <foreach collection="query.taskIds" separator="," item="id" open="(" close=")">
                #{id}
            </foreach>
        </if>
        <if test="query.locationIds != null and query.locationIds.size()>0">
            AND t5.location_id IN
            AND t1.location_id IN
            <foreach collection="query.locationIds" separator="," item="id" open="(" close=")">
                #{id}
            </foreach>
        </if>
        <if test="query.insepectorIds != null and query.insepectorIds.size()>0">
            AND t1.id IN
            <foreach collection="query.insepectorIds" separator="," item="id" open="(" close=")">
                #{id}
            </foreach>
        </if>
        <if test="query.status != null">
            and t1.status = #{query.status}
        </if>
        <if test="query.startTime != null and startTime != ''">
            and (t5.implement_time between #{startTime} and #{endTime})
        <if test="query.clearStatus != null">
            and t1.clear_status = #{query.clearStatus}
        </if>
        <if test="query.startTime != null and query.startTime != ''">
            and (t1.create_time between #{query.startTime} and #{query.endTime})
        </if>
        order by t1.create_time desc
    </select>
    <select id="listAllInspector" resultType="com.ruoyi.system.applet.vo.TaskListAllVO">
        select t1.*,t2.location_name as locationName,t3.location_name as locationTypeName,
        t2.location_address as locationAddress,
        t2.location_lon as locationLon,
        t2.location_lat as locationLat,
        t3.location_icon as locationTypeIcon,
        t4.nick_name as patrolInspectorName,
        t4.phonenumber as phonenumber,
        ROUND(
        6378.138 * 2 * ASIN(
        SQRT(
        POW(
        SIN(
        (
        #{query.lat} * PI() / 180 - t2.location_lat * PI() / 180
        ) / 2
        ),
        2
        ) + COS(#{query.lat} * PI() / 180) * COS(t2.location_lat * PI() / 180) * POW(
        SIN(
        (
        #{query.lon} * PI() / 180 - t2.location_lon * PI() / 180
        ) / 2
        ),
        2
        )
        )
        ) * 1000
        ) AS distance
        from t_inspector 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 t2.location_leader = t4.user_id
        where 1=1
        <if test="query.userId != null">
            and t2.location_leader = #{query.userId}
        </if>
        and t1.`disabled` = ${@com.ruoyi.common.enums.DisabledEnum@NO.getCode()}
        and t1.status =2
        order by distance asc
    </select>
</mapper>
ruoyi-system/src/main/resources/mapper/system/TTaskMapper.xml
@@ -288,5 +288,82 @@
            </foreach>
        </if>
    </select>
    <select id="pageListUserInspector" resultType="com.ruoyi.system.applet.vo.InspectorUserListVO">
        select t1.*,t2.location_name as locationName,t3.location_name as locationTypeName,
        t2.location_address as locationAddress,
        t2.location_address_end as locationAddressEnd,
        t3.location_icon as locationTypeIcon,
        t4.nick_name as patrolInspectorName,
        t4.phonenumber as phonenumber,
        ROUND(
        6378.138 * 2 * ASIN(
        SQRT(
        POW(
        SIN(
        (
        #{query.lat} * PI() / 180 - t2.location_lat * PI() / 180
        ) / 2
        ),
        2
        ) + COS(#{query.lat} * PI() / 180) * COS(t2.location_lat * PI() / 180) * POW(
        SIN(
        (
        #{query.lon} * PI() / 180 - t2.location_lon * PI() / 180
        ) / 2
        ),
        2
        )
        )
        ) * 1000
        ) AS distance
        from t_inspector 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 t2.location_leader = t4.user_id
        where 1=1
        and t1.`disabled` = ${@com.ruoyi.common.enums.DisabledEnum@NO.getCode()}
        <if test="query.userId != null and query.userId != ''">
            and t2.location_leader = #{query.userId}
        </if>
        <if test="query.startTime != null and query.startTime != ''">
            and (t1.create_time between #{query.startTime} and #{query.endTime})
        </if>
        and (t1.status = 3 or t1.status = 4)
        order by t1.update_time desc
    </select>
    <select id="indexInspector" resultType="com.ruoyi.system.model.TInspector">
        select t1.*,
        ROUND(
        6378.138 * 2 * ASIN(
        SQRT(
        POW(
        SIN(
        (
        #{query.lat} * PI() / 180 - t2.location_lat * PI() / 180
        ) / 2
        ),
        2
        ) + COS(#{query.lat} * PI() / 180) * COS(t2.location_lat * PI() / 180) * POW(
        SIN(
        (
        #{query.lon} * PI() / 180 - t2.location_lon * PI() / 180
        ) / 2
        ),
        2
        )
        )
        ) * 1000
        ) AS distance
        from t_inspector t1
        left join t_location t2 on t1.location_id = t2.id
        where 1=1
        and t1.status=2
    </select>
</mapper>