|
|
|
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().getDevServiceLife(), 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().getLaborCost() / 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;
|
|
|
|
}
|
|
|
|
}
|