feat (farm): 农事记录-新增

- 基地,地块,计划 三级联动
This commit is contained in:
达富斌
2025-08-22 20:41:08 +08:00
parent 1415e62459
commit 81ef48ba8c
6 changed files with 150 additions and 26 deletions

View File

@@ -97,11 +97,4 @@ public class BaseInfoController {
BeanUtils.toBean(list, BaseInfoRespVO.class));
}
@GetMapping("/get/baser-name-list")
@Operation(summary = "获得基地名称-下拉列表")
public CommonResult<List<BaseNameRespVO>> getBaseNameList() {
List<BaseNameRespVO> res = baseInfoService.getBaseNameList();
return success(res);
}
}

View File

@@ -0,0 +1,57 @@
package cn.iocoder.yudao.module.farm.controller.admin.baseinfo.vo;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.format.annotation.DateTimeFormat;
import java.time.LocalDate;
import java.util.List;
import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY;
import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
/**
* @description: 基地,地块,计划
* @author: binda
* @date: 2025/8/21 21:47
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
public class BaseNamePlanRespVO {
@Schema(description = "基地id")
private String id;
@Schema(description = "基地名称")
private String name;
private List<PlotInfoVO> children;
@Data
@AllArgsConstructor
@NoArgsConstructor
public static class PlotInfoVO {
@Schema(description = "地块ID")
private String plotId;
@Schema(description = "地块名称")
private String plotName;
private List<PlanInfoVO> children;
}
@Data
@AllArgsConstructor
@NoArgsConstructor
public static class PlanInfoVO {
@Schema(description = "计划编号")
private String planNumber;
@JsonFormat(pattern = "yyyy-MM-dd")
@Schema(description = "排产开始日期")
private LocalDate productionStartDate;
@JsonFormat(pattern = "yyyy-MM-dd")
@Schema(description = "排产结束日期")
private LocalDate productionEndDate;
}
}

View File

@@ -3,6 +3,8 @@ package cn.iocoder.yudao.module.farm.controller.admin.dict;
import cn.iocoder.yudao.framework.common.pojo.CommonResult;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
import cn.iocoder.yudao.module.farm.controller.admin.baseinfo.vo.BaseNamePlanRespVO;
import cn.iocoder.yudao.module.farm.controller.admin.baseinfo.vo.BaseNameRespVO;
import cn.iocoder.yudao.module.farm.controller.admin.dict.vo.*;
import cn.iocoder.yudao.module.farm.controller.admin.dict.vo.sys.SysDictRespVO;
import cn.iocoder.yudao.module.farm.controller.admin.dict.vo.sys.SysDictTypeCodeRespVO;
@@ -25,27 +27,22 @@ import cn.iocoder.yudao.module.farm.dal.dataobject.disasterdata.DisasterDataDO;
import cn.iocoder.yudao.module.farm.dal.dataobject.farmingnamemaintenance.FarmingNameMaintenanceDO;
import cn.iocoder.yudao.module.farm.dal.dataobject.farmingtypemaintenance.FarmingTypeMaintenanceDO;
import cn.iocoder.yudao.module.farm.dal.dataobject.inputlibrary.InputLibraryDO;
import cn.iocoder.yudao.module.farm.dal.dataobject.speciesclassifylibrary.SpeciesClassifyLibraryDO;
import cn.iocoder.yudao.module.farm.dal.dataobject.specieslibrary.SpeciesLibraryDO;
import cn.iocoder.yudao.module.farm.dal.mysql.sysDict.SysDictDO;
import cn.iocoder.yudao.module.farm.enums.CommonConstants;
import cn.iocoder.yudao.module.farm.service.baseinfo.BaseInfoService;
import cn.iocoder.yudao.module.farm.service.disasterdata.DisasterDataService;
import cn.iocoder.yudao.module.farm.service.farmingnamemaintenance.FarmingNameMaintenanceService;
import cn.iocoder.yudao.module.farm.service.farmingtypemaintenance.FarmingTypeMaintenanceService;
import cn.iocoder.yudao.module.farm.service.inputlibrary.InputLibraryService;
import cn.iocoder.yudao.module.farm.service.productionplan.ProductionPlanService;
import cn.iocoder.yudao.module.farm.service.speciesclassifylibrary.SpeciesClassifyLibraryService;
import cn.iocoder.yudao.module.farm.service.specieslibrary.SpeciesLibraryService;
import cn.iocoder.yudao.module.farm.service.sysDict.SysDictService;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.media.Schema;
import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.validation.Valid;
import org.redisson.misc.Hash;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import java.util.*;
import java.util.stream.Collectors;
import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
@@ -66,22 +63,22 @@ import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
@Validated
public class DictController {
private final FarmingTypeMaintenanceService farmingTypeMaintenanceService;
private final FarmingNameMaintenanceService farmingNameMaintenanceService;
private final SpeciesLibraryService speciesLibraryService;
private final SpeciesClassifyLibraryService speciesClassifyLibraryService;
private final InputLibraryService inputLibraryService;
private final DisasterDataService disasterDataService;
private final SysDictService sysDictService;
private final ProductionPlanService productionPlanService;
private final BaseInfoService baseInfoService;
public DictController(FarmingTypeMaintenanceService farmingTypeMaintenanceService, FarmingNameMaintenanceService farmingNameMaintenanceService, SpeciesLibraryService speciesLibraryService, SpeciesClassifyLibraryService speciesClassifyLibraryService, InputLibraryService inputLibraryService, DisasterDataService disasterDataService, SysDictService sysDictService) {
this.farmingTypeMaintenanceService = farmingTypeMaintenanceService;
this.farmingNameMaintenanceService = farmingNameMaintenanceService;
public DictController(SpeciesLibraryService speciesLibraryService, SpeciesClassifyLibraryService speciesClassifyLibraryService, InputLibraryService inputLibraryService, DisasterDataService disasterDataService, SysDictService sysDictService, ProductionPlanService productionPlanService, BaseInfoService baseInfoService) {
this.speciesLibraryService = speciesLibraryService;
this.speciesClassifyLibraryService = speciesClassifyLibraryService;
this.inputLibraryService = inputLibraryService;
this.disasterDataService = disasterDataService;
this.sysDictService = sysDictService;
this.productionPlanService = productionPlanService;
this.baseInfoService = baseInfoService;
}
// 农事类型
@@ -265,12 +262,6 @@ public class DictController {
}
// 下拉框列表
@Operation(summary = "字典数据维护-下拉框列表-农事类型")
@GetMapping("/list/farming-type")
public CommonResult<List<FarmingTypeRespVO>> getFarmingTypeList() {
List<FarmingTypeMaintenanceDO> res = farmingTypeMaintenanceService.getFarmingTypeList();
return success(BeanUtils.toBean(res, FarmingTypeRespVO.class));
}
@Operation(summary = "字典数据维护-下拉框列表-物种类别")
@GetMapping("/list/species-classify-library")
@@ -284,6 +275,20 @@ public class DictController {
return success(sysDictService.getSpeciesClassifyAndModelList());
}
@GetMapping("/list/base-name")
@Operation(summary = "字典数据维护-下拉框列表-基地,地块二级联动")
public CommonResult<List<BaseNameRespVO>> getBaseNameList() {
List<BaseNameRespVO> res = baseInfoService.getBaseNameList();
return success(res);
}
@GetMapping("/list/base-name-plan")
@Operation(summary = "字典数据维护-下拉框列表-基地,地块,任务三级联动")
public CommonResult<List<BaseNamePlanRespVO>> getBaseNameAndPlanList() {
List<BaseNamePlanRespVO> res = productionPlanService.getBaseNameAndPlanList();
return success(res);
}
@Operation(summary = "字典数据维护-下拉框列表-通用字典分类查询")
@GetMapping("/list/{dictTypeCode}")
public CommonResult<List<SysDictRespVO>> getSysDictList(@PathVariable("dictTypeCode") String dictTypeCode) {

View File

@@ -64,7 +64,7 @@ public interface BaseInfoService {
int getBaseCount(Long tenantId);
/**
* 基地名称-下拉列表
* 基地,地块-下拉列表(两级联动)
* @return
*/
List<BaseNameRespVO> getBaseNameList();

