package com.whyc.service;
|
|
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
import com.whyc.dto.BattInfAndEnduranceDTO;
|
import com.whyc.dto.Response;
|
import com.whyc.mapper.BattEnduranceMapper;
|
import com.whyc.pojo.BattEndurance;
|
import com.whyc.util.MathUtil;
|
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.stereotype.Service;
|
import org.springframework.util.ReflectionUtils;
|
|
import javax.annotation.Resource;
|
import java.lang.reflect.Field;
|
import java.util.*;
|
import java.util.stream.Collectors;
|
|
@Service
|
public class BattEnduranceService {
|
@Resource
|
private BattEnduranceMapper mapper;
|
|
@Autowired
|
private BattInfService battInfService;
|
|
public Response getEndurance(int uId){
|
List<BattEndurance> enduranceList = mapper.endurance(uId);
|
List<Integer> times = Arrays.asList(1,2,3,5,8);
|
Map resultMap = enduranceAnalysis(enduranceList,times);
|
return new Response().set(1,resultMap,"查询成功");
|
}
|
|
public Response enableEndurance(){
|
mapper.enableEndurance();
|
return new Response().set(1,true,"启动续航线程成功");
|
}
|
|
/**按时间阶段统计续航*/
|
private static Map enduranceAnalysis(List<BattEndurance> enduranceList, List<Integer> times) {
|
Map<String,Integer> map = new LinkedHashMap<>();
|
|
//初始化续航分类
|
for (int i = 0; i < times.size(); i++) {
|
if(i ==0 ){
|
map.put("续航"+times.get(0)+"小时内",0);
|
}
|
else if(i == times.size()-1){
|
map.put("续航"+times.get(i-1)+"小时到"+times.get(i)+"小时",0);
|
map.put("续航"+times.get(times.size()-1)+"小时以上",0);
|
}else {
|
map.put("续航" + times.get(i-1) + "小时到" + times.get(i) + "小时", 0);
|
}
|
}
|
|
for (int i = 0; i < enduranceList.size(); i++) {
|
//每一个具体的续航进行分组
|
if(enduranceList.get(i).getEnduranceActualTimelong()<times.get(0)*60){
|
map.put("续航"+times.get(0)+"小时内", Optional.ofNullable(map.get("续航"+times.get(0)+"小时内")).orElse(0)+1);
|
}
|
else if(enduranceList.get(i).getEnduranceActualTimelong()>times.get(times.size()-1)*60){
|
map.put("续航"+times.get(times.size()-1)+"小时以上",Optional.ofNullable(map.get("续航"+times.get(times.size()-1)+"小时以上")).orElse(0)+1);
|
}else {
|
for (int j = 0; j < times.size(); j++) {
|
if (enduranceList.get(i).getEnduranceActualTimelong() <= times.get(j)*60) {
|
map.put("续航" + times.get(j - 1) + "小时到" + times.get(j) + "小时", Optional.ofNullable(map.get("续航" + times.get(j - 1) + "小时到" + times.get(j) + "小时")).orElse(0) + 1);
|
break;
|
}
|
}
|
}
|
}
|
//排序
|
TreeMap<String, Integer> maps = new TreeMap<>(new Comparator<String>() {
|
@Override
|
public int compare(String o1, String o2) {
|
return o1.compareTo(o2);
|
}
|
});
|
|
maps.putAll(map);
|
map.clear();
|
return maps;
|
}
|
|
public Response getBattInfEnduranceByTimeCode(int uId,int timeCode){
|
List<BattInfAndEnduranceDTO> list = mapper.getBattInfEnduranceByTimeCode(uId,timeCode);
|
return new Response().set(1,list,"查询成功");
|
}
|
|
|
public Response getEnduranceTimeByDeviceId(int deviceId){
|
QueryWrapper<BattEndurance> queryWrapper = new QueryWrapper<>();
|
queryWrapper.eq("deviceid",deviceId);
|
BattEndurance battEndurance = mapper.selectOne(queryWrapper);
|
float timeLong = 0.0f;
|
if (battEndurance==null){
|
timeLong = -1f;
|
}else {
|
timeLong = battEndurance.getEnduranceActualTimelong();
|
}
|
return new Response().set(1,timeLong,"查询成功");
|
}
|
|
/**
|
* 查询续航时间<n小时的
|
*/
|
public Response getEnduranceTimeLong(int userId,int hour){
|
try {
|
List<BattEndurance> capList = mapper.getListAndLoadCurr(userId);
|
List<BattEndurance> enduranceLowList = new LinkedList<>();
|
for (BattEndurance battEndurance : capList) {
|
if (battEndurance.getEnduranceActualTimelong() < hour) {
|
enduranceLowList.add(battEndurance);
|
}
|
}
|
Map<Integer, List<BattEndurance>> collect = enduranceLowList.stream().collect(Collectors.groupingBy(BattEndurance::getNum));
|
enduranceLowList.clear();
|
Set<Integer> idSet = collect.keySet();
|
for (Integer id : idSet) {
|
List<BattEndurance> battEnduranceList = collect.get(id);
|
BattEndurance battEndurance = battEnduranceList.get(0);
|
if (battEnduranceList.size() > 1) {
|
for (int i = 0; i < battEnduranceList.size(); i++) {
|
BattEndurance endurance = battEnduranceList.get(i);
|
if (i == 0) {
|
battEndurance.setLoadCurr(endurance.getLoadCurr());
|
} else {
|
battEndurance.setLoadCurr(battEndurance.getLoadCurr() + "/" + endurance.getLoadCurr());
|
}
|
}
|
}
|
enduranceLowList.add(battEndurance);
|
}
|
return new Response().setII(1, enduranceLowList.size(), enduranceLowList, null);
|
}catch (Exception e){
|
return new Response<>().set(1,false,"发生异常:"+e.getCause());
|
}
|
|
}
|
|
|
//山西晋源特定接口
|
public Response getEnduranceTimeLongJY(int hour){
|
try {
|
List<BattEndurance> capList = mapper.getListAndLoadCurrJY();
|
List<BattEndurance> enduranceLowList = new LinkedList<>();
|
for (BattEndurance battEndurance : capList) {
|
if (battEndurance.getEnduranceActualTimelong() < hour) {
|
enduranceLowList.add(battEndurance);
|
}
|
}
|
Map<Integer, List<BattEndurance>> collect = enduranceLowList.stream().collect(Collectors.groupingBy(BattEndurance::getNum));
|
enduranceLowList.clear();
|
Set<Integer> idSet = collect.keySet();
|
for (Integer id : idSet) {
|
List<BattEndurance> battEnduranceList = collect.get(id);
|
BattEndurance battEndurance = battEnduranceList.get(0);
|
if (battEnduranceList.size() > 1) {
|
for (int i = 0; i < battEnduranceList.size(); i++) {
|
BattEndurance endurance = battEnduranceList.get(i);
|
if (i == 0) {
|
battEndurance.setLoadCurr(endurance.getLoadCurr());
|
} else {
|
battEndurance.setLoadCurr(battEndurance.getLoadCurr() + "/" + endurance.getLoadCurr());
|
}
|
}
|
}
|
enduranceLowList.add(battEndurance);
|
}
|
return new Response().setII(1, enduranceLowList.size(), enduranceLowList, null);
|
}catch (Exception e){
|
return new Response<>().set(1,false,"发生异常:"+e.getCause());
|
}
|
|
}
|
|
/**
|
* 测试时间存在,加入统计
|
* @param userId
|
* @return
|
*/
|
public Response getGroupCapList(int userId){
|
try {
|
List<BattEndurance> groupCapList = new LinkedList<>();
|
List<BattEndurance> list = mapper.getGroupCapList(userId);
|
//获取有效数据
|
for (BattEndurance battEndurance : list) {
|
if(battEndurance.getGroupcount()>1){ //多个电池组
|
Class<? extends BattEndurance> clazz = battEndurance.getClass();
|
String[] testTimeSplit = battEndurance.getBattsTeststarttime().split("/");
|
for (int i = 0; i < testTimeSplit.length; i++) {
|
String testTime = testTimeSplit[i];
|
if(!testTime.equals("-")){ //有效
|
//通过反射获取字段
|
BattEndurance temp = new BattEndurance();
|
Field groupCapField = clazz.getDeclaredField("realCapGroup" + (i + 1));
|
//groupCapField.setAccessible(true);
|
ReflectionUtils.makeAccessible(groupCapField);
|
Float groupCap = (Float) groupCapField.get(battEndurance);
|
temp.setMoncapstd(Float.parseFloat(battEndurance.getBattsMoncapstd().split("/")[i]));
|
temp.setRealCap(groupCap);
|
groupCapList.add(temp);
|
}
|
}
|
}else{ //单组
|
BattEndurance temp = new BattEndurance();
|
temp.setRealCap(battEndurance.getRealCapGroup1());
|
temp.setMoncapstd(Float.parseFloat(battEndurance.getBattsMoncapstd()));
|
groupCapList.add(temp);
|
}
|
}
|
Map<Integer,Integer> map = new HashMap<>();
|
map.put(1,0);
|
map.put(2,0);
|
map.put(3,0);
|
map.put(4,0);
|
map.put(5,0);
|
Map<Integer,String> mapPercent = new HashMap<>();
|
|
//获取所有的电池组数
|
int totalNum = battInfService.getBattGroupList(userId).size();
|
//非1等级的数量
|
int notLevel1Num=0;
|
//获取已经核容的电池组的容量各区间组数
|
float capLevel1 = 0.95f;
|
float capLevel2 = 0.85f;
|
float capLevel3 = 0.6f;
|
float capLevel4 = 0.5f;
|
|
for (BattEndurance groupCap : groupCapList) {
|
float realCap = groupCap.getRealCap();
|
float capStd = groupCap.getMoncapstd();
|
Float capPercentF = (Float) MathUtil.divide(realCap, capStd, MathUtil.TYPE_FLOAT);
|
if(capPercentF>=capLevel1){
|
map.put(1,map.get(1)+1);
|
}
|
else if(capPercentF>=capLevel2){
|
map.put(2,map.get(2)+1);
|
notLevel1Num++;
|
}
|
else if(capPercentF>=capLevel3){
|
map.put(3,map.get(3)+1);
|
notLevel1Num++;
|
}
|
else if(capPercentF>=capLevel4){
|
map.put(4,map.get(4)+1);
|
notLevel1Num++;
|
}
|
else{
|
map.put(5,map.get(5)+1);
|
notLevel1Num++;
|
}
|
}
|
//重置等级1的电池组数,未核容的电池组默认是100%,属于等级1
|
map.put(1,totalNum-notLevel1Num);
|
|
Set<Integer> levelSet = map.keySet();
|
for (Integer level : levelSet) {
|
Integer num = map.get(level);
|
String percent = (String) MathUtil.divide(num, totalNum, MathUtil.TYPE_FLOAT_PERCENT, 1);
|
mapPercent.put(level,percent);
|
}
|
return new Response().setIII(1, true,mapPercent,map,null);
|
}catch (Exception e) {
|
return new Response().set(1,false,"发生异常:"+e.getCause());
|
}
|
|
}
|
|
//山西晋源特定接口
|
public Response getGroupCapListJY(){
|
try {
|
List<BattEndurance> groupCapList = new LinkedList<>();
|
List<BattEndurance> list = mapper.getGroupCapListJY();
|
//获取有效数据
|
for (BattEndurance battEndurance : list) {
|
if(battEndurance.getGroupcount()>1){ //多个电池组
|
Class<? extends BattEndurance> clazz = battEndurance.getClass();
|
String[] testTimeSplit = battEndurance.getBattsTeststarttime().split("/");
|
for (int i = 0; i < testTimeSplit.length; i++) {
|
String testTime = testTimeSplit[i];
|
if(!testTime.equals("-")){ //有效
|
//通过反射获取字段
|
BattEndurance temp = new BattEndurance();
|
Field groupCapField = clazz.getDeclaredField("realCapGroup" + (i + 1));
|
//groupCapField.setAccessible(true);
|
ReflectionUtils.makeAccessible(groupCapField);
|
Float groupCap = (Float) groupCapField.get(battEndurance);
|
temp.setMoncapstd(Float.parseFloat(battEndurance.getBattsMoncapstd().split("/")[i]));
|
temp.setRealCap(groupCap);
|
groupCapList.add(temp);
|
}
|
}
|
}else{ //单组
|
BattEndurance temp = new BattEndurance();
|
temp.setRealCap(battEndurance.getRealCapGroup1());
|
temp.setMoncapstd(Float.parseFloat(battEndurance.getBattsMoncapstd()));
|
groupCapList.add(temp);
|
}
|
}
|
Map<Integer,Integer> map = new HashMap<>();
|
map.put(1,0);
|
map.put(2,0);
|
map.put(3,0);
|
map.put(4,0);
|
map.put(5,0);
|
Map<Integer,String> mapPercent = new HashMap<>();
|
|
//获取所有的电池组数
|
int totalNum = battInfService.getBattGroupListJY().size();
|
//非1等级的数量
|
int notLevel1Num=0;
|
//获取已经核容的电池组的容量各区间组数
|
float capLevel1 = 0.95f;
|
float capLevel2 = 0.85f;
|
float capLevel3 = 0.6f;
|
float capLevel4 = 0.5f;
|
|
for (BattEndurance groupCap : groupCapList) {
|
float realCap = groupCap.getRealCap();
|
float capStd = groupCap.getMoncapstd();
|
Float capPercentF = (Float) MathUtil.divide(realCap, capStd, MathUtil.TYPE_FLOAT);
|
if(capPercentF>=capLevel1){
|
map.put(1,map.get(1)+1);
|
}
|
else if(capPercentF>=capLevel2){
|
map.put(2,map.get(2)+1);
|
notLevel1Num++;
|
}
|
else if(capPercentF>=capLevel3){
|
map.put(3,map.get(3)+1);
|
notLevel1Num++;
|
}
|
else if(capPercentF>=capLevel4){
|
map.put(4,map.get(4)+1);
|
notLevel1Num++;
|
}
|
else{
|
map.put(5,map.get(5)+1);
|
notLevel1Num++;
|
}
|
}
|
//重置等级1的电池组数,未核容的电池组默认是100%,属于等级1
|
map.put(1,totalNum-notLevel1Num);
|
|
Set<Integer> levelSet = map.keySet();
|
for (Integer level : levelSet) {
|
Integer num = map.get(level);
|
String percent = (String) MathUtil.divide(num, totalNum, MathUtil.TYPE_FLOAT_PERCENT, 1);
|
mapPercent.put(level,percent);
|
}
|
return new Response().setIII(1, true,mapPercent,map,null);
|
}catch (Exception e) {
|
return new Response().set(1,false,"发生异常:"+e.getCause());
|
}
|
|
}
|
|
|
}
|