From e48a56c2171f023f1978b0b6aec9befd43e7a9dc Mon Sep 17 00:00:00 2001
From: xyc <jc_xiong@hotmail.com>
Date: 星期一, 04 十一月 2024 08:45:22 +0800
Subject: [PATCH] Merge remote-tracking branch 'origin/master'

---
 modules/mainPart/src/main/java/com/zt/life/modules/mainPart/taskReliability/dao/ReliabilityAssessDao.java               |    2 
 web/src/views/modules/taskReliability/ConfigNode/tempNode.vue                                                           |  114 ++----
 web/src/views/modules/taskReliability/SimulatHistory.vue                                                                |    4 
 web/src/views/modules/taskReliability/ReliabilityAssess.vue                                                             |   28 +
 web/src/views/modules/taskReliability/TimeDiagramTemp.vue                                                               |  128 ++++---
 web/src/views/modules/taskReliability/TimeDiagram.vue                                                                   |  241 +-------------
 modules/mainPart/src/main/java/com/zt/life/modules/mainPart/taskReliability/model/ModelRbd.java                         |    3 
 web/src/views/modules/taskReliability/SchemeCompar.vue                                                                  |    4 
 modules/mainPart/src/main/java/com/zt/life/modules/mainPart/taskReliability/service/SimulatAssessService.java           |   84 +++++
 modules/mainPart/src/main/resources/mapper/taskReliability/ReliabilityAssessDao.xml                                     |    9 
 web/src/views/modules/taskReliability/RBD-edit-img.vue                                                                  |   80 ++--
 modules/mainPart/src/main/java/com/zt/life/modules/mainPart/taskReliability/service/ReliabilityAssessService.java       |   62 ++-
 web/src/views/modules/taskReliability/ConfigEdge/configEdge.vue                                                         |   73 +--
 modules/mainPart/src/main/java/com/zt/life/modules/mainPart/taskReliability/controller/SimulatAssessController.java     |    7 
 modules/mainPart/src/main/java/com/zt/life/modules/mainPart/basicInfo/controller/XhProductModelController.java          |    7 
 web/src/views/modules/taskReliability/SimulatAssess.vue                                                                 |   69 +++-
 modules/mainPart/src/main/java/com/zt/life/modules/mainPart/taskReliability/controller/ReliabilityAssessController.java |    7 
 17 files changed, 457 insertions(+), 465 deletions(-)

diff --git a/modules/mainPart/src/main/java/com/zt/life/modules/mainPart/basicInfo/controller/XhProductModelController.java b/modules/mainPart/src/main/java/com/zt/life/modules/mainPart/basicInfo/controller/XhProductModelController.java
index f515f52..7f07865 100644
--- a/modules/mainPart/src/main/java/com/zt/life/modules/mainPart/basicInfo/controller/XhProductModelController.java
+++ b/modules/mainPart/src/main/java/com/zt/life/modules/mainPart/basicInfo/controller/XhProductModelController.java
@@ -105,7 +105,14 @@
 
     @GetMapping("getProductList")
     public Result<List<XhProductModel>> getProductList(Long shipId, Integer productType) {
+        if(productType==2){
+            shipId =null;
+        }
         List<XhProductModel> list = xhProductModelService.getProductList(shipId, productType - 1);
+        if(productType == 5){
+            List<XhProductModel> list2 =  xhProductModelService.getProductList(shipId, productType - 2);
+            list.addAll(list2);
+        }
         return Result.ok(list);
     }
 
diff --git a/modules/mainPart/src/main/java/com/zt/life/modules/mainPart/taskReliability/controller/ReliabilityAssessController.java b/modules/mainPart/src/main/java/com/zt/life/modules/mainPart/taskReliability/controller/ReliabilityAssessController.java
index d37f069..85be829 100644
--- a/modules/mainPart/src/main/java/com/zt/life/modules/mainPart/taskReliability/controller/ReliabilityAssessController.java
+++ b/modules/mainPart/src/main/java/com/zt/life/modules/mainPart/taskReliability/controller/ReliabilityAssessController.java
@@ -30,6 +30,8 @@
 import org.springframework.web.multipart.MultipartFile;
 import springfox.documentation.annotations.ApiIgnore;
 
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
 import java.util.List;
 import java.util.Map;
 
@@ -64,6 +66,11 @@
         return result;
     }
 
+    @GetMapping("downloadXml")
+    public void downloadXml(HttpServletRequest request, HttpServletResponse response, Long productId, Long taskId, Long itemId,Integer xml) {
+        reliabilityAssessService.downloadXml(request,response,productId,taskId,itemId,xml);
+    }
+
     @PostMapping("add")
     @ApiOperation("鏂板")
     @LogOperation("鏂板")
diff --git a/modules/mainPart/src/main/java/com/zt/life/modules/mainPart/taskReliability/controller/SimulatAssessController.java b/modules/mainPart/src/main/java/com/zt/life/modules/mainPart/taskReliability/controller/SimulatAssessController.java
index f0cc214..5486365 100644
--- a/modules/mainPart/src/main/java/com/zt/life/modules/mainPart/taskReliability/controller/SimulatAssessController.java
+++ b/modules/mainPart/src/main/java/com/zt/life/modules/mainPart/taskReliability/controller/SimulatAssessController.java
@@ -36,6 +36,8 @@
 import org.springframework.web.bind.annotation.*;
 import springfox.documentation.annotations.ApiIgnore;
 
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
 import java.io.File;
 import java.io.FileInputStream;
 import java.io.IOException;
@@ -269,6 +271,11 @@
         return Result.ok();
     }
 
+    @GetMapping("downloadXml")
+    public void downloadXml(HttpServletRequest request, HttpServletResponse response, String type,Long id,Integer xml) {
+        simulatAssessService.downloadXml(request, response,type,id,xml);
+    }
+
     @PutMapping
     @ApiOperation("淇敼")
     @LogOperation("淇敼")
diff --git a/modules/mainPart/src/main/java/com/zt/life/modules/mainPart/taskReliability/dao/ReliabilityAssessDao.java b/modules/mainPart/src/main/java/com/zt/life/modules/mainPart/taskReliability/dao/ReliabilityAssessDao.java
index 4d60009..278a700 100644
--- a/modules/mainPart/src/main/java/com/zt/life/modules/mainPart/taskReliability/dao/ReliabilityAssessDao.java
+++ b/modules/mainPart/src/main/java/com/zt/life/modules/mainPart/taskReliability/dao/ReliabilityAssessDao.java
@@ -25,4 +25,6 @@
     List<ReliabilityAssess> getProductList(Long productId, Long itemId);
 
     Long getAssessId(Long itemId, Long productId, Long taskId);
+
+    String getxml(Long assessId);
 }
diff --git a/modules/mainPart/src/main/java/com/zt/life/modules/mainPart/taskReliability/model/ModelRbd.java b/modules/mainPart/src/main/java/com/zt/life/modules/mainPart/taskReliability/model/ModelRbd.java
index f5a3b36..04d1228 100644
--- a/modules/mainPart/src/main/java/com/zt/life/modules/mainPart/taskReliability/model/ModelRbd.java
+++ b/modules/mainPart/src/main/java/com/zt/life/modules/mainPart/taskReliability/model/ModelRbd.java
@@ -34,6 +34,9 @@
 	@ApiModelProperty(value = "")
 	private Long productId;
 
+	@ApiModelProperty(value = "鏄惁鑷姩鎺掔増")
+	private Integer autoLayout;
+
 	@TableField(exist = false)
 	@ApiModelProperty(value = "")
 	private Long[] nodeArr;
diff --git a/modules/mainPart/src/main/java/com/zt/life/modules/mainPart/taskReliability/service/ReliabilityAssessService.java b/modules/mainPart/src/main/java/com/zt/life/modules/mainPart/taskReliability/service/ReliabilityAssessService.java
index b93cfba..2212a70 100644
--- a/modules/mainPart/src/main/java/com/zt/life/modules/mainPart/taskReliability/service/ReliabilityAssessService.java
+++ b/modules/mainPart/src/main/java/com/zt/life/modules/mainPart/taskReliability/service/ReliabilityAssessService.java
@@ -38,6 +38,8 @@
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.web.multipart.MultipartFile;
 
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
 import java.io.*;
 import java.util.*;
 import java.util.stream.Collectors;
