From b291dacf3def9a04239032f4ea4c418d51d5a9f1 Mon Sep 17 00:00:00 2001 From: future <1360317836@qq.com> Date: Wed, 24 Jun 2026 00:43:53 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E4=B8=A2=E5=A4=B1=E6=96=87?= =?UTF-8?q?=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../manage/checkIn/entity/SignInRecord.java | 4 - .../checkIn/service/ICheckInService.java | 4 - .../service/impl/CheckServiceImpl.java | 49 ------------ .../checkIn/websocket/MyWebSocketHandler.java | 78 ------------------- .../gym/manage/checkin/CheckInModuleTest.java | 3 - .../common/constant/RedisKeyConstants.java | 3 - .../gym/manage/sys/config/SecurityConfig.java | 2 +- 7 files changed, 1 insertion(+), 142 deletions(-) diff --git a/gym-manage-api/gym-checkIn/src/main/java/cn/novalon/gym/manage/checkIn/entity/SignInRecord.java b/gym-manage-api/gym-checkIn/src/main/java/cn/novalon/gym/manage/checkIn/entity/SignInRecord.java index 59a9e0e..63cf034 100644 --- a/gym-manage-api/gym-checkIn/src/main/java/cn/novalon/gym/manage/checkIn/entity/SignInRecord.java +++ b/gym-manage-api/gym-checkIn/src/main/java/cn/novalon/gym/manage/checkIn/entity/SignInRecord.java @@ -206,8 +206,4 @@ public class SignInRecord { public void restore() { this.isDelete = false; } -<<<<<<< HEAD } -======= -} ->>>>>>> f52451d (feat: 添加签到模块和数据库表结构) diff --git a/gym-manage-api/gym-checkIn/src/main/java/cn/novalon/gym/manage/checkIn/service/ICheckInService.java b/gym-manage-api/gym-checkIn/src/main/java/cn/novalon/gym/manage/checkIn/service/ICheckInService.java index e78174d..e162423 100644 --- a/gym-manage-api/gym-checkIn/src/main/java/cn/novalon/gym/manage/checkIn/service/ICheckInService.java +++ b/gym-manage-api/gym-checkIn/src/main/java/cn/novalon/gym/manage/checkIn/service/ICheckInService.java @@ -78,8 +78,4 @@ public interface ICheckInService { * @return 签到统计VO */ Mono getDailySignInStats(LocalDate date); -<<<<<<< HEAD } -======= -} ->>>>>>> f52451d (feat: 添加签到模块和数据库表结构) diff --git a/gym-manage-api/gym-checkIn/src/main/java/cn/novalon/gym/manage/checkIn/service/impl/CheckServiceImpl.java b/gym-manage-api/gym-checkIn/src/main/java/cn/novalon/gym/manage/checkIn/service/impl/CheckServiceImpl.java index a0279ea..e041842 100644 --- a/gym-manage-api/gym-checkIn/src/main/java/cn/novalon/gym/manage/checkIn/service/impl/CheckServiceImpl.java +++ b/gym-manage-api/gym-checkIn/src/main/java/cn/novalon/gym/manage/checkIn/service/impl/CheckServiceImpl.java @@ -2,11 +2,8 @@ package cn.novalon.gym.manage.checkIn.service.impl; import cn.hutool.core.bean.BeanUtil; import cn.hutool.json.JSONUtil; -<<<<<<< HEAD import cn.hutool.extra.qrcode.QrCodeUtil; import cn.hutool.extra.qrcode.QrConfig; -======= ->>>>>>> f52451d (feat: 添加签到模块和数据库表结构) import cn.novalon.gym.manage.checkIn.config.QRCodeConfig; import cn.novalon.gym.manage.checkIn.constant.QRRedisKey; import cn.novalon.gym.manage.checkIn.entity.SignInRecord; @@ -24,11 +21,6 @@ import cn.novalon.gym.manage.member.entity.MemberCardRecord; import cn.novalon.gym.manage.member.enums.MemberCardType; import cn.novalon.gym.manage.member.repository.MemberCardRecordRepository; import cn.novalon.gym.manage.member.repository.MemberCardRepository; -<<<<<<< HEAD -======= -import cn.hutool.extra.qrcode.QrCodeUtil; -import cn.hutool.extra.qrcode.QrConfig; ->>>>>>> f52451d (feat: 添加签到模块和数据库表结构) import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; @@ -92,10 +84,7 @@ public class CheckServiceImpl implements ICheckInService { public Mono checkIn(Long memberId, String qrContent) { String key = RedisKeyConstants.QRCODE_USER_DAILY + memberId + LocalDate.now(); -<<<<<<< HEAD -======= // 先检查当天是否已经签到(从数据库查询,作为重复签到的额外保障) ->>>>>>> f52451d (feat: 添加签到模块和数据库表结构) return checkTodayAlreadySignedIn(memberId) .flatMap(existingRecord -> { String checkInTime = existingRecord.getSignInTime().format(DATE_FORMATTER); @@ -137,14 +126,11 @@ public class CheckServiceImpl implements ICheckInService { }); } -<<<<<<< HEAD -======= /** * 检查会员当天是否已经签到 * @param memberId 会员ID * @return 如果已签到返回签到记录,否则返回空 */ ->>>>>>> f52451d (feat: 添加签到模块和数据库表结构) private Mono checkTodayAlreadySignedIn(Long memberId) { LocalDateTime startOfDay = LocalDate.now().atStartOfDay(); LocalDateTime endOfDay = LocalDate.now().atTime(LocalTime.MAX); @@ -152,11 +138,6 @@ public class CheckServiceImpl implements ICheckInService { return signInRecordRepository.findByMemberIdAndDate(memberId, startOfDay, endOfDay); } -<<<<<<< HEAD - private Mono processCheckIn(Long memberId, Long memberCardRecordId, Map redisMap, String qrContent) { - LocalDateTime now = LocalDateTime.now(); - -======= /** * 处理签到逻辑 */ @@ -164,7 +145,6 @@ public class CheckServiceImpl implements ICheckInService { LocalDateTime now = LocalDateTime.now(); // 发送实时进度通知 ->>>>>>> f52451d (feat: 添加签到模块和数据库表结构) MyWebSocketHandler.sendProgress(qrContent, "VALIDATE_CARD", "正在验证会员卡..."); return memberCardRecordRepository.findById(memberCardRecordId) @@ -183,15 +163,10 @@ public class CheckServiceImpl implements ICheckInService { return Mono.error(new RuntimeException("会员卡已过期")); } -<<<<<<< HEAD - MyWebSocketHandler.sendProgress(qrContent, "VALIDATE_BOOKING", "会员卡验证通过,正在检查预约信息..."); - -======= // 发送实时进度通知 MyWebSocketHandler.sendProgress(qrContent, "VALIDATE_BOOKING", "会员卡验证通过,正在检查预约信息..."); // 检查是否有需要签到的团课预约 ->>>>>>> f52451d (feat: 添加签到模块和数据库表结构) return validateBooking(memberId, now) .then(memberCardRepository.findByMemberCardIdAndDeletedAtIsNull(cardRecord.getMemberCardId()) .switchIfEmpty(Mono.defer(() -> { @@ -199,10 +174,7 @@ public class CheckServiceImpl implements ICheckInService { return Mono.error(new RuntimeException("会员卡类型不存在")); })) .flatMap(card -> { -<<<<<<< HEAD -======= // 发送实时进度通知 ->>>>>>> f52451d (feat: 添加签到模块和数据库表结构) MyWebSocketHandler.sendProgress(qrContent, "DEDUCT_USAGE", "正在扣减会员卡次数..."); return deductCardUsage(cardRecord, card) @@ -223,12 +195,9 @@ public class CheckServiceImpl implements ICheckInService { }); } -<<<<<<< HEAD -======= /** * 验证预约信息 */ ->>>>>>> f52451d (feat: 添加签到模块和数据库表结构) private Mono validateBooking(Long memberId, LocalDateTime now) { return groupCourseBookingService.getBookingsByMemberId(memberId) .filter(booking -> { @@ -260,12 +229,9 @@ public class CheckServiceImpl implements ICheckInService { }); } -<<<<<<< HEAD -======= /** * 扣减会员卡使用次数/金额 */ ->>>>>>> f52451d (feat: 添加签到模块和数据库表结构) private Mono deductCardUsage(MemberCardRecord record, MemberCard card) { MemberCardType cardType = MemberCardType.valueOf(card.getMemberCardType()); LocalDateTime now = LocalDateTime.now(); @@ -301,12 +267,9 @@ public class CheckServiceImpl implements ICheckInService { } } -<<<<<<< HEAD -======= /** * 保存签到记录 */ ->>>>>>> f52451d (feat: 添加签到模块和数据库表结构) private Mono saveSignInRecord(Long memberId, Long memberCardRecordId, Long memberCardId) { SignInRecord record = SignInRecord.builder() .memberId(memberId) @@ -321,12 +284,9 @@ public class CheckServiceImpl implements ICheckInService { return signInRecordRepository.save(record).then(); } -<<<<<<< HEAD -======= /** * 构建成功响应 */ ->>>>>>> f52451d (feat: 添加签到模块和数据库表结构) private String buildSuccessResponse(LocalDateTime dateTime) { Map res = new HashMap<>(); res.put("message", "签到成功"); @@ -334,12 +294,9 @@ public class CheckServiceImpl implements ICheckInService { return JSONUtil.toJsonStr(res); } -<<<<<<< HEAD -======= /** * 查找会员的有效会员卡(优先选择有效期最早到期的) */ ->>>>>>> f52451d (feat: 添加签到模块和数据库表结构) private Mono findValidMemberCard(Long memberId) { return memberCardRecordRepository.findActiveCardsByMemberId(memberId) .filter(record -> { @@ -357,11 +314,8 @@ public class CheckServiceImpl implements ICheckInService { .next(); } -<<<<<<< HEAD -======= // ==================== 签到记录管理功能 ==================== ->>>>>>> f52451d (feat: 添加签到模块和数据库表结构) @Override public Flux getSignInRecords(Long memberId, LocalDate startTime, LocalDate endTime) { LocalDateTime start = startTime.atStartOfDay(); @@ -459,12 +413,9 @@ public class CheckServiceImpl implements ICheckInService { ); } -<<<<<<< HEAD -======= /** * 转换实体到VO */ ->>>>>>> f52451d (feat: 添加签到模块和数据库表结构) private SignInRecordVO convertToVO(SignInRecord record) { SignInRecordVO vo = new SignInRecordVO(); vo.setId(record.getId()); diff --git a/gym-manage-api/gym-checkIn/src/main/java/cn/novalon/gym/manage/checkIn/websocket/MyWebSocketHandler.java b/gym-manage-api/gym-checkIn/src/main/java/cn/novalon/gym/manage/checkIn/websocket/MyWebSocketHandler.java index d3a6a64..f3bd900 100644 --- a/gym-manage-api/gym-checkIn/src/main/java/cn/novalon/gym/manage/checkIn/websocket/MyWebSocketHandler.java +++ b/gym-manage-api/gym-checkIn/src/main/java/cn/novalon/gym/manage/checkIn/websocket/MyWebSocketHandler.java @@ -77,11 +77,7 @@ public class MyWebSocketHandler implements WebSocketHandler { .doOnError(e -> { log.error("接收消息出错,sessionId={}", sessionId, e); }) -<<<<<<< HEAD - .subscribe(); -======= .subscribe(); // 必须订阅,否则不会执行 ->>>>>>> f52451d (feat: 添加签到模块和数据库表结构) // 发送流给客户端 return session.send(sink.asFlux().map(session::textMessage)) @@ -104,10 +100,7 @@ public class MyWebSocketHandler implements WebSocketHandler { * @return 是否发送成功 */ public static boolean sendMessageToClient(String qrContent, String message) { -<<<<<<< HEAD -======= // 先清理超时连接 ->>>>>>> f52451d (feat: 添加签到模块和数据库表结构) cleanupTimeoutConnections(); Sinks.Many sink = qrContentToSink.get(qrContent); @@ -137,77 +130,6 @@ public class MyWebSocketHandler implements WebSocketHandler { String progressMessage = buildMessage("PROGRESS", message); sendMessageToClient(qrContent, progressMessage); log.debug("发送进度消息: qrContent={}, step={}, message={}", qrContent, step, message); -<<<<<<< HEAD -======= - } - - /** - * 发送签到成功消息 - * - * @param qrContent 二维码内容 - * @param memberId 会员ID - * @param signInTime 签到时间 - */ - public static void sendSuccess(String qrContent, Long memberId, String signInTime) { - String successMessage = buildMessage("SUCCESS", "签到成功!欢迎光临\n会员ID: " + memberId + "\n签到时间: " + signInTime); - sendMessageToClient(qrContent, successMessage); - log.info("发送成功消息: qrContent={}, memberId={}", qrContent, memberId); - } - - /** - * 发送签到失败消息 - * - * @param qrContent 二维码内容 - * @param reason 失败原因 - */ - public static void sendFailure(String qrContent, String reason) { - String failureMessage = buildMessage("FAILURE", "签到失败:" + reason); - sendMessageToClient(qrContent, failureMessage); - log.warn("发送失败消息: qrContent={}, reason={}", qrContent, reason); - } - - /** - * 构建标准消息格式 - * - * @param type 消息类型 - * @param content 消息内容 - * @return 格式化后的消息字符串 - */ - private static String buildMessage(String type, String content) { - return JSONUtil.toJsonStr(Map.of( - "type", type, - "content", content, - "timestamp", System.currentTimeMillis() - )); - } - - /** - * 清理超时连接 - */ - private static void cleanupTimeoutConnections() { - LocalDateTime now = LocalDateTime.now(); - qrContentToCreateTime.entrySet().removeIf(entry -> { - LocalDateTime createTime = entry.getValue(); - long secondsDiff = java.time.Duration.between(createTime, now).getSeconds(); - if (secondsDiff > TIMEOUT_SECONDS) { - String qrContent = entry.getKey(); - qrContentToSink.remove(qrContent); - log.debug("清理超时连接: qrContent={}, 超时时间={}秒", qrContent, secondsDiff); - return true; - } - return false; - }); - } - - /** - * 获取当前连接数 - * - * @return 连接数 - */ - public static int getConnectionCount() { - cleanupTimeoutConnections(); - return qrContentToSink.size(); ->>>>>>> f52451d (feat: 添加签到模块和数据库表结构) } /** diff --git a/gym-manage-api/gym-checkIn/src/test/java/cn/novalon/gym/manage/checkin/CheckInModuleTest.java b/gym-manage-api/gym-checkIn/src/test/java/cn/novalon/gym/manage/checkin/CheckInModuleTest.java index 8f35681..27fb944 100644 --- a/gym-manage-api/gym-checkIn/src/test/java/cn/novalon/gym/manage/checkin/CheckInModuleTest.java +++ b/gym-manage-api/gym-checkIn/src/test/java/cn/novalon/gym/manage/checkin/CheckInModuleTest.java @@ -25,10 +25,7 @@ import reactor.test.StepVerifier; import java.time.LocalDate; import java.time.LocalDateTime; -<<<<<<< HEAD -======= import java.time.LocalTime; ->>>>>>> f52451d (feat: 添加签到模块和数据库表结构) import java.util.HashMap; import java.util.Map; diff --git a/gym-manage-api/manage-common/src/main/java/cn/novalon/gym/manage/common/constant/RedisKeyConstants.java b/gym-manage-api/manage-common/src/main/java/cn/novalon/gym/manage/common/constant/RedisKeyConstants.java index b32601e..46d7c61 100644 --- a/gym-manage-api/manage-common/src/main/java/cn/novalon/gym/manage/common/constant/RedisKeyConstants.java +++ b/gym-manage-api/manage-common/src/main/java/cn/novalon/gym/manage/common/constant/RedisKeyConstants.java @@ -61,7 +61,6 @@ public final class RedisKeyConstants { * appType: miniapp(小程序), mp(公众号) */ public static final String WECHAT_ACCESS_TOKEN = "wechat:access_token:"; -<<<<<<< HEAD // ==================== 认证模块 ==================== @@ -71,6 +70,4 @@ public final class RedisKeyConstants { * 用途:存储登录/注册等场景的短信验证码 */ public static final String SMS_CODE = "sms:code:"; -======= ->>>>>>> 08cf82a (签到模块) } \ No newline at end of file diff --git a/gym-manage-api/manage-sys/src/main/java/cn/novalon/gym/manage/sys/config/SecurityConfig.java b/gym-manage-api/manage-sys/src/main/java/cn/novalon/gym/manage/sys/config/SecurityConfig.java index eb22166..7cec5cf 100644 --- a/gym-manage-api/manage-sys/src/main/java/cn/novalon/gym/manage/sys/config/SecurityConfig.java +++ b/gym-manage-api/manage-sys/src/main/java/cn/novalon/gym/manage/sys/config/SecurityConfig.java @@ -1,4 +1,4 @@ -package cn.novalon.gym.manage.sys.config; +package cn.novalon.gym.manage.sys.config; import cn.novalon.gym.manage.sys.audit.OperationLogWebFilter; import cn.novalon.gym.manage.sys.security.JwtAuthenticationFilter;