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'
- })
-}