View File

@@ -1,5 +1,6 @@
package cn.iocoder.yudao.module.farm.service.productionplan;
import cn.iocoder.yudao.module.farm.controller.admin.baseinfo.vo.BaseNamePlanRespVO;
import cn.iocoder.yudao.module.farm.controller.admin.productionplan.vo.ProductionPlanPageReqVO;
import cn.iocoder.yudao.module.farm.controller.admin.productionplan.vo.ProductionPlanSaveReqVO;
import cn.iocoder.yudao.module.farm.dal.dataobject.productionplan.ProductionPlanDO;
@@ -67,5 +68,10 @@ public interface ProductionPlanService {
*/
PageResult<ProductionPlanDO> getProductionPlanPage(ProductionPlanPageReqVO pageReqVO);
/**
* 基地,地块,计划 - 下拉列表(三级联动)
* @return
*/
List<BaseNamePlanRespVO> getBaseNameAndPlanList();
}

View File

@@ -2,8 +2,10 @@ package cn.iocoder.yudao.module.farm.service.productionplan;
import cn.hutool.core.util.IdUtil;
import cn.iocoder.yudao.module.farm.controller.admin.baseinfo.vo.BaseNamePlanRespVO;
import cn.iocoder.yudao.module.farm.controller.admin.productionplan.vo.ProductionPlanPageReqVO;
import cn.iocoder.yudao.module.farm.controller.admin.productionplan.vo.ProductionPlanSaveReqVO;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import org.springframework.stereotype.Service;
import jakarta.annotation.Resource;
import org.springframework.validation.annotation.Validated;
@@ -17,7 +19,10 @@ import cn.iocoder.yudao.framework.security.core.LoginUser;
import cn.iocoder.yudao.module.farm.dal.mysql.productionplan.ProductionPlanMapper;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
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;
@@ -93,4 +98,62 @@ public class ProductionPlanServiceImpl implements ProductionPlanService {
return null;
}
@Override
public List<BaseNamePlanRespVO> getBaseNameAndPlanList() {
LoginUser user = getLoginUser();
if (user == null) {
return new ArrayList<>();
}
QueryWrapper<ProductionPlanDO> qw = new QueryWrapper<>();
qw.eq("tenant_id", user.getTenantId());
List<ProductionPlanDO> productionPlanDOS = productionPlanMapper.selectList(qw);
// 按基地ID分组
Map<String, List<ProductionPlanDO>> baseGroup = productionPlanDOS.stream().collect(Collectors.groupingBy(ProductionPlanDO::getBaseId));
List<BaseNamePlanRespVO> result = new ArrayList<>();
for (Map.Entry<String, List<ProductionPlanDO>> baseEntry : baseGroup.entrySet()) {
String baseId = baseEntry.getKey();
List<ProductionPlanDO> basePlans = baseEntry.getValue();
// 创建基地响应对象
BaseNamePlanRespVO baseVO = new BaseNamePlanRespVO();
baseVO.setId(baseId);
baseVO.setName(basePlans.get(0).getBaseName()); // 取第一个计划的基地名称
baseVO.setChildren(new ArrayList<>());
// 按地块ID分组
Map<String, List<ProductionPlanDO>> plotGroup = basePlans.stream().collect(Collectors.groupingBy(ProductionPlanDO::getPlotId));
for (Map.Entry<String, List<ProductionPlanDO>> plotEntry : plotGroup.entrySet()) {
String plotId = plotEntry.getKey();
List<ProductionPlanDO> plotPlans = plotEntry.getValue();
// 创建地块响应对象
BaseNamePlanRespVO.PlotInfoVO plotVO = new BaseNamePlanRespVO.PlotInfoVO();
plotVO.setPlotId(plotId);
plotVO.setPlotName(plotPlans.get(0).getPlotName()); // 取第一个计划的地块名称
plotVO.setChildren(new ArrayList<>());
// 创建计划信息列表
for (ProductionPlanDO plan : plotPlans) {
BaseNamePlanRespVO.PlanInfoVO planVO = new BaseNamePlanRespVO.PlanInfoVO();
planVO.setPlanNumber(plan.getPlanNumber());
planVO.setProductionStartDate(plan.getProductionStartDate());
planVO.setProductionEndDate(plan.getProductionEndDate());
plotVO.getChildren().add(planVO);
}
baseVO.getChildren().add(plotVO);
}
result.add(baseVO);
}
return result;
}
}