Compare commits

...

11 Commits

Author SHA1 Message Date
0b88558d00 修改配置 2025-11-30 17:55:35 +08:00
达富斌
c9ef3a8bbb fix (farm): 管理后台 - 病虫草害库维护
- 删除冗余代码
2025-11-26 21:44:54 +08:00
达富斌
64bb5cdc8a fix (farm): 管理后台 - 病虫草害库维护
- 删除冗余代码
2025-11-26 21:39:14 +08:00
达富斌
153f376268 fix (farm): 租户管理
- 新增租户 初始化 四个角色 (管理员,基地管理,技术员,普通用户)
2025-11-26 20:52:56 +08:00
达富斌
d73b86c794 fix (farm): 登录(微信端)
- 刷新LocalThread中的tenantId
2025-11-26 19:24:08 +08:00
达富斌
e6cb5601c6 fix (farm): 性能优化
1. 地块的颜色需要再透明一点 ✅
2. 点击大屏报错 ✅
3. 图片展示不出来 ✅
4. 基础管理 - 模型管理 - 缓存慢
5. 设备中心缓存慢 ✅
6. 首页 - 负责人展示不出来 ✅
7. 基础管理 - 基地规划 - 缓存慢  ✅
8. 网箱数量没接通 ✅
2025-11-26 19:22:25 +08:00
达富斌
91dcfd73c1 fix (farm): 基地规划
- 地块编号导致的异常问题
2025-11-24 16:21:04 +08:00
达富斌
d27757f9dc fix (farm): 配置文件
- wanmao 服务器配置
2025-11-24 14:25:34 +08:00
达富斌
cb9781f6f1 fix (farm): 大屏,微信端
- 大屏模拟数据维护
- 微信端切换租户
2025-11-21 01:29:42 +08:00
达富斌
e430062aa5 fix (farm): 大屏
- 大屏模拟数据维护
2025-11-21 00:06:16 +08:00
达富斌
c99967d0b9 fix (farm): 人员管理,大屏
- 人员管理简化流程
- 大屏数据切换接口
2025-11-20 19:46:05 +08:00
55 changed files with 719 additions and 1010 deletions

View File

