From 92599e36164b59ec5f83a03d26d9ca2d4031cdf7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=BE=BE=E5=AF=8C=E6=96=8C?= Date: Thu, 11 Sep 2025 21:19:45 +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 - 生产计划 - 模型周期 --- .../vo/ProductionPlanPage2ReqVO.java | 2 +- .../productionplan/ProductionPlanMapper.java | 2 +- .../CropFarmingCenterServiceImpl.java | 21 ++++++--- .../inputlibrary/InputLibraryServiceImpl.java | 22 --------- .../ModelManagementServiceImpl.java | 45 ++++++++++++++----- .../ModelPestDiseaseWeedServiceImpl.java | 14 +++--- .../ModelWeatherDisasterServiceImpl.java | 14 +++--- .../mapper/modelcycle/ModelCycleMapper.xml | 2 +- 8 files changed, 64 insertions(+), 58 deletions(-) diff --git a/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/controller/admin/cropFarmingCenter/vo/ProductionPlanPage2ReqVO.java b/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/controller/admin/cropFarmingCenter/vo/ProductionPlanPage2ReqVO.java index 8e992088..6f0f9b21 100644 --- a/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/controller/admin/cropFarmingCenter/vo/ProductionPlanPage2ReqVO.java +++ b/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/controller/admin/cropFarmingCenter/vo/ProductionPlanPage2ReqVO.java @@ -31,7 +31,7 @@ public class ProductionPlanPage2ReqVO extends PageParam { private String productionYear; @Schema(description = "计划执行状态") - private Integer planStatus; + private Integer status; /** * 租户ID diff --git a/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/dal/mysql/productionplan/ProductionPlanMapper.java b/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/dal/mysql/productionplan/ProductionPlanMapper.java index b3b97f67..4d091c98 100644 --- a/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/dal/mysql/productionplan/ProductionPlanMapper.java +++ b/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/dal/mysql/productionplan/ProductionPlanMapper.java @@ -49,7 +49,7 @@ public interface ProductionPlanMapper extends BaseMapperX { // ) .eqIfPresent(ProductionPlanDO::getBaseId, reqVO.getBaseId()) .eqIfPresent(ProductionPlanDO::getPlotId, reqVO.getPlotId()) - .eqIfPresent(ProductionPlanDO::getPlanStatus, reqVO.getPlanStatus()) + .eqIfPresent(ProductionPlanDO::getPlanStatus, reqVO.getStatus()) .eqIfPresent(ProductionPlanDO::getTenantId, reqVO.getTenantId()) .orderByDesc(ProductionPlanDO::getCreateTime); 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 a658ae41..25dfd2a3 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 @@ -31,6 +31,7 @@ import cn.iocoder.yudao.module.farm.utils.StrHelperUtil; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.ObjectUtils; +import org.apache.commons.lang3.StringUtils; import org.springframework.stereotype.Service; import java.math.BigDecimal; @@ -226,7 +227,7 @@ public class CropFarmingCenterServiceImpl implements CropFarmingCenterService { String plotId = productionPlanRespVO.getPlotId(); PlotInfoDO plotIObj = plotInfoService.getPlotInfoByPlotId(plotId); productionPlanRespVO.setPlotManger(employeeNameMap.getOrDefault(plotIObj.getEmployeeId(),"系统")); - // 管理周期 + return productionPlanRespVO; } @@ -365,6 +366,12 @@ public class CropFarmingCenterServiceImpl implements CropFarmingCenterService { ModelManagementDO modelManagementDo = modelManagementService.getModelManagement("id", planObj.getSpeciesModelId()); String managementCycleName = modelManagementService.getModelCycleName(planObj.getSpeciesModelId()); + // 农事记录进度 + int progressNumerator = 1; // 生产计划 - 农事记录 条数 + int progressDenominator = 1; // 农事记录总数 (引用模型 - 农事记录) + String progressRatio = ""; // 百分比 + String progressBar = "1/100"; // 进度条 + ProductionPlanResp2VO.ModelInfo modelInfo = new ProductionPlanResp2VO.ModelInfo(); modelInfo.setId(modelManagementDo.getId()); modelInfo.setModelName(modelManagementDo.getModelName()); @@ -375,14 +382,13 @@ public class CropFarmingCenterServiceImpl implements CropFarmingCenterService { modelInfo.setPlanSubStatus(ObjectUtils.defaultIfNull(planObj.getPlanSubStatus(), planObj.getPlanStatus())); modelInfo.setPlanStatusName(PLAN_MAP.getOrDefault(planObj.getPlanStatus(), "")); modelInfo.setPlanSubStatusName(PLAN_MAP.getOrDefault(planObj.getPlanSubStatus(), "")); - modelInfo.setManagementCycleName(managementCycleName); modelInfo.setPredictedArea(planObj.getPredictedArea().intValue()); modelInfo.setPredictedYields(planObj.getPredictedYields()); - modelInfo.setProgressBar("1/10"); // TODO: 2025/8/30 农事记录 - modelInfo.setProgressRatio("10"); // TODO: 2025/8/31 - modelInfo.setProgressNumerator(1); - modelInfo.setProgressDenominator(10); + modelInfo.setProgressBar(progressBar); + modelInfo.setProgressRatio(progressRatio); + modelInfo.setProgressNumerator(progressNumerator); + modelInfo.setProgressDenominator(progressDenominator); modelInfo.setBaseName(planObj.getBaseName()); modelInfo.setBaseManager(employeeNameMap.get(employeeId)); // 分割, return modelInfo; @@ -509,6 +515,9 @@ 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/inputlibrary/InputLibraryServiceImpl.java b/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/service/inputlibrary/InputLibraryServiceImpl.java index 28957821..b19f5888 100644 --- a/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/service/inputlibrary/InputLibraryServiceImpl.java +++ b/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/service/inputlibrary/InputLibraryServiceImpl.java @@ -58,32 +58,10 @@ public class InputLibraryServiceImpl implements InputLibraryService { inputLibrary.setId(id); inputLibrary.setTenantId(String.valueOf(user.getTenantId())); inputLibraryMapper.insert(inputLibrary); - // 同步 - this.syncCreateDict(id); // 返回 return inputLibrary.getId(); } - private void syncCreateDict(String id) { - List list = sysDictMapper.groupByFieldCode(DICT_TYPE_CODE_4); - Map parentMap = list.stream().collect(Collectors.toMap(SysDictDO::getField1Code, SysDictDO::getField1Name, (v1, v2) -> v1)); - - InputLibraryDO aDo = inputLibraryMapper.selectById(id); - Integer assetType = aDo.getAssetType();// 父类编号 - String assetName = aDo.getAssetName();// 子类名称 - - SysDictDO insertObj = new SysDictDO(); - insertObj.setDictTypeCode(DICT_TYPE_CODE_4); - insertObj.setDictTypeName("投入品"); - insertObj.setField1Code(assetType.toString()); - insertObj.setField1Name(parentMap.get(assetType)); - insertObj.setField2Code(StrHelperUtil.generate()); - insertObj.setField2Name(assetName); - insertObj.setStatus(CommonConstants.YES_CODE); - insertObj.setDeleted(false); - sysDictMapper.insertOne(insertObj); - } - @Override public void updateInputLibrary(InputLibrarySaveReqVO updateReqVO) { // 校验存在 diff --git a/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/service/modelmanagement/ModelManagementServiceImpl.java b/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/service/modelmanagement/ModelManagementServiceImpl.java index 9906f132..4a87a0d9 100644 --- a/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/service/modelmanagement/ModelManagementServiceImpl.java +++ b/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/service/modelmanagement/ModelManagementServiceImpl.java @@ -151,23 +151,21 @@ public class ModelManagementServiceImpl implements ModelManagementService { // 4. 复制模型周期及其子集 List originalCycles = modelCycleMapper.selectListByModelId(id); - long originalStageCount_start = 0; - long originalStageCount_end = 0; + // 累计天数 + int accumulatedDays = 0; for (ModelCycleDO originalCycle : originalCycles) { + // 设置周期范围-开始.结束日期 + StageRecord stageRecord = setProductionStages(accumulatedDays, originalCycle, productionStartDate, productionEndDate); + accumulatedDays = stageRecord.v0; + // 复制周期 ModelCycleDO newCycle = BeanUtils.toBean(originalCycle, ModelCycleDO.class); String newCycleId = IdUtil.fastUUID(); newCycle.setId(newCycleId); newCycle.setModelId(newModelId); - // 设置周期范围-开始.结束日期 - originalStageCount_end += originalCycle.getStage(); // 阶段天数 - LocalDate cycleRangeStartDate = productionStartDate.plusDays(originalStageCount_start); - LocalDate cycleRangeEndDate = productionEndDate.plusDays(originalStageCount_end); - newCycle.setCycleRangeStartDate(cycleRangeStartDate); - newCycle.setCycleRangeEndDate(cycleRangeEndDate); + newCycle.setCycleRangeStartDate(stageRecord.v1); + newCycle.setCycleRangeEndDate(stageRecord.v2); modelCycleMapper.insert(newCycle); - // 推进阶段天数 - originalStageCount_start = originalStageCount_end; // 复制环境指标 List environmentIndexes = modelEnvironmentIndexMapper.selectByCycleId(originalCycle.getId()); @@ -219,6 +217,31 @@ public class ModelManagementServiceImpl implements ModelManagementService { return newModelId; } + public record StageRecord(int v0, LocalDate v1, LocalDate v2) { } + + private StageRecord setProductionStages(int accumulatedDays, ModelCycleDO originalCycle, LocalDate productionStartDate, LocalDate productionEndDate) { + + // 当前阶段天数 + int currentStageDays = originalCycle.getStage(); + LocalDate cycleRangeStartDate; + if (accumulatedDays == 0) { + // 第一阶段开始日期 = 生产开始日期 + 0天 + cycleRangeStartDate = productionStartDate.plusDays(0); + } else { + // 后续阶段开始日期 = 生产开始日期 + 累计天数 + 1天(避免重叠) + cycleRangeStartDate = productionStartDate.plusDays(accumulatedDays + 1); + } + // 计算当前阶段的结束日期 + LocalDate cycleRangeEndDate = productionStartDate.plusDays(accumulatedDays + currentStageDays); + // 确保结束日期不超过总范围的结束日期 + if (cycleRangeEndDate.isAfter(productionEndDate)) { + cycleRangeEndDate = productionEndDate; + } + // 更新累计天数 + accumulatedDays += currentStageDays; + return new StageRecord(accumulatedDays, cycleRangeStartDate, cycleRangeEndDate); + } + @Override public void updateModelManagement(ModelManagementSaveReqVO updateReqVO) { // 校验存在 @@ -299,7 +322,7 @@ public class ModelManagementServiceImpl implements ModelManagementService { List list = modelCycleMapper.selectListByModelId(id); list.forEach(cycle -> { ModelCycleRespVO vo = BeanUtils.toBean(cycle, ModelCycleRespVO.class); - vo.setStageImageList(cycle.getStageImageList()); + vo.setStageImageList(cycle.getImageList()); //环境指标 List environmentIndexDO = modelEnvironmentIndexMapper.selectByCycleId(cycle.getId()); vo.setEnvironmentIndexDOS(environmentIndexDO); diff --git a/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/service/modelpestdiseaseweed/ModelPestDiseaseWeedServiceImpl.java b/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/service/modelpestdiseaseweed/ModelPestDiseaseWeedServiceImpl.java index 29d6b31e..5078387e 100644 --- a/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/service/modelpestdiseaseweed/ModelPestDiseaseWeedServiceImpl.java +++ b/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/service/modelpestdiseaseweed/ModelPestDiseaseWeedServiceImpl.java @@ -44,10 +44,9 @@ public class ModelPestDiseaseWeedServiceImpl implements ModelPestDiseaseWeedServ DisasterDataDO disasterDataDO = disasterDataMapper.selectById(createReqVO.getPestsId()); modelPestDiseaseWeed.setDisasterDescription(disasterDataDO.getDisasterDescription()); modelPestDiseaseWeed.setTreatmentSuggestion(disasterDataDO.getTreatmentSuggestion()); - if (createReqVO.getImage() != null) { - modelPestDiseaseWeed.setImage(createReqVO.getImage() + "," + disasterDataDO.getImgUrl()); - } else { - modelPestDiseaseWeed.setImage(disasterDataDO.getImgUrl()); + // set 图片地址 + for (String image : createReqVO.getImageList()) { + modelPestDiseaseWeed.setImage(image); } modelPestDiseaseWeedMapper.insert(modelPestDiseaseWeed); @@ -64,10 +63,9 @@ public class ModelPestDiseaseWeedServiceImpl implements ModelPestDiseaseWeedServ DisasterDataDO disasterDataDO = disasterDataMapper.selectById(updateReqVO.getPestsId()); updateObj.setDisasterDescription(disasterDataDO.getDisasterDescription()); updateObj.setTreatmentSuggestion(disasterDataDO.getTreatmentSuggestion()); - if (updateReqVO.getImage() != null) { - updateObj.setImage(updateReqVO.getImage() + "," + disasterDataDO.getImgUrl()); - } else { - updateObj.setImage(disasterDataDO.getImgUrl()); + // set 图片地址 + for (String image : updateReqVO.getImageList()) { + updateObj.setImage(image); } modelPestDiseaseWeedMapper.updateById(updateObj); } diff --git a/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/service/modelweatherdisaster/ModelWeatherDisasterServiceImpl.java b/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/service/modelweatherdisaster/ModelWeatherDisasterServiceImpl.java index 1a8a9f56..5f903e35 100644 --- a/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/service/modelweatherdisaster/ModelWeatherDisasterServiceImpl.java +++ b/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/service/modelweatherdisaster/ModelWeatherDisasterServiceImpl.java @@ -45,10 +45,9 @@ public class ModelWeatherDisasterServiceImpl implements ModelWeatherDisasterServ DisasterDataDO disasterDataDO = disasterDataMapper.selectById(createReqVO.getWeatherId()); modelWeatherDisaster.setDisasterDescription(disasterDataDO.getDisasterDescription()); modelWeatherDisaster.setTreatmentSuggestion(disasterDataDO.getTreatmentSuggestion()); - if (createReqVO.getImage() != null) { - modelWeatherDisaster.setImage(createReqVO.getImage() + "," + disasterDataDO.getImgUrl()); - } else { - modelWeatherDisaster.setImage(disasterDataDO.getImgUrl()); + // set 图片地址 + for (String image : createReqVO.getImageList()) { + modelWeatherDisaster.setImage(image); } modelWeatherDisasterMapper.insert(modelWeatherDisaster); @@ -65,10 +64,9 @@ public class ModelWeatherDisasterServiceImpl implements ModelWeatherDisasterServ DisasterDataDO disasterDataDO = disasterDataMapper.selectById(updateReqVO.getWeatherId()); updateObj.setDisasterDescription(disasterDataDO.getDisasterDescription()); updateObj.setTreatmentSuggestion(disasterDataDO.getTreatmentSuggestion()); - if (updateReqVO.getImage() != null) { - updateObj.setImage(updateReqVO.getImage() + "," + disasterDataDO.getImgUrl()); - } else { - updateObj.setImage(disasterDataDO.getImgUrl()); + // set 图片地址 + for (String image : updateObj.getImageList()) { + updateObj.setImage(image); } modelWeatherDisasterMapper.updateById(updateObj); } diff --git a/yudao-module-farm/src/main/resources/mapper/modelcycle/ModelCycleMapper.xml b/yudao-module-farm/src/main/resources/mapper/modelcycle/ModelCycleMapper.xml index e124097d..271c4630 100644 --- a/yudao-module-farm/src/main/resources/mapper/modelcycle/ModelCycleMapper.xml +++ b/yudao-module-farm/src/main/resources/mapper/modelcycle/ModelCycleMapper.xml @@ -15,6 +15,6 @@ from farm_model_cycle where model_id = #{modelId} and deleted = 0 - ORDER BY create_time + ORDER BY create_time ASC \ No newline at end of file