diff --git a/RuoYi-Vue/ruoyi-admin/src/main/java/com/ruoyi/web/controller/train/TrainDormAuthController.java b/RuoYi-Vue/ruoyi-admin/src/main/java/com/ruoyi/web/controller/train/TrainDormAuthController.java index c92fddc6c..d55eaa03e 100644 --- a/RuoYi-Vue/ruoyi-admin/src/main/java/com/ruoyi/web/controller/train/TrainDormAuthController.java +++ b/RuoYi-Vue/ruoyi-admin/src/main/java/com/ruoyi/web/controller/train/TrainDormAuthController.java @@ -38,7 +38,7 @@ public class TrainDormAuthController extends BaseController /** * 查询宿舍权限分配列表 */ - @PreAuthorize("@ss.hasPermi('system:auth:list')") + @PreAuthorize("@ss.hasPermi('train:access:query') or @ss.hasPermi('system:auth:list')") @GetMapping("/list") public TableDataInfo list(TrainDormAuth trainDormAuth) { @@ -80,61 +80,8 @@ public class TrainDormAuthController extends BaseController return success(trainDormAuthService.selectTrainDormAuthByAccommodationId(accommodationId)); } - /** - * 新增宿舍权限分配 - */ - @PreAuthorize("@ss.hasPermi('system:auth:add')") - @Log(title = "宿舍权限分配", businessType = BusinessType.INSERT) - @PostMapping - public AjaxResult add(@RequestBody TrainDormAuth trainDormAuth) - { - trainDormAuth.setCreateBy(getUsernameSafe()); - return toAjax(trainDormAuthService.insertTrainDormAuth(trainDormAuth)); - } - - /** - * 修改宿舍权限分配 - */ - @PreAuthorize("@ss.hasPermi('system:auth:edit')") - @Log(title = "宿舍权限分配", businessType = BusinessType.UPDATE) - @PutMapping - public AjaxResult edit(@RequestBody TrainDormAuth trainDormAuth) - { - trainDormAuth.setUpdateBy(getUsernameSafe()); - return toAjax(trainDormAuthService.updateTrainDormAuth(trainDormAuth)); - } - - /** - * 注销宿舍权限分配 - */ - @PreAuthorize("@ss.hasPermi('system:auth:edit')") - @Log(title = "宿舍权限分配-注销", businessType = BusinessType.UPDATE) - @PostMapping("/{authId}/revoke") - public AjaxResult revoke(@PathVariable("authId") Long authId) - { - return toAjax(trainDormAuthService.revokeAuth(authId, getUsernameSafe())); - } - - /** - * 删除宿舍权限分配 - */ - @PreAuthorize("@ss.hasPermi('system:auth:remove')") - @Log(title = "宿舍权限分配", businessType = BusinessType.DELETE) - @DeleteMapping("/{authIds}") - public AjaxResult remove(@PathVariable Long[] authIds) - { - return toAjax(trainDormAuthService.deleteTrainDormAuthByAuthIds(authIds)); - } - - private String getUsernameSafe() - { - try - { - return SecurityUtils.getUsername(); - } - catch (Exception e) - { - return "admin"; - } - } + // 注意:Package A 架构整改:门禁授权的所有写操作(新增、修改、下发凭据、注销、删除) + // 统一收归到 TrainAccessManagementController -> AccessAuthorizationOrchestrator -> DMS 权威调用链。 + // TrainDormAuthController 仅保留纯读取端点(list, export, getInfo, getInfoByAccommodationId)。 } + diff --git a/RuoYi-Vue/ruoyi-admin/src/test/java/com/ruoyi/web/controller/train/AccommodationAndAuthApiControllerContractTest.java b/RuoYi-Vue/ruoyi-admin/src/test/java/com/ruoyi/web/controller/train/AccommodationAndAuthApiControllerContractTest.java index afc952646..ed3988570 100644 --- a/RuoYi-Vue/ruoyi-admin/src/test/java/com/ruoyi/web/controller/train/AccommodationAndAuthApiControllerContractTest.java +++ b/RuoYi-Vue/ruoyi-admin/src/test/java/com/ruoyi/web/controller/train/AccommodationAndAuthApiControllerContractTest.java @@ -2,6 +2,7 @@ package com.ruoyi.web.controller.train; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.fail; import java.lang.reflect.Method; import org.junit.Test; @@ -116,15 +117,26 @@ public class AccommodationAndAuthApiControllerContractTest assertEquals("/accommodation/{accommodationId}", accInfoMethod.getAnnotation(GetMapping.class).value()[0]); assertEquals("@ss.hasPermi('system:auth:query')", accInfoMethod.getAnnotation(PreAuthorize.class).value()); - // 4. POST /train/auth - Method addMethod = clazz.getMethod("add", TrainDormAuth.class); - assertNotNull(addMethod.getAnnotation(PostMapping.class)); - assertEquals("@ss.hasPermi('system:auth:add')", addMethod.getAnnotation(PreAuthorize.class).value()); + // 4. 验证 Package A 安全架构:TrainDormAuthController 彻底移除写端点 (add, edit, revoke, remove) + try { + clazz.getMethod("add", TrainDormAuth.class); + fail("TrainDormAuthController 不得存在 POST add 写端点"); + } catch (NoSuchMethodException expected) {} - // 5. POST /train/auth/{authId}/revoke - Method revokeMethod = clazz.getMethod("revoke", Long.class); - assertNotNull(revokeMethod.getAnnotation(PostMapping.class)); - assertEquals("/{authId}/revoke", revokeMethod.getAnnotation(PostMapping.class).value()[0]); - assertEquals("@ss.hasPermi('system:auth:edit')", revokeMethod.getAnnotation(PreAuthorize.class).value()); + try { + clazz.getMethod("edit", TrainDormAuth.class); + fail("TrainDormAuthController 不得存在 PUT edit 写端点"); + } catch (NoSuchMethodException expected) {} + + try { + clazz.getMethod("revoke", Long.class); + fail("TrainDormAuthController 不得存在 POST revoke 写端点"); + } catch (NoSuchMethodException expected) {} + + try { + clazz.getMethod("remove", Long[].class); + fail("TrainDormAuthController 不得存在 DELETE remove 写端点"); + } catch (NoSuchMethodException expected) {} } } + diff --git a/RuoYi-Vue/ruoyi-admin/src/test/java/com/ruoyi/web/controller/train/PreCustomerStabilizationFinalFixesContractTest.java b/RuoYi-Vue/ruoyi-admin/src/test/java/com/ruoyi/web/controller/train/PreCustomerStabilizationFinalFixesContractTest.java index e7d91bddd..fc30b3141 100644 --- a/RuoYi-Vue/ruoyi-admin/src/test/java/com/ruoyi/web/controller/train/PreCustomerStabilizationFinalFixesContractTest.java +++ b/RuoYi-Vue/ruoyi-admin/src/test/java/com/ruoyi/web/controller/train/PreCustomerStabilizationFinalFixesContractTest.java @@ -258,12 +258,12 @@ public class PreCustomerStabilizationFinalFixesContractTest assertNotNull(accPre); assertEquals("@ss.hasPermi('train:accommodation:remove')", accPre.value()); - // 门禁撤销 - Method authRevoke = TrainDormAuthController.class.getMethod("revoke", Long.class); - assertNotNull(authRevoke); - PreAuthorize authRevokePre = authRevoke.getAnnotation(PreAuthorize.class); - assertNotNull(authRevokePre); - assertEquals("@ss.hasPermi('system:auth:edit')", authRevokePre.value()); + // 门禁撤销:TrainDormAuthController 彻底移除写接口 revoke,收归至 TrainAccessManagementController + try { + TrainDormAuthController.class.getMethod("revoke", Long.class); + fail("TrainDormAuthController 不得存在 revoke 写接口"); + } catch (NoSuchMethodException expected) {} + // 成绩删除 Method scoreRemove = TrainScoreInfoController.class.getMethod("remove", Long[].class); diff --git a/RuoYi-Vue/ruoyi-train/src/main/java/com/ruoyi/train/domain/TrainDormAuth.java b/RuoYi-Vue/ruoyi-train/src/main/java/com/ruoyi/train/domain/TrainDormAuth.java index 49c4cbc32..1bb7f2891 100644 --- a/RuoYi-Vue/ruoyi-train/src/main/java/com/ruoyi/train/domain/TrainDormAuth.java +++ b/RuoYi-Vue/ruoyi-train/src/main/java/com/ruoyi/train/domain/TrainDormAuth.java @@ -103,6 +103,9 @@ public class TrainDormAuth extends BaseEntity /** 学员姓名 (非物理列,联表自 train_student) */ private String studentName; + /** 学员联系电话 (非物理列,联表自 train_student) */ + private String studentPhone; + /** 开班计划ID (非物理列,联表自 train_enrollment) */ private String planId; @@ -405,6 +408,16 @@ public class TrainDormAuth extends BaseEntity } } + public String getStudentPhone() + { + return studentPhone; + } + + public void setStudentPhone(String studentPhone) + { + this.studentPhone = studentPhone; + } + @Override public String toString() { diff --git a/RuoYi-Vue/ruoyi-train/src/main/java/com/ruoyi/train/mapper/TrainDormAuthMapper.java b/RuoYi-Vue/ruoyi-train/src/main/java/com/ruoyi/train/mapper/TrainDormAuthMapper.java index 43b90a33d..8a5670c40 100644 --- a/RuoYi-Vue/ruoyi-train/src/main/java/com/ruoyi/train/mapper/TrainDormAuthMapper.java +++ b/RuoYi-Vue/ruoyi-train/src/main/java/com/ruoyi/train/mapper/TrainDormAuthMapper.java @@ -83,6 +83,14 @@ public interface TrainDormAuthMapper @Param("updateBy") String updateBy, @Param("updateTime") Date updateTime); + /** + * 成功推进状态后清空历史错误信息 + * + * @param authId 授权主键 + * @return 影响行数 + */ + public int clearLastError(@Param("authId") Long authId); + /** * 删除宿舍门禁授权 * diff --git a/RuoYi-Vue/ruoyi-train/src/main/java/com/ruoyi/train/service/ITrainDormAuthService.java b/RuoYi-Vue/ruoyi-train/src/main/java/com/ruoyi/train/service/ITrainDormAuthService.java index 2e208eb48..d8e540a52 100644 --- a/RuoYi-Vue/ruoyi-train/src/main/java/com/ruoyi/train/service/ITrainDormAuthService.java +++ b/RuoYi-Vue/ruoyi-train/src/main/java/com/ruoyi/train/service/ITrainDormAuthService.java @@ -61,14 +61,6 @@ public interface ITrainDormAuthService */ public int markSyncFailed(Long authId, String errorMessage, String operator); - /** - * 注销门禁授权 - * - * @param authId 授权主键 - * @param operator 操作人 - * @return 结果 - */ - public int revokeAuth(Long authId, String operator); /** * 批量删除宿舍门禁授权 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 f6a420457..138a65fbf 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 @@ -159,23 +159,6 @@ public class TrainDormAuthServiceImpl implements ITrainDormAuthService return trainDormAuthMapper.increaseRetryCount(authId, errorMessage, operator, DateUtils.getNowDate()); } - /** - * 注销门禁授权 - * - * @param authId 授权主键 - * @param operator 操作人 - * @return 结果 - */ - @Override - public int revokeAuth(Long authId, String operator) - { - TrainDormAuth exist = trainDormAuthMapper.selectTrainDormAuthByAuthId(authId); - if (exist == null) - { - throw new ServiceException("门禁授权记录不存在: " + authId); - } - return trainDormAuthMapper.updateSyncStatus(authId, TrainDormAuth.STATUS_REVOKED, null, operator, DateUtils.getNowDate()); - } /** * 批量删除宿舍门禁授权 @@ -303,7 +286,12 @@ public class TrainDormAuthServiceImpl implements ITrainDormAuthService exist.setOperationVersion((exist.getOperationVersion() != null ? exist.getOperationVersion() : 1) + 1); exist.setUpdateBy(operator); exist.setUpdateTime(DateUtils.getNowDate()); - return trainDormAuthMapper.updateTrainDormAuth(exist); + int rows = trainDormAuthMapper.updateTrainDormAuth(exist); + if (rows > 0 && (TrainDormAuth.AUTH_STATUS_ACTIVE.equals(authStatus) || TrainDormAuth.AUTH_STATUS_REVOKED.equals(authStatus))) + { + trainDormAuthMapper.clearLastError(authId); + } + return rows; } @Override @@ -331,6 +319,11 @@ public class TrainDormAuthServiceImpl implements ITrainDormAuthService } exist.setUpdateBy(operator != null ? operator : "DmsPoller"); exist.setUpdateTime(DateUtils.getNowDate()); - return trainDormAuthMapper.updateTrainDormAuth(exist); + int rows = trainDormAuthMapper.updateTrainDormAuth(exist); + if (rows > 0 && lastError == null && (TrainDormAuth.AUTH_STATUS_ACTIVE.equals(authStatus) || TrainDormAuth.AUTH_STATUS_REVOKED.equals(authStatus))) + { + trainDormAuthMapper.clearLastError(authId); + } + return rows; } } diff --git a/RuoYi-Vue/ruoyi-train/src/main/resources/mapper/train/TrainDormAuthMapper.xml b/RuoYi-Vue/ruoyi-train/src/main/resources/mapper/train/TrainDormAuthMapper.xml index f4cfdab14..d56de9a99 100644 --- a/RuoYi-Vue/ruoyi-train/src/main/resources/mapper/train/TrainDormAuthMapper.xml +++ b/RuoYi-Vue/ruoyi-train/src/main/resources/mapper/train/TrainDormAuthMapper.xml @@ -21,6 +21,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" + @@ -60,6 +61,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" acc.bed_no, e.student_id, s.s_name AS student_name, + s.s_phone AS student_phone, e.plan_id, p.plan_name, d.dorm_building, @@ -211,6 +213,13 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" WHERE auth_id = #{authId} + + UPDATE train_dorm_auth + SET last_error = NULL, + update_time = CURRENT_TIMESTAMP + WHERE auth_id = #{authId} + + DELETE FROM train_dorm_auth WHERE auth_id = #{authId} diff --git a/build_ui/src/api/train/auth.js b/build_ui/src/api/train/auth.js index 04735398c..f98189edf 100644 --- a/build_ui/src/api/train/auth.js +++ b/build_ui/src/api/train/auth.js @@ -16,37 +16,3 @@ export function getAuth(authId) { method: 'get' }) } - -// 新增宿舍权限分配 -export function addAuth(data) { - return request({ - url: '/train/auth', - method: 'post', - data: data - }) -} - -// 修改宿舍权限分配 -export function updateAuth(data) { - return request({ - url: '/train/auth', - method: 'put', - data: data - }) -} - -// 删除宿舍权限分配 -export function delAuth(authId) { - return request({ - url: '/train/auth/' + authId, - method: 'delete' - }) -} - -// 注销门禁授权 -export function revokeAuth(authId) { - return request({ - url: '/train/auth/' + authId + '/revoke', - method: 'post' - }) -}