feat (farm): 农事记录,生产计划

- 基地统计信息
- 增加 实际产量字段
This commit is contained in:
达富斌
2025-09-03 15:26:49 +08:00
parent 024249f524
commit 7b904663e9
14 changed files with 154 additions and 14 deletions

View File

@@ -3,10 +3,7 @@ package cn.iocoder.yudao.module.farm.controller.admin.cropFarmingCenter;
import cn.iocoder.yudao.framework.common.pojo.CommonResult; import cn.iocoder.yudao.framework.common.pojo.CommonResult;
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.module.farm.controller.admin.cropFarmingCenter.vo.ProductionPlanRespVO; import cn.iocoder.yudao.module.farm.controller.admin.cropFarmingCenter.vo.*;
import cn.iocoder.yudao.module.farm.controller.admin.cropFarmingCenter.vo.ProductionPlanPage2ReqVO;
import cn.iocoder.yudao.module.farm.controller.admin.cropFarmingCenter.vo.ProductionPlanResp2VO;
import cn.iocoder.yudao.module.farm.controller.admin.cropFarmingCenter.vo.ProductionPlanUpdateReqVO;
import cn.iocoder.yudao.module.farm.controller.admin.farmingrecord.vo.FarmingRecordPageReqVO; import cn.iocoder.yudao.module.farm.controller.admin.farmingrecord.vo.FarmingRecordPageReqVO;
import cn.iocoder.yudao.module.farm.controller.admin.farmingrecord.vo.FarmingRecordRespVO; import cn.iocoder.yudao.module.farm.controller.admin.farmingrecord.vo.FarmingRecordRespVO;
import cn.iocoder.yudao.module.farm.controller.admin.farmingrecord.vo.FarmingRecordSaveReqVO; import cn.iocoder.yudao.module.farm.controller.admin.farmingrecord.vo.FarmingRecordSaveReqVO;
@@ -135,6 +132,13 @@ public class CropFarmingCenterController {
return success(true); return success(true);
} }
@Operation(summary = "生产计划-统计信息")
@GetMapping("/production-plan/statistics")
@Parameter(name = "baseId", description = "基地编号")
public CommonResult<BasePlanOverviewRespVO> getBaseOverview(@RequestParam("baseId") String baseId) {
BasePlanOverviewRespVO res = cropFarmingCenterService.getBaseOverview(baseId);
return success(res);
}
// 农事记录 // 农事记录
@GetMapping("/farming-record/page") @GetMapping("/farming-record/page")
@@ -171,4 +175,12 @@ public class CropFarmingCenterController {
return success(true); return success(true);
} }
@Operation(summary = "农事记录-统计信息")
@GetMapping("/farming-record/statistics")
@Parameter(name = "baseId", description = "基地编号")
public CommonResult<FarmRecordOverviewRespVO> getFarmRecordOverview(@RequestParam("baseId") String baseId) {
FarmRecordOverviewRespVO res = cropFarmingCenterService.getFarmRecordOverview(baseId);
return success(res);
}
} }

View File

@@ -0,0 +1,29 @@
package cn.iocoder.yudao.module.farm.controller.admin.cropFarmingCenter.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/9/3 13:40
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
public class BasePlanOverviewRespVO {
@Schema(description = "总面积")
private BigDecimal totalArea;
@Schema(description = "计划总数")
private Integer planCount;
@Schema(description = "已完成-计划个数")
private Integer planCompletedCount;
@Schema(description = "进行中-计划个数")
private Integer planInProgressCount;
@Schema(description = "逾期-计划个数")
private Integer planOverdueCount;
}

View File

@@ -0,0 +1,23 @@
package cn.iocoder.yudao.module.farm.controller.admin.cropFarmingCenter.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/9/3 14:45
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
public class FarmRecordOverviewRespVO {
@Schema(description = "总面积")
private BigDecimal totalArea;
@Schema(description = "农事总数")
private Integer farmRecordCount;
}

View File

