|
@@ -0,0 +1,169 @@
|
|
|
+package com.ims.eval.schedule;
|
|
|
+
|
|
|
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
|
|
+import com.ims.common.utils.StringUtils;
|
|
|
+import com.ims.eval.dao.*;
|
|
|
+import com.ims.eval.entity.*;
|
|
|
+import com.ims.eval.service.IEvaluationScoreCountService;
|
|
|
+import com.ims.eval.service.impl.EvaluatioinScoreCountServiceImpl;
|
|
|
+import com.ims.eval.util.MathCalculatorUtil;
|
|
|
+import lombok.extern.slf4j.Slf4j;
|
|
|
+import org.springframework.beans.factory.annotation.Autowired;
|
|
|
+import org.springframework.scheduling.annotation.EnableScheduling;
|
|
|
+import org.springframework.stereotype.Component;
|
|
|
+
|
|
|
+import javax.script.ScriptEngine;
|
|
|
+import javax.script.ScriptEngineManager;
|
|
|
+import javax.script.ScriptException;
|
|
|
+import java.math.BigDecimal;
|
|
|
+import java.util.List;
|
|
|
+import java.util.Map;
|
|
|
+import java.util.stream.Collectors;
|
|
|
+
|
|
|
+/**
|
|
|
+ * @author :xugp
|
|
|
+ * @date :Created in 2023/3/15 9:49
|
|
|
+ * @description:得分规则计算
|
|
|
+ * @modified By:
|
|
|
+ * @version: $
|
|
|
+ */
|
|
|
+
|
|
|
+@Slf4j
|
|
|
+@Component
|
|
|
+@EnableScheduling
|
|
|
+public class ScoreCalculationSchedule {
|
|
|
+
|
|
|
+ @Autowired
|
|
|
+ private OrganizationEvaluationInfoMapper organizationEvaluationInfoMapper;
|
|
|
+
|
|
|
+ @Autowired
|
|
|
+ private EvaluationScoringRuleMapper evaluationScoringRuleMapper;
|
|
|
+
|
|
|
+ @Autowired
|
|
|
+ private IntervalScoringTableMapper intervalScoringTableMapper;
|
|
|
+
|
|
|
+ @Autowired
|
|
|
+ private IndicatorMapper indicatorMapper;
|
|
|
+
|
|
|
+ @Autowired
|
|
|
+ private IEvaluationScoreCountService iEvaluatioinScoreCountService;
|
|
|
+
|
|
|
+ /*@Scheduled(cron = "* 10 11 ? * 3")*/
|
|
|
+ public boolean doTask(){
|
|
|
+
|
|
|
+ boolean save = true;
|
|
|
+ try {
|
|
|
+ //加载责任书指标明细数据
|
|
|
+ QueryWrapper<OrganizationEvaluationInfo> qw = new QueryWrapper<>();
|
|
|
+ List<OrganizationEvaluationInfo> organizationEvaluationInfos= organizationEvaluationInfoMapper.selectList(qw);
|
|
|
+ if (organizationEvaluationInfos.size() > 0){
|
|
|
+ //对考评记录id进行分组
|
|
|
+ Map<String, List<OrganizationEvaluationInfo>> collect = organizationEvaluationInfos.stream().collect(Collectors.groupingBy(OrganizationEvaluationInfo::getOrganizationEvaluationId));
|
|
|
+ for (Map.Entry<String, List<OrganizationEvaluationInfo>> entry : collect.entrySet()){
|
|
|
+ //对指标id进行分组
|
|
|
+ if (entry.getValue().size() > 0){
|
|
|
+ Map<String, List<OrganizationEvaluationInfo>> collectIn = entry.getValue().stream().collect(Collectors.groupingBy(OrganizationEvaluationInfo::getIndicatorId));
|
|
|
+ for (Map.Entry<String, List<OrganizationEvaluationInfo>> listEntry : collectIn.entrySet()){
|
|
|
+ Indicator indicator = indicatorMapper.selectById(listEntry.getKey());
|
|
|
+ QueryWrapper<EvaluationScoringRule> e = new QueryWrapper<>();
|
|
|
+ if (StringUtils.isNotEmpty(indicator.getIndicatorCode())) {
|
|
|
+ e.lambda().eq(EvaluationScoringRule::getIndicatorId,indicator.getIndicatorCode());
|
|
|
+ }
|
|
|
+ EvaluationScoringRule evaluationScoringRule = evaluationScoringRuleMapper.selectOne(e);
|
|
|
+ if (evaluationScoringRule != null){
|
|
|
+ String calculation = replace(listEntry.getValue(), evaluationScoringRule);
|
|
|
+ log.info(indicator.getIndicatorCode()+"得分为" + calculation);
|
|
|
+ //将得分存入考评得分统计表
|
|
|
+ EvaluationScoreCount evaluationScoreCount = new EvaluationScoreCount();
|
|
|
+ evaluationScoreCount.setOrganizationEvaluationID(entry.getKey());
|
|
|
+ evaluationScoreCount.setIndicatorId(listEntry.getKey());
|
|
|
+ evaluationScoreCount.setScore(calculation);
|
|
|
+ save = iEvaluatioinScoreCountService.save(evaluationScoreCount);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ }catch (Exception e){
|
|
|
+ log.info(e.getMessage());
|
|
|
+ }
|
|
|
+ return save;
|
|
|
+ }
|
|
|
+
|
|
|
+ //中间变量替换为数据
|
|
|
+ public String replace(List<OrganizationEvaluationInfo> list,EvaluationScoringRule evaluationScoringRule) throws ScriptException {
|
|
|
+
|
|
|
+ String score = null;
|
|
|
+ //判断可用量化的进行变量替换
|
|
|
+ if ("是".equals(list.get(0).getIsQuantified())){
|
|
|
+ Map<String, Double> doubleMap = list.stream().collect(Collectors.toMap(OrganizationEvaluationInfo::getOptionCode, OrganizationEvaluationInfo::getQuantifiedValue));
|
|
|
+ QueryWrapper<IntervalScoringTable> qw = new QueryWrapper<>();
|
|
|
+ if (StringUtils.isNotEmpty(evaluationScoringRule.getId())) {
|
|
|
+ qw.lambda().eq(IntervalScoringTable::getRuleId,evaluationScoringRule.getId());
|
|
|
+ }
|
|
|
+ List<IntervalScoringTable> intervalScoringTables = intervalScoringTableMapper.selectList(qw);
|
|
|
+ for (Map.Entry<String, Double> entry : doubleMap.entrySet()){
|
|
|
+ intervalScoringTables.stream().forEach(r ->{
|
|
|
+ r.setRange(r.getRange().replaceAll(entry.getKey(), entry.getValue() + ""));
|
|
|
+ r.setRegularExpression(r.getRegularExpression().replaceAll(entry.getKey(),entry.getValue() + ""));
|
|
|
+ });
|
|
|
+ }
|
|
|
+ //针对只有一种区间评分
|
|
|
+ if (intervalScoringTables.size() == 1){
|
|
|
+ String regularExpression = intervalScoringTables.get(0).getRegularExpression();
|
|
|
+ //公式计算得分
|
|
|
+ score = MathCalculatorUtil.calculator(regularExpression);
|
|
|
+ }else {
|
|
|
+ //针对多区间评分
|
|
|
+ for (IntervalScoringTable intervalScoringTable : intervalScoringTables){
|
|
|
+ String range = intervalScoringTable.getRange();
|
|
|
+ if (handle(range)){
|
|
|
+ score = MathCalculatorUtil.calculator(intervalScoringTable.getRegularExpression());
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return score;
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ /*
|
|
|
+ * 1.将<,>,<=,>= 使用 # 替换
|
|
|
+ * 2.对字符串进行分割
|
|
|
+ * 3.如果字符数组长度为2,默认左边为公式,右边为条件
|
|
|
+ * 4.如果字符数组长度为3.默认中间为公式,两边为条件
|
|
|
+ * */
|
|
|
+ public Boolean handle(String range) throws ScriptException {
|
|
|
+
|
|
|
+ Boolean b = false;
|
|
|
+ String s = range.replaceAll("[\\<\\<=\\>=\\>]", "#");
|
|
|
+ String[] split = s.split("#");
|
|
|
+
|
|
|
+ //使用javaScript引擎来解释该字符串的表达式
|
|
|
+ ScriptEngineManager manager = new ScriptEngineManager();
|
|
|
+ ScriptEngine engine = manager.getEngineByName("javascript");
|
|
|
+ if (split.length == 2){
|
|
|
+ String calculator = MathCalculatorUtil.calculator(split[0]);
|
|
|
+ String newRange = range.replaceAll(split[0], calculator);
|
|
|
+ b = (boolean) engine.eval(newRange);
|
|
|
+ }else if (split.length == 3){
|
|
|
+ String calculator = MathCalculatorUtil.calculator(split[1]);
|
|
|
+ String newRange = range.replaceAll(split[1], calculator);
|
|
|
+ b = (boolean) engine.eval(newRange);
|
|
|
+ }
|
|
|
+
|
|
|
+ return b;
|
|
|
+ }
|
|
|
+
|
|
|
+ public static void main(String[] args) throws ScriptException {
|
|
|
+ String s = "7<8<6";
|
|
|
+ ScriptEngineManager manager = new ScriptEngineManager();
|
|
|
+ ScriptEngine engine = manager.getEngineByName("javascript");
|
|
|
+ boolean result = (boolean) engine.eval(s);
|
|
|
+ System.out.println(result);
|
|
|
+ System.exit(0);
|
|
|
+ }
|
|
|
+}
|