Open guodongym opened 7 years ago
package com.bitnei.report.component; import com.bitnei.report.pojo.nationalBean.Column2; import com.bitnei.report.service.INationalService; import com.bitnei.report.service.IRedisService; import com.bitnei.report.util.BigDecimalUtil; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import java.math.BigDecimal; import java.util.HashMap; import java.util.List; import java.util.Map; /** * Created by IntelliJ IDEA. * User: zhaogd * Date: 2017/7/27 */ @Component public class EmissionReductionComponent { @Autowired private INationalService nationalService; @Autowired private IRedisService redisService; /** * 获取某区域车辆数 * * @param areaId 区域ID * @return 车辆数量 */ public String getCarCount(String areaId) { if (StringUtils.isBlank(areaId)) { areaId = "0"; } return redisService.hGet("STATISTIC.DISTRICTS." + areaId, "car_total", 9); } /** * 获取某个区域碳减排信息 * * @param areaId 区域ID * @return 碳减排 */ public HashMap<String, String> getEmissionReductionByArea(String areaId) { BigDecimal mil = new BigDecimal(0); BigDecimal oil = new BigDecimal(0); BigDecimal ele = new BigDecimal(0); BigDecimal co2 = new BigDecimal(0); if (StringUtils.isBlank(areaId)) { areaId = "0"; } List<Column2> dictList = getDictList(); for (Column2 dict : dictList) { String mileage = redisService.hGet("CARINFO.DISTRICTS." + areaId + "." + dict.getColumn1(), "mileage_total", 9); Co2OfCarType co2OfCarType = new Co2OfCarType(mil, oil, ele, co2, dict, mileage).invoke(); mil = co2OfCarType.getMil(); oil = co2OfCarType.getOil(); ele = co2OfCarType.getEle(); co2 = co2OfCarType.getCo2(); } HashMap<String, String> hashMap = new HashMap<>(); hashMap.put("mil", BigDecimalUtil.div(mil.toString(), "10000", 1).toString()); hashMap.put("oil", BigDecimalUtil.div(oil.toString(), "10000", 1).toString()); hashMap.put("ele", BigDecimalUtil.div(ele.toString(), "10000", 1).toString()); hashMap.put("co2", BigDecimalUtil.div(co2.toString(), "10000", 1).toString()); return hashMap; } /** * 计算厂商的碳减排及故障数,充电数 * * @param unitId 厂商ID * @return 总里程,总耗油,总耗电,碳减排,故障车辆数,充电车辆数 */ public HashMap<String, String> getEmissionReductionByUnit(String unitId) { BigDecimal mil = new BigDecimal(0); BigDecimal oil = new BigDecimal(0); BigDecimal ele = new BigDecimal(0); BigDecimal co2 = new BigDecimal(0); Integer faultCount = 0; Integer chargeCount = 0; List<Column2> dictList = getDictList(); for (Column2 dict : dictList) { Map<String, String> map = redisService.hGet("PLANTCAR." + unitId + ".CARTYPE." + dict.getColumn1(), 9); if (map.isEmpty()) { continue; } faultCount += Integer.valueOf(map.get("fault_count")); chargeCount += Integer.valueOf(map.get("charge_car_count")); String mileage = map.get("mileage_total"); Co2OfCarType co2OfCarType = new Co2OfCarType(mil, oil, ele, co2, dict, mileage).invoke(); mil = co2OfCarType.getMil(); oil = co2OfCarType.getOil(); ele = co2OfCarType.getEle(); co2 = co2OfCarType.getCo2(); } HashMap<String, String> hashMap = new HashMap<>(); hashMap.put("mil", BigDecimalUtil.div(mil.toString(), "10000", 1).toString()); hashMap.put("oil", BigDecimalUtil.div(oil.toString(), "10000", 1).toString()); hashMap.put("ele", BigDecimalUtil.div(ele.toString(), "10000", 1).toString()); hashMap.put("co2", BigDecimalUtil.div(co2.toString(), "10000", 1).toString()); hashMap.put("faultCount", faultCount.toString()); hashMap.put("chargeCount", chargeCount.toString()); return hashMap; } /** * 获取所有车型及油耗,电耗 * * @return 车型信息 */ private List<Column2> getDictList() { return nationalService.dictByCode(new HashMap<String, String>()); } private class EleAndOilOfPerKilometre { private Column2 dict; private String eleOfPerKilometre; private String oilOfPerKilometre; public EleAndOilOfPerKilometre(Column2 dict) { this.dict = dict; } public String getEleOfPerKilometre() { return eleOfPerKilometre; } public String getOilOfPerKilometre() { return oilOfPerKilometre; } public EleAndOilOfPerKilometre invoke() { eleOfPerKilometre = new BigDecimal(0.2).toString(); oilOfPerKilometre = new BigDecimal(0.1).toString(); if (!StringUtils.isEmpty(dict.getColumn2()) && dict.getColumn2().contains(",")) { String[] note = dict.getColumn2().split(","); if (note.length >= 4) { eleOfPerKilometre = BigDecimalUtil.div(note[2], "100").toString(); oilOfPerKilometre = BigDecimalUtil.div(note[3], "100").toString(); } } return this; } } private class Co2OfCarType { private BigDecimal mil; private BigDecimal oil; private BigDecimal ele; private BigDecimal co2; private Column2 dict; private String mileage; public Co2OfCarType(BigDecimal mil, BigDecimal oil, BigDecimal ele, BigDecimal co2, Column2 dict, String mileage) { this.mil = mil; this.oil = oil; this.ele = ele; this.co2 = co2; this.dict = dict; this.mileage = mileage; } public BigDecimal getMil() { return mil; } public BigDecimal getOil() { return oil; } public BigDecimal getEle() { return ele; } public BigDecimal getCo2() { return co2; } public Co2OfCarType invoke() { // 缓存中里程单位为0.1公里,除以10为公里数 mileage = BigDecimalUtil.div(mileage, "10").toString(); // 每公里耗油和耗电 EleAndOilOfPerKilometre eleAndOilOfPerKilometre = new EleAndOilOfPerKilometre(dict).invoke(); String eleOfPerKilometre = eleAndOilOfPerKilometre.getEleOfPerKilometre(); String oilOfPerKilometre = eleAndOilOfPerKilometre.getOilOfPerKilometre(); //耗电量,单位为度 String eleOfCarType = BigDecimalUtil.mul(mileage, eleOfPerKilometre).toString(); //节油量,单位升 String oilOfCarType = BigDecimalUtil.mul(mileage, oilOfPerKilometre).toString(); //累计碳减排,单位为吨 String co2OfCarType = BigDecimalUtil.mul(oilOfCarType, "0.003225").subtract(BigDecimalUtil.mul(eleOfCarType, "0.0005")).toString(); mil = BigDecimalUtil.add(mil.toString(), mileage); oil = BigDecimalUtil.add(oil.toString(), oilOfCarType); ele = BigDecimalUtil.add(ele.toString(), eleOfCarType); co2 = BigDecimalUtil.add(co2.toString(), co2OfCarType); return this; } } }