新增顺德仁医 采集器配置更新项目

segment2.0
linrf 2 years ago
parent 0ec0ccd7c9
commit e6dbc1e9b7

@ -0,0 +1,52 @@
package com.docus.server.common.util;
import org.yaml.snakeyaml.Yaml;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.util.LinkedHashMap;
import java.util.Map;
/**
* @version 1.0
* @Description yml
* configjarconfigjvm
* @date Mar 24, 2022
*/
public class YmlUtil {
public static LinkedHashMap loadYaml(String fileName) throws Exception {
String path = System.getProperty("user.dir");
File file = new File(path + "/config/" + fileName);
InputStream in;
if (file.exists()) {
in = new FileInputStream(path + "/config/" + fileName);
} else {
// TODO 如果没有config文件夹则从项目的resources目录下找
in = YmlUtil.class.getClassLoader().getResourceAsStream(fileName);
}
LinkedHashMap lhm = new Yaml().loadAs(in, LinkedHashMap.class);
return lhm;
}
public static Object getValByKey(Map lhm, String key) throws Exception {
String[] keys = key.split("[.]");
Map ymlInfo = lhm;
for (int i = 0; i < keys.length; i++) {
Object value = ymlInfo.get(keys[i]);
if (i < keys.length - 1) {
ymlInfo = (Map) value;
} else if (value == null) {
throw new Exception("key不存在");
} else {
return value;
}
}
return null;
}
}

@ -0,0 +1,33 @@
package com.docus.server.api.collector.update;
import com.docus.server.vo.collector.update.CollectorUpdateVersionVO;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import javax.servlet.http.HttpServletResponse;
/**
* API
*
* @author AutoGenerator
* @since 2023-08-29
*/
@FeignClient(value = "docus-collector-update", contextId = "docus-collector-update.CollectorUpdateApi")
@RequestMapping("/collector/update")
public interface CollectorUpdateApi {
/**
*
*/
@GetMapping("/find")
CollectorUpdateVersionVO find() throws Exception;
/**
*
*/
@GetMapping("/download")
void downloadFile(HttpServletResponse response) throws Exception;
}

@ -0,0 +1,30 @@
package com.docus.server.vo.collector.update;
import com.fasterxml.jackson.annotation.JsonProperty;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
/**
* VO
*
* @author AutoGenerator
* @since 2023-08-29
*/
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@ApiModel(value = "CollectorUpdateVersionVO", description = "采集器更新配置")
public class CollectorUpdateVersionVO implements Serializable {
@ApiModelProperty(value = "采集器版本号")
@JsonProperty(value = "UpdateNumber")
private String updateNumber;
}

Binary file not shown.

@ -0,0 +1,73 @@
<assembly xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/assembly-1.0.0.xsd">
<id>exe</id>
<formats>
<format>dir</format>
</formats>
<includeBaseDirectory>false</includeBaseDirectory>
<fileSets>
<fileSet>
<outputDirectory>/lib</outputDirectory>
<directory>${basedir}/target/lib</directory>
</fileSet>
<fileSet>
<outputDirectory>/config</outputDirectory>
<directory>${basedir}/target/resources</directory>
<fileMode>0755</fileMode>
<includes>
<include>*.xml</include>
<include>*.yml</include>
<include>*.properties</include>
</includes>
</fileSet>
<fileSet>
<outputDirectory>/dataConfig</outputDirectory>
<directory>${basedir}/target/dataConfig</directory>
<fileMode>0755</fileMode>
<includes>
<include>*.json</include>
</includes>
</fileSet>
<fileSet>
<outputDirectory>/</outputDirectory>
<directory>${basedir}/target/resources/bin</directory>
<fileMode>0755</fileMode>
<includes>
<include>*.bat</include>
</includes>
</fileSet>
<fileSet>
<outputDirectory>/</outputDirectory>
<directory>${basedir}/target/resources/bin</directory>
<fileMode>0755</fileMode>
<includes>
<include>*.xml</include>
</includes>
</fileSet>
<fileSet>
<outputDirectory>/</outputDirectory>
<directory>${basedir}</directory>
<fileMode>0755</fileMode>
<includes>
<include>*.exe</include>
</includes>
</fileSet>
<!-- 将项目启动jar打包到boot目录中 -->
<fileSet>
<directory>${basedir}/target</directory>
<outputDirectory>/</outputDirectory>
<fileMode>0755</fileMode>
<includes>
<include>${project.build.finalName}.jar</include>
</includes>
</fileSet>
</fileSets>
</assembly>

@ -0,0 +1,185 @@
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<parent>
<artifactId>docus-collector-server</artifactId>
<groupId>com.docus</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>docus-collector-update</artifactId>
<name>Archetype - docus-collector-update</name>
<url>http://maven.apache.org</url>
<dependencies>
<dependency>
<groupId>com.docus</groupId>
<artifactId>docus-api-common</artifactId>
<version>1.0-SNAPSHOT</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.freemarker</groupId>
<artifactId>freemarker</artifactId>
<version>2.3.30</version>
</dependency>
<dependency>
<groupId>cn.smallbun.screw</groupId>
<artifactId>screw-core</artifactId>
<version>1.0.3</version>
</dependency>
</dependencies>
<build>
<resources>
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering>
</resource>
</resources>
<plugins>
<plugin>
<!--打包时去除第三方依赖-->
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>2.4.4</version>
<configuration>
<layout>ZIP</layout>
<includes>
<include>
<groupId>non-exists</groupId>
<artifactId>non-exists</artifactId>
</include>
</includes>
</configuration>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
<!--拷贝第三方依赖文件到指定目录-->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<executions>
<execution>
<id>copy-dependencies</id>
<phase>package</phase>
<goals>
<goal>copy-dependencies</goal>
</goals>
<configuration>
<!--target/lib是依赖jar包的输出目录根据自己喜好配置-->
<outputDirectory>target/lib</outputDirectory>
<excludeTransitive>false</excludeTransitive>
<stripVersion>false</stripVersion>
<includeScope>runtime</includeScope>
</configuration>
</execution>
</executions>
</plugin>
<!-- copy资源文件 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-resources-plugin</artifactId>
<version>3.2.0</version>
<executions>
<execution>
<id>copy-resources</id>
<phase>package</phase>
<goals>
<goal>copy-resources</goal>
</goals>
<configuration>
<resources>
<resource>
<directory>src/main/resources</directory>
<includes>
<include>**/*.*</include>
</includes>
</resource>
</resources>
<outputDirectory>${project.build.directory}/resources</outputDirectory>
</configuration>
</execution>
<execution>
<id>copy-bin</id>
<phase>package</phase>
<goals>
<goal>copy-resources</goal>
</goals>
<configuration>
<resources>
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering>
<includes>
<include>bin/*.xml</include>
<include>bin/*.bat</include>
<include>*.yml</include>
<include>*.ftl</include>
</includes>
</resource>
</resources>
<outputDirectory>${project.build.directory}/resources</outputDirectory>
</configuration>
</execution>
<execution>
<id>copy-data-config</id>
<phase>package</phase>
<goals>
<goal>copy-resources</goal>
</goals>
<configuration>
<resources>
<resource>
<directory>../../dataConfig</directory>
<filtering>true</filtering>
</resource>
</resources>
<outputDirectory>${project.build.directory}/dataConfig</outputDirectory>
</configuration>
</execution>
</executions>
</plugin>
<!-- 打jar包时忽略配置文件 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>3.2.0</version>
<configuration>
<excludes>
<exclude>**/*.yml</exclude>
</excludes>
</configuration>
</plugin>
<plugin>
<artifactId>maven-assembly-plugin</artifactId>
<executions>
<execution>
<configuration>
<finalName>${project.artifactId}</finalName>
<appendAssemblyId>false</appendAssemblyId>
<descriptors>
<descriptor>assembly.xml</descriptor>
</descriptors>
</configuration>
<id>make-assembly</id>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>

@ -0,0 +1,18 @@
package com.docus.server;
import com.docus.log.EnableTrackGroup;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.openfeign.EnableFeignClients;
import org.springframework.scheduling.annotation.EnableAsync;
@EnableTrackGroup
@EnableAsync
@EnableFeignClients(basePackages = {"com.docus.core.excel.feign", "com.docus.server.api.collector.update"})
@SpringBootApplication(scanBasePackages = {"com.docus"})
public class AppBootstrap {
public static void main(String[] args) {
System.setProperty("javax.xml.parsers.DocumentBuilderFactory", "com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderFactoryImpl");
SpringApplication.run(AppBootstrap.class, args);
}
}

