From 4e6af75be4ac4e737b19b797cb260d8dced5825c Mon Sep 17 00:00:00 2001 From: spllzh <28668817@qq.com> Date: Fri, 15 Aug 2025 08:04:21 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BB=A3=E7=A0=81=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/rj/common/DataEnrichmentUtil.java | 360 ++++++++++++++++++ .../rj/common/DataEnrichmentUtilExample.java | 164 ++++++++ .../java/com/rj/common/ServiceManager.java | 73 ++++ 3 files changed, 597 insertions(+) create mode 100644 src/main/java/com/rj/common/DataEnrichmentUtil.java create mode 100644 src/main/java/com/rj/common/DataEnrichmentUtilExample.java create mode 100644 src/main/java/com/rj/common/ServiceManager.java diff --git a/src/main/java/com/rj/common/DataEnrichmentUtil.java b/src/main/java/com/rj/common/DataEnrichmentUtil.java new file mode 100644 index 0000000..a4460c2 --- /dev/null +++ b/src/main/java/com/rj/common/DataEnrichmentUtil.java @@ -0,0 +1,360 @@ +package com.rj.common; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.service.IService; +import com.rj.entity.Dealership; +import com.rj.entity.ProjectManagement; +import com.rj.entity.SalesManagement; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import java.util.*; +import java.util.function.Function; +import java.util.stream.Collectors; + +/** + * 数据丰富工具类 + * 用于批量获取关联数据并填充到主数据中,减少代码冗余 + * + * @author 系统生成 + * @since 2025-08-07 + */ +@Component +public class DataEnrichmentUtil { + + @Autowired + private ServiceManager serviceManager; + + /** + * 批量获取关联数据并创建映射 + * + * @param ids 主键ID列表 + * @param service 对应的Service + * @param idGetter ID获取函数 + * @param nameGetter 名称获取函数 + * @param 实体类型 + * @param ID类型 + * @return ID到名称的映射 + */ + public static Map batchGetNameMap( + Collection ids, + IService service, + Function idGetter, + Function nameGetter) { + + if (ids == null || ids.isEmpty()) { + return new HashMap<>(); + } + + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + // 使用lambda表达式来避免类型问题 + queryWrapper.in(entity -> idGetter.apply(entity), ids); + List entities = service.list(queryWrapper); + + return entities.stream() + .collect(Collectors.toMap( + idGetter, + nameGetter, + (existing, replacement) -> existing // 如果有重复key,保留第一个 + )); + } + + /** + * 批量获取关联数据并创建映射(支持自定义查询条件) + * + * @param ids 主键ID列表 + * @param service 对应的Service + * @param idGetter ID获取函数 + * @param nameGetter 名称获取函数 + * @param additionalCondition 额外的查询条件 + * @param 实体类型 + * @param ID类型 + * @return ID到名称的映射 + */ + public static Map batchGetNameMap( + Collection ids, + IService service, + Function idGetter, + Function nameGetter, + Function, LambdaQueryWrapper> additionalCondition) { + + if (ids == null || ids.isEmpty()) { + return new HashMap<>(); + } + + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + // 使用lambda表达式来避免类型问题 + queryWrapper.in(ids.size() > 0, entity -> idGetter.apply(entity), ids); + + if (additionalCondition != null) { + queryWrapper = additionalCondition.apply(queryWrapper); + } + + List entities = service.list(queryWrapper); + + return entities.stream() + .collect(Collectors.toMap( + idGetter, + nameGetter, + (existing, replacement) -> existing + )); + } + + /** + * 批量获取关联数据并创建映射(支持多个字段) + * + * @param ids 主键ID列表 + * @param service 对应的Service + * @param idGetter ID获取函数 + * @param fieldGetters 字段获取函数映射 + * @param 实体类型 + * @param ID类型 + * @return ID到字段值的映射 + */ + public static Map> batchGetFieldMap( + Collection ids, + IService service, + Function idGetter, + Map> fieldGetters) { + + if (ids == null || ids.isEmpty()) { + return new HashMap<>(); + } + + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + // 使用lambda表达式来避免类型问题 + queryWrapper.in(ids.size() > 0, entity -> idGetter.apply(entity), ids); + List entities = service.list(queryWrapper); + + return entities.stream() + .collect(Collectors.toMap( + idGetter, + entity -> { + Map fieldMap = new HashMap<>(); + fieldGetters.forEach((fieldName, getter) -> + fieldMap.put(fieldName, getter.apply(entity))); + return fieldMap; + }, + (existing, replacement) -> existing + )); + } + + /** + * 批量获取关联数据并创建映射(支持自定义查询条件和多个字段) + * + * @param ids 主键ID列表 + * @param service 对应的Service + * @param idGetter ID获取函数 + * @param fieldGetters 字段获取函数映射 + * @param additionalCondition 额外的查询条件 + * @param 实体类型 + * @param ID类型 + * @return ID到字段值的映射 + */ + public static Map> batchGetFieldMap( + Collection ids, + IService service, + Function idGetter, + Map> fieldGetters, + Function, LambdaQueryWrapper> additionalCondition) { + + if (ids == null || ids.isEmpty()) { + return new HashMap<>(); + } + + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + // 使用lambda表达式来避免类型问题 + queryWrapper.in(ids.size() > 0, entity -> idGetter.apply(entity), ids); + + if (additionalCondition != null) { + queryWrapper = additionalCondition.apply(queryWrapper); + } + + List entities = service.list(queryWrapper); + + return entities.stream() + .collect(Collectors.toMap( + idGetter, + entity -> { + Map fieldMap = new HashMap<>(); + fieldGetters.forEach((fieldName, getter) -> + fieldMap.put(fieldName, getter.apply(entity))); + return fieldMap; + }, + (existing, replacement) -> existing + )); + } + + /** + * 从实体列表中提取指定字段的ID列表 + * + * @param entities 实体列表 + * @param idGetter ID获取函数 + * @param 实体类型 + * @param ID类型 + * @return ID列表 + */ + public static List extractIds( + Collection entities, + Function idGetter) { + + if (entities == null || entities.isEmpty()) { + return new ArrayList<>(); + } + + return entities.stream() + .map(idGetter) + .filter(Objects::nonNull) + .distinct() + .collect(Collectors.toList()); + } + + /** + * 从实体列表中提取指定字段的ID列表(支持过滤条件) + * + * @param entities 实体列表 + * @param idGetter ID获取函数 + * @param filter 过滤条件 + * @param 实体类型 + * @param ID类型 + * @return ID列表 + */ + public static List extractIds( + Collection entities, + Function idGetter, + Function filter) { + + if (entities == null || entities.isEmpty()) { + return new ArrayList<>(); + } + + return entities.stream() + .filter(filter::apply) + .map(idGetter) + .filter(Objects::nonNull) + .distinct() + .collect(Collectors.toList()); + } + + // ==================== 便捷方法,使用ServiceManager ==================== + + /** + * 批量获取门店名称映射(使用ServiceManager) + */ + public Map getDealershipIdNameMap(Collection dealershipIds) { + + // 批量获取门店信息 + Map dealershipNameMap; + if (!dealershipIds.isEmpty()) { + LambdaQueryWrapper dealershipQueryWrapper = new LambdaQueryWrapper<>(); + dealershipQueryWrapper.in(Dealership::getId, dealershipIds); + List dealerships = serviceManager.getDealershipService().list(dealershipQueryWrapper); + dealershipNameMap = dealerships.stream() + .collect(Collectors.toMap(Dealership::getId, Dealership::getDealershipName)); + } else { + dealershipNameMap = new HashMap<>(); + } + return dealershipNameMap; + } + + /** + * 批量获取项目名称映射(使用ServiceManager) + */ + public Map getProjectIdNameMap(Collection projectIds) { + + Map projectNameMap; + if (!projectIds.isEmpty()) { + LambdaQueryWrapper projectManagementQueryWrapper = new LambdaQueryWrapper<>(); + projectManagementQueryWrapper.in(ProjectManagement::getId, projectIds); + List projectManagementList = serviceManager.getProjectManagementService().list(projectManagementQueryWrapper); + projectNameMap = projectManagementList.stream() + .collect(Collectors.toMap(ProjectManagement::getId, ProjectManagement::getProjectName)); + } else { + projectNameMap = new HashMap<>(); + } + + + return projectNameMap; + } + + /** + * 批量获取销售名称映射(使用ServiceManager) + */ + public Map getSalesIdNameMap(Collection salesIds) { + + // 批量获取 销售信息 + Map saleNameMap; + if (!salesIds.isEmpty()) { + LambdaQueryWrapper salesQueryWrapper = new LambdaQueryWrapper<>(); + salesQueryWrapper.in(SalesManagement::getId, salesIds); + List sales = serviceManager.getSalesManagementService().list(salesQueryWrapper); + saleNameMap = sales.stream() + .collect(Collectors.toMap(SalesManagement::getId, SalesManagement::getSalesName)); + } else { + saleNameMap = new HashMap<>(); + } + + + return saleNameMap; + } + + /** + * 批量获取客户名称映射(使用ServiceManager) + */ + public Map getCustomerNameMap(Collection customerIds) { + return batchGetNameMap( + customerIds, + serviceManager.getCustomerManagementService(), + com.rj.entity.CustomerManagement::getId, + com.rj.entity.CustomerManagement::getCustomerName + ); + } + + /** + * 批量获取设备名称映射(使用ServiceManager) + */ + public Map getDeviceNameMap(Collection deviceIds) { + return batchGetNameMap( + deviceIds, + serviceManager.getDeviceManagementService(), + com.rj.entity.DeviceManagement::getId, + com.rj.entity.DeviceManagement::getDeviceCode + ); + } + + /** + * 批量获取音频名称映射(使用ServiceManager) + */ + public Map getAudioNameMap(Collection audioIds) { + return batchGetNameMap( + audioIds, + serviceManager.getAudioManagementService(), + com.rj.entity.AudioManagement::getId, + com.rj.entity.AudioManagement::getRecordingName + ); + } + + /** + * 批量获取视频名称映射(使用ServiceManager) + */ + public Map getVideoNameMap(Collection videoIds) { + return batchGetNameMap( + videoIds, + serviceManager.getVideoManagementService(), + com.rj.entity.VideoManagement::getId, + com.rj.entity.VideoManagement::getVideoName + ); + } + + /** + * 批量获取预约信息映射(使用ServiceManager) + */ + public Map getReservationNameMap(Collection reservationIds) { + return batchGetNameMap( + reservationIds, + serviceManager.getReservationService(), + com.rj.pojo.Reservation::getId, + com.rj.pojo.Reservation::getName + ); + } +} diff --git a/src/main/java/com/rj/common/DataEnrichmentUtilExample.java b/src/main/java/com/rj/common/DataEnrichmentUtilExample.java new file mode 100644 index 0000000..9bbd384 --- /dev/null +++ b/src/main/java/com/rj/common/DataEnrichmentUtilExample.java @@ -0,0 +1,164 @@ +package com.rj.common; + +import com.rj.entity.Dealership; +import com.rj.entity.ProjectManagement; +import com.rj.entity.SalesManagement; +import com.rj.service.IDealershipService; +import com.rj.service.IProjectManagementService; +import com.rj.service.ISalesManagementService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import java.util.List; +import java.util.Map; + +/** + * DataEnrichmentUtil 使用示例 + * 展示如何使用数据丰富工具类来减少代码冗余 + * + * @author 系统生成 + * @since 2025-08-07 + */ +@Component +public class DataEnrichmentUtilExample { + + @Autowired + private DataEnrichmentUtil dataEnrichmentUtil; + + @Autowired + private IDealershipService dealershipService; + + @Autowired + private IProjectManagementService projectManagementService; + + @Autowired + private ISalesManagementService salesManagementService; + + /** + * 示例1:基本用法 - 批量获取门店名称映射 + */ + public Map getDealershipNameMap(List dealershipIds) { + return DataEnrichmentUtil.batchGetNameMap( + dealershipIds, + dealershipService, + Dealership::getId, + Dealership::getDealershipName + ); + } + + /** + * 示例1-1:使用便捷方法 - 批量获取门店名称映射 + */ + public Map getDealershipNameMapEasy(List dealershipIds) { + return dataEnrichmentUtil.getDealershipIdNameMap(dealershipIds); + } + + /** + * 示例2:带条件的批量获取 - 只获取启用的门店 + */ + public Map getActiveDealershipNameMap(List dealershipIds) { + return DataEnrichmentUtil.batchGetNameMap( + dealershipIds, + dealershipService, + Dealership::getId, + Dealership::getDealershipName, + queryWrapper -> queryWrapper.eq(Dealership::getStatus, true) + ); + } + + /** + * 示例3:获取多个字段 - 获取门店的名称和地区 + */ + public Map> getDealershipInfoMap(List dealershipIds) { + Map> fieldGetters = Map.of( + "name", Dealership::getDealershipName, + "region", Dealership::getRegion, + "type", Dealership::getDealershipType + ); + + return DataEnrichmentUtil.batchGetFieldMap( + dealershipIds, + dealershipService, + Dealership::getId, + fieldGetters + ); + } + + /** + * 示例4:从实体列表中提取ID + */ + public List extractDealershipIds(List salesList) { + return DataEnrichmentUtil.extractIds(salesList, SalesManagement::getDealershipId); + } + + /** + * 示例5:带过滤条件的ID提取 - 只提取有门店ID的记录 + */ + public List extractValidDealershipIds(List salesList) { + return DataEnrichmentUtil.extractIds( + salesList, + SalesManagement::getDealershipId, + sales -> sales.getDealershipId() != null && !sales.getDealershipId().trim().isEmpty() + ); + } + + /** + * 示例6:完整的销售数据丰富流程 + */ + public void enrichSalesData(List salesList) { + // 1. 提取关联ID + List dealershipIds = DataEnrichmentUtil.extractIds(salesList, SalesManagement::getDealershipId); + List projectIds = DataEnrichmentUtil.extractIds(salesList, SalesManagement::getProjectId); + + // 2. 批量获取关联数据 + Map dealershipNameMap = DataEnrichmentUtil.batchGetNameMap( + dealershipIds, dealershipService, Dealership::getId, Dealership::getDealershipName); + + Map projectNameMap = DataEnrichmentUtil.batchGetNameMap( + projectIds, projectManagementService, ProjectManagement::getId, ProjectManagement::getProjectName); + + // 3. 填充关联数据 + salesList.forEach(sales -> { + sales.setDealershipName(dealershipNameMap.get(sales.getDealershipId())); + sales.setProjectName(projectNameMap.get(sales.getProjectId())); + }); + } + + /** + * 示例6-1:使用便捷方法的销售数据丰富流程 + */ + public void enrichSalesDataEasy(List salesList) { + // 1. 提取关联ID + List dealershipIds = DataEnrichmentUtil.extractIds(salesList, SalesManagement::getDealershipId); + List projectIds = DataEnrichmentUtil.extractIds(salesList, SalesManagement::getProjectId); + + // 2. 使用便捷方法批量获取关联数据 + Map dealershipNameMap = dataEnrichmentUtil.getDealershipIdNameMap(dealershipIds); + Map projectNameMap = dataEnrichmentUtil.getProjectIdNameMap(projectIds); + + // 3. 填充关联数据 + salesList.forEach(sales -> { + sales.setDealershipName(dealershipNameMap.get(sales.getDealershipId())); + sales.setProjectName(projectNameMap.get(sales.getProjectId())); + }); + } + + /** + * 示例7:获取项目详细信息(包含多个字段) + */ + public Map> getProjectDetailMap(List projectIds) { + Map> fieldGetters = Map.of( + "name", ProjectManagement::getProjectName, + "version", ProjectManagement::getScriptVersion, + "status", ProjectManagement::getStatus, + "group", ProjectManagement::getGroupName + ); + + return DataEnrichmentUtil.batchGetFieldMap( + projectIds, + projectManagementService, + ProjectManagement::getId, + fieldGetters + ); + } +} diff --git a/src/main/java/com/rj/common/ServiceManager.java b/src/main/java/com/rj/common/ServiceManager.java new file mode 100644 index 0000000..9cc1aa5 --- /dev/null +++ b/src/main/java/com/rj/common/ServiceManager.java @@ -0,0 +1,73 @@ +package com.rj.common; + +import com.rj.service.*; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +/** + * Service管理器 + * 统一管理所有常用的Service注入,减少Controller中的重复注入 + * + * @author 系统生成 + * @since 2025-08-07 + */ +@Component +public class ServiceManager { + + @Autowired + private IDealershipService dealershipService; + + @Autowired + private IProjectManagementService projectManagementService; + + @Autowired + private ISalesManagementService salesManagementService; + + @Autowired + private ICustomerManagementService customerManagementService; + + @Autowired + private IDeviceManagementService deviceManagementService; + + @Autowired + private IAudioManagementService audioManagementService; + + @Autowired + private IVideoManagementService videoManagementService; + + @Autowired + private IReservationService reservationService; + + // Getter方法 + public IDealershipService getDealershipService() { + return dealershipService; + } + + public IProjectManagementService getProjectManagementService() { + return projectManagementService; + } + + public ISalesManagementService getSalesManagementService() { + return salesManagementService; + } + + public ICustomerManagementService getCustomerManagementService() { + return customerManagementService; + } + + public IDeviceManagementService getDeviceManagementService() { + return deviceManagementService; + } + + public IAudioManagementService getAudioManagementService() { + return audioManagementService; + } + + public IVideoManagementService getVideoManagementService() { + return videoManagementService; + } + + public IReservationService getReservationService() { + return reservationService; + } +}