From 2a7eacf539acd10d8b612315fb7b5dcd8f4a6999 Mon Sep 17 00:00:00 2001 From: wangzhibiao Date: Sun, 20 Sep 2026 12:31:40 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E6=9D=83=E9=99=90(=E9=97=A8?= =?UTF-8?q?=E7=A6=81=E6=9C=8D=E5=8A=A1)=EF=BC=9A=E4=B8=BA=E9=97=A8?= =?UTF-8?q?=E7=A6=81=E6=8E=88=E6=9D=83=E7=89=A9=E7=90=86=E5=88=A0=E9=99=A4?= =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E7=94=9F=E6=95=88=E4=B8=AD=E7=8A=B6=E6=80=81?= =?UTF-8?q?=E6=8B=A6=E6=88=AA=E4=B8=8E=E5=8D=95=E5=85=83=E6=B5=8B=E8=AF=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../impl/TrainDormAuthServiceImpl.java | 23 +++++++- .../service/impl/DormAuthAlignmentTest.java | 54 +++++++++++++++++++ 2 files changed, 76 insertions(+), 1 deletion(-) diff --git a/RuoYi-Vue/ruoyi-train/src/main/java/com/ruoyi/train/service/impl/TrainDormAuthServiceImpl.java b/RuoYi-Vue/ruoyi-train/src/main/java/com/ruoyi/train/service/impl/TrainDormAuthServiceImpl.java index da81a9820..94c93a2e5 100644 --- a/RuoYi-Vue/ruoyi-train/src/main/java/com/ruoyi/train/service/impl/TrainDormAuthServiceImpl.java +++ b/RuoYi-Vue/ruoyi-train/src/main/java/com/ruoyi/train/service/impl/TrainDormAuthServiceImpl.java @@ -184,9 +184,19 @@ public class TrainDormAuthServiceImpl implements ITrainDormAuthService * @return 结果 */ @Override + @Transactional(rollbackFor = Exception.class) public int deleteTrainDormAuthByAuthIds(Long[] authIds) { - return trainDormAuthMapper.deleteTrainDormAuthByAuthIds(authIds); + if (authIds == null || authIds.length == 0) + { + return 0; + } + int count = 0; + for (Long authId : authIds) + { + count += deleteTrainDormAuthByAuthId(authId); + } + return count; } /** @@ -198,6 +208,17 @@ public class TrainDormAuthServiceImpl implements ITrainDormAuthService @Override public int deleteTrainDormAuthByAuthId(Long authId) { + TrainDormAuth exist = trainDormAuthMapper.selectTrainDormAuthByAuthId(authId); + if (exist == null) + { + return 0; + } + if (TrainDormAuth.STATUS_ACTIVE.equals(exist.getFaceSyncStatus()) + || TrainDormAuth.AUTH_STATUS_ACTIVE.equals(exist.getAuthStatus()) + || TrainDormAuth.AUTH_STATUS_GRANTING.equals(exist.getAuthStatus())) + { + throw new ServiceException("当前门禁授权处于生效或授权中状态,请先执行注销后再清理"); + } return trainDormAuthMapper.deleteTrainDormAuthByAuthId(authId); } diff --git a/RuoYi-Vue/ruoyi-train/src/test/java/com/ruoyi/train/service/impl/DormAuthAlignmentTest.java b/RuoYi-Vue/ruoyi-train/src/test/java/com/ruoyi/train/service/impl/DormAuthAlignmentTest.java index be70640f5..4e721001b 100644 --- a/RuoYi-Vue/ruoyi-train/src/test/java/com/ruoyi/train/service/impl/DormAuthAlignmentTest.java +++ b/RuoYi-Vue/ruoyi-train/src/test/java/com/ruoyi/train/service/impl/DormAuthAlignmentTest.java @@ -297,6 +297,60 @@ public class DormAuthAlignmentTest assertEquals(newAccId, queriedNew.getAccommodationId()); } + /** + * 验证活跃生效中(ACTIVE)门禁授权禁止直接物理删除,必须先注销 + */ + @Test + public void testDeleteTrainDormAuth_ActiveStatusBlocked() + { + TrainAccommodation acc = new TrainAccommodation(); + acc.setAccommodationId(5003L); + acc.setAccommodationStatus(TrainAccommodation.STATUS_CHECKED_IN); + mockAccommodationMapper.save(acc); + + TrainDormAuth activeAuth = new TrainDormAuth(); + activeAuth.setAccommodationId(5003L); + dormAuthService.insertTrainDormAuth(activeAuth); + Long authId = activeAuth.getAuthId(); + + // 模拟外部设备同步成功,更新状态为 ACTIVE + mockDormAuthMapper.updateSyncStatus(authId, TrainDormAuth.STATUS_ACTIVE, null, "admin", new Date()); + + try + { + dormAuthService.deleteTrainDormAuthByAuthId(authId); + fail("应拦截活跃门禁授权删除并抛出 ServiceException"); + } + catch (ServiceException e) + { + assertTrue(e.getMessage().contains("当前门禁授权处于生效或授权中状态")); + } + } + + /** + * 验证已注销(REVOKED)门禁授权可以安全物理清理 + */ + @Test + public void testDeleteTrainDormAuth_RevokedCanBeDeleted() + { + TrainAccommodation acc = new TrainAccommodation(); + acc.setAccommodationId(5004L); + acc.setAccommodationStatus(TrainAccommodation.STATUS_CHECKED_IN); + mockAccommodationMapper.save(acc); + + TrainDormAuth auth = new TrainDormAuth(); + auth.setAccommodationId(5004L); + dormAuthService.insertTrainDormAuth(auth); + Long authId = auth.getAuthId(); + + // 办理注销 + dormAuthService.revokeAuth(authId, "admin"); + + int deleted = dormAuthService.deleteTrainDormAuthByAuthId(authId); + assertEquals(1, deleted); + assertNull(dormAuthService.selectTrainDormAuthByAuthId(authId)); + } + // ================================= 内部 Mock 类 ================================= private static class MockDormAuthMapper implements TrainDormAuthMapper