diff --git a/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/controller/admin/dict/DictController.java b/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/controller/admin/dict/DictController.java index 4eb7ef62..f9102f60 100644 --- a/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/controller/admin/dict/DictController.java +++ b/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/controller/admin/dict/DictController.java @@ -287,17 +287,32 @@ public class DictController { return success(BeanUtils.toBean(res, FarmingTypeRespVO.class)); } - @Operation(summary = "字典数据维护-下拉框列表-物种类别") - @GetMapping("/list/species-classify-library") - public CommonResult> getSpeciesClassifyLibraryList() { + @Operation(summary = "字典数据维护-下拉框列表-三级物种类别") + @GetMapping("/list/three-library") + public CommonResult> getTreeLibraryList() { try { // 获取物种类别字典数据 List dictList = sysDictService.getByTypeCode(CommonConstants.DICT_TYPE_CODE_3); // 使用工具类构建树结构 - List treeList = TreeStructureUtil.buildSpeciesClassifyTree(dictList); - return success(treeList); + List threeList = TreeStructureUtil.buildSpeciesClassifyTree(dictList); + return success(threeList); } catch (Exception e) { - log.error("获取物种类别列表失败", e); + log.error("获取三级物种类别列表失败", e); + return success(new ArrayList<>()); + } + } + + @Operation(summary = "字典数据维护-下拉框列表-二级物种类别") + @GetMapping("/list/two-library") + public CommonResult> getTwoLibraryList() { + try { + // 获取物种类别字典数据 + List dictList = sysDictService.getByTypeCode(CommonConstants.DICT_TYPE_CODE_3); + // 使用工具类构建二级树结构 + List twoList = TreeStructureUtil.buildTwoLevelTree(dictList); + return success(twoList); + } catch (Exception e) { + log.error("获取二级物种类别列表失败", e); return success(new ArrayList<>()); } } diff --git a/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/controller/admin/modelmanagement/ModelManagementController.java b/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/controller/admin/modelmanagement/ModelManagementController.java index 55bdfc59..50cc3a87 100644 --- a/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/controller/admin/modelmanagement/ModelManagementController.java +++ b/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/controller/admin/modelmanagement/ModelManagementController.java @@ -41,6 +41,12 @@ public class ModelManagementController { return success(modelManagementService.createModelManagement(createReqVO)); } + @PostMapping("/copy-model") + @Operation(summary = "复制模型管理") + public CommonResult copyModelManagement(@Valid @RequestBody ModelManagementSaveReqVO createReqVO) { + return success(modelManagementService.copyModelManagement(createReqVO)); + } + @PutMapping("/update") @Operation(summary = "更新模型管理") public CommonResult updateModelManagement(@Valid @RequestBody ModelManagementSaveReqVO updateReqVO) { @@ -48,6 +54,13 @@ public class ModelManagementController { return success(true); } + @PutMapping("/is-release") + @Operation(summary = "更新模型管理") + public CommonResult isRelease(@Valid @RequestBody ModelManagementSaveReqVO updateReqVO) { + modelManagementService.isRelease(updateReqVO); + return success(true); + } + @DeleteMapping("/delete") @Operation(summary = "删除模型管理") @Parameter(name = "id", description = "编号", required = true) @@ -72,6 +85,13 @@ public class ModelManagementController { return success(modelManagement); } + @GetMapping("/page-release") + @Operation(summary = "获得发布模型分页") + public CommonResult> getModelManagementPageRelease(@Valid ModelManagementPageReqVO pageReqVO) { + PageResult pageResult = modelManagementService.getModelManagementPageRelease(pageReqVO); + return success(BeanUtils.toBean(pageResult, ModelManagementRespVO.class)); + } + @GetMapping("/page") @Operation(summary = "获得模型管理分页") public CommonResult> getModelManagementPage(@Valid ModelManagementPageReqVO pageReqVO) { diff --git a/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/controller/admin/modelmanagement/vo/ModelManagementPageReqVO.java b/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/controller/admin/modelmanagement/vo/ModelManagementPageReqVO.java index adc57a84..f6a10d11 100644 --- a/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/controller/admin/modelmanagement/vo/ModelManagementPageReqVO.java +++ b/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/controller/admin/modelmanagement/vo/ModelManagementPageReqVO.java @@ -52,5 +52,6 @@ public class ModelManagementPageReqVO extends PageParam { @Schema(description = "租户id", example = "20468") private String tenantId; - + private int isRelease; + private int quoteCount; } \ No newline at end of file diff --git a/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/controller/admin/modelmanagement/vo/ModelManagementRespVO.java b/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/controller/admin/modelmanagement/vo/ModelManagementRespVO.java index 438a74b3..a662fec3 100644 --- a/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/controller/admin/modelmanagement/vo/ModelManagementRespVO.java +++ b/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/controller/admin/modelmanagement/vo/ModelManagementRespVO.java @@ -71,7 +71,8 @@ public class ModelManagementRespVO { @Schema(description = "租户id", example = "20468") @ExcelProperty("租户id") private String tenantId; - + private int isRelease; + private int quoteCount; private List modelCycles; } diff --git a/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/controller/admin/modelmanagement/vo/ModelManagementSaveReqVO.java b/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/controller/admin/modelmanagement/vo/ModelManagementSaveReqVO.java index e56a4b8e..1e784e68 100644 --- a/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/controller/admin/modelmanagement/vo/ModelManagementSaveReqVO.java +++ b/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/controller/admin/modelmanagement/vo/ModelManagementSaveReqVO.java @@ -47,5 +47,6 @@ public class ModelManagementSaveReqVO { @Schema(description = "租户id", example = "20468") private String tenantId; - + private int isRelease; + private int quoteCount; } \ No newline at end of file diff --git a/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/dal/dataobject/modelmanagement/ModelManagementDO.java b/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/dal/dataobject/modelmanagement/ModelManagementDO.java index 0fc24625..1185980a 100644 --- a/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/dal/dataobject/modelmanagement/ModelManagementDO.java +++ b/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/dal/dataobject/modelmanagement/ModelManagementDO.java @@ -1,12 +1,12 @@ package cn.iocoder.yudao.module.farm.dal.dataobject.modelmanagement; import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; -import cn.iocoder.yudao.module.farm.dal.dataobject.modelcycle.ModelCycleDO; -import com.baomidou.mybatisplus.annotation.*; +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.KeySequence; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; import lombok.*; -import java.util.List; - /** * 模型管理 DO * @@ -81,5 +81,6 @@ public class ModelManagementDO extends BaseDO { * 任务ID */ private String taskId; - + private int isRelease; + private int quoteCount; } diff --git a/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/dal/mysql/modelmanagement/ModelManagementMapper.java b/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/dal/mysql/modelmanagement/ModelManagementMapper.java index 01037db3..2094bb2f 100644 --- a/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/dal/mysql/modelmanagement/ModelManagementMapper.java +++ b/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/dal/mysql/modelmanagement/ModelManagementMapper.java @@ -3,12 +3,12 @@ package cn.iocoder.yudao.module.farm.dal.mysql.modelmanagement; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX; import cn.iocoder.yudao.framework.mybatis.core.query.MPJLambdaWrapperX; -import cn.iocoder.yudao.module.farm.dal.dataobject.modelmanagement.ModelManagementDO; -import cn.iocoder.yudao.module.farm.dal.dataobject.specieslibrary.SpeciesLibraryDO; +import cn.iocoder.yudao.module.farm.controller.admin.modelmanagement.vo.ModelManagementPageReqVO; import cn.iocoder.yudao.module.farm.dal.dataobject.baseinfo.BaseInfoDO; +import cn.iocoder.yudao.module.farm.dal.dataobject.modelmanagement.ModelManagementDO; import cn.iocoder.yudao.module.farm.dal.dataobject.plotinfo.PlotInfoDO; +import cn.iocoder.yudao.module.farm.dal.dataobject.specieslibrary.SpeciesLibraryDO; import org.apache.ibatis.annotations.Mapper; -import cn.iocoder.yudao.module.farm.controller.admin.modelmanagement.vo.*; /** * 模型管理 Mapper @@ -48,4 +48,25 @@ public interface ModelManagementMapper extends BaseMapperX { return selectJoinPage(reqVO, ModelManagementDO.class, query); } + default PageResult selectPageRelease(ModelManagementPageReqVO reqVO) { + MPJLambdaWrapperX query = new MPJLambdaWrapperX() + .selectAll(ModelManagementDO.class) + .likeIfPresent(ModelManagementDO::getModelName, reqVO.getModelName()) + .eqIfPresent(ModelManagementDO::getSpeciesId, reqVO.getSpeciesId()) + .likeIfPresent(ModelManagementDO::getSpeciesName, reqVO.getSpeciesName()) + .eqIfPresent(ModelManagementDO::getCycle, reqVO.getCycle()) + .eqIfPresent(ModelManagementDO::getHarvest, reqVO.getHarvest()) + .eqIfPresent(ModelManagementDO::getSuitablePlantingAreas, reqVO.getSuitablePlantingAreas()) + .eqIfPresent(ModelManagementDO::getDescription, reqVO.getDescription()) + .betweenIfPresent(ModelManagementDO::getCreateTime, reqVO.getCreateTime()) + .eqIfPresent(ModelManagementDO::getBaseId, reqVO.getBaseId()) + .likeIfPresent(ModelManagementDO::getBaseName, reqVO.getBaseName()) + .eqIfPresent(ModelManagementDO::getPlotId, reqVO.getPlotId()) + .likeIfPresent(ModelManagementDO::getPlotName, reqVO.getPlotName()) + .eqIfPresent(ModelManagementDO::getTenantId, reqVO.getTenantId()) + .eqIfPresent(ModelManagementDO::getIsRelease, 1) + .orderByDesc(ModelManagementDO::getCreateTime); + + return selectJoinPage(reqVO, ModelManagementDO.class, query); + } } \ No newline at end of file diff --git a/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/service/modelmanagement/ModelManagementService.java b/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/service/modelmanagement/ModelManagementService.java index 4334edec..a12c8194 100644 --- a/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/service/modelmanagement/ModelManagementService.java +++ b/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/service/modelmanagement/ModelManagementService.java @@ -62,4 +62,9 @@ public interface ModelManagementService { */ PageResult getModelManagementPage(ModelManagementPageReqVO pageReqVO); + String copyModelManagement(@Valid ModelManagementSaveReqVO createReqVO); + + void isRelease(@Valid ModelManagementSaveReqVO updateReqVO); + + PageResult getModelManagementPageRelease(@Valid ModelManagementPageReqVO pageReqVO); } \ No newline at end of file diff --git a/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/service/modelmanagement/ModelManagementServiceImpl.java b/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/service/modelmanagement/ModelManagementServiceImpl.java index d48fc26c..cae21b07 100644 --- a/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/service/modelmanagement/ModelManagementServiceImpl.java +++ b/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/service/modelmanagement/ModelManagementServiceImpl.java @@ -66,6 +66,7 @@ public class ModelManagementServiceImpl implements ModelManagementService { ModelManagementDO modelManagement = BeanUtils.toBean(createReqVO, ModelManagementDO.class); modelManagement.setId(IdUtil.fastUUID()); modelManagement.setTenantId(String.valueOf(user.getTenantId())); + modelManagement.setIsRelease(0); modelManagementMapper.insert(modelManagement); // 返回 @@ -83,7 +84,8 @@ public class ModelManagementServiceImpl implements ModelManagementService { if (modelManagementDO == null) { return ""; } - + modelManagementDO.setQuoteCount(modelManagementDO.getQuoteCount() + 1); + modelManagementMapper.updateById(modelManagementDO); // 2. 创建新的模型引用案例 ModelManagementDO newModelCase = BeanUtils.toBean(modelManagementDO, ModelManagementDO.class); String newModelId = IdUtil.fastUUID(); @@ -99,11 +101,10 @@ public class ModelManagementServiceImpl implements ModelManagementService { List originalCycles = modelCycleMapper.selectListByModelId(id); for (ModelCycleDO originalCycle : originalCycles) { // 复制周期 - ModelCycleDO newCycle = BeanUtils.toBean(originalCycle, ModelCycleDO.class); String newCycleId = IdUtil.fastUUID(); - newCycle.setId(newCycleId); - newCycle.setModelId(newModelId); - modelCycleMapper.insert(newCycle); + originalCycle.setId(newCycleId); + originalCycle.setModelId(newModelId); + modelCycleMapper.insert(originalCycle); // 复制环境指标 List environmentIndexes = modelEnvironmentIndexMapper.selectByCycleId(originalCycle.getId()); @@ -218,4 +219,97 @@ public class ModelManagementServiceImpl implements ModelManagementService { return modelManagementMapper.selectPage(pageReqVO); } + @Override + public String copyModelManagement(ModelManagementSaveReqVO createReqVO) { + // 1. 查询原模型(类型为模型模板) + ModelManagementDO modelManagementDO = modelManagementMapper.selectOne( + ModelManagementDO::getId, createReqVO.getId(), + ModelManagementDO::getType, CommonConstants.MODEL_TYPE_1 + ); + + if (modelManagementDO == null) { + return ""; + } + + // 2. 创建新的模型引用案例 + ModelManagementDO newModelCase = BeanUtils.toBean(modelManagementDO, ModelManagementDO.class); + String newModelId = IdUtil.fastUUID(); + newModelCase.setId(newModelId); + newModelCase.setType(CommonConstants.MODEL_TYPE_1); + newModelCase.setModelName(modelManagementDO.getModelName() + "-复制模型"); + + // 3. 保存新的模型引用案例 + modelManagementMapper.insert(newModelCase); + + // 4. 复制模型周期及其子集 + List originalCycles = modelCycleMapper.selectListByModelId(createReqVO.getId()); + for (ModelCycleDO originalCycle : originalCycles) { + // 复制周期 + String newCycleId = IdUtil.fastUUID(); + originalCycle.setId(newCycleId); + originalCycle.setModelId(newModelId); + modelCycleMapper.insert(originalCycle); + + // 复制环境指标 + List environmentIndexes = modelEnvironmentIndexMapper.selectByCycleId(originalCycle.getId()); + for (ModelEnvironmentIndexDO envIndex : environmentIndexes) { + envIndex.setId(IdUtil.fastUUID()); + envIndex.setCycleId(newCycleId); + modelEnvironmentIndexMapper.insert(envIndex); + } + + // 复制气象灾害 + List weatherDisasters = modelWeatherDisasterMapper.selectByCycleId(originalCycle.getId()); + for (ModelWeatherDisasterDO weatherDisaster : weatherDisasters) { + weatherDisaster.setId(IdUtil.fastUUID()); + weatherDisaster.setCycleId(newCycleId); + modelWeatherDisasterMapper.insert(weatherDisaster); + } + + // 复制病虫草灾害 + List pestDiseaseWeeds = modelPestDiseaseWeedMapper.selectByCycleId(originalCycle.getId()); + for (ModelPestDiseaseWeedDO pestDiseaseWeed : pestDiseaseWeeds) { + pestDiseaseWeed.setId(IdUtil.fastUUID()); + pestDiseaseWeed.setCycleId(newCycleId); + modelPestDiseaseWeedMapper.insert(pestDiseaseWeed); + } + + // 复制农事操作 + List farmingOperations = modelFarmingOperationMapper.selectByCycleId(originalCycle.getId()); + for (ModelFarmingOperationDO farmingOperation : farmingOperations) { + String newFarmingId = IdUtil.fastUUID(); + farmingOperation.setId(newFarmingId); + farmingOperation.setCycleId(newCycleId); + modelFarmingOperationMapper.insert(farmingOperation); + + // 复制农事操作投入品 + List farmingOperationInputs = modelFarmingOperationInputMapper.selectByFarmingId(farmingOperation.getId()); + for (ModelFarmingOperationInputDO farmingOperationInput : farmingOperationInputs) { + farmingOperationInput.setId(IdUtil.fastUUID()); + farmingOperationInput.setFarmingId(newFarmingId); + modelFarmingOperationInputMapper.insert(farmingOperationInput); + } + } + } + // 返回新建的模型引用案例ID + return newModelId; + } + + @Override + public void isRelease(ModelManagementSaveReqVO updateReqVO) { + + ModelManagementDO modelManagementDO = modelManagementMapper.selectById(updateReqVO.getId()); + if (modelManagementDO.getIsRelease() == 0) { + modelManagementDO.setIsRelease(1); + } else { + modelManagementDO.setIsRelease(0); + } + modelManagementMapper.updateById(modelManagementDO); + } + + @Override + public PageResult getModelManagementPageRelease(ModelManagementPageReqVO pageReqVO) { + return modelManagementMapper.selectPageRelease(pageReqVO); + } + } \ No newline at end of file diff --git a/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/utils/TreeStructureUtil.java b/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/utils/TreeStructureUtil.java index cee152ef..9208cf9a 100644 --- a/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/utils/TreeStructureUtil.java +++ b/yudao-module-farm/src/main/java/cn/iocoder/yudao/module/farm/utils/TreeStructureUtil.java @@ -49,6 +49,39 @@ public class TreeStructureUtil { } } + /** + * 构建物种类别二级树结构 + * + * @param dictList 字典数据列表 + * @return 二级树形结构列表 + */ + public static List buildTwoLevelTree(List dictList) { + if (dictList == null || dictList.isEmpty()) { + return new ArrayList<>(); + } + + try { + // 按一级分类分组 + Map> groupedByLevel1 = dictList.stream() + .filter(dict -> isValidLevel1Node(dict)) + .collect(Collectors.groupingBy( + SysDictDO::getField1Code, + Collectors.toList() + )); + + // 构建二级树形结构 + return groupedByLevel1.entrySet().stream() + .map(entry -> buildTwoLevelNode(entry.getKey(), entry.getValue())) + .filter(Objects::nonNull) + .sorted(Comparator.comparing(SpeciesClassifyLibraryRespVO::getSpeciesClassName)) + .collect(Collectors.toList()); + + } catch (Exception e) { + // 记录错误日志,返回空列表 + return new ArrayList<>(); + } + } + /** * 构建通用树结构 * @@ -209,4 +242,62 @@ public class TreeStructureUtil { level2Node.setChildren(level3Nodes); return level2Node; } + + /** + * 构建二级树节点(只包含一级和二级,不包含三级) + */ + private static SpeciesClassifyLibraryRespVO buildTwoLevelNode(String level1Code, List level1Children) { + if (level1Children == null || level1Children.isEmpty()) { + return null; + } + + // 获取一级分类名称 + String level1Name = level1Children.stream() + .filter(TreeStructureUtil::isValidLevel1Node) + .map(SysDictDO::getField1Name) + .findFirst() + .orElse(""); + + if (level1Name.isEmpty()) { + return null; + } + + // 创建一级节点 + SpeciesClassifyLibraryRespVO level1Node = new SpeciesClassifyLibraryRespVO(level1Code, level1Name); + + // 按二级分类分组 + Map> groupedByLevel2 = level1Children.stream() + .filter(dict -> isValidLevel2Node(dict)) + .collect(Collectors.groupingBy( + SysDictDO::getField2Code, + Collectors.toList() + )); + + // 构建二级节点列表(不包含三级) + List level2Nodes = groupedByLevel2.entrySet().stream() + .map(entry -> { + String level2Code = entry.getKey(); + List level2Children = entry.getValue(); + + // 获取二级分类名称 + String level2Name = level2Children.stream() + .filter(TreeStructureUtil::isValidLevel2Node) + .map(SysDictDO::getField2Name) + .findFirst() + .orElse(""); + + if (level2Name.isEmpty()) { + return null; + } + + // 创建二级节点(不设置children,即不包含三级分类) + return new SpeciesClassifyLibraryRespVO(level2Code, level2Name); + }) + .filter(Objects::nonNull) + .sorted(Comparator.comparing(SpeciesClassifyLibraryRespVO::getSpeciesClassName)) + .collect(Collectors.toList()); + + level1Node.setChildren(level2Nodes); + return level1Node; + } }