fix (farm): 户主列表

- 新增
This commit is contained in:
达富斌
2025-10-15 20:17:55 +08:00
parent 84a85c8793
commit dbab7c3522
27 changed files with 493 additions and 146 deletions

View File

@@ -56,107 +56,13 @@ public class HomeController {
return success(res);
}
// @Operation(summary = "农场首页-天气信息-获取天气信息")
// @GetMapping("/weather/{city}")
// public CommonResult<String> getBaseNameList(@PathVariable("city") String city) {
//
// return success("天气信息!");
// }
@PermitAll
@Operation(summary = "农场首页-扫描二维码")
@GetMapping("/scan-qr")
@Parameter(name = "baseId", description = "基地ID")
public CommonResult<QrDetailsRespVO> scanQrCodes(@RequestParam("baseId") String baseId) {
// TODO: 2025/10/11 待实现
QrDetailsRespVO mockData = new QrDetailsRespVO();
// 设置基地基本信息
mockData.setBaseName("阳光农业示范基地");
mockData.setBaseManagerName("张伟");
mockData.setBaseArea(500);
mockData.setPlotCount(3);
// 创建地块列表
List<QrDetailsRespVO.PlotInfo> plotInfoList = new ArrayList<>();
// 第一个地块
QrDetailsRespVO.PlotInfo plot1 = new QrDetailsRespVO.PlotInfo();
plot1.setPlotName("蔬菜种植区A");
plot1.setPlotManagerName("李丽");
plot1.setPlotArea(150);
List<QrDetailsRespVO.DeviceInfo> deviceInfos1 = new ArrayList<>();
QrDetailsRespVO.DeviceInfo device1 = new QrDetailsRespVO.DeviceInfo();
device1.setDeviceUniqueId("SENSOR-001-XYZ-2024");
device1.setDeviceTypeName("土壤湿度传感器");
device1.setDeviceStateName(1);
deviceInfos1.add(device1);
QrDetailsRespVO.DeviceInfo device2 = new QrDetailsRespVO.DeviceInfo();
device2.setDeviceUniqueId("CAM-002-ABC-2024");
device2.setDeviceTypeName("高清监控摄像头");
device2.setDeviceStateName(1);
deviceInfos1.add(device2);
plot1.setDeviceInfos(deviceInfos1);
plotInfoList.add(plot1);
// 第二个地块
QrDetailsRespVO.PlotInfo plot2 = new QrDetailsRespVO.PlotInfo();
plot2.setPlotName("水果种植区B");
plot2.setPlotManagerName("王强");
plot2.setPlotArea(200);
List<QrDetailsRespVO.DeviceInfo> deviceInfos2 = new ArrayList<>();
QrDetailsRespVO.DeviceInfo device3 = new QrDetailsRespVO.DeviceInfo();
device3.setDeviceUniqueId("SENSOR-003-DEF-2024");
device3.setDeviceTypeName("温湿度传感器");
device3.setDeviceStateName(2);
deviceInfos2.add(device3);
QrDetailsRespVO.DeviceInfo device4 = new QrDetailsRespVO.DeviceInfo();
device4.setDeviceUniqueId("VALVE-004-GHI-2024");
device4.setDeviceTypeName("智能灌溉阀门");
device4.setDeviceStateName(4);
deviceInfos2.add(device4);
plot2.setDeviceInfos(deviceInfos2);
plotInfoList.add(plot2);
// 第三个地块
QrDetailsRespVO.PlotInfo plot3 = new QrDetailsRespVO.PlotInfo();
plot3.setPlotName("粮食作物区C");
plot3.setPlotManagerName("赵敏");
plot3.setPlotArea(150);
List<QrDetailsRespVO.DeviceInfo> deviceInfos3 = new ArrayList<>();
QrDetailsRespVO.DeviceInfo device5 = new QrDetailsRespVO.DeviceInfo();
device5.setDeviceUniqueId("SENSOR-005-JKL-2024");
device5.setDeviceTypeName("光照强度传感器");
device5.setDeviceStateName(3);
deviceInfos3.add(device5);
QrDetailsRespVO.DeviceInfo device6 = new QrDetailsRespVO.DeviceInfo();
device6.setDeviceUniqueId("WEATHER-006-MNO-2024");
device6.setDeviceTypeName("微型气象站");
device6.setDeviceStateName(1);
deviceInfos3.add(device6);
QrDetailsRespVO.DeviceInfo device7 = new QrDetailsRespVO.DeviceInfo();
device7.setDeviceUniqueId("CAM-007-PQR-2024");
device7.setDeviceTypeName("全景监控摄像头");
device7.setDeviceStateName(0);
deviceInfos3.add(device7);
plot3.setDeviceInfos(deviceInfos3);
plotInfoList.add(plot3);
// 设置地块列表到基地
mockData.setPlotInfo(plotInfoList);
return success(mockData);
QrDetailsRespVO res = homeService.scanQrCodes(baseId);
return success(res);
}
}

View File

