package com.whyc.service;
|
|
import com.whyc.constant.Com;
|
import com.whyc.dto.KPIDetail;
|
import com.whyc.dto.Response;
|
import com.whyc.pojo.BaoJiGroup;
|
import com.whyc.pojo.BaoJiGroupUser;
|
import com.whyc.pojo.FaultUpload;
|
import com.whyc.pojo.UserInf;
|
import com.whyc.util.MathUtil;
|
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.stereotype.Service;
|
|
import java.math.BigDecimal;
|
import java.math.RoundingMode;
|
import java.util.*;
|
import java.util.stream.Collectors;
|
|
@Service
|
public class KPIService {
|
|
@Autowired
|
private BattdischargePlanService planService;
|
|
@Autowired
|
private FaultUploadService uploadService;
|
|
@Autowired
|
private BaoJiGroupUserService baoJiGroupUserService;
|
|
|
public List<KPIDetail> getAnnualPersonalDetail() {
|
//放电任务,班组
|
Map<String, Map<String, Integer>> planCount = planService.getPlanCount();
|
|
//隐患故障上报,个人
|
Map<String, FaultUpload> uploadWithGroupName = uploadService.getUploadWithGroupName();
|
|
//整理最终需要统计的所有用户及所属的包机组
|
List<BaoJiGroup> baoJiGroupUserList = baoJiGroupUserService.getGroupAndUserListWithDischargeFlag();
|
List<KPIDetail> kpiDetails = new LinkedList<>();
|
for (BaoJiGroup baoJiGroup : baoJiGroupUserList) {
|
String baoJiGroupName = baoJiGroup.getBaoJiGroupName();
|
List<UserInf> userList = baoJiGroup.getUserList();
|
for (UserInf userInf : userList) {
|
KPIDetail detail = new KPIDetail();
|
detail.setUserName(userInf.getUName());
|
detail.setGroupName(baoJiGroupName);
|
detail.setDischargePlanNumTotal(0);
|
detail.setDischargePlanNumFinished(0);
|
detail.setFaultUploadNumTotal(0);
|
detail.setFaultUploadNumFinished(0);
|
kpiDetails.add(detail);
|
}
|
}
|
//数据接入,任务
|
Set<String> groupNameSet = planCount.keySet();
|
for (String groupName : groupNameSet) {
|
Map<String, Integer> map = planCount.get(groupName);
|
|
for (KPIDetail kpiDetail : kpiDetails) {
|
if(kpiDetail.getGroupName().equals(groupName)){
|
kpiDetail.setDischargePlanNumTotal(map.get("total"));
|
kpiDetail.setDischargePlanNumFinished(map.get("finishNum"));
|
/*//数据接入,故障
|
String userName = kpiDetail.getUserName();
|
FaultUpload upload = uploadWithGroupName.get(userName);
|
if(upload!=null){
|
kpiDetail.setFaultUploadNumTotal(upload.getTotalNum());
|
kpiDetail.setFaultUploadNumFinished(upload.getConfirmedNum());
|
}*/
|
}
|
}
|
}
|
//数据接入,故障
|
Set<String> userNameSet = uploadWithGroupName.keySet();
|
for (String userName : userNameSet) {
|
for (KPIDetail kpiDetail : kpiDetails) {
|
String userName2 = kpiDetail.getUserName();
|
if(userName.equals(userName2)){
|
FaultUpload upload = uploadWithGroupName.get(userName);
|
if(upload!=null){
|
kpiDetail.setFaultUploadNumTotal(upload.getTotalNum());
|
kpiDetail.setFaultUploadNumFinished(upload.getConfirmedNum());
|
}
|
break;
|
}
|
}
|
}
|
|
//个人考核得分
|
for (KPIDetail kpiDetail : kpiDetails) {
|
Integer dischargePlanNumFinished = kpiDetail.getDischargePlanNumFinished();
|
Integer dischargePlanNumTotal = kpiDetail.getDischargePlanNumTotal();
|
|
Integer faultUploadNumFinished = kpiDetail.getFaultUploadNumFinished();
|
Integer faultUploadNumTotal = kpiDetail.getFaultUploadNumTotal();
|
|
String dischargePlanScoreStr = (String) MathUtil.divide(dischargePlanNumFinished, dischargePlanNumTotal, 2, 4);
|
float dischargePlanScore = Float.parseFloat(dischargePlanScoreStr);
|
|
float faultUploadDivideFloat = 0f;
|
Object faultUploadDivide = MathUtil.divide(faultUploadNumFinished, faultUploadNumTotal, 1, 3);
|
if (faultUploadDivide instanceof Double){
|
faultUploadDivideFloat = ((Double) faultUploadDivide).floatValue();
|
}else{
|
faultUploadDivideFloat = (float)faultUploadDivide;
|
}
|
float faultUploadScore = MathUtil.multiply(faultUploadNumTotal , 0.3f,2) + MathUtil.multiply(faultUploadDivideFloat,70f,2);
|
|
float personalScore = MathUtil.multiply(dischargePlanScore,0.4f,2) + MathUtil.multiply(faultUploadScore,0.6f,2);
|
kpiDetail.setPersonalScore(personalScore);
|
|
}
|
|
return kpiDetails;
|
}
|
|
public Response getAnnualDetail(Integer limitN) {
|
List<KPIDetail> details = getAnnualPersonalDetail();
|
if(limitN !=null){
|
details = details.stream().sorted((a,b)->b.getPersonalScore().compareTo(a.getPersonalScore())).limit(limitN).collect(Collectors.toList());
|
}
|
return new Response().set(1,details);
|
}
|
|
public Response getAnnualStatisticByGroupName(Integer limitN) {
|
List<KPIDetail> groupDetails = new LinkedList<>();
|
List<KPIDetail> details = getAnnualPersonalDetail();
|
//班组得分
|
Map<String, List<KPIDetail>> groupNameListMap = details.stream().collect(Collectors.groupingBy(KPIDetail::getGroupName));
|
Set<String> groupNameSet = groupNameListMap.keySet();
|
for (String groupName : groupNameSet) {
|
List<KPIDetail> tempList = groupNameListMap.get(groupName);
|
double groupAvgScoreDouble = tempList.stream().mapToDouble(temp -> temp.getPersonalScore()).average().getAsDouble();
|
float groupAvgScore = BigDecimal.valueOf(groupAvgScoreDouble).setScale(2, RoundingMode.HALF_UP).floatValue();
|
|
KPIDetail groupDetail = new KPIDetail();
|
groupDetail.setGroupName(groupName);
|
groupDetail.setGroupAvgScore(groupAvgScore);
|
groupDetails.add(groupDetail);
|
}
|
|
if(limitN!=null) {
|
groupDetails = groupDetails.stream().sorted((a, b) -> b.getGroupAvgScore().compareTo(a.getGroupAvgScore())).limit(limitN).collect(Collectors.toList());
|
}else{
|
groupDetails = groupDetails.stream().sorted((a, b) -> b.getGroupAvgScore().compareTo(a.getGroupAvgScore())).collect(Collectors.toList());
|
}
|
return new Response().set(1,groupDetails);
|
}
|
|
public Response getAnnualStatisticByGroupNameAndUser() {
|
List<KPIDetail> groupDetails = new LinkedList<>();
|
List<KPIDetail> details = getAnnualPersonalDetail();
|
//班组得分
|
Map<String, List<KPIDetail>> groupNameListMap = details.stream().collect(Collectors.groupingBy(KPIDetail::getGroupName));
|
Set<String> groupNameSet = groupNameListMap.keySet();
|
for (String groupName : groupNameSet) {
|
List<KPIDetail> tempList = groupNameListMap.get(groupName);
|
double groupAvgScoreDouble = tempList.stream().mapToDouble(KPIDetail::getPersonalScore).average().getAsDouble();
|
float groupAvgScore = BigDecimal.valueOf(groupAvgScoreDouble).setScale(2, RoundingMode.HALF_UP).floatValue();
|
Float personalScoreMin = tempList.stream().min(Comparator.comparing(KPIDetail::getPersonalScore)).get().getPersonalScore();
|
Float personalScoreMax = tempList.stream().max(Comparator.comparing(KPIDetail::getPersonalScore)).get().getPersonalScore();
|
|
KPIDetail groupDetail = new KPIDetail();
|
groupDetail.setGroupName(groupName);
|
groupDetail.setGroupAvgScore(groupAvgScore);
|
groupDetail.setPersonalScoreMin(personalScoreMin);
|
groupDetail.setPersonalScoreMax(personalScoreMax);
|
groupDetails.add(groupDetail);
|
}
|
//排名
|
List<String> groupNameList = groupDetails.stream().sorted((a, b) -> b.getGroupAvgScore().compareTo(a.getGroupAvgScore())).map(KPIDetail::getGroupName).collect(Collectors.toList());
|
for (KPIDetail groupDetail : groupDetails) {
|
int rankIndex = groupNameList.indexOf(groupDetail.getGroupName());
|
groupDetail.setGroupRank(rankIndex+1);
|
}
|
|
|
return new Response().set(1,groupDetails);
|
}
|
}
|