Files
UserclassService/src/main/java/com/yunhai/bschclassmanage/service/impl/BaseYearTermService.java
T
2026-08-14 09:04:58 +08:00

290 lines
12 KiB
Java

package com.yunhai.bschclassmanage.service.impl;
import com.yunhai.bschclassmanage.Repository.BaseYearTermRepository;
import com.yunhai.bschclassmanage.annotation.OperationLog;
import com.yunhai.bschclassmanage.entity.BaseYearTerm;
import com.yunhai.bschclassmanage.model.entityField.EntityFieldNames;
import com.yunhai.bschclassmanage.model.tool.YearTerm;
import com.yunhai.bschclassmanage.model.vo.BaseYearTermVO;
import com.yunhai.bschclassmanage.service.IBaseYearTermService;
import com.yunhai.bschclassmanage.service.ILogService;
import com.yunhai.bschclassmanage.utils.LogContextHolder;
import com.yunhai.bschclassmanage.utils.RedisConstants;
import com.yunhai.bschclassmanage.utils.RedisUtil;
import com.yunhai.bschclassmanage.utils.UserContext;
import com.yunhai.platform.utils.exception.DException;
import lombok.extern.slf4j.Slf4j;
import org.apache.http.client.utils.DateUtils;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Sort;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.time.LocalDate;
import java.time.ZoneId;
import java.util.*;
import java.util.stream.Collectors;
@Slf4j
@Service
public class BaseYearTermService implements IBaseYearTermService {
@Autowired
private BaseYearTermRepository baseYearTermRepository;
@Autowired
private RedisUtil redisUtil;
@Autowired
private ILogService logService;
private static final String MODULE_SYSTEM="系统管理";
//学年学期
private String cacheKey = RedisConstants.SYSTEM_YEARTERM;
public List<BaseYearTerm> getAllYearTerm() {
if (redisUtil.hasKey(cacheKey)) {
return redisUtil.getList(cacheKey, BaseYearTerm.class);
}
Sort sort = Sort.by(Sort.Order.desc(EntityFieldNames.year));
List<BaseYearTerm> clist = baseYearTermRepository.findAll(sort);
redisUtil.set(cacheKey, clist, RedisConstants.CACHE_EXPIRE_30D);
return clist;
}
public List<BaseYearTermVO> getAllYearTermVO() {
List<BaseYearTerm> entities = getAllYearTerm();
return convertToVOList(entities);
}
public BaseYearTerm getNowYearTerm() {
Date now = new Date();
List<BaseYearTerm> yearTermList = getAllYearTerm();
if (yearTermList == null || yearTermList.isEmpty()) {
return null;
}
return yearTermList.stream()
.filter(s -> s.getYearStartDate().compareTo(now) <= 0 && s.getYearEndDate().compareTo(now) >= 0)
.findFirst()
.orElse(null);
}
@OperationLog(module = MODULE_SYSTEM)
@Transactional(rollbackFor = Exception.class)
public void createNowYearTerm(UserContext.UserInfo user,BaseYearTerm entity){
if(getAllYearTerm().stream().anyMatch(s->s.getYear().equals(entity.getYear())))
throw new DException("创建学年已存在!");
redisUtil.del(cacheKey);
baseYearTermRepository.save(entity);
{
String content = createNowYearTermLog(entity);
LogContextHolder.setDescription(content);
}
}
private String createNowYearTermLog(BaseYearTerm entity) {
try {
// 构建日志内容
String content = String.format("创建新学年学期: 学年[%d], 学年起止[%s ~ %s], 第一学期[%s ~ %s], 第二学期[%s ~ %s], 升级日期[%s]",
entity.getYear(),
entity.getYearStartDate() != null ? entity.getYearStartDate().toString() : "未设置",
entity.getYearEndDate() != null ? entity.getYearEndDate().toString() : "未设置",
entity.getFirstTermStartDate() != null ? entity.getFirstTermStartDate().toString() : "未设置",
entity.getFirstTermEndDate() != null ? entity.getFirstTermEndDate().toString() : "未设置",
entity.getSecondTermStartDate() != null ? entity.getSecondTermStartDate().toString() : "未设置",
entity.getSecondTermEndDate() != null ? entity.getSecondTermEndDate().toString() : "未设置",
entity.getUpgradeDate() != null ? entity.getUpgradeDate().toString() : "未设置"
);
return content;
} catch (Exception e) {
log.error("记录创建学年学期日志失败", e);
return "创建学年学期日志失败";
}
}
@OperationLog(module = MODULE_SYSTEM)
@Transactional(rollbackFor = Exception.class)
public void updateYearTerm(UserContext.UserInfo user,BaseYearTerm entity){
if (entity.getId() == null) {
throw new DException("更新时ID不能为空");
}
BaseYearTerm existing = baseYearTermRepository.findById(entity.getId())
.orElseThrow(() -> new DException("学年记录不存在,ID=" + entity.getId()));
BaseYearTerm oldEntity = new BaseYearTerm();
BeanUtils.copyProperties(existing, oldEntity);
// 将传入 entity 中允许更新的字段复制到 existing,忽略 id 及创建审计字段
BeanUtils.copyProperties(entity, existing,
EntityFieldNames.id,
EntityFieldNames.createDate,
EntityFieldNames.createUserId);
redisUtil.del(cacheKey);
baseYearTermRepository.save(entity);
{
String content = updateYearTermLog(user,oldEntity,entity);
LogContextHolder.setDescription(content);
}
}
private String updateYearTermLog(UserContext.UserInfo user,BaseYearTerm oldEntity, BaseYearTerm newEntity) {
try {
List<String> changes = new ArrayList<>();
if (!oldEntity.getYear().equals(newEntity.getYear())) {
changes.add("年份: " + oldEntity.getYear() + " -> " + newEntity.getYear());
}
// 比较所有日期字段
compareDateField(changes, "学年开始", oldEntity.getYearStartDate(), newEntity.getYearStartDate());
compareDateField(changes, "学年结束", oldEntity.getYearEndDate(), newEntity.getYearEndDate());
compareDateField(changes, "第一学期开始", oldEntity.getFirstTermStartDate(), newEntity.getFirstTermStartDate());
compareDateField(changes, "第一学期结束", oldEntity.getFirstTermEndDate(), newEntity.getFirstTermEndDate());
compareDateField(changes, "第二学期开始", oldEntity.getSecondTermStartDate(), newEntity.getSecondTermStartDate());
compareDateField(changes, "第二学期结束", oldEntity.getSecondTermEndDate(), newEntity.getSecondTermEndDate());
compareDateField(changes, "升级日期", oldEntity.getUpgradeDate(), newEntity.getUpgradeDate());
String changeStr = changes.isEmpty() ? "无变化" : String.join("; ", changes);
String content = String.format("更新学年学期(ID=%d,年份=%d):%s",
newEntity.getId(), newEntity.getYear(), changeStr);
return content;
} catch (Exception e) {
log.error("记录更新学年学期日志失败", e);
return "更新学年学期日志失败";
}
}
private void compareDateField(List<String> changes, String fieldName, Date oldDate, Date newDate) {
// 如果两个日期都为 null,视为无变化
if (oldDate == null && newDate == null) {
return;
}
// 如果其中一个为 null,或两者不相等,记录变更
if (oldDate == null || newDate == null || !oldDate.equals(newDate)) {
String oldStr = oldDate != null ? DateUtils.formatDate(oldDate, "yyyy-MM-dd") : "null";
String newStr = newDate != null ? DateUtils.formatDate(newDate, "yyyy-MM-dd") : "null";
changes.add(fieldName + ": " + oldStr + " -> " + newStr);
}
}
public BaseYearTermVO convertToVO(BaseYearTerm entity) {
if (entity == null) return null;
BaseYearTerm nowTerm = getNowYearTerm();
Integer nowId = nowTerm != null ? nowTerm.getId() : null;
return BaseYearTermVO.of(entity, nowId);
}
public List<BaseYearTermVO> convertToVOList(List<BaseYearTerm> entities) {
if (entities == null) return null;
BaseYearTerm nowTerm = getNowYearTerm();
Integer nowId = nowTerm != null ? nowTerm.getId() : null;
return entities.stream()
.map(entity -> BaseYearTermVO.of(entity, nowId))
.collect(Collectors.toList());
}
public boolean isUpgradeDate(Date date) {
if (date == null) {
return false;
}
// 1. 获取当前学年
BaseYearTerm currentTerm = getNowYearTerm();
if (currentTerm == null) {
return false; // 没有当前学年,无法升级
}
// 2. 获取当前学年配置的升级日期
Date upgradeDate = currentTerm.getUpgradeDate();
if (upgradeDate == null) {
return false; // 当前学年未设置升级日期
}
// 3. 比较日期部分(忽略时分秒)
Calendar inputCal = Calendar.getInstance();
inputCal.setTime(date);
Calendar termCal = Calendar.getInstance();
termCal.setTime(upgradeDate);
return inputCal.get(Calendar.YEAR) == termCal.get(Calendar.YEAR)
&& inputCal.get(Calendar.MONTH) == termCal.get(Calendar.MONTH)
&& inputCal.get(Calendar.DAY_OF_MONTH) == termCal.get(Calendar.DAY_OF_MONTH);
}
public boolean isBackupClassDataDate(Date date) {
BaseYearTerm nowTerm = getNowYearTerm();
if (nowTerm == null) {
return false;
}
LocalDate target = date.toInstant().atZone(ZoneId.systemDefault()).toLocalDate();
Date firstEnd = nowTerm.getFirstTermEndDate();
if (firstEnd != null) {
LocalDate firstEndDate = firstEnd.toInstant().atZone(ZoneId.systemDefault()).toLocalDate();
if (target.equals(firstEndDate.plusDays(1))) {
return true;
}
}
Date secondEnd = nowTerm.getSecondTermEndDate();
if (secondEnd != null) {
LocalDate secondEndDate = secondEnd.toInstant().atZone(ZoneId.systemDefault()).toLocalDate();
if (target.equals(secondEndDate.plusDays(1))) {
return true;
}
}
return false;
}
@Override
public YearTerm getCurrentYearTerm() {
BaseYearTerm nowTerm = getNowYearTerm();
if (nowTerm == null) {
throw new DException("当前学年未设置,请先配置学年学期");
}
int year = nowTerm.getYear();
int term = getCurrentTerm(); // 调用下面定义的 getCurrentTerm 方法
return new YearTerm(year, term);
}
// 辅助方法(如果还没实现)
public int getCurrentYear() {
BaseYearTerm nowTerm = getNowYearTerm();
if (nowTerm == null) {
throw new DException("当前学年未设置");
}
return nowTerm.getYear();
}
public int getCurrentTerm() {
BaseYearTerm nowTerm = getNowYearTerm();
if (nowTerm == null) {
throw new DException("当前学年未设置");
}
Date now = new Date();
Date firstStart = nowTerm.getFirstTermStartDate();
Date firstEnd = nowTerm.getFirstTermEndDate();
if (firstStart != null && firstEnd != null) {
if (!now.before(firstStart) && !now.after(firstEnd)) {
return 1;
}
}
Date secondStart = nowTerm.getSecondTermStartDate();
Date secondEnd = nowTerm.getSecondTermEndDate();
if (secondStart != null && secondEnd != null) {
if (!now.before(secondStart) && !now.after(secondEnd)) {
return 2;
}
}
throw new DException("当前日期不在任何学期区间内,请检查学年学期配置");
}
}