@@ -157,9 +159,9 @@
                     String nameValue = jsonArray.getJSONObject(i).get("name").toString();
                     if (nameValue.contains(assess.getId().toString())) {
                         // 鑾峰彇瀵瑰簲鐨勫��
-                        if (jsonArray.getJSONObject(i).get("value") instanceof Double){
-                            result1 = (Double)  jsonArray.getJSONObject(i).get("value");
-                        }else{
+                        if (jsonArray.getJSONObject(i).get("value") instanceof Double) {
+                            result1 = (Double) jsonArray.getJSONObject(i).get("value");
+                        } else {
                             String[] values = jsonArray.getJSONObject(i).get("value").toString().split(",");
                             result1 = Double.valueOf(values[1]);
                         }
@@ -377,16 +379,16 @@
             String ToEStr = "";
             String FStr = "";
 //            for (ModelNode node : nodeList) {
-                List<ReliabilityAssess> assessDatas = assessDataList.stream().filter(item ->
-                        dataId.equals(item.getId())).collect(Collectors.toList());
-                NoEStr += ",";
-                ToEStr += ",";
-                FStr += ",";
-                if (assessDatas.size() > 0) {
-                    NoEStr += assessDatas.get(0).getRunNum() != null ? assessDatas.get(0).getRunNum().toString() : "0";
-                    ToEStr += assessDatas.get(0).getRunTimes() != null ? assessDatas.get(0).getRunTimes().toString() : "0";
-                    FStr += assessDatas.get(0).getFailNum() != null ? assessDatas.get(0).getFailNum().toString() : "0";
-                }
+            List<ReliabilityAssess> assessDatas = assessDataList.stream().filter(item ->
+                    dataId.equals(item.getId())).collect(Collectors.toList());
+            NoEStr += ",";
+            ToEStr += ",";
+            FStr += ",";
+            if (assessDatas.size() > 0) {
+                NoEStr += assessDatas.get(0).getRunNum() != null ? assessDatas.get(0).getRunNum().toString() : "0";
+                ToEStr += assessDatas.get(0).getRunTimes() != null ? assessDatas.get(0).getRunTimes().toString() : "0";
+                FStr += assessDatas.get(0).getFailNum() != null ? assessDatas.get(0).getFailNum().toString() : "0";
+            }
 //            }
             NoEStr = NoEStr.substring(1);
             ToEStr = ToEStr.substring(1);
@@ -397,7 +399,7 @@
             vCounter.put("v", counter);
             Element sameNameGroupTag = parent.addElement("logic");
             sameNameGroupTag.addAttribute("name",
-                    "v"+counter);
+                    "v" + counter);
             if ("parallel".equals(sameNameGroupAlgorithmType)) {
                 sameNameGroupTag.addAttribute("type", "parallel");
             } else {
@@ -406,7 +408,7 @@
             sameNameGroupTag.addAttribute("nums", String.valueOf(nodeList.size()));
             Element nodeTag = sameNameGroupTag.addElement("node");
             nodeTag.addAttribute("name",
-                    nodeList.stream().map(item -> item.getDataId().toString()+"-"+item.getDeviceNo().toString()).
+                    nodeList.stream().map(item -> item.getDataId().toString() + "-" + item.getDeviceNo().toString()).
                             collect(Collectors.joining(",")));
             nodeTag.addAttribute("real_name", product.getSameSbName());
             nodeTag.addAttribute("name_path", product.getNamePath());
@@ -690,7 +692,7 @@
         FStr = FStr.substring(1);
 
         nodeTag.addAttribute("name",
-                nodes.stream().map(item -> item.getDataId().toString()+"-"+item.getDeviceNo().toString()).
+                nodes.stream().map(item -> item.getDataId().toString() + "-" + item.getDeviceNo().toString()).
                         collect(Collectors.joining(",")));
         if (distTypes.get(0) == 3) {
             // 浜岄」鍒嗗竷
@@ -746,7 +748,7 @@
                 ReliaSimLibResult rtn = com.alibaba.fastjson.JSONObject.parseObject(line, ReliaSimLibResult.class);
                 if ("0".equals(rtn.getCode())) {
                     logger.info("鍚姩鍙潬鎬ц瘎瀹氱畻娉曞簱鎴愬姛銆�");
-                    if (exitCode ==0) {
+                    if (exitCode == 0) {
                         deleteAssessInfoInRedis(assessResult.getId());
                         result = Result.ok();
                     } else {
@@ -936,4 +938,30 @@
         return baseDao.getAssessDataList(productId);
     }
 
+    public void downloadXml(HttpServletRequest request, HttpServletResponse response, Long productId, Long taskId, Long itemId, Integer xml) {
+        Long assessId = baseDao.getAssessId(itemId, productId, taskId);
+        String json="";
+        if (xml == 1) {
+            json = baseDao.getxml(assessId);
+        } else {
+            String filePath = path + "/" + assessId + "/" + "result.xml";
+            InputStream in = null;
+            File file = new File(filePath);
+            if (file.exists()) {
+                try {
+                    in = new FileInputStream(filePath);
+                    json = IOUtils.toString(in);
+                } catch (IOException e) {
+                    throw new RenException("鏂囦欢涓嶅瓨鍦ㄦ垨鑰呮枃浠舵墦涓嶅紑");
+                } finally {
+                    try {
+                        in.close();
+                    } catch (IOException e) {
+                        e.printStackTrace();
+                    }
+                }
+            }
+        }
+        simulatAssessService.writeToTxt(request, response, json, "璇勫畾");
+    }
 }
diff --git a/modules/mainPart/src/main/java/com/zt/life/modules/mainPart/taskReliability/service/SimulatAssessService.java b/modules/mainPart/src/main/java/com/zt/life/modules/mainPart/taskReliability/service/SimulatAssessService.java
index ae1baa0..93e99b1 100644
--- a/modules/mainPart/src/main/java/com/zt/life/modules/mainPart/taskReliability/service/SimulatAssessService.java
+++ b/modules/mainPart/src/main/java/com/zt/life/modules/mainPart/taskReliability/service/SimulatAssessService.java
@@ -11,6 +11,7 @@
 import com.zt.common.servlet.Result;
 import com.zt.common.utils.TreeUtils;
 import com.zt.common.utils.UUIDUtil;
+import com.zt.life.export.service.DownloadService;
 import com.zt.life.modules.mainPart.basicInfo.dao.ParamDataDao;
 import com.zt.life.modules.mainPart.basicInfo.dao.XhProductModelDao;
 import com.zt.life.modules.mainPart.basicInfo.model.ParamData;
@@ -46,6 +47,9 @@
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
+import javax.servlet.ServletOutputStream;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
 import java.io.*;
 import java.nio.file.FileAlreadyExistsException;
 import java.util.*;
@@ -1607,4 +1611,84 @@
         dto.setCurveList(curveList);
         return dto;
     }
+
+    public void downloadXml(HttpServletRequest request, HttpServletResponse response, String type, Long id, Integer xml) {
+        if (type.equals("fz")) {
+            if (xml == 1) {
+                SimulatAssess simulatAssess = this.get(id);
+                String xml1 = simulatAssess.getXml();
+                writeToTxt(request, response, xml1, "浠跨湡杈撳叆");
+            } else {
+                String filePath = path + "/" + id + "/" + "result.xml";
+                String xml1;
+                InputStream in = null;
+
+                try {
+                    in = new FileInputStream(filePath);
+                    xml1 = IOUtils.toString(in);
+                } catch (IOException e) {
+                    e.printStackTrace();
+                    throw new RenException("鏂囦欢涓嶅瓨鍦ㄦ垨鑰呮枃浠舵墦涓嶅紑");
+                } finally {
+                    try {
+                        if (in != null) {
+                            in.close();
+                        }
+                    } catch (IOException e) {
+                        e.printStackTrace();
+                    }
+                }
+                writeToTxt(request, response, xml1, "浠跨湡杈撳嚭");
+            }
+        } else if (type.equals("sxt")) {
+            if (xml == 1) {
+                String filePath = path + "/" + id + "/" + "status.json";
+                ObjectMapper mapper = new ObjectMapper();
+                String jsonStr = null;
+                try {
+                    // 浣跨敤 ObjectMapper 鐨� readValue 鏂规硶锛屽皢鏂囦欢涓殑 JSON 鏁版嵁杞崲涓轰竴涓� Java 瀵硅薄
+                    // 杩欓噷浣跨敤 Object 绫讳綔涓烘硾鍨嬪弬鏁帮紝琛ㄧず浠绘剰绫诲瀷鐨勫璞�
+                    Object obj = mapper.readValue(new File(filePath), Object.class);
+                    // 浣跨敤 ObjectMapper 鐨� writeValueAsString 鏂规硶锛屽皢 Java 瀵硅薄杞崲涓� JSON 瀛楃涓�
+                    jsonStr = mapper.writeValueAsString(obj);
+
+                } catch (IOException e) {
+                    // 澶勭悊寮傚父
+                    e.printStackTrace();
+                    throw new RenException("鏂囦欢涓嶅瓨鍦ㄦ垨鑰呮枃浠舵墦涓嶅紑");
+                }
+                writeToTxt(request, response, jsonStr, "鏃跺簭鍥捐緭鍏�");
+            } else {
+                SimulatAssess simulatAssess = this.get(id);
+                TimeDiagramDto timeDiagram = getTimeDiagram(simulatAssess.getProductId(), simulatAssess.getTaskModelId(), simulatAssess.getId(), 1200, 5);
+                String xml2 = timeDiagram.getDiagramJson();
+                writeToTxt(request, response, xml2, "鏃跺簭鍥捐緭鍑�");
+            }
+        }
+    }
+
+    public void writeToTxt(HttpServletRequest request, HttpServletResponse response, String jsonString, String name) {//璁剧疆鍝嶅簲鐨勫瓧绗﹂泦
+        //璁剧疆鍝嶅簲鍐呭鐨勭被鍨�
+        BufferedOutputStream buff = null;
+        ServletOutputStream outStr = null;
+        try {
+            response.setContentType("text/plain;charset=UTF-8");
+            String encodedFilename = DownloadService.getNameEncoder(request, name + "xml.txt");
+            response.addHeader("Content-Disposition", "attachment;filename=" + encodedFilename);
+            outStr = response.getOutputStream();
+            buff = new BufferedOutputStream(outStr);
+            buff.write(jsonString.getBytes("UTF-8"));
+            buff.flush();
+            buff.close();
+        } catch (Exception e) {
+            e.printStackTrace();
+        } finally {
+            try {
+                buff.close();
+                outStr.close();
+            } catch (Exception e) {
+                e.printStackTrace();
+            }
+        }
+    }
 }
diff --git a/modules/mainPart/src/main/resources/mapper/taskReliability/ReliabilityAssessDao.xml b/modules/mainPart/src/main/resources/mapper/taskReliability/ReliabilityAssessDao.xml
index 3e2d6ac..ec76ca8 100644
--- a/modules/mainPart/src/main/resources/mapper/taskReliability/ReliabilityAssessDao.xml
+++ b/modules/mainPart/src/main/resources/mapper/taskReliability/ReliabilityAssessDao.xml
@@ -52,4 +52,13 @@
             UPDATE_DATE DESC
         LIMIT 1
     </select>
+    <select id="getxml" resultType="java.lang.String">
+        SELECT
+            xml
+        FROM
+            assess_result
+        WHERE
+            is_delete = 0
+          AND id = ${assessId}
+    </select>
 </mapper>
diff --git a/web/src/views/modules/taskReliability/ConfigEdge/configEdge.vue b/web/src/views/modules/taskReliability/ConfigEdge/configEdge.vue
index 680a165..821d0f4 100644
--- a/web/src/views/modules/taskReliability/ConfigEdge/configEdge.vue
+++ b/web/src/views/modules/taskReliability/ConfigEdge/configEdge.vue
@@ -6,7 +6,7 @@
         <el-row :gutter="5" align="middle" style="margin-top:20px;">
           <el-col :span=8 style="font-size: 16px;line-height: 38px">瀹藉害</el-col>
           <el-col :span=16>
-            <el-slider :min=1 :max=20 :step=1 v-model="globalGridAttr.strokeWidth" @change="onStrokeWidthChange"></el-slider>
+            <el-slider :min=1 :max=20 :step=1 v-model="globalGridAttr.nodeStrokeWidth" @change="onStrokeWidthChange"></el-slider>
           </el-col>
         </el-row>
         <el-row :gutter="5" align="middle" style="margin-top:20px;">
@@ -65,7 +65,13 @@
     return{
       left_p:document.documentElement.clientHeight*0.9,
       activeName: 'first',
-      // globalGridAttr:{},
+      globalGridAttr:{
+        nodeStrokeWidth:1,
+        stroke:'',
+        connector:'',
+        label:'',
+        distance:''
+      },
       curCell:Edge,
       options: [{
         value: 'rounded',
@@ -80,38 +86,14 @@
     id: {
       type: String,
     },
-    globalGridAttr:{
-      type: Object,
-    },
     graph:{
       type: String,
     }
   },
-  watch:{
-    'id'(val,oldVal){
-      const cell = this.graph.getCellById(this.id)
-      if(!cell || !cell.isEdge()){
-        return
-      }
-      this.curCell = cell
-      let connector = cell.getConnector() || {
-        name:'榛樿'
-      }
-      this.globalGridAttr.stroke = cell.attr('line/stroke')
-      this.globalGridAttr.strokeWidth = cell.attr('line/strokeWidth')
-      this.globalGridAttr.connector = connector.name
-      this.globalGridAttr.label = cell.getLabels()[0].attrs.text? cell.getLabels()[0].attrs.text.text:''
-      this.globalGridAttr.distance =cell.getLabels()[0].position.distance
-      // this.globalGridAttr.angle =cell.getLabels()[0].position.angle
-      console.log(cell.getLabels(),'cell.getLabels()')
-      // console.log(cell.getLabels()[0],'cell.getLabels()[0]')
-      //  this.globalGridAttr.label = (cell.getLabels()[0].attrs).text.text||''
-    }
-  },
   methods:{
     onStrokeWidthChange(val) {
-
-      this.globalGridAttr.strokeWidth = val
+      console.log(val,'val')
+      this.globalGridAttr.nodeStrokeWidth = val
       this.curCell.attr('line/strokeWidth', val)
     },
 
@@ -174,25 +156,22 @@
         }
       ])
     },
-    // onLabelAngleChange(e){
-    //   const val = e
-    //   // this.globalGridAttr.angle = val
-    //   this.curCell.setLabels([
-    //     {
-    //       attrs: {
-    //         text: {
-    //           text: this.globalGridAttr.label,
-    //         },
-    //       },
-    //       position: {
-    //         distance:this.globalGridAttr.distance,
-    //         options: {
-    //           keepGradient: true
-    //         }
-    //       },
-    //     }
-    //   ])
-    // }
+    loadData(cell){
+      this.curCell = cell
+      let connector = cell.getConnector() || {
+        name:'榛樿'
+      }
+      this.globalGridAttr.stroke = cell.attr('line/stroke')
+      this.globalGridAttr.nodeStrokeWidth = cell.attr('line/strokeWidth')
+      this.globalGridAttr.connector = connector.name
+      this.globalGridAttr.label = cell.getLabels()[0].attrs.text? cell.getLabels()[0].attrs.text.text:''
+      this.globalGridAttr.distance =cell.getLabels()[0].position.distance
+      // this.globalGridAttr.angle =cell.getLabels()[0].position.angle
+      console.log(this.globalGridAttr.nodeStrokeWidth,cell.attr('line/strokeWidth'),'globalGridAttr.nodeStrokeWidth')
+      console.log(this.globalGridAttr,'this.globalGridAttr')
+      // console.log(cell.getLabels()[0],'cell.getLabels()[0]')
+      //  this.globalGridAttr.label = (cell.getLabels()[0].attrs).text.text||''
+    }
   }
 }
 </script>
