111 lines
3.6 KiB
Java
111 lines
3.6 KiB
Java
package com.celnet.datadump.service.impl;
|
|
|
|
import com.alibaba.fastjson.JSONObject;
|
|
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
|
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
|
|
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
|
import com.celnet.datadump.entity.DataField;
|
|
import com.celnet.datadump.mapper.DataFieldMapper;
|
|
import com.celnet.datadump.service.DataFieldService;
|
|
import org.springframework.beans.factory.annotation.Autowired;
|
|
import org.springframework.stereotype.Service;
|
|
|
|
import java.util.*;
|
|
|
|
/**
|
|
* <p>
|
|
* api字段 服务实现类
|
|
* </p>
|
|
*
|
|
* @author Red
|
|
* @since 2022-12-20
|
|
*/
|
|
@Service
|
|
public class DataFieldServiceImpl extends ServiceImpl<DataFieldMapper, DataField> implements DataFieldService {
|
|
|
|
@Override
|
|
public Boolean hasDeleted(String api) {
|
|
QueryWrapper<DataField> qw = new QueryWrapper<>();
|
|
qw.eq("api", api)
|
|
.eq("field", "IsDeleted")
|
|
.select("id");
|
|
DataField one = getOne(qw);
|
|
return one != null;
|
|
}
|
|
|
|
@Override
|
|
public void tableRelation(){
|
|
QueryWrapper<DataField> queryWrapper = Wrappers.query();
|
|
queryWrapper.lambda().isNotNull(DataField::getReferenceTo).
|
|
ne(DataField::getReferenceTo,"").
|
|
ne(DataField::getReferenceTo,"data_picklist").
|
|
ne(DataField::getReferenceTo,"RecordType");
|
|
List<DataField> list = list(queryWrapper);
|
|
|
|
int[][] connections = new int[list.size()][list.size()];
|
|
List<String> owner = new ArrayList<>();
|
|
for (int i=0;i<list.size();i++) {
|
|
for (int j=0;j<list.size();j++){
|
|
if(list.get(i).getApi().equals(list.get(j).getReferenceTo())){
|
|
if (i == j){
|
|
owner.add(list.get(i).getApi());
|
|
}
|
|
connections[i][j] = 1;
|
|
}else {
|
|
connections[i][j] = 0;
|
|
}
|
|
}
|
|
}
|
|
getTableLevel(connections,list);
|
|
System.out.println("自循环表:"+JSONObject.toJSONString(owner));
|
|
}
|
|
|
|
|
|
|
|
|
|
public void getTableLevel(int[][] connections,List<DataField> list) {
|
|
int n = connections.length;
|
|
int[] levels = new int[n];
|
|
levels[0] = 0;
|
|
boolean[] visited = new boolean[n];
|
|
Stack<Integer> stack = new Stack<>();
|
|
stack.push(0); // 假设以0号表作为根节点
|
|
visited[0] = true; // 标记根节点已访问过
|
|
while (!stack.isEmpty()) {
|
|
int curr = stack.peek();
|
|
boolean foundUnvisitedNeighbor = false;
|
|
for (int i = 0; i < n; i++) {
|
|
if (connections[curr][i] == 1 && !visited[i]) {
|
|
foundUnvisitedNeighbor = true;
|
|
stack.push(i);
|
|
visited[i] = true; // 标记已访问
|
|
levels[i] = levels[curr] + 1;
|
|
break;
|
|
}
|
|
}
|
|
if (!foundUnvisitedNeighbor) {
|
|
stack.pop();
|
|
}
|
|
}
|
|
Map<String, Integer> map = new HashMap<>();
|
|
// 输出每张表所处的层数
|
|
for (int i = 0; i < n; i++) {
|
|
String api = list.get(i).getApi();
|
|
Integer l = levels[i];
|
|
if (map.get(api) != null){
|
|
if (map.get(api)< l){
|
|
map.put(api, l);
|
|
}
|
|
}else {
|
|
map.put(api, l);
|
|
}
|
|
|
|
}
|
|
for (String entry : map.keySet()) {
|
|
Integer mapValue = map.get(entry);
|
|
System.out.println("表"+entry + "的层级是:" + mapValue);
|
|
}
|
|
}
|
|
|
|
}
|