java foreach 获取对象的字段 List<company> lists

java foreach 获取对象的字段 List<company> lists 

             List<company> lists =companyRepository.findAll();

for(company i : lists)
{
        System.out.println(i.getName());
}
@Override public PageResult<PackageVO> selectPage(PackageParam param) { PageResult<PackageVO> pageResult = new PageResult<>(); LambdaQueryWrapper<PackagePO> wrapper = Wrappers.<PackagePO>lambdaQuery() .eq(StringUtils.isNotBlank(param.getCompanyCode()), PackagePO::getCompanyCode, param.getCompanyCode()) .eq(StringUtils.isNotBlank(param.getFactoryCode()), PackagePO::getFactoryCode, param.getFactoryCode()) .eq(StringUtils.isNotBlank(param.getPartCode()), PackagePO::getFactoryCode, param.getFactoryCode()) .orderByDesc(PackagePO::getCreateTime); Page<PackagePO> poPage = packageMapper.selectPage(new Page<>(param.getPageIndex(), param.getPageSize()), wrapper); if (poPage.getTotal() > 0) { // 查询所有公司 Map<String, CompanyPO> companyMap = companyMapper.selectList(Wrappers.emptyWrapper()).stream().collect(Collectors.toMap(CompanyPO::getCompanyCode, Function.identity(), BinaryOperator.maxBy(Comparator.comparing(CompanyPO::getCreateTime)))); Map<String, FactoryPO> factoryMap = factoryMapper.selectList(Wrappers.emptyWrapper()).stream().collect(Collectors.toMap(FactoryPO::getFactoryCode, Function.identity(), BinaryOperator.maxBy(Comparator.comparing(FactoryPO::getCreateTime)))); pageResult.setTotal(poPage.getTotal()); pageResult.setPageIndex(poPage.getCurrent()); pageResult.setPageSize(poPage.getSize()); List<PackageVO> voList = Lists.newArrayList(); poPage.getRecords().forEach(po -> { PackageVO vo = BeanCopyUtils.copyBean(po, PackageVO.class); CompanyPO companyPO = companyMap.get(po.getCompanyCode()); if (Objects.nonNull(companyPO)) { vo.setCompanyCode(companyPO.getCompanyCode() + "-" + companyPO.getCompanyName()); } FactoryPO factoryPO = factoryMap.get(po.getFactoryCode()); if (Objects.nonNull(factoryPO)) { vo.setFactoryCode(factoryPO.getFactoryCode()); vo.setFactoryName(factoryPO.getFactoryName()); } voList.add(vo); }); pageResult.setRecords(voList); } return pageResult; } 这段代码如果我要再查询一个零件描述,但是这个字段在tm_part中,怎么办?
10-11
package com.hvlink.service.impl; import com.alibaba.excel.EasyExcel; import com.alibaba.excel.context.AnalysisContext; import com.alibaba.excel.event.AnalysisEventListener; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.google.common.collect.Lists; import com.hvlink.common.Result; import com.hvlink.entity.dto.master.PackageExportDTO; import com.hvlink.entity.dto.master.PackageImportDTO; import com.hvlink.entity.function.PackingQuantity; import com.hvlink.entity.param.master.PackageParam; import com.hvlink.entity.po.master.CompanyPO; import com.hvlink.entity.po.master.FactoryPO; import com.hvlink.entity.po.master.PackagePO; import com.hvlink.entity.po.master.PartPO; import com.hvlink.entity.vo.master.ImportErrorVO; import com.hvlink.entity.vo.master.PackageImportResultVO; import com.hvlink.entity.vo.master.PackageVO; import com.hvlink.enums.ResultCode; import com.hvlink.exceptions.BusinessException; import com.hvlink.mapper.master.CompanyMapper; import com.hvlink.mapper.master.FactoryMapper; import com.hvlink.mapper.master.PackageMapper; import com.hvlink.mapper.master.PartMapper; import com.hvlink.pagination.PageResult; import com.hvlink.service.IPackageService; import com.hvlink.service.constant.RfcSyncConstant; import com.hvlink.utils.BeanCopyUtils; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.time.DateFormatUtils; import org.springframework.core.io.buffer.DataBuffer; import org.springframework.http.HttpHeaders; import org.springframework.http.MediaType; import org.springframework.http.codec.multipart.FilePart; import org.springframework.http.server.reactive.ServerHttpResponse; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import reactor.core.publisher.Mono; import java.io.ByteArrayOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.InputStream; import java.net.URLEncoder; import java.nio.file.Files; import java.nio.file.Path; import java.time.LocalDate; import java.time.format.DateTimeFormatter; import java.util.*; import java.util.function.BinaryOperator; import java.util.function.Function; import java.util.stream.Collectors; /** * 包装数量主数据(Package)表服务实现类 * * @author sunzhuang * @since 2025-09-10 21:54:19 */ @Slf4j @RequiredArgsConstructor @Service("packageService") public class PackageServiceImpl extends ServiceImpl<PackageMapper, PackagePO> implements IPackageService { private final PackageMapper packageMapper; private final CompanyMapper companyMapper; private final FactoryMapper factoryMapper; private final PartMapper partMapper; /** * 通过ID查询单条数据 * * @param id 主键 * @return 实例对象 */ @Override public PackageVO selectById(Integer id) { PackagePO po = packageMapper.selectById(id); if (Objects.isNull(po)) { throw new BusinessException(ResultCode.PARAM_ERROR); } return BeanCopyUtils.copyBean(po, PackageVO.class); } /** * 修改数据 * * @param param 更新参数 */ @Override public void update(PackageParam param) { PackagePO po = BeanCopyUtils.copyBean(param, PackagePO.class); packageMapper.updateById(po); } /** * 分页查询 * * @param param 查询参数 * @return 物料包装数 */ @Override public PageResult<PackageVO> selectPage(PackageParam param) { PageResult<PackageVO> pageResult = new PageResult<>(); LambdaQueryWrapper<PackagePO> wrapper = Wrappers.<PackagePO>lambdaQuery() .eq(StringUtils.isNotBlank(param.getCompanyCode()), PackagePO::getCompanyCode, param.getCompanyCode()) .eq(StringUtils.isNotBlank(param.getFactoryCode()), PackagePO::getFactoryCode, param.getFactoryCode()) .eq(StringUtils.isNotBlank(param.getPartCode()), PackagePO::getFactoryCode, param.getFactoryCode()) .orderByDesc(PackagePO::getCreateTime); Page<PackagePO> poPage = packageMapper.selectPage(new Page<>(param.getPageIndex(), param.getPageSize()), wrapper); if (poPage.getTotal() > 0) { // 查询所有公司 Map<String, CompanyPO> companyMap = companyMapper.selectList(Wrappers.emptyWrapper()).stream().collect(Collectors.toMap(CompanyPO::getCompanyCode, Function.identity(), BinaryOperator.maxBy(Comparator.comparing(CompanyPO::getCreateTime)))); Map<String, FactoryPO> factoryMap = factoryMapper.selectList(Wrappers.emptyWrapper()).stream().collect(Collectors.toMap(FactoryPO::getFactoryCode, Function.identity(), BinaryOperator.maxBy(Comparator.comparing(FactoryPO::getCreateTime)))); pageResult.setTotal(poPage.getTotal()); pageResult.setPageIndex(poPage.getCurrent()); pageResult.setPageSize(poPage.getSize()); List<PackageVO> voList = Lists.newArrayList(); poPage.getRecords().forEach(po -> { PackageVO vo = BeanCopyUtils.copyBean(po, PackageVO.class); CompanyPO companyPO = companyMap.get(po.getCompanyCode()); if (Objects.nonNull(companyPO)) { vo.setCompanyCode(companyPO.getCompanyCode() + "-" + companyPO.getCompanyName()); } FactoryPO factoryPO = factoryMap.get(po.getFactoryCode()); if (Objects.nonNull(factoryPO)) { vo.setFactoryCode(factoryPO.getFactoryCode()); vo.setFactoryName(factoryPO.getFactoryName()); } voList.add(vo); }); pageResult.setRecords(voList); } return pageResult; } /** * 处理包装数量数据 * * @param list 同步的包装数据集合 * @return 本次更新时间 */ @Override @Transactional(rollbackFor = Exception.class) public String handlePackingQuantityData(List<PackingQuantity> list) { if (CollectionUtils.isEmpty(list)) { log.info("不存在更新的包装信息"); } //查询数据库中的所有的包装信息 List<PackagePO> poList = packageMapper.selectPackageKey(); // 按照公司代码 + 工厂代码 + 物料编码 分组 Map<String, Integer> warehouseMap = poList.stream().collect(Collectors.toMap(x -> x.getCompanyCode() + x.getFactoryCode() + x.getPartCode(), PackagePO::getId, (v1, v2) -> v1)); // 新增数据集合 List<PackagePO> insertList = Lists.newArrayList(); // 更新数据集合 List<PackagePO> updateList = Lists.newArrayList(); list.forEach(x -> { // 构建主键 String key = x.getCompanyCode() + x.getFactoryCode() + x.getPartCode(); PackagePO po = BeanCopyUtils.copyBean(x, PackagePO.class); if (warehouseMap.containsKey(key)) { po.setId(warehouseMap.get(key)); po.setUpdateBy(RfcSyncConstant.DEFAULT_RFC_UPDATE_BY); updateList.add(po); } else { po.setUpdateBy(RfcSyncConstant.DEFAULT_RFC_UPDATE_BY); po.setCreateBy(RfcSyncConstant.DEFAULT_RFC_UPDATE_BY); insertList.add(po); } }); // 新增 if (CollectionUtils.isNotEmpty(insertList)) { this.saveBatch(insertList, 500); } if (CollectionUtils.isNotEmpty(updateList)) { this.updateBatchById(updateList, 500); } return DateFormatUtils.ISO_8601_EXTENDED_DATE_FORMAT.format(new Date()); } /** * 批量导出Excel */ @Override public Mono<Void> exportPackageExcel(List<Integer> selectedIds, ServerHttpResponse response) { return Mono.fromCallable(() -> { setupResponse(response, "包装数据导出"); return selectedIds; }) .flatMap(ids -> { try { // 查询数据 List<PackagePO> packageList = this.listByIds(ids); // 转换为导出DTO List<PackageExportDTO> exportData = packageList.stream() .map(po -> BeanCopyUtils.copyBean(po, PackageExportDTO.class)) .collect(Collectors.toList()); // 生成Excel数据 ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); EasyExcel.write(outputStream, PackageExportDTO.class) .sheet("包装数据") .doWrite(exportData); byte[] data = outputStream.toByteArray(); DataBuffer buffer = response.bufferFactory().wrap(data); return response.writeWith(Mono.just(buffer)); } catch (Exception e) { log.error("包装数据导出失败", e); return Mono.error(new RuntimeException("导出Excel失败", e)); } }) .doOnSuccess(v -> log.info("包装数据导出成功")) .doOnError(e -> log.error("包装数据导出失败", e)); } /** * 下载导入模板 */ @Override public Mono<Void> downloadTemplate(ServerHttpResponse response) { return Mono.fromCallable(() -> { setupResponse(response, "包装数据导入模板"); return new ArrayList<PackageImportDTO>(); }) .flatMap(templateData -> { try { ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); // 创建空的模板数据 EasyExcel.write(outputStream, PackageImportDTO.class) .sheet("包装数据导入模板") .doWrite(templateData); byte[] data = outputStream.toByteArray(); DataBuffer buffer = response.bufferFactory().wrap(data); return response.writeWith(Mono.just(buffer)); } catch (Exception e) { log.error("模板下载失败", e); return Mono.error(new RuntimeException("模板下载失败", e)); } }) .doOnSuccess(v -> log.info("包装数据导入模板下载成功")) .doOnError(e -> log.error("包装数据导入模板下载失败", e)); } /** * 导入包装数据 */ @Override public Mono<Result<PackageImportResultVO>> importPackage(FilePart filePart) { return Mono.defer(() -> { // 验证文件 if (filePart == null) { return Mono.just(Result.<PackageImportResultVO>fail("导入文件不能为空")); } String fileName = filePart.filename(); if (fileName == null || (!fileName.endsWith(".xlsx") && !fileName.endsWith(".xls"))) { return Mono.just(Result.<PackageImportResultVO>fail("请上传Excel文件")); } log.info("开始处理包装数据文件导入: {}", fileName); try { Path tempDir = Files.createTempDirectory("package_import"); Path tempFile = tempDir.resolve(System.currentTimeMillis() + "_" + fileName); return filePart.transferTo(tempFile) .then(Mono.fromCallable(() -> { try { File file = tempFile.toFile(); Result<PackageImportResultVO> importResult = processPackageExcelImport(file); log.info("包装数据文件导入完成: {}, 结果: {}", fileName, importResult.getMsg()); return importResult; } finally { // 清理临时文件 try { Files.deleteIfExists(tempFile); Files.deleteIfExists(tempDir); } catch (Exception e) { log.warn("清理临时文件失败: {}", e.getMessage()); } } })); } catch (Exception e) { log.error("创建临时文件失败", e); return Mono.just(Result.<PackageImportResultVO>fail("文件处理失败: " + e.getMessage())); } }) .onErrorResume(e -> { log.error("包装数据导入异常", e); return Mono.just(Result.<PackageImportResultVO>fail("包装数据导入异常: " + e.getMessage())); }); } /** * 处理包装数据Excel导入逻辑 */ private Result<PackageImportResultVO> processPackageExcelImport(File file) { PackageImportResultVO result = new PackageImportResultVO(); List<ImportErrorVO> errorList = new ArrayList<>(); try (InputStream inputStream = new FileInputStream(file)) { // 读取Excel数据 List<PackageImportDTO> importData = new ArrayList<>(); List<PackageImportDTO> validData = new ArrayList<>(); EasyExcel.read(inputStream, PackageImportDTO.class, new AnalysisEventListener<PackageImportDTO>() { private final List<PackageImportDTO> cachedDataList = new ArrayList<>(); @Override public void invoke(PackageImportDTO data, AnalysisContext context) { int rowIndex = context.readRowHolder().getRowIndex() + 1; // 跳过空行 if (StringUtils.isBlank(data.getCompanyCode()) && StringUtils.isBlank(data.getFactoryCode()) && StringUtils.isBlank(data.getPartCode())) { return; } // 数据校验 String errorMsg = validatePackageImportData(data, rowIndex); if (StringUtils.isNotBlank(errorMsg)) { ImportErrorVO error = new ImportErrorVO(); error.setRowNum(rowIndex); error.setErrorMsg(errorMsg); error.setPartCode(data.getPartCode()); errorList.add(error); } else { data.setRowNum(rowIndex); cachedDataList.add(data); } } @Override public void doAfterAllAnalysed(AnalysisContext context) { importData.addAll(cachedDataList); validData.addAll(cachedDataList); } @Override public void onException(Exception exception, AnalysisContext context) throws Exception { log.error("Excel读取异常,行号: {}", context.readRowHolder().getRowIndex(), exception); throw exception; } }).sheet().doRead(); // 如果有错误数据,终止导入 if (!errorList.isEmpty()) { result.setTotalCount(importData.size() + errorList.size()); result.setSuccessCount(0); result.setFailCount(errorList.size()); result.setErrorList(errorList); result.setMessage("导入失败:存在错误数据,请修正后重新导入"); return Result.fail("导入失败:存在错误数据"); } // 处理有效数据 if (!validData.isEmpty()) { processPackageImportData(validData, errorList); } // 设置返回结果 result.setTotalCount(importData.size()); result.setSuccessCount(validData.size() - errorList.size()); result.setFailCount(errorList.size()); result.setErrorList(errorList); result.setMessage(String.format("导入完成:成功%d条,失败%d条", result.getSuccessCount(), result.getFailCount())); log.info("包装数据导入完成:总数={}, 成功={}, 失败={}", result.getTotalCount(), result.getSuccessCount(), result.getFailCount()); return Result.success(result); } catch (Exception e) { log.error("处理Excel文件异常", e); return Result.fail("处理Excel文件失败: " + e.getMessage()); } } /** * 验证包装数据导入数据 */ private String validatePackageImportData(PackageImportDTO data, int rowNum) { StringBuilder errorMsg = new StringBuilder(); // 必填字段校验 if (StringUtils.isBlank(data.getCompanyCode())) { errorMsg.append("公司代码不能为空; "); } if (StringUtils.isBlank(data.getFactoryCode())) { errorMsg.append("工厂代码不能为空; "); } else { // 工厂校验 FactoryPO factory = factoryMapper.selectOne( Wrappers.<FactoryPO>lambdaQuery() .eq(FactoryPO::getFactoryCode, data.getFactoryCode()) .eq(FactoryPO::getIsDeleted, 0) ); if (factory == null) { errorMsg.append("工厂代码不存在; "); } else if ("已禁用".equals(factory.getStatus())) { errorMsg.append("工厂代码已禁用; "); } } if (StringUtils.isBlank(data.getPartCode())) { errorMsg.append("零件号不能为空; "); } else { // 零件校验 Long partCount = partMapper.selectCount( Wrappers.<PartPO>lambdaQuery() .eq(PartPO::getPartCode, data.getPartCode()) .eq(PartPO::getIsDeleted, 0) ); if (partCount == 0) { errorMsg.append("零件号不存在; "); } } // 数值校验 if (data.getBoxQuantity() != null && data.getBoxQuantity() < 0) { errorMsg.append("箱数量不能小于0; "); } if (data.getPackageQuantity() != null && data.getPackageQuantity() < 0) { errorMsg.append("包数量不能小于0; "); } if (data.getDragQuantity() != null && data.getDragQuantity() < 0) { errorMsg.append("托数量不能小于0; "); } // 重复性校验 if (StringUtils.isNotBlank(data.getCompanyCode()) && StringUtils.isNotBlank(data.getFactoryCode()) && StringUtils.isNotBlank(data.getPartCode())) { Long count = this.baseMapper.selectCount( Wrappers.<PackagePO>lambdaQuery() .eq(PackagePO::getCompanyCode, data.getCompanyCode()) .eq(PackagePO::getFactoryCode, data.getFactoryCode()) .eq(PackagePO::getPartCode, data.getPartCode()) .eq(PackagePO::getIsDeleted, 0) ); if (count > 0) { errorMsg.append("公司代码+工厂代码+零件号组合已存在; "); } } return errorMsg.length() > 0 ? errorMsg.toString() : null; } /** * 处理包装数据导入 */ private void processPackageImportData(List<PackageImportDTO> validData, List<ImportErrorVO> errorList) { String currentUser = "import_user"; for (PackageImportDTO dto : validData) { try { // 转换为PO PackagePO packagePO = BeanCopyUtils.copyBean(dto, PackagePO.class); packagePO.setCreateBy(currentUser); packagePO.setUpdateBy(currentUser); // 保存到数据库 this.baseMapper.insert(packagePO); log.info("包装数据导入成功 - 公司代码: {}, 工厂代码: {}, 零件号: {}", dto.getCompanyCode(), dto.getFactoryCode(), dto.getPartCode()); } catch (Exception e) { log.error("包装数据导入失败 - 公司代码: {}, 工厂代码: {}, 零件号: {}", dto.getCompanyCode(), dto.getFactoryCode(), dto.getPartCode(), e); ImportErrorVO error = new ImportErrorVO(); error.setRowNum(dto.getRowNum()); error.setErrorMsg("系统错误: " + e.getMessage()); error.setPartCode(dto.getPartCode()); errorList.add(error); } } } /** * 设置HTTP响应头 */ private void setupResponse(ServerHttpResponse response, String filePrefix) { try { response.getHeaders().setContentType(MediaType.APPLICATION_OCTET_STREAM); String fileName = URLEncoder.encode(filePrefix + "_" + LocalDate.now().format(DateTimeFormatter.ofPattern("yyyyMMdd")), "UTF-8"); String contentDisposition = "attachment; filename=" + fileName + ".xlsx"; response.getHeaders().set(HttpHeaders.CONTENT_DISPOSITION, contentDisposition); response.getHeaders().set(HttpHeaders.CACHE_CONTROL, "no-cache, no-store, must-revalidate"); response.getHeaders().set(HttpHeaders.PRAGMA, "no-cache"); response.getHeaders().set(HttpHeaders.EXPIRES, "0"); } catch (Exception e) { log.error("响应头设置失败", e); throw new RuntimeException("响应头设置失败", e); } } } 加个校验,如果表头对不上,直接不执行导入,提示导入模板错误
09-29
2025-10-10 15:50:54.243 [reactor-http-nio-3] DEBUG reactor.netty.http.server.HttpServerOperations - [878d9f59, L:/0:0:0:0:0:0:0:1:9000 - R:/0:0:0:0:0:0:0:1:9429] New http connection, requesting read 2025-10-10 15:50:54.243 [reactor-http-nio-2] DEBUG reactor.netty.http.server.HttpServerOperations - [29cf522f, L:/0:0:0:0:0:0:0:1:9000 - R:/0:0:0:0:0:0:0:1:9428] New http connection, requesting read 2025-10-10 15:50:54.243 [reactor-http-nio-3] DEBUG reactor.netty.transport.TransportConfig - [878d9f59, L:/0:0:0:0:0:0:0:1:9000 - R:/0:0:0:0:0:0:0:1:9429] Initialized pipeline DefaultChannelPipeline{(reactor.left.httpCodec = io.netty.handler.codec.http.HttpServerCodec), (reactor.left.httpTrafficHandler = reactor.netty.http.server.HttpTrafficHandler), (reactor.right.reactiveBridge = reactor.netty.channel.ChannelOperationsHandler)} 2025-10-10 15:50:54.243 [reactor-http-nio-2] DEBUG reactor.netty.transport.TransportConfig - [29cf522f, L:/0:0:0:0:0:0:0:1:9000 - R:/0:0:0:0:0:0:0:1:9428] Initialized pipeline DefaultChannelPipeline{(reactor.left.httpCodec = io.netty.handler.codec.http.HttpServerCodec), (reactor.left.httpTrafficHandler = reactor.netty.http.server.HttpTrafficHandler), (reactor.right.reactiveBridge = reactor.netty.channel.ChannelOperationsHandler)} 2025-10-10 15:50:54.302 [reactor-http-nio-3] DEBUG reactor.netty.http.server.HttpServerOperations - [878d9f59, L:/0:0:0:0:0:0:0:1:9000 - R:/0:0:0:0:0:0:0:1:9429] Increasing pending responses, now 1 2025-10-10 15:50:54.346 [reactor-http-nio-3] DEBUG reactor.netty.http.server.HttpServer - [878d9f59-1, L:/0:0:0:0:0:0:0:1:9000 - R:/0:0:0:0:0:0:0:1:9429] Handler is being applied: org.springframework.http.server.reactive.ReactorHttpHandlerAdapter@7d9ebaec 2025-10-10 15:50:54.472 [reactor-http-nio-3] DEBUG o.s.web.server.adapter.HttpWebHandlerAdapter - [878d9f59-1] HTTP POST "/master/inventory/query" 2025-10-10 15:50:54.533 [reactor-http-nio-3] DEBUG o.s.w.r.r.m.a.RequestMappingHandlerMapping - [878d9f59-1] Mapped to com.hvlink.controller.InventoryController#selectQuery(InventoryParam) 2025-10-10 15:50:54.581 [reactor-http-nio-3] DEBUG o.s.w.r.r.m.a.RequestBodyMethodArgumentResolver - [878d9f59-1] Content-Type:application/json 2025-10-10 15:50:54.602 [reactor-http-nio-3] DEBUG o.s.w.r.r.m.a.RequestBodyMethodArgumentResolver - [878d9f59-1] 0..1 [com.hvlink.entity.param.master.InventoryParam] 2025-10-10 15:50:54.668 [reactor-http-nio-3] DEBUG reactor.netty.channel.FluxReceive - [878d9f59-1, L:/0:0:0:0:0:0:0:1:9000 - R:/0:0:0:0:0:0:0:1:9429] [terminated=false, cancelled=false, pending=0, error=null]: subscribing inbound receiver 2025-10-10 15:50:54.786 [reactor-http-nio-3] DEBUG o.s.http.codec.json.Jackson2JsonDecoder - [878d9f59-1] Decoded [InventoryParam(id=null, companyCode=null, supplierCode=null, supplierName=null, factoryCode=null, fa (truncated)...] 2025-10-10 15:50:54.944 [reactor-http-nio-3] DEBUG org.mybatis.spring.SqlSessionUtils - Creating a new SqlSession 2025-10-10 15:50:54.985 [reactor-http-nio-3] DEBUG org.mybatis.spring.SqlSessionUtils - SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@4efe01a7] was not registered for synchronization because synchronization is not active 2025-10-10 15:50:55.586 [reactor-http-nio-3] DEBUG o.springframework.jdbc.datasource.DataSourceUtils - Fetching JDBC Connection from DataSource 2025-10-10 15:50:55.640 [reactor-http-nio-3] DEBUG o.m.spring.transaction.SpringManagedTransaction - JDBC Connection [ConnectionID:1 ClientConnectionId: e1375d39-6e8e-4da3-98f2-2d170aa65263] will not be managed by Spring 2025-10-10 15:50:55.663 [reactor-http-nio-3] DEBUG c.h.m.master.InventoryMapper.selectPage_mpCount - ==> Preparing: SELECT COUNT(*) AS total FROM tb_inventory WHERE (is_deleted = ?) 2025-10-10 15:50:55.837 [reactor-http-nio-3] DEBUG c.h.m.master.InventoryMapper.selectPage_mpCount - ==> Parameters: 0(Integer) 2025-10-10 15:50:55.955 [reactor-http-nio-3] DEBUG c.h.m.master.InventoryMapper.selectPage_mpCount - <== Total: 1 2025-10-10 15:50:55.970 [reactor-http-nio-3] DEBUG c.hvlink.mapper.master.InventoryMapper.selectPage - ==> Preparing: SELECT id,company_code,supplier_code,factory_code,warehouse_code,part_code,part_desc,supplier_part_code,unit,special_flag,batch_no,no_limit_quantity,quality_quantity,freeze_quantity,is_deleted,create_by,create_time,update_by,update_time FROM tb_inventory WHERE (is_deleted = ?) ORDER BY update_time DESC OFFSET ? ROWS FETCH NEXT ? ROWS ONLY 2025-10-10 15:50:55.970 [reactor-http-nio-3] DEBUG c.hvlink.mapper.master.InventoryMapper.selectPage - ==> Parameters: 0(Integer), 0(Long), 10(Long) 2025-10-10 15:50:56.095 [reactor-http-nio-3] DEBUG c.hvlink.mapper.master.InventoryMapper.selectPage - <== Total: 10 2025-10-10 15:50:56.096 [reactor-http-nio-3] DEBUG org.mybatis.spring.SqlSessionUtils - Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@4efe01a7] 2025-10-10 15:50:56.096 [reactor-http-nio-3] DEBUG org.mybatis.spring.SqlSessionUtils - Creating a new SqlSession 2025-10-10 15:50:56.096 [reactor-http-nio-3] DEBUG org.mybatis.spring.SqlSessionUtils - SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@34d0be99] was not registered for synchronization because synchronization is not active 2025-10-10 15:50:56.097 [reactor-http-nio-3] DEBUG o.springframework.jdbc.datasource.DataSourceUtils - Fetching JDBC Connection from DataSource 2025-10-10 15:50:56.097 [reactor-http-nio-3] DEBUG o.m.spring.transaction.SpringManagedTransaction - JDBC Connection [ConnectionID:1 ClientConnectionId: e1375d39-6e8e-4da3-98f2-2d170aa65263] will not be managed by Spring 2025-10-10 15:50:56.097 [reactor-http-nio-3] DEBUG com.hvlink.mapper.master.SupplierMapper.selectList - ==> Preparing: SELECT id,company_code,supplier_code,supplier_name,supplier_tel,remark,is_deleted,create_by,create_time,update_by,update_time FROM tm_supplier 2025-10-10 15:50:56.097 [reactor-http-nio-3] DEBUG com.hvlink.mapper.master.SupplierMapper.selectList - ==> Parameters: 2025-10-10 15:50:56.128 [reactor-http-nio-3] DEBUG com.hvlink.mapper.master.SupplierMapper.selectList - <== Total: 18 2025-10-10 15:50:56.128 [reactor-http-nio-3] DEBUG org.mybatis.spring.SqlSessionUtils - Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@34d0be99] 2025-10-10 15:50:56.130 [reactor-http-nio-3] DEBUG org.mybatis.spring.SqlSessionUtils - Creating a new SqlSession 2025-10-10 15:50:56.130 [reactor-http-nio-3] DEBUG org.mybatis.spring.SqlSessionUtils - SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@2baf52bc] was not registered for synchronization because synchronization is not active 2025-10-10 15:50:56.130 [reactor-http-nio-3] DEBUG o.springframework.jdbc.datasource.DataSourceUtils - Fetching JDBC Connection from DataSource 2025-10-10 15:50:56.130 [reactor-http-nio-3] DEBUG o.m.spring.transaction.SpringManagedTransaction - JDBC Connection [ConnectionID:1 ClientConnectionId: e1375d39-6e8e-4da3-98f2-2d170aa65263] will not be managed by Spring 2025-10-10 15:50:56.130 [reactor-http-nio-3] DEBUG com.hvlink.mapper.master.FactoryMapper.selectList - ==> Preparing: SELECT id,company_code,factory_code,factory_name,status,is_deleted,create_by,create_time,update_by,update_time FROM tm_factory 2025-10-10 15:50:56.130 [reactor-http-nio-3] DEBUG com.hvlink.mapper.master.FactoryMapper.selectList - ==> Parameters: 2025-10-10 15:50:56.154 [reactor-http-nio-3] DEBUG com.hvlink.mapper.master.FactoryMapper.selectList - <== Total: 2 2025-10-10 15:50:56.154 [reactor-http-nio-3] DEBUG org.mybatis.spring.SqlSessionUtils - Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@2baf52bc] 2025-10-10 15:50:56.155 [reactor-http-nio-3] DEBUG org.mybatis.spring.SqlSessionUtils - Creating a new SqlSession 2025-10-10 15:50:56.156 [reactor-http-nio-3] DEBUG org.mybatis.spring.SqlSessionUtils - SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@2a657005] was not registered for synchronization because synchronization is not active 2025-10-10 15:50:56.156 [reactor-http-nio-3] DEBUG o.springframework.jdbc.datasource.DataSourceUtils - Fetching JDBC Connection from DataSource 2025-10-10 15:50:56.156 [reactor-http-nio-3] DEBUG o.m.spring.transaction.SpringManagedTransaction - JDBC Connection [ConnectionID:1 ClientConnectionId: e1375d39-6e8e-4da3-98f2-2d170aa65263] will not be managed by Spring 2025-10-10 15:50:56.156 [reactor-http-nio-3] DEBUG com.hvlink.mapper.master.PackageMapper.selectList - ==> Preparing: SELECT id,company_code,factory_code,part_code,unit,standard_package,box_quantity,package_quantity,drag_quantity,max_inventory_level,safety_inventory,is_deleted,create_by,create_time,update_by,update_time FROM tm_package 2025-10-10 15:50:56.156 [reactor-http-nio-3] DEBUG com.hvlink.mapper.master.PackageMapper.selectList - ==> Parameters: 2025-10-10 15:51:12.916 [reactor-http-nio-3] DEBUG com.hvlink.mapper.master.PackageMapper.selectList - <== Total: 186869 2025-10-10 15:51:12.916 [reactor-http-nio-3] DEBUG org.mybatis.spring.SqlSessionUtils - Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@2a657005] 2025-10-10 15:51:13.154 [reactor-http-nio-3] DEBUG reactor.netty.channel.ChannelOperations - [878d9f59-1, L:/0:0:0:0:0:0:0:1:9000 - R:/0:0:0:0:0:0:0:1:9429] [HttpServer] Channel inbound receiver cancelled (operation cancelled). 2025-10-10 15:51:13.174 [reactor-http-nio-3] DEBUG o.s.w.r.r.m.a.RequestMappingHandlerAdapter - [878d9f59-1] Using @ExceptionHandler com.hvlink.exceptions.ExceptionHandle#handleException(Exception) 2025-10-10 15:51:13.195 [reactor-http-nio-3] ERROR com.hvlink.exceptions.ExceptionHandle - ===空指针异常== java.lang.NullPointerException: null at com.hvlink.service.impl.InventoryServiceImpl.lambda$selectQuery$5(InventoryServiceImpl.java:183) Suppressed: reactor.core.publisher.FluxOnAssembly$OnAssemblyException: Assembly trace from producer [reactor.core.publisher.MonoFlatMap] : reactor.core.publisher.Mono.flatMap(Mono.java:3137) org.springframework.web.reactive.result.method.InvocableHandlerMethod.invoke(InvocableHandlerMethod.java:136) Error has been observed at the following site(s): *___Mono.flatMap ⇢ at org.springframework.web.reactive.result.method.InvocableHandlerMethod.invoke(InvocableHandlerMethod.java:136) *_____Mono.defer ⇢ at org.springframework.web.reactive.result.method.annotation.RequestMappingHandlerAdapter.handle(RequestMappingHandlerAdapter.java:200) *______Mono.then ⇢ at org.springframework.web.reactive.result.method.annotation.RequestMappingHandlerAdapter.handle(RequestMappingHandlerAdapter.java:200) |_ Mono.doOnNext ⇢ at org.springframework.web.reactive.result.method.annotation.RequestMappingHandlerAdapter.handle(RequestMappingHandlerAdapter.java:201) |_ Mono.doOnNext ⇢ at org.springframework.web.reactive.result.method.annotation.RequestMappingHandlerAdapter.handle(RequestMappingHandlerAdapter.java:202) Original Stack Trace: at com.hvlink.service.impl.InventoryServiceImpl.lambda$selectQuery$5(InventoryServiceImpl.java:183) at java.util.ArrayList.forEach(ArrayList.java:1259) at com.hvlink.service.impl.InventoryServiceImpl.selectQuery(InventoryServiceImpl.java:163) at com.hvlink.service.impl.InventoryServiceImpl$$FastClassBySpringCGLIB$$64fe8815.invoke(<generated>) at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218) at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:792) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163) at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:762) at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:97) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:762) at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:707) at com.hvlink.service.impl.InventoryServiceImpl$$EnhancerBySpringCGLIB$$319300a8.selectQuery(<generated>) at com.hvlink.controller.InventoryController.selectQuery(InventoryController.java:39) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:498) at org.springframework.web.reactive.result.method.InvocableHandlerMethod.lambda$invoke$0(InvocableHandlerMethod.java:145) at reactor.core.publisher.MonoFlatMap$FlatMapMain.onNext(MonoFlatMap.java:125) at reactor.core.publisher.Operators$MonoSubscriber.complete(Operators.java:1839) at reactor.core.publisher.MonoZip$ZipCoordinator.signal(MonoZip.java:258) at reactor.core.publisher.MonoZip$ZipInner.onNext(MonoZip.java:347) at reactor.core.publisher.MonoPeekTerminal$MonoTerminalPeekSubscriber.onNext(MonoPeekTerminal.java:180) at reactor.core.publisher.FluxDefaultIfEmpty$DefaultIfEmptySubscriber.onNext(FluxDefaultIfEmpty.java:101) at reactor.core.publisher.FluxSwitchIfEmpty$SwitchIfEmptySubscriber.onNext(FluxSwitchIfEmpty.java:74) at reactor.core.publisher.FluxOnErrorResume$ResumeSubscriber.onNext(FluxOnErrorResume.java:79) at reactor.core.publisher.Operators$MonoSubscriber.complete(Operators.java:1839) at reactor.core.publisher.MonoFlatMap$FlatMapMain.onNext(MonoFlatMap.java:151) at reactor.core.publisher.FluxContextWrite$ContextWriteSubscriber.onNext(FluxContextWrite.java:107) at reactor.core.publisher.FluxMapFuseable$MapFuseableConditionalSubscriber.onNext(FluxMapFuseable.java:299) at reactor.core.publisher.FluxFilterFuseable$FilterFuseableConditionalSubscriber.onNext(FluxFilterFuseable.java:337) at reactor.core.publisher.Operators$MonoSubscriber.complete(Operators.java:1839) at reactor.core.publisher.MonoCollect$CollectSubscriber.onComplete(MonoCollect.java:160) at reactor.core.publisher.FluxMapFuseable$MapFuseableSubscriber.onComplete(FluxMapFuseable.java:152) at reactor.core.publisher.FluxPeekFuseable$PeekFuseableSubscriber.onComplete(FluxPeekFuseable.java:277) at reactor.core.publisher.FluxMap$MapSubscriber.onComplete(FluxMap.java:144) at reactor.netty.channel.FluxReceive.onInboundComplete(FluxReceive.java:415) at reactor.netty.channel.ChannelOperations.onInboundComplete(ChannelOperations.java:439) at reactor.netty.http.server.HttpServerOperations.onInboundNext(HttpServerOperations.java:656) at reactor.netty.channel.ChannelOperationsHandler.channelRead(ChannelOperationsHandler.java:114) at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:444) at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:420) at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:412) at reactor.netty.http.server.HttpTrafficHandler.channelRead(HttpTrafficHandler.java:276) at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:442) at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:420) at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:412) at io.netty.channel.CombinedChannelDuplexHandler$DelegatingChannelHandlerContext.fireChannelRead(CombinedChannelDuplexHandler.java:436) at io.netty.handler.codec.ByteToMessageDecoder.fireChannelRead(ByteToMessageDecoder.java:346) at io.netty.handler.codec.ByteToMessageDecoder.channelRead(ByteToMessageDecoder.java:318) at io.netty.channel.CombinedChannelDuplexHandler.channelRead(CombinedChannelDuplexHandler.java:251) at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:442) at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:420) at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:412) at io.netty.channel.DefaultChannelPipeline$HeadContext.channelRead(DefaultChannelPipeline.java:1410) at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:440) at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:420) at io.netty.channel.DefaultChannelPipeline.fireChannelRead(DefaultChannelPipeline.java:919) at io.netty.channel.nio.AbstractNioByteChannel$NioByteUnsafe.read(AbstractNioByteChannel.java:166) at io.netty.channel.nio.NioEventLoop.processSelectedKey(NioEventLoop.java:788) at io.netty.channel.nio.NioEventLoop.processSelectedKeysOptimized(NioEventLoop.java:724) at io.netty.channel.nio.NioEventLoop.processSelectedKeys(NioEventLoop.java:650) at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:562) at io.netty.util.concurrent.SingleThreadEventExecutor$4.run(SingleThreadEventExecutor.java:997) at io.netty.util.internal.ThreadExecutorMap$2.run(ThreadExecutorMap.java:74) at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30) at java.lang.Thread.run(Thread.java:750) 2025-10-10 15:51:13.206 [reactor-http-nio-3] DEBUG o.s.w.r.r.m.annotation.ResponseBodyResultHandler - [878d9f59-1] Using 'application/json' given [*/*] and supported [application/json, application/*+json, application/x-ndjson, text/event-stream] 2025-10-10 15:51:13.206 [reactor-http-nio-3] DEBUG o.s.w.r.r.m.annotation.ResponseBodyResultHandler - [878d9f59-1] 0..1 [com.hvlink.common.Result<?>] 2025-10-10 15:51:13.242 [reactor-http-nio-3] DEBUG o.s.http.codec.json.Jackson2JsonEncoder - [878d9f59-1] Encoding [Result(status=500, msg=发现未知问题,请联系管理员!, data=null, timestamp=1760082673200)] 2025-10-10 15:51:13.301 [reactor-http-nio-3] DEBUG reactor.netty.http.server.HttpServerOperations - [878d9f59-1, L:/0:0:0:0:0:0:0:1:9000 - R:/0:0:0:0:0:0:0:1:9429] Decreasing pending responses, now 0 2025-10-10 15:51:13.302 [reactor-http-nio-3] DEBUG reactor.netty.http.server.HttpServerOperations - [878d9f59-1, L:/0:0:0:0:0:0:0:1:9000 - R:/0:0:0:0:0:0:0:1:9429] Last HTTP packet was sent, terminating the channel 2025-10-10 15:51:13.328 [reactor-http-nio-3] DEBUG o.s.web.server.adapter.HttpWebHandlerAdapter - [878d9f59-1] Completed 500 INTERNAL_SERVER_ERROR 2025-10-10 15:51:13.341 [reactor-http-nio-3] DEBUG reactor.netty.http.server.HttpServerOperations - [878d9f59-1, L:/0:0:0:0:0:0:0:1:9000 - R:/0:0:0:0:0:0:0:1:9429] Last HTTP response frame /** * 分页查询库存信息 * @param inventoryParam 查询参数 * @return 分页结果 */ @Override public PageResult<InventoryVO> selectQuery(InventoryParam inventoryParam) { PageResult<InventoryVO> pageResult = new PageResult<>(); // 构建查询条件 LambdaQueryWrapper<InventoryPO> wrapper = Wrappers.<InventoryPO>lambdaQuery() .eq(StringUtils.isNotBlank(inventoryParam.getCompanyCode()), InventoryPO::getCompanyCode, inventoryParam.getCompanyCode()) .eq(StringUtils.isNotBlank(inventoryParam.getFactoryCode()), InventoryPO::getFactoryCode, inventoryParam.getFactoryCode()) .eq(StringUtils.isNotBlank(inventoryParam.getSupplierCode()), InventoryPO::getSupplierCode, inventoryParam.getSupplierCode()) .like(StringUtils.isNotBlank(inventoryParam.getPartCode()), InventoryPO::getPartCode, inventoryParam.getPartCode()) .like(StringUtils.isNotBlank(inventoryParam.getPartDesc()), InventoryPO::getPartDesc, inventoryParam.getPartDesc()) .eq(InventoryPO::getIsDeleted, 0) // 只查询未删除的记录 .orderByDesc(InventoryPO::getUpdateTime); Page<InventoryPO> poPage = inventoryMapper.selectPage(new Page<>(inventoryParam.getPageIndex(), inventoryParam.getPageSize()), wrapper); if (poPage.getTotal() > 0) { // 查询所有供应商信息 Map<String, SupplierPO> supplierMap = supplierMapper.selectList(Wrappers.emptyWrapper()).stream() .collect(Collectors.toMap( SupplierPO::getSupplierCode, Function.identity(), BinaryOperator.maxBy(Comparator.comparing(SupplierPO::getCreateTime)) )); // 查询所有工厂信息 Map<String, FactoryPO> factoryMap = factoryMapper.selectList(Wrappers.emptyWrapper()).stream() .collect(Collectors.toMap( FactoryPO::getFactoryCode, Function.identity(), BinaryOperator.maxBy(Comparator.comparing(FactoryPO::getCreateTime)) )); // 查询所有包装信息(获取安全库存) Map<String, PackagePO> packageMap = packageMapper.selectList(Wrappers.emptyWrapper()).stream() .collect(Collectors.toMap( po -> po.getFactoryCode() + "_" + po.getPartCode(), // 使用工厂代码和零件号作为组合键 Function.identity(), BinaryOperator.maxBy(Comparator.comparing(PackagePO::getCreateTime)) )); pageResult.setTotal(poPage.getTotal()); pageResult.setPageIndex(poPage.getCurrent()); pageResult.setPageSize(poPage.getSize()); List<InventoryVO> voList = Lists.newArrayList(); poPage.getRecords().forEach(po -> { InventoryVO vo = BeanCopyUtils.copyBean(po, InventoryVO.class); // 设置供应商信息 SupplierPO supplierPO = supplierMap.get(po.getSupplierCode()); if (Objects.nonNull(supplierPO)) { vo.setSupplierName(supplierPO.getSupplierName()); } // 设置工厂信息 FactoryPO factoryPO = factoryMap.get(po.getFactoryCode()); if (Objects.nonNull(factoryPO)) { vo.setFactoryName(factoryPO.getFactoryName()); } // 设置安全库存信息和库存状态 String packageKey = po.getFactoryCode() + "_" + po.getPartCode(); PackagePO packagePO = packageMap.get(packageKey); if (Objects.nonNull(packagePO)) { // 计算库存状态:如果可用库存低于安全库存,则为"过少",否则为"正常" if (po.getNoLimitQuantity() < packagePO.getSafetyInventory()) { vo.setInventoryStatus("过少"); } else { vo.setInventoryStatus("正常"); } } else { // 如果没有找到对应的包装信息,状态设为正常 vo.setInventoryStatus("正常"); } voList.add(vo); }); pageResult.setRecords(voList); } return pageResult; } 为什么查出来那么多条,一共十八万多条,但是我的数据库中只有几百条数据,是不是笛卡尔积?
最新发布
10-11
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值