From 23f65c738d9ef12e6d16cc239b6c6812b204c360 Mon Sep 17 00:00:00 2001 From: Joshi <3040996759@qq.com> Date: Fri, 12 Jun 2026 10:05:45 +0800 Subject: [PATCH] =?UTF-8?q?refactor(oa):=20=E4=BC=98=E5=8C=96=E5=88=B0?= =?UTF-8?q?=E8=B4=A7=E6=98=8E=E7=BB=86=E6=9C=8D=E5=8A=A1=E7=9A=84=E5=85=B3?= =?UTF-8?q?=E8=81=94=E6=9F=A5=E8=AF=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 添加批量填充关联VO的方法,避免N+1查询问题 - 新增需求和项目关联字段到到货明细VO中 - 实现根据需求ID自动填充项目ID和贸易类型的逻辑 - 重构查询方法以支持关联数据的批量加载 - 添加Excel导出忽略注解以防止关联对象被导出 --- .../ruoyi/oa/domain/vo/OaArrivalDetailVo.java | 12 ++ .../impl/OaArrivalDetailServiceImpl.java | 125 +++++++++++++++++- 2 files changed, 133 insertions(+), 4 deletions(-) diff --git a/ruoyi-oa/src/main/java/com/ruoyi/oa/domain/vo/OaArrivalDetailVo.java b/ruoyi-oa/src/main/java/com/ruoyi/oa/domain/vo/OaArrivalDetailVo.java index 757ce09..892f4ab 100644 --- a/ruoyi-oa/src/main/java/com/ruoyi/oa/domain/vo/OaArrivalDetailVo.java +++ b/ruoyi-oa/src/main/java/com/ruoyi/oa/domain/vo/OaArrivalDetailVo.java @@ -8,6 +8,7 @@ import com.alibaba.excel.annotation.ExcelProperty; import com.ruoyi.common.annotation.ExcelDictFormat; import com.ruoyi.common.convert.ExcelDictConvert; import com.ruoyi.common.core.domain.BaseEntity; +import com.alibaba.excel.annotation.ExcelIgnore; import lombok.Data; import java.util.Date; @@ -115,5 +116,16 @@ public class OaArrivalDetailVo extends BaseEntity { @ExcelProperty(value = "手动备注") private String remark; + /** + * 关联需求完整信息(列表展示用,非数据库字段) + */ + @ExcelIgnore + private OaRequirementsVo requirement; + + /** + * 关联项目完整信息(列表展示用,非数据库字段) + */ + @ExcelIgnore + private SysOaProjectVo project; } diff --git a/ruoyi-oa/src/main/java/com/ruoyi/oa/service/impl/OaArrivalDetailServiceImpl.java b/ruoyi-oa/src/main/java/com/ruoyi/oa/service/impl/OaArrivalDetailServiceImpl.java index 9ebeb04..541b342 100644 --- a/ruoyi-oa/src/main/java/com/ruoyi/oa/service/impl/OaArrivalDetailServiceImpl.java +++ b/ruoyi-oa/src/main/java/com/ruoyi/oa/service/impl/OaArrivalDetailServiceImpl.java @@ -11,13 +11,24 @@ import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; import com.ruoyi.oa.domain.bo.OaArrivalDetailBo; import com.ruoyi.oa.domain.vo.OaArrivalDetailVo; +import com.ruoyi.oa.domain.vo.OaRequirementsVo; +import com.ruoyi.oa.domain.vo.SysOaProjectVo; import com.ruoyi.oa.domain.OaArrivalDetail; +import com.ruoyi.oa.domain.OaRequirements; +import com.ruoyi.oa.domain.SysOaProject; import com.ruoyi.oa.mapper.OaArrivalDetailMapper; +import com.ruoyi.oa.mapper.OaRequirementsMapper; +import com.ruoyi.oa.mapper.SysOaProjectMapper; import com.ruoyi.oa.service.IOaArrivalDetailService; import java.util.List; import java.util.Map; import java.util.Collection; +import java.util.Set; +import java.util.Collections; +import java.util.Objects; +import java.util.function.Function; +import java.util.stream.Collectors; /** * 到货明细Service业务层处理 @@ -31,31 +42,44 @@ public class OaArrivalDetailServiceImpl implements IOaArrivalDetailService { private final OaArrivalDetailMapper baseMapper; + private final OaRequirementsMapper requirementsMapper; + + private final SysOaProjectMapper projectMapper; + /** * 查询到货明细 */ @Override public OaArrivalDetailVo queryById(Long detailId){ - return baseMapper.selectVoById(detailId); + OaArrivalDetailVo vo = baseMapper.selectVoById(detailId); + if (vo != null) { + fillRelatedVo(vo); + } + return vo; } /** - * 查询到货明细列表 + * 查询到货明细列表(分页) */ @Override public TableDataInfo queryPageList(OaArrivalDetailBo bo, PageQuery pageQuery) { LambdaQueryWrapper lqw = buildQueryWrapper(bo); Page result = baseMapper.selectVoPage(pageQuery.build(), lqw); + // 批量填充关联名称,避免 N+1 + batchFillRelatedVos(result.getRecords()); return TableDataInfo.build(result); } /** - * 查询到货明细列表 + * 查询到货明细列表(不分页) */ @Override public List queryList(OaArrivalDetailBo bo) { LambdaQueryWrapper lqw = buildQueryWrapper(bo); - return baseMapper.selectVoList(lqw); + List list = baseMapper.selectVoList(lqw); + // 批量填充关联名称 + batchFillRelatedVos(list); + return list; } private LambdaQueryWrapper buildQueryWrapper(OaArrivalDetailBo bo) { @@ -78,11 +102,79 @@ public class OaArrivalDetailServiceImpl implements IOaArrivalDetailService { return lqw; } + /** + * 批量填充关联的需求VO和项目VO + */ + private void batchFillRelatedVos(List list) { + if (list == null || list.isEmpty()) { + return; + } + + // 收集所有需求ID + Set requirementIds = list.stream() + .map(OaArrivalDetailVo::getRequirementId) + .filter(Objects::nonNull) + .collect(Collectors.toSet()); + + // 收集所有项目ID + Set projectIds = list.stream() + .map(OaArrivalDetailVo::getProjectId) + .filter(Objects::nonNull) + .collect(Collectors.toSet()); + + // 批量查询需求完整VO + Map requirementMap = Collections.emptyMap(); + if (!requirementIds.isEmpty()) { + List reqVoList = requirementsMapper.selectVoBatchIds(requirementIds); + if (reqVoList != null) { + requirementMap = reqVoList.stream() + .collect(Collectors.toMap(OaRequirementsVo::getRequirementId, + Function.identity(), (a, b) -> a)); + } + } + + // 批量查询项目完整VO + Map projectMap = Collections.emptyMap(); + if (!projectIds.isEmpty()) { + List projVoList = projectMapper.selectVoBatchIds(projectIds); + if (projVoList != null) { + projectMap = projVoList.stream() + .collect(Collectors.toMap(SysOaProjectVo::getProjectId, + Function.identity(), (a, b) -> a)); + } + } + + // 回填完整 VO 对象 + for (OaArrivalDetailVo vo : list) { + if (vo.getRequirementId() != null) { + vo.setRequirement(requirementMap.get(vo.getRequirementId())); + } + if (vo.getProjectId() != null) { + vo.setProject(projectMap.get(vo.getProjectId())); + } + } + } + + /** + * 单条填充关联VO + */ + private void fillRelatedVo(OaArrivalDetailVo vo) { + if (vo.getRequirementId() != null) { + vo.setRequirement(requirementsMapper.selectVoById(vo.getRequirementId())); + } + if (vo.getProjectId() != null) { + vo.setProject(projectMapper.selectVoById(vo.getProjectId())); + } + } + /** * 新增到货明细 */ @Override public Boolean insertByBo(OaArrivalDetailBo bo) { + // 如果前端传了需求ID,自动查询需求表获取项目ID,再查项目表获取贸易类型 + autoFillByRequirement(bo); + OaArrivalDetail add = BeanUtil.toBean(bo, OaArrivalDetail.class); validEntityBeforeSave(add); boolean flag = baseMapper.insert(add) > 0; @@ -92,6 +184,31 @@ public class OaArrivalDetailServiceImpl implements IOaArrivalDetailService { return flag; } + /** + * 根据需求ID自动填充项目ID和贸易类型 + */ + private void autoFillByRequirement(OaArrivalDetailBo bo) { + if (bo.getRequirementId() == null) { + return; + } + // 查询需求表获取项目ID + OaRequirements requirement = requirementsMapper.selectById(bo.getRequirementId()); + if (requirement == null) { + return; + } + Long projectId = requirement.getProjectId(); + if (projectId != null && bo.getProjectId() == null) { + bo.setProjectId(projectId); + } + // 查询项目表获取贸易类型(仅当未设置时) + if (bo.getTradeType() == null && projectId != null) { + SysOaProject project = projectMapper.selectById(projectId); + if (project != null && project.getTradeType() != null) { + bo.setTradeType(project.getTradeType().intValue()); + } + } + } + /** * 修改到货明细 */