城阳pc工作端前端代码
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

507 lines
18 KiB

<template>
<div class="g-main">
<div>
<div class="m-search">
<el-form :inline="true" :model="formData" ref="ref_searchform" :label-width="'100px'">
<el-form-item label="自评周期">
<el-date-picker v-model="formData.period" type="month" value-format="yyyy-MM" placeholder="选择日期"
style="width: 202px" clearable>
</el-date-picker>
</el-form-item>
<div style="float: right; margin-top:5px">
<el-button style="margin-left: 30px" size="small" type="primary "
@click="handleSearch">查询</el-button>
<el-button style="margin-left: 10px" is-plain class="diy-button--white el-button--default"
size="small" @click="resetSearch">重置</el-button>
</div>
</el-form>
</div>
<div class="m-table">
<div class="div_btn" v-if="btnFlag">
2 years ago
<el-button type="primary" size="small" class="diy-button--white el-button--default"
@click="handleCreateMonthlySurvey">生成本月社区自查问卷表</el-button>
</div>
<div class="m-table-item" :style="{ height: maxTableHeight + 'px', width: '100%' }">
2 years ago
<div>本月已参与调研人数 {{ personQty }}</div>
<section class="content_box">
<div class="left">
<img src="../../../../assets/img/satisfaction/zhdf.png" alt="Image">
<div class="left_right">
2 years ago
<div>{{ synthesisScore }}</div>
<div>综合得分</div>
</div>
<div class="right_box">
<div :class="synthesisState?'up':'down'">
<img src="@/assets/images/index/up.png" alt="" v-if="synthesisState && synthesisScoreBtLastMonth!=0" >
<img src="@/assets/images/index/down.png" alt="" v-if="!synthesisState && synthesisScoreBtLastMonth" >
<span >{{synthesisScoreBtLastMonth || '--'}}</span>
</div>
<div style="color: #999;">较上月</div>
</div>
</div>
<div class="right">
<div class="box" v-for="(item, index) in score" :key="index">
<div class="card">
<img :src="item.imgUrl" alt="Image">
<div class="right_right">
<div>{{ item.score }}</div>
<div>{{ item.satisfactionCategoryName }}</div>
</div>
<div class="right_box">
<div>
<img src="@/assets/images/index/up.png" alt="" v-if="item.state && item.scoreDiffBtLastMonth!=0" >
<img src="@/assets/images/index/down.png" alt="" v-if="!item.state && item.scoreDiffBtLastMonth!=0" >
<span :class="item.state?'up':'down'">{{item.scoreDiffBtLastMonth}}</span>
</div>
<div style="color: #999;">较上月</div>
</div>
</div>
</div>
</div>
</section>
<div id="myCharts"></div>
</div>
<div>
</div>
</div>
</div>
<el-dialog v-if="showFormList && user.level == 'community'" :visible.sync="showFormList" :close-on-click-modal="false"
:close-on-press-escape="false" title="社区自查" :modal-append-to-body="false" width="820px" top="5vh"
2 years ago
class="dialog-h" @closed="showFormList = false">
<form-list ref="ref_add_form" @handleClose="handleClose" :satisfactionCategoryStr="satisfactionCategoryStr"
@handelDetail="handelDetail" @handelFollowUpList="handelFollowUpList" :period="formData.period" :seriesName="seriesName" :inspRecordId="inspRecordId"></form-list>
2 years ago
<el-dialog width="920px" class="dialog-h" title="社区自查报告详情" :close-on-click-modal="false"
v-if="showFollowUpDetail" :visible.sync="showFollowUpDetail" append-to-body>
<follow-Detail :period="formData.period" :inspResultId="inspResultId" @handleClose="showFollowUpDetail = false"></follow-Detail>
2 years ago
</el-dialog>
<el-dialog width="820px" class="dialog-h" title="回访记录" :close-on-click-modal="false" v-if="showFollowUpList"
:visible.sync="showFollowUpList" append-to-body>
<follow-list :id="inspResultId"></follow-list>
2 years ago
</el-dialog>
</el-dialog>
2 years ago
<el-dialog title="调查问卷" :visible.sync="showTduckImage" width="550px">
<el-image :src="qrCodeImgUrl">
<div slot="placeholder" class="image-slot">
加载中<span class="dot">...</span>
</div>
</el-image>
2 years ago
<div>
<span>问卷链接</span> {{ questionnaireUrl }}
</div>
<span slot="footer" class="dialog-footer">
</span>
</el-dialog>
</div>
</template>
<script>
import { requestPost, requestGet } from "@/js/dai/request";
import { mapGetters } from "vuex";
import * as echarts from "echarts";
import formList from "./formList";
import followList from "./followList";
import followDetail from "./followUpDetail";
import util from "@js/util.js";
export default {
2 years ago
components: { formList, followList, followDetail },
data() {
return {
searchH: 20,
2 years ago
formData: {
period: "",//月份
},
inspRecordId: "",
multiSelection: [], // 多选结果
dicts: {
satisfaction_category: [],
}, //字典对象
myChart: {},
option: {
tooltip: {
trigger: "axis",
},
legend: {
data: ["满意", "基本满意", "不满意"],
bottom: "10%",
icon: "rect",
itemWidth: 20,
itemHeight: 5,
itemGap: 20,
},
grid: {
left: "3%",
right: "4%",
bottom: "25%",
containLabel: true,
},
toolbox: {},
2 years ago
xAxis: {
type: "category",
boundaryGap: true,
axisLine: {
show: true
},
axisTick: {
show: false
},
data: [], // 请将yourDataArray替换为您的x轴数据数组
splitLine: {
show: true,
lineStyle: {
width: 60, // 设置阴影的宽度
color: "#000",
2 years ago
opacity: 0
},
2 years ago
// 控制间隔,这里设置为2表示左右两侧有间隔,可以根据需要调整
},
2 years ago
},
2 years ago
yAxis: {
type: "value",
name: "单位(个)",
min: 0,
2 years ago
},
series: [
{
name: "满意",
type: "bar",
data: [],
barWidth: 16, // 设置柱子宽度
itemStyle: {
color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [
{ offset: 0, color: "#2c7cf2" }, // 从顶部开始
{ offset: 1, color: "#80b3ff" }, // 到底部结束
]),
},
},
{
name: "基本满意",
type: "bar",
data: [],
barWidth: 16, // 设置柱子宽度
itemStyle: {
color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [
{ offset: 0, color: "#3ca267" }, // 从顶部开始
{ offset: 1, color: "#82cca0" }, // 到底部结束
]),
},
},
{
name: "不满意",
type: "bar",
data: [],
barWidth: 16, // 设置柱子宽度
itemStyle: {
color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [
{ offset: 0, color: "#edb42d" }, // 从顶部开始
{ offset: 1, color: "#ffd981" }, // 到底部结束
]),
},
},
],
},
2 years ago
satisfactionCategory: [],//类目
satisfactionCategoryName: [],
score: [], //综合得分
showFormList: false, //自查列表弹框
showFollowUpDetail: false,//自查列表中查看弹框
showFollowUpList: false,//回访记录弹框
2 years ago
showTduckImage: false,
2 years ago
qrCodeImgUrl: '',//生成二维码图片链接
questionnaireUrl: '',
synthesisScore: '',
2 years ago
personQty: '',
inspResultId:"",
btnFlag:true,
synthesisState:false,
synthesisScoreBtLastMonth:null,
};
},
computed: {
maxTableHeight() {
const h = this.clientHeight - this.searchH - 330 + this.iframeHeight;
const _h = this.clientHeight - 330 - this.searchH;
return this.$store.state.inIframe ? h : _h;
},
...mapGetters(["clientHeight", "iframeHeight"]),
},
watch: {},
async mounted() {
this.user = this.$store.state.user;
this.agencyId = this.user.agencyId;
if(this.user.level != 'community'){
this.btnFlag = false
}
await this.getDicts();
await this.getTableData();
2 years ago
await this.initEcharts();
},
2 years ago
created() {
let date = new Date()
2 years ago
this.formData.period = util.formatDate(date, 'yyyy-MM')
},
activated() {
this.handleWindowResize()
},
methods: {
// ------------------------------------字典------------------------------------------
async getDicts() {
try {
const requests = [
this.$http.post("sys/dict/data/dictlist", {
dictType: "satisfaction_category",
}),
];
const dictKeys = ["satisfaction_category"]; // 对应的键名
const results = await Promise.all(requests);
results.forEach((result, index) => {
if (result.data.code === 0) {
this.dicts[dictKeys[index]].push(...result.data.data);
} else {
console.log(`获取${dictKeys[index]}失败: ${result.data.msg}`);
}
});
} catch (error) {
console.log("获取字典失败: ", error);
}
},
// ------------------------------------事件------------------------------------------
2 years ago
handelDetail(id) {
this.showFollowUpDetail = true;
2 years ago
this.inspResultId = id
},
handelFollowUpList(id) {
this.showFollowUpList = true;
this.inspResultId = id
},
2 years ago
async handleCreateMonthlySurvey() {
try {
let url = '/governance/satisfaction/communitySelfInsp/generateQuestionnaire'
2 years ago
const { data, code } = await requestPost(url)
if (code == 0) {
this.showTduckImage = true
this.qrCodeImgUrl = data.qrCodeImgUrl
this.questionnaireUrl = data.questionnaireUrl
}
2 years ago
} catch (err) {
console.log(err);
}
},
initEcharts() {
this.myChart = echarts.init(document.getElementById("myCharts"));
this.myChart.setOption(this.option);
let than = this;
this.myChart.on("click", function (params) {
2 years ago
than.handelClickChart(params.name,params.seriesName);
});
this.$nextTick(()=>{
window.addEventListener("resize", this.handleWindowResize);
})
},
handleWindowResize() {
if (this.myChart) {
this.myChart.resize();
}
},
2 years ago
handelClickChart(name,seriesName) {
this.showFormList = true;
this.satisfactionCategoryStr = this.dicts.satisfaction_category.filter(
(item) => item.label == name
)[0].value;
2 years ago
this.seriesName = seriesName == '满意'?'veryGood':seriesName == '基本满意'?'good':'bad';
},
handleClose() {
this.showFormList = false;
2 years ago
this.showFollowUpDetail = false
},
// 搜索事件
handleSearch(val) {
this.getTableData();
},
async getTableData() {
try {
// const url = "/governance/satisfaction/communitySelfInsp/stats/synthesis/superior";
// const { formData } = this;
// let agencyId = this.$store.state.user.agencyId;
// const { data, msg } = await requestGet(url, { ...formData,agencyId });
const url = "/governance/satisfaction/communitySelfInsp/stats/synthesis";
const { formData } = this;
const { data, msg } = await requestGet(url, { ...formData });
// 清空数组和属性值
this.total = data.total || 0;
this.score = [];
this.option.series.forEach(series => series.data = []);
this.option.xAxis.data = [];
this.tableData = data.categoryDatas || [];
this.satisfactionCategory = [];
this.inspRecordId = data.inspRecordId;
this.synthesisScore = data.synthesisScore;
this.synthesisScoreBtLastMonth = data.synthesisScoreBtLastMonth;
this.synthesisState = this.synthesisScoreBtLastMonth >= 0;
if (this.synthesisScoreBtLastMonth < 0) {
this.synthesisScoreBtLastMonth = Math.abs(this.synthesisScoreBtLastMonth);
}
this.personQty = data.personQty;
const allowedCategories = this.dicts.satisfaction_category.map(item => item.value);
for (const item of this.tableData) {
if (allowedCategories.includes(item.satisfactionCategory)) {
this.option.series[0].data.push(item.veryGoodQty);
this.option.series[1].data.push(item.goodQty);
this.option.series[2].data.push(item.badQty);
this.option.xAxis.data.push(item.satisfactionCategoryName);
this.satisfactionCategory.push(item.satisfactionCategory);
this.score.push({
score: item.score,
satisfactionCategoryName: item.satisfactionCategoryName,
imgUrl: require(`@/assets/img/satisfaction/${item.satisfactionCategory}.png`),
scoreDiffBtLastMonth: item.scoreDiffBtLastMonth,
state: item.scoreDiffBtLastMonth >= 0
2 years ago
});
if (item.scoreDiffBtLastMonth < 0) {
item.scoreDiffBtLastMonth = Math.abs(item.scoreDiffBtLastMonth);
}
2 years ago
}
}
this.myChart.setOption(this.option);
} catch (error) {
console.log(error);
}
},
// 重置
resetSearch() {
this.formData = {};
this.getTableData();
},
},
props: {},
};
</script>
<style lang="scss" scoped>
@import "@/assets/scss/buttonstyle.scss";
@import "@/assets/scss/modules/management/list-main.scss";
@import "@/assets/scss/modules/shequzhili/event-info.scss";
.div_btn_left>* {
margin-right: 10px;
}
.m-table-item {
display: flex;
flex-direction: column;
}
.content_box {
display: flex;
height: 160px;
margin-top: 24px;
.left {
background: #f7faff;
margin-right: 10px;
min-width: 300px;
display: flex;
align-items: center;
justify-content: center;
border-radius: 5px;
padding: 10px;
box-sizing: border-box;
img {
margin-right: 8px;
}
}
img {
width: 50px;
height: 50px;
margin-right: 15px;
}
.left_right,
.right_right {
display: flex;
flex-direction: column;
flex: 1;
:nth-child(1) {
font-size: 18px;
font-family: PingFang SC;
font-weight: bold;
color: #333333;
}
:nth-child(2) {
font-size: 14px;
font-family: PingFang SC;
color: #666666;
}
}
.right_box{
img{
margin: 0;
width:10px;
height:14px;
}
.down{
color:#FF7135 ;
}
.up{
color:#00BB72 ;
}
}
.right {
flex: 1;
display: grid;
grid-template-columns: repeat(4, 1fr);
.box {
height: 75px;
margin: 0 10px 10px 0;
.card {
background: #f7faff;
width: 100%;
height: 100%;
display: flex;
align-items: center;
border-radius: 5px;
padding: 20px;
box-sizing: border-box;
}
}
}
}
#myCharts {
width: 100%;
flex: 1;
}
</style>