feat (farm): 基地规划

- 首次进入加载所有的基地信息
This commit is contained in:
达富斌
2025-08-27 17:26:00 +08:00
parent 83a2828d0d
commit 36091b8368
8 changed files with 256 additions and 54 deletions

View File

@@ -1,9 +1,6 @@
package cn.iocoder.yudao.module.farm.controller.admin.baseinfo; package cn.iocoder.yudao.module.farm.controller.admin.baseinfo;
import cn.iocoder.yudao.module.farm.controller.admin.baseinfo.vo.BaseInfoPageReqVO; import cn.iocoder.yudao.module.farm.controller.admin.baseinfo.vo.*;
import cn.iocoder.yudao.module.farm.controller.admin.baseinfo.vo.BaseInfoRespVO;
import cn.iocoder.yudao.module.farm.controller.admin.baseinfo.vo.BaseInfoSaveReqVO;
import cn.iocoder.yudao.module.farm.controller.admin.baseinfo.vo.BaseNameRespVO;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
import jakarta.validation.Valid; import jakarta.validation.Valid;
import jakarta.servlet.http.HttpServletResponse; import jakarta.servlet.http.HttpServletResponse;
@@ -92,6 +89,13 @@ public class BaseInfoController {
return success(BeanUtils.toBean(pageResult, BaseInfoRespVO.class)); return success(BeanUtils.toBean(pageResult, BaseInfoRespVO.class));
} }
@GetMapping("/base-overview")
@Operation(summary = "租户所属基地列表")
public CommonResult<TenantInfoRespVO> getBaseOverviewInfo() {
TenantInfoRespVO res = baseInfoService.getBaseOverviewInfo();
return success(res);
}
@GetMapping("/export-excel") @GetMapping("/export-excel")
@Operation(summary = "导出基地 Excel") @Operation(summary = "导出基地 Excel")
@ApiAccessLog(operateType = EXPORT) @ApiAccessLog(operateType = EXPORT)

View File

@@ -1,44 +1,83 @@
package cn.iocoder.yudao.module.farm.controller.admin.baseinfo.vo; package cn.iocoder.yudao.module.farm.controller.admin.baseinfo.vo;
import io.swagger.v3.oas.annotations.media.Schema; import io.swagger.v3.oas.annotations.media.Schema;
import lombok.*; import lombok.*;
import java.math.BigDecimal; import java.math.BigDecimal;
import org.springframework.format.annotation.DateTimeFormat; import java.time.LocalDateTime;
import java.time.LocalDateTime; import java.util.List;
import cn.idev.excel.annotation.*;
import cn.idev.excel.annotation.*;
@Schema(description = "管理后台 - 基地 Response VO")
@Data @Schema(description = "管理后台 - 基地 Response VO")
@ExcelIgnoreUnannotated @Data
public class BaseInfoRespVO { @ExcelIgnoreUnannotated
public class BaseInfoRespVO {
@Schema(description = "基地id", requiredMode = Schema.RequiredMode.REQUIRED, example = "13189")
@ExcelProperty("基地id") @Schema(description = "基地id", requiredMode = Schema.RequiredMode.REQUIRED, example = "13189")
private String id; @ExcelProperty("基地id")
private String id;
@Schema(description = "基地名称", example = "张三")
@ExcelProperty("基地名称") @Schema(description = "基地名称", example = "张三")
private String name; @ExcelProperty("基地名称")
private String name;
@Schema(description = "用户id用,隔开")
@ExcelProperty("用户id用,隔开") @Schema(description = "用户id用,隔开")
private String manager; @ExcelProperty("用户id用,隔开")
private String manager;
@Schema(description = "面积")
@ExcelProperty("面积") @Schema(description = "面积")
private BigDecimal area; @ExcelProperty("面积")
private BigDecimal area;
@Schema(description = "json字符串保存")
@ExcelProperty("json字符串保存") @Schema(description = "json字符串保存")
private String point; @ExcelProperty("json字符串保存")
private String point;
@Schema(description = "创建时间")
@ExcelProperty("创建时间") @Schema(description = "创建时间")
private LocalDateTime createTime; @ExcelProperty("创建时间")
private LocalDateTime createTime;
@Schema(description = "租户编号", example = "27629")
@ExcelProperty("租户编号") @Schema(description = "租户编号", example = "1")
private String tenantId; @ExcelProperty("租户编号")
private String tenantId;
}
@Schema(description = "基地概述信息")
private BaseInfo baseOverview;
@Schema(description = "地块概述信息")
private List<PlotInfo> plotOverviewList;
@Data
@AllArgsConstructor
@NoArgsConstructor
public static class BaseInfo{
@Schema(description = "基地id")
private String id;
@Schema(description = "基地名称")
private String name;
@Schema(description = "基地面积")
private BigDecimal areaCount;
@Schema(description = "在种作物数量")
private Integer cropCount;
@Schema(description = "在种地块数量")
private Integer plotCount;
@Schema(description = "在种地块占比")
private Integer plotRatio;
}
@Data
@AllArgsConstructor
@NoArgsConstructor
public static class PlotInfo{
@Schema(description = "地块ID")
private String plotId;
@Schema(description = "地块名称")
private String plotName;
@Schema(description = "地块面积")
private BigDecimal plotArea;
@Schema(description = "地块负责人")
private String plotManager;
}
}

