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
05a0e356
Commit
05a0e356
authored
May 11, 2020
by
zhangkb
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
修改分组计算组内平均值逻辑
parent
1b3a72c7
Hide whitespace changes
Inline
Side-by-side
Showing
7 changed files
with
182 additions
and
32 deletions
+182
-32
DriveIndCalculateActor.java
...ymobile/indicators/akka/actor/DriveIndCalculateActor.java
+6
-3
DriveIndCalculateRegionActor.java
...ors/akka/actor/specific/DriveIndCalculateRegionActor.java
+12
-1
DriveIndAverageAndRankMsg.java
...tors/akka/message/specific/DriveIndAverageAndRankMsg.java
+11
-1
IndAcsScoreInfoService.java
...ile/indicators/service/cmbkpi/IndAcsScoreInfoService.java
+44
-0
BaseIndDataService.java
...bile/indicators/service/hytobacco/BaseIndDataService.java
+59
-0
IndicatorsValueService.java
.../indicators/service/hytobacco/IndicatorsValueService.java
+20
-19
CalculateUtils.java
...n/java/com/keymobile/indicators/utils/CalculateUtils.java
+30
-8
No files found.
src/main/java/com/keymobile/indicators/akka/actor/DriveIndCalculateActor.java
View file @
05a0e356
...
...
@@ -49,6 +49,8 @@ public class DriveIndCalculateActor extends AbstractActor{
private
String
driveIndFormula
;
//考核指标公式
private
String
averageDriveIndFormula
;
//需要传递回去算平均值的考核指标公式
private
String
driveIndDataType
;
//考核指标数据类型
private
String
compareId
;
...
...
@@ -97,6 +99,7 @@ public class DriveIndCalculateActor extends AbstractActor{
driveIndId
);
//获取考核指标的公式
driveIndFormula
=
acsSoreInfoList
.
get
(
0
).
getScoreFormula
();
averageDriveIndFormula
=
acsSoreInfoList
.
get
(
0
).
getScoreFormula
();
Pattern
p
=
Pattern
.
compile
(
"(\\[[^\\]]*\\])"
);
Matcher
m
=
p
.
matcher
(
driveIndFormula
);
...
...
@@ -148,7 +151,7 @@ public class DriveIndCalculateActor extends AbstractActor{
//保留四位小数
if
(!
driveIndValue
.
equals
(
"NaN"
))
{
driveIndValue
=
String
.
format
(
"%.4f"
,
new
BigDecimal
(
(
Double
)
AviatorEvaluator
.
execute
(
driveIndFormula
,
env
)));
new
BigDecimal
(
Double
.
valueOf
(
driveIndValue
)));
}
//保存进考核指标结果表中
DriveIndCalResult
driveIndCalResult
=
new
DriveIndCalResult
(
compareId
,
...
...
@@ -159,7 +162,7 @@ public class DriveIndCalculateActor extends AbstractActor{
DriveIndAverageAndRankMsg
driveIndAverageAndRankMsg
=
new
DriveIndAverageAndRankMsg
(
driveIndCalResult
.
getId
(),
compareId
,
driveIndId
,
compareObj
,
date
,
driveIndValue
,
unit
,
indType
,
markType
);
unit
,
indType
,
markType
,
averageDriveIndFormula
);
driveIndCalculateRegionActor
.
tell
(
driveIndAverageAndRankMsg
,
ActorRef
.
noSender
());
}
catch
(
Exception
e
)
{
DriveIndCalResult
driveIndCalResult
=
new
DriveIndCalResult
(
compareId
,
...
...
@@ -168,7 +171,7 @@ public class DriveIndCalculateActor extends AbstractActor{
DriveIndAverageAndRankMsg
driveIndAverageAndRankMsg
=
new
DriveIndAverageAndRankMsg
(
driveIndCalResult
.
getId
(),
compareId
,
driveIndId
,
compareObj
,
date
,
"0(Error)"
,
unit
,
indType
,
markType
);
unit
,
indType
,
markType
,
averageDriveIndFormula
);
driveIndCalculateRegionActor
.
tell
(
driveIndAverageAndRankMsg
,
ActorRef
.
noSender
());
logger
.
error
(
"env:"
+
env
+
";formula:"
+
driveIndFormula
);
}
...
...
src/main/java/com/keymobile/indicators/akka/actor/specific/DriveIndCalculateRegionActor.java
View file @
05a0e356
...
...
@@ -12,6 +12,7 @@ import com.keymobile.indicators.akka.message.specific.DriveIndAverageAndRankMsg;
import
com.keymobile.indicators.akka.message.specific.DriveIndCalculateRegionMsg
;
import
com.keymobile.indicators.model.entity.DimValue
;
import
com.keymobile.indicators.model.entity.DriveIndCalResult
;
import
com.keymobile.indicators.service.cmbkpi.IndAcsScoreInfoService
;
import
com.keymobile.indicators.service.hytobacco.DriveIndCalResultService
;
import
com.keymobile.indicators.service.hytobacco.IndScorecardService
;
import
com.keymobile.indicators.utils.CalculateUtils
;
...
...
@@ -27,6 +28,8 @@ public class DriveIndCalculateRegionActor extends AbstractActor{
private
IndScorecardService
indScorecardService
=
SpringUtil
.
getBean
(
IndScorecardService
.
class
);
private
IndAcsScoreInfoService
indAcsScoreInfoService
=
SpringUtil
.
getBean
(
IndAcsScoreInfoService
.
class
);
private
int
numberOfConfirm
=
0
;
//定义返回确认消息的子actor
private
int
compareObjSize
=
0
;
//对标对象个数
...
...
@@ -34,6 +37,8 @@ public class DriveIndCalculateRegionActor extends AbstractActor{
private
List
<
String
>
values
=
new
ArrayList
<>();
private
Map
<
String
,
String
>
valueMap
=
new
HashMap
<>();
private
List
<
String
>
compareObjs
=
new
ArrayList
<>();
@Override
public
Receive
createReceive
()
{
...
...
@@ -67,6 +72,8 @@ public class DriveIndCalculateRegionActor extends AbstractActor{
String
markType
=
driveIndAverageAndRankMsg
.
getMarkType
();
//评分卡id
valueMap
.
put
(
id
,
value
);
values
.
add
(
value
);
compareObjs
.
add
(
driveIndAverageAndRankMsg
.
getCompareObj
());
if
(++
numberOfConfirm
>=
compareObjSize
)
{
//子actor全部返回
//考核地区只有一个“全省”的情况下
if
(!
"全省"
.
equals
(
driveIndAverageAndRankMsg
.
getCompareObj
()))
{
...
...
@@ -80,7 +87,11 @@ public class DriveIndCalculateRegionActor extends AbstractActor{
actualAverage
=
provinceDriveIndCalResult
.
getValue
();
}
//算组内平均数
String
average
=
CalculateUtils
.
averageValue
(
values
);
//String average = CalculateUtils.averageValue(values);
String
average
=
indAcsScoreInfoService
.
calGroupAverage
(
driveIndAverageAndRankMsg
.
getIndFormula
(),
compareObjs
,
driveIndAverageAndRankMsg
.
getDate
());
//算组内排名
Map
<
String
,
Integer
>
rankValue
=
CalculateUtils
.
rankValue
(
valueMap
,
indType
);
for
(
Entry
<
String
,
Integer
>
entry
:
rankValue
.
entrySet
())
{
...
...
src/main/java/com/keymobile/indicators/akka/message/specific/DriveIndAverageAndRankMsg.java
View file @
05a0e356
...
...
@@ -17,9 +17,10 @@ public class DriveIndAverageAndRankMsg implements Serializable{
private
String
unit
;
private
String
indType
;
private
String
markType
;
private
String
indFormula
;
public
DriveIndAverageAndRankMsg
(
String
id
,
String
compareId
,
String
driveIndId
,
String
compareObj
,
int
date
,
String
driveIndValue
,
String
unit
,
String
indType
,
String
markType
)
{
int
date
,
String
driveIndValue
,
String
unit
,
String
indType
,
String
markType
,
String
indFormula
)
{
this
.
id
=
id
;
this
.
compareId
=
compareId
;
this
.
driveIndId
=
driveIndId
;
...
...
@@ -29,6 +30,7 @@ public class DriveIndAverageAndRankMsg implements Serializable{
this
.
unit
=
unit
;
this
.
indType
=
indType
;
this
.
markType
=
markType
;
this
.
indFormula
=
indFormula
;
}
public
String
getCompareId
()
{
...
...
@@ -102,4 +104,12 @@ public class DriveIndAverageAndRankMsg implements Serializable{
public
void
setMarkType
(
String
markType
)
{
this
.
markType
=
markType
;
}
public
String
getIndFormula
()
{
return
indFormula
;
}
public
void
setIndFormula
(
String
indFormula
)
{
this
.
indFormula
=
indFormula
;
}
}
src/main/java/com/keymobile/indicators/service/cmbkpi/IndAcsScoreInfoService.java
View file @
05a0e356
package
com
.
keymobile
.
indicators
.
service
.
cmbkpi
;
import
java.math.BigDecimal
;
import
java.util.ArrayList
;
import
java.util.HashMap
;
import
java.util.List
;
import
java.util.Map
;
import
java.util.regex.Matcher
;
import
java.util.regex.Pattern
;
import
org.apache.commons.lang.StringUtils
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.stereotype.Service
;
import
com.google.common.collect.Maps
;
import
com.googlecode.aviator.AviatorEvaluator
;
import
com.keymobile.indicators.model.entity.IndAcsDef
;
import
com.keymobile.indicators.model.entity.IndAcsScoreInfo
;
import
com.keymobile.indicators.model.entity.IndAnaDef
;
...
...
@@ -16,6 +21,8 @@ import com.keymobile.indicators.model.entity.IndRelTree;
import
com.keymobile.indicators.model.mapper.IndAcsDefMapper
;
import
com.keymobile.indicators.model.mapper.IndAcsScoreInfoMapper
;
import
com.keymobile.indicators.model.mapper.IndAnaDefMapper
;
import
com.keymobile.indicators.service.hytobacco.BaseIndDataService
;
import
com.keymobile.indicators.utils.CalculateUtils
;
import
com.keymobile.indicators.utils.FormulaUtils
;
@Service
...
...
@@ -26,6 +33,8 @@ public class IndAcsScoreInfoService {
private
IndAnaDefMapper
indAnaDefMapper
;
@Autowired
private
IndAcsDefMapper
indAcsDefMapper
;
@Autowired
private
BaseIndDataService
baseIndDataService
;
public
String
save
(
IndAcsScoreInfo
indAcsScoreInfo
)
throws
Exception
{
// if(StringUtils.isBlank(indAcsScoreInfo.getOrgId())||
...
...
@@ -181,4 +190,39 @@ public class IndAcsScoreInfoService {
}
return
indRelTree
;
}
public
String
calGroupAverage
(
String
driveIndFormula
,
List
<
String
>
compareObjs
,
int
date
)
throws
Exception
{
String
result
=
"0.0"
;
List
<
String
>
indIdList
=
new
ArrayList
<>();
if
(
StringUtils
.
isNotBlank
(
driveIndFormula
))
{
Pattern
p
=
Pattern
.
compile
(
"(\\[[^\\]]*\\])"
);
Matcher
m
=
p
.
matcher
(
driveIndFormula
);
while
(
m
.
find
()){
indIdList
.
add
(
m
.
group
().
substring
(
1
,
m
.
group
().
length
()-
1
));
}
//获取公式中的基础指标id
int
indIdSize
=
indIdList
.
size
();
if
(
indIdSize
!=
0
)
{
if
(
indIdSize
==
1
)
{
List
<
String
>
indDateList
=
baseIndDataService
.
getIndData
(
indIdList
.
get
(
0
),
date
,
compareObjs
);
result
=
CalculateUtils
.
averageValue
(
indDateList
);
}
else
{
Map
<
String
,
Object
>
env
=
Maps
.
newHashMap
();
for
(
String
indId
:
indIdList
)
{
List
<
String
>
indDateList
=
baseIndDataService
.
getIndData
(
indId
,
date
,
compareObjs
);
String
sumValue
=
CalculateUtils
.
sumValue
(
indDateList
);
env
.
put
(
indId
,
Double
.
valueOf
(
sumValue
));
driveIndFormula
=
driveIndFormula
.
replace
(
"["
+
indId
+
"]"
,
indId
);
}
result
=
AviatorEvaluator
.
execute
(
driveIndFormula
,
env
).
toString
();
//保留四位小数
if
(!
result
.
equals
(
"NaN"
))
{
result
=
String
.
format
(
"%.4f"
,
new
BigDecimal
(
Double
.
valueOf
(
result
)));
}
}
}
}
return
result
;
}
}
src/main/java/com/keymobile/indicators/service/hytobacco/BaseIndDataService.java
0 → 100644
View file @
05a0e356
package
com
.
keymobile
.
indicators
.
service
.
hytobacco
;
import
java.util.ArrayList
;
import
java.util.List
;
import
org.apache.commons.lang.StringUtils
;
import
org.slf4j.Logger
;
import
org.slf4j.LoggerFactory
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.beans.factory.annotation.Value
;
import
org.springframework.stereotype.Service
;
import
com.keymobile.indicators.conf.MongoDBConfig
;
import
com.mongodb.BasicDBObject
;
import
com.mongodb.DB
;
import
com.mongodb.DBCollection
;
import
com.mongodb.DBCursor
;
import
com.mongodb.DBObject
;
import
com.mongodb.MongoClient
;
@Service
public
class
BaseIndDataService
{
private
Logger
logger
=
LoggerFactory
.
getLogger
(
BaseIndDataService
.
class
);
@Autowired
private
MongoDBConfig
mongoDbConfig
;
@Value
(
"${mongodb.database}"
)
private
String
database
;
public
List
<
String
>
getIndData
(
String
indId
,
int
date
,
List
<
String
>
compareObjs
){
List
<
String
>
result
=
new
ArrayList
<>();
MongoClient
client
=
mongoDbConfig
.
mongoClient
();
/* 新建数据库实例,有则使用已有的数据库,没有则准别新建 */
DB
dataBase
=
client
.
getDB
(
database
);
/* 新建集合命名为user_info,如果该集合存在,则使用。否则新建 */
DBCollection
collection
=
dataBase
.
getCollection
(
"hy_indi_data"
);
DBObject
query
=
new
BasicDBObject
();
query
.
put
(
"indId"
,
indId
);
query
.
put
(
"dim2"
,
date
);
query
.
put
(
"dim1"
,
new
BasicDBObject
(
"$in"
,
compareObjs
));
try
(
DBCursor
cursor
=
collection
.
find
(
query
))
{
while
(
cursor
.
hasNext
())
{
DBObject
dbo
=
cursor
.
next
();
if
(
dbo
.
get
(
"value"
)==
null
||
""
.
equals
(
dbo
.
get
(
"value"
)))
{
result
.
add
(
"0.0"
);
}
else
{
result
.
add
(
dbo
.
get
(
"value"
).
toString
());
}
}
}
client
.
close
();
return
result
;
}
}
src/main/java/com/keymobile/indicators/service/hytobacco/IndicatorsValueService.java
View file @
05a0e356
...
...
@@ -362,29 +362,30 @@ public class IndicatorsValueService {
XSSFRow
xssfRow
=
excelSheet
.
getRow
(
rowNum
);
//填全市平均
if
(
i
==
0
)
{
int
averCellNum
=
0
;
if
(
"0"
.
equals
(
type
))
{
averCellNum
=
cellMap
.
get
(
"aver"
);
}
else
if
(
"1"
.
equals
(
type
))
{
//两烟
averCellNum
=
cellMap
.
get
(
"liang"
);
}
else
{
averCellNum
=
cellMap
.
get
(
"cun"
);
//填平均值
int
acAverCellNum
=
cellMap
.
get
(
"aver"
);
String
actualAverage
=
result
.
getActualAverage
();
if
(
date
==
201812
)
{
acAverCellNum
+=
1
;
}
String
average
=
null
;
i
f
(
"0"
.
equals
(
type
))
{
average
=
result
.
getActualAverage
();
//不分组取实际平均值
if
(
average
!=
null
)
{
if
(
"0.0"
.
equals
(
result
.
getActualAverage
()))
{
average
=
result
.
getAverage
();
}
xssfRow
.
getCell
(
acAverCellNum
).
setCellValue
(
actualAverage
)
;
i
nt
averageCellNum
=
0
;
if
(
"1"
.
equals
(
type
))
{
//两烟
averageCellNum
=
cellMap
.
get
(
"liang"
);
String
average
=
result
.
getAverage
();
if
(
date
==
201812
)
{
averageCellNum
+=
1
;
}
}
else
{
average
=
result
.
getAverage
();
xssfRow
.
getCell
(
averageCellNum
).
setCellValue
(
average
);
}
if
(
date
==
201812
)
{
averCellNum
+=
1
;
if
(
"2"
.
equals
(
type
)){
//纯销
averageCellNum
=
cellMap
.
get
(
"cun"
);
String
average
=
result
.
getAverage
();
if
(
date
==
201812
)
{
averageCellNum
+=
1
;
}
xssfRow
.
getCell
(
averageCellNum
).
setCellValue
(
average
);
}
xssfRow
.
getCell
(
averCellNum
).
setCellValue
(
average
);
}
//填内容
if
(
cellMap
.
get
(
result
.
getCompareObj
())!=
null
)
{
...
...
src/main/java/com/keymobile/indicators/utils/CalculateUtils.java
View file @
05a0e356
...
...
@@ -95,6 +95,27 @@ public class CalculateUtils {
return
result
;
}
//计算总数
public
static
String
sumValue
(
List
<
String
>
values
)
{
String
calValue
=
"0.0"
;
StringBuilder
formula
=
new
StringBuilder
();
if
(!
values
.
isEmpty
())
{
for
(
int
i
=
0
;
i
<
values
.
size
();
i
++)
{
if
(
i
==
values
.
size
()-
1
)
{
//最后一个不加+号
formula
.
append
(
"("
).
append
(
values
.
get
(
i
)).
append
(
")"
);
}
else
{
formula
.
append
(
"("
).
append
(
values
.
get
(
i
)).
append
(
")"
).
append
(
"+"
);
}
}
if
(
formula
.
toString
().
endsWith
(
"+"
))
{
formula
.
deleteCharAt
(
formula
.
length
()-
1
);
}
calValue
=
String
.
format
(
"%.4f"
,
new
BigDecimal
(((
Number
)
AviatorEvaluator
.
execute
(
formula
.
toString
())).
doubleValue
()));
}
return
calValue
;
}
//计算平均值
public
static
String
averageValue
(
List
<
String
>
values
)
{
String
calValue
=
"0.0"
;
...
...
@@ -173,7 +194,7 @@ public class CalculateUtils {
}
public
static
void
main
(
String
[]
args
)
{
System
.
out
.
println
(
AviatorEvaluator
.
execute
(
"(35.9756-84.4884)/(35.9756-2556.3310)*10"
));
//
System.out.println(AviatorEvaluator.execute("(35.9756-84.4884)/(35.9756-2556.3310)*10"));
// Map<String, Object> env = Maps.newHashMap();
// env.put("F004", 18471.8080);
...
...
@@ -181,13 +202,14 @@ public class CalculateUtils {
// // 输出的是6.333333333333333
// System.out.println(AviatorEvaluator.execute("F004/F002*100", env));
// List<String> values = new ArrayList<>();
// values.add("0");
// values.add("18");
// values.add("18");
// CalculateUtils cal = new CalculateUtils();
// String average = cal.averageValue(values);
// System.out.println(average);
List
<
String
>
values
=
new
ArrayList
<>();
values
.
add
(
"0"
);
values
.
add
(
"18"
);
values
.
add
(
"18"
);
values
.
add
(
"17.2837"
);
CalculateUtils
cal
=
new
CalculateUtils
();
String
average
=
cal
.
sumValue
(
values
);
System
.
out
.
println
(
average
);
// Map<String,String> map = new HashMap<>();
// map.put("1", "NaN");
...
...
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