xyc
2024-04-26 577e866c218a797770b73081586b66fd6a8f4e41
测试调用python算法库
3个文件已修改
2个文件已添加
162 ■■■■■ 已修改文件
modules/mainPart/src/main/java/com/zt/life/modules/mainPart/async/PythonLib.java 102 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
modules/mainPart/src/main/java/com/zt/life/modules/mainPart/taskReliability/controller/ModelLineController.java 11 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
modules/mainPart/src/main/java/com/zt/life/modules/mainPart/taskReliability/model/PythonResult.java 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
starter/src/main/resources/application.yml 4 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
web/packages/views/pages/generator.vue 32 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
modules/mainPart/src/main/java/com/zt/life/modules/mainPart/async/PythonLib.java
New file
@@ -0,0 +1,102 @@
package com.zt.life.modules.mainPart.async;
import com.alibaba.fastjson.JSONObject;
import com.zt.common.servlet.Result;
import com.zt.life.modules.mainPart.taskReliability.model.PythonResult;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Component;
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
@Component
public class PythonLib {
    private static final Logger logger = LoggerFactory.getLogger(PythonLib.class);
    @Value("${spring.redis.host}")
    private String redisHost;
    @Value("${spring.redis.port}")
    private String redisPort;
    private Long taskId = 123L;
    private String taskFlag = "relia";
    @Autowired
    private RedisTemplate redisTemplate;
    public Result callPython() {
        Result result = null;
        InputStream is = null;
        BufferedReader br = null;
        try {
            Process process = null;
            String command = "python D:\\work\\python\\relia_calc.py";
            command += " " + redisHost + " " + redisPort;
            command += " " + taskFlag + " " + taskId.toString();
            logger.info("cmd命令为:" + command);
            if(System.getProperty("os.name").toLowerCase().indexOf("windows") > -1){
                process = Runtime.getRuntime().exec(new String[]{"cmd", "/c", command});
            }else if(System.getProperty("os.name").toLowerCase().indexOf("linux") > -1){
                process = Runtime.getRuntime().exec(new String[]{"/bin/sh", "-c", command});
            }else{
                throw new Exception("暂不支持该操作系统,进行启动python计算!");
            }
            is = process.getInputStream();
            // 以命令行方式调用python时,返回的结果是GBK编码的,而非utf-8
            br = new BufferedReader(new InputStreamReader(is,"gb2312"));
            String line = br.readLine();
            logger.info("python返回结果:" + line);
            int exitCode = process.waitFor();
            if (exitCode == 0) {
                logger.info("启动python计算成功");
                if (line != null) {
                    PythonResult rtn = JSONObject.parseObject(line, PythonResult.class);
                    if ("0".equals(rtn.getCode())) {
                        result = Result.ok();
                    } else {
                        String errorMsg = rtn.getErrorMsg();
                        throw new RuntimeException("启动python计算失败: errorMsg=" + errorMsg);
                    }
                }
            } else {
                logger.error("启动python计算失败: exitCode=" + exitCode);
                throw new RuntimeException("启动python计算失败: exitCode=" + exitCode);
            }
        } catch (Exception e) {
            logger.error("启动python计算时发生Exception:", e);
            e.printStackTrace();
            result = Result.error(e.getMessage());
        } finally {
            if (is == null) {
                try {
                    is.close();
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
            if (br == null) {
                try {
                    br.close();
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }
        return result;
    }
    public String getPythonCalcResult() {
        String key = taskFlag + taskId.toString();
        logger.info("redis key:" + key);
        String progress = (String)redisTemplate.opsForValue().get(key);
        if (progress==null) progress = "0";
        return progress;
    }
}
modules/mainPart/src/main/java/com/zt/life/modules/mainPart/taskReliability/controller/ModelLineController.java
@@ -12,6 +12,7 @@
import com.zt.common.validator.group.AddGroup;
import com.zt.common.validator.group.DefaultGroup;
import com.zt.common.validator.group.UpdateGroup;
import com.zt.life.modules.mainPart.async.PythonLib;
import com.zt.life.modules.mainPart.taskReliability.model.ModelLine;
import com.zt.life.modules.mainPart.taskReliability.model.ModelRbd;
import com.zt.life.modules.mainPart.taskReliability.service.ModelLineService;
@@ -42,16 +43,15 @@
    @Autowired
    private ModelLineService modelLineService;
//    @Autowired
//    private PythonLib pythonLib;
    @Autowired
    private PythonLib pythonLib;
/*
    @GetMapping("callPythonCalc")
    @ApiOperation("信息")
    public Result callPythonCalc() {
        pythonLib.callPython();
        Result result = pythonLib.callPython();
        return Result.ok();
        return result;
    }
    @GetMapping("getPythonCalcResult")
@@ -61,7 +61,6 @@
        return Result.ok(result);
    }
*/
    @GetMapping("page")
    @ApiOperation("分页")
modules/mainPart/src/main/java/com/zt/life/modules/mainPart/taskReliability/model/PythonResult.java
New file
@@ -0,0 +1,13 @@
package com.zt.life.modules.mainPart.taskReliability.model;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
@Data
public class PythonResult {
    @ApiModelProperty(value = "code")
    private String code;
    @ApiModelProperty(value = "errorMsg")
    private String errorMsg;
}
starter/src/main/resources/application.yml
@@ -17,10 +17,8 @@
  datasource:
    druid:
      driver-class-name: com.mysql.cj.jdbc.Driver
      #url: jdbc:mysql://127.0.0.1:3306/csiczb?allowMultiQueries=true&hive.exec.orc.split.strategy=ETL&serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=utf8
      #url: jdbc:mysql://127.0.0.1:3306/test_project?allowMultiQueries=true&hive.exec.orc.split.strategy=ETL&serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=utf8
      url: jdbc:mysql://192.168.31.26:3366/reliability_simulat?allowMultiQueries=true&hive.exec.orc.split.strategy=ETL&serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=utf8
      #url: jdbc:mysql://127.0.0.1:3306/zhpt_djxl?serverTimezone=GMT&allowMultiQueries=true&hive.exec.orc.split.strategy=ETL&serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=utf8
#      url: jdbc:mysql://127.0.0.1:3305/reliability_simulat?allowMultiQueries=true&hive.exec.orc.split.strategy=ETL&serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=utf8
      username: root
      password: root
      #password: 123456
web/packages/views/pages/generator.vue
@@ -10,6 +10,11 @@
          <el-button @click="getTableInfo()">查询</el-button>
        </el-form-item>
      </el-form>
      <el-form>
        <el-button type="primary" @click="callPythonCalc()">启动python计算</el-button>
<!--        <el-button type="primary" @click="getPythonCalcResult()">获取python计算进度</el-button>-->
        <el-tag>仿真进度:{{progress}}%</el-tag>
      </el-form>
      <el-table :data="dataForm.tableData" height="320" stripe style="width: 100%">
        <el-table-column prop="columnName" label="CODE"></el-table-column>
        <el-table-column prop="remarks" label="名称">
@@ -114,8 +119,9 @@
          isExport: false,
          tableData: [],
          tableList:[]
        }
        },
        progress: 0,
        timer: null,
      }
    },
@@ -151,6 +157,28 @@
      this.getInfo()
    },
    methods: {
      async callPythonCalc() {
        // 启动python计算
        let res = await this.$http.get('/taskReliability/ModelLine/callPythonCalc')
        if (res.success) {
          this.$alert('启动python计算成功!')
          // 定时获取python计算进度
          this.timer = setInterval(this.getPythonCalcResult, 5000)
        }
      },
      async getPythonCalcResult() {
        // setTimeout(() => {
          let res = await this.$http.get('/taskReliability/ModelLine/getPythonCalcResult')
          if (res.success) {
            this.progress = res.data
            if (this.progress==='100') {
              clearInterval(this.timer)
            }
          }
        // }, 5000)
      },
      // 获取信息
      async getInfo() {
        let res = await this.$http.get(`/sys/generator/properties`)