Browse Source

fix: 恒安治页面构建

featrue-lingshan
LL 2 months ago
parent
commit
6e46f582bd
  1. 1
      src/views/newDataBoard/eRoadQiYang/components/ylqy-content-right/index.vue
  2. 213
      src/views/newDataBoard/hengAnZhi/Problem/tddtlxsj/detail.vue
  3. 189
      src/views/newDataBoard/hengAnZhi/Problem/tddtlxsj/list.vue
  4. 213
      src/views/newDataBoard/hengAnZhi/Problem/tyqybtlx/detail.vue
  5. 225
      src/views/newDataBoard/hengAnZhi/Problem/tyqybtlx/list.vue
  6. 213
      src/views/newDataBoard/hengAnZhi/Problem/tyry/detail.vue
  7. 210
      src/views/newDataBoard/hengAnZhi/Problem/tyry/list.vue
  8. 36
      src/views/newDataBoard/hengAnZhi/components/Breadcrumb/index.vue
  9. 131
      src/views/newDataBoard/hengAnZhi/components/EventList/index.vue
  10. 138
      src/views/newDataBoard/hengAnZhi/components/Pagination/index.vue
  11. 63
      src/views/newDataBoard/hengAnZhi/components/Tabs/index.vue
  12. 60
      src/views/newDataBoard/hengAnZhi/components/Title/index.vue
  13. 54
      src/views/newDataBoard/hengAnZhi/components/Title/titleSmall.vue
  14. 369
      src/views/newDataBoard/hengAnZhi/dissatisfieReason/detail.vue
  15. 210
      src/views/newDataBoard/hengAnZhi/dissatisfieReason/index.vue
  16. 234
      src/views/newDataBoard/hengAnZhi/dissatisfied/detail.vue
  17. 312
      src/views/newDataBoard/hengAnZhi/dissatisfied/index.vue
  18. 51
      src/views/newDataBoard/hengAnZhi/dissatisfiedPersonnel/detail.vue
  19. 140
      src/views/newDataBoard/hengAnZhi/dissatisfiedPersonnel/index.vue
  20. 159
      src/views/newDataBoard/hengAnZhi/index.vue
  21. 149
      src/views/newDataBoard/hengAnZhi/modules/ComplaintIncident/index.vue
  22. 87
      src/views/newDataBoard/hengAnZhi/modules/ComplaintPeople/index.vue
  23. 368
      src/views/newDataBoard/hengAnZhi/modules/EventAnalysis/index.vue
  24. 479
      src/views/newDataBoard/hengAnZhi/modules/PersonnelPortrait/index.vue
  25. 320
      src/views/newDataBoard/hengAnZhi/modules/PotentialPeople/index.vue
  26. 215
      src/views/newDataBoard/hengAnZhi/modules/TypesOfDissatisfaction/index.vue
  27. 332
      src/views/newDataBoard/hengAnZhi/potentialPeople/details/sjwjj.vue
  28. 302
      src/views/newDataBoard/hengAnZhi/potentialPeople/details/xqwmz.vue
  29. 211
      src/views/newDataBoard/hengAnZhi/potentialPeople/details/yxwxfw.vue
  30. 291
      src/views/newDataBoard/hengAnZhi/potentialPeople/index.vue
  31. 104
      src/views/newDataBoard/hengAnZhi/potentialPeople/sjwjj.vue
  32. 128
      src/views/newDataBoard/hengAnZhi/potentialPeople/xqwmz.vue
  33. 115
      src/views/newDataBoard/hengAnZhi/potentialPeople/yxwxfw.vue
  34. 0
      src/views/newDataBoard/hengAnZhi/style/index.scss

1
src/views/newDataBoard/eRoadQiYang/components/ylqy-content-right/index.vue

