2024-03-15 17:12:56 建筑供暖模型接口优化完善

master
魔神煜修罗皇 1 year ago
parent 6e617608a4
commit 99a1ad074c
  1. 10
      dntd-model-buildheating/src/main/java/com/dky/calculate/SchemeRating.java
  2. 2
      dntd-tool/pom.xml
  3. 2
      dntd-tool/src/main/java/com/dky/generate/BuildHeatingScene.java
  4. 43
      dntd-tool/src/main/java/com/dky/security/GetCpuInfo.java
  5. 60
      dntd-tool/src/main/java/com/dky/security/SM4Utils.java
  6. 135
      dntd-tool/src/main/java/com/dky/test/TestMain.java
  7. 37
      dntd-tool/src/main/java/com/dky/tool/ModelTool.java
  8. 3
      file.txt

@ -30,23 +30,15 @@ public class SchemeRating {
cost = cost + ((device.getCount() * device.getDeviceHeatScene().getDevPrice()) + (device.getCount()) * device.getDeviceHeatScene().getDevSubstituteLaborCost() * device.getDeviceHeatScene().getDevServiceLife());
}
double v1 = (maxEff.get(devSubType) - eff) / maxEff.get(devSubType); // 热效率占比计算
double v = (cost - minPrice.get(devSubType)) / minPrice.get(devSubType); // 成本占比计算
System.out.println("当前方案成本: " + cost + ",当前方案热效率: " + eff + ",技术选型: " + devSubType + ",最小成本Map: " + minPrice + ",最大热效率Map: " + maxEff);
// System.out.println("成本除法运算 = " + v + ",减法运算 = " + (1 - v) + ",乘法运算 = " + (1 -v) * 20 + "。");
// System.out.println("热效率除法运算 = " + v1 + ",减法运算 = " + (1 - v1) + ",乘法运算 = " + (1 -v1) * 80 + "。\n");
// 3、(1-(选择对应设备细类的效率最大的效率值(效率最大值)-当前设备的效率值值)/效率最大值)*100*系数 +(1-(当前成本值-对应设备细类的成本最小值)/对应设备细类的成本最小值)*100*0.2。取最高得分。
rating.set(((1 - v1) * 100 * effRatio) + ((1 - v) * 100 * costRatio));
// 方案评分结果
SchemeRatingRes schemeRatingRes = new SchemeRatingRes(plan, rating.get(), devTechType);
optimalMap.put(devTechType, schemeRatingRes);
System.out.println("方案详情 = ");
for (MatchedDevice matchedDevice : plan){
System.out.println(matchedDevice);
}
System.out.println("当前方案评分: " + rating.get() + "\n");
});
return optimalMap;
}

@ -10,7 +10,7 @@
</parent>
<artifactId>dntd-tool</artifactId>
<version>1.1-SNAPSHOT</version>
<version>1.2-SNAPSHOT</version>
<properties>
<maven.compiler.source>8</maven.compiler.source>

@ -91,6 +91,7 @@ public class BuildHeatingScene implements DntdModelI {
*/
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());
@ -101,6 +102,7 @@ public class BuildHeatingScene implements DntdModelI {
}catch (Exception e){
e.printStackTrace();
}
*/
List<MatchedDevice> matchedDeviceList ;
Map<String, SchemeRatingRes> listMap ;

