mirror of
https://gitee.com/dromara/RuoYi-Vue-Plus.git
synced 2026-09-18 01:25:28 +08:00
Merge remote-tracking branch 'origin/5.X_bak' into 5.X_bak
This commit is contained in:
commit
aa5828f769
@ -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;
|
||||
|
||||
}
|
||||
@ -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;
|
||||
|
||||
}
|
||||
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -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获取表单字段配置
|
||||
*
|
||||
|
||||
Loading…
Reference in New Issue
Block a user