diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/common/utils/JSTUtil.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/common/utils/JSTUtil.java index 492aebfc..61248467 100644 --- a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/common/utils/JSTUtil.java +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/common/utils/JSTUtil.java @@ -17,6 +17,7 @@ import org.dromara.manager.recognizermanager.vo.RecognizeConvertCoordinateResult import org.locationtech.jts.geom.*; import org.locationtech.jts.index.strtree.STRtree; +import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -369,4 +370,15 @@ public class JSTUtil { return address; } + public static void main(String[] args) { + String s = "[{\"lng\":108.27080423,\"lat\":30.78111723,\"alt\":0},{\"lng\":108.1121822,\"lat\":28.29520706,\"alt\":0},{\"lng\":104.14552241,\"lat\":25.30970518,\"alt\":0},{\"lng\":109.08566373,\"lat\":22.16157883,\"alt\":0},{\"lng\":113.65236101,\"lat\":23.77537016,\"alt\":0},{\"lng\":114.7759412,\"lat\":27.54339559,\"alt\":0},{\"lng\":112.75195929,\"lat\":30.44798186,\"alt\":0},{\"lng\":109.80548867,\"lat\":31.34953868,\"alt\":0}]"; + + List list = new ArrayList<>(); + list.add(s); + List matchingRange = findMatchingRange("30.247348", "105.729797", list); + System.out.println(matchingRange==null); + + + } + } diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/contractor/domain/vo/constructionuser/SubConstructionUserAttendanceTotalVo.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/contractor/domain/vo/constructionuser/SubConstructionUserAttendanceTotalVo.java index 23197575..df8f84de 100644 --- a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/contractor/domain/vo/constructionuser/SubConstructionUserAttendanceTotalVo.java +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/contractor/domain/vo/constructionuser/SubConstructionUserAttendanceTotalVo.java @@ -66,4 +66,9 @@ public class SubConstructionUserAttendanceTotalVo implements Serializable { */ private Integer leaveDays; + /** + * 今天是否打卡 + */ + private boolean isClockToday=false; + } diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/contractor/service/ISubConstructionUserService.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/contractor/service/ISubConstructionUserService.java index 01a01a0b..ea7e85a1 100644 --- a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/contractor/service/ISubConstructionUserService.java +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/contractor/service/ISubConstructionUserService.java @@ -261,4 +261,6 @@ public interface ISubConstructionUserService extends IService todayUserList(TodayUserDto dto, PageQuery pageQuery); + + List todayUserList(TodayUserDto dto); } diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/contractor/service/impl/SubConstructionUserServiceImpl.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/contractor/service/impl/SubConstructionUserServiceImpl.java index eb4a4212..57b0cfd1 100644 --- a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/contractor/service/impl/SubConstructionUserServiceImpl.java +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/contractor/service/impl/SubConstructionUserServiceImpl.java @@ -1186,6 +1186,16 @@ public class SubConstructionUserServiceImpl extends ServiceImpl> userIdBusAttendanceListMap = attendanceService.list(attendanceLqw) .stream().collect(Collectors.groupingBy(BusAttendance::getUserId)); + //获取今天打卡人员 + LambdaQueryWrapper attendanceWrapper = Wrappers.lambdaQuery(BusAttendance.class) + .eq(BusAttendance::getProjectId, projectId) + .eq(BusAttendance::getClockDate, LocalDate.now()) + .in(BusAttendance::getClockStatus, BusAttendanceClockStatusEnum.ATTENDANCE_LIST) + .in(BusAttendance::getUserId, userIdList); + List list = attendanceService.list(attendanceWrapper); + List attendanceUserIdList = list.stream().map(BusAttendance::getUserId).toList(); + + // 填充信息 List userAttendanceTotalList = constructionUserList.stream().map(constructionUser -> { SubConstructionUserAttendanceTotalVo constructionUserAttendanceTotalResp = new SubConstructionUserAttendanceTotalVo(); @@ -1243,6 +1253,9 @@ public class SubConstructionUserServiceImpl extends ServiceImpl(attendanceTodayUserVos, result.getTotal()); } + + + @Override + public List todayUserList(TodayUserDto dto) { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + + wrapper.eq(SubConstructionUser::getUserRole, "0") + .eq(SubConstructionUser::getProjectId, dto.getProjectId()) + .eq(dto.getTeamId() != null, SubConstructionUser::getTeamId, dto.getTeamId()) + .eq(StrUtil.isNotBlank(dto.getTypeOfWork()), SubConstructionUser::getTypeOfWork, dto.getTypeOfWork()) + .like(StrUtil.isNotBlank(dto.getUserName()), SubConstructionUser::getUserName, dto.getUserName()) + .isNotNull(SubConstructionUser::getTeamId); + if("1".equals(dto.getType())){ + wrapper.in(SubConstructionUser::getSysUserId, dto.getUserIds()); + }else if("2".equals(dto.getType())){ + if(dto.getIsToday()){ + wrapper.notIn(CollectionUtil.isNotEmpty(dto.getUserIds()),SubConstructionUser::getSysUserId, dto.getUserIds()); + }else { + wrapper.in(SubConstructionUser::getSysUserId, dto.getUserIds()); + } + + }else{ + wrapper.in(SubConstructionUser::getSysUserId, dto.getUserIds()); + } + + List records = this.list(wrapper); + + List list1 = records.stream().map(SubConstructionUser::getTeamId).toList(); + List busProjectTeams = projectTeamService.listByIds(list1); + Map teamMap = busProjectTeams.stream().collect(Collectors.toMap(BusProjectTeam::getId, BusProjectTeam::getTeamName)); + + List attendanceTodayUserVos = new ArrayList<>(); + for (SubConstructionUser constructionUser : records) { + AttendanceTodayUserVo attendanceTodayUserVo = new AttendanceTodayUserVo(); + attendanceTodayUserVo.setUserId(constructionUser.getSysUserId()); + attendanceTodayUserVo.setUserName(constructionUser.getUserName()); + attendanceTodayUserVo.setTypeOfWork(constructionUser.getTypeOfWork()); + attendanceTodayUserVo.setTeamName(teamMap.get(constructionUser.getTeamId())); + attendanceTodayUserVos.add(attendanceTodayUserVo); + } + + return attendanceTodayUserVos; + } } diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/controller/BusAttendanceController.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/controller/BusAttendanceController.java index 90fa504c..ede0587b 100644 --- a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/controller/BusAttendanceController.java +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/controller/BusAttendanceController.java @@ -149,6 +149,16 @@ public class BusAttendanceController extends BaseController { return busAttendanceService.getTodayAttendanceUser(dto,pageQuery); } + /** + * 导出考勤列表 + */ + @Log(title = "考勤", businessType = BusinessType.EXPORT) + @PostMapping("/attendanceUserExport") + public void todayAttendanceUserExport(TodayUserDto dto, HttpServletResponse response) { + List list = busAttendanceService.getTodayAttendanceUser(dto); + ExcelUtil.exportExcel(list, "考勤", AttendanceTodayUserVo.class, response); + } + @PostMapping("/exportList") public void exportList(AttendanceExportDto dto, HttpServletResponse response) { busAttendanceService.getExportList(dto, response); diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/domain/vo/attendance/AttendanceTodayUserVo.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/domain/vo/attendance/AttendanceTodayUserVo.java index 497f50fb..5d53e972 100644 --- a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/domain/vo/attendance/AttendanceTodayUserVo.java +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/domain/vo/attendance/AttendanceTodayUserVo.java @@ -1,19 +1,27 @@ package org.dromara.project.domain.vo.attendance; +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; import lombok.Data; +import org.dromara.common.excel.annotation.ExcelDictFormat; +import org.dromara.common.excel.convert.ExcelDictConvert; import org.dromara.common.translation.annotation.Translation; import org.dromara.common.translation.constant.TransConstant; +@ExcelIgnoreUnannotated @Data public class AttendanceTodayUserVo { private Long userId; + @ExcelProperty(value = "名字") private String userName; /** * 工种(字典type_of_work) */ + @ExcelProperty(value = "用户性别", converter = ExcelDictConvert.class) + @ExcelDictFormat(dictType = "type_of_work") private String typeOfWork; @Translation(type = TransConstant.DICT_TYPE_TO_LABEL, mapper = "typeOfWork",other = "type_of_work") @@ -22,6 +30,7 @@ public class AttendanceTodayUserVo { /** * 班组名称 */ + @ExcelProperty(value = "班组") private String teamName; } diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/service/IBusAttendanceService.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/service/IBusAttendanceService.java index f44760ea..471c9d21 100644 --- a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/service/IBusAttendanceService.java +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/service/IBusAttendanceService.java @@ -191,6 +191,11 @@ public interface IBusAttendanceService extends IService{ */ TableDataInfo getTodayAttendanceUser(TodayUserDto dto, PageQuery pageQuery); + /** + * 获取项目当天的出勤人员 + */ + List getTodayAttendanceUser(TodayUserDto dto); + /** * 获取导出的考勤数据 */ diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/service/impl/BusAttendanceServiceImpl.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/service/impl/BusAttendanceServiceImpl.java index d7462db0..0764ed6a 100644 --- a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/service/impl/BusAttendanceServiceImpl.java +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/project/service/impl/BusAttendanceServiceImpl.java @@ -964,7 +964,7 @@ public class BusAttendanceServiceImpl extends ServiceImpl matchingRange = JSTUtil.findMatchingRange(req.getLat(), req.getLng(), punchRangeList); return matchingRange != null; } @@ -1837,6 +1838,80 @@ public class BusAttendanceServiceImpl extends ServiceImpl getTodayAttendanceUser(TodayUserDto dto) { + LocalDate date = dto.getDate(); + if (date == null) { + date = LocalDate.now(); + } + + if ("1".equals(dto.getType())) { + List list = list(Wrappers.lambdaQuery() + .eq(BusAttendance::getClockDate, date) + .eq(BusAttendance::getProjectId, dto.getProjectId()) + .in(BusAttendance::getClockStatus, ATTENDANCE_LIST) + ); + List list1 = list.stream().map(BusAttendance::getUserId).distinct().toList(); + + if (CollectionUtil.isEmpty(list1)) { + return List.of(); + } + dto.setUserIds(list1); + } else if ("2".equals(dto.getType())) { + List list = list(Wrappers.lambdaQuery() + .eq(BusAttendance::getClockDate, date) + .eq(BusAttendance::getProjectId, dto.getProjectId()) + .in(BusAttendance::getClockStatus, ATTENDANCE_LIST) + ); + List list1 = list.stream().map(BusAttendance::getUserId).distinct().toList(); + if (date.isEqual(LocalDate.now())) { + String todayStr = date.format(DateTimeFormatter.ISO_LOCAL_DATE); + List list2 = leaveService.list(Wrappers.lambdaQuery() + .eq(BusLeave::getProjectId, dto.getProjectId()) + .eq(dto.getTeamId() != null, BusLeave::getTeamId, dto.getTeamId()) + // 关键:给日期字符串加单引号,避免 SQL 语法错误 + .apply("DATE(start_time) <= {0}", todayStr) + .apply("DATE(end_time) >= {0}", todayStr)); + + List list11 = list2.stream().map(BusLeave::getUserId).distinct().toList(); + ArrayList longs = new ArrayList<>(); + longs.addAll(list1); + longs.addAll(list11); + dto.setUserIds(longs); + dto.setIsToday(true); + } else { + List unlocks = list(Wrappers.lambdaQuery() + .eq(BusAttendance::getClockDate, date) + .eq(BusAttendance::getProjectId, dto.getProjectId()) + .eq(BusAttendance::getClockStatus, BusAttendanceClockStatusEnum.UNCLOCK.getValue()) + ); + List list11 = new ArrayList<>(unlocks.stream().map(BusAttendance::getUserId).distinct().toList()); + list11.removeAll(list1); + dto.setUserIds(list11); + dto.setIsToday(false); + if (CollectionUtil.isEmpty(list11)) { + return List.of(); + } + } + + } else if ("3".equals(dto.getType())) { + String todayStr = date.format(DateTimeFormatter.ISO_LOCAL_DATE); + List list2 = leaveService.list(Wrappers.lambdaQuery() + .eq(BusLeave::getProjectId, dto.getProjectId()) + .eq(dto.getTeamId() != null, BusLeave::getTeamId, dto.getTeamId()) + // 关键:给日期字符串加单引号,避免 SQL 语法错误 + .apply("DATE(start_time) <= {0}", todayStr) + .apply("DATE(end_time) >= {0}", todayStr)); + + List list11 = list2.stream().map(BusLeave::getUserId).distinct().toList(); + if (CollectionUtil.isEmpty(list11)) { + return List.of(); + } + dto.setUserIds(list11); + } + return constructionUserService.todayUserList(dto); + } + @Override public void getExportList(AttendanceExportDto dto, HttpServletResponse response) { try (OutputStream outputStream = response.getOutputStream()) { diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/app/SysUserAppController.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/app/SysUserAppController.java index 66c93ce7..52992098 100644 --- a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/app/SysUserAppController.java +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/app/SysUserAppController.java @@ -1,46 +1,22 @@ package org.dromara.system.controller.app; -import cn.dev33.satoken.annotation.SaCheckPermission; import cn.dev33.satoken.annotation.SaIgnore; import cn.dev33.satoken.secure.BCrypt; -import cn.hutool.core.collection.CollUtil; import cn.hutool.core.lang.tree.Tree; -import cn.hutool.core.util.ArrayUtil; -import cn.hutool.core.util.ObjectUtil; -import jakarta.servlet.http.HttpServletResponse; -import jakarta.validation.constraints.NotNull; import lombok.RequiredArgsConstructor; import org.dromara.common.core.domain.R; -import org.dromara.common.core.domain.model.LoginUser; -import org.dromara.common.core.utils.StreamUtils; -import org.dromara.common.core.utils.StringUtils; -import org.dromara.common.encrypt.annotation.ApiEncrypt; -import org.dromara.common.excel.core.ExcelResult; -import org.dromara.common.excel.utils.ExcelUtil; +import org.dromara.common.core.exception.ServiceException; import org.dromara.common.idempotent.annotation.RepeatSubmit; -import org.dromara.common.log.annotation.Log; -import org.dromara.common.log.enums.BusinessType; -import org.dromara.common.mybatis.core.page.PageQuery; -import org.dromara.common.mybatis.core.page.TableDataInfo; import org.dromara.common.satoken.utils.LoginHelper; -import org.dromara.common.tenant.helper.TenantHelper; import org.dromara.common.web.core.BaseController; +import org.dromara.system.domain.SysUser; import org.dromara.system.domain.bo.SysDeptBo; -import org.dromara.system.domain.bo.SysPostBo; -import org.dromara.system.domain.bo.SysRoleBo; -import org.dromara.system.domain.bo.SysUserBo; -import org.dromara.system.domain.dto.role.SysRoleProjectDto; -import org.dromara.system.domain.enums.SysDeptTypeEnum; +import org.dromara.system.domain.dto.AppUserUpdatePasswordDto; import org.dromara.system.domain.vo.*; -import org.dromara.system.listener.SysUserImportListener; import org.dromara.system.service.*; -import org.springframework.http.MediaType; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; -import org.springframework.web.multipart.MultipartFile; -import java.util.ArrayList; -import java.util.Arrays; import java.util.List; /** @@ -101,4 +77,13 @@ public class SysUserAppController extends BaseController { return R.ok(userService.passwordCompare(password)); } + /** + * 修改密码 + */ + @RepeatSubmit() + @PutMapping("/updatePassword") + public R updatePassword(AppUserUpdatePasswordDto dto) { + return toAjax(userService.appResetUserPwd(dto)); + } + } diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/dto/AppUserUpdatePasswordDto.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/dto/AppUserUpdatePasswordDto.java new file mode 100644 index 00000000..3972173a --- /dev/null +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/dto/AppUserUpdatePasswordDto.java @@ -0,0 +1,9 @@ +package org.dromara.system.domain.dto; + +import lombok.Data; + +@Data +public class AppUserUpdatePasswordDto { + private String oldPassword; + private String newPassword; +} diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysUserService.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysUserService.java index 207d9245..9e3ad31a 100644 --- a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysUserService.java +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysUserService.java @@ -10,6 +10,7 @@ import org.dromara.project.domain.vo.attendance.AttendanceTodayUserVo; import org.dromara.project.domain.vo.attendance.SubUserAttendanceTotalVo; import org.dromara.system.domain.SysUser; import org.dromara.system.domain.bo.SysUserBo; +import org.dromara.system.domain.dto.AppUserUpdatePasswordDto; import org.dromara.system.domain.dto.FbUserListDto; import org.dromara.system.domain.dto.role.SysRoleProjectDto; import org.dromara.system.domain.vo.SysUserExportVo; @@ -298,4 +299,6 @@ public interface ISysUserService { TableDataInfo selectPageFbUserAttendanceList(SubUserAttendanceQueryReq dto, PageQuery pageQuery); TableDataInfo todayUserList(SubTodayUserDto dto, PageQuery pageQuery); + + int appResetUserPwd(AppUserUpdatePasswordDto dto); } diff --git a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysUserServiceImpl.java b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysUserServiceImpl.java index 81f0174a..22155306 100644 --- a/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysUserServiceImpl.java +++ b/xinnengyuan/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysUserServiceImpl.java @@ -50,6 +50,7 @@ import org.dromara.project.service.IBusProjectTeamService; import org.dromara.project.service.IBusUserProjectRelevancyService; import org.dromara.system.domain.*; import org.dromara.system.domain.bo.SysUserBo; +import org.dromara.system.domain.dto.AppUserUpdatePasswordDto; import org.dromara.system.domain.dto.FbUserListDto; import org.dromara.system.domain.dto.role.SysRoleProjectDto; import org.dromara.system.domain.vo.SysPostVo; @@ -1509,4 +1510,15 @@ public class SysUserServiceImpl implements ISysUserService, UserService { } return TableDataInfo.build(page); } + + @Override + public int appResetUserPwd(AppUserUpdatePasswordDto dto) { + Long userId = LoginHelper.getUserId(); + SysUser sysUser = baseMapper.selectById(userId); + boolean checkpw = BCrypt.checkpw(dto.getOldPassword(), sysUser.getPassword()); + if(!checkpw){ + throw new ServiceException("旧密码错误"); + } + return resetUserPwd(sysUser.getUserId(), BCrypt.hashpw(dto.getNewPassword())); + } }