diff --git a/web/src/views/modules/taskReliability/ConfigNode/tempNode.vue b/web/src/views/modules/taskReliability/ConfigNode/tempNode.vue
index 10e887b..98026fa 100644
--- a/web/src/views/modules/taskReliability/ConfigNode/tempNode.vue
+++ b/web/src/views/modules/taskReliability/ConfigNode/tempNode.vue
@@ -6,31 +6,31 @@
         <el-row :gutter="5" align="middle" style="margin-top:20px">
           <el-col :span=8 style="font-size: 16px;line-height: 38px">鏂囨湰澶у皬</el-col>
           <el-col :span=16>
-            <el-slider :min=8 :max=20 :step=1 v-model="globalGridAttr.nodeFontSize" @change="onFontSizeChange"></el-slider>
+            <el-slider :min=8 :max=20 :step=1 v-model="tempNodeAttr.nodeFontSize" @change="onFontSizeChange"></el-slider>
           </el-col>
         </el-row>
         <el-row :gutter="5" align="middle" style="margin-top:20px">
           <el-col :span=8 style="font-size: 16px;line-height: 40px">瀛椾綋棰滆壊</el-col>
           <el-col :span=16>
-            <el-color-picker  v-model="globalGridAttr.nodeColor" style="width: 100%" @change="onColorChange"></el-color-picker>
+            <el-color-picker  v-model="tempNodeAttr.nodeColor" style="width: 100%" @change="onColorChange"></el-color-picker>
           </el-col>
         </el-row>
         <el-row v-show="shape!=='custom-text' || shape!=='custom-circle1'" :gutter="5" align="middle" style="margin-top:20px">
           <el-col :span=8 style="font-size: 16px;line-height: 32px">椤圭洰鍚嶇О</el-col>
           <el-col :span=16 >
-            <el-input  @click.native='showDialog' v-model="globalGridAttr.inspectName" style="width:100%"></el-input>
+            <el-input  @click.native='showDialog' v-model="tempNodeAttr.inspectName" style="width:100%"></el-input>
           </el-col>
         </el-row>
         <el-row :gutter="5" v-show="shape!=='custom-circle1'"  align="middle" style="margin-top:20px">
           <el-col :span=8 style="font-size: 16px;line-height: 32px">杩囩▼鍚嶇О</el-col>
           <el-col :span=16 >
-            <el-input  v-model="globalGridAttr.nodeText" style="width:100%" @change="onTextChange"></el-input>
+            <el-input  v-model="tempNodeAttr.nodeText" style="width:100%" @change="onTextChange"></el-input>
           </el-col>
         </el-row>
         <el-row v-show="shape!=='custom-text'" :gutter="5" align="middle" style="margin-top:20px">
           <el-col :span=8 style="font-size: 16px;line-height: 32px">鏃ユ湡</el-col>
           <el-col :span=16 >
