Skip to content
b-topology.component.ts 6.72 KiB
Newer Older
wangqinghua's avatar
wangqinghua committed
import {AfterViewInit, Component, ElementRef, OnInit, ViewChild} from '@angular/core';
wangqinghua's avatar
wangqinghua committed
import {BusinessService} from '../business.service';
import {NzMessageService} from 'ng-zorro-antd';
wangqinghua's avatar
wangqinghua committed
import {ActivatedRoute, Router} from '@angular/router';
wangqinghua's avatar
wangqinghua committed

wangqinghua's avatar
wangqinghua committed
declare let editor: any;
wangqinghua's avatar
wangqinghua committed

@Component({
wangqinghua's avatar
wangqinghua committed
    selector: 'smart-b-topology',
    templateUrl: './b-topology.component.html',
    styles: [
wangqinghua's avatar
wangqinghua committed
            `
wangqinghua's avatar
wangqinghua committed
            .layui-side-scroll {
                width: initial;
            }

            .layui-layout-right {
                color: #666666;
            }

            .layui-header span {
                margin-right: 15px;
                cursor: pointer;
            }
wangqinghua's avatar
wangqinghua committed

            .header-bar {
wangqinghua's avatar
wangqinghua committed
                line-height: 60px;
                color: #6097b7;
                padding: 0 20px;
                background-color: #ddd;
            }
wangqinghua's avatar
wangqinghua committed

            .layui-layout-right {
wangqinghua's avatar
wangqinghua committed
                text-align: right;
                color: #6097b7
            }
wangqinghua's avatar
wangqinghua committed

            .layui-layout-right span {
wangqinghua's avatar
wangqinghua committed
                margin-right: 5px;
                cursor: pointer;
            }

            .tips {
                position: absolute;
                top: 10px;
                left: 20px;
                color: #ca0814;
                font-size: 20px;
            }

            .checkList {
                position: absolute;
                top: 10px;
                right: 20px;
                color: #666666;
                font-size: 20px;
            }
wangqinghua's avatar
wangqinghua committed

            .lineList {
wangqinghua's avatar
wangqinghua committed
                position: absolute;
                top: 5px;
                right: 20px;
                color: red;
                cursor: pointer;
            }

            .layui-form-label {
                width: 110px;
            }
wangqinghua's avatar
wangqinghua committed

            .loading {
wangqinghua's avatar
wangqinghua committed
                position: absolute;
                top: 30%;
                left: 49%;
            }
wangqinghua's avatar
wangqinghua committed

wangqinghua's avatar
wangqinghua committed
            .minus {
                vertical-align: middle;
                color: red;
                font-size: 15px;
                margin-left: 12px;
                cursor: pointer;
            }
        `
    ]
wangqinghua's avatar
wangqinghua committed
})
wangqinghua's avatar
wangqinghua committed
export class BTopologyComponent implements OnInit, AfterViewInit {
    @ViewChild('topologyCanvas') topologyCanvas: ElementRef;
    @ViewChild('topologyBody') topologyBody: ElementRef;
wangqinghua's avatar
wangqinghua committed

wangqinghua's avatar
wangqinghua committed
    topoId;
wangqinghua's avatar
wangqinghua committed
    name;
wangqinghua's avatar
wangqinghua committed
    isLoading = false;
    rootList;

wangqinghua's avatar
wangqinghua committed
    backgroundColor;
    editType = '只读模式';

wangqinghua's avatar
wangqinghua committed
    constructor(private busineSer: BusinessService, private message: NzMessageService,
wangqinghua's avatar
wangqinghua committed
                private routerInfo: ActivatedRoute) {
wangqinghua's avatar
wangqinghua committed
        this.routerInfo.queryParams.subscribe(
            (res) => {
wangqinghua's avatar
wangqinghua committed
                if (res) {
wangqinghua's avatar
wangqinghua committed
                    this.topoId = res.topoId;
                    if(this.topoId) this.getDetail();
wangqinghua's avatar
wangqinghua committed
                }
wangqinghua's avatar
wangqinghua committed
            }
        );
wangqinghua's avatar
wangqinghua committed
    }

    ngOnInit() {
        this.getList();
wangqinghua's avatar
wangqinghua committed
        this.topologyCanvas.nativeElement.style.background = '#fff';
wangqinghua's avatar
wangqinghua committed
    }

