diff --git a/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/controller/admin/traceabilitycode/TraceabilityCodeController.java b/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/controller/admin/traceabilitycode/TraceabilityCodeController.java index 29703a7f..5d5260fe 100644 --- a/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/controller/admin/traceabilitycode/TraceabilityCodeController.java +++ b/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/controller/admin/traceabilitycode/TraceabilityCodeController.java @@ -7,6 +7,7 @@ import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.common.util.object.BeanUtils; import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils; import cn.iocoder.yudao.module.farm.controller.admin.traceabilitycode.vo.TraceabilityCodePageReqVO; +import cn.iocoder.yudao.module.farm.controller.admin.traceabilitycode.vo.TraceabilityCodePageWithStatsRespVO; import cn.iocoder.yudao.module.farm.controller.admin.traceabilitycode.vo.TraceabilityCodeRespVO; import cn.iocoder.yudao.module.farm.controller.admin.traceabilitycode.vo.TraceabilityCodeSaveReqVO; import cn.iocoder.yudao.module.farm.dal.dataobject.traceabilitycode.TraceabilityCodeDO; @@ -23,7 +24,6 @@ import org.springframework.web.bind.annotation.*; import java.io.IOException; import java.util.List; -import java.util.stream.Collectors; import static cn.iocoder.yudao.framework.apilog.core.enums.OperateTypeEnum.EXPORT; import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; @@ -75,29 +75,17 @@ public class TraceabilityCodeController { } @GetMapping("/page") - @Operation(summary = "获得溯源-溯源码分页") - public CommonResult> getTraceabilityCodePage(@Valid TraceabilityCodePageReqVO pageReqVO) { - PageResult pageResult = traceabilityCodeService.getTraceabilityCodePage(pageReqVO); - // 转换分页结果中的每个DO对象为RespVO对象 - PageResult respPageResult = new PageResult<>(); - respPageResult.setList(pageResult.getList().stream() - .map(TraceabilityDataConverter::convertToRespVO) - .collect(Collectors.toList())); - respPageResult.setTotal(pageResult.getTotal()); - return success(respPageResult); + @Operation(summary = "获得溯源-溯源码分页(含统计信息)") + public CommonResult getTraceabilityCodePage(@Valid TraceabilityCodePageReqVO pageReqVO) { + TraceabilityCodePageWithStatsRespVO result = traceabilityCodeService.getTraceabilityCodePageWithStats(pageReqVO); + return success(result); } @GetMapping("/list") - @Operation(summary = "获得溯源-溯源码批次集合") - public CommonResult> getTraceabilityCodeList(@Valid TraceabilityCodePageReqVO pageReqVO) { - PageResult pageResult = traceabilityCodeService.getTraceabilityCodeList(pageReqVO); - // 转换分页结果中的每个DO对象为RespVO对象 - PageResult respPageResult = new PageResult<>(); - respPageResult.setList(pageResult.getList().stream() - .map(TraceabilityDataConverter::convertToRespVO) - .collect(Collectors.toList())); - respPageResult.setTotal(pageResult.getTotal()); - return success(respPageResult); + @Operation(summary = "获得溯源-溯源码批次集合(含统计信息)") + public CommonResult getTraceabilityCodeList(@Valid TraceabilityCodePageReqVO pageReqVO) { + TraceabilityCodePageWithStatsRespVO result = traceabilityCodeService.getTraceabilityCodeListWithStats(pageReqVO); + return success(result); } @GetMapping("/export-excel") diff --git a/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/controller/admin/traceabilitycode/vo/TraceabilityCodeRespVO.java b/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/controller/admin/traceabilitycode/vo/TraceabilityCodeRespVO.java index 05f1aa0c..02d7d4dc 100644 --- a/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/controller/admin/traceabilitycode/vo/TraceabilityCodeRespVO.java +++ b/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/controller/admin/traceabilitycode/vo/TraceabilityCodeRespVO.java @@ -169,6 +169,7 @@ public class TraceabilityCodeRespVO { @Schema(description = "创建时间") @ExcelProperty("创建时间") private LocalDateTime createTime; + private String creator; private String codeOutBatch; private Long scanCodeCount; diff --git a/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/dal/dataobject/environmentindicators/EnvironmentIndicatorsDO.java b/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/dal/dataobject/environmentindicators/EnvironmentIndicatorsDO.java index a6a659e0..95e54c88 100644 --- a/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/dal/dataobject/environmentindicators/EnvironmentIndicatorsDO.java +++ b/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/dal/dataobject/environmentindicators/EnvironmentIndicatorsDO.java @@ -59,6 +59,6 @@ public class EnvironmentIndicatorsDO extends BaseDO { * 说明 */ private String description; - + private String tenantId; } \ No newline at end of file diff --git a/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/dal/mysql/traceabilitycode/TraceabilityCodeMapper.java b/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/dal/mysql/traceabilitycode/TraceabilityCodeMapper.java index 228eb88a..1f570a1c 100644 --- a/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/dal/mysql/traceabilitycode/TraceabilityCodeMapper.java +++ b/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/dal/mysql/traceabilitycode/TraceabilityCodeMapper.java @@ -7,8 +7,12 @@ import cn.iocoder.yudao.module.farm.controller.admin.traceabilitycode.vo.Traceab import cn.iocoder.yudao.module.farm.dal.dataobject.traceabilitycode.TraceabilityCodeDO; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; +import org.apache.ibatis.annotations.Select; -import java.util.*; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.Map; import java.util.stream.Collectors; /** @@ -83,6 +87,44 @@ public interface TraceabilityCodeMapper extends BaseMapperX @Param("codeOutBatch") String codeOutBatch, @Param("status") Long status); + /** + * 统计溯源码数量信息 + */ + @Select("") + Map selectStatistics(@Param("tenantId") String tenantId, + @Param("speciesCode") String speciesCode, + @Param("speciesName") String speciesName, + @Param("baseId") String baseId, + @Param("baseName") String baseName, + @Param("plotId") String plotId, + @Param("plotName") String plotName, + @Param("harvestDateStart") String harvestDateStart, + @Param("harvestDateEnd") String harvestDateEnd, + @Param("farmingInputCount") Long farmingInputCount, + @Param("productId") String productId, + @Param("productName") String productName, + @Param("codeOutBatch") String codeOutBatch); + default PageResult selectPageList(TraceabilityCodePageReqVO reqVO) { // 先查询符合条件的最新记录ID列表 List latestRecords = selectLatestByCodeOutBatch( @@ -101,12 +143,12 @@ public interface TraceabilityCodeMapper extends BaseMapperX reqVO.getCodeOutBatch(), reqVO.getStatus() ); - + // 如果没有记录,直接返回空结果 if (latestRecords.isEmpty()) { return new PageResult<>(Collections.emptyList(), 0L); } - + // 按CodeOutBatch去重,确保每个批次只保留一条记录(保留最新的) Map uniqueBatchMap = latestRecords.stream() .filter(record -> record.getCodeOutBatch() != null) // 过滤掉批次为空的记录 @@ -121,10 +163,10 @@ public interface TraceabilityCodeMapper extends BaseMapperX return existing.getCreateTime() != null ? existing : replacement; } )); - + // 转换为去重后的列表 List uniqueRecords = new ArrayList<>(uniqueBatchMap.values()); - + // 按创建时间倒序排序 uniqueRecords.sort((a, b) -> { if (a.getCreateTime() == null && b.getCreateTime() == null) return 0; @@ -132,12 +174,12 @@ public interface TraceabilityCodeMapper extends BaseMapperX if (b.getCreateTime() == null) return -1; return b.getCreateTime().compareTo(a.getCreateTime()); }); - + // 提取ID列表 List ids = uniqueRecords.stream() .map(TraceabilityCodeDO::getId) .collect(Collectors.toList()); - + // 根据ID列表进行分页查询,获取完整的记录信息 return selectPage(reqVO, new LambdaQueryWrapperX() .in(TraceabilityCodeDO::getId, ids) diff --git a/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/service/environmentindicators/EnvironmentIndicatorsServiceImpl.java b/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/service/environmentindicators/EnvironmentIndicatorsServiceImpl.java index 8c5138fb..e8d77b41 100644 --- a/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/service/environmentindicators/EnvironmentIndicatorsServiceImpl.java +++ b/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/service/environmentindicators/EnvironmentIndicatorsServiceImpl.java @@ -1,7 +1,9 @@ package cn.iocoder.yudao.module.farm.service.environmentindicators; +import cn.hutool.core.util.IdUtil; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.common.util.object.BeanUtils; +import cn.iocoder.yudao.framework.security.core.LoginUser; import cn.iocoder.yudao.module.farm.controller.admin.environmentindicators.vo.EnvironmentIndicatorsPageReqVO; import cn.iocoder.yudao.module.farm.controller.admin.environmentindicators.vo.EnvironmentIndicatorsSaveReqVO; import cn.iocoder.yudao.module.farm.dal.dataobject.environmentindicators.EnvironmentIndicatorsDO; @@ -13,6 +15,7 @@ import org.springframework.validation.annotation.Validated; import java.util.List; import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; +import static cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils.getLoginUser; import static cn.iocoder.yudao.module.farm.enums.ErrorCodeConstants.ENVIRONMENT_INDICATORS_NOT_EXISTS; /** @@ -29,8 +32,10 @@ public class EnvironmentIndicatorsServiceImpl implements EnvironmentIndicatorsSe @Override public Integer createEnvironmentIndicators(EnvironmentIndicatorsSaveReqVO createReqVO) { + LoginUser user = getLoginUser(); // 插入 EnvironmentIndicatorsDO environmentIndicators = BeanUtils.toBean(createReqVO, EnvironmentIndicatorsDO.class); + environmentIndicators.setTenantId(String.valueOf(user.getTenantId())); environmentIndicatorsMapper.insert(environmentIndicators); // 返回 diff --git a/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/service/traceabilitycode/TraceabilityCodeService.java b/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/service/traceabilitycode/TraceabilityCodeService.java index 87d4bcf8..20023e6a 100644 --- a/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/service/traceabilitycode/TraceabilityCodeService.java +++ b/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/service/traceabilitycode/TraceabilityCodeService.java @@ -2,6 +2,7 @@ package cn.iocoder.yudao.module.farm.service.traceabilitycode; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.module.farm.controller.admin.traceabilitycode.vo.TraceabilityCodePageReqVO; +import cn.iocoder.yudao.module.farm.controller.admin.traceabilitycode.vo.TraceabilityCodePageWithStatsRespVO; import cn.iocoder.yudao.module.farm.controller.admin.traceabilitycode.vo.TraceabilityCodeSaveReqVO; import cn.iocoder.yudao.module.farm.dal.dataobject.traceabilitycode.TraceabilityCodeDO; import jakarta.validation.Valid; @@ -63,4 +64,20 @@ public interface TraceabilityCodeService { TraceabilityCodeDO scanTraceabilityCode(String id); PageResult getTraceabilityCodeList(@Valid TraceabilityCodePageReqVO pageReqVO); + + /** + * 获得溯源-溯源码分页(含统计信息) + * + * @param pageReqVO 分页查询 + * @return 溯源-溯源码分页(含统计信息) + */ + TraceabilityCodePageWithStatsRespVO getTraceabilityCodePageWithStats(@Valid TraceabilityCodePageReqVO pageReqVO); + + /** + * 获得溯源-溯源码批次集合(含统计信息) + * + * @param pageReqVO 分页查询 + * @return 溯源-溯源码批次集合(含统计信息) + */ + TraceabilityCodePageWithStatsRespVO getTraceabilityCodeListWithStats(@Valid TraceabilityCodePageReqVO pageReqVO); } \ No newline at end of file diff --git a/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/service/traceabilitycode/TraceabilityCodeServiceImpl.java b/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/service/traceabilitycode/TraceabilityCodeServiceImpl.java index c8df0040..e3d4b3a1 100644 --- a/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/service/traceabilitycode/TraceabilityCodeServiceImpl.java +++ b/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/service/traceabilitycode/TraceabilityCodeServiceImpl.java @@ -8,9 +8,12 @@ import cn.iocoder.yudao.framework.common.util.object.BeanUtils; import cn.iocoder.yudao.framework.dict.core.DictFrameworkUtils; import cn.iocoder.yudao.framework.security.core.LoginUser; import cn.iocoder.yudao.module.farm.controller.admin.traceabilitycode.vo.TraceabilityCodePageReqVO; +import cn.iocoder.yudao.module.farm.controller.admin.traceabilitycode.vo.TraceabilityCodePageWithStatsRespVO; +import cn.iocoder.yudao.module.farm.controller.admin.traceabilitycode.vo.TraceabilityCodeRespVO; import cn.iocoder.yudao.module.farm.controller.admin.traceabilitycode.vo.TraceabilityCodeSaveReqVO; import cn.iocoder.yudao.module.farm.dal.dataobject.traceabilitycode.TraceabilityCodeDO; import cn.iocoder.yudao.module.farm.dal.mysql.traceabilitycode.TraceabilityCodeMapper; +import cn.iocoder.yudao.module.farm.framework.util.TraceabilityDataConverter; import jakarta.annotation.Resource; import org.springframework.stereotype.Service; import org.springframework.validation.annotation.Validated; @@ -18,6 +21,8 @@ import org.springframework.validation.annotation.Validated; import java.text.SimpleDateFormat; import java.util.Date; import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; import static cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils.getLoginUser; @@ -296,4 +301,82 @@ public class TraceabilityCodeServiceImpl implements TraceabilityCodeService { // 这里我们不需要实际转换,因为DO对象保持Long类型用于数据库存储 // 转换将在VO层进行,确保前端接收到的是Boolean类型 } + + @Override + public TraceabilityCodePageWithStatsRespVO getTraceabilityCodePageWithStats(TraceabilityCodePageReqVO pageReqVO) { + // 获取分页数据 + PageResult pageResult = getTraceabilityCodePage(pageReqVO); + + // 获取统计信息 + Map statisticsMap = traceabilityCodeMapper.selectStatistics( + pageReqVO.getTenantId(), + pageReqVO.getSpeciesCode(), + pageReqVO.getSpeciesName(), + pageReqVO.getBaseId(), + pageReqVO.getBaseName(), + pageReqVO.getPlotId(), + pageReqVO.getPlotName(), + pageReqVO.getHarvestDateStart(), + pageReqVO.getHarvestDateEnd(), + pageReqVO.getFarmingInputCount(), + pageReqVO.getProductId(), + pageReqVO.getProductName(), + pageReqVO.getCodeOutBatch() + ); + + // 转换统计信息 + TraceabilityCodePageWithStatsRespVO.StatisticsInfo statistics = new TraceabilityCodePageWithStatsRespVO.StatisticsInfo( + ((Number) statisticsMap.get("totalAmount")).longValue(), + ((Number) statisticsMap.get("normalAmount")).longValue(), + ((Number) statisticsMap.get("wasteAmount")).longValue() + ); + + // 转换分页结果为VO + PageResult respPageResult = new PageResult<>(); + respPageResult.setList(pageResult.getList().stream() + .map(TraceabilityDataConverter::convertToRespVO) + .collect(Collectors.toList())); + respPageResult.setTotal(pageResult.getTotal()); + + return new TraceabilityCodePageWithStatsRespVO(respPageResult, statistics); + } + + @Override + public TraceabilityCodePageWithStatsRespVO getTraceabilityCodeListWithStats(TraceabilityCodePageReqVO pageReqVO) { + // 获取分页数据 + PageResult pageResult = getTraceabilityCodeList(pageReqVO); + + // 获取统计信息 + Map statisticsMap = traceabilityCodeMapper.selectStatistics( + pageReqVO.getTenantId(), + pageReqVO.getSpeciesCode(), + pageReqVO.getSpeciesName(), + pageReqVO.getBaseId(), + pageReqVO.getBaseName(), + pageReqVO.getPlotId(), + pageReqVO.getPlotName(), + pageReqVO.getHarvestDateStart(), + pageReqVO.getHarvestDateEnd(), + pageReqVO.getFarmingInputCount(), + pageReqVO.getProductId(), + pageReqVO.getProductName(), + pageReqVO.getCodeOutBatch() + ); + + // 转换统计信息 + TraceabilityCodePageWithStatsRespVO.StatisticsInfo statistics = new TraceabilityCodePageWithStatsRespVO.StatisticsInfo( + ((Number) statisticsMap.get("totalAmount")).longValue(), + ((Number) statisticsMap.get("normalAmount")).longValue(), + ((Number) statisticsMap.get("wasteAmount")).longValue() + ); + + // 转换分页结果为VO + PageResult respPageResult = new PageResult<>(); + respPageResult.setList(pageResult.getList().stream() + .map(TraceabilityDataConverter::convertToRespVO) + .collect(Collectors.toList())); + respPageResult.setTotal(pageResult.getTotal()); + + return new TraceabilityCodePageWithStatsRespVO(respPageResult, statistics); + } } \ No newline at end of file