1、修改Mysql线程池逻辑
2、新增数据表信息查询接口 3、优化前端代码逻辑 4、新增业面业务功能提示信息窗口
This commit is contained in:
@@ -1,6 +1,7 @@
|
||||
package net.tccn.meta;
|
||||
|
||||
import net.tccn.base.JBean;
|
||||
import net.tccn.qtask.Task;
|
||||
|
||||
/**
|
||||
* Created by liangxianyou at 2019/3/7 16:13.
|
||||
|
||||
@@ -1,454 +0,0 @@
|
||||
package net.tccn.meta;
|
||||
|
||||
import net.tccn.base.Kv;
|
||||
import net.tccn.base.UtilityExt;
|
||||
import net.tccn.dbq.Field;
|
||||
import net.tccn.dbq.fbean.FilterType;
|
||||
import net.tccn.dbq.jdbc.api.DbAccount;
|
||||
|
||||
import java.util.*;
|
||||
import java.util.function.BiFunction;
|
||||
import java.util.function.Function;
|
||||
import java.util.function.Predicate;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
/**
|
||||
*
|
||||
* Created by liangxianyou at 2019/1/7 13:31.
|
||||
*/
|
||||
public class MetaKit {
|
||||
//基础数据缓存
|
||||
private static List<MetaTable> metaTables;
|
||||
private static List<MetaLink> metaLinks;
|
||||
private static List<MetaService> metaServices;
|
||||
|
||||
private static List<DbAccount> dbPlats;
|
||||
|
||||
static {
|
||||
metaTables = MetaTable.dao.find();
|
||||
metaLinks = MetaLink.dao.find();
|
||||
metaServices = MetaService.dao.find();
|
||||
|
||||
dbPlats = DbAccount.dao.find();
|
||||
}
|
||||
|
||||
//----- get/set ----
|
||||
public static List<MetaTable> getMetaTables() {
|
||||
return metaTables;
|
||||
}
|
||||
|
||||
public static void setMetaTables(List<MetaTable> metaTables) {
|
||||
MetaKit.metaTables = metaTables;
|
||||
}
|
||||
|
||||
public static List<MetaLink> getMetaLinks() {
|
||||
return metaLinks;
|
||||
}
|
||||
|
||||
public static void setMetaLinks(List<MetaLink> metaLinks) {
|
||||
MetaKit.metaLinks = metaLinks;
|
||||
}
|
||||
|
||||
public static List<MetaService> getMetaServices() {
|
||||
return metaServices;
|
||||
}
|
||||
|
||||
public static List<DbAccount> getDbPlats() {
|
||||
return dbPlats;
|
||||
}
|
||||
|
||||
public static void setDbPlats(List<DbAccount> dbPlats) {
|
||||
MetaKit.dbPlats = dbPlats;
|
||||
}
|
||||
|
||||
//-----------------------------------
|
||||
public static void setMetaServices(List<MetaService> metaServices) {
|
||||
MetaKit.metaServices = metaServices;
|
||||
}
|
||||
|
||||
/**
|
||||
* 通过 别名 查询 MetaTable
|
||||
* @param alias
|
||||
* @return
|
||||
*/
|
||||
public static MetaTable getMetaTableByAlias(String alias) {
|
||||
Optional<MetaTable> table = metaTables.stream().filter(x -> x.getAlias().equals(alias)).findAny();
|
||||
return table.orElse(null);
|
||||
}
|
||||
|
||||
/**
|
||||
* 通过 MetaLink[] 得到 MetaTable{}
|
||||
* @param links
|
||||
* @return {alias:table}
|
||||
*/
|
||||
private static Map<String, MetaTable> metaTables(List<MetaLink> links) {
|
||||
Map map = new HashMap();
|
||||
List<String> tables = links.stream().map(MetaLink::getTables).flatMap(Arrays::stream).distinct().collect(Collectors.toList());//tables
|
||||
metaTables.stream().filter(x -> tables.contains(x.getAlias())).forEach(x -> {
|
||||
map.put(x.getAlias(), x);
|
||||
});
|
||||
return map;
|
||||
}
|
||||
|
||||
/**
|
||||
* 通过 link._key 得到 MetaLink[]
|
||||
* @param links
|
||||
* @return
|
||||
*/
|
||||
private static List<MetaLink> metaLinks(List<String> links) {
|
||||
if (links == null) {
|
||||
return new ArrayList<>();
|
||||
}
|
||||
return metaLinks.stream().filter(x -> links.contains(x.getKey())).collect(Collectors.toList());
|
||||
}
|
||||
|
||||
/**
|
||||
* 构建完整的 MetaService
|
||||
* @param name
|
||||
* @return
|
||||
*/
|
||||
public static MetaService getMetaService(String name) {
|
||||
Optional<MetaService> service = metaServices.stream().filter(x -> x.getName().equals(name)).findAny();
|
||||
//处理业务逻辑
|
||||
service.ifPresent(x -> {
|
||||
//x.setMetaTable(metaTableByAlias(x.getTable()));
|
||||
//x.setMetaLinks(metaLinks(x.getLinks()));
|
||||
//x.setTables(metaTables(x.getMetaLinks()));
|
||||
});
|
||||
return service.orElse(null);
|
||||
}
|
||||
|
||||
//字段特征排序
|
||||
public static BiFunction<MetaTable, String[], MetaTable> sortItem = (t, arr) -> {
|
||||
List<Field> items = t.getItems();
|
||||
|
||||
//x 是跨越值
|
||||
a:for (int i = 0, x = 0; i < arr.length; i++) {
|
||||
int inx = i - x;
|
||||
|
||||
if (!items.get(inx).equals(arr[i])) {
|
||||
Field tmp = items.get(inx);
|
||||
for (int j = inx + 1; j < items.size(); j++) {
|
||||
if (items.get(j).equals(arr[i])) {
|
||||
items.set(inx, items.get(j));
|
||||
items.set(j, tmp);
|
||||
continue a;
|
||||
}
|
||||
}
|
||||
|
||||
//运行到这里,说明在 list 中找不到排序标识对应的数据, 让排序角标差值+1
|
||||
x ++;
|
||||
}
|
||||
}
|
||||
t.setItems(items);
|
||||
return t;
|
||||
};
|
||||
|
||||
public static Function<String, Field> getField = (n) -> {
|
||||
String[] arr = n.split("[.]");
|
||||
MetaTable metaTable = getMetaTableByAlias(arr[0]);
|
||||
return metaTable.getItems().stream().filter(x -> x.getName().equals(arr[1])).findAny().orElse(null);
|
||||
};
|
||||
|
||||
//listcfg
|
||||
public static Function<MetaService, Kv> builderCfg = (m) -> {
|
||||
List<String> shows = m.getShows();
|
||||
List<Map> filters = m.getFilters();
|
||||
|
||||
List<Map> _filters = new ArrayList<>();
|
||||
List<Map> _cols = new ArrayList<>();
|
||||
|
||||
//todo: 优化,批量操作
|
||||
//build shows
|
||||
shows.forEach(x -> {
|
||||
Field field = getField.apply(x);
|
||||
if (field != null) {
|
||||
Kv col = Kv.of();
|
||||
col.set("col", x.split("$]")[0] + field.showField());//a.createtime=dt
|
||||
col.set("label", field.getLabel());
|
||||
col.set("order", 1);//dev 是否支持排序
|
||||
_cols.add(col);
|
||||
}
|
||||
});
|
||||
|
||||
//build filters
|
||||
filters.forEach(x -> {
|
||||
Kv filter = Kv.of();
|
||||
Field filed = getField.apply(x.get("name") + "");
|
||||
|
||||
if (filed != null) {
|
||||
filter.set("name", x.get("name"));
|
||||
filter.set("label", filed.getLabel());
|
||||
}
|
||||
|
||||
filter.set("inType", filed.getInType());
|
||||
filter.set("inExt", filed.getInExt());
|
||||
|
||||
List<Kv> types = new ArrayList<>();
|
||||
List<String> list = (List) x.get("filterType");
|
||||
list.forEach(t -> {
|
||||
FilterType type = FilterType.getFilterType(t);
|
||||
if (type != null) {
|
||||
types.add(Kv.of("name", t).set("remark", type.getRemark()));
|
||||
}
|
||||
});
|
||||
|
||||
filter.set("filterType", types);
|
||||
Object checked = x.getOrDefault("checked", false);
|
||||
filter.set("checked", checked instanceof Boolean ? checked : false);
|
||||
_filters.add(filter);
|
||||
});
|
||||
|
||||
/*shows.forEach(x -> {
|
||||
_shows.add(Kv.of("name", x).set("label", getFieldLabel(x)));
|
||||
});*/
|
||||
|
||||
Kv cfg = Kv.of();
|
||||
cfg.set("title", m.getName())//业务名称
|
||||
//.set("url", getUrl())
|
||||
.set("cols", _cols)//展示的数据列
|
||||
//.set("conditionLabel", "")
|
||||
.set("filters", _filters);//查询过滤条件
|
||||
|
||||
return cfg;
|
||||
};
|
||||
|
||||
public static Map cfg(String name) {
|
||||
MetaService metaService = getMetaService(name);
|
||||
Kv<String, MetaTable> metaTables = getMetaTables(metaService, false);
|
||||
|
||||
List<String> shows = metaService.getShows();
|
||||
List<Map> edits = metaService.getEdits();
|
||||
List<String> details = metaService.getDetails();
|
||||
List<Map> filters = metaService.getFilters();
|
||||
String comment = metaService.getComment();
|
||||
|
||||
//List<Field> items = new ArrayList<>();
|
||||
Kv<String, Kv<String, Kv>> _items2 = Kv.of();
|
||||
metaTables.forEach((k, v) -> {
|
||||
Kv<String, Kv> _items = Kv.of();
|
||||
v.getItems().forEach(x -> {
|
||||
Kv kv = Kv.of();
|
||||
kv.set("col", x.getName());
|
||||
kv.set("label", x.getLabel());
|
||||
kv.set("InExt", x.getInExt());
|
||||
kv.set("inType", x.getInType());
|
||||
kv.set("expr", x.showField());
|
||||
_items.set(x.getName(), kv);
|
||||
});
|
||||
|
||||
_items2.set(k, _items);
|
||||
});
|
||||
|
||||
//shows
|
||||
List _shows = new ArrayList();
|
||||
shows.forEach(x -> {
|
||||
MetaTable metaTable = metaTables.get(x.split("[.]")[0]); // 表别名
|
||||
metaTable.getItems()
|
||||
.stream()
|
||||
.filter(y -> x.split("[.]")[1].equals(y.getName()))
|
||||
.findFirst().ifPresent(y -> _shows.add(Kv.of("col", x).set("order", true)));
|
||||
});
|
||||
|
||||
//filters
|
||||
List<Map> _filters = new ArrayList<>();
|
||||
filters.forEach(x -> {
|
||||
String col = String.valueOf(x.get("name"));
|
||||
MetaTable metaTable = metaTables.get(col.split("[.]")[0]); // 表别名
|
||||
|
||||
Kv filter = Kv.of();
|
||||
metaTable.getItems()
|
||||
.stream()
|
||||
.filter(y -> col.split("[.]")[1].equals(y.getName()))
|
||||
.findFirst()
|
||||
.ifPresent(y -> {
|
||||
filter.set("name", x.get("name"));
|
||||
filter.set("label", y.getLabel());
|
||||
List<Kv> types = new ArrayList<>();
|
||||
List<String> list = (List) x.get("filterType");
|
||||
list.forEach(t -> {
|
||||
FilterType type = FilterType.getFilterType(t);
|
||||
if (type != null) {
|
||||
types.add(Kv.of("name", t).set("remark", type.getRemark()));
|
||||
}
|
||||
});
|
||||
|
||||
filter.set("filterType", types);
|
||||
if (!types.isEmpty()) {//设置默认查询项
|
||||
filter.set("type", types.get(0).get("name"));
|
||||
}
|
||||
Object checked = x.getOrDefault("checked", false);
|
||||
filter.set("checked", checked instanceof Boolean ? checked : false);
|
||||
});
|
||||
_filters.add(filter);
|
||||
});
|
||||
|
||||
//edits
|
||||
List _edits = new ArrayList();//edits;
|
||||
edits.forEach(x -> {
|
||||
Kv kv = Kv.of();
|
||||
kv.set("col", x);
|
||||
|
||||
String col = x.get("col") + "";
|
||||
//readonly,hidden
|
||||
if ("id".equalsIgnoreCase(col)) {
|
||||
kv.set("upAttr", "hidden");
|
||||
kv.set("addAttr", "none");
|
||||
}
|
||||
if ("reportWay".equalsIgnoreCase(col)) {
|
||||
kv.set("upAttr", "readonly");
|
||||
kv.set("addAttr", "none");
|
||||
}
|
||||
if ("insertTime".equalsIgnoreCase(col)) {
|
||||
kv.set("upAttr", "readonly");
|
||||
kv.set("addAttr", "none");
|
||||
}
|
||||
|
||||
if ("ip".equalsIgnoreCase(col)) {
|
||||
kv.set("ck", "ip");
|
||||
}
|
||||
|
||||
_edits.add(kv);
|
||||
});
|
||||
|
||||
//details
|
||||
List _details = new ArrayList();//details;
|
||||
details.forEach(x -> {
|
||||
Kv kv = Kv.of();
|
||||
kv.set("col", x);
|
||||
|
||||
_details.add(kv);
|
||||
});
|
||||
|
||||
return Kv.of()
|
||||
.set("title", comment)
|
||||
.set("items", _items2)
|
||||
.set("shows", _shows)
|
||||
.set("filters", _filters)
|
||||
.set("edits", _edits)
|
||||
.set("details", _details);
|
||||
}
|
||||
|
||||
//itemUpdate
|
||||
public static BiFunction<MetaTable, List<Field>, MetaTable> itemUpdate = (t, fields) -> {
|
||||
List<Field> items = t.getItems();
|
||||
for (int i = 0; i < fields.size(); i++) {
|
||||
for (int j = 0; j < items.size(); j++) {
|
||||
if (items.get(j).equals(fields.get(i).getName())) {
|
||||
items.set(j, fields.get(i));
|
||||
}
|
||||
}
|
||||
}
|
||||
return t;
|
||||
};
|
||||
|
||||
//showUpdate
|
||||
public static BiFunction<String, List<String>, MetaService> showUpdate = (serviceKey, shows) -> {
|
||||
|
||||
MetaService metaService = getMetaService(serviceKey);
|
||||
|
||||
MetaService _metaService = MetaService.dao.findByKey(metaService.getKey());
|
||||
_metaService.setShows(shows);
|
||||
_metaService.update();
|
||||
|
||||
metaService.setShows(shows);//更新缓存
|
||||
return metaService;
|
||||
};
|
||||
|
||||
|
||||
public static MetaTable getMetaTableByKey(String key) {
|
||||
return metaTables.stream().filter(x -> x.getKey().equals(key)).findAny().orElse(null);
|
||||
}
|
||||
|
||||
public static List<MetaLink> getMetaLinks(String t, List<String> shows, List<String> filters) {
|
||||
|
||||
|
||||
Predicate<String> contain = s -> {
|
||||
for (String item : shows) {
|
||||
if (s.equals(item.split("[.]")[0])) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
for (String item : filters) {
|
||||
if (s.equals(item.split("[.]")[0])) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
};
|
||||
|
||||
//得到直接关联
|
||||
//1、直接关联 表: t.equals(x.getTables()[0]) || t.equals(x.getTables()[1]
|
||||
//2、关联且有过滤:
|
||||
//3、关联有展示:
|
||||
List<MetaLink> links = metaLinks.stream()
|
||||
.filter(x -> {
|
||||
return (t.equals(x.getTables()[0]) || t.equals(x.getTables()[1]))
|
||||
&& (contain.test(x.getTables()[0]) || contain.test(x.getTables()[1]));
|
||||
})
|
||||
.collect(Collectors.toList());
|
||||
return links;
|
||||
}
|
||||
|
||||
public static Kv buildeDetail(MetaService metaService) {
|
||||
//tables
|
||||
Kv<String, MetaTable> tables = getMetaTables(metaService, true);
|
||||
return Kv.of("tables", tables)
|
||||
.set("links", Kv.of());
|
||||
}
|
||||
|
||||
public static Kv<String, MetaTable> getMetaTables(MetaService metaService, Boolean all) {
|
||||
Kv<String, MetaTable> tables = Kv.of();
|
||||
|
||||
String table = metaService.getTable();//
|
||||
tables.set(table, getMetaTableByAlias(table));
|
||||
|
||||
//收集所有的col
|
||||
Set<String> allAlias;
|
||||
|
||||
if (!all) {
|
||||
allAlias = UtilityExt.streamConcat(
|
||||
metaService.getFilters().stream().map(f -> {
|
||||
String col = (String) f.get("name");
|
||||
String alias = col.split("[.]")[0];
|
||||
return alias;
|
||||
}),
|
||||
metaService.getExports().stream().map(x -> x.split("[.]")[0]),
|
||||
metaService.getShows().stream().map(x -> x.split("[.]")[0])/*, todo: xxx
|
||||
metaService.getEdits().stream().map(x -> x.split("[.]")[0])*/
|
||||
);
|
||||
|
||||
} else {
|
||||
allAlias = new HashSet<>();
|
||||
metaLinks.stream().forEach(x -> {
|
||||
if (table.equals(x.getTables()[0])) {
|
||||
allAlias.add(x.getTables()[1]);
|
||||
} else if (table.equals(x.getTables()[1])) {
|
||||
allAlias.add(x.getTables()[0]);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
allAlias.forEach(x -> tables.set(x, getMetaTableByAlias(x)));
|
||||
return tables;
|
||||
}
|
||||
|
||||
public String nextAlias(String x) {
|
||||
return next(x, "");
|
||||
}
|
||||
|
||||
//使用['a',...,'z'] 创建Table 别名
|
||||
private String next(String x, String end) {
|
||||
if (x == null || "".equals(x)) {
|
||||
return "a" + end;
|
||||
}
|
||||
char c = x.charAt(x.length() - 1);
|
||||
String sub = x.substring(0, x.length() - 1);
|
||||
if (c < 'z') {
|
||||
return sub + (++c) + end;
|
||||
} else if (c == 'z') {
|
||||
return next(sub, "a" + end);
|
||||
}
|
||||
return null;
|
||||
}
|
||||
}
|
||||
@@ -20,6 +20,7 @@ public class MetaTable extends Doc<MetaTable> implements Serializable {
|
||||
private String alias; //表别名:全库唯一,程序自动生成
|
||||
private String comment;
|
||||
private List<Field> items;
|
||||
private String sysPlatId; //所属系统平台
|
||||
private String dbPlatId; //所属数据平台
|
||||
private String catalog; //所在database
|
||||
|
||||
@@ -57,6 +58,14 @@ public class MetaTable extends Doc<MetaTable> implements Serializable {
|
||||
this.items = items;
|
||||
}
|
||||
|
||||
public String getSysPlatId() {
|
||||
return sysPlatId;
|
||||
}
|
||||
|
||||
public void setSysPlatId(String sysPlatId) {
|
||||
this.sysPlatId = sysPlatId;
|
||||
}
|
||||
|
||||
public String getDbPlatId() {
|
||||
return dbPlatId;
|
||||
}
|
||||
|
||||
@@ -1,7 +0,0 @@
|
||||
package net.tccn.meta;
|
||||
|
||||
/**
|
||||
* Created by liangxianyou at 2019/3/7 16:24.
|
||||
*/
|
||||
public class Task {
|
||||
}
|
||||
91
src/main/java/net/tccn/meta/_DbService.java
Normal file
91
src/main/java/net/tccn/meta/_DbService.java
Normal file
@@ -0,0 +1,91 @@
|
||||
package net.tccn.meta;
|
||||
|
||||
import net.tccn.base.JBean;
|
||||
import net.tccn.base.MetaKit;
|
||||
import net.tccn.dbq.jdbc.api.DbAccount;
|
||||
import net.tccn.dbq.jdbc.api.DbKit;
|
||||
import net.tccn.dbq.table.Column;
|
||||
import net.tccn.dbq.table.Table;
|
||||
import net.tccn.service.BaseService;
|
||||
import org.redkale.net.http.RestMapping;
|
||||
import org.redkale.net.http.RestService;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.concurrent.CompletableFuture;
|
||||
import java.util.concurrent.ExecutionException;
|
||||
import java.util.stream.Stream;
|
||||
|
||||
@RestService(automapping = true, comment = "数据库操作类")
|
||||
public class _DbService extends BaseService {
|
||||
|
||||
@RestMapping(name = "catalog_list", comment = "获取数据源的database")
|
||||
public JBean catalogList(DbAccount dbAccount, String dbPlatId) {
|
||||
JBean jBean = new JBean();
|
||||
DbKit dbKit = null;
|
||||
if (dbAccount != null) {
|
||||
dbKit = new DbKit(dbAccount);
|
||||
} else {
|
||||
dbKit = MetaKit.getDbKit(dbPlatId);
|
||||
}
|
||||
|
||||
List<Map> list = dbKit.findList("SHOW DATABASES;", Map.class);
|
||||
|
||||
Stream<String> database = list.stream().map(x -> String.valueOf(x.get("Database")));
|
||||
|
||||
return jBean.setBody(database.toArray());
|
||||
}
|
||||
|
||||
@RestMapping(name = "table_list", comment = "数据库表列表")
|
||||
public JBean tableList(DbAccount dbAccount, String dbPlatId, String[] catalogs) {
|
||||
JBean jBean = new JBean();
|
||||
DbKit dbKit = MetaKit.getDbKit(dbPlatId);
|
||||
|
||||
StringBuffer sqlBuf = new StringBuffer("SELECT TABLE_NAME 'name',TABLE_COMMENT 'comment',table_schema 'catalog' FROM INFORMATION_SCHEMA.TABLES");
|
||||
if (catalogs != null && catalogs.length > 0) {
|
||||
sqlBuf.append("WHERE TABLE_SCHEMA in (");
|
||||
for (String catalog : catalogs) {
|
||||
sqlBuf.append("'").append(catalog).append("',");
|
||||
}
|
||||
sqlBuf.deleteCharAt(sqlBuf.length() - 1);
|
||||
sqlBuf.append(")");
|
||||
}
|
||||
List<Table> list = dbKit.findList(sqlBuf.toString(), Table.class);
|
||||
|
||||
return jBean.setBody(list);
|
||||
}
|
||||
|
||||
@RestMapping(name = "table_info", comment = "数据库表详情")
|
||||
public JBean tableInfo(DbAccount dbAccount,
|
||||
String dbPlatId, String catalog, String tableName) {
|
||||
JBean jBean = new JBean();
|
||||
DbKit dbKit = MetaKit.getDbKit(dbPlatId);
|
||||
|
||||
String sql = String.format("SELECT TABLE_NAME 'name',TABLE_COMMENT 'comment',table_schema 'catalog' FROM INFORMATION_SCHEMA.TABLES where TABLE_NAME='%s'", tableName);
|
||||
String columnSql = String.format("SHOW FULL COLUMNS FROM '%s.%s'", catalog, tableName);
|
||||
|
||||
CompletableFuture<Table> tableFuture = CompletableFuture.supplyAsync(() -> dbKit.findfirst(sql, Table.class));
|
||||
CompletableFuture<List<Column>> columnFuture = CompletableFuture.supplyAsync(() -> dbKit.findList(columnSql, Column.class));
|
||||
|
||||
try {
|
||||
Table table = tableFuture.get();
|
||||
table.setColumns(columnFuture.get());
|
||||
jBean.setBody(table);
|
||||
} catch (InterruptedException | ExecutionException e) {
|
||||
jBean.set(-1, "查询表信息失败");
|
||||
new IllegalArgumentException("查询表信息失败", e);
|
||||
}
|
||||
|
||||
return jBean;
|
||||
}
|
||||
|
||||
@RestMapping(name = "table_create", comment = "新建表[mysql]")
|
||||
public JBean tableCreate(String dbPlatId, String catalog, String sql) {
|
||||
JBean jBean = new JBean();
|
||||
|
||||
DbKit dbKit = MetaKit.getDbKit(dbPlatId);
|
||||
dbKit.createTable(sql);
|
||||
|
||||
return jBean;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user