@@ -1,5 +1,6 @@
package cn.iocoder.yudao.module.farm.controller.admin.home.vo;
import cn.iocoder.yudao.module.farm.controller.admin.managementcenter.baseinfo.vo.PlotLesseeDetailsRespVO;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.AllArgsConstructor;
import lombok.Data;
@@ -130,6 +131,8 @@ public class HomeInfo {
private PlotOrCropInfo plotOrCropInfo;
@Schema(description = "基地弹框信息")
private List<PlotPopupFrame> plotPopupFrames;
@Schema(description = "户主流转信息")
private List<PlotLesseeDetailsRespVO> lesseeList;
}
@@ -149,9 +152,9 @@ public class HomeInfo {
private String plotName;
@Schema(description = "种植状态 (1: 在种; 2: 未种;)")
private String growFlag;
@Schema(description = "种植面积")
@Schema(description = "种植面积") // 2025/10/15 种植面积 修改为 地块面积 , 字段名为修改!! 只是修改了取值!!!
private Double growArea;
@Schema(description = "在种作物数量")
@Schema(description = "在种作物数量") // 2025/10/15 在种作物数量 修改为 物种数量 , 字段名未修改!! 只是修改了取值!!!
private Integer beingCrop;
@Schema(description = "生产计划任务数量")
private Integer taskCount;

View File

@@ -1,6 +1,9 @@
package cn.iocoder.yudao.module.farm.controller.admin.home.vo;
import cn.iocoder.yudao.module.farm.controller.admin.deviceinfo.vo.v2.DeviceInfoDetailV2RespVO;
import cn.iocoder.yudao.module.farm.controller.admin.digitalcockpit.vo.DeviceMonitorDataRespVO;
import cn.iocoder.yudao.module.farm.controller.admin.managementcenter.baseinfo.vo.PlotLesseeDetailsRespVO;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.AllArgsConstructor;
import lombok.Data;
@@ -41,23 +44,10 @@ public class QrDetailsRespVO {
@Schema(description = "地块面积")
private Integer plotArea;
@Schema(description = "地块绑定设备信息列表")
private List<DeviceInfo> deviceInfos;
private List<DeviceMonitorDataRespVO> deviceInfos;
@Schema(description = "地块绑定设备信息列表")
private List<PlotLesseeDetailsRespVO> lesseeInfos;
}
@Data
@AllArgsConstructor
@NoArgsConstructor
public static class DeviceInfo {
@Schema(description = "设备全局唯一标识(设备厂商提供)")
private String deviceUniqueId;
@Schema(description = "设备类型 (设备类型-名称)")
private String deviceTypeName;
@Schema(description = "设备状态:0-未激活,1-在线,2-离线,3-维护中,4-故障")
private Integer deviceStateName;
@Schema(description = "土壤墒情")
private DeviceInfoDetailV2RespVO.SoilInfo soilInfo;
@Schema(description = "水肥机")
private DeviceInfoDetailV2RespVO.WfInfo wfInfo;
}
}

View File

