forked from liweijie/education
学员队表和学员队期表联动
This commit is contained in:
+83
@@ -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;
|
||||||
|
|||||||
Reference in New Issue
Block a user