DataResourceFacade.java 42 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921
  1. package com.dragoninfo.dcuc.app.facade;
  2. import com.dragoninfo.dcuc.app.business.IDataCatalogBusiness;
  3. import com.dragoninfo.dcuc.app.cons.CommonCons;
  4. import com.dragoninfo.dcuc.app.dto.dataresource.ChildResourceClassify;
  5. import com.dragoninfo.dcuc.app.dto.dataresource.ResourceClassify;
  6. import com.dragoninfo.dcuc.app.dto.sub.DataClaAcceptDTO;
  7. import com.dragoninfo.dcuc.app.dto.sub.FieldClaAcceptDTO;
  8. import com.dragoninfo.dcuc.app.entity.sub.*;
  9. import com.dragoninfo.dcuc.app.enumresources.AppDataTypeEnum;
  10. import com.dragoninfo.dcuc.app.enumresources.DataAttrTypeEnum;
  11. import com.dragoninfo.dcuc.app.enumresources.DataResourceEnum;
  12. import com.dragoninfo.dcuc.app.enumresources.sub.DataClaTypeEnum;
  13. import com.dragoninfo.dcuc.app.enumresources.sub.FieldClaTypeEnum;
  14. import com.dragoninfo.dcuc.app.service.IDataResourceService;
  15. import com.dragoninfo.dcuc.app.service.sub.*;
  16. import com.dragoninfo.dcuc.app.vo.*;
  17. import com.dragonsoft.duceap.base.entity.http.ResponseStatus;
  18. import com.dragonsoft.duceap.commons.util.collections.CollectionUtils;
  19. import com.google.common.base.Joiner;
  20. import com.google.common.collect.Lists;
  21. import lombok.extern.slf4j.Slf4j;
  22. import org.apache.commons.lang3.StringUtils;
  23. import org.springframework.beans.factory.annotation.Autowired;
  24. import org.springframework.web.bind.annotation.RequestMapping;
  25. import org.springframework.web.bind.annotation.RestController;
  26. import org.springframework.web.context.request.RequestAttributes;
  27. import org.springframework.web.context.request.RequestContextHolder;
  28. import java.util.*;
  29. import java.util.stream.Collectors;
  30. import java.util.stream.Stream;
  31. /**
  32. * Created by lidr on 2021/4/14
  33. */
  34. @Slf4j
  35. @RestController
  36. @RequestMapping(value = "/dcuc/app/dataResourceFacade")
  37. public class DataResourceFacade implements IDataResourceFacade {
  38. @Autowired
  39. private IDataResourceService dataResourceService;
  40. @Autowired
  41. private IDataClaService dataClaService;
  42. @Autowired
  43. private IDataLevelService dataLevelService;
  44. @Autowired
  45. private IDataSecService dataSecService;
  46. @Autowired
  47. private IFieldClaService fieldClaService;
  48. @Autowired
  49. private IAppDataResourceInfoService tabInfoService;
  50. @Autowired
  51. private IAppDataItemInfoService colInfoService;
  52. @Autowired
  53. private IDataCatalogBusiness dataCatalogBusiness;
  54. @Autowired
  55. private IAppColumnRelationService appColumnRelationService;
  56. @Override
  57. public List<DataResourceClassifyVo> getAllDataResourceTree(String attrType) {
  58. List<DataResourceClassifyVo> result = Lists.newArrayList();
  59. //列:数据安全级别 字段分类
  60. //表:数据分级 数据资源分类
  61. if (DataAttrTypeEnum.DATA_ATTR_TABLE.getValue().equals(attrType)) {
  62. // 查询所有的表和列
  63. List<AppDataResourceInfo> tabInfos = tabInfoService.getHasClassifyTables();
  64. result.add(getDataLevelTree());
  65. result.add(getDataClassifyTree(tabInfos));
  66. } else if (DataAttrTypeEnum.DATA_ATTR_COLUMN.getValue().equals(attrType)) {
  67. List<AppDataResourceInfo> tabInfos = tabInfoService.getAllTabInfos();
  68. List<AppDataItemInfo> colInfos = colInfoService.getHasClassifyColInfos();
  69. result.add(getSecurityLevelTree());
  70. result.add(getFieldClassifyTree(tabInfos, colInfos));
  71. } else {
  72. List<AppDataResourceInfo> tabInfos = tabInfoService.getAllTabInfos();
  73. List<AppDataItemInfo> colInfos = colInfoService.getHasClassifyColInfos();
  74. result.add(getDataLevelTree());
  75. result.add(getDataClassifyTree(tabInfos));
  76. result.add(getSecurityLevelTree());
  77. result.add(getFieldClassifyTree(tabInfos, colInfos));
  78. }
  79. return result;
  80. }
  81. @Override
  82. public DataResourceClassifyVo getDataResourceTree(String typeCode) {
  83. DataResourceClassifyVo result = null;
  84. DataResourceEnum dataResourceEnum = Enum.valueOf(DataResourceEnum.class, typeCode);
  85. List<AppDataItemInfo> colInfos = null;
  86. List<AppDataResourceInfo> tabInfos = null;
  87. switch (dataResourceEnum) {
  88. case DATA_CLASSIFY:
  89. result = getDataLevelTree();
  90. break;
  91. case COLUMN_CLASSIFY:
  92. tabInfos = tabInfoService.getAllTabInfos();
  93. colInfos = colInfoService.getHasClassifyColInfos();
  94. result = getFieldClassifyTree(tabInfos, colInfos);
  95. break;
  96. case DATA_SECURITY_LEVEL:
  97. result = getSecurityLevelTree();
  98. break;
  99. case DATA_RESOURCE_CLASSIFY:
  100. tabInfos = tabInfoService.getHasClassifyTables();
  101. result = getDataClassifyTree(tabInfos);
  102. break;
  103. default:
  104. break;
  105. }
  106. return result;
  107. }
  108. private DataResourceClassifyVo getDataLevelTree() {
  109. DataResourceEnum dataResourceEnum = DataResourceEnum.DATA_CLASSIFY;
  110. DataResourceClassifyVo dataResourceClassifyVo = DataResourceClassifyVo.builder()
  111. .id(dataResourceEnum.getCode())
  112. .attrType(dataResourceEnum.getAttrType().getValue())
  113. .label(dataResourceEnum.getLabel())
  114. .build();
  115. DataResourceTreeVo dataLevelTreeVo = DataResourceTreeVo.builder()
  116. .id(dataResourceEnum.getCode())
  117. .label("全部")
  118. .code(dataResourceEnum.getCode())
  119. .treeNode(true)
  120. .build();
  121. List<DataLevelVo> dataLevelList = getDataLevelList();
  122. List<DataResourceTreeVo> child = dataLevelList.stream().map(item -> DataResourceTreeVo.builder()
  123. .id(item.getId())
  124. .code(item.getLevelCode())
  125. .label(item.getLevelName())
  126. .dataType(item.getTypeCode())
  127. .treeNode(false)
  128. .pId(dataLevelTreeVo.getId())
  129. .build()).collect(Collectors.toList());
  130. dataLevelTreeVo.setChild(child);
  131. if (child.size() == 0) {
  132. dataResourceClassifyVo.setNodes(new ArrayList<>());
  133. } else {
  134. dataResourceClassifyVo.setNodes(new ArrayList<DataResourceTreeVo>() {{
  135. add(dataLevelTreeVo);
  136. }});
  137. }
  138. //设置总数量
  139. dataResourceClassifyVo.setTotal(child.size());
  140. return dataResourceClassifyVo;
  141. }
  142. private DataResourceClassifyVo getSecurityLevelTree() {
  143. DataResourceEnum dataResourceEnum = DataResourceEnum.DATA_SECURITY_LEVEL;
  144. DataResourceClassifyVo dataResourceClassifyVo = DataResourceClassifyVo.builder()
  145. .id(dataResourceEnum.getCode())
  146. .attrType(dataResourceEnum.getAttrType().getValue())
  147. .label(dataResourceEnum.getLabel())
  148. .build();
  149. DataResourceTreeVo securityLevelTree = DataResourceTreeVo.builder()
  150. .id(dataResourceEnum.getCode())
  151. .label("全部")
  152. .code(dataResourceEnum.getCode())
  153. .treeNode(true)
  154. .build();
  155. List<DataLevelVo> securityLevelList = getSecurityLevelList();
  156. List<DataResourceTreeVo> child = securityLevelList.stream().map(item -> DataResourceTreeVo.builder()
  157. .id(item.getId())
  158. .code(item.getLevelCode())
  159. .label(item.getLevelName())
  160. .dataType(item.getTypeCode())
  161. .treeNode(false)
  162. .pId(securityLevelTree.getId())
  163. .build()).collect(Collectors.toList());
  164. securityLevelTree.setChild(child);
  165. if (child.size() == 0) {
  166. dataResourceClassifyVo.setNodes(new ArrayList<>());
  167. dataResourceClassifyVo.setTotal(0);
  168. } else {
  169. dataResourceClassifyVo.setNodes(new ArrayList<DataResourceTreeVo>() {{
  170. add(securityLevelTree);
  171. }});
  172. //设置总数量
  173. dataResourceClassifyVo.setTotal(child.size());
  174. }
  175. return dataResourceClassifyVo;
  176. }
  177. private DataResourceClassifyVo getDataClassifyTree(List<AppDataResourceInfo> tabInfos) {
  178. // 将表分类映射到表
  179. Map<String, List<AppDataResourceInfo>> tabLabMap = getTabLabGroupMap(tabInfos);
  180. DataResourceEnum dataResourceEnum = DataResourceEnum.DATA_RESOURCE_CLASSIFY;
  181. DataResourceClassifyVo resourceVo = DataResourceClassifyVo.builder().id(dataResourceEnum.getCode())
  182. .attrType(dataResourceEnum.getAttrType().getValue()).label(dataResourceEnum.getLabel()).build();
  183. DataResourceTreeVo topTreeVo = DataResourceTreeVo.builder().id(dataResourceEnum.getCode()).label("全部")
  184. .code(dataResourceEnum.getCode()).treeNode(true).build();
  185. List<DataCla> dataClaList = dataClaService.getAllDataCla();
  186. Map<String, List<DataCla>> levelMap = dataClaList.stream().collect(Collectors.groupingBy(DataCla::getLevel));
  187. //一级节点
  188. List<DataResourceTreeVo> firNodes = Optional.ofNullable(levelMap.get(DataClaTypeEnum.FIR.getLevel())).orElse(new ArrayList<>())
  189. .stream().map(item -> convertDataClaToNode(item, null)).collect(Collectors.toList());
  190. //二级节点
  191. List<DataResourceTreeVo> secNodes = Optional.ofNullable(levelMap.get(DataClaTypeEnum.SEC.getLevel())).orElse(new ArrayList<>())
  192. .stream().map(item -> convertDataClaToNode(item, item.getFirId())).collect(Collectors.toList());
  193. //三级节点
  194. List<DataResourceTreeVo> thirdNodes = Optional.ofNullable(levelMap.get(DataClaTypeEnum.LAB_CLA.getLevel())).orElse(new ArrayList<>())
  195. .stream().map(item -> convertDataClaToNode(item, item.getSecId())).collect(Collectors.toList());
  196. //四级节点
  197. List<DataResourceTreeVo> fourNodes = Optional.ofNullable(levelMap.get(DataClaTypeEnum.LAB.getLevel())).orElse(new ArrayList<>())
  198. .stream().map(item -> convertDataClaToNode(item, item.getLabClaId())).collect(Collectors.toList());
  199. //拼接成树节点
  200. combineTreeNode(firNodes, secNodes);
  201. combineTreeNode(secNodes, thirdNodes);
  202. combineTreeNode(thirdNodes, fourNodes);
  203. topTreeVo.setChild(firNodes);
  204. if (firNodes.size() == 0) {
  205. resourceVo.setNodes(new ArrayList<>());
  206. resourceVo.setTotal(0);
  207. } else {
  208. // 拼接表、列、pid
  209. boolean b = combinePidAndTableInfo(topTreeVo, tabLabMap);
  210. if (b) {
  211. resourceVo.setNodes(new ArrayList<>());
  212. resourceVo.setTotal(0);
  213. } else {
  214. resourceVo.setNodes(new ArrayList<DataResourceTreeVo>() {{
  215. add(topTreeVo);
  216. }});
  217. }
  218. }
  219. return resourceVo;
  220. }
  221. private Map<String, List<AppDataResourceInfo>> getTabLabGroupMap(List<AppDataResourceInfo> tabInfos) {
  222. Map<String, List<AppDataResourceInfo>> group = new HashMap<>();
  223. tabInfos.forEach(e -> {
  224. // 一级分类
  225. String claFir = e.getDataClassifyOneCode();
  226. if (StringUtils.isBlank(claFir)) {
  227. return;
  228. }
  229. // 二级分类
  230. String claSec = e.getDataClassifyTwoCode();
  231. if (StringUtils.isBlank(claSec)) {
  232. putInMap(group, e, claFir);
  233. return;
  234. }
  235. // 标签1
  236. String labFir = e.getDataLabelOneCode();
  237. if (StringUtils.isNotBlank(labFir)) {
  238. labFir = CommonCons.LAB_CLA_FIR + CommonCons.ID_SEPARATOR + labFir;
  239. }
  240. // 标签2
  241. String labSec = e.getDataLabelTwoCode();
  242. if (StringUtils.isNotBlank(labSec)) {
  243. labSec = CommonCons.LAB_CLA_SEC + CommonCons.ID_SEPARATOR + labSec;
  244. }
  245. // 标签3
  246. String labThr = e.getDataLabelThreeCode();
  247. if (StringUtils.isNotBlank(labThr)) {
  248. labThr = CommonCons.LAB_CLA_THI + CommonCons.ID_SEPARATOR + labThr;
  249. }
  250. // 标签4
  251. String labFour = e.getDataLabelFourCode();
  252. if (StringUtils.isNotBlank(labFour)) {
  253. labFour = CommonCons.LAB_CLA_FOUR + CommonCons.ID_SEPARATOR + labFour;
  254. }
  255. // 标签5
  256. String labFiv = e.getDataLabelFiveCode();
  257. if (StringUtils.isNotBlank(labFiv)) {
  258. labFiv = CommonCons.LAB_CLA_FIV + CommonCons.ID_SEPARATOR + labFiv;
  259. }
  260. List<String> collect = Stream.of(labFir, labSec, labThr, labFour, labFiv).filter(StringUtils::isNotBlank).collect(Collectors.toList());
  261. String key = claFir + CommonCons.ID_SEPARATOR + claSec;
  262. if (CollectionUtils.isEmpty(collect)) {
  263. putInMap(group, e, key);
  264. return;
  265. }
  266. collect.forEach(lab -> {
  267. String s = key + CommonCons.ID_SEPARATOR + lab;
  268. putInMap(group, e, s);
  269. });
  270. });
  271. return group;
  272. }
  273. private void putInMap(Map<String, List<AppDataResourceInfo>> group, AppDataResourceInfo e, String claFir) {
  274. List<AppDataResourceInfo> list = group.get(claFir);
  275. if (null == list) {
  276. list = new ArrayList<>();
  277. }
  278. list.add(e);
  279. group.put(claFir, list);
  280. }
  281. private DataResourceTreeVo convertDataClaToNode(DataCla item, String pid) {
  282. return DataResourceTreeVo.builder()
  283. .id(item.getId())
  284. .pId(pid)
  285. .dataType(item.getDataType())
  286. .label(item.getName())
  287. .code(item.getCode())
  288. .build();
  289. }
  290. private DataResourceClassifyVo getFieldClassifyTree(List<AppDataResourceInfo> tabInfos, List<AppDataItemInfo> colInfos) {
  291. Map<String, AppDataResourceInfo> tableMap = tabInfos
  292. .stream()
  293. .collect(Collectors.toMap(AppDataResourceInfo::getDataObjectId, e -> e));
  294. Map<String, List<AppDataItemInfo>> colInfosMap = getColumnClaGroupMap(colInfos);
  295. DataResourceEnum dataResourceEnum = DataResourceEnum.COLUMN_CLASSIFY;
  296. DataResourceClassifyVo resourceVo = DataResourceClassifyVo.builder().id(dataResourceEnum.getCode())
  297. .attrType(dataResourceEnum.getAttrType().getValue()).label(dataResourceEnum.getLabel()).build();
  298. DataResourceTreeVo topTreeVo = DataResourceTreeVo.builder().id(dataResourceEnum.getCode()).label("全部")
  299. .code(dataResourceEnum.getCode()).treeNode(true).build();
  300. List<FieldCla> fieldClaList = fieldClaService.getAllFieldCla();
  301. Map<String, List<FieldCla>> levelMap = fieldClaList.stream().collect(Collectors.groupingBy(FieldCla::getLevel));
  302. List<DataResourceTreeVo> firNodes = Optional.ofNullable(levelMap.get(FieldClaTypeEnum.FIR.getLevel())).orElse(new ArrayList<>())
  303. .stream().map(item -> convertFieldClaToNode(item, null)).collect(Collectors.toList());
  304. List<DataResourceTreeVo> secNodes = Optional.ofNullable(levelMap.get(FieldClaTypeEnum.SEC.getLevel())).orElse(new ArrayList<>())
  305. .stream().map(item -> convertFieldClaToNode(item, item.getFirId())).collect(Collectors.toList());
  306. combineTreeNode(firNodes, secNodes);
  307. topTreeVo.setChild(firNodes);
  308. if (firNodes.size() == 0) {
  309. resourceVo.setNodes(new ArrayList<>());
  310. resourceVo.setTotal(0);
  311. } else {
  312. boolean b = combinePidTabAndCol(topTreeVo, tableMap, colInfosMap);
  313. if (b) {
  314. resourceVo.setNodes(new ArrayList<>());
  315. resourceVo.setTotal(0);
  316. } else {
  317. resourceVo.setNodes(new ArrayList<DataResourceTreeVo>() {{
  318. add(topTreeVo);
  319. }});
  320. }
  321. }
  322. return resourceVo;
  323. }
  324. private Map<String, List<AppDataItemInfo>> getColumnClaGroupMap(List<AppDataItemInfo> colInfos) {
  325. return colInfos.stream().collect(Collectors.groupingBy(AppDataItemInfo::getColumnClassify));
  326. }
  327. private boolean combinePidTabAndCol(DataResourceTreeVo treeVo, Map<String, AppDataResourceInfo> tableMap, Map<String, List<AppDataItemInfo>> colInfosMap) {
  328. List<DataResourceTreeVo> child = treeVo.getChild();
  329. Iterator<DataResourceTreeVo> iterator = child.iterator();
  330. while (iterator.hasNext()) {
  331. DataResourceTreeVo childVo = iterator.next();
  332. childVo.setPId(treeVo.getId());
  333. childVo.setId(Joiner.on(CommonCons.ID_SEPARATOR).join(treeVo.getId(), childVo.getCode()));
  334. List<DataResourceTreeVo> cc = childVo.getChild();
  335. if (CollectionUtils.isNotEmpty(cc)) {
  336. childVo.setTreeNode(true);
  337. boolean emptyChild = combinePidTabAndCol(childVo, tableMap, colInfosMap);
  338. if (emptyChild) {
  339. iterator.remove();
  340. }
  341. } else {
  342. // 如果为叶子节点,查找对应的表和列
  343. // 如果查找不到表和列则移除
  344. List<AppDataItemInfo> dataColInfo = colInfosMap.get(childVo.getCode());
  345. if (dataColInfo == null) {
  346. iterator.remove();
  347. } else {
  348. Map<String, List<AppDataItemInfo>> tableGroup = dataColInfo.stream()
  349. .collect(Collectors.groupingBy(AppDataItemInfo::getResourceTableId));
  350. List<DataResourceTreeVo> tableVos = tableGroup.entrySet().stream().map(e -> {
  351. String tableId = e.getKey();
  352. AppDataResourceInfo table = tableMap.get(tableId);
  353. return convertTableToTreeVo(childVo.getId(), Collections.singletonList(table), tableGroup);
  354. }).flatMap(List::stream).collect(Collectors.toList());
  355. childVo.setTreeNode(true);
  356. childVo.setChild(tableVos);
  357. }
  358. }
  359. }
  360. return CollectionUtils.isEmpty(child);
  361. }
  362. private DataResourceTreeVo convertFieldClaToNode(FieldCla item, String pid) {
  363. return DataResourceTreeVo.builder()
  364. .id(item.getId())
  365. .pId(pid)
  366. .dataType(item.getDataType())
  367. .label(item.getName())
  368. .code(item.getCode())
  369. .build();
  370. }
  371. private void combineTreeNode(List<DataResourceTreeVo> firNodes, List<DataResourceTreeVo> secNodes) {
  372. Map<String, List<DataResourceTreeVo>> secMap = secNodes.stream().collect(Collectors.groupingBy(DataResourceTreeVo::getPId));
  373. firNodes.forEach(item -> {
  374. List<DataResourceTreeVo> childes = secMap.get(item.getId());
  375. item.setChild(childes);
  376. });
  377. }
  378. @Override
  379. public List<DataLevelVo> getDataLevelList() {
  380. List<DataLevel> all = dataLevelService.getAll();
  381. return all.stream()
  382. .map(item -> new DataLevelVo(item.getId(), item.getLevelCode(), item.getLevelName(), item.getDataType()))
  383. .collect(Collectors.toList());
  384. }
  385. @Override
  386. public List<DataLevelVo> getSecurityLevelList() {
  387. List<FieldSec> all = dataSecService.getAll();
  388. return all.stream()
  389. .map(item -> new DataLevelVo(item.getId(), item.getSecCode(), item.getSecName(), item.getDataType()))
  390. .collect(Collectors.toList());
  391. }
  392. @Override
  393. public List<DataClassifyVo> getDataClassifyList() {
  394. List<DataClaAcceptDTO> list = dataClaService.getAll();
  395. return list.stream().map(item -> {
  396. DataClassifyVo vo = new DataClassifyVo();
  397. vo.setFirstLevelCode(item.getFirCode());
  398. vo.setFirstLevelName(item.getFirName());
  399. vo.setSecondLevelCode(item.getSecCode());
  400. vo.setSecondLevelName(item.getSecName());
  401. vo.setLabelClassifyCode(item.getLabClaCode());
  402. vo.setLabelClassifyName(item.getLabClaName());
  403. vo.setLabelCode(item.getLabCode());
  404. vo.setLabelName(item.getLabName());
  405. return vo;
  406. }).collect(Collectors.toList());
  407. }
  408. @Override
  409. public List<DataFieldClassifyVo> getFieldClassifyList() {
  410. List<FieldClaAcceptDTO> list = fieldClaService.getAll();
  411. return list.stream().map(item -> {
  412. DataFieldClassifyVo vo = new DataFieldClassifyVo();
  413. vo.setFirstLevelCode(item.getFirCode());
  414. vo.setFirstLevelName(item.getFirName());
  415. vo.setSecondLevelCode(item.getSecCode());
  416. vo.setSecondLevelName(item.getSecName());
  417. return vo;
  418. }).collect(Collectors.toList());
  419. }
  420. @Override
  421. public ResponseStatus dataLevelSync() {
  422. //因为子线程中需要调用总线需要用到请求头中的信息
  423. //需要将requestAttributes设置到子线程中的RequestContextHolder
  424. //SpringWeb暂时未提供RequestContextHolder父子线程共享ThreadLocal中的数据的配置,需要手动设置
  425. RequestAttributes requestAttributes = RequestContextHolder.getRequestAttributes();
  426. //开启父子线程
  427. //方法内部有从ThreadLocal获取信息
  428. //CompletableFuture默认使用ForkJoin线程池,不要使用1.8的新线程开启方法
  429. //如果使用线程池需要用包装类将线程包装后设置RequestContextHolder
  430. Runnable r = () -> {
  431. RequestContextHolder.setRequestAttributes(requestAttributes);
  432. try {
  433. List<DataLevelVo> list = getDataLevelListFromRemote();
  434. dataLevelService.sync(list);
  435. } finally {
  436. RequestContextHolder.resetRequestAttributes();
  437. }
  438. };
  439. Thread t = new Thread(r);
  440. t.start();
  441. return ResponseStatus.success();
  442. }
  443. @Override
  444. public ResponseStatus columnRelationSync() {
  445. //因为子线程中需要调用总线需要用到请求头中的信息
  446. //需要将requestAttributes设置到子线程中的RequestContextHolder
  447. //SpringWeb暂时未提供RequestContextHolder父子线程共享ThreadLocal中的数据的配置,需要手动设置
  448. RequestAttributes requestAttributes = RequestContextHolder.getRequestAttributes();
  449. //开启父子线程
  450. //方法内部有从ThreadLocal获取信息
  451. //CompletableFuture默认使用ForkJoin线程池,不要使用1.8的新线程开启方法
  452. //如果使用线程池需要用包装类将线程包装后设置RequestContextHolder
  453. Runnable r = () -> {
  454. RequestContextHolder.setRequestAttributes(requestAttributes);
  455. try {
  456. List<AppColumnRelationVO> list = getColumnRelationCatalogFromRemote();
  457. appColumnRelationService.sync(list);
  458. } finally {
  459. RequestContextHolder.resetRequestAttributes();
  460. }
  461. };
  462. Thread t = new Thread(r);
  463. t.start();
  464. return ResponseStatus.success();
  465. }
  466. @Override
  467. public ResponseStatus dataSecSync() {
  468. //因为子线程中需要调用总线需要用到请求头中的信息
  469. //需要将requestAttributes设置到子线程中的RequestContextHolder
  470. //SpringWeb暂时未提供RequestContextHolder父子线程共享ThreadLocal中的数据的配置,需要手动设置
  471. RequestAttributes requestAttributes = RequestContextHolder.getRequestAttributes();
  472. //开启父子线程
  473. //方法内部有从ThreadLocal获取信息
  474. //CompletableFuture默认使用ForkJoin线程池,不要使用1.8的新线程开启方法
  475. //如果使用线程池需要用包装类将线程包装后设置RequestContextHolder
  476. Runnable r = () -> {
  477. RequestContextHolder.setRequestAttributes(requestAttributes);
  478. try {
  479. List<DataLevelVo> list = getSecurityLevelListFromRemote();
  480. dataSecService.sync(list);
  481. } finally {
  482. RequestContextHolder.resetRequestAttributes();
  483. }
  484. };
  485. Thread t = new Thread(r);
  486. t.start();
  487. return ResponseStatus.success();
  488. }
  489. @Override
  490. public ResponseStatus dataClaSync() {
  491. //因为子线程中需要调用总线需要用到请求头中的信息
  492. //需要将requestAttributes设置到子线程中的RequestContextHolder
  493. //SpringWeb暂时未提供RequestContextHolder父子线程共享ThreadLocal中的数据的配置,需要手动设置
  494. RequestAttributes requestAttributes = RequestContextHolder.getRequestAttributes();
  495. //开启父子线程
  496. //方法内部有从ThreadLocal获取信息
  497. //CompletableFuture默认使用ForkJoin线程池,不要使用1.8的新线程开启方法
  498. //如果使用线程池需要用包装类将线程包装后设置RequestContextHolder
  499. Runnable r = () -> {
  500. try {
  501. RequestContextHolder.setRequestAttributes(requestAttributes);
  502. List<DataResourceTreeVo> nodes = getDataClassifyTreeFromRemote();
  503. dataClaService.sync(nodes, null);
  504. } finally {
  505. RequestContextHolder.resetRequestAttributes();
  506. }
  507. };
  508. Thread t = new Thread(r);
  509. t.start();
  510. return ResponseStatus.success();
  511. }
  512. @Override
  513. public ResponseStatus fieldClaSync() {
  514. //因为子线程中需要调用总线需要用到请求头中的信息
  515. //需要将requestAttributes设置到子线程中的RequestContextHolder
  516. //SpringWeb暂时未提供RequestContextHolder父子线程共享ThreadLocal中的数据的配置,需要手动设置
  517. RequestAttributes requestAttributes = RequestContextHolder.getRequestAttributes();
  518. //开启父子线程
  519. //方法内部有从ThreadLocal获取信息
  520. //CompletableFuture默认使用ForkJoin线程池,不要使用1.8的新线程开启方法
  521. //如果使用线程池需要用包装类将线程包装后设置RequestContextHolder
  522. Runnable r = () -> {
  523. try {
  524. RequestContextHolder.setRequestAttributes(requestAttributes);
  525. List<DataResourceTreeVo> nodes = getFieldClassifyTreeFromRemote();
  526. fieldClaService.sync(nodes, null);
  527. } finally {
  528. RequestContextHolder.resetRequestAttributes();
  529. }
  530. };
  531. Thread t = new Thread(r);
  532. t.start();
  533. return ResponseStatus.success();
  534. }
  535. @Override
  536. public ResponseStatus syncTableAndColumn() {
  537. dataCatalogBusiness.syncTableAndColumn();
  538. return ResponseStatus.success();
  539. }
  540. @Override
  541. public List<DataLevelVo> getDetailByIdsAndClaType(List<String> ids, String classifyType) {
  542. List<DataLevelVo> vos = new ArrayList<>();
  543. if (CollectionUtils.isEmpty(ids)) {
  544. return vos;
  545. }
  546. if (StringUtils.isBlank(classifyType)) {
  547. return vos;
  548. }
  549. DataResourceEnum anEnum = DataResourceEnum.getByCode(classifyType);
  550. if (null == anEnum) {
  551. return vos;
  552. } else if (DataResourceEnum.COLUMN_CLASSIFY.equals(anEnum)) {
  553. List<FieldCla> list = fieldClaService.getByIds(ids);
  554. list.stream().map(item -> {
  555. DataLevelVo vo = new DataLevelVo();
  556. vo.setTypeCode(item.getDataType());
  557. vo.setLevelName(item.getName());
  558. vo.setLevelCode(item.getCode());
  559. vo.setId(item.getId());
  560. return vo;
  561. }).collect(Collectors.toList());
  562. } else if (DataResourceEnum.DATA_CLASSIFY.equals(anEnum)) {
  563. List<DataLevel> list = dataLevelService.getByIds(ids);
  564. list.stream().map(item -> {
  565. DataLevelVo vo = new DataLevelVo();
  566. vo.setTypeCode(item.getDataType());
  567. vo.setLevelName(item.getLevelName());
  568. vo.setLevelCode(item.getLevelCode());
  569. vo.setId(item.getId());
  570. return vo;
  571. }).collect(Collectors.toList());
  572. } else if (DataResourceEnum.DATA_RESOURCE_CLASSIFY.equals(anEnum)) {
  573. List<DataCla> list = dataClaService.getByIds(ids);
  574. list.stream().map(item -> {
  575. DataLevelVo vo = new DataLevelVo();
  576. vo.setTypeCode(item.getDataType());
  577. vo.setLevelName(item.getName());
  578. vo.setLevelCode(item.getCode());
  579. vo.setId(item.getId());
  580. return vo;
  581. }).collect(Collectors.toList());
  582. } else if (DataResourceEnum.DATA_SECURITY_LEVEL.equals(anEnum)) {
  583. List<FieldSec> list = dataSecService.getByIds(ids);
  584. list.stream().map(item -> {
  585. DataLevelVo vo = new DataLevelVo();
  586. vo.setTypeCode(item.getDataType());
  587. vo.setLevelName(item.getSecName());
  588. vo.setLevelCode(item.getSecCode());
  589. vo.setId(item.getId());
  590. return vo;
  591. }).collect(Collectors.toList());
  592. }
  593. return vos;
  594. }
  595. @Override
  596. public DataLevelVo getDetailByIdAndClaType(String id, String classifyType) {
  597. if (StringUtils.isAnyBlank(id, classifyType)) {
  598. return null;
  599. }
  600. DataLevelVo vo = new DataLevelVo();
  601. DataResourceEnum anEnum = DataResourceEnum.getByCode(classifyType);
  602. if (null == anEnum) {
  603. return null;
  604. } else if (DataResourceEnum.COLUMN_CLASSIFY.equals(anEnum)) {
  605. FieldCla fieldCla = fieldClaService.getById(id);
  606. vo.setId(fieldCla.getId());
  607. vo.setLevelCode(fieldCla.getCode());
  608. vo.setLevelName(fieldCla.getName());
  609. vo.setTypeCode(fieldCla.getDataType());
  610. } else if (DataResourceEnum.DATA_CLASSIFY.equals(anEnum)) {
  611. DataLevel dataLevel = dataLevelService.getById(id);
  612. vo.setId(dataLevel.getId());
  613. vo.setLevelCode(dataLevel.getLevelCode());
  614. vo.setLevelName(dataLevel.getLevelName());
  615. vo.setTypeCode(dataLevel.getDataType());
  616. } else if (DataResourceEnum.DATA_RESOURCE_CLASSIFY.equals(anEnum)) {
  617. DataCla dataCla = dataClaService.getById(id);
  618. vo.setId(dataCla.getId());
  619. vo.setLevelCode(dataCla.getId());
  620. vo.setLevelName(dataCla.getName());
  621. vo.setTypeCode(dataCla.getCode());
  622. } else if (DataResourceEnum.DATA_SECURITY_LEVEL.equals(anEnum)) {
  623. FieldSec dataSec = dataSecService.getById(id);
  624. vo.setId(dataSec.getId());
  625. vo.setLevelCode(dataSec.getSecCode());
  626. vo.setLevelName(dataSec.getSecName());
  627. vo.setTypeCode(dataSec.getDataType());
  628. }
  629. return vo;
  630. }
  631. /**
  632. * 数据资源分类
  633. *
  634. * @return
  635. */
  636. private List<DataResourceTreeVo> getDataClassifyTreeFromRemote() {
  637. String id = DataResourceEnum.DATA_RESOURCE_CLASSIFY.getCode();
  638. List<DataResourceTreeVo> collect = getFirstChildResourceClassifies(dataResourceService.getDataClassifyList())
  639. .stream()
  640. .map(firstClassify -> {
  641. DataResourceTreeVo firstTreeVo = DataResourceTreeVo.builder()
  642. .id(Joiner.on(CommonCons.ID_SEPARATOR).join(id, firstClassify.getCodeValue()))
  643. .code(firstClassify.getCodeValue())
  644. .label(firstClassify.getCodeName())
  645. .treeNode(true)
  646. .pId(id)
  647. .dataType(firstClassify.getTypeCode())
  648. .build();
  649. firstTreeVo.setChild(getFirstChildResourceClassifies(firstClassify.getChildrenType()).stream()
  650. .map(secondClassify -> {
  651. DataResourceTreeVo secondTreeVo = DataResourceTreeVo.builder()
  652. .id(Joiner.on(CommonCons.ID_SEPARATOR).join(firstTreeVo.getId(), secondClassify.getCodeValue()))
  653. .code(secondClassify.getCodeValue())
  654. .label(secondClassify.getCodeName())
  655. .treeNode(true)
  656. .pId(firstTreeVo.getId())
  657. .dataType(secondClassify.getTypeCode())
  658. .build();
  659. secondTreeVo.setChild(getChildrenTypeList(secondClassify.getChildrenType()).stream()
  660. .map(thirdClassify -> {
  661. DataResourceTreeVo thirdTreeVo = DataResourceTreeVo.builder()
  662. .id(Joiner.on(CommonCons.ID_SEPARATOR).join(secondTreeVo.getId(), thirdClassify.getTypeCode()))
  663. .code(thirdClassify.getTypeCode())
  664. .label(thirdClassify.getTypeName())
  665. .treeNode(true)
  666. .pId(secondTreeVo.getId())
  667. .dataType(thirdClassify.getTypeCode())
  668. .build();
  669. thirdTreeVo.setChild(thirdClassify.getDataList().stream()
  670. .map(fourClassify -> {
  671. DataResourceTreeVo fourTreeVo = DataResourceTreeVo.builder()
  672. .id(Joiner.on(CommonCons.ID_SEPARATOR).join(thirdTreeVo.getId(), fourClassify.getCodeValue()))
  673. .code(fourClassify.getCodeValue())
  674. .label(fourClassify.getCodeName())
  675. .treeNode(false).child(null)
  676. .pId(thirdTreeVo.getId())
  677. .dataType(thirdClassify.getTypeCode())
  678. .build();
  679. return fourTreeVo;
  680. }).collect(Collectors.toList()));
  681. return thirdTreeVo;
  682. }).collect(Collectors.toList()));
  683. return secondTreeVo;
  684. }).collect(Collectors.toList()));
  685. return firstTreeVo;
  686. }).collect(Collectors.toList());
  687. return collect;
  688. }
  689. /**
  690. * 字段分类
  691. *
  692. * @return
  693. */
  694. private List<DataResourceTreeVo> getFieldClassifyTreeFromRemote() {
  695. String id = DataResourceEnum.COLUMN_CLASSIFY.getCode();
  696. List<DataResourceTreeVo> collect = getFirstChildResourceClassifies(dataResourceService.getFieldClassifyList())
  697. .stream()
  698. .map(firstClassify -> {
  699. DataResourceTreeVo firstTreeVo = DataResourceTreeVo.builder()
  700. .id(Joiner.on(CommonCons.ID_SEPARATOR).join(id, firstClassify.getCodeValue()))
  701. .code(firstClassify.getCodeValue())
  702. .label(firstClassify.getCodeName())
  703. .dataType(firstClassify.getTypeCode())
  704. .treeNode(true)
  705. .pId(id)
  706. .build();
  707. firstTreeVo.setChild(getFirstChildResourceClassifies(firstClassify.getChildrenType())
  708. .stream()
  709. .map(secondClassify -> {
  710. DataResourceTreeVo secondTreeVo = DataResourceTreeVo.builder()
  711. .id(Joiner.on(CommonCons.ID_SEPARATOR).join(firstTreeVo.getId(), secondClassify.getCodeValue()))
  712. .code(secondClassify.getCodeValue())
  713. .label(secondClassify.getCodeName())
  714. .treeNode(false)
  715. .dataType(secondClassify.getTypeCode())
  716. .pId(firstTreeVo.getId())
  717. .build();
  718. return secondTreeVo;
  719. }
  720. ).collect(Collectors.toList()));
  721. return firstTreeVo;
  722. }).collect(Collectors.toList());
  723. return collect;
  724. }
  725. /**
  726. * 拼接表、列、pid
  727. *
  728. * 计算treeVo所有最底层子节点数量,不包含叶节点
  729. *
  730. * @param treeVo
  731. * @param tabInfosMap
  732. * @return
  733. */
  734. private boolean combinePidAndTableInfo(DataResourceTreeVo treeVo, Map<String, List<AppDataResourceInfo>> tabInfosMap) {
  735. List<DataResourceTreeVo> child = treeVo.getChild();
  736. Iterator<DataResourceTreeVo> iterator = child.iterator();
  737. while (iterator.hasNext()) {
  738. DataResourceTreeVo childVo = iterator.next();
  739. childVo.setPId(treeVo.getId());
  740. childVo.setId(Joiner.on(CommonCons.ID_SEPARATOR).join(treeVo.getId(), childVo.getCode()));
  741. List<DataResourceTreeVo> cc = childVo.getChild();
  742. if (CollectionUtils.isNotEmpty(cc)) {
  743. childVo.setTreeNode(true);
  744. boolean emptyChild = combinePidAndTableInfo(childVo, tabInfosMap);
  745. if (emptyChild) {
  746. iterator.remove();
  747. }
  748. } else {
  749. // 如果为叶子节点,查找对应的表和列
  750. // 如果查找不到表和列则移除
  751. String id = childVo.getId();
  752. String classifyCode = DataResourceEnum.DATA_RESOURCE_CLASSIFY.getCode();
  753. if (id.startsWith(classifyCode)) {
  754. String replace = id.replace(classifyCode + CommonCons.ID_SEPARATOR, "");
  755. List<AppDataResourceInfo> dataTabInfo = tabInfosMap.get(replace);
  756. if (dataTabInfo == null) {
  757. iterator.remove();
  758. } else {
  759. List<DataResourceTreeVo> tableVos = convertTableToTreeVo(childVo.getId(), dataTabInfo, null);
  760. childVo.setTreeNode(true);
  761. childVo.setChild(tableVos);
  762. }
  763. }
  764. }
  765. }
  766. return CollectionUtils.isEmpty(child);
  767. }
  768. private List<DataResourceTreeVo> convertTableToTreeVo(String pid, List<AppDataResourceInfo> dataTabInfo, Map<String, List<AppDataItemInfo>> colInfosMap) {
  769. return dataTabInfo.stream().map(e -> {
  770. DataResourceTreeVo vo = new DataResourceTreeVo();
  771. vo.setId(e.getId());
  772. vo.setPId(pid);
  773. vo.setLabel(e.getTableName());
  774. vo.setDataType(AppDataTypeEnum.TAB.getValue());
  775. if (null != colInfosMap) {
  776. List<AppDataItemInfo> colInfoList = colInfosMap.get(e.getDataObjectId());
  777. if (CollectionUtils.isNotEmpty(colInfoList)) {
  778. List<DataResourceTreeVo> colVos = convertColumnToTreeVo(e.getId(), colInfoList);
  779. vo.setChild(colVos);
  780. vo.setTreeNode(true);
  781. } else {
  782. vo.setChild(Collections.emptyList());
  783. vo.setTreeNode(false);
  784. }
  785. }
  786. return vo;
  787. }).collect(Collectors.toList());
  788. }
  789. private List<DataResourceTreeVo> convertColumnToTreeVo(String pid, List<AppDataItemInfo> colInfoList) {
  790. return colInfoList.stream().map(e -> {
  791. DataResourceTreeVo vo = new DataResourceTreeVo();
  792. vo.setId(e.getId());
  793. vo.setPId(pid);
  794. vo.setLabel(e.getColumnName());
  795. vo.setDataType(AppDataTypeEnum.COL.getValue());
  796. return vo;
  797. }).collect(Collectors.toList());
  798. }
  799. /**
  800. * 从数据资源目录获取数据-数据分级
  801. *
  802. * @return
  803. */
  804. private List<DataLevelVo> getDataLevelListFromRemote() {
  805. return getFirstChildResourceClassifies(dataResourceService.getDataLevelList())
  806. .stream()
  807. .map(childResourceClassify -> new DataLevelVo(null, childResourceClassify.getCodeValue(), childResourceClassify.getCodeName(), childResourceClassify.getTypeCode()))
  808. .collect(Collectors.toList());
  809. }
  810. /**
  811. * 从数据资源目录获取数据-字段关系
  812. *
  813. * @return 列表
  814. */
  815. private List<AppColumnRelationVO> getColumnRelationCatalogFromRemote() {
  816. return getFirstChildResourceClassifies(dataResourceService.getColumnRelationCatalog())
  817. .stream()
  818. .map(childResourceClassify -> new AppColumnRelationVO(null, childResourceClassify.getCodeValue(), childResourceClassify.getCodeName()))
  819. .collect(Collectors.toList());
  820. }
  821. /**
  822. * 从数据资源目录获取数据-安全级别数据
  823. *
  824. * @return
  825. */
  826. private List<DataLevelVo> getSecurityLevelListFromRemote() {
  827. return getFirstChildResourceClassifies(dataResourceService.getSecurityLevelList())
  828. .stream()
  829. .map(childResourceClassify -> new DataLevelVo(null, childResourceClassify.getCodeValue(), childResourceClassify.getCodeName(), childResourceClassify.getTypeCode()))
  830. .collect(Collectors.toList());
  831. }
  832. private List<ChildResourceClassify> getFirstChildResourceClassifies(List<ResourceClassify> fieldClassifyList) {
  833. return Optional.ofNullable(fieldClassifyList)
  834. .map(resourceClassifies -> resourceClassifies.get(0))
  835. .map(resourceClassify -> {
  836. //设置节点的dataType,dataType为上级的typeCode字段
  837. List<ChildResourceClassify> dataList = Optional.ofNullable(resourceClassify.getDataList()).orElse(Lists.newArrayList());
  838. dataList.stream().forEach(item -> item.setTypeCode(resourceClassify.getTypeCode()));
  839. return dataList;
  840. })
  841. .orElse(Lists.newArrayList());
  842. }
  843. private List<ResourceClassify> getChildrenTypeList(List<ResourceClassify> fieldClassifyList) {
  844. return Optional.ofNullable(fieldClassifyList)
  845. .orElse(Lists.newArrayList());
  846. }
  847. }