Commit cfa033c6 authored by 郭铭瑶's avatar 郭铭瑶 🤘

merge from master & build

parents d284b1dd 77ef89d7
This diff is collapsed.
This diff is collapsed.
This source diff could not be displayed because it is too large. You can view the blob instead.
This source diff could not be displayed because it is too large. You can view the blob instead.
This diff is collapsed.
This diff is collapsed.
This source diff could not be displayed because it is too large. You can view the blob instead.
import{d as e,p as a,a as r,r as t,o as l,b as o,F as s,f as n,l as d,e as k,t as u,w as i,g as c,h as y,c as f,j as v}from"./index.bd6769f9.js";var A=e({name:"Brief",props:{list:{type:Array,required:!0},color:{type:String,default:null},size:{type:String,default:"0.22rem"}}});const p=i("data-v-074669a4");a("data-v-074669a4");const z={class:"brief-container"},h={key:1},m={class:"count-group"},w=c(" / ");r();const g=p(((e,a,r,i,c,y)=>{const f=t("m-count");return l(),o("div",z,[(l(!0),o(s,null,n(e.list,(a=>(l(),o("div",{key:a.name},[a.icon?(l(),o("img",{key:0,src:a.icon,style:`width:${e.size};height:${e.size}`},null,12,["src"])):d("",!0),Array.isArray(a.value)?(l(),o("div",h,[k("div",m,[k(f,{class:"count yellow",value:a.value[0]},null,8,["value"]),w,k(f,{class:"count",value:a.value[1]},null,8,["value"])]),k("p",null,u(a.name),1)])):(l(),o("div",{key:2,class:{center:!a.icon}},[k(f,{class:"count yellow",style:{color:e.color},value:a.value},null,8,["style","value"]),k("p",null,u(a.name),1)],2))])))),128))])}));A.render=g,A.__scopeId="data-v-074669a4";var F=e({name:"Circle",props:{type:{type:String,default:"circle"},color:{type:[String,Array],default:["#0094FF","#1DF9FF"]},value:{type:Number,default:0},name:{type:String,default:""},showInfo:{type:Boolean,default:!0},rate:{type:Number,default:1.8},strokeWidth:{type:Number,default:6},gapDegree:{type:Number,default:0}},setup(e){const a=y(null),r=f((()=>Array.isArray(e.color)?{"0%":e.color[0],"100%":e.color[1]}:e.color)),t=f((()=>a.value?a.value.clientWidth/(e.rate||1.8):0));return{circleWrapperRef:a,strokeColor:r,width:t}}});const b=i("data-v-fb0eadd2");a("data-v-fb0eadd2");const N={ref:"circleWrapperRef",class:"circle-wrapper"};r();const j=b(((e,a,r,s,n,d)=>{const i=t("a-progress");return l(),o("div",N,[k(i,{width:e.width,"stroke-color":e.strokeColor,percent:e.value,type:e.type,"show-info":e.showInfo,"stroke-width":e.strokeWidth,"gap-degree":e.gapDegree},null,8,["width","stroke-color","percent","type","show-info","stroke-width","gap-degree"]),v(e.$slots,"default",{},(()=>[k("p",null,u(e.name),1)]))],512)}));F.render=j,F.__scopeId="data-v-fb0eadd2";var S="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADwAAAA8CAMAAAANIilAAAAAhFBMVEUykf8zkv8zkf8ykv8zkf8zkf8xkv80kv8zkv8zkv8zkf8ykf8zkf8ykv8zkv8ykf8ykf8zkf8ykf8zkf8ykf8ykf8zkv8ykv8zkf8zkf8zkv8zkf8zkv80kv8zkf8ykv8zkv8ykf8ukv8wkP8zkv8ykf8ykv8zkf8ykv8xk/8ykv8zkf9rRIMBAAAAK3RSTlMz18NK/Ow643ht+PWQ28xmsayllopyVz7x0reDXETWnH1RNjXh38a8Y049lTPWQgAAAgNJREFUSMftl+tysjAQhoWAgpyPogiK5357//f35Q2h2tYJUacz7Uz3T9YlD/smm4NM2IyetBmbgH2WnhBNnjSiP/j3w1M3OR0re3n23x6FWezRuwXOI/A0ndMHay/aMDPos1m5Jry2+/6h70RFHds9nmjBzBZo2gyB4ijojQY8FZqP3U1otxG0Mw6n6Bcu5Jtk0LF40GvGYDZHXsFGZ4+sIBN+jlemY3CM8XZIuqLe7AjxFeJMDU/nMsPudC1TNCjy1XCBzhhbRlezoTzhzlINQ3XI24WHGfJLNwSd8YgLp1HCoRTnQMFliAQYB3SvlfBB1nPTK5AZLTgzPFLCUHuR1V6JSAm5qPeSt7kSxtJ0eetjnoAIr4ITcGerhFveo8bmIKTmdAQtZzyq8F4lbA77ZwnaPouGRKHhlApYyoWzvjkOVsMCrfZKuKNBXPFOn8TYsdnikbUdoKx7kbuX7GXi1xZ+MQJvhxUF3E83zr/rCRGM7mdDprhzQrijcGRhSdUfYqwFa2qcYXk/w+xmKDYih8U4jJ0FmyfRTmTNDYJVnd65jV0h+ENo2NI/dLo3xtajT2Yu9O+qJrFu0cB97JZ8y1pJVnGxf/x+bi5OXrvl7rf8M6jNr5YwPdihe2bowSbdtVILPr0C13fZ2V5vwrLW+GJm+ePr/Ad/F/zSR9lLn4P/AQwwqd82rS6wAAAAAElFTkSuQmCC";export{A as _,F as a,S as b};
.brief-container[data-v-074669a4]{display:flex;align-items:center;white-space:nowrap}.brief-container .count[data-v-074669a4]{font-size:.11rem}.brief-container .count.yellow[data-v-074669a4]{font-size:.13rem;color:#ffd400}.brief-container>div[data-v-074669a4]{display:flex;align-items:center;flex:1;margin-left:.05rem}.brief-container>div>img[data-v-074669a4]{margin-right:.05rem}.brief-container>div>div[data-v-074669a4]{font-weight:700}.brief-container>div>div p[data-v-074669a4]{color:#ccc}.brief-container>div>div.center[data-v-074669a4]{text-align:center}.circle-wrapper[data-v-fb0eadd2]{width:100%;height:100%;box-sizing:border-box;display:flex;align-items:center;justify-content:center;flex-direction:column;position:relative}.circle-wrapper>p[data-v-fb0eadd2]{margin-top:.1rem;font-size:.12rem;font-weight:700}
\ No newline at end of file
This diff is collapsed.
This diff is collapsed.
...@@ -3,23 +3,20 @@ ...@@ -3,23 +3,20 @@
<head> <head>
<meta charset="UTF-8"> <meta charset="UTF-8">
<link rel="icon" href="/favicon.ico" /> <link rel="icon" href="./favicon.ico" />
<meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>南京东路街道</title> <title>南京东路街道</title>
<script src="./SMap.min.js"></script> <script type="module" crossorigin src="./assets/index.bd6769f9.js"></script>
<script src="./Plugins.min.js"></script> <link rel="modulepreload" href="./assets/vendor.3a6a5816.js">
<script src="./hls.js"></script> <link rel="stylesheet" href="./assets/index.21162620.css">
<script type="module" crossorigin src="./assets/index.9d3e04cb.js"></script>
<link rel="modulepreload" href="./assets/vendor.fb6b006a.js">
<link rel="stylesheet" href="./assets/index.097e7037.css">
</head> </head>
<body> <body>
<div id="app"></div> <div id="app"></div>
<!-- <script src="/SMap.min.js"></script> <script src="./SMap.min.js"></script>
<script src="/Plugins.min.js"></script> <script src="./Plugins.min.js"></script>
<script src="/hls.js"></script> --> <script src="./hls.js"></script>
</body> </body>
</html> </html>
\ No newline at end of file
This diff is collapsed.
...@@ -16,6 +16,7 @@ ...@@ -16,6 +16,7 @@
"countup.js": "^2.0.7", "countup.js": "^2.0.7",
"dayjs": "^1.10.4", "dayjs": "^1.10.4",
"echarts": "^5.0.1", "echarts": "^5.0.1",
"echarts-wordcloud": "^2.0.0",
"normalize.css": "^8.0.1", "normalize.css": "^8.0.1",
"qs": "^6.9.6", "qs": "^6.9.6",
"vue": "^3.0.5", "vue": "^3.0.5",
......
[
{
"name": "第一工作站",
"path": [
[-448.329953822261, -293.460812442785],
[-431.7521211874291, -671.2658974800385],
[-424.4347237401342, -721.1895650357069],
[-398.89824688593046, -803.6322429418965],
[-365.2547551197802, -867.1158334507442],
[-392.5813071687177, -874.8011678318296],
[-403.0902474574316, -1077.6749785273678],
[-353.7288206095779, -1071.1265279304666],
[-235.53838240578477, -1022.8565095154296],
[-110.56798272540209, -1153.1351229372399],
[-93.69249324525651, -1138.2894877772196],
[-68.09400454827903, -1119.6983373136686],
[108.32141989715319, -1078.5720831861604],
[162.94558513506695, -1051.8780519335146],
[319.4097326987787, -1005.952081175323],
[764.5059353911838, -763.8371763725968],
[632.5075268631167, -531.321704831237],
[456.02595645205906, -245.14531867638112],
[265.6661356282508, 118.08284918620457],
[171.38332987513922, 95.29556402830092],
[107.25481620144524, 61.96213147601915],
[43.56451955001853, 9.376088803933783],
[6.621997748308331, -34.25957789448293],
[-61.673711759777404, 39.489039654835494],
[-84.91161630850314, 43.66450373493032],
[-117.17844516507756, 35.95023049388385],
[-268.3674519701745, -19.099749397742613],
[-336.6383567411507, -44.7065063404232],
[-412.38375562778185, -44.284825809562136],
[-452.45167430528585, -55.794223828358156],
[-462.21647248071554, -56.90216875258136],
[-480.70426987297697, -84.93978993199039],
[-448.329953822261, -293.460812442785]
]
},
{
"name": "第二工作站",
"path": [
[62.564369398678764, 740.5887328698475],
[137.63177213765096, 581.9293660719472],
[265.9218724678516, 118.00636791345084],
[633.5446129216658, -540.7909132227782],
[1009.9399620665309, -314.1334937621058],
[1093.7138275309285, -280.9447555096293],
[964.1008078882224, 10.568783246614885],
[884.0476529902461, -20.486747614446926],
[826.2691520165776, 82.29581472151119],
[899.6994421063242, 120.57779232713301],
[826.2278107880617, 251.71216917922004],
[705.7015931731263, 615.2007867814553],
[689.5206363320461, 675.2447870777893],
[684.3364462761659, 756.2487902316288],
[534.3504692208784, 845.4714296144077],
[483.33539323239313, 867.770888275825],
[418.098934634476, 876.5269604754694],
[339.3025530833796, 879.3795052430589],
[278.7872627819655, 867.1094286195723],
[216.4694949172632, 843.7681709995571],
[158.20316744710817, 810.0089237935626],
[69.50142754362844, 745.9134831026813],
[62.564369398678764, 740.5887328698475],
]
},
{
"name": "第三工作站",
"path": [
[-827.6197677404292, 863.6615701613555],
[-708.507420140734, 529.087007783064],
[-544.6473267955473, 184.59055056098282],
[-523.8857618349174, 124.25716166503844],
[-451.3484422811116, -294.9842367135918],
[-152.79862643148, -277.8524316166481],
[-122.5120424208119, -268.7160201146585],
[-84.99074341988057, -211.12768879216264],
[-63.923253368233645, -138.51595502702844],
[-34.306397259521646, -87.17841745611986],
[38.478969665379054, 8.683623226294912],
[107.08887251018473, 60.05423378001592],
[158.0543390244511, 92.77168202741245],
[264.45839297839234, 119.5525298599415],
[171.40755583505143, 467.1165062378942],
[134.7709591243579, 587.717138064158],
[81.23406819640945, 702.8193864978215],
[60.116968670543656, 737.5046772225696],
[-52.52134254357884, 666.753298740646],
[-117.37746183915078, 641.493808117498],
[-151.4095611533494, 632.9609785518389],
[-186.334631003489, 628.7524414889315],
[-237.86233822557006, 637.5911961456075],
[-301.7758775109821, 657.7822521527194],
[-467.37230245383194, 765.9722471785428],
[-527.2261330989933, 795.6221762700677],
[-676.0132145273228, 855.6165670921827],
[-733.4857904099746, 866.563724403164],
[-791.5950212117696, 868.8044189887198],
[-827.6197677404292, 863.6615701613555],
]
}
]
\ No newline at end of file
<template> <template>
<router-view :key="$route.fullPath" /> <router-view :key="$route.fullPath" />
<m-loader v-if="showLoading" /> <m-loader v-show="showLoading" />
</template> </template>
<script lang="ts"> <script lang="ts">
......
...@@ -39,6 +39,8 @@ export default { ...@@ -39,6 +39,8 @@ export default {
GET_COMMUNITY_FACILITY: '/service-special-nandong/communityRelations', // 小区设施 GET_COMMUNITY_FACILITY: '/service-special-nandong/communityRelations', // 小区设施
GET_ISSUE_LIST: '/service-special-nandong/management/factors', // 管理要素列表 GET_ISSUE_LIST: '/service-special-nandong/management/factors', // 管理要素列表
GET_COMBINE_LIST: '/service-special-nandong/league/linkage', // 联勤联动列表 GET_COMBINE_LIST: '/service-special-nandong/league/linkage', // 联勤联动列表
/** 报警发短信 */
POST_ALARM: '/service-alarm-nandong/public/alarm',
/** 工作站 */ /** 工作站 */
GET_STATION: '/service-special-nandong/workstations', // 工作站信息 GET_STATION: '/service-special-nandong/workstations', // 工作站信息
...@@ -48,4 +50,16 @@ export default { ...@@ -48,4 +50,16 @@ export default {
GET_DUTY_EVENTS: '/service-special-nandong/compair/getRanking/cmt', // 勤务分析 - 居委事件数量 GET_DUTY_EVENTS: '/service-special-nandong/compair/getRanking/cmt', // 勤务分析 - 居委事件数量
GET_DUTY_PLACES: '/service-special-nandong/compair/getRanking/addr', // 勤务分析 - 多发地点 GET_DUTY_PLACES: '/service-special-nandong/compair/getRanking/addr', // 勤务分析 - 多发地点
GET_DUTY_RANKING: '/service-special-nandong/compair/getRanking/all', // 勤务分析 - 排行 GET_DUTY_RANKING: '/service-special-nandong/compair/getRanking/all', // 勤务分析 - 排行
/** 公共管理 */
GET_YOUSUBIDA_RANK: '/service-special-nandong/compair/willReach', // 有诉必答-占比
GET_YOUSUBIDA_CLASSIFICATION_RANK:
'/service-special-nandong/compair/willReach/ranking', // 有诉必答-分类排行
GET_URGENTCASE: '/service-special-nandong/compairs', // 有诉必答-紧急案件
GET_TODAYCASE: '/service-special-nandong/compair/willTouch', // 有求必应-今日案件数
GET_STAGECASE: '/service-special-nandong/compair/willTouch/status', // 有求必应-各阶段案件数
GET_WORKSTATION: '/service-special-nandong/compair/willTouch/workStation', // 有求必应-工作站分类
GET_TRACKEVENT: '/service-special-nandong/compairs', // 有求必应-事件跟踪
GET_CASE_CLASSIFICATION_RANK: '/service-special-nandong/compair/analysis', // 案件分析-分类排行
GET_MOREHAPPEN_ADDR: '/service-special-nandong/compair/analysis/addr', // 案件分析-多发地点
} }
...@@ -64,6 +64,7 @@ interface RequestOptions { ...@@ -64,6 +64,7 @@ interface RequestOptions {
| 'application/json;charset=UTF-8' | 'application/json;charset=UTF-8'
| 'application/x-www-form-urlencoded;charset=UTF-8' | 'application/x-www-form-urlencoded;charset=UTF-8'
showLoading?: boolean showLoading?: boolean
headers?: { [key: string]: string }
} }
/** /**
...@@ -80,6 +81,7 @@ const ajax = ({ ...@@ -80,6 +81,7 @@ const ajax = ({
params = {}, params = {},
contentType = 'application/json;charset=UTF-8', contentType = 'application/json;charset=UTF-8',
showLoading = true, showLoading = true,
headers = {},
}: RequestOptions) => { }: RequestOptions) => {
if (!url || typeof url != 'string') { if (!url || typeof url != 'string') {
throw new Error('接口URL不正确') throw new Error('接口URL不正确')
...@@ -94,6 +96,7 @@ const ajax = ({ ...@@ -94,6 +96,7 @@ const ajax = ({
'Access-Control-Allow-Headers': 'Access-Control-Allow-Headers':
'Authorization,Origin, X-Requested-With, Content-Type, Accept', 'Authorization,Origin, X-Requested-With, Content-Type, Accept',
'Access-Control-Allow-Methods': '*', 'Access-Control-Allow-Methods': '*',
...headers,
}, },
} }
if (method === 'GET') { if (method === 'GET') {
......
src/assets/images/play.png

4.14 KB | W: | H:

src/assets/images/play.png

1.22 KB | W: | H:

src/assets/images/play.png
src/assets/images/play.png
src/assets/images/play.png
src/assets/images/play.png
  • 2-up
  • Swipe
  • Onion skin
src/assets/images/point1.png

36.8 KB | W: | H:

src/assets/images/point1.png

26.1 KB | W: | H:

src/assets/images/point1.png
src/assets/images/point1.png
src/assets/images/point1.png
src/assets/images/point1.png
  • 2-up
  • Swipe
  • Onion skin
src/assets/images/point2.png

22.2 KB | W: | H:

src/assets/images/point2.png

16.2 KB | W: | H:

src/assets/images/point2.png
src/assets/images/point2.png
src/assets/images/point2.png
src/assets/images/point2.png
  • 2-up
  • Swipe
  • Onion skin
src/assets/images/point3.png

22.2 KB | W: | H:

src/assets/images/point3.png

16.8 KB | W: | H:

src/assets/images/point3.png
src/assets/images/point3.png
src/assets/images/point3.png
src/assets/images/point3.png
  • 2-up
  • Swipe
  • Onion skin
src/assets/images/point4.png

22.5 KB | W: | H:

src/assets/images/point4.png

17.2 KB | W: | H:

src/assets/images/point4.png
src/assets/images/point4.png
src/assets/images/point4.png
src/assets/images/point4.png
  • 2-up
  • Swipe
  • Onion skin
src/assets/images/point5.png

22.9 KB | W: | H:

src/assets/images/point5.png

15.8 KB | W: | H:

src/assets/images/point5.png
src/assets/images/point5.png
src/assets/images/point5.png
src/assets/images/point5.png
  • 2-up
  • Swipe
  • Onion skin
src/assets/images/point6.png

22.4 KB | W: | H:

src/assets/images/point6.png

16.1 KB | W: | H:

src/assets/images/point6.png
src/assets/images/point6.png
src/assets/images/point6.png
src/assets/images/point6.png
  • 2-up
  • Swipe
  • Onion skin
src/assets/images/point7.png

23.2 KB | W: | H:

src/assets/images/point7.png

16.9 KB | W: | H:

src/assets/images/point7.png
src/assets/images/point7.png
src/assets/images/point7.png
src/assets/images/point7.png
  • 2-up
  • Swipe
  • Onion skin
...@@ -3,7 +3,7 @@ ...@@ -3,7 +3,7 @@
</template> </template>
<script lang="ts"> <script lang="ts">
import { defineComponent, PropType, onMounted, watchEffect } from 'vue' import { defineComponent, PropType, onMounted, watchEffect, watch } from 'vue'
import { use } from 'echarts/core' import { use } from 'echarts/core'
import { PieChart } from 'echarts/charts' import { PieChart } from 'echarts/charts'
use([PieChart]) use([PieChart])
...@@ -23,7 +23,8 @@ export default defineComponent({ ...@@ -23,7 +23,8 @@ export default defineComponent({
default: null, default: null,
}, },
}, },
setup(props) { emits: ['init'],
setup(props, ctx) {
const defaultOption: PieOption = { const defaultOption: PieOption = {
backgroundColor: 'transparent', backgroundColor: 'transparent',
tooltip: { tooltip: {
...@@ -54,8 +55,14 @@ export default defineComponent({ ...@@ -54,8 +55,14 @@ export default defineComponent({
defaultOption, defaultOption,
defaultSeriesItem defaultSeriesItem
) )
onMounted(() => initChart(props.dataset, props.option)) onMounted(() => {
watchEffect(() => initChart(props.dataset, props.option)) const instance: any = initChart(props.dataset, props.option)
instance && ctx.emit('init', instance)
})
watchEffect(() => {
const instance: any = initChart(props.dataset, props.option)
instance && ctx.emit('init', instance)
})
return { return {
chartRef, chartRef,
} }
......
...@@ -202,7 +202,10 @@ const useChartGenerate = <T>( ...@@ -202,7 +202,10 @@ const useChartGenerate = <T>(
* @param dataset 数据集 * @param dataset 数据集
* @param option 自定义图表配置 * @param option 自定义图表配置
*/ */
const initChart = (dataset: DatasetComponentOption, option?: ECOption) => { const initChart = (
dataset: DatasetComponentOption,
option?: ECOption
): any => {
if (!myChart.value) return if (!myChart.value) return
const config = const config =
(defaultSeriesItem as any).type === 'radar' (defaultSeriesItem as any).type === 'radar'
...@@ -214,6 +217,7 @@ const useChartGenerate = <T>( ...@@ -214,6 +217,7 @@ const useChartGenerate = <T>(
: defaultConfig(defaultOption, defaultSeriesItem, dataset) : defaultConfig(defaultOption, defaultSeriesItem, dataset)
mergeOptions(config, option) mergeOptions(config, option)
myChart.value.setOption(transLinearColorOption(config), true) myChart.value.setOption(transLinearColorOption(config), true)
return myChart.value
} }
return { chartRef, initChart } return { chartRef, initChart }
......
...@@ -53,6 +53,9 @@ export default defineComponent({ ...@@ -53,6 +53,9 @@ export default defineComponent({
duration: +props.speed, duration: +props.speed,
} }
onMounted(() => { onMounted(() => {
if (isNaN(endValue.value)) {
endValue.value = 0
}
const countUp = new CountUp( const countUp = new CountUp(
countRef.value as HTMLElement, countRef.value as HTMLElement,
endValue.value, endValue.value,
......
<template> <template>
<teleport to="#MyLoader"> <!-- <teleport to="#MyLoader"> -->
<div class="my-loader-mask" :style="`background:${background}`"> <div class="my-loader-mask" :style="`background:${background}`">
<div class="my-loader"> <div class="my-loader">
<div class="outer" /> <div class="outer" />
<div class="middle" /> <div class="middle" />
<div class="inner" /> <div class="inner" />
</div>
<slot />
</div> </div>
</teleport> <slot />
</div>
<!-- </teleport> -->
</template> </template>
<script lang="ts"> <script lang="ts">
import { defineComponent, PropType } from 'vue' import { defineComponent, PropType } from 'vue'
import useDOMCreate from '@/hooks/useDOMCreate' // import useDOMCreate from '@/hooks/useDOMCreate'
export default defineComponent({ export default defineComponent({
name: 'MyLoader', name: 'MyLoader',
displayName: 'm-loader', displayName: 'm-loader',
...@@ -23,9 +23,9 @@ export default defineComponent({ ...@@ -23,9 +23,9 @@ export default defineComponent({
default: 'rgba(0,0,0,0.3)', default: 'rgba(0,0,0,0.3)',
}, },
}, },
setup() { // setup() {
useDOMCreate('MyLoader') // useDOMCreate('MyLoader')
}, // },
}) })
</script> </script>
......
...@@ -3,7 +3,8 @@ ...@@ -3,7 +3,8 @@
</template> </template>
<script lang="ts"> <script lang="ts">
import { defineComponent, nextTick, onMounted, PropType } from 'vue' import { computed, defineComponent, nextTick, onMounted, PropType } from 'vue'
import store from '@/store'
declare const SMap: any declare const SMap: any
declare const Plugins: any declare const Plugins: any
...@@ -27,29 +28,35 @@ export default defineComponent({ ...@@ -27,29 +28,35 @@ export default defineComponent({
}, },
emits: ['complete', 'event'], emits: ['complete', 'event'],
setup(props, ctx) { setup(props, ctx) {
const curMapType = computed(() => store.state.curMapType)
let map: any = null let map: any = null
onMounted(async () => { // onMounted(async () => {
await nextTick() // await nextTick()
initMap() // initMap()
}) // })
function initMap() { function initMap(config?: any) {
map = new SMap.Map('MapContainer', { map = new SMap.Map('MapContainer', {
viewMode: '3D', viewMode: '3D',
center: [1141.75319496382872, -480.0854532701907], center: [1019.614669, 54.167243],
// center: [-135.98002789627407, -722.1597065437004],
zooms: [5, 10], zooms: [5, 10],
zoom: 7, zoom: 7,
pitch: 45, pitch: 45,
mapStyle: 'smap://styles/dark', mapStyle: 'smap://styles/dark',
showBuildingBlock: true, showBuildingBlock: true,
...config,
...props.config, ...props.config,
}).on(SMap.MapEvent.maploaded, () => { }).on(SMap.MapEvent.maploaded, () => {
// map.enableMouseEvent(false) map.enableMouseEvent(false)
setBuildingBlock() // setBuildingBlock()
ctx.emit('complete', map) ctx.emit('complete', map)
addListener() addListener()
// hideCommunity() hideCommunity()
}) })
} }
function layer(name: string) {
return map.getLayer(name)
}
function setBuildingBlock(val = false) { function setBuildingBlock(val = false) {
map.getLayer('model_white_zw').visible = val // 整个街道图层名 map.getLayer('model_white_zw').visible = val // 整个街道图层名
map.getLayer('model_white_zhenxing2').visible = val // 振兴小区名 map.getLayer('model_white_zhenxing2').visible = val // 振兴小区名
...@@ -69,7 +76,7 @@ export default defineComponent({ ...@@ -69,7 +76,7 @@ export default defineComponent({
function setFilter(arr: unknown[], key = 'sect_id') { function setFilter(arr: unknown[], key = 'sect_id') {
if (arr.length === 0) return if (arr.length === 0) return
const valid = arr.map((val) => { const valid = arr.map((val) => {
return `${key} like '${val}'` return `${key} = '${val}'`
}) })
map.setFilter('wg_gis_xq_point', valid.join(' or ')) map.setFilter('wg_gis_xq_point', valid.join(' or '))
map.setFilter('wg_gis_mpz', valid.join(' or ')) map.setFilter('wg_gis_mpz', valid.join(' or '))
...@@ -78,9 +85,8 @@ export default defineComponent({ ...@@ -78,9 +85,8 @@ export default defineComponent({
function addListener() { function addListener() {
// 触发地图点击事件 // 触发地图点击事件
map.on(SMap.MapEvent.click, (view: any, eventParamter: any) => { map.on(SMap.MapEvent.click, (view: any, eventParamter: any) => {
const { x, y } = eventParamter.mapPoint // const { x, y } = eventParamter.mapPoint
console.log(map.getZoom()) console.log(map.getZoom(), map.getCenter())
console.log([x, y])
view.hitTest(eventParamter).then((res: any) => { view.hitTest(eventParamter).then((res: any) => {
if (res.results && res.results.length > 0) { if (res.results && res.results.length > 0) {
ctx.emit( ctx.emit(
...@@ -102,7 +108,11 @@ export default defineComponent({ ...@@ -102,7 +108,11 @@ export default defineComponent({
console.error('传入的坐标点不能为空') console.error('传入的坐标点不能为空')
return return
} }
map.setZoomAndCenter(zoom, [+x, +y, 0]) console.log('focus', x, y)
curMapType.value === '3D'
? map.setZoomAndCenter(zoom, [+x, +y, 0])
: map.setZoomAndCenter(zoom, [+x, +y])
} }
// 添加边界 // 添加边界
...@@ -129,6 +139,25 @@ export default defineComponent({ ...@@ -129,6 +139,25 @@ export default defineComponent({
function rotate(deg: number) { function rotate(deg: number) {
map.setRotation(deg) map.setRotation(deg)
} }
function cameraTo({
center = [0, 0],
heading = 180,
tilt = 45,
}: {
center: number[]
heading: number
tilt: number
}) {
// map.setPitch(60)
// map.setCenter(0, 0, 0)
// map.setRotation(180)
map.view.goTo({
// center,
heading,
tilt,
})
}
// 将数据转换为符合地图的点数组 // 将数据转换为符合地图的点数组
function getMapPoints({ function getMapPoints({
data = [], data = [],
...@@ -158,14 +187,11 @@ export default defineComponent({ ...@@ -158,14 +187,11 @@ export default defineComponent({
item.communityMiny || item.Y || item.y || item.gpsy, item.communityMiny || item.Y || item.y || item.gpsy,
item.communityMinz || item.Z || item.z || item.gpsz || 0, item.communityMinz || item.Z || item.z || item.gpsz || 0,
], ],
label: null, label: new SMap.Label({
} text: labelKey ? (item[labelKey] || item[key]) + '' : '',
if (labelKey) {
result.label = new SMap.Label({
text: (item[labelKey] || item[key]) + '',
size, size,
color, color,
}) }),
} }
return new SMap.Marker(result) return new SMap.Marker(result)
}) })
...@@ -181,6 +207,7 @@ export default defineComponent({ ...@@ -181,6 +207,7 @@ export default defineComponent({
}: PointProp) { }: PointProp) {
if (!map) return if (!map) return
const points = getMapPoints({ data, key, labelKey, icon, size, color }) const points = getMapPoints({ data, key, labelKey, icon, size, color })
console.log(points)
map.add(points) map.add(points)
return points return points
} }
...@@ -191,14 +218,43 @@ export default defineComponent({ ...@@ -191,14 +218,43 @@ export default defineComponent({
map.remove(points) map.remove(points)
} }
// 添加线状覆盖物
function addPolyLine({
paths,
attributes = {},
strokeColor = 'rgba(51,145,255,.6)',
width = 2,
}: {
paths: any[]
attributes: any
strokeColor: string
width: number
}) {
const polyline = new SMap.Polyline({
path: paths.map((item: any) => new SMap.LngLat(item[0], item[1])),
attributes,
cap: 'square',
strokeColor,
style: 'solid',
lineJoin: 'round',
width,
})
map.add(polyline)
return polyline
}
return { return {
initMap,
focus, focus,
layer,
setBuildingBlock, setBuildingBlock,
hideCommunity, hideCommunity,
showCommunity, showCommunity,
addBoundary, addBoundary,
rotate, rotate,
cameraTo,
addPoint, addPoint,
addPolyLine,
remove, remove,
setFilter, setFilter,
} }
......
...@@ -8,8 +8,16 @@ ...@@ -8,8 +8,16 @@
boxShadow: `0 0 .08rem 0 ${color} inset`, boxShadow: `0 0 .08rem 0 ${color} inset`,
}" }"
> >
<div class="before" :style="{ top: `${percent}%`, background: color }" /> <div
<div class="after" :style="{ top: `${percent}%`, background: color }" /> v-if="value"
class="before"
:style="{ top: `${percent}%`, background: color }"
/>
<div
v-if="value"
class="after"
:style="{ top: `${percent}%`, background: color }"
/>
<slot> <slot>
<p><m-count :value="value" /> %</p> <p><m-count :value="value" /> %</p>
</slot> </slot>
......
...@@ -24,6 +24,7 @@ $primary-color = #47B3FF ...@@ -24,6 +24,7 @@ $primary-color = #47B3FF
$secondary-color = #5BD5FF $secondary-color = #5BD5FF
$primary-bg = rgba(49,94,139,.3) $primary-bg = rgba(49,94,139,.3)
$primary-border = rgba(91,213,255,.5) $primary-border = rgba(91,213,255,.5)
$red = #CB1B45
$blue = #2F86EE $blue = #2F86EE
$yellow = #ffd400 $yellow = #ffd400
$green = #4F953B $green = #4F953B
......
...@@ -2,7 +2,7 @@ import { createApp } from 'vue' ...@@ -2,7 +2,7 @@ import { createApp } from 'vue'
import App from './App.vue' import App from './App.vue'
import MyComponent from '@/components/MyComponent' import MyComponent from '@/components/MyComponent'
import router from '@/router' import router from '@/router'
import { Progress, Select, Input } from 'ant-design-vue' import { Progress, Select, Input, Tooltip, Checkbox } from 'ant-design-vue'
import 'ant-design-vue/dist/antd.css' import 'ant-design-vue/dist/antd.css'
import './assets/style/reset.styl' import './assets/style/reset.styl'
...@@ -12,4 +12,6 @@ createApp(App) ...@@ -12,4 +12,6 @@ createApp(App)
.use(Progress) .use(Progress)
.use(Select) .use(Select)
.use(Input) .use(Input)
.use(Tooltip)
.use(Checkbox)
.mount('#app') .mount('#app')
import Main from '@/view/main.vue' const Main = () => import('@/view/main.vue')
import CommunityView from '@/view/community.vue' const CommunityView = () => import('@/view/community.vue')
export default [ export default [
{ name: 'main', path: '/', component: Main }, { name: 'main', path: '/', component: Main },
......
...@@ -8,7 +8,7 @@ export default { ...@@ -8,7 +8,7 @@ export default {
initData({ dispatch }: { dispatch: Dispatch }): void { initData({ dispatch }: { dispatch: Dispatch }): void {
dispatch('getPropertySummary') dispatch('getPropertySummary')
dispatch('getCaseList') dispatch('getCaseList')
// dispatch('GET_PUBLICSAFE_ECONOMIC') // dispatch('GET_TODAYCASE')
}, },
// 物业三架马车数据 (缺交叉任职数) // 物业三架马车数据 (缺交叉任职数)
async getPropertySummary({ commit }: { commit: Commit }): Promise<void> { async getPropertySummary({ commit }: { commit: Commit }): Promise<void> {
...@@ -218,7 +218,7 @@ export default { ...@@ -218,7 +218,7 @@ export default {
const { content } = ( const { content } = (
await ajax.get({ url: api.GET_PUBLICSAFE_OUTHOUSEWALL }) await ajax.get({ url: api.GET_PUBLICSAFE_OUTHOUSEWALL })
).data ).data
// console.log(content) // console.log(content, '房屋外立面')
commit('SET_PUBLICSAFE_OUTHOUSEWALL', content) commit('SET_PUBLICSAFE_OUTHOUSEWALL', content)
}, },
// 公共服务 - 重点关注楼宇 // 公共服务 - 重点关注楼宇
...@@ -240,7 +240,7 @@ export default { ...@@ -240,7 +240,7 @@ export default {
const { content } = ( const { content } = (
await ajax.get({ url: api.GET_PUBLICSAFE_PIEDATA }) await ajax.get({ url: api.GET_PUBLICSAFE_PIEDATA })
).data ).data
// console.log(content) // console.log(content, 'pie')
commit('SET_PUBLICSAFE_PIEDATA', content) commit('SET_PUBLICSAFE_PIEDATA', content)
}, },
// 左侧公共 - 指挥体系 // 左侧公共 - 指挥体系
...@@ -321,7 +321,7 @@ export default { ...@@ -321,7 +321,7 @@ export default {
const { content } = ( const { content } = (
await ajax.get({ await ajax.get({
url: api.GET_COMBINE_LIST, url: api.GET_COMBINE_LIST,
params: { bigscreenCommunityId: id }, params: { bigscreenCommunityId: id, pageSize: 1000 },
}) })
).data ).data
commit('SET_COMBINE_DATA', content) commit('SET_COMBINE_DATA', content)
...@@ -415,4 +415,169 @@ export default { ...@@ -415,4 +415,169 @@ export default {
).data ).data
commit('SET_DUTY_RANKING', content) commit('SET_DUTY_RANKING', content)
}, },
/** 公共管理 */
async GET_YOUSUBIDA_RANK({ commit }: { commit: Commit }): Promise<void> {
// 有诉必答 - 占比
const { content } = (await ajax.get({ url: api.GET_YOUSUBIDA_RANK })).data
// console.log(content, '有诉必答 - 占比')
commit('SET_YOUSUBIDA_RANK', content)
},
async GET_YOUSUBIDA_CLASSIFICATION_RANK(
{
commit,
}: {
commit: Commit
},
managementType: string
): Promise<void> {
// 有诉必答 - 分类排行
const { content } = (
await ajax.get({
url: api.GET_YOUSUBIDA_CLASSIFICATION_RANK,
params: { managementType: managementType },
})
).data
// console.log(content, '有诉必答 - 分类排行')
commit('SET_YOUSUBIDA_CLASSIFICATION_RANK', content)
},
async GET_URGENTCASE(
{
commit,
}: {
commit: Commit
},
params: {
[key: string]: string
}
): Promise<void> {
// 有诉必答 - 紧急案件
const { content } = (
await ajax.get({
url: api.GET_URGENTCASE,
params,
})
).data
// console.log(content, '有诉必答 - 紧急案件')
commit('SET_URGENTCASE', content)
},
async GET_TODAYCASE(
{
commit,
}: {
commit: Commit
},
params: {
[key: string]: string
}
): Promise<void> {
// 有求必应 - 今日案件数
const { content } = (
await ajax.get({
url: api.GET_TODAYCASE,
params,
})
).data
// console.log(content, '有求必应 - 今日案件数')
commit('SET_TODAYCASE', content)
},
async GET_STAGECASE(
{
commit,
}: {
commit: Commit
},
params: {
[key: string]: string
}
): Promise<void> {
// 有求必应 - 各阶段案件数
const { content } = (
await ajax.get({
url: api.GET_STAGECASE,
params,
})
).data
// console.log(content, '有求必应 - 各阶段案件数')
commit('SET_STAGECASE', content)
},
async GET_WORKSTATION(
{
commit,
}: {
commit: Commit
},
params: {
[key: string]: string
}
): Promise<void> {
// 有求必应 - 工作站分类
const { content } = (
await ajax.get({
url: api.GET_WORKSTATION,
params,
})
).data
// console.log(content, '有求必应 - 工作站分类')
commit('SET_WORKSTATION', content)
},
async GET_TRACKEVENT(
{
commit,
}: {
commit: Commit
},
params: {
[key: string]: string
}
): Promise<void> {
// 有求必应 - 事件跟踪
const { content } = (
await ajax.get({
url: api.GET_TRACKEVENT,
params,
})
).data
// console.log(content, '有求必应 - 事件跟踪')
commit('SET_TRACKEVENT', content)
},
async GET_CASE_CLASSIFICATION_RANK(
{
commit,
}: {
commit: Commit
},
params: {
[key: string]: string
}
): Promise<void> {
// 案件分析 - 分类排行
const { content } = (
await ajax.get({
url: api.GET_CASE_CLASSIFICATION_RANK,
params,
})
).data
// console.log(content, '案件分析 - 分类排行')
commit('SET_CASE_CLASSIFICATION_RANK', content)
},
async GET_MOREHAPPEN_ADDR(
{
commit,
}: {
commit: Commit
},
params: {
[key: string]: string
}
): Promise<void> {
// 案件分析 - 多发地点
const { content } = (
await ajax.get({
url: api.GET_MOREHAPPEN_ADDR,
params,
})
).data
// console.log(content, '案件分析 - 多发地点')
commit('SET_MOREHAPPEN_ADDR', content)
},
} }
...@@ -45,6 +45,14 @@ export interface DutySumProp { ...@@ -45,6 +45,14 @@ export interface DutySumProp {
communityNum: number //小区管理数量 communityNum: number //小区管理数量
} }
export interface YousubidaRankProp {
comprehensiveNum: 0 //综合数量
comprehensiveDispatchNum: 0 //综合派遣数量
streetNum: 0 //街道数量
streetDispatchNum: 0 //街道派遣数量
communityDispatchNum: 0 //小区数量
communityNum: 0 //小区派遣数量
}
export interface DutyDataProp { export interface DutyDataProp {
week: { [key: string]: unknown }[] week: { [key: string]: unknown }[]
month: { [key: string]: unknown }[] month: { [key: string]: unknown }[]
...@@ -55,13 +63,19 @@ export interface DutyDataProp { ...@@ -55,13 +63,19 @@ export interface DutyDataProp {
export interface GlobalStateProps { export interface GlobalStateProps {
showLoading: boolean showLoading: boolean
curView: ViewType curView: ViewType
curMapType: string
readonly zhenxing: any
readonly weihai: any
readonly workArea1: any
readonly workArea2: any
readonly workArea3: any
readonly viewOptions: ViewType[] readonly viewOptions: ViewType[]
readonly communityOptions: ViewType[] readonly communityOptions: ViewType[]
curTheme: ThemeType curTheme: ThemeType
propertySummary: { [key: string]: number } propertySummary: { [key: string]: number }
caseList: unknown[] caseList: unknown[]
pubulicSafeGateSenteryShehuiwuye: { [key: string]: number } pubulicSafeGateSenteryShehuiwuye: { [key: string]: number }[]
pubulicSafeGateSenteryZhiguangongfang: { [key: string]: number } pubulicSafeGateSenteryZhiguangongfang: { [key: string]: number }[]
pubulicSafeMap: unknown[] pubulicSafeMap: unknown[]
pubulicSafeTruePeople: { [key: string]: number } pubulicSafeTruePeople: { [key: string]: number }
pubulicSafeHouse: { [key: string]: any } pubulicSafeHouse: { [key: string]: any }
...@@ -91,7 +105,19 @@ export interface GlobalStateProps { ...@@ -91,7 +105,19 @@ export interface GlobalStateProps {
dutyEvents: Partial<DutyDataProp> dutyEvents: Partial<DutyDataProp>
dutyPlaces: Partial<DutyDataProp> dutyPlaces: Partial<DutyDataProp>
dutyRanking: Partial<DutyDataProp> dutyRanking: Partial<DutyDataProp>
/** 公共管理 */
yousubidaRank: Partial<YousubidaRankProp>
classificationRank: any[]
urgentCase: any[]
todayCase: { [key: string]: number }
stageCase: { [key: string]: number }
workstationKind: { [key: string]: number }
trackEvent: any[]
analysisRank: Partial<DutyDataProp>
moreHappenAddr: Partial<DutyDataProp>
} }
export default createStore<GlobalStateProps>({ export default createStore<GlobalStateProps>({
state, state,
mutations, mutations,
......
...@@ -7,12 +7,16 @@ import { ...@@ -7,12 +7,16 @@ import {
CombineProp, CombineProp,
DutySumProp, DutySumProp,
DutyDataProp, DutyDataProp,
YousubidaRankProp,
} from './index' } from './index'
export default { export default {
SET_LOADING(state: GlobalStateProps, val: boolean): void { SET_LOADING(state: GlobalStateProps, val: boolean): void {
state.showLoading = val state.showLoading = val
}, },
SET_MAP_TYPE(state: GlobalStateProps, val: string): void {
state.curMapType = val
},
SET_CURRENT_VIEW(state: GlobalStateProps, val: ViewType): void { SET_CURRENT_VIEW(state: GlobalStateProps, val: ViewType): void {
state.curView = val state.curView = val
}, },
...@@ -181,4 +185,56 @@ export default { ...@@ -181,4 +185,56 @@ export default {
SET_DUTY_RANKING(state: GlobalStateProps, data: DutyDataProp): void { SET_DUTY_RANKING(state: GlobalStateProps, data: DutyDataProp): void {
state.dutyRanking = data state.dutyRanking = data
}, },
/** 公共管理 */
// 有诉必答-占比
SET_YOUSUBIDA_RANK(state: GlobalStateProps, data: YousubidaRankProp): void {
state.yousubidaRank = data
},
// 有诉必答-分类排行
SET_YOUSUBIDA_CLASSIFICATION_RANK(
state: GlobalStateProps,
data: unknown[]
): void {
state.classificationRank = data
},
// 有诉必答-紧急案件
SET_URGENTCASE(state: GlobalStateProps, data: unknown[]): void {
state.urgentCase = data
},
// 有求必应-今日案件数
SET_TODAYCASE(
state: GlobalStateProps,
data: { [key: string]: number }
): void {
state.todayCase = data
},
// 有求必应-各阶段案件数
SET_STAGECASE(
state: GlobalStateProps,
data: { [key: string]: number }
): void {
state.stageCase = data
},
// 有求必应-工作站分类
SET_WORKSTATION(
state: GlobalStateProps,
data: { [key: string]: number }
): void {
state.workstationKind = data
},
// 有求必应-事件跟踪
SET_TRACKEVENT(state: GlobalStateProps, data: unknown[]): void {
state.trackEvent = data
},
// 有求必应-分类排行
SET_CASE_CLASSIFICATION_RANK(
state: GlobalStateProps,
data: DutyDataProp
): void {
state.analysisRank = data
},
// 有求必应-多发地点
SET_MOREHAPPEN_ADDR(state: GlobalStateProps, data: DutyDataProp): void {
state.moreHappenAddr = data
},
} }
...@@ -2,6 +2,7 @@ import { GlobalStateProps } from './index' ...@@ -2,6 +2,7 @@ import { GlobalStateProps } from './index'
export default { export default {
showLoading: false, showLoading: false,
curMapType: '2D',
curView: { name: '南京东路街道', type: 'street' }, curView: { name: '南京东路街道', type: 'street' },
viewOptions: [ viewOptions: [
{ name: '南京东路街道', type: 'street' }, { name: '南京东路街道', type: 'street' },
...@@ -14,11 +15,169 @@ export default { ...@@ -14,11 +15,169 @@ export default {
{ name: '威海路62弄', type: '527635870583459841' }, { name: '威海路62弄', type: '527635870583459841' },
], ],
curTheme: 'manage', curTheme: 'manage',
zhenxing: {
paths: [
[-394.9643478722986, -682.7008812875049],
[-392.71331797961386, -676.0304740664822],
[-388.88512021905166, -669.9078381232936],
[-381.1708469780052, -664.8890129814765],
[-326.4453957302277, -658.5038602372127],
[-304.60275764390985, -657.5571461042011],
[-225.16351998939285, -654.7707473022369],
[-219.35507738292432, -655.8352839365185],
[-214.4437394352484, -657.6770356668969],
[-209.1231233252662, -662.528428833225],
[-206.0307994322851, -666.8341177831445],
[-153.432354391645, -823.1866440298637],
[-153.70313943842342, -829.8508500666092],
[-155.41259923755138, -834.0573200680908],
[-159.34001594655143, -838.5593798534603],
[-164.15006788436364, -840.605770664992],
[-322.5944602939818, -861.0696787803082],
[-330.93505314704254, -859.6227357822555],
[-337.9630619947269, -851.2986794206012],
[-368.02640337140963, -789.8986868289493],
[-382.76455133728894, -745.7689924497688],
[-394.9147383980797, -686.646901549337],
[-394.9643478722986, -682.7008812875049],
],
},
weihai: {
paths: [
[-195.08054152916526, -563.6474449384453],
[-162.7258625619948, -623.3421118538208],
[-133.68985071392945, -603.4838527362609],
[-168.5456740063052, -546.0991269642052],
[-195.08054152916526, -563.6474449384453],
],
},
workArea1: {
workStation: {
name: '第一',
address: '武胜路481号',
x: -136.67,
y: -660.07,
},
id: '01001',
center: [361.095476, -559.449126],
paths: [
[-448.329953822261, -293.460812442785],
[-431.7521211874291, -671.2658974800385],
[-424.4347237401342, -721.1895650357069],
[-398.89824688593046, -803.6322429418965],
[-365.2547551197802, -867.1158334507442],
[-392.5813071687177, -874.8011678318296],
[-403.0902474574316, -1077.6749785273678],
[-353.7288206095779, -1071.1265279304666],
[-235.53838240578477, -1022.8565095154296],
[-110.56798272540209, -1153.1351229372399],
[-93.69249324525651, -1138.2894877772196],
[-68.09400454827903, -1119.6983373136686],
[108.32141989715319, -1078.5720831861604],
[162.94558513506695, -1051.8780519335146],
[319.4097326987787, -1005.952081175323],
[764.5059353911838, -763.8371763725968],
[632.5075268631167, -531.321704831237],
[456.02595645205906, -245.14531867638112],
[265.6661356282508, 118.08284918620457],
[171.38332987513922, 95.29556402830092],
[107.25481620144524, 61.96213147601915],
[43.56451955001853, 9.376088803933783],
[6.621997748308331, -34.25957789448293],
[-61.673711759777404, 39.489039654835494],
[-84.91161630850314, 43.66450373493032],
[-117.17844516507756, 35.95023049388385],
[-268.3674519701745, -19.099749397742613],
[-336.6383567411507, -44.7065063404232],
[-412.38375562778185, -44.284825809562136],
[-452.45167430528585, -55.794223828358156],
[-462.21647248071554, -56.90216875258136],
[-480.70426987297697, -84.93978993199039],
[-448.329953822261, -293.460812442785],
],
},
workArea2: {
workStation: {
name: '第二',
address: '',
x: 382.4793321452691,
y: 678.9654976442117,
},
id: '01002',
center: [1291.532466, 175.263969],
paths: [
[62.564369398678764, 740.5887328698475],
[137.63177213765096, 581.9293660719472],
[265.9218724678516, 118.00636791345084],
[633.5446129216658, -540.7909132227782],
[1009.9399620665309, -314.1334937621058],
[1093.7138275309285, -280.9447555096293],
[964.1008078882224, 10.568783246614885],
[884.0476529902461, -20.486747614446926],
[826.2691520165776, 82.29581472151119],
[899.6994421063242, 120.57779232713301],
[826.2278107880617, 251.71216917922004],
[705.7015931731263, 615.2007867814553],
[689.5206363320461, 675.2447870777893],
[684.3364462761659, 756.2487902316288],
[534.3504692208784, 845.4714296144077],
[483.33539323239313, 867.770888275825],
[418.098934634476, 876.5269604754694],
[339.3025530833796, 879.3795052430589],
[278.7872627819655, 867.1094286195723],
[216.4694949172632, 843.7681709995571],
[158.20316744710817, 810.0089237935626],
[69.50142754362844, 745.9134831026813],
[62.564369398678764, 740.5887328698475],
],
},
workArea3: {
workStation: {
name: '第三',
address: '',
x: -57.84609277641425,
y: 261.561716873108,
},
center: [609.931363, 342.166777],
id: '01003',
paths: [
[-827.6197677404292, 863.6615701613555],
[-708.507420140734, 529.087007783064],
[-544.6473267955473, 184.59055056098282],
[-523.8857618349174, 124.25716166503844],
[-451.3484422811116, -294.9842367135918],
[-152.79862643148, -277.8524316166481],
[-122.5120424208119, -268.7160201146585],
[-84.99074341988057, -211.12768879216264],
[-63.923253368233645, -138.51595502702844],
[-34.306397259521646, -87.17841745611986],
[38.478969665379054, 8.683623226294912],
[107.08887251018473, 60.05423378001592],
[158.0543390244511, 92.77168202741245],
[264.45839297839234, 119.5525298599415],
[171.40755583505143, 467.1165062378942],
[134.7709591243579, 587.717138064158],
[81.23406819640945, 702.8193864978215],
[60.116968670543656, 737.5046772225696],
[-52.52134254357884, 666.753298740646],
[-117.37746183915078, 641.493808117498],
[-151.4095611533494, 632.9609785518389],
[-186.334631003489, 628.7524414889315],
[-237.86233822557006, 637.5911961456075],
[-301.7758775109821, 657.7822521527194],
[-467.37230245383194, 765.9722471785428],
[-527.2261330989933, 795.6221762700677],
[-676.0132145273228, 855.6165670921827],
[-733.4857904099746, 866.563724403164],
[-791.5950212117696, 868.8044189887198],
[-827.6197677404292, 863.6615701613555],
],
},
propertySummary: {}, propertySummary: {},
caseList: [], caseList: [],
stationInfo: {}, stationInfo: {},
pubulicSafeGateSenteryShehuiwuye: {}, pubulicSafeGateSenteryShehuiwuye: [],
pubulicSafeGateSenteryZhiguangongfang: {}, pubulicSafeGateSenteryZhiguangongfang: [],
pubulicSafeMap: [], pubulicSafeMap: [],
pubulicSafeTruePeople: {}, pubulicSafeTruePeople: {},
pubulicSafeHouse: {}, pubulicSafeHouse: {},
...@@ -43,4 +202,13 @@ export default { ...@@ -43,4 +202,13 @@ export default {
dutyEvents: { day: [], week: [], month: [] }, dutyEvents: { day: [], week: [], month: [] },
dutyPlaces: { day: [], week: [], month: [] }, dutyPlaces: { day: [], week: [], month: [] },
dutyRanking: { day: [], week: [], month: [] }, dutyRanking: { day: [], week: [], month: [] },
yousubidaRank: {},
classificationRank: [],
urgentCase: [],
todayCase: {},
stageCase: {},
workstationKind: {},
trackEvent: [],
analysisRank: { day: [], week: [], month: [] },
moreHappenAddr: { day: [], week: [], month: [] },
} as GlobalStateProps } as GlobalStateProps
This diff is collapsed.
...@@ -24,6 +24,7 @@ import photo2 from '@/assets/images/community2.png' ...@@ -24,6 +24,7 @@ import photo2 from '@/assets/images/community2.png'
import photo3 from '@/assets/images/community3.png' import photo3 from '@/assets/images/community3.png'
import { ajax } from '@/ajax' import { ajax } from '@/ajax'
import VideoComponent from '../components/video-component.vue' import VideoComponent from '../components/video-component.vue'
import video from '@/assets/images/video.mp4'
export default defineComponent({ export default defineComponent({
name: 'CommunityPhoto', name: 'CommunityPhoto',
...@@ -32,34 +33,37 @@ export default defineComponent({ ...@@ -32,34 +33,37 @@ export default defineComponent({
const showModal = ref(false) const showModal = ref(false)
const src = ref<string | null>(null) const src = ref<string | null>(null)
const handleClick = async (id: string) => { const handleClick = async (id: string) => {
const [{ remark2 }] = ( // if (!id) return
await ajax.get({ // const [{ remark2 }] = (
url: `http://10.39.25.33:81/njdl/imp/pc/njdl/equipment/getEquipmentVideoById?id=${id}`, // await ajax.get({
}) // url: `http://10.39.25.33:81/njdl/imp/pc/njdl/equipment/getEquipmentVideoById?id=${id}`,
).data // })
src.value = remark2 // ).data
// src.value = remark2
src.value =
'http://zhongbang.omniview.pro/file/group1/M00/00/30/CgAG5WB5KNmAWXGgAfLx1DPNngc885.mp4'
showModal.value = true showModal.value = true
} }
return { return {
list: [ list: [
// { name: '重庆北路205号入口', photo: photo1 }, { name: '重庆北路205号入口', photo: photo1 },
// { name: '重庆北路205号道路', photo: photo2 }, { name: '重庆北路205号道路', photo: photo2 },
// { name: '重庆北路205号电梯', photo: photo3 }, { name: '重庆北路205号电梯', photo: photo3 },
{ // {
name: '威海路163', // name: '威海路163',
photo: photo1, // photo: photo1,
id: '05e1a5f24a224d66955ba2d22d6f64d3', // id: '05e1a5f24a224d66955ba2d22d6f64d3',
}, // },
{ // {
name: '威海路167', // name: '威海路167',
photo: photo2, // photo: photo2,
id: 'fc82739cb3354262850c715aa9098c83', // id: 'fc82739cb3354262850c715aa9098c83',
}, // },
{ // {
name: '成都北路140', // name: '成都北路140',
photo: photo3, // photo: photo3,
id: '3c23b0ecd6bb4d73842617010a84cbcf', // id: '3c23b0ecd6bb4d73842617010a84cbcf',
}, // },
], ],
handleClick, handleClick,
showModal, showModal,
......
...@@ -45,14 +45,16 @@ ...@@ -45,14 +45,16 @@
:style="`border-left-color: ${getColor(item.classification)}`" :style="`border-left-color: ${getColor(item.classification)}`"
> >
<div> <div>
<img :src="getIcon(item.relationName)" /> <div>
<p>{{ item.sectName }}</p> <img :src="getIcon(item.relationName)" />
</div> <p>{{ item.sectName }}</p>
<div class="type"> </div>
<span>{{ item.relationName }}</span> <div class="type">
<span>{{ item.classification }}</span> <span>{{ item.relationName }}</span>
<span>{{ item.classification }}</span>
</div>
<i :style="`background:${getColor(item.classification)}`" />
</div> </div>
<i :style="`background:${getColor(item.classification)}`" />
</div> </div>
</div> </div>
<div v-show="memberList.length > 0" class="industry"> <div v-show="memberList.length > 0" class="industry">
...@@ -146,9 +148,9 @@ export default defineComponent({ ...@@ -146,9 +148,9 @@ export default defineComponent({
) )
const getColor = (type: string): string => { const getColor = (type: string): string => {
switch (type) { switch (type) {
case '门岗': case '摄像头':
return '#826AFA' return '#826AFA'
case '为老': case '为老设施':
return '#FF6161' return '#FF6161'
case '小区设施': case '小区设施':
return '#8ED617' return '#8ED617'
...@@ -159,7 +161,7 @@ export default defineComponent({ ...@@ -159,7 +161,7 @@ export default defineComponent({
const getIcon = (type: string): string => { const getIcon = (type: string): string => {
if (!type) return type2 if (!type) return type2
if (type.indexOf('集合') >= 0) return type3 if (type.indexOf('集合') >= 0) return type3
if (type.indexOf('餐') >= 0) return type6 if (type.indexOf('餐') >= 0) return type6
if (type.indexOf('助浴') >= 0) return type7 if (type.indexOf('助浴') >= 0) return type7
if (type.indexOf('充电') >= 0) return type1 if (type.indexOf('充电') >= 0) return type1
if (type.indexOf('车棚') >= 0) return type5 if (type.indexOf('车棚') >= 0) return type5
...@@ -184,7 +186,7 @@ export default defineComponent({ ...@@ -184,7 +186,7 @@ export default defineComponent({
addrList.value = ( addrList.value = (
await ajax.get({ await ajax.get({
url: api.GET_COMMUNITY_FACILITY, url: api.GET_COMMUNITY_FACILITY,
params: { sectId: id }, params: { sectId: id, pageSize: 1000 },
}) })
).data.content.filter((item: any) => item.classification != '微更新') ).data.content.filter((item: any) => item.classification != '微更新')
memberList.value = memberList.value =
...@@ -193,7 +195,7 @@ export default defineComponent({ ...@@ -193,7 +195,7 @@ export default defineComponent({
(buildingList.value.find( (buildingList.value.find(
(b: any) => b.sectId === curBuilding.value (b: any) => b.sectId === curBuilding.value
) as any) ) as any)
).icMember || [] ).icMember.sort((a: any, b: any) => +a.dirDuty - +b.dirDuty) || []
} }
return { return {
healthVal, healthVal,
...@@ -289,38 +291,23 @@ export default defineComponent({ ...@@ -289,38 +291,23 @@ export default defineComponent({
opacity .2 opacity .2
box-shadow 0 0 .05rem .02rem $edge box-shadow 0 0 .05rem .02rem $edge
.address .address
display flex // display flex
flex-wrap wrap // flex-wrap wrap
flex 1 height 3rem
overflow-y auto
>div >div
display flex display inline-block
flex-direction column width 48%
justify-content space-around height .6rem
width 48.2% margin-bottom .06rem
margin-right @margin-bottom
overflow hidden
padding .03rem .05rem padding .03rem .05rem
box-sizing border-box box-sizing border-box
position relative position relative
margin-bottom .06rem
margin-right @margin-bottom
background rgba(33,58,89,.2) background rgba(33,58,89,.2)
border .01rem solid rgba(91,213,255,.1) border .01rem solid rgba(91,213,255,.1)
border-left .02rem solid transparent border-left .02rem solid transparent
overflow hidden
height .6rem
>div
display flex
align-items center
p
color #aaa
flex 1
img
width .15rem
height @width
margin-right .1rem
.type
display flex
justify-content space-between
font-size .08rem
i i
position absolute position absolute
right -0.1rem right -0.1rem
...@@ -329,6 +316,26 @@ export default defineComponent({ ...@@ -329,6 +316,26 @@ export default defineComponent({
height .2rem height .2rem
transform rotate(45deg) transform rotate(45deg)
opacity .4 opacity .4
>div
display flex
width 100%
height 100%
flex-direction column
justify-content space-around
>div
display flex
align-items center
p
color #aaa
flex 1
img
width .15rem
height @width
margin-right .1rem
.type
display flex
justify-content space-between
font-size .08rem
.industry .industry
.title .title
display flex display flex
......
...@@ -18,7 +18,7 @@ ...@@ -18,7 +18,7 @@
:value="item.value" :value="item.value"
type="dashboard" type="dashboard"
:show-info="false" :show-info="false"
:color="[getColor(item.value), '#FF0C0C']" :color="[getColor(item.value), '#F76B1C']"
:rate="1.2" :rate="1.2"
:stroke-width="8" :stroke-width="8"
:gap-degree="100" :gap-degree="100"
...@@ -54,7 +54,7 @@ ...@@ -54,7 +54,7 @@
</template> </template>
<script lang="ts"> <script lang="ts">
import { computed, defineComponent, ref, watch } from 'vue' import { defineComponent, ref, watch } from 'vue'
import { ChartTypes } from '@/components/MyComponent' import { ChartTypes } from '@/components/MyComponent'
import Circle from '../components/circle.vue' import Circle from '../components/circle.vue'
import store from '@/store' import store from '@/store'
...@@ -121,11 +121,11 @@ export default defineComponent({ ...@@ -121,11 +121,11 @@ export default defineComponent({
}, },
}) })
const issues = ref([ const issues = ref([
{ name: '绿化面积㎡', value: 658 }, { name: '充电桩', value: 3 },
{ name: '监控点位', value: 28 }, { name: '监控点位', value: 30 },
{ name: '垃圾箱房', value: 15 }, { name: '垃圾箱房', value: 5 },
{ name: '非机动车位', value: 150 }, { name: '停车棚', value: 3 },
{ name: '物业服务人员', value: 168 }, { name: '物业公司', value: 4 },
]) ])
return { return {
counts, counts,
......
...@@ -58,10 +58,11 @@ export default defineComponent({ ...@@ -58,10 +58,11 @@ export default defineComponent({
.brief-container .brief-container
display flex display flex
align-items center align-items center
white-space nowrap
.count .count
font-size .12rem font-size .11rem
&.yellow &.yellow
font-size .14rem font-size .13rem
color $yellow color $yellow
>div >div
display flex display flex
......
<template> <template>
<div class="map-btns" :class="{ full: fullScreen }"> <div class="map-btns" :class="{ full: fullScreen }">
<img <!-- <a-checkbox-group :option="options" @change="handleChange" /> -->
v-for="btn in btns" <template v-for="btn in btns">
:key="btn.key" <a-tooltip v-if="btn.key === 'home'" :key="btn.key" placement="right">
:src="btn.icon" <img :key="btn.key" :src="btn.icon" draggable="false" />
draggable="false" <template v-if="options.length > 0" #title>
@click="handleClick(btn.key)" <div class="btns-tip">
/> <a-checkbox-group
v-model:value="checkboxValues"
:options="options"
@change="handleChange"
/>
</div>
</template>
</a-tooltip>
<img
v-else
:key="btn.key"
:src="btn.icon"
draggable="false"
@click="handleClick(btn.key)"
/>
</template>
</div> </div>
<m-modal v-model="searchModal" title="搜索"> <m-modal v-model="searchModal" title="搜索">
<div id="modal-search-bar"> <div id="modal-search-bar">
...@@ -45,31 +60,46 @@ ...@@ -45,31 +60,46 @@
</template> </template>
<script lang="ts"> <script lang="ts">
import { computed, defineComponent, ref } from 'vue' import { computed, defineComponent, ref, watch } from 'vue'
import btn1 from '@/assets/images/map-btn1.png' import btn1 from '@/assets/images/map-btn1.png'
import btn2 from '@/assets/images/map-btn2.png' import btn2 from '@/assets/images/map-btn2.png'
import btn3 from '@/assets/images/map-btn3.png' import btn3 from '@/assets/images/map-btn3.png'
import btn4 from '@/assets/images/map-btn4.png' import btn4 from '@/assets/images/map-btn4.png'
import btn5 from '@/assets/images/map-btn5.png' import btn5 from '@/assets/images/map-btn5.png'
import btn6 from '@/assets/images/map-btn6.png' import btn6 from '@/assets/images/map-btn6.png'
import d2 from '@/assets/images/2d.png'
import d3 from '@/assets/images/3d.png'
import store from '@/store' import store from '@/store'
export default defineComponent({ export default defineComponent({
name: 'MapBtns', name: 'MapBtns',
emits: ['full'], emits: ['full', 'change'],
setup(_, ctx) { setup(_, ctx) {
const btns = ref([ const btns = computed(() => {
{ key: 'search', icon: btn1 }, const mapType =
{ key: 'full', icon: btn2 }, store.state.curMapType === '2D'
{ key: '', icon: btn3 }, ? { key: '3D', icon: d3 }
{ key: '', icon: btn4 }, : { key: '2D', icon: d2 }
{ key: '', icon: btn5 }, const list = [
{ key: '', icon: btn6 }, { key: 'search', icon: btn1 },
]) { key: 'full', icon: btn2 },
{ key: 'home', icon: btn3 },
{ key: '', icon: btn4 },
{ key: '', icon: btn5 },
// { key: '', icon: btn6 },
]
return [mapType, ...list]
})
const fullScreen = ref(false) const fullScreen = ref(false)
const searchModal = ref(false) const searchModal = ref(false)
const handleClick = (key: string) => { const handleClick = (key: string) => {
switch (key) { switch (key) {
case '3D':
store.commit('SET_MAP_TYPE', key)
break
case '2D':
store.commit('SET_MAP_TYPE', key)
break
case 'full': case 'full':
fullScreen.value = !fullScreen.value fullScreen.value = !fullScreen.value
ctx.emit('full', fullScreen.value) ctx.emit('full', fullScreen.value)
...@@ -84,6 +114,27 @@ export default defineComponent({ ...@@ -84,6 +114,27 @@ export default defineComponent({
const searchType = ref('case') const searchType = ref('case')
const searchKey = ref('') const searchKey = ref('')
const caseList = computed(() => store.state.caseList) const caseList = computed(() => store.state.caseList)
const options = computed(() => {
if (store.state.curView.type === 'street') {
return [
{ label: '第一工作站', value: 'workArea1' },
{ label: '第二工作站', value: 'workArea2' },
{ label: '第三工作站', value: 'workArea3' },
{ label: '振兴小区', value: 'zhenxing' },
{ label: '威海路62弄', value: 'weihai' },
]
}
return []
})
const checkboxValues = ref([])
const handleChange = (e: any) => {
ctx.emit('change', e)
checkboxValues.value = e
}
watch(
[() => store.state.curView.type, () => store.state.curMapType],
() => (checkboxValues.value = [])
)
return { return {
btns, btns,
fullScreen, fullScreen,
...@@ -92,6 +143,9 @@ export default defineComponent({ ...@@ -92,6 +143,9 @@ export default defineComponent({
searchType, searchType,
searchKey, searchKey,
caseList, caseList,
options,
checkboxValues,
handleChange,
} }
}, },
}) })
...@@ -102,7 +156,11 @@ export default defineComponent({ ...@@ -102,7 +156,11 @@ export default defineComponent({
$border = .01rem solid rgba(91,213,255,.3) $border = .01rem solid rgba(91,213,255,.3)
$bg = rgba(6,34,67,.4) $bg = rgba(6,34,67,.4)
.btns-tip *
color #fff !important
font-size .1rem
.ant-checkbox-group-item
display block
#modal-search-bar #modal-search-bar
width 100% width 100%
position relative position relative
......
<template> <template>
<div class="video-component"> <div class="video-component">
<video <video
v-if="isVideo" v-if="isM3U8"
ref="videoRef" ref="videoRef"
class="video" class="video"
autoplay="autoplay" autoplay="autoplay"
...@@ -9,6 +9,9 @@ ...@@ -9,6 +9,9 @@
> >
您的浏览器不支持播放此视频。 您的浏览器不支持播放此视频。
</video> </video>
<video v-else-if="isMP4" class="video" autoplay="autoplay" controls>
<source :src="videoSrc" type="video/mp4" />
</video>
<iframe v-else class="video" :src="videoSrc" frameborder="0" /> <iframe v-else class="video" :src="videoSrc" frameborder="0" />
</div> </div>
</template> </template>
...@@ -34,9 +37,12 @@ export default defineComponent({ ...@@ -34,9 +37,12 @@ export default defineComponent({
}, },
setup(props) { setup(props) {
const videoRef = ref<any | null>(null) const videoRef = ref<any | null>(null)
const isVideo = computed( const isM3U8 = computed(
() => props.videoSrc && props.videoSrc.indexOf('m3u8') >= 0 () => props.videoSrc && props.videoSrc.indexOf('m3u8') >= 0
) )
const isMP4 = computed(
() => props.videoSrc && props.videoSrc.indexOf('mp4') >= 0
)
const init = () => { const init = () => {
if (!videoRef.value) return if (!videoRef.value) return
...@@ -55,12 +61,14 @@ export default defineComponent({ ...@@ -55,12 +61,14 @@ export default defineComponent({
} }
} }
onMounted(async () => { onMounted(async () => {
if (!isM3U8.value) return
await nextTick() await nextTick()
init() init()
}) })
return { return {
videoRef, videoRef,
isVideo, isM3U8,
isMP4,
} }
}, },
}) })
......
import { ref, watch, computed } from 'vue'
import { ajax, api } from '@/ajax'
import store from '@/store'
export default function useSwitchMap(map: any) {
const curMapType = computed(() => store.state.curMapType)
const curViewType = computed(() => store.state.curView.type)
watch(
() => curMapType.value,
(type) => {
if (!map.value) return
map.value.initMap({ viewMode: type })
},
{ immediate: true }
)
watch(
() => curViewType.value,
(type) => {
setPoints(type)
if (areaLines.value && areaLines.value.length > 0) {
map.value.remove(areaLines.value)
}
if (curMapType.value === '2D') return
store.commit('SET_MAP_TYPE', '2D')
}
)
// 根据条件显示小区点
function setPoints(type: string) {
switch (type) {
case 'work1':
showPoints({ gridId: store.state.workArea1.id })
map.value.focus(...store.state.workArea1.center, 7.660867453405492)
break
case 'work2':
showPoints({ gridId: store.state.workArea2.id })
map.value.focus(...store.state.workArea2.center, 7)
break
case 'work3':
showPoints({ gridId: store.state.workArea3.id })
map.value.focus(...store.state.workArea3.center, 7)
break
case 'street':
showPoints()
map.value.focus(990.973466, 10.295931, 7)
// map.value.focus(1019.614669, 54.167243, 6.5)
break
default:
break
}
}
async function showPoints(params = {}) {
const { content } = (
await ajax.get({ url: api.GET_COMMUNITY_IDS, params })
).data
map.value.setFilter(content)
map.value.showCommunity()
}
const handleMapComplete = async () => {
map.value.addBoundary({ name: '南京东路街道', color: 'rgba(0,0,0,0)' })
setPoints(curViewType.value)
if (curMapType.value === '3D') {
if (curViewType.value === 'work1') {
map.value.layer('model_white_zw').visible = false
map.value.layer('model_white_dyjd').visible = true // 第一街道名
} else {
map.value.layer('model_white_zw').visible = true
map.value.layer('model_white_dyjd').visible = false
}
}
}
// 工作站勾边
const areaLines = ref([])
const selectArea = (e: any) => {
map.value.remove(areaLines.value)
areaLines.value = e.map(
(
name:
| 'workArea1'
| 'workArea2'
| 'workArea3'
| 'zhenxing'
| 'weihai'
| null
) => {
if (!name) return
let color = '#FF6161'
if (name.indexOf('workArea') >= 0) {
color = '#FFCE34'
}
return map.value.addPolyLine({
paths: store.state[name].paths,
strokeColor: color,
})
}
)
}
return {
handleMapComplete,
selectArea,
}
}
...@@ -5,7 +5,7 @@ ...@@ -5,7 +5,7 @@
rows="0.4rem auto" rows="0.4rem auto"
gap="0.05rem" gap="0.05rem"
> >
<m-title area="title" @click="showDrawer = false">南东城运</m-title> <m-title area="title">南东城运</m-title>
<m-map ref="map" @complete="handleMapComplete" /> <m-map ref="map" @complete="handleMapComplete" />
<m-animate enter="fadeInLeft" leave="fadeOutLeft"> <m-animate enter="fadeInLeft" leave="fadeOutLeft">
<Command v-show="'street' === curViewType && !fullScreen" area="left" /> <Command v-show="'street' === curViewType && !fullScreen" area="left" />
...@@ -38,7 +38,7 @@ ...@@ -38,7 +38,7 @@
/> />
</m-animate> </m-animate>
<ViewSelector /> <ViewSelector />
<MapBtns @full="fullScreen = $event" /> <MapBtns @change="selectArea" @full="fullScreen = $event" />
<m-drawer v-model="showDrawer"> <m-drawer v-model="showDrawer">
<CaseDrawer /> <CaseDrawer />
<!-- <PopulationDrawer /> --> <!-- <PopulationDrawer /> -->
...@@ -47,7 +47,7 @@ ...@@ -47,7 +47,7 @@
</template> </template>
<script lang="ts"> <script lang="ts">
import { computed, defineComponent, ref, watch } from 'vue' import { computed, defineComponent, onMounted, ref, nextTick } from 'vue'
import ManageBasic from './left/manage-basic.vue' import ManageBasic from './left/manage-basic.vue'
import Command from './left/command.vue' import Command from './left/command.vue'
import PublicWork from './right/public-work.vue' import PublicWork from './right/public-work.vue'
...@@ -59,6 +59,7 @@ import MapBtns from './components/map-btns.vue' ...@@ -59,6 +59,7 @@ import MapBtns from './components/map-btns.vue'
import CaseDrawer from './drawers/case-drawer.vue' import CaseDrawer from './drawers/case-drawer.vue'
import PopulationDrawer from './drawers/population-drawer.vue' import PopulationDrawer from './drawers/population-drawer.vue'
import store from '@/store' import store from '@/store'
import useSwitchMap from './hooks/useSwitchMap'
export default defineComponent({ export default defineComponent({
name: 'Main', name: 'Main',
...@@ -75,7 +76,6 @@ export default defineComponent({ ...@@ -75,7 +76,6 @@ export default defineComponent({
PopulationDrawer, PopulationDrawer,
}, },
setup() { setup() {
// store.commit('SET_CURRENT_VIEW', { name: '南京东路街道', type: 'street' })
store.dispatch('initData') store.dispatch('initData')
const curViewType = computed(() => store.state.curView.type) const curViewType = computed(() => store.state.curView.type)
const curTheme = computed(() => store.state.curTheme) const curTheme = computed(() => store.state.curTheme)
...@@ -96,41 +96,20 @@ export default defineComponent({ ...@@ -96,41 +96,20 @@ export default defineComponent({
const fullScreen = ref(false) const fullScreen = ref(false)
const showDrawer = ref(false) const showDrawer = ref(false)
const map = ref<any>(null) const map = ref<any>(null)
const mapInstance = ref<any>(null) onMounted(async () => {
await nextTick()
// watch( map.value.initMap({ viewMode: '2D' })
// () => curViewType.value, })
// (val) => { const { handleMapComplete, selectArea } = useSwitchMap(map)
// if (!val || !mapInstance.value) return
// if (val === 'work1') {
// mapInstance.value.getLayer('model_white_dyjd').visible = true // 第一街道名
// mapInstance.value.getLayer('model_white_dyjd').opacity = 0.8
// mapInstance.value.getLayer('model_white_zw').visible = false
// } else {
// mapInstance.value.getLayer('model_white_zw').visible = true
// mapInstance.value.getLayer('model_white_zw').opacity = 0.8
// }
// },
// { immediate: true }
// )
const handleMapComplete = (instance: any) => {
instance.getLayer('model_white_dyjd').visible = true
instance.getLayer('model_white_dyjd').opacity = 0.8
// instance.getLayer('model_white_zw').visible = true
// instance.getLayer('model_white_zw').opacity = 0.8
map.value.addBoundary({ name: '南京东路街道', color: 'rgba(0,0,0,0)' })
mapInstance.value = instance
}
return { return {
map, map,
mapInstance,
curViewType, curViewType,
curTheme, curTheme,
streetComponentList, streetComponentList,
fullScreen, fullScreen,
showDrawer, showDrawer,
handleMapComplete, handleMapComplete,
selectArea,
} }
}, },
}) })
......
<template> <template>
<!-- <m-card title="业务入口"> --> <!-- <m-card title="业务入口"> -->
<m-card title="重点工作"> <m-card title="业务入口">
<div class="content"> <div class="content">
<div <div
v-for="entry in entrys" v-for="entry in entrys"
......
...@@ -2,29 +2,32 @@ ...@@ -2,29 +2,32 @@
<m-card title="案件分析"> <m-card title="案件分析">
<div class="nav"> <div class="nav">
<div> <div>
<Tabs :list="tabs" horizontal /> <Tabs :list="tabs" horizontal @select="curTab = $event" />
</div> </div>
<div> <div>
<span <span
v-for="option in options" v-for="option in options"
:key="option" :key="option.key"
:class="{ on: curOption === option }" :class="{ on: curOption === option.key }"
@click="curOption = option" @click="curOption = option.key"
> >
{{ option }} {{ option.name }}
</span> </span>
</div> </div>
</div> </div>
<div class="rank"> <div class="rank">
<SubTitle>分类排行</SubTitle> <SubTitle>分类排行</SubTitle>
<div class="content"> <div v-if="rankList.length > 0" class="content">
<m-progress <m-scroll :length="rankList.length" :limit="4">
v-for="rank in rankList" <m-progress
:key="rank.name" v-for="rank in rankList"
:value="rank.value" :key="rank.name"
:msg="rank" :value="rank.rate"
/> :msg="rank"
/>
</m-scroll>
</div> </div>
<m-empty v-else />
</div> </div>
<div class="place"> <div class="place">
<SubTitle>多发地点</SubTitle> <SubTitle>多发地点</SubTitle>
...@@ -38,44 +41,66 @@ ...@@ -38,44 +41,66 @@
</template> </template>
<script lang="ts"> <script lang="ts">
import { defineComponent, ref } from 'vue' import { defineComponent, ref, computed, watch } from 'vue'
import Tabs, { TabsProp } from '../components/tabs.vue' import Tabs, { TabsProp } from '../components/tabs.vue'
import SubTitle from '../components/sub-title.vue' import SubTitle from '../components/sub-title.vue'
import Place, { PlaceProp } from '../components/place.vue' import Place, { PlaceProp } from '../components/place.vue'
import store from '@/store'
export default defineComponent({ export default defineComponent({
name: 'CaseAnalysis', name: 'CaseAnalysis',
components: { Tabs, SubTitle, Place }, components: { Tabs, SubTitle, Place },
setup() { setup() {
const curTab = ref('综合')
const tabs = ref<TabsProp[]>([ const tabs = ref<TabsProp[]>([
{ { name: '综合管理', key: '综合' },
key: 'all', { name: '街面管理', key: '街面' },
name: '综合管理', { name: '小区管理', key: '小区' },
},
{
key: 'street',
name: '街面管理',
},
{
key: 'community',
name: '小区管理',
},
])
const options = ref(['日', '周', '月'])
const curOption = ref('月')
const rankList = ref([
{ name: '分类1', value: 50 },
{ name: '分类2', value: 31 },
{ name: '分类3', value: 15 },
]) ])
const placeList = ref<PlaceProp[]>([ const options = ref([
{ name: '延安东路1292弄', value: 3, type: '路段' }, { name: '日', key: 'day' },
{ name: '延安东路1293弄', value: 5, type: '小区' }, { name: '周', key: 'week' },
{ name: '延安东路1294弄', value: 8, type: '商业' }, { name: '月', key: 'month' },
]) ])
const curOption = ref('month')
watch(
[() => curTab.value, () => curOption.value],
([type, time]) => {
if (!time || !type) return
store.dispatch('GET_CASE_CLASSIFICATION_RANK', {
managementType: type,
})
store.dispatch('GET_MOREHAPPEN_ADDR', {
managementType: type,
})
},
{ immediate: true }
)
const rankList = computed(() => {
const data = store.state.analysisRank[curOption.value] || []
const total = data.reduce((acc, cur) => acc + cur.num, 0)
return data.map((item: any) => ({
name: item.businsessType || item.businessType,
rate: +Math.ceil((item.num / total) * 100).toFixed(0),
value: item.num,
unit: '件',
}))
})
const placeList = computed(() => {
const data = store.state.moreHappenAddr[curOption.value] || []
return data.map((item: any) => ({
name: item.address,
value: item.num,
type: '路段',
}))
})
return { return {
tabs, tabs,
options, options,
curTab,
curOption, curOption,
rankList, rankList,
placeList, placeList,
...@@ -91,7 +116,7 @@ export default defineComponent({ ...@@ -91,7 +116,7 @@ export default defineComponent({
display flex display flex
align-items center align-items center
justify-content space-between justify-content space-between
margin .05rem 0 margin 0.05rem 0
>div >div
width 75% width 75%
&:last-child &:last-child
...@@ -99,20 +124,22 @@ export default defineComponent({ ...@@ -99,20 +124,22 @@ export default defineComponent({
display flex display flex
>span >span
$center() $center()
width .22rem width 0.22rem
height @width height @width
color $primary-border color $primary-border
border .01rem solid @color border 0.01rem solid @color
cursor pointer cursor pointer
&:hover &:hover, &.on
&.on
color $secondary-color color $secondary-color
border-color @color border-color @color
background rgba(50,197,255,.2) background rgba(50, 197, 255, 0.2)
.rank .rank
flex 1 overflow hidden
.content
height 1rem
overflow hidden
.place .place
margin .05rem 0 margin 0.05rem 0
.content .content
display flex display flex
justify-content space-between justify-content space-between
......
This diff is collapsed.
This diff is collapsed.
...@@ -87,6 +87,7 @@ export default defineComponent({ ...@@ -87,6 +87,7 @@ export default defineComponent({
store.dispatch('getDutyList', { store.dispatch('getDutyList', {
gridId: id, gridId: id,
managementType: type, managementType: type,
pageSize: 100,
}) })
}, },
{ immediate: true } { immediate: true }
......
This diff is collapsed.
...@@ -24,8 +24,13 @@ ...@@ -24,8 +24,13 @@
<m-sub>平安地图</m-sub> <m-sub>平安地图</m-sub>
<div class="safe-map"> <div class="safe-map">
<div> <div>
<p v-for="item in safeMap" :key="item.cmtName"> <p
<span @click="clickStreetName(item)">{{ item.cmtName }}</span> v-for="(item, index) in safeMap"
:key="item.cmtName"
:class="`${item.light ? 'show' : ''}`"
@click="clickStreetName(item, index)"
>
<span>{{ item.cmtName }}</span>
<m-count class="count" :value="item.score" /> <m-count class="count" :value="item.score" />
</p> </p>
</div> </div>
...@@ -41,6 +46,7 @@ ...@@ -41,6 +46,7 @@
enter="fadeInUp" enter="fadeInUp"
leave="fadeOutDown" leave="fadeOutDown"
translate-y="84%" translate-y="84%"
:mask-closable="false"
:title="`${streetData.cmtName}2021年1季度得分`" :title="`${streetData.cmtName}2021年1季度得分`"
> >
<div> <div>
...@@ -140,8 +146,15 @@ export default defineComponent({ ...@@ -140,8 +146,15 @@ export default defineComponent({
], ],
}) })
const clickStreetName = (item: any): void => { const clickStreetName = (item: any, index: number): void => {
searchModal.value = true console.log(item, index)
console.log(safeMap.value)
console.log(safeMap.value[index])
safeMap.value.forEach((item, index) => {
safeMap.value[index].light = false
})
safeMap.value[index].light = true
searchModal.value = !searchModal.value
streetData.value = item streetData.value = item
} }
// const houseSum = ref<SummaryProp[]>([ // const houseSum = ref<SummaryProp[]>([
...@@ -203,6 +216,7 @@ export default defineComponent({ ...@@ -203,6 +216,7 @@ export default defineComponent({
display flex display flex
>div >div
&:first-child &:first-child
cursor pointer
flex 1.7 flex 1.7
display flex display flex
flex-wrap wrap flex-wrap wrap
...@@ -214,6 +228,11 @@ export default defineComponent({ ...@@ -214,6 +228,11 @@ export default defineComponent({
.count .count
margin-left 0.08rem margin-left 0.08rem
font-size 0.12rem font-size 0.12rem
.show
span
color #FFD400
.count
color #FFD400
&:last-child &:last-child
$center() $center()
flex 1 flex 1
......
...@@ -30,7 +30,6 @@ export default defineComponent({ ...@@ -30,7 +30,6 @@ export default defineComponent({
<style lang="stylus" scoped> <style lang="stylus" scoped>
@import '../../components/MyComponent/main.styl' @import '../../components/MyComponent/main.styl'
.public-manage .public-manage
$full() $full()
display flex display flex
...@@ -43,5 +42,5 @@ export default defineComponent({ ...@@ -43,5 +42,5 @@ export default defineComponent({
.second-child .second-child
height 2rem height 2rem
.third-child .third-child
height .8rem height 0.8rem
</style> </style>
...@@ -41,12 +41,21 @@ ...@@ -41,12 +41,21 @@
<div class="chartBox"> <div class="chartBox">
<div v-if="showChart" class="drawCharts"> <div v-if="showChart" class="drawCharts">
<div> <div>
<m-pie class="chart1" :dataset="pieData1" :option="pieOption" /> <m-pie
class="chart1"
:dataset="pieData1"
:option="pieOption"
@init="handleInit"
/>
<span class="line"></span> <span class="line"></span>
<m-pie class="chart2" :dataset="pieData2" :option="pieOption" /> <m-pie class="chart2" :dataset="pieData2" :option="pieOption" />
</div> </div>
<div class="legend"> <div class="legend">
<div v-for="(item, i) in pieData2.source" :key="item.name"> <div
v-for="(item, i) in pieData2.source"
:key="item.name"
style="width: 70%"
>
<p> <p>
<span :style="{ background: pieOption.color[i][0] }" /> <span :style="{ background: pieOption.color[i][0] }" />
{{ item.name }} {{ item.name }}
...@@ -58,7 +67,11 @@ ...@@ -58,7 +67,11 @@
</div> </div>
</div> </div>
<div class="legendBottom"> <div class="legendBottom">
<div v-for="(item, i) in pieData1.source" :key="item.name"> <div
v-for="(item, i) in pieData1.source"
:key="item.name"
@click="changePie2(item, i)"
>
<p> <p>
<span :style="{ background: pieOption.color[i][0] }" /> <span :style="{ background: pieOption.color[i][0] }" />
<m-count class="count" :value="item.value" /> <m-count class="count" :value="item.value" />
...@@ -104,9 +117,10 @@ ...@@ -104,9 +117,10 @@
v-model="searchModal" v-model="searchModal"
enter="fadeInRight" enter="fadeInRight"
leave="fadeOutRight" leave="fadeOutRight"
offset="55%" offset="65%"
width="40%" width="40%"
title="重点关注楼宇清单" title="重点关注楼宇清单"
:mask-closable="false"
> >
<div> <div>
<m-table <m-table
...@@ -158,25 +172,41 @@ export default defineComponent({ ...@@ -158,25 +172,41 @@ export default defineComponent({
{ name: '隐患点数', value: 0 }, { name: '隐患点数', value: 0 },
{ name: '危险点数', value: 0 }, { name: '危险点数', value: 0 },
]) ])
watch(
[() => outHouseWall.value, () => year.value], const secPieKey = ref('外立面附加设施隐患点') // 默认展示的第二饼图类型
([data, year]) => { const pieData1 = ref({
if (data.length === 0) return dimensions: [
const { checkNum = 0, hiddenPoint = 0, dangerPoint = 0 } = data.find( { name: 'name', displayName: '类型' },
(e: any) => e.year === year { name: 'value', displayName: '数量' },
) ],
houseSum.value = [ source: [
{ name: '检查楼数', value: checkNum }, {
{ name: '隐患点数', value: hiddenPoint }, name: '外立面附加设施危险点',
{ name: '危险点数', value: dangerPoint }, value: 1,
] },
}, {
{ immediate: true } name: '外立面附加设施隐患点',
) value: 1,
},
{
name: '外墙面层隐患点',
value: 1,
},
{
name: '外墙面层危险点',
value: 1,
},
],
})
//切换年份 //切换年份
const changeYear = (value: string) => { const changeYear = (value: string) => {
year.value = value year.value = value
} }
//切换第二饼图展示的类别
const changePie2 = (item: any, i: number) => {
secPieKey.value = item.name
}
const list = computed(() => { const list = computed(() => {
return [ return [
...@@ -211,41 +241,16 @@ export default defineComponent({ ...@@ -211,41 +241,16 @@ export default defineComponent({
{ name: '楼宇名称', value: 4, danger: 1 }, { name: '楼宇名称', value: 4, danger: 1 },
{ name: '楼宇名称', value: 4, danger: 1 }, { name: '楼宇名称', value: 4, danger: 1 },
]) ])
const pieData1 = computed(() => {
return {
dimensions: [
{ name: 'name', displayName: '类型' },
{ name: 'value', displayName: '数量' },
],
source: [
{
// name: '外立面附加设施危险点',
// value: outHouseWall.value.outerWallFacilityDangerPoint,
// },
// {
// name: '外立面附加设施隐患点',
// value: outHouseWall.value.outerWallFacilityHiddenPoint,
// },
// {
// name: '外墙面层隐患点',
// value: outHouseWall.value.outerWallHiddenPoint,
// },
// {
// name: '外墙面层危险点',
// value: outHouseWall.value.outerWallDangerPoint,
},
],
}
})
const pieData2 = ref({ const pieData2 = ref({
dimensions: [ dimensions: [
{ name: 'name', displayName: '类型' }, { name: 'name', displayName: secPieKey.value },
{ name: 'value', displayName: '数量' }, { name: 'value', displayName: '数量' },
], ],
source: [ source: [
{ name: '第一工作站', value: 30 }, { name: '第一工作站', value: 1 },
{ name: '第二工作站', value: 40 }, { name: '第二工作站', value: 1 },
{ name: '第三工作站', value: 48 }, { name: '第三工作站', value: 1 },
], ],
}) })
const pieOption = ref({ const pieOption = ref({
...@@ -267,6 +272,114 @@ export default defineComponent({ ...@@ -267,6 +272,114 @@ export default defineComponent({
}, },
], ],
}) })
const handleInit = (instance: any) => {
instance.on('click', (e: any) => {
console.log('click~~~~~', e)
secPieKey.value = e.name
})
}
watch(
// 监听年份切花更改检查楼数 隐患点数 危险点数
[() => outHouseWall.value, () => year.value],
([data, year]) => {
if (data.length === 0) return
const {
checkNum = 0,
hiddenPoint = 0,
dangerPoint = 0,
outerWallDangerPoint = 0,
outerWallFacilityDangerPoint = 0,
outerWallFacilityHiddenPoint = 0,
outerWallHiddenPoint = 0,
} = data.find((e: any) => e.year === year)
houseSum.value = [
{ name: '检查楼数', value: checkNum },
{ name: '隐患点数', value: hiddenPoint },
{ name: '危险点数', value: dangerPoint },
]
pieData1.value = {
dimensions: [
{ name: 'name', displayName: '类型' },
{ name: 'value', displayName: '数量' },
],
source: [
{
name: '外墙面层隐患点',
value: outerWallHiddenPoint,
},
{
name: '外墙面层危险点',
value: outerWallDangerPoint,
},
{
name: '外立面附加设施隐患点',
value: outerWallFacilityHiddenPoint,
},
{
name: '外立面附加设施危险点',
value: outerWallFacilityDangerPoint,
},
],
}
},
{ immediate: true }
)
watch(
[() => pieData.value, () => year.value, () => secPieKey.value],
([data, year, secPieKey]) => {
if (data.length === 0) return
// console.log(data, year)
const arr: any = []
data.forEach((item: any) => {
if (item.year == year) {
arr.push(item)
}
})
let secPieKeyName = ''
switch (secPieKey) {
case '外墙面层隐患点':
secPieKeyName = 'outerWallHiddenPoint'
break
case '外墙面层危险点':
secPieKeyName = 'outerWallDangerPoint'
break
case '外立面附加设施隐患点':
secPieKeyName = 'outerWallFacilityHiddenPoint'
break
case '外立面附加设施危险点':
secPieKeyName = 'outerWallFacilityDangerPoint'
break
default:
break
}
const first = arr.find(
(e: any) => e.workstationName == '第一综合网格工作站(武胜路)'
)[secPieKeyName]
const second = arr.find(
(e: any) => e.workstationName == '第二综合网格工作站(厦门路)'
)[secPieKeyName]
const third = arr.find(
(e: any) => e.workstationName == '第三综合网格工作站(牯林路)'
)[secPieKeyName]
// // 将第二张饼图的数据更新
pieData2.value = {
dimensions: [
{ name: 'name', displayName: secPieKey },
{ name: 'value', displayName: '数量' },
],
source: [
{ name: '第一工作站', value: first || 0 },
{ name: '第二工作站', value: second || 0 },
{ name: '第三工作站', value: third || 0 },
],
}
},
{ immediate: true }
)
return { return {
list, list,
...@@ -284,6 +397,8 @@ export default defineComponent({ ...@@ -284,6 +397,8 @@ export default defineComponent({
buildings, buildings,
outHouseWall, outHouseWall,
pieData, pieData,
changePie2,
handleInit,
} }
}, },
}) })
...@@ -343,7 +458,7 @@ export default defineComponent({ ...@@ -343,7 +458,7 @@ export default defineComponent({
display flex display flex
flex-direction column flex-direction column
.drawCharts .drawCharts
height 60% height 67%
display flex display flex
>div >div
display flex display flex
...@@ -387,17 +502,17 @@ export default defineComponent({ ...@@ -387,17 +502,17 @@ export default defineComponent({
flex-direction row flex-direction row
justify-content space-around justify-content space-around
text-align left text-align left
height 40% height 30%
>div >div
width 25% width 25%
display flex display flex
flex-direction column flex-direction column
justify-content space-between justify-content space-between
align-items center // align-items center
>span >span
width 70% width 70%
>p >p
flex 1 // flex 1
white-space nowrap white-space nowrap
width 100% width 100%
padding-left 0.06rem padding-left 0.06rem
...@@ -448,6 +563,9 @@ export default defineComponent({ ...@@ -448,6 +563,9 @@ export default defineComponent({
justify-content space-around justify-content space-around
flex-direction row flex-direction row
font-size 0.06rem font-size 0.06rem
.count
color #fff
padding-left 0.03rem
>span >span
display flex display flex
flex-direction row flex-direction row
......
...@@ -17,5 +17,5 @@ ...@@ -17,5 +17,5 @@
} }
}, },
"include": ["src/**/*.ts", "src/**/*.d.ts", "src/**/*.tsx", "src/**/*.vue"], "include": ["src/**/*.ts", "src/**/*.d.ts", "src/**/*.tsx", "src/**/*.vue"],
"exclude": ["node_modules", "dist"] "exclude": ["node_modules", "dist", "public"]
} }
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment