From 664db98c9e8595ce4dd636a27f480e3a08b81ff5 Mon Sep 17 00:00:00 2001
From: xyc <jc_xiong@hotmail.com>
Date: 星期五, 21 二月 2025 11:13:51 +0800
Subject: [PATCH] 新增可忽略的维修时间

---
 web/src/views/modules/taskReliability/TimeDiagram.vue |  430 ++++++++++++++++++++---------------------------------
 1 files changed, 164 insertions(+), 266 deletions(-)

diff --git a/web/src/views/modules/taskReliability/TimeDiagram.vue b/web/src/views/modules/taskReliability/TimeDiagram.vue
index 9fce2f7..bf021da 100644
--- a/web/src/views/modules/taskReliability/TimeDiagram.vue
+++ b/web/src/views/modules/taskReliability/TimeDiagram.vue
@@ -1,8 +1,8 @@
 <template>
-  <div class="fa-card-a">
-    <el-row :gutter="5">
+  <div class="fa-card-a" style="width: calc(100% - 20px);height: calc(100vh - 128px)">
+    <div >
       <div class="mod-taskReliability-simulatAssess">
-        <el-form :inline="true" :model="dataForm" ref="dataForm" :disabled="dataForm.disabled" label-width="80px">
+        <el-form :inline="true" :model="dataForm" ref="dataForm" :disabled="dataForm.disabled" >
           <zt-form-item label="浜у搧鑺傜偣" prop="productId">
             <zt-select v-model="dataForm.productId" :datas="productList" @change="onProductSelected"/>
           </zt-form-item>
@@ -13,35 +13,49 @@
             <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()">鏌ョ湅鏃跺簭鍥�</zt-button>
+          <zt-form-item>
+            <zt-button @click="getDiagram(null)">鏌ョ湅鏃跺簭鍥�</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>
-          <el-col :span="4">
+        <div style="display: flex">
+          <div style="width: 300px">
             <div style="margin-right: 5px;height: calc(88vh - 100px)" v-if="isSelect">
               <product-model-tree @on-selected="onTreeSelected"
                                   ref="ProductModelTree" :isShow="false" :productId="dataForm.productId"/>
             </div>
-          </el-col>
-          <el-col :span="20">
-            <div style="margin-top: 20px">
-              <div id="timeDiagram" style="border: 1px solid #EAEBEE;border-radius: 6px;
+          </div>
+          <div style="height: calc(100vh - 233px);width: calc(100% - 300px);margin-left:10px">
+            <div style="margin-top:15px;width:100%; height:100%;border: 1px solid #EAEBEE;border-left:none;border-radius: 6px;
         box-shadow: 0 2px 12px 0 rgb(0 0 0 / 10%);">
+<!--              <div style="width:100%;height: 150px" id="thumbnail" class="minimap-container"></div>-->
+              <timeDiagramThumbnail ref="timeDiagramThumbnail" @getPoint="getPoint"></timeDiagramThumbnail>
+              <div id="flexLayout" style="display:flex;">
+                <textDiagram class="flexLayout-item_1"  ref="textDiagram"></textDiagram>
+                <div id="timeDiagram" class="flexLayout-item_2" style="height: 300px" ref="scrollView"  @mousewheel="handleScroll"></div>
               </div>
             </div>
-          </el-col>
+          </div>
         </div>
       </div>
-    </el-row>
-    <el-dialog v-dialogDrag title="妯″瀷璁捐" top="1vh" width='95%' :visible.sync="dialogVisible2" v-if="dialogVisible2">
+    </div>
+    <el-dialog v-dialogDrag :title="title" top="1vh" width='95%' :visible.sync="dialogVisible2" v-if="dialogVisible2">
       <model-view ref="modelView"></model-view>
     </el-dialog>
   </div>
@@ -52,11 +66,18 @@
   import ProductModelTree from "../basicInfo/ProductModelTree";
   import {Graph, Shape, Addon, Cell} from '@antv/x6'
   import ModelView from "./ModelView";
