| | |
| | | import com.zt.common.constant.Constant; |
| | | import com.zt.common.db.query.QueryFilter; |
| | | 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.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.BufferedReader; |
| | | import java.io.InputStream; |
| | | import java.io.InputStreamReader; |
| | | import java.io.StringWriter; |
| | | 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; |
| | | |
| | | @Autowired |
| | | private RedisTemplate redisTemplate; |
| | | @Autowired |
| | | private AssessResultDao assessResultDao; |
| | | |
| | | @Transactional(rollbackFor = Exception.class) |
| | | public Result 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); |
| | | |
| | | return Result.ok(); |
| | | } |
| | | |
| | | 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=\"系统\" 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<>();//存储所有的导入状态 |