-            <el-date-picker v-model="globalGridAttr.nodeDate" type="date" placeholder="閫夋嫨鏃ユ湡" value-format="yyyy-MM-dd"
+            <el-date-picker v-model="tempNodeAttr.nodeDate" type="date" placeholder="閫夋嫨鏃ユ湡" value-format="yyyy-MM-dd"
                             style="width: 100%" @change="onDateChange">
             </el-date-picker>
           </el-col>
@@ -40,19 +40,19 @@
         <el-row align="middle" style="margin-top:20px">
           <el-col :span=8 style="font-size: 16px;line-height: 40px">杈规棰滆壊</el-col>
           <el-col :span=16>
-            <el-color-picker v-model="globalGridAttr.nodeStroke" style="width: 100%" @change="onStrokeChange"></el-color-picker>
+            <el-color-picker v-model="tempNodeAttr.nodeStroke" style="width: 100%" @change="onStrokeChange"></el-color-picker>
           </el-col>
         </el-row>
         <el-row align="middle"style="margin-top:20px">
           <el-col :span=8 style="font-size: 16px;line-height: 38px">杈规瀹藉害</el-col>
           <el-col :span=16>
-            <el-slider :min=1 :max=20 :step=1 v-model="globalGridAttr.nodeStrokeWidth" @change="onStrokeWidthChange"></el-slider>
+            <el-slider :min=1 :max=20 :step=1 v-model="tempNodeAttr.nodeStrokeWidth" @change="onStrokeWidthChange"></el-slider>
           </el-col>
         </el-row>
         <el-row align="middle" style="margin-top:20px">
           <el-col :span=8 style="font-size: 16px;line-height: 40px">棰滆壊</el-col>
           <el-col :span=16>
-            <el-color-picker  v-model="globalGridAttr.nodeFill" style="width: 100%" @change="onFillChange"></el-color-picker>
+            <el-color-picker  v-model="tempNodeAttr.nodeFill" style="width: 100%" @change="onFillChange"></el-color-picker>
           </el-col>
         </el-row>
       </el-tab-pane>
@@ -83,7 +83,16 @@
       content:'',
       dialogVisible:false,
       activeName: 'first',
-      // globalGridAttr:{},
+      tempNodeAttr:{
+        nodeFontSize:'',
+        nodeColor:'',
+        inspectName:'',
+        nodeText:'',
+        nodeDate:'',
+        nodeStroke:'',
+        nodeStrokeWidth:'',
+        nodeFill:'',
+      },
       curCel:Cell,
       left_p:document.documentElement.clientHeight*0.9,
     }
@@ -101,9 +110,6 @@
     refY2:{
       type: Number
     },
-    globalGridAttr:{
-      type: Object,
-    },
     graph:{
       type: String,
     },
@@ -113,14 +119,6 @@
     diagramId:{
       type: String,
     }
-  },
-  watch:{
-    'id'(val,oldVal){
-      this.curCel = this.nodeOpt(this.id,this.globalGridAttr)
-    }
-  },
-  mounted() {
-    // this.curCel = this.nodeOpt(this.id,this.globalGridAttr)
   },
   methods:{
     showDialog() {
@@ -135,9 +133,9 @@
       // console.log(node,'node')
       this.text =node.nodeName
       this.dateId = node.nodeId
-      this.globalGridAttr.dataId = this.dateId
-      this.globalGridAttr.inspectName = this.text
-      this.globalGridAttr.nodeText = this.text
+      this.tempNodeAttr.dataId = this.dateId
+      this.tempNodeAttr.inspectName = this.text
+      this.tempNodeAttr.nodeText = this.text
       this.data={
         dataId:this.dateId,
         inspectName:this.text
@@ -146,56 +144,56 @@
       this.curCel.attr('text/text', this.text)
       this.curCel.attr('data/dataId', this.dateId)
       this.curCel.attr('data/inspectName', this.text)
-      this.curCel = this.nodeOpt(this.id,this.globalGridAttr)
+      // this.curCel = this.nodeOpt(this.id,this.tempNodeAttr)
       this.dialogVisible = false
       // console.log(node,'dialog绐楀彛杩斿洖鍊�')
     },
     // 鏀瑰彉杈规棰滆壊
     onStrokeChange(e){
       let val = e
-      this.globalGridAttr.nodeStroke = val
+      this.tempNodeAttr.nodeStroke = val
      this.curCel.attr('body/stroke', val)
     },
     //鏀瑰彉杈规澶у皬
     onStrokeWidthChange(e){
       let val =e
-      this.globalGridAttr.nodeStrokeWidth = val
+      this.tempNodeAttr.nodeStrokeWidth = val
       this.curCel.attr('body/strokeWidth', val)
     },
     //鏀瑰彉鏂囨湰棰滆壊
     onFillChange(e){
       let val = e
-      this.globalGridAttr.nodeFill=val
+      this.tempNodeAttr.nodeFill=val
       this.curCel.attr('body/fill', val)
       // this.curCel.attr('title/fill', val)
     },
     // 鏀瑰彉瀛椾綋澶у皬
     onFontSizeChange(e){
       let val =e
-      this.globalGridAttr.nodeFontSize = val
+      this.tempNodeAttr.nodeFontSize = val
       this.curCel.attr('text/fontSize', val)
       this.curCel.attr('title/fontSize', val)
     },
     // 鏀瑰彉瀛椾綋棰滆壊
     onColorChange(e){
       let val =e
-      this.globalGridAttr.nodeColor = val
+      this.tempNodeAttr.nodeColor = val
       this.curCel.attr('text/fill', val)
       this.curCel.attr('title/fill', val)
       this.curCel.attr('text/style/color', val)
       this.curCel.attr('title/style/color', val)
-      this.curCel = this.nodeOpt(this.id,this.globalGridAttr)
+      // this.curCel = this.nodeOpt(this.id,this.tempNodeAttr)
     },
     // 鏀瑰彉鏂囨湰
     onTextChange(e){
       this.text =e
-      this.globalGridAttr.nodeText = this.text
+      this.tempNodeAttr.nodeText = this.text
       this.curCel.attr('label/textWrap/text', this.text)
-      this.curCel = this.nodeOpt(this.id,this.globalGridAttr)
+      // this.curCel = this.nodeOpt(this.id,this.tempNodeAttr)
     },
     onDateChange(e){
       this.date =e
-       this.globalGridAttr.nodeDate = this.date
+       this.tempNodeAttr.nodeDate = this.date
        this.data={
         finishDate:this.date,
       }
@@ -204,42 +202,24 @@
         this.curCel.attr('text/text', this.date)
       }
       this.curCel.attr('title/text', this.date)
-      this.curCel = this.nodeOpt(this.id,this.globalGridAttr)
+      // this.curCel = this.nodeOpt(this.id,this.tempNodeAttr)
     },
-    nodeOpt(id, globalGridAttr){
-      this.curCel=null
-      if(id){
-        let cell =  this.graph.getCellById(id)
-        // console.log(cell,'let cell 123456')
-        if (!cell || !cell.isNode()) {
-          return
-        }
-        this.curCel = cell
-        globalGridAttr.nodeStroke = cell.attr('body/stroke')
-        globalGridAttr.nodeStrokeWidth = cell.attr('body/strokeWidth')
-        globalGridAttr.nodeFill = cell.attr('body/fill')
-        // globalGridAttr.nodeFontSize = cell.attr('text/fontSize')
-        // globalGridAttr.nodeFontSize = cell.attr('title/fontSize')
-        globalGridAttr.nodeFontSize = cell.attr('text/fontSize')?cell.attr('text/fontSize'):cell.attr('title/fontSize')
-        globalGridAttr.nodeColor = cell.attr('text/fill') ? cell.attr('text/fill'):cell.attr('title/fill')?cell.attr('title/fill'):cell.attr('label/text/fill')
-        // globalGridAttr.nodeColor = cell.attr('text/fill')
-        // globalGridAttr.nodeColor = cell.attr('title/fill')
-        // globalGridAttr.nodeColor = cell.attr('text/style/color')
-        // globalGridAttr.nodeColor =  cell.attr('title/style/color')
-        globalGridAttr.nodeUsers = cell.attr('approve/users')
-        globalGridAttr.nodeText = cell.attr('label/textWrap/text')
-        console.log(globalGridAttr.nodeText,'globalGridAttr.nodeText')
-        if(this.shape=='custom-circle1'){
-          globalGridAttr.nodeDate = cell.attr('text/text')
-        }
-        globalGridAttr.nodeDate = cell.attr('title/text')
-        globalGridAttr.dataId = cell.getData().dataId
-        globalGridAttr.inspectName =cell.getData().inspectName
-        // console.log(globalGridAttr.inspectName,globalGridAttr.dataId,globalGridAttr.nodeDate,'globalGridAttr.inspectName,globalGridAttr.dataId,globalGridAttr.nodeDate 789')
-        cell.getData()
-        // console.log( cell.getData(),' cell.getData() 909')
+    loadData(cell){
+      this.curCel=cell
+      this.tempNodeAttr.nodeStroke = cell.attr('body/stroke')
+      this.tempNodeAttr.nodeStrokeWidth = cell.attr('body/strokeWidth')
+      this.tempNodeAttr.nodeFill = cell.attr('body/fill')
+      this.tempNodeAttr.nodeFontSize = cell.attr('text/fontSize')?cell.attr('text/fontSize'):cell.attr('title/fontSize')
+      this.tempNodeAttr.nodeColor = cell.attr('text/fill') ? cell.attr('text/fill'):cell.attr('title/fill')?cell.attr('title/fill'):cell.attr('label/text/fill')
+      this.tempNodeAttr.nodeUsers = cell.attr('approve/users')
+      this.tempNodeAttr.nodeText = cell.attr('label/textWrap/text')
+      console.log(this.tempNodeAttr.nodeText,'tempNodeAttr.nodeText')
+      if(this.shape=='custom-circle1'){
+        this.tempNodeAttr.nodeDate = cell.attr('text/text')
       }
-      return this.curCel;
+      this.tempNodeAttr.nodeDate = cell.attr('title/text')
+      this.tempNodeAttr.dataId = cell.getData().dataId
+      this.tempNodeAttr.inspectName =cell.getData().inspectName
     }
   }
 }
diff --git a/web/src/views/modules/taskReliability/RBD-edit-img.vue b/web/src/views/modules/taskReliability/RBD-edit-img.vue
index 74bf82b..93c984d 100644
--- a/web/src/views/modules/taskReliability/RBD-edit-img.vue
+++ b/web/src/views/modules/taskReliability/RBD-edit-img.vue
@@ -18,7 +18,10 @@
               <el-button type="primary" @click="saveDiagram()">鏆傚瓨</el-button>
               <el-button type="primary" @click="analyzeDiagram()">鎻愪氦</el-button>
               <el-button type="primary" @click="clearDiagram()">娓呯┖鍥惧舰</el-button>
-              <el-button type="primary" @click="layoutDiagram()">涓�閿帓鐗�</el-button>
+              <el-checkbox style="margin: 0 10px 0 10px" v-model="dataForm.autoLayout" :true-label="1" :false-label="0">
+                鏄惁寮�鍚竴閿帓鐗�
+              </el-checkbox>
+              <el-button type="primary" @click="layoutDiagram()" :disabled="!dataForm.autoLayout">涓�閿帓鐗�</el-button>
               <el-button @click="leftAlign()">
                 <i style="font-size: 1rem;" class="wt-iconfont icon-zuoduiqi"></i>
               </el-button>
@@ -576,7 +579,8 @@
           publishContent: null,
           hasPublish: 0,
           urlPref: '',
-          nodeArr: []
+          nodeArr: [],
+          autoLayout: 1,
         },
         type: '',
         id: '',