@@ -138,6 +138,13 @@ public class DeviceInfoController {
@Operation(summary = "获得设备信息分页") @Operation(summary = "获得设备信息分页")
public CommonResult<PageResult<DeviceInfoPageV2RespVO>> getDeviceInfoPage(@Valid DeviceInfoPageV2ReqVO pageReqVO) { public CommonResult<PageResult<DeviceInfoPageV2RespVO>> getDeviceInfoPage(@Valid DeviceInfoPageV2ReqVO pageReqVO) {
Map<String, String> typeNameMap = deviceClassifyService.getTypeNameMap();
Map<String, String> typeCodeMap = deviceClassifyService.getTypeCodeMap();
Map<String, String> imageMap = deviceClassifyService.getImageMap();
// Map<String, String> basePointMap = baseInfoService.getBasePointMap();
Map<String, String> plotPointMap = plotInfoService.getPlotPointMap();
DeviceInfoPageReqVO targetObj = new DeviceInfoPageReqVO(); DeviceInfoPageReqVO targetObj = new DeviceInfoPageReqVO();
targetObj.setPageSize(100); targetObj.setPageSize(100);
targetObj.setBaseId(pageReqVO.getBaseId()); targetObj.setBaseId(pageReqVO.getBaseId());
@@ -151,14 +158,11 @@ public class DeviceInfoController {
for (DeviceInfoPageV2RespVO d : deviceInfoRespVOPageResult.getList()) { for (DeviceInfoPageV2RespVO d : deviceInfoRespVOPageResult.getList()) {
if (!StringUtils.isEmpty(d.getBaseId()) && !StringUtils.isEmpty(d.getBaseId())) { if (!StringUtils.isEmpty(d.getBaseId()) && !StringUtils.isEmpty(d.getBaseId())) {
BaseInfoDO b = baseInfoService.getBaseInfo(d.getBaseId()); // d.setBasePoint(basePointMap.get(d.getBaseId()));
PlotInfoDO p = plotInfoService.getPlotInfo(d.getPlotId()); d.setPlotPoint(plotPointMap.get(d.getPlotId()));
d.setBasePoint(b.getPoint());
d.setPlotPoint(p.getPoint());
} }
Map<String, String> typeNameMap = deviceClassifyService.getTypeNameMap(); d.setImage(imageMap.get(d.getDeviceType()));
Map<String, String> typeCodeMap = deviceClassifyService.getTypeCodeMap();
d.setDeviceTypeName(typeNameMap.get(d.getDeviceType())); d.setDeviceTypeName(typeNameMap.get(d.getDeviceType()));
d.setDeviceTypeCode(typeCodeMap.get(d.getDeviceType())); d.setDeviceTypeCode(typeCodeMap.get(d.getDeviceType()));
d.setDeviceStateName(DEVICE_STATE_MAP.get(d.getDeviceState())); d.setDeviceStateName(DEVICE_STATE_MAP.get(d.getDeviceState()));

View File

@@ -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<Boolean> 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<DeviceStatusRespVO> 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<List<DeviceStatusRespVO>> getOnlineDevices() {
// List<DeviceInfoDO> devices = deviceStatusService.getOnlineDevices();
// List<DeviceStatusRespVO> 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<List<DeviceStatusRespVO>> getOfflineDevices() {
// List<DeviceInfoDO> devices = deviceStatusService.getOfflineDevices();
// List<DeviceStatusRespVO> 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<List<DeviceStatusRespVO>> getTimeoutDevices(
// @RequestParam(value = "timeoutMinutes", defaultValue = "10") int timeoutMinutes) {
// List<DeviceInfoDO> devices = deviceStatusService.getTimeoutDevices(timeoutMinutes);
// List<DeviceStatusRespVO> 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<DeviceStatusStatisticsRespVO> 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<Boolean> 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<Boolean> 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<Boolean> 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<Integer> checkOfflineDevices(
// @RequestParam(value = "timeoutMinutes", defaultValue = "10") int timeoutMinutes) {
// int count = deviceStatusService.checkAndUpdateOfflineDevices(timeoutMinutes);
// return success(count);
// }
}

View File

@@ -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;
}

View File

@@ -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;
}

View File

@@ -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;
}

View File

@@ -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.companyinfo.CompanyInfoService;
import cn.iocoder.yudao.module.farm.service.deviceinfo.DeviceInfoService; 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.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.modelmanagement.ModelManagementService;
import cn.iocoder.yudao.module.farm.service.plotinfo.PlotInfoService; import cn.iocoder.yudao.module.farm.service.plotinfo.PlotInfoService;
import cn.iocoder.yudao.module.farm.service.productionplan.ProductionPlanService; import cn.iocoder.yudao.module.farm.service.productionplan.ProductionPlanService;
@@ -24,9 +25,9 @@ import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Arrays;
import java.util.List; 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.common.pojo.CommonResult.success;
import static cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils.getLoginUser; import static cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils.getLoginUser;
@@ -48,8 +49,9 @@ public class DigitalCockpitController {
private final ProductionPlanService productionPlanService; private final ProductionPlanService productionPlanService;
private final FarmingRecordService farmingRecordService; private final FarmingRecordService farmingRecordService;
private final ModelManagementService modelManagementService; 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.baseInfoService = baseInfoService;
this.plotInfoService = plotInfoService; this.plotInfoService = plotInfoService;
this.companyInfoService = companyInfoService; this.companyInfoService = companyInfoService;
@@ -57,6 +59,7 @@ public class DigitalCockpitController {
this.productionPlanService = productionPlanService; this.productionPlanService = productionPlanService;
this.farmingRecordService = farmingRecordService; this.farmingRecordService = farmingRecordService;
this.modelManagementService = modelManagementService; this.modelManagementService = modelManagementService;
this.messageCenterService = messageCenterService;
} }
@GetMapping("/company-info") @GetMapping("/company-info")
@@ -111,13 +114,8 @@ public class DigitalCockpitController {
@Operation(summary = "各项数据统计") @Operation(summary = "各项数据统计")
@Parameter(name = "baseId", description = "基地ID", required = true) @Parameter(name = "baseId", description = "基地ID", required = true)
public CommonResult<VariousIndexesRespVO> getVariousIndexes(@RequestParam("baseId") String baseId) { public CommonResult<VariousIndexesRespVO> getVariousIndexes(@RequestParam("baseId") String baseId) {
// TODO: 2025/9/24 待实现 VariousIndexesRespVO res = messageCenterService.getVariousIndexes(baseId);
int weatherAlertCount = 10; return success(res);
int pestAlertCount = 11;
int environmentalAlertCount = 12;
int deviceAlertCount = 13;
int farmingReminderCount = 14;
return success(new VariousIndexesRespVO(weatherAlertCount, pestAlertCount, environmentalAlertCount, deviceAlertCount, farmingReminderCount));
} }
@GetMapping("/crop-statistics/type/1") @GetMapping("/crop-statistics/type/1")
@@ -137,6 +135,10 @@ public class DigitalCockpitController {
public CommonResult<List<YieldStatisticsRespVO>> getYieldStatisticsInfo(@RequestParam("baseId") String baseId, public CommonResult<List<YieldStatisticsRespVO>> getYieldStatisticsInfo(@RequestParam("baseId") String baseId,
@RequestParam("year") String year) { @RequestParam("year") String year) {
List<YieldStatisticsRespVO> res = productionPlanService.getCultivatingYieldInfo(baseId, year); List<YieldStatisticsRespVO> res = productionPlanService.getCultivatingYieldInfo(baseId, year);
res = Arrays.asList(
new YieldStatisticsRespVO("红玫瑰",10000,20000),
new YieldStatisticsRespVO("褚橙",25000,50000)
);
return success(res); return success(res);
} }
@@ -191,7 +193,7 @@ public class DigitalCockpitController {
ModelManagementDO mObj = modelManagementService.getTopQuoteCount(); ModelManagementDO mObj = modelManagementService.getTopQuoteCount();
if (ObjectUtils.isEmpty(mObj)) { if (ObjectUtils.isEmpty(mObj)) {
return error(500,"还未创建模型"); return success(new PlanSpeciesRespVO());
} }
PlanSpeciesRespVO res = new PlanSpeciesRespVO(); PlanSpeciesRespVO res = new PlanSpeciesRespVO();
res.setImage(mObj.getSpeciesImage()); res.setImage(mObj.getSpeciesImage());

View File

@@ -14,14 +14,14 @@ import lombok.NoArgsConstructor;
@AllArgsConstructor @AllArgsConstructor
@NoArgsConstructor @NoArgsConstructor
public class VariousIndexesRespVO { public class VariousIndexesRespVO {
@Schema(description = "气象预警数量") @Schema(description = "气象告警数量")
private Integer weatherAlertCount; private Integer weatherAlertCount;
@Schema(description = "病虫害告警数量") @Schema(description = "虫害告警数量")
private Integer pestAlertCount; private Integer pestAlertCount;
@Schema(description = "环境告警数量") @Schema(description = "环境告警数量")
private Integer environmentalAlertCount; private Integer environmentalAlertCount;
@Schema(description = "设备告警数量") @Schema(description = "预警数量")
private Integer deviceAlertCount; private Integer deviceAlertCount;
@Schema(description = "农事提醒刷领") @Schema(description = "消息数量")
private Integer farmingReminderCount; private Integer farmingReminderCount;
} }

View File

@@ -198,7 +198,9 @@ public class HomeInfo {
@Schema(description = "任务进度-分母") @Schema(description = "任务进度-分母")
private Integer progressBarDenominator; private Integer progressBarDenominator;
@Schema(description = "种植面积") @Schema(description = "种植面积")
private Double predictedArea; private String predictedArea;
@Schema(description = "计划网箱数")
private Integer predictedGridNumber;
@Schema(description = "预计产量") @Schema(description = "预计产量")
private Integer predictedYields; private Integer predictedYields;
@Schema(description = "计划执行状态") @Schema(description = "计划执行状态")

View File

@@ -101,6 +101,24 @@ public class BaseInfoController {
return success(res); return success(res);
} }
@GetMapping("/base-overview/base")
@Operation(summary = "基地详情")
@Parameter(name = "baseId", description = "基地编号", required = true, example = "1024")
public CommonResult<BaseInfoRespVO.BaseInfo> 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<BaseInfoRespVO.PlotInfo> getPlotDetails(@RequestParam("plotId") String plotId) {
BaseInfoRespVO.PlotInfo res = baseInfoService.getPlotDetails(plotId);
return success(res);
}
@GetMapping("/export-excel") @GetMapping("/export-excel")
@Operation(summary = "导出基地 Excel") @Operation(summary = "导出基地 Excel")
@ApiAccessLog(operateType = EXPORT) @ApiAccessLog(operateType = EXPORT)

View File

@@ -6,10 +6,9 @@ import cn.iocoder.yudao.framework.common.pojo.PageParam;
import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.common.util.object.BeanUtils; import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils; import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils;
import cn.iocoder.yudao.module.farm.controller.admin.managementcenter.largescreen.foundationinfo.vo.FoundationInfoPageReqVO; import cn.iocoder.yudao.module.farm.controller.admin.managementcenter.largescreen.foundationinfo.vo.*;
import cn.iocoder.yudao.module.farm.controller.admin.managementcenter.largescreen.foundationinfo.vo.FoundationInfoRespVO;
import cn.iocoder.yudao.module.farm.controller.admin.managementcenter.largescreen.foundationinfo.vo.FoundationInfoSaveReqVO;
import cn.iocoder.yudao.module.farm.dal.dataobject.foundationinfo.FoundationInfoDO; import cn.iocoder.yudao.module.farm.dal.dataobject.foundationinfo.FoundationInfoDO;
import cn.iocoder.yudao.module.farm.service.foundationinfo.CockpitMockInfoService;
import cn.iocoder.yudao.module.farm.service.foundationinfo.FoundationInfoService; import cn.iocoder.yudao.module.farm.service.foundationinfo.FoundationInfoService;
import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter; import io.swagger.v3.oas.annotations.Parameter;
@@ -34,6 +33,8 @@ public class FoundationInfoController {
@Resource @Resource
private FoundationInfoService foundationInfoService; private FoundationInfoService foundationInfoService;
@Resource
private CockpitMockInfoService cockpitMockInfoService;
@PostMapping("/create") @PostMapping("/create")
@Operation(summary = "创建基础信息") @Operation(summary = "创建基础信息")
@@ -93,17 +94,16 @@ public class FoundationInfoController {
@GetMapping("/data-toggle/get") @GetMapping("/data-toggle/get")
@Operation(summary = "数据切换-获取") @Operation(summary = "数据切换-获取")
@Parameter(name = "data", description = "数据", required = true) @Parameter(name = "baseId", description = "数据", required = true)
public CommonResult<String> getDataToggle(@RequestParam("data") String data) { public CommonResult<List<DataToggleRespVO>> getDataToggle(@RequestParam("baseId") String baseId) {
String res = ""; return success(cockpitMockInfoService.getDataToggle(baseId));
return success(res);
} }
@PostMapping("/data-toggle/create") @PostMapping("/data-toggle/create")
@Operation(summary = "数据切换-保存") @Operation(summary = "数据切换-保存")
@Parameter(name = "data", description = "数据", required = true) public CommonResult<String> createDataToggle(@Valid @RequestBody List<DataToggleReqVO> createReqVO) {
public CommonResult<String> createDataToggle(@RequestParam("data") String data) { cockpitMockInfoService.createDataToggle(createReqVO);
return success("success"); return success("success");
} }
} }

View File

@@ -0,0 +1,22 @@
package cn.iocoder.yudao.module.farm.controller.admin.managementcenter.largescreen.foundationinfo.vo;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* @description: TODO
* @author: binda
* @date: 2025/11/20 22:26
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
public class DataToggleReqVO {
private String baseId;
private String flag;
private String type;
private Object data;
}

View File

@@ -0,0 +1,23 @@
package cn.iocoder.yudao.module.farm.controller.admin.managementcenter.largescreen.foundationinfo.vo;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* @description: TODO
* @author: binda
* @date: 2025/11/20 22:26
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
public class DataToggleRespVO {
private String id;
private String baseId;
private String flag;
private String type;
private Object data;
}

View File

@@ -1,12 +1,9 @@
package cn.iocoder.yudao.module.farm.controller.admin.managementcenter.largescreen.screendisasterdata; package cn.iocoder.yudao.module.farm.controller.admin.managementcenter.largescreen.screendisasterdata;
import cn.iocoder.yudao.module.farm.controller.admin.managementcenter.largescreen.screendisasterdata.vo.ScreenDisasterDataPageReqVO; import cn.iocoder.yudao.module.farm.controller.admin.managementcenter.largescreen.screendisasterdata.vo.*;
import cn.iocoder.yudao.module.farm.controller.admin.managementcenter.largescreen.screendisasterdata.vo.ScreenDisasterDataRespVO;
import cn.iocoder.yudao.module.farm.controller.admin.managementcenter.largescreen.screendisasterdata.vo.ScreenDisasterDataSaveReqVO;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
import jakarta.annotation.Resource; import jakarta.annotation.Resource;
import org.springframework.validation.annotation.Validated; import org.springframework.validation.annotation.Validated;
import org.springframework.security.access.prepost.PreAuthorize;
import io.swagger.v3.oas.annotations.tags.Tag; import io.swagger.v3.oas.annotations.tags.Tag;
import io.swagger.v3.oas.annotations.Parameter; import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Operation;
@@ -89,6 +86,14 @@ public class ScreenDisasterDataController {
return success(BeanUtils.toBean(pageResult, ScreenDisasterDataRespVO.class)); return success(BeanUtils.toBean(pageResult, ScreenDisasterDataRespVO.class));
} }
@GetMapping("/statistics")
@Operation(summary = "获得大屏数据-灾害数据统计")
public CommonResult<List<DisasterDataStatisticsInfoV2RespVO>> getScreenDisasterDataStatisticsInfo() {
List<DisasterDataStatisticsInfoV2RespVO> res = screenDisasterDataService.getScreenDisasterDataStatisticsInfo();
return success(res);
}
@GetMapping("/export-excel") @GetMapping("/export-excel")
@Operation(summary = "导出大屏数据-灾害数据 Excel") @Operation(summary = "导出大屏数据-灾害数据 Excel")
// @PreAuthorize("@ss.hasPermission('farm:screen-disaster-data:export')") // @PreAuthorize("@ss.hasPermission('farm:screen-disaster-data:export')")

View File

@@ -0,0 +1,20 @@
package cn.iocoder.yudao.module.farm.controller.admin.managementcenter.largescreen.screendisasterdata.vo;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* @description: TODO
* @author: binda
* @date: 2025/11/21 00:37
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
public class DisasterDataStatisticsInfoRespVO {
private String category; // 灾害类型
private String disasterTime; // 发生月份
private Integer totalCount; // 总发生次数
private Integer year; // 年份
}

View File

@@ -0,0 +1,22 @@
package cn.iocoder.yudao.module.farm.controller.admin.managementcenter.largescreen.screendisasterdata.vo;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.List;
/**
* @description: TODO
* @author: binda
* @date: 2025/11/21 01:03
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
public class DisasterDataStatisticsInfoV2RespVO {
private String category;
private List<DisasterDataStatisticsInfoRespVO> data;
}

View File

@@ -1,108 +0,0 @@
package cn.iocoder.yudao.module.farm.controller.admin.pestdiseaseweedlibrary;
import cn.iocoder.yudao.module.farm.controller.admin.pestdiseaseweedlibrary.vo.PestDiseaseWeedLibraryPageReqVO;
import cn.iocoder.yudao.module.farm.controller.admin.pestdiseaseweedlibrary.vo.PestDiseaseWeedLibraryRespVO;
import cn.iocoder.yudao.module.farm.controller.admin.pestdiseaseweedlibrary.vo.PestDiseaseWeedLibrarySaveReqVO;
import org.springframework.web.bind.annotation.*;
import jakarta.validation.Valid;
import jakarta.validation.Valid;
import jakarta.validation.Valid;
import jakarta.servlet.http.HttpServletResponse;
import java.util.List;
import static cn.iocoder.yudao.framework.apilog.core.enums.OperateTypeEnum.EXPORT;
import jakarta.annotation.Resource;
import org.springframework.validation.annotation.Validated;
import io.swagger.v3.oas.annotations.tags.Tag;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.Operation;
import java.io.IOException;
import cn.iocoder.yudao.framework.common.pojo.PageParam;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.common.pojo.CommonResult;
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils;
import cn.iocoder.yudao.framework.apilog.core.annotation.ApiAccessLog;
import cn.iocoder.yudao.module.farm.dal.dataobject.pestdiseaseweedlibrary.PestDiseaseWeedLibraryDO;
import cn.iocoder.yudao.module.farm.service.pestdiseaseweedlibrary.PestDiseaseWeedLibraryService;
//@Tag(name = "管理后台 - 病虫草害库维护")
//@RestController
//@RequestMapping("/farm/pest-disease-weed-library")
//@Validated
public class PestDiseaseWeedLibraryController {
// @Resource
// private PestDiseaseWeedLibraryService pestDiseaseWeedLibraryService;
//
// @PostMapping("/create")
// @Operation(summary = "创建病虫草害库维护")
//
// public CommonResult<String> createPestDiseaseWeedLibrary(@Valid @RequestBody PestDiseaseWeedLibrarySaveReqVO createReqVO) {
// return success(pestDiseaseWeedLibraryService.createPestDiseaseWeedLibrary(createReqVO));
// }
//
// @PutMapping("/update")
// @Operation(summary = "更新病虫草害库维护")
//
// public CommonResult<Boolean> updatePestDiseaseWeedLibrary(@Valid @RequestBody PestDiseaseWeedLibrarySaveReqVO updateReqVO) {
// pestDiseaseWeedLibraryService.updatePestDiseaseWeedLibrary(updateReqVO);
// return success(true);
// }
//
// @DeleteMapping("/delete")
// @Operation(summary = "删除病虫草害库维护")
// @Parameter(name = "id", description = "编号", required = true)
//
// public CommonResult<Boolean> deletePestDiseaseWeedLibrary(@RequestParam("id") String id) {
// pestDiseaseWeedLibraryService.deletePestDiseaseWeedLibrary(id);
// return success(true);
// }
//
// @DeleteMapping("/delete-list")
// @Parameter(name = "ids", description = "编号", required = true)
// @Operation(summary = "批量删除病虫草害库维护")
//
// public CommonResult<Boolean> deletePestDiseaseWeedLibraryList(@RequestParam("ids") List<String> ids) {
// pestDiseaseWeedLibraryService.deletePestDiseaseWeedLibraryListByIds(ids);
// return success(true);
// }
//
// @GetMapping("/get")
// @Operation(summary = "获得病虫草害库维护")
// @Parameter(name = "id", description = "编号", required = true, example = "1024")
//
// public CommonResult<PestDiseaseWeedLibraryRespVO> getPestDiseaseWeedLibrary(@RequestParam("id") String id) {
// PestDiseaseWeedLibraryDO pestDiseaseWeedLibrary = pestDiseaseWeedLibraryService.getPestDiseaseWeedLibrary(id);
// return success(BeanUtils.toBean(pestDiseaseWeedLibrary, PestDiseaseWeedLibraryRespVO.class));
// }
//
// @GetMapping("/page")
// @Operation(summary = "获得病虫草害库维护分页")
//
// public CommonResult<PageResult<PestDiseaseWeedLibraryRespVO>> getPestDiseaseWeedLibraryPage(@Valid PestDiseaseWeedLibraryPageReqVO pageReqVO) {
// PageResult<PestDiseaseWeedLibraryDO> pageResult = pestDiseaseWeedLibraryService.getPestDiseaseWeedLibraryPage(pageReqVO);
// return success(BeanUtils.toBean(pageResult, PestDiseaseWeedLibraryRespVO.class));
// }
//
// @GetMapping("/export-excel")
// @Operation(summary = "导出病虫草害库维护 Excel")
//
// @ApiAccessLog(operateType = EXPORT)
// public void exportPestDiseaseWeedLibraryExcel(@Valid PestDiseaseWeedLibraryPageReqVO pageReqVO,
// HttpServletResponse response) throws IOException {
// pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE);
// List<PestDiseaseWeedLibraryDO> list = pestDiseaseWeedLibraryService.getPestDiseaseWeedLibraryPage(pageReqVO).getList();
// // 导出 Excel
// ExcelUtils.write(response, "病虫草害库维护.xls", "数据", PestDiseaseWeedLibraryRespVO.class,
// BeanUtils.toBean(list, PestDiseaseWeedLibraryRespVO.class));
// }
}

View File

@@ -1,53 +0,0 @@
package cn.iocoder.yudao.module.farm.controller.admin.pestdiseaseweedlibrary.vo;
import lombok.*;
import io.swagger.v3.oas.annotations.media.Schema;
import cn.iocoder.yudao.framework.common.pojo.PageParam;
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
public class PestDiseaseWeedLibraryPageReqVO extends PageParam {
@Schema(description = "灾害类型", example = "2")
private Integer type;
@Schema(description = "灾害名称", example = "李四")
private String name;
@Schema(description = "灾害描述", example = "你说的对")
private String description;
@Schema(description = "防治建议")
private String propose;
@Schema(description = "图片")
private String images;
@Schema(description = "0=启用,1=停用", example = "1")
private Integer useStatus;
@Schema(description = "创建时间")
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
private LocalDateTime[] createTime;
@Schema(description = "基地id", example = "427")
private String baseId;
@Schema(description = "基地", example = "王五")
private String baseName;
@Schema(description = "地块ID", example = "27747")
private String plotId;
@Schema(description = "地块", example = "芋艿")
private String plotName;
@Schema(description = "租户id", example = "27978")
private String tenantId;
}

View File

@@ -1,64 +0,0 @@
package cn.iocoder.yudao.module.farm.controller.admin.pestdiseaseweedlibrary.vo;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.*;
import org.springframework.format.annotation.DateTimeFormat;
import java.time.LocalDateTime;
import cn.idev.excel.annotation.*;
@Schema(description = "管理后台 - 病虫草害库维护 Response VO")
@Data
@ExcelIgnoreUnannotated
public class PestDiseaseWeedLibraryRespVO {
@Schema(description = "基础id", requiredMode = Schema.RequiredMode.REQUIRED, example = "521")
@ExcelProperty("基础id")
private String id;
@Schema(description = "灾害类型", example = "2")
@ExcelProperty("灾害类型")
private Integer type;
@Schema(description = "灾害名称", example = "李四")
@ExcelProperty("灾害名称")
private String name;
@Schema(description = "灾害描述", example = "你说的对")
@ExcelProperty("灾害描述")
private String description;
@Schema(description = "防治建议")
@ExcelProperty("防治建议")
private String propose;
@Schema(description = "图片")
@ExcelProperty("图片")
private String images;
@Schema(description = "0=启用,1=停用", example = "1")
@ExcelProperty("0=启用,1=停用")
private Integer useStatus;
@Schema(description = "创建时间")
@ExcelProperty("创建时间")
private LocalDateTime createTime;
@Schema(description = "基地id", example = "427")
@ExcelProperty("基地id")
private String baseId;
@Schema(description = "基地", example = "王五")
@ExcelProperty("基地")
private String baseName;
@Schema(description = "地块ID", example = "27747")
@ExcelProperty("地块ID")
private String plotId;
@Schema(description = "地块", example = "芋艿")
@ExcelProperty("地块")
private String plotName;
@Schema(description = "租户id")
private String tenantId;
}

View File

@@ -1,46 +0,0 @@
package cn.iocoder.yudao.module.farm.controller.admin.pestdiseaseweedlibrary.vo;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.*;
@Schema(description = "管理后台 - 病虫草害库维护新增/修改 Request VO")
@Data
public class PestDiseaseWeedLibrarySaveReqVO {
@Schema(description = "基础id", requiredMode = Schema.RequiredMode.REQUIRED, example = "521")
private String id;
@Schema(description = "灾害类型", example = "2")
private Integer type;
@Schema(description = "灾害名称", example = "李四")
private String name;
@Schema(description = "灾害描述", example = "你说的对")
private String description;
@Schema(description = "防治建议")
private String propose;
@Schema(description = "图片")
private String images;
@Schema(description = "0=启用,1=停用", example = "1")
private Integer useStatus;
@Schema(description = "基地id", example = "427")
private String baseId;
@Schema(description = "基地", example = "王五")
private String baseName;
@Schema(description = "地块ID", example = "27747")
private String plotId;
@Schema(description = "地块", example = "芋艿")
private String plotName;
@Schema(description = "租户id", example = "27978")
private String tenantId;
}

View File

@@ -0,0 +1,69 @@
package cn.iocoder.yudao.module.farm.dal.dataobject.foundationinfo;
import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableName;
import com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler;
import lombok.*;
/**
* @description: 驾驶舱模拟数据
* @author: binda
* @date: 2025/11/20 22:50
*/
@TableName("farm_cockpit_mock_info")
@Data
@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class CockpitMockInfoDO extends BaseDO {
/**
* 基础id
*/
private String id;
/**
* 数据维护开关 (1: 开; 0: 关;)
*/
private String flag;
/**
* 数据类型
*/
private String type;
/**
* mock数据
*/
@TableField(typeHandler = JacksonTypeHandler.class)
private String jsonData;
/**
* 基地id
*/
private String baseId;
/**
* 基地
*/
private String baseName;
/**
* 地块ID
*/
private String plotId;
/**
* 地块
*/
private String plotName;
/**
* 租户id
*/
private String tenantId;
}

View File

@@ -1,99 +0,0 @@
package cn.iocoder.yudao.module.farm.dal.dataobject.pestdiseaseweedlibrary;
import lombok.*;
import java.time.LocalDateTime;
import java.time.LocalDateTime;
import java.util.List;
import com.baomidou.mybatisplus.annotation.*;
import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
import cn.iocoder.yudao.module.farm.framework.util.ImageCollectionUtil;
/**
* 病虫草害库维护 DO
*
* @author 芋道源码
*/
@TableName("farm_pest_disease_weed_library")
@KeySequence("farm_pest_disease_weed_library_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。
@Data
@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class PestDiseaseWeedLibraryDO extends BaseDO {
/**
* 基础id
*/
@TableId(type = IdType.INPUT)
private String id;
/**
* 灾害类型
*/
private Integer type;
/**
* 灾害名称
*/
private String name;
/**
* 灾害描述
*/
private String description;
/**
* 防治建议
*/
private String propose;
/**
* 图片(数据库存储为逗号分隔的字符串)
*/
@TableField(value = "images")
private String images;
/**
* 图片集合(业务层使用)
*/
@TableField(exist = false)
private List<String> imageList;
/**
* 0=启用,1=停用
*/
private Integer useStatus;
/**
* 基地id
*/
private String baseId;
/**
* 基地
*/
private String baseName;
/**
* 地块ID
*/
private String plotId;
/**
* 地块
*/
private String plotName;
private String tenantId;
/**
* 获取图片集合
*/
public List<String> getImageList() {
if (imageList == null) {
imageList = ImageCollectionUtil.toImageList(this.images);
}
return imageList;
}
/**
* 设置图片集合
*/
public void setImageList(List<String> imageList) {
this.imageList = imageList;
this.images = ImageCollectionUtil.toDatabaseString(imageList);
}
}

View File

@@ -0,0 +1,17 @@
package cn.iocoder.yudao.module.farm.dal.mysql.foundationinfo;
import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
import cn.iocoder.yudao.module.farm.dal.dataobject.foundationinfo.CockpitMockInfoDO;
import org.apache.ibatis.annotations.Mapper;
/**
* @description:
* @author: binda
* @date: 2025/11/20 22:53
*/
@Mapper
public interface CockpitMockInfoMapper extends BaseMapperX<CockpitMockInfoDO> {
}

View File

@@ -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.common.pojo.PageResult;
import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX; 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.controller.admin.managementcenter.messagecenter.vo.MessageCenterPageReqVO;
import cn.iocoder.yudao.module.farm.dal.dataobject.messagecenter.MessageCenterDO; import cn.iocoder.yudao.module.farm.dal.dataobject.messagecenter.MessageCenterDO;
import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Mapper;
@@ -83,4 +84,5 @@ public interface MessageCenterMapper extends BaseMapperX<MessageCenterDO> {
@Param("startTime") String startTime, @Param("startTime") String startTime,
@Param("endTime") String endTime); @Param("endTime") String endTime);
VariousIndexesRespVO getVariousIndexes(String baseId);
} }

View File

@@ -1,35 +0,0 @@
package cn.iocoder.yudao.module.farm.dal.mysql.pestdiseaseweedlibrary;
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.pestdiseaseweedlibrary.vo.PestDiseaseWeedLibraryPageReqVO;
import cn.iocoder.yudao.module.farm.dal.dataobject.pestdiseaseweedlibrary.PestDiseaseWeedLibraryDO;
import org.apache.ibatis.annotations.Mapper;
/**
* 病虫草害库维护 Mapper
*
* @author 芋道源码
*/
@Mapper
public interface PestDiseaseWeedLibraryMapper extends BaseMapperX<PestDiseaseWeedLibraryDO> {
default PageResult<PestDiseaseWeedLibraryDO> selectPage(PestDiseaseWeedLibraryPageReqVO reqVO) {
return selectPage(reqVO, new LambdaQueryWrapperX<PestDiseaseWeedLibraryDO>()
.eqIfPresent(PestDiseaseWeedLibraryDO::getType, reqVO.getType())
.likeIfPresent(PestDiseaseWeedLibraryDO::getName, reqVO.getName())
.eqIfPresent(PestDiseaseWeedLibraryDO::getDescription, reqVO.getDescription())
.eqIfPresent(PestDiseaseWeedLibraryDO::getPropose, reqVO.getPropose())
.eqIfPresent(PestDiseaseWeedLibraryDO::getImages, reqVO.getImages())
.eqIfPresent(PestDiseaseWeedLibraryDO::getUseStatus, reqVO.getUseStatus())
.betweenIfPresent(PestDiseaseWeedLibraryDO::getCreateTime, reqVO.getCreateTime())
.eqIfPresent(PestDiseaseWeedLibraryDO::getBaseId, reqVO.getBaseId())
.likeIfPresent(PestDiseaseWeedLibraryDO::getBaseName, reqVO.getBaseName())
.eqIfPresent(PestDiseaseWeedLibraryDO::getPlotId, reqVO.getPlotId())
.likeIfPresent(PestDiseaseWeedLibraryDO::getPlotName, reqVO.getPlotName())
.eqIfPresent(PestDiseaseWeedLibraryDO::getTenantId, reqVO.getTenantId())
.orderByDesc(PestDiseaseWeedLibraryDO::getCreateTime));
}
}

View File

@@ -5,6 +5,7 @@ import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
import cn.iocoder.yudao.module.farm.controller.admin.api.vo.DisasterAnalysisReqVO; import cn.iocoder.yudao.module.farm.controller.admin.api.vo.DisasterAnalysisReqVO;
import cn.iocoder.yudao.module.farm.controller.admin.api.vo.DisasterAnalysisRespVO; import cn.iocoder.yudao.module.farm.controller.admin.api.vo.DisasterAnalysisRespVO;
import cn.iocoder.yudao.module.farm.controller.admin.managementcenter.largescreen.screendisasterdata.vo.DisasterDataStatisticsInfoRespVO;
import cn.iocoder.yudao.module.farm.controller.admin.managementcenter.largescreen.screendisasterdata.vo.ScreenDisasterDataPageReqVO; import cn.iocoder.yudao.module.farm.controller.admin.managementcenter.largescreen.screendisasterdata.vo.ScreenDisasterDataPageReqVO;
import cn.iocoder.yudao.module.farm.dal.dataobject.screendisasterdata.ScreenDisasterDataDO; import cn.iocoder.yudao.module.farm.dal.dataobject.screendisasterdata.ScreenDisasterDataDO;
import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Mapper;
@@ -34,4 +35,6 @@ public interface ScreenDisasterDataMapper extends BaseMapperX<ScreenDisasterData
} }
List<DisasterAnalysisRespVO> countDisasterAnalysis(DisasterAnalysisReqVO req); List<DisasterAnalysisRespVO> countDisasterAnalysis(DisasterAnalysisReqVO req);
List<DisasterDataStatisticsInfoRespVO> getScreenDisasterDataStatisticsInfo();
} }

