学员队表和学员队期表联动

This commit is contained in:
2026-09-23 15:19:19 +08:00
parent fb3d20def6
commit 69a1a7d560
@@ -720,11 +720,76 @@ public class StudentRecordsServiceImpl implements StudentRecordsService {
throw new RuntimeException("学员队编号已存在:" + entity.getXydbh()); throw new RuntimeException("学员队编号已存在:" + entity.getXydbh());
} }
xydbMapper.insert(entity); 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<XYDQB>()
.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<XYDQB> rows = xydqbMapper.selectList(new LambdaQueryWrapper<XYDQB>()
.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 @Override
@Transactional @Transactional
public void deleteTeam(String xydbh) { public void deleteTeam(String xydbh) {
// 级联删除学员队期记录,保持 XYDB 与 XYDQB 一致
xydqbMapper.delete(new LambdaQueryWrapper<XYDQB>().eq(XYDQB::getXydbh, xydbh));
xydbMapper.deleteById(xydbh); xydbMapper.deleteById(xydbh);
} }
@@ -734,7 +799,24 @@ public class StudentRecordsServiceImpl implements StudentRecordsService {
if (entity.getXydbh() == null || entity.getXydbh().isEmpty()) { if (entity.getXydbh() == null || entity.getXydbh().isEmpty()) {
throw new RuntimeException("学员队编号不能为空"); throw new RuntimeException("学员队编号不能为空");
} }
XYDB old = xydbMapper.selectById(entity.getXydbh());
xydbMapper.updateById(entity); 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<XYDQB> periods = xydqbMapper.selectList(new LambdaQueryWrapper<XYDQB>()
.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 @Override
@@ -770,6 +852,7 @@ public class StudentRecordsServiceImpl implements StudentRecordsService {
continue; continue;
} }
xydbMapper.insert(entity); xydbMapper.insert(entity);
createPeriodIfAbsent(entity);
count++; count++;
} }
return count; return count;