From cefaf53804aa4687bf6021b3215d876af65f24be Mon Sep 17 00:00:00 2001 From: lihongjie0209 Date: Thu, 15 Aug 2024 22:11:28 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AE=8C=E5=96=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../coal/common/GroovyScriptManager.java | 184 ++++++++ .../cn/lihongjie/coal/common/MapUtils.java | 41 ++ .../mapper/EmpMonthAttendanceMapper.java | 7 + .../empSalary/dto/CreateEmpSalaryDto.java | 6 + .../coal/empSalary/dto/EmpSalaryDto.java | 4 +- .../empSalary/dto/UpdateEmpSalaryDto.java | 6 + .../empSalary/entity/EmpSalaryEntity.java | 10 +- .../empSalary/mapper/EmpSalaryMapper.java | 6 +- .../empSalary/service/EmpSalaryService.java | 428 ++++++++++++------ .../repository/EmpSalaryItemRepository.java | 15 + .../service/EmpSalaryItemService.java | 216 ++++----- .../employee/dto/EmployeeCalculateDto.java | 141 ++++++ .../coal/employee/mapper/EmployeeMapper.java | 3 + .../employee/service/EmployeeService.java | 24 +- 14 files changed, 813 insertions(+), 278 deletions(-) create mode 100644 src/main/java/cn/lihongjie/coal/common/GroovyScriptManager.java create mode 100644 src/main/java/cn/lihongjie/coal/common/MapUtils.java create mode 100644 src/main/java/cn/lihongjie/coal/employee/dto/EmployeeCalculateDto.java diff --git a/src/main/java/cn/lihongjie/coal/common/GroovyScriptManager.java b/src/main/java/cn/lihongjie/coal/common/GroovyScriptManager.java new file mode 100644 index 00000000..9e2c1bd9 --- /dev/null +++ b/src/main/java/cn/lihongjie/coal/common/GroovyScriptManager.java @@ -0,0 +1,184 @@ +package cn.lihongjie.coal.common; + +import com.github.benmanes.caffeine.cache.Cache; +import com.github.benmanes.caffeine.cache.Caffeine; +import com.github.benmanes.caffeine.cache.CaffeineSpec; + +import groovy.lang.GroovyClassLoader; +import groovy.lang.GroovyCodeSource; +import groovy.lang.Script; + +import lombok.SneakyThrows; +import lombok.extern.slf4j.Slf4j; + +import org.apache.commons.lang3.StringUtils; +import org.codehaus.groovy.control.CompilerConfiguration; +import org.springframework.cglib.core.ReflectUtils; +import org.springframework.util.DigestUtils; + +import java.nio.charset.StandardCharsets; +import java.util.concurrent.atomic.AtomicInteger; +import java.util.function.Consumer; +import java.util.function.Supplier; + +@Slf4j +public class GroovyScriptManager { + + private static final AtomicInteger counter = new AtomicInteger(0); + private final String name; + private final Cache scriptCache; + private final GroovyClassLoader groovyClassLoader; + private boolean logCompileTime = false; + + public GroovyScriptManager() { + this(true); + } + + public GroovyScriptManager(boolean logCompileTime) { + this((c) -> {}, logCompileTime); + } + + public GroovyScriptManager( + Consumer configCustomizer, boolean logCompileTime) { + this(null, configCustomizer, logCompileTime); + } + + public GroovyScriptManager( + String name, Consumer configCustomizer, boolean logCompileTime) { + this(name, "maximumSize=1000,expireAfterAccess=1h", configCustomizer, logCompileTime); + } + + public GroovyScriptManager( + String name, + String specification, + Consumer configConsumer, + boolean logCompileTime) { + + this.name = StringUtils.defaultIfBlank(name, "GroovyScriptManager-" + counter.get()); + scriptCache = Caffeine.from(CaffeineSpec.parse(specification)).build(); + + CompilerConfiguration config = new CompilerConfiguration(); + configConsumer.accept(config); + + this.groovyClassLoader = new GroovyClassLoader(this.getClass().getClassLoader(), config); + this.logCompileTime = logCompileTime; + + counter.incrementAndGet(); + + log.info("GroovyScriptManager: {} created", name); + } + + /** 高性能版本API, 允许自定义缓存key */ + public Class compile(String key, Supplier scriptSupplier) { + + StringBuilder logText = new StringBuilder(); + + logText.append("GroovyScriptManager: ").append(name).append("\n"); + + logText.append("compile groovy script: ").append(key).append("\n"); + + long start = System.currentTimeMillis(); + + try { + + return scriptCache.get( + key, + k -> { + long getStart = System.currentTimeMillis(); + String script = scriptSupplier.get(); + + long getEnd = System.currentTimeMillis(); + + logText.append("getScriptTime: ").append(getEnd - getStart).append("ms\n"); + GroovyCodeSource codeSource = + new GroovyCodeSource(script, key, "/groovy/script"); + codeSource.setCachable(false); + + long parseStart = System.currentTimeMillis(); + Class parsedClass = this.groovyClassLoader.parseClass(codeSource); + long parseEnd = System.currentTimeMillis(); + + logText.append("parseTime: ").append(parseEnd - parseStart).append("ms\n"); + return parsedClass; + }); + } finally { + long end = System.currentTimeMillis(); + + logText.append("totalTime: ").append(end - start).append("ms"); + } + } + + public Script newInstance(String key, Supplier scriptSupplier) { + + Class aClass = compile(key, scriptSupplier); + + Object o = ReflectUtils.newInstance(aClass); + + if (o instanceof Script) { + return (Script) o; + } else { + throw new IllegalArgumentException( + "script must be instance of groovy.lang.Script, get " + aClass.getName()); + } + } + + public void runWithScript( + String key, Supplier scriptSupplier, Consumer