Commit 798be07b by zhangkb

优化对标单元计算算法

parent c74bebd2
package com.keymobile.indicators.akka.actor.indicators;
import java.util.Arrays;
import java.util.List;
import org.apache.commons.lang.StringUtils;
import com.keymobile.indicators.akka.message.indicators.CompareUnitCalMsg;
import com.keymobile.indicators.akka.message.indicators.DriveIndIdCalMsg;
import com.keymobile.indicators.akka.message.indicators.FirstExeConfirmMsg;
import com.keymobile.indicators.model.entity.indicators.CompareUnitDef;
import akka.actor.AbstractActor;
import akka.actor.ActorRef;
import akka.actor.Props;
public class CompareUnitCalActor extends AbstractActor{
private int numberOfConfirm = 0;//定义返回确认消息的子actor
private int indIdSize = 0;//对标指标个数
private final ActorRef startCompareUnitCalActor;//定义父actor
static public Props props(ActorRef startCompareUnitCalActor) {
return Props.create(CompareUnitCalActor.class,()->new CompareUnitCalActor(startCompareUnitCalActor));
}
public CompareUnitCalActor(ActorRef startCompareUnitCalActor) {
this.startCompareUnitCalActor = startCompareUnitCalActor;
}
@Override
public Receive createReceive() {
return receiveBuilder()
.match(CompareUnitCalMsg.class,compareUnitCalMsg -> {
CompareUnitDef compareUnitDef = compareUnitCalMsg.getCompareUnitDef();
//获取对标对象
String compareObjsString = compareUnitDef.getCompareObjs();
//获取对标指标
String indIdsString = compareUnitDef.getIndIds();
if(StringUtils.isNotBlank(indIdsString) &&
StringUtils.isNotBlank(compareObjsString)) {
//获取考核指标id list
List<String> indIdsList = Arrays.asList(indIdsString.split(","));
//获取考核对象list
List<String> compareObjsList = Arrays.asList(compareObjsString.split(","));
indIdSize = indIdsList.size();
for(String indId : indIdsList) {
DriveIndIdCalMsg driveIndIdCalMsg = new DriveIndIdCalMsg(
compareUnitDef.getCompareId(),indId,compareObjsList,compareUnitDef.getDate(),
compareUnitDef.getFirstExe(),compareUnitDef.getAverageObj());
//start akka
ActorRef driveIndIdCalActor = this.getContext()
.actorOf(Props.create(DriveIndIdCalActor.class,
()->new DriveIndIdCalActor(getSelf())));
driveIndIdCalActor.tell(driveIndIdCalMsg, getSelf());
}
}
})
.match(FirstExeConfirmMsg.class, firstExeConfirmMsg -> {
if (++numberOfConfirm >= indIdSize) {//子actor全部返回
//发送确认信息给父actor
FirstExeConfirmMsg confirmMsg = new FirstExeConfirmMsg(1,"");
startCompareUnitCalActor.tell(confirmMsg, ActorRef.noSender());
}
})
.build();
}
}
package com.keymobile.indicators.akka.actor.indicators;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import org.apache.commons.lang.StringUtils;
import com.keymobile.indicators.akka.message.indicators.CalIndAverageAndRankMsg;
import com.keymobile.indicators.akka.message.indicators.DriveIndIdCalMsg;
import com.keymobile.indicators.akka.message.indicators.DriveIndIdObjCalMsg;
import com.keymobile.indicators.akka.message.indicators.FirstExeConfirmMsg;
import com.keymobile.indicators.model.entity.DimValue;
import com.keymobile.indicators.model.entity.indicators.DriveIndCalResultDef;
import com.keymobile.indicators.service.hytobacco.DriveIndCalResultService;
import com.keymobile.indicators.service.hytobacco.DriveIndDefService;
import com.keymobile.indicators.service.hytobacco.IndScorecardService;
import com.keymobile.indicators.utils.CalculateUtils;
import com.keymobile.indicators.utils.SpringUtil;
import akka.actor.AbstractActor;
import akka.actor.ActorRef;
import akka.actor.Props;
public class DriveIndIdCalActor extends AbstractActor{
private DriveIndCalResultService driveIndCalResultService = SpringUtil.getBean(DriveIndCalResultService.class);
private IndScorecardService indScorecardService = SpringUtil.getBean(IndScorecardService.class);
private DriveIndDefService driveIndDefService = SpringUtil.getBean(DriveIndDefService.class);
private int numberOfConfirm = 0;//定义返回确认消息的子actor
private int compareObjSize = 0;//对标对象个数
private Map<String,String> valueMap = new HashMap<>();
private List<String> compareObjs = new ArrayList<>();
private String firstExe;//是否先执行 0:否 1:是
private String averageObj;//平均分参考对象
private final ActorRef compareUnitCalActor;//定义父actor
static public Props props(ActorRef compareUnitCalActor) {
return Props.create(DriveIndIdCalActor.class,()->new DriveIndIdCalActor(compareUnitCalActor));
}
public DriveIndIdCalActor(ActorRef compareUnitCalActor) {
this.compareUnitCalActor = compareUnitCalActor;
}
@Override
public Receive createReceive() {
return receiveBuilder()
.match(DriveIndIdCalMsg.class,driveIndIdCalMsg -> {
String compareId = driveIndIdCalMsg.getCompareId();
String indId = driveIndIdCalMsg.getIndId();
List<String> compareObjs = driveIndIdCalMsg.getCompareObj();
Integer date = driveIndIdCalMsg.getDate();
firstExe = driveIndIdCalMsg.getFirstExe();
averageObj = driveIndIdCalMsg.getAverageObj();
compareObjSize = compareObjs.size();
for(String compareObj : compareObjs) {
List<DimValue> dimValueList = new ArrayList<>();
DimValue dimCompareObj = new DimValue("dim1",compareObj,"varchar");
DimValue dimDateObj = new DimValue("dim2",date,"number");
dimValueList.add(dimCompareObj);
dimValueList.add(dimDateObj);
DriveIndIdObjCalMsg driveIndIdObjCalMsg = new DriveIndIdObjCalMsg(compareId,
indId,compareObj,date,dimValueList);
ActorRef driveIndIdObjCalActor = this.getContext()
.actorOf(Props.create(DriveIndIdObjCalActor.class,
()->new DriveIndIdObjCalActor(getSelf())));
driveIndIdObjCalActor.tell(driveIndIdObjCalMsg, getSelf());
}
})
.match(CalIndAverageAndRankMsg.class,calIndAverageAndRankMsg -> {
String value = calIndAverageAndRankMsg.getDriveIndValue();
String id = String.valueOf(calIndAverageAndRankMsg.getId());
String indType = calIndAverageAndRankMsg.getIndType();//指标类型:正向 反向
Integer scoreCardId = calIndAverageAndRankMsg.getScoreCardId();//评分卡id
if(!"-1".equals(id)) {
valueMap.put(id, value);
compareObjs.add(calIndAverageAndRankMsg.getCompareObj());
}
if (++numberOfConfirm >= compareObjSize) {//子actor全部返回
if(!valueMap.isEmpty() && !compareObjs.isEmpty()) {
//如果是先执行且没有平均分参考对象的,则不进行平均分和排名计算
if("1".equals(firstExe) && StringUtils.isBlank(averageObj)) {
//发送确认信息给父actor
FirstExeConfirmMsg firstExeConfirmMsg = new FirstExeConfirmMsg(1,"");
compareUnitCalActor.tell(firstExeConfirmMsg, ActorRef.noSender());
}else {
DriveIndCalResultDef provinceDriveIndCalResult = null;
String actualAverage = "0.0";//实际平均分
if(StringUtils.isNotBlank(averageObj)) {
provinceDriveIndCalResult = driveIndCalResultService.findCompareObjInfo(
calIndAverageAndRankMsg.getDriveIndId(), calIndAverageAndRankMsg.getDate(),
averageObj);
}
if(provinceDriveIndCalResult!=null) {
//获取实际平均分
actualAverage = provinceDriveIndCalResult.getValue();
}
//算组内平均数
String average = driveIndDefService.calGroupAverage(
calIndAverageAndRankMsg.getIndFormula(), compareObjs,
calIndAverageAndRankMsg.getDate());
//算组内排名
Map<String,Integer> rankValue = CalculateUtils.rankValue(valueMap, indType);
//填充平均数和排名到考核结果中
for(Entry<String,Integer> entry : rankValue.entrySet()) {
//根据id获取指标值结果
DriveIndCalResultDef driveIndCalResult = driveIndCalResultService.
findById(Integer.parseInt(entry.getKey()));
if(driveIndCalResult!=null) {
driveIndCalResult.setAverage(average);
driveIndCalResult.setRank(entry.getValue());
driveIndCalResult.setActualAverage(actualAverage);
driveIndCalResultService.saveOrUpdate(driveIndCalResult);
}
}
//根据评分卡算指标分数
for(Entry<String,Integer> entry : rankValue.entrySet()) {
//根据id获取指标值结果
DriveIndCalResultDef driveIndCalResult = driveIndCalResultService.
findById(Integer.parseInt(entry.getKey()));
if(driveIndCalResult!=null) {
//计算分数
Map<String,String> scoreMap = indScorecardService.calculateIndiScore(
driveIndCalResult.getIndId(), driveIndCalResult.getDate(),
driveIndCalResult.getCompareObj(), scoreCardId,
driveIndCalResult.getCompareId(),compareObjs);
driveIndCalResult.setScore(scoreMap.get("score"));
driveIndCalResult.setImproveScore(scoreMap.get("improveScore"));
driveIndCalResultService.saveOrUpdate(driveIndCalResult);
}
}
}
}
}
})
.build();
}
}
package com.keymobile.indicators.akka.actor.indicators;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.concurrent.CopyOnWriteArrayList;
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 com.google.common.collect.Maps;
import com.googlecode.aviator.AviatorEvaluator;
import com.keymobile.indicators.akka.message.indicators.BaseIndValueMsg;
import com.keymobile.indicators.akka.message.indicators.CalIndAverageAndRankMsg;
import com.keymobile.indicators.akka.message.indicators.DriveIndIdObjCalMsg;
import com.keymobile.indicators.akka.message.indicators.GetBaseIndValueMsg;
import com.keymobile.indicators.model.entity.indicators.DriveIndCalResultDef;
import com.keymobile.indicators.model.entity.indicators.DriveIndDef;
import com.keymobile.indicators.service.hytobacco.DriveIndCalResultService;
import com.keymobile.indicators.service.hytobacco.DriveIndDefService;
import com.keymobile.indicators.utils.SpringUtil;
import akka.actor.AbstractActor;
import akka.actor.ActorRef;
import akka.actor.Props;
public class DriveIndIdObjCalActor extends AbstractActor{
private Logger logger = LoggerFactory.getLogger(DriveIndIdObjCalActor.class);
private DriveIndDefService driveIndDefService = SpringUtil.getBean(DriveIndDefService.class);
private DriveIndCalResultService driveIndCalResultService = SpringUtil.getBean(DriveIndCalResultService.class);
private String compareId ;
private String compareObj;
private int date;
private String driveIndId;
private String unit;
private String indType;
private Integer scoreCardId;
private String driveIndFormula;//考核指标公式
private String averageDriveIndFormula;//需要传递回去算平均值的考核指标公式
private int numberOfConfirm = 0;//定义返回确认消息的子actor
private int indIdSize = 0;//考核指标内包含的基础指标id的个数
private Map<String, Object> env = Maps.newHashMap();
//定义线程安全的收集反馈确认消息list
private List<Integer> confirmList = new CopyOnWriteArrayList<>();
private final ActorRef driveIndIdCalActor;//定义父actor
static public Props props(ActorRef driveIndIdCalActor) {
return Props.create(DriveIndIdObjCalActor.class,()->new DriveIndIdObjCalActor(driveIndIdCalActor));
}
public DriveIndIdObjCalActor(ActorRef driveIndIdCalActor) {
this.driveIndIdCalActor = driveIndIdCalActor;
}
@Override
public Receive createReceive() {
return receiveBuilder()
.match(DriveIndIdObjCalMsg.class, driveIndIdObjCalMsg -> {
compareId = driveIndIdObjCalMsg.getCompareId();
compareObj = driveIndIdObjCalMsg.getCompareObj();
date = driveIndIdObjCalMsg.getDate();
driveIndId = driveIndIdObjCalMsg.getIndId();
List<String> indIdList = new ArrayList<>();//定义存储从考核指标公式解析出来的基础指标id
DriveIndDef driveIndDef = driveIndDefService.getById(driveIndId);
unit = driveIndDef.getIndUnit();//指标单位
indType = driveIndDef.getIndType();//指标类型:正向 反向
scoreCardId = driveIndDef.getIndCalScoreRule();//指标评分规则
//获取考核指标的公式
driveIndFormula = driveIndDef.getIndFormat();
averageDriveIndFormula = driveIndDef.getIndFormat();//定义用于返回父actor算平均分用的公式
Pattern p = Pattern.compile("(\\[[^\\]]*\\])");
Matcher m = p.matcher(driveIndFormula);
while(m.find()){
indIdList.add(m.group().substring(1, m.group().length()-1));
}
//获取公式中的基础指标id
indIdSize =indIdList.size();
if(!indIdList.isEmpty()) {
for(String indId : indIdList) {
GetBaseIndValueMsg getBaseIndValueMsg = new GetBaseIndValueMsg(
indId,driveIndIdObjCalMsg.getDimValues());
ActorRef getBaseIndValueActor = this.getContext()
.actorOf(Props.create(GetBaseIndValueActor.class,
()->new GetBaseIndValueActor()));
getBaseIndValueActor.tell(getBaseIndValueMsg, getSelf());
}
}
})
.match(BaseIndValueMsg.class,baseIndValueMsg->{
if(baseIndValueMsg.getIsFinish()==0) {
logger.info(baseIndValueMsg.getConfirmMessage());
}else {
String indValue = baseIndValueMsg.getValue();
if(StringUtils.isBlank(indValue)) {
indValue="0.0";
}
try {
driveIndFormula = driveIndFormula.replace("["+baseIndValueMsg.getIndId()+"]",
baseIndValueMsg.getIndId());
//替换公式中的基础指标id为确定指标值
env.put(baseIndValueMsg.getIndId(), Double.valueOf(indValue));
}catch(Exception e) {
e.printStackTrace();
logger.error(driveIndFormula+";"+env);
}
confirmList.add(baseIndValueMsg.getIsFinish());
if (++numberOfConfirm >= indIdSize) {//子actor全部返回
if(!confirmList.contains(0)) {//取所有基础指标值没错
//进行考核指标值计算
try {
String driveIndValue = AviatorEvaluator.execute(driveIndFormula,env).toString();
//保留四位小数
if(!driveIndValue.equals("NaN") && !driveIndValue.equals("Infinite")) {
driveIndValue = String.format("%.4f",
new BigDecimal(Double.valueOf(driveIndValue)));
}
//判断结果表中是否已存在该结果数据,存在则覆盖
DriveIndCalResultDef driveIndCalResult = driveIndCalResultService.
findCalResultDataIsExist(compareId, compareObj, driveIndId, date);
if(driveIndCalResult==null) {
driveIndCalResult = new DriveIndCalResultDef(compareId,
driveIndId,compareObj,date,driveIndValue,unit,"1","1","admin");
}else {
driveIndCalResult.setUnit(unit);
driveIndCalResult.setValue(driveIndValue);
}
//保存进考核指标结果表中
driveIndCalResultService.saveOrUpdate(driveIndCalResult);
//返回指标值回去算平均值和排名
CalIndAverageAndRankMsg driveIndAverageAndRankMsg =
new CalIndAverageAndRankMsg(driveIndCalResult.getId(),
compareId,driveIndId,compareObj,date,driveIndValue,
unit,indType,scoreCardId,averageDriveIndFormula);
driveIndIdCalActor.tell(driveIndAverageAndRankMsg,ActorRef.noSender());
} catch (Exception e) {
//判断结果表中是否已存在该结果数据,存在则覆盖
DriveIndCalResultDef driveIndCalResult = driveIndCalResultService.
findCalResultDataIsExist(compareId, compareObj, driveIndId, date);
if(driveIndCalResult==null) {
driveIndCalResult = new DriveIndCalResultDef(compareId,
driveIndId,compareObj,date,"NaN",unit,"1","0","admin");
}else {
driveIndCalResult.setValue("NaN");
}
driveIndCalResultService.saveOrUpdate(driveIndCalResult);
CalIndAverageAndRankMsg driveIndAverageAndRankMsg =
new CalIndAverageAndRankMsg(driveIndCalResult.getId(),
compareId,driveIndId,compareObj,date,"NaN",
unit,indType,scoreCardId,averageDriveIndFormula);
driveIndIdCalActor.tell(driveIndAverageAndRankMsg,ActorRef.noSender());
logger.error("env:"+env+";formula:"+driveIndFormula);
}
}else {
//返回考核指标因为考核指标公式中的数据项不存在而导致的计算错误标识
CalIndAverageAndRankMsg driveIndAverageAndRankMsg =
new CalIndAverageAndRankMsg(-1,
compareId,driveIndId,compareObj,date,"NaN",
unit,indType,scoreCardId,averageDriveIndFormula);
driveIndIdCalActor.tell(driveIndAverageAndRankMsg,ActorRef.noSender());
}
}
}
})
.build();
}
}
package com.keymobile.indicators.akka.actor.indicators;
import java.util.Map;
import com.keymobile.indicators.akka.message.indicators.BaseIndValueMsg;
import com.keymobile.indicators.akka.message.indicators.GetBaseIndValueMsg;
import com.keymobile.indicators.service.hytobacco.IndicatorsValueService;
import com.keymobile.indicators.utils.SpringUtil;
import akka.actor.AbstractActor;
public class GetBaseIndValueActor extends AbstractActor{
private IndicatorsValueService indicatorsValueService = SpringUtil.getBean(IndicatorsValueService.class);
@Override
public Receive createReceive() {
return receiveBuilder()
.match(GetBaseIndValueMsg.class,getBaseIndValueMsg -> {
//根据维度值和基础指标id获取指标值
Map<String,Object> indValueMap = indicatorsValueService.getIndicatorsValue(
getBaseIndValueMsg.getIndId(), getBaseIndValueMsg.getDimValue());
if(indValueMap!=null) {
//返回指标值结果
getSender().tell(new BaseIndValueMsg(getBaseIndValueMsg.getIndId()
,indValueMap.get("value").toString(),1,""),getSelf());
}else {
//返回指标值结果
getSender().tell(new BaseIndValueMsg(getBaseIndValueMsg.getIndId(),null,
0,"无法获取指标id:"+
getBaseIndValueMsg.getIndId()+";维度:"+
getBaseIndValueMsg.getDimValue().get(0).getDimvalue()+","+
getBaseIndValueMsg.getDimValue().get(1).getDimvalue()+" 的指标值"),getSelf());
}
})
.build();
}
}
package com.keymobile.indicators.akka.actor.indicators;
import java.util.ArrayList;
import java.util.List;
import com.keymobile.indicators.akka.message.indicators.CompareUnitCalMsg;
import com.keymobile.indicators.akka.message.indicators.FirstExeConfirmMsg;
import com.keymobile.indicators.akka.message.indicators.StartCompareUnitCalMsg;
import com.keymobile.indicators.model.entity.indicators.CompareUnitDef;
import akka.actor.AbstractActor;
import akka.actor.ActorRef;
import akka.actor.Props;
public class StartCompareUnitCalActor extends AbstractActor{
private List<CompareUnitDef> firstExeList = new ArrayList<>();//先执行对标单元list
private List<CompareUnitDef> afterExeList = new ArrayList<>();//后执行对标单元list
private int numberOfConfirm = 0;//定义返回确认消息的子actor
private int firstExeUnitSize = 0;//需要先执行对标单元个数
@Override
public Receive createReceive() {
return receiveBuilder()
.match(StartCompareUnitCalMsg.class,startCompareUnitCalMsg -> {
List<CompareUnitDef> compareUnitDefs = startCompareUnitCalMsg.getCompareInitDefs();
//将对标单元进行分类,需要先执行的先开始进行对标计算
for(CompareUnitDef unitDef : compareUnitDefs) {
if("1".equals(unitDef.getFirstExe())) {
firstExeList.add(unitDef);
}else {
afterExeList.add(unitDef);
}
}
if(!firstExeList.isEmpty()) {
firstExeUnitSize = firstExeList.size();
for(CompareUnitDef unitDef : firstExeList) {
CompareUnitCalMsg compareUnitCalMsg = new CompareUnitCalMsg(unitDef);
ActorRef compareUnitCalActor = this.getContext()
.actorOf(Props.create(CompareUnitCalActor.class,
()->new CompareUnitCalActor(getSelf())));
compareUnitCalActor.tell(compareUnitCalMsg, getSelf());
}
}else {
if(!afterExeList.isEmpty()) {
for(CompareUnitDef unitDef : afterExeList) {
CompareUnitCalMsg compareUnitCalMsg = new CompareUnitCalMsg(unitDef);
ActorRef compareUnitCalActor = this.getContext()
.actorOf(Props.create(CompareUnitCalActor.class,
()->new CompareUnitCalActor(getSelf())));
compareUnitCalActor.tell(compareUnitCalMsg, getSelf());
}
}
}
})
.match(FirstExeConfirmMsg.class, firstExeConfirmMsg -> {
if (++numberOfConfirm >= firstExeUnitSize) {//全部先执行的子actor全部返回
//再执行后执行的actor
if(!afterExeList.isEmpty()) {
for(CompareUnitDef unitDef : afterExeList) {
CompareUnitCalMsg compareUnitCalMsg = new CompareUnitCalMsg(unitDef);
ActorRef compareUnitCalActor = this.getContext()
.actorOf(Props.create(CompareUnitCalActor.class,
()->new CompareUnitCalActor(getSelf())));
compareUnitCalActor.tell(compareUnitCalMsg, getSelf());
}
}
}
})
.build();
}
}
package com.keymobile.indicators.akka.message.indicators;
import java.io.Serializable;
public class BaseIndValueMsg implements Serializable{
/**
*
*/
private static final long serialVersionUID = 1L;
private String indId;//基础指标id
private String value;//指标值
//是否完成标识:1.完成 0.未完成
private Integer isFinish;
//日志报告
private String confirmMessage;
public BaseIndValueMsg(String indId,String value,Integer isFinish,String confirmMessage) {
this.indId=indId;
this.value = value;
this.isFinish = isFinish;
this.confirmMessage = confirmMessage;
}
public String getIndId() {
return indId;
}
public void setIndId(String indId) {
this.indId = indId;
}
public String getValue() {
return value;
}
public void setValue(String value) {
this.value = value;
}
public Integer getIsFinish() {
return isFinish;
}
public void setIsFinish(Integer isFinish) {
this.isFinish = isFinish;
}
public String getConfirmMessage() {
return confirmMessage;
}
public void setConfirmMessage(String confirmMessage) {
this.confirmMessage = confirmMessage;
}
}
package com.keymobile.indicators.akka.message.indicators;
import java.io.Serializable;
public class CalIndAverageAndRankMsg implements Serializable{
/**
*
*/
private static final long serialVersionUID = 1L;
private Integer id;//id
private String compareId;
private String driveIndId;
private String compareObj;
private Integer date;
private String driveIndValue;
private String unit;
private String indType;
private Integer scoreCardId;
private String indFormula;
public CalIndAverageAndRankMsg(Integer id,String compareId,String driveIndId,String compareObj,
Integer date,String driveIndValue,String unit,String indType,Integer scoreCardId,String indFormula) {
this.id = id;
this.compareId = compareId;
this.driveIndId = driveIndId;
this.compareObj = compareObj;
this.date = date;
this.driveIndValue = driveIndValue;
this.unit = unit;
this.indType = indType;
this.scoreCardId = scoreCardId;
this.indFormula = indFormula;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getCompareId() {
return compareId;
}
public void setCompareId(String compareId) {
this.compareId = compareId;
}
public String getDriveIndId() {
return driveIndId;
}
public void setDriveIndId(String driveIndId) {
this.driveIndId = driveIndId;
}
public String getCompareObj() {
return compareObj;
}
public void setCompareObj(String compareObj) {
this.compareObj = compareObj;
}
public Integer getDate() {
return date;
}
public void setDate(Integer date) {
this.date = date;
}
public String getDriveIndValue() {
return driveIndValue;
}
public void setDriveIndValue(String driveIndValue) {
this.driveIndValue = driveIndValue;
}
public String getUnit() {
return unit;
}
public void setUnit(String unit) {
this.unit = unit;
}
public String getIndType() {
return indType;
}
public void setIndType(String indType) {
this.indType = indType;
}
public Integer getScoreCardId() {
return scoreCardId;
}
public void setScoreCardId(Integer scoreCardId) {
this.scoreCardId = scoreCardId;
}
public String getIndFormula() {
return indFormula;
}
public void setIndFormula(String indFormula) {
this.indFormula = indFormula;
}
}
package com.keymobile.indicators.akka.message.indicators;
import java.io.Serializable;
import com.keymobile.indicators.model.entity.indicators.CompareUnitDef;
public class CompareUnitCalMsg implements Serializable{
/**
*
*/
private static final long serialVersionUID = 1L;
private CompareUnitDef compareUnitDef;
public CompareUnitCalMsg(CompareUnitDef compareUnitDef) {
this.compareUnitDef = compareUnitDef;
}
public CompareUnitDef getCompareUnitDef() {
return compareUnitDef;
}
public void setCompareUnitDef(CompareUnitDef compareUnitDef) {
this.compareUnitDef = compareUnitDef;
}
}
package com.keymobile.indicators.akka.message.indicators;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
public class DriveIndIdCalMsg implements Serializable{
/**
*
*/
private static final long serialVersionUID = 1L;
private String compareId;
private String indId;
private List<String> compareObj = new ArrayList<>();
private Integer date;
private String firstExe;
private String averageObj;//平均分参考对象
public DriveIndIdCalMsg(String compareId,String indId,List<String> compareObj,Integer date,
String firstExe,String averageObj) {
this.compareId = compareId;
this.indId = indId;
this.compareObj.addAll(compareObj);
this.date = date;
this.firstExe = firstExe;
this.averageObj = averageObj;
}
public String getCompareId() {
return compareId;
}
public void setCompareId(String compareId) {
this.compareId = compareId;
}
public String getIndId() {
return indId;
}
public void setIndId(String indId) {
this.indId = indId;
}
public List<String> getCompareObj() {
return compareObj;
}
public void setCompareObj(List<String> compareObj) {
this.compareObj.addAll(compareObj);
}
public Integer getDate() {
return date;
}
public void setDate(Integer date) {
this.date = date;
}
public String getAverageObj() {
return averageObj;
}
public void setAverageObj(String averageObj) {
this.averageObj = averageObj;
}
public String getFirstExe() {
return firstExe;
}
public void setFirstExe(String firstExe) {
this.firstExe = firstExe;
}
}
package com.keymobile.indicators.akka.message.indicators;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import com.keymobile.indicators.model.entity.DimValue;
public class DriveIndIdObjCalMsg implements Serializable{
/**
*
*/
private static final long serialVersionUID = 1L;
private String compareId;
private String indId;
private String compareObj;
private Integer date;
private List<DimValue> dimValues = new ArrayList<>();//维度值list
public DriveIndIdObjCalMsg(String compareId,String indId,String compareObj,
Integer date,List<DimValue> dimValues) {
this.compareId = compareId;
this.indId = indId;
this.compareObj = compareObj;
this.date = date;
this.dimValues.addAll(dimValues);
}
public String getCompareId() {
return compareId;
}
public void setCompareId(String compareId) {
this.compareId = compareId;
}
public String getIndId() {
return indId;
}
public void setIndId(String indId) {
this.indId = indId;
}
public String getCompareObj() {
return compareObj;
}
public void setCompareObj(String compareObj) {
this.compareObj = compareObj;
}
public Integer getDate() {
return date;
}
public void setDate(Integer date) {
this.date = date;
}
public List<DimValue> getDimValues() {
return dimValues;
}
public void setDimValues(List<DimValue> dimValues) {
this.dimValues.addAll(dimValues);
}
}
package com.keymobile.indicators.akka.message.indicators;
import java.io.Serializable;
public class FirstExeConfirmMsg implements Serializable{
/**
*
*/
private static final long serialVersionUID = 1L;
//是否完成标识:1.完成 0.未完成
private Integer isFinish;
//日志报告
private String confirmMessage;
public FirstExeConfirmMsg(Integer isFinish,String confirmMessage) {
this.isFinish = isFinish;
this.confirmMessage = confirmMessage;
}
public Integer getIsFinish() {
return isFinish;
}
public void setIsFinish(Integer isFinish) {
this.isFinish = isFinish;
}
public String getConfirmMessage() {
return confirmMessage;
}
public void setConfirmMessage(String confirmMessage) {
this.confirmMessage = confirmMessage;
}
}
package com.keymobile.indicators.akka.message.indicators;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import com.keymobile.indicators.model.entity.DimValue;
public class GetBaseIndValueMsg implements Serializable{
/**
*
*/
private static final long serialVersionUID = 1L;
private String indId;//基础指标id
private List<DimValue> dimValue = new ArrayList<>();//维度值
public GetBaseIndValueMsg(String indId,List<DimValue> dimValue) {
this.indId = indId;
this.dimValue.addAll(dimValue);
}
public List<DimValue> getDimValue() {
return dimValue;
}
public void setDimValue(List<DimValue> dimValue) {
this.dimValue.addAll(dimValue);
}
public String getIndId() {
return indId;
}
public void setIndId(String indId) {
this.indId = indId;
}
}
package com.keymobile.indicators.akka.message.indicators;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import com.keymobile.indicators.model.entity.indicators.CompareUnitDef;
public class StartCompareUnitCalMsg implements Serializable{
/**
*
*/
private static final long serialVersionUID = 1L;
private List<CompareUnitDef> compareInitDefs = new ArrayList<>();
public StartCompareUnitCalMsg(List<CompareUnitDef> compareInitDefs) {
this.compareInitDefs.addAll(compareInitDefs);
}
public List<CompareUnitDef> getCompareInitDefs() {
return compareInitDefs;
}
public void setCompareInitDefs(List<CompareUnitDef> compareInitDefs) {
this.compareInitDefs.addAll(compareInitDefs);
}
}
...@@ -11,6 +11,7 @@ import org.springframework.web.bind.annotation.RequestParam; ...@@ -11,6 +11,7 @@ import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController; import org.springframework.web.bind.annotation.RestController;
import com.keymobile.indicators.model.entity.indicators.BaseIndDef; import com.keymobile.indicators.model.entity.indicators.BaseIndDef;
import com.keymobile.indicators.model.entity.indicators.CompareUnitDef;
import com.keymobile.indicators.model.entity.indicators.DriveIndDef; import com.keymobile.indicators.model.entity.indicators.DriveIndDef;
import com.keymobile.indicators.service.hytobacco.BaseIndDefService; import com.keymobile.indicators.service.hytobacco.BaseIndDefService;
import com.keymobile.indicators.service.hytobacco.DriveIndCalResultService; import com.keymobile.indicators.service.hytobacco.DriveIndCalResultService;
...@@ -119,4 +120,10 @@ public class IndicatorsDefCtrl { ...@@ -119,4 +120,10 @@ public class IndicatorsDefCtrl {
@RequestParam String driveIndIdsString,@RequestParam int date) { @RequestParam String driveIndIdsString,@RequestParam int date) {
driveIndCalResultService.calculateComp(compareId, compareObjsString, driveIndIdsString, date); driveIndCalResultService.calculateComp(compareId, compareObjsString, driveIndIdsString, date);
} }
@ApiOperation(value = "对标单元综合计算", notes = "对标单元综合计算")
@PostMapping(value = "/compareUnitListCal")
public void compareUnitListCal(@RequestBody List<CompareUnitDef> compareUnitList) {
driveIndCalResultService.compareUnitListCal(compareUnitList);
}
} }
package com.keymobile.indicators.model.entity.indicators;
import lombok.Data;
/**
* author:zhangkb time:2020-6-23 desc:定义对标单元实体
*/
@Data
public class CompareUnitDef {
private String compareId;
private String compareObjs;//对标对象,多个用逗号隔开
private String indIds;//对标指标,多个用逗号隔开
private Integer date;//日期
private String firstExe;//是否先执行 0:否 1:是
private String averageObj;//平均分参考对象(主要场景:省对市考核中会有基础指标值会同级全省的值,然后对于不分组的对标单元的平均分参考的是全省的值算出的平均分)
private String objScoreRuleId;//单位规则评分id
}
...@@ -2,6 +2,7 @@ package com.keymobile.indicators.service.hytobacco; ...@@ -2,6 +2,7 @@ package com.keymobile.indicators.service.hytobacco;
import java.util.Arrays; import java.util.Arrays;
import java.util.HashMap; import java.util.HashMap;
import java.util.List;
import java.util.Map; import java.util.Map;
import org.slf4j.Logger; import org.slf4j.Logger;
...@@ -9,8 +10,11 @@ import org.slf4j.LoggerFactory; ...@@ -9,8 +10,11 @@ import org.slf4j.LoggerFactory;
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.keymobile.indicators.akka.actor.indicators.StartCompareUnitCalActor;
import com.keymobile.indicators.akka.actor.specific.DriveIndCompareObjActor; import com.keymobile.indicators.akka.actor.specific.DriveIndCompareObjActor;
import com.keymobile.indicators.akka.message.indicators.StartCompareUnitCalMsg;
import com.keymobile.indicators.akka.message.specific.DriveIndCompareObjMsg; import com.keymobile.indicators.akka.message.specific.DriveIndCompareObjMsg;
import com.keymobile.indicators.model.entity.indicators.CompareUnitDef;
import com.keymobile.indicators.model.entity.indicators.DriveIndCalResultDef; import com.keymobile.indicators.model.entity.indicators.DriveIndCalResultDef;
import com.keymobile.indicators.model.mapper.indmapper.DriveIndCalResultDefMapper; import com.keymobile.indicators.model.mapper.indmapper.DriveIndCalResultDefMapper;
...@@ -61,4 +65,16 @@ public class DriveIndCalResultService { ...@@ -61,4 +65,16 @@ public class DriveIndCalResultService {
driveIndCompareObjActor.tell(driveIndCompareObjMsg, ActorRef.noSender()); driveIndCompareObjActor.tell(driveIndCompareObjMsg, ActorRef.noSender());
logger.info("开始对标计算..."); logger.info("开始对标计算...");
} }
public void compareUnitListCal(List<CompareUnitDef> compareUnitList) {
if(!compareUnitList.isEmpty()) {
//启动回流actor
final ActorSystem system = ActorSystem.create("CompareUnitCalAkka");//创建akka
StartCompareUnitCalMsg startCompareUnitCalMsg = new StartCompareUnitCalMsg(compareUnitList);
ActorRef startCompareUnitCalActor = system.actorOf(Props.create(
StartCompareUnitCalActor.class,()-> new StartCompareUnitCalActor()));
startCompareUnitCalActor.tell(startCompareUnitCalMsg, ActorRef.noSender());
logger.info("开始对标单元综合计算...");
}
}
} }
...@@ -213,18 +213,18 @@ public class CalculateUtils { ...@@ -213,18 +213,18 @@ public class CalculateUtils {
} }
public static void main(String[] args) { public static void main(String[] args) {
Map<String,String> map = new HashMap<>(); // Map<String,String> map = new HashMap<>();
map.put("1001", "NaN"); // map.put("1001", "NaN");
map.put("1002", "NaN"); // map.put("1002", "NaN");
map.put("1003", "NaN"); // map.put("1003", "NaN");
map.put("1004", "NaN"); // map.put("1004", "NaN");
map.put("1005", "NaN"); // map.put("1005", "NaN");
map.put("1006", "NaN"); // map.put("1006", "NaN");
map.put("1007", "NaN"); // map.put("1007", "NaN");
map.put("1008", "NaN"); // map.put("1008", "NaN");
CalculateUtils cal = new CalculateUtils(); // CalculateUtils cal = new CalculateUtils();
Map<String,Integer> result = cal.rankValue(map, "1"); // Map<String,Integer> result = cal.rankValue(map, "1");
System.out.println(result); // System.out.println(result);
// //
// String formula = "([1001]+[1002])/2"; // String formula = "([1001]+[1002])/2";
// formula = formula.replace("[1001]", "3"); // formula = formula.replace("[1001]", "3");
......
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