Browse Source

Merge branch 'dev' into dev-220228

shibei_master
jiangyy 4 years ago
parent
commit
b95f8797eb
  1. 3
      .env.production.uat
  2. 1
      .gitignore
  3. 19713
      package-lock.json
  4. 3
      public/index.html
  5. BIN
      src/assets/img/modules/visual/box-2.png
  6. BIN
      src/assets/img/shuju/elegant.png
  7. 45
      src/assets/scss/modules/visual/basicInfoMain.scss
  8. 5
      src/router/index.js
  9. 2
      src/utils/request.js
  10. 51
      src/views/modules/base/community/buildTable.vue
  11. 3
      src/views/modules/base/community/community.vue
  12. 57
      src/views/modules/base/community/communityTable.vue
  13. 32
      src/views/modules/base/community/roomTable.vue
  14. 70
      src/views/modules/base/resi.vue
  15. 69
      src/views/modules/communityParty/elegant/index.vue
  16. 38
      src/views/modules/communityParty/regionalParty/activitysForm.vue
  17. 1306
      src/views/modules/communityService/measure/index.vue
  18. 291
      src/views/modules/importRecord/index.vue
  19. 48
      src/views/modules/visual/basicinfo/basicInfoMain.vue
  20. 8
      src/views/modules/visual/communityGovern/typePieOption.js
  21. 8
      src/views/modules/visual/communityParty/community.vue
  22. 4
      src/views/modules/visual/communityParty/dialogInfo.vue
  23. 625
      src/views/modules/visual/communityParty/elegant.vue
  24. 201
      src/views/modules/visual/communityParty/elegantInfo.vue
  25. 2
      src/views/modules/visual/communityParty/party.vue
  26. 4
      src/views/modules/visual/measure/volunteer.vue

3
.env.production.uat

@ -1,4 +1,5 @@
NODE_ENV=production
VUE_APP_API_SERVER = http://120.27.18.76/api
# VUE_APP_API_SERVER = http://120.27.18.76/api
VUE_APP_API_SERVER = https://epmet-test.elinkservice.cn/api
VUE_APP_NODE_ENV=prod:uat
VUE_APP_PUBLIC_PATH=epmet-oper

1
.gitignore

@ -15,4 +15,5 @@ hs_err_pid*
node_modules
dist
epmet-oper
package-lock.json
.idea/

19713
package-lock.json

File diff suppressed because it is too large

3
public/index.html

@ -57,7 +57,8 @@
<!-- 验收测试环境 aliyun -->
<% if (process.env.VUE_APP_NODE_ENV==='prod:uat' ) { %>
<script>
window.SITE_CONFIG['apiURL'] = 'http://120.27.18.76/api'
// window.SITE_CONFIG['apiURL'] = 'http://120.27.18.76/api'
window.SITE_CONFIG['apiURL'] = 'https://epmet-test.elinkservice.cn/api'
</script>
<% } %>
<!-- 生产环境 -->

BIN
src/assets/img/modules/visual/box-2.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

BIN
src/assets/img/shuju/elegant.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 393 KiB

45
src/assets/scss/modules/visual/basicInfoMain.scss

@ -378,3 +378,48 @@
flex: 1;
}
}
.div_agency_list {
z-index: 1000;
position: absolute;
top: 50px;
right: 600px;
box-sizing: border-box;
width: 320px;
height: 470px;
color: #fff;
background: url('../../../img/modules/visual/box-2.png') no-repeat center;
background-size: 100% 100%;
padding: 45px 20px 35px 20px;
.no-data-img {
text-align: center;
margin-top: 50px;
margin-left: 15px;
}
.agency_list {
.agency_item {
height: 50px;
font-size: 17px;
font-family: PingFang SC;
font-weight: 400;
color: #ffffff;
line-height: 50px;
padding-left: 12px;
}
.agency_item_on {
background: #08216c;
border-radius: 2px;
}
.agency_item:hover {
cursor: pointer;
background-color: #011168;
border-radius: 4px 0 0 4px;
border: none;
box-shadow: 0 0 10px inset #1a5afd;
border-radius: 2px;
}
}
}

5
src/router/index.js

