Merge branch 'xhf' of http://git.znkjfw.com/ak/zn-admin-vue3-wcs into xhf
This commit is contained in:
commit
00cfeae17a
@ -68,10 +68,10 @@ const toDocument = () => {
|
|||||||
<Icon icon="ep:tools" />
|
<Icon icon="ep:tools" />
|
||||||
<div @click="toProfile">{{ t('common.profile') }}</div>
|
<div @click="toProfile">{{ t('common.profile') }}</div>
|
||||||
</ElDropdownItem>
|
</ElDropdownItem>
|
||||||
<ElDropdownItem>
|
<!-- <ElDropdownItem>
|
||||||
<Icon icon="ep:menu" />
|
<Icon icon="ep:menu" />
|
||||||
<div @click="toDocument">{{ t('common.document') }}</div>
|
<div @click="toDocument">{{ t('common.document') }}</div>
|
||||||
</ElDropdownItem>
|
</ElDropdownItem> -->
|
||||||
<ElDropdownItem divided>
|
<ElDropdownItem divided>
|
||||||
<Icon icon="ep:lock" />
|
<Icon icon="ep:lock" />
|
||||||
<div @click="lockScreen">{{ t('lock.lockScreen') }}</div>
|
<div @click="lockScreen">{{ t('lock.lockScreen') }}</div>
|
||||||
|
@ -22,9 +22,9 @@
|
|||||||
<el-tab-pane :label="t('profile.info.resetPwd')" name="resetPwd">
|
<el-tab-pane :label="t('profile.info.resetPwd')" name="resetPwd">
|
||||||
<ResetPwd />
|
<ResetPwd />
|
||||||
</el-tab-pane>
|
</el-tab-pane>
|
||||||
<el-tab-pane :label="t('profile.info.userSocial')" name="userSocial">
|
<!-- <el-tab-pane :label="t('profile.info.userSocial')" name="userSocial">
|
||||||
<UserSocial v-model:activeName="activeName" />
|
<UserSocial v-model:activeName="activeName" />
|
||||||
</el-tab-pane>
|
</el-tab-pane> -->
|
||||||
</el-tabs>
|
</el-tabs>
|
||||||
</div>
|
</div>
|
||||||
</el-card>
|
</el-card>
|
||||||
|
@ -4,7 +4,7 @@
|
|||||||
<el-row :gutter="20">
|
<el-row :gutter="20">
|
||||||
<el-col :span="12">
|
<el-col :span="12">
|
||||||
<div class="grid-content ep-bg-purple">
|
<div class="grid-content ep-bg-purple">
|
||||||
<el-card style="max-width: 100%">
|
<el-card style="max-width: 100%" shadow="never">
|
||||||
<el-row :gutter="5" v-if="data.taskStatusVO">
|
<el-row :gutter="5" v-if="data.taskStatusVO">
|
||||||
<el-col :span="4">
|
<el-col :span="4">
|
||||||
<div class="top-item">
|
<div class="top-item">
|
||||||
@ -41,7 +41,9 @@
|
|||||||
<el-col :span="4">
|
<el-col :span="4">
|
||||||
<div class="top-item" style="border: none; color: #c60606">
|
<div class="top-item" style="border: none; color: #c60606">
|
||||||
<div class="top-item-title"> 异常 </div>
|
<div class="top-item-title"> 异常 </div>
|
||||||
<div class="top-item-num" style="color: #c60606"> {{ data.taskStatusVO.abnormalNum || 0 }} </div>
|
<div class="top-item-num" style="color: #c60606">
|
||||||
|
{{ data.taskStatusVO.abnormalNum || 0 }}
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</el-col>
|
</el-col>
|
||||||
</el-row>
|
</el-row>
|
||||||
@ -50,7 +52,7 @@
|
|||||||
</el-col>
|
</el-col>
|
||||||
<el-col :span="12">
|
<el-col :span="12">
|
||||||
<div class="grid-content ep-bg-purple">
|
<div class="grid-content ep-bg-purple">
|
||||||
<el-card style="max-width: 100%">
|
<el-card style="max-width: 100%" shadow="never">
|
||||||
<el-row :gutter="5" v-if="data.statistics">
|
<el-row :gutter="5" v-if="data.statistics">
|
||||||
<el-col :span="4">
|
<el-col :span="4">
|
||||||
<div class="top-item">
|
<div class="top-item">
|
||||||
@ -87,7 +89,9 @@
|
|||||||
<el-col :span="4">
|
<el-col :span="4">
|
||||||
<div class="top-item" style="border: none; color: #c60606">
|
<div class="top-item" style="border: none; color: #c60606">
|
||||||
<div class="top-item-title"> 故障 </div>
|
<div class="top-item-title"> 故障 </div>
|
||||||
<div class="top-item-num" style="color: #c60606"> {{ data.statistics.fault || 0 }} </div>
|
<div class="top-item-num" style="color: #c60606">
|
||||||
|
{{ data.statistics.fault || 0 }}
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</el-col>
|
</el-col>
|
||||||
</el-row>
|
</el-row>
|
||||||
@ -148,12 +152,12 @@
|
|||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
<div style="width: 100%; padding-bottom: 120px" class="map-box-allBoard">
|
<div style="width: 100%; padding-bottom: 120px" class="map-box-allBoard">
|
||||||
<indexPage ref="indexPageRef" :isAllBoard="true"/>
|
<indexPage ref="indexPageRef" :isAllBoard="true" />
|
||||||
</div>
|
</div>
|
||||||
<div
|
<div
|
||||||
style="position: fixed; bottom: 20px"
|
style="position: fixed; bottom: 20px"
|
||||||
:style="{ width: widthVal + 'px', left: leftVal + 'px' }"
|
:style="{ width: widthVal + 'px', left: leftVal + 'px' }"
|
||||||
v-if="data&&data.deviceStatusInfoVOS"
|
v-if="data && data.deviceStatusInfoVOS"
|
||||||
>
|
>
|
||||||
<div
|
<div
|
||||||
ref="scrollContainer"
|
ref="scrollContainer"
|
||||||
@ -164,9 +168,16 @@
|
|||||||
@mouseleave="endDrag"
|
@mouseleave="endDrag"
|
||||||
>
|
>
|
||||||
<div class="content">
|
<div class="content">
|
||||||
<div v-for="(n, i) in data.deviceStatusInfoVOS" :key="i" class="item" :class="{ noBoarder: i === data.deviceStatusInfoVOS.length - 1 }">
|
<div
|
||||||
|
v-for="(n, i) in data.deviceStatusInfoVOS"
|
||||||
|
:key="i"
|
||||||
|
class="item"
|
||||||
|
:class="{ noBoarder: i === data.deviceStatusInfoVOS.length - 1 }"
|
||||||
|
>
|
||||||
<div class="scroll-container-item-left">
|
<div class="scroll-container-item-left">
|
||||||
<div class="scroll-container-item-left-title">{{ filterTypeFun(n.deviceType, typeList) }}</div>
|
<div class="scroll-container-item-left-title">{{
|
||||||
|
filterTypeFun(n.deviceType, typeList)
|
||||||
|
}}</div>
|
||||||
<div class="scroll-container-item-left-img">
|
<div class="scroll-container-item-left-img">
|
||||||
<img
|
<img
|
||||||
:src="n.defaultImage"
|
:src="n.defaultImage"
|
||||||
@ -178,28 +189,22 @@
|
|||||||
</div>
|
</div>
|
||||||
<div class="scroll-container-item-right">
|
<div class="scroll-container-item-right">
|
||||||
<div class="scroll-container-item-right-item">
|
<div class="scroll-container-item-right-item">
|
||||||
<div class="scroll-container-item-right-item-title">
|
<div class="scroll-container-item-right-item-title"> 数量: </div>
|
||||||
数量:
|
<div class="scroll-container-item-right-item-num">
|
||||||
</div>
|
{{ n.totalNum || 0 }}
|
||||||
<div class="scroll-container-item-right-item-num">
|
</div>
|
||||||
{{ n.totalNum || 0 }}
|
|
||||||
</div>
|
|
||||||
</div>
|
</div>
|
||||||
<div class="scroll-container-item-right-item" style="margin-top: 3px;">
|
<div class="scroll-container-item-right-item" style="margin-top: 3px">
|
||||||
<div class="scroll-container-item-right-item-title">
|
<div class="scroll-container-item-right-item-title"> 正常数量: </div>
|
||||||
正常数量:
|
<div class="scroll-container-item-right-item-num">
|
||||||
</div>
|
{{ n.normalNum || 0 }}
|
||||||
<div class="scroll-container-item-right-item-num">
|
</div>
|
||||||
{{ n.normalNum || 0 }}
|
|
||||||
</div>
|
|
||||||
</div>
|
</div>
|
||||||
<div class="scroll-container-item-right-item" style="margin-top: 3px;">
|
<div class="scroll-container-item-right-item" style="margin-top: 3px">
|
||||||
<div class="scroll-container-item-right-item-title">
|
<div class="scroll-container-item-right-item-title"> 异常数量: </div>
|
||||||
异常数量:
|
<div class="scroll-container-item-right-item-num" style="color: #c60606">
|
||||||
</div>
|
{{ n.abnormalNum || 0 }}
|
||||||
<div class="scroll-container-item-right-item-num" style="color: #c60606">
|
</div>
|
||||||
{{ n.abnormalNum || 0 }}
|
|
||||||
</div>
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@ -308,7 +313,7 @@
|
|||||||
import { ref, reactive, onMounted, onBeforeUnmount } from 'vue'
|
import { ref, reactive, onMounted, onBeforeUnmount } from 'vue'
|
||||||
import { dateFormatter } from '@/utils/formatTime'
|
import { dateFormatter } from '@/utils/formatTime'
|
||||||
import * as ChartsApi from '@/api/boardCharts'
|
import * as ChartsApi from '@/api/boardCharts'
|
||||||
import { DICT_TYPE, getIntDictOptions,getDictOptions } from '@/utils/dict'
|
import { DICT_TYPE, getIntDictOptions, getDictOptions } from '@/utils/dict'
|
||||||
import indexPage from '../../mapPage/realTimeMap/components/indexPage.vue'
|
import indexPage from '../../mapPage/realTimeMap/components/indexPage.vue'
|
||||||
import * as MapApi from '@/api/map/map'
|
import * as MapApi from '@/api/map/map'
|
||||||
const router = useRouter() // 路由对象
|
const router = useRouter() // 路由对象
|
||||||
@ -316,15 +321,17 @@ const indexPageRef = ref(null)
|
|||||||
const typeList = ref([])
|
const typeList = ref([])
|
||||||
defineOptions({ name: 'BoardAllBoard' })
|
defineOptions({ name: 'BoardAllBoard' })
|
||||||
const data = ref({
|
const data = ref({
|
||||||
taskStatusVO: { //顶部左边统计
|
taskStatusVO: {
|
||||||
|
//顶部左边统计
|
||||||
pendingExecutionNum: 0,
|
pendingExecutionNum: 0,
|
||||||
underwayNum: 0,
|
underwayNum: 0,
|
||||||
completedNum: 0,
|
completedNum: 0,
|
||||||
cancelledNum: 0,
|
cancelledNum: 0,
|
||||||
abnormalNum: 0,
|
abnormalNum: 0,
|
||||||
tasksNumber: 0,
|
tasksNumber: 0
|
||||||
},
|
},
|
||||||
statistics: { //顶部右边 统计
|
statistics: {
|
||||||
|
//顶部右边 统计
|
||||||
total: 0,
|
total: 0,
|
||||||
inTask: 0,
|
inTask: 0,
|
||||||
doLock: 0,
|
doLock: 0,
|
||||||
@ -336,7 +343,7 @@ const data = ref({
|
|||||||
pendingExecution: [], //待执行
|
pendingExecution: [], //待执行
|
||||||
robotWarnMsgDOS: [], //异常信息
|
robotWarnMsgDOS: [], //异常信息
|
||||||
deviceStatusInfoVOS: [], //设备信息
|
deviceStatusInfoVOS: [], //设备信息
|
||||||
robotElectricityLevelVOS: [], //车辆信息
|
robotElectricityLevelVOS: [] //车辆信息
|
||||||
})
|
})
|
||||||
//获取数据
|
//获取数据
|
||||||
const getAllData = async () => {
|
const getAllData = async () => {
|
||||||
@ -390,11 +397,10 @@ const toManyWarnMsg = () => {
|
|||||||
// 前往车辆看板
|
// 前往车辆看板
|
||||||
const goCarBord = () => {
|
const goCarBord = () => {
|
||||||
router.push({
|
router.push({
|
||||||
path: '/board/carBoard',
|
path: '/board/carBoard'
|
||||||
|
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
const list = ref([]) // 地图区域列表
|
const list = ref([]) // 地图区域列表
|
||||||
const mapValue = ref([]) //选中的区域绑定的数组值
|
const mapValue = ref([]) //选中的区域绑定的数组值
|
||||||
const mapInfo = ref(null) //选中的区域
|
const mapInfo = ref(null) //选中的区域
|
||||||
//获取地图区域
|
//获取地图区域
|
||||||
@ -530,8 +536,8 @@ const getLeft = () => {
|
|||||||
}
|
}
|
||||||
const getWidthPx = () => {
|
const getWidthPx = () => {
|
||||||
let width = getElementWidthByClass('map-box-allBoard')
|
let width = getElementWidthByClass('map-box-allBoard')
|
||||||
// console.log("pppppppppppppp",width)
|
// console.log("pppppppppppppp",width)
|
||||||
widthVal.value = width
|
widthVal.value = width
|
||||||
}
|
}
|
||||||
const getLeftWidth = () => {
|
const getLeftWidth = () => {
|
||||||
nextTick(() => {
|
nextTick(() => {
|
||||||
@ -541,14 +547,14 @@ const getLeftWidth = () => {
|
|||||||
}
|
}
|
||||||
//根据type和列表返回对应中文
|
//根据type和列表返回对应中文
|
||||||
const filterTypeFun = (type, list) => {
|
const filterTypeFun = (type, list) => {
|
||||||
if (list.length) {
|
if (list.length) {
|
||||||
let obj = list.find(item => {
|
let obj = list.find((item) => {
|
||||||
return item.value == type
|
return item.value == type
|
||||||
})
|
})
|
||||||
return obj == undefined ? type : obj.label
|
return obj == undefined ? type : obj.label
|
||||||
} else {
|
} else {
|
||||||
return type
|
return type
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
onMounted(() => {
|
onMounted(() => {
|
||||||
typeList.value = getDictOptions(DICT_TYPE.DEVICE_TYPE)
|
typeList.value = getDictOptions(DICT_TYPE.DEVICE_TYPE)
|
||||||
@ -556,7 +562,6 @@ onMounted(() => {
|
|||||||
getList()
|
getList()
|
||||||
getLeftWidth()
|
getLeftWidth()
|
||||||
window.addEventListener('resize', getLeftWidth)
|
window.addEventListener('resize', getLeftWidth)
|
||||||
|
|
||||||
})
|
})
|
||||||
onBeforeUnmount(() => {
|
onBeforeUnmount(() => {
|
||||||
window.removeEventListener('resize', getLeftWidth)
|
window.removeEventListener('resize', getLeftWidth)
|
||||||
@ -754,25 +759,29 @@ onBeforeUnmount(() => {
|
|||||||
flex-shrink: 0;
|
flex-shrink: 0;
|
||||||
margin-left: 16px;
|
margin-left: 16px;
|
||||||
}
|
}
|
||||||
.noBoarder{
|
.noBoarder {
|
||||||
border-right: none;
|
border-right: none;
|
||||||
}
|
}
|
||||||
.scroll-container-item-right-item{
|
.scroll-container-item-right-item {
|
||||||
display: flex;
|
display: flex;
|
||||||
flex-shrink: 0;
|
flex-shrink: 0;
|
||||||
}
|
}
|
||||||
.scroll-container-item-right-item-title{
|
.scroll-container-item-right-item-title {
|
||||||
font-family: PingFangSC, PingFang SC;
|
font-family:
|
||||||
font-weight: 400;
|
PingFangSC,
|
||||||
font-size: 12px;
|
PingFang SC;
|
||||||
color: #0D162A;
|
font-weight: 400;
|
||||||
flex-shrink: 0;
|
font-size: 12px;
|
||||||
|
color: #0d162a;
|
||||||
|
flex-shrink: 0;
|
||||||
}
|
}
|
||||||
.scroll-container-item-right-item-num{
|
.scroll-container-item-right-item-num {
|
||||||
font-family: PingFangSC, PingFang SC;
|
font-family:
|
||||||
font-weight: 400;
|
PingFangSC,
|
||||||
font-size: 12px;
|
PingFang SC;
|
||||||
color: #0D162A;
|
font-weight: 400;
|
||||||
flex-shrink: 0;
|
font-size: 12px;
|
||||||
|
color: #0d162a;
|
||||||
|
flex-shrink: 0;
|
||||||
}
|
}
|
||||||
</style>
|
</style>
|
||||||
|
@ -253,8 +253,20 @@
|
|||||||
<el-text v-if="scope.row.taskStatus == 4">异常</el-text>
|
<el-text v-if="scope.row.taskStatus == 4">异常</el-text>
|
||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
<el-table-column prop="startTime" label="开始时间" align="center" width="150" />
|
<el-table-column
|
||||||
<el-table-column prop="endTime" label="结束时间" align="center" width="150" />
|
prop="startTime"
|
||||||
|
label="开始时间"
|
||||||
|
align="center"
|
||||||
|
:formatter="dateFormatter"
|
||||||
|
width="170"
|
||||||
|
/>
|
||||||
|
<el-table-column
|
||||||
|
prop="endTime"
|
||||||
|
label="结束时间"
|
||||||
|
align="center"
|
||||||
|
:formatter="dateFormatter"
|
||||||
|
width="170"
|
||||||
|
/>
|
||||||
</el-table>
|
</el-table>
|
||||||
<!-- 分页 -->
|
<!-- 分页 -->
|
||||||
<Pagination
|
<Pagination
|
||||||
|
@ -2713,7 +2713,6 @@ const cmConversionPx = (cWidth, cHeight) => {
|
|||||||
pHeight
|
pHeight
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// 计算直线中间箭头的路径
|
// 计算直线中间箭头的路径
|
||||||
const getLineMidArrowPath = (item) => {
|
const getLineMidArrowPath = (item) => {
|
||||||
const midX = (Number(item.startPointX) + Number(item.endPointX)) / 2
|
const midX = (Number(item.startPointX) + Number(item.endPointX)) / 2
|
||||||
@ -2738,7 +2737,6 @@ const getLineMidArrowPath = (item) => {
|
|||||||
|
|
||||||
return `M ${startXArrow} ${startYArrow} L ${endXArrow} ${endYArrow}`
|
return `M ${startXArrow} ${startYArrow} L ${endXArrow} ${endYArrow}`
|
||||||
}
|
}
|
||||||
|
|
||||||
// 计算贝塞尔曲线中间箭头的路径(简单近似)
|
// 计算贝塞尔曲线中间箭头的路径(简单近似)
|
||||||
const getBezierMidArrowPath = (item) => {
|
const getBezierMidArrowPath = (item) => {
|
||||||
const path = document.createElementNS('http://www.w3.org/2000/svg', 'path')
|
const path = document.createElementNS('http://www.w3.org/2000/svg', 'path')
|
||||||
@ -2748,7 +2746,6 @@ const getBezierMidArrowPath = (item) => {
|
|||||||
const prevPoint = path.getPointAtLength(length / 2 - 1)
|
const prevPoint = path.getPointAtLength(length / 2 - 1)
|
||||||
return `M ${prevPoint.x} ${prevPoint.y} L ${midPoint.x} ${midPoint.y}`
|
return `M ${prevPoint.x} ${prevPoint.y} L ${midPoint.x} ${midPoint.y}`
|
||||||
}
|
}
|
||||||
|
|
||||||
// 计算贝塞尔曲线中间文字的 x 坐标
|
// 计算贝塞尔曲线中间文字的 x 坐标
|
||||||
const computedCurveTextX = (item) => {
|
const computedCurveTextX = (item) => {
|
||||||
return (
|
return (
|
||||||
@ -2759,7 +2756,6 @@ const computedCurveTextX = (item) => {
|
|||||||
4
|
4
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
// 计算贝塞尔曲线中间文字的 y 坐标
|
// 计算贝塞尔曲线中间文字的 y 坐标
|
||||||
const computedCurveTextY = (item) => {
|
const computedCurveTextY = (item) => {
|
||||||
return (
|
return (
|
||||||
@ -2770,7 +2766,6 @@ const computedCurveTextY = (item) => {
|
|||||||
4
|
4
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
document.onmousedown = function (e) {
|
document.onmousedown = function (e) {
|
||||||
//左击
|
//左击
|
||||||
if (e.button == 2) {
|
if (e.button == 2) {
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
<template>
|
<template>
|
||||||
<ContentWrap>
|
<el-card shadow="never">
|
||||||
<div class="top-box">
|
<div class="top-box">
|
||||||
<div class="top-box-left"> 统计视图 </div>
|
<div class="top-box-left"> 统计视图 </div>
|
||||||
<div class="top-box-right">
|
<div class="top-box-right">
|
||||||
@ -12,18 +12,18 @@
|
|||||||
<el-button style="margin-left: 16px" @click="openForm()">看板管理</el-button>
|
<el-button style="margin-left: 16px" @click="openForm()">看板管理</el-button>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</ContentWrap>
|
</el-card>
|
||||||
|
|
||||||
<div class="">
|
<div class="mt-4">
|
||||||
<el-row :gutter="16">
|
<el-row :gutter="16">
|
||||||
<el-col :span="12">
|
<el-col :span="12">
|
||||||
<el-card style="width: 100%">
|
<el-card style="width: 100%" shadow="never">
|
||||||
<div class="charts-title"> 任务总览 </div>
|
<div class="charts-title"> 任务总览 </div>
|
||||||
<div ref="chartDom" style="width: 100%; height: 400px"></div>
|
<div ref="chartDom" style="width: 100%; height: 400px"></div>
|
||||||
</el-card>
|
</el-card>
|
||||||
</el-col>
|
</el-col>
|
||||||
<el-col :span="12">
|
<el-col :span="12">
|
||||||
<el-card style="width: 100%">
|
<el-card style="width: 100%" shadow="never">
|
||||||
<div class="charts-title"> 任务完成率 </div>
|
<div class="charts-title"> 任务完成率 </div>
|
||||||
<div ref="chartDomFinish" style="width: 100%; height: 400px"></div>
|
<div ref="chartDomFinish" style="width: 100%; height: 400px"></div>
|
||||||
</el-card>
|
</el-card>
|
||||||
@ -31,13 +31,13 @@
|
|||||||
</el-row>
|
</el-row>
|
||||||
<el-row :gutter="16" style="margin-top: 12px">
|
<el-row :gutter="16" style="margin-top: 12px">
|
||||||
<el-col :span="12">
|
<el-col :span="12">
|
||||||
<el-card style="width: 100%">
|
<el-card style="width: 100%" shadow="never">
|
||||||
<div class="charts-title"> AGV工作利用率统计 </div>
|
<div class="charts-title"> AGV工作利用率统计 </div>
|
||||||
<div ref="chartDomAgv" style="width: 100%; height: 400px"></div>
|
<div ref="chartDomAgv" style="width: 100%; height: 400px"></div>
|
||||||
</el-card>
|
</el-card>
|
||||||
</el-col>
|
</el-col>
|
||||||
<el-col :span="12">
|
<el-col :span="12">
|
||||||
<el-card style="width: 100%">
|
<el-card style="width: 100%" shadow="never">
|
||||||
<div class="charts-title"> 任务异常数 </div>
|
<div class="charts-title"> 任务异常数 </div>
|
||||||
<div ref="chartDomError" style="width: 100%; height: 400px"></div>
|
<div ref="chartDomError" style="width: 100%; height: 400px"></div>
|
||||||
</el-card>
|
</el-card>
|
||||||
|
Loading…
Reference in New Issue
Block a user