修改管理员区域功能 #155

Merged
hnu202326010106 merged 1 commits from wanglei_branch into develop 2 weeks ago

@ -40,6 +40,22 @@ public class AdminController {
}
}
/**
*
*/
@GetMapping("/available-area-admins")
@PreAuthorize("hasAnyRole('SUPER_ADMIN', 'AREA_ADMIN')")
@Operation(summary = "获取可分配校区的区域管理员", description = "返回未负责任何片区的区域管理员,用于片区绑定负责人")
public ResponseEntity<ResultVO<List<Admin>>> getAvailableAreaAdmins() {
try {
List<Admin> availableAdmins = adminService.getAvailableAreaAdmins();
return ResponseEntity.ok(ResultVO.success(availableAdmins));
} catch (Exception e) {
return ResponseEntity.ok(ResultVO.error(500, "查询失败:" + e.getMessage()));
}
}
/**
*
*/

@ -193,7 +193,7 @@ public class AreaController {
*
*/
@GetMapping("/device-stats/city/{cityId}/campuses")
@PreAuthorize("hasAnyRole('SUPER_ADMIN', 'AREA_ADMIN')")
@PreAuthorize("hasAnyRole('SUPER_ADMIN')")
public ResponseEntity<Map<String, Object>> getCampusDeviceStatsUnderCity(@PathVariable String cityId) {
try {
List<AreaDeviceStatsVO> statsVOList = areaService.getCampusDeviceStatsUnderCity(cityId);

@ -2,6 +2,7 @@ package com.campus.water.mapper;
import com.campus.water.entity.Admin;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import org.springframework.stereotype.Repository;
import java.util.List;
@ -24,8 +25,6 @@ public interface AdminRepository extends JpaRepository<Admin, String> {
// 新增按区域ID查询管理员
List<Admin> findByAreaId(String areaId);
// 新增按角色和区域ID查询用于区域管理员的权限控制
List<Admin> findByRoleAndAreaId(Admin.AdminRole role, String areaId);
// 按角色查询管理员(核心:恢复角色筛选)
List<Admin> findByRole(Admin.AdminRole role);
@ -33,6 +32,18 @@ public interface AdminRepository extends JpaRepository<Admin, String> {
// 按姓名+角色组合查询(可选,增强筛选)
List<Admin> findByAdminNameContainingAndRole(String name, Admin.AdminRole role);
// 新增查询未负责任何片区的区域管理员role=ROLE_AREA_ADMIN 且 areaId=null
List<Admin> findByRoleAndAreaIdIsNull(Admin.AdminRole role);
// 新增1查询指定校区的区域管理员精准查询用于单个校区权限校验
List<Admin> findByRoleAndAreaId(Admin.AdminRole role, String areaId);
// 新增2查询所有校区关联的区域管理员排除市区用于管理员列表筛选
// 备注:此处使用@Query注解关联Area表过滤区域类型为campus的管理员
@Query("SELECT a FROM Admin a WHERE a.role = ?1 AND a.areaId IN " +
"(SELECT ar.areaId FROM Area ar WHERE ar.areaType = com.campus.water.entity.Area.AreaType.campus)")
List<Admin> findAllAreaAdminsForCampus(Admin.AdminRole role);
// 检查唯一约束
boolean existsByAdminId(String adminId);
boolean existsByPhone(String phone);

@ -54,7 +54,6 @@ public interface AreaRepository extends JpaRepository<Area, String> {
* managernull
*
*/
@Query("SELECT a FROM Area a WHERE a.manager IS NULL OR a.manager = ''")
List<Area> findAreasWithoutManager();
List<Area> findByAreaTypeAndManagerIsNullOrManagerEquals(Area.AreaType areaType, String emptyStr);
}

@ -1,6 +1,7 @@
package com.campus.water.service;
import com.campus.water.entity.Admin;
import com.campus.water.entity.Area;
import com.campus.water.mapper.AdminRepository;
import com.campus.water.mapper.AreaRepository;
import lombok.RequiredArgsConstructor;
@ -41,6 +42,14 @@ public class AdminService {
}
}
/**
*
*
*/
public List<Admin> getAvailableAreaAdmins() {
return adminRepository.findByRoleAndAreaIdIsNull(Admin.AdminRole.ROLE_AREA_ADMIN);
}
/**
*
*/
@ -69,16 +78,27 @@ public class AdminService {
admin.setCreatedTime(LocalDateTime.now());
}
// 区域管理员必须关联区域
// 区域管理员ROLE_AREA_ADMIN的专属校验逻辑
if (admin.getRole() == Admin.AdminRole.ROLE_AREA_ADMIN) {
// 1. 若未填写区域IDnull/空字符串),直接放行(支持先创建管理员,后续补填)
if (admin.getAreaId() == null || admin.getAreaId().trim().isEmpty()) {
if (!areaRepository.existsById(admin.getAreaId().trim())) {
throw new RuntimeException("关联的区域不存在:" + admin.getAreaId().trim());
admin.setAreaId(null); // 统一置为null避免空字符串冗余数据
// 无需校验,直接允许保存
} else {
// 2. 若填写了区域ID进行严格校验区域存在 + 类型为校区(禁止市区)
String areaId = admin.getAreaId().trim();
// 校验区域是否存在
Area targetArea = areaRepository.findById(areaId)
.orElseThrow(() -> new RuntimeException("关联的区域不存在:" + areaId));
// 核心校验:仅允许关联校区,禁止关联市区
if (Area.AreaType.zone.equals(targetArea.getAreaType())) {
throw new RuntimeException("区域管理员仅允许关联校区,不能关联市区,请重新选择");
}
// 校验通过保留填写的合法校区ID
admin.setAreaId(areaId);
}
} else {
// 非区域管理员清空区域ID
// 非区域管理员清空区域ID,避免冗余数据
admin.setAreaId(null);
}

@ -141,12 +141,14 @@ public class AreaService {
}
/**
* managernull
* @return
*
*/
@Transactional(readOnly = true) // 只读事务,提升查询性能
public List<Area> getAreasWithoutManager() {
return areaRepository.findAreasWithoutManager();
// 调用仓库新增方法,限定:区域类型=campus负责人=null 或 空字符串
return areaRepository.findByAreaTypeAndManagerIsNullOrManagerEquals(
Area.AreaType.campus, // 仅筛选校区
"" // 匹配空字符串的负责人
);
}
/**
@ -234,6 +236,10 @@ public class AreaService {
private void bindAdminToArea(String adminId, String areaId) {
if (adminId != null && !adminId.trim().isEmpty() && areaId != null) {
Admin admin = adminRepository.findById(adminId).get(); // 已在前序校验,无需再次处理空值
// 新增:校验该管理员是否已绑定其他校区
if (admin.getAreaId() != null) {
throw new RuntimeException("该区域管理员已绑定校区【" + admin.getAreaId() + "】,无法重复绑定");
}
admin.setAreaId(areaId); // 给管理员设置关联的区域IDAdmin实体需有areaId字段
adminRepository.save(admin);
}

Loading…
Cancel
Save