@ -250,6 +250,11 @@ router.beforeEach((to, from, next) => {
name: "区域化党建",
id: "5fwaefwaefawef588",
},
{
url: "/visual/communityParty/elegant",
name: "党员风采",
id: "5fwaefwaefawef589",
},
],
},
{

2
src/utils/request.js

@ -7,7 +7,7 @@ import isPlainObject from 'lodash/isPlainObject'
const http = axios.create({
baseURL: window.SITE_CONFIG['apiURL'],
timeout: 1000 * 180,
timeout: 1000 * 900,
withCredentials: true
})

51
src/views/modules/base/community/buildTable.vue

@ -34,15 +34,18 @@
<el-button style="float:left"
type="yellow"
size="small"
icon="el-icon-download"
@click="handleExport">导出</el-button>
<el-button style="float:left"
type="green"
size="small"
icon="el-icon-plus"
@click="handleAdd">新增楼宇</el-button>
<el-button style=";margin-left:10px"
type="blue"
size="small"
icon="el-icon-download"
@click="handleExportModule('building')">下载楼宇模板</el-button>
<el-upload style=""
@ -55,11 +58,14 @@
:http-request="(()=>{uploadFile( 'building')})">
<el-button style="margin-left:10px"
size="small"
icon="el-icon-upload2"
:loading="importBuildingLoading"
type="red">导入楼宇数据</el-button>
</el-upload>
<el-button style=";margin-left:10px"
type="blue"
size="small"
icon="el-icon-download"
@click="handleExportModule('room')">下载房屋模板</el-button>
<el-upload style=""
@ -72,6 +78,8 @@
:http-request="(()=>{uploadFile( 'room')})">
<el-button style="margin-left:10px"
size="small"
icon="el-icon-upload2"
:loading="importRoomLoading"
type="red">导入房屋数据</el-button>
</el-upload>
</div>
@ -172,7 +180,8 @@ let loading // 加载动画
export default {
data () {
return {
loading: false,
importBuildingLoading: false,
importRoomLoading: false,
total: 0,
pageSize: 20,
pageNo: 0,
@ -429,10 +438,14 @@ export default {
async uploadFile (type) {
if (this.fileName == "") {
this.$message.warning('请选择要上传的文件!')
return false
}
this.loading = true
this.$message({
showClose: true,
message: '导入中,请到系统管理-导入记录中查看进度',
duration: 0
})
//
@ -451,33 +464,37 @@ export default {
this.$refs['upload_building'].clearFiles()
// url = 'http://192.168.51.26:8080/api/gov/org/building/buildingimport'
url = '/gov/org/building/buildingimport'
this.importBuildingLoading = true
} else if (type === 'room') {
this.$refs['upload_room'].clearFiles()
// url = 'http://192.168.51.26:8080/api/gov/org/house/houseimport'
url = '/gov/org/house/houseimport'
this.importRoomLoading = true
}
this.startLoading()
window.app.ajax.post2(url, fileFormData,
(data, rspMsg) => {
this.endLoading()
if (data.code === 0 || data.code > 8000) {
// this.$message({
// type: "success",
// message: ""
// });
// this.$message.success(rspMsg)
// this.$emit('refreshTree')
// this.loadTable()
}
this.showMessage(rspMsg)
this.$emit('refreshTree')
this.loadTable()
if (type === 'building') {
this.importBuildingLoading = false
} else if (type === 'room') {
this.importRoomLoading = false
}
},
(rspMsg, data) => {
this.endLoading()
this.$message.error(rspMsg)
if (type === 'building') {
this.importBuildingLoading = false
} else if (type === 'room') {
this.importRoomLoading = false
}
}, { headers: { 'Content-Type': 'multipart/form-data' } })
},

3
src/views/modules/base/community/community.vue

@ -276,7 +276,8 @@ export default {
.div_table {
margin-left: 15px;
width: calc(100vw - 550px);
flex: 1;
// width: calc(100vw - 550px);
background-color: #ffffff;
border-radius: 5px;
padding: 10px;

57
src/views/modules/base/community/communityTable.vue

@ -34,16 +34,19 @@
<el-button style=""
type="yellow"
size="small"
icon="el-icon-download"
@click="handleExport">导出</el-button>
<el-button style=""
type="green"
size="small"
icon="el-icon-plus"
@click="handleAdd">新增小区</el-button>
<div class="btn_upload"
v-if="agencyObj.level==='community'||agencyObj.level==='grid'">
<el-button style=""
type="blue"
size="small"
icon="el-icon-download"
@click="handleExportModule('community')">下载小区模板</el-button>
<el-upload ref="upload_community"
@ -56,12 +59,15 @@
:http-request="(()=>{uploadFile( 'community')})">
<el-button style="margin-left:10px"
size="small"
icon="el-icon-upload2"
:loading="importCommunityLoading"
type="red">导入小区数据</el-button>
</el-upload>
<el-button style=";margin-left:10px"
type="blue"
size="small"
icon="el-icon-download"
@click="handleExportModule('building')">下载楼宇模板</el-button>
<el-upload style=""
@ -74,11 +80,14 @@
:http-request="(()=>{uploadFile( 'building')})">
<el-button style="margin-left:10px"
size="small"
icon="el-icon-upload2"
:loading="importBuildingLoading"
type="red">导入楼宇数据</el-button>
</el-upload>
<el-button style=";margin-left:10px"
type="blue"
size="small"
icon="el-icon-download"
@click="handleExportModule('room')">下载房屋模板</el-button>
<el-upload style=""
@ -91,6 +100,8 @@
:http-request="(()=>{uploadFile( 'room')})">
<el-button style="margin-left:10px"
size="small"
icon="el-icon-upload2"
:loading="importRoomLoading"
type="red">导入房屋数据</el-button>
</el-upload>
</div>
@ -208,7 +219,9 @@ let loading // 加载动画
export default {
data () {
return {
loading: false,
importBuildingLoading: false,
importRoomLoading: false,
importCommunityLoading: false,
total: 0,
pageSize: 20,
pageNo: 0,
@ -550,10 +563,16 @@ export default {
async uploadFile (type) {
if (this.fileName == "") {
this.$message.warning('请选择要上传的文件!')
return false
}
this.loading = true
this.$message({
showClose: true,
message: '导入中,请到系统管理-导入记录中查看进度',
duration: 0
})
//
let url = ''
@ -564,6 +583,7 @@ export default {
fileFormData.append('orgType', this.agencyObj.level === 'grid' ? 'grid' : 'agency');//filenamefiletest.zip
if (type === 'community') {
this.importCommunityLoading = true
this.$refs['upload_community'].clearFiles()
url = '/gov/org/icneighborhood/neighborhoodimport'
@ -571,27 +591,44 @@ export default {
} else if (type === 'building') {
this.$refs['upload_building'].clearFiles()
url = '/gov/org/building/buildingimport'
this.importBuildingLoading = true
} else if (type === 'room') {
this.$refs['upload_room'].clearFiles()
url = '/gov/org/house/houseimport'
this.importRoomLoading = true
}
this.startLoading()
window.app.ajax.post2(url, fileFormData,
(data, rspMsg) => {
this.endLoading()
if (data.code === 0 || data.code > 8000) {
}
this.$emit('refreshTree')
this.loadTable()
// this.showMessage(rspMsg)
if (type === 'community') {
this.importCommunityLoading = false
} else if (type === 'building') {
this.importBuildingLoading = false
} else if (type === 'room') {
this.importRoomLoading = false
}
this.showMessage(rspMsg)
},
(rspMsg, data) => {
this.endLoading()
this.$message.error(rspMsg)
if (type === 'community') {
this.importCommunityLoading = false
} else if (type === 'building') {
this.importBuildingLoading = false
} else if (type === 'room') {
this.importRoomLoading = false
}
// this.$message.error(rspMsg)
}, { headers: { 'Content-Type': 'multipart/form-data' } })

32
src/views/modules/base/community/roomTable.vue

@ -34,14 +34,17 @@
<el-button style="float:left"
type="yellow"
size="small"
icon="el-icon-download"
@click="handleExport">导出</el-button>
<el-button style="float:left"
type="green"
icon="el-icon-plus"
size="small"
@click="handleAdd">新增房屋</el-button>
<el-button style="float:left"
type="blue"
size="small"
icon="el-icon-download"
@click="handleExportModule">下载房屋模板</el-button>
<el-upload ref="upload"
:multiple='false'
@ -54,6 +57,8 @@
:http-request="uploadFile">
<el-button style="margin-left:10px"
size="small"
icon="el-icon-upload2"
:loading="importRoomLoading"
type="red">导入房屋数据</el-button>
</el-upload>
</div>
@ -165,7 +170,7 @@ let loading // 加载动画
export default {
data () {
return {
loading: false,
importRoomLoading: false,
total: 0,
pageSize: 20,
pageNo: 0,
@ -407,13 +412,19 @@ export default {
},
async uploadFile () {
this.loading = true
if (this.fileName == "") {
this.$message.warning('请选择要上传的文件!')
return false
}
this.$message({
showClose: true,
message: '导入中,请到系统管理-导入记录中查看进度',
duration: 0
})
//
this.$refs['upload'].clearFiles()
@ -424,24 +435,19 @@ export default {
fileFormData.append('orgId', this.agencyObj.id);//filenamefiletest.zip
fileFormData.append('orgType', this.agencyObj.level);//filenamefiletest.zip
this.startLoading()
this.importRoomLoading = true
window.app.ajax.post2(url, fileFormData,
(data, rspMsg) => {
this.endLoading()
if (data.code === 0 || data.code > 8000) {
// this.$message({
// type: "success",
// message: ""
// });
// this.$emit('refreshTree')
// this.loadTable()
}
this.showMessage(rspMsg)
this.$emit('refreshTree')
this.loadTable()
this.importRoomLoading = false
},
(rspMsg, data) => {
this.endLoading()
this.$message.error(rspMsg)
this.importRoomLoading = false
}, { headers: { 'Content-Type': 'multipart/form-data' } })

70
src/views/modules/base/resi.vue

@ -457,38 +457,56 @@ export default {
async uploadHttpRequest (file) {
this.importLoading = true
this.importBtnTitle = '正在上传中...'
this.$message({
showClose: true,
message: '导入中,请到系统管理-导入记录中查看进度',
duration: 0
})
const formData = new FormData() //FormDataappend('key', value)
formData.append('file', file.file) //
await axios({
url: window.SITE_CONFIG['apiURL'] + '/epmetuser/icresiuser/importExcel',
method: 'post',
data: formData,
timeout: '900000',
responseType: 'blob'
})
.then((res) => {
if (res.headers["content-disposition"]) {
let fileName = window.decodeURI(res.headers["content-disposition"].split(";")[1].split("=")[1])
console.log('filename', fileName)
let blob = new Blob([res.data], { type: 'application/vnd.ms-excel' })
var url = window.URL.createObjectURL(blob)
var aLink = document.createElement('a')
aLink.style.display = 'none'
aLink.href = url
aLink.setAttribute('download', fileName)
document.body.appendChild(aLink)
aLink.click()
document.body.removeChild(aLink) //
window.URL.revokeObjectURL(url) //blob
}
this.getTableData()
})
.catch(err => {
await this.$http
.post('/epmetuser/icresiuser/importExcel', formData).then(res => {
console.log('res-up', res)
if (res.data.code == 0 && res.data.msg == 'success') {
this.$message.success('导入成功')
this.getTableData()
} else this.$message.error(res.data.msg)
}).catch(err => {
console.log('失败', err)
file.onError() //
this.$message.error('导入失败')
})
// await axios({
// url: window.SITE_CONFIG['apiURL'] + '/epmetuser/icresiuser/importExcel',
// method: 'post',
// data: formData,
// timeout: '300000',
// responseType: 'blob'
// })
// .then((res) => {
// console.log('res-up', res)
// // if (res.headers["content-disposition"]) {
// // let fileName = window.decodeURI(res.headers["content-disposition"].split(";")[1].split("=")[1])
// // console.log('filename', fileName)
// // let blob = new Blob([res.data], { type: 'application/vnd.ms-excel' })
// // var url = window.URL.createObjectURL(blob)
// // var aLink = document.createElement('a')
// // aLink.style.display = 'none'
// // aLink.href = url
// // aLink.setAttribute('download', fileName)
// // document.body.appendChild(aLink)
// // aLink.click()
// // document.body.removeChild(aLink) //
// // window.URL.revokeObjectURL(url) //blob
// // }
// this.getTableData()
// })
// .catch(err => {
// console.log('', err)
// file.onError() //
// this.$message.error('')
// })
this.importLoading = false
this.importBtnTitle = '导入人员数据'
this.$refs.upload.clearFiles()

69
src/views/modules/communityParty/elegant/index.vue

@ -374,36 +374,55 @@ export default {
async uploadHttpRequest(file) {
this.importLoading = true
this.importBtnTitle = '正在上传中...'
this.$message({
showClose: true,
message: '导入中,请到系统管理-导入记录中查看进度',
duration: 0
})
const formData = new FormData() //FormDataappend('key', value)
formData.append('file', file.file) //
await axios({
url: window.SITE_CONFIG['apiURL'] + '/resi/partymember/icpartymemberstyle/import',
method: 'post',
data: formData,
responseType: 'blob'
})
.then((res) => {
// this.importLoading = false
// this.importBtnTitle = ''
// let fileName = window.decodeURI(res.headers["content-disposition"].split(";")[1].split("=")[1])
// console.log('filename', fileName)
// let blob = new Blob([res.data], { type: 'application/vnd.ms-excel' })
// var url = window.URL.createObjectURL(blob)
// var aLink = document.createElement('a')
// aLink.style.display = 'none'
// aLink.href = url
// aLink.setAttribute('download', fileName)
// document.body.appendChild(aLink)
// aLink.click()
// document.body.removeChild(aLink) //
// window.URL.revokeObjectURL(url) //blob
this.getTableData()
})
.catch( err => {
this.$http
.post('/resi/partymember/icpartymemberstyle/import', formData).then(res => {
console.log('res-up', res)
if (res.data.code == 0 && res.data.msg == 'success') {
this.$message.success('导入成功')
this.getTableData()
} else {
this.$message.error(res.data.msg)
}
}).catch(err => {
console.log('失败', err)
file.onError() //
this.$message.error('导入失败')
})
})
// await axios({
// url: window.SITE_CONFIG['apiURL'] + '/resi/partymember/icpartymemberstyle/import',
// method: 'post',
// data: formData,
// responseType: 'blob'
// })
// .then((res) => {
// // this.importLoading = false
// // this.importBtnTitle = ''
// // let fileName = window.decodeURI(res.headers["content-disposition"].split(";")[1].split("=")[1])
// // console.log('filename', fileName)
// // let blob = new Blob([res.data], { type: 'application/vnd.ms-excel' })
// // var url = window.URL.createObjectURL(blob)
// // var aLink = document.createElement('a')
// // aLink.style.display = 'none'
// // aLink.href = url
// // aLink.setAttribute('download', fileName)
// // document.body.appendChild(aLink)
// // aLink.click()
// // document.body.removeChild(aLink) //
// // window.URL.revokeObjectURL(url) //blob
// this.getTableData()
// })
// .catch( err => {
// console.log('', err)
// file.onError() //
// this.$message.error('')
// })
this.importLoading = false
this.importBtnTitle = '导入人员数据'
this.$refs.upload.clearFiles()

38
src/views/modules/communityParty/regionalParty/activitysForm.vue

@ -11,8 +11,18 @@
<el-form-item label="服务事项"
label-width="150px"
prop="serviceMatter">
<el-select class="item_width_1"
prop="serviceMatterList">
<el-checkbox-group class="item_width_1"
style="display:flex;flex-wrap:wrap"
v-model="formData.serviceMatterList">
<el-checkbox v-for="item in serviceList"
:key="item.value"
:label="item.value">{{item.label}}</el-checkbox>
</el-checkbox-group>
<!-- <el-select class="item_width_1"
v-model="formData.serviceMatter"
placeholder="请选择"
clearable>
@ -21,15 +31,23 @@
:label="item.label"
:value="item.value">
</el-option>
</el-select>
</el-select> -->
</el-form-item>
<el-form-item label="单位名称"
prop="unitId"
prop="unitIdList"
label-width="150px"
style="display: block">
<el-select class="item_width_1"
<el-checkbox-group class="item_width_1"
style="display:flex;flex-wrap:wrap"
v-model="formData.unitIdList">
<el-checkbox v-for="item in unitList"
:key="item.value"
:label="item.value">{{item.label}}</el-checkbox>
</el-checkbox-group>
<!-- <el-select class="item_width_1"
v-model="formData.unitId"
placeholder="请选择"
clearable>
@ -38,7 +56,7 @@
:label="item.label"
:value="item.value">
</el-option>
</el-select>
</el-select> -->
</el-form-item>
<el-form-item label="活动标题"
@ -207,7 +225,9 @@ export default {
activityId: '',
formData: {
serviceMatter: '',//
serviceMatterList: [],
unitId: '',//ID
unitIdList: [],
title: '',//
target: '',//
content: '',//
@ -457,7 +477,9 @@ export default {
this.keyWords = ''
this.formData = {
serviceMatter: '',//
serviceMatterList: [],
unitId: '',//ID
unitIdList: [],
title: '',//
target: '',//
content: '',//
@ -488,10 +510,10 @@ export default {
computed: {
dataRule () {
return {
serviceMatter: [
serviceMatterList: [
{ required: true, message: '服务事项不能为空', trigger: 'blur' }
],
unitId: [
unitIdList: [
{ required: true, message: '单位名称不能为空', trigger: 'blur' },
],
title: [

1306
src/views/modules/communityService/measure/index.vue

File diff suppressed because it is too large

291
src/views/modules/importRecord/index.vue

@ -0,0 +1,291 @@
<template>
<div>
<el-card class="resi-card-table">
<div class="resi-row-btn">
<h2 type="success" size="small">导入记录</h2>
</div>
<el-table
:data="tableData"
border
style="width: 100%"
class="resi-table"
:max-height="maxTableHeight"
>
<el-table-column label="序号" type="index" align="center" width="50" />
<el-table-column prop="originFileName" label="文件名">
</el-table-column>
<el-table-column prop="startTime" label="导入时间"> </el-table-column>
<el-table-column label="导入状态" align="center" width="180">
<template slot-scope="scope">
<span
v-if="scope.row.processStatus == 'processing'"
>导入中</span
>
<span
v-else-if="scope.row.processStatus == 'finished'"
>已完成</span
>
<a target="_blank"
:href="scope.row.resultDescFile"
style="color: #00a7a9"
v-else-if="scope.row.processStatus == 'finished_fail'"
>下载失败说明</a
>
</template>
</el-table-column>
</el-table>
<div>
<el-pagination
@size-change="handleSizeChange"
@current-change="handleCurrentChange"
:current-page.sync="pageNo"
:page-sizes="[20, 50, 100, 200]"
:page-size="parseInt(pageSize)"
layout="sizes, prev, pager, next"
:total="total"
>
</el-pagination>
</div>
</el-card>
</div>
</template>
<script>
import { requestPost } from "@/js/dai/request";
import nextTick from "dai-js/tools/nextTick";
import { mapGetters } from "vuex";
import axios from "axios";
export default {
components: {},
data() {
return {
openSearch: false,
formShow: false,
formTitle: "",
pageNo: 1,
pageSize: window.localStorage.getItem("pageSize") || 20,
total: 1,
tableData: [
// {
// originFileName: '.xls',
// processStatus: 'finished_fail',
// startTime: '2022-02-22',
// resultDescFile: 'http://www.baidu.com',
// }
],
};
},
computed: {
maxTableHeight() {
return this.clientHeight - 450;
},
...mapGetters(["clientHeight"]),
},
watch: {},
mounted() {
this.getTableData();
},
methods: {
handleSizeChange(val) {
console.log(`每页 ${val}`);
this.pageSize = val;
window.localStorage.setItem("pageSize", val);
this.getTableData();
},
handleCurrentChange(val) {
console.log(`当前页: ${val}`);
this.pageNo = val;
this.getTableData();
},
handleClose() {
this.formShow = false;
},
handleSearch(val) {
console.log(this.fmData);
this.pageNo = 1;
this.getTableData();
},
async handleAdd() {
this.formShow = true;
await nextTick();
console.log(this.$refs);
this.$refs.eleEditForm.initForm("add");
},
async handleDel(rowData, rowIndex) {
console.log(rowData, rowIndex);
const url = "/heart/societyorg/del";
const { tableData } = this;
const { data, code, msg } = await requestPost(url, {
societyId: tableData[rowIndex].societyId,
});
if (code === 0) {
this.$message.success("删除成功!");
this.getTableData();
} else {
this.$message.success("操作失败!");
}
},
async getTableData() {
const url = "/commonservice/import-task/page";
const { pageSize, pageNo, fmData } = this;
const { data, code, msg } = await requestPost(url, {
pageSize,
pageNo,
...fmData,
});
if (code === 0) {
console.log("列表请求成功!!!!!!!!!!!!!!");
this.total = data.total || 0;
this.tableData = data.list
? data.list.map((item) => {
return item;
})
: [];
} else {
}
},
},
};
</script>
<style lang="scss" scoped>
.tabs-other-info {
.el-tabs__item {
// width: 50px;
height: 20px;
box-sizing: border-box;
margin-right: 7px;
padding: 0 10px !important;
font-size: 8px;
font-weight: 500;
color: #666666;
line-height: 20px;
background: #ebecf1;
border-radius: 2px;
}
.el-tabs__nav-wrap::after,
.el-tabs__active-bar {
display: none;
}
.el-tabs__nav-next,
.el-tabs__nav-prev {
line-height: 20px;
}
}
.resi-card-table {
margin-top: 20px;
}
.resi-row-btn {
margin-bottom: 13px;
.upload-btn {
display: inline-block;
margin: 0 10px;
}
}
.resi-other {
width: 100%;
display: flex;
.resi-other-title {
width: 100px;
box-sizing: border-box;
margin-bottom: 10px;
// padding: 6px 12px 0 0;
font-size: 16px;
font-weight: 500;
color: #333;
text-align: center;
}
.tabs-other-info {
// padding-left: 60px;
}
}
.resi-btns {
margin-top: 20px;
text-align: center;
}
.resi-container .resi-card {
position: relative;
overflow: visible;
}
.resi-down {
position: absolute;
left: 50%;
bottom: -10px;
display: flex;
justify-content: center;
align-items: center;
width: 46px;
height: 12px;
box-sizing: border-box;
margin-left: -23rpx;
cursor: pointer;
background: #ffffff;
border-radius: 0 0 10px 10px;
img {
display: block;
}
}
.resi-row-box {
height: 104px;
overflow: hidden;
transition: height 0.5s;
}
.resi-row-more {
height: max-content;
transition: height 0.5s;
}
.resi-row {
margin-bottom: 20px;
}
.resi-search {
.el-col {
text-align: right;
}
}
.resi-cell {
display: flex;
align-items: center;
.resi-cell-label {
width: 70px;
box-sizing: border-box;
margin-right: 15px;
text-align: right;
// line-height: 32;
}
.resi-cell-value-radio {
display: flex;
align-items: center;
min-height: 32px;
}
.resi-cell-input {
width: 180px;
}
.resi-cell-select {
width: 180px;
box-sizing: border-box;
margin-right: 10px;
&-middle {
width: 130px;
}
&-small {
width: 88px;
}
}
.resi-cell-select:last-child {
margin-right: 0;
}
}
</style>

48
src/views/modules/visual/basicinfo/basicInfoMain.vue

@ -14,6 +14,32 @@
</div>
</div>
<!-- 组织列表 -->
<div v-show="orgLevel!=='people' && orgLevel!=='search' && orgLevel!=='neighborHood'"
class="div_agency_list">
<el-scrollbar style="height:98%"
wrap-style="overflow-x:hidden">
<div v-if="subAgencyArray.length>0"
class="agency_list">
<div v-for="(item,index) in subAgencyArray"
:key="index"
@click="clickAgencyItem(item,index)"
:class="['agency_item',{'agency_item_on':index%2 ==0}]">
<div>{{item.name}}</div>
</div>
</div>
<div v-else>
<img src="@/assets/img/modules/visual/noData.png"
alt=""
srcset=""
class="no-data-img" />
</div>
</el-scrollbar>
</div>
<people-search v-show="orgLevel==='search'"
@toSubAgency="toSubAgency"
ref="ref_search"></people-search>
@ -277,7 +303,6 @@ const vueGis = {
methods: {
handleSearch () {
this.toSubAgency('search')
},
@ -325,10 +350,23 @@ const vueGis = {
this.level = ''
},
//
clickAgencyItem (item, index) {
let e = {
selected: []
}
let one = {
values_: item
}
e.selected.push(one)
this.toSubAgency('polygon', e)
},
// type:polygon / search people
async toSubAgency (type, e, searchName) {
//neighborHood
if (type === 'people') {
this.runNum++
@ -358,6 +396,7 @@ const vueGis = {
});
} else {
if (!e) {
return false
}
@ -940,4 +979,9 @@ export default vueGis;
overflow-x: hidden !important;
}
}
.div_agency_list {
/deep/ .el-scrollbar__wrap {
overflow-x: hidden !important;
}
}
</style>

8
src/views/modules/visual/communityGovern/typePieOption.js

@ -77,7 +77,7 @@ const center= ['50%', '250px']
// height: '80%',
selectedMode: 'single',
left: 'center',
width: 400,
width: 480,
label: {
// show: false,
position: 'outside',
@ -88,14 +88,14 @@ const center= ['50%', '250px']
edgeDistance: 1,
lineHeight: 15,
color: '#fff',
fontSize: 12,
fontSize: 10,
// distanceToLabelLine: -60,
rich: {
name: {
padding: [0, 6, 0, 6]
},
a: {
fontSize: 30,
fontSize: 25,
color: '#fff',
padding: [0, 6, 6, 6]
},
@ -111,7 +111,7 @@ const center= ['50%', '250px']
labelLine: {
show: false,
smooth: 0.2,
length: 30,
length: 50,
length2: 0,
maxSurfaceAngle: 80
},

8
src/views/modules/visual/communityParty/community.vue

@ -143,8 +143,8 @@ export default {
warningList: [],
headerList: [
{ title: "序号", coulmn: 'index' },
{ title: "区域化党建单位名称", coulmn: 'unitName' },
{ title: "活动标题", coulmn: 'title' },
{ title: "单位名称", coulmn: 'unitName' },
{ title: "活动地址", coulmn: 'address' },
{ title: "服务事项", coulmn: 'serviceMatterName' },
{ title: "服务人数", coulmn: 'peopleCount' },
@ -395,6 +395,8 @@ export default {
if (code === 0) {
this.detailInfo = data
this.detailInfo.serviceMatterNameShow = data.serviceMatterNameList.join(',')
this.detailInfo.unitNameShow = data.unitNameList.join(',')
} else {
this.$message.error(msg)
}
@ -764,6 +766,10 @@ export default {
}
.box-right {
flex: 1;
overflow: hidden;
.pagination {
margin-top: 0;
}
.box-map {
height: 400px;
// border: 1px solid #2865fa;

4
src/views/modules/visual/communityParty/dialogInfo.vue

@ -19,11 +19,11 @@
</div> -->
<div class="item">
<span class="item-field">服务事项</span>
<span>{{ info.serviceMatterName }}</span>
<span>{{ info.serviceMatterNameShow }}</span>
</div>
<div class="item">
<span class="item-field">单位名称</span>
<span>{{ info.unitName }}</span>
<span>{{ info.unitNameShow }}</span>
</div>
<div class="item">
<span class="item-field">活动标题</span>

625
src/views/modules/visual/communityParty/elegant.vue

@ -0,0 +1,625 @@
<template>
<div class="warning-box">
<cpt-card class="card-wr">
<div class="card-title">
<img class="title-icon"
src="../../../../assets/img/shuju/title-tip.png" />
<div class="title-label">
党员风采&nbsp;&nbsp;
<!-- <el-cascader v-model="selectAgency"
:options="propTree"
:props="{ checkStrictly: true }"
:show-all-levels="false"
clearable
@change="handleCascader">
</el-cascader> -->
</div>
<!-- <div class="second-select">
<el-select v-model="serviceMatter"
placeholder="请选择"
@change="handleSelectChange"
@clear="handleSelectChange">
<el-option v-for="item in unitList"
:key="item.value"
:label="item.label"
:value="item.value">
</el-option>
</el-select>
</div>
<div class="second-select">
<el-date-picker v-model="timeRange"
type="daterange"
range-separator="至"
start-placeholder="开始日期"
end-placeholder="结束日期"
prefix-icon="el-icon-caret-bottom"
value-format="yyyy-MM-dd HH:mm:ss"
:clearable="false"
:default-time="['00:00:00', '23:59:59']">
</el-date-picker>
</div> -->
</div>
<div class="elegant-list">
<div v-for="(item, index) in tableData" :key="item.id" class="elegant-item" @click="handleLook(item)">
<div class="item-img">
<img v-if="item.imageList.length > 0" :src="item.imageList[0]" />
<img v-else src="../../../../assets/img/shuju/elegant.png" />
</div>
<div class="item-user">{{item.name}}{{ item.gridName}}</div>
<div class="item-cate">{{ item.categoryName }}</div>
<div class="item-desc">{{ item.mainDeed }}</div>
</div>
</div>
<div class="pagination">
<el-pagination
:current-page="pageNo"
:page-size="pageSize"
background
layout="prev, pager, next"
@size-change="pageSizeChangeHandleNew"
@current-change="pageCurrentChangeHandleNew"
:total="total"
>
</el-pagination>
</div>
</cpt-card>
<elegant-info v-show="showedMoreInfo"
:info="detailInfo"
@close="showedMoreInfo = false" />
</div>
</template>
<script>
import { requestPost } from "@/js/dai/request";
import cptCard from "@/views/modules/visual/cpts/card";
import nextTick from "dai-js/tools/nextTick";
import elegantInfo from './elegantInfo.vue'
export default {
name: "warning-box",
components: {
cptCard,
elegantInfo
},
data () {
return {
showedMoreInfo: false,
tableLoading: false,
tableData: [
// [1,'','','2',''],
],
detailId: '',
agencyId: '',
value2: '',
timeRange: '',
visibleLoading: true,
serviceMatter: 'all',
pageNo: 1,
pageSize: 10,
total: 0,
activeIndex: 0,
activeLevel: "1",
selectAgency: '',
unitList: [],
propTree: [],
cateInfo: [],
//
isfirstInit: true,//
agencyInfo: {},//level
detailInfo: {}
};
},
async mounted () {
const { user } = this.$store.state
this.agencyId = user.agencyId
console.log('agencyId-------', this.agencyId)
this.initTime()
await nextTick(100);
await this.getAgencyList()
this.getList(this.agencyId)
await this.getWorkUserInfo()
},
watch: {
timeRange (val) {
console.log('val-www', val)
this.getList(this.agencyId);
}
},
methods: {
//
async getList (agencyId) {
this.visibleLoading = true
const url = "/resi/partymember/icpartymemberstyle/showlist"
// const url = "http://yapi.elinkservice.cn/mock/245/heart/icpartyactivity/list"
let params = {
agencyId,
pageSize: this.pageSize,
pageNo: this.pageNo
}
const { data, code, msg } = await requestPost(url, params)
if (code === 0) {
this.total = data.total
this.tableData = data.list.map((item, index) => {
return {
...item,
index: index + 1
}
})
} else {
this.$message.error(msg)
}
this.visibleLoading = false
},
async getAgencyList () {
// const url = "/gov/org/customeragency/staffinagencylist";
// const url = '/gov/org/customeragency/agencygridtree'
const url = '/gov/org/customeragency/staffinagencylist'
// let params = {
// agencyId: this.$store.state.user.agencyId,
// };
const { data, code, msg } = await requestPost(url);
if (code === 0) {
console.log('data-org----o', data)
let { agencyList, subAgencyList } = data
this.selectAgency = [`${agencyList.agencyId}-${agencyList.level}`]
let arr = []
agencyList.subAgencyList = subAgencyList
arr.push(agencyList)
this.propTree = arr && this.getTreeData(arr)
} else {
this.$message.error(msg)
}
},
getTreeData (data) {
if (!Array.isArray(data)) return []
let arr = data.map(item => {
let _item = {}
if (item.subAgencyList) {
if (item.subAgencyList.length === 0) {
_item = {
label: item.agencyName,
value: item.agencyId + '-' + item.level,
level: item.level,
children: undefined
}
} else _item = {
label: item.agencyName,
value: item.agencyId + '-' + item.level,
level: item.level,
children: this.getTreeData(item.subAgencyList)
}
} else {
_item = {
label: item.agencyName,
value: item.agencyId + '-' + item.level,
level: item.level,
}
}
return _item
})
return arr
},
async getDetail (id) {
const url = "/heart/icpartyactivity/detail"
let params = {
id: id
}
const { data, code, msg } = await requestPost(url, params)
if (code === 0) {
this.detailInfo = data
} else {
this.$message.error(msg)
}
},
handleCascader (val) {
console.log('val-vvv', val)
if (val.length > 0) {
const _arr = val[val.length - 1].split('-')
const orgType = _arr[1] !== 'grid' ? 'agency' : 'grid'
this.agencyId = _arr[0]
this.getList(_arr[0])
}
},
initTime () {
const end = new Date();
const start = new Date();
start.setTime(start.getTime() - 3600 * 1000 * 24 * 30);
console.log('time-rtt', this.timeFormat(start), this.timeFormat(end))
this.timeRange = [this.timeFormat(start), this.timeFormat(end)]
},
timeFormat (date) {
if (!date || typeof date === 'string') {
return false
}
var y = date.getFullYear() //
var m = date.getMonth() + 1 //
if (m < 10) m = '0' + m
var d = date.getDate() //
if (d < 10) d = '0' + d
return y + '-' + m + '-' + d + ' 00:00:00'
},
//
getWorkUserInfo () {
const url = '/epmetuser/customerstaff/staffbasicinfo'
let params = {}
window.app.ajax.post(
url,
params,
(data, rspMsg) => {
this.agencyInfo = data
if (!data.latitude) {
this.agencyInfo.latitude = 36.072227
}
if (!data.longitude) {
this.agencyInfo.longitude = 120.389455
}
if (!data.level) {
this.agencyInfo.level = 'street'
}
},
(rspMsg, data) => {
this.$message.error(rspMsg)
}
)
},
//
clickProject (feature) {
console.log('标注信息', feature.values_.properties)
},
async handleLook (val) {
this.detailId = val.id
this.detailInfo = val
// await this.getDetail(val.id)
this.showedMoreInfo = true
},
handleSelectChange (val) {
this.getList(this.agencyId);
},
pageSizeChangeHandleNew (val) {
// this.pageNo = 1;
this.pageSize = val;
this.getList(this.agencyId);
},
pageCurrentChangeHandleNew (val) {
this.pageNo = val;
this.getList(this.agencyId);
},
}
};
</script>
<style
lang="scss"
src="@/assets/scss/modules/visual/warning.scss"
scoped
></style>
<style lang="scss" scoped>
.warning-box {
display: flex;
.card-wr {
flex: 1;
}
.card-wr:last-child {
margin-left: 20px;
}
::v-deep .table-body {
overflow: auto;
&::-webkit-scrollbar {
width: 8px;
// background: linear-gradient(270deg, #0063FE, #0095FF);
}
&::-webkit-scrollbar-corner,
/* 滚动条角落 */
&::-webkit-scrollbar-thumb,
&::-webkit-scrollbar-track {
/*滚动条的轨道*/
border-radius: 4px;
}
&::-webkit-scrollbar-corner,
&::-webkit-scrollbar-track {
/* 滚动条轨道 */
background: rgba(12, 129, 254, 0.24);
// box-shadow: inset 0 0 1px rgba(180, 160, 120, 0.5);
}
&::-webkit-scrollbar-thumb {
/* 滚动条手柄 */
background: linear-gradient(270deg, #0063fe, #0095ff);
}
}
}
.card-title {
display: flex;
align-items: center;
cursor: pointer;
.title-icon {
display: block;
width: 46px;
height: 34px;
box-sizing: border-box;
margin-right: 6px;
}
.title-label {
font-size: 20px;
font-weight: 800;
::v-deep .el-input {
width: 180px;
margin-left: 10px;
.el-input__inner {
font-size: 18px;
// font-weight: 800;
color: #fff;
background: #06186d;
border: 1px solid #1a64cc;
}
.el-icon-arrow-down::before {
content: "\e790";
}
}
}
::v-deep .el-dropdown {
font-size: 16px;
color: #fff;
font-weight: 800;
}
}
.second-title {
display: flex;
align-items: center;
margin-top: 20px;
.second-title-label {
position: relative;
padding-left: 40px;
font-size: 16px;
font-weight: 500;
color: #fff;
}
.second-title-label::after {
content: "";
position: absolute;
top: 50%;
left: 20px;
width: 12px;
height: 12px;
box-sizing: border-box;
margin-top: -6px;
background: #2865fa;
border-radius: 50%;
}
}
.second-select {
margin: 0 10px 0 10px;
::v-deep .el-input {
width: 180px;
height: 36px;
.el-input__inner {
height: 100%;
padding: 0 10px;
color: #fff;
line-height: 36px;
background: #06186d;
border: 1px solid #1a64cc;
}
.el-icon-arrow-up:before {
content: "\e78f";
}
// .el-select__caret:before {
// content: '\E790'
// }
}
::v-deep .el-date-editor {
width: 360px;
position: relative;
background: #06186d;
border: 1px solid #1a64cc;
.el-range-input {
color: #fff;
background: #06186d;
}
.el-range-separator {
color: #fff;
}
.el-range__icon {
position: absolute;
right: 5px;
// float: right;
}
.el-input__prefix {
left: unset;
right: 5px;
}
}
}
.second-select:last-child {
margin-left: 0;
}
.box-wr {
display: flex;
box-sizing: border-box;
.box-left {
flex-shrink: 0;
display: flex;
.box-left-item {
.box-label {
font-size: 16px;
color: rgba(255, 255, 255, 0.72);
}
.box-num {
font-size: 32px;
font-weight: bold;
color: #fff;
}
}
}
.box-right {
flex: 1;
.box-map {
height: 400px;
// border: 1px solid #2865fa;
.map {
height: 100%;
width: 100%;
}
}
}
.box-left-w400 {
flex-wrap: wrap;
width: 400px;
box-sizing: border-box;
padding-top: 60px;
padding-left: 100px;
.box-left-item {
width: 50%;
}
}
}
.box-wr-400 {
height: 400px;
.box-left {
width: 300px;
flex-direction: column;
justify-content: center;
align-items: center;
.box-left-item:last-child {
margin-top: 100px;
}
}
}
.map-tips {
width: 100%;
display: flex;
justify-content: center;
flex-wrap: wrap;
padding-top: 10px;
padding-bottom: 20px;
.map-tips-item {
display: flex;
align-items: center;
margin-top: 20px;
margin-right: 40px;
.map-tips-icon {
width: 32px;
height: 32px;
box-sizing: border-box;
margin-right: 10px;
// background: #DD2719;
// border-radius: 2px;
img {
display: block;
width: 100%;
height: 100%;
}
}
.map-tips-label {
font-size: 16px;
color: #fff;
}
}
}
.elegant-list {
width: 100%;
max-height: 890px;
box-sizing: border-box;
display: flex;
// align-items: center;
flex-wrap: wrap;
padding: 30px 0 20px;
.elegant-item {
width: 19%;
margin-right: 20px;
margin-bottom: 36px;
box-sizing: border-box;
.item-img {
width: 100%;
height: 230px;
img {
display: block;
width: 100%;
height: 100%;
}
}
.item-user {
margin-top: 20px;
font-size: 20px;
font-weight: bold;
color: #FFFFFF;
}
.item-cate {
margin-top: 16px;
height: 16px;
font-size: 16px;
font-family: PingFang SC;
font-weight: 400;
color: #FFFFFF;
line-height: 24px;
}
.item-desc {
margin-top: 20px;
width: 100%;
font-size: 18px;
font-family: PingFang SC;
font-weight: 400;
color: #FFFFFF;
line-height: 24px;
display: -webkit-box;
-webkit-box-orient: vertical;
-webkit-line-clamp: 2;
overflow: hidden;
}
}
.elegant-item:nth-child(5n) {
margin-right: 0;
}
}
.pagination {
text-align: right;
/deep/ .el-pagination.is-background .el-pager li:not(.disabled).active {
background: #0266d1;
color: #000d3f;
}
/deep/ .el-pagination .el-pager li {
background: #002e74;
}
/deep/ .el-pagination .btn-prev {
background: #002e74;
}
/deep/ .el-pagination .btn-next {
background: #002e74;
}
}
</style>

201
src/views/modules/visual/communityParty/elegantInfo.vue

@ -0,0 +1,201 @@
<template>
<div class="m-pop">
<div class="wrap">
<cpt-card>
<div class="title">
<img src="@/assets/img/shuju/title-tip.png" />
<span>党员风采</span>
</div>
<div class="btn-close" @click="handleClose">
<img src="@/assets/img/shuju/people/close.png" />
</div>
<!-- <div class="list-title">需求内容</div> -->
<div class="list-wr">
<div class="list">
<!-- <div class="item-desc">
<span>市北区同德花园小区物业管理服务公司的同志每天对该小区 公共部位喷洒消毒液进行消毒为杀灭新型冠状病毒近几 天以来市北区</span>
</div> -->
<div class="item">
<span class="item-field">所属网格</span>
<span>{{ info.gridName }}</span>
</div>
<div class="item">
<span class="item-field">分类类别</span>
<span>{{ info.categoryName }}</span>
</div>
<div class="item">
<span class="item-field">党员姓名</span>
<span>{{ info.name }}</span>
</div>
<div class="item">
<span class="item-field">主要事迹</span>
<span class="item-content">{{info.mainDeed}}</span>
</div>
<div class="item">
<span class="item-field">风采图片</span>
<div class="item-imgs">
<!-- <img v-for="(item, index) in info.imageList" :key="index" :src="item" /> -->
<el-image
v-for="(item, index) in info.imageList" :key="index"
style="width: 200px; height: 200px;margin-right: 10px;"
:src="item"
:preview-src-list="info.imageList">
</el-image>
</div>
<!-- <span>{{ info.peopleCount }}</span> -->
</div>
</div>
<!-- <div class="list">
<div class="item">
<span class="item-field">活动结果</span>
<span class="item-content" v-html="info.result"></span>
</div>
</div> -->
</div>
</cpt-card>
</div>
</div>
</template>
<script>
import cptCard from "@/views/modules/visual/cpts/card";
import analyse from '../cpts/analyse.vue'
import { requestPost } from "@/js/dai/request";
export default {
name: "dialogInfo",
props: {
userId: {
type: String,
default: "",
},
gridName: {
type: String,
default: "",
},
info: Object
},
components: {
cptCard,
analyse
},
data() {
return {
fieldList: [],
groupList: [],
groupIndex: 0,
startGroupIndex: 0,
// info: {},
allInfo: {},
}
},
mounted() {
},
methods: {
handleClose() {
this.$emit("close");
},
}
};
</script>
<style lang="scss" src="@/assets/scss/modules/visual/people.scss" scoped></style>
<style lang="scss" scoped>
.m-pop {
.wrap {
.list {
display: block;
// width: 50%;
.item {
display: flex;
width: 100%;
box-sizing: border-box;
margin-top: 0;
margin-bottom: 15px;
font-size: 16px;
cursor: pointer;
.item-field {
// width: 100px;
flex-shrink: 0;
}
.item-content {
width: 100%;
max-height: 420px;
overflow-y: auto;
&::-webkit-scrollbar {
width: 8px;
// background: linear-gradient(270deg, #0063FE, #0095FF);
}
&::-webkit-scrollbar-corner,
/* 滚动条角落 */
&::-webkit-scrollbar-thumb,
&::-webkit-scrollbar-track { /*滚动条的轨道*/
border-radius: 4px;
}
&::-webkit-scrollbar-corner,
&::-webkit-scrollbar-track {
/* 滚动条轨道 */
background: rgba(12, 129, 254, .24);
// box-shadow: inset 0 0 1px rgba(180, 160, 120, 0.5);
}
&::-webkit-scrollbar-thumb {
/* 滚动条手柄 */
background: linear-gradient(270deg, #0063FE, #0095FF);
}
}
::v-deep p {
margin: 0;
img {
width: 100%;
height: 100%;
}
}
.item-imgs {
width: 100%;
display: flex;
flex-wrap: wrap;
img {
display: block;
width: 240px;
height: 240px;
margin-right: 10px;
}
}
}
.item-desc {
font-size: 16px;
margin-bottom: 10px;
line-height: 24px;
}
}
}
.list-title {
width: 100%;
box-sizing: border-box;
padding: 20px 0 10px 62px;
font-size: 20px;
cursor: pointer;
}
}
.list-wr {
display: flex;
padding: 0 32px;
}
</style>

2
src/views/modules/visual/communityParty/party.vue

@ -760,7 +760,7 @@ export default {
this.getAgeList(this.agencyId, this.orgType)
},
pageCurrentChangeHandleAge (val) {
this.agePageSize = val
this.agePageNo = val
this.getAgeList(this.agencyId, this.orgType)
},
pageSizeChangeHandleNew(val) {

4
src/views/modules/visual/measure/volunteer.vue

@ -57,13 +57,13 @@
<div class="card-count-item">
<div class="card-count-content">
<div class="card-count-num">{{ vInfo.partyServiceTotal || 0 }}</div>
<div class="card-count-label">党员数</div>
<div class="card-count-label">党员服务次</div>
</div>
</div>
<div class="card-count-item">
<div class="card-count-content">
<div class="card-count-num">{{ vInfo.resiServiceTotal || 0 }}</div>
<div class="card-count-label">居民数</div>
<div class="card-count-label">居民服务次</div>
</div>
</div>
</div>

Loading…
Cancel
Save