@@ -754,6 +758,7 @@
         }
         let res = await this.$http.get(`/taskReliability/ModelLine/getDiagram`, {params: params})
         this.dataForm = res.data
+        this.dataForm.autoLayout = parseInt(this.dataForm.autoLayout)
         if (res.data.content != null) {
           console.log(this.dataForm, 'getDiagram datafrom')
           console.log(res.data, 'getDiagram res.data')
@@ -930,7 +935,7 @@
               for (let i = 1; i <= node.getData().basicUnitNum; i++) {
                 if (deviceNoArr.findIndex(item => item === i) === -1) {
                   no = i
-                  if (node.getData().basicUnitNum>1){
+                  if (node.getData().basicUnitNum > 1) {
                     node.getData().deviceNo = i
                     node.attr('text/text', node.attr('text/text') + '-' + i)
                   }
@@ -1061,12 +1066,12 @@
                 //'xlink:href': urlObject.createObjectURL(new Blob([item.svgContent])),
               },
               title: {
-                text: item.basicUnitNum>1?item.basicUnitNum:'',
+                text: item.basicUnitNum > 1 ? item.basicUnitNum : '',
                 refX: 15,
                 refY: 10,
                 fill: '#748be7',
                 fontSize: 14,
-                fontWeight:'bold',
+                fontWeight: 'bold',
                 'text-anchor': 'start',
               },
               text: {
@@ -1219,7 +1224,7 @@
         // 鐩戝惉鑺傜偣娣诲姞浜嬩欢
         this.graph.on('node:added', ({node}) => {
           node.setAttrs({
-            title: { text: '' },
+            title: {text: ''},
           })
           if (this.isFirstLoad) {
             return
@@ -1580,26 +1585,28 @@
         })
       },
       async layoutDiagram() {
-        console.log(JSON.stringify(this.graph.toJSON()), 'graph.toJSON()')
-        this.dataForm.content = JSON.stringify(this.graph.toJSON())
-        this.dataForm.urlPref = window.SITE_CONFIG['apiURL']
-        await this.$http['post'](`/taskReliability/ModelLine/layout`, this.dataForm).then(async res => {
-          if (res.msg === 'success') {
-            // this.$emit('refreshDataList')
-            // this.$alert('瑙f瀽鎴愬姛', '鎻愮ず', {
-            //   confirmButtonText: '纭畾'
-            // })
-            console.log(res.data, 'layoutDiagram res.data')
-            this.dataForm.content = res.data.content
-            console.log(this.dataForm.content, 'layoutDiagram dataForm.content')
-            this.diagramJson = JSON.parse(this.dataForm.content)
-            this.graph.fromJSON(this.diagramJson)
-            this.isFirstLoad = false;
-            // console.log(this.diagramJson.cells.length, 'this.diagramJson.cells.length')
+        if (this.dataForm.autoLayout == 1) {
+          console.log(JSON.stringify(this.graph.toJSON()), 'graph.toJSON()')
+          this.dataForm.content = JSON.stringify(this.graph.toJSON())
+          this.dataForm.urlPref = window.SITE_CONFIG['apiURL']
+          await this.$http['post'](`/taskReliability/ModelLine/layout`, this.dataForm).then(async res => {
+            if (res.msg === 'success') {
+              // this.$emit('refreshDataList')
+              // this.$alert('瑙f瀽鎴愬姛', '鎻愮ず', {
+              //   confirmButtonText: '纭畾'
+              // })
+              console.log(res.data, 'layoutDiagram res.data')
+              this.dataForm.content = res.data.content
+              console.log(this.dataForm.content, 'layoutDiagram dataForm.content')
+              this.diagramJson = JSON.parse(this.dataForm.content)
+              this.graph.fromJSON(this.diagramJson)
+              this.isFirstLoad = false;
+              // console.log(this.diagramJson.cells.length, 'this.diagramJson.cells.length')
 
-            this.graph.positionContent('left')
-          }
-        })
+              this.graph.positionContent('left')
+            }
+          })
+        }
       },
       leftAlign() {
         const NODE = this.graph.getSelectedCells()
@@ -1776,9 +1783,11 @@
             inEdges[0].target = {cell: result.newStartNode.id}
             outEdges[0].source = {cell: result.newEndNode.id}
             graphNode.remove()
-            if (!result.canPlace) {
-//璋冪敤鑷姩鎺掔増
-              this.layoutDiagram()
+            if (this.dataForm.autoLayout == 1) {
+              if (!result.canPlace) {
+                //璋冪敤鑷姩鎺掔増
+                this.layoutDiagram()
+              }
             }
           }
         } else { //骞惰缁撴瀯
@@ -1831,9 +1840,11 @@
             connector: {name: 'rounded'},
             zIndex: -1
           })
-          if (!result.canPlace) {
-//璋冪敤鑷姩鎺掔増
-            this.layoutDiagram()
+          if (this.dataForm.autoLayout == 1) {
+            if (!result.canPlace) {
+              //璋冪敤鑷姩鎺掔増
+              this.layoutDiagram()
+            }
           }
         }
       },
@@ -1963,8 +1974,11 @@
             })
             graphEdge.source = {cell: result.newEndNode.id}
           }
-          if (!result.canPlace) {
-            this.layoutDiagram()
+          if (this.dataForm.autoLayout == 1) {
+            if (!result.canPlace) {
+              //璋冪敤鑷姩鎺掔増
+              this.layoutDiagram()
+            }
           }
           // graphEdge.remove()
         }
diff --git a/web/src/views/modules/taskReliability/ReliabilityAssess.vue b/web/src/views/modules/taskReliability/ReliabilityAssess.vue
index 49562fe..6516b3e 100644
--- a/web/src/views/modules/taskReliability/ReliabilityAssess.vue
+++ b/web/src/views/modules/taskReliability/ReliabilityAssess.vue
@@ -19,6 +19,15 @@
           <el-button type="primary" @click="assess()">璇勫畾</el-button>
           <el-button type="primary" @click="add()">鏂板璇勫畾鏁版嵁</el-button>
           <el-button type="primary" @click="handleExpand()">{{expandText}}</el-button>
