Browse Source

Merge branch 'dev-chaxun' of http://git.elinkit.com.cn:7070/r/epmet-oper-gov into dev-chaxun

shibei_prod
dai 4 years ago
parent
commit
1b71ce6318
  1. 166
      src/assets/scss/modules/visual/personCategory.scss
  2. 26
      src/router/index.js
  3. 347
      src/views/components/scoreRecord.vue
  4. 2
      src/views/modules/base/community/roomForm.vue
  5. 552
      src/views/modules/communityParty/regionalParty/finishList.vue
  6. 116
      src/views/modules/communityParty/regionalParty/units.vue
  7. 29
      src/views/modules/communityService/measure/index.vue
  8. 321
      src/views/modules/systemManagement/serviceMatter/service.vue
  9. 232
      src/views/modules/systemManagement/serviceMatter/serviceForm.vue
  10. 179
      src/views/modules/visual/basicinfo/basicInfoMain.vue
  11. 68
      src/views/modules/visual/basicinfo/personCategory/components/screen-loading/index.vue
  12. 358
      src/views/modules/visual/basicinfo/personCategory/components/screen-table/index.vue
  13. 251
      src/views/modules/visual/basicinfo/personCategory/index.vue
  14. 2
      src/views/modules/visual/communityGovern/resibuzz.vue
  15. 12
      src/views/modules/visual/communityGovern/typeAnalyze.vue
  16. 47
      src/views/modules/visual/measure/volunteer.vue
  17. 142
      src/views/modules/workSys/mapConfig.vue

166
src/assets/scss/modules/visual/personCategory.scss

@ -0,0 +1,166 @@
.warning-box {
box-sizing: border-box;
// width: 1881px;
width: 100%;
// height: 100%;
min-height: 100%;
margin: auto;
color: #fff;
// background: url("../../../img/modules/visual/warning-box.png") no-repeat center;
background-size: 100% 100%;
padding: 45px 21px 35px 24px;
&-top {
display: flex;
// justify-content: space-around;
justify-content: flex-start;
flex-wrap: wrap;
min-height: 190px;
.top-item-active {
background: linear-gradient(0deg, #1a5afd86, #26c5ff75);
}
.top-item {
box-sizing: border-box;
width: 280px;
height: 190px;
padding: 10px 22px 14px 21px;
// background: rgba(255, 255, 255, 0);
border: 1px solid #1043c0;
box-shadow: 0px 83px 150px 0px #002790;
border-radius: 8px;
margin-top: 10px;
margin-left: 10px;
margin-right: 15px;
margin-bottom: 15px;
cursor: pointer;
&-img {
display: flex;
align-items: center;
img {
width: 78px;
height: 78px;
margin-right: 16px;
margin-bottom: 10px;
}
.top-item-left {
display: flex;
flex-direction: column;
span {
display: inline-block;
}
span:nth-child(1) {
font-size: 18px;
font-weight: 400;
color: #ffffff;
}
span:nth-child(2) {
font-size: 28px;
font-weight: bold;
color: #00fffc;
margin-top: 10px;
}
}
}
&-num {
width: 100%;
display: flex;
position: relative;
flex-direction: column;
align-items: space-between;
// border: 1px solid red;
.num-item {
position: relative;
width: 100%;
height: 35px;
display: flex;
border-radius: 4px;
align-items: center;
justify-content: space-between;
padding: 0 10px 0 9px;
// &::after {
// display: block;
// content: "";
// width: 8px;
// height: 8px;
// background: #f0f3f7;
// border-radius: 50%;
// position: absolute;
// left: 12px;
// top: 50%;
// transform: translate(0, -50%);
// }
div:nth-child(1) {
font-size: 16px;
font-family: PingFang SC;
font-weight: 400;
color: #ffffff;
}
div:nth-child(2) {
// width: 70%;
display: flex;
font-size: 20px;
font-family: PingFang SC;
font-weight: 500;
color: #ffffff;
.right-icon {
width: 10px;
height: 14px;
}
}
}
.num-item:nth-child(2) {
margin-top: 10px;
}
}
}
}
&-bottom {
box-sizing: border-box;
width: 100%;
height: calc(100% - 300px);
min-height: 300px;
margin-top: 60px;
.pagination {
box-sizing: border-box;
margin-top: 20px;
width: 100%;
height: 40px;
display: flex;
justify-content: flex-end;
/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;
}
}
}
}

26
src/router/index.js

