feat (farm): 种植中心-生产计划

- 开始, 结束 ,重启, 删除 按钮
This commit is contained in:
达富斌
2025-08-26 16:11:28 +08:00
parent f9a191ac8d
commit cd6b05f553
10 changed files with 148 additions and 47 deletions

View File

@@ -9,9 +9,11 @@ import cn.iocoder.yudao.module.farm.controller.admin.farmingrecord.vo.FarmingRec
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;
import cn.iocoder.yudao.module.farm.dal.dataobject.farmingrecord.FarmingRecordDO; import cn.iocoder.yudao.module.farm.dal.dataobject.farmingrecord.FarmingRecordDO;
import cn.iocoder.yudao.module.farm.enums.CommonConstants;
import cn.iocoder.yudao.module.farm.service.cropFarmingCenter.CropFarmingCenterService; import cn.iocoder.yudao.module.farm.service.cropFarmingCenter.CropFarmingCenterService;
import cn.iocoder.yudao.module.farm.service.farmingrecord.FarmingRecordService; import cn.iocoder.yudao.module.farm.service.farmingrecord.FarmingRecordService;
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.tags.Tag; import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.validation.Valid; import jakarta.validation.Valid;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
@@ -45,14 +47,11 @@ public class CropFarmingCenterController {
this.farmingRecordService = farmingRecordService; this.farmingRecordService = farmingRecordService;
} }
// 生产计划 // 生产计划
@GetMapping("/production-plan/page") @GetMapping("/production-plan/page")
@Operation(summary = "生产计划-分页") @Operation(summary = "生产计划-分页")
public CommonResult<ProductionPlanPageRespVO> getProductionPlanPage(@Valid cn.iocoder.yudao.module.farm.controller.admin.cropFarmingCenter.vo.ProductionPlanPageReqVO pageReqVO) { public CommonResult<PageResult<ProductionPlanPageRespVO>> getProductionPlanPage(@Valid cn.iocoder.yudao.module.farm.controller.admin.cropFarmingCenter.vo.ProductionPlanPageReqVO pageReqVO) {
ProductionPlanPageRespVO pageResult = cropFarmingCenterService.getProductionPlanPage(pageReqVO); return success(cropFarmingCenterService.getProductionPlanPage(pageReqVO));
return success(pageResult);
} }
@GetMapping("/production-plan/get/{id}") @GetMapping("/production-plan/get/{id}")
@@ -77,6 +76,38 @@ public class CropFarmingCenterController {
} }
@DeleteMapping("/production-plan/delete")
@Operation(summary = "删除种植中心-生产计划-生产计划")
@Parameter(name = "id", description = "编号", required = true)
public CommonResult<Boolean> deleteProductionPlan(@RequestParam("id") String id) {
cropFarmingCenterService.deleteProductionPlan(id);
return success(true);
}
@Operation(summary = "生产计划-重启按钮")
@PutMapping("/production-plan/restart")
public CommonResult<Boolean> restartPlanning(@RequestBody ProductionPlanUpdateReqVO updateReqVO) {
updateReqVO.setPlanStatus(CommonConstants.PLAN_STATUS_2);
cropFarmingCenterService.updateProductionPlan(updateReqVO);
return success(true);
}
@Operation(summary = "生产计划-开始按钮")
@PutMapping("/production-plan/start")
public CommonResult<Boolean> startPlanning(@RequestBody ProductionPlanUpdateReqVO updateReqVO) {
updateReqVO.setPlanStatus(CommonConstants.PLAN_STATUS_2);
cropFarmingCenterService.updateProductionPlan(updateReqVO);
return success(true);
}
@Operation(summary = "生产计划-结束按钮")
@PutMapping("/production-plan/finish")
public CommonResult<Boolean> finishPlanning(@RequestBody ProductionPlanUpdateReqVO updateReqVO) {
updateReqVO.setPlanStatus(CommonConstants.PLAN_STATUS_3);
cropFarmingCenterService.updateProductionPlan(updateReqVO);
return success(true);
}
// 农事记录 // 农事记录
@GetMapping("/farming-record/page") @GetMapping("/farming-record/page")
@Operation(summary = "农事记录-分页") @Operation(summary = "农事记录-分页")