@ -0,0 +1,35 @@
package com.docus.server;
import com.baomidou.mybatisplus.generator.AutoGenerator;
import com.baomidou.mybatisplus.generator.config.rules.DateType;
import com.docus.infrastructure.generator.BaseCodeGenerator;
import java.util.HashMap;
import java.util.Map;
public class CodeGenerator {
public static void main(String[] args) {
//字段名和枚举名的映射,不区分表名
Map<String, String> enumColumnMap = new HashMap<>();
enumColumnMap.put("PROFILE_ITЕM", "AdminProfileItemEnum");
enumColumnMap.put("ORGANIZATION_TYPE", "OrganizationTypeEnum ");
enumColumnMap.put("OPERATE_STATUS", "OperateStatusEnum");
enumColumnMap.put("STATE", "StateEnum");
enumColumnMap.put("PRIVILEGE_LEVEL", "PrivilegeLevelEnum");
enumColumnMap.put("FLAG", "FlagEnum");
enumColumnMap.put("collect_type", "CollectTypeEnum");
BaseCodeGenerator.setEnumColumnMap(enumColumnMap);
BaseCodeGenerator.setModuleName("docus-segmentation");//多个module需要指定modulename
//指定entity生成到独立module里并生成 api interface
BaseCodeGenerator.setClientInterfaceModuleName("docus-client-interface");
BaseCodeGenerator.setClientInterfaceSubFolder("segmentation");//文件夹
BaseCodeGenerator.setClientInterfaceBasePackage("com.docus.server");
AutoGenerator defaultConfig = BaseCodeGenerator.getDefaultConfig();
defaultConfig.getGlobalConfig().setSwagger2(true);
defaultConfig.getGlobalConfig().setDateType(DateType.ONLY_DATE);
defaultConfig.getStrategy().setEntityLombokModel(true);
defaultConfig.getStrategy().setInclude("");//需要生成的表,可指定多个,留空为全部生成
BaseCodeGenerator.generate(defaultConfig);
}
}

@ -0,0 +1,58 @@
package com.docus.server.common.event;
import com.docus.infrastructure.core.db.enums.IIntegerEnum;
import lombok.Getter;
import org.springframework.context.ApplicationEvent;
/**
*
*/
@Getter
public class FlowEvent extends ApplicationEvent {
/**
*
*/
private final String patientId;
/**
*
*/
private final FlowTypeEnum flowTypeEnum;
public FlowEvent(Object source, String patientId, FlowTypeEnum flowTypeEnum) {
super(source);
this.patientId = patientId;
this.flowTypeEnum = flowTypeEnum;
}
public enum FlowTypeEnum implements IIntegerEnum {
//正式
START_SEGMENT(1, "开始分段事件"),
START_OCR(2, "开始OCR事件"),
START_UPLOAD(3, "开始上传归档系统事件"),
//调试
START_SEGMENT_TEST(4, "开始分段测试事件"),
START_OCR_TEST(5, "开始OCR测试事件"),
START_UPLOAD_TEST(6, "开始上传归档系统测试事件");
private Integer value;
private String display;
FlowTypeEnum(Integer value, String display) {
this.value = value;
this.display = display;
}
@Override
public Integer getValue() {
return this.value;
}
@Override
public String getDisplay() {
return this.display;
}
}
}

@ -0,0 +1,26 @@
package com.docus.server.common.event;
import com.docus.log.executor.TrackRetrySpringExecutor;
import com.docus.log.handler.IJobHandler;
import lombok.extern.slf4j.Slf4j;
import org.springframework.context.event.EventListener;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Component;
@Component
@Slf4j
public class FlowEventListener {
@EventListener
@Async("threadPoolExecutor")
public void flowListen(FlowEvent fileEvent) throws Exception {
FlowEvent.FlowTypeEnum flowTypeEnum = fileEvent.getFlowTypeEnum();
IJobHandler jobHandler = TrackRetrySpringExecutor.loadJobHandler(flowTypeEnum.name());
jobHandler.execute(fileEvent.getPatientId());
}
}

@ -0,0 +1,198 @@
package com.docus.server.common.utils;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class StartUpExeUtils {
public static void main(String[] args) throws Exception {
// startUpExeOnly("H:\\tools\\Navicat Premium 12免安装\\Navicat Premium 12\\navicat.exe");
// killExeOnly("navicat.exe");
// startUpExe("H:\\tools\\Navicat Premium 12免安装\\Navicat Premium 12\\navicat.exe", "navicat.exe");
restartTerminal("");
}
private static boolean startExeStatus = true;//exe启动状态
//重启终端
public static String restartTerminal(String bat) throws IOException, InterruptedException {
Process process = Runtime.getRuntime().exec(bat);
int exitCode = process.waitFor();
if (exitCode == 0) {
System.out.println("Command executed successfully.");
return "Command executed successfully.";
} else {
System.out.println("Command execution failed.");
return "Command executed failed.";
}
}
//重启虚拟机
public static String restartComputer() throws IOException, InterruptedException {
Process process = Runtime.getRuntime().exec("shutdown /r /t 0");
int exitCode = process.waitFor();
if (exitCode == 0) {
System.out.println("Command executed successfully.");
return "Command executed successfully.";
} else {
System.out.println("Command execution failed.");
return "Command executed failed.";
}
}
//仅启动exe客户端不检查进程
public static void startUpExeOnly(String exePath) throws IOException {
if (exePath != "") {
Runtime.getRuntime().exec(exePath);
}
}
/**
* kill
*
* @param procName
* @throws IOException
*/
public static void killExeOnly(String procName) throws IOException {
if (procName != "") {
String command = "taskkill /F /IM " + procName;
Runtime.getRuntime().exec("cmd /c " + command);
}
}
//启动exe客户端
public static boolean startUpExe(String exePath, String procName) {
if (exePath != "" && procName != "") {
String result = checkProcess(procName);//检查exe进程
if (result.isEmpty()) {
try {
Runtime.getRuntime().exec(exePath);
} catch (Exception e) {
e.printStackTrace();
System.out.println("程序:" + exePath + "不存在!");
}
}
}
return startExeStatus;
}
//启动exe客户端,并传参
public static boolean startUpExe(String exePath, String procName, int subId, String curModeId, String riskSet1, String riskSet2, String riskSet3) {
if (exePath != "" && procName != "") {
String result = checkProcess(procName);//检查exe进程
if (result.isEmpty()) {
try {
//启动exe执行程序
String[] cmd = {exePath, subId + "", curModeId, riskSet1, riskSet2, riskSet3};
Runtime.getRuntime().exec(cmd);
} catch (Exception e) {
e.printStackTrace();
System.out.println("程序:" + exePath + "不存在!");
}
}
}
return startExeStatus;
}
/**
*
*
* @param procName
*/
public static String checkProcess(String procName) {
String result = "";
//判断是否存在进程
Boolean existProc = false;
BufferedReader bufferedReader = null;
try {
Process proc = Runtime.getRuntime().exec("tasklist -fi " + '"' + "imagename eq " + procName + '"');
bufferedReader = new BufferedReader(new InputStreamReader(proc.getInputStream()));
String line = null;
while ((line = bufferedReader.readLine()) != null) {
if (line.contains(procName)) {
existProc = true;//存在
}
}
} catch (Exception ex) {
result = "查询程序进程异常:" + ex.getMessage();
System.out.println("查询程序进程异常:" + ex.getMessage());
return result;
} finally {
if (bufferedReader != null) {
try {
bufferedReader.close();
} catch (Exception ex) {
}
}
}
// 存在,则先杀死该进程
if (existProc) {
BufferedReader br = null;
try {
if (procName != "") {
//执行cmd命令
String command = "taskkill /F /IM " + procName;
Runtime runtime = Runtime.getRuntime();
Process process = runtime.exec("cmd /c " + command);
br = new BufferedReader(new InputStreamReader(process.getInputStream(), "UTF-8"));
String line = null;
StringBuilder build = new StringBuilder();
while ((line = br.readLine()) != null) {
build.append(line);
}
}
} catch (Exception e) {
result = "关闭程序进程异常:" + e.getMessage();
System.out.println("关闭程序进程异常:" + e.getMessage());
return result;
} finally {
if (br != null) {
try {
br.close();
} catch (Exception ex) {
}
}
}
}
return result;
}
/**
*
*
* @param procName
*/
public static boolean checkProcessOnly(String procName) {
//判断是否存在进程
Boolean existProc = false;
BufferedReader bufferedReader = null;
try {
Process proc = Runtime.getRuntime().exec("tasklist -fi " + '"' + "imagename eq " + procName + '"');
bufferedReader = new BufferedReader(new InputStreamReader(proc.getInputStream()));
String line = null;
while ((line = bufferedReader.readLine()) != null) {
if (line.contains(procName)) {
existProc = true;//存在
}
}
} catch (Exception ex) {
System.out.println("查询程序进程异常:" + ex.getMessage());
return existProc;
} finally {
if (bufferedReader != null) {
try {
bufferedReader.close();
} catch (Exception ex) {
}
}
}
return existProc;
}
}

