DataResourceFacade.java 42 KB

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