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