+          <el-dropdown style="margin-left: 10px" @command="download">
+            <el-button type="primary">
+              涓嬭浇xml<i class="el-icon-arrow-down el-icon--right"></i>
+            </el-button>
+            <el-dropdown-menu slot="dropdown">
+              <el-dropdown-item command="1">杈撳叆xml</el-dropdown-item>
+              <el-dropdown-item command="2">杈撳嚭xml</el-dropdown-item>
+            </el-dropdown-menu>
+          </el-dropdown>
         </el-form>
         <el-table ref="multipleTable" v-loading="table.dataLoading" :data="dataList" height="100px" v-adaptive="{bottomOffset:70}"
                   row-key="id"
@@ -43,6 +52,8 @@
 </template>
 <script>
   import AddOrUpdate from './RelisbilityAssess-AddOrUpdate'
+  import qs from "qs";
+  import Cookies from "js-cookie";
 
   export default {
     data() {
@@ -189,6 +200,21 @@
           }
         })
       },
-    }
+      async download(selsect) {
+        if (!this.dataForm.productId || !this.dataForm.taskId || !this.dataForm.itemId ) {
+          this.$tip.alert("鏈夋湭濉啓鐨勬暟鎹�")
+          return
+        }
+          let param = qs.stringify({
+            'token': Cookies.get('token'),
+            productId: this.dataForm.productId,
+            taskId: this.dataForm.taskId,
+            itemId: this.dataForm.itemId,
+            xml:selsect
+          })
+          let apiURL = `/taskReliability/ReliabilityAssess/downloadXml`
+          window.location.href = `${window.SITE_CONFIG['apiURL']}${apiURL}?${param}`
+        }
+      },
   }
 </script>
diff --git a/web/src/views/modules/taskReliability/SchemeCompar.vue b/web/src/views/modules/taskReliability/SchemeCompar.vue
index 718307c..10efed1 100644
--- a/web/src/views/modules/taskReliability/SchemeCompar.vue
+++ b/web/src/views/modules/taskReliability/SchemeCompar.vue
@@ -10,12 +10,12 @@
                      @change="onTaskSelected" :multiple="true"/>
         </zt-form-item>
         <zt-form-item label="鏃堕棿鍒嗙墖" prop="samplPeriod">
-          <el-input type="number" :min="1" v-model="dataForm.samplPeriod">
+          <el-input type="number" :min="1" v-model="dataForm.samplPeriod" style="width: 150px;vertical-align: baseline;">
             <template slot="append">鍒嗛挓</template>
           </el-input>
         </zt-form-item>
         <zt-form-item label="浠跨湡娆℃暟" prop="simulatFrequency">
-          <el-input type="number" :min="1" v-model="dataForm.simulatFrequency">
+          <el-input type="number" :min="1" v-model="dataForm.simulatFrequency" style="width: 150px;vertical-align: baseline;">
             <template slot="append">娆℃暟</template>
           </el-input>
         </zt-form-item>
diff --git a/web/src/views/modules/taskReliability/SimulatAssess.vue b/web/src/views/modules/taskReliability/SimulatAssess.vue
index de15fbc..7b59686 100644
--- a/web/src/views/modules/taskReliability/SimulatAssess.vue
+++ b/web/src/views/modules/taskReliability/SimulatAssess.vue
@@ -8,40 +8,50 @@
         <zt-form-item label="鎬讳綋浠诲姟" prop="taskModelId">
           <zt-select v-model="dataForm.taskModelId" :datas="taskList" @change="onTaskSelected"/>
         </zt-form-item>
-        <zt-form-item label="鏃堕棿鍒嗙墖" prop="samplPeriod" >
-          <el-input type="number" :min="1" v-model="dataForm.samplPeriod" style="width: 150px;vertical-align: baseline;">
+        <zt-form-item label="鏃堕棿鍒嗙墖" prop="samplPeriod">
+          <el-input type="number" :min="1" v-model="dataForm.samplPeriod"
+                    style="width: 150px;vertical-align: baseline;">
             <template slot="append">鍒嗛挓</template>
           </el-input>
         </zt-form-item>
-        <zt-form-item label="浠跨湡娆℃暟" prop="simulatFrequency" >
-          <el-input type="number" :min="1" v-model="dataForm.simulatFrequency" style="width: 150px;vertical-align: baseline;">
+        <zt-form-item label="浠跨湡娆℃暟" prop="simulatFrequency">
+          <el-input type="number" :min="1" v-model="dataForm.simulatFrequency"
+                    style="width: 150px;vertical-align: baseline;">
             <template slot="append">娆℃暟</template>
           </el-input>
         </zt-form-item>
         <el-form-item prop="repairDiracFlag" label-width="150px" style="margin-left: 20px">
           <el-checkbox v-model="dataForm.repairDiracFlag">鍙慨璁惧鍙潬搴︿负1</el-checkbox>
         </el-form-item>
-        <zt-form-item style="margin-left: 20px">
+        <zt-form-item style="margin-left: 10px">
           <zt-button @click="analyze()">浠跨湡鍒嗘瀽</zt-button>
-        </zt-form-item>
-        <zt-form-item style="margin-left: 20px">
-          <zt-button @click="displayProcess()">鏌ョ湅绠楁硶搴撹繘绋�</zt-button>
+          <zt-button @click="displayProcess()">绠楁硶搴撹繘绋�</zt-button>
+          <el-dropdown style="margin-left: 10px" @command="download">
+            <el-button type="primary">
+              涓嬭浇xml<i class="el-icon-arrow-down el-icon--right"></i>
+            </el-button>
+            <el-dropdown-menu slot="dropdown">
+              <el-dropdown-item command="1">杈撳叆xml</el-dropdown-item>
+              <el-dropdown-item command="2">杈撳嚭xml</el-dropdown-item>
+            </el-dropdown-menu>
+          </el-dropdown>
         </zt-form-item>
       </el-form>
       <el-progress v-if="isShow" :percentage="percentage"></el-progress>
-          <el-col :span="4">
-            <div style="margin-right: 5px;height: calc(100vh - 230px)" v-if="isSelect">
-              <product-model-tree @on-selected="onTreeSelected" showXdy="false"
-                                  ref="ProductModelTree" :isShow="false" basic="4" :productId="dataForm.productId"/>
-            </div>
-          </el-col>
-          <el-col :span="20">
-            <div  class="fa-card-a" style="height: calc(100vh - 230px)">
-                <SimulatCurve ref="SimulatCurve"></SimulatCurve>
-            </div>
-          </el-col>
+      <el-col :span="4">
+        <div style="margin-right: 5px;height: calc(100vh - 230px)" v-if="isSelect">
+          <product-model-tree @on-selected="onTreeSelected" showXdy="false"
+                              ref="ProductModelTree" :isShow="false" basic="4" :productId="dataForm.productId"/>
+        </div>
+      </el-col>
+      <el-col :span="20">
+        <div class="fa-card-a" style="height: calc(100vh - 230px)">
+          <SimulatCurve ref="SimulatCurve"></SimulatCurve>
+        </div>
+      </el-col>
     </el-row>
-    <el-dialog v-dialogDrag :close-on-click-modal="false" top="8vh" :visible.sync="dialogVisible" title="妯″瀷妫�鏌�" width="60%" @close="dialogVisible = false">
+    <el-dialog v-dialogDrag :close-on-click-modal="false" top="8vh" :visible.sync="dialogVisible" title="妯″瀷妫�鏌�"
+               width="60%" @close="dialogVisible = false">
       <el-tag type="danger" style="margin-bottom: 10px">妯″瀷瀹氫箟/鍙傛暟閰嶇疆閲屽瓨鍦ㄤ互涓嬮棶棰橈細</el-tag>
       <el-table :data="modelCheckResult" height="350"
                 :header-cell-style="{'text-align':'center'}">
@@ -66,6 +76,8 @@
   import SimulatCurve from "./SimulatCurve";
   import ProductModelTree from "../basicInfo/ProductModelTree";
   import Process from "./Process";
