From 29ee20d602892dfdc311a89794520d1241023133 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=BE=BE=E5=AF=8C=E6=96=8C?= Date: Fri, 12 Sep 2025 16:21:31 +0800 Subject: [PATCH] =?UTF-8?q?fix=20(farm):=20=E9=9B=86=E6=88=90=E6=B5=8B?= =?UTF-8?q?=E8=AF=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 基地规划 , 基地名称不可重复 , 新增,修改 加入面积验证逻辑 --- .../module/farm/enums/ErrorCodeConstants.java | 3 +- .../service/baseinfo/BaseInfoServiceImpl.java | 23 +++++++++---- .../CropFarmingCenterServiceImpl.java | 3 -- .../service/plotinfo/PlotInfoServiceImpl.java | 33 +++++++++---------- .../productionplan/ProductionPlanService.java | 6 ++++ .../ProductionPlanServiceImpl.java | 19 +++++++++-- 6 files changed, 56 insertions(+), 31 deletions(-) diff --git a/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/enums/ErrorCodeConstants.java b/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/enums/ErrorCodeConstants.java index 1d428d0b..74a9ec57 100644 --- a/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/enums/ErrorCodeConstants.java +++ b/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/enums/ErrorCodeConstants.java @@ -11,6 +11,7 @@ public interface ErrorCodeConstants { // ========== 基地管理 1-050-000-000 ========== ErrorCode BASE_INFO_NOT_EXISTS = new ErrorCode(1_050_000_000, "基地不存在"); + ErrorCode BASE_NAME_ERROR = new ErrorCode(1_050_000_001, "基地名称重复"); // ========== 公司信息 1-050-001-000 ========== ErrorCode COMPANY_INFO_NOT_EXISTS = new ErrorCode(1_050_001_000, "公司信息不存在"); @@ -122,7 +123,7 @@ public interface ErrorCodeConstants { ErrorCode PLOT_AREA_ERRORS = new ErrorCode(1_050_036_000, "地块面积总和大于基地面积"); ErrorCode PLOT_AREA_EXISTS_ERRORS = new ErrorCode(1_050_036_001, "该基地存在地块,不可删除"); ErrorCode BEING_PLOT_AREA_EXISTS_ERRORS = new ErrorCode(1_050_036_002, "该基地存在在种地块,不可删除"); - ErrorCode BASE_PLOT_AREA_ERRORS = new ErrorCode(1_050_036_003, "该基地面积小于地块面积总和,不可删除"); + ErrorCode BASE_PLOT_AREA_ERRORS = new ErrorCode(1_050_036_003, "该基地面积小于地块面积总和,不可修改"); ErrorCode INDICATOR_NAME_NOT_EXISTS = new ErrorCode(1_050_037_000, "指标名称不存在"); diff --git a/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/service/baseinfo/BaseInfoServiceImpl.java b/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/service/baseinfo/BaseInfoServiceImpl.java index e9af198b..43babac4 100644 --- a/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/service/baseinfo/BaseInfoServiceImpl.java +++ b/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/service/baseinfo/BaseInfoServiceImpl.java @@ -80,6 +80,7 @@ public class BaseInfoServiceImpl implements BaseInfoService { @Override public String createBaseInfo(BaseInfoSaveReqVO createReqVO) { LoginUser user = getLoginUser(); + validateBaseArea(createReqVO.getName()); // 插入 BaseInfoDO baseInfo = BeanUtils.toBean(createReqVO, BaseInfoDO.class); baseInfo.setId(IdUtil.fastUUID()); @@ -110,15 +111,16 @@ public class BaseInfoServiceImpl implements BaseInfoService { public void deleteBaseInfo(String id) { // 校验存在 validateBaseInfoExists(id); - // 校验: 存在在种地块时 不允许删除 - boolean flag = productionPlanService.validateIncompletePlansBId("base_id", id); - if (!flag) { - throw exception(BEING_PLOT_AREA_EXISTS_ERRORS); - } + // 存在地块,不可删除 boolean flag2 = plotInfoService.validatePlotExistByBaseId(id); if (!flag2) { throw exception(PLOT_AREA_EXISTS_ERRORS); } + // 校验: 存在在种地块时 不允许删除 +// boolean flag = productionPlanService.validateIncompletePlansBId("base_id", id); +// if (!flag) { +// throw exception(BEING_PLOT_AREA_EXISTS_ERRORS); +// } // 删除 baseInfoMapper.deleteById(id); plotInfoService.deleteByBaseId(id); @@ -136,13 +138,20 @@ public class BaseInfoServiceImpl implements BaseInfoService { } } + private void validateBaseArea(String baseName) { + BaseInfoDO one = baseInfoMapper.selectOne("name", baseName); + if (ObjectUtils.isNotEmpty(one)) { + throw exception(BASE_NAME_ERROR); + } + } + /** * 修改后的基地面积 不可小于 其地块面积总和 * @param id * @param updateBaseArea */ private void validateBaseArea(String id,BigDecimal updateBaseArea) { - if (!plotInfoService.validateTotalPlotArea(id,updateBaseArea)) { + if (plotInfoService.validateTotalPlotArea(id,updateBaseArea)) { throw exception(BASE_PLOT_AREA_ERRORS); } } @@ -236,7 +245,7 @@ public class BaseInfoServiceImpl implements BaseInfoService { // 基地总数 Integer baseCount = baseInfoMapper.getBaseCount(tenantId); // 在种作物总数 - Integer cropCount = speciesLibraryMapper.getSpeciesCount(tenantId, ""); + Integer cropCount = productionPlanService.getGrowingCropCountByTenantId(String.valueOf(tenantId)); // 基地总面积 BigDecimal areaCount = new BigDecimal("0.00"); if (baseCount > 0) { diff --git a/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/service/cropFarmingCenter/CropFarmingCenterServiceImpl.java b/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/service/cropFarmingCenter/CropFarmingCenterServiceImpl.java index 25dfd2a3..b1fc9e7c 100644 --- a/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/service/cropFarmingCenter/CropFarmingCenterServiceImpl.java +++ b/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/service/cropFarmingCenter/CropFarmingCenterServiceImpl.java @@ -515,9 +515,6 @@ public class CropFarmingCenterServiceImpl implements CropFarmingCenterService { @Override public BasePlanOverviewRespVO getBaseOverview(String baseId) { - if (StringUtils.isEmpty(baseId)) { - return null; - } LoginUser user = getLoginUser(); Long tenantId = user.getTenantId(); BigDecimal totalArea = baseInfoMapper.getTotalBaseArea(baseId, tenantId); diff --git a/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/service/plotinfo/PlotInfoServiceImpl.java b/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/service/plotinfo/PlotInfoServiceImpl.java index 2efa9970..b9b77fa8 100644 --- a/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/service/plotinfo/PlotInfoServiceImpl.java +++ b/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/service/plotinfo/PlotInfoServiceImpl.java @@ -155,28 +155,25 @@ public class PlotInfoServiceImpl implements PlotInfoService { } private boolean validateCurrentPlotArea(String baseId, String plotId, BigDecimal currentPlotArea) { - BaseInfoDO baseObj = baseInfoMapper.selectOne("id", baseId); - BigDecimal baseArea = baseObj.getArea(); - List plotInfoDOS = plotInfoMapper.selectList("base_id", baseId); - if (plotInfoDOS == null || plotInfoDOS.isEmpty()) { - return false; - } - - BigDecimal plotTotalArea = plotInfoDOS.stream() - .map(PlotInfoDO::getPlotArea) - .filter(area -> area != null) // 重要:过滤null值 - .reduce(BigDecimal.ZERO, BigDecimal::add); BigDecimal currentTotalArea = null; - if (plotId == null) { - currentTotalArea = plotTotalArea.add(currentPlotArea); + if (plotInfoDOS == null || plotInfoDOS.isEmpty()) { + currentTotalArea = currentPlotArea; }else{ - PlotInfoDO one = plotInfoMapper.selectOne("id", plotId); - BigDecimal sourcePlotArea = one.getPlotArea(); - currentTotalArea = plotTotalArea.subtract(sourcePlotArea).add(currentPlotArea); + BigDecimal plotTotalArea = plotInfoDOS.stream().map(PlotInfoDO::getPlotArea).filter(area -> area != null).reduce(BigDecimal.ZERO, BigDecimal::add); + if (null == plotId) { + currentTotalArea = plotTotalArea.add(currentPlotArea); + }else{ + PlotInfoDO one = plotInfoMapper.selectOne("id", plotId); + currentTotalArea = plotTotalArea.subtract(one.getPlotArea()).add(currentPlotArea); + } } + // 计算基地面积 + BaseInfoDO baseObj = baseInfoMapper.selectOne("id", baseId); + BigDecimal baseArea = baseObj.getArea(); + // 比对 return currentTotalArea.compareTo(baseArea) > 0; } @@ -190,8 +187,8 @@ public class PlotInfoServiceImpl implements PlotInfoService { .map(PlotInfoDO::getPlotArea) .filter(area -> area != null) // 重要:过滤null值 .reduce(BigDecimal.ZERO, BigDecimal::add); - - return plotTotalArea.compareTo(baseArea) > 0; + boolean b = plotTotalArea.compareTo(baseArea) > 0; + return b; } } \ No newline at end of file diff --git a/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/service/productionplan/ProductionPlanService.java b/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/service/productionplan/ProductionPlanService.java index f5ccb246..634fe37b 100644 --- a/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/service/productionplan/ProductionPlanService.java +++ b/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/service/productionplan/ProductionPlanService.java @@ -124,7 +124,13 @@ public interface ProductionPlanService { */ int getGrowingCropCount(String baseId); int getGrowingCropCount(String baseId,String plotId); + int getGrowingCropCountByTenantId(String tenantId); + /** + * 在种计划 + * @param baseId + * @return + */ int getGrowingPlanCount(String baseId); /** diff --git a/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/service/productionplan/ProductionPlanServiceImpl.java b/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/service/productionplan/ProductionPlanServiceImpl.java index fe4c9be5..53d4a602 100644 --- a/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/service/productionplan/ProductionPlanServiceImpl.java +++ b/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/service/productionplan/ProductionPlanServiceImpl.java @@ -216,11 +216,12 @@ public class ProductionPlanServiceImpl implements ProductionPlanService { public boolean validateIncompletePlansBId(String field,String baseId) { List planList = productionPlanMapper.selectList(field, baseId); Set planStatusSet = planList.stream() - .filter(e -> !ObjectUtils.notEqual(e.getPlanStatus(), PLAN_STATUS_3)) + .filter(e -> ObjectUtils.notEqual(e.getPlanStatus(), PLAN_STATUS_3)) .map(ProductionPlanDO::getPlanStatus) .collect(Collectors.toSet()); // 存在未完成状态的计划 不可删除 - return planStatusSet.size() <= 0; + boolean b = planStatusSet.size() <= 0; + return b; } @Override @@ -259,6 +260,20 @@ public class ProductionPlanServiceImpl implements ProductionPlanService { .count(); } + @Override + public int getGrowingCropCountByTenantId(String tenantId) { + QueryWrapper qw = new QueryWrapper<>(); + qw.eq("tenant_id", tenantId); + List planList = productionPlanMapper.selectList(qw); + return (int) planList.stream() + .filter(Objects::nonNull) + .filter(plan -> Objects.equals(plan.getPlanStatus(), PLAN_STATUS_2)) + .map(ProductionPlanDO::getPlantSpeciesCode) + .filter(Objects::nonNull) + .distinct() + .count(); + } + @Override public int getGrowingPlanCount(String baseId) { List planList = productionPlanMapper.selectList("base_id", baseId);