View File

@@ -86,6 +86,20 @@ public interface BaseInfoService {
*/ */
TenantInfoRespVO getBaseOverviewInfo(); TenantInfoRespVO getBaseOverviewInfo();
/**
* 基地概述详情
* @param baseId
* @return
*/
BaseInfoRespVO.BaseInfo getBaseOverviewDetails(String baseId);
/**
* 地块详情
* @param plotId
* @return
*/
BaseInfoRespVO.PlotInfo getPlotDetails(String plotId);
/** /**
* 获取网箱信息 * 获取网箱信息
* @param plotId * @param plotId
@@ -132,4 +146,5 @@ public interface BaseInfoService {
* @return * @return
*/ */
BaseCountInfoRespVO countBaseInfo(String tenantId); BaseCountInfoRespVO countBaseInfo(String tenantId);
} }

View File

@@ -120,11 +120,6 @@ public class BaseInfoServiceImpl implements BaseInfoService {
if (flag2) { if (flag2) {
throw exception(PLOT_AREA_EXISTS_ERRORS); 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); baseInfoMapper.deleteById(id);
plotInfoService.deleteByBaseId(id); plotInfoService.deleteByBaseId(id);
@@ -234,12 +229,46 @@ public class BaseInfoServiceImpl implements BaseInfoService {
List<BaseInfoRespVO> baseList = BeanUtils.toBean(pageResult, BaseInfoRespVO.class); List<BaseInfoRespVO> baseList = BeanUtils.toBean(pageResult, BaseInfoRespVO.class);
this.packageBaseInfo(tenantId, baseList, employeeMap); this.packageBaseInfo(tenantId, baseList, employeeMap);
// 基地面积 取整
baseList.forEach(e -> e.setArea(BigDecimalUtil.roundedViaMath(e.getArea())));
return new TenantInfoRespVO(tenantInfo, baseList); return new TenantInfoRespVO(tenantInfo, baseList);
} }
@Override
public BaseInfoRespVO.BaseInfo getBaseOverviewDetails(String baseId) {
BaseInfoDO bObj = baseInfoMapper.selectOne("id", baseId);
List<PlotInfoDO> plotList = plotInfoService.getPlotInfos(baseId);
return this.packageBaseOverview(
getLoginUser().getTenantId(),
baseId, bObj.getName(),
bObj.getArea(),
plotList.size());
}
@Override
public BaseInfoRespVO.PlotInfo getPlotDetails(String plotId) {
Map<String, String> employeeMap = adminUserService.getIdAndNickNameMap();
PlotInfoDO aDo = plotInfoService.getPlotInfo(plotId);
// 户主
List<PlotLesseeDetailsRespVO> 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 @Override
public List<ProductionPlanGridRespVO> getGridInfo(String plotId) { public List<ProductionPlanGridRespVO> getGridInfo(String plotId) {
String plotCode = plotId; String plotCode = plotId;
@@ -434,29 +463,28 @@ public class BaseInfoServiceImpl implements BaseInfoService {
private void packageBaseInfo(long tenantId, List<BaseInfoRespVO> respVOS, Map<String, String> employeeMap) { private void packageBaseInfo(long tenantId, List<BaseInfoRespVO> respVOS, Map<String, String> employeeMap) {
for (BaseInfoRespVO obj : respVOS) { for (BaseInfoRespVO obj : respVOS) {
obj.setArea(BigDecimalUtil.roundedViaMath(obj.getArea()));
String baseId = obj.getId(); String baseId = obj.getId();
String baseName = obj.getName(); String baseName = obj.getName();
BigDecimal baseArea = BigDecimalUtil.roundedViaMath(obj.getArea());
List<PlotInfoDO> plotList = plotInfoService.getPlotInfos(baseId); List<PlotInfoDO> plotList = plotInfoService.getPlotInfos(baseId);
// 基地概述 // 基地概述
BaseInfoRespVO.BaseInfo baseOverview = this.packageBaseOverview(tenantId, baseId, baseName, baseArea, plotList); // BaseInfoRespVO.BaseInfo baseOverview = this.packageBaseOverview(tenantId, baseId, baseName, baseArea, plotList.size());
obj.setBaseOverview(baseOverview); // obj.setBaseOverview(baseOverview);
// 地块集合 // 地块集合
List<BaseInfoRespVO.PlotInfo> targetList = this.packagePlotInfo(employeeMap, plotList); List<BaseInfoRespVO.PlotInfo> targetList = this.packagePlotInfo(employeeMap, plotList);
obj.setPlotOverviewList(targetList); obj.setPlotOverviewList(targetList);
} }
} }
private BaseInfoRespVO.BaseInfo packageBaseOverview(long tenantId, String baseId, String baseName, BigDecimal baseArea, List<PlotInfoDO> plotList) { private BaseInfoRespVO.BaseInfo packageBaseOverview(long tenantId, String baseId, String baseName, BigDecimal baseArea, int plotTotalCount) {
// 在种作物数量 // 在种作物数量
Integer cropCount = speciesLibraryMapper.getSpeciesCount(tenantId, baseId); Integer cropCount = speciesLibraryMapper.getSpeciesCount(tenantId, baseId);
// 在种地块占比 // 在种地块占比
double plotRatio = 0.00; double plotRatio = 0.00;
// 在种地块数量 // 在种地块数量
int plotCount = productionPlanService.getGrowingPlotCount(baseId); int plotCount = productionPlanService.getGrowingPlotCount(baseId);
// 地块总数
int plotTotalCount = plotList.size();
if (plotTotalCount > 0) { if (plotTotalCount > 0) {
plotRatio = Math.round((plotCount * 10000.0) / plotTotalCount) / 100.0; plotRatio = Math.round((plotCount * 10000.0) / plotTotalCount) / 100.0;
} }
@@ -464,29 +492,21 @@ public class BaseInfoServiceImpl implements BaseInfoService {
} }
private List<BaseInfoRespVO.PlotInfo> packagePlotInfo(Map<String, String> employeeMap, List<PlotInfoDO> plotList) { private List<BaseInfoRespVO.PlotInfo> packagePlotInfo(Map<String, String> employeeMap, List<PlotInfoDO> plotList) {
List<BaseInfoRespVO.PlotInfo> targetList = new ArrayList<>(); return plotList.stream().map(aDo ->
for (PlotInfoDO aDo : plotList) { new BaseInfoRespVO.PlotInfo(
// 网箱
// List<ProductionPlanGridRespVO> gridInfos = this.packageGridInfo(aDo.getPlotId());
List<ProductionPlanGridRespVO> gridInfos = Collections.EMPTY_LIST;
// 户主
List<PlotLesseeDetailsRespVO> lesseeList = plotLesseeService.getPlotLesseeList(aDo.getId());
String plotManager = employeeMap.getOrDefault(aDo.getEmployeeId(), "系统");
BaseInfoRespVO.PlotInfo target = new BaseInfoRespVO.PlotInfo(
aDo.getId(), aDo.getId(),
aDo.getPlotName(), aDo.getPlotName(),
aDo.getPlotColor(), aDo.getPlotColor(),
BigDecimalUtil.roundedViaMath( aDo.getPlotArea()), BigDecimalUtil.roundedViaMath(aDo.getPlotArea()),
plotManager, "",
aDo.getPoint(), aDo.getPoint(),
aDo.getPlotLeaseStatus(), aDo.getPlotLeaseStatus(),
LEASE_STATUS_MAP.get(aDo.getPlotLeaseStatus()), "",
// LEASE_STATUS_MAP.get(aDo.getPlotLeaseStatus()),
aDo.getGridNumber(), aDo.getGridNumber(),
gridInfos, Collections.EMPTY_LIST,
lesseeList); Collections.EMPTY_LIST)
targetList.add(target); ).toList();
}
return targetList;
} }
private List<ProductionPlanGridRespVO> packageGridInfo(String plotId) { private List<ProductionPlanGridRespVO> packageGridInfo(String plotId) {

View File

@@ -70,7 +70,10 @@ public interface DeviceClassifyService {
Map<String, String> getTypeNameMap(); Map<String, String> getTypeNameMap();
Map<String, String> getTypeCodeMap(); Map<String, String> getTypeCodeMap();
Map<String, String> getImageMap();
Map<String, String> getTypeNameMap(String tenantId); Map<String, String> getTypeNameMap(String tenantId);
Map<String, String> getTypeCodeMap(String tenantId); Map<String, String> getTypeCodeMap(String tenantId);
} }

View File

@@ -234,6 +234,18 @@ public class DeviceClassifyServiceImpl implements DeviceClassifyService {
return typeCodeMap; return typeCodeMap;
} }
@Override
public Map<String, String> getImageMap() {
LambdaQueryWrapperX<DeviceClassifyDO> x = new LambdaQueryWrapperX<>();
x.eq(DeviceClassifyDO::getTenantId, getLoginUser().getTenantId());
List<DeviceClassifyDO> deviceClassifyDOS = deviceClassifyMapper.selectList(x);
Map<String, String> imageMap = deviceClassifyDOS.stream().filter(device -> device.getParentId() != null && device.getParentId() != 0)
.collect(Collectors.toMap(e -> e.getParentId().toString(), DeviceClassifyDO::getImage));
return imageMap;
}
public Map<String, String> getTypeNameMap(String tenantId) { public Map<String, String> getTypeNameMap(String tenantId) {
LambdaQueryWrapperX<DeviceClassifyDO> x = new LambdaQueryWrapperX<>(); LambdaQueryWrapperX<DeviceClassifyDO> x = new LambdaQueryWrapperX<>();
x.eq(DeviceClassifyDO::getTenantId, tenantId); x.eq(DeviceClassifyDO::getTenantId, tenantId);
@@ -254,4 +266,5 @@ public class DeviceClassifyServiceImpl implements DeviceClassifyService {
return typeCodeMap; return typeCodeMap;
} }
} }

View File

@@ -275,17 +275,17 @@ public class DeviceInfoServiceImpl implements DeviceInfoService {
@Override @Override
public PageResult<DeviceInfoDO> getDeviceInfoPage(DeviceInfoPageReqVO pageReqVO) { public PageResult<DeviceInfoDO> getDeviceInfoPage(DeviceInfoPageReqVO pageReqVO) {
PageResult<DeviceInfoDO> pageResult = deviceInfoMapper.selectPage(pageReqVO); PageResult<DeviceInfoDO> pageResult = deviceInfoMapper.selectPage(pageReqVO);
if (pageResult.getList() != null) { // if (pageResult.getList() != null) {
// 触发图片集合转换,确保分页结果中的每个DO对象都包含转换后的图片集合 // // 触发图片集合转换,确保分页结果中的每个DO对象都包含转换后的图片集合
for (DeviceInfoDO d : pageResult.getList()) { // for (DeviceInfoDO d : pageResult.getList()) {
if (d == null) { // if (d == null) {
continue; // continue;
} // }
DeviceClassifyDO dc = deviceClassifyMapper.selectOne(DeviceClassifyDO::getId, d.getDeviceType()); // DeviceClassifyDO dc = deviceClassifyMapper.selectOne(DeviceClassifyDO::getId, d.getDeviceType());
d.setImage(dc.getImage()); // d.setImage(dc.getImage());
d.setImageList(dc.getImageList()); //// d.setImageList(dc.getImageList());
} // }
} // }
return pageResult; return pageResult;
} }

View File

@@ -0,0 +1,19 @@
package cn.iocoder.yudao.module.farm.service.foundationinfo;
import cn.iocoder.yudao.module.farm.controller.admin.managementcenter.largescreen.foundationinfo.vo.DataToggleReqVO;
import cn.iocoder.yudao.module.farm.controller.admin.managementcenter.largescreen.foundationinfo.vo.DataToggleRespVO;
import java.util.List;
/**
* @description:
* @author: binda
* @date: 2025/11/20 22:56
*/
public interface CockpitMockInfoService {
void createDataToggle(List<DataToggleReqVO> createReqVO);
List<DataToggleRespVO> getDataToggle(String baseId);
}

View File

@@ -0,0 +1,109 @@
package cn.iocoder.yudao.module.farm.service.foundationinfo;
import cn.hutool.core.util.IdUtil;
import cn.hutool.json.JSONUtil;
import cn.idev.excel.util.StringUtils;
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
import cn.iocoder.yudao.module.farm.controller.admin.managementcenter.largescreen.foundationinfo.vo.DataToggleReqVO;
import cn.iocoder.yudao.module.farm.controller.admin.managementcenter.largescreen.foundationinfo.vo.DataToggleRespVO;
import cn.iocoder.yudao.module.farm.dal.dataobject.foundationinfo.CockpitMockInfoDO;
import cn.iocoder.yudao.module.farm.dal.mysql.foundationinfo.CockpitMockInfoMapper;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
import jakarta.annotation.Resource;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.ArrayList;
import java.util.List;
import java.util.Set;
import java.util.stream.Collectors;
/**
* @description: TODO
* @author: binda
* @date: 2025/11/20 22:57
*/
@Service
public class CockpitMockInfoServiceImpl implements CockpitMockInfoService {
@Resource
private CockpitMockInfoMapper cockpitMockInfoMapper;
@Override
@Transactional(rollbackFor = Exception.class)
public void createDataToggle(List<DataToggleReqVO> createReqVO) {
if (CollectionUtils.isEmpty(createReqVO)) {
return;
}
// 1. 处理 baseId 为 null 的情况,设置为 "0"
for (DataToggleReqVO vo : createReqVO) {
if (vo.getBaseId() == null) {
vo.setBaseId("0");
}
}
// 2. 获取所有需要处理的 baseId(包括全局数据 baseId=0)
Set<String> baseIds = createReqVO.stream()
.map(DataToggleReqVO::getBaseId)
.collect(Collectors.toSet());
// 3. 删除这些 baseId 对应的所有现有数据
if (!baseIds.isEmpty()) {
cockpitMockInfoMapper.delete(new LambdaQueryWrapper<CockpitMockInfoDO>()
.in(CockpitMockInfoDO::getBaseId, baseIds));
}
// 4. 保存新的数据
List<CockpitMockInfoDO> saveList = new ArrayList<>();
for (DataToggleReqVO vo : createReqVO) {
CockpitMockInfoDO entity = new CockpitMockInfoDO();
entity.setId(IdUtil.fastUUID());
entity.setBaseId(vo.getBaseId());
entity.setFlag(vo.getFlag());
entity.setType(vo.getType());
// 将 data 对象转换为 JSON 字符串
if (vo.getData() != null) {
entity.setJsonData(JSONUtil.toJsonStr(vo.getData()));
}
saveList.add(entity);
}
// 5. 批量插入新数据
if (!saveList.isEmpty()) {
cockpitMockInfoMapper.insertBatch(saveList);
}
}
@Override
public List<DataToggleRespVO> getDataToggle(String baseId) {
// 查询数据库记录
List<CockpitMockInfoDO> entityList = cockpitMockInfoMapper.selectList(
new LambdaQueryWrapper<CockpitMockInfoDO>()
.eq(CockpitMockInfoDO::getBaseId, baseId)
);
// 转换为响应VO
List<DataToggleRespVO> result = new ArrayList<>();
for (CockpitMockInfoDO entity : entityList) {
DataToggleRespVO vo = BeanUtils.toBean(entity, DataToggleRespVO.class);
// 特殊处理 jsonData 到 data 的转换
if (StringUtils.isNotBlank(entity.getJsonData())) {
try {
Object data = JSONUtil.parse(entity.getJsonData());
vo.setData(data);
} catch (Exception e) {
vo.setData(entity.getJsonData());
}
}
result.add(vo);
}
return result;
}
}

View File

@@ -7,6 +7,7 @@ import cn.iocoder.yudao.framework.security.core.LoginUser;
import cn.iocoder.yudao.module.farm.controller.admin.managementcenter.largescreen.foundationinfo.vo.FoundationInfoPageReqVO; import cn.iocoder.yudao.module.farm.controller.admin.managementcenter.largescreen.foundationinfo.vo.FoundationInfoPageReqVO;
import cn.iocoder.yudao.module.farm.controller.admin.managementcenter.largescreen.foundationinfo.vo.FoundationInfoSaveReqVO; import cn.iocoder.yudao.module.farm.controller.admin.managementcenter.largescreen.foundationinfo.vo.FoundationInfoSaveReqVO;
import cn.iocoder.yudao.module.farm.dal.dataobject.foundationinfo.FoundationInfoDO; import cn.iocoder.yudao.module.farm.dal.dataobject.foundationinfo.FoundationInfoDO;
import cn.iocoder.yudao.module.farm.dal.mysql.foundationinfo.CockpitMockInfoMapper;
import cn.iocoder.yudao.module.farm.dal.mysql.foundationinfo.FoundationInfoMapper; import cn.iocoder.yudao.module.farm.dal.mysql.foundationinfo.FoundationInfoMapper;
import jakarta.annotation.Resource; import jakarta.annotation.Resource;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
@@ -29,6 +30,8 @@ public class FoundationInfoServiceImpl implements FoundationInfoService {
@Resource @Resource
private FoundationInfoMapper foundationInfoMapper; private FoundationInfoMapper foundationInfoMapper;
@Resource
private CockpitMockInfoMapper cockpitMockMapper;
@Override @Override
public String createFoundationInfo(FoundationInfoSaveReqVO createReqVO) { public String createFoundationInfo(FoundationInfoSaveReqVO createReqVO) {

View File

@@ -369,7 +369,7 @@ public class HomeServiceImpl implements HomeService {
int progressBarDenominator = modelManagementService.getFarmRecordCount(e.getSpeciesModelId()); int progressBarDenominator = modelManagementService.getFarmRecordCount(e.getSpeciesModelId());
// 任务进度 // 任务进度
String progressBar = progressBarNumerator +"/"+progressBarDenominator; String progressBar = progressBarNumerator +"/"+progressBarDenominator;
Integer predictedGridNumber = e.getPredictedGridNumber();
PlanInfo target = new PlanInfo(); PlanInfo target = new PlanInfo();
target.setBaseId(e.getBaseId()); target.setBaseId(e.getBaseId());
@@ -383,7 +383,8 @@ public class HomeServiceImpl implements HomeService {
target.setProgressBar(progressBar); target.setProgressBar(progressBar);
target.setProgressBarNumerator(progressBarNumerator); target.setProgressBarNumerator(progressBarNumerator);
target.setProgressBarDenominator(progressBarDenominator); target.setProgressBarDenominator(progressBarDenominator);
target.setPredictedArea(Double.valueOf(beingPlotArea)); target.setPredictedArea(beingPlotArea);
target.setPredictedGridNumber(predictedGridNumber);
target.setPredictedYields(e.getPredictedYields()); target.setPredictedYields(e.getPredictedYields());
target.setPlanStatus(e.getPlanStatus()); target.setPlanStatus(e.getPlanStatus());
target.setPlanStatusName(PLAN_MAP.getOrDefault(e.getPlanStatus(),"未开始")); target.setPlanStatusName(PLAN_MAP.getOrDefault(e.getPlanStatus(),"未开始"));

View File

@@ -1,6 +1,7 @@
package cn.iocoder.yudao.module.farm.service.messagecenter; package cn.iocoder.yudao.module.farm.service.messagecenter;
import cn.iocoder.yudao.framework.common.pojo.PageResult; 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.MessageCenterPageReqVO;
import cn.iocoder.yudao.module.farm.controller.admin.managementcenter.messagecenter.vo.MessageCenterSaveReqVO; import cn.iocoder.yudao.module.farm.controller.admin.managementcenter.messagecenter.vo.MessageCenterSaveReqVO;
import cn.iocoder.yudao.module.farm.controller.admin.managementcenter.messagecenter.vo.MessageStatisticsRespVO; import cn.iocoder.yudao.module.farm.controller.admin.managementcenter.messagecenter.vo.MessageStatisticsRespVO;
@@ -77,4 +78,11 @@ public interface MessageCenterService {
* @param messageType * @param messageType
*/ */
void pushMessage(String title, String content, Integer messageType); void pushMessage(String title, String content, Integer messageType);
/**
* 预警统计
* @param baseId
* @return
*/
VariousIndexesRespVO getVariousIndexes(String baseId);
} }

View File

@@ -4,6 +4,7 @@ import cn.hutool.core.util.IdUtil;
import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.common.util.object.BeanUtils; import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
import cn.iocoder.yudao.framework.security.core.LoginUser; 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.MessageCenterPageReqVO;
import cn.iocoder.yudao.module.farm.controller.admin.managementcenter.messagecenter.vo.MessageCenterSaveReqVO; import cn.iocoder.yudao.module.farm.controller.admin.managementcenter.messagecenter.vo.MessageCenterSaveReqVO;
import cn.iocoder.yudao.module.farm.controller.admin.managementcenter.messagecenter.vo.MessageStatisticsRespVO; import cn.iocoder.yudao.module.farm.controller.admin.managementcenter.messagecenter.vo.MessageStatisticsRespVO;
@@ -146,4 +147,10 @@ public class MessageCenterServiceImpl implements MessageCenterService {
this.createMessageCenter(m); this.createMessageCenter(m);
} }
@Override
public VariousIndexesRespVO getVariousIndexes(String baseId) {
VariousIndexesRespVO res = messageCenterMapper.getVariousIndexes(baseId);
return res;
}
} }

View File

@@ -1,64 +0,0 @@
package cn.iocoder.yudao.module.farm.service.pestdiseaseweedlibrary;
import cn.iocoder.yudao.module.farm.controller.admin.pestdiseaseweedlibrary.vo.PestDiseaseWeedLibraryPageReqVO;
import cn.iocoder.yudao.module.farm.controller.admin.pestdiseaseweedlibrary.vo.PestDiseaseWeedLibrarySaveReqVO;
import cn.iocoder.yudao.module.farm.dal.dataobject.pestdiseaseweedlibrary.PestDiseaseWeedLibraryDO;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.common.pojo.PageParam;
import jakarta.validation.Valid;
import java.util.List;
/**
* 病虫草害库维护 Service 接口
*
* @author 芋道源码
*/
public interface PestDiseaseWeedLibraryService {
/**
* 创建病虫草害库维护
*
* @param createReqVO 创建信息
* @return 编号
*/
String createPestDiseaseWeedLibrary(@Valid PestDiseaseWeedLibrarySaveReqVO createReqVO);
/**
* 更新病虫草害库维护
*
* @param updateReqVO 更新信息
*/
void updatePestDiseaseWeedLibrary(@Valid PestDiseaseWeedLibrarySaveReqVO updateReqVO);
/**
* 删除病虫草害库维护
*
* @param id 编号
*/
void deletePestDiseaseWeedLibrary(String id);
/**
* 批量删除病虫草害库维护
*
* @param ids 编号
*/
void deletePestDiseaseWeedLibraryListByIds(List<String> ids);
/**
* 获得病虫草害库维护
*
* @param id 编号
* @return 病虫草害库维护
*/
PestDiseaseWeedLibraryDO getPestDiseaseWeedLibrary(String id);
/**
* 获得病虫草害库维护分页
*
* @param pageReqVO 分页查询
* @return 病虫草害库维护分页
*/
PageResult<PestDiseaseWeedLibraryDO> getPestDiseaseWeedLibraryPage(PestDiseaseWeedLibraryPageReqVO pageReqVO);
}

View File

@@ -1,106 +0,0 @@
package cn.iocoder.yudao.module.farm.service.pestdiseaseweedlibrary;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.util.IdUtil;
import cn.iocoder.yudao.module.farm.controller.admin.pestdiseaseweedlibrary.vo.PestDiseaseWeedLibraryPageReqVO;
import cn.iocoder.yudao.module.farm.controller.admin.pestdiseaseweedlibrary.vo.PestDiseaseWeedLibrarySaveReqVO;
import org.springframework.stereotype.Service;
import jakarta.annotation.Resource;
import org.springframework.validation.annotation.Validated;
import org.springframework.transaction.annotation.Transactional;
import cn.iocoder.yudao.module.farm.dal.dataobject.pestdiseaseweedlibrary.PestDiseaseWeedLibraryDO;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.common.pojo.PageParam;
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
import cn.iocoder.yudao.framework.security.core.LoginUser;
import cn.iocoder.yudao.module.farm.dal.mysql.pestdiseaseweedlibrary.PestDiseaseWeedLibraryMapper;
import java.util.List;
import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertList;
import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.diffList;
import static cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils.getLoginUser;
import static cn.iocoder.yudao.module.farm.enums.ErrorCodeConstants.PEST_DISEASE_WEED_LIBRARY_NOT_EXISTS;
/**
* 病虫草害库维护 Service 实现类
*
* @author 芋道源码
*/
@Service
@Validated
public class PestDiseaseWeedLibraryServiceImpl implements PestDiseaseWeedLibraryService {
@Resource
private PestDiseaseWeedLibraryMapper pestDiseaseWeedLibraryMapper;
@Override
public String createPestDiseaseWeedLibrary(PestDiseaseWeedLibrarySaveReqVO createReqVO) {
LoginUser user = getLoginUser();
// 插入
PestDiseaseWeedLibraryDO pestDiseaseWeedLibrary = BeanUtils.toBean(createReqVO, PestDiseaseWeedLibraryDO.class);
pestDiseaseWeedLibrary.setId(IdUtil.fastUUID());
pestDiseaseWeedLibrary.setTenantId(String.valueOf(user.getTenantId()));
pestDiseaseWeedLibraryMapper.insert(pestDiseaseWeedLibrary);
// 返回
return pestDiseaseWeedLibrary.getId();
}
@Override
public void updatePestDiseaseWeedLibrary(PestDiseaseWeedLibrarySaveReqVO updateReqVO) {
// 校验存在
validatePestDiseaseWeedLibraryExists(updateReqVO.getId());
// 更新
PestDiseaseWeedLibraryDO updateObj = BeanUtils.toBean(updateReqVO, PestDiseaseWeedLibraryDO.class);
pestDiseaseWeedLibraryMapper.updateById(updateObj);
}
@Override
public void deletePestDiseaseWeedLibrary(String id) {
// 校验存在
validatePestDiseaseWeedLibraryExists(id);
// 删除
pestDiseaseWeedLibraryMapper.deleteById(id);
}
@Override
public void deletePestDiseaseWeedLibraryListByIds(List<String> ids) {
// 删除
pestDiseaseWeedLibraryMapper.deleteByIds(ids);
}
private void validatePestDiseaseWeedLibraryExists(String id) {
if (pestDiseaseWeedLibraryMapper.selectById(id) == null) {
throw exception(PEST_DISEASE_WEED_LIBRARY_NOT_EXISTS);
}
}
@Override
public PestDiseaseWeedLibraryDO getPestDiseaseWeedLibrary(String id) {
PestDiseaseWeedLibraryDO pestDiseaseWeedLibrary = pestDiseaseWeedLibraryMapper.selectById(id);
if (pestDiseaseWeedLibrary != null) {
// 触发图片集合转换,确保返回的DO对象包含转换后的图片集合
pestDiseaseWeedLibrary.getImageList();
}
return pestDiseaseWeedLibrary;
}
@Override
public PageResult<PestDiseaseWeedLibraryDO> getPestDiseaseWeedLibraryPage(PestDiseaseWeedLibraryPageReqVO pageReqVO) {
PageResult<PestDiseaseWeedLibraryDO> pageResult = pestDiseaseWeedLibraryMapper.selectPage(pageReqVO);
if (pageResult.getList() != null) {
// 触发图片集合转换,确保分页结果中的每个DO对象都包含转换后的图片集合
pageResult.getList().forEach(pestDiseaseWeedLibrary -> {
if (pestDiseaseWeedLibrary != null) {
pestDiseaseWeedLibrary.getImageList();
}
});
}
return pageResult;
}
}

View File

@@ -9,6 +9,7 @@ import jakarta.validation.Valid;
import java.math.BigDecimal; import java.math.BigDecimal;
import java.util.List; import java.util.List;
import java.util.Map;
/** /**
* 地块 Service 接口 * 地块 Service 接口
@@ -117,4 +118,11 @@ public interface PlotInfoService {
* @return * @return
*/ */
List<PlotListRespVO> listPlotInfo(String baseId); List<PlotListRespVO> listPlotInfo(String baseId);
/**
* id
* point
* @return
*/
Map<String, String> getPlotPointMap();
} }

View File

@@ -26,6 +26,7 @@ import org.springframework.validation.annotation.Validated;
import java.math.BigDecimal; import java.math.BigDecimal;
import java.util.*; 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.common.exception.util.ServiceExceptionUtil.exception;
import static cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils.getLoginUser; import static cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils.getLoginUser;
@@ -311,6 +312,17 @@ public class PlotInfoServiceImpl implements PlotInfoService {
return pList; return pList;
} }
@Override
public Map<String, String> getPlotPointMap() {
LambdaQueryWrapperX<PlotInfoDO> wrapperX = new LambdaQueryWrapperX<>();
wrapperX.eq(PlotInfoDO::getDeleted, CommonConstants.NO_CODE);
List<PlotInfoDO> plotInfoDOS = plotInfoMapper.selectList(wrapperX);
Map<String, String> pointMap = plotInfoDOS.stream().collect(Collectors.toMap(PlotInfoDO::getId, PlotInfoDO::getPoint, (v1, v2) -> v1));
return pointMap;
}
// ==================== 私有方法 ==================== // ==================== 私有方法 ====================
/** /**

View File

@@ -36,11 +36,13 @@ public class PlotLesseeServiceImpl implements PlotLesseeService {
private final BaseInfoMapper baseInfoMapper; private final BaseInfoMapper baseInfoMapper;
private final PlotInfoMapper plotInfoMapper; private final PlotInfoMapper plotInfoMapper;
private final PlotLesseeMapper plotLesseeMapper; private final PlotLesseeMapper plotLesseeMapper;
private final PlotInfoCacheService pCatchService;
public PlotLesseeServiceImpl(BaseInfoMapper baseInfoMapper, PlotInfoMapper plotInfoMapper, PlotLesseeMapper plotLesseeMapper) { public PlotLesseeServiceImpl(BaseInfoMapper baseInfoMapper, PlotInfoMapper plotInfoMapper, PlotLesseeMapper plotLesseeMapper, PlotInfoCacheService pCatchService) {
this.baseInfoMapper = baseInfoMapper; this.baseInfoMapper = baseInfoMapper;
this.plotInfoMapper = plotInfoMapper; this.plotInfoMapper = plotInfoMapper;
this.plotLesseeMapper = plotLesseeMapper; this.plotLesseeMapper = plotLesseeMapper;
this.pCatchService = pCatchService;
} }
@Override @Override
@@ -90,7 +92,7 @@ public class PlotLesseeServiceImpl implements PlotLesseeService {
@Override @Override
public PlotLesseeImportRespVO importPlotLesseeInfoExcel(List<PlotLesseeForImportExcelRespVO> req) { public PlotLesseeImportRespVO importPlotLesseeInfoExcel(List<PlotLesseeForImportExcelRespVO> req) {
Map<String, String> baseNameMap = baseInfoMapper.selectList().stream().collect(Collectors.toMap(BaseInfoDO::getId, BaseInfoDO::getName, (v1, v2) -> v1)); Map<String, String> baseNameMap = baseInfoMapper.selectList().stream().collect(Collectors.toMap(BaseInfoDO::getId, BaseInfoDO::getName, (v1, v2) -> v1));
Map<String, String> plotNameMap = plotInfoMapper.selectList().stream().collect(Collectors.toMap(PlotInfoDO::getPlotName, PlotInfoDO::getId, (v1, v2) -> v1)); // Map<String, String> plotNameMap = plotInfoMapper.selectList().stream().collect(Collectors.toMap(PlotInfoDO::getPlotName, PlotInfoDO::getId, (v1, v2) -> v1));
PlotLesseeImportRespVO res = new PlotLesseeImportRespVO(); PlotLesseeImportRespVO res = new PlotLesseeImportRespVO();
res.setTotal(req.size()); res.setTotal(req.size());
@@ -124,6 +126,7 @@ public class PlotLesseeServiceImpl implements PlotLesseeService {
p.setPlotLeaseStatus(NO_CODE); p.setPlotLeaseStatus(NO_CODE);
p.setPlotColor(PLOT_COLOR_GREEN); p.setPlotColor(PLOT_COLOR_GREEN);
plotInfoMapper.updateById(p); plotInfoMapper.updateById(p);
pCatchService.createOrUpdatePlotInfo(p);
sourcePObj.setLeaseStatus(NO_CODE); sourcePObj.setLeaseStatus(NO_CODE);
plotLesseeMapper.updateById(sourcePObj); plotLesseeMapper.updateById(sourcePObj);
@@ -201,7 +204,7 @@ public class PlotLesseeServiceImpl implements PlotLesseeService {
public List<PlotLesseeDetailsRespVO> getPlotLesseeHistoryList(String plotId) { public List<PlotLesseeDetailsRespVO> getPlotLesseeHistoryList(String plotId) {
LambdaQueryWrapperX<PlotLesseeDO> x = new LambdaQueryWrapperX<>(); LambdaQueryWrapperX<PlotLesseeDO> x = new LambdaQueryWrapperX<>();
x.eq(PlotLesseeDO::getDeleted, NO_CODE); x.eq(PlotLesseeDO::getDeleted, NO_CODE);
x.eq(PlotLesseeDO::getLeaseStatus, NO_CODE); x.eq(PlotLesseeDO::getLeaseStatus, YES_CODE);
x.eq(PlotLesseeDO::getPlotId, plotId); x.eq(PlotLesseeDO::getPlotId, plotId);
List<PlotLesseeDO> list = plotLesseeMapper.selectList(x); List<PlotLesseeDO> list = plotLesseeMapper.selectList(x);
@@ -276,6 +279,7 @@ public class PlotLesseeServiceImpl implements PlotLesseeService {
p.setPlotLeaseStatus(YES_CODE); p.setPlotLeaseStatus(YES_CODE);
p.setPlotColor(PLOT_COLOR_BLUE); p.setPlotColor(PLOT_COLOR_BLUE);
plotInfoMapper.updateById(p); plotInfoMapper.updateById(p);
pCatchService.createOrUpdatePlotInfo(p);
} }
/** /**

View File

@@ -475,7 +475,7 @@ public class ProductionPlanServiceImpl implements ProductionPlanService {
@Override @Override
public List<YieldStatisticsRespVO> getCultivatingYieldInfo(String baseId, String year) { public List<YieldStatisticsRespVO> getCultivatingYieldInfo(String baseId, String year) {
return null; return Collections.EMPTY_LIST;
} }
@Override @Override

View File

@@ -5,6 +5,7 @@ import java.util.*;
import cn.iocoder.yudao.framework.common.pojo.CommonResult; import cn.iocoder.yudao.framework.common.pojo.CommonResult;
import cn.iocoder.yudao.module.farm.controller.admin.api.vo.DisasterAnalysisReqVO; import cn.iocoder.yudao.module.farm.controller.admin.api.vo.DisasterAnalysisReqVO;
import cn.iocoder.yudao.module.farm.controller.admin.api.vo.DisasterAnalysisRespVO; import cn.iocoder.yudao.module.farm.controller.admin.api.vo.DisasterAnalysisRespVO;
import cn.iocoder.yudao.module.farm.controller.admin.managementcenter.largescreen.screendisasterdata.vo.DisasterDataStatisticsInfoV2RespVO;
import cn.iocoder.yudao.module.farm.controller.admin.managementcenter.largescreen.screendisasterdata.vo.ScreenDisasterDataPageReqVO; import cn.iocoder.yudao.module.farm.controller.admin.managementcenter.largescreen.screendisasterdata.vo.ScreenDisasterDataPageReqVO;
import cn.iocoder.yudao.module.farm.controller.admin.managementcenter.largescreen.screendisasterdata.vo.ScreenDisasterDataSaveReqVO; import cn.iocoder.yudao.module.farm.controller.admin.managementcenter.largescreen.screendisasterdata.vo.ScreenDisasterDataSaveReqVO;
import jakarta.validation.*; import jakarta.validation.*;
@@ -71,4 +72,6 @@ public interface ScreenDisasterDataService {
*/ */
CommonResult<List<DisasterAnalysisRespVO>> getDisasterStatisticsChart(DisasterAnalysisReqVO req); CommonResult<List<DisasterAnalysisRespVO>> getDisasterStatisticsChart(DisasterAnalysisReqVO req);
List<DisasterDataStatisticsInfoV2RespVO> getScreenDisasterDataStatisticsInfo();
} }

View File

@@ -6,6 +6,8 @@ import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.common.util.object.BeanUtils; import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
import cn.iocoder.yudao.module.farm.controller.admin.api.vo.DisasterAnalysisReqVO; import cn.iocoder.yudao.module.farm.controller.admin.api.vo.DisasterAnalysisReqVO;
import cn.iocoder.yudao.module.farm.controller.admin.api.vo.DisasterAnalysisRespVO; import cn.iocoder.yudao.module.farm.controller.admin.api.vo.DisasterAnalysisRespVO;
import cn.iocoder.yudao.module.farm.controller.admin.managementcenter.largescreen.screendisasterdata.vo.DisasterDataStatisticsInfoRespVO;
import cn.iocoder.yudao.module.farm.controller.admin.managementcenter.largescreen.screendisasterdata.vo.DisasterDataStatisticsInfoV2RespVO;
import cn.iocoder.yudao.module.farm.controller.admin.managementcenter.largescreen.screendisasterdata.vo.ScreenDisasterDataPageReqVO; import cn.iocoder.yudao.module.farm.controller.admin.managementcenter.largescreen.screendisasterdata.vo.ScreenDisasterDataPageReqVO;
import cn.iocoder.yudao.module.farm.controller.admin.managementcenter.largescreen.screendisasterdata.vo.ScreenDisasterDataSaveReqVO; import cn.iocoder.yudao.module.farm.controller.admin.managementcenter.largescreen.screendisasterdata.vo.ScreenDisasterDataSaveReqVO;
import cn.iocoder.yudao.module.farm.dal.dataobject.baseinfo.BaseInfoDO; import cn.iocoder.yudao.module.farm.dal.dataobject.baseinfo.BaseInfoDO;
@@ -105,4 +107,23 @@ public class ScreenDisasterDataServiceImpl implements ScreenDisasterDataService
return CommonResult.success(res); return CommonResult.success(res);
} }
@Override
public List<DisasterDataStatisticsInfoV2RespVO> getScreenDisasterDataStatisticsInfo() {
List<DisasterDataStatisticsInfoRespVO> sourceList = screenDisasterDataMapper.getScreenDisasterDataStatisticsInfo();
List<DisasterDataStatisticsInfoV2RespVO> result = sourceList.stream()
.collect(Collectors.groupingBy(
DisasterDataStatisticsInfoRespVO::getCategory,
Collectors.toList()
))
.entrySet()
.stream()
.map(entry -> new DisasterDataStatisticsInfoV2RespVO(
entry.getKey(),
entry.getValue()
))
.collect(Collectors.toList());
return result;
}
} }

