feat (farm): 基地规划
- 首次进入加载所有的基地信息
This commit is contained in:
@@ -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)
|
||||||
|
|||||||
@@ -4,8 +4,9 @@ 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")
|
@Schema(description = "管理后台 - 基地 Response VO")
|
||||||
@@ -37,8 +38,46 @@ public class BaseInfoRespVO {
|
|||||||
@ExcelProperty("创建时间")
|
@ExcelProperty("创建时间")
|
||||||
private LocalDateTime createTime;
|
private LocalDateTime createTime;
|
||||||
|
|
||||||
@Schema(description = "租户编号", example = "27629")
|
@Schema(description = "租户编号", example = "1")
|
||||||
@ExcelProperty("租户编号")
|
@ExcelProperty("租户编号")
|
||||||
private String tenantId;
|
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;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -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;
|
||||||
|
|
||||||
|
}
|
||||||
@@ -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;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -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);
|
||||||
}
|
}
|
||||||
@@ -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();
|
||||||
}
|
}
|
||||||
@@ -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);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
@@ -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>
|
||||||
Reference in New Issue
Block a user