Commit 05a0e356 by zhangkb

修改分组计算组内平均值逻辑

parent 1b3a72c7
......@@ -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);
}
......
......@@ -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()) {
......
......@@ -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;
}
}
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;
}
}
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;
}
}
......@@ -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;
if("0".equals(type)) {
average = result.getActualAverage();//不分组取实际平均值
if(average!=null) {
if("0.0".equals(result.getActualAverage())) {
average = result.getAverage();
}
xssfRow.getCell(acAverCellNum).setCellValue(actualAverage);
int 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) {
......
......@@ -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");
......
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