DataResourceFacade.java 41 KB

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