+  import textDiagram from "./textDiagram";
+  import timeDiagramThumbnail from "./timeDiagramThumbnail"
+  import qs from "qs";
+  import Cookies from "js-cookie";
 
 
   export default {
     data() {
       return {
+        bigWidth:0,
+        left:400,
+        title:'',
         knob:HTMLDivElement,
         dialogVisible2: false,
         timers: '',
@@ -70,6 +91,9 @@
         MTTR: '',
         diagramJson: '',
         graph: null,
+        timeDiagramWidth:document.documentElement.clientWidth - 300,
+        timeDiagramHeight:document.documentElement.clientHeight - 133,
+        smallTimeDiagramWidth:document.documentElement.clientWidth - 600,
         globalGridAttr: {
           type: 'mesh',
           size: 10,
@@ -117,26 +141,59 @@
         }
       }
     },
+    created() {
+      let scrollView = this.$refs['scrollView']
+      window.addEventListener('scroll', this.handleScroll,{passive:false});
+    },
+    destroyed() {
+      let scrollView = this.$refs['scrollView']
+      window.removeEventListener('scroll', this.handleScroll);
+    },
     mounted() {
-      this.getProductList()
+      this.getProductList(Cookies.get('productId'))
+      this.init()
+      this.$refs.textDiagram.init()
+      this.$refs.timeDiagramThumbnail.init()
     },
     components: {
       ModelView,
       ProductModelTree,
       SimulatCurve,
+      textDiagram,
+      timeDiagramThumbnail
     },
     methods: {
+      handleScroll(){
+        this.graph.getScrollbarPosition()
+        let left = this.graph.getScrollbarPosition().left
+        let top = this.graph.getScrollbarPosition().top
+        this.$refs.textDiagram.setScroll(top)
+        this.$refs.timeDiagramThumbnail.getNodePointX(left,this.bigWidth)
+      },
+      getPath(){
+        if (Cookies.get('productId') != null){
+          this.dataForm.id = Cookies.get('fzId')
+          this.dataForm.productId = Cookies.get('productId')
+          this.dataForm.taskModelId = Cookies.get('taskModelId')
+          console.log(this.dataForm.id)
+          this.getTaskList()
+          this.$nextTick(() => {
+            this.onProductSelected({id:this.dataForm.productId})
+            this.onTaskSelected({id:Cookies.get('taskModelId')})
+            this.onSimulatSelected({id:Cookies.get('fzId')})
+          })
+        }
+      },
       init() {
-        console.log(document.documentElement.clientWidth, 'document.documentElement.clientWidth')
-        console.log(document.documentElement.clientHeight, 'document.documentElement.clientHeight')
         this.graph = new Graph({
           container: document.getElementById('timeDiagram'),
-          width: document.documentElement.clientWidth,
-          height: document.documentElement.clientHeight - 220,
+          // width: document.documentElement.clientWidth - 100,
+          height: document.documentElement.clientHeight - 440,
           // async: true,
           grid: {
-            visible: true,
+            visible: false,
           },
+          virtual:true,
           embedding: {
             enabled: true,
             findParent({node}) {
@@ -155,16 +212,19 @@
           autoResize: true,
           scroller: {
             enabled: true,
-            pageVisible: true,
-            pageBreak: true,
+            className:'my-scroller-drag',
+            pageWidth:100,
+            pageVisible:true,
+            // pageBreak:true,
+            padding: {
+              top: 0,
+              right: 0,
+              bottom: 0,
+              left: 0,
+            },
+            minVisibleWidth: 500,
+            minVisibleHeight:300,
             pannable: true,
-          },
-          mousewheel: {
-            enabled: true,
-            zoomAtMousePosition: true,
-            modifiers: 'ctrl',
-            minScale: 0.1,
-            maxScale: 10,
           },
           createEdge() {
             return new Shape.Edge({
@@ -178,8 +238,7 @@
                 line: {
                   stroke: '#A2B1C3',
                   strokeWidth: 2,
-                  sourceMarker: 'none',
-                  targetMarker: 'none'
+                  targetMarker: null,
                 }
               },
               tools: {
@@ -193,8 +252,8 @@
         this.knob = document.createElement('div',false)
         this.knob.style.position = 'absolute'
         document.getElementById('timeDiagram').appendChild(this.knob)
-        this.graph.centerContent()
-
+        this.graph.positionContent('left',{ padding: { left: 0 }})
+        // this.graph.centerContent()
         Graph.registerNode(
           'custom-rect',
           {
@@ -225,169 +284,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,
@@ -408,32 +310,12 @@
         })
 
         this.graph.on('blank:click', ({cell}) => {
-          // this.reset()
-          // this.type.value = "grid"
           this.type = 'grid'
-          // this.id = cell.id
         })
-
         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}) => {
@@ -442,8 +324,9 @@
             this.dialogVisible2 = true
             let param = {
               id: node.getData().dataId,
-              modelName: node.attr('label/textWrap/text'),
+              modelName: node.attr('label/textWrap/modelName'),
             }
+            this.title=node.attr('label/textWrap/modelName') + "妯″瀷璁捐"
             this.$nextTick(() => {
               this.$refs.modelView.init(param)
             })
@@ -461,7 +344,7 @@
         this.graph.on('edge:mouseenter', ({edge,e}) => {
           const style = this.knob.style
           // e.stopPropagation()
-          console.log('edge:mouseenter')
+          // console.log('edge:mouseenter')
           if (e && edge.data) {
             if (edge.getData().status==='F') {
               //console.log(edge.getData(),"eee edge.getData()")
@@ -482,22 +365,26 @@
                 style.zIndex = 100
                 this.knob.innerText = `寮�濮嬫椂闂达細${startTimes}\n缁撴潫鏃堕棿锛�${endTimes}`
               },0)
-              console.log(p,'p p p')
-              console.log(style,this.knob,'style style')
+              // console.log(p,'p p p')
+              // console.log(style,this.knob,'style style')
             }
           }
         })
 // 榧犳爣绉诲嚭edge鑺傜偣
         this.graph.on('edge:mouseleave', ({edge}) => {
-          console.log('edge:mouseleave')
+          // console.log('edge:mouseleave')
           const style = this.knob.style
           style.display = 'none'
         })
       },
-      async getProductList() {
+      async getProductList(productId) {
         let res = await this.$http.get('/basicInfo/XhProductModel/getTaskProductList')
         this.productList = res.data
-        this.onProductSelected(this.productList[0])
+        if(productId!=null){
+          this.getPath()
+        }else{
+          this.onProductSelected(this.productList[0])
+        }
       },
       async getTaskList() {
         let params = {
@@ -515,37 +402,7 @@
         console.log(res.data)
         this.simulatList = res.data
       },
-      async onTreeSelected(data) {
-        this.graph.unfreeze()
-        if (!this.dataForm.taskModelId) {
-          this.$alert("璇峰厛閫夋嫨鍏蜂綋浠诲姟")
-          return
-        }
-        if (!this.dataForm.id) {
-          this.$alert("璇峰厛閫夋嫨鍏蜂綋浠跨湡璁板綍")
-          return
-        }
-        let params = {
-          productId: data.id,
-          taskId: this.dataForm.taskModelId,
-          fzId: this.dataForm.id
-        }
-        let res = await this.$http.get('/taskReliability/SimulatAssess/getStatus', {params: params})
-        if (res.data !== null) {
-          this.diagramJson = JSON.parse(res.data)
-          console.log(this.diagramJson, 'this.Diagram json')
-          this.graph.fromJSON(this.diagramJson)
-          this.graph.centerContent()
-          this.graph.zoomToFit()
-          this.graph.freeze()
-        } else {
-          this.graph.fromJSON(this.emptyJson)
-          this.graph.centerContent()
-          this.graph.zoomToFit()
-          this.graph.freeze()
-        }
-        console.log(res.data)
-      },
+
       // 鑾峰彇淇℃伅
       onProductSelected(data) {
         this.isSelect = true
@@ -556,7 +413,7 @@
         this.$nextTick(() => {
           this.$refs.ProductModelTree.getProductList()
         })
-        this.init()
+        // this.init()
       },
       onTaskSelected(data) {
         console.log(data, ' onProductSelected(data)')
@@ -575,28 +432,56 @@
         this.dataForm.samplPeriod = result.data.samplPeriod
         this.dataForm.simulatFrequency = result.data.simulatFrequency
       },
-      async getDiagram() {
+      async onTreeSelected(data) {
+        await this.getDiagram(data.id)
+      },
+      async getDiagram(productId) {
         this.graph.unfreeze()
         let params = {
-          productId: this.dataForm.productId,
+          productId: productId ? productId : this.dataForm.productId,
           taskId: this.dataForm.taskModelId,
-          fzId: this.dataForm.id
+          fzId: this.dataForm.id,
+          smallWidth: 1200,
+          minPointNum: 5
         }
         let res = await this.$http.get('/taskReliability/SimulatAssess/getStatus', {params: params})
         if (res.data !== null) {
-          this.diagramJson = JSON.parse(res.data)
-          console.log(this.diagramJson, 'this.Diagram json')
+          this.diagramJson = JSON.parse(res.data.diagramJson)
+          let textDiagramJson = JSON.parse(res.data.textDiagramJson)
+          let smallDiagramJson = JSON.parse(res.data.smallDiagramJson)
           this.graph.fromJSON(this.diagramJson)
-          this.graph.centerContent()
-          this.graph.zoomToFit()
+          this.graph.positionContent('left',{ padding: { left: 0 }})
+          this.bigWidth = this.graph.getContentBBox().width
+          // this.graph.resize(this.graph.getContentBBox().width,this.graph.getContentBBox().height)
           this.graph.freeze()
+          this.$refs.textDiagram.getTextDiagram(textDiagramJson)
+          this.$refs.timeDiagramThumbnail.getThumbnail(smallDiagramJson)
         } else {
           this.graph.fromJSON(this.emptyJson)
-          this.graph.centerContent()
-          this.graph.zoomToFit()
+          this.graph.positionContent('left',{ padding: { left: 0 }})
+          // this.graph.centerContent()
+          //this.graph.zoomToFit()
           this.graph.freeze()
         }
         console.log(res.data)
+      },
+      getPoint(x,smallWidth){
+        let pointX = Number((x * (this.bigWidth / smallWidth )).toFixed(0))
+        this.graph.setScrollbarPosition(pointX, null)
+      },
+      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('杩樻湭閫夋嫨浠跨湡璁板綍')
+        }
       },
     }
   }
@@ -604,16 +489,17 @@
 <style>
   #timeDiagram {
     display: flex;
-    border: 1px solid #dfe3e8;
-    width: 100% !important;
+    /*border: 1px solid #dfe3e8;*/
+    /*width: 60% !important;*/
   }
+
   #timeDiagram .x6-cell.x6-node {
     cursor: inherit;
   }
-  .x6-graph-scroller.x6-graph-scroller-pannable {
-    width: 100% !important;
-  }
 
+  #flexLayout  .x6-graph-scroller.x6-graph-scroller-pannable {
+    width: 92% !important;
+  }
   .x6-widget-stencil {
     position: relative;
     height: 100%;
@@ -623,4 +509,16 @@
     position: relative;
     height: 100%;
   }
+  .my-scroller-drag {
+    overflow: auto; /* 闇�瑕佹粴鍔ㄦ椂淇濇寔杩欎釜灞炴�� */
+    scrollbar-width: none; /* 瀵逛簬Firefox */
+  }
+
+  .my-scroller-drag::-webkit-scrollbar {
+    display: none; /* 瀵逛簬Chrome, Safari鍜孫pera */
+  }
+  .zt.light .el-tab-pane .mod-taskReliability-simulatAssess .el-form{
+    margin-top: 5px;
+   margin-bottom: 0;
+}
 </style>

--
Gitblit v1.9.1