forked from liweijie/education
1、添加教学场地历;
2、很多表继承了基础类,但是没有添加对应字段导致报错,把继承去掉
This commit is contained in:
+59
@@ -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);
|
||||
}
|
||||
+388
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 构建查询条件
|
||||
*/
|
||||
|
||||
-5
@@ -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);
|
||||
|
||||
+3
-12
@@ -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());
|
||||
|
||||
+4
-4
@@ -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);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user