View File

@@ -1,12 +1,11 @@
package cn.iocoder.yudao.module.farm.controller.admin.cropFarmingCenter.vo; package cn.iocoder.yudao.module.farm.controller.admin.cropFarmingCenter.vo;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import io.swagger.v3.oas.annotations.media.Schema; import io.swagger.v3.oas.annotations.media.Schema;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;
import lombok.Data; import lombok.Data;
import lombok.NoArgsConstructor; import lombok.NoArgsConstructor;
import java.math.BigDecimal; import java.util.List;
/** /**
* @description: 分页响应实体 * @description: 分页响应实体
@@ -18,27 +17,11 @@ import java.math.BigDecimal;
@NoArgsConstructor @NoArgsConstructor
public class ProductionPlanPageRespVO { public class ProductionPlanPageRespVO {
@Schema(description = "基地ID")
@Schema(description = "分页数据") private String baseId;
private PageResult<ProductionPlanRespVO> list; @Schema(description = "基地名称")
private String baseName;
@Schema(description = "计划概括信息") @Schema(description = "生产计划集合")
private PlanOverview planOverview; private List<ProductionPlanRespVO> plans;
@Data
@AllArgsConstructor
@NoArgsConstructor
public static class PlanOverview{
@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

@@ -1,11 +1,13 @@
package cn.iocoder.yudao.module.farm.controller.admin.cropFarmingCenter.vo; package cn.iocoder.yudao.module.farm.controller.admin.cropFarmingCenter.vo;
import cn.iocoder.yudao.module.farm.controller.admin.modelmanagement.vo.ModelManagementRespVO; import cn.iocoder.yudao.module.farm.controller.admin.modelmanagement.vo.ModelManagementRespVO;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.v3.oas.annotations.media.Schema; import io.swagger.v3.oas.annotations.media.Schema;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;
import lombok.Data; import lombok.Data;
import lombok.NoArgsConstructor; import lombok.NoArgsConstructor;
import java.math.BigDecimal;
import java.time.LocalDate; import java.time.LocalDate;
/** /**
@@ -31,14 +33,25 @@ public class ProductionPlanRespVO {
private String speciesModelId; private String speciesModelId;
@Schema(description = "排产开始日期") @Schema(description = "排产开始日期")
@JsonFormat(pattern = "yyyy-MM-dd")
private LocalDate productionStartDate; private LocalDate productionStartDate;
@Schema(description = "排产结束日期") @Schema(description = "排产结束日期")
@JsonFormat(pattern = "yyyy-MM-dd")
private LocalDate productionEndDate; private LocalDate productionEndDate;
@Schema(description = "采收开始日期") @Schema(description = "采收开始日期")
@JsonFormat(pattern = "yyyy-MM-dd")
private LocalDate harvestStartDate; private LocalDate harvestStartDate;
@Schema(description = "计划开始日期")
@JsonFormat(pattern = "yyyy-MM-dd")
private LocalDate plantingStartDate;
@Schema(description = "计划结束日期")
@JsonFormat(pattern = "yyyy-MM-dd")
private LocalDate plantingEndDate;
@Schema(description = "计划执行状态") @Schema(description = "计划执行状态")
private Integer planStatus; private Integer planStatus;
@Schema(description = "计划执行状态-名称") @Schema(description = "计划执行状态-名称")
@@ -60,6 +73,7 @@ public class ProductionPlanRespVO {
* 种植区域信息 * 种植区域信息
*/ */
@Schema(description = "种植日期") @Schema(description = "种植日期")
@JsonFormat(pattern = "yyyy-MM-dd")
private LocalDate plantingDate; private LocalDate plantingDate;
@Schema(description = "种植株数") @Schema(description = "种植株数")
private Integer plantingQuantity; private Integer plantingQuantity;
@@ -76,7 +90,26 @@ public class ProductionPlanRespVO {
@Schema(description = "备注") @Schema(description = "备注")
private String remark; private String remark;
@Schema(description = "模型", example = "芋艿") @Schema(description = "模型")
private ModelManagementRespVO modelManagementRespVO; private ModelManagementRespVO modelManagementRespVO;
@Schema(description = "计划概括信息")
private ProductionPlanRespVO.PlanOverview planOverview;
@Data
@AllArgsConstructor
@NoArgsConstructor
public static class PlanOverview{
@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

@@ -35,6 +35,12 @@ public class ProductionPlanUpdateReqVO {
@Schema(description = "采收开始日期") @Schema(description = "采收开始日期")
private LocalDate harvestStartDate; private LocalDate harvestStartDate;
@Schema(description = "计划开始日期")
private LocalDate plantingStartDate;
@Schema(description = "计划结束日期")
private LocalDate plantingEndDate;
@Schema(description = "计划执行状态 (1:未开始;2:进行中;3:已完成;4:逾期)") @Schema(description = "计划执行状态 (1:未开始;2:进行中;3:已完成;4:逾期)")
private Integer planStatus; private Integer planStatus;

View File

@@ -52,6 +52,14 @@ public class ProductionPlanDO extends BaseDO {
* 采收开始日期 * 采收开始日期
*/ */
private LocalDate harvestStartDate; private LocalDate harvestStartDate;
/**
* 计划开始日期
*/
private LocalDate plantingStartDate;
/**
* 计划结束日期
*/
private LocalDate plantingEndDate;
/** /**
* 执行状态 * 执行状态
*/ */

View File

@@ -3,7 +3,7 @@ package cn.iocoder.yudao.module.farm.dal.mysql.productionplan;
import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX; 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.cropFarmingCenter.vo.ProductionPlanPageRespVO; import cn.iocoder.yudao.module.farm.controller.admin.cropFarmingCenter.vo.ProductionPlanRespVO;
import cn.iocoder.yudao.module.farm.controller.admin.productionplan.vo.ProductionPlanPageReqVO; import cn.iocoder.yudao.module.farm.controller.admin.productionplan.vo.ProductionPlanPageReqVO;
import cn.iocoder.yudao.module.farm.dal.dataobject.productionplan.ProductionPlanDO; import cn.iocoder.yudao.module.farm.dal.dataobject.productionplan.ProductionPlanDO;
import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Mapper;
@@ -36,12 +36,16 @@ public interface ProductionPlanMapper extends BaseMapperX<ProductionPlanDO> {
default PageResult<ProductionPlanDO> selectPage2(cn.iocoder.yudao.module.farm.controller.admin.cropFarmingCenter.vo.ProductionPlanPageReqVO reqVO) { default PageResult<ProductionPlanDO> selectPage2(cn.iocoder.yudao.module.farm.controller.admin.cropFarmingCenter.vo.ProductionPlanPageReqVO reqVO) {
return selectPage(reqVO, new LambdaQueryWrapperX<ProductionPlanDO>() return selectPage(reqVO, new LambdaQueryWrapperX<ProductionPlanDO>()
.betweenIfPresent(ProductionPlanDO::getProductionStartDate, reqVO.getProductionStartDate()) .betweenIfPresent(ProductionPlanDO::getProductionStartDate,
reqVO.getProductionStartDate() != null ? reqVO.getProductionStartDate()[0] : null,
reqVO.getProductionStartDate() != null ? reqVO.getProductionStartDate()[1] : null
)
.eqIfPresent(ProductionPlanDO::getBaseId, reqVO.getBaseId()) .eqIfPresent(ProductionPlanDO::getBaseId, reqVO.getBaseId())
.eqIfPresent(ProductionPlanDO::getPlotId, reqVO.getPlotId()) .eqIfPresent(ProductionPlanDO::getPlotId, reqVO.getPlotId())
.eqIfPresent(ProductionPlanDO::getPlanStatus, reqVO.getPlanStatus())
.orderByDesc(ProductionPlanDO::getCreateTime) .orderByDesc(ProductionPlanDO::getCreateTime)
); );
} }
ProductionPlanPageRespVO.PlanOverview getPlanOverview(@Param("baseId") String baseId); ProductionPlanRespVO.PlanOverview getPlanOverview(@Param("baseId") String baseId);
} }

View File

@@ -24,14 +24,19 @@ public class CommonConstants {
public final static Integer PLAN_STATUS_2 = 2; public final static Integer PLAN_STATUS_2 = 2;
public final static Integer PLAN_STATUS_3 = 3; public final static Integer PLAN_STATUS_3 = 3;
public final static Integer PLAN_STATUS_4 = 4; public final static Integer PLAN_STATUS_4 = 4;
public final static Integer PLAN_STATUS_5 = 5;
public final static Integer PLAN_STATUS_6 = 6;
public final static Integer PLAN_STATUS_7 = 7;
public static Map<Integer, String> PLAN_MAP = new HashMap<>(); public static Map<Integer, String> PLAN_MAP = new HashMap<>();
static{ static{
PLAN_MAP.put(1, "未开始"); PLAN_MAP.put(PLAN_STATUS_1, "未开始");
PLAN_MAP.put(2, "进行中"); PLAN_MAP.put(PLAN_STATUS_2, "进行中");
PLAN_MAP.put(3, "已完成"); PLAN_MAP.put(PLAN_STATUS_3, "已完成");
PLAN_MAP.put(4, "逾期"); PLAN_MAP.put(PLAN_STATUS_4, "逾期");
PLAN_MAP.put(5, "已结束"); PLAN_MAP.put(PLAN_STATUS_5, "逾期未开始");
PLAN_MAP.put(PLAN_STATUS_6, "逾期未结束");
PLAN_MAP.put(PLAN_STATUS_7, "已结束");
} }
// 模型类型 (1:模型模板; 2:引用案例) // 模型类型 (1:模型模板; 2:引用案例)

View File

@@ -1,5 +1,6 @@
package cn.iocoder.yudao.module.farm.service.cropFarmingCenter; package cn.iocoder.yudao.module.farm.service.cropFarmingCenter;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.module.farm.controller.admin.cropFarmingCenter.vo.*; import cn.iocoder.yudao.module.farm.controller.admin.cropFarmingCenter.vo.*;
/** /**
@@ -23,9 +24,11 @@ public interface CropFarmingCenterService {
void updateProductionPlan(ProductionPlanUpdateReqVO updateReqVO); void updateProductionPlan(ProductionPlanUpdateReqVO updateReqVO);
ProductionPlanPageRespVO getProductionPlanPage(ProductionPlanPageReqVO reqVO); PageResult<ProductionPlanPageRespVO> getProductionPlanPage(ProductionPlanPageReqVO reqVO);
int getCropCount(Long tenantId); int getCropCount(Long tenantId);
Double getTotalArea(Long tenantId); Double getTotalArea(Long tenantId);
void deleteProductionPlan(String id);
} }

View File

@@ -25,11 +25,14 @@ import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import java.time.LocalDate; import java.time.LocalDate;
import java.util.AbstractMap;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
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;
import static cn.iocoder.yudao.module.farm.enums.CommonConstants.PLAN_MAP;
import static cn.iocoder.yudao.module.farm.enums.ErrorCodeConstants.PRODUCTION_PLAN_NOT_EXISTS; import static cn.iocoder.yudao.module.farm.enums.ErrorCodeConstants.PRODUCTION_PLAN_NOT_EXISTS;
/** /**
@@ -208,22 +211,39 @@ public class CropFarmingCenterServiceImpl implements CropFarmingCenterService {
} }
@Override @Override
public ProductionPlanPageRespVO getProductionPlanPage(ProductionPlanPageReqVO reqVO) { public PageResult<ProductionPlanPageRespVO> getProductionPlanPage(ProductionPlanPageReqVO reqVO) {
PageResult<ProductionPlanDO> productionPlanDOPageResult = productionPlanMapper.selectPage2(reqVO); PageResult<ProductionPlanDO> productionPlanDOPageResult = productionPlanMapper.selectPage2(reqVO);
PageResult<ProductionPlanRespVO> resultData = BeanUtils.toBean(productionPlanDOPageResult, ProductionPlanRespVO.class); PageResult<ProductionPlanRespVO> resultData = BeanUtils.toBean(productionPlanDOPageResult, ProductionPlanRespVO.class);
resultData.getList().forEach(e -> { resultData.getList().forEach(e -> {
// 计划状态-名称
e.setPlanStatusName(PLAN_MAP.get(e.getPlanStatus()));
// 模型
ModelManagementRespVO modelManagementRespVO = modelManagementService.getModelManagement(e.getSpeciesModelId()); ModelManagementRespVO modelManagementRespVO = modelManagementService.getModelManagement(e.getSpeciesModelId());
e.setModelManagementRespVO(modelManagementRespVO); e.setModelManagementRespVO(modelManagementRespVO);
// 计划概述
BaseInfoDO baseObj = baseInfoMapper.selectOne("id", e.getBaseId());
ProductionPlanRespVO.PlanOverview planOverview = productionPlanMapper.getPlanOverview(e.getBaseId());
planOverview.setTotalArea(baseObj.getArea());
e.setPlanOverview(planOverview);
}); });
// 计划概述 // 响应结构包装 (包装成符合前端需要的格式)
BaseInfoDO baseObj = baseInfoMapper.selectOne("base_id", reqVO.getBaseId()); List<ProductionPlanPageRespVO> collect = resultData.getList().stream()
ProductionPlanPageRespVO.PlanOverview planOverview = productionPlanMapper.getPlanOverview(reqVO.getBaseId()); .collect(Collectors.groupingBy(plan -> new AbstractMap.SimpleEntry<>(plan.getBaseId(), plan.getBaseName()), Collectors.toList()))
planOverview.setTotalArea(baseObj.getArea()); .entrySet().stream()
return new ProductionPlanPageRespVO(resultData,planOverview); .map(entry -> {
ProductionPlanPageRespVO groupedVO = new ProductionPlanPageRespVO();
groupedVO.setBaseId(entry.getKey().getKey());
groupedVO.setBaseName(entry.getKey().getValue());
groupedVO.setPlans(entry.getValue());
return groupedVO;
})
.collect(Collectors.toList());
long size = collect.size();
return new PageResult<>(collect,size);
} }
@@ -237,6 +257,14 @@ public class CropFarmingCenterServiceImpl implements CropFarmingCenterService {
return productionPlanMapper.getTotalArea(tenantId); return productionPlanMapper.getTotalArea(tenantId);
} }
@Override
public void deleteProductionPlan(String id) {
// 校验存在
validateProductionPlanExists(id);
// 删除
productionPlanMapper.deleteById(id);
}
private void validateProductionPlanExists(String id) { private void validateProductionPlanExists(String id) {
if (productionPlanMapper.selectById(id) == null) { if (productionPlanMapper.selectById(id) == null) {
throw exception(PRODUCTION_PLAN_NOT_EXISTS); throw exception(PRODUCTION_PLAN_NOT_EXISTS);

View File

@@ -25,7 +25,7 @@
<select id="getPlanOverview" <select id="getPlanOverview"
parameterType="string" parameterType="string"
resultType="cn.iocoder.yudao.module.farm.controller.admin.cropFarmingCenter.vo.ProductionPlanPageRespVO$PlanOverview"> resultType="cn.iocoder.yudao.module.farm.controller.admin.cropFarmingCenter.vo.ProductionPlanRespVO$PlanOverview">
SELECT SELECT
base_id, base_id,
COUNT(*) AS planCount, COUNT(*) AS planCount,