View File

@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="cn.iocoder.yudao.module.farm.dal.mysql.pestdiseaseweedlibrary.PestDiseaseWeedLibraryMapper"> <mapper namespace="cn.iocoder.yudao.module.farm.dal.mysql.foundationinfo.CockpitMockInfoMapper">
<!-- <!--
一般情况下,尽可能使用 Mapper 进行 CRUD 增删改查即可。 一般情况下,尽可能使用 Mapper 进行 CRUD 增删改查即可。
@@ -9,4 +9,5 @@
文档可见:https://www.iocoder.cn/MyBatis/x-plugins/ 文档可见:https://www.iocoder.cn/MyBatis/x-plugins/
--> -->
</mapper> </mapper>

View File

@@ -9,4 +9,20 @@
文档可见:https://www.iocoder.cn/MyBatis/x-plugins/ 文档可见:https://www.iocoder.cn/MyBatis/x-plugins/
--> -->
<select id="getVariousIndexes"
resultType="cn.iocoder.yudao.module.farm.controller.admin.digitalcockpit.vo.VariousIndexesRespVO">
SELECT
COALESCE(SUM(CASE WHEN message_type = 1 THEN 1 ELSE 0 END), 0) as weatherAlertCount,
COALESCE(SUM(CASE WHEN message_type = 100 THEN 1 ELSE 0 END), 0) as pestAlertCount,
COALESCE(SUM(CASE WHEN message_type = 10 THEN 1 ELSE 0 END), 0) as environmentalAlertCount,
COALESCE(SUM(CASE WHEN message_type = 2 THEN 1 ELSE 0 END), 0) as deviceAlertCount,
COALESCE(SUM(CASE WHEN message_type = 3 THEN 1 ELSE 0 END), 0) as farmingReminderCount
FROM farm_message_center
<where>
deleted = 0
<if test="baseId != null and baseId != ''">
AND base_id = #{baseId}
</if>
</where>
</select>
</mapper> </mapper>

