fix: 冲突解决
This commit is contained in:
commit
e3be724729
@ -78,4 +78,12 @@ export const getAlarmRecordApi = (params: {}) => {
|
||||
// 顶部数据接口
|
||||
export const getAlarmTypeCountApi = (params: {}) => {
|
||||
return http.post(BASEURL + `/xmgl/aiStatistic/selectAiAnalyseHardWareAlarmTypeCount`, params, { headers: { noLoading: true } });
|
||||
};
|
||||
};
|
||||
// centerTop底部按钮显示数据接口
|
||||
export const getStatsDirectorateBigScreenApi = (params: {}) => {
|
||||
return http.post(BASEURL + `/xmgl/xzSecurityQualityInspectionRecord/statsDirectorateBigScreen`, params, { headers: { noLoading: true } });
|
||||
};
|
||||
// centerTop评分数据接口
|
||||
export const getStatScoreApi = (params: {}) => {
|
||||
return http.get(BASEURL + `/xmgl/xzSecurityQualityInspectionRecord/getStatScore`, params, { headers: { noLoading: true } });
|
||||
};
|
||||
|
||||
@ -8,7 +8,7 @@
|
||||
<div class="cbHeaderLine"></div>
|
||||
</div>
|
||||
<div class="cbContent">
|
||||
<vue3-seamless-scroll :list="listData" :step="1" :hover="true" class="scroll">
|
||||
<vue3-seamless-scroll :speed="1" :list="listData" :step="0.3" :hover="true" class="scroll">
|
||||
<div class="item" v-for="(item, index) in listData" :key="index">
|
||||
<div class="itemHead">
|
||||
<div class="itemHeadInner" v-if="item.type === 1">{{ item.header }}</div>
|
||||
|
||||
@ -3,70 +3,71 @@
|
||||
<div class="top-content">
|
||||
<div class="content-div aq">
|
||||
<div class="circle-box">
|
||||
<span>20分</span>
|
||||
<span>{{statScore.hiddenDangerScore}}分</span>
|
||||
</div>
|
||||
<span>安全隐患治理</span>
|
||||
</div>
|
||||
<div class="content-div wd">
|
||||
<div class="circle-box">
|
||||
<span>20分</span>
|
||||
<span>{{statScore.dangerEngScore}}分</span>
|
||||
</div>
|
||||
<span>危大工程</span>
|
||||
</div>
|
||||
<div class="content-div jy">
|
||||
<div class="circle-box">
|
||||
<span>20分</span>
|
||||
<!-- <span>{{statScore}}分</span> -->
|
||||
<span>25分</span>
|
||||
</div>
|
||||
<span>安全教育</span>
|
||||
</div>
|
||||
<div class="content-div fx">
|
||||
<div class="circle-box">
|
||||
<span>20分</span>
|
||||
<span>{{statScore.riskScore}}分</span>
|
||||
</div>
|
||||
<span>风险管理</span>
|
||||
</div>
|
||||
<div class="content-div zn">
|
||||
<div class="circle-box">
|
||||
<span>20分</span>
|
||||
<span>{{statScore.aiScore}}分</span>
|
||||
</div>
|
||||
<span>智能硬件分析</span>
|
||||
<span>AI警报</span>
|
||||
</div>
|
||||
<div class="count-div">
|
||||
<div class="count-div-item">
|
||||
<span>上月安全综合评分</span>
|
||||
<span>65</span>
|
||||
<span>{{statScore.lastMonthTotal}}</span>
|
||||
<span>分</span>
|
||||
</div>
|
||||
<div class="count-div-item">
|
||||
<span>相较上月上升20%</span>
|
||||
<span>相较上月上升{{statScore.radio}}%</span>
|
||||
<span></span>
|
||||
</div>
|
||||
</div>
|
||||
<div class="score-div" @click="openDialogData({index: 9, title: '月度安全综合评分'})">
|
||||
<div class="score-part">
|
||||
<span>78</span>
|
||||
<span>{{statScore.total}}</span>
|
||||
<span>分</span>
|
||||
</div>
|
||||
<span>安全评分</span>
|
||||
</div>
|
||||
<div class="classify-div">
|
||||
<div class="classify-div-item" @click="openDialogData({index: 1, title: '危大工程'})">
|
||||
<span>危大工程 +20</span>
|
||||
<span>危大工程 {{statsDirectorateBigScreen.dangerousEngineeringRecordNum}}</span>
|
||||
</div>
|
||||
<div class="classify-div-item" @click="openDialogData({index: 2, title: '安全教育'})">
|
||||
<span>安全教育 +20</span>
|
||||
<span>安全教育 {{statsDirectorateBigScreen.workerInfoAuditRecordNum}}</span>
|
||||
</div>
|
||||
<div class="classify-div-item" @click="openDialogData({index: 3, title: '影响进度的因素'})">
|
||||
<span>极端恶劣天气 +20</span>
|
||||
<span>极端恶劣天气 {{statsDirectorateBigScreen.taskProgressContentNum}}</span>
|
||||
</div>
|
||||
<div class="classify-div-item" @click="openDialogData({index: 4, title: '风险统计'})">
|
||||
<span>风险统计 +20</span>
|
||||
<span>风险统计 {{statsDirectorateBigScreen.securityQualityInspectionRecordNum}}</span>
|
||||
</div>
|
||||
<div class="classify-div-item" @click="openDialogData({index: 5, title: '安全隐患'})">
|
||||
<span>安全隐患 +20</span>
|
||||
<span>安全隐患 {{statsDirectorateBigScreen.securityQualityInspectionRecordNum}}</span>
|
||||
</div>
|
||||
<div class="classify-div-item" @click="openDialogData({index: 6, title: 'AI警报'})">
|
||||
<span>AI警报 +20</span>
|
||||
<span>AI警报 {{statsDirectorateBigScreen.aiAnalyseHardWareAlarmRecordNum}}</span>
|
||||
</div>
|
||||
</div>
|
||||
<div class="background-title">
|
||||
@ -83,6 +84,7 @@ import { GlobalStore } from "@/stores";
|
||||
import { ElMessage } from "element-plus";
|
||||
|
||||
import { editProjectInfo, eidtProjectShowConfig, queryBySnData } from "@/api/modules/projectOverview";
|
||||
import { getStatsDirectorateBigScreenApi, getStatScoreApi } from "@/api/modules/agjtCommandApi";
|
||||
import { selectLiveVideoListApi } from "@/api/modules/video";
|
||||
import ckplayerComp from "./ckplayerComp.vue";
|
||||
import { COMPANY } from "@/config/config";
|
||||
@ -159,6 +161,20 @@ const getVideoList = async () => {
|
||||
}, 2000);
|
||||
}
|
||||
};
|
||||
let statsDirectorateBigScreen = ref({} as any);
|
||||
//获取centerTop底部按钮显示数据
|
||||
const getStatsDirectorateBigScreen = async () => {
|
||||
const res = await getStatsDirectorateBigScreenApi({ projectSn: store.sn });
|
||||
statsDirectorateBigScreen.value = res.result
|
||||
};
|
||||
let statScore = ref({} as any);
|
||||
//获取centerTop底部按钮显示数据
|
||||
const getStatScore = async () => {
|
||||
const res = await getStatScoreApi({ projectSn: store.sn });
|
||||
console.log("获取项目信息6666666666666666666666666666666666", res);
|
||||
statScore.value = res.result
|
||||
};
|
||||
|
||||
|
||||
function boxStyle(item: any) {
|
||||
if (item.isActive) {
|
||||
@ -236,6 +252,8 @@ defineExpose({
|
||||
onMounted(async () => {
|
||||
await getVideoList();
|
||||
getQueryBySnData();
|
||||
getStatsDirectorateBigScreen();
|
||||
getStatScore();
|
||||
});
|
||||
</script>
|
||||
|
||||
|
||||
@ -11,7 +11,7 @@
|
||||
<div class="centerBottom">
|
||||
<div class="leftTop">
|
||||
<div class="header">
|
||||
<div class="hLeft" @click="openDialogData({index: 8, title: '人员履职情况分析(整改人)'})">人员履职情况分析</div>
|
||||
<div class="hLeft" @click="openDialogData({ index: 8, title: '人员履职情况分析(整改人)' })">人员履职情况分析</div>
|
||||
<div class="hRight">
|
||||
<el-date-picker
|
||||
style="width: 85%"
|
||||
@ -21,6 +21,7 @@
|
||||
range-separator="至"
|
||||
start-placeholder="开始日期"
|
||||
end-placeholder="结束日期"
|
||||
@change="dateChange"
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
@ -72,7 +73,7 @@ import { getPersonTypeAndEduStatisticsApi } from "@/api/modules/labor";
|
||||
import type { TabsPaneContext, ElMessageBox } from "element-plus";
|
||||
import { GlobalStore } from "@/stores";
|
||||
const store = GlobalStore();
|
||||
const emits = defineEmits(["openDialog"])
|
||||
const emits = defineEmits(["openDialog"]);
|
||||
const activeName = ref("first");
|
||||
const activeIndex = ref("0" as any);
|
||||
const dateRange = ref([]);
|
||||
@ -96,6 +97,10 @@ let dataList2 = ref([
|
||||
value: 0,
|
||||
show: true,
|
||||
name: "未教育人员",
|
||||
// 设置文本颜色
|
||||
// textStyle: {
|
||||
// color: '#038cf5'
|
||||
// },
|
||||
itemStyle: {
|
||||
normal: {
|
||||
color: "#038cf5",
|
||||
@ -107,6 +112,10 @@ let dataList2 = ref([
|
||||
value: 0,
|
||||
show: true,
|
||||
name: "完成人员",
|
||||
// 设置文本颜色
|
||||
// textStyle: {
|
||||
// color: '#01d6f4'
|
||||
// }
|
||||
itemStyle: {
|
||||
normal: {
|
||||
color: "#01d6f4",
|
||||
@ -127,85 +136,94 @@ let dataList2 = ref([
|
||||
}
|
||||
]);
|
||||
// 打开弹窗
|
||||
const openDialogData = (obj:any) => {
|
||||
emits("openDialog",obj)
|
||||
const openDialogData = (obj: any) => {
|
||||
emits("openDialog", obj);
|
||||
};
|
||||
const dateChange = () => {
|
||||
if (activeIndex.value == "0") {
|
||||
getMemberJobStatusFn();
|
||||
} else if (activeIndex.value == "1") {
|
||||
getInspectManStatusFn();
|
||||
} else if (activeIndex.value == "2") {
|
||||
getEnterpriseStatusFn();
|
||||
}
|
||||
}
|
||||
//获取人员数据
|
||||
const getPersonList = async () => {
|
||||
const res:any = await getPersonTypeAndEduStatisticsApi({
|
||||
const res: any = await getPersonTypeAndEduStatisticsApi({
|
||||
projectSn: store.sn
|
||||
});
|
||||
if (res.result) {
|
||||
dataList2.value[1].value = res.result.personType.toaltPerson.totalPerson
|
||||
dataList2.value[2].value = res.result.personType.toaltPerson.totalPerson
|
||||
console.log('安全教育智能分析666',res)
|
||||
dataList2.value[1].value = res.result.personType.toaltPerson.totalPerson;
|
||||
dataList2.value[2].value = res.result.personType.toaltPerson.totalPerson;
|
||||
console.log("安全教育智能分析666", res);
|
||||
}
|
||||
};
|
||||
// 获取人员履职情况分析数据--整改人
|
||||
const getMemberJobStatusFn = async () => {
|
||||
let requestData:any = {
|
||||
let requestData: any = {
|
||||
projectSn: store.sn,
|
||||
pageSize: 5,
|
||||
pageNo: 1
|
||||
}
|
||||
if(dateRange.value.length > 0){
|
||||
};
|
||||
if (dateRange.value.length > 0) {
|
||||
requestData.inspectTime_begin = dateRange.value[0];
|
||||
requestData.inspectTime_end = dateRange.value[1];
|
||||
}
|
||||
const res:any = await getMemberJobStatusApi(requestData);
|
||||
console.log('人员履职情况res--整改人',res)
|
||||
if(res.result){
|
||||
const res: any = await getMemberJobStatusApi(requestData);
|
||||
console.log("人员履职情况res--整改人", res);
|
||||
if (res.result) {
|
||||
tabList.value = res.result.records;
|
||||
} else {
|
||||
tabList.value = [];
|
||||
}
|
||||
}
|
||||
};
|
||||
// 获取人员履职情况分析数据--检查人
|
||||
const getInspectManStatusFn = async () => {
|
||||
let requestData:any = {
|
||||
let requestData: any = {
|
||||
projectSn: store.sn,
|
||||
pageSize: 5,
|
||||
pageNo: 1
|
||||
}
|
||||
if(dateRange.value.length > 0){
|
||||
};
|
||||
if (dateRange.value.length > 0) {
|
||||
requestData.inspectTime_begin = dateRange.value[0];
|
||||
requestData.inspectTime_end = dateRange.value[1];
|
||||
}
|
||||
const res:any = await getInspectManStatusApi(requestData);
|
||||
console.log('人员履职情况res--检查人',res)
|
||||
if(res.result){
|
||||
const res: any = await getInspectManStatusApi(requestData);
|
||||
console.log("人员履职情况res--检查人", res);
|
||||
if (res.result) {
|
||||
tabList.value = res.result.records;
|
||||
} else {
|
||||
tabList.value = [];
|
||||
}
|
||||
}
|
||||
};
|
||||
// 获取人员履职情况分析数据--按分包单位分析
|
||||
const getEnterpriseStatusFn = async () => {
|
||||
let requestData:any = {
|
||||
let requestData: any = {
|
||||
projectSn: store.sn,
|
||||
pageSize: 5,
|
||||
pageNo: 1
|
||||
}
|
||||
if(dateRange.value.length > 0){
|
||||
};
|
||||
if (dateRange.value.length > 0) {
|
||||
requestData.inspectTime_begin = dateRange.value[0];
|
||||
requestData.inspectTime_end = dateRange.value[1];
|
||||
}
|
||||
const res:any = await getEnterpriseStatusApi(requestData);
|
||||
console.log('人员履职情况res--按分包单位分析',res)
|
||||
if(res.result){
|
||||
const res: any = await getEnterpriseStatusApi(requestData);
|
||||
console.log("人员履职情况res--按分包单位分析", res);
|
||||
if (res.result) {
|
||||
tabList.value = res.result.records;
|
||||
} else {
|
||||
tabList.value = [];
|
||||
}
|
||||
}
|
||||
};
|
||||
const handleClick = (tab: TabsPaneContext, event: Event) => {
|
||||
activeIndex.value = tab.index;
|
||||
console.log(tab)
|
||||
if(tab.index == '0'){
|
||||
console.log(tab);
|
||||
if (tab.index == "0") {
|
||||
getMemberJobStatusFn();
|
||||
} else if(tab.index == '1'){
|
||||
} else if (tab.index == "1") {
|
||||
getInspectManStatusFn();
|
||||
} else if(tab.index == '2'){
|
||||
} else if (tab.index == "2") {
|
||||
getEnterpriseStatusFn();
|
||||
}
|
||||
console.log("activeIndex", activeIndex.value);
|
||||
@ -258,10 +276,10 @@ function drawEchart2() {
|
||||
textStyle: {
|
||||
color: "#fff",
|
||||
fontSize: 26,
|
||||
fontWeight: "normal",
|
||||
fontWeight: "normal"
|
||||
// align: "center",
|
||||
// width: "200px",
|
||||
fontFamily: "sadigitalNumber"
|
||||
// fontFamily: "sadigitalNumber"
|
||||
},
|
||||
subtextStyle: {
|
||||
color: "#ccc",
|
||||
@ -283,7 +301,7 @@ function drawEchart2() {
|
||||
itemHeight: 7, // 设置高度
|
||||
symbolKeepAspect: false,
|
||||
textStyle: {
|
||||
color: "#000",
|
||||
// color: "#000",
|
||||
rich: {
|
||||
name: {
|
||||
verticalAlign: "right",
|
||||
@ -291,10 +309,26 @@ function drawEchart2() {
|
||||
fontSize: 14,
|
||||
color: "#FFFFFF"
|
||||
},
|
||||
value: {
|
||||
value1: {
|
||||
align: "left",
|
||||
fontSize: 14,
|
||||
color: "#FFFFFF"
|
||||
color: "#FBDC00",
|
||||
fontFamily: "Source Han Sans CN, Source Han Sans CN",
|
||||
fontWeight: "bold"
|
||||
},
|
||||
value2: {
|
||||
align: "left",
|
||||
fontSize: 14,
|
||||
color: "#0DAF27",
|
||||
fontFamily: "Source Han Sans CN, Source Han Sans CN",
|
||||
fontWeight: "bold"
|
||||
},
|
||||
value3: {
|
||||
align: "left",
|
||||
fontSize: 14,
|
||||
color: "#047EFF",
|
||||
fontFamily: "Source Han Sans CN, Source Han Sans CN",
|
||||
fontWeight: "bold"
|
||||
}
|
||||
}
|
||||
},
|
||||
@ -304,12 +338,20 @@ function drawEchart2() {
|
||||
}
|
||||
}),
|
||||
formatter: function (data) {
|
||||
console.log(data, 666777);
|
||||
if (dataList2.value && dataList2.value.length) {
|
||||
for (var i = 0; i < dataList2.value.length; i++) {
|
||||
if (data === dataList2.value[i].name) {
|
||||
var value = dataList2.value[i].value;
|
||||
var percentage = value + "%";
|
||||
return "{name| " + data + "} {gap| }" + "{value|" + value + " " + "}";
|
||||
console.log(value, 888);
|
||||
if (data == "未教育人员") {
|
||||
return "{name| " + data + "} {gap| }" + "{value1|" + value + " " + "}";
|
||||
} else if (data == "完成人员") {
|
||||
return "{name| " + data + "} {gap| }" + "{value2|" + value + " " + "}";
|
||||
} else if (data == "现场人员") {
|
||||
return "{name| " + data + "} {gap| }" + "{value3|" + value + " " + "}";
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -501,7 +543,7 @@ onMounted(async () => {
|
||||
width: 50%;
|
||||
font-size: 20px;
|
||||
font-weight: bold;
|
||||
background-image: linear-gradient(to bottom left, #c8E3FF, #007AFF);
|
||||
background-image: linear-gradient(to bottom left, #c8e3ff, #007aff);
|
||||
-webkit-background-clip: text;
|
||||
background-clip: text;
|
||||
color: transparent;
|
||||
@ -536,7 +578,7 @@ onMounted(async () => {
|
||||
width: 50%;
|
||||
font-size: 20px;
|
||||
font-weight: bold;
|
||||
background-image: linear-gradient(to bottom left, #c8E3FF, #007AFF);
|
||||
background-image: linear-gradient(to bottom left, #c8e3ff, #007aff);
|
||||
-webkit-background-clip: text;
|
||||
background-clip: text;
|
||||
color: transparent;
|
||||
|
||||
@ -78,6 +78,9 @@
|
||||
:src="BASEURL + '/image/' + item.imageUrl"
|
||||
:preview-src-list="[BASEURL + '/image/' + item.imageUrl]"
|
||||
>
|
||||
<template #error>
|
||||
<el-image :src="noDataImage" :preview-src-list="[noDataImage]" fit="contain" class="el-no-img" alt="" />
|
||||
</template>
|
||||
</el-image>
|
||||
<!-- <img :src="item.fieldAcquisitionUrl" alt="" srcset=""> -->
|
||||
</div>
|
||||
@ -130,6 +133,7 @@ import { GlobalStore } from "@/stores";
|
||||
import { getCompanyDataList, getMemberInfoList } from "@/api/modules/labor";
|
||||
import type { TabsPaneContext } from 'element-plus'
|
||||
import { getAlarmTypeOption } from "@/api/modules/aIEarlyWarn";
|
||||
import noDataImage from "@/assets/images/vehicleManagement/car.png";
|
||||
import { getAlarmRecordApi, getAlarmTypeCountApi } from "@/api/modules/agjtCommandApi";
|
||||
const store = GlobalStore();
|
||||
const props = defineProps(["tip"]);
|
||||
@ -490,6 +494,10 @@ onMounted(async () => {
|
||||
height: 100%;
|
||||
}
|
||||
}
|
||||
.el-no-img{
|
||||
width: 30px;
|
||||
height: 30px;
|
||||
}
|
||||
}
|
||||
div {
|
||||
width: 17%;
|
||||
|
||||
@ -20,7 +20,11 @@
|
||||
<div v-for="(item, index) in partyMemberList" class="listStyle" :key="item.id">
|
||||
<div>{{index + 1}}</div>
|
||||
<div>{{item.engineeringName}}</div>
|
||||
<div>{{item.progressDescribe}}</div>
|
||||
<div>
|
||||
<el-tooltip class="box-item" effect="dark" :content="item.progressDescribe" placement="top-start">
|
||||
<span>{{item.progressDescribe}}</span>
|
||||
</el-tooltip>
|
||||
</div>
|
||||
<div class="list-img">
|
||||
<el-image
|
||||
fit="contain"
|
||||
@ -28,6 +32,9 @@
|
||||
:src="BASEURL + '/image/' + item.imageUrl"
|
||||
:preview-src-list="[BASEURL + '/image/' + item.imageUrl]"
|
||||
>
|
||||
<template #error>
|
||||
<el-image :src="noDataImage" :preview-src-list="[noDataImage]" fit="contain" class="el-no-img" alt="" />
|
||||
</template>
|
||||
</el-image>
|
||||
<!-- <img :src="item.fieldAcquisitionUrl" alt="" srcset=""> -->
|
||||
</div>
|
||||
@ -86,7 +93,11 @@
|
||||
<div v-for="(item, index) in partyMemberList" class="listStyle" :key="item.id">
|
||||
<div>{{index + 1}}</div>
|
||||
<div>{{item.engineeringName}}</div>
|
||||
<div>{{item.acceptanceDesc}}</div>
|
||||
<div>
|
||||
<el-tooltip class="box-item" effect="dark" :content="item.acceptanceDesc" placement="top-start">
|
||||
<span>{{item.acceptanceDesc}}</span>
|
||||
</el-tooltip>
|
||||
</div>
|
||||
<div>{{item.acceptanceResult == 1?'合格':'不合格'}}</div>
|
||||
<div class="list-img">
|
||||
<el-image
|
||||
@ -95,6 +106,9 @@
|
||||
:src="BASEURL + '/image/' + item.photo"
|
||||
:preview-src-list="[BASEURL + '/image/' + item.photo]"
|
||||
>
|
||||
<template #error>
|
||||
<el-image :src="noDataImage" :preview-src-list="[noDataImage]" fit="contain" class="el-no-img" alt="" />
|
||||
</template>
|
||||
</el-image>
|
||||
<!-- <img :src="item.fieldAcquisitionUrl" alt="" srcset=""> -->
|
||||
</div>
|
||||
@ -110,6 +124,7 @@
|
||||
<div class="tabs-four" v-if="activeIndex == 3">
|
||||
<div class="tabList">
|
||||
<div>序号</div>
|
||||
<div>危大工程名称</div>
|
||||
<div>旁站记录</div>
|
||||
<div>图片</div>
|
||||
<div>记录人</div>
|
||||
@ -118,6 +133,7 @@
|
||||
<el-scrollbar class="listBox" ref="refScrollbar">
|
||||
<div v-for="(item, index) in partyMemberList" class="listStyle" :key="item.id">
|
||||
<div>{{index + 1}}</div>
|
||||
<div>{{item.engineeringName}}</div>
|
||||
<div>{{item.buildSituation}}</div>
|
||||
<div class="list-img">
|
||||
<el-image
|
||||
@ -126,6 +142,9 @@
|
||||
:src="BASEURL + '/image/' + item.imageUrl"
|
||||
:preview-src-list="[BASEURL + '/image/' + item.imageUrl]"
|
||||
>
|
||||
<template #error>
|
||||
<el-image :src="noDataImage" :preview-src-list="[noDataImage]" fit="contain" class="el-no-img" alt="" />
|
||||
</template>
|
||||
</el-image>
|
||||
<!-- <img :src="item.fieldAcquisitionUrl" alt="" srcset=""> -->
|
||||
</div>
|
||||
@ -147,6 +166,7 @@ import { ref, onMounted } from "vue";
|
||||
import { GlobalStore } from "@/stores";
|
||||
import { getCompanyDataList, getMemberInfoList } from "@/api/modules/labor";
|
||||
import type { TabsPaneContext } from 'element-plus'
|
||||
import noDataImage from "@/assets/images/vehicleManagement/car.png";
|
||||
import { getProgressRecordApi, getInspectionRecordApi, getEngineeringRecordApi, getSideStationApi } from "@/api/modules/agjtCommandApi";
|
||||
const store = GlobalStore();
|
||||
const props = defineProps(["tip"]);
|
||||
@ -183,6 +203,7 @@ const handleClick = (tab: TabsPaneContext, event: Event) => {
|
||||
// if(activeName.value === 'first') console.log('1')
|
||||
// if(activeName.value === 'second') console.log('2')
|
||||
// if(activeName.value === 'third') console.log('3')
|
||||
if(tab.index == activeIndex.value) return;
|
||||
activeIndex.value = tab.index
|
||||
partyMemberList.value = [];
|
||||
getMemberCountList('search')
|
||||
@ -316,6 +337,10 @@ onMounted(async () => {
|
||||
height: 100%;
|
||||
}
|
||||
}
|
||||
.el-no-img{
|
||||
width: 30px;
|
||||
height: 30px;
|
||||
}
|
||||
}
|
||||
div {
|
||||
width: 17%;
|
||||
@ -371,6 +396,10 @@ onMounted(async () => {
|
||||
height: 100%;
|
||||
}
|
||||
}
|
||||
.el-no-img{
|
||||
width: 30px;
|
||||
height: 30px;
|
||||
}
|
||||
}
|
||||
div {
|
||||
width: 17%;
|
||||
@ -426,6 +455,10 @@ onMounted(async () => {
|
||||
height: 100%;
|
||||
}
|
||||
}
|
||||
.el-no-img{
|
||||
width: 30px;
|
||||
height: 30px;
|
||||
}
|
||||
}
|
||||
div {
|
||||
width: 20%;
|
||||
@ -458,7 +491,7 @@ onMounted(async () => {
|
||||
margin-top: 2%;
|
||||
div {
|
||||
text-align: center;
|
||||
width: 20%;
|
||||
width: 17%;
|
||||
}
|
||||
}
|
||||
.listBox {
|
||||
@ -471,6 +504,10 @@ onMounted(async () => {
|
||||
font-size: 12px;
|
||||
margin-bottom: 5px;
|
||||
.list-img {
|
||||
.el-img {
|
||||
width: 50px;
|
||||
height: 25px;
|
||||
}
|
||||
.el-img {
|
||||
width: 30px;
|
||||
height: 30px;
|
||||
@ -481,9 +518,13 @@ onMounted(async () => {
|
||||
height: 100%;
|
||||
}
|
||||
}
|
||||
.el-no-img{
|
||||
width: 30px;
|
||||
height: 30px;
|
||||
}
|
||||
}
|
||||
div {
|
||||
width: 20%;
|
||||
width: 17%;
|
||||
white-space: nowrap; //单行
|
||||
overflow: hidden;
|
||||
text-overflow: ellipsis;
|
||||
|
||||
@ -2,23 +2,23 @@
|
||||
<div class="political-outlook">
|
||||
<div class="content">
|
||||
<div class="all-score">
|
||||
<span>综合得分:78</span>
|
||||
<span>综合得分:{{ countData.total || 0 }}</span>
|
||||
</div>
|
||||
<div class="all-title">
|
||||
<span>月度安全综合评分表</span>
|
||||
</div>
|
||||
<div class="all-subTitle">
|
||||
<span>工程名称:123测试工程</span>
|
||||
<span>表格日期:2024-05-10</span>
|
||||
<span>工程名称:{{projectData.projectName || ""}}</span>
|
||||
<span>表格日期:{{currentDate}}</span>
|
||||
</div>
|
||||
<div class="table-one">
|
||||
<div class="tabList">
|
||||
<div>考核分类</div>
|
||||
<div>考核指标</div>
|
||||
<div>指标说明</div>
|
||||
<div>单模块权重</div>
|
||||
<div>模块权重</div>
|
||||
<div>模块得分</div>
|
||||
<div style="width:15%;margin:0 0 0 0">考核分类</div>
|
||||
<div style="width:7%;margin:0 0 0 7%">考核指标</div>
|
||||
<div style="width:7%;margin:0 0 0 18%">指标说明</div>
|
||||
<div style="width:7%;margin:0 0 0 18.5%">单模块权重</div>
|
||||
<div style="width:7%;margin:0 0 0 4%">模块权重</div>
|
||||
<div style="width:7%;margin:0 0 0 1.5%">模块得分</div>
|
||||
</div>
|
||||
<el-scrollbar class="listBox" ref="refScrollbar">
|
||||
<div class="table-head-nine">
|
||||
@ -26,45 +26,51 @@
|
||||
<div class="category-title">
|
||||
<span>{{ key2 }}</span>
|
||||
</div>
|
||||
<div class="category-content">
|
||||
<div class="category-content" style="width:80%">
|
||||
<div v-for="(item, index3) in value2" :key="index3">
|
||||
<div>
|
||||
<span>{{ index3 + 1 }}</span>
|
||||
<span>{{ index3 }}</span>
|
||||
</div>
|
||||
<div>{{item.name}}</div>
|
||||
<div>
|
||||
<div style="width:50%">{{item.name}}</div>
|
||||
<div style="width:20%">
|
||||
<span>{{item.value}}</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="category-title">
|
||||
<span>{{ key2 }}</span>
|
||||
<div class="category-other" style="width: 10%">
|
||||
<span v-if="key2 == '隐患治理排查'">25%</span>
|
||||
<span v-else-if="key2 == '危大工程'">15%</span>
|
||||
<span v-else-if="key2 == '风险管理'">15%</span>
|
||||
<span v-else-if="key2 == '安全教育'">25%</span>
|
||||
</div>
|
||||
<div class="category-title">
|
||||
<span>{{ key2 }}</span>
|
||||
<div class="category-other" style="width: 10%">
|
||||
<span v-if="key2 == '隐患治理排查'">{{ countData.hiddenDangerScore || 0 }}</span>
|
||||
<span v-else-if="key2 == '危大工程'">{{ countData.dangerEngScore || 0 }}</span>
|
||||
<span v-else-if="key2 == '风险管理'">{{ countData.riskscore || 0 }}</span>
|
||||
<span v-else-if="key2 == '安全教育'">25</span>
|
||||
</div>
|
||||
</div>
|
||||
<div class="table-head-nine-part2">
|
||||
<div class="category-title">
|
||||
<div class="category-title" style="width: 14.6%">
|
||||
<span>AI报警</span>
|
||||
</div>
|
||||
<div class="category-title">
|
||||
<div class="category-title" style="width: 22%">
|
||||
<span>AI违章抓拍</span>
|
||||
</div>
|
||||
<div class="category-title">
|
||||
<div class="category-title" style="width:48%">
|
||||
<span>告警数量月度环比对比</span>
|
||||
</div>
|
||||
<div class="category-title">
|
||||
<span>123</span>
|
||||
<div class="category-title" style="width:5%">
|
||||
<span>100%</span>
|
||||
</div>
|
||||
<div class="category-title">
|
||||
<span>123</span>
|
||||
<div class="category-title" style="width: 10.4%;margin:0 0 0 0">
|
||||
<span> {{ countData.aiScore || 0 }}</span>
|
||||
</div>
|
||||
</div>
|
||||
<div class="table-head-nine-part3">
|
||||
<div><span>综合得分</span></div>
|
||||
<div>
|
||||
<span>89</span>
|
||||
<div style="width: 14.5%"><span>综合得分</span></div>
|
||||
<div style="width: 85.5%">
|
||||
<span>{{ countData.total || 0 }}</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@ -89,33 +95,54 @@
|
||||
<script lang="ts" setup>
|
||||
import { ref, onMounted } from "vue";
|
||||
import { GlobalStore } from "@/stores";
|
||||
import { getMemberJobStatusApi } from "@/api/modules/agjtCommandApi";
|
||||
import { getMemberJobStatusApi, getStatScoreApi } from "@/api/modules/agjtCommandApi";
|
||||
import { getProjectDetail } from "@/api/modules/projectOverview";
|
||||
import moment from "moment";
|
||||
const store = GlobalStore();
|
||||
const props = defineProps(["tip"]);
|
||||
const currentDate = ref("" as any);
|
||||
let pageNo = ref(1 as any);
|
||||
let moreScroll = ref(true as any);
|
||||
const refScrollbar = ref(null as any); // 绑定到滚动的盒子上
|
||||
const partyMemberList = ref({} as any);
|
||||
const value = ref({
|
||||
"隐患治理排查": {
|
||||
"隐患整改率": {name: 123,value: 456},
|
||||
"隐患及时整改率": {name: 123,value: 456},
|
||||
"隐患闭合率": {name: 123,value: 456},
|
||||
"隐患及时复查率": {name: 123,value: 456},
|
||||
"隐患自检数量": {name: 123,value: 456},
|
||||
"隐患整改率": {name: "隐患整改率=已整改(除了待整改和已撤回)/隐患总数(不包含排查记录)/隐患总数x100%",value: "30%"},
|
||||
"隐患及时整改率": {name: "及时整改率=状态是已整改(除了待整改和已撤回)的未超期整改的隐患记录数/状态是已整改(除了待整改和已撤回)的隐患总数x100%",value: "30%"},
|
||||
"隐患闭合率": {name: "隐患闭合率=状态是合格的隐患记录/隐患总数x100%",value: "20%"},
|
||||
"隐患自检数量": {name: "每周完成项目自检次数",value: "20%"},
|
||||
},
|
||||
"危大工程": {
|
||||
"危大工程覆盖率": {name: 123,value: 456},
|
||||
"旁站记录更新": {name: 123,value: 456},
|
||||
"危大工程排查覆盖率": {name: "危大工程排查覆盖率=实际排查天数/应排查天数x100%(在施危大工程应每天排查)",value: "60%"},
|
||||
"旁站记录更新": {name: "每周至少针对在施危大工程完成旁站记录次数",value: "40%"},
|
||||
},
|
||||
"风险管理": {
|
||||
"风险排查执行率": {name: 123,value: 456},
|
||||
"风险辨识数量": {name: 123,value: 456},
|
||||
"风险排查执行率": {name: "有排查记录的风险/生成待办任务的风险x100%",value: "99%"},
|
||||
"风险辨识数量": {name: "至少识别3个风险",value: "1%"},
|
||||
},
|
||||
"安全教育": {
|
||||
"三级入场教育完成率": {name: 123,value: 456}
|
||||
"三级入场教育完成率": {name: "三级入场教育完成率=三级教育完成人数/所有在岗人数",value: "100%"}
|
||||
}
|
||||
});
|
||||
const countData = ref({} as any)
|
||||
const projectData = ref({} as any);
|
||||
//获取项目信息
|
||||
const getProjectInfo = async () => {
|
||||
const res = await getProjectDetail({ projectSn: store.sn });
|
||||
console.log("获取项目信息666", res);
|
||||
// console.log("获取工程类别", projectTypeEnum);
|
||||
projectData.value = res.result;
|
||||
};
|
||||
// 获取统计数据
|
||||
const getStatScoreFn = async () => {
|
||||
let requestData: any = {
|
||||
projectSn: store.sn
|
||||
};
|
||||
const res: any = await getStatScoreApi(requestData);
|
||||
console.log("综合评分详情", res);
|
||||
countData.value = res.result;
|
||||
};
|
||||
|
||||
//获取数据
|
||||
const getMemberCountList = async (tip: any) => {
|
||||
let requestData: any = {
|
||||
@ -142,7 +169,10 @@ const getMemberCountList = async (tip: any) => {
|
||||
};
|
||||
|
||||
onMounted(async () => {
|
||||
currentDate.value = moment(new Date()).format("YYYY-MM-DD")
|
||||
await getProjectInfo();
|
||||
await getMemberCountList("search");
|
||||
await getStatScoreFn();
|
||||
refScrollbar.value.wrapRef.addEventListener("scroll", (e: any) => {
|
||||
// console.log("滚动容器", e);
|
||||
const scrollTop = e.target.scrollTop;
|
||||
@ -259,35 +289,52 @@ onMounted(async () => {
|
||||
flex-direction: column;
|
||||
.table-head-nine-part1 {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
// align-items: center;
|
||||
text-align: center;
|
||||
color: white;
|
||||
font-size: 14px;
|
||||
margin-bottom: 5px;
|
||||
.category-title {
|
||||
width: 17%;
|
||||
height: 100%;
|
||||
height: auto;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
flex-direction: column;
|
||||
justify-content: center;
|
||||
background-color: #102959;
|
||||
// overflow-wrap: anywhere;
|
||||
// text-align: left !important;
|
||||
}
|
||||
.category-other {
|
||||
width: 17%;
|
||||
height: auto;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
flex-direction: column;
|
||||
justify-content: center;
|
||||
background-color: #041E51;
|
||||
}
|
||||
.category-content {
|
||||
width: 49%;
|
||||
>div:nth-child(2n - 1){
|
||||
background-color: #041E51;
|
||||
}
|
||||
>div:nth-child(2n){
|
||||
background-color: #102959;
|
||||
}
|
||||
> div {
|
||||
width: 100%;
|
||||
height: 30px;
|
||||
line-height: 30px;
|
||||
height: auto;
|
||||
display: flex;
|
||||
>div{
|
||||
width: 33.3%;
|
||||
height: auto;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
white-space: nowrap;
|
||||
text-align: center;
|
||||
}
|
||||
>div:nth-child(2){
|
||||
line-height: 20px;
|
||||
text-align: left;
|
||||
justify-content: flex-start;
|
||||
}
|
||||
@ -296,10 +343,10 @@ onMounted(async () => {
|
||||
}
|
||||
.table-head-nine-part2 {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
text-align: center;
|
||||
color: white;
|
||||
font-size: 14px;
|
||||
margin-bottom: 5px;
|
||||
>div{
|
||||
height: 30px;
|
||||
line-height: 30px;
|
||||
@ -309,6 +356,10 @@ onMounted(async () => {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
white-space: nowrap;
|
||||
background-color: #102959;
|
||||
}
|
||||
>div:not(:first-child){
|
||||
background-color: #041E51;
|
||||
}
|
||||
> div:nth-child(2) {
|
||||
width: 17%;
|
||||
@ -317,7 +368,7 @@ onMounted(async () => {
|
||||
white-space: nowrap;
|
||||
}
|
||||
> div:nth-child(3) {
|
||||
width: 34%;
|
||||
width: 32%;
|
||||
text-align: left;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
@ -338,7 +389,6 @@ onMounted(async () => {
|
||||
}
|
||||
.table-head-nine-part3 {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
text-align: center;
|
||||
color: white;
|
||||
font-size: 14px;
|
||||
@ -351,15 +401,17 @@ onMounted(async () => {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
white-space: nowrap;
|
||||
background-color: #102959;
|
||||
> span:not(:first-child) {
|
||||
border-top: 1px solid #086d93;
|
||||
}
|
||||
}
|
||||
> div:nth-child(2) {
|
||||
width: 49%;
|
||||
width: 83%;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
white-space: nowrap;
|
||||
background-color: #041E51;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -44,6 +44,7 @@
|
||||
v-model="searchForm.status"
|
||||
:clearable="true"
|
||||
style="width: 150px"
|
||||
@change="conditionSearch"
|
||||
>
|
||||
<el-option v-for="(item, index) in statusList" :key="index" :label="item.name" :value="item.value" />
|
||||
</el-select>
|
||||
@ -57,8 +58,9 @@
|
||||
v-model="searchForm.level"
|
||||
:clearable="true"
|
||||
style="width: 150px"
|
||||
@change="conditionSearch"
|
||||
>
|
||||
<el-option v-for="(item, index) in levelListData" :key="index" :label="item.enterpriseName" :value="item.id" />
|
||||
<el-option v-for="(item, index) in levelListData" :key="index" :label="item.name" :value="item.value" />
|
||||
</el-select>
|
||||
</div>
|
||||
<div class="search-item">
|
||||
@ -67,11 +69,12 @@
|
||||
class="m-2"
|
||||
placeholder="请选择"
|
||||
size="small"
|
||||
v-model="searchForm.inspectId"
|
||||
v-model="searchForm.inspectManId"
|
||||
:clearable="true"
|
||||
style="width: 150px"
|
||||
@change="conditionSearch"
|
||||
>
|
||||
<el-option v-for="(item, index) in inspectList" :key="index" :label="item.realName" :value="item.id" />
|
||||
<el-option v-for="(item, index) in inspectList" :key="index" :label="item.realName" :value="item.userId" />
|
||||
</el-select>
|
||||
</div>
|
||||
<div class="search-item">
|
||||
@ -83,8 +86,9 @@
|
||||
v-model="searchForm.changeId"
|
||||
:clearable="true"
|
||||
style="width: 150px"
|
||||
@change="conditionSearch"
|
||||
>
|
||||
<el-option v-for="(item, index) in inspectList" :key="index" :label="item.realName" :value="item.id" />
|
||||
<el-option v-for="(item, index) in inspectList" :key="index" :label="item.realName" :value="item.userId" />
|
||||
</el-select>
|
||||
</div>
|
||||
<div class="search-item">
|
||||
@ -96,6 +100,7 @@
|
||||
v-model="searchForm.enterpriseId"
|
||||
:clearable="true"
|
||||
style="width: 150px"
|
||||
@change="conditionSearch"
|
||||
>
|
||||
<el-option v-for="(item, index) in enterpriseListData" :key="index" :label="item.enterpriseName" :value="item.id" />
|
||||
</el-select>
|
||||
@ -118,14 +123,22 @@
|
||||
<el-scrollbar class="listBox" ref="refScrollbar">
|
||||
<div v-for="(item, index) in partyMemberList" class="listStyle" :key="item.id">
|
||||
<div>{{index + 1}}</div>
|
||||
<div>{{statusList[item.status].name}}</div>
|
||||
<div>{{item.status?textFilter(item.status):''}}</div>
|
||||
<div>{{item.level?levelListData[item.level - 1].name:''}}</div>
|
||||
<div>{{item.regionName}}</div>
|
||||
<div>{{item.dangerItemContent}}</div>
|
||||
<div>{{item.changeLimitTime}}</div>
|
||||
<div>
|
||||
<el-tooltip class="box-item" effect="dark" :content="item.dangerItemContent" placement="top-start">
|
||||
<span>{{item.dangerItemContent}}</span>
|
||||
</el-tooltip>
|
||||
</div>
|
||||
<div>
|
||||
<el-tooltip class="box-item" effect="dark" :content="item.changeLimitTime" placement="top-start">
|
||||
<span>{{item.changeLimitTime}}</span>
|
||||
</el-tooltip>
|
||||
</div>
|
||||
<div>{{item.inspectManName}}</div>
|
||||
<div style="width: 15%;">{{item.inspectTime}}</div>
|
||||
<div>{{item.changeId}}</div>
|
||||
<div>{{item.changeName}}</div>
|
||||
<div>{{item.enterpriseName}}</div>
|
||||
</div>
|
||||
<div class="notoDta" v-if="partyMemberList.length == 0">
|
||||
@ -149,18 +162,18 @@ const BASEURL = import.meta.env.VITE_API_URL;
|
||||
const inspectList = ref([] as any);
|
||||
const enterpriseListData = ref([] as any);
|
||||
const levelListData = ref([
|
||||
{ name: "重大隐患", value: 1 },
|
||||
{ name: "较大隐患", value: 2 },
|
||||
{ name: "一般隐患", value: 3 },
|
||||
{ name: "低隐患", value: 4 }
|
||||
{ name: "一级", value: 1 },
|
||||
{ name: "二级", value: 2 },
|
||||
{ name: "三级", value: 3 },
|
||||
{ name: "四级", value: 4 }
|
||||
])
|
||||
const statusList = ref([
|
||||
{ name: "无需整改", value: 1 },
|
||||
// { name: "无需整改", value: 1 },
|
||||
{ name: "待整改", value: 2 },
|
||||
{ name: "待复查", value: 3 },
|
||||
{ name: "待核验", value: 4 },
|
||||
{ name: "合格", value: 5 },
|
||||
{ name: "不合格", value: 6 },
|
||||
{ name: "已撤回", value: 6 },
|
||||
{ name: "超期未关闭", value: 7 },
|
||||
]);
|
||||
let pageNo = ref(1 as any);
|
||||
@ -168,13 +181,25 @@ let moreScroll = ref(true as any);
|
||||
const refScrollbar = ref(null as any); // 绑定到滚动的盒子上
|
||||
const searchForm = ref({
|
||||
status: '',
|
||||
inspectId: '',
|
||||
inspectManId: '',
|
||||
changeId: '',
|
||||
enterpriseId: '',
|
||||
level: ''
|
||||
});
|
||||
const topDangerList = ref([] as any)
|
||||
const partyMemberList = ref({} as any);
|
||||
// 文本处理
|
||||
const textFilter = (val:any) => {
|
||||
console.log(val,777888)
|
||||
let findItem:any = statusList.value.find(item => {
|
||||
return item.value == val;
|
||||
})
|
||||
return findItem.name
|
||||
}
|
||||
// 条件查询
|
||||
const conditionSearch = async () => {
|
||||
getMemberCountList('search')
|
||||
}
|
||||
// 获取整改人、检查人
|
||||
const getSystemUserFn = async () => {
|
||||
let data = {
|
||||
|
||||
@ -77,23 +77,23 @@
|
||||
</div>
|
||||
<div>
|
||||
<el-tooltip class="box-item" effect="dark" :content="item.enterpriseName" placement="top-start">
|
||||
<text>{{ item.enterpriseName }}</text>
|
||||
<span>{{item.enterpriseName}}</span>
|
||||
</el-tooltip>
|
||||
</div>
|
||||
<div>
|
||||
<el-tooltip class="box-item" effect="dark" :content="item.personType == 1 ? item.teamName : item.departmentName" placement="top-start">
|
||||
<text>{{ item.personType == 1 ? item.teamName : item.departmentName }}</text>
|
||||
<span>{{ item.personType == 1 ? item.teamName : item.departmentName }}</span>
|
||||
</el-tooltip>
|
||||
</div>
|
||||
<div>
|
||||
<el-tooltip class="box-item" effect="dark" :content="item.idCard" placement="top-start">
|
||||
<text>{{ item.idCard }}</text>
|
||||
<span>{{item.idCard}}</span>
|
||||
</el-tooltip>
|
||||
</div>
|
||||
<div>{{ item.phoneNumber }}</div>
|
||||
<div>
|
||||
<el-tooltip class="box-item" effect="dark" :content="item.educationTime" placement="top-start">
|
||||
<text>{{ item.educationTime }}</text>
|
||||
<span>{{item.educationTime}}</span>
|
||||
</el-tooltip>
|
||||
</div>
|
||||
<div>{{ item.isExamPass == -1 ? "未培训" : item.isExamPass == 1 ? "合格" : "不合格" }}</div>
|
||||
|
||||
@ -3,7 +3,7 @@
|
||||
<div class="content">
|
||||
<div class="top-data-show">
|
||||
<div class="top-left">
|
||||
<el-date-picker v-model="dateTime" type="month" placeholder="请选择日期" value-format="YYYY-MM" :clearable="false"/>
|
||||
<el-date-picker v-model="dateTime" type="month" placeholder="请选择日期" value-format="YYYY-MM" :clearable="false" @change="dateChange"/>
|
||||
<el-calendar v-model="calendarVal" style="width: 95%; margin-top: 15px"/>
|
||||
</div>
|
||||
<div class="top-right">
|
||||
@ -89,6 +89,10 @@ const tableParams = ref({
|
||||
|
||||
const partyMemberList = ref({} as any);
|
||||
const topStatisticData = ref({} as any)
|
||||
// 日期切换
|
||||
const dateChange = async () => {
|
||||
calendarVal.value = dateTime.value
|
||||
};
|
||||
// 获取顶部数据
|
||||
const getDelayEventTypeFn = async () => {
|
||||
let requestData: any = {
|
||||
@ -132,7 +136,9 @@ watch(
|
||||
// console.log(newVal, "newVal");
|
||||
if (newVal) {
|
||||
// props.xData = newVal;
|
||||
console.log(newVal)
|
||||
tableParams.value.calendarVal = moment(newVal).format("YYYY-MM-DD")
|
||||
dateTime.value = moment(newVal).format("YYYY-MM-DD")
|
||||
getMemberCountList("search");
|
||||
}
|
||||
}
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user