From 0a981206a5ae498d293c2dc101f2654a3d7690f0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=BE=BE=E5=AF=8C=E6=96=8C?= Date: Mon, 1 Sep 2025 15:35:41 +0800 Subject: [PATCH] =?UTF-8?q?feat=20(farm):=20=E5=86=9C=E5=9C=BA=E9=A6=96?= =?UTF-8?q?=E9=A1=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 接口实现 --- .../controller/admin/home/vo/HomeInfo.java | 22 ++- .../module/farm/enums/CommonConstants.java | 4 + .../service/baseinfo/BaseInfoServiceImpl.java | 2 +- .../farm/service/home/HomeServiceImpl.java | 146 +++++++++++------- .../ModelManagementService.java | 7 + .../ModelManagementServiceImpl.java | 4 + .../PersonnelManagementService.java | 11 ++ .../PersonnelManagementServiceImpl.java | 41 +++++ .../productionplan/ProductionPlanService.java | 29 +++- .../ProductionPlanServiceImpl.java | 96 +++++++++++- 10 files changed, 301 insertions(+), 61 deletions(-) diff --git a/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/controller/admin/home/vo/HomeInfo.java b/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/controller/admin/home/vo/HomeInfo.java index 0ed4ce4b..212a7c45 100644 --- a/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/controller/admin/home/vo/HomeInfo.java +++ b/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/controller/admin/home/vo/HomeInfo.java @@ -21,7 +21,7 @@ public class HomeInfo { @Schema(description = "基地统计信息概述") private BaseOverviewInfo baseOverviewInfo; @Schema(description = "基地弹框信息") - private BasePopupFrame basePopupFrame; + private List plotPopupFrames; @Schema(description = "地块集合") private List plotInfos; @Schema(description = "计划集合") @@ -67,7 +67,7 @@ public class HomeInfo { @Data @AllArgsConstructor @NoArgsConstructor - public static class BasePopupFrame { + public static class PlotPopupFrame { @Schema(description = "在种面积") private String beingBaseArea; @Schema(description = "基地负责人") @@ -84,8 +84,12 @@ public class HomeInfo { private String baseId; @Schema(description = "基地名称") private String baseName; - @Schema(description = "基地面积") - private BigDecimal baseArea; + @Schema(description = "地块ID") + private String plotId; + @Schema(description = "地块名称") + private String plotName; + @Schema(description = "地块面积") + private BigDecimal plotArea; @Schema(description = "基地负责人") private String manager; @Schema(description = "基地坐标") @@ -105,6 +109,10 @@ public class HomeInfo { private String baseId; @Schema(description = "基地名称") private String baseName; + @Schema(description = "地块ID") + private String plotId; + @Schema(description = "地块名称") + private String plotName; @Schema(description = "种植状态 (1: 在种; 2: 未种;)") private String growFlag; @Schema(description = "种植面积") @@ -131,11 +139,15 @@ public class HomeInfo { private String baseId; @Schema(description = "基地名称") private String baseName; + @Schema(description = "地块ID") + private String plotId; + @Schema(description = "地块名称") + private String plotName; @Schema(description = "基地负责人") private String manager; @Schema(description = "物种名称") - private String plantSpeciesCode; + private String plantSpeciesName; @Schema(description = "计划编号") private String planNumber; @Schema(description = "管理周期名称") diff --git a/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/enums/CommonConstants.java b/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/enums/CommonConstants.java index 4bc1b9cf..3281d0bc 100644 --- a/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/enums/CommonConstants.java +++ b/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/enums/CommonConstants.java @@ -75,4 +75,8 @@ public class CommonConstants { public final static Boolean DHTMLX_GANTT_OPEN_FALSE = false; + public final static String GROW_FLAG_1 = "在种"; + public final static String GROW_FLAG_2 = "空闲"; + + } 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 82d41e61..f4df3c82 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 @@ -143,7 +143,7 @@ public class BaseInfoServiceImpl implements BaseInfoService { List childList = new ArrayList<>(); for (PlotInfoDO aDo : plotInfoDOS) { if (aDo.getBaseId().equals(key)) { - double remainingArea = productionPlanService.getRemainingArea(aDo.getBaseId()); + double remainingArea = productionPlanService.getPredictedArea(aDo.getBaseId()); childList.add(new BaseNameRespVO.PlotInfoVO(aDo.getPlotId(), aDo.getPlotName(), aDo.getPlotArea(),remainingArea)); } } diff --git a/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/service/home/HomeServiceImpl.java b/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/service/home/HomeServiceImpl.java index f7e2b656..c7ce3d14 100644 --- a/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/service/home/HomeServiceImpl.java +++ b/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/service/home/HomeServiceImpl.java @@ -11,9 +11,11 @@ import cn.iocoder.yudao.module.farm.dal.dataobject.productionplan.ProductionPlan import cn.iocoder.yudao.module.farm.service.baseinfo.BaseInfoService; import cn.iocoder.yudao.module.farm.service.cropFarmingCenter.CropFarmingCenterService; import cn.iocoder.yudao.module.farm.service.deviceplotrelation.DevicePlotRelationService; +import cn.iocoder.yudao.module.farm.service.modelmanagement.ModelManagementService; import cn.iocoder.yudao.module.farm.service.personnelmanagement.PersonnelManagementService; import cn.iocoder.yudao.module.farm.service.plotinfo.PlotInfoService; import cn.iocoder.yudao.module.farm.service.productionplan.ProductionPlanService; +import org.apache.commons.lang3.ObjectUtils; import org.springframework.stereotype.Service; import java.util.ArrayList; @@ -23,6 +25,7 @@ import java.util.Map; import java.util.stream.Collectors; import static cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils.getLoginUser; +import static cn.iocoder.yudao.module.farm.enums.CommonConstants.*; /** * @description: 首页信息实现类 @@ -38,101 +41,138 @@ public class HomeServiceImpl implements HomeService { private final DevicePlotRelationService driverPropertyInfoService; private final CropFarmingCenterService cropFarmingCenterService; private final PersonnelManagementService personnelManagementService; + private final ModelManagementService modelManagementService; - public HomeServiceImpl(BaseInfoService baseInfoService, PlotInfoService plotInfoService, ProductionPlanService productionPlanService, DevicePlotRelationService driverPropertyInfoService, CropFarmingCenterService cropFarmingCenterService, PersonnelManagementService personnelManagementService) { + public HomeServiceImpl(BaseInfoService baseInfoService, PlotInfoService plotInfoService, ProductionPlanService productionPlanService, DevicePlotRelationService driverPropertyInfoService, CropFarmingCenterService cropFarmingCenterService, PersonnelManagementService personnelManagementService, ModelManagementService modelManagementService) { this.baseInfoService = baseInfoService; this.plotInfoService = plotInfoService; this.productionPlanService = productionPlanService; this.driverPropertyInfoService = driverPropertyInfoService; this.cropFarmingCenterService = cropFarmingCenterService; this.personnelManagementService = personnelManagementService; + this.modelManagementService = modelManagementService; } @Override public HomeInfo getHomeInfo(String baseId) { + // 员工集合 + Map employeeNameMap = personnelManagementService.getEmployeeNameMap(); + BaseInfoDO baseObj = baseInfoService.getBaseInfo(baseId); - BaseOverviewInfo baseOverviewInfo = this.getBaseOverviewInfo(baseId); - BasePopupFrame basePopupFrame = this.getBasePopupFrame(baseId); - List plotInfos = this.getPlotInfoList(baseId); - List planInfos = this.getPlanInfoList(""); - - return new HomeInfo(baseOverviewInfo,basePopupFrame,plotInfos,planInfos,null); + BaseOverviewInfo baseOverviewInfo = this.getBaseOverviewInfo(baseObj, employeeNameMap); + List plotPopupFrames = this.getPlotPopupFrame(baseObj, employeeNameMap); + List plotInfos = this.getPlotInfoList(baseId,employeeNameMap); + List planInfos = this.getPlanInfoList(baseId,"",null); + StatisticalInfo statisticalInfo = this.getStatisticalInfo(baseId); + return new HomeInfo(baseOverviewInfo, plotPopupFrames, plotInfos, planInfos, statisticalInfo); } - private BaseOverviewInfo getBaseOverviewInfo(String baseId) { - BaseInfoDO aDo = baseInfoService.getBaseInfo(baseId); + private StatisticalInfo getStatisticalInfo(String baseId) { + Integer taskCount = 0; // TODO: 2025/9/1 今日任务数量 + Integer warningCount = 0; // TODO: 2025/9/1 告警数量 + Integer iotCount = 0; // TODO: 2025/9/1 物联设备数量 + return new StatisticalInfo(taskCount,warningCount,iotCount); + } + + private BaseOverviewInfo getBaseOverviewInfo(BaseInfoDO baseObj, Map employeeNameMap) { + String employeeName= personnelManagementService.getEmployeeNameMap(employeeNameMap,baseObj.getManager()); + int growingPlotCount = productionPlanService.getGrowingPlotCount(baseObj.getId()); + int growingCropCount = productionPlanService.getGrowingCropCount(baseObj.getId()); + BaseOverviewInfo res = new BaseOverviewInfo(); - res.setBaseId(aDo.getId()); - res.setBaseName(aDo.getName()); - res.setBaseArea(aDo.getArea()); - res.setManager(aDo.getManager()); // TODO: 2025/8/31 code 转 name - res.setPointName(""); // TODO: 2025/8/31 应该取不到 - res.setPoint(aDo.getPoint()); - res.setBeingPlot(0); // TODO: 2025/8/31 在种地块数量 - res.setBeingCrop(0); // TODO: 2025/8/31 在种作物数量 + res.setBaseId(baseObj.getId()); + res.setBaseName(baseObj.getName()); + res.setBaseArea(baseObj.getArea()); + res.setManager(employeeName); + res.setPoint(baseObj.getPoint()); + res.setPointName(""); // TODO: 2025/8/31 需要前端传入,才能获取 + res.setBeingPlot(growingPlotCount); + res.setBeingCrop(growingCropCount); return res; } - private BasePopupFrame getBasePopupFrame(String baseId) { - BasePopupFrame res = new BasePopupFrame(); - res.setBeingBaseArea(""); // TODO: 2025/8/31 在种面积 : 300/350亩 - res.setManager(""); // TODO: 2025/8/31 code 转 name - res.setBeingCropName(""); // TODO: 2025/8/31 在种物种名称 - return res; + private List getPlotPopupFrame(BaseInfoDO baseObj, Map employeeNameMap) { + List targetList = new ArrayList<>(); + List plotList = plotInfoService.getPlotInfos(baseObj.getId()); + for (PlotInfoDO e : plotList) { + String employeeName = personnelManagementService.getEmployeeNameMap(employeeNameMap, e.getEmployeeId()); + String beingPlotArea = productionPlanService.getBeingPlotArea(e.getId(), e.getPlotArea()); + String beingCropName = productionPlanService.getBeingCropName(e.getId()); + + targetList.add(new PlotPopupFrame(beingPlotArea,employeeName,beingCropName)); + } + return targetList; } - private List getPlotInfoList(String baseId) { + private List getPlotInfoList(String baseId,Map employeeNameMap) { List targetList = new ArrayList<>(); List plotList = plotInfoService.getPlotInfos(baseId); for (PlotInfoDO e : plotList) { + String employeeName = personnelManagementService.getEmployeeNameMap(employeeNameMap, e.getEmployeeId()); + PlotOrCropInfo plotOrCropInfo = this.getPlotOrCropInfoList(e,"地块详情",employeeName); + PlotInfo t = new PlotInfo(); t.setBaseId(e.getBaseId()); - t.setBaseName(e.getPlotName()); - t.setBaseArea(e.getPlotArea()); - t.setManager(e.getEmployeeId()); // TODO: 2025/8/31 code -> name + t.setBaseName(e.getBaseName()); + t.setPlotId(e.getPlotId()); + t.setPlotName(e.getPlotName()); + t.setPlotArea(e.getPlotArea()); + t.setManager(employeeName); t.setPoint(e.getPoint()); - PlotOrCropInfo plotOrCropInfo = this.getPlotOrCropInfoList(baseId,"地块详情"); // TODO: 2025/8/31 t.setPlotOrCropInfo(plotOrCropInfo); targetList.add(t); } return targetList; } - private PlotOrCropInfo getPlotOrCropInfoList(String baseId,String label) { - BaseInfoDO b = baseInfoService.getBaseInfo(baseId); + private PlotOrCropInfo getPlotOrCropInfoList(PlotInfoDO e ,String label,String employeeName) { + Double predictedArea = productionPlanService.getBeingPlotArea(e.getPlotId()); + if (ObjectUtils.isEmpty(predictedArea)) { + predictedArea = 0.00; + } + String growFlag = ObjectUtils.isEmpty(predictedArea) ? GROW_FLAG_2 : GROW_FLAG_1; + int growingCropCount = productionPlanService.getGrowingCropCount(e.getBaseId(), e.getPlotId()); + PlotOrCropInfo t = new PlotOrCropInfo(); t.setLabel(label); - t.setBaseId(b.getId()); - t.setBaseName(b.getName()); - t.setGrowFlag("在种"); // TODO: 2025/8/31 - t.setGrowArea(0.00); // TODO: 2025/8/31 种植面积 - t.setBeingCrop(0); // TODO: 2025/8/31 在种作物数量 + t.setBaseId(e.getBaseId()); + t.setPlotId(e.getPlotId()); + t.setPlotName(e.getPlotName()); + t.setGrowFlag(growFlag); + t.setGrowArea(predictedArea); + t.setBeingCrop(growingCropCount); t.setTaskCount(0); // TODO: 2025/8/31 农事任务数量 t.setLotCount(0); // TODO: 2025/8/31 物联设备数量 - t.setManager(""); // TODO: 2025/8/31 地块负责人 + t.setManager(employeeName); t.setQrCodeUrl(""); // TODO: 2025/8/31 暂无 - t.setPlanInfos(this.getPlanInfoList("")); // TODO: 2025/8/31 plotId + t.setPlanInfos(this.getPlanInfoList(e.getBaseId(),e.getPlotId(),employeeName)); return t; } - private List getPlanInfoList(String plotId) { + private List getPlanInfoList(String baseId,String plotId,String employeeName) { List targetList = new ArrayList<>(); - List plans = productionPlanService.getProductionPlans(plotId); - for (ProductionPlanDO aDo : plans) { + List plans = productionPlanService.getProductionPlans(baseId,plotId); + for (ProductionPlanDO e : plans) { + String beingCropName = productionPlanService.getPlantSpeciesCodeForName(e.getPlantSpeciesCode()); + String cycleName = modelManagementService.getModelCycleName(e.getSpeciesModelId()); // TODO: 2025/9/1 + String beingPlotArea = productionPlanService.getBeingPlotArea(e.getPlotId(), null); + PlanInfo target = new PlanInfo(); - target.setBaseId(""); - target.setBaseName(""); - target.setManager(""); - target.setPlantSpeciesCode(""); - target.setPlanNumber(""); - target.setCycleName(""); - target.setProgressBar(""); - target.setPredictedArea(0.0); - target.setPredictedYields(0); - target.setPlanStatus(0); - target.setPlanStatusName(""); - target.setPlanSubStatus(0); - target.setPlanSubStatusName(""); + target.setBaseId(e.getBaseId()); + target.setBaseName(e.getBaseName()); + target.setPlotId(e.getPlotId()); + target.setPlotName(e.getPlotName()); + target.setManager(employeeName); + target.setPlantSpeciesName(beingCropName); + target.setPlanNumber(e.getPlanNumber()); + target.setCycleName(cycleName); + target.setProgressBar("0/10"); // TODO: 2025/9/1 + target.setPredictedArea(Double.valueOf(beingPlotArea)); + target.setPredictedYields(e.getPredictedYields()); + target.setPlanStatus(e.getPlanStatus()); + target.setPlanStatusName(PLAN_MAP.getOrDefault(e.getPlanStatus(),"未开始")); + target.setPlanSubStatus(e.getPlanSubStatus()); + target.setPlanSubStatusName(PLAN_MAP.getOrDefault(e.getPlanSubStatus(),"逾期未开始")); targetList.add(target); } return targetList; diff --git a/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/service/modelmanagement/ModelManagementService.java b/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/service/modelmanagement/ModelManagementService.java index 511c584b..d8ae14d5 100644 --- a/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/service/modelmanagement/ModelManagementService.java +++ b/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/service/modelmanagement/ModelManagementService.java @@ -74,4 +74,11 @@ public interface ModelManagementService { Map getCount(); + /** + * 生命周期-名称 + * @param planId => task_id + * @return + */ + String getModelCycleName(String planId); + } \ No newline at end of file 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 a9f0cf41..a75d5cf8 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 @@ -450,4 +450,8 @@ public class ModelManagementServiceImpl implements ModelManagementService { return map; } + @Override + public String getModelCycleName(String planId) { + return null; + } } \ No newline at end of file diff --git a/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/service/personnelmanagement/PersonnelManagementService.java b/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/service/personnelmanagement/PersonnelManagementService.java index 511d4044..5d05fcaa 100644 --- a/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/service/personnelmanagement/PersonnelManagementService.java +++ b/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/service/personnelmanagement/PersonnelManagementService.java @@ -7,6 +7,7 @@ import cn.iocoder.yudao.module.farm.dal.dataobject.personnelmanagement.Personnel import jakarta.validation.Valid; import java.util.List; +import java.util.Map; /** * 人员管理 Service 接口 @@ -65,4 +66,14 @@ public interface PersonnelManagementService { void reset(@Valid PersonnelManagementSaveReqVO updateReqVO); List getList(@Valid PersonnelManagementPageReqVO pageReqVO); + + /** + * 获取员工集合 + * key: id + * value: name + * @return + */ + Map getEmployeeNameMap(); + + String getEmployeeNameMap(Map employeeName, String employeeId); } \ No newline at end of file diff --git a/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/service/personnelmanagement/PersonnelManagementServiceImpl.java b/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/service/personnelmanagement/PersonnelManagementServiceImpl.java index 7113f143..dbd5842c 100644 --- a/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/service/personnelmanagement/PersonnelManagementServiceImpl.java +++ b/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/service/personnelmanagement/PersonnelManagementServiceImpl.java @@ -15,11 +15,15 @@ import cn.iocoder.yudao.module.farm.dal.mysql.personnelmanagement.SystemUserMapp import cn.iocoder.yudao.module.farm.dal.mysql.personnelmanagement.SystemUserRoleMapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import jakarta.annotation.Resource; +import org.apache.commons.lang3.ObjectUtils; import org.springframework.security.crypto.password.PasswordEncoder; import org.springframework.stereotype.Service; import org.springframework.validation.annotation.Validated; +import java.util.Collections; 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; @@ -200,4 +204,41 @@ public class PersonnelManagementServiceImpl implements PersonnelManagementServic private String encodePassword(String password) { return passwordEncoder.encode(password); } + + @Override + public Map getEmployeeNameMap() { + LoginUser loginUser = getLoginUser(); + if (ObjectUtils.isEmpty(loginUser)) { + return Collections.emptyMap(); + } + List personnelManagementDOS = personnelManagementMapper.selectList("tenant_id", loginUser.getTenantId()); + return personnelManagementDOS.stream().collect(Collectors.toMap(PersonnelManagementDO::getId, PersonnelManagementDO::getName, (v1, v2) -> v1)); + } + + public String getEmployeeNameMap(Map employeeNameMap,String employeeId) { + if (employeeId == null || employeeId.trim().isEmpty()) { + return ""; + } + + String[] employeeIds = employeeId.split(","); + + if (employeeIds.length == 0) { + return ""; + } + + StringBuilder result = new StringBuilder(); + for (int i = 0; i < employeeIds.length; i++) { + // 去除可能的空格,并使用getOrDefault提供默认值"系统" + String id = employeeIds[i].trim(); + String name = employeeNameMap.getOrDefault(id, "系统"); + + // 拼接姓名,用逗号分隔 + if (i > 0) { + result.append(","); + } + result.append(name); + } + + return result.toString(); + } } \ 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 bcce5d49..54f551c8 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 @@ -61,6 +61,7 @@ public interface ProductionPlanService { * @return */ List getProductionPlans(String plotId); + List getProductionPlans(String baseId,String plotId); /** * 获得种植中心-生产计划-生产计划分页 @@ -113,10 +114,36 @@ public interface ProductionPlanService { */ int getGrowingPlotCount(String baseId); + /** + * 获取在种作物数量 + * @param baseId + * @return + */ + int getGrowingCropCount(String baseId); + int getGrowingCropCount(String baseId,String plotId); + /** * 计算在种地块面积 * @param baseId * @return */ - double getRemainingArea(String baseId); + double getPredictedArea(String baseId); + + /** + * 获取在种地块面积 + * @param baseId + * @return + */ + String getBeingPlotArea(String plotId,BigDecimal plotArea); + Double getBeingPlotArea(String plotId); + + /** + * 获取在种作物 + * @param plotId + * @return + */ + String getBeingCropName(String plotId); + + String getPlantSpeciesCodeForName(String plantSpeciesCode); + } \ No newline at end of file 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 ad184a53..5f67e93c 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 @@ -6,6 +6,8 @@ import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX; import cn.iocoder.yudao.module.farm.controller.admin.baseinfo.vo.BaseNamePlanRespVO; import cn.iocoder.yudao.module.farm.controller.admin.productionplan.vo.ProductionPlanPageReqVO; import cn.iocoder.yudao.module.farm.controller.admin.productionplan.vo.ProductionPlanSaveReqVO; +import cn.iocoder.yudao.module.farm.dal.dataobject.specieslibrary.SpeciesLibraryDO; +import cn.iocoder.yudao.module.farm.dal.mysql.specieslibrary.SpeciesLibraryMapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import org.apache.commons.lang3.ObjectUtils; import org.springframework.stereotype.Service; @@ -41,6 +43,8 @@ public class ProductionPlanServiceImpl implements ProductionPlanService { @Resource private ProductionPlanMapper productionPlanMapper; + @Resource + private SpeciesLibraryMapper speciesLibraryMapper; @Override public String createProductionPlan(ProductionPlanSaveReqVO createReqVO) { @@ -101,6 +105,14 @@ public class ProductionPlanServiceImpl implements ProductionPlanService { return productionPlanMapper.selectList(qw); } + @Override + public List getProductionPlans(String baseId, String plotId) { + LambdaQueryWrapperX qw = new LambdaQueryWrapperX<>(); + qw.eqIfPresent(ProductionPlanDO::getBaseId, baseId); + qw.eqIfPresent(ProductionPlanDO::getPlotId, plotId); + return productionPlanMapper.selectList(qw); + } + @Override public PageResult getProductionPlanPage(ProductionPlanPageReqVO pageReqVO) { productionPlanMapper.selectPage(pageReqVO); @@ -206,7 +218,34 @@ public class ProductionPlanServiceImpl implements ProductionPlanService { } @Override - public double getRemainingArea(String baseId) { + public int getGrowingCropCount(String baseId) { + List planList = productionPlanMapper.selectList("base_id", baseId); + 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 getGrowingCropCount(String baseId, String plotId) { + QueryWrapper qw = new QueryWrapper<>(); + qw.eq("base_id", baseId); + qw.eq("plot_id", plotId); + 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 double getPredictedArea(String baseId) { List planList = productionPlanMapper.selectList("base_id", baseId); return planList.stream() @@ -214,4 +253,59 @@ public class ProductionPlanServiceImpl implements ProductionPlanService { .mapToDouble(ProductionPlanDO::getPredictedArea) .sum(); } + + @Override + public String getBeingPlotArea(String plotId, BigDecimal plotArea) { + + List planList = productionPlanMapper.selectList("plot_id", plotId); + if (ObjectUtils.isEmpty(planList)) { + return null; + } + double totalArea = planList.stream() + .filter(Objects::nonNull) + .filter(plan -> Objects.equals(plan.getPlanStatus(), PLAN_STATUS_2) || Objects.equals(plan.getPlanStatus(), PLAN_STATUS_6)) + .mapToDouble(ProductionPlanDO::getPredictedArea) + .sum(); + if (plotArea == null) { + return String.valueOf(totalArea); + } + return totalArea + "/" + plotArea + "亩"; + } + + @Override + public Double getBeingPlotArea(String plotId) { + List planList = productionPlanMapper.selectList("plot_id", plotId); + if (ObjectUtils.isEmpty(planList)) { + return null; + } + return planList.stream() + .filter(Objects::nonNull) + .filter(plan -> Objects.equals(plan.getPlanStatus(), PLAN_STATUS_2) || Objects.equals(plan.getPlanStatus(), PLAN_STATUS_6)) + .mapToDouble(ProductionPlanDO::getPredictedArea) + .sum(); + } + + @Override + public String getBeingCropName(String plotId) { + List planList = productionPlanMapper.selectList("plot_id", plotId); + + List distinctSpeciesCodes = planList.stream() + .filter(Objects::nonNull) + .filter(plan -> Objects.equals(plan.getPlanStatus(), PLAN_STATUS_2) || Objects.equals(plan.getPlanStatus(), PLAN_STATUS_6)) + .map(ProductionPlanDO::getPlantSpeciesCode) + .filter(code -> code != null && !code.trim().isEmpty()) + .distinct() + .collect(Collectors.toList()); + + Map cultivarNameMap = speciesLibraryMapper.selectList().stream().collect(Collectors.toMap(SpeciesLibraryDO::getId, SpeciesLibraryDO::getCultivarName, (v1, v2) -> v1)); + return distinctSpeciesCodes.stream().map(cultivarNameMap::get).filter(Objects::nonNull).collect(Collectors.joining(",")); + } + + @Override + public String getPlantSpeciesCodeForName(String plantSpeciesCode) { + Map cultivarNameMap = speciesLibraryMapper.selectList().stream().collect(Collectors.toMap(SpeciesLibraryDO::getId, SpeciesLibraryDO::getCultivarName, (v1, v2) -> v1)); + return cultivarNameMap.getOrDefault(plantSpeciesCode,""); + } + + } \ No newline at end of file