Merge remote-tracking branch 'origin/main'

# Conflicts:
#	yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/controller/admin/dict/DictController.java
#	yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/service/sysDict/SysDictServiceImpl.java
This commit is contained in:
顾君禹
2025-08-23 19:43:44 +08:00
9 changed files with 293 additions and 24 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,9 @@ 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.CommonDictRespVO;
import cn.iocoder.yudao.module.farm.controller.admin.dict.vo.FarmingTypeRespVO;
import cn.iocoder.yudao.module.farm.controller.admin.dict.vo.SpeciesClassifyLibraryRespVO;
@@ -29,18 +32,21 @@ import cn.iocoder.yudao.module.farm.dal.dataobject.farmingtypemaintenance.Farmin
import cn.iocoder.yudao.module.farm.dal.dataobject.inputlibrary.InputLibraryDO;
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 cn.iocoder.yudao.module.farm.utils.TreeStructureUtil;
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 lombok.extern.slf4j.Slf4j;
@@ -50,6 +56,7 @@ import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
import java.util.*;
import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
@@ -71,22 +78,22 @@ import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
@Slf4j
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;
}
// 农事类型
@@ -290,6 +297,27 @@ public class DictController {
log.error("获取物种类别列表失败", e);
return success(new ArrayList<>());
}
return success(sysDictService.getSpeciesClassifyLibraryList());
}
@Operation(summary = "字典数据维护-下拉框列表-物种类别与模型")
@GetMapping("/list/species-classify-model")
public CommonResult<List<SpeciesClassifyLibraryRespVO>> getSpeciesClassifyAndModelList(){
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 = "字典数据维护-下拉框列表-通用字典分类查询")

View File

@@ -16,19 +16,16 @@ import java.util.List;
@AllArgsConstructor
@NoArgsConstructor
public class SpeciesClassifyLibraryRespVO {
@Schema(description = "ID")
private String id;
@Schema(description = "一级分类-编码")
private String SpeciesClassCode;
private String speciesClassCode;
@Schema(description = "一级分类-名称")
private String SpeciesClassName;
@Schema(description = "使用状态")
private String useStatus;
private String speciesClassName;
private List<SpeciesClassifyLibraryRespVO> children;
public SpeciesClassifyLibraryRespVO(String speciesClassCode, String speciesClassName) {
SpeciesClassCode = speciesClassCode;
SpeciesClassName = speciesClassName;
this.speciesClassCode = speciesClassCode;
this.speciesClassName = speciesClassName;
}
}

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;
}
}

View File

