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.baomidou.mybatisplus.core.metadata.IPage;
|
||||||
import com.dromara.md.form.api.constant.BaseConstant;
|
import com.dromara.md.form.api.constant.BaseConstant;
|
||||||
import com.dromara.md.form.api.dto.FormDictDTO;
|
import com.dromara.md.form.api.dto.FormDictDTO;
|
||||||
import com.dromara.md.form.api.dto.FormFieldDictDTO;
|
import com.dromara.md.form.api.dto.FormDictImportDTO;
|
||||||
import com.dromara.md.form.api.dto.FormFieldDictQ;
|
|
||||||
import com.dromara.md.form.api.vo.FormDictVO;
|
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.entity.FormDict;
|
||||||
import com.dromara.md.form.service.FormDictService;
|
import com.dromara.md.form.service.FormDictService;
|
||||||
import com.dromara.md.form.service.FormFieldDictService;
|
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.validation.annotation.Validated;
|
||||||
import org.springframework.web.bind.annotation.*;
|
import org.springframework.web.bind.annotation.*;
|
||||||
|
|
||||||
import java.util.*;
|
import java.util.List;
|
||||||
import java.util.stream.Collectors;
|
import java.util.Map;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* FormDict Controller 实现增删改查接口
|
* FormDict Controller 实现增删改查接口
|
||||||
@ -123,140 +121,21 @@ public class FormDictController {
|
|||||||
@ApiOperation(value = "导出字典数据")
|
@ApiOperation(value = "导出字典数据")
|
||||||
@PostMapping("/exportDicts")
|
@PostMapping("/exportDicts")
|
||||||
public List<FormDictVO> exportDicts(@RequestBody List<String> configTypes) {
|
public List<FormDictVO> exportDicts(@RequestBody List<String> configTypes) {
|
||||||
if (configTypes == null || configTypes.isEmpty()) {
|
List<FormDictVO> result = formDictService.exportDicts(configTypes);
|
||||||
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);
|
|
||||||
}
|
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 导入字典数据
|
* 导入字典数据
|
||||||
*
|
*
|
||||||
* @param formDictVOs 导入的字典数据列表
|
* @param formDictImportDTOs 导入的字典数据列表
|
||||||
* @return 导入结果,包括忽略的字典信息
|
* @return 导入结果,包括忽略的字典信息
|
||||||
*/
|
*/
|
||||||
@ApiOperation(value = "导入字典数据")
|
@ApiOperation(value = "导入字典数据")
|
||||||
@PostMapping("/importDicts")
|
@PostMapping("/importDicts")
|
||||||
public Map<String, Object> importDicts(@RequestBody List<FormDictVO> formDictVOs) {
|
public Map<String, Object> importDicts(@RequestBody List<FormDictImportDTO> formDictImportDTOs) {
|
||||||
Map<String, Object> result = new HashMap<>();
|
Map<String, Object> result = formDictService.importDicts(formDictImportDTOs);
|
||||||
|
|
||||||
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);
|
|
||||||
|
|
||||||
return result;
|
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.plugins.pagination.Page;
|
||||||
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
||||||
import com.dromara.md.form.api.dto.FormDictDTO;
|
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.entity.FormDict;
|
||||||
import com.dromara.md.form.mybatis.mapper.FormDictMapper;
|
import com.dromara.md.form.mybatis.mapper.FormDictMapper;
|
||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
@ -209,4 +214,124 @@ public class FormDictService extends ServiceImpl<FormDictMapper, FormDict> {
|
|||||||
}
|
}
|
||||||
return notExistCodes;
|
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.constant.FormFieldDictType;
|
||||||
import com.dromara.md.form.api.dto.DictCodesDTO;
|
import com.dromara.md.form.api.dto.DictCodesDTO;
|
||||||
import com.dromara.md.form.api.dto.FormFieldDictDTO;
|
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.dto.FormFieldDictQ;
|
||||||
import com.dromara.md.form.api.vo.FormFieldDictDifyVo;
|
import com.dromara.md.form.api.vo.FormFieldDictDifyVo;
|
||||||
import com.dromara.md.form.api.vo.FormFieldDictVO;
|
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获取表单字段配置
|
* 根据configType获取表单字段配置
|
||||||
*
|
*
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user