@@ -78,6 +78,10 @@ public class ProductionPlanDO extends BaseDO {
* 预计产量 * 预计产量
*/ */
private Integer predictedYields; private Integer predictedYields;
/**
* 实际产量
*/
private Integer practicalYields;
/** /**
* 总面积 * 总面积
*/ */

View File

@@ -7,6 +7,8 @@ import cn.iocoder.yudao.module.farm.controller.admin.baseinfo.vo.BaseInfoPageReq
import cn.iocoder.yudao.module.farm.dal.dataobject.baseinfo.BaseInfoDO; import cn.iocoder.yudao.module.farm.dal.dataobject.baseinfo.BaseInfoDO;
import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Mapper;
import java.math.BigDecimal;
/** /**
* 基地 Mapper * 基地 Mapper
* *
@@ -27,4 +29,6 @@ public interface BaseInfoMapper extends BaseMapperX<BaseInfoDO> {
} }
int getBaseCount(Long tenantId); int getBaseCount(Long tenantId);
BigDecimal getTotalBaseArea(String id, Long tenantId);
} }

View File

@@ -143,8 +143,9 @@ public class BaseInfoServiceImpl implements BaseInfoService {
List<BaseNameRespVO.PlotInfoVO> childList = new ArrayList<>(); List<BaseNameRespVO.PlotInfoVO> childList = new ArrayList<>();
for (PlotInfoDO aDo : plotInfoDOS) { for (PlotInfoDO aDo : plotInfoDOS) {
if (aDo.getBaseId().equals(key)) { if (aDo.getBaseId().equals(key)) {
double remainingArea = productionPlanService.getPredictedArea(aDo.getBaseId()); BigDecimal plotArea = aDo.getPlotArea();
childList.add(new BaseNameRespVO.PlotInfoVO(aDo.getPlotId(), aDo.getPlotName(), aDo.getPlotArea(), remainingArea)); double remainingArea = productionPlanService.getPredictedArea(aDo.getPlotId(),plotArea);
childList.add(new BaseNameRespVO.PlotInfoVO(aDo.getPlotId(), aDo.getPlotName(), plotArea, remainingArea));
} }
} }
obj.setChildren(childList); obj.setChildren(childList);

View File

@@ -25,6 +25,7 @@ public interface CropFarmingCenterService {
void updateProductionPlan(ProductionPlanUpdateReqVO updateReqVO); void updateProductionPlan(ProductionPlanUpdateReqVO updateReqVO);
PageResult<ProductionPlanRespVO> getProductionPlanPage(ProductionPlanPage2ReqVO reqVO); PageResult<ProductionPlanRespVO> getProductionPlanPage(ProductionPlanPage2ReqVO reqVO);
PageResult<ProductionPlanResp2VO> getProductionPlanPage2(ProductionPlanPage2ReqVO reqVO); PageResult<ProductionPlanResp2VO> getProductionPlanPage2(ProductionPlanPage2ReqVO reqVO);
int getCropCount(Long tenantId); int getCropCount(Long tenantId);
@@ -36,4 +37,8 @@ public interface CropFarmingCenterService {
void reviseProductionPlan(ProductionPlanUpdateReqVO updateReqVO); void reviseProductionPlan(ProductionPlanUpdateReqVO updateReqVO);
void restartProductionPlan(ProductionPlanUpdateReqVO updateReqVO); void restartProductionPlan(ProductionPlanUpdateReqVO updateReqVO);
BasePlanOverviewRespVO getBaseOverview(String baseId);
FarmRecordOverviewRespVO getFarmRecordOverview(String baseId);
} }

View File

@@ -32,6 +32,7 @@ import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.ObjectUtils; import org.apache.commons.lang3.ObjectUtils;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import java.math.BigDecimal;
import java.time.LocalDate; import java.time.LocalDate;
import java.time.Period; import java.time.Period;
import java.time.ZoneId; import java.time.ZoneId;
@@ -297,7 +298,7 @@ public class CropFarmingCenterServiceImpl implements CropFarmingCenterService {
id += nodes.size(); id += nodes.size();
} }
return new PageResult<ProductionPlanResp2VO>(roots, (long) roots.size()); return new PageResult<>(roots, (long) roots.size());
} }
private List<ProductionPlanResp2VO> loopPlanList(ProductionPlanResp2VO currentParentNode, private List<ProductionPlanResp2VO> loopPlanList(ProductionPlanResp2VO currentParentNode,
@@ -328,7 +329,7 @@ public class CropFarmingCenterServiceImpl implements CropFarmingCenterService {
subNode.setPredictedYields(subPlan.getPredictedYields()); subNode.setPredictedYields(subPlan.getPredictedYields());
subNode.setOverdueDays(this.countOverdueDays(subPlan)); subNode.setOverdueDays(this.countOverdueDays(subPlan));
subNode.setIntervalDays(this.countIntervalDays(subPlan)); subNode.setIntervalDays(this.countIntervalDays(subPlan));
subNode.setPlanOverview(this.getPlanOverview(subPlan)); // subNode.setPlanOverview(this.getPlanOverview(subPlan));
subNode.setModelInfo(this.getModelManagement(subPlan, employeeNameMap)); subNode.setModelInfo(this.getModelManagement(subPlan, employeeNameMap));
nodes.add(subNode); nodes.add(subNode);
@@ -370,7 +371,7 @@ public class CropFarmingCenterServiceImpl implements CropFarmingCenterService {
modelInfo.setCycleName(modelManagementDo.getCycleName()); modelInfo.setCycleName(modelManagementDo.getCycleName());
modelInfo.setPredictedArea(planObj.getPredictedArea()); modelInfo.setPredictedArea(planObj.getPredictedArea());
modelInfo.setPredictedYields(planObj.getPredictedYields()); modelInfo.setPredictedYields(planObj.getPredictedYields());
modelInfo.setProgressBar("1/10"); // TODO: 2025/8/30 modelInfo.setProgressBar("1/10"); // TODO: 2025/8/30 农事记录
modelInfo.setProgressRatio("10"); // TODO: 2025/8/31 modelInfo.setProgressRatio("10"); // TODO: 2025/8/31
modelInfo.setProgressNumerator(1); modelInfo.setProgressNumerator(1);
modelInfo.setProgressDenominator(10); modelInfo.setProgressDenominator(10);
@@ -497,4 +498,30 @@ public class CropFarmingCenterServiceImpl implements CropFarmingCenterService {
public void restartProductionPlan(ProductionPlanUpdateReqVO updateReqVO) { public void restartProductionPlan(ProductionPlanUpdateReqVO updateReqVO) {
} }
@Override
public BasePlanOverviewRespVO getBaseOverview(String baseId) {
LoginUser user = getLoginUser();
Long tenantId = user.getTenantId();
BigDecimal totalArea = baseInfoMapper.getTotalBaseArea(baseId,tenantId);
if (totalArea != null) {
ProductionPlanRespVO.PlanOverview source = productionPlanMapper.getPlanOverview(baseId);
source.setTotalArea(totalArea);
return BeanUtils.toBean(source, BasePlanOverviewRespVO.class);
} else {
return null;
}
}
@Override
public FarmRecordOverviewRespVO getFarmRecordOverview(String baseId) {
LoginUser user = getLoginUser();
Long tenantId = user.getTenantId();
BigDecimal totalArea = baseInfoMapper.getTotalBaseArea(baseId,tenantId);
int farmRecordCount = farmingRecordService.getFarmRecordOverview(baseId);
return new FarmRecordOverviewRespVO(totalArea,farmRecordCount);
}
} }

View File

@@ -73,4 +73,6 @@ public interface FarmingRecordService {
List<FarmingRecordDO> getFarmingRecordList(); List<FarmingRecordDO> getFarmingRecordList();
void createFarmingRecordList(List<FarmingRecordSaveReqVO> farmingRecordSaveReqVOList); void createFarmingRecordList(List<FarmingRecordSaveReqVO> farmingRecordSaveReqVOList);
int getFarmRecordOverview(String baseId);
} }

View File

@@ -13,6 +13,7 @@ import cn.iocoder.yudao.module.farm.dal.dataobject.farmingtypemaintenance.Farmin
import cn.iocoder.yudao.module.farm.dal.mysql.farmingrecord.FarmingRecordMapper; import cn.iocoder.yudao.module.farm.dal.mysql.farmingrecord.FarmingRecordMapper;
import cn.iocoder.yudao.module.farm.dal.mysql.farmingrecordinput.FarmingRecordInputMapper; import cn.iocoder.yudao.module.farm.dal.mysql.farmingrecordinput.FarmingRecordInputMapper;
import cn.iocoder.yudao.module.farm.dal.mysql.farmingtypemaintenance.FarmingTypeMaintenanceMapper; import cn.iocoder.yudao.module.farm.dal.mysql.farmingtypemaintenance.FarmingTypeMaintenanceMapper;
import com.baomidou.mybatisplus.core.conditions.Wrapper;
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;
@@ -227,4 +228,17 @@ public class FarmingRecordServiceImpl implements FarmingRecordService {
public void createFarmingRecordList(List<FarmingRecordSaveReqVO> farmingRecordSaveReqVOList) { public void createFarmingRecordList(List<FarmingRecordSaveReqVO> farmingRecordSaveReqVOList) {
} }
@Override
public int getFarmRecordOverview(String baseId) {
LoginUser user = getLoginUser();
Long tenantId = user.getTenantId();
LambdaQueryWrapperX<FarmingRecordDO> x = new LambdaQueryWrapperX<>();
x.eqIfPresent(FarmingRecordDO::getBaseId, baseId);
x.eq(FarmingRecordDO::getTenantId, tenantId);
Long count = farmingRecordMapper.selectCount(x);
return count.intValue();
}
} }

View File

@@ -128,7 +128,7 @@ public interface ProductionPlanService {
* @param baseId * @param baseId
* @return * @return
*/ */
double getPredictedArea(String baseId); double getPredictedArea(String plotId,BigDecimal plotArea);
/** /**
* 获取在种地块面积 * 获取在种地块面积

View File

@@ -253,13 +253,14 @@ public class ProductionPlanServiceImpl implements ProductionPlanService {
} }
@Override @Override
public double getPredictedArea(String baseId) { public double getPredictedArea(String plotId,BigDecimal plotArea) {
List<ProductionPlanDO> planList = productionPlanMapper.selectList("base_id", baseId); List<ProductionPlanDO> planList = productionPlanMapper.selectList("plot_id", plotId);
return planList.stream() double sum = planList.stream()
.filter(e -> Objects.equals(e.getPlanStatus(), PLAN_STATUS_2)) .filter(e -> Objects.equals(e.getPlanStatus(), PLAN_STATUS_2))
.mapToDouble(ProductionPlanDO::getPredictedArea) .mapToDouble(ProductionPlanDO::getPredictedArea)
.sum(); .sum();
return plotArea.subtract(BigDecimal.valueOf(sum)).doubleValue();
} }
@Override @Override

View File

@@ -15,4 +15,17 @@
where tenant_id = #{tenantId} where tenant_id = #{tenantId}
and deleted = 0 and deleted = 0
</select> </select>
<select id="getTotalBaseArea" resultType="java.math.BigDecimal">
SELECT
SUM(area) AS total_area
FROM
farm_base_info
<where>
deleted = b'0'
<if test="id != null and id != ''">
AND id = #{id}
</if>
</where>
</select>
</mapper> </mapper>

View File

@@ -33,7 +33,12 @@
SUM(CASE WHEN plan_status = 2 THEN 1 ELSE 0 END) AS planInProgressCount, SUM(CASE WHEN plan_status = 2 THEN 1 ELSE 0 END) AS planInProgressCount,
SUM(CASE WHEN plan_status = 4 THEN 1 ELSE 0 END) AS planOverdueCount SUM(CASE WHEN plan_status = 4 THEN 1 ELSE 0 END) AS planOverdueCount
FROM farm_production_plan FROM farm_production_plan
WHERE base_id IS NOT NULL AND deleted = 0 AND base_id = #{baseId} <where>
deleted = 0
<if test="baseId != null and baseId != ''">
AND base_id = #{baseId}
</if>
</where>
GROUP BY base_id GROUP BY base_id
</select> </select>
</mapper> </mapper>