feat: add school product configuration

main
chenyuan 1 month ago
parent 649b6a08af
commit a11fb0c8d0

@ -0,0 +1,13 @@
CREATE TABLE IF NOT EXISTS school_product_config (
school_id VARCHAR(64) NOT NULL PRIMARY KEY,
organization_mode VARCHAR(32) NOT NULL DEFAULT 'ADMIN_CLASS_ENABLED',
student_roster_owner VARCHAR(32) NOT NULL DEFAULT 'SCHOOL_ADMIN',
create_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
update_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
) COMMENT='school product capability configuration';
INSERT INTO school_product_config (school_id, organization_mode, student_roster_owner)
SELECT school_id, 'ADMIN_CLASS_ENABLED', 'SCHOOL_ADMIN' FROM school
ON DUPLICATE KEY UPDATE school_id = VALUES(school_id);
ALTER TABLE teaching_class_student MODIFY admin_class_id VARCHAR(64) NULL;

@ -0,0 +1,22 @@
package com.sztzjy.linkCommerce.entity;
import java.util.Date;
public class SchoolProductConfig {
private String schoolId;
private String organizationMode;
private String studentRosterOwner;
private Date createTime;
private Date updateTime;
public String getSchoolId() { return schoolId; }
public void setSchoolId(String schoolId) { this.schoolId = schoolId == null ? null : schoolId.trim(); }
public String getOrganizationMode() { return organizationMode; }
public void setOrganizationMode(String organizationMode) { this.organizationMode = organizationMode == null ? null : organizationMode.trim(); }
public String getStudentRosterOwner() { return studentRosterOwner; }
public void setStudentRosterOwner(String studentRosterOwner) { this.studentRosterOwner = studentRosterOwner == null ? null : studentRosterOwner.trim(); }
public Date getCreateTime() { return createTime; }
public void setCreateTime(Date createTime) { this.createTime = createTime; }
public Date getUpdateTime() { return updateTime; }
public void setUpdateTime(Date updateTime) { this.updateTime = updateTime; }
}

@ -0,0 +1,13 @@
package com.sztzjy.linkCommerce.mapper;
import com.sztzjy.linkCommerce.entity.SchoolProductConfig;
import org.apache.ibatis.annotations.Mapper;
@Mapper
public interface SchoolProductConfigMapper {
SchoolProductConfig selectByPrimaryKey(String schoolId);
int insert(SchoolProductConfig record);
int updateByPrimaryKey(SchoolProductConfig record);
}

@ -0,0 +1,13 @@
package com.sztzjy.linkCommerce.service;
import com.sztzjy.linkCommerce.entity.SchoolProductConfig;
public interface SchoolProductConfigService {
SchoolProductConfig getRequiredConfig(String schoolId);
boolean requiresAdminClass(String schoolId);
boolean isTeacherRosterManaged(String schoolId);
void requireAdminClassEnabled(String schoolId);
}

@ -0,0 +1,50 @@
package com.sztzjy.linkCommerce.service.impl;
import com.sztzjy.linkCommerce.config.exception.handler.ServiceException;
import com.sztzjy.linkCommerce.entity.SchoolProductConfig;
import com.sztzjy.linkCommerce.mapper.SchoolProductConfigMapper;
import com.sztzjy.linkCommerce.service.SchoolProductConfigService;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.stereotype.Service;
@Service
public class SchoolProductConfigServiceImpl implements SchoolProductConfigService {
public static final String ADMIN_CLASS_ENABLED = "ADMIN_CLASS_ENABLED";
public static final String TEACHING_CLASS_ONLY = "TEACHING_CLASS_ONLY";
public static final String SCHOOL_ADMIN = "SCHOOL_ADMIN";
public static final String TEACHER = "TEACHER";
@Autowired
public SchoolProductConfigMapper schoolProductConfigMapper;
@Override
public SchoolProductConfig getRequiredConfig(String schoolId) {
if (StringUtils.isBlank(schoolId)) {
throw new ServiceException(HttpStatus.BAD_REQUEST, "学校组织配置不存在");
}
SchoolProductConfig config = schoolProductConfigMapper.selectByPrimaryKey(schoolId);
if (config == null) {
throw new ServiceException(HttpStatus.BAD_REQUEST, "学校组织配置不存在");
}
return config;
}
@Override
public boolean requiresAdminClass(String schoolId) {
return ADMIN_CLASS_ENABLED.equals(getRequiredConfig(schoolId).getOrganizationMode());
}
@Override
public boolean isTeacherRosterManaged(String schoolId) {
return TEACHER.equals(getRequiredConfig(schoolId).getStudentRosterOwner());
}
@Override
public void requireAdminClassEnabled(String schoolId) {
if (!requiresAdminClass(schoolId)) {
throw new ServiceException(HttpStatus.BAD_REQUEST, "当前学校未启用行政班");
}
}
}

