| | |
| | | package com.whyc.service; |
| | | |
| | | import com.whyc.dto.BattGroupStationInfoWithFileParam; |
| | | import com.whyc.dto.Response; |
| | | import com.whyc.mapper.BattGroupDataMapper; |
| | | import com.whyc.pojo.BattgroupData; |
| | | import com.whyc.pojo.FileInfo; |
| | | import com.whyc.pojo.*; |
| | | import com.whyc.util.MathUtil; |
| | | import org.springframework.beans.factory.annotation.Autowired; |
| | | import org.springframework.stereotype.Service; |
| | | |
| | | import javax.annotation.Resource; |
| | | import java.math.BigDecimal; |
| | | import java.util.HashMap; |
| | | import java.util.LinkedList; |
| | | import java.util.List; |
| | | import java.util.Map; |
| | | import java.util.stream.Collectors; |
| | | import java.util.stream.Stream; |
| | | |
| | | @Service |
| | | public class BattGroupDataService { |
| | |
| | | @Resource |
| | | private BattGroupDataMapper mapper; |
| | | |
| | | public List<BattgroupData> getListWithTestTime(int battGroupId) { |
| | | return mapper.getListWithTestTime(battGroupId); |
| | | @Autowired |
| | | private FileParamService fileParamService; |
| | | |
| | | @Autowired |
| | | private BattGroupInfoService battGroupInfoService; |
| | | |
| | | @Autowired |
| | | private TestParamService testParamService; |
| | | |
| | | @Autowired |
| | | private StationInfoService stationInfoService; |
| | | |
| | | public BattGroupStationInfoWithFileParam getListWithTestTime(String fileId) { |
| | | BattGroupStationInfoWithFileParam info = new BattGroupStationInfoWithFileParam(); |
| | | //查询站点信息和文件参数信息 |
| | | StationInfo stationInfo = stationInfoService.getByFileId(fileId); |
| | | |
| | | String battGroupId = battGroupInfoService.getByFileId(fileId).getBattgroupId(); |
| | | List<BattgroupData> dataList = mapper.getListWithTestTime(battGroupId); |
| | | //查询系数和阈值是否禁用 |
| | | //BattgroupInfo info = battGroupInfoService.getByBattGroupId(fileId); |
| | | FileParam param = fileParamService.getByFileId(fileId); |
| | | TestParam param2 = testParamService.getFactorsAndThreshold(); |
| | | |
| | | info.setStationInfo(stationInfo); |
| | | info.setFileParam(param); |
| | | if(param2.getEnabled() == 0){ //系数和阈值禁用,不需要判断处理阈值 |
| | | info.setDataList(dataList); |
| | | return info; |
| | | } |
| | | Float stdVol = param.getBattVol(); |
| | | Float stdRes = param.getBattRes(); |
| | | Float volLowCoeK1 = param2.getVolLowCoeK1(); |
| | | Float volHighCoeK2 = param2.getVolHighCoeK2(); |
| | | Float resGoodCoeK3 = param2.getResGoodCoeK3(); |
| | | Float resBadCoeK4 = param2.getResBadCoeK4(); |
| | | Float chainRes = param.getChainRes(); |
| | | dataList.forEach(data->{ |
| | | //判断处理阈值 |
| | | Float br = data.getBr(); |
| | | Float bv = data.getBv(); |
| | | Float cr = data.getCr(); //连接条阻抗 |
| | | |
| | | if(bv < stdVol*volLowCoeK1){ |
| | | data.setLowVolFlag(true); |
| | | }else if(bv > stdVol*volHighCoeK2){ |
| | | data.setHighVolFlag(true); |
| | | } |
| | | |
| | | if(br > stdRes*resGoodCoeK3){ |
| | | if(br > stdRes*resBadCoeK4){ |
| | | data.setHighResFlag2(true); |
| | | }else{ |
| | | data.setHighResFlag1(true); |
| | | } |
| | | } |
| | | |
| | | if(cr > chainRes*param2.getChainResCoeK5()){ |
| | | data.setHighChainResFlag(true); |
| | | } |
| | | }); |
| | | |
| | | info.setDataList(dataList); |
| | | info.setFileParam(param); |
| | | |
| | | return info; |
| | | } |
| | | |
| | | public Response getComparedList(int baseBattGroupId, int battGroupId) { |
| | | List<BattgroupData> baseDataList = getListWithTestTime(baseBattGroupId); |
| | | List<BattgroupData> dataList = getListWithTestTime(battGroupId); |
| | | public Map<String, String> getStandardDeviation(List<BattgroupData> monList) { |
| | | Map<String,String> map = new HashMap<>(); |
| | | List<Float> bvList = monList.stream().map(BattgroupData::getBv).collect(Collectors.toList()); |
| | | List<Float> brList = monList.stream().map(BattgroupData::getBr).collect(Collectors.toList()); |
| | | List<Float> crList = monList.stream().map(BattgroupData::getCr).collect(Collectors.toList()); |
| | | List<Float> bsList = monList.stream().map(BattgroupData::getBs).collect(Collectors.toList()); |
| | | float stdDevBv = MathUtil.getStandardDeviation(bvList); |
| | | float stdDevBr = MathUtil.getStandardDeviation(brList); |
| | | float stdDevCr = MathUtil.getStandardDeviation(crList); |
| | | float stdDevBs = MathUtil.getStandardDeviation(bsList); |
| | | map.put("stdDevBv",stdDevBv*10000/100+"%"); |
| | | map.put("stdDevBr",stdDevBr*10000/100+"%"); |
| | | map.put("stdDevCr",stdDevCr*10000/100+"%"); |
| | | map.put("stdDevBs",stdDevBs*10000/100+"%"); |
| | | return map; |
| | | } |
| | | |
| | | //内阻变化率,均一性;电压变化率,均一性 TODO 均一性 |
| | | List<Float> resChangeRate = new LinkedList<>(); |
| | | List<Float> volChangeRate = new LinkedList<>(); |
| | | List<Float> resBalanceRate = new LinkedList<>(); |
| | | List<Float> volBalanceRate = new LinkedList<>(); |
| | | public Response getComparedList(String baseFileId, String fileId) { |
| | | //String baseBattGroupId = battGroupInfoService.getByFileId(baseFileId).getBattgroupId(); |
| | | //String battGroupId = battGroupInfoService.getByFileId(fileId).getBattgroupId(); |
| | | BattGroupStationInfoWithFileParam baseInfo = getListWithTestTime(baseFileId); |
| | | List<BattgroupData> baseDataList = baseInfo.getDataList(); |
| | | BattGroupStationInfoWithFileParam info = getListWithTestTime(fileId); |
| | | List<BattgroupData> dataList = info.getDataList(); |
| | | |
| | | return new Response().setII(1,baseDataList,dataList,null); |
| | | //内阻变化率,均一性;电压变化率,均一性 |
| | | Map<String,Object> map = new HashMap<>(); |
| | | List<String> resChangeRate = new LinkedList<>(); |
| | | List<String> volChangeRate = new LinkedList<>(); |
| | | List<String> resBalanceRate = new LinkedList<>(); |
| | | List<String> volBalanceRate = new LinkedList<>(); |
| | | |
| | | float sdBaseBr = MathUtil.getStandardDeviation(baseDataList.stream().map(BattgroupData::getBr).collect(Collectors.toList())); |
| | | float sdBaseBv = MathUtil.getStandardDeviation(baseDataList.stream().map(BattgroupData::getBv).collect(Collectors.toList())); |
| | | float sdBr = MathUtil.getStandardDeviation(dataList.stream().map(BattgroupData::getBr).collect(Collectors.toList())); |
| | | float sdBv = MathUtil.getStandardDeviation(dataList.stream().map(BattgroupData::getBv).collect(Collectors.toList())); |
| | | |
| | | resBalanceRate.add(sdBaseBr*10000/100+"%"); |
| | | resBalanceRate.add(sdBr*10000/100+"%"); |
| | | |
| | | volBalanceRate.add(sdBaseBv*10000/100+"%"); |
| | | volBalanceRate.add(sdBv*10000/100+"%"); |
| | | |
| | | for (int i = 0; i < dataList.size(); i++) { |
| | | BattgroupData data = dataList.get(i); |
| | | //这么做是在 电池单体数据按存储顺序且不出现断层 |
| | | BattgroupData baseData = null; |
| | | if(i< baseDataList.size()) { |
| | | baseData = baseDataList.get(i); |
| | | } |
| | | if(baseData!=null){ |
| | | //进行内阻和电压变化率计算 |
| | | Float br = data.getBr(); |
| | | Float baseBr = baseData.getBr(); |
| | | if(baseBr == 0.0f){ |
| | | if(br == 0.0f){ |
| | | resChangeRate.add("0.0%"); |
| | | }else{ |
| | | resChangeRate.add("-"); |
| | | } |
| | | }else { |
| | | float brFloat = BigDecimal.valueOf(br).subtract(BigDecimal.valueOf(baseBr)).divide(BigDecimal.valueOf(baseBr), 4, BigDecimal.ROUND_HALF_UP).floatValue(); |
| | | resChangeRate.add(brFloat * 10000/100 + "%"); |
| | | } |
| | | |
| | | Float bv = data.getBv(); |
| | | Float baseBv = baseData.getBv(); |
| | | if(baseBv == 0.0f){ |
| | | if(bv == 0.0f){ |
| | | volChangeRate.add("0.0%"); |
| | | }else{ |
| | | volChangeRate.add("-"); |
| | | } |
| | | }else { |
| | | float bvFloat = BigDecimal.valueOf(bv).subtract(BigDecimal.valueOf(baseBv)).divide(BigDecimal.valueOf(baseBv), 4, BigDecimal.ROUND_HALF_UP).floatValue(); |
| | | volChangeRate.add(bvFloat * 10000/100 + "%"); |
| | | } |
| | | } |
| | | } |
| | | //将均一性值,也进行变化率计算 |
| | | float brFloat = BigDecimal.valueOf(sdBr).subtract(BigDecimal.valueOf(sdBaseBr)).divide(BigDecimal.valueOf(sdBaseBr),4, BigDecimal.ROUND_HALF_UP).floatValue(); |
| | | resChangeRate.add(brFloat*10000/100+"%"); |
| | | |
| | | float bvFloat = BigDecimal.valueOf(sdBv).subtract(BigDecimal.valueOf(sdBaseBv)).divide(BigDecimal.valueOf(sdBaseBv),4, BigDecimal.ROUND_HALF_UP).floatValue(); |
| | | volChangeRate.add(bvFloat*10000/100+"%"); |
| | | |
| | | map.put("resChangeRate",resChangeRate); |
| | | map.put("volChangeRate",volChangeRate); |
| | | map.put("resBalanceRate",resBalanceRate); |
| | | map.put("volBalanceRate",volBalanceRate); |
| | | map.put("fileParamBase",baseInfo.getFileParam()); |
| | | return new Response().setIII(1,baseDataList,dataList,map,null); |
| | | } |
| | | |
| | | public static void main(String[] args) { |
| | | |
| | | } |
| | | } |