学员队表和学员队期表联动
This commit is contained in:
+83
@@ -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<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
|
||||
@Transactional
|
||||
public void deleteTeam(String xydbh) {
|
||||
// 级联删除学员队期记录,保持 XYDB 与 XYDQB 一致
|
||||
xydqbMapper.delete(new LambdaQueryWrapper<XYDQB>().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<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
|
||||
@@ -770,6 +852,7 @@ public class StudentRecordsServiceImpl implements StudentRecordsService {
|
||||
continue;
|
||||
}
|
||||
xydbMapper.insert(entity);
|
||||
createPeriodIfAbsent(entity);
|
||||
count++;
|
||||
}
|
||||
return count;
|
||||
|
||||
Reference in New Issue
Block a user