From e6cb5601c6c0e9932d0596611f14ea0656ebd430 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=BE=BE=E5=AF=8C=E6=96=8C?= Date: Wed, 26 Nov 2025 19:22:25 +0800 Subject: [PATCH] =?UTF-8?q?fix=20(farm):=20=E6=80=A7=E8=83=BD=E4=BC=98?= =?UTF-8?q?=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1. 地块的颜色需要再透明一点 ✅ 2. 点击大屏报错 ✅ 3. 图片展示不出来 ✅ 4. 基础管理 - 模型管理 - 缓存慢 5. 设备中心缓存慢 ✅ 6. 首页 - 负责人展示不出来 ✅ 7. 基础管理 - 基地规划 - 缓存慢 ✅ 8. 网箱数量没接通 ✅ --- .../deviceinfo/DeviceInfoController.java | 16 +- .../devicestatus/DeviceStatusController.java | 204 ------------------ .../vo/DeviceStatusPageReqVO.java | 41 ---- .../devicestatus/vo/DeviceStatusRespVO.java | 47 ---- .../vo/DeviceStatusStatisticsRespVO.java | 33 --- .../DigitalCockpitController.java | 17 +- .../vo/VariousIndexesRespVO.java | 8 +- .../baseinfo/BaseInfoController.java | 18 ++ .../messagecenter/MessageCenterMapper.java | 2 + .../service/baseinfo/BaseInfoService.java | 15 ++ .../service/baseinfo/BaseInfoServiceImpl.java | 82 ++++--- .../deviceclassify/DeviceClassifyService.java | 3 + .../DeviceClassifyServiceImpl.java | 13 ++ .../deviceinfo/DeviceInfoServiceImpl.java | 22 +- .../messagecenter/MessageCenterService.java | 8 + .../MessageCenterServiceImpl.java | 7 + .../service/plotinfo/PlotInfoService.java | 8 + .../service/plotinfo/PlotInfoServiceImpl.java | 12 ++ .../messagecenter/MessageCenterMapper.xml | 16 ++ 19 files changed, 185 insertions(+), 387 deletions(-) delete mode 100644 yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/controller/admin/devicestatus/DeviceStatusController.java delete mode 100644 yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/controller/admin/devicestatus/vo/DeviceStatusPageReqVO.java delete mode 100644 yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/controller/admin/devicestatus/vo/DeviceStatusRespVO.java delete mode 100644 yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/controller/admin/devicestatus/vo/DeviceStatusStatisticsRespVO.java diff --git a/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/controller/admin/deviceinfo/DeviceInfoController.java b/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/controller/admin/deviceinfo/DeviceInfoController.java index 48f90758..460c3560 100644 --- a/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/controller/admin/deviceinfo/DeviceInfoController.java +++ b/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/controller/admin/deviceinfo/DeviceInfoController.java @@ -138,6 +138,13 @@ public class DeviceInfoController { @Operation(summary = "获得设备信息分页") public CommonResult> getDeviceInfoPage(@Valid DeviceInfoPageV2ReqVO pageReqVO) { + Map typeNameMap = deviceClassifyService.getTypeNameMap(); + Map typeCodeMap = deviceClassifyService.getTypeCodeMap(); + Map imageMap = deviceClassifyService.getImageMap(); +// Map basePointMap = baseInfoService.getBasePointMap(); + Map plotPointMap = plotInfoService.getPlotPointMap(); + + DeviceInfoPageReqVO targetObj = new DeviceInfoPageReqVO(); targetObj.setPageSize(100); targetObj.setBaseId(pageReqVO.getBaseId()); @@ -151,14 +158,11 @@ public class DeviceInfoController { for (DeviceInfoPageV2RespVO d : deviceInfoRespVOPageResult.getList()) { if (!StringUtils.isEmpty(d.getBaseId()) && !StringUtils.isEmpty(d.getBaseId())) { - BaseInfoDO b = baseInfoService.getBaseInfo(d.getBaseId()); - PlotInfoDO p = plotInfoService.getPlotInfo(d.getPlotId()); - d.setBasePoint(b.getPoint()); - d.setPlotPoint(p.getPoint()); +// d.setBasePoint(basePointMap.get(d.getBaseId())); + d.setPlotPoint(plotPointMap.get(d.getPlotId())); } - Map typeNameMap = deviceClassifyService.getTypeNameMap(); - Map typeCodeMap = deviceClassifyService.getTypeCodeMap(); + d.setImage(imageMap.get(d.getDeviceType())); d.setDeviceTypeName(typeNameMap.get(d.getDeviceType())); d.setDeviceTypeCode(typeCodeMap.get(d.getDeviceType())); d.setDeviceStateName(DEVICE_STATE_MAP.get(d.getDeviceState())); diff --git a/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/controller/admin/devicestatus/DeviceStatusController.java b/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/controller/admin/devicestatus/DeviceStatusController.java deleted file mode 100644 index 2adbe661..00000000 --- a/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/controller/admin/devicestatus/DeviceStatusController.java +++ /dev/null @@ -1,204 +0,0 @@ -package cn.iocoder.yudao.module.farm.controller.admin.devicestatus; - -import cn.iocoder.yudao.framework.common.pojo.CommonResult; -import cn.iocoder.yudao.framework.common.util.object.BeanUtils; -import cn.iocoder.yudao.module.farm.controller.admin.devicestatus.vo.DeviceStatusRespVO; -import cn.iocoder.yudao.module.farm.controller.admin.devicestatus.vo.DeviceStatusStatisticsRespVO; -import cn.iocoder.yudao.module.farm.dal.dataobject.deviceinfo.DeviceInfoDO; -import cn.iocoder.yudao.module.farm.dal.mysql.deviceinfo.DeviceInfoMapper; -import cn.iocoder.yudao.module.farm.enums.DeviceStateEnum; -import cn.iocoder.yudao.module.farm.service.devicestatus.DeviceStatusService; -import io.swagger.v3.oas.annotations.Operation; -import io.swagger.v3.oas.annotations.Parameter; -import io.swagger.v3.oas.annotations.tags.Tag; -import jakarta.annotation.Resource; -import lombok.extern.slf4j.Slf4j; -import org.springframework.security.access.prepost.PreAuthorize; -import org.springframework.validation.annotation.Validated; -import org.springframework.web.bind.annotation.*; - -import java.util.List; - -import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; - -//@Tag(name = "管理后台 - 设备状态管理") -//@RestController -//@RequestMapping("/farm/device-status") -//@Validated -//@Slf4j -public class DeviceStatusController { -// -// @Resource -// private DeviceStatusService deviceStatusService; -// -// @Resource -// private DeviceInfoMapper deviceInfoMapper; -// -// @GetMapping("/check/{deviceUniqueId}") -// @Operation(summary = "检查设备是否在线") -// @Parameter(name = "deviceUniqueId", description = "设备唯一标识", required = true, example = "2409AA01") -// @PreAuthorize("@ss.hasPermission('farm:device-status:query')") -// public CommonResult checkDeviceOnline(@PathVariable("deviceUniqueId") String deviceUniqueId) { -// boolean online = deviceStatusService.isDeviceOnline(deviceUniqueId); -// return success(online); -// } -// -// @GetMapping("/state/{deviceUniqueId}") -// @Operation(summary = "获取设备状态") -// @Parameter(name = "deviceUniqueId", description = "设备唯一标识", required = true, example = "2409AA01") -// @PreAuthorize("@ss.hasPermission('farm:device-status:query')") -// public CommonResult getDeviceStatus(@PathVariable("deviceUniqueId") String deviceUniqueId) { -// DeviceInfoDO device = deviceInfoMapper.selectOne(DeviceInfoDO::getDeviceUniqueId, deviceUniqueId); -// if (device == null) { -// return success(null); -// } -// -// DeviceStatusRespVO respVO = BeanUtils.toBean(device, DeviceStatusRespVO.class); -// if (device.getDeviceState() != null) { -// DeviceStateEnum stateEnum = DeviceStateEnum.valueOf(device.getDeviceState()); -// if (stateEnum != null) { -// respVO.setStateName(stateEnum.getName()); -// respVO.setOnline(DeviceStateEnum.isOnline(device.getDeviceState())); -// } -// } -// return success(respVO); -// } -// -// @GetMapping("/online-devices") -// @Operation(summary = "获取在线设备列表") -// @PreAuthorize("@ss.hasPermission('farm:device-status:query')") -// public CommonResult> getOnlineDevices() { -// List devices = deviceStatusService.getOnlineDevices(); -// List respList = BeanUtils.toBean(devices, DeviceStatusRespVO.class); -// -// // 填充状态信息 -// respList.forEach(resp -> { -// if (resp.getState() != null) { -// DeviceStateEnum stateEnum = DeviceStateEnum.valueOf(resp.getState()); -// if (stateEnum != null) { -// resp.setStateName(stateEnum.getName()); -// resp.setOnline(DeviceStateEnum.isOnline(resp.getState())); -// } -// } -// }); -// -// return success(respList); -// } -// -// @GetMapping("/offline-devices") -// @Operation(summary = "获取离线设备列表") -// @PreAuthorize("@ss.hasPermission('farm:device-status:query')") -// public CommonResult> getOfflineDevices() { -// List devices = deviceStatusService.getOfflineDevices(); -// List respList = BeanUtils.toBean(devices, DeviceStatusRespVO.class); -// -// // 填充状态信息 -// respList.forEach(resp -> { -// if (resp.getState() != null) { -// DeviceStateEnum stateEnum = DeviceStateEnum.valueOf(resp.getState()); -// if (stateEnum != null) { -// resp.setStateName(stateEnum.getName()); -// resp.setOnline(DeviceStateEnum.isOnline(resp.getState())); -// } -// } -// }); -// -// return success(respList); -// } -// -// @GetMapping("/timeout-devices") -// @Operation(summary = "获取超时未上报的设备列表") -// @Parameter(name = "timeoutMinutes", description = "超时分钟数", required = false, example = "10") -// @PreAuthorize("@ss.hasPermission('farm:device-status:query')") -// public CommonResult> getTimeoutDevices( -// @RequestParam(value = "timeoutMinutes", defaultValue = "10") int timeoutMinutes) { -// List devices = deviceStatusService.getTimeoutDevices(timeoutMinutes); -// List respList = BeanUtils.toBean(devices, DeviceStatusRespVO.class); -// -// // 填充状态信息 -// respList.forEach(resp -> { -// if (resp.getState() != null) { -// DeviceStateEnum stateEnum = DeviceStateEnum.valueOf(resp.getState()); -// if (stateEnum != null) { -// resp.setStateName(stateEnum.getName()); -// resp.setOnline(DeviceStateEnum.isOnline(resp.getState())); -// } -// } -// }); -// -// return success(respList); -// } -// -// @GetMapping("/statistics") -// @Operation(summary = "获取设备状态统计") -// @PreAuthorize("@ss.hasPermission('farm:device-status:query')") -// public CommonResult getDeviceStatusStatistics() { -// DeviceStatusStatisticsRespVO statistics = new DeviceStatusStatisticsRespVO(); -// -// // 统计各状态设备数量 -// Long totalCount = deviceInfoMapper.selectCount(); -// Long onlineCount = deviceInfoMapper.selectCountByState(DeviceStateEnum.ONLINE.getState()); -// Long offlineCount = deviceInfoMapper.selectCountByState(DeviceStateEnum.OFFLINE.getState()); -// Long inactiveCount = deviceInfoMapper.selectCountByState(DeviceStateEnum.INACTIVE.getState()); -// Long maintenanceCount = deviceInfoMapper.selectCountByState(DeviceStateEnum.MAINTENANCE.getState()); -// Long faultCount = deviceInfoMapper.selectCountByState(DeviceStateEnum.FAULT.getState()); -// -// statistics.setTotalCount(totalCount); -// statistics.setOnlineCount(onlineCount != null ? onlineCount : 0L); -// statistics.setOfflineCount(offlineCount != null ? offlineCount : 0L); -// statistics.setInactiveCount(inactiveCount != null ? inactiveCount : 0L); -// statistics.setMaintenanceCount(maintenanceCount != null ? maintenanceCount : 0L); -// statistics.setFaultCount(faultCount != null ? faultCount : 0L); -// -// // 计算在线率和离线率 -// if (totalCount > 0) { -// statistics.setOnlineRate((double) statistics.getOnlineCount() / totalCount * 100); -// statistics.setOfflineRate((double) statistics.getOfflineCount() / totalCount * 100); -// } else { -// statistics.setOnlineRate(0.0); -// statistics.setOfflineRate(0.0); -// } -// -// return success(statistics); -// } -// -// @PostMapping("/update-state/{deviceUniqueId}") -// @Operation(summary = "手动更新设备状态") -// @Parameter(name = "deviceUniqueId", description = "设备唯一标识", required = true, example = "2409AA01") -// @Parameter(name = "state", description = "设备状态", required = true, example = "1") -// @PreAuthorize("@ss.hasPermission('farm:device-status:update')") -// public CommonResult updateDeviceState( -// @PathVariable("deviceUniqueId") String deviceUniqueId, -// @RequestParam("state") Integer state) { -// deviceStatusService.updateDeviceState(deviceUniqueId, state); -// return success(true); -// } -// -// @PostMapping("/set-online/{deviceUniqueId}") -// @Operation(summary = "手动设置设备上线") -// @Parameter(name = "deviceUniqueId", description = "设备唯一标识", required = true, example = "2409AA01") -// @PreAuthorize("@ss.hasPermission('farm:device-status:update')") -// public CommonResult setDeviceOnline(@PathVariable("deviceUniqueId") String deviceUniqueId) { -// deviceStatusService.deviceOnline(deviceUniqueId); -// return success(true); -// } -// -// @PostMapping("/set-offline/{deviceUniqueId}") -// @Operation(summary = "手动设置设备离线") -// @Parameter(name = "deviceUniqueId", description = "设备唯一标识", required = true, example = "2409AA01") -// @PreAuthorize("@ss.hasPermission('farm:device-status:update')") -// public CommonResult setDeviceOffline(@PathVariable("deviceUniqueId") String deviceUniqueId) { -// deviceStatusService.deviceOffline(deviceUniqueId); -// return success(true); -// } -// -// @PostMapping("/check-offline") -// @Operation(summary = "手动检查离线设备") -// @Parameter(name = "timeoutMinutes", description = "超时分钟数", required = false, example = "10") -// @PreAuthorize("@ss.hasPermission('farm:device-status:update')") -// public CommonResult checkOfflineDevices( -// @RequestParam(value = "timeoutMinutes", defaultValue = "10") int timeoutMinutes) { -// int count = deviceStatusService.checkAndUpdateOfflineDevices(timeoutMinutes); -// return success(count); -// } -} diff --git a/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/controller/admin/devicestatus/vo/DeviceStatusPageReqVO.java b/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/controller/admin/devicestatus/vo/DeviceStatusPageReqVO.java deleted file mode 100644 index 0133a788..00000000 --- a/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/controller/admin/devicestatus/vo/DeviceStatusPageReqVO.java +++ /dev/null @@ -1,41 +0,0 @@ -package cn.iocoder.yudao.module.farm.controller.admin.devicestatus.vo; - -import cn.iocoder.yudao.framework.common.pojo.PageParam; -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.ToString; -import org.springframework.format.annotation.DateTimeFormat; - -import java.time.LocalDateTime; - -import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; - -@Schema(description = "管理后台 - 设备状态分页 Request VO") -@Data -@EqualsAndHashCode(callSuper = true) -@ToString(callSuper = true) -public class DeviceStatusPageReqVO extends PageParam { - - @Schema(description = "设备名称", example = "温湿度传感器") - private String deviceName; - - @Schema(description = "设备状态", example = "1") - private Integer state; - - @Schema(description = "设备分类名称", example = "传感器") - private String deviceCategoryName; - - @Schema(description = "基地名称", example = "示范基地1") - private String baseName; - - @Schema(description = "地块名称", example = "A1地块") - private String plotName; - - @Schema(description = "是否在线", example = "true") - private Boolean online; - - @Schema(description = "最后消息时间范围") - @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) - private LocalDateTime[] lastMessageTime; -} diff --git a/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/controller/admin/devicestatus/vo/DeviceStatusRespVO.java b/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/controller/admin/devicestatus/vo/DeviceStatusRespVO.java deleted file mode 100644 index bfcca561..00000000 --- a/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/controller/admin/devicestatus/vo/DeviceStatusRespVO.java +++ /dev/null @@ -1,47 +0,0 @@ -package cn.iocoder.yudao.module.farm.controller.admin.devicestatus.vo; - -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; - -import java.time.LocalDateTime; - -@Schema(description = "管理后台 - 设备状态 Response VO") -@Data -public class DeviceStatusRespVO { - - @Schema(description = "设备唯一标识", requiredMode = Schema.RequiredMode.REQUIRED, example = "2409AA01") - private String deviceUniqueId; - - @Schema(description = "设备名称", example = "温湿度传感器1") - private String deviceName; - - @Schema(description = "设备状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") - private Integer state; - - @Schema(description = "设备状态名称", example = "在线") - private String stateName; - - @Schema(description = "是否在线", example = "true") - private Boolean online; - - @Schema(description = "设备激活时间") - private LocalDateTime activeTime; - - @Schema(description = "设备最后上线时间") - private LocalDateTime onlineTime; - - @Schema(description = "设备最后离线时间") - private LocalDateTime offlineTime; - - @Schema(description = "设备最后消息时间") - private LocalDateTime lastMessageTime; - - @Schema(description = "设备分类名称", example = "传感器") - private String deviceCategoryName; - - @Schema(description = "基地名称", example = "示范基地1") - private String baseName; - - @Schema(description = "地块名称", example = "A1地块") - private String plotName; -} diff --git a/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/controller/admin/devicestatus/vo/DeviceStatusStatisticsRespVO.java b/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/controller/admin/devicestatus/vo/DeviceStatusStatisticsRespVO.java deleted file mode 100644 index e8faba29..00000000 --- a/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/controller/admin/devicestatus/vo/DeviceStatusStatisticsRespVO.java +++ /dev/null @@ -1,33 +0,0 @@ -package cn.iocoder.yudao.module.farm.controller.admin.devicestatus.vo; - -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; - -@Schema(description = "管理后台 - 设备状态统计 Response VO") -@Data -public class DeviceStatusStatisticsRespVO { - - @Schema(description = "设备总数", example = "100") - private Long totalCount; - - @Schema(description = "在线设备数", example = "85") - private Long onlineCount; - - @Schema(description = "离线设备数", example = "10") - private Long offlineCount; - - @Schema(description = "未激活设备数", example = "3") - private Long inactiveCount; - - @Schema(description = "维护中设备数", example = "1") - private Long maintenanceCount; - - @Schema(description = "故障设备数", example = "1") - private Long faultCount; - - @Schema(description = "在线率(百分比)", example = "85.0") - private Double onlineRate; - - @Schema(description = "离线率(百分比)", example = "10.0") - private Double offlineRate; -} diff --git a/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/controller/admin/digitalcockpit/DigitalCockpitController.java b/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/controller/admin/digitalcockpit/DigitalCockpitController.java index c3cffb03..87d623cc 100644 --- a/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/controller/admin/digitalcockpit/DigitalCockpitController.java +++ b/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/controller/admin/digitalcockpit/DigitalCockpitController.java @@ -13,6 +13,7 @@ import cn.iocoder.yudao.module.farm.service.baseinfo.BaseInfoService; import cn.iocoder.yudao.module.farm.service.companyinfo.CompanyInfoService; import cn.iocoder.yudao.module.farm.service.deviceinfo.DeviceInfoService; import cn.iocoder.yudao.module.farm.service.farmingrecord.FarmingRecordService; +import cn.iocoder.yudao.module.farm.service.messagecenter.MessageCenterService; import cn.iocoder.yudao.module.farm.service.modelmanagement.ModelManagementService; import cn.iocoder.yudao.module.farm.service.plotinfo.PlotInfoService; import cn.iocoder.yudao.module.farm.service.productionplan.ProductionPlanService; @@ -27,7 +28,6 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.List; -import static cn.iocoder.yudao.framework.common.pojo.CommonResult.error; import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success; import static cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils.getLoginUser; @@ -49,8 +49,9 @@ public class DigitalCockpitController { private final ProductionPlanService productionPlanService; private final FarmingRecordService farmingRecordService; private final ModelManagementService modelManagementService; + private final MessageCenterService messageCenterService; - public DigitalCockpitController(BaseInfoService baseInfoService, PlotInfoService plotInfoService, CompanyInfoService companyInfoService, DeviceInfoService deviceInfoService, ProductionPlanService productionPlanService, FarmingRecordService farmingRecordService, ModelManagementService modelManagementService) { + public DigitalCockpitController(BaseInfoService baseInfoService, PlotInfoService plotInfoService, CompanyInfoService companyInfoService, DeviceInfoService deviceInfoService, ProductionPlanService productionPlanService, FarmingRecordService farmingRecordService, ModelManagementService modelManagementService, MessageCenterService messageCenterService) { this.baseInfoService = baseInfoService; this.plotInfoService = plotInfoService; this.companyInfoService = companyInfoService; @@ -58,6 +59,7 @@ public class DigitalCockpitController { this.productionPlanService = productionPlanService; this.farmingRecordService = farmingRecordService; this.modelManagementService = modelManagementService; + this.messageCenterService = messageCenterService; } @GetMapping("/company-info") @@ -112,13 +114,8 @@ public class DigitalCockpitController { @Operation(summary = "各项数据统计") @Parameter(name = "baseId", description = "基地ID", required = true) public CommonResult getVariousIndexes(@RequestParam("baseId") String baseId) { - // TODO: 2025/9/24 待实现 - int weatherAlertCount = 10; - int pestAlertCount = 11; - int environmentalAlertCount = 12; - int deviceAlertCount = 13; - int farmingReminderCount = 14; - return success(new VariousIndexesRespVO(weatherAlertCount, pestAlertCount, environmentalAlertCount, deviceAlertCount, farmingReminderCount)); + VariousIndexesRespVO res = messageCenterService.getVariousIndexes(baseId); + return success(res); } @GetMapping("/crop-statistics/type/1") @@ -196,7 +193,7 @@ public class DigitalCockpitController { ModelManagementDO mObj = modelManagementService.getTopQuoteCount(); if (ObjectUtils.isEmpty(mObj)) { - return error(500,"还未创建模型"); + return success(new PlanSpeciesRespVO()); } PlanSpeciesRespVO res = new PlanSpeciesRespVO(); res.setImage(mObj.getSpeciesImage()); diff --git a/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/controller/admin/digitalcockpit/vo/VariousIndexesRespVO.java b/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/controller/admin/digitalcockpit/vo/VariousIndexesRespVO.java index 5e80c431..be68ef53 100644 --- a/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/controller/admin/digitalcockpit/vo/VariousIndexesRespVO.java +++ b/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/controller/admin/digitalcockpit/vo/VariousIndexesRespVO.java @@ -14,14 +14,14 @@ import lombok.NoArgsConstructor; @AllArgsConstructor @NoArgsConstructor public class VariousIndexesRespVO { - @Schema(description = "气象预警数量") + @Schema(description = "气象告警数量") private Integer weatherAlertCount; - @Schema(description = "病虫害告警数量") + @Schema(description = "虫害告警数量") private Integer pestAlertCount; @Schema(description = "环境告警数量") private Integer environmentalAlertCount; - @Schema(description = "设备告警数量") + @Schema(description = "预警数量") private Integer deviceAlertCount; - @Schema(description = "农事提醒刷领") + @Schema(description = "消息数量") private Integer farmingReminderCount; } diff --git a/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/controller/admin/managementcenter/baseinfo/BaseInfoController.java b/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/controller/admin/managementcenter/baseinfo/BaseInfoController.java index dfb4023b..e3aae976 100644 --- a/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/controller/admin/managementcenter/baseinfo/BaseInfoController.java +++ b/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/controller/admin/managementcenter/baseinfo/BaseInfoController.java @@ -101,6 +101,24 @@ public class BaseInfoController { return success(res); } + @GetMapping("/base-overview/base") + @Operation(summary = "基地详情") + @Parameter(name = "baseId", description = "基地编号", required = true, example = "1024") + public CommonResult getBaseOverviewDetails(@RequestParam("baseId") String baseId) { + BaseInfoRespVO.BaseInfo res = baseInfoService.getBaseOverviewDetails(baseId); + return success(res); + } + + @GetMapping("/base-overview/plot") + @Operation(summary = "地块详情") + @Parameter(name = "plotId", description = "地块编号", required = true, example = "1024") + public CommonResult getPlotDetails(@RequestParam("plotId") String plotId) { + BaseInfoRespVO.PlotInfo res = baseInfoService.getPlotDetails(plotId); + return success(res); + } + + + @GetMapping("/export-excel") @Operation(summary = "导出基地 Excel") @ApiAccessLog(operateType = EXPORT) diff --git a/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/dal/mysql/messagecenter/MessageCenterMapper.java b/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/dal/mysql/messagecenter/MessageCenterMapper.java index 5916022b..d0a1a8a5 100644 --- a/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/dal/mysql/messagecenter/MessageCenterMapper.java +++ b/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/dal/mysql/messagecenter/MessageCenterMapper.java @@ -3,6 +3,7 @@ package cn.iocoder.yudao.module.farm.dal.mysql.messagecenter; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX; +import cn.iocoder.yudao.module.farm.controller.admin.digitalcockpit.vo.VariousIndexesRespVO; import cn.iocoder.yudao.module.farm.controller.admin.managementcenter.messagecenter.vo.MessageCenterPageReqVO; import cn.iocoder.yudao.module.farm.dal.dataobject.messagecenter.MessageCenterDO; import org.apache.ibatis.annotations.Mapper; @@ -83,4 +84,5 @@ public interface MessageCenterMapper extends BaseMapperX { @Param("startTime") String startTime, @Param("endTime") String endTime); + VariousIndexesRespVO getVariousIndexes(String baseId); } \ No newline at end of file diff --git a/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/service/baseinfo/BaseInfoService.java b/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/service/baseinfo/BaseInfoService.java index 4e6afb2e..8c04e51b 100644 --- a/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/service/baseinfo/BaseInfoService.java +++ b/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/service/baseinfo/BaseInfoService.java @@ -86,6 +86,20 @@ public interface BaseInfoService { */ TenantInfoRespVO getBaseOverviewInfo(); + /** + * 基地概述详情 + * @param baseId + * @return + */ + BaseInfoRespVO.BaseInfo getBaseOverviewDetails(String baseId); + + /** + * 地块详情 + * @param plotId + * @return + */ + BaseInfoRespVO.PlotInfo getPlotDetails(String plotId); + /** * 获取网箱信息 * @param plotId @@ -132,4 +146,5 @@ public interface BaseInfoService { * @return */ BaseCountInfoRespVO countBaseInfo(String tenantId); + } \ No newline at end of file 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 9664943e..0012dee3 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 @@ -120,11 +120,6 @@ public class BaseInfoServiceImpl implements BaseInfoService { 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); @@ -234,12 +229,46 @@ public class BaseInfoServiceImpl implements BaseInfoService { List baseList = BeanUtils.toBean(pageResult, BaseInfoRespVO.class); this.packageBaseInfo(tenantId, baseList, employeeMap); - // 基地面积 取整 - baseList.forEach(e -> e.setArea(BigDecimalUtil.roundedViaMath(e.getArea()))); - return new TenantInfoRespVO(tenantInfo, baseList); } + @Override + public BaseInfoRespVO.BaseInfo getBaseOverviewDetails(String baseId) { + BaseInfoDO bObj = baseInfoMapper.selectOne("id", baseId); + List plotList = plotInfoService.getPlotInfos(baseId); + + return this.packageBaseOverview( + getLoginUser().getTenantId(), + baseId, bObj.getName(), + bObj.getArea(), + plotList.size()); + } + + @Override + public BaseInfoRespVO.PlotInfo getPlotDetails(String plotId) { + Map employeeMap = adminUserService.getIdAndNickNameMap(); + PlotInfoDO aDo = plotInfoService.getPlotInfo(plotId); + + // 户主 + List lesseeList = plotLesseeService.getPlotLesseeList(aDo.getId()); + String plotManager = employeeMap.getOrDefault(aDo.getEmployeeId(), "系统"); + + BaseInfoRespVO.PlotInfo target = new BaseInfoRespVO.PlotInfo( + aDo.getId(), + aDo.getPlotName(), + aDo.getPlotColor(), + BigDecimalUtil.roundedViaMath( aDo.getPlotArea()), + plotManager, + aDo.getPoint(), + aDo.getPlotLeaseStatus(), + LEASE_STATUS_MAP.get(aDo.getPlotLeaseStatus()), + aDo.getGridNumber(), + Collections.EMPTY_LIST, + lesseeList); + + return target; + } + @Override public List getGridInfo(String plotId) { String plotCode = plotId; @@ -434,29 +463,28 @@ public class BaseInfoServiceImpl implements BaseInfoService { private void packageBaseInfo(long tenantId, List respVOS, Map employeeMap) { for (BaseInfoRespVO obj : respVOS) { + obj.setArea(BigDecimalUtil.roundedViaMath(obj.getArea())); String baseId = obj.getId(); String baseName = obj.getName(); - BigDecimal baseArea = BigDecimalUtil.roundedViaMath(obj.getArea()); List plotList = plotInfoService.getPlotInfos(baseId); // 基地概述 - BaseInfoRespVO.BaseInfo baseOverview = this.packageBaseOverview(tenantId, baseId, baseName, baseArea, plotList); - obj.setBaseOverview(baseOverview); +// BaseInfoRespVO.BaseInfo baseOverview = this.packageBaseOverview(tenantId, baseId, baseName, baseArea, plotList.size()); +// obj.setBaseOverview(baseOverview); // 地块集合 List targetList = this.packagePlotInfo(employeeMap, plotList); obj.setPlotOverviewList(targetList); } } - private BaseInfoRespVO.BaseInfo packageBaseOverview(long tenantId, String baseId, String baseName, BigDecimal baseArea, List plotList) { + private BaseInfoRespVO.BaseInfo packageBaseOverview(long tenantId, String baseId, String baseName, BigDecimal baseArea, int plotTotalCount) { // 在种作物数量 Integer cropCount = speciesLibraryMapper.getSpeciesCount(tenantId, baseId); // 在种地块占比 double plotRatio = 0.00; // 在种地块数量 int plotCount = productionPlanService.getGrowingPlotCount(baseId); - // 地块总数 - int plotTotalCount = plotList.size(); + if (plotTotalCount > 0) { plotRatio = Math.round((plotCount * 10000.0) / plotTotalCount) / 100.0; } @@ -464,29 +492,21 @@ public class BaseInfoServiceImpl implements BaseInfoService { } private List packagePlotInfo(Map employeeMap, List plotList) { - List targetList = new ArrayList<>(); - for (PlotInfoDO aDo : plotList) { - // 网箱 -// List gridInfos = this.packageGridInfo(aDo.getPlotId()); - List gridInfos = Collections.EMPTY_LIST; - // 户主 - List lesseeList = plotLesseeService.getPlotLesseeList(aDo.getId()); - String plotManager = employeeMap.getOrDefault(aDo.getEmployeeId(), "系统"); - BaseInfoRespVO.PlotInfo target = new BaseInfoRespVO.PlotInfo( + return plotList.stream().map(aDo -> + new BaseInfoRespVO.PlotInfo( aDo.getId(), aDo.getPlotName(), aDo.getPlotColor(), - BigDecimalUtil.roundedViaMath( aDo.getPlotArea()), - plotManager, + BigDecimalUtil.roundedViaMath(aDo.getPlotArea()), + "", aDo.getPoint(), aDo.getPlotLeaseStatus(), - LEASE_STATUS_MAP.get(aDo.getPlotLeaseStatus()), +"", +// LEASE_STATUS_MAP.get(aDo.getPlotLeaseStatus()), aDo.getGridNumber(), - gridInfos, - lesseeList); - targetList.add(target); - } - return targetList; + Collections.EMPTY_LIST, + Collections.EMPTY_LIST) + ).toList(); } private List packageGridInfo(String plotId) { diff --git a/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/service/deviceclassify/DeviceClassifyService.java b/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/service/deviceclassify/DeviceClassifyService.java index ffdc17d9..93924711 100644 --- a/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/service/deviceclassify/DeviceClassifyService.java +++ b/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/service/deviceclassify/DeviceClassifyService.java @@ -70,7 +70,10 @@ public interface DeviceClassifyService { Map getTypeNameMap(); Map getTypeCodeMap(); + Map getImageMap(); Map getTypeNameMap(String tenantId); Map getTypeCodeMap(String tenantId); + + } \ No newline at end of file diff --git a/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/service/deviceclassify/DeviceClassifyServiceImpl.java b/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/service/deviceclassify/DeviceClassifyServiceImpl.java index 5b28c9fe..9db1c812 100644 --- a/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/service/deviceclassify/DeviceClassifyServiceImpl.java +++ b/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/service/deviceclassify/DeviceClassifyServiceImpl.java @@ -234,6 +234,18 @@ public class DeviceClassifyServiceImpl implements DeviceClassifyService { return typeCodeMap; } + @Override + public Map getImageMap() { + LambdaQueryWrapperX x = new LambdaQueryWrapperX<>(); + x.eq(DeviceClassifyDO::getTenantId, getLoginUser().getTenantId()); + List deviceClassifyDOS = deviceClassifyMapper.selectList(x); + + Map imageMap = deviceClassifyDOS.stream().filter(device -> device.getParentId() != null && device.getParentId() != 0) + .collect(Collectors.toMap(e -> e.getParentId().toString(), DeviceClassifyDO::getImage)); + + return imageMap; + } + public Map getTypeNameMap(String tenantId) { LambdaQueryWrapperX x = new LambdaQueryWrapperX<>(); x.eq(DeviceClassifyDO::getTenantId, tenantId); @@ -254,4 +266,5 @@ public class DeviceClassifyServiceImpl implements DeviceClassifyService { return typeCodeMap; } + } \ No newline at end of file diff --git a/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/service/deviceinfo/DeviceInfoServiceImpl.java b/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/service/deviceinfo/DeviceInfoServiceImpl.java index 898ec48e..e8549b64 100644 --- a/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/service/deviceinfo/DeviceInfoServiceImpl.java +++ b/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/service/deviceinfo/DeviceInfoServiceImpl.java @@ -275,17 +275,17 @@ public class DeviceInfoServiceImpl implements DeviceInfoService { @Override public PageResult getDeviceInfoPage(DeviceInfoPageReqVO pageReqVO) { PageResult pageResult = deviceInfoMapper.selectPage(pageReqVO); - if (pageResult.getList() != null) { - // 触发图片集合转换,确保分页结果中的每个DO对象都包含转换后的图片集合 - for (DeviceInfoDO d : pageResult.getList()) { - if (d == null) { - continue; - } - DeviceClassifyDO dc = deviceClassifyMapper.selectOne(DeviceClassifyDO::getId, d.getDeviceType()); - d.setImage(dc.getImage()); - d.setImageList(dc.getImageList()); - } - } +// if (pageResult.getList() != null) { +// // 触发图片集合转换,确保分页结果中的每个DO对象都包含转换后的图片集合 +// for (DeviceInfoDO d : pageResult.getList()) { +// if (d == null) { +// continue; +// } +// DeviceClassifyDO dc = deviceClassifyMapper.selectOne(DeviceClassifyDO::getId, d.getDeviceType()); +// d.setImage(dc.getImage()); +//// d.setImageList(dc.getImageList()); +// } +// } return pageResult; } diff --git a/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/service/messagecenter/MessageCenterService.java b/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/service/messagecenter/MessageCenterService.java index 099547b4..d6e3ffdf 100644 --- a/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/service/messagecenter/MessageCenterService.java +++ b/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/service/messagecenter/MessageCenterService.java @@ -1,6 +1,7 @@ package cn.iocoder.yudao.module.farm.service.messagecenter; import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.module.farm.controller.admin.digitalcockpit.vo.VariousIndexesRespVO; import cn.iocoder.yudao.module.farm.controller.admin.managementcenter.messagecenter.vo.MessageCenterPageReqVO; import cn.iocoder.yudao.module.farm.controller.admin.managementcenter.messagecenter.vo.MessageCenterSaveReqVO; import cn.iocoder.yudao.module.farm.controller.admin.managementcenter.messagecenter.vo.MessageStatisticsRespVO; @@ -77,4 +78,11 @@ public interface MessageCenterService { * @param messageType */ void pushMessage(String title, String content, Integer messageType); + + /** + * 预警统计 + * @param baseId + * @return + */ + VariousIndexesRespVO getVariousIndexes(String baseId); } \ No newline at end of file diff --git a/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/service/messagecenter/MessageCenterServiceImpl.java b/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/service/messagecenter/MessageCenterServiceImpl.java index aacfb290..878648d1 100644 --- a/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/service/messagecenter/MessageCenterServiceImpl.java +++ b/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/service/messagecenter/MessageCenterServiceImpl.java @@ -4,6 +4,7 @@ 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.digitalcockpit.vo.VariousIndexesRespVO; import cn.iocoder.yudao.module.farm.controller.admin.managementcenter.messagecenter.vo.MessageCenterPageReqVO; import cn.iocoder.yudao.module.farm.controller.admin.managementcenter.messagecenter.vo.MessageCenterSaveReqVO; import cn.iocoder.yudao.module.farm.controller.admin.managementcenter.messagecenter.vo.MessageStatisticsRespVO; @@ -146,4 +147,10 @@ public class MessageCenterServiceImpl implements MessageCenterService { this.createMessageCenter(m); } + + @Override + public VariousIndexesRespVO getVariousIndexes(String baseId) { + VariousIndexesRespVO res = messageCenterMapper.getVariousIndexes(baseId); + return res; + } } \ No newline at end of file diff --git a/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/service/plotinfo/PlotInfoService.java b/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/service/plotinfo/PlotInfoService.java index 96d1fbf8..b7ff9000 100644 --- a/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/service/plotinfo/PlotInfoService.java +++ b/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/service/plotinfo/PlotInfoService.java @@ -9,6 +9,7 @@ import jakarta.validation.Valid; import java.math.BigDecimal; import java.util.List; +import java.util.Map; /** * 地块 Service 接口 @@ -117,4 +118,11 @@ public interface PlotInfoService { * @return */ List listPlotInfo(String baseId); + + /** + * id + * point + * @return + */ + Map getPlotPointMap(); } \ No newline at end of file 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 b37bade8..46e11c13 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 @@ -26,6 +26,7 @@ import org.springframework.validation.annotation.Validated; import java.math.BigDecimal; import java.util.*; +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; @@ -311,6 +312,17 @@ public class PlotInfoServiceImpl implements PlotInfoService { return pList; } + @Override + public Map getPlotPointMap() { + LambdaQueryWrapperX wrapperX = new LambdaQueryWrapperX<>(); + wrapperX.eq(PlotInfoDO::getDeleted, CommonConstants.NO_CODE); + List plotInfoDOS = plotInfoMapper.selectList(wrapperX); + + Map pointMap = plotInfoDOS.stream().collect(Collectors.toMap(PlotInfoDO::getId, PlotInfoDO::getPoint, (v1, v2) -> v1)); + + return pointMap; + } + // ==================== 私有方法 ==================== /** diff --git a/yudao-module-farm/src/main/resources/mapper/messagecenter/MessageCenterMapper.xml b/yudao-module-farm/src/main/resources/mapper/messagecenter/MessageCenterMapper.xml index 8d5e642e..62fa2ab8 100644 --- a/yudao-module-farm/src/main/resources/mapper/messagecenter/MessageCenterMapper.xml +++ b/yudao-module-farm/src/main/resources/mapper/messagecenter/MessageCenterMapper.xml @@ -9,4 +9,20 @@ 文档可见:https://www.iocoder.cn/MyBatis/x-plugins/ --> + \ No newline at end of file