DataSourcesCalcUnit.java 7.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180
  1. package com.sundata.internalevaluation.calc.calcUnit;
  2. import cn.hutool.extra.spring.SpringUtil;
  3. import com.sundata.common.util.JsonUtil;
  4. import com.sundata.internalevaluation.calc.model.CalcResult;
  5. import com.sundata.internalevaluation.calc.model.CalcUnit;
  6. import com.sundata.internalevaluation.calc.model.finals.CalcType;
  7. import com.sundata.internalevaluation.calc.util.CalciteUtil;
  8. import com.sundata.internalevaluation.configuration.model.DataSourceModel;
  9. import com.sundata.internalevaluation.configuration.model.Interface;
  10. import com.sundata.internalevaluation.configuration.service.DataSourcesService;
  11. import com.sundata.internalevaluation.configuration.service.InterfaceService;
  12. import org.apache.calcite.adapter.file.JsonScannableTable;
  13. import org.slf4j.Logger;
  14. import org.slf4j.LoggerFactory;
  15. import java.util.ArrayList;
  16. import java.util.HashMap;
  17. import java.util.List;
  18. import java.util.Map;
  19. import java.util.stream.Collectors;
  20. /**
  21. * Created by IntelliJ IDEA.
  22. *
  23. * @author JoeLazy
  24. * @date 2025-02-12 10:46:08
  25. * @description: 数据来源计算单元
  26. */
  27. public class DataSourcesCalcUnit extends CalcUnit {
  28. private static final Logger log = LoggerFactory.getLogger(DataSourcesCalcUnit.class);
  29. final DataSourceModel dataSourcesModel;
  30. /**
  31. /**
  32. * 创建数据单元的绝对对象,对象必须包含如下参数
  33. *
  34. * @param calcCode 计算对象编号
  35. * @param calcName 计算对象名称
  36. * @param calcType 计算类型
  37. * @param initContext 计算单元初始化参数
  38. */
  39. public DataSourcesCalcUnit(String calcCode, String calcName,CalcType calcType, Map<String, Object> initContext,
  40. DataSourceModel dataSourcesModel) {
  41. super(calcCode, calcName, calcType, initContext);
  42. this.dataSourcesModel = dataSourcesModel;
  43. }
  44. /**
  45. * 判断是否已经计算过数据了
  46. *
  47. * @param calculateInstanceNumber 计算流水号
  48. * @return 是否计算过 true 计算过 false 没有计算过
  49. */
  50. @Override
  51. public boolean isCalcFinished(String calculateInstanceNumber) {
  52. return false;
  53. }
  54. /**
  55. * 初始化计算结果的方法,如果已经计算过,在实现过程中,应当在此方法中根据计算流水号重新初始化 resultContext 结果对象,为其他依赖对象做准备
  56. * 若明明计算过本单元但再次计算时没有初始化该对象,则计算依赖出现问题无法定位与处理
  57. *
  58. * @param calculateInstanceNumber 计算流水号
  59. */
  60. @Override
  61. public void initResultContext(String calculateInstanceNumber) {
  62. }
  63. /**
  64. * 根据节点配置获取源节点;
  65. *
  66. * @return 所有源头节点
  67. */
  68. @Override
  69. public List<CalcUnit> getSourceCalcUnits() {
  70. // 通过bean获取对象
  71. DataSourcesService sourcesService = SpringUtil.getBean(DataSourcesService.class);
  72. InterfaceService sysInterfaceService = SpringUtil.getBean(InterfaceService.class);
  73. DataSourceModel selectModel = sourcesService.selectDetailData(this.dataSourcesModel.getDataSourcesNo());
  74. // 记录所有源头节点
  75. List<CalcUnit> allUnitList = new ArrayList<>();
  76. List<Interface> sysInterfaceModelList = new ArrayList<>();
  77. // 接口源节点
  78. if ("INTERFACE".equals(dataSourcesModel.getDataSourcesType())) {
  79. // List<String> interfaceNos = selectModel.getRequestInterfaces();
  80. // for ( String s : interfaceNos) {
  81. // sysInterfaceModelList.add(sysInterfaceService.getById(s));
  82. // }
  83. sysInterfaceModelList.add(sysInterfaceService.getById(selectModel.getRequestInterface()));
  84. List<CalcUnit> interFaceList = sysInterfaceModelList.stream().map(interfaceModel -> new InterfaceCalcUnit(interfaceModel.getInterfaceNo(),interfaceModel.getInterfaceName(),CalcType.INTERFACE,Map.of(),interfaceModel)).collect(Collectors.toList());
  85. allUnitList.addAll(interFaceList);
  86. }
  87. // 查询逻辑源节点
  88. if ("JDBC".equals(dataSourcesModel.getDataSourcesType())) {
  89. List<CalcUnit> queryList = dataSourcesModel.getQueryLogic().stream().map(queryParam -> new QueryLogicCalcUnit(queryParam.getDataItemName(),queryParam.getScriptDescription(),CalcType.QUERYLOGIC,Map.of(),queryParam)).collect(Collectors.toList());
  90. allUnitList.addAll(queryList);
  91. }
  92. return allUnitList;
  93. }
  94. /**
  95. * 计算之后的方法,可实现为空
  96. *
  97. * @param context
  98. */
  99. @Override
  100. public void afterCalc(Map<String, Object> context) {
  101. }
  102. /**
  103. * 计算之前,可实现空
  104. *
  105. * @param context
  106. */
  107. @Override
  108. public void beforeCalc(Map<String, Object> context) {
  109. }
  110. /**
  111. * 必须实现的主体计算内容
  112. *
  113. * @param thisResult 本计算单元的结果
  114. * @param calculateInstanceNumber 计算流水号
  115. * @param context 节点计算参数清单
  116. * @param sourceResults 源头计算节点的结果
  117. */
  118. @Override
  119. public void calc(CalcResult<String, Object> thisResult, String calculateInstanceNumber, Map<String, Object> context, Map<CalcUnit, CalcResult<String, Object>> sourceResults) {
  120. log.info("当前计算节点为:[{}-{}-{}],计算流水号为:{}", this.getCalcType(), this.getCalcCode(), this.getCalcName(), calculateInstanceNumber);
  121. sourceResults.forEach((calcUnit,result)->{
  122. // 合并结果集
  123. Map<String,JsonScannableTable> allMap = new HashMap<>();
  124. if ("INTERFACE".equals(dataSourcesModel.getDataSourcesType())) {
  125. // 数据来源类型为接口时处理逻辑
  126. if (calcUnit instanceof InterfaceCalcUnit ) {
  127. // 获取json
  128. String json = result.get(calcUnit.getCalcCode()) instanceof String ? (String) result.get(calcUnit.getCalcCode()) : "";
  129. Map<String,Object> objectMap = JsonUtil.jsonToMap(json);
  130. // 调用utils类构建表
  131. Map<String, JsonScannableTable> tableMap = CalciteUtil.createTableMap(objectMap);
  132. allMap.putAll(tableMap);
  133. // List<Object> parseList = JsonUtil.jsonToList(json);
  134. // // 结果封装
  135. // thisResult.put(this.getCalcCode(), parseList);
  136. }
  137. } else if ("JDBC".equals(dataSourcesModel.getDataSourcesType())) {
  138. // 数据来源类型为jdbc时处理逻辑
  139. if (calcUnit instanceof QueryLogicCalcUnit queryLogicCalcUnit) {
  140. // 声明本地表数据集合
  141. Map<String,Object> localTable = new HashMap<>();
  142. localTable.put(queryLogicCalcUnit.queryLogicModel.getDataItemName(),result.get(queryLogicCalcUnit.queryLogicModel.getDataItemName()));
  143. // 调用util类构造表
  144. Map<String,JsonScannableTable> tableMap = CalciteUtil.createTableMap(localTable);
  145. allMap.putAll(tableMap);
  146. // 结果封装,数据项名做key
  147. // thisResult.put(queryLogicCalcUnit.queryLogicModel.getDataItemName(), result.get(queryLogicCalcUnit.getCalcCode()));
  148. }
  149. }
  150. // 将构造好的table表结果封装
  151. thisResult.put(this.getCalcCode(),allMap);
  152. });
  153. }
  154. }