package com.dky.generate; import cn.hutool.json.JSONObject; import com.dky.calculate.*; import com.dky.modelI.DntdModelI; import com.dky.utils.GetTargetDeviceList; import com.dky.utils.entity.SysDeviceHeatScene; import com.dky.utils.enums.DeviceSubType; import com.dky.utils.result.MatchedDevice; import java.text.DecimalFormat; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; public class BuildHeatingScene implements DntdModelI { DecimalFormat decimalFormat = new DecimalFormat("#.00"); // 首先A=由运行/合同容量折合成kW(x0.9)x85%, static final Double COEFFICIENT_1 = 0.9; static final Double COEFFICIENT_2 = 0.85; @Override public JSONObject createReport(JSONObject jsonObject,List<SysDeviceHeatScene> sceneList) { List<SysDeviceHeatScene> list1 = GetTargetDeviceList.main(DeviceSubType.Cooling_Heating.getDesc(), sceneList); List<SysDeviceHeatScene> list2 = GetTargetDeviceList.main(DeviceSubType.Cooling_Heating_Electric_Boiler.getDesc(), sceneList); List<SysDeviceHeatScene> alternateDeviceList = new ArrayList<>(list1); alternateDeviceList.addAll(list2); JSONObject distInfo = new JSONObject(); JSONObject buildInfo = new JSONObject(); JSONObject originalDevInfo = new JSONObject(); try{ distInfo = (JSONObject) jsonObject.get("distInfo"); buildInfo = (JSONObject) jsonObject.get("buildInfo"); originalDevInfo = (JSONObject) jsonObject.get("originalDevInfo"); } catch (Exception e){ e.printStackTrace(); } // 运行容量 Double runCapacity = Double.parseDouble(distInfo.get("runCapacity").toString()); // 上年最大需量 Double lastYearNeed = Double.parseDouble(distInfo.get("lastYearNeed").toString()); // 建筑面积 Double heatingArea = Double.parseDouble(buildInfo.get("heatingArea").toString()); // 年采暖时间(天) Integer days = Integer.parseInt(buildInfo.get("days").toString()); // 上年运行费用(万元) Double lastYearFee = Double.parseDouble(buildInfo.get("lastYearFee").toString()); /* 实际可承载容量A = 运行(或合同容量)x0.9[将运行容量或合同容量折算成容量]x85% */ double A = runCapacity * COEFFICIENT_1 * COEFFICIENT_2; /* 替代前设备总功率C */ Double C = 0.0; if (originalDevInfo != null) { //若存在原设备信息,则获取原设备中设备总功率,累加得出C } else { // C=建筑面积(万平方米)x770 C = (heatingArea / 10000) * 770; } /* 根据建筑面积计算出不同技术类型下所需要不同功率设备数据 */ List<List<MatchedDevice>> matchedDeviceGroupList = Scheme.calScheme(heatingArea, alternateDeviceList); /* 替代后设备总功率C1 */ double C1 = 0.0; if (originalDevInfo != null){ //若存在原设备信息,则根据建筑面积计算每个技术类型下需要的不同功率的设备的数量,然后将不同功率及对应的数量进行计算得出总功率C1,取最大 C1 = CalC.getC1(matchedDeviceGroupList); } else { C1 = C/2.5; } /* 改造前最大需量D */ double D = lastYearNeed + C; /* 改造后最大需量D1 */ double D1 = lastYearNeed + C1; /* 判断计算占比,默认效率0.8,成本0.2 */ double costRatio = 0.2; double effRatio = 0.8; /* try{ double costRatio1 = Double.parseDouble(jsonObject.get("costRatio").toString()); double effRatio1 = Double.parseDouble(jsonObject.get("effRatio").toString()); if(costRatio1 < 1 && costRatio1 + costRatio1 == 1){ costRatio = costRatio1; effRatio = effRatio1; } }catch (Exception e){ e.printStackTrace(); } */ List<MatchedDevice> matchedDeviceList ; Map<String, SchemeRatingRes> listMap ; /* 根据具体容量与需量判断可使用的技术并计算评分 */ //计算不同细类下成本最小值与效率最大值 Map<String, Double> maxEffMap = SchemeRating.getMaxEfficiencyGroupByDevSubType(alternateDeviceList); Map<String, Double> minPrice = SchemeRating.getMinPriceGroupByDevSubType(matchedDeviceGroupList); String remark = ""; if (D1 < A && A < D) { // 判断只能用热泵 List<List<MatchedDevice>> heatPumpDevList = new ArrayList<>(); matchedDeviceGroupList.forEach((matchedDevices -> { MatchedDevice matchedDevice = matchedDevices.get(0); String s = DeviceSubType.Cooling_Heating_Electric_Boiler.getDesc(); if (!s.equals(matchedDevice.getDeviceHeatScene().getDevSubType())){ heatPumpDevList.add(matchedDevices); } })); listMap = SchemeRating.getOptimalList(heatPumpDevList,costRatio,effRatio,maxEffMap,minPrice); matchedDeviceList = SchemeRating.getOptimalScheme(listMap); } else { // 同时考虑热泵和电锅炉 if ( A < D1){ remark = "本方案存在扩容投资需求,扩容投资不计入初次投资费用"; } listMap = SchemeRating.getOptimalList(matchedDeviceGroupList,costRatio,effRatio,maxEffMap,minPrice); matchedDeviceList = SchemeRating.getOptimalScheme(listMap); } List<Map<String, Object>> maps = new ArrayList<>(); listMap.forEach((k,v)->{ Map<String, Object> map = new HashMap<>(); map.put("rating", decimalFormat.format(v.getSchemeRating())); map.put("plan", v.getList()); map.put("planName", v.getPlanName()); maps.add(map); }); /* 封装返回 */ JSONObject returnJsonObject = new JSONObject(); Double startCost = 0.0; Double runCost = 0.0; Double allCost = 0.0; Double calculateAnnualCarbon = 0.0; Double laborFee1 = 0.0; Double electric = 0.0; List<HashMap<String,Object>> deviceList = new ArrayList<>(); for (MatchedDevice matchedDevice : matchedDeviceList){ HashMap<String, Object> map = new HashMap<>(); map.put("devSubType",matchedDevice.getDeviceHeatScene().getDevSubType()); map.put("devTechType",matchedDevice.getDeviceHeatScene().getDevTechType()); map.put("devCount",matchedDevice.getCount()); map.put("devPrice",matchedDevice.getDeviceHeatScene().getDevPrice()); deviceList.add(map); startCost = startCost + (matchedDevice.getCount() * matchedDevice.getDeviceHeatScene().getDevPrice()); runCost = runCost + (BuildHeatingModel.getRunCost(matchedDevice.getCount(), matchedDevice.getDeviceHeatScene().getDevPower(), days, matchedDevice.getDeviceHeatScene().getDevSubstituteLaborCost())); allCost = allCost + (BuildHeatingModel.getYearCost(matchedDevice.getCount(), matchedDevice.getDeviceHeatScene().getDevPrice(), matchedDevice.getDeviceHeatScene().getDevServiceLife(), matchedDevice.getDeviceHeatScene().getDevPower(), days, matchedDevice.getDeviceHeatScene().getDevSubstituteLaborCost())); electric = electric + (BuildHeatingModel.getElectric(matchedDevice.getCount(), matchedDevice.getDeviceHeatScene().getDevPower(), days)); laborFee1 = laborFee1 + (matchedDevice.getCount() * matchedDevice.getDeviceHeatScene().getDevPrice() / matchedDevice.getDeviceHeatScene().getDevServiceLife()); } //初次投资费用 returnJsonObject.set("startCost", decimalFormat.format(startCost)); // 设备总价 returnJsonObject.set("devCost", decimalFormat.format(startCost)); //年运行费用 returnJsonObject.set("yearRunCost", decimalFormat.format(runCost)); //年总费用 returnJsonObject.set("yearCost", decimalFormat.format(allCost)); //年减碳量 calculateAnnualCarbon = BuildHeatingModel.calculateAnnualCarbonReduction(lastYearFee, laborFee1, electric); returnJsonObject.set("calculate", decimalFormat.format(calculateAnnualCarbon/1000)); //替代电量 returnJsonObject.set("electric", decimalFormat.format(electric)); //备注 returnJsonObject.set("remark",remark); //封装需配置设备情况 returnJsonObject.set("deviceList",deviceList); //封装方案优势 returnJsonObject.set("safety", BuildHeatingAdvantage.safety()); returnJsonObject.set("economy", Advantage.economy(startCost, runCost, lastYearFee)); returnJsonObject.set("intelligence", BuildHeatingAdvantage.intelligence()); returnJsonObject.set("environment", BuildHeatingAdvantage.environment(Double.valueOf(decimalFormat.format(calculateAnnualCarbon/1000)))); //封装方案评分 returnJsonObject.set("matchedDeviceList", maps); return returnJsonObject; } }