@ -0,0 +1,313 @@
package com.docus.server.common.utils;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import oshi.SystemInfo;
import oshi.hardware.CentralProcessor;
import oshi.hardware.GlobalMemory;
import oshi.hardware.HardwareAbstractionLayer;
import oshi.hardware.NetworkIF;
import oshi.software.os.FileSystem;
import oshi.software.os.OSFileStore;
import oshi.software.os.OperatingSystem;
import oshi.util.Util;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.InetAddress;
import java.net.UnknownHostException;
import java.text.DecimalFormat;
import java.util.Formatter;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import java.util.Properties;
import java.util.StringTokenizer;
/**
*
**/
public class SystemInfoUtils {
private static final int OSHI_WAIT_SECOND = 1000;
private static final int SLEEP_TIME = 2 * 1000;
private static SystemInfo systemInfo = new SystemInfo();
private static HardwareAbstractionLayer hardware = systemInfo.getHardware();
private static OperatingSystem operatingSystem = systemInfo.getOperatingSystem();
public static void main(String[] args) throws Exception {
JSONObject info = getInfo();
System.out.println(info);
}
public static JSONObject getCpuInfo() {
JSONObject cpuInfo = new JSONObject();
CentralProcessor processor = hardware.getProcessor();
// CPU信息
long[] prevTicks = processor.getSystemCpuLoadTicks();
Util.sleep(OSHI_WAIT_SECOND);
long[] ticks = processor.getSystemCpuLoadTicks();
long nice = ticks[CentralProcessor.TickType.NICE.getIndex()] - prevTicks[CentralProcessor.TickType.NICE.getIndex()];
long irq = ticks[CentralProcessor.TickType.IRQ.getIndex()] - prevTicks[CentralProcessor.TickType.IRQ.getIndex()];
long softirq = ticks[CentralProcessor.TickType.SOFTIRQ.getIndex()] - prevTicks[CentralProcessor.TickType.SOFTIRQ.getIndex()];
long steal = ticks[CentralProcessor.TickType.STEAL.getIndex()] - prevTicks[CentralProcessor.TickType.STEAL.getIndex()];
long cSys = ticks[CentralProcessor.TickType.SYSTEM.getIndex()] - prevTicks[CentralProcessor.TickType.SYSTEM.getIndex()];
long user = ticks[CentralProcessor.TickType.USER.getIndex()] - prevTicks[CentralProcessor.TickType.USER.getIndex()];
long iowait = ticks[CentralProcessor.TickType.IOWAIT.getIndex()] - prevTicks[CentralProcessor.TickType.IOWAIT.getIndex()];
long idle = ticks[CentralProcessor.TickType.IDLE.getIndex()] - prevTicks[CentralProcessor.TickType.IDLE.getIndex()];
long totalCpu = user + nice + cSys + idle + iowait + irq + softirq + steal;
//cpu核数
cpuInfo.put("cpuNum", processor.getLogicalProcessorCount());
//cpu系统使用率
cpuInfo.put("cSys", new DecimalFormat("#.##%").format(cSys * 1.0 / totalCpu));
//cpu用户使用率
cpuInfo.put("user", new DecimalFormat("#.##%").format(user * 1.0 / totalCpu));
//cpu当前等待率
cpuInfo.put("iowait", new DecimalFormat("#.##%").format(iowait * 1.0 / totalCpu));
//cpu当前使用率
cpuInfo.put("idle", new DecimalFormat("#.##%").format(1.0 - (idle * 1.0 / totalCpu)));
return cpuInfo;
}
/**
* jvm
*/
public static JSONObject getJvmInfo() {
JSONObject cpuInfo = new JSONObject();
Properties props = System.getProperties();
Runtime runtime = Runtime.getRuntime();
long jvmTotalMemoryByte = runtime.totalMemory();
long freeMemoryByte = runtime.freeMemory();
//jvm总内存
cpuInfo.put("total", formatByte(runtime.totalMemory()));
//空闲空间
cpuInfo.put("free", formatByte(runtime.freeMemory()));
//jvm最大可申请
cpuInfo.put("max", formatByte(runtime.maxMemory()));
//vm已使用内存
cpuInfo.put("user", formatByte(jvmTotalMemoryByte - freeMemoryByte));
//jvm内存使用率
cpuInfo.put("usageRate", new DecimalFormat("#.##%").format((jvmTotalMemoryByte - freeMemoryByte) * 1.0 / jvmTotalMemoryByte));
//jdk版本
cpuInfo.put("jdkVersion", props.getProperty("java.version"));
//jdk路径
cpuInfo.put("jdkHome", props.getProperty("java.home"));
return cpuInfo;
}
/**
*
*/
public static JSONObject getMemInfo() {
JSONObject cpuInfo = new JSONObject();
GlobalMemory memory = systemInfo.getHardware().getMemory();
//总内存
long totalByte = memory.getTotal();
//剩余
long acaliableByte = memory.getAvailable();
//总内存
cpuInfo.put("total", formatByte(totalByte));
//使用
cpuInfo.put("used", formatByte(totalByte - acaliableByte));
//剩余内存
cpuInfo.put("free", formatByte(acaliableByte));
//使用率
cpuInfo.put("usageRate", new DecimalFormat("#.##%").format((totalByte - acaliableByte) * 1.0 / totalByte));
return cpuInfo;
}
/**
*
*/
public static JSONArray networkIFs() throws Exception {
JSONObject cpuInfo;
JSONArray sysFiles = new JSONArray();
List<NetworkIF> networkIFs = systemInfo.getHardware().getNetworkIFs();
for (NetworkIF networkIF : networkIFs) {
String name = networkIF.getName();
long receiveBytes = networkIF.getBytesRecv();
long transmitBytes = networkIF.getBytesSent();
cpuInfo = new JSONObject();
//名称
cpuInfo.put("name", name);
//网络接收
cpuInfo.put("receiveBytes", formatNumber(receiveBytes / (1024.0 * (2 * 1000 / 1000))));
//网络发送
cpuInfo.put("transmitBytes", formatNumber(transmitBytes / (1024.0 * (2 * 1000 / 1000))));
sysFiles.add(cpuInfo);
}
return sysFiles;
}
public static JSONObject getNetWork() {
JSONObject networkInfo = new JSONObject();
Properties props = System.getProperties();
String os = props.getProperty("os.name").toLowerCase();
os = os.startsWith("win") ? "windows" : "linux";
Map<String, String> result = new HashMap<>();
Process pro = null;
Runtime r = Runtime.getRuntime();
BufferedReader input = null;
try {
String command = "windows".equals(os) ? "netstat -e" : "ifconfig";
pro = r.exec(command);
input = new BufferedReader(new InputStreamReader(pro.getInputStream()));
long result1[] = readInLine(input, os);
Thread.sleep(SLEEP_TIME);
pro.destroy();
input.close();
pro = r.exec(command);
input = new BufferedReader(new InputStreamReader(pro.getInputStream()));
long result2[] = readInLine(input, os);
String rxPercent = formatNumber((result2[0] - result1[0]) / (1024.0 * (SLEEP_TIME / 1000)));// 下行速率(kB/s)
String txPercent = formatNumber((result2[1] - result1[1]) / (1024.0 * (SLEEP_TIME / 1000)));// 上行速率(kB/s)
networkInfo.put("rxPercent", rxPercent);
networkInfo.put("txPercent", txPercent);
} catch (Exception e) {
e.printStackTrace();
} finally {
if (input != null) {
try {
input.close();
} catch (IOException e) {
e.printStackTrace();
}
}
Optional.ofNullable(pro).ifPresent(p -> p.destroy());
}
return networkInfo;
}
private static long[] readInLine(BufferedReader input, String osType) {
long arr[] = new long[2];
StringTokenizer tokenStat = null;
try {
if (osType.equals("linux")) { // 获取linux环境下的网口上下行速率
long rx = 0, tx = 0;
String line = null;
//RX packets:4171603 errors:0 dropped:0 overruns:0 frame:0
//TX packets:4171603 errors:0 dropped:0 overruns:0 carrier:0
while ((line = input.readLine()) != null) {
if (line.indexOf("RX packets") >= 0) {
rx += Long.parseLong(line.substring(line.indexOf("RX packets") + 11, line.indexOf(" ", line.indexOf("RX packets") + 11)));
} else if (line.indexOf("TX packets") >= 0) {
tx += Long.parseLong(line.substring(line.indexOf("TX packets") + 11, line.indexOf(" ", line.indexOf("TX packets") + 11)));
}
}
arr[0] = rx;
arr[1] = tx;
} else { // 获取windows环境下的网口上下行速率
input.readLine();
input.readLine();
input.readLine();
input.readLine();
tokenStat = new StringTokenizer(input.readLine());
tokenStat.nextToken();
arr[0] = Long.parseLong(tokenStat.nextToken());
arr[1] = Long.parseLong(tokenStat.nextToken());
}
} catch (Exception e) {
e.printStackTrace();
}
return arr;
}
private static String formatNumber(double f) {
return new Formatter().format("%.2f", f).toString();
}
/**
*
*/
public static JSONArray getSysFileInfo() {
JSONObject cpuInfo;
JSONArray sysFiles = new JSONArray();
FileSystem fileSystem = operatingSystem.getFileSystem();
List<OSFileStore> fsArray = fileSystem.getFileStores();
for (OSFileStore fs : fsArray) {
cpuInfo = new JSONObject();
//盘符路径
cpuInfo.put("dirName", fs.getMount());
//盘符类型
cpuInfo.put("sysTypeName", fs.getType());
//文件类型
cpuInfo.put("typeName", fs.getName());
//总大小
cpuInfo.put("total", formatByte(fs.getTotalSpace()));
//剩余大小
cpuInfo.put("free", formatByte(fs.getUsableSpace()));
//已经使用量
cpuInfo.put("used", formatByte(fs.getTotalSpace() - fs.getUsableSpace()));
if (fs.getTotalSpace() == 0) {
//资源的使用率
cpuInfo.put("usage", 0);
} else {
cpuInfo.put("usage", new DecimalFormat("#.##%").format((fs.getTotalSpace() - fs.getUsableSpace()) * 1.0 / fs.getTotalSpace()));
}
sysFiles.add(cpuInfo);
}
return sysFiles;
}
/**
*
*/
public static JSONObject getSysInfo() throws UnknownHostException {
JSONObject cpuInfo = new JSONObject();
Properties props = System.getProperties();
//操作系统名
cpuInfo.put("osName", props.getProperty("os.name"));
//系统架构
cpuInfo.put("osArch", props.getProperty("os.arch"));
//服务器名称
cpuInfo.put("computerName", InetAddress.getLocalHost().getHostName());
//服务器Ip
cpuInfo.put("computerIp", InetAddress.getLocalHost().getHostAddress());
//项目路径
cpuInfo.put("userDir", props.getProperty("user.dir"));
return cpuInfo;
}
/**
*
*/
public static JSONObject getInfo() throws Exception {
JSONObject info = new JSONObject();
info.put("cpuInfo", getCpuInfo());
info.put("jvmInfo", getJvmInfo());
info.put("memInfo", getMemInfo());
info.put("sysInfo", getSysInfo());
info.put("sysFileInfo", getSysFileInfo());
info.put("networkInfo", getNetWork());
return info;
}
/**
*
*/
private static String formatByte(long byteNumber) {
//换算单位
double FORMAT = 1024.0;
double kbNumber = byteNumber / FORMAT;
if (kbNumber < FORMAT) {
return new DecimalFormat("#.##KB").format(kbNumber);
}
double mbNumber = kbNumber / FORMAT;
if (mbNumber < FORMAT) {
return new DecimalFormat("#.##MB").format(mbNumber);
}
double gbNumber = mbNumber / FORMAT;
if (gbNumber < FORMAT) {
return new DecimalFormat("#.##GB").format(gbNumber);
}
double tbNumber = gbNumber / FORMAT;
return new DecimalFormat("#.##TB").format(tbNumber);
}
}

