From 2b85f82495d98c9332f97a1e10ba3f83b73dcb76 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=BE=BE=E5=AF=8C=E6=96=8C?= Date: Thu, 25 Sep 2025 16:47:58 +0800 Subject: [PATCH] =?UTF-8?q?feat=20(farm):=20=E8=BF=9C=E7=A8=8B=E6=8E=A5?= =?UTF-8?q?=E5=8F=A3API?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 数字驾驶舱-基地与设备信息列表 - 数字驾驶舱-灾害统计-农事分布 - 数字驾驶舱-设备总览 --- .../controller/admin/api/ApiController.java | 44 +++++++++-- .../admin/api/vo/DeviceMonitoringReqVO.java | 24 ++++++ .../admin/api/vo/DeviceMonitoringRespVO.java | 55 ++++++++++++++ .../admin/api/vo/DeviceStateRespVO.java | 6 +- .../api/vo/FarmBaseAndDeviceInfoReqVO.java | 21 +++++ .../api/vo/FarmBaseAndDeviceInfoRespVO.java | 45 +++++++++++ .../api/vo/FarmingDistributionRespVO.java | 10 +-- .../vo/v2/DeviceInfoDetailV2RespVO.java | 76 ++++++++++++++++++- .../DigitalCockpitController.java | 10 +-- .../mysql/deviceinfo/DeviceInfoMapper.java | 8 ++ .../farmingrecord/FarmingRecordMapper.java | 3 + .../farm/manager/devices/DeviceManager.java | 26 +++++-- .../manager/devices/commons/DeviceConst.java | 16 ++++ .../service/deviceinfo/DeviceInfoService.java | 23 +++++- .../deviceinfo/DeviceInfoServiceImpl.java | 36 ++++++++- .../farmingrecord/FarmingRecordService.java | 2 +- .../FarmingRecordServiceImpl.java | 5 +- .../ProductionPlanServiceImpl.java | 2 - .../yudao/module/farm/utils/DateUtils.java | 18 +++++ .../mapper/deviceinfo/DeviceInfoMapper.xml | 9 +++ .../farmingrecord/FarmingRecordMapper.xml | 15 ++++ 21 files changed, 418 insertions(+), 36 deletions(-) create mode 100644 yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/controller/admin/api/vo/DeviceMonitoringReqVO.java create mode 100644 yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/controller/admin/api/vo/DeviceMonitoringRespVO.java create mode 100644 yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/controller/admin/api/vo/FarmBaseAndDeviceInfoReqVO.java create mode 100644 yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/controller/admin/api/vo/FarmBaseAndDeviceInfoRespVO.java diff --git a/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/controller/admin/api/ApiController.java b/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/controller/admin/api/ApiController.java index 123a850f..51beb9a9 100644 --- a/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/controller/admin/api/ApiController.java +++ b/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/controller/admin/api/ApiController.java @@ -2,17 +2,17 @@ package cn.iocoder.yudao.module.farm.controller.admin.api; import cn.iocoder.yudao.framework.common.pojo.CommonResult; import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.framework.common.util.object.BeanUtils; import cn.iocoder.yudao.module.farm.controller.admin.api.vo.*; +import cn.iocoder.yudao.module.farm.dal.dataobject.deviceinfo.DeviceInfoDO; import cn.iocoder.yudao.module.farm.service.baseinfo.BaseInfoService; 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.productionplan.ProductionPlanService; import cn.iocoder.yudao.module.farm.service.screendisasterdata.ScreenDisasterDataService; import io.swagger.v3.oas.annotations.Operation; -import io.swagger.v3.oas.annotations.media.Schema; import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.validation.Valid; -import jakarta.validation.constraints.NotNull; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; @@ -20,6 +20,9 @@ import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import java.util.List; +import java.util.Map; + +import static cn.iocoder.yudao.module.farm.enums.CommonConstants.DEVICE_STATE_MAP; /** * @description: api 接口 @@ -86,6 +89,28 @@ public class ApiController { return baseInfoService.getBaseInfoList(req); } + @PostMapping("/digital-cockpit/baseAndDevice/list") + @Operation(summary = "数字驾驶舱-基地与设备信息列表") + public CommonResult> getBaseAndDeviceInfoList(@Valid @RequestBody FarmBaseAndDeviceInfoReqVO req) { + CommonResult> bResult = baseInfoService.getBaseInfoList(new FarmBaseInfoReqVO(req.getTenantId())); + List dList = BeanUtils.toBean(bResult.getData(), FarmBaseAndDeviceInfoRespVO.class); + + Map dtNameMap = deviceInfoService.getDeviceTypeNameMap(req.getTenantId()); + dList.forEach(e -> { + List sourceList = deviceInfoService.getBaseAndDeviceInfoList(e.getBaseId()); + List targetList = sourceList.stream().map(d ->{ + FarmBaseAndDeviceInfoRespVO.DeviceInfo target = BeanUtils.toBean(d, FarmBaseAndDeviceInfoRespVO.DeviceInfo.class); + // code -> name + target.setDeviceTypeName(dtNameMap.getOrDefault(d.getDeviceType(), "")); + target.setDeviceStateName(DEVICE_STATE_MAP.getOrDefault(d.getDeviceState(),"")); + return target; + }).toList(); + e.setDeviceInfoList(targetList); + }); + + return CommonResult.success(dList); + } + @PostMapping("/digital-cockpit/chart/yield-comparison") @Operation(summary = "数字驾驶舱-生产数据-产量对比") public CommonResult> getYieldComparisonChart(@Valid @RequestBody YieldComparisonChartReqVO req) { @@ -106,14 +131,23 @@ public class ApiController { @PostMapping("/digital-cockpit/chart/farming-distribution") @Operation(summary = "数字驾驶舱-灾害统计-农事分布") - public CommonResult> getFarmingDistributionChart(@Valid @RequestBody FarmingDistributionReqVO req) { - return farmingRecordService.getFarmingDistributionChart(req); // TODO: 2025/9/4 未实现 + public CommonResult getFarmingDistributionChart(@Valid @RequestBody FarmingDistributionReqVO req) { + return farmingRecordService.getFarmingDistributionChart(req); } @PostMapping("/digital-cockpit/chart/device-state") @Operation(summary = "数字驾驶舱-设备总览") public CommonResult getDeviceStateStatistics(@Valid @RequestBody DeviceStateReqVO req) { - return deviceInfoService.getDeviceStateStatistics(req); // TODO: 2025/9/24 + return deviceInfoService.getDeviceStateStatistics(req); } + @PostMapping("/digital-cockpit/chart/device-monitoring") + @Operation(summary = "数字驾驶舱-设备监测") + public CommonResult getDeviceMonitoring(@Valid @RequestBody DeviceMonitoringReqVO req) { + return deviceInfoService.getDeviceMonitoring(req);// TODO: 2025/9/25 + } + + + + } diff --git a/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/controller/admin/api/vo/DeviceMonitoringReqVO.java b/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/controller/admin/api/vo/DeviceMonitoringReqVO.java new file mode 100644 index 00000000..ddb41897 --- /dev/null +++ b/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/controller/admin/api/vo/DeviceMonitoringReqVO.java @@ -0,0 +1,24 @@ +package cn.iocoder.yudao.module.farm.controller.admin.api.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.NotNull; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + * @description: + * @author: binda + * @date: 2025/9/25 10:58 + */ +@Data +@AllArgsConstructor +@NoArgsConstructor +public class DeviceMonitoringReqVO { + @Schema(description = "基地D") + @NotNull(message = "基地D: 不能为空") + private String baseId; + @Schema(description = "租户ID") + @NotNull(message = "租户ID: 不能为空") + private String tenantId; +} diff --git a/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/controller/admin/api/vo/DeviceMonitoringRespVO.java b/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/controller/admin/api/vo/DeviceMonitoringRespVO.java new file mode 100644 index 00000000..70fc96ce --- /dev/null +++ b/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/controller/admin/api/vo/DeviceMonitoringRespVO.java @@ -0,0 +1,55 @@ +package cn.iocoder.yudao.module.farm.controller.admin.api.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + * @description: + * @author: binda + * @date: 2025/9/25 10:55 + */ +@Data +@AllArgsConstructor +@NoArgsConstructor +public class DeviceMonitoringRespVO { + private String baseName; + private DeviceMonitoringInfo deviceMonitoringInfo ; + + @Data + @AllArgsConstructor + @NoArgsConstructor + public static class DeviceMonitoringInfo{ + @Schema(description = "节点编号") + private Integer nodeId; + @Schema(description = "节点名称") + private String nodeName; + @Schema(description = "节点类型") + private Integer nodeType; + + // 模拟量1 名称,单位,原值,显示值,报警等级 + @Schema(description = "temName" , example = "温度") + private String temName; + @Schema(description = "temUnit" , example = "`C") + private String temUnit; + @Schema(description = "temValue" , example = "28.100000381469727") + private Double temValue; + @Schema(description = "temValueStr" , example = "30.2") + private String temValueStr; + @Schema(description = "temAlarmStatus" , example = "0") + private Integer temAlarmStatus; + // 模拟量2 名称,单位,原值,显示值,报警等级 + @Schema(description = "humName" , example = "湿度") + private String humName; + @Schema(description = "humUnit" , example = "%RH") + private String humUnit; + @Schema(description = "humValue" , example = "13.699999809265137") + private String humValue; + @Schema(description = "humValueStr" , example = "13.7") + private String humValueStr; + @Schema(description = "humAlarmStatus" , example = "0") + private String humAlarmStatus; + } + +} diff --git a/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/controller/admin/api/vo/DeviceStateRespVO.java b/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/controller/admin/api/vo/DeviceStateRespVO.java index fa00096b..c031f79d 100644 --- a/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/controller/admin/api/vo/DeviceStateRespVO.java +++ b/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/controller/admin/api/vo/DeviceStateRespVO.java @@ -5,6 +5,8 @@ import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; +import java.util.List; + /** * @description: 设备状态 * @author: binda @@ -20,6 +22,8 @@ public class DeviceStateRespVO { private Integer totalOnlineDevices; @Schema(description = "离线设备总数") private Integer totalOfflineDevices; + @Schema(description = "设备类型") + private List deviceTypeList; @Data @AllArgsConstructor @@ -28,6 +32,6 @@ public class DeviceStateRespVO { @Schema(description = "设备类型名称") private String deviceTypeName; @Schema(description = "设备数量") - private Integer deviceCount; + private Long deviceCount; } } diff --git a/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/controller/admin/api/vo/FarmBaseAndDeviceInfoReqVO.java b/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/controller/admin/api/vo/FarmBaseAndDeviceInfoReqVO.java new file mode 100644 index 00000000..780645c6 --- /dev/null +++ b/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/controller/admin/api/vo/FarmBaseAndDeviceInfoReqVO.java @@ -0,0 +1,21 @@ +package cn.iocoder.yudao.module.farm.controller.admin.api.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.NotNull; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + * @description: + * @author: binda + * @date: 2025/9/25 14:09 + */ +@Data +@AllArgsConstructor +@NoArgsConstructor +public class FarmBaseAndDeviceInfoReqVO { + @Schema(description = "租户ID") + @NotNull(message = "租户ID: 不能为空") + private String tenantId; +} diff --git a/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/controller/admin/api/vo/FarmBaseAndDeviceInfoRespVO.java b/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/controller/admin/api/vo/FarmBaseAndDeviceInfoRespVO.java new file mode 100644 index 00000000..98c49e7d --- /dev/null +++ b/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/controller/admin/api/vo/FarmBaseAndDeviceInfoRespVO.java @@ -0,0 +1,45 @@ +package cn.iocoder.yudao.module.farm.controller.admin.api.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.util.List; + +/** + * @description: + * @author: binda + * @date: 2025/9/25 14:09 + */ +@Data +@AllArgsConstructor +@NoArgsConstructor +public class FarmBaseAndDeviceInfoRespVO { + @Schema(description = "基地ID") + private String baseId; + @Schema(description = "基地名称") + private String baseName; + @Schema(description = "基地范围坐标") + private String basePoint; + @Schema(description = "基地中心坐标") + private String baseCentrePoint; + @Schema(description = "设备坐标") + private List deviceInfoList; + + @Data + @AllArgsConstructor + @NoArgsConstructor + public static class DeviceInfo{ + @Schema(description = "设备类型名称") + private String deviceTypeName; + @Schema(description = "设备编号") + private String deviceUniqueId; + @Schema(description = "关联地块") + private String plotName; + @Schema(description = "设备坐标") + private String point; + @Schema(description = "设备状态 (0:未激活,1:在线,2:离线,3:维护中,4:故障)") + private String deviceStateName; + } +} diff --git a/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/controller/admin/api/vo/FarmingDistributionRespVO.java b/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/controller/admin/api/vo/FarmingDistributionRespVO.java index 59aaaa48..4b74bef4 100644 --- a/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/controller/admin/api/vo/FarmingDistributionRespVO.java +++ b/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/controller/admin/api/vo/FarmingDistributionRespVO.java @@ -16,12 +16,10 @@ import lombok.NoArgsConstructor; public class FarmingDistributionRespVO { @Schema(description = "总数") private Integer totalCount; - @Schema(description = "已逾期") - private Integer overdueStatusCount; - @Schema(description = "已完成") - private Integer completedStatusCount; - @Schema(description = "未完成") - private Integer pendingStatusCount; + @Schema(description = "未开始") + private Integer notStart; @Schema(description = "执行中") private Integer executingStatusCount; + @Schema(description = "已完成") + private Integer completedStatusCount; } diff --git a/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/controller/admin/deviceinfo/vo/v2/DeviceInfoDetailV2RespVO.java b/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/controller/admin/deviceinfo/vo/v2/DeviceInfoDetailV2RespVO.java index 7b2e8131..58a4d5b3 100644 --- a/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/controller/admin/deviceinfo/vo/v2/DeviceInfoDetailV2RespVO.java +++ b/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/controller/admin/deviceinfo/vo/v2/DeviceInfoDetailV2RespVO.java @@ -1,10 +1,12 @@ package cn.iocoder.yudao.module.farm.controller.admin.deviceinfo.vo.v2; +import com.fasterxml.jackson.annotation.JsonFormat; import io.swagger.v3.oas.annotations.media.Schema; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; +import java.time.LocalDateTime; import java.util.List; /** @@ -39,8 +41,11 @@ public class DeviceInfoDetailV2RespVO { private Integer isIotCardExisted; @Schema(description = "设备状态:0-未激活,1-在线,2-离线,3-维护中,4-故障") private Integer deviceState; + @Schema(description = "设备状态名称") + private String deviceStateName; @Schema(description = "绑定状态:1: 绑定; 0: 未绑定") private Integer bindingState; + private String bindingStateName; @Schema(description = "设备坐标") private String point; @@ -69,21 +74,84 @@ public class DeviceInfoDetailV2RespVO { public static class SoilInfo{ private String deviceUniqueId; private RealTimeData realTimeData; - private List historyDataListPages; + private List historyDataLis; } @Data @AllArgsConstructor @NoArgsConstructor public static class RealTimeData{ - private String code; + @Schema(description = "设备地址") + private String deviceAddr; + @Schema(description = "设备名称") + private String deviceName; + @Schema(description = "设备状态", example = "online") + private String status; + @Schema(description = "设备类型", example = "soil(土壤墒情)") + private String deviceType; + @Schema(description = "数据集合") + private List realDataList; } @Data @AllArgsConstructor @NoArgsConstructor - public static class HistoryDataListPage{ - private String code; + public static class RealData{ + @Schema(description = "节点编号") + private Integer nodeId; + @Schema(description = "节点名称") + private String nodeName; + @Schema(description = "节点类型") + private Integer nodeType; + + // 模拟量1 名称,单位,原值,显示值,报警等级 + @Schema(description = "temName" , example = "温度") + private String temName; + @Schema(description = "temUnit" , example = "`C") + private String temUnit; + @Schema(description = "temValue" , example = "28.100000381469727") + private Double temValue; + @Schema(description = "temValueStr" , example = "30.2") + private String temValueStr; + @Schema(description = "temAlarmStatus" , example = "0") + private Integer temAlarmStatus; + // 模拟量2 名称,单位,原值,显示值,报警等级 + @Schema(description = "humName" , example = "湿度") + private String humName; + @Schema(description = "humUnit" , example = "%RH") + private String humUnit; + @Schema(description = "humValue" , example = "13.699999809265137") + private String humValue; + @Schema(description = "humValueStr" , example = "13.7") + private String humValueStr; + @Schema(description = "humAlarmStatus" , example = "0") + private String humAlarmStatus; + } + + @Data + @AllArgsConstructor + @NoArgsConstructor + public static class HistoryDataList { + @Schema(description = "历史记录ID") + private Integer historyId; + @Schema(description = "历史记录时间") + @JsonFormat(pattern = "yyyy-MM-dd hh:MM:ss") + private LocalDateTime recordTime; + @Schema(description = "设备地址") + private String deviceAddress; + @Schema(description = "警告状态") + private Integer alarmStatus; + @Schema(description = "警告状态 (0:正常 1:报警)") + private String alarmStatusName; + + @Schema(description = "模拟量1 (字符)") + private String temStr; + @Schema(description = "模拟量1 (值)") + private Double temValue; + @Schema(description = "模拟量2 (字符)") + private String humStr; + @Schema(description = "模拟量2 (值)") + private Double humValue; } @Data 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 68f6568b..e72a6d27 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 @@ -105,11 +105,11 @@ public class DigitalCockpitController { @Parameter(name = "baseId", description = "基地ID", required = true) public CommonResult getVariousIndexes(@RequestParam("baseId") String baseId) { // TODO: 2025/9/24 待实现 - int weatherAlertCount = 0; - int pestAlertCount = 0; - int environmentalAlertCount = 0; - int deviceAlertCount = 0; - int farmingReminderCount = 0; + int weatherAlertCount = 10; + int pestAlertCount = 11; + int environmentalAlertCount = 12; + int deviceAlertCount = 13; + int farmingReminderCount = 14; return success(new VariousIndexesRespVO(weatherAlertCount, pestAlertCount, environmentalAlertCount, deviceAlertCount, farmingReminderCount)); } diff --git a/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/dal/mysql/deviceinfo/DeviceInfoMapper.java b/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/dal/mysql/deviceinfo/DeviceInfoMapper.java index f5ff6e51..9973b92f 100644 --- a/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/dal/mysql/deviceinfo/DeviceInfoMapper.java +++ b/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/dal/mysql/deviceinfo/DeviceInfoMapper.java @@ -3,6 +3,7 @@ package cn.iocoder.yudao.module.farm.dal.mysql.deviceinfo; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX; import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; +import cn.iocoder.yudao.module.farm.controller.admin.api.vo.DeviceStateRespVO; import cn.iocoder.yudao.module.farm.controller.admin.deviceinfo.vo.DeviceInfoPageReqVO; import cn.iocoder.yudao.module.farm.controller.admin.deviceinfo.vo.v2.DeviceStatisticsRespVO; import cn.iocoder.yudao.module.farm.dal.dataobject.deviceinfo.DeviceInfoDO; @@ -95,4 +96,11 @@ public interface DeviceInfoMapper extends BaseMapperX { */ DeviceStatisticsRespVO getStatisticsInfo(@Param("baseId") String baseId, @Param("tenantId") String tenantId); + + /** + * 设备在线状态统计 + * @param tenantId + * @return + */ + DeviceStateRespVO countDeviceState(String tenantId); } \ No newline at end of file diff --git a/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/dal/mysql/farmingrecord/FarmingRecordMapper.java b/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/dal/mysql/farmingrecord/FarmingRecordMapper.java index ec55c000..d2a99208 100644 --- a/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/dal/mysql/farmingrecord/FarmingRecordMapper.java +++ b/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/dal/mysql/farmingrecord/FarmingRecordMapper.java @@ -3,6 +3,8 @@ package cn.iocoder.yudao.module.farm.dal.mysql.farmingrecord; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX; import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; +import cn.iocoder.yudao.module.farm.controller.admin.api.vo.FarmingDistributionReqVO; +import cn.iocoder.yudao.module.farm.controller.admin.api.vo.FarmingDistributionRespVO; import cn.iocoder.yudao.module.farm.controller.admin.farmingrecord.vo.FarmingRecordPageReqVO; import cn.iocoder.yudao.module.farm.dal.dataobject.farmingrecord.FarmingRecordDO; import org.apache.ibatis.annotations.Mapper; @@ -37,4 +39,5 @@ public interface FarmingRecordMapper extends BaseMapperX { .orderByDesc(FarmingRecordDO::getTaskTime)); } + FarmingDistributionRespVO getFarmingDistributionChart(FarmingDistributionReqVO req); } \ No newline at end of file diff --git a/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/manager/devices/DeviceManager.java b/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/manager/devices/DeviceManager.java index ecdb8e63..ed69d83f 100644 --- a/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/manager/devices/DeviceManager.java +++ b/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/manager/devices/DeviceManager.java @@ -1,5 +1,6 @@ package cn.iocoder.yudao.module.farm.manager.devices; +import cn.iocoder.yudao.framework.common.util.object.BeanUtils; import cn.iocoder.yudao.module.farm.controller.admin.deviceinfo.vo.v2.DeviceInfoDetailV2RespVO; import cn.iocoder.yudao.module.farm.manager.devices.soil.SoilService; import cn.iocoder.yudao.module.farm.manager.devices.soil.dto.HistoryDataListPageReqVO; @@ -7,12 +8,14 @@ import cn.iocoder.yudao.module.farm.manager.devices.soil.dto.HistoryDataListPage import cn.iocoder.yudao.module.farm.manager.devices.soil.dto.RealTimeDataReqVO; import cn.iocoder.yudao.module.farm.manager.devices.soil.dto.RealTimeDataRespVO; import cn.iocoder.yudao.module.farm.manager.devices.wf.WaterFertilizerService; +import cn.iocoder.yudao.module.farm.utils.DateUtils; import org.apache.commons.lang3.ObjectUtils; import org.springframework.stereotype.Service; import java.util.List; import static cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils.getLoginUser; +import static cn.iocoder.yudao.module.farm.manager.devices.commons.DeviceConst.ALARM_STATUS_NAME_MAP; /** * @description: 设备管理 @@ -58,19 +61,30 @@ public class DeviceManager { if (ObjectUtils.isEmpty(realTimeData)) { return null; } - - - - return null; + RealTimeDataRespVO sourceObj = realTimeData.get(0); + return BeanUtils.toBean(sourceObj, DeviceInfoDetailV2RespVO.RealTimeData.class); } - public List coverToSoil(HistoryDataListPageRespVO historyDataList ) { + public List coverToSoil(HistoryDataListPageRespVO historyDataList ) { if (ObjectUtils.isEmpty(historyDataList)) { return null; } + List source = historyDataList.getRows(); + return source.stream().map(e -> { + DeviceInfoDetailV2RespVO.HistoryDataList target = new DeviceInfoDetailV2RespVO.HistoryDataList(); + target.setHistoryId(e.getHistoryId()); + target.setRecordTime(DateUtils.timestampToLocalDateTime(e.getRecordTime())); + target.setDeviceAddress(e.getDeviceAddress()); + target.setAlarmStatus(e.getAlarmStatus()); + target.setAlarmStatusName(ALARM_STATUS_NAME_MAP.getOrDefault(e.getAlarmStatus(),"")); + target.setTemStr(e.getTemStr()); + target.setTemValue(e.getTemValue()); + target.setHumStr(e.getHumStr()); + target.setHumValue(e.getHumValue()); + return target; + }).toList(); - return null; } diff --git a/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/manager/devices/commons/DeviceConst.java b/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/manager/devices/commons/DeviceConst.java index 143cacc0..cc962c23 100644 --- a/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/manager/devices/commons/DeviceConst.java +++ b/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/manager/devices/commons/DeviceConst.java @@ -1,5 +1,8 @@ package cn.iocoder.yudao.module.farm.manager.devices.commons; +import java.util.HashMap; +import java.util.Map; + /** * @description: 设备常量 * @author: binda @@ -74,6 +77,19 @@ public class DeviceConst { public final int NOTICE_TYPE_0 = 0; // 邮箱 public final int NOTICE_TYPE_1 = 1; // 短信 + + + + public final static int ALARM_STATUS_NAME_0 = 0; // 正常 + public final static int ALARM_STATUS_NAME_1 = 1; // 报警 + // TODO: 2025/9/17 UpdateNodeInfoReqVO + + public static Map ALARM_STATUS_NAME_MAP = new HashMap<>(); + static { + ALARM_STATUS_NAME_MAP.put(ALARM_STATUS_NAME_0, "正常"); + ALARM_STATUS_NAME_MAP.put(ALARM_STATUS_NAME_1, "报警"); + } + } diff --git a/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/service/deviceinfo/DeviceInfoService.java b/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/service/deviceinfo/DeviceInfoService.java index 07065545..5f9b4542 100644 --- a/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/service/deviceinfo/DeviceInfoService.java +++ b/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/service/deviceinfo/DeviceInfoService.java @@ -1,8 +1,7 @@ package cn.iocoder.yudao.module.farm.service.deviceinfo; import cn.iocoder.yudao.framework.common.pojo.CommonResult; -import cn.iocoder.yudao.module.farm.controller.admin.api.vo.DeviceStateReqVO; -import cn.iocoder.yudao.module.farm.controller.admin.api.vo.DeviceStateRespVO; +import cn.iocoder.yudao.module.farm.controller.admin.api.vo.*; import cn.iocoder.yudao.module.farm.controller.admin.deviceinfo.vo.DeviceInfoPageReqVO; import cn.iocoder.yudao.module.farm.controller.admin.deviceinfo.vo.DeviceInfoSaveReqVO; import cn.iocoder.yudao.module.farm.controller.admin.deviceinfo.vo.v2.DeviceInfoDetailV2RespVO; @@ -13,6 +12,7 @@ import cn.iocoder.yudao.framework.common.pojo.PageParam; import jakarta.validation.Valid; import java.util.List; +import java.util.Map; /** * 设备信息 Service 接口 @@ -86,4 +86,23 @@ public interface DeviceInfoService { * @return */ CommonResult getDeviceStateStatistics(DeviceStateReqVO req); + + /** + * api接口 + * 设备监控 + * @param req + * @return + */ + CommonResult getDeviceMonitoring(DeviceMonitoringReqVO req); + + /** + * api接口 + * 基地与设备坐标 + * + * @param req + * @return + */ + List getBaseAndDeviceInfoList(String baseId); + + Map getDeviceTypeNameMap(String tenantId); } \ 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 8dfd47a8..02d9c9d3 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 @@ -3,8 +3,7 @@ package cn.iocoder.yudao.module.farm.service.deviceinfo; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.util.IdUtil; import cn.iocoder.yudao.framework.common.pojo.CommonResult; -import cn.iocoder.yudao.module.farm.controller.admin.api.vo.DeviceStateReqVO; -import cn.iocoder.yudao.module.farm.controller.admin.api.vo.DeviceStateRespVO; +import cn.iocoder.yudao.module.farm.controller.admin.api.vo.*; import cn.iocoder.yudao.module.farm.controller.admin.deviceinfo.vo.DeviceInfoPageReqVO; import cn.iocoder.yudao.module.farm.controller.admin.deviceinfo.vo.DeviceInfoSaveReqVO; import cn.iocoder.yudao.module.farm.controller.admin.deviceinfo.vo.v2.DeviceInfoDetailV2RespVO; @@ -29,11 +28,13 @@ import cn.iocoder.yudao.framework.security.core.LoginUser; import cn.iocoder.yudao.module.farm.dal.mysql.deviceinfo.DeviceInfoMapper; +import java.util.ArrayList; 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.common.pojo.CommonResult.success; import static cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils.getLoginUser; import static cn.iocoder.yudao.module.farm.enums.ErrorCodeConstants.DEVICE_CLASS_TYPE_ERROR; import static cn.iocoder.yudao.module.farm.enums.ErrorCodeConstants.DEVICE_INFO_NOT_EXISTS; @@ -169,7 +170,38 @@ public class DeviceInfoServiceImpl implements DeviceInfoService { @Override public CommonResult getDeviceStateStatistics(DeviceStateReqVO req) { + Map dtNameMap = this.getDeviceTypeNameMap(req.getTenantId()); + List dList = deviceInfoMapper.selectList(DeviceInfoDO::getTenantId, req.getTenantId()); + Map countByDeviceType = dList.stream().collect(Collectors.groupingBy(DeviceInfoDO::getDeviceType, Collectors.counting())); + + List dtList = new ArrayList<>(); + for (Map.Entry entry : countByDeviceType.entrySet()) { + String v1 = dtNameMap.get(entry.getKey()); + Long v2 = entry.getValue(); + dtList.add(new DeviceStateRespVO.DeviceType(v1, v2)); + } + + DeviceStateRespVO res = deviceInfoMapper.countDeviceState(req.getTenantId()); + res.setDeviceTypeList(dtList); + return success(res); + } + + @Override + public CommonResult getDeviceMonitoring(DeviceMonitoringReqVO req) { return null; } + @Override + public List getBaseAndDeviceInfoList(String baseId) { + return deviceInfoMapper.selectList(DeviceInfoDO::getBaseId,baseId); + } + + @Override + public Map getDeviceTypeNameMap(String tenantId) { + List deviceClassifyDOS = deviceClassifyMapper.selectList(DeviceClassifyDO::getTenantId, tenantId); + return deviceClassifyDOS.stream() + .filter(device -> device.getParentId() != null && device.getParentId() == 0) + .collect(Collectors.toMap(e -> e.getId().toString(), DeviceClassifyDO::getName)); + } + } \ No newline at end of file diff --git a/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/service/farmingrecord/FarmingRecordService.java b/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/service/farmingrecord/FarmingRecordService.java index e51ede60..6e45d7f3 100644 --- a/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/service/farmingrecord/FarmingRecordService.java +++ b/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/service/farmingrecord/FarmingRecordService.java @@ -92,6 +92,6 @@ public interface FarmingRecordService { * @param req * @return */ - CommonResult> getFarmingDistributionChart(FarmingDistributionReqVO req); + CommonResult getFarmingDistributionChart(FarmingDistributionReqVO req); } \ No newline at end of file diff --git a/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/service/farmingrecord/FarmingRecordServiceImpl.java b/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/service/farmingrecord/FarmingRecordServiceImpl.java index deefb73d..9d9b3cc6 100644 --- a/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/service/farmingrecord/FarmingRecordServiceImpl.java +++ b/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/service/farmingrecord/FarmingRecordServiceImpl.java @@ -268,7 +268,8 @@ public class FarmingRecordServiceImpl implements FarmingRecordService { } @Override - public CommonResult> getFarmingDistributionChart(FarmingDistributionReqVO req) { - return null; + public CommonResult getFarmingDistributionChart(FarmingDistributionReqVO req) { + FarmingDistributionRespVO res = farmingRecordMapper.getFarmingDistributionChart(req); + return CommonResult.success(res); } } \ 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 1af1bdcf..ef0a6cdf 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 @@ -226,8 +226,6 @@ public class ProductionPlanServiceImpl implements ProductionPlanService { @Override public int getGrowingPlotCount(String baseId) { - - List planList = productionPlanMapper.selectList("base_id", baseId); long count = planList.stream().filter(e -> Objects.equals(e.getPlanStatus(), PLAN_STATUS_2)).count(); return (int) count; diff --git a/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/utils/DateUtils.java b/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/utils/DateUtils.java index 59d0d87f..3b785f09 100644 --- a/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/utils/DateUtils.java +++ b/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/utils/DateUtils.java @@ -1,6 +1,10 @@ package cn.iocoder.yudao.module.farm.utils; +import java.time.Instant; import java.time.LocalDate; +import java.time.LocalDateTime; +import java.time.ZoneId; +import java.time.format.DateTimeFormatter; /** * @description: @@ -9,9 +13,23 @@ import java.time.LocalDate; */ public class DateUtils { + private static final DateTimeFormatter DEFAULT_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); + public static boolean isTodayInRange(LocalDate startDate, LocalDate endDate) { LocalDate today = LocalDate.now(); return !today.isBefore(startDate) && !today.isAfter(endDate); } + /** + * 将时间戳转换为LocalDateTime + * @param timestamp 时间戳(毫秒) + * @return LocalDateTime对象 + */ + public static LocalDateTime timestampToLocalDateTime(long timestamp) { + return LocalDateTime.ofInstant( + Instant.ofEpochMilli(timestamp), + ZoneId.systemDefault() + ); + } + } diff --git a/yudao-module-farm/src/main/resources/mapper/deviceinfo/DeviceInfoMapper.xml b/yudao-module-farm/src/main/resources/mapper/deviceinfo/DeviceInfoMapper.xml index feeb01fe..2b6bc3c4 100644 --- a/yudao-module-farm/src/main/resources/mapper/deviceinfo/DeviceInfoMapper.xml +++ b/yudao-module-farm/src/main/resources/mapper/deviceinfo/DeviceInfoMapper.xml @@ -29,4 +29,13 @@ + + \ No newline at end of file diff --git a/yudao-module-farm/src/main/resources/mapper/farmingrecord/FarmingRecordMapper.xml b/yudao-module-farm/src/main/resources/mapper/farmingrecord/FarmingRecordMapper.xml index 7b23fb65..d613b620 100644 --- a/yudao-module-farm/src/main/resources/mapper/farmingrecord/FarmingRecordMapper.xml +++ b/yudao-module-farm/src/main/resources/mapper/farmingrecord/FarmingRecordMapper.xml @@ -9,4 +9,19 @@ 文档可见:https://www.iocoder.cn/MyBatis/x-plugins/ --> + \ No newline at end of file