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 aeb6d6d4..a1db7abc 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 @@ -10,6 +10,7 @@ import cn.iocoder.yudao.module.farm.controller.admin.modelmanagement.vo.ModelMan import cn.iocoder.yudao.module.farm.controller.admin.modelmanagement.vo.ModelManagementRespVO; import cn.iocoder.yudao.module.farm.controller.admin.modelmanagement.vo.ModelManagementSaveReqVO; import cn.iocoder.yudao.module.farm.dal.dataobject.modelmanagement.ModelManagementDO; +import cn.iocoder.yudao.module.farm.framework.util.ModelManagementConvertUtil; import cn.iocoder.yudao.module.farm.service.modelmanagement.ModelManagementService; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Parameter; @@ -100,10 +101,13 @@ public class ModelManagementController { } @GetMapping("/getList") - @Operation(summary = "获得模型管理分页") - public CommonResult> getList(@Valid ModelManagementPageReqVO pageReqVO) { + @Operation(summary = "获得模型管理列表") + public CommonResult> getList(@Valid ModelManagementPageReqVO pageReqVO) { List pageResult = modelManagementService.getList(pageReqVO); - return success(pageResult); + List respVOList = pageResult.stream() + .map(this::convertToRespVO) + .collect(java.util.stream.Collectors.toList()); + return success(respVOList); } @GetMapping("/export-excel") @@ -135,15 +139,7 @@ public class ModelManagementController { * 转换单个ModelManagementDO为ModelManagementRespVO */ private ModelManagementRespVO convertToRespVO(ModelManagementDO modelManagementDO) { - ModelManagementRespVO respVO = BeanUtils.toBean(modelManagementDO, ModelManagementRespVO.class); - - // 设置suitablePlantingAreas字段,触发自动转换 - respVO.setSuitablePlantingAreas(modelManagementDO.getSuitablePlantingAreasList()); - - // 设置speciesImageList字段,触发自动转换 - respVO.setSpeciesImageList(modelManagementDO.getSpeciesImageList()); - - return respVO; + return ModelManagementConvertUtil.convertToRespVO(modelManagementDO); } } \ 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 daa47364..b56297f6 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 @@ -11,6 +11,9 @@ import lombok.Data; import java.time.LocalDateTime; import java.util.Date; import java.util.List; +import java.util.ArrayList; +import java.util.Map; +import java.util.HashMap; @Schema(description = "管理后台 - 模型管理 Response VO") @Data @@ -41,9 +44,12 @@ public class ModelManagementRespVO { @ExcelProperty("产量参考") private String harvest; - @Schema(description = "地区多选用,隔开") - @ExcelProperty("地区多选用,隔开") - private List suitablePlantingAreas; + @Schema(description = "地区多选用") + @ExcelProperty("地区多选用") + private String suitablePlantingAreasForExcel; + + @Schema(description = "地区多选用") + private List> suitablePlantingAreas; @Schema(description = "品种描述", example = "随便") @ExcelProperty("品种描述") @@ -82,4 +88,25 @@ public class ModelManagementRespVO { private Date releaseTime; private List modelCycles; + /** + * 设置适合种植区域,将字符串列表转换为对象列表格式 + */ + public void setSuitablePlantingAreasFromStringList(List areas) { + if (areas == null) { + this.suitablePlantingAreas = null; + this.suitablePlantingAreasForExcel = null; + return; + } + List> result = new ArrayList<>(); + for (String area : areas) { + Map areaObj = new HashMap<>(); + areaObj.put("id", area); + result.add(areaObj); + } + this.suitablePlantingAreas = result; + + // 同时设置Excel导出用的字符串格式 - 使用分号分隔,避免与地区代码内部的逗号冲突 + this.suitablePlantingAreasForExcel = String.join(";", areas); + } + } 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 557d2704..f6d8f499 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 @@ -4,7 +4,12 @@ import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; import java.util.Date; +import java.util.ArrayList; import java.util.List; +import java.util.Map; +import com.fasterxml.jackson.annotation.JsonProperty; +import lombok.AccessLevel; +import lombok.Setter; @Schema(description = "管理后台 - 模型管理新增/修改 Request VO") @Data @@ -29,8 +34,44 @@ public class ModelManagementSaveReqVO { private String harvest; @Schema(description = "地区多选用,隔开") + @Setter(AccessLevel.NONE) private List suitablePlantingAreas; + /** + * 支持前端传入字符串数组或对象数组(形如 {id: "..."}) + */ + @JsonProperty("suitablePlantingAreas") + public void setSuitablePlantingAreasFlexible(List areas) { + if (areas == null) { + this.suitablePlantingAreas = null; + return; + } + List normalized = new ArrayList<>(); + for (Object item : areas) { + if (item == null) { + continue; + } + if (item instanceof String) { + normalized.add((String) item); + continue; + } + if (item instanceof Map) { + Object idVal = ((Map) item).get("id"); + if (idVal != null) { + normalized.add(String.valueOf(idVal)); + } + continue; + } + // 其他类型统一转字符串(兜底) + normalized.add(String.valueOf(item)); + } + this.suitablePlantingAreas = normalized; + } + + public List getSuitablePlantingAreas() { + return suitablePlantingAreas; + } + @Schema(description = "品种描述", example = "随便") private String description; 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 6e10a24f..95fec25c 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 @@ -12,6 +12,7 @@ import lombok.*; import java.util.Date; import java.util.List; import cn.iocoder.yudao.module.farm.framework.util.ImageCollectionUtil; +import cn.iocoder.yudao.module.farm.framework.util.AreaCodeUtil; /** * 模型管理 DO @@ -131,7 +132,7 @@ public class ModelManagementDO extends BaseDO { */ public List getSuitablePlantingAreasList() { if (suitablePlantingAreasList == null) { - suitablePlantingAreasList = ImageCollectionUtil.toImageList(this.suitablePlantingAreas); + suitablePlantingAreasList = AreaCodeUtil.toAreaCodeList(this.suitablePlantingAreas); } return suitablePlantingAreasList; } @@ -141,6 +142,6 @@ public class ModelManagementDO extends BaseDO { */ public void setSuitablePlantingAreasList(List suitablePlantingAreasList) { this.suitablePlantingAreasList = suitablePlantingAreasList; - this.suitablePlantingAreas = ImageCollectionUtil.toDatabaseString(suitablePlantingAreasList); + this.suitablePlantingAreas = AreaCodeUtil.toDatabaseString(suitablePlantingAreasList); } } 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 a8eb97be..e2e9d820 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 @@ -24,6 +24,7 @@ import cn.iocoder.yudao.module.farm.dal.mysql.modelmanagement.ModelManagementMap import cn.iocoder.yudao.module.farm.dal.mysql.modelpestdiseaseweed.ModelPestDiseaseWeedMapper; import cn.iocoder.yudao.module.farm.dal.mysql.modelweatherdisaster.ModelWeatherDisasterMapper; import cn.iocoder.yudao.module.farm.enums.CommonConstants; +import cn.iocoder.yudao.module.farm.framework.util.ModelManagementConvertUtil; import cn.iocoder.yudao.module.farm.service.sysDict.SysDictService; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import jakarta.annotation.Resource; @@ -74,11 +75,12 @@ public class ModelManagementServiceImpl implements ModelManagementService { modelManagement.setIsRelease(0); modelManagement.setType(CommonConstants.MODEL_TYPE_1); dictService.getDictByField3Code(createReqVO.getSpeciesId()); + // 处理suitablePlantingAreas字段,优先使用集合 if (createReqVO.getSuitablePlantingAreas() != null && !createReqVO.getSuitablePlantingAreas().isEmpty()) { modelManagement.setSuitablePlantingAreasList(createReqVO.getSuitablePlantingAreas()); } - + // 处理speciesImage字段,优先使用图片集合 if (createReqVO.getSpeciesImageList() != null && !createReqVO.getSpeciesImageList().isEmpty()) { modelManagement.setSpeciesImageList(createReqVO.getSpeciesImageList()); @@ -174,22 +176,38 @@ public class ModelManagementServiceImpl implements ModelManagementService { public void updateModelManagement(ModelManagementSaveReqVO updateReqVO) { // 校验存在 validateModelManagementExists(updateReqVO.getId()); - // 更新 - ModelManagementDO updateObj = BeanUtils.toBean(updateReqVO, ModelManagementDO.class); - - // 处理suitablePlantingAreas字段,优先使用集合 - if (updateReqVO.getSuitablePlantingAreas() != null && !updateReqVO.getSuitablePlantingAreas().isEmpty()) { - updateObj.setSuitablePlantingAreasList(updateReqVO.getSuitablePlantingAreas()); + // 读取现有数据,采用合并策略,避免未传字段被置空 + ModelManagementDO existing = modelManagementMapper.selectById(updateReqVO.getId()); + if (existing == null) { + return; } - // 处理speciesImage字段,优先使用图片集合 - if (updateReqVO.getSpeciesImageList() != null && !updateReqVO.getSpeciesImageList().isEmpty()) { - updateObj.setSpeciesImageList(updateReqVO.getSpeciesImageList()); + // 基础字段:仅当请求中非空时才覆盖 + if (updateReqVO.getModelName() != null) existing.setModelName(updateReqVO.getModelName()); + if (updateReqVO.getSpeciesId() != null) existing.setSpeciesId(updateReqVO.getSpeciesId()); + if (updateReqVO.getSpeciesName() != null) existing.setSpeciesName(updateReqVO.getSpeciesName()); + if (updateReqVO.getCycle() != null) existing.setCycle(updateReqVO.getCycle()); + if (updateReqVO.getHarvest() != null) existing.setHarvest(updateReqVO.getHarvest()); + if (updateReqVO.getDescription() != null) existing.setDescription(updateReqVO.getDescription()); + if (updateReqVO.getBaseId() != null) existing.setBaseId(updateReqVO.getBaseId()); + if (updateReqVO.getBaseName() != null) existing.setBaseName(updateReqVO.getBaseName()); + if (updateReqVO.getPlotId() != null) existing.setPlotId(updateReqVO.getPlotId()); + if (updateReqVO.getPlotName() != null) existing.setPlotName(updateReqVO.getPlotName()); + + // 适合种植区域:支持清空(传空数组)与更新(传非空数组) + if (updateReqVO.getSuitablePlantingAreas() != null) { + existing.setSuitablePlantingAreasList(updateReqVO.getSuitablePlantingAreas()); // 空数组会被序列化为空串,达到清空效果 + } + + // 物种图片:支持清空(传空数组)与更新(传非空数组),其次支持单字符串 + if (updateReqVO.getSpeciesImageList() != null) { + existing.setSpeciesImageList(updateReqVO.getSpeciesImageList()); } else if (updateReqVO.getSpeciesImage() != null) { - updateObj.setSpeciesImage(updateReqVO.getSpeciesImage()); + existing.setSpeciesImage(updateReqVO.getSpeciesImage()); } - modelManagementMapper.updateById(updateObj); + // 允许切换发布状态仅通过专用接口,不在此处处理 isRelease/releaseTime + modelManagementMapper.updateById(existing); } @Override @@ -216,11 +234,14 @@ public class ModelManagementServiceImpl implements ModelManagementService { @Override public ModelManagementRespVO getModelManagement(String id) { ModelManagementDO modelManagementDO = modelManagementMapper.selectById(id); - ModelManagementRespVO bean = BeanUtils.toBean(modelManagementDO, ModelManagementRespVO.class); - - // 设置suitablePlantingAreas字段,触发自动转换 - bean.setSuitablePlantingAreas(modelManagementDO.getSuitablePlantingAreasList()); + if (modelManagementDO == null) { + return null; + } + + // 使用统一的转换方法 + ModelManagementRespVO bean = ModelManagementConvertUtil.convertToRespVO(modelManagementDO); + // 设置模型周期信息 List vos = new ArrayList<>(); List list = modelCycleMapper.selectListByModelId(id); list.forEach(cycle -> { diff --git a/yudao-module-farm/src/main/resources/mapper/SysDictMapper.xml b/yudao-module-farm/src/main/resources/mapper/SysDictMapper.xml index 375be726..7e5a8e4c 100644 --- a/yudao-module-farm/src/main/resources/mapper/SysDictMapper.xml +++ b/yudao-module-farm/src/main/resources/mapper/SysDictMapper.xml @@ -46,8 +46,6 @@ SELECT field1_code, field1_name, field2_name, field2_code, field3_code, field3_name FROM farm_sys_dict - DESC LIMIT 1 -