@ -0,0 +1,22 @@
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.sztzjy.linkCommerce.mapper.SchoolProductConfigMapper">
<resultMap id="BaseResultMap" type="com.sztzjy.linkCommerce.entity.SchoolProductConfig">
<id column="school_id" property="schoolId" jdbcType="VARCHAR"/>
<result column="organization_mode" property="organizationMode" jdbcType="VARCHAR"/>
<result column="student_roster_owner" property="studentRosterOwner" jdbcType="VARCHAR"/>
<result column="create_time" property="createTime" jdbcType="TIMESTAMP"/>
<result column="update_time" property="updateTime" jdbcType="TIMESTAMP"/>
</resultMap>
<sql id="Columns">school_id, organization_mode, student_roster_owner, create_time, update_time</sql>
<select id="selectByPrimaryKey" parameterType="java.lang.String" resultMap="BaseResultMap">
select <include refid="Columns"/> from school_product_config where school_id = #{schoolId,jdbcType=VARCHAR}
</select>
<insert id="insert" parameterType="com.sztzjy.linkCommerce.entity.SchoolProductConfig">
insert into school_product_config (school_id, organization_mode, student_roster_owner, create_time, update_time)
values (#{schoolId,jdbcType=VARCHAR}, #{organizationMode,jdbcType=VARCHAR}, #{studentRosterOwner,jdbcType=VARCHAR}, #{createTime,jdbcType=TIMESTAMP}, #{updateTime,jdbcType=TIMESTAMP})
</insert>
<update id="updateByPrimaryKey" parameterType="com.sztzjy.linkCommerce.entity.SchoolProductConfig">
update school_product_config set organization_mode = #{organizationMode,jdbcType=VARCHAR}, student_roster_owner = #{studentRosterOwner,jdbcType=VARCHAR}, update_time = #{updateTime,jdbcType=TIMESTAMP} where school_id = #{schoolId,jdbcType=VARCHAR}
</update>
</mapper>

@ -0,0 +1,63 @@
package com.sztzjy.linkCommerce.service.impl;
import com.sztzjy.linkCommerce.config.exception.handler.ServiceException;
import com.sztzjy.linkCommerce.entity.SchoolProductConfig;
import com.sztzjy.linkCommerce.mapper.SchoolProductConfigMapper;
import org.junit.jupiter.api.Test;
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.when;
class SchoolProductConfigServiceImplTest {
@Test
void teachingClassOnlySchoolDoesNotRequireAdministrativeClass() {
SchoolProductConfigServiceImpl service = new SchoolProductConfigServiceImpl();
service.schoolProductConfigMapper = mock(SchoolProductConfigMapper.class);
when(service.schoolProductConfigMapper.selectByPrimaryKey("school-zj"))
.thenReturn(config("school-zj", "TEACHING_CLASS_ONLY", "TEACHER"));
assertFalse(service.requiresAdminClass("school-zj"));
assertTrue(service.isTeacherRosterManaged("school-zj"));
}
@Test
void standardSchoolRequiresAdministrativeClass() {
SchoolProductConfigServiceImpl service = new SchoolProductConfigServiceImpl();
service.schoolProductConfigMapper = mock(SchoolProductConfigMapper.class);
when(service.schoolProductConfigMapper.selectByPrimaryKey("school-standard"))
.thenReturn(config("school-standard", "ADMIN_CLASS_ENABLED", "SCHOOL_ADMIN"));
assertTrue(service.requiresAdminClass("school-standard"));
assertFalse(service.isTeacherRosterManaged("school-standard"));
}
@Test
void missingConfigurationIsRejected() {
SchoolProductConfigServiceImpl service = new SchoolProductConfigServiceImpl();
service.schoolProductConfigMapper = mock(SchoolProductConfigMapper.class);
assertThrows(ServiceException.class, () -> service.getRequiredConfig("missing-school"));
}
@Test
void administrativeClassGuardRejectsTeachingClassOnlySchool() {
SchoolProductConfigServiceImpl service = new SchoolProductConfigServiceImpl();
service.schoolProductConfigMapper = mock(SchoolProductConfigMapper.class);
when(service.schoolProductConfigMapper.selectByPrimaryKey("school-zj"))
.thenReturn(config("school-zj", "TEACHING_CLASS_ONLY", "TEACHER"));
assertThrows(ServiceException.class, () -> service.requireAdminClassEnabled("school-zj"));
}
private SchoolProductConfig config(String schoolId, String organizationMode, String rosterOwner) {
SchoolProductConfig config = new SchoolProductConfig();
config.setSchoolId(schoolId);
config.setOrganizationMode(organizationMode);
config.setStudentRosterOwner(rosterOwner);
return config;
}
}
Loading…
Cancel
Save