diff --git a/yudao-framework/yudao-spring-boot-starter-websocket/src/main/java/cn/iocoder/yudao/framework/websocket/core/handler/JsonWebSocketMessageHandler.java b/yudao-framework/yudao-spring-boot-starter-websocket/src/main/java/cn/iocoder/yudao/framework/websocket/core/handler/JsonWebSocketMessageHandler.java index 52b769ce..fb3e76fc 100644 --- a/yudao-framework/yudao-spring-boot-starter-websocket/src/main/java/cn/iocoder/yudao/framework/websocket/core/handler/JsonWebSocketMessageHandler.java +++ b/yudao-framework/yudao-spring-boot-starter-websocket/src/main/java/cn/iocoder/yudao/framework/websocket/core/handler/JsonWebSocketMessageHandler.java @@ -81,8 +81,8 @@ public class JsonWebSocketMessageHandler extends TextWebSocketHandler { // 更新设备心跳请求时间 // 传入设备sn编码,更新对应sn的本次请求时间至redis。 StringRedisTemplate redisTemplate = SpringContentUtils.getBean(StringRedisTemplate.class); - redisTemplate.opsForValue().set(sn, LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"))); - redisTemplate.expire(sn, 30, TimeUnit.SECONDS); + redisTemplate.opsForValue().set(sn + "_1", LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"))); + redisTemplate.expire(sn + "_1", 30, TimeUnit.SECONDS); return; } } else { diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/equipment/vo/attendancemachine/DeviceStatusUpdateVO.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/equipment/vo/attendancemachine/DeviceStatusUpdateVO.java new file mode 100644 index 00000000..c08d38d6 --- /dev/null +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/admin/equipment/vo/attendancemachine/DeviceStatusUpdateVO.java @@ -0,0 +1,30 @@ +package cn.iocoder.yudao.module.system.controller.admin.equipment.vo.attendancemachine; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.time.LocalDateTime; + +@Schema(description = "管理后台 - 考勤设备状态修改 Request VO") +@Data +public class DeviceStatusUpdateVO { + + @Schema(description = "id", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + private Long id; + + @Schema(description = "设备号", requiredMode = Schema.RequiredMode.REQUIRED) + private String deviceNo; + + @Schema(description = "状态 | 0:离线 1:在线", requiredMode = Schema.RequiredMode.REQUIRED) + private Integer status; + + @Schema(description = "请求时间", requiredMode = Schema.RequiredMode.REQUIRED) + private LocalDateTime requestTime; + + public DeviceStatusUpdateVO(Long id, String deviceNo, Integer status, LocalDateTime requestTime) { + this.id = id; + this.deviceNo = deviceNo; + this.status = status; + this.requestTime = requestTime; + } +} diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/job/equipment/AttendanceMachineJob.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/job/equipment/AttendanceMachineJob.java index e09854e8..d6999948 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/job/equipment/AttendanceMachineJob.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/job/equipment/AttendanceMachineJob.java @@ -1,8 +1,10 @@ package cn.iocoder.yudao.module.system.job.equipment; +import cn.hutool.core.collection.CollectionUtil; import cn.hutool.core.util.StrUtil; import cn.iocoder.yudao.framework.tenant.core.job.TenantJob; import cn.iocoder.yudao.framework.websocket.core.session.WebSocketSessionManager; +import cn.iocoder.yudao.module.system.controller.admin.equipment.vo.attendancemachine.DeviceStatusUpdateVO; import cn.iocoder.yudao.module.system.dal.dataobject.equipment.AttendanceMachineDO; import cn.iocoder.yudao.module.system.service.equipment.AttendanceMachineService; import com.github.yulichang.toolkit.SpringContentUtils; @@ -13,6 +15,9 @@ import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Component; import javax.annotation.Resource; +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; +import java.util.ArrayList; import java.util.List; @Component @@ -30,19 +35,30 @@ public class AttendanceMachineJob { @TenantJob public void updateAttendanceMachineStatus() { + WebSocketSessionManager webSocketSessionManager = SpringContentUtils.getBean(WebSocketSessionManager.class); + + List statusUpdateVOS = new ArrayList<>(); + // 获得所有在线的设备 List attendanceMachineDOS = attendanceMachineService.getListByStatus(); for (AttendanceMachineDO reqDO : attendanceMachineDOS) { + // redis数据不存在,则为离线状态 - String data = stringRedisTemplate.opsForValue().get(reqDO.getDeviceNo()); + String data = stringRedisTemplate.opsForValue().get(reqDO.getDeviceNo() + "_1"); if (StrUtil.isEmpty(data)) { - attendanceMachineService.updateAttendanceMachineStatus(reqDO.getDeviceNo(), 0, null); + + statusUpdateVOS.add(new DeviceStatusUpdateVO(reqDO.getId(),reqDO.getDeviceNo(), 0, null)); //同步 删除对应sessionId - WebSocketSessionManager webSocketSessionManager = SpringContentUtils.getBean(WebSocketSessionManager.class); webSocketSessionManager.removeSession(webSocketSessionManager.getSessionByDeviceNum(reqDO.getDeviceNo())); } else { - attendanceMachineService.updateAttendanceMachineStatus(reqDO.getDeviceNo(), 1, data); + statusUpdateVOS.add(new DeviceStatusUpdateVO(reqDO.getId(),reqDO.getDeviceNo(), + 1, LocalDateTime.parse(data, DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")))); } } + + if (!CollectionUtil.isEmpty(statusUpdateVOS)) { + + attendanceMachineService.updateAttendanceMachineStatus(statusUpdateVOS); + } } } diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/equipment/AttendanceMachineService.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/equipment/AttendanceMachineService.java index 88fcd396..9a2f96a2 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/equipment/AttendanceMachineService.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/equipment/AttendanceMachineService.java @@ -32,9 +32,9 @@ public interface AttendanceMachineService { /** * 更新考勤设备 状态 - * @param deviceNo 设备号 + * @param statusUpdateVOS 更新信息 */ - void updateAttendanceMachineStatus(String deviceNo, Integer status, String dateTime); + void updateAttendanceMachineStatus(List statusUpdateVOS); /** * 考勤设备密码修改 diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/equipment/AttendanceMachineServiceImpl.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/equipment/AttendanceMachineServiceImpl.java index 0b5fd591..552c1ca7 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/equipment/AttendanceMachineServiceImpl.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/service/equipment/AttendanceMachineServiceImpl.java @@ -23,8 +23,6 @@ import org.springframework.transaction.annotation.Transactional; import org.springframework.validation.annotation.Validated; import javax.annotation.Resource; -import java.time.LocalDateTime; -import java.time.format.DateTimeFormatter; import java.util.ArrayList; import java.util.Collections; import java.util.List; @@ -32,7 +30,6 @@ import java.util.Map; import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertList; -import static cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId; import static cn.iocoder.yudao.module.system.enums.ErrorCodeConstants.*; /** @@ -110,15 +107,11 @@ public class AttendanceMachineServiceImpl implements AttendanceMachineService { } @Override - public void updateAttendanceMachineStatus(String deviceNo, Integer status, String dateTime) { - AttendanceMachineDO updateDO = new AttendanceMachineDO(); - updateDO.setStatus(status); -// updateDO.setUpdater(getLoginUserId().toString()); - if (status == 1) { - updateDO.setRequestTime(LocalDateTime.parse(dateTime, DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"))); - } - attendanceMachineMapper.update(updateDO, - new LambdaUpdateWrapper().eq(AttendanceMachineDO::getDeviceNo, deviceNo)); + public void updateAttendanceMachineStatus(List statusUpdateVOS) { + + List updateDO = BeanUtils.toBean(statusUpdateVOS, AttendanceMachineDO.class); + + attendanceMachineMapper.updateBatch(updateDO); } @Override