+  import qs from "qs";
+  import Cookies from "js-cookie";
 
 
   export default {
@@ -113,7 +125,7 @@
 
     methods: {
       onTreeSelected(data) {
-        if (this.dataForm.id){
+        if (this.dataForm.id) {
           console.log(data, 'onProductSelected')
           this.dataForm.showProductId = data.id
           this.$refs.SimulatCurve.getProductEcharts(this.dataForm);
@@ -184,6 +196,21 @@
           }
         }
       },
+      async download(selsect) {
+        if(this.dataForm.id){
+          let param = qs.stringify({
+            'token': Cookies.get('token'),
+            type: 'fz',
+            xml:selsect,
+            id: this.dataForm.id
+          })
+          let apiURL = `/taskReliability/SimulatAssess/downloadXml`
+          window.location.href = `${window.SITE_CONFIG['apiURL']}${apiURL}?${param}`
+        }else{
+          this.$alert('杩樻湭杩涜浠跨湡鎿嶄綔')
+        }
+
+      },
       displayProcess() {
         this.$refs.process.$refs.dialog.init()
       }
diff --git a/web/src/views/modules/taskReliability/SimulatHistory.vue b/web/src/views/modules/taskReliability/SimulatHistory.vue
index 8a3bd42..6f9d89e 100644
--- a/web/src/views/modules/taskReliability/SimulatHistory.vue
+++ b/web/src/views/modules/taskReliability/SimulatHistory.vue
@@ -12,12 +12,12 @@
             <zt-select v-model="dataForm.id" :datas="simulatList" @change="onSimulatSelected"/>
           </zt-form-item>
           <zt-form-item label="鏃堕棿鍒嗙墖" prop="samplPeriod">
-            <el-input v-model="dataForm.samplPeriod" readonly="false">
+            <el-input v-model="dataForm.samplPeriod" readonly="false" style="width: 150px;vertical-align: baseline;">
               <template slot="append">鍒嗛挓</template>
             </el-input>
           </zt-form-item>
           <zt-form-item label="浠跨湡娆℃暟" prop="simulatFrequency">
-            <el-input v-model="dataForm.simulatFrequency" readonly="false">
+            <el-input v-model="dataForm.simulatFrequency" readonly="false" style="width: 150px;vertical-align: baseline;">
             </el-input>
           </zt-form-item>
         </el-form>
diff --git a/web/src/views/modules/taskReliability/TimeDiagram.vue b/web/src/views/modules/taskReliability/TimeDiagram.vue
index 0d654f8..15c0973 100644
--- a/web/src/views/modules/taskReliability/TimeDiagram.vue
+++ b/web/src/views/modules/taskReliability/TimeDiagram.vue
@@ -13,18 +13,25 @@
             <zt-select v-model="dataForm.id" :datas="simulatList" @change="onSimulatSelected"/>
           </zt-form-item>
           <zt-form-item label="鏃堕棿鍒嗙墖" prop="samplPeriod">
-            <el-input v-model="dataForm.samplPeriod" readonly="false">
+            <el-input v-model="dataForm.samplPeriod" readonly="false" style="width: 150px;vertical-align: baseline;">
               <template slot="append">鍒嗛挓</template>
             </el-input>
           </zt-form-item>
           <zt-form-item label="浠跨湡娆℃暟" prop="simulatFrequency">
-            <el-input v-model="dataForm.simulatFrequency" readonly="false">
+            <el-input v-model="dataForm.simulatFrequency" readonly="false" style="width: 150px;">
             </el-input>
           </zt-form-item>
           <zt-form-item>
             <zt-button @click="getDiagram(null)">鏌ョ湅鏃跺簭鍥�</zt-button>
-<!--            <zt-button @click="graphRightTranslate()">鐢诲竷鍙崇Щ</zt-button>-->
-<!--            <zt-button @click="graphLeftTranslate()">鐢诲竷宸︾Щ</zt-button>-->
+            <el-dropdown style="margin-left: 10px" @command="download">
+              <el-button type="primary">
+                涓嬭浇xml<i class="el-icon-arrow-down el-icon--right"></i>
+              </el-button>
+              <el-dropdown-menu slot="dropdown">
+                <el-dropdown-item command="1">杈撳叆xml</el-dropdown-item>
+                <el-dropdown-item command="2">杈撳嚭xml</el-dropdown-item>
+              </el-dropdown-menu>
+            </el-dropdown>
           </zt-form-item>
         </el-form>
         <div style="display: flex">
@@ -61,6 +68,8 @@
   import ModelView from "./ModelView";
   import textDiagram from "./textDiagram";
   import timeDiagramThumbnail from "./timeDiagramThumbnail"
+  import qs from "qs";
+  import Cookies from "js-cookie";
 
 
   export default {
@@ -141,7 +150,6 @@
       window.removeEventListener('scroll', this.handleScroll,true);
     },
     mounted() {
-      // alert(`mounted鎵ц浜哷)
       this.getProductList()
       this.init()
       this.$refs.textDiagram.init()
@@ -158,7 +166,6 @@
       handleScroll(){
         this.graph.getScrollbarPosition()
         let left = this.graph.getScrollbarPosition().left
-        console.log(left,'left left')
         let top = this.graph.getScrollbarPosition().top
         this.$refs.textDiagram.setScroll(top)
         this.$refs.timeDiagramThumbnail.getNodePointX(left,this.bigWidth)
@@ -205,20 +212,6 @@
             minVisibleHeight:300,
             pannable: true,
           },
-          // minimap: {
-          //   enabled: true,
-          //   container: document.getElementById('thumbnail'),
-          //   scalable:false,
-          //   width: document.documentElement.clientWidth - 400,
-          //   height: 150,
-          // },
-          // mousewheel: {
-          //   enabled: true,
-          //   zoomAtMousePosition: true,
-          //   modifiers: 'ctrl',
-          //   minScale: 0.1,
-          //   maxScale: 10,
-          // },
           createEdge() {
             return new Shape.Edge({
               data: {
@@ -277,169 +270,12 @@
                 textVerticalAnchor: 'middle',
                 textWrap: {
                   text: '鏂囧瓧妯℃澘',
-                  width: -10,      // 瀹藉害鍑忓皯 10px
+                  width: 120,      // 瀹藉害鍑忓皯 10px
                   ellipsis: false,  // 鏂囨湰瓒呭嚭鏄剧ず鑼冨洿鏃讹紝鑷姩娣诲姞鐪佺暐鍙�
                   breakWord: true, // 鏄惁鎴柇鍗曡瘝
                 }
               },
             },
-            ports: {...this.ports},
-          },
-          true,
-        )
-
-        Graph.registerNode(
-          'custom-polygon',
-          {
-            inherit: 'polygon',
-            width: 86,
-            height: 56,
-            attrs: {
-              body: {
-                strokeWidth: 1,
-                stroke: '#5F95FF',
-                fill: '#EFF4FF',
-              },
-              text: {
-                fontSize: 20,
-                fill: '#262626',
-              },
-            },
-            ports: {
-              ...this.ports
-              // items: [
-              //   {
-              //     group: 'top',
-              //   },
-              //   {
-              //     group: 'bottom',
-              //   },
-              // ],
-            },
-          },
-          true,
-        )
-        //
-        Graph.registerNode(
-          'custom-circle',
-          {
-            inherit: 'ellipse',
-            width: 120,
-            height: 120,
-            data: {
-              dataId: '',
-              finishDate: ''
-            },
-            attrs: {
-              body: {
-                strokeWidth: 1,
-                stroke: '#5F95FF',
-                fill: '#EFF4FF',
-              },
-              //鏃ユ湡
-              title: {
-                text: '',
-                fontSize: 12,
-                fill: '#262626',
-                refX: 0.5,
-                refY: '100%',
-                refY2: -10,
-                textAnchor: 'middle',
-                textVerticalAnchor: 'bottom',
-              },
-              // 鍚嶇О
-              text: {
-                // fontFamily: '浠垮畫',
-                fontSize: 20,
-                fill: '#262626',
-                textWrap: {
-                  width: 80,      // 瀹藉害涓� 80px鎹㈣
-                  ellipsis: false,  // 鏂囨湰瓒呭嚭鏄剧ず鑼冨洿鏃讹紝鑷姩娣诲姞鐪佺暐鍙�
-                  breakWord: true, // 鏄惁鎴柇鍗曡瘝
-                }
-              },
-            },
-            markup: [
-              {
-                tagName: 'ellipse',
-                selector: 'body',
-              },
-              {
-                tagName: 'text',
-                selector: 'title',
-              },
-              {
-                tagName: 'text',
-                selector: 'text',
-              },
-            ],
-            ports: {...this.ports},
-          },
-          true,
-        )
-        Graph.registerNode(
-          'custom-circle1',
-          {
-            inherit: 'ellipse',
-            width: 65,
-            height: 65,
-            data: {
-              dataId: '',
-              finishDate: ''
-            },
-            attrs: {
-              body: {
-                strokeWidth: 1,
-                stroke: '#5F95FF',
-                fill: '#EFF4FF',
-              },
-              //鏃ユ湡
-              text: {
-                // fontFamily: '浠垮畫',
-                fontSize: 12,
-                text: '鏃ユ湡鑺傜偣',
-                fill: '#262626',
-              },
-            },
-            ports: {...this.ports},
-          },
-          true,
-        )
-        Graph.registerNode(
-          'custom-text',
-          {
-            inherit: 'text-block',
-            width: 86,
-            height: 56,
-            attrs: {
-              body: {
-                strokeWidth: 1,
-                stroke: '#5F95FF',
-                fill: '#EFF4FF',
-              },
-              text: {
-                text: '涓撲笟',
-                fontSize: 20,
-                style: {
-                  color: this.globalGridAttr.nodeColor
-                },
-                refX: '0',
-                refY: -0.5,
-                refY2: 1,
-                textAnchor: 'middle',
-                textVerticalAnchor: 'middle',
-              },
-            },
-            markup: [
-              {
-                tagName: 'rect',
-                selector: 'body',
-              },
-              {
-                tagName: 'text',
-                selector: 'text',
-              },
-            ],
             ports: {...this.ports},
           },
           true,
@@ -460,34 +296,12 @@
         })
 
         this.graph.on('blank:click', ({cell}) => {
-          // this.reset()
-          // this.type.value = "grid"
           this.type = 'grid'
-          // this.id = cell.id
         })
-        this.graph.on('translate', ({ tx, ty }) => {
-          console.log(`褰撳墠鍋忕Щ閲忎綅缃�: x=${tx}, y=${ty}`);
-        });
         this.graph.on('cell:click', ({cell}) => {
-          // this.type.value = cell.isNode() ? "node" : "edge"
           this.type = cell.isNode() ? 'node' : 'edge'
           this.shape = cell.shape
           this.id = cell.id
-          console.log(this.shape, 'this.shape')
-          // this.nodeOpt(this.id, this.globalGridAttr)
-        })
-        //鍗曞嚮杈硅妭鐐�
-        this.graph.on('edge:click', ({edge}) => {
-          // this.reset()
-          edge.attr('line/stroke', '#5F95FF')
-          edge.prop('labels/0', {
-            attrs: {
-              body: {
-                stroke: '#5F95FF',
-              },
-            },
-
-          })
         })
         // 鍗曞嚮node鑺傜偣
         this.graph.on('node:click', ({node}) => {
@@ -617,14 +431,9 @@
           this.diagramJson = JSON.parse(res.data.diagramJson)
           let textDiagramJson = JSON.parse(res.data.textDiagramJson)
           let smallDiagramJson = JSON.parse(res.data.smallDiagramJson)
-          console.log(this.diagramJson, 'this.Diagram json')
-          console.log(smallDiagramJson, 'smallDiagramJson')
           this.graph.fromJSON(this.diagramJson)
-          // this.graph.centerContent()
           this.graph.positionContent('left',{ padding: { left: 0 }})
-          // this.graph.zoomToFit()
           this.bigWidth = this.graph.getContentBBox().width
-          console.log(this.bigWidth,'getContentBBox')
           // this.graph.resize(this.graph.getContentBBox().width,this.graph.getContentBBox().height)
           this.graph.freeze()
           this.$refs.textDiagram.getTextDiagram(textDiagramJson)
@@ -640,14 +449,22 @@
       },
       getPoint(x,smallWidth){
         let pointX = Number((x * (this.bigWidth / smallWidth )).toFixed(0))
-        // console.log(pointX)
         this.graph.setScrollbarPosition(pointX, null)
-        // if(pointX<600){
-        // this.graph.setScrollbarPosition(pointX, null,  { animation: { duration: 400 }})
-        // }else {
-        //   this.graph.scrollToPoint(pointX, null, {animation: {duration: 400}})
-        // }
-      }
+      },
+      async download(selsect) {
+        if(this.dataForm.id){
+          let param = qs.stringify({
+            'token': Cookies.get('token'),
+            type: 'sxt',
+            xml:selsect,
+            id: this.dataForm.id
+          })
+          let apiURL = `/taskReliability/SimulatAssess/downloadXml`
+          window.location.href = `${window.SITE_CONFIG['apiURL']}${apiURL}?${param}`
+        }else{
+          this.$alert('杩樻湭閫夋嫨浠跨湡璁板綍')
+        }
+      },
     }
   }
 </script>
