1、添加教学场地历;

2、很多表继承了基础类,但是没有添加对应字段导致报错,把继承去掉
This commit is contained in:
2026-09-16 16:37:23 +08:00
parent 58499afe8e
commit 2e151ea228
178 changed files with 1471 additions and 531 deletions
@@ -3,6 +3,8 @@ package com.roomroot.jwgl.service;
import com.roomroot.jwgl.entity.JXCDL;
import com.roomroot.jwgl.unit.PageQuery;
import com.roomroot.jwgl.unit.PageResult;
import com.roomroot.jwgl.vo.classroom.VenueLessonVO;
import com.roomroot.jwgl.vo.classroom.VenueScheduleItemVO;
import java.util.List;
@@ -72,4 +74,61 @@ public interface ClassRoomCalendarService {
* @return 教学场地历列表
*/
List<JXCDL> listByRq(String rq);
/**
* 批量保存场地历事件(拖选区域写入)。
* <p>
* 按 (教室编号, 日期, 节次) 判重:已存在则更新可排课/名称/备注,不存在则插入。
* </p>
*
* @param list 场地历事件列表(jsbh/rq/jc 必填)
* @return 写入条数
*/
int batchSave(List<JXCDL> list);
/**
* 按 ID 批量删除场地历事件(软删,恢复可排)
*
* @param ids 主键ID列表
* @return 删除条数
*/
int batchDelete(List<String> ids);
/**
* 按教室编号 + 日期范围查询场地历
*
* @param jsbh 教室编号
* @param start 开始日期 yyyy-MM-dd
* @param end 结束日期 yyyy-MM-dd
* @return 场地历列表
*/
List<JXCDL> listByJsbhAndRange(String jsbh, String start, String end);
/**
* 查询场地在日期范围内已排课次(编辑器蓝格数据源)
*
* @param jsbh 教室编号
* @param start 开始日期 yyyy-MM-dd
* @param end 结束日期 yyyy-MM-dd
* @param nd 学期代号(可空,空则不限学期)
* @return 已排课次列表
*/
List<VenueLessonVO> listVenueLessons(String jsbh, String start, String end, Integer nd);
/**
* 查询指定本场地为专用教室的班次(编辑器顶部横幅数据源)
*
* @param jsbh 教室编号
* @return 班次描述列表(如"一队(2025年度 第1学期)")
*/
List<String> listDesignatedTeams(String jsbh);
/**
* 场地占用总览:某日期+节次全部场地的占用状态
*
* @param rq 日期 yyyy-MM-dd
* @param jc 节次(单节次)
* @return 全部场地的占用条目
*/
List<VenueScheduleItemVO> venueSchedule(String rq, Integer jc);
}
@@ -2,17 +2,48 @@ package com.roomroot.jwgl.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.roomroot.jwgl.entity.JSB;
import com.roomroot.jwgl.entity.JXCDL;
import com.roomroot.jwgl.entity.JYB;
import com.roomroot.jwgl.entity.KB;
import com.roomroot.jwgl.entity.SSKCB;
import com.roomroot.jwgl.entity.SSKCBJS;
import com.roomroot.jwgl.entity.SSKC;
import com.roomroot.jwgl.entity.SSKCXYD;
import com.roomroot.jwgl.entity.XYDB;
import com.roomroot.jwgl.entity.XYDNDXQJBXXB;
import com.roomroot.jwgl.mapper.ClassRoomCalendarMapper;
import com.roomroot.jwgl.mapper.ClassRoomMapper;
import com.roomroot.jwgl.mapper.ClassSemesterMapper;
import com.roomroot.jwgl.mapper.JYBMapper;
import com.roomroot.jwgl.mapper.KBMapper;
import com.roomroot.jwgl.mapper.SSKCBJSMapper;
import com.roomroot.jwgl.mapper.SSKCBMapper;
import com.roomroot.jwgl.mapper.SSKCMapper;
import com.roomroot.jwgl.mapper.SSKCXYDMapper;
import com.roomroot.jwgl.mapper.XYDBMapper;
import com.roomroot.jwgl.service.ClassRoomCalendarService;
import com.roomroot.jwgl.unit.BusinessException;
import com.roomroot.jwgl.unit.PageQuery;
import com.roomroot.jwgl.unit.PageResult;
import com.roomroot.jwgl.utils.UuidUtil;
import com.roomroot.jwgl.vo.classroom.VenueLessonVO;
import com.roomroot.jwgl.vo.classroom.VenueScheduleItemVO;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import jakarta.annotation.Resource;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.stream.Collectors;
/**
* 教学场地历服务实现类
@@ -20,9 +51,38 @@ import java.util.List;
@Service
public class ClassRoomCalendarServiceImpl implements ClassRoomCalendarService {
private static final DateTimeFormatter DATE_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd");
@Resource
private ClassRoomCalendarMapper jxcdlMapper;
@Resource
private ClassRoomMapper classRoomMapper;
@Resource
private SSKCBJSMapper sskcbjsMapper;
@Resource
private SSKCBMapper sskcbMapper;
@Resource
private SSKCMapper sskcMapper;
@Resource
private KBMapper kbMapper;
@Resource
private JYBMapper jybMapper;
@Resource
private SSKCXYDMapper sskcxydMapper;
@Resource
private XYDBMapper xydbMapper;
@Resource
private ClassSemesterMapper classSemesterMapper;
@Override
public void add(JXCDL jxcdl) {
jxcdl.setId(UuidUtil.getUUID());
@@ -73,6 +133,334 @@ public class ClassRoomCalendarServiceImpl implements ClassRoomCalendarService {
return jxcdlMapper.selectByRq(rq);
}
@Override
@Transactional(rollbackFor = Exception.class)
public int batchSave(List<JXCDL> list) {
if (list == null || list.isEmpty()) {
return 0;
}
// 校验必填项并归一化日期
Set<String> jsbhSet = new HashSet<>();
LocalDate minDay = null;
LocalDate maxDay = null;
for (JXCDL item : list) {
if (item.getJsbh() == null || item.getJsbh().trim().isEmpty()) {
throw new BusinessException("场地历事件缺少教室编号");
}
if (item.getRq() == null || item.getJc() == null) {
throw new BusinessException("场地历事件缺少日期或节次");
}
jsbhSet.add(item.getJsbh().trim());
LocalDate d = item.getRq().toLocalDate();
minDay = minDay == null || d.isBefore(minDay) ? d : minDay;
maxDay = maxDay == null || d.isAfter(maxDay) ? d : maxDay;
}
// 一次拉出涉及场地在日期区间内的已有事件,按 (教室编号|日期|节次) 判重
Map<String, JXCDL> existing = new HashMap<>();
for (JXCDL row : jxcdlMapper.selectList(new LambdaQueryWrapper<JXCDL>()
.in(JXCDL::getJsbh, jsbhSet)
.ge(JXCDL::getRq, minDay.atStartOfDay())
.lt(JXCDL::getRq, maxDay.plusDays(1).atStartOfDay())
.eq(JXCDL::getDelFlag, 0))) {
if (row.getRq() == null || row.getJc() == null) {
continue;
}
existing.put(row.getJsbh() + "|" + row.getRq().toLocalDate().format(DATE_FORMATTER)
+ "|" + row.getJc(), row);
}
int saved = 0;
LocalDateTime now = LocalDateTime.now();
for (JXCDL item : list) {
String key = item.getJsbh().trim() + "|"
+ item.getRq().toLocalDate().format(DATE_FORMATTER) + "|" + item.getJc();
JXCDL prev = existing.get(key);
if (prev != null) {
prev.setMc(item.getMc());
prev.setBz(item.getBz());
prev.setKpk(item.getKpk());
jxcdlMapper.updateById(prev);
} else {
JXCDL row = new JXCDL();
row.setId(UuidUtil.getUUID());
row.setBh(item.getJsbh().trim() + "-"
+ item.getRq().toLocalDate().format(DATE_FORMATTER).replace("-", "")
+ "-" + item.getJc());
row.setMc(item.getMc());
row.setBz(item.getBz());
row.setKpk(item.getKpk() != null ? item.getKpk() : Boolean.FALSE);
row.setRq(item.getRq().toLocalDate().atStartOfDay());
row.setJc(item.getJc());
row.setJsbh(item.getJsbh().trim());
row.setDelFlag(0);
row.setCjsj(now);
jxcdlMapper.insert(row);
}
saved++;
}
return saved;
}
@Override
@Transactional(rollbackFor = Exception.class)
public int batchDelete(List<String> ids) {
if (ids == null || ids.isEmpty()) {
return 0;
}
int deleted = 0;
for (JXCDL row : jxcdlMapper.selectBatchIds(ids)) {
if (row.getDelFlag() != null && row.getDelFlag() == 1) {
continue;
}
row.setDelFlag(1);
jxcdlMapper.updateById(row);
deleted++;
}
return deleted;
}
@Override
public List<JXCDL> listByJsbhAndRange(String jsbh, String start, String end) {
if (jsbh == null || jsbh.trim().isEmpty()) {
return new ArrayList<>();
}
LambdaQueryWrapper<JXCDL> wrapper = new LambdaQueryWrapper<JXCDL>()
.eq(JXCDL::getJsbh, jsbh.trim())
.eq(JXCDL::getDelFlag, 0);
LocalDate s = parseDate(start);
LocalDate e = parseDate(end);
if (s != null) {
wrapper.ge(JXCDL::getRq, s.atStartOfDay());
}
if (e != null) {
wrapper.lt(JXCDL::getRq, e.plusDays(1).atStartOfDay());
}
wrapper.orderByAsc(JXCDL::getRq, JXCDL::getJc);
return jxcdlMapper.selectList(wrapper);
}
@Override
public List<VenueLessonVO> listVenueLessons(String jsbh, String start, String end, Integer nd) {
if (jsbh == null || jsbh.trim().isEmpty()) {
return new ArrayList<>();
}
// 教室子表定位占用该场地的课次(该表数据不做软删过滤,与冲突检测口径一致)
List<SSKCBJS> links = sskcbjsMapper.selectList(new LambdaQueryWrapper<SSKCBJS>()
.eq(SSKCBJS::getJsbh, jsbh.trim()));
if (links.isEmpty()) {
return new ArrayList<>();
}
Set<String> lessonBhs = links.stream().map(SSKCBJS::getSskcbbh)
.filter(b -> b != null && !b.isEmpty()).collect(Collectors.toSet());
if (lessonBhs.isEmpty()) {
return new ArrayList<>();
}
LocalDate s = parseDate(start);
LocalDate e = parseDate(end);
List<SSKCB> lessons = sskcbMapper.selectBatchIds(lessonBhs).stream()
.filter(l -> l.getRq() != null && l.getJc() != null)
.filter(l -> l.getSczt() == null || l.getSczt() == 0)
.filter(l -> nd == null || nd.equals(l.getNd()))
.filter(l -> {
LocalDate d = l.getRq().toLocalDate();
return (s == null || !d.isBefore(s)) && (e == null || !d.isAfter(e));
})
.collect(Collectors.toList());
if (lessons.isEmpty()) {
return new ArrayList<>();
}
// 课程名称:课次.实施_课程编号 -> 实施_课程.科目编号 -> 课表.课名称
Set<String> courseBhs = lessons.stream().map(SSKCB::getSskcbh)
.filter(b -> b != null && !b.isEmpty()).collect(Collectors.toSet());
Map<String, SSKC> courseByBh = courseBhs.isEmpty() ? new HashMap<>()
: sskcMapper.selectByBhs(new ArrayList<>(courseBhs)).stream()
.collect(Collectors.toMap(c -> normGuid(c.getBh()), c -> c, (a, b) -> a));
Set<String> kbhs = courseByBh.values().stream().map(SSKC::getKmbh)
.filter(b -> b != null && !b.isEmpty()).collect(Collectors.toSet());
Map<String, String> kmcByKbh = kbhs.isEmpty() ? new HashMap<>()
: kbMapper.selectBatchIds(kbhs).stream()
.collect(Collectors.toMap(KB::getKbh, k -> k.getKmc() == null ? "" : k.getKmc(), (a, b) -> a));
// 教员姓名:实施_课程.教员编号 -> 教员表.教员姓名
Set<String> jybhs = courseByBh.values().stream().map(SSKC::getJybh)
.filter(b -> b != null && !b.isEmpty()).collect(Collectors.toSet());
Map<String, String> jyxmByJybh = jybhs.isEmpty() ? new HashMap<>()
: jybMapper.selectBatchIds(jybhs).stream()
.collect(Collectors.toMap(JYB::getJybh, j -> j.getJyxm() == null ? "" : j.getJyxm(), (a, b) -> a));
// 学员队名称:实施_课程学员队 -> 学员队表
Map<String, List<String>> teamsOfCourse = new HashMap<>();
if (!courseBhs.isEmpty()) {
List<SSKCXYD> teamLinks = sskcxydMapper.selectList(new LambdaQueryWrapper<SSKCXYD>()
.in(SSKCXYD::getSskcbh, courseBhs));
Set<String> xydbhs = teamLinks.stream().map(SSKCXYD::getXydbh)
.filter(b -> b != null && !b.isEmpty()).collect(Collectors.toSet());
Map<String, String> teamNameByBh = xydbhs.isEmpty() ? new HashMap<>()
: xydbMapper.selectList(new LambdaQueryWrapper<XYDB>().in(XYDB::getXydbh, xydbhs))
.stream().collect(Collectors.toMap(XYDB::getXydbh,
t -> t.getXydmc() == null ? "" : t.getXydmc(), (a, b) -> a));
for (SSKCXYD link : teamLinks) {
String name = teamNameByBh.getOrDefault(link.getXydbh(), link.getXydbh());
if (name != null && !name.isEmpty()) {
teamsOfCourse.computeIfAbsent(link.getSskcbh(), k -> new ArrayList<>()).add(name);
}
}
}
List<VenueLessonVO> result = new ArrayList<>();
for (SSKCB lesson : lessons) {
SSKC course = courseByBh.get(normGuid(lesson.getSskcbh()));
VenueLessonVO vo = new VenueLessonVO();
vo.setRq(lesson.getRq().toLocalDate().format(DATE_FORMATTER));
vo.setJc(lesson.getJc());
vo.setSskcbh(lesson.getBh());
vo.setKcmc(course == null ? "" : kmcByKbh.getOrDefault(course.getKmbh(), ""));
vo.setJyxm(course == null ? "" : jyxmByJybh.getOrDefault(course.getJybh(), ""));
vo.setXydmc(String.join(";", teamsOfCourse.getOrDefault(lesson.getSskcbh(), List.of())));
result.add(vo);
}
return result;
}
@Override
public List<String> listDesignatedTeams(String jsbh) {
if (jsbh == null || jsbh.trim().isEmpty()) {
return new ArrayList<>();
}
// 专用教室编号可能存教室编号或教室ID,两种口径都匹配(与 ClassSemesterMapper.xml 的联查一致)
JSB room = classRoomMapper.selectOne(new LambdaQueryWrapper<JSB>()
.eq(JSB::getJsbh, jsbh.trim())
.eq(JSB::getDelFlag, 0)
.last("LIMIT 1"));
Set<String> keys = new HashSet<>();
keys.add(jsbh.trim());
if (room != null && room.getId() != null) {
keys.add(room.getId());
}
List<XYDNDXQJBXXB> rows = classSemesterMapper.selectList(new LambdaQueryWrapper<XYDNDXQJBXXB>()
.in(XYDNDXQJBXXB::getZyjsbh, keys)
.eq(XYDNDXQJBXXB::getDelFlag, 0));
if (rows.isEmpty()) {
return new ArrayList<>();
}
Set<String> xydbhs = rows.stream().map(XYDNDXQJBXXB::getXydbh)
.filter(b -> b != null && !b.isEmpty()).collect(Collectors.toSet());
Map<String, String> teamNameByBh = xydbhs.isEmpty() ? new HashMap<>()
: xydbMapper.selectList(new LambdaQueryWrapper<XYDB>().in(XYDB::getXydbh, xydbhs))
.stream().collect(Collectors.toMap(XYDB::getXydbh,
t -> t.getXydmc() == null ? "" : t.getXydmc(), (a, b) -> a));
List<String> result = new ArrayList<>();
for (XYDNDXQJBXXB row : rows) {
String name = teamNameByBh.getOrDefault(row.getXydbh(), row.getXydbh());
StringBuilder sb = new StringBuilder(name == null ? "" : name);
if (row.getNd() != null || row.getXqdc() != null) {
sb.append("(");
if (row.getNd() != null) {
sb.append(row.getNd()).append("年度");
}
if (row.getXqdc() != null) {
sb.append(" 第").append(row.getXqdc()).append("学期");
}
sb.append(")");
}
if (sb.length() > 0) {
result.add(sb.toString());
}
}
return result;
}
@Override
public List<VenueScheduleItemVO> venueSchedule(String rq, Integer jc) {
LocalDate day = parseDate(rq);
if (day == null || jc == null) {
throw new BusinessException("请提供日期和节次");
}
List<JSB> rooms = classRoomMapper.selectList(new LambdaQueryWrapper<JSB>()
.eq(JSB::getDelFlag, 0));
// 场地历事件
Map<String, JXCDL> eventByRoom = new HashMap<>();
for (JXCDL row : jxcdlMapper.selectList(new LambdaQueryWrapper<JXCDL>()
.ge(JXCDL::getRq, day.atStartOfDay())
.lt(JXCDL::getRq, day.plusDays(1).atStartOfDay())
.eq(JXCDL::getJc, jc)
.eq(JXCDL::getDelFlag, 0))) {
eventByRoom.put(row.getJsbh(), row);
}
// 已排课次:该日期+节次的课次 -> 教室子表反查占用场地
Map<String, SSKCB> lessonByRoom = new HashMap<>();
List<SSKCB> lessons = sskcbMapper.selectList(new LambdaQueryWrapper<SSKCB>()
.ge(SSKCB::getRq, day.atStartOfDay())
.lt(SSKCB::getRq, day.plusDays(1).atStartOfDay())
.eq(SSKCB::getJc, jc)
.eq(SSKCB::getSczt, 0));
if (!lessons.isEmpty()) {
Map<String, SSKCB> lessonByBh = lessons.stream()
.collect(Collectors.toMap(SSKCB::getBh, l -> l, (a, b) -> a));
for (SSKCBJS link : sskcbjsMapper.selectList(new LambdaQueryWrapper<SSKCBJS>()
.in(SSKCBJS::getSskcbbh, lessonByBh.keySet()))) {
if (link.getJsbh() != null) {
lessonByRoom.putIfAbsent(link.getJsbh(), lessonByBh.get(link.getSskcbbh()));
}
}
}
Map<String, String> courseNames = loadCourseNames(lessons);
List<VenueScheduleItemVO> result = new ArrayList<>();
for (JSB room : rooms) {
VenueScheduleItemVO vo = new VenueScheduleItemVO();
vo.setJsbh(room.getJsbh());
vo.setJsmc(room.getJsmc());
vo.setJxldh(room.getJxldh());
SSKCB lesson = lessonByRoom.get(room.getJsbh());
JXCDL event = eventByRoom.get(room.getJsbh());
if (lesson != null) {
vo.setStatus("occupied");
vo.setKcmc(courseNames.getOrDefault(normGuid(lesson.getSskcbh()), ""));
} else if (event != null) {
vo.setStatus(Boolean.FALSE.equals(event.getKpk()) ? "unavailable" : "noted");
vo.setMc(event.getMc());
} else {
vo.setStatus("free");
}
result.add(vo);
}
return result;
}
/**
* 实施_课程编号 -> 课程名称(实施_课程.科目编号 -> 课表.课名称)
*/
private Map<String, String> loadCourseNames(List<SSKCB> lessons) {
Set<String> courseBhs = lessons.stream().map(SSKCB::getSskcbh)
.filter(b -> b != null && !b.isEmpty()).collect(Collectors.toSet());
if (courseBhs.isEmpty()) {
return new HashMap<>();
}
List<SSKC> courses = sskcMapper.selectByBhs(new ArrayList<>(courseBhs));
Set<String> kbhs = courses.stream().map(SSKC::getKmbh)
.filter(b -> b != null && !b.isEmpty()).collect(Collectors.toSet());
Map<String, String> kmcByKbh = kbhs.isEmpty() ? new HashMap<>()
: kbMapper.selectBatchIds(kbhs).stream()
.collect(Collectors.toMap(KB::getKbh, k -> k.getKmc() == null ? "" : k.getKmc(), (a, b) -> a));
Map<String, String> names = new HashMap<>();
for (SSKC c : courses) {
names.put(normGuid(c.getBh()), kmcByKbh.getOrDefault(c.getKmbh(), c.getKmbh()));
}
return names;
}
/** 归一化 GUID:去横线转小写,屏蔽 CHAR(36) 存储与 VARBINARY 解码的大小写差异 */
private String normGuid(String guid) {
return guid == null ? "" : guid.trim().replace("-", "").toLowerCase();
}
private LocalDate parseDate(String s) {
if (s == null || s.trim().isEmpty()) {
return null;
}
try {
return LocalDate.parse(s.trim().substring(0, 10), DATE_FORMATTER);
} catch (Exception e) {
return null;
}
}
/**
* 构建查询条件
*/
@@ -1541,8 +1541,6 @@ public class CourseRunningImportServiceImpl implements CourseRunningImportServic
// 从课次实体复制日期节次,便于后续统计和展示
plan.setRq(lesson.getRq());
plan.setJc(lesson.getJc());
plan.setCreateTime(LocalDateTime.now());
plan.setUpdateTime(LocalDateTime.now());
// 步骤5:插入教学保障计划数据
kcbbzmxMapper.insert(plan);
@@ -1645,7 +1643,6 @@ public class CourseRunningImportServiceImpl implements CourseRunningImportServic
plan.setSl(dto.getSl());
// 保留原有备注中的确认状态信息(如果有),并更新用户备注内容
plan.setBz(mergeSupportRemark(plan.getBz(), dto.getBz()));
plan.setUpdateTime(LocalDateTime.now());
// 步骤5:执行数据库更新
kcbbzmxMapper.updateById(plan);
@@ -1727,7 +1724,6 @@ public class CourseRunningImportServiceImpl implements CourseRunningImportServic
// 步骤4:构建确认状态JSON,追加到备注字段中
String confirmJson = buildSupportConfirmJson(dto.getQrrbh(), dto.getQrbz());
plan.setBz(mergeSupportRemark(plan.getBz(), confirmJson));
plan.setUpdateTime(LocalDateTime.now());
// 步骤5:执行数据库更新
kcbbzmxMapper.updateById(plan);
@@ -1817,7 +1813,6 @@ public class CourseRunningImportServiceImpl implements CourseRunningImportServic
// 步骤4:移除备注中的确认状态JSON,恢复为未确认状态
plan.setBz(clearSupportConfirmJson(plan.getBz()));
plan.setUpdateTime(LocalDateTime.now());
// 步骤5:执行数据库更新
kcbbzmxMapper.updateById(plan);
@@ -15,7 +15,7 @@ import java.util.List;
import java.util.UUID;
/**
* 教员历 Service 实现。交互口径与教学场地历一致:新增生成编号 + delFlag=0,删除为软删。
* 教员历 Service 实现。交互口径与教学场地历一致:新增生成编号;该表无 del_flag 审计列,删除为物理删除。
*/
@Service
public class JYLServiceImpl implements JYLService {
@@ -33,22 +33,16 @@ public class JYLServiceImpl implements JYLService {
row.setKpk(0);
}
row.setCjsj(LocalDateTime.now());
row.setDelFlag(0);
jylMapper.insert(row);
}
@Override
public void delete(String bh) {
JYL row = jylMapper.selectById(bh);
if (row != null) {
row.setDelFlag(1);
jylMapper.updateById(row);
}
jylMapper.deleteById(bh);
}
@Override
public void update(JYL row) {
row.setDelFlag(null);
jylMapper.updateById(row);
}
@@ -77,7 +71,6 @@ public class JYLServiceImpl implements JYLService {
public List<JYL> listByJybh(String jybh) {
return jylMapper.selectList(new LambdaQueryWrapper<JYL>()
.eq(JYL::getJybh, jybh)
.eq(JYL::getDelFlag, 0)
.orderByAsc(JYL::getRq)
.orderByAsc(JYL::getJc));
}
@@ -85,13 +78,11 @@ public class JYLServiceImpl implements JYLService {
@Override
public List<JYL> listByRq(String rq) {
return jylMapper.selectList(new LambdaQueryWrapper<JYL>()
.apply("DATE(rq) = {0}", rq)
.eq(JYL::getDelFlag, 0));
.apply("DATE(rq) = {0}", rq));
}
private LambdaQueryWrapper<JYL> buildWrapper(JYL condition) {
LambdaQueryWrapper<JYL> qw = new LambdaQueryWrapper<>();
qw.eq(JYL::getDelFlag, 0);
if (condition != null) {
if (StringUtils.isNotEmpty(condition.getJybh())) {
qw.eq(JYL::getJybh, condition.getJybh());
@@ -145,7 +145,7 @@ public class SchedulingWindowServiceImpl implements SchedulingWindowService {
List<SSKCXYD> links = ctx.links;
List<String> sskcIds = links.stream().map(SSKCXYD::getSskcbh).distinct().toList();
Map<String, SSKC> courses = sskcIds.isEmpty() ? Map.of()
: sskcMapper.selectBatchIds(sskcIds).stream().collect(Collectors.toMap(SSKC::getBh, c -> c, (a, b) -> a));
: sskcMapper.selectByBhs(sskcIds).stream().collect(Collectors.toMap(SSKC::getBh, c -> c, (a, b) -> a));
List<SSKCB> lessons = ctx.lessons;
Map<String, List<SSKCB>> lessonsByCourse = lessons.stream()
.collect(Collectors.groupingBy(SSKCB::getSskcbh));
@@ -212,7 +212,7 @@ public class SchedulingWindowServiceImpl implements SchedulingWindowService {
.collect(Collectors.groupingBy(l -> l.getRq().toLocalDate().toString() + "#" + l.getJc()));
Map<String, String> courseNames = new HashMap<>();
Map<String, String> courseTeachers = new HashMap<>();
for (SSKC course : sskcMapper.selectBatchIds(ctx.links.stream().map(SSKCXYD::getSskcbh).distinct().toList())) {
for (SSKC course : sskcMapper.selectByBhs(ctx.links.stream().map(SSKCXYD::getSskcbh).distinct().toList())) {
courseNames.put(course.getBh(), resolveCourseName(course.getKmbh()));
courseTeachers.put(course.getBh(), safe(course.getJybh()));
}
@@ -321,7 +321,7 @@ public class SchedulingWindowServiceImpl implements SchedulingWindowService {
}
Map<String, String> teacherBlocked = new HashMap<>();
for (JYL row : jylMapper.selectList(new LambdaQueryWrapper<JYL>()
.eq(JYL::getKpk, 0).eq(JYL::getDelFlag, 0))) {
.eq(JYL::getKpk, 0))) {
if (row.getRq() != null && row.getJybh() != null) {
teacherBlocked.put(row.getRq().toLocalDate().toString() + "#" + row.getJc() + "#" + row.getJybh(), "教员历不可用");
}
@@ -646,7 +646,7 @@ public class SchedulingWindowServiceImpl implements SchedulingWindowService {
if (sskcbh == null || sskcbh.isEmpty()) {
throw new ServiceException("请指定运行课程", BAD_REQUEST);
}
SSKC course = sskcMapper.selectById(sskcbh);
SSKC course = sskcMapper.selectByBhs(java.util.List.of(sskcbh)).stream().findFirst().orElse(null);
if (course == null) {
throw new ServiceException("运行课程不存在:" + sskcbh, NOT_FOUND);
}