IndexCalcUnit.java 9.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210
  1. package com.sundata.internalevaluation.calc.calcUnit;
  2. import cn.hutool.core.util.StrUtil;
  3. import cn.hutool.extra.spring.SpringUtil;
  4. import com.sundata.common.util.DBExecutor;
  5. import com.sundata.internalevaluation.calc.model.CalcException;
  6. import com.sundata.internalevaluation.calc.model.CalcResult;
  7. import com.sundata.internalevaluation.calc.model.CalcUnit;
  8. import com.sundata.internalevaluation.calc.model.finals.CalcType;
  9. import com.sundata.internalevaluation.configuration.model.DataSetConfigModel;
  10. import com.sundata.internalevaluation.configuration.model.IndexConfigModel;
  11. import com.sundata.internalevaluation.configuration.model.IndexSourceModel;
  12. import com.sundata.internalevaluation.configuration.service.DataSetConfigService;
  13. import com.sundata.internalevaluation.configuration.service.IndexConfigService;
  14. import com.sundata.internalevaluation.script.ScriptUtil;
  15. import com.sundata.internalevaluation.script.TemplateUtil;
  16. import org.slf4j.Logger;
  17. import org.slf4j.LoggerFactory;
  18. import java.util.ArrayList;
  19. import java.util.List;
  20. import java.util.Map;
  21. import java.util.concurrent.atomic.AtomicInteger;
  22. import java.util.concurrent.atomic.AtomicReference;
  23. import java.util.stream.Collectors;
  24. public class IndexCalcUnit extends CalcUnit {
  25. private IndexConfigModel indexConfigModel;
  26. private static final Logger log = LoggerFactory.getLogger(IndexCalcUnit.class);
  27. /**
  28. * 创建数据单元的绝对对象,对象必须包含如下参数
  29. *
  30. * @param calcCode 计算对象编号
  31. * @param calcName 计算对象名称
  32. * @param initContext 计算单元初始化参数
  33. */
  34. public IndexCalcUnit(String calcCode, String calcName, Map<String, Object> initContext, IndexConfigModel indexConfigModel) {
  35. super(calcCode, calcName, CalcType.INDEX, initContext);
  36. this.indexConfigModel = indexConfigModel;
  37. }
  38. /**
  39. * 判断是否已经计算过数据了
  40. *
  41. * @param calculateInstanceNumber 计算流水号
  42. * @return 是否计算过 true 计算过 false 没有计算过
  43. */
  44. @Override
  45. public boolean isCalcFinished(String calculateInstanceNumber) {
  46. // TODO 计算是否已经计算
  47. return false;
  48. // return DataImages.indexCalcUnitHashMap.containsKey(calculateInstanceNumber) && DataImages.indexCalcUnitHashMap.get(calculateInstanceNumber).stream().anyMatch(a -> a.getCalcCode().equals(this.getCalcCode()));
  49. }
  50. /**
  51. * 初始化计算结果的方法,如果已经计算过,在实现过程中,应当在此方法中根据计算流水号重新初始化 resultContext 结果对象,为其他依赖对象做准备
  52. * 若明明计算过本单元但再次计算时没有初始化该对象,则计算依赖出现问题无法定位与处理
  53. *
  54. * @param calculateInstanceNumber 计算流水号
  55. */
  56. @Override
  57. public void initResultContext(String calculateInstanceNumber) {
  58. // TODO 初始化
  59. List<IndexCalcUnit> indexCalcUnits = new ArrayList<>();
  60. // List<IndexCalcUnit> indexCalcUnits = DataImages.indexCalcUnitHashMap.get(calculateInstanceNumber);
  61. // 筛选并查找对象,如果找不到则报错
  62. if (indexCalcUnits.stream().noneMatch(a -> a.getCalcCode().equals(this.getCalcCode()))) {
  63. throw new CalcException(calculateInstanceNumber, StrUtil.format("无法找到已计算完成的结果,计算单元编号:{},计算流水号为:{}。", this.getCalcCode(), calculateInstanceNumber));
  64. }
  65. this.setResultContext(indexCalcUnits.stream().filter(a -> a.getCalcCode().equals(this.getCalcCode())).findFirst().get().getResultContext());
  66. }
  67. /**
  68. * 根据节点配置获取源节点;
  69. *
  70. * @return 所有源头节点
  71. */
  72. @Override
  73. public List<CalcUnit> getSourceCalcUnits() {
  74. // TODO 获取源头节点
  75. DataSetConfigService dataSetService = SpringUtil.getBean(DataSetConfigService.class);
  76. IndexConfigService indexConfigService = SpringUtil.getBean(IndexConfigService.class);
  77. List<IndexSourceModel> selectList = indexConfigService.getIndexSourceList(this.indexConfigModel);
  78. // 定义存放数据集和其他指标的集合
  79. List<IndexConfigModel> indexList = new ArrayList<>();
  80. List<DataSetConfigModel> dataSetList = new ArrayList<>();
  81. // 查询个指标编号和数据集对应的数据
  82. for ( IndexSourceModel m : selectList) {
  83. if (m.getDataSourceType().equals("DATASET")) {
  84. DataSetConfigModel datasetModel = dataSetService.selectDetailData(new DataSetConfigModel());
  85. dataSetList.add(datasetModel);
  86. } else if (m.getDataSourceType().equals("INDEX")) {
  87. IndexConfigModel indexConfigModel = indexConfigService.selectDetailData(new IndexConfigModel());
  88. indexList.add(indexConfigModel);
  89. }
  90. }
  91. List<CalcUnit> indexCalcList = null;
  92. List<CalcUnit> dataSetCalcList = null;
  93. List<CalcUnit> resultCalcMap = new ArrayList<>();
  94. // 数据源头节点生成
  95. if (indexList.size() > 0) {
  96. indexCalcList = indexList.stream().map(indexConfigModel -> new IndexCalcUnit
  97. (indexConfigModel.getIndexNo(),indexConfigModel.getIndexName(),Map.of(),indexConfigModel)).collect(Collectors.toList());
  98. }
  99. if (dataSetList.size() > 0) {
  100. dataSetCalcList = dataSetList.stream().map(dataSetModel -> new DataSetCalcUnit
  101. (dataSetModel.getDataSetNo(),dataSetModel.getDataSetName(),Map.of(),dataSetModel)).collect(Collectors.toList());
  102. }
  103. // selectList.stream().map(sourceModel -> new IndexSourceCalcUnit
  104. // (sourceModel.getOtherIndexNo(),"",CalcType.INDEX,Map.of(),sourceModel));
  105. // 结果封装
  106. resultCalcMap.addAll(indexCalcList);
  107. resultCalcMap.addAll(dataSetCalcList);
  108. return new ArrayList<>();
  109. // return ConfigImages.indexCalcUnitListMap.get(this);
  110. }
  111. /**
  112. * 计算之后的方法,可实现为空
  113. *
  114. * @param context 计算参数过程数据
  115. */
  116. @Override
  117. public void afterCalc(Map<String, Object> context) {
  118. log.debug("计算之后的参数结构:{}",context);
  119. }
  120. /**
  121. * 计算之前,可实现空
  122. *
  123. * @param context 计算参数过程数据
  124. */
  125. @Override
  126. public void beforeCalc(Map<String, Object> context) {
  127. log.debug("计算之前的参数结构:{}",context);
  128. }
  129. /**
  130. * 必须实现的主体计算内容
  131. *
  132. * @param context 节点计算参数清单
  133. * @param sourceResults 整个计算过程中的节点结果
  134. */
  135. @Override
  136. public void calc(final CalcResult<String, Object> thisResult, String calculateInstanceNumber, Map<String, Object> context, Map<CalcUnit, CalcResult<String, Object>> sourceResults) {
  137. // TODO 实际的计算过程
  138. // 记录数据集出现次数
  139. AtomicInteger dataSetNumber = new AtomicInteger();
  140. // 记录其他指标出现次数
  141. AtomicInteger indexNumber = new AtomicInteger();
  142. // 声明只存放指标源头节点变量
  143. AtomicReference<CalcResult<String, Object>> indexResult = new AtomicReference<>();
  144. // 声明只存放所有数据集源头节点变量
  145. AtomicReference<CalcResult<String, Object>> dataSetResult = new AtomicReference<>();
  146. sourceResults.forEach((calcUnit,result) -> {
  147. // 数据集
  148. if ( calcUnit instanceof DataSetCalcUnit dataSetCalcUnit){
  149. if(dataSetCalcUnit.getCalcType() == CalcType.DATASET){
  150. dataSetNumber.getAndIncrement();
  151. dataSetResult.setOpaque(result);
  152. }
  153. }
  154. // 其他指标
  155. if( calcUnit instanceof IndexCalcUnit indexCalcUnit){
  156. if(indexCalcUnit.getCalcType() == CalcType.INDEX){
  157. indexNumber.getAndIncrement();
  158. indexResult.setOpaque(result);
  159. }
  160. }
  161. });
  162. if (dataSetNumber.get() > 0 && indexNumber.get() == 0){
  163. // 如果数据集的数量大于0
  164. // 获取指标逻辑
  165. String logic = indexConfigModel.getIndexLogic();
  166. // 执行sql,并放进结果集内
  167. // JsonToCalciteExample.jsonTotable()
  168. // TODO 计算逻辑
  169. thisResult.put(this.getCalcCode(),DBExecutor.doQueryMap(logic));
  170. }
  171. if(indexNumber.get() > 0 && dataSetNumber.get() == 0){
  172. // 如果指标的数量大于0
  173. // 获取指标逻辑
  174. String logic = indexConfigModel.getIndexLogic();
  175. // 执行公式,结果放入结果集
  176. Object result = ScriptUtil.executeScript(indexConfigModel.getIndexNo(),logic,indexResult.get());
  177. // JsonToCalciteExample.jsonTotable()
  178. thisResult.put(this.getCalcCode(),result);
  179. }
  180. if (dataSetNumber.get() > 0 && indexNumber.get() >0) {
  181. // 同时具有指标和数据集
  182. // 获取指标逻辑
  183. String logic = indexConfigModel.getIndexLogic();
  184. // 先将sql作为一个 进行处理,将指标的结果作为参数带入模板成为一个新模板,后在将数据集的参数带入
  185. String editSql = TemplateUtil.execute(indexConfigModel.getIndexNo(),logic,indexResult.get());
  186. // JsonToCalciteExample.jsonTotable()
  187. thisResult.put(this.getCalcCode(),DBExecutor.doQueryMap(editSql));
  188. }
  189. }
  190. }