diff --git a/.mvn/wrapper/maven-wrapper.properties b/.mvn/wrapper/maven-wrapper.properties
deleted file mode 100644
index d58dfb7..0000000
--- a/.mvn/wrapper/maven-wrapper.properties
+++ /dev/null
@@ -1,19 +0,0 @@
-# Licensed to the Apache Software Foundation (ASF) under one
-# or more contributor license agreements. See the NOTICE file
-# distributed with this work for additional information
-# regarding copyright ownership. The ASF licenses this file
-# to you under the Apache License, Version 2.0 (the
-# "License"); you may not use this file except in compliance
-# with the License. You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing,
-# software distributed under the License is distributed on an
-# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-# KIND, either express or implied. See the License for the
-# specific language governing permissions and limitations
-# under the License.
-wrapperVersion=3.3.2
-distributionType=only-script
-distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.9.9/apache-maven-3.9.9-bin.zip
diff --git a/pom.xml b/pom.xml
index c8d1b31..e7cb5ba 100644
--- a/pom.xml
+++ b/pom.xml
@@ -5,18 +5,41 @@
org.springframework.boot
spring-boot-starter-parent
- 2.2.4.RELEASE
+
+ 2.7.18
- com.bestsch.previewUnit
- previewunit
- 0.0.1-SNAPSHOT
- previewunit
+
+ BschClass
+ 0.1
+ BschClass
Demo project for Spring Boot
1.8
9.0.63
+
+
+
+
+
+ com.yunhai.platform
+ yh-platform-dependencies
+ 1.0.0-SNAPSHOT
+ pom
+ import
+
+
+
+ com.alibaba.cloud
+ spring-cloud-alibaba-dependencies
+ 2021.0.5.0
+ pom
+ import
+
+
+
+
org.springframework.boot
@@ -30,21 +53,28 @@
org.projectlombok
lombok
+ 1.18.36
true
+
+
+
+
+
mysql
mysql-connector-java
+ 8.0.33
runtime
-
- com.bestsch
- bsch-spring-boot-starter
- 1.2.5-SNAPSHOT
-
+
+
+
+
+
cn.hutool
@@ -108,24 +138,10 @@
20210307
-
-
- com.baidu.aip
- java-sdk
- 4.16.19
-
-
-
-
- ws.schild
- jave-core
- 2.4.6
-
-
com.squareup.okhttp3
okhttp
- 4.10.0
+ 3.14.9
@@ -136,7 +152,49 @@
4.1.0
+
+ org.springframework.boot
+ spring-boot-starter-test
+ test
+
+
+ org.springframework.boot
+ spring-boot-starter-aop
+
+
+
+
+ cn.afterturn
+ easypoi-spring-boot-starter
+ 4.2.0
+
+
+
+
+ com.yunhai.platform
+ yh-auth-spring-boot-starter
+
+
+ com.yunhai.platform
+ yh-app-auth-spring-boot-starter
+
+
+ com.yunhai.platform
+ yh-openapi-spring-boot-starter
+
+
+ com.yunhai.platform
+ yh-api-std
+
+
+
+
+ org.jasig.cas.client
+ cas-client-core
+ 3.5.1
+
@@ -149,4 +207,20 @@
+
+
+ nexus-public
+ bsch/nexus public
+ http://nexus.yunhaixingtong.com/repository/maven-public/
+ true
+ true
+
+
+
+
diff --git a/sqlscript/dbschoolclass.sql b/sqlscript/dbschoolclass.sql
new file mode 100644
index 0000000..a81a6fd
--- /dev/null
+++ b/sqlscript/dbschoolclass.sql
@@ -0,0 +1,500 @@
+/*
+ Navicat Premium Data Transfer
+
+ Source Server : 本地
+ Source Server Type : MySQL
+ Source Server Version : 80044
+ Source Host : localhost:3306
+ Source Schema : dbschoolclass
+
+ Target Server Type : MySQL
+ Target Server Version : 80044
+ File Encoding : 65001
+
+ Date: 17/06/2026 10:30:52
+*/
+
+SET NAMES utf8mb4;
+SET FOREIGN_KEY_CHECKS = 0;
+
+-- ----------------------------
+-- Table structure for base_dic_grade
+-- ----------------------------
+DROP TABLE IF EXISTS `base_dic_grade`;
+CREATE TABLE `base_dic_grade` (
+ `id` int(0) NOT NULL AUTO_INCREMENT COMMENT '主键',
+ `code` int(0) NULL DEFAULT NULL COMMENT '年级编码',
+ `name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '年级名称',
+ PRIMARY KEY (`id`) USING BTREE
+) ENGINE = InnoDB AUTO_INCREMENT = 16 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;
+
+-- ----------------------------
+-- Records of base_dic_grade
+-- ----------------------------
+INSERT INTO `base_dic_grade` VALUES (1, 1, '一年级');
+INSERT INTO `base_dic_grade` VALUES (2, 2, '二年级');
+INSERT INTO `base_dic_grade` VALUES (3, 3, '三年级');
+INSERT INTO `base_dic_grade` VALUES (4, 4, '四年级');
+INSERT INTO `base_dic_grade` VALUES (5, 5, '五年级');
+INSERT INTO `base_dic_grade` VALUES (6, 6, '六年级');
+INSERT INTO `base_dic_grade` VALUES (7, 7, '初一');
+INSERT INTO `base_dic_grade` VALUES (8, 8, '初二');
+INSERT INTO `base_dic_grade` VALUES (9, 9, '初三');
+INSERT INTO `base_dic_grade` VALUES (10, 10, '高一');
+INSERT INTO `base_dic_grade` VALUES (11, 11, '高二');
+INSERT INTO `base_dic_grade` VALUES (12, 12, '高三');
+INSERT INTO `base_dic_grade` VALUES (13, -4, '幼托');
+INSERT INTO `base_dic_grade` VALUES (14, -3, '幼小');
+INSERT INTO `base_dic_grade` VALUES (15, -2, '幼中');
+INSERT INTO `base_dic_grade` VALUES (16, -1, '幼大');
+
+-- ----------------------------
+-- Table structure for base_dic_subject
+-- ----------------------------
+DROP TABLE IF EXISTS `base_dic_subject`;
+CREATE TABLE `base_dic_subject` (
+ `id` int(0) NOT NULL AUTO_INCREMENT COMMENT '主键',
+ `code` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '编码',
+ `name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '名称',
+ `sort` int(0) NULL DEFAULT NULL COMMENT '序号',
+ PRIMARY KEY (`id`) USING BTREE
+) ENGINE = InnoDB AUTO_INCREMENT = 18 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;
+
+-- ----------------------------
+-- Records of base_dic_subject
+-- ----------------------------
+INSERT INTO `base_dic_subject` VALUES (1, 'SUB01', '语文', 1);
+INSERT INTO `base_dic_subject` VALUES (2, 'SUB02', '数学', 2);
+INSERT INTO `base_dic_subject` VALUES (3, 'SUB03', '英语', 3);
+INSERT INTO `base_dic_subject` VALUES (4, 'SUB04', '物理', 4);
+INSERT INTO `base_dic_subject` VALUES (5, 'SUB05', '化学', 5);
+INSERT INTO `base_dic_subject` VALUES (6, 'SUB06', '生物', 6);
+INSERT INTO `base_dic_subject` VALUES (7, 'SUB07', '历史', 7);
+INSERT INTO `base_dic_subject` VALUES (8, 'SUB08', '地理', 8);
+INSERT INTO `base_dic_subject` VALUES (9, 'SUB09', '政治', 9);
+INSERT INTO `base_dic_subject` VALUES (10, 'SUB10', '艺术', 10);
+INSERT INTO `base_dic_subject` VALUES (11, 'SUB11', '体育', 11);
+INSERT INTO `base_dic_subject` VALUES (12, 'SUB12', '心理', 12);
+INSERT INTO `base_dic_subject` VALUES (13, 'SUB13', '信息', 13);
+INSERT INTO `base_dic_subject` VALUES (14, 'SUB14', '劳技', 14);
+INSERT INTO `base_dic_subject` VALUES (15, 'SUB15', '跨学科', 15);
+INSERT INTO `base_dic_subject` VALUES (16, 'SUB16', '美术', 16);
+INSERT INTO `base_dic_subject` VALUES (17, 'SUB17', '音乐', 17);
+
+-- ----------------------------
+-- Table structure for base_sch_system
+-- ----------------------------
+DROP TABLE IF EXISTS `base_sch_system`;
+CREATE TABLE `base_sch_system` (
+ `id` int(0) NOT NULL AUTO_INCREMENT COMMENT '主键',
+ `name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '名称 ',
+ `academic_stage` int(0) NULL DEFAULT NULL COMMENT '学段(0学前 1小学 2初中 3高中 4高等)',
+ `start_grade_code` int(0) NULL DEFAULT NULL COMMENT '开班年级编码',
+ `end_grade_code` int(0) NULL DEFAULT NULL COMMENT '毕业年级编码',
+ `graduation_leng` int(0) NULL DEFAULT NULL COMMENT '毕业年长度',
+ `type` int(0) NULL DEFAULT NULL COMMENT '类型(1学前教育 2职业教育)',
+ PRIMARY KEY (`id`) USING BTREE
+) ENGINE = InnoDB AUTO_INCREMENT = 12 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;
+
+-- ----------------------------
+-- Records of base_sch_system
+-- ----------------------------
+INSERT INTO `base_sch_system` VALUES (1, '学前教育', 0, -3, -1, 3, 1);
+INSERT INTO `base_sch_system` VALUES (2, '学前4年', 0, -4, -1, 4, 1);
+INSERT INTO `base_sch_system` VALUES (3, '小学六年', 1, 1, 6, 6, 1);
+INSERT INTO `base_sch_system` VALUES (4, '小学五年', 1, 1, 5, 5, 1);
+INSERT INTO `base_sch_system` VALUES (5, '初中三年', 2, 7, 9, 3, 1);
+INSERT INTO `base_sch_system` VALUES (6, '初中四年', 2, 6, 9, 4, 1);
+INSERT INTO `base_sch_system` VALUES (7, '九年一贯制', 2, 1, 9, 9, 1);
+INSERT INTO `base_sch_system` VALUES (8, '高中三年', 3, 10, 12, 3, 1);
+INSERT INTO `base_sch_system` VALUES (9, '初高中七年制', 3, 6, 12, 7, 1);
+INSERT INTO `base_sch_system` VALUES (10, '职高', 3, 0, 0, 3, 2);
+INSERT INTO `base_sch_system` VALUES (11, '\r\n专科三年制', 4, 0, 0, 3, 2);
+INSERT INTO `base_sch_system` VALUES (12, '\r\n专科五年制', 4, 0, 0, 5, 2);
+
+-- ----------------------------
+-- Table structure for base_sch_system_grade
+-- ----------------------------
+DROP TABLE IF EXISTS `base_sch_system_grade`;
+CREATE TABLE `base_sch_system_grade` (
+ `id` int(0) NOT NULL AUTO_INCREMENT COMMENT '主键',
+ `grade_id` int(0) NULL DEFAULT NULL COMMENT '年级id',
+ `grade_nickname` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '年级别名',
+ `sch_system_id` int(0) NULL DEFAULT NULL COMMENT '学制id',
+ PRIMARY KEY (`id`) USING BTREE
+) ENGINE = InnoDB AUTO_INCREMENT = 44 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;
+
+-- ----------------------------
+-- Records of base_sch_system_grade
+-- ----------------------------
+INSERT INTO `base_sch_system_grade` VALUES (1, -3, '幼小', 1);
+INSERT INTO `base_sch_system_grade` VALUES (2, -2, '幼中', 1);
+INSERT INTO `base_sch_system_grade` VALUES (3, -1, '幼大', 1);
+INSERT INTO `base_sch_system_grade` VALUES (4, -4, '幼托', 2);
+INSERT INTO `base_sch_system_grade` VALUES (5, -3, '幼小', 2);
+INSERT INTO `base_sch_system_grade` VALUES (6, -2, '幼中', 2);
+INSERT INTO `base_sch_system_grade` VALUES (7, -1, '幼大', 2);
+INSERT INTO `base_sch_system_grade` VALUES (8, 1, '小一', 3);
+INSERT INTO `base_sch_system_grade` VALUES (9, 2, '小二', 3);
+INSERT INTO `base_sch_system_grade` VALUES (10, 3, '小三', 3);
+INSERT INTO `base_sch_system_grade` VALUES (11, 4, '小四', 3);
+INSERT INTO `base_sch_system_grade` VALUES (12, 5, '小五', 3);
+INSERT INTO `base_sch_system_grade` VALUES (13, 6, '小六', 3);
+INSERT INTO `base_sch_system_grade` VALUES (14, 1, '小一', 4);
+INSERT INTO `base_sch_system_grade` VALUES (15, 2, '小二', 4);
+INSERT INTO `base_sch_system_grade` VALUES (16, 3, '小三', 4);
+INSERT INTO `base_sch_system_grade` VALUES (17, 4, '小四', 4);
+INSERT INTO `base_sch_system_grade` VALUES (18, 5, '小五', 4);
+INSERT INTO `base_sch_system_grade` VALUES (19, 7, '初一', 5);
+INSERT INTO `base_sch_system_grade` VALUES (20, 8, '初二', 5);
+INSERT INTO `base_sch_system_grade` VALUES (21, 9, '初三', 5);
+INSERT INTO `base_sch_system_grade` VALUES (22, 6, '预备', 6);
+INSERT INTO `base_sch_system_grade` VALUES (23, 7, '初一', 6);
+INSERT INTO `base_sch_system_grade` VALUES (24, 8, '初二', 6);
+INSERT INTO `base_sch_system_grade` VALUES (25, 9, '初三', 6);
+INSERT INTO `base_sch_system_grade` VALUES (26, 1, '小一', 7);
+INSERT INTO `base_sch_system_grade` VALUES (27, 2, '小二', 7);
+INSERT INTO `base_sch_system_grade` VALUES (28, 3, '小三', 7);
+INSERT INTO `base_sch_system_grade` VALUES (29, 4, '小四', 7);
+INSERT INTO `base_sch_system_grade` VALUES (30, 5, '小五', 7);
+INSERT INTO `base_sch_system_grade` VALUES (31, 6, '小六', 7);
+INSERT INTO `base_sch_system_grade` VALUES (32, 7, '初一', 7);
+INSERT INTO `base_sch_system_grade` VALUES (33, 8, '初二', 7);
+INSERT INTO `base_sch_system_grade` VALUES (34, 9, '初三', 7);
+INSERT INTO `base_sch_system_grade` VALUES (35, 10, '高一', 8);
+INSERT INTO `base_sch_system_grade` VALUES (36, 11, '高二', 8);
+INSERT INTO `base_sch_system_grade` VALUES (37, 12, '高三', 8);
+INSERT INTO `base_sch_system_grade` VALUES (38, 6, '预备', 9);
+INSERT INTO `base_sch_system_grade` VALUES (39, 7, '初一', 9);
+INSERT INTO `base_sch_system_grade` VALUES (40, 8, '初二', 9);
+INSERT INTO `base_sch_system_grade` VALUES (41, 9, '初三', 9);
+INSERT INTO `base_sch_system_grade` VALUES (42, 10, '高一', 9);
+INSERT INTO `base_sch_system_grade` VALUES (43, 11, '高二', 9);
+INSERT INTO `base_sch_system_grade` VALUES (44, 12, '高三', 9);
+
+-- ----------------------------
+-- Table structure for base_year_term
+-- ----------------------------
+DROP TABLE IF EXISTS `base_year_term`;
+CREATE TABLE `base_year_term` (
+ `id` int(0) NOT NULL AUTO_INCREMENT COMMENT '主键',
+ `year` int(0) NULL DEFAULT NULL COMMENT '学年',
+ `year_start_date` date NULL DEFAULT NULL COMMENT '学年开始日期',
+ `year_end_date` date NULL DEFAULT NULL COMMENT '学年结束日期',
+ `first_term_start_date` date NULL DEFAULT NULL COMMENT '第一学期开始日期',
+ `first_term_end_date` date NULL DEFAULT NULL COMMENT '第一学期结束日期',
+ `second_term_start_date` date NOT NULL COMMENT '第二学期开始日期',
+ `second_term_end_date` date NULL DEFAULT NULL COMMENT '第二学期结束日期',
+ `upgrade_date` date NULL DEFAULT NULL COMMENT '毕业时间',
+ `create_date` datetime(0) NULL DEFAULT NULL COMMENT '创建时间',
+ `update_date` datetime(0) NULL DEFAULT NULL COMMENT '修改日期',
+ `create_user_id` int(0) NULL DEFAULT NULL COMMENT '创建用户',
+ `update_user_id` int(0) NULL DEFAULT NULL COMMENT '修改用户',
+ PRIMARY KEY (`id`, `second_term_start_date`) USING BTREE
+) ENGINE = InnoDB AUTO_INCREMENT = 7 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;
+
+-- ----------------------------
+-- Records of base_year_term
+-- ----------------------------
+INSERT INTO `base_year_term` VALUES (1, 2025, '2025-09-01', '2026-07-10', '2025-09-01', '2026-01-15', '2026-02-20', '2026-07-05', '2026-07-15', '2026-06-15 10:11:06', NULL, 100000, NULL);
+INSERT INTO `base_year_term` VALUES (2, 2024, '2024-09-01', '2025-07-10', '2024-09-01', '2025-01-15', '2025-02-20', '2025-07-05', '2025-07-15', '2026-06-15 10:19:53', NULL, 100000, NULL);
+INSERT INTO `base_year_term` VALUES (3, 2023, '2023-09-01', '2024-07-10', '2023-09-01', '2024-01-15', '2024-02-20', '2024-07-05', '2024-07-15', '2026-06-15 10:20:58', NULL, 100000, NULL);
+INSERT INTO `base_year_term` VALUES (4, 2022, '2022-09-01', '2023-07-10', '2022-09-01', '2023-01-15', '2023-02-20', '2023-07-05', '2023-07-15', '2026-06-15 10:21:51', NULL, 100000, NULL);
+INSERT INTO `base_year_term` VALUES (5, 2021, '2021-09-01', '2022-07-10', '2021-09-01', '2022-01-15', '2022-02-20', '2022-07-05', '2022-07-15', '2026-06-15 10:22:00', NULL, 100000, NULL);
+INSERT INTO `base_year_term` VALUES (6, 2020, '2020-09-01', '2021-07-10', '2020-09-01', '2021-01-15', '2021-02-20', '2021-07-05', '2021-07-15', '2026-06-15 10:23:22', NULL, 100000, NULL);
+
+-- ----------------------------
+-- Table structure for sch_bin_sch_system
+-- ----------------------------
+DROP TABLE IF EXISTS `sch_bin_sch_system`;
+CREATE TABLE `sch_bin_sch_system` (
+ `id` int(0) NOT NULL AUTO_INCREMENT,
+ `sch_system_id` int(0) NOT NULL COMMENT '学制id',
+ `sch_id` int(0) NULL DEFAULT NULL COMMENT '学校id',
+ `create_date` datetime(0) NULL DEFAULT NULL COMMENT '创建时间',
+ `create_user_id` int(0) NULL DEFAULT NULL COMMENT '创建用户',
+ `update_date` datetime(0) NULL DEFAULT NULL COMMENT '修改时间',
+ `update_user_id` int(0) NULL DEFAULT NULL COMMENT '修改日期',
+ PRIMARY KEY (`id`) USING BTREE
+) ENGINE = InnoDB AUTO_INCREMENT = 7 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;
+
+-- ----------------------------
+-- Records of sch_bin_sch_system
+-- ----------------------------
+INSERT INTO `sch_bin_sch_system` VALUES (5, 6, 3260, '2026-06-11 15:21:34', 100000, '2026-06-11 15:21:34', 100000);
+INSERT INTO `sch_bin_sch_system` VALUES (6, 8, 3260, '2026-06-11 15:21:34', 100000, '2026-06-11 15:21:34', 100000);
+
+-- ----------------------------
+-- Table structure for sch_class
+-- ----------------------------
+DROP TABLE IF EXISTS `sch_class`;
+CREATE TABLE `sch_class` (
+ `id` int(0) NOT NULL AUTO_INCREMENT COMMENT '主键',
+ `code` int(10) UNSIGNED ZEROFILL NULL DEFAULT NULL COMMENT '编码',
+ `grade_id` int(0) NULL DEFAULT NULL COMMENT '年级id',
+ `name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '名称',
+ `cname` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '别称',
+ `group_class_id` int(0) UNSIGNED NOT NULL COMMENT '班级组id',
+ `group_grade_id` int(0) NOT NULL COMMENT '年级组id',
+ `first_teacher_id` int(0) NULL DEFAULT NULL COMMENT '班主任',
+ `second_teacher_id` int(0) NULL DEFAULT NULL COMMENT '副班主任',
+ `campus_id` int(0) NULL DEFAULT NULL COMMENT '校区',
+ `division_id` int(0) NULL DEFAULT NULL COMMENT '系部',
+ `majors_id` int(0) NULL DEFAULT NULL COMMENT '专业',
+ `graduate` bit(1) NULL DEFAULT NULL COMMENT '毕业',
+ `sch_id` int(0) NULL DEFAULT NULL COMMENT '学校id',
+ `create_date` datetime(0) NULL DEFAULT NULL COMMENT '创建日期',
+ `update_date` datetime(0) NULL DEFAULT NULL COMMENT '修改日期',
+ `create_user_id` int(0) NULL DEFAULT NULL COMMENT '创建用户',
+ `update_user_id` int(0) NULL DEFAULT NULL COMMENT '修改用户',
+ PRIMARY KEY (`id`) USING BTREE
+) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;
+
+-- ----------------------------
+-- Table structure for sch_class_teach
+-- ----------------------------
+DROP TABLE IF EXISTS `sch_class_teach`;
+CREATE TABLE `sch_class_teach` (
+ `id` int(0) NOT NULL AUTO_INCREMENT COMMENT '主键',
+ `grade_id` int(0) NULL DEFAULT NULL COMMENT '年级id',
+ `class_id` int(0) NULL DEFAULT NULL COMMENT '班级id',
+ `sub_id` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '学科id',
+ `tea_id` int(0) NULL DEFAULT NULL COMMENT '教师id',
+ `sch_id` int(0) NULL DEFAULT NULL COMMENT '学校id',
+ `create_date` datetime(0) NULL DEFAULT NULL COMMENT '创建日期',
+ `update_date` datetime(0) NULL DEFAULT NULL COMMENT '修改日期',
+ `create_user_id` int(0) NULL DEFAULT NULL COMMENT '创建用户',
+ `update_user_id` int(0) NULL DEFAULT NULL COMMENT '修改用户',
+ PRIMARY KEY (`id`) USING BTREE
+) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;
+
+-- ----------------------------
+-- Table structure for sch_dic_campus
+-- ----------------------------
+DROP TABLE IF EXISTS `sch_dic_campus`;
+CREATE TABLE `sch_dic_campus` (
+ `id` int(0) NOT NULL AUTO_INCREMENT COMMENT '主键',
+ `name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '校区',
+ `sch_id` int(0) NULL DEFAULT NULL COMMENT '学校id',
+ `sort` int(0) NULL DEFAULT NULL COMMENT '序号',
+ `create_date` datetime(0) NULL DEFAULT NULL COMMENT '创建日期',
+ `create_user_id` int(0) NULL DEFAULT NULL COMMENT '创建用户',
+ `update_date` datetime(0) NULL DEFAULT NULL COMMENT '编辑日期',
+ `update_user_id` int(0) NULL DEFAULT NULL COMMENT '编辑用户',
+ PRIMARY KEY (`id`) USING BTREE
+) ENGINE = InnoDB AUTO_INCREMENT = 6 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;
+
+-- ----------------------------
+-- Records of sch_dic_campus
+-- ----------------------------
+INSERT INTO `sch_dic_campus` VALUES (1, '新渔区', 3260, 2, '2026-06-16 10:06:49', 209169, '2026-06-16 10:10:47', 209169);
+INSERT INTO `sch_dic_campus` VALUES (2, '名宿区', 3260, 1, '2026-06-16 10:08:08', 209169, '2026-06-16 10:10:47', 209169);
+
+-- ----------------------------
+-- Table structure for sch_dic_course
+-- ----------------------------
+DROP TABLE IF EXISTS `sch_dic_course`;
+CREATE TABLE `sch_dic_course` (
+ `id` int(0) NOT NULL AUTO_INCREMENT COMMENT '主键',
+ `code` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '编码',
+ `name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '课程名称',
+ `nickname` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '别名',
+ `type` int(0) NULL DEFAULT NULL COMMENT '类型(1基础课程 2选修课程 3专业课程)',
+ `sch_id` int(0) NULL DEFAULT NULL COMMENT '学校id',
+ `create_date` datetime(0) NULL DEFAULT NULL COMMENT '创建时间',
+ `update_date` datetime(0) NULL DEFAULT NULL COMMENT '修改时间',
+ `create_user_id` int(0) NULL DEFAULT NULL COMMENT '创建用户',
+ `update_user_id` int(0) NULL DEFAULT NULL COMMENT '修改用户',
+ PRIMARY KEY (`id`) USING BTREE
+) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;
+
+-- ----------------------------
+-- Records of sch_dic_course
+-- ----------------------------
+INSERT INTO `sch_dic_course` VALUES (1, 'MATH101', '高等数学', '高数', 3, 3260, '2026-06-16 22:11:35', '2026-06-17 00:40:54', 209169, 209169);
+INSERT INTO `sch_dic_course` VALUES (2, 'MATH102', '就业指导', NULL, 1, 3260, '2026-06-16 22:29:21', '2026-06-17 00:39:55', 209169, 209169);
+INSERT INTO `sch_dic_course` VALUES (3, 'MATH103', '中餐冷菜制作', NULL, 2, 3260, '2026-06-16 22:30:02', '2026-06-17 00:39:15', 209169, 209169);
+INSERT INTO `sch_dic_course` VALUES (4, NULL, '计算机应用基础', NULL, 1, 3260, '2026-06-16 22:30:17', '2026-06-16 22:30:17', 209169, 209169);
+
+-- ----------------------------
+-- Table structure for sch_dic_course_division
+-- ----------------------------
+DROP TABLE IF EXISTS `sch_dic_course_division`;
+CREATE TABLE `sch_dic_course_division` (
+ `id` int(0) NOT NULL AUTO_INCREMENT,
+ `course_id` int(0) NULL DEFAULT NULL,
+ `division_id` int(0) NULL DEFAULT NULL,
+ `sch_id` int(0) NULL DEFAULT NULL,
+ PRIMARY KEY (`id`) USING BTREE
+) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;
+
+-- ----------------------------
+-- Records of sch_dic_course_division
+-- ----------------------------
+INSERT INTO `sch_dic_course_division` VALUES (3, 3, 5, 3260);
+INSERT INTO `sch_dic_course_division` VALUES (4, 3, 6, 3260);
+INSERT INTO `sch_dic_course_division` VALUES (5, 2, 3, 3260);
+INSERT INTO `sch_dic_course_division` VALUES (6, 2, 4, 3260);
+INSERT INTO `sch_dic_course_division` VALUES (9, 1, 1, 3260);
+INSERT INTO `sch_dic_course_division` VALUES (10, 1, 2, 3260);
+
+-- ----------------------------
+-- Table structure for sch_dic_course_majors
+-- ----------------------------
+DROP TABLE IF EXISTS `sch_dic_course_majors`;
+CREATE TABLE `sch_dic_course_majors` (
+ `id` int(0) NOT NULL AUTO_INCREMENT,
+ `course_id` int(0) NULL DEFAULT NULL,
+ `majors_id` int(0) NULL DEFAULT NULL,
+ `sch_id` int(0) NULL DEFAULT NULL,
+ PRIMARY KEY (`id`) USING BTREE
+) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;
+
+-- ----------------------------
+-- Records of sch_dic_course_majors
+-- ----------------------------
+INSERT INTO `sch_dic_course_majors` VALUES (2, 3, 4, 3260);
+INSERT INTO `sch_dic_course_majors` VALUES (3, 2, 2, 3260);
+INSERT INTO `sch_dic_course_majors` VALUES (6, 1, 1, 3260);
+INSERT INTO `sch_dic_course_majors` VALUES (7, 1, 5, 3260);
+
+-- ----------------------------
+-- Table structure for sch_dic_division
+-- ----------------------------
+DROP TABLE IF EXISTS `sch_dic_division`;
+CREATE TABLE `sch_dic_division` (
+ `id` int(0) NOT NULL AUTO_INCREMENT COMMENT '主键',
+ `name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '系部',
+ `sch_id` int(0) NULL DEFAULT NULL COMMENT '学校id',
+ `sort` int(0) NULL DEFAULT NULL COMMENT '序号',
+ `create_date` datetime(0) NULL DEFAULT NULL COMMENT '创建日期',
+ `create_user_id` int(0) NULL DEFAULT NULL COMMENT '修改日期',
+ `update_date` datetime(0) NULL DEFAULT NULL COMMENT '创建用户',
+ `update_user_id` int(0) NULL DEFAULT NULL COMMENT '修改用户',
+ PRIMARY KEY (`id`) USING BTREE
+) ENGINE = InnoDB AUTO_INCREMENT = 7 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;
+
+-- ----------------------------
+-- Records of sch_dic_division
+-- ----------------------------
+INSERT INTO `sch_dic_division` VALUES (1, '中文系', 3260, 6, '2026-06-16 10:33:45', 209169, '2026-06-16 10:41:12', 209169);
+INSERT INTO `sch_dic_division` VALUES (2, '历史系', 3260, 5, '2026-06-16 10:34:02', 209169, '2026-06-16 10:41:12', 209169);
+INSERT INTO `sch_dic_division` VALUES (3, '外国语学院', 3260, 4, '2026-06-16 10:34:23', 209169, '2026-06-16 10:41:12', 209169);
+INSERT INTO `sch_dic_division` VALUES (4, '新闻传播学院', 3260, 3, '2026-06-16 10:34:32', 209169, '2026-06-16 10:41:12', 209169);
+INSERT INTO `sch_dic_division` VALUES (5, '哲学系', 3260, 2, '2026-06-16 10:34:41', 209169, '2026-06-16 10:41:12', 209169);
+INSERT INTO `sch_dic_division` VALUES (6, '经济学院', 3260, 1, '2026-06-16 10:34:49', 209169, '2026-06-16 10:41:12', 209169);
+
+-- ----------------------------
+-- Table structure for sch_dic_majors
+-- ----------------------------
+DROP TABLE IF EXISTS `sch_dic_majors`;
+CREATE TABLE `sch_dic_majors` (
+ `id` int(0) NOT NULL AUTO_INCREMENT COMMENT '主键',
+ `name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '专业 ',
+ `sch_id` int(0) NULL DEFAULT NULL COMMENT '学校id',
+ `sort` int(0) NULL DEFAULT NULL COMMENT '序号',
+ `create_date` datetime(0) NULL DEFAULT NULL COMMENT '创建日期',
+ `update_date` datetime(0) NULL DEFAULT NULL COMMENT '修改日期',
+ `create_user_id` int(0) NULL DEFAULT NULL COMMENT '创建用户',
+ `update_user_id` int(0) NULL DEFAULT NULL COMMENT '修改用户',
+ PRIMARY KEY (`id`) USING BTREE
+) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;
+
+-- ----------------------------
+-- Records of sch_dic_majors
+-- ----------------------------
+INSERT INTO `sch_dic_majors` VALUES (1, '哲学', 3260, 7, '2026-06-16 16:23:06', '2026-06-16 16:25:13', 209169, 209169);
+INSERT INTO `sch_dic_majors` VALUES (2, '逻辑学', 3260, 6, '2026-06-16 16:23:31', '2026-06-16 16:25:13', 209169, 209169);
+INSERT INTO `sch_dic_majors` VALUES (3, '宗教学', 3260, 5, '2026-06-16 16:23:44', '2026-06-16 16:25:13', 209169, 209169);
+INSERT INTO `sch_dic_majors` VALUES (4, '经济学', 3260, 4, '2026-06-16 16:23:59', '2026-06-16 16:25:13', 209169, 209169);
+INSERT INTO `sch_dic_majors` VALUES (5, '经济统计学', 3260, 3, '2026-06-16 16:24:12', '2026-06-16 16:25:13', 209169, 209169);
+INSERT INTO `sch_dic_majors` VALUES (6, '法学', 3260, 2, '2026-06-16 16:24:24', '2026-06-16 16:25:13', 209169, 209169);
+INSERT INTO `sch_dic_majors` VALUES (7, '新闻学', 3260, 1, '2026-06-16 16:24:38', '2026-06-16 16:25:13', 209169, 209169);
+
+-- ----------------------------
+-- Table structure for sch_dic_subject
+-- ----------------------------
+DROP TABLE IF EXISTS `sch_dic_subject`;
+CREATE TABLE `sch_dic_subject` (
+ `id` int(0) NOT NULL AUTO_INCREMENT COMMENT '主键',
+ `code` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '编码',
+ `name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '学科',
+ `enable` bit(1) NULL DEFAULT NULL COMMENT '是否启用',
+ `sort` int(0) NULL DEFAULT NULL COMMENT '序号',
+ `sch_id` int(0) NULL DEFAULT NULL COMMENT '学校id',
+ `create_date` datetime(0) NULL DEFAULT NULL COMMENT '创建日期',
+ `update_date` datetime(0) NULL DEFAULT NULL COMMENT '修改日期',
+ `create_user_id` int(0) NULL DEFAULT NULL COMMENT '创建用户',
+ `update_user_id` int(0) NULL DEFAULT NULL COMMENT '修改用户',
+ `source` int(0) NULL DEFAULT NULL,
+ PRIMARY KEY (`id`) USING BTREE
+) ENGINE = InnoDB AUTO_INCREMENT = 42 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;
+
+-- ----------------------------
+-- Records of sch_dic_subject
+-- ----------------------------
+INSERT INTO `sch_dic_subject` VALUES (5, 'SUB1001', '机器人', b'1', 1, 3260, '2026-06-15 18:00:05', '2026-06-15 22:23:27', 209169, 209169, 1);
+INSERT INTO `sch_dic_subject` VALUES (6, 'SUB1002', 'AI', b'1', 2, 3260, '2026-06-15 18:50:10', '2026-06-15 22:22:41', 209169, 209169, 1);
+INSERT INTO `sch_dic_subject` VALUES (7, 'SUB01', '语文', b'0', 3, 3260, '2026-06-15 22:04:42', '2026-06-15 22:22:41', 209169, 209169, 0);
+INSERT INTO `sch_dic_subject` VALUES (26, 'SUB02', '数学', b'0', 4, 3260, '2026-06-15 22:04:42', '2026-06-15 22:22:41', 209169, 209169, 0);
+INSERT INTO `sch_dic_subject` VALUES (27, 'SUB03', '英语', b'0', 5, 3260, '2026-06-15 22:04:42', '2026-06-15 22:22:41', 209169, 209169, 0);
+INSERT INTO `sch_dic_subject` VALUES (28, 'SUB04', '物理', b'0', 6, 3260, '2026-06-15 22:04:42', '2026-06-15 22:22:41', 209169, 209169, 0);
+INSERT INTO `sch_dic_subject` VALUES (29, 'SUB05', '化学', b'0', 7, 3260, '2026-06-15 22:04:42', '2026-06-15 22:22:41', 209169, 209169, 0);
+INSERT INTO `sch_dic_subject` VALUES (30, 'SUB06', '生物', b'0', 8, 3260, '2026-06-15 22:04:42', '2026-06-15 22:22:41', 209169, 209169, 0);
+INSERT INTO `sch_dic_subject` VALUES (31, 'SUB07', '历史', b'0', 9, 3260, '2026-06-15 22:04:42', '2026-06-15 22:22:41', 209169, 209169, 0);
+INSERT INTO `sch_dic_subject` VALUES (32, 'SUB08', '地理', b'0', 10, 3260, '2026-06-15 22:04:42', '2026-06-15 22:22:41', 209169, 209169, 0);
+INSERT INTO `sch_dic_subject` VALUES (33, 'SUB09', '政治', b'0', 11, 3260, '2026-06-15 22:04:42', '2026-06-15 22:22:41', 209169, 209169, 0);
+INSERT INTO `sch_dic_subject` VALUES (34, 'SUB10', '艺术', b'0', 12, 3260, '2026-06-15 22:04:42', '2026-06-15 22:22:41', 209169, 209169, 0);
+INSERT INTO `sch_dic_subject` VALUES (35, 'SUB11', '体育', b'0', 13, 3260, '2026-06-15 22:04:42', '2026-06-15 22:22:41', 209169, 209169, 0);
+INSERT INTO `sch_dic_subject` VALUES (36, 'SUB12', '心理', b'0', 14, 3260, '2026-06-15 22:04:42', '2026-06-15 22:22:41', 209169, 209169, 0);
+INSERT INTO `sch_dic_subject` VALUES (37, 'SUB13', '信息', b'0', 15, 3260, '2026-06-15 22:04:42', '2026-06-15 22:22:41', 209169, 209169, 0);
+INSERT INTO `sch_dic_subject` VALUES (38, 'SUB14', '劳技', b'0', 16, 3260, '2026-06-15 22:04:42', '2026-06-15 22:22:41', 209169, 209169, 0);
+INSERT INTO `sch_dic_subject` VALUES (39, 'SUB15', '跨学科', b'0', 17, 3260, '2026-06-15 22:04:42', '2026-06-15 22:22:41', 209169, 209169, 0);
+INSERT INTO `sch_dic_subject` VALUES (40, 'SUB16', '美术', b'0', 18, 3260, '2026-06-15 22:04:42', '2026-06-15 22:22:41', 209169, 209169, 0);
+INSERT INTO `sch_dic_subject` VALUES (41, 'SUB17', '音乐', b'0', 19, 3260, '2026-06-15 22:04:42', '2026-06-15 22:22:41', 209169, 209169, 0);
+
+-- ----------------------------
+-- Table structure for sch_student
+-- ----------------------------
+DROP TABLE IF EXISTS `sch_student`;
+CREATE TABLE `sch_student` (
+ `id` int(0) NOT NULL AUTO_INCREMENT COMMENT '主键',
+ `account` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '账户',
+ `group_id` int(0) NULL DEFAULT NULL COMMENT '组id',
+ `class_id` int(0) NULL DEFAULT NULL COMMENT '班级id',
+ `stu_id` int(0) NOT NULL COMMENT '学生id',
+ `name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '学生',
+ `gender` int(0) NULL DEFAULT NULL COMMENT '性别',
+ `status` int(0) NULL DEFAULT NULL COMMENT '状态',
+ `abnormal_status` int(0) NULL DEFAULT NULL COMMENT '异常状态',
+ `invitation_code` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '邀请码',
+ `sch_id` int(0) NULL DEFAULT NULL COMMENT '学校id',
+ `create_date` datetime(0) NULL DEFAULT NULL COMMENT '创建时间',
+ `update_date` datetime(0) NULL DEFAULT NULL COMMENT '修改时间',
+ `create_user_id` int(0) NULL DEFAULT NULL COMMENT '创建用户',
+ `update_user_id` int(0) NULL DEFAULT NULL COMMENT '修改用户',
+ PRIMARY KEY (`id`) USING BTREE
+) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;
+
+-- ----------------------------
+-- Table structure for sch_teacher
+-- ----------------------------
+DROP TABLE IF EXISTS `sch_teacher`;
+CREATE TABLE `sch_teacher` (
+ `id` int(0) NOT NULL AUTO_INCREMENT COMMENT '主键',
+ `account` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '账户',
+ `group_id` int(0) NULL DEFAULT NULL COMMENT '组id',
+ `tea_id` int(0) NOT NULL COMMENT '教师id',
+ `name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '教师',
+ `tel` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '联系电话',
+ `gender` int(0) NULL DEFAULT NULL COMMENT '性别 0女 1男',
+ `status` int(0) NULL DEFAULT NULL COMMENT '状态 (0 禁用 1正常)',
+ `sch_id` int(0) NULL DEFAULT NULL COMMENT '学校id',
+ `create_date` datetime(0) NULL DEFAULT NULL COMMENT '创建时间',
+ `update_date` datetime(0) NULL DEFAULT NULL COMMENT '修改时间',
+ `create_user_id` int(0) NULL DEFAULT NULL COMMENT '创建用户',
+ `update_user_id` int(0) NULL DEFAULT NULL COMMENT '修改用户',
+ PRIMARY KEY (`id`) USING BTREE
+) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;
+
+SET FOREIGN_KEY_CHECKS = 1;
diff --git a/sqlscript/创建时间用户字段.sql b/sqlscript/创建时间用户字段.sql
new file mode 100644
index 0000000..73ba732
--- /dev/null
+++ b/sqlscript/创建时间用户字段.sql
@@ -0,0 +1,5 @@
+ALTER TABLE `dbschoolclass`.`sch_dic_campus`
+ADD COLUMN `create_date` datetime(0) NULL COMMENT '创建时间' AFTER `sch_id`,
+ADD COLUMN `update_date` datetime(0) NULL COMMENT '修改时间' AFTER `create_date`,
+ADD COLUMN `create_user_id` int(0) NULL COMMENT '创建用户' AFTER `update_date`,
+ADD COLUMN `update_user_id` int(0) NULL COMMENT '修改用户' AFTER `create_user_id`;
\ No newline at end of file
diff --git a/src/main/java/com/bestsch/classicalchinese/ClassicalchineseApplication.java b/src/main/java/com/bestsch/bschclassmanage/ClassicalchineseApplication.java
similarity index 72%
rename from src/main/java/com/bestsch/classicalchinese/ClassicalchineseApplication.java
rename to src/main/java/com/bestsch/bschclassmanage/ClassicalchineseApplication.java
index f9e902d..9964bd2 100644
--- a/src/main/java/com/bestsch/classicalchinese/ClassicalchineseApplication.java
+++ b/src/main/java/com/bestsch/bschclassmanage/ClassicalchineseApplication.java
@@ -1,17 +1,15 @@
-package com.bestsch.classicalchinese;
+package com.bestsch.bschclassmanage;
-import com.bestsch.bschapistd.config.EnableBschApiStd;
-import com.bestsch.bschsso.EnableBschSso;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.scheduling.annotation.EnableAsync;
+import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.transaction.annotation.EnableTransactionManagement;
@SpringBootApplication
@EnableTransactionManagement
@EnableAsync
-@EnableBschSso //用户中心接口
-@EnableBschApiStd
+@EnableScheduling
public class ClassicalchineseApplication {
public static void main(String[] args) {
diff --git a/src/main/java/com/bestsch/bschclassmanage/Repository/BaseDicGradeRepository.java b/src/main/java/com/bestsch/bschclassmanage/Repository/BaseDicGradeRepository.java
new file mode 100644
index 0000000..0eee868
--- /dev/null
+++ b/src/main/java/com/bestsch/bschclassmanage/Repository/BaseDicGradeRepository.java
@@ -0,0 +1,11 @@
+package com.bestsch.bschclassmanage.Repository;
+
+import com.bestsch.bschclassmanage.entity.BaseDicGrade;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
+import org.springframework.stereotype.Repository;
+
+@Repository
+public interface BaseDicGradeRepository extends JpaRepository, JpaSpecificationExecutor {
+
+}
diff --git a/src/main/java/com/bestsch/bschclassmanage/Repository/BaseDicSubjectRepository.java b/src/main/java/com/bestsch/bschclassmanage/Repository/BaseDicSubjectRepository.java
new file mode 100644
index 0000000..e6bc2c6
--- /dev/null
+++ b/src/main/java/com/bestsch/bschclassmanage/Repository/BaseDicSubjectRepository.java
@@ -0,0 +1,11 @@
+package com.bestsch.bschclassmanage.Repository;
+
+import com.bestsch.bschclassmanage.entity.BaseDicSubject;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
+import org.springframework.stereotype.Repository;
+
+@Repository
+public interface BaseDicSubjectRepository extends JpaRepository, JpaSpecificationExecutor {
+
+}
diff --git a/src/main/java/com/bestsch/bschclassmanage/Repository/BaseSchsystemGradeRepository.java b/src/main/java/com/bestsch/bschclassmanage/Repository/BaseSchsystemGradeRepository.java
new file mode 100644
index 0000000..5766237
--- /dev/null
+++ b/src/main/java/com/bestsch/bschclassmanage/Repository/BaseSchsystemGradeRepository.java
@@ -0,0 +1,17 @@
+package com.bestsch.bschclassmanage.Repository;
+
+
+import com.bestsch.bschclassmanage.entity.BaseSchsystemGrade;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
+import org.springframework.stereotype.Repository;
+
+import java.util.List;
+
+@Repository
+public interface BaseSchsystemGradeRepository extends JpaRepository, JpaSpecificationExecutor {
+
+ List findBySchSystemId(Integer schSystemId);
+
+ List findBySchSystemIdIn(List schSystemIds);
+}
diff --git a/src/main/java/com/bestsch/bschclassmanage/Repository/BaseSchsystemRepository.java b/src/main/java/com/bestsch/bschclassmanage/Repository/BaseSchsystemRepository.java
new file mode 100644
index 0000000..0598b0a
--- /dev/null
+++ b/src/main/java/com/bestsch/bschclassmanage/Repository/BaseSchsystemRepository.java
@@ -0,0 +1,11 @@
+package com.bestsch.bschclassmanage.Repository;
+
+import com.bestsch.bschclassmanage.entity.BaseSchsystem;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
+import org.springframework.stereotype.Repository;
+
+@Repository
+public interface BaseSchsystemRepository extends JpaRepository, JpaSpecificationExecutor {
+
+}
diff --git a/src/main/java/com/bestsch/bschclassmanage/Repository/BaseYearTermRepository.java b/src/main/java/com/bestsch/bschclassmanage/Repository/BaseYearTermRepository.java
new file mode 100644
index 0000000..2529295
--- /dev/null
+++ b/src/main/java/com/bestsch/bschclassmanage/Repository/BaseYearTermRepository.java
@@ -0,0 +1,11 @@
+package com.bestsch.bschclassmanage.Repository;
+
+import com.bestsch.bschclassmanage.entity.BaseYearTerm;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
+import org.springframework.stereotype.Repository;
+
+@Repository
+public interface BaseYearTermRepository extends JpaRepository, JpaSpecificationExecutor {
+
+}
diff --git a/src/main/java/com/bestsch/bschclassmanage/Repository/OperationLogRecordRepository.java b/src/main/java/com/bestsch/bschclassmanage/Repository/OperationLogRecordRepository.java
new file mode 100644
index 0000000..75c046d
--- /dev/null
+++ b/src/main/java/com/bestsch/bschclassmanage/Repository/OperationLogRecordRepository.java
@@ -0,0 +1,14 @@
+package com.bestsch.bschclassmanage.Repository;
+
+import com.bestsch.bschclassmanage.entity.OperationLogRecord;
+import org.springframework.data.domain.Page;
+import org.springframework.data.domain.Pageable;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
+import org.springframework.stereotype.Repository;
+
+@Repository
+public interface OperationLogRecordRepository extends JpaRepository, JpaSpecificationExecutor {
+ Page findByModule(String module, Pageable pageable);
+ Page findAllByOrderByOperateTimeDesc(Pageable pageable);
+}
diff --git a/src/main/java/com/bestsch/bschclassmanage/Repository/SchBinSchsystemRepository.java b/src/main/java/com/bestsch/bschclassmanage/Repository/SchBinSchsystemRepository.java
new file mode 100644
index 0000000..dd297f5
--- /dev/null
+++ b/src/main/java/com/bestsch/bschclassmanage/Repository/SchBinSchsystemRepository.java
@@ -0,0 +1,13 @@
+package com.bestsch.bschclassmanage.Repository;
+
+
+import com.bestsch.bschclassmanage.entity.BaseSchsystemGrade;
+import com.bestsch.bschclassmanage.entity.SchBinSchsystem;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
+import org.springframework.stereotype.Repository;
+
+@Repository
+public interface SchBinSchsystemRepository extends JpaRepository, JpaSpecificationExecutor {
+
+}
diff --git a/src/main/java/com/bestsch/bschclassmanage/Repository/SchClassHistoryRepository.java b/src/main/java/com/bestsch/bschclassmanage/Repository/SchClassHistoryRepository.java
new file mode 100644
index 0000000..5c6cd84
--- /dev/null
+++ b/src/main/java/com/bestsch/bschclassmanage/Repository/SchClassHistoryRepository.java
@@ -0,0 +1,20 @@
+package com.bestsch.bschclassmanage.Repository;
+
+import com.bestsch.bschclassmanage.entity.SchClass;
+import com.bestsch.bschclassmanage.entity.SchClassHistory;
+import io.lettuce.core.dynamic.annotation.Param;
+import org.springframework.data.domain.Page;
+import org.springframework.data.domain.Pageable;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
+import org.springframework.data.jpa.repository.Query;
+import org.springframework.stereotype.Repository;
+
+import java.util.List;
+import java.util.Optional;
+
+@Repository
+public interface SchClassHistoryRepository extends JpaRepository, JpaSpecificationExecutor {
+
+
+}
diff --git a/src/main/java/com/bestsch/bschclassmanage/Repository/SchClassRepository.java b/src/main/java/com/bestsch/bschclassmanage/Repository/SchClassRepository.java
new file mode 100644
index 0000000..42fa755
--- /dev/null
+++ b/src/main/java/com/bestsch/bschclassmanage/Repository/SchClassRepository.java
@@ -0,0 +1,69 @@
+package com.bestsch.bschclassmanage.Repository;
+
+import com.bestsch.bschclassmanage.entity.SchClass;
+import io.lettuce.core.dynamic.annotation.Param;
+import org.springframework.data.domain.Page;
+import org.springframework.data.domain.Pageable;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
+import org.springframework.data.jpa.repository.Query;
+import org.springframework.stereotype.Repository;
+
+import java.util.List;
+import java.util.Optional;
+
+@Repository
+public interface SchClassRepository extends JpaRepository, JpaSpecificationExecutor {
+
+ Optional findByIdAndSchId(Integer Id, Integer schId);
+
+ Optional findByClassIdAndSchId(Integer classId, Integer schId);
+
+ @Query(value = "SELECT MAX(sort) FROM sch_class WHERE grade_id = :gradeId AND sch_id = :schId AND graduate = 0", nativeQuery = true)
+ Integer findMaxCodeNumber(@Param("gradeId") Integer gradeId, @Param("schId") Integer schId);
+
+ @Query("SELECT c FROM SchClass c " +
+ "WHERE c.schId = :schId " +
+ "AND (:campusId IS NULL OR c.campusId = :campusId) " +
+ "AND (:divisionId IS NULL OR c.divisionId = :divisionId) " +
+ "AND (:majorsId IS NULL OR c.majorsId = :majorsId) " +
+ "AND (:years IS NULL OR c.enrollYear IN :years)"+
+ "AND c.enrollYear = c.gradeId AND c.graduate = 0")
+ Page findClassesByConditions(@Param("schId") Integer schId,
+ @Param("campusId") Integer campusId,
+ @Param("divisionId") Integer divisionId,
+ @Param("majorsId") Integer majorsId,
+ @Param("years") List years,
+ Pageable pageable);
+
+ boolean existsBySchIdAndGroupIdAndName(Integer schId, Integer groupId, String name);
+
+ boolean existsBySchIdAndGroupIdAndNameAndIdNot(Integer schId, Integer groupId, String name, Integer id);
+
+ long countByFirstTeacherIdOrSecondTeacherId(Integer firstTeacherId, Integer secondTeacherId);
+
+ long countByCampusId(Integer campusId);
+
+ long countByDivisionId(Integer divisionId);
+
+ long countByMajorsId(Integer majorsId);
+
+ List findBySchIdAndEnrollYear(Integer schId, Integer enrollYear);
+
+ boolean existsBySchIdAndClassId(Integer schId, Integer classId);
+
+ @Query("SELECT COUNT(c) FROM SchClass c WHERE (c.firstTeacherId IN (:ids) OR c.secondTeacherId IN (:ids)) AND c.schId = :schId AND c.graduate = 0")
+ long countByFirstTeacherIdInOrSecondTeacherIdInAndSchId(
+ @Param("ids") List ids,
+ @Param("schId") Integer schId
+ );
+
+ /**
+ * 根据学校ID和年级ID列表,查询最小的注册年份
+ * @param schId 学校ID
+ * @param gradeIds 年级ID列表(可为空)
+ * @return 最小注册年份,如果没有匹配记录则返回 null
+ */
+ @Query("SELECT MIN(c.enrollYear) FROM SchClass c WHERE c.schId = :schId AND c.gradeId IN :gradeIds")
+ Integer findMinEnrollYear(@Param("schId") Integer schId, @Param("gradeIds") List gradeIds);
+}
diff --git a/src/main/java/com/bestsch/bschclassmanage/Repository/SchClassTeachHistoryRepository.java b/src/main/java/com/bestsch/bschclassmanage/Repository/SchClassTeachHistoryRepository.java
new file mode 100644
index 0000000..d2d6512
--- /dev/null
+++ b/src/main/java/com/bestsch/bschclassmanage/Repository/SchClassTeachHistoryRepository.java
@@ -0,0 +1,12 @@
+package com.bestsch.bschclassmanage.Repository;
+
+import com.bestsch.bschclassmanage.entity.BaseDicGrade;
+import com.bestsch.bschclassmanage.entity.SchClassTeachHistory;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
+import org.springframework.stereotype.Repository;
+
+@Repository
+public interface SchClassTeachHistoryRepository extends JpaRepository, JpaSpecificationExecutor {
+
+}
diff --git a/src/main/java/com/bestsch/bschclassmanage/Repository/SchClassTeachRepository.java b/src/main/java/com/bestsch/bschclassmanage/Repository/SchClassTeachRepository.java
new file mode 100644
index 0000000..f080e11
--- /dev/null
+++ b/src/main/java/com/bestsch/bschclassmanage/Repository/SchClassTeachRepository.java
@@ -0,0 +1,23 @@
+package com.bestsch.bschclassmanage.Repository;
+
+import com.bestsch.bschclassmanage.entity.SchClassTeach;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
+import org.springframework.stereotype.Repository;
+
+import java.util.List;
+import java.util.Optional;
+
+@Repository
+public interface SchClassTeachRepository extends JpaRepository, JpaSpecificationExecutor {
+
+
+ List findBySchIdAndClassIdIn(Integer schId, List classIds);
+
+ Optional findBySchIdAndClassIdAndSubId(Integer schId, Integer classId, String subId);
+
+ Optional findBySchIdAndId(Integer schId, Integer id);
+
+ List findBySchIdAndClassId(Integer schId, Integer classId);
+
+}
diff --git a/src/main/java/com/bestsch/bschclassmanage/Repository/SchDicCampusRepository.java b/src/main/java/com/bestsch/bschclassmanage/Repository/SchDicCampusRepository.java
new file mode 100644
index 0000000..3cecc71
--- /dev/null
+++ b/src/main/java/com/bestsch/bschclassmanage/Repository/SchDicCampusRepository.java
@@ -0,0 +1,23 @@
+package com.bestsch.bschclassmanage.Repository;
+
+import com.bestsch.bschclassmanage.entity.SchDicCampus;
+import org.springframework.data.domain.Page;
+import org.springframework.data.domain.Pageable;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
+import org.springframework.data.jpa.repository.Query;
+import org.springframework.stereotype.Repository;
+
+import java.util.Optional;
+
+@Repository
+public interface SchDicCampusRepository extends JpaRepository, JpaSpecificationExecutor {
+
+ boolean existsBySchIdAndName(Integer schId, String name);
+
+ boolean existsBySchIdAndNameAndIdNot(Integer schId, String name, Integer id);
+
+ Optional findByIdAndSchId(Integer Id, Integer schId);
+
+
+}
diff --git a/src/main/java/com/bestsch/bschclassmanage/Repository/SchDicCourseDivisionRepository.java b/src/main/java/com/bestsch/bschclassmanage/Repository/SchDicCourseDivisionRepository.java
new file mode 100644
index 0000000..1a47856
--- /dev/null
+++ b/src/main/java/com/bestsch/bschclassmanage/Repository/SchDicCourseDivisionRepository.java
@@ -0,0 +1,27 @@
+package com.bestsch.bschclassmanage.Repository;
+
+import com.bestsch.bschclassmanage.entity.SchDicCourseDivision;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
+import org.springframework.stereotype.Repository;
+
+import java.util.List;
+import java.util.Optional;
+
+@Repository
+public interface SchDicCourseDivisionRepository extends JpaRepository, JpaSpecificationExecutor {
+
+ List findByCourseIdAndSchId(Integer courseId, Integer schId);
+
+ /**
+ * 根据课程 ID 列表和学校 ID 批量查询关联的学部关系
+ * @param courseIds 课程 ID 列表
+ * @param schId 学校 ID
+ * @return 匹配的关联关系列表
+ */
+ List findByCourseIdInAndSchId(List courseIds, Integer schId);
+
+ void deleteByCourseIdAndSchId(Integer courseId, Integer schId);
+
+ Optional findByIdAndSchId(Integer Id, Integer schId);
+}
diff --git a/src/main/java/com/bestsch/bschclassmanage/Repository/SchDicCourseMajorsRepository.java b/src/main/java/com/bestsch/bschclassmanage/Repository/SchDicCourseMajorsRepository.java
new file mode 100644
index 0000000..1b7da74
--- /dev/null
+++ b/src/main/java/com/bestsch/bschclassmanage/Repository/SchDicCourseMajorsRepository.java
@@ -0,0 +1,27 @@
+package com.bestsch.bschclassmanage.Repository;
+
+import com.bestsch.bschclassmanage.entity.SchDicCourseMajors;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
+import org.springframework.stereotype.Repository;
+
+import java.util.List;
+import java.util.Optional;
+
+@Repository
+public interface SchDicCourseMajorsRepository extends JpaRepository, JpaSpecificationExecutor {
+
+ List findByCourseIdAndSchId(Integer courseId, Integer schId);
+
+ /**
+ * 根据课程 ID 列表和学校 ID 批量查询关联的学部关系
+ * @param courseIds 课程 ID 列表
+ * @param schId 学校 ID
+ * @return 匹配的关联关系列表
+ */
+ List findByCourseIdInAndSchId(List courseIds, Integer schId);
+
+ void deleteByCourseIdAndSchId(Integer courseId, Integer schId);
+
+ Optional findByIdAndSchId(Integer Id, Integer schId);
+}
diff --git a/src/main/java/com/bestsch/bschclassmanage/Repository/SchDicCourseRepository.java b/src/main/java/com/bestsch/bschclassmanage/Repository/SchDicCourseRepository.java
new file mode 100644
index 0000000..fcabe0a
--- /dev/null
+++ b/src/main/java/com/bestsch/bschclassmanage/Repository/SchDicCourseRepository.java
@@ -0,0 +1,45 @@
+package com.bestsch.bschclassmanage.Repository;
+
+import com.bestsch.bschclassmanage.entity.SchDicCampus;
+import com.bestsch.bschclassmanage.entity.SchDicCourse;
+import io.lettuce.core.dynamic.annotation.Param;
+import org.springframework.data.domain.Page;
+import org.springframework.data.domain.Pageable;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
+import org.springframework.data.jpa.repository.Query;
+import org.springframework.stereotype.Repository;
+
+import java.util.Optional;
+
+@Repository
+public interface SchDicCourseRepository extends JpaRepository, JpaSpecificationExecutor {
+ boolean existsBySchIdAndName(Integer schId, String name);
+ boolean existsBySchIdAndNameAndIdNot(Integer schId, String name, Integer id);
+ Optional findByIdAndSchId(Integer Id, Integer schId);
+ @Query(value = "SELECT c FROM SchDicCourse c " +
+ "WHERE c.schId = :schId " +
+ "AND (:type IS NULL OR c.type = :type) " +
+ "AND (:keyword IS NULL OR (c.name LIKE CONCAT('%', :keyword, '%') " +
+ " OR c.nickname LIKE CONCAT('%', :keyword, '%') " +
+ " OR c.code LIKE CONCAT('%', :keyword, '%'))) " +
+ "AND (:divisionId IS NULL OR EXISTS (SELECT 1 FROM SchDicCourseDivision d WHERE d.courseId = c.id AND d.divisionId = :divisionId)) " +
+ "AND (:majorsId IS NULL OR EXISTS (SELECT 1 FROM SchDicCourseMajors m WHERE m.courseId = c.id AND m.majorsId = :majorsId))",
+ countQuery = "SELECT COUNT(c) FROM SchDicCourse c " +
+ "WHERE c.schId = :schId " +
+ "AND (:type IS NULL OR c.type = :type) " +
+ "AND (:keyword IS NULL OR (c.name LIKE CONCAT('%', :keyword, '%') " +
+ " OR c.nickname LIKE CONCAT('%', :keyword, '%') " +
+ " OR c.code LIKE CONCAT('%', :keyword, '%'))) " +
+ "AND (:divisionId IS NULL OR EXISTS (SELECT 1 FROM SchDicCourseDivision d WHERE d.courseId = c.id AND d.divisionId = :divisionId)) " +
+ "AND (:majorsId IS NULL OR EXISTS (SELECT 1 FROM SchDicCourseMajors m WHERE m.courseId = c.id AND m.majorsId = :majorsId))")
+ Page findCoursesByConditions(@Param("schId") Integer schId,
+ @Param("type") Integer type,
+ @Param("keyword") String keyword,
+ @Param("divisionId") Integer divisionId,
+ @Param("majorsId") Integer majorsId,
+ Pageable pageable);
+
+
+
+}
diff --git a/src/main/java/com/bestsch/bschclassmanage/Repository/SchDicDivisionRepository.java b/src/main/java/com/bestsch/bschclassmanage/Repository/SchDicDivisionRepository.java
new file mode 100644
index 0000000..bdcd56f
--- /dev/null
+++ b/src/main/java/com/bestsch/bschclassmanage/Repository/SchDicDivisionRepository.java
@@ -0,0 +1,15 @@
+package com.bestsch.bschclassmanage.Repository;
+
+import com.bestsch.bschclassmanage.entity.SchDicDivision;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
+import org.springframework.stereotype.Repository;
+
+import java.util.Optional;
+
+@Repository
+public interface SchDicDivisionRepository extends JpaRepository, JpaSpecificationExecutor {
+ boolean existsBySchIdAndName(Integer schId, String name);
+ boolean existsBySchIdAndNameAndIdNot(Integer schId, String name, Integer id);
+ Optional findByIdAndSchId(Integer Id, Integer schId);
+}
diff --git a/src/main/java/com/bestsch/bschclassmanage/Repository/SchDicMajorsRepository.java b/src/main/java/com/bestsch/bschclassmanage/Repository/SchDicMajorsRepository.java
new file mode 100644
index 0000000..d5395ed
--- /dev/null
+++ b/src/main/java/com/bestsch/bschclassmanage/Repository/SchDicMajorsRepository.java
@@ -0,0 +1,20 @@
+package com.bestsch.bschclassmanage.Repository;
+
+import com.bestsch.bschclassmanage.entity.SchDicMajors;
+import io.lettuce.core.dynamic.annotation.Param;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
+import org.springframework.data.jpa.repository.Query;
+import org.springframework.stereotype.Repository;
+
+import java.util.Optional;
+
+@Repository
+public interface SchDicMajorsRepository extends JpaRepository, JpaSpecificationExecutor {
+ boolean existsBySchIdAndName(Integer schId, String name);
+ boolean existsBySchIdAndNameAndIdNot(Integer schId, String name, Integer id);
+ Optional findByIdAndSchId(Integer Id, Integer schId);
+
+ @Query("SELECT MAX(m.schsystemLeng) FROM SchDicMajors m WHERE m.schId = :schId")
+ Optional findMaxSchsystemLengBySchId(Integer schId);
+}
diff --git a/src/main/java/com/bestsch/bschclassmanage/Repository/SchDicSubjectRepository.java b/src/main/java/com/bestsch/bschclassmanage/Repository/SchDicSubjectRepository.java
new file mode 100644
index 0000000..f5504f9
--- /dev/null
+++ b/src/main/java/com/bestsch/bschclassmanage/Repository/SchDicSubjectRepository.java
@@ -0,0 +1,23 @@
+package com.bestsch.bschclassmanage.Repository;
+
+import com.bestsch.bschclassmanage.entity.BaseDicGrade;
+import com.bestsch.bschclassmanage.entity.SchDicSubject;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
+import org.springframework.data.jpa.repository.Query;
+import org.springframework.stereotype.Repository;
+
+import java.util.Optional;
+
+@Repository
+public interface SchDicSubjectRepository extends JpaRepository, JpaSpecificationExecutor {
+
+ @Query(value = "SELECT MAX(CAST(SUBSTRING(code, 4) AS UNSIGNED)) FROM sch_dic_subject WHERE code LIKE 'SUB%' AND sch_id = ?1", nativeQuery = true)
+ Integer findMaxSubjectCodeNumber(Integer schId);
+
+ Optional findByIdAndSchId(Integer Id, Integer schId);
+
+ boolean existsBySchIdAndSchSystemIdAndName(Integer schId, Integer schSystemId, String name);
+
+ boolean existsBySchIdAndSchSystemIdAndNameAndIdNot(Integer schId, Integer schSystemId, String name, Integer id);
+}
diff --git a/src/main/java/com/bestsch/bschclassmanage/Repository/SchInfoRepository.java b/src/main/java/com/bestsch/bschclassmanage/Repository/SchInfoRepository.java
new file mode 100644
index 0000000..40ae3c2
--- /dev/null
+++ b/src/main/java/com/bestsch/bschclassmanage/Repository/SchInfoRepository.java
@@ -0,0 +1,16 @@
+package com.bestsch.bschclassmanage.Repository;
+
+import com.bestsch.bschclassmanage.entity.SchInfo;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
+import org.springframework.stereotype.Repository;
+
+import java.util.Optional;
+
+@Repository
+public interface SchInfoRepository extends JpaRepository, JpaSpecificationExecutor {
+
+ Optional findBySchId(Integer schId);
+
+ Optional findBySchSerId(String schSerId);
+}
diff --git a/src/main/java/com/bestsch/bschclassmanage/Repository/SchStudentHistoryRepository.java b/src/main/java/com/bestsch/bschclassmanage/Repository/SchStudentHistoryRepository.java
new file mode 100644
index 0000000..a4df77d
--- /dev/null
+++ b/src/main/java/com/bestsch/bschclassmanage/Repository/SchStudentHistoryRepository.java
@@ -0,0 +1,12 @@
+package com.bestsch.bschclassmanage.Repository;
+
+import com.bestsch.bschclassmanage.entity.SchClassTeachHistory;
+import com.bestsch.bschclassmanage.entity.SchStudentHistory;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
+import org.springframework.stereotype.Repository;
+
+@Repository
+public interface SchStudentHistoryRepository extends JpaRepository, JpaSpecificationExecutor {
+
+}
diff --git a/src/main/java/com/bestsch/bschclassmanage/Repository/SchStudentRepository.java b/src/main/java/com/bestsch/bschclassmanage/Repository/SchStudentRepository.java
new file mode 100644
index 0000000..7c2986a
--- /dev/null
+++ b/src/main/java/com/bestsch/bschclassmanage/Repository/SchStudentRepository.java
@@ -0,0 +1,114 @@
+package com.bestsch.bschclassmanage.Repository;
+
+import com.bestsch.bschclassmanage.entity.SchStudent;
+import io.lettuce.core.dynamic.annotation.Param;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
+import org.springframework.data.jpa.repository.Modifying;
+import org.springframework.data.jpa.repository.Query;
+import org.springframework.stereotype.Repository;
+
+import java.util.Date;
+import java.util.List;
+import java.util.Optional;
+
+@Repository
+public interface SchStudentRepository extends JpaRepository, JpaSpecificationExecutor {
+
+ Optional findByStuId(Integer stuId);
+
+ List findByStuIdIn(List stuIds);
+
+ boolean existsByAccount(String account);
+
+ Optional findByAccount(String account);
+
+ Optional findByIdAndSchId(Integer Id, Integer schId);
+
+ @Query("SELECT s FROM SchStudent s WHERE s.schId = :schId AND s.classId = :classId AND s.abnormalStatus = 1 AND s.transferStatus=1 AND s.status = 1")
+ List findBySchIdAndClassId(@Param("schId") Integer schId, @Param("classId") Integer classId);
+
+ List findAllByIdInAndSchId(List ids, Integer schId);
+
+
+
+ boolean existsBySchIdAndClassIdAndName(Integer schId,Integer classId, String name);
+
+ boolean existsBySchIdAndClassIdAndNameAndIdNot(Integer schId,Integer classId, String name, Integer id);
+
+ @Modifying(clearAutomatically = true)
+ @Query("UPDATE SchStudent s SET s.classId = :newClassId, s.groupId = :newClassId, s.updateDate = :updateDate, s.updateUserId = :updateUserId WHERE s.id IN (:ids) AND s.schId = :schId")
+ int batchUpdateClassId(@Param("ids") List ids,
+ @Param("newClassId") Integer newClassId,
+ @Param("schId") Integer schId,
+ @Param("updateDate") Date updateDate,
+ @Param("updateUserId") Integer updateUserId);
+
+ @Modifying
+ @Query("UPDATE SchStudent s SET s.schId = :schId, s.classId = :newClassId,s.groupId = :newClassId, s.updateDate = :updateDate, s.updateUserId = :updateUserId , s.transferStatus =1 WHERE s.id IN :ids")
+ int batchUpdateSchIdAndClassId(@Param("ids") List ids,
+ @Param("schId") Integer schId, // 目标学校ID
+ @Param("newClassId") Integer newClassId,
+ @Param("updateDate") Date updateDate,
+ @Param("updateUserId") Integer updateUserId);
+
+
+ /**
+ * 批量更新学生异常状态,同时记录异常发生时间和修改时间(两者相同)
+ *
+ * @param ids 学生ID列表
+ * @param abnormalStatus 异常状态值
+ * @param schId 学校ID(安全过滤)
+ * @param commonDate 异常时间 / 修改时间
+ * @param updateUserId 操作用户ID
+ * @return 实际更新的行数
+ */
+ @Modifying(clearAutomatically = true)
+ @Query("UPDATE SchStudent s SET " +
+ "s.abnormalStatus = :abnormalStatus, " +
+ "s.abnormalDate = :commonDate, " +
+ "s.updateDate = :commonDate, " +
+ "s.updateUserId = :updateUserId " +
+ "WHERE s.id IN (:ids) AND s.schId = :schId")
+ int batchUpdateAbnormalStatus(@Param("ids") List ids,
+ @Param("abnormalStatus") Integer abnormalStatus,
+ @Param("schId") Integer schId,
+ @Param("commonDate") Date commonDate,
+ @Param("updateUserId") Integer updateUserId);
+
+
+ /**
+ * 批量更新学生异常状态,同时记录异常发生时间和修改时间(两者相同)
+ *
+ * @param ids 学生ID列表
+ * @param transferStatus 转出状态值
+ * @param schId 学校ID(安全过滤)
+ * @param commonDate 异常时间 / 修改时间
+ * @param updateUserId 操作用户ID
+ * @return 实际更新的行数
+ */
+ @Modifying(clearAutomatically = true)
+ @Query("UPDATE SchStudent s SET " +
+ "s.transferStatus = :transferStatus, " +
+ "s.abnormalDate = :commonDate, " +
+ "s.updateDate = :commonDate, " +
+ "s.updateUserId = :updateUserId, " +
+ "s.stuClassNo = null " +
+ "WHERE s.id IN (:ids) AND s.schId = :schId")
+ int batchUpdateTransferStatus(@Param("ids") List ids,
+ @Param("transferStatus") Integer transferStatus,
+ @Param("schId") Integer schId,
+ @Param("commonDate") Date commonDate,
+ @Param("updateUserId") Integer updateUserId);
+
+
+ /**
+ * 获取所有转出学生的学校ID(去重)
+ * 转出条件:transfer_status = 0
+ * 关联:s.class_id = c.group_class_id
+ */
+ @Query(value = "SELECT DISTINCT c.sch_id FROM sch_student s " +
+ "INNER JOIN sch_class c ON s.class_id = c.group_class_id " +
+ "WHERE s.transfer_status = 0 AND s.sch_id = c.sch_id AND s.status=1 ", nativeQuery = true)
+ List findDistinctSchIdsByTransferOut();
+}
diff --git a/src/main/java/com/bestsch/bschclassmanage/Repository/SchTeacherCustomGroupInGradeRepository.java b/src/main/java/com/bestsch/bschclassmanage/Repository/SchTeacherCustomGroupInGradeRepository.java
new file mode 100644
index 0000000..9d5af95
--- /dev/null
+++ b/src/main/java/com/bestsch/bschclassmanage/Repository/SchTeacherCustomGroupInGradeRepository.java
@@ -0,0 +1,15 @@
+package com.bestsch.bschclassmanage.Repository;
+
+import com.bestsch.bschclassmanage.entity.SchTeacherCustomGroupInGrade;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
+import org.springframework.stereotype.Repository;
+
+import java.util.List;
+
+@Repository
+public interface SchTeacherCustomGroupInGradeRepository extends JpaRepository, JpaSpecificationExecutor {
+ List findByCgGroupIdIn(List groupIds);
+
+ void deleteByCgGroupId(Integer groupId);
+}
diff --git a/src/main/java/com/bestsch/bschclassmanage/Repository/SchTeacherCustomGroupInSubjectRepository.java b/src/main/java/com/bestsch/bschclassmanage/Repository/SchTeacherCustomGroupInSubjectRepository.java
new file mode 100644
index 0000000..84c9f48
--- /dev/null
+++ b/src/main/java/com/bestsch/bschclassmanage/Repository/SchTeacherCustomGroupInSubjectRepository.java
@@ -0,0 +1,15 @@
+package com.bestsch.bschclassmanage.Repository;
+
+import com.bestsch.bschclassmanage.entity.SchTeacherCustomGroupInSubject;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
+import org.springframework.stereotype.Repository;
+
+import java.util.List;
+
+@Repository
+public interface SchTeacherCustomGroupInSubjectRepository extends JpaRepository, JpaSpecificationExecutor {
+ List findByCgGroupIdIn(List groupIds);
+
+ void deleteByCgGroupId(Integer groupId);
+}
diff --git a/src/main/java/com/bestsch/bschclassmanage/Repository/SchTeacherCustomGroupInTeacherRepository.java b/src/main/java/com/bestsch/bschclassmanage/Repository/SchTeacherCustomGroupInTeacherRepository.java
new file mode 100644
index 0000000..dc987ae
--- /dev/null
+++ b/src/main/java/com/bestsch/bschclassmanage/Repository/SchTeacherCustomGroupInTeacherRepository.java
@@ -0,0 +1,31 @@
+package com.bestsch.bschclassmanage.Repository;
+
+import com.bestsch.bschclassmanage.entity.SchTeacherCustomGroup;
+import com.bestsch.bschclassmanage.entity.SchTeacherCustomGroupInTeacher;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
+import org.springframework.stereotype.Repository;
+
+import java.util.List;
+
+@Repository
+public interface SchTeacherCustomGroupInTeacherRepository extends JpaRepository, JpaSpecificationExecutor {
+ /**
+ * 根据组ID列表查询所有教师关联
+ * @param groupIds 组ID列表
+ * @return 教师关联列表
+ */
+ List findByCgGroupIdIn(List groupIds);
+
+ List findByCgGroupId(Integer groupId);
+
+ List findByCgGroupIdAndGroupType(Integer groupId, Integer groupType);
+
+ void deleteByCgGroupIdAndGroupType(Integer groupId, Integer groupType);
+
+ void deleteByCgGroupIdAndTeaIdInAndGroupType(Integer groupId, List teaIds, Integer groupType);
+
+ void deleteByCgGroupId(Integer groupId);
+
+
+}
diff --git a/src/main/java/com/bestsch/bschclassmanage/Repository/SchTeacherCustomGroupRepository.java b/src/main/java/com/bestsch/bschclassmanage/Repository/SchTeacherCustomGroupRepository.java
new file mode 100644
index 0000000..83928c1
--- /dev/null
+++ b/src/main/java/com/bestsch/bschclassmanage/Repository/SchTeacherCustomGroupRepository.java
@@ -0,0 +1,21 @@
+package com.bestsch.bschclassmanage.Repository;
+
+import com.bestsch.bschclassmanage.entity.SchTeacherCustomGroup;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
+import org.springframework.stereotype.Repository;
+
+import java.util.List;
+
+@Repository
+public interface SchTeacherCustomGroupRepository extends JpaRepository, JpaSpecificationExecutor {
+
+ List findBySchId(Integer schId);
+
+ List findBySchIdAndGroupType(Integer schId, Integer groupType);
+
+ List findBySchIdAndGroupTypeAndGroupName(Integer schId, Integer groupType, String groupName);
+
+ boolean existsBySchIdAndGroupTypeAndGroupName(Integer schId, Integer groupType, String groupName);
+ boolean existsBySchIdAndGroupTypeAndGroupNameAndIdNot(Integer schId, Integer groupType, String groupName, Integer id);
+}
diff --git a/src/main/java/com/bestsch/bschclassmanage/Repository/SchTeacherGroupRepository.java b/src/main/java/com/bestsch/bschclassmanage/Repository/SchTeacherGroupRepository.java
new file mode 100644
index 0000000..5f4ae25
--- /dev/null
+++ b/src/main/java/com/bestsch/bschclassmanage/Repository/SchTeacherGroupRepository.java
@@ -0,0 +1,97 @@
+package com.bestsch.bschclassmanage.Repository;
+
+import com.bestsch.bschclassmanage.entity.SchTeacherGroup;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
+
+import java.util.List;
+
+import io.lettuce.core.dynamic.annotation.Param;
+import org.springframework.data.jpa.repository.Modifying;
+import org.springframework.data.jpa.repository.Query;
+import org.springframework.stereotype.Repository;
+
+@Repository
+public interface SchTeacherGroupRepository extends JpaRepository, JpaSpecificationExecutor {
+
+
+ /**
+ * 根据 teaId 列表查询所有组关联(不限学校)
+ * 适用场景:全局查询(如跨校操作前校验)
+ */
+ List findByTeaIdIn(List teaIds);
+
+
+ List findByGroupIdAndSchId(Integer groupId, Integer schId);
+
+
+ List findByTeaIdAndSchId(Integer teaId, Integer schId);
+
+ /**
+ * 根据 teaId 列表和学校 ID 查询组关联
+ * 适用场景:查询某教师在指定学校的组归属
+ */
+ List findByTeaIdInAndSchId(List teaIds, Integer schId);
+
+ /**
+ * 根据 teaId 列表、学校 ID 和转入状态查询组关联
+ * 适用场景:只查询转入状态的记录(transferStatus = 1)
+ */
+ List findByTeaIdInAndSchIdAndTransferStatus(List teaIds, Integer schId, Integer transferStatus);
+
+ /**
+ * 根据学校 ID 查询该学校所有教师的 teaId(去重)
+ * 适用场景:获取该校所有教师列表
+ */
+ @Query("SELECT DISTINCT t.teaId FROM SchTeacherGroup t WHERE t.schId = :schId")
+ List findTeaIdsBySchId(@Param("schId") Integer schId);
+
+ /**
+ * 校验某教师是否属于某学校(根据 teaId 和 schId)
+ */
+ boolean existsByTeaIdAndSchId(Integer teaId, Integer schId);
+
+ // ==================== 删除方法 ====================
+
+ /**
+ * 根据 teaId 列表删除所有学校的关联(谨慎使用)
+ * 适用场景:全局删除(如教师彻底注销)
+ */
+ @Modifying
+ @Query("DELETE FROM SchTeacherGroup g WHERE g.teaId IN :teaIds")
+ int deleteByTeaIdIn(@Param("teaIds") List teaIds);
+
+ /**
+ * 根据 teaId 列表和学校 ID 删除关联(推荐)
+ * 适用场景:转出/删除时只移除该教师在当前学校的组归属
+ */
+ @Modifying
+ @Query("DELETE FROM SchTeacherGroup g WHERE g.teaId IN :teaIds AND g.schId = :schId")
+ int deleteByTeaIdInAndSchId(@Param("teaIds") List teaIds, @Param("schId") Integer schId);
+
+ // ==================== 批量更新方法 ====================
+
+ /**
+ * 批量更新某学校下教师的转入状态
+ * 适用场景:批量转出/转入
+ */
+ @Modifying
+ @Query("UPDATE SchTeacherGroup g SET g.transferStatus = :status WHERE g.teaId IN :teaIds AND g.schId = :schId")
+ int batchUpdateTransferStatus(@Param("teaIds") List teaIds,
+ @Param("schId") Integer schId,
+ @Param("status") Integer status);
+
+ // 根据学校ID和组ID查询教师 teaId 列表
+ @Query("SELECT DISTINCT t.teaId FROM SchTeacherGroup t WHERE t.schId = :schId AND t.groupId = :groupId")
+ List findTeaIdsBySchIdAndGroupId(@Param("schId") Integer schId, @Param("groupId") Integer groupId);
+
+ // 查询某学校下所有不同的组ID
+ @Query("SELECT DISTINCT t.groupId FROM SchTeacherGroup t WHERE t.schId = :schId")
+ List findGroupIdsBySchId(@Param("schId") Integer schId);
+
+ /**
+ * 根据状态获取学校ID(去重)
+ */
+ @Query("SELECT DISTINCT g.schId FROM SchTeacherGroup g WHERE g.transferStatus = 0")
+ List findSchoolIdsByTransferOut();
+}
diff --git a/src/main/java/com/bestsch/bschclassmanage/Repository/SchTeacherRepository.java b/src/main/java/com/bestsch/bschclassmanage/Repository/SchTeacherRepository.java
new file mode 100644
index 0000000..8c76544
--- /dev/null
+++ b/src/main/java/com/bestsch/bschclassmanage/Repository/SchTeacherRepository.java
@@ -0,0 +1,79 @@
+package com.bestsch.bschclassmanage.Repository;
+
+import com.bestsch.bschclassmanage.entity.SchTeacher;
+import com.bestsch.bschclassmanage.model.vo.TeacherSchVO;
+import io.lettuce.core.dynamic.annotation.Param;
+import org.springframework.data.domain.Page;
+import org.springframework.data.domain.Pageable;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
+import org.springframework.data.jpa.repository.Modifying;
+import org.springframework.data.jpa.repository.Query;
+import org.springframework.stereotype.Repository;
+
+import java.util.Date;
+import java.util.List;
+import java.util.Optional;
+
+@Repository
+public interface SchTeacherRepository extends JpaRepository, JpaSpecificationExecutor {
+
+ List findByTeaIdIn(List teaIds);
+
+ Optional findByTeaId(Integer teaId);
+
+
+ @Query(value = "SELECT DISTINCT t.* FROM sch_teacher t " +
+ "INNER JOIN sch_teacher_group g ON t.tea_id = g.tea_id " +
+ "WHERE g.sch_id = :schId " +
+ "AND g.transfer_status = 1 " + // 只查转入状态的教师
+ "AND (:groupId IS NULL OR g.group_id = :groupId) " +
+ "AND (:keyword IS NULL OR t.name LIKE CONCAT('%', :keyword, '%') OR t.account LIKE CONCAT('%', :keyword, '%')) " ,
+ countQuery = "SELECT COUNT(DISTINCT t.id) FROM sch_teacher t " +
+ "INNER JOIN sch_teacher_group g ON t.tea_id = g.tea_id " +
+ "WHERE g.sch_id = :schId " +
+ "AND g.transfer_status = 1 " +
+ "AND (:groupId IS NULL OR g.group_id = :groupId) " +
+ "AND (:keyword IS NULL OR t.name LIKE CONCAT('%', :keyword, '%') OR t.account LIKE CONCAT('%', :keyword, '%'))",
+ nativeQuery = true)
+ Page searchTeachersBySchIdAndGroupId(@Param("schId") Integer schId,
+ @Param("groupId") Integer groupId,
+ @Param("keyword") String keyword,
+ Pageable pageable);
+
+
+ @Query(value = "SELECT DISTINCT g.tea_id AS teaId, g.sch_id AS schId, t.name AS teaName, t.id_card AS idCard " +
+ "FROM sch_teacher_group g " +
+ "INNER JOIN sch_teacher t ON t.tea_id = g.tea_id " +
+ "WHERE g.transfer_status = 0 " +
+ "AND t.status = 1 " +
+ "AND (:schId IS NULL OR g.sch_id = :schId) " +
+ "AND (:groupId IS NULL OR g.group_id = :groupId) " +
+ "AND (:keyword IS NULL OR t.name LIKE CONCAT('%', :keyword, '%') OR t.account LIKE CONCAT('%', :keyword, '%')) " +
+ "ORDER BY t.name", //只按教师姓名排序,避免引用未选择列
+ countQuery = "SELECT COUNT(DISTINCT CONCAT(g.tea_id, '_', g.sch_id)) " +
+ "FROM sch_teacher_group g " +
+ "INNER JOIN sch_teacher t ON t.tea_id = g.tea_id " +
+ "WHERE g.transfer_status = 0 " +
+ "AND t.status = 1 " +
+ "AND (:schId IS NULL OR g.sch_id = :schId) " +
+ "AND (:groupId IS NULL OR g.group_id = :groupId) " +
+ "AND (:keyword IS NULL OR t.name LIKE CONCAT('%', :keyword, '%') OR t.account LIKE CONCAT('%', :keyword, '%'))",
+ nativeQuery = true)
+ Page searchTransferredOutTeachers(@Param("schId") Integer schId,
+ @Param("groupId") Integer groupId,
+ @Param("keyword") String keyword,
+ Pageable pageable);
+
+
+ @Modifying
+ @Query("UPDATE SchTeacher t SET t.status = :status, t.updateDate = :updateDate, t.updateUserId = :updateUserId WHERE t.id IN :ids")
+ int batchUpdateStatus(@Param("ids") List ids,
+ @Param("status") Integer status,
+ @Param("updateDate") Date updateDate,
+ @Param("updateUserId") Integer updateUserId);
+
+
+ List findByAccountIn(List accountList);
+
+}
diff --git a/src/main/java/com/bestsch/bschclassmanage/Repository/UpgradeLogRepository.java b/src/main/java/com/bestsch/bschclassmanage/Repository/UpgradeLogRepository.java
new file mode 100644
index 0000000..45be971
--- /dev/null
+++ b/src/main/java/com/bestsch/bschclassmanage/Repository/UpgradeLogRepository.java
@@ -0,0 +1,13 @@
+package com.bestsch.bschclassmanage.Repository;
+
+import com.bestsch.bschclassmanage.entity.UpgradeLog;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
+import org.springframework.stereotype.Repository;
+
+@Repository
+public interface UpgradeLogRepository extends JpaRepository, JpaSpecificationExecutor {
+ boolean existsBySchIdAndSysIdAndYearAndStatus(
+ Integer schId, Integer sysId, Integer year,Boolean status
+ );
+}
diff --git a/src/main/java/com/bestsch/bschclassmanage/Repository/specification/OperationLogSpecifications.java b/src/main/java/com/bestsch/bschclassmanage/Repository/specification/OperationLogSpecifications.java
new file mode 100644
index 0000000..3de80c3
--- /dev/null
+++ b/src/main/java/com/bestsch/bschclassmanage/Repository/specification/OperationLogSpecifications.java
@@ -0,0 +1,42 @@
+package com.bestsch.bschclassmanage.Repository.specification;
+
+import com.bestsch.bschclassmanage.entity.OperationLogRecord;
+import org.springframework.data.jpa.domain.Specification;
+import org.springframework.util.StringUtils;
+
+import javax.persistence.criteria.Predicate;
+
+public class OperationLogSpecifications {
+
+ public static Specification schIdEquals(Integer schId) {
+ return (root, query, cb) -> {
+ if (schId == null || schId <= 0) {
+ return cb.conjunction();
+ }
+ return cb.equal(root.get("schId"), schId);
+ };
+ }
+
+ public static Specification IsSystem(boolean IsSystem) {
+ return (root, query, cb) -> {
+ if (IsSystem) {
+ return cb.equal(root.get("module"), "系统管理");
+ }else{
+ return cb.notEqual(root.get("module"), "系统管理");
+ }
+ };
+ }
+
+ public static Specification keywordLike(String keyword) {
+ return (root, query, cb) -> {
+ if (!StringUtils.hasText(keyword)) {
+ return cb.conjunction();
+ }
+ String likePattern = "%" + keyword.trim() + "%";
+ Predicate p1 = cb.like(root.get("operator"), likePattern);
+ Predicate p2 = cb.like(root.get("module"), likePattern);
+ Predicate p3 = cb.like(root.get("content"), likePattern);
+ return cb.or(p1, p2, p3);
+ };
+ }
+}
\ No newline at end of file
diff --git a/src/main/java/com/bestsch/bschclassmanage/Repository/specification/SchClassSpecifications.java b/src/main/java/com/bestsch/bschclassmanage/Repository/specification/SchClassSpecifications.java
new file mode 100644
index 0000000..26c6625
--- /dev/null
+++ b/src/main/java/com/bestsch/bschclassmanage/Repository/specification/SchClassSpecifications.java
@@ -0,0 +1,138 @@
+package com.bestsch.bschclassmanage.Repository.specification;
+
+import com.bestsch.bschclassmanage.entity.SchClass;
+import com.bestsch.bschclassmanage.entity.SchTeacher;
+import org.springframework.data.jpa.domain.Specification;
+import org.springframework.util.StringUtils;
+
+import javax.persistence.criteria.Join;
+import javax.persistence.criteria.JoinType;
+import javax.persistence.criteria.Predicate;
+import java.util.ArrayList;
+import java.util.List;
+
+public class SchClassSpecifications {
+
+ /**
+ * 按学校 ID 查询(班级表中直接存储了 schId)
+ */
+ public static Specification schIdEquals(Integer schId) {
+ return (root, query, cb) -> {
+ if (schId == null || schId <= 0) {
+ return cb.conjunction();
+ }
+ return cb.equal(root.get("schId"), schId);
+ };
+ }
+
+ /**
+ * 按年级 ID 查询
+ */
+ public static Specification gradeIdEquals(Integer gradeId) {
+ return (root, query, cb) -> {
+ if (gradeId == null || gradeId <= 0) {
+ return cb.conjunction();
+ }
+ return cb.equal(root.get("gradeId"), gradeId);
+ };
+ }
+
+ /**
+ * 按班级名称模糊查询
+ */
+ public static Specification classNameLike(String className) {
+ return (root, query, cb) -> {
+ if (!StringUtils.hasText(className)) {
+ return cb.conjunction();
+ }
+ return cb.like(root.get("className"), "%" + className + "%");
+ };
+ }
+
+ /**
+ * 按班主任教师 ID 查询(firstTeacherId)
+ */
+ public static Specification firstTeacherIdEquals(Integer teacherId) {
+ return (root, query, cb) -> {
+ if (teacherId == null || teacherId <= 0) {
+ return cb.conjunction();
+ }
+ return cb.equal(root.get("firstTeacherId"), teacherId);
+ };
+ }
+
+ /**
+ * 按副班主任教师 ID 查询(secondTeacherId)
+ */
+ public static Specification secondTeacherIdEquals(Integer teacherId) {
+ return (root, query, cb) -> {
+ if (teacherId == null || teacherId <= 0) {
+ return cb.conjunction();
+ }
+ return cb.equal(root.get("secondTeacherId"), teacherId);
+ };
+ }
+
+ /**
+ * 按班主任或副班主任教师 ID 查询(任意一个匹配)
+ */
+ public static Specification teacherIsHeadOrAssistant(Integer teacherId) {
+ return (root, query, cb) -> {
+ if (teacherId == null || teacherId <= 0) {
+ return cb.conjunction();
+ }
+ Predicate p1 = cb.equal(root.get("firstTeacherId"), teacherId);
+ Predicate p2 = cb.equal(root.get("secondTeacherId"), teacherId);
+ return cb.or(p1, p2);
+ };
+ }
+
+ /**
+ * 按年级名称模糊查询(需关联年级表,假设有 @ManyToOne 关系)
+ * 注意:SchClass 实体中需有 grade 关联字段,例如:@ManyToOne @JoinColumn(name = "grade_id") private SchGrade grade;
+ */
+ public static Specification gradeNameLike(String gradeName) {
+ return (root, query, cb) -> {
+ if (!StringUtils.hasText(gradeName)) {
+ return cb.conjunction();
+ }
+ Join