From 563640b16778af6a281ed9417e2dcbed0ba5aa54 Mon Sep 17 00:00:00 2001 From: xyc <jc_xiong@hotmail.com> Date: 星期三, 08 五月 2024 10:51:59 +0800 Subject: [PATCH] Merge remote-tracking branch 'origin/master' --- web/src/views/modules/taskReliability/RBD-edit-img.vue | 1198 +++++++++++++++++++++++++++++++---------------------------- 1 files changed, 637 insertions(+), 561 deletions(-) diff --git a/web/src/views/modules/taskReliability/RBD-edit-img.vue b/web/src/views/modules/taskReliability/RBD-edit-img.vue index dcc05dc..0878f72 100644 --- a/web/src/views/modules/taskReliability/RBD-edit-img.vue +++ b/web/src/views/modules/taskReliability/RBD-edit-img.vue @@ -3,7 +3,7 @@ <el-row :gutter="[8,8]"> <el-col :span="4"> <div :style="'height:' +left_p+'px'"> - <div class="fa-card-a" style="height: 100%"> + <div style="height: 100%"> <div id="stencilImg"></div> </div> </div> @@ -12,58 +12,34 @@ <div class="fa-card-a"> <el-form :inline="true"> <el-form-item> - 妯″瀷鍚嶇О锛歿{modelName}} - </el-form-item> - <el-form-item> - <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-form-item> - <el-form-item> - <el-tooltip class="item" effect="dark" content="宸﹀榻�" placement="left"> - <el-button class="" style="margin-left: 0;padding: 2px;border: 1px solid #5F95FF;" - @click="leftAlign()"><i style="font-size: 2rem;" - class="wt-iconfont icon-zuoduiqi"></i></el-button> - </el-tooltip> + 妯″瀷鍚嶇О锛歿{ modelName }} </el-form-item> <el-form-item> - <el-tooltip class="item" effect="dark" content="灞呬腑瀵归綈" placement="left"> - <el-button style="margin-left: 0;padding: 2px;border: 1px solid #5F95FF" - @click="centerAlign()"><i style="font-size: 2rem;" - class="wt-iconfont icon-chuizhiduiqi"></i></el-button> - </el-tooltip> - </el-form-item> - <el-form-item> - <el-tooltip class="item" effect="dark" content="鍙冲榻�" placement="left"> - <el-button style="margin-left: 0;padding: 2px;border: 1px solid #5F95FF" - @click="rightAlign()"><i style="font-size: 2rem;" - class="wt-iconfont icon-youduiqi"></i></el-button> - </el-tooltip> - </el-form-item> - <el-form-item> - <el-tooltip class="item" effect="dark" content="椤堕儴瀵归綈" placement="left"> - <el-button style="margin-left: 0;padding: 2px;border: 1px solid #5F95FF" - @click="topAlign()"><i style="font-size: 2rem;" - class="wt-iconfont icon-dingduiqi"></i></el-button> - </el-tooltip> - </el-form-item> - <el-form-item> - <el-tooltip class="item" effect="dark" content="姘村钩瀵归綈" placement="left"> - <el-button style="margin-left: 0;padding: 2px;border: 1px solid #5F95FF" - @click="shuipingAlign()"><i style="font-size: 2rem;" - class="wt-iconfont icon-shuipingduiqi"></i></el-button> - </el-tooltip> - </el-form-item> - <el-form-item> - <el-tooltip class="item" effect="dark" content="搴曢儴瀵归綈" placement="left"> - <el-button style="margin-left: 0;padding: 2px;border: 1px solid #5F95FF" - @click="bottomAlign()"><i style="font-size: 2rem;" - class="wt-iconfont icon-diduiqi"></i></el-button> - </el-tooltip> + <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 @click="leftAlign()"> + <i style="font-size: 1rem;" class="wt-iconfont icon-zuoduiqi"></i> + </el-button> + <el-button @click="centerAlign()"> + <i style="font-size: 1rem;" class="wt-iconfont icon-chuizhiduiqi"></i> + </el-button> + <el-button @click="rightAlign()"> + <i style="font-size: 1rem;" class="wt-iconfont icon-youduiqi"></i> + </el-button> + <el-button @click="topAlign()"> + <i style="font-size: 1rem;" class="wt-iconfont icon-dingduiqi"></i> + </el-button> + <el-button @click="shuipingAlign()"> + <i style="font-size: 1rem;" class="wt-iconfont icon-shuipingduiqi"></i> + </el-button> + <el-button @click="bottomAlign()"> + <i style="font-size: 1rem;" class="wt-iconfont icon-diduiqi"></i> + </el-button> </el-form-item> </el-form> <div id="containerImg" style="border: 1px solid #EAEBEE;border-radius: 6px; - box-shadow: 0 2px 12px 0 rgb(0 0 0 / 10%);"> + box-shadow: 0 2px 12px 0 rgb(0 0 0 / 10%);height: 100%"> </div> <config-node v-show="type === 'node'" :id="id" :diagramId="diagramId" :globalGridAttr="globalGridAttr" :graph="graph" @@ -83,6 +59,7 @@ import ConfigEdge from './ConfigEdge/index.vue' import {removeCurrentTabHandle} from '@/commonJS/common' import {setHartBeat} from '@/commonJS/common'; + import Cookies from 'js-cookie' export default { name: 'RBD-edit-img', @@ -110,23 +87,68 @@ }, data() { return { + hasMoveNode: false, + hasMoveSingleNode: null, + nodeAdded: false, + connectNode: {}, modelId: '', modelName: '', - modelType:'', + modelType: '', timer: null, - imgsList:[ - {imgPath:'start',imgName:'start',nodeType:'start',imgWidth:60,imgHeight:60,imgId:'1',data:{}}, - {imgPath:'end',imgName:'end',nodeType:'end',imgWidth:60,imgHeight:60,imgId:'2',data:{}}, - {imgPath:'connect',imgName:'connect',nodeType:'connect',imgWidth:20,imgHeight:20,imgId:'3',data:{}}, - // {imgPath:'parallelLeft',imgName:'parallelLeft',nodeType:'parallelLeft',imgWidth:60,imgHeight:60,imgId:'3',data:{}}, - // {imgPath:'parallelRight',imgName:'parallel',nodeType:'parallel',imgWidth:60,imgHeight:60,imgId:'4',data:{}}, - {imgPath:'switchRight',imgName:'switch',nodeType:'switch',imgWidth:60,imgHeight:60,imgId:'5',data:{}}, - {imgPath:'voteRight',imgName:'vote',nodeType:'vote',imgWidth:60,imgHeight:60,imgId:'6',data:{}}, + imagesList: [ + {imgPath: 'start', imgName: 'start', nodeType: 'start', imgWidth: 60, imgHeight: 60, imgId: '1', data: {}}, + {imgPath: 'end', imgName: 'end', nodeType: 'end', imgWidth: 60, imgHeight: 60, imgId: '2', data: {}}, + { + imgPath: 'connect', + imgName: 'connect', + nodeType: 'connect', + imgWidth: 30, + imgHeight: 30, + imgId: '3', + data: {} + }, + { + imgPath: 'switch', + imgName: 'switch', + nodeType: 'switch', + imgWidth: 60, + imgHeight: 60, + imgId: '5', + data: {} + }, + { + imgPath: 'parallel', + imgName: 'parallel', + nodeType: 'parallel', + imgWidth: 60, + imgHeight: 60, + imgId: '9', + data: {} + }, + {imgPath: 'vote', imgName: 'vote', nodeType: 'vote', imgWidth: 60, imgHeight: 60, imgId: '6', data: {}}, + { + imgPath: 'dashedBox', + imgName: 'dashedBox', + nodeType: 'dashedBox', + imgWidth: 60, + imgHeight: 60, + imgId: '9', + data: {} + }, + { + imgPath: 'bridgeConnection', + imgName: 'bridgeConnection', + nodeType: 'bridgeConnection', + imgWidth: 60, + imgHeight: 60, + imgId: '9', + data: {} + }, ], - imgsList2:[ - {imgPath:'logo',imgName:'logo',nodeType:'node',statusImg:'',imgWidth:60,imgHeight:60,imgId:'100',data:{dataId:'123456',nodeTypeExt:''}}, + imagesList2: [ + // {imgPath:'logo',imgName:'logo',nodeType:'node',,nodeTypeExt:'',productType:'',statusImg:'',imgWidth:60,imgHeight:60,imgId:'100',dataId:'123456'}, ], - nodeType:'', + nodeType: '', first: true, shape: '', projectList: [], @@ -140,6 +162,7 @@ content: null, publishContent: null, hasPublish: 0, + urlPref: '', }, // emptyJson: { // // 鑺傜偣 @@ -167,8 +190,18 @@ id: '', graph: null, globalGridAttr: { - statusImg:'', - nodeTypeExt:'', + productType: '', + voteNum: '', + repairMttcr: '', + repairMttcrOther: '', + repairDistribType: '', + reliabDistribType: '', + taskMtbcfOther: '', + isRepair: 0, + taskMtbcf: '', + numberInputValue: '', + statusImg: '', + nodeTypeExt: '', type: 'mesh', size: 10, color: '#e5e5e5', @@ -185,7 +218,8 @@ stroke: '#5F95FF', strokeWidth: 1, - connector: 'normal', + connector: 'rounded', + router: 'manhattan', label: '', nodeStroke: '#5F95FF', nodeStrokeWidth: 1, @@ -204,11 +238,11 @@ }, isReady: false, curCel: Cell, - left_p: document.documentElement.clientHeight-100, + left_p: document.documentElement.clientHeight - 100, ports: { groups: { top: { - position: 'top', + position: {name: 'top'}, attrs: { circle: { r: 4, @@ -223,7 +257,7 @@ }, }, right: { - position: 'right', + position: {name: 'right'}, attrs: { circle: { r: 4, @@ -238,7 +272,7 @@ }, }, bottom: { - position: 'bottom', + position: {name: 'bottom'}, attrs: { circle: { r: 4, @@ -253,7 +287,7 @@ }, }, left: { - position: 'left', + position: {name: 'left'}, attrs: { circle: { r: 4, @@ -270,15 +304,19 @@ }, items: [ { + id: 'top1', group: 'top', }, { + id: 'right1', group: 'right', }, { + id: 'bottom1', group: 'bottom', }, { + id: 'left1', group: 'left', }, ], @@ -295,43 +333,51 @@ } }, mounted() { - this.initDigram() + //this.initDigram() this.type = 'grid' }, methods: { - init(row){ + init(row) { this.modelName = row.modelName - let modelId = row.id - this.dataForm.id = modelId - this.getDiagram(modelId) + this.dataForm.id = row.id + // this.productId = row.productId + // this.getProduct(row.productId) + this.initDigram(row.productId) + console.log(this.dataForm, 'init(row){') }, async getDiagram(modelId) { let params = { - modelId : modelId + modelId: modelId, + urlPref: window.SITE_CONFIG['apiURL'], + token: Cookies.get('token'), } - let res = await this.$http.get(`/taskReliability/ModelLine/getDiagram`, {params: params}) - if (res.data !== null && res.data.content != null) { - this.dataForm = res.data - console.log(this.dataForm, 'this.dataForm in getDiagram') - this.diagramJson = JSON.parse(this.dataForm.content) - // console.log(this.dataForm.content,'this.Diagram content') - console.log(this.diagramJson, 'this.Diagram json') + let res = await this.$http.get(`/taskReliability/ModelLine/getDiagram`, {params: params}) + if (res.data !== null && (res.data.content != null)) { + this.dataForm = res.data + this.diagramJson = JSON.parse(this.dataForm.content) + if(this.diagramJson.cells.length!==0){ this.graph.fromJSON(this.diagramJson) - this.graph.centerContent() - this.graph.zoomToFit() - } else { - await this.clearDiagram() + }else { + this.initCells() } + console.log(this.diagramJson.cells.length, 'this.diagramJson.cells.length') + + this.graph.positionContent('left') + // this.graph.centerContent() + // this.graph.zoomToFit() + } else { + await this.clearDiagram() + } }, async clearDiagram() { this.dataForm.id = null // this.graph.fromJSON(this.emptyJson) this.graph.fromJSON('') - this.graph.centerContent() - this.graph.zoomToFit() + // this.graph.centerContent() + // this.graph.zoomToFit() // this.graph.freeze() }, - initDigram() { + async initDigram(productId) { this.timer = setHartBeat(10, 240); console.log(document.documentElement.clientWidth, 'document.documentElement.clientWidth') console.log(document.documentElement.clientHeight, 'document.documentElement.clientHeight') @@ -343,41 +389,39 @@ grid: { visible: true, }, - onToolItemCreated({tool}) { - const handle = tool - const options = handle.options - if (options && options.index % 2 === 1) { - tool.setAttrs({fill: 'red'}) - } - }, autoResize: true, - history: true, + history: { + enabled: true, + beforeAddCommand(event, args) { + if (args.key === 'tools') { + // console.log(args.key, 'event, args') + return false + } + }, + }, // panning: { // enabled: true, // }, scroller: { enabled: true, pageVisible: true, + autoResize: true, pageBreak: true, pannable: true, - minVisibleWidth:200, - minVisibleHeight:200, + minVisibleWidth: 200, + minVisibleHeight: 200, modifiers: 'shift', }, - // panning: { - // enabled: true, - // modifiers: 'shift', - // }, mousewheel: { enabled: true, zoomAtMousePosition: true, modifiers: 'ctrl', - minScale: 0.1, - maxScale: 10, + minScale: 0.5, + maxScale: 3, }, connecting: { router: { - name: 'normal', + name: 'manhattan', // args: { // padding: 1, // }, @@ -385,10 +429,10 @@ connector: { name: 'rounded', args: { - radius: 8, + radius: 5, }, }, - // anchor: 'center', + anchor: 'center', connectionPoint: 'anchor', allowBlank: false, snap: { @@ -421,6 +465,12 @@ } } }], + tools: { + name: 'segments', + args: { + attrs: {fill: '#666'}, + }, + }, zIndex: 0, }) }, @@ -439,16 +489,13 @@ }, }, }, - resizing: { - enabled: true, - restricted: true - }, + resizing: true, rotating: true, selecting: { enabled: true, rubberband: true, rubberEdge: true, - // showNodeSelectionBox: true, + showNodeSelectionBox: true, }, snapline: true, keyboard: true, @@ -456,396 +503,157 @@ }) this.graph.centerContent() const stencil = new Addon.Stencil({ + getDragNode: (node) => node.clone({keepId: true}), + getDropNode: (node) => { + const { width, height } = node.size() + if(node.getData().type && node.getData().nodeType === 'dashedBox'){ + return node.clone().size(170, 90) + } + if (node.getData().type && node.getData().type === 'imageNodes2') { + return node.clone({keepId: true}) + } else { + return node.clone() + } + }, + validateNode: (node) => { + const existingNodes = this.graph.getNodes(); // 鑾峰彇鐢诲竷涓婃墍鏈夎妭鐐� + for (const existingNode of existingNodes) { + if (existingNode.id === node.id) { + this.$message({message: '璇ヨ澶囪妭鐐瑰凡鍦ㄧ敾甯冧笂锛屾棤娉曞啀娆$粯鍒�', type: 'warning'}) + return false; // 鍙栨秷娣诲姞鑺傜偣鎿嶄綔 + } + } + }, title: '', target: this.graph, - stencilGraphWidth: 230, - stencilGraphHeight: 300, - collapsable: false, + stencilGraphWidth: 200, + stencilGraphHeight: 280, + collapsable: true, groups: [ { title: '杩愮畻绗﹀彿', name: 'group1', - collapsable: false + graphHeight: 360, }, { title: '璁惧鑺傜偣', name: 'group2', - collapsable: false + graphHeight: '', + layoutOptions: { + rowHeight: 90, + }, } ], layoutOptions: { columns: 2, - columnWidth: 110, - // rowHeight: 75, + columnWidth: 105, }, }) document.getElementById('stencilImg').appendChild(stencil.container) - - Graph.registerNode( - 'custom-rect', - { - inherit: 'rect', - width: 86, - height: 26, - zIndex: 10, - data: { - dataId: '', - finishDate: '', - inspectName: '' - }, - attrs: { - body: { - strokeWidth: 1, - stroke: 'none', - fill: 'none', - }, - text: { - // fontFamily: '浠垮畫', - fontSize: 20, - fill: '#000', - }, - label: { - refX: 0, - refY: 0.5, - textAnchor: 'start', - textVerticalAnchor: 'middle', - textWrap: { - text: '鏂囧瓧妯℃澘', - width: -10, // 瀹藉害鍑忓皯 10px - ellipsis: false, // 鏂囨湰瓒呭嚭鏄剧ず鑼冨洿鏃讹紝鑷姩娣诲姞鐪佺暐鍙� - breakWord: true, // 鏄惁鎴柇鍗曡瘝 - } - }, - }, - ports: {...this.ports}, + const imageNodes = this.imagesList.map((item) => + this.graph.createNode({ + shape: 'image', + // imageUrl: require('/public/modelImg/' + item.imgPath + '.png'), + width: item.imgWidth, + height: item.imgHeight, + data: { + type: 'imageNodes', + dataId: '', + nodeType: item.nodeType, + nodeTypeExt: '', + voteNum: '' }, - true, - ) - - Graph.registerNode( - 'custom-polygon', - { - inherit: 'polygon', - width: 86, - height: 56, - attrs: { - body: { - strokeWidth: 1, - stroke: '#5F95FF', - fill: '#EFF4FF', - }, - // title:{ - // text:'', - // refX: 40, - // refY: 38, - // fontSize: 20, - // fill: '#262626', - // 'text-anchor': 'start', - // }, - text: { - // refX: 40, - // refY: 20, - fontSize: 20, - fill: '#262626', - // 'text-anchor': 'start', - }, + attrs: { + image: { + 'xlink:href': '/modelImg/' + item.imgPath + '.svg', }, - // markup: [ - // { - // tagName: 'polygon', - // selector: 'body', - // }, - // { - // tagName: 'text', - // selector: 'title', - // }, - // { - // tagName: 'text', - // selector: 'text', - // }, - // ], - ports: { - ...this.ports - // items: [ - // { - // group: 'top', - // }, - // { - // group: 'bottom', - // }, - // ], + text: { + text: item.imgName, + fontSize: 14, + style: { + color: this.globalGridAttr.nodeColor + }, + refX: 0.5, + refY: '100%', + refY2: 4, + textAnchor: 'middle', + textVerticalAnchor: 'top', }, }, - true, + ports: {...this.ports}, + }), ) - // - 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}, + let params = { + productId: productId + } + let res = await this.$http.get(`/basicInfo/XhProductModel/getProduct`, {params: params}) + this.imagesList2 = res.data + console.log(this.imagesList2, 'getProduct(productId)234567890') + const imageNodes2 = this.imagesList2.map((item) => + this.graph.createNode({ + shape: 'image', + imageUrl: `${window.SITE_CONFIG['apiURL']}/sysPictureBase/getProductImg?token=${Cookies.get('token')}&id=${item.imgPath}`, + width: 60, + height: 60, + id: item.dataId, // 鎵嬪姩璁剧疆鑺傜偣鐨� ID + data: { + type: 'imageNodes2', + isRepair: item.isRepair, + dataId: item.dataId, + nodeType: item.nodeType, + nodeTypeExt: item.nodeTypeExt, + productType: item.productType, + statusImg: item.statusImg, + reliabDistribType: item.reliabDistribType, + repairDistribType: item.repairDistribType, + repairMttcr: item.repairMttcr, + repairMttcrOther: item.repairMttcrOther, + taskMtbcf: item.taskMtbcf, + taskMtbcfOther: item.taskMtbcfOther, + imgHeight: item.imgHeight, + imgWidth: item.imgWidth, + voteNum: '', }, - true, - ) - Graph.registerNode( - 'custom-circle1', - { - inherit: 'ellipse', - width: 65, - height: 65, - data: { - dataId: '', - finishDate: '' - }, - attrs: { - body: { - strokeWidth: 1, - stroke: '#5F95FF', - fill: '#EFF4FF', + attrs: { + text: { + text: item.imgName, + fontSize: 14, + style: { + color: this.globalGridAttr.nodeColor }, - //鏃ユ湡 - text: { - // fontFamily: '浠垮畫', - fontSize: 12, - text: '鏃ユ湡鑺傜偣', - fill: '#262626', - }, + refX: 0.5, + refY: '100%', + refY2: 4, + textAnchor: 'middle', + textVerticalAnchor: 'top', }, - 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, - ) - Graph.registerNode( - 'rectangle', - { - width: 86, - height: 56, - attrs: { - body: { - fill: '#FFF', - stroke: '#000', - strokeWidth: 1, - }, - icon: { - class: 'el-icon-refresh', // Element UI鍥炬爣鐨刢lass鍚嶇О - 'xlink:href': '', // 濡傛灉闇�瑕佷娇鐢⊿VG鍥炬爣锛岃璁剧疆xlink:href灞炴�ф潵寮曞叆SVG鏂囦欢 - refX: '50%', - refY: '50%', - yAlignment: 'middle', - xAlignment: 'middle', - }, - }, - markup: [ - { - tagName: 'rect', - selector: 'body', - }, - { - tagName: 'i', - selector: 'icon', - }, - ], - ports: {...this.ports}, - }, - true - ) - // 涓�绾х綉缁滃浘鐨勬棩鏈熸枃瀛楄妭鐐� - const r5 = this.graph.createNode({ - shape: 'custom-circle', - data: { - dataId: '', - finishDate: '', - inspectName: '' - }, - label: '闃舵', - }) - - // 浜岀骇缃戠粶鍥炬棩鏈熻妭鐐� - const r6 = this.graph.createNode({ - shape: 'custom-circle1', - data: { - dataId: '', - finishDate: '', - inspectName: '' - }, - }) - // 浜岀骇缃戠粶鍥炬枃瀛楄妭鐐� - const r9 = this.graph.createNode({ - shape: 'custom-rect' - }) - const imageNodes = this.imgsList.map((item) => - this.graph.createNode({ - shape: 'image', - imageUrl: require('/public/modelImg/'+item.imgPath+'.png'), - width: item.imgWidth, - height: item.imgHeight, - x: item.imgWidth, - y: item.imgHeight, - data: { - dataId: '', - nodeType: item.nodeType, - nodeTypeExt: '' - }, - attrs: { - text:{ - text: item.imgName, - fontSize: 14, - style: { - color: this.globalGridAttr.nodeColor - }, - refX: 0.5, - refY: '100%', - refY2: 4, - textAnchor: 'middle', - textVerticalAnchor: 'top', - }, - }, - ports: {...this.ports}, - }), - ) - const imageNodes2 = this.imgsList2.map((item) => - this.graph.createNode({ - shape: 'image', - imageUrl: require('/public/modelImg/'+item.imgPath+'.png'), - width:item.imgWidth, - height:item.imgHeight, - x:item.imgWidth, - y:item.imgHeight, - data: { - dataId: item.data.dataId, - nodeType: item.nodeType, - nodeTypeExt: item.data.nodeTypeExt, - statusImg:item.statusImg - }, - attrs: { - text:{ - text: item.imgName, - fontSize: 14, - style: { - color: this.globalGridAttr.nodeColor - }, - refX: 0.5, - refY: '100%', - refY2: 4, - textAnchor: 'middle', - textVerticalAnchor: 'top', - }, - }, - tools: [ - { - name: 'button', - args: { - markup: [ - { - tagName: 'image', - selector: 'icon', - attrs: { - // 'xlink:href': 'https://gw.alipayobjects.com/mdn/rms_43231b/afts/img/A*evDjT5vjkX0AAAAAAAAAAAAAARQnAQ', - 'xlink:href':item.statusImg, - width: 30, - height: 30, - x: 0, - y: 0 - } + tools: [ + { + name: 'button', + args: { + markup: [ + { + tagName: 'image', + selector: 'icon', + attrs: { + // 'xlink:href': 'https://gw.alipayobjects.com/mdn/rms_43231b/afts/img/A*evDjT5vjkX0AAAAAAAAAAAAAARQnAQ', + 'xlink:href': item.statusImg, + width: 30, + height: 30, + x: 0, + y: 0 } - ] - } + } + ] } - ], - ports: {...this.ports}, - }), + } + ], + ports: {...this.ports}, + }), ) stencil.load(imageNodes, 'group1') stencil.load(imageNodes2, 'group2') - this.graph.bindKey(['meta+c', 'ctrl+c'], () => { const cells = this.graph.getSelectedCells() @@ -935,17 +743,91 @@ this.type = 'grid' // this.id = cell.id }) + // 鐩戝惉鑺傜偣娣诲姞浜嬩欢 + this.graph.on('node:added', ({node}) => { + const nodeId = node.id; // 鑾峰彇鑺傜偣鐨勫敮涓� ID + const nodeObj = node + const intersectNodes = []; + // 妫�鏌ラ櫎褰撳墠鑺傜偣涔嬪鐨勬墍鏈夎妭鐐圭殑鍖呭洿妗嗘槸鍚︾浉浜� + for (const otherNode of this.graph.getNodes()) { + if (otherNode === node) continue; + const bbox1 = node.getBBox(); + const bbox2 = otherNode.getBBox(); + if (this.isIntersect(bbox1, bbox2)) { + intersectNodes.push(otherNode); + } + } + if (intersectNodes.length > 0) { + // console.log('Nodes intersect with node:', node.id); + console.log('Intersecting nodes:', intersectNodes.map(n => n)); // 鐩镐氦鑺傜偣鐨勫璞� + intersectNodes.map(node => { + this.addNodeAndConnect(node, nodeObj); + }) + } + }); + // 鐩戝惉鑺傜偣浣嶇疆鏀瑰彉浜嬩欢 + this.graph.on('node:change:position', ({node}) => { + this.hasMoveNode = true + this.hasMoveSingleNode = node + }); + // 鎶捣 + this.graph.on('node:mouseup', ({e,x,y,node}) => { + if (this.hasMoveNode) { + const selectionNodes = this.graph.getSelectedCells().filter(node => node.isNode() ) + if (selectionNodes.length == 0){ + selectionNodes.push(this.hasMoveSingleNode) + } + //let selectionNodes = [] + console.log('妯潗鏍囷細',x,'绾靛潗鏍囷細'+y) + // let allNodes = this.graph.getNodes() + // + // for(let node of allNodes){ + // if (this.graph.isSelected(node)){ + // selectionNodes.push(node) + // } + // + // } + // 鑾峰彇鍖呭惈鎸囧畾鍧愭爣鐐圭殑鑺傜偣 + const nodes = this.graph.getNodes(); + let hasNodes = [] + for (let i = 0; i < nodes.length; i++) { + const node = nodes[i]; + const bbox = node.getBBox(); + if (x>=bbox.x && x <= bbox.x + bbox.width && y>=bbox.y && y <= bbox.y + bbox.height) { + if ( selectionNodes.indexOf(node)===-1) { + hasNodes.push(node); + } + } + } + if(hasNodes){} + console.log('鑾峰彇鍖呭惈鎸囧畾鍧愭爣鐐圭殑鑺傜偣闆嗗悎',hasNodes) + console.log('閫変腑鐨勮妭鐐归泦鍚堬細',selectionNodes) + + // if (selectionNodes.length>2) + // this.graph.addEdge({ + // source: {cell: selectionNodes[0], port: 'left1'}, + // target: {cell: selectionNodes[selectionNodes.length-1], port: 'right1'}, + // router: {name: 'manhattan'}, + // connector: {name: 'rounded'} + // }) + this.hasMoveNode = false + this.hasMoveSingleNode = null + + + // console.log('绉诲姩杩囪妭鐐癸紙澶氫釜锛夊啀鎶捣榧犳爣鍚庡緱鍒扮殑鑺傜偣',selectedNodes); + } + }); 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 - if(this.type==='node'){ + if (this.type === 'node') { this.nodeType = cell.getData().nodeType - console.log(this.nodeType, 'this.nodeType') + // console.log(this.nodeType, cell.id, 'this.nodeType') } - console.log(this.shape, 'this.shape') + // console.log(this.shape, 'this.shape') // this.nodeOpt(this.id, this.globalGridAttr) }) //鍗曞嚮杈硅妭鐐� @@ -963,15 +845,6 @@ }) // 鍗曞嚮node鑺傜偣 this.graph.on('node:click', ({node}) => { - this.reset() - node.attr('line/stroke', 'orange') - node.prop('labels/0', { - attrs: { - body: { - stroke: 'orange', - }, - }, - }) }) // 鎺у埗杩炴帴妗╂樉绀�/闅愯棌 this.graph.on('node:delete', ({view, e}) => { @@ -1024,7 +897,7 @@ this.showPorts(ports, false) }) - this.graph.on('edge:mouseenter', ({cell, view}) => { + this.graph.on('edge:mouseenter', ({cell}) => { // alert(123) cell.addTools([ { @@ -1038,22 +911,18 @@ }, }, }, + { + name: 'segments', + args: {snapRadius: 20, attrs: {fill: '#444'}} + }, ]) - cell.addTools( - [ - { - name: 'segments', - args: {snapRadius: 20, attrs: {fill: '#444'}} - } - ] - ) }) this.graph.on('edge:mouseleave', ({cell}) => { cell.removeTools() }) - this.getDiagram() + await this.getDiagram(this.dataForm.id) }, showPorts(ports, show) { for (let i = 0, len = ports.length; i < len; i = i + 1) { @@ -1078,42 +947,13 @@ }) }) }, - // 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.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('text/text') - // globalGridAttr.nodeDate = cell.attr('title/text') - // // let data={ - // // dataId:this.projectId, - // // finishDate: globalGridAttr.nodeDate, - // // } - // cell.getData() - // console.log( cell.getData(),' cell.getData() 909') - // } - // return this.curCel; - // }, async search() { await this.getDiagram(); }, async saveDiagram() { console.log(JSON.stringify(this.graph.toJSON()), 'graph.toJSON()') this.dataForm.content = JSON.stringify(this.graph.toJSON()) + this.dataForm.urlPref = window.SITE_CONFIG['apiURL'] console.log(this.dataForm, 'dataFrom') await this.$http[this.dataForm.id === null ? 'post' : 'put'](`/taskReliability/ModelLine/`, this.dataForm).then(async res => { if (res.msg === 'success') { @@ -1126,7 +966,7 @@ async analyzeDiagram() { console.log(JSON.stringify(this.graph.toJSON()), 'graph.toJSON()') this.dataForm.content = JSON.stringify(this.graph.toJSON()) - console.log(this.dataForm, 'dataFrom') + this.dataForm.urlPref = window.SITE_CONFIG['apiURL'] await this.$http['post'](`/taskReliability/ModelLine/analyze`, this.dataForm).then(async res => { if (res.msg === 'success') { this.$alert('瑙f瀽鎴愬姛', '鎻愮ず', { @@ -1135,17 +975,6 @@ } }) }, - // AlignmentsChanges(val){ - // console.log(val,'align.value') - // if(val ==='閫夐」1'){ - // console.log(val,'align.value') - // this.leftAlign() - // } - // if(val ==='閫夐」2') { - // console.log('鍙冲榻�','align.value') - // this.rightAlign() - // } - // }, leftAlign() { const NODE = this.graph.getSelectedCells() let leftX = null @@ -1172,7 +1001,6 @@ for (let a of NODE) { let x = a.getBBox().x a.position(x, topY) - // console.log(leftX, ':', y, ' x:y') } }, centerAlign() { @@ -1195,7 +1023,6 @@ for (let a of NODE) { let y = a.getBBox().y a.position(centerX - a.getBBox().width / 2, y) - // console.log(leftX, ':', y, ' x:y') } }, shuipingAlign() { @@ -1248,9 +1075,250 @@ } }, close() { - if (this.timer){ + if (this.timer) { window.clearInterval(this.timer) } + }, + // 瀹氫箟鍑芥暟鏉ユ鏌ヤ袱涓寘鍥存鏄惁鐩镐氦 + isIntersect(bbox1, bbox2) { + return ( + bbox1.x < bbox2.x + bbox2.width && + bbox1.x + bbox1.width > bbox2.x && + bbox1.y < bbox2.y + bbox2.height && + bbox1.y + bbox1.height > bbox2.y + ) + }, + addNodeAndConnect(node, nodeObj) { // node鏄敾甯冨師鏈夌殑鑺傜偣銆俷odeObj鏄綋鍓嶆嫋鎷界殑鑺傜偣 + const nodeType = node.getData().nodeType // 鑾峰彇鐢诲竷鍘熸湁鐨勮妭鐐圭被鍨� + const nodeObjType = nodeObj.getData().nodeType // 鑾峰彇褰撳墠鎷栨嫿鐨勮妭鐐圭被鍨� + const edges = this.graph.getConnectedEdges(node); // 鑾峰彇涓庡師鑺傜偣鐩稿叧鑱旂殑鎵�鏈夎繛鎺ョ嚎 + let TopSum = 0 // 鍦ㄥ師鑺傜偣涓婃柟 + let BottomSum = 0 // 鍦ㄥ師鑺傜偣涓嬫柟 + const edgesSum = edges.length + if ((nodeType === 'end'|| nodeType === 'vote' || nodeType === 'switch' || nodeType === 'parallel') && nodeObjType === 'node') { + if (edges.length === 0) { + if (!this.nodeAdded) { + // 娣诲姞鑺傜偣鐨勬搷浣� + this.connectNode = this.graph.addNode({ + shape: 'image', + // imageUrl: require('/public/modelImg/' + item.imgPath + '.png'), + width: 30, + height: 30, + data: { + type: 'imageNodes', + dataId: '', + signId:node.id, + nodeType: 'connect', + nodeTypeExt: '', + voteNum: '' + }, + attrs: { + image: { + 'xlink:href': '/modelImg/connect.svg', + }, + text: { + text: 'connect', + fontSize: 14, + refX: 0.5, + refY: '100%', + refY2: 4, + textAnchor: 'middle', + textVerticalAnchor: 'top', + }, + }, + ports: {...this.ports}, + }) + // 璁剧疆鏍囪涓� true锛岃〃绀哄凡缁忔坊鍔犺繃鑺傜偣 + this.nodeAdded = true; + } + nodeObj.position(node.position().x - 120, node.position().y - (120 * edgesSum)); + this.connectNode.position(node.position().x - 240, node.position().y + (node.size().height - this.connectNode.size().height) / 2); + } else if (edges.length === 1) { + // 灏嗚妭鐐圭Щ鍔ㄥ埌鎸囧畾鐨勪綅缃� + nodeObj.position(node.position().x - 120, node.position().y - (120 * edgesSum)); + } else { + for (const edge of edges) { + const sourcePointY = edge.getSourcePoint().y; // 鑾峰彇杩炴帴绾跨殑璧峰鐐箉鍧愭爣 + const targetPointY = edge.getTargetPoint().y; // 鑾峰彇杩炴帴绾跨殑缁撴潫鐐箉鍧愭爣 + console.log('鍘熻妭鐐筜鍧愭爣' + node.position().y, '杩炴帴绾胯捣濮媃鍧愭爣' + sourcePointY) + if (targetPointY > sourcePointY) { + TopSum++ + } else if (targetPointY < sourcePointY) { + BottomSum++ + } + } + console.log('鍦ㄥ師鑺傜偣涓婃柟鐨勮繛鎺ョ嚎鏁伴噺:' + TopSum, '鍦ㄥ師鑺傜偣涓嬫柟鐨勮繛鎺ョ嚎鏁伴噺:' + BottomSum) + if (TopSum > BottomSum) { + nodeObj.position(node.position().x - 120, node.position().y + (120 + (120 * BottomSum))) + } else { + nodeObj.position(node.position().x - 120, node.position().y - (120 + (120 * TopSum))); + } + } + this.graph.addEdge({ + source: {cell: nodeObj, port: 'right1'}, + target: {cell: node, port: 'left1'}, + router: {name: 'manhattan'}, + connector: {name: 'rounded'} + }) + if (this.nodeAdded) { + console.log(this.connectNode, 'connectNode') + this.graph.addEdge({ + source: {cell: this.connectNode, port: 'right1'}, + target: {cell: nodeObj, port: 'left1'}, + router: {name: 'manhattan'}, + connector: {name: 'rounded'} + }) + } + } + if (nodeType === 'node' || (nodeType === 'dashedBox' && nodeObjType === 'dashedBox')) { + // 閬嶅巻鎵�鏈夎繛鎺ョ嚎骞跺垹闄や笌缁欏畾鑺傜偣瀵硅薄鐩稿叧鐨勮繛鎺ョ嚎 + console.log(edges, '鎵�鏈夋湁鍏宠仈鐨勮繛鎺ョ嚎 edge') + if (edges.length === 0) { + this.graph.addEdge({ + source: {cell: node, port: 'right1'}, + target: {cell: nodeObj, port: 'left1'}, + router: {name: 'manhattan'}, + connector: {name: 'rounded'} + }) + return nodeObj.position(node.position().x + node.getBBox().width + 50, node.position().y); + } else { + for (const edge of edges) { + console.log(edge, '鎵�鏈夋湁鍏宠仈鐨勮繛鎺ョ嚎 edge') + if (edge.source.cell === node.id) { // 濡傛灉杩炴帴绾跨殑璧峰鑺傜偣绛変簬褰撳墠鐢诲竷鐩爣鑺傜偣鐨処D + const sourceNode = this.graph.getCellById(edge.source.cell); // 鑾峰彇杩炴帴绾跨殑婧愯妭鐐瑰璞� + const targetNode = this.graph.getCellById(edge.target.cell) // 鑾峰彇杩炴帴绾跨殑鐩爣鑺傜偣瀵硅薄 + console.log(sourceNode, targetNode, 'targetNode 鐩爣鑺傜偣瀵硅薄') + // edge.remove(); // 浠庡浘涓垹闄よ杩炴帴绾� + nodeObj.position(node.position().x + node.getBBox().width + 50, node.position().y + (node.size().height - nodeObj.size().height) / 2); + // edge.source = {cell: node, port: 'right1'} + edge.target = {cell: nodeObj, port: 'left1'} + // targetNode.position(nodeObj.position().x +nodeObj.getBBox().width+50, node.position().y); + // this.graph.addEdge({ + // source: {cell: node, port: 'right1'}, + // target: {cell: nodeObj, port: 'left1'}, + // router: {name: 'manhattan'}, + // connector: {name: 'rounded'} + // }) + this.graph.addEdge({ + source: {cell: nodeObj, port: 'right1'}, + target: {cell: targetNode, port: 'left1'}, + router: {name: 'manhattan'}, + connector: {name: 'rounded'} + }) + } else { + this.graph.addEdge({ + source: {cell: node, port: 'right1'}, + target: {cell: nodeObj, port: 'left1'}, + router: {name: 'manhattan'}, + connector: {name: 'rounded'} + }) + nodeObj.position(node.position().x + node.getBBox().width + 50, node.position().y); + } + } + } + + + } + }, + initCells(){ + const startNode = this.graph.addNode({ + shape: 'image', + // imageUrl: require('/public/modelImg/' + item.imgPath + '.png'), + width: 60, + height: 60, + data: { + type: 'imageNodes', + dataId: '', + nodeType: 'start', + nodeTypeExt: '', + voteNum: '' + }, + attrs: { + image: { + 'xlink:href': '/modelImg/start.svg', + }, + text: { + text: 'start', + fontSize: 14, + refX: 0.5, + refY: '100%', + refY2: 4, + textAnchor: 'middle', + textVerticalAnchor: 'top', + }, + }, + ports: {...this.ports}, + }) + const dashedBox = this.graph.addNode({ + shape: 'image', + // imageUrl: require('/public/modelImg/' + item.imgPath + '.png'), + width: 170, + height: 90, + data: { + type: 'imageNodes', + dataId: '', + nodeType: 'dashedBox', + nodeTypeExt: '', + voteNum: '' + }, + attrs: { + image: { + 'xlink:href': '/modelImg/dashedBox.svg', + }, + text: { + text: 'dashedBox', + fontSize: 14, + refX: 0.5, + refY: '100%', + refY2: 4, + textAnchor: 'middle', + textVerticalAnchor: 'top', + }, + }, + ports: {...this.ports}, + }) + const endNode = this.graph.addNode({ + shape: 'image', + width: 60, + height: 60, + data: { + type: 'imageNodes', + dataId: '', + nodeType: 'end', + nodeTypeExt: '', + voteNum: '' + }, + attrs: { + image: { + 'xlink:href': '/modelImg/end.svg', + }, + text: { + text: 'end', + fontSize: 14, + refX: 0.5, + refY: '100%', + refY2: 4, + textAnchor: 'middle', + textVerticalAnchor: 'top', + }, + }, + ports: {...this.ports}, + }) + startNode.position(-600, 0); + dashedBox.position(0, (startNode.size().height - dashedBox.size().height) / 2); + endNode.position(600, 0); + this.graph.addEdge({ + source: {cell: startNode, port: 'right1'}, + target: {cell: dashedBox, port: 'left1'}, + router: {name: 'manhattan'}, + connector: {name: 'rounded'} + }) + this.graph.addEdge({ + source: {cell: dashedBox, port: 'right1'}, + target: {cell: endNode, port: 'left1'}, + router: {name: 'manhattan'}, + connector: {name: 'rounded'} + }) }, }, @@ -1258,32 +1326,40 @@ </script> <style> -#containerImg { - display: flex; - border: 1px solid #dfe3e8; - height:400px ; - width: 100% !important; -} + #containerImg { + display: flex; + border: 1px solid #dfe3e8; + height: 400px; + width: 100% !important; + } -.x6-graph-scroller.x6-graph-scroller-pannable { - width: 100% !important; -} + .x6-graph-scroller.x6-graph-scroller-pannable { + width: 100% !important; + } -#stencilImg { - width: 100%; - height: 100%; - position: relative; - border-right: 1px solid #dfe3e8; -} + #stencilImg { + width: 100%; + height: 100%; + position: relative; + border-right: 1px solid #dfe3e8; + } -.x6-widget-stencil { - position: relative; - height: 100%; -} + .x6-widget-stencil { + position: relative; + height: 100%; + } -.x6-widget-stencil-content { - position: relative; - height: 100%; -} + #stencilImg .x6-graph-svg-viewport { + height: 100%; + } + + .x6-widget-stencil-content { + position: relative; + height: calc(100% - 32px); + } + + #stencilImg .x6-widget-stencil.collapsable > .x6-widget-stencil-content { + top: 0 + } </style> -- Gitblit v1.9.1