jinlin
2024-09-06 3ecb68c427a627ad8e90d8c555655e7724be2d96
modules/mainPart/src/main/java/com/zt/life/modules/mainPart/async/PythonLib.java
@@ -2,13 +2,13 @@
import com.alibaba.fastjson.JSONObject;
import com.zt.common.servlet.Result;
import com.zt.life.modules.mainPart.taskReliability.model.PythonResult;
import com.zt.life.modules.mainPart.taskReliability.model.ReliaSimLibResult;
import com.zt.life.modules.mainPart.taskReliability.model.SimulatAssess;
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;
@@ -23,22 +23,31 @@
    private String redisHost;
    @Value("${spring.redis.port}")
    private String redisPort;
    @Value("${data.reliaSimLib.mainPy}")
    private String reliaSimMain;
    @Value("${data.reliaSimLib.resultHome}")
    private String resultHome;
    private Long taskId = 123L;
    private String taskFlag = "relia";
//    private Long taskId = 123L;
//    private Long taskId = 124L;
//    private Long taskId = 100L;     // =》 model1.xml1
    private String taskType = "calcreq";
    @Autowired
    private RedisTemplate redisTemplate;
    public Result callPython() {
    public Result callPython(SimulatAssess simulatAssess) {
        Result result = null;
        InputStream is = null;
        BufferedReader br = null;
        try {
            setParamToRedis(simulatAssess);
            Process process = null;
            String command = "python D:\\work\\python\\relia_calc.py";
            command += " " + redisHost + " " + redisPort;
            command += " " + taskFlag + " " + taskId.toString();
//            String command = "python D:\\work\\python\\relia_calc.py";
            String command = "python " + reliaSimMain;
            command += " -ip " + redisHost + " -port " + redisPort;
            command += " -taskType " + taskType + " -taskId " + simulatAssess.getId().toString();
            logger.info("cmd命令为:" + command);
            if(System.getProperty("os.name").toLowerCase().indexOf("windows") > -1){
                process = Runtime.getRuntime().exec(new String[]{"cmd", "/c", command});
@@ -48,15 +57,15 @@
                throw new Exception("暂不支持该操作系统,进行启动python计算!");
            }
            is = process.getInputStream();
            // 以命令行方式调用python时,返回的结果是GBK编码的,而非utf-8
            br = new BufferedReader(new InputStreamReader(is,"gb2312"));
            // 以命令行方式调用python时,返回的结果是utf-8编码
            br = new BufferedReader(new InputStreamReader(is,"utf-8"));
            String line = br.readLine();
            logger.info("python返回结果:" + line);
            int exitCode = process.waitFor();
            if (exitCode == 0) {
//            int exitCode = process.waitFor();
//            if (exitCode == 0) {
                logger.info("启动python计算成功");
                if (line != null) {
                    PythonResult rtn = JSONObject.parseObject(line, PythonResult.class);
                    ReliaSimLibResult rtn = JSONObject.parseObject(line, ReliaSimLibResult.class);
                    if ("0".equals(rtn.getCode())) {
                        result = Result.ok();
                    } else {
@@ -64,23 +73,23 @@
                        throw new RuntimeException("启动python计算失败: errorMsg=" + errorMsg);
                    }
                }
            } else {
                logger.error("启动python计算失败: exitCode=" + exitCode);
                throw new RuntimeException("启动python计算失败: exitCode=" + exitCode);
            }
//            } 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) {
            if (is != null) {
                try {
                    is.close();
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
            if (br == null) {
            if (br != null) {
                try {
                    br.close();
                } catch (Exception e) {
@@ -92,11 +101,265 @@
        return result;
    }
/*
    public String getPythonCalcResult() {
        String key = taskFlag + taskId.toString();
        String key = taskId.toString() + "calcprog";
        logger.info("redis key:" + key);
        String progress = (String)redisTemplate.opsForValue().get(key);
        if (progress==null) progress = "0";
        return progress;
    }
*/
    private void setParamToRedis(SimulatAssess simulatAssess) {
        String key = simulatAssess.getId().toString() + taskType;
        logger.info("redis key:" + key);
        String xmlfile = "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n" +
                "<des name=\"General system\">\n" +
                "    <tasks>\n" +
                "        <task duration=\"200\" model=\"model1\"/>\n" +
                "        <task duration=\"100\" model=\"model2\"/>\n" +
                "    </tasks>\n" +
                "    <models>\n" +
                "        <model name =\"model1\">\n" +
                "            <logic name=\"总体\" type=\"series\">                \n" +
                "\t\t\t\t<logic name=\"系统1\" type=\"series\">                \n" +
                "\t\t\t\t\t<logic name=\"p1\" type=\"parallel\">                \n" +
                "\t\t\t\t\t\t<node name=\"X1\" type=\"node\">\n" +
                "\t\t\t\t\t\t\t<failure_model name=\"fm1\"/>\n" +
                "                            <repair_model name=\"rm1\"/>\n" +
                "\t\t\t\t\t\t</node>                \n" +
                "\t\t\t\t\t\t<node name=\"X2\" type=\"node\" cycon=\"15\" cycdown=\"5\">\n" +
                "\t\t\t\t\t\t\t<failure_model name=\"fm1\"/>\n" +
                "\t\t\t\t\t\t</node>\n" +
                "\t\t\t\t\t</logic>\n" +
                "                    <logic name=\"v1\" type=\"vote\" k=\"2\">\n" +
                "\t\t\t\t\t\t<node name=\"X3\" type=\"node\">\n" +
                "\t\t\t\t\t\t\t<failure_model name=\"fm1\"/>\n" +
                "                            <repair_model name=\"rm2\"/>\n" +
                "\t\t\t\t\t\t</node>                \n" +
                "\t\t\t\t\t\t<node name=\"X4\" type=\"node\">\n" +
                "\t\t\t\t\t\t\t<failure_model name=\"fm2\"/>\n" +
                "\t\t\t\t\t\t</node>\n" +
                "\t\t\t\t\t\t<node name=\"X5\" type=\"node\">\n" +
                "\t\t\t\t\t\t\t<failure_model name=\"fm1\"/>\n" +
                "\t\t\t\t\t\t</node>                \n" +
                "\t\t\t\t\t</logic>\n" +
                "                    <logic name=\"s1\" type=\"parallel\">\n" +
                "\t\t\t\t\t\t<node name=\"X6\" type=\"node\">\n" +
                "\t\t\t\t\t\t\t<failure_model name=\"fm1\"/>\n" +
                "\t\t\t\t\t\t</node>                \n" +
                "\t\t\t\t\t\t<node name=\"X7\" type=\"node\">\n" +
                "\t\t\t\t\t\t\t<failure_model name=\"fm2\"/>\n" +
                "\t\t\t\t\t\t</node>\n" +
                "\t\t\t\t\t\t<node name=\"X8\" type=\"node\">\n" +
                "\t\t\t\t\t\t\t<failure_model name=\"fm1\"/>\n" +
                "\t\t\t\t\t\t</node>                \n" +
                "\t\t\t\t\t</logic>\n" +
                "\t\t\t\t</logic>\n" +
                "\t\t\t\t<logic name=\"系统2\" type=\"series\">                \n" +
                "\t\t\t\t\t<node name =\"X14\" type=\"node\">\n" +
                "\t\t\t\t\t\t<failure_model name=\"fm1\"/>\n" +
                "\t\t\t\t\t</node>\n" +
                "\t\t\t\t\t<node name=\"X15\" type=\"node\">\n" +
                "\t\t\t\t\t\t<failure_model name=\"fm2\"/>\n" +
                "\t\t\t\t\t</node>\n" +
                "\t\t\t\t\t<node name=\"X16\" type=\"node\">\n" +
                "\t\t\t\t\t\t<failure_model name=\"fm3\"/>\n" +
                "\t\t\t\t\t</node>\n" +
                "\t\t\t\t</logic>\n" +
                "            </logic>\n" +
                "        </model>\n" +
                "        <model name =\"model2\">\n" +
                "            <logic name=\"总体\" type=\"series\">                \n" +
                "\t\t\t\t<logic name=\"系统1\" type=\"series\">\n" +
                "\t\t\t\t\t<logic name=\"p1\" type=\"parallel\">                \n" +
                "\t\t\t\t\t\t<node name=\"X1\" type=\"node\">\n" +
                "\t\t\t\t\t\t\t<failure_model name=\"fm1\"/>\n" +
                "\t\t\t\t\t\t</node>                \n" +
                "\t\t\t\t\t\t<node name=\"X2\" type=\"node\">\n" +
                "\t\t\t\t\t\t\t<failure_model name=\"fm2\"/>\n" +
                "\t\t\t\t\t\t</node>\n" +
                "\t\t\t\t\t</logic>\n" +
                "                    <logic name=\"v1\" type=\"vote\" k=\"2\">\n" +
                "\t\t\t\t\t\t<node name=\"X3\" type=\"node\">\n" +
                "\t\t\t\t\t\t\t<failure_model name=\"fm1\"/>\n" +
                "\t\t\t\t\t\t</node>                \n" +
                "\t\t\t\t\t\t<node name=\"X4\" type=\"node\">\n" +
                "\t\t\t\t\t\t\t<failure_model name=\"fm2\"/>\n" +
                "\t\t\t\t\t\t</node>\n" +
                "\t\t\t\t\t\t<node name=\"X5\" type=\"node\">\n" +
                "\t\t\t\t\t\t\t<failure_model name=\"fm1\"/>\n" +
                "\t\t\t\t\t\t</node>                \n" +
                "\t\t\t\t\t</logic>\n" +
                "                    <logic name=\"s1\" type=\"parallel\">\n" +
                "\t\t\t\t\t\t<node name=\"X6\" type=\"node\">\n" +
                "\t\t\t\t\t\t\t<failure_model name=\"fm1\"/>\n" +
                "\t\t\t\t\t\t</node>                \n" +
                "\t\t\t\t\t\t<node name=\"X7\" type=\"node\">\n" +
                "\t\t\t\t\t\t\t<failure_model name=\"fm2\"/>\n" +
                "\t\t\t\t\t\t</node>\n" +
                "\t\t\t\t\t\t<node name=\"X8\" type=\"node\">\n" +
                "\t\t\t\t\t\t\t<failure_model name=\"fm1\"/>\n" +
                "\t\t\t\t\t\t</node>                \n" +
                "\t\t\t\t\t</logic>\n" +
                "\t\t\t\t</logic>\n" +
                "\t\t\t\t<logic name=\"系统2\" type=\"series\">                \n" +
                "\t\t\t\t\t<logic name=\"p2\" type=\"parallel\">                \n" +
                "\t\t\t\t\t\t<node name=\"X14\" type=\"node\">\n" +
                "\t\t\t\t\t\t\t<failure_model name=\"fm1\"/>\n" +
                "\t\t\t\t\t\t</node>                \n" +
                "\t\t\t\t\t\t<node name=\"X15\" type=\"node\">\n" +
                "\t\t\t\t\t\t\t<failure_model name=\"fm2\"/>\n" +
                "\t\t\t\t\t\t</node>\n" +
                "\t\t\t\t\t</logic>\n" +
                "\t\t\t\t\t<node name=\"X17\" type=\"node\">\n" +
                "\t\t\t\t\t\t<failure_model name=\"fm1\"/>\n" +
                "\t\t\t\t\t</node>\n" +
                "\t\t\t\t</logic>\n" +
                "            </logic>\n" +
                "        </model>\n" +
                "    </models>\n" +
                "    <failure_models>\n" +
                "        <failure_model name=\"fm1\" type=\"exponential\">\n" +
                "            <failure-rate value=\"0.004\"/>\n" +
                "        </failure_model>\n" +
                "        <failure_model name=\"fm2\" type=\"fixed\">\n" +
                "            <unreliability value=\"0.04\"/>\n" +
                "        </failure_model>\n" +
                "        <failure_model name=\"fm3\" type=\"weibull\">\n" +
                "            <scale value=\"100\"/>\n" +
                "            <shape value=\"2\"/>\n" +
                "        </failure_model>\n" +
                "    </failure_models>\n" +
                "    <repair_models>\n" +
                "        <repair_model name=\"rm1\" type=\"exponential\">\n" +
                "            <repair-rate value=\"0.1\"/>\n" +
                "        </repair_model>\n" +
                "        <repair_model name=\"rm2\" type=\"weibull\">\n" +
                "            <scale value=\"13\"/>\n" +
                "            <shape value=\"2\"/>\n" +
                "        </repair_model>\n" +
                "    </repair_models>\n" +
                "</des>";
/*
        String xmlfile = "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n" +
                "<des name=\"General system\">\n" +
                "    <tasks>\n" +
                "        <task duration=\"200\" model=\"model1\"/>\n" +
                "        <task duration=\"100\" model=\"model2\"/>\n" +
                "    </tasks>\n" +
                "    <models>\n" +
                "        <model name =\"model1\">\n" +
                "            <logic name=\"1813102074724945921\" type=\"series\">                \n" +
                "\t\t\t\t<logic name=\"1721113377977629981\" type=\"series\">                \n" +
                "\t\t\t\t\t<logic name=\"p1\" type=\"parallel\">                \n" +
                "\t\t\t\t\t\t<node name=\"1721113796232438988\" type=\"node\">\n" +
                "\t\t\t\t\t\t\t<failure_model name=\"fm1\"/>\n" +
                "                            <repair_model name=\"rm1\"/>\n" +
                "\t\t\t\t\t\t</node>                \n" +
                "\t\t\t\t\t\t<node name=\"1721113971135848726\" type=\"node\" cycon=\"15\" cycdown=\"5\">\n" +
                "\t\t\t\t\t\t\t<failure_model name=\"fm1\"/>\n" +
                "\t\t\t\t\t\t</node>\n" +
                "\t\t\t\t\t</logic>\n" +
                "                    <logic name=\"v1\" type=\"vote\" k=\"2\">\n" +
                "\t\t\t\t\t\t<node name=\"1721113929312687055\" type=\"node\">\n" +
                "\t\t\t\t\t\t\t<failure_model name=\"fm1\"/>\n" +
                "                            <repair_model name=\"rm2\"/>\n" +
                "\t\t\t\t\t\t</node>                \n" +
                "\t\t\t\t\t\t<node name=\"1721113465658619786\" type=\"node\">\n" +
                "\t\t\t\t\t\t\t<failure_model name=\"fm2\"/>\n" +
                "\t\t\t\t\t\t</node>\n" +
                "\t\t\t\t\t\t<node name=\"1721113182603098012\" type=\"node\">\n" +
                "\t\t\t\t\t\t\t<failure_model name=\"fm1\"/>\n" +
                "\t\t\t\t\t\t</node>                \n" +
                "\t\t\t\t\t</logic>\n" +
                "\t\t\t\t</logic>\n" +
                "\t\t\t\t<logic name=\"1721113127170514122\" type=\"series\">                \n" +
                "\t\t\t\t\t<node name =\"1721113197988754255\" type=\"node\">\n" +
                "\t\t\t\t\t\t<failure_model name=\"fm1\"/>\n" +
                "\t\t\t\t\t</node>\n" +
                "\t\t\t\t\t<node name=\"1721113169705470682\" type=\"node\">\n" +
                "\t\t\t\t\t\t<failure_model name=\"fm2\"/>\n" +
                "\t\t\t\t\t</node>\n" +
                "\t\t\t\t</logic>\n" +
                "            </logic>\n" +
                "        </model>\n" +
                "        <model name =\"model2\">\n" +
                "            <logic name=\"1813102074724945921\" type=\"series\">                \n" +
                "\t\t\t\t<logic name=\"1721113377977629981\" type=\"series\">                \n" +
                "\t\t\t\t\t<logic name=\"p1\" type=\"parallel\">                \n" +
                "\t\t\t\t\t\t<node name=\"1721113796232438988\" type=\"node\">\n" +
                "\t\t\t\t\t\t\t<failure_model name=\"fm1\"/>\n" +
                "                            <repair_model name=\"rm1\"/>\n" +
                "\t\t\t\t\t\t</node>                \n" +
                "\t\t\t\t\t\t<node name=\"1721113971135848726\" type=\"node\" cycon=\"15\" cycdown=\"5\">\n" +
                "\t\t\t\t\t\t\t<failure_model name=\"fm1\"/>\n" +
                "\t\t\t\t\t\t</node>\n" +
                "\t\t\t\t\t</logic>\n" +
                "                    <logic name=\"v1\" type=\"vote\" k=\"2\">\n" +
                "\t\t\t\t\t\t<node name=\"1721113929312687055\" type=\"node\">\n" +
                "\t\t\t\t\t\t\t<failure_model name=\"fm1\"/>\n" +
                "                            <repair_model name=\"rm2\"/>\n" +
                "\t\t\t\t\t\t</node>                \n" +
                "\t\t\t\t\t\t<node name=\"1721113465658619786\" type=\"node\">\n" +
                "\t\t\t\t\t\t\t<failure_model name=\"fm2\"/>\n" +
                "\t\t\t\t\t\t</node>\n" +
                "\t\t\t\t\t\t<node name=\"1721113182603098012\" type=\"node\">\n" +
                "\t\t\t\t\t\t\t<failure_model name=\"fm1\"/>\n" +
                "\t\t\t\t\t\t</node>                \n" +
                "\t\t\t\t\t</logic>\n" +
                "\t\t\t\t</logic>\n" +
                "\t\t\t\t<logic name=\"1721113127170514122\" type=\"parallel\">                \n" +
                "\t\t\t\t\t<node name =\"1721113197988754255\" type=\"node\">\n" +
                "\t\t\t\t\t\t<failure_model name=\"fm1\"/>\n" +
                "\t\t\t\t\t</node>\n" +
                "\t\t\t\t\t<node name=\"1721113169705470682\" type=\"node\">\n" +
                "\t\t\t\t\t\t<failure_model name=\"fm2\"/>\n" +
                "\t\t\t\t\t</node>\n" +
                "\t\t\t\t</logic>\n" +
                "            </logic>\n" +
                "        </model>\n" +
                "    </models>\n" +
                "    <failure_models>\n" +
                "        <failure_model name=\"fm1\" type=\"exponential\">\n" +
                "            <failure-rate value=\"0.004\"/>\n" +
                "        </failure_model>\n" +
                "        <failure_model name=\"fm2\" type=\"fixed\">\n" +
                "            <unreliability value=\"0.04\"/>\n" +
                "        </failure_model>\n" +
                "        <failure_model name=\"fm3\" type=\"weibull\">\n" +
                "            <scale value=\"100\"/>\n" +
                "            <shape value=\"2\"/>\n" +
                "        </failure_model>\n" +
                "    </failure_models>\n" +
                "    <repair_models>\n" +
                "        <repair_model name=\"rm1\" type=\"exponential\">\n" +
                "            <repair-rate value=\"0.1\"/>\n" +
                "        </repair_model>\n" +
                "        <repair_model name=\"rm2\" type=\"weibull\">\n" +
                "            <scale value=\"13\"/>\n" +
                "            <shape value=\"2\"/>\n" +
                "        </repair_model>\n" +
                "    </repair_models>\n" +
                "</des>";
*/
        JSONObject jsonObject = new JSONObject();
/*
        Long simulate_times = 10000L;
        Long timeslice = 10L;
        jsonObject.put("xmlfile", xmlfile);
        jsonObject.put("simulate_times", simulate_times);
        jsonObject.put("seed", 1000);
        jsonObject.put("timeslice", 1);
//        jsonObject.put("timeslice", timeslice/60.0);
//        jsonObject.put("timeslice", timeslice);
*/
        jsonObject.put("xmlfile", xmlfile);
        jsonObject.put("simulate_times", simulatAssess.getSimulatFrequency());
        jsonObject.put("seed", 1000);
        jsonObject.put("timeslice", simulatAssess.getSamplPeriod()/60.0);
        jsonObject.put("result_home", resultHome);
        redisTemplate.opsForValue().set(key, jsonObject.toJSONString());
    }
}