@@ -1,6 +1,7 @@
package cn.iocoder.yudao.module.farm.service.sysDict;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.module.farm.controller.admin.dict.vo.SpeciesClassifyLibraryRespVO;
import cn.iocoder.yudao.module.farm.controller.admin.dict.vo.sys.SysDictPageReqVO;
import cn.iocoder.yudao.module.farm.controller.admin.farmingnamemaintenance.vo.FarmingNameMaintenancePageReqVO;
import cn.iocoder.yudao.module.farm.controller.admin.farmingnamemaintenance.vo.FarmingNameMaintenanceSaveReqVO;
@@ -26,6 +27,9 @@ public interface SysDictService {
PageResult<SysDictDO> selectDictByPage(SysDictPageReqVO reqVO);
List<SpeciesClassifyLibraryRespVO> getSpeciesClassifyLibraryList();
List<SpeciesClassifyLibraryRespVO> getSpeciesClassifyAndModelList();
/**
* 农事类型

View File

@@ -1,6 +1,8 @@
package cn.iocoder.yudao.module.farm.service.sysDict;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.security.core.LoginUser;
import cn.iocoder.yudao.module.farm.controller.admin.dict.vo.SpeciesClassifyLibraryRespVO;
import cn.iocoder.yudao.module.farm.controller.admin.dict.vo.sys.SysDictPageReqVO;
import cn.iocoder.yudao.module.farm.controller.admin.dict.vo.sys.SysDictReqVO;
import cn.iocoder.yudao.module.farm.controller.admin.farmingnamemaintenance.vo.FarmingNameMaintenancePageReqVO;
@@ -9,15 +11,21 @@ import cn.iocoder.yudao.module.farm.controller.admin.farmingtypemaintenance.vo.F
import cn.iocoder.yudao.module.farm.controller.admin.farmingtypemaintenance.vo.FarmingTypeMaintenanceSaveReqVO;
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.modelmanagement.ModelManagementDO;
import cn.iocoder.yudao.module.farm.dal.mysql.modelmanagement.ModelManagementMapper;
import cn.iocoder.yudao.module.farm.dal.mysql.sysDict.SysDictDO;
import cn.iocoder.yudao.module.farm.dal.mysql.sysDict.SysDictMapper;
import cn.iocoder.yudao.module.farm.enums.CommonConstants;
import cn.iocoder.yudao.module.farm.utils.StrHelperUtil;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import org.springframework.stereotype.Service;
import java.util.List;
import java.util.*;
import java.util.function.Function;
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.ErrorCodeConstants.FARMING_TYPE_MAINTENANCE_NOT_EXISTS;
/**
@@ -33,9 +41,11 @@ public class SysDictServiceImpl implements SysDictService {
private final SysDictMapper sysDictMapper;
private final ModelManagementMapper modelManagementMapper;
public SysDictServiceImpl(SysDictMapper sysDictMapper) {
public SysDictServiceImpl(SysDictMapper sysDictMapper, ModelManagementMapper modelManagementMapper) {
this.sysDictMapper = sysDictMapper;
this.modelManagementMapper = modelManagementMapper;
}
@Override
@@ -73,6 +83,117 @@ public class SysDictServiceImpl implements SysDictService {
}
}
@Override
public List<SpeciesClassifyLibraryRespVO> getSpeciesClassifyLibraryList() {
return getSpeciesClassifyLibraryList(1);
}
private List<SpeciesClassifyLibraryRespVO> getSpeciesClassifyLibraryList2() {
return getSpeciesClassifyLibraryList(2);
}
private List<SpeciesClassifyLibraryRespVO> getSpeciesClassifyLibraryList(int level) {
List<SysDictDO> list = this.getByTypeCode(CommonConstants.DICT_TYPE_CODE_3);
if (level == 1) {
// 一,二级联动
return this.build(list, SysDictDO::getField1Code, SysDictDO::getField1Name, SysDictDO::getField2Code, SysDictDO::getField2Name, SysDictDO::getField1Code
);
} else if (level == 2) {
// 二,三级联动
return this.build(list, SysDictDO::getField2Code, SysDictDO::getField2Name, SysDictDO::getField3Code, SysDictDO::getField3Name, SysDictDO::getField2Code
);
} else {
throw new IllegalArgumentException("Unsupported level: " + level);
}
}
private List<SpeciesClassifyLibraryRespVO> build(
List<SysDictDO> list,
Function<SysDictDO, String> parentKeyExtractor,
Function<SysDictDO, String> parentValueExtractor,
Function<SysDictDO, String> childKeyExtractor,
Function<SysDictDO, String> childValueExtractor,
Function<SysDictDO, String> parentFilterExtractor) {
// 获取父级映射(去重)
Map<String, String> parentMap = list.stream()
.collect(Collectors.toMap(
parentKeyExtractor,
parentValueExtractor,
(existing, replacement) -> existing
));
List<SpeciesClassifyLibraryRespVO> result = new ArrayList<>();
// 按父级代码分组,提前组织子级数据
Map<String, List<SysDictDO>> groupedByParent = list.stream().collect(Collectors.groupingBy(parentFilterExtractor));
for (Map.Entry<String, String> entry : parentMap.entrySet()) {
String parentKey = entry.getKey();
SpeciesClassifyLibraryRespVO parentVO = new SpeciesClassifyLibraryRespVO(parentKey, entry.getValue());
// 获取该父级下的所有子项
List<SysDictDO> childrenItems = groupedByParent.getOrDefault(parentKey, Collections.emptyList());
// 去重处理子项
Map<String, String> childMap = childrenItems.stream()
.filter(e -> childKeyExtractor.apply(e) != null && !childKeyExtractor.apply(e).isEmpty())
.collect(Collectors.toMap(
childKeyExtractor,
childValueExtractor,
(existing, replacement) -> existing
));
// 构建子级VO列表
List<SpeciesClassifyLibraryRespVO> childList = childMap.entrySet().stream()
.map(childEntry -> new SpeciesClassifyLibraryRespVO(childEntry.getKey(), childEntry.getValue()))
.collect(Collectors.toList());
parentVO.setChildren(childList);
result.add(parentVO);
}
return result;
}
@Override
public List<SpeciesClassifyLibraryRespVO> getSpeciesClassifyAndModelList() {
LoginUser user = getLoginUser();
if (user == null) {
return new ArrayList<>();
}
QueryWrapper<ModelManagementDO> qw = new QueryWrapper<>();
qw.eq("tenant_id", user.getTenantId());
qw.eq("type", CommonConstants.MODEL_TYPE_1);
List<ModelManagementDO> modelList = modelManagementMapper.selectList(qw);
Map<String, Map<String, String>> modelMap = modelList.stream()
.collect(Collectors.groupingBy(
ModelManagementDO::getSpeciesId,
Collectors.toMap(ModelManagementDO::getId, ModelManagementDO::getModelName)
));
List<SpeciesClassifyLibraryRespVO> rootList = this.getSpeciesClassifyLibraryList2();
for (SpeciesClassifyLibraryRespVO vo : rootList) {
for (SpeciesClassifyLibraryRespVO child : vo.getChildren()) {
if (!modelMap.containsKey(child.getSpeciesClassCode())) {
continue;
}
Map<String, String> stringStringMap = modelMap.get(child.getSpeciesClassCode());
List<SpeciesClassifyLibraryRespVO> collect = stringStringMap.entrySet().stream().map(e -> new SpeciesClassifyLibraryRespVO(e.getKey(), e.getValue())).collect(Collectors.toList());
child.setChildren(collect);
}
}
return rootList;
}
@Override
public PageResult<FarmingTypeMaintenanceDO> getFarmingTypeMaintenancePage(FarmingTypeMaintenancePageReqVO reqVO) {