From 770d32a6252f25b55bcb2a704c685e78813f9708 Mon Sep 17 00:00:00 2001 From: liumengyu <2459468901@qq.com> Date: Fri, 28 Aug 2026 17:34:56 +0800 Subject: [PATCH] =?UTF-8?q?bug=E4=BF=AE=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../web/controller/jwgl/JYSController.java | 5 +- .../jwgl/SemesterCalendarController.java | 5 + .../jwgl/StudentRecordsController.java | 34 +++- .../jwgl/TrainingProgramController.java | 1 + .../controller/jwgl/ZYJXJHBController.java | 12 +- .../java/com/roomroot/jwgl/entity/JCXX.java | 4 +- .../java/com/roomroot/jwgl/entity/PXRW.java | 4 +- .../java/com/roomroot/jwgl/entity/XYXX.java | 24 +++ .../com/roomroot/jwgl/mapper/JYSBMapper.xml | 4 +- .../com/roomroot/jwgl/mapper/PXRWMapper.java | 22 +++ .../com/roomroot/jwgl/mapper/PXRWMapper.xml | 38 ++++ .../roomroot/jwgl/mapper/XYKCCJMapper.java | 9 +- .../com/roomroot/jwgl/mapper/XYKCCJMapper.xml | 28 ++- .../com/roomroot/jwgl/mapper/XYXXMapper.java | 9 + .../com/roomroot/jwgl/mapper/XYXXMapper.xml | 34 ++++ .../com/roomroot/jwgl/mapper/ZYBMapper.xml | 5 +- .../jwgl/service/StudentRecordsService.java | 14 +- .../roomroot/jwgl/service/ZYJXJHBService.java | 14 +- .../service/impl/DisciplineServiceImpl.java | 1 + .../impl/SemesterCalendarServiceImpl.java | 2 +- .../impl/StudentRecordsServiceImpl.java | 187 +++++++++++++++++- .../jwgl/service/impl/ZYJXJHBServiceImpl.java | 19 +- .../roomroot/jwgl/vo/StudentListEchoVO.java | 31 +++ 23 files changed, 464 insertions(+), 42 deletions(-) create mode 100644 backend/roomroot-jwgl/src/main/java/com/roomroot/jwgl/mapper/PXRWMapper.java create mode 100644 backend/roomroot-jwgl/src/main/java/com/roomroot/jwgl/mapper/PXRWMapper.xml create mode 100644 backend/roomroot-jwgl/src/main/java/com/roomroot/jwgl/vo/StudentListEchoVO.java diff --git a/backend/roomroot-admin/src/main/java/com/roomroot/web/controller/jwgl/JYSController.java b/backend/roomroot-admin/src/main/java/com/roomroot/web/controller/jwgl/JYSController.java index dd492ca49..f8f919da0 100644 --- a/backend/roomroot-admin/src/main/java/com/roomroot/web/controller/jwgl/JYSController.java +++ b/backend/roomroot-admin/src/main/java/com/roomroot/web/controller/jwgl/JYSController.java @@ -1,5 +1,6 @@ package com.roomroot.web.controller.jwgl; +import com.roomroot.common.utils.StringUtils; import com.roomroot.jwgl.dto.faculty.AddTeacherDTO; import com.roomroot.jwgl.dto.jys.ElectiveCourseBatchDTO; import com.roomroot.jwgl.dto.jys.ElectiveCourseQuery; @@ -119,7 +120,8 @@ public class JYSController { @RequestParam(defaultValue = "20") Integer pageSize, @RequestParam(required = false) String jysdh, @RequestParam(required = false) String jysmc, - @RequestParam(required = false) String bx) { + @RequestParam(required = false) String bx, + @RequestParam(required = false) String ty) { PageQuery query = new PageQuery(); query.setPageNum(pageNum); query.setPageSize(pageSize); @@ -127,6 +129,7 @@ public class JYSController { cond.setJysdh(jysdh); cond.setJysmc(jysmc); cond.setBx(bx); + cond.setTy(StringUtils.hasText(ty) ? Integer.valueOf(ty) : null); PageResult pageResult = facultyService.pageJYSB(query, cond); return Result.success(pageResult); } diff --git a/backend/roomroot-admin/src/main/java/com/roomroot/web/controller/jwgl/SemesterCalendarController.java b/backend/roomroot-admin/src/main/java/com/roomroot/web/controller/jwgl/SemesterCalendarController.java index 8138230a9..085a12941 100644 --- a/backend/roomroot-admin/src/main/java/com/roomroot/web/controller/jwgl/SemesterCalendarController.java +++ b/backend/roomroot-admin/src/main/java/com/roomroot/web/controller/jwgl/SemesterCalendarController.java @@ -42,6 +42,11 @@ public class SemesterCalendarController { */ @PostMapping("/update") public Result update(@RequestBody XQXLB xqxlb) { + + + if(xqxlb.getBh() == null || xqxlb.getBh().trim().isEmpty()){ + return Result.error(200,"编号不得为空"); + } semesterCalendarService.update(xqxlb); return Result.success(); } diff --git a/backend/roomroot-admin/src/main/java/com/roomroot/web/controller/jwgl/StudentRecordsController.java b/backend/roomroot-admin/src/main/java/com/roomroot/web/controller/jwgl/StudentRecordsController.java index 12c477850..b09161a69 100644 --- a/backend/roomroot-admin/src/main/java/com/roomroot/web/controller/jwgl/StudentRecordsController.java +++ b/backend/roomroot-admin/src/main/java/com/roomroot/web/controller/jwgl/StudentRecordsController.java @@ -3,6 +3,7 @@ package com.roomroot.web.controller.jwgl; import com.roomroot.jwgl.entity.XYXX; import com.roomroot.jwgl.entity.XYDNDXQJBXXB; import com.roomroot.jwgl.entity.XYDB; +import com.roomroot.jwgl.entity.PXRW; import com.roomroot.jwgl.entity.XYXJYDSQB; import com.roomroot.jwgl.entity.XYXJYJJGB; import com.roomroot.jwgl.entity.XYXJYJTJB; @@ -44,8 +45,22 @@ public class StudentRecordsController { @Resource private ClassSemesterService classSemesterService; + /** + * 校验培训:按主体培训任务 0/1 查询培训任务。 + * + * @param ztpxrw 主体培训任务,0-否,1-是 + */ + @GetMapping("/training-tasks") + public Result> listTrainingTasks(@RequestParam("ztpxrw") Integer ztpxrw) { + return Result.success(studentRecordsService.listTrainingTasks(ztpxrw)); + } + // ======================== 学员信息维护 ======================== + /** + * 新增学员。 + *

编号由后台生成 UUID;学号按当前班次编号查学员队期表的学号前缀、学号位数顺序生成,保证不重复。

+ */ @PostMapping("/add") public Result add(@RequestBody XYXX xyxx) { studentRecordsService.add(xyxx); @@ -69,6 +84,11 @@ public class StudentRecordsController { return Result.success(studentRecordsService.getById(bh)); } + /** + * 分页查询学员信息。 + *

回显年级、专业、班次、考试情况、不及格门数、管理机构。 + * 当前班次编号关联学员队表、专业表、学员课程成绩。

+ */ @GetMapping("/list") public Result> list(PageQuery query, XYXX xyxx) { return Result.success(studentRecordsService.pageList(query, xyxx)); @@ -385,21 +405,27 @@ public class StudentRecordsController { /** * 分页查询学员的课程成绩列表。 - *

默认不传参数则全部分页展示;可按学员编号、年度筛选;年度不传时默认展示最新年度(最大年度)的数据。

+ *

+ * 按课程编号、学员队编号、学号、年度筛选。学号通过学员编号关联学员信息表匹配。 + *

* * @param pageNum 页码(默认1) * @param pageSize 每页条数(默认20) - * @param xybh 学员编号(可选) + * @param kcbh 课程编号(对应成绩表科目编号,可选) + * @param xydbh 学员队编号(可选) + * @param xh 学号(可选,关联学员信息表) * @param nd 年度(可选) */ @GetMapping("/grades") public Result> getGrades( @RequestParam(defaultValue = "1") Integer pageNum, @RequestParam(defaultValue = "20") Integer pageSize, - @RequestParam(required = false) String xybh, + @RequestParam(required = false) String kcbh, + @RequestParam(required = false) String xydbh, + @RequestParam(required = false) String xh, @RequestParam(required = false) Integer nd) { return Result.success(studentRecordsService.pageCourseGrades( - new PageQuery(pageNum, pageSize), xybh, nd)); + new PageQuery(pageNum, pageSize), kcbh, xydbh, xh, nd)); } /** diff --git a/backend/roomroot-admin/src/main/java/com/roomroot/web/controller/jwgl/TrainingProgramController.java b/backend/roomroot-admin/src/main/java/com/roomroot/web/controller/jwgl/TrainingProgramController.java index 40b3ce4c8..54f798283 100644 --- a/backend/roomroot-admin/src/main/java/com/roomroot/web/controller/jwgl/TrainingProgramController.java +++ b/backend/roomroot-admin/src/main/java/com/roomroot/web/controller/jwgl/TrainingProgramController.java @@ -87,6 +87,7 @@ public class TrainingProgramController { *
  • zydm — 专业代码(模糊匹配)
  • *
  • pxlx — 培训类型(精确匹配,用于版本筛选)
  • *
  • pxcc — 培训层次(精确匹配)
  • + *
  • ty — 停用(精确匹配)
  • * *

    * diff --git a/backend/roomroot-admin/src/main/java/com/roomroot/web/controller/jwgl/ZYJXJHBController.java b/backend/roomroot-admin/src/main/java/com/roomroot/web/controller/jwgl/ZYJXJHBController.java index b4584d920..f241095ff 100644 --- a/backend/roomroot-admin/src/main/java/com/roomroot/web/controller/jwgl/ZYJXJHBController.java +++ b/backend/roomroot-admin/src/main/java/com/roomroot/web/controller/jwgl/ZYJXJHBController.java @@ -2,6 +2,8 @@ package com.roomroot.web.controller.jwgl; import com.roomroot.jwgl.entity.ZYJXJHB; import com.roomroot.jwgl.service.ZYJXJHBService; +import com.roomroot.jwgl.unit.PageQuery; +import com.roomroot.jwgl.unit.PageResult; import com.roomroot.jwgl.unit.Result; import jakarta.servlet.http.HttpServletResponse; import org.springframework.web.bind.annotation.*; @@ -79,9 +81,13 @@ public class ZYJXJHBController { * @param ty 停用标识(0-正常,1-停用) */ @GetMapping("/listByZydhAndTy") - public Result> listByZydhAndTy(@RequestParam("zydh") String zydh, - @RequestParam("ty") Integer ty) { - return Result.success(zyjxjhbService.listByZydhAndTy(zydh, ty)); + public Result> listByZydhAndTy( + @RequestParam(defaultValue = "1") Integer pageNum, + @RequestParam(defaultValue = "20") Integer pageSize, + @RequestParam(required = false) String zydh, + @RequestParam(required = false) Integer ty) { + return Result.success(zyjxjhbService.pageByZydhAndTy( + new PageQuery(pageNum, pageSize), zydh, ty)); } /** diff --git a/backend/roomroot-jwgl/src/main/java/com/roomroot/jwgl/entity/JCXX.java b/backend/roomroot-jwgl/src/main/java/com/roomroot/jwgl/entity/JCXX.java index fd0075e8b..99999133a 100644 --- a/backend/roomroot-jwgl/src/main/java/com/roomroot/jwgl/entity/JCXX.java +++ b/backend/roomroot-jwgl/src/main/java/com/roomroot/jwgl/entity/JCXX.java @@ -18,9 +18,9 @@ import java.time.LocalDateTime; public class JCXX extends BaseEntity { /** - * 教研室代号 + * 主键ID */ - @TableId(value = "ID", type = IdType.INPUT) + @TableId(value = "ID") private String id; /** diff --git a/backend/roomroot-jwgl/src/main/java/com/roomroot/jwgl/entity/PXRW.java b/backend/roomroot-jwgl/src/main/java/com/roomroot/jwgl/entity/PXRW.java index 8c1cca8d9..d929f9bec 100644 --- a/backend/roomroot-jwgl/src/main/java/com/roomroot/jwgl/entity/PXRW.java +++ b/backend/roomroot-jwgl/src/main/java/com/roomroot/jwgl/entity/PXRW.java @@ -3,6 +3,7 @@ package com.roomroot.jwgl.entity; import com.baomidou.mybatisplus.annotation.TableName; import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableField; import com.roomroot.jwgl.unit.BaseEntity; import lombok.Data; import lombok.EqualsAndHashCode; @@ -99,8 +100,9 @@ public class PXRW extends BaseEntity { private String ssdw; /** - * 主体培训任务 + * 主体培训任务:0-否,1-是 */ + @TableField("主体培训任务") private Integer ztpxrw; } diff --git a/backend/roomroot-jwgl/src/main/java/com/roomroot/jwgl/entity/XYXX.java b/backend/roomroot-jwgl/src/main/java/com/roomroot/jwgl/entity/XYXX.java index 006872a07..ef00939ad 100644 --- a/backend/roomroot-jwgl/src/main/java/com/roomroot/jwgl/entity/XYXX.java +++ b/backend/roomroot-jwgl/src/main/java/com/roomroot/jwgl/entity/XYXX.java @@ -216,4 +216,28 @@ public class XYXX { /** 异动历史JSON数组,每条记录含 from/to/time/reason */ @TableField("异动历史") private String transferHistory; + + /** 年级(当前班次关联学员队表,仅列表回显) */ + @TableField(exist = false) + private String nj; + + /** 专业(当前班次关联专业表,仅列表回显) */ + @TableField(exist = false) + private String zy; + + /** 班次(当前班次对应学员队名称,仅列表回显) */ + @TableField(exist = false) + private String bc; + + /** 考试情况(当前班次关联学员课程成绩汇总,仅列表回显) */ + @TableField(exist = false) + private String ksqk; + + /** 不及格门数(当前班次关联学员课程成绩统计,仅列表回显) */ + @TableField(exist = false) + private Integer bjgms; + + /** 管理机构(专业表教学管理机构,仅列表回显) */ + @TableField(exist = false) + private String gljg; } diff --git a/backend/roomroot-jwgl/src/main/java/com/roomroot/jwgl/mapper/JYSBMapper.xml b/backend/roomroot-jwgl/src/main/java/com/roomroot/jwgl/mapper/JYSBMapper.xml index a78a4d4ea..bdbcd5cb8 100644 --- a/backend/roomroot-jwgl/src/main/java/com/roomroot/jwgl/mapper/JYSBMapper.xml +++ b/backend/roomroot-jwgl/src/main/java/com/roomroot/jwgl/mapper/JYSBMapper.xml @@ -34,7 +34,9 @@ AND 部系 LIKE CONCAT('%', #{jysb.bx}, '%') - ORDER BY 序号 + + AND 停用 = #{jysb.ty} + diff --git a/backend/roomroot-jwgl/src/main/java/com/roomroot/jwgl/mapper/PXRWMapper.java b/backend/roomroot-jwgl/src/main/java/com/roomroot/jwgl/mapper/PXRWMapper.java new file mode 100644 index 000000000..bde2fb6d5 --- /dev/null +++ b/backend/roomroot-jwgl/src/main/java/com/roomroot/jwgl/mapper/PXRWMapper.java @@ -0,0 +1,22 @@ +package com.roomroot.jwgl.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.roomroot.jwgl.entity.PXRW; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * 培训任务 Mapper。 + */ +@Mapper +public interface PXRWMapper extends BaseMapper { + + /** + * 按主体培训任务标志查询培训任务。 + * + * @param ztpxrw 主体培训任务:0-否,1-是 + */ + List selectByZtpxrw(@Param("ztpxrw") Integer ztpxrw); +} diff --git a/backend/roomroot-jwgl/src/main/java/com/roomroot/jwgl/mapper/PXRWMapper.xml b/backend/roomroot-jwgl/src/main/java/com/roomroot/jwgl/mapper/PXRWMapper.xml new file mode 100644 index 000000000..468fa6c1f --- /dev/null +++ b/backend/roomroot-jwgl/src/main/java/com/roomroot/jwgl/mapper/PXRWMapper.xml @@ -0,0 +1,38 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + "标识号", "序号", "任务来源", "年级", "在校状态", "任务类别", + "入学日期", "毕业日期", "备注", "学科专业信息标识号", "名称", + "计划人数", "任务说明", "计划班次数", "JSONZD", "所属单位", "主体培训任务" + + + + + diff --git a/backend/roomroot-jwgl/src/main/java/com/roomroot/jwgl/mapper/XYKCCJMapper.java b/backend/roomroot-jwgl/src/main/java/com/roomroot/jwgl/mapper/XYKCCJMapper.java index 9ea40cca4..6b4350364 100644 --- a/backend/roomroot-jwgl/src/main/java/com/roomroot/jwgl/mapper/XYKCCJMapper.java +++ b/backend/roomroot-jwgl/src/main/java/com/roomroot/jwgl/mapper/XYKCCJMapper.java @@ -16,11 +16,14 @@ public interface XYKCCJMapper extends BaseMapper { /** * 分页条件查询课程成绩。 - *

    学员编号、年度可选;年度未传时默认取最大年度(最新年度)的数据。

    + *

    按课程编号(科目编号)、学员队编号、学号、年度筛选。学号经学员编号关联学员信息表匹配。

    */ Page selectPageByCondition(Page page, - @Param("xybh") String xybh, - @Param("nd") Integer nd); + @Param("kcbh") String kcbh, + @Param("xydbh") String xydbh, + @Param("xh") String xh, + @Param("nd") Integer nd, + @Param("xybh") String xybh); /** 按学员队查询成绩(含学员姓名学号) */ List selectGradeByXydbh(@Param("xydbh") String xydbh, @Param("kmbh") String kmbh); diff --git a/backend/roomroot-jwgl/src/main/java/com/roomroot/jwgl/mapper/XYKCCJMapper.xml b/backend/roomroot-jwgl/src/main/java/com/roomroot/jwgl/mapper/XYKCCJMapper.xml index b10afdc98..e1650f01d 100644 --- a/backend/roomroot-jwgl/src/main/java/com/roomroot/jwgl/mapper/XYKCCJMapper.xml +++ b/backend/roomroot-jwgl/src/main/java/com/roomroot/jwgl/mapper/XYKCCJMapper.xml @@ -36,21 +36,31 @@ ORDER BY 年度 DESC, 科目编号 - + diff --git a/backend/roomroot-jwgl/src/main/java/com/roomroot/jwgl/mapper/XYXXMapper.java b/backend/roomroot-jwgl/src/main/java/com/roomroot/jwgl/mapper/XYXXMapper.java index 5150ba6b6..37270eef6 100644 --- a/backend/roomroot-jwgl/src/main/java/com/roomroot/jwgl/mapper/XYXXMapper.java +++ b/backend/roomroot-jwgl/src/main/java/com/roomroot/jwgl/mapper/XYXXMapper.java @@ -3,9 +3,12 @@ package com.roomroot.jwgl.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.roomroot.jwgl.entity.XYXX; +import com.roomroot.jwgl.vo.StudentListEchoVO; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; +import java.util.List; + /** * 学员信息表 Mapper */ @@ -16,4 +19,10 @@ public interface XYXXMapper extends BaseMapper { * 分页查询学员信息(支持条件筛选) */ Page selectPageList(Page page, @Param("xyxx") XYXX xyxx); + + /** + * 按学员编号批量回显年级、专业、班次、考试情况、不及格门数、管理机构。 + * 当前班次编号关联学员队表、专业表、学员课程成绩。 + */ + List selectEchoByStudentIds(@Param("ids") List ids); } diff --git a/backend/roomroot-jwgl/src/main/java/com/roomroot/jwgl/mapper/XYXXMapper.xml b/backend/roomroot-jwgl/src/main/java/com/roomroot/jwgl/mapper/XYXXMapper.xml index 3290e35c4..9bcf6b1f4 100644 --- a/backend/roomroot-jwgl/src/main/java/com/roomroot/jwgl/mapper/XYXXMapper.xml +++ b/backend/roomroot-jwgl/src/main/java/com/roomroot/jwgl/mapper/XYXXMapper.xml @@ -89,4 +89,38 @@ ORDER BY 学号 + + + diff --git a/backend/roomroot-jwgl/src/main/java/com/roomroot/jwgl/mapper/ZYBMapper.xml b/backend/roomroot-jwgl/src/main/java/com/roomroot/jwgl/mapper/ZYBMapper.xml index 8ad3b6970..634802549 100644 --- a/backend/roomroot-jwgl/src/main/java/com/roomroot/jwgl/mapper/ZYBMapper.xml +++ b/backend/roomroot-jwgl/src/main/java/com/roomroot/jwgl/mapper/ZYBMapper.xml @@ -49,7 +49,10 @@ SELECT FROM "专业表" - WHERE 停用 = 0 + WHERE 1=1 + + AND 停用 = #{zyb.ty}, + AND 专业名称 LIKE CONCAT('%', #{zyb.zymc}, '%') diff --git a/backend/roomroot-jwgl/src/main/java/com/roomroot/jwgl/service/StudentRecordsService.java b/backend/roomroot-jwgl/src/main/java/com/roomroot/jwgl/service/StudentRecordsService.java index a372e2846..0e64821f8 100644 --- a/backend/roomroot-jwgl/src/main/java/com/roomroot/jwgl/service/StudentRecordsService.java +++ b/backend/roomroot-jwgl/src/main/java/com/roomroot/jwgl/service/StudentRecordsService.java @@ -2,6 +2,7 @@ package com.roomroot.jwgl.service; import com.roomroot.jwgl.entity.XYXX; import com.roomroot.jwgl.entity.XYDB; +import com.roomroot.jwgl.entity.PXRW; import com.roomroot.jwgl.entity.XYXJYDSQB; import com.roomroot.jwgl.entity.XYXJYJJGB; import com.roomroot.jwgl.entity.XYXJYJTJB; @@ -23,7 +24,7 @@ import java.util.List; */ public interface StudentRecordsService { - /** 新增学员 */ + /** 新增学员。编号后台生成 UUID;学号按当前班次在学员队期表的学号前缀、学号位数顺序生成。 */ void add(XYXX xyxx); /** 删除学员(退学处理) */ @@ -47,8 +48,8 @@ public interface StudentRecordsService { // ========== 学员课程成绩查询 ========== - /** 分页查询学员的课程成绩列表(按学员编号、年度筛选,年度为空默认最新年度) */ - PageResult pageCourseGrades(PageQuery query, String xybh, Integer nd); + /** 分页查询学员的课程成绩列表(按课程编号、学员队编号、学号、年度筛选) */ + PageResult pageCourseGrades(PageQuery query, String kcbh, String xydbh, String xh, Integer nd); /** 分页查询学员的课程过程成绩列表(按学员编号、年度筛选,年度为空默认最新年度) */ PageResult pageCourseProcessGrades(PageQuery query, String xybh, Integer nd); @@ -127,4 +128,11 @@ public interface StudentRecordsService { /** 从 Excel(.xls/.xlsx) 批量导入学员信息 */ int importStudents(MultipartFile file) throws Exception; + + /** + * 按主体培训任务标志查询培训任务。 + * + * @param ztpxrw 主体培训任务:0-否,1-是 + */ + List listTrainingTasks(Integer ztpxrw); } diff --git a/backend/roomroot-jwgl/src/main/java/com/roomroot/jwgl/service/ZYJXJHBService.java b/backend/roomroot-jwgl/src/main/java/com/roomroot/jwgl/service/ZYJXJHBService.java index 1813b9bb2..d24c57bfa 100644 --- a/backend/roomroot-jwgl/src/main/java/com/roomroot/jwgl/service/ZYJXJHBService.java +++ b/backend/roomroot-jwgl/src/main/java/com/roomroot/jwgl/service/ZYJXJHBService.java @@ -1,6 +1,8 @@ package com.roomroot.jwgl.service; import com.roomroot.jwgl.entity.ZYJXJHB; +import com.roomroot.jwgl.unit.PageQuery; +import com.roomroot.jwgl.unit.PageResult; import java.util.List; @@ -53,13 +55,15 @@ public interface ZYJXJHBService { List list(); /** - * 根据专业代号和停用标识查询 + * 分页查询专业教学计划。 + *

    专业代号、停用标识可选,传了才作为等值条件过滤;不传则查询全部。

    * - * @param zydh 专业代号 - * @param ty 停用标识(0-正常,1-停用) - * @return 列表 + * @param query 分页参数 + * @param zydh 专业代号(可选) + * @param ty 停用标识(可选,0-正常,1-停用) + * @return 分页结果 */ - List listByZydhAndTy(String zydh, Integer ty); + PageResult pageByZydhAndTy(PageQuery query, String zydh, Integer ty); /** 从 Excel(.xls/.xlsx) 导入专业教学计划 */ int importZYJXJHBFromExcel(org.springframework.web.multipart.MultipartFile file) throws Exception; diff --git a/backend/roomroot-jwgl/src/main/java/com/roomroot/jwgl/service/impl/DisciplineServiceImpl.java b/backend/roomroot-jwgl/src/main/java/com/roomroot/jwgl/service/impl/DisciplineServiceImpl.java index 0c931fd1b..b3798ca10 100644 --- a/backend/roomroot-jwgl/src/main/java/com/roomroot/jwgl/service/impl/DisciplineServiceImpl.java +++ b/backend/roomroot-jwgl/src/main/java/com/roomroot/jwgl/service/impl/DisciplineServiceImpl.java @@ -44,6 +44,7 @@ public class DisciplineServiceImpl implements DisciplineService { @Transactional public void add(XKZYXX entity) { entity.setTy(0); + entity.setBsh(UuidUtil.getUUID()); SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); entity.setTysj(sdf.format(new Date())); xkzyxxMapper.insert(entity); diff --git a/backend/roomroot-jwgl/src/main/java/com/roomroot/jwgl/service/impl/SemesterCalendarServiceImpl.java b/backend/roomroot-jwgl/src/main/java/com/roomroot/jwgl/service/impl/SemesterCalendarServiceImpl.java index 8af48c650..bed7fe9e9 100644 --- a/backend/roomroot-jwgl/src/main/java/com/roomroot/jwgl/service/impl/SemesterCalendarServiceImpl.java +++ b/backend/roomroot-jwgl/src/main/java/com/roomroot/jwgl/service/impl/SemesterCalendarServiceImpl.java @@ -39,7 +39,6 @@ public class SemesterCalendarServiceImpl implements SemesterCalendarService { XQXLB query = new XQXLB(); //将日期分为年度和月日 LocalDate date = LocalDate.parse(dateStr, DateTimeFormatter.ofPattern("yyyy-MM-dd")); - int nd = date.getYear(); String md = String.format("%02d%02d", date.getMonthValue(), date.getDayOfMonth()); query.setJqsj(md); @@ -81,6 +80,7 @@ public class SemesterCalendarServiceImpl implements SemesterCalendarService { @Override public void update(XQXLB xqxlb) { + xqxlbMapper.updateById(xqxlb); } diff --git a/backend/roomroot-jwgl/src/main/java/com/roomroot/jwgl/service/impl/StudentRecordsServiceImpl.java b/backend/roomroot-jwgl/src/main/java/com/roomroot/jwgl/service/impl/StudentRecordsServiceImpl.java index 3234ec553..86d1fe3dd 100644 --- a/backend/roomroot-jwgl/src/main/java/com/roomroot/jwgl/service/impl/StudentRecordsServiceImpl.java +++ b/backend/roomroot-jwgl/src/main/java/com/roomroot/jwgl/service/impl/StudentRecordsServiceImpl.java @@ -7,6 +7,8 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.roomroot.common.exception.ServiceException; import com.roomroot.jwgl.entity.XYXX; import com.roomroot.jwgl.entity.XYDB; +import com.roomroot.jwgl.entity.XYDQB; +import com.roomroot.jwgl.entity.PXRW; import com.roomroot.jwgl.entity.XYXJYDSQB; import com.roomroot.jwgl.entity.XYXJYJJGB; import com.roomroot.jwgl.entity.XYXJYJTJB; @@ -14,6 +16,8 @@ import com.roomroot.jwgl.entity.XYKCCJ; import com.roomroot.jwgl.entity.XYKCGCCJ; import com.roomroot.jwgl.mapper.XYXXMapper; import com.roomroot.jwgl.mapper.XYDBMapper; +import com.roomroot.jwgl.mapper.XYDQBMapper; +import com.roomroot.jwgl.mapper.PXRWMapper; import com.roomroot.jwgl.mapper.XYXJYDSQBMapper; import com.roomroot.jwgl.mapper.XYXJYJJGBMapper; import com.roomroot.jwgl.mapper.XYXJYJTJBMapper; @@ -24,6 +28,8 @@ import com.roomroot.jwgl.unit.PageQuery; import com.roomroot.jwgl.unit.PageResult; import com.roomroot.jwgl.utils.ExcelParseUtil; import com.roomroot.jwgl.utils.JwglRoleHelper; +import com.roomroot.jwgl.utils.UuidUtil; +import com.roomroot.jwgl.vo.StudentListEchoVO; import jakarta.servlet.http.HttpServletResponse; import org.apache.poi.hssf.usermodel.HSSFWorkbook; import org.apache.poi.ss.usermodel.*; @@ -39,7 +45,10 @@ import java.lang.reflect.Field; import java.net.URLEncoder; import java.nio.charset.StandardCharsets; import java.time.LocalDateTime; +import java.util.ArrayList; +import java.util.HashMap; import java.util.List; +import java.util.Map; import java.util.Set; import static com.roomroot.jwgl.utils.BasicManagementConstants.FORBIDDEN; @@ -56,6 +65,12 @@ public class StudentRecordsServiceImpl implements StudentRecordsService { @Resource private XYDBMapper xydbMapper; + @Resource + private XYDQBMapper xydqbMapper; + + @Resource + private PXRWMapper pxrwMapper; + @Resource private XYXJYDSQBMapper xyxjydsqbMapper; @@ -78,12 +93,112 @@ public class StudentRecordsServiceImpl implements StudentRecordsService { @Transactional public void add(XYXX xyxx) { denyStudentWrite(); + if (xyxx == null) { + throw new ServiceException("学员信息不能为空"); + } + String classId = trimToNull(xyxx.getDqbzbh()); + if (classId == null) { + throw new ServiceException("当前班次编号不能为空"); + } + xyxx.setDqbzbh(classId); + xyxx.setBh(UuidUtil.getOriginalUUID()); + XYDQB period = findPeriodByClassId(classId); + if (period == null) { + throw new ServiceException("未找到当前班次对应的学员队期,无法生成学号"); + } + xyxx.setXh(generateStudentNumber(period, classId)); + if (trimToNull(xyxx.getXydqbh()) == null) { + xyxx.setXydqbh(period.getBh()); + } xyxx.setTxzt(0); xyxx.setLjzt(0); xyxx.setFbzt(0); xyxxMapper.insert(xyxx); } + /** + * 按当前班次在学员队期表中的学号前缀、学号位数,顺序生成不重复学号。 + */ + private String generateStudentNumber(XYDQB period, String classId) { + String prefix = period.getXhqz() == null ? "" : period.getXhqz().trim(); + int digits = (period.getXhws() == null || period.getXhws() <= 0) ? 3 : period.getXhws(); + int seq = maxSequence(prefix, digits, classId) + 1; + int max = (int) Math.pow(10, digits) - 1; + while (seq <= max) { + String studentNo = prefix + padNumber(seq, digits); + Long exists = xyxxMapper.selectCount(new LambdaQueryWrapper().eq(XYXX::getXh, studentNo)); + if (exists == null || exists == 0) { + return studentNo; + } + seq++; + } + throw new ServiceException("该班次学号已用尽,请调整学员队期的学号位数"); + } + + private XYDQB findPeriodByClassId(String classId) { + return xydqbMapper.selectOne(new LambdaQueryWrapper() + .eq(XYDQB::getXydbh, classId) + .orderByDesc(XYDQB::getRxrq) + .last("LIMIT 1")); + } + + private int maxSequence(String prefix, int digits, String classId) { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + if (!prefix.isEmpty()) { + wrapper.likeRight(XYXX::getXh, prefix); + } else { + wrapper.eq(XYXX::getDqbzbh, classId); + } + wrapper.select(XYXX::getXh); + List list = xyxxMapper.selectList(wrapper); + int max = 0; + int prefixLen = prefix.length(); + int expectedLen = prefixLen + digits; + for (XYXX row : list) { + if (row == null || row.getXh() == null) { + continue; + } + String xh = row.getXh().trim(); + if (!xh.startsWith(prefix) || xh.length() != expectedLen) { + continue; + } + String suffix = xh.substring(prefixLen); + if (!isDigits(suffix)) { + continue; + } + int value = Integer.parseInt(suffix); + if (value > max) { + max = value; + } + } + return max; + } + + private String padNumber(int value, int digits) { + String text = String.valueOf(value); + if (text.length() >= digits) { + return text; + } + StringBuilder builder = new StringBuilder(digits); + for (int i = text.length(); i < digits; i++) { + builder.append('0'); + } + builder.append(text); + return builder.toString(); + } + + private boolean isDigits(String text) { + if (text == null || text.isEmpty()) { + return false; + } + for (int i = 0; i < text.length(); i++) { + if (!Character.isDigit(text.charAt(i))) { + return false; + } + } + return true; + } + @Override @Transactional public void delete(String bh) { @@ -115,10 +230,51 @@ public class StudentRecordsServiceImpl implements StudentRecordsService { } Page page = new Page<>(query.getPageNum(), query.getPageSize()); Page result = xyxxMapper.selectPage(page, buildQueryWrapper(filter)); + fillListEcho(result.getRecords()); return new PageResult<>(result.getRecords(), result.getTotal(), query.getPageNum(), query.getPageSize()); } + /** + * 当前班次编号关联学员队表、专业表、学员课程成绩,回显年级、专业、班次、考试情况、不及格门数、管理机构。 + */ + private void fillListEcho(List records) { + if (records == null || records.isEmpty()) { + return; + } + List ids = new ArrayList<>(); + for (XYXX row : records) { + if (row != null && row.getBh() != null && !row.getBh().isEmpty()) { + ids.add(row.getBh()); + } + } + if (ids.isEmpty()) { + return; + } + List echos = xyxxMapper.selectEchoByStudentIds(ids); + if (echos == null || echos.isEmpty()) { + return; + } + Map byId = new HashMap<>(); + for (StudentListEchoVO echo : echos) { + if (echo != null && echo.getBh() != null) { + byId.put(echo.getBh(), echo); + } + } + for (XYXX row : records) { + StudentListEchoVO echo = byId.get(row.getBh()); + if (echo == null) { + continue; + } + row.setNj(echo.getNj()); + row.setZy(echo.getZy()); + row.setBc(echo.getBc()); + row.setKsqk(echo.getKsqk()); + row.setBjgms(echo.getBjgms() == null ? 0 : echo.getBjgms()); + row.setGljg(echo.getGljg()); + } + } + /** * 全字段动态查询条件。 *

    @@ -135,6 +291,10 @@ public class StudentRecordsServiceImpl implements StudentRecordsService { // 需要模糊匹配的字段(属性名) Set fuzzyFields = Set.of("xm", "lxdh", "txdz"); for (Field field : XYXX.class.getDeclaredFields()) { + TableField tableField = field.getAnnotation(TableField.class); + if (tableField != null && !tableField.exist()) { + continue; + } Object value = getFieldValue(field, query); if (value == null || !(value instanceof String) || ((String) value).isEmpty()) { continue; @@ -191,13 +351,14 @@ public class StudentRecordsServiceImpl implements StudentRecordsService { // ========== 学员课程成绩查询 ========== @Override - public PageResult pageCourseGrades(PageQuery query, String xybh, Integer nd) { - String studentId = xybh; + public PageResult pageCourseGrades(PageQuery query, String kcbh, String xydbh, String xh, Integer nd) { + String selfStudentId = null; if (jwglRoleHelper.isStudent()) { - studentId = jwglRoleHelper.requireStudentId(); + selfStudentId = jwglRoleHelper.requireStudentId(); } Page page = new Page<>(query.getPageNum(), query.getPageSize()); - Page result = xykccjMapper.selectPageByCondition(page, studentId, nd); + Page result = xykccjMapper.selectPageByCondition( + page, trimToNull(kcbh), trimToNull(xydbh), trimToNull(xh), nd, selfStudentId); return new PageResult<>(result.getRecords(), result.getTotal(), query.getPageNum(), query.getPageSize()); } @@ -387,6 +548,7 @@ public class StudentRecordsServiceImpl implements StudentRecordsService { @Transactional public void addApplication(XYXJYDSQB entity) { LocalDateTime now = LocalDateTime.now(); + entity.setBh(UuidUtil.getUUID()); entity.setCjsj(now); entity.setXgsj(now); // 状态默认待审核(0) @@ -668,7 +830,24 @@ public class StudentRecordsServiceImpl implements StudentRecordsService { return list.size(); } + @Override + public List listTrainingTasks(Integer ztpxrw) { + if (ztpxrw == null || (ztpxrw != 0 && ztpxrw != 1)) { + throw new ServiceException("主体培训任务只能为 0 或 1"); + } + List list = pxrwMapper.selectByZtpxrw(ztpxrw); + return list == null ? new ArrayList<>() : list; + } + private String nvl(String value) { return value == null ? "" : value; } + + private String trimToNull(String value) { + if (value == null) { + return null; + } + String text = value.trim(); + return text.isEmpty() ? null : text; + } } diff --git a/backend/roomroot-jwgl/src/main/java/com/roomroot/jwgl/service/impl/ZYJXJHBServiceImpl.java b/backend/roomroot-jwgl/src/main/java/com/roomroot/jwgl/service/impl/ZYJXJHBServiceImpl.java index 9ee21f514..9886daff3 100644 --- a/backend/roomroot-jwgl/src/main/java/com/roomroot/jwgl/service/impl/ZYJXJHBServiceImpl.java +++ b/backend/roomroot-jwgl/src/main/java/com/roomroot/jwgl/service/impl/ZYJXJHBServiceImpl.java @@ -2,9 +2,12 @@ package com.roomroot.jwgl.service.impl; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.roomroot.jwgl.entity.ZYJXJHB; import com.roomroot.jwgl.mapper.ZYJXJHBMapper; import com.roomroot.jwgl.service.ZYJXJHBService; +import com.roomroot.jwgl.unit.PageQuery; +import com.roomroot.jwgl.unit.PageResult; import com.roomroot.jwgl.utils.UuidUtil; import org.springframework.stereotype.Service; @@ -65,11 +68,19 @@ public class ZYJXJHBServiceImpl implements ZYJXJHBService { } @Override - public List listByZydhAndTy(String zydh, Integer ty) { + public PageResult pageByZydhAndTy(PageQuery query, String zydh, Integer ty) { + Page page = new Page<>(query.getPageNum(), query.getPageSize()); LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); - wrapper.eq(ZYJXJHB::getZydh, zydh) - .eq(ZYJXJHB::getTy, ty); - return zyjxjhbMapper.selectList(wrapper); + if (zydh != null && !zydh.isEmpty()) { + wrapper.eq(ZYJXJHB::getZydh, zydh); + } + if (ty != null) { + wrapper.eq(ZYJXJHB::getTy, ty); + } + wrapper.orderByAsc(ZYJXJHB::getZydh); + Page result = zyjxjhbMapper.selectPage(page, wrapper); + return new PageResult<>(result.getRecords(), result.getTotal(), + query.getPageNum(), query.getPageSize()); } @Override diff --git a/backend/roomroot-jwgl/src/main/java/com/roomroot/jwgl/vo/StudentListEchoVO.java b/backend/roomroot-jwgl/src/main/java/com/roomroot/jwgl/vo/StudentListEchoVO.java new file mode 100644 index 000000000..703a8e0b0 --- /dev/null +++ b/backend/roomroot-jwgl/src/main/java/com/roomroot/jwgl/vo/StudentListEchoVO.java @@ -0,0 +1,31 @@ +package com.roomroot.jwgl.vo; + +import lombok.Data; + +/** + * 学员列表回显字段:年级、专业、班次、考试情况、不及格门数、管理机构。 + */ +@Data +public class StudentListEchoVO { + + /** 学员编号 */ + private String bh; + + /** 年级 */ + private String nj; + + /** 专业 */ + private String zy; + + /** 班次 */ + private String bc; + + /** 考试情况 */ + private String ksqk; + + /** 不及格门数 */ + private Integer bjgms; + + /** 管理机构 */ + private String gljg; +}