package com.whyc.service; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.github.pagehelper.PageHelper; import com.github.pagehelper.PageInfo; import com.whyc.constant.Capperformance; import com.whyc.dto.Response; import com.whyc.dto.Statistic.*; import com.whyc.factory.BattCapFactory; import com.whyc.mapper.BattInfMapper; import com.whyc.mapper.BatttestdataInfMapper; import com.whyc.pojo.db_batt_testdata.BatttestdataId; import com.whyc.pojo.db_batt_testdata.BatttestdataInf; import com.whyc.pojo.db_param.AppParam; import com.whyc.pojo.db_ram_db.BattRtdata; import com.whyc.pojo.db_ram_db.BattRtstate; import com.whyc.pojo.db_station.BattInf; import com.whyc.util.PageInfoUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.util.*; @Service public class BatttestdataInfService { @Autowired(required = false) private BatttestdataInfMapper mapper; @Autowired(required = false) private BattRtstateService rtstateService; @Autowired(required = false) private BattRtdataService rtdataService; @Autowired(required = false) private BattInfService battInfService; @Autowired(required = false) private BatttestdataIdService battTestdataIdService; @Autowired(required = false) private AppParamService appParamService; //获取最后一次测试数据并计算剩余容量 public Float getLastTestDataRestCap(Integer battgroupId) { //获取放电记录 QueryWrapper wrapper=new QueryWrapper(); wrapper.eq("battgroup_id",battgroupId); wrapper.orderByDesc("test_starttime"); wrapper.last("limit 1"); BatttestdataInf tinf=mapper.selectOne(wrapper); if(tinf!=null){ int hourRate = BattCapFactory.GetHourRate(tinf.getTestCap(), tinf.getTestCurr()); Float restcap = (float) BattCapFactory.GetMonomerCap(tinf.getTestCap(), hourRate, tinf.getTestCap(), tinf.getMaxMonvol(), tinf.getMinMonvol(), tinf.getGroupVol(), BattCapFactory.CapType_Rest); return restcap; }else{ return 0f; } } //蓄电池核容信息统计 public Response getBattTinfStatistic(BattTinfStic stic) { PageHelper.startPage(stic.getPageNum(), stic.getPageSize()); List list=mapper.getBattTinfStatistic(stic); if(list!=null&&list.size()>0){ for (BatttestdataInf tinf:list) { //剩余容量和剩余时间计算 int hourRate = BattCapFactory.GetHourRate(tinf.getTestCap(), tinf.getTestCurr()); Float restCap = (float) BattCapFactory.GetMonomerCap(tinf.getTestCap(), hourRate, tinf.getTestCap(), tinf.getMaxMonvol(), tinf.getMinMonvol(), tinf.getGroupVol(), BattCapFactory.CapType_Rest); Float realCap = (float) BattCapFactory.GetMonomerCap(tinf.getTestCap(), hourRate, tinf.getTestCap(), tinf.getMaxMonvol(), tinf.getMinMonvol(), tinf.getGroupVol(), BattCapFactory.CapType_Real); tinf.setRestCap(restCap); tinf.setRealCap(realCap); tinf.setRestTime(0f); //获取电池组实时数据 BattRtstate battRtstate=rtstateService.getBattRealInfo(tinf.getBattgroupId()); //获取电池组信息 BattInf binf=battInfService.getBinfByBattgroupId(tinf.getBattgroupId()); //实时组端电流,剩余容量,标称容量 if(battRtstate!=null){ Float restTime= BattCapFactory.getTheoryTime(battRtstate.getGroupCurr(), restCap, binf.getMoncapstd()); tinf.setRestTime(restTime); } //保留5位小数 String precentCap = String.format("%.5f",(restCap/binf.getMoncapstd()*100)); tinf.setPrecentCap(precentCap); } } PageInfo pageInfo=new PageInfo(list); return new Response().setII(1,list.size()>0,pageInfo,"蓄电池核容信息统计"); } //获取上一次标准核容信息(标准核容的界定为单测核容时间达 2小时及以上的核容测试) public BatttestdataInf getLastStandardTestData(Integer battgroupId) { QueryWrapper wrapper = new QueryWrapper(); wrapper.eq("battgroup_id", battgroupId); wrapper.eq("test_type", 3); wrapper.eq("test_starttype", 3); wrapper.last(" and test_timelong >= 7200 ORDER BY test_starttime DESC "); wrapper.last("limit 1"); BatttestdataInf tinf = mapper.selectOne(wrapper); return tinf; } /*单节数量统计 1筛选满足条件的电池组,找最近一次标准核容放电记录的最后一笔数据 2再按照公式计算单体实际容量, 3然后找到判断优秀,劣化,损坏的参数,得到结果。 4浮充电压图,需要显示单体+实时数据的单体电压,单体内阻 */ public Response getMonStatistic(MonStic stic) { Map map=new HashMap<>(); List goodlist=new ArrayList(); List badlist=new ArrayList(); List damagelist=new ArrayList(); map.put("goodlist",goodlist); map.put("badlist",badlist); map.put("damagelist",damagelist); map.put("goodlistNum",0); map.put("badlistNum",0); map.put("damagelistNum",0); //获取核容优劣,损坏参数 List paramList=appParamService.getHrParam(); Float badValue=0f; Float damageValue=0f; if(paramList!=null){ for (AppParam param:paramList) { if(param.getParamNamePsx().equals("batt_mon_deteriorate_val")){ badValue=param.getParamValue(); } if(param.getParamNamePsx().equals("batt_mon_damage_val")){ damageValue=param.getParamValue(); } } } List binfList=battInfService.getMonStatistic(stic); Float realCap=0f; if(binfList==null){ return new Response().set(1,false,"当前用户未管理满足条件的电池组"); } for (BattInf binf:binfList) { BatttestdataInf tinf =getLastStandardTestData(binf.getBattgroupId()); if(tinf==null){ //将不满足条件的电池组的所有单体放入damage中 setDamage(damagelist,binf); continue; } //找这次放电的最后一笔数据 List idDataList=battTestdataIdService.getLastDataByBattgroupId(tinf.getBattgroupId(),tinf.getTestRecordCount(),tinf.getRecordNum()); if(idDataList==null||idDataList.size()==0){ //将不满足条件的电池组的所有单体放入damage中 setDamage(damagelist,binf); continue; } int hourRate = BattCapFactory.GetHourRate(tinf.getTestCap(), tinf.getTestCurr()); Float moncapStd=binf.getMoncapstd(); for (BatttestdataId data:idDataList) {//求单体的 实际容量,最小值就是单体的单体电压 realCap = (float) BattCapFactory.GetMonomerCap(tinf.getTestCap(), hourRate, tinf.getTestCap(), tinf.getMaxMonvol(),data.getMonVol() , tinf.getGroupVol(), BattCapFactory.CapType_Real); SticMonRes res=new SticMonRes(); res.setBattgroupId(binf.getBattgroupId()); res.setBattgroupName(binf.getBattgroupName()); res.setMonNum(data.getMonNum()); //获取单体的实时数据 BattRtdata rtdata=rtdataService.getRtdataByNum(binf.getBattgroupId(),data.getMonNum()); if(rtdata==null){ res.setMonVol(0f); res.setMonRes(0f); }else{ res.setMonVol(rtdata.getMonVol()); res.setMonRes(rtdata.getMonRes()); } if(realCap>=moncapStd*badValue){ goodlist.add(res); } if(realCap<=moncapStd*damageValue){ damagelist.add(res); } if((realCap>moncapStd*damageValue)&&(realCap rtdataList=rtdataService.getRtdataRealInfo(binf.getBattgroupId()); if(rtdataList==null||rtdataList.size()==0){ for (int i=0;i paramList=appParamService.getHrParam(); Float badValue=0f; Float damageValue=0f; if(paramList!=null){ for (AppParam param:paramList) { if(param.getParamNamePsx().equals("batt_mon_deteriorate_val")){ badValue=param.getParamValue(); } if(param.getParamNamePsx().equals("batt_mon_damage_val")){ damageValue=param.getParamValue(); } } } //1查询符合条件的电池组 List binfList=battInfService.getBattCompare15Statistic(stic); if(binfList==null||binfList.size()==0){ return new Response().set(1,false,"当前用户未管理满足条件的电池组"); } List reslist=new ArrayList<>(); for (BattInf binf:binfList) { SticCompareRes res=new SticCompareRes(); res.setProvice(binf.getProvice()); res.setCity(binf.getCity()); res.setCountry(binf.getCountry()); res.setStationName(binf.getStationName()); res.setBattgroupName(binf.getBattgroupName()); res.setProduct(binf.getProduct()); res.setInuseTime(binf.getInuseTime()); res.setMonvolstd(binf.getMonvolstd()); //2.获取电池组在给定时间段的放电记录(指定时间段的标准核容放电) BatttestdataInf tinf =getLastStandardTestDataByTime(binf.getBattgroupId(),stic.getTestStartTime(),stic.getTestEndTime()); if(tinf==null){ res.setRealCap(0f); res.setPrecentCap("0"); res.setCapperformance(Capperformance.getValue(Capperformance.BATTSTATE_3.getStateId())); continue; } //找这次放电的最后一笔数据 List idDataList=battTestdataIdService.getLastDataByBattgroupId(tinf.getBattgroupId(),tinf.getTestRecordCount(),tinf.getRecordNum()); if(idDataList==null||idDataList.size()==0){ res.setRealCap(0f); res.setPrecentCap("0"); res.setCapperformance(Capperformance.getValue(Capperformance.BATTSTATE_3.getStateId())); continue; } Float moncapStd=binf.getMoncapstd(); int hourRate = BattCapFactory.GetHourRate(tinf.getTestCap(), tinf.getTestCurr()); Float grouprealCap = (float) BattCapFactory.GetMonomerCap(tinf.getTestCap(), hourRate, tinf.getTestCap(), tinf.getMaxMonvol(), tinf.getMinMonvol(), tinf.getGroupVol(), BattCapFactory.CapType_Real); //Float restCap = (float) BattCapFactory.GetMonomerCap(tinf.getTestCap(), hourRate, tinf.getTestCap(), tinf.getMaxMonvol(), tinf.getMinMonvol(), tinf.getGroupVol(), BattCapFactory.CapType_Rest); res.setRealCap(grouprealCap); if(grouprealCap>=moncapStd*badValue){ res.setCapperformance(Capperformance.getValue(Capperformance.BATTSTATE_1.getStateId())); } if(grouprealCap<=moncapStd*damageValue){ res.setCapperformance(Capperformance.getValue(Capperformance.BATTSTATE_3.getStateId())); } if((grouprealCap>moncapStd*damageValue)&&(grouprealCap monNums=new ArrayList<>(); for (BatttestdataId data:idDataList) {//求单体的 实际容量,最小值就是单体的单体电压 Float monrealCap = (float) BattCapFactory.GetMonomerCap(tinf.getTestCap(), hourRate, tinf.getTestCap(), tinf.getMaxMonvol(), data.getMonVol(), tinf.getGroupVol(), BattCapFactory.CapType_Real); if (monrealCap <= moncapStd * damageValue) {//损坏的 monNums.add(data.getMonNum()); } } res.setMonNums(monNums); if(stic.getPerformance()==0){ reslist.add(res); }else{ if(res.getCapperformance().equals(Capperformance.getValue(stic.getPerformance()))){ reslist.add(res); } } } PageInfo pageInfo=PageInfoUtils.list2PageInfo(reslist, stic.getPageNum(), stic.getPageSize()); return new Response().setII(1,reslist.size()>0,pageInfo,"蓄电池组对比分析界面(同一品牌同一时间)"); } //获取电池组在给定时间段的放电记录(指定时间段的标准核容放电) private BatttestdataInf getLastStandardTestDataByTime(Integer battgroupId, Date testStartTime, Date testEndTime) { QueryWrapper wrapper = new QueryWrapper(); wrapper.eq("battgroup_id", battgroupId); wrapper.eq("test_type", 3); wrapper.eq("test_starttype", 3); wrapper.gt("test_starttime",testStartTime); wrapper.lt("test_starttime",testEndTime); wrapper.last(" and test_timelong >= 7200 ORDER BY test_starttime DESC "); wrapper.last("limit 1"); BatttestdataInf tinf = mapper.selectOne(wrapper); return tinf; } }