From 1c7ae68ffd1e8cd1e63275e189439e880f049620 Mon Sep 17 00:00:00 2001 From: chenyuan Date: Thu, 30 Jul 2026 09:46:14 +0800 Subject: [PATCH] feat: manage school organization mode --- .../SchoolProductConfigController.java | 36 +++++++++++++++++++ .../PlatformAdminController.java | 25 +++++++++++++ .../service/SchoolProductConfigService.java | 4 +++ .../impl/SchoolProductConfigServiceImpl.java | 32 +++++++++++++++++ .../SchoolProductConfigControllerTest.java | 17 +++++++++ .../PlatformAdminControllerTest.java | 6 ++++ .../SchoolProductConfigServiceImplTest.java | 14 ++++++++ 7 files changed, 134 insertions(+) create mode 100644 src/main/java/com/sztzjy/linkCommerce/controller/SchoolProductConfigController.java create mode 100644 src/test/java/com/sztzjy/linkCommerce/controller/SchoolProductConfigControllerTest.java diff --git a/src/main/java/com/sztzjy/linkCommerce/controller/SchoolProductConfigController.java b/src/main/java/com/sztzjy/linkCommerce/controller/SchoolProductConfigController.java new file mode 100644 index 0000000..3336745 --- /dev/null +++ b/src/main/java/com/sztzjy/linkCommerce/controller/SchoolProductConfigController.java @@ -0,0 +1,36 @@ +package com.sztzjy.linkCommerce.controller; + +import com.sztzjy.linkCommerce.config.exception.UnAuthorizedException; +import com.sztzjy.linkCommerce.config.security.JwtUser; +import com.sztzjy.linkCommerce.config.security.TokenProvider; +import com.sztzjy.linkCommerce.entity.SchoolProductConfig; +import com.sztzjy.linkCommerce.service.SchoolProductConfigService; +import com.sztzjy.linkCommerce.util.ResultEntity; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import javax.servlet.http.HttpServletRequest; + +@Api(tags = "学校产品配置") +@RestController +@RequestMapping("api/school-product-config") +public class SchoolProductConfigController { + @Autowired + private SchoolProductConfigService schoolProductConfigService; + + @GetMapping("/current") + @ApiOperation("当前用户学校产品配置") + public ResultEntity current(HttpServletRequest request) { + JwtUser user = TokenProvider.getJWTUser(request); + if (user == null || StringUtils.isBlank(user.getSchoolId())) { + throw new UnAuthorizedException("当前用户缺少学校信息"); + } + return new ResultEntity<>(HttpStatus.OK, "查询成功", schoolProductConfigService.getRequiredConfig(user.getSchoolId())); + } +} diff --git a/src/main/java/com/sztzjy/linkCommerce/controller/platformadmin/PlatformAdminController.java b/src/main/java/com/sztzjy/linkCommerce/controller/platformadmin/PlatformAdminController.java index 447ba59..5259883 100644 --- a/src/main/java/com/sztzjy/linkCommerce/controller/platformadmin/PlatformAdminController.java +++ b/src/main/java/com/sztzjy/linkCommerce/controller/platformadmin/PlatformAdminController.java @@ -7,6 +7,7 @@ import com.sztzjy.linkCommerce.config.security.TokenProvider; import com.sztzjy.linkCommerce.entity.*; import com.sztzjy.linkCommerce.mapper.*; import com.sztzjy.linkCommerce.service.PlatformAdminService; +import com.sztzjy.linkCommerce.service.SchoolProductConfigService; import com.sztzjy.linkCommerce.service.UserInfoService; import com.sztzjy.linkCommerce.util.ResultEntity; import io.swagger.annotations.Api; @@ -28,6 +29,8 @@ public class PlatformAdminController { @Autowired private PlatformAdminService platformAdminService; @Autowired + private SchoolProductConfigService schoolProductConfigService; + @Autowired private UserInfoService userInfoService; @Autowired private SchoolMapper schoolMapper; @@ -79,9 +82,31 @@ public class PlatformAdminController { school.setCreateTime(new Date()); } int count = schoolMapper.insertSelective(school); + if (count > 0) { + schoolProductConfigService.createDefaultConfig(school.getSchoolId()); + } return writeResult(count, "新增成功", "新增失败"); } + @GetMapping("/schools/{schoolId}/product-config") + @ApiOperation("平台超管-学校产品配置") + public ResultEntity getSchoolProductConfig(@PathVariable String schoolId, HttpServletRequest request) { + requirePlatformAdmin(request); + requireSchool(schoolId); + return new ResultEntity<>(HttpStatus.OK, "查询成功", schoolProductConfigService.getRequiredConfig(schoolId)); + } + + @PutMapping("/schools/{schoolId}/product-config") + @ApiOperation("平台超管-更新学校产品配置") + public ResultEntity updateSchoolProductConfig(@PathVariable String schoolId, + @RequestBody SchoolProductConfig config, + HttpServletRequest request) { + requirePlatformAdmin(request); + requireSchool(schoolId); + config.setSchoolId(schoolId); + return new ResultEntity<>(HttpStatus.OK, "保存成功", schoolProductConfigService.updateConfig(config)); + } + @PutMapping("/schools/{id}") @ApiOperation("平台超管-编辑学校") public ResultEntity updateSchool(@PathVariable String id, diff --git a/src/main/java/com/sztzjy/linkCommerce/service/SchoolProductConfigService.java b/src/main/java/com/sztzjy/linkCommerce/service/SchoolProductConfigService.java index 90f4fc9..e018a37 100644 --- a/src/main/java/com/sztzjy/linkCommerce/service/SchoolProductConfigService.java +++ b/src/main/java/com/sztzjy/linkCommerce/service/SchoolProductConfigService.java @@ -3,6 +3,10 @@ package com.sztzjy.linkCommerce.service; import com.sztzjy.linkCommerce.entity.SchoolProductConfig; public interface SchoolProductConfigService { + void createDefaultConfig(String schoolId); + + SchoolProductConfig updateConfig(SchoolProductConfig config); + SchoolProductConfig getRequiredConfig(String schoolId); boolean requiresAdminClass(String schoolId); diff --git a/src/main/java/com/sztzjy/linkCommerce/service/impl/SchoolProductConfigServiceImpl.java b/src/main/java/com/sztzjy/linkCommerce/service/impl/SchoolProductConfigServiceImpl.java index 5cbe4c1..e0aa5d7 100644 --- a/src/main/java/com/sztzjy/linkCommerce/service/impl/SchoolProductConfigServiceImpl.java +++ b/src/main/java/com/sztzjy/linkCommerce/service/impl/SchoolProductConfigServiceImpl.java @@ -9,6 +9,8 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpStatus; import org.springframework.stereotype.Service; +import java.util.Date; + @Service public class SchoolProductConfigServiceImpl implements SchoolProductConfigService { public static final String ADMIN_CLASS_ENABLED = "ADMIN_CLASS_ENABLED"; @@ -19,6 +21,36 @@ public class SchoolProductConfigServiceImpl implements SchoolProductConfigServic @Autowired public SchoolProductConfigMapper schoolProductConfigMapper; + @Override + public void createDefaultConfig(String schoolId) { + if (StringUtils.isBlank(schoolId)) { + throw new ServiceException(HttpStatus.BAD_REQUEST, "学校ID不能为空"); + } + SchoolProductConfig config = new SchoolProductConfig(); + config.setSchoolId(schoolId); + config.setOrganizationMode(ADMIN_CLASS_ENABLED); + config.setStudentRosterOwner(SCHOOL_ADMIN); + config.setCreateTime(new Date()); + config.setUpdateTime(new Date()); + schoolProductConfigMapper.insert(config); + } + + @Override + public SchoolProductConfig updateConfig(SchoolProductConfig config) { + if (config == null || StringUtils.isBlank(config.getSchoolId())) { + throw new ServiceException(HttpStatus.BAD_REQUEST, "学校组织配置不存在"); + } + boolean standard = ADMIN_CLASS_ENABLED.equals(config.getOrganizationMode()) && SCHOOL_ADMIN.equals(config.getStudentRosterOwner()); + boolean teacherManaged = TEACHING_CLASS_ONLY.equals(config.getOrganizationMode()) && TEACHER.equals(config.getStudentRosterOwner()); + if (!standard && !teacherManaged) { + throw new ServiceException(HttpStatus.BAD_REQUEST, "学校组织模式与名单维护方不匹配"); + } + getRequiredConfig(config.getSchoolId()); + config.setUpdateTime(new Date()); + schoolProductConfigMapper.updateByPrimaryKey(config); + return getRequiredConfig(config.getSchoolId()); + } + @Override public SchoolProductConfig getRequiredConfig(String schoolId) { if (StringUtils.isBlank(schoolId)) { diff --git a/src/test/java/com/sztzjy/linkCommerce/controller/SchoolProductConfigControllerTest.java b/src/test/java/com/sztzjy/linkCommerce/controller/SchoolProductConfigControllerTest.java new file mode 100644 index 0000000..51a2696 --- /dev/null +++ b/src/test/java/com/sztzjy/linkCommerce/controller/SchoolProductConfigControllerTest.java @@ -0,0 +1,17 @@ +package com.sztzjy.linkCommerce.controller; + +import org.junit.jupiter.api.Test; +import org.springframework.web.bind.annotation.GetMapping; + +import java.util.Arrays; + +import static org.junit.jupiter.api.Assertions.assertTrue; + +class SchoolProductConfigControllerTest { + @Test + void exposesCurrentSchoolConfigurationEndpoint() { + assertTrue(Arrays.stream(SchoolProductConfigController.class.getDeclaredMethods()) + .anyMatch(method -> method.isAnnotationPresent(GetMapping.class) + && Arrays.asList(method.getAnnotation(GetMapping.class).value()).contains("/current"))); + } +} diff --git a/src/test/java/com/sztzjy/linkCommerce/controller/platformadmin/PlatformAdminControllerTest.java b/src/test/java/com/sztzjy/linkCommerce/controller/platformadmin/PlatformAdminControllerTest.java index b9ca224..b6e2a47 100644 --- a/src/test/java/com/sztzjy/linkCommerce/controller/platformadmin/PlatformAdminControllerTest.java +++ b/src/test/java/com/sztzjy/linkCommerce/controller/platformadmin/PlatformAdminControllerTest.java @@ -21,6 +21,12 @@ class PlatformAdminControllerTest { assertTrue(hasDelete("/teachers/{id}"), "Platform admin must expose teacher delete endpoint"); } + @Test + void exposesSchoolProductConfigurationEndpoints() { + assertTrue(hasGet("/schools/{schoolId}/product-config")); + assertTrue(hasPut("/schools/{schoolId}/product-config")); + } + private boolean hasGet(String path) { return Arrays.stream(PlatformAdminController.class.getDeclaredMethods()) .anyMatch(method -> method.isAnnotationPresent(GetMapping.class) diff --git a/src/test/java/com/sztzjy/linkCommerce/service/impl/SchoolProductConfigServiceImplTest.java b/src/test/java/com/sztzjy/linkCommerce/service/impl/SchoolProductConfigServiceImplTest.java index 99697c4..6cdd661 100644 --- a/src/test/java/com/sztzjy/linkCommerce/service/impl/SchoolProductConfigServiceImplTest.java +++ b/src/test/java/com/sztzjy/linkCommerce/service/impl/SchoolProductConfigServiceImplTest.java @@ -9,6 +9,7 @@ import static org.junit.jupiter.api.Assertions.assertFalse; import static org.junit.jupiter.api.Assertions.assertThrows; import static org.junit.jupiter.api.Assertions.assertTrue; import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; class SchoolProductConfigServiceImplTest { @@ -53,6 +54,19 @@ class SchoolProductConfigServiceImplTest { assertThrows(ServiceException.class, () -> service.requireAdminClassEnabled("school-zj")); } + @Test + void createDefaultConfigUsesStandardSchoolSettings() { + SchoolProductConfigServiceImpl service = new SchoolProductConfigServiceImpl(); + service.schoolProductConfigMapper = mock(SchoolProductConfigMapper.class); + + service.createDefaultConfig("school-new"); + + verify(service.schoolProductConfigMapper).insert(org.mockito.ArgumentMatchers.argThat(config -> + "school-new".equals(config.getSchoolId()) + && "ADMIN_CLASS_ENABLED".equals(config.getOrganizationMode()) + && "SCHOOL_ADMIN".equals(config.getStudentRosterOwner()))); + } + private SchoolProductConfig config(String schoolId, String organizationMode, String rosterOwner) { SchoolProductConfig config = new SchoolProductConfig(); config.setSchoolId(schoolId);