View File

@@ -68,4 +68,43 @@
</select> </select>
<select id="getScreenDisasterDataStatisticsInfo"
resultType="cn.iocoder.yudao.module.farm.controller.admin.managementcenter.largescreen.screendisasterdata.vo.DisasterDataStatisticsInfoRespVO">
SELECT
CASE ct.category_type
WHEN '0' THEN '气象'
WHEN '1' THEN '虫害'
WHEN '2' THEN '病害'
WHEN '3' THEN '草害'
END as category,
ms.month_str as disasterTime,
YEAR(STR_TO_DATE(CONCAT(ms.month_str, '-01'), '%Y-%m-%d')) as year,
COALESCE(SUM(fsdd.disaster_count), 0) as totalCount
FROM (
SELECT DATE_FORMAT(DATE_SUB(CURDATE(), INTERVAL n MONTH), '%Y-%m') as month_str
FROM (
SELECT 0 as n UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5
UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9 UNION SELECT 10 UNION SELECT 11
UNION SELECT 12 UNION SELECT 13 UNION SELECT 14 UNION SELECT 15 UNION SELECT 16 UNION SELECT 17
UNION SELECT 18 UNION SELECT 19 UNION SELECT 20 UNION SELECT 21 UNION SELECT 22 UNION SELECT 23
) months
) ms
CROSS JOIN (
SELECT '0' as category_type
UNION ALL
SELECT '1' as category_type
UNION ALL
SELECT '2' as category_type
UNION ALL
SELECT '3' as category_type
) ct
LEFT JOIN farm_screen_disaster_data fsdd ON
ct.category_type = fsdd.category
AND ms.month_str = fsdd.disaster_time
AND fsdd.deleted = 0
AND fsdd.use_status = 1
GROUP BY ct.category_type, ms.month_str
ORDER BY ms.month_str, ct.category_type
</select>
</mapper> </mapper>

