diff --git a/ruoyi-modules/ruoyi-md-form/ruoyi-md-form-api/src/main/java/com/dromara/md/form/api/dto/FormDictImportDTO.java b/ruoyi-modules/ruoyi-md-form/ruoyi-md-form-api/src/main/java/com/dromara/md/form/api/dto/FormDictImportDTO.java new file mode 100644 index 000000000..7813f9abf --- /dev/null +++ b/ruoyi-modules/ruoyi-md-form/ruoyi-md-form-api/src/main/java/com/dromara/md/form/api/dto/FormDictImportDTO.java @@ -0,0 +1,31 @@ +package com.dromara.md.form.api.dto; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; +import java.util.List; + +/** + * 用的表单字典VO + */ +@Data +@ApiModel(description = "表单字典导入DTO") +public class FormDictImportDTO implements Serializable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty(value = "名称") + private String name; + + @ApiModelProperty(value = "编码") + private String code; + + @ApiModelProperty(value = "备注") + private String remarks; + + @ApiModelProperty(value = "字典项列表") + private List items; + +} diff --git a/ruoyi-modules/ruoyi-md-form/ruoyi-md-form-api/src/main/java/com/dromara/md/form/api/dto/FormFieldDictImportDTO.java b/ruoyi-modules/ruoyi-md-form/ruoyi-md-form-api/src/main/java/com/dromara/md/form/api/dto/FormFieldDictImportDTO.java new file mode 100644 index 000000000..364319e95 --- /dev/null +++ b/ruoyi-modules/ruoyi-md-form/ruoyi-md-form-api/src/main/java/com/dromara/md/form/api/dto/FormFieldDictImportDTO.java @@ -0,0 +1,26 @@ +package com.dromara.md.form.api.dto; + +import lombok.Getter; +import lombok.Setter; + +import java.util.List; + +@Getter +@Setter +public class FormFieldDictImportDTO { + + private String configType; + + private String name; + + private String code; + + private Integer sortOrder; + + private Integer status; + + private String otherFields; + + private List children; + +} diff --git a/ruoyi-modules/ruoyi-md-form/ruoyi-md-form-service/src/main/java/com/dromara/md/form/controller/FormDictController.java b/ruoyi-modules/ruoyi-md-form/ruoyi-md-form-service/src/main/java/com/dromara/md/form/controller/FormDictController.java index 77aabfbc6..74e35fa94 100644 --- a/ruoyi-modules/ruoyi-md-form/ruoyi-md-form-service/src/main/java/com/dromara/md/form/controller/FormDictController.java +++ b/ruoyi-modules/ruoyi-md-form/ruoyi-md-form-service/src/main/java/com/dromara/md/form/controller/FormDictController.java @@ -3,10 +3,8 @@ package com.dromara.md.form.controller; import com.baomidou.mybatisplus.core.metadata.IPage; import com.dromara.md.form.api.constant.BaseConstant; import com.dromara.md.form.api.dto.FormDictDTO; -import com.dromara.md.form.api.dto.FormFieldDictDTO; -import com.dromara.md.form.api.dto.FormFieldDictQ; +import com.dromara.md.form.api.dto.FormDictImportDTO; import com.dromara.md.form.api.vo.FormDictVO; -import com.dromara.md.form.api.vo.FormFieldDictVO; import com.dromara.md.form.mybatis.entity.FormDict; import com.dromara.md.form.service.FormDictService; import com.dromara.md.form.service.FormFieldDictService; @@ -19,8 +17,8 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; -import java.util.*; -import java.util.stream.Collectors; +import java.util.List; +import java.util.Map; /** * FormDict Controller 实现增删改查接口 @@ -123,140 +121,21 @@ public class FormDictController { @ApiOperation(value = "导出字典数据") @PostMapping("/exportDicts") public List exportDicts(@RequestBody List configTypes) { - if (configTypes == null || configTypes.isEmpty()) { - return Collections.emptyList(); - } - - // 获取字典基本信息 - List formDicts = formDictService.list(configTypes); - List result = new ArrayList<>(); - - // 为每个字典类型查询并组装字典项数据 - for (FormDict formDict : formDicts) { - FormDictVO dictVO = new FormDictVO(); - dictVO.setName(formDict.getName()); - dictVO.setCode(formDict.getCode()); - dictVO.setRemarks(formDict.getRemarks()); - dictVO.setCreatedBy(formDict.getCreatedBy()); - dictVO.setUpdatedBy(formDict.getUpdatedBy()); - dictVO.setCreateTime(formDict.getCreateTime()); - dictVO.setUpdateTime(formDict.getUpdateTime()); - dictVO.setDeleted(formDict.getDeleted()); - - // 查询该字典类型的字典项数据 - FormFieldDictQ query = new FormFieldDictQ(); - query.setTree(true); // 返回树形结构 - Map q = new HashMap<>(); - q.put(formDict.getCode(), query); - - Map> dictData = formFieldDictService.get(q); - List dictItems = dictData.get(formDict.getCode()); - dictVO.setItems(dictItems != null ? dictItems : new ArrayList<>()); - - result.add(dictVO); - } - + List result = formDictService.exportDicts(configTypes); return result; } /** * 导入字典数据 * - * @param formDictVOs 导入的字典数据列表 + * @param formDictImportDTOs 导入的字典数据列表 * @return 导入结果,包括忽略的字典信息 */ @ApiOperation(value = "导入字典数据") @PostMapping("/importDicts") - public Map importDicts(@RequestBody List formDictVOs) { - Map result = new HashMap<>(); - - if (formDictVOs == null || formDictVOs.isEmpty()) { - result.put("success", false); - result.put("message", "导入数据为空"); - return result; - } - - // 收集所有要导入的字典类型 - Set importConfigTypes = formDictVOs.stream() - .filter(item -> item != null && item.getCode() != null && item.getName() != null) - .map(FormDictVO::getCode) - .collect(Collectors.toSet()); - - // 检查要导入的字典类型是否已存在 - importConfigTypes = formDictService.getNotExistConfigCode(importConfigTypes); - - // 导入不存在的字典类型 - List importedConfigTypes = new ArrayList<>(); - List ignoredConfigTypes = new ArrayList<>(); - - for (FormDictVO formDictVO : formDictVOs) { - if (formDictVO == null) { - continue; - } - if (importConfigTypes.contains(formDictVO.getCode())) { - importedConfigTypes.add(formDictVO.getCode()); - // 字典类型不存在,可以创建 - FormDictDTO dto = new FormDictDTO(); - dto.setName(formDictVO.getName()); - dto.setCode(formDictVO.getCode()); - dto.setRemarks(formDictVO.getRemarks()); - // 导入字典项 - formDictService.createOrUpdate(dto); - - List itemsToImport = formDictVO.getItems(); - if (itemsToImport != null && !itemsToImport.isEmpty()) { - importFormFieldDicts(itemsToImport, formDictVO.getCode()); - } - } else { - // 字典类型已存在,跳过 - ignoredConfigTypes.add(formDictVO.getCode() + " (因字典类型已存在而忽略)"); - } - } - - // 构建返回结果 - result.put("success", true); - result.put("message", "字典数据导入完成"); - result.put("importedConfigTypes", importedConfigTypes); - result.put("ignoredConfigTypes", ignoredConfigTypes); - + public Map importDicts(@RequestBody List formDictImportDTOs) { + Map result = formDictService.importDicts(formDictImportDTOs); return result; } - - /** - * 导入字典项数据 TODO 导入性能优化 - * - * @param itemsToImport 要导入的字典项列表 - * @param configType 字典类型 - */ - private void importFormFieldDicts(List itemsToImport, String configType) { - if (itemsToImport == null || itemsToImport.isEmpty()) return; - - for (FormFieldDictVO item : itemsToImport) { - - // 创建DTO对象并导入 - FormFieldDictDTO dto = new FormFieldDictDTO(); - dto.setName(item.getName()); - dto.setCode(item.getCode()); - dto.setConfigType(configType); - dto.setStatus(item.getStatus() == null ? 1 : item.getStatus()); - dto.setSortOrder(item.getSortOrder()); - dto.setParentId(item.getParentId()); - - //TODO 导入这里还有问题 -// dto.setOtherFields(item.getOtherFields()); - - Long newItemId = formFieldDictService.createOrUpdate(dto); - - // 递归处理子节点 - if (item.getChildren() != null && !item.getChildren().isEmpty()) { - // 更新子节点的父ID为新创建的ID - for (FormFieldDictVO child : item.getChildren()) { - child.setParentId(newItemId); - } - importFormFieldDicts(item.getChildren(), configType); - } - } - } - } diff --git a/ruoyi-modules/ruoyi-md-form/ruoyi-md-form-service/src/main/java/com/dromara/md/form/service/FormDictService.java b/ruoyi-modules/ruoyi-md-form/ruoyi-md-form-service/src/main/java/com/dromara/md/form/service/FormDictService.java index d08cad60c..c3908576f 100644 --- a/ruoyi-modules/ruoyi-md-form/ruoyi-md-form-service/src/main/java/com/dromara/md/form/service/FormDictService.java +++ b/ruoyi-modules/ruoyi-md-form/ruoyi-md-form-service/src/main/java/com/dromara/md/form/service/FormDictService.java @@ -7,6 +7,11 @@ import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.dromara.md.form.api.dto.FormDictDTO; +import com.dromara.md.form.api.dto.FormDictImportDTO; +import com.dromara.md.form.api.dto.FormFieldDictImportDTO; +import com.dromara.md.form.api.dto.FormFieldDictQ; +import com.dromara.md.form.api.vo.FormDictVO; +import com.dromara.md.form.api.vo.FormFieldDictVO; import com.dromara.md.form.mybatis.entity.FormDict; import com.dromara.md.form.mybatis.mapper.FormDictMapper; import lombok.extern.slf4j.Slf4j; @@ -209,4 +214,124 @@ public class FormDictService extends ServiceImpl { } return notExistCodes; } + + + /** + * 导出字典数据为JSON + * + * @param configTypes 字典类型集合 + * @return 包含字典数据的响应 + */ + public List exportDicts(List configTypes) { + if (configTypes == null || configTypes.isEmpty()) { + return Collections.emptyList(); + } + + // 获取字典基本信息 + List formDicts = list(configTypes); + List result = new ArrayList<>(); + + // 为每个字典类型查询并组装字典项数据 + for (FormDict formDict : formDicts) { + FormDictVO dictVO = new FormDictVO(); + dictVO.setName(formDict.getName()); + dictVO.setCode(formDict.getCode()); + dictVO.setRemarks(formDict.getRemarks()); + dictVO.setCreatedBy(formDict.getCreatedBy()); + dictVO.setUpdatedBy(formDict.getUpdatedBy()); + dictVO.setCreateTime(formDict.getCreateTime()); + dictVO.setUpdateTime(formDict.getUpdateTime()); + dictVO.setDeleted(formDict.getDeleted()); + + // 查询该字典类型的字典项数据 + FormFieldDictQ query = new FormFieldDictQ(); + query.setTree(true); // 返回树形结构 + query.setAllStatus(true); // 返回全部状态 + Map q = new HashMap<>(); + q.put(formDict.getCode(), query); + + Map> dictData = formFieldDictService.get(q); + List dictItems = dictData.get(formDict.getCode()); + dictVO.setItems(dictItems != null ? dictItems : new ArrayList<>()); + + result.add(dictVO); + } + return result; + } + + /** + * 导入字典数据 + * + * @param formDictImportDTOs 导入的字典数据列表 + * @return 导入结果,包括忽略的字典信息 + */ + @Transactional + public Map importDicts(List formDictImportDTOs) { + Map result = new HashMap<>(); + + if (formDictImportDTOs == null || formDictImportDTOs.isEmpty()) { + result.put("success", false); + result.put("message", "导入数据为空"); + return result; + } + // 收集所有要导入的字典类型 + Set importConfigTypes = formDictImportDTOs.stream() + .filter(item -> item != null && item.getCode() != null && item.getName() != null) + .map(FormDictImportDTO::getCode) + .collect(Collectors.toSet()); + + // 检查要导入的字典类型是否已存在 + importConfigTypes = getNotExistConfigCode(importConfigTypes); + // 导入不存在的字典类型 + List importedConfigTypes = new ArrayList<>(); + List ignoredConfigTypes = new ArrayList<>(); + for (FormDictImportDTO dict : formDictImportDTOs) { + if (dict == null) { + continue; + } + if (importConfigTypes.contains(dict.getCode())) { + importedConfigTypes.add(dict.getCode()); + // 字典类型不存在,可以创建 + FormDictDTO dto = new FormDictDTO(); + dto.setName(dict.getName()); + dto.setCode(dict.getCode()); + dto.setRemarks(dict.getRemarks()); + // 导入字典项 + createOrUpdate(dto); + + List itemsToImport = dict.getItems(); + if (itemsToImport != null && !itemsToImport.isEmpty()) { + importFormFieldDicts(itemsToImport, dict.getCode(), null); + } + } else { + // 字典类型已存在,跳过 + ignoredConfigTypes.add(dict.getCode() + " (因字典类型已存在而忽略)"); + } + } + // 构建返回结果 + result.put("success", true); + result.put("message", "字典数据导入完成"); + result.put("importedConfigTypes", importedConfigTypes); + result.put("ignoredConfigTypes", ignoredConfigTypes); + return result; + } + + /** + * 导入字典项数据 + * + * @param itemsToImport 要导入的字典项列表 + * @param configType 字典类型 + * @param parentId 父节点ID + */ + private void importFormFieldDicts(List itemsToImport, String configType, Long parentId) { + if (itemsToImport == null || itemsToImport.isEmpty()) return; + for (FormFieldDictImportDTO item : itemsToImport) { + item.setConfigType(configType); + Long newItemId = formFieldDictService.importCreate(item, parentId); + // 递归处理子节点 + if (item.getChildren() != null && !item.getChildren().isEmpty()) { + importFormFieldDicts(item.getChildren(), configType, newItemId); + } + } + } } diff --git a/ruoyi-modules/ruoyi-md-form/ruoyi-md-form-service/src/main/java/com/dromara/md/form/service/FormFieldDictService.java b/ruoyi-modules/ruoyi-md-form/ruoyi-md-form-service/src/main/java/com/dromara/md/form/service/FormFieldDictService.java index e68f7662e..0b792081e 100644 --- a/ruoyi-modules/ruoyi-md-form/ruoyi-md-form-service/src/main/java/com/dromara/md/form/service/FormFieldDictService.java +++ b/ruoyi-modules/ruoyi-md-form/ruoyi-md-form-service/src/main/java/com/dromara/md/form/service/FormFieldDictService.java @@ -10,6 +10,7 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.dromara.md.form.api.constant.FormFieldDictType; import com.dromara.md.form.api.dto.DictCodesDTO; import com.dromara.md.form.api.dto.FormFieldDictDTO; +import com.dromara.md.form.api.dto.FormFieldDictImportDTO; import com.dromara.md.form.api.dto.FormFieldDictQ; import com.dromara.md.form.api.vo.FormFieldDictDifyVo; import com.dromara.md.form.api.vo.FormFieldDictVO; @@ -81,6 +82,24 @@ public class FormFieldDictService extends ServiceImpl 0) { + throw new ServiceException("已存在相同的编码:" + dto.getCode()); + } + if (countByName(dto.getConfigType(), dto.getName(), null) > 0) { + throw new ServiceException("已存在相同的名称:" + dto.getName()); + } + FormFieldDict entity = new FormFieldDict(); + BeanUtil.copyProperties(dto, entity); + //新增 + entity.setParentId(parentId); + entity.setDeleted(0); + entity.setCreateTime(new Date()); + entity.setCreatedBy(LoginHelper.getUserId()); + baseMapper.insert(entity); + return entity.getId(); + } + /** * 根据configType获取表单字段配置 *