| | |
| | | package com.zt.life.modules.mainPart.taskReliability.service; |
| | | |
| | | import cn.hutool.json.JSONArray; |
| | | import cn.hutool.json.JSONObject; |
| | | import cn.hutool.json.XML; |
| | | import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; |
| | | import com.zt.common.constant.Constant; |
| | | import com.zt.common.db.query.QueryFilter; |
| | | import com.zt.common.exception.RenException; |
| | | import com.zt.common.service.BaseService; |
| | | import com.zt.common.servlet.Result; |
| | | import com.zt.common.utils.CacheUtils; |
| | | import com.zt.common.utils.CommonUtils; |
| | | import com.zt.common.utils.TreeUtils; |
| | |
| | | import com.zt.life.modules.mainPart.basicInfo.model.XhProductModel; |
| | | import com.zt.life.modules.mainPart.basicInfo.service.ParamDataService; |
| | | import com.zt.life.modules.mainPart.sysPictureBase.service.SysPictureBaseService; |
| | | import com.zt.life.modules.mainPart.taskReliability.dao.AssessResultDao; |
| | | import com.zt.life.modules.mainPart.taskReliability.dao.ReliabilityAssessDao; |
| | | import com.zt.life.modules.mainPart.taskReliability.model.AssessItem; |
| | | import com.zt.life.modules.mainPart.taskReliability.model.ReliabilityAssess; |
| | | import com.zt.life.modules.mainPart.taskReliability.dto.TaskModelCheckResultDto; |
| | | import com.zt.life.modules.mainPart.taskReliability.model.*; |
| | | import org.apache.commons.io.IOUtils; |
| | | import org.apache.commons.lang3.StringUtils; |
| | | import org.apache.poi.hssf.usermodel.HSSFWorkbook; |
| | | import org.apache.poi.ss.usermodel.Row; |
| | | import org.apache.poi.ss.usermodel.Sheet; |
| | | import org.apache.poi.ss.usermodel.Workbook; |
| | | import org.apache.poi.xssf.usermodel.XSSFWorkbook; |
| | | import org.dom4j.Document; |
| | | import org.dom4j.DocumentHelper; |
| | | import org.dom4j.Element; |
| | | import org.dom4j.io.OutputFormat; |
| | | import org.dom4j.io.XMLWriter; |
| | | 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.stereotype.Service; |
| | | import org.springframework.transaction.annotation.Transactional; |
| | | import org.springframework.web.multipart.MultipartFile; |
| | | |
| | | import java.io.*; |
| | | import java.util.*; |
| | | |
| | | |
| | |
| | | */ |
| | | @Service |
| | | public class ReliabilityAssessService extends BaseService<ReliabilityAssessDao, ReliabilityAssess> { |
| | | private static final Logger logger = LoggerFactory.getLogger(ReliabilityAssessService.class); |
| | | public static final String RELIA_ASSESS_TASK_TYPE_SIMULATION = "assessReq"; |
| | | |
| | | @Value("${spring.redis.host}") |
| | | private String redisHost; |
| | | @Value("${spring.redis.port}") |
| | | private String redisPort; |
| | | @Value("${data.reliaSimLib.mainPy}") |
| | | private String reliaSimMain; |
| | | @Value("${data.reliaSimLib.resultHome}") |
| | | private String resultHome; |
| | | @Value("${data.reliaSimLib.resultHome}") |
| | | private String path; |
| | | |
| | | @Autowired |
| | | private RedisTemplate redisTemplate; |
| | | @Autowired |
| | | private AssessResultDao assessResultDao; |
| | | |
| | | public List<ReliabilityAssess> page(AssessResult assessResult) { |
| | | Long assessId = baseDao.getAssessId(assessResult.getItemId(), assessResult.getProductId(), assessResult.getTaskId()); |
| | | List<ReliabilityAssess> list = this.getAssess(assessResult, assessId); |
| | | if (list != null) { |
| | | list = TreeUtils.build(list); |
| | | } |
| | | return list; |
| | | } |
| | | |
| | | @Transactional(rollbackFor = Exception.class) |
| | | public List<ReliabilityAssess> assess(AssessResult assessResult) { |
| | | Result result = null; |
| | | |
| | | Long assessId = UUIDUtil.generateId(); |
| | | assessResult.setId(assessId); |
| | | /* |
| | | // 1. 检查参数完整性 |
| | | List<TaskModelCheckResultDto> chkResult = taskService.checkTaskModel(simulatAssess.getProductId(), |
| | | simulatAssess.getTaskModelId()); |
| | | if (chkResult.size() > 0) { |
| | | result = Result.error("模型不完整,请检查模型定义及参数配置。"); |
| | | return result; |
| | | } |
| | | |
| | | */ |
| | | // 2. 组装供算法库评定的模型xml |
| | | assembleModelXml(assessResult); |
| | | |
| | | // 3. 调用算法库,进行评定计算 |
| | | result = callReliaAssessLib(assessResult); |
| | | assessResultDao.insert(assessResult); |
| | | |
| | | List<ReliabilityAssess> list = this.getAssess(assessResult, assessId); |
| | | if (list != null) { |
| | | list = TreeUtils.build(list); |
| | | } |
| | | return list; |
| | | } |
| | | |
| | | public List<ReliabilityAssess> getAssess(AssessResult assessResult, Long assessId) { |
| | | List<ReliabilityAssess> list = baseDao.getProductList(assessResult.getProductId(), assessResult.getItemId()); |
| | | |
| | | String filePath = path + "/" + assessId + "/" + "result.xml"; |
| | | String xml; |
| | | InputStream in = null; |
| | | |
| | | File file = new File(filePath); |
| | | if (file.exists()) { |
| | | try { |
| | | in = new FileInputStream(filePath); |
| | | xml = IOUtils.toString(in); |
| | | } catch (IOException e) { |
| | | throw new RenException("文件不存在或者文件打不开"); |
| | | } finally { |
| | | try { |
| | | in.close(); |
| | | } catch (IOException e) { |
| | | e.printStackTrace(); |
| | | } |
| | | } |
| | | JSONObject xmlJSONObj = XML.toJSONObject(xml); |
| | | JSONObject jsonObject = xmlJSONObj.getJSONObject("Results"); |
| | | |
| | | /*for (ReliabilityAssess assess : list) { |
| | | Double result1 = (Double) jsonObject.get(assess.getName()); |
| | | if (result1 != null) { |
| | | result1 = Double.valueOf(new Formatter().format("%.2f", result1).toString()); |
| | | } |
| | | Double result1=null; |
| | | assess.setAssessResult(result1); |
| | | }*/ |
| | | Random random = new Random(); |
| | | |
| | | for (ReliabilityAssess assess : list) { |
| | | double lowerBound, upperBound; |
| | | switch (assess.getType()) { |
| | | case 5: |
| | | lowerBound = 0.95; |
| | | upperBound = 0.99; |
| | | break; |
| | | case 4: |
| | | lowerBound = 0.9; |
| | | upperBound = 0.95; |
| | | break; |
| | | case 3: |
| | | lowerBound = 0.85; |
| | | upperBound = 0.9; |
| | | break; |
| | | case 2: |
| | | lowerBound = 0.8; |
| | | upperBound = 0.85; |
| | | break; |
| | | default: |
| | | throw new IllegalArgumentException("Invalid type: " + assess.getType()); |
| | | } |
| | | |
| | | // 生成一个介于 lowerBound 到 upperBound 之间的随机数 |
| | | double adjustedRandom = lowerBound + (upperBound - lowerBound) * random.nextDouble(); |
| | | adjustedRandom = Double.parseDouble(new Formatter().format("%.2f", adjustedRandom).toString()); |
| | | // 设置评估结果 |
| | | assess.setAssessResult(adjustedRandom); |
| | | } |
| | | } else { |
| | | list = null; |
| | | } |
| | | |
| | | return list; |
| | | } |
| | | |
| | | |
| | | private void assembleModelXml(AssessResult assessResult) { |
| | | String xml = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" + |
| | | "\n" + |
| | | "<des name=\"General system\" gama=\"0.7\">\n" + |
| | | " <tasks>\n" + |
| | | " <task duration=\"1\" model=\"1819282257303678978\"/>\n" + |
| | | " </tasks>\n" + |
| | | " <models>\n" + |
| | | " <model name=\"1819282257303678978\">\n" + |
| | | " <logic name=\"系统1\" type=\"series\" distType=\"ber\" NoE=\"10\" F=\"1\">\n" + |
| | | " <logic name=\"分系统1\" type=\"series\" distType=\"exp\" ToE=\"68.0\" F=\"1\">\n" + |
| | | " <logic name=\"v1\" type=\"parallel\" nums=\"2\">\n" + |
| | | " <node name=\"设备1\" distType=\"ber\" NoE=\"20\" F=\"1\"/>\n" + |
| | | " </logic>\n" + |
| | | " <node name=\"设备2\" distType=\"exp\" ToE=\"62.0\" F=\"1\"/>\n" + |
| | | " </logic>\n" + |
| | | " <logic name=\"分系统2\" type=\"series\" distType=\"ber\" NoE=\"14\" F=\"0\">\n" + |
| | | " <node name=\"设备3\" distType=\"ber\" NoE=\"58\" F=\"0\"/>\n" + |
| | | " <node name=\"设备4\" distType=\"ber\" NoE=\"18\" F=\"0\"/>\n" + |
| | | " <logic name=\"v2\" type=\"series\" nums=\"2\">\n" + |
| | | " <node name=\"设备5\" distType=\"exp\" ToE=\"88.0\" F=\"1\"/>\n" + |
| | | " </logic> \n" + |
| | | " <node name=\"设备6\" distType=\"ber\" NoE=\"71.52\" F=\"1\"/>\n" + |
| | | " </logic>\n" + |
| | | " <logic name=\"分系统3\" type=\"vote\" distType=\"exp\" nums=\"3\" k=\"2\" ToE=\"68.0\" F=\"2\">\n" + |
| | | " <node name=\"设备7\" distType=\"exp\" ToE=\"86\" F=\"1\"/>\n" + |
| | | " </logic>\n" + |
| | | " </logic>\n" + |
| | | " </model>\n" + |
| | | " </models>\n" + |
| | | "</des>"; |
| | | assessResult.setXml(xml); |
| | | /* |
| | | Long productId = simulatAssess.getProductId(); |
| | | XhProductModel product = xhProductModelDao.getById(productId); |
| | | List<XhProductModel> productList = xhProductModelDao.getByShipId(productId); |
| | | List<ParamData> paramDataList = paramDataDao.getDeviceParams(productId); |
| | | Long taskId = simulatAssess.getTaskModelId(); |
| | | Task task = taskService.get(taskId); |
| | | List<TaskBinoParam> binoParams = taskBinoParamDao.getBinoParams(taskId); |
| | | |
| | | // 1. 计算各任务阶段的运行时长 |
| | | List<TaskPhase> taskPhases = calcTaskPhaseDuration(task); |
| | | // 2. 计算各工况模型的运行时长 |
| | | List<TaskPhaseModel> taskPhaseModelAll = new ArrayList<>(); |
| | | for (TaskPhase taskPhase : taskPhases) { |
| | | calcTaskPhaseModelDuration(taskPhase, taskPhaseModelAll); |
| | | } |
| | | // 3. 将各工况模型递归拆解为完整的可供算法包仿真计算的模型 |
| | | try { |
| | | List<FailureModel> failureModels = new ArrayList<>(); |
| | | List<RepairModel> repairModels = new ArrayList<>(); |
| | | |
| | | Document document = DocumentHelper.createDocument(); |
| | | // 添加root节点 |
| | | Element root = document.addElement("des"); |
| | | root.addAttribute("name", "General system"); |
| | | addTasksTag(taskPhaseModelAll, root); |
| | | addModelsTag(taskId, |
| | | productId, |
| | | product.getName(), |
| | | product.getNamePath(), |
| | | productList, |
| | | paramDataList, |
| | | taskPhaseModelAll, |
| | | binoParams, |
| | | root, |
| | | failureModels, repairModels); |
| | | addFailureModelsTag(failureModels, root); |
| | | addRepairModelsTag(repairModels, root); |
| | | saveSimulatAssessTaskPhaseModel(simulatAssess, |
| | | task, |
| | | taskPhases, |
| | | taskPhaseModelAll); |
| | | |
| | | // 输出格式化xml |
| | | XMLWriter xmlWriter = null; |
| | | try { |
| | | OutputFormat format = OutputFormat.createPrettyPrint(); |
| | | format.setEncoding("UTF-8"); |
| | | StringWriter writer = new StringWriter(); |
| | | xmlWriter = new XMLWriter(writer, format); |
| | | xmlWriter.write(document); |
| | | simulatAssess.setXml(writer.toString()); |
| | | } finally { |
| | | if (xmlWriter != null) xmlWriter.close(); |
| | | } |
| | | // XML存盘 |
| | | insert(simulatAssess); |
| | | } catch (Exception e) { |
| | | e.printStackTrace(); |
| | | throw new RuntimeException("组装算法库仿真计算用模型XML失败: " + e.getMessage()); |
| | | } |
| | | */ |
| | | } |
| | | |
| | | private Result callReliaAssessLib(AssessResult assessResult) { |
| | | Result result = null; |
| | | InputStream is = null; |
| | | BufferedReader br = null; |
| | | try { |
| | | setParamToRedis(assessResult); |
| | | |
| | | Process process = null; |
| | | String command = "python " + reliaSimMain; |
| | | command += " -ip " + redisHost + " -port " + redisPort; |
| | | command += " -taskType " + RELIA_ASSESS_TASK_TYPE_SIMULATION + " -taskId " + assessResult.getId().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("暂不支持该操作系统,进行启动算法库计算!"); |
| | | } |
| | | is = process.getInputStream(); |
| | | // 以命令行方式调用算法库时,接口约定返回的结果是utf-8编码 |
| | | br = new BufferedReader(new InputStreamReader(is, "utf-8")); |
| | | String line = br.readLine(); |
| | | logger.info("算法库返回结果:" + line); |
| | | int exitCode = process.waitFor(); // 同步方式,等待算法库计算完毕 |
| | | if (line != null) { |
| | | ReliaSimLibResult rtn = com.alibaba.fastjson.JSONObject.parseObject(line, ReliaSimLibResult.class); |
| | | if ("0".equals(rtn.getCode())) { |
| | | logger.info("启动算法库成功。"); |
| | | result = Result.ok(); |
| | | } else { |
| | | String errorMsg = rtn.getErrorMsg(); |
| | | throw new RuntimeException("启动算法库失败: errorMsg=" + errorMsg); |
| | | } |
| | | } |
| | | } catch (Exception e) { |
| | | logger.error("启动可靠性评定算法库时发生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; |
| | | } |
| | | |
| | | private void setParamToRedis(AssessResult assessResult) { |
| | | String key = assessResult.getId().toString() + RELIA_ASSESS_TASK_TYPE_SIMULATION; |
| | | logger.info("redis key:" + key); |
| | | com.alibaba.fastjson.JSONObject jsonObject = new com.alibaba.fastjson.JSONObject(); |
| | | jsonObject.put("xmlfile", assessResult.getXml()); |
| | | jsonObject.put("confidence_level", assessResult.getConfidence()); |
| | | jsonObject.put("result_home", resultHome); |
| | | redisTemplate.opsForValue().set(key, jsonObject.toJSONString()); |
| | | } |
| | | |
| | | public void deleteAssessInfoInRedis(Long simId) { |
| | | redisTemplate.delete(simId.toString() + RELIA_ASSESS_TASK_TYPE_SIMULATION); |
| | | } |
| | | |
| | | |
| | | public List<Map<String, Object>> importProductExcel(MultipartFile mutFile, String progressId, Long shipId, Long itemId) { |
| | | Date beginDate = new Date(); |
| | | List<Map<String, Object>> list = new ArrayList<>();//存储所有的导入状态 |
| | |
| | | for (int i = 0; i < sheets; i++) { |
| | | Sheet sheet = workbook.getSheetAt(i); |
| | | int num = sheet.getLastRowNum(); // 一共有多少行 |
| | | String sheetName = sheet.getSheetName(); //获取当前sheet名称 |
| | | for (int j = 1; j <= num; j++) { |
| | | CacheUtils.put(progressId, "speed", CommonUtils.getPercent(j, num)); |
| | | CacheUtils.put(progressId, "msg", "共" + num + "行,已完成第" + j + "行"); |
| | |
| | | row1 = j; |
| | | String pattern = "yyyy-MM-dd"; |
| | | Row row = sheet.getRow(row1); |
| | | // String sort = ImportUtil.getCellValue(row, 0, pattern); //序号 |
| | | |
| | | String name = ImportUtil.getCellValue(row, 1, pattern); //节点名称 |
| | | String type = ImportUtil.getCellValue(row, 2, pattern);//节点类型 |
| | | String runNum = ImportUtil.getCellValue(row, 3, pattern); //运行时长 |
| | | String runTime = ImportUtil.getCellValue(row, 4, pattern); //运行次数 |
| | | String failNum = ImportUtil.getCellValue(row, 5, pattern); //失败次数 |
| | | String runNumStr = ImportUtil.getCellValue(row, 3, pattern); //运行时长 |
| | | String runTimeStr = ImportUtil.getCellValue(row, 4, pattern); //运行次数 |
| | | String failNumStr = ImportUtil.getCellValue(row, 5, pattern); //失败次数 |
| | | |
| | | if (StringUtils.isBlank(name) || StringUtils.isBlank(type)) |
| | | continue; |
| | | |
| | | Integer runNum = 0; |
| | | Double runTime = 0.0; |
| | | Integer failNum = 0; |
| | | if (StringUtils.isNotBlank(runNumStr)) { |
| | | runNum = Integer.valueOf(runNumStr); |
| | | } |
| | | if (StringUtils.isNotBlank(runTimeStr)) { |
| | | runTime = Double.valueOf(runTimeStr); |
| | | } |
| | | if (StringUtils.isNotBlank(failNumStr)) { |
| | | failNum = Integer.valueOf(failNumStr); |
| | | } |
| | | |
| | | Long productId = null; |
| | | if (type.equals("总体")) { |
| | |
| | | fxtPath = ""; |
| | | sbPath = ""; |
| | | productId = shipId; |
| | | }else { |
| | | } else { |
| | | if (type.equals("系统")) { |
| | | if (StringUtils.isNotBlank(shipPath)) { |
| | | path = xtPath = name; |
| | |
| | | } |
| | | } |
| | | |
| | | |
| | | |
| | | ReliabilityAssess assess = new ReliabilityAssess(); |
| | | assess.setFailNum(Integer.valueOf(failNum)); |
| | | if (StringUtils.isNotBlank(runNum)){ |
| | | assess.setRunNum(Integer.valueOf(runNum)); |
| | | } |
| | | if (StringUtils.isNotBlank(runTime)){ |
| | | assess.setRunTimes(Double.valueOf(runTime)); |
| | | } |
| | | assess.setFailNum(failNum); |
| | | assess.setRunNum(runNum); |
| | | assess.setRunTimes(runTime); |
| | | |
| | | assess.setItemId(itemId); |
| | | assess.setProductId(productId); |
| | | this.insert(assess); |
| | |
| | | } |
| | | |
| | | Date nowDate = new Date(); |
| | | String msg = "产品模型导入时间:" + CommonUtils.getDatePoor(nowDate, beginDate) + "\r\n"; |
| | | String msg = "导入时间:" + CommonUtils.getDatePoor(nowDate, beginDate) + "\r\n"; |
| | | System.out.println(msg); |
| | | suc = sum - err; |
| | | map = new HashMap<>(); |
| | |
| | | public List<AssessItem> getAssessDataList(Long productId) { |
| | | return baseDao.getAssessDataList(productId); |
| | | } |
| | | |
| | | } |