@ -226,19 +226,19 @@ router.beforeEach((to, from, next) => {
icon: "icon-setting",
id: "22213213",
name: "基础信息",
url: "visual/basicinfo/basicInfoMain",
// children: [
// // {
// // url: "/visual/basicinfo/basicInfoMain",
// // name: "基础信息",
// // id: "5feawfwaefwa5",
// // },
// // {
// // url: "/visual/basicinfo/basicInfoMain",
// // name: "人员类别分析",
// // id: "5fwaefwaefawef5",
// // },
// ],
// url: "visual/basicinfo/basicInfoMain",
children: [
{
url: "/visual/basicinfo/basicInfoMain",
name: "基础信息",
id: "5feawfwaefwa5",
},
{
url: "/visual/basicinfo/personCategory/index",
name: "人员类别分析",
id: "5fwaefwaefawef5",
},
],
},
{
icon: "icon-setting",

347
src/views/components/scoreRecord.vue

@ -0,0 +1,347 @@
<template>
<div class="div_main">
<el-form :inline="true"
:model="formData"
ref="ref_searchform"
:label-width="'100px'">
<el-form-item label="查询时间"
prop="startTime">
<el-date-picker v-model="timeRange"
type="daterange"
:clearable="false"
range-separator="至"
start-placeholder="开始日期"
end-placeholder="结束日期"
prefix-icon="el-icon-caret-bottom"
value-format="yyyy-MM-dd"
@change="handleTimeChange">
</el-date-picker>
</el-form-item>
<div>
<el-form-item label="总计:"
prop="startTime">
<span>{{totalPoint}}</span>
</el-form-item>
</div>
</el-form>
<el-table class="table"
:data="tableData"
border
:height="tableHeight"
v-loading="tableLoading"
:header-cell-style="{background:'#2195FE',color:'#FFFFFF'}"
style="width: 100%">
<el-table-column label="序号"
header-align="center"
align="center"
type="index"
width="50"></el-table-column>
<el-table-column prop="categoryName"
header-align="center"
align="center"
label="需求类型"
width="180">
</el-table-column>
<el-table-column prop="demandUserName"
header-align="center"
align="center"
label="需求人"
width="100">
</el-table-column>
<el-table-column prop="content"
header-align="center"
align="center"
label="需求内容"
min-width="230">
</el-table-column>
<el-table-column prop="pointTime"
header-align="center"
align="center"
label="时间"
width="150">
</el-table-column>
<el-table-column prop="score"
header-align="center"
align="center"
label="评价"
width="80">
</el-table-column>
<el-table-column prop="point"
header-align="center"
align="center"
label="积分"
width="80">
</el-table-column>
</el-table>
<div>
<el-pagination @size-change="handleSizeChange"
@current-change="handleCurrentChange"
:current-page.sync="pageNo"
:page-sizes="[10, 20, 50]"
:page-size="pageSize"
layout="sizes, prev, pager, next, total"
:total="total">
</el-pagination>
</div>
</div>
</template>
<script>
import util from '@js/util.js';
import { requestPost } from "@/js/dai/request";
import { mapGetters } from 'vuex'
import { Loading } from 'element-ui' // Loading
let loading //
export default {
data () {
return {
loading: false,
totalPoint: 100,
total: 0,
pageSize: 10,
pageNo: 0,
tableLoading: false,
serviceId: '',
pickerOptions: { //
disabledDate (time) {
return time.getTime() > (Date.now() - (24 * 60 * 60 * 1000))
}
},
timeRange: [],
unitId: '',
formData: {
startTime: '',
endTime: ''
},
tableData: [],
}
},
components: {
},
async created () {
},
async mounted () {
},
methods: {
async initForm (row) {
this.initDate()
this.serviceId = row.id
//
await this.loadTable()
},
handleSearch () {
this.loadTable()
},
async loadTable () {
this.tableLoading = true
// const url = "/heart /userdemand/recordList"
const url = "http://yapi.elinkservice.cn/mock/245/heart/userdemand/recordList"
let params = {
serviceType: this.serviceType,
serviceId: this.serviceId,
pageSize: this.pageSize,
pageNo: this.pageNo,
...this.formData
}
const { data, code, msg } = await requestPost(url, params)
if (code === 0) {
this.totalPoint = data.totalPoint
this.total = data.page.total
this.tableData = data.page.list
} else {
this.$message.error(msg)
}
this.tableLoading = false
},
//
initDate () {
let yesterday = new Date((new Date).getTime() - 24 * 60 * 60 * 1000)
let year = yesterday.getFullYear()
let month = yesterday.getMonth() + 1 //
let day = yesterday.getDate() //
let days = new Date(year, month, 0);
days = days.getDate(); //
let year2 = year;
let month2 = parseInt(month) - 1;
if (month2 == 0) {
year2 = parseInt(year2) - 1;
month2 = 12;
}
let day2 = day;
let days2 = new Date(year2, month2, 0);
days2 = days2.getDate();
if (day2 > days2) {
day2 = days2;
}
if (month2 < 10) {
month2 = '0' + month2;
}
if (month < 10) {
month = '0' + month;
}
if (day < 10) {
day = '0' + day;
}
if (day2 < 10) {
day2 = '0' + day2;
}
let t2 = year2 + '-' + month2 + '-' + day2;
let t1 = year + '-' + month + '-' + day;
// let t3 = formate(t2, style);
this.timeRange = [t2, t1]
},
handleTimeChange (time) {
if (time) {
const startTimeArray = util.dateFormatter(time[0], 'date').split('-')
const endTimeArray = util.dateFormatter(time[1], 'date').split('-')
this.formData.startTime = startTimeArray[0] + '-' + startTimeArray[1] + '-' + startTimeArray[2] + ' 00:00:00'
this.formData.endTime = endTimeArray[0] + '-' + endTimeArray[1] + '-' + endTimeArray[2] + ' 23:59:59'
// this.startTimeShow = startTimeArray[0] + '' + startTimeArray[1] + '' + startTimeArray[2] + ''
// this.endTimeShow = endTimeArray[0] + '' + endTimeArray[1] + '' + endTimeArray[2] + ''
} else {
this.formData.startTime = ''
this.formData.endTime = ''
// this.startTimeShow = ''
// this.endTimeShow = ''
}
this.loadTable()
},
handleSizeChange (val) {
this.pageSize = val
this.pageNo = 1
this.loadTable()
},
handleCurrentChange (val) {
this.pageNo = val
this.loadTable()
},
//
startLoading () {
loading = Loading.service({
lock: true, //
text: '正在加载……', //
background: 'rgba(0,0,0,.7)' //
})
},
//
endLoading () {
// clearTimeout(timer);
if (loading) {
loading.close()
}
}
},
computed: {
tableHeight () {
return (this.clientHeight - 460)
},
rowHeight () {
return (this.clientHeight - 200) + 'px'
},
...mapGetters(['clientHeight'])
},
watch: {
},
props: {
serviceType: {
type: String,
default: ''
}
}
}
</script>
<style lang="scss" scoped >
@import "@/assets/scss/buttonstyle.scss";
.div_main {
background: #ffffff;
box-shadow: 0px 2px 12px 0px rgba(0, 0, 0, 0.1);
border-radius: 4px;
margin-top: 15px;
padding: 23px 30px 10px;
}
.div_search {
background: #ffffff;
border-radius: 4px;
padding: 30px 20px 5px;
box-shadow: 0px 2px 12px 0px rgba(0, 0, 0, 0.1);
}
.item_width_1 {
width: 260px;
}
.item_width_2 {
width: 495px;
}
.div_table {
background: #ffffff;
box-shadow: 0px 2px 12px 0px rgba(0, 0, 0, 0.1);
border-radius: 4px;
margin-top: 15px;
padding: 23px 30px 10px;
.table {
margin-top: 20px;
}
}
.el-row {
/* margin-bottom: 20px; */
display: flex;
flex-wrap: wrap;
margin-top: 10px;
margin-right: 50px;
}
</style>

2
src/views/modules/base/community/roomForm.vue

@ -137,7 +137,7 @@ export default {
houseId: '', //ID
houseType: '1',
purpose: '1',
rentFlag: 1,
rentFlag: 0,
dataForm: {
neighborHoodId: '', // ID
buildingId: '',//ID

552
src/views/modules/communityParty/regionalParty/finishList.vue

@ -0,0 +1,552 @@
<template>
<div>
<div class="div_table">
<el-button type="green"
size="small"
@click="handleAdd">新增</el-button>
<el-table class="table"
:data="tableData"
border
:height="tableHeight"
v-loading="tableLoading"
:header-cell-style="{background:'#2195FE',color:'#FFFFFF'}"
style="width: 100%">
<el-table-column label="序号"
header-align="center"
align="center"
type="index"
width="50">
</el-table-column>
<el-table-column prop="year"
header-align="center"
align="center"
label="年份"
min-width="120">
<template slot-scope="scope">
<div v-if="scope.row.isEdit"
class="picker_year">
<!-- <el-select class="item_width_2"
v-model="scope.row.year"
placeholder="请选择">
<el-option v-for="(item,index) in yearList"
@click.native="hancleChangeYear(scope.row,index,scope.$index)"
:key="item.value"
:label="item.label"
:value="item.value">
</el-option>
</el-select> -->
<el-date-picker v-model="scope.row.year"
type="year"
format="yyyy"
value-format="yyyy"
placeholder="选择年">
</el-date-picker>
</div>
<span v-else>{{scope.row.year}}</span>
</template>
</el-table-column>
<el-table-column prop="type"
header-align="center"
align="center"
label="类型"
min-width="90">
<template slot-scope="scope">
<div v-if="scope.row.isEdit">
<el-select class="item_width_2"
v-model="scope.row.type"
placeholder="请选择">
<el-option v-for="(item,index) in typeList"
@click.native="hancleChangeType(scope.row,index,scope.$index)"
:key="item.value"
:label="item.label"
:value="item.value">
</el-option>
</el-select>
</div>
<span v-else>{{scope.row.typeShow}}</span>
</template>
</el-table-column>
<el-table-column prop="monthQuarter"
header-align="center"
align="center"
label="时间"
min-width="100">
<template slot-scope="scope">
<div v-if="scope.row.isEdit">
<el-select class="item_width_3"
v-model="scope.row.monthQuarter"
placeholder="请选择">
<el-option v-for="item in scope.row.timeList"
:key="item.value"
:label="item.label"
:value="item.value">
</el-option>
</el-select>
</div>
<span v-else>{{scope.row.monthQuarterName}}</span>
</template>
</el-table-column>
<el-table-column prop="status"
header-align="center"
align="center"
label="完成情况"
min-width="90">
<template slot-scope="scope">
<div v-if="scope.row.isEdit">
<el-select class="item_width_2"
v-model="scope.row.status"
placeholder="全部">
<el-option v-for="item in statusList"
:key="item.value"
:label="item.label"
:value="item.value">
</el-option>
</el-select>
</div>
<span v-else>{{scope.row.status==='1'?'已完成':'未完成'}}</span>
</template>
</el-table-column>
<el-table-column prop="score"
header-align="center"
align="center"
label="评分(百分制)"
min-width="150">
<template slot-scope="scope">
<div v-if="scope.row.isEdit">
<el-input-number class="item_width_1"
v-model="scope.row.score"
:precision="1"
:step="0.1"
:max="100"></el-input-number>
</div>
<span v-else>{{scope.row.score}}</span>
</template>
</el-table-column>
<el-table-column label="操作"
fixed="right"
width="120"
header-align="center"
align="center"
class="operate">
<template slot-scope="scope">
<el-button v-if="scope.row.isEdit"
type="text"
style="color:#00A7A9;text-decoration: underline;"
size="small"
@click="handleComfirm(scope.row,scope.$index)">保存</el-button>
<el-button v-if="!scope.row.isEdit"
type="text"
style="color:#1C6AFD;text-decoration: underline;"
size="small"
@click="handleEdit(scope.row,scope.$index)">修改</el-button>
<el-button type="text"
style="color:#D51010;text-decoration: underline;"
size="small"
@click="handleDelete(scope.row,scope.$index)">删除</el-button>
</template>
</el-table-column>
</el-table>
</div>
<!-- <div class="div_btn">
<el-button @click="handleCancle"> </el-button>
</div> -->
</div>
</template>
<script>
import { mapGetters } from 'vuex'
import { Loading } from 'element-ui' // Loading
import { requestPost } from '@/js/dai/request'
let loading //
export default {
data () {
return {
tableLoading: false,
unitId: '',
typeList: [
{
value: 'quarter',
label: '季度'
},
{
value: 'monthly',
label: '月度'
}
],
yearList: [],
quarterList: [
{
value: 'Q1',
label: '第一季度'
},
{
value: 'Q2',
label: '第二季度'
},
{
value: 'Q3',
label: '第三季度'
},
{
value: 'Q4',
label: '第四季度'
},
],
monthlist: [],
timeList: [],
statusList: [
{
value: '1',
label: '已完成'
},
{
value: '0',
label: '未完成'
},
],
tableData: [],
}
},
components: {},
mounted () {
},
methods: {
async initTable (row) {
this.unitId = row.id
//
this.initData()
await this.loadTable()
},
//
initData () {
let today = new Date((new Date).getTime())
let year = today.getFullYear()
this.yearList = []
for (let i = 0; i < 20; i++) {
let obj = {
label: (year - i) + '',
value: (year - i) + '',
}
this.yearList.push(obj)
}
this.monthlist = []
for (let i = 1; i < 13; i++) {
let m = i
if (m < 10) {
m = '0' + m
}
let obj = {
label: i + '月',
value: m,
}
this.monthlist.push(obj)
}
},
//
async hancleChangeType (row, index, tableIndex) {
let empetArray = []
this.tableData[tableIndex].timeList = [...empetArray]
let rowData = JSON.parse(JSON.stringify(row))
rowData.monthQuarter = ''
this.$set(this.tableData, tableIndex, rowData)
if (row.type === 'monthly') {
this.tableData[tableIndex].timeList = [...this.monthlist]
} else if (row.type === 'quarter') {
this.tableData[tableIndex].timeList = [...this.quarterList]
}
},
// row index timeList tableIndex
hancleChangeYear (row, index, tableIndex) {
},
//form
async loadTable () {
this.tableLoading = true
// const url = '/heart/icpartyunitcompletion/list'
const url = 'http://yapi.elinkservice.cn/mock/245/heart/icpartyunitcompletion/list'
let params = {
placePatrolRecordId: this.placePatrolRecordId
}
const { data, code, msg } = await requestPost(url, params)
this.tableLoading = false
if (code === 0) {
if (data.list && data.list.length > 0) {
data.list.forEach(item => {
item.isEdit = false
item.timeList = []
item.typeShow = item.type === 'monthly' ? '月度' : '季度'
});
this.tableData = [...data.list]
} else {
this.tableData = []
}
} else {
this.$message.error(msg)
}
},
handleAdd () {
let obj = {
isEdit: true,//
type: '',
typeShow: '',
year: '',
monthQuarter: '',
timeShow: '',
status: '',
unitId: '',
score: 0.0
}
this.tableData.push(obj)
},
async handleEdit (row, tableIndex) {
let rowData = JSON.parse(JSON.stringify(row))
rowData.isEdit = true
this.$set(this.tableData, tableIndex, rowData)
if (row.type === 'monthly') {
this.tableData[tableIndex].timeList = [...this.monthlist]
} else if (row.type === 'quarter') {
this.tableData[tableIndex].timeList = [...this.quarterList]
}
},
async handleComfirm (row, tableIndex) {
let valiMsg = this.validata(row)
if (valiMsg) {
this.$message({
type: 'warning',
message: valiMsg
})
return false
}
this.addReview(row, tableIndex)
},
async addReview (row, tableIndex) {
// let url = "/heart/icpartyunitcompletion/save"
let url = "http://yapi.elinkservice.cn/mock/245/heart/icpartyunitcompletion/save"
let params = JSON.parse(JSON.stringify(row))
params.unitId = this.unitId
const { data, code, msg } = await requestPost(url, params)
if (code === 0) {
row.isEdit = false
row.typeShow = row.type === 'monthly' ? '月度' : '季度'
if (row.type === 'monthly') {
row.monthQuarterName = row.monthQuarter + '月'
} else {
for (let index in row.timeList) {
if (row.timeList[index].value === row.monthQuarter) {
row.monthQuarterName = row.timeList[index].label
}
}
}
this.$set(this.tableData, tableIndex, row)
} else {
this.$message.error(msg)
}
},
validata (row) {
let message = ''
if (!row.year) {
message = message + '年份不能为空;'
}
if (!row.type) {
message = message + '类型不能为空;'
}
if (!row.monthQuarter) {
message = message + '时间不能为空;'
}
if (!row.status) {
message = message + '完成情况不能为空;'
}
if (row.score !== 0 && !row.score) {
message = message + '评分不能为空;'
}
return message
},
async handleDelete (row, tableIndex) {
this.$confirm("确认删除?", "提示", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "warning"
})
.then(() => {
if (row.id) {//id
this.deleteRecord(row, tableIndex)
} else {//id
this.tableData.splice(tableIndex, 1);
}
})
.catch(err => {
if (err == "cancel") {
}
});
},
async deleteRecord (row, tableIndex) {
// const url = "/heart/icpartyunitcompletion/delete"
const url = "http://yapi.elinkservice.cn/mock/245/heart/icpartyunitcompletion/delete"
let params = {
id: row.id
}
const { data, code, msg } = await requestPost(url, params)
if (code === 0) {
// this.$message({
// type: "success",
// message: ""
// });
this.tableData.splice(tableIndex, 1);
} else {
this.$message.error(msg)
}
},
handleCancle () {
this.$emit('dialogCancle')
},
//
startLoading () {
loading = Loading.service({
lock: true, //
text: '正在加载……', //
background: 'rgba(0,0,0,.7)' //
})
},
//
endLoading () {
// clearTimeout(timer);
if (loading) {
loading.close()
}
}
},
computed: {
tableHeight () {
return (this.clientHeight - 360)
},
...mapGetters(['clientHeight'])
},
props: {
}
}
</script>
<style lang="scss" scoped >
@import "@/assets/scss/buttonstyle.scss";
.item_width_1 {
width: 150px;
}
.item_width_2 {
width: 100px;
}
.item_width_3 {
width: 120px;
}
.div_table {
margin-top: 10px;
// background: #ffffff;
// box-shadow: 0px 2px 12px 0px rgba(0, 0, 0, 0.1);
// border-radius: 4px;
.table {
margin-top: 20px;
}
}
.div_btn {
margin-top: 10px;
display: flex;
justify-content: flex-end;
}
.picker_year {
/deep/ .el-date-editor.el-input,
.el-date-editor.el-input__inner {
width: 140px;
}
}
</style>

116
src/views/modules/communityParty/regionalParty/units.vue

@ -103,9 +103,9 @@
:http-request="uploadFile">
<el-button style="margin-left:10px"
size="small"
type="red">导入</el-button> -->
type="red">导入</el-button>
</el-upload>
</el-upload>-->
</div>
@ -126,19 +126,19 @@
header-align="center"
align="center"
label="单位名称"
width="180">
min-width="100">
</el-table-column>
<el-table-column prop="type"
header-align="center"
align="center"
label="分类"
width="80">
min-width="80">
</el-table-column>
<el-table-column prop="serviceMatterList"
header-align="center"
align="center"
label="服务事项"
min-width="180">
min-width="250">
<template slot-scope="scope">
<p style="text-align:center;margin:2px 0;"
@ -157,7 +157,7 @@
header-align="center"
align="center"
label="联系电话"
width="110">
width="120">
</el-table-column>
<el-table-column prop="memberCount"
header-align="center"
@ -180,25 +180,36 @@
</el-table-column>
<el-table-column label="操作"
fixed="right"
width="140"
width="190"
header-align="center"
align="center"
class="operate">
<template slot-scope="scope">
<el-button type="text"
style="color:#1C6AFD;text-decoration: underline;"
size="small"
@click="handleDetail(scope.row)">查看</el-button>
<el-button type="text"
style="color:#00A7A9;text-decoration: underline;"
size="small"
@click="handleEdit(scope.row)">修改</el-button>
<el-button type="text"
style="color:#D51010;text-decoration: underline;"
size="small"
@click="handleDelete(scope.row)">删除</el-button>
<div>
<el-button type="text"
style="color:#1C6AFD;text-decoration: underline;"
size="small"
@click="handleDetail(scope.row)">查看</el-button>
<el-button type="text"
style="color:#1C6AFD;text-decoration: underline;"
size="small"
@click="handleFinish(scope.row)">完成情况</el-button>
<el-button type="text"
style="color:#1C6AFD;text-decoration: underline;"
size="small"
@click="handleScore(scope.row)">积分记录</el-button>
</div>
<div>
<el-button type="text"
style="color:#00A7A9;text-decoration: underline;"
size="small"
@click="handleEdit(scope.row)">修改</el-button>
<el-button type="text"
style="color:#D51010;text-decoration: underline;"
size="small"
@click="handleDelete(scope.row)">删除</el-button>
</div>
</template>
</el-table-column>
</el-table>
@ -221,23 +232,47 @@
:title="formTitle"
width="950px"
top="5vh"
@closed="diaClose">
@closed="editDiaClose">
<units-form ref="ref_form"
:serviceList="serviceList"
:typeList="typeList"
@dialogCancle="addFormCancle"
@dialogOk="addFormOk"></units-form>
</el-dialog>
<el-dialog :visible.sync="detailShow"
:close-on-click-modal="false"
:close-on-press-escape="false"
:title="'单位详情'"
width="950px"
top="5vh"
@closed="detailClosed">
@closed="diaClose">
<units-detail ref="ref_detail"></units-detail>
</el-dialog>
<!-- 完成情况 -->
<el-dialog :visible.sync="finishDiaShow"
:close-on-click-modal="false"
:close-on-press-escape="false"
:title="finishDiaTitle"
width="950px"
top="5vh"
@closed="diaClose">
<finish-list ref="ref_finish"></finish-list>
</el-dialog>
<!-- 积分记录 -->
<el-dialog :visible.sync="scoreDiaShow"
:close-on-click-modal="false"
:close-on-press-escape="false"
:title="scoreDiaTitle"
width="1050px"
top="5vh"
@closed="diaClose">
<score-record ref="ref_score"
:serviceType="'party_unit'"></score-record>
</el-dialog>
</div>
</template>
@ -245,6 +280,8 @@
import unitsForm from './unitsForm'
import unitsDetail from './unitsDetail'
import finishList from './finishList'
import scoreRecord from '../../../components/scoreRecord.vue'
import { requestPost } from "@/js/dai/request";
import { mapGetters } from 'vuex'
@ -298,6 +335,13 @@ export default {
formTitle: '新增单位',
detailShow: false,
//
finishDiaTitle: '区域化党建单位完成情况',
finishDiaShow: false,
//
scoreDiaTitle: '积分记录',
scoreDiaShow: false,
files: "",
fileName: "",
uploadUlr: window.SITE_CONFIG['apiURL'] + '/gov/org/neighborhood/import'
@ -305,7 +349,7 @@ export default {
}
},
components: {
unitsForm, unitsDetail
unitsForm, unitsDetail, finishList, scoreRecord
},
async created () {
@ -390,14 +434,14 @@ export default {
this.tableLoading = false
},
diaClose () {
editDiaClose () {
this.$refs.ref_form.resetData()
this.formShow = false
},
detailClosed () {
diaClose () {
this.detailShow = false
this.finishDiaShow = false
this.scoreDiaShow = false
},
handleDetail (row) {
@ -407,6 +451,22 @@ export default {
})
},
//
handleFinish (row) {
this.finishDiaTitle = row.unitName + '完成情况'
this.finishDiaShow = true
this.$nextTick(() => {
this.$refs.ref_finish.initTable(row)
})
},
//
handleScore (row) {
this.scoreDiaShow = true
this.$nextTick(() => {
this.$refs.ref_score.initForm(row)
})
},
handleAdd () {
this.formTitle = '新增'
this.formShow = 'edit'

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

@ -33,6 +33,19 @@
<el-form-item label="需求人" prop="demandUserName">
<el-input v-model="searchForm.demandUserName" placeholder="请输入内容" clearable=""></el-input>
</el-form-item>
</div>
<div>
<el-form-item label="状态" prop="status">
<el-select v-model="searchForm.status" filterable placeholder="请选择" clearable>
<el-option
v-for="item in statusOptions"
:key="item.value"
:label="item.label"
:value="item.value">
</el-option>
</el-select>
</el-form-item>
<el-form-item label="上报时间" prop="reportStartTime">
<el-date-picker
v-model="reportTime"
@ -45,18 +58,10 @@
clearable="">
</el-date-picker>
</el-form-item>
</div>
<div>
<el-form-item label="状态" prop="status">
<el-select v-model="searchForm.status" filterable placeholder="请选择" clearable>
<el-option
v-for="item in statusOptions"
:key="item.value"
:label="item.label"
:value="item.value">
</el-option>
</el-select>
</el-form-item>
<el-form-item label="服务类型" prop="serviceType">
<el-select v-model="searchForm.serviceType" filterable placeholder="请选择" clearable @change="handleServiceChange('query', $event)">
<el-option
@ -94,7 +99,7 @@
<el-button type="primary" @click="handleSearch">查询</el-button>
</el-form-item>
<el-form-item>
<el-button @click="resetForm('searchForm')">重置</el-button>
<el-button type="yellow" @click="resetForm('searchForm')">重置</el-button>
</el-form-item>
</div>
@ -1119,6 +1124,8 @@ export default {
</script>
<style lang="scss" scoped>
@import "@/assets/scss/buttonstyle.scss";
.resi-container .resi-card-table {
::v-deep .el-table th {
color: #fff;

321
src/views/modules/systemManagement/serviceMatter/service.vue

@ -0,0 +1,321 @@
<template>
<div class="div_main">
<div class="div_table">
<div class="div_btn">
<el-button style=""
type="green"
size="small"
@click="handleAdd">新增</el-button>
</div>
<el-table class="table"
:data="tableData"
border
:height="tableHeight"
v-loading="tableLoading"
:header-cell-style="{background:'#2195FE',color:'#FFFFFF'}"
style="width: 100%">
<el-table-column prop="categoryName"
header-align="center"
align="center"
label="分类名称"
min-width="280">
</el-table-column>
<el-table-column prop="awardPoint"
header-align="center"
align="center"
label="积分"
min-width="80">
</el-table-column>
<el-table-column prop="usableFlagShow"
header-align="center"
align="center"
label="状态"
min-width="100">
</el-table-column>
<el-table-column label="操作"
fixed="right"
width="190"
header-align="center"
align="center"
class="operate">
<template slot-scope="scope">
<el-button v-if="scope.row.usableFlag"
type="text"
style="color:#D51010;text-decoration: underline;"
size="small"
@click="handleDisable(scope.row,'disable')">禁用</el-button>
<el-button v-if="!scope.row.usableFlag"
type="text"
style="color:#D51010;text-decoration: underline;"
size="small"
@click="handleDisable(scope.row,'able')">启用</el-button>
<el-button type="text"
style="color:#00A7A9;text-decoration: underline;"
size="small"
@click="handleEdit(scope.row)">修改</el-button>
</template>
</el-table-column>
</el-table>
</div>
<!-- 修改弹出框 -->
<el-dialog :visible.sync="formShow"
:close-on-click-modal="false"
:close-on-press-escape="false"
:title="formTitle"
width="950px"
top="5vh"
@closed="diaClose">
<service-form ref="ref_form"
:customerId="customerId"
@dialogCancle="addFormCancle"
@dialogOk="addFormOk"></service-form>
</el-dialog>
</div>
</template>
<script>
import serviceForm from './serviceForm'
import { requestPost } from "@/js/dai/request";
import { mapGetters } from 'vuex'
import { Loading } from 'element-ui' // Loading
let loading //
export default {
data () {
return {
loading: false,
total: 0,
pageSize: 10,
pageNo: 0,
tableLoading: false,
customerId: '',
tableData: [],
//form
formShow: false,
formTitle: '新增二级分类',
}
},
components: {
serviceForm
},
async created () {
},
async mounted () {
this.initData()
},
methods: {
initData () {
let { user } = this.$store.state
if (!user.customerId) {
setTimeout(() => {
this.initData()
}, 500)
} else {
this.customerId = user.customerId
this.loadTable()
}
},
handleSearch () {
this.loadTable()
},
async loadTable () {
this.tableLoading = true
const url = "/heart/serviceitem/list"
// const url = "http://yapi.elinkservice.cn/mock/245/heart/serviceitem/list"
let params = {
customerId: this.customerId
}
const { data, code, msg } = await requestPost(url, params)
if (code === 0) {
this.total = data.total
this.tableData = data.list
this.tableData.forEach(item => {
item.usableFlagShow = item.usableFlag ? '启用' : '禁用'
});
} else {
this.$message.error(msg)
}
this.tableLoading = false
},
diaClose () {
this.$refs.ref_form.resetData()
this.formShow = false
},
handleAdd () {
this.formTitle = '新增二级分类'
this.formShow = 'edit'
this.$nextTick(() => {
this.$refs.ref_form.initForm('add', null)
})
},
handleEdit (row) {
this.formTitle = '修改'
this.formShow = true
this.$nextTick(() => {
this.$refs.ref_form.initForm('edit', row)
})
},
addFormCancle () {
this.formShow = false
},
addFormOk () {
this.formShow = false
this.loadTable()
},
async handleDisable (row, type) {
let title = type === 'able' ? '启用' : '禁用'
this.$confirm("确认" + title + "?", "提示", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "warning"
})
.then(() => {
this.disableService(row, type)
})
.catch(err => {
if (err == "cancel") {
}
});
},
async disableService (row, type) {
const url = "/heart/serviceitem/updatestatus"
// const url = "http://yapi.elinkservice.cn/mock/245/heart/serviceitem/updatestatus"
let params = {
categoryId: row.categoryId,
usableFlag: type === 'able'
}
const { data, code, msg } = await requestPost(url, params)
if (code === 0) {
this.$message({
type: "success",
message: "操作成功"
});
this.loadTable()
} else {
this.$message.error(msg)
}
},
//
startLoading () {
loading = Loading.service({
lock: true, //
text: '正在加载……', //
background: 'rgba(0,0,0,.7)' //
})
},
//
endLoading () {
// clearTimeout(timer);
if (loading) {
loading.close()
}
}
},
computed: {
tableHeight () {
return (this.clientHeight - 210)
},
rowHeight () {
return (this.clientHeight - 200) + 'px'
},
...mapGetters(['clientHeight'])
},
watch: {
},
props: {
}
}
</script>
<style lang="scss" scoped >
@import "@/assets/scss/buttonstyle.scss";
.div_main {
width: 100%;
}
.div_search {
background: #ffffff;
border-radius: 4px;
padding: 30px 20px 5px;
box-shadow: 0px 2px 12px 0px rgba(0, 0, 0, 0.1);
}
.item_width_1 {
width: 260px;
}
.item_width_2 {
width: 620px;
}
.div_table {
background: #ffffff;
box-shadow: 0px 2px 12px 0px rgba(0, 0, 0, 0.1);
border-radius: 4px;
padding: 23px 30px 10px;
.table {
margin-top: 20px;
}
}
.div_btn {
}
.el-row {
/* margin-bottom: 20px; */
display: flex;
flex-wrap: wrap;
margin-top: 10px;
margin-right: 50px;
}
</style>

232
src/views/modules/systemManagement/serviceMatter/serviceForm.vue

@ -0,0 +1,232 @@
<template>
<div>
<div>
<div>
<el-form ref="ref_form"
:inline="true"
:model="formData"
:rules="dataRule"
:disabled="formType === 'detail'"
class="form">
<el-form-item label="分类名称"
prop="categoryName"
label-width="150px"
style="display: block">
<el-input class="item_width_1"
maxlength="20"
show-word-limit
placeholder="请输入分类名称"
v-model="formData.categoryName">
</el-input>
</el-form-item>
<el-form-item label="奖励积分"
style="display: block"
prop="awardPoint"
label-width="150px">
<el-input-number class="item_width_1"
v-model="formData.awardPoint"
:min="0"
label="奖励积分"></el-input-number>
</el-form-item>
</el-form>
</div>
</div>
<div class="div_btn">
<el-button @click="handleCancle"> </el-button>
<el-button v-if="formType != 'detail'"
type="primary"
:disabled="btnDisable"
@click="handleComfirm"> </el-button>
</div>
</div>
</template>
<script>
import { mapGetters } from 'vuex'
import { Loading } from 'element-ui' // Loading
import { requestPost } from '@/js/dai/request'
let loading //
export default {
data () {
return {
formType: 'add', // addeditdetail
btnDisable: false,
keyWords: '',
formData: {
customerId: '',
categoryName: '',
categoryId: '',
awardPoint: null
},
}
},
components: {},
mounted () {
},
methods: {
async initForm (type, row) {
this.startLoading()
this.$refs.ref_form.resetFields();
this.formType = type
if (row) {
this.formData = JSON.parse(JSON.stringify(row))
} else {
this.resetData()
}
this.formData.customerId = this.customerId
this.endLoading()
},
async handleComfirm () {
this.btnDisable = true
setTimeout(() => {
this.btnDisable = false
}, 10000)
this.$refs['ref_form'].validate((valid, messageObj) => {
if (!valid) {
app.util.validateRule(messageObj)
this.btnDisable = false
} else {
this.addService()
}
})
},
async addService () {
let url = '/heart/serviceitem/saveorupdate'
// let url = "http://yapi.elinkservice.cn/mock/245/heart/serviceitem/saveorupdate"
const { data, code, msg } = await requestPost(url, this.formData)
if (code === 0) {
this.$message({
type: 'success',
message: '操作成功'
})
this.resetData()
this.$emit('dialogOk')
this.btnDisable = false
} else {
this.btnDisable = false
this.$message.error(msg)
}
},
handleCancle () {
this.resetData()
this.$emit('dialogCancle')
},
resetData () {
this.formData = {
customerId: '',
categoryName: '',
categoryId: '',
awardPoint: null
}
},
//
startLoading () {
loading = Loading.service({
lock: true, //
text: '正在加载……', //
background: 'rgba(0,0,0,.7)' //
})
},
//
endLoading () {
// clearTimeout(timer);
if (loading) {
loading.close()
}
}
},
computed: {
dataRule () {
return {
categoryName: [
{ required: true, message: '分类名称不能为空', trigger: 'blur' },
],
awardPoint: [
{ required: true, message: '奖励积分不能为空', trigger: 'blur' }
],
}
},
},
props: {
customerId: {
type: String,
default: ""
}
}
}
</script>
<style scoped>
.item_width_1 {
width: 500px;
}
.item_width_2 {
width: 400px;
}
.item_width_3 {
margin-left: 10px;
width: 200px;
}
.item_width_4 {
width: 200px;
}
.div_btn {
display: flex;
justify-content: flex-end;
}
.el-tabs {
margin: 0 20px;
}
.el-upload__tip {
color: rgb(155, 155, 155);
margin: 0;
}
.form {
margin-top: 30px;
}
</style>
<style lang=scss>
.el-dialog__body {
padding: 0 10px 20px !important;
}
</style>

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

@ -121,6 +121,8 @@ let loading;//加载动画
let map;
let mapView;
let gaodeMapLayer;//
let parentLayer;//
let parentSource;//
let polygonLayer;//
let iconLayer; // icon
let iconSource; // icon
@ -155,7 +157,7 @@ var createTextStyle = function (feature) {
text: feature.values_.name,
backgroundFill: new Fill({
// color: 'rgba(0, 146, 238, 0.75)'
color: textColorArray[feature.values_.index - 1]
color: textColorArray[feature.values_.colorIndex]
}),
padding: [4, 10, 4, 10],
//text: "",
@ -167,17 +169,34 @@ var createTextStyle = function (feature) {
});
};
//
//
var parentStyleFunction = (function () {
return function (feature) {
return new Style({
// fill: new Fill({
// color: [255, 255, 255, 0.3]
// }),
stroke: new Stroke({
color: [0, 103, 182, 1],
width: 2
}),
// text: createTextStyle(feature)
});;
};
})()
//
var polygonStyleFunction = (function () {
return function (feature) {
return new Style({
fill: new Fill({
// color: [255, 255, 255, 0.3]
color: polygonColorArray[feature.values_.index - 1]
color: polygonColorArray[feature.values_.colorIndex]
}),
stroke: new Stroke({
color: polygonColorArray[feature.values_.index - 1],
color: polygonColorArray[feature.values_.colorIndex],
width: 3
}),
@ -214,17 +233,22 @@ const vueGis = {
runNum: 0,
runAgencyArray: [],
selUserId: '',
center: [],
zoom: null,
parentPolygon: [],
}
},
async mounted () {
//
await this.loadOrgData()
//
this.initMap()
this.addParentLayer()
this.loadParentPolygon()
//
this.addPolygonLayer()
@ -289,12 +313,14 @@ const vueGis = {
// type:polygon / search people
async toSubAgency (type, e, searchName) {
console.log(e)
this.runNum++
this.runAgencyArray.push(this.orgData)
if (!e) {
return false
}
//neighborHood
if (type === 'people') {
this.runNum++
this.runAgencyArray.push(this.orgData)
this.orgLevel = 'people'
this.selUserId = e
this.orgId = ''
@ -305,9 +331,11 @@ const vueGis = {
}
this.searchName = searchName
} else if (type === 'search') {
} else if (type === 'search') {
this.runNum++
this.runAgencyArray.push(this.orgData)
this.orgLevel = 'search'
this.orgId = ''
this.orgData = {
@ -320,8 +348,17 @@ const vueGis = {
});
} else {
this.subAgencyArray.forEach(item => {
if (!e.selected[0]) {
return false
}
this.runNum++
this.orgData.center = map.getView().getCenter()
this.orgData.zoom = map.getView().getZoom()
console.log('center', map.getView().getCenter())
console.log('zoom', map.getView().getZoom())
this.runAgencyArray.push(this.orgData)
this.subAgencyArray.forEach(item => {
if (item.id === e.selected[0].values_.id) {
this.orgId = item.id
this.orgLevel = item.level
@ -332,7 +369,6 @@ const vueGis = {
if (this.orgLevel === 'neighborHood') {
this.loadList()
this.$nextTick(() => {
// id
this.$refs.ref_community.initData(this.orgData.id, this.orgData.name);
});
@ -343,7 +379,6 @@ const vueGis = {
}
},
//
@ -351,16 +386,17 @@ const vueGis = {
//
await this.loadOrgData()
this.loadParentPolygon()
//
await this.loadPolygon(this.subAgencyArray)
//
if (isRefreshView) {
this.setMapLocation()
mapView.setCenter(this.centerPoint);
mapView.setZoom(this.zoom);
}
// //
// if (isRefreshView) {
// this.setMapLocation()
// mapView.setCenter(this.centerPoint);
// mapView.setZoom(this.zoom);
// }
await this.loadList()
@ -378,6 +414,8 @@ const vueGis = {
this.orgId = this.orgData.id
this.orgLevel = this.orgData.level
this.center = this.orgData.center
this.zoom = this.orgData.zoom
if (this.orgLevel === 'people') {
@ -415,7 +453,8 @@ const vueGis = {
this.orgData = data
this.orgId = this.orgData.id
this.orgLevel = this.orgData.level
this.parentPolygon = []
this.parentPolygon.push(data)
if (data.children && data.children.length > 0) {
this.subAgencyArray = data.children
} else {
@ -428,6 +467,63 @@ const vueGis = {
},
//
loadParentPolygon () {
parentSource.clear()//
let featureData = []//
if (this.parentPolygon && this.parentPolygon.length > 0) {//
let oneData = {}
this.parentPolygon.forEach(agencyItem => {
if (agencyItem.coordinates && agencyItem.coordinates !== '') {//
oneData = {
type: 'Feature',
id: agencyItem.id,
properties: {
id: agencyItem.id,
level: agencyItem.level,
name: agencyItem.name
},
geometry: {
type: 'Polygon',
coordinates: [],
},
}
let coorArray = agencyItem.coordinates.split(',')//
let itemArray = []//[lon,lat]
let polygonArray = []//[[lon,lat],[lon,lat],[lon,lat]]
coorArray.forEach((item, index) => {
itemArray.push(item)
if (index % 2 == 0) {//
} else {//
polygonArray.push(itemArray)
itemArray = []
}
});
oneData.geometry.coordinates.push(polygonArray)
featureData.push(oneData)
}
});
}
if (featureData && featureData.length > 0) {
var geojsonObject = {
'type': 'FeatureCollection',
'features': featureData
};
let feature = (new GeoJSON()).readFeatures(geojsonObject)
parentSource.addFeatures(feature)
}
},
//
loadPolygon (subAgencyArray) {
polygonSource.clear()//
@ -437,10 +533,14 @@ const vueGis = {
if (subAgencyArray && subAgencyArray.length > 0) {//
let oneData = {}
subAgencyArray.forEach(agencyItem => {
let count = 0
for (let i = 0; i < subAgencyArray.length; i++) {
const agencyItem = subAgencyArray[i]
if (agencyItem.coordinates && agencyItem.coordinates !== '') {//
let urlNum = this.getRndBetween(1, 3)
let urlNum = count % 3
count++
oneData = {
type: 'Feature',
@ -449,7 +549,7 @@ const vueGis = {
id: agencyItem.id,
level: agencyItem.level,
name: agencyItem.name,
index: urlNum//
colorIndex: urlNum//
},
geometry: {
type: 'Polygon',
@ -474,7 +574,7 @@ const vueGis = {
oneData.geometry.coordinates.push(polygonArray)
featureData.push(oneData)
}
});
}
}
if (featureData && featureData.length > 0) {
@ -515,7 +615,7 @@ const vueGis = {
scale: 0.5,
// src: "/img/largeScreen/icon_camra.png"
// src: "https://elink-esua-epdc.oss-cn-qingdao.aliyuncs.com/epmet/test/20211116/a219130b6bc74b0b80b5ddb0fce0892a.png"
src: iconUrlArray[oneIcon.values_.index - 1]
src: iconUrlArray[oneIcon.values_.colorIndex]
})
});
@ -532,18 +632,20 @@ const vueGis = {
},
//
setMapLocation () {
this.centerPoint = []
if (this.center && this.center.length > 0) {
this.centerPoint = this.center
} else if (this.orgData.longitude && this.orgData.latitude) {
if (this.orgData.longitude && this.orgData.latitude) {
this.centerPoint = []
this.centerPoint.push(this.orgData.longitude)
this.centerPoint.push(this.orgData.latitude)
} else {
this.centerPoint = centerPointGlobal
}
this.setZoom(this.orgData.agencyLevel)
if (!this.zoom) {
this.setZoom(this.orgData.agencyLevel)
}
},
//
@ -604,6 +706,23 @@ const vueGis = {
});
map.removeInteraction(dblClickInteraction);
},
//
addParentLayer () {
parentSource = new VectorSource({
//features: (new GeoJSON()).readFeatures(geojsonObject)
});
parentLayer = new VectorLayer({
source: parentSource,
style: parentStyleFunction,
zIndex: 50
});
map.addLayer(parentLayer)
},
//

68
src/views/modules/visual/basicinfo/personCategory/components/screen-loading/index.vue

@ -0,0 +1,68 @@
<template>
<div class="screen-loading">
<svg width="50px"
height="50px">
<circle cx="25"
cy="25"
r="20"
fill="transparent"
stroke-width="3"
stroke-dasharray="31.415, 31.415"
stroke="#29cdff"
stroke-linecap="round">
<animateTransform attributeName="transform"
type="rotate"
values="0, 25 25;360, 25 25"
dur="1.5s"
repeatCount="indefinite" />
<animate attributeName="stroke"
values="#02bcfe;#3be6cb;#02bcfe"
dur="3s"
repeatCount="indefinite" />
</circle>
<circle cx="25"
cy="25"
r="10"
fill="transparent"
stroke-width="3"
stroke-dasharray="15.7, 15.7"
stroke="#29cdff"
stroke-linecap="round">
<animateTransform attributeName="transform"
type="rotate"
values="360, 25 25;0, 25 25"
dur="1.5s"
repeatCount="indefinite" />
<animate attributeName="stroke"
values="#3be6cb;#02bcfe;#3be6cb"
dur="3s"
repeatCount="indefinite" />
</circle>
</svg>
<div class="loading-tip">
<slot></slot>
</div>
</div>
</template>
<script>
export default {
name: 'DvLoading'
}
</script>
<style lang="scss" scoped>
.screen-loading {
width: 100%;
height: 100%;
display: flex;
flex-direction: column;
justify-content: center;
align-items: center;
.loading-tip {
font-size: 14px;
color: #fff;
}
}
</style>

358
src/views/modules/visual/basicinfo/personCategory/components/screen-table/index.vue

@ -0,0 +1,358 @@
<template>
<div class="warning-table">
<div class="table">
<div class="table-header">
<div class="table-header-th"
style="width:5%">
{{ '序号' }}
</div>
<div class="table-header-th"
style="width:10%">
{{ '姓名' }}
</div>
<div class="table-header-th"
style="width:15%">
{{ '调整时间' }}
</div>
<div class="table-header-th table-header-select"
style="width:10%"
@click.stop="handleShowType()">
<span>{{ typeShow }}</span>
<img src="@/assets/img/xiala.png" />
<div class="user_list"
v-show="showTypeSelect">
<div v-for="(item,index) in typeList"
:key="index"
class="user_item"
@click.stop="handleClickType(item.value,item.label)">
<div class="user_item_content">
<div class="name">{{item.label}}</div>
</div>
<div :class="['item_line',{'last_line':index==(typeList.length-1)}]"></div>
</div>
</div>
</div>
<div class="table-header-th"
style="width:20%">
{{ '网格' }}
</div>
<div class="table-header-th"
style="width:30%">
{{ '小区楼栋' }}
</div>
</div>
<div class="table-body">
<div class="table-body-tr"
v-for="(value, index) in tableData"
:key="index">
<div class="td"
v-for="(item, indexs) in value"
:style="{width:widthList[indexs]}"
:key="indexs">
<span>{{ item }}</span>
</div>
</div>
<screen-loading v-if="visibleLoading">加载中</screen-loading>
<div class="no-data"
v-if="tableData.length == 0 && !visibleLoading">
<img src="../../../../../../../assets/img/modules/visual/noData.png"
alt=""
srcset=""
class="no-data-img" />
</div>
</div>
</div>
</div>
</template>
<script>
import ScreenLoading from "../screen-loading/index";
import { requestPost } from "@/js/dai/request";
import Vue from "vue";
export default {
name: "warning-table",
components: {
ScreenLoading,
},
props: {
},
data () {
return {
visibleLoading: false,
tableData: [],
showTypeSelect: false,
widthList: ['5%', '10%', '15%', '10%', '20%', '30%'],
typeList: [
{
value: '1',
label: '迁入'
},
{
value: '2',
label: '迁出'
},
{
value: '3',
label: '新增'
},
],
typeShow: '类别',
selType: '',
monthId: '',
categoryKey: '',
pageNo: '',
pageSize: '',
};
},
watch: {
},
mounted () {
},
created () { },
methods: {
//
async getUserwarnlist (monthId, categoryKey, pageNo, pageSize) {
this.visibleLoading = true
if (monthId) {
this.monthId = monthId
this.categoryKey = categoryKey
this.pageNo = pageNo
this.pageSize = pageSize
}
let tableData = [];
// const url = "/temp/record-list";
const url = "http://yapi.elinkservice.cn/mock/245/temp/record-list";
let params = {
categoryKey: this.categoryKey,
monthId: this.monthId,
type: this.selType,
pageNo: this.pageNo,
pageSize: this.pageSize,
};
const { data, code, msg } = await requestPost(url, params);
if (code === 0) {
data.list.forEach((item, index) => {
tableData.push([
index + 1,
item.name ? item.name : '--',
item.changeTime ? item.changeTime : '--',
item.typeName ? item.typeName : '--',
item.gridName ? item.gridName : '--',
item.address ? item.address : '--',
]);
});
this.tableData = tableData;
this.total = data.total;
this.visibleLoading = false
} else {
}
},
handleShowType () {
this.showTypeSelect = !this.showTypeSelect
},
handleClickType (value, label) {
this.typeShow = label
this.selType = value
this.getUserwarnlist()
this.showTypeSelect = !this.showTypeSelect
},
},
};
</script>
<style lang="scss" scoped>
.warning-table {
box-sizing: border-box;
width: 100%;
height: 100%;
.table {
width: 100%;
height: 100%;
&-header {
width: 100%;
height: 50px;
display: flex;
justify-content: space-around;
align-items: center;
background: rgba(8, 37, 134, 0.85);
font-size: 16px;
font-weight: 400;
color: #ffffff;
&-th {
text-align: center;
width: calc(100% / 5);
}
&-select {
position: relative;
cursor: pointer;
// display: flex;
// justify-content: space-around;
> img {
margin-left: 10px;
// width: 10px;
// height: 10px;
}
}
}
&-body {
box-sizing: border-box;
width: 100%;
height: calc(100% - 50px);
font-size: 18px;
font-weight: 400;
color: #ffffff;
&-tr {
width: 100%;
height: 50px;
// height: calc(100% / 10);
display: flex;
justify-content: space-around;
align-items: center;
.td {
text-align: center;
width: calc(100% / 5);
.more {
font-size: 18px;
font-weight: 400;
color: #e4dc00;
position: relative;
cursor: pointer;
&-pop {
box-sizing: border-box;
display: block;
box-sizing: border-box;
width: 215px;
height: auto;
line-height: 20px;
border: 1px solid red;
position: absolute;
right: -100%;
top: 150%;
background: #06186d;
border: 1px solid #1a64cc;
border-radius: 5px;
font-size: 9px;
font-weight: 400;
color: #ffffff;
padding: 16px 8px 10px 9px;
z-index: 1;
cursor: default;
// &::after{
// position: absolute;
// left: 30%;
// top: -30%;
// display: flex;
// content:'';
// width: 0;
// height: 0;
// border-width: 13px;
// border-style: solid;
// border-color: transparent transparent rgba(26, 100, 204,0.5) transparent;
// // border-color: transparent transparent red transparent;
// transform: translate(-50%,0);
// }
}
}
}
}
&-tr:nth-child(2n) {
background: rgba(16, 75, 164, 0.24);
}
&-tr:hover {
background: url("../../../../../../../assets/img/modules/visual/hover-bac.png")
no-repeat center;
background-size: 100% 100%;
}
//
.no-data {
width: 100%;
height: calc(100% - 50px);
display: flex;
align-items: center;
justify-content: center;
&-img {
width: 249px;
height: 172px;
}
}
}
}
}
.user_list {
margin-top: 2px;
position: absolute;
z-index: 10;
left: 25%;
background: #020340;
border: 1px solid #0a359b;
border-radius: 4px;
box-shadow: 0 0 10px inset #1a5afd;
.user_item {
padding: 13px 8px 0 14px;
font-size: 16px;
font-family: PingFang SC;
font-weight: 400;
color: #ffffff;
.user_item_content {
display: flex;
// justify-content: center;
align-items: center;
.name {
max-width: 80%;
text-align: left;
}
> img {
margin-left: auto;
margin-top: 4px;
width: 8px;
height: 12px;
}
}
.item_line {
margin-top: 9px;
width: 70px;
height: 0px;
border: 1px dotted #1797ff31;
border-width: 0.5px;
}
.last_line {
border: 1px dotted #1797ff00;
}
}
}
</style>

251
src/views/modules/visual/basicinfo/personCategory/index.vue

@ -0,0 +1,251 @@
<template>
<div class="warning-box">
<cpt-card>
<div class="title">
<img src="@/assets/img/shuju/title-tip.png" />
<span>人员类别分析</span>
<div class="second-select cascader">
<el-cascader class="customer_cascader"
ref="myCascader"
v-model="agencyIdArray"
:key="iscascaderShow"
:options="casOptions"
:props="optionProps"
:show-all-levels="false"
@change="handleChangeAgency"></el-cascader>
</div>
<div class="second-select ">
<el-date-picker v-model="dateIdShow"
type="date"
:clearable="false"
@change="handleChangeDate"
prefix-icon="el-icon-caret-bottom"
placeholder="选择日期"
value-format="yyyy-MM-dd">
</el-date-picker>
</div>
</div>
<div class="warning-box-top">
<div class="top-item"
:class="{
'top-item-active': activeIndex == index ,
}"
@click="onClickList(item,index)"
v-for="(item, index) in categoryList"
:key="index">
<div class="top-item-img">
<img :src="item.dataIcon" />
<div class="top-item-left">
<span>{{ item.categoryName }}</span>
<span>{{ item.total }}</span>
</div>
</div>
<div class="top-item-num">
<div class="num-item">
<div>较上月</div>
<div>
<div>{{ "+"+ item.immigration }}</div>
</div>
</div>
<div class="num-item">
<div>{{" "}}</div>
<div>
<div>{{ "-"+ item.emigration}}</div>
</div>
</div>
</div>
</div>
</div>
<div class="warning-box-bottom">
<screen-table ref="ref_recordlist"></screen-table>
<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>
</div>
</cpt-card>
</div>
</template>
<script>
import { requestPost } from "@/js/dai/request";
import screenTable from "./components/screen-table/index";
import cptCard from "@/views/modules/visual/cpts/card";
import nextTick from "dai-js/tools/nextTick";
export default {
components: {
cptCard,
screenTable,
},
data () {
return {
//
casOptions: [],
agencyIdArray: [],
customerList: [],
iscascaderShow: 0,
optionProps: {
multiple: false,
value: 'agencyId',
label: 'agencyName',
orgType: 'orgType',
children: 'subAgencyList',
checkStrictly: true
},
dateIdShow: '',
agencyId: '',
level: '',
dateId: '',//yyyyMMdd
monthId: '',//yyyyMM
categoryKey: '',
agencyInfo: {},
categoryList: [],
pageNo: 1,
pageSize: 10,
total: 0,
activeIndex: 0,
};
},
async mounted () {
await nextTick(100);
this.initData()
await this.getAgencylist()//
this.getApiData()
},
methods: {
async getApiData () {
//
await this.getCategoryData()
this.$refs.ref_recordlist.getUserwarnlist(this.monthId, this.categoryKey, this.pageNo, this.pageSize)
},
initData () {
var time = (new Date).getTime() - 24 * 60 * 60 * 1000;
var nowdate = new Date(time); //
var y = nowdate.getFullYear();
var m = nowdate.getMonth() + 1 < 10 ? "0" + (nowdate.getMonth() + 1) : nowdate.getMonth() + 1;
var d = nowdate.getDate() < 10 ? "0" + nowdate.getDate() : nowdate.getDate();
this.dateIdShow = y + '-' + m + '-' + d;
},
//
async getAgencylist () {
const url = "/gov/org/customeragency/agencygridtree";
let params = {};
const { data, code, msg } = await requestPost(url, params);
if (code === 0) {
this.agencyInfo = data
this.agencyId = this.agencyInfo.agencyId
this.level = this.agencyInfo.level === 'grid' ? 'grid' : 'agency'
//
++this.iscascaderShow
this.casOptions = []
this.agencyIdArray.length = []
if (data) {
this.casOptions.push(data)
this.agencyIdArray.push(this.agencyId)
}
} else {
this.$message.error(msg);
}
},
onClickList (item, index) {
this.activeIndex = index;
this.pageNo = 1;
this.categoryKey = item.categoryKey
this.$refs.ref_recordlist.getUserwarnlist(this.monthId, this.categoryKey, this.pageNo, this.pageSize)
},
//
async getCategoryData () {
// const url = "/data/aggregator/icuser/category-data";
const url = "http://yapi.elinkservice.cn/mock/245/data/aggregator/icuser/category-data";
let params = {
orgType: this.level,
orgId: this.agencyId,
dateId: this.dateId,
};
const { data, code, msg } = await requestPost(url, params);
if (code === 0) {
this.categoryList = data;
if (this.categoryList.length > 0) {
this.categoryKey = this.categoryList[0].categoryKey
}
} else {
}
},
async handleChangeDate (value) {
this.dateIdShow = value
this.getApiData()
},
async handleChangeAgency (value) {
this.agencyName = this.$refs["myCascader"].getCheckedNodes()[0].label
this.agencyId = this.agencyIdArray.length > 0 ? this.agencyIdArray[this.agencyIdArray.length - 1] : ''
this.getApiData()
},
pageSizeChangeHandleNew (val) {
this.pageNo = 1;
this.pageSize = val;
this.$refs.ref_recordlist.getUserwarnlist(this.monthId, this.categoryKey, this.pageNo, this.pageSize)
},
pageCurrentChangeHandleNew (val) {
this.pageNo = val;
this.getUserwarnlist();
this.$refs.ref_recordlist.getUserwarnlist(this.monthId, this.categoryKey, this.pageNo, this.pageSize)
},
},
watch: {
dateIdShow () {
let dataArray = this.dateIdShow.split('-')
this.dateId = dataArray.join('')
this.monthId = this.dateId.substring(0, 6)
},
},
};
</script>
<style
lang="scss"
src="@/assets/scss/modules/visual/typeAnalyze.scss"
scoped
></style>
<style
lang="scss"
src="@/assets/scss/modules/visual/personCategory.scss"
scoped
></style>

2
src/views/modules/visual/communityGovern/resibuzz.vue

@ -449,7 +449,7 @@ export default {
this.tableList = data.list
this.demand.list = data.list.map((item) => {
return [
{ type: "index" },
item.sort ? item.sort : '--',
item.issueTitle ? item.issueTitle : '',
item.suggestion ? item.suggestion : '',
item.categoryName.join(','),

12
src/views/modules/visual/communityGovern/typeAnalyze.vue

@ -153,7 +153,7 @@ export default {
width: "10%",
},
],
header: ["序号", "类别", "反映渠道", "所属网格", "状态", "项目标题", "转成项目时间", "操作"],
header: ["序号", "类别", "反映渠道", "所属组织", "状态", "项目标题", "转成项目时间", "操作"],
list: [],
pageSize: 10,
pageNo: 1,
@ -426,11 +426,11 @@ export default {
{ type: "index" },
// item.projectCode ? item.projectCode : '',
item.categoryNames.join(','),
item.originShow ? item.originShow : '',
item.gridName ? item.gridName : '',
item.statusShow ? item.statusShow : '',
item.title ? item.title : '',
item.time ? item.time : '',
item.originShow ? item.originShow : '--',
item.orgName ? item.orgName : '--',
item.statusShow ? item.statusShow : '--',
item.title ? item.title : '--',
item.time ? item.time : '--',
{ type: "operate", list: ["查看"] },
];
});

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

@ -16,11 +16,11 @@
</div>
</div>
<div class="box-wr">
<cpt-card class="card-wr">
<div class="card-wr">
<div class="card-title">
<img class="title-icon"
src="../../../../assets/img/shuju/title-tip.png" />
<div class="title-label">
<!-- <img class="title-icon"
src="../../../../assets/img/shuju/title-tip.png" /> -->
<div class="card-left-title">
志愿者服务情况
</div>
</div>
@ -77,12 +77,12 @@
</div>
</cpt-card>
<cpt-card class="card-wr card-wr-map">
</div>
<div class="card-wr card-wr-map">
<div class="card-title">
<img class="title-icon"
src="../../../../assets/img/shuju/title-tip.png" />
<div class="title-label">
<!-- <img class="title-icon"
src="../../../../assets/img/shuju/title-tip.png" /> -->
<div class="card-left-title">
多元化治理平面图
</div>
</div>
@ -108,7 +108,7 @@
</div>
</cpt-card>
</div>
</div>
</cpt-card>
</div>
@ -619,6 +619,7 @@ export default {
// display: flex;
.box-wr {
display: flex;
margin-top: 40px;
}
.card-wr {
flex: 1;
@ -785,15 +786,35 @@ export default {
text-align: center;
.card-map {
margin-top: 10px;
margin-top: 30px;
width: 100%;
// height: calc(100vh - 285px);
height: calc(100vh - 315px);
height: calc(100vh - 335px);
padding-left: 20px;
.map {
width: 100%;
height: 100%;
}
}
}
.card-left-title {
position: relative;
padding-left: 40px;
font-size: 16px;
font-weight: 500;
color: #fff;
}
.card-left-title::after {
content: '';
position: absolute;
top: 50%;
left: 20px;
width: 12px;
height: 12px;
box-sizing: border-box;
margin-top: -6px;
background: #2865FA;
border-radius: 50%;
}
</style>

142
src/views/modules/workSys/mapConfig.vue

@ -83,6 +83,8 @@ let projection = new Projection({
let map;
let mapView;
let gaodeMapLayer;//
let parentLayer;//
let parentSource;//
let polygonLayer;//
let polygonSource;//
@ -106,7 +108,22 @@ var createTextStyle = function (feature) {
overflow: true,
});
};
//
//
var parentStyleFunction = (function () {
return function (feature) {
return new Style({
// fill: new Fill({
// color: [255, 255, 255, 0.3]
// }),
stroke: new Stroke({
color: [0, 103, 182, 1],
width: 2
}),
// text: createTextStyle(feature)
});;
};
})()
var polygonStyleFunction = (function () {
return function (feature) {
@ -151,6 +168,9 @@ const vueGis = {
//
runNum: 0,
runAgency: [],
center: [],
zoom: null,
parentPolygon: [],
}
},
@ -162,6 +182,10 @@ const vueGis = {
//
this.initMap()
//
this.addParentLayer()
this.loadParentPolygon()
//
this.addPolygonLayer()
@ -172,11 +196,12 @@ const vueGis = {
methods: {
//
orgChange (index) {
this.selAgencyIndex = index
selectedFeatures.clear()
if (index || index === 0) {
if (this.subAgencyArray.length > 0 && (index || index === 0)) {
this.showBtn = true
this.selAgency = this.subAgencyArray[index]
if (this.selAgency.coordinates) {
@ -196,23 +221,27 @@ const vueGis = {
async refreshMap (isRefreshView) {
//
await this.loadOrgData()
this.loadParentPolygon()
//
this.loadPolygon(this.subAgencyArray)
//
if (isRefreshView) {
this.setMapLocation()
mapView.setCenter(this.centerPoint);
mapView.setZoom(this.zoom);
}
// if (isRefreshView) {
// this.setMapLocation()
// mapView.setCenter(this.centerPoint);
// mapView.setZoom(this.zoom);
// }
},
//
handleBack () {
this.center = this.runAgency[this.runNum - 1].center
this.zoom = this.runAgency[this.runNum - 1].zoom
this.selAgencyId = ''
this.runNum--
this.runAgency.pop()
if (this.runNum === 0) {
this.orgId = ''
this.orgLevel = ''
@ -243,6 +272,8 @@ const vueGis = {
this.subAgencyArray.push(data)
// this.selAgencyId = data.id
} else {
this.parentPolygon = []
this.parentPolygon.push(data)
if (data.children && data.children.length > 0) {
this.subAgencyArray = data.children
@ -259,6 +290,62 @@ const vueGis = {
},
//
loadParentPolygon () {
parentSource.clear()//
let featureData = []//
if (this.parentPolygon && this.parentPolygon.length > 0) {//
let oneData = {}
this.parentPolygon.forEach(agencyItem => {
if (agencyItem.coordinates && agencyItem.coordinates !== '') {//
oneData = {
type: 'Feature',
id: agencyItem.id,
properties: {
id: agencyItem.id,
level: agencyItem.level,
name: agencyItem.name
},
geometry: {
type: 'Polygon',
coordinates: [],
},
}
let coorArray = agencyItem.coordinates.split(',')//
let itemArray = []//[lon,lat]
let polygonArray = []//[[lon,lat],[lon,lat],[lon,lat]]
coorArray.forEach((item, index) => {
itemArray.push(item)
if (index % 2 == 0) {//
} else {//
polygonArray.push(itemArray)
itemArray = []
}
});
oneData.geometry.coordinates.push(polygonArray)
featureData.push(oneData)
}
});
}
if (featureData && featureData.length > 0) {
var geojsonObject = {
'type': 'FeatureCollection',
'features': featureData
};
let feature = (new GeoJSON()).readFeatures(geojsonObject)
parentSource.addFeatures(feature)
}
},
//
loadPolygon (subAgencyArray) {
polygonSource.clear()//
@ -336,8 +423,12 @@ const vueGis = {
},
//
toSubAgency (e) {
if (!e.selected[0]) {
return false
}
if (this.method != 'mAddPolygon' && this.level != 'neighborHood') {
this.selAgencyId = ''
//
this.subAgencyArray.forEach(item => {
@ -351,6 +442,12 @@ const vueGis = {
});
this.runNum++
this.selPolygon.center = map.getView().getCenter()
this.selPolygon.zoom = map.getView().getZoom()
console.log('center', map.getView().getCenter())
console.log('zoom', map.getView().getZoom())
this.runAgency.push(this.selPolygon)
this.selAgencyIndex = 0
this.refreshMap(true)
@ -358,7 +455,6 @@ const vueGis = {
}
},
//
highlightPolygon () {
@ -374,9 +470,12 @@ const vueGis = {
},
//
setMapLocation () {
this.centerPoint = []
if (this.center && this.center.length > 0) {
this.centerPoint = this.center
} else if (this.orgData.longitude && this.orgData.latitude) {
if (this.orgData.longitude && this.orgData.latitude) {
this.centerPoint = []
this.centerPoint.push(this.orgData.longitude)
this.centerPoint.push(this.orgData.latitude)
} else {
@ -384,7 +483,9 @@ const vueGis = {
this.centerPoint = centerPointGlobal
}
this.setZoom(this.orgData.agencyLevel)
if (!this.zoom) {
this.setZoom(this.orgData.agencyLevel)
}
},
//
@ -447,6 +548,23 @@ const vueGis = {
},
//
addParentLayer () {
parentSource = new VectorSource({
//features: (new GeoJSON()).readFeatures(geojsonObject)
});
parentLayer = new VectorLayer({
source: parentSource,
style: parentStyleFunction,
zIndex: 50
});
map.addLayer(parentLayer)
},
//
addPolygonLayer () {
polygonSource = new VectorSource({

Loading…
Cancel
Save