| | |
| | | import org.dom4j.DocumentHelper; |
| | | import org.dom4j.Document; |
| | | import org.dom4j.Element; |
| | | import org.dom4j.io.OutputFormat; |
| | | import org.dom4j.io.XMLWriter; |
| | | import org.springframework.beans.factory.annotation.Autowired; |
| | | import org.springframework.stereotype.Service; |
| | | import com.zt.common.db.query.QueryFilter; |
| | | import org.springframework.transaction.annotation.Transactional; |
| | | |
| | | import java.io.StringWriter; |
| | | import java.util.*; |
| | | import java.util.stream.Collectors; |
| | | |
| | |
| | | |
| | | // 1. 解析出节点与边 |
| | | getNodeAndLineFromRbd(modelRbd.getId(), rbdJsonArray, modelNodeList, modelLineList, productImgList); |
| | | // 2. 计算所有节点的入口线数及出口线数 |
| | | // 2. 对于有多根入口线的产品节点,将其上的表决、旁联关系剥离成运算符节点,添加到该节点的前面,并添加相应的边 |
| | | peelOperationFromProductNode(modelRbd.getId(), modelNodeList, modelLineList); |
| | | // 3. 计算所有节点的入口线数及出口线数 |
| | | calcInOutLineNumAllNode(modelNodeList, modelLineList); |
| | | // 3. 复制产品节点(node)到list |
| | | // 4. 复制产品节点(node)到list |
| | | List<ModelNode> modelNodeAndVnodeList = modelNodeList.stream().filter(item -> |
| | | "node".equals(item.getNodeType())).collect(Collectors.toList()); |
| | | // 4. 不断将基本模型(串联、并联、旁联、表决、桥联)替换为虚节点而简化图形,直至无法简化为止。 |
| | | // 5. 不断将基本模型(串联、并联、旁联、表决、桥联)替换为虚节点而简化图形,直至无法简化为止。 |
| | | result = getAlgorithmFromRbd(modelRbd, modelNodeList, modelLineList, algorithmList, modelNodeAndVnodeList); |
| | | |
| | | // 5. 转换为算法库接口XML |
| | | // 6. 转换为算法库接口XML |
| | | if (result) { |
| | | // result = createIfXmlFromRbd(modelRbd, algorithmList, modelNodeAndVnodeList); |
| | | result = createIfXmlFromRbd(modelRbd, algorithmList, modelNodeAndVnodeList); |
| | | } |
| | | |
| | | // 6. 保存模型 |
| | | // 7. 保存模型 |
| | | if (saveFlag) saveModel(modelRbd, modelNodeList, modelLineList, algorithmList, modelNodeAndVnodeList); |
| | | |
| | | return result; |
| | | } |
| | | |
| | | private void peelOperationFromProductNode(Long modelId, |
| | | List<ModelNode> modelNodeList, |
| | | List<ModelLine> modelLineList) { |
| | | List<ModelNode> nodesToAdd = new ArrayList<>(); |
| | | List<ModelLine> linesToAdd = new ArrayList<>(); |
| | | for (ModelNode node: modelNodeList) { |
| | | List<ModelLine> inLineList = modelLineList.stream().filter(item -> |
| | | item.getEndCell().equals(node.getPicId())).collect(Collectors.toList()); |
| | | if ("node".equals(node.getNodeType()) && |
| | | StringUtils.isNotBlank(node.getNodeTypeExt()) && |
| | | inLineList.size() > 1) { |
| | | // 旁联or表决 |
| | | ModelNode nodeNew = new ModelNode(); |
| | | Long nodeNewId = UUIDUtil.generateId(); |
| | | nodeNew.setId(nodeNewId); |
| | | nodeNew.setPicId(nodeNewId.toString()); |
| | | nodeNew.setModelId(modelId); |
| | | nodeNew.setNodeType(node.getNodeTypeExt()); |
| | | nodeNew.setName(node.getNodeTypeExt()); |
| | | nodeNew.setVoteNum(node.getVoteNum()); |
| | | nodeNew.setPositionX(node.getPositionX()); |
| | | nodeNew.setPositionY(node.getPositionY()); |
| | | nodesToAdd.add(nodeNew); |
| | | |
| | | ModelLine lineNew = new ModelLine(); |
| | | Long lineNewId = UUIDUtil.generateId(); |
| | | lineNew.setId(lineNewId); |
| | | lineNew.setPicId(lineNewId.toString()); |
| | | lineNew.setModelId(modelId); |
| | | lineNew.setBeginCell(nodeNewId.toString()); |
| | | lineNew.setEndCell(node.getPicId()); |
| | | linesToAdd.add(lineNew); |
| | | |
| | | for(ModelLine line: inLineList){ |
| | | line.setEndCell(nodeNewId.toString()); |
| | | } |
| | | } |
| | | } |
| | | modelNodeList.addAll(nodesToAdd); |
| | | modelLineList.addAll(linesToAdd); |
| | | } |
| | | |
| | | private boolean createIfXmlFromRbd(ModelRbd modelRbd, |
| | |
| | | block = link.addElement("Block"); |
| | | block.addAttribute("Name", "Start"); |
| | | |
| | | document.setXMLEncoding("UTF-8"); |
| | | String xmlString = document.asXML(); |
| | | modelRbd.setIfXml(xmlString); |
| | | // document.setXMLEncoding("UTF-8"); |
| | | // String xmlString = document.asXML(); |
| | | // 输出格式化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); |
| | | modelRbd.setPublishedXml(writer.toString()); |
| | | } finally { |
| | | if (xmlWriter!=null) xmlWriter.close(); |
| | | } |
| | | } catch (Exception e) { |
| | | e.printStackTrace(); |
| | | result = false; |
| | |
| | | ModelNode endNode = getBranchNodesOneParallel(pathOneGroup, branchNodeList); |
| | | if ("connect".equals(startNode.getNodeType()) && pathOneGroup.size()==lines.size()) { |
| | | // 替换成虚节点 |
| | | modelNodeAndVnodeList.add(startNode); |
| | | replaceToVnode("parallel", modelId, modelNodeList, modelLineList, |
| | | algorithmList, modelNodeAndVnodeList, startNode, endNode, branchNodeList); |
| | | } else { |
| | |
| | | |
| | | if ("connect".equals(startNode.getNodeType()) && startNode.getInLineNum()==2) { |
| | | // 替换成虚节点 |
| | | modelNodeAndVnodeList.add(startNode); |
| | | replaceToVnode("bridge", modelId, modelNodeList, modelLineList, |
| | | algorithmList, modelNodeAndVnodeList, startNode, endNode, branchNodeList); |
| | | } else { |
| | |
| | | } |
| | | } |
| | | if (thisNodeSuccess) { |
| | | modelNodeAndVnodeList.add(opNode); |
| | | replaceToVnode(opNode.getNodeType(), modelId, modelNodeList, modelLineList, |
| | | algorithmList, modelNodeAndVnodeList, opNode, endNode, branchNodeList); |
| | | hasSimplified = true; |
| | |
| | | algorithm.setAlgorithmType(type); |
| | | algorithm.setComputerList(computerList.get(0)); |
| | | algorithm.setObjectList(computerList.get(1)); |
| | | if ("vote".equals(type)) algorithm.setVoteNum(startNode.getVoteNum()); |
| | | algorithm.setStep(algorithmList.size()==0 ? 0 : algorithmList.get(algorithmList.size()-1).getStep()+1); |
| | | algorithmList.add(algorithm); |
| | | |
| | |
| | | } |
| | | |
| | | // 更新RBD数据 |
| | | modelRbd.setPublishedContent(modelRbd.getContent()); |
| | | modelRbdDao.updateById(modelRbd); |
| | | } |
| | | |