@ -0,0 +1,48 @@
package com.docus.server.controller;
import com.docus.server.api.collector.update.CollectorUpdateApi;
import com.docus.server.common.service.IFileUploadService;
import com.docus.server.service.ICollectorUpdateService;
import com.docus.server.vo.collector.update.CollectorUpdateVersionVO;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletResponse;
/**
*
*
* @author AutoGenerator
* @since 2023-08-29
*/
@Api(value = "采集器更新配置", tags = "采集器更新配置")
@RestController
public class CollectorUpdateController implements CollectorUpdateApi {
@Resource
private ICollectorUpdateService iCollectorUpdateService;
@Resource
private IFileUploadService iFileUploadService;
/**
*
*/
@ApiOperation("获取采集器版本号")
@Override
public CollectorUpdateVersionVO find() throws Exception {
return iCollectorUpdateService.find();
}
/**
*
*/
@ApiOperation("采集器部署包下载")
@Override
public void downloadFile(HttpServletResponse response) throws Exception {
String filePath = iCollectorUpdateService.getFilePath();
iFileUploadService.downloadFile(filePath, response);
}
}

@ -0,0 +1,7 @@
package com.docus.server.infrastructure.cache;
import com.docus.server.annotation.CacheLayer;
@CacheLayer("schetaskCacheLayer")
public class TaskCacheLayer {
}

@ -0,0 +1,4 @@
package com.docus.server.infrastructure.client;
public class DownLoadAPI {
}

@ -0,0 +1,17 @@
package com.docus.server.service;
import com.docus.server.vo.collector.update.CollectorUpdateVersionVO;
/**
*
*
* @author AutoGenerator
* @since 2023-08-29
*/
public interface ICollectorUpdateService {
CollectorUpdateVersionVO find() throws Exception;
String getFilePath() throws Exception;
}

@ -0,0 +1,43 @@
package com.docus.server.service.impl;
import com.docus.server.common.util.YmlUtil;
import com.docus.server.service.ICollectorUpdateService;
import com.docus.server.vo.collector.update.CollectorUpdateVersionVO;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import java.util.LinkedHashMap;
/**
*
*
* @author AutoGenerator
* @since 2023-08-29
*/
@Service
@Slf4j
public class CollectorUpdateServiceImpl implements ICollectorUpdateService {
@Override
public CollectorUpdateVersionVO find() throws Exception {
String version = loadYaml("docus.collector.version");
return CollectorUpdateVersionVO.builder().updateNumber(version).build();
}
@Override
public String getFilePath() throws Exception {
return loadYaml("docus.collector.download-folder");
}
public String loadYaml(String key) throws Exception {
LinkedHashMap params = YmlUtil.loadYaml("bootstrap.yml");
return (String) YmlUtil.getValByKey(params, key);
}
}

@ -0,0 +1,9 @@
#当前项目的根package
api.base-package=com.docus.server
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://db.docus.cn:3306/docus_ocr?autoReconnect=true&allowMultiQueries=true&useSSL=false&useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai
spring.datasource.username=docus
spring.datasource.password=docus702
mybatis-plus.type-enums-package=com.docus.server.enums

@ -0,0 +1,6 @@
@echo off
WinSW.exe status|findstr NonExistent && winsw install
WinSW.exe status|findstr stopped && winsw start

@ -0,0 +1,21 @@
@echo off
set deployDir=%1\@project.artifactId@
if %deployDir%=="" set deployDir=d:\webroot\@project.artifactId@
set curr_file=%cd%
cd /d %deployDir%
call stop.bat
sc query @project.artifactId@ |Find "RUNNING" && ping 127.0.0.1 -n 10 >nul
cd %curr_file%
rd/s/q %deployDir%\lib
rd/s/q %deployDir%\dataConfig
rd/s/q %deployDir%\config
rd/s/q %deployDir%\mybatis.mapper
del /s/q %deployDir%\*.jar
xcopy /Y/E/I * %deployDir%
cd /d %deployDir%
call auto.bat
cd %curr_file%

@ -0,0 +1,21 @@
set java_opts=-Xms512m -Xmx512m
set key="java_opts"
rem 文件不存在,就跳过
if not exist java-ops.ini goto end
for /f "tokens=1,2 delims==" %%i in (java-ops.ini) do (
if "%%i"==%key% set java_opts=%%j)
echo java_opts is : %java_opts%
:end
rem 启动java
java %java_opts% -Dfile.encoding=utf-8 -jar -Dspring.profiles.active=@profile.name@ -Dloader.path=config,lib @project.build.finalName@.jar

