Merge remote-tracking branch 'origin/5.X_bak' into 5.X_bak

This commit is contained in:
lizhengwei 2026-02-27 21:01:09 +08:00
commit aa5828f769
5 changed files with 208 additions and 128 deletions

View File

@ -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<FormFieldDictImportDTO> items;
}

View File

@ -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<FormFieldDictImportDTO> children;
}

View File

@ -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<FormDictVO> exportDicts(@RequestBody List<String> configTypes) {
if (configTypes == null || configTypes.isEmpty()) {
return Collections.emptyList();
}
// 获取字典基本信息
List<FormDict> formDicts = formDictService.list(configTypes);
List<FormDictVO> 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<String, FormFieldDictQ> q = new HashMap<>();
q.put(formDict.getCode(), query);
Map<String, List<FormFieldDictVO>> dictData = formFieldDictService.get(q);
List<FormFieldDictVO> dictItems = dictData.get(formDict.getCode());
dictVO.setItems(dictItems != null ? dictItems : new ArrayList<>());
result.add(dictVO);
}
List<FormDictVO> result = formDictService.exportDicts(configTypes);
return result;
}
/**
* 导入字典数据
*
* @param formDictVOs 导入的字典数据列表
* @param formDictImportDTOs 导入的字典数据列表
* @return 导入结果包括忽略的字典信息
*/
@ApiOperation(value = "导入字典数据")
@PostMapping("/importDicts")
public Map<String, Object> importDicts(@RequestBody List<FormDictVO> formDictVOs) {
Map<String, Object> result = new HashMap<>();
if (formDictVOs == null || formDictVOs.isEmpty()) {
result.put("success", false);
result.put("message", "导入数据为空");
return result;
}
// 收集所有要导入的字典类型
Set<String> importConfigTypes = formDictVOs.stream()
.filter(item -> item != null && item.getCode() != null && item.getName() != null)
.map(FormDictVO::getCode)
.collect(Collectors.toSet());
// 检查要导入的字典类型是否已存在
importConfigTypes = formDictService.getNotExistConfigCode(importConfigTypes);
// 导入不存在的字典类型
List<String> importedConfigTypes = new ArrayList<>();
List<String> 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<FormFieldDictVO> 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<String, Object> importDicts(@RequestBody List<FormDictImportDTO> formDictImportDTOs) {
Map<String, Object> result = formDictService.importDicts(formDictImportDTOs);
return result;
}
/**
* 导入字典项数据 TODO 导入性能优化
*
* @param itemsToImport 要导入的字典项列表
* @param configType 字典类型
*/
private void importFormFieldDicts(List<FormFieldDictVO> 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);
}
}
}
}

View File

@ -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<FormDictMapper, FormDict> {
}
return notExistCodes;
}
/**
* 导出字典数据为JSON
*
* @param configTypes 字典类型集合
* @return 包含字典数据的响应
*/
public List<FormDictVO> exportDicts(List<String> configTypes) {
if (configTypes == null || configTypes.isEmpty()) {
return Collections.emptyList();
}
// 获取字典基本信息
List<FormDict> formDicts = list(configTypes);
List<FormDictVO> 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<String, FormFieldDictQ> q = new HashMap<>();
q.put(formDict.getCode(), query);
Map<String, List<FormFieldDictVO>> dictData = formFieldDictService.get(q);
List<FormFieldDictVO> dictItems = dictData.get(formDict.getCode());
dictVO.setItems(dictItems != null ? dictItems : new ArrayList<>());
result.add(dictVO);
}
return result;
}
/**
* 导入字典数据
*
* @param formDictImportDTOs 导入的字典数据列表
* @return 导入结果包括忽略的字典信息
*/
@Transactional
public Map<String, Object> importDicts(List<FormDictImportDTO> formDictImportDTOs) {
Map<String, Object> result = new HashMap<>();
if (formDictImportDTOs == null || formDictImportDTOs.isEmpty()) {
result.put("success", false);
result.put("message", "导入数据为空");
return result;
}
// 收集所有要导入的字典类型
Set<String> importConfigTypes = formDictImportDTOs.stream()
.filter(item -> item != null && item.getCode() != null && item.getName() != null)
.map(FormDictImportDTO::getCode)
.collect(Collectors.toSet());
// 检查要导入的字典类型是否已存在
importConfigTypes = getNotExistConfigCode(importConfigTypes);
// 导入不存在的字典类型
List<String> importedConfigTypes = new ArrayList<>();
List<String> 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<FormFieldDictImportDTO> 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<FormFieldDictImportDTO> 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);
}
}
}
}

View File

@ -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<FormFieldDictMapper, FormF
}
}
public Long importCreate(FormFieldDictImportDTO dto, Long parentId) {
if (countByCode(dto.getConfigType(), dto.getCode(), null) > 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获取表单字段配置
*