@@ -1,8 +1,6 @@
package cn.iocoder.yudao.module.farm.controller.admin.managementcenter.baseinfo;
import cn.iocoder.yudao.module.farm.controller.admin.managementcenter.baseinfo.vo.PlotInfoPageReqVO;
import cn.iocoder.yudao.module.farm.controller.admin.managementcenter.baseinfo.vo.PlotInfoRespVO;
import cn.iocoder.yudao.module.farm.controller.admin.managementcenter.baseinfo.vo.PlotInfoSaveReqVO;
import cn.iocoder.yudao.module.farm.controller.admin.managementcenter.baseinfo.vo.*;
import cn.iocoder.yudao.module.farm.controller.admin.managementcenter.baseinfo.vo.wx.RegularPlotInfoRespVO;
import org.springframework.web.bind.annotation.*;
import jakarta.validation.Valid;
@@ -75,10 +73,10 @@ public class PlotInfoController {
@GetMapping("/get")
@Operation(summary = "获得地块")
@Parameter(name = "id", description = "编号", required = true, example = "1024")
public CommonResult<PlotInfoRespVO> getPlotInfo(@RequestParam("id") String id) {
PlotInfoDO plotInfo = plotInfoService.getPlotInfo(id);
return success(BeanUtils.toBean(plotInfo, PlotInfoRespVO.class));
@Parameter(name = "id", description = "编号", required = true)
public CommonResult<PlotLesseeInfoRespVO> getPlotInfo(@RequestParam("id") String id) {
PlotLesseeInfoRespVO plotInfo = plotInfoService.getPlotLesseeInfo(id);
return success(plotInfo);
}
@GetMapping("/page")

View File

@@ -13,19 +13,20 @@ import cn.idev.excel.annotation.*;
@ExcelIgnoreUnannotated
public class PlotInfoRespVO {
@Schema(description = "id", requiredMode = Schema.RequiredMode.REQUIRED, example = "11262")
@Schema(description = "id", requiredMode = Schema.RequiredMode.REQUIRED)
@ExcelProperty("id")
private String id;
@Schema(description = "所属基地ID", example = "1431")
@Schema(description = "所属基地ID")
@ExcelProperty("所属基地ID")
private String baseId;
private String baseName;
@Schema(description = "地块ID", example = "4027")
@Schema(description = "地块ID")
@ExcelProperty("地块ID")
private String plotId;
@Schema(description = "地块名称", example = "王五")
@Schema(description = "地块名称")
@ExcelProperty("地块名称")
private String plotName;
@@ -41,14 +42,22 @@ public class PlotInfoRespVO {
@ExcelProperty("地块经纬度 (json字符串保存)")
private String point;
@Schema(description = "技术员ID", example = "653")
@Schema(description = "技术员ID")
@ExcelProperty("技术员ID")
private String employeeId;
@Schema(description = "创建时间")
@ExcelProperty("创建时间")
private LocalDateTime createTime;
@Schema(description = "租户id")
private String tenantId;
@Schema(description = "种植类型")
private String type;
@Schema(description = " 租赁状态 (1: 已租; 0: 未租;)")
private Integer plotLeaseStatus;
private String plotLeaseStatusName;
}

View File

@@ -12,7 +12,7 @@ public class PlotInfoSaveReqVO {
@Schema(description = "id", requiredMode = Schema.RequiredMode.REQUIRED, example = "11262")
private String id;
@Schema(description = "所属基地ID", example = "1431")
@Schema(description = "基地ID", example = "1431")
private String baseId;
@Schema(description = "地块ID", example = "4027")
@@ -32,8 +32,17 @@ public class PlotInfoSaveReqVO {
@Schema(description = "技术员ID", example = "653")
private String employeeId;
@Schema(description = "租户id")
private String tenantId;
@Schema(description = "种植类型")
private String type;
@Schema(description = " 租赁状态 (1: 已租; 0: 未租;)")
private Integer plotLeaseStatus;
@Schema(description = "租赁人信息")
private PlotLesseeSaveReqVO plotLesseeSaveReqVO;
}

View File

@@ -0,0 +1,34 @@
package cn.iocoder.yudao.module.farm.controller.admin.managementcenter.baseinfo.vo;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* @description: TODO
* @author: binda
* @date: 2025/10/15 14:05
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
public class PlotLesseeDetailsRespVO {
@Schema(description = "ID")
private String id;
@Schema(description = "姓名")
private String leaseName;
@Schema(description = "身份证号码")
private String leaseIdCard;
@Schema(description = "手机号码")
private String leasePhone;
@Schema(description = "租赁开始日期")
@JsonFormat(pattern = "yyyy-MM-dd")
private String leaseStartDate;
@Schema(description = "租赁接口日期")
@JsonFormat(pattern = "yyyy-MM-dd")
private String leaseEndDate;
@Schema(description = "租赁状态 (1: 当前租赁人; 2: 历史租赁人)")
private String leaseStatus;
}

View File

@@ -0,0 +1,66 @@
package cn.iocoder.yudao.module.farm.controller.admin.managementcenter.baseinfo.vo;
import cn.idev.excel.annotation.ExcelIgnoreUnannotated;
import cn.idev.excel.annotation.ExcelProperty;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import java.math.BigDecimal;
import java.time.LocalDateTime;
@Schema(description = "管理后台 - 地块")
@Data
@ExcelIgnoreUnannotated
public class PlotLesseeInfoRespVO {
@Schema(description = "id", requiredMode = Schema.RequiredMode.REQUIRED)
@ExcelProperty("id")
private String id;
@Schema(description = "所属基地ID")
@ExcelProperty("所属基地ID")
private String baseId;
private String baseName;
@Schema(description = "地块ID")
@ExcelProperty("地块ID")
private String plotId;
@Schema(description = "地块名称")
@ExcelProperty("地块名称")
private String plotName;
@Schema(description = "地块面积")
@ExcelProperty("地块面积")
private BigDecimal plotArea;
@Schema(description = "地块颜色")
@ExcelProperty("地块颜色")
private String plotColor;
@Schema(description = "地块经纬度 (json字符串保存)")
@ExcelProperty("地块经纬度 (json字符串保存)")
private String point;
@Schema(description = "技术员ID")
@ExcelProperty("技术员ID")
private String employeeId;
@Schema(description = "创建时间")
@ExcelProperty("创建时间")
private LocalDateTime createTime;
@Schema(description = "租户id")
private String tenantId;
@Schema(description = "种植类型")
private String type;
@Schema(description = " 租赁状态 (1: 已租; 0: 未租;)")
private Integer plotLeaseStatus;
private String plotLeaseStatusName;
@Schema(description = "租赁人信息")
private PlotLesseeDetailsRespVO plotLesseeDetailsRespVO;
}

View File

@@ -0,0 +1,33 @@
package cn.iocoder.yudao.module.farm.controller.admin.managementcenter.baseinfo.vo;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* @description: 租赁人信息
* @author: binda
* @date: 2025/10/15 11:23
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
public class PlotLesseeSaveReqVO {
@Schema(description = "ID")
private String id;
@Schema(description = "姓名")
private String leaseName;
@Schema(description = "身份证号码")
private String leaseIdCard;
@Schema(description = "手机号码")
private String leasePhone;
@Schema(description = "租赁开始日期")
private String leaseStartDate;
@Schema(description = "租赁接口日期")
private String leaseEndDate;
@Schema(description = "租赁状态 (1: 当前租赁人; 2: 历史租赁人)")
private String leaseStatus;
}

View File

@@ -36,6 +36,8 @@ public class BaseInfoDO extends BaseDO {
* 用户id用,隔开
*/
private String manager;
@TableField(exist = false)
private String managerName;
/**
* 面积
*/

View File

@@ -58,8 +58,17 @@ public class PlotInfoDO extends BaseDO {
* 技术员ID
*/
private String employeeId;
@TableField(exist = false)
private String employeeName;
private String tenantId;
/**
* 种植类型
*/
private String type;
/**
* 租赁状态 (1: 已租; 0: 未租;)
*/
private Integer plotLeaseStatus;
}

View File

@@ -0,0 +1,39 @@
package cn.iocoder.yudao.module.farm.dal.dataobject.plotinfo;
import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.*;
import java.time.LocalDate;
/**
* @description: TODO
* @author: binda
* @date: 2025/10/15 14:00
*/
@TableName("farm_plot_lessee")
@Data
@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class PlotLesseeDO extends BaseDO {
@TableId(type = IdType.INPUT)
private String id;
private String leaseName;
private String leaseIdCard;
private String leasePhone;
private LocalDate leaseStartDate;
private LocalDate leaseEndDate;
private Integer leaseStatus;
private String baseId;
private String baseName;
private String plotId;
private String plotName;
private String tenantId;
}

View File

@@ -0,0 +1,17 @@
package cn.iocoder.yudao.module.farm.dal.mysql.plotinfo;
import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
import cn.iocoder.yudao.module.farm.dal.dataobject.plotinfo.PlotLesseeDO;
import org.apache.ibatis.annotations.Mapper;
/**
* @description: TODO
* @author: binda
* @date: 2025/10/15 13:59
*/
@Mapper
public interface PlotLesseeMapper extends BaseMapperX<PlotLesseeDO> {
}

View File

@@ -48,6 +48,7 @@ public class CommonConstants {
public static Map<Integer,String> BINDING_STATE_MAP = new HashMap<>();
public static Map<String,String> NEWS_TYPE_MAP = new HashMap<>();
public static Map<String,String> ONLINE_MAP = new HashMap<>();
public static Map<Integer,String> LEASE_STATUS_MAP = new HashMap<>();
static {
PLAN_MAP.put(PLAN_STATUS_1, "未开始");
@@ -82,6 +83,9 @@ public class CommonConstants {
ONLINE_MAP.put("online", "在线");
ONLINE_MAP.put("offline", "离线");
LEASE_STATUS_MAP.put(1, "已租");
LEASE_STATUS_MAP.put(0, "未租");
}
// 模型类型 (1:模型模板; 2:引用案例)

View File

@@ -164,7 +164,12 @@ public class BaseInfoServiceImpl implements BaseInfoService {
@Override
public BaseInfoDO getBaseInfo(String id) {
return baseInfoMapper.selectById(id);
List<PersonnelManagementDO> personnelList = personnelManagementMapper.selectList();
Map<String, String> employeeMap = personnelList.stream().collect(Collectors.toMap(PersonnelManagementDO::getId, PersonnelManagementDO::getName, (v1, v2) -> v1));
BaseInfoDO baseInfoDO = baseInfoMapper.selectById(id);
baseInfoDO.setManagerName(employeeMap.get(baseInfoDO.getManager()));
return baseInfoDO;
}
@Override

View File

@@ -137,5 +137,6 @@ public interface DeviceInfoService {
DeviceInfoRespVO getDeviceInfoByDp(String baseId);
List<DeviceMonitorDataRespVO> deviceList();
List<DeviceMonitorDataRespVO> deviceList(String plotId);
}

View File

@@ -363,13 +363,16 @@ public class DeviceInfoServiceImpl implements DeviceInfoService {
}
@Override
public List<DeviceMonitorDataRespVO> deviceList() {
Long tenantId = getLoginUser().getTenantId();
public List<DeviceMonitorDataRespVO> deviceList(String plotId) {
LambdaQueryWrapperX<DeviceInfoDO> wrapperX = new LambdaQueryWrapperX<>();
wrapperX.eq(DeviceInfoDO::getTenantId, tenantId);
wrapperX.eq(DeviceInfoDO::getPlotId, plotId);
wrapperX.eq(DeviceInfoDO::getDeleted, CommonConstants.NO_CODE);
List<DeviceInfoDO> doList = deviceInfoMapper.selectList(wrapperX);
return execute(doList);
}
private List<DeviceMonitorDataRespVO> execute(List<DeviceInfoDO> doList) {
Map<String, List<DeviceInfoDO>> groupedByDeviceType = doList.stream().collect(Collectors.groupingBy(DeviceInfoDO::getDeviceType));
Map<String, String> typeCodeMap = deviceClassifyService.getTypeCodeMap();
@@ -389,6 +392,18 @@ public class DeviceInfoServiceImpl implements DeviceInfoService {
return res;
}
@Override
public List<DeviceMonitorDataRespVO> deviceList() {
Long tenantId = getLoginUser().getTenantId();
LambdaQueryWrapperX<DeviceInfoDO> wrapperX = new LambdaQueryWrapperX<>();
wrapperX.eq(DeviceInfoDO::getTenantId, tenantId);
wrapperX.eq(DeviceInfoDO::getDeleted, CommonConstants.NO_CODE);
List<DeviceInfoDO> doList = deviceInfoMapper.selectList(wrapperX);
return execute(doList);
}
private List<DeviceMonitorDataRespVO.Row> getRealTimeList(String typeCode, List<DeviceInfoDO> doList) {
List<DeviceMonitorDataRespVO.Row> rows = new ArrayList<>();

View File

@@ -3,6 +3,7 @@ package cn.iocoder.yudao.module.farm.service.home;
import cn.iocoder.yudao.module.farm.controller.admin.home.vo.BaseNameVO;
import cn.iocoder.yudao.module.farm.controller.admin.home.vo.HomeInfo;
import cn.iocoder.yudao.module.farm.controller.admin.home.vo.OutlinedInfoVO;
import cn.iocoder.yudao.module.farm.controller.admin.home.vo.QrDetailsRespVO;
import java.util.List;
import java.util.Map;
@@ -24,4 +25,10 @@ public interface HomeService {
List<BaseNameVO> getBaseNameList();
/**
* 二维码信息
* @param baseId
* @return
*/
QrDetailsRespVO scanQrCodes(String baseId);
}

View File

@@ -1,15 +1,20 @@
package cn.iocoder.yudao.module.farm.service.home;
import cn.iocoder.yudao.framework.security.core.LoginUser;
import cn.iocoder.yudao.module.farm.controller.admin.digitalcockpit.vo.DeviceMonitorDataRespVO;
import cn.iocoder.yudao.module.farm.controller.admin.home.vo.BaseNameVO;
import cn.iocoder.yudao.module.farm.controller.admin.home.vo.HomeInfo;
import cn.iocoder.yudao.module.farm.controller.admin.home.vo.HomeInfo.*;
import cn.iocoder.yudao.module.farm.controller.admin.home.vo.QrDetailsRespVO;
import cn.iocoder.yudao.module.farm.controller.admin.managementcenter.baseinfo.vo.PlotLesseeDetailsRespVO;
import cn.iocoder.yudao.module.farm.dal.dataobject.baseinfo.BaseInfoDO;
import cn.iocoder.yudao.module.farm.dal.dataobject.plotinfo.PlotInfoDO;
import cn.iocoder.yudao.module.farm.dal.dataobject.productionplan.ProductionPlanDO;
import cn.iocoder.yudao.module.farm.dal.dataobject.specieslibrary.SpeciesLibraryDO;
import cn.iocoder.yudao.module.farm.manager.equipmentproducer.service.DeviceService;
import cn.iocoder.yudao.module.farm.service.baseinfo.BaseInfoService;
import cn.iocoder.yudao.module.farm.service.cropFarmingCenter.CropFarmingCenterService;
import cn.iocoder.yudao.module.farm.service.deviceinfo.DeviceInfoService;
import cn.iocoder.yudao.module.farm.service.farmingrecord.FarmingRecordService;
import cn.iocoder.yudao.module.farm.service.modelmanagement.ModelManagementService;
import cn.iocoder.yudao.module.farm.service.personnelmanagement.PersonnelManagementService;
@@ -46,8 +51,9 @@ public class HomeServiceImpl implements HomeService {
private final ModelManagementService modelManagementService;
private final SpeciesLibraryService speciesLibraryService;
private final FarmingRecordService farmingRecordService;
private final DeviceInfoService deviceService;
public HomeServiceImpl(BaseInfoService baseInfoService, PlotInfoService plotInfoService, ProductionPlanService productionPlanService, CropFarmingCenterService cropFarmingCenterService, PersonnelManagementService personnelManagementService, ModelManagementService modelManagementService, SpeciesLibraryService speciesLibraryService, FarmingRecordService farmingRecordService) {
public HomeServiceImpl(BaseInfoService baseInfoService, PlotInfoService plotInfoService, ProductionPlanService productionPlanService, CropFarmingCenterService cropFarmingCenterService, PersonnelManagementService personnelManagementService, ModelManagementService modelManagementService, SpeciesLibraryService speciesLibraryService, FarmingRecordService farmingRecordService, DeviceInfoService deviceService) {
this.baseInfoService = baseInfoService;
this.plotInfoService = plotInfoService;
this.productionPlanService = productionPlanService;
@@ -56,6 +62,7 @@ public class HomeServiceImpl implements HomeService {
this.modelManagementService = modelManagementService;
this.speciesLibraryService = speciesLibraryService;
this.farmingRecordService = farmingRecordService;
this.deviceService = deviceService;
}
@Override
@@ -100,7 +107,7 @@ public class HomeServiceImpl implements HomeService {
Integer taskCount = productionPlanService.getTodayTaskCount(baseId);
Integer warningCount = 0; // TODO: 2025/9/1 告警数量
Integer iotCount = 0; // TODO: 2025/9/1 物联设备数量
Integer iotCount = deviceService.countDevice(baseId, getLoginUser().getTenantId().toString());
return new StatisticalInfo(taskCount,warningCount,iotCount);
}
@@ -147,6 +154,8 @@ public class HomeServiceImpl implements HomeService {
PlotOrCropInfo plotOrCropInfo = this.getPlotOrCropInfoList(e,"地块详情",employeeName);
// 地块浮框信息
List<PlotPopupFrame> plotPopupFrame = this.getPlotPopupFrame(e.getId(), employeeNameMap);
// 户主流转信息
List<PlotLesseeDetailsRespVO> lesseeList = plotInfoService.getPlotLesseeList(e.getPlotId());
PlotInfo t = new PlotInfo();
t.setBaseId(e.getBaseId());
@@ -159,6 +168,7 @@ public class HomeServiceImpl implements HomeService {
t.setPlotColor(e.getPlotColor());
t.setPlotOrCropInfo(plotOrCropInfo);
t.setPlotPopupFrames(plotPopupFrame);
t.setLesseeList(lesseeList);
targetList.add(t);
}
return targetList;
@@ -171,9 +181,13 @@ public class HomeServiceImpl implements HomeService {
}
String growFlag = predictedArea == 0.0 ? GROW_FLAG_2 : GROW_FLAG_1;
// 在种作物数量
int growingCropCount = productionPlanService.getGrowingCropCount(e.getBaseId(), e.getPlotId());
int growingCropCount = productionPlanService.getNotGrowingCropCount(e.getBaseId(), e.getPlotId());
// 生产计划数量
int taskCount = productionPlanService.getPlanCount(e.getPlotId());
// 设备数量
Integer iotCount = deviceService.countDevice(e.getBaseId() , getLoginUser().getTenantId().toString());
// 物种数量
// int speciesNum = modelManagementService.getSpeciesNum(getLoginUser().getTenantId().toString());
PlotOrCropInfo t = new PlotOrCropInfo();
t.setLabel(label);
@@ -182,10 +196,10 @@ public class HomeServiceImpl implements HomeService {
t.setPlotId(e.getPlotId());
t.setPlotName(e.getPlotName());
t.setGrowFlag(growFlag);
t.setGrowArea(predictedArea);
t.setGrowArea(e.getPlotArea().doubleValue());
t.setBeingCrop(growingCropCount);
t.setTaskCount(taskCount);
t.setLotCount(0); // TODO: 2025/8/31 物联设备数量
t.setLotCount(iotCount);
t.setManager(employeeName);
t.setQrCodeUrl(e.getBaseId());
t.setPlanInfos(this.getPlanInfoList(e.getBaseId(), e.getPlotId(), employeeName));
@@ -247,6 +261,49 @@ public class HomeServiceImpl implements HomeService {
return baseNameList.stream().map(e -> new BaseNameVO(e.getId(), e.getName())).collect(Collectors.toList());
}
@Override
public QrDetailsRespVO scanQrCodes(String baseId) {
BaseInfoDO bObj = baseInfoService.getBaseInfo(baseId);
if (ObjectUtils.isEmpty(bObj)) {
return null;
}
List<QrDetailsRespVO.PlotInfo> plotList = new ArrayList<>();
List<PlotInfoDO> plotInfos = plotInfoService.getPlotInfos(baseId);
for (PlotInfoDO p : plotInfos) {
List<PlotLesseeDetailsRespVO> ls = this.getLs(p.getId());
List<DeviceMonitorDataRespVO> ds = this.getDs(p.getId());
QrDetailsRespVO.PlotInfo targetP = new QrDetailsRespVO.PlotInfo();
targetP.setPlotName(p.getPlotName());
targetP.setPlotManagerName(p.getEmployeeName());
targetP.setPlotArea(p.getPlotArea().intValue());
targetP.setDeviceInfos(ds);
targetP.setLesseeInfos(ls);
plotList.add(targetP);
}
QrDetailsRespVO res = new QrDetailsRespVO();
res.setBaseName(bObj.getName());
res.setBaseManagerName(bObj.getManagerName());
res.setBaseArea(bObj.getArea().intValue());
res.setPlotCount(plotList.size());
res.setPlotInfo(plotList);
return res;
}
private List<PlotLesseeDetailsRespVO> getLs(String plotId) {
List<PlotLesseeDetailsRespVO> res = plotInfoService.getPlotLesseeList(plotId);
return res;
}
private List<DeviceMonitorDataRespVO> getDs(String plotId) {
List<DeviceMonitorDataRespVO> res = deviceService.deviceList(plotId);
return res;
}
private BaseOverviewInfo getCompanyInfo() {
LoginUser user = getLoginUser();
int baseCount = baseInfoService.getBaseCount(user.getTenantId()); // 基地数量

View File

@@ -106,4 +106,11 @@ public interface ModelManagementService {
int getFarmRecordCount(String speciesModelId);
ModelManagementDO getTopQuoteCount();
/**
* 获取物种信息
* @param toString
* @return
*/
int getSpeciesNum(String toString);
}

View File

@@ -617,6 +617,12 @@ public class ModelManagementServiceImpl implements ModelManagementService {
return mostQuoted.orElse(null);
}
@Override
public int getSpeciesNum(String toString) {
return 0;
}
private List<ModelCycleDO> getModelCycleListByModelId(String modelId) {
LambdaQueryWrapperX<ModelCycleDO> wrapperXx = new LambdaQueryWrapperX<>();
wrapperXx.eq(ModelCycleDO::getModelId, modelId);

View File

@@ -2,6 +2,8 @@ package cn.iocoder.yudao.module.farm.service.plotinfo;
import cn.iocoder.yudao.module.farm.controller.admin.managementcenter.baseinfo.vo.PlotInfoPageReqVO;
import cn.iocoder.yudao.module.farm.controller.admin.managementcenter.baseinfo.vo.PlotInfoSaveReqVO;
import cn.iocoder.yudao.module.farm.controller.admin.managementcenter.baseinfo.vo.PlotLesseeDetailsRespVO;
import cn.iocoder.yudao.module.farm.controller.admin.managementcenter.baseinfo.vo.PlotLesseeInfoRespVO;
import cn.iocoder.yudao.module.farm.controller.admin.managementcenter.baseinfo.vo.wx.RegularPlotInfoRespVO;
import cn.iocoder.yudao.module.farm.dal.dataobject.plotinfo.PlotInfoDO;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
@@ -50,6 +52,13 @@ public interface PlotInfoService {
*/
PlotInfoDO getPlotInfo(String id);
/**
* 地块&租户信息
* @param id
* @return
*/
PlotLesseeInfoRespVO getPlotLesseeInfo(String id);
/**
* 通过基地ID获取地块集合
* @param baseId
@@ -104,4 +113,11 @@ public interface PlotInfoService {
int countPlot(String baseId);
Long countPlotByTenantId(String tenantId);
/**
* 获取地块下 有多户主信息
* @param plotId
* @return
*/
List<PlotLesseeDetailsRespVO> getPlotLesseeList(String plotId);
}

View File

@@ -5,26 +5,31 @@ import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
import cn.iocoder.yudao.framework.security.core.LoginUser;
import cn.iocoder.yudao.module.farm.controller.admin.managementcenter.baseinfo.vo.PlotInfoPageReqVO;
import cn.iocoder.yudao.module.farm.controller.admin.managementcenter.baseinfo.vo.PlotInfoSaveReqVO;
import cn.iocoder.yudao.module.farm.controller.admin.managementcenter.baseinfo.vo.*;
import cn.iocoder.yudao.module.farm.controller.admin.managementcenter.baseinfo.vo.wx.RegularPlotInfoRespVO;
import cn.iocoder.yudao.module.farm.dal.dataobject.baseinfo.BaseInfoDO;
import cn.iocoder.yudao.module.farm.dal.dataobject.plotinfo.PlotInfoDO;
import cn.iocoder.yudao.module.farm.dal.dataobject.plotinfo.PlotLesseeDO;
import cn.iocoder.yudao.module.farm.dal.mysql.baseinfo.BaseInfoMapper;
import cn.iocoder.yudao.module.farm.dal.mysql.plotinfo.PlotInfoMapper;
import cn.iocoder.yudao.module.farm.dal.mysql.plotinfo.PlotLesseeMapper;
import cn.iocoder.yudao.module.farm.enums.CommonConstants;
import cn.iocoder.yudao.module.farm.service.personnelmanagement.PersonnelManagementService;
import cn.iocoder.yudao.module.farm.service.productionplan.ProductionPlanService;
import cn.iocoder.yudao.module.farm.utils.StrHelperUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import jakarta.annotation.Resource;
import org.apache.commons.lang3.ObjectUtils;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.validation.annotation.Validated;
import java.math.BigDecimal;
import java.util.List;
import java.util.Map;
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.module.farm.enums.CommonConstants.LEASE_STATUS_MAP;
import static cn.iocoder.yudao.module.farm.enums.ErrorCodeConstants.*;
/**
@@ -36,13 +41,22 @@ import static cn.iocoder.yudao.module.farm.enums.ErrorCodeConstants.*;
@Validated
public class PlotInfoServiceImpl implements PlotInfoService {
@Resource
private BaseInfoMapper baseInfoMapper;
@Resource
private PlotInfoMapper plotInfoMapper;
@Resource
private ProductionPlanService productionPlanService;
private final BaseInfoMapper baseInfoMapper;
private final PlotInfoMapper plotInfoMapper;
private final PlotLesseeMapper plotLesseeMapper;
private final ProductionPlanService productionPlanService;
private final PersonnelManagementService personnelManagementService;
public PlotInfoServiceImpl(BaseInfoMapper baseInfoMapper, PlotInfoMapper plotInfoMapper, PlotLesseeMapper plotLesseeMapper, ProductionPlanService productionPlanService, PersonnelManagementService personnelManagementService) {
this.baseInfoMapper = baseInfoMapper;
this.plotInfoMapper = plotInfoMapper;
this.plotLesseeMapper = plotLesseeMapper;
this.productionPlanService = productionPlanService;
this.personnelManagementService = personnelManagementService;
}
@Transactional
@Override
public String createPlotInfo(PlotInfoSaveReqVO createReqVO) {
LoginUser user = getLoginUser();
@@ -55,10 +69,17 @@ public class PlotInfoServiceImpl implements PlotInfoService {
plotInfo.setTenantId(String.valueOf(user.getTenantId()));
plotInfoMapper.insert(plotInfo);
PlotLesseeSaveReqVO plotLesseeSaveReqVO = createReqVO.getPlotLesseeSaveReqVO();
PlotLesseeDO plotLesseeDO = BeanUtils.toBean(plotLesseeSaveReqVO, PlotLesseeDO.class);
plotLesseeDO.setTenantId(String.valueOf(user.getTenantId()));
plotLesseeDO.setLeaseStatus(CommonConstants.YES_CODE);
plotLesseeMapper.insert(plotLesseeDO);
// 返回
return plotInfo.getId();
}
@Transactional
@Override
public void updatePlotInfo(PlotInfoSaveReqVO updateReqVO) {
// 校验存在
@@ -68,6 +89,17 @@ public class PlotInfoServiceImpl implements PlotInfoService {
// 更新
PlotInfoDO updateObj = BeanUtils.toBean(updateReqVO, PlotInfoDO.class);
plotInfoMapper.updateById(updateObj);
// 重置所有租赁状态为: 未租
List<PlotLesseeDO> doList = plotLesseeMapper.selectList("plot_id", updateReqVO.getId());
doList.forEach(e -> e.setLeaseStatus(CommonConstants.NO_CODE));
plotLesseeMapper.updateBatch(doList);
// 指定当前的租户状态为: 已租
PlotLesseeSaveReqVO plotLesseeSaveReqVO = updateReqVO.getPlotLesseeSaveReqVO();
PlotLesseeDO plotLesseeDO = BeanUtils.toBean(plotLesseeSaveReqVO, PlotLesseeDO.class);
plotLesseeDO.setLeaseStatus(CommonConstants.YES_CODE);
plotLesseeMapper.updateById(plotLesseeDO);
}
@Override
@@ -113,9 +145,36 @@ public class PlotInfoServiceImpl implements PlotInfoService {
return plotInfoDO;
}
@Override
public PlotLesseeInfoRespVO getPlotLesseeInfo(String id) {
LambdaQueryWrapperX<PlotLesseeDO> x = new LambdaQueryWrapperX<>();
x.eq(PlotLesseeDO::getTenantId, getLoginUser().getTenantId().toString());
x.eq(PlotLesseeDO::getDeleted, CommonConstants.NO_CODE);
x.eq(PlotLesseeDO::getLeaseStatus, CommonConstants.YES_CODE);
x.eq(PlotLesseeDO::getPlotId, id);
PlotLesseeDO plotLesseeDO = plotLesseeMapper.selectOne(x);
PlotLesseeDetailsRespVO subLesseeInfo = new PlotLesseeDetailsRespVO();
if (ObjectUtils.isNotEmpty(plotLesseeDO)) {
subLesseeInfo = BeanUtils.toBean(plotLesseeDO, PlotLesseeDetailsRespVO.class);
}
PlotInfoDO plotInfoDO = this.getPlotInfo(id);
PlotLesseeInfoRespVO plotLesseeDetailsRespVO = BeanUtils.toBean(plotInfoDO, PlotLesseeInfoRespVO.class);
plotLesseeDetailsRespVO.setPlotLesseeDetailsRespVO(subLesseeInfo);
plotLesseeDetailsRespVO.setPlotLeaseStatusName(LEASE_STATUS_MAP.get(plotLesseeDetailsRespVO.getPlotLeaseStatus()));
return plotLesseeDetailsRespVO;
}
@Override
public List<PlotInfoDO> getPlotInfos(String baseId) {
return plotInfoMapper.selectList("base_id", baseId);
// 员工集合 <id,name>
Map<String, String> employeeNameMap = personnelManagementService.getEmployeeNameMap();
List<PlotInfoDO> list = plotInfoMapper.selectList("base_id", baseId);
list.forEach(e -> e.setEmployeeName(employeeNameMap.get(e.getEmployeeId())));
return list;
}
@Override
@@ -216,4 +275,15 @@ public class PlotInfoServiceImpl implements PlotInfoService {
wrapperX.eq(PlotInfoDO::getDeleted, CommonConstants.NO_CODE);
return plotInfoMapper.selectCount(wrapperX);
}
@Override
public List<PlotLesseeDetailsRespVO> getPlotLesseeList(String plotId) {
LambdaQueryWrapperX<PlotLesseeDO> x = new LambdaQueryWrapperX<>();
x.eq(PlotLesseeDO::getDeleted, CommonConstants.NO_CODE);
x.eq(PlotLesseeDO::getLeaseStatus, CommonConstants.NO_CODE);
x.eq(PlotLesseeDO::getPlotId, plotId);
List<PlotLesseeDO> list = plotLesseeMapper.selectList(x);
return BeanUtils.toBean(list, PlotLesseeDetailsRespVO.class);
}
}

View File

@@ -0,0 +1,9 @@
package cn.iocoder.yudao.module.farm.service.plotinfo;
/**
* @description: 租赁信息
* @author: binda
* @data: 2025/10/15 13:57
*/
public interface PlotLesseeService {
}

View File

@@ -0,0 +1,19 @@
package cn.iocoder.yudao.module.farm.service.plotinfo;
import cn.iocoder.yudao.module.farm.dal.mysql.plotinfo.PlotLesseeMapper;
import jakarta.annotation.Resource;
import org.springframework.stereotype.Service;
/**
* @description: 租赁信息
* @author: binda
* @date: 2025/10/15 13:57
*/
@Service
public class PlotLesseeServiceImpl implements PlotLesseeService {
@Resource
private PlotLesseeMapper plotLesseeMaper;
}

View File

@@ -129,6 +129,7 @@ public interface ProductionPlanService {
*/
int getGrowingCropCount(String baseId);
int getGrowingCropCount(String baseId,String plotId);
int getNotGrowingCropCount(String baseId, String plotId);
int getGrowingCropCountByTenantId(String tenantId);
/**

View File

@@ -264,6 +264,21 @@ public class ProductionPlanServiceImpl implements ProductionPlanService {
.count();
}
@Override
public int getNotGrowingCropCount(String baseId, String plotId) {
QueryWrapper<ProductionPlanDO> qw = new QueryWrapper<>();
qw.eq("base_id", baseId);
qw.eq("plot_id", plotId);
List<ProductionPlanDO> planList = productionPlanMapper.selectList(qw);
return (int) planList.stream()
.filter(Objects::nonNull)
// .filter(plan -> Objects.equals(plan.getPlanStatus(), PLAN_STATUS_2))
.map(ProductionPlanDO::getPlantSpeciesCode)
.filter(Objects::nonNull)
.distinct()
.count();
}
@Override
public int getGrowingCropCountByTenantId(String tenantId) {
QueryWrapper<ProductionPlanDO> qw = new QueryWrapper<>();