//
//import io.swagger.annotations.ApiModel;
//import io.swagger.annotations.ApiModelProperty;
//import lombok.Getter;
//import lombok.Setter;
//
//import java.io.Serializable;
//import java.util.ArrayList;
//import java.util.List;
//
///**
// * 投资方案相关数据--返回结果
// * 入参查询对象
// *
// * @author Robin
// * @date 2020-09-07
// */
//@Setter
//@Getter
//@ApiModel("投资方案返回结果")
//public class Scheme2 implements Comparable<Scheme2>, Serializable {
//    private int minYears = 0;
//    private int maxYears = 25;
//
//    @ApiModelProperty("治理方案类型")
//    String schemeType;
//    @ApiModelProperty("治理方案类型名称")
//    String schemeTypeName;
//    @ApiModelProperty("治理方案描述")
//    String schemeDescription;
//    // 初始投资额
//    @ApiModelProperty("初始投资额")
//    Double schemeEquipment;
//    // 每年维护费
//    @ApiModelProperty("每年维护费")
//    Double schemeMaintain;
//
//    //被选中的设备总功率
//    @ApiModelProperty("被选中的串型设备总功率")
//    Double totalPower1 = 0.0;
//    @ApiModelProperty("被选中的并型设备总功率")
//    Double totalPower2 = 0.0;
//
//    //治理设备的尺寸
//    @ApiModelProperty("串型治理设备的尺寸")
//    String governDeviceSize1;
//    @ApiModelProperty("并型治理设备的尺寸")
//    String governDeviceSize2;
//
//    //治理设备的功率
//    @ApiModelProperty("串型治理设备的功率")
//    Double governDevicePower1;
//    @ApiModelProperty("并型治理设备的功率")
//    Double governDevicePower2;
//
//    //所需治理设备数量
//    @ApiModelProperty("所需串型治理设备数量")
//    Integer governDeviceQty1;
//    @ApiModelProperty("所需并型治理设备数量")
//    Integer governDeviceQty2;
//
//    //预期投资回收期
//    @ApiModelProperty("预期投资回收期")
//    Double expectPeriod = 0D;
//    //实际投资回收期(大略值)
//    @ApiModelProperty("实际投资回收期(大略值)")
//    Integer practialPeriod = 0;
//    //实际投资回收期(精确值)
//    @ApiModelProperty("实际投资回收期(精确值)")
//    Double practialPeriod2 = 0.0;
//
//    //年平均治理效果,用于判断最优投资的标准
//    @ApiModelProperty("年平均治理效果")
//    Double grovenResult = 0D;
//
//    //雷达图相关数据
//    //治理效果
//    @ApiModelProperty("雷达图治理效果")
//    Double radarResult = 0D;
//    //投资意愿
//    @ApiModelProperty("雷达图投资意愿")
//    Double radarWish = 0D;
//    //抗风险能力
//    @ApiModelProperty("雷达图抗风险能力")
//    Double radarRisk = 0D;
//    //免疫力
//    @ApiModelProperty("雷达图免疫力")
//    Double radarRmmunity = 0D;
//    //方案优先级指数
//    @ApiModelProperty("雷达图方案优先级指数")
//    Double optimizingResult = 0D;
//
//    //被治理设备组合
//    @ApiModelProperty("被治理设备组合")
//    ActiveDevices activeDevices;
//    //被治理设备组合中的串型设备
//    @ApiModelProperty("被治理设备组合中的串型设备")
//    List<ProductDevice> devices1 = new ArrayList<ProductDevice>();
//    @ApiModelProperty("被治理设备组合中的串型设备名称")
//    List<String> deviceNames1 = new ArrayList<String>();
//    //被治理设备组合中的并型设备
//    @ApiModelProperty("被治理设备组合中的并型设备")
//    List<ProductDevice> devices2 = new ArrayList<ProductDevice>();
//    @ApiModelProperty("被治理设备组合中的并型设备名称")
//    List<String> deviceNames2 = new ArrayList<String>();
//
//    //10kV快切开关的进线组合
//    @ApiModelProperty("10kV快切开关的进线组合")
//    List<String> inlineCombinationList = new ArrayList();
//    @ApiModelProperty("10kV快切开关的进线组合名称")
//    List<String> inlineCombinationListEx = new ArrayList();
//
//    //风险等级(治理前)
//    @ApiModelProperty("风险等级(治理前)")
//    double riskLevel1 = 2;
//    @ApiModelProperty("风险等级名称(治理前)")
//    String riskLevelName1 = "二级";
//    //风险等级(治理后)
//    @ApiModelProperty("风险等级(治理后)")
//    double riskLevel2 = 5;
//    @ApiModelProperty("风险等级名称(治理后)")
//    String riskLevelName2 = "五级";
//
//    //治理前暂降次数
//    @ApiModelProperty("治理前暂降次数")
//    private int eventCount1 = 0;
//    //治理前中断次数
//    @ApiModelProperty("治理前中断次数")
//    private int offCount1 = 0;
//
//    //治理后暂降次数
//    @ApiModelProperty("治理后暂降次数")
//    private int eventCount2 = 0;
//    //治理后中断次数
//    @ApiModelProperty("治理后中断次数")
//    private int offCount2 = 0;
//
//
//    //投资
//    @ApiModelProperty("每年投资")
//    Double[] tz;
//    @ApiModelProperty("每年投资累计")
//    Double[] tzTotal;
//    //效果
//    @ApiModelProperty("每年治理效果")
//    Double[] xg;
//    @ApiModelProperty("每年治理效果累计")
//    Double[] xgTotal;
//    //收益
//    @ApiModelProperty("每年收益")
//    Double[] sy;
//    @ApiModelProperty("每年收益累计")
//    Double[] syTotal;
//    //收益率
//    @ApiModelProperty("每年收益率")
//    Double[] syRate;
//
//    //治理前的最大年损失
//    @ApiModelProperty("治理前的最大年损失")
//    double unGovernLossMax = 0;
//    //治理前的年平均损失
//    @ApiModelProperty("治理前的年平均损失")
//    double unGovernLossAverage = 0;
//    //治理后的年平均损失
//    @ApiModelProperty("治理后的年平均损失")
//    double governLossAverage = 0;
//
//
////    public Scheme2(){
////        super();
////    }
//
//    private String getLevelName(double level) {
//        String[] levelName = {"一级", "二级", "三级", "四级", "五级"};
//        if (level >= 0 && level < 0.2) {
//            return levelName[0];
//        } else if (level >= 0.2 && level < 0.4) {
//            return levelName[1];
//        } else if (level >= 0.4 && level < 0.6) {
//            return levelName[2];
//        } else if (level >= 0.6 && level < 0.8) {
//            return levelName[3];
//        } else if (level >= 0.8 && level <= 1.0) {
//            return levelName[4];
//        }
//        return "异常了！";
//    }
//
//    public Scheme2(int listSize) {
//        super();
//        this.minYears = listSize;
//        if (listSize > this.maxYears)
//            this.maxYears = listSize;
//        //投资
//        tz = new Double[this.maxYears];
//        //效果
//        xg = new Double[this.maxYears];
//        //收益
//        sy = new Double[this.maxYears];
//
//        tzTotal = new Double[this.maxYears];
//        xgTotal = new Double[this.maxYears];
//        syTotal = new Double[this.maxYears];
//
//        syRate = new Double[this.maxYears];
//
//        for (int i = 0; i < this.maxYears; i++) {
//            tz[i] = 0.0;
//            xg[i] = 0.0;
//            sy[i] = 0.0;
//            tzTotal[i] = 0.0;
//            xgTotal[i] = 0.0;
//            syTotal[i] = 0.0;
//            syRate[i] = 0.0;
//        }
//    }
//
//
//    public void processData(int i, ActiveDevices devices, Double loss) {
//        if (ObjectUtil.empty(loss)) {
//            loss = 0D;
//        }
//        this.activeDevices = devices;
//        xg[i] += loss;
//    }
//
//    public void processTZ(Double equipment, Double maintain) {
////        if(equipment==812){
////            System.out.print("");
////        }
//        this.schemeEquipment = equipment;
//        this.schemeMaintain = maintain;
//
//        for (int i = 0; i < this.tz.length; i++) {
//            if (i == 0) {
//                this.tz[i] = equipment;
//                this.tzTotal[i] = equipment;
//                //this.sy[i] += 0-equipment;
//            } else {
//                this.tz[i] = maintain;
//                this.tzTotal[i] = tzTotal[i - 1] + maintain;
//                //this.sy[i] += 0-maintain;
//            }
//        }
//    }
//
//    public void processXG(Double value) {
//        //总的治理效果,用于排序
//        this.grovenResult = value;
//
//        for (int i = 0; i < this.xg.length; i++) {
//            this.xg[i] = value;
//            if (i == 0) {
//                this.xgTotal[i] = value;
//            } else {
//                this.xgTotal[i] = xgTotal[i - 1] + value;
//            }
//        }
//    }
//
//    public void processSY() {
//        double small = 0.0, big = 0.0;
//        this.practialPeriod = 0;
//        //初始收益＝0-初始投资
//        this.sy[0] = 0 - this.tz[0];
//        this.syTotal[0] = 0 - this.tz[0];
//        if (this.sy[0] < 0) {
//            this.practialPeriod = 1;
//        }
//        if (ObjectUtil.notEmpty(this.syTotal[0]) && ObjectUtil.notEmpty(this.tzTotal[0]))
//            this.syRate[0] = this.syTotal[0] / this.tzTotal[0];
//
//        for (int i = 1; i < this.sy.length; i++) {
//            this.sy[i] = this.xg[i] - this.tz[i];// + this.sy[i - 1];
//            this.syTotal[i] = this.syTotal[i - 1] + this.sy[i];
//            if (this.syTotal[i] < 0) {
//                this.practialPeriod = this.practialPeriod + 1;
//            } else if (NumberUtil.equal(this.syTotal[i], 0.0)) {
//                this.practialPeriod2 = this.practialPeriod + 0.0;
//            }
//            if (this.syTotal[i - 1] < 0 && this.syTotal[i] > 0 && NumberUtil.equal(this.practialPeriod2, 0.0)) {
//                this.practialPeriod2 = this.practialPeriod - 1 + Math.abs(this.syTotal[i - 1]) / Math.abs(Math.abs(this.syTotal[i - 1]) + this.syTotal[i]);
//            }
//
//            // 计算收益率
//            if (!NumberUtil.equal(this.tzTotal[i], 0) && !NumberUtil.equal(this.syTotal[i], 0)) {
//                this.syRate[i] = this.syTotal[i] / this.tzTotal[i];
//            }
//        }
//
//        double last = this.sy[this.sy.length - 1];
//        if (last < 0) {
////            if(!NumberUtil.equal(this.xg[0], 0)) {
////                Number n = NumberUtil.div(Math.abs(last), this.xg[0]);
////                this.practialPeriod = this.practialPeriod + n.intValue() + 1;//可能多一年,不过无所谓
////            }
//            this.practialPeriod = -1;
//        }
//    }
//
//    /**
//     * 获得投资总额
//     *
//     * @return
//     */
//    public Double getTotalTz() {
//        if (this.minYears == 0 || this.tzTotal == null || this.tzTotal.length == 0) {
//            return 0D;
//        }
//        return this.tzTotal[this.minYears - 1];
//    }
//
//    public void formatData() {
//        if (schemeType.equals("A")) {
//            schemeTypeName = "串联型补偿设备";
//        } else if (schemeType.equals("B")) {
//            schemeTypeName = "并联型补偿设备";
//        } else if (schemeType.equals("AB")) {
//            schemeTypeName = "并联+串联";
//        } else if (schemeType.equals("C")) {
//            schemeTypeName = "380V快切开关";
//        } else if (schemeType.equals("D")) {
//            schemeTypeName = "10kV快切开关";
//        } else {
//            schemeTypeName = "无需治理";
//        }
//
//
//        this.riskLevel1 = getRadarRisk(this.unGovernLossAverage, 0.9);
////        if(this.riskLevel1>0.8) {
////            this.riskLevel1 = this.riskLevel1 - 0.1;
////        }
//        this.riskLevel2 = getRadarRisk(this.governLossAverage, 0.1);
////        if(this.riskLevel2>0.8) {
////            this.riskLevel2 = this.riskLevel2 - 0.1;
////        }
//
//        this.riskLevelName1 = getLevelName(1 - this.riskLevel1);
//        this.riskLevelName2 = getLevelName(1 - this.riskLevel2);
//
//        // 治理效果
//        // this.radarResult = this.xgTotal[minYears-1];
//        if (this.grovenResult == 0D || this.unGovernLossAverage == 0) {
//            this.radarResult = 0D;
//        } else {
//            this.radarResult = this.grovenResult / (Math.ceil(this.unGovernLossAverage / 100D) * 100);
//        }
//
//        // 去风险能力
//        this.radarRisk = this.riskLevel2 * 0.9;
//        // if(this.radarRisk>0.9){this.radarRisk = this.radarRisk * 0.9;}
//
//        // 投资意愿=（期望回收期上限—投资回收期）/期望回收期上限
//        if (ObjectUtil.notEmpty(this.expectPeriod) && !NumberUtil.equal(this.expectPeriod, 0)) {// && !NumberUtil.equal(this.expectPeriod,this.practialPeriod)
//            this.radarWish = Double.valueOf(NumberUtil.format((this.expectPeriod - this.practialPeriod2) / this.expectPeriod, "0.00"));
//        }
//
//        // 暂降免疫能力=（治理前暂降次数—治理后中断次数）/治理前暂降次数
//        if (ObjectUtil.notEmpty(this.eventCount1) && !NumberUtil.equal(this.eventCount1, 0)) {
//            this.radarRmmunity = Double.valueOf(NumberUtil.format(1.0D * (this.eventCount1 - this.offCount2) / this.eventCount1, "0.00"));
//        }
//
//        //风险能力
//        Double radarRiskFactor = 0.1070;
//        //投资意愿
//        Double radarWishFactor = 0.2538;
//        //暂降免疫能力
//        Double radarRmmunityFactor = 0.0443;
//        //治理效果
//        Double radarResultFactor = 0.5949;
//
//        //方案优先指数
//        this.optimizingResult = this.radarResult * radarResultFactor
//                + this.radarWish * radarWishFactor
//                + this.radarRisk * radarRiskFactor
//                + this.radarRmmunity * radarRmmunityFactor;
//
//        for (int i = 0; i < this.maxYears; i++) {
//            this.xg[i] = NumberUtil.round(this.xg[i], 2);
//            this.xgTotal[i] = NumberUtil.round(this.xgTotal[i], 2);
//            this.tz[i] = NumberUtil.round(this.tz[i], 2);
//            this.tzTotal[i] = NumberUtil.round(this.tzTotal[i], 2);
//            this.sy[i] = NumberUtil.round(this.sy[i], 2);
//            this.syTotal[i] = NumberUtil.round(this.syTotal[i], 2);
//            if (ObjectUtil.notEmpty(this.syRate[i])) {
//                this.syRate[i] = NumberUtil.round(this.syRate[i], 2);
//            }
//        }
//
//    }
//
//
//    /**
//     * 是不是因为也考虑一下回收年数呢?
//     *
//     * @param o
//     * @return
//     */
//    @Override
//    public int compareTo(Scheme2 o) {
//
//        int rInt = 0;
//        // 指数 越大越好
//        rInt = this.optimizingResult.compareTo(o.optimizingResult);
//
////        // 治理后中断次数越小越好
////        //rInt = Integer.compare(o.offCount2,this.offCount2);
////
////        // 治理效果越大越好
////        if(rInt == 0) {
////            Double d = 0D;
////            if (this.grovenResult != null && o.grovenResult != null) {
////                rInt = this.grovenResult.compareTo(o.grovenResult);
////            } else if (this.grovenResult == null && o.grovenResult != null) {
////                rInt = d.compareTo(o.grovenResult);
////            } else if (this.grovenResult != null && o.grovenResult == null) {
////                rInt = this.grovenResult.compareTo(d);
////            }
////        }
////
////        // 投资周期越小越好
////        if(rInt == 0){
////            rInt = o.practialPeriod.compareTo(this.practialPeriod);
////        }
////
////        // 投资越小越好
////        if(rInt == 0){
////            Double tz1 = this.getTotalTz();
////            Double tz2 = o.getTotalTz();
////            rInt = tz2.compareTo(tz1);
////        }
//        return -1 * rInt;
//    }
//
//    private Double getRadarRisk(double x, double y) {
//        return getN(x, y);
//    }
//
//    private double getN(double x, double y) {
//        double n = 0d;
//        double temp = 0d;
//        double[] b = getB(x, y);
//
//        for (int i = 0; i < a.length; i++) {
//            int j = 0;
//            for (; j < b.length; j++) {
//                temp = temp + Math.abs(a[i][j] - b[j]);
//            }
//            temp = 1 - temp / j;
//            if (temp > n) {
//                n = temp;
//            }
//        }
//        return n;
//    }
//
//    private double[] getB(double x, double y) {
//        double[] b = {0, 0, 0, 0, 0};
//        double[] l = getLossDegree(x);
//        double[] o2 = getOther3Degree(y);
//        double[] o3 = o2;
//        double[] o4 = o2;
//        for (int i = 0; i < b.length; i++) {
//            b[i] = w[0] * l[i]
//                    + w[1] * o2[i]
//                    + w[2] * o3[i]
//                    + w[3] * o4[i];
//        }
//        return b;
//    }
//
//    ;
//
//    private static double[] w = {0.565, 0.2622, 0.1175, 0.0553};
//    private static int[][] a = {{1, 0, 0, 0, 0}, {0, 1, 0, 0, 0}, {0, 0, 1, 0, 0}, {0, 0, 0, 1, 0}, {0, 0, 0, 0, 1}};
//
//    private double[] getLossDegree(double x) {
//        double[] r = {0, 0, 0, 0, 0};
//        //0A1
//        if (x < 10) {
//            r[0] = 1;
//        } else if (x >= 10 && x < 25) {
//            r[0] = (25 - x) / (25 - 10);
//        }
//        //1B1
//        if (x >= 5 && x < 20) {
//            r[1] = (x - 5) / (20 - 5);
//        } else if (x >= 20 && x < 30) {
//            r[1] = 1;
//        } else if (x >= 30 && x < 45) {
//            r[1] = (45 - x) / (45 - 30);
//        }
//        //2C1
//        if (x >= 25 && x < 40) {
//            r[2] = (x - 25) / (40 - 25);
//        } else if (x >= 40 && x < 50) {
//            r[2] = 1;
//        } else if (x >= 50 && x < 65) {
//            r[2] = (65 - x) / (65 - 50);
//        }
//        //3D1
//        if (x >= 45 && x < 60) {
//            r[3] = (x - 45) / (60 - 45);
//        } else if (x >= 60 && x < 70) {
//            r[3] = 1;
//        } else if (x >= 70 && x < 85) {
//            r[3] = (85 - x) / (85 - 70);
//        }
//        //4E1
//        if (x >= 65 && x < 80) {
//            r[4] = (x - 65) / (80 - 65);
//        } else if (x >= 80) {
//            r[4] = 1;
//        }
//        return r;
//    }
//
//    private double[] getOther3Degree(double y) {
//        double[] r = {0, 0, 0, 0, 0};
//        //0A2
//        if (y < 11) {
//            r[0] = 1;
//        } else if (y >= 1 && y < 2.5) {
//            r[0] = (2.5 - y) / (2.5 - 1.0);
//        }
//        //1B1
//        if (y >= 0.5 && y < 2.0) {
//            r[1] = (y - 0.5) / (2.0 - 0.5);
//        } else if (y >= 2.0 && y < 3.0) {
//            r[1] = 1;
//        } else if (y >= 3.0 && y < 4.5) {
//            r[1] = (4.5 - y) / (4.5 - 3.0);
//        }
//        //2C1
//        if (y >= 2.5 && y < 4.0) {
//            r[2] = (y - 2.5) / (4.0 - 2.5);
//        } else if (y >= 4.0 && y < 5.0) {
//            r[2] = 1;
//        } else if (y >= 5.0 && y < 6.5) {
//            r[2] = (6.5 - y) / (6.5 - 5.0);
//        }
//        //3D1
//        if (y >= 4.5 && y < 6.0) {
//            r[3] = (y - 4.5) / (6.0 - 4.5);
//        } else if (y >= 6.0 && y < 7.0) {
//            r[3] = 1;
//        } else if (y >= 7.0 && y < 8.5) {
//            r[3] = (8.5 - y) / (8.5 - 7.0);
//        }
//        //4E1
//        if (y >= 6.5 && y < 8.0) {
//            r[4] = (y - 6.5) / (8.0 - 6.5);
//        } else if (y >= 8.0) {
//            r[4] = 1;
//        }
//        return r;
//    }
//
//
//}