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 f9b0b77c0..4eea3e3be 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 @@ -720,11 +720,76 @@ public class StudentRecordsServiceImpl implements StudentRecordsService { throw new RuntimeException("学员队编号已存在:" + entity.getXydbh()); } xydbMapper.insert(entity); + createPeriodIfAbsent(entity); + } + + /** + * 若班次还没有学员队期记录则补建一条,保证 学员队表(XYDB) 与 学员队期表(XYDQB) 一致。 + * 期名沿用既有数据的命名规律:学员队名称 + "期"。 + */ + private void createPeriodIfAbsent(XYDB team) { + if (team == null || team.getXydbh() == null || team.getXydbh().isEmpty()) { + return; + } + Long cnt = xydqbMapper.selectCount(new LambdaQueryWrapper() + .eq(XYDQB::getXydbh, team.getXydbh())); + if (cnt != null && cnt > 0) { + return; + } + XYDQB period = new XYDQB(); + period.setBh(UuidUtil.getUUID()); + period.setXydbh(team.getXydbh()); + String teamName = isNotBlank(team.getXydmc()) ? team.getXydmc() : team.getXydbh(); + period.setMc(teamName + "期"); + period.setZxzt(1); + period.setYxzc(1); + period.setXhqz(nextXhqz(team)); + period.setXhws(11); + xydqbMapper.insert(period); + } + + /** + * 生成学号前缀:班次年度(4位) + 两位递增序号,跳过已占用前缀。 + */ + private String nextXhqz(XYDB team) { + int year = resolveTeamYear(team); + String prefix = String.valueOf(year); + List rows = xydqbMapper.selectList(new LambdaQueryWrapper() + .select(XYDQB::getXhqz) + .likeRight(XYDQB::getXhqz, prefix)); + int max = 0; + for (XYDQB row : rows) { + String xhqz = row.getXhqz(); + if (xhqz == null || xhqz.length() <= prefix.length()) { + continue; + } + String tail = xhqz.substring(prefix.length()); + if (tail.chars().allMatch(Character::isDigit)) { + max = Math.max(max, Integer.parseInt(tail)); + } + } + return prefix + String.format("%02d", max + 1); + } + + /** 班次年度:优先从年级文本解析(如 "2026级"),其次入学日期年份,兜底当前年 */ + private int resolveTeamYear(XYDB team) { + if (isNotBlank(team.getNj())) { + java.util.regex.Matcher m = java.util.regex.Pattern.compile("\\d{4}").matcher(team.getNj()); + if (m.find()) { + return Integer.parseInt(m.group()); + } + } + if (team.getRxrq() != null) { + return team.getRxrq().getYear(); + } + return java.time.LocalDate.now().getYear(); } @Override @Transactional public void deleteTeam(String xydbh) { + // 级联删除学员队期记录,保持 XYDB 与 XYDQB 一致 + xydqbMapper.delete(new LambdaQueryWrapper().eq(XYDQB::getXydbh, xydbh)); xydbMapper.deleteById(xydbh); } @@ -734,7 +799,24 @@ public class StudentRecordsServiceImpl implements StudentRecordsService { if (entity.getXydbh() == null || entity.getXydbh().isEmpty()) { throw new RuntimeException("学员队编号不能为空"); } + XYDB old = xydbMapper.selectById(entity.getXydbh()); xydbMapper.updateById(entity); + createPeriodIfAbsent(entity); + // 班次改名时,仅同步自动命名("队名+期")的队期记录,不动手工改过的名称 + if (old != null && isNotBlank(entity.getXydmc()) + && !entity.getXydmc().equals(old.getXydmc())) { + String autoName = (isNotBlank(old.getXydmc()) ? old.getXydmc() : old.getXydbh()) + "期"; + List periods = xydqbMapper.selectList(new LambdaQueryWrapper() + .eq(XYDQB::getXydbh, entity.getXydbh())); + for (XYDQB period : periods) { + if (autoName.equals(period.getMc())) { + XYDQB patch = new XYDQB(); + patch.setBh(period.getBh()); + patch.setMc(entity.getXydmc() + "期"); + xydqbMapper.updateById(patch); + } + } + } } @Override @@ -770,6 +852,7 @@ public class StudentRecordsServiceImpl implements StudentRecordsService { continue; } xydbMapper.insert(entity); + createPeriodIfAbsent(entity); count++; } return count;