diff --git a/web/src/views/modules/taskReliability/TimeDiagramTemp.vue b/web/src/views/modules/taskReliability/TimeDiagramTemp.vue
index cd5301c..98b77bc 100644
--- a/web/src/views/modules/taskReliability/TimeDiagramTemp.vue
+++ b/web/src/views/modules/taskReliability/TimeDiagramTemp.vue
@@ -2,11 +2,9 @@
   <div>
     <el-row :gutter="[8,8]">
       <el-col :span="5">
-        <div style="height: 80vh">
-          <div class="fa-card-a">
+          <div class="fa-card-a" style="height: calc(100vh - 128px)">
             <div id="stencil"></div>
           </div>
-        </div>
       </el-col>
       <el-col :span="19">
         <div class="fa-card-a">
@@ -33,11 +31,8 @@
           <div id="container" style="border: 1px solid #EAEBEE;border-radius: 6px;
         box-shadow: 0 2px 12px 0 rgb(0 0 0 / 10%);">
           </div>
-          <config-edge ref="configEdge" v-show="type === 'edge'" :id="id" :globalGridAttr="globalGridAttr"
-                       :graph="graph"/>
-          <config-node v-show="type === 'node'"  :id="id" :globalGridAttr="globalGridAttr"
-                       :graph="graph"
-                       :shape="shape"/>
+          <config-edge ref="configEdge" v-show="type === 'edge'"/>
+          <config-node ref="configNode" v-show="type === 'node'" />
         </div>
       </el-col>
     </el-row>
@@ -143,7 +138,6 @@
           opacity: 0.1,
 
           stroke: '#5F95FF',
-          strokeWidth: 1,
           connector: 'normal',
           label: '',
           nodeStroke: '#5F95FF',
@@ -405,7 +399,7 @@
                   line: {
                     stroke: '#A2B1C3',
                     strokeWidth: 2,
-                    targetMarker: 'classic'
+                    targetMarker: null,
                   }
                 },
                 tools: {
@@ -790,6 +784,16 @@
           this.shape = cell.shape
           this.id = cell.id
           console.log(this.shape, 'this.shape')
+          // if (this.type === 'edge') {
+          //   //this.nodeType = cell.getData().nodeType
+          //   this.$refs.configEdge.loadData(cell)
+          // }
+          if (this.type === 'node') {
+            this.$refs.configNode.loadData(cell,this.globalGridAttr)
+          }
+           if (this.type === 'edge') {
+            this.$refs.configEdge.loadData(cell)
+          }
           // this.nodeOpt(this.id, this.globalGridAttr)
         })
         //鍗曞嚮杈硅妭鐐�
@@ -839,59 +843,57 @@
           })
         })
 
-        this.graph.on('node:mouseenter', ({node}) => {
-          const container = document.getElementById('container')
-          const ports = container.querySelectorAll(
-            '.x6-port-body',
-          )
-          this.showPorts(ports, true)
-        })
+        // this.graph.on('node:mouseenter', ({node}) => {
+        //   const container = document.getElementById('container')
+        //   const ports = container.querySelectorAll(
+        //     '.x6-port-body',
+        //   )
+        // })
+        //
+        // this.graph.on('node:mouseleave', ({node}) => {
+        //   // if (node.hasTool('button-remove')) {
+        //   //   node.removeTool('button-remove')
+        //   // }
+        //   const container = document.getElementById('container')
+        //   const ports = container.querySelectorAll(
+        //     '.x6-port-body',
+        //   )
+        // })
 
-        this.graph.on('node:mouseleave', ({node}) => {
-          // if (node.hasTool('button-remove')) {
-          //   node.removeTool('button-remove')
-          // }
-          const container = document.getElementById('container')
-          const ports = container.querySelectorAll(
-            '.x6-port-body',
-          )
-          this.showPorts(ports, false)
-        })
-
-        this.graph.on('edge:mouseenter', ({cell, view}) => {
-          // alert(123)
-          cell.addTools([
-            {
-              name: 'source-arrowhead',
-            },
-            {
-              name: 'target-arrowhead',
-              args: {
-                attrs: {
-                  fill: 'red',
-                },
-              },
-            },
-          ])
-          cell.addTools(
-            [
-              {
-                name: 'segments',
-                args: {snapRadius: 20, attrs: {fill: '#444'}}
-              }
-            ]
-          )
-        })
-
-        this.graph.on('edge:mouseleave', ({cell}) => {
-          cell.removeTools()
-        })
+        // this.graph.on('edge:mouseenter', ({cell, view}) => {
+        //   // alert(123)
+        //   cell.addTools([
+        //     {
+        //       name: 'source-arrowhead',
+        //     },
+        //     {
+        //       name: 'target-arrowhead',
+        //       args: {
+        //         attrs: {
+        //           fill: 'red',
+        //         },
+        //       },
+        //     },
+        //   ])
+        //   cell.addTools(
+        //     [
+        //       {
+        //         name: 'segments',
+        //         args: {snapRadius: 20, attrs: {fill: '#444'}}
+        //       }
+        //     ]
+        //   )
+        // })
+        //
+        // this.graph.on('edge:mouseleave', ({cell}) => {
+        //   cell.removeTools()
+        // })
       },
-      showPorts(ports, show) {
-        for (let i = 0, len = ports.length; i < len; i = i + 1) {
-          ports[i].style.visibility = show ? 'visible' : 'hidden'
-        }
-      },
+      // showPorts(ports, show) {
+      //   for (let i = 0, len = ports.length; i < len; i = i + 1) {
+      //     ports[i].style.visibility = show ? 'visible' : 'hidden'
+      //   }
+      // },
 
       async saveDiagram() {
         console.log(JSON.stringify(this.graph.toJSON()), 'graph.toJSON()')
@@ -1028,12 +1030,12 @@
   }
 
   .x6-graph-scroller.x6-graph-scroller-pannable {
-    width: 100% !important;
+    width: 100% ;
   }
 
   #stencil {
     width: 100%;
-    height: 350px;
+    height:100%;
     position: relative;
     border-right: 1px solid #dfe3e8;
   }

--
Gitblit v1.9.1