package com.ruoyi.buss.common; import com.alibaba.fastjson2.JSONObject; import com.ruoyi.buss.domain.DsEffectAssessList; import javax.script.Invocable; import javax.script.ScriptEngine; import javax.script.ScriptEngineManager; import javax.script.ScriptEngineFactory; import javax.tools.*; import java.lang.reflect.Method; import java.net.URI; import java.net.URL; import java.net.URLClassLoader; import java.util.Arrays; import java.util.List; public class AssessUtil { /** * 批次总补给数量 效能评估数值计算 */ public static double getPercentForShipCount(int count){ if(count > 0 && count < 6){ return 0.2; } else if(count >= 6 && count < 12){ return 0.4; } else if(count >= 12 && count < 20){ return 0.6; } else if(count >= 20 && count < 30){ return 0.8; } else if(count >= 30){ return 1.0; } return 0.0; } /** * 批次单舰折叠补给时间 效能评估数值计算 */ public static double getPercentForShipEmpty(int count){ if(count < 4){ return 1.0; } else if(count < 8 && count >= 4){ return 0.8; } else if(count >= 8 && count < 12){ return 0.6; } else if(count >= 12 && count < 18){ return 0.4; } else if(count >= 18 && count < 24){ return 0.2; } return 0.0; } /** * 各港口结束最大时间差 效能评估数值计算 */ public static double getPercentForHarborTimeDif(int count){ if(count < 4){ return 1.0; } else if(count >= 4 && count < 8){ return 0.8; } else if(count >= 8 && count < 12){ return 0.6; } else if(count >= 12 && count < 18){ return 0.4; } else if(count >= 18 && count < 24){ return 0.2; } return 0.0; } /** * 单舰平均停靠时间 效能评估数值计算 */ public static double getPercentForShipStopTime(int hour){ if(hour > 48){ return 0.4; } else if(hour > 36 && hour <= 48){ return 0.6; } else if(hour > 30 && hour <= 36){ return 0.7; } else if(hour > 24 && hour <= 30){ return 0.8; } else if(hour > 18 && hour <= 24){ return 1.0; } else if(hour > 12 && hour <= 18){ return 0.8; } else if(hour > 6 && hour <= 12){ return 0.7; } else if(hour <= 6){ return 0.6; } return 0.0; } /** * 补给作业时间均值 效能评估数值计算 */ public static double getPercentForApplyTime(int hour){ if(hour > 36){ return 0.4; } else if(hour > 24 && hour <= 36){ return 0.6; } else if(hour > 20 && hour <= 24){ return 0.8; } else if(hour > 16 && hour <= 20){ return 1.0; } else if(hour > 12 && hour <= 16){ return 0.8; } else if(hour < 8){ return 0.6; } return 0.0; } /** * 补给非作业时间均值 效能评估数值计算 */ public static double getPercentForNotApplyTime(int hour){ if(hour > 24){ return 0.0; } else if(hour > 16 && hour <= 24){ return 0.2; } else if(hour > 12 && hour <= 16){ return 0.4; } else if(hour > 8 && hour <= 12){ return 0.6; } else if(hour > 4 && hour <= 8){ return 0.8; } else if(hour <= 4){ return 1.0; } return 0.0; } /** * 泊位日均周转艘次 效能评估数值计算 */ public static double getPercentForBerthTime(double hour){ if (hour > 0) { double result = (double)hour / 3.0; return result > 1.0 ? 1.0 : result; } return 0.0; } /** * 前沿占半时长均值 效能评估数值计算 */ public static double getPercentForBerthHoldTime(double hour){ if (hour > 0) { double result = (double) hour / 24.0; return result > 1 ? 1.0 : result; } return 0.0; } /** * 各泊位物资车次均值 效能评估数值计算 */ public static double getPercentForCar(double count){ if (count > 0) { double result = (double)count / 24.0; return result > 1.0 ? 1.0 : result; } return 0.0; } private static Double getScore(Double list) { try { // 创建Java编译器 JavaCompiler compiler = ToolProvider.getSystemJavaCompiler(); DiagnosticCollector diagnostics = new DiagnosticCollector<>(); // 创建源代码 String sourceCode = "public class DynamicScore {" + " public static double calculateScore(double value) {" + " return Math.round(value * 10 * 100) / 100.0;" + " }" + "}"; // 创建内存中的Java源文件 JavaFileObject sourceFile = new SimpleJavaFileObject( URI.create("string:///DynamicScore.java"), JavaFileObject.Kind.SOURCE) { @Override public CharSequence getCharContent(boolean ignoreEncodingErrors) { return sourceCode; } }; // 编译源代码 StandardJavaFileManager fileManager = compiler.getStandardFileManager(diagnostics, null, null); Iterable compilationUnits = Arrays.asList(sourceFile); JavaCompiler.CompilationTask task = compiler.getTask(null, fileManager, diagnostics, null, null, compilationUnits); boolean success = task.call(); if (success) { // 创建自定义类加载器 ClassLoader classLoader = new URLClassLoader(new URL[0], AssessUtil.class.getClassLoader()); Class dynamicClass = Class.forName("DynamicScore", true, classLoader); // 调用方法 Method method = dynamicClass.getMethod("calculateScore", double.class); return (Double) method.invoke(null, list); } } catch (Exception e) { e.printStackTrace(); System.out.println("计算分数失败"); } return 0.0; } public static void main(String[] args) { System.out.println(getScore(32.1)); } }