Browse Source

Merge branch 'jw_feature_zhangruochen' into jw_feature_dev

feature
张若晨 2 years ago
parent
commit
4901dea74b
  1. 5019
      src/views/components/resiInfo.vue
  2. 29
      src/views/dataBoard/satisfactionEval/components/Title/index.vue
  3. 2696
      src/views/modules/base/resi.vue
  4. 79
      src/views/modules/satisfaction/communitySelfInsp/followUpDetail.vue
  5. 144
      src/views/modules/satisfaction/communitySelfInsp/formList.vue
  6. 326
      src/views/modules/satisfaction/communitySelfInsp/index.vue
  7. 49
      src/views/modules/satisfaction/detail/eventInfo.vue
  8. 530
      src/views/modules/satisfaction/detail/index.vue
  9. 26
      src/views/modules/satisfaction/satisfactionProvince/index.vue
  10. 38
      src/views/modules/shequzhili/event/cpts/add.vue
  11. 164
      src/views/modules/shequzhili/event/cpts/event-detail.vue
  12. 25
      src/views/modules/shequzhili/event/cpts/event-info.vue
  13. 41
      src/views/modules/shequzhili/event/eventList.vue

5019
src/views/components/resiInfo.vue

File diff suppressed because it is too large

29
src/views/dataBoard/satisfactionEval/components/Title/index.vue

