Commit 05a0e356 by zhangkb

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

parent 1b3a72c7
...@@ -49,6 +49,8 @@ public class DriveIndCalculateActor extends AbstractActor{ ...@@ -49,6 +49,8 @@ public class DriveIndCalculateActor extends AbstractActor{
private String driveIndFormula;//考核指标公式 private String driveIndFormula;//考核指标公式
private String averageDriveIndFormula;//需要传递回去算平均值的考核指标公式
private String driveIndDataType;//考核指标数据类型 private String driveIndDataType;//考核指标数据类型
private String compareId ; private String compareId ;
...@@ -97,6 +99,7 @@ public class DriveIndCalculateActor extends AbstractActor{ ...@@ -97,6 +99,7 @@ public class DriveIndCalculateActor extends AbstractActor{
driveIndId); driveIndId);
//获取考核指标的公式 //获取考核指标的公式
driveIndFormula = acsSoreInfoList.get(0).getScoreFormula(); driveIndFormula = acsSoreInfoList.get(0).getScoreFormula();
averageDriveIndFormula = acsSoreInfoList.get(0).getScoreFormula();
Pattern p = Pattern.compile("(\\[[^\\]]*\\])"); Pattern p = Pattern.compile("(\\[[^\\]]*\\])");
Matcher m = p.matcher(driveIndFormula); Matcher m = p.matcher(driveIndFormula);
...@@ -148,7 +151,7 @@ public class DriveIndCalculateActor extends AbstractActor{ ...@@ -148,7 +151,7 @@ public class DriveIndCalculateActor extends AbstractActor{
//保留四位小数 //保留四位小数
if(!driveIndValue.equals("NaN")) { if(!driveIndValue.equals("NaN")) {
driveIndValue = String.format("%.4f", driveIndValue = String.format("%.4f",
new BigDecimal((Double)AviatorEvaluator.execute(driveIndFormula,env))); new BigDecimal(Double.valueOf(driveIndValue)));
} }
//保存进考核指标结果表中 //保存进考核指标结果表中
DriveIndCalResult driveIndCalResult = new DriveIndCalResult(compareId, DriveIndCalResult driveIndCalResult = new DriveIndCalResult(compareId,
...@@ -159,7 +162,7 @@ public class DriveIndCalculateActor extends AbstractActor{ ...@@ -159,7 +162,7 @@ public class DriveIndCalculateActor extends AbstractActor{
DriveIndAverageAndRankMsg driveIndAverageAndRankMsg = DriveIndAverageAndRankMsg driveIndAverageAndRankMsg =
new DriveIndAverageAndRankMsg(driveIndCalResult.getId(), new DriveIndAverageAndRankMsg(driveIndCalResult.getId(),
compareId,driveIndId,compareObj,date,driveIndValue, compareId,driveIndId,compareObj,date,driveIndValue,
unit,indType,markType); unit,indType,markType,averageDriveIndFormula);
driveIndCalculateRegionActor.tell(driveIndAverageAndRankMsg,ActorRef.noSender()); driveIndCalculateRegionActor.tell(driveIndAverageAndRankMsg,ActorRef.noSender());
} catch (Exception e) { } catch (Exception e) {
DriveIndCalResult driveIndCalResult = new DriveIndCalResult(compareId, DriveIndCalResult driveIndCalResult = new DriveIndCalResult(compareId,
...@@ -168,7 +171,7 @@ public class DriveIndCalculateActor extends AbstractActor{ ...@@ -168,7 +171,7 @@ public class DriveIndCalculateActor extends AbstractActor{
DriveIndAverageAndRankMsg driveIndAverageAndRankMsg = DriveIndAverageAndRankMsg driveIndAverageAndRankMsg =
new DriveIndAverageAndRankMsg(driveIndCalResult.getId(), new DriveIndAverageAndRankMsg(driveIndCalResult.getId(),
compareId,driveIndId,compareObj,date,"0(Error)", compareId,driveIndId,compareObj,date,"0(Error)",
unit,indType,markType); unit,indType,markType,averageDriveIndFormula);
driveIndCalculateRegionActor.tell(driveIndAverageAndRankMsg,ActorRef.noSender()); driveIndCalculateRegionActor.tell(driveIndAverageAndRankMsg,ActorRef.noSender());
logger.error("env:"+env+";formula:"+driveIndFormula); logger.error("env:"+env+";formula:"+driveIndFormula);
} }
......
...@@ -12,6 +12,7 @@ import com.keymobile.indicators.akka.message.specific.DriveIndAverageAndRankMsg; ...@@ -12,6 +12,7 @@ import com.keymobile.indicators.akka.message.specific.DriveIndAverageAndRankMsg;
import com.keymobile.indicators.akka.message.specific.DriveIndCalculateRegionMsg; import com.keymobile.indicators.akka.message.specific.DriveIndCalculateRegionMsg;
import com.keymobile.indicators.model.entity.DimValue; import com.keymobile.indicators.model.entity.DimValue;
import com.keymobile.indicators.model.entity.DriveIndCalResult; 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.DriveIndCalResultService;
import com.keymobile.indicators.service.hytobacco.IndScorecardService; import com.keymobile.indicators.service.hytobacco.IndScorecardService;
import com.keymobile.indicators.utils.CalculateUtils; import com.keymobile.indicators.utils.CalculateUtils;
...@@ -27,6 +28,8 @@ public class DriveIndCalculateRegionActor extends AbstractActor{ ...@@ -27,6 +28,8 @@ public class DriveIndCalculateRegionActor extends AbstractActor{
private IndScorecardService indScorecardService = SpringUtil.getBean(IndScorecardService.class); private IndScorecardService indScorecardService = SpringUtil.getBean(IndScorecardService.class);
private IndAcsScoreInfoService indAcsScoreInfoService = SpringUtil.getBean(IndAcsScoreInfoService.class);
private int numberOfConfirm = 0;//定义返回确认消息的子actor private int numberOfConfirm = 0;//定义返回确认消息的子actor
private int compareObjSize = 0;//对标对象个数 private int compareObjSize = 0;//对标对象个数
...@@ -34,6 +37,8 @@ public class DriveIndCalculateRegionActor extends AbstractActor{ ...@@ -34,6 +37,8 @@ public class DriveIndCalculateRegionActor extends AbstractActor{
private List<String> values = new ArrayList<>(); private List<String> values = new ArrayList<>();
private Map<String,String> valueMap = new HashMap<>(); private Map<String,String> valueMap = new HashMap<>();
private List<String> compareObjs = new ArrayList<>();
@Override @Override
public Receive createReceive() { public Receive createReceive() {
...@@ -67,6 +72,8 @@ public class DriveIndCalculateRegionActor extends AbstractActor{ ...@@ -67,6 +72,8 @@ public class DriveIndCalculateRegionActor extends AbstractActor{
String markType = driveIndAverageAndRankMsg.getMarkType();//评分卡id String markType = driveIndAverageAndRankMsg.getMarkType();//评分卡id
valueMap.put(id, value); valueMap.put(id, value);
values.add(value); values.add(value);
compareObjs.add(driveIndAverageAndRankMsg.getCompareObj());
if (++numberOfConfirm >= compareObjSize) {//子actor全部返回 if (++numberOfConfirm >= compareObjSize) {//子actor全部返回
//考核地区只有一个“全省”的情况下 //考核地区只有一个“全省”的情况下
if(!"全省".equals(driveIndAverageAndRankMsg.getCompareObj())) { if(!"全省".equals(driveIndAverageAndRankMsg.getCompareObj())) {
...@@ -80,7 +87,11 @@ public class DriveIndCalculateRegionActor extends AbstractActor{ ...@@ -80,7 +87,11 @@ public class DriveIndCalculateRegionActor extends AbstractActor{
actualAverage = provinceDriveIndCalResult.getValue(); 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); Map<String,Integer> rankValue = CalculateUtils.rankValue(valueMap, indType);
for(Entry<String,Integer> entry : rankValue.entrySet()) { for(Entry<String,Integer> entry : rankValue.entrySet()) {
......
...@@ -17,9 +17,10 @@ public class DriveIndAverageAndRankMsg implements Serializable{ ...@@ -17,9 +17,10 @@ public class DriveIndAverageAndRankMsg implements Serializable{
private String unit; private String unit;
private String indType; private String indType;
private String markType; private String markType;
private String indFormula;
public DriveIndAverageAndRankMsg(String id,String compareId,String driveIndId,String compareObj, 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.id = id;
this.compareId = compareId; this.compareId = compareId;
this.driveIndId = driveIndId; this.driveIndId = driveIndId;
...@@ -29,6 +30,7 @@ public class DriveIndAverageAndRankMsg implements Serializable{ ...@@ -29,6 +30,7 @@ public class DriveIndAverageAndRankMsg implements Serializable{
this.unit = unit; this.unit = unit;
this.indType = indType; this.indType = indType;
this.markType = markType; this.markType = markType;
this.indFormula = indFormula;
} }
public String getCompareId() { public String getCompareId() {
...@@ -102,4 +104,12 @@ public class DriveIndAverageAndRankMsg implements Serializable{ ...@@ -102,4 +104,12 @@ public class DriveIndAverageAndRankMsg implements Serializable{
public void setMarkType(String markType) { public void setMarkType(String markType) {
this.markType = markType; this.markType = markType;
} }
public String getIndFormula() {
return indFormula;
}
public void setIndFormula(String indFormula) {
this.indFormula = indFormula;
}
} }
package com.keymobile.indicators.service.cmbkpi; package com.keymobile.indicators.service.cmbkpi;
import java.math.BigDecimal;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.HashMap; import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.apache.commons.lang.StringUtils; import org.apache.commons.lang.StringUtils;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; 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.IndAcsDef;
import com.keymobile.indicators.model.entity.IndAcsScoreInfo; import com.keymobile.indicators.model.entity.IndAcsScoreInfo;
import com.keymobile.indicators.model.entity.IndAnaDef; import com.keymobile.indicators.model.entity.IndAnaDef;
...@@ -16,6 +21,8 @@ import com.keymobile.indicators.model.entity.IndRelTree; ...@@ -16,6 +21,8 @@ import com.keymobile.indicators.model.entity.IndRelTree;
import com.keymobile.indicators.model.mapper.IndAcsDefMapper; import com.keymobile.indicators.model.mapper.IndAcsDefMapper;
import com.keymobile.indicators.model.mapper.IndAcsScoreInfoMapper; import com.keymobile.indicators.model.mapper.IndAcsScoreInfoMapper;
import com.keymobile.indicators.model.mapper.IndAnaDefMapper; 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; import com.keymobile.indicators.utils.FormulaUtils;
@Service @Service
...@@ -26,6 +33,8 @@ public class IndAcsScoreInfoService { ...@@ -26,6 +33,8 @@ public class IndAcsScoreInfoService {
private IndAnaDefMapper indAnaDefMapper; private IndAnaDefMapper indAnaDefMapper;
@Autowired @Autowired
private IndAcsDefMapper indAcsDefMapper; private IndAcsDefMapper indAcsDefMapper;
@Autowired
private BaseIndDataService baseIndDataService;
public String save(IndAcsScoreInfo indAcsScoreInfo) throws Exception{ public String save(IndAcsScoreInfo indAcsScoreInfo) throws Exception{
// if(StringUtils.isBlank(indAcsScoreInfo.getOrgId())|| // if(StringUtils.isBlank(indAcsScoreInfo.getOrgId())||
...@@ -181,4 +190,39 @@ public class IndAcsScoreInfoService { ...@@ -181,4 +190,39 @@ public class IndAcsScoreInfoService {
} }
return indRelTree; 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 { ...@@ -362,29 +362,30 @@ public class IndicatorsValueService {
XSSFRow xssfRow = excelSheet.getRow(rowNum); XSSFRow xssfRow = excelSheet.getRow(rowNum);
//填全市平均 //填全市平均
if(i==0) { if(i==0) {
int averCellNum = 0; //填平均值
if("0".equals(type)) { int acAverCellNum = cellMap.get("aver");
averCellNum = cellMap.get("aver"); String actualAverage = result.getActualAverage();
}else if("1".equals(type)) {//两烟 if(date==201812) {
averCellNum = cellMap.get("liang"); acAverCellNum+=1;
}else {
averCellNum = cellMap.get("cun");
} }
String average = null; xssfRow.getCell(acAverCellNum).setCellValue(actualAverage);
if("0".equals(type)) { int averageCellNum = 0;
average = result.getActualAverage();//不分组取实际平均值 if("1".equals(type)) {//两烟
if(average!=null) { averageCellNum = cellMap.get("liang");
if("0.0".equals(result.getActualAverage())) { String average = result.getAverage();
average = result.getAverage(); if(date==201812) {
} averageCellNum+=1;
} }
}else { xssfRow.getCell(averageCellNum).setCellValue(average);
average = result.getAverage();
} }
if(date==201812) { if("2".equals(type)){//纯销
averCellNum+=1; 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) { if(cellMap.get(result.getCompareObj())!=null) {
......
...@@ -95,6 +95,27 @@ public class CalculateUtils { ...@@ -95,6 +95,27 @@ public class CalculateUtils {
return result; 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) { public static String averageValue(List<String> values) {
String calValue = "0.0"; String calValue = "0.0";
...@@ -173,7 +194,7 @@ public class CalculateUtils { ...@@ -173,7 +194,7 @@ public class CalculateUtils {
} }
public static void main(String[] args) { 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(); // Map<String, Object> env = Maps.newHashMap();
// env.put("F004", 18471.8080); // env.put("F004", 18471.8080);
...@@ -181,13 +202,14 @@ public class CalculateUtils { ...@@ -181,13 +202,14 @@ public class CalculateUtils {
// // 输出的是6.333333333333333 // // 输出的是6.333333333333333
// System.out.println(AviatorEvaluator.execute("F004/F002*100", env)); // System.out.println(AviatorEvaluator.execute("F004/F002*100", env));
// List<String> values = new ArrayList<>(); List<String> values = new ArrayList<>();
// values.add("0"); values.add("0");
// values.add("18"); values.add("18");
// values.add("18"); values.add("18");
// CalculateUtils cal = new CalculateUtils(); values.add("17.2837");
// String average = cal.averageValue(values); CalculateUtils cal = new CalculateUtils();
// System.out.println(average); String average = cal.sumValue(values);
System.out.println(average);
// Map<String,String> map = new HashMap<>(); // Map<String,String> map = new HashMap<>();
// map.put("1", "NaN"); // 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