RuleCalcUnit.java 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139
  1. package com.sundata.internalevaluation.calc.calcUnit;
  2. import cn.hutool.extra.spring.SpringUtil;
  3. import com.sundata.common.util.StringUtil;
  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.configuration.model.IndexConfigModel;
  8. import com.sundata.internalevaluation.configuration.model.SysReqRule;
  9. import com.sundata.internalevaluation.configuration.service.IndexConfigService;
  10. import com.sundata.internalevaluation.script.ScriptUtil;
  11. import com.sundata.internalevaluation.script.TemplateUtil;
  12. import java.util.List;
  13. import java.util.Map;
  14. import java.util.stream.Collectors;
  15. /**
  16. * Created by IntelliJ IDEA.
  17. *
  18. * @author JoeLazy
  19. * @date 2025-02-12 09:31:30
  20. * @description: 规则计算单元
  21. */
  22. public class RuleCalcUnit extends CalcUnit {
  23. private SysReqRule reqRule;
  24. private final IndexConfigService indexConfigService;
  25. /**
  26. * 创建数据单元的绝对对象,对象必须包含如下参数
  27. *
  28. * @param calcCode 计算对象编号
  29. * @param calcName 计算对象名称
  30. * @param calcType 计算类型
  31. * @param initContext 计算单元初始化参数
  32. */
  33. public RuleCalcUnit(String calcCode, String calcName, CalcType calcType, Map<String, Object> initContext, SysReqRule reqRule) {
  34. super(calcCode, calcName, calcType, initContext);
  35. this.reqRule = reqRule;
  36. this.indexConfigService = SpringUtil.getBean(IndexConfigService.class);
  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. }
  49. /**
  50. * 初始化计算结果的方法,如果已经计算过,在实现过程中,应当在此方法中根据计算流水号重新初始化 resultContext 结果对象,为其他依赖对象做准备
  51. * 若明明计算过本单元但再次计算时没有初始化该对象,则计算依赖出现问题无法定位与处理
  52. *
  53. * @param calculateInstanceNumber 计算流水号
  54. */
  55. @Override
  56. public void initResultContext(String calculateInstanceNumber) {
  57. // TODO 初始化数据??
  58. }
  59. /**
  60. * 根据节点配置获取源节点;
  61. *
  62. * @return 所有源头节点
  63. */
  64. @Override
  65. public List<CalcUnit> getSourceCalcUnits() {
  66. List<IndexConfigModel> indexConfigModels = indexConfigService.selectIndexListByRuleNo(this.reqRule.getRuleNo());
  67. return indexConfigModels.stream()
  68. .map(item -> new IndexCalcUnit(item.getIndexNo(), item.getIndexName(), Map.of(), item)).collect(Collectors.toList());
  69. }
  70. /**
  71. * 计算之后的方法,可实现为空
  72. *
  73. * @param context
  74. */
  75. @Override
  76. public void afterCalc(Map<String, Object> context) {
  77. }
  78. /**
  79. * 计算之前,可实现空
  80. *
  81. * @param context
  82. */
  83. @Override
  84. public void beforeCalc(Map<String, Object> context) {
  85. }
  86. /**
  87. * 必须实现的主体计算内容
  88. *
  89. * @param thisResult 本计算单元的结果
  90. * @param calculateInstanceNumber 计算流水号
  91. * @param context 节点计算参数清单
  92. * @param sourceResults 源头计算节点的结果
  93. */
  94. @Override
  95. public void calc(CalcResult<String, Object> thisResult,
  96. String calculateInstanceNumber,
  97. Map<String, Object> context,
  98. Map<CalcUnit, CalcResult<String, Object>> sourceResults) {
  99. // 获取道规则的计算模板或脚本
  100. String ruleTemplate = this.reqRule.getRuleTemplate();
  101. // 模板或脚本需要的参数
  102. // TODO 根据实际情况获取
  103. Map<String, Object> initContext = this.getInitContext();
  104. // 执行脚本 获取结果
  105. Object res = ScriptUtil.executeScript(String.valueOf(System.currentTimeMillis()), ruleTemplate, initContext);
  106. // 填充结果
  107. // true 表示出发规则 所以执行规则结果
  108. // false 未触发 所以 无执行
  109. thisResult.put(this.getCalcCode(), res.equals(true) ? reqRule.getRuleResult():"none");
  110. // ******************************
  111. String ruleConclusionTemplate = this.reqRule.getRuleConclusionTemplate();
  112. if (StringUtil.isNotEmpty(ruleConclusionTemplate)) {
  113. String result = TemplateUtil.execute("tempNo" + System.currentTimeMillis(), ruleConclusionTemplate, Map.of("result", res));
  114. System.err.printf("%s-%s-结论:%s\n\r", this.getCalcCode(), this.getCalcName(), result);
  115. } else {
  116. System.err.printf("%s-%s-[没有结论模板]....\n\r", this.getCalcCode(), this.getCalcName());
  117. }
  118. }
  119. }