@ -1,8 +1,8 @@
<template>
<div class="title">
<span class="text">
<span class="txt">{{ text }}</span>
<span class="text-shadow">{{ text }}</span>
<span class="txt">{{ text }}</span>
<span class="text-shadow">{{ text }}</span>
</span>
<slot></slot>
</div>
@ -14,17 +14,18 @@ export default {
props: {
text: {
type: String,
default: ''
}
}
}
default: "",
},
},
};
</script>
<style scoped lang="scss">
.title {
background: linear-gradient(90deg, rgba(31, 126, 255, 0.28) 0%, rgba(13, 113, 248, 0) 70%);
padding: 10px 8px;
background: url(../../../../../assets/images/shuju/overview/title-bg.png)
no-repeat 0 0 fixed;
padding: 8px 16px 8px 32px;
display: flex;
align-items: center;
justify-content: space-between;
@ -36,8 +37,8 @@ export default {
font-weight: 400;
.txt {
color: #1F79FF;
background: linear-gradient(0deg, #2DC1FF 0%, #FFFFFF 58.5205078125%);
color: #1f79ff;
background: linear-gradient(0deg, #2dc1ff 0%, #ffffff 58.5205078125%);
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
position: relative;
@ -48,11 +49,9 @@ export default {
top: 4px;
left: 3px;
position: absolute;
color: #020F21;
color: #020f21;
white-space: nowrap;
}
}
}
</style>
</style>

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

File diff suppressed because it is too large

79
src/views/modules/satisfaction/communitySelfInsp/followUpDetail.vue

@ -1,28 +1,51 @@
<template>
<div class='g-main dialog-h-content'>
<h3>海伦路路社区8月份满意度调查</h3>
<h3>{{agencyName}}{{period.substr(5,2)}}月份满意度调查</h3>
<p>尊敬的居民朋友</p>
<p style="text-indent: 2em; ">为了更好地推进社区工作为您提供更全面优质的服务请您根据真实情况填写此表我们将认真对待您提出的问题并承诺对您提供的信息保密感谢您的配合</p>
<div class="card" v-for="(item, index) in formList" :key="index">
<p>{{ index + 1 }}您对本社区的{{ item.label }}是否满意</p>
<section class="f-hflex">
<el-radio class="f-bot16" v-model.trim="form[item.pkey]" label="veryGood">满意</el-radio>
<el-radio class="f-bot16" v-model.trim="form[item.pkey]" label="good">基本满意</el-radio>
<el-radio class="f-bot16" v-model.trim="form[item.pkey]" label="bad">不满意</el-radio>
<el-radio class="f-bot16" v-model.trim="form[item.pkey]" disabled label="veryGood">满意</el-radio>
<el-radio class="f-bot16" v-model.trim="form[item.pkey]" disabled label="good">基本满意</el-radio>
<el-radio class="f-bot16" v-model.trim="form[item.pkey]" disabled label="bad">不满意</el-radio>
</section>
<p>{{ index + 1 }}.1您具体对那些方面不满意</p>
<section class="f-hflex" v-for="(itemK, indexK) in item.children">
<el-radio class="f-bot16" v-model.trim="form[item.value]" :label="itemK.value"
@change="caca">{{ itemK.label }}</el-radio>
<el-input v-if="indexK == item.children.length -1 && form[item.pkey] == 'bad'" placeholder="请填写不满意原因" v-model.trim="form[item.reason]"></el-input>
<el-radio class="f-bot16" v-model.trim="form[item.value]" :label="itemK.value" disabled
>{{ itemK.label }}</el-radio>
<el-input v-if="indexK == item.children.length -1 && form[item.pkey] == 'bad'" disabled placeholder="请填写不满意原因" v-model.trim="form[item.reason]"></el-input>
</section>
</div>
<p>8姓名{{form.reporterName}}</p>
<p>9电话{{form.reporterMobile}}</p>
<p>10姓名{{form.reporterName}}</p>
<p>11您是否接受回访</p>
<section class="f-hflex">
<el-radio class="f-bot16" v-model="form.followUpStatus" disabled :label="-2">未知</el-radio>
<el-radio class="f-bot16" v-model="form.followUpStatus" disabled :label="-1">不接受回访</el-radio>
<el-radio class="f-bot16" v-model="form.followUpStatus" disabled :label="0">接受回访/待回访</el-radio>
<el-radio class="f-bot16" v-model="form.followUpStatus" disabled :label="1">已回访</el-radio>
</section>
<p v-if="form.followUpStatus === 0">12请选择合适您的回访方式</p>
<section class="f-hflex" v-if="form.followUpStatus === 0">
<el-radio class="f-bot16" v-model="form.expectFollowUpWay" disabled label="0">未知</el-radio>
<el-radio class="f-bot16" v-model="form.expectFollowUpWay" disabled label="1">电话回访</el-radio>
<el-radio class="f-bot16" v-model="form.expectFollowUpWay" disabled label="2">上门回访</el-radio>
</section>
<p >请填写您的家庭住址</p>
<el-input v-model="form.resideAddress" disabled></el-input>
<el-row type="flex" justify="end" class="f-top12">
<el-col :span="2">
<el-button @click="handleClose"> 取消</el-button>
</el-col>
</el-row>
</div>
</template>
<script>
import { requestGet } from "@/js/dai/request";
export default {
//
data() {
@ -64,13 +87,23 @@ export default {
socialAssistanceReason: '',
oldPeopleProvideReason: '',
medicalReason: '',
}
//
reporterName:'',
reporterMobile:'',
followUpStatus: null,
expectFollowUpWay:'',
resideAddress:'',
},
agencyName:this.$store.state.user.agencyName,
};
},
//
async created() {
console.log(this.period);
await this.getDicts()
await this.handleArr()
await this.getInspResult()
},
//
methods: {
@ -96,10 +129,7 @@ export default {
this.formList = transformArray(this.dicts.satisfaction_ns_aspect);
console.log(this.formList);
},
caca(val){
console.log(val);
},
async getDicts() {
try {
const requests = [
@ -121,6 +151,19 @@ export default {
console.log("获取字典失败: ", error);
}
},
async getInspResult(){
const url = `/governance/satisfaction/communitySelfInsp/inspResult/detail/${this.inspResultId}`
const {data,code,msg} = await requestGet(url)
if(code == 0){
this.form = {...data.reporter,...data.satisfaction}
console.log(this.form);
}else{
this.$message.error(msg)
}
},
handleClose(){
this.$emit('handleClose')
}
},
//
components: {},
@ -128,6 +171,16 @@ export default {
computed: {},
//
watch: {},
props:{
inspResultId:{
type:String,
default:''
},
period:{
type:String,
default:''
}
}
}
</script>

144
src/views/modules/satisfaction/communitySelfInsp/formList.vue

@ -17,42 +17,67 @@
</el-option>
</el-select>
</el-form-item>
<el-button size="small" type="primary "
@click="handleSearch">查询</el-button>
</el-form>
<el-button type="primary" @click="xinzneg" >查看</el-button>
<el-button type="primary" @click="bianji" >回访记录</el-button>
<!-- <el-button type="primary" @click="xinzneg" >查看</el-button>
<el-button type="primary" @click="bianji" >回访记录</el-button> -->
<el-table class="m-table-item" :data="tableData" style="width: 100%">
<el-table-column label="序号" header-align="center" align="center" type="index" width="50"></el-table-column>
<el-table-column label="填写时间" prop="createdTime" header-align="center" align="center" type="index"
width="100"></el-table-column>
<el-table-column label="姓名" prop="reporterName" header-align="center" align="center" type="index"
width="50"></el-table-column>
<el-table-column label="联系电话" prop="reporterMobile" header-align="center" align="center" type="index"
width="80"></el-table-column>
<el-table-column label="回访方式" prop="followUpWay" header-align="center" align="center" type="index"
width="100"></el-table-column>
<el-table-column label="文化设施" prop="evaCulturalFacility" header-align="center" align="center" type="index"
width="80"></el-table-column>
<el-table-column label="体育设施" prop="evaSportsFacility" header-align="center" align="center" type="index"
width="80"></el-table-column>
<el-table-column label="生态环境" prop="evaEcologicalEnv" header-align="center" align="center" type="index"
width="80"></el-table-column>
<el-table-column label="社会治安" prop="evaSocialSecurity" header-align="center" align="center" type="index"
width="80"></el-table-column>
<el-table-column label="社会救助" prop="evaSocialAssistance" header-align="center" align="center" type="index"
width="80"></el-table-column>
<el-table-column label="老有所养" prop="evaOldPeopleProvide" header-align="center" align="center" type="index"
width="80"></el-table-column>
<el-table-column label="基础教育" prop="evaBasicEducation" header-align="center" align="center" type="index"
width="80"></el-table-column>
<el-table-column label="病有所医" prop="evaMedical" header-align="center" align="center" type="index"
width="80"></el-table-column>
<el-table-column label="回访状态" prop="followUpStatus" header-align="center" align="center" type="index"
width="80"></el-table-column>
<el-table-column label="姓名" prop="reporterName" header-align="center" align="center" width="80" show-overflow-tooltip>
</el-table-column>
<el-table-column label="联系电话" prop="reporterMobile" header-align="center" align="center"
width="120"></el-table-column>
<el-table-column label="回访方式" prop="followUpWay" header-align="center" align="center"
width="100">
<template slot-scope="scope">
{{scope.row.followUpWay?scope.row.followUpWay =='1'?'电话回访':scope.row.followUpWay == '2'?'上门回访':'':''}}
</template>
</el-table-column>
<el-table-column label="文化设施" prop="evaCulturalFacility" header-align="center" align="center" width="80">
<template slot-scope="scope">
{{ satisfactionCategory(scope.row, 'evaCulturalFacility') }}
</template>
</el-table-column>
<el-table-column label="体育设施" prop="evaSportsFacility" header-align="center" align="center" width="80">
<template slot-scope="scope">
{{ satisfactionCategory(scope.row, 'evaSportsFacility') }}
</template></el-table-column>
<el-table-column label="生态环境" prop="evaEcologicalEnv" header-align="center" align="center" width="80"> <template
slot-scope="scope">
{{ satisfactionCategory(scope.row, 'evaEcologicalEnv') }}
</template> </el-table-column>
<el-table-column label="社会治安" prop="evaSocialSecurity" header-align="center" align="center" width="80">
<template slot-scope="scope">
{{ satisfactionCategory(scope.row, 'evaSocialSecurity') }}
</template> </el-table-column>
<el-table-column label="社会救助" prop="evaSocialAssistance" header-align="center" align="center" width="80">
<template slot-scope="scope">
{{ satisfactionCategory(scope.row, 'evaSocialAssistance') }}
</template> </el-table-column>
<el-table-column label="老有所养" prop="evaOldPeopleProvide" header-align="center" align="center" width="80">
<template slot-scope="scope">
{{ satisfactionCategory(scope.row, 'evaOldPeopleProvide') }}
</template> </el-table-column>
<el-table-column label="基础教育" prop="evaBasicEducation" header-align="center" align="center" width="80">
<template slot-scope="scope">
{{ satisfactionCategory(scope.row, 'evaBasicEducation') }}
</template> </el-table-column>
<el-table-column label="病有所医" prop="evaMedical" header-align="center" align="center" width="80"> <template
slot-scope="scope">
{{ satisfactionCategory(scope.row, 'evaMedical') }}
</template> </el-table-column>
<el-table-column label="回访状态" prop="followUpStatus" header-align="center" align="center" show-overflow-tooltip width="80"> <template
slot-scope="scope" >
{{ scope.row.followUpStatus!= null?scope.row.followUpStatus == -1 ?'不接受回访':scope.row.followUpStatus == 1 ?'已回访':'接受回访/未回访':'--' }}
</template> </el-table-column>
<el-table-column fixed="right" label="操作" align="center" width="220">
<template slot-scope="scope">
<el-button @click="handleDetail(scope.row)" type="text" size="small">查看</el-button>
<el-button @click="handleEdit(scope.row)" type="text" size="small">回访记录</el-button>
<el-button @click="handelFollowUpList(scope.row)" type="text" size="small">回访记录</el-button>
</template>
</el-table-column>
</el-table>
@ -86,21 +111,29 @@ export default {
};
},
//
created() {},
created() { },
async mounted() {
await this.getDicts()
await this.getTableData()
if (this.satisfactionCategoryStr) {
this.formData.satisfactionCategory = this.satisfactionCategoryStr
this.formData.inspRecordId = this.inspRecordId
this.formData.satisfactionLevel = this.seriesName
}
await this.getDicts()
await this.getTableData()
},
//
methods: {
xinzneg(){
this.$emit('handelDetail',true)
handleDetail(row) {
this.$emit('handelDetail', row.id)
},
handelFollowUpList() {
this.$emit('handelFollowUpList', true)
},
bianji(){
this.$emit('handelFollowUpList',true)
satisfactionCategory(row, name) {
if (row[name]) {
let text = this.dicts.satisfaction_level.find(item => item.value === row[name]).label
return text
}
},
async getDicts() {
try {
@ -136,23 +169,22 @@ export default {
this.pageNo = val;
this.getTableData();
},
handleSearch(){
this.getTableData()
},
async getTableData() {
try {
let params = {
...this.formData,
pageNo: this.currentPage,
pageSize: this.pageSize,
};
let url = '/governance/satisfaction/communitySelfInsp/inspResult/list'
const { data, code, msg } = await requestGet(url, params)
if (code == 0) {
this.tableData = data.data;
this.total = data.total;
} else {
console.log(err);
}
} catch (err) {
console.log(err);
let params = {
...this.formData,
pageNo: this.pageNo,
pageSize: this.pageSize,
};
let url = '/governance/satisfaction/communitySelfInsp/inspResult/list'
const { data, code, msg } = await requestGet(url, params)
if (code == 0) {
this.tableData = data.list;
this.total = data.total;
} else {
this.$message.error(msg)
}
},
},
@ -165,7 +197,15 @@ export default {
type: String,
default: ''
},
period:{
period: {
type: String,
default: ''
},
inspRecordId: {
type: String,
default: ''
},
seriesName: {
type: String,
default: ''
}

326
src/views/modules/satisfaction/communitySelfInsp/index.vue

@ -5,8 +5,6 @@
<div class="m-search">
<el-form :inline="true" :model="formData" ref="ref_searchform" :label-width="'100px'">
<el-form-item label="自评周期">
<!-- <el-input v-model="formData.name" placeholder="请输入" size="small" class="u-item-width-normal"
clearable></el-input> -->
<el-date-picker v-model="formData.period" type="date" value-format="yyyy-MM" placeholder="选择日期"
style="width: 202px" clearable>
</el-date-picker>
@ -23,16 +21,16 @@
<div class="m-table">
<div class="div_btn">
<el-button type="primary" size="small"
class="diy-button--white el-button--default" @click="handleCreateMonthlySurvey">生成本月社区自查问卷表</el-button>
<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%' }">
<div>本月已参与调研人数 500</div>
<div>本月已参与调研人数 {{ personQty }}</div>
<section class="content_box">
<div class="left">
<img src="../../../../assets/img/satisfaction/zhdf.png" alt="Image">
<div class="left_right">
<div>85.12</div>
<div>{{ synthesisScore }}</div>
<div>综合得分</div>
</div>
</div>
@ -57,32 +55,29 @@
</div>
<el-dialog v-if="showFormList" :visible.sync="showFormList" :close-on-click-modal="false"
:close-on-press-escape="false" title="社区自查" :modal-append-to-body="false" width="820px" top="5vh"
class="dialog-h" @closed="showFormList = false" >
class="dialog-h" @closed="showFormList = false">
<form-list ref="ref_add_form" @handleClose="handleClose" :satisfactionCategoryStr="satisfactionCategoryStr"
@handelDetail="handelDetail" @handelFollowUpList="handelFollowUpList" :period="formData.period"></form-list>
<el-dialog width="920px" class="dialog-h" title="社区自查报告详情" :close-on-click-modal="false"
v-if="showFollowUpDetail" :visible.sync="showFollowUpDetail" append-to-body >
<follow-Detail></follow-Detail>
</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></follow-list>
</el-dialog>
@handelDetail="handelDetail" @handelFollowUpList="handelFollowUpList" :period="formData.period" :seriesName="seriesName" :inspRecordId="formData.inspRecordId"></form-list>
<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="handleClose"></follow-Detail>
</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></follow-list>
</el-dialog>
</el-dialog>
<el-dialog title="调查问卷"
:visible.sync="showTduckImage"
width="550px">
<el-image :src="qrCodeImgUrl">
<div slot="placeholder" class="image-slot">
加载中<span class="dot">...</span>
</div>
<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>
<div>
<span>问卷链接</span> {{questionnaireUrl}}
</div>
<span slot="footer"
class="dialog-footer">
</span>
<div>
<span>问卷链接</span> {{ questionnaireUrl }}
</div>
<span slot="footer" class="dialog-footer">
</span>
</el-dialog>
</div>
</template>
@ -96,12 +91,12 @@ import followDetail from "./followUpDetail";
import util from "@js/util.js";
export default {
components: { formList, followList,followDetail },
components: { formList, followList, followDetail },
data() {
return {
searchH: 20,
formData: {
period: "",//
inspRecordId: "",
@ -133,7 +128,7 @@ export default {
containLabel: true,
},
toolbox: {},
xAxis: {
type: "category",
boundaryGap: true,
@ -149,19 +144,19 @@ export default {
lineStyle: {
width: 60, //
color: "#000",
opacity:0
opacity: 0
},
// 2
// 2
},
},
yAxis: {
type: "value",
name: "单位(个)",
min: 0,
},
series: [
{
@ -202,7 +197,7 @@ export default {
},
],
},
satisfactionCategory: [],//
satisfactionCategoryName: [],
score: [], //
@ -210,10 +205,14 @@ export default {
showFormList: false, //
showFollowUpDetail: false,//
showFollowUpList: false,//访
showTduckImage:false,
showTduckImage: false,
qrCodeImgUrl: '',//
questionnaireUrl: '',
synthesisScore: '',
personQty: '',
qrCodeImgUrl:'',//
questionnaireUrl:''
inspResultId:""
};
},
@ -231,11 +230,16 @@ export default {
this.agencyId = this.user.agencyId;
await this.getDicts();
await this.getTableData();
await this.initEcharts();
this.$nextTick(() => {
this.initEcharts();
})
},
created(){
created() {
let date = new Date()
this.formData.period = util.formatDate(date,'yyyy-MM')
this.formData.period = util.formatDate(date, 'yyyy-MM')
},
activated() {
this.handleWindowResize()
},
methods: {
// ------------------------------------------------------------------------------
@ -261,22 +265,23 @@ export default {
}
},
// ------------------------------------------------------------------------------
handelDetail() {
handelDetail(id) {
this.showFollowUpDetail = true;
this.inspResultId = id
},
handelFollowUpList() {
this.showFollowUpList = true;
},
async handleCreateMonthlySurvey(){
try{
async handleCreateMonthlySurvey() {
try {
let url = '/governance/satisfaction/communitySelfInsp/generateQuestionnaire'
const {data,code} = await requestPost(url)
if(code == 0){
const { data, code } = await requestPost(url)
if (code == 0) {
this.showTduckImage = true
this.qrCodeImgUrl = data.qrCodeImgUrl
this.questionnaireUrl = data.questionnaireUrl
}
}catch(err){
} catch (err) {
console.log(err);
}
},
@ -285,12 +290,8 @@ export default {
this.myChart.setOption(this.option);
let than = this;
this.myChart.on("click", function (params) {
// console.log(params.name); //
// console.log(params.data); //
// console.log(params.seriesName); //
than.handelClickChart(params.name);
than.handelClickChart(params.name,params.seriesName);
});
window.addEventListener("resize", this.handleWindowResize);
},
handleWindowResize() {
@ -298,14 +299,16 @@ export default {
this.myChart.resize();
}
},
handelClickChart(name) {
handelClickChart(name,seriesName) {
this.showFormList = true;
this.satisfactionCategoryStr = this.dicts.satisfaction_category.filter(
(item) => item.label == name
)[0].value;
this.seriesName = seriesName == '满意'?'veryGood':seriesName == '基本满意'?'good':'bad';
},
handleClose() {
this.showFormList = false;
this.showFollowUpDetail = false
},
//
handleSearch(val) {
@ -315,113 +318,116 @@ export default {
//
async getTableData() {
this.tableLoading = true;
this.tableData = [
{
satisfactionCategory: "culturalFacility",
satisfactionCategoryName: "文化设施",
score: "20",
badQty: 40,
goodQty: 20,
veryGoodQty: 30,
},
{
satisfactionCategory: "sportsFacility",
satisfactionCategoryName: "体育设施",
score: "50",
badQty: 40,
goodQty: 20,
veryGoodQty: 30,
},
{
satisfactionCategory: "ecologicalEnv",
satisfactionCategoryName: "生态环境",
score: "50",
badQty: 40,
goodQty: 20,
veryGoodQty: 30,
},
{
satisfactionCategory: "socialSecurity",
satisfactionCategoryName: "社会治安",
score: "50",
badQty: 40,
goodQty: 20,
veryGoodQty: 30,
},
{
satisfactionCategory: "socialAssistance",
satisfactionCategoryName: "社会救助",
score: "50",
badQty: 40,
goodQty: 20,
veryGoodQty: 30,
},
{
satisfactionCategory: "oldPeopleProvide",
satisfactionCategoryName: "老有所养",
score: "50",
badQty: 40,
goodQty: 20,
veryGoodQty: 30,
},
{
satisfactionCategory: "basicEducation",
satisfactionCategoryName: "基础教育",
score: "50",
badQty: 40,
goodQty: 20,
veryGoodQty: 30,
},
{
satisfactionCategory: "medical",
satisfactionCategoryName: "病有所医",
score: "50",
badQty: 40,
goodQty: 20,
veryGoodQty: 30,
},
];
const allowedCategories = this.dicts.satisfaction_category.map(
(item) => item.value
);
this.tableData.forEach((item) => {
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`),
});
}
});
console.log(this.score, "综合得分");
// const url = "/governance/satisfaction/communitySelfInsp/stats/synthesis";
// const { formData } = this;
// const { data, code, msg } = await requestGet(url, {...formData});
// this.tableLoading = false;
// if (code === 0) {
// this.total = data.total || 0;
// this.tableData = data.categoryDatas;
// const allowedCategories = this.dicts.satisfaction_category.map(item => item.value)
// this.tableData.forEach(item => {
// this.tableLoading = true;
// this.tableData = [
// {
// satisfactionCategory: "culturalFacility",
// satisfactionCategoryName: "",
// score: "20",
// badQty: 40,
// goodQty: 20,
// veryGoodQty: 30,
// },
// {
// satisfactionCategory: "sportsFacility",
// satisfactionCategoryName: "",
// score: "50",
// badQty: 40,
// goodQty: 20,
// veryGoodQty: 30,
// },
// {
// satisfactionCategory: "ecologicalEnv",
// satisfactionCategoryName: "",
// score: "50",
// badQty: 40,
// goodQty: 20,
// veryGoodQty: 30,
// },
// {
// satisfactionCategory: "socialSecurity",
// satisfactionCategoryName: "",
// score: "50",
// badQty: 40,
// goodQty: 20,
// veryGoodQty: 30,
// },
// {
// satisfactionCategory: "socialAssistance",
// satisfactionCategoryName: "",
// score: "50",
// badQty: 40,
// goodQty: 20,
// veryGoodQty: 30,
// },
// {
// satisfactionCategory: "oldPeopleProvide",
// satisfactionCategoryName: "",
// score: "50",
// badQty: 40,
// goodQty: 20,
// veryGoodQty: 30,
// },
// {
// satisfactionCategory: "basicEducation",
// satisfactionCategoryName: "",
// score: "50",
// badQty: 40,
// goodQty: 20,
// veryGoodQty: 30,
// },
// {
// satisfactionCategory: "medical",
// satisfactionCategoryName: "",
// score: "50",
// badQty: 40,
// goodQty: 20,
// veryGoodQty: 30,
// },
// ];
// const allowedCategories = this.dicts.satisfaction_category.map(
// (item) => item.value
// );
// this.tableData.forEach((item) => {
// 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`) });
// 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`),
// });
// }
// });
// } else {
// this.$message.error(msg);
// }
// console.log(this.score, "");
const url = "/governance/satisfaction/communitySelfInsp/stats/synthesis";
const { formData } = this;
const { data, code, msg } = await requestGet(url, { ...formData });
this.tableLoading = false;
if (code === 0) {
this.total = data.total || 0;
this.tableData = data.categoryDatas;
this.formData.inspRecordId = data.inspRecordId;
this.synthesisScore = data.synthesisScore;
this.personQty = data.personQty
const allowedCategories = this.dicts.satisfaction_category.map(item => item.value)
this.tableData.forEach(item => {
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`) });
}
});
} else {
this.$message.error(msg);
}
},
//

49
src/views/modules/satisfaction/detail/eventInfo.vue

@ -0,0 +1,49 @@
<template>
<div class="g-main">
<div class="title-small title_postion">基础信息</div>
<el-row type="flex" class="f-m-top29">
<el-col :span="12" class="f-flex">
<div class="f-label">所属网格:</div>
<div class="f-left8 f-font-color">{{ gridName }}</div>
</el-col>
<el-col :span="12" class="f-flex">
<div class="f-label">所属房屋:</div>
<div class="f-left8 f-font-color">{{ homeName }}</div>
</el-col>
</el-row>
</div>
</template>
<script>
export default {
name: "eventInspces",
props: {
resiId: {
type: String,
},
},
data() {
return {}
},
async created() {
this.loadEvent();
},
mounted() { },
methods: {
//
async loadEvent() {
const url = "/governance/eventInspect/getEventByResiId";
const { data, code, msg } = await requestPost(url, {
resiId: row.resiId
});
if (code === 0) {
// this.getTableData();
} else {
this.$message.error(msg);
}
}
}
}
</script>
<style lang="scss" scoped>
@import "@/assets/scss/modules/management/list-main.scss";
</style>

530
src/views/modules/satisfaction/detail/index.vue

@ -0,0 +1,530 @@
<template>
<div class="g-main">
<div>
<div class="m-search">
<div>
<el-form :inline="true" :model="formData" ref="ref_searchform" :label-width="'100px'">
<el-form-item prop="gridId" label="所属组织">
<div class="resi-cell-value">
<el-cascader class="customer_cascader" ref="myCascader" clearable v-model="agencyIdArray"
:options="orgOptions" :props="orgOptionProps" :show-all-levels="false"
@change="handleChangeAgency"></el-cascader>
</div>
</el-form-item>
<el-form-item prop="villageId" label="所属房屋">
<el-select v-model.trim="formData.villageId" placeholder="请选择小区" size="small" clearable
class="resi-cell-select" @change="handleChangeV">
<el-option v-for="item in optionsV" :key="item.value" :label="item.label"
:value="item.value">
</el-option>
</el-select>
</el-form-item>
<el-form-item prop="buildId">
<el-select v-model.trim="formData.buildId" placeholder="楼号" size="small" clearable
:disabled="changeVDisabled" class="resi-cell-select resi-cell-select-middle"
@change="handleChangeB">
<el-option v-for="item in optionsB" :key="item.value" :label="item.label"
:value="item.value">
</el-option>
</el-select>
</el-form-item>
<el-form-item prop="unitId">
<el-select v-model.trim="formData.unitId" placeholder="单元" size="small" clearable
:disabled="changeBDisabled" class="resi-cell-select resi-cell-select-middle"
@change="handleChangeD">
<el-option v-for="item in optionsD" :key="item.value" :label="item.label"
:value="item.value">
</el-option>
</el-select>
</el-form-item>
<el-form-item prop="homeId">
<el-select v-model.trim="formData.homeId" placeholder="房号" size="small" clearable
:disabled="changeDDisabled" class="resi-cell-select resi-cell-select-middle">
<el-option v-for="item in optionsH" :key="item.value" :label="item.label"
:value="item.value">
</el-option>
</el-select>
</el-form-item>
<br>
<el-form-item label="姓名" prop="name">
<el-input v-model="formData.name" class="u-item-width-normal" size="small" clearable
placeholder="请输入联系人姓名" style="width: 200px;">
</el-input>
</el-form-item>
<el-form-item label="联系电话" prop="mobile">
<el-input v-model="formData.mobile" class="u-item-width-normal" size="small" clearable
placeholder="请输入联系电话" style="width: 200px;">
</el-input>
</el-form-item>
<el-form-item label="证件号" prop="idCard">
<el-input v-model="formData.idCard" class="u-item-width-normal" size="small" clearable
placeholder="请输入证件号" style="width: 200px;">
</el-input>
</el-form-item>
<el-row>
<el-col :span="24" align="right">
<el-button style="margin-left: 30px" size="small" type="primary"
@click="handleSearch">查询</el-button>
<el-button style="margin-left: 10px" size="small" class="diy-button--white"
@click="resetSearch">重置</el-button>
</el-col>
</el-row>
</el-form>
</div>
</div>
<div class="m-table">
<div class="div_btn">
<el-button @click="handleExport" class="diy-button--white" size="small">导出</el-button>
<el-button @click="handleCancalDiffcult" class="diy-button--red" size="small">批量取消风险</el-button>
</div>
<el-table :data="tableData" class="m-table-item" style="width: 100%"
@selection-change="handleSelectionChange" :height="maxTableHeight">
<el-table-column label="" fixed="left" type="selection" align="center" width="50" />
<el-table-column label="序号" fixed="left" type="index" align="center" width="50" />
<el-table-column prop="name" align="center" label="姓名" />
<el-table-column prop="mobile" align="center" label="联系电话" />
<el-table-column prop="orgName" align="center" label="所属组织" :show-overflow-tooltip="true" />
<el-table-column prop="eventInspect" align="center" label="12345投诉" />
<el-table-column prop="provinceInspect" label="省满意度调查" align="center" />
<el-table-column prop="communitySelfAss" align="center" label="社区自评" />
<el-table-column prop="unresolvedDemand" label="未解决需求" align="center" />
<el-table-column prop="unresolvedEvent" align="center" label="未解决事件" />
<el-table-column prop="notEnjoyedService" align="center" label="应享未享服务" />
<el-table-column fixed="right" label="操作" align="center">
<template slot-scope="scope">
<el-button @click="handleWatch(scope.row)" type="text" size="small">查看</el-button>
<template v-if="scope.row.riskyFlag === 1">
<el-button @click="handleDispose(scope.row)" type="text" size="small"
class="">取消风险</el-button>
</template>
<template v-else>
<el-button @click="handleDispose(scope.row)" type="text" size="small"
class="">标记风险</el-button>
</template>
</template>
</el-table-column>
</el-table>
<div>
<el-pagination @size-change="handleSizeChange" @current-change="handleCurrentChange"
:current-page.sync="pageNo" :page-sizes="[20, 50, 100, 200]" :page-size="parseInt(pageSize)"
layout="sizes, prev, pager, next, total" :total="total">
</el-pagination>
</div>
</div>
</div>
<el-dialog title="不满意人群详情" :visible.sync="showView" width="986px" top="5vh" append-to-body class="dialog-h"
:close-on-click-modal="false" :before-close="() => {this.showView = false}">
<div class="dialog-h-content scroll-h">
<event-info v-if="showView" ref="eventInfo" :fixed="true" :resi-id="resiId" />
</div>
<div class="resi-btns">
<el-button size="small" class="diy-button--white" plain @click="showView = false">关闭</el-button>
</div>
</el-dialog>
</div>
</template>
<script>
import { requestPost } from "@/js/dai/request";
import { mapGetters } from "vuex";
import axios from "axios";
import eventInfo from "./eventInfo.vue";
export default {
components: {
eventInfo
},
data() {
return {
user: {},
gridId: "",
tableData: [],
formData: {
agencyId: "",
orgIdPath: "",
gridId: "",
name: "",
mobile: "",
idCard: "",
homeId: "",
unitId: "",
buildId: "",
villageId: ""
},
orgOptions: [],
orgOptionProps: {
multiple: false,
value: 'agencyId',
label: 'agencyName',
children: 'subAgencyList',
checkStrictly: true
},
agencyIdArray: [],
pageNo: 1,
pageSize: window.localStorage.getItem("pageSize") || 20,
total: 1,
eventId: "",
resiId: "",
searchH: 180,
eventDetailData: {},
showVoice: false,
selVoiceUrl: "",
multipleSelection: [],
optionsV: [],
optionsB: [],
optionsH: [],
optionsD: [],
showView: false,
};
},
props: {
resiId: {
type: String,
},
},
computed: {
maxTableHeight() {
const h = this.clientHeight - this.searchH - 275 + this.iframeHeight;
const _h = this.clientHeight - 275 - this.searchH;
return this.$store.state.inIframe ? h : _h;
},
...mapGetters(["clientHeight", "iframeHeight"]),
changeVDisabled() {
return !this.formData.villageId;
},
changeBDisabled() {
return !this.formData.buildId;
},
changeDDisabled() {
return !this.formData.unitId;
},
eventInfo,
},
watch: {},
mounted() {
this.user = this.$store.state.user;
this.agencyId = this.user.agencyId;
this.loadAgency();
this.getTableData();
},
methods: {
handleEventType(val) {
const nodes = this.$refs.cascaderEvent.getCheckedNodes();
this.formData.firstIdList = [];
this.formData.secondIdList = [];
let level1 = nodes.filter((item) => item.level === 1);
let level2 = nodes.filter((item) => item.level === 2);
level1.forEach((item) => {
if (item.hasChildren) {
for (let i = level2.length - 1; i >= 0; i--) {
if (level2[i].parent.value === item.value) level2.splice(i, 1);
}
}
});
this.formData.firstIdList = level1.map((item) => item.value);
this.formData.secondIdList = level2.map((item) => item.value);
},
handleSelectionChange(val) {
this.multipleSelection = [];
val.forEach((element) => {
this.multipleSelection.push(element);
});
},
async handleCancalDiffcult() {
const url = "/governance/eventInspect/updateBatchByIds";
if (this.multipleSelection.length == 0) {
this.$message.warning('请选择取消的风险')
return
}
let ids = []
if (this.multipleSelection.length > 0) {
this.multipleSelection.forEach(item => {
if (item.riskyFlag == 1) {
ids.push(item.id)
}
})
}
const { data, code, msg } = await requestPost(url, ids);
if (code === 0) {
this.$message.success("取消风险成功!");
this.getTableData();
} else {
this.$message.error(msg);
}
},
handleSearch(val) {
this.pageNo = 1;
this.getTableData();
},
handleChangeAgency(val) {
let obj = this.$refs["myCascader"].getCheckedNodes()[0].data
if (obj) {
if (obj.level === 'grid') {
this.formData.gridId = this.agencyIdArray.length > 0 ? this.agencyIdArray[this.agencyIdArray.length - 1] : '';
this.formData.agencyId = ''
} else {
this.formData.agencyId = this.agencyIdArray.length > 0 ? this.agencyIdArray[this.agencyIdArray.length - 1] : '';
this.formData.gridId = ''
}
this.formData.orgIdPath = this.agencyIdArray.toString();
} else {
this.formData.agencyId = ''
this.formData.gridId = ''
}
this.formData.villageId = ''
this.formData.buildId = ''
this.formData.unitId = ''
this.formData.homeId = ''
this.getValiheList()
},
//
async loadAgency() {
const { user } = this.$store.state
this.$http.post('/gov/org/customeragency/agencygridtree', {}).then(({ data: res }) => {
if (res.code !== 0) {
return this.$message.error(res.msg)
} else {
this.orgOptions = []
this.orgOptions.push(res.data)
}
}).catch(() => {
return this.$message.error('网络错误')
})
},
async handleExport() {
const url = "/governance/icEvent/export";
const { pageSize, pageNo, formData } = this;
axios({
url: window.SITE_CONFIG["apiURL"] + url,
method: "post",
data: {
pageSize,
pageNo,
...formData,
},
responseType: "blob",
}).then((res) => {
let fileName = window.decodeURI(
res.headers["content-disposition"].split(";")[1].split("=")[1]
);
let blob = new Blob([res.data], { type: "application/vnd.ms-excel" });
var url = window.URL.createObjectURL(blob);
var aLink = document.createElement("a");
aLink.style.display = "none";
aLink.href = url;
aLink.setAttribute("download", fileName);
document.body.appendChild(aLink);
aLink.click();
document.body.removeChild(aLink); //
window.URL.revokeObjectURL(url); //blob
}).catch((err) => {
return this.$message.error("网络错误");
});
},
//
async handleWatch(row) {
this.showView = true;
},
//
async handleDispose(row) {
const url = "/governance/eventInspect/saveOrUpdate";
const { data, code, msg } = await requestPost(url, {
id: row.id,
resiId: row.resiId,
riskyFlag: row.riskyFlag === 0 ? 1 : 0
});
if (code === 0) {
this.getTableData();
} else {
this.$message.error(msg);
}
},
//
handleClose() {
this.getTableData();
},
//
handleOk() {
this.pageNo = 1;
this.getTableData();
},
//
async getTableData() {
const url = "/governance/eventInspect/list";
const { pageSize, pageNo, formData } = this;
const { data, code, msg } = await requestPost(url, {
pageSize,
pageNo,
...formData,
});
if (code === 0) {
this.total = data.total || 0;
this.tableData = data.list ? data.list.map((item) => { return item; }) : [];
} else {
this.$message.error(msg);
}
},
//
async getValiheList() {
const { user } = this.$store.state;
this.$http
.post("/actual/base/communityQuarters/listQuartersOptions", {
gridId: this.formData.gridId,
agencyId: this.formData.agencyId,
})
.then(({ data: res }) => {
if (res.code !== 0) {
return this.$message.error(res.msg);
} else {
this.optionsV = res.data;
}
})
.catch(() => {
return this.$message.error("网络错误");
});
},
//
async getBuildList() {
this.$http
.post("/actual/base/communityBuilding/buildingoption", {
quartersId: this.formData.villageId,
})
.then(({ data: res }) => {
if (res.code !== 0) {
return this.$message.error(res.msg);
} else {
this.optionsB = res.data;
}
})
.catch(() => {
return this.$message.error("网络错误");
});
},
//
async getUniList() {
this.$http
.post("/actual/base/communityBuildingUnit/unitoption", {
buildingId: this.formData.buildId,
})
.then(({ data: res }) => {
if (res.code !== 0) {
return this.$message.error(res.msg);
} else {
this.optionsD = res.data;
}
})
.catch(() => {
return this.$message.error("网络错误");
});
},
//
async getHouseList() {
this.$http.post("/actual/base/communityHouse/houseoption", { unitId: this.formData.unitId })
.then(({ data: res }) => {
if (res.code !== 0) {
return this.$message.error(res.msg);
} else {
this.optionsH = res.data;
}
})
.catch(() => {
return this.$message.error("网络错误");
});
},
handleClearVillage() {
this.formData.buildId = "";
this.formData.homeId = "";
},
handleClearBuild() {
this.formData.buildId = "";
this.formData.unitId = "";
this.formData.homeId = "";
},
handleClearDan() {
this.formData.unitId = "";
this.formData.homeId = "";
},
handleChangeGrid(val) {
this.formData.villageId = "";
this.formData.buildId = "";
this.formData.unitId = "";
this.formData.homeId = "";
this.getValiheList();
},
handleChangeV(val) {
this.formData.buildId = "";
this.formData.unitId = "";
this.formData.homeId = "";
this.getBuildList();
},
handleChangeB(val) {
this.formData.unitId = "";
this.formData.homeId = "";
this.getUniList();
},
handleChangeD(val) {
this.formData.homeId = "";
this.getHouseList();
},
handleSizeChange(val) {
this.pageSize = val;
window.localStorage.setItem("pageSize", val);
this.getTableData();
},
handleCurrentChange(val) {
this.pageNo = val;
this.getTableData();
},
//
resetSearch() {
this.formData = {
gridId: "",
sourceType: "",
eventContent: "",
name: "",
mobile: "",
idCard: "",
firstIdList: [],
secondIdList: [],
};
this.agencyIdArray = [];
this.optionsV = [];
this.optionsB = [];
this.optionsH = [];
this.optionsD = [];
this.pageNo = 1;
this.getTableData();
},
},
};
</script>
<style lang="scss" scoped>
@import "@/assets/scss/modules/management/list-main.scss";
.m-search {
.u-item-width-normal {
width: 200px;
}
}
::v-deep .el-dropdown__caret-button {
height: 30px;
}
::v-deep .el-image-viewer__close {
top: 129px;
right: 129px;
width: 40px;
height: 40px;
font-size: 40px;
color: #fff;
}
</style>

26
src/views/modules/satisfaction/satisfactionProvince/index.vue

@ -42,8 +42,8 @@
@handelClickEdit="handelClickEdit"></form-list>
<el-dialog width="820px" class="dialog-h" title="省满意度调查详情" :close-on-click-modal="false"
v-if="showProvinceFollowUpDetail" :visible.sync="showProvinceFollowUpDetail" append-to-body>
<follow-detail :detailObj="detailObj" :formType="formType" @handleCancle="showProvinceFollowUpDetail = false"
@handleComfirm="handleComfirm"></follow-detail>
<follow-detail :detailObj="detailObj" :formType="formType"
@handleCancle="showProvinceFollowUpDetail = false" @handleComfirm="handleComfirm"></follow-detail>
</el-dialog>
</el-dialog>
</div>
@ -150,7 +150,6 @@ export default {
},
...mapGetters(["clientHeight", "iframeHeight"]),
},
watch: {},
created() {
let date = new Date()
this.formData.periodStart = util.formatDate(date, 'yyyy-MM')
@ -167,11 +166,11 @@ export default {
// --------------------------------------------------------------------------------
async getDicts() {
try {
const requests = [
this.$http.post("sys/dict/data/dictlist", {
dictType: "satisfaction_category",
}),
];
const dictKeys = ['satisfaction_category']; //
@ -187,8 +186,6 @@ export default {
console.log("获取字典失败: ", error);
}
},
// ------------------------------------------------------------------------------
initEcharts() {
this.myChart = echarts.init(document.getElementById('myCharts'));
@ -204,7 +201,6 @@ export default {
window.addEventListener('resize', this.handleWindowResize);
},
handleWindowResize() {
if (this.myChart) {
this.myChart.resize();
@ -231,20 +227,20 @@ export default {
this.showProvinceFollowUpDetail = false
this.save(form)
},
async save(form) {
try{
async save(form) {
try {
const url = '/governance/provinceEvaluationRecord/updateInfo'
form.periodName = null
const {code} = await requestPost(url,form)
if(code == 0){
const { code } = await requestPost(url, form)
if (code == 0) {
this.getTableData()
this.$refs['ref_form_list'].getTableData()
this.$message.success('保存成功')
this.showProvinceFollowUpDetail = false
}
}catch(err){
} catch (err) {
console.log(err);
}
}
},
//
handleSearch(val) {
@ -361,7 +357,9 @@ export default {
this.getTableData();
},
},
activated() {
this.handleWindowResize()
},
props: {},
};
</script>

38
src/views/modules/shequzhili/event/cpts/add.vue

@ -17,7 +17,9 @@
</el-option>
</el-select>
</el-form-item>
<el-form-item label="工单号" prop="workOrderNum" label-width="150px" style="display: block">
<el-input class="cell-width-1" maxlength="10" placeholder="请输入工单号" v-model="formData.workOrderNum" />
</el-form-item>
<el-form-item label="接收时间" prop="happenTime" label-width="150px" style="display: block">
<el-date-picker v-model="formData.happenTime" class="cell-width-1" type="datetime"
placeholder="接收时间" value-format="yyyy-MM-dd HH:mm:ss">
@ -30,12 +32,7 @@
</el-form-item>
<el-form-item label="联系人" prop="name" label-width="150px" style="display: block">
<el-input class="cell-width-1" maxlength="10" placeholder="请输入联系人姓名" v-model="formData.name">
</el-input>
<!-- <div>
<el-button style="margin-top: 10px" type="primary" size="mini"
@click="handleShowPersonList">居民信息中选择</el-button>
</div> -->
<el-input class="cell-width-1" maxlength="10" placeholder="请输入联系人姓名" v-model="formData.name" />
</el-form-item>
<el-form-item label="联系电话" prop="mobile" label-width="150px" style="display: block">
<el-input class="cell-width-1" maxlength="30" placeholder="请输入联系电话 " v-model="formData.mobile">
@ -129,7 +126,6 @@ var geocoder; // 新建一个正逆地址解析类
function iniFmData() {
return {
gridId: "", //
reportUserId: "", // ID
name: "", //
@ -143,7 +139,8 @@ function iniFmData() {
address: "", //
latitude: "", //
longitude: "", //
// operationType: '',//
workOrderNum : "" //
// operationType: '0',//
// content: '',//
// status: '',// processingclosed_case
};
@ -157,10 +154,8 @@ export default {
searchValue: '',
resultList: [],
loading: false,
btnDisable: false,
gridList: [], //list--
qudaoArray: [
{
value: "1",
@ -212,31 +207,16 @@ export default {
components: {},
computed: {
dataRule() {
let checkIdCard = (rule, value, callback) => {
if (value === "") {
callback(new Error("请输入证件号"));
} else {
if (!isCard(value)) {
callback(new Error("证件号格式不正确"));
}
callback();
}
};
return {
gridId: [
{ required: true, message: "所属组织不能为空", trigger: "blur" },
],
workOrderNum :[
{ required: true, message: "工单号不能为空", trigger: "blur" }
],
name: [
{ required: true, message: "联系人不能为空", trigger: "blur" }
],
mobile: [
//{ required: true, message: "", trigger: "blur" },
],
// idCard: [
// { required: true, message: "", trigger: "blur" },
// { required: true, validator: checkIdCard, trigger: "blur" },
// ],
sourceType: [
{ required: true, message: "反映渠道不能为空", trigger: "blur" },
],

164
src/views/modules/shequzhili/event/cpts/event-detail.vue

@ -15,114 +15,82 @@
<span class="u-info-title-2">接收时间</span>
<span>{{ info.happenTime }}</span>
</div>
<div :class="[
'm-info-prop',
{ 'm-info-prop-vis': source === 'visiual' },
]">
<div :class="['m-info-prop', { 'm-info-prop-vis': source === 'visiual' },]">
<span class="u-info-title-2">工单号</span>
<span>{{ info.workOrderNum }}</span>
</div>
<div :class="['m-info-prop', { 'm-info-prop-vis': source === 'visiual' },]">
<span class="u-info-title-2">事件内容</span>
<span>{{ info.eventContent }}</span>
</div>
<div v-if="info.imageList && info.imageList.length > 0" :class="[
'm-info-prop',
{ 'm-info-prop-vis': source === 'visiual' },
]">
<div v-if="info.imageList && info.imageList.length > 0"
:class="['m-info-prop', { 'm-info-prop-vis': source === 'visiual' },]">
<span class="u-info-title-2">图片</span>
<img :src="src" :key="src" style="width: 150px; height: 150px; padding-right: 10px"
v-for="src in info.imageList" @click="watchImg(src)" />
</div>
<div v-if="info.voiceList && info.voiceList.length > 0" :class="[
'm-info-prop',
{ 'm-info-prop-vis': source === 'visiual' },
]">
<div v-if="info.voiceList && info.voiceList.length > 0"
:class="['m-info-prop', { 'm-info-prop-vis': source === 'visiual' },]">
<span class="u-info-title-2">语音</span>
<audio controls>
<source :src="item.url" type="" :key="item.url" v-for="item in info.voiceList" />
</audio>
</div>
<div :class="[
'm-info-prop',
{ 'm-info-prop-vis': source === 'visiual' },
]">
<div :class="['m-info-prop', { 'm-info-prop-vis': source === 'visiual' },]">
<span class="u-info-title-2">上报渠道</span>
<span>{{ info.sourceTypeName }}</span>
</div>
<div :class="[
'm-info-prop',
{ 'm-info-prop-vis': source === 'visiual' },
]">
<div :class="['m-info-prop', { 'm-info-prop-vis': source === 'visiual' },]">
<span class="u-info-title-2">详细地址</span>
<span>{{ info.address }}</span>
</div>
<div :class="[
'm-info-prop',
{ 'm-info-prop-vis': source === 'visiual' },
]">
<div :class="['m-info-prop', { 'm-info-prop-vis': source === 'visiual' },]">
<span class="u-info-title-2">联系人</span>
<span>{{ info.name }}</span>
</div>
<div :class="[
'm-info-prop',
{ 'm-info-prop-vis': source === 'visiual' },
]">
<div :class="['m-info-prop', { 'm-info-prop-vis': source === 'visiual' },]">
<span class="u-info-title-2">联系电话</span>
<span>{{ info.mobile }}</span>
</div>
<div :class="[
'm-info-prop',
{ 'm-info-prop-vis': source === 'visiual' },
]">
<div :class="['m-info-prop', { 'm-info-prop-vis': source === 'visiual' },]">
<span class="u-info-title-2">标记</span>
<span>{{ info.markTypeName || "--" }}</span>
</div>
<div v-if="info.satisfactionName" :class="[
'm-info-prop',
{ 'm-info-prop-vis': source === 'visiual' },
]">
<div v-if="info.satisfactionName"
:class="['m-info-prop', { 'm-info-prop-vis': source === 'visiual' },]">
<span class="u-info-title-2">满意度</span>
<div>{{ info.satisfactionName }}</div>
</div>
</div>
</div>
<!--
显示关闭
1状态=完成 (已评价)||(没评价&&不是本人)
2状态=未完成 有操作id -->
<div v-if="(info.status === 'processing' && info.operationId) ||
(info.status === 'closed_case' &&
(info.satisfactionName ||
(!info.satisfactionName && user.id != info.createdUserId)))
" class="div-btn-info">
显示关闭
1状态=完成 (已评价)||(没评价&&不是本人)
2状态=未完成 有操作id
-->
<div v-if="(info.status === 'processing' && info.operationId) || (info.status === 'closed_case' &&
(info.satisfactionName || (!info.satisfactionName && user.id != info.createdUserId)))"
class="div-btn-info">
<el-button size="small" @click="handleCloseEvent">关闭</el-button>
</div>
</el-card>
<el-card :class="{ 'box-card': source === 'visiual' }" v-if="info.status === 'closed_case' &&
!info.satisfactionName &&
user.id === info.createdUserId
">
<el-card :class="{ 'box-card': source === 'visiual' }" v-if="info.status === 'closed_case' && !info.satisfactionName
&& user.id === info.createdUserId" style="width: 184%;">
<h3>满意度评价</h3>
<div class="m-detail-main">
<div class="m-info">
<div class="div-satisfy">
<div>
<img :src="selBad ? badurl_light : badurl" @click="clickSatisfy('bad')" />
<div class="tip-satisfy">不满意</div>
</div>
<div>
<img :src="selGood ? goodurl_light : goodurl" @click="clickSatisfy('good')" />
<div class="tip-satisfy">满意</div>
</div>
<div>
<img :src="selPerfect ? perfecturl_light : perfecturl" @click="clickSatisfy('perfect')" />
<div class="tip-satisfy">非常满意</div>
</div>
<el-radio-group :class="{ 'form-item': source === 'visiual' }" v-model="satisfyLevel"
@change="clickSatisfy">
<el-radio label="good">满意</el-radio>
<el-radio label="perfect">基本满意</el-radio>
<el-radio label="bad">不满意</el-radio>
</el-radio-group>
</div>
</div>
</div>
<div class="div-btn">
<el-button size="small" @click="handleCloseEvent">关闭</el-button>
<el-button style="margin-left: 20px" type="primary" size="small"
@ -144,19 +112,15 @@
import { requestPost } from "@/js/dai/request";
import foldText from "@/views/components/foldText";
import projectInfo from "../../xiangmu/cpts/project-info";
import dateFormat from "dai-js/tools/dateFormat";
function iniData() {
return {
user: {},
projectPageType: "info",
info: {},
eventDetailCopy: {},
showType: "",
projectId: "",
demandForm: {
gridId: "",
categoryCode: "",
@ -171,18 +135,9 @@ function iniData() {
demandUserName: "",
demandUserMobile: "",
},
satisfyLevel: "",
//
showSatisfy: false,
selBad: false,
selGood: false,
selPerfect: false,
badurl: require("@/assets/img/satisfy-images/face1.png"),
badurl_light: require("@/assets/img/satisfy-images/face1_light.png"),
goodurl: require("@/assets/img/satisfy-images/face2.png"),
goodurl_light: require("@/assets/img/satisfy-images/face2_light.png"),
perfecturl: require("@/assets/img/satisfy-images/face3.png"),
perfecturl_light: require("@/assets/img/satisfy-images/face3_light.png"),
};
}
@ -262,23 +217,6 @@ export default {
async getApiData() { },
handleToProject() {
this.$emit("handleToProject");
// if (this.info.status === 'processing') {
// this.projectPageType = 'edit'
// } else {
// this.projectPageType = 'info'
// }
// this.showType = 'project'
},
handleToDemand() {
this.$emit("handleToDemand");
},
handleToIssue() {
this.$emit("handleToIssue");
},
//
handleSatisfy() {
this.showSatisfy = true;
@ -288,53 +226,25 @@ export default {
if (this.info.satisfactionName) {
return false;
}
this.changeSatisfyType(type);
},
changeSatisfyType(type) {
if (type === "bad") {
this.selGood = false;
this.selPerfect = false;
this.selBad = true;
} else if (type === "good") {
this.selGood = true;
this.selPerfect = false;
this.selBad = false;
} else if (type === "perfect") {
this.selGood = false;
this.selPerfect = true;
this.selBad = false;
}
this.satisfyLevel = type;
},
async handleComfirmSatisfy() {
let satisfyLevel = "";
if (!this.selBad && !this.selGood && !this.selPerfect) {
if (!this.satisfyLevel) {
this.$message.info("请选择评价级别");
} else {
if (this.selBad) {
satisfyLevel = "bad";
} else if (this.selGood) {
satisfyLevel = "good";
} else if (this.selPerfect) {
satisfyLevel = "perfect";
}
}
const url = "/governance/icEvent/comment";
let params = {
icEventId: this.eventId,
satisfaction: satisfyLevel,
satisfaction: this.satisfyLevel,
};
const { data, code, msg } = await requestPost(url, params);
if (code === 0) {
this.$message.success("评价成功");
this.info.satisfactionName =
satisfyLevel == "bad"
this.satisfyLevel == "bad"
? "不满意"
: satisfyLevel == "good"
: this.satisfyLevel == "good"
? "满意"
: "非常满意";
this.showSatisfy = false;

25
src/views/modules/shequzhili/event/cpts/event-info.vue

@ -32,23 +32,19 @@
<el-button class="diy-button--white" style="height: 20px" @click="handleClose">
查看详情</el-button>
</div>
<div :class="['g-total', { 'g-left': projectProcess.length > 0, 'g-left-top40': pageType == 'info' }]">
<div :class="['g-total', { 'g-left': projectProcess.length > 0, 'g-left-top40': pageType == 'info' }]" style="z-index: 1;">
<event-detail ref="ref_detail" :type="pageType" :eventId="eventId" :eventDetailData="eventDetailData"
:source="source" @handleToProject="handleToProject" @handleToDemand="handleToDemand"
@handleToIssue="handleToIssue" @handleClose="handleClose"></event-detail>
<div v-if="!eventDetailData.operationId && pageTypeCopy == 'dispose'" class="process-form">
<el-card :class="{ 'box-card': source === 'visiual' }">
<div :class="[
'process-title',
{ 'process-title-vis': source === 'visiual' },
]">
<div :class="['process-title', { 'process-title-vis': source === 'visiual' },]">
<img src="../../../../../assets/images/index/title-icon-chuli.png" width="30px" height="30px"
alt=""> 处理
</div>
<process-form ref="ref_processinfo_dispose" :source="source" :eventId="eventId"
:eventDetailData="eventDetailData"></process-form>
<div class="div-btn">
<el-button size="small" @click="handleClose">关闭</el-button>
<el-button style="margin-left: 20px" type="primary" size="small"
@ -68,17 +64,22 @@
处理进展
</div>
<div class="list">
<div class="item" :class="[
index === 0 ? 'z-on' : '',
{ 'item-vis': source === 'visiual' },
<div class="item" :class="[index === 0 ? 'z-on' : '', { 'item-vis': source === 'visiual' },
]" :key="item.processId" v-for="(item, index) in projectProcess">
<div class="item-row">
<div class="name">{{ item.processName }}</div>
<template v-if="item.agencyId">
<div class="name">指派</div>
</template>
<template v-if="!item.timeLimit">
<div class="name">完成并回复</div>
</template>
<template v-else>
<div class="name">{{ item.processName }}</div>
</template>
<div class="date">
{{ item.processTime }}
</div>
</div>
<div v-if="item.type === 'event'">
<template v-if="item.agencyId">
<div class="detail">
@ -277,7 +278,7 @@ export default {
this.$message.error(msg);
}
},
formTimeLimit(val){
formTimeLimit(val) {
return dateFormat(
new Date(val * 1000),
"yyyy-MM-dd hh:mm"

41
src/views/modules/shequzhili/event/eventList.vue

@ -86,9 +86,8 @@
placeholder="结束时间">
</el-date-picker>
</el-form-item>
<el-row>
<el-col :span="24" :align="'right'">
<el-col :span="24" align="right">
<el-button style="margin-left: 30px" size="small" type="primary "
@click="handleSearch">查询</el-button>
<el-button style="margin-left: 10px" size="small" class="diy-button--white"
@ -117,24 +116,24 @@
<el-table :data="tableData" class="m-table-item" style="width: 100%"
@selection-change="handleSelectionChange" :height="maxTableHeight">
<el-table-column label="" fixed="left" type="selection" :align="center" width="50" />
<el-table-column label="序号" fixed="left" type="index" :align="center" width="50" />
<el-table-column prop="workOrderNum" :align="center" label="工单号" :show-overflow-tooltip="true" />
<el-table-column prop="gridName" :align="center" min-width="140" label="所属组织"
<el-table-column label="" fixed="left" type="selection" align="center" width="50" />
<el-table-column label="序号" fixed="left" type="index" align="center" width="50" />
<el-table-column prop="workOrderNum" align="center" label="工单号" :show-overflow-tooltip="true" />
<el-table-column prop="gridName" align="center" min-width="140" label="所属组织"
:show-overflow-tooltip="true" />
<el-table-column prop="sourceTypeName" :align="center" width="100" label="上报渠道"
<el-table-column prop="sourceTypeName" align="center" width="100" label="上报渠道"
:show-overflow-tooltip="true" />
<el-table-column prop="categoryName" label="事件分类" min-width="100" :align="center"
<el-table-column prop="categoryName" label="事件分类" min-width="100" align="center"
:show-overflow-tooltip="true" />
<!-- <template slot-scope="scope">
{{ scope.row.firstName + '-' + scope.row.secondName }}
</template>
</el-table-column> -->
<el-table-column prop="happenTime" :align="center" width="110" :show-overflow-tooltip="true"
<el-table-column prop="happenTime" align="center" width="110" :show-overflow-tooltip="true"
label="接收时间" />
<el-table-column prop="eventContent" label="问题描述" width="140" :align="center"
<el-table-column prop="eventContent" label="问题描述" width="140" align="center"
:show-overflow-tooltip="true" />
<!-- <el-table-column prop="imageList" :align="center" width="80" label="图片">
<!-- <el-table-column prop="imageList" align="center" width="80" label="图片">
<template slot-scope="scope">
<el-image v-if="scope.row.imageList && scope.row.imageList.length > 0"
style="width: 40px; height: 40px" :src="scope.row.imageList[0]"
@ -143,7 +142,7 @@
<span v-else></span>
</template>
</el-table-column> -->
<el-table-column prop="voiceList" :align="center" width="80" label="语音">
<el-table-column prop="voiceList" align="center" width="80" label="语音">
<template slot-scope="scope">
<img @click="handleShowVoice(scope.row.voiceList[0].url)" class="img-voice"
v-if="scope.row.voiceList && scope.row.voiceList.length > 0"
@ -151,29 +150,29 @@
<span v-else></span>
</template>
</el-table-column>
<el-table-column prop="timeLimit" :align="center" width="110" :show-overflow-tooltip="true"
<el-table-column prop="timeLimit" align="center" width="110" :show-overflow-tooltip="true"
label="办结时限" />
<el-table-column prop="name" :align="center" width="100" label="联系人" :show-overflow-tooltip="true" />
<el-table-column prop="mobile" :align="center" width="110" label="联系电话" :show-overflow-tooltip="true" />
<el-table-column prop="address" :align="center" :show-overflow-tooltip="true" label="详细地址" />
<!-- <el-table-column prop="satisfactionName" :align="center" width="100" label="满意度"
<el-table-column prop="name" align="center" width="100" label="联系人" :show-overflow-tooltip="true" />
<el-table-column prop="mobile" align="center" width="110" label="联系电话" :show-overflow-tooltip="true" />
<el-table-column prop="address" align="center" :show-overflow-tooltip="true" label="详细地址" />
<!-- <el-table-column prop="satisfactionName" align="center" width="100" label="满意度"
:show-overflow-tooltip="true" /> -->
<!-- <template slot-scope="scope">
<span v-if="scope.row.satisfactionName">--</span>
</template> -->
<!-- <el-table-column prop="operationTypeName" :align="center" width="100" :show-overflow-tooltip="true"
<!-- <el-table-column prop="operationTypeName" align="center" width="100" :show-overflow-tooltip="true"
label="办理结点">
</el-table-column> -->
<el-table-column prop="status" :align="center" label="状态" width="80" :show-overflow-tooltip="true">
<el-table-column prop="status" align="center" label="状态" width="80" :show-overflow-tooltip="true">
<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 prop="markTypeName" :align="center" label="标记" width="80"
<el-table-column prop="markTypeName" align="center" label="标记" width="80"
:show-overflow-tooltip="true" />
<el-table-column fixed="right" label="操作" :align="center" width="100">
<el-table-column fixed="right" label="操作" align="center" width="100">
<template slot-scope="scope">
<el-button v-if="scope.row.status === 'processing' && !scope.row.operationId
" @click="handleDispose(scope.row)" type="text" size="small" class="">处理</el-button>

Loading…
Cancel
Save