@ -16,7 +16,7 @@ public class GetCpuInfo {
// 获取当前操作系统名称
String os = System.getProperty("os.name");
os = os.toUpperCase();
System.out.println("当前操作系统:"+os);
System.out.println("当前操作系统:" + os);
// linux系统用Runtime.getRuntime().exec()执行 dmidecode -t processor 查询cpu序列
// windows系统用 wmic cpu get ProcessorId 查看cpu序列
if ("LINUX".equals(os)) {
@ -24,12 +24,18 @@ public class GetCpuInfo {
} else {
cpuId = getWindowsCpuId();
}
// String macK = cpuId.toUpperCase().replace(" ", "");
// macK.replace(":", "");
System.out.println("本机mac地址:" + cpuId.toUpperCase().replace(" ", "").replace(":", ""));
return getString(cpuId);
}
/**
* 解析本地将获取得到的CPUId 格式化
*/
public static String getString(String cpuId) {
String macK = cpuId.toUpperCase().replace(" ", "");
macK.replace(":","");
System.out.println(
"本机mac地址:"+macK.replace(":","")
);
return macK.replace(":","");
return macK.replace(":", "");
}
/**
@ -37,38 +43,35 @@ public class GetCpuInfo {
*/
public static String getLinuxCpuId() {
String mac = "";
try
{
try {
Process p = new ProcessBuilder("ifconfig").start();
BufferedReader br = new BufferedReader(new InputStreamReader(p.getInputStream()));
String line;
while ((line = br.readLine()) != null)
{
while ((line = br.readLine()) != null) {
Pattern pat = Pattern.compile("\\b\\w+:\\w+:\\w+:\\w+:\\w+:\\w+\\b");
Matcher mat= pat.matcher(line);
if(mat.find())
{
mac=mat.group(0);
Matcher mat = pat.matcher(line);
if (mat.find()) {
mac = mat.group(0);
}
}
br.close();
}catch (IOException e) {
} catch (IOException e) {
e.printStackTrace();
}
System.out.println("本机mac地址:"+mac);
System.out.println("本机mac地址:" + mac);
return mac;
}
public static String executeLinuxCmd(String cmd){
public static String executeLinuxCmd(String cmd) {
try {
Runtime run = Runtime.getRuntime();
Process process = null;
process = run.exec(cmd);
System.out.println(process.toString());
if (process == null){
if (process == null) {
System.out.println("未获取到执行结果");
}else {
} else {
System.out.println("读取执行结果");
BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()));
String line;
@ -81,7 +84,7 @@ public class GetCpuInfo {
return line;
}
}catch (Exception e) {
} catch (Exception e) {
e.printStackTrace();
}
return null;

@ -4,12 +4,12 @@ import org.bouncycastle.jce.provider.BouncyCastleProvider;
import javax.crypto.Cipher;
import javax.crypto.spec.SecretKeySpec;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.nio.charset.StandardCharsets;
import java.security.Security;
import java.util.ArrayList;
import java.util.Base64;
import java.util.HashMap;
import java.util.Map;
import java.util.*;
public class SM4Utils {
static {
@ -28,13 +28,27 @@ public class SM4Utils {
return Base64.getEncoder().encodeToString(encrypted);
}
public static Map<String, String> decrypt(String encrypted) throws Exception {
Cipher cipher = Cipher.getInstance(ALGORITHM, "BC");
SecretKeySpec secretKey = new SecretKeySpec(SM4_KEY.getBytes(StandardCharsets.UTF_8), "AES");
cipher.init(Cipher.DECRYPT_MODE, secretKey);
byte[] decoded = Base64.getDecoder().decode(encrypted);
byte[] decrypted = cipher.doFinal(decoded);
return stringToMap(new String(decrypted, StandardCharsets.UTF_8));
public static List<Map<String, String>> decrypt(String encrypted) throws Exception {
List<Map<String, String>> ary = new ArrayList<>();
File file = new File("file.txt");
FileReader fileReader = new FileReader(file);
BufferedReader reader = new BufferedReader(fileReader);
String line;
while ((line = reader.readLine()) != null) {
Cipher cipher = Cipher.getInstance(ALGORITHM, "BC");
SecretKeySpec secretKey = new SecretKeySpec(line.getBytes(StandardCharsets.UTF_8), "AES");
cipher.init(Cipher.DECRYPT_MODE, secretKey);
byte[] decoded = Base64.getDecoder().decode(encrypted);
try {
byte[] decrypted = cipher.doFinal(decoded);
ary.add(stringToMap(new String(decrypted, StandardCharsets.UTF_8)));
} catch (Exception e) {
// e.printStackTrace();
}
}
return ary;
}
private static String mapToString(Map<String, String> map) {
@ -58,7 +72,27 @@ public class SM4Utils {
}
public static void main(String[] args) throws Exception {
Map<String, String> decrypt = decrypt("GLFIphzZ2SnR6kVx0gz2JBenxKHv3OrkbBPgTEeUcH8dP1vewChAxuWBZI+YsQS3H+Sb5/YEiJ0ub3p0QjXaSgbwTTqD4puEE/UZ7Yd4H8MPXFrtL0VVXoAArSbOj7JH");
System.out.println(decrypt.toString());
String s =
"GWnQ4RqqTc8n1Uj59xLoUtv975fmQsRWuvsk1zRmQu9TwIvlc6FTekndKMh+vMuRbI2bxdmuIxyZndYcg9u5xVa+HaiBZRP8OZFYIAo+66vDVlkBf47Nh2srjFyIXlLH";
List<Map<String, String>> decryptList = decrypt(s);
decryptList.forEach(System.out::println);
/*
File file = new File("file.txt");
try {
FileReader fileReader = new FileReader(file);
BufferedReader reader = new BufferedReader(fileReader);
String line;
while ((line = reader.readLine()) != null) {
// 处理每一行的数据
System.out.println(line);
}
reader.close();
} catch (IOException e) {
e.printStackTrace();
}*/
}
}

@ -0,0 +1,135 @@
package com.dky.test;
/**
* @Author戴仕崑
* @Projectdntd-model-tools
* @FilenameTest
* @Slogan 致敬大师致敬未来的你
* @Date2024/3/7 16:14
* @Version 1.0
*/
import com.dky.calculate.Scheme;
import com.dky.calculate.SchemeRating;
import com.dky.utils.entity.SysDeviceHeatScene;
import com.dky.utils.result.MatchedDevice;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
public class TestMain {
public static void main(String[] args) {
List<SysDeviceHeatScene> alternateDeviceList = createDevList();
// List<List<MatchedDevice>> alternateDeviceList = calSchemeMethodTest(14000.0, devList);
// getMaxEfficiencyGroupByDevSubTypeTest(alternateDeviceList);
// getMinPriceGroupByDevSubTypeTest(alternateDeviceList);
/*
根据建筑面积计算出不同技术类型下所需要不同功率设备数据
*/
List<List<MatchedDevice>> matchedDeviceGroupList = Scheme.calScheme(44000.0, alternateDeviceList);
/*
判断计算占比默认效率0.8成本0.2
*/
double costRatio = 0.2;
double effRatio = 0.8;
List<MatchedDevice> matchedDeviceList ;
Map<Double, List<MatchedDevice>> listMap ;
/*
根据具体容量与需量判断可使用的技术并计算评分
*/
//计算不同细类下成本最小值与效率最大值
Map<String, Double> maxEffMap = SchemeRating.getMaxEfficiencyGroupByDevSubType(alternateDeviceList);
//Map<String, Double> minPriceMap = SchemeRating.getMinPriceGroupByDevSubType(alternateDeviceList);
//listMap = SchemeRating.getOptimalList(matchedDeviceGroupList,costRatio,effRatio,maxEffMap,minPriceMap);
//matchedDeviceList = SchemeRating.getOptimalScheme(listMap);
}
public static List<List<MatchedDevice>> calSchemeMethodTest(Double buildArea, List<SysDeviceHeatScene> SysDeviceHeatSceneList) {
return Scheme.calScheme(buildArea, SysDeviceHeatSceneList);
}
public static void getMaxEfficiencyGroupByDevSubTypeTest(List<SysDeviceHeatScene> sysDeviceHeatSceneList){
SchemeRating.getMaxEfficiencyGroupByDevSubType(sysDeviceHeatSceneList);
}
public static List<SysDeviceHeatScene>createDevList(){
List<SysDeviceHeatScene> deviceList = new ArrayList<>();
// 模拟从数据库中检索数据
Object[][] data =
{
{19, "电锅炉", "供冷/暖电锅炉", "直热式电锅炉(电阻类)", 0.95, 360.00, 80000.00, 60000.00, 180000.00, 3000.00, 15, null, null},
{20, "电锅炉", "供冷/暖电锅炉", "直热式电锅炉(电阻类)", 0.95, 720.00, 100000.00, 60000.00, 180000.00, 6000.00, 15, null, null},
{21, "电锅炉", "供冷/暖电锅炉", "直热式电锅炉(电阻类)", 0.95, 1440.00, 160000.00, 60000.00, 180000.00, 12000.00, 15, null, null},
{22, "电锅炉", "供冷/暖电锅炉", "直热式电锅炉(电极类)", 0.97, 360.00, 280000.00, 60000.00, 180000.00, 3000.00, 15, null, null},
{23, "电锅炉", "供冷/暖电锅炉", "直热式电锅炉(电极类)", 0.97, 720.00, 460000.00, 60000.00, 180000.00, 6000.00, 15, null, null},
{24, "电锅炉", "供冷/暖电锅炉", "直热式电锅炉(电极类)", 0.97, 1440.00, 900000.00, 60000.00, 180000.00, 12000.00, 15, null, null},
{25, "电锅炉", "供冷/暖电锅炉", "直热式电锅炉(电磁涡流类)", 0.98, 360.00, 150000.00, 60000.00, 180000.00, 3000.00, 15, null, null},
{26, "电锅炉", "供冷/暖电锅炉", "直热式电锅炉(电磁涡流类)", 0.98, 720.00, 180000.00, 60000.00, 180000.00, 6000.00, 15, null, null},
{27, "电锅炉", "供冷/暖电锅炉", "直热式电锅炉(电磁涡流类)", 0.98, 1440.00, 300000.00, 60000.00, 180000.00, 12000.00, 15, null, null},
{28, "电锅炉", "供冷/暖电锅炉", "蓄热式电锅炉(固体蓄热)", 0.95, 360.00, 360000.00, 60000.00, 180000.00, 3000.00, 15, null, null},
{29, "电锅炉", "供冷/暖电锅炉", "蓄热式电锅炉(固体蓄热)", 0.95, 720.00, 720000.00, 60000.00, 180000.00, 6000.00, 15, null, null},
{30, "电锅炉", "供冷/暖电锅炉", "蓄热式电锅炉(固体蓄热)", 0.95, 1440.00, 1440000.00, 60000.00, 180000.00, 12000.00, 15, null, null},
{31, "电锅炉", "供冷/暖电锅炉", "蓄热式电锅炉(相变蓄热)", 0.98, 360.00, 120000.00, 60000.00, 180000.00, 3000.00, 15, null, null},
{32, "电锅炉", "供冷/暖电锅炉", "蓄热式电锅炉(相变蓄热)", 0.98, 720.00, 160000.00, 60000.00, 180000.00, 6000.00, 15, null, null},
{33, "电锅炉", "供冷/暖电锅炉", "蓄热式电锅炉(相变蓄热)", 0.98, 1440.00, 280000.00, 60000.00, 180000.00, 12000.00, 15, null, null},
{34, "电锅炉", "供冷/暖电锅炉", "蓄热式电锅炉(水蓄)", 0.97, 360.00, 110000.00, 60000.00, 180000.00, 3000.00, 15, null, null},
{35, "电锅炉", "供冷/暖电锅炉", "蓄热式电锅炉(水蓄)", 0.97, 720.00, 150000.00, 60000.00, 180000.00, 6000.00, 15, null, null},
{36, "电锅炉", "供冷/暖电锅炉", "蓄热式电锅炉(水蓄)", 0.97, 1440.00, 260000.00, 60000.00, 180000.00, 12000.00, 15, null, null},
{37, "热泵", "供冷/暖", "水源热泵", 4.00, 25.00, 45000.00, 60000.00, 180000.00, 500.00, 15, null, null},
{38, "热泵", "供冷/暖", "水源热泵", 4.00, 45.00, 75000.00, 60000.00, 180000.00, 1000.00, 15, null, null},
{39, "热泵", "供冷/暖", "水源热泵", 4.00, 90.00, 140000.00, 60000.00, 180000.00, 2000.00, 15, null, null},
{40, "热泵", "供冷/暖", "土壤源热泵", 4.00, 25.00, 45000.00, 60000.00, 180000.00, 500.00, 15, null, null},
{41, "热泵", "供冷/暖", "土壤源热泵", 4.00, 45.00, 75000.00, 60000.00, 180000.00, 1000.00, 15, null, null},
{42, "热泵", "供冷/暖", "土壤源热泵", 4.00, 90.00, 140000.00, 60000.00, 180000.00, 2000.00, 15, null, null},
{43, "热泵", "供冷/暖", "空气源热泵", 4.00, 25.00, 45000.00, 60000.00, 180000.00, 500.00, 15, null, null},
{44, "热泵", "供冷/暖", "空气源热泵", 4.00, 45.00, 75000.00, 60000.00, 180000.00, 1000.00, 15, null, null},
{45, "热泵", "供冷/暖", "空气源热泵", 4.00, 90.00, 140000.00, 60000.00, 180000.00, 2000.00, 15, null, null},
{46, "热泵", "供冷/暖", "低品位余热源(如电厂低温循环水)热泵", 4.00, 25.00, 45000.00, 60000.00, 180000.00, 500.00, 15, null, null},
{47, "热泵", "供冷/暖", "低品位余热源(如电厂低温循环水)热泵", 4.00, 45.00, 75000.00, 60000.00, 180000.00, 1000.00, 15, null, null},
{48, "热泵", "供冷/暖", "低品位余热源(如电厂低温循环水)热泵", 4.00, 90.00, 140000.00, 60000.00, 180000.00, 2000.00, 15, null, null},
{49, "热泵", "供冷/暖", "高温蒸汽热泵", 3.00, 45.00, 380000.00, 60000.00, 180000.00, 1000.00, 15, null, null},
{50, "热泵", "供冷/暖", "高温蒸汽热泵", 3.00, 120.00, 550000.00, 60000.00, 180000.00, 2000.00, 15, null, null},
};
// 创建对象并添加到列表
for (Object[] row : data) {
int id = (int) row[0];
String devType = (String) row[1];
String devSubType = (String) row[2];
String devTechType = (String) row[3];
double heatEfficiency = (double) row[4];
double devPower = (double) row[5];
double devPrice = (double) row[6];
double devSubstituteLaborCost = (double) row[7];
double laborCost = (double) row[8];
double devReferenceArea = (double) row[9];
int devServiceLife = (int) row[10];
SysDeviceHeatScene device = new SysDeviceHeatScene(
id, devType, devSubType, devTechType, heatEfficiency, devPower, devPrice,
devSubstituteLaborCost, laborCost, devReferenceArea, devServiceLife, null, null);
deviceList.add(device);
}
return deviceList;
}
}

@ -43,22 +43,37 @@ public class ModelTool {
public JSONObject exeModel2Report(JSONObject jsonObject, String key) {
JSONObject jsonObjectResult = new JSONObject();
// 判断CpuId是否包含本机地址
Boolean thisCpuIdIn = false;
// 判断是否过期
Boolean expired = false;
try {
//获取本地的cpuid.
String localCpuId = GetCpuInfo.getCpuId();
// 根据给定的类名初始化类 加密不需要反实例化new
Class sm4UtilsClass = Class.forName("com.dky.security.SM4Utils");
// 实例化这个类
Object obj = sm4UtilsClass.newInstance();
// 调用指定方法
Map map = (Map) sm4UtilsClass.getMethod("decrypt", String.class).invoke(obj, key);
String cpuIds = (String) map.get("cpuIds");
String expireTime = (String) map.get("expireTime");
// 定义日期时间格式
SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date date = formatter.parse(expireTime);
//拿到解析后的cpuid。获取本地的cpuid.
String localCpuId = GetCpuInfo.getCpuId();
if (cpuIds.contains(localCpuId)){
List<Map> maps = (List<Map>) sm4UtilsClass.getMethod("decrypt", String.class).invoke(obj, key);
for (Map map : maps){
String cpuIds = (String) map.get("cpuIds");
String expireTime = (String) map.get("expireTime");
// 定义日期时间格式
SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date date = formatter.parse(expireTime);
if (cpuIds.contains(localCpuId)){
thisCpuIdIn = true;
}
if (new Date().before(date)){
expired = true;
}
}
if (thisCpuIdIn){
if (expired){
// 判断模型使用权限
// 根据给定的类名初始化类 加密不需要反实例化new
Class buildHeatingScene = Class.forName("com.dky"+"."+ ConfigReader.getProperty(jsonObject.getStr("type")));
@ -72,7 +87,7 @@ public class ModelTool {
}else {
jsonObjectResult = ResponseUtil.createResponse(Code.KEY_UNAUTHORIZED.getCode(), Code.KEY_UNAUTHORIZED.getDesc(), null);
}
} catch (ClassNotFoundException e) {
} catch (ClassNotFoundException | NoSuchMethodException e) {
e.printStackTrace();
} catch (InstantiationException e) {
e.printStackTrace();
@ -81,8 +96,6 @@ public class ModelTool {
} catch (InvocationTargetException e) {
jsonObjectResult = ResponseUtil.createResponse(Code.KEY_CONTEXT_ERROR.getCode(), Code.KEY_CONTEXT_ERROR.getDesc(), null);
e.printStackTrace();
} catch (NoSuchMethodException e) {
e.printStackTrace();
} catch (Exception e) {
throw new RuntimeException(e);
}

@ -0,0 +1,3 @@
mxhXSDiPYFjYgzRb
sm4demo123456789
myhXSDiPUFjYgzRa
Loading…
Cancel
Save