@ -0,0 +1,47 @@
@echo off
set curr_file=%cd%
set parentDir=%1
if %parentDir%=="" set deployDir=d:\webroot
set deployDir=%parentDir%\@project.artifactId@
set backupDir=%parentDir%\backup
set dateStr=%date:~0,4%%date:~5,2%%date:~8,2%%time:~0,2%%time:~3,2%%time:~6,2%
cd /d %deployDir%
call stop.bat
sc query @project.artifactId@ |Find "RUNNING" && ping 127.0.0.1 -n 10 >nul
cd /d %parentDir%
xcopy /Y/E/I project.artifactId@\lib %backupDir%\%dateStr%\@project.artifactId@lib
xcopy /Y/E/I project.artifactId@\config %backupDir%\%dateStr%\@project.artifactId@config
xcopy /Y/E/I project.artifactId@\*.jar %backupDir%\%dateStr%\@project.artifactId@
xcopy /Y/E/I project.artifactId@\*.bat %backupDir%\%dateStr%\@project.artifactId@
xcopy /Y/E/I project.artifactId@\*.exe %backupDir%\%dateStr%\@project.artifactId@
xcopy /Y/E/I project.artifactId@\*.xml %backupDir%\%dateStr%\@project.artifactId@
cd %curr_file%
rd/s/q %deployDir%\lib
rd/s/q %deployDir%\config
del /s/q %deployDir%\*.jar
xcopy /Y/E/I lib %deployDir%\lib
xcopy /Y/E/I config %deployDir%\config
xcopy /Y/E/I *.jar %deployDir%
xcopy /Y/E/I *.bat %deployDir%
xcopy /Y/E/I *.exe %deployDir%
xcopy /Y/E/I *.xml %deployDir%
cd /d %deployDir%
call auto.bat
cd %curr_file%

@ -0,0 +1,8 @@
<service>
<id>docus-collector-update</id>
<name>生产-采集器更新(docus-collector-update)-服务</name>
<description>生产-采集器更新(docus-collector-update)-服务</description>
<startmode>Automatic</startmode>
<executable>%BASE%\start.bat</executable>
<log mode="none"></log>
</service>

@ -0,0 +1,45 @@
server:
port: 9116
spring:
profiles:
active: dev
application:
name: @artifactId@
servlet:
multipart:
max-file-size: 100MB
max-request-size: 200MB
redis:
host: redis.docus.cn
password: JSdocus@702
cloud:
nacos:
discovery:
server-addr: nacos.docus.cn
namespace: 34acdf7a-9fc6-4bbd-8aea-9a47c8007ad5
config:
server-addr: ${spring.cloud.nacos.discovery.server-addr}
namespace: 34acdf7a-9fc6-4bbd-8aea-9a47c8007ad5
file-extension: yml
shared-configs:
- comm.${spring.cloud.nacos.config.file-extension}
mybatis-plus:
configuration:
map-underscore-to-camel-case: true
call-setters-on-nulls: true
jdbc-type-for-null: null
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
global-config:
db-config:
update-strategy: ignored
field-strategy: NOT_EMPTY
db-type: MYSQL
mapper-locations: classpath*:/mapper/*Mapper.xml
type-enums-package: com.docus.server.enums
docus:
collector:
version: 1.0.0.1
download-folder: D:\\JS\\UpateGD\\collector.zip

@ -0,0 +1,2 @@
# If you use SLF4J. First, you need to tell log4jdbc-log4j2 that you want to use the SLF4J logger
log4jdbc.spylogdelegator.name=net.sf.log4jdbc.log.slf4j.Slf4jSpyLogDelegator

@ -0,0 +1,104 @@
<?xml version="1.0" encoding="UTF-8"?>
<configuration debug="false" scan="true" scanPeriod="1 seconds">
<contextName>docus-collector-update</contextName>
<property name="log.path" value="logs/logback"/>
<appender name="console" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>[%d{yyyy-MM-dd' 'HH:mm:ss.sss}] [%contextName] [%thread] [%X{traceId}] %-5level %logger{36} - %msg%n</pattern>
</encoder>
</appender>
<!-- <appender name="action" class="ch.qos.logback.core.ConsoleAppender">-->
<!-- <encoder class="com.docus.infrastructure.log.FilterMessagePatternLayoutEncoder">-->
<!-- <pattern>%message%n</pattern>-->
<!-- </encoder>-->
<!-- </appender>-->
<appender name="file" class="ch.qos.logback.core.rolling.RollingFileAppender">
<encoder>
<!-- 指定日志输出格式 -->
<pattern>[%d{yyyy-MM-dd' 'HH:mm:ss.sss}] [%C] [%t] [%X{traceId}] [%L] [%-5p] %m%n</pattern>
<charset>utf-8</charset>
</encoder>
<!-- 指定收集策略:滚动策略-->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!--指定生成日志保存地址 -->
<fileNamePattern>${log.path}%d.%i.log</fileNamePattern>
<timeBasedFileNamingAndTriggeringPolicy
class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>500MB</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
<MaxHistory>30</MaxHistory>
</rollingPolicy>
</appender>
<appender name="external-interface" class="ch.qos.logback.core.rolling.RollingFileAppender">
<encoder>
<!-- 指定日志输出格式 -->
<pattern>[%d{yyyy-MM-dd' 'HH:mm:ss.sss}] [%C] [%t] [%X{traceId}] [%L] [%-5p] %m%n</pattern>
<charset>utf-8</charset>
</encoder>
<!-- 指定收集策略:滚动策略-->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!--指定生成日志保存地址 -->
<fileNamePattern>${log.path}external%d.%i.log</fileNamePattern>
<timeBasedFileNamingAndTriggeringPolicy
class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>500MB</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
<MaxHistory>30</MaxHistory>
</rollingPolicy>
</appender>
<logger name="com.docus.services.system.service.ClientGetBasicServiceImpl" level="DEBUG" additivity="false">
<appender-ref ref="external-interface"/>
</logger>
<!-- <logger name="com.docus.infrastructure.log.ActionLogger" additivity="false" level="INFO">-->
<!-- <appender-ref ref="action"/>-->
<!-- </logger>-->
<springProfile name="dev">
<root level="debug">
<appender-ref ref="console"/>
</root>
</springProfile>
<springProfile name="test|prod">
<root level="INFO">
<appender-ref ref="file"/>
</root>
</springProfile>
<!-- 监控sql日志输出-->
<!-- 如想看到表格数据将OFF改为INFO -->
<logger name="jdbc.resultsettable" level="debug" additivity="false">
<appender-ref ref="console"/>
</logger>
<!-- 包含 SQL 语句实际的执行时间 及sql语句与jdbc.sqlonly功能重复 -->
<logger name="jdbc.sqltiming" level="debug" additivity="false">
<appender-ref ref="file"/>
</logger>
<!-- 仅仅记录 SQL 语句,会将占位符替换为实际的参数-->
<logger name="jdbc.sqlonly" level="OFF" additivity="false">
<appender-ref ref="console"/>
</logger>
<!-- 包含 ResultSet 的信息,输出篇幅较长 -->
<logger name="jdbc.resultset" level="OFF" additivity="false">
<appender-ref ref="console"/>
</logger>
<!-- 输出了 Connection 的 open、close 等信息 -->
<logger name="jdbc.connection" level="OFF" additivity="false">
<appender-ref ref="console"/>
</logger>
<!-- 除了 ResultSet 之外的所有JDBC调用信息篇幅较长 -->
<logger name="jdbc.audit" level="OFF" additivity="false">
<appender-ref ref="console"/>
</logger>
</configuration>

@ -0,0 +1,56 @@
package com.docus.server;
import oshi.SystemInfo;
import oshi.hardware.CentralProcessor;
import oshi.hardware.GlobalMemory;
import oshi.hardware.HardwareAbstractionLayer;
import oshi.hardware.NetworkIF;
import oshi.software.os.FileSystem;
import oshi.software.os.OSFileStore;
import java.util.Arrays;
import java.util.List;
public class Example {
public static void main(String[] args) {
SystemInfo systemInfo = new SystemInfo();
CentralProcessor processor = systemInfo.getHardware().getProcessor();
int logicalProcessorCount = processor.getLogicalProcessorCount();
String cpuModel = processor.getProcessorIdentifier().getName();
long[] systemCpuLoadTicks = processor.getSystemCpuLoadTicks();
System.out.println(logicalProcessorCount);
System.out.println(cpuModel);
System.out.println(Arrays.asList(systemCpuLoadTicks));
GlobalMemory memory = systemInfo.getHardware().getMemory();
long totalMemorySize = memory.getTotal();
long availableMemorySize = memory.getAvailable();
double memoryUsage = (totalMemorySize - availableMemorySize) * 100.0 / totalMemorySize;
System.out.println(totalMemorySize);
System.out.println(availableMemorySize);
System.out.println(memoryUsage);
HardwareAbstractionLayer hal = systemInfo.getHardware();
FileSystem fileSystem = systemInfo.getOperatingSystem().getFileSystem();
List<OSFileStore> fileStores = fileSystem.getFileStores();
for (OSFileStore store : fileStores) {
long totalSpace = store.getTotalSpace();
long usableSpace = store.getUsableSpace();
double usage = (totalSpace - usableSpace) * 100.0 / totalSpace;
System.out.println(totalSpace);
System.out.println(usableSpace);
System.out.println(usage);
}
List<NetworkIF> networkIFs = systemInfo.getHardware().getNetworkIFs();
for (NetworkIF networkIF : networkIFs) {
String name = networkIF.getName();
long receiveBytes = networkIF.getBytesRecv();
long transmitBytes = networkIF.getBytesSent();
System.out.println(name);
System.out.println(receiveBytes);
System.out.println(transmitBytes);
}
}
}

@ -0,0 +1,83 @@
package com.docus.server;
import cn.hutool.core.util.ZipUtil;
import cn.hutool.http.HttpRequest;
import com.google.common.collect.Lists;
import io.swagger.annotations.ApiOperation;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.web.bind.annotation.PostMapping;
import java.io.File;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
/**
* API
*
* @author AutoGenerator
* @since 2023-07-15
*/
@SpringBootTest
public class FileController {
public static void test1() throws Exception {
ZipUtil.unzip("/Users/linruifeng/Desktop/collector_packages/collector.zip", "/Users/linruifeng/Desktop/collector_packages");
// ZipUtil.unGzip(new GZIPInputStream(new FileInputStream(new File("/Users/linruifeng/Desktop/collector_packages/index.tar.gz"))));
// FileUtils.unTarGz("/Users/linruifeng/Desktop/collector_packages/", "/Users/linruifeng/Desktop/collector_packages/test");
}
@ApiOperation("test")
@PostMapping("/test")
public void test2() throws Exception {
File file = new File("D:\\docus\\cut\\segmentation\\20230822\\c6b03e5767814895a2c155c32f174051\\麻醉.jpg");
File file1 = new File("D:\\docus\\cut\\segmentation\\20230822\\c6b03e5767814895a2c155c32f174052\\麻醉.jpg");
Map<String, Object> data = new HashMap<>();
data.put("files", file);
data.put("filetype", "jpg");
ArrayList<File> files = Lists.newArrayList(file, file1);
String body = HttpRequest.post("http://localhost:9115/file/upload")
.form("files", files.toArray(new File[files.size()]))
.form("pathKey", "{\n" +
" \"success\": true,\n" +
" \"datas\": [\n" +
" {\n" +
" \"index\": 0,\n" +
" \"file_type\": \"string\",\n" +
" \"angle\": \"string\",\n" +
" \"decline\": true,\n" +
" \"hand_shadow\": true,\n" +
" \"sort\": [\n" +
" \"string\"\n" +
" ],\n" +
" \"data\": [\n" +
" {\n" +
" \"boxes\": {\n" +
" \"left\": 0,\n" +
" \"right\": 0,\n" +
" \"top\": 0,\n" +
" \"bottom\": 0\n" +
" },\n" +
" \"text\": \"string\"\n" +
" }\n" +
" ]\n" +
" }\n" +
" ],\n" +
" \"time\": 0,\n" +
" \"message\": \"string\"\n" +
"}")
.contentType("multipart/form-data")
.execute()
.body();
System.out.println(body);
}
}

