From 434a7595e62cf556eff9d42f3677f27298193ff9 Mon Sep 17 00:00:00 2001
From: yj <913944315@qq.com>
Date: Tue, 2 Jul 2024 17:50:30 +0800
Subject: [PATCH] =?UTF-8?q?=E5=B8=82=E5=8C=975=E4=B8=AA=E7=AB=99=E9=87=87?=
=?UTF-8?q?=E9=9B=86=E7=A8=8B=E5=BA=8F?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
device_gather/pom.xml | 5 +
.../common/configvalue/StaticProperties.java | 6 +
.../com/xr/device/common/utils/Files.java | 435 ++++++++++++++++++
.../device/common/utils/PythonExecutor.java | 205 +++++++++
.../xr/device/common/utils/SpringUtils.java | 151 ++++++
.../device/common/utils/StaticPropUtil.java | 6 +
.../model/entity/MeterInitialization.java | 50 ++
.../com/xr/device/model/entity/MeterType.java | 86 ++++
.../mapper/MeterInitializationMapper.java | 20 +
.../device/model/mapper/MeterTypeMapper.java | 20 +
.../service/MeterInitializationService.java | 13 +
.../model/service/MeterTypeService.java | 13 +
.../impl/MeterInitializationServiceImpl.java | 24 +
.../service/impl/MeterTypeServiceImpl.java | 24 +
.../xr/device/schedule/GetMeterSchedule.java | 202 +++++---
.../mapper/MeterInitializationMapper.xml | 20 +
.../main/resources/mapper/MeterTypeMapper.xml | 30 ++
17 files changed, 1243 insertions(+), 67 deletions(-)
create mode 100644 device_gather/src/main/java/com/xr/device/common/utils/Files.java
create mode 100644 device_gather/src/main/java/com/xr/device/common/utils/PythonExecutor.java
create mode 100644 device_gather/src/main/java/com/xr/device/common/utils/SpringUtils.java
create mode 100644 device_gather/src/main/java/com/xr/device/model/entity/MeterInitialization.java
create mode 100644 device_gather/src/main/java/com/xr/device/model/entity/MeterType.java
create mode 100644 device_gather/src/main/java/com/xr/device/model/mapper/MeterInitializationMapper.java
create mode 100644 device_gather/src/main/java/com/xr/device/model/mapper/MeterTypeMapper.java
create mode 100644 device_gather/src/main/java/com/xr/device/model/service/MeterInitializationService.java
create mode 100644 device_gather/src/main/java/com/xr/device/model/service/MeterTypeService.java
create mode 100644 device_gather/src/main/java/com/xr/device/model/service/impl/MeterInitializationServiceImpl.java
create mode 100644 device_gather/src/main/java/com/xr/device/model/service/impl/MeterTypeServiceImpl.java
create mode 100644 device_gather/src/main/resources/mapper/MeterInitializationMapper.xml
create mode 100644 device_gather/src/main/resources/mapper/MeterTypeMapper.xml
diff --git a/device_gather/pom.xml b/device_gather/pom.xml
index 8ad1b2c..7388ac8 100644
--- a/device_gather/pom.xml
+++ b/device_gather/pom.xml
@@ -131,6 +131,11 @@
bcprov-jdk15on
1.59
+
+ com.xr
+ onvif-hk
+ 3.1.0
+
diff --git a/device_gather/src/main/java/com/xr/device/common/configvalue/StaticProperties.java b/device_gather/src/main/java/com/xr/device/common/configvalue/StaticProperties.java
index 21b007c..6cb46d4 100644
--- a/device_gather/src/main/java/com/xr/device/common/configvalue/StaticProperties.java
+++ b/device_gather/src/main/java/com/xr/device/common/configvalue/StaticProperties.java
@@ -14,4 +14,10 @@ public class StaticProperties {
@Value("${upload.img.path}")
private String imgPath;
+ @Value("${python.path}")
+ private String pythonPath;
+
+ @Value("${python.modelPath}")
+ private String modelPath;
+
}
diff --git a/device_gather/src/main/java/com/xr/device/common/utils/Files.java b/device_gather/src/main/java/com/xr/device/common/utils/Files.java
new file mode 100644
index 0000000..8c1c161
--- /dev/null
+++ b/device_gather/src/main/java/com/xr/device/common/utils/Files.java
@@ -0,0 +1,435 @@
+package com.xr.device.common.utils;
+
+import org.apache.commons.io.FileUtils;
+import org.springframework.web.multipart.MultipartFile;
+import sun.misc.BASE64Encoder;
+
+import javax.imageio.ImageIO;
+import java.awt.*;
+import java.awt.geom.Rectangle2D;
+import java.awt.image.BufferedImage;
+import java.io.*;
+import java.net.Authenticator;
+import java.net.PasswordAuthentication;
+import java.net.URL;
+import java.net.URLConnection;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.text.SimpleDateFormat;
+import java.util.Base64;
+import java.util.Date;
+
+public class Files {
+
+ /**
+ * 根据文件路径获取文件字节流
+ * @return
+ * filePath 文件路径
+ * @throws IOException
+ */
+ public static byte[] toByteArray(String filePath) throws IOException {
+ File f = new File(filePath);
+ if (!f.exists()) {
+ throw new FileNotFoundException("文件不存在");
+ }
+
+ ByteArrayOutputStream bos = new ByteArrayOutputStream((int) f.length());
+ BufferedInputStream in = null;
+ try {
+ in = new BufferedInputStream(new FileInputStream(f));
+ int buf_size = 1024;
+ byte[] buffer = new byte[buf_size];
+ int len = 0;
+ while (-1 != (len = in.read(buffer, 0, buf_size))) {
+ bos.write(buffer, 0, len);
+ }
+ return bos.toByteArray();
+ } catch (IOException e) {
+ e.printStackTrace();
+ throw e;
+ } finally {
+ try {
+ in.close();
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ bos.close();
+ }
+ }
+ public static File multipartFileToFile(MultipartFile file) throws Exception {
+ File toFile = null;
+ if (file.equals("") || file.getSize() <= 0) {
+ file = null;
+ } else {
+ InputStream ins = null;
+ ins = file.getInputStream();
+ toFile = new File(file.getOriginalFilename());
+ inputStreamToFile(ins, toFile);
+ ins.close();
+ }
+ return toFile;
+
+ }
+ public static BufferedImage bytesTobufferedImage(byte[] bytes){
+ BufferedImage image = null;
+
+ try {
+ // 利用ByteArrayInputStream将字节数据转换成InputStream
+ ByteArrayInputStream bais = new ByteArrayInputStream(bytes);
+
+ // 使用ImageIO读取InputStream中的数据转换为BufferedImage
+ image = ImageIO.read(bais);
+
+ // 关闭ByteArrayInputStream
+ bais.close();
+ // 此时,image就是转换后的BufferedImage对象,可以进行显示或其他处理
+ // 例如显示图像:
+ // ImageIcon icon=new ImageIcon(image);
+ // JOptionPane.showMessageDialog(null, icon);
+
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ return image;
+ }
+
+ public static String uploadImage(BufferedImage bufferedImage, Integer configId) throws Exception {
+ // 构建完整的路径
+ String fileName = configId+new Date().getTime()+".jpg";
+ SimpleDateFormat sim=new SimpleDateFormat("yyyy-MM-dd");
+ String date = sim.format(new Date());
+ String dates[] = date.split("-");
+
+ String year = dates[0];
+ String month = dates[1];
+ String day = dates[2];
+ //String fullPath = StaticPropUtil.imgPath + configId + File.separator + year + File.separator + month + File.separator + day + File.separator + fileName;
+ String fullPath = StaticPropUtil.imgPath + File.separator + fileName;
+ // 创建目录结构
+ //Path directoryPath = Paths.get(StaticPropUtil.imgPath, configId.toString(), year, month, day);
+ Path directoryPath = Paths.get(StaticPropUtil.imgPath);
+ if (!java.nio.file.Files.exists(directoryPath)) {
+ java.nio.file.Files.createDirectories(directoryPath);
+ }
+
+ // 创建文件并写入图像
+ File file = new File(fullPath);
+ ImageIO.write(bufferedImage, "jpg", file);
+
+ // 构建URL
+ String url = StaticPropUtil.imgUrl + configId + "/" + year + "/"+ month + "/" + day + "/" + fileName;
+ return url;
+ }
+
+
+
+ private static void inputStreamToFile(InputStream ins, File file) {
+ try {
+ OutputStream os = new FileOutputStream(file);
+ int bytesRead = 0;
+ byte[] buffer = new byte[8192];
+ while ((bytesRead = ins.read(buffer, 0, 8192)) != -1) {
+ os.write(buffer, 0, bytesRead);
+ }
+ os.close();
+ ins.close();
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ }
+
+ public static BufferedImage urlByImage(String url,String username,String password) throws IOException {
+ BufferedImage bimg=null;
+ try {
+ // 设置身份验证
+ Authenticator.setDefault(new Authenticator() {
+ protected PasswordAuthentication getPasswordAuthentication() {
+ return new PasswordAuthentication(username, password.toCharArray());
+ }
+ });
+
+ // 创建URL对象并打开连接
+ URL uri = new URL(url);
+ URLConnection connection = uri.openConnection();
+
+ // 获取输入流
+ InputStream inputStream = connection.getInputStream();
+ bimg= ImageIO.read(inputStream);
+ // 关闭流
+ inputStream.close();
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ return bimg;
+ }
+
+ public static BufferedImage urlByImage(String url) throws IOException {
+ URL urlfile = new URL(url);
+ InputStream is2 = urlfile.openStream();
+ BufferedImage uImg= ImageIO.read(is2);
+ return uImg;
+ }
+
+ public static String TransformPhotoToBase64Data(String path){
+ Base64.Encoder encoder= Base64.getEncoder(); //获取Base64编码器
+ byte [] ImgContainer = null ; //数据集缓存器
+ FileInputStream fileInputStream = null; //文件输入流
+ try {
+ System.out.println(path);
+ File file=new File(path);
+ fileInputStream = new FileInputStream(file); //到指定路径寻找文件
+ ImgContainer = new byte[fileInputStream.available()]; //设置图片字节数据缓冲区大小
+ fileInputStream.read(ImgContainer); //将数据流中的图片数据读进缓冲区
+ String Base64ImgData =encoder.encodeToString(ImgContainer); //将图片编码转换成Base64格式的数据集
+ fileInputStream.close(); //关闭数据流
+ return Base64ImgData; //将缓冲区数据转换成字符数据返回
+ } catch (FileNotFoundException e) {
+ return "找不到指定文件!";
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ return "null";
+ }
+
+ public static String getBase64String(MultipartFile multiPartFile) throws IOException {
+ String baseStr = null;
+
+ //把MultipartFile转化为File
+ File file = new File(multiPartFile.getOriginalFilename());
+ FileUtils.copyInputStreamToFile(multiPartFile.getInputStream(), file);
+
+ /* System.out.println("文件名:"+file.getOriginalFilename( ));
+ System.out.println("文件类型:"+file.getContentType());
+ System.out.println("文件大小: "+file.getSize( ));
+ String dateDir = new SimpleDateFormat("yyyy-MM-dd").format(new Date());
+ ClassPathResource PATHS = new ClassPathResource("static/files/");
+ File paths=new File(PATHS.getPath()+file.getOriginalFilename());
+ if (paths.getParentFile() != null && !paths.getParentFile().exists()) {
+ System.out.println("创建父路径");
+ paths.getParentFile().mkdirs();
+ }
+ com.xr.projsystem.common.utils.Base64Utils.decodeFile(
+ com.xr.projsystem.common.utils.Base64Utils.encode(file.getBytes()),paths);
+ mapData.put("url",serverConfig.getUrl()+paths.getPath().substring(paths.getPath().indexOf("files")));
+ System.out.println(serverConfig.getUrl()+paths.getPath().substring(paths.getPath().indexOf("files")));*/
+ try {//file转base64
+ FileInputStream inputStream = new FileInputStream(file);
+ byte[] buffer = new byte[(int) file.length()];
+ inputStream.read(buffer);
+ inputStream.close();
+ baseStr = new BASE64Encoder().encode(buffer);
+
+ } catch (FileNotFoundException e) {
+ e.printStackTrace();
+ } catch (IOException e) {
+ e.printStackTrace();
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ //删除临时文件
+ if (file.exists()) {
+ file.delete();
+ }
+ baseStr = baseStr.replaceAll("\r\n", "");
+ return baseStr;
+ }
+
+
+ public static String BufferedImageToBase64(BufferedImage bufferedImage) {
+ ByteArrayOutputStream baos = new ByteArrayOutputStream();//io流
+ try {
+ ImageIO.write(bufferedImage, "png", baos);//写入流中
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ byte[] bytes = baos.toByteArray();//转换成字节
+ BASE64Encoder encoder = new BASE64Encoder();
+ String png_base64 = encoder.encodeBuffer(bytes).trim();//转换成base64串
+ png_base64 = png_base64.replaceAll("\n", "").replaceAll("\r", "");//删除 \r\n
+ System.out.println("值为:" + "data:image/jpg;base64," + png_base64);
+ return "data:image/jpg;base64," + png_base64;
+ }
+
+ public static String ImageToBase64(BufferedImage bufferedImage) {
+ ByteArrayOutputStream baos = new ByteArrayOutputStream();//io流
+ try {
+ ImageIO.write(bufferedImage, "png", baos);//写入流中
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ byte[] bytes = baos.toByteArray();//转换成字节
+ BASE64Encoder encoder = new BASE64Encoder();
+ String png_base64 = encoder.encodeBuffer(bytes).trim();//转换成base64串
+ png_base64 = png_base64.replaceAll("\n", "").replaceAll("\r", "");//删除 \r\n
+ return png_base64;
+ }
+
+ /** *//**
+ * 旋转图片为指定角度
+ *
+ * @param file
+ * 目标图像
+ * @param degree
+ * 旋转角度
+ * @return
+ */
+ public static BufferedImage rotateImage(File file,
+ int degree) throws Exception{
+// if(degree<0){
+// degree=Math.abs(degree);
+// }else{
+// degree=0-degree;
+// }
+ BufferedImage bufferedimage = ImageIO.read(file);
+ int w= bufferedimage.getWidth();// 得到图片宽度。
+ int h= bufferedimage.getHeight();// 得到图片高度。
+ int type= bufferedimage.getColorModel().getTransparency();// 得到图片透明度。
+ BufferedImage img;// 空的图片。
+ Graphics2D graphics2d;// 空的画笔。
+ (graphics2d= (img= new BufferedImage(w, h, type))
+ .createGraphics()).setRenderingHint(
+ RenderingHints.KEY_INTERPOLATION,
+ RenderingHints.VALUE_INTERPOLATION_BILINEAR);
+ graphics2d.rotate(Math.toRadians(degree),w/2,h/2);// 旋转,degree是整型,度数,比如垂直90度。
+ graphics2d.drawImage(bufferedimage, 0, 0, null);// 从bufferedimagecopy图片至img,0,0是img的坐标。
+ graphics2d.dispose();
+ return img;// 返回复制好的图片,原图片依然没有变,没有旋转,下次还可以使用。
+ }
+
+ public static BufferedImage rotateImage(BufferedImage bufferedimage,int degree){
+ int w= bufferedimage.getWidth();// 得到图片宽度。
+ int h= bufferedimage.getHeight();// 得到图片高度。
+ int type= bufferedimage.getColorModel().getTransparency();// 得到图片透明度。
+ BufferedImage img;// 空的图片。
+ Graphics2D graphics2d;// 空的画笔。
+ (graphics2d= (img= new BufferedImage(w, h, type))
+ .createGraphics()).setRenderingHint(
+ RenderingHints.KEY_INTERPOLATION,
+ RenderingHints.VALUE_INTERPOLATION_BILINEAR);
+ graphics2d.rotate(Math.toRadians(degree), w / 2, h / 2);// 旋转,degree是整型,度数,比如垂直90度。
+ graphics2d.drawImage(bufferedimage, 0, 0, null);// 从bufferedimagecopy图片至img,0,0是img的坐标。
+ graphics2d.dispose();
+ return img;// 返回复制好的图片,原图片依然没有变,没有旋转,下次还可以使用。
+ }
+
+ public static BufferedImage scaledImage(BufferedImage bufferedimage,Double scaled){
+ int width =bufferedimage.getWidth();
+ int height = bufferedimage.getHeight();
+ return new BufferedImage(Double.valueOf(scaled*width).intValue(),Double.valueOf(scaled*height).intValue(),BufferedImage.TYPE_INT_RGB);
+ }
+
+ public static byte[] bufferedImageToByte(BufferedImage bufferedImage) throws IOException{
+ ByteArrayOutputStream os =new ByteArrayOutputStream();
+ ImageIO.write(bufferedImage,"jpg",os);
+ return os.toByteArray();
+ }
+
+
+ public static void savePathForImage(BufferedImage bufferedImage,String path){
+
+ File file=new File(path);
+ // 创建文件输出流
+ try {
+ ImageIO.write(bufferedImage, "png", file);
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+
+ }
+
+ public static String uploadImageForUrl(BufferedImage bufferedImage,String imgPath,String rqImg) throws IOException {
+ File file =new File(imgPath+rqImg);
+ if(!file.getParentFile().exists()){
+ file.getParentFile().mkdirs();
+ }
+ ImageIO.write(bufferedImage,"jpg",file);
+ rqImg=rqImg.replaceAll("\\\\","/");
+ return StaticPropUtil.imgUrl+rqImg;
+ }
+
+ public static String uploadImageForPath(BufferedImage bufferedImage,String imgPath,String rqImg) throws IOException {
+ File file =new File(imgPath+rqImg);
+ if(!file.getParentFile().exists()){
+ file.getParentFile().mkdirs();
+ }
+ ImageIO.write(bufferedImage,"jpg",file);
+ rqImg=(imgPath+rqImg).replace("\\","\\\\");
+ return rqImg;
+ }
+
+ public static BufferedImage drawRectangleAndText(BufferedImage image, double x1, double y1,double x2, double wid, double hei, String text1, String text2) {
+ // 创建一个Graphics2D对象
+ Graphics2D g2d = image.createGraphics();
+
+
+ // 设置抗锯齿
+ g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
+
+
+ // 创建一个Rectangle2D.Double对象
+ Rectangle2D.Double rect = new Rectangle2D.Double(x1, y1, wid, hei);
+
+ // 绘制红色框
+ g2d.setColor(Color.RED);
+ g2d.draw(rect);
+ // 设置粗线条
+ g2d.setStroke(new BasicStroke(3.0f * 30)); // 设置线条宽度为3.0f
+
+ // 设置字体和颜色
+ g2d.setFont(new Font("微软雅黑", Font.BOLD, 38)); // 使用支持中文的字体,增加字体大小
+
+ // 获取当前时间
+ String currentTime = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date());
+ // 获取文本的宽度和高度
+ FontMetrics fm = g2d.getFontMetrics();
+
+ // 绘制当前时间的背景矩形
+ int padding = 20;
+ int currentTimeWidth = fm.stringWidth(currentTime);
+ int currentTimeHeight = fm.getHeight();
+ int rectPadding = 5; // 背景矩形内边距
+ g2d.setColor(new Color(0, 0, 0, 50)); // 黑色半透明背景
+ g2d.fillRect(padding, padding, currentTimeWidth + 2 * rectPadding, currentTimeHeight + 2 * rectPadding);
+
+ // 绘制当前时间在左上角,内边距为20px
+ g2d.setColor(Color.WHITE);
+ int currentTimeX = padding + rectPadding + (currentTimeWidth + rectPadding - currentTimeWidth) / 2;
+ int currentTimeY = padding + rectPadding + fm.getAscent();
+ g2d.drawString(currentTime, currentTimeX, currentTimeY);
+
+ // 绘制文本2的背景矩形
+ int text2Width = fm.stringWidth(text2);
+ int text2Height = fm.getHeight();
+ g2d.setColor(new Color(0, 0, 0, 50)); // 黑色半透明背景
+ g2d.fillRect(padding, padding + currentTimeHeight + rectPadding * 2, text2Width + 2 * rectPadding, text2Height + 2 * rectPadding);
+
+ // 绘制文本2在时间的下面,内边距为20px
+ g2d.setColor(Color.WHITE);
+ int text2X = padding + rectPadding + (text2Width + rectPadding - text2Width) / 2;
+ int text2Y = padding + currentTimeHeight + rectPadding * 3 + fm.getAscent();
+ g2d.drawString(text2, text2X, text2Y);
+
+ // 计算文本1的右上角位置
+ int text1Width = fm.stringWidth(text1);
+ int text1X = (int) (x1 + wid); // 框的右上角位置
+ int text1Y = (int) (y1 + fm.getAscent()); // 框的右上角紧挨着框
+ g2d.setColor(Color.RED);
+
+ g2d.drawString(text1, text1X, text1Y);
+
+
+ // 释放资源
+ g2d.dispose();
+
+ return image;
+ }
+
+ public static void delFile(String url){
+ String filePath = url.replace(StaticPropUtil.imgUrl,StaticPropUtil.imgPath).replace("/","\\");
+ File file = new File(filePath);
+ if(file.exists()){
+ file.delete();
+ }
+ }
+
+}
diff --git a/device_gather/src/main/java/com/xr/device/common/utils/PythonExecutor.java b/device_gather/src/main/java/com/xr/device/common/utils/PythonExecutor.java
new file mode 100644
index 0000000..e43330c
--- /dev/null
+++ b/device_gather/src/main/java/com/xr/device/common/utils/PythonExecutor.java
@@ -0,0 +1,205 @@
+package com.xr.device.common.utils;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.xr.device.model.entity.MeterInitialization;
+import com.xr.device.model.service.MeterInitializationService;
+
+import java.io.*;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+import java.util.stream.Collectors;
+
+public class PythonExecutor {
+
+
+ public static void main(String[] args) throws Exception {
+ try {
+ String pythonPath = StaticPropUtil.pythonPath;
+
+ ProcessBuilder processBuilder = new ProcessBuilder(pythonPath);
+ // 启动子进程
+ Process process = processBuilder.start();
+ BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(process.getOutputStream()));
+ bw.write("import sys\n");
+ bw.write("sys.path.append(\"D:\\smartGrid\\smartGrid\\models\")\n");
+ bw.write("import indicatorLightStatus as ils\n");
+ bw.write("import switchRecognition as sr\n");
+ bw.write("import liquidLevel as ll\n");
+ bw.write("liquid_level_image_path = 'D:\\smartGrid\\smartGrid\\weights\\DIGITAL_METER (41).JPG'\n");
+ bw.write("ll.calculate_rgb_min_max([[112,\"D:\\smartGrid\\smartGrid\\weights\\DIGITAL_METER (41).JPG\"]])\n");
+ bw.write("print(\"Liquid level weights initialized.\")\n");
+ bw.write("liquid_level_image_path = 'D:\\smartGrid\\smartGrid\\weights\\DIGITAL_METER (10).JPG'\n");
+ bw.write("liquid_level = ll.calculate_liquid_level([112,liquid_level_image_path])\n");
+ bw.write("print(f\"Liquid level: {liquid_level}\")\n");
+
+ bw.close();
+
+
+ // 获取子进程的输出流
+ BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()));
+
+ String line;
+ // 读取输出
+ while ((line = reader.readLine()) != null) {
+ System.out.println(line);
+ }
+
+ // 等待进程执行完成
+ int exitCode = process.waitFor();
+ System.out.println("Exit Code: " + exitCode);
+
+ } catch (IOException | InterruptedException e) {
+ e.printStackTrace();
+ }
+
+ }
+
+ private static boolean meterInit(String code) throws Exception {
+ String pythonPath = StaticPropUtil.pythonPath;
+ String modelPath = StaticPropUtil.modelPath;
+
+ ProcessBuilder processBuilder = new ProcessBuilder(pythonPath);
+ // 启动子进程
+ Process process = processBuilder.start();
+ BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(process.getOutputStream()));
+ bw.write("import sys\n");
+ String imports = "sys.path.append(\"%s\")\n";
+ bw.write(String.format(imports, modelPath));
+ bw.write("import indicatorLightStatus as ils\n");
+ bw.write("import switchRecognition as sr\n");
+ bw.write("import liquidLevel as ll\n");
+ bw.write(code);
+ bw.write("print(\"success\")\n");
+ bw.close();
+ BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()));
+
+ List list = new ArrayList<>();
+ String line;
+ // 读取输出
+ while ((line = reader.readLine()) != null) {
+ list.add(line);
+ }
+
+ // 等待进程执行完成
+ int exitCode = process.waitFor();
+ System.out.println("Exit Code: " + exitCode);
+ if (list.contains("success")) {
+ return true;
+ }
+ return false;
+ }
+
+ /**
+ * 初始化算法
+ * id 表计配置ID
+ * sfType 4 灯光 3 开关 5 液位计
+ */
+ public static boolean meterInit(Integer id, String sfType) throws Exception {
+ MeterInitializationService meterInitializationService = SpringUtils.getBean(MeterInitializationService.class);
+ QueryWrapper query = new QueryWrapper<>();
+ query.eq("meter_id", id);
+ query.orderByAsc("serial");
+ List list = meterInitializationService.list(query);
+ List path = list.stream().map(n -> n.getImgAddress()).collect(Collectors.toList());
+ String ph = "";
+ for (String str : path) {
+ str = str.replace("\\", "\\\\");
+ ph += "\"" + str + "\"" + ",";
+ }
+ ph = ph.substring(0, ph.length() - 1);
+ String code = "";
+ if (sfType.equals("4")) {
+ List> list1 = new ArrayList<>();
+ List