View File

@@ -8,6 +8,7 @@ import cn.iocoder.yudao.framework.common.pojo.CommonResult;
import cn.iocoder.yudao.framework.security.config.SecurityProperties; import cn.iocoder.yudao.framework.security.config.SecurityProperties;
import cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils; import cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils;
import cn.iocoder.yudao.framework.tenant.core.aop.TenantIgnore; import cn.iocoder.yudao.framework.tenant.core.aop.TenantIgnore;
import cn.iocoder.yudao.framework.tenant.core.context.TenantContextHolder;
import cn.iocoder.yudao.module.system.controller.admin.auth.vo.*; import cn.iocoder.yudao.module.system.controller.admin.auth.vo.*;
import cn.iocoder.yudao.module.system.controller.admin.auth.vo.diy.LoginForTenantReqVO; import cn.iocoder.yudao.module.system.controller.admin.auth.vo.diy.LoginForTenantReqVO;
import cn.iocoder.yudao.module.system.controller.admin.auth.vo.diy.TenantRespVO; import cn.iocoder.yudao.module.system.controller.admin.auth.vo.diy.TenantRespVO;
@@ -22,7 +23,6 @@ import cn.iocoder.yudao.module.system.service.permission.PermissionService;
import cn.iocoder.yudao.module.system.service.permission.RoleService; import cn.iocoder.yudao.module.system.service.permission.RoleService;
import cn.iocoder.yudao.module.system.service.social.SocialClientService; import cn.iocoder.yudao.module.system.service.social.SocialClientService;
import cn.iocoder.yudao.module.system.service.user.AdminUserService; import cn.iocoder.yudao.module.system.service.user.AdminUserService;
import cn.iocoder.yudao.module.system.util.TokenExtractorUtil;
import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter; import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.Parameters; import io.swagger.v3.oas.annotations.Parameters;
@@ -86,11 +86,13 @@ public class AuthController {
@PermitAll @PermitAll
@Operation(summary = "登出系统") @Operation(summary = "登出系统")
public CommonResult<Boolean> logout(HttpServletRequest request) { public CommonResult<Boolean> logout(HttpServletRequest request) {
log.info("logout 之前: tenantId ==> {}", TenantContextHolder.getTenantId() );
String token = SecurityFrameworkUtils.obtainAuthorization(request, String token = SecurityFrameworkUtils.obtainAuthorization(request,
securityProperties.getTokenHeader(), securityProperties.getTokenParameter()); securityProperties.getTokenHeader(), securityProperties.getTokenParameter());
if (StrUtil.isNotBlank(token)) { if (StrUtil.isNotBlank(token)) {
authService.logout(token, LoginLogTypeEnum.LOGOUT_SELF.getType()); authService.logout(token, LoginLogTypeEnum.LOGOUT_SELF.getType());
} }
log.info("logout 之后: tenantId ==> {}", TenantContextHolder.getTenantId() );
return success(true); return success(true);
} }
@@ -162,12 +164,43 @@ public class AuthController {
} }
} }
// @PermitAll
// @PostMapping("/login-by-tenant")
// @Operation(summary = "登录 (切换租户之后调用)")
// public CommonResult<AuthLoginRespVO> getPhoneNumber4Login(@RequestBody @Valid TenantTokenReqVO reqVO) {
// // 强行清楚 本地线程 中的租户ID , 请设置为当前将要登录的租户ID
//// TenantContextHolder.clear();
//// TenantContextHolder.setTenantId(Long.valueOf(reqVO.getTenantId()));
// AuthLoginRespVO login = authService.getPhoneNumber4Login(reqVO);
// if (login != null) {
// return success(login);
// } else {
// return error(405, "该手机号不是平台用户");
// }
// }
@PermitAll @PermitAll
@TenantIgnore
@PostMapping("/login-by-tenant") @PostMapping("/login-by-tenant")
@Operation(summary = "登录 (切换租户之后调用)") @Operation(summary = "登录 (切换租户之后调用)")
public CommonResult<AuthLoginRespVO> getPhoneNumber4Login(@RequestBody @Valid TenantTokenReqVO reqVO) { public CommonResult<AuthLoginRespVO> loginByTenant(@RequestBody @Valid TenantTokenReqVO reqVO) {
// 强行清除本地线程中的租户ID,设置为当前将要登录的租户ID
Long targetTenantId;
try {
targetTenantId = Long.valueOf(reqVO.getTenantId());
} catch (NumberFormatException e) {
log.error("[loginByTenant][租户ID格式错误: {}]", reqVO.getTenantId());
return error(400, "租户ID格式错误");
}
// 清除并设置租户ID,确保后续操作使用正确的租户上下文
// TenantContextHolder.clear();
// TenantContextHolder.setTenantId(targetTenantId);
// log.info("[loginByTenant][设置租户ID: {}, 手机号: {}]", targetTenantId, reqVO.getPhoneNumber());
AuthLoginRespVO login = authService.getPhoneNumber4Login(reqVO); AuthLoginRespVO login = authService.getPhoneNumber4Login(reqVO);
if (login != null) { if (login != null) {
log.info("[loginByTenant][登录成功,最终租户ID: {}]", TenantContextHolder.getTenantId());
return success(login); return success(login);
} else { } else {
return error(405, "该手机号不是平台用户"); return error(405, "该手机号不是平台用户");

View File

@@ -6,7 +6,7 @@ import lombok.Data;
import lombok.NoArgsConstructor; import lombok.NoArgsConstructor;
/** /**
* @description: TODO * @description:
* @author: binda * @author: binda
* @date: 2025/11/20 15:37 * @date: 2025/11/20 15:37
*/ */

View File

@@ -251,8 +251,9 @@ public class AdminAuthServiceImpl implements AdminAuthService {
createLoginLog(userId, username, logType, LoginResultEnum.SUCCESS); createLoginLog(userId, username, logType, LoginResultEnum.SUCCESS);
// 确保租户上下文中有正确的租户ID // 确保租户上下文中有正确的租户ID
ensureTenantContext(userId); // ensureTenantContext(userId);
ensureTenantContextPlus(userId);
// 创建访问令牌 // 创建访问令牌
OAuth2AccessTokenDO accessTokenDO = oauth2TokenService.createAccessToken(userId, getUserType().getValue(), OAuth2AccessTokenDO accessTokenDO = oauth2TokenService.createAccessToken(userId, getUserType().getValue(),
OAuth2ClientConstants.CLIENT_ID_DEFAULT, null); OAuth2ClientConstants.CLIENT_ID_DEFAULT, null);
@@ -274,7 +275,7 @@ public class AdminAuthServiceImpl implements AdminAuthService {
} catch (Exception e) { } catch (Exception e) {
log.debug("[ensureTenantContext][无法获取当前请求,跳过从请求头提取租户ID]"); log.debug("[ensureTenantContext][无法获取当前请求,跳过从请求头提取租户ID]");
} }
// 如果还是为空,从用户信息中获取 // 如果还是为空,从用户信息中获取
if (currentTenantId == null) { if (currentTenantId == null) {
AdminUserDO user = userService.getUser(userId); AdminUserDO user = userService.getUser(userId);
@@ -283,7 +284,7 @@ public class AdminAuthServiceImpl implements AdminAuthService {
log.info("[ensureTenantContext][从用户({})信息中获取租户ID: {}]", userId, currentTenantId); log.info("[ensureTenantContext][从用户({})信息中获取租户ID: {}]", userId, currentTenantId);
} }
} }
// 设置到租户上下文中 // 设置到租户上下文中
if (currentTenantId != null) { if (currentTenantId != null) {
TenantContextHolder.setTenantId(currentTenantId); TenantContextHolder.setTenantId(currentTenantId);
@@ -294,6 +295,19 @@ public class AdminAuthServiceImpl implements AdminAuthService {
} }
} }
private void ensureTenantContextPlus(Long userId) {
// 如果TenantContextHolder中没有租户ID,尝试从用户信息中获取并设置
Long currentTenantId = TenantContextHolder.getTenantId();
// 设置到租户上下文中
if (currentTenantId != null) {
TenantContextHolder.setTenantId(currentTenantId);
log.info("[ensureTenantContext][设置租户上下文: {}]", currentTenantId);
} else {
log.warn("[ensureTenantContext][用户({}) 无法获取租户ID,可能导致登录后无法获取租户信息]", userId);
}
}
@Override @Override
public AuthLoginRespVO refreshToken(String refreshToken) { public AuthLoginRespVO refreshToken(String refreshToken) {
OAuth2AccessTokenDO accessTokenDO = oauth2TokenService.refreshAccessToken(refreshToken, OAuth2ClientConstants.CLIENT_ID_DEFAULT); OAuth2AccessTokenDO accessTokenDO = oauth2TokenService.refreshAccessToken(refreshToken, OAuth2ClientConstants.CLIENT_ID_DEFAULT);
@@ -437,13 +451,44 @@ public class AdminAuthServiceImpl implements AdminAuthService {
} }
} }
@Override // @Override
// public AuthLoginRespVO getPhoneNumber4Login(TenantTokenReqVO reqVO) {
// String phoneNumber = reqVO.getPhoneNumber();
// AdminUserDO user = userService.getUserByMobileAndTenantId2(phoneNumber,reqVO.getTenantId());
//
// AuthLoginRespVO tokenAfterLoginSuccess = createTokenAfterLoginSuccess(user.getId(), user.getUsername(), LoginLogTypeEnum.LOGIN_MOBILE);
// tokenAfterLoginSuccess.setMobile(phoneNumber);
// return tokenAfterLoginSuccess;
// }
public AuthLoginRespVO getPhoneNumber4Login(TenantTokenReqVO reqVO) { public AuthLoginRespVO getPhoneNumber4Login(TenantTokenReqVO reqVO) {
String phoneNumber = reqVO.getPhoneNumber(); String phoneNumber = reqVO.getPhoneNumber();
AdminUserDO user = userService.getUserByMobileAndTenantId2(phoneNumber,reqVO.getTenantId()); // 切换租户:强制使用请求中的租户ID,这是用户要切换到的目标租户ID
Long targetTenantId = Long.valueOf(reqVO.getTenantId());
// 清除并设置目标租户ID,确保后续操作使用新的租户上下文
TenantContextHolder.clear();
TenantContextHolder.setTenantId(targetTenantId);
log.info("[getPhoneNumber4Login][切换租户登录,设置目标租户ID: {}, 手机号: {}]", targetTenantId, phoneNumber);
// 根据手机号和目标租户ID查询用户(该租户下的用户账号)
AdminUserDO user = userService.getUserByMobileAndTenantId2(phoneNumber, reqVO.getTenantId());
if (user == null) {
log.warn("[getPhoneNumber4Login][用户不存在,手机号: {}, 目标租户ID: {}]", phoneNumber, targetTenantId);
return null;
}
log.info("[getPhoneNumber4Login][找到用户: {}, 用户所属租户ID: {}, 目标租户ID: {}]",
user.getId(), user.getTenantId(), targetTenantId);
// 再次确保使用目标租户ID(防止在查询过程中被覆盖)
TenantContextHolder.setTenantId(targetTenantId);
log.info("[getPhoneNumber4Login][创建Token前,确认使用目标租户ID: {}]", TenantContextHolder.getTenantId());
// 创建token,确保使用目标租户ID
AuthLoginRespVO tokenAfterLoginSuccess = createTokenAfterLoginSuccess(user.getId(), user.getUsername(), LoginLogTypeEnum.LOGIN_MOBILE); AuthLoginRespVO tokenAfterLoginSuccess = createTokenAfterLoginSuccess(user.getId(), user.getUsername(), LoginLogTypeEnum.LOGIN_MOBILE);
tokenAfterLoginSuccess.setMobile(phoneNumber); tokenAfterLoginSuccess.setMobile(phoneNumber);
log.info("[getPhoneNumber4Login][Token创建完成,租户ID: {}]", TenantContextHolder.getTenantId());
return tokenAfterLoginSuccess; return tokenAfterLoginSuccess;
} }

View File

@@ -194,7 +194,7 @@ public class RoleServiceImpl implements RoleService {
public List<RoleDO> getRoleByCode(String code) { public List<RoleDO> getRoleByCode(String code) {
LambdaQueryWrapperX<RoleDO> x = new LambdaQueryWrapperX<>(); LambdaQueryWrapperX<RoleDO> x = new LambdaQueryWrapperX<>();
x.eqIfPresent(RoleDO::getCode, code); x.eqIfPresent(RoleDO::getCode, code);
x.ne(RoleDO::getType, 1); // x.ne(RoleDO::getType, 1);
return roleMapper.selectList(x); return roleMapper.selectList(x);
} }

View File

@@ -165,7 +165,8 @@ public class TenantServiceImpl implements TenantService {
// 创建租户的管理员 // 创建租户的管理员
TenantUtils.execute(tenant.getId(), () -> { TenantUtils.execute(tenant.getId(), () -> {
// 创建角色 // 创建角色
Long roleId = createRole(tenantPackage); // Long roleId = createRole(tenantPackage);
Long roleId = createRole4Customization(tenantPackage);
// 创建用户,并分配角色 // 创建用户,并分配角色
Long userId = createUser(roleId, createReqVO); Long userId = createUser(roleId, createReqVO);
// 修改租户的管理员 // 修改租户的管理员
@@ -193,6 +194,23 @@ public class TenantServiceImpl implements TenantService {
return roleId; return roleId;
} }
private Long createRole4Customization(TenantPackageDO tenantPackage) {
RoleSaveReqVO reqVO = new RoleSaveReqVO();
reqVO.setName("管理员").setCode("1").setSort(1).setRemark("系统自动生成");
roleService.createRole(reqVO, RoleTypeEnum.SYSTEM.getType());
reqVO.setName("基地主管").setCode("2").setSort(2).setRemark("系统自动生成");
roleService.createRole(reqVO, RoleTypeEnum.SYSTEM.getType());
reqVO.setName("技术员").setCode("3").setSort(3).setRemark("系统自动生成");
roleService.createRole(reqVO, RoleTypeEnum.SYSTEM.getType());
reqVO.setName("普通用户").setCode("4").setSort(4).setRemark("系统自动生成");
roleService.createRole(reqVO, RoleTypeEnum.SYSTEM.getType());
return this.createRole(tenantPackage);
}
@Override @Override
@DSTransactional // 多数据源,使用 @DSTransactional 保证本地事务,以及数据源的切换 @DSTransactional // 多数据源,使用 @DSTransactional 保证本地事务,以及数据源的切换
public void updateTenant(TenantSaveReqVO updateReqVO) { public void updateTenant(TenantSaveReqVO updateReqVO) {

View File

@@ -694,6 +694,9 @@ public class AdminUserServiceImpl implements AdminUserService {
.collect(Collectors.toList()); .collect(Collectors.toList());
Set<Long> userIds = permissionService.getUserRoleIdListByRoleId(roleIds); Set<Long> userIds = permissionService.getUserRoleIdListByRoleId(roleIds);
if (null == userIds || userIds.size() == 0) {
return Collections.EMPTY_LIST;
}
List<AdminUserDO> userList = userMapper.selectByIds(userIds); List<AdminUserDO> userList = userMapper.selectByIds(userIds);
return userList; return userList;

View File

@@ -59,11 +59,10 @@ spring:
# Redis 配置。Redisson 默认的配置足够使用,一般不需要进行调优 # Redis 配置。Redisson 默认的配置足够使用,一般不需要进行调优
data: data:
redis: redis:
host: ${redis.host} host: 171.34.150.87
port: ${redis.port} port: 6379
database: ${redis.database} database: 5
username: ${redis.username} password: yEGXyWphiwfiawjG
password: ${redis.password}
mongodb: mongodb:
uri: mongodb://mongo_BiKBdR:mongo_KaShrX@223.83.129.121:27017/farming-platform-iot?authSource=farming-platform-iot uri: mongodb://mongo_BiKBdR:mongo_KaShrX@223.83.129.121:27017/farming-platform-iot?authSource=farming-platform-iot
auto-index-creation: true auto-index-creation: true
@@ -231,4 +230,4 @@ iot:
# 插件配置 # 插件配置
pf4j: pf4j:
pluginsDir: ${user.home}/plugins # 插件目录 pluginsDir: ${user.home}/plugins # 插件目录

View File

@@ -1,5 +1,5 @@
######################### #########################
# wanmao server # yun ge server
######################### #########################
mysql.url=jdbc:mysql://223.83.129.121:3360/farming-platform?useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true&rewriteBatchedStatements=true mysql.url=jdbc:mysql://223.83.129.121:3360/farming-platform?useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true&rewriteBatchedStatements=true
@@ -7,12 +7,12 @@ mysql.url=jdbc:mysql://223.83.129.121:3360/farming-platform?useSSL=false&serverT
mysql.username=farming-platform mysql.username=farming-platform
mysql.password=wCM7fBMhFP3zNdJ3 mysql.password=wCM7fBMhFP3zNdJ3
redis.host= 112.126.60.236 redis.host=171.34.150.87
#redis.host=Redis #redis.host=Redis
redis.port=65532 redis.port=6379
redis.database=5 redis.database=6
redis.username= redis.username=
redis.password=luxifa970219 redis.password=yEGXyWphiwfiawjG
wm.wx.mp.app-id=wx508d9a9ab84f67d0 wm.wx.mp.app-id=wx508d9a9ab84f67d0
wm.wx.mp.secret=92c571b9973f9078c11da47a16c4094c wm.wx.mp.secret=92c571b9973f9078c11da47a16c4094c
@@ -43,7 +43,7 @@ print.jby.device-id=00543113467925660
#======================== #========================
# wan mao server # wan mao server
#======================== #========================
#
#mysql.url=jdbc:mysql://rm-2ze979o6dt71z2mf6so.mysql.rds.aliyuncs.com:3306/farming-platform?useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true&rewriteBatchedStatements=true #mysql.url=jdbc:mysql://rm-2ze979o6dt71z2mf6so.mysql.rds.aliyuncs.com:3306/farming-platform?useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true&rewriteBatchedStatements=true
#mysql.username=root #mysql.username=root
#mysql.password=Wm@123456 #mysql.password=Wm@123456
@@ -74,8 +74,8 @@ print.jby.device-id=00543113467925660
#print.jby.member-code=7A7453F04CB067987229F7BBAD888CFF #print.jby.member-code=7A7453F04CB067987229F7BBAD888CFF
#print.jby.template-id=be64feabccf44de189f7019daa0dd7fb #print.jby.template-id=be64feabccf44de189f7019daa0dd7fb
#print.jby.device-id=00543113467925660 #print.jby.device-id=00543113467925660
#
#
@@ -100,4 +100,4 @@ print.jby.device-id=00543113467925660
#wms.hosts=https://wms.jslstec.cn/prod-api #wms.hosts=https://wms.jslstec.cn/prod-api
#wms.url_1=getTenantByMobile #wms.url_1=getTenantByMobile
#gaode.weather.webkey=6e867624a911d74e673f5e68c52a61e7 #gaode.weather.webkey=6e867624a911d74e673f5e68c52a61e7