@ -0,0 +1,162 @@
package com.docus.server;
import org.apache.tools.tar.TarInputStream;
import java.io.*;
import java.util.zip.GZIPInputStream;
/**
* @program: JavaCode
* @ClassName FileUtils
* @description:
* @author: ltcz99
* @create: 2023-04-16
* @Version 1.0
**/
public class FileUtils {
/**
* tar.gz
*
* @param sourceDir
* @param destDir
*/
public static void unTarGz(String sourceDir, String destDir) throws Exception {
File outFile = new File(sourceDir);
File[] files = outFile.listFiles();
try {
//创建输出目录
createDirectory(destDir, null);
TarInputStream tarIn;
int index = 1;
for (File file : files) {
if (file.getName().contains("tar.gz")) {
tarIn = new TarInputStream(new GZIPInputStream(
new BufferedInputStream(new FileInputStream(file))),
1024 * 2);
String outFileName = destDir + "/" + file.getName();
OutputStream out = new FileOutputStream(new File(outFileName));
int length = 0;
byte[] b = new byte[2048];
while ((length = tarIn.read(b)) != -1) {
out.write(b, 0, length);
}
out.close();
tarIn.close();
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* gz
*
* @param sourceDir
* @param destDir
*/
public static void unGzipFile(String sourceDir, String destDir) {
//创建输出目录
createDirectory(destDir, null);
File sourceFile = new File(sourceDir);
File[] files = sourceFile.listFiles();
try {
int index = 1;
for (File file : files) {
if (file.getName().contains("gz")) {
FileInputStream fin = new FileInputStream(file);
//建立gzip解压工作流
GZIPInputStream gzin = new GZIPInputStream(fin);
//建立解压文件输出流
File tmpFile = new File(destDir + "/" + index++ + ".log");
FileOutputStream fout = new FileOutputStream(tmpFile);
int length;
byte[] buf = new byte[2048];
while ((length = gzin.read(buf, 0, buf.length)) != -1) {
fout.write(buf, 0, length);
}
gzin.close();
fout.close();
fin.close();
}
}
} catch (Exception ex) {
System.err.println(ex);
}
}
/**
*
*
* @param sourceLogPath
* @param destLogPath
*/
public static void readFileToDestLogPath(String sourceLogPath, String destLogPath) {
File sourceFile = new File(sourceLogPath);
File[] files = sourceFile.listFiles();
for (File file : files) {
String fileName = destLogPath + "/" + file.getName();
File destFile = new File(fileName);
if (file.getName().contains("log") && !fileName.contains("gz")) {
try {
if (destFile.exists()) {
destFile.delete();
}
String logFile = sourceFile + "/" + file.getName();
FileInputStream fis = new FileInputStream(logFile);
FileOutputStream fos = new FileOutputStream(destFile);
BufferedInputStream bis = new BufferedInputStream(fis);
BufferedOutputStream bos = new BufferedOutputStream(fos);
int len = 0;
while ((len = bis.read()) != -1) {
bos.write(len);
}
bos.flush();
// 关闭资源
fis.close();
bis.close();
fos.close();
bos.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
/**
*
*
* @param outputDir
* @param subDir
*/
public static void createDirectory(String outputDir, String subDir) {
File file = new File(outputDir);
//子目录不为空
if (!(subDir == null || subDir.trim().equals(""))) {
file = new File(outputDir + "/" + subDir);
}
if (!file.exists()) {
if (!file.getParentFile().exists()) {
file.getParentFile().mkdirs();
}
file.mkdirs();
}
}
public static void main(String[] args) throws Exception {
String sourceDir = "/Users/ltcz99/Downloads/templog";
String destDir = "/Users/ltcz99/Downloads/unzip/";
//解压.gz文件到指定的文件件下面
unGzipFile(sourceDir, destDir);
// 解压tar.gz文件到指定的文件夹下面
unTarGz(sourceDir, destDir);
//读取特定的文件到指定的文件夹下面
readFileToDestLogPath(sourceDir, destDir);
}
}

@ -0,0 +1,60 @@
package com.docus.server;
import cn.hutool.core.img.ImgUtil;
import cn.hutool.core.io.FileUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.http.HttpRequest;
import java.io.File;
import java.util.HashMap;
import java.util.Map;
public class ImageProcessingExample {
public static void main(String[] args) throws Exception {
// UploadBatchFileRequest uploadBatchFileParam = new UploadBatchFileRequest();
// System.out.println(JSON.toJSON(uploadBatchFileParam));
//
// FileDTO fileDto = new FileDTO();
// System.out.println(JSON.toJSON(fileDto));
//
// List<FileDTO> fileDtoList = new ArrayList<>();
// System.out.println(JSON.toJSON(fileDtoList));
// 1. 调整图片大小
ImgUtil.scale(FileUtil.file("C:\\Users\\dataexa\\Desktop\\麻醉.jpg"), FileUtil.file("C:\\Users\\dataexa\\Desktop\\output-麻醉.jpg"), 0.5f);
// 2. 裁剪图片
// ImgUtil.cut(FileUtil.file("C:\\Users\\dataexa\\Desktop\\麻醉.jpg"), FileUtil.file("C:\\Users\\dataexa\\Desktop\\output1.jpg"), new Rectangle(50, 50, 2400, (3527 / 2) / 2)); // 从input.jpg中裁剪出一个200x200的区域保存为output.jpg
// 5. 图片旋转
// Image image = ImgUtil.rotate(ImageIO.read(FileUtil.file("C:\\Users\\dataexa\\Desktop\\麻醉.jpg")), 90);
// ImgUtil.write(image, FileUtil.file("C:\\Users\\dataexa\\Desktop\\output2.jpg"));
// uploadByte("D:\\docus\\cut\\segmentation\\20230822\\c6b03e5767814895a2c155c32f174051\\麻醉.jpg");
}
public static void uploadByte(String path) {
File toFile = new File(path);
Map data = new HashMap();
data.put("file", toFile);
data.put("filetype", "jpg");
String body = HttpRequest.post("http://192.168.16.85:9999/uploadfile")
.form(data)
.contentType("multipart/form-data")
.execute()
.body();
if (StrUtil.isNotBlank(body)) {
// OcrResponse jsonRootBean = JSON.parseObject(body, OcrResponse.class);
// System.out.println(jsonRootBean);
}
// Boolean success = (Boolean)result.get("success");
// BigDecimal time = (BigDecimal)result.get("time");
}
}

@ -0,0 +1,313 @@
package com.docus.server;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import oshi.SystemInfo;
import oshi.hardware.CentralProcessor;
import oshi.hardware.GlobalMemory;
import oshi.hardware.HardwareAbstractionLayer;
import oshi.hardware.NetworkIF;
import oshi.software.os.FileSystem;
import oshi.software.os.OSFileStore;
import oshi.software.os.OperatingSystem;
import oshi.util.Util;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.InetAddress;
import java.net.UnknownHostException;
import java.text.DecimalFormat;
import java.util.Formatter;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import java.util.Properties;
import java.util.StringTokenizer;
/**
*
**/
public class SystemInfoUtils {
private static final int OSHI_WAIT_SECOND = 1000;
private static final int SLEEP_TIME = 2 * 1000;
private static SystemInfo systemInfo = new SystemInfo();
private static HardwareAbstractionLayer hardware = systemInfo.getHardware();
private static OperatingSystem operatingSystem = systemInfo.getOperatingSystem();
public static void main(String[] args) throws Exception {
JSONObject info = getInfo();
System.out.println(info);
}
public static JSONObject getCpuInfo() {
JSONObject cpuInfo = new JSONObject();
CentralProcessor processor = hardware.getProcessor();
// CPU信息
long[] prevTicks = processor.getSystemCpuLoadTicks();
Util.sleep(OSHI_WAIT_SECOND);
long[] ticks = processor.getSystemCpuLoadTicks();
long nice = ticks[CentralProcessor.TickType.NICE.getIndex()] - prevTicks[CentralProcessor.TickType.NICE.getIndex()];
long irq = ticks[CentralProcessor.TickType.IRQ.getIndex()] - prevTicks[CentralProcessor.TickType.IRQ.getIndex()];
long softirq = ticks[CentralProcessor.TickType.SOFTIRQ.getIndex()] - prevTicks[CentralProcessor.TickType.SOFTIRQ.getIndex()];
long steal = ticks[CentralProcessor.TickType.STEAL.getIndex()] - prevTicks[CentralProcessor.TickType.STEAL.getIndex()];
long cSys = ticks[CentralProcessor.TickType.SYSTEM.getIndex()] - prevTicks[CentralProcessor.TickType.SYSTEM.getIndex()];
long user = ticks[CentralProcessor.TickType.USER.getIndex()] - prevTicks[CentralProcessor.TickType.USER.getIndex()];
long iowait = ticks[CentralProcessor.TickType.IOWAIT.getIndex()] - prevTicks[CentralProcessor.TickType.IOWAIT.getIndex()];
long idle = ticks[CentralProcessor.TickType.IDLE.getIndex()] - prevTicks[CentralProcessor.TickType.IDLE.getIndex()];
long totalCpu = user + nice + cSys + idle + iowait + irq + softirq + steal;
//cpu核数
cpuInfo.put("cpuNum", processor.getLogicalProcessorCount());
//cpu系统使用率
cpuInfo.put("cSys", new DecimalFormat("#.##%").format(cSys * 1.0 / totalCpu));
//cpu用户使用率
cpuInfo.put("user", new DecimalFormat("#.##%").format(user * 1.0 / totalCpu));
//cpu当前等待率
cpuInfo.put("iowait", new DecimalFormat("#.##%").format(iowait * 1.0 / totalCpu));
//cpu当前使用率
cpuInfo.put("idle", new DecimalFormat("#.##%").format(1.0 - (idle * 1.0 / totalCpu)));
return cpuInfo;
}
/**
* jvm
*/
public static JSONObject getJvmInfo() {
JSONObject cpuInfo = new JSONObject();
Properties props = System.getProperties();
Runtime runtime = Runtime.getRuntime();
long jvmTotalMemoryByte = runtime.totalMemory();
long freeMemoryByte = runtime.freeMemory();
//jvm总内存
cpuInfo.put("total", formatByte(runtime.totalMemory()));
//空闲空间
cpuInfo.put("free", formatByte(runtime.freeMemory()));
//jvm最大可申请
cpuInfo.put("max", formatByte(runtime.maxMemory()));
//vm已使用内存
cpuInfo.put("user", formatByte(jvmTotalMemoryByte - freeMemoryByte));
//jvm内存使用率
cpuInfo.put("usageRate", new DecimalFormat("#.##%").format((jvmTotalMemoryByte - freeMemoryByte) * 1.0 / jvmTotalMemoryByte));
//jdk版本
cpuInfo.put("jdkVersion", props.getProperty("java.version"));
//jdk路径
cpuInfo.put("jdkHome", props.getProperty("java.home"));
return cpuInfo;
}
/**
*
*/
public static JSONObject getMemInfo() {
JSONObject cpuInfo = new JSONObject();
GlobalMemory memory = systemInfo.getHardware().getMemory();
//总内存
long totalByte = memory.getTotal();
//剩余
long acaliableByte = memory.getAvailable();
//总内存
cpuInfo.put("total", formatByte(totalByte));
//使用
cpuInfo.put("used", formatByte(totalByte - acaliableByte));
//剩余内存
cpuInfo.put("free", formatByte(acaliableByte));
//使用率
cpuInfo.put("usageRate", new DecimalFormat("#.##%").format((totalByte - acaliableByte) * 1.0 / totalByte));
return cpuInfo;
}
/**
*
*/
public static JSONArray networkIFs() throws Exception {
JSONObject cpuInfo;
JSONArray sysFiles = new JSONArray();
List<NetworkIF> networkIFs = systemInfo.getHardware().getNetworkIFs();
for (NetworkIF networkIF : networkIFs) {
String name = networkIF.getName();
long receiveBytes = networkIF.getBytesRecv();
long transmitBytes = networkIF.getBytesSent();
cpuInfo = new JSONObject();
//名称
cpuInfo.put("name", name);
//网络接收
cpuInfo.put("receiveBytes", formatNumber(receiveBytes / (1024.0 * (2 * 1000 / 1000))));
//网络发送
cpuInfo.put("transmitBytes", formatNumber(transmitBytes / (1024.0 * (2 * 1000 / 1000))));
sysFiles.add(cpuInfo);
}
return sysFiles;
}
public static JSONObject getNetWork() {
JSONObject networkInfo = new JSONObject();
Properties props = System.getProperties();
String os = props.getProperty("os.name").toLowerCase();
os = os.startsWith("win") ? "windows" : "linux";
Map<String, String> result = new HashMap<>();
Process pro = null;
Runtime r = Runtime.getRuntime();
BufferedReader input = null;
try {
String command = "windows".equals(os) ? "netstat -e" : "ifconfig";
pro = r.exec(command);
input = new BufferedReader(new InputStreamReader(pro.getInputStream()));
long result1[] = readInLine(input, os);
Thread.sleep(SLEEP_TIME);
pro.destroy();
input.close();
pro = r.exec(command);
input = new BufferedReader(new InputStreamReader(pro.getInputStream()));
long result2[] = readInLine(input, os);
String rxPercent = formatNumber((result2[0] - result1[0]) / (1024.0 * (SLEEP_TIME / 1000)));// 下行速率(kB/s)
String txPercent = formatNumber((result2[1] - result1[1]) / (1024.0 * (SLEEP_TIME / 1000)));// 上行速率(kB/s)
networkInfo.put("rxPercent", rxPercent);
networkInfo.put("txPercent", txPercent);
} catch (Exception e) {
e.printStackTrace();
} finally {
if (input != null) {
try {
input.close();
} catch (IOException e) {
e.printStackTrace();
}
}
Optional.ofNullable(pro).ifPresent(p -> p.destroy());
}
return networkInfo;
}
private static long[] readInLine(BufferedReader input, String osType) {
long arr[] = new long[2];
StringTokenizer tokenStat = null;
try {
if (osType.equals("linux")) { // 获取linux环境下的网口上下行速率
long rx = 0, tx = 0;
String line = null;
//RX packets:4171603 errors:0 dropped:0 overruns:0 frame:0
//TX packets:4171603 errors:0 dropped:0 overruns:0 carrier:0
while ((line = input.readLine()) != null) {
if (line.indexOf("RX packets") >= 0) {
rx += Long.parseLong(line.substring(line.indexOf("RX packets") + 11, line.indexOf(" ", line.indexOf("RX packets") + 11)));
} else if (line.indexOf("TX packets") >= 0) {
tx += Long.parseLong(line.substring(line.indexOf("TX packets") + 11, line.indexOf(" ", line.indexOf("TX packets") + 11)));
}
}
arr[0] = rx;
arr[1] = tx;
} else { // 获取windows环境下的网口上下行速率
input.readLine();
input.readLine();
input.readLine();
input.readLine();
tokenStat = new StringTokenizer(input.readLine());
tokenStat.nextToken();
arr[0] = Long.parseLong(tokenStat.nextToken());
arr[1] = Long.parseLong(tokenStat.nextToken());
}
} catch (Exception e) {
e.printStackTrace();
}
return arr;
}
private static String formatNumber(double f) {
return new Formatter().format("%.2f", f).toString();
}
/**
*
*/
public static JSONArray getSysFileInfo() {
JSONObject cpuInfo;
JSONArray sysFiles = new JSONArray();
FileSystem fileSystem = operatingSystem.getFileSystem();
List<OSFileStore> fsArray = fileSystem.getFileStores();
for (OSFileStore fs : fsArray) {
cpuInfo = new JSONObject();
//盘符路径
cpuInfo.put("dirName", fs.getMount());
//盘符类型
cpuInfo.put("sysTypeName", fs.getType());
//文件类型
cpuInfo.put("typeName", fs.getName());
//总大小
cpuInfo.put("total", formatByte(fs.getTotalSpace()));
//剩余大小
cpuInfo.put("free", formatByte(fs.getUsableSpace()));
//已经使用量
cpuInfo.put("used", formatByte(fs.getTotalSpace() - fs.getUsableSpace()));
if (fs.getTotalSpace() == 0) {
//资源的使用率
cpuInfo.put("usage", 0);
} else {
cpuInfo.put("usage", new DecimalFormat("#.##%").format((fs.getTotalSpace() - fs.getUsableSpace()) * 1.0 / fs.getTotalSpace()));
}
sysFiles.add(cpuInfo);
}
return sysFiles;
}
/**
*
*/
public static JSONObject getSysInfo() throws UnknownHostException {
JSONObject cpuInfo = new JSONObject();
Properties props = System.getProperties();
//操作系统名
cpuInfo.put("osName", props.getProperty("os.name"));
//系统架构
cpuInfo.put("osArch", props.getProperty("os.arch"));
//服务器名称
cpuInfo.put("computerName", InetAddress.getLocalHost().getHostName());
//服务器Ip
cpuInfo.put("computerIp", InetAddress.getLocalHost().getHostAddress());
//项目路径
cpuInfo.put("userDir", props.getProperty("user.dir"));
return cpuInfo;
}
/**
*
*/
public static JSONObject getInfo() throws Exception {
JSONObject info = new JSONObject();
info.put("cpuInfo", getCpuInfo());
info.put("jvmInfo", getJvmInfo());
info.put("memInfo", getMemInfo());
info.put("sysInfo", getSysInfo());
info.put("sysFileInfo", getSysFileInfo());
info.put("networkInfo", getNetWork());
return info;
}
/**
*
*/
private static String formatByte(long byteNumber) {
//换算单位
double FORMAT = 1024.0;
double kbNumber = byteNumber / FORMAT;
if (kbNumber < FORMAT) {
return new DecimalFormat("#.##KB").format(kbNumber);
}
double mbNumber = kbNumber / FORMAT;
if (mbNumber < FORMAT) {
return new DecimalFormat("#.##MB").format(mbNumber);
}
double gbNumber = mbNumber / FORMAT;
if (gbNumber < FORMAT) {
return new DecimalFormat("#.##GB").format(gbNumber);
}
double tbNumber = gbNumber / FORMAT;
return new DecimalFormat("#.##TB").format(tbNumber);
}
}

@ -0,0 +1,87 @@
package com.docus.server;
import cn.smallbun.screw.core.Configuration;
import cn.smallbun.screw.core.engine.EngineConfig;
import cn.smallbun.screw.core.engine.EngineFileType;
import cn.smallbun.screw.core.engine.EngineTemplateType;
import cn.smallbun.screw.core.execute.DocumentationExecute;
import cn.smallbun.screw.core.process.ProcessConfig;
import com.docus.server.api.ocr.OcrApi;
import com.docus.server.vo.ocr.OcrResponse;
import com.zaxxer.hikari.HikariConfig;
import com.zaxxer.hikari.HikariDataSource;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.context.ApplicationContext;
import javax.annotation.Resource;
import javax.sql.DataSource;
import java.io.File;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
@SpringBootTest
class ScrewTests {
@Autowired
private ApplicationContext applicationContext;
@Resource
private OcrApi ocrApi;
@Test
void test() {
HikariConfig hikariConfig = new HikariConfig();
hikariConfig.setDriverClassName("com.mysql.cj.jdbc.Driver");
hikariConfig.setJdbcUrl("jdbc:mysql://db.docus.cn:3306/docus-collector-scheduling?autoReconnect=true&allowMultiQueries=true&useSSL=false&useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai");
hikariConfig.setUsername("docus");
hikariConfig.setPassword("docus702");
//设置可以获取tables remarks信息
hikariConfig.addDataSourceProperty("useInformationSchema", "true");
hikariConfig.setMinimumIdle(2);
hikariConfig.setMaximumPoolSize(5);
DataSource dataSource = new HikariDataSource(hikariConfig);
//生成文件配置
EngineConfig engineConfig = EngineConfig
.builder()
//文件生成路径
.fileOutputDir("h:\\file")
//打开目录
.openOutputDir(false)
//文件类型
.fileType(EngineFileType.HTML)
//生成模板实现
.produceType(EngineTemplateType.freemarker)
.build();
//配置想要生成的表
ProcessConfig processConfig = ProcessConfig
.builder()
//根据名称指定表生成
.designatedTableName(new ArrayList<>())
//根据表前缀生成
.designatedTablePrefix(new ArrayList<>())
//根据表后缀生成
.designatedTableSuffix(new ArrayList<>())
//忽略表名
.ignoreTableName(new ArrayList<>())
//忽略表前缀
.ignoreTablePrefix(new ArrayList<>())
//忽略表后缀
.ignoreTableSuffix(new ArrayList<>())
.build();
//生成文档配置
Configuration configuration = Configuration.builder()
.version("1.0.0")
.description("描述")
.dataSource(dataSource)
.engineConfig(engineConfig)
.produceConfig(processConfig)
.build();
//生成
new DocumentationExecute(configuration).execute();
}
}

@ -12,7 +12,7 @@
<artifactId>docus-collector-server</artifactId>
<packaging>pom</packaging>
<modules>
<module>docus-segmentation</module>
<module>docus-collector-update</module>
<module>docus-api-common</module>
<module>docus-client-interface</module>
</modules>

Loading…
Cancel
Save