onlyliuxin / coding2017

218 stars 643 forks source link

求大神给出重构建议 #534

Open guodongym opened 7 years ago

guodongym commented 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;
        }
    }
}