Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
I
indicators
Overview
Overview
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
zhangkb
indicators
Commits
8c23199a
Commit
8c23199a
authored
Jun 09, 2020
by
zhangkb
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
单位评分计算规则添加单个指标权重计算逻辑
parent
c11e52ea
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
122 additions
and
30 deletions
+122
-30
ScoreRule.java
...obile/indicators/model/entity/objscorerule/ScoreRule.java
+3
-1
ScoreRuleService.java
...mobile/indicators/service/hytobacco/ScoreRuleService.java
+107
-23
CalculateUtils.java
...n/java/com/keymobile/indicators/utils/CalculateUtils.java
+12
-6
No files found.
src/main/java/com/keymobile/indicators/model/entity/objscorerule/ScoreRule.java
View file @
8c23199a
...
...
@@ -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
(){
...
...
src/main/java/com/keymobile/indicators/service/hytobacco/ScoreRuleService.java
View file @
8c23199a
...
...
@@ -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
);
...
...
src/main/java/com/keymobile/indicators/utils/CalculateUtils.java
View file @
8c23199a
...
...
@@ -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
);
}
}
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment