DataSetCalcUnit.java 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141
  1. package com.sundata.internalevaluation.calc.calcUnit;
  2. import cn.hutool.core.util.RandomUtil;
  3. import cn.hutool.core.util.StrUtil;
  4. import cn.hutool.extra.spring.SpringUtil;
  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.DataSourcesModel;
  11. import com.sundata.internalevaluation.configuration.service.DataSourcesService;
  12. import org.slf4j.Logger;
  13. import org.slf4j.LoggerFactory;
  14. import java.util.ArrayList;
  15. import java.util.HashMap;
  16. import java.util.List;
  17. import java.util.Map;
  18. import java.util.stream.Collectors;
  19. /**
  20. * 数据集的计算单元
  21. */
  22. public class DataSetCalcUnit extends CalcUnit {
  23. private static final Logger log = LoggerFactory.getLogger(DataSetCalcUnit.class);
  24. DataSetConfigModel dataSetConfigModel;
  25. /**
  26. * 创建数据单元的绝对对象,对象必须包含如下参数
  27. *
  28. * @param calcCode 计算对象编号
  29. * @param calcName 计算对象名称
  30. * @param initContext 计算单元初始化参数
  31. */
  32. public DataSetCalcUnit(String calcCode, String calcName, Map<String, Object> initContext, DataSetConfigModel dataSetConfigModel) {
  33. super(calcCode, calcName, CalcType.DATASET, initContext);
  34. this.dataSetConfigModel = dataSetConfigModel;
  35. }
  36. /**
  37. * 判断是否已经计算过数据了
  38. *
  39. * @param calculateInstanceNumber 计算流水号
  40. * @return 是否计算过 true 计算过 false 没有计算过
  41. */
  42. @Override
  43. public boolean isCalcFinished(String calculateInstanceNumber) {
  44. // TODO 计算是否已经计算
  45. return false;
  46. // return DataImages.dataSetCalcUnitHashMap.containsKey(calculateInstanceNumber)&&DataImages.dataSetCalcUnitHashMap.get(calculateInstanceNumber).stream().anyMatch(a->a.getCalcCode().equals(this.getCalcCode()));
  47. }
  48. /**
  49. * 初始化计算结果的方法,如果已经计算过,在实现过程中,应当在此方法中根据计算流水号重新初始化 resultContext 结果对象,为其他依赖对象做准备
  50. * 若明明计算过本单元但再次计算时没有初始化该对象,则计算依赖出现问题无法定位与处理
  51. *
  52. * @param calculateInstanceNumber 计算流水号
  53. */
  54. @Override
  55. public void initResultContext(String calculateInstanceNumber) {
  56. // TODO 初始化
  57. // List<DataSetCalcUnit> dataSetCalcUnits = DataImages.dataSetCalcUnitHashMap.get(calculateInstanceNumber);
  58. List<DataSetCalcUnit> dataSetCalcUnits = new ArrayList<>();
  59. // 筛选并查找对象,如果找不到则报错
  60. if(dataSetCalcUnits.stream().noneMatch(a -> a.getCalcCode().equals(this.getCalcCode()))){
  61. throw new CalcException(calculateInstanceNumber, StrUtil.format("无法找到已计算完成的结果,计算单元编号:{},计算流水号为:{}。", this.getCalcCode(),calculateInstanceNumber));
  62. }
  63. this.setResultContext(dataSetCalcUnits.stream().filter(a->a.getCalcCode().equals(this.getCalcCode())).findFirst().get().getResultContext());
  64. }
  65. /**
  66. * 根据节点配置获取源节点;
  67. *
  68. * @return 所有源头节点
  69. */
  70. @Override
  71. public List<CalcUnit> getSourceCalcUnits() {
  72. // TODO 获取源头节点
  73. //DataSetConfigService dataSetService = SpringUtil.getBean(DataSetConfigService.class);
  74. DataSourcesService sourcesService = SpringUtil.getBean(DataSourcesService.class);
  75. //dataSetService.getDataList(new DataSetConfigModel());
  76. List<DataSourcesModel> sourceList = new ArrayList<>();
  77. for (String s :dataSetConfigModel.getDataSourcesNos()) {
  78. // sourceModel.setDataSourcesNo();
  79. DataSourcesModel model = sourcesService.selectDetailData(s);
  80. sourceList.add(model);
  81. }
  82. List<CalcUnit> calcList = sourceList.stream().map(model ->
  83. new DataSourcesCalcUnit(model.getDataSourcesNo(),model.getDataSourcesName(),CalcType.DATASOURCES,Map.of(),model)).collect(Collectors.toList());
  84. return calcList;
  85. }
  86. /**
  87. * 计算之后的方法,可实现为空
  88. *
  89. * @param context 计算参数过程数据
  90. */
  91. @Override
  92. public void afterCalc(Map<String, Object> context) {
  93. context.put(RandomUtil.randomNumbers(5)+"-1", this.getCalcCode());
  94. log.debug("计算之后的参数结构:{}",context);
  95. }
  96. /**
  97. * 计算之前,可实现空
  98. *
  99. * @param context 计算参数过程数据
  100. */
  101. @Override
  102. public void beforeCalc(Map<String, Object> context) {
  103. context.put(RandomUtil.randomNumbers(5)+"-2", this.getCalcCode());
  104. log.debug("计算之前的参数结构:{}",context);
  105. }
  106. /**
  107. * 必须实现的主体计算内容
  108. *
  109. * @param context 节点计算参数清单
  110. * @param sourceResults 整个计算过程中的节点结果
  111. */
  112. @Override
  113. public void calc(final CalcResult<String, Object> thisResult, String calculateInstanceNumber,Map<String, Object> context, Map<CalcUnit, CalcResult<String, Object>> sourceResults) {
  114. // TODO 实际的计算过程
  115. // AtomicReference<CalcResult<String, Object>> resultMap = new AtomicReference<>();
  116. Map<String,Object> resultMap = new HashMap<>();
  117. // 合并数据集
  118. sourceResults.forEach((calcUnit,result)-> {
  119. resultMap.putAll(result);
  120. });
  121. thisResult.put(this.getCalcCode(),resultMap);
  122. }
  123. }