@ -170,6 +170,7 @@ export default {
let params = {
agencyId: 'd167076e825e75edda6540c5b9717c79',
limit: 20,
tagId: '1'
}
const { data, code, msg } = await requestGet(url, params);
this.partList = data ? [...data, ...this.partList] : [];

213
src/views/newDataBoard/hengAnZhi/Problem/tddtlxsj/detail.vue

@ -0,0 +1,213 @@
<template>
<div>
<Breadcrumb :list="breadcrumbList"/>
<div class="table">
<el-table
v-loading="loading"
:data="list"
element-loading-background="rgba(0,0,0,0.5)"
element-loading-spinner="el-icon-loading"
element-loading-text="加载中..."
>
<el-table-column label="序号" type="index" width="80"/>
<el-table-column label="地点" prop="address"/>
<el-table-column label="工单号" prop="workOrderNum" show-overflow-tooltip/>
<el-table-column label="所属社区" prop="gridName"></el-table-column>
<el-table-column label="事件分类" prop="categoryName" show-overflow-tooltip></el-table-column>
<el-table-column label="投诉内容" min-width="220px" prop="eventContent" show-overflow-tooltip></el-table-column>
<el-table-column label="接收时间" prop="happenTime"></el-table-column>
<el-table-column label="联系人" prop="name"></el-table-column>
<el-table-column label="联系电话" prop="mobile">
<template slot-scope="scope">
<el-button
v-if="scope.row.reportUserId != null && scope.row.reportUserId != ''"
size="small"
type="text"
@click="handleLook(scope.row)"
>
{{ $sensitive(scope.row.mobile, 3, 7) }}
</el-button>
<span v-else>
{{ $sensitive(scope.row.mobile, 3, 7) }}
</span>
</template>
</el-table-column>
<el-table-column label="状态" prop="status">
<template slot-scope="scope">
<span v-if="scope.row.status === 'processing'">处理中</span>
<span v-else-if="scope.row.status === 'closed_case'">已完成</span>
<span v-else>--</span>
</template>
</el-table-column>
<el-table-column align="center" label="详情">
<template slot-scope="data">
<el-button type="text" @click="handleView(data.row)">查看</el-button>
</template>
</el-table-column>
</el-table>
</div>
<EventDetails :id="rowId" :showDialog="showDialog" @close="showDialog = false"/>
<Pagination v-show="total > 0" :limit.sync="queryParams.pageSize" :page.sync="queryParams.pageNo" :total="total"
@pagination="getList"/>
</div>
</template>
<script>
import Breadcrumb from "@/views/dataBoard/satisfactionEval/components/Breadcrumb";
import Pagination from "@/views/dataBoard/satisfactionEval/components/Pagination";
import Title from "@/views/dataBoard/satisfactionEval/components/Title";
import EventDetails from "@/views/dataBoard/overview/components/EventDetail.vue";
import {requestPost} from "@/js/dai/request";
export default {
name: "TddtlxsjDetail",
components: {Breadcrumb, Pagination, Title, EventDetails},
data() {
return {
showDialog: false,
rowId: "",
queryParams: {
pageNo: 1,
pageSize: 13,
},
total: 0,
orgOptions: [],
breadcrumbList: [
{
path: "/dataBoard/satisfactionEval/index",
name: "满意度评价",
},
/* {
path: "/dataBoard/satisfactionEval/Problem/tddtlxsj",
name: "同地点同类型重复投诉问题列表",
},*/
{
path: "",
name: "详情",
},
],
list: [],
title: "",
loading: false,
recId: "",
departId: "",
address: "",
mobile: "",
};
},
activated() {
// this.breadcrumbList[2].name = this.address + ''
let type = this.$route.query.type;
if (type === 'list') {
this.breadcrumbList = [
{
path: "/dataBoard/satisfactionEval/index",
name: "满意度评价",
},
{
path: "/dataBoard/satisfactionEval/Problem/tddtlxsj",
name: "同地点同类型重复投诉问题列表",
},
{
path: "",
name: "详情",
}
]
} else {
this.breadcrumbList = [
{
path: "/dataBoard/satisfactionEval/index",
name: "满意度评价",
},
{
path: "",
name: "详情",
}
]
}
this.recId = this.$route.query.recId;
this.departId = this.$route.query.departId;
this.address = this.$route.query.address;
this.mobile = this.$route.query.mobile;
this.getList();
},
methods: {
search() {
this.queryParams.pageNo = 1;
this.getList();
},
async getList() {
this.loading = true;
let params = {
...this.queryParams,
}
try {
const url = "/governance/dwdEvent/list";
if (this.recId) {
params.secondIdList = [this.recId];
}
if (this.departId) {
params.departId = this.departId;
}
if (this.address) {
params.content = this.address;
}
if (this.mobile) {
params.mobile = this.mobile;
}
const {data, code, msg} = await requestPost(url, {
...params,
});
if (code == 0) {
this.total = data.total;
this.list = data.list;
this.loading = false;
}
} catch (err) {
console.log(err);
}
},
handleView({icEventId}) {
this.showDialog = true;
this.rowId = icEventId;
},
//
handleLook(row) {
let {reportUserId} = row
this.$router.push({
path: "/dataBoard/overview/resident",
query: {
user_id: reportUserId,
type: 'renfang'
},
});
},
},
};
</script>
<style lang="scss" scoped>
@import "@/assets/scss/dataBoard/table.scss";
.screen {
margin: 25px 0 40px;
.el-select,
.el-input {
width: 150px;
margin-right: 4px;
border: 1px solid #126ac5;
border-radius: 2px;
/deep/ .el-input__inner {
color: #fff;
border: none;
background: none;
}
}
.btn {
height: 32px;
margin-left: 46px;
}
}
.main-title {
margin: 25px 0 32px;
}
.table {
margin-top: 32px;
}
</style>

189
src/views/newDataBoard/hengAnZhi/Problem/tddtlxsj/list.vue

@ -0,0 +1,189 @@
<template>
<div>
<Breadcrumb :list="breadcrumbList"/>
<div class="screen">
<el-form :model="queryParams" inline>
<el-select
v-model.trim="typeCondition"
class="select"
placeholder="请选择"
popper-class="selectPopClass"
size="small"
>
<el-option
v-for="item in typeConditionList"
:key="item.value"
:label="item.label"
:value="item.value"
/>
</el-select>
<el-button class="btn" size="small" type="primary" @click="search">查询</el-button>
</el-form>
</div>
<div class="table">
<el-table v-loading="loading" :data="list" element-loading-background="rgba(0,0,0,0.5)"
element-loading-spinner="el-icon-loading" element-loading-text="加载中...">
<el-table-column label="序号" width="50" type="index"/>
<el-table-column label="地点" prop="address"/>
<el-table-column label="类型" prop="categoryName"/>
<el-table-column label="投诉次数" prop="amount"/>
<el-table-column align="center" label="详情">
<template slot-scope="data">
<el-button type="text" @click="handleView(data.row)">查看</el-button>
</template>
</el-table-column>
</el-table>
</div>
<Pagination v-show="total > 0" :limit.sync="queryParams.pageSize" :page.sync="queryParams.pageNo" :total="total"
@pagination="getList"/>
</div>
</template>
<script>
import Breadcrumb from "@/views/dataBoard/satisfactionEval/components/Breadcrumb";
import Pagination from "@/views/dataBoard/satisfactionEval/components/Pagination";
import Title from "@/views/dataBoard/satisfactionEval/components/Title";
import { requestPost } from "@/js/dai/request";
export default {
name: "tddtlxsjList",
components: {Breadcrumb, Pagination, Title},
data() {
return {
queryParams: {
month: "",
agencyId: "",
pageNo: 1,
pageSize: 10,
type: 1
},
typeCondition: 5,
typeConditionList: [
{
label: "本月",
value: 1,
},
{
label: "上月",
value: 2,
},
{
label: "近三月",
value: 3,
},
{
label: "近半年",
value: 4,
},
{
label: "近一年",
value: 5,
},
],
total: 0,
orgOptions: [],
breadcrumbList: [
{
path: "/dataBoard/satisfactionEval/index",
name: "满意度评价",
},
{
path: "",
name: "同地点同类型重复投诉问题列表 ",
},
],
monthOptions: new Array(12).fill(0).map((_, index) => {
return {label: index - 0 + 1 + "月", value: index - 0 + 1};
}),
list: [],
title: "",
loading: false,
};
},
activated() {
this.title = this.$route.query.title;
/* let searchParams = JSON.parse(this.$route.query.searchParams);
this.queryParams = {
...this.queryParams,
...searchParams,
};*/
this.getList();
},
methods: {
search() {
this.queryParams.pageNo = 1;
this.getList();
},
getList() {
this.loading = true;
let params = {
...this.queryParams,
...this.timeChange(this.typeCondition)
}
requestPost('/governance/dwdEvent/eventList',params).then(({data}) => {
this.total = data?data.total : 0;
this.list = data?data.list : [];
this.loading = false;
});
},
timeChange(type) {
let queryDateStart = "",
queryDateEnd = "";
if (type == 1) {
queryDateStart = this.$moment().startOf("month").format("YYYY-MM-DD");
}
if (type == 2) {
queryDateStart = this.$moment().subtract(1, "months").startOf("month").format("YYYY-MM-DD");
}
if (type == 3) {
queryDateStart = this.$moment().subtract(2, "months").startOf("month").format("YYYY-MM-DD");
}
if (type == 4) {
queryDateStart = this.$moment().subtract(5, "months").startOf("month").format("YYYY-MM-DD");
}
if (type == 5) {
queryDateStart = this.$moment().subtract(11, "months").startOf("month").format("YYYY-MM-DD");
}
if (type == 2) {
queryDateEnd = this.$moment().subtract(1, "months").endOf("month").format("YYYY-MM-DD");
} else {
queryDateEnd = this.$moment().endOf("month").format("YYYY-MM-DD");
}
return {queryDateStart, queryDateEnd};
},
handleView(row) {
let params = {
recId: row.categoryId,
address: row.address
}
this.$router.push('/dataBoard/satisfactionEval/Problem/tddtlxsj/detail?type=list&'+this.$paramsFormat(params))
},
},
};
</script>
<style lang="scss" scoped>
@import "@/assets/scss/dataBoard/table.scss";
.screen {
margin: 25px 0 40px;
.el-select,
.el-input {
width: 150px;
margin-right: 4px;
border: 1px solid #126ac5;
border-radius: 2px;
/deep/ .el-input__inner {
color: #fff;
border: none;
background: none;
}
}
.btn {
height: 32px;
margin-left: 46px;
}
}
.main-title {
margin: 25px 0 32px;
}
.table {
margin-top: 32px;
}
</style>

213
src/views/newDataBoard/hengAnZhi/Problem/tyqybtlx/detail.vue

@ -0,0 +1,213 @@
<template>
<div>
<Breadcrumb :list="breadcrumbList"/>
<div class="table">
<el-table
v-loading="loading"
:data="list"
element-loading-background="rgba(0,0,0,0.5)"
element-loading-spinner="el-icon-loading"
element-loading-text="加载中..."
>
<el-table-column label="序号" type="index" width="80"/>
<el-table-column label="地点" prop="address"/>
<el-table-column label="工单号" prop="workOrderNum" show-overflow-tooltip/>
<el-table-column label="所属社区" prop="gridName"></el-table-column>
<el-table-column label="事件分类" prop="categoryName" show-overflow-tooltip></el-table-column>
<el-table-column label="投诉内容" min-width="220px" prop="eventContent" show-overflow-tooltip></el-table-column>
<el-table-column label="接收时间" prop="happenTime"></el-table-column>
<el-table-column label="联系人" prop="name"></el-table-column>
<el-table-column label="联系电话" prop="mobile">
<template slot-scope="scope">
<el-button
v-if="scope.row.reportUserId != null && scope.row.reportUserId != ''"
size="small"
type="text"
@click="handleLook(scope.row)"
>
{{ $sensitive(scope.row.mobile, 3, 7) }}
</el-button>
<span v-else>
{{ $sensitive(scope.row.mobile, 3, 7) }}
</span>
</template>
</el-table-column>
<el-table-column label="状态" prop="status">
<template slot-scope="scope">
<span v-if="scope.row.status === 'processing'">处理中</span>
<span v-else-if="scope.row.status === 'closed_case'">已完成</span>
<span v-else>--</span>
</template>
</el-table-column>
<el-table-column align="center" label="详情">
<template slot-scope="data">
<el-button type="text" @click="handleView(data.row)">查看</el-button>
</template>
</el-table-column>
</el-table>
</div>
<EventDetails :id="rowId" :showDialog="showDialog" @close="showDialog = false"/>
<Pagination v-show="total > 0" :limit.sync="queryParams.pageSize" :page.sync="queryParams.pageNo" :total="total"
@pagination="getList"/>
</div>
</template>
<script>
import Breadcrumb from "@/views/dataBoard/satisfactionEval/components/Breadcrumb";
import Pagination from "@/views/dataBoard/satisfactionEval/components/Pagination";
import Title from "@/views/dataBoard/satisfactionEval/components/Title";
import EventDetails from "@/views/dataBoard/overview/components/EventDetail.vue";
import {requestPost} from "@/js/dai/request";
export default {
name: "TddtlxsjDetail",
components: {Breadcrumb, Pagination, Title, EventDetails},
data() {
return {
showDialog: false,
rowId: "",
queryParams: {
pageNo: 1,
pageSize: 13,
},
total: 0,
orgOptions: [],
breadcrumbList: [
{
path: "/dataBoard/satisfactionEval/index",
name: "满意度评价",
},
/* {
path: "/dataBoard/satisfactionEval/Problem/tyqybtlx",
name: "同一区域不同类型重复投诉问题列表",
},*/
{
path: "",
name: "详情",
},
],
list: [],
title: "",
loading: false,
recId: "",
departId: "",
address: "",
mobile: "",
};
},
activated() {
// this.breadcrumbList[2].name = this.address + ''
let type = this.$route.query.type
if (type === 'list') {
this.breadcrumbList = [
{
path: "/dataBoard/satisfactionEval/index",
name: "满意度评价",
},
{
path: "/dataBoard/satisfactionEval/Problem/tyqybtlx",
name: "同一区域不同类型重复投诉问题列表",
},
{
path: "",
name: "详情",
},
]
} else {
this.breadcrumbList = [
{
path: "/dataBoard/satisfactionEval/index",
name: "满意度评价",
},
{
path: "",
name: "详情",
},
]
}
this.recId = this.$route.query.recId;
this.departId = this.$route.query.departId;
this.address = this.$route.query.address;
this.mobile = this.$route.query.mobile;
this.getList();
},
methods: {
search() {
this.queryParams.pageNo = 1;
this.getList();
},
async getList() {
this.loading = true;
let params = {
...this.queryParams,
}
try {
const url = "/governance/dwdEvent/list";
if (this.recId) {
params.secondIdList = [this.recId];
}
if (this.departId) {
params.departId = this.departId;
}
if (this.address) {
params.content = this.address;
}
if (this.mobile) {
params.mobile = this.mobile;
}
const {data, code, msg} = await requestPost(url, {
...params,
});
if (code == 0) {
this.total = data.total;
this.list = data.list;
this.loading = false;
}
} catch (err) {
console.log(err);
}
},
handleView({icEventId}) {
this.showDialog = true;
this.rowId = icEventId;
},
//
handleLook(row) {
let {reportUserId} = row
this.$router.push({
path: "/dataBoard/overview/resident",
query: {
user_id: reportUserId,
type: 'renfang'
},
});
},
},
};
</script>
<style lang="scss" scoped>
@import "@/assets/scss/dataBoard/table.scss";
.screen {
margin: 25px 0 40px;
.el-select,
.el-input {
width: 150px;
margin-right: 4px;
border: 1px solid #126ac5;
border-radius: 2px;
/deep/ .el-input__inner {
color: #fff;
border: none;
background: none;
}
}
.btn {
height: 32px;
margin-left: 46px;
}
}
.main-title {
margin: 25px 0 32px;
}
.table {
margin-top: 32px;
}
</style>

225
src/views/newDataBoard/hengAnZhi/Problem/tyqybtlx/list.vue

@ -0,0 +1,225 @@
<template>
<div>
<Breadcrumb :list="breadcrumbList"/>
<div class="screen">
<el-form :model="queryParams" inline>
<el-select
v-model.trim="typeCondition"
class="select"
placeholder="请选择"
popper-class="selectPopClass"
size="small"
@change="timeChange"
>
<el-option
v-for="item in typeConditionList"
:key="item.value"
:label="item.label"
:value="item.value"
/>
</el-select>
<el-button class="btn" size="small" type="primary" @click="search">查询</el-button>
</el-form>
</div>
<div class="table">
<el-table
v-loading="loading"
:data="data"
:span-method="objectSpanMethod"
element-loading-background="rgba(0,0,0,0.5)"
element-loading-spinner="el-icon-loading"
element-loading-text="加载中..."
>
<el-table-column label="序号" prop="number" width="70" align="center">
<template slot-scope="{$index}">
{{$index - 0 + 1}}
</template>
</el-table-column>
<el-table-column label="地点" prop="address"/>
<el-table-column label="类型" prop="categoryName"/>
<el-table-column label="投诉次数" prop="amount"/>
<el-table-column align="center" label="详情">
<template slot-scope="data">
<el-button type="text" @click="handleView(data.row)">查看</el-button>
</template>
</el-table-column>
</el-table>
</div>
<Pagination v-show="total > 0" :limit.sync="queryParams.pageSize" :page.sync="queryParams.pageNo" :total="total"
@pagination="getList"/>
</div>
</template>
<script>
import Breadcrumb from "@/views/dataBoard/satisfactionEval/components/Breadcrumb";
import Pagination from "@/views/dataBoard/satisfactionEval/components/Pagination";
import Title from "@/views/dataBoard/satisfactionEval/components/Title";
import {requestPost} from "@/js/dai/request";
export default {
name: "tyryList",
components: {Breadcrumb, Pagination, Title},
data() {
return {
queryParams: {
month: "",
agencyId: "",
pageNo: 1,
pageSize: 10,
type: 3
},
typeCondition: 5,
typeConditionList: [
{
label: "本月",
value: 1,
},
{
label: "上月",
value: 2,
},
{
label: "近三月",
value: 3,
},
{
label: "近半年",
value: 4,
},
{
label: "近一年",
value: 5,
},
],
total: 0,
orgOptions: [],
breadcrumbList: [
{
path: "/dataBoard/satisfactionEval/index",
name: "满意度评价",
},
{
path: "",
name: "同一区域不同类型重复投诉问题列表 ",
},
],
monthOptions: new Array(12).fill(0).map((_, index) => {
return {label: index - 0 + 1 + "月", value: index - 0 + 1};
}),
data: [],
data1: [
"number",
"address",
"categoryName",
"amount"
],
title: "",
loading: false,
};
},
activated() {
/* this.title = this.$route.query.title;
let searchParams = JSON.parse(this.$route.query.searchParams);
this.queryParams = {
...this.queryParams,
...searchParams,
};*/
this.getList();
},
methods: {
objectSpanMethod({row, column, rowIndex, columnIndex}) {
if (columnIndex === 1 || columnIndex === 4) {
if (rowIndex > 0 && row.address === this.data[rowIndex - 1].address) {
return {
rowspan: 0,
colspan: 0,
};
} else {
let rowspan = 1;
for (let i = rowIndex + 1; i < this.data.length; i++) {
if (row.address === this.data[i].address) {
rowspan++;
} else {
break;
}
}
return {
rowspan,
colspan: 1,
};
}
}
},
search() {
this.queryParams.pageNo = 1;
this.getList();
},
getList() {
this.loading = true;
let params = {
...this.queryParams,
...this.timeChange(this.typeCondition)
}
requestPost('/governance/dwdEvent/eventList',params).then(({data}) => {
this.total = data?data.total : 0;
this.list = data?data.list : [];
this.loading = false;
});
},
timeChange(type) {
let queryDateStart = "",
queryDateEnd = "";
if (type == 1) {
queryDateStart = this.$moment().startOf("month").format("YYYY-MM-DD");
}
if (type == 2) {
queryDateStart = this.$moment().subtract(1, "months").startOf("month").format("YYYY-MM-DD");
}
if (type == 3) {
queryDateStart = this.$moment().subtract(2, "months").startOf("month").format("YYYY-MM-DD");
}
if (type == 4) {
queryDateStart = this.$moment().subtract(5, "months").startOf("month").format("YYYY-MM-DD");
}
if (type == 5) {
queryDateStart = this.$moment().subtract(11, "months").startOf("month").format("YYYY-MM-DD");
}
if (type == 2) {
queryDateEnd = this.$moment().subtract(1, "months").endOf("month").format("YYYY-MM-DD");
} else {
queryDateEnd = this.$moment().endOf("month").format("YYYY-MM-DD");
}
return {queryDateStart, queryDateEnd};
},
handleView({address}) {
this.$router.push('/dataBoard/satisfactionEval/Problem/tyqybtlx/detail?type=list&address=' + address)
},
},
};
</script>
<style lang="scss" scoped>
@import "@/assets/scss/dataBoard/table-border.scss";
.screen {
margin: 25px 0 40px;
.el-select,
.el-input {
width: 150px;
margin-right: 4px;
border: 1px solid #126ac5;
border-radius: 2px;
/deep/ .el-input__inner {
color: #fff;
border: none;
background: none;
}
}
.btn {
height: 32px;
margin-left: 46px;
}
}
.main-title {
margin: 25px 0 32px;
}
.table {
margin-top: 32px;
}
</style>

213
src/views/newDataBoard/hengAnZhi/Problem/tyry/detail.vue

@ -0,0 +1,213 @@
<template>
<div>
<Breadcrumb :list="breadcrumbList"/>
<div class="table">
<el-table
v-loading="loading"
:data="list"
element-loading-background="rgba(0,0,0,0.5)"
element-loading-spinner="el-icon-loading"
element-loading-text="加载中..."
>
<el-table-column label="序号" type="index" width="80"/>
<el-table-column label="地点" prop="address"/>
<el-table-column label="工单号" prop="workOrderNum" show-overflow-tooltip/>
<el-table-column label="所属社区" prop="gridName"></el-table-column>
<el-table-column label="事件分类" prop="categoryName" show-overflow-tooltip></el-table-column>
<el-table-column label="投诉内容" prop="eventContent" show-overflow-tooltip min-width="220px"></el-table-column>
<el-table-column label="接收时间" prop="happenTime"></el-table-column>
<el-table-column label="联系人" prop="name"></el-table-column>
<el-table-column label="联系电话" prop="mobile">
<template slot-scope="scope">
<el-button
v-if="scope.row.reportUserId != null && scope.row.reportUserId != ''"
@click="handleLook(scope.row)"
type="text"
size="small"
>
{{ $sensitive(scope.row.mobile, 3, 7) }}
</el-button>
<span v-else>
{{ $sensitive(scope.row.mobile, 3, 7) }}
</span>
</template>
</el-table-column>
<el-table-column label="状态" prop="status">
<template slot-scope="scope">
<span v-if="scope.row.status === 'processing'">处理中</span>
<span v-else-if="scope.row.status === 'closed_case'">已完成</span>
<span v-else>--</span>
</template>
</el-table-column>
<el-table-column align="center" label="详情">
<template slot-scope="data">
<el-button type="text" @click="handleView(data.row)">查看</el-button>
</template>
</el-table-column>
</el-table>
</div>
<EventDetails :id="rowId" :showDialog="showDialog" @close="showDialog = false"/>
<Pagination v-show="total > 0" :limit.sync="queryParams.pageSize" :page.sync="queryParams.pageNo" :total="total"
@pagination="getList"/>
</div>
</template>
<script>
import Breadcrumb from "@/views/dataBoard/satisfactionEval/components/Breadcrumb";
import Pagination from "@/views/dataBoard/satisfactionEval/components/Pagination";
import Title from "@/views/dataBoard/satisfactionEval/components/Title";
import EventDetails from "@/views/dataBoard/overview/components/EventDetail.vue";
import {requestPost} from "@/js/dai/request";
export default {
name: "TddtlxsjDetail",
components: {Breadcrumb, Pagination, Title, EventDetails},
data() {
return {
showDialog: false,
rowId: "",
queryParams: {
pageNo: 1,
pageSize: 10,
},
total: 0,
orgOptions: [],
breadcrumbList: [
{
path: "/dataBoard/satisfactionEval/index",
name: "满意度评价",
},
/* {
path: "/dataBoard/satisfactionEval/Problem/tyry",
name: "同一人员重复投诉问题列表",
},*/
{
path: "",
name: "详情",
},
],
list: [],
title: "",
loading: false,
recId: "",
departId: "",
address: "",
mobile: "",
};
},
activated() {
// this.breadcrumbList[2].name = this.address + ''
let type = this.$route.query.type;
if(type === 'list') {
this.breadcrumbList = [
{
path: "/dataBoard/satisfactionEval/index",
name: "满意度评价",
},
{
path: "/dataBoard/satisfactionEval/Problem/tyry",
name: "同一人员重复投诉问题列表",
},
{
path: "",
name: "详情",
}
]
} else {
this.breadcrumbList = [
{
path: "/dataBoard/satisfactionEval/index",
name: "满意度评价",
},
{
path: "",
name: "详情",
}
]
}
this.recId = this.$route.query.recId;
this.departId = this.$route.query.departId;
this.address = this.$route.query.address;
this.mobile = this.$route.query.mobile;
this.getList();
},
methods: {
search() {
this.queryParams.pageNo = 1;
this.getList();
},
async getList() {
this.loading = true;
let params = {
...this.queryParams,
}
try {
const url = "/governance/dwdEvent/list";
if(this.recId){
params.secondIdList = [this.recId];
}
if(this.departId){
params.departId = this.departId;
}
if(this.address){
params.content = this.address;
}
if(this.mobile){
params.mobile = this.mobile;
}
const { data, code, msg } = await requestPost(url, {
...params,
});
if (code == 0) {
this.total = data.total;
this.list = data.list;
this.loading = false;
}
} catch (err) {
console.log(err);
}
},
handleView({icEventId}) {
this.showDialog = true;
this.rowId = icEventId;
},
//
handleLook(row) {
let { reportUserId } = row
this.$router.push({
path: "/dataBoard/overview/resident",
query: {
user_id: reportUserId,
type:'renfang'
},
});
},
},
};
</script>
<style lang="scss" scoped>
@import "@/assets/scss/dataBoard/table.scss";
.screen {
margin: 25px 0 40px;
.el-select,
.el-input {
width: 150px;
margin-right: 4px;
border: 1px solid #126ac5;
border-radius: 2px;
/deep/ .el-input__inner {
color: #fff;
border: none;
background: none;
}
}
.btn {
height: 32px;
margin-left: 46px;
}
}
.main-title {
margin: 25px 0 32px;
}
.table {
margin-top: 32px;
}
</style>

210
src/views/newDataBoard/hengAnZhi/Problem/tyry/list.vue

@ -0,0 +1,210 @@
<template>
<div>
<Breadcrumb :list="breadcrumbList"/>
<div class="screen">
<el-form :model="queryParams" inline>
<el-select
v-model.trim="typeCondition"
class="select"
placeholder="请选择"
popper-class="selectPopClass"
size="small"
@change="timeChange"
>
<el-option
v-for="item in typeConditionList"
:key="item.value"
:label="item.label"
:value="item.value"
/>
</el-select>
<el-button class="btn" size="small" type="primary" @click="search">查询</el-button>
</el-form>
</div>
<div class="table">
<el-table v-loading="loading" :data="list" element-loading-background="rgba(0,0,0,0.5)"
element-loading-spinner="el-icon-loading" element-loading-text="加载中...">
<el-table-column label="序号" type="index" width="80"/>
<el-table-column label="联系方式" prop="mobile">
<template slot-scope="scope">
<el-button
v-if="scope.row.resiId != null && scope.row.resiId != ''"
@click="handleLook(scope.row)"
type="text"
size="small"
>
{{ $sensitive(scope.row.mobile, 3, 7) }}
</el-button>
<span v-else>
{{ $sensitive(scope.row.mobile, 3, 7) }}
</span>
</template>
</el-table-column>
<el-table-column label="投诉次数" prop="amount"></el-table-column>
<el-table-column align="center" label="详情">
<template slot-scope="data">
<el-button type="text" @click="handleView(data.row)">查看</el-button>
</template>
</el-table-column>
</el-table>
</div>
<Pagination v-show="total > 0" :limit.sync="queryParams.pageSize" :page.sync="queryParams.pageNo" :total="total"
@pagination="getList"/>
</div>
</template>
<script>
import Breadcrumb from "@/views/dataBoard/satisfactionEval/components/Breadcrumb";
import Pagination from "@/views/dataBoard/satisfactionEval/components/Pagination";
import Title from "@/views/dataBoard/satisfactionEval/components/Title";
import {requestPost} from "@/js/dai/request";
export default {
name: "tyryList",
components: {Breadcrumb, Pagination, Title},
data() {
return {
queryParams: {
month: "",
agencyId: "",
pageNo: 1,
pageSize: 10,
type: 2
},
typeCondition: 5,
typeConditionList: [
{
label: "本月",
value: 1,
},
{
label: "上月",
value: 2,
},
{
label: "近三月",
value: 3,
},
{
label: "近半年",
value: 4,
},
{
label: "近一年",
value: 5,
},
],
total: 0,
orgOptions: [],
breadcrumbList: [
{
path: "/dataBoard/satisfactionEval/index",
name: "满意度评价",
},
{
path: "",
name: "同一人员重复投诉问题列表 ",
},
],
monthOptions: new Array(12).fill(0).map((_, index) => {
return {label: index - 0 + 1 + "月", value: index - 0 + 1};
}),
list: [],
title: "",
loading: false,
};
},
activated() {
/* this.title = this.$route.query.title;
let searchParams = JSON.parse(this.$route.query.searchParams);
this.queryParams = {
...this.queryParams,
...searchParams,
};*/
this.getList();
},
methods: {
search() {
this.queryParams.pageNo = 1;
this.getList();
},
getList() {
this.loading = true;
let params = {
...this.queryParams,
...this.timeChange(this.typeCondition)
}
requestPost('/governance/dwdEvent/eventList',params).then(({data}) => {
this.total = data?data.total : 0;
this.list = data?data.list : [];
this.loading = false;
});
},
timeChange(type) {
let queryDateStart = "",
queryDateEnd = "";
if (type == 1) {
queryDateStart = this.$moment().startOf("month").format("YYYY-MM-DD");
}
if (type == 2) {
queryDateStart = this.$moment().subtract(1, "months").startOf("month").format("YYYY-MM-DD");
}
if (type == 3) {
queryDateStart = this.$moment().subtract(2, "months").startOf("month").format("YYYY-MM-DD");
}
if (type == 4) {
queryDateStart = this.$moment().subtract(5, "months").startOf("month").format("YYYY-MM-DD");
}
if (type == 5) {
queryDateStart = this.$moment().subtract(11, "months").startOf("month").format("YYYY-MM-DD");
}
if (type == 2) {
queryDateEnd = this.$moment().subtract(1, "months").endOf("month").format("YYYY-MM-DD");
} else {
queryDateEnd = this.$moment().endOf("month").format("YYYY-MM-DD");
}
return {queryDateStart, queryDateEnd};
},
handleView(row) {
this.$router.push('/dataBoard/satisfactionEval/Problem/tyry/detail?type=list&mobile='+row.mobile)
},
//
handleLook(row) {
let { resiId } = row
this.$router.push({
path: "/dataBoard/overview/resident",
query: {
user_id: resiId,
type:'renfang'
},
});
},
},
};
</script>
<style lang="scss" scoped>
@import "@/assets/scss/dataBoard/table.scss";
.screen {
margin: 25px 0 40px;
.el-select,
.el-input {
width: 150px;
margin-right: 4px;
border: 1px solid #126ac5;
border-radius: 2px;
/deep/ .el-input__inner {
color: #fff;
border: none;
background: none;
}
}
.btn {
height: 32px;
margin-left: 46px;
}
}
.main-title {
margin: 25px 0 32px;
}
.table {
margin-top: 32px;
}
</style>

36
src/views/newDataBoard/hengAnZhi/components/Breadcrumb/index.vue

@ -0,0 +1,36 @@
<template>
<div>
<div class="breadcrumb">
<el-breadcrumb separator="/">
<el-breadcrumb-item v-for="(item,index) in list" :to="item.path" :key="index">{{ item.name }}</el-breadcrumb-item>
</el-breadcrumb>
</div>
</div>
</template>
<script>
export default {
name: "Breadcrumb",
props: {
list: {
type: Array,
default: () => []
}
}
}
</script>
<style scoped lang="scss">
.breadcrumb {
background: url("@/assets/images/manyidu/breadcrumb_bg.png") no-repeat left top;
height: 50px;
color: #fff;
padding-left: 20px;
display: flex;
align-items: center;
/deep/ .el-breadcrumb__inner {
color: #fff!important;
&.is-link {
color: #A3B9DA!important;
}
}
}
</style>

131
src/views/newDataBoard/hengAnZhi/components/EventList/index.vue

@ -0,0 +1,131 @@
<template>
<div>
<el-dialog
class="dissatisfied-detail"
title=""
:visible.sync="dialogVisible"
width="1118px"
:modal="false"
:before-close="handleClose"
>
<div class="main-title">
<Title :text="month + '份12345政务热线事件列表'" />
</div>
<div class="content">
<div class="table">
<el-table :data="list">
<el-table-column label="序号" type="index" width="80" />
<el-table-column prop="monthTime" label="月度" />
<el-table-column prop="agencyName" label="所属社区">
</el-table-column>
<el-table-column prop="categoryName" label="事项类型" />
<el-table-column
prop="eventContent"
width="200"
show-overflow-tooltip
label="事项描述"
/>
<el-table-column prop="receiveTime" width="200" label="接收时间" />
<el-table-column prop="statusName" label="状态" />
<el-table-column label="详情" width="90" align="center">
<template slot-scope="data">
<el-button type="text" @click="handleView(data.row)"
>查看</el-button
>
</template>
</el-table-column>
</el-table>
</div>
<Pagination
v-show="total > 0"
:total="total"
:page.sync="queryParams.pageNo"
:limit.sync="queryParams.pageSize"
@pagination="getList"
/>
</div>
</el-dialog>
<EventDetails :showDialog="showDialog" :id="this.rowId" @close="close" />
</div>
</template>
<script>
import Breadcrumb from "@/views/dataBoard/satisfactionEval/components/Breadcrumb";
import Pagination from "@/views/dataBoard/satisfactionEval/components/Pagination";
import Title from "@/views/dataBoard/satisfactionEval/components/Title";
import EventDetails from "@/views/dataBoard/cpts/event-details.vue";
export default {
name: "EventList",
components: { Breadcrumb, Pagination, Title, EventDetails },
data() {
return {
queryParams: {
pageNo: 1,
pageSize: 5,
},
total: 0,
list: [],
month: "",
dialogVisible: false,
showDialog: false,
rowId: "",
};
},
activated() {},
methods: {
handleClose(done) {
this.dialogVisible = false;
},
open(searchParams) {
this.dialogVisible = true;
this.month = this.$moment(searchParams.monthTime).format("YYYY年M月");
this.queryParams = {
...this.queryParams,
...searchParams,
};
this.getList();
},
getList() {
this.$http
.get(
"/governance/satisfactionOverview/event12345List?" +
this.$paramsFormat(this.queryParams)
)
.then(({ data: { data } }) => {
this.list = data.list;
this.total = data.total;
});
},
handleView({ id }) {
this.showDialog = true;
this.rowId = id;
},
close() {
this.showDialog = false;
},
},
};
</script>
<style scoped lang="scss">
@import "@/assets/scss/dataBoard/table.scss";
@import "@/assets/scss/dataBoard/dialog.scss";
/deep/ .el-dialog__wrapper {
background: rgba(0, 0, 0, 0.85);
z-index: 9999999999 !important;
}
.dissatisfied-detail {
.main-title {
margin-bottom: 20px;
}
}
</style>

138
src/views/newDataBoard/hengAnZhi/components/Pagination/index.vue

@ -0,0 +1,138 @@
<template>
<div :class="{'hidden':hidden}" class="pagination-container">
<el-pagination
:background="background"
:current-page.sync="currentPage"
:page-size.sync="pageSize"
:layout="layout"
:page-sizes="pageSizes"
:pager-count="pagerCount"
:total="total"
v-bind="$attrs"
@size-change="handleSizeChange"
@current-change="handleCurrentChange"
/>
</div>
</template>
<script>
export default {
name: 'Pagination',
props: {
total: {
required: true,
type: Number
},
page: {
type: Number,
default: 1
},
limit: {
type: Number,
default: 20
},
pageSizes: {
type: Array,
default() {
return [10, 20, 30, 50]
}
},
// 5
pagerCount: {
type: Number,
default: document.body.clientWidth < 992 ? 5 : 7
},
layout: {
type: String,
default: 'total, prev, pager, next, jumper, sizes'
},
background: {
type: Boolean,
default: true
},
autoScroll: {
type: Boolean,
default: true
},
hidden: {
type: Boolean,
default: false
}
},
data() {
return {
};
},
computed: {
currentPage: {
get() {
return this.page
},
set(val) {
this.$emit('update:page', val)
}
},
pageSize: {
get() {
return this.limit
},
set(val) {
this.$emit('update:limit', val)
}
}
},
methods: {
handleSizeChange(val) {
if (this.currentPage * val > this.total) {
this.currentPage = 1
}
this.$emit('pagination', { page: this.currentPage, limit: val })
},
handleCurrentChange(val) {
this.$emit('pagination', { page: val, limit: this.pageSize })
}
}
}
</script>
<style scoped lang="scss">
.pagination-container {
padding: 32px 16px;
display: flex;
justify-content: flex-end;
position: relative;
/deep/ .el-pagination__total {
position: absolute;
left: 16px;
top: 32px;
color: #A3B9DA;
}
/deep/ .el-pagination__jump {
color: #A3B9DA;
}
/deep/ .el-pagination.is-background .btn-next,
/deep/ .el-pagination.is-background .btn-prev,
/deep/ .el-pagination.is-background .el-pager li {
background: rgba(0,23,66,0.3);
border: 1px solid #126AC5;
border-radius: 2px;
color: #A3B9DA;
}
/deep/ .el-input__inner {
background: rgba(0,23,66,0.3)!important;
border: 1px solid #126AC5!important;
border-radius: 2px!important;
color: #A3B9DA!important;
height: 28px!important;
}
/deep/ .el-pagination.is-background .el-pager li:not(.disabled).active {
background: #1A95FF!important;
border-radius: 2px!important;
color: #FFFFFF!important;
}
}
.pagination-container.hidden {
display: none;
}
.el-dialog .pagination-container {
padding-bottom: 0!important;
}
</style>

63
src/views/newDataBoard/hengAnZhi/components/Tabs/index.vue

@ -0,0 +1,63 @@
<template>
<div class="tabs">
<div
class="tab"
:class="value2 === item.value ? 'cur' : ''"
v-for="(item, index) in list"
@click="tabClick(index)"
:key="item.value"
>
{{ item.label }}
</div>
</div>
</template>
<script>
export default {
name: "Tabs",
props: {
list: {
type: Array,
default: () => [],
},
value: {
type: [String, Number],
default: "",
},
},
data() {
return {
value2: this.value,
};
},
mounted() {
this.value2 = this.value;
},
methods: {
tabClick(index) {
this.value2 = this.list[index].value;
this.$emit("changeVal", this.value2);
this.$emit("changeLabel", this.list[index].label);
},
},
};
</script>
<style scoped lang="scss">
.tabs {
display: flex;
.tab {
cursor: pointer;
padding: 10px 11px;
font-size: 14px;
font-weight: 400;
color: #96b1ce;
min-width: 120px;
background: url("@/assets/images/manyidu/tab.png") repeat-x top left;
margin-right: 4px;
text-align: center;
&.cur {
color: #ffffff;
background: url("@/assets/images/manyidu/tab_cur.png") repeat-x top left;
}
}
}
</style>

60
src/views/newDataBoard/hengAnZhi/components/Title/index.vue

@ -0,0 +1,60 @@
<template>
<div class="title" :class="noBg ? 'no-bg' : ''">
<span class="text">
<span class="txt">{{ text }}</span>
<span class="text-shadow">{{ text }}</span>
</span>
<slot></slot>
</div>
</template>
<script>
export default {
name: "Title",
props: {
text: {
type: String,
default: "",
},
noBg: {
type: Boolean,
default: false,
},
},
};
</script>
<style scoped lang="scss">
.title {
// width: 100%;
height: 40px;
background: url(@/assets/images/shuju/overview/title-bg.png) no-repeat;
background-size: auto 100%;
padding: 8px 16px 8px 45px;
display: flex;
align-items: center;
justify-content: space-between;
.text {
position: relative;
font-size: 22px;
font-family: HYShuYuanHeiJ;
font-weight: 400;
.txt {
color: #1f79ff;
background: linear-gradient(0deg, #2dc1ff 0%, #ffffff 58.5205078125%);
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
position: relative;
z-index: 2;
}
.text-shadow {
top: 4px;
left: 3px;
position: absolute;
color: #020f21;
white-space: nowrap;
}
}
}
.no-bg {
background: none;
}
</style>

54
src/views/newDataBoard/hengAnZhi/components/Title/titleSmall.vue

@ -0,0 +1,54 @@
<template>
<div :class="noBg ? 'no-bg' : ''" class="title">
<div class="text">
<span class="txt">{{ text }}</span>
<slot name="time"></slot>
</div>
<slot name="info"></slot>
</div>
</template>
<script>
export default {
name: "Title",
props: {
text: {
type: String,
default: "",
},
noBg: {
type: Boolean,
default: false,
},
},
};
</script>
<style lang="scss" scoped>
.title {
// width: 100%;
display: flex;
align-items: center;
justify-content: space-between;
height: 30px;
padding: 7px 0px 5px 34px;
background: url(@/assets/images/shuju/overview/title-small-bg.png) no-repeat;
//background-size: 100% 100%;
.text {
font-family: PingFang SC;
font-size: 18px;
font-weight: 400;
position: relative;
z-index: 2;
color: #fff;
-webkit-background-clip: text;
display: flex;
align-items: center;
.txt {
margin-right: 20px;
}
}
}
.no-bg {
background: none;
}
</style>

369
src/views/newDataBoard/hengAnZhi/dissatisfieReason/detail.vue

@ -0,0 +1,369 @@
<template>
<el-dialog
:before-close="handleClose"
:modal="true"
:modal-append-to-body="false"
:visible.sync="dialogVisible"
class="dissatisfied-detail"
title=""
width="1118px"
>
<div class="content">
<div class="main-title main-title2">
<Title text="社区自查报告详情"/>
</div>
<div class="content2">
<div class="title-sub">
<img :height="18" :width="18" src="@/assets/images/manyidu/tc-title-icon.png"/>
不满意事项列表
</div>
<div class="preface">
<p>尊敬的居民朋友</p>
<p class="indent-2">
为了更好地推进社区工作为您提供更全面优质的社区服务请您根据真实情况填写此表我们将认真对待您提出的问题并承诺对您提供的信息保密感谢您的配合</p>
</div>
<div class="problem-list">
<div class="problem-item">
<div class="problem-title">1您对本社区的文化设施建设情况</div>
<el-radio-group disabled v-model.trim="detail.evaCulturalFacility">
<el-radio label="veryGood">满意</el-radio>
<el-radio label="good">基本满意</el-radio>
<el-radio label="bad">不满意</el-radio>
</el-radio-group>
</div>
<div class="problem-item">
<div class="problem-title">1.1您具体对哪些方面不满意请详细说明原因</div>
<el-radio-group disabled v-model.trim="detail.culturalFacilityAsp">
<el-radio label="culturalFacilityAsp01">社区文化广场</el-radio>
<el-radio label="culturalFacilityAsp02">图书阅览室</el-radio>
<el-radio label="culturalFacilityAsp03">文艺演出</el-radio>
<el-radio label="culturalFacilityAsp04">其他</el-radio>
</el-radio-group>
<div>不满意的原因: {{detail.culturalFacilityReason}}</div>
</div>
<div class="problem-item">
<div class="problem-title">2您对本社区的体育健身设施组织开展的健身活动比赛等体育活动是否满意?</div>
<el-radio-group disabled v-model.trim="detail.evaSportsFacility">
<el-radio label="veryGood">满意</el-radio>
<el-radio label="good">基本满意</el-radio>
<el-radio label="bad">不满意</el-radio>
</el-radio-group>
</div>
<div class="problem-item">
<div class="problem-title">2.1您具体对哪些方面不满意请详细说明原因</div>
<el-radio-group disabled v-model.trim="detail.sportsFacilityAsp">
<el-radio label="sportsFacilityAsp01">社区健身器材</el-radio>
<el-radio label="sportsFacilityAsp02">健身运动</el-radio>
<el-radio label="sportsFacilityAsp03">体育活动</el-radio>
<el-radio label="sportsFacilityAsp03">其他</el-radio>
</el-radio-group>
<div>不满意的原因:{{detail.sportsFacilityReason}}</div>
</div>
<div class="problem-item">
<div class="problem-title">3您对本社区的幼儿园保育教育质量小学/初中数学质量以及师德师风方面是否满意</div>
<el-radio-group disabled v-model.trim=detail.evaBasicEducation>
<el-radio label="veryGood">满意</el-radio>
<el-radio label="good">基本满意</el-radio>
<el-radio label="bad">不满意</el-radio>
</el-radio-group>
<div>不满意的原因{{detail.basicEducationReason}}</div>
</div>
<div class="problem-item">
<div class="problem-title">4您对本社区的医疗机构便利程度医务人员的服务态度是否满意</div>
<el-radio-group disabled v-model.trim="detail.evaMedical">
<el-radio label="veryGood">满意</el-radio>
<el-radio label="good">基本满意</el-radio>
<el-radio label="bad">不满意</el-radio>
</el-radio-group>
</div>
<div class="problem-item">
<div class="problem-title">4.1您具体对哪些方面不满意请详细说明原因</div>
<el-radio-group disabled v-model.trim="detail.medicalAsp">
<el-radio label="medicalAsp01">挂号缴费</el-radio>
<el-radio label="medicalAsp02">检查化验</el-radio>
<el-radio label="medicalAsp03">其他</el-radio>
</el-radio-group>
<div>不满意的原因{{detail.medicalReason}}</div>
</div>
<div class="problem-item">
<div class="problem-title">5您对本社区的养老院建设和服务居家社区养老服务等方面是否满意</div>
<el-radio-group disabled v-model.trim="detail.evaOldPeopleProvide">
<el-radio label="veryGood">满意</el-radio>
<el-radio label="good">基本满意</el-radio>
<el-radio label="bad">不满意</el-radio>
</el-radio-group>
</div>
<div class="problem-item">
<div class="problem-title">5.1您具体对哪些方面不满意请详细说明原因</div>
<el-radio-group disabled v-model.trim="detail.oldPeopleProvideAsp">
<el-radio label="oldPeopleProvideAsp01">社区老年人活动场所</el-radio>
<el-radio label="oldPeopleProvideAsp02">社区为老服务</el-radio>
<el-radio label="oldPeopleProvideAsp03">居家养老服务</el-radio>
<el-radio label="oldPeopleProvideAsp04">其他</el-radio>
</el-radio-group>
<div>不满意的原因{{detail.oldPeopleProvideReason}}</div>
</div>
<div class="problem-item">
<div class="problem-title">6您对本社区的社会救助和服务态度以及困难家庭住房保障工作是否满意</div>
<el-radio-group disabled v-model.trim="detail.evaSocialAssistance">
<el-radio label="veryGood">满意</el-radio>
<el-radio label="good">基本满意</el-radio>
<el-radio label="bad">不满意</el-radio>
</el-radio-group>
</div>
<div class="problem-item">
<div class="problem-title">6.1您具体对哪些方面不满意请详细说明原因</div>
<el-radio-group disabled v-model.trim="detail.socialAssistanceAsp">
<el-radio label="socialAssistanceAsp01">低保特困残疾人保障办理便利程度</el-radio>
<el-radio label="socialAssistanceAsp02">临时救助申请办理便利程度</el-radio>
<el-radio label="socialAssistanceAsp03">其他</el-radio>
</el-radio-group>
<div>不满意的原因{{detail.socialAssistanceReason}}</div>
</div>
<div class="problem-item">
<div class="problem-title">7您对本社区的空气质量居住环境道路情况停车情况是否满意</div>
<el-radio-group disabled v-model.trim="detail.evaEcologicalEnv">
<el-radio label="veryGood">满意</el-radio>
<el-radio label="good">基本满意</el-radio>
<el-radio label="bad">不满意</el-radio>
</el-radio-group>
</div>
<div class="problem-item">
<div class="problem-title">7.1您具体对哪些方面不满意请详细说明原因</div>
<el-radio-group disabled v-model.trim="detail.ecologicalEnvAsp">
<el-radio label="ecologicalEnvAsp01">废气异味工地扬尘</el-radio>
<el-radio label="ecologicalEnvAsp02">楼院卫生</el-radio>
<el-radio label="ecologicalEnvAsp03">乱停车</el-radio>
<el-radio label="ecologicalEnvAsp04">占道经营</el-radio>
<el-radio label="ecologicalEnvAsp05">其他</el-radio>
</el-radio-group>
<div>不满意的原因{{detail.ecologicalEnvReason}}</div>
</div>
<div class="problem-item">
<div class="problem-title">
8您对本社区的公安机关打击违法犯罪活动开展巡逻执勤维护治安秩序等安全防范工作方面是否满意
</div>
<el-radio-group disabled v-model.trim="detail.evaSocialSecurity">
<el-radio label="veryGood">满意</el-radio>
<el-radio label="good">基本满意</el-radio>
<el-radio label="bad">不满意</el-radio>
</el-radio-group>
</div>
<div class="problem-item">
<div class="problem-title">
8您对本社区的公安机关打击违法犯罪活动开展巡逻执勤维护治安秩序等安全防范工作方面是否满意
</div>
<el-radio-group disabled v-model.trim="detail.socialSecurityAsp">
<el-radio label="socialSecurityAsp01">扫黑除恶</el-radio>
<el-radio label="socialSecurityAsp02">打击犯罪</el-radio>
<el-radio label="socialSecurityAsp03">保护人身财产安全</el-radio>
<el-radio label="socialSecurityAsp04">其他</el-radio>
</el-radio-group>
<div>不满意的原因{{ detail.socialSecurityReason }}</div>
</div>
<div class="problem-item">
<div class="problem-title">
<div>9您的姓名</div>
<div class="line">{{reporter.reporterName}}</div>
</div>
</div>
<div class="problem-item">
<div class="problem-title">
<div>10您的手机号</div>
<div class="line">{{reporter.reporterMobile}}</div>
</div>
</div>
<div class="problem-item">
<div class="problem-title">11您是否接受回访</div>
<el-radio-group disabled v-model.trim="reporter.followUpStatus">
<el-radio :label="-1">接受回访</el-radio>
<el-radio :label="1">不接受回访</el-radio>
</el-radio-group>
</div>
<div class="problem-item">
<div class="problem-title">12请选择合适您的回访方式</div>
<el-radio-group disabled v-model.trim="reporter.expectFollowUpWay">
<el-radio label="1">电话回访</el-radio>
<el-radio label="2">工作人员上门回访</el-radio>
</el-radio-group>
</div>
<!-- <div class="problem-item">
<div class="problem-title">请填写您在社区的家庭住址</div>
<div class="select">
<el-select v-model.trim="value" class="select" filterable placeholder="选择所在小区"
popper-class="selectPopClass">
<el-option
v-for="item in options"
:key="item.value"
label="item.label"
:value="item.value">
</el-option>
</el-select>
<el-select v-model.trim="value" class="select" filterable placeholder="楼栋" popper-class="selectPopClass">
<el-option
v-for="item in options"
:key="item.value"
label="item.label"
:value="item.value">
</el-option>
</el-select>
<el-select v-model.trim="value" class="select" filterable placeholder="单元" popper-class="selectPopClass">
<el-option
v-for="item in options"
:key="item.value"
label="item.label"
:value="item.value">
</el-option>
</el-select>
<el-select v-model.trim="value" class="select" filterable placeholder="门牌号" popper-class="selectPopClass">
<el-option
v-for="item in options"
:key="item.value"
label="item.label"
:value="item.value">
</el-option>
</el-select>
</div>
<div class="textarea">
<el-input
:autosize="{ minRows: 5, maxRows: 10}"
placeholder="如以上选择无法找到您的家庭住址,可在这里填写。"
type="textarea"
/>
</div>
</div>-->
</div>
</div>
</div>
</el-dialog>
</template>
<script>
import Title from "@/views/dataBoard/satisfactionEval/components/Title";
export default {
name: "dissatisfieReason",
components: {Title},
data() {
return {
dialogVisible: false,
radio: 3,
value: "",
options: [{
label: '1',
value: 1
}],
detail: {},
reporter: {}
};
},
methods: {
handleClose(done) {
this.dialogVisible = false;
},
open(id) {
this.dialogVisible = true;
this.getDetail(id);
},
getDetail(id) {
this.$http.get(`/governance/satisfaction/communitySelfInsp/inspResult/detail/${id}`).then(({data: {data}}) => {
this.detail = data.satisfaction || {}
this.reporter = data.reporter || {}
})
},
},
};
</script>
<style lang="scss" scoped>
@import "@/assets/scss/dataBoard/dialog.scss";
.content2 {
padding: 42px 40px;
color: #fff;
}
.indent-2 {
text-indent: 2em;
}
.title-sub {
font-size: 18px;
display: flex;
align-items: center;
img {
margin-right: 5px;
}
}
.problem-list {
font-size: 14px;
margin-top: 24px;
.problem-item {
margin-bottom: 25px;
.problem-title {
margin-bottom: 17px;
}
.el-radio-group {
margin-bottom: 10px;
}
}
}
/deep/ .el-radio__label {
color: #fff !important;
}
/deep/ .el-textarea__inner {
color: #fff;
border: 1px solid #0E3978;
border-radius: 2px;
background: rgba(0, 23, 66, 0.72);
}
.el-select {
width: 150px;
margin-right: 4px;
border: 1px solid #126ac5;
border-radius: 2px;
/deep/ .el-input__inner {
color: #fff;
border: none;
background: none;
}
}
.textarea {
width: 610px;
margin-top: 10px;
}
/deep/ .el-radio__input.is-disabled.is-checked .el-radio__inner {
border-color: #0056d6!important;
background: #0056d6!important;
}
</style>

210
src/views/newDataBoard/hengAnZhi/dissatisfieReason/index.vue

@ -0,0 +1,210 @@
<template>
<div>
<Breadcrumb :list="breadcrumbList"/>
<div class="screen">
<el-form :model="queryParams" inline>
<el-date-picker
v-model.trim="queryParams.period"
:append-to-body="false"
placeholder="按月度"
popper-class="date-current-weiyi"
size="small"
type="month"
value-format="yyyy-MM"
/>
<el-select
v-model.trim="queryParams.agencyId"
placeholder="按组织"
popper-class="selectPopClass"
size="small"
>
<el-option
v-for="item in orgOptions"
:key="item.value"
:label="item.label"
:value="item.value"
/>
</el-select>
<el-input v-model.trim="queryParams.name" placeholder="不满意原因" size="small"></el-input>
<el-button class="btn" size="small" type="primary" @click="search">查询</el-button>
</el-form>
</div>
<div class="table">
<el-table v-loading="loading" :data="list" element-loading-background="rgba(0,0,0,0.5)"
element-loading-spinner="el-icon-loading" element-loading-text="加载中...">
<el-table-column label="序号" type="index" width="80"/>
<el-table-column label="填写时间" prop="periodStart" width="130"/>
<el-table-column label="所属组织" prop="agencyName" width="118"/>
<el-table-column label="姓名" prop="reporterName"></el-table-column>
<el-table-column label="联系电话" prop="reporterMobile">
<template slot-scope="scope">
{{ $sensitive(scope.row.reporterMobile, 3, 7) }}
</template>
</el-table-column>
<el-table-column :formatter="(row) => row.evaCulturalFacility === 'veryGood' ? '满意' : '不满意'" label="文化设施" prop="evaCulturalFacility"
width="150"/>
<el-table-column :formatter="(row) => row.evaSportsFacility === 'veryGood' ? '满意' : '不满意'" label="体育设施" prop="evaSportsFacility"
width="150"/>
<el-table-column :formatter="(row) => row.evaEcologicalEnv === 'veryGood' ? '满意' : '不满意'" label="生态环境" prop="evaEcologicalEnv"
width="150"/>
<el-table-column :formatter="(row) => row.evaSocialSecurity === 'veryGood' ? '满意' : '不满意'" label="社会治安" prop="evaSocialSecurity"
width="150"/>
<el-table-column :formatter="(row) => row.evaSocialAssistance === 'veryGood' ? '满意' : '不满意'" label="社会救助" prop="evaSocialAssistance"
width="150"/>
<el-table-column :formatter="(row) => row.evaOldPeopleProvide === 'veryGood' ? '满意' : '不满意'" label="老有所养" prop="evaOldPeopleProvide"
width="150"/>
<el-table-column :formatter="(row) => row.evaBasicEducation === 'veryGood' ? '满意' : '不满意'" label="基础教育" prop="evaBasicEducation"
width="150"/>
<el-table-column :formatter="(row) => row.evaMedical === 'veryGood' ? '满意' : '不满意'" label="病有所医" prop="evaMedical"
width="150"/>
<el-table-column align="center" label="详情" width="90">
<template slot-scope="data">
<el-button type="text" @click="handleView(data.row)">查看</el-button>
</template>
</el-table-column>
</el-table>
</div>
<dissatisfieReasonDetail ref="detail" />
<Pagination v-show="total > 0" :limit.sync="queryParams.pageSize" :page.sync="queryParams.pageNo" :total="total"
@pagination="getList"/>
</div>
</template>
<script>
import Breadcrumb from "@/views/dataBoard/satisfactionEval/components/Breadcrumb";
import Pagination from "@/views/dataBoard/satisfactionEval/components/Pagination";
import dissatisfieReasonDetail from "@/views/dataBoard/satisfactionEval/dissatisfieReason/detail.vue";
import Title from "@/views/dataBoard/satisfactionEval/components/Title";
export default {
name: "dissatisfied",
components: {Breadcrumb, Pagination, Title, dissatisfieReasonDetail},
data() {
return {
queryParams: {
period: "",
agencyId: "",
pageNo: 1,
pageSize: 10,
},
total: 0,
orgOptions: [],
breadcrumbList: [
{
path: "/dataBoard/satisfactionEval/index",
name: "满意度评价",
},
{
path: "",
name: "社区自查不满意原因列表 ",
},
],
monthOptions: new Array(12).fill(0).map((_, index) => {
return {label: index - 0 + 1 + "月", value: index - 0 + 1};
}),
list: [{},{},{}],
title: "",
loading: true,
};
},
activated() {
this.title = this.$route.query.title;
let searchParams = this.$route.query.searchParams?JSON.parse(this.$route.query.searchParams):{};
this.queryParams = {
...this.queryParams,
...searchParams,
};
this.getOrg();
this.getList();
},
methods: {
search() {
this.queryParams.pageNo = 1;
this.getList();
},
getList() {
this.loading = true;
this.$http.get("/governance/satisfaction/communitySelfInsp/inspResult/list?" + this.$paramsFormat(this.queryParams)).then(({data: {data}}) => {
this.total = data.total;
this.list = data.list;
this.loading = false;
});
},
getOrg() {
let params = {
orgId: this.$store.state.chooseArea.chooseName.orgId,
level: this.$store.state.chooseArea.chooseName.level,
};
this.$http.post(`/gov/org/agency/maporg`, params).then(async ({data: {data}}) => {
this.queryParams.agencyId = this.$store.state.chooseArea.chooseName.orgId;
let parent = {value: data.id, label: data.name};
this.orgOptions = [
parent,
...data.children.map((item) => {
return {
value: item.id,
label: item.name,
};
}),
];
this.getList();
});
},
timeChange(type) {
let startTime = "",
endTime = "";
if (type == 1) {
startTime = this.$moment().startOf("month").format("YYYY-MM-DD");
}
if (type == 2) {
startTime = this.$moment().subtract(1, "months").startOf("month").format("YYYY-MM-DD");
}
if (type == 3) {
startTime = this.$moment().subtract(2, "months").startOf("month").format("YYYY-MM-DD");
}
if (type == 4) {
startTime = this.$moment().subtract(5, "months").startOf("month").format("YYYY-MM-DD");
}
if (type == 5) {
startTime = this.$moment().subtract(11, "months").startOf("month").format("YYYY-MM-DD");
}
if (type == 2) {
endTime = this.$moment().subtract(1, "months").endOf("month").format("YYYY-MM-DD");
} else {
endTime = this.$moment().endOf("month").format("YYYY-MM-DD");
}
return [startTime, endTime];
},
handleView({id}) {
this.id = id;
this.$refs.detail.open(id);
},
},
};
</script>
<style lang="scss" scoped>
@import "@/assets/scss/dataBoard/table.scss";
.screen {
margin: 25px 0 40px;
.el-select,
.el-input {
width: 150px;
margin-right: 4px;
border: 1px solid #126ac5;
border-radius: 2px;
/deep/ .el-input__inner {
color: #fff;
border: none;
background: none;
}
}
.btn {
height: 32px;
margin-left: 46px;
}
}
.main-title {
margin: 25px 0 32px;
}
.table {
margin-top: 32px;
}
</style>

234
src/views/newDataBoard/hengAnZhi/dissatisfied/detail.vue

@ -0,0 +1,234 @@
<template>
<el-dialog
:before-close="handleClose"
:modal="true"
:modal-append-to-body="false"
:visible.sync="dialogVisible"
class="dissatisfied-detail"
title=""
width="1118px"
>
<div class="content">
<div class="main-title main-title2">
<Title text="不满意事项详情"/>
</div>
<el-row :gutter="20">
<el-col :span="10">
<div class="sub-title">事项详情</div>
<div class="detail">
<p>
{{ unsatisfiedMattersModel.reason }}
</p>
<ul>
<li>
<span>事项来源</span
>{{
satisfactionSourceOptions[
unsatisfiedMattersModel.satisfactionSource
]
}}
</li>
<li>
<span>事项类型</span
>{{ unsatisfiedMattersModel.satisfactionCategoryName }}
</li>
<li>
<span>所属月份</span
>{{ unsatisfiedMattersModel.satisfactionCategoryName }}
</li>
<li>
<span>所属社区</span
>{{ unsatisfiedMattersModel.organizationName }}
</li>
<li><span>提交人</span>{{ unsatisfiedMattersModel.name }}</li>
<li>
<span>提交人电话</span>{{ unsatisfiedMattersModel.mobile }}
</li>
</ul>
</div>
</el-col>
<el-col :offset="4" :span="10">
<!-- <div class="sub-title">历史不满意事项</div>
<div class="number-list">
<div class="number-item">
<div class="text">12345投诉</div>
<div class="num">
<span class="orange">{{
unsatisfiedHisCount.satisfaction_12345
}}</span>
</div>
</div>
<div class="number-item">
<div class="text">省满意度调查</div>
<div class="num">
<span class="green">{{
unsatisfiedHisCount.satisfaction_province
}}</span>
</div>
</div>
<div class="number-item">
<div class="text">社区满意度自评</div>
<div class="num">
<span class="light">{{
unsatisfiedHisCount.satisfaction_community
}}</span>
</div>
</div>
</div>-->
<div class="sub-title">回访记录</div>
<div class="log">
<div
v-for="(item, index) in followUpRecordDetails"
class="log-item"
>
<div class="name">
{{ item.followUpUser }}{{ item.roleName }}
</div>
<div>{{ item.followUpDate }}</div>
<div>
{{ item.followUpWay }} <i class="el-icon-arrow-right"></i>
</div>
</div>
</div>
</el-col>
</el-row>
</div>
</el-dialog>
</template>
<script>
import Title from "@/views/dataBoard/satisfactionEval/components/Title";
export default {
name: "DissatisfiedDetail",
components: {Title},
data() {
return {
dialogVisible: false,
unsatisfiedMattersModel: "",
unsatisfiedHisCount: "",
followUpRecordDetails: "",
satisfactionSourceOptions: {
satisfaction_12345: "12345投诉",
satisfaction_province: "省满意度调查",
satisfaction_community: "社区满意度自查",
},
};
},
methods: {
handleClose(done) {
this.dialogVisible = false;
},
open(id) {
this.dialogVisible = true;
this.getDetail(id);
},
getDetail(id) {
this.$http
.post(
"/governance/satisfactionDetailList/getUnsatisfiedMattersDetailInfo",
{id:id,
satisfactionSource:'satisfaction_province'
}
)
.then(({data: {data}}) => {
this.unsatisfiedMattersModel = data.unsatisfiedMattersModel || {};
// this.unsatisfiedHisCount = data.unsatisfiedHisCount;
this.followUpRecordDetails = data.followUpRecordDetails || [];
if (this.unsatisfiedMattersModel.satisfactionSource) {
this.unsatisfiedMattersModel.satisfactionSource =
satisfactionSourceOptions.filter(
(item) =>
item.value === this.unsatisfiedMattersModel.satisfactionSource
)[0].label;
}
});
},
},
};
</script>
<style lang="scss" scoped>
@import "@/assets/scss/dataBoard/dialog.scss";
.content {
padding: 0 64px;
}
.main-title {
margin-bottom: 40px;
}
.sub-title {
font-size: 18px;
font-weight: 500;
line-height: 22px;
margin-bottom: 14px;
padding-left: 26px;
color: #ffffff;
background: url("@/assets/images/manyidu/icon_fk.png") no-repeat left center;
}
.detail {
p {
font-size: 14px;
font-weight: 400;
line-height: 32px;
margin: 0 0 10px;
color: #ffffff;
}
ul {
margin: 0;
padding: 0;
list-style-type: none;
}
li {
line-height: 32px;
color: #ffffff;
span {
color: #9cb4d3;
}
}
}
.number-list {
display: flex;
justify-content: space-between;
margin-bottom: 30px;
padding-left: 26px;
.text {
font-size: 14px;
font-weight: 400;
margin-bottom: 17px;
color: #a3b9da;
}
.num {
font-size: 14px;
font-weight: 400;
color: #a3b9da;
span {
font-size: 32px;
font-weight: bold;
font-style: italic;
}
}
}
.orange {
color: #ffb73c;
}
.green {
color: #08ebae;
}
.light {
color: #7fceff;
}
.log {
padding-left: 26px;
.log-item {
display: flex;
justify-content: space-between;
width: 100%;
padding: 9px 0;
color: #fff;
background: url("@/assets/images/manyidu/hf_line.png") bottom center no-repeat;
.name {
flex: 0 0 33.33333%;
}
}
}
</style>

312
src/views/newDataBoard/hengAnZhi/dissatisfied/index.vue

@ -0,0 +1,312 @@
<template>
<div>
<Breadcrumb :list="breadcrumbList" />
<div class="screen">
<el-form :model="queryParams" inline>
<el-date-picker v-if="!hideSearch" size="small" popper-class="date-current-weiyi" :append-to-body="false" v-model.trim="queryParams.month" type="month" value-format="yyyy-MM" placeholder="按月度"> </el-date-picker>
<el-select v-if="!hideSearch" popper-class="selectPopClass" v-model.trim="queryParams.agencyId" size="small" placeholder="按组织">
<el-option v-for="item in orgOptions" :key="item.value" :label="item.label" :value="item.value"> </el-option>
</el-select>
<el-select class="searchSelect" popper-class="selectPopClass" clearable collapse-tags multiple v-model.trim="queryParams.satisfactionSource" size="small" placeholder="按不满意事项来源" @change="getSatisfactionCategoryOptions">
<el-option v-for="item in satisfactionSourceOptions" :key="item.value" :label="item.label" :value="item.value"> </el-option>
</el-select>
<el-select popper-class="selectPopClass" clearable v-model.trim="queryParams.satisfactionCategory" size="small" placeholder="按不满意事项类型">
<el-option v-for="item in satisfactionCategoryOptions" :key="item.value" :label="item.label" :value="item.value"> </el-option>
</el-select>
<el-input v-model.trim="queryParams.name" size="small" placeholder="按人员姓名"></el-input>
<el-input v-model.trim="queryParams.mobile" size="small" placeholder="按人员电话"></el-input>
<el-button size="small" class="btn" type="primary" @click="search">查询</el-button>
</el-form>
</div>
<div class="table">
<el-table :data="list" v-loading="loading" element-loading-text="加载中..." element-loading-spinner="el-icon-loading" element-loading-background="rgba(0,0,0,0.5)">
<el-table-column label="序号" type="index" width="80" />
<el-table-column prop="month" label="月度" width="114" />
<el-table-column prop="organizationName" width="118" label="所属社区" />
<el-table-column prop="satisfactionSource" width="168" label="事项来源">
<template slot-scope="{ row }">
<span
:style="{
color: satisfactionSourceFormat(row.satisfactionSource).color,
}">
{{ satisfactionSourceFormat(row.satisfactionSource).label }}
</span>
</template>
</el-table-column>
<el-table-column prop="satisfactionCategoryName" width="150" label="事项类型" />
<el-table-column prop="reason" show-overflow-tooltip label="事项描述" />
<el-table-column prop="createdTime" width="197" label="提交时间" />
<el-table-column prop="name" width="119" label="姓名" />
<el-table-column prop="mobile" width="153" label="电话" />
<el-table-column prop="completeFlag" width="118px" label="是否完成">
<template slot-scope="{ row }">
<span :class="row.completeFlag === '是' ? 'light' : 'red'">
{{ row.completeFlag }}
</span>
</template>
</el-table-column>
<el-table-column prop="followUpStatus" width="118px" label="是否回访">
<template slot-scope="{ row }">
<span :class="row.followUpStatus === '是' ? 'light' : 'red'">
{{ row.followUpStatus }}
</span>
</template>
</el-table-column>
<el-table-column prop="dangerFlag" width="118px" label="消除风险">
<template slot-scope="{ row }">
<span :class="row.dangerFlag === '是' ? 'light' : 'red'">
{{ row.dangerFlag }}
</span>
</template>
</el-table-column>
<el-table-column label="操作" width="90" align="center">
<template slot-scope="data">
<el-button type="text" @click="handleView(data.row)">查看</el-button>
</template>
</el-table-column>
</el-table>
</div>
<Pagination v-show="total > 0" :total="total" :page.sync="queryParams.pageNo" :limit.sync="queryParams.pageSize" @pagination="getList" />
<DissatisfiedDetail ref="detail" :id="id" />
</div>
</template>
<script>
import Breadcrumb from "@/views/dataBoard/satisfactionEval/components/Breadcrumb";
import Pagination from "@/views/dataBoard/satisfactionEval/components/Pagination";
import DissatisfiedDetail from "./detail.vue";
export default {
name: "dissatisfiedPage",
components: { Breadcrumb, DissatisfiedDetail, Pagination },
data() {
return {
hideSearch: false,
queryParams: {
month: "",
agencyId: "",
satisfactionSource: [],
satisfactionCategory: "",
name: "",
mobile: "",
pageNo: 1,
pageSize: 10,
},
id: {},
total: 0,
timeRange: [],
breadcrumbList: [
{
path: "/dataBoard/satisfactionEval/index",
name: "满意度评价",
},
{
path: "",
name: "不满意事项列表",
},
],
orgOptions: [],
satisfactionCategoryOptions: [],
list: [],
satisfactionSourceOptions: [
{
value: "satisfaction_12345",
label: "12345投诉",
color: "#FFB73C",
},
{
value: "satisfaction_province",
label: "省满意度调查",
color: "#64C1FF",
},
{
value: "satisfaction_community",
label: "社区满意度自查",
color: "#08EBAE",
},
],
loading: true,
};
},
mounted() {
this.getOldPageParamsData();
this.getOrg();
},
methods: {
getOldPageParamsData() {
const { id, timeType } = this.$route.params;
let satisSourceArr = [];
if (id == 1) {
satisSourceArr = ["satisfaction_province", "satisfaction_community"];
} else if (id == 2) {
satisSourceArr = ["satisfaction_12345"];
}
this.queryParams.satisfactionSource = satisSourceArr;
if (this.queryParams.satisfactionSource.length > 0) {
this.getSatisfactionCategoryOptions();
}
if (timeType != 0) {
this.hideSearch = true;
this.timeRange = this.timeChange(timeType);
this.queryParams.startTime = this.timeRange[0];
this.queryParams.endTime = this.timeRange[1];
this.queryParams.month = "";
} else {
this.hideSearch = false;
}
},
getSatisfactionCategoryOptions() {
this.queryParams.satisfactionCategory = "";
if (!this.queryParams.satisfactionSource) {
this.satisfactionCategoryOptions = [];
return;
}
const satisfactionSource = this.queryParams.satisfactionSource.toString();
this.$http.get("/governance/satisfactionDetailList/getUnsatisfiedCategory?satisfactionSource=" + satisfactionSource).then(({ data: { data } }) => {
this.satisfactionCategoryOptions = data.map((item) => {
return {
label: item.categoryName,
value: item.categoryCode,
};
});
this.queryParams.satisfactionCategory = this.$route.params.type == 0 ? "" : this.$route.params.type;
});
},
satisfactionSourceFormat(val) {
let satisfactionSource = this.satisfactionSourceOptions.filter((item) => item.value === val)[0];
return satisfactionSource ? satisfactionSource : "";
},
search() {
this.queryParams.pageNo = 1;
this.getList();
},
getList() {
this.loading = true;
this.$http.get("/governance/satisfactionDetailList/getUnsatisfiedMattersList?" + this.$paramsFormat(this.queryParams)).then(({ data: { data } }) => {
this.total = data.total;
this.list = data.list;
this.loading = false;
});
},
getOrg() {
let params = {
orgId: this.$store.state.chooseArea.chooseName.orgId,
level: this.$store.state.chooseArea.chooseName.level,
};
this.$http.post(`/gov/org/agency/maporg`, params).then(async ({ data: { data } }) => {
this.queryParams.agencyId = this.$store.state.chooseArea.chooseName.orgId;
let parent = { value: data.id, label: data.name };
this.orgOptions = [
parent,
...data.children.map((item) => {
return {
value: item.id,
label: item.name,
};
}),
];
this.getList();
});
},
timeChange(type) {
let startTime = "",
endTime = "";
if (type == 1) {
startTime = this.$moment().startOf("month").format("YYYY-MM-DD");
}
if (type == 2) {
startTime = this.$moment().subtract(1, "months").startOf("month").format("YYYY-MM-DD");
}
if (type == 3) {
startTime = this.$moment().subtract(2, "months").startOf("month").format("YYYY-MM-DD");
}
if (type == 4) {
startTime = this.$moment().subtract(5, "months").startOf("month").format("YYYY-MM-DD");
}
if (type == 5) {
startTime = this.$moment().subtract(11, "months").startOf("month").format("YYYY-MM-DD");
}
if (type == 2) {
endTime = this.$moment().subtract(1, "months").endOf("month").format("YYYY-MM-DD");
} else {
endTime = this.$moment().endOf("month").format("YYYY-MM-DD");
}
return [startTime, endTime];
},
handleView(id) {
this.id = id;
this.$refs.detail.open(id);
},
},
};
</script>
<style scoped lang="scss">
@import "@/assets/scss/dataBoard/table.scss";
.screen {
margin: 25px 0 40px;
.el-select,
.el-input {
width: 150px;
margin-right: 4px;
border: 1px solid #126ac5;
border-radius: 2px;
/deep/ .el-input__inner {
background: none;
border: none;
color: #fff;
}
}
.searchSelect {
width: 200px;
/deep/ .el-select__tags {
width: 200px !important;
max-width: 200px !important;
}
}
.btn {
margin-left: 46px;
height: 32px;
}
}
.orange {
color: #ffb73c;
}
.blue {
color: #64c1ff;
}
.green {
color: #08ebae;
}
.light {
color: #3cf5ff;
}
.red {
color: #f95619;
}
::v-deep .date-current-weiyi {
background: rgba(3, 19, 51, 0.9);
border-color: #006cff;
box-shadow: inset 0px 0px 16px 0px rgba(0, 145, 255, 1);
.el-date-picker__header-label {
color: #ffffff;
}
.el-picker-panel__icon-btn {
color: #ffffff;
}
.el-month-table {
td {
.cell {
color: #ffffff;
}
}
}
.el-month-table td.current:not(.disabled) .cell {
color: #fff;
background-color: #409eff;
}
.el-month-table td.today:not(.disabled) .cell {
color: #0056d6;
}
.el-date-picker__header--bordered {
border-bottom: solid 1px #006cff;
}
}
</style>

51
src/views/newDataBoard/hengAnZhi/dissatisfiedPersonnel/detail.vue

@ -0,0 +1,51 @@
<template>
<div>
<div class="breadcrumb">
<Breadcrumb :list="breadcrumbList"/>
</div>
<Personnel/>
</div>
</template>
<script>
import Breadcrumb from '@/views/dataBoard/satisfactionEval/components/Breadcrumb'
import Personnel from '@/views/dataBoard/cpts/personnel'
export default {
name: "dissatisfiedPersonnelDetail",
components: {
Breadcrumb,
Personnel
},
data() {
return {
breadcrumbList: [{
path: '/dataBoard/satisfactionEval/index',
name: '满意度评价'
}, {
path: '/dataBoard/satisfactionEval/dissatisfiedPersonnel',
name: '画像匹配同类潜在不满意人员 '
}, {
path: '',
name: ''
}],
}
},
mounted() {
this.$set(this.breadcrumbList[2], 'name', this.$route.query.name)
this.breadcrumbList[2].name = this.$route.query.name
}
}
</script>
<style scoped lang="scss">
.sub-title {
background: url("@/assets/images/manyidu/icon_fk.png") no-repeat left center;
font-size: 18px;
font-weight: 500;
color: #FFFFFF;
line-height: 22px;
padding-left: 26px;
margin-bottom: 20px;
}
.breadcrumb {
margin-bottom: 25px;
}
</style>

140
src/views/newDataBoard/hengAnZhi/dissatisfiedPersonnel/index.vue

@ -0,0 +1,140 @@
<template>
<div>
<Breadcrumb :list="breadcrumbList" />
<!-- <div class="main-title">
<Title :text="`“${title}”画像匹配同类潜在不满意人员 `" noBg/>
</div>-->
<div class="table">
<el-table :data="list" v-loading="loading" element-loading-text="加载中..." element-loading-spinner="el-icon-loading" element-loading-background="rgba(0,0,0,0.5)">
<el-table-column label="序号" type="index" width="80" />
<el-table-column prop="gridName" width="118" label="所属组织" />
<el-table-column prop="restName" label="姓名"></el-table-column>
<el-table-column prop="mobile" label="电话">
<template slot-scope="scope">
{{ $sensitive(scope.row.mobile, 3, 7) }}
</template>
</el-table-column>
<el-table-column prop="categoryNames" label="人员性质" />
<el-table-column prop="gender" label="性别">
<template slot-scope="{ row }">
{{ row.gender === "1" ? "男" : row.gender === "2" ? "女" : row.gender === "0" ? "未知" : "" }}
</template>
</el-table-column>
<el-table-column prop="age" label="年龄" />
<el-table-column prop="cultureName" label="学历" />
<el-table-column prop="marriageName" label="婚姻" />
<el-table-column prop="monthIncomeLevel" label="月收入" />
<el-table-column label="详情" width="90" align="center">
<template slot-scope="data">
<el-button type="text" @click="handleView(data.row)">查看</el-button>
</template>
</el-table-column>
</el-table>
</div>
<Pagination v-show="total > 0" :total="total" :page.sync="queryParams.pageNo" :limit.sync="queryParams.pageSize" @pagination="getList" />
</div>
</template>
<script>
import Breadcrumb from "@/views/dataBoard/satisfactionEval/components/Breadcrumb";
import Pagination from "@/views/dataBoard/satisfactionEval/components/Pagination";
import Title from "@/views/dataBoard/satisfactionEval/components/Title";
export default {
name: "dissatisfied",
components: { Breadcrumb, Pagination, Title },
data() {
return {
queryParams: {
pageNo: 1,
pageSize: 10,
},
total: 0,
breadcrumbList: [
{
path: "/dataBoard/satisfactionEval/index",
name: "满意度评价",
},
{
path: "",
name: "画像匹配同类潜在不满意人员 ",
},
],
monthOptions: new Array(12).fill(0).map((_, index) => {
return { label: index - 0 + 1 + "月", value: index - 0 + 1 };
}),
list: [],
title: "",
loading: true,
};
},
activated() {
this.title = this.$route.query.title;
let searchParams = JSON.parse(this.$route.query.searchParams);
this.queryParams = {
...this.queryParams,
...searchParams,
};
this.getList();
},
methods: {
getList() {
this.loading = true;
this.$http.get("/governance/satisfactionOverview/satisfactionCrowdList?" + this.$paramsFormat(this.queryParams)).then(({ data: { data } }) => {
this.list = data.list;
this.total = data.total;
this.loading = false;
});
},
handleView({ restName, restId }) {
this.$router.push("/dataBoard/satisfactionEval/dissatisfiedPersonnel/detail?name=" + restName + "&user_id=" + restId);
},
},
};
</script>
<style scoped lang="scss">
@import "@/assets/scss/dataBoard/table.scss";
.screen {
margin: 25px 0 40px;
.el-select,
.el-input {
width: 150px;
margin-right: 4px;
border: 1px solid #126ac5;
border-radius: 2px;
/deep/ .el-input__inner {
background: none;
border: none;
color: #fff;
}
}
.btn {
margin-left: 46px;
height: 32px;
}
}
.main-title {
margin: 25px 0 32px;
}
.table {
margin-top: 32px;
}
</style>

159
src/views/newDataBoard/hengAnZhi/index.vue

@ -1,15 +1,158 @@
<template>
<div>
我是恒安治
<div class="satisfaction-eval">
<el-row :gutter="15">
<el-col :span="8" class="">
<div class="bgImg">
<Title text="12345数据分析" />
<EventAnalysis />
</div>
</el-col>
<el-col :span="8">
<div class="bgImg">
<Title text="12345投诉事件数" />
<ComplaintIncident />
</div>
<div class="bgImg">
<Title text="各新村12345投诉人数">
<el-date-picker size="small" popper-class="date-current-weiyi" :append-to-body="false"
v-model.trim="scoreMonth" type="month" value-format="yyyy-MM-dd" value="yyyy-MM" placeholder="按月度"
style="width: 118px" :picker-options="pickerOptions" />
</Title>
<ComplaintPeople :date="scoreMonth" />
</div>
</el-col>
<el-col :span="8">
<div class="bgImg">
<Title text="12345热线类型分析"/>
<TypesOfDissatisfaction/>
</div>
<div class="bgImg">
<Title text="12345人员画像分析" />
<PersonnelPortrait />
</div>
<div class="bgImg">
<Title text="潜在不满意人数" />
<PotentialPeople :date="typeDate" />
</div>
</el-col>
</el-row>
</div>
</template>
<script>
export default {
}
import Title from "@/views/newDataBoard/hengAnZhi/components/Title/index.vue";
import ComplaintIncident from "@/views/newDataBoard/hengAnZhi/modules/ComplaintIncident";
import PersonnelPortrait from "@/views/newDataBoard/hengAnZhi/modules/PersonnelPortrait";
import PotentialPeople from "@/views/newDataBoard/hengAnZhi/modules/PotentialPeople";
import EventAnalysis from "@/views/newDataBoard/hengAnZhi/modules/EventAnalysis";
import ComplaintPeople from "@/views/newDataBoard/hengAnZhi/modules/ComplaintPeople";
import TypesOfDissatisfaction from "@/views/newDataBoard/hengAnZhi/modules/TypesOfDissatisfaction";
export default {
name: "satisfactionEvaluation",
components: {
Title,
ComplaintIncident,
ComplaintPeople,
TypesOfDissatisfaction,
PersonnelPortrait,
PotentialPeople,
EventAnalysis,
},
data() {
return {
typeDate: {},
index: 0,
type: 0,
time: 0,
scoreMonth: this.$moment().add(-1, 'month').startOf("month").format("YYYY-MM-DD"),
pickerOptions: {
disabledDate: (time) => {
let month = this.$moment().add(-1, 'month').startOf("month").format("YYYY-MM-DD")
// return time.getTime() > Date.now()
return time.getTime() > new Date(month).getTime();
}
}
}
},
methods: {
goToPage(url) {
this.$router.push(url);
},
timeChange(date) {
this.typeDate = date;
},
},
};
</script>
<style lang="scss" scoped src="@/assets/scss/dataBoard/overview/index.scss" />
<style lang="scss" scoped>
/deep/ .el-input__inner {
//width: 90px !important;
height: 24px !important;
color: #a0cdff;
border: 1px solid #125aaa !important;
border-radius: 12px !important;
background: #021c49 !important;
}
/deep/ .el-input__icon {
line-height: 24px !important;
color: #a0cdff;
}
.more {
font-size: 14px;
font-weight: 400;
cursor: pointer;
color: #a0cdff;
}
.bgImg {
margin-top: 5px;
background: url('@/assets/images/shuju/overview/box-bg.png') no-repeat;
background-size: 100% 100%;
}
::v-deep .date-current-weiyi {
border-color: #006cff;
background: rgba(3, 19, 51, 0.9);
box-shadow: inset 0px 0px 16px 0px rgba(0, 145, 255, 1);
.el-date-picker__header-label {
color: #ffffff;
}
.el-picker-panel__icon-btn {
color: #ffffff;
}
.el-month-table {
td {
.cell {
color: #ffffff;
}
}
}
.el-month-table td.current:not(.disabled) .cell {
color: #fff;
background-color: #409eff;
}
.el-month-table td.today:not(.disabled) .cell {
color: #0056d6;
}
.el-date-picker__header--bordered {
border-bottom: solid 1px #006cff;
}
.el-month-table td.disabled .cell {
opacity: .5;
background: none;
}
}
</style>
/deep/ .title {
//padding-left: 58px;
}
</style>

149
src/views/newDataBoard/hengAnZhi/modules/ComplaintIncident/index.vue

@ -0,0 +1,149 @@
<template>
<div class="self-trend" v-loading="loading" element-loading-text="加载中..." element-loading-spinner="el-icon-loading"
element-loading-background="rgba(0,0,0,0.5)">
<div style="height: 250px;">
<EChart :options="complaintOption" />
</div>
</div>
</template>
<script>
import EChart from '@/components/EChart';
import { requestGet } from "@/js/dai/request";
export default {
name: "ComplaintIncident",
components: { EChart },
data() {
return {
trendType: 1,
loading: false,
complaintOption: {},
}
},
watch: {
"$store.state.chooseArea.chooseName"(val) {
if (val.orgId) {
this.getData();
}
}
},
mounted() {
if (this.$store.state.chooseArea.chooseName.orgId) {
this.getData();
}
},
methods: {
trendTypeChange(val) {
if (val !== this.trendType) {
this.trendType = val
this.getData()
}
},
async getData() {
// this.loading = true
let params = {
level: this.$store.state.chooseArea.chooseName.level,
orgId: this.$store.state.chooseArea.chooseName.orgId,
}
let url = '/governance/satisfactionOverview/notSatisfactionTrend'
const { data, code, msg } = await requestGet(url, params);
console.log('data======', data)
this.initCharts();
},
initCharts() {
this.complaintOption = {
backgroundColor: "transparent",
tooltip: {
show: false,
trigger: "axis"
},
legend: {
top: 10,
textStyle: {
color: "#fff"
},
data: ["12345投诉事件数"]
},
grid: {
left: 50,
right: 20,
top: 40,
bottom: 50,
},
xAxis: {
type: "category",
boundaryGap: true,
axisLine: {
lineStyle: {
color: "#2c5a8d"
}
},
axisLabel: {
color: "#9ecbff",
rotate: 30
},
data: [
"2025-02", "2025-03", "2025-04", "2025-05",
"2025-06", "2025-07", "2025-08", "2025-09",
"2025-10", "2025-11", "2025-12", "2026-01"
]
},
yAxis: {
type: "value",
name: "单位:人",
nameTextStyle: {
color: "#9ecbff"
},
axisLabel: {
color: "#9ecbff"
},
splitLine: {
show: true,
lineStyle: {
type: "dashed",
color: "#1f4c7a"
}
}
},
series: [
{
type: "bar",
data: new Array(12).fill(100),
barWidth: "60%",
silent: true,
itemStyle: {
color: "rgba(40,120,255,0.08)"
},
z: 1
},
{
name: "12345投诉事件数",
type: "line",
data: [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
smooth: true,
symbol: "circle",
symbolSize: 8,
lineStyle: {
width: 2,
color: "#35f3ff"
},
itemStyle: {
color: "#35f3ff",
borderColor: "#35f3ff"
},
z: 2
}
]
}
},
}
}
</script>
<style scoped lang="scss">
.self-trend {
padding: 16px 16px;
}
</style>

87
src/views/newDataBoard/hengAnZhi/modules/ComplaintPeople/index.vue

@ -0,0 +1,87 @@
<template>
<div class="table" v-loading="loading" element-loading-text="加载中..." element-loading-spinner="el-icon-loading"
element-loading-background="rgba(0,0,0,0.5)">
<el-table v-if="dataList.length" :data="dataList" height="578px" style="width: 90%; margin: auto;">
<el-table-column label="新村名称" prop="name" align="center"></el-table-column>
<el-table-column label="不满意人数" prop="num" align="center"></el-table-column>
<el-table-column label="投诉次数" prop="count" align="center"></el-table-column>
</el-table>
<NoData v-else size="80"></NoData>
</div>
</template>
<script>
import { requestGet } from "@/js/dai/request";
import NoData from "@/views/newDataBoard/cpts/NoData";
export default {
name: "ComplaintPeople",
components: {
NoData
},
data() {
return {
loading: false,
dataList: []
}
},
props: {
date: {
type: String,
default: '',
},
},
watch: {
"$store.state.chooseArea.chooseName"(val) {
if (val.orgId) {
this.getList();
}
},
date() {
this.getList();
},
},
mounted() {
if (this.$store.state.chooseArea.chooseName.orgId) {
this.getList()
}
},
methods: {
async getList() {
this.loading = true;
let url = '/governance/satisfaction/communitySelfInsp/satisfactionScore';
let params = {
time: this.date,
agencyId: this.$store.state.chooseArea.chooseName.orgId
}
const { data, code, msg } = await requestGet(url, params)
console.log('data======', data);
this.dataList = data;
// this.dataList = [
// {name: 'xxx', num: 10, count: 20},
// {name: 'xxx', num: 10, count: 20},
// {name: 'xxx', num: 10, count: 20},
// {name: 'xxx', num: 10, count: 20},
// {name: 'xxx', num: 10, count: 20},
// {name: 'xxx', num: 10, count: 20},
// {name: 'xxx', num: 10, count: 20},
// {name: 'xxx', num: 10, count: 20},
// {name: 'xxx', num: 10, count: 20},
// {name: 'xxx', num: 10, count: 20},
// {name: 'xxx', num: 10, count: 20},
// ]
this.loading = false;
}
}
}
</script>
<style lang="scss" scoped>
@import "@/assets/scss/dataBoard/table-border.scss";
.table {
padding: 10px;
}
::v-deep .no-data {
height: 578px;
}
</style>

368
src/views/newDataBoard/hengAnZhi/modules/EventAnalysis/index.vue

@ -0,0 +1,368 @@
<template>
<div style="padding: 20px 10px;">
<title-small text="同地点同类型事件重复投诉问题">
<template v-slot:time>
<el-select v-model.trim="typeCondition1" class="select" placeholder="请选择" popper-class="selectPopClass"
@change="value => timeChange(value, 1)">
<el-option v-for="item in typeConditionList" :key="item.value" :label="item.label"
:value="item.value"></el-option>
</el-select>
</template>
<template v-slot:info>
<span class="infoColor" @click="$router.push('/dataBoard/satisfactionEval/Problem/tddtlxsj')">
更多<i class="el-icon-arrow-right"></i>
</span>
</template>
</title-small>
<div class="t-list f-hflex">
<div class="item f-flex header">
<div>序号</div>
<div>地点</div>
<div>类型</div>
<div>投诉次数</div>
</div>
<div v-if="list.length > 0" class="list-con">
<div v-if="list.length > 0" v-for="(item, index) in list" :key="index" :class="['item', 'f-flex']"
@click="goTddlxDetail(item)">
<div>{{ index - 0 + 1 }}</div>
<div>{{ item.address }}</div>
<div>{{ item.categoryName }}</div>
<div>{{ item.amount }}</div>
</div>
</div>
<NoData v-else size="80" />
</div>
<title-small text="同一人员重复投诉问题">
<template v-slot:time>
<el-select v-model.trim="typeCondition2" class="select" placeholder="请选择" popper-class="selectPopClass"
@change="value => timeChange(value, 2)">
<el-option v-for="item in typeConditionList" :key="item.value" :label="item.label"
:value="item.value"></el-option>
</el-select>
</template>
<template v-slot:info>
<span class="infoColor" @click="$router.push('/dataBoard/satisfactionEval/Problem/tyry')">
更多<i class="el-icon-arrow-right"></i>
</span>
</template>
</title-small>
<div class="t-list f-hflex">
<div class="item f-flex header">
<div>序号</div>
<div>联系方式</div>
<div>投诉次数</div>
</div>
<div v-if="list2.length > 0" class="list-con">
<div v-for="(item, index) in list2" :key="index" class="item f-flex bto-border" v-if="list2.length > 0">
<div>{{ index - 0 + 1 }}</div>
<div>
<template>
<el-button v-if="item.resiId !== null && item.resiId !== ''" @click="handleLook(item.resiId)" type="text"
size="small">
{{ item.mobile }}
</el-button>
<span v-else>
{{ item.mobile }}
</span>
</template>
</div>
<div @click="goTryDetail(item)">{{ item.amount }}</div>
</div>
</div>
<NoData v-else size="80" />
</div>
<title-small text="同一区域不同类型投诉问题">
<template v-slot:time>
<el-select v-model.trim="typeCondition3" class="select" placeholder="请选择" popper-class="selectPopClass"
@change="value => timeChange(value, 3)">
<el-option v-for="item in typeConditionList" :key="item.value" :label="item.label"
:value="item.value"></el-option>
</el-select>
</template>
<template v-slot:info>
<span class="infoColor" @click="$router.push('/dataBoard/satisfactionEval/Problem/tyqybtlx')">
更多<i class="el-icon-arrow-right"></i>
</span>
</template>
</title-small>
<div class="table">
<el-table :data="data" :span-method="objectSpanMethod" height="300" @row-click="rowClick">
<el-table-column align="center" label="序号" prop="number" width="80">
<template slot-scope="{$index}">
{{ $index - 0 + 1 }}
</template>
</el-table-column>
<el-table-column label="地点" prop="address"></el-table-column>
<el-table-column label="类型" prop="categoryName"></el-table-column>
<el-table-column label="投诉次数" prop="amount" width="120"></el-table-column>
<template #empty>
<NoData size="80" />
</template>
</el-table>
</div>
</div>
</template>
<script>
import titleSmall from "@/views/dataBoard/satisfactionEval/components/Title/titleSmall.vue";
import NoData from "@/views/newDataBoard/cpts/NoData";
export default {
components: {
titleSmall,
NoData
},
data() {
return {
typeCondition1: 5,
typeCondition2: 5,
typeCondition3: 5,
startTime: '',
endTime: '',
list: [],
typeConditionList: [
{
label: "本月",
value: 1,
},
{
label: "上月",
value: 2,
},
{
label: "近三月",
value: 3,
},
{
label: "近半年",
value: 4,
},
{
label: "近一年",
value: 5,
},
],
list2: [],
data: [],
data1: [
"number",
"address",
"categoryName",
"amount"
],
spanArr: [],
};
},
created() {
},
watch: {
"$store.state.chooseArea.chooseName"(val) {
if (val.orgId) {
this.timeChange(5, '')
}
},
},
mounted() {
if (this.$store.state.chooseArea.chooseName.orgId) {
this.timeChange(5, '')
}
},
computed: {},
methods: {
objectSpanMethod({ row, column, rowIndex, columnIndex }) {
if (columnIndex === 1) {
if (rowIndex > 0 && row.address === this.data[rowIndex - 1].address) {
return {
rowspan: 0,
colspan: 0,
};
} else {
let rowspan = 1;
for (let i = rowIndex + 1; i < this.data.length; i++) {
if (row.address === this.data[i].address) {
rowspan++;
} else {
break;
}
}
return {
rowspan,
colspan: 1,
};
}
}
},
timeChange(typeCondition, type) {
let startTime = "",
endTime = "";
if (typeCondition === 1) {
startTime = this.$moment().startOf("month").format("YYYY-MM-DD");
}
if (typeCondition === 2) {
startTime = this.$moment().subtract(1, "months").startOf("month").format("YYYY-MM-DD");
}
if (typeCondition === 3) {
startTime = this.$moment().subtract(2, "months").startOf("month").format("YYYY-MM-DD");
}
if (typeCondition === 4) {
startTime = this.$moment().subtract(5, "months").startOf("month").format("YYYY-MM-DD");
}
if (typeCondition === 5) {
startTime = this.$moment().subtract(11, "months").startOf("month").format("YYYY-MM-DD");
}
if (typeCondition === 2) {
endTime = this.$moment().subtract(1, "months").endOf("month").format("YYYY-MM-DD");
} else {
endTime = this.$moment().endOf("month").format("YYYY-MM-DD");
}
this.startTime = startTime;
this.endTime = endTime;
// this.getData();
this.getList(type)
},
getList(type) {
this.$http.post('/governance/dwdEvent/report', {
"queryDateStart": this.startTime,
"queryDateEnd": this.endTime
}).then(({ data: { data } }) => {
if (type === '' || type === 1) {
this.list = data ? data.addressEvent : [] || []
}
if (type === '' || type === 2) {
this.list2 = data ? data.mobileEvent : [] || []
}
if (type === '' || type === 3) {
this.data = data ? data.addressMobileEvents : [] || []
}
})
},
rowClick({ address }) {
this.$router.push('/dataBoard/satisfactionEval/Problem/tyqybtlx/detail?address=' + address)
},
goTddlxDetail(row) {
let params = {
recId: row.categoryId,
address: row.address
}
this.$router.push('/dataBoard/satisfactionEval/Problem/tddtlxsj/detail?' + this.$paramsFormat(params))
},
goTryDetail(row) {
this.$router.push('/dataBoard/satisfactionEval/Problem/tyry/detail?mobile=' + row.mobile)
},
//
handleLook(resiId) {
this.$router.push({
path: "/dataBoard/overview/resident",
query: {
user_id: resiId,
type: 'renfang'
},
});
},
},
}
</script>
<style lang='scss' scoped>
@import "@/assets/scss/dataBoard/table-border.scss";
.infoColor {
color: #A3B9DA;
cursor: pointer;
}
.h150 {
height: 150px;
}
.h200 {
height: 200px;
}
.f-hflex {
width: 83px;
}
.f-flex {
margin-top: 4px;
}
.f-darkGray {
margin-top: 15px;
}
.t-list {
position: relative;
flex: 1;
width: 100%;
margin-bottom: 20px;
margin-top: 15px;
.item {
display: flex;
align-items: center;
justify-content: space-around;
height: 40px;
cursor: pointer;
color: #fff;
background: #0a2a5c;
div {
overflow: hidden;
flex: 1;
white-space: nowrap;
text-overflow: ellipsis;
&:last-child {
flex: 0 0 80px;
}
&:first-child {
flex: 0 0 50px;
}
}
&:hover {
color: #02fcff;
box-shadow: 0 0 10px #38b2ff, 0 0 5px #38b2ff;
}
}
}
.bto-border {
height: 1px;
color: #FFFFFF !important;
border-bottom: 1px solid;
border-image: linear-gradient(to right, #1c3e69 0%, #4eafd5 50%, #1c3e69 100%);
border-image-slice: 1;
background: none !important;
&:hover {
box-sizing: unset !important;
}
}
.header {
color: #A3B9DA !important;
background: none !important;
&:hover {
box-sizing: unset !important;
}
}
.list-con {
overflow-x: hidden;
overflow-y: auto;
height: 100px;
}
.no-data {
height: 167px;
}
.select {
width: 100px;
}
.table {
margin-top: 10px;
}
</style>

479
src/views/newDataBoard/hengAnZhi/modules/PersonnelPortrait/index.vue

@ -0,0 +1,479 @@
<template>
<div class="personnel-portrait" v-loading="loading" element-loading-text="加载中..." element-loading-spinner="el-icon-loading" element-loading-background="rgba(0,0,0,0.5)">
<div class="screen">
<div class="txt">已有不满意人群画像</div>
<!-- <el-select v-if="resultType == 'provinceAndSelf'" v-model.trim="typeCondition" @change="getData" placeholder="请选择" class="select" popper-class="selectPopClass">
<el-option v-for="item in typeConditionList" :key="item.value" :label="item.label" :value="item.value"> </el-option>
</el-select> -->
</div>
<div class="portrait">
<div class="tag yellow" v-if="gridName">
<div :class="[gridName.length > 5 ? 'smallSize' : '', 'text']">
{{ gridName }}
</div>
</div>
<div class="tag blue" v-if="ageClassification">
<div :class="[ageClassification.length > 5 ? 'smallSize' : '', 'text']">
{{ ageClassification }}
</div>
</div>
<div class="tag red" :key="index"
v-for="(residentTag,index) in residentTagArray"
>
<div :class="[residentTag.length > 5 ? 'smallSize' : '', 'text']">
{{ residentTag }}
</div>
</div>
<div class="tag green" v-if="service">
<div :class="[service.length > 5 ? 'smallSize' : '', 'text']">
{{ service }}
</div>
</div>
<div class="tag light" v-if="monthIncomeLevel">
<div :class="[monthIncomeLevel.length > 5 ? 'smallSize' : '', 'text']">
{{ monthIncomeLevel }}
</div>
</div>
<div class="tag green" v-if="cultureName">
<div :class="[cultureName.length > 5 ? 'smallSize' : '', 'text']">
{{ cultureName }}
</div>
</div>
<div class="tag orange" v-if="marriageName">
<div :class="[marriageName.length > 5 ? 'smallSize' : '', 'text']">
{{ marriageName }}
</div>
</div>
<div class="tag purple" v-if="gender">
<div class="text">
{{ gender === "1" ? "男" : gender === "2" ? "女" : gender === "0" ? "未知" : "" }}
</div>
</div>
</div>
<div class="portrait1">
<img class="daqipao qipao1" src="@/assets/images/overview/qipao.png" />
<img class="xiaoqipao qipao2" src="@/assets/images/overview/qipao-xiao.png" />
<img class="daqipao qipao3" src="@/assets/images/overview/qipao.png" />
<img class="xiaoqipao qipao4" src="@/assets/images/overview/qipao-xiao.png" />
<img class="daqipao qipao5" src="@/assets/images/overview/qipao.png" />
<img class="xiaoqipao qipao6" src="@/assets/images/overview/qipao-xiao.png" />
<img class="daqipao qipao7" src="@/assets/images/overview/qipao.png" />
<img class="xiaoqipao qipao8" src="@/assets/images/overview/qipao-xiao.png" />
</div>
<div style="display: flex">
<div class="btn" @click="gotopage">
<div>
按画像匹配到潜在不满意人员<span>
<b>{{ matchPeopleNum ? matchPeopleNum : 0 }}</b
></span
>
</div>
<i class="el-icon-arrow-right"></i>
</div>
</div>
</div>
</template>
<script>
import { requestGet } from "@/js/dai/request";
export default {
name: "PersonnelPortrait",
components: { },
data() {
return {
resultType: "provinceAndSelf",
typeCondition: "",
typeConditionList: [],
gender: "",
marriageName: "",
ageClassification: "",
cultureName: "",
gridName: "",
service: "",
monthIncomeLevel: "",
residentTagArray:[],
matchPeopleNum: 0,
searchParams: "",
loading: true,
};
},
watch: {
"$store.state.chooseArea.chooseName"(val) {
if (val.orgId) {
// this.getDisKey()
this.getData();
}
},
typeCondition(val) {
if (val) {
this.gender = "";
this.marriageName = "";
this.ageClassification = "";
this.cultureName = "";
this.gridName = "";
this.service = "";
this.monthIncomeLevel = "";
this.residentTagArray = [];
this.matchPeopleNum = 0;
this.typeCondition = val;
this.getData();
}
},
},
mounted() {
this.getDisKey();
if (this.$store.state.chooseArea.chooseName.orgId) {
this.getData();
}
},
methods: {
resultTypeChange(val) {
this.resultType = val;
this.getData();
},
gotopage() {
this.$router.push("/dataBoard/satisfactionEval/dissatisfiedPersonnel?searchParams=" + this.searchParams);
},
getDisKey() {
this.$http.post("/sys/dict/data/dictlist", { dictType: "satisfaction_category" }).then(({ data: { data } }) => {
this.typeCondition = data[0].value;
this.typeConditionList = data;
});
},
getData() {
this.loading = false;
let params = {
level: this.$store.state.chooseArea.chooseName.level,
orgId: this.$store.state.chooseArea.chooseName.orgId,
queryType: this.resultType,
category: this.resultType == "provinceAndSelf" ? this.typeCondition : null,
};
this.$http.get("/governance/satisfactionOverview/satisfactionCrowdPortrait?" + this.$paramsFormat(params)).then(({ data: { data } }) => {
this.gender = data.gender;
this.marriageName = data.marriageName;
this.ageClassification = data.ageClassification;
this.cultureName = data.cultureName;
this.gridName = data.gridName;
this.service = data.service;
this.monthIncomeLevel = data.monthIncomeLevel;
this.residentTagArray = [];
if(data.residentTagName){
this.residentTagArray = data.residentTagName.split(",");
}
this.matchPeopleNum = data.matchPeopleNum;
this.loading = false;
this.searchParams = JSON.stringify({ ...data, ...params });
});
},
},
};
</script>
<style scoped lang="scss">
$yellow: #ef9700;
$blue: #1a95ff;
$red: #ee3030;
$light: #2ab6be;
$green: #1b7d47;
$orange: #f95619;
$purple: #6642fd;
$purple2: #db42fd;
$green2: #58cc32;
.personnel-portrait {
padding: 16px;
}
.screen {
display: flex;
align-items: center;
.txt {
font-size: 16px;
font-weight: 500;
color: #ffffff;
line-height: 22px;
margin-right: 25px;
}
/deep/ .el-input__inner {
width: 110px !important;
height: 24px !important;
background: #021c49 !important;
border: 1px solid #125aaa !important;
border-radius: 12px !important;
color: #a0cdff;
}
/deep/ .el-input__icon {
line-height: 24px !important;
color: #a0cdff;
}
}
.portrait1 {
width: 500px;
height: 345px;
margin-top: -345px;
padding-left: 80px;
overflow: hidden;
img {
margin: 30px;
}
.daqipao {
width: 8px;
height: 48px;
}
.xiaoqipao {
width: 8px;
height: 34px;
}
.qipao1 {
animation: scrollmyd 5s linear infinite;
}
.qipao2 {
animation: scrollmyd1 7s linear infinite;
}
.qipao3 {
animation: scrollmyd 6s linear infinite;
}
.qipao4 {
animation: scrollmyd1 8s linear infinite;
}
.qipao5 {
animation: scrollmyd 5s linear infinite;
}
.qipao6 {
animation: scrollmyd1 7s linear infinite;
}
.qipao7 {
animation: scrollmyd 4s linear infinite;
}
.qipao8 {
animation: scrollmyd1 6s linear infinite;
}
}
@keyframes scrollmyd {
0% {
transform: translatey(700%);
}
100% {
transform: translatey(-200%);
}
}
@keyframes scrollmyd1 {
0% {
transform: translatey(900%);
}
100% {
transform: translatey(-200%);
}
}
.portrait {
width: 388px;
height: 310px;
position: relative;
background: url("@/assets/images/manyidu/hx_bg.png") no-repeat center 80px;
background-size: 234px 186px;
margin: 0 auto;
cursor: pointer;
.tag {
position: absolute;
width: 76px;
height: 76px;
display: flex;
align-items: center;
justify-content: center;
.text {
width: 60px;
height: 60px;
top: 0;
left: 0;
color: #fff;
display: flex;
align-items: center;
justify-content: center;
border-radius: 50%;
text-align: center;
}
.smallSize {
font-size: 10px;
}
&:after {
content: "";
opacity: 0.3;
display: block;
width: 76px;
height: 76px;
position: absolute;
border-radius: 50%;
}
&:nth-of-type(3) {
left: 162px;
top: 0;
.text {
background: $yellow;
}
&:after {
background: $yellow;
}
}
&:nth-of-type(5) {
left: 323px;
top: 107px;
.text {
background: $blue;
}
&:after {
background: $blue;
}
}
&:nth-of-type(2) {
left: 316px;
top: 203px;
.text {
background: $red;
}
&:after {
background: $red;
}
}
&:nth-of-type(6) {
left: 228px;
top: 246px;
.text {
background: $light;
}
&:after {
background: $light;
}
}
&:nth-of-type(4) {
left: 77px;
top: 246px;
.text {
background: $green;
}
&:after {
background: $green;
}
}
&:nth-of-type(7) {
left: 0px;
top: 158px;
.text {
background: $orange;
}
&:after {
background: $orange;
}
}
&:nth-of-type(1) {
left: 48px;
top: 57px;
.text {
background: $purple;
}
&:after {
background: $purple;
}
}
&:nth-of-type(8) {
left: 260px;
top: 29px;
.text {
background: $green2;
}
&:after {
background: $green2;
}
}
}
/*
.yellow {
.text {
background: $yellow;
}
&:after {
background: $yellow;
}
}
.blue {
.text {
background: $blue;
}
&:after {
background: $blue;
}
}
.red {
.text {
background: $red;
}
&:after {
background: $red;
}
}
.light {
.text {
background: $light;
}
&:after {
background: $light;
}
}
.green {
.text {
background: $green;
}
&:after {
background: $green;
}
}
.orange {
.text {
background: $orange;
}
&:after {
background: $orange;
}
}
.purple {
.text {
background: $purple;
}
&:after {
background: $purple;
}
}
.purple2 {
.text {
background: $purple2;
}
&:after {
background: $purple2;
}
}
.green2 {
.text {
background: $green2;
}
&:after {
background: $green2;
}
}*/
}
.btn {
min-width: 320px;
height: 40px;
background: #00143C;
border: 1px solid #125AAA;
border-radius: 20px;
border-radius: 23px;
font-size: 14px;
font-weight: 400;
color: #ffffff;
line-height: 40px;
display: inline-flex;
align-items: center;
justify-content: space-between;
padding: 0 20px;
margin: 0 auto 0;
cursor: pointer;
span {
font-size: 18px;
}
}
</style>

320
src/views/newDataBoard/hengAnZhi/modules/PotentialPeople/index.vue

@ -0,0 +1,320 @@
<template>
<div
v-loading="loading"
class="potential-people"
element-loading-background="rgba(0,0,0,0.5)"
element-loading-spinner="el-icon-loading"
element-loading-text="加载中..."
>
<!-- <div
class="potential-people-item"
@click="
$router.push(
'/dataBoard/satisfactionEval/potentialPeople?countType=event'
)
"
>
<div class="icon">
<img
class="imgBg"
src="@/assets/images/manyidu/xuanzhuan-bg.png"
alt=""
/>
<img class="imgIcon" src="@/assets/images/manyidu/qz_wjj.png" alt="" />
</div>
<div class="txt">
事件未解决 <br />
上报人数
</div>
<div class="num">
<span style="margin-right: 4px" class="orange">{{
unSolvedNum ? unSolvedNum : 0
}}</span
>
</div>
</div>
<div
class="potential-people-item"
@click="
$router.push(
'/dataBoard/satisfactionEval/potentialPeople?countType=demand'
)
"
>
<div class="icon">
<img
class="imgBg"
src="@/assets/images/manyidu/xuanzhuan-bg.png"
alt=""
/>
<img class="imgIcon" src="@/assets/images/manyidu/qz_wmz.png" alt="" />
</div>
<div class="txt">
需求未满足 <br />
人数
</div>
<div class="num">
<span style="margin-right: 4px" class="green">{{
unFinishNum ? unFinishNum : 0
}}</span
>
</div>
</div>
<div
class="potential-people-item"
@click="
$router.push(
'/dataBoard/satisfactionEval/potentialPeople?countType=service'
)
"
>
<div class="icon">
<img
class="imgBg"
src="@/assets/images/manyidu/xuanzhuan-bg.png"
alt=""
/>
<img class="imgIcon" src="@/assets/images/manyidu/qz_wx.png" alt="" />
</div>
<div class="txt">
应享未享 <br />
服务人数
</div>
<div class="num">
<span style="margin-right: 4px" class="light">{{
noServiceNum ? noServiceNum : 0
}}</span
>
</div>
</div>-->
<div class="number-list">
<div class="number-item" @click="
$router.push(
'/dataBoard/satisfactionEval/potentialPeople?countType=event'
)">
<div class="img">
<img alt="" src="@/assets/images/manyidu/hf_ts.png"/>
</div>
<div>
<div class="txt">
事件未解决 <br/>
上报人数
</div>
<div class="num">
<span class="orange">{{ unSolvedNum ? unSolvedNum : 0 }}</span>
</div>
</div>
</div>
<div class="number-item" @click="
$router.push(
'/dataBoard/satisfactionEval/potentialPeople?countType=demand'
)
">
<div class="img">
<img alt="" src="@/assets/images/manyidu/hf_bmy.png"/>
</div>
<div>
<div class="txt">
需求未满足 <br/>
人数
</div>
<div class="num">
<span class="green">{{
unFinishNum ? unFinishNum : 0
}}</span>
</div>
</div>
</div>
<div class="number-item" @click="
$router.push(
'/dataBoard/satisfactionEval/potentialPeople?countType=service'
)
">
<div class="img">
<img alt="" src="@/assets/images/manyidu/hf_zpbmy.png"/>
</div>
<div>
<div class="txt">
应享未享 <br/>
服务人数
</div>
<div class="num">
<span class="light">{{ noServiceNum ? noServiceNum : 0 }}</span>
</div>
</div>
</div>
</div>
</div>
</template>
<script>
export default {
name: "PotentialPeople",
data() {
return {
noServiceNum: 0,
unFinishNum: 0,
unSolvedNum: 0,
loading: true,
};
},
props: {
date: {
type: Object,
default: () => {
},
},
},
watch: {
"$store.state.chooseArea.chooseName"(val) {
if (val.orgId) {
this.getData();
}
},
date() {
this.getData();
},
},
mounted() {
if (this.$store.state.chooseArea.chooseName.orgId) {
this.getData();
}
},
methods: {
getData() {
this.loading = true;
let params = {
level: this.$store.state.chooseArea.chooseName.level,
orgId: this.$store.state.chooseArea.chooseName.orgId,
...this.date,
};
this.$http
.get(
"/governance/satisfactionOverview/potentialSatisfactionGroup?" +
this.$paramsFormat(params)
)
.then(({data: {data}}) => {
this.noServiceNum = data.noServiceNum;
this.unFinishNum = data.unFinishNum;
this.unSolvedNum = data.unSolvedNum;
this.loading = false;
});
},
},
};
</script>
<style lang="scss" scoped>
@keyframes roate {
0% {
transform: rotateZ(0);
-ms-transform: rotateZ(0);
-moz-transform: rotateZ(0);
-webkit-transform: rotateZ(0);
-o-transform: rotateZ(0);
}
100% {
transform: rotateZ(360deg);
-ms-transform: rotateZ(360deg);
-moz-transform: rotateZ(360deg);
-webkit-transform: rotateZ(360deg);
-o-transform: rotateZ(360deg);
}
}
.potential-people {
display: flex;
align-items: center;
justify-content: space-between;
padding: 16px 20px;
.potential-people-item {
flex: 1;
margin: 14px;
padding: 26px 0 31px;
text-align: center;
border: 1px solid rgba(28, 67, 111, 0.22);
background: linear-gradient(
0deg,
rgba(31, 121, 255, 0.22) 0%,
rgba(31, 121, 255, 0) 100%
);
.icon {
width: 86px;
height: 86px;
margin: 0 auto;
.imgIcon {
position: relative;
top: -58px;
width: 30px;
height: 30px;
}
.imgBg {
display: block;
width: 100%;
height: 100%;
animation: roate 5s infinite linear; //
}
}
.txt {
font-size: 14px;
font-weight: 400;
line-height: 24px;
margin: 11px 0 22px;
white-space: normal;
color: #a3b9da;
}
.num {
font-size: 14px;
font-weight: 500;
white-space: normal;
color: #a3b9da;
span {
font-size: 32px;
font-weight: bold;
font-style: italic;
}
}
}
}
.orange {
color: #ffb73c;
}
.green {
color: #08ebae;
}
.light {
color: #7fceff;
}
.number-list {
display: flex;
justify-content: space-between;
width: 100%;
padding: 10px 0px 15px;
.number-item {
display: flex;
.image {
width: 98px;
height: 70px;
}
.txt {
font-size: 15px;
margin-left: -6px;
font-weight: 400;
color: #ffffff;
line-height: 26px;
margin-bottom: 17px;
white-space: nowrap;
}
.num {
font-size: 14px;
font-weight: 500;
color: #a3b9da;
white-space: nowrap;
span {
font-size: 32px;
font-weight: bold;
font-style: italic;
//color: #3ab7ff;
}
}
}
}
</style>

215
src/views/newDataBoard/hengAnZhi/modules/TypesOfDissatisfaction/index.vue

@ -0,0 +1,215 @@
<template>
<div class="types-dissatisfaction" v-loading="loading" element-loading-text="加载中..."
element-loading-spinner="el-icon-loading" element-loading-background="rgba(0,0,0,0.5)">
<div class="screen">
<el-select v-model.trim="typeCondition" popper-class="selectPopClass" placeholder="请选择" class="select"
@change="timeChange">
<el-option v-for="item in typeConditionList" :key="item.value" :label="item.label" :value="item.value">
</el-option>
</el-select>
</div>
<div style="height: 210px">
<EChart :options="radarOption" />
</div>
</div>
</template>
<script>
import EChart from '@/components/EChart';
import { requestGet } from "@/js/dai/request";
export default {
name: "TypesOfDissatisfaction",
components: { EChart },
data() {
return {
resultType: 1,
typeCondition: 5,
typeConditionList: [
{
label: "本月",
value: 1,
},
{
label: "上月",
value: 2,
},
{
label: "近三月",
value: 3,
},
{
label: "近半年",
value: 4,
},
{
label: "近一年",
value: 5,
},
],
radarOption: [],
loading: true,
};
},
watch: {
"$store.state.chooseArea.chooseName"(val) {
if (val.orgId) {
this.timeChange();
// this.getData();
}
},
},
mounted() {
if (this.$store.state.chooseArea.chooseName.orgId) {
this.timeChange();
}
},
methods: {
resultTypeChange(val) {
if (val !== this.resultType) {
this.resultType = val;
this.timeChange();
}
},
timeChange() {
let startTime = "",
endTime = "";
if (this.typeCondition === 1) {
startTime = this.$moment().startOf("month").format("YYYY-MM-DD");
}
if (this.typeCondition === 2) {
startTime = this.$moment().subtract(1, "months").startOf("month").format("YYYY-MM-DD");
}
if (this.typeCondition === 3) {
startTime = this.$moment().subtract(2, "months").startOf("month").format("YYYY-MM-DD");
}
if (this.typeCondition === 4) {
startTime = this.$moment().subtract(5, "months").startOf("month").format("YYYY-MM-DD");
}
if (this.typeCondition === 5) {
startTime = this.$moment().subtract(11, "months").startOf("month").format("YYYY-MM-DD");
}
if (this.typeCondition === 2) {
endTime = this.$moment().subtract(1, "months").endOf("month").format("YYYY-MM-DD");
} else {
endTime = this.$moment().endOf("month").format("YYYY-MM-DD");
}
this.getData(startTime, endTime);
this.$emit("timeChange", { startTime, endTime });
},
async getData(startTime, endTime) {
this.loading = false;
let params = {
level: this.$store.state.chooseArea.chooseName.level,
orgId: this.$store.state.chooseArea.chooseName.orgId,
startTime,
endTime,
};
let url = "/governance/satisfactionOverview/satisfactionGroup";
const { data, code, msg } = await requestGet(url, params);
this.initCharts();
},
initCharts() {
this.radarOption = {
backgroundColor: "transparent",
legend: {
right: 20,
top: "middle",
orient: "vertical",
icon: "rect",
itemWidth: 10,
itemHeight: 10,
textStyle: {
color: "#9ecbff"
},
data: ["12345热线事件上报人数"]
},
radar: {
center: ["40%", "50%"],
radius: "60%",
indicator: [
{ name: "城市综合", max: 1 },
{ name: "党风政风行风", max: 1 },
{ name: "三农问题", max: 1 },
{ name: "人力资源保障", max: 1 },
{ name: "自然资源", max: 1 },
{ name: "城乡建设", max: 1 },
{ name: "社会事业", max: 1 },
{ name: "经济综合", max: 1 }
],
name: {
textStyle: {
color: "#cfe8ff",
fontSize: 14
}
},
splitLine: {
lineStyle: {
color: "rgba(120,180,255,0.4)"
}
},
splitArea: {
areaStyle: {
color: ["transparent"]
}
},
axisLine: {
lineStyle: {
color: "rgba(120,180,255,0.4)"
}
}
},
series: [
{
name: "12345热线事件上报人数",
type: "radar",
data: [
{
name: "12345热线事件上报人数",
value: [0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1],
//
areaStyle: {
opacity: 0
},
lineStyle: {
width: 2,
color: "#4fdcff"
},
symbol: "circle",
symbolSize: 8,
itemStyle: {
color: "#4fdcff"
}
}
]
}
]
}
this.loading = false;
},
},
};
</script>
<style scoped lang="scss">
.types-dissatisfaction {
padding: 16px 32px;
}
.screen {
text-align: end;
/deep/ .el-input__inner {
width: 90px !important;
height: 24px !important;
background: #021c49 !important;
border: 1px solid #125aaa !important;
border-radius: 12px !important;
color: #a0cdff;
}
/deep/ .el-input__icon {
line-height: 24px !important;
color: #a0cdff;
}
}
</style>

332
src/views/newDataBoard/hengAnZhi/potentialPeople/details/sjwjj.vue

@ -0,0 +1,332 @@
<template>
<el-dialog
width="1118px"
:modal="true"
:modal-append-to-body="false"
:destroy-on-close="true"
:visible="showDialog"
@close="handleClose"
>
<div class="eventWrap">
<el-row :gutter="32">
<el-col :span="24" style="padding-left: 40px">
<title-box text="事件详情" />
</el-col>
<el-col
:span="13"
style="padding-left: 40px"
v-loading="loading"
element-loading-text="加载中"
element-loading-spinner="el-icon-loading"
element-loading-background="rgba(0, 21, 64, 0"
>
<div class="leftEvent">
<div class="eventDetails">
<img
:width="18"
:height="18"
src="@/assets/images/manyidu/tc-title-icon.png"
/>
</div>
<div class="eventItem">
<span>所属组织</span>
<span>{{ item.gridName }}</span>
</div>
<div class="eventItem">
<span>上报渠道</span>
<span>{{ item.sourceTypeName }}</span>
</div>
<div class="eventItem">
<span>事件类型</span>
<span>{{ item.categoryName }}</span>
</div>
<div class="eventItem">
<span>上报时间</span>
<span>{{ item.createdTime }}</span>
</div>
<div class="eventItem">
<div>问题描述</div>
<div style="margin-top: 20px">{{ item.eventContent }}</div>
</div>
<div class="eventItem">
<div>图片/附件</div>
<div style="margin-top: 20px; display: flex">
<img
style="width: 100px; height: 100px; margin-right: 5px"
v-for="src in item.imageList"
:key="src"
:src="src"
alt="/"
@click="openImg(src)"
/>
</div>
</div>
<div class="eventItem">
<span>详细地址</span>
<span>{{ item.address }}</span>
</div>
<div class="eventItem">
<span>上报人</span>
<span>{{ item.name }}</span>
</div>
<div class="eventItem">
<span>联系电话</span>
<span>{{ item.mobile }}</span>
</div>
</div>
</el-col>
<el-col
:span="11"
v-loading="loading1"
element-loading-text="加载中"
element-loading-spinner="el-icon-loading"
element-loading-background="rgba(0, 21, 64, 0.3)"
>
<div class="rightEvent m-info">
<div class="eventDetails">
<img
:width="18"
:height="18"
src="@/assets/images/manyidu/tc-title-icon.png"
/>
</div>
<!-- <el-timeline class="timeline" :reverse="true">
<el-timeline-item v-for="(item, index) in activities" :key="index" :class="index == activities.length - 1 ? 'sucess' : ''">
<div class="status-box">
<div class="status1" v-if="index == activities.length - 1">回复</div>
<div class="status2" v-else>完成并回复</div>
<div class="timestamp">{{ item.timeLimit ? $moment(item.timeLimit).format("YYYY-MM-DD hh:mm:ss") : "" }}</div>
</div>
<div class="content">
<div class="field">回复人</div>
<div class="value">{{ item.departmentName }}</div>
</div>
<div class="content">
<div class="field">回复内容</div>
<div class="value">{{ item.publicReply }}</div>
</div>
</el-timeline-item>
</el-timeline> -->
<div v-if="activities.length > 0">
<!-- <el-card :class="{ 'box-card': source === 'visiual' }" style="min-height: calc(88vh - 50px); overflow: auto"> -->
<div class="m-process">
<div class="list">
<div
class="item"
:class="[index === 0 ? 'z-on' : '']"
:key="item.processId"
v-for="(item, index) in activities"
>
<div class="item-row">
<template v-if="item.agencyId">
<div class="name">指派</div>
</template>
<template v-if="!item.timeLimit">
<div class="name">完成并回复</div>
</template>
<template v-if="!item.agencyId && item.timeLimit">
<div class="name">{{ item.processName }}</div>
</template>
<div class="date">
{{
item.processTime ? getTrueTime(item.processTime) : ""
}}
</div>
</div>
<div v-if="item.type === 'event'">
<template v-if="item.agencyId">
<div class="detail">
<div class="detail-field">指派人</div>
<div class="detail-value">
{{ item.departmentName }}
</div>
</div>
<div class="detail">
<div class="detail-field">指派部门</div>
<div class="detail-value">
{{ item.agencyName }}
</div>
</div>
<div class="detail">
<div class="detail-field">转办意见</div>
<div class="detail-value">
{{ item.publicReply }}
</div>
</div>
<div class="detail">
<div class="detail-field">办结时限</div>
<div class="detail-value">
{{ item.timeLimit}}
</div>
</div>
</template>
<template v-else>
<div class="detail">
<div class="detail-field">回复人</div>
<div class="detail-value">
{{ item.departmentName }}
</div>
</div>
<div class="detail">
<div class="detail-field">回复内容</div>
<div class="detail-value">
{{ item.publicReply }}
</div>
</div>
<div class="detail" v-if="item.timeLimit">
<div class="detail-field">办结时限</div>
<div class="detail-value">
{{ getTrueTime(item.timeLimit) }}
</div>
</div>
</template>
</div>
</div>
</div>
</div>
<!-- </el-card> -->
</div>
</div>
</el-col>
</el-row>
</div>
</el-dialog>
</template>
<script>
import titleBox from "@/views/dataBoard/satisfactionEval/components/Title"
export default {
name: "ReportAnEvent",
components: {
titleBox,
},
props: {
id: {
type: String,
default: "",
},
showDialog: {
type: Boolean,
default: false,
},
},
data() {
return {
item: {},
loading: false,
loading1: false,
activities: [],
};
},
computed: {},
watch: {
showDialog: {
handler(val) {
if (val) {
this.getDetailsData(this.id);
this.getProcessData(this.id);
}
},
immediate: true,
},
},
mounted() {},
methods: {
handleClose() {
this.$emit("close", false);
this.item = {};
},
openImg(src) {
window.open(src);
},
getTrueTime(time) {
return this.$moment(time * 1000).format("YYYY-MM-DD hh:mm");
},
getDetailsData(id) {
this.loading = true;
this.$http
.post("/governance/icEvent/detail", { icEventId: id })
.then((res) => {
const { code, data, msg } = res.data;
if (code === 0) {
this.item = data;
this.loading = false;
} else {
this.loading = false;
this.$message.error(msg);
}
});
},
getProcessData(id) {
this.$http
.post("/governance/icEvent/process", { icEventId: id })
.then((res) => {
const { code, data, msg } = res.data;
if (code === 0) {
this.activities = data;
this.loading1 = false;
} else {
this.loading1 = false;
this.$message.error(msg);
}
});
},
},
};
</script>
<style lang="scss" src="@/assets/scss/dataBoard/popup-info.scss" scoped></style>
<style lang="scss" scoped>
@import "@/assets/scss/modules/shequzhili/event-info.scss";
@import "@/assets/scss/dataBoard/dialog.scss";
@mixin fontStyle {
color: #fff !important;
font-size: 14px !important;
}
.eventWrap {
//width: 1094px;
//height: 798px;
overflow-y: auto;
overflow-x: hidden;
padding: 24px;
.eventDetails {
font-size: 18px;
margin: 48px 24px 48px 0;
color: #ffffff;
img {
margin-top: -4px;
margin-right: 8px;
}
}
.m-info {
padding: 0px !important;
.m-process {
margin: 0 !important;
.name {
@include fontStyle;
}
.date {
@include fontStyle;
}
.detail {
@include fontStyle;
.detail-field {
flex: none !important;
}
}
}
}
.leftEvent {
color: #fff;
.eventItem {
font-size: 14px;
margin-bottom: 24px;
span:first-child {
}
span:last-child {
}
}
}
.rightEvent {
color: #fff;
}
}
</style>

302
src/views/newDataBoard/hengAnZhi/potentialPeople/details/xqwmz.vue

@ -0,0 +1,302 @@
<template>
<el-dialog
width="1118px"
:modal="true"
:modal-append-to-body="false"
:destroy-on-close="true"
:visible="showDialog"
@close="handleClose"
>
<div class="eventWrap">
<el-row :gutter="32">
<el-col :span="24" style="padding-left: 40px">
<title-box text="事件详情"/>
</el-col>
<el-col
:span="13"
style="padding-left: 40px"
v-loading="loading"
element-loading-text="加载中"
element-loading-spinner="el-icon-loading"
element-loading-background="rgba(0, 21, 64, 0"
>
<div class="leftEvent">
<div class="eventDetails">
<img
:width="18"
:height="18"
src="@/assets/images/manyidu/tc-title-icon.png"
/>
</div>
<div class="eventItem">
<span>所属组织</span>
<span>{{ item.agencyName }}</span>
</div>
<div class="eventItem">
<span>上报渠道</span>
<span>{{ item.reportType }}</span>
</div>
<div class="eventItem">
<span>需求类型</span>
<span>{{ item.categoryName }}</span>
</div>
<div class="eventItem">
<span>上报时间</span>
<span>{{ item.reportTime }}</span>
</div>
<div class="eventItem">
<div>需求描述</div>
<div style="margin-top: 20px">{{ item.content }}</div>
</div>
<div class="eventItem">
<span>需求人</span>
<span>{{ item.demandUserName }}</span>
</div>
<div class="eventItem">
<span>需求人电话</span>
<span>{{ item.demandUserMobile }}</span>
</div>
<div class="eventItem">
<span>需求人住址</span>
<span>{{ item.reportUserName }}</span>
</div>
<div class="eventItem">
<span>上报人</span>
<span>{{ item.reportUserName }}</span>
</div>
</div>
</el-col>
<el-col
:span="11"
v-loading="loading1"
element-loading-text="加载中"
element-loading-spinner="el-icon-loading"
element-loading-background="rgba(0, 21, 64, 0.3)"
>
<div class="rightEvent m-info">
<div class="eventDetails">
<img
:width="18"
:height="18"
src="@/assets/images/manyidu/tc-title-icon.png"
/>
</div>
<div v-if="logList.length > 0">
<!-- <el-card :class="{ 'box-card': source === 'visiual' }" style="min-height: calc(88vh - 50px); overflow: auto"> -->
<div class="m-process">
<div class="list">
<div
class="item"
:class="[index === 0 ? 'z-on' : '']"
:key="item.processId"
v-for="(item, index) in logList"
>
<div class="item-row">
<template>
<div class="name">
{{
item.actionCode === 'create' ? '创建需求' :
item.actionCode === 'update' ? '更新需求' :
item.actionCode === 'cancel' ? '撤销需求' :
item.actionCode === 'assign' ? '指派' :
item.actionCode === 'take_order' ? '接单' :
item.actionCode === 'finish' ? '完成' :
item.actionCode === 'evaluate' ? '评价' : ''
}}
</div>
</template>
<div class="date">
{{
item.oprateTime
}}
</div>
</div>
<div>
<template v-if="item.actionCode === 'create'">
<div class="detail">
<div class="detail-field">上报人</div>
<div class="detail-value">
{{ item.reportUserName }} {{ item.roleName }}
</div>
</div>
</template>
<template v-if="item.actionCode === 'assign'">
<div class="detail">
<div class="detail-field">办理人</div>
<div class="detail-value">
{{ item.assignUser }}
</div>
</div>
<div class="detail">
<div class="detail-field">指派给服务组织</div>
<div class="detail-value">
{{ item.serverName }} {{
item.serviceType === 'volunteer' ? '志愿者' :
item.serviceType === 'social_org' ? '社会组织' :
item.serviceType === 'community_org' ? '社区自组织' :
item.serviceType === 'party_unit' ? '区域党建单位' :
item.serviceType === 'enterprise' ? '企业,商家' : ''
}}
</div>
</div>
</template>
<template v-if="item.actionCode === 'finish'">
<div class="detail">
<div class="detail-field">服务组织</div>
<div class="detail-value">
{{ item.serverName }} {{
item.serviceType === 'volunteer' ? '志愿者' :
item.serviceType === 'social_org' ? '社会组织' :
item.serviceType === 'community_org' ? '社区自组织' :
item.serviceType === 'party_unit' ? '区域党建单位' :
item.serviceType === 'enterprise' ? '企业,商家' : ''
}}
</div>
</div>
<!-- <div class="detail">
<div class="detail-field">完成时间</div>
<div class="detail-value">
{{ item.assignUser }}
</div>
</div>-->
</template>
</div>
</div>
</div>
</div>
<!-- </el-card> -->
</div>
</div>
</el-col>
</el-row>
</div>
</el-dialog>
</template>
<script>
import titleBox from "@/views/dataBoard/satisfactionEval/components/Title"
export default {
name: "ReportAnEvent",
components: {
titleBox,
},
props: {
id: {
type: String,
default: "",
},
showDialog: {
type: Boolean,
default: false,
},
},
data() {
return {
item: {
},
logList: [],
loading: false,
loading1: false,
activities: [],
};
},
computed: {},
watch: {
showDialog: {
handler(val) {
if (val) {
this.getDetailsData(this.id);
}
},
immediate: true,
},
},
mounted() {
},
methods: {
handleClose() {
this.$emit("close", false);
this.item = {};
},
openImg(src) {
window.open(src);
},
getTrueTime(time) {
return this.$moment(time * 1000).format("YYYY-MM-DD hh:mm");
},
getDetailsData(id) {
this.loading = true;
this.$http
.get("/governance/satisfactionDetailList/getUserDemandUnSolvedDetail?id=" + id)
.then((res) => {
const {code, data, msg} = res.data;
if (code === 0) {
this.item = data;
this.logList = data.logList;
this.loading = false;
} else {
this.loading = false;
this.$message.error(msg);
}
});
},
},
};
</script>
<style lang="scss" src="@/assets/scss/dataBoard/popup-info.scss" scoped></style>
<style lang="scss" scoped>
@import "@/assets/scss/modules/shequzhili/event-info.scss";
@import "@/assets/scss/dataBoard/dialog.scss";
@mixin fontStyle {
color: #fff !important;
font-size: 14px !important;
}
.eventWrap {
width: 1094px;
//height: 798px;
overflow-y: auto;
overflow-x: hidden;
padding: 24px;
.eventDetails {
font-size: 18px;
margin: 48px 24px 48px 0;
color: #ffffff;
img {
margin-top: -4px;
margin-right: 8px;
}
}
.m-info {
padding: 0px !important;
.m-process {
margin: 0 !important;
.name {
@include fontStyle;
}
.date {
@include fontStyle;
}
.detail {
@include fontStyle;
.detail-field {
flex: none !important;
}
}
}
}
.leftEvent {
color: #fff;
.eventItem {
font-size: 14px;
margin-bottom: 24px;
span:first-child {
}
span:last-child {
}
}
}
.rightEvent {
color: #fff;
}
}
</style>

211
src/views/newDataBoard/hengAnZhi/potentialPeople/details/yxwxfw.vue

@ -0,0 +1,211 @@
<template>
<el-dialog width="1118px" :modal="true" :modal-append-to-body="false" :destroy-on-close="true" :visible="showDialog" @close="handleClose">
<div class="eventWrap">
<el-row :gutter="32">
<el-col :span="24" style="padding-left: 40px">
<title-box text="事件详情" />
</el-col>
<el-col :span="13" style="padding-left: 40px" v-loading="loading" element-loading-text="加载中" element-loading-spinner="el-icon-loading" element-loading-background="rgba(0, 21, 64, 0">
<div class="leftEvent">
<div class="eventDetails"><img :width="18" :height="18" src="@/assets/images/manyidu/tc-title-icon.png" />事项详情</div>
<div class="eventItem">
<span>所属组织</span>
<span>{{ item.organizationName }}</span>
</div>
<div class="eventItem">
<span>服务类型</span>
<span>{{ item.serviceCategoryName }}</span>
</div>
<div class="eventItem">
<span>服务事项</span>
<span>{{ item.serviceName }}</span>
</div>
<div class="eventItem">
<span>服务时间</span>
<span>{{ item.serviceTimeStart }} ~ {{ item.serviceTimeEnd }}</span>
</div>
<div class="eventItem">
<div>服务内容</div>
<div style="margin-top: 20px">{{ item.remark }}</div>
</div>
<div class="eventItem">
<span>经办人</span>
<span>{{ item.principalName }}</span>
</div>
<div class="eventItem">
<span>联系电话</span>
<span> {{ $sensitive(item.principalContact, 3, 7) }}</span>
</div>
<div class="eventItem">
<span>服务组织</span>
<span>{{ item.serviceOrgName }}</span>
</div>
<div class="eventItem">
<span>政策依据</span>
<span>{{ item.title }}</span>
</div>
</div>
</el-col>
<el-col :span="11" v-loading="loading1" element-loading-text="加载中" element-loading-spinner="el-icon-loading" element-loading-background="rgba(0, 21, 64, 0.3)">
<div class="rightEvent m-info">
<div class="eventDetails"><img :width="18" :height="18" src="@/assets/images/manyidu/tc-title-icon.png" />办理进展</div>
<div v-if="logList.length > 0">
<div class="m-process">
<div class="list">
<div class="item" :class="[index === 0 ? 'z-on' : '']" v-for="(item, index) in logList">
<div class="item-row">
<div class="name">{{ item.serviceStatus }}</div>
<div class="date">
{{ item.createdTime }}
</div>
</div>
<div>
<template v-if="item.serviceStatus === '创建服务'">
<div class="detail">
<div class="detail-field">创建人</div>
<div class="detail-value">{{ item.createdBy }} {{ item.agencyName }}</div>
</div>
</template>
<template v-else>
<div class="detail">
<div class="detail-field">服务组织</div>
<div class="detail-value">
{{ item.serviceOrgName }}
</div>
</div>
</template>
</div>
</div>
</div>
</div>
<!-- </el-card> -->
</div>
</div>
</el-col>
</el-row>
</div>
</el-dialog>
</template>
<script>
import titleBox from "@/views/dataBoard/satisfactionEval/components/Title";
export default {
name: "ReportAnEvent",
components: {
titleBox,
},
props: {
id: {
type: String,
default: "",
},
showDialog: {
type: Boolean,
default: false,
},
},
data() {
return {
item: {},
logList: [],
loading: false,
loading1: false,
activities: [],
};
},
computed: {},
watch: {
showDialog: {
handler(val) {
if (val) {
this.getDetailsData(this.id);
}
},
immediate: true,
},
},
mounted() {},
methods: {
handleClose() {
this.$emit("close", false);
this.item = {};
},
openImg(src) {
window.open(src);
},
getTrueTime(time) {
return this.$moment(time * 1000).format("YYYY-MM-DD hh:mm");
},
getDetailsData(id) {
this.loading = true;
this.$http.get("/governance/satisfactionDetailList/getServiceNotEnjoyedDetailById?id=" + id).then((res) => {
const { code, data, msg } = res.data;
if (code === 0) {
this.item = data;
this.logList = data.logList;
this.loading = false;
} else {
this.loading = false;
this.$message.error(msg);
}
});
},
},
};
</script>
<style lang="scss" src="@/assets/scss/dataBoard/popup-info.scss" scoped></style>
<style lang="scss" scoped>
@import "@/assets/scss/modules/shequzhili/event-info.scss";
@import "@/assets/scss/dataBoard/dialog.scss";
@mixin fontStyle {
color: #fff !important;
font-size: 14px !important;
}
.eventWrap {
width: 1094px;
//height: 798px;
overflow-y: auto;
overflow-x: hidden;
padding: 24px;
.eventDetails {
font-size: 18px;
margin: 48px 24px 48px 0;
color: #ffffff;
img {
margin-top: -4px;
margin-right: 8px;
}
}
.m-info {
padding: 0px !important;
.m-process {
margin: 0 !important;
.name {
@include fontStyle;
}
.date {
@include fontStyle;
}
.detail {
@include fontStyle;
.detail-field {
flex: none !important;
}
}
}
}
.leftEvent {
color: #fff;
.eventItem {
font-size: 14px;
margin-bottom: 24px;
span:first-child {
}
span:last-child {
}
}
}
.rightEvent {
color: #fff;
}
}
</style>

291
src/views/newDataBoard/hengAnZhi/potentialPeople/index.vue

@ -0,0 +1,291 @@
<template>
<div>
<Breadcrumb :list="breadcrumbList" />
<div class="screen">
<el-form :model="queryParams" inline>
<el-select
popper-class="selectPopClass"
v-model.trim="queryParams.agencyId"
size="small"
placeholder="按组织"
v-if="this.$route.query.type != 'shuji'"
>
<el-option
v-for="item in orgOptions"
:key="item.value"
:label="item.label"
:value="item.value"
></el-option>
</el-select>
<el-select
popper-class="selectPopClass"
v-model.trim="queryParams.satisfactionSource"
size="small"
placeholder="按类型"
v-else
>
<el-option
v-for="item in orgOptionsC"
:key="item.value"
:label="item.label"
:value="item.value"
></el-option>
</el-select>
<el-input
v-model.trim="queryParams.name"
clearable
size="small"
placeholder="按姓名"
></el-input>
<el-input
v-model.trim="queryParams.mobile"
clearable
size="small"
placeholder="按电话"
></el-input>
<el-button size="small" class="btn" type="primary" @click="search"
>查询</el-button
>
</el-form>
</div>
<div class="table">
<el-table
:data="list"
v-loading="loading"
element-loading-text="加载中..."
element-loading-spinner="el-icon-loading"
element-loading-background="rgba(0,0,0,0.5)"
>
<el-table-column label="序号" type="index" width="80" />
<el-table-column prop="name" label="上报人" />
<el-table-column prop="mobile" label="上报人电话">
<template slot-scope="scope">
{{ $sensitive(scope.row.mobile, 3, 7) }}
</template>
</el-table-column>
<el-table-column prop="agencyName" label="所属组织"></el-table-column>
<el-table-column prop="eventCount" sortable label="事件未解决数">
<template slot-scope="{ row }">
<el-button
type="text"
@click="
$router.push(
'/dataBoard/satisfactionEval/potentialPeople/sjwjj?reportUserId=' +
row.reportUserId
)
"
>
{{ row.eventCount }}
</el-button>
</template>
</el-table-column>
<el-table-column prop="demandCount" sortable label="需求未满足数">
<template slot-scope="{ row }">
<el-button
type="text"
@click="
$router.push(
'/dataBoard/satisfactionEval/potentialPeople/xqwmz?reportUserId=' +
row.reportUserId
)
"
>
{{ row.demandCount }}
</el-button>
</template>
</el-table-column>
<el-table-column prop="serviceCount" sortable label="应享未享数">
<template slot-scope="{ row }">
<el-button
type="text"
@click="
$router.push(
'/dataBoard/satisfactionEval/potentialPeople/yxwxfw?reportUserId=' +
row.reportUserId
)
"
>
{{ row.serviceCount }}
</el-button>
</template>
</el-table-column>
<el-table-column prop="countAll" sortable label="总数">
<template slot-scope="{ row }"
>{{ row.countAll }}
<!-- <el-button type="text"></el-button>-->
</template>
</el-table-column>
</el-table>
</div>
<Pagination
v-show="total > 0"
:total="total"
:page.sync="queryParams.pageNo"
:limit.sync="queryParams.pageSize"
@pagination="getList"
/>
</div>
</template>
<script>
import Breadcrumb from "@/views/dataBoard/satisfactionEval/components/Breadcrumb";
import Pagination from "@/views/dataBoard/satisfactionEval/components/Pagination";
import Title from "@/views/dataBoard/satisfactionEval/components/Title";
export default {
name: "dissatisfied",
components: { Breadcrumb, Pagination, Title },
data() {
return {
loading: true,
queryParams: {
month: "",
org: "",
matterSource: "",
matterType: "",
name: "",
tel: "",
pageNo: 1,
pageSize: 10,
satisfactionSource:""
},
orgOptions: [],
total: 0,
breadcrumbList: [
],
orgOptionsC:[
{
label:'12345政务热线',
value:'satisfaction_12345'
},
{
label:'上级满意度调查',
value:'satisfaction_province'
},
{
label:'社区满意度调查',
value:'satisfaction_community'
}
],
monthOptions: new Array(12).fill(0).map((_, index) => {
return { label: index - 0 + 1 + "月", value: index - 0 + 1 };
}),
list: [],
};
},
activated() {
this.queryParams.mobile = ''
this.queryParams.name = ''
if(this.$route.query.type == 'shuji'){
this.breadcrumbList = [
{
path: "/dataBoard/overview/index",
name: "指挥调度",
},
{
path: "",
name: "不满意风险人员",
},
]
this.queryParams.satisfactionSource = this.$route.query.satisfactionSource
}else{
this.breadcrumbList = [
{
path: "/dataBoard/satisfactionEval/index",
name: "满意度评价",
},
{
path: "",
name: "潜在不满意人数",
},
]
}
this.getOrg();
},
methods: {
search() {
this.queryParams.pageNo = 1;
this.getList();
},
getOrg() {
let params = {
orgId: this.$store.state.chooseArea.chooseName.orgId,
level: this.$store.state.chooseArea.chooseName.level,
};
this.$http
.post(`/gov/org/agency/maporg`, params)
.then(async ({ data: { data } }) => {
this.queryParams.agencyId =
this.$store.state.chooseArea.chooseName.orgId;
let parent = { value: data.id, label: data.name };
this.orgOptions = [
parent,
...data.children.map((item) => {
return {
value: item.id,
label: item.name,
};
}),
];
this.getList();
});
},
getList() {
this.loading = true;
let params = {
...this.queryParams,
};
this.$http
.get(
"/governance/satisfactionDetailList/getPotentialDissatisfiedCountDetail?" +
this.$paramsFormat(params)
)
.then(({ data: { data } }) => {
this.list = data.list;
this.total = data.total;
this.loading = false;
});
},
handleView(id) {},
},
};
</script>
<style scoped lang="scss">
@import "@/assets/scss/dataBoard/table.scss";
.screen {
margin: 25px 0 40px;
.el-select,
.el-input {
width: 150px;
margin-right: 4px;
border: 1px solid #126ac5;
border-radius: 2px;
/deep/ .el-input__inner {
background: none;
border: none;
color: #fff;
}
}
.btn {
margin-left: 46px;
height: 32px;
}
}
</style>

104
src/views/newDataBoard/hengAnZhi/potentialPeople/sjwjj.vue

@ -0,0 +1,104 @@
<template>
<div>
<Breadcrumb :list="breadcrumbList" />
<div class="table">
<el-table :data="list"
v-loading="loading"
element-loading-text="加载中..."
element-loading-spinner="el-icon-loading"
element-loading-background="rgba(0,0,0,0.5)"
>
<el-table-column label="序号" type="index" width="80" />
<el-table-column prop="name" label="上报人" />
<el-table-column prop="mobile" label="上报人电话">
<template slot-scope="scope">
{{ $sensitive(scope.row.mobile, 3, 7) }}
</template>
</el-table-column>
<el-table-column prop="agencyName" label="所属组织"> </el-table-column>
<el-table-column prop="categoryName" label="事件类型" />
<el-table-column prop="eventContent" show-overflow-tooltip label="事件描述" />
<el-table-column prop="latestProcessingStatus" label="最新办理状态" />
<el-table-column prop="latestProcessingTime" sortable label="最近办理时间" />
<el-table-column prop="happenTime" sortable label="事件上报时间" />
<el-table-column sortable label="详情">
<template slot-scope="{ row }">
<el-button type="text" @click="handleView(row)">查看</el-button>
</template>
</el-table-column>
</el-table>
</div>
<Pagination v-show="total > 0" :total="total" :page.sync="queryParams.pageNo" :limit.sync="queryParams.pageSize" @pagination="getList" />
<sjwjj :showDialog="showDialog" :id="rowId" @close="close" />
</div>
</template>
<script>
import Breadcrumb from "@/views/dataBoard/satisfactionEval/components/Breadcrumb";
import Pagination from "@/views/dataBoard/satisfactionEval/components/Pagination";
import Title from "@/views/dataBoard/satisfactionEval/components/Title";
import sjwjj from "@/views/dataBoard/satisfactionEval/potentialPeople/details/sjwjj.vue";
export default {
name: "dissatisfied",
components: { Breadcrumb, Pagination, Title, sjwjj },
data() {
return {
queryParams: {
reportUserId: this.$route.query.reportUserId,
pageNo: 1,
pageSize: 10,
},
total: 0,
breadcrumbList: [
{
path: "/dataBoard/satisfactionEval/index",
name: "满意度评价",
},
{
path: "/dataBoard/satisfactionEval/potentialPeople",
name: "潜在不满意数",
},
{
path: "",
name: "事件未解决数",
},
],
list: [],
showDialog: false,
rowId: "",
loading: true
};
},
activated() {
this.queryParams.reportUserId = this.$route.query.reportUserId;
this.queryParams.pageNo = 1;
this.getList();
},
methods: {
search() {
this.queryParams.pageNo = 1;
this.getList();
},
getList() {
this.loading = true
this.$http.get("/governance/satisfactionDetailList/getEventUnSolvedByUserId?" + this.$paramsFormat(this.queryParams)).then(({ data: { data } }) => {
this.list = data.list;
this.total = data.total;
this.loading = false
});
},
handleView({ id }) {
this.showDialog = true;
this.rowId = id;
},
close() {
this.showDialog = false;
},
},
};
</script>
<style scoped lang="scss">
@import "@/assets/scss/dataBoard/table.scss";
.table {
margin-top: 40px;
}
</style>

128
src/views/newDataBoard/hengAnZhi/potentialPeople/xqwmz.vue

@ -0,0 +1,128 @@
<template>
<div>
<Breadcrumb :list="breadcrumbList"/>
<div class="table">
<el-table :data="list"
v-loading="loading"
element-loading-text="加载中..."
element-loading-spinner="el-icon-loading"
element-loading-background="rgba(0,0,0,0.5)"
>
<el-table-column
label="序号"
type="index"
width="80"/>
<el-table-column
prop="demandUserName"
label="需求人"/>
<el-table-column
prop="demandUserMobile"
label="需求人电话">
<template slot-scope="scope">
{{ $sensitive(scope.row.demandUserMobile, 3, 7) }}
</template>
</el-table-column>
<el-table-column
prop="agencyName"
label="所属组织">
</el-table-column>
<el-table-column
prop="content"
show-overflow-tooltip
label="需求描述"/>
<el-table-column
prop="latestProcessingStatus"
label="最新办理状态"/>
<el-table-column
prop="latestProcessingTime"
sortable
label="最近办理时间"/>
<el-table-column
prop="reportTime"
sortable
label="需求提交时间"/>
<el-table-column
sortable
label="详情">
<template slot-scope="{row}">
<el-button type="text" @click="handleView(row)">查看</el-button>
</template>
</el-table-column>
</el-table>
</div>
<Pagination
v-show="total>0"
:total="total"
:page.sync="queryParams.pageNo"
:limit.sync="queryParams.pageSize"
@pagination="getList"
/>
<xqwmz :showDialog="showDialog" :id="rowId" @close="close"/>
</div>
</template>
<script>
import Breadcrumb from '@/views/dataBoard/satisfactionEval/components/Breadcrumb'
import Pagination from '@/views/dataBoard/satisfactionEval/components/Pagination'
import Title from "@/views/dataBoard/satisfactionEval/components/Title"
import xqwmz from "@/views/dataBoard/satisfactionEval/potentialPeople/details/xqwmz.vue"
export default {
name: "dissatisfied",
components: {Breadcrumb, Pagination, Title, xqwmz},
data() {
return {
queryParams: {
reportUserId: this.$route.query.reportUserId,
pageNo: 1,
pageSize: 10,
},
total: 0,
breadcrumbList: [{
path: '/dataBoard/satisfactionEval/index',
name: '满意度评价'
}, {
path: '/dataBoard/satisfactionEval/potentialPeople',
name: '潜在不满意数'
}, {
path: '',
name: '需求未满足数'
}],
list: [],
showDialog: false,
rowId: '',
loading: true
}
},
activated() {
this.queryParams.reportUserId = this.$route.query.reportUserId
this.queryParams.pageNo = 1
this.getList();
},
methods: {
search() {
this.queryParams.pageNo = 1
this.getList();
},
getList() {
this.loading = true
this.$http.get('/governance/satisfactionDetailList/getUserDemandUnSolvedByUserId?' + this.$paramsFormat(this.queryParams)).then(({data: {data}}) => {
this.list = data.list;
this.total = data.total;
this.loading = false
})
},
handleView({name, id}) {
this.showDialog = true
this.rowId = id
},
close() {
this.showDialog = false
}
}
}
</script>
<style scoped lang="scss">
@import "@/assets/scss/dataBoard/table.scss";
.table {
margin-top: 40px;
}
</style>

115
src/views/newDataBoard/hengAnZhi/potentialPeople/yxwxfw.vue

@ -0,0 +1,115 @@
<template>
<div>
<Breadcrumb :list="breadcrumbList"/>
<div class="table">
<el-table :data="list"
v-loading="loading"
element-loading-text="加载中..."
element-loading-spinner="el-icon-loading"
element-loading-background="rgba(0,0,0,0.5)"
>
<el-table-column label="序号" type="index" width="80"/>
<el-table-column prop="name" label="服务对象姓名"/>
<el-table-column prop="mobile" label="服务对象电话">
<template slot-scope="scope">
{{ $sensitive(scope.row.mobile, 3, 7) }}
</template>
</el-table-column>
<el-table-column prop="organizationName" label="所属组织"></el-table-column>
<el-table-column prop="serviceCategoryName" label="服务类型"/>
<el-table-column prop="remark" show-overflow-tooltip label="服务描述"/>
<el-table-column prop="serviceStatus" sortable label="是否已完成服务"/>
<el-table-column prop="serviceTimeStart" sortable label="服务发起时间"/>
<el-table-column sortable label="详情">
<template slot-scope="{ row }">
<el-button type="text" @click="handleView(row)">查看</el-button>
</template>
</el-table-column>
</el-table>
</div>
<Pagination v-show="total > 0" :total="total" :page.sync="queryParams.pageNo" :limit.sync="queryParams.pageSize"
@pagination="getList"/>
<yxwxfw :showDialog="showDialog" :id="rowId" @close="close"/>
</div>
</template>
<script>
import Breadcrumb from "@/views/dataBoard/satisfactionEval/components/Breadcrumb";
import Pagination from "@/views/dataBoard/satisfactionEval/components/Pagination";
import Title from "@/views/dataBoard/satisfactionEval/components/Title";
import yxwxfw from "@/views/dataBoard/satisfactionEval/potentialPeople/details/yxwxfw.vue";
export default {
name: "dissatisfied",
components: {Breadcrumb, Pagination, Title, yxwxfw},
data() {
return {
queryParams: {
pageNo: 1,
pageSize: 10,
},
total: 0,
breadcrumbList: [
{
path: "/dataBoard/satisfactionEval/index",
name: "满意度评价",
},
{
path: "/dataBoard/satisfactionEval/potentialPeople",
name: "潜在不满意数",
},
{
path: "",
name: "应享未享服务数",
},
],
list: [],
showDialog: false,
rowId: "",
loading: true
};
},
activated() {
this.queryParams.reportUserId = this.$route.query.reportUserId;
this.queryParams.pageNo = 1;
this.getList();
},
methods: {
search() {
this.queryParams.pageNo = 1;
this.getList();
},
getList() {
this.loading = true
this.$http.get("/governance/satisfactionDetailList/getServiceNotEnjoyedByUserId?" + this.$paramsFormat(this.queryParams)).then(({data: {data}}) => {
this.list = data.list;
this.total = data.total;
this.loading = false
});
},
handleView({id}) {
this.showDialog = true;
this.rowId = id;
},
close() {
this.showDialog = false;
},
},
};
</script>
<style scoped lang="scss">
@import "@/assets/scss/dataBoard/table.scss";
.table {
margin-top: 40px;
}
</style>

0
src/views/newDataBoard/hengAnZhi/style/index.scss

Loading…
Cancel
Save