financial-bigscreen/src_old/views/风险传导.vue
2024-11-14 15:27:41 +08:00

1260 lines
43 KiB
Vue
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<!-- 风险传导 -->
<template>
<div>
<!-- 加载容器-->
<!-- <div class="honeycomb" v-if="waitLoad"></div>-->
<el-button @click="drawer = true" type="primary" plain style="margin-left: 20px;">更多功能</el-button>
风险源:{{source}}
<el-drawer
title="风险传导条件查询"
:visible.sync="drawer"
:modal="false"
:show-close="true"
:with-header="false">
<p style="padding: 0; margin-top:5px; margin-left:12px;margin-bottom: 15px;font-size: 22px;">风险传导条件查询</p>
<el-form :inline="true">
<!-- 0主要查询 -->
<el-form-item label="风险类型:" style="padding: 0; margin: 1px;margin-left:12px ;font-weight: bold;">
<el-select v-model="riskSelect" placeholder="流动风险" size="mini">
<el-option label="流动风险" value="流动风险"></el-option>
<el-option label="市场风险" value="市场风险"></el-option>
<el-option label="经营风险" value="经营风险"></el-option>
<el-option label="信用风险" value="信用风险"></el-option>
<el-option label="资产负债风险" value="资产负债风险"></el-option>
<el-option label="获现风险" value="获现风险"></el-option>
</el-select>
</el-form-item>
<el-form-item label="传导范围:" style="padding: 0; margin: 1px;margin-left:12px ;font-weight: bold;">
<el-checkbox :indeterminate="isIndeterminate" v-model="checkAllRange" @change="handleCheckAllChange" style="display: flex-start;">全选</el-checkbox>
<el-checkbox-group v-model="checkedRanges" @change="handleCheckedRangesChange" style="display: flex-start;padding: 0;margin: 0 0px 0 1px">
<el-checkbox v-for="range in Ranges" :label="range" :key="range" >{{range}}</el-checkbox>
</el-checkbox-group>
</el-form-item>
<el-form-item label="选择时间:" prop="选择时间" style="padding: 0;margin: 0 0 0 12px;font-weight: bold;">
<el-date-picker v-model="date" type="date" placeholder="年/月/日" size="mini"> </el-date-picker>
</el-form-item>
<el-form-item style="padding: 0;margin: 0 0 0 12px;">
<el-button type="primary" plain size="mini" @click="onSubmit1" style="margin-left: 20px;">查询</el-button>
</el-form-item>
<el-dialog :visible.sync="dialogVisible2" width="100%" >弹窗2
</el-dialog>
<el-divider content-position="left"></el-divider>
</el-form>
</el-drawer>
<!--渲染容器-->
<div class="graph" ref="graph" id="graph" ></div>
<!-- 表格-->
<el-dialog :visible.sync="dialogVisible1" :modal="false" width="100%" >
<el-table style="width: 100%" border :data="currentData.slice((currentPage-1)*pageSize,currentPage*pageSize)" empty-text="暂无数据" >
<el-table-column
type="index"
width="40">
</el-table-column>
<el-table-column
prop="name"
label="名称"
width="200">
</el-table-column>
<el-table-column
prop="val"
label="风险值"
width="200">
</el-table-column>
</el-table>
<!-- 分页-->
<div class="block" style="margin-top:15px;" >
<el-pagination align='center' @size-change="handleSizeChange" @current-change="handleCurrentChange"
:current-page="currentPage"
:page-size="pageSize"
layout="total, sizes, prev, pager, next, jumper"
:total="currentData.length">
</el-pagination>
</div>
</el-dialog>
<!-- 步骤条-->
<el-steps :active="active" finish-status="success" v-if="showStep">
<el-step v-for="(s,index) in steps" :key="index" :title="s.title"></el-step>
<!-- <el-step title="步骤 2"></el-step>-->
<!-- <el-step title="步骤 3"></el-step>-->
</el-steps>
<!-- <el-button style="margin-top: 12px;" @click="next" icon="el-cion-right">下一步</el-button>-->
<!-- <el-form :inline="true">-->
<div class="button-container">
<button class="flashButton" @click="next">下一步</button>
<div class="toggle-cont">
<input class="toggle-input"
id="toggle"
name="toggle"
type="checkbox"
v-model="dispalyInfect" />
<label class="toggle-label" for="toggle">
<div class="cont-label-play">
<span class="label-play"></span>
</div>
</label>
</div>
<!-- <el-form-item style="padding: 0; margin: 10px 0 0 12px;">-->
<el-button type="primary" round @click="dialogVisible1 = true" class="button button-right" >当前步的风险节点</el-button>
<!-- <el-button type="text" @click="dialogVisible2 = true" style="margin-left:20px">风险源</el-button>-->
<!-- </el-form-item>-->
</div>
</div>
</template>
<script>
import {Loading} from "element-ui";
import http from "@/utils/request";
import cytoscape from 'cytoscape'
import expandCollapse from "cytoscape-expand-collapse";
import euler from "cytoscape-euler";
const rangeOptions = ['股东', '流通股东', '股权质押', '担保', '格兰杰因果关系'];
export default {
components: {},
data() {
return {
currentPage: 1, // 当前页码
total: 20, // 总条数
pageSize: 10, // 每页的数据条数
activityData:[],
source:'',
currentData:'',
clock:undefined,
dispalyInfect:false,
table_datas:[],
showStep:false,
active:0,
waitLoad:false,
elements_data: { 'nodes': [], 'edges': [] },
step: 0,
intervalId: null,
warningString:'',
// 控制抽屉是否展开
drawer: false,
riskSelect: '',
conductionRange: '',
// 多选框-传导范围
checkAllRange: false,
checkedRanges: [],
Ranges: rangeOptions,
isIndeterminate: true,//用以表示 checkbox 的不确定状态,一般用于实现全选的效果
// 时间
date: '',
// 弹窗
dialogVisible1: false,
dialogVisible2: false,
}
},
watch:{
dispalyInfect(newValue){
if (newValue===true){
this.$message.info('开始播放')
//开始播放
this.clock=setInterval(this.next,3000)
}
if(newValue===false){
this.$message.info('暂停播放')
clearInterval(this.clock)
}
},
$route: {
handler: function(old) {
if (Object.keys(old.params).length>0){
this.sent(old.params.name,old.params.type,'股东,流通股东,股权质押,担保,格兰杰因果关系',old.params.date)
this.source=old.params.name
}
},
immediate: true
},
// step(newValue){
// this.currentData=this.table_datas[this.step]
//
// }
},
beforeDestroy() {
clearInterval(this.clock)
//需要清除
},
computed: {
// step改变才会触发steps的计算属性
steps() {
const result = [];
for (let i = 1; i <= this.step; i++) {
result.push({
title: '第' + i + '阶段'
});
}
return result;
}
},
mounted() {
this.initGraph()
},
methods: {
handleSizeChange(val) {
console.log(`每页 ${val}`);
this.currentPage = 1;
this.pageSize = val;
},
//当前页改变时触发 跳转其他页
handleCurrentChange(val) {
console.log(`当前页: ${val}`);
this.currentPage = val;
},
next() {
if (this.active=== this.step) {
this.active = 0; //回零 ++优先级高与>
//初始状态
//点击每一个阶段
//代表不同的感染程度? //只有最后一个阶段才会出现,前面都是感染节点
this.$cy.nodes().removeClass('cr_node');
this.$cy.nodes().removeClass('cr_node25');
this.$cy.nodes().removeClass('cr_node50');
this.$cy.nodes().removeClass('cr_node75');
this.$cy.nodes().removeClass('cr_node100');
}
// var index = $(this).index('.step-icon-txt');
this.currentData = this.table_datas[this.active]; //这一阶段的传染节点 和table_datas的下标相对应
// console.log(cr_data)
// console.log(this.active)
//对最后一阶段的节点权重进行排序
// let last_index = $('.step-icon-txt').length - 1;
let last_data = this.table_datas[this.step-1];
last_data.sort(function (a, b) {
return (a['val'] - b['val'])
});
let l = last_data.length;
let s25 = last_data.slice(0, parseInt(l * 0.25)),
s50 = last_data.slice(parseInt(l * 0.25), parseInt(l * 0.5)),
s75 = last_data.slice(parseInt(l * 0.5), parseInt(l * 0.75)),
s100 = last_data.slice(parseInt(l * 0.75), l);
if (this.active < this.step-1) {
for (let i = 0; i < this.currentData.length; i++) {
let name = this.currentData[i]['name'];
this.$cy.nodes().filter(function (element, i) {
return element.data('name') === name
}).addClass('cr_node')
}
} else
{
//最后阶段
for (let i = 0; i < s25.length; i++) {
let name = s25[i]['name'];
this.$cy.nodes().filter(function (element, i) {
return element.data('name') === name
}).addClass('cr_node25')
}
for (let i = 0; i < s50.length; i++) {
let name = s50[i]['name'];
this.$cy.nodes().filter(function (element, i) {
return element.data('name') === name
}).addClass('cr_node50')
}
for (let i = 0; i < s75.length; i++) {
let name = s75[i]['name'];
this.$cy.nodes().filter(function (element, i) {
return element.data('name') === name
}).addClass('cr_node75')
}
for (let i = 0; i < s100.length; i++) {
let name = s100[i]['name'];
this.$cy.nodes().filter(function (element, i) {
return element.data('name') === name
}).addClass('cr_node100')
}
}
this.active++
//这里源代码是根据的点击阶段改变了表格展现的数据
// //表格
// var tableData = [];
// // for(var h=0;h<=index;h++)
// // {
// var con = '';
// var dd = table_datas[index];
// dd.sort(function (a, b) {
// return (b['val'] - a['val'])
// })
// for (var i = 0; i < dd.length; i++) {
// con += (dd[i]['name'] + '' + dd[i]['val'] + '\n');
// }
//
// var d1 = {
// jd: index + 1,
// cons: con
// }
// tableData.push(d1)
// }
// $("#info_table").bootstrapTable('destroy');
// $('#info_table').bootstrapTable({
// data: tableData,
// toolbar: '#toolbar1', //工具按钮用哪个容器
// striped: true, //是否显示行间隔色
// cache: false, //是否使用缓存默认为true所以一般情况下需要设置一下这个属性*
// pagination: true, //是否显示分页(*
// sortable: false, //是否启用排序
// sortOrder: "asc", //排序方式
// locale: "zh-CN", //表格汉化
// // queryParams: oTableInit.queryParams,//传递参数(*
// sidePagination: "client", //分页方式client客户端分页server服务端分页*
// pageNumber: 1, //初始化加载第一页,默认第一页
// pageSize: 10, //每页的记录行数(*
// pageList: [10, 25, 50, 100], //可供选择的每页的行数(*
// clickToSelect: true,
// showExport: true, //是否显示导出
// // exportDataType: $(this).val(),
// exportDataType: "all", //basic', 'all', 'selected'.
// columns: [
// {
// field: 'jd',
// title: '阶段'
// }, {
// field: 'cons',
// title: '详细信息(公司名称:风险值)'
// }]
// });
// $('#info_table').bootstrapTable('hideLoading');
},
initGraph(){
if (!cytoscape().expandCollapse) {
cytoscape.use(expandCollapse)
}
if (!cytoscape().euler) {
cytoscape.use(euler)
}
this.$cy = cytoscape({
container: document.getElementById('graph'),
// ready: function () {
// var api = this.expandCollapse({
// layoutBy: {
// name: 'euler',
// randomize: true,
// animate: false
// },
// fisheye: true,
// animate: false,
// ready: function () { },
// undoable: false,
// randomize: false,
//
// cueEnabled: true, // Whether cues are enabled
// expandCollapseCueSize: 12, // size of expand-collapse cue
// expandCollapseCueLineSize: 8, // size of lines used for drawing plus-minus icons
// expandCueImage: undefined, // image of expand icon if undefined draw regular expand cue
// collapseCueImage: undefined, // image of collapse icon if undefined draw regular collapse cue
// expandCollapseCueSensitivity: 1, // sensitivity of expand-collapse cues
// allowNestedEdgeCollapse: false
// });
//api.collapseAll();
// },
style: cytoscape.stylesheet()
.selector('node[label = "公司"]') //定义节点的样式
.css({ 'background-color': '#d71345' })
.selector('node[label = "上市公司"]')
.css({ 'background-color': '#ef4136' }) //'shape':'triangle'
.selector('node[label = "上市公司-实体企业"]')
.css({ 'background-color': '#FF1493' })
.selector('node[label = "上市公司-金融机构"]')
.css({ 'background-color': '#C71585' })
.selector('node[label = "上市公司-金融机构-银行"]')
.css({ 'background-color': '#f8aba6' })
.selector('node[label = "上市公司-金融机构-证券"]')
.css({ 'background-color': '#f05b72' })
.selector('node[label = "上市公司-金融机构-保险"]')
.css({ 'background-color': '#d93a49' })
.selector('node[label = "上市公司-金融机构-信托"]')
.css({ 'background-color': '#FF69B4' })
.selector('node[label = "上市公司-金融机构-基金"]')
.css({ 'background-color': '#DB7093' })
.selector('node[label = "上市公司-金融机构-基金-公募基金"]')
.css({ 'background-color': '#FFB6C1' })
.selector('node[label = "上市公司-金融机构-基金-私募基金"]')
.css({ 'background-color': '#FFC0CB' })
.selector('node[label = "上市公司-金融机构-其他金融机构"]')
.css({ 'background-color': '#D8BFD8' })
.selector('node[label = "非上市公司"]')
.css({ 'background-color': '#102b6a' })
.selector('node[label = "非上市公司-实体企业"]')
.css({ 'background-color': '#224b8f' })
.selector('node[label = "非上市公司-金融机构"]')
.css({ 'background-color': '#2a5caa' })
.selector('node[label = "非上市公司-金融机构-银行"]')
.css({ 'background-color': '#2b4490' })
.selector('node[label = "非上市公司-金融机构-证券"]')
.css({ 'background-color': '#426ab3' })
.selector('node[label = "非上市公司-金融机构-保险"]')
.css({ 'background-color': '#0072E3' })
.selector('node[label = "非上市公司-金融机构-信托"]')
.css({ 'background-color': '#0080FF' })
.selector('node[label = "非上市公司-金融机构-基金"]')
.css({ 'background-color': '#46A3FF' })
.selector('node[label = "非上市公司-金融机构-基金-公募基金"]')
.css({ 'background-color': '#66B3FF' })
.selector('node[label = "非上市公司-金融机构-基金-私募基金"]')
.css({ 'background-color': '#84C1FF' })
.selector('node[label = "非上市公司-金融机构-其他金融机构"]')
.css({ 'background-color': '#97CBFF' })
.selector('node[label = "人物"]')
.css({ 'background-color': '#e0861a' })
.selector('node[label = "人物-普通人物"]')
.css({ 'background-color': '#fcaf17' })
.selector('node[label = "人物-基金经理"]')
.css({ 'background-color': '#faa755' })
.selector('node[label = "人物-投资经理"]')
.css({ 'background-color': '#f58220' })
.selector('node[label = "机构-国务院国有资产监督管理委员会"]')
.css({ 'background-color': '#2e3a1f' })
.selector('node[label = "监管机构"]')
.css({ 'background-color': '#1d953f' })
.selector('node[label = "监管机构-银保监会(局)"]')
.css({ 'background-color': '#78a355' })
.selector('node[label = "监管机构-证监会(局)"]')
.css({ 'background-color': '#7fb80e' })
.selector('node[label = "监管机构-人民银行(分行)"]')
.css({ 'background-color': '#78a355' })
.selector('node[label = "监管机构-食药监局"]')
.css({ 'background-color': '#abc88b' })
.selector('node[label = "监管机构-网信"]')
.css({ 'background-color': '#45b97c' })
.selector('node[label = "监管机构-工信"]')
.css({ 'background-color': '#007d65' })
.selector('node[label = "监管机构-行业协会"]')
.css({ 'background-color': '#40835e' })
.selector('node[label = "交易所"]')
.css({ 'background-color': '#3e4145' })
.selector('node[label = "板块"]')
.css({ 'background-color': '#563624' })
.selector('node[label = "地点"]')
.css({ 'background-color': '#2468a2' })
.selector('node[label = "地点-国家"]')
.css({ 'background-color': '#228fbd' })
.selector('node[label = "地点-省"]')
.css({ 'background-color': '#33a3dc' })
.selector('node[label = "地点-县/区"]')
.css({ 'background-color': '#7bbfea' })
.selector('node[label = "地点-市"]')
.css({ 'background-color': '#90d7ec' })
.selector('node[label = "行业"]')
.css({ 'background-color': '#2e3a1f' })
.selector('node[label = "行业-门类"]')
.css({ 'background-color': '#454926' })
.selector('node[label = "行业-大类"]')
.css({ 'background-color': '#726930' })
.selector('node[label = "行业-中类"]')
.css({ 'background-color': '#4d4f36' })
.selector('node[label = "产品"]')
.css({ 'background-color': '#494e8f' })
.selector('node[label = "产品-一般产品"]')
.css({ 'background-color': '#585eaa' })
.selector('node[label = "产品-服务产品"]')
.css({ 'background-color': '#6a6da9' })
.selector('node[label = "产品-金融产品"]')
.css({ 'background-color': '#6950a1' })
.selector('node[label = "产品-金融产品-股票"]')
.css({ 'background-color': '#6f60aa' })
.selector('node[label = "产品-金融产品-债券"]')
.css({ 'background-color': '#6f599c' })
.selector('node[label = "产品-金融产品-基金"]')
.css({ 'background-color': '#9b95c9' })
.selector('node[label = "产品-金融产品-基金--公募"]')
.css({ 'background-color': '#afb4db' })
.selector('node[label = "产品-金融产品-基金--私募"]')
.css({ 'background-color': '#C7C7E2' })
.selector('node[label = "产品-金融产品-基金--REITS"]')
.css({ 'background-color': '#867892' })
.selector('node[label = "产品-金融产品-信托"]')
.css({ 'background-color': '#918597' })
.selector('node[label = "产品-金融产品-其他"]')
.css({ 'background-color': '#6f6d85' })
.selector('node[label = "学校"]')
.css({ 'background-color': '#ffd400' })
.selector('node[label = "非上市公司其他公司"]')
.css({ 'background-color': '#cbc547' })
.selector('node[label = "未知"]')
.css({ 'background-color': '#d9d6c3' })
// .selector('node.cy-expand-collapse-collapsed-node')
// .style({
// "background-color": "darkblue",
// "shape": "rectangle"
// })
.selector(':parent')
.style({
'background-opacity': 0.1,
'border-width': .001
})
.selector('node')
.style({
'color': '#999999', //定义节点标签颜色
'background-opacity': 1,
'font-size': '5px',
'width': '17px',
'height': '17px',
})
.selector('edge') //定义边的样式
.style({
//'label': 'data(relationship)',
'target-arrow-shape': 'triangle-backcurve', /*箭头样式*/
'target-arrow-size': '0.1px', /*箭头大小*/
'target-arrow-color': '#8B8989', /*箭头颜色*/
'curve-style': 'bezier', /*线条样式曲线*/
'line-color': '#8B8989', /*线条颜色*/
'width': '2px', /*线条宽度*/
'font-size': '6px', /*标签字体大小*/
'color': '#999999', /*标签字体大小*/
'text-outline-color': 'white', /*文本轮廓颜色*/
'text-outline-width': '1px', /*文本轮廓宽度*/
'text-rotation': 'autorotate', /*标签方向*/
})
.selector('edge.cy-expand-collapse-collapsed-edge')
.style(
{
"text-outline-color": "#ffffff",
"text-outline-width": "1px",
'label': (e) => {
return '(' + e.data('collapsedEdges').length + ')';
},
'width': function (edge) {
const n = edge.data('collapsedEdges').length;
return (1 + Math.log2(n)) + 'px';
},
//'line-opacity':1,
'line-style': 'dashed',
'line-color': this.setColor4CompoundEdge,
'target-arrow-color': this.setColor4CompoundEdge,
'target-arrow-shape': this.setTargetArrowShape,
'source-arrow-shape':this.setSourceArrowShape,
'source-arrow-color': this.setColor4CompoundEdge,
})
.selector('node:selected')
.style({ 'border-color': '#c84e40', 'border-width': "1px", })
.selector('.search_node')
.style({ 'border-color': '#c84e40', 'border-width': "2px", })
.selector('.key_node')
.style({
'background-color': 'red',
'width': 30,
'height': 30,
shape: 'polygon',
'shape-polygon-points': '0 1, 0.8660254037844386 0.5, 0.8660254037844386 -0.5, 0 -1, -0.8660254037844386 -0.5, -0.8660254037844386 0.5',
animation: true,
duration: 1000
})
.selector('.cr_node')
.css({
'background-color': '#f05b72', //定义节点标签颜色
})
.selector('.cr_edge')
.style({
'target-arrow-color': '#f05b72', /*箭头颜色*/
'line-color': '#f05b72' /*线条颜色*/
})
.selector('.cr_node25')
.css({
'background-color': '#45b97c', //定义节点标签颜色
})
.selector('.cr_node50')
.css({
'background-color': '#ffc20e',
})
.selector('.cr_node75')
.css({
'background-color': '#f58220',
})
.selector('.cr_node100')
.css({
'background-color': '#b22c46', //最严重
})
.selector('edge:selected')
.style({
'color': '#3165fc', /*标签字体大小*/
'target-arrow-color': '#61bffc', /*箭头颜色*/
'line-color': '#61bffc', /*线条颜色*/
// 'width':'2px',
})
.selector('.xianshi_label_edge')
.style({
'label': 'data(relationship)',
})
.selector('.xianshi_name_node')
.style({
'content': 'data(name)',
})
.selector('.mouse_xianshi_name_node') //鼠标 显示
.style({
'content': 'data(name)',
'font-size': '15px',
'color': '#d71345',
})
.selector('.mouse_xianshi_label_edge') //显示边
.style({
'label': 'data(relationship)',
'font-size': '15px',
'color': '#d71345',
})
.selector('.light-off') //高亮样式
.style({ 'opacity': '0.1', }) //opacity: 透明度
.selector('.highlighted')
.style({
'background-color': '#65c294',
'line-color': '#d71345',
'target-arrow-color': '#d71345',
'transition-property': 'background-color, line-color, target-arrow-color',
'transition-duration': '0.5s',
// 'width': '2px'
})
.selector('.hbnode')
.style({
'label': '合并节点',
'background-color': '#000080', //定义节点标签颜色
'background-opacity': 0.8,
'font-size': '20px',
'width': '30px',
'height': '30px',
})
// .selector('.keynodes')
// .style({'border-color': '#1d953f', 'border-width': "1px",})
.selector('.hbnodes_edge')
.style({
'target-arrow-color': '#ffd400', /*箭头颜色*/
'line-color': '#ffd400', /*线条颜色*/
'width': '2px',
}),
elements: this.elements_data,
layout: {
name: 'breadthfirst',
directed: true,
padding: 30,
}, //可选:'breadthfirst', 'circle', 'concentric', 'cose', 'grid','null', 'preset', 'random'
zoom: 1,
pan: { x: 0, y: 0 },
minZoom: 1e-10,
maxZoom: 1e10,
zoomingEnabled: true, // 是否通过用户事件和编程方式启用缩放图形.
userZoomingEnabled: true, // 是否允许用户事件(例如鼠标滚轮,捏合缩放)缩放图形.对此缩放的编程更改不受此选项的影响.
panningEnabled: true, // 是否通过用户事件和编程方式启用平移图形.
userPanningEnabled: true, // 是否允许用户事件(例如拖动图形背景)平移图形.平移的程序化更改不受此选项的影响.
boxSelectionEnabled: true,
wheelSensitivity: 0.3, //缩放时更改滚轮灵敏度.这是一个乘法修饰符.因此,0到1之间的值会降低灵敏度(变焦较慢),而大于1的值会增加灵敏度(变焦更快).
multiselectionEnabled: true,
//selectionType:"additive",
touchTapThreshold: 8,
desktopTapThreshold: 4,
hideEdgesOnViewport: true,
// textureOnViewport: true
});
},
getRandomColor() {
var r = Math.floor(Math.random() * 256);
var g = Math.floor(Math.random() * 256);
var b = Math.floor(Math.random() * 256);
if (r === 255 && g === 255 && b === 255)
this.getRandomColor();
else
return "rgb(" + r + ',' + g + ',' + b + ")";
},
doElemsMultiTypes(elems) {
const classDict = {};
for (let i = 0; i < elems.length; i++) {
classDict[elems[i].data('edgeType')] = true;
}
return Object.keys(classDict).length > 1;
},
setColor4CompoundEdge(e) {
const collapsedEdges = e.data('collapsedEdges');
if (this.doElemsMultiTypes(collapsedEdges)) {
return '#b3b3b3';
}
return collapsedEdges[0].style('line-color')
},
setTargetArrowShape(e) {
const collapsedEdges = e.data('collapsedEdges');
const shapes = {};
for (let i = 0; i < collapsedEdges.length; i++) {
shapes[collapsedEdges[0].style('target-arrow-shape')] = true;
}
delete shapes['none'];
if (Object.keys(shapes).length < 1) {
if (collapsedEdges.sources().length > 1) {
return collapsedEdges[0].style('source-arrow-shape');
}
return 'none';
}
return Object.keys(shapes)[0];
},
setSourceArrowShape(e) {
const collapsedEdges = e.data('collapsedEdges');
const shapes = {};
for (let i = 0; i < collapsedEdges.length; i++) {
shapes[collapsedEdges[0].style('source-arrow-shape')] = true;
}
delete shapes['none'];
if (Object.keys(shapes).length < 1) {
if (collapsedEdges.sources().length > 1) {
return collapsedEdges[0].style('target-arrow-shape');
}
return 'none';
}
return Object.keys(shapes)[0];
},
sent(code, fxlxValue, cdfw_str, time_input) {
this.currentData=''
this.table_datas=''
let that=this
console.log(cdfw_str)
let options={
text:'请稍等'
}
let loadingInstance = Loading.service(options);
http.get('/risk_model/risk_diff/'
,{params:{
type:fxlxValue,
range:cdfw_str,
date:time_input,
code:code,
}}
).then((res)=>{
this.source=res.data.source
this.initGraph()
this.$cy.elements().remove();
let get_data=res
// $("#info_table").bootstrapTable('destroy');
// $('.glyphicon-exclamation-sign').css('display','block').html('(' + get_data['data']['method'] + ')' + '当前风险源:' + get_data['data']['source']);
// $('.glyphicon-exclamation-sign').css('display', 'block').html(fxlxValue + '-' + '风险源(由' + get_data['data']['method'].slice(0, 2) + '数据筛选)' + get_data['data']['source']);
this.warningString=fxlxValue + '-' + '风险源(由' + get_data['data']['method'].slice(0, 2) + '数据筛选)' + get_data['data']['source']
this.waitLoad=false
if (get_data['data']['method'] === '财务报表') {
// document.getElementById('a1').innerText = '(财务报表) 当前风险源:' + get_data['data']['source'];
// document.getElementById('a1').innerText = fxlxValue + '-' + '风险源(由财务数据筛选)' + get_data['data']['source'];
this.$message({
showClose: true,
message: this.warningString,
type: 'success',
duration:5000,
});
}
let net_datas = get_data['data']['net'];
this.table_datas = get_data['data']['table'];
// let stepTitles = [];
this.step=net_datas.length
this.showStep=true
for (let i = 0; i < net_datas.length; i++) {
let info = {"nodes": net_datas[i]['nodes'], "edges": net_datas[i]['edges']}
this.$cy.add(info);
// stepTitles.push('第' + (i + 1) + '阶段');
// time_div_cons += '<span data-time='+ i +'> </span>';
}
// $('.box').html("")
// $('.box').step({
// stepDirection: 'x',
// showStepButton: true,
// stepCount: stepTitles.length,
// stepTitles: stepTitles,
// });
// var tableData = [];
//
// var con = '';
// var dd = table_datas[0];
// //dd是源信息 格式如下[
// // {
// // "name": "深圳市天健(集团)股份有限公司",
// // "val": 996055135.6
// // }
// // ],
// dd.sort(function (a, b) {
// return (b['val'] - a['val'])
// })
// for (let i = 0; i < dd.length; i++) {
// con += (dd[i]['name'] + '' + dd[i]['val'] + '\n');
// }
//
// var d1 = {
// jd: 1,
// cons: con
// }
// tableData.push(d1)
// }
// $("#info_table").bootstrapTable('destroy');
// $('#info_table').bootstrapTable({
// data: tableData,
// toolbar: '#toolbar1', //工具按钮用哪个容器
// striped: true, //是否显示行间隔色
// cache: false, //是否使用缓存默认为true所以一般情况下需要设置一下这个属性*
// pagination: true, //是否显示分页(*
// sortable: false, //是否启用排序
// sortOrder: "asc", //排序方式
// locale: "zh-CN", //表格汉化
// // queryParams: oTableInit.queryParams,//传递参数(*
// sidePagination: "client", //分页方式client客户端分页server服务端分页*
// pageNumber: 1, //初始化加载第一页,默认第一页
// pageSize: 10, //每页的记录行数(*
// pageList: [10, 25, 50, 100], //可供选择的每页的行数(*
// clickToSelect: true,
// showExport: true, //是否显示导出
// // exportDataType: $(this).val(),
// exportDataType: "all", //basic', 'all', 'selected'.
// columns: [
// {
// field: 'jd',
// title: '阶段'
// }, {
// field: 'cons',
// title: '详细信息(公司名称:风险值)'
// }]
// });
// $('#info_table').bootstrapTable('hideLoading');
const layout = this.$cy.layout({
name: 'euler',
randomize: true,
animate: false,
});
layout.run();
this.$cy.nodes().filter(function (element, i) {
return element.data('name') === that.table_datas[0][0]['name']
}).addClass('cr_node') //传染节点
// document.getElementById('fade').style.display = 'none';
// document.getElementById('light').style.display = 'none';
// $("#light_a").attr("disabled", false).css("pointer-events", "auto");
loadingInstance.close()
}).finally(()=>
loadingInstance.close()
)
},
// 多选框-传导范围
handleCheckAllChange(val) {
this.checkedRanges = val ? rangeOptions : [];
this.isIndeterminate = false;
},
handleCheckedRangesChange(value) {
let checkedCount = value.length;
this.checkAllRange = checkedCount === this.Ranges.length;
this.isIndeterminate = checkedCount > 0 && checkedCount < this.Ranges.length;
},
// 查询
onSubmit1() {
// var fxlx = document.querySelector("#fxlx");
// var fxlxIndex = fxlx.selectedIndex;
// var fxlxValue = fxlx.options[fxlxIndex].value; //风险类型
// var cdfw = $(".cdfw_label");
var cdfw_str = '';
for (var i = 0; i < this.checkedRanges.length; i++) {
// if (this.checkedRanges[i].checked) {
cdfw_str += this.checkedRanges[i] + ","
// }
} //传导范围 cdfw_str
// cdfw_str += cdfw[cdfw.length-1].value
cdfw_str = cdfw_str.substr(cdfw_str.length - 1, 1) === ',' ? cdfw_str.substr(0, cdfw_str.length - 1) : cdfw_str;
console.log(cdfw_str)
// var time_input = $("#time_input").val(); //选择的时间
if (this.date === '' || this.riskSelect === "" ||this.checkedRanges===[] ) {
alert("请检查时间、传导范围和风险类型!")
}
else {
// let options = {
// text: '请稍等'
// }
// let loadingInstance = Loading.service(options);
this.waitLoad=true
http.get('/risk_model/risk_gg/',{params: {
date:this.date ,
wh: this.riskSelect,
}
}).then((res) => {
// console.log(get_data.code,'llllllllllllll')
let get_data=res.data
// let str = '';
// for(let key in get_data.data) {
// str += `<a>${key} ${get_data.data[key].join(', ')}</a><br>`;
// }
let ks = Object.keys(get_data.data)
// if (ks.length == 0)
// console.log(typeof (get_data.data))
if (typeof get_data.data === "string") {
// 无个股事件
// document.getElementById('light').style.display = 'none';
// document.getElementById('fade').innerText = "正在加载数据";
// document.getElementById('a1').innerText = '(财务报表)当前风险源:' + get_data.data;
//
// document.getElementById('a1').innerText = fxlxValue + '-' + '风险源(由财务数据筛选)' + get_data.data;
// document.getElementById('a2').innerText = '';
// document.getElementById('a3').innerText = '';
} else {
// document.getElementById('a1').innerText = ks[0] + get_data.data[ks[0]];
// document.getElementById('a2').innerText = ks[1] + get_data.data[ks[1]];
// document.getElementById('a3').innerText = ks[2] + get_data.data[ks[2]];
}
// $("#light_a").attr("disabled", true).css("pointer-events", "none");
// document.getElementById('light').innerText = str;
// setTimeout(function () {
// document.getElementById('fade').style.display = 'none';
// document.getElementById('light').style.display = 'none';
// }, 1500)
console.log(get_data.code, this.riskSelect, cdfw_str, this.date)
this.sent(get_data.code, this.riskSelect, cdfw_str, this.date);
// loadingInstance.close()
// sent(fxlxValue, cdfw_str, time_input);
}).catch((e)=>{
this.waitLoad=false
alert(e)}
)
}
},
}
}
</script>
<style lang='less' scoped>
.graph {
/*//margin-left: -800px;*/
/* transform: translate(0,0);*/
height: 700px;
/*width: */
}
.toggle-cont {
width: 100px;
height: 50px;
border-radius: 9999px;
}
.toggle-cont .toggle-input {
display: none;
}
.toggle-cont .toggle-label {
cursor: pointer;
position: relative;
display: inline-block;
padding: 6px;
width: 100%;
height: 100%;
background: #d0f3cb;
border-radius: 9999px;
box-sizing: content-box;
box-shadow: 0px 0px 16px -8px #fefefe;
}
.toggle-cont .toggle-label .cont-label-play {
position: relative;
width: 50px;
aspect-ratio: 1 / 1;
background: rgb(75, 229, 70);
border-radius: 9999px;
transition: all 0.5s cubic-bezier(1, 0, 0, 1);
}
.toggle-cont .toggle-input:checked + .toggle-label .cont-label-play {
background: #f43f5e;
transform: translateX(50px);
}
.toggle-cont .toggle-label .label-play {
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
display: inline-block;
width: 24px;
aspect-ratio: 1 / 1;
background: #fefefe;
border-radius: 4px;
clip-path: polygon(25% 0, 75% 50%, 25% 100%, 25% 51%);
transition: all 0.5s cubic-bezier(1, 0, 0, 1);
}
.toggle-cont .toggle-input:checked + .toggle-label .label-play {
width: 20px;
clip-path: polygon(0 0, 100% 0, 100% 100%, 0 100%);
}
//input:checked ~ .slider {
// background-color: #f6cfb5;
//}
.button-container {
display: flex;
align-items: center; /* 垂直居中 */
}
.button-right {
margin-right: 0;
margin-left: auto;
}
.flashButton {
margin-right: 10px;
padding: 13px 20px;
border-radius: 30px;
cursor: pointer;
border: 0;
background-color: white;
box-shadow: rgb(0 0 0 / 5%) 0 0 8px;
letter-spacing: 1.5px;
text-transform: uppercase;
font-size: 15px;
transition: all 0.5s ease;
}
.flashButton:hover {
letter-spacing: 3px;
background-color: hsl(150deg 80% 48%);
color: hsl(0, 0%, 100%);
box-shadow: rgb(150 220 170) 0px 7px 29px 0px;
}
.flashButton:active {
letter-spacing: 3px;
background-color: hsl(150deg 80% 48%);
color: hsl(0, 0%, 100%);
box-shadow: rgb(150 220 170) 0px 0px 0px 0px;
transform: translateY(4px);
transition: 100ms;
}
.grayish_btn{//浅灰色按钮
color: #fff;//文字颜色
background-color: #aaaaaa;//背景颜色
}
@-webkit-keyframes honeycomb {
0%,
20%,
80%,
100% {
opacity: 0;
-webkit-transform: scale(0);
transform: scale(0);
}
30%,
70% {
opacity: 1;
-webkit-transform: scale(1);
transform: scale(1);
}
}
@keyframes honeycomb {
0%,
20%,
80%,
100% {
opacity: 0;
-webkit-transform: scale(0);
transform: scale(0);
}
30%,
70% {
opacity: 1;
-webkit-transform: scale(1);
transform: scale(1);
}
}
.honeycomb {
height: 24px;
position: relative;
width: 24px;
}
.honeycomb div {
-webkit-animation: honeycomb 2.1s infinite backwards;
animation: honeycomb 2.1s infinite backwards;
background: #f3f3f3;
height: 12px;
margin-top: 6px;
position: absolute;
width: 24px;
}
.honeycomb div:after, .honeycomb div:before {
content: '';
border-left: 12px solid transparent;
border-right: 12px solid transparent;
position: absolute;
left: 0;
right: 0;
}
.honeycomb div:after {
top: -6px;
border-bottom: 6px solid #f3f3f3;
}
.honeycomb div:before {
bottom: -6px;
border-top: 6px solid #f3f3f3;
}
.honeycomb div:nth-child(1) {
-webkit-animation-delay: 0s;
animation-delay: 0s;
left: -28px;
top: 0;
}
.honeycomb div:nth-child(2) {
-webkit-animation-delay: 0.1s;
animation-delay: 0.1s;
left: -14px;
top: 22px;
}
.honeycomb div:nth-child(3) {
-webkit-animation-delay: 0.2s;
animation-delay: 0.2s;
left: 14px;
top: 22px;
}
.honeycomb div:nth-child(4) {
-webkit-animation-delay: 0.3s;
animation-delay: 0.3s;
left: 28px;
top: 0;
}
.honeycomb div:nth-child(5) {
-webkit-animation-delay: 0.4s;
animation-delay: 0.4s;
left: 14px;
top: -22px;
}
.honeycomb div:nth-child(6) {
-webkit-animation-delay: 0.5s;
animation-delay: 0.5s;
left: -14px;
top: -22px;
}
.honeycomb div:nth-child(7) {
-webkit-animation-delay: 0.6s;
animation-delay: 0.6s;
left: 0;
top: 0;
}
</style>