城阳pc工作端前端代码
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

710 lines
20 KiB

<template>
<div>
<!-- <cpt-bread
@tap="clickBreadItem"
v-if="breadList.length > 1"
:bread-list="breadList"
/> -->
<div class="g-row">
<div class="g-left">
<div class="m-box">
<title-box
:text="`${currentLevel === 'district' ? '区' : currentLevel === 'street' ? '街道' : currentLevel === 'community' ? '社区' : currentLevel === 'grid' ? '网格' : ''}介绍`"/>
<jdjs :currentLevelData="currentLevelData"/>
</div>
<div class="m-box">
<title-box text="需求清单"/>
<RequirementList :currentLevelData="currentLevelData"/>
</div>
</div>
<div class="g-center">
<div :class="listShow ? 'm-map' : 'g-center-open'" style="overflow: hidden">
<map-top :currentLevelData="currentLevelData" :level="currentLevel" :peopleType="peopleType"
@changeType="changeType"/>
<div v-if="breadList.length > 1" class="go-back" @click="goBackMap">
<img src="~@/assets/images/shuju/overview/go-back.png"/>
</div>
<grid-map
ref="map"
:level="currentLevel"
:peopleType="peopleType"
:srcGridData="orgData"
@clickAgency="clickAgencyItem"
@clickDotBtn="handleClickDotBtn"
@resourcesPointClick="resourcesPointClick"
@showMapDialog="showMapDialog"
/>
<div class="map-legend">
<div class="legend-title">
供需匹配地图
</div>
<div class="legend-list">
<div class="legend-item blue">
未完成需求
</div>
<div class="legend-item orange">
难解决问题
</div>
<div class="legend-item green">
可调配资源
</div>
<div class="legend-item red">
不满意问题
</div>
</div>
</div>
</div>
</div>
<div class="g-right">
<div class="m-box">
<title-box text="问题清单"></title-box>
<wtqd v-if="eventType === 1" :currentLevelData="currentLevelData" :date="sjhfDate"/>
</div>
</div>
</div>
<!--
-- MapDialog
-- type必填
-- njjwtqk = 难解决问题情况
-- bmysxqk = 不满意事项情况
-- xqwwcqk = 需求未完成情况
-->
<MapDialog ref="MapDialog" :type="mapType"/>
<cpt-loading v-show="false"/>
<MapResourceInfo ref="MapResourceInfo" :currentLevelData="currentLevelData"/>
</div>
</template>
<script>
import gridMap from "@/views/dataBoard/cpts/sjkb-map/index";
import cptBread from "@/views/dataBoard/renfang/cpts/bread";
import cptLoading from "@/views/dataBoard/cpts/loading";
import titleBox from "@/views/dataBoard/satisfactionEval/components/Title";
import jdjs from "@/views/dataBoard/overview/components/jdjs.vue";
import jdtphx from "@/views/dataBoard/overview/components/jdtphx.vue";
import mapTop from "@/views/dataBoard/overview/components/map-top.vue";
import jdwgy from "@/views/dataBoard/overview/components/jdwgy.vue";
import rfsjtj from "@/views/dataBoard/overview/components/rfsjtj.vue";
import sqrfph from "@/views/dataBoard/overview/components/sqrfph.vue";
import sq12345 from "@/views/dataBoard/overview/components/sq12345.vue";
import RequirementList from "@/views/dataBoard/overview/components/RequirementList.vue";
import DynamicHumanRoomData from "@/views/dataBoard/overview/components/DynamicHumanRoomData.vue";
import GridUpdateRanking from "@/views/dataBoard/overview/components/GridUpdateRanking.vue";
import CommunityResult from "@/views/dataBoard/overview/components/CommunityResult.vue";
import EventAndFollowUp from "@/views/dataBoard/overview/components/EventAndFollowUp.vue";
import wtqd from "@/views/dataBoard/overview/components/wtqd.vue";
import MapDialog from "@/views/dataBoard/overview/components/MapDialog/index.vue";
import RankingGridData from "@/views/dataBoard/overview/components/RankingGridData.vue";
import FollowUp from "@/views/dataBoard/overview/components/FollowUp.vue";
import Tabs from "@/views/dataBoard/satisfactionEval/components/Tabs/index.vue";
import {requestPostBi} from "@/js/dai/request-bipass";
import {requestPost} from "@/js/dai/request";
import {spliceIntoChunks} from "@/utils/index";
import MapResourceInfo from "@/views/dataBoard/overview/components/MapResourceInfo.vue";
export default {
name: "renfang",
components: {
gridMap,
cptLoading,
cptBread,
titleBox,
jdjs,
jdtphx,
mapTop,
jdwgy,
rfsjtj,
sqrfph,
sq12345,
DynamicHumanRoomData,
CommunityResult,
EventAndFollowUp,
RankingGridData,
GridUpdateRanking,
FollowUp,
Tabs,
wtqd,
RequirementList,
MapDialog,
MapResourceInfo
},
data() {
return {
loading: false,
rfphDate: this.$moment().subtract(1, "month").format("YYYY-MM"),
sq12345Date: this.$moment().subtract(1, "month").format("YYYY-MM"),
sqzcDate: this.$moment().subtract(1, "month").format("YYYY-MM"),
sjhfDate: this.$moment().subtract(1, "month").format("YYYY-MM"),
sqwggxDate: this.$moment().subtract(1, "month").format("YYYY-MM"),
orgData: {
children: [],
}, //当前组织对象
orgId: "",
orgLevel: "",
currentLevel: "",//地图对应level
currentLevelData: {
orgId: this.$store.state.chooseArea.chooseName.orgId,
orgLevel: this.$store.state.chooseArea.chooseName.level,
meta: {title: "人房总览"},
},
breadList: [
{
orgId: "",
orgLevel: "",
id: "",
level: "",
meta: {title: "人房总览"},
},
],
peopleList: {
staffGrid: "网格员",
staffDepartment: "单位/组织",
staffAgency: "社区工作者",
chief: "楼长/单元长",
publicWelfareNum: "公益岗",
volunteer: "志愿者",
unit: "微网格",
building: "楼栋",
},
displayedResiId: "",
displayedHouseId: "",
dynamicType: 1,
dynamicTypeList: [
{
value: 1,
label: "更新动态",
},
{
value: 2,
label: "网格更新排行",
},
],
eventType: 1,
eventTypeList: [
{
value: 1,
label: "12345事件",
},
{
value: 2,
label: "事件回访",
},
],
customerName: "",
peopleType: "staffAgency",
listShow: true,
mapType: ''
};
},
mounted() {
// const queryOrgId = getQueryPara("orgId");
// const queryOrgLevel = getQueryPara("orgLevel");
// this.init(queryOrgId, queryOrgLevel);
this.changeCustomerName();
this.getMapData();
// this.$refs.map.setNumpoint()
},
watch: {
"$store.state.chooseArea.chooseName"(val) {
if (val.orgId) {
this.currentLevelData = {
...this.currentLevelData,
...val,
orgLevel: val.level,
};
// this.getMapData();
}
},
},
methods: {
changeCustomerName() {
this.customerName = localStorage.getItem("customerNameDataBoard") || "数据分析可视化平台";
},
changeType(e) {
this.peopleType = e;
},
dynamicTypeChange(val) {
this.dynamicType = val;
},
eventTypeChange(val) {
this.eventType = val;
},
async init(queryOrgId, queryOrgLevel) {
if (queryOrgId) {
this.orgId = queryOrgId;
this.orgLevel = queryOrgLevel || "agency";
} else {
this.orgId = this.$store.state.user.agencyId;
this.orgLevel = "agency";
}
//加载组织数据
this.loading = false;
await this.getMapData();
// await this.getSubMapData();
this.loading = true;
},
changeDate(e) {
this.rfphDate = e;
},
handleClickDotBtn(type, info) {
if (type == "watch-resi") {
this.displayedResiId = info.user_id;
} else if (type == "watch-house") {
this.displayedHouseId = info.house_id;
}
},
clickBreadItem({item}) {
this.toBread(item);
},
clickAgencyItem(item) {
this.$refs.map.clearMarkert();
if (item.id) {
if (item.level == "grid") {
this.customerName = item.parentName + "-" + item.name;
} else {
this.customerName = item.name || item.meta.title;
}
this.currentLevelData = {
orgId: item.id,
orgLevel: item.level,
};
} else {
this.customerName = localStorage.getItem("customerNameDataBoard") || "数据分析可视化平台";
this.currentLevelData = {
...this.$store.state.chooseArea.chooseName,
orgLevel: this.$store.state.chooseArea.chooseName.level,
};
}
this.toBread({
orgId: item.id,
orgLevel: item.level,
meta: {title: item.name},
name: item.name,
parentName: item.parentName,
});
},
goBackMap() {
const item = this.breadList[this.breadList.length - 2];
this.clickAgencyItem(item);
},
toBread(item) {
const {orgId} = item;
const {breadList} = this;
let index = breadList.findIndex((val) => val.orgId === orgId);
if (index >= 0) {
this.breadList = breadList.slice(0, index + 1);
} else {
breadList.push({...item, id: item.orgId, level: item.orgLevel});
this.breadList = breadList;
}
this.getMapData(item.orgId, item.orgLevel);
},
getCenterPoint(geoCoordinateList) {
const geoCoordinateListFlat = geoCoordinateList.reduce((s, v) => {
return (s = s.concat(v))
}, [])
const total = geoCoordinateListFlat.length
let X = 0
let Y = 0
let Z = 0
for (const g of geoCoordinateListFlat) {
const lat = g.lat * Math.PI / 180
const lon = g.lng * Math.PI / 180
const x = Math.cos(lat) * Math.cos(lon)
const y = Math.cos(lat) * Math.sin(lon)
const z = Math.sin(lat)
X += x
Y += y
Z += z
}
X = X / total
Y = Y / total
Z = Z / total
const Lon = Math.atan2(Y, X)
const Hyp = Math.sqrt(X * X + Y * Y)
const Lat = Math.atan2(Z, Hyp)
return {lng: Lon * 180 / Math.PI, lat: Lat * 180 / Math.PI}
},
// 点击搜索结果条目,在地图上显示点和详情弹窗
handleClickSearchItem(item) {
if (!item.longitude) {
return this.$message.error("请先设置坐标");
}
this.$refs.map.setDotMarker(item, [parseFloat(item.longitude), parseFloat(item.latitude)]);
},
setNum(data) {
// data
let params = [];
let org = this.orgData.children;
org.forEach((item) => {
data.forEach((item2) => {
let coordinates = spliceIntoChunks(item.coordinates.split(",").map((item) => parseFloat(item)), 2)
let coordinates2 = coordinates.map(item3 => {
return [{
lat: item3[1],
lng: item3[0]
}]
})
let index = parseInt(coordinates.length / 2)
let centerLngLat = this.getCenterPoint(coordinates2)
// spliceIntoChunks
if (item2.orgId === item.id && item.coordinates) {
params.push({
...item2,
peopleType: this.peopleList[this.peopleType],
latitude: centerLngLat.lat,
longitude: centerLngLat.lng,
coordinates
});
}
});
});
// if (params.length) {
this.$refs.map.setNum(params);
// }
},
upDownShow() {
this.listShow = !this.listShow;
},
setPoint(data) {
// if (data) {
this.$refs.map.setPoint(data, this.currentLevel, this.peopleType);
// }
},
//获取地图上显示的组织数据
async getMapData(orgId = this.$store.state.chooseArea.chooseName.orgId, level = this.$store.state.chooseArea.chooseName.level) {
const url = "org_map";
this.$http.post(`/gov/org/agency/maporg`, {orgId, level}).then(({data: {data}}) => {
this.orgData = data;
this.orgId = this.orgData.id;
this.orgLevel = this.orgData.level;
this.currentLevel = this.orgData.agencyLevel;
this.currentLevelData = {
orgId: this.orgId,
orgLevel: this.currentLevel,
};
console.log(this.currentLevelData, 'this.currentLevelData 33210')
this.peopleType = this.currentLevel === "grid" ? "unit" : "staffAgency";
this.$refs.map.removeResourcesPoint();
// console.log(level,'level',orgId ,level === 'agency ' || level === 'community' || level === 'grid')
if (level === 'agency' || level === 'community' || level === 'grid') {
this.setResourcesPoint({agencyId: orgId})
}
this.getMapCount()
});
},
showMapDialog(data) {
if (data.type === "resources") {
this.clickAgencyItem(data)
} else {
// -- njjwtqk = 难解决问题情况
// -- bmysxqk = 不满意事项情况
// -- xqwwcqk = 需求未完成情况
switch (data.type) {
case 'events':
this.mapType = "xqwwcqk";
break;
case 'services':
this.mapType = "bmysxqk";
break;
case 'problems':
this.mapType = "njjwtqk";
break;
}
this.$refs.MapDialog.open({
orgId: data.agencyId,
orgLevel: data.level
}, this.mapType)
}
},
resourcesPointClick(data) {
this.$refs.MapResourceInfo.open(data.id, data.dataClass)
},
setResourcesPoint({agencyId}) {
this.$http.get('/actual/base/dataBoard/resource/search?keyword=&agencyId=' + agencyId).then(res => {
let data = res.data.data;
data = data.filter(item => item.latitude && item.longitude)
data = data.map(item => {
return {
...item,
latitude: item.latitude * 1,
longitude: item.longitude * 1
}
})
this.$refs.map.setResourcesPoint(data)
})
},
getMapCount() {
this.$http.get('/governance/icEvent/statOrgResourceAndEventCount?agencyId=' + this.orgId).then(res => {
let countData = res.data.data
let orgDataids = this.orgData.children.map(item => item.id)
countData.forEach(item => {
let orgDataIndex = orgDataids.indexOf(item.agencyId)
if (orgDataIndex > -1) {
let curOrgData = this.orgData.children[orgDataIndex];
item.data = item.data.map(item2 => {
return {
...curOrgData,
...item2,
agencyId: item.agencyId
}
})
item.data.forEach(item3 => {
let coordinates = spliceIntoChunks(item3.coordinates.split(",").map((coordinatesItem) => parseFloat(coordinatesItem)), 2)
let coordinates2 = coordinates.map(item4 => {
return [{
lat: item4[1],
lng: item4[0]
}]
})
let centerLngLat = this.getCenterPoint(coordinates2)
if (item3.hasOwnProperty("services")) {
item3.type = 'services'
item3.num = item3.services;
item3.offsets = [50, 50];
item3.latitude = centerLngLat.lat
item3.longitude = centerLngLat.lng
}
if (item3.hasOwnProperty("resources")) {
item3.type = 'resources'
item3.num = item3.resources;
item3.offsets = [-50, 50];
item3.latitude = centerLngLat.lat + 0.0018
item3.longitude = centerLngLat.lng
}
if (item3.hasOwnProperty("problems")) {
item3.type = 'problems'
item3.num = item3.problems;
item3.offsets = [50, -50];
item3.latitude = centerLngLat.lat
item3.longitude = centerLngLat.lng + .0018
}
if (item3.hasOwnProperty("events")) {
item3.type = 'events'
item3.num = item3.events;
item3.offsets = [-50, -50];
item3.latitude = centerLngLat.lat + .0018
item3.longitude = centerLngLat.lng + .0018
}
})
}
})
console.log(countData, 'countData')
this.$refs.map.setNumpoint(countData)
// console.log(countData,'countData')
})
},
//获取地图上显示的组织数据
async getSubMapData() {
const url = "sub_org_map";
const {data, code, msg} = await requestPostBi(
url,
{
queryParam: {
org_id: this.orgId,
},
},
{
// mockId: 61831860,
}
);
if (code === 0) {
const {orgData} = this;
orgData.children = data.map((item) => {
return {
...item,
id: item.org_id,
name: item.org_name,
latitude: parseFloat(item.latitude),
longitude: parseFloat(item.longitude),
coordinates: item.coordinates || "",
};
});
this.orgData = {...orgData};
} else {
this.$message.error(msg);
}
},
//加载组织数据
async loadOrgData() {
const url = "/gov/org/agency/maporg";
let params = {
orgId: this.orgId,
level: this.orgLevel,
};
const {data, code, msg} = await requestPost(url, params);
if (code === 0) {
this.orgData = data;
this.orgId = this.orgId;
this.orgLevel = this.orgData.level;
} else {
this.$message.error(msg);
}
},
handelClickRkfxPei(val) {
console.log(val);
},
},
};
</script>
<style lang="scss" scoped>
.g-center {
width: 930px !important;
}
.up-style {
width: 51%;
img {
width: 12px;
height: 12px;
}
img:hover {
cursor: pointer;
}
}
.go-back {
position: absolute;
z-index: 100;
top: 24px;
right: 0;
left: 16px;
width: 64px;
img {
width: 36px;
height: 36px;
}
img:hover {
cursor: pointer;
}
}
.date-current-weiyi {
background: #000;
}
</style>
<style lang="scss" scoped src="@/assets/scss/dataBoard/overview/index.scss"></style>
<style lang="scss" scoped>
.tabs {
padding: 10px 11px 0px;
}
.sjkb-map {
width: 930px;
}
.map-legend {
position: absolute;
right: 17px;
bottom: 20px;
width: 148px;
color: #fff;
.legend-title {
font-size: 16px;
font-weight: bold;
display: flex;
align-items: center;
justify-content: center;
width: 100%;
height: 32px;
margin-bottom: 4px;
background: url("@/assets/images/overview/map_legend_title.png");
}
.legend-list {
box-sizing: border-box;
width: 126px;
margin: 0 auto;
padding: 19px 12px;
border: 1px solid #488CC5;
background: rgba(#0A2351, 0.66);
.legend-item {
font-size: 14px;
display: flex;
align-items: center;
margin-bottom: 7px;
&:before {
margin-right: 6px;
}
&.blue {
&:before {
display: block;
width: 16px;
height: 18px;
content: '';
background: url("@/assets/images/overview/map_legend_blue.png");
}
}
&.orange {
&:before {
display: block;
width: 16px;
height: 18px;
content: '';
background: url("@/assets/images/overview/map_legend_orange.png");
}
}
&.green {
&:before {
display: block;
width: 16px;
height: 18px;
content: '';
background: url("@/assets/images/overview/map_legend_green.png");
}
}
&.red {
&:before {
display: block;
width: 16px;
height: 18px;
content: '';
background: url("@/assets/images/overview/map_legend_red.png");
}
}
}
}
}
.m-map {
height: 1050px;
}
</style>