diff --git a/ruoyi-modules/ruoyi-edu/src/main/java/org/dromara/edu/application/service/contract/impl/EduContractServiceImpl.java b/ruoyi-modules/ruoyi-edu/src/main/java/org/dromara/edu/application/service/contract/impl/EduContractServiceImpl.java index 8bcdfd63e..07119f9de 100644 --- a/ruoyi-modules/ruoyi-edu/src/main/java/org/dromara/edu/application/service/contract/impl/EduContractServiceImpl.java +++ b/ruoyi-modules/ruoyi-edu/src/main/java/org/dromara/edu/application/service/contract/impl/EduContractServiceImpl.java @@ -54,6 +54,7 @@ public class EduContractServiceImpl implements IEduContractService { private final EduContractMapper contractMapper; private final EduContractPackageMapper contractPackageMapper; + private final org.dromara.edu.infrastructure.persistence.mapper.EduCoursePackageMapper coursePackageMapper; private final EduContractGiftMapper contractGiftMapper; private final EduContractLogMapper contractLogMapper; private final EduHoursLogMapper hoursLogMapper; @@ -506,11 +507,31 @@ public class EduContractServiceImpl implements IEduContractService { if (CollUtil.isEmpty(packages)) { return; } + // 按 packageId 批量查课包, 填充 name/type 快照(表列 NOT NULL) + java.util.Set pkgIds = packages.stream() + .map(EduContractPackageBo::getPackageId) + .filter(java.util.Objects::nonNull) + .collect(java.util.stream.Collectors.toSet()); + java.util.Map pkgMap; + if (!pkgIds.isEmpty()) { + pkgMap = coursePackageMapper.selectBatchIds(pkgIds).stream() + .collect(java.util.stream.Collectors.toMap(org.dromara.edu.domain.model.package_.EduCoursePackage::getId, p -> p, (a, b) -> a)); + } else { + pkgMap = java.util.Collections.emptyMap(); + } List list = StreamUtils.toList(packages, p -> { EduContractPackage e = MapstructUtils.convert(p, EduContractPackage.class); e.setContractId(contractId); e.setUsedHours(BigDecimal.ZERO); e.setRemainHours(nz(p.getTotalHours())); + // 课包快照: name/type/listPrice BO 可能未传, 从课包表查(表列均 NOT NULL) + org.dromara.edu.domain.model.package_.EduCoursePackage src = pkgMap.get(p.getPackageId()); + e.setPackageName(src != null && src.getPackageName() != null ? src.getPackageName() : "未知课包"); + e.setPackageType(src != null && src.getPackageType() != null ? src.getPackageType() : "UNKNOWN"); + e.setListPrice(p.getListPrice() != null ? p.getListPrice() + : (src != null && src.getListPrice() != null ? src.getListPrice() : nz(p.getSalePrice()))); + // salePrice/finalAmount 表列 NOT NULL, 兜底非 null + e.setSalePrice(nz(p.getSalePrice())); e.setFinalAmount(nz(p.getFinalAmount(), p.getSalePrice())); e.setStatus("0"); return e;