    ngAfterViewInit() {
        const canvasWidth = this.topologyBody.nativeElement.clientWidth;
        const canvasHeight = this.topologyBody.nativeElement.clientHeight;
        let myCanvas = this.topologyCanvas.nativeElement;
        let context = myCanvas.getContext('2d');
        let ratio = this.getPixelRatio(context);
        myCanvas.style.width = canvasWidth + 'px';
        myCanvas.style.height = canvasHeight + 'px';

        myCanvas.width = myCanvas.width * ratio;
        myCanvas.height = myCanvas.height * ratio;
        context.scale(ratio, ratio);
wangqinghua's avatar
wangqinghua committed
        // context.translate(-(canvasWidth/4),-(canvasHeight/4));
wangqinghua's avatar
wangqinghua committed
        editor.loadTopology('', '', 'img/backimg.png', canvasWidth, canvasHeight);
    }

    // 获取像素比
    getPixelRatio(context) {
        const backingStore = context.backingStorePixelRatio ||
            context.webkitBackingStorePixelRatio ||
            context.mozBackingStorePixelRatio ||
            context.msBackingStorePixelRatio ||
            context.oBackingStorePixelRatio ||
            context.backingStorePixelRatio || 1;
        return (window.devicePixelRatio || 1) / backingStore;
    }

    //选择线条类型
    changeLine(e) {
        switch (e) {
            case'1': {   //直线
                editor.lineType = 'line';
                break;
            }
            case'2': {   //折线(横向)
                editor.lineType = 'foldLine';
                editor.config.linkDirection = 'horizontal';
                break;
            }
            case'3': {  //折线(纵向)
                editor.lineType = 'foldLine';
                editor.config.linkDirection = 'vertical';
                break;
            }
            case'4': {   //二次折线(横向)
                editor.lineType = 'flexLine';
                editor.config.linkDirection = 'horizontal';
                break;
            }
            case'5': {   //二次折线(纵向)
                editor.lineType = 'flexLine';
                editor.config.linkDirection = 'vertical';
                break;
            }
        }
    }

    //改变背景色
    changeColor() {
        this.topologyCanvas.nativeElement.style.background = this.backgroundColor;
    }

    changeType() {
wangqinghua's avatar
wangqinghua committed
        editor.utils.editTopology();
wangqinghua's avatar
wangqinghua committed
        this.editType = '编辑模式';
wangqinghua's avatar
wangqinghua committed
    }

    //业务列表
    getList() {
        this.busineSer.findRoot().subscribe(
            (res) => {
                this.rootList = res.data;
            }
        );
    }

    //查找拓扑图
wangqinghua's avatar
wangqinghua committed
    getDetail() {
wangqinghua's avatar
wangqinghua committed
        this.isLoading = true;
        this.busineSer.serviceTopologyFind(this.topoId).subscribe(
wangqinghua's avatar
wangqinghua committed
            (res) => {
wangqinghua's avatar
wangqinghua committed
                if (res.errCode == 10000) {
                    if (res.data.json.length > 0) {
                        let json = JSON.parse(res.data.json);
wangqinghua's avatar
wangqinghua committed
                        if (json.topology) {
wangqinghua's avatar
wangqinghua committed
                            const topologyJson = JSON.parse(json.topology);
                            editor.loadTopologyByJson(topologyJson, 'img/backimg.png');
wangqinghua's avatar
wangqinghua committed
                        } else {
wangqinghua's avatar
wangqinghua committed
                            this.isLoading = false;
                            editor.utils.clearTopology();
                        }
                    } else {
                        this.isLoading = false;
                        editor.utils.clearTopology();
                    }
wangqinghua's avatar
wangqinghua committed
                    this.name = res.data.name;
wangqinghua's avatar
wangqinghua committed
                }
wangqinghua's avatar
wangqinghua committed
                this.isLoading = false;
wangqinghua's avatar
wangqinghua committed
            }
wangqinghua's avatar
wangqinghua committed
        );
wangqinghua's avatar
wangqinghua committed
    }
wangqinghua's avatar
wangqinghua committed

wangqinghua's avatar
wangqinghua committed
    //保存拓扑图
wangqinghua's avatar
wangqinghua committed
    saveTopo() {
wangqinghua's avatar
wangqinghua committed
        const json = {
            topology: editor.saveTopology(),
        };
wangqinghua's avatar
wangqinghua committed
        const data = {
wangqinghua's avatar
wangqinghua committed
            id: this.topoId,
wangqinghua's avatar
wangqinghua committed
            name: this.name,
wangqinghua's avatar
wangqinghua committed
            json: JSON.stringify(json),
wangqinghua's avatar
wangqinghua committed
        };
wangqinghua's avatar
wangqinghua committed
        this.busineSer.serviceTopologySave(data).subscribe(
wangqinghua's avatar
wangqinghua committed
            (res) => {
                if (res.errCode == 10000) {
                    this.message.success('保存成功');
wangqinghua's avatar
wangqinghua committed
                }
            }
wangqinghua's avatar
wangqinghua committed
        );
wangqinghua's avatar
wangqinghua committed
    }
wangqinghua's avatar
wangqinghua committed

}