高校显示 班级名称 班级年级 班主任名称 模糊查询

This commit is contained in:
2026-08-21 10:24:50 +08:00
parent 8a7118d278
commit e4014873bb
7 changed files with 76 additions and 15 deletions
@@ -29,13 +29,17 @@ public interface SchClassRepository extends JpaRepository<SchClass, Integer>, Jp
"AND (:campusId IS NULL OR c.campusId = :campusId) " + "AND (:campusId IS NULL OR c.campusId = :campusId) " +
"AND (:divisionId IS NULL OR c.divisionId = :divisionId) " + "AND (:divisionId IS NULL OR c.divisionId = :divisionId) " +
"AND (:majorsId IS NULL OR c.majorsId = :majorsId) " + "AND (:majorsId IS NULL OR c.majorsId = :majorsId) " +
"AND (:years IS NULL OR c.enrollYear IN :years)"+ "AND (:years IS NULL OR c.enrollYear IN :years) " +
"AND (:keyword IS NULL OR :keyword = '' " +
" OR c.name LIKE CONCAT('%', :keyword, '%') " +
" OR c.cname LIKE CONCAT('%', :keyword, '%')) " +
"AND c.enrollYear = c.gradeId AND c.graduate = 0") "AND c.enrollYear = c.gradeId AND c.graduate = 0")
Page<SchClass> findClassesByConditions(@Param("schId") Integer schId, Page<SchClass> findClassesByConditions(@Param("schId") Integer schId,
@Param("campusId") Integer campusId, @Param("campusId") Integer campusId,
@Param("divisionId") Integer divisionId, @Param("divisionId") Integer divisionId,
@Param("majorsId") Integer majorsId, @Param("majorsId") Integer majorsId,
@Param("years") List<Integer> years, @Param("years") List<Integer> years,
@Param("keyword") String keyword,
Pageable pageable); Pageable pageable);
boolean existsBySchIdAndGroupIdAndName(Integer schId, Integer groupId, String name); boolean existsBySchIdAndGroupIdAndName(Integer schId, Integer groupId, String name);
@@ -97,8 +97,9 @@ public class SchClassController {
@RequestParam(required = false) Integer campusId, @RequestParam(required = false) Integer campusId,
@RequestParam(required = false) Integer divisionId, @RequestParam(required = false) Integer divisionId,
@RequestParam(required = false) Integer majorsId, @RequestParam(required = false) Integer majorsId,
@RequestParam(required = false) String keyword,
Pageable pageable) { Pageable pageable) {
return schClassService.searcHigherSchClass(UserContext.getSchId(),year,campusId,divisionId,majorsId,pageable); return schClassService.searcHigherSchClass(UserContext.getSchId(),year,campusId,divisionId,majorsId,keyword,pageable);
} }
@PostMapping("saveHigherSchClass") @PostMapping("saveHigherSchClass")
@@ -73,6 +73,17 @@ public class SysOperationLogController extends BaseController {
.body(new InputStreamResource(bis)); .body(new InputStreamResource(bis));
} }
/** 查询某条日志的响应原文(GZIP 解压),供详情页伸缩框展示 */
@GetMapping("response/{id}")
public Map<String, Object> response(@PathVariable Long id) {
denyIfNotSuperAdmin();
String data = sysOperationLogService.getResponseData(id);
Map<String, Object> m = new LinkedHashMap<>();
m.put("success", true);
m.put("data", data == null ? "该条审计日志未记录响应数据" : data);
return m;
}
/** 重试某条失败的操作:按记录中的 classMethod + requestParams 反射重放原始操作 */ /** 重试某条失败的操作:按记录中的 classMethod + requestParams 反射重放原始操作 */
@PostMapping("retry/{id}") @PostMapping("retry/{id}")
public Map<String, Object> retry(@PathVariable Long id) { public Map<String, Object> retry(@PathVariable Long id) {
@@ -49,6 +49,7 @@ public interface ISchClassService {
Integer campusId, Integer campusId,
Integer divisionId, Integer divisionId,
Integer majorsId, Integer majorsId,
String keyword,
Pageable pageable); Pageable pageable);
void saveHigherSchClass(UserContext.UserInfo user, SchClass entity); void saveHigherSchClass(UserContext.UserInfo user, SchClass entity);
@@ -91,8 +91,8 @@ public class SchClassService implements ISchClassService {
@Override @Override
public PageVO<HigherSchClassVO> searcHigherSchClass(Integer schId, Integer year, Integer campusId, public PageVO<HigherSchClassVO> searcHigherSchClass(Integer schId, Integer year, Integer campusId,
Integer divisionId, Integer majorsId, Pageable pageable) { Integer divisionId, Integer majorsId,String keyword, Pageable pageable) {
return queryService.searcHigherSchClass(schId, year, campusId, divisionId, majorsId, pageable); return queryService.searcHigherSchClass(schId, year, campusId, divisionId, majorsId,keyword, pageable);
} }
@Override @Override
@@ -162,12 +162,12 @@ public class SchClassQueryService {
// ---------- 职业教育查询 ---------- // ---------- 职业教育查询 ----------
public PageVO<HigherSchClassVO> searcHigherSchClass(Integer schId, Integer year, Integer campusId, public PageVO<HigherSchClassVO> searcHigherSchClass(Integer schId, Integer year, Integer campusId,
Integer divisionId, Integer majorsId, Pageable pageable) { Integer divisionId, Integer majorsId,String keyword, Pageable pageable) {
List<Integer> years = new ArrayList<>(); List<Integer> years = new ArrayList<>();
if (year != null && year > 0) years.add(year); if (year != null && year > 0) years.add(year);
years = years.isEmpty() ? null : years; years = years.isEmpty() ? null : years;
Page<SchClass> classPage = schClassRepository.findClassesByConditions(schId, campusId, divisionId, majorsId, years, pageable); Page<SchClass> classPage = schClassRepository.findClassesByConditions(schId, campusId, divisionId, majorsId, years,keyword, pageable);
if (classPage.isEmpty()) { if (classPage.isEmpty()) {
return PageVO.empty(pageable.getPageSize()); return PageVO.empty(pageable.getPageSize());
} }
@@ -176,9 +176,9 @@ public class SchClassQueryService {
Map<Integer, String> campusNameMap = schDicCampusService.toIdAndNameMap(schId); Map<Integer, String> campusNameMap = schDicCampusService.toIdAndNameMap(schId);
Map<Integer, String> divisionsNameMap = schDicDivisionService.toIdAndNameMap(schId); Map<Integer, String> divisionsNameMap = schDicDivisionService.toIdAndNameMap(schId);
Map<Integer, String> majorssNameMap = schDicMajorsService.toIdAndNameMap(schId); Map<Integer, String> majorssNameMap = schDicMajorsService.toIdAndNameMap(schId);
Map<Integer, String> teacherNameMap = schTeacherService.toIdAndNameMap(schId);
List<HigherSchClassVO> voList = classList.stream() List<HigherSchClassVO> voList = classList.stream()
.map(clazz -> convertHigherSchClassToVO(clazz, campusNameMap, divisionsNameMap, majorssNameMap)) .map(clazz -> convertHigherSchClassToVO(clazz, campusNameMap, divisionsNameMap, majorssNameMap,teacherNameMap))
.collect(Collectors.toList()); .collect(Collectors.toList());
return new PageVO<>(pageable.getPageNumber() + 1, return new PageVO<>(pageable.getPageNumber() + 1,
@@ -190,12 +190,15 @@ public class SchClassQueryService {
private HigherSchClassVO convertHigherSchClassToVO(SchClass clazz, private HigherSchClassVO convertHigherSchClassToVO(SchClass clazz,
Map<Integer, String> campusNameMap, Map<Integer, String> campusNameMap,
Map<Integer, String> divisionsNameMap, Map<Integer, String> divisionsNameMap,
Map<Integer, String> majorssNameMap) { Map<Integer, String> majorssNameMap,
Map<Integer, String> teacherNameMap) {
HigherSchClassVO vo = ModelMapperUtil.map(clazz, HigherSchClassVO.class); HigherSchClassVO vo = ModelMapperUtil.map(clazz, HigherSchClassVO.class);
vo.setCampusName(campusNameMap.get(clazz.getCampusId())); vo.setCampusName(campusNameMap.get(clazz.getCampusId()));
vo.setDivisionName(divisionsNameMap.get(clazz.getDivisionId())); vo.setDivisionName(divisionsNameMap.get(clazz.getDivisionId()));
vo.setMajorsName(majorssNameMap.get(clazz.getMajorsId())); vo.setMajorsName(majorssNameMap.get(clazz.getMajorsId()));
vo.setFirstTeacherName(null); vo.setGradeName(vo.getGradeId()+"级");
vo.setFirstTeacherName(teacherNameMap.get(clazz.getFirstTeacherId()));
vo.setSecondTeacherName(null); vo.setSecondTeacherName(null);
return vo; return vo;
} }
+46 -5
View File
@@ -251,6 +251,17 @@
.modal .kv .k { color: var(--muted); font-size: 12px; } .modal .kv .k { color: var(--muted); font-size: 12px; }
.modal .kv .v { font-family: var(--mono); font-size: 12.5px; word-break: break-all; white-space: pre-wrap; } .modal .kv .v { font-family: var(--mono); font-size: 12.5px; word-break: break-all; white-space: pre-wrap; }
.modal .kv .v.scroll { max-height: 160px; overflow-y: auto; padding: 6px 8px; background: #f8f8f9; border: 1px solid #e8eaec; border-radius: 4px; } .modal .kv .v.scroll { max-height: 160px; overflow-y: auto; padding: 6px 8px; background: #f8f8f9; border: 1px solid #e8eaec; border-radius: 4px; }
/* 返回值伸缩框:默认收起,展开后大文本滚动查看 */
.modal .resp-details summary {
cursor: pointer; color: var(--accent); font-size: 12px; user-select: none; outline: none;
display: inline-block; padding: 2px 0;
}
.modal .resp-details summary:hover { color: var(--accent-hover); }
.modal .resp-pre {
margin: 8px 0 0; padding: 10px; background: #f8f8f9; border: 1px solid #e8eaec;
border-radius: 4px; max-height: 40vh; overflow: auto; font-family: var(--mono);
font-size: 12px; line-height: 1.5; word-break: break-all; white-space: pre-wrap;
}
.modal .modal-actions { display: none; gap: 8px; justify-content: flex-end; padding: 12px 16px; border-top: 1px solid #e8eaec; flex: 0 0 auto; } .modal .modal-actions { display: none; gap: 8px; justify-content: flex-end; padding: 12px 16px; border-top: 1px solid #e8eaec; flex: 0 0 auto; }
/* 确认弹窗(View UI Modal.confirm 风格:居中 + 警示图标) */ /* 确认弹窗(View UI Modal.confirm 风格:居中 + 警示图标) */
@@ -704,10 +715,20 @@
// ==================== 详情弹窗 ==================== // ==================== 详情弹窗 ====================
function openModal(title, rows, actionsHtml, retryHandler) { function openModal(title, rows, actionsHtml, retryHandler) {
$('modalTitle').textContent = title; $('modalTitle').textContent = title;
$('modalKv').innerHTML = rows.map(r => $('modalKv').innerHTML = rows.map(r => {
'<div class="k">' + escHtml(r[0]) + '</div>' + const opt = r[2];
'<div class="v' + (r[2] ? ' scroll' : '') + '">' + escHtml(r[1] == null || r[1] === '' ? '-' : r[1]) + '</div>' // 伸缩框选项:{ collapsible: id } —— 默认收起,首次展开时异步加载返回值
).join(''); if (opt && opt.collapsible) {
return '<div class="k">' + escHtml(r[0]) + '</div>' +
'<div class="v">' +
'<details class="resp-details" data-id="' + opt.collapsible + '">' +
'<summary>点击展开 / 收起返回值</summary>' +
'<pre class="resp-pre">加载中…</pre>' +
'</details></div>';
}
return '<div class="k">' + escHtml(r[0]) + '</div>' +
'<div class="v' + (r[2] ? ' scroll' : '') + '">' + escHtml(r[1] == null || r[1] === '' ? '-' : r[1]) + '</div>';
}).join('');
const act = $('modalActions'); const act = $('modalActions');
act.innerHTML = actionsHtml || ''; act.innerHTML = actionsHtml || '';
act.style.display = actionsHtml ? 'flex' : 'none'; act.style.display = actionsHtml ? 'flex' : 'none';
@@ -716,6 +737,25 @@
if (b.dataset.a === 'retry') (retryHandler || doSyncRetry)(Number(b.dataset.id)); if (b.dataset.a === 'retry') (retryHandler || doSyncRetry)(Number(b.dataset.id));
}; };
}); });
// 返回值伸缩框:首次展开时才异步拉取(GZIP 解压由后端完成)
$('modalKv').querySelectorAll('details.resp-details').forEach(d => {
d.addEventListener('toggle', async () => {
if (!d.open || d.dataset.loaded) return;
d.dataset.loaded = '1';
const pre = d.querySelector('.resp-pre');
try {
const res = await fetch(API + '/syslog/response/' + d.dataset.id, { credentials: 'include', headers: authHeaders() });
const j = await res.json();
let payload = j;
if (j && typeof j === 'object' && 'code' in j && 'data' in j) payload = j.data; // 解统一包装 {code,msg,data}
const txt = (payload && payload.data != null) ? payload.data
: (typeof payload === 'string' ? payload : '(空)');
pre.textContent = txt;
} catch (e) {
pre.textContent = '加载失败:' + e.message;
}
});
});
$('modalMask').classList.add('show'); $('modalMask').classList.add('show');
} }
$('modalClose').onclick = () => $('modalMask').classList.remove('show'); $('modalClose').onclick = () => $('modalMask').classList.remove('show');
@@ -835,7 +875,8 @@
['时间', fmtTime(r.createTime)], ['时间', fmtTime(r.createTime)],
['重试次数', (r.retryCount == null ? 0 : r.retryCount) + ' 次'], ['重试次数', (r.retryCount == null ? 0 : r.retryCount) + ' 次'],
['上次重试状态', lrStatus], ['上次重试状态', lrStatus],
['上次重试时间', r.lastRetryTime ? fmtTime(r.lastRetryTime) : '-'] ['上次重试时间', r.lastRetryTime ? fmtTime(r.lastRetryTime) : '-'],
['返回值', null, { collapsible: id }]
]); ]);
} else if (action === 'download') { } else if (action === 'download') {
downloadFile('/syslog/download/' + id, 'audit-' + id + '.txt'); downloadFile('/syslog/download/' + id, 'audit-' + id + '.txt');