Commit 8c23199a by zhangkb

单位评分计算规则添加单个指标权重计算逻辑

parent c11e52ea
......@@ -24,8 +24,10 @@ public class ScoreRule implements Serializable{
private String id;
private String ruleName;//规则名称
private String scoreType;//得分类型:0 指标值直接参与计算 1 指标得分分数参与计算(综合评分和改善提升分开算) 2指标得分分数参与计算(指标分数=综合+改善)
private String calType;//计算类型:0 计算组内所有考核指标平均数 1 根据目录类别分类算平均分后根据权重计算考核指标
private String calType;//计算类型:0 计算组内所有考核指标平均数 1 根据目录类别分类算平均分后根据权重计算考核指标 2单个指标权重计算
private List<IndTypeWeight> indTypeWeights = new ArrayList<>();//目录类别权重数据
private String calFormula;//当计算类型是2单个指标权重计算的时候,需要给出指标权重计算公式
private String calFormulaDesc;//单个指标权重计算公式描述
private String code;//标识编码
public List<IndTypeWeight> getIndTypeWeights(){
......
......@@ -5,12 +5,16 @@ import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.apache.commons.lang.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.googlecode.aviator.AviatorEvaluator;
import com.keymobile.indicators.model.entity.DriveIndCalResult;
import com.keymobile.indicators.model.entity.indicators.DriveIndDef;
import com.keymobile.indicators.model.entity.objscorerule.IndTypeWeight;
......@@ -31,6 +35,8 @@ public class ScoreRuleService {
@Autowired
private DriveIndDefMapper driveIndDefMapper;
private static final Pattern P = Pattern.compile("(\\[[^\\]]*\\])");
public String save(ScoreRule scoreRule) {
scoreRule = scoreRuleRepo.save(scoreRule);
return scoreRule.getId();
......@@ -67,22 +73,29 @@ public class ScoreRuleService {
List<String> improveValues = new ArrayList<>();
if(!calResults.isEmpty()) {
for(DriveIndCalResult calResult : calResults) {
//得分类型:0 指标值直接参与计算
if("0".equals(scoreRule.getScoreType())) {
values.add(calResult.getValue());
}else if("1".equals(scoreRule.getScoreType())) {//1 指标得分分数参与计算(综合评分和改善提升分开算)
values.add(calResult.getScore());
if(!"No".equals(calResult.getImproveScore())) {
improveValues.add(calResult.getImproveScore());
}
}else {//2指标得分分数参与计算(指标分数=综合+改善)
if(!"No".equals(calResult.getImproveScore())) {
double indScore = Double.valueOf(calResult.getScore());
double improveScore = Double.valueOf(calResult.getImproveScore());
double sum = indScore+improveScore;
values.add(String.valueOf(sum));
}else {
values.add(calResult.getScore());
//根据考核指标id获取考核指标
DriveIndDef driveIndDef = driveIndDefMapper.selectByPrimaryKey(calResult.getIndId());
if(driveIndDef!=null) {
//如果考核指标是参与单位计分的
if("1".equals(driveIndDef.getIsUnitCalScore())) {
//得分类型:0 指标值直接参与计算
if("0".equals(scoreRule.getScoreType())) {
values.add(calResult.getValue());
}else if("1".equals(scoreRule.getScoreType())) {//1 指标得分分数参与计算(综合评分和改善提升分开算)
values.add(calResult.getScore());
if(!"No".equals(calResult.getImproveScore())) {
improveValues.add(calResult.getImproveScore());
}
}else {//2指标得分分数参与计算(指标分数=综合+改善)
if(!"No".equals(calResult.getImproveScore())) {
double indScore = Double.parseDouble(calResult.getScore());
double improveScore = Double.parseDouble(calResult.getImproveScore());
double sum = indScore+improveScore;
values.add(String.valueOf(sum));
}else {
values.add(calResult.getScore());
}
}
}
}
}
......@@ -98,6 +111,75 @@ public class ScoreRuleService {
return result;
}
private Map<String,String> calSingleIndWeight(ScoreRule scoreRule,
String compareObj,int date){
Map<String,String> result = new HashMap<>();
result.put("compareObj", compareObj);
result.put("scoreValue", "0.0");
result.put("improveValue", "0.0");
result.put("date",String.valueOf(date));
String calFormula = scoreRule.getCalFormula();//计算综合评分分数
String improveCalFormula = scoreRule.getCalFormula();//计算改善提升分数
if(StringUtils.isNotBlank(calFormula)) {
//获取公式中的考核指标编码
List<String> indIdList = new ArrayList<>();
Matcher m = P.matcher(calFormula);
while(m.find()){
indIdList.add(m.group().substring(1, m.group().length()-1));
}
for(String indId : indIdList) {
//根据日期,对标对象和考核的指标获取考核指标结果详情
Optional<DriveIndCalResult> calresultOp = driveIndCalResultRepo.
findByIndIdAndDateAndCompareObj(indId, date, compareObj);
if(calresultOp.isPresent()) {
//得分类型:0 指标值直接参与计算
if("0".equals(scoreRule.getScoreType())) {
calFormula = calFormula.replace("["+indId+"]", calresultOp.get().getValue());
}else if("1".equals(scoreRule.getScoreType())) {//1 指标得分分数参与计算(综合评分和改善提升分开算)
calFormula = calFormula.replace("["+indId+"]", calresultOp.get().getValue());
if(!"No".equals(calresultOp.get().getImproveScore())) {
improveCalFormula = improveCalFormula.replace("["+indId+"]",
calresultOp.get().getImproveScore());
}else {
improveCalFormula = improveCalFormula.replace("["+indId+"]","0.0");
}
}else {//2指标得分分数参与计算(指标分数=综合+改善)
String score = "0.0";
if(!"No".equals(calresultOp.get().getImproveScore())) {
double indScore = Double.parseDouble(calresultOp.get().getScore());
double improveScore = Double.parseDouble(calresultOp.get().getImproveScore());
double sum = indScore+improveScore;
score = String.valueOf(sum);
}else {
score = calresultOp.get().getScore();
}
calFormula = calFormula.replace("["+indId+"]", score);
}
}else {
//得分类型:0 指标值直接参与计算
if("0".equals(scoreRule.getScoreType())) {
calFormula = calFormula.replace("["+indId+"]", "0.0");
}else if("1".equals(scoreRule.getScoreType())) {//1 指标得分分数参与计算(综合评分和改善提升分开算)
calFormula = calFormula.replace("["+indId+"]", "0.0");
improveCalFormula = improveCalFormula.replace("["+indId+"]", "0.0");
}else {//2指标得分分数参与计算(指标分数=综合+改善)
calFormula = calFormula.replace("["+indId+"]", "0.0");
}
}
}
//得分类型:0 指标值直接参与计算
if("0".equals(scoreRule.getScoreType()) ||
"2".equals(scoreRule.getScoreType())) {
result.put("scoreValue", AviatorEvaluator.execute(calFormula).toString());
result.put("improveValue","0.0");
}else if("1".equals(scoreRule.getScoreType())) {//1 指标得分分数参与计算(综合评分和改善提升分开算)
result.put("scoreValue", AviatorEvaluator.execute(calFormula).toString());
result.put("improveValue",AviatorEvaluator.execute(improveCalFormula).toString());
}
}
return result;
}
//按照指标类别进行分类分别计算平均分后再跟类别权重相乘后相加得到最终分数
private Map<String,String> calIndCatalogTypeAverage(ScoreRule scoreRule,
String compareObj,int date){
......@@ -115,8 +197,8 @@ public class ScoreRuleService {
if(!scoreRule.getIndTypeWeights().isEmpty()) {
for(IndTypeWeight indTypeWeight : scoreRule.getIndTypeWeights()) {
Map<String,Double> calScores = this.calIndTypeScore(scoreRule, indTypeWeight, calResults);
scoreValue += (calScores.get("score")*Double.valueOf(indTypeWeight.getWeight()));
improveValue += (calScores.get("improve")*Double.valueOf(indTypeWeight.getWeight()));
scoreValue += (calScores.get("score")*Double.parseDouble(indTypeWeight.getWeight()));
improveValue += (calScores.get("improve")*Double.parseDouble(indTypeWeight.getWeight()));
}
}
result.put("scoreValue", String.valueOf(scoreValue));
......@@ -150,8 +232,8 @@ public class ScoreRuleService {
}
}else {//2指标得分分数参与计算(指标分数=综合+改善)
if(!"No".equals(calResult.getImproveScore())) {
double indScore = Double.valueOf(calResult.getScore());
double improveScore = Double.valueOf(calResult.getImproveScore());
double indScore = Double.parseDouble(calResult.getScore());
double improveScore = Double.parseDouble(calResult.getImproveScore());
double sum = indScore+improveScore;
values.add(String.valueOf(sum));
}else {
......@@ -168,8 +250,8 @@ public class ScoreRuleService {
if(!improveValues.isEmpty()) {
averageImproveValue = CalculateUtils.averageValue(improveValues,0);
}
result.put("score", Double.valueOf(averageValue));
result.put("improve", Double.valueOf(averageImproveValue));
result.put("score", Double.parseDouble(averageValue));
result.put("improve", Double.parseDouble(averageImproveValue));
return result;
}
......@@ -189,8 +271,10 @@ public class ScoreRuleService {
//计算类型:0 计算组内所有考核指标平均数
if("0".equals(scoreRule.getCalType())) {
resultMap = this.calGroupIndAverage(scoreRule, indIds, compareObj, date);
}else {//1 根据目录类别分类算平均分后根据权重计算考核指标
}else if("1".equals(scoreRule.getCalType())) {//1 根据目录类别分类算平均分后根据权重计算考核指标
resultMap = this.calIndCatalogTypeAverage(scoreRule, compareObj, date);
}else {//2单个指标权重计算
resultMap = this.calSingleIndWeight(scoreRule, compareObj, date);
}
resultMap.put("reportId", reportId);
resultMap.put("compareId", compareId);
......
......@@ -216,15 +216,21 @@ public class CalculateUtils {
public static void main(String[] args) {
Map<String,String> map = new HashMap<>();
map.put("1001", "1");
map.put("1002", "2");
map.put("1003", "3");
map.put("1002", "3");
map.put("1003", "2");
map.put("1004", "4");
map.put("1005", "4");
map.put("1006", "5");
map.put("1007", "6");
map.put("1008", "3");
map.put("1005", "8");
map.put("1006", "6");
map.put("1007", "7");
map.put("1008", "5");
CalculateUtils cal = new CalculateUtils();
Map<String,Integer> result = cal.rankValue(map, "1");
System.out.println(result);
String formula = "([1001]+[1002])/2";
formula = formula.replace("[1001]", "3");
formula = formula.replace("[1002]", "5");
String result1 = AviatorEvaluator.execute(formula).toString();
System.out.println(result1);
}
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment