feat: manage school organization mode

main
chenyuan 1 month ago
parent a11fb0c8d0
commit 1c7ae68ffd

@ -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<SchoolProductConfig> 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()));
}
}

@ -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<SchoolProductConfig> 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<SchoolProductConfig> 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,

@ -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);

@ -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)) {

@ -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")));
}
}

@ -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)

@ -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);

Loading…
Cancel
Save