From f998f917f90d86499bf8a24c8912e270655e4d43 Mon Sep 17 00:00:00 2001 From: whyclxw <810412026@qq.com> Date: 星期二, 24 六月 2025 17:27:57 +0800 Subject: [PATCH] 预警分析修改 --- src/main/java/com/whyc/service/BatttestdataInfService.java | 196 ++++++++++++++++++++++++++++++++++-------------- 1 files changed, 137 insertions(+), 59 deletions(-) diff --git a/src/main/java/com/whyc/service/BatttestdataInfService.java b/src/main/java/com/whyc/service/BatttestdataInfService.java index b462679..6811e8c 100644 --- a/src/main/java/com/whyc/service/BatttestdataInfService.java +++ b/src/main/java/com/whyc/service/BatttestdataInfService.java @@ -57,11 +57,14 @@ @Autowired(required = false) private PwrdevHistorydataIdService pwrHisdataIdService; + @Autowired(required = false) + private BattresdataInfService battResdataInfService; + //鑾峰彇鏈�鍚庝竴娆℃祴璇曟暟鎹苟璁$畻鍓╀綑瀹归噺 - public Float getLastTestDataRestCap(Integer battgroupId) { + public Float getLastTestDataRestCap(Float moncapstd,Integer battgroupId) { //鑾峰彇鏀剧數璁板綍 QueryWrapper wrapper=new QueryWrapper(); wrapper.eq("battgroup_id",battgroupId); @@ -70,7 +73,7 @@ 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); + Float restcap = (float) BattCapFactory.GetMonomerCap(moncapstd, hourRate, tinf.getTestCap(), tinf.getMaxMonvol(), tinf.getMinMonvol(), tinf.getGroupVol(), BattCapFactory.CapType_Rest); return restcap; }else{ return 0f; @@ -82,17 +85,18 @@ List<BatttestdataInf> list=mapper.getBattTinfStatistic(stic); if(list!=null&&list.size()>0){ for (BatttestdataInf tinf:list) { + //鑾峰彇鐢垫睜缁勪俊鎭� + BattInf binf=battInfService.getBinfByBattgroupId(tinf.getBattgroupId()); //鍓╀綑瀹归噺鍜屽墿浣欐椂闂磋绠� 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); + Float restCap = (float) BattCapFactory.GetMonomerCap(binf.getMoncapstd(), hourRate, tinf.getTestCap(), tinf.getMaxMonvol(), tinf.getMinMonvol(), tinf.getGroupVol(), BattCapFactory.CapType_Rest); + Float realCap = (float) BattCapFactory.GetMonomerCap(binf.getMoncapstd(), 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.getLoadCurr(), restCap, binf.getMoncapstd()); @@ -193,7 +197,7 @@ 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); + realCap = (float) BattCapFactory.GetMonomerCap(binf.getMoncapstd(), hourRate, tinf.getTestCap(), tinf.getMaxMonvol(),data.getMonVol() , tinf.getGroupVol(), BattCapFactory.CapType_Real); SticMonRes res=new SticMonRes(); res.setBattgroupId(binf.getBattgroupId()); res.setBattgroupName(binf.getBattgroupName()); @@ -260,8 +264,8 @@ } } /*钃勭數姹犵粍瀵规瘮鍒嗘瀽鐣岄潰锛堝悓涓�鍝佺墝鍚屼竴鏃堕棿锛� - *1.鏌ヨ鍑虹鍚堟潯浠剁殑鐢垫睜缁勪俊鎭� - * 2.璁$畻鐢垫睜缁勭殑棰勪及鍓╀綑瀹归噺 + *1.鏌ヨ鍑虹鍚堟潯浠剁殑鐢垫睜缁勪俊鎭紙鍚屼竴鍝佺墝鍚屼竴鎶曡繍鏃堕棿锛� + * 2.璁$畻鐢垫睜缁勭殑鏈�杩戜竴娆℃爣鍑嗘牳瀹规斁鐢电殑棰勪及瀹归噺 *3.鍒ゆ柇鎬ц兘鍜岀櫨鍒嗘瘮 * 4.鍒嗛〉 */ @@ -280,12 +284,25 @@ } } } + Map<String,Object> map=new HashMap<>();//鍙充晶鍥捐〃 + map.put("avgCap",0f); + map.put("standCapDiff",0f); + Float sumCap=0f; + Float maxCap=0f; + Float minCap=0f; + Float standCapDiff=0f; + List<ComPareChart> capList=new ArrayList<>(); + List<ComPareChart> resList=new ArrayList<>(); + List<ComPareChart> flotVolList=new ArrayList<>(); + map.put("capList",capList); + map.put("resList",resList); + map.put("flotVolList",flotVolList); //1鏌ヨ绗﹀悎鏉′欢鐨勭數姹犵粍 List<BattInf> binfList=battInfService.getBattCompare15Statistic(stic); if(binfList==null||binfList.size()==0){ return new Response().set(1,false,"褰撳墠鐢ㄦ埛鏈鐞嗘弧瓒虫潯浠剁殑鐢垫睜缁�"); } - List<SticCompare15Res> reslist=new ArrayList<>(); + List<SticCompare15Res> comparelist=new ArrayList<>(); for (BattInf binf:binfList) { SticCompare15Res res=new SticCompare15Res(); res.setProvice(binf.getProvice()); @@ -305,54 +322,73 @@ BatttestdataInf tinf =getLastStandardTestDataByTime(binf.getBattgroupId(),stic.getTestStartTime(),stic.getTestEndTime()); if(tinf==null){ res.setRealCap(0f); - res.setPrecentCap("0"); + res.setPrecentCap("0.00000"); res.setCapperformance(BattCapperformanceEnum.getValue(BattCapperformanceEnum.BATTSTATE_4.getStateId())); - continue; - } - //鎵捐繖娆℃斁鐢电殑鏈�鍚庝竴绗旀暟鎹� - List<BatttestdataId> idDataList=battTestdataIdService.getLastDataByBattgroupId(tinf.getBattgroupId(),tinf.getTestRecordCount(),tinf.getRecordNum()); - if(idDataList==null||idDataList.size()==0){ - res.setRealCap(0f); - res.setPrecentCap("0"); - res.setCapperformance(BattCapperformanceEnum.getValue(BattCapperformanceEnum.BATTSTATE_4.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(BattCapperformanceEnum.getValue(BattCapperformanceEnum.BATTSTATE_1.getStateId())); - } - if(grouprealCap<=moncapStd*damageValue){ - res.setCapperformance(BattCapperformanceEnum.getValue(BattCapperformanceEnum.BATTSTATE_3.getStateId())); - } - if((grouprealCap>moncapStd*damageValue)&&(grouprealCap<moncapStd*badValue)){ - res.setCapperformance(BattCapperformanceEnum.getValue(BattCapperformanceEnum.BATTSTATE_2.getStateId())); - } - //淇濈暀5浣嶅皬鏁� - String precentCap = String.format("%.5f",(grouprealCap/binf.getMoncapstd()*100)); - res.setPrecentCap(precentCap); - List<Integer> 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.setStopReason("--"); + res.setFloatGroupVol(0f); + }else{ + res.setStopReason(StopReasonEnum.getValue(tinf.getTestStoptype())); + res.setFloatGroupVol(tinf.getFloatGroupVol()); + //鎵捐繖娆℃斁鐢电殑鏈�鍚庝竴绗旀暟鎹� + List<BatttestdataId> idDataList=battTestdataIdService.getLastDataByBattgroupId(tinf.getBattgroupId(),tinf.getTestRecordCount(),tinf.getRecordNum()); + if(idDataList==null||idDataList.size()==0){ + res.setRealCap(0f); + res.setPrecentCap("0.00000"); + res.setCapperformance(BattCapperformanceEnum.getValue(BattCapperformanceEnum.BATTSTATE_4.getStateId())); + res.setFloatGroupVol(0f); + }else{ + Float moncapStd=binf.getMoncapstd(); + int hourRate = BattCapFactory.GetHourRate(tinf.getTestCap(), tinf.getTestCurr()); + Float grouprealCap = (float) BattCapFactory.GetMonomerCap(binf.getMoncapstd(), hourRate, tinf.getTestCap(), tinf.getMaxMonvol(), tinf.getMinMonvol(), tinf.getGroupVol(), BattCapFactory.CapType_Real); + //Float restCap = (float) BattCapFactory.GetMonomerCap(binf.getMoncapstd(), hourRate, tinf.getTestCap(), tinf.getMaxMonvol(), tinf.getMinMonvol(), tinf.getGroupVol(), BattCapFactory.CapType_Rest); + res.setRealCap(grouprealCap); + if(grouprealCap>=moncapStd*badValue){ + res.setCapperformance(BattCapperformanceEnum.getValue(BattCapperformanceEnum.BATTSTATE_1.getStateId())); + } + if(grouprealCap<=moncapStd*damageValue){ + res.setCapperformance(BattCapperformanceEnum.getValue(BattCapperformanceEnum.BATTSTATE_3.getStateId())); + } + if((grouprealCap>moncapStd*damageValue)&&(grouprealCap<moncapStd*badValue)){ + res.setCapperformance(BattCapperformanceEnum.getValue(BattCapperformanceEnum.BATTSTATE_2.getStateId())); + } + //淇濈暀5浣嶅皬鏁� + String precentCap = String.format("%.5f",(grouprealCap/binf.getMoncapstd()*100)); + res.setPrecentCap(precentCap); + sumCap+=grouprealCap; + if(grouprealCap>=maxCap){ + maxCap=grouprealCap; + } + if(grouprealCap<=minCap){ + minCap=grouprealCap; + } } } - res.setMonNums(monNums); if(stic.getPerformance()==null){ - reslist.add(res); + comparelist.add(res); }else{ if(res.getCapperformance().equals(BattCapperformanceEnum.getValue(stic.getPerformance()))){ - reslist.add(res); + comparelist.add(res); } } - + ComPareChart capChart=new ComPareChart(); + capChart.setBattgroupId(binf.getBattgroupId()); + capChart.setBattgroupName(binf.getBattgroupName()); + capChart.setValue(res.getRealCap()); + capList.add(capChart); + ComPareChart floatVolChart=new ComPareChart(); + floatVolChart.setBattgroupId(binf.getBattgroupId()); + floatVolChart.setBattgroupName(binf.getBattgroupName()); + floatVolChart.setValue(res.getFloatGroupVol()); + flotVolList.add(floatVolChart); + //缁熻鍐呴樆娴嬭瘯 + ComPareChart resChart=battResdataInfService.getMaxResData(binf); + resList.add(resChart); } - PageInfo pageInfo=PageInfoUtils.list2PageInfo(reslist, stic.getPageNum(), stic.getPageSize()); - return new Response().setII(1,reslist.size()>0,pageInfo,"钃勭數姹犵粍瀵规瘮鍒嗘瀽鐣岄潰锛堝悓涓�鍝佺墝鍚屼竴鏃堕棿锛�"); + map.put("avgCap",sumCap/binfList.size()); + map.put("standCapDiff",maxCap-minCap); + + PageInfo pageInfo=PageInfoUtils.list2PageInfo(comparelist, stic.getPageNum(), stic.getPageSize()); + return new Response().setIII(1,comparelist.size()>0,pageInfo,map,"钃勭數姹犵粍瀵规瘮鍒嗘瀽鐣岄潰锛堝悓涓�鍝佺墝鍚屼竴鏃堕棿锛�"); } //钃勭數姹犵粍瀵规瘮鍒嗘瀽鐣岄潰锛堜笉鍚屽搧鐗屽悓涓�鏃堕棿锛�(1.2.16) @@ -406,8 +442,8 @@ res.setStopReason(StopReasonEnum.getValue(tinf.getTestStoptype())); 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); + Float grouprealCap = (float) BattCapFactory.GetMonomerCap(binf.getMoncapstd(), hourRate, tinf.getTestCap(), tinf.getMaxMonvol(), tinf.getMinMonvol(), tinf.getGroupVol(), BattCapFactory.CapType_Real); + //Float restCap = (float) BattCapFactory.GetMonomerCap(binf.getMoncapstd(), hourRate, tinf.getTestCap(), tinf.getMaxMonvol(), tinf.getMinMonvol(), tinf.getGroupVol(), BattCapFactory.CapType_Rest); res.setRealCap(grouprealCap); if(grouprealCap>=moncapStd*badValue){ res.setCapperformance(BattCapperformanceEnum.getValue(BattCapperformanceEnum.BATTSTATE_1.getStateId())); @@ -491,7 +527,7 @@ res.setPowerId(binf.getPowerId()); res.setDevId(binf.getDevId()); res.setBattgroupId(binf.getBattgroupId()); - Float monrealCap = (float) BattCapFactory.GetMonomerCap(tinf.getTestCap(), hourRate, tinf.getTestCap(), tinf.getMaxMonvol(), data.getMonVol(), tinf.getGroupVol(), BattCapFactory.CapType_Real); + Float monrealCap = (float) BattCapFactory.GetMonomerCap(binf.getMoncapstd(), hourRate, tinf.getTestCap(), tinf.getMaxMonvol(), data.getMonVol(), tinf.getGroupVol(), BattCapFactory.CapType_Real); res.setMonrealCap(monrealCap); //淇濈暀5浣嶅皬鏁� String monprecentCap = String.format("%.5f",(monrealCap/binf.getMoncapstd()*100)); @@ -572,16 +608,16 @@ dto.setRecordNum(tinf.getRecordNum()); dto.setTestCap(tinf.getTestCap()); dto.setTestTimeLong(tinf.getTestTimelong()); - int hourRate = BattCapFactory.GetHourRate(tinf.getTestCap(), tinf.getTestCurr()); - Float realCap = (float) BattCapFactory.GetMonomerCap(tinf.getTestCap(), hourRate, tinf.getTestCap(), tinf.getMaxMonvol(), tinf.getMinMonvol(), tinf.getGroupVol(), BattCapFactory.CapType_Real); - dto.setRealCap(realCap); - //瀹炴椂鑾峰彇鐢垫睜缁勪俊鎭� - BattRtstate battRtstate = rtstateService.getBattRealInfo(tinf.getBattgroupId()); //鑾峰彇鐢垫睜缁勪俊鎭� BattInf binf = battInfService.getBinfByBattgroupId(tinf.getBattgroupId()); dto.setMoncapstd(binf.getMoncapstd()); dto.setMonCount(binf.getMoncount()); dto.setMonvolstd(binf.getMonvolstd()); + int hourRate = BattCapFactory.GetHourRate(tinf.getTestCap(), tinf.getTestCurr()); + Float realCap = (float) BattCapFactory.GetMonomerCap(binf.getMoncapstd(), hourRate, tinf.getTestCap(), tinf.getMaxMonvol(), tinf.getMinMonvol(), tinf.getGroupVol(), BattCapFactory.CapType_Real); + dto.setRealCap(realCap); + //瀹炴椂鑾峰彇鐢垫睜缁勪俊鎭� + BattRtstate battRtstate = rtstateService.getBattRealInfo(tinf.getBattgroupId()); dto.setFloatchartVol(tinf.getFloatGroupVol()); if(battRtstate!=null){ Float restTime= BattCapFactory.getTheoryTime(battRtstate.getLoadCurr(), realCap, binf.getMoncapstd()); @@ -693,7 +729,7 @@ res.setTestRecordCount(tinf.getTestRecordCount()); 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 grouprealCap = (float) BattCapFactory.GetMonomerCap(binf.getMoncapstd(), hourRate, tinf.getTestCap(), tinf.getMaxMonvol(), tinf.getMinMonvol(), tinf.getGroupVol(), BattCapFactory.CapType_Real); res.setRealCap(grouprealCap); //res.setDisChargeType(1); if(grouprealCap>=moncapStd*badValue){ @@ -869,7 +905,7 @@ }else{ 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 grouprealCap = (float) BattCapFactory.GetMonomerCap(binf.getMoncapstd(), hourRate, tinf.getTestCap(), tinf.getMaxMonvol(), tinf.getMinMonvol(), tinf.getGroupVol(), BattCapFactory.CapType_Real); res.setRealCap(grouprealCap); if(grouprealCap>=moncapStd*badValue){ res.setCapperformance(BattCapperformanceEnum.getValue(BattCapperformanceEnum.BATTSTATE_1.getStateId())); @@ -1012,4 +1048,46 @@ wrapper.last(" limit 1"); return mapper.selectOne(wrapper); } + //鐐瑰嚮鍙充晶鎶樼嚎鍥剧敾鍑虹數姹犵粍鎵�鏈夊畬鏁村懆鏈熺殑瀹為檯瀹归噺鍙樺寲鍥�(1.2.15/16/17) + public Response getRealCapChangeByBattgroupId(Integer battgroupId) { + QueryWrapper wrapper = new QueryWrapper(); + wrapper.eq("battgroup_id", battgroupId); + wrapper.eq("test_type", 3); + wrapper.eq("test_starttype", 3); + wrapper.eq("data_available", 1);//涓�娆℃湁鏁堢殑璁板綍 + wrapper.last(" ORDER BY test_starttime DESC "); + List<BatttestdataInf> list = mapper.selectList(wrapper); + //鑾峰彇鐢垫睜缁勭殑鏍囩О瀹归噺 + BattInf binf=battInfService.getBattgroupIdInf(battgroupId); + List<ComPareChangeCurve> curvelist=new ArrayList<>(); + for (BatttestdataInf tinf:list) { + int hourRate = BattCapFactory.GetHourRate(tinf.getTestCap(), tinf.getTestCurr()); + Float realCap = (float) BattCapFactory.GetMonomerCap(binf.getMoncapstd(), hourRate, tinf.getTestCap(), tinf.getMaxMonvol(), tinf.getMinMonvol(), tinf.getGroupVol(), BattCapFactory.CapType_Real); + ComPareChangeCurve curve=new ComPareChangeCurve(); + curve.setBattgroupId(battgroupId); + curve.setStartTime(tinf.getTestStarttime()); + curve.setCurveValue(realCap); + curvelist.add(curve); + } + return new Response().setII(1,list.size()>0,curvelist,"鐐瑰嚮鍙充晶鎶樼嚎鍥剧敾鍑虹數姹犵粍鎵�鏈夊畬鏁村懆鏈熺殑瀹為檯瀹归噺鍙樺寲鍥�(1.2.15/16/17)"); + } + //鐐瑰嚮鍙充晶鎶樼嚎鍥剧敾鍑虹數姹犵粍鎵�鏈夊畬鏁村懆鏈熺殑娴厖鐢靛帇鍙樺寲鍥�(1.2.15/16/17) + public Response getFloatGroupVolChangeByBattgroupId(Integer battgroupId) { + QueryWrapper wrapper = new QueryWrapper(); + wrapper.eq("battgroup_id", battgroupId); + wrapper.eq("test_type", 3); + wrapper.eq("test_starttype", 3); + wrapper.eq("data_available", 1);//涓�娆℃湁鏁堢殑璁板綍 + wrapper.last(" ORDER BY test_starttime asc "); + List<BatttestdataInf> list = mapper.selectList(wrapper); + List<ComPareChangeCurve> curvelist=new ArrayList<>(); + for (BatttestdataInf tinf:list) { + ComPareChangeCurve curve=new ComPareChangeCurve(); + curve.setBattgroupId(battgroupId); + curve.setStartTime(tinf.getTestStarttime()); + curve.setCurveValue(tinf.getFloatGroupVol()); + curvelist.add(curve); + } + return new Response().setII(1,list.size()>0,curvelist,"鐐瑰嚮鍙充晶鎶樼嚎鍥剧敾鍑虹數姹犵粍鎵�鏈夊畬鏁村懆鏈熺殑娴厖鐢靛帇鍙樺寲鍥�(1.2.15/16/17)"); + } } \ No newline at end of file -- Gitblit v1.9.1