网格大屏
This commit is contained in:
@@ -17,8 +17,15 @@
|
|||||||
</el-tree>
|
</el-tree>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="middle" v-loading="isLoading" element-loading-background="rgba(0, 0, 0, 0.5)">
|
<div class="middle" ref="container" v-loading="isLoading" element-loading-background="rgba(0, 0, 0, 0.5)">
|
||||||
<div id="tree" style="width: 100%; height: 100%">
|
<div
|
||||||
|
ref="middleTree"
|
||||||
|
id="tree"
|
||||||
|
class="tree"
|
||||||
|
@mousedown="onMousedown"
|
||||||
|
@mousemove="onMouseMove"
|
||||||
|
@mouseup="onMouseUp"
|
||||||
|
:style="{left: x, top: y, transform: `scale(${scale}) translate(-50%, -50%) `, 'transform-origin': `${0} ${0}`}">
|
||||||
<VueOkrTree
|
<VueOkrTree
|
||||||
ref="VueOkrTree"
|
ref="VueOkrTree"
|
||||||
:data="chartData"
|
:data="chartData"
|
||||||
@@ -57,7 +64,7 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<el-dialog :visible.sync="isShowInfo" width="640px" :modal-append-to-body="false">
|
<el-dialog :visible.sync="isShowInfo" width="640px" :close-on-click-modal="false" :modal-append-to-body="false">
|
||||||
<template slot="title">
|
<template slot="title">
|
||||||
<h2>家庭信息</h2>
|
<h2>家庭信息</h2>
|
||||||
<img src="../assets/grid/close.png" @click="isShowInfo = false">
|
<img src="../assets/grid/close.png" @click="isShowInfo = false">
|
||||||
@@ -116,8 +123,20 @@
|
|||||||
},
|
},
|
||||||
colConfigs: [
|
colConfigs: [
|
||||||
{ prop: 'name', label: '姓名', align: 'center', width: 120 },
|
{ prop: 'name', label: '姓名', align: 'center', width: 120 },
|
||||||
{ prop: 'residentType', label: '与户主关系', align: 'center', formart: v => this.dict.getLabel('householdRelation', v) },
|
{
|
||||||
{ prop: 'idNumber', label: '身份证号', align: 'center', width: 220 },
|
prop: 'householdRelation',
|
||||||
|
label: '与户主关系',
|
||||||
|
align: 'center',
|
||||||
|
render: (h, {row}) => {
|
||||||
|
return h('span', {
|
||||||
|
style: {
|
||||||
|
color: row.householdName === '1' ? '#1DE94D' : '#A8D7F3'
|
||||||
|
}
|
||||||
|
}, row.householdRelation ? this.dict.getLabel('householdRelation', row.householdRelation) : '-')
|
||||||
|
},
|
||||||
|
formart: v => this.dict.getLabel('householdRelation', v)
|
||||||
|
},
|
||||||
|
{ prop: 'idNumber', label: '身份证号', align: 'center', width: 220, formart: v => v ? v.replace(/^(\d{10})\d{4}(.{4}$)/g, `$1${Array(5).join('*')}$2`) : '-' },
|
||||||
{ prop: 'phone', label: '联系方式', align: 'center' }
|
{ prop: 'phone', label: '联系方式', align: 'center' }
|
||||||
],
|
],
|
||||||
girdId: '',
|
girdId: '',
|
||||||
@@ -125,6 +144,11 @@
|
|||||||
tableData: [],
|
tableData: [],
|
||||||
chartData: [],
|
chartData: [],
|
||||||
girdLevel: '0',
|
girdLevel: '0',
|
||||||
|
scale: 1,
|
||||||
|
x: '50%',
|
||||||
|
y: '50%',
|
||||||
|
offsetX: 0,
|
||||||
|
offsetY: 0,
|
||||||
defaultUrl: 'http://respub.sinoecare.net/20220121/avatar-20220121163714.jpg'
|
defaultUrl: 'http://respub.sinoecare.net/20220121/avatar-20220121163714.jpg'
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -139,7 +163,63 @@
|
|||||||
this.getGirdInfo()
|
this.getGirdInfo()
|
||||||
},
|
},
|
||||||
|
|
||||||
|
mounted () {
|
||||||
|
this.bindEvent()
|
||||||
|
},
|
||||||
|
|
||||||
|
destroyed () {
|
||||||
|
document.querySelector('body').removeEventListener('mousewheel', this.onMousewheel)
|
||||||
|
},
|
||||||
|
|
||||||
methods: {
|
methods: {
|
||||||
|
bindEvent () {
|
||||||
|
document.querySelector('body').addEventListener('mousewheel', this.onMousewheel, true)
|
||||||
|
},
|
||||||
|
|
||||||
|
onMousewheel (event) {
|
||||||
|
if (!event) return false
|
||||||
|
const elClass = event.target.className
|
||||||
|
if (elClass === 'tree' || elClass === 'middle' || (elClass && (elClass.indexOf('chart') > -1 || elClass.indexOf('user') > -1))) {
|
||||||
|
var dir = event.deltaY > 0 ? 'Up' : 'Down'
|
||||||
|
if (dir === 'Up') {
|
||||||
|
this.scale = this.scale - 0.2 <= 0.1 ? 0.1 : this.scale - 0.2
|
||||||
|
} else {
|
||||||
|
this.scale = this.scale + 0.2
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return false
|
||||||
|
},
|
||||||
|
|
||||||
|
onMousedown (e) {
|
||||||
|
const left = document.querySelector('#tree').offsetLeft
|
||||||
|
const top = document.querySelector('#tree').offsetTop
|
||||||
|
this.isMove = true
|
||||||
|
this.offsetX = e.clientX - left
|
||||||
|
this.offsetY = e.clientY - top
|
||||||
|
},
|
||||||
|
|
||||||
|
onMouseMove (e) {
|
||||||
|
if (!this.isMove) return
|
||||||
|
|
||||||
|
this.x = (e.clientX - this.offsetX) + 'px'
|
||||||
|
this.y = (e.clientY - this.offsetY) + 'px'
|
||||||
|
},
|
||||||
|
|
||||||
|
onMouseUp () {
|
||||||
|
this.isMove = false
|
||||||
|
},
|
||||||
|
|
||||||
|
debounce (func, wait = 1000) {
|
||||||
|
let timeout
|
||||||
|
return function (event) {
|
||||||
|
clearTimeout(timeout)
|
||||||
|
timeout = setTimeout(() => {
|
||||||
|
func.call(this, event)
|
||||||
|
},wait)
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
handleNodeClick (e) {
|
handleNodeClick (e) {
|
||||||
this.girdLevel = e.girdLevel
|
this.girdLevel = e.girdLevel
|
||||||
this.isLoading = true
|
this.isLoading = true
|
||||||
@@ -178,10 +258,19 @@
|
|||||||
return h('div', {
|
return h('div', {
|
||||||
class: `user-item user-item-${v.girdLevel}`
|
class: `user-item user-item-${v.girdLevel}`
|
||||||
}, [h('img', {
|
}, [h('img', {
|
||||||
|
class: 'user-img',
|
||||||
attrs: {
|
attrs: {
|
||||||
src: v.photo || this.defaultUrl
|
src: v.photo || this.defaultUrl
|
||||||
|
},
|
||||||
|
on: {
|
||||||
|
dragstart: e => {
|
||||||
|
e.preventDefault()
|
||||||
|
e.stopPropagation()
|
||||||
|
return false
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}), h('p', {
|
}), h('p', {
|
||||||
|
class: 'user-p',
|
||||||
attrs: {
|
attrs: {
|
||||||
title: v.label,
|
title: v.label,
|
||||||
'data-id': v.id
|
'data-id': v.id
|
||||||
@@ -194,13 +283,14 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}, v.label), h('span', {
|
}, v.label), h('span', {
|
||||||
|
class: 'user-span',
|
||||||
style: {
|
style: {
|
||||||
display: v.girdLevel > 1 ? 'none' : 'block'
|
fontSize: v.girdLevel === '2' ? '12px' : ''
|
||||||
},
|
},
|
||||||
attrs: {
|
attrs: {
|
||||||
title: v.girdName
|
title: v.girdLevel === '2' ? (v.checkType === '1' ? '网格员' : '网格长') : v.girdName
|
||||||
}
|
}
|
||||||
}, v.girdName)])
|
}, v.girdLevel === '2' ? (v.checkType === '1' ? '网格员' : '网格长') : v.girdName)])
|
||||||
}))
|
}))
|
||||||
},
|
},
|
||||||
|
|
||||||
@@ -217,12 +307,21 @@
|
|||||||
})
|
})
|
||||||
},
|
},
|
||||||
|
|
||||||
|
autoScale () {
|
||||||
|
const treeWidth = this.$refs.middleTree.offsetWidth
|
||||||
|
const containerWidth = this.$refs.container.offsetWidth
|
||||||
|
this.scale = treeWidth < containerWidth ? 1 : containerWidth / treeWidth
|
||||||
|
this.x = '50%'
|
||||||
|
this.y = '50%'
|
||||||
|
},
|
||||||
|
|
||||||
getGirdInfo (id, level) {
|
getGirdInfo (id, level) {
|
||||||
this.instance.post(`/app/appgirdinfo/listAllGirdAndMemberByTop?id=${id || ''}`).then((res) => {
|
this.instance.post(`/app/appgirdinfo/listAllGirdAndMemberByTop?id=${id || ''}`).then((res) => {
|
||||||
if (res.code == 0) {
|
if (res.code == 0) {
|
||||||
this.chartData = this.formatList(res.data)
|
this.chartData = this.formatList(res.data)
|
||||||
|
|
||||||
this.$nextTick(() => {
|
this.$nextTick(() => {
|
||||||
|
this.autoScale()
|
||||||
if (level === '2') {
|
if (level === '2') {
|
||||||
this.getUserList(id)
|
this.getUserList(id)
|
||||||
} else {
|
} else {
|
||||||
@@ -263,6 +362,10 @@
|
|||||||
label: '子节点',
|
label: '子节点',
|
||||||
userList: userList || []
|
userList: userList || []
|
||||||
}, node)
|
}, node)
|
||||||
|
|
||||||
|
this.$nextTick(() => {
|
||||||
|
this.autoScale()
|
||||||
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
@@ -270,21 +373,40 @@
|
|||||||
|
|
||||||
formatList (list) {
|
formatList (list) {
|
||||||
return list.map(item => {
|
return list.map(item => {
|
||||||
const userList = item.girdMemberManageList ? item.girdMemberManageList.map(v => {
|
let userList = []
|
||||||
|
const girdMemberManageList = item.girdMemberManageList ? item.girdMemberManageList.map(v => {
|
||||||
return {
|
return {
|
||||||
...v,
|
...v,
|
||||||
label: v.name,
|
label: v.name,
|
||||||
id: v.id,
|
id: v.id,
|
||||||
|
checkType: '2',
|
||||||
girdName: item.girdName,
|
girdName: item.girdName,
|
||||||
girdLevel: item.girdLevel,
|
girdLevel: item.girdLevel,
|
||||||
isUser: true
|
isUser: true
|
||||||
}
|
}
|
||||||
}) : [{
|
}) : []
|
||||||
label: item.girdName,
|
const girdMemberList = item.girdMemberList ? item.girdMemberList.map(v => {
|
||||||
id: item.id,
|
return {
|
||||||
girdLevel: item.girdLevel,
|
...v,
|
||||||
girdName: item.girdName
|
label: v.name,
|
||||||
}]
|
id: v.id,
|
||||||
|
checkType: '1',
|
||||||
|
girdName: item.girdName,
|
||||||
|
girdLevel: item.girdLevel,
|
||||||
|
isUser: true
|
||||||
|
}
|
||||||
|
}) : []
|
||||||
|
|
||||||
|
userList = [...girdMemberManageList, ...girdMemberList]
|
||||||
|
if (!userList.length) {
|
||||||
|
userList = [{
|
||||||
|
label: item.girdName,
|
||||||
|
id: item.id,
|
||||||
|
girdLevel: item.girdLevel,
|
||||||
|
girdName: item.girdName
|
||||||
|
}]
|
||||||
|
}
|
||||||
|
|
||||||
const obj = {
|
const obj = {
|
||||||
label: item.girdName,
|
label: item.girdName,
|
||||||
id: item.id,
|
id: item.id,
|
||||||
@@ -430,6 +552,7 @@
|
|||||||
width: 58px;
|
width: 58px;
|
||||||
height: 80px;
|
height: 80px;
|
||||||
object-fit: cover;
|
object-fit: cover;
|
||||||
|
user-select: none;
|
||||||
}
|
}
|
||||||
|
|
||||||
p {
|
p {
|
||||||
@@ -549,6 +672,7 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
.middle {
|
.middle {
|
||||||
|
position: relative;
|
||||||
flex: 1;
|
flex: 1;
|
||||||
margin-left: 20px;
|
margin-left: 20px;
|
||||||
background: rgba(7, 11, 35, 0.4);
|
background: rgba(7, 11, 35, 0.4);
|
||||||
@@ -556,8 +680,16 @@
|
|||||||
overflow: hidden;
|
overflow: hidden;
|
||||||
|
|
||||||
#tree {
|
#tree {
|
||||||
|
display: flex;
|
||||||
|
position: absolute;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: center;
|
||||||
|
left: 50%;
|
||||||
|
top: 50%;
|
||||||
padding: 20px;
|
padding: 20px;
|
||||||
overflow: auto;
|
overflow: hidden;
|
||||||
|
width: max-content;
|
||||||
|
height: inherit;
|
||||||
}
|
}
|
||||||
|
|
||||||
::v-deep .org-chart-container {
|
::v-deep .org-chart-container {
|
||||||
|
|||||||
Reference in New Issue
Block a user