diff --git a/backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/domain/vo/XgDormBedDetailVo.java b/backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/domain/vo/XgDormBedDetailVo.java index 8b260a48..3745b84e 100644 --- a/backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/domain/vo/XgDormBedDetailVo.java +++ b/backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/domain/vo/XgDormBedDetailVo.java @@ -199,4 +199,21 @@ public class XgDormBedDetailVo implements Serializable { */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") private Date updateTime; + + // =============== 请假信息 =============== + + private LeaveInfo leaveInfo; + + @Data + public static class LeaveInfo implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + + private Long leaveId; + private String leaveTypeName; + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date leaveStartTime; + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date leaveEndTime; + } } diff --git a/backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/service/impl/XgDormBedServiceImpl.java b/backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/service/impl/XgDormBedServiceImpl.java index f742846d..8132cdb4 100644 --- a/backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/service/impl/XgDormBedServiceImpl.java +++ b/backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/service/impl/XgDormBedServiceImpl.java @@ -16,12 +16,13 @@ import org.dromara.xg.domain.vo.XgDormBedDetailVo; import org.dromara.xg.domain.XgDormBed; import org.dromara.xg.domain.XgDormRoom; import org.dromara.xg.domain.XgDormBedStudent; -import org.dromara.xg.domain.XgSysDept; +import org.dromara.xg.domain.vo.XgStudentLeaveVo; import org.dromara.xg.mapper.XgDormBedMapper; import org.dromara.xg.mapper.XgDormRoomMapper; import org.dromara.xg.mapper.XgDormBedStudentMapper; import org.dromara.xg.mapper.XgSysDeptMapper; import org.dromara.xg.service.IXgDormBedService; +import org.dromara.xg.service.IXgStudentLeaveService; import org.dromara.common.satoken.utils.LoginHelper; import java.util.List; @@ -31,6 +32,8 @@ import java.util.Set; import java.util.stream.Collectors; import java.util.ArrayList; import java.util.HashSet; +import java.util.Objects; +import java.time.LocalDateTime; /** * 宿舍床位信息Service业务层处理 @@ -47,6 +50,7 @@ public class XgDormBedServiceImpl implements IXgDormBedService { private final XgDormRoomMapper xgDormRoomMapper; private final XgDormBedStudentMapper xgDormBedStudentMapper; private final XgSysDeptMapper xgSysDeptMapper; + private final IXgStudentLeaveService xgStudentLeaveService; /** * 查询宿舍床位信息 @@ -160,9 +164,25 @@ public class XgDormBedServiceImpl implements IXgDormBedService { public List queryBedDetailsByRoomId(Long roomId) { List result = new ArrayList<>(); - // 第一步:从 xg_dorm_bed_student 为主表查有学生的床位 List> studentBeds = xgDormBedStudentMapper.selectRoomStudents(roomId); + List studentIds = studentBeds.stream() + .map(row -> { + Object studentId = row.get("student_id"); + if (studentId instanceof Number) { + return ((Number) studentId).longValue(); + } + return null; + }) + .filter(Objects::nonNull) + .collect(Collectors.toList()); + + Map leaveMap = Map.of(); + if (!studentIds.isEmpty()) { + leaveMap = xgStudentLeaveService.queryStudentLeavesByCheckDate( + studentIds, LocalDateTime.now()); + } + Set occupiedBedIds = new HashSet<>(); for (Map row : studentBeds) { XgDormBedDetailVo vo = new XgDormBedDetailVo(); @@ -184,10 +204,24 @@ public class XgDormBedServiceImpl implements IXgDormBedService { vo.setMajorName(row.get("major_name") != null ? row.get("major_name").toString() : null); vo.setAssignmentStatus("0"); vo.setBedStatus("1"); + + Object studentIdObj = row.get("student_id"); + if (studentIdObj instanceof Number) { + Long studentIdValue = ((Number) studentIdObj).longValue(); + XgStudentLeaveVo leaveVo = leaveMap.get(studentIdValue); + if (leaveVo != null) { + XgDormBedDetailVo.LeaveInfo leaveInfo = new XgDormBedDetailVo.LeaveInfo(); + leaveInfo.setLeaveId(leaveVo.getId()); + leaveInfo.setLeaveTypeName(leaveVo.getLeaveTypeName()); + leaveInfo.setLeaveStartTime(leaveVo.getStartTime()); + leaveInfo.setLeaveEndTime(leaveVo.getEndTime()); + vo.setLeaveInfo(leaveInfo); + } + } + result.add(vo); } - // 第二步:补查 xg_dorm_bed 中未被分配的空床位 List emptyBeds = baseMapper.selectList( Wrappers.lambdaQuery() .eq(XgDormBed::getRoomId, roomId) diff --git a/backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/service/impl/XgDormBedStudentServiceImpl.java b/backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/service/impl/XgDormBedStudentServiceImpl.java index 3d1a9036..c5ca775d 100644 --- a/backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/service/impl/XgDormBedStudentServiceImpl.java +++ b/backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/service/impl/XgDormBedStudentServiceImpl.java @@ -33,11 +33,14 @@ import java.util.ArrayList; import java.util.HashMap; import java.util.Objects; import java.util.Collections; +import java.time.LocalDateTime; import org.dromara.xg.domain.bo.XgDormBedBatchRecallBo; import org.dromara.xg.domain.bo.XgDormSelectiveAllocationBo; import org.dromara.xg.mapper.XgStudentMsgMapper; import org.dromara.xg.domain.XgStudentMsg; +import org.dromara.xg.service.IXgStudentLeaveService; +import org.dromara.xg.domain.vo.XgStudentLeaveVo; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import org.dromara.common.satoken.utils.LoginHelper; import org.dromara.xg.domain.vo.DormBuildingTreeVo; @@ -75,6 +78,7 @@ public class XgDormBedStudentServiceImpl implements IXgDormBedStudentService { private final XgDormAreaMapper xgDormAreaMapper; private final XgSysDeptMapper xgSysDeptMapper; private final XgClassMsgMapper xgClassMsgMapper; + private final IXgStudentLeaveService xgStudentLeaveService; /** * 查询床位学生分配关系 @@ -2457,6 +2461,7 @@ public class XgDormBedStudentServiceImpl implements IXgDormBedStudentService { /** * 根据房间ID获取住在当前房间的所有学生信息 * 包含学生姓名、学号、性别、学院名称、专业名称、班级名称、床位编码、床位ID + * 同时查询当前时间有效的请假信息 */ @Override public List getRoomStudents(Long roomId) { @@ -2466,6 +2471,23 @@ public class XgDormBedStudentServiceImpl implements IXgDormBedStudentService { // 使用SQL关联查询,一次性获取所有信息 List> studentDetails = baseMapper.selectRoomStudents(roomId); + List studentIds = studentDetails.stream() + .map(detail -> { + Object studentId = detail.get("student_id"); + if (studentId instanceof Number) { + return ((Number) studentId).longValue(); + } + return null; + }) + .filter(Objects::nonNull) + .collect(Collectors.toList()); + + Map leaveMap = Map.of(); + if (!studentIds.isEmpty()) { + leaveMap = xgStudentLeaveService.queryStudentLeavesByCheckDate( + studentIds, LocalDateTime.now()); + } + List result = new ArrayList<>(); for (Map detailMap : studentDetails) { @@ -2488,6 +2510,20 @@ public class XgDormBedStudentServiceImpl implements IXgDormBedStudentService { studentInfo.put("bedCode", detailMap.get("bed_code")); studentInfo.put("bedId", detailMap.get("bed_id")); + Object studentIdObj = detailMap.get("student_id"); + if (studentIdObj instanceof Number) { + Long studentIdValue = ((Number) studentIdObj).longValue(); + XgStudentLeaveVo leaveInfo = leaveMap.get(studentIdValue); + if (leaveInfo != null) { + Map leaveInfoMap = new LinkedHashMap<>(); + leaveInfoMap.put("leaveId", leaveInfo.getId()); + leaveInfoMap.put("leaveTypeName", leaveInfo.getLeaveTypeName()); + leaveInfoMap.put("leaveStartTime", leaveInfo.getStartTime()); + leaveInfoMap.put("leaveEndTime", leaveInfo.getEndTime()); + studentInfo.put("leaveInfo", leaveInfoMap); + } + } + result.add(studentInfo); } diff --git a/backend/ruoyi-modules/ruoyi-zsjy/src/main/java/org/dromara/zsjy/controller/ZsjyEnrollmentInfoController.java b/backend/ruoyi-modules/ruoyi-zsjy/src/main/java/org/dromara/zsjy/controller/ZsjyEnrollmentInfoController.java index 34c2a7d8..f7c1cae8 100644 --- a/backend/ruoyi-modules/ruoyi-zsjy/src/main/java/org/dromara/zsjy/controller/ZsjyEnrollmentInfoController.java +++ b/backend/ruoyi-modules/ruoyi-zsjy/src/main/java/org/dromara/zsjy/controller/ZsjyEnrollmentInfoController.java @@ -22,9 +22,9 @@ import org.dromara.common.excel.utils.ExcelUtil; import org.dromara.zsjy.domain.vo.ZsjyEnrollmentInfoVo; import org.dromara.zsjy.domain.bo.ZsjyEnrollmentInfoBo; import org.dromara.zsjy.service.IZsjyEnrollmentInfoService; +import org.dromara.zsjy.service.IZsjyEnrollmentMajorService; +import org.dromara.zsjy.domain.vo.ZsjyEnrollmentDeptVo; import org.dromara.common.mybatis.core.page.TableDataInfo; -import org.dromara.xg.service.IXgSysDeptService; -import org.dromara.xg.domain.vo.XgSysDeptVo; /** * 招生报名信息Controller @@ -39,7 +39,7 @@ import org.dromara.xg.domain.vo.XgSysDeptVo; public class ZsjyEnrollmentInfoController extends BaseController { private final IZsjyEnrollmentInfoService enrollmentInfoService; - private final IXgSysDeptService xgSysDeptService; + private final IZsjyEnrollmentMajorService enrollmentMajorService; /** * 查询招生报名信息列表 @@ -164,10 +164,9 @@ public class ZsjyEnrollmentInfoController extends BaseController { */ @SaIgnore @GetMapping("/colleges") - public R> getColleges() { + public R> getColleges() { try { - // 调用学院部门服务获取学院列表 - List colleges = xgSysDeptService.selectCollegeList(); + List colleges = enrollmentMajorService.selectOpenColleges(); return R.ok(colleges); } catch (Exception e) { return R.fail("获取学院列表异常: " + e.getMessage()); @@ -179,10 +178,9 @@ public class ZsjyEnrollmentInfoController extends BaseController { */ @SaIgnore @GetMapping("/majors/{collegeId}") - public R> getMajorsByCollegeId(@PathVariable Long collegeId) { + public R> getMajorsByCollegeId(@PathVariable Long collegeId) { try { - // 调用学院部门服务获取专业列表 - List majors = xgSysDeptService.selectMajorListByCollegeId(collegeId); + List majors = enrollmentMajorService.selectOpenMajorsByCollegeId(collegeId); return R.ok(majors); } catch (Exception e) { return R.fail("获取专业列表异常: " + e.getMessage()); diff --git a/backend/ruoyi-modules/ruoyi-zsjy/src/main/java/org/dromara/zsjy/controller/ZsjyEnrollmentMajorController.java b/backend/ruoyi-modules/ruoyi-zsjy/src/main/java/org/dromara/zsjy/controller/ZsjyEnrollmentMajorController.java new file mode 100644 index 00000000..2443052f --- /dev/null +++ b/backend/ruoyi-modules/ruoyi-zsjy/src/main/java/org/dromara/zsjy/controller/ZsjyEnrollmentMajorController.java @@ -0,0 +1,54 @@ +package org.dromara.zsjy.controller; + +import cn.dev33.satoken.annotation.SaCheckPermission; +import cn.dev33.satoken.annotation.SaMode; +import lombok.RequiredArgsConstructor; +import org.dromara.common.core.domain.R; +import org.dromara.common.idempotent.annotation.RepeatSubmit; +import org.dromara.common.log.annotation.Log; +import org.dromara.common.log.enums.BusinessType; +import org.dromara.common.web.core.BaseController; +import org.dromara.zsjy.domain.bo.ZsjyEnrollmentMajorSaveBo; +import org.dromara.zsjy.domain.vo.ZsjyEnrollmentDeptVo; +import org.dromara.zsjy.service.IZsjyEnrollmentMajorService; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +import java.util.List; + +/** + * 招生报名开放专业配置 + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/zsjy/enrollment/major") +public class ZsjyEnrollmentMajorController extends BaseController { + + private final IZsjyEnrollmentMajorService enrollmentMajorService; + + @SaCheckPermission(value = {"zsjy:enrollmentMajor:list", "zsjy:enrollmentMajor:query"}, mode = SaMode.OR) + @GetMapping("/colleges") + public R> colleges() { + return R.ok(enrollmentMajorService.selectCollegeList()); + } + + @SaCheckPermission(value = {"zsjy:enrollmentMajor:list", "zsjy:enrollmentMajor:query"}, mode = SaMode.OR) + @GetMapping("/list") + public R> list(@RequestParam Long collegeDeptId) { + return R.ok(enrollmentMajorService.selectMajorConfigByCollegeId(collegeDeptId)); + } + + @SaCheckPermission("zsjy:enrollmentMajor:save") + @Log(title = "招生报名专业配置", businessType = BusinessType.UPDATE) + @RepeatSubmit + @PostMapping("/save") + public R save(@Validated @RequestBody ZsjyEnrollmentMajorSaveBo bo) { + return toAjax(enrollmentMajorService.saveCollegeConfig(bo)); + } +} diff --git a/backend/ruoyi-modules/ruoyi-zsjy/src/main/java/org/dromara/zsjy/controller/ZsjyEnrollmentProcessController.java b/backend/ruoyi-modules/ruoyi-zsjy/src/main/java/org/dromara/zsjy/controller/ZsjyEnrollmentProcessController.java index f0b3a9c2..7cb0d3bc 100644 --- a/backend/ruoyi-modules/ruoyi-zsjy/src/main/java/org/dromara/zsjy/controller/ZsjyEnrollmentProcessController.java +++ b/backend/ruoyi-modules/ruoyi-zsjy/src/main/java/org/dromara/zsjy/controller/ZsjyEnrollmentProcessController.java @@ -21,6 +21,7 @@ import org.dromara.common.core.validate.EditGroup; import org.dromara.common.log.enums.BusinessType; import org.dromara.common.excel.utils.ExcelUtil; import org.dromara.zsjy.domain.vo.ZsjyEnrollmentProcessVo; +import org.dromara.zsjy.domain.vo.ZsjyEnrollmentRegisterExportVo; import org.dromara.zsjy.domain.bo.ZsjyEnrollmentProcessBo; import org.dromara.zsjy.service.IZsjyEnrollmentProcessService; import org.dromara.common.mybatis.core.page.TableDataInfo; @@ -59,6 +60,16 @@ public class ZsjyEnrollmentProcessController extends BaseController { ExcelUtil.exportExcel(list, "招生录取流程状态", ZsjyEnrollmentProcessVo.class, response); } + /** + * 导出新生录取名册(与纸质录取名册字段一致) + */ + @Log(title = "新生录取名册", businessType = BusinessType.EXPORT) + @PostMapping("/exportRegister") + public void exportRegister(ZsjyEnrollmentProcessBo bo, HttpServletResponse response) { + List list = enrollmentProcessService.queryRegisterExportList(bo); + ExcelUtil.exportExcel(list, "新生录取名册", ZsjyEnrollmentRegisterExportVo.class, response); + } + /** * 获取招生录取流程状态详细信息 */ diff --git a/backend/ruoyi-modules/ruoyi-zsjy/src/main/java/org/dromara/zsjy/domain/ZsjyEnrollmentMajor.java b/backend/ruoyi-modules/ruoyi-zsjy/src/main/java/org/dromara/zsjy/domain/ZsjyEnrollmentMajor.java new file mode 100644 index 00000000..20c7ff06 --- /dev/null +++ b/backend/ruoyi-modules/ruoyi-zsjy/src/main/java/org/dromara/zsjy/domain/ZsjyEnrollmentMajor.java @@ -0,0 +1,43 @@ +package org.dromara.zsjy.domain; + +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableLogic; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.dromara.common.tenant.core.TenantEntity; + +import java.io.Serial; + +/** + * 招生报名开放专业配置 zsjy_enrollment_major + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("zsjy_enrollment_major") +public class ZsjyEnrollmentMajor extends TenantEntity { + + @Serial + private static final long serialVersionUID = 1L; + + @TableId(value = "id") + private Long id; + + private Long collegeDeptId; + + private Long majorDeptId; + + private String collegeName; + + private String majorName; + + private String majorCode; + + private Integer sortOrder; + + /** 0正常 1停用 */ + private String status; + + @TableLogic + private Integer deleted; +} diff --git a/backend/ruoyi-modules/ruoyi-zsjy/src/main/java/org/dromara/zsjy/domain/bo/ZsjyEnrollmentInfoBo.java b/backend/ruoyi-modules/ruoyi-zsjy/src/main/java/org/dromara/zsjy/domain/bo/ZsjyEnrollmentInfoBo.java index 2698b5e3..e222fae9 100644 --- a/backend/ruoyi-modules/ruoyi-zsjy/src/main/java/org/dromara/zsjy/domain/bo/ZsjyEnrollmentInfoBo.java +++ b/backend/ruoyi-modules/ruoyi-zsjy/src/main/java/org/dromara/zsjy/domain/bo/ZsjyEnrollmentInfoBo.java @@ -53,11 +53,13 @@ public class ZsjyEnrollmentInfoBo extends BaseEntity { /** * 是否住校(0-否 1-是) */ + @NotNull(message = "是否住宿不能为空", groups = { AddGroup.class, EditGroup.class }) private Integer isBoarding; /** * 出生年月 */ + @NotNull(message = "出生日期不能为空", groups = { AddGroup.class, EditGroup.class }) private Date birthDate; /** @@ -68,39 +70,46 @@ public class ZsjyEnrollmentInfoBo extends BaseEntity { private String phone1; /** - * 联系手机号码2(非必填,填写时需符合手机号格式) + * 联系手机号码2 */ - @Pattern(regexp = "^$|^1[3-9]\\d{9}$", message = "手机号码格式不正确", groups = { AddGroup.class, EditGroup.class }) + @NotBlank(message = "备用电话不能为空", groups = { AddGroup.class, EditGroup.class }) + @Pattern(regexp = "^1[3-9]\\d{9}$", message = "手机号码格式不正确", groups = { AddGroup.class, EditGroup.class }) private String phone2; /** * 民族 */ + @NotBlank(message = "民族不能为空", groups = { AddGroup.class, EditGroup.class }) private String nation; /** * 家庭地址 */ + @NotBlank(message = "家庭住址不能为空", groups = { AddGroup.class, EditGroup.class }) private String homeAddress; /** * 初中毕业学校 */ + @NotBlank(message = "毕业中学不能为空", groups = { AddGroup.class, EditGroup.class }) private String middleSchool; /** * 准考证号码 */ + @NotBlank(message = "准考证号不能为空", groups = { AddGroup.class, EditGroup.class }) private String examNumber; /** * 参加中考地区 */ + @NotBlank(message = "中考地区不能为空", groups = { AddGroup.class, EditGroup.class }) private String examRegion; /** * 当地中考满分 */ + @NotNull(message = "中考满分不能为空", groups = { AddGroup.class, EditGroup.class }) @Min(value = 100, message = "中考满分不能小于100", groups = { AddGroup.class, EditGroup.class }) @Max(value = 1000, message = "中考满分不能大于1000", groups = { AddGroup.class, EditGroup.class }) private Integer totalScoreFull; @@ -108,42 +117,49 @@ public class ZsjyEnrollmentInfoBo extends BaseEntity { /** * 考生中考成绩(含体育) */ + @NotNull(message = "中考成绩不能为空", groups = { AddGroup.class, EditGroup.class }) @Min(value = 0, message = "中考成绩不能小于0", groups = { AddGroup.class, EditGroup.class }) private Integer totalScore; /** * 语文成绩 */ + @NotNull(message = "语文成绩不能为空", groups = { AddGroup.class, EditGroup.class }) @DecimalMin(value = "0.0", message = "语文成绩不能小于0", groups = { AddGroup.class, EditGroup.class }) private BigDecimal chineseScore; /** * 数学成绩 */ + @NotNull(message = "数学成绩不能为空", groups = { AddGroup.class, EditGroup.class }) @DecimalMin(value = "0.0", message = "数学成绩不能小于0", groups = { AddGroup.class, EditGroup.class }) private BigDecimal mathScore; /** * 英语成绩 */ + @NotNull(message = "英语成绩不能为空", groups = { AddGroup.class, EditGroup.class }) @DecimalMin(value = "0.0", message = "英语成绩不能小于0", groups = { AddGroup.class, EditGroup.class }) private BigDecimal englishScore; /** * 科学成绩 */ + @NotNull(message = "科学成绩不能为空", groups = { AddGroup.class, EditGroup.class }) @DecimalMin(value = "0.0", message = "科学成绩不能小于0", groups = { AddGroup.class, EditGroup.class }) private BigDecimal scienceScore; /** * 社会成绩 */ + @NotNull(message = "社会成绩不能为空", groups = { AddGroup.class, EditGroup.class }) @DecimalMin(value = "0.0", message = "社会成绩不能小于0", groups = { AddGroup.class, EditGroup.class }) private BigDecimal socialScore; /** * 体育成绩 */ + @NotNull(message = "体育成绩不能为空", groups = { AddGroup.class, EditGroup.class }) @DecimalMin(value = "0.0", message = "体育成绩不能小于0", groups = { AddGroup.class, EditGroup.class }) private BigDecimal peScore; @@ -156,16 +172,19 @@ public class ZsjyEnrollmentInfoBo extends BaseEntity { /** * 专业代码 */ + @NotBlank(message = "专业代码不能为空", groups = { AddGroup.class, EditGroup.class }) private String majorCode; /** * 校服尺码 */ + @NotBlank(message = "校服尺码不能为空", groups = { AddGroup.class, EditGroup.class }) private String uniformSize; /** * 健康情况 */ + @NotBlank(message = "健康状况不能为空", groups = { AddGroup.class, EditGroup.class }) private String healthStatus; /** @@ -196,11 +215,13 @@ public class ZsjyEnrollmentInfoBo extends BaseEntity { /** * 学院名称 */ + @NotBlank(message = "所属学院不能为空", groups = { AddGroup.class, EditGroup.class }) private String collegeName; /** * 学院代码 */ + @NotBlank(message = "学院代码不能为空", groups = { AddGroup.class, EditGroup.class }) private String collegeId; // 添加明确的getter和setter方法以解决编译问题 diff --git a/backend/ruoyi-modules/ruoyi-zsjy/src/main/java/org/dromara/zsjy/domain/bo/ZsjyEnrollmentMajorSaveBo.java b/backend/ruoyi-modules/ruoyi-zsjy/src/main/java/org/dromara/zsjy/domain/bo/ZsjyEnrollmentMajorSaveBo.java new file mode 100644 index 00000000..d9c17317 --- /dev/null +++ b/backend/ruoyi-modules/ruoyi-zsjy/src/main/java/org/dromara/zsjy/domain/bo/ZsjyEnrollmentMajorSaveBo.java @@ -0,0 +1,19 @@ +package org.dromara.zsjy.domain.bo; + +import jakarta.validation.constraints.NotNull; +import lombok.Data; + +import java.util.List; + +/** + * 按学院批量保存招生开放专业 + */ +@Data +public class ZsjyEnrollmentMajorSaveBo { + + @NotNull(message = "学院ID不能为空") + private Long collegeDeptId; + + /** 勾选的专业 dept_id 列表,可为空表示清空该学院开放专业 */ + private List majorDeptIds; +} diff --git a/backend/ruoyi-modules/ruoyi-zsjy/src/main/java/org/dromara/zsjy/domain/vo/ZsjyEnrollmentDeptVo.java b/backend/ruoyi-modules/ruoyi-zsjy/src/main/java/org/dromara/zsjy/domain/vo/ZsjyEnrollmentDeptVo.java new file mode 100644 index 00000000..2cfa07da --- /dev/null +++ b/backend/ruoyi-modules/ruoyi-zsjy/src/main/java/org/dromara/zsjy/domain/vo/ZsjyEnrollmentDeptVo.java @@ -0,0 +1,59 @@ +package org.dromara.zsjy.domain.vo; + +import com.fasterxml.jackson.annotation.JsonFormat; +import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import com.fasterxml.jackson.databind.ser.std.ToStringSerializer; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Date; + +/** + * 招生报名学院/专业选项 + */ +@Data +@Schema(description = "招生报名学院/专业选项") +public class ZsjyEnrollmentDeptVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + @JsonSerialize(using = ToStringSerializer.class) + private Long deptId; + + @JsonSerialize(using = ToStringSerializer.class) + private Long parentId; + + private String deptName; + + private String deptCategory; + + private Integer orderNum; + + /** 配置页:是否已勾选 */ + private Boolean selected; + + @JsonSerialize(using = ToStringSerializer.class) + private Long majorDeptId; + + private String majorName; + + private String majorCode; + + @JsonSerialize(using = ToStringSerializer.class) + private Long collegeDeptId; + + @JsonSerialize(using = ToStringSerializer.class) + private Long createBy; + + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date createTime; + + @JsonSerialize(using = ToStringSerializer.class) + private Long updateBy; + + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date updateTime; +} diff --git a/backend/ruoyi-modules/ruoyi-zsjy/src/main/java/org/dromara/zsjy/domain/vo/ZsjyEnrollmentProcessVo.java b/backend/ruoyi-modules/ruoyi-zsjy/src/main/java/org/dromara/zsjy/domain/vo/ZsjyEnrollmentProcessVo.java index d8935be4..9d042ed6 100644 --- a/backend/ruoyi-modules/ruoyi-zsjy/src/main/java/org/dromara/zsjy/domain/vo/ZsjyEnrollmentProcessVo.java +++ b/backend/ruoyi-modules/ruoyi-zsjy/src/main/java/org/dromara/zsjy/domain/vo/ZsjyEnrollmentProcessVo.java @@ -234,6 +234,11 @@ public class ZsjyEnrollmentProcessVo implements Serializable { */ private String majorName; + /** + * 是否住校(0-否 1-是)- 从enrollment_info表获取 + */ + private Integer isBoarding; + /** * 省份名称 - 从enrollment_info表获取 */ diff --git a/backend/ruoyi-modules/ruoyi-zsjy/src/main/java/org/dromara/zsjy/domain/vo/ZsjyEnrollmentRegisterExportVo.java b/backend/ruoyi-modules/ruoyi-zsjy/src/main/java/org/dromara/zsjy/domain/vo/ZsjyEnrollmentRegisterExportVo.java new file mode 100644 index 00000000..140b21f8 --- /dev/null +++ b/backend/ruoyi-modules/ruoyi-zsjy/src/main/java/org/dromara/zsjy/domain/vo/ZsjyEnrollmentRegisterExportVo.java @@ -0,0 +1,40 @@ +package org.dromara.zsjy.domain.vo; + +import cn.idev.excel.annotation.ExcelIgnoreUnannotated; +import cn.idev.excel.annotation.ExcelProperty; +import lombok.Data; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 新生录取名册导出VO(与纸质录取名册字段一致) + */ +@Data +@ExcelIgnoreUnannotated +public class ZsjyEnrollmentRegisterExportVo implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + @ExcelProperty(value = "序号") + private Integer serialNumber; + + @ExcelProperty(value = "姓名") + private String studentName; + + @ExcelProperty(value = "录取专业") + private String admittedMajor; + + @ExcelProperty(value = "通知书号码") + private String noticeNumber; + + @ExcelProperty(value = "是否住校") + private String boardingFlag; + + @ExcelProperty(value = "预交学费") + private String prepaidTuitionFlag; + + @ExcelProperty(value = "备注(时间、经办人)") + private String remarkInfo; +} diff --git a/backend/ruoyi-modules/ruoyi-zsjy/src/main/java/org/dromara/zsjy/mapper/ZsjyEnrollmentMajorMapper.java b/backend/ruoyi-modules/ruoyi-zsjy/src/main/java/org/dromara/zsjy/mapper/ZsjyEnrollmentMajorMapper.java new file mode 100644 index 00000000..ac532c57 --- /dev/null +++ b/backend/ruoyi-modules/ruoyi-zsjy/src/main/java/org/dromara/zsjy/mapper/ZsjyEnrollmentMajorMapper.java @@ -0,0 +1,28 @@ +package org.dromara.zsjy.mapper; + +import org.apache.ibatis.annotations.Param; +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; +import org.dromara.zsjy.domain.ZsjyEnrollmentMajor; +import org.dromara.zsjy.domain.vo.ZsjyEnrollmentDeptVo; + +import java.util.List; + +/** + * 招生报名开放专业配置 Mapper + */ +public interface ZsjyEnrollmentMajorMapper extends BaseMapperPlus { + + List selectCollegeList(); + + List selectMajorConfigByCollegeId(@Param("collegeDeptId") Long collegeDeptId); + + List selectOpenColleges(); + + List selectOpenMajorsByCollegeId(@Param("collegeDeptId") Long collegeDeptId); + + int countValidCollege(@Param("collegeDeptId") Long collegeDeptId); + + int countValidMajorUnderCollege(@Param("collegeDeptId") Long collegeDeptId, @Param("majorDeptId") Long majorDeptId); + + int physicalDeleteByCollegeDeptId(@Param("collegeDeptId") Long collegeDeptId); +} diff --git a/backend/ruoyi-modules/ruoyi-zsjy/src/main/java/org/dromara/zsjy/service/IZsjyEnrollmentMajorService.java b/backend/ruoyi-modules/ruoyi-zsjy/src/main/java/org/dromara/zsjy/service/IZsjyEnrollmentMajorService.java new file mode 100644 index 00000000..cfaf4413 --- /dev/null +++ b/backend/ruoyi-modules/ruoyi-zsjy/src/main/java/org/dromara/zsjy/service/IZsjyEnrollmentMajorService.java @@ -0,0 +1,22 @@ +package org.dromara.zsjy.service; + +import org.dromara.zsjy.domain.bo.ZsjyEnrollmentMajorSaveBo; +import org.dromara.zsjy.domain.vo.ZsjyEnrollmentDeptVo; + +import java.util.List; + +/** + * 招生报名开放专业配置 Service + */ +public interface IZsjyEnrollmentMajorService { + + List selectCollegeList(); + + List selectMajorConfigByCollegeId(Long collegeDeptId); + + Boolean saveCollegeConfig(ZsjyEnrollmentMajorSaveBo bo); + + List selectOpenColleges(); + + List selectOpenMajorsByCollegeId(Long collegeDeptId); +} diff --git a/backend/ruoyi-modules/ruoyi-zsjy/src/main/java/org/dromara/zsjy/service/IZsjyEnrollmentProcessService.java b/backend/ruoyi-modules/ruoyi-zsjy/src/main/java/org/dromara/zsjy/service/IZsjyEnrollmentProcessService.java index 4a837bbd..c6a395c1 100644 --- a/backend/ruoyi-modules/ruoyi-zsjy/src/main/java/org/dromara/zsjy/service/IZsjyEnrollmentProcessService.java +++ b/backend/ruoyi-modules/ruoyi-zsjy/src/main/java/org/dromara/zsjy/service/IZsjyEnrollmentProcessService.java @@ -1,6 +1,7 @@ package org.dromara.zsjy.service; import org.dromara.zsjy.domain.vo.ZsjyEnrollmentProcessVo; +import org.dromara.zsjy.domain.vo.ZsjyEnrollmentRegisterExportVo; import org.dromara.zsjy.domain.bo.ZsjyEnrollmentProcessBo; import org.dromara.common.mybatis.core.page.TableDataInfo; import org.dromara.common.mybatis.core.page.PageQuery; @@ -139,4 +140,12 @@ public interface IZsjyEnrollmentProcessService { * @return 待我审核分页列表 */ TableDataInfo queryMyAuditList(PageQuery pageQuery); + + /** + * 查询新生录取名册导出数据(与列表筛选条件一致) + * + * @param bo 查询条件 + * @return 录取名册导出列表 + */ + List queryRegisterExportList(ZsjyEnrollmentProcessBo bo); } diff --git a/backend/ruoyi-modules/ruoyi-zsjy/src/main/java/org/dromara/zsjy/service/impl/ZsjyEnrollmentMajorServiceImpl.java b/backend/ruoyi-modules/ruoyi-zsjy/src/main/java/org/dromara/zsjy/service/impl/ZsjyEnrollmentMajorServiceImpl.java new file mode 100644 index 00000000..a892b8f3 --- /dev/null +++ b/backend/ruoyi-modules/ruoyi-zsjy/src/main/java/org/dromara/zsjy/service/impl/ZsjyEnrollmentMajorServiceImpl.java @@ -0,0 +1,120 @@ +package org.dromara.zsjy.service.impl; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.IdUtil; +import lombok.RequiredArgsConstructor; +import org.dromara.common.core.exception.ServiceException; +import org.dromara.zsjy.domain.ZsjyEnrollmentMajor; +import org.dromara.zsjy.domain.bo.ZsjyEnrollmentMajorSaveBo; +import org.dromara.zsjy.domain.vo.ZsjyEnrollmentDeptVo; +import org.dromara.zsjy.mapper.ZsjyEnrollmentMajorMapper; +import org.dromara.zsjy.service.IZsjyEnrollmentMajorService; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * 招生报名开放专业配置 Service 实现 + */ +@RequiredArgsConstructor +@Service +public class ZsjyEnrollmentMajorServiceImpl implements IZsjyEnrollmentMajorService { + + private final ZsjyEnrollmentMajorMapper enrollmentMajorMapper; + + @Override + public List selectCollegeList() { + return enrollmentMajorMapper.selectCollegeList(); + } + + @Override + public List selectMajorConfigByCollegeId(Long collegeDeptId) { + if (collegeDeptId == null) { + throw new ServiceException("学院ID不能为空"); + } + if (enrollmentMajorMapper.countValidCollege(collegeDeptId) == 0) { + throw new ServiceException("学院不存在或已停用"); + } + return enrollmentMajorMapper.selectMajorConfigByCollegeId(collegeDeptId); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public Boolean saveCollegeConfig(ZsjyEnrollmentMajorSaveBo bo) { + Long collegeDeptId = bo.getCollegeDeptId(); + if (enrollmentMajorMapper.countValidCollege(collegeDeptId) == 0) { + throw new ServiceException("学院不存在或已停用"); + } + + List majorDeptIds = bo.getMajorDeptIds() == null ? List.of() : bo.getMajorDeptIds(); + for (Long majorDeptId : majorDeptIds) { + if (enrollmentMajorMapper.countValidMajorUnderCollege(collegeDeptId, majorDeptId) == 0) { + throw new ServiceException("存在不属于该学院的专业,无法保存"); + } + } + + List allMajors = enrollmentMajorMapper.selectMajorConfigByCollegeId(collegeDeptId); + Map majorMap = new HashMap<>(); + for (ZsjyEnrollmentDeptVo major : allMajors) { + majorMap.put(major.getMajorDeptId(), major); + } + + String collegeName = resolveCollegeName(collegeDeptId); + + enrollmentMajorMapper.physicalDeleteByCollegeDeptId(collegeDeptId); + + if (CollUtil.isEmpty(majorDeptIds)) { + return true; + } + + List insertList = new ArrayList<>(); + int sort = 0; + for (Long majorDeptId : majorDeptIds) { + ZsjyEnrollmentDeptVo major = majorMap.get(majorDeptId); + if (major == null) { + continue; + } + ZsjyEnrollmentMajor entity = new ZsjyEnrollmentMajor(); + entity.setId(IdUtil.getSnowflakeNextId()); + entity.setCollegeDeptId(collegeDeptId); + entity.setMajorDeptId(majorDeptId); + entity.setCollegeName(collegeName); + entity.setMajorName(major.getMajorName()); + entity.setMajorCode(major.getMajorCode()); + entity.setSortOrder(++sort); + entity.setStatus("0"); + entity.setDeleted(0); + insertList.add(entity); + } + + if (CollUtil.isNotEmpty(insertList)) { + enrollmentMajorMapper.insertBatch(insertList); + } + return true; + } + + @Override + public List selectOpenColleges() { + return enrollmentMajorMapper.selectOpenColleges(); + } + + @Override + public List selectOpenMajorsByCollegeId(Long collegeDeptId) { + if (collegeDeptId == null) { + throw new ServiceException("学院ID不能为空"); + } + return enrollmentMajorMapper.selectOpenMajorsByCollegeId(collegeDeptId); + } + + private String resolveCollegeName(Long collegeDeptId) { + return enrollmentMajorMapper.selectCollegeList().stream() + .filter(item -> collegeDeptId.equals(item.getDeptId())) + .map(ZsjyEnrollmentDeptVo::getDeptName) + .findFirst() + .orElse(""); + } +} diff --git a/backend/ruoyi-modules/ruoyi-zsjy/src/main/java/org/dromara/zsjy/service/impl/ZsjyEnrollmentProcessServiceImpl.java b/backend/ruoyi-modules/ruoyi-zsjy/src/main/java/org/dromara/zsjy/service/impl/ZsjyEnrollmentProcessServiceImpl.java index 000db838..4d8b2584 100644 --- a/backend/ruoyi-modules/ruoyi-zsjy/src/main/java/org/dromara/zsjy/service/impl/ZsjyEnrollmentProcessServiceImpl.java +++ b/backend/ruoyi-modules/ruoyi-zsjy/src/main/java/org/dromara/zsjy/service/impl/ZsjyEnrollmentProcessServiceImpl.java @@ -14,6 +14,7 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.dromara.zsjy.domain.bo.ZsjyEnrollmentProcessBo; import org.dromara.zsjy.domain.vo.ZsjyEnrollmentProcessVo; +import org.dromara.zsjy.domain.vo.ZsjyEnrollmentRegisterExportVo; import org.dromara.zsjy.domain.ZsjyEnrollmentProcess; import org.dromara.zsjy.mapper.ZsjyEnrollmentProcessMapper; import org.dromara.zsjy.service.IZsjyEnrollmentProcessService; @@ -22,6 +23,8 @@ import java.util.List; import java.util.Collection; import java.util.Date; import java.util.Set; +import java.util.ArrayList; +import java.text.SimpleDateFormat; /** * 招生录取流程状态Service业务层处理 @@ -430,4 +433,56 @@ public class ZsjyEnrollmentProcessServiceImpl implements IZsjyEnrollmentProcessS Page result = baseMapper.selectVoPage(pageQuery.build(), lqw); return TableDataInfo.build(result); } + + @Override + public List queryRegisterExportList(ZsjyEnrollmentProcessBo bo) { + List sourceList = baseMapper.selectAllProcessWithInfoAudit(bo); + List exportList = new ArrayList<>(); + if (sourceList == null || sourceList.isEmpty()) { + return exportList; + } + int index = 1; + for (ZsjyEnrollmentProcessVo item : sourceList) { + ZsjyEnrollmentRegisterExportVo exportVo = new ZsjyEnrollmentRegisterExportVo(); + exportVo.setSerialNumber(index++); + exportVo.setStudentName(StringUtils.blankToDefault(item.getStudentName(), "")); + exportVo.setAdmittedMajor(StringUtils.blankToDefault(item.getMajorName(), "")); + exportVo.setNoticeNumber(StringUtils.blankToDefault(item.getNoticeNumber(), "")); + exportVo.setBoardingFlag(formatBoardingFlag(item.getIsBoarding())); + exportVo.setPrepaidTuitionFlag(formatPrepaidTuitionFlag(item.getPaymentStatus())); + exportVo.setRemarkInfo(buildRegisterRemark(item)); + exportList.add(exportVo); + } + return exportList; + } + + private String formatBoardingFlag(Integer isBoarding) { + return isBoarding != null && isBoarding == 1 ? "√" : ""; + } + + private String formatPrepaidTuitionFlag(String paymentStatus) { + return "1".equals(paymentStatus) ? "√" : "×"; + } + + private String buildRegisterRemark(ZsjyEnrollmentProcessVo item) { + if (StringUtils.isNotBlank(item.getRemark())) { + return item.getRemark(); + } + StringBuilder remark = new StringBuilder(); + Date remarkTime = item.getPaymentConfirmTime() != null ? item.getPaymentConfirmTime() + : (item.getAdmissionTime() != null ? item.getAdmissionTime() : item.getFinalAuditTime()); + if (remarkTime != null) { + remark.append(new SimpleDateFormat("M.d").format(remarkTime)); + } + String handler = StringUtils.blankToDefault(item.getAdmissionUserName(), + StringUtils.blankToDefault(item.getFinalAuditUserName(), + StringUtils.blankToDefault(item.getInfoAuditUserName(), item.getCurrentHandlerName()))); + if (StringUtils.isNotBlank(handler)) { + if (!remark.isEmpty()) { + remark.append(" "); + } + remark.append(handler); + } + return remark.toString(); + } } diff --git a/backend/ruoyi-modules/ruoyi-zsjy/src/main/resources/mapper/zsjy/ZsjyEnrollmentMajorMapper.xml b/backend/ruoyi-modules/ruoyi-zsjy/src/main/resources/mapper/zsjy/ZsjyEnrollmentMajorMapper.xml new file mode 100644 index 00000000..d7a5c6b8 --- /dev/null +++ b/backend/ruoyi-modules/ruoyi-zsjy/src/main/resources/mapper/zsjy/ZsjyEnrollmentMajorMapper.xml @@ -0,0 +1,88 @@ + + + + + + + + + + + + + + + + + + DELETE FROM zsjy_enrollment_major WHERE college_dept_id = #{collegeDeptId} + + diff --git a/backend/ruoyi-modules/ruoyi-zsjy/src/main/resources/mapper/zsjy/ZsjyEnrollmentProcessMapper.xml b/backend/ruoyi-modules/ruoyi-zsjy/src/main/resources/mapper/zsjy/ZsjyEnrollmentProcessMapper.xml index f439e20a..b1451a1e 100644 --- a/backend/ruoyi-modules/ruoyi-zsjy/src/main/resources/mapper/zsjy/ZsjyEnrollmentProcessMapper.xml +++ b/backend/ruoyi-modules/ruoyi-zsjy/src/main/resources/mapper/zsjy/ZsjyEnrollmentProcessMapper.xml @@ -78,6 +78,7 @@ + @@ -143,7 +144,7 @@ COALESCE(p.create_time, ei.create_time) as create_time, COALESCE(p.update_by, ei.update_by) as update_by, COALESCE(p.update_time, ei.update_time) as update_time, - ei.gender, ei.applied_major as majorName, ei.exam_region as province + ei.gender, ei.applied_major as majorName, ei.is_boarding as isBoarding, ei.exam_region as province FROM zsjy_enrollment_info ei LEFT JOIN zsjy_enrollment_process p ON ei.id = p.enrollment_id AND p.deleted = '0' WHERE ei.deleted = '0' diff --git a/mobile/src/pages.json b/mobile/src/pages.json index 273bc357..c676b867 100644 --- a/mobile/src/pages.json +++ b/mobile/src/pages.json @@ -208,7 +208,7 @@ } }, { - "path": "pages/xgss/dmdl/dmdl", + "path": "pages/xgss/ssdm/ssdm", "style": { "navigationBarTitleText": "宿舍点名", "navigationBarBackgroundColor": "#0051d9", @@ -216,14 +216,14 @@ } }, { - "path": "pages/xgss/dmdl/dmdlCheck", + "path": "pages/xgss/ssdm/ssdmCheck", "style": { "navigationBarTitleText": "宿舍点名", "navigationStyle": "custom" } }, { - "path": "pages/xgss/dmdl/dmdlDetail", + "path": "pages/xgss/ssdm/ssdmDetail", "style": { "navigationBarTitleText": "点名详情", "navigationBarBackgroundColor": "#0051d9", diff --git a/mobile/src/pages/enrollment/index.vue b/mobile/src/pages/enrollment/index.vue index a2a1ef63..12878ce6 100644 --- a/mobile/src/pages/enrollment/index.vue +++ b/mobile/src/pages/enrollment/index.vue @@ -57,7 +57,7 @@ > - + - + - + - + - + - + 学业信息 - + - + - + - + - + - + - + - + - + - + - + - + - + - + [{ required: true, message: `${label}不能为空`, trigger: ['blur', 'change'] }]; + +const requiredNumber = (label, min = 0, max) => [ + { + validator: (rule, value, callback) => { + if (value === null || value === undefined || value === '') { + callback(new Error(`${label}不能为空`)); + } else if (Number(value) < min) { + callback(new Error(`${label}不能小于${min}`)); + } else if (max !== undefined && Number(value) > max) { + callback(new Error(`${label}不能大于${max}`)); + } else { + callback(); + } + }, + trigger: ['blur', 'change'], + }, +]; + export default { name: 'EnrollmentIndex', data() { @@ -535,28 +557,43 @@ export default { majorPickerColumns: [], uniformSizePickerColumns: [], - // 表单验证规则 + // 表单验证规则(特长爱好、获奖情况除外) rules: { - name: [{ required: true, message: '姓名不能为空', trigger: 'blur' }], + name: requiredText('姓名'), idCard: [ { required: true, message: '身份证号不能为空', trigger: 'blur' }, - { - pattern: - /^[1-9]\d{5}(18|19|20)\d{2}((0[1-9])|(1[0-2]))(([0-2][1-9])|10|20|30|31)\d{3}[0-9Xx]$/, - message: '身份证号格式不正确', - trigger: 'blur', - }, + { pattern: idCardPattern, message: '身份证号格式不正确', trigger: 'blur' }, ], - gender: [{ required: true, message: '性别不能为空', trigger: 'change' }], + gender: requiredText('性别'), + birthDate: requiredText('出生日期'), phone1: [ { required: true, message: '联系电话不能为空', trigger: 'blur' }, - { pattern: /^1[3-9]\d{9}$/, message: '手机号码格式不正确', trigger: 'blur' }, + { pattern: phonePattern, message: '手机号码格式不正确', trigger: 'blur' }, ], phone2: [ - { pattern: /^$|^1[3-9]\d{9}$/, message: '手机号码格式不正确', trigger: 'blur' }, + { required: true, message: '备用电话不能为空', trigger: 'blur' }, + { pattern: phonePattern, message: '手机号码格式不正确', trigger: 'blur' }, ], - collegeName: [{ required: true, message: '所属学院不能为空', trigger: 'change' }], - appliedMajor: [{ required: true, message: '报考专业不能为空', trigger: 'change' }], + nation: requiredText('民族'), + isBoarding: requiredText('是否住宿'), + healthStatus: requiredText('健康状况'), + homeAddress: requiredText('家庭住址'), + middleSchool: requiredText('毕业中学'), + examNumber: requiredText('准考证号'), + examRegion: requiredText('中考地区'), + totalScoreFull: requiredNumber('中考满分', 100, 1000), + totalScore: requiredNumber('中考成绩', 0), + chineseScore: requiredNumber('语文成绩', 0), + mathScore: requiredNumber('数学成绩', 0), + englishScore: requiredNumber('英语成绩', 0), + scienceScore: requiredNumber('科学成绩', 0), + socialScore: requiredNumber('社会成绩', 0), + peScore: requiredNumber('体育成绩', 0), + collegeName: requiredText('所属学院'), + collegeId: requiredText('学院代码'), + appliedMajor: requiredText('报考专业'), + majorCode: requiredText('专业代码'), + uniformSize: requiredText('校服尺码'), }, }; }, @@ -565,21 +602,10 @@ export default { try { console.log('🚀 开始页面初始化...'); - // 先初始化兜底数据,确保页面能正常显示 - this.initDefaultDictData(); - this.initDefaultCollegeData(); - - console.log('✅ 兜底数据初始化完成:', { - genderOptions: this.genderOptions.length, - collegeOptions: this.collegeOptions.length, - majorOptions: this.majorOptions.length, - }); - - // 并行加载数据,即使部分失败也不影响页面显示 + // 并行加载数据 const results = await Promise.allSettled([ this.initDictData(), this.loadCollegeOptions(), - this.initMajorOptions(), ]); console.log('📋 异步数据加载结果:', results); @@ -606,9 +632,7 @@ export default { console.log('✅ 页面初始化完成,准备就绪'); } catch (error) { console.error('❌ 页面初始化失败:', error); - // 确保使用兜底数据 this.initDefaultDictData(); - this.initDefaultCollegeData(); this.$forceUpdate(); } }, @@ -798,15 +822,8 @@ export default { } } catch (error) { console.error('学院数据加载失败:', error); - // 设置兜底学院数据 - this.collegeOptions = [ - { deptId: 1, deptName: '机械工程学院', deptCategory: 'JX' }, - { deptId: 2, deptName: '电气工程学院', deptCategory: 'DQ' }, - { deptId: 3, deptName: '信息工程学院', deptCategory: 'XX' }, - { deptId: 4, deptName: '经济管理学院', deptCategory: 'JG' }, - { deptId: 5, deptName: '建筑工程学院', deptCategory: 'JZ' }, - ]; - console.log('✅ 已使用默认学院数据(兜底方案)'); + this.collegeOptions = []; + uni.showToast({ title: '学院数据加载失败', icon: 'none' }); } // 更新学院picker的columns数据 @@ -1174,13 +1191,6 @@ export default { this.majorOptions = []; } - // 如果API加载失败或无数据,使用兜底专业数据 - if (!this.majorOptions || this.majorOptions.length === 0) { - const defaultMajors = this.getDefaultMajorsByCollegeId(collegeId); - this.majorOptions = defaultMajors; - console.log('✅ 已使用默认专业数据(兜底方案):', defaultMajors); - } - // 更新专业picker的columns数据 this.majorPickerColumns = [this.majorOptions.map((item) => item.label)]; console.log('✅ 专业picker columns更新完成:', { diff --git a/mobile/src/pages/index/index.vue b/mobile/src/pages/index/index.vue index 351895ed..53c3003a 100644 --- a/mobile/src/pages/index/index.vue +++ b/mobile/src/pages/index/index.vue @@ -1220,7 +1220,7 @@ export default { // 跳转到宿舍点名页面 gotoDormRollCall() { uni.navigateTo({ - url: '/pages/xgss/dmdl/dmdl', + url: '/pages/xgss/ssdm/ssdm', }); }, diff --git a/web/src/views/zsjy/enrollment/apply.vue b/web/src/views/zsjy/enrollment/apply.vue index 346e14cc..5bdb597e 100644 --- a/web/src/views/zsjy/enrollment/apply.vue +++ b/web/src/views/zsjy/enrollment/apply.vue @@ -39,7 +39,7 @@ - + @@ -49,33 +49,33 @@ - + - + - + - + - + @@ -90,63 +90,63 @@ - + - + - + - + - + - + - + - + - + - + - + @@ -168,7 +168,7 @@ - + @@ -182,16 +182,16 @@ - + - + - + @@ -282,11 +282,13 @@ diff --git a/web/src/views/zsjy/enrollment/enrollmentFormRules.ts b/web/src/views/zsjy/enrollment/enrollmentFormRules.ts new file mode 100644 index 00000000..eb1a9080 --- /dev/null +++ b/web/src/views/zsjy/enrollment/enrollmentFormRules.ts @@ -0,0 +1,58 @@ +import type { FormRules } from 'element-plus'; + +const idCardPattern = /^[1-9]\d{5}(18|19|20)\d{2}((0[1-9])|(1[0-2]))(([0-2][1-9])|10|20|30|31)\d{3}[0-9Xx]$/; +const phonePattern = /^1[3-9]\d{9}$/; + +const requiredText = (label: string, trigger: 'blur' | 'change' = 'blur') => [ + { required: true, message: `${label}不能为空`, trigger } +]; + +const requiredNumber = (label: string, min: number, max?: number) => { + const rules: FormRules[string] = [ + { required: true, message: `${label}不能为空`, trigger: 'blur' }, + { type: 'number', min, message: `${label}不能小于${min}`, trigger: 'blur' } + ]; + if (max !== undefined) { + rules.push({ type: 'number', max, message: `${label}不能大于${max}`, trigger: 'blur' }); + } + return rules; +}; + +/** 招生报名信息表单校验(特长爱好、获奖情况除外) */ +export const enrollmentFormRules: FormRules = { + name: requiredText('姓名'), + idCard: [ + { required: true, message: '身份证号不能为空', trigger: 'blur' }, + { pattern: idCardPattern, message: '身份证号格式不正确', trigger: 'blur' } + ], + gender: requiredText('性别', 'change'), + birthDate: requiredText('出生日期', 'change'), + phone1: [ + { required: true, message: '联系电话不能为空', trigger: 'blur' }, + { pattern: phonePattern, message: '手机号码格式不正确', trigger: 'blur' } + ], + phone2: [ + { required: true, message: '备用电话不能为空', trigger: 'blur' }, + { pattern: phonePattern, message: '手机号码格式不正确', trigger: 'blur' } + ], + nation: requiredText('民族'), + isBoarding: requiredText('是否住宿', 'change'), + healthStatus: requiredText('健康状况'), + homeAddress: requiredText('家庭住址'), + middleSchool: requiredText('毕业中学'), + examNumber: requiredText('准考证号'), + examRegion: requiredText('中考地区'), + totalScoreFull: requiredNumber('中考满分', 100, 1000), + totalScore: requiredNumber('中考成绩', 0), + chineseScore: requiredNumber('语文成绩', 0), + mathScore: requiredNumber('数学成绩', 0), + englishScore: requiredNumber('英语成绩', 0), + scienceScore: requiredNumber('科学成绩', 0), + socialScore: requiredNumber('社会成绩', 0), + peScore: requiredNumber('体育成绩', 0), + collegeName: requiredText('所属学院', 'change'), + collegeId: requiredText('学院代码'), + appliedMajor: requiredText('报考专业', 'change'), + majorCode: requiredText('专业代码'), + uniformSize: requiredText('校服尺码', 'change') +}; diff --git a/web/src/views/zsjy/enrollment/enrollmentPrint.ts b/web/src/views/zsjy/enrollment/enrollmentPrint.ts new file mode 100644 index 00000000..73941b84 --- /dev/null +++ b/web/src/views/zsjy/enrollment/enrollmentPrint.ts @@ -0,0 +1,147 @@ +export interface EnrollmentPrintField { + label: string; + value?: string | number | null; + /** 占满一行(如地址、特长等) */ + fullWidth?: boolean; +} + +export interface EnrollmentPrintSection { + title: string; + fields: EnrollmentPrintField[]; +} + +const formatValue = (value?: string | number | null) => { + if (value === undefined || value === null || value === '') { + return '-'; + } + return String(value); +}; + +const escapeHtml = (text: string) => + text + .replace(/&/g, '&') + .replace(//g, '>') + .replace(/"/g, '"') + .replace(/'/g, '''); + +const buildSectionHtml = (section: EnrollmentPrintSection) => { + const fieldsHtml = section.fields + .map((field) => { + const cssClass = field.fullWidth ? 'field full' : 'field'; + return `
${escapeHtml(field.label)}:${escapeHtml(formatValue(field.value))}
`; + }) + .join(''); + + return `

${escapeHtml(section.title)}

${fieldsHtml}
`; +}; + +/** 打印招生报名信息 */ +export const printEnrollmentInfo = (documentTitle: string, sections: EnrollmentPrintSection[], printTime?: string) => { + const printWindow = window.open('', '_blank'); + if (!printWindow) { + throw new Error('无法打开打印窗口,请检查浏览器是否拦截弹窗'); + } + + const sectionsHtml = sections.map(buildSectionHtml).join(''); + const timeText = printTime || new Date().toLocaleString('zh-CN'); + + const html = ` + + + + ${escapeHtml(documentTitle)} + + + + + ${sectionsHtml} + + + diff --git a/web/src/views/zsjy/enrollmentStatistics/index.vue b/web/src/views/zsjy/enrollmentStatistics/index.vue index ceeb2a7f..9cb10e90 100644 --- a/web/src/views/zsjy/enrollmentStatistics/index.vue +++ b/web/src/views/zsjy/enrollmentStatistics/index.vue @@ -170,7 +170,6 @@ import { ref, reactive, onMounted, getCurrentInstance } from 'vue'; import { listEnrollmentProcess, - exportEnrollmentProcess, EnrollmentProcessQuery, EnrollmentProcessVO, getEnrollmentProcess @@ -498,9 +497,14 @@ const resetQuery = () => { handleQuery(); }; -// 处理导出 +// 处理导出(新生录取名册格式) const handleExport = () => { - exportEnrollmentProcess(queryParams); + const year = new Date().getFullYear(); + proxy?.download( + '/zsjy/enrollment/process/exportRegister', + { ...queryParams }, + `${year}年新生录取名册_${new Date().getTime()}.xlsx` + ); }; // 查看详情