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.FarmingRecordSaveReqVO;
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.farmingrecord.FarmingRecordService;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.validation.Valid;
import lombok.extern.slf4j.Slf4j;
@@ -45,14 +47,11 @@ public class CropFarmingCenterController {
this.farmingRecordService = farmingRecordService;
}
// 生产计划
@GetMapping("/production-plan/page")
@Operation(summary = "生产计划-分页")
public CommonResult<ProductionPlanPageRespVO> getProductionPlanPage(@Valid cn.iocoder.yudao.module.farm.controller.admin.cropFarmingCenter.vo.ProductionPlanPageReqVO pageReqVO) {
ProductionPlanPageRespVO pageResult = cropFarmingCenterService.getProductionPlanPage(pageReqVO);
return success(pageResult);
public CommonResult<PageResult<ProductionPlanPageRespVO>> getProductionPlanPage(@Valid cn.iocoder.yudao.module.farm.controller.admin.cropFarmingCenter.vo.ProductionPlanPageReqVO pageReqVO) {
return success(cropFarmingCenterService.getProductionPlanPage(pageReqVO));
}
@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")
@Operation(summary = "农事记录-分页")

View File

@@ -1,12 +1,11 @@
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 lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.math.BigDecimal;
import java.util.List;
/**
* @description: 分页响应实体
@@ -18,27 +17,11 @@ import java.math.BigDecimal;
@NoArgsConstructor
public class ProductionPlanPageRespVO {
@Schema(description = "分页数据")
private PageResult<ProductionPlanRespVO> list;
@Schema(description = "计划概括信息")
private 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;
}
@Schema(description = "基地ID")
private String baseId;
@Schema(description = "基地名称")
private String baseName;
@Schema(description = "生产计划集合")
private List<ProductionPlanRespVO> plans;
}

View File

@@ -1,11 +1,13 @@
package cn.iocoder.yudao.module.farm.controller.admin.cropFarmingCenter.vo;
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 lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.math.BigDecimal;
import java.time.LocalDate;
/**
@@ -31,14 +33,25 @@ public class ProductionPlanRespVO {
private String speciesModelId;
@Schema(description = "排产开始日期")
@JsonFormat(pattern = "yyyy-MM-dd")
private LocalDate productionStartDate;
@Schema(description = "排产结束日期")
@JsonFormat(pattern = "yyyy-MM-dd")
private LocalDate productionEndDate;
@Schema(description = "采收开始日期")
@JsonFormat(pattern = "yyyy-MM-dd")
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 = "计划执行状态")
private Integer planStatus;
@Schema(description = "计划执行状态-名称")
@@ -60,6 +73,7 @@ public class ProductionPlanRespVO {
* 种植区域信息
*/
@Schema(description = "种植日期")
@JsonFormat(pattern = "yyyy-MM-dd")
private LocalDate plantingDate;
@Schema(description = "种植株数")
private Integer plantingQuantity;
@@ -76,7 +90,26 @@ public class ProductionPlanRespVO {
@Schema(description = "备注")
private String remark;
@Schema(description = "模型", example = "芋艿")
@Schema(description = "模型")
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 = "采收开始日期")
private LocalDate harvestStartDate;
@Schema(description = "计划开始日期")
private LocalDate plantingStartDate;
@Schema(description = "计划结束日期")
private LocalDate plantingEndDate;
@Schema(description = "计划执行状态 (1:未开始;2:进行中;3:已完成;4:逾期)")
private Integer planStatus;

View File

@@ -52,6 +52,14 @@ public class ProductionPlanDO extends BaseDO {
* 采收开始日期
*/
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.mybatis.core.query.LambdaQueryWrapperX;
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.dal.dataobject.productionplan.ProductionPlanDO;
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) {
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::getPlotId, reqVO.getPlotId())
.eqIfPresent(ProductionPlanDO::getPlanStatus, reqVO.getPlanStatus())
.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_3 = 3;
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<>();
static{
PLAN_MAP.put(1, "未开始");
PLAN_MAP.put(2, "进行中");
PLAN_MAP.put(3, "已完成");
PLAN_MAP.put(4, "逾期");
PLAN_MAP.put(5, "已结束");
PLAN_MAP.put(PLAN_STATUS_1, "未开始");
PLAN_MAP.put(PLAN_STATUS_2, "进行中");
PLAN_MAP.put(PLAN_STATUS_3, "已完成");
PLAN_MAP.put(PLAN_STATUS_4, "逾期");
PLAN_MAP.put(PLAN_STATUS_5, "逾期未开始");
PLAN_MAP.put(PLAN_STATUS_6, "逾期未结束");
PLAN_MAP.put(PLAN_STATUS_7, "已结束");
}
// 模型类型 (1:模型模板; 2:引用案例)

View File

@@ -1,5 +1,6 @@
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.*;
/**
@@ -23,9 +24,11 @@ public interface CropFarmingCenterService {
void updateProductionPlan(ProductionPlanUpdateReqVO updateReqVO);
ProductionPlanPageRespVO getProductionPlanPage(ProductionPlanPageReqVO reqVO);
PageResult<ProductionPlanPageRespVO> getProductionPlanPage(ProductionPlanPageReqVO reqVO);
int getCropCount(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 java.time.LocalDate;
import java.util.AbstractMap;
import java.util.ArrayList;
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.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;
/**
@@ -208,22 +211,39 @@ public class CropFarmingCenterServiceImpl implements CropFarmingCenterService {
}
@Override
public ProductionPlanPageRespVO getProductionPlanPage(ProductionPlanPageReqVO reqVO) {
public PageResult<ProductionPlanPageRespVO> getProductionPlanPage(ProductionPlanPageReqVO reqVO) {
PageResult<ProductionPlanDO> productionPlanDOPageResult = productionPlanMapper.selectPage2(reqVO);
PageResult<ProductionPlanRespVO> resultData = BeanUtils.toBean(productionPlanDOPageResult, ProductionPlanRespVO.class);
resultData.getList().forEach(e -> {
// 计划状态-名称
e.setPlanStatusName(PLAN_MAP.get(e.getPlanStatus()));
// 模型
ModelManagementRespVO modelManagementRespVO = modelManagementService.getModelManagement(e.getSpeciesModelId());
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());
ProductionPlanPageRespVO.PlanOverview planOverview = productionPlanMapper.getPlanOverview(reqVO.getBaseId());
planOverview.setTotalArea(baseObj.getArea());
return new ProductionPlanPageRespVO(resultData,planOverview);
// 响应结构包装 (包装成符合前端需要的格式)
List<ProductionPlanPageRespVO> collect = resultData.getList().stream()
.collect(Collectors.groupingBy(plan -> new AbstractMap.SimpleEntry<>(plan.getBaseId(), plan.getBaseName()), Collectors.toList()))
.entrySet().stream()
.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);
}
@Override
public void deleteProductionPlan(String id) {
// 校验存在
validateProductionPlanExists(id);
// 删除
productionPlanMapper.deleteById(id);
}
private void validateProductionPlanExists(String id) {
if (productionPlanMapper.selectById(id) == null) {
throw exception(PRODUCTION_PLAN_NOT_EXISTS);

View File

@@ -25,7 +25,7 @@
<select id="getPlanOverview"
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
base_id,
COUNT(*) AS planCount,