View File

@@ -0,0 +1,32 @@
package cn.iocoder.yudao.module.farm.controller.admin.baseinfo.vo;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.math.BigDecimal;
/**
* @description:
* @author: binda
* @date: 2025/8/26 23:18
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
public class BaseOverviewRespVO {
@Schema(description = "商户所属-基地数量")
private Integer baseCount;
@Schema(description = "商户所属-在种作物数量")
private Integer cropCount;
@Schema(description = "商户所属-基地总面积")
private BigDecimal areaCount;
@Schema(description = "商户所属-员工数量")
private BigDecimal employeeCount;
}

View File

@@ -0,0 +1,41 @@
package cn.iocoder.yudao.module.farm.controller.admin.baseinfo.vo;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.math.BigDecimal;
import java.util.List;
/**
* @description: 租户-基地信息
* @author: binda
* @date: 2025/8/27 16:02
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
public class TenantInfoRespVO {
@Schema(description = "租户概述信息")
private TenantInfo tenantInfo;
@Schema(description = "基地信息集合")
private List<BaseInfoRespVO> baseList;
@Data
@AllArgsConstructor
@NoArgsConstructor
public static class TenantInfo {
@Schema(description = "商户所属-基地总数")
private Integer baseCount;
@Schema(description = "商户所属-在种作物总数")
private Integer cropCount;
@Schema(description = "商户所属-基地总面积")
private BigDecimal areaCount;
@Schema(description = "商户所属-员工总数")
private Integer employeeCount;
}
}

View File

@@ -6,6 +6,7 @@ import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
import cn.iocoder.yudao.module.farm.controller.admin.specieslibrary.vo.SpeciesLibraryPageReqVO; import cn.iocoder.yudao.module.farm.controller.admin.specieslibrary.vo.SpeciesLibraryPageReqVO;
import cn.iocoder.yudao.module.farm.dal.dataobject.specieslibrary.SpeciesLibraryDO; import cn.iocoder.yudao.module.farm.dal.dataobject.specieslibrary.SpeciesLibraryDO;
import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
/** /**
* 物种库维护 Mapper * 物种库维护 Mapper
@@ -33,4 +34,5 @@ public interface SpeciesLibraryMapper extends BaseMapperX<SpeciesLibraryDO> {
.orderByDesc(SpeciesLibraryDO::getCreateTime)); .orderByDesc(SpeciesLibraryDO::getCreateTime));
} }
int getSpeciesCount(@Param("tenantId") long tenantId,@Param("baseId") String baseId);
} }

View File

@@ -1,9 +1,7 @@
package cn.iocoder.yudao.module.farm.service.baseinfo; package cn.iocoder.yudao.module.farm.service.baseinfo;
import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.module.farm.controller.admin.baseinfo.vo.BaseInfoPageReqVO; import cn.iocoder.yudao.module.farm.controller.admin.baseinfo.vo.*;
import cn.iocoder.yudao.module.farm.controller.admin.baseinfo.vo.BaseInfoSaveReqVO;
import cn.iocoder.yudao.module.farm.controller.admin.baseinfo.vo.BaseNameRespVO;
import cn.iocoder.yudao.module.farm.dal.dataobject.baseinfo.BaseInfoDO; import cn.iocoder.yudao.module.farm.dal.dataobject.baseinfo.BaseInfoDO;
import jakarta.validation.Valid; import jakarta.validation.Valid;
@@ -70,4 +68,10 @@ public interface BaseInfoService {
List<BaseNameRespVO> getBaseNameList(); List<BaseNameRespVO> getBaseNameList();
List<BaseInfoDO> getList(@Valid BaseInfoPageReqVO pageReqVO); List<BaseInfoDO> getList(@Valid BaseInfoPageReqVO pageReqVO);
/**
* 租户与基地
* @return
*/
TenantInfoRespVO getBaseOverviewInfo();
} }

