fix:系统迭代

This commit is contained in:
HH 2024-07-15 15:15:57 +08:00
parent fc561875fd
commit 64a9c62dab
11 changed files with 383 additions and 50 deletions

View File

@ -88,3 +88,11 @@ export function emerMapInfo(params) {
params: params params: params
}); });
} }
// 地图控制树形
export function mapControlList() {
return request({
url: `/screen/index/mapControlList`,
method: "GET",
});
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.2 KiB

View File

@ -3,7 +3,7 @@
</template> </template>
<script lang="ts"> <script lang="ts">
import { defineComponent, onMounted, ref, watchEffect, createApp } from "vue"; import { defineComponent, onMounted, ref, watchEffect, createApp, watch, computed } from "vue";
export default defineComponent({ export default defineComponent({
name: "MarsMap", name: "MarsMap",
}); });
@ -24,6 +24,10 @@ import {
import * as mars3d from "mars3d"; import * as mars3d from "mars3d";
import { useModelStore } from "@/store";
const store = useModelStore();
const resourcenum = computed(() => store.getLayerType);
const props = defineProps<{ const props = defineProps<{
json: string; json: string;
point: any[]; point: any[];
@ -84,6 +88,17 @@ const mapOptions: any = {
show: true, show: true,
}, },
], ],
clustering: {
enabled: true, //
pixelRange: 20, //
// ...
},
symbol: {
type: "billboardP",
styleOptions: {
// ...
}
}
}; };
/** /**
@ -110,6 +125,7 @@ const initMars3d = (option: any) => {
}); });
map.on(mars3d.EventType.click, map_clickHandler, this); map.on(mars3d.EventType.click, map_clickHandler, this);
loadLayer(geoJsonAreaUrl, geoJsonUrl.value); loadLayer(geoJsonAreaUrl, geoJsonUrl.value);
}; };
// //
@ -149,10 +165,18 @@ const getEmerRiskPoolList = () => {
emerRiskPoolList({}).then((res: any) => { emerRiskPoolList({}).then((res: any) => {
res.data.forEach((item) => { res.data.forEach((item) => {
// console.log(item, "item===>"); // console.log(item, "item===>");
addMark(item.lon, item.lat, "icon-wl", 2, item.poolId, item); addMark(item.lon, item.lat, "icon-wl-"+ item.poolState, 2, item.poolId, item);
}); });
}); });
}; };
const getPoolList = (id: any) => {
console.log(id, "item===>");
emerRiskPoolList({typeId:id}).then((res: any) => {
res.data.forEach((item:any) => {
addMark(item.lon, item.lat, "icon-wl", 2, item.poolId, item);
});
});
}
// //
const getEmerWareHouseList = () => { const getEmerWareHouseList = () => {
emerWareHouseList({}).then((res: any) => { emerWareHouseList({}).then((res: any) => {
@ -186,7 +210,12 @@ const getdomicileList = () => {
* 加载图层 * 加载图层
*/ */
const loadLayer = (insideJson: string, outJson: string) => { const loadLayer = (insideJson: string, outJson: string) => {
graphicLayer.value = new mars3d.layer.GraphicLayer(); graphicLayer.value = new mars3d.layer.GraphicLayer({
// clustering: {
// enabled: true, //
// pixelRange: 20
// }
});
map.addLayer(graphicLayer.value); map.addLayer(graphicLayer.value);
initListener(); initListener();
@ -195,15 +224,15 @@ const loadLayer = (insideJson: string, outJson: string) => {
loadInArea(insideJson); loadInArea(insideJson);
// //
getEmerShelterList(); // getEmerShelterList();
// //
getEmerRiskPoolList(); getEmerRiskPoolList();
// //
getEmerWareHouseList(); // getEmerWareHouseList();
// //
getemerEventList(); // getemerEventList();
// //
getdomicileList(); // getdomicileList();
}; };
/** /**
@ -518,6 +547,29 @@ const addMark = (
}); });
graphicLayer.value.addGraphic(graphic); graphicLayer.value.addGraphic(graphic);
}; };
/**
* 清除标点
*/
const removeGraphicsByType = (typeToRemove:any) => {
//
graphicLayer.value.graphics.forEach((graphic:any, index:any) => {
// objectsToExclude type type
if (graphic.objectsToExclude) {
if (graphic.objectsToExclude.type === typeToRemove || graphic.objectsToExclude.id === typeToRemove) {
// console.log('------>',graphic.objectsToExclude)
//
graphicLayer.value.removeGraphic(graphic);
}
}
});
}
const removeGraType = (id:any) => {
emerRiskPoolList({typeId:id}).then((res: any) => {
res.data.forEach((item:any) => {
removeGraphicsByType(item.poolId)
});
});
}
/** /**
* 加载弹窗 * 加载弹窗
*/ */
@ -541,6 +593,28 @@ const getImageUrl = (name: string) => {
// //
const wholeNumber = ref({}); const wholeNumber = ref({});
//
watch((resourcenum), (val: any) => {
if (val.name === '应急仓库') {
val.show ? getEmerWareHouseList():removeGraphicsByType(3)
}
else if (val.name === '风险池') {
val.show ? getEmerRiskPoolList():removeGraphicsByType(2)
}
else if (val.name === '户籍列表') {
val.show ? getdomicileList():removeGraphicsByType(5)
}
else if (val.name === '避难场所') {
val.show ? getEmerShelterList():removeGraphicsByType(1)
}
else if (val.name === '应急上报事件') {
val.show ? getemerEventList():removeGraphicsByType(4)
}else {
val.show ? getPoolList(val.id):removeGraType(val.id)
}
})
onMounted(() => { onMounted(() => {
emerMapInfo({}).then((res: any) => { emerMapInfo({}).then((res: any) => {
// console.log(res, "res===>"); // console.log(res, "res===>");

View File

@ -7,9 +7,11 @@ export default defineComponent({
}); });
</script> </script>
<script setup lang="ts"> <script setup lang="ts">
const title = import.meta.env.VITE_TITLE;
import { ClickOutside as vClickOutside } from "element-plus"; import { ClickOutside as vClickOutside } from "element-plus";
import TopOption from "../../../views/top-menu/top-option.vue"; import TopOption from "../../../views/top-menu/top-option.vue";
import Toplayer from "../../../views/top-menu/top-layer.vue";
const title = import.meta.env.VITE_TITLE;
const buttonRef = ref(); const buttonRef = ref();
const popoverRef = ref(); const popoverRef = ref();
const onClickOutside = () => { const onClickOutside = () => {
@ -22,6 +24,8 @@ const onClickOutside = () => {
<h1 class="top-title">{{ title }}</h1> <h1 class="top-title">{{ title }}</h1>
<div class="top_option"> <div class="top_option">
<!-- 图层控制 --> <!-- 图层控制 -->
<Toplayer></Toplayer>
<!-- 标题 -->
<TopOption></TopOption> <TopOption></TopOption>
</div> </div>
</header> </header>

View File

@ -1,2 +1,36 @@
import { createPinia } from "pinia";
import { defineStore, createPinia } from "pinia";
export const useModelStore = defineStore("model", {
state: () => ({
model: true,
layerType: {},//图层显示
checkednum: [],//选中图层
}),
getters: {
getModel(): boolean {
return this.model;
},
getLayerType(): object {
return this.layerType
},
getcheckednum(): any {
return this.checkednum
},
},
actions: {
setModel(model: boolean) {
this.model = model;
},
setLayerType(value: object) {
this.layerType = value;
},
setcheckednum(value: any) {
this.checkednum = value;
},
},
});
export default createPinia(); export default createPinia();

View File

@ -369,8 +369,13 @@ table {
background-color: transparent !important; background-color: transparent !important;
} }
.el-tree {
background-color: transparent !important;
}
.el-tree-node__content { .el-tree-node__content {
background-color: #2c5473 !important; // background-color: #2c5473;
background-color: transparent !important;
} }
.el-select__placeholder { .el-select__placeholder {

View File

@ -3,7 +3,7 @@
<div class="side-bg"> <div class="side-bg">
<TitleC title="精准画像"></TitleC> <TitleC title="精准画像"></TitleC>
<TitleD width="100"> <TitleD width="100">
<div class="module_top_title_con" style="width: 200px;"> <div class="module_top_title_con" style="width: 200px;margin-bottom: 0px;">
<el-tree-select <el-tree-select
v-model="listperformid" v-model="listperformid"
:data="treelist" :data="treelist"
@ -13,14 +13,11 @@
filterable filterable
@change="filterPostchange" @change="filterPostchange"
clearable clearable
placeholder="请选择岗位"
/> />
</div> </div>
</TitleD> </TitleD>
<div class="portrait_con conBox"> <div class="portrait_con conBox">
<!-- 222222222222222
<div>
<img style="width: 100%;" src="@/assets/images/home-page/left/lingjiangtai.png" alt="" />
</div> -->
<div class="podium-container"> <div class="podium-container">
<img src="@/assets/images/home-page/left/lingjiangtai.png" alt="Podium" class="podium-img"> <img src="@/assets/images/home-page/left/lingjiangtai.png" alt="Podium" class="podium-img">
<div class="name-position" v-for="(item, index) in portraitList" :key="index"> <div class="name-position" v-for="(item, index) in portraitList" :key="index">

View File

@ -3,20 +3,18 @@
<div class="side-bg"> <div class="side-bg">
<TitleC title="精准画像"></TitleC> <TitleC title="精准画像"></TitleC>
<TitleD width="100"> <TitleD width="100">
<div class="module_top_title_con"> <div class="module_top_title_con" style="width: 200px;margin-bottom: 0px;">
<div <el-tree-select
class="module_top_title" v-model="listperformid"
v-for="(item, index) in label" :data="treelist"
:key="index" :render-after-expand="false"
@click="clickMenuOption(item.id)" check-strictly
:class=" :filter-node-method="filterPostMethod"
item.check == true filterable
? 'module_menu_selected' @change="getWorkPerformProgress"
: 'module_menu_notSelected' clearable
" placeholder="请选择岗位"
> />
{{ item.title }}
</div>
</div> </div>
</TitleD> </TitleD>
<div class="portrait_con conBox"> <div class="portrait_con conBox">
@ -28,13 +26,13 @@
<div> <div>
<div> <div>
<span>{{ index + 1 }}</span> <span>{{ index + 1 }}</span>
<span v-if="labelId == 1" @click="toBackgroundManage()" <span @click="toBackgroundManage()"
>{{ item.chinaName }}-{{ item.postName }}</span >{{ item.chinaName }}-{{ item.postName }}</span
> >
<span v-if="labelId == 2">{{ item.orgName }}</span> <!-- <span v-if="labelId == 2">{{ item.orgName }}</span>
<span v-if="labelId == 3" <span v-if="labelId == 3"
>{{ item.chinaName }}-{{ item.postName }}</span >{{ item.chinaName }}-{{ item.postName }}</span
> > -->
</div> </div>
<div> <div>
<span>{{ item.percentage }}</span> <span>{{ item.percentage }}</span>
@ -60,29 +58,17 @@ export default defineComponent({
}); });
</script> </script>
<script setup lang='ts'> <script setup lang='ts'>
import { workPerformProgress } from "@/api/homePage"; import { workPerformProgress, getListperformTree } from "@/api/homePage";
const labelId = ref(1); const labelId = ref();
const label = ref([ const listperformid = ref('');
{ title: "政府人员", check: true, id: 1 },
{ title: "村(社区)干部", check: false, id: 2 },
{ title: "党员", check: false, id: 3 },
]);
const clickMenuOption = (id: any) => {
labelId.value = id;
label.value.forEach((item) => {
item.check = false;
if (item.id == id) {
item.check = true;
}
});
getWorkPerformProgress();
};
const portraitList = ref([]); const portraitList = ref([]);
const treelist = ref([])
//list //list
const getWorkPerformProgress = () => { const getWorkPerformProgress = () => {
let params = { let params = {
sysYear: null, sysYear: null,
typeId: labelId.value, pageType:1,
listperformid: listperformid.value,
}; };
workPerformProgress(params).then((res: any) => { workPerformProgress(params).then((res: any) => {
portraitList.value = res.data; portraitList.value = res.data;
@ -94,6 +80,24 @@ const getWorkPerformProgress = () => {
}); });
}); });
}; };
const filterPostMethod = (value, data) => data.label.includes(value);
//
const getgetListperformTree = () => {
getListperformTree().then((res: any) => {
treelist.value = handlePostData(res.data);
})
}
/**处理组织数据 */
let handlePostData = (list) => {
let data = list.map((item) => {
return {
label: item.performclassname,
value: item.listperformid,
children: item.children ? handlePostData(item.children) : [],
};
});
return data;
};
// //
const toBackgroundManage = () => { const toBackgroundManage = () => {
window.open( window.open(
@ -104,6 +108,7 @@ const toBackgroundManage = () => {
onMounted(() => { onMounted(() => {
getWorkPerformProgress(); getWorkPerformProgress();
getgetListperformTree();
}); });
</script> </script>

View File

@ -0,0 +1,206 @@
<!-- -->
<template>
<div class="top-menu">
<el-popover placement="bottom-end" trigger="click" popper-style="background-color:transparent;border:0px"
open-animation="popover">
<template #reference>
<el-button style="margin-right: 16px">
<div class="top_option">
<img src="@/assets/images/top/top-option-layer.png" alt="" />
<span>图层控制</span>
</div>
</el-button>
</template>
<div class="side-bgss">
<el-tree-v2 style="max-width: 600px;background: none;" ref="treeRef" :data="Tree" :props="defaultProps"
show-checkbox :height="208" @check-change="handleCheckChange" node-key="id"
:default-checked-keys="checkednum">
<template #default="{ node, data }">
<div class="custom-tree-node">
<!-- <img v-if="data.img" :src="getImageUrl(data.img)" style="width: 20px;height: 20px;" alt="" /> -->
<span class="pl-1">{{ data.typeName }}</span>
</div>
</template>
</el-tree-v2>
</div>
</el-popover>
</div>
</template>
<script lang="ts">
import { defineComponent, ref, unref, computed, onMounted, watch } from "vue";
export default defineComponent({
name: "TopOption",
});
</script>
<script setup lang='ts'>
import { ClickOutside as vClickOutside } from "element-plus";
import { mapControlList } from "@/api/map"
import { useModelStore } from "@/store";
const store = useModelStore();
const url = ref(import.meta.env.VITE_ICON);
const treeRef = ref();
const popoverRef = ref();
const checkednum = ref(['1']);//
const handleCheckChange = (
data: any,
checked: any,
) => {
if (checked) {
store.setLayerType({ id: data.typeId, name: data.typeName,show:true})
} else {
store.setLayerType({ id: data.typeId, name: data.typeName,show:false})
}
checkednum.value = treeRef.value.getCheckedKeys()
store.setcheckednum(checkednum.value)
}
const Tree = ref([])
const defaultProps = {
children: 'children',
label: 'typeName',
value: 'typeId',
}
/**
* 获取地图图标
*/
const getImageUrl = (name: string) => {
const path = `/src/assets/images/marks/${name}.png`;
const modules = import.meta.globEager("/src/assets/images/marks/*.png");
return modules[path].default;
};
const getmapControlList = () => {
mapControlList().then((res: any) => {
Tree.value = res.data;
})
}
onMounted(() => {
getmapControlList();
// store.setLayerType({ type: 1, show: true })
});
</script>
<style lang="scss" scoped>
.top-menu {
position: fixed;
top: $TopHeight;
left: $sideWidth;
right: $sideWidth;
margin: 0 1%;
display: flex;
flex-direction: row;
justify-content: flex-start;
color: #ffffff;
z-index: 1;
}
.top_option {
width: 100px;
height: 35px;
display: flex;
align-items: center;
background-image: url("@/assets/images/top/top-option-bg.png");
background-size: 100% 100%;
background-repeat: no-repeat;
cursor: pointer;
>img {
width: 20px;
height: 22px;
margin-left: 9px;
margin-right: 6px;
}
>span {
font-size: 16px;
font-family: PingFang-SC, PingFang-SC;
font-weight: 500;
color: #ffffff;
}
}
.side-bgss {
width: 180px;
// margin-left: -18px;
margin-left: 30px;
margin-top: -15px;
padding: 10px;
background: linear-gradient(0deg,
rgba(9, 24, 56, 0.9) 0%,
rgba(9, 24, 56, 0.9) 100%);
box-shadow: inset 0px 0px 4px 1px rgba(0, 136, 255, 0.6);
border: 1px solid rgba(0, 136, 255, 0.8);
}
.custom-tree-node {
display: flex;
}
.topOption_body {
display: flex;
flex-wrap: wrap;
>div {
width: 81px;
height: 88px;
border: 1px solid #7aa8ff;
border-radius: 4px;
margin-right: 8px;
margin-top: 19px;
cursor: pointer;
>div:nth-child(1) {
margin-left: 6px;
margin-top: 3px;
}
>div:nth-child(2) {
text-align: center;
margin-top: -10px;
>img {
width: 30px;
height: 30px;
}
}
>div:nth-child(3) {
margin-top: 5px;
text-align: center;
font-size: 12px;
font-family: PingFang-SC, PingFang-SC;
font-weight: 400;
color: #ffffff;
}
}
}
.Selected {
border: 1px solid #edd352 !important;
>div:nth-child(3) {
color: #edd351 !important;
}
}
.el-button {
background-color: rgba(255, 0, 0, 0) !important;
border: none !important;
}
.el-tree-node__content:hover {
background-color: transparent;
}
.el-tree-node:focus>.el-tree-node__content {
background-color: transparent;
}
.el-tree {
--el-tree-node-hover-bg-color: ''
}
</style>