View File

@@ -4,18 +4,22 @@ 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.baseinfo.vo.BaseInfoPageReqVO; import cn.iocoder.yudao.module.farm.controller.admin.baseinfo.vo.*;
import cn.iocoder.yudao.module.farm.controller.admin.baseinfo.vo.BaseInfoSaveReqVO;
import cn.iocoder.yudao.module.farm.controller.admin.baseinfo.vo.BaseNameRespVO;
import cn.iocoder.yudao.module.farm.dal.dataobject.baseinfo.BaseInfoDO; import cn.iocoder.yudao.module.farm.dal.dataobject.baseinfo.BaseInfoDO;
import cn.iocoder.yudao.module.farm.dal.dataobject.personnelmanagement.PersonnelManagementDO;
import cn.iocoder.yudao.module.farm.dal.dataobject.plotinfo.PlotInfoDO; import cn.iocoder.yudao.module.farm.dal.dataobject.plotinfo.PlotInfoDO;
import cn.iocoder.yudao.module.farm.dal.mysql.baseinfo.BaseInfoMapper; import cn.iocoder.yudao.module.farm.dal.mysql.baseinfo.BaseInfoMapper;
import cn.iocoder.yudao.module.farm.dal.mysql.personnelmanagement.PersonnelManagementMapper;
import cn.iocoder.yudao.module.farm.dal.mysql.plotinfo.PlotInfoMapper; import cn.iocoder.yudao.module.farm.dal.mysql.plotinfo.PlotInfoMapper;
import cn.iocoder.yudao.module.farm.dal.mysql.productionplan.ProductionPlanMapper;
import cn.iocoder.yudao.module.farm.dal.mysql.specieslibrary.SpeciesLibraryMapper;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import jakarta.annotation.Resource; import jakarta.annotation.Resource;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.validation.annotation.Validated; import org.springframework.validation.annotation.Validated;
import java.math.BigDecimal;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
@@ -38,6 +42,13 @@ public class BaseInfoServiceImpl implements BaseInfoService {
private BaseInfoMapper baseInfoMapper; private BaseInfoMapper baseInfoMapper;
@Resource @Resource
private PlotInfoMapper plotInfoMapper; private PlotInfoMapper plotInfoMapper;
@Resource
private ProductionPlanMapper productionPlanMapper;
@Resource
private SpeciesLibraryMapper speciesLibraryMapper;
@Resource
private PersonnelManagementMapper personnelManagementMapper;
@Override @Override
public String createBaseInfo(BaseInfoSaveReqVO createReqVO) { public String createBaseInfo(BaseInfoSaveReqVO createReqVO) {
@@ -132,4 +143,63 @@ public class BaseInfoServiceImpl implements BaseInfoService {
return baseInfoMapper.selectList(qw); return baseInfoMapper.selectList(qw);
} }
@Override
public TenantInfoRespVO getBaseOverviewInfo() {
long tenantId = getLoginUser().getTenantId();
// 人员管理
List<PersonnelManagementDO> personnels = personnelManagementMapper.selectList("tenant_id", tenantId);
int employeeCount = personnels.size();
Map<String, String> employeeMap = personnels.stream().collect(Collectors.toMap(PersonnelManagementDO::getId, PersonnelManagementDO::getName, (v1, v2) -> v1));
// 租户
TenantInfoRespVO.TenantInfo tenantInfo = this.getTenantInfo(tenantId, employeeCount);
// 基地
List<BaseInfoDO> pageResult = this.getList(new BaseInfoPageReqVO());
List<BaseInfoRespVO> baseList = BeanUtils.toBean(pageResult, BaseInfoRespVO.class);
this.packageBaseInfo(tenantId,baseList, employeeMap);
return new TenantInfoRespVO(tenantInfo, baseList);
}
private TenantInfoRespVO.TenantInfo getTenantInfo(long tenantId, Integer employeeCount) {
// 基地总数
Integer baseCount = baseInfoMapper.getBaseCount(tenantId);
// 在种作物总数
Integer cropCount = speciesLibraryMapper.getSpeciesCount(tenantId,"");
// 基地总面积
QueryWrapper<BaseInfoDO> wrapper = new QueryWrapper<>();
wrapper.eq("tenant_id", tenantId);
wrapper.select("SUM(area) as total_area");
Object result = baseInfoMapper.selectObjs(wrapper).stream().findFirst().orElse(BigDecimal.ZERO);
BigDecimal areaCount = (BigDecimal) result;
return new TenantInfoRespVO.TenantInfo(baseCount, cropCount, areaCount, employeeCount);
}
private void packageBaseInfo(long tenantId,List<BaseInfoRespVO> respVOS, Map<String, String> employeeMap) {
for (BaseInfoRespVO obj : respVOS) {
String baseId = obj.getId();
String baseName = obj.getName();
BigDecimal baseArea = obj.getArea();
// 在种作物数量
Integer cropCount = speciesLibraryMapper.getSpeciesCount(tenantId,baseId);;
// 在种地块数量
Integer plotCount = 0; // todo
// 在种地块占比
Integer plotRatio = 0; // todo
obj.setBaseOverview(new BaseInfoRespVO.BaseInfo(baseId,baseName,baseArea,cropCount,plotCount,plotRatio));
// 地块集合
List<BaseInfoRespVO.PlotInfo> targetList = new ArrayList<>();
List<PlotInfoDO> plotList = plotInfoMapper.selectList("base_id", baseId);
for (PlotInfoDO aDo : plotList) {
String plotManager = employeeMap.getOrDefault(aDo.getEmployeeId(), "系统");
BaseInfoRespVO.PlotInfo target = new BaseInfoRespVO.PlotInfo(aDo.getPlotId(), aDo.getPlotName(), aDo.getPlotArea(), plotManager);
targetList.add(target);
}
obj.setPlotOverviewList(targetList);
}
}
} }

View File

@@ -9,4 +9,14 @@
文档可见:https://www.iocoder.cn/MyBatis/x-plugins/ 文档可见:https://www.iocoder.cn/MyBatis/x-plugins/
--> -->
<select id="getSpeciesCount" parameterType="Long" resultType="java.lang.Integer">
SELECT count(*)
FROM farm_species_library
<where>
deleted = 0
<if test="tenantId != null and tenantId !=''">AND tenant_id = #{tenantId}</if>
<if test="baseId != null and baseId !=''">AND base_id = #{baseId}</if>
</where>
</select>
</mapper> </mapper>